Bio-Graphics-2.39000755001750001750 012366325116 13702 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/DISCLAIMER.txt000555001750001750 216512366325116 16223 0ustar00lsteinlstein000000000000The Bio::Graphics package and all associated files are Copyright (c) 2001 Cold Spring Harbor Laboratory. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See the Artistic License file in the main Perl distribution for specific terms and conditions of use. In addition, the following disclaimers apply: CSHL makes no representations whatsoever as to the SOFTWARE contained herein. It is experimental in nature and is provided WITHOUT WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR ANY OTHER WARRANTY, EXPRESS OR IMPLIED. CSHL MAKES NO REPRESENTATION OR WARRANTY THAT THE USE OF THIS SOFTWARE WILL NOT INFRINGE ANY PATENT OR OTHER PROPRIETARY RIGHT. By downloading this SOFTWARE, your Institution hereby indemnifies CSHL against any loss, claim, damage or liability, of whatsoever kind or nature, which may arise from your Institution's respective use, handling or storage of the SOFTWARE. If publications result from research using this SOFTWARE, we ask that CSHL be acknowledged and/or credit be given to CSHL scientists, as scientifically appropriate. Bio-Graphics-2.39/META.json000444001750001750 3135412366325116 15506 0ustar00lsteinlstein000000000000{ "abstract" : "Generate GD images of Bio::Seq objects", "author" : [ "Lincoln Stein " ], "dynamic_config" : 1, "generated_by" : "Module::Build version 0.4205", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "Bio-Graphics", "prereqs" : { "configure" : { "requires" : { "Module::Build" : "0.42" } }, "runtime" : { "recommends" : { "GD::SVG" : "0.32", "Text::ParseWords" : "3.26" }, "requires" : { "Bio::Root::Version" : "1.005009001", "GD" : "2.3", "Statistics::Descriptive" : "2.6" } } }, "provides" : { "Bio::Graphics" : { "file" : "lib/Bio/Graphics.pm", "version" : "2.39" }, "Bio::Graphics::ConfiguratorI" : { "file" : "lib/Bio/Graphics/ConfiguratorI.pm" }, "Bio::Graphics::DrawTransmembrane" : { "file" : "lib/Bio/Graphics/DrawTransmembrane.pm" }, "Bio::Graphics::Feature" : { "file" : "lib/Bio/Graphics/Feature.pm" }, "Bio::Graphics::FeatureBase" : { "file" : "lib/Bio/Graphics/FeatureBase.pm" }, "Bio::Graphics::FeatureDir" : { "file" : "lib/Bio/Graphics/FeatureDir.pm" }, "Bio::Graphics::FeatureFile" : { "file" : "lib/Bio/Graphics/FeatureFile.pm" }, "Bio::Graphics::FeatureFile::Iterator" : { "file" : "lib/Bio/Graphics/FeatureFile/Iterator.pm" }, "Bio::Graphics::FileSplitter" : { "file" : "lib/Bio/Graphics/FeatureDir.pm" }, "Bio::Graphics::GDWrapper" : { "file" : "lib/Bio/Graphics/GDWrapper.pm" }, "Bio::Graphics::Glyph" : { "file" : "lib/Bio/Graphics/Glyph.pm" }, "Bio::Graphics::Glyph::Factory" : { "file" : "lib/Bio/Graphics/Glyph/Factory.pm" }, "Bio::Graphics::Glyph::alignment" : { "file" : "lib/Bio/Graphics/Glyph/alignment.pm" }, "Bio::Graphics::Glyph::allele_tower" : { "file" : "lib/Bio/Graphics/Glyph/allele_tower.pm" }, "Bio::Graphics::Glyph::anchored_arrow" : { "file" : "lib/Bio/Graphics/Glyph/anchored_arrow.pm" }, "Bio::Graphics::Glyph::arrow" : { "file" : "lib/Bio/Graphics/Glyph/arrow.pm" }, "Bio::Graphics::Glyph::box" : { "file" : "lib/Bio/Graphics/Glyph/box.pm" }, "Bio::Graphics::Glyph::broken_line" : { "file" : "lib/Bio/Graphics/Glyph/broken_line.pm" }, "Bio::Graphics::Glyph::cds" : { "file" : "lib/Bio/Graphics/Glyph/cds.pm" }, "Bio::Graphics::Glyph::christmas_arrow" : { "file" : "lib/Bio/Graphics/Glyph/christmas_arrow.pm" }, "Bio::Graphics::Glyph::cross" : { "file" : "lib/Bio/Graphics/Glyph/cross.pm" }, "Bio::Graphics::Glyph::crossbox" : { "file" : "lib/Bio/Graphics/Glyph/crossbox.pm" }, "Bio::Graphics::Glyph::dashed_line" : { "file" : "lib/Bio/Graphics/Glyph/dashed_line.pm" }, "Bio::Graphics::Glyph::decorated_gene" : { "file" : "lib/Bio/Graphics/Glyph/decorated_gene.pm" }, "Bio::Graphics::Glyph::decorated_transcript" : { "file" : "lib/Bio/Graphics/Glyph/decorated_transcript.pm" }, "Bio::Graphics::Glyph::diamond" : { "file" : "lib/Bio/Graphics/Glyph/diamond.pm" }, "Bio::Graphics::Glyph::dna" : { "file" : "lib/Bio/Graphics/Glyph/dna.pm" }, "Bio::Graphics::Glyph::dot" : { "file" : "lib/Bio/Graphics/Glyph/dot.pm" }, "Bio::Graphics::Glyph::dumbbell" : { "file" : "lib/Bio/Graphics/Glyph/dumbbell.pm" }, "Bio::Graphics::Glyph::ellipse" : { "file" : "lib/Bio/Graphics/Glyph/ellipse.pm" }, "Bio::Graphics::Glyph::ex" : { "file" : "lib/Bio/Graphics/Glyph/ex.pm" }, "Bio::Graphics::Glyph::extending_arrow" : { "file" : "lib/Bio/Graphics/Glyph/extending_arrow.pm" }, "Bio::Graphics::Glyph::fb_shmiggle" : { "file" : "lib/Bio/Graphics/Glyph/fb_shmiggle.pm" }, "Bio::Graphics::Glyph::fixedwidth" : { "file" : "lib/Bio/Graphics/Glyph/fixedwidth.pm" }, "Bio::Graphics::Glyph::flag" : { "file" : "lib/Bio/Graphics/Glyph/flag.pm" }, "Bio::Graphics::Glyph::gene" : { "file" : "lib/Bio/Graphics/Glyph/gene.pm" }, "Bio::Graphics::Glyph::generic" : { "file" : "lib/Bio/Graphics/Glyph/generic.pm" }, "Bio::Graphics::Glyph::graded_segments" : { "file" : "lib/Bio/Graphics/Glyph/graded_segments.pm" }, "Bio::Graphics::Glyph::group" : { "file" : "lib/Bio/Graphics/Glyph/group.pm" }, "Bio::Graphics::Glyph::hat" : { "file" : "lib/Bio/Graphics/Glyph/hat.pm" }, "Bio::Graphics::Glyph::heat_map" : { "file" : "lib/Bio/Graphics/Glyph/heat_map.pm" }, "Bio::Graphics::Glyph::heat_map_ideogram" : { "file" : "lib/Bio/Graphics/Glyph/heat_map_ideogram.pm" }, "Bio::Graphics::Glyph::heterogeneous_segments" : { "file" : "lib/Bio/Graphics/Glyph/heterogeneous_segments.pm" }, "Bio::Graphics::Glyph::hidden" : { "file" : "lib/Bio/Graphics/Glyph/hidden.pm" }, "Bio::Graphics::Glyph::hybrid_plot" : { "file" : "lib/Bio/Graphics/Glyph/hybrid_plot.pm", "version" : "1.0" }, "Bio::Graphics::Glyph::ideogram" : { "file" : "lib/Bio/Graphics/Glyph/ideogram.pm" }, "Bio::Graphics::Glyph::image" : { "file" : "lib/Bio/Graphics/Glyph/image.pm" }, "Bio::Graphics::Glyph::lightning" : { "file" : "lib/Bio/Graphics/Glyph/lightning.pm" }, "Bio::Graphics::Glyph::line" : { "file" : "lib/Bio/Graphics/Glyph/line.pm" }, "Bio::Graphics::Glyph::merge_parts" : { "file" : "lib/Bio/Graphics/Glyph/merge_parts.pm" }, "Bio::Graphics::Glyph::merged_alignment" : { "file" : "lib/Bio/Graphics/Glyph/merged_alignment.pm" }, "Bio::Graphics::Glyph::minmax" : { "file" : "lib/Bio/Graphics/Glyph/minmax.pm" }, "Bio::Graphics::Glyph::operon" : { "file" : "lib/Bio/Graphics/Glyph/operon.pm" }, "Bio::Graphics::Glyph::oval" : { "file" : "lib/Bio/Graphics/Glyph/oval.pm" }, "Bio::Graphics::Glyph::pairplot" : { "file" : "lib/Bio/Graphics/Glyph/pairplot.pm" }, "Bio::Graphics::Glyph::pentagram" : { "file" : "lib/Bio/Graphics/Glyph/pentagram.pm" }, "Bio::Graphics::Glyph::phylo_align" : { "file" : "lib/Bio/Graphics/Glyph/phylo_align.pm" }, "Bio::Graphics::Glyph::pinsertion" : { "file" : "lib/Bio/Graphics/Glyph/pinsertion.pm" }, "Bio::Graphics::Glyph::point_glyph" : { "file" : "lib/Bio/Graphics/Glyph/point_glyph.pm" }, "Bio::Graphics::Glyph::primers" : { "file" : "lib/Bio/Graphics/Glyph/primers.pm" }, "Bio::Graphics::Glyph::processed_transcript" : { "file" : "lib/Bio/Graphics/Glyph/processed_transcript.pm" }, "Bio::Graphics::Glyph::protein" : { "file" : "lib/Bio/Graphics/Glyph/protein.pm" }, "Bio::Graphics::Glyph::ragged_ends" : { "file" : "lib/Bio/Graphics/Glyph/ragged_ends.pm" }, "Bio::Graphics::Glyph::rainbow_gene" : { "file" : "lib/Bio/Graphics/Glyph/rainbow_gene.pm" }, "Bio::Graphics::Glyph::read_pair" : { "file" : "lib/Bio/Graphics/Glyph/read_pair.pm" }, "Bio::Graphics::Glyph::redgreen_box" : { "file" : "lib/Bio/Graphics/Glyph/redgreen_box.pm" }, "Bio::Graphics::Glyph::redgreen_segment" : { "file" : "lib/Bio/Graphics/Glyph/redgreen_segment.pm" }, "Bio::Graphics::Glyph::repeating_shape" : { "file" : "lib/Bio/Graphics/Glyph/repeating_shape.pm" }, "Bio::Graphics::Glyph::rndrect" : { "file" : "lib/Bio/Graphics/Glyph/rndrect.pm" }, "Bio::Graphics::Glyph::ruler_arrow" : { "file" : "lib/Bio/Graphics/Glyph/ruler_arrow.pm" }, "Bio::Graphics::Glyph::saw_teeth" : { "file" : "lib/Bio/Graphics/Glyph/saw_teeth.pm" }, "Bio::Graphics::Glyph::scale" : { "file" : "lib/Bio/Graphics/Glyph/scale.pm" }, "Bio::Graphics::Glyph::segmented_keyglyph" : { "file" : "lib/Bio/Graphics/Glyph/segmented_keyglyph.pm" }, "Bio::Graphics::Glyph::segments" : { "file" : "lib/Bio/Graphics/Glyph/segments.pm" }, "Bio::Graphics::Glyph::smoothing" : { "file" : "lib/Bio/Graphics/Glyph/smoothing.pm" }, "Bio::Graphics::Glyph::so_transcript" : { "file" : "lib/Bio/Graphics/Glyph/so_transcript.pm" }, "Bio::Graphics::Glyph::span" : { "file" : "lib/Bio/Graphics/Glyph/span.pm" }, "Bio::Graphics::Glyph::spectrogram" : { "file" : "lib/Bio/Graphics/Glyph/spectrogram.pm" }, "Bio::Graphics::Glyph::splice_site" : { "file" : "lib/Bio/Graphics/Glyph/splice_site.pm" }, "Bio::Graphics::Glyph::stackedplot" : { "file" : "lib/Bio/Graphics/Glyph/stackedplot.pm" }, "Bio::Graphics::Glyph::ternary_plot" : { "file" : "lib/Bio/Graphics/Glyph/ternary_plot.pm" }, "Bio::Graphics::Glyph::text_in_box" : { "file" : "lib/Bio/Graphics/Glyph/text_in_box.pm" }, "Bio::Graphics::Glyph::three_letters" : { "file" : "lib/Bio/Graphics/Glyph/three_letters.pm" }, "Bio::Graphics::Glyph::tic_tac_toe" : { "file" : "lib/Bio/Graphics/Glyph/tic_tac_toe.pm" }, "Bio::Graphics::Glyph::toomany" : { "file" : "lib/Bio/Graphics/Glyph/toomany.pm" }, "Bio::Graphics::Glyph::trace" : { "file" : "lib/Bio/Graphics/Glyph/trace.pm" }, "Bio::Graphics::Glyph::track" : { "file" : "lib/Bio/Graphics/Glyph/track.pm" }, "Bio::Graphics::Glyph::transcript" : { "file" : "lib/Bio/Graphics/Glyph/transcript.pm" }, "Bio::Graphics::Glyph::transcript2" : { "file" : "lib/Bio/Graphics/Glyph/transcript2.pm" }, "Bio::Graphics::Glyph::translation" : { "file" : "lib/Bio/Graphics/Glyph/translation.pm" }, "Bio::Graphics::Glyph::triangle" : { "file" : "lib/Bio/Graphics/Glyph/triangle.pm" }, "Bio::Graphics::Glyph::two_bolts" : { "file" : "lib/Bio/Graphics/Glyph/two_bolts.pm" }, "Bio::Graphics::Glyph::vista_plot" : { "file" : "lib/Bio/Graphics/Glyph/vista_plot.pm", "version" : "1.0" }, "Bio::Graphics::Glyph::wave" : { "file" : "lib/Bio/Graphics/Glyph/wave.pm" }, "Bio::Graphics::Glyph::weighted_arrow" : { "file" : "lib/Bio/Graphics/Glyph/weighted_arrow.pm" }, "Bio::Graphics::Glyph::whiskerplot" : { "file" : "lib/Bio/Graphics/Glyph/whiskerplot.pm" }, "Bio::Graphics::Glyph::wiggle_box" : { "file" : "lib/Bio/Graphics/Glyph/wiggle_box.pm" }, "Bio::Graphics::Glyph::wiggle_data" : { "file" : "lib/Bio/Graphics/Glyph/wiggle_data.pm" }, "Bio::Graphics::Glyph::wiggle_density" : { "file" : "lib/Bio/Graphics/Glyph/wiggle_density.pm" }, "Bio::Graphics::Glyph::wiggle_whiskers" : { "file" : "lib/Bio/Graphics/Glyph/wiggle_whiskers.pm" }, "Bio::Graphics::Glyph::wiggle_xyplot" : { "file" : "lib/Bio/Graphics/Glyph/wiggle_xyplot.pm" }, "Bio::Graphics::Glyph::xyplot" : { "file" : "lib/Bio/Graphics/Glyph/xyplot.pm" }, "Bio::Graphics::Layout" : { "file" : "lib/Bio/Graphics/Layout.pm" }, "Bio::Graphics::Layout::Contour" : { "file" : "lib/Bio/Graphics/Layout.pm" }, "Bio::Graphics::Math" : { "file" : "lib/Bio/Graphics/Layout.pm" }, "Bio::Graphics::Panel" : { "file" : "lib/Bio/Graphics/Panel.pm" }, "Bio::Graphics::Pictogram" : { "file" : "lib/Bio/Graphics/Pictogram.pm" }, "Bio::Graphics::RendererI" : { "file" : "lib/Bio/Graphics/RendererI.pm" }, "Bio::Graphics::Util" : { "file" : "lib/Bio/Graphics/Util.pm" }, "Bio::Graphics::Wiggle" : { "file" : "lib/Bio/Graphics/Wiggle.pm", "version" : "1.0" }, "Bio::Graphics::Wiggle::Loader" : { "file" : "lib/Bio/Graphics/Wiggle/Loader.pm" } }, "release_status" : "stable", "resources" : { "license" : [ "http://dev.perl.org/licenses/" ] }, "version" : "2.39" } Bio-Graphics-2.39/README.bioperl000555001750001750 35712366325116 16342 0ustar00lsteinlstein000000000000Bio::Graphics requires BioPerl version 1.6 ($VERSION 1.006 or higher), which is expected to be released by the end of 2008. Until then, you should use the version of Bio::Graphics that is in the current (1.5 or lower) version of BioPerl. Bio-Graphics-2.39/README000555001750001750 1144412366325116 14746 0ustar00lsteinlstein000000000000Bio::Graphics - Generate GD images of Bio::Seq objects SYNOPSIS This is a simple GD-based renderer (diagram drawer) for DNA and protein sequences. It is used from Perl like this: use Bio::Graphics; use Bio::DB::BioFetch; # or some other Bio::SeqI generator # get a Bio::SeqI object somehow my $bf = Bio::DB::BioFetch->new; my $cosmid = $bf->get_Seq_by_id('CEF58D5'); my @features = $cosmid->all_SeqFeatures; my @CDS = grep {$_->primary_tag eq 'CDS'} @features; my @gene = grep {$_->primary_tag eq 'gene'} @features; my @tRNAs = grep {$_->primary_tag eq 'tRNA'} @features; # let the drawing begin... my $panel = Bio::Graphics::Panel->new( -segment => $cosmid, -width => 800 ); $panel->add_track(arrow => $cosmid, -bump => 0, -double=>1, -tick => 2); $panel->add_track(transcript => \@gene, -bgcolor => 'blue', -fgcolor => 'black', -key => 'Genes', -bump => +1, -height => 10, -label => 1, -description=> 1 ) ; $panel->add_track(transcript2 => \@CDS, -bgcolor => 'cyan', -fgcolor => 'black', -key => 'CDS', -bump => +1, -height => 10, -label => 1, -description=> 1, ); $panel->add_track(generic => \@tRNAs, -bgcolor => 'red', -fgcolor => 'black', -key => 'tRNAs', -bump => +1, -height => 8, -label => 1, ); my $gd = $panel->gd; print $gd->can('png') ? $gd->png : $gd->gif; DESCRIPTION The Bio::Graphics::Panel class provides drawing and formatting services for any object that implements the Bio::SeqFeatureI interface, including Ace::Sequence::Feature, Das::Segment::Feature and Bio::DB::Graphics objects. It can be used to draw sequence annotations, physical (contig) maps, protein domains, or any other type of map in which a set of discrete ranges need to be laid out on the number line. The module supports a drawing style in which each type of feature occupies a discrete "track" that spans the width of the display. Each track will have its own distinctive "glyph", a configurable graphical representation of the feature. The module also supports a more flexible style in which several different feature types and their associated glyphs can occupy the same track. The choice of glyph is under run-time control. Semantic zooming (for instance, changing the type of glyph depending on the density of features) is supported by a callback system for configuration variables. The module has built-in support for Bio::Das stylesheets, and stylesheet-driven configuration can be intermixed with semantic zooming, if desired. You can add a key to the generated image using either of two key styles. One style places the key captions at the top of each track. The other style generates a graphical key at the bottom of the image. Note that this modules depends on Bio::Perl, GD and the Text::Parsewords module. A good tutorial on this module can be found at http://www.bioperl.org/wiki/HOWTO:Graphics. BUILDING AND INSTALLING From the directory in which this README file is located: % perl ./Build.PL % ./Build test % ./Build install The last step may need to be run as root. You can test whether the module is working by running the testit.pl script located in the eg subdirectory. It produces a PNG file, so you should pipe the output to an image displayer, such as xv: eg/testit.pl | xv - THE FEATURE_DRAW.PL SCRIPT This module contains a simple script named "feature_draw.pl" that takes a file of annotations and generates an image. When first built, the script lives in the "scripts" subdirectory. After installation, the script will be moved into your system-wide scripts directory (usually /usr/bin or something similar). There is a sample features file in the "eg" subdirectory. After building, but before installation, you can run the following command from the directory in which this README file is located: % scripts/feature_draw.pl eg/feature_data.txt | display - This is piping the output directly to the "display" program, part of the ImageMagick package. Replace with your favorite PNG-capable display program. After installation, feature_draw.pl will be available on your command path. Run "man feature_draw.pl" to see the manual page, or use the -h option to get a quick summary of usage. THE GENERIC GENOME BROWSER The gbrowse script, part of the Generic Genome Browser package, has been moved into its own package. It creates a high-performance web-based genome browser based on the Bio::Graphics package. You can get it by anonymous CVS to SourceForge: cvs -d:pserver:anonymous@cvs.gmod.sourceforge.net:/cvsroot/gmod \ co Generic-Genome-Browser Lincoln Stein 12 December 2008 Bio-Graphics-2.39/Makefile.PL000444001750001750 226312366325116 16014 0ustar00lsteinlstein000000000000# Note: this file was auto-generated by Module::Build::Compat version 0.4205 unless (eval "use Module::Build::Compat 0.02; 1" ) { print "This module requires Module::Build to install itself.\n"; require ExtUtils::MakeMaker; my $yn = ExtUtils::MakeMaker::prompt (' Install Module::Build now from CPAN?', 'y'); unless ($yn =~ /^y/i) { die " *** Cannot install without Module::Build. Exiting ...\n"; } require Cwd; require File::Spec; require CPAN; # Save this 'cause CPAN will chdir all over the place. my $cwd = Cwd::cwd(); CPAN::Shell->install('Module::Build::Compat'); CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate or die "Couldn't install Module::Build, giving up.\n"; chdir $cwd or die "Cannot chdir() back to $cwd: $!"; } eval "use Module::Build::Compat 0.02; 1" or die $@; Module::Build::Compat->run_build_pl(args => \@ARGV); my $build_script = 'Build'; $build_script .= '.com' if $^O eq 'VMS'; exit(0) unless(-e $build_script); # cpantesters convention require Module::Build; Module::Build::Compat->write_makefile(build_class => 'Module::Build'); Bio-Graphics-2.39/Build.PL000555001750001750 215712366325116 15343 0ustar00lsteinlstein000000000000#!/usr/bin/perl use strict; use warnings; use Module::Build; my $build = Module::Build->new( module_name => 'Bio::Graphics', license => 'perl', dist_version_from => 'lib/Bio/Graphics.pm', dist_author => 'Lincoln Stein ', requires => { 'Bio::Root::Version' => '1.005009001', 'GD' => 2.30, 'Statistics::Descriptive' => 2.6, # required for Bio::Graphics::Wiggle::Loader #and tests fail without it }, recommends => { 'GD::SVG' => 0.32, 'Text::ParseWords' => 3.26, # required for Bio::Graphics::Wiggle::Loader # 'Bio::SCF' => 1.01, # required for Bio::Graphics::Glyph::trace }, script_files => ['scripts/contig_draw.pl', 'scripts/feature_draw.pl', 'scripts/frend.pl', 'scripts/glyph_help.pl', 'scripts/search_overview.pl', 'scripts/render_msa.pl', ], create_makefile_pl => 'passthrough', build_class => 'Module::Build', ); $build->create_build_script; exit 0; Bio-Graphics-2.39/MANIFEST.SKIP000444001750001750 17612366325116 15721 0ustar00lsteinlstein000000000000^MYMETA.yml$ ^MYMETA\.json$ ^_build \.tar\.gz$ ^blib/ ^\. Build$ ^[^/]+\.pl$ ^[^/]+\.t$ ^[^/]+\.gff3 MANIFEST\.bak ~$ \.patch Bio-Graphics-2.39/Changes000555001750001750 4130712366325116 15362 0ustar00lsteinlstein000000000000Revision history for Perl extension Bio::Graphics. 2.39 - Turn off image-based regression tests becuase libgd has started to produce visually-identical images that are different at the byte level. 2.38 - If left labeling requested and the selected font size is larger than the available height, then go to smallest available font (gdTinyFont). 2.37 - Merge fix for incorrect parsing of feature_file sections (issue #6) - Added decorated_transcript glyph - Added nathanweeks fix for broken heatmap glyph 2.36 - Fix regression in glyph parent_feature() method so that it once again returns the parent of the current feature. - Remove recommended prerequisite of Bio::SCF, which is hardly used now. 2.35 - Change Glyph/segments.pm to work with both variants of CIGAR strings. - Workaround for broken useFontConfig() support in versions of GD prior to 2.50. - Fix "gdTinyFont doesn't support height() method error in xyplot". 2.34 Thu May 16 15:42:25 CDT 2013 - Fixed silent crashes when rendering with the GD::SVG class. 2.33 Fri Feb 22 15:58:10 EST 2013 - Add truetype support. Enable by passing -truetype=>1 to Bio::Graphics::Panel->new() 2.32 Mon Dec 10 05:47:45 EST 2012 - Clean up appearance of crossbox to avoid odd black bar in the middle. 2.32 Mon Dec 10 05:47:45 EST 2012 - Clean up appearance of crossbox to avoid odd black bar in the middle. 2.31 Tue Sep 25 22:39:43 EDT 2012 - Fix infinite loop when drawing wiggle_xyplots with z-score scaling over regions that do not vary much. 2.30 - Added the glyph for FlyBase's "stacked wiggle" plot (fb_shmiggle.pm) as well as a utility script for preparing the data (index_cov_files.pl). 2.29 - Fixes for Bio::Graphics::Wiggle to prevent crash when the "bottom" keystyle selected. - Add ability to obtain Bio::Graphics::Wiggle features directly from the Bio::Graphics::Wiggle::Loader without creating an intermediate gff3 file. 2.28 - Fixes to restore density plot functionality in hybrid_plot and vista_plot. - Fix handling of Bio::Graphics::Wiggle files in xyplots. 2.27 - Fix handling of code ref subs to allow for option=>\&Packagename::functionname. 2.26 - Support for normalizing quantitative plots across entire track. - Support for transparency within tracks, allowing features to overlap. - Support for -color_series and -color_cycle options (see Bio::Graphics::Panel) which cycle dynamically among a fixed series of background colors. 2.25 - Deprecate xyplot "histogram" subtype and default to "boxes". - Add xyplot overlay feature. - Fix gene glyph so that it collapses appropriately when bump explicitly set to 0. - Highlighting now works on features contained within groups. 2.24 - In feature file configuration sections, allow a tag to contain ":". 2.23 - Workaround a problem in BioPerl 1.069 which prevents FeatureFile from rendering properly. Fixed in 1.06902 and higher. - Fix issue which caused the track bgcolor property to be ignored in some cases. 2.22 - Changed package "Math" to "Bio::Graphics::Math" to avoid CPAN namespace collisions. 2.21 - Changed almost all occurrences of attributes() into eval{$feature->get_tag_values()} to achieve compatibility with Bio::SeqFeatureI. One exception is in spectrogram glyph, which depends on the non-standard behavior of attributes() when called with no args. 2.20 - Fixed the various "wiggle" glyphs so that scale is always drawn even if no data is to be shown in selected region. 2.19 - Made "record_label_positions" default to "true" for wiggle_density plot. This activates a fixed-position floating label when density plots are being shown in GBrowse. - Fixed a bug in wiggle_xyplot that prevented plot from being drawn in SVG renderings. 2.18 - Made handling of min/max scale calculations consistent across all xyplot glyphs and their derivatives. - Added following autoscale options to wiggle_xyplot and wiggle_whiskers: "z-score" to rescale data such that mean is zero and values are standard deviation-fold change; and "clipped_global" to scale to global mean +/- some number of standard deviations indicated by "z_score_bounds". - Added "z_score_bounds" option to wiggle_xyplot and wiggle_whiskers to control how many standard deviations to show. 2.17 - In segments glyph, fixed bleedover of "deletion" color when a deletion is followed by an insertion. - In segments glyph, fixed the display of inserted bases such that they will not bleed into a preceding deletion. - In segments glyph, fixed the mismatch color highlighting when the alignment is to the negative strand. - In segments glyph, fixed the default colors for mismatch, insertion and deletion. - In segments glyph, fixed treatment of soft clipping as an "insertion"; this will avoid the insertion color from appearing at the ends of soft-clipped reads. - In gene glyph, fixed occasional linking of two neighboring transcripts. 2.16 - Distinguish between "chromosome" and "global" autoscaling in the xyplot and density glyphs. Global autoscaling only works when underlying database is bigwig. - Regularized options which select glyph subtypes with an option named "glyph_subtype". 2.15 - Fixed documentation bug: sort_order options to sort by feature length should be "longest" and "shortest" rather than "longer and "shorter". - Improved layout algorithm, achieving speedup of ~4x on busy tracks. - Fixed font color problems when displaying multiple alignments at DNA level in the segments glyph. - Fixed problem of DNA alignment indels disappearing from view when they span entire region. - Fixed problem of mismatch and indel colors leaking off ends of feature arrows. 2.14 - Fixes to the way that "fast bump" works so that tracks never fast bump. This fixes problems when using groups to simulate subtracks, and the groups are of different heights. - The group glyph will now add the group labels to the list of track keys stored in the panel and retrieved from the call to $panel->key_boxes(). 2.13 - Changed default namespace for callbacks to make them portable across freeze/thaw cycles. 2.12 Tue Aug 31 10:42:06 EDT 2010 - Created a read_pairs glyph that contains the settings most often used for SAM paired end reads/mate pairs; this fixes the mate-pairs overlap bug. - xyplot glyph now obeys "flip" setting. 2.11 Tue Jun 29 15:37:03 EDT 2010 - Cleaned up stylesheet-based rendering of features when the main glyph has a type of "hat" and subfeatures overlap with each other. This occurred when rendering certain DAS sources. 2.10 Mon May 24 13:58:26 PDT 2010 - Fixed a long-standing but rarely-seen bug in layout algorithm that caused some features to be displaced downward further than they should be. - Added support for labeling groups (on the left side). This is used by GBrowse to create subtracks. 2.09 Fri May 14 11:46:51 EDT 2010 - Fixed Bio::Graphics::FeatureFile cached callbacks so that they are evaluated in the same package as they were when the file was originally evaluated and cached. 2.08 Thu May 13 17:06:29 EDT 2010 - Fixed Bio::Graphics::FeatureFile init_code so that it is reinvoked when retrieving a cached copy of parsed featurefiles. 2.07 Sun May 9 11:56:10 EDT 2010 - Added FeatureFile->cachedir argument to help with GBrowse tests. 2.06 Wed May 5 00:51:00 EDT 2010 - Segments glyph now displays correct mismatch color for sequences that begin or end with soft clips. - Indels displayed in correct color when indel begins or ends outside current visible region. 2.05 Identical to 2.04. 2.04 Sun Apr 18 17:26:01 EDT 2010 - Segments glyph now smarter about fetching reference sequence; this improves performance on multiple alignments. - -show_mismatch option now takes following arguments: 0 (false), "always", "base level" (draw only when DNA is in view), or a number, in which case mismatches will only be drawn when the length of the window is <= that number. For compatibility, a value of "1" is the same as "base level." - Fixed display of protein sequence in genes when -draw_protein is true. - Fixed display of long deletions in segments glyph base-pair alignments to avoid drop-out of sequence from the right end of the alignment following deleted region. - Fixed display of insertions in segments glyph base-pair alignments so that the length of the deletion is displayed when there is more than one digit of length. - Fixed Wiggle loader routine to handle statistics on chromosomes that have a combination of fixed and variable step declarations. 2.03 Fri Mar 26 16:32:02 EDT 2010 - Bad CPAN upload. Do not use. 2.02 Sun Mar 14 18:44:04 EDT 2010 - Added a wiggle_whiskers glyph that works nicely with BigWig and BigBed data. - Fixed processed_transcript (and gene) glyphs so that thin UTRs are more attractive. - Fixed the behavior of transcript arrows to be more customizable and not to get too large. - Segments glyph now shows mismatches when zoomed out and -show_mismatches is true. - Added an -indel_color option to segments glyph to show indels in a different color from simple nucleotide substitutions. - Added a -mismatch_only option to segments glyph that only shows mismatching base pairs when zoomed in. 2.01 Thu Feb 25 16:46:08 EST 2010 - Fixed display of alignments that have hard-clipping in their CIGAR strings. 2.00 Wed Jan 20 11:12:13 EST 2010 - Added the "cross" glyph for DAS compatibility. - Fixed the triangle glyph so that DAS stylesheets can set orientation properly. - Fixed wiggle_xyplot/density documentation of smoothing options. - Turn off sampling from wiggle loader by default (turn it on with --sample option). - Multiple sequence alignment code in the segments glyph has been updated to deal with the Samtools case of both reference DNA and target reporting minus strand alignments. - It felt like time to go to 2.00. 1.995 Wed Jan 6 10:06:17 EST 2010 - Fixed the gene glyph so that non-SO genes (gene=>exon without an intervening transcript) display properly. Otherwise the exons were bumping. - Added support for "featureRGB" and "featureScore" special color names. This provides an additional level of UCSC graphics compatibility. 1.994 Thu Dec 10 10:07:19 EST 2009 - The GFF3 Gap attribute (which contains a CIGAR string) is now supported in the segments glyph. Set -split_on_cigar=>1 when creating the track in order to activate this feature. 1.993 Thu Dec 3 06:36:06 EST 2009 - Fixed issue which caused GD::SVG rendering of xyplot glyph to show scale but no values under some circumstances. 1.992 Wed Nov 18 13:06:07 EST 2009 - Fixed issue in which the connector vanishes when zoomed in to the region between two parts (such as the region between two exons) 1.991 Mon Nov 16 09:20:18 EST 2009 - CPAN upload failed due to lack of $VERSION in hybrid_plot. Uploaded again. 1.99 Mon Nov 16 08:15:23 EST 2009 - Segments glyph now handles indels for features that have CIGAR strings. 1.982 Wed Aug 26 17:57:43 EDT 2009 - Fixed DAS stylesheet support so that Ensembl and Dazzle sources both work properly. 1.981 Wed Aug 19 15:21:31 EDT 2009 - Peter Ruzanov fixed bug in wiggle_xyplot that caused histogram to go to background color under some circumstances. 1.98 Mon Jul 6 09:48:58 EDT 2009 - Documented -feature_limit in the Panel docs as well as in Glyph. - Fixed bug in wiggle_xyplot that caused an ugly 1-pixel rectangle to be drawn in the case of a zero-height data value. 1.97 Thu Jul 2 15:22:21 EDT 2009 - Added "feature_limit" option to put a cap on the maximum number of features that a track will attempt to display. This only works correctly if features are added one at a time with add_feature(). 1.96 Thu Jun 4 17:49:57 EDT 2009 - Added "hat" and "hidden" glyphs, and changed way that the "line" glyph works in order to support DAS 1.5. 1.95 Sat May 30 18:07:21 EDT 2009 - In the substitution pattern rules, $id is replaced with the output of either the feature_id or primary_id methods depending on which one is implemented. - The image.pm glyph will now render into SVG if a sufficiently-current GD::SVG module is available. - Some fixes to the segments glyph to work better with Bio::DB::Bam rendering at the base pair level. - The glyph_help.pl script can now create SVGs. 1.94 Wed Apr 29 05:59:02 EDT 2009 - Added a "fast" bumping option suitable for very dense tracks in which all features have identical height. Activate it using -bump=>3 or -bump=>'fast'. - Fixed division by zero error in xyplot glyph when min_score==max_score. 1.93 Thu Apr 2 18:20:35 EDT 2009 - Many fixes to ideograph glyph to be more stable. - Fixed minor display issues involving bumping and directional arrows. - Continued documenting glyphs. About 75% done. 1.92 Tue Mar 31 00:38:16 EDT 2009 - Added documentation system for glyphs, but only half the glyphs are documented this way so far. - Bug fixes for GBrowse on Windows. 1.91 Tue Mar 17 09:54:02 EDT 2009 - wiggle_density now supports local scaling - wiggle loader now defaults to clipping at 2 stdev - adjusted default smoothing parameters to do less smoothing 1.90 Sun Mar 15 01:11:28 EDT 2009 - Optimized Bio::Graphics::Wiggle to sample directly from disk when the desired visualization size is significantly (less than 100 fold) smaller than the length of the region to be sampled. 1.88 Sat Mar 14 23:31:46 EDT 2009 -Cleaned up calculation of min and max values for scaling and introduced the "autoscale" option. 1.87 Sat Mar 14 20:56:47 EDT 2009 -Fixed bug in xyplot visualization. 1.86 Sat Mar 14 12:22:50 EDT 2009 -Improved performance of wiggle xyplot drawing about 5-fold -Added minor ticks to xyplots 1.83 Fri Jan 9 20:44:41 MST 2009 - Made #include directive case-insensitive. 1.80 December 2008 - Split off from Bio::Perl after a 6-year hiatus. 1.05 Fri Apr 12 20:53:42 EDT 2002 - Version 1.04 had a fatal bug. Do not use. 1.05 fixes this and is identical to BioPerl 1.01. 1.04 Fri Apr 12 08:20:35 EDT 2002 - Take advantage of optimizations in Bio::DB::GFF::Feature so don't have to retrieve subfeatures at low magnifications (when you can't see 'em anyway). 1.03 Fri Apr 12 00:26:12 EDT 2002 - Fixes to handle case of a transcript glyph that is zoomed in so far that only an intron shows (no exons). 1.02 Sun Mar 31 16:19:35 EST 2002 - Make the Bio::Graphics::Feature objects more-or-less compatible with Bio::SeqFeatureI and Bio::LocationI. Slightly difficult because this is a moving target. - Minor bugfixes to support Generic Genome browser version 1.37 0.98 Fri Feb 22 14:02:11 EST 2002 -Fixed up the scale so that numbers don't (or shouldn't) overlap. 0.97 Mon Feb 18 22:04:57 EST 2002 -Added the "dna" glyph, which supports display of raw DNA and a GC content histogram. 0.96 Fri Jan 11 13:23:03 EST 2002 -Added support for displaying heterogeneous features, such as WABA similarities. 0.95 Thu Jan 3 08:50:01 EST 2002 (LS) -Removed generic genome browser from project, it is now part of Generic-Genome-Browser. 0.92 Sat Dec 8 23:28:19 EST 2001 (LS) -Fixed up key glyph so that it correctly tracks what appears on screen -Fixed wormbase_transcript glyph so that it uses the skinny arrow when there isn't enough room to show the filled arrow. 0.91 Sun Nov 18 22:59:14 EST 2001 (LS) -Modified Feature.pm to accept vanilla GFF format. -Fixed Panel.pm so that empty tracks (height zero) do not take up space in the map. 0.90 Sun Nov 18 21:46:46 EST 2001 (LS) - Added the gbrowse genome browser script and supporting files - Added a wormbase_transcript glyph for Wormbase's curated/uncurated genes. 0.85 Mon Oct 1 16:41:57 EDT 2001 (LS) - Changed all instances of stop() to end() so that BioSeqFeatureI is supported correctly. 0.82 Fri Jul 20 10:36:57 EDT 2001 (LS) - Removed perl 5.6'isms. - Added appropriate documentation to Feature. 0.81 Tue Jun 12 09:30:10 EDT 2001 (LS) - Messed up sourceforge upload, so bumping version no to clean up. 0.80 Tue Jun 12 09:10:15 EDT 2001 (LS) - Basically functional - examples in eg/ - Bio::Graphics::Panel documentation complete, other documentation incomplete 0.01 Tue Jun 5 07:26:52 2001 (LS) - original version; created by h2xs 1.20 with options -n Bio::Graphics -A Bio-Graphics-2.39/MANIFEST000444001750001750 1434512366325116 15217 0ustar00lsteinlstein000000000000Build.PL Changes DISCLAIMER.txt eg/feature_data.gff eg/feature_data.txt eg/testit.pl eg/testit2.pl eg/testit3.pl lib/Bio/Graphics.pm lib/Bio/Graphics/ConfiguratorI.pm lib/Bio/Graphics/DrawTransmembrane.pm lib/Bio/Graphics/Feature.pm lib/Bio/Graphics/FeatureBase.pm lib/Bio/Graphics/FeatureDir.pm lib/Bio/Graphics/FeatureFile.pm lib/Bio/Graphics/FeatureFile/Iterator.pm lib/Bio/Graphics/GDWrapper.pm lib/Bio/Graphics/Glyph.pm lib/Bio/Graphics/Glyph/alignment.pm lib/Bio/Graphics/Glyph/allele_tower.pm lib/Bio/Graphics/Glyph/anchored_arrow.pm lib/Bio/Graphics/Glyph/arrow.pm lib/Bio/Graphics/Glyph/box.pm lib/Bio/Graphics/Glyph/broken_line.pm lib/Bio/Graphics/Glyph/cds.pm lib/Bio/Graphics/Glyph/christmas_arrow.pm lib/Bio/Graphics/Glyph/cross.pm lib/Bio/Graphics/Glyph/crossbox.pm lib/Bio/Graphics/Glyph/dashed_line.pm lib/Bio/Graphics/Glyph/decorated_gene.pm lib/Bio/Graphics/Glyph/decorated_transcript.pm lib/Bio/Graphics/Glyph/diamond.pm lib/Bio/Graphics/Glyph/dna.pm lib/Bio/Graphics/Glyph/dot.pm lib/Bio/Graphics/Glyph/dumbbell.pm lib/Bio/Graphics/Glyph/ellipse.pm lib/Bio/Graphics/Glyph/ex.pm lib/Bio/Graphics/Glyph/extending_arrow.pm lib/Bio/Graphics/Glyph/Factory.pm lib/Bio/Graphics/Glyph/fb_shmiggle.pm lib/Bio/Graphics/Glyph/fixedwidth.pm lib/Bio/Graphics/Glyph/flag.pm lib/Bio/Graphics/Glyph/gene.pm lib/Bio/Graphics/Glyph/generic.pm lib/Bio/Graphics/Glyph/graded_segments.pm lib/Bio/Graphics/Glyph/group.pm lib/Bio/Graphics/Glyph/hat.pm lib/Bio/Graphics/Glyph/heat_map.pm lib/Bio/Graphics/Glyph/heat_map_ideogram.pm lib/Bio/Graphics/Glyph/heterogeneous_segments.pm lib/Bio/Graphics/Glyph/hidden.pm lib/Bio/Graphics/Glyph/hybrid_plot.pm lib/Bio/Graphics/Glyph/ideogram.pm lib/Bio/Graphics/Glyph/image.pm lib/Bio/Graphics/Glyph/lightning.pm lib/Bio/Graphics/Glyph/line.pm lib/Bio/Graphics/Glyph/merge_parts.pm lib/Bio/Graphics/Glyph/merged_alignment.pm lib/Bio/Graphics/Glyph/minmax.pm lib/Bio/Graphics/Glyph/operon.pm lib/Bio/Graphics/Glyph/oval.pm lib/Bio/Graphics/Glyph/pairplot.pm lib/Bio/Graphics/Glyph/pentagram.pm lib/Bio/Graphics/Glyph/phylo_align.pm lib/Bio/Graphics/Glyph/pinsertion.pm lib/Bio/Graphics/Glyph/point_glyph.pm lib/Bio/Graphics/Glyph/primers.pm lib/Bio/Graphics/Glyph/processed_transcript.pm lib/Bio/Graphics/Glyph/protein.pm lib/Bio/Graphics/Glyph/ragged_ends.pm lib/Bio/Graphics/Glyph/rainbow_gene.pm lib/Bio/Graphics/Glyph/read_pair.pm lib/Bio/Graphics/Glyph/redgreen_box.pm lib/Bio/Graphics/Glyph/redgreen_segment.pm lib/Bio/Graphics/Glyph/repeating_shape.pm lib/Bio/Graphics/Glyph/rndrect.pm lib/Bio/Graphics/Glyph/ruler_arrow.pm lib/Bio/Graphics/Glyph/saw_teeth.pm lib/Bio/Graphics/Glyph/scale.pm lib/Bio/Graphics/Glyph/segmented_keyglyph.pm lib/Bio/Graphics/Glyph/segments.pm lib/Bio/Graphics/Glyph/smoothing.pm lib/Bio/Graphics/Glyph/so_transcript.pm lib/Bio/Graphics/Glyph/span.pm lib/Bio/Graphics/Glyph/spectrogram.pm lib/Bio/Graphics/Glyph/splice_site.pm lib/Bio/Graphics/Glyph/stackedplot.pm lib/Bio/Graphics/Glyph/ternary_plot.pm lib/Bio/Graphics/Glyph/text_in_box.pm lib/Bio/Graphics/Glyph/three_letters.pm lib/Bio/Graphics/Glyph/tic_tac_toe.pm lib/Bio/Graphics/Glyph/toomany.pm lib/Bio/Graphics/Glyph/trace.pm lib/Bio/Graphics/Glyph/track.pm lib/Bio/Graphics/Glyph/transcript.pm lib/Bio/Graphics/Glyph/transcript2.pm lib/Bio/Graphics/Glyph/translation.pm lib/Bio/Graphics/Glyph/triangle.pm lib/Bio/Graphics/Glyph/two_bolts.pm lib/Bio/Graphics/Glyph/vista_plot.pm lib/Bio/Graphics/Glyph/wave.pm lib/Bio/Graphics/Glyph/weighted_arrow.pm lib/Bio/Graphics/Glyph/whiskerplot.pm lib/Bio/Graphics/Glyph/wiggle_box.pm lib/Bio/Graphics/Glyph/wiggle_data.pm lib/Bio/Graphics/Glyph/wiggle_density.pm lib/Bio/Graphics/Glyph/wiggle_whiskers.pm lib/Bio/Graphics/Glyph/wiggle_xyplot.pm lib/Bio/Graphics/Glyph/xyplot.pm lib/Bio/Graphics/Layout.pm lib/Bio/Graphics/Panel.pm lib/Bio/Graphics/Pictogram.pm lib/Bio/Graphics/RendererI.pm lib/Bio/Graphics/Util.pm lib/Bio/Graphics/Wiggle.pm lib/Bio/Graphics/Wiggle/Loader.pm Makefile.PL MANIFEST MANIFEST.SKIP META.json META.yml README README.bioperl scripts/contig_draw.pl scripts/feature_draw.pl scripts/frend.pl scripts/glyph_help.pl scripts/index_cov_files.pl scripts/render_msa.pl scripts/search_overview.pl t/BioGraphics.t t/data/decorated_transcript_t1.gff t/data/decorated_transcript_t1.png t/data/feature_data.txt t/data/t1.gif t/data/t1.png t/data/t1/version1.gif t/data/t1/version1.png t/data/t1/version10.png t/data/t1/version11.gif t/data/t1/version11.png t/data/t1/version12.gif t/data/t1/version12.png t/data/t1/version13.gif t/data/t1/version13.png t/data/t1/version14.gif t/data/t1/version14.png t/data/t1/version15.gif t/data/t1/version15.png t/data/t1/version2.gif t/data/t1/version2.png t/data/t1/version3.gif t/data/t1/version3.png t/data/t1/version4.png t/data/t1/version5.png t/data/t1/version6.png t/data/t1/version7.png t/data/t1/version8.png t/data/t1/version9.gif t/data/t1/version9.png t/data/t2.gif t/data/t2.png t/data/t2/version1.gif t/data/t2/version1.png t/data/t2/version10.png t/data/t2/version11.png t/data/t2/version12.png t/data/t2/version13.png t/data/t2/version14.gif t/data/t2/version14.png t/data/t2/version15.png t/data/t2/version16.gif t/data/t2/version16.png t/data/t2/version17.gif t/data/t2/version17.png t/data/t2/version18.gif t/data/t2/version18.png t/data/t2/version19.gif t/data/t2/version19.png t/data/t2/version2.gif t/data/t2/version2.png t/data/t2/version20.gif t/data/t2/version20.png t/data/t2/version21.gif t/data/t2/version21.png t/data/t2/version3.gif t/data/t2/version3.png t/data/t2/version4.png t/data/t2/version5.png t/data/t2/version6.png t/data/t2/version7.png t/data/t2/version8.png t/data/t2/version9.png t/data/t3.gif t/data/t3.png t/data/t3/version1.gif t/data/t3/version1.png t/data/t3/version10.gif t/data/t3/version10.png t/data/t3/version11.gif t/data/t3/version11.png t/data/t3/version12.gif t/data/t3/version12.png t/data/t3/version13.gif t/data/t3/version13.png t/data/t3/version14.gif t/data/t3/version14.png t/data/t3/version15.gif t/data/t3/version15.png t/data/t3/version16.gif t/data/t3/version16.png t/data/t3/version2.gif t/data/t3/version2.png t/data/t3/version3.gif t/data/t3/version3.png t/data/t3/version4.png t/data/t3/version5.png t/data/t3/version6.png t/data/t3/version7.png t/data/t3/version8.gif t/data/t3/version8.png t/data/t3/version9.png t/data/wig_data.wig t/decorated_transcript_t1.pl t/Wiggle.t Bio-Graphics-2.39/META.yml000444001750001750 2555712366325116 15346 0ustar00lsteinlstein000000000000--- abstract: 'Generate GD images of Bio::Seq objects' author: - 'Lincoln Stein ' build_requires: {} configure_requires: Module::Build: 0.42 dynamic_config: 1 generated_by: 'Module::Build version 0.4205, CPAN::Meta::Converter version 2.120351' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Bio-Graphics provides: Bio::Graphics: file: lib/Bio/Graphics.pm version: 2.39 Bio::Graphics::ConfiguratorI: file: lib/Bio/Graphics/ConfiguratorI.pm version: 0 Bio::Graphics::DrawTransmembrane: file: lib/Bio/Graphics/DrawTransmembrane.pm version: 0 Bio::Graphics::Feature: file: lib/Bio/Graphics/Feature.pm version: 0 Bio::Graphics::FeatureBase: file: lib/Bio/Graphics/FeatureBase.pm version: 0 Bio::Graphics::FeatureDir: file: lib/Bio/Graphics/FeatureDir.pm version: 0 Bio::Graphics::FeatureFile: file: lib/Bio/Graphics/FeatureFile.pm version: 0 Bio::Graphics::FeatureFile::Iterator: file: lib/Bio/Graphics/FeatureFile/Iterator.pm version: 0 Bio::Graphics::FileSplitter: file: lib/Bio/Graphics/FeatureDir.pm version: 0 Bio::Graphics::GDWrapper: file: lib/Bio/Graphics/GDWrapper.pm version: 0 Bio::Graphics::Glyph: file: lib/Bio/Graphics/Glyph.pm version: 0 Bio::Graphics::Glyph::Factory: file: lib/Bio/Graphics/Glyph/Factory.pm version: 0 Bio::Graphics::Glyph::alignment: file: lib/Bio/Graphics/Glyph/alignment.pm version: 0 Bio::Graphics::Glyph::allele_tower: file: lib/Bio/Graphics/Glyph/allele_tower.pm version: 0 Bio::Graphics::Glyph::anchored_arrow: file: lib/Bio/Graphics/Glyph/anchored_arrow.pm version: 0 Bio::Graphics::Glyph::arrow: file: lib/Bio/Graphics/Glyph/arrow.pm version: 0 Bio::Graphics::Glyph::box: file: lib/Bio/Graphics/Glyph/box.pm version: 0 Bio::Graphics::Glyph::broken_line: file: lib/Bio/Graphics/Glyph/broken_line.pm version: 0 Bio::Graphics::Glyph::cds: file: lib/Bio/Graphics/Glyph/cds.pm version: 0 Bio::Graphics::Glyph::christmas_arrow: file: lib/Bio/Graphics/Glyph/christmas_arrow.pm version: 0 Bio::Graphics::Glyph::cross: file: lib/Bio/Graphics/Glyph/cross.pm version: 0 Bio::Graphics::Glyph::crossbox: file: lib/Bio/Graphics/Glyph/crossbox.pm version: 0 Bio::Graphics::Glyph::dashed_line: file: lib/Bio/Graphics/Glyph/dashed_line.pm version: 0 Bio::Graphics::Glyph::decorated_gene: file: lib/Bio/Graphics/Glyph/decorated_gene.pm version: 0 Bio::Graphics::Glyph::decorated_transcript: file: lib/Bio/Graphics/Glyph/decorated_transcript.pm version: 0 Bio::Graphics::Glyph::diamond: file: lib/Bio/Graphics/Glyph/diamond.pm version: 0 Bio::Graphics::Glyph::dna: file: lib/Bio/Graphics/Glyph/dna.pm version: 0 Bio::Graphics::Glyph::dot: file: lib/Bio/Graphics/Glyph/dot.pm version: 0 Bio::Graphics::Glyph::dumbbell: file: lib/Bio/Graphics/Glyph/dumbbell.pm version: 0 Bio::Graphics::Glyph::ellipse: file: lib/Bio/Graphics/Glyph/ellipse.pm version: 0 Bio::Graphics::Glyph::ex: file: lib/Bio/Graphics/Glyph/ex.pm version: 0 Bio::Graphics::Glyph::extending_arrow: file: lib/Bio/Graphics/Glyph/extending_arrow.pm version: 0 Bio::Graphics::Glyph::fb_shmiggle: file: lib/Bio/Graphics/Glyph/fb_shmiggle.pm version: 0 Bio::Graphics::Glyph::fixedwidth: file: lib/Bio/Graphics/Glyph/fixedwidth.pm version: 0 Bio::Graphics::Glyph::flag: file: lib/Bio/Graphics/Glyph/flag.pm version: 0 Bio::Graphics::Glyph::gene: file: lib/Bio/Graphics/Glyph/gene.pm version: 0 Bio::Graphics::Glyph::generic: file: lib/Bio/Graphics/Glyph/generic.pm version: 0 Bio::Graphics::Glyph::graded_segments: file: lib/Bio/Graphics/Glyph/graded_segments.pm version: 0 Bio::Graphics::Glyph::group: file: lib/Bio/Graphics/Glyph/group.pm version: 0 Bio::Graphics::Glyph::hat: file: lib/Bio/Graphics/Glyph/hat.pm version: 0 Bio::Graphics::Glyph::heat_map: file: lib/Bio/Graphics/Glyph/heat_map.pm version: 0 Bio::Graphics::Glyph::heat_map_ideogram: file: lib/Bio/Graphics/Glyph/heat_map_ideogram.pm version: 0 Bio::Graphics::Glyph::heterogeneous_segments: file: lib/Bio/Graphics/Glyph/heterogeneous_segments.pm version: 0 Bio::Graphics::Glyph::hidden: file: lib/Bio/Graphics/Glyph/hidden.pm version: 0 Bio::Graphics::Glyph::hybrid_plot: file: lib/Bio/Graphics/Glyph/hybrid_plot.pm version: 1.0 Bio::Graphics::Glyph::ideogram: file: lib/Bio/Graphics/Glyph/ideogram.pm version: 0 Bio::Graphics::Glyph::image: file: lib/Bio/Graphics/Glyph/image.pm version: 0 Bio::Graphics::Glyph::lightning: file: lib/Bio/Graphics/Glyph/lightning.pm version: 0 Bio::Graphics::Glyph::line: file: lib/Bio/Graphics/Glyph/line.pm version: 0 Bio::Graphics::Glyph::merge_parts: file: lib/Bio/Graphics/Glyph/merge_parts.pm version: 0 Bio::Graphics::Glyph::merged_alignment: file: lib/Bio/Graphics/Glyph/merged_alignment.pm version: 0 Bio::Graphics::Glyph::minmax: file: lib/Bio/Graphics/Glyph/minmax.pm version: 0 Bio::Graphics::Glyph::operon: file: lib/Bio/Graphics/Glyph/operon.pm version: 0 Bio::Graphics::Glyph::oval: file: lib/Bio/Graphics/Glyph/oval.pm version: 0 Bio::Graphics::Glyph::pairplot: file: lib/Bio/Graphics/Glyph/pairplot.pm version: 0 Bio::Graphics::Glyph::pentagram: file: lib/Bio/Graphics/Glyph/pentagram.pm version: 0 Bio::Graphics::Glyph::phylo_align: file: lib/Bio/Graphics/Glyph/phylo_align.pm version: 0 Bio::Graphics::Glyph::pinsertion: file: lib/Bio/Graphics/Glyph/pinsertion.pm version: 0 Bio::Graphics::Glyph::point_glyph: file: lib/Bio/Graphics/Glyph/point_glyph.pm version: 0 Bio::Graphics::Glyph::primers: file: lib/Bio/Graphics/Glyph/primers.pm version: 0 Bio::Graphics::Glyph::processed_transcript: file: lib/Bio/Graphics/Glyph/processed_transcript.pm version: 0 Bio::Graphics::Glyph::protein: file: lib/Bio/Graphics/Glyph/protein.pm version: 0 Bio::Graphics::Glyph::ragged_ends: file: lib/Bio/Graphics/Glyph/ragged_ends.pm version: 0 Bio::Graphics::Glyph::rainbow_gene: file: lib/Bio/Graphics/Glyph/rainbow_gene.pm version: 0 Bio::Graphics::Glyph::read_pair: file: lib/Bio/Graphics/Glyph/read_pair.pm version: 0 Bio::Graphics::Glyph::redgreen_box: file: lib/Bio/Graphics/Glyph/redgreen_box.pm version: 0 Bio::Graphics::Glyph::redgreen_segment: file: lib/Bio/Graphics/Glyph/redgreen_segment.pm version: 0 Bio::Graphics::Glyph::repeating_shape: file: lib/Bio/Graphics/Glyph/repeating_shape.pm version: 0 Bio::Graphics::Glyph::rndrect: file: lib/Bio/Graphics/Glyph/rndrect.pm version: 0 Bio::Graphics::Glyph::ruler_arrow: file: lib/Bio/Graphics/Glyph/ruler_arrow.pm version: 0 Bio::Graphics::Glyph::saw_teeth: file: lib/Bio/Graphics/Glyph/saw_teeth.pm version: 0 Bio::Graphics::Glyph::scale: file: lib/Bio/Graphics/Glyph/scale.pm version: 0 Bio::Graphics::Glyph::segmented_keyglyph: file: lib/Bio/Graphics/Glyph/segmented_keyglyph.pm version: 0 Bio::Graphics::Glyph::segments: file: lib/Bio/Graphics/Glyph/segments.pm version: 0 Bio::Graphics::Glyph::smoothing: file: lib/Bio/Graphics/Glyph/smoothing.pm version: 0 Bio::Graphics::Glyph::so_transcript: file: lib/Bio/Graphics/Glyph/so_transcript.pm version: 0 Bio::Graphics::Glyph::span: file: lib/Bio/Graphics/Glyph/span.pm version: 0 Bio::Graphics::Glyph::spectrogram: file: lib/Bio/Graphics/Glyph/spectrogram.pm version: 0 Bio::Graphics::Glyph::splice_site: file: lib/Bio/Graphics/Glyph/splice_site.pm version: 0 Bio::Graphics::Glyph::stackedplot: file: lib/Bio/Graphics/Glyph/stackedplot.pm version: 0 Bio::Graphics::Glyph::ternary_plot: file: lib/Bio/Graphics/Glyph/ternary_plot.pm version: 0 Bio::Graphics::Glyph::text_in_box: file: lib/Bio/Graphics/Glyph/text_in_box.pm version: 0 Bio::Graphics::Glyph::three_letters: file: lib/Bio/Graphics/Glyph/three_letters.pm version: 0 Bio::Graphics::Glyph::tic_tac_toe: file: lib/Bio/Graphics/Glyph/tic_tac_toe.pm version: 0 Bio::Graphics::Glyph::toomany: file: lib/Bio/Graphics/Glyph/toomany.pm version: 0 Bio::Graphics::Glyph::trace: file: lib/Bio/Graphics/Glyph/trace.pm version: 0 Bio::Graphics::Glyph::track: file: lib/Bio/Graphics/Glyph/track.pm version: 0 Bio::Graphics::Glyph::transcript: file: lib/Bio/Graphics/Glyph/transcript.pm version: 0 Bio::Graphics::Glyph::transcript2: file: lib/Bio/Graphics/Glyph/transcript2.pm version: 0 Bio::Graphics::Glyph::translation: file: lib/Bio/Graphics/Glyph/translation.pm version: 0 Bio::Graphics::Glyph::triangle: file: lib/Bio/Graphics/Glyph/triangle.pm version: 0 Bio::Graphics::Glyph::two_bolts: file: lib/Bio/Graphics/Glyph/two_bolts.pm version: 0 Bio::Graphics::Glyph::vista_plot: file: lib/Bio/Graphics/Glyph/vista_plot.pm version: 1.0 Bio::Graphics::Glyph::wave: file: lib/Bio/Graphics/Glyph/wave.pm version: 0 Bio::Graphics::Glyph::weighted_arrow: file: lib/Bio/Graphics/Glyph/weighted_arrow.pm version: 0 Bio::Graphics::Glyph::whiskerplot: file: lib/Bio/Graphics/Glyph/whiskerplot.pm version: 0 Bio::Graphics::Glyph::wiggle_box: file: lib/Bio/Graphics/Glyph/wiggle_box.pm version: 0 Bio::Graphics::Glyph::wiggle_data: file: lib/Bio/Graphics/Glyph/wiggle_data.pm version: 0 Bio::Graphics::Glyph::wiggle_density: file: lib/Bio/Graphics/Glyph/wiggle_density.pm version: 0 Bio::Graphics::Glyph::wiggle_whiskers: file: lib/Bio/Graphics/Glyph/wiggle_whiskers.pm version: 0 Bio::Graphics::Glyph::wiggle_xyplot: file: lib/Bio/Graphics/Glyph/wiggle_xyplot.pm version: 0 Bio::Graphics::Glyph::xyplot: file: lib/Bio/Graphics/Glyph/xyplot.pm version: 0 Bio::Graphics::Layout: file: lib/Bio/Graphics/Layout.pm version: 0 Bio::Graphics::Layout::Contour: file: lib/Bio/Graphics/Layout.pm version: 0 Bio::Graphics::Math: file: lib/Bio/Graphics/Layout.pm version: 0 Bio::Graphics::Panel: file: lib/Bio/Graphics/Panel.pm version: 0 Bio::Graphics::Pictogram: file: lib/Bio/Graphics/Pictogram.pm version: 0 Bio::Graphics::RendererI: file: lib/Bio/Graphics/RendererI.pm version: 0 Bio::Graphics::Util: file: lib/Bio/Graphics/Util.pm version: 0 Bio::Graphics::Wiggle: file: lib/Bio/Graphics/Wiggle.pm version: 1.0 Bio::Graphics::Wiggle::Loader: file: lib/Bio/Graphics/Wiggle/Loader.pm version: 0 recommends: GD::SVG: 0.32 Text::ParseWords: 3.26 requires: Bio::Root::Version: 1.005009001 GD: 2.3 Statistics::Descriptive: 2.6 resources: license: http://dev.perl.org/licenses/ version: 2.39 Bio-Graphics-2.39/eg000755001750001750 012366325116 14275 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/eg/testit3.pl000555001750001750 1016612366325116 16415 0ustar00lsteinlstein000000000000#!/usr/bin/perl -w use lib '.','..','./blib/lib','../blib/lib'; use strict; use Bio::Graphics::Panel; use Bio::Graphics::Feature; use GD 'gdMediumBoldFont'; my $ftr = 'Bio::Graphics::Feature'; my $segment = $ftr->new(-start=>-100,-end=>1400,-name=>'ZK154',-type=>'clone'); my $zk154_1 = $ftr->new(-start=>-50,-end=>800,-name=>'ZK154.1',-type=>'gene'); my $zk154_2 = $ftr->new(-segments=>[[200,300],[380,800]],-name=>'ZK154.2',-type=>'gene'); my $zk154_3 = $ftr->new(-start=>900,-end=>1200,-name=>'ZK154.3',-type=>'gene'); my $zed_27 = $ftr->new(-segments=>[[550,600],[800,950],[1200,1300]], -name=>'zed-27', -subtype=>'exon',-type=>'transcript'); my $abc3 = $ftr->new(-segments=>[[100,200],[350,400],[500,550]], -name=>'abc53', -strand => -1, -subtype=>'exon',-type=>'transcript'); my $xyz4 = $ftr->new(-segments=>[[40,80],[100,120],[200,280],[300,320]], -name=>'xyz4', -subtype=>'predicted',-type=>'alignment'); my $m3 = $ftr->new(-segments=>[[20,40],[30,60],[90,270],[290,300]], -name=>'M3', -subtype=>'predicted',-type=>'alignment'); my $bigone = $ftr->new(-segments=>[[-200,-120],[90,270],[290,300]], -name=>'big one', -subtype=>'predicted',-type=>'alignment'); my $fred_12 = $ftr->new(-segments=>[$xyz4,$zed_27], -type => 'group', -name =>'fred-12'); my $confirmed_exon1 = $ftr->new(-start=>1,-stop=>20, -type=>'exon', -source=>'confirmed', -name => 'confirmed1', ); my $predicted_exon1 = $ftr->new(-start=>30,-stop=>50, -type=>'exon', -name=>'predicted1', -source=>'predicted'); my $predicted_exon2 = $ftr->new(-start=>60,-stop=>100, -name=>'predicted2', -type=>'exon',-source=>'predicted'); my $confirmed_exon3 = $ftr->new(-start=>150,-stop=>190, -type=>'exon',-source=>'confirmed', -name=>'abc123'); my $partial_gene = $ftr->new(-segments=>[$confirmed_exon1,$predicted_exon1,$predicted_exon2,$confirmed_exon3], -name => 'partial gene', -type => 'transcript', -source => '(from a big annotation pipeline)' ); my @segments = $partial_gene->segments; my $score = 10; foreach (@segments) { $_->score($score); $score += 10; } my $panel = Bio::Graphics::Panel->new( -gridcolor => 'lightcyan', -grid => 1, -segment => $segment, -spacing => 15, -width => 600, -pad_top => 20, -pad_bottom => 20, -pad_left => 20, -pad_right=> 20, -key_style => 'between', ); my @colors = $panel->color_names(); my $t = $panel->add_track( transcript2 => [$abc3,$zed_27], -label => 1, -bump => 1, -key => 'Prophecies', # -tkcolor => $colors[rand @colors], ); $t->configure(-bump=>1); $panel->add_track($segment, -glyph => 'arrow', -label => sub {scalar localtime}, -labelfont => gdMediumBoldFont, -double => 1, -bump => 0, -height => 10, -arrowstyle=>'regular', -linewidth=>1, -tick => 2, ); $panel->add_track(generic => [$segment,$abc3,$zk154_1,[$zk154_2,$xyz4]], -label => sub { $_[-1]->level == 0 } , -bgcolor => sub { shift->primary_tag eq 'predicted' ? 'green' : 'blue'}, -connector => sub { my $primary_tag = shift->primary_tag; $primary_tag eq 'transcript' ? 'hat' : $primary_tag eq 'alignment' ? 'solid' : 'solid'}, -connector_color => 'black', -height => 10, -bump => 1, # -tkcolor => $colors[rand @colors], -key => 'Signals', ); my $track = $panel->add_track('transcript2'=>[$bigone], -label => 1, -connector => 'solid', -point => 0, -orient => 'N', -height => 8, -base => 1, -relative_coords => 1, -tick => 2, -bgcolor => 'red', -key => 'Dynamically Added'); #$track->add_feature($bigone,$zed_27,$abc3); #$track->add_group($predicted_exon1,$predicted_exon2,$confirmed_exon3); $track->add_group($bigone,$zed_27,$zk154_2,$bigone); my $gd = $panel->gd; my @boxes = $panel->boxes; my $red = $panel->translate_color('red'); for my $box (@boxes) { my ($feature,@points) = @$box; } print $gd->png; Bio-Graphics-2.39/eg/testit2.pl000555001750001750 501712366325116 16373 0ustar00lsteinlstein000000000000#!/usr/bin/perl -w use lib './lib','../lib','./blib/lib','../blib/lib'; use strict; use Bio::Graphics::Panel; use Bio::Graphics::Feature; my $ftr = 'Bio::Graphics::Feature'; my $segment = $ftr->new(-start=>1,-end=>1000,-name=>'ZK154',-type=>'clone'); my $zk154_1 = $ftr->new(-start=>-50,-end=>800,-name=>'ZK154.1',-type=>'gene'); my $zk154_2 = $ftr->new(-start=>380,-end=>500,-name=>'ZK154.2',-type=>'gene'); my $zed_27 = $ftr->new(-segments=>[[400,500],[550,600],[800,950]], -name=>'zed-27', -subtype=>'exon',-type=>'transcript'); my $abc3 = $ftr->new(-segments=>[[100,200],[350,400],[500,550]], -name=>'abc3', -strand => -1, -subtype=>'exon',-type=>'transcript'); my $xyz4 = $ftr->new(-segments=>[[40,80],[100,120],[200,280],[300,320]], -name=>'xyz4', -subtype=>'predicted',-type=>'alignment'); my $m3 = $ftr->new(-segments=>[[20,40],[30,60],[90,270],[290,300]], -name=>'M3', -subtype=>'predicted',-type=>'alignment'); my $fred_12 = $ftr->new(-segments=>[$xyz4,$zed_27], -type => 'group', -name =>'fred-12'); my $confirmed_exon1 = $ftr->new(-start=>1,-stop=>20, -type=>'exon',-source=>'confirmed'); my $predicted_exon1 = $ftr->new(-start=>30,-stop=>50, -type=>'exon',-source=>'predicted'); my $predicted_exon2 = $ftr->new(-start=>60,-stop=>100, -type=>'exon',-source=>'predicted'); my $confirmed_exon3 = $ftr->new(-start=>150,-stop=>190, -type=>'exon',-source=>'confirmed'); my $partial_gene = $ftr->new(-segments=>[$confirmed_exon1,$predicted_exon1,$predicted_exon2,$confirmed_exon3], -name => 'partial_gene'); my $panel = Bio::Graphics::Panel->new( -segment => $segment, # -offset => 300, # -length => 1000, -spacing => 15, -width => 600, -pad_top => 20, -pad_bottom => 20, -pad_left => 20, -pad_right=> 20, -key_style => 'between', ); $panel->add_track( [$abc3,$zed_27,$partial_gene], -bgcolor => sub { shift->source_tag eq 'predicted' ? 'green' : 'blue'}, -glyph => sub { my $feature = shift; return $feature->source_tag eq 'predicted' ? 'ellipse' : 'transcript'}, -label => 1, -bump => 1, -key => 'portents', ); #print $panel->png; my $gd = $panel->gd; my @boxes = $panel->boxes; my $red = $panel->translate_color('red'); for my $box (@boxes) { my ($feature,@points) = @$box; # $gd->rectangle(@points,$red); } #$gd->filledRectangle(0,0,20,200,1); #$gd->filledRectangle(600-20,0,600,200,1); print $gd->png; Bio-Graphics-2.39/eg/feature_data.txt000555001750001750 310012366325116 17614 0ustar00lsteinlstein000000000000[general] pixels = 750 bases = -1000..21000 height = 12 reference = B0511 [Cosmid] glyph = segments fgcolor = blue key = C. elegans conserved regions [EST] glyph = segments bgcolor= yellow connector = solid height = 5 [FGENESH] glyph = transcript2 bgcolor = green description = 1 [SwissProt] glyph = arrow base = 1 linewidth = 2 fgcolor = red description = 1 [P-element] glyph = triangle orient = S bgcolor = red fgcolor = white label = 1 point = 1 Cosmid B0511 516-619 Cosmid B0511 3185-3294 Cosmid B0511 10946-11208 Cosmid B0511 13126-13511 Cosmid B0511 11394-11539 Cosmid B0511 14383-14490 Cosmid B0511 15569-15755 Cosmid B0511 18879-19178 Cosmid B0511 15850-16110 Cosmid B0511 66-208 Cosmid B0511 6354-6499 Cosmid B0511 13955-14115 Cosmid B0511 7985-8042 Cosmid B0511 11916-12046 P-element "" 500-500 P-element MrQ 700-700 P-element MrR 10000-10000 EST yk260e10.5 15569-15724 EST yk672a12.5 537-618,3187-3294 EST yk595e6.5 552-618 EST yk595e6.5 3187-3294 EST yk846e07.3 11015-11208 EST yk53c10 yk53c10.3 12876-13577,13882-14121,14169-14535 yk53c10.5 18892-19154,15853-16219 SwissProt "PECANEX Protein" 5513-16656 "From SwissProt" FGENESH "Predicted gene 1" -1200--500,518-616,661-735,3187-3365,3436-3846 Pfam domain FGENESH "Predicted gene 2" 5513-6497,7968-8136,8278-8383,8651-8839,9462-9515,10032-10705,10949-11340,11387-11524,11765-12067,12876-13577,13882-14121,14169-14535,15006-15209,15259-15462,15513-15753,15853-16219 Mysterious FGENESH "Predicted gene 3" 16626-17396,17451-17597 FGENESH "Predicted gene 4" 18459-18722,18882-19176,19221-19513,19572-30000 "Transmembrane protein" Bio-Graphics-2.39/eg/feature_data.gff000555001750001750 215612366325116 17551 0ustar00lsteinlstein000000000000# this is a regular GFF-format file [intron:curated] glyph = segments description = 1 bgcolor = green height = 5 key = Curated Introns [structural:GenePair_STS] glyph = primers fgcolor = black bgcolor = blue connect = 1 III curated Sequence 2729913 2752540 . + . Sequence "H19M22.2a" III curated Sequence 2729913 2752540 . + . Sequence "H19M22.2b" III Expr_profile Expression 2731006 2732545 . + . Expr_profile "H19M22.2" III GenePair_STS structural 2731006 2732545 . + . PCR_product "sjj_H19M22.2" III curated Sequence 2748310 2752540 . + . Sequence "H19M22.2c" III curated intron 2730004 2730635 . + . Sequence "H19M22.2b" ; Confirmed_by_EST III curated intron 2730004 2730635 . + . Sequence "H19M22.2a" ; Confirmed_by_EST III curated intron 2730705 2730846 . + . Sequence "H19M22.2a" ; Confirmed_by_EST III curated intron 2730705 2730846 . + . Sequence "H19M22.2b" ; Confirmed_by_EST III curated intron 2731102 2731151 . + . Sequence "H19M22.2a" ; Confirmed_by_EST III curated intron 2731102 2731151 . + . Sequence "H19M22.2b" ; Confirmed_by_EST III curated intron 2731541 2732220 . + . Sequence "H19M22.2b" ; Confirmed_by_cDNA Bio-Graphics-2.39/eg/testit.pl000555001750001750 1422512366325116 16332 0ustar00lsteinlstein000000000000#!/usr/bin/perl -w use lib '.','..','./blib/lib','../blib/lib'; use strict; use Bio::Graphics::Panel; use Bio::Graphics::Feature; my $ftr = 'Bio::Graphics::Feature'; my $segment = $ftr->new(-start=>-100,-end=>1000,-name=>'ZK154',-type=>'clone'); my $zk154_1 = $ftr->new(-start=>-50,-end=>800,-name=>'ZK154.1',-type=>'gene'); my $zk154_2 = $ftr->new(-start=>380,-end=>500,-name=>'ZK154.2',-type=>'gene'); my $zk154_3 = $ftr->new(-start=>900,-end=>1200,-name=>'ZK154.3',-type=>'gene'); my $zed_27 = $ftr->new(-segments=>[[400,500],[550,600],[800,950]], -name=>'zed-27', -subtype=>'exon',-type=>'transcript'); my $abc3 = $ftr->new(-segments=>[[100,200],[350,400],[500,550]], -name=>'abc53', -strand => -1, -subtype=>'exon',-type=>'transcript'); my $xyz4 = $ftr->new(-segments=>[[40,80],[100,120],[200,280],[300,320]], -name=>'xyz4', -subtype=>'predicted',-type=>'alignment'); my $m3 = $ftr->new(-segments=>[[20,40],[30,60],[90,270],[290,300]], -name=>'M3', -subtype=>'predicted',-type=>'alignment'); my $bigone = $ftr->new(-segments=>[[-200,-120],[90,270],[290,300]], -name=>'big one', -subtype=>'predicted',-type=>'alignment'); my $fred_12 = $ftr->new(-segments=>[$xyz4,$zed_27], -type => 'group', -name =>'fred-12'); my $confirmed_exon1 = $ftr->new(-start=>1,-stop=>20, -type=>'exon', -source=>'confirmed', -name => 'confirmed1', ); my $predicted_exon1 = $ftr->new(-start=>30,-stop=>50, -type=>'exon', -name=>'predicted1', -source=>'predicted'); my $predicted_exon2 = $ftr->new(-start=>60,-stop=>100, -name=>'predicted2', -type=>'exon',-source=>'predicted'); my $confirmed_exon3 = $ftr->new(-start=>150,-stop=>190, -type=>'exon',-source=>'confirmed', -name=>'abc123'); my $partial_gene = $ftr->new(-segments=>[$confirmed_exon1,$predicted_exon1,$predicted_exon2,$confirmed_exon3], -name => 'partial gene', -type => 'transcript', -source => '(from a big annotation pipeline)' ); my @segments = $partial_gene->segments; my $score = 10; foreach (@segments) { $_->score($score); $score += 10; } my $panel = Bio::Graphics::Panel->new( # -grid => [50,100,150,200,250,300,310,320,330], -gridcolor => 'lightcyan', -grid => 1, -segment => $segment, # -offset => 300, # -length => 1000, -spacing => 15, -width => 600, -pad_top => 20, -pad_bottom => 20, -pad_left => 20, -pad_right=> 20, # -bgcolor => 'teal', # -key_style => 'between', -key_style => 'bottom', ); my @colors = $panel->color_names(); my $t = $panel->add_track( # generic => [$abc3,$zed_27], transcript2 => [$abc3,$zed_27], -label => 1, -bump => 1, -key => 'Prophecies', # -tkcolor => $colors[rand @colors], ); $t->configure(-bump=>1); $panel->add_track($segment, -glyph => 'arrow', -label => 'base pairs', -double => 1, -bump => 0, -height => 10, -arrowstyle=>'regular', -linewidth=>1, # -tkcolor => $colors[rand @colors], -tick => 2, ); $panel->unshift_track(generic => [$segment,$zk154_1,$zk154_2,$zk154_3,[$xyz4,$zed_27]], -label => sub { my $feature = shift; $feature->sub_SeqFeature>0}, -bgcolor => sub { shift->primary_tag eq 'predicted' ? 'olive' : 'red'}, -connector => sub { my $feature = shift; my $type = $feature->primary_tag; $type eq 'group' ? 'dashed' : $type eq 'transcript' ? 'hat' : $type eq 'alignment' ? 'solid' : undef}, -all_callbacks => 1, -connector_color => 'black', -height => 10, -bump => 1, -linewidth=>2, # -tkcolor => $colors[rand @colors], -key => 'Signs', ); my $track = $panel->add_track('transcript2', -label => sub { $_[-1]->level == 0 } , -connector => sub { return shift->type eq 'group' ? 'dashed' : ''}, -point => 0, -orient => 'N', -height => 8, -base => 1, -relative_coords => 1, -tick => 2, -all_callbacks => 1, -bgcolor => 'red', -key => 'Dynamically Added'); $track->add_feature($bigone,$zed_27,$abc3); $track->add_group($predicted_exon1,$predicted_exon2,$confirmed_exon3); $panel->add_track( [$abc3,$zed_27,$partial_gene], -bgcolor => sub { shift->source_tag eq 'predicted' ? 'green' : 'blue'}, -glyph => 'transcript', # -glyph => sub { my $feature = shift; # return $feature->source_tag eq 'predicted' # ? 'ellipse' : 'transcript'}, -label => sub { shift->sub_SeqFeature > 0 }, # -label => 1, # -description => sub { shift->sub_SeqFeature > 0 }, -description => sub { my $feature = shift; return 1 if $feature->primary_tag eq 'transcript'; return '*' if $feature->source_tag eq 'predicted'; return; }, -font2color => 'red', -bump => +1, # -tkcolor => $colors[rand @colors], -key => 'Portents', ); $panel->add_track(segments => [$segment,$zk154_1,[$zk154_2,$xyz4]], -label => 1, -bgcolor => sub { shift->primary_tag eq 'predicted' ? 'green' : 'blue'}, -connector => sub { my $primary_tag = shift->primary_tag; $primary_tag eq 'transcript' ? 'hat' : $primary_tag eq 'alignment' ? 'solid' : undef}, -connector_color => 'black', -height => 10, -bump => 1, # -tkcolor => $colors[rand @colors], -key => 'Signals', ); $panel->add_track(generic => [], -key => 'Foobar'); $panel->add_track(graded_segments => $partial_gene, -bgcolor =>'blue', -label => 1, -key => 'Scored thing'); $panel->add_track(diamond => [$segment,$zk154_1,$zk154_2,$zk154_3,$xyz4,$zed_27], -bgcolor =>'blue', -label => 1, -key => 'pointy thing'); #print $panel->png; my $gd = $panel->gd; my @boxes = $panel->boxes; my $red = $panel->translate_color('red'); for my $box (@boxes) { my ($feature,@points) = @$box; # $gd->rectangle(@points,$red); } #$gd->filledRectangle(0,0,20,200,1); #$gd->filledRectangle(600-20,0,600,200,1); print $gd->png; Bio-Graphics-2.39/t000755001750001750 012366325116 14145 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/t/BioGraphics.t000555001750001750 3246112366325116 16712 0ustar00lsteinlstein000000000000# -*-Perl-*- Test Harness script for Bioperl use strict; use File::Spec; use FindBin '$Bin'; use File::Glob ':glob'; # In order to properly run the image comparison tests the images may need to be # regenerated from scratch; this is primarily due to changes in GD versions, OS, # Bio::Graphics, problems with storing binary data in CVS, etc. # We'll need to reconfigure these tests to allow do_write() # the ability to regenerate those files when passing the --write option # for now, the image tests are turned off use lib "$Bin/../lib"; # libgd has become unstable -- produces a binary different (but visually identical) # image each time. use constant IMAGE_TESTS => 0; BEGIN { use lib '.'; use Test::More tests => 49 + (IMAGE_TESTS ? 3 : 0); use_ok('GD::Image'); use_ok('Bio::Graphics::FeatureFile'); use_ok('Bio::Graphics::Panel'); } my $images = File::Spec->catfile($Bin,'data'); my @images = IMAGE_TESTS ? qw(t1 t2 t3) : (); # parse command line arguments my $write = 0; while (@ARGV && $ARGV[0] =~ /^--?(\w+)/) { my $arg = $1; if ($arg eq 'write') { warn "Writing regression test images into ",$images,".........\n"; $write++; } shift; } foreach (@images) { if ($write) { warn "$_...\n"; do_write($_) } else { eval { do_compare($_) } } } my $data = Bio::Graphics::FeatureFile->new(-file => File::Spec->catfile($Bin,'data','feature_data.txt'), -safe => 0, ) or die; ok defined $data; is $data->render, 5; is $data->setting(general=>'pixels'), 750; is $data->setting('general'), 3; is $data->setting, 6; is $data->glyph('EST'), 'segments'; my %style = $data->style('EST'); is $style{-connector}, 'solid'; is $style{-height}, 5; is $style{-bgcolor}, 'yellow'; is $data->configured_types, 5; is @{$data->features('EST')}, 5; my $thing = $data->features('EST'); is $thing->[0]->seq_id,'B0511'; my ($feature) = grep {$_->name eq 'Predicted gene 1'} @{$data->features('FGENESH')}; ok $feature; is $feature->desc, "Pfam"; is $feature->score, 20; # test handling of things that look like comments is $data->setting(EST=>'bgcolor'),'yellow'; is $data->setting(EST=>'fgcolor'),'#EE00FF'; is $data->setting(EST=>'link'),'http://www.google.com/search?q=$name#results'; # test handling of adding features $data->add_type(TEST=>{bgcolor=>'green', feature=>'test_feature', glyph => 'generic'}); is $data->setting(TEST=>'bgcolor'),'green'; is $data->setting(TEST=>'feature'),'test_feature'; $data->add_feature(Bio::Graphics::Feature->new(-seq_id => 'chr1', -start => 1, -end => 1000, -primary_tag=> 'test_feature')); $data->add_feature(Bio::Graphics::Feature->new(-seq_id => 'chr2', -start => 2, -end => 2000, -primary_tag=> 'test_feature')); $data->add_feature(Bio::Graphics::Feature->new(-seq_id => 'chr3', -start => 3, -end => 3000), 'test_feature'); my @f = $data->features('test_feature'); is scalar @f,3; # test FeatureBase my $bfg = 'Bio::Graphics::Feature'; $feature = $bfg->new(-seq_id=>'chr2',-start=>201,-end=>300,-strand=>1); is $feature->seq_id,'chr2'; is $feature->start,201; is $feature->end,300; is $feature->strand,1; # plus strand feature, plus strand ref sequence my $ref = $bfg->new(-seq_id=>'chr2',-start=>201,-end=>300,-strand=>1); $feature->refseq($ref); is $feature->start,1; is $feature->end,100; is $feature->strand,1; is $feature->abs_start,201; is $feature->abs_end,300; is $feature->abs_strand,1; # plus strand feature, minus strand ref sequence $ref = $bfg->new(-seq_id=>'chr2',-start=>201,-end=>300,-strand=>-1); $feature->refseq($ref); is $feature->start,100; # expect flipping so that start > end is $feature->end,1; is $feature->strand,-1; # minus strand feature, plus strand ref $feature = $bfg->new(-seq_id=>'chr2',-start=>201,-end=>300,-strand=>-1); $ref = $bfg->new(-seq_id=>'chr2',-start=>201,-end=>300,-strand=>1); $feature->refseq($ref); is $feature->start,1; is $feature->end,100; is $feature->strand,-1; # minus strand feature, minus strand ref $ref = $bfg->new(-seq_id=>'chr2',-start=>201,-end=>300,-strand=>-1); $feature->refseq($ref); is $feature->start,100; # expect flipping so that start > end is $feature->end,1; is $feature->strand,1; # test safety of callbacks is $data->safe,0; is ref $data->setting(SwissProt=>'fill'),''; is eval{ref $data->code_setting(SwissProt=>'fill')},undef; $data = Bio::Graphics::FeatureFile->new(-file => File::Spec->catfile($Bin,'data', 'feature_data.txt'), -safe => 1, ) or die; is $data->safe,1; is ref $data->setting(SwissProt=>'fill'),'CODE'; is eval{ref $data->code_setting(SwissProt=>'fill')},'CODE'; exit 0; sub do_write { my $test = shift; my $canpng = GD::Image->can('png'); my $cangif = GD::Image->can('gif'); my $test_sub = $test; if ($canpng) { my $output_file = File::Spec->catfile($Bin,'data',$test).'.png'; my $panel = eval "$test_sub()" or die "Couldn't run test: $@"; open OUT,">$output_file" or die "Couldn't open $output_file for writing: $!"; print OUT $panel->gd->png; close OUT; } if ($cangif) { my $output_file = File::Spec->catfile($Bin,'data',$test).'.gif'; my $panel = eval "$test_sub()" or die "Couldn't run test: $@"; open OUT,">$output_file" or die "Couldn't open $output_file for writing: $!"; print OUT $panel->gd->gif; close OUT; } } sub do_compare { my $test = shift; my $cangif = GD::Image->can('gif'); my @input_files = glob($images . ($cangif ? "/$test/*.gif" : "/$test/*.png")); my $test_sub = $test; my $panel = eval "$test_sub()" or die "Couldn't run test"; my $ok = 0; my $test_data = $cangif ? $panel->gd->gif : $panel->gd->png; foreach (@input_files) { my $gd = $cangif ? GD::Image->newFromGif($_) : GD::Image->newFromPng($_); my $reference_data = $cangif ? $gd->gif : $gd->png; if ($reference_data eq $test_data) { $ok++; last; } } ok($ok); } sub read_file { my $f = shift; open F,$f or die "Can't open $f: $!"; binmode(F); my $data = ''; while (read(F,$data,1024,length $data)) { 1 } close F; $data; } sub t1 { my $ftr = 'Bio::Graphics::Feature'; my $segment = $ftr->new(-start=>1,-end=>1000,-name=>'ZK154',-type=>'clone'); my $subseg1 = $ftr->new(-start=>1,-end=>500,-name=>'seg1',-type=>'gene'); my $subseg2 = $ftr->new(-start=>250,-end=>500,-name=>'seg2',-type=>'gene'); my $subseg3 = $ftr->new(-start=>250,-end=>500,-name=>'seg3',-type=>'gene'); my $subseg4 = $ftr->new(-start=>1,-end=>400,-name=>'seg4',-type=>'gene'); my $subseg5 = $ftr->new(-start=>400,-end=>800,-name=>'seg5',-type=>'gene'); my $subseg6 = $ftr->new(-start=>550,-end=>800,-name=>'seg6',-type=>'gene'); my $subseg7 = $ftr->new(-start=>550,-end=>800,-name=>'seg7',-type=>'gene'); my $subseg8 = $ftr->new(-segments=>[[100,200],[300,400],[420,800]],-name=>'seg8',-type=>'gene'); my $panel = Bio::Graphics::Panel->new( -grid => 1, -segment => $segment, -key_style => 'bottom'); $panel->add_track(segments=>[$subseg1,$subseg2,$subseg3,$subseg4, $subseg5,$subseg6,$subseg7,$subseg8], -bump => 1, -label => 1, -key => '+1 bumping'); $panel->add_track(segments=>[$subseg1,$subseg2,$subseg3,$subseg4, $subseg5,$subseg6,$subseg7,$subseg8], -bump => -1, -label => 1, -bgcolor => 'blue', -key => '-1 bumping'); $panel->add_track(segments=>[$subseg1,$subseg2,$subseg3,$subseg4, $subseg5,$subseg6,$subseg7,$subseg8], -bump => +2, -label => 1, -bgcolor => 'orange', -key => '+2 bumping'); $panel->add_track(segments=>[$subseg1,$subseg2,$subseg3,$subseg4, $subseg5,$subseg6,$subseg7,$subseg8], -bump => -2, -label => 1, -bgcolor => 'yellow', -key => '-2 bumping'); return $panel; } sub t2 { my $ftr = 'Bio::Graphics::Feature'; my $segment = $ftr->new(-start=>-100,-end=>1000,-name=>'ZK154',-type=>'clone'); my $zk154_1 = $ftr->new(-start=>-50,-end=>800,-name=>'ZK154.1',-type=>'gene'); my $zk154_2 = $ftr->new(-start=>380,-end=>500,-name=>'ZK154.2',-type=>'gene'); my $zk154_3 = $ftr->new(-start=>900,-end=>1200,-name=>'ZK154.3',-type=>'gene'); my $zed_27 = $ftr->new(-segments=>[[400,500],[550,600],[800,950]], -name=>'zed-27', -strand => 1, -subtype=>'exon',-type=>'transcript'); my $abc3 = $ftr->new(-segments=>[[100,200],[350,400],[500,550]], -name=>'abc53', -strand => -1, -subtype=>'exon',-type=>'transcript'); my $xyz4 = $ftr->new(-segments=>[[40,80],[100,120],[200,280],[300,320]], -name=>'xyz4', -subtype=>'predicted',-type=>'alignment'); my $m3 = $ftr->new(-segments=>[[20,40],[30,60],[90,270],[290,300]], -name=>'M3', -subtype=>'predicted',-type=>'alignment'); my $bigone = $ftr->new(-segments=>[[-200,-120],[90,270],[290,300]], -name=>'big one', -strand => 1, -subtype=>'predicted',-type=>'alignment'); my $fred_12 = $ftr->new(-segments=>[$xyz4,$zed_27], -type => 'group', -name =>'fred-12'); my $confirmed_exon1 = $ftr->new(-start=>1,-stop=>20, -type=>'exon', -desc=>'confirmed', -name => 'confirmed1', ); my $predicted_exon1 = $ftr->new(-start=>30,-stop=>50, -type=>'exon', -name=>'predicted1', -desc=>'predicted'); my $predicted_exon2 = $ftr->new(-start=>60,-stop=>100, -name=>'predicted2', -type=>'exon',-desc=>'predicted'); my $confirmed_exon3 = $ftr->new(-start=>150,-stop=>190, -type=>'exon',-desc=>'confirmed', -name=>'abc123'); my $partial_gene = $ftr->new(-segments=>[$confirmed_exon1,$predicted_exon1,$predicted_exon2,$confirmed_exon3], -name => 'partial gene', -type => 'transcript', -strand => 1, -desc => '(from a big annotation pipeline)' ); my @segments = $partial_gene->segments; my $score = 10; foreach (@segments) { $_->score($score); $score += 10; } my $panel = Bio::Graphics::Panel->new( -gridcolor => 'lightcyan', -grid => 1, -segment => $segment, -spacing => 15, -width => 600, -pad_top => 20, -pad_bottom => 20, -pad_left => 20, -pad_right=> 20, -key_style => 'between', -empty_tracks => 'suppress', ); my @colors = $panel->color_names(); my $t = $panel->add_track( transcript2 => [$abc3,$zed_27], -label => 1, -bump => 1, -key => 'Prophecies', ); $t->configure(-bump=>1); $panel->add_track($segment, -glyph => 'arrow', -label => 'base pairs', -double => 1, -bump => 0, -height => 10, -arrowstyle=>'regular', -linewidth=>1, -tick => 2, ); $panel->unshift_track(generic => [$segment,$zk154_1,$zk154_2,$zk154_3,[$xyz4,$zed_27]], -label => sub { my $feature = shift; $feature->sub_SeqFeature>0}, -bgcolor => sub { shift->primary_tag eq 'predicted' ? 'olive' : 'red'}, -connector => sub { my $feature = shift; my $type = $feature->primary_tag; $type eq 'group' ? 'dashed' : $type eq 'transcript' ? 'hat' : $type eq 'alignment' ? 'solid' : undef}, -all_callbacks => 1, -connector_color => 'black', -height => 10, -bump => 1, -linewidth=>2, -key => 'Signs', -empty_tracks => 'suppress', ); my $track = $panel->add_track(-glyph=> sub { shift->primary_tag =~ /transcript|alignment/ ? 'transcript2': 'generic'}, -label => sub { $_[-1]->level == 0 } , -connector => sub { return shift->type eq 'group' ? 'dashed' : 'hat'}, -point => 0, -orient => 'N', -height => 8, -base => 1, -relative_coords => 1, -tick => 2, -all_callbacks => 1, -bgcolor => 'red', -key => 'Dynamically Added'); $track->add_feature($bigone,$zed_27,$abc3); $track->add_group($predicted_exon1,$predicted_exon2,$confirmed_exon3); $panel->add_track( [$abc3,$zed_27,$partial_gene], -bgcolor => sub { shift->source_tag eq 'predicted' ? 'green' : 'blue'}, -glyph => 'transcript', -label => sub { shift->sub_SeqFeature > 0 }, -description => sub { my $feature = shift; return 1 if $feature->primary_tag eq 'transcript'; return '*' if $feature->source_tag eq 'predicted'; return; }, -font2color => 'red', -bump => +1, -key => 'Portents', ); $panel->add_track(segments => [$segment,$zk154_1,[$zk154_2,$xyz4]], -label => 1, -bgcolor => sub { shift->primary_tag eq 'predicted' ? 'green' : 'blue'}, -connector => sub { my $primary_tag = shift->primary_tag; $primary_tag eq 'transcript' ? 'hat' : $primary_tag eq 'alignment' ? 'solid' : undef}, -connector_color => 'black', -height => 10, -bump => 1, -key => 'Signals', ); $panel->add_track(generic => [], -key => 'Empty'); $panel->add_track(graded_segments => $partial_gene, -bgcolor =>'blue', -vary_fg => 1, -label => 1, -key => 'Scored thing'); $panel->add_track(diamond => [$segment,$zk154_1,$zk154_2,$zk154_3,$xyz4,$zed_27], -bgcolor =>'blue', -label => 1, -key => 'pointy thing'); return $panel; } sub t3 { my $data = Bio::Graphics::FeatureFile->new(-file => File::Spec->catfile($Bin,'data','feature_data.txt') ) or die; my ($tracks,$panel) = $data->render; return $panel; } Bio-Graphics-2.39/t/Wiggle.t000555001750001750 220112366325116 15703 0ustar00lsteinlstein000000000000#-*-Perl-*- # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.t' use strict; use ExtUtils::MakeMaker; use File::Temp qw(tempfile); use FindBin '$Bin'; use constant TEST_COUNT => 11; use lib "$Bin/../lib","$Bin/../blib/lib","$Bin/../blib/arch"; use Test::More tests => TEST_COUNT; use File::Temp 'tempdir'; use Bio::Graphics::Wiggle::Loader; my $source = "$Bin/data/wig_data.wig"; my $tmpdir = tempdir(CLEANUP=>1); my $loader = Bio::Graphics::Wiggle::Loader->new($tmpdir,'mywibfile'); ok($loader); my $fh = IO::File->new($source); ok($loader->load($fh)); my $gff3 = $loader->featurefile('gff3'); undef $loader; # force a flush ok($gff3); my ($wibfile) = $gff3 =~ m!wigfile=(.+\.wib)!; ok($wibfile); ok($wibfile =~ /mywibfile/); my $wig = Bio::Graphics::Wiggle->new($wibfile); ok($wig); is($wig->seqid,'I'); ok(abs($wig->values(87=>87)->[0]-0.22) < 0.01); ok(abs($wig->values(173=>173)->[0]-0.52) < 0.01); my $h = $wig->values(101=>300); is(@$h,200); my $result = $wig->export_to_bedgraph(1,5000); my @lines = split "\n",$result; is(@lines,57); exit 0; Bio-Graphics-2.39/t/decorated_transcript_t1.pl000444001750001750 750112366325116 21451 0ustar00lsteinlstein000000000000#!/usr/bin/perl use strict; use warnings; use Bio::Graphics; use Bio::Graphics::Panel; use Bio::Graphics::Glyph::decorated_transcript; use Bio::DB::SeqFeature::Store; use Bio::SeqFeature::Generic; use Data::Dumper; # load features my $store = Bio::DB::SeqFeature::Store->new ( -adaptor => 'memory', -dsn => 'data/decorated_transcript_t1.gff' ); my ($gene1) = $store->features(-name => 'PFA0680c'); #print Dumper($rna1); # draw panel my $panel = Bio::Graphics::Panel->new ( -length => $gene1->end-$gene1->start+102, -offset => $gene1->start-100, -key_style => 'between', -width => 1024, -pad_left => 100 ); # ruler $panel->add_track ( Bio::SeqFeature::Generic->new(-start => $gene1->start-100, -end => $gene1->end), -glyph => 'arrow', -bump => 0, -double => 1, -tick => 2 ); $panel->add_track ( $gene1, -glyph => 'decorated_gene', -label_transcripts => 1, -description => 'Signal peptide spans intron, isoform1 has extra callback decoration, isoform2 lacks TM domain', -label => 1, -height => 12, -decoration_visible => sub { my ($feature, $option_name, $part_no, $total_parts, $glyph) = @_; return 0 if ($glyph->active_decoration->name eq "TM" and $glyph->active_decoration->score < 8); }, -decoration_color => sub { my ($feature, $option_name, $part_no, $total_parts, $glyph) = @_; return 'black' if ($glyph->active_decoration->name eq "TM"); return 'red' if ($glyph->active_decoration->name eq "VTS"); }, -decoration_label_color => sub { my ($feature, $option_name, $part_no, $total_parts, $glyph) = @_; return 'white' if ($glyph->active_decoration->name eq "VTS"); }, -additional_decorations => sub { my $feature = shift; my ($id) = $feature->get_tag_values('load_id'); my %add_h = ( "rna_PFA0680c-1" => "test:callback:100:130:0" ); return $add_h{$id}; } ); # decoration outside transcript boundaries, transparent background my ($gene2) = $store->features(-name => 'test1'); { $panel->add_track ( $gene2, -glyph => 'decorated_gene', -description => sub { "Gene label and description do not bump with extended decoration boundaries" }, -label => 1, -label_position => 'top', -height => 12, -decoration_visible => 1, -decoration_border => "dashed", -decoration_color => "transparent", -decoration_label_position => "above", -decoration_label => 1, -decoration_height => 17, -decoration_border_color => "blue" ); } # use of decorated_transcript glyph directly, with mRNA feature { my ($rna2) = $gene2->get_SeqFeatures('mRNA'); $panel->add_track ( $rna2, -glyph => 'decorated_transcript', -description => sub { "This text should not bump with decoration label" }, -label => 1, -label_position => 'top', -height => 16, -decoration_visible => 1, -decoration_border => "solid", -decoration_color => "yellow", -decoration_label_position => sub { return "below" if ($_[4]->active_decoration->type eq "method1"); return "inside"; }, -decoration_label => sub { return "another interesting region" if ($_[4]->active_decoration->type eq "method1"); return 1; # return 1 to draw default label }, -decoration_height => 20, -decoration_border_color => "red" ); } # gene with UTR { my ($gene) = $store->features(-name => 'PVX_000640'); $panel->add_track ( $gene, -glyph => 'decorated_gene', -description => 1, -label => 1, -height => 12, -decoration_color => "yellow", -label_position => 'top', -decoration_visible => 1, ); } # write image my $imgfile = "data/decorated_transcript_t1.png"; open(IMG,">$imgfile") or die "could not write to file $imgfile"; print IMG $panel->png; close(IMG); print "Image written to $imgfile\n"; Bio-Graphics-2.39/t/data000755001750001750 012366325116 15056 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/t/data/t1.png000444001750001750 1405312366325116 16270 0ustar00lsteinlstein000000000000‰PNG  IHDRXºÒ4ÒgXPLTEÿúÍzÿôÿ.‹WÿÿeõÞ³ÜÜÜÿ ÿî‚îK‚ÿÌ R-úšÿ<³q/OOÿGÿôÿ2ÿ zÿQ£ÿÿÁÿ™ÿÿÍðÿðŽÿÞ¸‡úúÒÿ=(ÿ¸† ÿðøÿH=‹ðæŒÿé–zøøÿÿäá=ÿÿõîÿÿÒiúðæÿÿÚ¹ÿ€€½·kºUÓÿúð¼Ò´Œ­ÿ/ÿÞ­|üÀÀÀp€ÿ(€€€ÿà‹E‹‹ÿøÜ"‹"ÿÿ€ð€€Ìÿ·ÿÿEÿÿææúF‚´õõõõõÜÿÀËd•íiiieÿÿ¶ÁÿŒ€€€ú€rÿ„€ÿcGfͪÿïÕÿpÿÿðÿúúŠ+âÿŽ„ÿ_ž ÿ·ÿpÛ­ØæQÿkŽ#jZ͇Îúô¤`Ç…Uk/Ü<ÿi´õÿúÿêÿÿëͯîî2ÿpÿ[ÿÿÿÿÿ×HÑÌ@àÐwˆ™àÿÿ[àÿÿ ÿðÿÿ¿ÿÿ£2Í2™ÿdÿ¥šÍ2ÿz¥**ÓÓÓ€€¼‹‹Aiáÿÿ‹Í…?°àæ­ÿÛp€€Ý ÝÁÿÖÿ©©©îèªýõæ€ÿäÄÿÿÿÿÖÿÔÿÿà°ÄÞ”Óÿÿ䵨¿Øúë×ÿ­ÿP‹îÚ¥ ÿp‡Îë˜û˜ÎÑ™2ÌGÿÿê²"" ²ªÍ\\{hîÚpÖÿðõÿÿÿàÿÿÓÓÓ@àÐÿÿ¥ÿÿõÞ³«@ߦ pHYsÄÄ•+yIDATxœív£8EùÿŸJZ3³ù­í˜Ž‘Ì– ½×ºïìpÒ,nƒBTaùøÎç[Û_°°¯ØÅ±hX}¶,VÒ.Ú†M)ÙÕ܉ÍÅJ¿ÿ‡Xíìï1Ln5÷ë÷?«Ï§mâŒõû}zzÚ&ýšãØåöñÓÓ–Ká;l>Ži•L¸æP±Ö _ºb5°é6r›qÜŽ¤hÍqìò½½]þn/­DÄz}\þî—‰Åzüëºë…Xo°qüØl'«0y_'ºEk²Ùäýsò9Öæ¥Ÿ9–xÑòl>OÕ¯9T¬Ÿ9–xÑúìæ\eSs_viaa_±K"õ9Êѵ½Ê0±þ!µ9ktuå –A ±B‚XˆÄB¬ b…±ÎˆEês(–hF‰Õþb ±`}XÄ‚½R¬ª5–øBv;{Õ(Öºr[ºh 6m¶.5÷+íW~¯°•.Z“M…µ£3¯ -´-q)|ƒÍÇqr±òö/Äz‹ÍÚ¿Í)²5DZË÷v×þu¿a«Z´*»kÿš\¬Rûg¬ólÞþÅïnØOÞë6Ÿ¼O.Öæ%Ú¿ú°´ÑþÃ&Ú¿‹†Õgç[5У?׫ kôÇ‹'ÖèOVb]ÄB¬ b…±+$ˆ…X!A¬«Äš-ab‰f”X-0,ì+±` Ö‡E,X±Òþ§úrö¶§X©°IîÃ^Ã6‰•JÏ»B,ØF± O\ aW¶E¬_‡Ï»ýÀ°×°Mb>ïJôÃ^öˆuü¼+Ñ { Û"V>ygŽÛC¬Í×õç*ãÁ‚­g{‰U®2,Øz¶›X°°[¶E¬Që„z½oÛ~\â(Ö •½ÞWtÍgß b…d>±Òë}[öã’ùÄÿ¾ˆ…Xˆõn ±Bb)Ö oƒ{½oÛ~\b(–å;ØkXÄ‚E,X±`ç+=VOXôl¬‡XÏ«é-z6VT¬TZ•ŠXF¬¦X,bÁ"V»Îʽj6`g+==šÀ£f v:±RéÑâ5;²³‰•7–å+TÕj¶dgë×ac™hÍŽìtb6–ÉÖìÇÎ&Öqc™fÍ–ìlbå“÷¼YC®fGv:±6_ן«tj¶ag«þ\%T³ ;µX°qìlb]¾„kx£éĽ õê b…±+$ˆ…X!A,Ä b!VHë"±¦Ë c4›X°ˆëÌ",bÁú°ˆ‹X°>,bÁ"¬‹Xë]D¯š ØÙŢűú°‰ûKØÙĢűbXZì¯a§‹ûkØÙĢűbØlòN‹=bufi±G¬¶ú\%T³ ;µX°qìlb]¾ä|x£éÄúw² b…±+$ˆ…X!A,Ä b!VHë"±¦Ë c4›X°ˆëÌ"ìÜb¥ÇŒ-z6ÖC¬ç•é–=+*V*-ÄC,#VS¬R —B+VS¬ÏÃ^Ëžë°—Ær gc5Å:èÙXM± “wn7x±¢bm¶y/å@ÏÆê‹•÷ÒXôl¬X°Ž¬¦XCÖ—TDq¬DYQ±F/+±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:ĪgEÅâX‰²šbÁÚ³ˆ‹X°>¬X‰e3V¬‡Xt騱¢b%ºtÌYM±ŠÏºáRèÄjŠUêÒIW¼/l/VT¬¼K'`GÕ û`5Å*wé ,ØzVS¬|ò¾^z6VT¬Í–.KV_,ºt,Y±`YM±¬ˆ©ŠâX‰²¢b^ÒWbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏŠŠ%űe5Å‚µg ±`}ØÎb¥ýŒå>0ì5lO±Ra‰‹Ü†½†m+eËñ> öƶˆUè¥áR»²-býÊzi8cÁö+ë¥A,Øb?ñFôÃ^öˆ•OÞ™cÁökóuý¹Êx°`ëÙ^bÕŸ«Œ ¶ží&,ì–mkÔ”^ïÛ¶—8Š5hÑ\¯÷]NØ7ˆ…X!™O¬†ôzß–ý¸d>±Æ¿/b!b½ÄB¬XŠ5èÛà^ïÛ¶—Šeyãö±` Ö‡}!V’.Ú„]§8^5е.7–.Ú‚M›­KÍ}ÅJ7ž¶œ±Þ`SaÁã¼iY ½6‰Ká,ÏÿÙ‰õq›¬óÄj`yþÏ–]¾·é>·Káý¾šjѪìþù?s‹õ8yo‚3Öi6ïYšúÁRKiòŽXï°ùä}r±6/­ÿêä‹–gyþÏþ>Vª»ƒeü¯aÓ¾gÉ æ¾ìÒþb—kÖn%j G®W&Öè•h'N¬ÑŸ¬ĺ(ˆ…X!A,Ä b!VH ±B‚XW‰5[ÂÄÍ(±Z`XØW,bÁ"¬[‹ß|܇Mté<¶éÏbeá¢-Ø4ýz¬´_è—8c½Ã¦Ò“…ÄkŽcK]:\ ßa ÝNé±*K³æP±ò.Äz‹=|²hÍqìò½Ýué Ö›ìÁ“…dkŽbË]:ˆuž=~²fÍ¡b&ï?? P-Z“Í&ϱ6/Ñ¥Ó‡¥K‡.6Ñ¥ãX4¬>;ß²™– åèÚ^e˜X£W¢åX¬ÑÕ•ƒXA,Ä b!VH ±B‚XˆÄ:#©Ï¡X¢%V ûŠE,XÄ‚õa ±`}XÄ‚E,X¶,kÞa»‹E'4l±аbÑ À.tBÃF°Ë÷–NhØþbÑ À.tBÃF°ËÓKtBÃvbŸÅ¢¶»´À°°¯X–&Ÿ‰áÅ.é?RĪgëD«žE¬A¬z±N±êYÄ:ĪgëD«žåvÙàQìâX4¬>‹X°ˆëÃ"ì•bU­q°üÀ°×°¹Xë3¬¤‹†Õg— Òï•ÊÒEÃê³¥ö¯Ä¥¶•] í_ˆÛÌ.ßÛ]û×ý&³jѰúl¹ý‹3lÄä±`[Ùåé%Ú¿`;±ÏbÑþÛ‰]Z`XØWì|ë± ’#;Ý Rĺ†E,ƒƒäÈ"–ÁArdËà 9²ˆepYÄ28HŽ,· ’#»8 «Ï",bÁú°ˆë Ömr,ýa¯a{Š•x\ l±ÖóÓf‹X°ÄÊǸÂvëWZ»¦SÚé¥üa¯a›ÄZǺ¾Â¥v˶ˆõ8K}l¶ˆÛ}òÎ ¶‡X›¯ëÏUƃ[Ïö«þ\eÓ vTͰVS¬rcÙðÁ‚­g5ÅÊ'ïëeÑx gcEÅÚlóÆ2ËžÕ+o,³èÙX±`YM±,[ªŠâX‰²¢b^wYbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏŠŠ%űe5Å‚µg ±`}XÄ‚[¬Dû—ë!í_v¬¨X‰ö/sVS¬Rû—B+VS¬Rûg,+VT¬¼ý뱬XM±ŽŸ+f9г±šb&ïÜnðbEÅÚliÿ²dõÅ¢ýË’5 Ö‘ÕkÈb«Š(Ž•(+*Öèµ¢å V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ¬¨X¢Q+QVS,X{±` Ö‡E,XÄ a×Y¹WÍììb¥§GxÔlÁN'V*=š@¼fGv6±òƲ|…ªZÍ–ìlbý:l,­Ù‘N¬ÃÆ2ÙšýØÙÄ:n,Ó¬Ù’M¬|òž7kÈÕìÈN'Öæëús•NÍ6ìÌbÕŸ«„jva§ 6ŽM¬Ë—p Ï c4X£W¡^ÄB¬ b…±+$ˆ…X!A,Ä b]$ÖttŒf ±`YÄ‚E,X±"Ù”¦ýÝôˆÅþV*½Ë:~^ÄŠbSÖX¦_s‹X½ØBcYšøiˆÕÍ˦~þbudweˆåV´$ËË+†Í&ïS?± ±"XžX†X1lšþ‰eˆ‹XÒ쀥VU4VˆÕM¬ÑkEËA,w± ±ˇE,ÄB,Äòa ±bÄÍ ±B,XÄ‚õa ±`}XÄŠc×¹³W͈%Ï>?LÅ£fÄRdSaí(+H­Š–d‹OC,«¢5ÙÂsÅ’zÍq,bud³çŠ!–WÑ’lÞþÅïnp+Z“Í'ïˆeV´y_/‹Æ=+*ÖfKû—%«/í_–¬X°Ž¬¦X–ZUEq¬DYQ±F¯-±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:ĪgEÅâX‰²šbÁÚ³ˆ‹X°>,bÁ:ˆ•ö+ä>0ì5lO±Raí”܆½†m+eë±Æ¿/b!b½ÄB¬XŠ5èÛà^ïÛ¶—Šeyãö±` Ö‡E,Ø+ÅJÒEÃê³¹Xë:vé¢aõÙåö]÷çnË ¶Y¬¼‰+q)„me—ï³Ôï?¬÷Ò ¶»|oÓý¡m·Káý†­jѰúìöR¸y& g,Ø€É;bÁ¶²ËÓKëÙK¾hX}öY¬ûK»hX}viaa_±Ëˆ%BCcxÙeŠe”› Ö5,b$G± ’#‹XÉ‘E,ƒƒäÈ"–ÁArd¹Ý`pÙűhX}±` Ö‡E,Ø ÅâwµÃv+ýY/\4¬>»V&ÎX°­l©ý‹K!l3»Ú¿ ¶™]¾·»ö/Ä‚mfËí_ˆ1yÿù‘šjѰúìòôí_°Øg±hÿ‚íÄ.-0,ì+v¾õX-1<À£ØéV¶±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:Īg¹Ýp&†x»8 «Ï",bÁú°ˆ‹X°>ìòEH@‹„±HH‹„±HH‹„±HH‹„dIéëë÷ëOï¿þü‰Æ,Ï6Ý¿Ä.Ò”Ûz¬¯‡H÷?biÉòÇ ´3 ¯HS–½HEzd)D,Ò%Ëþ[ÁÍ,ž·³»Ýðc“wÒ–W7HñŠ4…;ï$$ˆEB‚X$$±Rá«}Þ›xÅíùkó=†Õ¾ÿþ|‹µ¿Õ^;X•ÿ¿ =§Í½÷½Ýľ'ÈXéé¼r»ñóUúyåÏæçëZ¯‚ö¼?è}«Žß÷_žåñSÂûkë þè–ž†õùoë±çtÿ¡fTÕÁûþÛs¿îfB»aüúÚýW3Œe;íùQoľcëž$ïŠuæÄ³ççóUÿªC÷ý÷§ø]áÏ©=Oü_?ƒ\›+öìµï ò#VÚütð11Ýü+]_y gýä=lϾûž u7Hóë5£ˆÛ³ï¾ÿм+V¯Ÿq{öÝ÷_~¤CBòÎ/·ýaÿöÕßϽïi²üs:A<üÛßÿïé¤Cv»ïÿN'²Û}¿ñ‹ºYÄB¬Ûß#V{Þëž±î ëž±îA¬5œ±úˆuÈ"bÝþ±ÚƒXˆn7\»ïi RÄ"!A,Ä"!A,Ä"!A,’ÿÂ"7¡Ñb£ÒIEND®B`‚Bio-Graphics-2.39/t/data/t3.png000444001750001750 1153412366325116 16273 0ustar00lsteinlstein000000000000‰PNG  IHDRî4DŽF,UPLTEÿúÍzÿôÿ.‹WÿÿeõÞ³ÜÜÜÿ ÿî‚îK‚ÿÌ R-úšÿ<³q/OOÿGÿôÿ2ÿ zÿQ£ÿÿÁÿ™ÿÿÍðÿðŽÿÞ¸‡úúÒÿ=(ÿ¸† ÿðøÿH=‹ðæŒÿé–zøøÿÿäá=ÿÿõîÿÿÒiúðæÿÿÚ¹ÿ€€½·kºUÓÿúð¼Ò´Œ­ÿ/ÿÞ­|üÀÀÀp€ÿ(€€€ÿà‹E‹‹ÿøÜ"‹"ÿÿ€ð€€Ìÿ·ÿÿEÿÿææúF‚´õõõõõÜÿÀËd•íiiieÿÿ¶ÁÿŒ€€€ú€rÿ„€ÿcGfͪÿïÕÿpÿÿðÿúúŠ+âÿŽ„ÿ_ž ÿ·ÿpÛ­ØæQÿkŽ#jZ͇Îúô¤`Ç…Uk/Ü<ÿi´õÿúÿêÿÿëͯîî2ÿpÿ[ÿÿÿÿÿ×HÑÌ@àÐwˆ™àÿÿ[àÿÿ ÿðÿÿ¿ÿÿ£2Í2™ÿdÿ¥šÍ2ÿz¥**ÓÓÓ€€¼‹‹Aiáÿÿ‹Í…?°àæ­ÿÛp€€Ý ÝÁÿÖÿ©©©îèªýõæ€ÿäÄÿÿÿÿÖÿÔÿÿà°ÄÞ”Óÿÿ䵨¿Øúë×ÿ­ÿP‹îÚ¥ ÿp‡Îë˜û˜ÎÑ™2ÌGÿÿê²"" ²ªÍ\\{hîÚpÖÿðõÿÿÿÿÿÿîÿÿÿ€ÿ~qÛ pHYsÄÄ•+­IDATxœí ¢£*@ÝËßÿÀ®ß½®®DËdœî9UÉ‹ˆxBÀq0jžÎÀ},ën­½)Ÿuðƒá£tÝ#t‡ž>ÕEz“îGÊ–¹&ß½ÿ~Þ­›²!ÐfË£DáåçY™ˆ-­ÖÔ’XEYwßäû·ráw LÅ?qàæ?K©ó²üÓPÓÝ·žaJ6Èr*ZÎÿÉ¢ˆTd”(±$•x^髇밅zë>¸©¨"=N—+FóâÄLjn1fí—áa=a¨wÁ+-ªI…ÛÕ™™¢¿;Ƥßü«GgvâwD–†œ®O“9ã®Mº\ìr8G5išÑœl9™—òÚ–ü§ŸÞ<Ô”Ò‚Ãi ¿£xjJiÁá,¶èÐ8èŠX¥»ßh rÞ{rYÆÎgîÓk:–?±ÓÚcƒîóû´#P„´Â†ÎŒ”žÎ ´ÈæÖ=LƒîÐèŠØ5TEwh“Í;"¸¼ÂrÀš‚ÃL tE ;(b•îã—xú¢ü\˜tq];ÖvKG˜Î#lK*_"ÛšdžÍ«¨`#ëtÿÏ_Æhú2ݯKº´®=kïÈá7o"cšÕõ™÷I–ˆSÉV²œä˜gó*ÆZ6‚î;Cwt?tw+A÷l…è~p]èŽîå•ÉñN´ÖåU]”tq]œD0r@— ;(ÝAèŠ@wPºƒ"Ðî tE ;(âûä=n–<ÿ‘»„AO Þìú€NºžÒ }3ˆî‹Awè›AxnrÝé»CO$­{þ x€~–:,è}áZ÷"è}Áa&Pºƒ"èîz:â)MQ¿(<ÉÉÇ£w´™° !LÊz ;LS.^Ý<òYr¶Îúµ<,ÁqÝC=‹'ò™¹ã/CP}ñ£=mTÅF<¸\ÖrE·|óÈçž§)ïËäšµ<È.ݧYã<é§?â1òbÆÒ˜ ¤µlÃäwvx’¹I4²Ùâ¾êãÍ“yerÅZ–àîî‡ÔFM~Þú?þån YË^no•÷,Ó]l›'¿!¹î{Dܺ–‡%8¢»hD"ÛÝ¡ª- ëÈkY¶ôó@S2Ȧ‹ûÀäG÷´ÖýⵜÆ^Ýmö•6&ªçÒ,ºo!¯e©¸lÂkºûÅ}àºß°–ÓØ¥»/aøÕn[S¦ÚÒfEòZ–­ûGVk\ËÙâ6ŠoÃâG6Ï=k9‹}ºQ"Ñsñ{¢BKäÏÁ1.&l ©åYY›ò74«åt#…w÷8mž{Ör {uGÜ;8XË÷l¤–TØ×w§™¾ƒµ|ÏFjL…Ý€öØ¥ûŸ¿œ‘ë“n?ÏÉc˜J„­kÙ›Õ-«9–Î>Ýÿý÷2ݯKº5þVÅ¿jcZ<çOãOw›î{ÜÆŸ“Ö±[÷«@wÇUºËºv!q„OkºöUNù-žÕýØjŸHº5hÝ «yD÷?ôݯgn×.ž“Ç ïÐ!èŠ@wPºƒ"ŽèîNü W(ÆW"†Ï\¦ ¯àÝý»Ï²ÅÐ þÍÉãÉ^Ƽ¢ÑÛ­{ñ Åé=ú¦Ëe âæ.û×0½Ì‚CÕ—QúÂÚW|¯áD¢æÎ¿ÅW÷¤»?ZòNiÙÕŠæ W(ÂÙ$ͰŠr¨ú’Fo·î諜¤ë])þÊ˲?ìì»?žox˜6Øß™½4ÛÜíÓóÝ¡IvêÎÕLª¹újŽËØ­ûU {ü¹øZ½Ë u‡íhÓ¾»j”éºQÖwhtE ;(ÝAèŠ@wPºƒ"Ðî ˆÁ†«QÜ%(ÓE·î1‘bž1­žç ða°áâ*ë/.Ÿ•Ïç¡;´ŒÔ]þIu7´îÐ>CxÒõ›ôiü=B @³ˆÖÝFí¹˜ò!´îÐ6µ¾;ºC‡Tug¨ ýát7¢·ÎŽHè3"Ðî tE •Gˆ$7'¶ùÜ5<>°½°pr[æ•U?Tœ[Ÿgkg®NãºÂ½àfåïæ•Uït·òÜÓ“•Ä äõæ¹óšå“öÒ{xÛç}¸®p.u¨ðʪ÷º[§gÈ’xYY€Ðjû$…ƒ™:+ ÷|é^Í¥^èÌøg¦w¬)Î’[2W)„ǧ‘=.D×…{7WVýÁÖÝdïÅlEs]9âð8qaá/Û˹ҫ³u/üèØdn¹0-è~Já/ÚÛ¹¶êOÑ=RX’8âø6ÀÊ™Oï›éºpïæºª?´#ò¾gï§ë½›Ëªþ˜î}kéºpïæªª?¨;@K 6#‰Qø¢M;ˆV~ké.Æ>«kœ—îWqå‚KiÎýÉ0öJS+ŽûþåìØÊl“ÏKòµªè>!¤X#¶’P´E«µ´TõÆ/~7ÃS¢1°/S\“ŸXö¿ËùͶHiåKÍyøþ=^#6+ÞRqE>“OYš“îÓòþ³HÍÚHr?b «ÙÉùP—v2/½E_±…Ï{³}ˆM#ȬÎ3­McÏiT¶R½êÝÖýµñ.`A÷xSGâ~ÊXѽØðc”gÎUëëxkJÉ-‘·ˆ…ìæi~›÷I÷Ù™š-þuú,å̺Ýsqèœv:/Úï‘|\ÐÝíìp!6Ó]f5ÕÝŠål½YZÐÝÝov¾¦{±Y-SÖº¯j»Óäò%¢Ö½Z•ë×Q­ó¸¸?v,F3êžwc mý’îÆÖuæe«›3»TtëíÔ[÷¨ïõ«uŸ«c}ÕG­û½¾—t_ØðÓ,©ûvÍKi†þC¾¥]­s¹q×åßwWý¦¶!wÖ†ÔÒÅ ½ÁÔ礰ݳyµ”Í~òê´UÝ“¯ëÝ [imgæVß ºÿZÿ÷·è«û¹ã ëó °;Íj7îºLúMmÃF ½°ò2yXM…Òì¨Ë æ-þUeK³Pì»g9ý¡{–™ßºo)7³j| ¹³`—2Îÿ¦BNÅûú?}6ógBBLxY÷IX3¿[kB»o?q_ÌB’L¢»‘~tÔÝ©<…;ÙG#_QLx;·ÍîóI·Ü’&¯;Ý¥èÞôoIC1SÝ{É4„-¾uæNâ«b\ëþeÞ3#›¼.uE Ý[]w÷§)ê^èÌl¼å^¢{Ÿ­»+V•/è>Ò™yRÙd¨*†žk†ª&,ëYÑ¡0a*‡ªÓ¬2ËÎPµeÊ;1¿h9Ì„¾Š¨Ÿm©Bwk˜P¡;4‡<ûÞVNž_u9C ºÃ±âÒ']À%¯ºú}±ZºÃ‘ºÇw’ Ÿlõ^:èMtŸv®—t§u‡Nˆtnœ†îТ3cÐ:'ÖÎ t ºƒ"Ðî tEÈS 'ìÝAèŠ@wPºƒ"ÐÞÈ8n»me\t‡w²ízË_±çùèï$Üè-¹Ã¡¸9Jøìn WŽïSCwx'îîî¾)£¿AÐhÂÝüg¡|!þtÓ¸‘Ö^Џߑ¿Ã¡»œS<Üä1Ü.ŽïÆó ÝáDwÄJîg(ïu—ëžÞÝV¤†îðN’À%gºÇ÷BSÝ¿átfà­Dq‹Ïô6üþ 0Ö㻪‚èÌ€"Ðtî tE ;(ÝAèŠ@wPºƒ"Ðî tE ;("Ó½úV€æŒ¿íäDAw›D©Fx7Ãt#ÕÅ8å(èÍ1ø; »×üì§ù‰g!Ü7òâ^Ãf`;C¬´x³6ñ<¤u‡öøU…ÄÆµîÆ”'ÐÚ%èî»*ÓŒDî<Ý¡9Ùa©vf¾QsÝ1ÚÂÓñÐ#‡ªF¶û~8ûP¦öÁQUPºƒ"Ðî ˆÎuŽ»!¶Mán:Ä“¨N@sô®û÷eÅçiÒÚ,<û,‚ ”éÚõ>„øn7¬Ü%kÜA Ž74‹Ý'qeÈ,uèÞÄñÝwÀ-fåËÒä·Jïº'¢ß_·¢Q·Õø^÷p0®ÔáFè]÷â»ë¾—;3EÝÅ|toeºÛ‚îéP5×Ý¢{'èÐ]숌¤ÏwDŠ÷p©‹ÿ,R€é\w ºƒ"úÖýŸžÎF^\ëègóÏ{«ÝátÞë;ºÃù¼Öwt‡ x«ïèWðRß{מãé­_Ýá*žÞúz×ýéhå¶£;\ÁKmGw¸€·ÚŽîp>¯µÝátÞk;ºÃ鼸ÖûÖ ÝAèŠ@wPDçºg‹‰Â²iÐYù‚gè]÷Ÿsë1 sѽqTè>šo;ým­ÿ¾Ætî÷55壈9--»ôSï§wÝâf ú ß] ¿¢w±,­{ëô®{òžè>;ìum¼ñ_±,º·ŽvÝEȘ,’/‹î­£Z÷8¤Ô™ÉuÇø–Q¤»€âü“÷|Y××Vé\w ºƒ"Ðî tE ;(ÝAèŠ@wPºƒ"Ðî tETtŸ ÐÃüõ”ßºó…€æ>ÖÌEwèTw×Ö»÷yöwÒMÉ? 1H{'­gµç·o œç¢ ;4Ç0[땞mßœKÝ£oºCs ±µ~*8od³¦ÐÚ£ {¡3Sø#¾è.‡£V UM>žyhŽª‚"6êþ¿À5ù¸Ýº_“€+ÙÚ™Awh˜½º_’EØùõýÌ ÿ.6UÑýän\©>\ÊNݯȊ*¬ûgÑýF¶ïˆD÷3²£ûm û3LЇó•žÍvfÂöˆt§m¿ t†Xw|¿‰='`ûqÝñýÐÁ)b t¿N³{t¿lt¿t t¿lŒºGûÏ80¸tŠ#ºsRßN°ý)µîœÔ·tˆãºsRßvÐý!÷Ý9¾ltt†Ótç,ÖM`û#œ¤;;"7‚îpâa&|‡·ÃQUPÄ>Ý9©šä¨î'gàJvvfÐZä îçfàZöUÑä˜î§fàjvïˆDwhtEì?Ì„íÐèŠ8p¶Ck ;(‚SÄ@èŠ@wPºƒ"þ¡~íËÖw‡ÇIEND®B`‚Bio-Graphics-2.39/t/data/decorated_transcript_t1.gff000444001750001750 366312366325116 22516 0ustar00lsteinlstein000000000000##gff-version 3 ##feature-ontology so.obo ##attribute-ontology gff3_attributes.obo ##sequence-region MAL1 1 643292 MAL1 PlasmoDB_70 supercontig 1 643292 . + . ID=MAL1;Name=MAL1;size=643292;molecule_type=dsDNA;organism_name=Plasmodium falciparum MAL1 PlasmoDB_70 gene 549319 550102 . - . ID=PFA0680c;Name=PFA0680c;Note=Pfmc-2TM+Maurer%27s+cleft+two+transmembrane+protein MAL1 PlasmoDB_70 mRNA 549319 550102 . - . ID=rna_PFA0680c-1;Name=isoform1;protein_decorations=TMHMM:TM:157:179:5,TMHMM:TM:184:203:10,SignalP4:SP:1:25:0.444,exportpred:VTS:42:48:7.50725;Parent=PFA0680c MAL1 PlasmoDB_70 CDS 550034 550102 . - 0 ID=cds_PFA0680c-1-1;Name=cds_PFA0680c-1-1;Parent=rna_PFA0680c-1 MAL1 PlasmoDB_70 CDS 549319 549939 . - 0 ID=cds_PFA0680c-1-2;Name=cds_PFA0680c-2-2;Parent=rna_PFA0680c-1 MAL1 PlasmoDB_70 mRNA 549500 550102 . - . ID=rna_PFA0680c-2;Name=isoform2;protein_decorations=SignalP4:SP:1:25:0.444,exportpred:VTS:42:48:7.50725;Parent=PFA0680c MAL1 PlasmoDB_70 CDS 550034 550102 . - 0 ID=cds_PFA0680c-2-1;Name=cds_PFA0680c-2-1;Parent=rna_PFA0680c-2 MAL1 PlasmoDB_70 CDS 549500 549939 . - 0 ID=cds_PFA0680c-2-2;Name=cds_PFA0680c-2-2;Parent=rna_PFA0680c-2 MAL1 PlasmoDB_70 gene 549319 549619 . + . ID=test1;Name=test1;Note=My+test+transcript MAL1 PlasmoDB_70 mRNA 549319 549619 . + . ID=rna_test1-1;Name=rna_test1-1;protein_decorations=SignalP:SP:1:10:1.0,method1:very interesting region:30:80:0.88;Parent=test1 MAL1 PlasmoDB_70 CDS 549319 549619 . + 0 ID=cds_test1-1;Parent=rna_test1-1 MAL1 PlasmoDB_70 gene 549319 549619 . - . ID=PVX_000640;Name=PVX_000640;Note=Highlight starts with CDS and skips UTR MAL1 PlasmoDB_70 mRNA 549319 549619 . - . ID=rna_PVX_000640-1;Name=PVX_000640-1;Parent=PVX_000640;protein_decorations=PfamA25:Ribosomal_S12:1:20:5.2e-43 MAL1 PlasmoDB_70 UTR 549589 549619 . - 0 ID=utr_PVX_000640-1;Name=utr_PVX_000640-1;Parent=rna_PVX_000640-1 MAL1 PlasmoDB_70 CDS 549319 549588 . - 0 ID=cds_PVX_000640-1;Name=cds_PVX_000640-1;Parent=rna_PVX_000640-1 Bio-Graphics-2.39/t/data/t2.gif000444001750001750 5365712366325116 16267 0ustar00lsteinlstein000000000000GIF87a€×÷ÿúÍzÿôÿ.‹WÿÿeõÞ³ÜÜÜÿ ÿî‚îK‚ÿÌ R-úšÿ<³q/OOÿGÿôÿ2ÿ zÿQ£ÿÿÁÿ™ÿÿÍðÿðŽÿÞ¸‡úúÒÿ=(ÿ¸† ÿðøÿH=‹ðæŒÿé–zøøÿÿäá=ÿÿõîÿÿÒiúðæÿÿÚ¹ÿ€€½·kºUÓÿúð¼Ò´Œ­ÿ/ÿÞ­|üÀÀÀp€ÿ(€€€ÿà‹E‹‹ÿøÜ"‹"ÿÿ€ð€€Ìÿ·ÿÿEÿÿææúF‚´õõõõõÜÿÀËd•íiiieÿÿ¶ÁÿŒ€€€ú€rÿ„€ÿcGfͪÿïÕÿpÿÿðÿúúŠ+âÿŽ„ÿ_ž ÿ·ÿpÛ­ØæQÿkŽ#jZ͇Îúô¤`Ç…Uk/Ü<ÿi´õÿúÿêÿÿëͯîî2ÿpÿ[ÿÿÿÿÿ×HÑÌ@àÐwˆ™àÿÿ[àÿÿ ÿðÿÿ¿ÿÿ£2Í2™ÿdÿ¥šÍ2ÿz¥**ÓÓÓ€€¼‹‹Aiáÿÿ‹Í…?°àæ­ÿÛp€€Ý ÝÁÿÖÿ©©©îèªýõæ€ÿäÄÿÿÿÿÖÿÔÿÿà°ÄÞ”Óÿÿ䵨¿Øúë×ÿ­ÿP‹îÚ¥ ÿp‡Îë˜û˜ÎÑ™2ÌGÿÿê²"" ²ªÍ\\{hîÚpÖÿðõÿÿÿàÿÿÓÓÓÿ€€@àÐÿ€ÿÿÿªªÿUUÿÿ,€×þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏdƒVô@Ó§G—VÍZ ê_¢[ÿz=[víÔ²i¿Žíz5îß·ë–Í»7ðàÈ‘?¾Ûöë寅ûŽ{zòçÖ¡_'X\»÷ìàþW^znëÝËSÿ~^¼zòíÍOý{ìîOÒ—o¿>|ãáÇßýÍçÜÌ!H]€ n—àƒ6ÈÞ€Vç_…fØ„R§!q÷Ib~bh¢ˆ$¨â‡î·â‰nhÒ~Âc‰(FxaŽ/rÇ#‹8¸cŒ#êä‘&)cDi¤’EB™"RRèc“Vbia–HN¸à7V¹eIÁÔX#jg‚É#ƒZR©‹nF¹dœN& g˜^Èf—r¢§f›î)&BòY§—‚执Ÿ€þùåI5 é¡}N¹(¥ 6ªé£\掊™h¥‚º©¨¤2‰¤©†v:ç¥þ®2Úªª¨B* nf¢é­fFJZ¯°ŽI(­o†ªh¦±bZ¨§Æ^™ì³œ2{ê«ÍÖɪ´³Žª,­×«åx#•™ë@iþ’æ®·šk㤓f›ê°Èuûn ó†*ï¶zÖ{ê½Ðæ‹o°ñV ­¶ý~*0±Î’Inºêšv.¯é>Œ°¥SÉïÄüŒ1·«1¼O›êLJ<+ÈÈnŒrŠÞžL¯~ /¬+»Û(óšúºœpËØü¯½ãüó¾A›sϯ­ÒHí®­’2\n¹QG ÍB ´ÈÛ’ìô˜<‡0Ó<']rÊdGiöÁ^s½¬Ø]£$îýFuÃêR]«þÖD»½qÛ:·ø5¢G—=¸z€÷\¬ßÃ&÷Û…#.7‚§M1ã&+>räÖ^ŸãG¯í7èC?ùøßœ—êyÆ'ñáúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüì&=/ýôÔWoýõØg¯ýöÜwï}ðÑó1Ìøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  H>×…€L ÈÀ:ðŒ 'HAù°$®« 7ÈÁzðƒ ¡GX¾ ’$ƒ$L¡ WȺð…0´Ÿ G‚ÂÚð†8Ì¡wÈÃøÍP$þ5졇HÄ"ñˆüaH‚ˆÄ&:ñ‰PŒâ•’ïYñŠXÌ¢·ÈÅ.zñ‹´ ÇHÆ2šñŒhL£‰3ÌeMegcYêTD:¾™nŽþ²cÓÜh´Òí1p€ô™ ÇǧÍÈQkL¤"ÉÈFNÏ-óâ!7åÈJZò’˜Ì$ Y$I*Œ’â“¢(GIÊRc†q$+8‚LR•¡4¥,gIK¢ruÑY%[ùJlé²–À ¦0;xËBvè—äå'a9Ìf:ó™,f #Ë *“$¢û2¡ÉÍnz“~ÒÔœ“¶ Ák† ‘Õü¦:×ÉÎô…ót@"çÍ)’lʳøþ̧0߉GÔܳô ‰=5IЂô Vää8»ØKj"ô¡¨DÙ8ÈN2t™âX?”ÍŒ +•ôhã6*8cN¡ª3©äPÊ1•~nr.eK-†Ë<ÂqkÓÜÜL3O‘tU5}YE;S:Â4§qÛ)GƒŠ6©UjI¡Š:©µ¨6µ\J©:Ò6rÕ§VµS—¥Õ–~õe¥)V…zÓ¾µCݪHÁÚП ²­G²YÊzŠV§ªm¬K«^3®^1L­o5$^CÊW¸.ö©sEë9×ÚÔ¢éí®UlZyjWjg°µ‘ÚhËÙ°z6±b¥,YýJTÔž´®¦þ[˜D+µ«Ë\æZœkWW³FVK†™BË+ ö°ˆý­fY+×Ìîí±UíÒ&»Û—ŠW’"š„+)Ý*÷¹›]ªt}1íÖL°¯Ani{›UæúÖ¹¯…nk¿_lö®qmw³ËÝÜÊŠ¾¼•os;ë#©«¶ÁÍ.š ߇wª¶.{×+`£z5Â2•~ÏušC.¶—«î‡'LœãŽV»¬Iׂ£+b “ –p…“ã c´Æ.&v…[\Ò¢x¯1†£…c!—´çU ÃÆØ ?éÁWmq{ïÛÑÓ«ž÷=m’D»`îÈ ~²{iìä¼ùj¸¿*®þ’ë†[—¹Ž‹­²N_å!g•ºvfëÊnåæ0”ÊY–- Ç«å"/ÉЕ¯œ“ [:ã`Ãm²ŸáÌ´EGÕÑÞEôj-e=™ÂPÆ/ž5X¯5¹[]÷P;U_Ô—Éó3f|PFßøÍ«oçêííÚv½Þb‚ÆõkãùÙ°ÈnW¨ýiP[ۗЂ†ëˆAíj[ûÚØ–æ´±MípjuÛÜ·¸ÇÍmmóAÜÞfî?hÂô¶+ÒÁY7ûøI©d'{ÖöN°ºÓÉCzÛøÙNô‘ÀMîroò7¿vº–ð‚;ÜáæF÷ÁE,o¶»nø!¶6ù]?S'ßl~oyþ@ò*Uœ…¿3–¡-dè4üáĈx¸î¶—Ãüæ Ÿx¼Ï=s×øä4 ¼W4\ £ï–$×xœ;–tÄè)L¹žGë…âÜÚ®³·Íc·¦{Ýë[¿úͳžì­ÓªP`Ö'Œ´—°ë&5ØHŠl·‹Pêh£ú¤-*önûüé<7¸«ûNx¿³Zâ5«šm«†·3'¾ñmçøÛmÑýáݘ–ƘÝCxùé®<à›–và¯.sÁÇ4ì…'wé³ýw”nÞ”_¨å[ú;†ùõ켨?Ÿgsô8_}Οz± ë´0îù{.½^÷ÎÍ<¡–OÌä×WöÀ)þšËVŸž{Åã÷¹JäÉúдnö¥o½÷…êáÞ§8øáÏëñ –æÏ>˜õ¿ñ‚:û3æiœÖ{¡W{s×~üGdU—€³†€(^8'¸lÚG€¶—€”RÒGWc Øu&w…fW(Y¼'‚(w%èX¸ øhˆ‚-G‚6ƒaµ‚š5Ÿæ{*Xƒbƒs¤F,÷ƒŠæƒV„C(,:ˆKˆSƒHØbB)HƒIØ„nõ„x‚Ø‚#ö‚#xƒ¸D}I4q2H„ˆƒàµƒ耧…U(†WXf Ø[d8@͆qèhjX_l‚]¸„E……Ô‡ö‡þ©%…’Byè…G˜†FHˆ’†G‡6ȇ‘H‡èÇRw¨vfØ…ˆ˜i „n(ˆ-&‰}F‰ç·3A¸ˆ¹÷‰nŠÿu†ø„†(coH‹¨Èb–ˆ†¶8†®èA(‹—ø‚·øoÄø…Žxe•‰«(G±HŠvŒÕ7‡ÏxzXŒ¡vŒ9–‹£…½X‹=XTSŽ»8_º¨‰¬XŠ\à˜Ž×x€ÓˆFÖÈ€›¨Šö¸ŽøÈ~ûèˆu˜¾8ŽT¨ˆÈSöŽß‰õÈ)ŽV8ùæ¨ŽÐØÉ¨€î¨©„íh‘ÒØç8`ù‹ é÷’‰ËX‰ð˜‰’ñhþˆ#)“ÎØh0é’*y‘!)r5)‘-Ùÿ¸’8Y’¦8d?IfA)‡¹” æ“));I”'i”:‰•V©Ui’\©•^ù’`y‘E)•Gù”,™$‰–gy“ö§‘6t]•¡·j«æZ¨è:®ÙZ®Û}'&]êõº\éZaë*Š:±ê®ô‰­êú˜h¦i¦zs5Î6ªÿªñê±íú­]I± Ûžë1›]ú•þ¦ë· ÑJ²Ó ¬K¬ñj²eÕ°èq`æuHÖ± ›³Ú ®²Aë^ÈúÝêa…`=ë!?û²"»¯Ôú°~´´:ë‚`‰³H;•çÅ.+‹[´…°@ °û£D+³ïZ´êŸF«h»Â±¾’7_ªWøÊ0[³ðÚ¶y;²üš«J±j+® Ë·SÛ¯n*¸ë¨³‹;¯ƒû¶…ë¡úЏÜJ§å¹¶‘k¸GË6C ¹;³Ö:™\ë¹­ùu¨›ºË*2M‡‘¢º$WoöÆ3° re;¹>Z¹€ëX‹²ÂP À¼Â;¼Ä[¼Æ{¼Â›°âuñѺuò»È½Ã«¼3ƒ¦þwoH½Ò»½Ô{ˆ;:Ÿ»µ™K¸¿X#Û{¾è{¼>Öº;¨I÷qé½Çeo7•oé¿ÈÛ½¸x¸V«G½+°iëhæ‹¿Œ¾Øk³§šl\¼ŠUȶÀÄ«¿Èø½T•µÊ¸¥Íè¸Æ8ÀÜÁÓ‹¶´¢½,Á/(ÂL‰»äª»ŒË»Š+¥ìÁ' ÂTbŒˆhà ŒÃ€¹¹”Û¬˜›Áz+‘1,ÃÌÃþÚ3:\ÀHŒZK|Ä·‹À?Ü·„Yºà뛵›ÅôËÂ!¬ÅÖk›^üÅxË¿\µ-ÜÿËÅ¢{®~kÆ ëÆkœÄU<¾’+Ź ÄL³m¬ÇTËÇ¿)Äþ{<º},È–Û¾CìÃwLÅœ¬yLÈý»tÌÆƒ,É… ±¤Êȇºš«Éä›^G7«K eìÇ\iAŒÉLÉ¥¬/ Z¿B. ”£ìȳ¬ÊgÌiŒÇ™ Ç9©s·¶abèXÉWû¤|ˑˊ¼ÊNåÕ]IöYéÅ‹“,ÇÄ쿧ܸ»|ÌoÌÍ+i`¹‚`5 Å”µlÍÌœ…s ÈÕœ¸‘ŒÎ(Ìd»_¸rª©ØÍ´ŒÏ¶\²t̹f{²4Ü˵‹[„5‰ú Ï íÎ×ÚÏSLÆ }¹IèË} ÌöÊ.Ç Ê -¾ì|ͼÍù¬Ñ-ÒûLÒ†LþºÈÒ–lҽɼÜÉl;ÅV\Áá+ÓÞ¬Ó#ÍÓ'íÓ1=±+½ÂºÌÑM‹aœÔ[|·%J=t²¨º ùÔTíŦ›•@}Ô mÊmÄ^ ¼„Zr6JOŒ¿MœR=bª{:eýÕn¿‘ú²7íQìºÒHýÖ2\3ú5êÕ »ÖÍ%i ¿z}Ø\Îx;×½Ð4ÈsÔÖˆ-¿s»#½Øô»·sr“ÝÙÒÊàÅØÌºÌç¬ÕÇæÙPH’mÀŽ]T«Úo­lùê¶þ¬Â«Æ½ ÛñK¨¯ Ø­Ýb¯­Û{ݧÿ7Ô·]Ôí\ÒáÜÂÍÛ!ìÛ¸KÌþ-ÜLìܳ-¯.]ÌïlÚ XÕT}*UýÛCæÝäº] ÀwýÒF­ÜÉ×[ÍÊÛÍÞ‹¬ÍëíÞé\ˆÆÜÓÍÉu¬Ù‰,ÚQìßDMÚé­Ý0ÍÝŽÍ—Lßí­Þ nàõíàï=Ø÷ьʮà.ß~ÏÙ­ááëŒá®Î%ŽßñmߥÍá+®âüüÑNÍ'náû=Óý]Ó,MÁt-›-.á1>Ì?.’=.â3îáÎàE.ãA.Ë Ò!âîä#ŽäKnÎMÎÕîâ.åIäȬÊÜÒYÍâWßYîãCåóíÂ)ŽæeNáiÎåU•5¾ÓB ãqŽåO.çþynæ{®çQèkŽÆùýÓu®ß7ÙÇMà[.è»KèmNäsž—îç•çonâŽË…Ô‰ÎßµmÇ.æ‡nè7kÜgÝŸnã¡.à‹Nê«n秎癎âg.é}Žéné].ä/®«ÖýiÎ]×eYêžÞê8>ê:ÞØªÎ·áìÆŽà»®ëc®åÕîæÓ®é_žeR¦4êªí²ðön Š©ÄmÛ©ŽÜ½ÎäÙnëÎ뛞ÌMÖ-·óLÎHzÐý•¦ÂÐíôŒîÝì½ì£ ëÈ®èéŽMv¯vrÛõÊfv©ê>é¦Yë4ëˆ~ð nÓõ4¶üÅ_qMΡåþ_õÞ²[rî¢þêàÉÎòÿ,´âýß_^cJ¶#¯+¯¬©û>ñµÕòR ôU%ð9óçMôþìÞ¾cãÊaZ5|òOZÙ/óHóUôŸëÚþëTþ,*ï‡BÝ?ðFÕ[ñF~ç$®,aï½gÅWŸðe_ôYöŒ~äl~ëjnñ¢¬öJÎõî~é]ïѨ¬^ÒíµFˆøã¥¼ŽÈøèø’Ÿø”Ÿe “´{¯Ø–ÿ–•ïÚŠ?Ñ¡¿‘ÿ„ŸÜ£‡é¢ù®ò-õ¯û±dô˵ûò,õ´oû¼?û}ûºÿû½ïûßûÄßû»ûÀŸü²oüÎþ¿ü¯üÅüÇüÓýÒŸýÕ¿ýÏýÍýàüÑÿýâþÖ_þèþä¯ýÌÏüLÆúœ>òÜOýݯþóïýí?þõ¿þüŸÿø¯ÿñK @a4ˆ Áƒ >\±¡D…-NX±"FŽ7jd2cH‰IޤXR$Ê‹&S¾l¹òâG•0gžŒY“åÍ.wÒìYXÆ` Eš”a0…CmúäùSgΠS;ÊJUëÕ§2¡~õŠ'תe£žk5kZ³d·†U;víܸ]뾕›×®Ô½x%:m©Tð`‚ FœXñbÆ?†YòdÊ•-_ÆœYófÎ=þZôhÒ¥M'&œz0Ó€ÑÂm Û/_ÚgéöuËvö뻹o׆ú›wl½»uûî}\xðâÃw/—Ü&ôäBKªÆn°(B×Ê›3ÇMøxàÑÍ??}õðëÉÛvo\l{úµÅ˯ï\ºýøû/¦¨ìÔn¡î\;Р[cÁ’T0B ZÂÿºÁ ©Ã -ì B AÑà ;´îÄM,±C×6‘DetqÅ[\±FCÜpFqÜðFs$rÇ–bô±H K2I#‡Ü±  $pJa~„rÉ,;B²Ë½Ü K'µ“Ë/Ï,±Ì›SF5c„M7ÛœþqM9ë¤Ë8ÓÌSIÙ¼SL8ý|3P }²Pš’ÊìÝsNDµŒÏI·´“ÏKý“Ð>}qÓO)õTÔ;Õ4UI™,UUK]EuUY_íTSa½uVjÔQÕ4×{S:mUW?‰6صÕU,™•6YZ–ÌbˤVÙhgÍÖØf üöZg —Ss—õU°°…¨ móT¨ÒsÍr; …¼·»|ûÏÚ]7dÊ0ùx,×D(ÖuO21`.×_‚2Øá~#Fl⊠ý×`ŽúÍ1dy)Ö6ÐzÛMª ¬\yÞS'²7á 1ZXdS®6£3þmHck]f• ŸÕÕóç…1øã››ú eq™TZ;™H~ºD+–™j¨Y"ºgžúÚ¢+¥FÚÆ•Y6jmtÉ©j§G¼–µî»â®á´”wïgGòkºâŽÜƒv\ì,OüÙ° ·ùðˆ^˜ñ¿—„¼V”›V½#»!Íñf±s 'xìÑ=?ÛÀq'Œ=¢w}u^°G®œÄ×ÃÞ|êÅ//°oÁ½åÜCÒu÷{ùàSG\ÆíN>¾õÇ•¯µyä…}u—7\uÌEÛpߣÖÀòg7½ú‚µ·žÓîC5z}Ç‘^ùvìPËÒŒôÞžü¢'2áÅ@è[ZßþÊf@Úa/}õZàóH¼ÁÕoás ýA¼ÍOqg»`åÄ/¦°MœC÷£æƒÑÕ±²FdN*â?»™PN¿Ã™ cè¾»ÙχtË Õøvļ!ðƒß+ “ø?€1ŠBaégE eyù«ž}&Cx|"œ¢Ù‚ÆDÑ9±‚[¬ Æ.!+¡QD32Êq‰ûbTew?8)|'ݳH³Î†µ;X ùؾ¹uª)‡¬ß õ˜CúÍn‰£‰­Kj’^k &×HÉê’’Ìc"ý˜ÊÏÕ1(¬bÙ"·É²w> ùhþ8FBö(˜¸Ì1[ 1‰ì}Sæ)ÝtÌÒyrx•f3•¹z¡Îb©Ü¦*¸Ëjs†´4š©IJqÎr_æÄ˜ñÒYLUñ¯'¶|£4õ¹4l¢.]ÞdW?…õO!ƨ[û´Aé¹½ƒºóZ Ýä“úËcôR½Â§Q ŠP‰Rt uÜDêª:”ŸËD©ô@ÊP.TwM©HSª®’¶T¥MJMGzÓ™ús¥Ö“)9iúÓiÙTŸ:íéÅvzT¢4©.EªP ŠÓœ6µ£K½WTCÉS©~Ô¥æ êVjU-… J…)9ÍúS­žU‹T] Y·´Ö¯®¨­6¤kZÓWþ×Jæ•£Z“+·ŒšÕÀN« -,Z᪸¿ªu°ˆåkL[®»Fö¥]…jb{XÊj–«b%¬eƒ‡ÑÅV6­~u¨i‹Z£ª¬“ k{Çڥʶ¯°- m%»Ø¸Š¶X´}ê[MêT̲Q·Žåll=»×à2Õ·ÅíPŸRÞöV¯¿nE§ËÒäæv¹'-®s¯ ÝîJw¼Ô-¯vÏËÝê 7»Š-d× Ô÷’ô»Œog·KßôÞ鸣­/¸î›Ïêþ»ýµï~‹Š`+˜¸ùU®ƒ¯ÚÜÐÎwÁ–ocÜ^÷2˜¹á­°†ŒaýZøÁnõ®„Ë౪x®,îÉËaþ£—Ä6ñ„AœááêÂ)ÎñŠ=ã¿õÇæñŒÛ[cöî¸ÄI¶±“q å&Y½TæïŒå KyË=2‹|Y+ûwÌÀ /“³ìe$ƒùÅC¶ë™ag –×u³µÜæ9Å|†³Ÿ—«æ.—9ÁA~󞯜gʹÎfó¢ûlä?K:Д´œ/ÍUF÷Òf~4|yKèg:Ô›U4¨­çH«šË¥>u‡SêVúÕ>µ¦gÝàUCÚм¾u˜k ìNÓú×-îµ§Mlcç:Ö>6‘Ÿ ÞhÓ™ÙŸý´­‹íe;ÑÃF¶·Y]à•ð͇¹ef°tþƒ×‹gì.šÅJjg›Ø“&³½Ã½mhë[Ú׆6o%fSsëÙ0˜‹b"Äîÿ¹»„þÆ/ÄËojKœÖx·1.ègÓ[ØÕ&¾a†ð”±»† /ŒÃu&WyûtÚ︮ÁýoqûÚâœùK˜± Æ“€ Ÿ˜ËFgn…GÒ0#¿ãÿR~!“#ódó9Wîâ–{à×xÎ7ýác:æ/'°À{òƒ?<åŠQúÒQ^BŒ‘|çãTÞÓÛÎ4a½0sŸ:¢«žY°{àÿvµ'®õ]ï›ðí%ûØë&Lt£ýîK'À ÿø·'íeçùÙù·xxkyïÆ•¹à/~xÑãþ|ÓŸoÍE½ØÄßóB×<å>ÎOžíugºÜ__ygª½ó^F}ˆ»žï¬Ÿß\'ýÍ‘oü;×~óïæ}ÏeÏù·7<éR‡;ôí¾ûº'ú¥>“_üÂcýëW‡ùßC/vt‡Dèß—Xâ‹^ô Wqóô·}Ü#YnB½è>ÿ½ ¿'¾œ²<>‡c¾ò³6Õk¶Ò2&«V)»Ú =åS@ä8õë;â;?ä¶DÀ;ƒ–ÿó¶°ºÖº@ò›¹ôA<?ŒAD¿°ƒÀ4À/›Á¼qÃ@ÆA ½lÁÁ#BrÃÁÂä·´9?%̧ ,Â!þB2µ²ñ¥x“BY«B¤Á4¿?öCdBsBe“Á#ÌBiA›ûÂå»Â´:ô“qò¢0‰Ã%<œÂ4ô°5|@¸b D9É£›Cš½Ú@\Á6¼BÔ¨?ýÓÃï°4<ܺ üB;ÌÄNÔ¹‚Q£=„& éÌ»¦ßóDW£ÂÒ£CPœ$8š;ªyVÄÂ#Ä ÃV|ÃQ$SÄžSÄ?cD/ŒÂMôC<„ Æó™3d¥ì³Å?„›[Em#½^ĈÆQD9Å`,´b„Ai”ÄN¼šn’ÒFkÇ]¼EpËÅ€+-qÒ%éÆ=LG]„Ä$DÆ@Ü´µ`œKþüPúÄc¼ÂW$È9äă,°÷ã?Ä)¸t£\ú8p|Ç1ÌÇ俦ƒ—q3ÈhÔÄ‚LHjìÂp É%;y¾’¬HlÂHdÇu¼H1tI5\¿\•m@–„É™lEŠìÉ—ÔG‘LFXt4ŒCŸlÇckÉGJ¤¬Æ{“ɧ¤I4D¹ª å;­ •p¼RüB®Ä >º éJ´Œ°˵üÊ ;ÊSJK_«Œ_†a°Ë»Ä˼Ô˽ä˾ôË¿ÌÀÔË ²;‚ÈK¨qD-«KÁdÌÆìË€ÜÆa4LÇ|LlJK+´ óYLÊäÌÎôL»ìÃB¤ª¤ŒÓ˜Ë¬“þÍüÌÕdÍÖ”<‡<ˆÃÆÒSÍÖ´MdâE¬Íϼ‘Ì´:}BÍ5±Íá$ÎaÍÏb=Æ8É2sŒâtÎçÜKŽ9L弹݄NÇÌœRAŒál ¥L¯æ¼ÎðÌã„Ç«Ê9´NñTOÎl’Ú È°\OÊ”@XáÎ}4ÆêŒÏü”ÍÝzËŸ ¬ôÔÏåËöÜO¢M Ìùœ•Oû4IøDÐø$Ojs6¨<>P%P¼,¥IÌP¿TÐkÁÐÆœPìÀýPÖ,Q«Í Œ.¶„Ñàô—¯¾ — mÊŒ´Q®¼-tÑA R\Rw,R¦WA•Ôo’E@Ê¥F’¡hÀT4Ð[M¦LF!–M-;Å2<þÔdeS^DÓ¥ì¦`Z°q£ƒØN’¢£t¥Ç‡½Wc¥Ó~…TŠ=W› Ô€J÷£×w²éƒ×RÌÔi#O-šÌK×l†ñXnØaåW˜Õ×|ÍØT­X2=®‰'Ø”Hþ»¾xR:¡ËNpZ#OÕHž“UuÃXU7+Sš»X!­ÙµÔi ÓªuYGµXS½Z¦•X­íOíÚ›EÈoýÕ²%WpÍZRÝÚ3µÙ¨%R¬}S®Ó™5Q¯ W…4W}Œß¼ÎpÊ¥%Ûq Ö—EÛÂÛÃ%Ö³EB¼MMõÛ¡áÍÀ•ZÇÛ­ÜÁý×kÔØ>&Èå;6BÑÊ|ÒþËõܵuÚRÅܸMÖ½]ÝÉÐÈ-—ÑÝÒ\¸5R¹½]º½ST¥ZË Ð½…2ŒÉµÝÌÅ]$Õ]äåÝ}õ]œŠYNÞÔs—1^7ÝÝ×U^àe^í=Õ©…Þ#eP¡1ÂСÝè¤\ÖÕܦŭ§mÀäýÞÖí\qE’ÈÝøÑˆÍHßÜå^õ…ß±ýߺߌŠ^ Â×÷ÍCsßò¥_öå¶=]Ó-×ùU[ ®àì` nà¯e[™`|*àÍõ^n^ší_þ]_NÝ-=áBqžìHÏSÝ î^öß¾ÛÁu]—ž™y:ŠéÙot`†à Î[ÆáåÜa$~þALÕ’ýHb,â•<â ®a'¶`Æmb,6ߣÖìœ× Ú¨óY×ãÆ5#ÜÅíÖ%Öb öbØ·ÅásãkXÙC Œo4;¦bnß~ã,ŽãíÕa Vâ[à1ºƒë¥ƒU…›ŸÞ_DàÞ]Þa–_:î䥖Ëg=Ÿ¸!&kRc7>äøMá$nã*ÞI~eà„RþÇT–ÅÅ{Fè»Äz“e&äV&áPvÞ¶¥fä QåwÛHX]ÆŸ¥UfÚ‰ æ ¼âEäöàOþÝZ>—‡ÉBædÆä:n.eÞf#[cÞ#Dç4³[ Üd9Žçyþ{^žçtþYbödp†cm†eÃ]ãîb–¦Î¨çsvçÎäcnaWžão~h¹ÞŠvè{v¹ˆ.fs–hÎe>ÞäÄ-è}–ç…þ膦go_•iÏ´dvV\uh“fe„Þân=èXÆÑ‹ÖhÙéÆè–hCæbEöiÑj–æg˜&꠾ߢ~j—Ög¨^ЦjMæè¨vê”îj®Nä&çܰ†è£.ç²fè­Në‰~i´6aµ¶ç¯Æg¬~k©^«a”¾k¹Îh»Þhºnk¶^i&Vj‚Îé¥FÝAÎfÆÞižfË"-²ög±¦j°&ìÃ6ìŽîl¯FlþËÖ逆lÒ–ìu¶ânÞlÏÖÛÄÆiCç(;i¼žëÌþëÕí íÒFÞØ.X°tËšöëÁÆmãÖkêiŠNî¬â¦0~=2n9¬mÀ6êãêÏÆìåŽkÝæjêØFN;þ$nÛl·¾íæ?·enÁ¨aêXtn%«nïÎk÷žjõ†göînìÆÑfp«íÕá®oÿÞkûNoü>p¸¾jën.ÂÄãQ.Ÿ=Þµ¾ìûFïóÖn çíöÎðÚâãœÝÙ†înp×ð Oð¯j¿n×Aþ~q_q×loq_oÏmïkó¾q!ßþo"Gn%Oq&ÏîÖîíÓ¸…ŒÃ²_ƒ¤“m¥ÆøÛ³D.Õò!ïðþÆqu9_ ýÉœ+ŸÝúÌÍÅ0Kµ8óòvðwñ#Ïs±Jóõ´û½m6ÎÛ¼#9#/O;'ðŦòÆæfdµñOÑè¤s¤¦Åàβ\5Å`têvô×FíYng(ÿéJ/ÐsCÖ?'Ý;WuS_ð=OæâWO ×óUwMÅuô5ñPï`<kßp‡úõëÔõ"—\VWÜdOuPŸlÓ|l‚îéGç7+ï[10_c.‡ua_an×q>Ÿô]—õ?ömLÇvÓ6ékõ›þöX_÷$O÷ Ïw2—rc—qv÷m owøºÞ÷%/ó?s.øÂþw|¿÷s„ïw3wò?ø'xtßxf¿ø;LxsŸxx‰_øq.yŽOymxƒïø&ÏxŒù(y‡Oê)ŸwH§i{_y™¯ùüþx†·v×®wqwlrŸyÿy›oxήx…z”¿y¨¯zÖ¾úÝnz¡oy‹_z¢ßùÈ{x?úi_­aÎy—z¬_{­Ïúížzuüzªçi£wbyšßúY{©œ{¹ùZGr“ï{3ý{¿z¾?|Ãü:²ižOm¼?yÀß{u¯|}oüz|±/ûþQæj{w}‚/zï|z¿{Ÿ{¿|~_ýÏ|¶Ù|²O}¤tÕo{¸_|¨¥uÇ·u®O|Ë}€wÑ?}È'uIÏ{¦~ˆo}Šo~Âß}.w[¸D©¡'QÚK¶úÜgýèWyðgùàÇü¨Ç§ÚÃÙ™f»~3û×ýãçüÚoÿÙBûº‡+çKÚü7ÚèfT+,µiµ~»štB³Rÿb®M»±áÜ—ÿÎæ\Ùögßšokì½XwçÄ¿‰Þùrç›?—>\8ð¨Ø™OÇ;ú{hÕgÏ¢.¨Z|××ã3f5ÞÝsòíòKº‡}±òëÔ+ׇ®ÿ}~Ù½ç_»Í7Ø€îgYu Òw }™…æ‘UY­¡¤¡ihuØlF(b€ÜÈ›‚ Æ· ˆ¦xbd,šè¢ƒÿV"„þ4ާ⎠òh£Ž IšB¬e”V‚•ÞZIƦU5’˜ã‹µX¥\TÖeþm&£–‰eqaŽ©”3f &›Þ )$ŽmFÈå™=Æùã•hvIæƒrz‰bšÞ ã‚tæi§™‡úX'£_â©f]¾9Ú  g(¤ˆúÉ碊zЧŠbš(¨j¦nZº©ž¦ê(¡–9)œ¤^Šª ¶žjª¬­®Ú«›ŸæÊêž­ +g¥¸öY,³ª*û£¤´^•,¯° 좿Æjí«ÝZ§-¸Ö]»-µÍb6*±ÎVä¸Ú–ëê¬Ò‚÷n»â2çZj­u£®Ð>Kn¿sN&ŒþMZqe¤¦Ø†k¬·ÈÌnÃØÒ±µò†6±™èâ›×…@‰…qºè*¼æÈ[ÜÒ…§µbÉÍŠ¼­a ·Ü)Åî>ï1ïsgûß®úW=úK|ßcßôÔ·3ú$nò,t4 fH<©‘MÓ´4Jî_àcTêV´Ó  a_år§@‰Q[5lâ†d“Ä¿a‘däË!ÅH™?[dÇØ¸)NP*#€Î¶%îî‰ü ã¿ø:;žOC áX16VñzX;$á‰È*þ²‘Ь k ãÈIÒ1Wô£݈Jr²“ž|¤_"©“Oz’!¥YèXT²²•®œ$þÈÆÌ™²‚Ƹ%.s ?aä²—ÆØ¥/ƒ)Ì_ÆÏIcIej†©L\^è Ôd©f!^.³šÖ¼¦.‹¹/„Á ›Õ¼¤—XYµî¡rÔô&:Ó©NeBO–³Ì– -rÎ`s˜õ\'#Ÿ)„ae·l¦Üù@hÞÍŸýæ1õ¹~Îó Wd%Åx&NÒ´¢e'D¸'ÅwÒRšjh/SÒlŽÅ Z# kLÚHB±‹uéEUúÂë¤ô¢ŽÄd¡9ɘò4¦7e×, 9'˜þ3þ™ö4*>åDTk”pª¨KWÙS›*Õ§µäA):Õ­&õ” ä(<¯*OŒš‡¬^1iUý P…Æ0“QÍÌR¹ÊÔ´Zœ‚ªâ*×½’´,î ª-iÖ~µ¬j¥«:›i׫âu`|íê¶ôŠÍÅzÔ‹mý‘d+Wì}•£'?Ë£½R©¯\K «õÙUž¶µ”4­kÉÒßeµ'±½-n>°®öbµl<¹ˆS¬¾5x•­ãqט\¨÷ˆµ ërëÙÀ¦Vš½•îlûxY'F—¶Å½cvÝÚÜvW»Á5`Ÿ«Ä4~·jáÍi{#øÔ–Ž—Œ¿çyçÈÞú*wºþêîvcFÝü¶ä50rÜß÷—¿¾-¯x|àw^¼óõ®ƒ±{aóÞW¿Ï­°{7aW7Œ Ž`zãëaLdÃpA^;XÆô¡qCh 9¿ÇÅÁ1qtÜ6SŽÄDަ‚œdúÂxÁ)Î0 „Lc'™ÇÐý…•wÌ*‹@@V‹!Wâq8X]np“•Ì`ÿ½„𗥌e»xÊ,æ2Bê\’û1}&ˆžmRg@ÏY wƱžçÜgE:ÑÀø3£=ç¤:Æt.t£q /ºÒ€ö1C¬ Æ5·Ã«ûð€M]dS_NxeÞLœs6žíí¯Dà—–v¾«c‚k;Þ<õ! _(‡x¿ç¶°Å½Í[8[»ß Oˆ­ùL’i˻ش®·¬§ÝqZóäæöÃðd×zÙˆ.xÍïMò—G%Ö¼n8F þÇ3³YÅ6·Ñ׋tŠ£øÍäfœ=îñ}\$Ï.yŸ­oôÅ ü釛ùzï~Á?úú^éÛz«1üèã}ýÚ÷½û=|~׿ßúWêÅdá·¾üì§þýÝÿ1XüÚüù_ýÁúå_²Nú©MŽ_ÑŸüÁ÷ ~ø­ZöU ýE Xéß÷a ÷þi †ß J Q Zàæžêá_‚ Š  >šŸ ²  æÑþ à™ÑàÆ½`¢ 2 æ`©a2z ò`6 ò!áâ  !*aJra 2á&áâ†]ÑŽlÚ na‚¡Va RáìYáRØ.ìÀDqe©Ù‚[ Ò¡Æ!þ¡î‰á Þ!ð…Z@MçœDj"!*â>a ~ ÷aŸ6!ËðÍÛOó¬GùTbb R¢âšâ á+º!HD’þ|D;í–,²"®â!v¢ b¢'’rb–a,Íê8Oþ /¦bþ+6£ ""4Ê¡ƒ#sý ›MQ!ÖPíìxù.£3îb.öb1¢b4ú¢+ãZâ~…Ó¬Þ FFÜ9–ã¶#6B¡Æ"9®c1£*æ£@d@RcšY#“à$>£A*¤ê< Îl#:äEÞ`FJcDZäöc§$D&¤G^"H2$ßaäGª¤I~ŸHšã"Mná–ÔtÒ¾ÇLV‡#iKNŽ£:J$ ýâI¾ã)²Ž÷d–f1Óc”’`Ødg %B5åJ‘(T.S$bÜF²ã4’áKîcÎÔUjVÒØäv-SvU‘íxËN"UEeeÅme:>$L~þe5ž—#%¥7U¥&îG#ù”(iÒ!Y•OÚ%Xvä&ößPv˜Xòådñ㋌eaE$e “\:]"äOz%c²dš%d^Sf6‘D¦e¢¦"f^Jæ0~¦FÒŒæ\u%„\&=Å!núRiþ^KÆæor¤åsÍ$MÚ&lÝ–næ3*&q®äkj#˜Þ^•¶itΨš¦é”žéžR)“éiŸ–韎i Î©Öi—ê†*¨’:(›ê–òé  j¡BjÞiÆå¥rj¦bªJ*Šbh¤z*Žb_yÊ=Î%«ú(¥¢)£Žª£ºiÀx¦6&â´É¾H"ª:iŠv*—~ê°~iþ±èu¯«VΪÖê¦æª­¾i£jw²‘Ô`‘<¢‘–é%+ž.ë©Jë¡R«±jj„•¯Ú£Ñ€È¯’FÑ\ºk©’jº+޶hµjk}¦Ø½ yt£éŒ+lä«©®ª¿ÒjŽÒéÃNkÄ.(ÁŠ99ëV8+)>I¹ªë¤V¬®þœ ì£N캾ÇÊ+ÜtãÊbl#v¡µì­J¬¾öëÍ:lÎÞ%!‰’n¹¦ÎÏ: Ãò«Î6,²‚lª"*Íbë¶ZªÇÌ«F… º­Ñ&-ʆ,À¶+Ò¶*–f,[ ™ªbíÎþ+¨RíØš­¹†j"fkÍžlÙBìÖîþëÌríÕz-ÔÂm×ÊíÙŠ^Õ’íÞRìÜ^i¯ÉèNB!OomÝÒ­ÉŽ¬i.ªÓÚlà¦ì“#Â:Õ5§È^ë®JîçºíäêíÝB,Áм"®è$ãa®-Ú2­Ý6.ÎV®Öö-Ý%ÐÐÏüð!ý,.†.®>®ç’,è¯èïÀ:=.’ô.ç®ÕÊnô oÓ"/éJ/ÏJ§F½ÍüdO–"ì:îÛBîp•ìøoä¦gÏzU@©.ïŠ#ø²«øŽ.ùžeñ¦o𞯉ö¬áÚ îKâcçV¯ñæ/ý¢oùÞo«oÞÖ¯ )°ýoSné ®ín[Û°õ:°jþAðK0þR0öâ­Ÿ‚ðkð_/õÆî Ïï'ªú§ Ï0 ×° ß0ç°ï0÷°ÿ0·Ò&±1'±/17±÷”7ëO1W±_1g±o1i†ànr1‡±1—±“¥Ÿ±¯1·±¿ñG±}1×±ß1ç±XÑñÿ1 ² r˱ù1!'²"/2#7rnö±#G²$O2%G²!Çpg²&o2'w²'2(‡²(ëp‹p Ïn§,ôn*×®ëúm)«°þ²ð,»p s°uyp3p £pËòð/㲉érþ.󲢚pûò ›r-£òóí+ßn,OfÿzEò<‰lâ´òÒÊ/4Ÿòô>ó8ó»~­o`îÅI@«ÂŠ3+G³O3‡o8“söö²ÕdÈÜxŽ •7ËM@ß2/³3›³-sAðÓês¸ˆâD¼o8ÚèÐî70-#ô=kt9¿ðþ6°NnPDÛV"’EkÚJ³Ò¢´=w4A´CW ölÌÔ 4?U´7³48»´B s3³GŸ3H÷HiS®ýlÓI+kJÏóJ3uKÇ3<“p2c‹Ð¢ŽÏ¾ªL&®<«ò‹mT«íSŸkS[.:K5>‹uÖ^ô*«uÜ:þõZë´}tP'ôO3™s1+3C'ïPgt]ot`óô]/ô.3³A[ìYãä(7¶c?6dG¶dÿpY‡ì‰ÚV%g¶fo¶ûîaûuL?%g6i—6WöE_6è˜6k·¶k׿NçsUGÖk×¶m¿¶gsCÏ6OÞ¶oÿöfçö^ïvœÞ&p7r7²pç527b%7tGw/·Ý5·«·tg·v¿1u“žbÿµˆL¶x7y—·y7j˵j“uX«t\Cul»õR³w|›îb»÷[{5=ƒu}Ãu~»òX³íõKvÛubãuu#v_whût‚¶nÓõ v…v„þÃ4o+8OxZxO/Yì.=*5U*TCJøpSxˆ3ëƒx¯¼ê‡cxƒÃÑéÔÓÔ4)vOiL ‹6„×8 _· Côìø¬ê†!ŒyñÉV8“î2”­„ާx6·8á¾8‚{ŽQ;o’ß$~Ï·|ðîÇØM9MûšЧ¤Š37ƒcy¥r9ˆ÷xû–;‡ùŒ£5GãvEHÌ”šOù1®àgø’#º‹oøBÎ’dÏMï¹|çô§(®WzJüŒ1Ñws8ùe9“/ºs#¶?ËãCõ¨+ú|Ý"ìØynµî~º§ûxª ¹†ú÷M÷üsèx¸.NzWKÉþˆû/Ðõæ~¯κ¡×ºœ¹úéõH'û›/ø¡Ûz¢[;‚cû–3ú•‹´´wûŠ3û„‹{¸+û· 5Óx³ƒ;œWûº_û»g{¼o;®ƒºkÝÍk¹Qãûh¡yóõ¼«û¸Ï9·/¹0Â'¼Â/<ÃÃ%|Ã#ü% ÄG¼Å_<Æ+üÃ_üÄ¿ "óe› |¹O{§;;*pÅg|Ão¼Åw¼™¤¼ÊǼʳ|Ä»<‹||R†<ŸöÎ_¸l×;ù¼ÌKüÝp¼Q=Òc<ͯ|¢à<ÇùÀ“¼¬›|E¢|Òkü$q¼_=×/<%i}[0I¬Ø—ë<°Oõ˜Sþ:}ϵ½w½Ã}Ë=ÜwýÒ3¼Íã‰Ó?Ú¯}°³õWsîz ¸ýÐß½×Ó}Ý_=âk|Óƒqßû7™¿n›5x×¹áË|ã'|Þ“Oæ/~Æo>Ñ£ÍÞóUäëw€S>F‹:‘3óçϼÜ×¼âƒþáÇ>Ó“>ä|Ô³;µ;xÁÛõ½ŸøMé;óûðû;zCýÈó~Éßzë»ûîÃ{ôËûô×¹ª‹|»û>ÐK=­›»’{ö{‚Qÿò£ûï[¿¶cï‹¿02ÿÔ»÷S½Å˜oŸ§}Zû½ÚK>ÛþêÓûóƒ?@û5ð—@‚$¨ðW°„.„ÈaÄ)tøþP"Ç‹=~ì8²aH‹'Ob4™‘àF’*I¦“¡K”,_Ι³¥Î›+ÒÔtgQ˜Eeö yô§P§m2•êsªRˆW±fÕjµ)RœF©]vlY’QÉòT –kÒµnÙž%Ú•nU¨iãæ…{­Y½_áÚÜ ˜ðܾo ?å‹wð\¦‡ÿ:Æ+xkeËwÛ,×oãÌ>!{ö*¹mâÑŸC†6]w2ãÕš£FLólÙ›k³îüZ¬íӿ骦;öeã•…ß]œ8ìÕÉ;Oízørèº}3_.]ñuîÑ{7§Þ½:o¿‚Íg\ž=çãï±z¾t{ú???¿þuûý¿Bï¿ïJR.½¼4ð?ùv.ÁûôÃÀ ÃÏÂ!Ü®µ$¯Ã äÂé>DõDmÀë+‘@QÜC [qFí.|Æd1F }äñAKÜQC䑹“’IâŒ<0° òÆ')ËѸ(mÌ­J%kêRH*¥ ÓÅ $³Æ3¯¬°ÌÅü2Í6oä’M/µÜ2ÎçLÒ¿;ǤÓO3i´O0×,TQíÞ,rOÕtP9ó´ÐÎE ETRLÑŒtÑK‰,êÐ/ÿäTP 5ýôÑÛFm8P±¬>X;=•ÔLŸ¤ÔVWQÍ•OOCíXÍZ]57_!þÝÎI•õ8ZO-–ÙðeuXþ mòÚ:ÍOZS­4Yq7 6VgõœÖZeË­ÂoÍUQÝw·Í.Û@ÉUu^oë…²[bÑM\|S ö^]ó5øß ~qa$ vx_€ÙÕw`„ÞêàfÆöáµàuWØŠù%Yâ‹9ŽØã‰V™[–!Î8«F±¹(;>1Þhû-õgmM^åq]¶÷ã‹~ùèueÖ*›mžSâÙ!žÂúÖD‡&øëvƒ±i¥aÆùlÓfºg´Ÿ¦7j­xözì‹°¦Hëœo¾[á¶§\[h«[öûä°16ÜhÄSVÜiÆ‘ž¢¼þ¢ºo¾ë¶!Ë ²üò®-ßZóʱö|s/ÿ;î’ßf{uŠ[¼lŸ‡r¨“výv¹%¿jjªÊœïàoÎüê¾Q¿ùø—öžt‚ŒwÞâÝYÏ]vÁÍŽý¹¥×lÂcæõpðÕî"—’©j¾Ù_Èóâ•§Üý¾EÞþö«–^uêa·~{À³ç¿ïÍ?µÓùÜ&@½®pæÃPú"²>âísì[žQš‡¼Ë•NƒÄ[Ù°G;ñ-ÝS૸@^Ï{áãJ¨B †Â ^û(ø<]0kðÃßH:òŠf¸[áÿ¾R‹€¢jbp–èÂ(뉙rþ`C8G:êσ6Ô¢ü>Bµú±ï}?ì"§È¨4‘w'„"E¸Æ4Zñ…¶‹!íÈÆêm‡‹$¬¢›äG) ’Š!dÃåF:‘ ¼¢û§¡,‚°…N4$ ©ÆLB²pu<à[ÔÈ%Oæã¤79G@¦2“‹d¥(UèI*r•°dâ%qdJU†’ò²å!{é³;s˜…¬¤&iLZò²˜#;¦ó¸K/%Fyñ"I¼¶žVÖ2˜‰H2œ`#ø Êpðƒ!a ?¸D˰ð…1œa _X¸äý®{I+Þµ¼ûåJpK©]£À-FÆãO˜Æ4®ð†qŒã»·Äò ªˆÓ›ÖK÷Ç(öçiÌbÆ1VðŒke /*ÇUÎðŽ»5dèæ×Çõ^’MÜ^ú²×¸ ÖÈ’ l9'/ØrRv³2Þg9[ÎÊu^–÷¥åþηm^Þ˜}þÝû²·¼hp“ל (¿ÙÆT¶s•ñ¼:=›y¨]s™Çh.9»’+´¡_LD'xÑŒ–ð­ã vÅ—ž4põ«iþR:Åžf+¨C=Q3˜ ¦®1ªS­áHSïÕÔµ´¬Ok" zÏGþ/ jD¯¹Ô¾žr°‚­êæ ùð>ö²7=hpÏ:ÓÅ-¶z[l1÷ÙÕÝ66§Û_s»ÝÐöóø”½er³[ݘæ÷¸“ýmÄž›ÛòÖwÀáÝo‚³ÚÞñN÷¼ ÞlfÓzÛ 4À×Y‡7\áßEr¾%îfßÛù¾5ÞñˆS|âå8½ þðƒg\œ$‡!ÈY.þrŠÛÜŽ ÿ¸ÉsŽòšoüâ3÷wÊ1~ô¡«\愹Åqîí„'}áðmzÐ.î—¯\êZ?yÖGNô¨¿ÛëX§9FÉ\õÐrìag:Ç©þt«Ã}ëWïºÛãÎözýëgÇíÛùþó©]íÃÕ{ÌéÞw¥£ð>6ß;ø¿çÝîmß¹Ø~÷ËZîk¯üÞÇúÌ[ÞåŠ×³àË®ùÒG¾ð><ÔG/úÁ;ýõs‡¼êÿMøÎþóˆüãCïûàÃ~ö¬ß½ë{O|¯£þ¥ÜØAçùÄ¿öÒ¿=ésoz¦Î?]s2¸3õ$>¾ù«Ïûéãéu×~þí§ùëÇ~ûçŸ|Û;¾wžëUPsŽx,Œ°Jtˆ ʃëφoÿbOø"PùðN÷"n†Kz^‹¡à¯¢ô ²èç‡\k‡§nn!°øØoé(Ïþdoù̧†îg%¨onhˆj&50ˆJ°±ì«óÏ%Pï-°é0P‡|‡Œ§}nÐ/hŒ6ÐŒêºôÏú QP ‰ð pI°(¶rŒ–qêñm Õïú¼póZ‡û®F§Œšð¶æ''ÄHõ°ƒªð¼„åð 1S¯¯¸ Ðp p¼zè~Ð ë qõV°þñ÷îP]Fgœ$c’¾, ßÐ/Ñï OÑä˜ïƒ©SÑW1ñ^Qqò:Qyìü‚‘þrÑ=ÍtrJª¾èsƯ“6Ñc³L§‘‡ Ÿ­¦êêƒlКš•âÃ1ûj1¹pÇÿ”Ê‹g¡h ¯h¯Ñ[± 럑«ÒN²ž*ªh oâêí)é±m±¥1Ϩ‘!/ªi•ë²j‹hæp!%­!3ÒÒoqö¢©Ûq"r«§eñõ±ùqñ1³/*(sæª ë²,òÒ!²SòÑ1aQ&5'§þ¶Šªn2' ò%gQ#‰M#£ò!UÌ#r'7²';ò'?2(aR¹)UÒ)÷q¯0O,r%ÓÑiO+yÒ*}²læl.é².íò.߇,YÒ,]Òm#ß’+“/ ³0 sÎŒ!1s1³1ó1!32%2³2-/+-»ò ÃÒ+­î2A34ßg2I³4Mó4Q35Us5Y³5]Ó4E36CsÕš²ôv±Dd37+ó5y³7}ó738…s8‰³8“5u39 ³%Q9Gó8¡3:¥s:©³:­ó:±3;µ³7³Œ nuº3<ål;ɳ<Íó<Ñ3=SS<Ù3 ¨þÓæ¦ü®±=éS=íó>ï“>Û“6ÇÒ6;S-…RuC?Ù?Q“@Å33=³?cò?õr-9q)ýAÃóA”Ë2wà3jäs+¡’ü¤D3+áÒC]ÑAô+Ùò)±r*Ý’D3.O´*cÔD5ó*oTFsÔF4-‡E1t/5ô,{t3-TE#”EAH•ËM²_ª6ƒB¡QI‹G³Ô½ü/²â «"Ê#ò¤þ\´±&P¯ì¦µÿ°@‘ôJ3ô=.«”q‡X‹¡js ò6éy$K0 Sç± UG·”Gá”JÝtN=‰çئ"k+" ð +þÄOYÃ(ÕG ] PgŠQWÔQÅRgiQÛtTS J«j®KÕcFS§B;uJA›D5IIÕPˆU}4E JáïK#*WÁSý‹FE$uÕ&Y*J-+X«ôBUHé´/•¼˜Ñõ­Ü3#”µÖâó? ÕKYµ®Ô‡¤Q·UKßÕ]tWå4“ðêIùt]õYó4©˜”.œ”±²¨RõUƒÌ00?T£BTaGÔEKt_ºT«òðƒ ÖµÒÙ˜µEEôE¶FVc–c7Vÿ•W±õQu^SÕd­”9urI3vG?Vfat"(t9åUXW¶^[ªÊ¨qh•gþ­UUo/ñ³hï’//dyjŸ“1ã¬JVhiíÒ@±V=­¶.CöakÖ=9½S­Ê´á¶–.³6mÕvm§ólç2lL‰âÌ8£vCeTt“mõvoù¶oýÖ’³ß,‡<ÝsjùÑmóowqqå nëôi‡³nû±aGÖqç–q5÷51wlûja›Ö®$÷@Çš Wi_v;7lósuöùRVg©5ŒF71£vVOwHµUe}Ôu%rfxãUQ©ég#'h]VB‡Wxy×He×y«5N“yQWy›^¯7g£—^“÷M4fƒ÷ki¶c6tE¶k=V|ý²þ\-}Ë׫@~Û×|½–|g´lÓ7T`ªÈÞ÷s»‹sh’R‘Òû^÷“˜V~Ï—~‘}Ø6(–Ø“ÉNa+"ÅOLóµ Çwdó—ƒù¡’S6 Ñ´Ò6Ø} IR·æKCñL¢Oð„¸7kûÀwyKR]aJRC¬ƒQØ{X•ždŠ®âY1âO5{‰÷y±×?oX‰%"€¡u$M8|íˆ)Hˆ½5‡P¶чg8‚k˜*Ad“Q‚æ)[n{wvWº5gÐ'kÀtg¬°~=XŒëx94Duâq$öw¯µg•ä^u8ƒUV¿UAqøŠ­øŽa¶ŒÇ7§þjPw¸‡i8ƒ&b?ubÏU‘·Jƒù‡G9Œ#™íøŠÕ·‘!¹”8•My}÷x~-¶ñø‹3Y—sùYÙ‘9󉙨4Ælb•}¶€ç˜ù…åL“{—e8–õønã7‹ówJw\u—'F×;O†›#±{Á–uóq xš%X–©ùƒQŒI‡21Llf1aøZѹ4ŹFî9›m<97Î09šWy˜—¸A…™“õŸ'“`E…›ó¯v[ÓxU*÷WdZ:ÕYòÌùdK5vZ’­Ø¡Iw¦"Óû ˆjÚ6›¬i¥ãdŸÑÓ$å¹ozŒ±q¡›¹VþQz¥˜/$j7úï,Zl4†Ÿ‹šd:::?ºC™¡§º¤ã¹š©‘Øž—:Ÿ‰vpO³ŸÉ¥½º¢3×5Ÿ9¼ršÙY§I–§UD\ÚvñtÈÙ›³œiZ¬áæ®ññ©‰ºtÈ EÙ•I9˜MڰŦӉ™ãº)lš›e™ y¹­Ù–qžk¹7›°K³/[³Ýz­G±¯´c˜´3[±ßYµ{¶×™–­Ù–?[´}™ª[ù—_Ùµo›¶3Fªw[·™·Û¸gÙ·K›³kÛ³—[¶“øy›: Ãu°q[šYû´¿7±‘ûµ¯û º¨i2)g[¹[»þ»µ;ÛÓ½Ÿ›ÈLg¿¯©eª¾cû» Û½ÏÛ‰¹›¸{[¿µ;ÓrÕN)º²Âô¾³;·º‰­z½M[Á{š{ÍRóGbÐ"¹œ»Í;À¼¹Ùû½œÃw.‘q²„oµ’C{ÄÁ;ÂÛ¸z©÷›S·Ã!\œ>' [ü±¥·z½—¿S¿WœÆI|iâ["ýø!ŽrÇ)»ÇeÜzÜÁw¹Æ›\ŸüÇ\{]|vÙ2ÆózƜʩÖÊ¿ʳ<¡Á®«üů¼Wa—N¢6¿WD›ß‹ÍËü…è’ÏÒ¼¿Ï¼ª·zÿiš®ýϺ5¬»¹Xù“Ë×\-æR2ßþv§ù<еœÇÉe»oÐaÓsu®:æšžS'n }[=8ó|σœÅå¼Ï‡ûßÎzr½“VŸÿpwK¯ÔË3Òßü;C|¿Y½¸üÓ³3 $«U“± ¹¥5m9ýxs÷ÎÝrmÝÕÚ7oWÖ…4C‡¤ñ× wÎFšól[ĉœÉ…öÕIWZ…6²}¢½FÔ= ½ÝÚu=B½Ó—VÈW;^ÑÐIñžÑGç¯.=ÜdÞÝý£«9¸¯™ÜüÈýÿâ{ÈGˆÎ ÞÎñÝeN]»üÙ3ÞÌ)Í-ã Ìýû¸£Ä7ÜÜC:Ù?ËCÞÏGžÑ¡ñÞKägÐèsžÁc¾Õ{Ø?œáÇÝ×þ¿O>¹žå}<ÚÏ…×W~Õ‹å#^ê£éÞ»›Ì´~ë¹¾ë½þëÁ>ìÅ~ìɾìÍþìÑ>íÕ~íÙ¾íÝþíá>îå~îé¾îíþîñ>ïõ~ïù¾ïýþï?ðð ¿ð ÿð?ññ¿ñÿñ!?ò%ò)¿ò-ÿò1?ó5ó9¿ó=ÿóA?ôEôI¿ôMÿôQ?õUõY¿õ]ÿõa?öeöi¿ömÿöq?÷u÷y¿÷}ÿ÷?ø…ø‰¿øÿø‘?ù•ù™¿ùÿù¡?úé> ;Bio-Graphics-2.39/t/data/wig_data.wig000444001750001750 13127512366325116 17553 0ustar00lsteinlstein000000000000variableStep chrom=I span=50 87 0.22 173 0.52 259 0.51 345 0.27 431 0.19 517 0.16 603 0.52 689 0.26 775 0.05 861 0.63 947 0.47 1033 0.26 1119 -0.05 1205 0.35 1291 -0.26 1377 0.08 1463 -0.36 1549 0.34 1635 0.01 1721 0.16 1807 -0.06 1893 -0.02 1979 0.35 2065 0.55 2151 0.25 2237 0.52 2330 0.52 2416 0.48 2502 0.38 2638 0.13 2724 0.17 2810 0.33 2896 0.23 2982 0.45 3068 0.34 3154 0.01 3240 -0.10 3335 0.22 3421 0.39 3507 0.12 3593 0.31 3679 0.12 3765 0.46 3851 0.58 3937 0.74 4023 0.42 4109 0.47 4195 0.50 4281 -0.29 4367 0.08 4453 0.28 4539 -0.07 4625 -0.20 4711 0.05 4797 0.12 4883 0.00 4969 0.48 5055 -0.10 5143 -0.19 5229 -0.39 5315 0.21 5405 0.19 5500 0.07 5586 0.05 5692 -0.12 5778 0.04 5864 0.22 5950 -0.22 6036 0.25 6122 0.20 6208 0.14 6294 -0.13 6380 0.11 6466 -0.29 6552 0.23 6638 -0.24 6724 0.30 6810 -0.08 6896 -0.05 6982 0.29 7068 -0.01 7154 0.27 7240 0.63 7326 -0.03 7412 0.12 7498 -0.14 7584 0.24 7670 -0.07 7756 0.25 7842 0.02 7928 -0.09 8014 0.02 8100 -0.03 8186 0.07 8272 -0.13 8358 0.05 8444 -0.17 8530 0.16 8616 -0.29 8702 -0.27 8788 0.08 8874 0.05 8960 0.03 9046 0.02 9132 0.33 9218 0.34 9304 0.34 9390 0.20 9476 -0.11 9648 -0.40 9734 0.15 9820 0.34 9906 0.20 10021 0.10 10107 -0.24 10193 0.09 10279 -0.10 10365 -0.06 10451 0.12 10537 0.26 10623 0.09 10709 0.02 10795 0.22 10881 0.21 10967 -0.37 11053 0.36 11139 0.12 11225 0.37 11311 0.15 11397 -0.27 11483 0.22 11573 0.12 11659 0.05 11745 0.06 11831 0.06 11917 -0.06 12003 0.09 12089 -0.18 12175 -0.12 12261 0.28 12347 0.18 12433 -0.03 12528 0.17 12614 0.31 12700 -0.04 12786 -0.02 12872 -0.09 12958 0.10 13044 0.12 13130 0.08 13216 1.07 13302 0.53 13388 0.39 13474 0.34 13560 0.20 13646 0.79 13732 -0.01 13818 0.16 13904 0.28 13990 0.15 14076 0.76 14162 0.68 14330 0.28 14416 -0.05 14502 -0.25 14588 -0.05 14674 0.05 14760 0.22 14846 -0.14 14932 0.20 15018 0.44 15104 0.54 15190 0.35 15278 0.61 15364 -0.01 15451 0.22 15537 0.37 15623 0.79 15709 0.66 15795 0.05 15881 0.27 15967 -0.04 16053 0.33 16139 0.17 16225 0.19 16311 -0.11 16397 0.26 16483 0.28 16569 0.12 16655 0.15 16741 0.07 16827 0.20 16913 0.55 16999 0.53 17085 0.50 17180 0.39 17266 0.08 17352 0.48 17438 0.35 17524 0.40 17610 -0.07 17696 0.23 17782 0.14 17868 0.17 17954 -0.13 18040 0.09 18126 -0.16 18212 -0.49 18298 0.20 18384 0.19 18471 -0.28 18557 0.18 18643 0.29 18729 0.21 18815 0.29 18913 0.44 18999 0.39 19085 -0.45 19171 0.15 19285 0.29 19371 0.06 19457 0.04 19543 0.34 19629 0.18 19715 0.45 19826 0.10 19912 0.17 19998 -0.01 20084 0.23 20170 0.62 20256 -0.01 20342 0.17 20428 0.05 20514 0.37 20600 0.05 20686 0.10 20772 0.06 20858 0.00 20944 -0.13 21030 0.12 21116 -0.04 21202 -0.06 21288 0.32 21376 0.39 21462 -0.35 21548 0.08 21634 -0.00 21720 -0.06 21806 0.39 21892 -0.03 21978 0.30 22064 0.13 22150 0.26 22236 0.38 22322 0.32 22408 0.50 22494 0.07 22580 0.19 22666 0.61 22752 0.26 22838 0.47 22924 0.29 23010 0.69 23096 0.22 23182 0.36 23268 0.25 23354 0.24 23440 0.30 23526 -0.19 23612 0.30 23698 -0.07 23787 -0.09 23873 -0.11 23959 0.18 24045 -0.03 24131 0.21 24217 0.22 24303 -0.11 24391 0.32 24477 0.24 24563 0.24 24649 0.16 24735 -0.01 24821 -0.11 24907 0.18 24993 -0.04 25079 0.34 25165 0.36 25251 -0.16 25337 -0.16 25423 -0.03 25509 -0.05 25595 0.09 25681 0.40 25769 -0.01 25855 0.40 25941 0.46 26027 0.10 26113 0.05 26199 0.25 26285 -0.16 26371 0.32 26457 0.08 26543 0.16 26629 0.25 26715 0.11 26801 0.12 26887 0.12 26973 0.22 27059 0.69 27145 0.27 27231 0.53 27317 0.23 27409 -0.07 27495 0.34 27581 0.12 27667 0.12 27753 0.34 27839 -0.56 27925 0.14 28012 -0.11 28098 -0.01 28184 0.26 28270 0.45 28356 0.22 28442 -0.17 28540 0.07 28627 0.20 28713 -0.31 28799 0.19 28885 0.27 28992 -0.02 29078 -0.05 29164 -0.15 29250 0.05 29336 0.03 29422 0.34 29508 0.07 29594 0.03 29680 0.02 29766 0.08 29852 0.14 29938 0.25 30024 0.28 30110 0.41 30196 0.33 30282 0.28 30368 0.29 30454 0.37 30540 0.42 30626 0.11 30712 -0.17 30798 -0.08 30884 -0.34 30970 -0.06 31056 0.08 31142 -0.07 31228 -0.01 31314 -0.02 31400 -0.22 31487 -0.34 31573 -0.15 31659 0.05 31745 0.06 31831 0.06 31917 0.03 32003 -0.02 32089 0.09 32175 0.30 32261 0.18 32347 0.17 32433 0.10 32519 -0.06 32605 -0.01 32691 0.06 32777 -0.03 32863 -0.05 32949 0.03 33035 0.42 33121 0.27 33207 0.38 33293 0.08 33379 0.20 33465 0.29 33560 -0.17 33646 0.20 33732 0.02 33818 -0.34 33904 0.04 33990 0.19 34076 0.01 34162 0.47 34248 0.22 34334 0.37 34420 0.16 34506 -0.10 34592 -0.12 34678 0.81 34764 -0.22 34850 0.04 34936 -0.05 35022 -0.05 35108 0.06 35194 0.35 35280 0.27 35366 0.11 35452 0.62 35538 0.34 35624 0.16 35710 0.25 35796 0.23 35882 0.36 35968 0.09 36054 0.24 36140 0.53 36226 0.15 36312 0.52 36398 0.19 36484 0.23 36570 0.10 36656 0.18 36742 -0.08 36828 -0.19 36914 -0.09 37000 0.06 37086 -0.22 37172 0.22 37258 0.21 37344 0.05 37430 0.05 37516 -0.15 37602 0.06 37688 0.22 37774 -0.31 37860 -0.19 37946 0.10 38032 -0.07 38118 0.10 38204 0.23 38290 0.13 38420 -0.27 38534 0.29 38620 0.16 38706 -0.10 38792 0.18 38878 0.06 38964 0.37 39050 0.49 39136 -0.07 39222 0.11 39308 -0.33 39394 -0.09 39480 -0.08 39566 0.05 39652 -0.23 39738 0.13 39824 0.07 39910 0.23 39996 0.07 40082 0.14 40168 -0.19 40254 0.22 40340 0.21 40426 0.19 40512 0.08 40598 0.03 40684 0.01 40770 0.32 40856 0.47 40942 0.04 41028 0.31 41114 0.21 41200 0.39 41286 -0.41 41372 0.11 41458 0.01 41544 0.13 41630 0.15 41716 -0.02 41802 0.12 41888 0.49 41974 0.12 42060 0.02 42146 0.13 42232 -0.05 42318 -0.03 42404 -0.08 42490 0.21 42576 0.23 42662 -0.36 42748 0.31 42834 0.06 42920 0.09 43006 -0.10 43092 0.05 43178 0.11 43264 0.00 43350 0.01 43436 0.11 43522 -0.03 43608 0.25 43694 -0.05 43780 0.08 43866 -0.12 43952 0.00 44038 0.34 44124 0.30 44210 -0.03 44296 -0.13 44382 -0.08 44468 0.12 44554 -0.27 44640 -0.01 44726 0.35 44812 0.02 44898 0.27 44984 0.35 45070 0.60 45156 0.46 45242 0.17 45328 0.09 45414 0.25 45500 0.12 45586 0.11 45672 -0.22 45759 0.24 45845 0.07 45931 0.69 46017 0.03 46103 0.03 46189 -0.11 46275 0.14 46361 0.47 46447 0.30 46533 0.18 46619 0.06 46705 0.23 46791 -0.01 46877 0.05 46963 0.10 47049 0.22 47135 0.28 47221 0.31 47307 0.26 47393 0.18 47479 0.37 47565 0.25 47651 0.34 47737 0.00 47823 -0.12 47909 0.43 47995 0.10 48091 0.45 48177 0.40 48263 0.16 48349 0.05 48435 -0.44 48521 0.14 48607 0.30 48719 0.14 48832 0.30 48918 0.26 49004 0.04 49171 -0.13 49257 -0.26 49343 -0.05 49429 -0.52 49515 -0.34 49601 -0.06 49687 0.26 49773 0.25 49874 0.42 49960 0.02 50046 0.34 50133 0.04 50219 0.42 50305 0.28 50393 0.55 50479 -0.23 50565 0.28 50715 0.15 50801 -0.35 50887 0.12 50973 0.29 51059 0.00 51145 0.34 51237 0.07 51331 -0.73 51417 -0.02 51503 -0.09 51589 -0.27 51675 -0.22 51761 0.04 51847 0.11 51933 -0.07 52019 -0.12 52105 -0.02 52191 -0.05 52277 0.17 52363 -0.23 52449 0.10 52535 0.06 52621 0.07 52714 0.39 52800 0.27 52890 0.10 52976 0.32 53062 -0.02 53148 0.15 53234 -0.01 53320 0.03 53406 0.12 53492 0.11 53578 -0.06 53664 0.79 53787 0.15 53873 0.10 53959 0.08 54045 -0.16 54131 -0.12 54217 -0.38 54303 -0.22 54389 0.12 54475 0.05 54561 0.12 54649 0.19 54747 0.19 54833 -0.18 54919 0.12 55005 0.24 55091 0.01 55191 -0.39 55277 -0.24 55363 -0.04 55449 0.18 55535 -0.14 55621 -0.15 55707 0.12 55793 0.20 55879 -0.15 55965 0.41 56051 0.29 56137 0.06 56223 -0.14 56309 0.08 56395 0.02 56481 -0.02 56567 -0.08 56653 -0.28 56739 0.40 56825 0.10 56911 0.20 56997 -0.15 57083 0.02 57169 -0.10 57255 -0.27 57341 -0.28 57427 -0.05 57513 -0.32 57599 -0.04 57685 -0.07 57771 0.05 57857 0.16 57983 0.17 58069 0.01 58155 0.29 58241 0.19 58327 -0.08 58413 0.63 58499 -0.12 58585 -0.05 58671 -0.08 58757 0.17 58843 0.18 58929 0.23 59015 0.22 59101 -0.07 59187 -0.08 59273 -0.16 59359 0.03 59445 -0.06 59531 0.53 59617 0.07 59703 0.29 59789 0.15 59875 0.05 59961 0.23 60047 0.02 60133 -0.05 60219 0.06 60305 -0.17 60391 0.25 60477 -0.00 60563 -0.17 60649 0.28 60735 0.09 60821 0.41 60907 -0.13 60993 -0.07 61079 -0.25 61165 -0.19 61251 -0.03 61337 -0.05 61423 -0.20 61509 0.25 61595 0.10 61681 0.09 61767 0.24 61853 -0.03 61939 -0.37 62025 0.01 62111 0.34 62234 0.13 62320 0.09 62406 0.29 62492 0.15 62578 -0.08 62664 0.10 62750 -0.18 62836 -0.10 62922 -0.06 63008 0.24 63107 -0.03 63193 -0.03 63279 0.16 63365 0.51 63451 0.44 63537 0.29 63623 0.17 63709 0.06 63795 -0.09 63881 -0.10 63967 -0.03 64053 0.11 64139 -0.42 64225 0.02 64311 -0.10 64397 0.05 64483 -0.19 64569 -0.26 64655 -0.26 64741 -0.16 64827 -0.10 64913 -0.06 64999 0.23 65085 0.13 65171 0.45 65257 0.26 65367 0.28 65453 0.24 65539 0.18 65625 0.44 65711 0.27 65797 -0.09 65883 -0.01 65969 0.02 66055 -0.07 66141 0.23 66227 0.35 66313 0.28 66399 0.38 66485 0.25 66571 0.19 66657 0.36 66743 0.48 66829 0.26 66915 0.51 67001 0.13 67087 0.54 67173 -0.07 67259 0.23 67345 0.05 67431 0.39 67517 0.06 67603 0.23 67689 0.17 67775 -0.01 67861 0.16 67947 0.13 68033 -0.05 68119 -0.07 68205 0.44 68291 -0.33 68377 -0.11 68463 -0.02 68549 0.05 68635 0.42 68721 0.51 68807 0.17 68893 0.20 68979 -0.28 69065 0.01 69151 -0.04 69237 0.03 69323 0.07 69409 0.16 69495 0.10 69581 -0.04 69667 0.29 69758 0.30 69844 0.32 69930 0.01 70016 0.70 70102 0.44 70188 0.36 70274 0.28 70360 0.37 70446 0.31 70532 0.32 70618 0.09 70704 0.02 70790 0.12 70881 -0.03 70967 0.33 71053 -0.06 71139 0.02 71225 0.02 71311 0.25 71397 0.15 71483 0.06 71569 0.05 71655 0.43 71741 0.44 71827 0.21 71913 0.04 71999 0.12 72085 -0.02 72171 0.47 72257 0.37 72343 0.28 72429 0.40 72515 0.14 72601 0.04 72687 0.37 72773 0.04 72859 -0.04 72945 0.35 73031 0.17 73117 0.38 73203 0.09 73290 0.35 73379 0.24 73465 0.45 73551 0.46 73637 -0.35 73723 0.26 73809 0.26 73895 -0.14 73981 -0.20 74096 0.16 74182 0.17 74268 -0.37 74354 0.00 74440 0.01 74526 -0.19 74612 0.03 74698 0.06 74784 0.06 74870 -0.13 74956 -0.01 75042 -0.08 75128 0.06 75214 0.24 75300 0.00 75386 0.12 75472 0.11 75558 0.27 75644 -0.07 75730 0.19 75816 0.24 75902 0.25 75988 0.01 76074 0.17 76160 0.15 76246 -0.07 76332 0.21 76429 -0.03 76515 0.07 76601 -0.12 76689 -0.17 76775 0.20 76861 0.25 76947 0.23 77033 -0.06 77119 0.01 77205 0.19 77308 0.27 77394 0.38 77511 0.04 77597 0.12 77683 0.25 77769 0.11 77855 0.32 77941 0.15 78027 0.12 78113 -0.09 78199 0.25 78318 0.17 78468 -0.16 78554 0.36 78640 0.30 78726 -0.13 78872 0.49 78970 0.33 79056 0.04 79142 0.08 79228 0.15 79314 -0.03 79400 -0.16 79486 -0.01 79573 0.58 79659 0.24 79745 0.36 79831 0.48 79947 0.20 80033 -0.10 80119 0.45 80205 0.32 80291 0.06 80377 0.23 80463 0.06 80549 0.18 80639 0.55 80725 0.92 80811 0.51 80897 -0.04 80983 0.23 81069 0.10 81159 0.28 81245 0.04 81335 0.49 81421 0.19 81507 0.07 81600 0.12 81707 0.25 81793 0.49 81879 0.05 81965 0.06 82051 -0.08 82137 -0.01 82223 0.08 82309 0.06 82403 0.38 82489 0.13 82575 -0.02 82661 0.02 82747 0.19 82833 -0.21 82919 0.08 83005 0.26 83111 0.37 83197 -0.02 83283 -0.41 83369 -0.05 83455 0.39 83541 0.15 83627 0.26 83713 0.19 83799 -0.31 83885 0.35 83997 0.04 84099 0.36 84185 -0.23 84271 0.06 84357 0.14 84443 0.29 84529 0.19 84615 -0.07 84701 -0.08 84787 0.35 84873 0.08 84959 0.35 85045 0.01 85131 -0.31 85217 -0.26 85303 0.05 85389 0.02 85475 -0.09 85561 -0.07 85647 0.19 85733 -0.16 85819 0.01 85905 0.09 85991 0.27 86077 0.59 86163 0.08 86249 0.34 86335 0.03 86421 0.04 86507 0.18 86593 0.02 86679 0.26 86765 0.53 86851 0.06 86952 0.05 87038 -0.07 87124 -0.37 87210 0.07 87330 0.23 87416 0.10 87502 0.27 87588 0.28 87674 -0.00 87760 0.23 87846 -0.07 87932 -0.05 88019 -0.27 88105 -0.08 88191 -0.19 88277 -0.11 88363 0.37 88449 0.42 88535 0.22 88621 -0.00 88707 -0.45 88793 0.13 88879 -0.03 88965 0.08 89051 -0.10 89137 0.44 89237 0.10 89323 0.08 89409 0.05 89495 0.05 89581 0.41 89768 0.48 89887 0.18 89973 0.24 90059 -0.01 90145 0.30 90237 0.26 90323 0.12 90409 0.16 90495 0.26 90581 0.32 90667 0.03 90753 -0.15 90839 0.07 90925 0.43 91012 0.28 91098 0.00 91184 -0.54 91273 -0.05 91359 0.08 91445 0.06 91531 0.34 91617 0.03 91703 0.14 91789 0.11 91875 0.25 91961 0.18 92047 0.32 92133 -0.08 92219 0.12 92305 0.04 92391 -0.04 92477 0.23 92563 0.29 92649 0.35 92735 0.26 92821 0.18 92907 0.09 92995 0.35 93081 0.60 93167 0.63 93253 0.25 93339 0.21 93425 0.50 93511 0.01 93597 0.19 93683 0.32 93769 0.26 93855 0.14 93941 0.31 94027 0.30 94113 0.40 94199 0.29 94285 0.50 94371 0.22 94457 0.32 94543 0.19 94629 -0.09 94715 0.07 94801 0.19 94887 -0.25 94973 -0.03 95059 0.17 95145 0.04 95231 0.44 95324 0.01 95410 -0.14 95496 -0.30 95582 0.10 95668 -0.33 95754 0.03 95863 -0.20 95949 0.20 96035 0.12 96121 -0.02 96207 -0.02 96293 0.41 96379 0.40 96466 0.10 96552 0.29 96638 -0.04 96726 0.77 96812 0.15 96898 0.10 96984 0.41 97070 0.30 97156 0.47 97242 0.13 97328 0.59 97415 0.24 97501 -0.11 97587 0.21 97673 0.05 97759 -0.07 97845 0.10 97931 -0.20 98017 0.15 98103 -0.27 98189 -0.20 98275 0.09 98361 0.17 98447 0.13 98533 0.60 98619 0.29 98705 0.16 98791 -0.11 98877 0.35 98963 0.14 99049 0.15 99135 0.52 99221 -0.00 99307 0.30 99393 0.05 99479 -0.07 99565 0.11 99651 0.15 99737 -0.01 99823 -0.04 99909 -0.30 99995 0.20 100081 -0.19 100167 0.33 100253 0.05 100339 0.27 100425 0.29 100511 0.43 100597 -0.04 100683 0.12 100769 0.16 100855 0.13 100941 0.01 101027 0.21 101149 0.50 101244 -0.15 101343 0.22 101429 -0.08 101515 0.21 101601 0.07 101687 0.32 101773 0.15 101859 -0.14 101945 -0.09 102031 0.01 102119 0.21 102205 -0.40 102313 0.26 102410 0.04 102496 0.22 102582 0.12 102668 0.57 102754 0.40 102840 0.22 102926 0.02 103012 0.21 103098 0.02 103184 0.26 103270 0.13 103356 0.05 103442 0.06 103528 -0.38 103614 -0.63 103700 -0.47 103786 0.26 103873 -0.05 103959 -0.05 104045 -1.38 104229 0.18 104316 0.18 104402 -0.02 104488 -0.03 104574 -0.23 104660 -0.08 104746 -0.11 104832 -0.25 104918 0.01 105004 0.01 105090 0.24 105176 0.20 105262 -0.08 105348 -0.23 105434 0.13 105520 0.16 105606 0.19 105692 0.18 105778 0.27 105865 0.14 105960 -0.15 106046 0.27 106132 0.27 106218 -0.29 106304 0.13 106390 0.29 106476 0.24 106562 0.38 106648 -0.04 106734 -0.03 106820 -0.02 106906 -0.14 106992 0.04 107078 0.04 107164 -0.09 107250 0.62 107336 0.05 107422 0.39 107508 -0.01 107594 0.28 107680 0.40 107766 0.31 107852 0.52 107938 0.36 108024 0.12 108110 0.46 108205 0.47 108291 0.31 108377 0.50 108463 0.43 108549 0.41 108635 0.36 108721 0.20 108807 -0.03 108893 0.28 108979 0.04 109065 -0.52 109151 0.06 109237 0.08 109323 0.22 109409 0.47 109495 0.25 109581 -0.01 109667 0.14 109753 -0.15 109839 -0.05 109925 0.14 110011 0.32 110097 0.06 110183 0.12 110269 -0.03 110355 0.36 110441 0.21 110527 0.70 110613 0.54 110699 0.63 110788 0.79 110874 0.63 110960 0.51 111046 0.31 111132 0.37 111218 0.05 111304 0.13 111390 0.30 111476 0.16 111562 0.36 111648 0.51 111734 -0.06 111820 0.09 111906 0.25 111992 0.05 112078 0.14 112164 -0.03 112250 0.23 112336 0.35 112422 0.08 112508 0.09 112594 -0.03 112680 0.14 112766 -0.06 112852 -0.27 112938 0.61 113024 -0.13 113110 0.41 113196 0.33 113282 -0.11 113368 0.07 113454 0.14 113540 -0.07 113626 -0.07 113712 0.20 113798 0.08 113884 0.46 113970 0.21 114056 0.07 114142 -0.08 114228 0.02 114314 -0.06 114400 0.23 114486 0.63 114572 -0.03 114658 0.06 114744 0.06 114830 0.25 114916 -0.59 115002 0.02 115088 -0.17 115174 0.14 115260 -0.04 115346 0.14 115446 0.36 115532 -0.03 115618 0.23 115704 -0.00 115790 0.17 115876 -0.06 115963 0.14 116049 -0.05 116135 0.31 116221 0.08 116307 0.04 116393 0.29 116479 0.07 116565 0.16 116651 0.38 116737 0.11 116823 0.32 116909 0.56 116995 0.49 117081 0.05 117167 0.73 117253 0.45 117339 0.52 117425 0.12 117511 0.19 117597 -0.11 117683 -0.01 117769 -0.14 117855 -0.37 117941 -0.04 118027 -0.59 118113 -0.05 118199 -0.25 118285 -0.11 118371 0.18 118457 0.00 118543 -0.17 118629 0.25 118715 -0.37 118801 0.09 118887 0.20 118973 0.01 119059 0.08 119145 -0.07 119231 0.47 119317 0.23 119403 0.21 119489 -0.06 119575 0.03 119661 0.21 119747 -0.14 119833 0.67 119919 0.12 120005 0.01 120091 -0.09 120177 0.04 120263 0.12 120349 -0.07 120435 0.02 120521 0.22 120607 0.21 120693 0.34 120779 0.37 120865 0.44 120951 0.38 121037 0.06 121123 -0.10 121209 -0.18 121295 0.03 121381 -0.50 121467 0.22 121553 0.42 121639 0.08 121725 0.31 121811 -0.04 121897 -0.04 121983 0.07 122069 0.05 122155 0.21 122241 0.19 122327 -0.21 122413 1.21 122499 0.36 122585 0.05 122671 0.05 122757 0.16 122843 -0.23 122932 0.41 123018 -0.05 123104 0.36 123190 0.06 123276 -0.15 123362 -0.14 123448 0.02 123534 0.32 123620 0.12 123706 0.01 123792 0.24 123878 0.09 123964 0.28 124050 0.35 124136 0.12 124222 -0.05 124308 0.20 124394 -0.10 124480 0.01 124566 0.12 124652 0.49 124738 0.16 124824 0.24 124910 0.25 124998 0.07 125084 0.21 125170 0.11 125256 0.21 125342 -0.15 125428 0.39 125514 -0.08 125600 0.05 125686 -0.01 125772 0.04 125858 -0.25 125944 -0.34 126030 -0.19 126123 -0.32 126209 0.10 126310 0.42 126396 -0.52 126482 0.38 126568 0.13 126654 -0.15 126740 -0.41 126826 -0.29 126912 -0.39 126998 -0.22 127084 0.15 127170 0.01 127256 -0.13 127356 0.12 127442 -0.31 127528 -0.02 127614 -0.16 127700 0.26 127786 -0.08 127872 0.03 127958 0.38 128044 0.36 128130 0.22 128216 0.46 128302 0.18 128388 0.24 128474 0.51 128560 0.26 128646 0.15 128732 0.13 128818 0.27 128904 0.35 128990 0.22 129076 0.21 129162 0.35 129248 0.41 129334 0.31 129420 0.09 129506 0.04 129592 0.36 129678 0.23 129764 0.04 129850 -0.02 129936 0.16 130022 -0.15 130108 0.16 130194 0.41 130280 0.14 130366 0.38 130452 0.41 130538 0.35 130624 0.43 130710 0.54 130796 0.55 130882 0.37 130968 0.59 131054 0.21 131140 -0.00 131226 0.03 131312 0.05 131398 0.18 131484 0.04 131570 -0.03 131656 0.14 131742 0.03 131828 -0.01 131914 0.05 132000 0.04 132086 0.02 132172 0.25 132258 0.54 132344 0.48 132430 0.28 132516 0.32 132602 0.59 132688 0.59 132809 0.32 132895 -0.15 132981 0.42 133081 0.70 133170 0.36 133256 0.09 133342 0.36 133428 0.03 133514 0.23 133600 0.26 133686 0.15 133772 -0.06 133858 0.17 133944 -0.27 134030 -0.05 134116 0.01 134202 -0.14 134288 -0.03 134374 0.08 134460 0.31 134546 0.31 134632 0.22 134718 -0.18 134804 0.21 134890 0.28 134976 -0.04 135062 0.21 135148 0.11 135234 0.21 135320 0.06 135406 0.10 135492 -0.11 135578 0.17 135664 -0.21 135750 0.25 135836 0.03 135922 0.47 136008 0.22 136094 0.07 136180 0.41 136266 0.26 136352 0.09 136438 0.14 136524 0.44 136610 -0.07 136696 0.25 136782 0.92 136868 0.59 136954 0.41 137040 0.15 137126 -0.09 137212 -0.08 137298 0.31 137384 0.32 137470 -0.07 137556 0.15 137642 -0.10 137728 0.12 137814 0.26 137900 0.13 137986 -0.09 138072 0.12 138158 0.38 138244 -0.24 138330 0.22 138416 0.14 138502 -0.08 138588 0.10 138674 0.01 138760 0.02 138846 0.10 138932 -0.16 139018 0.21 139104 -0.08 139190 -0.13 139276 -0.37 139362 -0.08 139448 0.18 139534 0.13 139620 -0.01 139706 -0.17 139792 -0.24 139878 -0.06 139964 0.03 140050 0.03 140136 0.18 140222 -0.03 140308 -0.11 140394 -0.16 140480 0.29 140566 -0.34 140652 -0.44 140738 -0.03 140824 -0.06 140910 -0.29 140996 -0.17 141082 -0.04 141168 0.05 141254 -0.05 141340 -0.17 141426 0.13 141512 0.14 141598 0.11 141684 0.08 141770 -0.39 141856 0.12 141942 -0.19 142028 -0.21 142114 0.20 142201 -0.34 142287 -0.14 142373 -0.01 142459 -0.18 142545 -0.10 142631 -0.10 142717 -0.56 142803 -0.09 142889 -0.19 142975 -0.36 143061 -0.02 143147 -0.39 143233 -0.42 143319 -0.57 143405 -0.49 143491 -0.14 143577 -0.00 143663 0.02 143749 -0.04 143836 0.03 143922 -0.18 144008 0.12 144094 0.24 144180 -0.18 144266 -0.13 144352 -0.18 144438 -0.38 144524 -0.20 144610 0.19 144696 -0.15 144782 -0.17 144868 -0.08 144954 -0.21 145040 -0.29 145141 0.01 145227 -0.18 145313 0.34 145399 -0.06 145485 0.24 145571 0.39 145657 -0.00 145743 -0.20 145829 -0.01 145915 -0.33 146001 -0.05 146087 -0.06 146174 0.08 146260 0.02 146346 -0.21 146432 0.12 146518 -0.12 146604 -0.06 146690 -0.36 146776 -0.27 146862 -0.07 146948 -0.18 147034 -0.41 147120 -0.25 147206 0.07 147292 -0.30 147378 -0.34 147464 -0.17 147550 0.02 147636 -0.28 147722 -0.27 147808 -0.12 147894 -0.52 147980 -0.29 148066 -0.35 148152 -0.06 148238 -0.16 148324 -0.34 148410 -0.01 148496 0.24 148582 -0.07 148668 0.29 148754 -0.08 148840 -0.35 148926 0.13 149012 -0.14 149098 -0.08 149184 -0.11 149270 0.18 149356 -0.19 149442 -0.39 149528 0.03 149614 -0.41 149700 0.09 149786 -0.25 149872 -0.04 149958 -0.09 150044 -0.07 150130 -0.00 150216 -0.29 150302 0.05 150388 -0.35 150474 -0.39 150560 -0.20 150646 -0.23 150732 -0.62 150818 -0.15 150904 -0.08 150990 -0.10 151076 -0.12 151162 -0.38 151248 -0.18 151334 -0.42 151420 -0.38 151506 -0.22 151592 0.05 151678 -0.15 151764 -0.02 151850 0.12 151936 0.12 152022 0.56 152108 -0.16 152194 -0.03 152280 0.01 152366 -0.30 152452 -0.03 152538 0.05 152624 0.05 152710 -0.33 152796 -0.14 152882 0.03 152968 0.28 153054 -0.38 153140 0.15 153226 0.07 153312 -0.02 153398 -0.20 153484 0.12 153570 -0.11 153656 -0.06 153742 0.29 153828 0.14 153914 0.03 154000 0.26 154086 0.03 154172 -0.02 154258 -0.25 154344 -0.27 154430 0.15 154516 -0.00 154602 -0.46 154688 -0.06 154774 0.28 154860 -0.15 154946 -0.19 155032 -0.05 155118 0.09 155222 0.63 155308 0.32 155394 0.03 155535 0.68 155621 -0.18 155707 0.25 155793 -0.03 155879 0.01 155965 -0.01 156051 0.18 156137 0.14 156223 0.34 156309 0.14 156395 0.25 156481 0.20 156567 0.40 156653 -0.22 156739 -0.21 156825 -0.14 156911 0.24 156997 -0.05 157083 -0.07 157169 0.10 157255 0.56 157341 0.43 157438 0.33 157524 0.30 157611 0.20 157697 0.19 157783 0.14 157869 -0.02 157955 -0.30 158041 0.02 158130 -0.14 158216 0.92 158302 0.23 158388 -0.05 158474 0.04 158560 0.06 158646 0.18 158732 -0.28 158821 0.34 158907 -0.06 158993 0.05 159103 -0.12 159189 -0.22 159275 0.18 159361 0.17 159447 0.30 159533 0.20 159619 0.00 159714 0.25 159800 0.18 159886 0.04 159972 -0.05 160062 -0.00 160148 0.18 160234 0.50 160320 0.35 160406 0.03 160492 0.16 160578 0.10 160664 0.33 160750 0.14 160836 -0.05 160922 -0.21 161025 0.14 161127 0.20 161216 -0.34 161302 0.43 161388 0.32 161474 0.04 161560 -0.08 161646 -0.29 161732 -0.19 161818 0.26 161904 0.12 161990 0.10 162076 0.12 162162 0.19 162248 -0.00 162334 -0.05 162420 0.09 162506 0.44 162592 -0.04 162678 -0.11 162764 -0.04 162851 0.46 162937 0.27 163028 0.34 163114 0.27 163200 0.47 163286 0.15 163372 -0.21 163458 -0.11 163544 0.00 163630 -0.16 163716 0.05 163802 -0.04 163888 0.10 163974 -0.22 164060 -0.29 164146 -0.43 164232 -0.19 164318 0.20 164404 -0.07 164490 -0.10 164576 -0.29 164662 -0.04 164748 -0.11 164834 -0.04 164920 0.10 165006 0.06 165092 -0.35 165178 0.08 165264 -0.05 165350 -0.10 165436 -0.35 165522 -0.02 165608 0.05 165694 -0.03 165783 0.28 165869 -0.38 165955 -0.34 166041 -0.16 166127 0.17 166213 0.00 166299 0.16 166385 -0.08 166471 0.12 166557 0.72 166651 0.25 166737 0.24 166823 -0.15 166909 0.14 166995 0.04 167081 0.31 167167 0.14 167253 -0.29 167339 -0.18 167425 -0.13 167511 -0.18 167597 -0.22 167683 -0.05 167769 0.22 167855 0.16 167941 0.34 168027 0.34 168113 0.18 168199 0.22 168295 0.17 168388 0.16 168477 0.35 168563 -0.05 168649 0.36 168735 0.13 168821 0.35 168907 -0.03 168993 0.18 169079 0.25 169165 0.09 169251 0.14 169337 0.30 169423 0.20 169509 0.15 169595 0.25 169681 -0.40 169767 0.03 169853 0.04 169939 0.08 170025 0.13 170111 0.15 170197 -0.24 170283 -0.11 170369 -0.09 170455 -0.03 170547 -0.12 170633 0.07 170719 0.17 170805 0.06 170891 0.01 170977 0.27 171063 -0.18 171149 -0.18 171235 -0.07 171321 0.00 171407 0.20 171493 -0.12 171579 -0.14 171665 0.07 171751 0.09 171837 -0.17 171923 -0.31 172009 0.14 172095 0.09 172181 0.61 172280 0.38 172366 -0.02 172452 0.22 172538 0.08 172624 -0.04 172710 -0.02 172796 0.12 172882 0.07 172968 0.09 173054 0.01 173140 0.41 173226 0.32 173312 0.33 173398 0.26 173484 0.10 173570 0.27 173656 0.43 173742 -0.27 173828 0.46 173914 0.25 174000 0.31 174086 0.39 174172 0.24 174258 -0.04 174344 0.23 174430 0.41 174516 0.15 174602 -0.26 174688 0.35 174774 -0.02 174860 -0.26 174946 0.23 175032 0.29 175118 0.14 175204 -0.07 175290 -0.08 175376 -0.26 175462 -0.12 175548 0.01 175634 0.10 175720 -0.16 175806 -0.09 175892 0.01 175978 0.28 176064 0.05 176150 0.10 176236 -0.09 176322 -0.11 176408 0.59 176495 0.17 176581 0.11 176667 -0.18 176753 0.22 176839 -0.06 176925 -0.13 177011 -0.05 177097 -0.03 177183 0.16 177269 -0.09 177355 0.24 177441 0.05 177527 -0.12 177617 -0.01 177703 0.15 177789 0.18 177875 0.00 177961 0.08 178047 0.16 178133 0.19 178219 0.15 178305 0.08 178391 0.09 178477 0.11 178563 -0.09 178649 0.20 178765 0.00 178851 0.39 178937 0.41 179023 0.32 179109 0.48 179195 0.08 179281 0.14 179367 0.35 179453 0.63 179539 0.17 179625 0.23 179711 0.14 179797 -0.00 179883 0.05 179971 0.17 180057 -0.11 180143 0.01 180229 0.38 180315 0.02 180401 0.06 180493 0.33 180579 0.20 180665 0.02 180751 0.06 180837 0.05 180923 0.08 181009 0.24 181095 0.28 181185 0.46 181271 0.18 181357 0.24 181443 0.18 181531 -0.12 181620 0.50 181706 0.10 181792 -0.00 181878 -0.02 181964 -0.34 182050 -0.01 182136 -0.04 182222 -0.12 182308 0.06 182394 -0.02 182480 0.06 182566 0.17 182652 0.04 182738 0.20 182824 0.22 182910 0.52 182996 0.20 183082 0.30 183168 0.17 183254 0.00 183340 0.10 183426 0.14 183512 0.18 183598 0.01 183684 -0.04 183770 -0.08 183856 -0.22 183942 0.07 184028 0.61 184114 -0.17 184200 0.24 184286 -0.08 184372 0.74 184458 0.27 184573 -0.32 184659 0.41 184756 0.35 184842 0.36 184928 0.30 185014 0.58 185100 0.22 185186 0.13 185272 0.32 185358 0.30 185446 -0.01 185536 0.28 185622 0.32 185708 0.10 185794 0.16 185880 0.15 185966 0.14 186052 0.08 186138 -0.02 186224 -0.27 186310 -0.08 186396 0.02 186482 -0.02 186568 0.06 186654 0.15 186740 -0.26 186826 -0.25 186912 -0.26 186998 -0.26 187084 -0.62 187170 -0.38 187256 0.06 187342 -0.29 187428 0.08 187514 0.07 187600 0.28 187686 -0.08 187772 0.10 187858 0.18 187944 -0.18 188030 -0.10 188116 0.09 188202 0.07 188302 -0.03 188388 -0.08 188474 0.22 188560 0.10 188646 -0.02 188732 0.41 188819 0.38 188915 -0.28 189001 -0.52 189087 -0.17 189173 -0.20 189259 0.03 189354 0.10 189440 0.16 189549 0.01 189635 -0.08 189721 0.14 189807 0.19 189893 0.37 189979 0.34 190065 0.32 190151 0.19 190237 -0.03 190323 0.15 190409 -0.08 190495 0.10 190581 0.17 190667 -0.04 190753 0.30 190839 0.16 190925 0.10 191011 0.12 191097 0.30 191183 0.27 191269 0.20 191355 0.31 191441 0.18 191527 -0.31 191613 -0.19 191699 0.02 191785 -0.36 191871 -0.13 191957 -0.27 192043 0.26 192129 0.06 192215 0.15 192301 0.38 192387 0.38 192473 0.22 192559 0.03 192652 -0.05 192738 0.07 192824 -0.01 192910 -0.06 192996 0.14 193082 -0.07 193168 -0.14 193281 0.59 193367 0.07 193537 -0.35 193623 -0.03 193709 -0.00 193795 0.06 193881 -0.11 193967 -0.19 194053 0.11 194139 -0.06 194225 0.26 194311 0.12 194400 0.05 194486 0.08 194572 -0.23 194658 0.46 194744 0.19 194830 0.18 194916 0.04 195002 0.27 195088 -0.02 195174 0.16 195260 0.50 195346 -0.04 195432 -0.12 195518 0.04 195604 -0.54 195692 -0.02 195814 -0.56 195900 0.11 196005 0.63 196091 0.19 196177 -0.04 196263 -0.08 196349 0.08 196435 0.18 196521 0.04 196619 -0.08 196705 0.38 196791 0.21 196885 -0.08 196971 0.98 197057 0.87 197143 0.56 197229 -0.11 197315 0.35 197401 0.38 197487 0.13 197573 0.33 197659 -0.03 197745 0.13 197831 -0.52 197917 -0.25 198003 -0.30 198089 -0.21 198175 0.27 198262 0.21 198348 0.23 198434 0.19 198520 0.05 198606 0.19 198692 0.17 198778 0.22 198864 0.44 198960 1.01 199046 0.05 199132 -0.09 199218 0.04 199304 -0.14 199390 0.59 199476 0.14 199562 -0.09 199648 0.36 199734 0.11 199820 0.04 199906 0.05 199992 0.01 200078 0.11 200164 0.28 200250 0.04 200336 0.00 200422 0.11 200508 0.27 200594 0.07 200680 -0.02 200766 0.70 200852 0.06 200942 0.09 201030 0.54 201116 0.47 201202 -0.08 201288 -0.11 201374 -0.12 201460 -0.46 201546 -0.03 201632 0.07 201774 0.38 201860 -0.32 201962 0.19 202051 0.24 202137 0.22 202223 -0.03 202309 -0.22 202395 0.45 202481 0.47 202567 0.12 202653 0.15 202739 -0.06 202825 0.31 202911 -0.24 202997 -0.42 203083 0.20 203169 -0.14 203255 -0.23 203341 0.46 203427 -0.16 203553 0.20 203710 0.04 203796 -0.10 203882 0.05 203970 0.08 204056 0.16 204144 0.05 204230 -0.01 204316 -0.35 204402 -0.04 204488 -0.31 204574 -0.26 204660 0.09 204746 0.07 204832 0.12 204918 0.64 205004 0.19 205090 0.26 205176 -0.11 205262 0.03 205348 -0.23 205434 0.34 205520 -0.04 205606 -0.03 205692 0.25 205778 0.37 205864 0.59 205950 0.38 206036 0.19 206122 0.63 206208 0.90 206294 0.88 206380 0.20 206466 0.04 206552 0.13 206646 0.23 206732 0.08 206818 0.24 206904 -0.05 206993 0.52 207079 0.12 207165 0.09 207251 0.17 207337 0.12 207423 0.14 207510 0.27 207596 0.15 207682 -0.13 207768 0.13 207854 0.18 207940 0.33 208026 0.32 208137 0.42 208223 0.01 208309 0.23 208395 -0.20 208481 0.29 208581 0.28 208667 -0.03 208753 -0.23 208847 0.15 208933 0.11 209019 0.25 209110 0.14 209196 0.06 209282 0.01 209368 0.21 209454 0.03 209540 0.00 209626 0.10 209712 0.14 209798 0.04 209884 -0.12 209970 -0.10 210056 -0.29 210142 -0.13 210228 -0.09 210314 0.15 210403 -0.03 210489 0.09 210575 -0.33 210661 -0.17 210747 0.30 210833 0.27 210919 0.48 211006 0.16 211092 0.31 211178 0.24 211264 0.08 211350 0.52 211436 0.27 211522 -0.24 211608 -0.05 211694 0.21 211781 -0.29 211867 0.11 211953 0.16 212039 0.12 212125 0.22 212211 0.15 212297 0.23 212383 0.26 212469 -0.01 212555 0.07 212643 -0.17 212729 0.29 212815 0.23 212901 -0.14 212988 -0.03 213074 0.86 213160 -0.10 213246 -0.01 213332 0.14 213448 -0.11 213534 -0.16 213620 0.01 213706 0.20 213792 0.23 213878 0.23 213964 0.06 214050 0.11 214136 -0.17 214224 0.15 214310 0.01 214396 0.20 214482 -0.12 214577 0.18 214663 0.29 214749 0.53 214835 0.54 214921 0.28 215007 0.58 215093 0.45 215179 0.43 215265 0.20 215351 0.12 215437 0.09 215523 -0.03 215609 0.07 215695 0.50 215781 0.00 215867 0.33 215953 0.41 216039 0.11 216125 -0.08 216211 0.04 216297 0.09 216383 0.44 216469 0.22 216555 0.48 216641 0.27 216727 0.27 216813 0.17 216899 0.07 216985 -0.11 217071 -0.16 217157 -0.20 217243 -0.21 217329 -0.07 217415 0.04 217501 -0.01 217587 -0.06 217673 -0.10 217759 -0.05 217845 0.04 217931 0.00 218029 0.13 218115 -0.46 218201 0.21 218324 0.45 218410 0.30 218496 0.30 218605 0.86 218723 0.12 218809 0.09 218895 0.11 218981 -0.03 219072 0.00 219158 0.14 219244 0.11 219330 0.50 219416 0.23 219502 0.34 219588 0.45 219679 0.46 219765 -0.24 219851 -0.17 219937 -0.03 220023 0.52 220109 0.25 220195 -0.15 220281 0.20 220367 0.27 220453 0.01 220539 -0.11 220625 0.14 220711 0.63 220808 0.25 220894 0.02 220980 0.36 221066 0.11 221152 0.52 221238 0.42 221324 0.38 221410 0.06 221496 0.41 221582 0.24 221668 0.08 221754 -0.08 221840 0.05 221926 0.10 222012 0.13 222098 0.29 222184 -0.14 222270 0.02 222356 -0.10 222442 -0.16 222528 -0.07 222614 -0.01 222700 -0.49 222786 0.46 222875 0.06 222961 0.06 223047 0.40 223133 0.38 223219 0.39 223305 0.08 223391 0.20 223477 0.21 223563 0.15 223649 0.15 223735 0.07 223821 0.34 223907 0.47 223993 -0.04 224079 -0.49 224165 -0.25 224251 0.11 224337 -0.43 224423 0.01 224509 -0.34 224595 0.14 224681 0.05 224767 0.06 224853 0.00 224939 0.13 225031 -0.07 225117 -0.40 225203 -0.32 225289 -0.20 225375 0.14 225461 -0.22 225547 -0.18 225633 -0.14 225719 -0.09 225805 -0.32 225891 -0.03 225977 -0.42 226063 -0.37 226149 -0.01 226235 -0.32 226321 -0.15 226407 -0.34 226493 -0.37 226579 -0.27 226665 0.11 226751 -0.09 226837 0.27 226923 0.13 227009 -0.05 227095 0.28 227181 0.39 227267 0.35 227353 -0.11 227439 -0.08 227525 0.10 227611 -0.10 227697 0.09 227783 -0.04 227869 0.19 227955 -0.04 228041 0.43 228127 0.33 228213 0.08 228299 -0.09 228385 -0.24 228471 -0.23 228557 0.08 228643 -0.14 228729 -0.05 228815 -0.00 228901 0.13 228987 0.38 229073 -0.07 229159 -0.07 229245 -0.29 229331 -0.30 229417 -0.34 229503 0.11 229589 -0.06 229675 -0.14 229761 -0.35 229847 -0.37 229933 -0.47 230019 -0.14 230105 -0.28 230191 -0.15 230277 -0.04 230363 0.09 230449 0.07 230535 -0.03 230621 0.03 230707 0.11 230793 -0.06 230879 -0.24 230965 -0.01 231052 0.02 231147 0.15 231255 0.23 231341 -0.16 231427 -0.04 231513 0.05 231599 0.05 231685 -0.05 231771 0.43 231857 0.24 231943 0.21 232029 0.00 232115 0.43 232201 0.07 232291 0.21 232377 0.30 232463 0.18 232549 0.51 232635 -0.03 232721 0.37 232807 0.07 232893 0.10 232979 0.44 233065 -0.02 233151 0.29 233237 0.24 233323 -0.07 233409 0.03 233495 -0.01 233581 0.24 233667 -0.19 233753 0.11 233842 -0.14 233928 0.10 234014 -0.03 234100 0.18 234186 0.52 234272 0.26 234358 0.04 234444 0.08 234530 0.10 234616 0.26 234702 -0.25 234788 0.01 234874 0.36 234960 0.18 235046 -0.21 235132 0.17 235218 -0.10 235304 0.07 235390 -0.21 235476 -0.27 235562 -0.12 235648 -0.36 235734 -0.20 235820 0.01 235906 -0.16 235992 -0.05 236078 0.18 236164 0.25 236250 0.14 236336 -0.13 236422 0.09 236508 0.01 236594 0.11 236680 -0.50 236766 -0.05 236852 -0.20 236938 0.09 237024 -0.00 237110 0.28 237196 0.04 237282 0.13 237368 0.08 237454 0.10 237540 -0.07 237647 0.46 237733 0.30 237819 0.15 237905 0.13 237991 0.35 238077 0.19 238163 0.27 238249 0.25 238335 0.30 238421 0.07 238507 -0.06 238593 -0.02 238679 0.34 238765 0.37 238851 0.06 238937 0.13 239023 0.12 239109 0.19 239195 0.06 239281 0.23 239367 -0.25 239453 0.41 239539 0.13 239625 0.13 239711 0.04 239797 -0.09 239883 0.04 239969 0.32 240055 1.00 240141 0.07 240227 0.18 240313 -0.02 240399 0.16 240485 0.00 240571 -0.15 240657 -0.09 240743 -0.14 240829 -0.01 240915 -0.24 241001 -0.05 241087 -0.02 241173 -0.08 241259 -0.05 241345 -0.05 241431 -0.26 241517 -0.06 241603 0.45 241689 0.01 241775 0.02 241861 -0.58 241947 0.09 242033 -0.28 242119 -0.05 242205 0.06 242291 -0.18 242377 -0.08 242463 -0.11 242549 -0.07 242635 0.25 242722 -0.01 242808 -0.20 242894 -0.08 242980 -0.11 243066 0.35 243152 -0.22 243238 -0.30 243324 -0.24 243410 -0.09 243496 -0.18 243582 -0.19 243668 -0.06 243754 0.11 243840 -0.25 243926 0.01 244012 -0.02 244098 -0.10 244184 -0.37 244270 -0.18 244377 0.10 244463 -0.07 244549 0.43 244635 -0.42 244721 0.05 244807 0.14 244893 -0.25 244979 0.14 245065 -0.17 245151 -0.21 245237 -0.13 245323 -0.09 245409 -0.32 245495 0.27 245581 0.42 245667 -0.04 245753 -0.20 245839 0.23 245925 0.10 246011 0.24 246097 0.30 246183 0.65 246269 0.06 246355 0.07 246441 0.08 246542 0.03 246628 0.06 246714 0.35 246800 -0.08 246886 0.09 246972 -0.37 247058 0.06 247144 0.26 247230 -0.14 247316 0.18 247402 -0.19 247488 -0.17 247574 -0.06 247660 0.26 247746 0.05 247832 -0.12 247918 0.35 248004 0.06 248090 0.23 248176 0.28 248262 -0.21 248348 -0.08 248434 0.04 248520 0.10 248606 -0.11 248692 -0.03 248778 0.12 248864 -0.17 248950 0.08 249036 -0.01 249122 0.01 249208 -0.06 249294 0.35 249380 0.42 249466 0.02 249552 0.14 249638 0.35 249724 -0.04 249810 -0.14 249896 -0.07 249982 0.14 250068 0.51 250154 -0.03 250264 0.29 250381 0.06 250467 0.04 250553 -0.05 250639 -0.02 250725 -0.45 250811 0.07 250897 0.37 250983 0.43 251069 0.47 251155 0.63 251241 0.21 251327 0.03 251417 0.05 251503 0.33 251589 0.42 251675 0.37 251761 0.15 251858 0.20 251944 0.03 252030 0.35 252116 0.12 252202 0.10 252288 -0.02 252380 0.06 252466 0.10 252552 0.33 252638 0.28 252724 0.19 252810 0.10 252896 0.06 252982 0.39 253070 0.45 253161 -0.07 253247 0.28 253333 0.35 253419 0.28 253519 0.62 253663 0.40 253749 -0.04 253835 0.68 253921 0.30 254007 0.06 254093 -0.02 254179 0.15 254265 -0.12 254351 -0.16 254437 0.09 254523 -0.36 254609 0.69 254695 -0.21 254781 0.17 254867 0.13 254953 -0.17 255039 0.32 255125 0.14 255211 -0.18 255297 0.29 255383 0.17 255469 -0.06 255556 -0.14 255642 0.05 255728 0.03 255814 0.20 255900 -0.04 255986 0.24 256072 -0.02 256180 0.09 256266 0.26 256352 0.03 256438 -0.03 256524 -0.25 256610 0.39 256696 0.12 256782 0.02 256868 0.06 256954 0.61 257040 0.29 257126 0.37 257212 -0.06 257298 0.51 257384 -0.30 257470 0.63 257556 -0.04 257642 0.22 257728 0.14 257814 0.24 257900 0.19 257986 0.27 258072 0.26 258158 0.41 258244 0.07 258330 -0.04 258416 -0.03 258502 0.08 258588 -0.01 258674 -0.01 258760 0.08 258846 0.28 258932 0.00 259018 0.07 259104 -0.24 259190 0.07 259276 -0.07 259362 -0.15 259448 -0.10 259534 -0.15 259620 -0.18 259706 0.14 259792 -0.14 259878 0.07 259964 0.19 260050 0.30 260136 0.18 260222 0.16 260308 0.32 260394 0.33 260480 0.09 260566 0.34 260652 -0.01 260738 -0.11 260824 -0.17 260910 0.03 260996 -0.31 261082 -0.04 261168 0.03 261254 -0.02 261340 -0.04 261426 0.17 261512 0.07 261598 -0.20 261684 0.04 261770 0.22 261856 0.01 261942 0.28 262033 0.19 262119 -0.05 262205 -0.14 262291 -0.12 262377 -0.00 262463 -0.23 262549 -0.10 262635 0.08 262721 0.03 262807 0.14 262893 0.08 262979 0.12 263065 0.02 263151 0.22 263237 -0.18 263323 -0.03 263409 -0.30 263495 -0.27 263581 0.33 263667 -0.10 263753 -0.17 263839 -0.02 263925 0.07 264011 -0.13 264097 0.23 264183 -0.11 264316 0.16 264402 0.09 264488 0.02 264574 0.09 264660 0.14 264746 0.00 264832 -0.31 264918 -0.22 265004 -0.17 265090 -0.21 265176 -0.04 265262 -0.08 265348 -0.25 265434 0.01 265520 0.00 265606 0.54 265692 0.32 265778 0.22 265864 0.49 265950 -0.02 266036 0.09 266122 0.11 266208 0.01 266294 -0.15 266380 0.12 266466 -0.12 266552 -0.38 266638 0.14 266724 -0.46 266810 -0.13 266896 -0.16 266982 0.05 267068 0.29 267154 0.47 267240 0.08 267326 0.02 267412 0.11 267498 0.32 267584 0.27 267670 0.15 267756 0.15 267842 0.21 267928 0.09 268014 0.10 268100 0.02 268186 -0.10 268272 0.41 268358 -0.03 268515 -0.07 268601 0.03 268687 -0.17 268773 0.01 268859 -0.00 268945 0.06 269031 0.20 269117 0.09 269213 0.09 269299 -0.18 269385 0.04 269471 -0.26 269557 -0.19 269643 0.30 269729 0.45 269815 0.02 269901 0.11 270006 0.10 270092 0.14 270178 -0.52 270264 -0.27 270350 0.06 270436 -0.34 270522 -0.25 270619 -0.29 270716 0.24 270802 0.18 270929 -0.16 271015 -0.14 271101 -0.25 271187 -0.07 271273 0.06 271359 0.49 271461 -0.95 271547 -0.10 271633 0.07 271719 -0.12 271805 -0.03 271891 0.20 271977 -0.04 272063 0.57 272159 -0.30 272245 -0.47 272331 -0.27 272417 -0.17 272503 -0.08 272589 -0.17 272675 -0.38 272761 -0.03 272847 0.23 272933 0.12 273023 0.26 273109 -0.00 273195 0.12 273281 0.12 273367 0.20 273453 -0.04 273539 -0.30 273625 -0.16 273711 0.05 273797 -0.06 273883 0.04 273969 -0.11 274055 -0.13 274141 -0.03 274227 -0.15 274313 0.09 274399 -0.24 274485 -0.02 274571 0.20 274657 -0.23 274743 0.28 274829 0.56 274915 0.46 275004 0.23 275090 0.16 275176 0.13 275262 0.15 275350 0.01 275436 0.06 275522 0.35 275608 -0.04 275694 0.29 275780 -0.21 275866 0.17 275952 -0.20 276038 0.26 276126 0.19 276212 0.38 276299 0.11 276385 0.09 276471 0.34 276557 0.19 276643 -0.22 276729 -0.00 276815 -0.00 276901 0.19 276987 0.22 277073 -0.00 277159 0.50 277245 0.25 277331 0.28 277424 0.39 277510 0.03 277596 0.08 277682 -0.15 277768 0.01 277854 -0.01 277940 -0.21 278026 -0.02 278115 -0.19 278201 0.31 278287 0.30 278376 0.19 278462 0.14 278548 0.14 278688 -0.24 278774 0.39 278917 0.24 279003 -0.01 279089 0.04 279175 0.29 279261 0.25 279347 0.26 279433 0.12 279519 0.07 279609 0.09 279695 0.24 279781 0.13 279867 0.35 279953 0.15 280039 0.40 280125 0.33 280211 0.40 280297 0.43 280383 0.21 280469 0.11 280655 -0.03 280741 0.60 281070 0.30 281259 0.02 281345 0.92 281431 0.46 281517 0.58 281603 1.29 281689 0.75 281775 0.39 281861 0.59 281947 0.32 282033 0.75 282119 0.52 282205 0.59 282291 0.37 282377 0.17 282463 0.29 282549 0.33 282635 -0.17 282721 0.04 282807 -0.06 282893 -0.39 282979 0.32 283065 0.12 283151 -0.15 283237 0.08 283330 -0.10 283416 -0.16 283502 0.07 283588 0.16 283703 -0.07 283789 0.07 283875 0.14 283961 -0.08 284047 0.09 284133 -0.04 284219 0.77 284305 -0.08 284391 -0.08 284477 0.05 284563 -0.07 284649 0.11 284735 0.18 284821 0.20 284907 0.00 284993 0.18 285079 0.41 285165 0.21 285251 0.07 285337 0.27 285423 -0.12 285509 0.22 285595 0.22 285681 0.08 285803 0.07 285889 -0.01 285975 0.53 286061 -0.13 286147 0.02 286233 -0.19 286323 -0.08 286409 0.08 286495 0.35 286581 -0.10 286667 0.02 286753 0.04 286839 -0.46 286925 -0.09 287011 -0.02 287097 -0.10 287194 0.30 287280 0.29 287419 0.29 287505 -0.11 287591 -0.08 287709 0.16 287795 -0.18 287881 0.04 287967 0.08 288053 0.36 288139 -0.05 288225 0.22 288311 -1.34 288397 0.48 288483 0.17 288569 0.30 288655 0.21 288741 0.16 288827 0.41 288925 0.41 289011 0.37 289097 0.18 289183 0.39 289269 0.62 289355 0.67 289441 0.29 289527 0.25 289613 0.19 289699 -0.06 289785 -0.10 289871 -0.08 289957 -0.41 290043 -0.02 290129 -0.24 290215 0.13 290301 -0.11 290387 -0.10 290473 0.01 290560 0.18 290646 -0.22 290732 -0.17 290818 0.08 290904 0.02 290990 0.01 291085 0.30 291171 -0.35 291257 -0.20 291343 0.22 291429 -0.13 291515 0.07 291607 0.38 291693 0.20 291779 -0.23 291865 -0.21 291951 -0.12 292037 -0.07 292123 -0.06 292209 0.49 292295 0.15 292381 0.02 292467 0.16 292553 -0.13 292639 0.29 292725 -0.06 292811 -0.17 292897 -0.00 292983 0.04 293069 0.35 293155 0.19 293241 0.42 293327 0.21 293413 -0.43 293499 0.01 293585 -0.03 293671 0.29 293757 -0.04 293848 -0.05 293934 -0.24 294020 -0.06 294106 -0.13 294192 -0.09 294285 0.55 294371 -0.20 294457 0.03 294543 -0.51 294629 0.26 294715 -0.05 294801 -0.09 294887 0.40 294973 -0.29 295059 0.02 295145 -0.11 295231 0.14 295317 0.09 295403 -0.04 295489 0.18 295575 -0.27 295661 0.17 295747 -0.08 295833 0.03 295919 0.36 296005 -0.19 296091 -0.13 296177 0.17 296263 0.20 296349 0.09 296435 -0.08 296526 0.20 296612 -0.03 296698 -0.30 296784 -0.08 296870 -0.19 296956 -0.04 297042 -0.09 297128 0.13 297214 -0.04 297300 0.20 297386 0.14 297472 0.23 297558 0.40 297644 0.18 297730 0.33 297816 0.10 297902 0.34 297988 0.27 298074 -0.10 298160 0.03 298246 0.40 298332 -0.21 298418 0.08 298504 0.01 298590 0.03 298676 0.10 298762 0.07 298848 -0.11 298947 -0.18 299033 -0.10 299119 -0.24 299205 0.16 299291 -0.19 299377 -0.14 299463 -0.14 299549 0.33 299635 0.23 299721 0.39 299807 0.53 299893 0.27 299979 0.29 300065 0.21 300151 0.25 300237 0.33 300323 0.21 300413 0.17 300499 0.22 300585 -0.04 300671 0.00 300757 -0.02 300843 -0.30 300929 0.03 301015 1.14 301107 0.14 301193 0.37 301279 -0.05 301365 0.48 301451 0.24 301537 0.35 301623 -0.09 301709 0.05 301795 -0.11 301881 0.10 301967 -0.19 302053 0.20 302139 -0.13 302225 -0.17 302311 -0.12 302397 0.12 302483 0.16 302569 0.07 302655 0.22 302741 0.17 302827 0.10 302913 0.11 302999 -0.27 303091 0.04 303177 0.36 303263 0.31 303349 -0.32 303435 0.19 303521 0.15 303607 -0.21 303693 -0.12 303779 -0.03 303865 -0.09 303951 -0.15 304042 -0.34 304128 -0.15 304214 0.02 304300 0.09 304386 0.16 304472 0.22 304573 0.26 304659 0.55 304750 0.08 304836 1.00 304922 0.07 305008 -0.10 305094 0.24 305180 -0.01 305266 0.03 305352 -0.05 305480 0.05 305566 0.75 305652 0.33 305738 0.08 305824 -0.09 305910 0.05 305996 0.19 306082 -0.30 306177 -0.43 306263 0.09 306349 0.13 306435 -0.05 306521 0.06 306607 -0.43 306693 -0.23 306779 -0.01 306865 -0.15 306951 0.07 307044 0.01 307130 -0.18 307216 0.03 307302 -0.06 307388 0.38 307474 -0.10 307560 -0.20 307646 0.22 307732 0.31 307818 -0.09 307904 0.05 307990 0.32 308076 0.77 308162 0.40 308248 0.34 308334 0.01 308420 0.15 308506 0.30 308592 0.12 308678 -0.10 308764 0.21 308850 0.22 308936 0.04 309022 0.27 309108 -0.19 309194 0.29 309280 0.21 309366 -0.02 309452 0.01 309538 0.11 309624 0.05 309710 0.03 309796 0.38 309882 -0.05 309968 0.08 310054 0.24 310140 0.57 310226 0.16 310312 0.23 310398 -0.14 310484 -0.08 310570 0.03 310656 0.25 310742 0.35 310828 0.09 310914 0.40 311000 0.44 311086 0.17 311172 0.28 311258 0.60 311344 -0.20 311430 0.22 311516 0.28 311602 0.27 311688 0.35 311774 0.19 311860 0.16 311946 0.19 312032 0.26 312118 -0.01 312204 0.07 312290 0.03 312376 0.16 312462 0.07 312548 0.27 312634 0.16 312720 0.01 312806 0.26 312892 0.48 312978 0.57 313064 0.50 313150 0.22 313236 0.53 313322 0.40 313408 0.18 313494 0.33 313580 0.51 313666 0.72 313752 0.53 313838 0.14 313924 0.35 314010 0.32 314096 0.13 314182 0.24 314268 0.07 314354 0.28 314440 0.16 314526 0.07 314612 0.14 314698 -0.07 314784 0.02 314870 0.22 314956 0.60 315042 0.27 315128 0.44 315214 0.84 315300 0.71 315386 0.46 315472 0.09 315558 0.39 315644 0.35 315730 0.18 315816 0.54 315902 0.64 315994 0.71 316080 0.46 316166 0.59 316252 0.55 316338 0.61 316424 0.29 316510 0.04 316596 -0.12 316682 0.02 316768 0.15 316854 0.15 316940 0.18 317026 0.07 317112 0.48 317198 0.25 317284 0.16 317370 0.36 317456 0.11 317542 0.03 317628 -0.09 317714 -0.09 317800 -0.10 317886 -0.14 317972 0.06 318058 0.34 318144 0.14 318230 0.13 318316 0.11 318402 0.22 318488 0.29 318574 0.00 318660 -0.21 318746 -0.05 318832 0.30 318918 -0.05 319004 0.02 319090 0.12 319237 0.61 319323 -0.01 319416 -0.69 319602 0.25 319688 0.68 319774 0.00 319860 0.51 319946 0.45 320032 0.53 320118 0.14 320204 0.23 320290 -0.24 320376 -0.17 320462 -0.68 320560 0.14 320655 0.20 320819 -0.14 320905 -0.04 320991 -0.16 321077 0.26 321163 0.26 321249 0.30 321335 0.40 321421 0.64 321507 0.16 321593 0.56 321679 0.39 321765 0.19 321851 0.28 321937 0.44 322023 0.19 322109 0.45 322195 0.34 322281 0.36 322367 0.25 322453 0.38 322539 0.19 322625 0.01 322711 0.11 322797 0.63 322883 0.18 322969 0.40 323055 0.42 323141 0.16 323227 0.17 323313 0.39 323399 0.52 323485 0.55 323571 0.50 323657 0.51 323743 0.60 323829 0.67 323915 0.57 324001 0.11 324087 0.09 324173 0.18 324259 0.10 324345 0.03 324431 -0.01 324517 0.30 324603 0.39 324689 0.21 324775 -0.58 324861 0.31 324947 0.70 325202 0.18 325288 -0.25 325374 -0.04 325460 0.19 325546 0.27 325632 0.35 325718 0.00 325804 -0.06 325890 -0.02 325976 -0.11 326062 0.24 326219 -0.05 326305 0.22 326461 -0.04 326559 0.26 326645 0.06 326742 0.43 326828 0.31 326914 0.34 327000 -0.39 327086 -0.30 327172 0.45 327258 0.37 327344 0.18 327435 0.63 327525 0.56 327641 0.53 327743 -0.06 327829 0.01 327915 0.02 328047 0.16 328158 0.45 328279 0.23 328366 0.19 328460 0.31 328546 0.07 328632 0.32 328718 0.20 328804 0.43 328890 0.08 328976 -0.34 329062 -0.25 329148 -0.24 329234 0.19 329320 -0.01 329406 -0.20 329492 0.17 329578 -0.01 329664 0.17 329750 0.22 329836 0.00 329931 0.17 330018 0.32 330104 -0.05 330190 -0.19 330276 0.22 330362 -0.19 330448 0.27 330534 0.08 330620 -0.00 330706 0.33 330792 0.50 330883 0.38 330979 0.10 331065 0.11 331151 0.36 331237 0.41 331323 -0.26 331409 0.36 331495 -0.06 331581 0.37 331667 -0.20 331753 -0.00 331839 -0.42 331925 -0.28 332011 -0.05 332097 -0.11 332216 0.14 332302 0.08 332388 -0.59 332474 -0.43 332560 0.09 332646 -0.08 332732 0.19 332818 0.04 Bio-Graphics-2.39/t/data/t1.gif000444001750001750 3444112366325116 16254 0ustar00lsteinlstein000000000000GIF87aXº÷ÿúÍzÿôÿ.‹WÿÿeõÞ³ÜÜÜÿ ÿî‚îK‚ÿÌ R-úšÿ<³q/OOÿGÿôÿ2ÿ zÿQ£ÿÿÁÿ™ÿÿÍðÿðŽÿÞ¸‡úúÒÿ=(ÿ¸† ÿðøÿH=‹ðæŒÿé–zøøÿÿäá=ÿÿõîÿÿÒiúðæÿÿÚ¹ÿ€€½·kºUÓÿúð¼Ò´Œ­ÿ/ÿÞ­|üÀÀÀp€ÿ(€€€ÿà‹E‹‹ÿøÜ"‹"ÿÿ€ð€€Ìÿ·ÿÿEÿÿææúF‚´õõõõõÜÿÀËd•íiiieÿÿ¶ÁÿŒ€€€ú€rÿ„€ÿcGfͪÿïÕÿpÿÿðÿúúŠ+âÿŽ„ÿ_ž ÿ·ÿpÛ­ØæQÿkŽ#jZ͇Îúô¤`Ç…Uk/Ü<ÿi´õÿúÿêÿÿëͯîî2ÿpÿ[ÿÿÿÿÿ×HÑÌ@àÐwˆ™àÿÿ[àÿÿ ÿðÿÿ¿ÿÿ£2Í2™ÿdÿ¥šÍ2ÿz¥**ÓÓÓ€€¼‹‹Aiáÿÿ‹Í…?°àæ­ÿÛp€€Ý ÝÁÿÖÿ©©©îèªýõæ€ÿäÄÿÿÿÿÖÿÔÿÿà°ÄÞ”Óÿÿ䵨¿Øúë×ÿ­ÿP‹îÚ¥ ÿp‡Îë˜û˜ÎÑ™2ÌGÿÿê²"" ²ªÍ\\{hîÚpÖÿðõÿÿÿàÿÿÓÓÓ@àÐÿÿ¥ÿÿõÞ³,Xºþ l Aƒ¿ T8áÁ…&D,¢Eˆ^Ô˜ñáÀŠ'†”Hr£Ç“¿@r\‰²äH“"?ÂtÉ2fË™q¾ÜY“¦@•7yí ¨Í£>‘ê¬i4©Ó¥CBU*”*Ó©O«&mеkU®Z½5v¬Ù¨V¥†]{öhY´YÛJ|›¶n\”tïÚšW,Ü¢~÷²U+w 0Á…ÉÖ«·ï`ÄxKé8±åÈ[ÆÙíäËu+ÿÍœ“´é«§G·ýëpëÚ¿~V–ulжg‡Ö}3èÛ°]û¦ ¹xîÔ»‘÷ö¬\7HÎÂB—ιàaؼKÿή¸9òãÛeþ{/S9t‚ç¦>¼øò­ÜÉ&þðxú9…_7Üš¿@ì÷¥~ÝÉçž}ÖW jÇàüéׄй6×€.˜aƒ*h x&×™uNh"€–—bˆ nX†Ëµèa{ïuö_‰Jxa€1˜Œ PÑ™H]‘ÎÈÜŠ. Èã>>&$“S>ä{êÙ¨£ƒM*Ye—\*Ùã“Ržhä™I%nk÷¥—m§[Ža¹e‡qÂG&›{º™'_7"9] $¦GåŸâ19¦¢Pö)§y6“ž¤‘N&¢¨1Z¦£aúâK:ú¦sž&§)Ÿ§úé虆'§þ€Âš¨«¤î4¨¨¥ê™ê£»v*ëjyZJY®Òú±Ãþúi¯±2;+˜Ç*kª±"Û*´ÕJ«+µ,Z‹W…à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼â"Gï½øæ«/»Ú‹-‹Â #ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñų·\ÀwìñÇ O¬±·N:»Ç!§¬òÊ,·ìòË0üÊ0×l3Ë2›L#ÉÁÐ|óÏ@-ôÐ7çLœÏD'­4ÁFÿË+·Mö¼ôÔTWmµÐMë…ôÕ\»œu©£~·u×d—möÙ]ÕØh·-r¿ÉêÛn×m÷Ý+«ÝþÝx÷]°ÞPoëtŒûnøáˆ'®øâ‡ÛËøã#÷µb6*·à•oz¹¿™£¸åŸkºçƒƒ^ºè§“Þ¹ª›Ç=:ë¯?:ì³Ë¾ºí<“¼cë”ç>ùο—»¯¼_¼ðµ?|³Ë?{»òÉ3½ó¾¿{óÀýôÙ[iðag{’‡jÿýñáwk>ž«–¸ýóÒÃO=øºŸ’~äC~Ôõ³~ÿ*ŠP4î- {4à´¨§[9°:ºÝþ…Àʯ{ÄÜb&ÅÁHAhIä\õBè:†NŠÐ$À^0/´à›„ÂþÜÉBö3¡ÿH@öŽ~þ¯™¸Ìt%®¯‡1Ô ½·C÷Øè5çÙ’pÞ7Ã$Šp‰<N‘¦H((>Q-DžK8ÆþÏ;WŠˆ¥¸ØÄ2º°Šp¤_ ­Ã’ü9m‚¦s#}h¼,Š105ü`Cš†GÔ鑊Xä#s((ƈLDbÏÉ7f¦ƒâ 'éÇBªŽ“BôÏ®¥4t©L© S`³™5¦´" Cʧ2¦P•iÓ?§•4*Q}ZA *q©Guå3“êÔ+BõªHMi0±*ÕœFu—^å*X©:U­Þ´«rVùÈÖ¬.ó”Äd«\ͪT·Òd?iRYß*ËUõ¥XãJמUê°iÌëZ ûW¦š³±_%,_·êÇâµ?”¡^ÛŠVÆrv¬žëdÏŠÊ'Ѳ…ì`ýúYÉVµvõþ]b©%þpt´uí,nkÆØF–µ¢-j M$HÞ¶º}mkÚæîö›ˆEOtS»ÜŸ"´Ï­nS¯ëÚ:Ù ÜenvƒëX|†×ºŸU+DÏ»]í>Ö½æ…/xå[Pòþ½ö]-~«Ü¤Î´^þýïk"àø¿ô]¨Oº`³5í£&°ÊFºÙüV–Át…pÐ,áo8Áë…¦†v`{šËÃ(¶…;Þ c·#þ‡SLã–­Œ ®]Œ‹&âKdÇ5²Ân|ÜßÈ5#²’³0YÈP˜’keaEø‹Â½²“¯Ìå.OÓÈ$­2vûËßòÎWÌݽoþ{Ñ,^2·øÍn޳™ë[f5¿—Íû…óœ\gý®¹Ï¾õóÜ=‡ÏֳŤÞÜŽÙÐÔEô -èøJÚC—5.o[ùèEŸ™Ð®ô§)MLJW³˜…k›!}[9{šÎ¤.ô« ¬ÂæÕ¤M³¨aíê]ó9Ö¡t©ñÅﲑ²²öõ¡A­ka'ÛÙÁÎÐlOÁB»ÙÏÎv´·mn¯zfµ¥ 9Ýír[Ù‘fö¹¯½n'N7³‘ªóÜkvÓ›ÕaV÷½g}´ïZ[ÛæÞ7º[ï ë;ÑÏk43Þno ÜÞ/8‹ëÍð‡W<âüN7°Žñ×ÉË ˜þ ¾ñ†s|Ò×Z”•6åh]zÔ)?¹¥^—'¯Üb-Íg^r‹;¼ãG»9Ñr®¾—óZâ86ú¯7&ô¡#Ÿ8Ò‹¬ôeÓ°éX‹zÒw󩿪êG±9Ö#öt öèG¹×©¢»Ý]Z§:מq‚×=ßgWûÝIs“ûÝç2ïúÞ¥>ø­çç}üßÑþs½{œïkwùÜ—y^ð'|æ ŸxÆR¸vôç)_x¹_žî›7}籕é=®ñ•/úä­þzÌCÜ.¦Îª5Í^Çßö¥ÿúì5^{'‡»õ$"÷â}Ÿvà§^ø§'ýóM‹#§º¯ŠÏ¾ç—þïüßÛ¾ùßÍ´uïÞÇúÅ—¾÷Q¿~õƒßø¶·™Þøî¿ßýõÿèiïõÜÛü®{Pvv÷|l}ü|0ÁJ¨€’‡€Ä'€f—~ h€#¡pó¶}ÚÇ|ùÇ~÷Wí‚hyH‚h‚˜G€ôv.˜.çw€'X€!ˆ‚5øccGb1ø€3ˆw=y¥'v9è0eÇ‚%({Hƒ#¨„*7„*¶ƒ*x„8|L¸aç„OH€>¸‚†Ä…Ÿ„X˜dPˆ„?¨y7¸…`†/S„](…è…¥‡ª/X‡Ý¤…@˜‚d(‡°Ä‡¹ä†F¨‡S˜„h(ˆoˆþmhˆx†yȈf¸„…舜ç‡ó£ˆ‰(‰ªG‰Dˆ‰Øøg…UÈ}úGŠØxC4Šh (‚­hƒžøˆwY®(Š‘‹“ˆˆ_h‰»ØIþ·ȃšØSº‡Å8‡˜ˆ~$ƒZ¨¥ŠøŒh‹Ÿ(²HúC}ŦXÆ¥ŒÇØ‡Ýø‡¼hŒáˆŒ]5~ÿÇÛ(ƒÃTãèíŽÉ¨ŽÁ3\vb}¹øŽ•Âøùˆ‹™>¿øn·øŠÎ¦ŠY‹ ‹ X¬hÿˆ›X†÷¨QH[¡ç¥¸Š ¹yŠÉIŒ%ÉŽ¹‡ü8‘Ëh‡.ù’"‡þ‡Õ’9’s¢†8¹0lØ‹þH’)9ˆÂ•“By0;)Ž?yˆ'ùT6”LO2Y‘=)I¹€MÙ”EIŽY“49Ò"„UaWéŽG¹ˆQ¹Çã•_Ra ey‘cy‰V“r9—è2†@¹ŽJÙ–*9•ÿ–•\É‘"¹•3 ˜I˜ i˜°è—ƒé‘iˆ’…ɘù˜ZI™)™‘阘y˜›™˜6i–oɓР•£‘¡i”zy—+i’§‰•Ÿé–©‰”­)–±I–¥é“µ —·)•³É–» š¹)𝹗½Ù¿ ›ÇIœi—Š•Ù™É™ši™‹é˜´è™‚IšÃþ©š|Ù[Á‰š¥õnÀØKÕ9ÎÙœÒ٘晞“YAÌx|ØIÚ™¦ù®IŸ¸ž†Q}ÚŸçy™ì™™ë9 êY eŽj•ŽÀ™œÜYœ,¹š(iŸ´©Gôè]Š5ŸòYŸ *›ê›ÛÉ¡á™IâIžúŸåi Š¢ÐI íÉ| ‰ž,š¢-£+ª¢þ ®Œ':£6úœ7J£?Ú£0*¤ ¤>z¤CÊ£J*£L;tù¤P:`T˜¤M¤Kê¤Ä¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦l ¦kiœj›qª›¥" mz§xš§zº§|Ú§~Ú¥oú Ý©|þšŸuú§ˆš¨Šº¨ŒÚ¨Y¨¬Ù¡pŠŸ¼ieŽz©˜š©šŠ©¡*§”º ‡º©¤Zª¦zªeÚ©yù©tªÈ9ª¨«²:«œj— :§Âéªm¥¼J—¶ ª…Z©¬š«Á*ªºÚ ’*¨©Ã ž¸ê¬Çz«Ñ ¬&Z¢8j¥UФEJ¤;š­TZ£ G¨Õª¡ÏzŸÅúªÓÚªç:ȗת­Ý ®Þº­WŠ­òÚ¹{ 8¨ûº¬žZ® °JŸï™&$*zéJ¬ãj¨ ­ëЬ·‰Á*æ÷”äڰ溰Â*°“Z¬Jž;¥ô:¯ñj¯& ¯Öj¤jC+[þ\ýš¬ÌÊ±Ê ³ÿб‹ŸùJm/Û¬û®ßz²?‹²û°?f;+³1k³K´Ôê³#{¯î–‘O ´U+´ ˴ꪱƪµ ë´%‹µ«´;®½ê‚¿ºµ`›²Üʶõúc´·¥ªªV坫д5뵋v*·~[«›µ\‹®zÛ³Tk›¸J·}‰·wK¶3˳7»7Š[¹‰Ê¸Þ)¹K;¸Ê©¹e[s–º}Š¹âº¶C˹ë¸u[}+º®{§¤{´›´…;¹¨+­{s¶n—¶_{¸nK²¿ µbÛµ·Û´¾{º¦+¸É;¶µ»¹ËK¼ÏK¸Å«¶Ç«¼Õþ˼ÓÛ»m‹¼× ½Ý+½ƒÓh›&»Íû¹ßÛ¹ªÛ¸³›·ÔҮؗ½{½è»¾[¾‘;’9!ˉa´þ{µÿÛ¿<À¢Ôz7Tºç›ºô»ºž{¿ ¬¾…*±ízl¹öÀ™›¾lÁ¼½ÖËÁ„%çHH½—À¸ ¿†ëÁÞ‹Âà›j <µ*<¿öK»&l»ò«À<¢Wâ>0ü¶¼V+ÀB Äû€d´ô‡ÁìÃLÄ?̽1ŒÃ®¢£<Ãì{Ã%ŒÅÆÅYLÂ[ÌÄC Å`ìÄM,ÆÀkÆ÷£»!Ç»ñëÅÔËÅ_|Æ­ûºtœ¦±›ÄL¾5ì¼n¬½NVÇþ€Œ¦wÜÃgÜÁcŒÆALƈÈŒ<¦ƒü¾ZüƇlÈ…Œ½ ÛȘü¥Œl LÑìÇ•œÂœÉ¤¼¥›\Å{l¾p,É¡lÄ£\Ê¥|ÊkÅõ›ÊLË <j¼ÆkÉ}ÜÆ« ÊÂûÄ”<Ìe\̉ŒÈE,öìÉ¿|“ìËÁ ÌÑ,Ê­ÌÌŸLÍ×,ÅÙ ÍÛÜÅTÌÍÏlÃãÌÇÓìÍÆÆYë¾ê,ÍÕìÊßÇé¬Èô|Gùû¢Ö<ÏÊLÌîϬ¬ÏÈ|dð©#áÜÅçLÎmÎïŒÍå¬Ê¢"ÁD„Äý ÐÌÍÏùlÑmD;[ ÏÑË,Î íÐþ,Ì:þnã6 Ò-Ò-ÍÐ%}ËÍ<7:¬³#mÐ MÒ;­Ó'­Í! ›øÜÎ0}ÌÓ<ýÓèüÒÈYÐGmÔEMÔ.ÓòÌÔ2ÝÓUMÕÿlÕIÔW­ÔÝ>&bZF`»|Ö2ÅÆK}d–+Ësü·Ër=ײ<¾x,7oí·nÝÖ¯<×~ÝÈu=Âq’×r{`mm.ØŒØj­5|í_}?Š=ÙtÌØ½l/‘ c™ ·”ÝÙ›—¹Ü•Ÿ=£½Èž}ÚzÝØ ½+\FÖcmÖhÛܤÚ&íÕ]ÍÕ>mÛ¹ÛYÔ»­Õ( Ü@ÍÛ[-ÜkíÛ½ ÕSÜÅÍÜÁíÜÃmÜaþ½BÐ}ÜÊýÕº½€< É MÓÝlÃø#Ý«ÝÍ}ÝV1@züÝãMÜ|ÂHG"­!ÞµÍÞÑMÌù ßéÝÝÎ<Ó/R°,ßÕ=ÝäýÜeìßzvMÈ^ß›%o§UkvtÑæýÛ¾Þ$ÑR”Á¸ Á5½-[ă"¥õ,áRÝ/ÝÑAÁ³Ü᡽áW1GhBÝžÜ%~ÛBÛƒÄáê=ßò=îÝETá<.äÞ]½÷-´]äüý¯¡ÖNäûÕ.,Ñܽ䵼ã\K nÝ5Ná3¾áœàU.åÞå4>âOmæå­æeŽæQ}²çwrn`I^„Úzž¸þ–Ýv{º}¾[yþç„.«¾1…®¸‡Î3ƒžè޾©‹>3žÚ—ý!>é˜Î¨‘N‡™N«›î‹ê€+²¦-ê¦úé®t馾ê°Kç¬~êwnÓu>ë+Eç´>S±~åú}Å»®ëVÞâ,®ã½ìXåN>ä_Þæûœì ÎæÍîæËÍì\í&ÞãÆ.¯]íPÎë¿.ìÙqwì.Ãô=íËîìèÁáídþìéŽc?Et”í6¾í¾þîë~ÏÄ>ìî~ìÀbàTíê.àçnðE,¾‚­ïORΟ,-íOñO~ÌŸá^ìÜîðÌóáVâH×WðOþòÈNÔ(>ñœ¬ÄùÝí/ntT~_òÔ~ï®ÒÄ¥ò¨ÌñùðŸ2ï!^"ò5ïåê|ä+æ+ŸÇÿM¾åoòJ®ïC½óþ>î<ÚZ>óDï^Oâpæ ïóOö=õ4ÿõi^ôg®öonÏ·÷r.Ž3÷µ^éóêz¯çD¦ê{ÿ§¨^Z?ø“Ý÷„?êü{‡¿ørmøŒ¯é¹^~ÿø”Ïç˜]ù—ù”1ù˜ßù†~ùž?ºšÏœú¦é úyø`c÷®÷uÿúÖ4úKlöýîòµö]önOðl¿æ¿¯ì¼?ükßûÚ>ôSoûÿ®ûÉÏü×þÎõÍýÏoíeïüÕ/ý×OýgýÛ¯ý·ïñ»_üÄÿöãïûÆoóR?ýøþýÊõWŸûÜÏþÖßýë¿üñoÿÞÿTjïFüð^þñë0 ˆ0!Â` táCBœ¨°aFŽ=V”øñ"H†!IŠ´˜ÒäH–Q®TÙñäÌ–0mÊdS¤Kš… öSgÏ›yæ,JçÐ_G™>MŠ´äÒ¨P©N}y5ëVšN«~Õ*ÐkX©\ËŠkÖêδJÕ®û–ìZ´¿‚ ;x7oP‚?…¶=Û0ÝÀãºE\î`Æ8+žõ1aÊ‹#_–k´qæÄ“7'þ6ü²Ù†?Ú-è7õêÊd=cm™óèØXkÏ&ü7`Ý·}ׄM[xoá­57ÞYtràAÞunõiæL‰W—¼\ôu펻ï¶]ü{]ð廎;rè™óÄ;}¡^Öè¹³wíž·þà÷Íöï·Üø›-ÀôH#ð7×cK:Õ@’î¡¿ðc‹Be»ÐBàþc¼ 9lOÃq»‡;qÀ5܈>»ø Fè¤ûð¼ÿ[о³»±FAdqÇüz<ÐÃ" È÷lrðĉ|Èã¤ô1J“¤òH+‘ 1Ë%•ÜÌþnrÑË.¯4QÌ…DPMÙTÎMåTþÑÌ1éäÑÎ5ñRÏ7ùlÓÏ9­Í “Ð< ÅqFG…4RI'¥´RK/Å4SM7å´SO?uRD„“ÔQ­+ÕSá¦W_…5VYg¥µV[oÅ5W]wåµW_6Xa‡–Æ¿T´OF«LC.Yl•Xi§¥¶Zk¯Å6[ms5¶Yõ¼rY-Áµ1YÒ¢Ý6]u×e·]wÙívÕoå ÷YÉÝPÜ÷Ð}·_ÿ8àtã5·\}Ã,ØÔ„U]˜U†8b‰'v•àƒ•µ—Yz ÎxÜ[â—b‘G&¹d`-î¸Ð”¾xφ½ûذPg¦¹f›oÆ9gwv4æ3Wþ¾óå …æøX–v¹å?‰Î饕j•ZêEŽë©ñÝrÄ®ÓdK«1¦:i­¯.ûé³Éæ_±×tì¸áNTîºéVØî¼ñfXï¾ùv6í¬ßú㯠ûgÂÑnÛçy™>ü^ØâƒÒmÅOüq¿/7ÜrÍÿ|q˜3¯—))Ï2rI7Rô¹]¿ö½eÿ›öÀ1ßfw‡5ÔÅUÝcÖÌ}èâ‹Ætã•G¾sÇ5k2úÕLû½ãà‘=¾iÛGÏþíí—ÿ¾yÈ=/½qçú‚N¾«÷šüÖ“_{øçw~øëŽ_ìø"Œqÿô+Þûê×=Î/€Äcžüþ˜@ïµMzúûÀFÀЕê~Uc`³wA³åOƒ äàŸxG¹2ÙEp!ý h?÷!Ѓ ·B¢4IN2dÜ_X>ªpƒ-Ä!ÛzÈ‘b-ˆ¯ó!¸Ä1vIŒŸgE 2‘…M´"yHà 2„g_cÅ8FLaÑŒWD£¹™Ìo,Ê¢˜Å.nñ‡gTcSÚG>öQ`r¬"ë¸Æ;¦qzôc"ù/@ÆŽ;$¤ ID.Ò’—ÜV#&ÅÚQÑ‘“äÚ19JRþJ“zãäí†ÈEJ¦Ò1¢,e,eY«SâÍ•àóä&J2öÒ—¿f¨@þ¹ÊBæñ–â+æ!©@Væ•»$¦$ ÙJh63šs¦5µ™Ljf“›Î´e5¿yÍ@Nœ²[fÉùIs®S—Þ”¦1ÅÏÂÜjéü 6Û¹MzvsŸãä§„ÔgÄyêSžð4¨2 ZNcÚs †C›tÂ…²ó ÿìç9TÑ„=Ðw¬¨ŽÊP…ŽÔ¢%ÅhB[éœþEgzõ`JIêϋ֥6¥iI©ç‰Â4u}¦Iß)Ó“æÔ¨øòèi2Q‘u¨8Õè N¡¢¢WeiD³ÚT¨º3¨NýjW:Ó$2UªU¥*XÓ*V€¶5£× éYՊΩÒ­vëFïªþ׼ʕ­okQ£*(|.5˜—:àa+Å6Ö±ÍÙ^ýzHXJ¬–²«lÄP–ÙYvÖ—åë_ãÇÙ‡VN¤ý#NPëYÖÆQ²„májYH½‘R­Åí"M Û×BM¶ŒL¬mU›[âöq·÷¬ë‰~ë¯ãbm¹ýÚlq¥ëÆæR´·Îîðžû®èN×»"«.WoJYÚB*±å}”jÑ»^ö¶×¡¢%«W×:ޣʯð¬}CKßÁ"÷ºÖí+oìßô¿â­o`ŸÊ_ýN6ÁnUi \`ãwÁ,„ãK¨¸Ú1ÃŽpƒlá°2XÁŒzjÔyâùb8Ä,¾¯‰5œ_þÜ`Õ4Z½±O#ùâ_X–1ˆ7ÜãÄx4ÅÊ1 },b“¸Å?F0”cz%–¾ÈžL埒Kìâ! ™ÆD~2“'l¨NäªÜ 2½¼dï—Ë_^s‘_ºT…Ј™`Žñ›ÙŒg7Kù§6sVmÜÒ yX͇î2¢á¬è=Ç9ÌY2+.Å d=oÙÏÀK®ƒ/]Ï­¢¹Ò泦'åQO9͉Fõ¢SÝhF[ºÔ¦pÝ;ëÈÆÚÔŸÎó¦ÛèÔ|—á½µ®'xjU›ÕQÙ®¯¹ËkL3Ûz™1±Í’le· ذvr®_Ýl[cûHÔ®öº®Ííl÷yÛÏvö®ÿîpþ,ÝÃÆµ¹Û,êy3¶Ý®í6¹¥íêz7yß¡uÀmönÄ•›Þ¡Žv¼îhm÷{Ìÿn8Âý­ð„ »à—·ÄNñ‰[\rùF7ÈÕmðŠŸ{ä_x«AÍðŒ³<嫿·Æ«ÓáÃ|å*¸ËKîpJ{Ü-G¾³Î;nrxû\x$:Ïy*h¦'YÅù´yÎqÞò©¿ÜØ1:KŒùßoÿÙÈþÒª¿ë=Ðk>Ô+@Ü+¿ÿ³,‚Àéó½¾ê+¾ ìä=$ÀÌ£¾õkÀüƒ? |@Ì@À‹<ľû{;Œ»ö¢ýë@D"¤=´=|"Ô=¼@ä?ÜAœ"?Ô?0S»$AæA\BÔAåÓ³SÂ$Ü@"üþ@*DÂÆ+Á(º<k©)ÔB0¼1|<,Á0t.úH‹@„B ì$!t?7Ä?^Jô‰4½;Á'¬C9lA:LA> Ä;º;Ë{==,B+ìAE|A?ŒAA\ÁI*ùPª§cB3¼D4ÌB2ì;M<ÃMêÂ.üÄ2ôÄLäDÂ+E'ÄH<ÌüO¤ìOøüO† ÐW!OåœOßíU Ö-MUÀaÿýÞ .ß%Î^vb)æâ.â"ž^¾á ^áÞea­ã_‹¤b ÆâÈ=â*ncøµb÷ã&ã>c3ÖãäMb&Îc>þãåÝcAäAöà7fã>Îâ@>ä;FbFvá:Öà9–_EvcG†c4Qʺc#ÆäD†äFä¦ä“°Ê0å1.ee%¶d9àÅ-KNNeO^å2.ä\&ä]ndÕú˸|½ÓídTþdR–ä+~e;æÜѽSîæZ&æ[ÆcCŽädžd,–ÝÆtæÚ=Õá-fU>f:¶fdeͬ3Ç Sjåo¶åp®äVöã”XÜIÙúmçqþgx^duve}f¬\Õ²aî^hhvŽfwÖ_„FMPæçxÖå^Vh\æåjögXÆçwnè}~hŠÎèKÞß4†Æ56æ‹Nh’feuÞb/Vé•.a0.hi~䎶èŠVfÆb雯ivio†éL¦ék6i‰Nœ&ê¢nà\{>è žæ^gÕ2ꨖj¤®gæéˆnê‰~j›–ê®Îiª¦eƒ~i¬Ži§îgŸðê´fi°h‚¾j¦.k­>kYigip†kŸ–éšÎk†6k‡–kÀ†è¾éŸ&ç½jÃÎgÄ>ì¿ÖèÀ~ìÁVlŒvl&k½®ì™fìÅÎl¾žì’þìþ“îìÊ¥[ȶlÂÆëÐjŽíÆ6E)Tí¬–ìͦlÓÖìÖæl(‘åblÖ¶mϦmÐnÑþíküå¿îÕÞjÔ¾çØŽëÙÆíaæµÛæ¹.n׆îëÎíìænßþ³lv:DìíåvnÌÖîÚînòNnÚÞV´Óòöëóîèžoù&îôöšyæíÈöîþVoú¾oÿ¶nü†?Î\ïçðñðçïÿ¶ofÜooðwp ?mø.ì7o ¿í—m¿p oÿ¶º6ñë¼ëæñ pÂHiµ†ñ—ñ£Nñ¥ÆðÔ^qÓ™ñçñgkD•Þ±fnœïñ#Grœþþñgë·¾qG#Oò)§r(^rn†Ù°îéŸÛ*÷ò/ÿâò''òG60Gó47á+×S“n3ÏÌ—óvóÄÎq(÷p¯pïp·s8ßp>ó<ô=7t GtWô _ôt.?ôFïsAÿsB‡ôDgôLwtKgqNÇñG_褶jQwkRorSßòN÷óºª.uW?uXOõO÷t<ÇïyFg1wò;/óZïõUßnÿ¾ÜÒÍÓtuZvô¦tì^ö`gÌ;,TîõRc÷õ1çuk?v[oveg\J u’õ˾tIôd¯ospC7çßv]GuqWõm?wyþOwD×ï`Ær¬}÷!Çöjßõlÿuz7p-‡wd§wåÆôMGw„'wyÆ÷pç÷÷÷}'ó~_øtMŸôŒWøƒÇø„ßx/wB›óYswˆ¯x‰¿x=§p)Wó*gsj_ùBùJOo—ù)ù“'øˆ§økWy Èy5ßù:gvŽù†?zœú#/zíœùq×ø‘W÷¦Gó§ÇÀ‰Gy ÿy§fz«÷qžoëXïù”ïz­.yâ{ Wj‹÷x–Wzg¯ù£Ÿ{¹{n¯{¼¿ûyGzªÏ{¾ÿûzß{ÁŸz›{š|†/|ºOüo|¸_|»|½Ÿ|À|įüœP͵gòþY×ö¾7|ÐgüÌ(Îls¨?|©ïxÑ—üÕ·÷çÍ»³úxg}ÊwýËWý¤oða·Äbçü|ò ¯}Ë'}ÇŸðéÆ2·~¿ýâ‡üæ‡~Ýo~ð^ÙO}Ú|Å~¿Ç}ìïuwoë_~í—þòç~çÇüí}z¾¼ÒfûQßz€Wþì7~õ}ûgwïGÿÜ?ü·}ó`¿Hð—A‚ ;ˆÐá‡#R„hq¢Ã†7*¼Ø‘cA!jühräI‰) k‰ò寒0+‚T9S¤Í˜8i®Üé“äÏž5yÞ:4hQ¡)eæ$ÚéS£J“RºªÓ¬P™j=þêuªÎ¯U»‚åŠõ¬Ø°`ÉŽÅi6-[«0ß®E[Ön[¸ñÊíë”nÞºiûåû×0âš„ã2v›˜`ËÈ’'S®lù2æÌš7sîìù³ÞЂ .~˜¡éƒS7VÌ:uiѧsÆ=;bíªÂŒñîíû7ðà‡/nü8òäÊ‘ “­Ú¶ÚÛ¯¥Jw~ØútÒÙ«kÇîýêwîsSï^nþ<úôê×o½õÝðÏ«æžo÷öû{åÃÏv~ýE§ßAå±w ‚ *hž{âÞ{ùÕ'`\¸_„ÿQ÷ ƒøi˜aw dà‚%šxâ r¸¢‡"²ˆa‡~è …3Òv¡sþ5ºx‹$¢ø#A §"…2îhdŒòé˜$„LÒˆ#tK¾èš|> y%–& %}\Ú'e‘T©¤—–¹Õ™«Uù›mºù&œqff£€`J˜f|cºh§|ê‰|ùéä€aî‰g—æˆh_ƒN"¡u2Êc¤‚N꘢Q^*f¥‹f:›£†ú犡"ù蓟~¹i“¨–ʪ¤Jªª™´¢i«š²ZŠkžjÊk¢ºz*ì¯Ä‚ ëÀ6Šl‹¾«,¥®ÎºVdÎЬ©dB‹©±«nË©´»v[븷–›kRÍ5Øœ¨ÉžÛk¸ÃZKî¼æÖ‹n¼ÅÞ o»ÓîK_µÌ’þK¿¬›ï¨ÿ.ûm«ýŠ«p´Ë‹°·ï 1·×t0Ç \°ÄRLïÈö–ŒoÈÏZ¼ðÊcË,Œ'—U°Á’ìñÁ)_ËpÂ2_ì3Ë7ü2Ïî ëÑF}{*~Ü´Ç:g{hÑÍ.ñÕàêLòÖ&w2Ñ-ãÔqå|gÕ1ÍoØI[½öÏpõÐEOMãÀyƒ<0ÚbkÝ6ÝH®´Ü.Û ó†…c­øßeôݯ¦8àŒ×í·È– ®9á•{>ߪFîïàoŽyÏœ›~øä™Ÿžôè—®öëƒÇ>±ê´³Žzç»»m¶œÁkÖúˆÂoÙÆÇ+¿<óÍ;ÿþüð¼¯ÎûíÐY™%sÄŒýy[È=øá‹?þÚW¯òïß“oœ÷¼_¿þoí?ýõÛ ü¶#îzÑïÛ}ðîͰ€< pòǹóU,}A oÈ(ÿÕ/„ 3x% *‹\CÖáÇÁ•…p}Ô Sˆ¥*̃^!Y´’ï„*¼!$C¹¹lý`ð´Ä ¦dˆF<"“¸<óí/uµ[`wF½(öm¾›官»,N‘‰^”žîºF.ÂŽŠfü¢¨Å'2ªŠqccÏ8Fþ‰1R,#±HG<ÎQuÔ£ùhÇ% Cjrä!yGýåþq‹{dd‘u²oˆl$WæÆ¹92¼d$5ƒŒ²x•¼Ù)IµIÃý±“’lc"]¹ÊÅe²…7{ÙP9"Cbr¾le-!Ë`ò°x™Ì-ui0^†r˜¿¤"gÙ8`>ó“•l)["döÉ™Ôü&4eéÍpÓK Éå6O’JBIórä¬&{ ÎOF󌥬Ù)ï¹KKÖSžïœg<›éOzŠó(Ý8 ZN„4  |h?…¢Okµss íVE{PX6”£ý(D Òˆ†ô¢M蕨ҕ²´¥žéhaªI”¶‘†9¼)N$S[îT˜=å¡Ms*Ô¡–oþ¤"-)<=:È µ©DÝ¡9iS£š”bÁ`ªS³zS¨2”ªI*R©‡U­’5…\ŨTgúÓ¨šo¬e}+ÏzÒµv5¬ÿ„Kóª×½*‘®hõë\½ºQ°’´°G5lU™iW…~U­‚½+cëØÅ:±åéc# Ùʶ³‰å§g/ëÓÌrö³Ý¬UÓŠÙÀ° ´¦U¥jGKY¥ZV²«íKÓZ{ZÒÒ6´¶•mm7Û[¢Ý³¸ÚÔ¥bƒ«Ùå–V´ÅDmrÅ™KuyìqÑ}-;cû\Þַ©K¶i³ƒÞìºÎe+w'«Üæþv»½æGô©[ØB×µç­ëz‡{ß¿6þÉLÈ|³[ßÝζ»ØuUF§÷]µ7ŸÇå&}Ó{[ï2W¿íEoÕ[ò6Ã>p»Æx¿ŽÊDS;à{¸f/‰] âS½ØÂ1vo~ lb‡’¯>þ1ƒÌ¼ XÂ2¶›[áªä%—H®?YÒQ6tªŒ|ékùÆ‘îòž=]hN—YÔg¶ô§1-9M§šÔoõ¤M}bXošÒþ®°Žm]j\ÇÙÕy¦u«uýjl£ØÆ>6²“­ìe3»ÙÎ~6´£-íiS»ÚÖ¾6¶³­íms»ÛÞþ6¸Ã-îq“»Üæ>7ºÓ­îu³»Ýî~7¼ã-ïyÓ»Þö¾7¾ó­ï}ó»ßþþ7À.ð¼à?8®ð…3¼á8Ä#.ñ‰S¼â¿8Æ3®ñs¼ãÿ8ÈC.ò‘“\Þ-)öÉ)sŒ“¯\%9Ìc.ó‰§Üå-G6ËY~ó™ó¼ç>ÿ9½%cl=2E':Г®ô¥3ýÚF?ºÎ…^ô¦S½êV¿úÓQnsœoýê^ÿ:Ø{.õs=ìf?;Ú?^s­+éHOþ;Üã.÷çÜå*g;Ôç®÷½óÝáoï;à/øÁ¾ð†?<â¯øÅ3¾ñŽ×{×qÎíÈÏ›òCŸ|¾³.ùm[Þä_9æß÷®ôéî|¸KúÔ›{ë®o»ºWî×'[öß¶½èþzÔÛÝæ»·;ÊÉuá—~ö¦‡}Î/ŸòàGý÷G?·å£¿sçûžøÊw}ñË-ýä3ø oþõŸŸ{«OæòËNþî¿?}ó¯Ÿöèæ}õÓ|îýìOýØ_võ3_ýôÇ~ÿ»užýõßüUŸ¶ßý_ÓEï)Îû¹Ÿ÷韷•_Ö ÿÕßz ömì ÿþu n ÞÞØ= J`ž` 2 ù‰ Æ  ~`ú^ößù¡à  jÞ¸‘^³¥¾ šžB_ú` !í-¡ ÎàùÅÛ¹ ‚`®üàò`~ î±^ZáÍaa†áò ³à~_žàN¡îå_ø]¡öžøEávJø!¡j]"Úa÷M _!¶Ür"¡"æ!#¦¡Òáá=¢ûѵm"Áiârâ´y"&fbµ]â¿=¢#&œ*¢"Àµb–¢,Î"-ÖbæéUºIâbÛ½É.æU.¶É/ºT0²‰-NÜ0$£2.#36£þ3>#42#Fc4®ž06f£6n#7v£7~ã6 8‚£5ƒ9ž#:¦£:®#;¶c: ;º£5ÒbÙ1J5æ£>îã4î£4á8¤@¤8d8a<&¤B.$<.ä;!=žŸ=Þ#Äù£E^d2bFf$@¤G~$1`Hbc9:¤Ižd1`Jšã<ŠÐeL$E:ÜFÎ$5ö#FZãHæä8$H–äJþd;6$J¶¤ Id÷ÄäÃѤR:£M^$Nê$Tr#O~¤O¥U¢£Pž$QÖQ2RÊäR†%G¶ÝL>eTžeHž_NVåU^eVšäVŽO=åW2Ü^<ãg cKá¥gè%KñegøåJ&gÔ¥a&b&¦b.&c6¦c>&dF¦dN&eV¦e^&ff¦fn&gj\@;Bio-Graphics-2.39/t/data/decorated_transcript_t1.png000444001750001750 1332412366325116 22553 0ustar00lsteinlstein000000000000‰PNG  IHDRd }"gPLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿ@àÐÖÿúúÒ-ÿÿÿÿ)ÿÿÿÿÿÐÐÐ¥¹€(IDATxœíš£*@÷ý_ ïlßz܇ÚN¨LLbùçÌ×¶A¤@åI›ù»:C!{‰ÙI3{‰9…üÏþ7†žÐRÌNšÙWÌÝ%3TWßO¦@ ¤À³8½@2HhTàôjÉ Ð+Œd()Ъ@·ßH&‹YY½Ö¡£@ ¤Àu’¹½Ø]2›3<ÏÒ@È^bvÒ̾b"™k„ì%f'Íì%æòú’€Ss5ÉLÓÕnrä´*Ll] 9Ç1 Y‰RöŒ°UÌ“4Óú :0fíxŸÎ2äå$~ó›—qeûcW†œÖ C.4sï˜ñ:ÙóПÍ#® cV.ëÓ©C^R2Cêßò²T§Î<¤X7 Y‰9¥ìsJ·‹Y=›‡4Óô :0fyÙ˜ŸNò’’qé\Éa…å¡+BfëFï µ8;Ç´[ílîh½¿‹˜;žÎKóî’’¹‘ÞÒ ‰åé*BÚK¦ŒSvŒiߊ⭣­fæí,"ÛÄŒ‘w[òÒ’ýnNqƇN†vºBvofÞÎ=bæÍÜI2{7ó ÓYÆA2O‰'ž­!üJGÏ:dL´ yD3OrhË~aóˆCcVÚf}:UÈKJF~†¬>fUçÏ:då’1iÞÌsZy|›if3ӘŬ´Íútêëx@úÉ€)HLA2` ’S ˜‚dÀ$¦ 0É€)­J&=ê*ˆ™·äÃv4+'ž+=ÕÏp€!=H¦|ôT?.: ;—LùåƒâAÑlx4+™¨‘03SÿB iV2ÙÉD?’qéKV+)`DG’qâ[ÐäGØLüXÒªdà$ 0É€)íKf¸:\ôÇw˜æ%3 ÿlÏFß f{ðß9º­¯ò{‘÷Êû5±Î²_?K}T̯mi]2Fyþ½1üûsâþí]2__qùUH¢Li]2î÷íç~õýþ}_ØJ懬Ëú#™?þܺ’LyT–Ô ³l{E†Y.7Ït/™Y$HæFŒþÙ^2/˜¥ÞK0üº¹åϼìH2ÃÂ_Ð¥ƒf؉£d†ûÉ|M—y#$#Òï˯=st[_¥.˜$óÈ ô¤¼ÔaVKo’‘ÿ›è ¿!fz@iú†õå ¦]¸wɤQK¶ö•^ÍÒùp,st[_eºWú“î–>”ÌÖfYêfwnwJJFüÑn|" ¥ÌrÑT[öá$™>çdfq|}}•ºùšÓçÔï—Žnë«d’ƒ™÷Ê‹ýtϾök²KŸs2ƒPÍ ¿«Á’±Ô ’É´¢^¥å{ɘÍɘöµ_“e61Ìå$‡0ÙHfÞT~5ŒU?F2³>ò‘ÌWJOy:“̬Û‰_Ó¾&&~»“ÌâíÒœ£öýS6=¹wÉÄ©Ýùæ(¤Ä‰ß˜^ÿÌ©Éìñ¶A_ aw&™ANù–¿ÎÉÛ({ͼï•F$³G·õUýc¼­:ÛFr¹šd>b#%Æ¥ûK’€#A2` ’¹›gáô|p}!™«qÙùâ.8tâ·n–—}ÃÄoç ˜sÃSØHæ<¬~¬\^(æìð6’91 •‹¿/D1燧°‘ÌiXýX¹ ›PÌøÍSØHæ4¬¬œÌ…(¼æc}>…Ýçz¬6¢Ì%œ,ÓÛ³Kí±ú±ru}¡™“£ä)l$s$k+Ï//4sj´dx ÉÈp®ÇÊa#ýc¼­®Íä‚d®Ìº?憆¸ôå…dÀ$¦ 0É€)HLA2`J³’ñÞß-m}¸¯úµTÆãðÕÕUùCÊRÕ?-¸’ÇÇe¥¯˜½µÕZh¯éE–Z)·ò–,ý°†°­JæÙe¶F2«ò®«Ê[{Uwô’™3m+™Yh¯®ÓšºÜ÷ðZHèäPZ–ŒKïÑ÷Kxz«ÎG82}Z÷~N™Kðùû©¯íU¾çÊÒ*ùUuS=Ã25Wd¡æµN9kX _-Sõ~y4|ýdGïÃöæçªZ7ٮЊ´—¨sä¤Vê[ÓªdµããOèxÅ»cìº1¸¸Å•édª,M–àd.QZ%Š®n*Ù‰½TùE Y‡¢†2Q·]ƒl­(Sk- µ”åë£÷q{宩ö²n•#/j­ëÒã~•ºÁÆ4+uÙÊ‹Y¾q¦ê^¾ÒMÄ›¥¶ÚK^¬2O¬Œ®I¥²:¢Ì¯»”ŠáÛtª h£ì§¢:%ëx¢]ºYù±Ò5•ÖGo£öƽòº-ù¬†Q2¢ÕµºÁÆ4,™tepýOìQí&º`}é꾬÷}A2¢d©ÈÇ’)£+‘Ñe}4r-¤¸KÇjýÑ{»½>ß«Z·ú‘/Ž’"™hU2åE/¶|$ãÅEëÃ/%¡%3—ãSiµ®¤%S¾ïû9Z™ÿ ÉTnètQ1ºÉäG#Ô©h—ÔWe “•¯Þ‡íÕÐg$ÔmñÈgu’a$³'­J¦69).8y÷S™’Uûfù³©NÑMêS¯±ç•éj­÷ rÓ·<µ=ˆ.|Q´®h—.G”P=¶©ü…#ÿq{Ë:WŽ|­–¿Þ:°¡YÉ_H~aýy™ÒÛµÝ[{!Ѓdô;]±qaýI‘ï× /º ’S ˜‚dÀ$¦ 0É€)HLA2` ’S ˜Ò¬dÊÿ>xXÚ†t'™}ÿórhU2Ãp·‰XN)#€}iU2“K—Ü.Bã’™‡/Ñ8ÉìLã’‘¯ À´,™0ÿ’n—„k`š•ŒË'~§”ù ö¢]ÉÀ)@2` ’S ˜‚dÀ”†%óýý}_|X…êêrÆõU=°Q¯Ñ®d¾ï?ßî$r•dÖírŠö¬¥mÉ8cÉÌ¥Oc&7-E¼ïYtiD%r:™Ö]¶uŽ’çŸTig¥]É„.k/¡’,^ðÁlŸJΠ©<¿,§’_ü|[¶àc–LdöÀÐÍoAj#'¡ƒ0ôH9¿çAŒsZ2®ŒÓû~/æ8!MKÆ}[w¿ï4 ‰Ëï’qùRdÊò« )K²’KЮdR4 ò]H`q$ó]‘ŒÜš«C–’« ÉÀehW2aZÔ8H%R‚È©`9ñ›¶Æ‘Éw–¿Éd¿y~€³Ò°dŽb“¿¤”—ÉlËfóÌKúÇ…o€dÀ”f%ã½¶Ø!Äé»Ó¬dvàr}ör†&hU2Ãø=‚lÉG>úŒÂeiV2ÿ<Ã?Í4o‚d`-hÞɼÏå4õq…Ñ ¼A¿’ùœþ$ƒfà Ìûô(4/Ó¯d.§ˆ³€eà5 ¼ŠWA2ïs9M}^a¯Ó¯d>§;É x$ó>IÅÀ{4+Û¿±ï‘£O)\•V%óžØ$sd ;s¹ C´+™=¾\åøï‡ym±A“^¥]ÉÀ)@2` ’S ˜‚dÀ”f%óøã#±Ñ/¤»,¬?ÈçŸå~PNY̼^¬·Ô®§Q¶nåZ ®M«’ñní…îÒ—÷XÝ-ÖöÓ'›^è„HæõH¥3Z–Œ‹r ¨±_Ø*³¨­iË´îÅ^Yΰî}JQyÊræ:‰ÒŠôXnVάӰkEì[«­hËú6>mÊ9½."Ê#¦bA[´-Ñá³±¿õÖ|\·ú´GèŽÙÒ§æuqC¡óäåÌ)²&Êv2–/ËI¥ø”_mõ:‹nWlÅê6®h¯ï›¢dGÌ©JBK4,?½w§‹\¾M†wÏ|«êÛYGK{ÆübŸJ§/»aYÎRЬˆHÿ”&sÉÈ­²]>¥èîïsÝeé²áȬo]¹t¢ä åt<¡1–Œ«vµ]_ü!=/a©û„—§–Œü•¶/µ±<†¯¶îÑ2œ&hÎ%ãåíRHkOn%–5•n—„rÊnX?8¹¯‹¥…üåí’–LY¦.6«¹lËÊ6zÙÀ¥Öyµ—/Öó‘L¶ ѪdôtåÜ1|±5vÙÊÄ£ÝwÕ¤h*ÙÇÙÌjMÊr¦UÏÊ$ªè¶êÎOÔ¼EÊ <&²-ëÛ˜•V¶.;ªù‘Œ)®£YÉŠuO¡'Â…@2 €’S ˜‚dÀ$¦ 0É€)HLA2` ’S ˜‚dÀ”î$3,¥ 3À› ™9e$°­Jf¸›bZþ,¢5†A¤Ü—SÊ ì30’ØŽf%3$ÑÜ_Ç a1ÌKn—LiV2q+bÃ0_†”Õ )ÉlG’QÚ^qr#:‘ŒÉ Ù8ǹ|ô‚d6£ÉÜ#¦u³‰ßyþFÜRÉuøV%S‚:¡ÉÀ! 0¥YÉü~Ê!ÎÆÇàUš•Ìßgl ™§1N’#hU2Ãó7|Êõ$óvS>pe:–Ì?Ÿr=ɼÝT4ïƒd šS ’A3`JÃ’Çñ¾-z\‡’A3ðíJææ–q^Zô¸%ƒfàÚ–Ì_$#ù¼Éh^§]Éüƒ`ÌÌ’A3ð* Kænæd›HÇÀ‹4-™yNƪÇõ(/Ó®dÒįUëO2(Þ ]ÉÌaÛõ¸î$ƒbà-–ŒmëN2(ÞÉ ¦ $ƒbÀ”Ž%ÃW=ðM°­J†/­ªÀ—VÁ4+™¾‹Òþë2·fƒã ð*ÍJÎ’S ˜‚d6fŒ‹åÍÅêrÆÇ™J8HfcžH&ÏùÚÖ¥] œ$óã8Þºøm9¯—)ÓzÈïBÊ”³,A–#óÏ[§bŠüs2"ÀÑ ™O™•á&Ì#‘2Žr¤1Æ­iÌ£KåÈüsº+Ê¥¸jD€ƒA2qp”r=l;¤Ÿ0ôˆyÆy$︄:œŒÓûŽ‹9É|‚ìÔÉÄ<ù:§Ës KÈü£Ê²Œ£Î‰dàT ™O˜Æ¹dÆÕ’+’‘[suÈRr5!8)Hæ#îŠÑ#1éa,fGÆQÊct:œÈͶÖF2ÙÄožà ™«°¤”'É\1’Y•p ˜‚dÀ$¦ 0É€)­JÆßp>¼*6—;<ÏòSèò6•XÝ^ß!-Ç®fXÈç}ž±HØV%3u¯ÅNõžd–¥•%¾Ð™?’ÌóÍ~!`7Z—ÌýÍ{z÷éÜû9ݧ|òíJÏó#È’È#Ëw²d—J5‹»f[éäJ}|Þ.U‚+Òçº!8€Æ%“ BõóØÙóAOÒSØ”•‘n›äî²µ¯Òq.«OùãV¯ãÊú8+•äU´uýv¦qÉ8Ù+oõ^wö°Ut^—wRÙYÕÖRSNHFí%^KÝÉ}ÅœR*Í¥¡OÖF­Ø²¡jYÕ’Oµ-¦¯eý£à²œ;Ó®dνºÉì’nA2` ’S ˜‚dÀ$¦ 0É€)HLA2` ’S ˜Òªd†~–·µy·”Ëaˆ/›Ò¬d\Ò‹’̰´iH)°=HFª£4LpŒ‹#ض%2déjn¬ €ÍJf·?%ãÒ0ÉlN³’ ¿²™–EÉÜ­„d6§qÉDm,OüÆ­LüXÐdʰçO°ùÀ„V%S2 Á&°#ýHÉ€)íKf€­9ú”µh]2ÃðO/üÝ‚áÏA2ðmK¦#ÅÜ$3þp3Å8ÿ#àçei-:ðO­eÐÛ'ÄjÿWÖ±c èwTËÓVUŸšÇÅ~Úï -_ÊõRÛâôV²Ça"Ï hv¾Jù×QÍ­ûÙ—oË•ý{Rض€Ú4{Úì¾¾·X5gþ\¼€:< y¹f°c'†0ÜQi?þH_5·w➡ݻC èß²™€Eò€Ú?å¼ßšV&r·€§·Åï :ƒ]¸ è1Ø]lÚÚÞïÄõ’]Y}¬) ¿þI[ÛÄz×aòæ½^²+«_IÀÿKèDdbBÍEÏï°îww޸׳%&¨·Î…- °ñ¦’puäåÀÍð´™‹m3Ÿ çpsÉÝ,ö3)EÀ­=§+z¾Í"ã̺šØ8¡S“)`–\²ëîœúëc}ƒ•³ 2·™«k%;,ô‰ "·€~FõÚÆ(þýð»V.mÁ‚ÒF>0à.'ðäjQüÒyÍ]º4õl‹Ø0emŸð†œ"‚€wn¦½Å¦­-æUÄè_b+A@`l"˜î½-t8Ô`ɰ‹šCÀ{`"¸÷ö÷kdƒ‰ àÞ[¼&‚€{oð˜î½EÀ{`"¸÷ï‰ àÞ[¼&‚€{oð˜î½å:à=0Ü{‹€÷ÀD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&’-àúøöÍþ™«¹ 0ÿëbKüµsçE@{!ZÿßÜĶàÁ&þúÍ·.ɰoB0áÒp›‡ sA?¿·b%Öœ5M9C„°m0©/à%ýþÙ‚±6çRÍ9iÎ`9%;_béjDÀ®^ðlÿW×t9üÓBÀL¤¯5‚˜\2­2ÿšÖ¿!sÆ£“æ æÒþ>Ä,Øg¶|ØòC6l¹òp¦Í–Àî¯F)ˆÈF@[ns ˜# ö(g_˜TõÚ Y¯«›Ó~)90ÓÛå,¿dëdV5^*ÙýÕèþð¤#Š£BfÐí²>?‹=]çÔµ‹ÍýDÉ®¬~#4¹üèúì ø¾;ë×fœÐ»«ßL×é®Ö\Õ$,ñ@Àƒ­í·Ù÷gn(Ù¥ÕÏ0RÜüæžX+¢|ñwkÃÂÖ²=!`ü†Ü“’‹UL\Ѭò;·À­»à2ú·O X©Ük”’Öù6.Ù¥ÕGÀwcÀÈbÐeJ³Ï‚ # D¤®€÷ç vi3ý@ß0ið†œ"RUÀjX¯0†€À&‚‰ 06Läy×{Ú— ZÜû¥¾®Ò靨;ÄÂ3®Ñ6Ó¸0‘:S¿”_nfÐÖÐÏMÛÊ\Ñr3 ¹S@mžÉf¥q=}§ ½>ÞÍ7iÊüÏ-FûnÈË–…YØÚEhÈÍ4.LäVµéÁh»Ó*+ŸR¾O±¶- ùY¯ ܺ­‚¼| íƒn¦qa"· ¨œ9þ –~êÚ¥qÐüö%×™6]“ÝŽ›°C˜Èc.Sw\føÐ7›R@­°W˜È­ꈀ‘]°^ÔR@ÛëÆIH—0‘[´'!Ë„íIHpåë$dÙïšÅ¸³’õ$Ä씵;y²æÆub\ï.̸›i\˜VÀÁjX˜ÈFïRÌ)ÌÁ-£o¦qa"· »O;KÀý›¾GßLãÂDðJÉ€]‡‰ à•’»iYÀ½nÓØ3L¤a5-àˆ0‘†d<$LäVÅ¥“œÂè¯pf ˜È†o3<}Ìàè›i\˜ÈSÞS`ýÁDØêô¤<»jôÍ4.L¤¾€²›æöÙUî¶¿jX˜ÈcÝ4·ŸÒaO¤‰6Ó¸0‘'´w×78§tÓT8Lä9ý|¯>"¶{ˆÎì}ÙyT@å^mçŽW¬—ÜòtÓŒ_C}3 yN@µпFôoõÎý£o¦qa" ¨#»`³Kvºnšñ/EFßLãÂDžPû£ÀåçíIHZ7͉6Ó¸0‘çT;£vuSsÀŠÀDP! °¯<)àAa²Ç&}3 yPÀ½»ûrŸï2Åf&ò €G78÷PsÀŠÀDZp÷>…¶jX˜H Þë|3 A@`ØGÍ+A@`óÈe`2O ØyÍ+A@`l"˜C@`ÁDZ0¼Æžë§ØLãÂDšн¾öoÒ}3 i@@-u]:Ì-¿GÀñ`" ¨Ô÷ ®Êv ¹ÖÅf&Ò€€ká pØw®$ìÑ’‹ÀDê ¸ª‡€3ÀDšPÇvÁœ„Œ ©/àŸ6]Òדõµ<ìÑ’‹ÀDØT0†€À&‚‰Ôp·»ðIN âÓg5wæ]l‰×«/ ¿Qÿ,±-x°‰¿~“µ;ËZç]'\Z"nÓ‘€[±kNŠš¦‹œ!BØ6‰ƒ‰ô+`¬Í¹TsNš3XNÉΗXº°]ðO5wM—«%C@LY,AÀ”õ@Àr0‘¼˜K°²—a~)YéjDÀákX˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁDX{®ý°Ã%E{½kF¯9`E`";ÆžŽ€ÀÐtÔá?n…ÍDó´•ÑkX˜ÈŽ€V²ÅÃàí¢šèߪ½&s°šV&²#à2O à:Õv«Þ ¸¼½æ€‰\Ðý.ðófôšV&’' OaÓšÿ³ –9П„Ø%mOBlcÈI°âvS`ýÁD›&‚€ÀFÐ>¸>xÀwðÝ]g5”Á½ ¿ê؉ñ §jñnjî[@7²öΰž–¬oÃ/Ý7xöRÍKùÑ/—)ËÕÍh™É…y¨æì×àî2TØ «µLý:1Œ€Ú5öÒô×.xm2ÜTí¬Æ N/Ìs5§ƒ‘µÃ!C\y‹Â-ÙÓ0‘¢ªeƒ˜ïŠÍÔP@×ú¬€Ë•m§¡NüBåáš³—Ü¿VÔ”o§ÕîÆ‰±\G=ß ¸ì¾Ô÷.x=ˆ2ó¶XsÁ±ƒý+sÅCÀ\˜HQµßGº-æ¿»ó3»¯¶4²_QQ¬eý:1Œ€Ê¥»m£Öï‹­–:¸±zsâvß ÖÜÞIˆ»+·w'Æ0oÓ.vSsÀŠÀDj h[À 3îf&RRÀç ¬?˜HI7C¡¹K;?‹aÓì²DwЃò›Ûjno=N“]27WòÚÅæ~¢d'«/¿o}HÀû˜‘ýŸÃlî~uÿšêÙŸáÏŸæª3¸ýùÌŸýÔ¶4zøW3—ÿÀ{³ 6󾃖×Ìef°2›Ïþ­»àåó+‚‰”ðmÛ¯U€¶éZÞ¾v\>ãæýpùmD@,ÑÌû6ÜP@3—Y]G@ ð­‚00ÜÛ䎀v®\í:~ èV‚‰лw(àÚŠ]p àn ø^^Œ€oµ+`t¬ä$d×Î ÷¶Gfá.8híIHx2`æ- =…p§F[sâçݶ€ÁéJxòösY-÷Psã:1€— #OB~ƒ…>½¿a– Ø&ÒŠ€›ðg¶ iF@`“ÀD›&‚€ÀØD0†€À&‚‰ 0TÛ‘^lïR}ôÀüÑ7Ó¸0‘&t¯ñˆ¦ØLãÂDPË‘’´v"CÀñ`" ¨äHIn0vÁ#ÂDpiðä8!ë3–š©9`E`"õ ÆWBÀ `"M¨c»`NBÆ„‰Ôðozh3\«-{´dÀ"0‘6L! °‰`"U<|pïå'Áº·âÓg5wæ]l‰—ª/ÆŽüó°Åb6ñ×o¾uI†}‚ —–ˆ€Û¼ÇOÜi­{J‰ú¯9`E`"q•“ì3g  ²£| °z.ËKPù3šÎkX˜HTÀu7+vÁJíï‚×¾[À!jX˜HTÀ¿àDC­'!fI±“eêßj¬ÛKÓ»$`ÉÂp ¬ª€´€Àê xca€õA@`# hG( vÁ_‡ƒÝÔ°"0‘g §jñnjX˜HIÍÕAe¾ÆóW`”¹ãÛ \¦ü-߇ó¦fÜÍ4.L¤¨€ÚílíEÀ¯]ðb£Ÿa¹œh¦™‹5~xò&kX˜HQÕ"•v·¿¼¶ºæÐÏ`\.Ó8 uÂm`kaÆÝLãÂDÊ h$ûpÙêï]°ý†ÏÏÛlÍ+)* ÛnZ@Û.*÷åñ¶DÀÙ`"Et'k ènK°7'h÷ÞÌ»9 q»ïfkX˜HYóf0íb75¬L¤¦€¶ü¡0ãn¦qa"%|¾0Àúƒ‰”ð¿‚|&üwÏÏÿ³“ÝÅþïNêÔ°"0L®9`E`"˜\sÀŠÀDîðó•F(àçç=wG;EÀa"w ø™@  ËÕ°"0L®9`E`"˜\sÀŠÀDJ ø|a€õA@`l"˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MI0mø_Æ ö„€ÑA°ØnÞ¦8dÍ+‰ ¨¿ÆŠsíp­r´L¬VVÀp´Ì¯ÑW•Ê®•±â€! °f`"÷ È`…ÀòtÇyqÍ[½«¥ÀDv4󸑪7ãOû‰oÔbÀj`å/à'Ò‚{Z@w¤©…€:<æDÀÁa®ƒ¤êí™Ç jå^ÃΚëùÏ× qc5¬lí éÏ‚•´à¦“ð2Œý–Ó}Õ¹¢íßAƒ5¬,¼ c·ö—7^†é¸æ€U‡‰ 0¬»~sUë%«;¬ 1¼®QÛK›­Æ_aÛ:]KÛ‹€54ª‘ŸÔmRÀ£Í°®úC΢Qü î=¦o9·å.àQO9ÑóŠ€—6¶£ý& -`¥\¯Û±Z@ŽÊ¥TãìÇ€¿æ ¬†º?iÔf5þ ÛÖéZÚo˜H÷^‡ý Qã%«;¬ ÖL! °‰`"lBu¡ÂÜZsËá´¿ßö»ïáË~¨ ÃÜ]Ý…€æ/Ū^‘!Céý:1´€¾»Tp u-àË÷=üSkßC_ÿ)lZÀ—ï+eÆ3›´šs}ÿÔÚÖ­]¿ì§Ø7.`lȹžÔ«€*" Þ_LÃ%«yN@³óUÁÃdZ¯9ß÷P~§vôèÉvKV&r¿€îáhë]´€AßCî‚ݯ\ßÃ"0 Sþ$ÄXgOBz0¸ c[=×t˨;1´€þm÷O×V&ò€´Àj·€ß=åƒÙržå± K¸ã®Ìßš5‚3hnVŒÝ*¶œbþ;ãYXp7¤>=,û æ¼ûº9uÖ…ã ¸Ý`²0æ·úl«ÃV‹XÍ]„}‰·w—tN .à×f›i½ûŠç·Î«_`§âí‰X¼OÞv¹]Àø¶ Ÿ%LM‡e8¡/ÂòÄ‹ŠX®ðzah[wbpÇ€;1¾€œªÆý·ÝÀDžPq°]'&°÷šV&‚€ÀØD0†€½Áü™‡¶ÃTœ^õU2ìæô£³¼0&‚€ oí*æ*¦Ö›Ž #CuP2ìæ»–j߯޸i^;.ÙÓ0L‚Ù¡§äøT¾·K¿%{&‚€)°à0¾‹ýçWö+?Ì€‰ `ÂÛ +Üfl¿÷£»Þ,àÎIˆÝ# ë&‚€À°[˜»ð7Øö.É6Jö]Èð^7¬ ÛÞ–ºsk` Lû;uu%s/«u‘Û¾éí"‚€y°£;ó×m“ûÚºÕ«1ªÝQ„ðXÚvÙxx‹.ì3±B5&kwâbLÞ^Ú4‡Ãa驪KVn¼=¡!–„Ñž”—ðÇ€Ò:ŽkÀ¶[Éþtf—b6d %s/Q/X‡€wÂÜÖø ¦¹(Ò³À‡‰ 06L! °‰`"Q y*HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕüÌa–†ÍR0IEND®B`‚Bio-Graphics-2.39/t/data/t3.gif000444001750001750 1317112366325116 16253 0ustar00lsteinlstein000000000000GIF87aî4÷ÿúÍzÿôÿ.‹WÿÿeõÞ³ÜÜÜÿ ÿî‚îK‚ÿÌ R-úšÿ<³q/OOÿGÿôÿ2ÿ zÿQ£ÿÿÁÿ™ÿÿÍðÿðŽÿÞ¸‡úúÒÿ=(ÿ¸† ÿðøÿH=‹ðæŒÿé–zøøÿÿäá=ÿÿõîÿÿÒiúðæÿÿÚ¹ÿ€€½·kºUÓÿúð¼Ò´Œ­ÿ/ÿÞ­|üÀÀÀp€ÿ(€€€ÿà‹E‹‹ÿøÜ"‹"ÿÿ€ð€€Ìÿ·ÿÿEÿÿææúF‚´õõõõõÜÿÀËd•íiiieÿÿ¶ÁÿŒ€€€ú€rÿ„€ÿcGfͪÿïÕÿpÿÿðÿúúŠ+âÿŽ„ÿ_ž ÿ·ÿpÛ­ØæQÿkŽ#jZ͇Îúô¤`Ç…Uk/Ü<ÿi´õÿúÿêÿÿëͯîî2ÿpÿ[ÿÿÿÿÿ×HÑÌ@àÐwˆ™àÿÿ[àÿÿ ÿðÿÿ¿ÿÿ£2Í2™ÿdÿ¥šÍ2ÿz¥**ÓÓÓ€€¼‹‹Aiáÿÿ‹Í…?°àæ­ÿÛp€€Ý ÝÁÿÖÿ©©©îèªýõæ€ÿäÄÿÿÿÿÖÿÔÿÿà°ÄÞ”Óÿÿ䵨¿Øúë×ÿ­ÿP‹îÚ¥ ÿp‡Îë˜û˜ÎÑ™2ÌGÿÿê²"" ²ªÍ\\{hîÚpÖÿðõÿÿÿÿÿÿîÿÿÿ€ÿ,î4þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–ÀrÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨Á¥m*ýå–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zq‰ÅÑËg#Æ/šñŒCiÐ…Ö$4ºñ8i‚NÔF8ÚñŽ#Ð|2ÄG6áñ€tÈzÅ %òˆÑŠª3Fü$ò‘ ކ~ĨHZò’ƒaJ%1ÉÉNzò“  ¥(G‰–‡Dl©bREÊš)ÚŽ2s§6jS]cÕ ’”¡à,êE#(”ú¤æÉ*SSRU²Æ³ÄTh=¿ÙVöÓC•é}’ÇkÎU¯€Ui7¹Â×¢ŽôK³4êq㥵"é°°”Lc{̯/“Ål³Y"›\VEctN0;k«}:63¦õè~R[E‚žv7®¥þIlu3Û×Úö¶@†n‡™Ýò·¿ðínw"Üâ׸ 9.o•+\–0w¸¹aî†A büÖ2Ôµ.pƒ[Ýî^·&Ùí®xÇK^ï&·¼Ë-ïx¿‹’𪗽Ø}ït«ûÜúÚ÷¾øÍïqé»]÷j÷&þU¯€­Ë\ôêvÀôý­n²àà*øÁ †°ƒ#La#X¿ΰ†1,_e¾hùp×K\›Ä F/w/ì\G·Ã;òmo¡‹[äxÃ46ˆr\_çö8º;Þ®‡Lä"ùÈHN²’—+_ÞH´«cŽ)#ãk{û,ÔE±YDüí*‘áÆ±º×aþ–›Jî÷ÃÝ[w¿[JñFwƒ±»í{;)ßþ8¤Î-ð‚üàO¸ÂÎð†;üá¸Ä'NñŠ[üâÏ8cfç`U§¢ÆþG>•AF¨±ŽyIÎòerB˜M¹„ÖØòš%2ƒ<È*ÆjÛüçIyù)©3tÅÐèHGÒËù˜ž¢ÇfåIºf–.óìÌñã>—ºÖ1•ÅZG65ùÖÇNö²›ýìhO»Ú×Îv1W¬Æžs«4h`VÒ´Y—H¶\÷–ÆÖ£ÉÞOw¢jÙïˆKÞ;TxK'þðšžHã—<ùÈ;ÞðrѬqòÑÐ:UB!ÇuU¥©t—8ÉØ’ ysl9–ƒH|‹á–&9H¹¯·‡bi‘]—»¸—¨7–ŠH—TÙu‹Ù–å‰+ù’˜é‘|)Žiäxoé7I”xQ— Y€q‘W‰šÿø—C ›sø’Ÿ1’£!o—mœ—Б‘½øJZ™”½é›æ–¡Iš¿a–®ÉŽ—œ ‘œà8š.y—ÞaœEY•þYJÍ9œ@!FI›k‰›óhJO©wÅX™œœä™’ܸày’ëy–Wù#̹—a’*)HIõ÷ØéuIIjù²™Ÿ/å–å9Ÿí™“^¡žäÁžÊ©— Êu^ù~ÈYŸü)ôéœhÉZñYŽbÉ…þ 8 iQ Ïé‹I‘ Î jæÉ è¡áé áh££º(¡:*”$Ú¡Áù¡žy öÉ–þx'*š?©¢Ü‰ŸÐY0zž81£º˜‹ç##z¡=ª•<ªŸVZ]ê¥îÙ€÷)¤GêŽ ÒŸ%šŠNðÈ‹â‰$Ýé¢(Q¦sº äI£Aº¥é™£þz•aúœJ¦”R*Ÿ$¸¦I˜0©¨J§CbŠzºJˆF ‚¸šå‡©¦ˆ—S˜g”H¦Åª¹ˆªJèQ¡ªuç È• ÈªP®Ú‡Šh‡ºº«¼Ú«¾ú«À¬ÂÊTž*k/˜yä“B)dEåò?A<Ê€¥ùwLŠ¬Õ )£-Yd,˚Э[Å)Tè…»—NE¸ª³G…%£­õÂ-ÜêDÁ¯´Ã14”2#„,ñڬ낯ôJ;Ý ®’'~ÑçlLh}ÐkªÆPÙj-ó*¯L$¯Û°ýº¯ôê®ý:¯ÚÚ¬»±;—oæ Èlí'Tî‡SI‚¯÷ê+ÛD«þ±þZ/íª² ˮˮÿÚ±^Á©¦PaVæ}³[³KÔ²4$´{/ã²DK±8K¦:{O3؃5µß´»²ßª+.û®];´H‹´Fû²Lû´9;jç:†`˜¶¤w…2¸IJ»²4«De‹±%ô-üZ2x»·v{³f‹jxI[û·\¢N%D¸ˆ›¸gqŠFªw«®ª¸÷™Ú¦ï‰¨UJ’p”Ë”ã8œÅ™¹š»¹÷ö™ã䘨+¦¢[¤[ºCé–›Ÿ|š¹­ûn” »Ü˜³[¥µ[n·û¥½¨»«k½ûm¿«ºÄ(¼Ã ŽÅ›ƒ— ¼É{¹» £Í{mÇþ‹¹©‹¹ËÛŠÕËÏ‹¼¯¨¼Û;ºÝÛkŒ›X¡*‰‹ªåÛ¾îû¾ð¿ò;¿ô[¿ö+D3-÷kqƒ‹ýë­ûËh-«¯Ùº·öº±(k·/Û°œ± |±ÀH¦¯sËÀ`+±r‹Á¼ÁJ»À›¯*û¿¬Luë¯ïj³F Â^Û´[¯lÂx{±#<Á2ŒÀ6<± ³Á6<¶ëZÁ3\du{À>¬µ-¬µüÃ'L´æ"ÂA,J%¼Â(¼°}KÅKųÃõj.-üÄuèÄ^Œt`Æd\Æf|ÆhœÆj¼ÆlÜÆnüÆpÇr<Çt\Çv|Çgœ©xÌxª{§Çþ{ìIP'yÕ7‡ÌwTwkh¶H;7KPvÈC¦GÞÈFÑAFdÉHv"îarQ9s—ŒÉF6ŠìÉ…ÌɃ ÊÄZÉ“¬Fœ|u'‡Ê¶µR›˜™ÔÊŽœY°œËº¼Ë¼Ü˾üËÀì±P6…XF€V¥$̈U¥{.ÈPhx§ÊLm#ø€ ëg$;€¥÷…ÇÈÓ|D4õ±jÕº}ee¬õ±ßÜEýçd¥&†ÝXlÓ—X<¸Î_¤ƒ b¨€ÍxÝgÏìlµÆW…zƒdµ|Ó ÐOäÎnÛ|˜i\8ª¹G† ]Ñ}ÑÍ;#кÝ»Mº½Ñ-Ò ýÑ›kÒ%MþÒŠ‹Ò)}Ò*=Ò/ý·!=Ó4]Ó6}Ó8Ó:½Ó<ÝÓ>ýÓ@ÔB=ÔD]ÔF}ÔHÔJmÓ+½ÔNýÔPÕR=ÕT]ÕV}ÕAÝÔÍÒ2Ó’Ò.íÑ\M¸c¸`]Ò0]»eÝÕÝÖnýÖp×rýEùû¬~ÛÅÞz¸¿2×\4Æ4ëÄ%ÌÅ|­ElÀGK0ŒÂ1›ÅV¼Á&ìƒE-d±)Œ× |ØýÂ|ÁXÙU”؜­ÅYÜ®ŒÝÙ_ëÙWÚ-Ú\LÚa«À±ÚªýÙ?Ú,¶¢Í´š}Û­-ÛµE¬½Å˜­·ElØÄ=Ü]ÚÁÝÜÎýÜÐÝÒþ=ÝÔ]ÝÖ}ÝØÝÚ½ÝÜÝÝÞýÝàíp¹ÞndÖd‚ÒLÞb5I%˜ê=E+W*vyr5bféýÞѦsX÷lª¼ßŸŒßN”s§ÄX‡Šj#÷ àªR{ÕÉV'vÞ¬àM¶‰ØA }äß^«ÎeS¥ß(‚Ÿ<Þ>âßm &~â(n $.J)žâ+>J-~â/Îâ1ÎrÐ,âò[ã$'s¢æÅ-Þrï¬jÔÄ.nãâzº }¿E¾ãÕ\¬#,ã@Þ䀯PnäÏ<ä>nsÌìg¬â3þå`Žt1ŽâaÎIcnâeÞIgžæf®ã¨ì³^dnÊ<Îååöã¹äòœàq¶µäo~äÍgp~NçRŽåÖVå°¼åÛkˆþçW¾Ï÷æåº¼åe(p’^Ñ|ÎæšÞËgŽæ›þHþé‘´æ¢ês^êˆtê¨Hx¾ê¦Þè®Îêdë¯Nëë¶H—žë‡´ë¼þëÀìÂ>ìÄ>;Bio-Graphics-2.39/t/data/t3000755001750001750 012366325116 15404 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/t/data/t3/version3.png000444001750001750 1062312366325116 20041 0ustar00lsteinlstein000000000000‰PNG  IHDRî)å³ÙªPLTEÿÿÿ{hîðÿð€‹î‚îAiáÿcG@àÐp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿ØõÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2ÌÿÒiÜÜÜÿÿàô¤`ðæŒ‹‹ÎÑÿÿÿõî/OO¼wˆ™fͪ˜û˜šÍ2”ÓææúÿÿF‚´d•íÿïÕîÿ‡Îú¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀºUÓÞ¸‡ÿÚ¹î誼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõȸó·¤IDATxœíI–£:EÅ95a 9ÔÊj¹Šü]ÿLP¡cÓÁ½UÆ ^¡G H ÆÀÓ†áĺ¶&xɰ¤iä·âWDu!]Iî›)«Ì»|¿œ¾—ƒßbàå+&QñâYÈPªÖÔŠXGQ.Áå‡Å¯äâq n郃|ûk©”b[–M)¹ï·¤C–[ya‰£[v2‰*,)EÇ•v=´oQõîqÅo©iˆÔqš¯˜DÄéÂLªÜbÊÚ‘ÁÃhçY 3©à>šÌÌI‹ûŽ1¦PQ f2›X8åôsšü”SOm*…%I”?—SœP¦ŠÉòɶ”kXËKÝ4r¥xphB#WŠX‹ýaúvëÖ­û%Àpò¶ób²q p'f¹»åäÜ­¸^âQæLfà¶h¡#w¸5ÈDzªŠÜáÆÈ ‘fžÇOAþ¢$À¥ùžÐÛÖtLÑåº>¨ì”~Äf–དྷòIà›EæÍ<ŠjŽ©í¿¾ÕöQrÿï°¢‹u}RÙ÷-œ˜·uµ¥BI…î~ëÀµã³}W Þ™ïZŽ« ¹‡|ȹïVr7ȽT!rßZrGîåÚä ÞÚ“ÿŽ+ºT×G•ÒÂ0¾q3Kð^I¥î&oYjæQàÝw© ïŽw/׆ÜC>äŽÜw« ¹ä^ª¹o­ ¹#÷rmÈ=äCî÷–û„Þ>°¦cŠ.×õ‰Ü¹‰ d«¼3Õ@CÒwñ® ¸1é«;ܘä%¦ÈîÌ ^çˆÜáÖ¤ï¼Fîpc;<NUáA$/‚GîàßÊ$ÞÒ¤^ÕßäÒñ&§w /)¯~“f´&1¬¶±õaåÑ‘¯’Û08ëkéXV}éWQ÷yÒi7Û¢ßìi•…xo¹4rEnùèÈמ§%ÖÈ5µtGxϪ5YOüþmÕLßÝîØMH,ßôi‚‘½ÃOsêìÁòztògS#WÔÒ¥|'ý‘4*—Ÿ{ÿN÷î6H#qUerÃaÁÉ=$—û'B|·–.5à:)¼ˆR»ÛÒy[¾ äF–žÞ½ØÖ”dÓì!09æîæÝ®¥1“I÷ic”¡KGÙ»ÚŽÜÈRâÒ…×䲇À#ä~B-­ñ]Œ‡-¡mk §©¶4.°DndéÝ]iUmä,»žÿؘ}ËèœSK{B—ÄÌ%\ŠŠ®ÈOlæE—=mHbd'iLyÍŒœŽQ\Z=áÜ4:çÔÒ–.Ý|ÎÝ_ î¢}±ÑÈçŒÑ#”pàÕÓ./Ì‚ulÌžñ*Éçµ|ØÒ·ª9®Ž…Úÿþ=LîÇÝ?–øåc¹ÿ-có$¶ÿf-GÊý„:k¯:­ wÇQrW¶.ÈÝ]lXù©”¼¿*˽¿¢;ï^¨¦Ü-s÷ÃñŽmcöŒWI>¯åÖ¾UÍquÀMð·BØð›-}6×9˸!áN¿l¯äеl²´úþ [\…» >»ó×Üä‡{AÜÖ_:t!VÜ'Ó÷½_ƒF¿1QÓòÎÈ›üpoÂ÷׊õl)z—ç käð›Üç“}ŒéY^Ðb;¨;ýa™Ì·@æólœÇßCó-ùo¶æ¥:²ÉÄ?¼XĺÌò]LéSm{=×9_:”¹ªåýcºÅ#»ýó¸ãÇŠ”Âk‡¤„í­Ú‰#;×¾wWæPYm™ÌØøž¼ùéPI›| ï\ò-ŠáúùRÍqëÎ]š#-¿Õ»çËb»T¬ïˆ×íh®ˆ;×¼o׿HYí.÷ÂQÇ&±åÞô ÷]:×¼kçXËï#÷äœÂ†üŒC§·±VF¶¾6sëÎ]šã,ßîð¶íâܺs—æ²–¿µ‡»uç.ͱT×¼®z>e^Ù¤Z¹‹©÷š+ä½{Ñ[™ïE MøË¡•á!™ÊV_µÌ¥Ie”Ñ© •,ö<¶bÙ 6)È$ߥËákê%T2ËŸ”Ä„6~ÅàßTöÏrƒ³) Q!—kÃô½Ý$6ëÞBoE3“µb ü™”•åYyæMeūիíñEË@+¢Dœ4®1z[è°·¯*$¶ÔÊ6ÄoWRuê–÷ƒkZÌXŠö˜\uS'+r/9žrŠräÜë¼Ñ ïɽԬ,È·ÐX'w2˳Q3.‹ V**hÁär·ÖGé8u&˜¬Õ;Ž >(3ˆli‰dhþLÖªÒ‚Ümûùz/ÙÔRVx¦Ì»¯òÝiqyŽÔ…lüj¹/¶]ä}³œÜý°¹ëiÌœE;{í¢“ö8÷›þ©Ê=³ •*­T ÊÉä®&4¯¼{eVy÷óõ^jÍòŒLËý}™—ÊŒˆÄ¦e[®/»jô8f+›¦«q¬Å¡<¨!-j¶W:´U¹[YšHp¹RîeÏš² T9i]zw]#÷ ­”ûÙz¯Û£Æt0²óîyÂaÃÑñO:Ü×òZîï•-ZèäcBxž'¶5¹—¢ÃÜ=[rKU±eMX´µ]'÷,ãk¹ow”°`*«NU?£$÷ ùàTum 1V©§^^ÉTËr¯œª¦q ­-÷ÅSÕ,Õ+¹g»É‚É/åÝ_ç9Uî›vä¾Ðáå^¸X½`òkÍÝ_r¢Ü7ëûB‡w“{iÖÉý*Wf9Mî›'vÈ}¡Ã;ɽ•M®]¦Ç]UrÔe²Œ£ï×ÅdF§¡c,7(-””—Ÿˆ[Ô¹ Rî²….f „v”/Ê/ëÛÖ£~ä½CZÅWä.Ó%Î3*ÍE«’}LôëI]û …Ï â©Ø!œ{cf¹Ûü§Ûá p8ÈX—9†«&¤øŒœ¨ø%¹+íHç)ËMJU-~g“¥ïB¨jÔe׺˜$€F8¹Ï‚5ni­‰~ßšðK«B’fâd&?¢‡°0™)ûc:Å"¼{e2#séöÓZôÖr2“V®:4ênA ¬óÍ~}ÇgUOU]ìè§¹~F¢Ó”ä®ô¦õòÃ긳ÒÔ jL;¡šÎÃGÕ(h-.‹rW±ó†ØUŒ÷îï°ið/¡œK4ÖR”{a2óÉ£í^Ó¹XpÖ½!%›œªŠSÏ5§ª&æ¸勘÷_}!ïG¶•»‰×ÜÞç¸VüĪ´Èß¡¼üñNFë~r×OÖ‰k¶úpä]å>_m,Éï7AÉ]=H ¹Ã퓃Üáæh¹3™[ƒÜáA wxÈr‡‘üÙŸ› c²ßæèÇW|PÀe)¨õ=#w¸4é#æäºxn„ø‘½Lc’õð /tWD=b®ðø!ù<!çy=>ñÅÿCìpeÔcŒüƒ[ ›sâyBAäâAvúÁI£ ÷9\Mf²”á¡YñÁYÈ.O*÷T¬Éã²Tú‚Ü %\†09I^§ã]dòHól]?ªV3 ­[pà^û$©&¸8¿ª}¡ÜräýáTë%íü¸óçó—û I`Éå\%i±˜.u®ñîÐ)BÄÆ{wcÊÈ:Ç{ð(÷LÜyr‡þ–êd&¤4Jî(zÃË|þ?Äѧå®\rª uÄKM¦¯),|æp¿Óë"ª×ÂÉZ¬Ï›ÖfáÙºèTîѯÇð¸ÓO>>üº 6¼Ò .Iœ´$rw¢ŽÓÞï>›•‹Ë‡K’ Ý„ùºNÝVÓ¹{'/>#ƈé­MfŠrñÈ.JQè‰ÜÓSÕ\î¹CÈ Œ • úüB¤X† —òTÕ"w€æüû׺ÓŸ6o¦?lÞ L>ؼ˜þ|°y30ýù`óf`úóùíh=øÏ£õˆ?šÖƒÿ<°y30ýù`óf`úóÁæÍÀôçƒÍ›éÏ›7ÓŸ6o¦€#YŒ…¼iÐ^í8€e}Ž‹) ±È®Ìè–“Ÿž¼õÏgLc§ÏìÊG‘rΩò.*3z‰›1ÊWèÝ{pýQK‘ï—fL–‰Ü†ƒœ£7aWy‘;\š—r!c’%Ï‹ÜáÒ,Ë]‡”&3¹ÜQ<\)YyjDˆ×÷˜,ó¼~®ð †ahÝ€ý†¢´_ËúãWµå"w¸#‰Ü½¯÷K=mú-ùÐR½CXL2Î'AìÐNµAÒÎiw.å®öäý¡U¶¢ætëq ¹C‡är/Lf _bè…D²j&OUM¾Åµy¸7_ŠÖ­8–/ñêä7ç µÃƒøBîð¾P;<ˆ/ä¾ ë>Óú-Û/ùBí›øxи”>\“/ä¾ëÿYäÞÈ}RìȽ¾Pûf‰Ï"gîÞÈ} JîøöøBퟣåŽÞ¯rß@"wô~}Pû¸Í®7¤-p›<n³ƒ'Ámvð ¸Í®+ÔþRò>Üf×Üå´n³ë îrÚ ÷uw9m¹wÜ ÷õrß rï‡ô¦>äþ>ÜwÔ Rî\ˆü äÞÉ]NèýP{?p—Óf0[?p—< îr‚Á]Nð$¸Ë w9Á“à¶xÈž·}Àƒ@îð$¸ír‡'Ú¡7þ`Ú²AÞ¼-IEND®B`‚Bio-Graphics-2.39/t/data/t3/version2.png000444001750001750 1035412366325116 20041 0ustar00lsteinlstein000000000000‰PNG  IHDRî)å³ÙªPLTEÿÿÿ{hîðÿð€‹î‚îAiáÿcG@àÐp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿ØõÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2ÌÿÒiÜÜÜÿÿàô¤`ðæŒ‹‹ÎÑÿÿÿõî/OO¼wˆ™fͪ˜û˜šÍ2”ÓææúÿÿF‚´d•íÿïÕîÿ‡Îú¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀºUÓÞ¸‡ÿÚ¹î誼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõȸó·ýIDATxœí[–¤*Eq­þq õÉÈz5Šþ¸³¾U*ÁÃ4Ó‚{w§©È38"X$Oc† ÓÚëà%Ú¦‘;tůˆÊBº“Üv“W™kòÝvúþÝîhŽC.ëE9†?7ÈH†\²¦5À6²rñM¾ßüJ.Ü‘¾9hÇ·¿ÖbÉæeýÖS»o=ÑlåQY$ÆÐ,/ŽÒ‹Š,ŠEŸË]zhޢغ‡w¤º!RÇq¸¬qNGfbåf}–î4Þ@7žYG!1 î£ÎÌì5{íc2 g:3°‹•!§ëÓ¤CNݵ)DyQí¹ìâø8Õ™$œÌK>u€­¼ÔM¥¦”ªP©)¥ØŠýaú^öí²ï¶±ÈÛΛÙɆ-@OÌr_¶Sãn…@W8‰™Ó™nÑBGîÐ5ÈDMîçEKë“Ô¾¯Èá”7‘¿ï8«Û3ï£Ê„б$‰¬Gùfó,¾K8-1äîƒ!wä~XRÈÝ ÷l‚È}gZȹç“ã}t('FIë£Ô.É¡¯Þpœzx/ª\íö^”¹lž­ûiѺӺçCî>rGî‡%…Ü rÏ&ˆÜw¦…Ü‘{>1äîƒ!÷¾å>¡OLꤨ³i1‰à›Iðñ;xWtLüªGĽĹCÏ êuŽÈº&~ç5r‡ŽAîð ªÂƒˆ^ÜÀ½•I¼¥I½ª)¼ÉÉûãMNoãßR.Þý&íhMdYmdëÜòÕ#ß%·£v¶§Ò®¬úÒ¯¢4Ë ä¥K›¥¬~µ§U&6âÅåÒʹ¥Õ#ß{ÇüY&·¤Òþ=«Ö$q—·U0}·z]W"¶²|Õ§ñVv ~R÷¦×Õ“^<»2¹!•EàÊèn¤ÞQ5ùiëßæÅ] ie/n¯*¯³Dî¢>l$8y…¤rÿDˆï¦Ò¢–2ŠFD©}¹ân[zk¤V–-ýòf[“Sƒ{Çè¦{Xë~r*u™š˜ø’6FÙ9w“m¯¤5I­,%.›ð’Ü}pïx†Ü/H¥2®„á®%´mMf˜jsÕ«¤V–­ûâGšU[9 ®û?6ßS=פR_"ÑsñO¢BKä:6ó¦Å‚V%²ò"iMyM¬WRØZÝãÜU=פR•óÜ;­|M%u/…6¯ÐÖØiåk*é R8ñái‹ÏeOÂÚ]‚´%R¦àáÝT>Íê;Éœ—F9ñ¿O“ûyQ·Æ)þî°Æ<Å&>¬öûžÜ? øö‚4Ö/¶{Aä.mí\´‡å!ʦO>ædQWîíEÝ´î™dªÈÝÒw?Ÿ¥]Û<%õAßúÁÍ„°þ'[ÉP(ì1Èè?Sdž/›œ†ÆWeîxl´µzú„ÍîB7ÈšOfþš>~¸7áÅmÝ£ÃÅÅŠÙpÒÓ—5ÄÈú7&hZÎŒìã‡{®¸Vì'[Q¸ø6m#ëߤž1Éǘ†Uà-޽ºãß•É0кþ“Fφ~|*˜gL¤?Ùš·êÆ&Ã@'¨ú÷ý»ÂŽä¾åwe¾°6-44NTÿbÀ*Fmr¨Ú¼ ôO¶ôÓ(õë2±ýu]\mO›®~¸7ÑlÆážTÿ _¦p«&?›‡ÍŵO“;?ïh[ë—u°üxïÑ¿ ñz>6®Ø]_ç®éÕ›¯à¦¦wk²«¥ª—ë‹[»Xœ]Ëw1Å‹Ûúz8¯p.v(pSÓ»UºÅŠÝn9îð±Â§hµ½KÃîLÅ™…«_º[sª®vtflxOÞ¼8T”%—~æK.CÁ]//U]]îÞœiú­{ºÍfKuåÐî:Õqbáª—íæœ©«£åž¹éØèl¾0-ÈýÂU/ÚÝ9×ô‡È=RXï’8´ `åÉÚÏfº.ܽ9ÏôÕžïºÎîN×…»7w5}×-\×…»7§™Þ&¼Ny1oÌQ)ÞUßGõÒÒ½*® ¸çrƒõQG'ƒË¿E¼ÈÙâ§”Óè\”¯ME÷Ù.Y‹Ø|DºF‹VZ3½ñÁ/çOŒø2iKþú²Öó›ÔH®ŠÒPK¦ïý±IñÖŠ+òí%qÎrŸÃ/ËTtÖ*‘û.lØ-fÇG-\]Ôѹ¸;«.±•Ë{këHCV­ÈÜAS±–ʦwµk*ôX²æ˜ó«tJáþ–± ÷lÓõ‘?9çÁ:ãî´Ç›rÏå+qrW¢]äîÆRZ+™o'ŸµœùwQkW'4“•»µ™J[‘»Ê±°vˆTf5’{ðmÝ~¶–Vän½Ü/×{Î&“²¢eJZ÷Mmw]BµîESnO£hs]ÜOZÔÉ—rO»1™¶~MîÆ–å®ÎÉ«Hfv­èî­ík­»ê{½jÝsl7½hÝ/×{.3ë2-÷÷ež‹3ôÒ ØwÑæ²r·åßwW}UÛ;rž¨/ÓŒõ¶ ÷ä\ie“ûCjN[”{t¹n‘{¦–6Êýb½ÍQdºMr?v¼aýÍ1­€ã,Ú<[¹Û2é«Ú†J3.ç™Ørf²%¹gO«.ƒ8·z?*Š-ÎB¶ïžäô…ܓ̼–ûþ–ò}Êæ(³i¨ú9¹ï0È'CÕMqúþ‚îã¢Û~¯Ï÷¼ek˜ªn/ºM|¬Ë}cëžÔR+­ûë0—Ê}×ÕÜW |¤Ü3÷¯“ߪïþ’ å¾óV‡ÜW |œÜ³]¸“ßîÉÌ*—É}w¿¹¯ø(¹çki“ܯVûå~À ¹¯ø¹ÿø¼br]ž+± Ûœ4­Áåá {ZºŠ›ÓïÅ9ÏÙœ³•Ó™ Ÿ=õ‘ŸDPˆH†Ë–ìUúU'@—Œ?Ìßµsrãò‰œ2¾à,Š»¬õŸk8¾Œ;,%l'ÈÝLMý¬‘ºy:Œqù7q.ܤÿyß,û&¸ŸP‘üP6zvÿwKÄJîF*¤¤ÜeA— på'Ó‚kÉ?”_×·-Ÿ ŒQ£×™Ü¥Ð½Ò§r†BÆrïsÓ³ÜÕ bV,½äˆFg—ÀÁ]ÅðË(¾\÷'÷Q”ÏmÊr§q¯Í"÷Y°fÙZkB»oŸ¸/Î*—(†‰Hî=¶î®PaL¾"÷‘ÎÌ Xþ å÷[ƒLÊ]é¢BQÂTUçSÁe;CÕÚØì6+wuv>—Šq­û£@¾m‘•{¦3óÉÚv½CcÝR²ÑPU =· UMÐù‡˜}B[m¡&fošß¸VüDü¢ÄÿÊDÿÐd3µ‹CÊ]/­ölqqäMä>?mÌÉÖ:AÉ]­$…Ü¡;DgÆ wè-w:3Ð5Èr‡ÜáA wxÑßý™Dm1Žïý&‡ßï@Ó¼'`äMV¾Š–|«E„}·FVÞ¿‹‘‹nŠ[ÎÐ-$1úSF‡ñûBò©ÿ%FÔwEÕ/ùæÖÇrkÞ…U±´9@íp[ÔAÑoré¯TîñrŸ2F€[­ˆ‰8‘»^nÌʽÃ]Q±æa¼.¹¿Æ²#z‡Ç€ØáA w€s†Ú98aP ÏÈ}ˆ¼=Üœ_Õ¾PnÞ r‡öXTë$½´ãK{>-Ÿ!rÌ5ù÷FIZl&KkGZwh!bãZwcòÈǵàASäí!;,ÅÎŒ÷i”ÜQ<´†“ùüQNËÝ?¹d¨ eÄ;M¦¯ÉÍfwwüë(Š÷b‘µØŸ­MÜ“}áбÜC»ÜÃNð?µñþÎàögÃ+­à–„NK$÷EÔ¡{£ý»kÀ³òciòá–ÄB7¾¿nE£n‹þ½Ü]#/>7#îÆˆî-uf²rç‘;Ü”¬Ð#¹ÇCÕTî¹C ÈŒñ/úôA¤Øú—r¨j‘;@uþý«ƒç‚í/“×Û_&¯¶¿L^l9˜¼Øþr0y=°ýåüƒŠÔ®ýÇQ»ÂŸMíÚ˜¼Øþr0y=°ýå`òz`ûËÁäõÀö—ƒÉëí/“×ÛÀ‰Œ¿¬ž™°±ÓQù8u}Ž«>2g‘;Ü™qÙNíôÔZÿ|Æøìô™›òQøœCª°k· €ÊŒNâf òzw-¸þ¨­Kë·fŒ¶‘Ü {9‡6ÞøKE„Eîpk^Ê]¸ŒQ4,r‡[³.wí’ë̤rGñp[¤dåÔ§ï1Ú¦a]_àA ÃP; Ç3 Yi¿–;´Ç¯j3ÊEîÐ#‘Ü][ï¶ËééÐÉ/€–ê‚øýfr”çœÄí±¨ÖKzi´}s.å®®äí¡Uë‚ælÖÃr‡IåžéÌd¾ÄÐ ‘dUO> UMzijyè›/Eíܜ˗xór‡ÎùBíð ¾;<‡/Ôâ ¹ïÂ.Ÿiÿ‡šy—|¡ö]üÜk\JîÉr߃uÿ,roä¾ )väÞ_¨}³Äg‘Ówoä¾%wÚöøBퟣåŽÞïrßA$wô~Pû˜f×TÒ˜f‚ivð$˜f‚ivM¡(ð—’÷aš]K0Ëi'L³k f9í…yG Á,§½ ÷†àƒ»aÞQ; ÷Ý ÷vˆ'õ!÷÷aÞQ3H¹ó ò3{;D³œÐû öv`–Ón0[;0Ë ž³œàA0Ë ž³œàA0Ë žÓ>àA wxLû€ÜáI0ír‡'Ú¡5þ`B VúÔ8IEND®B`‚Bio-Graphics-2.39/t/data/t3/version1.gif000444001750001750 1331312366325116 20017 0ustar00lsteinlstein000000000000GIF87aîçÿÿÿ{hîðÿð€‹î‚îAiáÿcG@àÐp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿ØõÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2ÌÿÒiÜÜÜÿÿàô¤`ðæŒ‹‹ÎÑÿÿÿõî/OO¼wˆ™fͪ˜û˜šÍ2”ÓææúÿÿF‚´d•íÿïÕîÿ‡Îú¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀºUÓÞ¸‡ÿÚ¹î誼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõ,îþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–rÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨4Á¥m*à–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›Ïì’ÉïòlïÏ .Ï77TqÄ5‡4µ@9³ uÐÝ1M5×”9M­Ñ-!Ý5ÔK“mØ6o]5Ð=KüôÊY¼5ÑB7Ü®þÄ{÷í÷߀^m¾‚nøáˆ««wâŒK+oãGÞ8ÚƒÞ·å’‡ëv½€Ã¬øã™k¾ø²”‡núéÌÞ}òÛ4ƒ½3ëIþ’ÙÜÕ³Ú­»þÑ˸¯µïº»ü»í«{ð·#_Ûûyýí£»òÉS¯ï=·ì/½ÝߟýÇÖƒÅùÛÏoÑÕôÿ^|øµ÷N>ÞXßñx.û…ù{ßø®'?¼á¯u¤þˆ—ÞE-éƒ û ˆ™ ²zZkŸÌ¸W½ J{$¡ìäV@º!03Ü×·b®ÊÌ?Ý*™»º¦.n݆þ5´šßƕõaKaEl»”˜¬&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhLãC£6úHpŒ#YÖ#¤7ÊñŽx¬ -”Ç>ú,ÂI’ÿHÈBò$FØA¤!ÉHš|¥<Œ¤$i Mò’˜L Q¤¡Lzò“  ¥(GIÊRšò”¨L¥*WÉÊVºrŒ½Ê¯tÕ+Xåê ³|¥­ð”'[öOzº%/k +A9J˜¸,1¹L—˜ê˜¿æ¦py+cª–®Š•ž:K]ÅTÜŒTB²9Íi.œæDÈ/É©ÌbÊÜTçžØYÎaêNÉþl'3!•Oe"Ó›+¹ç« …O3åIœRÈ<%©j6ô  Eh?ÉÐG9Ô¢g,ÿù«LÑéŸðŒ§>¥™P€ªÄ£Ågn9ª’žž®Òè6#*Ò’úó •©®JSmö4XƒZ(Oq%ÌŽÓ¤, j:Uz¨]ÕT¡KÅf;»9Ô‰¶D©V¥'O›ÙLU­” 5êVëyT¤žt§ä ª,+Ö9mJMZµi\uZÖ—|u®Sí§DI Ô˜6TSb}èSgºW³–®jAµšV^V±Lå§d Vº3©~Mìd‹+—.öXœ-jJÓ]ݪ—5,JBͺ¶œ×|þ­:{ZTÔ’V´ ¦MX+Û}2µ7¥%hUû®ât?ÆUcj‰›™åÒĹºî/Šê"•WÒÅ,v·ËÝhú³»àMîGÂëÝÊ€—H"Ä‹•ô®—¹hR¯|ß»ÛùÚ÷¾ø¥¯:ñëÞüª—½éo~œÏ—ÀÞq/yÌà;øÁcú/|u_“ÄÀþõ/yù›áÿ’v§Æñ‡CLâG8ÃN±ŠWÌà£W—Qð„1lá‘`¸ÃV(‡;\cŒÜøÀÑuñ¬k"”»7a1tY|UòF·»޲”§Lå*[ùÊXβ–¡øL–Þ¶¼Â&˜·ìÄØÎ¸P%kþ0Ç\,£¶´®V%3a«¸‚x²#M–@ûªÓBT¡Ù•3°ö<):û–³6¥e?…Ò>³µ±Ö-¬ í™SióÑm%é¢/…UKƒô·ˆží¤‘Õ鶪Í”³°îšh¹æ5iµ5ÑêÒ¥²Ö­Vóª3ûYÀÞú§ε¬Íë:ûº °õlU‡ÛªÛ¦T·a¾s ‡í+HC3°^ÆíL}ÛÄMS›ŒÞNã´¿ ÇqÒÜW12¹£„]O¦7ÜD‘ñº³$`x—ñÝJη¾ ãy_©ÞîÖ¯yûíï*<“è¶Šº Τv3üá¸Ä'NñŠ[üâϸÆ7ÎñŽ{üã ù$þ79½œˆä’ÈWŽ–=f¨>/WЉXNó³¸\Až©ÐÍ)TóžÏ1å9¿QqfäEúüèGÙãЩ³tÅ\éP×cr²“ž¦ÇHQϺP\Ž™cÈëO׺؇•ã˜]65âùØ×Îö¶»ýíp»ÜçN÷ºÛ}Š ×t¬bo¾<á’ö©ªÇËf2ç}¤çtHßÇYxŠ Î{<_-Òø"^Ô I.W3rù-w~ò}ž+òù¤æ´·ˆ%q˜ýüÑ\×öN¶•êâ‹{zh‡ø«Ðfý6±{HõVô‚ö(ê³¹Î/Û>õÃ̽ê³;{Î7u³Í´X‰OÕÊö—}|ßþo}êKßÖªÿõ¡üàsÒÒéô£¯w¬†:¸Iféw‘OW_®Õ§§¶¶s›ßKÑ{uf÷×jùGS¹4x“æk€î$€ô§W f€êÆáfˆ7Xµ†kßelxV~ÛWO†–jˆ«w]EÞd¸€ ˜}ò'~™·*XtÅTèT^3hg£%3(Xc•X7X}h}˜·n=È~ÀöWA˜U&èwÚçx h[õ{½GkÔ$[ÍÆ{ ç!FÅm©÷z¹mÈ·%øPZXyXÖ…µ5…¶·|R¨…Êg†Œ‡‚iQzbd‡wçcÙ&[èE}˜‡ñ‡Haan¦E‡þ vxØnhû†d¤§ˆWèT|f‘öRR5‰*NNv€¸]|×xú‚+V„ (KŒ‰ÜF˜ˆEB°‹²8‹°ÈU¯w‚µ((Ðwª(f’8'³h'²ˆ†ïD‹ÆxŒÈ˜‹ш¸ŒÁhQÊØ}Ï\`&»èXÞeɸا‹Üè×(ÇHLR8NÛxŽo¦ÁˆŽØh*´(ŒÃŽñˆ&µXcêxŽÉшˆ`ó˜|€FŽõhe>ЬŒcòŽüècþø±x‚Š˜w÷¸‹1¥Œ­2w¶mkŽ)WùŽšU‘ÆH&I[ÈhfWˆK!)’ÀV’ìÈþ‘.Åi’4¹‰`$Ù’yÕ!!ÙeÁQÚ(Œép«…|÷Œ;i‘CÑ”<©‘ÿwËU“yBU“ ºˆ{ŽEQ‰•‡ÂŽêZ)Ù†sh&a™‹7“ß(xt"’Z¹“q©C¹–'é“;øAY‰‘xPl鑉HŒ¥”`™—ù؈—gÙŒ ቉“Ù(=©xuR™¡H™A¹PP‰˜õ8UgI˜„…—8¨™»H–/¥™ú˜.išN©xŒ‰•ÿ¸‡û±™„W”]ù‹ßÄ+L‰ŽŠéŒ±I“Ú¥•ºþ$•–IËØ™1iPdy’¼”’‹f“aIŽté›–)—½þÙšYyÌé«iÒ—!›ÊY‡Û)ßœ­éLR‰›ê„œ…(˜ÀX,ùeŸã¨ßù–ú¹ŽþYŸñ8—%Ù‘ã¨y±ž çäù˜ù›'•ž )ýÉ“zŸÐ –9›Î`ºŸxòœÆ©– êkyNn™À9 š¡tÉ^ª¢z©kýÑ ãõ ”A ú”ì)Ÿõž#J¢z—z¢šC*¤íIy¤©P)Ú˜°Ù¢«é¢vy—Œ© ´É6êæIŸe¡£9éˆ=Ê¡I¤^j I:ŸEjŸ!ŠŸiz˜KJzMjŽïØœê™xúeY *xè[`8Šžþ,ú™G£y¡m:¤ðy¤g Œk•±$¢ •ᆨqª¤i§™§…™¯™Wê§–÷`"qˆ9šŠ¢ùNˆ”ÎäªDf˜Ëé¡J¦‰PÆŒ§ˆ«¬˜o™b³:K (ž«ê‹L檀x¬Èš¬Ä•ÌšÁ¬jä¬!­ A­a­Ê*'Ô*­ÜšFÐ ­ ­ÙŠ*Û:­ѬÓê¬âŠEê íj®î ®Íº­ò¯®éÚ­ðŠ®ãjºyyšGåê®Ñ®ïºEK°æ:°ÖZ®õ ¯ K°{¯ýzXYº ¸—4z­ü:¯÷Š® ËE»¯ û¬»®+±k¯kþ±üT…··‘Ù6|®W…vò{+û¬:»°*+²Ë­% ±+´9;²C»®-`çg€é7Pëç•âw³ä·³T«°ßÚ³»²W˰<[µEû³é±H›´üù‚ ˜„Úô‰"(x³%®Øºµ9«E)K² K¯új²xû±V‹¯d;^£‚,XL’f¶ŽFJcû·í¸ú„j­ÒPK¸MJüª¸E¶ƒk¸RTH³pX†lh¹ «‡Oº¤Ë‚Xº+w^SHˆƒÙª †º ×”Rëš§ ¢˜:¦°»'»`e©Ò‰“¸’ºëq² {)Ù˜·‹»ÃÛqÅ«'Çk»ÁÛ’ËËq¼ë¼ãþˆ¼Ñ+¼Ó«qÕ‹¦u ½ÙûÛ˽% §Z ´¾´8¾×½æ;ŒØ«¾øÈ¾ç¾´k©ï+¿ÆH¿g¿¾ ¾ú›Œükqª›« ¦h®kª¼À ÜÀŒtóš¸!!Á¬u<Á,w»·ËÁW›¯aÛ­õН˲ñŠ´êzÁrvùÑ ª|Ì.þâ‹´5"tj‡Ê¡Œãd¦B>äDNä@>i€Õpä‚–äV½äLÞäOåRNÕPNåræäR}å"ÇΧ[ÈZÕ\Þå³[ÒÚæ…0æ!÷Ï%v±·Œæj»ö<µg.æ=Ï_nÈZçÃr¹ÂvÍIÎç}N„šÕÍîsñìæÉ,è!WäŽ>äÍè®äX®eh¾å•¾e—n癞e›žæ]¸úxXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠH ¶È&,zñ‹cYºÆ2š‘*b´Ð×ÈF°§TŒj£ç8”¯”‡ŽxÌ£PìH =úñŠI•&mò õ€’/^êŠ(ÉS}RP)"dK9¢W~ª•²lÕƒPé)úôò–£TK¥ìD›…܆•È´g†Ù)Å O¿ä 3‰éL@AóV’2 *+es0Á”æŸä´©cz/Íü&3³©È@uÓS„ÌåS¬©¦%‘“+ÔþœT}ä *D}Æ”° è.—©ÏpÎ’ž¦Âç=Ê)}Æ œ‚§‚$šN5¡”ºOFó9L~bŠN¦Ú¨C¿P[ô s é8µ™ÒâˆT=•PIÚQuÚ% Ý&=“Íiºª4í¥J9zNž'ª ª^ÌIÓŠæR¥)ꢤúÒd^Ô5T}&A‰ºÕXE•¥åœé¿ÉPõ#_­ç§XÚÔqž³¬Ô1'[™J×µ*®H:&XwJS¡Þu®ØÌ'I“Ôã0ÆKg•f9!ª¢¡¾õŸ0],d%CØ‚–ˆ”‚½,e—zKÍÖʬ‰µ h‘ºŸÑFq•¡í jk²ÚÝ´6µ°þ-AÛ_`¦¶¶•­@p[Ûðö·ÀnB‚k[âò–%ÆímnŒ;¤_¤! ¹µŒs¡«ÛÝ>÷ºÑ­Ét¯ËÝîz»Ãýnq¿ÛÝì¢d»ä5¯tÓÛÜç&÷½ð¯|ç\÷V·è¥îMòKÞþB׸⥭Ý›[Úî¶À>°‚ñ›`/XÀþ¥¯„'La ³—GÓU/Z2|ßüj8&ü°w?Œ_ñ–xÀ$Iˆ¹›â³¬¸ÅþÁím•«[áî·Â46qü^äöx¹;¾¯‡Lä"ùÈH.eB{*ÖX’ÉPÓTÕªÕjºÕ§<¤¥+9ÊÓ¼6ʶb'˜¦¼P·öÔž¹"sþ3eùP0ÑŸÈôS_7ÊÉ›þt§[\sc jž'»YU9­©™¹¬T“Ò Îkæk]ÑÌÕ?ã ¨Ž•T[jÌG[óšà¼´KùŒeG‡Y¯TΨ\»ÊTíØY—…íª7KÝèN{:° ­åZoTÌùlöÑ &§]©Iæ>2ùÕŸd]ÑIì[ïYAÅ66ýlFÓ*ûÙ€f6´£øÛi[ÛVè…qsL_;KÙ>¤sµ­Ká6ä¸qÌîvOؾç¾RµÕ­ßõÖ;Þø ·Óâí|ûû߸ÀNð‚üàO¸ÂÎð†;üá¯J$8ÉšQâ§L3JüLCÒθÈþo²qdSÖãñÒÈWŽ•ÈˆñT¨jÑRÍòš2®(_†b$›ûœ(Ï9ªd:Ÿžÿüèjd„>.Ó!ýé{TrÌO$qêXϺַÎõ®{ýë`{nmË67„æ^©ÙaÊéS·Ý'!—íÚujv† ýGq÷‰ÛgÊv»W:#yÔÞ÷.Ïx~ðGþµQ Ý÷Ńñ'ñçd±*¡S!6©^¾üÎWËj(Iþò”‘"UTÔb¿sòWöç-×%¾<ÐÔìæ'sw´^zÐcMçP[¿ÕEkó×µ÷O QÇTå”~«!odåg“¢ºN¾‹mjàî %,ôþª}²j:ª-µ£Ú»¹Ïa7zÉàÏê¤ó}F]?¶rî>¥×É~NÇ:ýúòû7¢æUÓÙª½Öeþwe©çyÓ€µkUµYÈfçÖx~MÖvä'}±Qq€Ü´}j5eR|ÅxO‚°Tk‚E€ÈgY5ex¨%Ⱥæu6“&h¬åS¤G# —9(€Ä&Y¡xßѦ×z¨çYéWšçNª4w`F„=X„ zIxJ?È„î'„˜¡xSÄ…b×^Ø'ZD_ö…Øg†h*Z´†Âaw8bèe7kHhFÁ†x˜‡lÈNøõ÷FåÇG¿áxΡ‡{Ø)þ†X‡Š’‡nÈf‰¨‡%…‡3wˆXöˆ\"aa‰8‡;2žø‰ ŠžOÅf£Hc°”Øgmx¡x 8†!á¢X‹¶x‹ŸhV­ØŠv‹ä”‹föŠÊÑ„æAt´ˆ‹Èø{~Œ£è‹+u‹YØG|ÁŒÉ¨hµ‹ÕXt‹"ŠÇèŒÝ茨˜ŠÎöÔh‹ØxŠo×匙ç‡ê1Š9‘Š ²ŠA[ñŠñˆEAŽëHŽX†©tv±¨WÀXNÂhkirµŒý(Œ`åÞXOÐØg>ø ɺwùˆ‹ÒèPÜÈJ¡‘!™‹£Å)ŽßèXÒ´äPqŒ°øþ¼øŠhLiŽq†'YŽœÔ‡ÆÄh)I§hà("¶FŒ ¹“‹‘ìH'irî(;Y%xáÈ‘(•¯ˆ‘WY” éSé‹)éjûÁ’™6\1”ò˜J>‰5™”j 9a™3É‹Q”ÝhJä¸s?ÙNÎd’ëØ%‚¹•TiM ÅØ•'ù’Œ—i”ü8™pÉŽ ?R—¹–|§Žý8†#“mumq“É8—a¡™r‰š~8–„a™Ë¡.ù†…éæÁ”˜ r‰#9•±g•µ‰Žnø‘i’™©™çˆ’œèf9‹jÉš0Ñ——9@œa)Éþ)œW M9>‚XI¸É™£ñ”®˜ïˆ‘ØÉO“ɕƩ•yª¹œÜ·!ωHÑ©q¦9ŸA!žJ‰$àØÓ8 . –¾ÉåéæÈué~ÀÉŒîIœÞh••™›ô©œ]I„Îù™"“¨¨ÒŸÖYGªÙ Ó9 {Y °y ÷˜ ä)¡*Ÿ\™ž0ª ì)¡™i˜Z£} ZZ®™Žeé¡Ð)´(¢³D¢âx‡'j¡/1¤Š£- 1šŒ3z¡UZºžL ¥½È£M ¥{iZAŠ•Cª¤X‘ŸhµŸiAgOZ£# ›+J¥Üé¢;Š¥ç)£]Z晚þêÉ¢b©£‹ði¦Mê¥*¥:¢‰²ŠYu8š3!©ššWpÄyÍi¥Á¡©h&ª±'‰QAªd'‰ˆw‰Xˆ¤—‰¨ ‡•š†´Z«¶ZI%”BVT.ÿ#Äs«Z’2ÚâEÆ¢« ñ«ÀZG³š€V%‚e3¬õÂ-ÅêDÁR­´Ã14”2#„,ÕÊ«ë­ØJ;Æš¬³y…wwÂj-×j­Ld­îÚ®áú­Ø*­áz­ÃÊ«øº¯äú¡5yà'z™…É€<Øܺ­¾¯M¤¯ú*®õ­ Ë®Ð*¯Ð:®ýj{)…{ŧ{Ç7}¸§ŒéH¯ùj±Kä°4±˯,[þ±(»²Èš±³ÉVòWh‘Xê—øg‡Ì¢²Ó¯Jô°?;¯%«²%s¯î:­++³zGƒó÷V4Xª*H€ÇZ2 »´Hô°óšBß®Vë­ÞН%Ä´MÛYø1x¶ÍÚ€’³d t8{¬7…¬WzÇ„‡4¶o+eÌ··~ «¸‚;¸hª—h‰®«¤J¸ '˜ O™¦u ŠŒ»pŽQ‹“9¹ýX¹ 縿—¹*¹œ;ž›p ë¢»¨¥Û¹§{p—«ºæ¹­ëº¯[p±K£dZœµ»Ž·kp¹Ë¥Íˆ¢¤Ë¹¿‹»(ª»ŠJ¼½[ŽÇKpÁ+¨…iÍKÏþ;pÑ;½´[½Èx½Ljˆ¸“¨¸¢ê½æ{¾è›¾7CТ¾]ç¶¿Uë¾ç°`›¯÷ ±ù«´ÝŠ¿c¯]˵õJ¿ø¶,Û¿&˰ñªÀÛ®ëZ¯Âj¿ +¿LdZû¿J+¶(Û­{µ&‹Á ,®Ûz¯üm¼¯!L´\²!|//ûÁH[ÂñvÂÚŠÂ6ÌÀ ¯|´ú;À¿BÁ2\]'ÜÃBk¯kÄòŠÄÿ›ÀÙj.-Ä• ÄP|«R<ÅV|ÅXœÅZ¼Å\ÜÅ^üÅ`Æ>4©bl¹ú§‹˜JÆe,w)˜‰‹dekœoA§ƒ‰"'swÇÓfuwt!~ìrþè¡ÆzÌÆ~ì%×tJWȃüoSב)÷ÈGÙÆ‹ mwÜÇNwÈ…œs“ül‹QO€ŒÇ‰¼OV¸É¤\ʦ|ʨœÊª¼ÊT#tLiÇAV•ꀬœX’æ±62€9‹®µ\d·¬Ë µ˜Q“…‰Å'ȽŒE÷7µµ~]BwÕçN1…ˆDšÌ«Æ~¹æjØVl‰¶Ö\I$hUXƒºì±ÞǬá,l.8g@5ÍíŒÎg³ë,IZFÇ’¦³æç´·v°ÅÜ·õÐ=Ðý9è{Ðê«Ðç{ÐÐÝÐ m¾-Ñ}½mÑ}ÑÍÑ·ëÐ Ò"=Ò$]Ò&}Ò(þÒ*½Ò,ÝÒ.ýÒ0Ó2=Ó4]Ó6}Ó#Ñ8½Ó<ÝÓ>ýÓ@ÔB=ÔDíÒ:M¿í½½ÑýÑMý¼I½ÑéÕR­Ñ}ÕÕ`ƾ¾Š±X{¬z;¿ZMIUì²1ÄN<Öd}´\ÃãÂ[+±lÖ,ÂÙZÖjE-À ´ÑÃf]´LÌכד×F‹ÃiíÁßÚØ ¼´BkØmËÃ1¼ÂìÊØ=ë³”Øx-Ù»ºÙ7 ÃtÍÄ£-ØM´OìÙ~„ØrmÃ"ô »¿ m×K¬Ú¶}Û¸Ûº½Û¼ÝÛ¾ýÛÀÜÂ=ÜÄ]ÜÆÝÏÇx˜zu€Ç¦É½I’œ"ˆþäÜÏDFw–/ÒçÊÕ}Í® rÒXÉàÉÔÝÝFôrtX…8sìæíÝnh!sŒÈ÷Þ‡D{ƒÄt—l#~ißy´ßmÇüíÞÈíß~àÞqÒîh&½àžVÒÎà9ýsg¶¬\<á>§ÉË·Æ"t ÌÕÆ!íáÄ~d äHáD.äžÕLfáÊ–ä­áahm®Önj!~m(>Ö.²¥—oY®Õ8~åX¾ÔONã9þj2®äf>Ï·ãýËÉFpnžÛå}äv~çäx^]5C¾ç÷eä~ÎçNè²5è„[S~èÒŠ.d_Þè…NæžZi>éˆn鎎难éœNI;Bio-Graphics-2.39/t/data/t3/version16.png000444001750001750 1153312366325116 20126 0ustar00lsteinlstein000000000000‰PNG  IHDRî4DŽF,UPLTE€€€™ÿÿHÑÌÿäáºUÓÿ[ÿ((ÿî‚îiiiÿôÿŒ¥**ŽÿÿEúúÒ2Í2€€€šÍ2ÿÿðÎÑ‹Eÿî誷ÿjZÍÿ™ÿê_ž Ý Ý{hîpÿÿ zÿ2ÿúðæÿ×ÿ¶Á£ÿõÞ³wˆ™ÿ=¿ÿÀÀÀpÛH=‹Š+âÿ2ðÿðdîQÿ€ÿÿ‹‹Í\\ÿÿêÿô¤`‡ÎúÿÔ R- ²ªÿ£™2ÌÿcGÿ ¼<³qàÿÿÚpÖÿÌÿúÍeÿ|ükŽ#ÿÞ­àÿú€rÿ€€‡Îë˜û˜d•ífͪõõõææú"‹"„ÿÿäÄÿÿ€€GÿúšÍÿ¯îî­ØæÖÿÿQôÿøøÿ²""F‚´K‚Ò´Œ¸† [ÿÿG.‹WÿÿpýõæÿðõÿÁ‹ÿàÿïÕÿ„ÒiÓÓÓÿäµ­ÿÁÿÿpÿÿÿÀËÿi´”ÓÿÖ½·kÍ…?ÿúúð€€Uk/ÿ­ðÿÿÌÿÿÿ·/OOúë×zÿ@àÐðæŒÿøÜ°àæÿÿÿÿàÿëÍAiáõÿú°ÄÞðøÿÚ¥ ÿÿÿØ¿ØÞ¸‡­ÿ/Ûpÿzÿe=ÿ ÿÿp€ÿÿÿÿÿ¼ÿŽÿÚ¹Ü<ÿúð€õõÜ©©©ÿ¥€ÜÜÜÿP‹‹€€ÿõîé–zÇ…‹ÿÿÿÿÿÿîÿÿÿ€ÿÐÉ' pHYsÄÄ•+¬IDATxœí ¢£*@]ùߨõ»×Õ•(p™Œ³Â=§*yO8@ ÃÓ¸eÝ­µ7åã³®£~0|”®{„îÐÃG¢ºHoÒà(CÙ2×ä»÷ïßÏ»uS6Úl¹b”(0¼ü<+±¥ÕšZÒ«(ëî›|ÿöQ.ü„©øÇ!Üüg)•b^–šjºûÖ3LÉYNEËù?Y‘ŠŒ%–¤Ï+}õp¶PoÝÃ7uC¤ÇérÅ(b^œ˜IÍ-ƬýÒ <¬' Uã.x¥E5©p»:3SÔâwǘô;õèÌÀNüŽÈÒÓõiò!gܵI—‹]Îç¨&M3š“-'óR^;À2ƒÿôÓ›‡šRZp8áwÏCM)-8œÅÝÝA«t÷»MTÎ{O.ËÀù¬Ó}zMÇòç vzC{lÐ}~ŸvŠ0€VØÐ™‘ÒÓ™Ùܺ‡icÐÚÝA»†ªèm²yG¤—WXxBSp˜ î tE¬Ò}üO_”Ÿ “.®kÇÚnÉáèÓy„mIåKÄa[“̳yÕldîÿùËM_¦ûuI—Öµgmã9üæMäoL³º>ó>©Âq*ÙJ–“ól^ÅX+ÀFÐ}ÇbèŽîç€în%èž­Ý® Ýѽ¼29Þ‰§Nå¤ ëÚµ¶[rè7o˜Î#lKª´D¶-ÉR6¯‚ÖýŒuѺӺ—W†î~1tG÷s@w·tÏVˆî×…îè^^ºûÅнoÝ¿ÄÓ‡Öº¼ª‹’.®‹“FN"ètE ;(ÝAèŠ@wPºƒ"Ðî tE|Ÿ¼g Á’ç?r—0è‰Á›]ÿÐ RwÃSz¡oÑ}1è}3ÏM®;}w艤uÏÐÃR‡Ý¡/\ë^Ý¡/8ÌŠ@wPÄÝ]OG<¥)ê…'9ùxôŽ6v!„IYaÇ‚‰cÊÅ«›G>KîÀÖY¿–‡%8®{¨gñD>3wüeªï!~´§ªØˆ—ËZ®è–oùÜó4å}™\³–Ù¥ûT"k܃'}àôGhJÙtq˜üèžÖº_¼–ÓØ«»Í¾ÒÆDõ\ú‘E÷-äµ,—MxMw¿¸¼B÷Ör»t÷% ¿ZÂmk ÃT[Ú,°H^˲uŸãÈjk9[ÜFñmXüÈæ¹g-g±Ow#J$z.~OTh‰ü98ÆÅ„ $µ<ë"kSþ†fµœn¤ðnãç¡ÍsÏZNa¯îˆ{kùžÔ’ ûúî4Ó7p°–ïÙH©°»3лtÿó—³3r}Ò­ñgâàâ9y S‰°u-{³ºe5ÇÒÙ§û¿ÿ^¦ûuI·Æßªø÷@mL‹çüÉbü‰ãnÓ}ï‚ÛøsÒ:vë~èî¸JwY×.$ŽðiM×¾Ê)_ Å³º[íI·­{a5èþ‡¾ûõÌíÚÁÅsòôÝ:ÝAèŠ@wPÄÝ݉?á ÅøJÄð™ËTᜠ»·ñÙB¶øºÁŸ‡ißü¼ö¨ù{ºÑÛy¾»1á,gy-™<ùSƼœp>²¡Ë®ë0¯»,ûÃ1Ý­‘ízò.oa^QX8 ÙÜœ–罿î²ì‡t—:‹K´ãË(å2в¹3ùo¼1Ù˘W4z»u/^¡8½Gßt¹ tBÜÜe¿ñ⦗Y°s¨ºâ2J_XûŠï5œHÔÜù·øªñžt7âGKÞ)-»ZѼá E8›¤¹V±“BU_ÒèíÖ}•“t]¢+Å_yYö‡}÷Çó Ó¦û;3 —f›»}ºs¾;4ÉNݹšI5W_Íq»u¿ to€?_«w´î°mºÓwW2ÝA7ÊúîM‚î tE ;(ÝAèŠ@wPºƒ"Ð1Øp5Š»eºèÖ=&RÌ3¦Õóœ> 6\\eýÅå³òù¿§@hѺۨ=S>„ÖÚ¦ÖwGwèªî U¡?œîFôÖÙ Âa&Pºƒ"Ðî ˆ¡ò‘äæÄ6Ÿ»†Ç¶ŽCn˼²ê‡Ê]·—óaë³âlíÌÕi\W¸ܬüݼ²êîVÞ{z²’x@|¢Þé>û#S³Å¿NŸ¥œY·{.ÓNçEû=’ º».ÄfºË¬¦º[±œ­7K ºÛ ûÍÎ×t/6k¢eÊZ÷Umwš\¾DÔºW«rý:ªu÷ÇŽÅhæOÝónL¡­_ÒÝØºîѼlusf—Šný±zëõ½~µîsu¬¯ú¨u¿×÷’î ~š%uß®y)ÍÐÈ7À¡´«u.7îºüûîªßÔ6äÎÚZºX¡7˜úœ¶¢{6¯6‚²ÙïC^¶ª{òu]£{a+­íÌÜê{A÷_ëÿþ}u?w¼aýc¾v§Y­óâÆ]—I¿©mØh¡V^&«©PšuļÅߣªliŠ}÷,§?tÏ2ó[÷ã-åf–‡ªV U÷QÒý@…쪮JÓ÷Ý+‹¬þ­/÷¼ã¡]i¨º¾è6‹±¬ûÊÖ=ÛJ­´î¿ºU÷Cß~t_(ð™º~¿ªüU}÷ŸÜ¨ûÁŸ:t_(ðyº»p Uþº=3‹Ü¦ûá~º/ø,ÝË[imgæVÞ¬û ƒt_(ð9ºW>/TùsºÛŒß }c]3¤vy8iÄž—nGq‹iúOIÆ+‹¬ÎÙÂì¢{ŠžÇ(ŸDPK(9‰`óú=‰àu<ºƒ"Ðî t‡7RÊZí©OãþNvÇñówzïŽq~%A…Xð*±EèºÉŠúŸÖ}tÿûãï·8ý"wYÎî˜t·ù ü.`ÿ çÎ ‡ð(©ûçÃG!wìRÆùßTÈ©x_ÿ§ÏfþlBHˆ 2ë> kæwkMh÷­ñ'QH’‚It7Ò.º;•§p'ûhä+Š Ïaç¶Ù}>é–{CÒäu§»Ý›þ-i(fª{¯#™†°Å÷¢îÑÜiB|UŒkÝ¿Ì{fd“×¥î£(¡{«ëNãþ4EÝ ™·ÜKtï³uwÅ £òÝG:3/@*› UÅÐsÍPÕ„¥bÝ#+ú & @åPušBfÙª¶Ly'æ-‡™ÐWõ³-UèNc *t‡ægßÛÊÉó«.gˆAwx#V\úd£ ¸äUW¿/VK@wx#R÷øNRá“­ÞKÝ¡)‚îÓÎõ’î´îÐ ‘îÑÓкCtf ºCçĺә®AwPºƒ"Ðî yª€á$€ ;(ÝAèŠ@wPºÃÇm— ­Œ‹îðN¶]où+ö<Ýᄽ%w87G ŸÝ-áÊñ}jèïÄݽÓÝ7eô7M¸’ÿ,”/ÄŸn7ÒºÃK÷;òw8t·ƒsЇ›<†›ÀÅñÝ`~¡;¼“èŽXÉý å½îrÝÓ»ÛŠÔÐÞIr¸DâL÷ø^ˆcªû7œÎ ¼•¨3#nñ™Þ†ßÆz|—"CUPPºƒ.Ðî tE ;(ÝAèŠ@wPºƒ"Ðî tEdºWŸÀ Ð<ƒñ·œ(èn“(Õˆïf˜n¤º§Ý¡9Ga÷šŸý4?ñ,„ûF^ÜkøÁŒlgˆ•oÖ&žÇ´îÐß¡ªØ¸ÖݘòºC»Ý}Weš‘ȇ ;4Ç ;,ÕÎÌ7j®;ÆC[ø‘vú/zcäPÕÈvßgÊ4À>8ª Š@wPºƒ"ÐѹîÑ`7Äö¯)ÜM‡øqÕ hŽÞuÿ¾¬øÏþNº)ù !iï¤õ¬öüö ”ó\d‡æfk½Òs£í›s©{ô@whŽ!¶ÖOçlÖúC{t/tf Ä ÝåpÔŠ¡ªÉ§Ø7ÍÁQUPÄFÝÿ¸&?²[÷k²p%[;3è ³W÷K2£;¿¾ŸôßÅæ¡*ºŸ‚Ü+Õ‡KÙ©ûYQ…uÿ,ºßÈö‘è~Rvt¿ t†Iñp¾Ò³¹QÃŽÃLØ~‘î´íwîÏëŽï7±ç$l?N¢;¾ßºƒ"8E î·ÃivÏî·ƒíÏî÷ƒîî÷ƒíq@÷hÿ7€îOqDwNêÛ ¶?š֓úv‚îq\wNêÛº?Äá¾;ÇÁ÷€íÏ€î€îÏpšîœÅº l„“tgGäFÐýN<Ì„ïðv8ª ŠØ§;'õA“Õýäì\ÉÎÎ ºC‹ÔýÜÌ\ËÞ¡*ºCƒÓýÔ¬\Íî‘èíî ˆý‡™°šÝAN"Àvh tEpŠ(ÝAèŠ@wPÄÿkY÷¦IEND®B`‚Bio-Graphics-2.39/t/data/t3/version12.gif000444001750001750 1310612366325116 20101 0ustar00lsteinlstein000000000000GIF87aî#çÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔîÿ,î#þ; H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–~rÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨ÔÁ¥m*íä–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠH ¶È&,zñ‹cYºÆ2š‘*b´Ð×ÈF°§TŒj£ç8”¯”‡ŽxÌ£PìH =úñŠI•&mò õ€’/^êŠ(ÉS}RP)"dK9¢W~ª•²lÕƒPé)úôò–£TK¥ìD›…܆•È´g†Ù)Å O¿ä 3‰éL@AóV’2 *+es0Á”æŸä´©cz/Íü&3³©È@uÓS„ÌåS¬©¦%‘“+ÔþœT}ä *D}Æ”° è.—©ÏpÎ’ž¦Âç=Ê)}Æ œ‚§‚$šN5¡”ºOFó9L~bŠN¦Ú¨C¿P[ô s é8µ™ÒâˆT=•PIÚQuÚ% Ý&=“Íiºª4í¥J9zNž'ª ª^ÌIÓŠæR¥)ꢤúÒd^Ô5T}&A‰ºÕXE•¥åœé¿ÉPõ#_­ç§XÚÔqž³¬Ô1'[™J×µ*®H:&XwJS¡Þu®ØÌ'I“Ôã0ÆKg•f9!ª¢¡¾õŸ0],d%CØ‚–ˆ”‚½,e—zKÍÖʬ‰µ h‘ºŸÑFq•¡í jk²ÚÝ´6µ°þ-AÛ_`¦¶¶•­@p[Ûðö·ÀnB‚k[âò–%ÆímnŒ;¤_¤! ¹µŒs¡«ÛÝ>÷ºÑ­Ét¯ËÝîz»Ãýnq¿ÛÝì¢d»ä5¯tÓÛÜç&÷½ð¯|ç\÷V·è¥îMòKÞþB׸⥭Ý›[Úî¶À>°‚ñ›`/XÀþ¥¯„'La ³—GÓU/Z2|ßüj8&ü°w?Œ_ñ–xÀ$Iˆ¹›â³¬¸ÅþÁím•«[áî·Â46qü^äöx¹;¾¯‡Lä"ùÈHN²’—ìU\nV8æá¤=™ìÃR&´§b%U5Õ˜Êò¡T>b—É &Fuéš;d'þ8AªÙx¾6̳R³VcŠÎ¾’õÍ?Åh3%eç)sζò'2ýdg§nÕ´µ&š—ä —Ôª€´¢yÊ×F³¢F¥P99M¦bº«‘þlaKÊgOo4ž¹J+™ºçšjôÑ¡Ž³^ÕJg¹vÕÓxÕU]뜪Æ"VAu޵®©™^Ÿò¾Ür¨-ì*2Û‹xn6£-íj[ÛH9¦ŒŒ¯}¥ßÒ¹0 ‡¹m%ô†›àƱº×=aû’»Jæþ¶~×;ïwK)Þ†ÌvZ¶mï{·ß¸ÀNð‚üàO¸ÂÎð†;üá¸Äù”È5V65¢ÐÄ7N–4f”ø™(†þ”Íñ’ÏÄãÀ¦lÈã#$“»Ü)Ŧå:ÙX.>ûå8WI;ו÷|‘9:k¡ôðÜ™@ºÒONô‹\¦ ZºÔ‡eTÝê3×øÔ·Îõ®{ýë`»ØÇNv¢øÙ–`nÈÍT¥³ÃÖ7iH¨d·ë4í Y»ÚI>÷¸Cúíy7fTôÞ,^ðjG|Xü®dÃgúð&5ˆ¯s„N«:Õ¯1å_c(Øen»å7ÕÌg}³œ¯Žçóƒg§֟—/ý‹©¢¢û—‡¼8ï¤ÍlRtÕ­–iðyïV3‹>¥Å¿ç©Y½RN'ŸŽwýë'Ýgìdt¨ru~Ÿ{þoS¾#²›ûÜõŸ¯\ú¬òÞÑç·cÛÁŸJñG“üâ÷²tÝZ鿞ý„ýý@óOVú—ßÒ¨†YYFgã7€¶‡Ä–xT2f–µ|ëäjçM|¦{±Æ€耤ªwnxØYܤjÕeRaHNb‚!è€ÜK%Øi|õx¦‚.(‚dF‚Ú×€xh7a·—}¹çYå·¼æNªdwD⃵G#›ÇzåMmf„PHwG¦„Oˆz½{¦FzxUÞçZ”÷DŽWv1†aB…bø…d˜wj¸†nh%Z‡PfL8böwq˜‰4‡f'‡~ø‡yX|óÇY#5ˆþ@'|pˆŒOXqò‡løe(‰k%‡K凒—‰šÈ‰ž"•ˆ™H$cPЦxЍXŠnÖ"ƤŠt1Ò‡‰¡„ˆ‚ˆŠ·qŠmø©¸‹¼Ø‹¦hVsH‹|‹äô‹Åg‹Êq„æ!|~à‹Î‹+õŒ°HŒÑÈ‹fvGÃ(½Xj»x‹ÎHt둊͈Œ¯(Žr¡Šˆ6ŽÚ¸åèŠC²Žî±¤èØŒ¦Õ‰aˆ¡Žõ(ŽwˆVð”HwHØŽ°¨WÆXNä˜r2’PÈVÒÈ{e Ù„§4IŽ éüh i*âè‘Y9‹£U’©Ôwý!Dèþ«4Ž·8Âø}ÈiÿÈ*¹‘݈‡|‡ˆ‰®Ø‘Ƙˆö¡Œ~”GiMItÂŽ 9çè”ÐUAù“Ryw#É‘AÙ”¶ŒX™-é’û“ù\q”ÐØ~h˜²x•f¹=™\Y–oy“ùˆ-y’èXf)O§÷)!•—¿HŒ‰ÉŽq©e Þ¸“ß("‡Y’†–‡˜2©—Yy–hùˆ‰V€Y“kYG€A™¾˜‹eè™áŸi ×y¢Ê¢ j&/*£C¡3ú¡5ú Å9¥Š¥L±£\š¢9ª“ –Ý™ ÷¢ßÉ#JÚ4ùŠPJ¥Œ©¢GA +‰$U ¦b £YZ¤Ê£ßè¥þõÙš*¨uú€º˜hºöÈlxºš!:$¡Èšûzf‘‡¸Ét•ŠyG«*“:ˆ¥:…s œ§zvšøˆ?⪞ØGL±ª†µ©ox«¸š«TB)dEåò?A<ºz%)£-^d,½šÂ:¬—Ñ'“%Q¬õÂ-ÈêDÁr­´Ã14”2#„,×ú«ëâ­ÚJ;Éʬ>†¡IyxÒÊ,ÙŠ­L„­ðú®ã®ÚJ­ãš­Æú«úÚ¯æŠV£‡…Ùwl¾–Tx¸zŸH®Üú-Ã"¯MįüJ®õ2­¾0K¯Æ*±ÿ*9U}¬w}^æ"•¦6±ùê°Ëª+KC&ëþ¯÷b±'Û¯öº±8ÉVüghëTˆæ€Äæv3[­óªD ´õº¯%c-1Ë­2K³k€8ûV8…:ØVÊZ2›±Kt±Ë«àÚ®ð`«¯%Ä´eƒ5È‚;Ør ²‘”²dVH LˆzN(·¡´zõd©O4¶o«%fØ·€Û—;¸„[¸ÎQl‡[‰‰K«§j¸ ÷“#·T©RjŠŽ‹pQ’ûš”[¹cp¹¹½·¹aÙ¹• º'º³i“빉º—¹«Û­ëºë»'»WŠ‹µk»Òˆ»§»} ¤ê»Î¼'¼_Z¨_j¼§ˆ¼§¼õÙ»ÎÛ‹Ðþ pÒKºZ½Ç{½öf‰p©¸±Ê¸•ê½æ{¾è›¾7CТ¾Sç¶¿Uë¾ý±]»¯÷+±ù[­ïZ¬`ë¿ù‹µAK¿Â®X‹¿Fk´WK¯ò ÀÜ¿ Ü¿+¿|_Z»­óª´ ¬°D›ÁþŠÁK{-\Á±vÁ+{Àþ‹±÷ªÂ|Â*ܲLºeÂ,ëÂ(ûÁ(›Â&Ë¿/,B2Ül#L´[‹¯CÜ® üÀú»´ k.üÃÃN¼†PÅT\ÅV|ÅXœÅZ¼Å\ÜÅ^üÅ`ÆÞ¡·bºoæ#|9!e\mI7«‰¸Œk|mçJ©TÇbˆ÷˜q\dâ„OÇþ+òqm¼Ç38r² u9Š<È„jXwÈ,É‹¬¶i€\{—!i#ŸWÉ€¶y›q(‚rvL·ž|ʨœÊª¼Ê¬ÜÊ®ýÓ@ÔB=ÔD]ÔF}Ô1ÝÓéÑÈËÑÒ" Õ¸ËÔm¾T]Õ=ÑZÐ\mÁ5Į嚯÷óÛÕ4Åœ#ÌÄf}ÖGû¿5ÌÖ1«±ÛúµF ÁuÍÁmÝH-„¯+;À_;×JÌÂ!¬Ãb»×Žô²G»Á´Á(®]ëµJŒÖˆ=EŠ Ã ì,™Ä—}ÙsMÙ•EžÖ ŒÙ |±<Ú“Ä¡MGª½Äƒmµ6 ×yýÚ\ÛÚ¸Ûº½Û¼ÝÛ¾ýÛÀÜÂ=ÜÄ]ÜÆ}ÜÈ«ÇÈLi¬ÆeèÎË]DŒþlQÏÝŒ4Èpt©NË•eÝsÖ}ôÈwŒÞmHbd‡˜<Š{xqw|Þ€4%Éš¬ud ßI$߃ôÇ ÂÉŠˆßk´±¼EöÈ àžà–¡Ò ®d)ÝàK†ÒîàâÂvæRžæ[p>ŽÍ'ˆ©ç• æJžçz>>C¾ç°eä~[Ièå„Z†~ègeåŠ.è#Ýè²%æŽèN=é‹^é–~Tvžé£´éœþé ê¢Þà;Bio-Graphics-2.39/t/data/t3/version10.png000444001750001750 1132512366325116 20117 0ustar00lsteinlstein000000000000‰PNG  IHDRî ÜÉ¡@PLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔîÿCz‘„PIDATxœíÛÁ£ª@};5ízöÓn‚Nh¦µ3‰ßÇÅxW`­™äOpI@Q Ð ÃÓ ¸eÝ17¥ã³®£~0|”.{„îÐÃG¢²HoÒà(CÞ2Wå»÷ïßÏ»qßL˜h’å²AÔÄðòóŒŒÄäVkKQ¬"¯»¯òýÛG¹ð;¾é=qóŸ¥X²iYþiˆ(éîkÏðMVÈò›ZÎÿI‚ˆXdY‹ž—Ûõp¶P®ÝÃ÷M5C¤ÇñrÙ bžŽÌÆæfC–~iÖºªº ^¨Qm,Ü®ÆÌ4»ïXïé®GcvâD溜®M“v9uÓ&^N»œNœƒÚ8N5'YN¦%¿v€eÂi¦ŸÞzrYÂÎgîÓk:—?Oâ 7ÔÇÝç÷é@ ˜P 3Rz3P#›k÷ðÝZt‡º@wèˆ]]Ut‡:Ù| ÒŠË+ '<¡*8ÍîÐè±J÷ñ‹þ~Qz.Œ:»®k»%…£G|Ol‹*]BOÛešÌ«(f`#ëtÿß_Fõý2ݯ‹:·®=kïHá7m"}cœÔõ‰÷Qe–б$+YŽrL“yc)A÷‹¡;ºŸº»• {²Bt?¸.tG÷üÊdG;• £Î¬k×ÚnI¡ß¼á{`[T¹%ô´mQæ’yÔîg¬‹ÚÚ=¿2t÷‹¡;ºŸº»• {²Bt?¸.tG÷üÊÐÝ/†îmëþE?´ÖåU]uv] "DÐ$èîÐèîÐèîÐè1ÄÏ<âÖ1Ð.îA“Ùð´…Ô]hŽ!<›'@ëȧfÓ˜ÆAw躪ÐÑHt‡–á4tºCG ;tºCGÐ=œ‡õOiRãm“œ|8úÁ›ñO)Ï~“åèNÊbN/nù,¹[gýZ–à¸î¡œÅù¬;¬)¦ úô£=*b+\.K¹ [ºyäsÏã˜÷%rÍZd—îþ9«Æ&q»·Qàû—Ê}q)ËG}Z_ʮ—ԋû¢×›'Ýy%rÅZ–àîr¬þÙ2úc< V KÙËí­òž%º‹ía"áä’ê¾GÄ­kyX‚#º‹JDÙî…)jIXGZʲ¦ŸŸlks™xq?1úÑ=­v¿x-§±Ww“ìÒÖªrÎýÈ¢ûÒR–ŠË*¼¤»_ÜO¼B÷Örûºª.‡áWK¸ml¦›jr›IKYÖîsY¬º”“ÅuûÇ„Ålž{Ör»Ìø‰–‹?j"?šÞº°¨”g]diÊßФ”ãÞnqÚ<÷¬åöꎸwp°”ïÙH5©°¯íN5}KùžT™ "€ŽØ¥ûŸ¿œë£®?OICØB€­kÙ›Ô-«9Ï>Ýÿûï2ݯ‹º6þÅJcZ<åOâ»M÷½ nãÏIëØ­ûU »ã*ÝeY»):À§6]ûÊÇ|Ïê~lµOD]Ôî™Õ<¢ûÚî×3×kOICÐvht‡Ž@wØ‹º`Ÿt(˜Òðüè{Qƒ2ã¡öuW2}8¢»ø®PÔûoøü‚ýNÄzTã2­*öº+™>œ »7zÿ5ÙÐnk{Û³—X%ºÛÇMØ9Þ݆½[eTþ”áŸß¯áDÜÖ–ßÄXw1ì7ßžŒcº'µ:Ó:<´‚¿¨aþ’Z¦µ£»ÔY\¢­/£”Ë@#D×0‰«ø]—]Õ\Éôa·îÙ+§wUrhˆ¨é¢.®zå•LvvUW\FéÊÞ±_ùԹ9÷™ÑW(ês êbÊwì×p"ÕnΗfÔÆÞo`{Ï\=ò2DÛùsñðöËØ§;ãÝû¦7ݹš©kúÓý*ê,ÆÎè¬íNíUBÛ:‚#3ÐèîÐèîÐèîЃ W£¸KP¦ËòÜ“•Ä<»ëÑ›oapW˜:ÁçoF}óóÐjFê.ÿĺ[jw¨Ÿ!<òƒ‰Ú4þ2¼0 ZDínT}.¾ù)ÔîP7¥¶;ºCƒu§« íát—uç@$4 §™ #Ð:Ý¡#Ð:b(6ÓtæÞÍuEè@äìgï§é̽›ËŠþàYÕ¦k¸¦3÷n®*z@GÌ7ÞD!2;Út€håXŠw1ôYMã4w¿²+\ŠsnOú¾—£“‹ËSo?R6‡)¥4š¥kUÖ}2”l‰˜|Dz‹Ki©è­_ün†cTØçI—ä'”ùw9½ÉÉm¢t©9 ß¿ÇKÄ$Ù[Ê®Hgô)‰sÒ}Z~>6¬¢3FIî{lác19>j1ÕEÍ‹{oj[ȰL±/miHªi˜(c*n¥rÑ»­kïï-è®7µ÷“Ç‚îÙŠ'"?sJƒq…{°<6êžKW2Éí‰fÖÝ:Юdþ:}–RæŸE®§:ÑlVwc2mAw•bQÚ!R™ÔH÷Ú¸ÏÙ­´ »ñºßí{I÷lµ&j¦¤v_UwÇÑ¥K¨Ú½X”ë×Q,sÝÕÌŸº§Í˜L]¿¤»5eÝÕ<¹ÉÄ.eÝøs;åÚ]µ½~Õîsq¬/zQ»ßí{N÷… ?7Þ„îÛ5ÏÅÚé8w±ÌåÆ]—~ß\õ›Ú„Ô™òľLk0ö9ÊlA÷d^©e’߇´8MQ÷hw]£{f+­Ôý^ß3ºÿZÿ÷·è«û¹ý ãÓ °;Îb™g7îºDúMmÂF³.器rÅdJºgg«&ƒ˜·ø{T”-NB¶íž¤ô‡îIb~ë~¼¦ÜÌrWµÀª®ê>rº(=]ÕUqúö‚nã¢[ÿ[ŸoyËÚ0ßU]Ÿu“„XÖ}eížl¥Zj÷ß Ýªû¡½Ý2|¦î™ß¯…"UÛý'7ê~ð§Ý2|žîÙ&ÜB‘¿îÈÌ"·é~¸]‡î >K÷üVZ¥ûͶ¿Z÷:1è¾ást/ž|^(rŸù=ˆ Ã7Ô5]j—†“zìiîvd7§ÿ§<¿Èê”-ÌÎ,º'ëiˆü ‚BDr¹lÎ~­ÿÑA¬à!Ð:bÇñówzoŽq~E“2¡ >µûèþ·Çß½8Þ‘›ÌgsäÛöÑÁœøÄÖïhƒîŸ5>†ìNåÛçS&§ì}ýŸ>Ûù³ SBHxüQÊe¿My–Cén¥M uw*OÓ죕/žcÒ]ÝÄ[/ù#DÑÜyá0]ÅàÚî¡ÊkNw)º7ý›ÓÍX÷V{21ë> kçwcl¨÷õ#™Å\5%ŠÁú#3²ÊkR÷Qäн•u§ršù¿ÿ|Ò=È"ÝÛ¬Ý]¶B¯|A÷‘ÆÌ 0Ù÷¬îjîôEì*ÖÕî_¤îÊŠ6™ PÙUf…)³ìtUŸ&«{¦1³ñd½œfBߺÊF]UÑõ\ÓUµa©Nt§²îŠüAÌ/]è}Q~†îÐèoD 8.Œ&^5¾[ƒîðFŒ¸D\Qâ¯2Ñš¬ÝáHÝõ­uÂ'S¼¹ºCUݧƒë9ݩݡ”îêNRèÍ!3Ý¡q´î4f iÐ:Ý¡#Ð:Ý¡#äPË € ;tºÃÇm×ä¬ ‹îðN¶]€ö+ô<Ýá„;_E·|w‹ŸÝ=²òá}lèïÄÝÎÐÝHbôwLm¸=Œÿ,”Ï„Ÿî¢5R»ÃK7€ñ·|s÷ÇrЇ»Þ…»béð®0¿ÐÞ‰ºEPtƒ7yó¯T÷øvŸ"6t‡wÝ+’8Ñ]ßnŒuÿN§1oE5fÄ=ãû’û`,‡w1ÒU…n 1îÐèîÐèîÐèîЉîÅ;ÁTÏ?Ž;£»‰‚¼›Á˜Ÿææƒ ;TÇàïlà^þÙ¬þÏü2ÑÄ\•ðf­´x3&ò\O¤v‡úøvU…ÄV<°2ûÝ¡^‚2͈äN§ ;TÇ ,ÅÆÌ7hª;ÆC]ø‘ò~™®ª•õ¾ïÎ>”h€}pV:Ý¡#Ð:Ý¡#×]v]lÿš¦»ï!¼Ž¢øª£uÝ¿/#>O_I¦'ŸÅ$h„Îtõz˜>„ðî0¬<$kÝI Î7TKºOâÊ)³Ô¡y£Ã»}À-fäËPå×JëºG¢[ß^7¢R7Åð^÷p2.×àJh]÷ì»k¾ç3YÝÅ|t¯—Ît7Ýã®jª»A÷FèCwq RIŸˆïáRÿYÄ5Ò¸ît‡Žh[÷þy:=òâRGw8›Þ[ìè§ó^ßÑÎçµ¾£;\À[}Gw¸‚—úÞºîðOoý èWñôÖÏкîO§ WÞi;ºÃ¼Ôvt‡ x«íèçóZÛÑNç½¶£;œÎ‹K½mÝë>~Xœ-¾d–'•.x†Öuÿ9·"3Ý+§ ÝGû­§¿µõß×Ïý¾¦ª|!§%Õ²K?ð~Z×Ý)nÇ ¯ðÝÕàú¥ÞŲÔîµÓºîÑ{¤ûì°×9ÔñÖï*bYt¯ÞuSÆh‘tYt¯®u×Sr™TwŒ¯™Žt—P+¦8¿Çè=]Öµu V×@‚îÐèîÐèîÐèîÐèîÐÝÓg¥ÔÏàžñ[wv¨Žaz$]2Ý¡AbÝ|º¢{ˆ´ñ[4ò©•1H{'­gµç7c¢y.²Cu FxXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠH ¶È&,zñ‹cYºÆ2š‘*b´Ð×ÈF°§TŒj£ç8”¯”‡ŽxÌ£PìH =úñŠI•&mò õ€’/^êŠ(ÉS}RP)"dK9¢W~ª•²lÕƒPé)úôò–£TK¥ìD›…܆•È´g†Ù)Å O¿ä 3‰éL@AóV’2 *+es0Á”æŸä´©cz/Íü&3³©È@uÓS„ÌåS¬©¦%‘“+ÔþœT}ä *D}Æ”° è.—©ÏpÎ’ž¦Âç=Ê)}Æ œ‚§‚$šN5¡”ºOFó9L~bŠN¦Ú¨C¿P[ô s é8µ™ÒâˆT=•PIÚQuÚ% Ý&=“Íiºª4í¥J9zNž'ª ª^ÌIÓŠæR¥)ꢤúÒd^Ô5T}&A‰ºÕXE•¥åœé¿ÉPõ#_­ç§XÚÔqž³¬Ô1'[™J×µ*®H:&XwJS¡Þu®ØÌ'I“Ôã0ÆKg•f9!ª¢¡¾õŸ0],d%CØ‚–ˆ”‚½,e—zKÍÖʬ‰µ h‘ºŸÑFq•¡í jk²ÚÝ´6µ°þ-AÛ_`¦¶¶•­@p[Ûðö·ÀnB‚k[âò–%ÆímnŒ;¤_¤! ¹µŒs¡«ÛÝ>÷ºÑ­Ét¯ËÝîz»Ãýnq¿ÛÝì¢d»ä5¯tÓÛÜç&÷½ð¯|ç\÷V·è¥îMòKÞþB׸⥭Ý›[Úî¶À>°‚ñ›`/XÀþ¥¯„'La ³—GÓU/Z2|ßüj8&ü°w?Œ_ñ–xÀ$Iˆ¹›â³¬¸ÅþÁím•«[áî·Â46qü^äöx¹;¾¯‡Lä"ùÈHN²’—ìU\nV8æá¤=™ìÃR&´§b%U5Õ˜Êò¡T>b—É &Fuéš;d'þ8AªÙx¾6̳R³VcŠÎ¾’õÍ?Åh3%eç)sζò'2ýdg§nÕ´µ&š—ä —Ôª€´¢yÊ×F³¢F¥P99M¦bº«‘þlaKÊgOo4ž¹J+™ºçšjôÑ¡Ž³^ÕJg¹vÕÓxÕU]뜪Æ"VAu޵®©™^Ÿò¾Ür¨-ì*2Û‹xn6£-íj[ÛH9¦ŒŒ¯}¥ßÒ¹0 ‡¹m%ô†›àƱº×=aû’»Jæþ¶~×;ïwK)Þ†ÌvZ¶mï{·ß¸ÀNð‚üàO¸ÂÎð†;üá¸Äù”È5V65¢ÐÄ7N–4f”ø™(†þ”Íñ’ÏÄãÀ¦lÈã#$“»Ü)Ŧå:ÙX.>ûå8WI;ו÷|‘9:k¡ôðÜ™@ºÒONô‹\¦ ZºÔ‡eTÝê3×øÔ·Îõ®{ýë`»ØÇNv¢øÙ–`nÈÍT¥³ÃÖ7iH¨d·ë4í Y»ÚI>÷¸Cúíy7fTôÞ,^ðjG|Xü®dÃgúð&5ˆ¯s„N«:Õ¯1å_c(Øen»å7ÕÌg}³œ¯Žçóƒg§֟—/ý‹©¢¢û—‡¼8ï¤ÍlRtÕ­–iðyïV3‹>¥Å¿ç©Y½RN'ŸŽwýë'Ýgìdt¨ru~Ÿ{þoS¾#²›ûÜõŸ¯\ú¬òÞÑç·cÛÁŸJñG“üâ÷²tÝZ鿞ý„ýý@óOVú—ßÒ¨†YYFgã7€¶‡Ä–xT2f–µ|ëäjçM|¦{±Æ€耤ªwnxØYܤjÕeRaHNb‚!è€ÜK%Øi|õx¦‚.(‚dF‚Ú×€xh7a·—}¹çYå·¼æNªdwD⃵G#›ÇzåMmf„PHwG¦„Oˆz½{¦FzxUÞçZ”÷DŽWv1†aB…bø…d˜wj¸†nh%Z‡PfL8böwq˜‰4‡f'‡~ø‡yX|óÇY#5ˆþ@'|pˆŒOXqò‡løe(‰k%‡K凒—‰šÈ‰ž"•ˆ™H$cPЦxЍXŠnÖ"ƤŠt1Ò‡‰¡„ˆ‚ˆŠ·qŠmø©¸‹¼Ø‹¦hVsH‹|‹äô‹Åg‹Êq„æ!|~à‹Î‹+õŒ°HŒÑÈ‹fvGÃ(½Xj»x‹ÎHt둊͈Œ¯(Žr¡Šˆ6ŽÚ¸åèŠpçëèŽKêŽÍhZ8êhâx‡hI‰t‡„í‹zeŒåDŽ)'# Õi‰Œ`%ý¸WÉMxJ£‘ä¸ÿØÖئ"Ž ’ö˜¸8Z&É‘JAïÈIþ„±Jãx‹)Œß‰l!‘Ö±’ÙxÈwˆX‘ éŠiŒ‰hÊèA‰”ÖD‘ÔH'ìØôxŽO P%”@9•wG’)”Ni‹À˜• é’/ 1i¿ÁH 퇆)!‹Xy–Ûè“Ñ•f —8©ˆá’(‰Že&‘òtz¿q‘Rzù‹Ä¨˜ì(—Úa–Pá<ù"‚˜&ib‰˜‚9“{©•h™–Þ‘˜h˜6É–u•鋹X†ŸÙ“xÙ–éJ d)¨iYYJRù‹¼Ù“Ñ’»©\ùŒ…™™æÈ™ÁšOõ™”‰ûø19wo›0’ÏÙÖþY‹¯™œ/1›u Méeù”œÔ›ò¸‘!’Y渘p©v`9•›Ù•ÛŸyû·!Ó‰HÕIØÉ™ ø”Û™wh©ŽâšÁáÃIèŸê¹™ÁÙžÙ¸šU)Ÿ¶˜œ+¹œÿ¸ΩŸ>ñˆ—5ùŠ:Kê›f×Þ Z›šžäé æÉº Š£ïiœ?2ŸJÙ¡u9 Aº—ÏéXÒŸ š)Š+ÚšÔé¢ j&1J£E*¡5 ¢7 ¡ÆY¥ª¥LÑ£^º¢;º“–Þ© ø¢ài{$ºŽ&úŸi lT ¦sy¥b:–2º¥Gj >úþ`jŸ®ù ƒÚ˜@ê™iJŸkŠcФ":$¡(¥©zf‘‡¹Ét•ŠyG«€:“:ˆ¥:…tœ§zvšøˆ?⪞ØGL±ª†µ©ox«¸š«TB)dEåò?A<ºz%)£-^d,½šÂ:¬*—Ñ7“%Q¬õÂ-ÈêDÁr­´Ã14”2#„,×ú«ëâ­ÚJ;Éʬ>†¢™®pª®Îb¬Ö’­ØÊDدð:®áª­Ô:®Ùj¬¿º¯þj®h5zX˜}ÇækI…‡«÷‰äÊ­ß2,óÚDýÚ¯äZ/Óê+#±õê®å °?I}u5Vé„}ÊGi9UhæB±üš±K±4„þ²ÿz/«¯ôz¯›“lņ¶N…h~HlnG³ÕJ¯J$±Ak¯)ë².˲‹±5Û±˜³oe€S¨ƒm¥¬%ó°îº²úª±)Ô°ùzµà ®ûZBM[†0Xƒ,¸ƒ-‚^&IËZ¶{äSK8°9°…õd©Öº±p{%fØ·€ë—;¸„[¸ÎQl‡[‰‰K«§j¸ ”#·UY yzŠŽ‹pQ’ ›”[¹¥x¹¹½·¹bÙ¹ž º'º´i“ë¹ñˆº—¹«Û­ëºÚ»'»YŠ‹µk»Ïˆ»§»~*¤jê»Î¼'¼aj¨aj¼¦ˆ¼§¼öÙ»ÎË‹Ðþ pÒKºZ½¾x½ýf‰q©¸±Ê¸•ê½æ{¾è›¾7CТ¾S÷¶¿¿â¾ë‹¯a˯÷»´C­ñú­ø»¿Åêµ4«²ôÛlbû¯ðÀøZ¯,;¯,­ö{´ l±ò[ÀBÆ´Û:³-›²ßj± ¼À`«ÁׂÁk¬´/ËÁü°(œµ"ü®Y[ÂÂvÂ-‹Â,¼Â ¬À([­l.,òEÂE˵̰.œÀ1\ÃþjÄïúÃ@¼†NüÄP,ÅT\ÅV|ÅXœÅZ¼Å\ÜÅ^üÅ`ÆP¢·bœºoæ#}9!e\mI7«‰¸Œk|mçJ—Š"¬Qs•ÇÒ!NøtwŒþòÆzi'â(uMׯƒ\(«"¹¶s¼¶‹LÈÑQ{—|ÉO:É”´y›qvÜtû¤‘œ\ʦ|ʨœÊª¼Ê¬LD5„Ëww&_ÖÊu‚ae#ȳÐjËÕ…Ë5}¬„f5Y!lŸçË’Äf7›€zelw§‚E€}´ÉÊÌD„fYó7kWÇcv³Èöi×ÜH4H)@z öÍÌÖ<ÎITÎ{°UµË!»ƒPëÎäìdEø|;›ƒU·?Xø<Ð]Ð9Þ›ÐçËÐכР½ÐýÐ ½MÑ ¼ÑÑíÑ  Ñ"=Ò$]Ò&}Ò(þÒ*½Ò,ÝÒ.ýÒ0Ó2=Ó4]Ó6}Ó8Ó%­Ñ:ÝÓ>ýÓ@ÔB=ÔD]ÔF Ó<¾¼ÝÑ ÒO»KÝÑæ;ÕTÍÑÕ½Õ÷žÁÊ·ü+d;¿\ IQ,³ñ»µd]ÖŽ³»­J ÃhýÖp]× œ¿5ÄÖ†ÔBùÚÀa½ÁK<×*+Â:<¶zÝÖ%“Ø*Œ@*Ã]¶|Ä}Ø~äÖIûÁó‹µamÙ–=×gMÙSÔÙG¬Ù—­ÙûÂH؆ Ú»ªØ+Ù,dà ÀI¼:ÍÚ¸Ûº½Û¼ÝÛ¾ýÛÀÜÂ=ÜÄ]ÜÆ}ÜÈ ™ÈNi¬ÆeØÎËíÊ’þL‡ßÝŒ¤Èp4ÊN÷ÊylÝ~sÖÕÜÈ ÈÞ]Hbd‡–<Š{xq|Þ€4%èÈåÈÓ ßs$߃äÇ b#ÉŒßr´¯¼EZÇÇ àžà–‘Ò ®d(ÝàKvÒîà;s=e«V\á/çsâÆ$t³6rèŠÅ# âÅœ|ƒ\â9‡ËÊáMmrÀ ݰkÕƒÀ·ÈQ]rÀÌ®[œãþã@ÞÅ äCöàDNd~äE®áe-gLŽÏþgööáâÒÌã¦ââ-¸®ÜÆå½ã`æ/îÎd.ãgEãcnãÜ\p>~Í'ˆ©ç”­æJžçzÞ é£Äæ–é™.[•¾éžþé ê ;Bio-Graphics-2.39/t/data/t3/version1.png000444001750001750 1057712366325116 20047 0ustar00lsteinlstein000000000000‰PNG  IHDRî)å³Ù@PLTEÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõKѧgúIDATxœí[–¤*Eq­€“¨O†×S©©ôÇÜ­R¦™>Ü»;MEžÁÁ"ÑxÃ0\˜Ö^/Ö4Ü¡+~ETÒä°›¼Ê\“ï¶Ó÷ïvpGCp’pY/Ê1|ü¹AF2ä’5¥¨¶‘•‹oòýæWrá>ŽôÍA;¾ýµK6/ë·&€˜‚Ü}ëŽdƒ,ÒÈ"1†fyq”^TdQ,ú\îÒCëðÅÖ=ì¸#Õ ‘:ŽÃe½ˆs:2+7ë³t§AððºñÌ: ‰™Xpuff¯ÙkÇ“I(8Ó™]¬ 9]Ÿ&rê®M!²È‹jÏeÇÇ©Î$ád^ò©lå¥n*5¥´àP…JM)-8ÀVìÓ÷²o—}·èˆEÞvÞÌN6lzb–û²w+ܺÂI<ȜΠt‹:r‡®Aîð â¡*r‡Ž‘"ÍÜŸœÜCI€[ó=¡OLꤨ³i}Ú%9üöˆãÔÃ{Q¥!´Û»Q¦Ù<‹bNI쿾Õñir?/ê\ZŸ¤ö}E§¼‰ü}ÇYÝžyU&„Ž%Id=Êï4›gñ]*Ài‰!w ¹#÷Ã’Bî¹gDî;ÓBîÈ=Ÿ˜ïè£C91êLZ¥vI}õ†ãÔÃ{QåBh·÷¢Ìeó,hÝH‹ÖÖ=Ÿr÷Á;r?,)än{6Aä¾3-äŽÜó‰!w ¹÷-÷ }|bR'EM‹IßL"€ˆßyÄ»2 câW="vè˜è%¦ÈzfP¯sDîÐ5ñ;¯‘;t r‡ÁPDô"xäÐî­Lâ-MêUMáMNÞorzÿ–rñî7iGk"Ëj#[ç–¯ù.¹µ³=•vE`Õ—~¥Y^ /]Ú,emô«=­2±/.—V.È-­ùÞó8æÏ2¹%•ÖðïYµ&)ˆ»¼­ª€é»Õ뺱•å«>·²kðã:¸7½®žôâÙ•É ©´(WFw#õŽªÉO[ÿ6/îZH+{q{Uy%rõa#ÁÉ+$•û'B|7•E°”Q4"JíËwÛÒ#X#µ²lé—7Ûšœ‚lÜ;F7ÝÃZ÷“S©ËÔÄÄ—´1Êι›l{%­Ije)qÙ„—äîƒ{Ç3ä~A*•q% w-¡mk2ÃT›«X%µ²lÝ?Ò¬ÚÊIpÝÿ±!øžê¹&•êø‰ž‹Z"×±™7-´*‘•¹HkÊ{hb帒ÂÖêç®ê¹&•ª´˜çöØiåk*©{)´y…¶ÆN+_SIO‰O[|.{Öîú¤-‘ú0ï¦òiVßIæ¼4ʉÿý{šÜÏ‹º5~Lñw‡5æà)6ñaµß÷äþiÀ÷°¤±–x±íØ rwœ%wikç¢=,Q6}ò1Ÿ ‹ºro/êÖ uÏ$SEî–¾ûù,íÚÎà)©úîÐn&„õ?ÙJ†BaAFwø™:6|Ùä|44¾*sÇc£­ÕÓ'lvºAÖ|2ó×ôñý /në..V̆“þ›¾¬!FÖ¿1AÓrfd?Ü›pŵb?ÙŠÂÅ·9hYÿ&môŒI>Æ4¬'hqìÕÿ®L†>ÐõŸ4z6ôã»PÁJîùZÚ$÷«Õ~g¹0ˆAî+>FîÅ?>¯˜\—çJl¶0'Mkpy8hÄž–îƒâfãô{qÎóA6çlåt&è'EO}ä'"’á²%{•~ÕIÐ%ãów휜À¸|"§Œ/x‹"Æ.kýçŽ/ãK Û r7SS?k¤nžc\þÍEœ 7éÞ7˾ .Á'T$?”ž]ÆÇݱ’»‘ é)wYÐÅ%\ùÉtàZòå×õm˧cÔèu&w)t¯ô©œ¡±ÜûÇ4Å,wµ‚˜K/ù¢ÑÙ%ppW1ü2Š/WçýÉ}ås›²ÜiÜk³È}¬Y¶ÖšÐî[ã'Ê%Ša"’{­»+T“¯È}¤3s–?hùýÃÖ “rWºèP”0•CÕùTpYÄÎPµ66»ÍÊ]Ä¥b\ëþ(o[dåžéÌ|²¶]ïÐX7‡”l4TCÏ-CUBôGþ!&@ŸÐ–C[¨ Ç…ÙÄ›æwÇA¿(ñ¿2Ñ?4ÙLíbär×Kë„=[\\¹CS¹ÏOsr§u‡NPrW+I!wèÑ™1È:GËÎ t r‡ÜáA wxÈDôw&@[Œã{¿Éá÷;Ð4ï ¹CÓ„•¯¢%ßÄjaß­‘•÷ïb䢀›â–3t IŒ~ŔфÅaü¾|ꉵÃ]BõK¾¹õ±œÄÚwaU,í_ŽP;ܵDP´À›\ú+•{¼Ü§Œà–D+bE"N䮇³rGïpWTgF¬y¯Kî/€±ìßňÞá1 vxÈà\†¡vÎc”Â3r"/E7çWµ/”›÷‚Ü¡=Õ:I/íøÒžÏ_ËgˆsM>À½Q’›IàRçÚ‘ÖEˆØ¸Öݘür‡Æq-x{"îÔ¹C{ÈK±3ã}%w­ád>ÿÂ@ÔŸÓr÷O.ª@ñN“ékróŸÙÝÿ:ŠâÀ½Xd-öçCk÷d_8´@,÷Ю÷°üOm¼¿3¸ýÅÙðJ+¸%¡ÓÉ}uèÞhÿîpÁ¬üXš|¸%±Ðï¯[Ѩۢ/w×È‹À͈»1¢{cK™¬ÜÅyä7%+ôHîñP5•»Eîвc|GÅ‹>})¶þÁ¥ªZäPÿjçà¹`ûËÁäõÀö—ƒÉëí/“×Û_&¯¶¿L^l9ÿ "µkÿqÔ®ðgS»ö&¯¶¿L^l9˜¼Øþr0y=°ýå`òz`ûËÁäõÀöp"ã/«§ÅA&lìtT¾N`]ŸãªÌYäwf\¶S;=µÖ?Ÿ1>;}æ¦|>ç*ìÚ­ 2£“¸ƒ|…Þ] ®?j+ÂҺí£m$÷EÃ^Ρ7þRa‘;Üš—r.c$ ‹ÜáÖ¬Ë]»ä:3©ÜQ<Ü)Y95ÂÅé{Œ¶iX××xÃ0ÔÎÀñ CVÚ¯åÎíñ«ÚŒr‘;ôH$w×Ö»írz:tGò  %¤z‡ ~¿™å9ç±C{,ªõ’^mßœK¹«+¹C{hÕú£ y#›õp„Ü¡AR¹g:3™/q´B$YÕ“CU“ñlúæKQ;7çò%Þ¼ƒÜ¡s¾P;<ˆ/äÏá µÃƒøBî»°ËgÚÿ¡f^à%_¨}?÷—Ò‡{ò…Ü÷`Ý?‹Ü[¹ïBй7ÀjßÁ,ñYäôݹïAɶ½¾Pûçh¹£÷ûƒÜwɽßÔ¾¦Ùµ•´¦ÙÁƒ`š< ¦ÙÁƒ`š]S¨ ü¥ä}˜f×ÌrÚ ÓìZ‚YN{aÞQC0Ëi/Ƚ!øÃàn˜wÔÈ}7ȽâI}Èý}˜wÔ Rî<ˆü äÞÑ,'ôþ¨½˜å´ÌÖÌr‚'Á,'xÌr‚'Á,'xÌr‚'Á´xÈžÓ>àA wxLû€ÜáI vhÿœÂЃžBÝŒIEND®B`‚Bio-Graphics-2.39/t/data/t3/version8.png000444001750001750 1131512366325116 20045 0ustar00lsteinlstein000000000000‰PNG  IHDRî ÜÉ¡CPLTEÿÿÿÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ-ojEIDATxœíY£¬}½kêõüO½‰³6áo' &ã¬@UwòEE,Ð ÃÓ ¸eÝEä¦t|–u4À†ÒeÐZbøHTéMºeÈ[f«|ûýýûù;$~¤$óeƒ#ýÇM‰äkJQ¬"¯»«òÝ×G9¿ðCáÎ!¹ùÏR,Ù´,ïš"Jº»ÚÓé Yó¹?I‹DÅNËmz¸[(×îþ‡ š!Úãx¾l5-ŒÌÄæfC–ö4ëñ]Õ° ^¨QM,Ü®ÆÌ4»íoé¦GcvâD溜¶M“v9æM<_èr:rjâ8ƒ)É|:-ù¥,3¸_?½y¨*¥‡Ó~qckª1¨¾‡ðÕž±Q/.×¥\Ð-]=ú½çqÌû¹f)²K÷)Gbì‹'ÝÈéz¼š`¨Ü·—²øÁïdÿ&si$Éì®èÃÕ“n<‡¹b)KpHw}­M¸Û’ðg<V KÙÉí¬rž%º«õ!‘pz Iuß#âÖ¥<,ÁÝU%Øn/:óc‚9ai)ëš~~³­É$ñìnd´Ó=­v¿x)§±WwI6ic‚rÎídÑ} i)kÅu^ÒÝÍîF^¡û K9]º»ú½–r[L¦›*¹Õ‹¤¥¬k÷9Œ.Ö°”“Ù%/~ö#«çž¥œÅ>ÝÊ‘j¹¸#Q¾&rWÓ6•ò¬‹.M½MJ9^Iþ[Âç¡ÕsÏRNa¯îˆ{Kùž•T“ ûÚîTÓ7p°”ïYI•©°»1P{k÷«¶iÎE9äØSP¤DÂl]ÊÞ¤nY̱xöéþ÷ïeº_umü+Š¿Jcš=E’†Ý¦ûÞ·!'-c·îWî–«t×emÇ„ŒYÿÉÇ|Ïê~l±OD]Ôî™Å<¢»Ðv¿ž¹^;8{J‚¶;@ƒ ;tºÃ^Ü¥ âÿH2=j<Ý•¸<è{QWñømw4æ²#ºÛ ÄÝ¡˜t…ü¯§·k8‘Iqñ|¤þ+ïdúp‚îî[ÂíW²?¡ìÚv¶go±Jt7›°Ow½uuñ§ÿüv 'b×¶ò¢Û}y¬»1•ëždÔ„™ÃC+LçTí]ö+¼Ñª=ݵÎÎîø6J=4Bt“ê°ªýºîª¾àN¦»uÏÞ¡8} ç†ˆš.öpä÷ë•w2}ØÙU]q¥Û•½c»†s©suî?2Þ¡žkn¦|Çv 'RíêÜ­{¥ù…®ÙÙv¯uë†S¸úÈË8rš zE.¾¼ý2ÞV»WZktFoºs7S×ô§ûUÔYŒÑYÛÚª„¶;tGf #Ð:Ý¡#Ð:Ý¡#Ð:Ý¡#{‚̋ؼÆÓŒá 8ÔÌ`ï0µ‚ÏC ¹iè5£u×bÝ µ;ÔÏ ¾¥bÜý´®M#öÖ;©øº €U»KPŸ«!7†Úê¦ÔvGwh¢îtU¡=¬îFµÖ9 Âi&èt‡Ž@wèt‡Ž w‡F1•têïØ^˜9N¹-óÊ¢ Oç]N‡”'…ÉÚ™ªÓ¸.sù˜ÁñÊ¢·º‹~Rïô2õL_1›:/Y¿œ&~Ö¯<ïÃu™³±CW½Ó]¬ž>Iê#:¾Övc¢&ê<®ÌÜó¹{5—zu 13oCS4"é›ÓìŸpªÎ’^Fö¸MgîÝ\Yôkw“|g“LµùLJÉx܈ 3÷xÞ^Ε^­{f§#ÑÔ|fjÐý”Ì=žµ·smÑŸ¢{Ô¥7&íp„áÅg@ôħÍ4¹ws]Ñ:y„ÛÙûi:sïæ²¢?¦{ÛçZšÎÜ»¹ªèêPƒ$D!2Út€håXŠw1ôYMã4w¿²«g\ŠsnOº¾—‰£Ó³ëSo?R6‡)¥4š¥kUÖ]2ü˜l‰H>¢pKi©è›ýn†ÿb‚>°ËSX’ŸPòßrz“5’[Eé\s¾—ˆ$Ù[Ê®Jgô+‰sÒ}š>6D'Hîzlþg19.j5ÖFM‹{oÁ&¶abWÚa¤>©¢Ò0%PÇT\K墷k×Üß7ZÐ=\Õ¸Ÿ<tÏV<Ùù‰SÄîÁòب{.]É(»%ʬ»=tº’ùkõYJ™{y8ÖŠf²º‹dVÚ‚îAŠUiûHuR#Ý}h±¿³kiAwqºßí{I÷lµ¦j¦¤v_UwÇÑ¥sµ{±(×/£XæavX &þÔ=mÆdêú%Ý”u¦é­H'v)ëâÎí”k÷ íõ«vŸ‹c}Ñ«Úýnßsº/¬ø¹ñ¦tß®y.Nß~HWÀ¡¸‹e®Wîºô»æª[ÕâS'>å‰}™Ö`ìs”Ù‚îÉ´RJ’ýCZœRÔ=Ú\×èžYK+u¿×÷Œî¿–ÿÝ}u?·¿!n瘮€ÝqË<»r×%Ò­jñ+ÍØ”gbË“”tÏNš jÚâþ¨([œ„lÛ=IéÝ“ÄüÖýxM¹™å®jU]Õ}ät?P {ºª«âtí…°Sˆný¾>ßòÖµa¾«º>ë’„XÖ}e힬¥Zj÷ß3ݪû¡­Ý2|¦î™ý×B‘¿ªíþ“u?¸«C÷… Ÿ§{¶ ·Pä¯;2³ÈmºnסûB†ÏÒ=¿–Vé~³í¯Öý„N º/døÝ‹'ŸŠ<ÌÏ ’ð{¦o¨kºÔ6 'õØÓÜíÈn6N÷+Ny~–Õ)[˜œ™uOÖÓù‹ éù²9ûµüG/"x`™îÐÃ8ŽŸ¿ÓwsŒó'• =ð©ÝGû¿=þmÅñ†Üd>›#ß¶æÄ'¶~Gëuÿüø¨ñ1dw*߯8ÿ›29eïëÿôÛÌ¿ãCƒäR.û-åI–@w£ýh­»Uyoeþ!á9&Ý%½uÛs{=užÙb°mw_å5§»Ý™þÍ©Ïf¬{«=™Š˜uŸ„5ó·ˆñõ¾w%³šŒ‰b0îÈŒ®òšÔ}T9´_eݩܟf>Âï~Ÿô ²H÷6kw›-ß+_Ð}¤1ó$ûÕ=˜: ¨MÅØÚý‹Ö=°¢ |f|TwU§I~Ì,;]Õ§ÉêžiÌl|Y/§™Ð·.´²QWUu=×tUŸ«Ý©¬»"óKºC_”/?Cwèt‡7\p\¸šxÕõÝ!èoDÔ½ ¢ï îmù}÷NºÃѺ‡Öñ¿¤øpt‡ªðºO×sºS»C#ºO’BwhÕ˜1èêNcšÝ¡#Ð:Ý¡#Ð:B_*`¸ˆ`èîðFÆqÛ=9+â;¼“m7 ¡;TòUôÈ7õ´ÿÛ>#+ÞÆ8¢;¼û8Cû ‰Ñ=1e4þñ0î·R> ?Ç8R»ÃKQ¢ºG¾ÙçcYÅýSïüS±Âðº0Ò˜·<"(zÀ›~øWª{ü¸O#ºÃ;‰žˆIœè>nÌêNcÞJИQÏ<ŒŸKî6€±ÞÆHWºÆ tºC_ ;tºCG ;tºCG ;tºCG$ºŸP=Cü:îŒî)x7ƒÈOsóAЪcpO6°÷nV÷gþH42Wå¼™!TZ}‰Dž‡#©Ý¡>¾]U%±Q/¬Ì ;Ô‹×Ý5U¦ ‘Üét‡êtƒ¥Ø˜ùMuÇx¨ w R¿Ð/ÓU5ºÞwÝÙ‡ °ΪBG ;tºCG ;tDãºg€mÛ}¦ñv؇£(@u´®û÷#ê÷4(’ŒO~«QÐéîëu?ÞÿðáíaX}HÖØ“œo¨–>tŸÄÕcf©}ó& o·;›èPå×JëºG¢×^U©K1¼ÓÝŸŒË5x Z×=ûm›ïùÆLVw5Ýë¥3Ý%£{ÜUMuto„>tW"éÓ‘êÛßêâ~« F×@ƒîÐmëþçÏÓ)è‘—:ºÃÙüyo±£;œÎ{}Gw8Ÿ×úŽîpoõÝá ^ê{ëºÃs<½ö3 ;\ÅÓk?Cëº?‚^y§íèWðRÛÑ.à­¶£;œÏkmGw8÷ÚŽîp:/.õ¶uh\÷ñÃâd5™7uVºàZ×ýçÔrˆÌTt¯œ.tÍ·žþÖÖÿ>c<õû™ªòQ…œæ æ]ÚUÀûi]w«¸½¾Êw[ƒ‡Ÿà[ÍKí^;­ë}GºÏ;}oܦ¢æE÷Úé]w5fŒfIçE÷ÚéZ÷pL®1“êŽñ5Ó‘îºjÔë÷}§óÚ¶ÔJãºhÐ:Ý¡#Ð:Ý¡#Ð:Ý¡#Ð:Ý¡#Ð:¢ {ú®t€úìC#~ëÎÕ1L¯¤KÆ£;4H¬»è·+Ú—H‹{Ù¢è·6"2ºg3™?j¨„HwÝÕU5éÇæ¡:8« ±Q÷w¿y`™Ýº_“€+ÙÚ˜Aw¨˜½º_’˜ŽùóýM§ÿ.6wUÑýôa\­>\ÊNݯHJWˆý'è~#ÛD¢ûhÙÑý6Ðý&ÅýõJϦ¦vœfÂöt§n¿ t†Pw|¿‰=`ûq"ÝñýÐ:‚KÄ #Ðýv¸Ìî9Ðýv°ý9Ðý~Ðý1Ðý~°ý1è?ãÄàÐý)ŽèÎE};Áö§8T»sQßNÐý!ŽëÎE}ÛA÷‡8Üvç<ø°ýÐýÐýNÓ«X7íp’îˆÜº?‰§™ðÞgU¡#öéÎE}P%Gu?99W²³1ƒîP#u?71ײ·«ŠîP!Çt?5)W³û@$ºC} ;tÄþÓLØÕîÐ."Àv¨ t‡Žà1èt‡Žø?Üý27„“DœIEND®B`‚Bio-Graphics-2.39/t/data/t3/version4.png000444001750001750 1057612366325116 20051 0ustar00lsteinlstein000000000000‰PNG  IHDRî)å³Ù@PLTEÿÿÿÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔI¢ùIDATxœíÛ¤*Eñó¦a“Î|MdÒIt‚·[ÎáaYåÁµfÊRäyØ"ØOc† ÓÚëà%Ú¦‘;tůˆÊBº“Üv“W™kòÝvúþÝîhŽC.ëE9†?7ÈH†\²¦5À6²rñM¾ßüJ.Ü‘¾9hÇ·¿ÖbÉæeýÖS»o=ÑlåQY$ÆÐ,/ŽÒ‹Š,ŠEŸË]zhޢغ‡w¤º!RÇq¸¬qNGfbåf}–î4Þ@7žYG!1 î£ÎÌì5{íc2 g:3°‹•!§ëÓ¤CNݵ)DyQí¹ìâø8Õ™$œÌK>u€­¼ÔM¥¦”ªP©)¥ØŠýaú^öí²ï¶±ÈÛΛÙɆ-@OÌr_¶Sãn…@W8‰™Ó™nÑBGîÐ5ÈDMîçEKë“Ô¾¯Èá”7‘¿ï8«Û3ï£Ê„б$‰¬Gùfó,¾K8-1äîƒ!wä~XRÈÝ ÷l‚È}gZȹç“ã}t('FIë£Ô.É¡¯Þpœzx/ª\íö^”¹lž­ûiѺӺçCî>rGî‡%…Ü rÏ&ˆÜw¦…Ü‘{>1äîƒ!÷¾å>¡OLꤨ³i1‰à›Iðñ;xWtLüªGĽĹCÏ êuŽÈº&~ç5r‡ŽAîð ªÂƒˆ^ÜÀ½•I¼¥I½ª)¼ÉÉûãMNoãßR.Þý&íhMdYmdëÜòÕ#ß%·£v¶§Ò®¬úÒ¯¢4Ë ä¥K›¥¬~µ§U&6âÅåÒʹ¥Õ#ß{ÇüY&·¤Òþ=«Ö$q—·U0}·z]W"¶²|Õ§ñVv ~R÷¦×Õ“^<»2¹!•EàÊèn¤ÞQ5ùiëßæÅ] ie/n¯*¯³Dî¢>l$8y…¤rÿDˆï¦Ò¢–2ŠFD©}¹ân[zk¤V–-ýòf[“Sƒ{Çè¦{Xë~r*u™š˜ø’6FÙ9w“m¯¤5I­,%.›ð’Ü}pïx†Ü/H¥2®„á®%´mMf˜jsÕ«¤V–­ûâGšU[9 ®û?6ßS=פR_"ÑsñO¢BKä:6ó¦Å‚V%²ò"iMyM¬WRØZÝãÜU=פR•óÜ;­|M%u/…6¯ÐÖØiåk*é R8ñái‹ÏeOÂÚ]‚´%R¦àáÝT>Íê;Éœ—F9ñÿN“ûyQ·Æ)þí°Æ<Å&>¬öûžÜ? øö‚4Ö/¶{Aä.mí\´‡å!ʦO>ædQWîíEÝ´î™dªÈÝÒw?Ÿ¥]Û<%õAßúÁÍ„°þ'[ÉP(ì1Èè?Sdž/›œ†ÆWeîxl´µzú„ÍîB7ÈšOfþš>~¸7áÅmÝ£ÃÅÅŠÙpÒÓ—5ÄÈú7&hZÎŒìã‡{®¸Vì'[Q¸ø6m#ëߤž1Éǘ†Uà-޽ºãß•É0кþ“Fφ~|*˜gL¤?Ùš·êÆ&Ã@'¨ú÷ý»ÂŽä¾åwe¾°6-44NTÿbÀ*Fmr¨Ú¼ ôO¶ôÓ(õë2±ýu]\mO›®~¸7ÑlÆážTÿ _¦p«&?›‡Íŵü¼ãÑØZ¿´¨ƒåÇ{æyr?-æ™±Yž&wúîæa}wÈ2LÌßþhÞMÎÍ€fYì¾ êÈŸCîÐ4BÒò+–»¡u‡BOE-}šéHwtÚ%4݃jÏÅ‘w¡u‡Æ)ôÝ‘;ôHIî U¡Cœ€Eo‘×ÿMy´Z«MÏnŠûÓLʼn…ã§øëÜÔôùeˆ×ó±qÅîú‚8¯pM¯Þ|75½[“]-U½,Xï\ÜÚÅâìX¾‹)^ÔØÖ×Ãy…s±C›šÞ­Ò-VìvËq‡>E«í]¢vgê(Î,\ýÒÝšSuµ£3cÃ{òæÅ¡¢,¹ô3ï\r îzy©ê‚èºp÷æLÓïlÝÓm6[ê¬+‡v×Ù¨®ˆ W½l7çL]-÷ÌMÇFgó…iAzÑîι¦?DîÑÂz—tÀ¡ýÛP+OÖ~6ÓuáîÍy¦¯ö x×uvwº.ܽ¹«é»náº.ܽ9Íô6áuÊóˆycŽJñ®ú>ª¯–îUqeÀµ8—¬ïŒš8:\þ-âEÎ?¥œFç¢|m*ºÏFpÉZÄæ#Ò5Z´Òšé~9cÔ À—I[ò×—ý»žß¤FrU”†Zò0}ï·ˆMŠ·V\‘Ïh/‰s–û~yX¦¢³V‰ÜwaÃn1;>jáꢎÎÅÝYu‰­XæØ[[G²jEæ Ê˜ŠµT6½«]S¡Ç’5Çœ_ý S ÷·Œ¹gž¬üÉ9Öw§=Þ”{._‰“»í"w7–ÒZÉ|;ù¬åÌ¿‹Z»:¡™¬Ü­ÍTÚŠÜUŽ…µC¤2«‘܃oëö³µ´"wëå~¹Þsæ0ù›”-SÒºoj»ãèÒªu/šr{E›ëâ¾xÒ¢N¾”{ÚÉ´õkr7¶,wuN^E2³kEwom_kÝUßëU뾘c»éEë~¹Þs™Yïi¹¿/ó\œ¡ÿVÀ®¸‹6—•»-ÿ¾»ê«Ú†ÜÙóD}™Þ`¬ç¨°¹'çJ#(›ÜRsڢܣËu‹Ü3µ´Qîë½hŽ"Ó½h’û±ã ëoŽi|gÑæÙÊÝ–I_Õ6Tšq9ÏÄ–3“-É={ZuĹÕûQQlq²}÷$§/äždæµÜ÷·”ïS6G™MCÕÏÈÉ}‡A>ªnŠÓ÷t§Ýö{}¾ç-[ÃüPu{Ñmâc]î[÷¤–ZiÝ_‡¹Tî»®~ä¾Rà#åž¹­˜üV}÷—\(÷·:ä¾Ràãäží­˜üvOfV¹Lî»ûuÈ}¥ÀGÉ=_K›ä~µÚï,÷1È}¥ÀÇȽøÇç“ëò\‰MØæ¤i .ØÓÒ}PÜlœ~/Îy>Èæœ­œÎý¤è©ü$‚BD2\¶d¯Ò¯:‰ºdüaþ®“—Oä”ñÏ`QÄØe­ÿ\ÃñeÜa)a;AîfjêgÔÍÓaŒË¿¹ˆsá&ýÏûfÙ7Á%ø„Šä‡²Ñ³Ëøï¸["Vr7R! å. º¸+?™.\Kþ¡üº¾mùT`Œ½Îä.…î•>•32–{Ÿã˜¦˜å®V³bé%ÿ@4:»î*†_Fñåê¼?¹¢|nS–;{m¹Ï‚5ËÖZÚ}küÄ}qV¹D1LDrï±uw… cò¹tfnÀò-¿ØdRîJ=Š r¨:Ÿ .‹ØªÖÆf·Y¹«³ó¸TŒkÝòm‹¬Ü3™OÖ¶ëëæ’†ªbè¹e¨jB(€þÈ?ÄèÚrh 5á¸0›xÓüî8Àý°â· â%þW&ú‡&›©],€Rîzi°g‹‹‹ whŠ ÷ùicNî´îÐ Jîj%)äÝ!:3¹Cçh¹Ó™®Aîð ;<ä¹ÃƒˆþîÏ$h‹q|ï79ü~šæ=#whš°òU´ä›X-"ì»5²òþ]Œ\pSÜr†n!‰Ñ¯˜2š°8Œß’Oý/1¢v¸+B¨~É7·>–“xXó.¬Š¥ýË1j‡Û¢–Šx“K¥r—û”1Ü’hE¬HĉÜõâpcVîèîŠê̈5ãuÉý0–ý»Ñ;<ĹœË0ÔÎÀy ƒRxFîCä¥èàæüªö…ró^;´Ç¢Z'é¥_Úóùkù ‘c®É¸7JÒb3 \ê\;ÒºC£׺“?@îÐ8®rOĺ whÙa)vf¼O£äŽâ¡5œÌçÿCˆúsZîþÉ%CU(#Þi2}Mnþ3»»ãà_GQ<¸‹¬Åþ|hmâžì '€ˆåÚõàv‚ÿ©÷w·¿8^i·$tZ"¹/¢Ýíß].˜•K“·$ºñýu+u[ôïåîyñ¸q7Ftol©3“•»8Üá¦d…É=ª¦r·ÈZ@v`Œï¨xѧ"ÅÖ?¸”CU‹ÜªóçOí<l9˜¼Øþr0y=°ýå`òz`ûËÁäõÀö—ƒÉëí/çT¤ví?ŽÚþlj×þãÀäõÀö—ƒÉëí/“×Û_&¯¶¿L^l9˜¼ØNdüeõ´8È„ŽÊÀ ¬ës\õ‘9‹ÜáÎŒËvj§§Öúç3Æg§ÏÜ”ÂçR…]»UTft7c¯Ð»kÁõGmEXZw¸5c´ä¾hØË9´ñÆ_*",r‡[óRîÂeŒ‚¤a‘;Üšu¹k—\g&•;ЇÛ"%+ F¸8}Ñ6 ëú:b†ÚY8žaÈJûµÜ¹  =~U›Q.r‡‰äîÚz·]NO‡îH~´„TïÄï7“£<ç¼ vhEµ^ÒK£í›s)wuE wh­Z4od³Ž;4H*÷Lg&ó%.€Vˆ$«zòa¨jÒ#žÍCß|)jçà\¾Ä›w;tÎj‡ñ…Üá9|¡vx_È}vùLû?ÔÌ ¼ä µïâGà^ãRúpO¾û¬ûg‘{ ÷]H±#÷øBí;˜%>‹œ¾{ ÷=(¹Ó¶7Àjÿ-wô~û"¹£÷ûƒÚwÀ4»Ö ’öÀ4;xL³ƒ'Á4;xL³k õ@¿”¼ÓìZ‚YN;aš]K0Ëi/Ì;jf9í¹7Ü óŽÚ¹ï¹·C<©¹¿óŽšAÊ‘ŸÜÛ!šå„Þ?µ·³œvƒÙÚYNð$˜å‚YNð$˜å‚YNð$˜ö¹Ã“`Ú<äO‚ið ;< Ô­ñ?QE>òÁ€eIEND®B`‚Bio-Graphics-2.39/t/data/t3/version16.gif000444001750001750 1317112366325116 20107 0ustar00lsteinlstein000000000000GIF87aî4÷€€€™ÿÿHÑÌÿäáºUÓÿ[ÿ((ÿî‚îiiiÿôÿŒ¥**ŽÿÿEúúÒ2Í2€€€šÍ2ÿÿðÎÑ‹Eÿî誷ÿjZÍÿ™ÿê_ž Ý Ý{hîpÿÿ zÿ2ÿúðæÿ×ÿ¶Á£ÿõÞ³wˆ™ÿ=¿ÿÀÀÀpÛH=‹Š+âÿ2ðÿðdîQÿ€ÿÿ‹‹Í\\ÿÿêÿô¤`‡ÎúÿÔ R- ²ªÿ£™2ÌÿcGÿ ¼<³qàÿÿÚpÖÿÌÿúÍeÿ|ükŽ#ÿÞ­àÿú€rÿ€€‡Îë˜û˜d•ífͪõõõææú"‹"„ÿÿäÄÿÿ€€GÿúšÍÿ¯îî­ØæÖÿÿQôÿøøÿ²""F‚´K‚Ò´Œ¸† [ÿÿG.‹WÿÿpýõæÿðõÿÁ‹ÿàÿïÕÿ„ÒiÓÓÓÿäµ­ÿÁÿÿpÿÿÿÀËÿi´”ÓÿÖ½·kÍ…?ÿúúð€€Uk/ÿ­ðÿÿÌÿÿÿ·/OOúë×zÿ@àÐðæŒÿøÜ°àæÿÿÿÿàÿëÍAiáõÿú°ÄÞðøÿÚ¥ ÿÿÿØ¿ØÞ¸‡­ÿ/Ûpÿzÿe=ÿ ÿÿp€ÿÿÿÿÿ¼ÿŽÿÚ¹Ü<ÿúð€õõÜ©©©ÿ¥€ÜÜÜÿP‹‹€€ÿõîé–zÇ…‹ÿÿÿÿÿÿîÿÿÿ€ÿ,î4þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–ÀrÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨Á¥m*ýå–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zq‰ÅÑËg#Æ/šñŒCiÐ…Ö$4ºñ8i‚NÔF8ÚñŽ#Ð|2ÄG6áñ€tÈzÅ %òˆÑŠª3Fü$ò‘ ކ~ĨHZò’ƒaJ%1ÉÉNzò“  ¥(G‰–‡Dl©bREÊš)ÚŽ2s§6jS]cÕ ’”¡à,êE#(”ú¤æÉ*SSRU²Æ³ÄTh=¿ÙVöÓC•é}’ÇkÎU¯€Ui7¹Â×¢ŽôK³4êq㥵"é°°”Lc{̯/“Ål³Y"›\VEctN0;k«}:63¦õè~R[E‚žv7®¥þIlu3Û×Úö¶@†n‡™Ýò·¿ðínw"Üâ׸ 9.o•+\–0w¸¹aî†A büÖ2Ôµ.pƒ[Ýî^·&Ùí®xÇK^ï&·¼Ë-ïx¿‹’𪗽Ø}ït«ûÜúÚ÷¾øÍïqé»]÷j÷&þU¯€­Ë\ôêvÀôý­n²àà*øÁ †°ƒ#La#X¿ΰ†1,_e¾hùp×K\›Ä F/w/ì\G·Ã;òmo¡‹[äxÃ46ˆr\_çö8º;Þ®‡Lä"ùÈHN²’—+_ÞH´«cŽ)#ãk{û,ÔE±YDüí*‘áÆ±º×aþ–›Jî÷ÃÝ[w¿[JñFwƒ±»í{;)ßþ8¤Î-ð‚üàO¸ÂÎð†;üá¸Ä'NñŠ[üâÏ8cfç`U§¢ÆþG>•AF¨±ŽyIÎòerB˜M¹„ÖØòš%2ƒ<È*ÆjÛüçIyù)©3tÅÐèHGÒËù˜ž¢ÇfåIºf–.óìÌñã>—ºÖ1•ÅZG65ùÖÇNö²›ýìhO»Ú×Îv1W¬Æžs«4h`VÒ´Y—H¶\÷–ÆÖ£ÉÞOw¢jÙïˆKÞ;TxK'þðšžHã—<ùÈ;ÞðrѬqòÑÐ:UB!ÇuU¥©t—8ÉØ’ ysl9–ƒH|‹á–&9H¹¯·‡bi‘]—»¸—¨7–ŠH—TÙu‹Ù–å‰+ù’˜é‘|)Žiäxoé7I”xQ— Y€q‘W‰šÿø—C ›sø’Ÿ1’£!o—mœ—Б‘½øJZ™”½é›æ–¡Iš¿a–®ÉŽ—œ ‘œà8š.y—ÞaœEY•þYJÍ9œ@!FI›k‰›óhJO©wÅX™œœä™’ܸày’ëy–Wù#̹—a’*)HIõ÷ØéuIIjù²™Ÿ/å–å9Ÿí™“^¡žäÁžÊ©— Êu^ù~ÈYŸü)ôéœhÉZñYŽbÉ…þ 8 iQ Ïé‹I‘ Î jæÉ è¡áé áh££º(¡:*”$Ú¡Áù¡žy öÉ–þx'*š?©¢Ü‰ŸÐY0zž81£º˜‹ç##z¡=ª•<ªŸVZ]ê¥îÙ€÷)¤GêŽ ÒŸ%šŠNðÈ‹â‰$Ýé¢(Q¦sº äI£Aº¥é™£þz•aúœJ¦”R*Ÿ$¸¦I˜0©¨J§CbŠzºJˆF ‚¸šå‡©¦ˆ—S˜g”H¦Åª¹ˆªJèQ¡ªuç È• ÈªP®Ú‡Šh‡ºº«¼Ú«¾ú«À¬ÂÊTž*k/˜yä“B)dEåò?A<Ê€¥ùwLŠ¬Õ )£-Yd,˚Э[Å)Tè…»—NE¸ª³G…%£­õÂ-ÜêDÁ¯´Ã14”2#„,ñڬ낯ôJ;Ý ®’'~ÑçlLh}ÐkªÆPÙj-ó*¯L$¯Û°ýº¯ôê®ý:¯ÚÚ¬»±;—oæ Èlí'Tî‡SI‚¯÷ê+ÛD«þ±þZ/íª² ˮˮÿÚ±^Á©¦PaVæ}³[³KÔ²4$´{/ã²DK±8K¦:{O3؃5µß´»²ßª+.û®];´H‹´Fû²Lû´9;jç:†`˜¶¤w…2¸IJ»²4«De‹±%ô-üZ2x»·v{³f‹jxI[û·\¢N%D¸ˆ›¸gqŠFªw«®ª¸÷™Ú¦ï‰¨UJ’p”Ë”ã8œÅ™¹š»¹÷ö™ã䘨+¦¢[¤[ºCé–›Ÿ|š¹­ûn” »Ü˜³[¥µ[n·û¥½¨»«k½ûm¿«ºÄ(¼Ã ŽÅ›ƒ— ¼É{¹» £Í{mÇþ‹¹©‹¹ËÛŠÕËÏ‹¼¯¨¼Û;ºÝÛkŒ›X¡*‰‹ªåÛ¾îû¾ð¿ò;¿ô[¿ö+D3-÷kqƒ‹ýë­ûËh-«¯Ùº·öº±(k·/Û°œ± |±ÀH¦¯sËÀ`+±r‹Á¼ÁJ»À›¯*û¿¬Luë¯ïj³F Â^Û´[¯lÂx{±#<Á2ŒÀ6<± ³Á6<¶ëZÁ3\du{À>¬µ-¬µüÃ'L´æ"ÂA,J%¼Â(¼°}KÅKųÃõj.-üÄuèÄ^Œt`Æd\Æf|ÆhœÆj¼ÆlÜÆnüÆpÇr<Çt\Çv|Çgœ©xÌxª{§Çþ{ìIP'yÕ7‡ÌwTwkh¶H;7KPvÈC¦GÞÈFÑAFdÉHv"îarQ9s—ŒÉF6ŠìÉ…ÌɃ ÊÄZÉ“¬Fœ|u'‡Ê¶µR›˜™ÔÊŽœY°œËº¼Ë¼Ü˾üËÀì±P6…XF€V¥$̈U¥{.ÈPhx§ÊLm#ø€ ëg$;€¥÷…ÇÈÓ|D4õ±jÕº}ee¬õ±ßÜEýçd¥&†ÝXlÓ—X<¸Î_¤ƒ b¨€ÍxÝgÏìlµÆW…zƒdµ|Ó ÐOäÎnÛ|˜i\8ª¹G† ]Ñ}ÑÍë~кÝ»Mº½Ñ-Ò ýÑ›kÒ%MþÒŠ‹Ò)}Ò*=Ò/ý·!=Ó4]Ó6}Ó8Ó:½Ó<ÝÓ>ýÓ@ÔB=ÔD]ÔF}ÔHÔJmÓ+½ÔNýÔPÕR=ÕT]ÕV}ÕAÝÔÍÒ2Ó’Ò.íÑ\M¸c¸`]Ò0]»eÝÕÝÖnýÖp×rýEùû¬~ÛÅÞz¸¿2×\4Æ4ëÄ%ÌÅ|­ElÀGK0ŒÂ1›ÅV¼Á&ìƒE-d±)Œ× |ØýÂ|ÁXÙU”؜­ÅYÜ®ŒÝÙ_ëÙWÚ-Ú\LÚa«À±ÚªýÙ?Ú,¶¢Í´š}Û­-ÛµE¬½Å˜­·ElØÄ=Ü]ÚÁÝÜÎýÜÐÝÒþ=ÝÔ]ÝÖ}ÝØÝÚ½ÝÜÝÝÞýÝàíp¹ÞndÖd‚ÒLÞb5I%˜ê=E+W*vyr5bféýÞѦsX÷lª¼ßŸŒßN”s§ÄX‡Šj#÷ àªR{ÕÉV'vÞ¬àM¶‰ØA }äß^«ÎeS¥ß(‚Ÿ<Þ>âßm &~â(n $.J)žâ+>J-~â/Îâ1ÎrÐ,âò[ã$'s¢æÅ-Þrï¬jÔÄ.nãâzº }¿E¾ãÕ\¬#,ã@Þ䀯PnäÏ<ä>nsÌìg¬â3þå`Žt1ŽâaÎIcnâeÞIgžæf®ã¨ì³^dnÊ<Îååöã¹äòœàq¶µäo~äÍgp~NçRŽåÖVå°¼åÛkˆþçW¾Ï÷æåº¼åe(p’^Ñ|ÎæšÞËgŽæ›þHþé‘´æ¢ês^êˆtê¨Hx¾ê¦Þè®Îêdë¯Nëë¶H—žë‡´ë¼þëÀìÂ>ìÄ>;Bio-Graphics-2.39/t/data/t3/version11.png000444001750001750 1134112366325116 20116 0ustar00lsteinlstein000000000000‰PNG  IHDRî#Z]t@PLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔîÿCz‘„\IDATxœíÛÁ£ª@};5ízöÓn‚Nh¦µ3‰ßh¼Ëe­™äOpIÀë`ºax;ϱ®»1æ¡||–u6À†ÒË¡;´Äð‘hY¤’t8Ë·Ì5ùîýû÷ónÜ7&š$^6ˆš^~ž‘‰˜ÜbíRÒ›Èëî›|ÿöQ.ü„oúÇAOÜýg-•l^Öš"–t÷­gø&dùMÅó’ "D%¥¢çå6=\‡=,·îáƒû¦º!Òã8^6ˆ˜§³±¹ÙK¿4Û CUÝ_hQm,Ü¡ÎÌ4»íXoé¦GgâwD憜®O“9u×&ާ]N'ÎAmœ¦š“Ä“yÉ/`p˜é§7/5¥´àp{N"x©)¥‡«àœèt‡ŽØ¤»ßhàrÞ{r[Æ®g›îÓk:–?Ob§7ÔÇÝç÷iG ˜P ;:3Rz:3P#»[÷ðÝZt‡º@wèˆCCUt‡:Ù½#ÒŠË+ <¡*8ÌîÐè±I÷ñ‹þ~S~nL:»¬K{$‡£G|OìK*¡§íM2Íæ],`'Ûtÿß_Fõý6ÝïK:·¬#KŸÈá7o"cœÕí™÷IebèT’…¬'9¦Ù¼‹q©;A÷ÑÐݯÝÝBÐ=Y ºŸ\º£{~ar¼£¿]ÊIg–uhiäЯÞð= °/©\ =m_’¹lÞ­ûË¢u§uÏ/ Ý}4tG÷k@w·tOˆî'—…îèž_ºûhèÞ¶î_ô÷SK]_ÔMIg—ÅI#'4 ºCG ;tºCG ;tºCG ;tºCG ñ3¸u ´‹{Ðdö|m!uךcÏÇæ Ð:ò©Ùtf qÐ:‚¡*tD´#Ý¡e8ÌîÐèîÐ'tÇaýSšÔù6áIN>ãàÝø§”‹g¿Ézt‡e5'ÑW|–܉µ³})/Kp^÷PÏâ‰|ÖíÖSPýúÑžFU±.—µ¼ [ºzäsÏã”erËR^äîþ9«Æ&q›·Q+àû—Æ}q-ËG}Z_Ë®Ácêè¾êõêI7žS™Ü°”—%8¥»<×Fÿlý1žµìåöVyÏÝÅú0‘pr Iu?"âÞ¥¼,ÁÝE#¢lw'…)*&l#­eÙÒÏO¶µ9ƒLÝOŒ~t/kÝo^ÊeÕÝ$›´µªžs?²è¾‡´–¥â² _ÒÝG÷ïÐý¥\Ʊ¡ª+aøÕn›¦šÜjUÒZ–­ûFV«®å$ºîÿ˜ýÌêyf)WqxÏŒ/‘è¹ø=Q¡%ògÓ[vÕò¬‹¬MùšÔr¼’»Ñ=ÎS«ç™¥\ÂQÝ÷ NÖò3+©&ŽõÝi¦àd-?³’*S“ #éþç/Wgäþ¤kãÏÄÉè)i»`ïRŽfuÏbÎ¥sL÷ÿþ»M÷û’®¿Uñ߉ژ¢§üIBüÑa÷é~4â>þ\´ŒÃºßº;îÒ]Öµ›¢|ZÓ­¯|Ê7hñ®îçûFÒµAëžYÌ+ºÿ¡ï~?s»v2zJ‚¾;@ƒ ;tºCG ;tÄÝ݉?á E}%bøÌeª-âOL3áOz¢¯òám .ÐÝ¿}¶É~„fk>9ÑÝwꇃç»[Îr–×’É“?eø×7k¸¹þ­ NË‹»NõÃ9Ýøœ¼Ë›AØ"¶m¸¹þmÚèY›¼¬-‚SºKÅ%Úú2JÚ@¯ÿ¤ÑufÁaݳW(Nïê‡MÆFPëß¿éËhÒ}Ëe”¾°&-4TN´þÅ€UŒÚäPµ Žï™ÑW(ê½QêbJñÚ!꺨Kg‹¼NõÉK³¡gê\ÿGo¼Qgiáª]ÿœDqLwÎwï›»Oo¿ƒºs5S×ü¹ùâ¥Û8¬û]ÔYÑŸîç#¤\e5vFoºÓwïšÎúîU‚îÐèîÐèîÐèîЃ §ç»sò§«݃ÄÄ<{èI³¥0˜pµ‰ñWÛÎʧóÐjFê.ÿĺ[Zw¨Ÿ!< õƒ‰ú4þªÓ0 ZDënT{.¾ù)´îP7K}wt‡YÔ¡*´‡ÓÝŠÞ:;"¡Q8ÌîÐèîÐÃÂ3¢»µštî^ØÞX8¹­SdÕ ·!^ÏÇÆ;v¿/Ä}…+àîÍeSdÕ;ݼ%ñôì q kùÌ¥yî¼dù,¦ø¦Ææ}î+œK(²ê½îÆé²$^F ´Ú~J”ÂÉL]Ç…{¿tEs«W':3â9yú©Jb&+‹¦ëÓÈ^¢é•ÍU²u·É{6[j®+‡ž®³ñº7îõ²Î^]­{æGÇDsó…©A÷K ÷zÑJçÞª¿D÷hHaü”tÀ¡Ã›P#g¾½o¦é•Í}UjGäNlgåÓtáÊæ¶ª?yTµé®é•Í]UÏIÐó7$QˆÌ†6í Ú¸.¥»úª®qZº_Å•×Òœû“~ìeãädtyèíGÎæ0K9æEùÚTtŸ0%[#&Ÿ^£‹µ´VõÖGšáß5öeÒ5ù eþ]Ïo²Fr«(5çáû÷|˜¤xkÅùŒ>%iNºOñç}Ã*9c”ä~Ä>.fÇ'-¦º¤£yñèMmb+–9öµ­ Y5"SeJ‹ki¹êÝÚµÏVt׫Z‰û)ã‚îÙ†'"?sʃq•{²>vêžËW2Ém‰fÖÝí:Юdþ:}Öræ½®§:ÑlVwc2+mEw•cQÛ!Q™ÕH÷Ú¸ÏÙµ´¢»ñº?íû’îÙfM´LI뾩펓Kc¨Ö}±*·/c±ÎuqìXT3êžvc2mýšîÖ,ë®æÉ­Hfv­èÆÛYnÝUßëWë>WÇöª­ûÓ¾çt_YñsçMè¾_ó\š¡ÿ®€Si/Ö¹\¹Ûòﻫ~U›;ržØ—é Æ>G…]Ð=™·4‚2ÉïCZfQ÷hsÝ¢{f-mÔýYß3ºÿZþ÷·è«ûµã ãÓp8ÍÅ:Ï®Üm™ô«Ú„•f]Î3©åªÉ,éž­º bÞêïÑ¢lq²}÷$§?tO2ó[÷ó-ånÖ‡ª lª#§û‰ 92TÝ”¦ï/è>ÎBrÛëó=oÙ懪ۋn’ëºolÝ“µTKëþ;Ò£ºŸÚúÑ}¥ÀWêžùýZ©ò¢úî?yP÷“?uè¾RàëtÏváVª¼¸=3«<¦ûé~º¯ø*Ýóki“îÛ^´î bÐ}¥À×è¾xðy¥Êuyä÷I¾¡îR»<\4bOKw ¸Ù4ý§8çù(›s¶2;õHÑÓù“’ñ²%ûµüWO"xa™/îÐÃ8ŽŸ¿Ó{sŒó+š” =ðiÝG÷¿=þnÅñ†Üd9›#ß·væÄ¶~'tÿ|ø¨ñ1äp.KcœÿM…œŠ÷õúlçÏ6L !áEò{)×ý6˳Jw+ýh©»Syšîd­|©ð“îêbFÜzÉï!ŠæÎ‘Ãt•‚뻇&¯9Ý¥èÞôoIC1cÝ[ÉTĬû$¬ß±¡Ý7ÖŸÉ,æª)Q ÖM^“º¢„îmYw÷·™÷ðûÏ݃,Ò½ÍÖÝ+ŒÊWté̀ɾguWs§/bS±®uÿ"uWV´A(L€Ê¡ê4+L™eg¨ú6YÝ3™÷ ëå0úÖ…T6ªŠ¡ç–¡ª ±:ÑÆº+ò;1¿t¡;ôÅòégèîP"ê„ã…³‰7ß­Aw(#®W”ø«Lô…&›Aw(©»¾µNødo.‚îPA÷içzNwZwh¥»º“ºCsˆÎŒEwh­;ht‡Ž@wèt‡Ž@wèyª€å$€ ;tºC‰Œã¾kr6†Ew(“} ý =ÏGw(“pç«è–oâná³»GV>¼O Ý¡LÜí Ý$FǔцÛÃøÏBùLøé.Z#­;ЏŒ¿å›»?–S<Üõ.ÜK‡wc€ù…îP&êAÑ ÞäÍ¿RÝãÛ}ŠÔÐÊ$º#V$q¢»¾9ÜëþNgJEufÄ=ãû’û `\ïRd¨ Ý@g:Ý¡/Ð:Ý¡#Ð:Ý¡#Ð:Ý¡#Ð:"Ñ}ñÁÕ3ÄOŸÏèn¢ ‹Êf0æ§¹ù èÕ1øy¸—±ÿ3¿L41×ä”Ì •oÆDžë‰´îPß¡ªØŠç³f¿ ;ÔKÐÝwU¦‘Üét‡êd‡e±3ó šêŽñP~G¤|~ef¨je»ï‡³/eàU…Ž@wèt‡Ž@wèˆÆuWG€ÝÛ¿¦éî{¯“XüÕѺîß—Ÿ§¯Æ$Ó“Ïb4Bgº‡v=LBx·Vî’µî Çª¥Ý'qå”YêнÑáÝ6à¢ù24ùµÒºî‘èÖ÷×hÔÍbx¯{8—ëð@%´®{öÝußó™¬îb>º×Kgº›ŒîñP5ÕÝ {#ô¡»Ø©¤OwDŠ÷p©‹ÿ,R€i\w ºCG´­û?ÿ¼ƒ)¸ÖÑ®æŸr«ÝárÊõÝázŠõÝáJõÝá õ½uÝá=Þ^ûÐîâíµŸ¡uÝßÎA¯”i;ºÃj;ºÃ ”j;ºÃõk;ºÃå”k;ºÃå\ëmë h\÷ñÃêlñ%7žtU¾àZ×ýçÜ噹è^9]è>Úo;ým­ÿ¾Æxî÷55å£9ÅTq×~* |Z×Ý)nÇ ¯ðݵàú¥ÞE\Z÷Úi]÷è=Ò}vØëÚxë7Ýk§wÝÅ”1Š’ÆE÷ÚéZw=%×™IuÇøšéHw9µbŠó{ŒÞÓ¸®¯µÒ¸ît‡Ž@wèt‡Ž@wèt‡Ž@wèt‡Ž@wèt‡ŽXÐ=}V:@ý ¿ugƒ€ê¦GÒ%ÓÑ$ÖÝȧ+º‡Hÿ°E#ŸÚˆðPƒ´wÒzV{~3&šç‚ ;TÇ`Ä“v½ÙáÙ¹Fê®¶t‡ê´µþ[pÞÊf=|Cw¨Œî™ÎLæØ*!Òݪž|ªÚôûæ¡:8ª ±S÷²Ÿ¼°ÎaÝïÉÀìíÌ ;TÌQÝoÉLG˜ùõýÌ ÿ)vUÑýän\©>ÜÊAÝïÈJW÷Ï ûƒì߉îW eG÷Ç@÷w˜ç+½››n8p˜ Û/@éNÛþèþZw|ˆ#'`ûy"ÝñýÐ:‚SÄ #Ðýq8Íî=Ðýq°ý=ÐýyÐý5Ðýy°ý5Nè®öŸq`pèþgt社ƒ`û[œjÝ9©ï èþçu社ý ûKœî»süØþèþ èþ—éÎY¬»ÀöW¸HwvDîÝ_áÂÃLø¥ÃQUèˆcºsRTÉYÝ/ÎÀìÌ ;ÔÈIÝ¯Í À½ª¢;TÈ9Ý/Í ÀÝÞ‰îPèqü0¶Cu ;tĉ“°jÝ¡#8E :Ý¡#Ð:âÿ*íw  †€IEND®B`‚Bio-Graphics-2.39/t/data/t3/version13.gif000444001750001750 1307012366325116 20102 0ustar00lsteinlstein000000000000GIF87aî(çÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔîÿ,î(þ; H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–~rÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨ÔÁ¥m*íä–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠH ¶È&,zñ‹cYºÆ2š‘*b´Ð×ÈF°§TŒj£ç8”¯”‡ŽxÌ£PìH =úñŠI•&mò õ€’/^êŠ(ÉS}RP)"dK9¢W~ª•²lÕƒPé)úôò–£TK¥ìD›…܆•È´g†Ù)Å O¿ä 3‰éL@AóV’2 *+es0Á”æŸä´©cz/Íü&3³©È@uÓS„ÌåS¬©¦%‘“+ÔþœT}ä *D}Æ”° è.—©ÏpÎ’ž¦Âç=Ê)}Æ œ‚§‚$šN5¡”ºOFó9L~bŠN¦Ú¨C¿P[ô s é8µ™ÒâˆT=•PIÚQuÚ% Ý&=“Íiºª4í¥J9zNž'ª ª^ÌIÓŠæR¥)ꢤúÒd^Ô5T}&A‰ºÕXE•¥åœé¿ÉPõ#_­ç§XÚÔqž³¬Ô1'[™J×µ*®H:&XwJS¡Þu®ØÌ'I“Ôã0ÆKg•f9!ª¢¡¾õŸ0],d%CØ‚–ˆ”‚½,e—zKÍÖʬ‰µ h‘ºŸÑFq•¡í jk²ÚÝ´6µ°þ-AÛ_`¦¶¶•­@p[Ûðö·ÀnB‚k[âò–%ÆímnŒ;¤_¤! ¹µŒs¡«ÛÝ>÷ºÑ­Ét¯ËÝîz»Ãýnq¿ÛÝì¢d»ä5¯tÓÛÜç&÷½ð¯|ç\÷V·è¥îMòKÞþB׸⥭Ý›[Úî¶À>°‚ñ›`/XÀþ¥¯„'La ³—GÓU/Z2|ßüj8&ü°w?Œ_ñ–xÀ$Iˆ¹›â³¬¸ÅþÁím•«[áî·Â46qü^äöx¹;¾¯‡Lä"ùÈHN²’—ìU\nV8æá¤=™Le>M5¦²|h•XÊ„öT¬±$ãGwºÅf†¨ Q6íþ–ZSo2ÕBR¹ÌÕ¡}rñÐ-Zê´gÎsD²¼“q}yÐÙ󢛉å#OÐ $£;=%"zvL~¡§[ýèiÆù‰2^s”_ýë`»ØÇNö²›ýì<´-µÜÿ¨Jj‡i¢U]T´z]¶q×)Ûâö¶ßÝ't§»<3‘¿G*ðs·ªIå "Ä9ÔF]¼Ü'ÏÇk¡“Ū„N…ؤžf²²uŸáŽùÎkþEŠTQÝ›RÓS~ÑþÌ|T7#ÙÃÚôïÌüëÅy'mf“¢¾®³‹øzr®ÎJ„F6v2:T¹ZúÎø„|ßc›|O/?Í¿çV‘þí{›ž#~J%­ïåÙgµ÷ˆF¿áþhñ+Íå?–¥ÃéÖNŸúí',ð;ÍÙ@×ßüZ'k˜f1UQvU€QfY|%yOâg èTV…i¡ô€mÅxšæ€nkë„jÕA··{H2MWVLØçVõô|XwŠæ$8‚û§V.(gHxÔւަÝKRaƒ&¸}7¸æ|ºçYæ×OæNª”wD„ªG#®G„„€%z6glLXNxkùÑ„x„'È(×¶!'m–‡vo—xc†Òö}fh„mø†z¢EreÆ„#ÖqaF‡>gXjÈZsø‡€(‡L¡„¿Aœ5Rþz¨ Õ¤xâˆs¨(Ž(ˆø‡|7‘èˆ%E‰—h—xs¬7ˆˆ:G$cPЦxЍXŠñÔXY¦Št1xøˆ¡”ˆLŠ·qŠl(~Š¼Ø‹¾hŠfE‡´¨¸HNÀh¶¨IgP±‹¿øŒ9èŒÐXŒ+å‹`xG|ñŒÚøj¼x‹Ð8to‘ŠÒxŒ¯(Žr¡Šj6ŽÚhåèŠC²ŽÔ˜€…HŒ°˜°"²’8ê¨∇!¡ŽðYFˆíDèx'ÇXNÉ8-G{"8Ý|ÙÔVìè†yŽiŽ‚Õöøñ޶ø!i‹m‹£U‘YãèXÒþ‘´äÍ芻X·r9ÉÉÈ’¹Ø,Ù’™uA‹/©W éN )SksÙŽB‰lëø’f–‘D§‘AIw噕îxM\Y’ Y‘ñ^!”æH•Çç2‰gøÈ6yø“Q±a¹¿H—…‡–SYY{Hñx’¦ÔLYMJØ|YÏ4•ÅRAyhüh‰©˜}Ö•Û("P©ŠI–i–á•Z©–kÉ2 x—Àѓ—©“™—zYˆ¢)˜§’a„‘˜¥Ä˜À¸›½ˆrþ¨›Ša™"Y‰â¸™C™™¶Éw¯yGi—l)‘¦É‘·83A˜^›µþØœÉ ñ؎д”·ŒÂI¼éŽæù›šÅ™ž¬ÙžÆtœc™œ9xÍéèY†¹Ñ–‰š”ÖhQÁÝ9Kß)áù4y–|ÉIç)—îé‘{YžœAœyù#òy‘ô ’[qŸP „Ñ9êŒÕùŸï¹œ{D êäx— Ú¢ãÉ hé Û¨ ¹¢a1™`h¡VÉœb©¡Ú ÅžÛø¡£Ùü‰Hþ™ª’FA¤Q‰$ £$I¥Á!£Q¡Öh£w‰£Û٠٘Eú™JŽœé¢¦¥*š;’¤hµ¤hѤ”ù¤**ž £š\ú™ä ¦Zú›{ú˜ë©£þaŠ—ðÉ“?j¦êljÊŽlª#¡¨—wøŸׇ~©¡˜Wp´ZÐy¥Á©SªÐ$Šu)ªö÷ˆ›È§‘臥¦z‡– ‡²:«´ F%”BVT.ÿ#ÄS«S’2ÚâEÆ‚« Ñ«¾ 'ÀZ/Ü2¬N,ÎJ;CC)3BÈ⬺º.Õ­´C¬ÇZªCzSƒWÉÊ,Ðú¬Lô¬æZ®ÚŠ­Ñº¬Ú ­Áª«ð:¯ÝºžŽ®m'€Q­Ôê+èÚDò*¯ÛZ/Êê¯Öò®é:­õŠV¥wk³‡zxÆ…Ÿ×y¡wmì¯êz®íJC¬ïê±%ƒ°óz± k¯­}×'XX6|þ}7u±Ìš®J$°1»®Û±! ²æÊ¬ [²E™ý§™hˆç€Ÿ&÷R³=›D»®)ô-ÙZ2P;µðZB>"ˆjÑ“_´vöHÆzµ?˜µ:ø‚¾ƒŠ7ƒ`Ë­br>%±ŸˆXØ…µ&Ym{·“' x{¬±º·~û·WGªž˜ª¯Z¸¸ ¸»æ“Ú±¥ê©œuºŽˆ;pŠ‹”€ú›Áù¸¹瓾ǸCÙ¨˜«¹ÿƹžá¹È‰¹™+ºû¦¸¥[¹Ÿ‹º©«ºìƺ7š¨ó »ð(»ôF»]j»@Š»Ú¨»³Û¸µ‹‹ º+¼âÆ»Ž«™‹¼uª¼ÝƼy¼Àþ ¹Ò[m¤:—„k¸†›½à¾â;¾K6CÐB¾2¶¡¾¿‚¾Ý°× ¬S«°ñ˱ò{¿ã®ó‹³2ë¾kv­Kk­7«®ÿŠ±èŠ¿ôZ®òۮöþËdM›¿<[µ«À[À[° »­Ôú±ü¿\Á=»Àýû¯",²'Ì¿¬iLÁ#ûÂ&²<À;ÁýËB+¬g-<°ÌÁ:+­?,À ÌÃ/ìÃ˾9LvHœÄJÌÄNüÄPÅR<ÅT\ÅV|ÅXœÅZ¼Å\ÜÅWéÅ—w>’šÆkÖtƒøÅiÆUuY˜z+² ¬è—l¼e]×GUÇqÈQu…YÇv|rþx,Sö¡ˆ×Ç~Le¨¢z-'n¬Æ‡LdzŒ "ÈH7u¬d‹ñ…œ‡""·O§tɠʢ<ʤ\ʦ|ÊdR#o¬TÇAV–še¨ŒI_«²6’‰6†úË4Ë3˜ƒq–g[{¸GhºÜHG›‚¤V*y›ja%´ Ŭ~–E½¶‚÷kUÐ|H<(|š÷ËdË|k |Û Hݬ|ßl€…Íø~ålÎNV·Ä´·ü¶ƒü‰¸üÎú¼Ïü,Ê9ºûÏÊ+вûÏÐ]Эº ­Ð ­¹ íÐ ýÐMÑkÐѽÑÝÑýÑ Ò"=Ò$]Ò&}Ò(þÒ*½Ò,ÝÒ.ýÒ Ñ0=Ó4]Ó6}Ó8Ó:½ÓwÜ„Ænù"­¡qªþÌÜy”l†%·TW©âÜÔ}Fb«’̇d…ÜÝtd‰RFÈy\ÉÉmÞk„ÞØíq“¼ÇÚéÞ=´ª\f||Ç®gßþýßWñÑ^d=àFÖÑNà1 rÜI¼à'têŒÅ­rÉœjhHÅmáåËz[ÑC]q¼ìàLÌÔ ¾€í¬Å&á(ÎV^|Ô"Þ⹜Ã0žà6~ãä+à8.[¾ãº…à>Îã®Ë][ß?^áÐ,áÆÇnHžä…á*Øm¾ÍÉìá7åNÞƒùLm+Nä2žáÜÖå±ÌË)No5nʳL…wæRýáAþæ;®ãp~V=>ç‰ävNçCžç0Gµç|nPMþçz.æ‚LX^è}âˆn芾è£ÄæŽ~Ié”^é–~阞éL;Bio-Graphics-2.39/t/data/t3/version14.png000444001750001750 1141512366325116 20123 0ustar00lsteinlstein000000000000‰PNG  IHDRî(0š„ÌUPLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿÿÿÿîÿÿÿ€ÿpÇ/šsIDATxœí £*½Ö;=8ýfÎ5(ð±7¤ª;ù£"–®“†©vžc[w­õCéø,ëj€L¥ó¡;¼‰é#Q^¤–t¸Ê”¶ÌTùæûû÷ó­Ív#u4_2ˆ7Ò}ì4-#ѩŪ\Ô»Hën«|ûõQÎíÜ¿sðGþ³K2-Û»&€€œî¶ötC²B–CÞ|öODÄ"ƒx‘±øÓR›®Ãòµ»ûa†¼fˆô8œ/DLó#S¡¹É¹= ÂÃ~\WÕo‚gjT wª1³Mn;J…Û@¼éј“Ø‘©.§iÓÄ]N¿iÎç»\ƒª0NoJ4ŸLKzéÛLö×Oo*U¥ÔàpÓï –JU)58ÜÅÝ:Ýa vén*ש\žKÀýìÓ}ù,çò×Qô†þ8 ûú½ãzá@cFJOczäpíBwè t‡8ÕUEwè“Ã"•¸½Bsº‚ÓL0èî0»tŸ¿øÃ…ÒS0êä²N,í‘Î18U<‡?îh”q2K‘ÍÀAöéþŸ¿ÌÞp1ÝËEZÖ™¥ÍO¤ð›6‘¾9LêþÄÛ¨sø±D ÙŽrŽ“YŠ9—ƒ û‰ÙÐÝïÝÍBÐ=Z º_\º£{za²¿ãÝJÁ¨Ë:µ´GRhW¯Ž‹*5‡?îX”©d–‚ÚýŽeQ»S»§†îv6tG÷{@w³tˆî—…îèž^ºÛÙÐýݺñ‡/-u{Q…¢N.‹‹f."x%èî0èî0èî0è1…ï<âÑ1ð^Ì‹&“/àxRwÿÀë˜Üû±yC¼ùÖl3ðrЂ®* Dp ÝáÍpš Ýa ÐÝa .èîÎÃÚ·4y×Û¸79ÙpôƒcßR.Þý&ËÑœ"”ÅÍž]=ò]rÖÎþ¥T–àºî®œÅù”9¬)Æ úüW{j¯ˆ•xq¹,åŒnñê‘ï=c>—È=K©È)Ý—ie^t œÜBbÝψxt)•%¸¢»¨D<ÛÍEgnŒ7'ì#.eYÓ¯o¶U)ƒt8»ìto«Ý /å6ÎꮣMZ)¯œS;Yt?B\ÊRqY…çt·³Û‘%t`)·qJw›C·×nk•è¦êÔjMâR–µûF«_ÊÑìÚ ¯ÝìWVÏ3K¹‹sº+‘#Ñr±G¢\Md¯¦W&$ (åUYšr•r¸’Ü·ö[œ—VÏ3K¹…³º#î\,ågVRO*œk»SM?ÀÅR~f%u¦ÂéÆ @œÒýÏ_îNHù¨{ãÏÂÅÙcâ*àèRÎ&õÈb®ÅsN÷ÿ-¦{¹¨{ãoQü{¡4–ÙcþD!þøaé~vÆcü¹i§u/ºJé.ËÚŒñ|jÓ½ŸtÌ´¨«ûµÅÖˆº7¨Ý‹©¢ûÚîåY뵋³ÇÄ!h»¼t‡@wt‡¸¢»¹ðÇÝ¡è߉è~s›*4Á ºÛoí_-¤“?á5Øë0µû_×îUµ+½“×»+å®r–÷’É‹?eøêù„û‘]t_‡jî¶ì×t×JÖëÁ·|„j"³p²ºSÊ9-¯{oî¶ì—t—:‹[´ýÛ(å<ðdu§â}¼RÑG©&*½Óº'ïP\¾½-]Î/Á¯î¢}¼¸‡©1 NvUwÜFi3«›Ø®áF¼êÎ~ùw¿Iw%vZòIiÑÝŠª…;án‚êNtXÅA ÙUm¤Ò;­;úNÐtñîoò¶ì'ÛîÕÓ •éS€ó—n«»sºs½;tÉIݹ›ihJßÍQŒÓº—Ý;àOá{õŠAíÇMwÚîC3˜î06ƒµÝºÝa ÐÝa ÐÝa ÐÝa ÐbÒîns ÊrÓ­yM¤˜¦T¯×9|˜´»¹JÛ›ËWåãiè=#u—Bݵ;ôÏäÞtýAmûL7 [Dí®½ú\ Ù1ÔîÐ7¹¶;ºÃ ÉêNWÞ‡Ñ]‰Ö:"á¥pš Ýa ÐÝa ¦Ì+D‚‡ëxêªwl fŽSnÛ4YôSæ©ÛÛéÐùI~²N¦ê6Êe®‡•·M“Eot×ò ÜË›•Ä äõÖ©ë’å›öÂgxëú>”Ëœ‰24YôVwmôtI-3àjm;&ˆáb¢î£dæêç®iŠzu¡1cß™¦Ì¹&?IfùÁT™%7Þ¿Œ¬º¯Î\Û”,ú‹µ»Š¾“Éò¦š|øãýdT7¢`æªç­qJzu·î‰Ž¦¦3Óƒî·d®zÖZ§lÑߢ{Ð¥ÐvLÜáðÃk—-'Ö>6óê̵M¹¢¿t ò ¶³öyuæÚ¦XÑ_ÓýÝçZ^¹¶)Uôuè‰IG!Úr€h瘋w3ô]Mã8w¿²+gÜŠsmOÚ¾— £“³ËSo?R¶†É¥4˜¤kWÖm2ܘd‰ètDþÍ–ÒVÑ+;ûÓLÿ ñúÀ6O~I~Béÿn§7Z#©Uϵ¦áû÷z‰è({[Ùé ~Eq.º/ó¯Ç†½è´ö$·=6÷3›µk¢¦…½7oÛȰL±-m?R—T-Ò°$PÆ”]Kù¢7k÷×Ê+À†îþªöÄýä1£{²âI†HO\Ò Má^,“ƒº§Ò2[¢^u7‡|W>[)Óæðœ?Öˆ¦’ºkXiº{)¥í"•I tw¡µù\Kºk§ûÃÎçtOVk¢fŠj÷]uw]<‡W»g‹rÿ2²eîg÷ÇEoâOÝãfL¢®ßÒ]é¼îÞ4¹ÉÄne]Ûs;ùÚÝk{ýªÝ×âØ_ô^íþ¬ï)Ý7VüÚxº×<§k?Ä+àRÜÙ2—+w_úmsÕ®jíR§]Ê#û­ÁÐç ³Ý£i¹”Žöqqê¬îÁæºG÷ÄZÚÛ˜yÔ÷„î¿–ÿÝ}u¿·¿¡íÎ1^§ãÌ–yråîK¤]ÕÚ­4eRžˆ-UL:§{r²×dÓ6÷GYÙÂ$$ÛîQJè%æ·î×kÊÃlwU3ìꪞ#¥û…9ÓUݧm/ømœLtû÷õé–·ßµKuU÷g]G!¶ußY»Gk©—Úý÷Lê~iëG÷ ß©{bÿµQäMµÝò îwu辑áûtO6á6м¹#3›<¦ûåvºodø.ÝÓkiocæQZÖý†N ºodøݳ'Ÿ7мžî:â÷LßPeºÔ& 7õØãÜÈn2Nû+Lyz–Ý)Û˜œ˜õLÖãé‹2Éù’9ûµüªTX&@%Ðbšçùówù~óú F%BÁ|j÷Ùü·âpC~e>aN÷ÏCê¦éFæõß’É%{_ÿ—ßjý­Ü*’îÊjå©ÏãþŽÖÓ]I?^Ôݨ¼Œ7²ÏJ~¼P@l1vß`Fý)¨ò^§»ÝšþÍ©Ëf¨û[{2±è®ã'ØCÀv §®3»ñ^ öÈŒ¬ò^©û,rh¾òºS¹×fÕ}V­ßZ+Wïke/ÜS½1A *Òýµ»É–ë•oè>Ó˜i€õ„–ý}Ó#÷¤îžïÀeÆu@eWu™äƬ²ÓU­N~'u÷¦.bSQ¦vÿ2Êi&ôí‹¤î‰ÆÌÁGî ¡;•uwHeƒ®ªèzîéª*7× ºÃP¤b~Awxù«-ÑÝ¡E¼ëë3ÏïºÁÝ¡E´¸õIË[£¼[¹~߬€îÐ"RwÿIRî—Î>KÝ¡+œîËÁõ”îÔîð<ݽ§¡;¼јQè/Çׯ ¼t‡@wt‡@wy©€â"€ ; ºC‹Ìó±[Ðv†Ewh“c÷[þ ½NGwh÷ ·à ‡âá(î·y$\:¼ Ý¡MÌÓ;ÍsSfû€ Y¹§!ÙßBùDøå¡q3µ;4ŠxÞ‘}¡yœQÜ=äÑ=ÎoúëÝ¡M¼'bÏ3”Ϻ‹uŸn+bCwh“àpÄ‘îþ³çP÷ïx3Ð*^cF<â3| ¿Ýæ|x#]U30ècî0èî0èî0èî0èéž}Ï@÷LæUÛ†„î:’ Ð6“Ö?ÍMAwèŽÉ>·Æ|Ö' ›WSÚñ¶’O´©˜p€ãL¾ÒâKëÀs$µ;ôÇ·«*$VâuÄÉt‡~qºÛ¦Ê2!;ƒîГl°d3ß ±î}aDÊ×µ&ºªJÖû¶;[)Ñçà¬* ºÃ@ ; ºÃ@¼\wï °ébÛÏ2Þ »ð~Ù获ëþýhñ{Ô:ý£à% ¦»«×Ýx÷Ã…7‡aå!YeNJp¾¡[ÆÐ}WŽY¥vÍ?¼ÙÌlZ~4U~¯¼]÷@teÛëZTê:ÞêîNÆ¥<Ð o×=ùmšïéÆLRw1Ýûe0ÝuB÷°«ë®Ñý%Œ¡»8éIˆßîVû[Ä=òrÝ$èñnÝÿù§v F¤áRGw¸›Ú-vt‡Ûi×wt‡ûiÖwt‡´ê;ºC õýíºC=j¯ý襨½ö¼]÷Ú)•6mGw(A£¶£; UÛÑî§YÛÑn§]ÛÑn§áR·î/×}þ°9Y $æ GÝ•.¨ÃÛuÿ95"1Ý;gÝgõ­§¿µõßÏNý~–ª|!—9½y·vÐ>o×Ý(®f§¯ðÝÔàþÇûóR»÷ÎÛu¾ÝW‡­Î®ŽWvSó¢{»3³Äó¢{ï ­»?&Õ˜‰uÇøžHwÙUbŒñ{¾ãyM[zååºHÐÝa ÐÝa ÐÝa ÐÝa Ð"£{ü®t€þ™ÌC~ëÎÝ1-¯¤‹Æ£;¼Pw-ß®h^"­í˵|k#ÂCgLÒÞEëUíõKë`š ‚ìГoÚµf»wçj©»·E ;tÇä[k‡œóJVënÝ¡?º'3‰?bè„@wÙÕ¢«ªâ!ŽÍCwpVâ îÿs”I@ANë^&9%9Ú˜Aw蘳ºIÌ@èõóýM§ÿ)wUÑýäa\©>å¤î%’2ÚüÓèþ ÇD¢ûHÙÑý1н‹âîz¥º©†§™°ý<ݩ۟ÝëàëŽïqæ"l¿N ;¾?ºÃ@p‰ º?—ÙÕÝÛëîσîÕ@÷çÁöj\ÐÝ;~ƉÁ {-®èÎE}'ÁöZ\ªÝ¹¨ï$è^‰ëºsQßqн—Ûîœ?¶×Ý«€îu¸Mw®b=¶Wá&Ý9yt¯Â§™ðZ‡³ª0çtç¢>è’«ºßœ€’œlÌ ;ôÈEÝïM @YÎvUÑ:äšî·& 4§D¢;ôºÃ@œ?Í„íÐèqá"l‡Þ@w.ƒ@wt‡@wˆÿ¬÷Óܨ•;IEND®B`‚Bio-Graphics-2.39/t/data/t3/version7.png000444001750001750 1057712366325116 20055 0ustar00lsteinlstein000000000000‰PNG  IHDRî)å³Ù@PLTEÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõKѧgúIDATxœí[–¤*Eq­€“¨O†×S©©ôÇÜ­R¦™>Ü»;MEžÁÁ"ÑxÃ0\˜Ö^/Ö4Ü¡+~ETÒä°›¼Ê\“ï¶Ó÷ïvpGCp’pY/Ê1|ü¹AF2ä’5¥¨¶‘•‹oòýæWrá>ŽôÍA;¾ýµK6/ë·&€˜‚Ü}ëŽdƒ,ÒÈ"1†fyq”^TdQ,ú\îÒCëðÅÖ=ì¸#Õ ‘:ŽÃe½ˆs:2+7ë³t§AððºñÌ: ‰™Xpuff¯ÙkÇ“I(8Ó™]¬ 9]Ÿ&rê®M!²È‹jÏeÇÇ©Î$ád^ò©lå¥n*5¥´àP…JM)-8ÀVìÓ÷²o—}·èˆEÞvÞÌN6lzb–û²w+ܺÂI<ȜΠt‹:r‡®Aîð â¡*r‡Ž‘"ÍÜŸœÜCI€[ó=¡OLꤨ³i}Ú%9üöˆãÔÃ{Q¥!´Û»Q¦Ù<‹bNI쿾Õñir?/ê\ZŸ¤ö}E§¼‰ü}ÇYÝžyU&„Ž%Id=Êï4›gñ]*Ài‰!w ¹#÷Ã’Bî¹gDî;ÓBîÈ=Ÿ˜ïè£C91êLZ¥vI}õ†ãÔÃ{QåBh·÷¢Ìeó,hÝH‹ÖÖ=Ÿr÷Á;r?,)än{6Aä¾3-äŽÜó‰!w ¹÷-÷ }|bR'EM‹IßL"€ˆßyÄ»2 câW="vè˜è%¦ÈzfP¯sDîÐ5ñ;¯‘;t r‡ÁPDô"xäÐî­Lâ-MêUMáMNÞorzÿ–rñî7iGk"Ëj#[ç–¯ù.¹µ³=•vE`Õ—~¥Y^ /]Ú,emô«=­2±/.—V.È-­ùÞó8æÏ2¹%•ÖðïYµ&)ˆ»¼­ª€é»Õ뺱•å«>·²kðã:¸7½®žôâÙ•É ©´(WFw#õŽªÉO[ÿ6/îZH+{q{Uy%rõa#ÁÉ+$•û'B|7•E°”Q4"JíËwÛÒ#X#µ²lé—7Ûšœ‚lÜ;F7ÝÃZ÷“S©ËÔÄÄ—´1Êι›l{%­Ije)qÙ„—äîƒ{Ç3ä~A*•q% w-¡mk2ÃT›«X%µ²lÝ?Ò¬ÚÊIpÝÿ±!øžê¹&•êø‰ž‹Z"×±™7-´*‘•¹HkÊ{hb帒ÂÖêç®ê¹&•ª´˜çöØiåk*©{)´y…¶ÆN+_SIO‰O[|.{Öîú¤-‘ú0ï¦òiVßIæ¼4ʉÿý{šÜÏ‹º5~Lñw‡5æà)6ñaµß÷äþiÀ÷°¤±–x±íØ rwœ%wikç¢=,Q6}ò1Ÿ ‹ºro/êÖ uÏ$SEî–¾ûù,íÚÎà)©úîÐn&„õ?ÙJ†BaAFwø™:6|Ùä|44¾*sÇc£­ÕÓ'lvºAÖ|2ó×ôñý /në..V̆“þ›¾¬!FÖ¿1AÓrfd?Ü›pŵb?ÙŠÂÅ·9hYÿ&môŒI>Æ4¬'hqìÕÿ®L†>ÐõŸ4z6ôã»PÁJîùZÚ$÷«Õ~g¹0ˆAî+>FîÅ?>¯˜\—çJl¶0'Mkpy8hÄž–îƒâfãô{qÎóA6çlåt&è'EO}ä'"’á²%{•~ÕIÐ%ãów휜À¸|"§Œ/x‹"Æ.kýçŽ/ãK Û r7SS?k¤nžc\þÍEœ 7éÞ7˾ .Á'T$?”ž]ÆÇݱ’»‘ é)wYÐÅ%\ùÉtàZòå×õm˧cÔèu&w)t¯ô©œ¡±ÜûÇ4Å,wµ‚˜K/ù¢ÑÙ%ppW1ü2Š/WçýÉ}ås›²ÜiÜk³È}¬Y¶ÖšÐî[ã'Ê%Ša"’{­»+T“¯È}¤3s–?hùýÃÖ “rWºèP”0•CÕùTpYÄÎPµ66»ÍÊ]Ä¥b\ëþ(o[dåžéÌ|²¶]ïÐX7‡”l4TCÏ-CUBôGþ!&@ŸÐ–C[¨ Ç…ÙÄ›æwÇA¿(ñ¿2Ñ?4ÙLíbär×Kë„=[\\¹CS¹ÏOsr§u‡NPrW+I!wèÑ™1È:GËÎ t r‡ÜáA wxÈDôw&@[Œã{¿Éá÷;Ð4ï ¹CÓ„•¯¢%ßÄjaß­‘•÷ïb䢀›â–3t IŒ~ŔфÅaü¾|ꉵÃ]BõK¾¹õ±œÄÚwaU,í_ŽP;ܵDP´À›\ú+•{¼Ü§Œà–D+bE"N䮇³rGïpWTgF¬y¯Kî/€±ìßňÞá1 vxÈà\†¡vÎc”Â3r"/E7çWµ/”›÷‚Ü¡=Õ:I/íøÒžÏ_ËgˆsM>À½Q’›IàRçÚ‘ÖEˆØ¸Öݘür‡Æq-x{"îÔ¹C{ÈK±3ã}%w­ád>ÿÂ@ÔŸÓr÷O.ª@ñN“ékróŸÙÝÿ:ŠâÀ½Xd-öçCk÷d_8´@,÷Ю÷°üOm¼¿3¸ýÅÙðJ+¸%¡ÓÉ}uèÞhÿîpÁ¬üXš|¸%±Ðï¯[Ѩۢ/w×È‹À͈»1¢{cK™¬ÜÅyä7%+ôHîñP5•»Eîвc|GÅ‹>})¶þÁ¥ªZäPÿjçà¹`ûËÁäõÀö—ƒÉëí/“×Û_&¯¶¿L^l9ÿ "µkÿqÔ®ðgS»ö&¯¶¿L^l9˜¼Øþr0y=°ýå`òz`ûËÁäõÀöp"ã/«§ÅA&lìtT¾N`]ŸãªÌYäwf\¶S;=µÖ?Ÿ1>;}æ¦|>ç*ìÚ­ 2£“¸ƒ|…Þ] ®?j+ÂҺí£m$÷EÃ^Ρ7þRa‘;Üš—r.c$ ‹ÜáÖ¬Ë]»ä:3©ÜQ<Ü)Y95ÂÅé{Œ¶iX××xÃ0ÔÎÀñ CVÚ¯åÎíñ«ÚŒr‘;ôH$w×Ö»írz:tGò  %¤z‡ ~¿™å9ç±C{,ªõ’^mßœK¹«+¹C{hÕú£ y#›õp„Ü¡AR¹g:3™/q´B$YÕ“CU“ñlúæKQ;7çò%Þ¼ƒÜ¡s¾P;<ˆ/äÏá µÃƒøBî»±ËgÚÿ¡f^`•/Ô¾›{KéÃýøBî{±îŸEîw¹ïFŠ¹ßœ/Ô¾“Yâ³Èé»ßä¾%wÚö›ó…Ú÷¡åŽÞï rßI$wô~oPû˜f×TÒ˜f‚ivð$˜f‚ivÍ¡(ð—’÷`š]k0ËiL³k f9íyGÁ,§= ÷Æàƒ»`ÞQ[ ÷] ÷¶ˆ'õ!÷÷`ÞQSH¹ó ò}{;df9¡÷7AííÀ,§Ý`¶v`–< f9Áƒ`–< f9Áƒ`–< ¦}Àƒ@îð$˜ö¹Ã“`Ú<äOµCküVrЃW’~2IEND®B`‚Bio-Graphics-2.39/t/data/t3/version15.gif000444001750001750 1315012366325116 20103 0ustar00lsteinlstein000000000000GIF87aî4çÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿÿÿÿîÿÿÿ€ÿ,î4þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–ÀrÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨Á¥m*ýå–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠH ¶È&,zñ‹cYºÆ2š‘*b´Ð×ÈF°§TŒj£ç8”¯”‡ŽxÌ£PìH =úñŠI•&mò õ€’/^êŠ(ÉS}RP)"dK9¢W~ª•²lÕƒPé)úôò–£TK¥ìD›…܆•È´g†Ù)Å O¿ä 3‰éL@AóV’2 *+es0Á”æŸä´©cz/Íü&3³©È@uÓS„ÌåS¬©¦%‘“+ÔþœT}ä *D}Æ”° è.—©ÏpÎ’ž¦Âç=Ê)}Æ œ‚§‚$šN5¡”ºOFó9L~bŠN¦Ú¨C¿P[ô s é8µ™ÒâˆT=•PIÚQuÚ% Ý&=“Íiºª4í¥J9zNž'ª ª^ÌIÓŠæR¥)ꢤúÒd^Ô5T}&A‰ºÕXE•¥åœé¿ÉPõ#_­ç§XÚÔqž³¬Ô1'[™J×µ*®H:&XwJS¡Þu®ØÌ'I“Ôã0ÆKg•f9!ª¢¡¾õŸ0],d%CØ‚–ˆ”‚½,e—zKÍÖʬ‰µ h‘ºŸÑFq•¡í jk²ÚÝ´6µ°þ-‡AÛa`¦¶¶•­@p[Ûðö·ÀnB‚k[âò–%ÆímnŒ;¤aƒ¹µŒs¡«ÛÝ>÷ºÑ­Ét¯ËÝîz»Ãýnq¿ÛÝì¢d»ä5¯tÓÛÜç&÷½ð¯|ç\÷V÷è¥îMòKÞþB׸⥭Ý›[Úî¶À>°‚ñ›`/XÀþ¥¯„'La ³—GÓU/Z2|ßüj8&ü°w?Œ_ñ–xÀ$Iˆ¹›â³¬¸ÅþÁím•«[áî·Â46qü^äöx¹;¾¯‡Lä"ùÈHN²’—ìU\nV8æá¤=™Le>M5¦²|h•XÊ„öT¬±$ãGwºÅf†¨ Q6íþ–ZSo2ÕBR¹ÌÕ¡}rñÐ-Zê´gÎsD²¼“q}yÐÙ󢛉å#OÐ $£;=%"zvL~¡§[ýèiÆù‰2^s”_ýë`»ØÇNö²›ýì<´-µÜÿ¨Jj‡i¢U]T´z]¶q×)Ûâö¶ßÝ't§»<3‘¿G*ðs·ªIå "Ä9ÔF]¼Ü'ÏÇk¡“Ū„N…ؤžf²²uŸáŽùÎkþEŠTQÝ›RÓS~ÑþÌ|T7#ÙÃÚôïÌüëÅy'mf“¢¾®³‹øzr®ÎJ„F6v2:T¹ZúÎø„|ßc›|O/?Í¿çV‘þí{›ž#~J%­ïåÙgµ÷ˆF¿áþhñ+Íå?–¥ÃéÖNŸúí',ð;ÍÙ@×ßüZ'k˜f1UQvU€QfY|%yOâg èTV…i¡ô€mÅxšæ€nkë„jÕA··{H2MWVLØçVõô|XwŠæ$8‚û§V.(gHxÔւަÝKRaƒ&¸}7¸æ|ºçYæ×OæNª”wD„ªG#®G„„€%z6glLXNxkùÑ„x„'È(×¶!'m–‡vo—xc†Òö}fh„mø†z¢EreÆ„#ÖqaF‡>gXjÈZsø‡€(‡L¡„¿AœÕ)þWMЏ‚؈ð䈉HL€Èw“‰XR¨ssh–¨ug6ˆ˜‰‘¨#ÅPЦxЍXŠñÔXY¦ŠtQ x¸‰¡¤‡aŠ·qŠl(ÀŠ¼Ø‹¾hŠfE‡´È¸HNÀ¸R¶XMIgP±‹¿øŒ9èŒÐXŒÈØ‹`xG|ñŒÚøj¼x‹Ð8to‘Š9!ޝHŽ~¡Šj&Úø‹ÞèŠC²ŽÔ˜€…¨踋¦•‰!‹¡Ž°8޶ˆ‡!ÁðYFˆíDÀ¨WÇH'ÉØr2E{"8Ý|ÙÔV¾Øe]89‘‚ÕþÈŽ ²Vâ(J’'™ûؑ֒°x|ÿÑþ‘´äÍèŠöH‰£˜‚ÈwÉX‘ýXG,9RÖ‡…¨J¸¨6iM ItùØ” ©”Ûx‘Ré‘LyJç•IéNé“T¹}%IŽ%éZYŒê„þ!“x"a“/)~Dyt£Èí’Aá•géŽÃ‹!)F ¹µG‰å•]¢—Àˆ–Ï”‘Tè\±—Íx˜h¹"B™è(–Vé“⡘I™ü“™‹)y‹}€Ñ“–©{ÉŽ¹èw.ùÇHÿZIgYJ똖ºÙ’ùè’A Mc‰™VY‡a©šæHœGÙv­ù’¼¹“– —ÉZÈ™‘ÕÍþiH‡ÉIK¹Á˜›œ±›ÞŽÜ©ä™šùyœ•™œ^I˜Íy—¡¹–£©‹ÔIv©œè¸GÛYœ³äÒžçI“f©•:³I›éYx’‰×é˜ïùí¹”céQž¹› ¹‚ü!ˆ´ŸiÑŸJŠ˜ÝÙ ßYž Š¢Ê î£É™Êžú §_š•2ª¥è) Lq£]Ÿþ"Y¡Gy¡€ù“¡§Ü™–KŠºØIrH|8©Š ‘H‹Ð)ž4‰©SªÂ‰…'ªj'ŠŽø#–¨‰Ø¸¨¦Z©¯ ‡²:«´Z«¶z«¸š«ºjP·YU0i”B)dEåò?A<» xh¬Š‚¿)£-^d,ÚÈš¬/{¸ç|ËÆzž'µz«­õÂ-ÔêDÁ’®´Ã14”2#„,éZ¬ë¯ìJ;ÕŠ­×zÐw}‚…eÃiÑ÷MäÊ,몮L¤®[°õ:¯ìj®õº®ÒZ¬;±øêª ¥ˆ‰†x~øiK¯ïê+ÛD+±öZ/å*²Öò° ëþ®[x"ˆjÑäXÆç…ÂG-(± {° KC9K±÷0&»³@û²a³:ø‚¾ƒŠ7ƒÿ’³çš°Jd²Q»°:û³?[²>;´F‹§>Å…R8·V„XÙ~Yh­%3²Òʳk»°Â*¯Ë1ß²[B]KcXI×z·92—Žd·|¸‚;¢øxs«Êª¯ ªƒ+pœ©I¡Œ ¦¸¸ÿÖ¸Hi‘- œ’;”ëoœé{›ž‘»¹»oŸë¡ë‘£+¹¥Ko‹ºW*º›”­Ën¯k§±«º³Ë’µ+n·Ë§â¹»Û‘½Ûm¿›¥ó ¼Ã«ÅËmÇ;ŸÂ»¼ðؼÕö¼©þkŽ« Ô[ƒ¤ê轉+ªÛ;¾ä[¾æ{¾è›¾ê»¾ìK²5d?íKq{›óû+ñ«i% ·«¿'Ë¿çZ°Ñ:·+À {µ÷«dòÚ¶ûkÀ#Û² ¯ L±ÌÀö*²õ{À'ŵíêÀ'«³ñª²jK´rû¿ü®‹ÁI¦ÁZ«À,Â<±R Ã2,´'ŒÂG¦Â[Û³ì ÜÂPëÀ+s¯6,dÜ¿2\Ám뮋°q›ÃT+Ä1<IJzÁRütT\ÅXœÅZ¼Å\ÜÅ^üÅ`Æb<Æd\Æf|ÆhœÆj¼ÆllQmìpy—§½ê”o|_M7ˆWéulÇHçJ©ôÇþU÷F§b©{|H]×GÈQut\È|ÌÈM9’2u1çÈD†*ª×ròAÉylÉGÅq™œÈ"ÉŒ,tžœZ‹ñ…œ‡""·OXyʰ˲<Ë´\˶|ËnY{g«TÇAVD™e¸lÈ Ø¯6’‰–·ËÌŒdg)°£çƒâZ˜cKhÊ,GÛÌ¥lz—ja•±[Íg~–E½æ¡âܯîàÌF˜ÌõL†U®Ä×ó||¹f{SøÏ ½Ð ݼ9­ûн+Ñ¥ûÐÑ]Ñݹ­Ñ½¸íÑýÑMÒ|kÑ(þÒ*½Ò,ÝÒ.ýÒ0Ó2=Ó4]Ó6}Ó8Ó:½Ó<ÝÓ>ýÓ+ Ò@=ÔD]ÔF}ÔHÔJ½ÔLmÓBíÐ!}Ò&M¹=ÒÕ‹Õ‚[Õ]Òµ«ÕRÝÐb=Öd]Öf}Ök4C¸XëBB¼²h FWœµô[Ãh×_´ŒÄF ×,ë³#Ø3¼× ûÖxýD-4À=Å€}ÄŽ Ä ëÃu{ØÓZ2–½Ã´Ã,<¯pÛÄTKÙX¤×tÂæò |Úž}Ù“ ÚĪÚIlÚªÝÀMÁ¢=ÛMÌÚèêÚíúÚ"´Â|ýÛôÚÖ¿½×¸]ÜÆ}ÜÈÜʽÜÌÝÜÎýÜÐÝÒþ=ÝÔ]ÝÖ}ÝØp~›Ýytš‹~„ÌݰrÇ)âs⽆DG®œt5ÂEç EÉfXØÑG˜¼u6ÞïÍ*bt‡¡¼q°zr•œß›TÂÉœÜÈÎe¾…ô à¢üà žD›ÑÞeVÊ+ÂàøánÜÆÐáþáÆ°á™â .âšDânâ#Žâ)hÛݾ,r¦\³XLâ*GjÅçÏ(\â-žÍöÅ<.ãÃ<Çœâ7>ä*¨ÅFÞã=ÈV`â2ÇÌ4®ä*^åVnt(þáW>IYÞá[NI]þå\ãžüe/®gdnÉ3ŽÌÆf㰌㩦ãm®åoîãw6pA^æH.ç`såuÞäCŠæ^ËR^Îx>ËRþ˜ÿæç ábþèµÜåƒéŒ$é”þHa~é”嚎énÞ镞ç ~H¢>ê…Tê¦HKžê¤>é¬Nê¯îHŒë´^ë¶~븞ëD;Bio-Graphics-2.39/t/data/t3/version14.gif000444001750001750 1310312366325116 20100 0ustar00lsteinlstein000000000000GIF87aî(çÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿÿÿÿîÿÿÿ€ÿ,î(þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–ÀrÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨Á¥m*ýå–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠH ¶È&,zñ‹cYºÆ2š‘*b´Ð×ÈF°§TŒj£ç8”¯”‡ŽxÌ£PìH =úñŠI•&mò õ€’/^êŠ(ÉS}RP)"dK9¢W~ª•²lÕƒPé)úôò–£TK¥ìD›…܆•È´g†Ù)Å O¿ä 3‰éL@AóV’2 *+es0Á”æŸä´©cz/Íü&3³©È@uÓS„ÌåS¬©¦%‘“+ÔþœT}ä *D}Æ”° è.—©ÏpÎ’ž¦Âç=Ê)}Æ œ‚§‚$šN5¡”ºOFó9L~bŠN¦Ú¨C¿P[ô s é8µ™ÒâˆT=•PIÚQuÚ% Ý&=“Íiºª4í¥J9zNž'ª ª^ÌIÓŠæR¥)ꢤúÒd^Ô5T}&A‰ºÕXE•¥åœé¿ÉPõ#_­ç§XÚÔqž³¬Ô1'[™J×µ*®H:&XwJS¡Þu®ØÌ'I“Ôã0ÆKg•f9!ª¢¡¾õŸ0],d%CØ‚–ˆ”‚½,e—zKÍÖʬ‰µ h‘ºŸÑFq•¡í jk²ÚÝ´6µ°þ-‡AÛa`¦¶¶•­@p[Ûðö·ÀnB‚k[âò–%ÆímnŒ;¤aƒ¹µŒs¡«ÛÝ>÷ºÑ­Ét¯ËÝîz»Ãýnq¿ÛÝì¢d»ä5¯tÓÛÜç&÷½ð¯|ç\÷V÷è¥îMòKÞþB׸⥭Ý›[Úî¶À>°‚ñ›`/XÀþ¥¯„'La ³—GÓU/Z2|ßüj8&ü°w?Œ_ñ–xÀ$Iˆ¹›â³¬¸ÅþÁím•«[áî·Â46qü^äöx¹;¾¯‡Lä"ùÈHN²’—ìU\nV8æá¤=™Le>M5¦²|h•XÊ„öT¬±$ãGwºÅf†¨ Q6íþ–ZSo2ÕBR¹ÌÕ¡}rñÐ-Zê´gÎsD²¼“q}yÐÙ󢛉å#OÐ $£;=%"zvL~¡§[ýèiÆù‰2^s”_ýë`»ØÇNö²›ýì<´-µÜÿ¨Jj‡i¢U]T´z]¶q×)Ûâö¶ßÝ't§»<3‘¿G*ðs·ªIå "Ä9ÔF]¼Ü'ÏÇk¡“Ū„N…ؤžf²²uŸáŽùÎkþEŠTQÝ›RÓS~ÑþÌ|T7#ÙÃÚôïÌüëÅy'mf“¢¾®³‹øzr®ÎJ„F6v2:T¹ZúÎø„|ßc›|O/?Í¿çV‘þí{›ž#~J%­ïåÙgµ÷ˆF¿áþhñ+Íå?–¥ÃéÖNŸúí',ð;ÍÙ@×ßüZ'k˜f1UQvU€QfY|%yOâg èTV…i¡ô€mÅxšæ€nkë„jÕA··{H2MWVLØçVõô|XwŠæ$8‚û§V.(gHxÔւަÝKRaƒ&¸}7¸æ|ºçYæ×OæNª”wD„ªG#®G„„€%z6glLXNxkùÑ„x„'È(×¶!'m–‡vo—xc†Òö}fh„mø†z¢EreÆ„#ÖqaF‡>gXjÈZsø‡€(‡L¡„¿Aœ5Rþz¨ Õ¤xâˆs¨(Ž(ˆø‡|7‘èˆ%E‰—h—xs¬7ˆˆ:G$ÅPЦxЍXŠñÔXY¦ŠtQ xøˆ¡”ˆLŠ·qŠl(ÀŠ¼Ø‹¾hŠfE‡´¨¸HNÀh¶¨IgP±‹¿øŒ9èŒÐXŒ+å‹`xG|ñŒÚøj¼x‹Ð8to‘ŠÒxŒ¯(Žr¡Šj6ŽÚhåèŠC²ŽÔ˜€…HŒ°˜°"²’8ê¨∇!¡ŽðYFˆíDèx'ÇXNÉ8-G{"8Ý|ÙÔVìè†yŽiŽ‚Õöøñ޶ø!i‹m‹£U‘YãèXÒþ‘´äÍ芻X·r9ÉÉÈ’¹Ø,Ù’™uA‹/©W éN )SksÙŽB‰lëø’f–‘D§‘AIw噕îxM\Y’ Y‘ñ^!”æH•Çç2‰gøÈ6yø“Q±a¹¿H—…‡–SYY{Hñx’¦ÔLYMJØ|YÏ4•ÅRAyhüh‰©˜}Ö•Û("P©ŠI–i–á•Z©–kÉ2 x—Àѓ—©“™—zYˆ¢)˜§’a„‘˜¥Ä˜À¸›½ˆrþ¨›Ša™"Y‰â¸™C™™¶Éw¯yGi—l)‘¦É‘·83A˜^›µþØœÉ ñ؎д”·ŒÂI¼éŽæù›šÅ™ž¬ÙžÆtœc™œ9xÍéèY†¹Ñ–‰š”ÖhQÁÝ9Kß)áù4y–|ÉIç)—îé‘{YžœAœyù#òy‘ô ’[qŸP „Ñ9êŒÕùŸï¹œ{D êäx— Ú¢ãÉ hé Û¨ ¹¢a1™`h¡VÉœb©¡Ú ÅžÛø¡£Ùü‰Hþ™ª’FA¤Q‰$ £$I¥Á!£Q¡Öh£w‰£Û٠٘Eú™JŽœé¢¦¥*š;’¤hµ¤hѤ”ù¤**ž £š\ú™ä ¦Zú›{ú˜ë©£þaŠ—ðÉ“?j¦êljÊŽlª#¡¨—wøŸׇ~©¡˜Wp´ZÐy¥Á©SªÐ$Šu)ªö÷ˆ›È§‘臥¦z‡– ‡²:«´ F%”BVT.ÿ#ÄS«S’2ÚâEÆ‚« Ñ«¾ 'ÀZ/Ü2¬N,ÎJ;CC)3BÈ⬺º.Õ­´C¬ÇZªCzSƒWÉÊ,Ðú¬Lô¬æZ®ÚŠ­Ñº¬Ú ­Áª«ð:¯ÝºžŽ®m'€Q­Ôê+èÚDò*¯ÛZ/Êê¯Öò®é:­õŠV¥wk³‡zxÆ…Ÿ×y¡wmì¯êz®íJC¬ïê±%ƒ°óz± k¯­}×'XX6|þ}7u±Ìš®J$°1»®Û±! ²æÊ¬ [²E™ý§™hˆç€Ÿ&÷R³=›D»®)ô-ÙZ2P;µðZB>"ˆjÑ“_´vöHÆzµ?˜µ:ø‚¾ƒŠ7ƒ`Ë­br>%±ŸˆXØ…µ&Ym{·“' x{¬±º·~û·WGªž˜ª¯Z¸¸ ¸»æ“Ú±¥ê©œuºŽˆ;pŠ‹”€ú›Áù¸¹瓾ǸCÙ¨˜«¹ÿƹžá¹È‰¹™+ºû¦¸¥[¹Ÿ‹º©«ºìƺ7š¨ó »ð(»ôF»]j»@Š»Ú¨»³Û¸µ‹‹ º+¼âÆ»Ž«™‹¼uª¼ÝƼy¼Àþ ¹Ò[m¤:—„k¸†›½à¾â;¾K6CÐB¾2¶¡¾¿‚¾Ý°× ¬S«°ñ˱ò{¿ã®ó‹³2ë¾kv­Kk­7«®ÿŠ±èŠ¿ôZ®òۮöþËdM›¿<[µ«À[À[° »­Ôú±ü¿\Á=»Àýû¯",²'Ì¿¬iLÁ#ûÂ&²<À;ÁýËB+¬g-<°ÌÁ:+­?,À ÌÃ/ìÃ˾9LvHœÄJÌÄNüÄPÅR<ÅT\ÅV|ÅXœÅZ¼Å\ÜÅWéÅ—w>’šÆkÖtƒøÅiÆUuY˜z+² ¬è—l¼e]×GUÇqÈQu…YÇv|rþx,Sö¡ˆ×Ç~Le¨¢z-'n¬Æ‡LdzŒ "ÈH7u¬d‹ñ…œ‡""·O§tɠʢ<ʤ\ʦ|ÊdR#o¬TÇAV–še¨ŒI_«²6’‰6†úË4Ë3˜ƒq–g[{¸GhºÜHG›‚¤V*y›ja%´ Ŭ~–E½¶‚÷kUÐ|H<(|š÷ËdË|k |Û Hݬ|ßl€…Íø~ålÎNV·Ä´·ü¶ƒü‰¸üÎú¼Ïü,Ê9ºûÏÊ+вûÏÐ]Эº ­Ð ­¹ íÐ ýÐMÑkÐѽÑÝÑýÑ Ò"=Ò$]Ò&}Ò(þÒ*½Ò,ÝÒ.ýÒ Ñ0=Ó4]Ó6}Ó8Ó:½ÓwÜ„Ænù"­¡qªþÌÜy”l†%·TW©âÜÔ}Fb«’̇d…ÜÝtd‰RFÈy\ÉÉmÞk„ÞØíq“¼ÇÚéÞ=´ª\f||Ç®gßþýßWa >àn ^d^ànd >à Žà žrÜIá 'têŒÅ ®rÉœjhHÅ .áåËz«»!~á è–\ìàžâQ˜Å,.â=ÈV^là2Ç˹œÃ6þà<Þã:Þà1îã°ä.äÕEäF®[@¾Í][ßJ¾áÐŒáÆÇnPååá*Øm'^ÌÉLâ·åºŒãÎmAÎå.žã[Væa~æ/Nåú<ËT(p;þÚ%žäv.äD^äwžX;y¾ç©…ä~Îçè‚æ„nPU~ègeèŠNŒÞèÁ¤æîèz>é‹né¡5瘾éœÞéžþé ^E;Bio-Graphics-2.39/t/data/t3/version12.png000444001750001750 1134112366325116 20117 0ustar00lsteinlstein000000000000‰PNG  IHDRî#Z]t@PLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔîÿCz‘„\IDATxœíÛÁ£ª@};5ízöÓn‚Nh¦µ3‰ßh¼Ëe­™äOpIÀë`ºax;ϱ®»1æ¡||–u6À†ÒË¡;´Äð‘hY¤’t8Ë·Ì5ùîýû÷ónÜ7&š$^6ˆš^~ž‘‰˜ÜbíRÒ›Èëî›|ÿöQ.ü„oúÇAOÜýg-•l^Öš"–t÷­gø&dùMÅó’ "D%¥¢çå6=\‡=,·îáƒû¦º!Òã8^6ˆ˜§³±¹ÙK¿4Û CUÝ_hQm,Ü¡ÎÌ4»íXoé¦GgâwD憜®O“9u×&ާ]N'ÎAmœ¦š“Ä“yÉ/`p˜é§7/5¥´àp{N"x©)¥‡«àœèt‡ŽØ¤»ßhàrÞ{r[Æ®g›îÓk:–?Ob§7ÔÇÝç÷iG ˜P ;:3Rz:3P#»[÷ðÝZt‡º@wèˆCCUt‡:Ù½#ÒŠË+ <¡*8ÌîÐè±I÷ñ‹þ~S~nL:»¬K{$‡£G|OìK*¡§íM2Íæ],`'Ûtÿß_Fõý6ÝïK:·¬#KŸÈá7o"cœÕí™÷IebèT’…¬'9¦Ù¼‹q©;A÷ÑÐݯÝÝBÐ=Y ºŸ\º£{~ar¼£¿]ÊIg–uhiäЯÞð= °/©\ =m_’¹lÞ­ûË¢u§uÏ/ Ý}4tG÷k@w·tOˆî'—…îèž_ºûhèÞ¶î_ô÷SK]_ÔMIg—ÅI#'4 ºCG ;tºCG ;tºCG ;tºCG ñ3¸u ´‹{Ðdö|m!uךcÏÇæ Ð:ò©Ùtf qÐ:‚¡*tD´#Ý¡e8ÌîÐèîÐ'tÇaýSšÔù6áIN>ãàÝø§”‹g¿Ézt‡e5'ÑW|–܉µ³})/Kp^÷PÏâ‰|ÖíÖSPýúÑžFU±.—µ¼ [ºzäsÏã”erËR^äîþ9«Æ&q›·Q+àû—Æ}q-ËG}Z_Ë®Ácêè¾êõêI7žS™Ü°”—%8¥»<×Fÿlý1žµìåöVyÏÝÅú0‘pr Iu?"âÞ¥¼,ÁÝE#¢lw'…)*&l#­eÙÒÏO¶µ9ƒLÝOŒ~t/kÝo^ÊeÕÝ$›´µªžs?²è¾‡´–¥â² _ÒÝG÷ïÐý¥\Ʊ¡ª+aøÕn›¦šÜjUÒZ–­ûFV«®å$ºîÿ˜ýÌêyf)WqxÏŒ/‘è¹ø=Q¡%ògÓ[vÕò¬‹¬MùšÔr¼’»Ñ=ÎS«ç™¥\ÂQÝ÷ NÖò3+©&ŽõÝi¦àd-?³’*S“ #éþç/Wgäþ¤kãÏÄÉè)i»`ïRŽfuÏbÎ¥sL÷ÿþ»M÷û’®¿Uñ߉ژ¢§üIBüÑa÷é~4â>þ\´ŒÃºßº;îÒ]Öµ›¢|ZÓ­¯|Ê7hñ®îçûFÒµAëžYÌ+ºÿ¡ï~?s»v2zJ‚¾;@ƒ ;tºCG ;tÄÝ݉?á E}%bøÌeª-âOL3áOz¢¯òám .ÐÝ¿}¶É~„fk>9ÑÝwꇃç»[Îr–×’É“?eø×7k¸¹þ­ NË‹»NõÃ9Ýøœ¼Ë›AØ"¶m¸¹þmÚèY›¼¬-‚SºKÅ%Úú2JÚ@¯ÿ¤ÑufÁaݳW(Nïê‡MÆFPëß¿éËhÒ}Ëe”¾°&-4TN´þÅ€UŒÚäPµ Žï™ÑW(ê½QêbJñÚ!꺨Kg‹¼NõÉK³¡gê\ÿGo¼Qgiáª]ÿœDqLwÎwï›»Oo¿ƒºs5S×ü¹ùâ¥Û8¬û]ÔYÑŸîç#¤\e5vFoºÓwïšÎúîU‚îÐèîÐèîÐèîЃ §ç»sò§«݃ÄÄ<{èI³¥0˜pµ‰ñWÛÎʧóÐjFê.ÿĺ[Zw¨Ÿ!< õƒ‰ú4þªÓ0 ZDënT{.¾ù)´îP7K}wt‡YÔ¡*´‡ÓÝŠÞ:;"¡Q8ÌîÐèîÐÃÂ3¢»µštî^ØÞX8¹­SdÕ ·!^ÏÇÆ;v¿/Ä}…+àîÍeSdÕ;ݼ%ñôì q kùÌ¥yî¼dù,¦ø¦Ææ}î+œK(²ê½îÆé²$^F ´Ú~J”ÂÉL]Ç…{¿tEs«W':3â9yú©Jb&+‹¦ëÓÈ^¢é•ÍU²u·É{6[j®+‡ž®³ñº7îõ²Î^]­{æGÇDsó…©A÷K ÷zÑJçÞª¿D÷hHaü”tÀ¡Ã›P#g¾½o¦é•Í}UjGäNlgåÓtáÊæ¶ª?yTµé®é•Í]UÏIÐó7$QˆÌ†6í Ú¸.¥»úª®qZº_Å•×Òœû“~ìeãädtyèíGÎæ0K9æEùÚTtŸ0%[#&Ÿ^£‹µ´VõÖGšáß5öeÒ5ù eþ]Ïo²Fr«(5çáû÷|˜¤xkÅùŒ>%iNºOñç}Ã*9c”ä~Ä>.fÇ'-¦º¤£yñèMmb+–9öµ­ Y5"SeJ‹ki¹êÝÚýµòn`Ew½ª•¸Ÿ2.èžmx²!ò3§<W¹'ëd§î¹|%“Ü–hfÝÝ®íJæ¯Óg-gþÑëzªÍfu7&³ÒVtW9µ•Yt¡ûœ]K+º› ûÃÎ/éžmÖDË”´î›Úî8¹4†jÝ«rû2ë\÷ÇŽE5ó§îi7&ÓÖ¯énͲîjžÜŠdf׊nü±åÖ]õ½~µîsul¯zÕº?ë{N÷•?wÞ„îû5Ï¥úé 8•öbË•»-ÿ¾»êWµ ¹3!ç‰}™Þ`ìsTØÝ“yK#(“ü>¤Õiu6×-ºgÖÒÖÎÌ£¾gtÿµüïoÑW÷kÇÆÿ8¦+àpš‹už]¹Û2éWµ +ͺœgRËU“YÒ=;[uļÕߣEÙâ,dûîINèždæ·îç[ÊݬUØ4T=FN÷rd¨º)Mß_Ð}œ…ä¶ÿÖç{Þzh—ªn/ºIB¬ë¾±uOÖR-­ûïHê~jëG÷•_©{æ÷k¥Ê‹ê»ÿäAÝOþÔ¡ûJ¯Ó=Û…[©òâö̬ò˜î§ûuè¾Rà«tϯ¥­™G)Y÷ 1è¾Ràkt_<ø¼Råïén~Gú†ºgHíòpш=-ÝâfÓôŸâœç£lÎÙÊìLÔ#EOCäO"XHHÆË–ì×ò_=‰à…e¼ºCG ã8~þNïÍ1ίhR&ôÀ§uÝÿöø»Çr“ålŽ|ßÞXµë2>°õ;Ù ûçÃG!‡sYãüo*äT¼¯ÿÓg;¶aJ /‰-¦nûº ¾ÒÝJ?š@êîTž¦;ÙG+_*$¼Ç¤»ºƒ˜·^ò{ˆ¢¹sä0]¥àúî¡ÉkNw)º7ý[ÒPÌX÷VG21ë> kçwclh÷õg2‹¹jJ”‚õ{fd“פî£(¡{[ÖÆýmæ=üþóE÷ ‹to³uwÅ £òÝG:3`²ïYÝÕÜ鋨T¬kÝ¿HÝ•m  r¨:Í SfÙª¾MV÷Lgfç=Èz9Ì„¾u!•†ªbè¹e¨jC¬Nt§±îŠüNÌ/]è}±|úºCG ;”ˆ:áxálâMçwkÐJĈkAÄ%þ*}¡ÉfÐJDê®o­>™Å›‹ ;TEÐ}Ú¹žÓÖAé®î$…îТ3cÑGëNgšÝ¡#Ð:Ý¡#Ð:Bž*`9‰àèîP"ã¸ïšœaÑÊdßh¿BÏóÑÊ$Üù*ºå›¸[Døìî‘•ïSCw(w;Cw#‰Ñß1e´áö0þ³P>~º‹ÖHë…"nãoùæîåw½ wÅÒáÝ`~¡;”‰ºEPtƒ7yó¯T÷øvŸ"5t‡2‰îˆIœè®o7ƺ§Ó™RQqÏÃø¾ä~—ûªB7ЙŽ@wè t‡Ž@wèt‡Ž@wèt‡Ž@wèt‡ŽHt_|ð@õ ñÓç3º›(Èb@€²Œùin>ºCu þFîåEìÿÌ/MÌ5ù%3h¥Å›1‘çz"­;ÔÇw¨*$¶âù¬Ù/èõt÷]•iF$w:Ý¡:ÙaYìÌ|ƒ¦ºc<Ô…ß)Ÿ_™ªZÙîûáìK™8GU¡#Ð:Ý¡#Ð:¢qÝÕ`7Äö¯iºûÂë$¿@u´®û÷eÄçé«1Éô䳘Йî¡]ÓÇÞ톕»d­;(Áñ†jéC÷I\9e–:totx· ¸hF¾ M~­´®{$ºõýu#u³ÞëÆå:

£×,阬Ëe½#w."Éj˜j !é;xW LúªGÄ“¼Ä¹ÃÈLêuŽÈ†&}ç5r‡Aîp#˜ªÂH^Ü:À¿•I¼¥I½ª)¾É)ÄãMN¯^R.^ý&ÍhMbXmcëÃʽ#_%·£s¶—Ò±¬úÒ¯¢4îò2¤Óf¶E¿ÙÓ* ñÞriäŠÜòÞ‘¯=Os~¯’[JéŽðžUk²–øýÛª˜¿»Ý±›Y¾éÓ#{‡Ÿ¦ÔɃåuïä;Ï®Jn(¥K øFú#iT.?÷þîÝmF⪠:Ëä.ºÃ&‚“{H.÷w„øj)]jÀ5Rx¥v·¤ã¶| VÈ,=½{±­))ȦÉC`rÌý˜w?¸”ÆÌ>&ݧQ†.e;lj;r#K‰K^“{Hû ¥´Æ71¶„¶­)LSm©_`ÜÈÒ»»8ÒªÚÈYr=þ±1ùžÞ9§”ö„&‰‘K8]‘Ø,‹.[ÚÄÈN.Ò˜òš9í£¸´zÀ¹«wÎ)¥-]Vº7vùœ>_ î¢}±ÓÈçôÑ-”pàÙÓ.OÌ‚uìLžñ,Êû¥¼YÓ—Š9®Œ•Òÿý;LîÇeÝ?–øåm¹ÿ+có(¶²ýÅRŽ”û e¬–^u{Aä®l]»;Ù°ñSÉùóªh,÷þ²î ¼{¡˜6r·ŒÝÇ;¶É3žEy¿”7kúR1Ç•ƒà/…°áž-=›ˆ¿™e H¸RÇÆ/›mWrèZ6YZ}ý„-þ„QŸ]ùk¹qo&ˆÛúS‡.ÄŠËádü¾÷kÐÈî7&jZ^9È{3¾½VüΖ¢uéqºFv¿É}ž1ÙǘžEà-ÖƒºÓËdÝý™Ï³q?†–K&ò{¶–¥:²É40ªûÃBßW8’Ü·ÜXZkóVCß$Ý/&¬bÒ&§ªý‹@ß³¥OG©ÛËÄo†dèâ;{^ŒuãÞL¿5‡p«îïy?…ÝÜ­û¹øÖÜíZ\ËíwÆ6»Ó¢ –›÷îÌ å~XÎw²c§ÜNîŒÝïÌÝÆîPdšY¾ÃÚò3Û¶|ºÅ 8Ü­Mj-lCîÐ5BÒò+•»Á»ÃLq¤"×ܘf^Ó€~‰®{Rþ\¬…¼;tNeìŽÜaDjrgª â,F뜈8‡òMåÉãZm¾uSÞïVêSØ8îÅ_媖/?‡x½"¶¾IEk.ˆã×÷ã›çª–wÏ-6êQÕî‰õ>Ä?¼Xlu‰å»˜Ò§Ûöz8®q>w(sUË»zYñÈnÿ<îø±²Ñk‡$‡ýµúG6®}ë®Ì¡²Ú3˜±ñ=yËÓ¡’:ù Þ¹äkÃõó¥š bèÆ]š#-¿×»çËb½ÔVß®ëÑ\6®yۮ͑²ú¸Ü G›l-·¦¹¤qÍ›vq޵ügäžÌ)lÉg:¾-°rcës3C7îÒgùv§€÷íhgèÆ]šËZ~h7tã.ͱT׫™‹“ÊMFÇ.²ÚòX‹uƒØ$#“|—N‡o)?äPIx,SÚøƒcÙ¿ëÎz¤ÐE…T®ó÷~“جy+­ÕL~kèìàgRVægåÌ+šÊŠW«Wëã³–VlÛ¤qÑ»ØJƒý»}}PÁ ±¦VÖ!~»œªT·¼ï\ÓbÄR´ÇRáªó˜Y‘{Éñ”c”7.u°ÞÈ; òšÜKÕÊ‚| ur÷“©˜ŸšqId°RQA &—»µ~“Þ¦f‚ɯzƒÃÄe‘5 =‘tÍßÙZÕNZ‘» r?_ï%{˜òQÊ Ï”y÷M¾;Í.O‘º‚ß,÷պ냼¯–“»ï¶ w=ŒY’hg¯]tRç~“À¿U¹g´R¥•T>™ÜÕ€æ™w¯tÒ&ï~¾ÞKµY‘i¹¿.óRžq‘Ø´lËíyWûlcõÃp5öµ8”5¤Y-öJGƒ¶*w+sS .WʽìYÓÃCV€Ê'-Kï®[ä^è¤r?[ïu{Ô˜FvéÃON8l8:þM»ûíRžËýµ¼E Üã–ž§ÉƒmMî¥Íaìžn[sKU±eUXµµÝ&÷,ás¹ïw”o°b*›¦ªïQ’û‹¼1UÝZCcŒUê©çW2ÕºÜ+SÕtÛJíŸË}uªšÅz&÷l7Y1ù¥¼ûó4§Ê}×îÜWüA¹NV¯˜üZc÷§œ(÷Ç:ä¾ÒàɽÔIÛä~•33«œ&÷Ý;ä¾ÒàɽÜI›ä~ºÚ¯,÷ÌbûJƒ?"÷êŸWL.Çî'c3¶¥9èº_‡MÙóÖ½ÞÚJ Ñ•\ɯü¤>I ÊzSí74x›At²‹^.¿íE0$–ïÖ59€‡û$A…Xpœ"CöúÏ>œîƶ¶ånfW¿h¤m>ÆÃý[š¸4nÖÿòÛ¸ß&†Ä˜ÐŽòT69w™þwSÎJîF*d¤ÜeC]H¸ŠSÁ©”OʯëÛÖ7 ‰ÓLîRèAés;c#S¹9é‰Eî6¿u;œG¹Õ%Žá*‡™‡øò}>žÜ¢}~Q—;ν1Nî‹`[Zk¢ß·&Üi ¶ª$‡…Dî#zwߨ8'_‘ûƒÁL{¬óÍþ÷çžA&å®t1±)q*§ªË¦âÄÎTµ1¶¸,Ê]m]VÄ®b¼w¿È·+Šr/ fÞy´Ýðà¬{CJ6™ªŠ©ç–©ª‰©Æ£|`LðåÐòzd[¹šxËåÝy€ËaŽ VÝÐ"ïCyzóNFëvr×OÖ‰¿lõá"Ⱥ"Ê}9ÛX’;ÞAÉ]=H ¹ÃpˆÁŒAî08Zî f`h;Üä7¹Ã@îp#’?ûsôÅãñÚ-9ܾ]󚀑;tM|ðUòÄ7ñ°ˆøÛ?"«ßçÈ=œpQüÓ ýs$á)Ÿ ~ Éçñ]Žˆ®Šjxâ›<–—x|ä]|(–Ž/ç¨.‹zBPò|7ùä¯\îéÓ>eŽ—$y V"âLîúÙp¢ÜÑ;\5˜%Qª.ίjŸ(·¹C8ÕzI;?îüùòå>SXrù×FIZ,fKë@¼;tбñÞݘò r‡Îñ<Ê=w‚Ü¡?䀥:˜ 1’;ЇÞð2_þOq"¶i¹‡3—LU Žx©Éü5‡…Ïî×c|EuàZ8Y‹ß˪µYxö[ô@*÷è×cxüãÏ>>üolx¥\’8hIäîD‡7:¾ß|2+?——$º ãu+œº­Ær÷N^|.F:ŒÃ[Ìå.¶#w¸(E¡'rO§ª¹Ü-r‡*Aôù‰H± '.åTÕ"w€æüùÓº·ÓŸ6o¦?lÞ L>ؼ˜þ|°y30ýù`óf`úóùíhÝù÷£ußšÖ?°y30ýù`óf`úóÁæÍÀôçƒÍ›éÏ›7ÓŸ6o¦€#yü²ºY¬Ò¦AŸªÀ¬ëó±£°¹Ã•y¸åì§goýóy¤[çÏâÊ"æ’R¥];T4æá%nQ¾BïÞƒëZŠ´xw¸4d™ÈÝi8È9úxv‘¹Ã¥y*wòH’äi‘;\šu¹ëÒ`&—;ЇË"%+' F„x}?’ežÖunÄ4M­«ðy¦©(íçrg‡€þøUmA¹ÈF$‘»÷õ~é6Ï«~M~ô„TïÅs Üæ£ vè§Ú iç´ƒ;—rW{r‡þЪ kQóFºõ¸†Ü¡Cr¹3…/±ôB"Y5’SU“¯qnÆæKѺ6Çò%^½ƒÜap¾P;܈/ä÷á µÃøBî»°î3ÿþ¡e]à)_¨}?—Ò‡kò…Ü÷`ý?‹Ü{¹ïBйwÀjßÁ"ñEäŒÝ;¹ïAÉßÞ_¨ý}´ÜÑûõAî;HäŽÞ¯jß—Ùõ´.³ƒÁevp'¸Ìn—Ùu…:¡À_J^‡Ëìz‚«œvÂev=ÁUN{ảŽà*§½ ÷Žàƒ»áº£~@î»Aîý^Ô‡Ü_‡ëŽºAÊ‘ïÜû!¹Ê ½¿jï®rÚ fë®r‚;ÁUNp#¸Ê îW9Áà*'¸\ö7¹ÃಸÈî—}À@îp'P;ôÆÿ$a" Àö¦²IEND®B`‚Bio-Graphics-2.39/t/data/t3/version3.gif000444001750001750 1277212366325116 20031 0ustar00lsteinlstein000000000000GIF87aî çÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ,î þ; H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–~rÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨ÔÁ¥m*íä–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠH ¶È&,zñ‹cYºÆ2š‘*b´Ð×ÈF°§TŒj£ç8”¯”‡ŽxÌ£PìH =úñŠI•&mò õ€’/^êŠ(ÉS}RP)"dK9¢W~ª•²lÕƒPé)úôò–£TK¥ìD›…܆•È´g†Ù)Å O¿ä 3‰éL@AóV’2 *+es0Á”æŸä´©cz/Íü&3³©È@uÓS„ÌåS¬©¦%‘“+ÔþœT}ä *D}Æ”° è.—©ÏpÎ’ž¦Âç=Ê)}Æ œ‚§‚$šN5¡”ºOFó9L~bŠN¦Ú¨C¿P[ô s é8µ™ÒâˆT=•PIÚQuÚ% Ý&=“Íiºª4í¥J9zNž'ª ª^ÌIÓŠæR¥)ꢤúÒd^Ô5T}&A‰ºÕXE•¥åœé¿ÉPõ#_­ç§XÚÔqž³¬Ô1'[™J×µ*®H:&XwJS¡Þu®ØÌ'I“Ôã0ÆKg•f9!ª¢¡¾õŸ0],d%CØ‚–ˆ”‚½,e—zKÍÖʬ‰µ h‘ºŸÑFq•¡í jk²ÚÝ´6µ°þ-í‰Ú†V‹¦} nwËÛX&’·ÂI p_{àÉiHCn‚\åÊV.ÉîrEÒÜèZ÷ºØ•®z²{›ì^wº©®wÁËÜñ7¹ÃM¯z×ËÞöî½ÏõËwÕâÝúbw¸Ü͉}Ñk£þRè¿"Ì~ÝKà˜ÀæåQsÉ[”Ç—.ó½‰x÷›`ÎpÂÆI†s3aí*˜¸a±Aq«–·¶·ëÅIzucÜ»øÅ0ޱŒgLãR&´§bõ-ƒiÌã+MU­Z­¦[}ÊCZº’³¡<ˆ{<+v‚éÇ ukOmØÙ¨Veòý‰L?õu£œ¼éOwºÅf†¨ æ!£þ–W•ÓšJÉJ5)­¸lf¾ÖÕ¶8^óg [RIµÕ©ÆÄU›»,J¹ÍDÖ³­ÒJN7˵«LÕŽ˜uÉç,OÊñTô–©™Tݸ²Þô,6õ ä»Ö9¦E´¦ɺ¢óÕ›…µ§'»jA«ùŒ;®µ®/µä]1‘¾ög­›ëÓÞ:<½ö‘Ä[l("·Ù@q°²±ÄìC>ÛÄØÎvá;m÷ÏÆŒ´»Mn²$û*T.·º×Íîv»ûÝðŽ·¼çMïzÛûÞøÎ·¾÷-*`×èDþ^‘LùMð²¤1C ÄÏD1tì‚;¼Ä’i'%.ÈE>üâSé´‘¹hè-Ú9Nþ+>ñù”<6@¹Ê‰rp…ËC(ÒÊg^ÇŠ#|áPÃiÎó‘@ŰÖyù©Üó¢ýèHOºÒ—Îô¦;]µçæj¢³LÝ*¥[§uÈÓ,ì«o5ë Ùzu„©j˜†]ëÎÈÎý“g,›!™ÆHÛµòXü_ÔÇkSÔxI›ïŒŒ•ñ_çôçmZyÕZsõ+¥h£)%sÚ¿þÍoßõè9]útžþž©ß}ž×î“nîÓÕR¿ñàÃÜÒåÃÙîNò2ae?Ðé“õõ‡¾•[þoyã§ùÑT>òcz쯅û²eÁlUL'9Ô|•3”Ô@¯ÓÍ„w¿,ÑLú»¿¢v…jùWSüÄ[1M?VL¾weµ·~äwvTâÜD}j•€Ì×Yñ×UÁ&°¤€‚Å€.‚€ÈSæS*e±6yåMš%Y¡D|àA‡‚°¦‚‚“å‚Jƒ·e‚+(xö1ƒ8y:¨dERw§µwO·H¨%Q×DO¸„LÁƒRX…Nè^?‚#ÖÁ}½¥[@G…^¨m$^^÷ÒjâÇG¿wÙ¦(&P-f†p׆kµ[g‡vÇ^ÎqfS¨mG$cˆ‚8ˆ„ˆñÔXþûgˆt1ņ‡;X†[Aˆ·1ˆ`~Pˆ˜˜‰š(ˆfõmßw”HNœ(e’¨ªTJw‰›¸Š°§Š¬Š+¥‰Œr‚걊¶èg®й˜‰$·(…¸‹Œè˜†˜[Àh‹Ã¸ˆ£8$È‹„KµÈˆ9ŒÑ…a1†Õ(‰Ó¨ ÖŒÞèŒ:–…›‘‹_5ŠåTŠóqš‡€ßø‹³wŒ¿‹`%‹Ï8väÑŽî(Xø›ØGkÚȔؙøø‹i€`ÑŽ´ä?§ˆ—¸ØxŽÈ¥•ÈðxùˆKr‡g9‰éNè8péHt¾Ä‘#9'ÈHŽfF 2þ‡¦¢’+YOɸ‘ËxMÂ(‰ùxŒÄÈ‘H“ Ž:ÂŽ"1”i˜‘j7‘ÊhŽý¨^!”ýjhµÎȦ´‹0gLeæ•Oy]‚“œ¨‹ÏDOÈBùsa •¬("mɈ=™Œ;‰?B•Áè’Ìø`¨J ‰5Gºx‹R©uxÉ‹Li†ziË@ZH–¬h-Yމ˜)™“y7y‹ZŒ Y—Y•a‡—"©ˆ{éb§Š“X˜8u‘om‡I—¢Ž®M%™~H“œT™90©vk°¹™¥É“èè“r!‹ò¤™ž¹˜;b”–¨””Á•qɉ®y—³þ™›³d›¿ùÜS©’½y‹D¹œ¼È„ÃÉiœ ˆœòH›>éQÎ9™ÐY”|I]Ô™Ö9Ÿ,·ái&Þ‰š÷xžY8žYž¯øèI›r·žœÑžUi˜ð™“òù˜Ú9œ÷™#Ò‰HûY[ʼnFQŸø˜àù›·Éžú™*–jž *š "Z !œïI‰sÙ‘·iZ$Š–+Ú!ŠVZ\!š˜> Aúš(£miŒ»Iž/º  œé5j¥7z¥Ç©£Éy¡·ö£é¹¡B`ÔÕI&š¿…¢'†9KÁõ‰{¥ib¨‡w*§H‰m:¶…Ã%Ž+v‡wÔ‡þmlVx¨ˆš¨‰UB)dEåò?A<Šª%)£-^d,š’:© Zmל%Q©õÂ-˜êDÁrª´Ã14”2#„,§ú¨ë⪪J;™Ê©–¨„Jªò7¢Ê,©ŠªL„ªÀú«³«ªJª³šª–ú¨ÊÚ¬¶ZuâY÷"Št‚C(y çª­ê+ÂÚDÌʬ´Z/£Ê­Ö’¬ÃʪϪ·÷ecµ€¶g’¸(img¬ËJ¬Áz¬4$®–š¬ûZ2æÚ¬ôš®gÊPÖg}v†ˆRÙ×qqD¯¥:¬J®[¬õª¯þÚ¯ÀZªý*°h%‚~VÖyÞwjS2ݺ±I®ÅšBß"þ«& «°ª¬%ı>á±îDf¨’´©4Û`>xƒ@˜P˜7xöøjEXH3û³bÒ„Lû´Lˆ¤P;µT»„-Æqxê¦vZµø†‘Ú!‹0)¦Jʵ];¦w¶ˆ)JÚŒd{oùyhK—b  mkooëq»£këu[o^‹·¼¶{û}KoÛ )·ƒË·…+o‡+£^ª¸‹‹Œë¸\ ¹ey¥s»•o{†(¸“k‹ oŸ»‘¨‹¹£Kˆ¥ûnq8§)&¨Z«^­[»¶{»¸ûp3-¹»t>›¿û+½ oß ³Ëj¼áмûªÇË1ÈÚ²,‹¯ÃKn1묿þZ©ßJ¬Ù+¬ØÛ«Ík¯×Ë­Á;½2¦²Î«±2»½´J®' ¾ç{®ëÛ²üJ¾Êf¾{¿Û¾õ ¿÷’½{±ÖK¿Áf¿èê¿Úë¾ü¼‹¾+B¢§)"Ãî–rShq…ÃäÖr4²O©ô_ot*1ì×!*ˆs¬!p'b’Hüà ç9“ñá_QÜn¨B‹'‰’U¬ÃY¬{ÑÁÅ RÅ8wsa¼$ÅqÕ*pVÜNlšÆr<Çt\Çv|ÇxœÇ~ôo)(Qå—°þ½¶zœZ~¶€6RYÕyÐ7ÈÏUȈÌpo%²}G„“]ÉÈIl~QÚ×%X'¯îô±…É™$}¡v†¤¶È¦VßÇ~¤œÉ!{jF{eˆjŽåʯ\IÈ®I%€±üg¹LI'yoöljŒf³V´x5ÌÎüÌÐÍ5‘9@¿Ôܺ×L¾ÙܹÛ<¼Ýܸߜ»áÜ·ã|»åܶç\»é̵ÔÜÎîüÎðÏò<Ïô\Ïö|ÏøœÏú¼ÏüÜÏþüÏÐ=Ð]ÐïŒÍÐ ½Ð ÝÐýÐÑÍÏmÍÕ\ºëŒÑÍÍíÍ Î-Î!MÎ#mÎ%Î'­þÎ)-Í,-[»©ŒÁšº´šÚÒ—$Â+Âl.6mIý®«š¯óÓûʲÐkÁ×{¾«ŠÓ= F-¤ÀûÀùбÿú¿ü‹½ÛÔ“DÔÿª¿¾zÀkÔ«Õ[ ÀTíÕ¾Ú¾«³Àh=Áfݳo­¾C×U ¾ ÌÕ¢ÊÔq]E\­ÔøËB¼­ÊûÖë;ª}ØŠ½ØŒÝØŽýØÙ’=Ù”]Ù–}Ù˜ÙdxÄšG6|ÃWÙÙ’ÆBÖR+ÚNÆp$Ä7ÇÇχچ¤qA·ÄDlX:×€°]Hb䧃º¦¼=Å<œÛž-‘Ä_ŒÛ½ÇÄMÛVÆÈÅÉ=GãñhÄ_‰Ï‚ÑÝÚÍõ¼ÝŠFÏÞ­ióÞßÏ37eq\Âæ½r.WUQ Ï4Gj\v>|ÐçQ°§ÈõíÎñ€éÂíÌsŽ yràý ‚úýÞ=7ภàäýàîÌÝá4ÞÎcã}á¾Þ6cé½fÞÒí €ìßM-ß’FßÝfß=-ßùÍÙ£Äâîß îk~â4®â+žÑÃÌà^âqíÈ5o+ÍØ0®áHžä 1áJþ`Þä.–áPîä!>åñUåV.[&žåQÎß\Þå7þåWÎãb~Ra^æÏUäh~Tj¾ænþæp~H;Bio-Graphics-2.39/t/data/t3/version15.png000444001750001750 1146612366325116 20132 0ustar00lsteinlstein000000000000‰PNG  IHDRî4DŽF,UPLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿÿÿÿîÿÿÿ€ÿpÇ/šœIDATxœí ¢£*@ÝÖ_=Øõ»×Õ•(p™Œ³à=§*yˆ€GŽƒPÃðtîcYwkíMéø¬ëh€ ¥ë¡;¼‰á#Q]¤–t8ÊP¶ÌUùîûû÷ómݘ m¶\1H41|ü<+#±¥ÕšZÔ«(ëî«|ÿõQ.ü„±øÇ!ž¸ùÏR,Å´,ÿ4$Ôt÷µg“²‹–ó² "$Š,‰%žWÚõp¶P¯ÝÀ‹š!Òãt¹b1/ŽÌ¤æCÖ~iÖºªq¼R£šT¸]™)hqß1&Ýò]Æ ìĈ,u9]›&ïrÆM›t¹Øå|âÔ¤qFs²ådZÊkXfðC?½y¨*¥‡Ó~ñiÄ햞МfE ;(ÝA«t¿Äã¥ç¨‹ëÚ±¶[R8zÄx`[Tùñ´­QæÉ¼Šj6²N÷ÿüeŒÆ/Óýº¨KëÚ³¶ñŽ~Ó&Ò7¦I]ŸxUa‰8–l%ËQŽy2¯b¬e`#è¾c1tG÷s@w·tÏVˆî×…îè^^™ìïÄc§raÔ…uíZÛ-)ô›7Œç¶EUZ"ž¶-ÊR2¯‚ÚýŒuQ»S»—W†î~1tG÷s@w·tÏVˆî×…îè^^ºûÅÐýݺ‰Ç­uyUE]\Œ\DðJÐî tE ;(ÝAèŠ@wPľóˆGÇÀ{q/š,¾€à]HÝã€×1„÷có†x;ò­Ù4fàå ;(‚®*("9‰îðf8ÍŠ@wPºƒ"Ðq@÷pÖ¿¥)ºÞ&¼Éɇ£¼ÿ–rñî7YŽî¡,ælñêæ‘ï’;°uÖ¯åa ŽëÊY¼‘ϸÚb ªï!~µ§ŠØˆ—ËR®è–oùÞó4æ}‰\³–Ù¥û”#kÜ‹'ýÄéx¼˜a¨Ü·‘–² £ßÙáMæ&ÑÈf‹û¢7O¾óJ䊵<,Á!Ýåµ6ñÏ–Ói°YÊ^no•÷,Ó]l›'÷\÷="n]ËÃÑ]T"‘í0%ZÖ‘—²¬éç7Ûš’A6]ÜOL~tO«Ý/^ËiìÕÝf»´1Q9—~dÑ} y)KÅe^ÓÝ/î'^¡û k9]ºû†_-á¶5…nª-mX$/eY»Ïad±Æ¥œ-n£ð6,~dóܳ–³Ø§»9-$*ÔDþjzãBÂ’Ržu‘¥)C³RN7Rø¶q‹óÐæ¹g-§°WwĽƒƒ¥|ÏFêI…}mwªé8XÊ÷l¤ÎTØÝ˜è]ºÿùËÙ ¹>êÞø3qpñœ<„©غ–½IݲšcñìÓýß/Óýº¨{ãoQü{ 4¦Åsþd!þÄa·é¾wÁmü9i»u¿ tw\¥»,k7%ð©M×~Ê1_ Å³º[íQ÷µ{a5èþ‡¶ûõÌõÚÁÅsò´Ý^ºƒ"Ðî ˆ#º» Šñˆa˜ÛT¡ NÐÝÛøj![„×à¯Ã´áO~]{Tý=]éí¼Þݘp•³¼—L^ü)Ã?žO8YÑe÷u˜ænËþpLwkd½ž|ˇA˜&2 '!«;c‚Óòº÷ænËþpHw©³¸E;¾R.ï@Vw&ÿ7&ûÓD¥·[÷âŠÓw´§Ëeà%ÄÕ]ö/îajÌ‚]Õ·QúÌÚ&ök8‘¨ºó_ñ]ãoÒ݈-ù¤´ìnEÓŠp6Iu':¬â …ìª6RéíÖ}•“4]¢;Å›¼-ûÃζûã醇éS€ýÐK·ÕÝ>ݹÞºd§îÜͤš«ï渌ݺ_ºwÀŸ‹ïÕ» jwØŽ6Ýi»«F™î emw€.AwPºƒ"Ðî tE ;(ÝAèŠl¸ÅÝ‚2Ýtë^)æÓëuÎn®²þæòYù|ºCÏHÝåŸTwCíý3„7]°I›Æ?S LèQ»Û¨>c~ µ;ôM­íŽîðBªºÓU…÷át7¢µÎHx)œfE ;(ÝAèŠ*¯INló¹kx¼c{aæ8å¶L“E?Tžº½œ[Ÿ'kgªNãºÌ5ð°ò¶i²èîV>{z³’xA|£Þ¯Î\Û\VôÇt÷¹–Wg®m®*úƒºôÄ`3’…m:@´r¬Å»ú¬¦qž»_Ù• .Å9·'Cß+­<·ýËɱ•Ù&Ÿ—¤kUÖ}2”b‰ØJDÑ­–ÒRÑ¿øÝ ÿM‰úÀ>OqI~BÙÿ.§7Û"¥M”/5§áû÷x‰Ø,{KÙéL†²8'ݧåý°ˆÍÚHrßc ƒÕäˆèüTw2/í½E»ØB†ç£Ù~ŠMȤÎ3­MCÏqT¶R½èÝÖýµñ.`A÷xSGâ~òXѽXñC”gÎEëËxk†JÑ-‘׈…äæq~«÷I÷Ù›-þuú,¥ÌºÃsñÔ9ît^tÜ#\ÐÝìpSl¦»Ljª»ËÙzµ´ » ºßì|M÷bµ&j¦¬v_Uw§ÑåKDµ{µ(ׯ£ZæqvXŒfþÔ=oÆêú%Ý­ëÍËV7'v)ëÖŸÛ©×îQÛëWí>Çú¢j÷{}/é¾°á§YR÷íš—â í‡|Š»Zærã®K¿o®úMmCê¬ ±¥‹Zƒ©ÏIf+ºgój=(›ý>äÅi«º'»ëÝ [imcæVß ºÿZÿ÷·è«û¹ý ëó °;Îj™7îºDúMmÃF ­°ò2ù´š ¥ÙQ“AÌ[ü=ªÊ–&¡ØvÏRúC÷,1¿u?^Snf¹«ZaUWu%ÝÈž®êª8}{!ѽ²ÈêßúrË;îÚ•ºªë³n³˺¯¬Ý³­ÔKíþ{¡[u?´÷£ûB†ÏÔ½ðûµPäMµÝr£îêÐ}!Ãçé^lÂ-ysGf¹M÷Ãí:t_ÈðYº—·ÒÚÆÌ­´¬û t_Èð9ºWO>/ùsºÛŒß }C]Ó¥vi8©ÇžçnGv‹qú¡$á•EV§lavaÑ=YÏC”/"¨E”\D°yý^DðÀ:ÝAèŠ@wPºC‹”»²ÖDGêÓ󸿣Æqüü¾_Ç8’I…PЉØbêºÑŠúŸÚ}tÿßÇß½8Ý‘_™Ï×1énó'øCÀþ@ÎÓ£¤îŸCîÌØ¥Œó¿)“Sö¾þOÃf6aJ 2ë> kæokM¨÷­ñє$“èn¤¯@êîTž¦;ÙG#?QHx;×Ínø¤Gî I•÷:Ý¥èÞôoNC6SÝßÚ“é[ü.êÍFÄ®b\íþe>2#«¼Wê>Šº¯ºîTîOSÔ½Ð˜ÙøÈ½D÷wÖî.[¡W¾ ûHc¦¤²IWUt=×tUMX*Ö=²â„Ì„¨ìªN³Â”Yvºª=S>ˆùEËi&ôUDýjKºSYÄ Ý¡;äÕ÷¶rñüªÛbÐZÄŠ[Ÿlt—¼ëê÷Íj è-"uŸ$†lõY:è]tŸ®—t§v‡—é=8 ÝáuˆÆŒAwx9±î4fàÕ ;(ÝAèŠ@wP„¼TÀpÀÐî tE ;(Ý¡EÆqÛ-h+â;´É¶û-…žç£;´IxÐ[ò„Cñp”0ì WïcCwh÷ôN÷Ü”Ñ? h4áiH~X(_?=4n¤v‡FÏ;òO8tƒsЇ‡<†‡ÀÅá]`þ ;´IôD¬äy†òYw¹îéÓmElèm’<.‘8Ó=~â˜êþNcZ%j̈G|¦á÷;ÀXïb¤« j 1Š@wкƒ"Ðî tE ;(ÝAèŠ@wPºƒ"Ðî ˆL÷êXºg0þ±“Ým¤ m†éAª‹aÊAкcðOvŸùÝOóÏÂt_É‹g ?˜p€í ±ÒâËÚÄóx"µ;ôÇ·«*$6®v7¦<‚îÐ/AwßT™f$rçSкc –jcæ4×ã¡/üH;ý/½1²«jd½ï»³%`œUE ;(ÝAèŠx¹îÑ`×ÅöŸiºáã(ª#Ðo×ýû±bxµ6›ž ‹Ið”éêõ0= „ðî0¬<$kÜI Î7t‹Ý'qå”Yêм‰Ã»}À-fåÇRå÷ÊÛuOD7¾½nE¥n«á½îád\©Áðv݋߮ù^nÌuóѽ_”én º§]Õ\w‹î/A‡îâ@d$}~ R|‡[]ü°ˆzäåºHÐñnÝÿùçéh¤áRGw8›Ú-vt‡Ói×wt‡óiÖwt‡ hÕwt‡+hÔ÷·ëÏñôÖ/€îpOoýo×ýéh¥MÛÑ® QÛÑ. UÛÑΧYÛÑN§]ÛÑN§áR·îèŠ@wPºƒ"^®ûøaq¶),›N:+]ð o×ýçÜzˆÂ\tïºæ[Ok뿟1ûýLUù(BNKFË.ýT@û¼]w§¸ƒ¾ÂwWƒÇŸè[,KíÞ;o×=ùNtŸö:‡:Þø]E,‹î½£]w1eLÉ—E÷ÞQ­{<¥Ô˜ÉuÇøžQ¤»ì€1Åù=&ßù²®­½òrÝ$èŠ@wPºƒ"Ðî tE ;(ÝAèŠ@wPºƒ"ÐQÑ}~a4À«æ¨§üÖºcøX[0Ýá…¤º»ºÞ}ϳ¿£nLþèˆAÚ;i=«=}'Êy.²Cw ³µ^é¹ÒöÕ¹Ô=Ú#кcˆ­õcÁy#«õ0†îÐÝ ™Â±tB¢»ìŽZÑU5ùÇæ¡;8« ŠØ¨ûÿפàBvë~Mr®dkcÝ¡cöê~IbaçÏw˜Nÿ]lû)ÈøR}¸”º_‘UX÷Ï¢ûl?‰îg eG÷Û@÷g˜×+=›5ì8Í„í'éNÝ~èþ ±îø~{."Àöã$ºãû= ;(‚KÄ@è~;\f÷è~;Øþè~?èþè~?ØþtŽŸqbpèþGt碾`ûSªÝ¹¨o'èþÇu碾í ûCn»s|Øþ èþèþ §éÎU¬›ÀöG8IwDnÝáÄÓLø­ÃYUPÄ>ݹ¨ºä¨î''àJv6fÐzä îç&àZövUÑ:ä˜î§&àjvˆDwètEì?Í„íÐèŠ8p¶Co ;(‚KÄ@èŠ@wPºƒ"þ\¬4KÑSÀÙIEND®B`‚Bio-Graphics-2.39/t/data/t3/version13.png000444001750001750 1136312366325116 20124 0ustar00lsteinlstein000000000000‰PNG  IHDRî(0š„Ì@PLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔîÿCz‘„nIDATxœíÛÁ£ª@};5ízöÓn‚Nh¦µ3‰ßh¼²ÖLò' ¸$àu°Ý0”ÎÀs¬ënŒy(Ÿe ðƒá£ô²GèobøH´,RMºœeÈ[æš|÷þýûy7î› M/DM /?ÏÈDLn±v)i€Mäu÷M¾û(~Â7ýã 'îþ³–J6/ë?MKºûÖ3|“ ²ü¦âù?I‘Š ¢‹RÑór›®Ã–[÷ðÁ}SÝéq/DÌÓ‰ÙØÜlÈ¥_„‡í„¡ªî‚/´¨6îPgf šÝv¬·tÓ£3ñ;"sCN×§I‡œºkÇÓ.§ç 6NSÍIâɼä—°N8ÌôÓ›BM)-8\Æž“ 5¥´àpœ3îЛt÷»mTÎ{OnËÀõlÓ}zMÇòçIìô†öØ¡ûü>íÓZaGgFJOgZdwë¾[‹îÐèqh¨ŠîÐ&»wDZqy…á€'4‡™ #Ð:Ý¡#6é>~ÑßoÊÏIg—u`iäpôˆïi€}I¥1ô´½I¦Ù¼‹Åìd›îÿû˨¾ß¦û}Iç–udiã9üæMäoŒ³º=ó>©L J²õ$Ç4›w1.`'è~ º£û5 »[º' D÷“ËBwtÏ/LŽwô·K¹1é̲-í‘úÕ¾§ö%•‹¡§íK2—Í» u¿bY´î´îù…¡»†îè~ èî‚îÉÑýä²ÐÝó Cw Ýß­ûýýÔR×uSÒÙeqÁÈI¯Ý¡#Ð:Ý¡#Ð:Ý¡#Ð:Ý¡#†ø™GÜ:Þ‹{Ðdö|ïBê®?¼Ž!<›'ÀÛ‘Oͦ3/Ý¡#ªBGD;"ÑÞ ‡™ #Ð:Ý¡#Ð:â„îá8¬J“:ß&<Éɇc¼ÿ”rñì7Yæ$úâê‘Ï’;±v¶/¥°çuõ,žÈgÝnM1Õ íiT[ñàrYË º¥«G>÷êÓúZv ~SG÷U¯WOºñœÊ䆥–à”îò\ý³eôÇxl@Ö²—Û[å=KtëÃDÂÉ-$Õýˆˆ{—RX‚3º‹FDÙîN: STLØFZ˲¥ŸŸlks™8ºŸýè^ֺ߼”Ë8ª»I6ikU=ç~dÑ}i-KÅe¾¤»î'Þ¡ûK¹ŒcCUWÂð«%Ü663L5¹Õ«¤µ,[÷9Œ¬V]ËItÝÿ1!ú™ÕóÌR®âðž_"Ñsñ{¢BKäϦ·.$ì ªåYY›ò74©åx%…w£{œ§VÏ3K¹„£º#ågVRK*ë»ÓL?ÀÉZ~f%5¦'@GÒýÏ_®ÎÈýI·ÆŸ‰“ÑSÒv!ÀÞ¥ÍêžÅœKç˜îÿýw›î÷%ݫ⿵1EOù“„ø£ÃîÓýhÄ}ü¹h‡u¿ twÜ¥»¬k7Eø´¦[_ù”oТ¬îç["éÖ uÏ,¦ˆîè»ßÏÜ®Œž’† ïðBÐ:Ý¡#Ð:âŒîîÄŸp…¢¾1|æ2U¨‚ t÷ïFŸ-d²á5øó0Mø“ž×®š¿ÒÞÁóÝ­ g9ËkÉäÉŸ2|ñrÂõȆ.¹®ÃVwYö‡sº+Ûõè]Þ ÂVQX¸ÙÜYœ–ç½WwYö‡SºKÅ%Úú2JÞlîlúomò²¶ŠFï°îÙ+§wµ¥Ë8ðts—üÆ‹k˜*³ààPuÃe”¾°¦Ší.D5wþM_5þ&Ý­øÑ’wJK®V´5\¡W5wbÀ*vRÈ¡j%Þ‰K³¡k¢®‹ºR¼Ê˲?½ñFé|CaÚ€“`?Í6wÇtç|wh’ƒºs5S×Ü}5ÇmÖý.нþÜ|­ÞmкÃ~zÓ¾{×t¦;ôMg}w€&Awèt‡Ž@wèt‡Ž@wèt‡Ž@wèt‡ŽL¸Å]‚2]të)æYÛêyÎ.®2þâòYùtºCËHÝåŸXwKëí3„']0QŸÆßS LhѺÕž‹o~ ­;´ÍRßÝá…,êÎPÞ‡ÓÝŠÞ:;"á¥p˜ :Ý¡#Ð:Ý¡#†…GˆD7'6éÜ-ØÞX8¹­SeÕ wÝ^ÏÇÆÔ—â¾ÂUp³òº©²êîFÞ{z²’x@|¢Þ¤Õiu6×-ºgÖÒÖÎÌ£¾gtÿµüïoÑW÷kÇÆÿ8¦+àpš‹už]¹Û2éWµ +ͺœgRËU“YÒ=;[uļÕߣEÙâ,dûîINèždæ·îç[ÊݬUØ4T=FN÷rd¨º)Mß_Ð}œ…ä¶ÿÖç{Þzh—ªn/ºIB¬ë¾±uOÖR+­ûïHê~jëG÷•_©{æ÷k¥Ê«ê»ÿäAÝOþÔ¡ûJ¯Ó=Û…[©òêö̬ò˜î§ûuè¾Rà«tϯ¥­™G©Y÷ 1è¾Ràkt_<ø¼Rååt7 ¿#}CÝ3¤vy¸hÄž–î@q³iúOqÎóQ6çlev&ê‘¢§!ò',$$ãeKökùEO"(°L€B ;tÄ0Žãçïôþ:ÆùMÊ„‚ø´î£ûÿ>þnÅñ†üÊrÂ6‚îŸ5>†”ÍÓ…Œó¿©Sñ¾þOŸíüÙ†)!$$?”5Ví©ãþNVén¥¯@êîTž¦;ÙG+_*$”#[LÝöuAý!jò^§»Ý›þ-i(f¬û[G2 1é®n˜gÄÆüÑhî9LW)ø=3²É{¥î£(¡{[ÖÆ½4³î“°v~7ƆvßX⾘«¦D)ØD÷w¶î®XaT¾¢ûHg¦æZþóE·Ü“º++ÞA(L€Ê¡ê4+L™eg¨Z“}Ïê®æN_Ħb]ëþ¥—ÃLèÛYÝ3™·ÜëBwëæÊFCU1ôÜ2Tµ!V'ºCWäwb~AwxËg[¢;tºC¨óëNžßt9ƒÝ¡FŒ¸ôI\@å/ªÒ×UmÝ¡F¤îúNRá“Y¼—ºCSݧë9ÝiÝá%(ÝÕÓÐ^‡èÌXt‡—£u§3¯Ý¡#Ð:Ý¡#Ð:Bž*`9‰àèîP#ã¸ï´aÑêdßõ–¿BÏóÑê$Üè-ºÃ¡¸9Jøìn —ïSCw¨w÷Nwß”Ñß h´ánHþ³P>~ºiÜHë•"îwäïpènç7y 7ÓáÝ`~¡;Ô‰º#Vt?Cy¯»T÷øî¶"5t‡:‰nIœè®ï…8ƺ§Ó™ZQq‹Ïø6ü~—ûªB7ЙŽ@wè t‡Ž@wèt‡Ž@wèt‡Ž@wèt‡Ž@wèˆD÷Åç|4ÏàµíÈèn¢ ‹êf0æ§¹ù èÍ1øûÖ¸—ò¶ÿ3¿L41×äÔÌ •oÆDžë‰´îÐß¡ªØŠÇg¿ ;´KÐÝwU¦‘Üét‡æd‡e±3ó šêŽñÐ~G¤|\kf¨je»ï‡³…2 p ŽªBG ;tºCG ;tÄËuWG€ÝÛ¿¦éî{¯“XüÍñvÝ¿/#>O_I¦'ŸÅ$x éÚõ0=|áÝnX¹KÖºƒoh–>tŸÄ•Sf©C÷F‡wÛ€‹fäËÐä·ÊÛuD·¾¿nD£nÃ{ÝÃÁ¸\‡áíºgß]÷=ß™Éê.æ£{»t¦»ÉèUSÝ º¿„>t;"•ôéŽHñ.uñŸE Ð"/×@‚îÐïÖýŸJç G*®ut‡«ù§ÞjGw¸œz}Gw¸žj}Gw¸Z}Gw¸ƒJ}»îPŽÒk?ºÃ]”^ûÞ®{éôJ¶£;ÜA¥¶£;Ü@­¶£;\Oµ¶£;\N½¶£;\NŵþnÝ/×}ü°:[|ÉÄ']•/(ÃÛuÿ9w9Df.º7NºöÛN[뿯1žû}MMù(BN1UܵŸ ¨Ÿ·ëî·cÐWøîZpýRï".­{ë¼]÷è=Ò}vØëÚxë7Ý[§wÝÅ”1Š’ÆE÷ÖéZw=%×™IuÇø–éHw9µbŠó{ŒÞÓ¸®¯­òrÝ$èîÐèîÐèîÐèîÐè± {ú¬t€öÜC#~ëÎÍ1L¤K¦£;¼Xw#Ÿ®è"müÃ|j#ÂCc ÒÞIëYíù͘hž ‚ìЃOÚõf‡gç©»Ú"КcÐÖúoÁy+›õð Ý¡=2ºg:3™?bh„Hw«zòa¨jÓo웇æà¨*tÄNÝë~òÀ:‡u¿';w²·3ƒîÐ0Gu¿%3aæ×÷3ƒþ§Ø=TE÷K»q¥úp+u¿#+]aÜ?ƒî²G$º_”ÝÝË0)ÎW*››n8p˜ Û/@éNÛþè^­;¾?Ä‘“°ý<‘îøþ èÁ)bÐèþ8œfWtl/º?ºÝŸÛ‹qBwµÿŒƒ;@÷RœÑ“ú‚í¥8ÕºsRßAнçu社ý {!N÷Ý9~l/ºÝËp™îœÅº l/ÂEº³#r'è^„ 3á;ÔGU¡#ŽéÎI}Ð$gu¿8;wr°3ƒîÐ"'u¿63÷rt¨ŠîÐ çt¿4+wsxG$ºC{ ;tÄñÃLØÍîÐ'N"Àvh t‡Žà1èt‡Ž@wèt‡Žø?¹yŠ p‹JIEND®B`‚Bio-Graphics-2.39/t/data/t3/version9.png000444001750001750 1125712366325116 20053 0ustar00lsteinlstein000000000000‰PNG  IHDRî ÜÉ¡=PLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ+LŽŒ-IDATxœíY¢£(@ó×kêõôWm‚° WØ•(p/ƒq" œS_TDÀ#Ç—†×Ý øëºc~”Ž÷ºÎøÂë­tÙ#t‡žx½%*‹ô$ÝÎòÊ[æª|7üü}3a¢I–ËQÃÇÏ32“[­-E °‰¼î¾Ê÷ƒ·ráw Œé=q÷ŸµX²iYÿiˆ(éîkÏ0&+d9¦–ó’ "DEÅ¢çåv=\‡=”k÷ðÅ©fˆô8^.DÌÓ‘ÙØÜlÈÒ/ ÂÃvBWU7Á 5ª…;Ô˜™ƒf÷kã} ÝõhÌÀAüÈ\—ÓµiÒ.§nÚÄËi—Ó‰KPÇ©æ$ËÉ´ä×°N8ÍôÕ››ªRjp¸Œ=ÜT•RƒÃUpÍ ºÃ@lÒÝ ´¡S¹=©–0€ëÙ¦ûü™Ïå/“8è í±C÷e8ÓZaGcFJOcZdwíÆ­Ewh t‡8ÔUEwh“Ý"­¸½Âpš‚ÓL0èî0›tŸ>èñJé©uv]Öö“N1žØUº„ž¶7Ê4™µ(f`'Ûtÿç/“¯¦{½¨së:²¶é)ü¤M¤oŠ“º=ñ>ªÌ:–d%ëQNi2k1•2°t?°º£û5 »[ º'+D÷“ëBwtϯLöwôØ¥TŒ:³®CkûI ýæ ãi€}Qå–ÐÓöE™Kf-¨Ý¯Xµ;µ{~eèîCwt¿tw+A÷d…è~r]èŽîù•¡»_ ÝûÖýƒ?µÖõUUŠ:».."˜¸ˆ KÐÝa ÐÝa ÐÝa Ðâ¿óˆGÇ@¿¸Mf_ÀÐRwý ;^áýؼ¡zG¾5›Æ tºÃ@ÐU…ˆD¢;ô §™` ÐÝa Ðâ„îá<¬K“ºÞ&¼Éɇ£¼ÿ–rñî7YŽî¡,ædñâæ‘ï’;±u¶¯åf ÎëÊY¼‘ϺÚb ªA¿ÚÓ¨"¶âÅå²” º¥›G¾÷<ŽùX"·¬åFéîß³jl’·{µ>©Üw—²|Õ§õ¥ì*üxI½¸/z½yÒçT"7¬åf Né.¯µÑ?[F§Ád){¹½UÞ³Dw±=L$œÜCR݈¸w-7KpFwQ‰(ÛÝEgaŠZ¶‘–²¬é—7ÛÚœA&^ÜOŒ~t/«Ý+¯å2Žên’]ÚZUιYtßCZÊRqY…—t÷‹û‰5tÿÁZ.ãXWÕå0üj ·ÍtSMn³À*i)ËÚ} #‹U—r²¸nÿ˜°ø™Íó›µ\Åá#3>G¢åâD…šÈ_Mo]HØATÊ‹.²4åohRÊñF C£[œ§6ÏoÖr GuGÜ_p²”³‘ZRáXÛjúœ,åßl¤ÆTà"ˆ£µ{­}šsQsî)(¦DÂì]ËѤîY͹xŽéþçO5ÝëEÝ‹âωҘO1I£ÃîÓýè‚û0­ã°îµ@wG-ÝeY»):€µÛ?ù˜+hq¯îçV{GÔ­AížYÍ-ºÚîõY굓‹§¤!h»tºÃ@ ;Å_º`“ÌO¿J\t‡£ˆ«xˆ´;šò€NÙÝÝ…?Æß¡˜t…·»÷k¸Õ£«à#õy'Ó› t÷C£÷_“ý à¶¶·={‹U¢»½Ý„ƒ×»Û°w«Œqñ§ ÿ~ â¶¶ ¢»ßòXwk×=ɨՙÖá¡æsªî® 7Ð7Zõ§»ÔÙÛßF)—NˆîaVñ».»ª¸“éÍaݳw(ÎCUr舨éâG~¼“éÍÁ®ê†Û(ýOÙ3ök¸–67çñ#3úE}®AÝLùŒý.¤ÙÍyâÖl€Ö8úà l™Ú@Vƒ‹`?¦òåíÕxZíÞh­1£éÎÝLC3žîµh³c°¶;µ;4 mwŽÌÀ@ ; ºÃ@ ; ºÃ@ ; ºÃ@¼Ü ²04Æ=à5žg-Å¡e^îS'ø2fÔ˜Ÿ‡îÐ2Rwù'ÖÝR»Cû¼Lh©X?­oÓwëiøº €Q»UŸ‹1?…ÚÚ¦ÔvGwè¢îtU¡?œîV´Ö9 Âi&t‡@wt‡xîbjÒ¹[¸½c[1sœr[ç‘Eÿ*ôtŒÛ¨˜¹Ûóöpjzuµî™ÍÍg¦Ý/ÉÜíY{:u‹þÝ£.…ñSÒ‡oBŒœy÷±™®3÷lêý©‘g8±Ÿ=Ÿ®3÷lªýɳª]×p]gîÙÔ*z."€X¼!‰Bdv´ùÑÆ°ïj諚Æiî¾eW.¸çÒžô}/G'—§Þ¾¤l SJi4/Jצ¬ûd„)Ù1ùˆô-–ÒZÑ[¿ø¯yý£úÀ>Oº$ß¡ÌëéM¶Hn¥K-iøü=_"&ÉÞZvE:£oIœ³îóò˱a1Jrßc _‹ÉñQ‹©.êh^Ü{S»ØJ†eŠ}iëHCRHÜ@Sq+•‹ÞmÝo¯+ºëM­Ä}ç± {¶âɆÈÏœÓ`\áž,“ºçÒ•Lr{¢Ytw‡´+™¿NŸµ”ùw‘ë©N4›ÕݘÌF[Ñ]¥X”vˆT&5Ò=„6î{v+­èn§{¶Z5SR»oª»ãèÒ%Tí^,Êíë(–¹Îî—‹jæWÝÓfL¦®_ÓÝš²îjžÜ‹dbײnü¹rí®Ú^ßj÷¥8¶ýÃj÷• ¿4Þ„îû5ÏÅÚé8w±ÌåÆÝ–~ß\õ›Ú„Ô™òľLk0ö9ÊlA÷d^©e’߇´8MQ÷hwÝ¢{f+µ¢û·d|~‹>º_Ûß0þÇ1݇ã,–yvãnK¤ßÔFl4—òLl¹b2%ݳ³U“AÌ[ý=*Ê'!ÛvORúE÷$1­èþ}¡M]Õcät?±OéªnŠÓ·t§Ýößú|Ë[ë‘ëªnϺIB¬ë¾±vO¶ºo ÕýÔº¯døJÝ3¿_+EŽî!jµN¶–Ð}%Ã×éžm­9º‡¨Å8Ý5@÷• _¥{~+¡û¤îôƒÑ}%Ã×è^<ù¼Rä÷én¾/ô uéQõûѧ¹;Ýlœþ[œòü"›S¶2;³è‘¬§!ò"’Ëesömý·^DpÃ:nÝa ^Ó4½ÿÎÃO4) Fà]»OîüÝ‹ã¹Ë|vG¾mo–µÅÑA÷÷—·oC§òiLË¿9“sö>þÏßíò݆)!$ÜH$¶˜ºm´ ¾ÒÝJ?º@êîTž§;Ù'+?*$ÜǬ»z‚˜^òGˆ¢¹ËÂaºŠÁµÝC•×îRtoú'§!›±î½ödbÑ}Ö.Ccl¨÷õW2‹¹jJƒõGfd•×¥î“È¡”u§r¿›å¿ÿ~Ñ3È"Ýû¬Ý]¶B¯|E÷‰ÆÌ0ÙaVw5w»Šuµû©»²¢BfBTvUçYaÊ";]Õ»ÉêžiÌì|Ù(§™Ð·-¤²QWUt=·tUmXjÝ©¬‡"óúÃX”/?Cwt‡'¢.8.\M¼éún ºÃ1â^qG‰¿ËDßh²t‡'"u×Ö ßLñá"èMtŸ®çt§v‡NPº«'I¡;t‡hÌXt‡ÎѺӘ®Awt‡@wt‡— X."8ºÃ@ ;<‘iÚwOÎÆ°èÏdß hßB/óÑžIxòUôÈ7ñ´ˆðÝ=#+ÞdžîðLÜã ݃$&ÿĔɆÇÃøïBùLøù)Zµ;<ñÿÈ7÷|,§xxê]x*–ïúËÝᙨGEx“ÿJu÷)bCwx&ѱ"‰ÝõÃá¦X÷Ït3ðTTcF<ó0~.¹ß¦rx#]U30ècî0èî0èî0è‘è^|<@ó¼â×qgt7Qb@€gó2櫹ù èÍñòO6pÿnVÿgù˜hb®Êx2/­´y®'R»C{|ºªBb+^X™Awh— »oªÌ3"¹Ó)èÍñ’ –bcæ4Õã¡-üHùB¿LWÕÊzßwgoJ4À18« î0èî0ë®Î».¶ÿÌÓÝx¯£(Ž@sô®ûçcÄ÷yÔ˜dzò]L‚NL÷P¯‡éáKïÃÊC²Ö”à|C³Œ¡û,®œ²Hš7:¼ÛÜbF~ U~«ô®{$ºõíu#*uS ïu'ãr h„ÞuÏ]ó=ߘÉê.æ£{» ¦»ÉèwUSÝ ºwº‹‘Júô@¤†[]üw´HçºHТoÝÿý÷îŒË#ËÝ¡,{t‡:<²ìÑêðȲGw¨Ã#ËÝ¡,ûÞu‡û¸{ëg@w¨ÅÝ[?Cïºß‚qydÙ£;Ôá‘eîP‡G–=ºCYöèuxdÙ£;Ôá‘eß·îŠÎuŸÞ¬Î#™eãIW¥ î¡wÝ¿Î-‡ÈÌE÷ÆB÷É~êéOmý÷3Ås?Ÿ¹*ŸDÈyIµìÚO<ŸÞuwŠÛ)è+|w5¸þ¨¡X–Ú½uz×=Fº/{Coý®"–E÷Ö]w1eŠI—E÷ÖZw=%טIuÇø–HwÙµbŠó{І鲮­­Ò¹ît‡@wt‡@wt‡@wt‡@wt‡(èž¾+ }^î¡ßug‡€æxͯ¤K¦£;tH¬»‘oWt/‘6þe‹F¾µá¡1^ÒÞYëEíe`L4ÏAvhŽ—oÚõf‡wç©»Ú#К㥭õcÁy+«õ0†îÐÝ3™Ì±4B¤»U-ùÐUµéÇæ¡98« ±S÷g¿y`ú×I@Mö6fÐæ¨îU3fù|¾Óéÿ»»ªè~ ò0®TªrP÷I ãþtÿ!ûD¢ûHÙÑýg û=ÌŠ‡ë•îMÍ08Í„í t§nÿè~Zw|ÿG."ÀöóDºãûo@w.ƒ@÷ŸÃev÷î?Ûïݺߺÿl¿º«ãgœÜºßÅݹ¨ï Ø~§jw.ê;ºßÄyݹ¨o?è~§Ûîœ?¶ßºßºßÃeºsë.°ý.Ò‘;A÷[¸ð4¾ÃÓá¬* Ä1ݹ¨šä¬î' &3è-rR÷kP—£]Ut‡9§û¥I¨Íá‘èíî0ÇO3a;4ºÃ@œ¸ˆÛ¡5ЂKÄ` ÐâÁð ã¹+GIEND®B`‚Bio-Graphics-2.39/t/data/t3/version6.png000444001750001750 1057712366325116 20054 0ustar00lsteinlstein000000000000‰PNG  IHDRî)å³Ù@PLTEÿÿÿÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔI¢úIDATxœíÛ¤*Eñó¦a“Î|MdÒIt‚·[ÎáaYåÁµfÊRäyØ"ØOc† ÓÚëà%Ú¦‘;tůˆÊBº“Üv“W™kòÝvúþÝîhŽC.ëE9†?7ÈH†\²¦5À6²rñM¾ßüJ.Ü‘¾9hÇ·¿ÖbÉæeýÖS»o=ÑlåQY$ÆÐ,/ŽÒ‹Š,ŠEŸË]zhޢغ‡w¤º!RÇq¸¬qNGfbåf}–î4Þ@7žYG!1 î£ÎÌì5{íc2 g:3°‹•!§ëÓ¤CNݵ)DyQí¹ìâø8Õ™$œÌK>u€­¼ÔM¥¦”ªP©)¥ØŠýaú^öí²ï¶±ÈÛΛÙɆ-@OÌr_¶Sãn…@W8‰™Ó™nÑBGîÐ5ÈDMîçEKë“Ô¾¯Èá”7‘¿ï8«Û3ï£Ê„б$‰¬Gùfó,¾K8-1äîƒ!wä~XRÈÝ ÷l‚È}gZȹç“ã}t('FIë£Ô.É¡¯Þpœzx/ª\íö^”¹lž­ûiѺӺçCî>rGî‡%…Ü rÏ&ˆÜw¦…Ü‘{>1äîƒ!÷¾å>¡OLꤨ³i1‰à›Iðñ;xWtLüªGĽĹCÏ êuŽÈº&~ç5r‡ŽAîð ªÂƒˆ^ÜÀ½•I¼¥I½ª)¼ÉÉûãMNoãßR.Þý&íhMdYmdëÜòÕ#ß%·£v¶§Ò®¬úÒ¯¢4Ë ä¥K›¥¬~µ§U&6âÅåÒʹ¥Õ#ß{ÇüY&·¤Òþ=«Ö$q—·U0}·z]W"¶²|Õ§ñVv ~R÷¦×Õ“^<»2¹!•EàÊèn¤ÞQ5ùiëßæÅ] ie/n¯*¯³Dî¢>l$8y…¤rÿDˆï¦Ò¢–2ŠFD©}¹ân[zk¤V–-ýòf[“Sƒ{Çè¦{Xë~r*u™š˜ø’6FÙ9w“m¯¤5I­,%.›ð’Ü}pïx†Ü/H¥2®„á®%´mMf˜jsÕ«¤V–­ûâGšU[9 ®û?6ßS=פR_"ÑsñO¢BKä:6ó¦Å‚V%²ò"iMyM¬WRØZÝãÜU=פR•óÜ;­|M%u/…6¯ÐÖØiåk*é R8ñái‹ÏeOÂÚ]‚´%R¦àáÝT>Íê;Éœ—F9ñÿN“ûyQ·Æ)þí°Æ<Å&>¬öûžÜ? øö‚4Ö/¶{Aä.mí\´‡å!ʦO>ædQWîíEÝ´î™dªÈÝÒw?Ÿ¥]Û<%õAßúÁÍ„°þ'[ÉP(ì1Èè?Sdž/›œ†ÆWeîxl´µzú„ÍîB7ÈšOfþš>~¸7áÅmÝ£ÃÅÅŠÙpÒÓ—5ÄÈú7&hZÎŒìã‡{®¸Vì'[Q¸ø6m#ëߤž1Éǘ†Uà-޽ºãß•É0кþ“Fφ~|*˜gL¤?Ùš·êÆ&Ã@'¨ú÷ý»ÂŽä¾åwe¾°6-44NTÿbÀ*Fmr¨Ú¼ ôO¶ôÓ(õë2±ýu]\mO›®~¸7ÑlÆážTÿ _¦p«&?›‡Íŵü¼ãÑØZ¿´¨ƒåÇ{æyr?-æ™±Yž&wúîæa}wÈ2LÌßþhÞMÎÍ€fYì¾ êÈŸCîÐ4BÒò+–»¡u‡BOE-}šéHwtÚ%4݃jÏÅ‘w¡u‡Æ)ôÝ‘;ôHIî U¡Cœ€Eo‘×ÿMy´Z«MÏnŠûÓLʼn…ã§øëÜÔôùeˆ×ó±qÅîú‚8¯pM¯Þ|75½[“]-U½,Xï\ÜÚÅâìX¾‹)^ÔØÖ×Ãy…s±C›šÞ­Ò-VìvËq‡>E«í]¢vgê(Î,\ýÒÝšSuµ£3cÃ{òæÅ¡¢,¹ô3ï\r îzy©ê‚èºp÷æLÓïlÝÓm6[ê¬+‡v×Ù¨®ˆ W½l7çL]-÷ÌMÇFgó…iAzÑîι¦?DîÑÂz—tÀ¡ýÛP+OÖ~6ÓuáîÍy¦¯ö x×uvwº.ܽ¹«é»náº.ܽ9Íô6áuÊóˆycŽJñ®ú>ª¯–îUqeÀµ8—¬ïŒš8:\þ-âEÎ?¥œFç¢|m*ºÏFpÉZÄæ#Ò5Z´Òšé~9cÔ À—I[ò×—ý»žß¤FrU”†Zò0}ï·ˆMŠ·V\‘Ïh/‰s–û~yX¦¢³V‰ÜwaÃn1;>jáꢎÎÅÝYu‰­XæØ[[G²jEæ Ê˜ŠµT6½«]S¡Ç’5Çœ_ý S ÷·Œ¹gž¬üÉ9Öw§=Þ”{._‰“»í"w7–ÒZÉ|;ù¬åÌ¿‹Z»:¡™¬Ü­ÍTÚŠÜUŽ…µC¤2«‘܃oëö³µ´"wëå~¹Þsæ0ù›”-SÒºoj»ãèÒªu/šr{E›ëâ¾xÒ¢N¾”{ÚÉ´õkr7¶,wuN^E2³kEwom_kÝUßëU뾘c»éEë~¹Þs™Yïi¹¿/ó\œ¡ÿVÀ®¸‹6—•»-ÿ¾»ê«Ú†ÜÙóD}™Þ`¬ç¨°¹'çJ#(›ÜRsڢܣËu‹Ü3µ´Qîë½hŽ"Ó½h’û±ã ëoŽi|gÑæÙÊÝ–I_Õ6Tšq9ÏÄ–3“-É={ZuĹÕûQQlq²}÷$§/äždæµÜ÷·”ïS6G™MCÕÏÈÉ}‡A>ªnŠÓ÷t§Ýö{}¾ç-[ÃüPu{Ñmâc]î[÷¤–ZiÝ_‡¹Tî»®~ä¾Rà#åž¹­˜üV}÷—\(÷·:ä¾Ràãäží­˜üvOfV¹Lî»ûuÈ}¥ÀGÉ=_K›ä~µÚï,÷1È}¥ÀÇȽøÇç“ëò\‰MØæ¤i .ØÓÒ}PÜlœ~/Îy>Èæœ­œÎý¤è©ü$‚BD2\¶d¯Ò¯:‰ºdüaþ®“—Oä”ñÏ`QÄØe­ÿ\ÃñeÜa)a;AîfjêgÔÍÓaŒË¿¹ˆsá&ýÏûfÙ7Á%ø„Šä‡²Ñ³Ëøï¸["Vr7R! å. º¸+?™.\Kþ¡üº¾mùT`Œ½Îä.…î•>•32–{Ÿã˜¦˜å®V³bé%ÿ@4:»î*†_Fñåê¼?¹¢|nS–;{m¹Ï‚5ËÖZÚ}küÄ}qV¹D1LDrï±uw… cò¹tfnÀò-¿ØdRîJ=Š r¨:Ÿ .‹ØªÖÆf·Y¹«³ó¸TŒkÝòm‹¬Ü3™OÖ¶ëëæ’†ªbè¹e¨jB(€þÈ?ÄèÚrh 5á¸0›xÓüî8Àý°â· â%þW&ú‡&›©],€Rîzi°g‹‹‹ whŠ ÷ùicNî´îÐ Jîj%)äÝ!:3¹Cçh¹Ó™®Aîð ;<ä¹ÃƒˆþîÏ$h‹q|ï79ü~šæ=#whš°òU´ä›X-"ì»5²òþ]Œ\pSÜr†n!‰Ñ¯˜2š°8Œß’Oý/1¢v¸+B¨~É7·>–“xXó.¬Š¥ýË1j‡Û¢–Šx“K¥r—û”1Ü’hE¬HĉÜõâpcVîèîŠê̈5ãuÉý0–ý»Ñ;<ĹœË0ÔÎÀy ƒRxFîCä¥èàæüªö…ró^;´Ç¢Z'é¥_Úóùkù ‘c®É¸7JÒb3 \ê\;ÒºC£׺“?@îÐ8®rOĺ whÙa)vf¼O£äŽâ¡5œÌçÿCˆúsZîþÉ%CU(#Þi2}Mnþ3»»ãà_GQ<¸‹¬Åþ|hmâžì '€ˆåÚõàv‚ÿ©÷w·¿8^i·$tZ"¹/¢Ýíß].˜•K“·$ºñýu+u[ôïåîyñ¸q7Ftol©3“•»8Üá¦d…É=ª¦r·ÈZ@v`Œï¨xѧ"ÅÖ?¸”CU‹ÜªóçOí<l9˜¼Øþr0y=°ýå`òz`ûËÁäõÀö—ƒÉëí/çT¤ví?ŽÚþlj×þãÀäõÀö—ƒÉëí/“×Û_&¯¶¿L^l9˜¼ØNdüeõ´8È„ŽÊÀ ¬ës\õ‘9‹ÜáÎŒËvj§§Öúç3Æg§ÏÜ”ÂçR…]»UTft7c¯Ð»kÁõGmEXZw¸5c´ä¾hØË9´ñÆ_*",r‡[óRîÂeŒ‚¤a‘;Üšu¹k—\g&•;ЇÛ"%+ F¸8}Ñ6 ëú:b†ÚY8žaÈJûµÜ¹  =~U›Q.r‡‰äîÚz·]NO‡îH~´„TïÄï7“£<ç¼ vhEµ^ÒK£í›s)wuE wh­Z4od³Ž;4H*÷Lg&ó%.€Vˆ$«zòa¨jÒ#žÍCß|)jçà\¾Ä›w;tÎj‡ñ…Üá9|¡vx_È}7vùLû?ÔÌ ¬ò…Úwó#p¯q)}¸_È}/Öý³Èýî ÷ÝH±#÷›ó…Úw2K|9}÷›ƒÜ÷¢äNÛ~s¾Pû>´ÜÑû½Aî;‰äŽÞï jßÓìZƒJÚÓìàA0ÍžÓìàA0Í®9ÔþRòL³k f9í€iv­Á,§=0ï¨1˜å´äÞüapÌ;j ä¾ äÞñ¤>äþÌ;j )wD¾ro‡Ì,'ôþ&¨½˜å´ÌÖÌr‚'Á,'xÌr‚'Á,'xÌr‚'Á´xÈžÓ>àA wxLû€ÜáI vhÿŠ“E>ù)§IEND®B`‚Bio-Graphics-2.39/t/data/t3/version2.gif000444001750001750 1330212366325116 20016 0ustar00lsteinlstein000000000000GIF87aîçÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõ,îþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–rÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨4Á¥m*à–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›åqÏ~Á_ý¸?ÜI| KÇ·7›uÐ|œ[é‡=jÏÀƒ F$¾ÛYð]æ*×µ„6Ã}ÅÐlî‚a¸¶%­nÝPaþsØÓÕÃs‘«]Cb²–ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒX Öè#4ºñdYÚÇ:Ú±*r´Ð÷ÈG°'Itì£ É“aÇ„L¤"iò•ò,ò‘,¤ÉJZ2%jD‘†.ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊ0ö*W¼ÒU¯`•«ƒÄ²•69U-i™'[êi—¦/Íä(aó˜ 1¦LLUÌ^VÁ¼U±t‰WÅJOz%.ƒbªlF*™Ú2ÃùÌX}3š“šå9gÒMqªsOÖÄ“±Fu§rJª–ñþ'1¹M–ÐóU†ªç>zMyfóQu2fBïôÍYBÓŸ‡º§Be ©ƒâI™´Ê„ÙNwô£ígI4:P„ÊR ñ„§BøIR‚æ©¡µeHQÒÒpnÔ¥1õh°¥R‚âj—]©H[ÂSÖ“§°Ì)8ÊOhæ3¦3©IŠjϧâT¨;ÕU@¡ªO˜>´šC…¨ \ÓXŽŠ« 驚¬Jέ‚ô«ú$ªVÙÚMmúÔž¾Z«ImŠ+dörZåkXW¢×£ÒòUÔìKJÖ{F´¢>Íçb JØÆîÕ­˜=§dQ:OÁuŸ/%ë®nõצ6%)¥¨;KÛÓk²œ­zþ­joÙVÙÒ$µcݨnOºNÛKª§UQ€›âš£Á-®imµÜÝ ·ŽÒ¤LtO˫澤ºØÍîtYÝÜj׺"ùîsÏòÝ!µ u0.VΛÞä® ½ðU/MáKßúÚ·¾e/~ußý¶¿ñÕ~ý»#öŠ÷ÀN°‚œ]ôÊ7•nïM" `‹÷¾dª°ƒØÐv˜Ãcý°®4Ìà›øÄ%îc`Q9ؽh"°­4Lãüb˜¿$ögŽsCáóh»äï6±»Ù»fE°?,`íÂøÉP޲”§Lå*[ùÊXn"3ñZä*“¶Y–¢.ùY¬ÂÉN *þ_¥Ò‡™X(dešN°.ñŸÞE,P'›L!¿9«Mì8:gÀæùX5=kj‘ªÎ3ÿYX5ÕT1+ØJëtš‡jô¡3TÊ:úÑÀ¢ê¥MZ¥~Îsm«9ç…¸Ô¡â°dJéQ»Y…ul_×ç‘üp&çHLÇ+ÂrŒ¼É s‚s8çuLÊ’ì ŒQÈóqr“¼I¬Ìm ¬"]uña#\WËè¶~!tšÔs2’xáËÈœÌʼÌÌÜÌÎüÌÐÍ;Ål]fkfõUŒ8‚Ò,R6Ø*ŠûT ¸„š»ÍƒÔÍIh„¬f–LK|½w´¡KÎä6€?¸U¢Efz'³àW.5lð,JhNhYXÈ]ó,g´u~ýœµ‘±}اÇݵáÅ Ù¦D­)\¯/œÆNû¶"KÁÛÁ‹Ù£äØlÃYü ´C¬Ä-|¯¦MJšµR¬Æ>{Â"»Û¥½Â;Û§mÛ­}Û qÄj\Û¾mÛe Üž„ÜILÜÊ Ý®þÅ”ýÛ¸ÍÜäÜ3<ÜA·AKÚœÜ;œ°’Ýæ}ÞèÞê½ÞìÝÞîýÞðßò=ßô]ßö]÷½È‡ŒÈC×Èù-J£¼t±Êÿ G£ HÀ!-‚É ^àœ™4 ¹Lv¢ìÈ~Ird¯,ÌNá~áŠ4RáÉ97Ë'â‘$âsDI$‡Z‡â ×ß(Rr¡üsgwÌ0že%°ã<Þã=žãVO]@þgBÞÔD^äFŽäJ¾äKäMþfGžÔP>ºØŒª}<åG]壋ÏíÌZ~ \®ºô~»Éa>æ»KÏÒ<åj¾æ‰K—¤ ç:gÎn>ÀBçºrŽYº¶Í{¾sæ|æ¬ÌççãˆÎã mè‡>äQŽeaNå®ãL>éWé.ÍèÍü·y>T˜®é̼Ve»q‘ê¡^æÈÆqiÞѵXÛp«.уn±gç¬^k Xq¶.ë¸.Ф.æ+mƒ”ûë¦扎è´NqÅþ̘ŽÔËqÏÞÌÍžé–~é•^íTÖìÑŽíýôéÜne¥þíÖîìâî’^îU¶ëè>eê¾îRèîžîÀïéNïn;Bio-Graphics-2.39/t/data/t3/version8.gif000444001750001750 1276412366325116 20037 0ustar00lsteinlstein000000000000GIF87aî çÿÿÿÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ,î þ? H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–€rÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨Á¥m*ýä–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠH ¶È&,zñ‹cYºÆ2š‘*b´Ð×ÈF°§TŒj£ç8”¯”‡ŽxÌ£PìH =úñŠI•&mò õ€’/^êŠ(ÉS}RP)"dK9¢W~ª•²lÕƒPé)úôò–£TK¥ìD›…܆•È´g†Ù)Å O¿ä 3‰éL@AóV’2 *+es0Á”æŸä´©cz/Íü&3³©È@uÓS„ÌåS¬©¦%‘“+ÔþœT}ä *D}Æ”° è.—©ÏpÎ’ž¦Âç=Ê)}Æ œ‚§‚$šN5¡”ºOFó9L~bŠN¦Ú¨C¿P[ô s é8µ™ÒâˆT=•PIÚQuÚ% Ý&=“Íiºª4í¥J9zNž'ª ª^ÌIÓŠæR¥)ꢤúÒd^Ô5T}&A‰ºÕXE•¥åœé¿ÉPõ#_­ç§XÚÔqž³¬Ô1'[™J×µ*®H:&XwJS¡Þu®ØÌ'I“Ôã0ÆKg•f9!ª¢¡¾õŸ0],d%CØ‚–ˆ”‚½,e—zKÍÖʬ‰µ h‘ºŸÑFq•¡í jk²ÚÝ´6µ°þ-í‰Ú†V‹¦} nwËÛX&’·ÂI p_{à kXCn‚\åÊV.ÉîrEÒÜèZ÷ºØ•®z²{›ì^wº©®wÁËÜñ7¹ÃM¯z×ËÞöî½ÏõËwÕâÝúbw¸Ü͉}Ñk£þRè¿"Ì~ÝKà˜ÀæåQsÉ[”Ç—.ó½‰x÷›`ÎpÂÆI†s3aí*˜¸a±Aq«–·¶·ëÅIzucÜ»øÅ0ޱŒgLãR&´§bõ-ƒiÌã+MU­Z­¦[}ÊCZº’³¡<ˆ{<+v‚éÇ ukOmØÙ¨Veòý‰L?õu£œ¼éOwºÅf†¨ æ!£þ–W•ÓšJÉJ5)­¸lf¾ÖÕ¶8^óg [RIµÕ©ÆÄU›»,J¹ÍDÖ³­ÒJN7˵«LÕŽ˜uÉç,OÊñTô–©™Tݸ²Þô,6õ ä»Ö9¦E´¦ɺ¢óÕ›…µ§'»jA«ùŒ;®µ®/µä]1‘¾ög­›ëÓÞ:<½ö‘Ä[l("·Ù@q°²±ÄìC>ÛÄØÎvá;m÷ÏÆŒ´»Mn²$û*T.·º×Íîv»ûÝðŽ·¼çMïzÛûÞøÎ·¾÷-*`×èDþ^‘LùMð²¤1C ÄÏD1tì‚;¼Ä’i'%.ÈE>üâSé´‘¹hè-Ú9Nþ+>ñù”<6@¹Ê‰rp…ËC(ÒÊg^ÇŠ#|áPÃiÎó‘@ŰÖyù©Üó¢ýèHOºÒ—Îô¦;]µçæj¢³LÝ*¥[§uÈÓ,ì«o5ë Ùzu„©j˜†]ëÎÈÎý“g,›!™ÆHÛµòXü_ÔÇkSÔxI›ïŒŒ•ñ_çôçmZyÕZsõ+¥h£)%sÚ¿þÍoßõè9]útžþž©ß}ž×î“nîÓÕR¿ñàÃÜÒåÃÙîNò2ae?Ðé“õõ‡¾•[þoyã§ùÑT>òcz쯅û²eÁlUL'9Ô|•3”Ô@¯ÓÍ„w¿,ÑLú»¿¢v…jùWSüÄ[1M?VL¾weµ·~äwvTâÜD}j•€Ì×Yñ×UÁ&°¤€‚Å€.‚€ÈSæS*e±6yåMš%Y¡D|àA‡‚°¦‚‚“å‚Jƒ·e‚+(xö1ƒ8y:¨dERw§µwO·H¨%Q×DO¸„LÁƒRX…Nè^?‚#ÖÁ}½¥[@G…^¨m$^^÷ÒjâÇG¿wÙ¦(&P-f†p׆kµ[g‡vÇ^ÎqfS¨mG$eˆ‚8ˆ„ˆñÔXþûgˆtQņ‡;X†[Aˆ·1ˆ`€Pˆ˜˜‰š(ˆfõmßw”HNœ(e’¨ªTJw‰›¸Š°§Š¬Š+¥‰Œr‚걊¶èg®й˜‰$·(…¸‹Œè˜†˜[Àh‹Ã¸ˆ£XvýŒ°Hx±T‹Œ˜Á8]ch’HÛØ`ÎøÏ¨cY¸¹øU£XN¥8§yŽ¿8{Çø‹°V²cGîøŽ‚5ŒÜ¸‰}´Vò¸ýH‰mAÚ˜¿8ŽÅ!îHK^ñsŠx‰û—'áˆlQŠñX‰©¸$wxf“‘§ŽDçKI’s‚Œåhfõ¨þ sh*+É’õ”Œ¹Œ×$Œ’¨ÇHŒÝ‰5‘áØyüÑŽ"A”i¨‘jG‘ÊxŽþh€é7”þjhµÏئ´‹0gLe–Q‰]’“œ¨‹ÏTOÈCùsc)•¬("oɈ>™Œ<™?b•Áø’S mJÁ”Xs©‹·H•y©—üˆ˜Ä±•®ÈI^ Zƒi5YJ.iÐ!‹à˜•©8y‹ZŒ¢y—[9•a§—#YŒPÙŒà(vª8‰Œ‰S—Ѧ˜v)záø˜|a’é׉‰·X”r“j×–Ò8›¬˜˜”X—É‘Ûa–ΘšÕ˜w¬ù®É””á•sþɉ±©œ¶¹Œ¸ žQ M¼ù^ñ›£q™âùÄ)wƹ›ïóx›?éQÐé’c)ƒþ”–ˆi¡÷ÉrßYž8‘›ë9œÂ™…ç¹’œ¤žŠÈíï)¡ñ šZGŸ:iŸA)”ÆÉ—̸þ‰HZ[ÈÉF‘ŸÙì)žºi¡ Ê J–0ê ºZœè œ':¡Ù“éø“ : ‚šû©„Þ1¢hU¢Åu¢N¹¤£*¢ã ŸRv¾é 5*‹7êœLX¡ÍÛýà4æÝÎcá]ážÞ,cç½f¾Òë €ìæÞK ß’vàÁ¦ß< ß÷­Ù£¤â5­à(žâ â>ã¾Fànà>âo=É5o!ÝØ.ŽáF~ä áHþ`¾ä.váNÎäåÏ5åT[$~åO.ÏZþb0ÞåU^ã`[:>æXnæ^Žæj¾ælŽI;Bio-Graphics-2.39/t/data/t1000755001750001750 012366325116 15402 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/t/data/t1/version3.png000444001750001750 1145612366325116 20044 0ustar00lsteinlstein000000000000‰PNG  IHDRXLÿ(cªPLTEÿÿÿÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿÿÿŒÿ¥HÑÌÒiÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´™2̸† úðæ@àÐÿõîÿÚ¹/OOúúÒÿÿUk/ú€r¼àÿÿ­ØæÝ ÝýõæÿúÍî誀€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛfͪÿ¶ÁÜÜÜ‹‹Ç…Ò´Œ°ÄÞÿÀËðÿÿÿcGjZÍÿÿàdÿðõ‡ÎúÓÓÓîiiiÿÿ{hîÍÿ z‹EºUÓÿ€€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿEÛpÿ|üõÞ³ÿÿð€€©©©˜û˜‹‹úšp€é–zÿÚ¥ pææú¼‹ÎÑAiá°àæŠ+â_ž Ø¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/‡Îë¯îî‹ÿÿÿ R-d•í½·kî‚îÿPð€€õõÜÍ\\ÿúðÿøÜÿäÄÿi´ÿ×ÿ”Ó²""2Í2ÿúúÿÿðøÿ<³qÿÔØWÿ(?IDATxœíAvã8Yë¾Bo} Yj‰Ãô½§,ZMBz‰dæWÆŸ©`µÝ&atÈ’2ékú›; ÆŸc„¡ÀO"bÁ+Å*!§ÏR²ÎdE¬ò÷ÿY§c$ÿÎañƒ¯XÿX}MkV¬#ü^ž~±D•§ùU™ÖäVx„ûy,³dÆæ"Ö|ã+÷Y@¬,÷™[Íc晜÷Ûßý·ó 1ítœäóö·Ü ³Îä´¾.z¥Ž3|Îã´bÖ™¼Û´{xŸÜ'ÆÝÃûWòg¬Õ‡ÏXÞÃRg浪*ÖãË{XòL¼V=Ä*¤=ï¦Ò{l¯â&Ö¿¤5ïÅò]=ˆ%ÄB,“ b™±Ë$ˆ…X&A¬±H{ÞŠ4^b}ù\~6 "Ô!bÁKÅâ­èœŸ#Œ$„Xsm„Ái³¬a<׋U¶…~ß…'ÆR)ñK[<3Õºt ·ÂÜÏcr±ö]:ˆuˆ».gA>ÎÇM—Îò‚mˆ! qÓ¥“\¬Z—+V?÷]:´ØoÞë÷ïÉÅZ}ˆ.1¤Kg#]:ƒXèÒ¹¦v#P¬¦Òûûz7±¼+Ñ.ŽXÞßY=ˆuQ ±L‚XˆeÄB,“ b™±®+[ÌÄ /±¾|. ?›ˆ ê± „X%û›¯Ð@¬Ü?2Ž«ÔvA,¸}q¥/…[!œ¦çñà)Ø=¾à9±Ø=¾à)±Ø=šˆÅî1ÐF¬Y« ‰X¬Up˜X^壮{î<*QË©mÔuƒ–æ b!–Iò‰u"£®{æ<*É'–ÿu ±ëh ±L")–Ó_ƒG]÷ÜyT"(„ˆ ê±`r± or+QD,ŠžÕU¬R+D,‹}iÔT,ö¥QgT±öûÒ$ÞåA‘AŪ÷ÿx Ê‹UiÞ¿ßCŒ 60ªX+òBƒ"Äâ¥QEË¡º¤)þ3£Â¨by—ÇÕƒXÍD¬ž V3«'ˆÕLÄê b5±z‚XÍD¬ž V3£Š4þ3£Â bAu"D,¨CÄ‚ÉÅ*¼­D±èÒQcT± ]:Ú *V­K‡[¡ƒŠUëÒaÅRbT±ö]:b)1¨XìңΠb±K:£Šµ"k•"Äb­RdP±\jbâ?3*Œ*–wI_=ˆÕLÄê b5±z‚XÍD¬ž V3«'ˆÕLÄê b53ªXAã?3* *T'bAÄ‚:D,ˆX6œŸÊ#Œä“˜^¬ÂúF¬!,µôí>ªc:±öý?"ÖÒÿs ó‰EÿÏ%L'ý?ˆeÃÝÃ;5õˆ5˜¬UˆeCÖ*3¦ëòJ÷øÌs>±¼‹¯b!–I ±L‚XˆeÄB,“ b™±.+]|æ9X± 0 "Ô!bAÄ‚:D,ˆXP‡ˆE'4bYNhÄÃB'ôL'ЈeC:¡/a>±è„¾„éÄ¢±l¸{x§»±“µ ±lÈZeÆtb]^ìŸyÎ'ÖÉ‚XˆeÄB,“ b™±Ë$ˆ…X&A¬‹ÄJŸyN'D,(LÄ‚ˆu¨#Vá c%ŠˆEeº£ŠUj…xˆ¥Ã bÕºh¸*1¨XôÒ¨3ªXôÒˆ3¨XôÒ¨3¨XôÒ¨3ªX+²V)R@,Ö*EË¥¾¤!þ3£Â¨bùƽ b5±z‚XÍD¬ž V3«'ˆÕLÄê b5±z‚XÍŒ*VÐøÏŒ ƒŠÕ‰X±  &«ðV´EÄ¢KGQÅ*téh3¨XÕ½n¸ 1¨Xµ.â?*ØÌ¨bí»txÕ[ŠAŪwéx Ê‹Uß®’‡wFkE^hP¤€X¼4ªÈ b9TÄ4ÅfTU,Ïr¾×A¬f"VO«™ˆÕÄj&bõ±š‰X=A¬f"VO«™QÅ ÿ™QaP± : "Ô!bA ± oÃéys:zià±Ê®oB,8=Ǿ¸ÒKíNÓóxð»^V,8B¬]/ bÁb±ã 4‹o X+²VA±X«à0±¼JPF]÷ÜyT¢(–SÑܨë-'ÄB,“äëDF]÷ÌyT’O,ÿë"b!ÖÑ b™DR,§¿ºî¹ó¨DP, "Ô'bÁKÅ*§ÎùÙ9ÂHBˆ5—Gœ6ËŠÆs½Xå®Ñ/²b`©<¦-%šæ-ʶ㱺Éþ?±¦ûsÀü<€X'Èþ?+ÎDzLÁýV¸¼`bˆBÜîÿ“[¬ç⽚V¬nî{–2o,u·i÷ðŽXG¸xO.ÖêCóŸ:ÿa©“ž¥XËŠbpÂ,Ù{–²Ôެb5•Þß׫¸‰åX„æ;±¼¿³zë¢ b™±Ë$ˆ…X&A,Ä2 b]%V¶˜‰4^b}ù\~6 "Ô!bÁ+Å*!§ÏB—ΓßeY§c$Kúz¬²-ô+¬XGXj; ¹Ê‰S­K‡[áVºJÞª¬ïã®K±‘…Vœ›.¼Óq’ì,´pªwédŽ3dg¡X•‡÷Ç[L!†(ÃÝÃ{æÊ÷ŸããCtéŒa浪*]:ƒ˜x­zˆuI鯧äÝTzíUÜÄò¨>Í{±¼GWb ±Ë$ˆ…X&A,Ä2 b!–I«G,Òž·b—X_>†ŸMÄ‚ˆuˆX±  "Ô!bÁ+Å*!§Ï’¶õ·"ÐcX脦z ÐONtB"бè„D:¡WœtB!Ð ':¡G‘NèXtBâîá=swáÏññ!:¡Ç0óZU‹NèAL¼V=ĺ¤<öSòn*½Çö*nbýCZó^,ïÑÕƒXA,Ä2 b!–I ±L‚XˆeÄê‹´ç­XAã%Ö—Ï…ág± bA"¼T,ÞŠÀùÙ9ÂHBˆ5ØFœ6ËŠÆs½Xe[è÷]apb,•¿´Å3S­K§p+<Àý<&kߥƒX‡¸ëÒyöäã|Üté,/؆¢7]:ÉŪué°bõsߥC‹ýöᱎpÿðž\¬Õ‡èÒCºt6bÑ¥3ˆ….kj7Åj*½¿¯WqË»íâØ‰åýÕƒX±Ë$ˆ…X&A,Ä2 b!–Ië*±²ÅL¬ ñëËçÂð³‰X±  JˆU²¿ù ÄÊý#óá8±Jm÷Ä‚ËñØWúR¸Âizž‚Ýcà ž‹Ýcà ž‹Ýc ‰XìmÄZ‘µ šˆÅZ‡‰åUÎ1êºçΣE±œ ÐF]7hiÞØ b™$ŸX'2êºgΣ’|bù_± ±Ž±Ë$’b9ý5xÔuÏG%‚bAˆX± > &«ð&·EÄ¢èYQÅ*µâAÄÒaP±Ø—FAÅb_uFk¿/Mâ]T¬zÿ÷¨ ¼X•æýûm1ÄØ`£Šµ"/4(R@,^UdP±ªKšâ?3*Œ*–wy\=ˆÕLÄê b5±z‚XÍD¬ž V3«'ˆÕLÄê b53ªXAã?3* *T'bAÄ‚:D,˜\¬Â[ÑJ‹.5F«Ð¥£Í bÕºt¸*1¨Xµ.V,%Fkߥ3!–ƒŠÅ.=ê *»ô¨3ªX+²V)R@,Ö*EË¥&¦!þ3£Â¨by—ôÕƒXÍD¬ž V3«'ˆÕLÄê b5±z‚XÍD¬ž V3£Š4þ3£Â bAu"D,¨CÄ‚ˆeÃù©<ÂH>‰éÅ*ü oÄÂRûAßî£ú8¦kßÿC!!b ý?—0ŸXôÿ\ÂtbÑÿƒX6Ü=¼SSXƒÉZ…X6d­2c:±.¯´qÏ<çË»Xðê b™±Ë$ˆ…X&A,Ä2 b!–Ië"±ÒÅgžÓ‰ ± bA"D,¨CÄ‚ˆuˆXtB#–é„F¬1,tB_ÁtbÑ X6¤úæ‹NèK˜N,:¡ˆ»‡wº k0Y«ˆ¬UfL'Öå•Áîñ™ç|bý/Y ±L‚XˆeÄB,“ b™±Ë$ˆu‘Xéâ3ÏéÄ‚ˆ…‰X± uÄ*¼a¬D±¨LWcT±J­±tT¬Z ·B%‹^uF‹^q‹^u‹^uFkEÖ*E ˆÅZ¥È b¹Ô—4ÄfTU,ïò¸z«™ˆÕÄj&bõ±š‰X=A¬f"VO«™ˆÕÄjfT±‚ÆfTT,¨NÄ‚ˆuˆX0¹X…·¢•("]:jŒ*V¡KG›AŪîuíPˆAŪuéÿQÁfFkߥëÞR *V½KÇ{TP^¬úv•<¼ë0ªX+òBƒ"Äâ¥QEË¡"¦)þ3£Â¨by—ôÕƒXÍD¬ž V3«'ˆÕLÄê b5±z‚XÍD¬ž V3£Š4þ3£Â bAu"D,¨CÄ‚bÞ0†Óó8ætôÒÀ1b•]9Þ„Xpz}q¥—†[!œ¦çñà)v½4¬Xp„X»^Ä‚ÄbÇh";Þ@±Vd­‚&b±VÁaby• Œºî¹ó¨DQ,§¢¹Q× ZN86ˆ…X&É'Ö‰Œºî™ó¨$ŸXþ×E,ÄB¬£A,Ä2‰¤XN uÝsçQ‰ X"D,¨OÄ‚—ŠU" Nó³s„‘„k.7Ž08m–#Œçz±Ê]£_dÅ:ÀR)xL[J4Í[>”mÇ bu“ý6bM÷ç€ùy±NýVœe™‚û­pyÁ6Ä…¸Ýÿ'·XÏÅ{5¬XÝÜ÷,eÞXênÓîᱎpÿðž\¬Õ‡æ?uþÃR'=K±–+Äà„Y²÷,e©YÅj*½¿¯WqË»íâØ‰åýÕƒX±Ë$ˆ…X&A,Ä2 b!–Ië*±²ÅL¬ ñëËçÂð³‰X±  ^)VîwæÇ±Ð¥óäwdÖéÉ’¾«l ý +Ö–ÚÎBî£râTëÒáVx„•n§’·*ëû¸ëÒA¬Cdg¡çã¦K'ïtœ$; -œê]:Y§ã ÙYh#VåáýñSˆ!Êp÷ðž¹òýçøø]:c˜y­ªŠE—Î &^«b]Rºñ)y7•Þc{7±¼+Ñ„ò^,ïÑÕƒXA,Ä2 b!–I ±L‚XˆeÄê‹´ç­XAã%Ö—Ï…ág± bA"D,¨ÃiºbÄ"&A,bÄ"&A,bÄ"&A,bÄ"&™þü¹ÝþþúsÏíçŸ9™é·MËo±‹œÊt_¨ž"-ÿˆYäL¦ƒþlŒÂ+r*ÓV$Œ"#²½"’iûWÁÕSvÐÖ§þüL·û$¹ýºa•‡åñ¿eb¶-g~ úùoŽ´é©d¹nž„6y»m~µLdEÙAg6´í¨óä¨X=K¿É™¯W–ƒ~ê©þ­ð±¸—êÒ{LskÌμþWuN#±–‡–Ûíö|4]ý9?òœÐö‡w³3‹ž:GÚ^ ÝÏÙ¨g »3‹žúSrT¬QBíÎ,zêOÉ‘ŸÉúøÚ÷Ÿ}õùħΔ©üÛ›ç<¾ýìßÏÿ×›òöK×§þ§7åí—®OÝÿ¯ß~)b!ÖüyÄ‘#b-/Ö’ñb-/ÖÄZŠ5@¬·_ŠXˆ5±F±Ë$¼Üpá©3…ÒdbÄ"&A,bÄ"&A,b’ÿ!º‡¹aIEND®B`‚Bio-Graphics-2.39/t/data/t1/version2.png000444001750001750 1233312366325116 20036 0ustar00lsteinlstein000000000000‰PNG  IHDRX²>gP ªPLTEÿÿÿ{hîÿÞ¸‡ÿÍð€€_ž ½·k¼­ÿ/î‚îÎÑdÚpÖŠ+âÿÿpؿ؀€îèªúšðæŒd•íÿÿ/OOÇ…Ûp@àЀÿcG”Ó‡Îú™2ÌÍ…?¿ÿÿÞ­õÿú­ØæH=‹ÿ"‹"øøÿÿúúÿäÄp€iiiúúÒÿÿༀ€kŽ#ºUÓÿÿi´Ý Ý¸† jZÍÿÿÿÒ´ŒàÿÿÜÜÜÿøÜî.‹WÍ\\‹EÿEúë×Ü<Ú¥ wˆ™F‚´fͪ€€ÿ×¥**ú€rÿëÍ€ÿäµÿðõ²""ÿõîÒi©©©ÀÀÀúðæ2Í2pÛÿ¥ÿÿõõõ ²ªðøÿ‹é–zÓÓÓAiáÿææúÿÚ¹ÿÀËýõæK‚‹°ÄÞÿŒÿ z|üÿÔšÍ2‹‹ÿPUk/HÑ̘û˜¯îîÿïÕ°àæÿÿúððÿðÿÿðÿÿô¤`ÿÿÿ¶Á<³qÿäက€ÿÿúÍõÞ³ÿÿðõõÜ€ R-‹‹‡Îë˜iÝ#ìIDATxœíQvã8EU½€9‡ß½”¬¤÷“mOÙŠmÅbrH ðŒûfê*T$†¹E)2-Ëß\¡¿¶†߉ˆÏ«¥œ>[«:“±ÚßÿWKþÃ=†X±þþ³úX¶l¬X¯ð²<}cË0ª .ë?«¶lÉ©ðîç±­’%[ˆX뉯]g±°]gn3•grÝ^O×7×bÙé8ÈÇéï~*¬:“ËöTx׫ìtác— «ÎäÕ¦ÝÅûzq>81î.Þ?Š_cmÞu»ÆŠ–:+¯U]±n×XÑÃ’gáµê&V#ãùm*£ÇöSÂÄú—Œæw±¢G×b ±Ë%ˆ…X.A,Är b!–KkF,2ž_ÅJš(±>b ß›ˆ ê±à©bñR´×kç #I!ÖZ`›apÚlfÏùbµçB¿K!d†Á‰±uJüÊÏ,½.Æ©ðî籸Xû.Äz‰».GA=®Û§.û ÛCâS—Nq±z]:¬XóÜwéÐbÿ|ñŽX¯pñ^\¬Í»èÒ±!]:ObÑ¥cÄF—Î9µ‰â5•Ñ_×O +ºíäø‰ý•õƒX'±Ë%ˆ…X.A,Är b!–Kë,±ªÅM¬¤‰ë#æÀð½‰X±  JˆÕª¿ø Īý+ó¡X­÷ôÄ‚÷íkŸÜéKáT—å±}q<=þÀcbñôø‰ÅÓc ‹X<=úˆµ!kt‹µ š‰UÎauÜcûQ‰¢XAhVÇMZšgÄB,—Ôë@¬Ž{d?*©'Vüq ±ëÕ b¹DR¬ ƒ­Ž{l?* BÄ‚ˆõ‰X°¸X¹•("EÏjÌ*Vë"–“ŠÕ{. §B%&«÷\V,%f«ó\ÄRbR±èÿQgR±èÿQgV±6d­R¤€X¬UŠL*VH}É@âgF…YÅŠ.뱆‰X3A¬a"ÖLk˜ˆ5Ä&bͱ†‰X3A¬af+iâgF…IÅ‚êD,ˆXP‡ˆ‹‹Õx)Z‰"bÑ¥£Æ¬b5ºt´™T¬^—ΩPˆIÅêué´øQÁafkߥÃ]o)&«ß¥=*(/Vç›×ÓbбÁfkCn4(R@,n*2©X1C‰Ÿf+º¤¯Ä&bͱ†‰X3A¬a"ÖLk˜ˆ5Ä&bͱ†™U¬¤‰Ÿ& ª± bA"D,®WåFòN,/V£„±LØz%„á£z;–kßÿC!!bY§ôœÂzbñ”žSXN,žÒƒX>Ü]¼SSXÆd­B,²V¹±œX§WÚ„'fžë‰],xv ±\‚XˆåÄB,— b¹±Ë%ˆu’Xå3ÏåÄ‚ˆ…‰X±  "Ô!bAÄ‚:D,:¡˃tB#– Ðg°œXtB#–é„>…õÄ¢ú–‹NhÄòáîâîBÄ2&kbùµÊåÄ:½28<1ó\O¬Š±Ë%ˆ…X.A,Är b!–K ±\‚X'‰U.1ó\N,ˆXP˜ˆ êPG¬Æ ÆJ‹Êt5f«õ ñK‡IÅêvÑp*bR±z½4-~Tp˜YÅÚ÷ÒÝA†o%V¿—&zTP^¬~#<ï:Ì*Ö†ÜhP¤€XÜUdR±ªK†?3*Ì*Vty\?ˆ5LÄš b ±f‚XÃD¬™ Ö0k&ˆ5LÄš b 3«XI?3*L*T'bAÄ‚:D,X\¬ÆKÑJ‹.5f«Ñ¥£Í¤bõºt8*1©X<ñFYÅâ‰7âL*O¼QgR±xâ:³Šµ!k•"Äb­RdR±Bjb?3*Ì*VtI_?ˆ5LÄš b ±f‚XÃD¬™ Ö0k&ˆ5LÄš b 3«XI?3*L*T'bAÄ‚:D,(!Vãc¸<¶6»£—ÚˆÕv¿4{A,¸<¶¯}r§—†S!\–ÇöÅ]ìziX± …X»^Ä‚bÑK]Ä¢—úˆµ!kt‹µ š‰U‚buÜcûQ‰¢XAEsVÇMZNhÄB,—Ôë@¬Ž{d?*©'Vüq ±ëÕ b¹DR¬ ƒ­Ž{l?* BÄ‚ˆõ‰XðT±Z†Á©s½vÎ0’b­åƧÍÚ=¸lÛU£odÅz­SðX¶”è2Ës¯MãTø{Ïÿ)-ÖÒÖG µ†X‡ØyþO‹U×m»OÁõTx¿a›bˆBÜ=ÿ§´XÅ{3¬XÓÜ÷,}þEmW›vïˆõ ÷ïÅÅÚ¼kýW?,uÒ³ô$Ö}ÅJ18a¶ê=KUjG6ñšÊè¯ë§„‰]‰vrüÄŠþÊúA¬“‚XˆåÄB,— b¹±Ë%ˆu–XÕâ&VÒD‰õs`øÞD,ˆXP‡ˆÏ«ö+óvlté‰Eû´aÁz¬øI¯Àz¤ˆu  "–Ië"D,“ Ö)D,è%VµÄOz~m3 ¾ "Ô!bAÄ‚:´ëúSW†/ ¾‘XÇ¥@±ÖõiCÄ‚bíÇ8B±>ÚÚ5ÝÚ“^ ¾0¨,Öú8ÖõmN…pÃCb=V©eCÄ‚÷í‹»Ø]¼s-ÄÚµ ºˆÅZÍÄŠª‹²:î±ý¨DQ¬ JN«ã–(žE,ÄrI=±Äê¸Gö£’zbű ±^ b!–K$Å ú1Øê¸Çö£A± D,ˆXPŸˆ êPG¬Fõ„EÄ¢š^YÅj½ªTÄÒaR±:e §B%&kßXö±°b)1«X»Æ2ÄÒbR±h,SgR±h,SgV±6d­R¤€X¬UŠL*VHáÒ@âgF…YÅŠ®»ì±†‰X3A¬a"ÖLk˜ˆ5Ä&bͱ†‰X3A¬af+iâgF…IÅ‚êD,ˆXP‡ˆ êPG¬FƒEÄ¢ýKYÅj´i3©X½ö¯…S¡“ŠÕkÿjñ£‚ÃÌ*Ö¾ý‹—S¤˜T¬~ûWô¨ ¼X‡_O‹)ƘU¬ ¹Ñ H±¸5ªÈ¤b”Z %~fT˜U¬èZÑ~k˜ˆ5Ä&bͱ†‰X3A¬a"ÖLk˜ˆ5ÄfV±’&~fT˜T,¨NÄ‚ˆuˆX± ‹J/Äò`£6±LØzµ©á£z;–kßXF…*bYçŠÂzbñ\±SXN,ž+†X>Ü]¼Ó¬XÆd­B,²V¹±œX§—p…'fžë‰]…zv ±\‚XˆåÄB,— b¹±Ë%ˆu’Xå3ÏåÄ‚ˆ…‰X±  "–[ÙÆ2Ärc+ý4 IJcÛ5–eUˌƲV·±ì¸k,«\úŒX–|j,C¬CQ'eˆåÃÝÅ{åf Äraåµ ± –1Y«ˇ¬Un,'ÖéåP቙çzbEWtžÄB,— b¹±Ë%ˆ…X.A,Är b$V¹ÄÌs9± bAa"D,¨CÄ‚ÅÅjT"(QD,ZÔ˜U¬Ö«ðD,&«ÛžÅ©PˆIÅê5iµøQÁafkߤUøi¥ŠL*V¿I+zTP^¬þoXàâ]‡YÅÚ Š‹[£ŠL*V@ÙÒPâgF…YÅŠ®»ì±†‰X3A¬a"ÖLk˜ˆ5Ä&bͱ†‰X3A¬af+iâgF…IÅ‚êD,ˆXP‡ˆ êPG¬FƒEÄ¢ýKYÅj´i3©X½ö/N…JL*ÏèRgV±xF—8“ŠÅ3ºÔ™T,žÑ¥Î¬bmÈZ¥H±X«™T¬b«ÄÏŒ ³Š]+Úb ±f‚XÃD¬™ Ö0k&ˆ5LÄš b ±f‚XÃÌ*VÒÄÏŒ “ŠÕ‰X±  "Ô¡µXJ¸<¶6»£I ÚˆÕv¿æA,¸<¶¯}r§I‹S!\–ÇöÅ]ìš´X± …X»&-Ä‚bѤ]Ä¢I úˆµ!kt‹µ š‰UÛduÜcûQ‰¢XAÕ˜VÇMZ§jÄB,—Ôë@¬Ž{d?*©'Vüq ±ëÕ b¹DR¬ ƒ­Ž{l?* BÄ‚ˆõ‰X± «eÔeG¬µŽ=Ãà ./ÛvÕèY±àa±öM\S!<È˶­mk ± ¥XWÚúæõTx% Å¡"—í©ð®+<È«M»‹wÄ‚ùµ½½k]½â‡Õù$Ö}ÅJ18¨Ë*EI›ÄOz)£Ü±N!bAÄ2 bBÄ‚ˆeÄ:…ˆ½Äª–øI¯À¯m†¡Àw"bAÄ‚:D,ˆXP‡?ˆÅï?†æb]*Þ «=W6V,xK¯ý‹S!<ÊËv×þ…Xð(×íSûbÁ£\úí_ˆ‹Õ¹x¿½V›bˆP‘_ÛÛ»hÿ‚6|‹ö/hÂõXGÿ Sa½ Ò#A¬a"ÖLk˜ˆ5Ä&bͱ†‰X3A¬a"ÖLk˜Ün˜Jü7L…_Û CïDÄ‚ˆuˆX± —哇 q b— q b— q b— qÉòçÏççß?®ùüú/BfùnÓýMì"‡²\ª‡H÷ÿÄ,r$Ë—AžŒÂ+r(˳HE,ò|*D,b’åùGÁÍU{n›?Æ»ÞîÞa×5r«}[W..´Û[íöž/ÜÞþ¹ìùù»n;hï]¿–Ïë¯QùüvÂj7Úí÷‰ýþѱ8ìù6èÇß´´ë® ä~*|ºzšÈÏϧ?#ÙQÖhÏŽƒöu¼*ÖÌÒï²çïë•ç Íw]"ÝŸ o‹{ë.ýŸ·iÛž·Ug×5rë~Ñòùùù¸4Ýü;]ßó˜Ðñ‹w·=‹îºFÆnîçÌêšÂoÏ¢»~—¼*–Õ¿P¿=‹îú]òÊ/·½}îïýéã…w])Kûw6yüõ£?þÏlÚ¯ŸºÝõ³i¿~êv×ó¿¥û×OE,ÄZ?ŽXyE¬{ìźÇ^¬{ìź±îaÅ2ë×OE,ÄZ?ŽXA,Är ·NÜu¥PšL\‚XÄ%ˆE\‚XÄ%ˆE\òfÌ÷õC3IEND®B`‚Bio-Graphics-2.39/t/data/t1/version1.gif000444001750001750 2216512366325116 20022 0ustar00lsteinlstein000000000000GIF87aXLçÿÿÿ{hîðÿð€‹î‚îAiáÿcG@àÐp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿ØõÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2ÌÿÒiÜÜÜÿÿàô¤`ðæŒ‹‹ÎÑÿÿÿõî/OO¼wˆ™fͪ˜û˜šÍ2”ÓææúÿÿF‚´d•íÿïÕîÿ‡Îú¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀºUÓÞ¸‡ÿÚ¹î誼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõ,XLþ@ Á‚4Há@‡ &„Hq¢Å…%bܨ±ãÃŒ9†ôq¤É’(+ŠL ’åJ•$až”é2fKš8oê|¹Ó&ÏŸ>ƒÎì9hQ¡5*MÊbÉœF›•*R«K±R½:U«×®`«†å*¶,Ù³YǦ5»íÖ¶p™>Uû¶îW¶véÞu»7nß¼xÿ ÖK8pa¾‡ý&Œxå\ "+6L¹±åÉ—%k\óP 7/朙´gÑQ‹¤@hÓªOÞ=ºvjÚ·GÒZ¶íÒ¿}çܱ@Ð" "Wú¸ëØÐqŸ.œzôà›‘?Ô^{ïêà¯þ/<Ýî#÷VŸ¾}yñÖßËÇ>¼æõϲ×ïš{ýøôhß§!ôZÚáÇð™7 €>(áU¡é‡Ü~ÏáÇà†:á‡KE”\~ -ç^‡ ¦Èá„¶¨"$nW¡†(®â‹,â¸~½97Òn5™£.©ãI<&ô‰@)äFFyÞqÍY8"‚Trå“Eryä—Qú'f…¼‘饔N¦¹%^I¤àšpv©¦œq‚IsÚ™'šujÕfH&îyæ ‚Ú'}þz¨¡t6Z‚F*餔Vj饘fªé¦œvêé§ †*ꨤ^˜Z©¨¦ªêª2ª§[þ®% 무Öjë­¸æªë®¼öêë¯À+ì°Äkì±Ç~÷—È6ëì³Ð«¬¢ŽúÉl´Øf«í¶Üvëí· L‹×µà–kn¶â.ªnˆäžëî»ðÆ+o·éÆÕî¼øæ+k½¯V;U¬ú,ðÀƒË¯V÷¬0·SÛ/J/,ñÄW¼ï©gÜlîò™žÆ ‡,ò·#•ðÈ(ßZ²¿')«0Ç,óÌ4×lóª§Þ¬óÎ3·ì3I>ì±ÐmtÑHÿÌòºr9t´ÒDCý4ÓS/muÔT»ìtÒYKÍõÕUc ö×btØh“¶×lwíöØm{„Õ•o—½vÝwŸ©þÝj÷7Ä[¯´Ýpãí·áïÕäsyó8ÙV‰¥•Ê¹Öøå‡®ywdŽÙZåŽ#.úæ4¡Ç_’§ë‡ùã¬þ%Ꞙßê®Óîhä‘'Ø^k„‡Nzæ¾_fz¦ÒØ#ð¶ 賂>–XåÞ­ÿ½ò…ò>Q¢ÇOŸüö‹™ûGÙ«ŽüøÚ“oì06´2õµ›ïbîÌ]¨øå×ß¾ý~y.ãçës?ûq9“ÜÀú¯NxºŸ¥W7Nîd …–(0‚šyÏ6ÈÁz0TÜGHBK…ðFK™ W˜¬"‰…0œUÿ.ؽ“Åð†8¤Õ §gÃjl‡þ „N }HÄq‚éa)vDÖp‰P„a§Ä(*lŠ4dS­ÈÅ…año[ìbÀ¾Ä¿ QŒhô¢ QÆ4΋ŒH¬a çHÇ:ÞlI´£;ˆGì8°ŒYd)ÈBnîq$d" éDE62ˆˆ|ä"')ÉJbð’”[&-¹IL:Ò“ŒdP$ÑVÁPvò”ŸD¥)í3J®ahq”e,U9ËTºª•CÒ笷 ZrÒ–« f-Q8¦Áî•»¦2)Lf.³q¸„R…^6À>Ó—²t¦6³ ›hʉ—ꛑìšÉMlš˜×4ÔУ–Û<'9å©ÉŽé²Lüþ3<ß9Ï}Ò³€Þ|˜5ãéÏ‚öó Ë h˜ô‰P‚6”Ÿé|hKŠ=Nj…’2ÊÑŽîÑ ,æÕÚ(/8B‡¤ñâJÝÈÒh™¢&ÚJßõÒÅÌÔ]*m©NÏUSGRÔ>7åiG™x©•d }”HÊÄu6•$A=ªT{ÕÓ†þô|OÝ\T˕өzZUèI®ž­Ì©ëêW×ÚB‰¦†¬'õhXï#WÊõ®xÝ`Rý´T˜úõŸÝ+`ýØ×Á ö°nM¬X…XXÄ.6°ŠuècWÈNÖ±’ͬe3ØØÈ’’¡—õ¬aE µÊŽ–NÈܬjO«YÊv6´`»þg)aÙZֶ̮SÂmŽŽéÎþÀ¶¶¤ îM«Û˜Lso ¤ím… Ü߉¸Ì½ 8÷÷£æZw¹Î…Ük¯‹"v.i Øånq³ûÖí†w6²íhÅ]Öž·{æu¯—À+ßñ²—¼Ö.~‹TÊýÞ÷¿ïÍ‘~<•¼xTö p3¬à²µ¤ ®¯UãᨘõÁmõoƒÿË` /åÂ.Ö\7LâåQ¸½ 1M+ŒâŸXÃUñŠ[ ã¤vؾ –q°FìaÿíÆ4fã‡ì)×xÂFöqKœäç¾XÉGŽ2”§ŒA K™ÉKî1–Ãce*kùËMsfº¼å¦ô×ËaN3þ#É,涤¶ÍhÎ2fÙlÛô~nœW†s™ÃKç óOwVsž­Í>:œÄÓ]/ÃwèFÇÙÑNyòžw2Ýdzïјž4< =eï*IÏ &4L9}^;[é@¢µœ]œj â9Óª†tIkKkzÕ²¶±¤kÍ"ûZS­ÆuðhÔëøW<v®Ç¼kBûØTU6¬KÛla³Ú\•ö­¯Flæ>ÛºJ¶µyMXmÜH·¹oYíeÝÞ·»§MÌu›ì×ø6¡º÷MÉnÏ{Ûôþ7kýð‚üà›$8Âí-p†›­Ý'·ÃÎj~G|\¦¢xÙ«p‰C9¦þ;>ñ3™R"×8‡!®òlþyw¯n¹ÇKr‹_î¸Å§rg~ñÈÖ<åä«4>«+ó’Oïç=Ÿ §B_£Ûœ€H/:ÕN>ô¤[}³Qçyòšþt§'”åZ×ò™¥tŸ‚ÝëÌ·Ú׎`‹gíïù6¼*ïBŸ½ë •ûÜuZ÷*ß½ìyß»àkÕ÷„ÿýê¾ÔûàÓXøÿ½ïZ]üâ¿æÃ“½’Š—|)ÿu¸³–í =°Ýnù°{þôg,êÏzÄ›}õ®Oýå“÷øÖÏÞô²/wîa{Þ£¨ö±·=î…/àÒûþø»OþX¯üà;¿÷u>ôµšñá?ß—Ò·þÝ@þ~}ä’ùÄåÉMÕýæûÝû™}yêz‰þé?¼ýØÄ¹¢síÛßñà/-…>[ýûŸöùç~a³tíÁ~æw•xDuc‡€á×y˜d\÷€ÿuè€ÛÔ€ Ñwè"¢‚"¨Q—}È"ð*¸‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃1Èy•d‚‚>X„Fx„H˜„J¸„Lè‚@€'ˆA)Ø„TX…Vx…X˜…oð„…›4…Z†b8†d¨…\xt8„Á†e؆nø†pHƒgIiHT‡x˜‡zH†sØouX5‚‚zI&„vˆþˆ†ˆj˜ˆ…ø‡ŽØˆˆ8‰ê$‰^x‰j¸ˆª¥–؉‡X‰Ÿ8o†‰¡HšØITW¤Èˆ"wŠÿ£~ô7;”艬Ø4¼'¡a<´‰¥h‹»xü×9«È‹V犌D€éӋĸŒZs‹ê•O¼S}Ã8‹­gŒ¿5µÈŒgšÅ‰ÊHÙ8QØcƒèkÓ(mܸu{¸Žn؇á8gãXlì8cèŽÚÈqñèmô¸Yhà¸aéH@lȹ„þxŽ ø‹LW iiŠù(eÙɃ©ø{åHdé|Ù‘÷ø?‘"™zi’%y’þ•’,¹’09þj$¹gÞ“ÿ¨ˆ3©j£¨’!é‘9¹O©h€/Ù“—ç’isëGëE”7‰Ž?éY¸¸“;’MdF¹:Áh±È“UÙ‹W <ÈØ[T9– 9”×óŒÔek]i“Ûø”ކLI–-é–TV“qÉ•¨‘y`rYŒt SY‘‚yƒi–º¦‘ƒ™˜9X˜lésùO©˜’é„} p_ F“™™?X™Ù3?"‹´÷GªÚ±hŠªž ¬:ë|ôiµN;’²*9&B‚W;{ûI¨aÛ…6Á«e«‘Zû±?;¬’#µlz¬»f [·v{Q™q· ®Û·ÒjRþê·öª®‚[¸0 ¸†K®„›¸ŒšˆÛ¸Xh°Ñ¸[¹{ø¸–K…’{;”›¹žÛ®yû¹M¸¹fÓ¹¢{ºfx*¨«„¤+Jzûºu›3°«¥ ·6˶A˜¦¶»»sËeºÛ»iË»œu»Ä+¼mZ¼À»µ®ƒ±Ê›¼¸[:¿¼Î«¦Ìû¼Öþ Ÿ!+½çY²×Ë©(h!Ú{,k¼†×µòó<[9½X³ä‹8›¾ák}<+·ñËn¾´4´Ý«ŒF‹”ðÛ¼Å#²´oÛ´ûÛ}P»¶ÈËXT>¼À€é¿É(–íK‡æ ³` À-7¶êÛ¶»Z€ü›QÛÁüĪÁ¬I¿(\Z³ÛÂÊ*».ÌAÐ4\Ã6|Ã8œÃ:¼Ã<ÜÃ>üÃ@ÄB<ÄD\ÄF|ÄHœÄI ¸JÜÄNüÄPlÄ­û{"ÅV|ÅXœÅZ¼Å\ÜÅ4ÌÄ^ÆbŒÅS,`U<ÆhœÆj¼ÆlÜÅ`ÜÆpÇ6\Æ(tÆr|ÇxœÇzìÆ§²Ç~Æþtü>vüÇ„\Ȇ|È1ðÆˆ¼ÈHÈ)âŒÉ’<É|œ·”|É?ìÈï°1ÜÉ!Þ¬3[ºÂ!\¿Ë½¤L©Œ›|À«,J¨ìʲL½núÊŒ*¥Œ¦uj!¶ìt‹óÀ¹,¥³êµ^[«Á,jƒªÊ†Ç³ôs̩ר Ó˧|¿Ô”¨Òl{ý»hÎì‡é‘ª1K~Ûìz¤êÍ­\| 쫪ÌÎ&Áíôªá¬ËÃ|¾„“Φœr¸úÎÀ#@h{Íþ7Âõì²&ü¶êÌ“*<ËËÊ * ›Ðw®˜üÐíÄš¬$]Ñ5<Ѭ4ȽÑà ÑÍeÒ&mÑ# þÉ'MÉ)ÝM%½Ò0ÍÒ§Ó’ÜÒ5DÓ8-Óy—Ó‹lÓoõÒ<Ô{œÒ@-ÔxìÓcÆÐJ=z׸Ô53Ê=ÐR»åŒÏU]OVÕS ËWýÏülF±¼#ü©Õ^ ŽÎIÁ[Õuì ÌiÝÕe6Ÿþ›Z ×j×úIž“š”n]Öv l“Àúû×d ÛÉÎߥÀ…}×f×И–U÷ÕŒ~ªØo½Øm©=uٜ݊ êQUú¬PåÔ Õ®RÔw|¡†¬RFÝÚkŒÔê¹N«-Û…ÌÚ®}Ûb ÛÃë «ÝQ½m)¸Ü•ìÙ´MȪ]Û‚#ÜÊź ÖÅýÇÇmÜÉþ½ÜÔ ÅÍͱZ5Û¼ÜPUÝÞÝÄ×Í&ŸM¥Ú EÚmÚí×ëÍW„}Ùð½Ûñ-Ùïí‹ó=Ùíý{a •c}ßõíÞkžô߬´ßÏ”ÿ‹ßþ­«* ;ÅÞ N£­×R áޤ£:Á‘mÙ®àï×àˆýiƒMà$RÎøØ¶¶ÙÞáåu‚þ<à+¾ÉÞýÍâ%®z ŽÞ2óߨ7ã[÷ÝmÞ7^½Ï äh,ä1.Žiä¯Íã'ëãÉäjŒä6¾|K.åGîäÞKŒ¨åd¬åœã:3`nweãNä7Žæx}æÎæÍ¸æo>ç>Œ*^åxàs+àþt.çu>á(¾á#žän\>×bI¶p^諑ž©~é&žáí,&ŒNèH¡æZâL×ç˜.áÃ9~¸üéy®{¾úâž^ên¬5¾è’®Tz9æ¬réTÝà^>ÆTîêXý’]~ëQœë©½WîëíêiëÄ^캾rÞìZ ì-«éeÓëήÄоÞÒ.S²>ë¯.“´¾ìœíÁ>îNùíäÎânîêÞë®7£nì^ ådÉ}àÞØíž¢Þêçï÷žDˆ~´û“éN³ž\ð^‹o˜ãÌáõ®Þ¤wœÂ}Ýðµûð5ÂÁï~ _œ¨Þï†*ïÆ{çOÜÝnþSÛ®ãŸñ6Uí,¿Ã×" ê-?ó7üòö­ò@Eó:ŸÈ)?ò÷±ó4oóÂ^ò} ô-/ôJNô–lô,ô ˆóçsòèÝóïóh¾ñV_õ³óPoñTïñ`_ñ]?öüŒõZöܬô^OÖföd/¥jÿ:ïžõ„Öö´IïgO‹vÏ¿hii=›÷/¹÷ýüïˆN÷Í'øb[ð:÷öå÷œ±ðƒÎøboøzñí)ù_êøzñ”ï“nÏ øž¯ù"ò¢o™\OœR?õ“ú°û²?û´_û¶û¸Ÿûº¿û¼ßû¾ÿûÀüÂ?ü·ïô@“úe*Ä¿üÌßüÎþÿüÐýÒOûÆoå¤o®ÓŸýÚ¿ýÜßýÞûÕ8n¯üß_þæþè_þáiãŸþîÿþðÿ½¿þq¾ö (ÿøŸÿúþôoè®T!Bà@‚ D˜PáB† >„QâDŠÀHFŒ9z̲#G$E–ühReJ–!Wºl92¦Lš5QÂÄióäΗ:{Þô9“§ÐŸCsEj4èQ¥I‹>%•)Ô©R—^uj5kU®X›~¥ê5ìV±ZÁš{ö(Pµe»’…Û6nZºhí¾•›·.Þ½nýνûWo`À| 6œXpßÂ9/>ÌøqcÊ“-KÆY³âÊ™9_þÞ ù³gÑ¥;keKúôèЫMƒfûµjس[×v÷nÚ½[§¾í[¶ná^ÚÎ;øòäʼn3GýysèHSÇ.]9vºcì¾]»sñÓÇW/Ÿžüzô?¯ŸÏn^þ×ã빟1<ûøêÛÿï?øœOÀÜÞ+@qûÎ;Á{ÐA¾ó/@´0à ¬pà OB°C =üL ýŠp¿Ed‘C?|QÃgl5‘j”Dz¾k°£ûzÔ‘ÆI$RHÌqÈš‚dRÉ»ë1B‘,²I*LòJ+³.D%·\ðGí³ ,«ü2M-ÕäÍ5gòòÍ6Ï„þëI:Á¼“M7çijOãäSÏûc&>ùî¥~x¯×¾|óaå^úê½·÷õC&ÿ|ùç75}èÅ¿?Èð¿—/~úÿ/ŸýØ—?õÑidþ(?¾ÜÕ Øÿ-ЂøjàÈ?G¹OƒHs^E Bpƒí+á SøA"Ð…pò` W(C²ð…5”` i¨BÞ‡¥‹¡m8C!îpˆ†Ëa˜îVD&щ=ôZ1”5ÑŠM„b]'ż¤ŽL«"xÄ1^‘v\ ç4¸à™Q‹d„£Û†F³Ej,\ÅÇ=ÊQvA|CR۽чìc"?ÈÍiÍs$)¤Ÿ(IC*ratÄ‹ñ³º%N’žD$(•„IÓDò“•e*QyIF¶«–¤d,O)K<‘²N#¬È¼p™Ë£ìÒ—¿f0/þ²JÓØ²)`E„Ìÿ%Œ™„f4é§LX&mQÏœ5­'ÍR9“›ßg6Uùcþ› &C¾©Îp¶ÓÓ&1­ÓJå­S—öìå;õ¹ÏsÅ“–Œ£ç2ñù­sžÏ›üDhB‰åÏYÎóžÜd訊”‚*Ô¢ èË9“t>oamGA:R’–tRãW@«Jy²ôŸžÜhKW:S”º4T1}©LkJS²r§?íiN…ÚЦ|L6E*O±b¦¤5eô|ÒQ•JÔ©ª¥py¤ªS h7L¨«àùê›Ô¬2E“…¢PUÕúü8Ò­âÑX‡jS<¦%iÕª\åSþqõ8œ“j^×jH;þµnÒkbUs©®¬ÍY›JAª.­Žlf»ÔV¸º³à™¬d÷¨Æ) R³såwÂ:¯´ƒE-(ϺºÓ–µH^²SmC;TSîÖ¶3Škaû[ßn¯¢Õ­sTkRæ6×¹Yás¥Ë¼äBò¢×Å.­2겊fWšÛ•§w¼;^ò¢ ¼ð+/F«Û¹ô¶7»ç¡{÷ _#ŠW¾÷E(}ÃÕ]ü2p½úéo€Ý©ß‡ ¢ÿüÝè.˜ÁÈ}Ût%<áçF—¦‚qJÜá·ÃSݰ‡,bË2Ä1ŠKÜЧØÅ+&±†Õþsx§Ç©qŽªÑXűíix ãáòuµGn¬„~lcÂrÒleZ²ŽaX×Ü*ùÅ@v •ùÊ+3+F6²aKëã.K¹Y…5Q]ÍŒå”êÇn0nËåUö‹cörž;¨Æ7cMÏt¾i¥d×5ÿÙFËmm¢—›16pN¶l¤ MäêàVksÆ´áz hJ¿ qît£«ÊåPOº˜FuªUMÝá¬ÚÕ!-5ˆøë`ZÓ¾³®5Â4Œë\÷¿·öµ‡qŠWÜâÇxÆ5¾qŽwÜãyÈE>r’—Üä'GyÊU¾r–·Üå/‡yÌe>sš×Üæ7ÇyÎu¾sž÷Üç?zÐ…>t¢ÝèGGzÒ•¾t¦7ÝéO‡zÔ¥>uªWÝêWÇzÖµ¾u®wÝë_{ØÅ>v²—ÝìgG{ÚÕ¾v¶·Ýí<@w ÄÝîr§{Ýåþv¾÷Ýïç:Ýóžwˆ~ïz|â¿xÆÿüî…?<ä ÿøÆWÞò—Ç<Éíñ»žòs|æE?zÒgþ~ó§8áK¿zÖ·^ñŸW=ê]?{Ú×í‚ß{ìA/qÝÛÞ÷¿>Ó ¯wØGþóÁG~ò•_õÞ/ßùχ~ô¥?}êWßú×Ç~öµ¿}îwßûßÿïE`ññ—¼ü@?ÿÄÓ/òõ÷| o?Èã¿ó÷S|þ¿øiŸ~ŸæùO¹þƒ¿ÿ{¹ó3@û#@™;@õK@ý½¼¿ñ@”À‡“@¤@ˆ«¿˜«Àœ@ ¤€þ+¿ ÔÀ ´@t¹øSÁAA dÁtA À–[Á„Á Á<Á,Át@À+„¿„À$Á„ÁDB"T@ò3BlBTBìþÀ*T¹!tB‰ûÀ#¬@*ÄÀÜÂ'´¿(Ã/lÁ%´Â* ü»õ‹@)<Ã&TäC,D9-ÄÈ;Â9¼B;ìÃ= @.ô?1ôC6tÂ@lÃÓÃ84Ä)¼C@”CAtCƃÃBŒDH”Ä:<ÁE49GÌÄ/DDN\ ´A>¼8EÔÄDdEôDóKÅIÅ?lE%4ÅJ$½4ÃDCRDÄW<9]4D^DÂ4Å;lÀ"ÆY\C_¼Âd,ÃeÔDc”D`ÄÅ7$DAb‘ê¬i4©Ó¥CBU*”*Ó©O«&mеkU®Z½5v¬Ù¨V¥†]{öhY´YÛJ|›¶n\”tïÚšW,Ü¢~÷²U+w Á…ÉÖ«·ï`ÄxKé8±åÈ[ôÃÙíäËu+ÿÍœ“´é«§G·ÝépëÚ¿~V–ulжg‡Ö}3èÛ°]û¦ ¹xîÔ»‘÷ö¬\7HÎ~B—ιàaؼKÿή¸9òãÛeþ{/S9t‚ç¦>¼øò­ÜÉ&þðxú9…_7Üš¿@ì÷¥~ÝÉçž}ÖW jÇàüéׄй6×€.˜aƒ*h x&×™uNh"€–—bˆ nX†Ëµèa{ïuö_‰Jxa€1˜Œ PÑ™H]‘ÎÈÜŠ. Èã>>&$“S>ä{êÙ¨£ƒM*Ye—\*Ùã“Ržhä™I%nk÷¥—m§[Ža¹e‡qÂG&›{º™'_7"9] $¦GåŸâ19¦¢Pö)§y6ºž¤‘N&¢¨1Z¦£aúâK:ú¦sž&§)Ÿ§úé虆'§þ€Âš¨«¤î4¨¨¥ê™ê£»v*ëjyZJY®Òú±Ãþúi¯±2;+˜Ç*kª±"Û*´ÕJ«+µ,Z‹W…à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼â"Gï½øæ«/»Ú‹-‹~€ ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñų·\ÀwìñÇ O¬±·N:»Ç!§¬òÊ,·ìòË0üÊ0×l3Ë2›L#ÉTÐ|óÏ@-ôÐ7çLœÏD'­4ÁFÿË+·Mö¼ôÔTWmµÐMë…ôÕ\»œu©£~·u×d—möÙ]ÕØh·-r¿ÉêÛn×m÷Ý+«ÝþÝx÷]°ÞPoëtŒûnøáˆ'®øâ‡ÛËøã#÷µb6*·à•oz¹¿™£¸åŸkºçƒƒ^ºè§“Þ¹ª›Ç=:ë¯?:ì³Ë¾ºí<“¼cë”ç>ùο—»¯¼_¼ðµ?|³Ë?{»òÉ3½ó¾¿{óÀýôÙ[iðag{’‡jÿýñáwk>ž«–¸ýóÒÃO=øºŸ’~äC~Ôõ³~ÿ*ŠP4î- {4à´¨§[9°:ºÝþ…Àʯ{ÄÜb&ÅÁHAhIä\õBè:†NŠÐ$À^0/´à›„ÂþÜÉBö3¡ÿH@öŽ~þ¯™¸Ìt%®¯‡1Ô ½·C÷Øè5çÙ’pÞ7Ã$Šp‰<N‘¦H((>Q-DžK8ÆþÏ;WŠˆ¥¸ØÄ2º°Šp¤_ ­Ã’ü9m‚¦s#}h¼,Š105ü`Cš†GÔ鑊Xä#s((ƈLDbÏÉ7f¦ƒâ 'éÇBªŽ“BôÏ®¥4t©L© S`³™5¦´" Cʧ2¦P•iÓ?§•4*Q}ZA *q©Guå3“êÔ+BõªHMi0±*ÕœFu—^å*X©:U­Þ´«rVùÈÖ¬.ó”Äd«\ͪT·Òd?iRYß*ËUõ¥XãJמUê°iÌëZ ûW¦š³±_%,_·êÇâµ?”¡^ÛŠVÆrv¬žëdÏŠÊ'Ѳ…ì`ýúYÉVµvõþ]b©%þpt´uí,nkÆØF–µ¢-j M$HÞ¶º}mkÚæîö›ˆEOtS»ÜŸ"´Ï­nS¯ëÚ:Ù ÜenvƒëX|†×ºŸU+DÏ»]í>Ö½æ…/xå[Pòþ½ö]-~«Ü¤Î´^þýïk"àø¿ô]¨Oº`³5í£&°ÊFºÙüV–Át…pÐ,áo8Áë…¦†v`{šËÃ(¶…;Þ c·#þ‡SLã–­Œ ®]Œ‹&âKdÇ5²Ân|ÜßÈ5#²’³0YÈP˜’keaEø‹Â½²“¯Ìå.OÓÈ$­2vûËßòÎWÌݽoþ{Ñ,^2·øÍn޳™ë[f5¿—Íû…óœ\gý®¹Ï¾õóÜ=‡ÏֳŤÞÜŽÙÐÔEô -èøJÚC—5.o[ùèEŸ™Ð®ô§)MLJW³˜…k›!}[9{šÎ¤.ô« ¬ÂæÕ¤M³¨aíê]ó9Ö¡t©ñÅﲑ²²öõ¡A­ka'ÛÙÁÎÐlOÁB»ÙÏÎv´·mn¯zfµ¥ 9Ýír[Ù‘fö¹¯½n'N7³‘ªóÜkvÓ›ÕaV÷½g}´ïZ[ÛæÞ7º[ï ë;ÑÏk43Þno ÜÞ/8‹ëÍð‡W<âüN7°Žñ×ÉË ˜þ ¾ñ†s|Ò×Z”•6åh]zÔ)?¹¥^—'¯Üb-Íg^r‹;¼ãG»9Ñr®¾—óZâ86ú¯7&ô¡#Ÿ8Ò‹¬ôeÓ°éX‹zÒw󩿪êG±9Ö#öt öèG¹×©¢»Ý]Z§:מq‚×=ßgWûÝIs“ûÝç2ïúÞ¥>ø­çç}üßÑþs½{œïkwùÜ—y^ð'|æ ŸxÆR¸vôç)_x¹_žî›7}籕é=®ñ•/úä­þzÌCÜ.¦Îª5Í^Çßö¥ÿúì5^{'‡»õ$"÷â}Ÿvà§^ø§'ýóM‹#§º¯ŠÏ¾ç—þïüßÛ¾ùßÍ´uïÞÇúÅ—¾÷Q¿~õƒßø¶·™Þøî¿ßýõÿèiïõÜÛü®{Pvv÷|l}ü|0ÁJ¨€’‡€Ä'€f—~ h€#¡pó¶}ÚÇ|ùÇ~÷Wí‚hyH‚h‚˜G€ôv.˜.çw€'X€!ˆ‚5øccGb1ø€3ˆw=y¥'v9è0eÇ‚%({Hƒ#¨„*7„*¶ƒ*x„8|L¸aç„OH€>¸‚†Ä…Ÿ„X˜dPˆ„?¨y7¸…`†/S„](…è…¥‡ª/X‡Ý¤…@˜‚d(‡°Ä‡¹ä†F¨‡S˜„h(ˆoˆþmhˆx†yȈf¸„…舜ç‡ó£ˆ‰(‰ªG‰Dˆ‰Øøg…UÈ}úGŠØxC4Šh (‚­hƒžøˆwY®(Š‘‹“ˆˆ_h‰»ØIþ·ȃšØSº‡Å8‡˜ˆ~$ƒZ¨¥ŠøŒh‹Ÿ(²HúC}ŦXÆ¥ŒÇØ‡Ýø‡¼hŒáˆŒ]5~ÿÇÛ(ƒÃTãèíŽÉ¨ŽÁ3\vb}¹øŽ•Âøùˆ‹™>¿øn·øŠÎ¦ŠY‹ ‹ X¬hÿˆ›X†÷¨QH[¡ç¥¸Š ¹yŠÉIŒ%ÉŽ¹‡ü8‘Ëh‡.ù’"‡þ‡Õ’9’s¢†8¹0lØ‹þH’)9ˆÂ•“By0;)Ž?yˆ'ùT6”LO2Y‘=)I¹€MÙ”EIŽY“49Ò"„UaWéŽG¹ˆQ¹Çã•_Ra ey‘cy‰V“r9—è2†@¹ŽJÙ–*9•ÿ–•\É‘"¹•3 ˜I˜ i˜°è—ƒé‘iˆ’…ɘù˜ZI™)™‘阘y˜›™˜6i–oɓР•£‘¡i”zy—+i’§‰•Ÿé–©‰”­)–±I–¥é“µ —·)•³É–» š¹)𝹗½Ù¿ ›ÇIœi—Š•Ù™É™ši™‹é˜´è™‚IšÃþ©š|Ù[Á‰š¥õnÀØKÕ9ÎÙœÒ٘晞“YAÌx|ØIÚ™¦ù®IŸ¸ž†Q}ÚŸçy™ì™™ë9 êY eŽj•ŽÀ™œÜYœ,¹š(iŸ´©Gôè]Š5ŸòYŸ *›ê›ÛÉ¡á™IâIžúŸåi Š¢ÐI íÉ| ‰ž,š¢-£+ª¢þ ®Œ':£6úœ7J£?Ú£0*¤ ¤>z¤CÊ£J*£L;tù¤P:`T˜¤M¤Kꤲ¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦l ¦kiœj›qª›¥âmz§xš§zº§|Ú§~Ú¥oú Ý©|þšŸuú§ˆš¨Šº¨ŒÚ¨Y¨¬Ù¡pŠŸ¼ieŽz©˜š©šŠ©¡*§”º ‡º©¤Zª¦zªeÚ©yù©tªÈ9ª¨«²:«œj— :§Âéªm¥¼J—¶ ª…Z©¬š«Á*ªºÚ ’*¨©Ã ž¸ê¬Çz«Ñ ¬&Z¢8j¥UФEJ¤;š­TZ£ G¨Õª¡ÏzŸÅúªÓÚªç:ȗת­Ý ®Þº­WŠ­òÚ¹{ 8¨ûº¬žZ® °JŸï™&$*zéJ¬ãj¨ ­ëЬ·‰Á*æ÷”äڰ溰Â*°“Z¬Jž;¥ô:¯ñj¯& ¯Öj¤jC+[þ\ýš¬ÌÊ±Ê ³ÿб‹ŸùJm/Û¬û®ßz²?‹²û°?f;+³1k³K´Ôê³#{¯î–‘O ´U+´ ˴ꪱƪµ ë´%‹µ«´;®½ê‚¿ºµ`›²Üʶõúc´·¥ªªV坫д5뵋v*·~[«›µ\‹®zÛ³Tk›¸J·}‰·wK¶3˳7»7Š[¹‰Ê¸Þ)¹K;¸Ê©¹e[s–º}Š¹âº¶C˹ë¸u[}+º®{§¤{´›´…;¹¨+­{s¶n—¶_{¸nK²¿ µbÛµ·Û´¾{º¦+¸É;¶µ»¹ËK¼ÏK¸Å«¶Ç«¼Õþ˼ÓÛ»m‹¼× ½Ý+½ƒÓh›&»Íû¹ßÛ¹ªÛ¸³›·ÔҮؗ½{½è»¾[¾‘;’9!ˉa´þ{µÿÛ¿<À¢Ôz7Tºç›ºô»ºž{¿ ¬¾…*±ízl¹öÀ™›¾lÁ¼½ÖËÁ„%çHH½—À¸ ¿†ëÁÞ‹Âà›j <µ*<¿öK»&l»ò«À<¢Wâ>0ü¶¼V+ÀB Äû€d´ô‡ÁìÃLÄ?̽1ŒÃ®¢£<Ãì{Ã%ŒÅÆÅYLÂ[ÌÄC Å`ìÄM,ÆÀkÆ÷£»!Ç»ñëÅÔËÅ_|Æ­ûºtœ¦±›ÄL¾5ì¼n¬½NVÇþ€Œ¦wÜÃgÜÁcŒÆALƈÈŒ<¦ƒü¾ZüƇlÈ…Œ½ ÛȘü¥Œl LÑìÇ•œÂœÉ¤¼¥›\Å{l¾p,É¡lÄ£\Ê¥|ÊkÅõ›ÊLË <j¼ÆkÉ}ÜÆ« ÊÂûÄ”<Ìe\̉ŒÈE,öìÉ¿|“ìËÁ ÌÑ,Ê­ÌÌŸLÍ×,ÅÙ ÍÛÜÅTÌÍÏlÃãÌÇÓìÍÆÆYë¾ê,ÍÕìÊßÇé¬Èô|Gùû¢Ö<ÏÊLÌîϬ¬ÏÈ|dð©#áÜÅçLÎmÎïŒÍå¬Ê¢"ÁD„Äý ÐÌÍÏùlÑmD;[ ÏÑË,Î íÐþ,Ì:þnã6 Ò-Ò-ÍÐ%}ËÍ<7:¬³#mÐ MÒ;­Ó'­Í! ›øÜÎ0}ÌÓ<ýÓèüÒÈYÐGmÔEMÔ.ÓòÌÔ2ÝÓUMÕÿlÕIÔW­ÔÝ>&bZF`»|Ö2ÅÆK}d–+Ësü·Ër=ײ<¾x,7oí·nÝÖ¯<×~ÝÈu=Âq’×r{`mm.ØŒØj­5|í_}?Š=ÙtÌØ½l/‘ c™ ·”ÝÙ›—¹Ü•Ÿ=£½Èž}ÚzÝØ ½+\FÖcmÖhÛܤÚ&íÕ]ÍÕ>mÛ¹ÛYÔ»­Õ( Ü@ÍÛ[-ÜkíÛ½ ÕSÜÅÍÜÁíÜÃmÜaþ½BÐ}ÜÊýÕº½€< É MÓÝlÃø#Ý«ÝÍ}ÝV1@züÝãMÜ|ÂHG"­!ÞµÍÞÑMÌù ßéÝÝÎ<Ó/R°,ßÕ=ÝäýÜeìßzvMÈ^ß›%o§UkvtÑæýÛ¾Þ$ÑR”Á¸ Á5½-[ă"¥õ,áRÝ/ÝÑAÁ³Ü᡽áW1GhBÝžÜ%~ÛBÛƒÄáê=ßò=îÝETá<.äÞ]½÷-´]äüý¯¡ÖNäûÕ.,Ñܽ䵼ã\K nÝ5Ná3¾áœàU.åÞå4>âOmæå­æeŽæQ}²çwrn`I^„Úzž¸þ–Ýv{º}¾[yþç„.«¾1…®¸‡Î3ƒžè޾©‹>3žÚ—ý!>é˜Î¨‘N‡™N«›î‹ê€+²¦-ê¦úé®t馾ê°Kç¬~êwnÓu>ë+Eç´>S±~åú}Å»®ëVÞâ,®ã½ìXåN>ä_Þæûœì ÎæÍîæËÍì\í&ÞãÆ.¯]íPÎë¿.ìÙqwì.Ãô=íËîìèÁáídþìéŽc?Et”í6¾í¾þîë~ÏÄ>ìî~ìÀbàTíê.àçnðE,¾‚­ïORΟ,-íOñO~ÌŸá^ìÜîðÌóáVâH×WðOþòÈNÔ(>ñœ¬ÄùÝí/ntT~_òÔ~ï®ÒÄ¥ò¨ÌñùðŸ2ï!^"ò5ïåê|ä+æ+ŸÇÿM¾åoòJ®ïC½óþ>î<ÚZ>óDï^Oâpæ ïóOö=õ4ÿõi^ôg®öonÏ·÷r.Ž3÷µ^éóêz¯çD¦ê{ÿ§¨^Z?ø“Ý÷„?êü{‡¿ørmøŒ¯é¹^~ÿø”Ïç˜]ù—ù”1ù˜ßù†~ùž?ºšÏœú¦é úyø`c÷®÷uÿúÖ4úKlöýîòµö]önOðl¿æ¿¯ì¼?ükßûÚ>ôSoûÿ®ûÉÏü×þÎõÍýÏoíeïüÕ/ý×OýgýÛ¯ý·ïñ»_üÄÿöãïûÆoóR?ýøþýÊõWŸûÜÏþÖßýë¿üñoÿÞÿTjïFüð^þÑ©“  ˆ0!B* táCBœ¨°aFŽ=V”øñ"H†!IŠ´˜ÒäH–Q®TÙñäÌ–0mÊdS¤KšýôóSgÏ›yæ,JçÐNG™>MŠ´äÒ¨P©N}y5ëVšN«~Õ*ÐkX©\ËŠkÖêδJÕ®û–ìZ´‚ú9x7oP‚?…¶=Û0ÝÀãºE\î`Æ8+žõ1aÊ‹#_–k´qæÄ“7'þ6ü²Ù†?Ú-è7õêÊd=cm™óèØXkÏ&ü7`Ý·}ׄM[xoá­57ÞYtràAÞunõiæL‰W—¼\ôu펻ï¶]ü{]ð廎;rè™óÄ;}¡^Öè¹³wíž·þà÷Íöï·Üø›-ÀôH#ð7×cK:Õ@’î¡¿ðc‹Be»ÐBàþc¼ 9lOÃq»‡;qÀ5܈>»ø Fè¤ûð¼ÿ[о³»±FAdqÇüz<ÐÃ" È÷lrðĉ|Èã¤ô1J“¤òH+‘ 1Ë%•ÜÌþnrÑË.¯4QÌ…DPMÙTÎMåTþÑÌ1éäÑÎ5ñRÏ7ùlÓÏ9­Í “Ð< ÅqFG…4RI'¥´RK/Å4SM7å´SO?uRD„“ÔQ­+ÕSáòcW_…5VYg¥µV[oÅ5W]wåµW_6Xa‡–Æ¿T´OF«LC.Yl•Xi§¥¶Zk¯Å6[ms5¶Yõ¼rY-Áµ1YÒ¢Ý6]u×e·]wÙívÕoå ÷YÉÝPÜ÷Ð}·_ÿ8àtã5·\}Ã,ØÔ„U]˜U†8b‰'v•àƒ•µ—Yz ÎxÜ[â—b‘G&¹d`-î¸Ð”¾xφ½ûذPg¦¹f›oÆ9gwv4æ3Wþ¾óå …æøX–v¹å?‰Î饕j•ZêEŽë©ñÝrÄ®ÓdK«1¦:i­¯.ûé³Éæ_±×tì¸áNTîºéVØî¼ñfXï¾ùv6í¬ßú㯠ûgÂÑnÛçy™>ü^ØâƒÒmÅOüq¿/7ÜrÍÿ|q˜3¯—))Ï2rI7Rô¹]¿ö½eÿ›öÀ1ßfw‡5ÔÅUÝcÖÌ}èâ‹Ætã•G¾sÇ5k2úÕLû½ãà‘=¾iÛGÏþíí—ÿ¾yÈ=/½qçú‚N¾«÷šüÖ“_{øçw~øëŽ_ìø"Œqÿô+Þûê×=Î/€Äcžüþ˜@ïµMzúûÀFÀЕê~Uc`³wA³åOƒ äàŸxG¹2ÙEp!ý h?÷!Ѓ ·B¢4IN2dÜ_X>ªpƒ-Ä!ÛzÈ‘b-ˆ¯ó!¸Ä1vIŒŸgE 2‘…M´"yHà 2„g_cÅ8FLaÑŒWD£¹™Ìo,Ê¢˜Å.nñ‡gTcSÚG>öQ`r¬"ë¸Æ;¦qzôc"ù/@ÆŽ;$¤ ID.Ò’—ÜV#&ÅÚQÑ‘“äÚ19JRþJ“zãäí†ÈEJ¦Ò1¢,e,eY«SâÍ•àóä&J2öÒ—¿f¨@þ¹ÊBæñ–â+æ!©@Væ•»$¦$ ÙJh63šs¦5µ™Ljf“›Î´e5¿yÍ@Nœ²[fÉùIs®S—Þ”¦1ÅÏÂÜjéü 6Û¹MzvsŸãä§„ÔgÄyêSžð4¨2 ZNcÚs uC›tÂ…²ó ÿìç9TÑ„=Ðw¬¨ŽÊP…ŽÔ¢%ÅhB[éœþEgzõ`JIêϋ֥6¥iI©ç‰Â4u}¦Iß)Ó“æÔ¨øòèi2Q‘u¨8Õè N¡¢¢WeiD³ÚT¨º3¨NýjW:Ó$2UªU¥*XÓ*V€¶5£× éYՊΩÒ­vëFïªþ׼ʕ­okQ£*(|.5˜—:àa+Å6Ö±ÍÙ^ýzHXJ¬–²«lÄP–ÙYvÖ—åë_ãÇÙ‡VN¤ý#NPëYÖÆQ²„májYH½‘R­Åí"M Û×BM¶ŒL¬mU›[âöq·÷¬ë‰~ë¯ãbm¹ýÚlq¥ëÆæR´·Îîðžû®èN×»"«.WoJYÚB*±å}”jÑ»^ö¶×¡¢%«W×:ޣʯð¬}CKßÁ"÷ºÖí+oìßô¿â­o`ŸÊ_ýN6ÁnUi \`ãwÁ,„ãK¨¸Ú1ÃŽpƒlá°2XÁŒzjÔyâùb8Ä,¾¯‰5œ_þÜ`Õ4Z½±O#ùâ_X–1ˆ7ÜãÄx4ÅÊ1 },b“¸Å?F0”cz%–¾ÈžL埒Kìâ! ™ÆD~2“'l¨NäªÜ 2½¼dï—Ë_^s‘_ºT…Ј™`Žñ›ÙŒg7Kù§6sVmÜÒ yX͇î2¢á¬è=Ç9ÌY2+.Å d=oÙÏÀK®ƒ/]Ï­¢¹Ò泦'åQO9͉Fõ¢SÝhF[ºÔ¦pÝ;ëÈÆÚÔŸÎó¦ÛèÔ|—á½µ®'xjU›ÕQÙ®¯¹ËkL3Ûz™1±Í’le· ذvr®_Ýl[cûHÔ®öº®Ííl÷yÛÏvö®ÿîpþ,ÝÃÆµ¹Û,êy3¶Ý®í6¹¥íêz7yß¡uÀmönÄ•›Þ¡Žv¼îhm÷{Ìÿn8Âý­ð„ »à—·ÄNñ‰[\rùF7ÈÕmðŠŸ{ä_x«AÍðŒ³<嫿·Æ«ÓáÃ|å*¸ËKîpJ{Ü-G¾³Î;nrxû\x$:Ïy*h¦'YÅù´yÎqÞò©¿ÜØ1:KŒùßoÿÙÈþÒª¿ë=Ðk>Ô+@Ü+¿ÿ³,‚Àéó½¾ê+¾ ìä=$ÀÌ£¾õkÀüƒ? |@Ì@À‹<ľû{;Œ»ö¢ýë@D"¤=´=|"Ô=¼@ä?ÜAœ"?Ô?0S»$AæA\BÔAåÓ³SÂ$Ü@"üþ@*DÂÆ+Á(º<k©)ÔB0¼1|<,Á0t.úH‹@„B ì$!t?7Ä?^Jô‰4½;Á'¬C9lA:LA> Ä;º;Ë{==,B+ìAE|A?ŒAA\ÁI*ùPª§cB3¼D4ÌB2ì;M<ÃMêÂ.üÄ2ôÄLäDÂ+E'ÄH<ÌüO¤ìOøüO† ÐW!OåœOßíU Ö-MUÀaÿýÞ .ß%Î^vb)æâ.â"ž^¾á ^áÞea­ã_‹¤b ÆâÈ=â*ncøµb÷ã&ã>c3ÖãäMb&Îc>þãåÝcAäAöà7fã>Îâ@>ä;FbFvá:Öà9–_EvcG†c4Qʺc#ÆäD†äFä¦ä“°Ê0å1.ee%¶d9àÅ-KNNeO^å2.ä\&ä]ndÕú˸|½ÓídTþdR–ä+~e;æÜѽSîæZ&æ[ÆcCŽädžd,–ÝÆtæÚ=Õá-fU>f:¶fdeͬ3Ç Sjåo¶åp®äVöã”XÜIÙúmçqþgx^duve}f¬\Õ²aî^hhvŽfwÖ_„FMPæçxÖå^Vh\æåjögXÆçwnè}~hŠÎèKÞß4†Æ56æ‹Nh’feuÞb/Vé•.a0.hi~䎶èŠVfÆb雯ivio†éL¦ék6i‰Nœ&ê¢nà\{>è žæ^gÕ2ꨖj¤®gæéˆnê‰~j›–ê®Îiª¦eƒ~i¬Ži§îgŸðê´fi°h‚¾j¦.k­>kYigip†kŸ–éšÎk†6k‡–kÀ†è¾éŸ&ç½jÃÎgÄ>ì¿ÖèÀ~ìÁVlŒvl&k½®ì™fìÅÎl¾žì’þìþ“îìÊ¥[ȶlÂÆëÐjŽíÆ6E)Tí¬–ìͦlÓÖìÖæl(‘åblÖ¶mϦmÐnÑþíküå¿îÕÞjÔ¾çØŽëÙÆíaæµÛæ¹.n׆îëÎíìænßþ³lv:DìíåvnÌÖîÚînòNnÚÞV´Óòöëóîèžoù&îôöšyæíÈöîþVoú¾oÿ¶nü†?Î\ïçðñðçïÿ¶ofÜooðwp ?mø.ì7o ¿í—m¿p oÿ¶º6ñë¼ëæñ pÂHiµ†ñ—ñ£Nñ¥ÆðÔ^qÓ™ñçñgkD•Þ±fnœïñ#Grœþþñgë·¾qG#Oò)§r(^rn†Ù°îéŸÛ*÷ò/ÿâò''òG60Gó47á+×S“n3ÏÌ—óvóÄÎq(÷p¯pïp·s8ßp>ó<ô=7t GtWô _ôt.?ôFïsAÿsB‡ôDgôLwtKgqNÇñG_褶jQwkRorSßòN÷óºª.uW?uXOõO÷t<ÇïyFg1wò;/óZïõUßnÿ¾ÜÒÍÓtuZvô¦tì^ö`gÌ;,TîõRc÷õ1çuk?v[oveg\J u’õ˾tIôd¯ospC7çßv]GuqWõm?wyþOwD×ï`Ær¬}÷!Çöjßõlÿuz7p-‡wd§wåÆôMGw„'wyÆ÷pç÷÷÷}'ó~_øtMŸôŒWøƒÇø„ßx/wB›óYswˆ¯x‰¿x=§p)Wó*gsj_ùBùJOo—ù)ù“'øˆ§økWy Èy5ßù:gvŽù†?zœú#/zíœùq×ø‘W÷¦Gó§ÇÀ‰Gy ÿy§fz«÷qžoëXïù”ïz­.yâ{ Wj‹÷x–Wzg¯ù£Ÿ{¹{n¯{¼¿ûyGzªÏ{¾ÿûzß{ÁŸz›{š|†/|ºOüo|¸_|»|½Ÿ|À|įüœP͵gòþY×ö¾7|ÐgüÌ(Îls¨?|©ïxÑ—üÕ·÷çÍ»³úxg}ÊwýËWý¤oða·Äbçü|ò ¯}Ë'}ÇŸðéÆ2·~¿ýâ‡üæ‡~Ýo~ð^ÙO}Ú|Å~¿Ç}ìïuwoë_~í—þòç~çÇüí}z¾¼ÒfûQßz€Wþì7~õ}ûgwïGÿÜ?ü·}óH°“A‚ R9ˆÐá‡#R„hq¢Ã†7*¼Ø‘cA!jühräI‰)]øi‰òe§’0+‚T9S¤Í˜8i®Üé“äÏž5yÞ:4hQ¡)eæ$ÚéS£J“RºªÓ¬P™j=þêuªÎ¯U»‚åŠõ¬Ø°`ÉŽÅi6-[«0ß®E[Ön[¸ñÊíë”nÞºiûåû×0âš„ã2v›˜`ËÈ’'S®lù2æÌš7sîìù³ÞЂ .~˜¡éƒS7VÌ:uiѧsÆ=;bíª~Òðîíû7ðà‡/nü8òäÊ‘û‘­Ú¶ÚÛ¯¥Jw~ØútÒÙ«kÇîýêwîsSï^nþ<úôê×o½õÝðÏ«æžo÷öû{åÃÏv~ýE§ßAå±w ‚ *hž{âÞ{ùÕ'`\¸_„ÿQ÷ ƒøi˜aw dà‚%šxâ r¸¢‡"²ˆa‡~è …3Òv¡sþ5ºx‹$¢ø#A §"…2îhdŒòé˜$„LÒˆ#tK¾èš|> y%–& %}\Ú'e‘T©¤—–¹Õ™«Uù›mºù&œqff£€`J˜f|cºh§|ê‰|ùéä€aî‰g—æˆh_ƒN"¡u2Êc¤‚N꘢Q^*f¥‹f:›£†ú犡"ù蓟~¹i“¨–ʪ¤Jªª™´¢i«š²ZŠkžjÊk¢ºz*ì¯Ä‚ ëÀ6Šl‹¾«,¥®ÎºVdÎЬ©dB‹©±«nË©´»v[븷–›kRÍ5Øœ¨ÉžÛk¸ÃZKî¼æÖ‹n¼ÅÞ o»ÓîK_µÌ’þK¬›ï¨ÿ.ûm«ýŠ«p´Ë‹°·ï 1·×t0Ç \°ÄRLïÈö–ŒoÈÏZ¼ðÊcË,Œ'—U°Á’ìñÁ)_ËpÂ2_ì3Ë7ü2Ïî ëÑF}{*~Ü´Ç:g{hÑÍ.ñÕàêLòÖ&w2Ñ-ãÔqå|gÕ1ÍoØI[½öÏpõÐEOMãÀyƒ<0ÚbkÝ6ÝH®´Ü.Û ó†…c­øßeôݯ¦8àŒ×í·È– ®9á•{>ߪFîïàoŽyÏœ›~øä™Ÿžôè—®öëƒÇ>±ê´³Žzç»»m¶œÁkÖúˆÂoÙÆÇ+¿<óÍ;ÿþüð¼¯ÎûíÐY™%sÄŒýy[È=øá‹?þÚW¯òïß“oœ÷¼_¿þoí?ýõÛ ü¶#îzÑïÛ}ðîͰ€< pòǹóU,}A oÈ(ÿÕ/„ 3x% *‹\CÖáÇÁ•…p}Ô Sˆ¥*̃^!Y´’ï„*¼!$C¹¹lý`ð´Ä ¦dˆF<"“¸<óí/uµ[`wF½(öm¾›官»,N‘‰^”žîºF.ÂŽŠfü¢¨Å'2ªŠqccÏ8Fþ‰1R,#±HG<ÎQuÔ£ùhÇ%ùAjrä!yGýåþq‹{dd‘u²oˆl$WæÆ¹92¼d$5ƒŒ²x•¼Ù)IµIÃý±“’lc"]¹ÊÅe²…7{ÙP9"Cbr¾le-!Ë`ò°x™Ì-ui0^†r˜¿¤"gÙ8`>ó“•l)["döÉ™Ôü&4eéÍpÓK Éå6O’JBIórä¬&{ ÎOF󌥬Ù)ï¹KKÖSžïœg<›éOzŠó(Ý8 ZN„4  |h?…¢Okµss íVE{PX6”£ý(D Òˆ†ô¢M蕨ҕ²´¥žéhaªI”¶‘†9¼)N$S[îT˜=å¡Ms*Ô¡–oþ¤"-)<=:È µ©DÝ¡9iS£š”bT`ªS³zS¨2”ªI*R©‡U­’5…\ŨTgúÓ¨šo¬e}+ÏzÒµv5¬ÿ„Kóª×½*‘®hõë\½ºQ°’´°G5lU™iW…~U­‚½+cëØÅ:±åéc# Ùʶ³‰å§g/ëÓÌrö³Ý¬UÓŠÙÀ° ´¦U¥jGKY¥ZV²«íKÓZ{ZÒÒ6´¶•mm7Û[¢Ý³¸ÚÔ¥bƒ«Ùå–V´ÅDmrÅ™KuyìqÑ}-;cû\Þַ©K¶i³ƒÞìºÎe+w'«Üæþv»½æGô©[ØB×µç­ëz‡{ß¿6þÉLÈ|³[ßÝζ»ØuUF§÷]µ7ŸÇå&}Ó{[ï2W¿íEoÕ[ò6Ã>p»Æx¿ŽÊDS;à{¸f/‰] âS½ØÂ1vo~ lb‡’¯>þ1ƒÌ¼ XÂ2¶›[áªä%—H®?YÒQ6tªŒ|ékùÆ‘îòž=]hN—YÔg¶ô§1-9M§šÔoõ¤M}bXošÒþ®°Žm]j\ÇÙÕy¦u«uýjlÍ¡ØÆ>6²“­ìe3»ÙÎ~6´£-íiS»ÚÖ¾6¶³­íms»ÛÞþ6¸Ã-îq“»Üæ>7ºÓ­îu³»Ýî~7¼ã-ïyÓ»Þö¾7¾ó­ï}ó»ßþþ7À.ð¼à?8®ð…3¼á8Ä#.ñ‰S¼â¿8Æ3®ñs¼ãÿ8ÈC.ò‘“\Þ-)öÉ)3‡“¯Ü%9Ìc.ó‰§Üå-G6ËY~ó™ó¼ç>ÿ9½%cl=2E':Г®ô¥3ýÚF?ºÎ…^ô¦S½êV¿úÓQnsœoýê^ÿ:Ø{.õs=ìf?;Ú?^s­+éHOþ;Üã.÷çÜå*g;Ôç®÷½óÝáoï;à/øÁ¾ð†?<â¯øÅ3¾ñŽ×{×qÎíÈÏ›òCŸ|¾³.ùm[Þä_9æß÷®ôéî|¸KúÔ›{ë®o»ºWî×'[öß¶½èþzÔÛÝæ»·;ÊÉuá—~ö¦‡}Î/ŸòàGý÷G?·å£¿sçûžøÊw}ñË-ýä3ø oþõŸŸ{«OæòËNþî¿?}ó¯Ÿöèæ}õÓ|îýìOýØ_võ3_ýôÇ~ÿ»užýõßüUŸ¶ßý_ÓEï)Îû¹Ÿ÷韷•_Ö ÿÕßz ömì ÿþu n ÞÞØ= J`ž` 2 ù‰ Æ  ~`ú^ößù¡à  jÞ¸‘^³¥¾ šžB_ú` !í-¡ ÎàùÅÛ¹ ‚`®üàò`~ î±^ZáÍaa†áò ³à~_žàN¡îå_ø]¡öžøEávJø!¡j]"Úa÷M _!¶Ür"¡"æ!#¦¡Òáá=¢ûѵm"Áiârâ´y"&fbµ]â¿=¢#&œ*¢"Àµb–¢,Î"-ÖbæéUºIâbÛ½É.æU.¶É/ºT0²‰-N$£2.#36£þ3>#42#Fc4®žÈ6f£6n#7v£7~ã6 8‚£5.€9ž#:¦£:®#;¶c: ;º£5ÒbÙ1J5æ£>îã4î£4á8¤@¤8d8a<&¤B.$<.ä;!=žŸ=Þ#Äù£E^d2bFf$@¤G~¤,`Hbc9:¤Ižä`Jšã<ŠÐeL$E:ÜFÎ$5ö#FZãHæä8$H–äJþd;6$J¶¤ Id÷ÄäÃѤR:£M^$Nê$Tr#O~¤O¥U¢£Pž$QÖQ2RÊäR†%G¶ÝL>eTžeHž_NVåU^eVšäVŽO=åW2Ü^<ãg cKá¥gè%KñegøåJ&gÔ¥a&b&¦b.&c6¦c>&dF¦dN&eV¦e^&ff¦fn&gj\@;Bio-Graphics-2.39/t/data/t1/version10.png000444001750001750 1366312366325116 20124 0ustar00lsteinlstein000000000000‰PNG  IHDRX°s¯ñ=PLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ+LŽŒ1IDATxœíQvÛ8Eýß›èx5ÙÄ|û;ñ&z…㈱D ° ¢ˆ÷R÷iÇ™KÁ¦PæÛç_ôú ö'öͱhX}¶-VÑ.Ú†-¥ØÕ<‰­Å*_ÿC¬ãì×·šçŠõõÏêýîµpÆz…ý}zº{-ú5DZo—Ý/w¯\ _aëq,›dÂ5‡Šµ]øÊeë[.#·ÇýHŠÖÇ^æX—Ëßå[Û±^co—¿ë¥0±X·]W½ëö6ŽŸ»×Äb5&ïÛä@·hM¶š¼¿'Ÿcí¾õ=Ç/Zž­ç©ú5‡Šõ=Ç/ZŸÝ«ljžËò‘lŒX…ôçÙP®®í§,ë_Ò›çb­®®Ä2b!VH ±B‚XˆÄB¬ ÖˆX¤?OÅÍ*±ŽÀ°°?±ˆ‹X°>ìbu}m¹Ã'²ÛÇ«æ@±¶¶ÒE[°e÷êRó\±ÊãB¿ß !¥‹ÖdKc‰_æ…~î.…/°õ8&«îÒA¬—تKçÖC [sÛêÒ¹ÞWS-Z•}èÒI.V«K‡3Ö8[wéÐbÿ8yG¬WØzòž\¬Ý·èÒ™ÃÒ¥C—N [èÒq,VŸÍ·l&j Wï×OY&Öê•h''N¬Õ{ÖbÄB¬ b…±+$ˆ…X!A¬³ÄÊ–0±D³J¬#0,ìO,bÁ"¬;Y¬òøá«ÜÞÃΫ4–‹Èí0ì9ì!±Jëé1ˆ{P¬F_ —BØ=xÆúüùé1¢; {{pŽõäé1¢; {;çRØzzŒèÞÃμ3Ç‚!Öîëþs•ñ`Áö³ÓîcuŸ«Œ ¶Ÿå#X9±V-ç˜õ¾Ç¶ãG±-@›õ¾¢Kóæ±+$ùÄ:Yï{d;.É'Öú÷E,ÄB¬WƒXˆK±ý<ë}mÇ%†bYÞ¸ƒ=‡E,XÄ‚õamÄ*·¹-:ë!Öý¢gËÎÆŠŠUZ‹ˈÕ‹çÒØ³šbñ\{VT¬ú¹4™ŸòàÈjŠÕîÿY>X°ý¬¦Xõä}»,t6VT¬Ý+Ï¥±dõÅâ¹4–¬X°Ž¬¦X V—tEq¬DYQ±V/k±úYÄbõ³ˆ5Äêgk ˆÕÏ"Ö@«ŸE¬ V?+*–hÇJ”Õ ÖžE,XÄ‚õamÄ*téX±bÑ¥cÇŠŠUèÒ1g5Åjuép)´b5ÅjuépƲbEŪ»t>ËŠÕëùSz,:«)VcòÎí/VT¬Ý+]:–¬¾XtéX²bÁ:²šb-YÓűeEÅZ½¤¯Äêgk ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~±‚Xý¬¨X¢Q+QVS,X{±` Ö‡E¬mòäU³›]¬r÷‹¾=j¶`Ó‰UZ¿è[¼fG6›XuÿO½P­fK6›X¿žöÿˆÖìȦëiÿlÍ~l6±ž÷ÿhÖlÉf«ž¼×kêåjvdÓ‰µûºÿ\¥S³ ›Y¬þs•PÍ.lj±`ãØlb¾Òfy£tb­^,xv ±B‚XˆÄB¬ b…±+$ˆu’Xé²èe ±`YÄ‚E,X±` Ö‡E¬ígr¯š ØìbѰŠXsØBÃê)l6±hXE¬–†ÕsØtbѰz›M,V+†­&ï4¬"Öd–†UÄŠa»ÏUB5»°©Å‚c³‰uúÎåYtŒÒ‰õ_² b…±+$ˆ…X!A,Ä b!VHë$±ÒeÑ1Ê&,bÁ:³ˆ›[¬rûÀØr ³±bݯL·èl¬¨X¥µ±ŒXM±Z]4\ ­XM±ÞŸöÒXt6VT¬§½4–Õëy/å@gc5ÅjLÞ¹ÝàÅŠŠµ{­{i,:«/VÝKc9ÐÙX±`YM±–¬/éˆâX‰²¢b­^×bõ³ˆ5Äêgk ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~VT,Ñ(Ž•(«)¬=‹X°ˆëÃÚˆUX6cÅzˆE—Ž+*V¡Kǜիù¬.…N¬¦X­.rÆûÂÎbEŪ»tÊ»ªfØ«)V»Kgù`Áö³šbÕ“÷í²h<ÐÙXQ±v¯téX²úbÑ¥cɈëÈjе`ELWÇJ”kõ’¾v«ŸE¬ V?‹XA¬~±‚Xý,b ±úYÄbõ³¢b‰Fq¬DYM±`íYÄ‚E,Xv²Xåñc¹†=‡)Vi,q‘ÛaØsØCb•j9Þ'bÁ^Ø#b5zi¸ÂnìÁ3Öç}/ g,ØbU½4ˆ;A¬çO¼ÝaØsع“wæX°3ÄÚ}Ý®2,Ø~vÚ}¬îs•ñ`Áö³|¤+'Öª%(³Þ÷Øv\â(Ö¢Es³ÞWt9áÜ b…$ŸX2ë}lÇ%ùÄZÿ¾ˆ…Xˆõj ±Bb)Ö¢ƒg½ï±í¸ÄP,Ëw°ç°ˆ‹X°>ìbé¢MØmŠãUs XÛrcé¢-ز{u©y®Xå¢ÑÝ+g¬ØÒXð˜÷1-o^›Â¥ð–çÿ<ˆõy™lóÄ:ÀòüŸ={™c•ë\.…×ûjªE«²ÏÿÉ-Öíä½ÎXÃlݳ”úÁRÍÉ;b½ÂÖ“÷äbí¾µý«“/Zžåù?÷±Jß,ã>‡-=K5ÏeùH6F¬sÖn%j Wï×OY&Öê•h''N¬Õ{ÖbÄB¬ b…±+$ˆ…X!A¬³ÄÊ–0±D³J¬#0,ìO,bÁ"¬Û‹ß|<‡-téÜ^ËŸÅÊÂE[°%ýz¬ò¸Ð¯pÆz…-­' ‰×Ƕºt¸¾Â6ºÊmU–fÍ¡bÕ]:ˆõûôÉB¢5DZ­.Äz‘}òd!Ùš£Øv—b³ÏŸ,¤Ys¨XÉû÷'ªEk²Õäý=ùk÷-ºtæ°téХút‹†Õgó-›9’gC¹º¶Ÿ²L¬Õ+ÑŒò\¬ÕÕµƒXA,Ä b!VH ±B‚XˆÄ‹ôç©X¢Y%Öö'±` Ö‡E,XÄ‚õa öD±Xš ;],VaçˆUhX… ‹†UØ–†UØ(±hX…ÏÒ° $ «°, «°'ˆEÃ*ì$–t`cÄZ±¨Ñ6†xûVþ!½A¬~±‚Xý,b ±úYÄbõ³ˆ5Äêgk ˆÕÏr»a$†xË RXÄ‚õa ±`}ØÄêZã`¹Ã°ç°Íö¯Ï¾Å3–; {ÛZAú{¥²tѰúl«ý«p)„=ʶڿ ö0ÛjÿºÞdV-VŸm·qÆ‚˜¼#ìQ–ö/ØÄ¢ý vËG:°1b­XÖ´4†É‘M·‚±ÎaËà 9²ˆepYÄ28HŽ,b$G± ’#Ë탃äÈrƒ±`}XÄ‚E,Xv²X—ɱôÞÃΫð¸Ø)bmç§Ý+bÁN«nãR;A¬_eëš.åA/å†=‡=8Ç*×5ò\ a÷ìœKáçî±`§OÞ™cÁÎk÷uÿ¹Êx°`ûÙi÷±ºÏUƃÛÏò‘¬œX«ÖEÍzßcÛq‰£X‹VrÎzß‹g ±B’O¬™õ¾G¶ã’|b­_ÄB,Äz5ˆ…X!±kÑÁ³Þ÷Øv\b(–å;ØsXÄ‚E,X±`s‹Un«',:ë!ÖýjzËÎÆŠŠUZ«RˈÕ«ÑXvù¦ñ@gc5Åz¯ËvÏùñèl¬¨XUcÙ{`WÕ {c5Åj7–-,Ø~VS¬zò¾]:+*Öîµn,³èl¬¾Xuc™å@gc Ä‚ud5ÅZ°l©+Šc%ÊŠŠµzÝe;ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~±‚Xý,b ±úYQ±D£8V¢¬¦X°ö,bÁ"¬‹X°¹Å*´Y±bÑþeÇŠŠUhÿ2g5Åjµq)´b5ÅjµqƲbEŪۿ>ËŠÕëùsÅ,:«)VcòÎí/VT¬Ý+í_–¬¾X´Y²bÁ:²šb-YlÕűeEÅZ½V´Äêgk ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~±‚Xý¬¨X¢Q+QVS,X{±` Ö‡E,XÄ a·Y¹WÍlv±ÊÝ£ ,bűÛÜÙ«fÄ’gï¦âQ3b)²¥±v”¤VEK²Í'Š!–UÑšlã¹bE½æ8±&²ÕsÅË«hI¶nÿâw7¸­ÉÖ“wÄ2+Zž¥ý ±bØBû—cѰú,bÍbW¬µêÉ¢±B¬ib­^+Úb¹³ˆ…Xˆ…X>,b!b!–‹Xˆ#–hbÁ"¬‹X°ˆëÃ",bÁú°ˆÇn?í{ÕŒXò, «~Ek²…†Õ‹X³XV+†¥auÏ"ÖD–†Õ‹X³XV+†­'ïˆeV´ÈÕìȦk÷uÿ¹J§f6³Xýç*¡š]ØÔbÁƱÙÄ:}9Ôò,:FéÄZ½¢óì b…±+$ˆ…X!A,Ä b!VHë$±ÒeÑ1Ê&,bÁ:³ˆ‹X°>¬X%ñ¯¶vd=ÄJþøGVT¬ÒZá‰XF¬¦X­ö,.…V¬¦Xõ“´Þ?9cY±¢b=mÒ²èl¬¦X±dÖûÙŽKò‰µþ} ±ëÕ b…ÄR¬E?ÏzßcÛq‰¡X–7î`Ïa ±`}XÄ‚=S¬"]4¬>[‹µ­c—.VŸ}»üÔýþðÊ ö°XuWáR{”½œ±¾þ°ÝKC,ØIìeŽU®m»\ ¯7lU‹†Õg÷—ÂÝ39cÁLÞ ö({»a;{É «Ï>ÜÇ*}w°Œwö–t`cÄZ±Dhi ’#û–bå.ˆu‹XÉ‘E,ƒƒäÈ"–ÁArdËà 9²ˆepYn7$G–¤°ˆëÃ",bÁú°m±ø]í°ÓÅ*VÁ  «Ï¶VÎX°GÙVû—BØÃl«ý ±`³­ö/Ä‚=̶ۿ 6bòþý‘šjѰú,í_°'ˆEûì$–t`cÄZ±$Ê6†x›né‘ V?‹XA¬~±‚Xý,b ±úYÄbõ³ˆ5Äêg¹Ý0üŠå),bÁú°ˆ‹X°>ìÛ!A,Ä"!A,Ä"!A,Ä"!A,’·R>>¾þÛ>dýøó'BæíÞ¦ë—ØEå²læã&Òõ˜EŽäíAåÁ(¼"‡òö(F‘y¼"™’·Çw³xB^ÎÃí†o£˜¼“cùé)^‘CáÎ; b‘  ÉM¬Òøê1¯M¼â¶ü±ûÃjÛ~‹õx«½w°:ÿA[.»ÿfo{¿ýˆm'È·Xåî¼r¹ñýUùþΟ—ï¯{½ ÚòãAŸ[uü¶ÿò¼Ý>%¼~oÄoÝÊݰÞÿm_"¶\®jFU¼í¿=×KáÃLèa?>þëƆ²“¶|«7bÛ±u'É«bœøc¶|¾š_uè¶ÿþ4*ü>µ—æ‰ÿã{{sÆ–½¶ ßb•ݧƒ·‰éî_éöÛpöOÞöì»íé»AZجEÜ–}·ýWäU±fýûŒÛ²ï¶ÿŠð‘ É+¿ƒô›}þ·?ý}îm§Éۿù âÓ¿ýúûÿ†Sž²ûmÿ3œò”Ýoû…ß§ü”E,ĺü=bÏ+b] Ö5b] Ö5ˆµå±¾YÎXµ:ˆõ'ˆ…X!A,Ä ·ÎÝvšpƒ”„±HH‹„±HH‹„±HH‹„äÿA™AŒš—"IEND®B`‚Bio-Graphics-2.39/t/data/t1/version11.gif000444001750001750 3426212366325116 20104 0ustar00lsteinlstein000000000000GIF87aX´çÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ,X´þ; èb Aƒ T8áÁ…&DH%¢Eˆ^Ô˜ñáÀŠ'†”Hr£Ç“@r\‰²äH“"?ÂtÉ2fË™q¾ÜY“¦@•7yí ¨Í£>‘ê¬i4©Ó¥CBU*”*Ó©O«&mеkU®Z½5v¬Ù¨V¥†]{öhY´YÛJ|›¶n\”tïÚšW,Ü¢~÷²U+w Á…ÉÖ«·ï`ÄxKé8±åÈ[ôÃÙíäËu+ÿÍœ“´é«§G·ÝépëÚ¿~V–ulжg‡Ö}3èÛ°]û¦ ¹xîÔ»‘÷ö¬\7HÎ~B—ιàaؼKÿή¸9òãÛeþ{/S9t‚ç¦>¼øò­ÜÉ&þðxú9…_7Üš¿@ì÷¥~ÝÉçž}ÖW jÇàüéׄй6×€.˜aƒ*h x&×™uNh"€–—bˆ nX†Ëµèa{ïuö_‰Jxa€1˜Œ PÑ™H]‘ÎÈÜŠ. Èã>>&$“S>ä{êÙ¨£ƒM*Ye—\*Ùã“Ržhä™I%nk÷¥—m§[Ža¹e‡qÂG&›{º™'_7"9] $¦GåŸâ19¦¢Pö)§y6ºž¤‘N&¢¨1Z¦£aúâK:ú¦sž&§)Ÿ§úé虆'§þ€Âš¨«¤î4¨¨¥ê™ê£»v*ëjyZJY®Òú±Ãþúi¯±2;+˜Ç*kª±"Û*´ÕJ«+µ,Z‹W…à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼â"Gï½øæ«/»Ú‹-‹~€ ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñų·\ÀwìñÇ O¬±·N:»Ç!§¬òÊ,·ìòË0üÊ0×l3Ë2›L#ÉTÐ|óÏ@-ôÐ7çLœÏD'­4ÁFÿË+·Mö¼ôÔTWmµÐMë…ôÕ\»œu©£~·u×d—möÙ]ÕØh·-r¿ÉêÛn×m÷Ý+«ÝþÝx÷]°ÞPoëtŒûnøáˆ'®øâ‡ÛËøã#÷µb6*·à•oz¹¿™£¸åŸkºçƒƒ^ºè§“Þ¹ª›Ç=:ë¯?:ì³Ë¾ºí<“¼cë”ç>ùο—»¯¼_¼ðµ?|³Ë?{»ò!yhð»7,õ—öÞ%VŸ<óß;ïûñÞ'¥ŸôPoß-öxj¯{ö§¢ˆâ|á_O>üÖŸ?s·ö_…·S_ÔÞ×¾ã pQ®š”#¡%ísã{ çrG' Eè?$ Š$èºú-‹ƒ½›Ù-˜¦ •/‚œV !è¾×L\fºRÙ·ÁN°…÷+ }lôšólI8þ'Ä!õgCqƒE"¡zÈÃôi~Ï_Å'Dh])"–R¢§B>y\|Q_Èô9퀦 £ ÕÈB/Úk„þiHÓЈ:6ÞÐ9,ÿõ?ÃÌ0PD¡;8È.î°Rˆ´Ð¿HGÕ ò‘ Õ®I»BÑ’`„$“XuI°1ò“4 $Fn5IP2“UÄd%,CQ”x¢_9KUâ–”Ä]*5)Ë\BÏ–[ôd(S¹bó˜È¼×0¿”Ìf:Ó\Ëd$ßüFÍjJ p)d¦5·ù·h.sšÜ §8ÓæMsœgæ}É—s¢ó}Sgœ´ O¿ÉWßþ¬§>ÅyÏRÚkŸxëgìØùwô \híè‰Ð¶)ô²œ‹AJQ¥=TMÿ¬h:ËQŠ<ó£ éã8Ú$‘š™$f U Ë^š²£Á”AíÓ•ò—/¥å*]šÒ›br¦Ôé-šS–¢2–B©Ü€ºFŸ ó”Lm#O¡ZÔ™´Ò‰=Ý¥V‘jÔ¨Þqª5m)Ny²ŸNªYåªSeZÕ­‚5©Y "µÄˆÂU¬DMë[»ÚVµº•–c,k(e!Œ¢õ°a=ê^׺Ծ.V{<„a`êØ±"ö®Šµlb½JHÆîï9 ”#]ÍŠÕËòU¯šÅ,g]™WÓ’lŒ¡ þíüÎXÙÖn¶¶O½-jm«Z¹¢'‘Å-[w›[Õ ·±ÄnM8IÙä"×µåíi¡ë×êþ¶°ø¤îc­›ÚéêV»Ýõl6ûYòŽ×¹åEïyOyÒz±·½0\.|çKß“ªw_œhÐ. ý­iþÕ¨€AÆß³~7±.Ú0l3øÁû½ï<ó›NúV¸\Îpƒ%œ]o”½F ƒ5L↸´Æìˆc¶àeÅ%ŽñÁNL[ï Æ^k±Ù,ã{ŒÆ¯/&ëÛD£ÀGN²’!gãà6¹¹B.®wûd»NùÊâÅo• ›b,GWÊYžð–‡d^-GY¹]sþ‡©|æç>𪙕®šýÙæôÖy½iþòx;ÛÕvÍlÎ3wå¬g7ºK¾Ív;T0Ú΂ޮ¤Ãûh<—Ž|É¢ñêèAwzÒ„ö4 ½,j¹DGuE“M+mæHSºÔ>4©Aí•+.Deµ˜ïÜjYÏÙɼÞuˆ`k¢ØÖò×Pvu¨i=jd[ÙÙX®¢5¢F7[×kžõ«™mhm/ÛiÌÝé¶ÇýíršÜç6÷µYÉÀ\ÃÚÒÞN·¼×ÍíXÇ›ÞèÆ·º» m2ÙÀ¾žÙ’þ®£8àïîõ½ù=3[Ôà5v¶û ð…£Ç¯k%q:+{Þ O8Lþ0žñ·uØ×7ÈíMñÿ”|hÖÉ“ðzûå­y9Ö 䔇ܿ Ç9Éuþ°˜gkæÏƶÇkžoîüéêâ9Ç}Îr¥£œéû®ºÈ'nuš[üæ]OúÖ—þõ ‡ËX_9ØÇ~õ² ;í*ûÏ›®u óÎ~>öÙýt´»ël÷úš2-Ýî€G<ÙqÞs¸›ZÚ„õHŸËüö¿/~ïgüÔqL›‰Dž»áÍx±+¾íš—yÏçÃT“6Îj'ýéùƒ[õµ×´±#“ÉK]õœ?<Ý…?úÊ ŽÆfnÞ {ãç¾ñ·§}éý¾˜DóþúÖ}óþ?|ÙwßùÓç{ìÂýºŸûÅGÿö/þÌóÎÌ—»ùÓÏþÙ›þüõÇ?îÛoûÔêÄ·~ûguux.¿÷Áç}ô7€ú÷bD÷_ ¸>}'~ ~hC ct€ (€Ò—îÈ ã4+X%H‚ý×p(X3*ˆ@¨~ò€9‚k3ƒ4È‚6}÷×€#ø€q‚>h05˜Fþ÷7˜D8„Sq€TH.@ȄϷyBH}Y|[h_ø‚FÈ…üq ˆc†MØ‚gˆƒÚ·ƒh…dƒfø„(‡jØ… †1(_ç!…pè†ó'‚€ø††8ˆþr'XwHˆs˜†bˆ‡Èˆyh@Ö·ð§…k„™ˆ…e}›XG¯åy“Uˆˆxˆ:hŠ<ˆŠq(‰Trj­gV³å‰zè„|X‡µ(‹ˆ‰-dk¢µh±¨‹¹è…ŸèH³È†vX„C†|Åöy‰}H‡¸À(ÂYg}ÍÈŠÏèˆÛ茶8Œ•tSä7‰Ô¸‡à¨KÁhŽÅ¨‰Ñu‰äÈß¸ŽœXŽ´xŽ¿dR„T”Žõ( èÄx)™´iŸ j ûã²P¢&z¢(š¢*º¢,Ú¢.ú¢0£2:£4Z£6z£8Ê¢:› ¢ü ¡7–£B:¤DZ¤Fz¤Hš¤)º£òù–A5Ÿ¯Y*$ª¤TZ¥Vz¥Xš¥²À¤Oê¤Mõ˜<*¥Z:¦dZ¦fJ¦\ú¥²Ù¤`ʦy¦p§r:§2š¦Rõ¡ š j‰›tÚ§~ú§fj§_…§þ{¢ð Xš¨™”yzŸ‡Ú£j¨X験*©ZI©—j©ô‰©›ª©QÊ©Ÿê©Ÿ ©…ú£œŠ  :ªzJxGyúŸ ¨:«@*«ŸAxå—ªj«§«´ ¬·¬=ÑžÕ¢›ñÙ¥mʬkê¬t˜›©Ön«ö¬jº¬×J¨ˆIªÛz•Å©«¯·|»ê«ªš¬Ë¹ªÊª­Ó9m½§wÖz§Üº®­J¯èz®† žu"žœv¯Ñiªå °½Z«+¬ÑæžÔé®È*°"Ê« K®k°ë°u¡Ÿýj®ÿJ±•ʰZ¯a꯷F­¡Ç±«±™J²'k²Š²+«þ²¡Ê²/벬 ²>J±ŠútŒZª2›®óú±ù ¨@§‚ênØ*¯ë¦E;¨Z´L[¦CËZG ­êê³0;³{Ó´X›¥O;²;‹¯U˳Q›­K›µdK¥[ ¯IK´S‹´k+µc[¶pk¤g»°]›±û°{¡#·|K¤s;®y‹«±z;¸Ôv³I–³ÝJ³‘úµ^[· ê¸v¸Ä*¸…{¹–›¹•»¹ÃÚ¹¿Š¹œû¹šë¹{·˸:kº%«º)˺ZñªŠk¯¹[³®³·;àZ­i µ¨»¸³k»”Kº„ÛÆú®t›»`û»²+¹´«¼kºÒZBï)®Jþå¼Âk¸§¼[»ÝëßÊŒZÄ»m+¶ak´ÌKµÞ›ºÃ{íz}‹»ê ½“«½«Û¾¥‹¿qšá©¶=˶ÿë¶ç«´ì¿Þz­ù‡€k¿­«¿xËÀ-K¿ÏëÀ˯h[¾è˽ì Á¸KÁ÷ËÁÆ+²À曾\À¾«ÁÀ‹½ßëÁ ÂË«ÂÍ»¾+l³ˆ»dò{Â&,À;\Â?Û·@|£{½4<ܽ K¼ÿÄLL£CL¾$œÁ,¼ÁI,º/ÖÄX £O|±S\ÃGÜÂ0½{›Åd¼¢[ {=,ÅE<¿.Ác\Æpl¢gl½PŒÂ\ûÅT<ºuÇ|¼¥9ÌÃþ2ÌÆa\¿U¬7¬dìÃ]lÄmÜÁƒ<ÁŒÄzœ¿‘ Æ…\¼¡KÉ—üÀ›¼½‹,ÈüÁ¡üÂ£ìÆ•œÇ™ŒÉJìÉ kÅ«,Ê“¬Ê®<˚˺»œlˬŒÇ^ÜÈVûÉ:¼TÇk±1 Ì€lÌŠ¼ÆÁŒÌj¬FÓ;XZÌÊ|ÌӜ̼ÌȧÜË«ÉzÆéy¯Lʺ Ë©œËã¼Ë¾¼‚ï»,ÎßlÊ¥ìÈïüËÕÜÌß©ŒýËhµ\ÎìL˲œÏí ÏáìÇ‹}þÌÏäüÏò|Í Ðîì€Ä¼ÏÑý<ÑmÐæœÍëÍMÑÏÒ¬ÐË<ÏœÆ#È! ÒÔŒþÒÖ|Îb¼*D¶`/퇇<Ó•Èô¼*e{ÆSšµÖÇ>ÍÇs «AJ¶:Ó!±Ó?ÔMÔ6ýÆX[_9m.J=ÕLÌÔ nFÍ^Y-bTÝÕ|kÕm8Ô<½`[}Å^}Öc}Õ 5HÝ´EMÔGÖrÍ´`—rd0]_GMÓ|íLMmÀ$ Ø&Ò,MÈ Ðú ΉÝЋØýÑ… ÉÝÒ“mØÐ‘-É— Ù½Ðf´Ö}ؘÝÙ†a™D¬Ò7]Ù´{>MÙ¢ÍÙª½ò3ÂvLÛ{t$ÒÑ­mÙ½-Ùá<Ð ”¼™mɯÝ#Ï\VŸ­Ø¿­ÙÍmÜ/&Š®þW½B}ܾQÕ&Y#´ÜŒýܨìÝÚ\¬Ü¬«ãËÅ"-ØÌ\,Iă_ ÚðÍܽÛˈ}åÆƒ½Ò¤-FpdeÞØÛнÊúzkè}Þ)œÞÉ’ÛKäGó-ß]Ñ®°•xà¨]Ò µ’dÝÀ½Ù®íáûúzĽßú-à{JJîÜÞÝ+.Þï9â&Þ)>à->Ú1à3þÝ5Û9Þ}ýãíq@>_Ím=×HþÔBžäe ¥ÃäPîÖKåR®ÖMåXî§u½1Y´[Î3GÞåb®¥_>3cþ§eN‰g¾æd>ål.§iÞKaþætî·n^çZäß2äþ|þLBÞç&¥ç¶ß©Ýã8âà è*>áñÍâŽáï-é>én鎽ã®è']Ü:é™꣎é6N+ |Úž.ãŒÞ½W"ê§ÞêŸnê<¾!Áaá«~èœþ) ÞCþ ëµ¾ë%nè‹îªü¾ |ãÅ®éP’ÜëLé¡-ë¬NàÒM!°kå—^éX•ݨ&[Ò®ëÌžè󾺩ê$^èß>+ëm%}„Ï´¾éáÞ薞Σåîæ}á¸~î€1Fþ}¬ñNã¤ëÔNBqäí0Nì®ï ÞG îÞÚíÂŽî¯<Ð×ÖOØê·áéžðÊÎñ9NÌt|ﹾ쪊þâñò=Í!ß~Ç#ïñ'?ì3/ñÿ>ëÿèè<ßó%bN>_ÓØ¾óx^ôhMcsnôV縔ôJÿôdŒôP?¦LÿSN?õXß·RŸõWZõ`sõ\öJnNb_¥^/S`_öj¯åö²öIzöÂìör_åÃ6÷r+èôz?䎳÷É„÷É~ñ4ñŽà0¯ð nøƒþò‹¯ø_ó…ï‰/ù‡ŸòƒóÓŽùàðÁ®ù$ÿî×Íùð.ú¡úâNú§oúòžóЮóïù2Oøùnù6ú«ñ°¯ò?û‚_ûªð¿ó¸oûÀÏú¡¾û“óº/ûÉø•þßû…ÿêÈÿüÓßø”oýÊùÄÿ(½ÞÞö>üÁŸùÛ/þá¿ùåÿùNäì"ÞúìŸíàoü¥ÿ¯?þ±Âí¯ÈŒôþï¿ÿ®ßùùûÑI @ ìTР RAè0aDŠ +6¼xÐ Ä~ úÁØÉÏH† %žÌ8ÑâÆ”(W†„©1¦Êgº¼ÙR'Ë—2}Òü‰3(B›C{E*4)Ñ9*UZtéÓ¦FgJ…ZuªÓšZ³RÛ5¬U²[B)dÚ‰lKš…ÕëܱH±ÒåZVâݺ_óÚÅ«7p'¾ý æixða‹-ŒXqÝÈq_UK2³ÇÍGŽþ¼|6´eÊ£Ëík:eåÓ£Y«.Zöd±´%ßn<7ã׺Ic¦Ê–ín­½mÿí»uìãËÿ'î:rê{a7gªüúÃíÕ³c×yçg縧—§~¾»õðà»þ>þ|Àí鳇ï]¼}ýòûßÿ@þÔãµüÐÃOÀüØßOe½ØËŒÞᎷ58\‰÷£Xä’ËŠ3PâiOîwäqa^áˆiž8d”YN¬,áTþƘçÚtŽg’‰~Øæ—‘ÎÙån~—éýÈë¬j‘DRºg¨ãÍ:ê­ëíšk‹…æNæ|Ç60á®V‹í«ÓZc²s3zf©‡þ:༠޻â´?>·o‘Aóì3·×R+lºï>û﹟—ñ%¯íº¿|qÎܪšCO=íʽeÅõ>ïÔýέŽÜþ(¦¸9=óÑ[¯rÓ-×]ëÕMî],ªEÒŒø¸g÷8wÁw.ÝwÞ—/:ø²mßtê·hmh!ß÷z¼gÞûé¥_ú¤Ÿ?zó›vixz¹oXüòÓ?ßzòá¿ù~åég}ÿí_ßÑh·ޝ€“;àíþ$‡?9Ë„`%x¢æ}︫ ù'À ^ÅQ¹as•ª2ðiÄÜ÷g±ŠÐ…/ Q8¿ ª0ƒ4à ÷ÒBöЇº¡ ½¦ÃêaP~B4¸D&–I†›B"ØjXÂþM‰MÄb›ôD~EuSœ¡UÇB-–ÑŒLâ"ÌÄÈ:±Š­›`å8G:+ˆol£þî¸G7òQ}ä™À"æ‘Ø3â ‰ˆHC.Ò‚9#ñHE?ò‘‰´¤#ÙÅI†±“’¬¤#5 IRbR”84å&ÕøINöÅp_[#ð2‰ÊFª’h± Ÿ"m =ã ®mŠÃ¥úNþÌú¥²”µ<&%øJ0ó•k&+WÊ]¦˜ýK¦'o¸6n¾®™ ¥4o)N^’Óšæ´Ñ5‰õ3Ãuó—Ÿ£f6AÈYª“€Ú¤ç0Ûæ6‚<Ó›ðÌg5Ó‰Îíô}U—;_ghT—òle@!:M‰ŽàüfZ2ÚOŒ:´ž g<-ŠÌ‘*ó¡ ½Ú9EJR–šô£+u©>aºÑrÎtž'm)>qSԦݩN_ZÑœÞt¨ä«#å—T…©O…jT—õSŠ"5„i$ÚKEB­žÑ«=ÄjM‰zÀ®Ž*¬é+k úU¶bñ¬¥jV¯*UÍ5DmÅëßêþÓ±Î0­”Ú+½þ:)®æÕ°/ ¬ºì™B²^u›ŽÉ`;ÙH%6¤}Ý”d+ûX–²Ÿ­•e£WèÑDÛ4­‡œšZÖ¶Öµ¯ ªQeŠY Õ¶³mmq{Ûž”´*¥mUy;Ñqþ®Á-.rÅš[áîÖ¹½U,HG«\à27¹Ö]îpK*Tú1³<%nvŸÞêj·¨ºÅ/Sú]îB÷²Ø-ïx·+[÷žÄ™õî; Þù¢—¼Ç…/€ÍË_Ü(T½&Ù§ ¼àöþ—¯~ð€Üp4 åÜ~'|ÞæÖ×£òåðu%L¸EÄ™ôðÊŒa3˜¾öm~ºOþ”2vÃ.öo; ãè®8Æ÷¹¯FŸ#ߨÈ/Ö±ˆ[|䇸K E1ß;â&ãxÇIoŠ “ß{"ÙÉñÕ²Ü|Ücê xÉ^¶²’ÃL»1OùÌUfÌkå̬6OÂ?¦ò•¿œÍ‚VR¢ýðš“Wç@KÙÎOö³­â2³XР˳š}ÓçD?jÑA#4£ïLæM»y0”®ôŸ.-æFãùÍzNs–'êfÓ¥æt¤Ue¥€šÕ|5›aíiCšÖfþôœ…},W“ºÓ‡>µ¤íè^kZÖ`nö«íë=3{Ù¦~tà’=ëjc;ÚÆ~6°¿­ëi;{Ûоv¬Ï-îtþóºÝÈÎväÂ] .òÝÔN5º»­îxw¯Ü´90×mí}»»àð÷ wm_ü6\£ÿÔ0š™Œê‰+ûàø®8·©càõåᇳÄEr’S|ä&/¹^*ì9(¯ä(‡¹ÅóÍî‹›»ßñP‰Âe¿\æ×÷Ì .toßÛæ“~ÝpøÙñ"ŸüçN×8ÐiNt~'<ÈrG}u¨]êCÿzÑk.í¯µÜÆ]ŸzØ«nt²\ìT¯N½~óüÍûíj78ÜÎvp»}ícï;Ý—f÷¿ë!ÃF<ŒŠMnÂçï{¼Hn}«\+üßO8¤ýîx­Øzòkª¼æÂÑþ±ôb[õçOzmŸ^Š™o=ìåÏ«M¬Ÿ½ë¿({7ò·½©pßûÍÿþñG;Ø;ü­.Þò¾G~ʹ.ýZ'Þú+r¾èysèïŒ/~ôc>ýñ{=ùw?áïýÈ??üì7<ü×ßvÝqûu?ýï?øücþûî¯?6Š?ýû?í+ÀØÃ2Ï1¾ôã<êK;\@T¾’S/õƒ@ñ{: D? ´@„¥«Kˆ!Ó:l?,A<ÁÜÛ?ÒKŽã¸,¿ô@ÌÀœ@|Ÿ•‹‘–ë9@ÿKAâ @Yê?ðCkžk@ì@&\„Bò‹B´JºÃ³þBýòÁùÂ4Â4=/D½‹Êº1ĺ&œBtB”Â54¿Ä7³{B6DÃ3¼A:ÜÀ4ÄÀ¨“;5lC<”¿ üC7 D?ÌB@,DAæÓD Z¸<ìC;4ÃÒÚÄQ¬JTAGBLŒ3RdÅÛ3ÅTDEî+B„©½V´Å>YÂ\ê¾D”«[Æ(ÉEüÛEa*Æb’œZ ÆVFþ;FlŠEblAI¤Æj$¶NDPŒÃO”Ã:ìÆ;ÔF>œÃo En4Çqá8f'"m¬$Ü%vaCöâ6ždIc£ [òI¨åßým[O6àûýä.ÑÀ½B—;ÒN&å=ÖcdD↕ãºåbJ¾dKc\Nd[Îå2†Kˆ£`W.d_®db¾ecîå BMåQåP.à;î_gŽæ<žfhæ:¾fien^åxMajLc8æå]ÖåXfÔöàufgøaöUågöfy¶ænö™vþÆç|þÞwdXVãsþgd6g‰Pg}6èƒN^~®e€&g†~årFg†B艦h…Þ\Bnem¶gVÞæ{¦èÖg‹nflaþf“¦çVé•ng‘®R’†gjÎfŒîèV gî]&VæC†è€Þébþécêd†dÎáHèˆ>j£Vâ¥Fb§&ã¡h©Vꦶj.ê§¾j¤¦jŸÎê¨þj6vèaîê¾UÀ²~è±ÎhšÞha^k&Ö TëšvkºFéjæè¶¾kbZ)…fë¤öj¨l´&ë°æé²óc­æ­fj¬&ìÄ솞ì´¦³]ÊMæjÄjÎjÏ&êþÈîlLËäìPÈvl­FíÕÞlÑþl×FºF>e;íÖNm°†í©mÝÎíªæ˜YlÉ6ì·îiÊn»fë“:ÍííÁ¾íÂÞmß¶mÖ~l´ îéÆîêÖnÕÎnîÞnÜ~náŽnç¦nï6oð.oô¦Å›fïÉgË>n½Nn>céú¶ïû®Þ÷>ìæ6îñö_üðÇo—æd™.éùÆk´ðgðŠÖoâžkù†ëÎkð ·pv&ð¬¼è ßï𦽠ñà dþ†oÿ¦pWñ'_päæpWœö¦qqÎéîVïï†nïðôÞqm m!çm"—no—þñøVî‡ñâ>q%òor(ïqÿqOr#'o,ßr-m.g¸§Õð‘žçßëwr ·ò%Ÿ ´]èʾr$s0r;rÖžåÆ.p˜îç6Ÿr9ws)gó‚mÉw2Ý>?ó™^ó*§ò”®ëB—åE†óM.ó—^t5tIgrHOó˜–ÒVÑÓ¾tE¯gGô@ït4GpFgà/½J>/õY/q1r[ŸóóÎòºÝó ßtT_uWtVotObæÆôS7öb'ö__vgov†nZqNGñ\Ïq]ÿr/¯sn¿soÏsp/r<÷é®ñÄ«v`¿öAÇuv_í‚fqwñþ§óo¯÷plx÷ŸwÐ÷#×önÏ÷}gñ~ïÅvWõuOøÖw‚·pƒßÏ€·w‰ÇwÕnx‡opˆwQaOuk'tuïŒqgÒgvŽvM‡Ës¶t7ùŽy„÷x™yrølÇù]¿÷rßù›×yŠçy ÷ùmïù./úþþø—OyPÏt¦Wöh‡y¥Wø™·y£z«Ïy¢¿z¤ËD§vzßú[¯z®{±ÿwš¨t3z”Ÿúš?{²{³¯î^GådÏk·?z¹{lÿù¬¯óCw92¯õ²ç{­÷û‰?üŠWoÌÆ0¶Oz¨_ú??y•zÈÏjQ\Êü8ß|þ_Ÿ|§¿{©gxXW:‘äü¶}šO}Âw÷¸/ün—ã³öüÊw|Õ·üǯ}Ö_x.GvSýÛ·ýÜwýÖÏû×GüeNtɧ}ÍG}à×}ªþÝ~¼ß{â¯~é~è/~ëGo–oy°Oü ÿ¡x‹y~wyçÏ~ê¬Ïò‹?ÿ'ù¡Åþí¯ÿë§zøÿOá·íˆN;¹(° A„ ¤bàC†F¬Hñâ‡1´˜‘ãÄ";Ü82$É“~Ò°léò%̘2gÒ¬ió&Μ:qú)ñ§Ç”BQ59¨Ï D‘4ºT)Ó£P5NMjõdÔNN³r­þŠ•êU©aŸ‚ÜêUì×±fÇJ\¹ó-ܸrçÒÙ3-^´z‹ž%›×ïе»²;¸/á“‚÷&flØqáÈMS–ܰ²Êºš7sî÷.äÖµbmšôèÆ€ù¦.½zñjÕªaËv-‘¶m׸Çúéíû7ðà‡/nü8òäÊ—/oí\qî磋þ»»úéÛÔ³+½Î}´÷ØÛQc~|í²èLJO_¾ýzõÒÍ[_^û|÷Óó³·ÿ}2óÁ tþw™ôíwŸä¨àk êç „f5 ƒjI¨Û†ç%8!†^Øá{$žb…}¡haw&B¸bƒ0&(c†Ö(âcþ)Îèâl<ªè£†r(¤‡7êh#c¾á(Ÿ‘,–d}D–(å‰PîEã’6Ù•/ZáU=Ö““H™%‚[ øåˆ]öèæp©¦‘XžÉR¡$A|ºÀç˜w¶™çv–™&š…²Ù¢œQ â¢L& i£{zé@dúc¤fªh¥`>:ä¨ENJꩦ Êe©ïõ–éo`*™œ†:hªS¶Zå­Œîêe¯’®ºf°žvŠà] h¦Ã[,¢Îêy,ž¹òúë›ØÆ©íœÖËí_³6kP Ÿâî•Ôžëm¶ìnën·Ò‚Š®¨ð:jï•~êûjŸüš›ã¿ª¬+þ¾õÊK)½¸ŒêÂSk(«C•ë"ÄÄ&ìkÁ |mÆ7LðLJümÇÂþ´i—ש.À³ü$´ÕŽÜîÌïÖïÆ$ß|ïÎ鯼nÏçLóÐ6³Ë?·3sM;=œÒä>=õÓ Q}5ÖYk½5×]kµ–%?{1¹ž™†²G‡{¶gi?äÛqË=7ÝuÃåvÌ*O 6­vÏ…7Ù™ú-à}~8â‰+¾SáA­¶ÏK¼xN^{M9OÆa¾9çËÝ8ä2‡®1µp{è_š~ºK¯Î:ì±ËþRê¡ê=¯Ø“ÏÎRíô¾»ë» ?¼ç½|;¹õ;ëÆÍþüéÁ?=õ‡;:ò ®”å–ó-k÷][>ùå›>úÍI.zÒë?Þ¾òïçýrØŽ{¼½ÉðÛŸÿüßgïpÿÜ·´õýdø›ò (².(~L ý¢Å@öÐ0à-X¿ Ê€¤¸¿ ê/„aQHAúïƒ!òCΨ3’°‚*ì [¨C Ö…á‚U ](ÄjP‚%<¢ ihÄþù!M¤Uoœ(« ñ†"œ  ‰†D„[„ ¸ÄÔ¬dQ‘‡Kä¢O¨D/&ñ‹*̢ђöª‚GVc¤U»G¤µ±h\ãyÈ!âÑŽ$ybwTÅA.þÒX$¤!™ÆÉˆ‹Ž#¡­ÌÈÆ?:òKŒ\$éÇ>|˜4%CNI¨O ­“¶“$#5ÉJÒòS TÊ`éJzÍò~»<ž.kùH«”òW½ä'…éÉ`&³™9”%3ŸJhŠÒ™¶¬¦4'Ùôq³›Þü¦ù°yMj’sšz„^õҩι]bѧ9µ¹É¢sö¼§fÚ™Kq³œò<¦bê‰Ï´rü\æA_™P^ ´ }(í L‰  )dC!ªÑ‚êÓ˜ïìgŠPbœ.})LcZ”º“¦ûdé/+ªR…âT™< iNSjSÕþ[]a6EúÏò’©í©5AºÔ¢Žì¨8„çT¡šÔ ÖT«XU*X¹zÓÐÔJ‘^•jX}ÚTªæ1«@µ«êT²5“oêJïJÊ(Bñ”ˆ´c[ӊןºµ°‚ݪZFC2¶¬«œ«PÏšWÊ•¨’UèMù*\Ö®”M,]/»VÑ>U¯ðÄ$hœÈWZɵ®f5-Z+kTÈv5’•d¬B›(«^q²‡ýªl[KÚІ²”Æåk"ëZå7²°õmpÛIÎÎv¹»¥íX?;ØÑ>—°H)fu›[[í"v»¥%/pAë\ôÆV½ãým{ÍKÜÊ´¾ö½/~_j]yñVþÑQFM*àû­£áí.wÙëɸÁnÛ~?Õß–—ž¾0†Ùáˆ)Ø»cp†C,bšX¸>/|<Ⳙq¶Ø‰ç‹ÑÓ¸Æ2)±tÝ›ÝÛ.¿>þ1ƒ<µ¯ŒÈ{ïŽÿûÚ'˜ÇMV2sc¼^'£Ê×52î˜\e[VÊïµ2±Ûe-ËÌóÉ4¢­èE3ºÑŽ~4¤#-éISºÒ–¾4¦3­éMsºÓžþ4¨C-êQ“ºÔ¦>5ªS­êU³ºÕ®~5¬c-ëYÓºÖ¶þ¾5®s­ë]óº×¾þ5°ƒ-ìa»ØÆ>6²“­ìe3»ÙÎ~6´£-íiS»ÚÖ¾6¶³­mT÷fÏÝκn?l»Üæ>7º“ýmrÛÏâw»Ó-ïyÓ»Þªþ Ÿáoßì[ßöþ7À.ðFó»ßðÆ÷¾®ð…3¼á÷6»Ýñ†S¼âŸ7Âã-ñ‹s¼ã¯öº!hûûã&?9Êsýnrƒ[äO9Ìc.sb—|æ6¿9Îs®óó¼ç>ÿ9Ѓ.ô¡æw·¤žj¥ç;é¯~8Ò#Ítn×<ÜN/úÌ'^u«zê—޺׿Î鈓}ä »¥Ëþg´WšíX¯þwÙ½ÎrvÇåÞÖøÁñ¾õ´sÝìïnú·ï~ðº÷»ÓL?|¼ Ow½žì{ß4âÿ.x»[}ð/üÛœ¦úïq¯|â9zµ{Zî‹ÿ¼Ý%ßwÏ‹þëïûÆA/xЫÞñ³¿»¨§ÎúÙ§~ñ¸}ë3?ð£ËðÆO½èIOyØSzó¿_»ñy/ûÕ'ŸúºÙoOûé+?úÌo{Æ‹¯}ä/¿ûã¾æ±ýó“¿ú¿§ûãùÞyï·ßüÖ‡z¦µ>èÏK¿üîç:þÞþÑßöÙŸÚ ú¥_çžÈ‘ŸïYßô…šéÝ^àõÞûUŸÛ‰Ýþ1`»9à^`ÊŸ í^þVÞv_& ܽÞå5 õÍæ`üMšó!åù BÜ ê ²àä%êÝŽ[ Jš ¾ ~ ª`Ï!驜¢E¡®AaðIa¢Q¡>á¢5a­!þz¡­á n!¦¡®áÓÕ×>ͺáÈMMÊÔ:MÆÔ6 &ü! ¢ "!¢! ¢îâ!†È‚#>"$F¢$N"%Vb$êž%Z"#.'v¢'~"(†¢(Žâ'ê)’"#vŽî}F"›"¾",Æb"Æ""î_&Þ".æ"&æâ%îß)þ"0£)c)îŸ*v+¶¢±Ñ"36ã̇3>£-ò"5V£,‡5:â&#7vã‡7rb*rNq$£2[4¦£"΢32b6¾c&î¢5nc8Öã(£7Žãæ¬âÝœc±©#@";6£;£AJ¢v£>b?¾ú£¬$Fâ@2cA¤G^cç½ãB6dC>$7F$åL$ãXä°Ù×2GÂÔK.GL¾ÔL*GMºÔM&Kö¤Oþ$P¥P%Q¥Q%R&¥R.%S6¥S>%TF¥TN%´;Bio-Graphics-2.39/t/data/t1/version1.png000444001750001750 1173112366325116 20036 0ustar00lsteinlstein000000000000‰PNG  IHDRXLÿ(c@PLTEÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõKѧgTIDATxœíuã89lŽlŽçRÙxo$ZMBz‰f÷W׿›â¬½&al È‘ºé{ú›; ÆŸc„¡ÀO"bÁ+Å*!§ÏR²ÎdE¬ò÷ÿY§c$ÿÎañƒ¯XÿX}OkV¬#¼-O¿X"ŒÊ‰ÓüǪLkr+<Âý<–Y²csk¾ñ•û, Ö –ûÌ­æ1óLÎÇûíïþÛù†˜v:Nòyû[n…YgrZß ½ÒNÇ>çqZ1ëLÞmÚ=¼Ïîƒãîáý;ù3ÖêCg,ïa©3óZUëñŒå=,y&^«bÒžwSé=¶WqëÒš÷by®Äb!–I ±L‚XˆeÄB,“ VX¤=oÅ /±¾}. ?›ˆ ê±à¥bñVôÎÏÎFB¬¹À6Âà´YVŒ0žëÅ*ÛB¿[!d„Á‰±TJüÒÏLµ.­ð÷ó˜\¬}—bâ®KçÙCóqÓ¥³¼`bˆBÜté$«Ö¥ÃŠÕÏ}—-öÛ‡wÄ:ÂýÃ{r±V¢Kg éÒÙˆE—Î ºt®©Ý«©ôþ¾^ÅM,ïJ´‹c'–÷wVb]ÄB,“ b™±Ë$ˆ…X&A¬«ÄÊ3±‚ÆK¬oŸ ÃÏ&bAÄ‚:D,(!VÉþæ+4+÷̇ãÄ*µÝc .Çc_\éKáV§éy±Ø¥ç¦‹]zˆ»‡wjêk0Y«ˆ¬UfL'Öå•6îñ™ç|by ^ÄB,“ b™±Ë$ˆ…X&A,Ä2 b]$VºøÌs:± bAa"D,¨CÄ‚ˆuˆX± ‹NhIJ Ј5†…Nè+˜N,:¡ˆtB_Â|bÑ } Ó‰E'4bÙp÷ðNw!b &kbٵʌéĺ¼2Ø=>óœO¬ÿ’±Ë$ˆ…X&A,Ä2 b!–I ±L‚X‰•.>óœN,ˆXP˜ˆ êPG¬ÂÆJ‹Êt5F«Ô ñK‡AŪvÑp+bP±j½4ÅT°™QÅÚ÷Ò8½‚ ?J¬z/÷¨ ¼XõFxÞuU¬y¡A‘bñÒ¨"ƒŠåP]Òÿ™QaT±¼ËãêA¬f"VO«™ˆÕÄj&bõ±š‰X=A¬f"VO«™QÅ ÿ™QaP± : "Ô!bÁäbÞŠV¢ˆXté¨1ªX….m«Ö¥Ã­P‰AÅbÇuF‹oÄT,v¼QgP±ØñFQÅZ‘µJ‘b±V)2¨X.51 ñŸFË»¤¯Äj&bõ±š‰X=A¬f"VO«™ˆÕÄj&bõ±šU¬ ñŸ ª± bA"”«ð†1œžÇ1§£—Ž«ì~hö„Xpz}q¥—†[!œ¦çñà)v½4¬Xp„X»^ĂĢ—šˆE/ ´kEÖ*h"k&–W ʨëž;JÅr*šuÝ å„cƒXˆe’|bȨëž9Jò‰å]ÄB,Ä:ÄB,“HŠåô×àQ×=w•Š!bAÄ‚úD,x©X%ÂàÔ9?;GI±ærãƒÓfîMnÇr×èY±°T Ó–Ýæ`ÚöÚn…XÛÿ'µXS™·@*±N±²ÿOñ•çcY¦à~+\^° 1D!îöÿI-Ösñ^M+V7÷=K߉PÛݦÝÃ;báþá=¹X«Íêü‡¥Nz–6b-+VˆÁ ³dïYÊR;²ŠÕTz_¯â&–w%ÚűËû;«±. b!–I ±L‚XˆeÄB,“ ÖUbe‹™XAã%Ö·Ï…ág± bA"¼R¬ÜïÌc¡KçÉ[dÖéÉ’¾«l ý +Ö–ÚÎBî£râTëÒáVx„•n§’·*ëvÜué Ö!²³ÐŠóqÓ¥“w:N’…Nõ.¬Óq†ì,´«òðþx‹)Äe¸{xÏ\ùþs||ˆ.1̼VUÅ¢Kg¯U±.)Ýø”¼›Jï±½Š›XÞ•hBy/–÷èêA, b™±Ë$ˆ…X&A,Ä2 bõˆEÚóV¬ ñëÛçÂð³‰X±  "Ô!bAÄ‚:D,x¥X¹«DZ¤mý­ˆE'ôÒ ]è„ÂB'ô“УH'ôF,:¡‘Nèç#ÐcH'ô‰NèQ¤z#Ѓ¸{xÏÜ]øs||ˆNè1̼VUÅ¢z¯U±.)ý”¼›Jï±½Š›Xÿ’Ö¼Ë{tõ –@ ±L‚XˆeÄB,“ b™±zÄ"íy+VÐx‰õísaøÙD,ˆXP‡ˆ/‹·¢p~vŽ0’bͶ§Í²b„ñ\/VÙúÝ !# NŒ¥Râ—¶xfªuén…¸ŸÇäbí»tëw]:Ï‚|œ›.åÛCâ¦K'¹Xµ.V¬~î»th±ß>¼#ÖîÞ“‹µú]:cH—ÎF,ºt±Ð¥sMíF XM¥÷÷õ*nbyW¢];±¼¿³zë¢ b™±Ë$ˆ…X&A,Ä2 b]%V¶˜‰4^b}û\~6 "Ô!bA ±Jö7_¡X¹d>'V©íƒXp9ûâJ_ ·B8MÏãÁS°{ |Ásb±{ |ÁSb±{ 4‹Ýc X+²VA±X«à0±¼Ê9F]÷ÜyT¢(–SÚ¨ë-ÍÄB,“äëDF]÷ÌyT’O,ÿë"b!ÖÑ b™DR,§¿ºî¹ó¨DP, "Ô'bÁäbÞäV¢ˆX=«1ªX¥V<ˆX: *Vm_n…J *Vm_V,%F«²/ b)1¨Xôÿ¨3¨Xôÿ¨3ªX+²V)R@,Ö*EË¥¾¤!þ3£Â¨by—ÇÕƒXÍD¬ž V3«'ˆÕLÄê b5±z‚XÍD¬ž V3£Š4þ3£Â bAu"D,¨CÄ‚ÉÅ*¼­D±èÒQcT± ]:Ú *V­KgâV(Ä bÕºtŠÿ¨`3£ŠµïÒáUo)«Þ¥ã=*(/Ve‹Íûm1ÄØ`£Šµ"/4(R@,^UdP±*bšâ?3*Œ*–wI_=ˆÕLÄê b5±z‚XÍD¬ž V3«'ˆÕLÄê b53ªXAã?3* *T'bAÄ‚:D,ˆX6œŸÊ#Œä“˜^¬B !b a©•ºêã˜N¬}ÿ…„ˆ5‚ìÒs ó‰Å.=—0XìÒƒX6Ü=¼SSXƒÉZ…X6d­2c:±.¯´qÏ<çË»Xðê b™±Ë$ˆ…X&A,Ä2 b!–Ië"±ÒÅgžÓ‰ ± bA"D,¨CÄ‚ˆuˆXtB#–é„F¬1,tB_ÁtbÑ X6¤úæ‹NèK˜N,:¡ˆ»‡wº k0Y«ˆ¬UfL'Öå•Áîñ™ç|bý/Y ±L‚XˆeÄB,“ b™±Ë$ˆu‘Xéâ3ÏéÄ‚ˆ…‰X± uÄ*¼a¬D±¨LWcT±J­±tT¬j ·B!«ÖKSüG›U¬}/Ó+Èð£Äª÷Òx Ê‹Uo„çá]‡QÅZ‘) /*2¨XÕ%MñŸFË»<®Äj&bõ±š‰X=A¬f"VO«™ˆÕÄj&bõ±šU¬ ñŸ ª± bA"L.Vá­h%ŠˆE—Ž£ŠUèÒÑfP±j]:Ü •T,v¼QgT±ØñFœAÅbÇu‹oÔU¬Y«) k•"ƒŠåRÓÿ™QaT±¼KúêA¬f"VO«™ˆÕÄj&bõ±š‰X=A¬f"VO«™QÅ ÿ™QaP± : "Ô!bA ± oÃéys:zià±Êî‡fOˆ§çñØWzi¸Âizžb×KÊGˆµë¥A,8@,zi ‰XôÒ@±Vd­‚&b±VÁaby• Œºî¹ó¨DQ,§¢¹Q× ZN86ˆ…X&É'Ö‰Œºî™ó¨$ŸXþ×E,ÄB¬£A,Ä2‰¤XN uÝsçQ‰ X"D,¨OÄ‚—ŠU" Nó³s„‘„k.7Ž08mæÞôàv,w~‘ëK¥à1m)Ñm¦m¯MáVx€µýR‹5•y ¤Rë+ûÿÿQ9q>–e î·ÂåÛCânÿŸÔb=ïÕD°busß³ôøµÝmÚ=¼#ÖîÞ“‹µúÐü§ÎXê¤gi#Ö²b…œ0Köž¥,µ#«XM¥÷÷õ*nbyW¢];±¼¿³zë¢ b™±Ë$ˆ…X&A,Ä2 b]%V¶˜‰4^b}û\~6 "Ô!bÁ+ÅÊýÎü8ºtž¼•AfŽ‘,éë±Ê¶Ð¯°ba©í,ä>*'Nµ.n…GXév*y«²nÇ]—b"; ­87]:y§ã$ÙYháTïÒÉ:gÈÎB±*ï·˜B Q†»‡÷Ì•ï?ÇLJèÒÃÌkUU,ºt1ñZõë’ÒOÉ»©ôÛ«¸‰å]‰&”÷by®Äb!–I ±L‚XˆeÄB,“ VX¤=oÅ /±¾}. ?›ˆ ê± bANÓ!A,bÄ"&A,bÄ"&A,bÄ"&A,b’éÏŸ¯¯¿¿þÜóõóO„œÌôÛ¦å·ØENeº/TO‘–Ä,r&ÓA6Fá9•i+F‘ÙÞ ‹ É´ý«àê)žÃÙ¼Üð0Їwr.¯^ Å+r*¼òNL‚XÄ$ˆEL‚XÄ$O±JåwÛ¼þÌ»ž¹,_'t깉uŸžÒòŸÿwÿ=›3—Õ¯Á§^ŸÞàÔ9ò«üZWn.”ÇïÊã#?xü¾ù?‘É™·ÿÕÇÚúÔŸŸéëþ#I¾~ݰÊC‡òøß2±¿?Ûƒ3?ýü7GÚôÔ ²Ü 7OB›‰üúÚüj™ÈвƒÎl8hÛQçÉQ±z–~“3ÿ^¯,=üÔ)Rý[ácq/Õ¥ÿë1Í­1;óú_Õ9uŽ<ÄZZ¾¾¾ž¦«?§óGžÚþðnvfÑSçHÛ ¤û9õLawfÑSJŽŠ5êO¨Ý™EOý)9ò3Y_ûþ³¯>ŸøÔ™2•zóœÇ·ŸýûùÿzSÞ~éúÔÿö¦¼ýÒõ©ûâõÛ/E,Äš?X#rD¬%ãÅZ2^¬%ãÅZ‚XKX±ˆõöK ±æÏ#Öˆ b™„—. ˆu‚å>s«yÌ<“óñ~û»ÿv¾!¦Ž“|Þþ–[aÖ™œÖ·ÂE¯´Óq†ÏyœVÌ:“w›vïóÃûàĸ{xÿJþŒµúÐãË{Xê̼VUÅz &«ð&·EÄ¢èYQÅ*µâAÄÒaP±jûÒp+TbP±jûÒ°b)1ªX•}iK‰AÅ¢ÿGAÅ¢ÿGQÅZ‘µJ‘b±V)2¨X.õ% ñŸFË»<®Äj&bõ±š‰X=A¬f"VO«™ˆÕÄj&bõ±šU¬ ñŸ ª± bA"L.Vá­h%ŠˆE—Ž£ŠUèÒÑfP±j]:·B!«Ö¥SüG›U¬}—¯zK1¨Xõ.ïQAy±*[lÞo‹!ÆU¬y¡A‘bñÒ¨"ƒŠåPÓÿ™QaT±¼KúêA¬f"VO«™ˆÕÄj&bõ±š‰X=A¬f"VO«™QÅ ÿ™QaP± : "Ô!bAIJáüTa$ŸÄôbJkK­„Ð}TÇtbíû($D¬d—žK˜O,v鹄éÄb—IJáîášzÄLÖ*IJ!k•Ó‰uy¥{|æ9ŸXÞÅ‚W±Ë$ˆ…X&A,Ä2 b!–I ±L‚X‰•.>óœN,ˆXP˜ˆ ê± bA"D,¨CÄ¢±,H'4ba¡ú ¦‹NhIJ!З0ŸXtB_ÂtbÑ X6Ü=¼Ó]ˆXƒÉZ…X6d­2c:±.¯ vÏ<çëŸdA,Ä2 b!–I ±L‚XˆeÄB,“ ÖEb¥‹Ï<§ "&bAÄ‚:Ô«ð†±EÄ¢2]QÅ*µB<ÄÒaP±ª]4Ü …T¬Z/MñlfT±ö½4N¯ ëÞKã=*(/V½ž‡wFkE^hP¤€X¼4ªÈ b9T—4ÅfTU,ïò¸z«™ˆÕÄj&bõ±š‰X=A¬f"VO«™ˆÕÄjfT±‚ÆfTT,¨NÄ‚ˆuˆX0¹X…·¢•("]:jŒ*V¡KG›AŪuép+TbP±ØñFQÅbÇq‹oÔT,v¼QgT±Vd­R¤€X¬UŠ *–KMLCügF…QÅò.髱š‰X=A¬f"VO«™ˆÕÄj&bõ±š‰X=A¬fF+hügF…AÅ‚êD,ˆXP‡ˆ%Ä*¼a §çqÌéè¥cÄ*»š=!œžÇc_\é¥áV§éy ^*V‰08uÎÏÎFB¬¹Ü8Âà´™{ÓƒÛ±Ü5úEV¬,•‚Ç´¥D·9˜¶½6…[áÖöÿI-ÖTæ-JA¬S¬ìÿSüGåÄùX–)¸ß —lC Qˆ»ýR‹õ\¼WÁŠÕÍ}ÏÒWâÔv·i÷ðŽXG¸xO.ÖêCóŸ:ÿa©“ž¥XËŠbpÂ,Ù{–²Ôެb5•Þß׫¸‰å]‰vqìÄòþÎêA¬‹‚XˆeÄB,“ b™±Ë$ˆu•XÙb&VÐx‰õåsaøÙD,ˆXP‡ˆ¯+÷;óãXèÒyòV™u:F²¤¯Ç*ÛB¿ÂŠu„¥¶³û¨œ8Õºt¸a¥Û©ä­Êºw]:ˆuˆì,´â|Üté䎓dg¡…S½K'ëtœ!; mĪ<¼?Þb 1DîÞ3W¾ÿ¢Kg 3¯UU±èÒÄÄkÕC¬KJ7>%ï¦Ò{l¯â&–w%šPÞ‹å=ºzK ˆ…X&A,Ä2 b!–I ±L‚X=b‘ö¼+h¼Äúò¹0ül"D,¨CÄ‚ˆuˆX±  ^)VîêÇq,i[+bÑ =†tB:¡‡°Ð ýäD'ô(Ò ½‹NèA¤zÅùH'ôÒ ½p¢zé„ÞˆE'ô îÞ3wþ¢z 3¯UU±è„ÄÄkÕC¬KÊc?%ï¦Ò{l¯â&Ö¤5ïÅò]=ˆ%ÄB,“ b™±Ë$ˆ…X&A¬±H{ÞŠ4^b}ù\~6 "Ô!bÁKÅâ­èœŸ#Œ$„Xsm„Ái³¬a<׋U¶…~·Bȃc©”ø¥-ž™j]:…[áîç1¹Xû.Ä:Ä]—γ‡ çã¦KgyÁ6Ä…¸éÒI.V­K‡«Ÿû.Zì·ïˆu„û‡÷äb­>D—ÎÒ¥³‹.A,té\S»(VSéý}½Š›XÞ•hÇN,ïï¬ĺ(ˆ…X&A,Ä2 b!–I ±L‚XW‰•-fb—X_>†ŸMÄ‚ˆuˆXPB¬’ýÍWh Vî™ljUj»Ç \ŽÇ¾¸Ò—­NÓóxðì_ðœXì_ð”XìMÄb÷h#ÖŠ¬UÐD,Ö*8L,¯rŽQ×=w•(ŠåT€6êºAKóƱË$ùÄ:‘Q×=s•äËÿºˆ…Xˆu4ˆ…X&‘Ëé¯Á£®{î<* BÄ‚ˆõ‰X0¹X…7¹•("EÏjŒ*V©"–ƒŠUÛ—†[¡ƒŠUÛ—†K‰QŪìKƒXJ *ý?ê *ý?êŒ*ÖŠ¬UŠ‹µJ‘AÅr©/iˆÿ̨0ªXÞåqõ V3«'ˆÕLÄê b5±z‚XÍD¬ž V3«'ˆǪ̃bÿ̨0¨XPˆ ê±`r± oE+QD,ºtÔU¬B—Ž6ƒŠUëÒ™¸ 1¨Xµ.â?*ØÌ¨bí»txÕ[ŠAŪwéx Ê‹UÙbó~[ 16ØÀ¨b­È Š‹—FT,‡Š˜¦øÏŒ £Šå]ÒWb5±z‚XÍD¬ž V3«'ˆÕLÄê b5±z‚XÍŒ*VÐøÏŒ ƒŠÕ‰X±  "– ç§ò#ù$¦«PBˆXCXj%„î£ú8¦kßÿC!!b »ô\Â|b±KÏ%L'»ô – wïÔÔ#Ö`²V!– Y«Ì˜N¬Ë+mÜã3ÏùÄò.¼:ˆ…X&A,Ä2 b!–I ±L‚XˆeĺH¬tñ™çtbAÄ‚ÂD,ˆXP‡ˆ ê± bA"ЈeA:¡k ÐW0XtB#– 鄾„ùÄ¢ú¦‹NhIJáîáîBÄLÖ*IJ!k•Ó‰uye°{|æ9ŸXÿKÄB,“ b™±Ë$ˆ…X&A,Ä2 b]$VºøÌs:± bAa"D,¨C± o+QD,*ÓÕU¬R+ÄC,«ÚEíPˆAŪõÒÿQÁfFkßKãô 2ü(±ê½4Þ£‚òbÕáyx×aT±Vä…E ˆÅK£Š *–CuISügF…QÅò.«±š‰X=A¬f"VO«™ˆÕÄj&bõ±š‰X=A¬fF+hügF…AÅ‚êD,ˆXP‡ˆ“‹Ux+Z‰"bÑ¥£Æ¨bºt´T¬Z—·B%‹oÔU,v¼gP±ØñFAÅbÇuFkEÖ*E ˆÅZ¥È b¹ÔÄ4ÄfTU,ï’¾z«™ˆÕÄj&bõ±š‰X=A¬f"VO«™ˆÕÄjfT±‚ÆfTT,¨NÄ‚ˆuˆXPB¬ÂÆpzÇœŽ^8F¬²û¡ÙbÁéy<öÅ•^n…pšžÇƒ§ØõÒ°bÁbízi ‹^h"½4ÐF¬Y« ‰X¬Up˜X^%(£®{î<*QË©hnÔuƒ–Ž b!–Iò‰u"£®{æ<*É'–ÿu ±ëh ±L")–Ó_ƒG]÷ÜyT"(„ˆ ê±à¥b•ƒSçüìa$!ÄšË# N›¹7=¸Ë]£_dÅ:ÀR)xL[Jt›ƒiÛkS¸`mÿŸÔbMeÞ©Ä:ÅÊþ?ÅTNœe™‚û­pyÁ6Ä…¸Ûÿ'µXÏÅ{5¬XÝÜ÷,}%þAmw›vïˆu„û‡÷äb­>4ÿ©ó–:éYÚˆµ¬X!'Ì’½g)KíÈ*VSéý}½Š›XÞ•hÇN,ïï¬ĺ(ˆ…X&A,Ä2 b!–I ±L‚XW‰•-fb—X_>†ŸMÄ‚ˆuˆXðJ±r¿3?Ž….'oeY§c$Kúz¬²-ô+¬XGXj; ¹Ê‰S­K‡[áVºJÞª¬Ûq×¥ƒX‡ÈÎB+ÎÇM—NÞé8IvZ8Õ»t²NDz³ÐF¬ÊÃûã-¦C”áîá=såûÏññ!ºtÆ0óZU‹.AL¼V=ĺ¤tãSòn*½Çö*nbyW¢ å½XÞ£«±‚XˆeÄB,“ b™±Ë$ˆÕ#iÏ[±‚ÆK¬/Ÿ ÃÏ&bAÄ‚:D,ˆXP‡ÓôMˆA‹˜±ˆI‹˜±ˆI‹˜±ˆI‹˜dúóçûûï¯?÷|ÿü!'3ý¶iù-v‘S™î ÕS¤å1‹œÉôcПQxENeÚŠ„QdD¶·BÄ"C2mÿ*¸zŠ'äp6/7<ŒâáœË«HñŠœ ¯¼“ 1 b“ 1ÉS¬RùÝ6¯?ó.†g.Ë× :Enbݧ§´üçÿÆÏæÌeõkð©×§78uŽ<Ä*¿Ö•› åñ»òøÈ¿oþOdræíõ±ƒ¶>õçgú¾ÿH’ï_7¬òС<þ·Lìï϶ÅàÌA?ÿÍу6=u‚,·ÂÍ“Ðf"¿¿7¿Z&²¢ì 3ÚvÔyrT¬ž¥ßäÌ¿×+ËA?uŠTÿVøXÜKuéÿ~LskÌμþWuN#±–‡–ïïïç£éêÏéü‘ç„¶?¼›YôÔ9Òöé~ÎF=SØYôÔŸ’£bújwfÑSJŽüLÖÇ×¾ÿì«Ï'>u¦LåßÞ<çñígÿ~þŸÞ”·_º>õ½)o¿t}êþŸxýöK ±æÏ#ÖˆkÉx±–ŒkÉx±– ÖV¬b½ýRÄB¬ùóˆ5"ˆ…X&áå† O)”&“ 1 b“ 1 b“ü½ù¬@IEND®B`‚Bio-Graphics-2.39/t/data/t1/version4.png000444001750001750 1652112366325116 20043 0ustar00lsteinlstein000000000000‰PNG  IHDRXL©COIDATxœíÝÑ‘£H¶àT…ÞÆ b,Xƽ¬}ãÀ½¬ cÁmÄ>s²¤I„@*™çûb#¶úT©›b”ú9©nŒþ¨¢¢¢¢¢Òpe†¯ BB{7O§Ólp§‹½7¶ðJv—áaœ@3NŸ¾^;Ùw“`ßA8=œ©ôÃ.£eãÍ–[5®ópîŒkâ9§ÛHË_/©-pdÝdÌ.©¤¢54Æ âœRÊ9—¿è‹Q±çvïé‹q=¬×Óh„¶}ŸÍC¥$å]é–å©QààfÆuN¸¾×2°¾Òí™îÁ£ëçP—®×Áθ†Ñ©Ñ”RÙÿÍWN·sG $8”¾³eÿ·¶Í;çÿ»¾ã]¾1ªÌO–¹¾ 8Ži’*w'ËÈ?¢9/ü¹iGÔNÿ)¥ó£‹‚3^x 0ã!´vœš(~LP6pN)ýÑÿµ÷f@\ÿîþñ¡¿ÙЮÝçÞ” Á©QB„„&méC·àáÂLµßæü»»Ü TÙN{»%˜ª/»ËrÛé²\ð’Šu׸«¾ ¼FÚPÜdóôlç4?º‘Ô¢¾ L—–®Ì³Q°éÿX¨¾É2]‘pÁrj̆›@}êë§ÝÞkH5aº—d£ÊÝ+‚ò€©*ƒð)ý Õ„ÝÊÛásû|]‘¼v?Çü~®÷÷"¦º>7*U_¦”þèÿÚ{V«qe¸V÷s¿1Õø¹Q£úfÀª²#¬ÔqNÒ¶Í~VÑnçskX¢²÷Þz]«¿ð!‚€Ð!¡UyÐLªm´ºŸ[ý½€×Ô×íZÚòÊÞ{n#ì±×*­þ^*1+ÛŒ÷àê BøA‚€Ð!¡U9Y†÷y(9@¦#Œ%ç_¹p±ç°Áé«7íížVz] À… ¬Ût â%•ë×É©Q ú#@@‚°n×Ew‡âv´…g;¥ @„ ÈaV¦Ú(Þî®P/2“eêÖ ÷¨,§Æ”•6àØt„u›v{K*éöô©P"ÓVoÔíM+Ó›%FO¼Üg»ŽAGؾ»!™ ¬[·òvx·Ï“Ø‘ ¬Þý_{oo±¢$ìË5BB„„&Mš  4³F«gÎ!À;t„u=#f•+{¿ 4A@h‚€Ð!¡™,Ct£çµºbÑBâ:](~™ ¤)3K¯ªqBÚÑ]:¼téö–TÒm"ÊBˆFÒŽëÄCqsÞÓ%{ɱ Bš’ó¯lìFÞ5,§ßbrûí芄{ÔæS£eËØ=k¶éiÇ´Û{­„"iÊ4ÉF•ùÉ2@@‚XôÀˆ ¤k¯ö=P »s¸¶AHSþèÿÚ{àÇXmtfš  4A@h‚€Ð!¡™5JS̲ÖÒÒŽ~SQ©½²÷¨ Aš  4A@h‚€Ð!¡ BB„„æ†z¢­bèÎ-ˆF×étʱ'ü 2AHS®‹Î_³íµ ‡ ¤Ý¥ÃK—noI%Ý&¢,„h!íè‡!÷vCñÆÓí%À»¯úø–&iJο²±ux×°œ~ ˆÉí´£+îQ#˜O–-c÷¬eÚ¦#¤Ónïµ Š ¤)Ó$Uæ'Ë BbÑÿ#‚v¬½Ú÷tB)ìÎáÚ!ñ©AK«mÁ¬QB„„&Mš  4³FiŒYvÀ::BÚÑc**µWöU!BB„„&Íd™ ªôº@€ AX·ÜÛå¯O§Ó0 K*ׯ“S£@x‚°n×Ew‡âv´…g;óÏ—Ñ ¬Þ4ÏFÁf…z€&ËÔ­+îQ#XN½ aݦÝÞk€°aõ¦I6ªÜ,#ÿ2AØ>ýÀ AX·µWûÜ>LP`G‚°>CkçèödÖ(¡ BB„„&MšY£ 0çàu:ºõØJ•½ßGš  4A@h‚€ÐM–ñài¦Úïsþ•‹Ózð4WUv„ÓÞnI¦ê Âé2³K*Öäà®ú‚ðiCqÖÓ³wWi€ú‚0]Zº2ÏFÁ¦ÿ`¡ú&ËtEÂ=jË©1nõ©¯#œv{¯U Õ„é^’*w¯Ê?¦ª §ô,T_v+o‡?ÎíóuEòÚý|óû¹Þß‹˜êúܨT}A˜RJ©ÆwFŸ¿­îç/bªñs£>õÍ€TiGX¥ãœ¤m›ý ¬¢#ÜÎçÖ7ÿDeï½õºV/àC!¡ BB«ô¡‹@Ûhu?·ú{¯¨¯#<Úµ´å•½÷Ü:GØc¯UZý½TbV¶ïÁÕ„ðƒ!¡ BBû tÿ24£;ÝØ{s` ¯aùØbCÚÇr9ecï-‚|áôp¦ÒO–úhÕ¸e£›8ÎéöŸ¿^[Žfº<õ’Ê>Û »:§”†Ë2¶ùΕü ç<¡j}1®‡•ãZ(Ê÷©ÑÍK†ví¼Ÿ·à¡Û„&Mš  4A@hyÖ¨‰IÐ$Cžû*×áÌØTTj®ì=¦Žâÿ-TÞ¯ìý> Á©QB„„&íÝ ô|Bhµ™å• ¼>Ì×8fœŠq}¯±ï&Á6¾ƒpz8SÉË0YÆnÕ¸ÎÃùîšõжsº´üõ’ŠÑGÖMÆì’J*ZCcœ ΩXt7ß¹’¿á´'T­/Æõ°f\O£Úö}j4•r”7u¦KX–§Fƒ›×9áúb\Ë<ÂúJ·gB­jíú9Ô¥+Æõ£F°3®atj4¥Töó•ÓíÜQ ¥/ÆlÙÿ­­@óòC·ÿ~Çÿº|cT™Ÿ,s}pÓ$UîN–‘Ds^øsÓŽ¨þRJçGg¼ð`Æ'Bhí85Qü˜ l w„v4ìès dh×ÎÑÉñÞ`Ä©QB„„&í‚Ð# ¡ÝéÆÞ›[x%ˇù*І<–Ë){olä;§€3•~²€p@«Æõh,ÝÄqN÷Ý][Žfºèî’Ê>Û »:§bÑÝ|çJþ†sžPµ¾×ÃÊq- åûÔh*å )oêL—°œžÍ/±T/Ð̸Î9×ãZòÖͩљžeýWJ©X7¹ŒFà º㺻WŠDó•îu{e%ÿÜ´Ù´Ûë'£xZ€nN–‡£JKÙèD¨ƒG8¦§ãº+ÆuyԻöÂ~Î ®'N„Bzù)_˜çbj Gæ=[;N=&ïç œSJß{oü+ð• íÚy?oÃC·Mš  4A@h‚€ÐÎÉÄ$h”¡ K|•ëpæGl**5WöSGq„ÿ*ïWö~…àÔ(¡ BB„„¶ô¡Û ðpa¦ÚïsþÝ]nªì§½Ý’ LÕ„Ýe¹ítY.xIźkÜU_^#m(n²yz¶sÝHjQ_¦KKWæÙ(Øô,Tßd™®H¸G`95fÃM >õu„Ónïµ ¤ƒ0ÝK²QåîAùÀT•Aø”þ€…ê Ânåíðǹ}¾®H^»Ÿc~?×û{S]Ÿ•ª/SJß{oÁz5® ×ê~®ñ÷"¦?7jT߬QøAUv„•:ÎIÚ¶ÙÏÀ*:Âí|n ëOTöÞ[¯kõ÷>Dš  ´*¯šIµV÷s«¿ðšú:£]K[^Ù{Ï­s„=öZ¥ÕßK%fe›ñ\}A?Hš  ´*'Ëð>%Èt„±äü+.ö 8aõ¦½ÝÓJ¯ ¸„u›.A¼¤rý:95 „'ëv]‚x(n9Zx¶3ÿ| ÂêMóll}q!P挘,S·®H¸G`95fô*t„u›v{¯U„՛&Ù¨rw²ŒüÈaûô3aÝÖ^ísûü19@ Âê î½¼Çúˆ°/³FMš  4A@h‚€ÐÌ­ž9‡ïÐÖ­ÆTj¬ìý>‚Ð!¡ BB„„f²LPà écÉùW.Õë1Ü@p:ÂêM{»§•^p!ë6]twIåúòÑ„u».º;·£-<Û)’ l@³2ÕFñvw…z)™,S·®H¸G`95¦¬l´‰Ç¦#¬Û´Û[RI·§O…"™Ž°z£noZ™Þ,1zâå>Û p :ÂöÝíÈaݺ•·Ã»}þ˜ ÀŽaõ†?÷ÞÞcEIØ—k„„&Mš  4A@hfVÏœC€wèë6zFÌ0 *5Vö~Ah‚€Ð!¡ BB3Y†èFÏkuÅ¢„Äuº,P,ü 2AHSf– ^Uâ„´£»txéÒí-©¤ÛD”… ¤×%ˆ‡âæ¼§K0ö’b„4%ç_ÙØ:¼kXN¿Ääö ÚÑ ÷¨̧FË–±{Ö2mÓÒŽi·÷ZEÒ”i’*ó“e€€!±èÿ€AH;Ö^í{:¡vçpm‚¦ î½ðs¬6º ³FMš  4A@h‚€ÐÌ¥)fÙkéiG?Œ©¨Ô^Ù{T… Mš  4A@h‚€Ð!¡ BBsC=ÑV1tçD#‰ët:åØ~™ ¤)×Eç¯ÙöZˆCÒŽîÒá¥K··¤’nQB4‚vôÃ{»¡xHãéöàÝW}|Ë€„4%ç_ÙØ:¼kXN¿Ääö ÚÑ ÷¨̧FË–±{Ö2mÓÒŽi·÷ZEÒ”i’*ó“e€€!±èÿ€AH;Ö^í{:¡vçpm‚¦øÐ %Õ¶aÖ(¡ BB„„&MšY£4Å,;`-!íè‡1•Ú+{ª!¡ BB„„f²LP< écÉùW.NëÁÓ@p:ÂêM{»§•^p!ë6]fvIåúòÑ„u».3;·-<Û)’ l@³2ÕFñvwMv)™,S·®H¸G`95¦¬l´‰Ç¦#¬Û´Û[RI·§O…"™Ž°z£noZ™Þ,1zªá>Û p :ÂöÝíÈaݺ•·Ã»}þ˜ ÀŽaõ|„ÖÎÁ ìË5BB„„&Mš  4³F«gÎ!À;t„u=#f•+{¿ 4A@h‚€Ð!¡™,”Çpd:ÂXrþMfKGX½™EwUz] À… ¬[îíò×§Ói†%•ë×É©Q Žùý\ïïELu}nTª¾ L)ÕøÆ¨ñã·Õý\ãïEL5~nÔ¨¾Y£ðƒªì+uœ“´m³ŸUt„ÛùÜú柨콷^×êï|ˆ  4A@hU^#t h­îçV/à5õu„G»–¶¼²÷ž[ç{ìµJ«¿—JÌÊ6ã=¸ú‚~  4A@h?„î_†ft§{olá• ,[l¨@òX.§lì½E°‘ï œÎTúÉRÀ­×£±ltÇ9ݾãó×k+ÀÑL—§^RÙg[aWç”ÒpYÆ6ß¹’¿áœ'T­/Æõ°r\ EBù>5š‡J9HÊ›:Ó%,§§FóK,v 43®sÎõŸ–|„usjtæ„gYÿ•R*ÖM.£8ˆnÁ¸îîÕ…"Ñ|¥{Ý^YÉ?7­G6íöúÉ(žV  ›S£åa਒ÇR6:êàŽéé¸îŠq]õî°­°Ÿ¥«O”ãĉPhC/ÿ ¥ó ó\LáÈ| gkÇ©³£Çäý¼|ûÄÞ[?ćyÉЮ÷ó6ÀІ%¾Êu8ó#¶•š+{©£8 •÷+{¿Bpj€Ð!¡ BB{7=ŸÚcm&By%¯ó5N §b\_çkì»I°ï œÎTò2L–±†ƒ[5®óp¾»f=´-ßGø÷[?½¤b´À‘u“1»¤’ŠÖÐ'ˆ¼ Ó÷âœùΕü §=¡j}1®‡5ãzжïS£y¨”ƒ¤¼©3]²<5 Ü̸Π×ãZæÖWº=òhUk×Ï¡.]1®5‚q £S£)¥²ÿ›¯œnçŽHp(}1fËþomšwÎÿw}Çÿº|cT™Ÿ,s}pÓ$UîN–‘Ds^øsÓŽ¨þRJçGg¼ð`Æ'Bhí85Qü˜ l _#Ü{+ °Ï¡];'ÛðÐmB„„&Mš  ´¼úÄÞ[|€¡ K|õÃÑUTT6¨|blá÷Ry¿ò‰÷#Nš  4A@h‚€ÐNÿýÏÿí½ °!¡ BB„„&Mš  4A@h§”N)¥ÿþçSJ¿ýþ?ùëüEéZý䯛 ?ë|ýjšmËsN.P©ïŽ0»&Ù£`+;ÅÑŠP…¿¯Þ½ü¿ù¿âúB)@uÎ3ß›ÛèJáÌO@þîŸv~Оï ,炾`ÉT8 ñ5Â2Ï®×çCîú]Y@u~f=B·OP) óšG¬š  4A@hsAøÛïÿ|ù»kýìßö öFé·ßÿ™ÿ7ó?ûÏýàßö vÔ«¼¡þfhm<Ò–ÏÙÙå#ÀÞ(ÿ¡ß~ÿçÿóùÛlÀwÈèµC ^÷;Â<°—¼¾< }V–ßýÌèØyúÇG?³|Ã~½1²êSØ)Ù!P—¯t;üòË?÷Ÿçï–?3}ÕôŸýÌöGÜ¥à{cúömØÌ ›Ü!3ì¨Ñ9]ÆÕ ¯l.yÕŽ‡±£Žå[ÒäÞHßOß0­îGï°;j7·úÄqÌÿø¿õÑ¿ÿ}[îGuÎmãr÷Ÿˆ¼C vå³FW˜Gg]æÏƼp®¦<Õ³öµ›i{o”ÿÖÂý¶wÈt–üتú’ïÎlÏÁÇ ÇýŽpt­þÑpºxæ(ÿXŽÞÑËG¯ºþ+3Ÿ&ûáÚS3¿QY·CJ¡vTdëg¾v©|Õ¡ÎA½ÉÞ±CFìØ€k„õ±7Fì;V9í½=ÀïOŸÿh8ìts;dÄÙk‡@íÎ)¥?ú¿öÞŒ±wÿ˜ùî;<ÿ7_ /ÿý3ÈòÎ??þ|ã¯ÿŒÓ¿æ¾ûÎÏÿÍßÿñÞ §ÙÿŒïlðüß ðÐmB;î5ÂÞ€Ú‹2b‡ŒØ!ðšãáç.xTʱCFìxS£„&휖N¤<Ïopuóä>»ÁK&Rʧ7¸º‰”Õm0lië'ËÀ¡85 @h‚€Ð!¡ BBûZ{Ps-øé¶IEND®B`‚Bio-Graphics-2.39/t/data/t1/version11.png000444001750001750 1367712366325116 20132 0ustar00lsteinlstein000000000000‰PNG  IHDRX´è>³=PLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ+LŽŒ=IDATxœíQvÛ8Eýß›èx5ÙÄ|û;ñ&z…㈱D ° ¢ˆ÷R÷iÇ™KÁ¦PæÛç_ôú ö'öͱhX}¶-VÑ.Ú†-¥ØÕ<‰­Å*_ÿC¬ãì×·šçŠõõÏêýîµpÆz…ý}zº{-ú5DZo—Ý/w¯\ _aëq,›dÂ5‡Šµ]øÊeë[.#·ÇýHŠÖÇ^æX—Ëßå[Û±^co—¿ë¥0±X·]W½ëö6ŽŸ»×Äb5&ïÛä@·hM¶š¼¿'Ÿcí¾õ=Ç/Zž­ç©ú5‡Šõ=Ç/ZŸÝ«ljžËò‘lŒX…ôçÙP®®í§,ë_Ò›çb­®®Ä2b!VH ±B‚XˆÄB¬ ÖˆX¤?OÅÍ*±ŽÀ°°?±ˆ‹X°>ìbu}m¹Ã'²ÛÇ«æ@±¶¶ÒE[°e÷êRó\±ÊãB¿ß !¥‹ÖdKc‰_æ…~î.…/°õ8&«îÒA¬—تKçÖC [sÛêÒ¹ÞWS-Z•}èÒI.V«K‡3Ö8[wéÐbÿ8yG¬WØzòž\¬Ý·èÒ™ÃÒ¥C—N [èÒq,VŸÍ·l&j Wï×OY&Öê•h''N¬Õ{ÖbÄB¬ b…±+$ˆ…X!A¬³ÄÊ–0±D³J¬#0,ìO,bÁ"¬;Y¬òøá«ÜÞÃΫ4–‹Èí0ì9ì!±Jëé1ˆ{P¬F_ —BØ=xÆúüùé1¢; {{pŽõäé1¢; {;çRØzzŒèÞÃμ3Ç‚!Öîëþs•ñ`Áö³ÓîcuŸ«Œ ¶Ÿå#X9±V-ç˜õ¾Ç¶ãG±-@›õ¾¢Kóæ±+$ùÄ:Yï{d;.É'Öú÷E,ÄB¬WƒXˆK±ý<ë}mÇ%†bYÞ¸ƒ=‡E,XÄ‚õamÄ*·¹-:ë!Öý¢gËÎÆŠŠUZ‹ˈÕ‹çÒØ³šbñ\{VT¬ú¹4™ŸòàÈjŠÕîÿY>X°ý¬¦Xõä}»,t6VT¬Ý+Ï¥±dõÅâ¹4–¬X°Ž¬¦X V—tEq¬DYQ±V/k±úYÄbõ³ˆ5Äêgk ˆÕÏ"Ö@«ŸE¬ V?+*–hÇJ”Õ ÖžE,XÄ‚õamÄ*téX±bÑ¥cÇŠŠUèÒ1g5Åjuép)´b5ÅjuépƲbEŪ»t>ËŠÕëùSz,:«)VcòÎí/VT¬Ý+]:–¬¾XtéX²bÁ:²šb-YÓűeEÅZ½¤¯Äêgk ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~±‚Xý¬¨X¢Q+QVS,X{±` Ö‡E¬mòäU³›]¬r÷‹¾=j¶`Ó‰UZ¿è[¼fG6›XuÿO½P­fK6›X¿žöÿˆÖìȦëiÿlÍ~l6±ž÷ÿhÖlÉf«ž¼×kêåjvdÓ‰µûºÿ\¥S³ ›Y¬þs•PÍ.lj±`ãØlb¾Òfy£tb­^,xv ±B‚XˆÄB¬ b…±+$ˆu’Xé²èe ±`YÄ‚E,X±` Ö‡E,XÄ a·›=^5°ÙÅ¢±æ°…NèSØlbÑ X1,Ðç°éÄ¢ú6›XtB#V [MÞé„F¬É,ЈÃvŸ«„jvaS‹Çfëô•Á˳è¥ë¿dA,Ä b!VH ±B‚XˆÄB¬ ÖIb¥Ë¢c”M,XÄ‚uf 6·Xåö±å@gc=ĺ_™n9ÐÙXQ±Jk!b±šbµºh¸Z±šb½?í¥±èl¬¨XO{i,:«)Öó^ËÎÆjŠÕ˜¼s»Á‹k÷Z÷ÒXt6V_¬º—Ær ³±bÁ:²šb-Y_ÒűeEÅZ½<®Äêgk ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~±‚Xý¬¨X¢Q+QVS,X{±` Ö‡µ«°lÆŠõ‹.;VT¬B—Ž9«)VóY7\ XM±Z]:åŒ÷…ÅŠŠUwé”vUͰ7VS¬v—ÎòÁ‚íg5Ū'ïÛeÑx ³±¢bí^éÒ±dõÅ¢KÇ’5 Ö‘ÕkÁŠ˜®(Ž•(+*Öê%}í V?‹XA¬~±‚Xý,b ±úYÄbõ³ˆ5ÄêgEÅâX‰²šbÁÚ³ˆ‹X°>ìd±ÊãÆr; {;S¬ÒXâ"·Ã°ç°‡Ä*Õr¼OÄ‚½°GÄjôÒp)„ÝØƒg¬Ïû^ÎX°3Īzi v‚XÏŸx#ºÃ°ç°s'ï̱`gˆµûºÿ\e±dÖûÙŽKò‰µþ} ±ëÕ b…ÄR¬E?ÏzßcÛq‰¡X–7î`Ïa ±`}ØÄ*ÒE›°ÛÇ«æ@±¶åÆÒE[°e÷êRó\±ÊE£»WÎX/°¥±à1ïcZÞ½6…Ká ,Ïÿyëó2Øæˆu€åù?{ö2Ç*×!¸\ ¯÷ÕT‹VeŸÿ“[¬ÛÉ{7œ±†Ùºg)õƒ¥š“wÄz…­'ïÉÅÚ}kûW'_´<Ëóïc•¾;XÆ;|[{– jžËò‘lŒXç¬ÝJÔ@¯Þ¯Ÿ²L¬Õ+ÑNNœX«÷¬Ä:)ˆ…X!A,Ä b!VH ±B‚Xg‰•-ab‰f•XG`XØŸXÄ‚E,X¶-¿ùx[èÒ¹½–?‹•…‹¶`KúõXåq¡_áŒõ [ZO¯9Žmuép)|…mt;•Ûª,ÍšCŪ»të%öé“…DkŽc[]:ˆõ"ûäÉB²5G±í.ÄgŸ?YH³æP±“÷ïOT‹Öd«Éû{ò9Öî[téÌaéÒ¡K'†-té8 «Ïæ[6s$φrum?e™X«W¢å¹X««k± ‚XˆÄB¬ b…±+$ˆ5"éÏS±D³J¬#0,ìO,bÁ"¬‹X°ˆëÃ",bÁú°tBÞ$аsÄ*tBÈE'4lK'4l”XtBÃÎg鄆 ‹NhØ–NhØÄ¢vËG:°1b­X-küŠ}+ÿÞ V?‹XA¬~±‚Xý,b ±úYÄbõ³ˆ5Äêg¹Ý0üŠå),bÁú°ˆ‹X°>ìbu­q°ÜaØsØfû×gßâˆ=‡m­ ý½RYºhX}¶ÕþU¸Âe[í_ˆ{˜mµ]o2« «Ï¶Û¿8cÁFLÞ ö(Kûì bÑþ;‰å#رV,kZÃäȦ[AŠXç°ˆepYÄ28HŽ,b$G± ’#‹XÉ‘åvƒÁArd¹A ‹X°>,bÁ"¬;Y¬ËäXz‡aÏagŠUx\ ì±¶óÓî±`'ˆU7Žq)„ Ö¯²uM—ò —òÞÜc•ëy.…°{vÎ¥ðs÷ŠX°Ó'ï̱`gˆµûºÿ\e±Ö¿/b!b½ÄB¬XеèÇàYï{l;.1ËòÆì9,bÁ"¬‹X°¹Å*·Õ–õë~5½å@gcEÅ*­U©ˆeÄjŠÕh,»|Óx ³±šb½We»çüxt6VT¬ª±ì½ °«j†½±šbµË–l?«)V=yß.‹Æk÷Z7–Yt6V_¬º±Ìr ³±bÁ:²šb-X¶ÔűeEÅZ½î²Äêgk ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~±‚Xý¬¨X¢Q+QVS,X{±` Ö‡E,ØÜbÚ¿¬X±hÿ²cEÅ*´™³šbµÚ¿¸Z±šbµÚ¿8cY±¢bÕí_ŸˆeÅjŠõü¹b–Õ«1yçvƒ+*Öî•ö/KV_,Ú¿,Y±`YM±–,¶êˆâX‰²¢b­^+Úbõ³ˆ5Äêgk ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~VT,Ñ(Ž•(«)¬=‹X°ˆëÃ",b…°Û¬Ü«f6»XåîÑ5[°éÄ*­Gˆ×ìÈf«n,«W¨ªÕlÉfë×ÓÆ2ÑšÙtb=m,“­ÙÍ&ÖóÆ2Íš-ÙlbÕ“÷ºYC®fG6X»¯ûÏU:5Û°™Åê?W Õì¦ 6ŽÍ&ÖéK¸–gÑ1J'ÖêU¨g±+$ˆ…X!A,Ä b!VH ±B‚X'‰•.‹ŽQ6±` Ö™E,XÄ‚õa+’-%íï¦G¬(öK©ò*븿ˆÅ–ª±L¿æ8±f±Æ²’øiˆ5­ËR?ÿ±&²eˆåV´$ËË+†­&著X†X,O,C¬¶¤bbÁ"–4»`©UWbMkõZÑvËE,ÄB,Äòa ± ±|XÄB¬±D³h¬ ±`}XÄ‚E,X±âØmîìU3bɳ÷Sñ¨±ÙÒX;Ê R«¢%ÙæÅ˪hM¶ñ\±¢^s‹XÙê¹bˆåU´$[·ñ»ÜŠÖdëÉ;b™-ÏÒþ…X1l¡ý˱hX}±f±+ÖZõdÑX!Ö4±V¯m±ÜYÄB,ÄB,± ±ˇE,ÄŠK4‹Æ ±` Ö‡E,XÄ‚õa ±`}XÄ‚E,3v»äU3bɳtBû­É:¡w,bÍbé„F¬–Nè=‹XY:¡o,bÍbé„F¬¶ž¼#–YÑò,ЈÃ:¡‹†Õgk»bÙqObMë’A,w± ±ˇE,ÄB,Äòa ±bÄÍ¢±B,XÄ‚õa ±`}XÄŠd í_VE[°……~vEk²åqiѯ9ŽE¬YlÝþµÝER®±تýk¿@Y´æ8±&²í_ˆåV´$[·!–[Ñšl5ygŽeV´®öT«Ù’Í&Ö¯Æ3º+€M'Vã]ˆÀfëy“–fÍ–l6±êÉ{Ýø W³#›N¬Ý×ýç*šmØÌbõŸ«„jvaS‹ÇfëôåP˳è¥kõŠÎ³ƒXˆÄB¬ b…±+$ˆ…X!A¬“ÄJ—EÇ(›X°ˆëÌ",bÁú°6b•Ä¿ÚÚ‘õ+ùãCYQ±Jk…'b±šbµÚ³¸Z±šbÕOÒzÿäŒeÅŠŠõ´IËr ³±šbñ$-{VS,ž¤eÏŠŠµ{åIZ–¬¾X,bÁæ«°ËŠõ‹ö/;VT¬Bû—9«)Vóé\\ XM±Zí_åŒ÷…ÅŠŠU·•vUͰ7VS¬vû×òÁ‚íg5Ū'ïÛeÑx ³±¢bí^iÿ²dõÅ¢ýË’5 Ö‘ÕkÁR«®(Ž•(+*Öêµ¢í V?‹XA¬~±‚Xý,b ±úYÄbõ³ˆ5ÄêgEÅâX‰²šbÁÚ³ˆ‹X°>,bÁ:ˆUW"Èí0ì9ìL±Jcí”ÜÞëTëï›´8cÁΫjÒB,Ø b=F—èÞÃμ3Ç‚!Öîëþs•ñ`Áö³ÓîcuŸ«Œ ¶Ÿå#X9±V­mšõ¾Ç¶ãG±­Æœõ¾¢ëTç±+$ùÄ:Yï{d;.É'Öú÷E,ÄB¬WƒXˆK±ý<ë}mÇ%†bYÞ¸ƒ=‡E,XÄ‚õa öL±ŠtѰúl-Ö¶Ž]ºhX}öíòS÷ûÃ+g,ØÃbÕM\…K!ìQörÆúúÃv/ ±`'±—9V¹>´ír)¼Þ°U-VŸÝ_ wÏäŒ0yG,Ø£ìýí†íì%_4¬>ûp«ôÝÁ2ÞaØsX>ÒkÅ¡¥1ÛZAZ8cÁe[í_\ a³­ö/Ä‚=̶ڿ ö0ÛnÿB,؈Éû÷GjªEÃê³´Áž í_°“X>ÒkÅ’(ÛàUlº¤G‚Xý,b ±úYÄbõ³ˆ5Äêgk ˆÕÏ"Ö@«ŸåvÃH ð*–¤°ˆëÃ",bÁú°ˆ#Ö!A,Ä"!A,Ä"!A,Ä"!A,’·R>>¾þÛ>½ÿøó'BæíÞ¦ë—ØEå²ëã&Òõ˜EŽäíAåÁ(¼"‡òö(F‘y¼"™’·Çw³xB^ÎÃí†o£˜¼“cùé)^‘CáÎ; b‘  ÉM¬Òøê1¯M¼â¶ü±ûÃjÛ~‹õx«½w°:ÿA[.»ÿfo{¿ýˆm'È·Xåî¼r¹ñýUùþΟ—ï¯{½ ÚòãAŸ[uü¶ÿò¼Ý>%¼~oÄoÝÊݰÞÿm_"¶\®jFU¼í¿=×KáÃLèa?>þëƆ²“¶|«7bÛ±u'É«bœøc¶|¾š_uè¶ÿþ4*ü>µ—æ‰ÿã{{sÆ–½¶ ßb•ݧƒ·‰éî_éöÛpöOÞöì»íé»AZجEÜ–}·ýWäU±fýûŒÛ²ï¶ÿŠð‘ É+¿Üö›}þ·?ý}îm§Éۿù âÓ¿ýúûÿ†Sž²ûmÿ3œò”Ýoû…_Ôý”E,ĺü=bÏ+b] Ö5b] Ö5ˆµå±¾YÎXµ:ˆõ'ˆ…X!A,Ä ·ÎÝvšpƒ”„±HH‹„±HH‹„±HH‹„äÿì÷Z7Û§ IEND®B`‚Bio-Graphics-2.39/t/data/t1/version13.gif000444001750001750 3444112366325116 20105 0ustar00lsteinlstein000000000000GIF87aXºçÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿàÿÿÓÓÓ@àÐÿÿ¥ÿÿõÞ³,Xºþ l Aƒ¿ T8áÁ…&D,¢Eˆ^Ô˜ñáÀŠ'†”Hr£Ç“¿@r\‰²äH“"?ÂtÉ2fË™q¾ÜY“¦@•7yí ¨Í£>‘ê¬i4©Ó¥CBU*”*Ó©O«&mеkU®Z½5v¬Ù¨V¥†]{öhY´YÛJ|›¶n\”tïÚšW,Ü¢~÷²U+w 0Á…ÉÖ«·ï`ÄxKé8±åÈ[ÆÙíäËu+ÿÍœ“´é«§G·ýëpëÚ¿~V–ulжg‡Ö}3èÛ°]û¦ ¹xîÔ»‘÷ö¬\7HÎÂB—ιàaؼKÿή¸9òãÛeþ{/S9t‚ç¦>¼øò­ÜÉ&þðxú9…_7Üš¿@ì÷¥~ÝÉçž}ÖW jÇàüéׄй6×€.˜aƒ*h x&×™uNh"€–—bˆ nX†Ëµèa{ïuö_‰Jxa€1˜Œ PÑ™H]‘ÎÈÜŠ. Èã>>&$“S>ä{êÙ¨£ƒM*Ye—\*Ùã“Ržhä™I%nk÷¥—m§[Ža¹e‡qÂG&›{º™'_7"9] $¦GåŸâ19¦¢Pö)§y6“ž¤‘N&¢¨1Z¦£aúâK:ú¦sž&§)Ÿ§úé虆'§þ€Âš¨«¤î4¨¨¥ê™ê£»v*ëjyZJY®Òú±Ãþúi¯±2;+˜Ç*kª±"Û*´ÕJ«+µ,Z‹W…à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼â"Gï½øæ«/»Ú‹-‹Â #ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñų·\ÀwìñÇ O¬±·N:»Ç!§¬òÊ,·ìòË0üÊ0×l3Ë2›L#ÉÁÐ|óÏ@-ôÐ7çLœÏD'­4ÁFÿË+·Mö¼ôÔTWmµÐMë…ôÕ\»œu©£~·u×d—möÙ]ÕØh·-r¿ÉêÛn×m÷Ý+«ÝþÝx÷]°ÞPoëtŒûnøáˆ'®øâ‡ÛËøã#÷µb6*·à•oz¹¿™£¸åŸkºçƒƒ^ºè§“Þ¹ª›Ç=:ë¯?:ì³Ë¾ºí<“¼cë”ç>ùο—»¯¼_¼ðµ?|³Ë?{»òÉ3½ó¾¿{óÀýôÙ[iðag{’‡jÿýñáwk>ž«–¸ýóÒÃO=øºŸ’~äC~Ôõ³~ÿ*ŠP4î- {4à´¨§[9°:ºÝþ…Àʯ{ÄÜb&ÅÁHAhIä\õBè:†NŠÐ$À^0/´à›„ÂþÜÉBö3¡ÿH@öŽ~þ¯™¸Ìt%®¯‡1Ô ½·C÷Øè5çÙ’pÞ7Ã$Šp‰<N‘¦H((>Q-DžK8ÆþÏ;WŠˆ¥¸ØÄ2º°Šp¤_ ­Ã’ü9m‚¦s#}h¼,Š105ü`Cš†GÔ鑊Xä#s((ƈLDbÏÉ7f¦ƒâ 'éÇBªŽ“BôÏ®¥4t©L© S`³™5¦´" Cʧ2¦P•iÓ?§•4*Q}ZA *q©Guå3“êÔ+BõªHMi0±*ÕœFu—^å*X©:U­Þ´«rVùÈÖ¬.ó”Äd«\ͪT·Òd?iRYß*ËUõ¥XãJמUê°iÌëZ ûW¦š³±_%,_·êÇâµ?”¡^ÛŠVÆrv¬žëdÏŠÊ'Ѳ…ì`ýúYÉVµvõþ]b©%þpt´uí,nkÆØF–µ¢-j M$HÞ¶º}mkÚæîö›ˆEOtS»ÜŸ"´Ï­nS¯ëÚ:Ù ÜenvƒëX|†×ºŸU+DÏ»]í>Ö½æ…/xå[Pòþ½ö]-~«Ü¤Î´^þýïk"àø¿ô]¨Oº`³5í£&°ÊFºÙüV–Át…pÐ,áo8Áë…¦†v`{šËÃ(¶…;Þ c·#þ‡SLã–­Œ ®]Œ‹&âKdÇ5²Ân|ÜßÈ5#²’³0YÈP˜’keaEø‹Â½²“¯Ìå.OÓÈ$­2vûËßòÎWÌݽoþ{Ñ,^2·øÍn޳™ë[f5¿—Íû…óœ\gý®¹Ï¾õóÜ=‡ÏֳŤÞÜŽÙÐÔEô -èøJÚC—5.o[ùèEŸ™Ð®ô§)MLJW³˜…k›!}[9{šÎ¤.ô« ¬ÂæÕ¤M³¨aíê]ó9Ö¡t©ñÅﲑ²²öõ¡A­ka'ÛÙÁÎÐlOÁB»ÙÏÎv´·mn¯zfµ¥ 9Ýír[Ù‘fö¹¯½n'N7³‘ªóÜkvÓ›ÕaV÷½g}´ïZ[ÛæÞ7º[ï ë;ÑÏk43Þno ÜÞ/8‹ëÍð‡W<âüN7°Žñ×ÉË ˜þ ¾ñ†s|Ò×Z”•6åh]zÔ)?¹¥^—'¯Üb-Íg^r‹;¼ãG»9Ñr®¾—óZâ86ú¯7&ô¡#Ÿ8Ò‹¬ôeÓ°éX‹zÒw󩿪êG±9Ö#öt öèG¹×©¢»Ý]Z§:מq‚×=ßgWûÝIs“ûÝç2ïúÞ¥>ø­çç}üßÑþs½{œïkwùÜ—y^ð'|æ ŸxÆR¸vôç)_x¹_žî›7}籕é=®ñ•/úä­þzÌCÜ.¦Îª5Í^Çßö¥ÿúì5^{'‡»õ$"÷â}Ÿvà§^ø§'ýóM‹#§º¯ŠÏ¾ç—þïüßÛ¾ùßÍ´uïÞÇúÅ—¾÷Q¿~õƒßø¶·™Þøî¿ßýõÿèiïõÜÛü®{Pvv÷|l}ü|0ÁJ¨€’‡€Ä'€f—~ h€#¡pó¶}ÚÇ|ùÇ~÷Wí‚hyH‚h‚˜G€ôv.˜.çw€'X€!ˆ‚5øccGb1ø€3ˆw=y¥'v9è0eÇ‚%({Hƒ#¨„*7„*¶ƒ*x„8|L¸aç„OH€>¸‚†Ä…Ÿ„X˜dPˆ„?¨y7¸…`†/S„](…è…¥‡ª/X‡Ý¤…@˜‚d(‡°Ä‡¹ä†F¨‡S˜„h(ˆoˆþmhˆx†yȈf¸„…舜ç‡ó£ˆ‰(‰ªG‰Dˆ‰Øøg…UÈ}úGŠØxC4Šh (‚­hƒžøˆwY®(Š‘‹“ˆˆ_h‰»ØIþ·ȃšØSº‡Å8‡˜ˆ~$ƒZ¨¥ŠøŒh‹Ÿ(²HúC}ŦXÆ¥ŒÇØ‡Ýø‡¼hŒáˆŒ]5~ÿÇÛ(ƒÃTãèíŽÉ¨ŽÁ3\vb}¹øŽ•Âøùˆ‹™>¿øn·øŠÎ¦ŠY‹ ‹ X¬hÿˆ›X†÷¨QH[¡ç¥¸Š ¹yŠÉIŒ%ÉŽ¹‡ü8‘Ëh‡.ù’"‡þ‡Õ’9’s¢†8¹0lØ‹þH’)9ˆÂ•“By0;)Ž?yˆ'ùT6”LO2Y‘=)I¹€MÙ”EIŽY“49Ò"„UaWéŽG¹ˆQ¹Çã•_Ra ey‘cy‰V“r9—è2†@¹ŽJÙ–*9•ÿ–•\É‘"¹•3 ˜I˜ i˜°è—ƒé‘iˆ’…ɘù˜ZI™)™‘阘y˜›™˜6i–oɓР•£‘¡i”zy—+i’§‰•Ÿé–©‰”­)–±I–¥é“µ —·)•³É–» š¹)𝹗½Ù¿ ›ÇIœi—Š•Ù™É™ši™‹é˜´è™‚IšÃþ©š|Ù[Á‰š¥õnÀØKÕ9ÎÙœÒ٘晞“YAÌx|ØIÚ™¦ù®IŸ¸ž†Q}ÚŸçy™ì™™ë9 êY eŽj•ŽÀ™œÜYœ,¹š(iŸ´©Gôè]Š5ŸòYŸ *›ê›ÛÉ¡á™IâIžúŸåi Š¢ÐI íÉ| ‰ž,š¢-£+ª¢þ ®Œ':£6úœ7J£?Ú£0*¤ ¤>z¤CÊ£J*£L;tù¤P:`T˜¤M¤Kê¤Ä¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦l ¦kiœj›qª›¥" mz§xš§zº§|Ú§~Ú¥oú Ý©|þšŸuú§ˆš¨Šº¨ŒÚ¨Y¨¬Ù¡pŠŸ¼ieŽz©˜š©šŠ©¡*§”º ‡º©¤Zª¦zªeÚ©yù©tªÈ9ª¨«²:«œj— :§Âéªm¥¼J—¶ ª…Z©¬š«Á*ªºÚ ’*¨©Ã ž¸ê¬Çz«Ñ ¬&Z¢8j¥UФEJ¤;š­TZ£ G¨Õª¡ÏzŸÅúªÓÚªç:ȗת­Ý ®Þº­WŠ­òÚ¹{ 8¨ûº¬žZ® °JŸï™&$*zéJ¬ãj¨ ­ëЬ·‰Á*æ÷”äڰ溰Â*°“Z¬Jž;¥ô:¯ñj¯& ¯Öj¤jC+[þ\ýš¬ÌÊ±Ê ³ÿб‹ŸùJm/Û¬û®ßz²?‹²û°?f;+³1k³K´Ôê³#{¯î–‘O ´U+´ ˴ꪱƪµ ë´%‹µ«´;®½ê‚¿ºµ`›²Üʶõúc´·¥ªªV坫д5뵋v*·~[«›µ\‹®zÛ³Tk›¸J·}‰·wK¶3˳7»7Š[¹‰Ê¸Þ)¹K;¸Ê©¹e[s–º}Š¹âº¶C˹ë¸u[}+º®{§¤{´›´…;¹¨+­{s¶n—¶_{¸nK²¿ µbÛµ·Û´¾{º¦+¸É;¶µ»¹ËK¼ÏK¸Å«¶Ç«¼Õþ˼ÓÛ»m‹¼× ½Ý+½ƒÓh›&»Íû¹ßÛ¹ªÛ¸³›·ÔҮؗ½{½è»¾[¾‘;’9!ˉa´þ{µÿÛ¿<À¢Ôz7Tºç›ºô»ºž{¿ ¬¾…*±ízl¹öÀ™›¾lÁ¼½ÖËÁ„%çHH½—À¸ ¿†ëÁÞ‹Âà›j <µ*<¿öK»&l»ò«À<¢Wâ>0ü¶¼V+ÀB Äû€d´ô‡ÁìÃLÄ?̽1ŒÃ®¢£<Ãì{Ã%ŒÅÆÅYLÂ[ÌÄC Å`ìÄM,ÆÀkÆ÷£»!Ç»ñëÅÔËÅ_|Æ­ûºtœ¦±›ÄL¾5ì¼n¬½NVÇþ€Œ¦wÜÃgÜÁcŒÆALƈÈŒ<¦ƒü¾ZüƇlÈ…Œ½ ÛȘü¥Œl LÑìÇ•œÂœÉ¤¼¥›\Å{l¾p,É¡lÄ£\Ê¥|ÊkÅõ›ÊLË <j¼ÆkÉ}ÜÆ« ÊÂûÄ”<Ìe\̉ŒÈE,öìÉ¿|“ìËÁ ÌÑ,Ê­ÌÌŸLÍ×,ÅÙ ÍÛÜÅTÌÍÏlÃãÌÇÓìÍÆÆYë¾ê,ÍÕìÊßÇé¬Èô|Gùû¢Ö<ÏÊLÌîϬ¬ÏÈ|dð©#áÜÅçLÎmÎïŒÍå¬Ê¢"ÁD„Äý ÐÌÍÏùlÑmD;[ ÏÑË,Î íÐþ,Ì:þnã6 Ò-Ò-ÍÐ%}ËÍ<7:¬³#mÐ MÒ;­Ó'­Í! ›øÜÎ0}ÌÓ<ýÓèüÒÈYÐGmÔEMÔ.ÓòÌÔ2ÝÓUMÕÿlÕIÔW­ÔÝ>&bZF`»|Ö2ÅÆK}d–+Ësü·Ër=ײ<¾x,7oí·nÝÖ¯<×~ÝÈu=Âq’×r{`mm.ØŒØj­5|í_}?Š=ÙtÌØ½l/‘ c™ ·”ÝÙ›—¹Ü•Ÿ=£½Èž}ÚzÝØ ½+\FÖcmÖhÛܤÚ&íÕ]ÍÕ>mÛ¹ÛYÔ»­Õ( Ü@ÍÛ[-ÜkíÛ½ ÕSÜÅÍÜÁíÜÃmÜaþ½BÐ}ÜÊýÕº½€< É MÓÝlÃø#Ý«ÝÍ}ÝV1@züÝãMÜ|ÂHG"­!ÞµÍÞÑMÌù ßéÝÝÎ<Ó/R°,ßÕ=ÝäýÜeìßzvMÈ^ß›%o§UkvtÑæýÛ¾Þ$ÑR”Á¸ Á5½-[ă"¥õ,áRÝ/ÝÑAÁ³Ü᡽áW1GhBÝžÜ%~ÛBÛƒÄáê=ßò=îÝETá<.äÞ]½÷-´]äüý¯¡ÖNäûÕ.,Ñܽ䵼ã\K nÝ5Ná3¾áœàU.åÞå4>âOmæå­æeŽæQ}²çwrn`I^„Úzž¸þ–Ýv{º}¾[yþç„.«¾1…®¸‡Î3ƒžè޾©‹>3žÚ—ý!>é˜Î¨‘N‡™N«›î‹ê€+²¦-ê¦úé®t馾ê°Kç¬~êwnÓu>ë+Eç´>S±~åú}Å»®ëVÞâ,®ã½ìXåN>ä_Þæûœì ÎæÍîæËÍì\í&ÞãÆ.¯]íPÎë¿.ìÙqwì.Ãô=íËîìèÁáídþìéŽc?Et”í6¾í¾þîë~ÏÄ>ìî~ìÀbàTíê.àçnðE,¾‚­ïORΟ,-íOñO~ÌŸá^ìÜîðÌóáVâH×WðOþòÈNÔ(>ñœ¬ÄùÝí/ntT~_òÔ~ï®ÒÄ¥ò¨ÌñùðŸ2ï!^"ò5ïåê|ä+æ+ŸÇÿM¾åoòJ®ïC½óþ>î<ÚZ>óDï^Oâpæ ïóOö=õ4ÿõi^ôg®öonÏ·÷r.Ž3÷µ^éóêz¯çD¦ê{ÿ§¨^Z?ø“Ý÷„?êü{‡¿ørmøŒ¯é¹^~ÿø”Ïç˜]ù—ù”1ù˜ßù†~ùž?ºšÏœú¦é úyø`c÷®÷uÿúÖ4úKlöýîòµö]önOðl¿æ¿¯ì¼?ükßûÚ>ôSoûÿ®ûÉÏü×þÎõÍýÏoíeïüÕ/ý×OýgýÛ¯ý·ïñ»_üÄÿöãïûÆoóR?ýøþýÊõWŸûÜÏþÖßýë¿üñoÿÞÿTjïFüð^þñë0 ˆ0!Â` táCBœ¨°aFŽ=V”øñ"H†!IŠ´˜ÒäH–Q®TÙñäÌ–0mÊdS¤Kš… öSgÏ›yæ,JçÐ_G™>MŠ´äÒ¨P©N}y5ëVšN«~Õ*ÐkX©\ËŠkÖêδJÕ®û–ìZ´¿‚ ;x7oP‚?…¶=Û0ÝÀãºE\î`Æ8+žõ1aÊ‹#_–k´qæÄ“7'þ6ü²Ù†?Ú-è7õêÊd=cm™óèØXkÏ&ü7`Ý·}ׄM[xoá­57ÞYtràAÞunõiæL‰W—¼\ôu펻ï¶]ü{]ð廎;rè™óÄ;}¡^Öè¹³wíž·þà÷Íöï·Üø›-ÀôH#ð7×cK:Õ@’î¡¿ðc‹Be»ÐBàþc¼ 9lOÃq»‡;qÀ5܈>»ø Fè¤ûð¼ÿ[о³»±FAdqÇüz<ÐÃ" È÷lrðĉ|Èã¤ô1J“¤òH+‘ 1Ë%•ÜÌþnrÑË.¯4QÌ…DPMÙTÎMåTþÑÌ1éäÑÎ5ñRÏ7ùlÓÏ9­Í “Ð< ÅqFG…4RI'¥´RK/Å4SM7å´SO?uRD„“ÔQ­+ÕSá¦W_…5VYg¥µV[oÅ5W]wåµW_6Xa‡–Æ¿T´OF«LC.Yl•Xi§¥¶Zk¯Å6[ms5¶Yõ¼rY-Áµ1YÒ¢Ý6]u×e·]wÙívÕoå ÷YÉÝPÜ÷Ð}·_ÿ8àtã5·\}Ã,ØÔ„U]˜U†8b‰'v•àƒ•µ—Yz ÎxÜ[â—b‘G&¹d`-î¸Ð”¾xφ½ûذPg¦¹f›oÆ9gwv4æ3Wþ¾óå …æøX–v¹å?‰Î饕j•ZêEŽë©ñÝrÄ®ÓdK«1¦:i­¯.ûé³Éæ_±×tì¸áNTîºéVØî¼ñfXï¾ùv6í¬ßú㯠ûgÂÑnÛçy™>ü^ØâƒÒmÅOüq¿/7ÜrÍÿ|q˜3¯—))Ï2rI7Rô¹]¿ö½eÿ›öÀ1ßfw‡5ÔÅUÝcÖÌ}èâ‹Ætã•G¾sÇ5k2úÕLû½ãà‘=¾iÛGÏþíí—ÿ¾yÈ=/½qçú‚N¾«÷šüÖ“_{øçw~øëŽ_ìø"Œqÿô+Þûê×=Î/€Äcžüþ˜@ïµMzúûÀFÀЕê~Uc`³wA³åOƒ äàŸxG¹2ÙEp!ý h?÷!Ѓ ·B¢4IN2dÜ_X>ªpƒ-Ä!ÛzÈ‘b-ˆ¯ó!¸Ä1vIŒŸgE 2‘…M´"yHà 2„g_cÅ8FLaÑŒWD£¹™Ìo,Ê¢˜Å.nñ‡gTcSÚG>öQ`r¬"ë¸Æ;¦qzôc"ù/@ÆŽ;$¤ ID.Ò’—ÜV#&ÅÚQÑ‘“äÚ19JRþJ“zãäí†ÈEJ¦Ò1¢,e,eY«SâÍ•àóä&J2öÒ—¿f¨@þ¹ÊBæñ–â+æ!©@Væ•»$¦$ ÙJh63šs¦5µ™Ljf“›Î´e5¿yÍ@Nœ²[fÉùIs®S—Þ”¦1ÅÏÂÜjéü 6Û¹MzvsŸãä§„ÔgÄyêSžð4¨2 ZNcÚs †C›tÂ…²ó ÿìç9TÑ„=Ðw¬¨ŽÊP…ŽÔ¢%ÅhB[éœþEgzõ`JIêϋ֥6¥iI©ç‰Â4u}¦Iß)Ó“æÔ¨øòèi2Q‘u¨8Õè N¡¢¢WeiD³ÚT¨º3¨NýjW:Ó$2UªU¥*XÓ*V€¶5£× éYՊΩÒ­vëFïªþ׼ʕ­okQ£*(|.5˜—:àa+Å6Ö±ÍÙ^ýzHXJ¬–²«lÄP–ÙYvÖ—åë_ãÇÙ‡VN¤ý#NPëYÖÆQ²„májYH½‘R­Åí"M Û×BM¶ŒL¬mU›[âöq·÷¬ë‰~ë¯ãbm¹ýÚlq¥ëÆæR´·Îîðžû®èN×»"«.WoJYÚB*±å}”jÑ»^ö¶×¡¢%«W×:ޣʯð¬}CKßÁ"÷ºÖí+oìßô¿â­o`ŸÊ_ýN6ÁnUi \`ãwÁ,„ãK¨¸Ú1ÃŽpƒlá°2XÁŒzjÔyâùb8Ä,¾¯‰5œ_þÜ`Õ4Z½±O#ùâ_X–1ˆ7ÜãÄx4ÅÊ1 },b“¸Å?F0”cz%–¾ÈžL埒Kìâ! ™ÆD~2“'l¨NäªÜ 2½¼dï—Ë_^s‘_ºT…Ј™`Žñ›ÙŒg7Kù§6sVmÜÒ yX͇î2¢á¬è=Ç9ÌY2+.Å d=oÙÏÀK®ƒ/]Ï­¢¹Ò泦'åQO9͉Fõ¢SÝhF[ºÔ¦pÝ;ëÈÆÚÔŸÎó¦ÛèÔ|—á½µ®'xjU›ÕQÙ®¯¹ËkL3Ûz™1±Í’le· ذvr®_Ýl[cûHÔ®öº®Ííl÷yÛÏvö®ÿîpþ,ÝÃÆµ¹Û,êy3¶Ý®í6¹¥íêz7yß¡uÀmönÄ•›Þ¡Žv¼îhm÷{Ìÿn8Âý­ð„ »à—·ÄNñ‰[\rùF7ÈÕmðŠŸ{ä_x«AÍðŒ³<嫿·Æ«ÓáÃ|å*¸ËKîpJ{Ü-G¾³Î;nrxû\x$:Ïy*h¦'YÅù´yÎqÞò©¿ÜØ1:KŒùßoÿÙÈþÒª¿ë=Ðk>Ô+@Ü+¿ÿ³,‚Àéó½¾ê+¾ ìä=$ÀÌ£¾õkÀüƒ? |@Ì@À‹<ľû{;Œ»ö¢ýë@D"¤=´=|"Ô=¼@ä?ÜAœ"?Ô?0S»$AæA\BÔAåÓ³SÂ$Ü@"üþ@*DÂÆ+Á(º<k©)ÔB0¼1|<,Á0t.úH‹@„B ì$!t?7Ä?^Jô‰4½;Á'¬C9lA:LA> Ä;º;Ë{==,B+ìAE|A?ŒAA\ÁI*ùPª§cB3¼D4ÌB2ì;M<ÃMêÂ.üÄ2ôÄLäDÂ+E'ÄH<ÌüO¤ìOøüO† ÐW!OåœOßíU Ö-MUÀaÿýÞ .ß%Î^vb)æâ.â"ž^¾á ^áÞea­ã_‹¤b ÆâÈ=â*ncøµb÷ã&ã>c3ÖãäMb&Îc>þãåÝcAäAöà7fã>Îâ@>ä;FbFvá:Öà9–_EvcG†c4Qʺc#ÆäD†äFä¦ä“°Ê0å1.ee%¶d9àÅ-KNNeO^å2.ä\&ä]ndÕú˸|½ÓídTþdR–ä+~e;æÜѽSîæZ&æ[ÆcCŽädžd,–ÝÆtæÚ=Õá-fU>f:¶fdeͬ3Ç Sjåo¶åp®äVöã”XÜIÙúmçqþgx^duve}f¬\Õ²aî^hhvŽfwÖ_„FMPæçxÖå^Vh\æåjögXÆçwnè}~hŠÎèKÞß4†Æ56æ‹Nh’feuÞb/Vé•.a0.hi~䎶èŠVfÆb雯ivio†éL¦ék6i‰Nœ&ê¢nà\{>è žæ^gÕ2ꨖj¤®gæéˆnê‰~j›–ê®Îiª¦eƒ~i¬Ži§îgŸðê´fi°h‚¾j¦.k­>kYigip†kŸ–éšÎk†6k‡–kÀ†è¾éŸ&ç½jÃÎgÄ>ì¿ÖèÀ~ìÁVlŒvl&k½®ì™fìÅÎl¾žì’þìþ“îìÊ¥[ȶlÂÆëÐjŽíÆ6E)Tí¬–ìͦlÓÖìÖæl(‘åblÖ¶mϦmÐnÑþíküå¿îÕÞjÔ¾çØŽëÙÆíaæµÛæ¹.n׆îëÎíìænßþ³lv:DìíåvnÌÖîÚînòNnÚÞV´Óòöëóîèžoù&îôöšyæíÈöîþVoú¾oÿ¶nü†?Î\ïçðñðçïÿ¶ofÜooðwp ?mø.ì7o ¿í—m¿p oÿ¶º6ñë¼ëæñ pÂHiµ†ñ—ñ£Nñ¥ÆðÔ^qÓ™ñçñgkD•Þ±fnœïñ#Grœþþñgë·¾qG#Oò)§r(^rn†Ù°îéŸÛ*÷ò/ÿâò''òG60Gó47á+×S“n3ÏÌ—óvóÄÎq(÷p¯pïp·s8ßp>ó<ô=7t GtWô _ôt.?ôFïsAÿsB‡ôDgôLwtKgqNÇñG_褶jQwkRorSßòN÷óºª.uW?uXOõO÷t<ÇïyFg1wò;/óZïõUßnÿ¾ÜÒÍÓtuZvô¦tì^ö`gÌ;,TîõRc÷õ1çuk?v[oveg\J u’õ˾tIôd¯ospC7çßv]GuqWõm?wyþOwD×ï`Ær¬}÷!Çöjßõlÿuz7p-‡wd§wåÆôMGw„'wyÆ÷pç÷÷÷}'ó~_øtMŸôŒWøƒÇø„ßx/wB›óYswˆ¯x‰¿x=§p)Wó*gsj_ùBùJOo—ù)ù“'øˆ§økWy Èy5ßù:gvŽù†?zœú#/zíœùq×ø‘W÷¦Gó§ÇÀ‰Gy ÿy§fz«÷qžoëXïù”ïz­.yâ{ Wj‹÷x–Wzg¯ù£Ÿ{¹{n¯{¼¿ûyGzªÏ{¾ÿûzß{ÁŸz›{š|†/|ºOüo|¸_|»|½Ÿ|À|įüœP͵gòþY×ö¾7|ÐgüÌ(Îls¨?|©ïxÑ—üÕ·÷çÍ»³úxg}ÊwýËWý¤oða·Äbçü|ò ¯}Ë'}ÇŸðéÆ2·~¿ýâ‡üæ‡~Ýo~ð^ÙO}Ú|Å~¿Ç}ìïuwoë_~í—þòç~çÇüí}z¾¼ÒfûQßz€Wþì7~õ}ûgwïGÿÜ?ü·}ó`¿Hð—A‚ ;ˆÐá‡#R„hq¢Ã†7*¼Ø‘cA!jühräI‰) k‰ò寒0+‚T9S¤Í˜8i®Üé“äÏž5yÞ:4hQ¡)eæ$ÚéS£J“RºªÓ¬P™j=þêuªÎ¯U»‚åŠõ¬Ø°`ÉŽÅi6-[«0ß®E[Ön[¸ñÊíë”nÞºiûåû×0âš„ã2v›˜`ËÈ’'S®lù2æÌš7sîìù³ÞЂ .~˜¡éƒS7VÌ:uiѧsÆ=;bíªÂŒñîíû7ðà‡/nü8òäÊ‘ “­Ú¶ÚÛ¯¥Jw~ØútÒÙ«kÇîýêwîsSï^nþ<úôê×o½õÝðÏ«æžo÷öû{åÃÏv~ýE§ßAå±w ‚ *hž{âÞ{ùÕ'`\¸_„ÿQ÷ ƒøi˜aw dà‚%šxâ r¸¢‡"²ˆa‡~è …3Òv¡sþ5ºx‹$¢ø#A §"…2îhdŒòé˜$„LÒˆ#tK¾èš|> y%–& %}\Ú'e‘T©¤—–¹Õ™«Uù›mºù&œqff£€`J˜f|cºh§|ê‰|ùéä€aî‰g—æˆh_ƒN"¡u2Êc¤‚N꘢Q^*f¥‹f:›£†ú犡"ù蓟~¹i“¨–ʪ¤Jªª™´¢i«š²ZŠkžjÊk¢ºz*ì¯Ä‚ ëÀ6Šl‹¾«,¥®ÎºVdÎЬ©dB‹©±«nË©´»v[븷–›kRÍ5Øœ¨ÉžÛk¸ÃZKî¼æÖ‹n¼ÅÞ o»ÓîK_µÌ’þK¿¬›ï¨ÿ.ûm«ýŠ«p´Ë‹°·ï 1·×t0Ç \°ÄRLïÈö–ŒoÈÏZ¼ðÊcË,Œ'—U°Á’ìñÁ)_ËpÂ2_ì3Ë7ü2Ïî ëÑF}{*~Ü´Ç:g{hÑÍ.ñÕàêLòÖ&w2Ñ-ãÔqå|gÕ1ÍoØI[½öÏpõÐEOMãÀyƒ<0ÚbkÝ6ÝH®´Ü.Û ó†…c­øßeôݯ¦8àŒ×í·È– ®9á•{>ߪFîïàoŽyÏœ›~øä™Ÿžôè—®öëƒÇ>±ê´³Žzç»»m¶œÁkÖúˆÂoÙÆÇ+¿<óÍ;ÿþüð¼¯ÎûíÐY™%sÄŒýy[È=øá‹?þÚW¯òïß“oœ÷¼_¿þoí?ýõÛ ü¶#îzÑïÛ}ðîͰ€< pòǹóU,}A oÈ(ÿÕ/„ 3x% *‹\CÖáÇÁ•…p}Ô Sˆ¥*̃^!Y´’ï„*¼!$C¹¹lý`ð´Ä ¦dˆF<"“¸<óí/uµ[`wF½(öm¾›官»,N‘‰^”žîºF.ÂŽŠfü¢¨Å'2ªŠqccÏ8Fþ‰1R,#±HG<ÎQuÔ£ùhÇ% Cjrä!yGýåþq‹{dd‘u²oˆl$WæÆ¹92¼d$5ƒŒ²x•¼Ù)IµIÃý±“’lc"]¹ÊÅe²…7{ÙP9"Cbr¾le-!Ë`ò°x™Ì-ui0^†r˜¿¤"gÙ8`>ó“•l)["döÉ™Ôü&4eéÍpÓK Éå6O’JBIórä¬&{ ÎOF󌥬Ù)ï¹KKÖSžïœg<›éOzŠó(Ý8 ZN„4  |h?…¢Okµss íVE{PX6”£ý(D Òˆ†ô¢M蕨ҕ²´¥žéhaªI”¶‘†9¼)N$S[îT˜=å¡Ms*Ô¡–oþ¤"-)<=:È µ©DÝ¡9iS£š”bÁ`ªS³zS¨2”ªI*R©‡U­’5…\ŨTgúÓ¨šo¬e}+ÏzÒµv5¬ÿ„Kóª×½*‘®hõë\½ºQ°’´°G5lU™iW…~U­‚½+cëØÅ:±åéc# Ùʶ³‰å§g/ëÓÌrö³Ý¬UÓŠÙÀ° ´¦U¥jGKY¥ZV²«íKÓZ{ZÒÒ6´¶•mm7Û[¢Ý³¸ÚÔ¥bƒ«Ùå–V´ÅDmrÅ™KuyìqÑ}-;cû\Þַ©K¶i³ƒÞìºÎe+w'«Üæþv»½æGô©[ØB×µç­ëz‡{ß¿6þÉLÈ|³[ßÝζ»ØuUF§÷]µ7ŸÇå&}Ó{[ï2W¿íEoÕ[ò6Ã>p»Æx¿ŽÊDS;à{¸f/‰] âS½ØÂ1vo~ lb‡’¯>þ1ƒÌ¼ XÂ2¶›[áªä%—H®?YÒQ6tªŒ|ékùÆ‘îòž=]hN—YÔg¶ô§1-9M§šÔoõ¤M}bXošÒþ®°Žm]j\ÇÙÕy¦u«uýjl£ØÆ>6²“­ìe3»ÙÎ~6´£-íiS»ÚÖ¾6¶³­íms»ÛÞþ6¸Ã-îq“»Üæ>7ºÓ­îu³»Ýî~7¼ã-ïyÓ»Þö¾7¾ó­ï}ó»ßþþ7À.ð¼à?8®ð…3¼á8Ä#.ñ‰S¼â¿8Æ3®ñs¼ãÿ8ÈC.ò‘“\Þ-)öÉ)sŒ“¯\%9Ìc.ó‰§Üå-G6ËY~ó™ó¼ç>ÿ9½%cl=2E':Г®ô¥3ýÚF?ºÎ…^ô¦S½êV¿úÓQnsœoýê^ÿ:Ø{.õs=ìf?;Ú?^s­+éHOþ;Üã.÷çÜå*g;Ôç®÷½óÝáoï;à/øÁ¾ð†?<â¯øÅ3¾ñŽ×{×qÎíÈÏ›òCŸ|¾³.ùm[Þä_9æß÷®ôéî|¸KúÔ›{ë®o»ºWî×'[öß¶½èþzÔÛÝæ»·;ÊÉuá—~ö¦‡}Î/ŸòàGý÷G?·å£¿sçûžøÊw}ñË-ýä3ø oþõŸŸ{«OæòËNþî¿?}ó¯Ÿöèæ}õÓ|îýìOýØ_võ3_ýôÇ~ÿ»užýõßüUŸ¶ßý_ÓEï)Îû¹Ÿ÷韷•_Ö ÿÕßz ömì ÿþu n ÞÞØ= J`ž` 2 ù‰ Æ  ~`ú^ößù¡à  jÞ¸‘^³¥¾ šžB_ú` !í-¡ ÎàùÅÛ¹ ‚`®üàò`~ î±^ZáÍaa†áò ³à~_žàN¡îå_ø]¡öžøEávJø!¡j]"Úa÷M _!¶Ür"¡"æ!#¦¡Òáá=¢ûѵm"Áiârâ´y"&fbµ]â¿=¢#&œ*¢"Àµb–¢,Î"-ÖbæéUºIâbÛ½É.æU.¶É/ºT0²‰-NÜ0$£2.#36£þ3>#42#Fc4®ž06f£6n#7v£7~ã6 8‚£5ƒ9ž#:¦£:®#;¶c: ;º£5ÒbÙ1J5æ£>îã4î£4á8¤@¤8d8a<&¤B.$<.ä;!=žŸ=Þ#Äù£E^d2bFf$@¤G~$1`Hbc9:¤Ižd1`Jšã<ŠÐeL$E:ÜFÎ$5ö#FZãHæä8$H–äJþd;6$J¶¤ Id÷ÄäÃѤR:£M^$Nê$Tr#O~¤O¥U¢£Pž$QÖQ2RÊäR†%G¶ÝL>eTžeHž_NVåU^eVšäVŽO=åW2Ü^<ãg cKá¥gè%KñegøåJ&gÔ¥a&b&¦b.&c6¦c>&dF¦dN&eV¦e^&ff¦fn&gj\@;Bio-Graphics-2.39/t/data/t1/version14.png000444001750001750 1402612366325116 20122 0ustar00lsteinlstein000000000000‰PNG  IHDRXºÒ4ÒgXPLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿàÿÿÓÓÓ@àÐÿÿ¥ÿÿõÞ³ /ŒÒyIDATxœív£8EùÿŸJZ3³ù­í˜Ž‘Ì– ½×ºïìpÒ,nƒBTaùøÎç[Û_°°¯ØÅ±hX}¶,VÒ.Ú†M)ÙÕ܉ÍÅJ¿ÿ‡Xíìï1Ln5÷ë÷?«Ï§mâŒõû}zzÚ&ýšãØåöñÓÓ–Ká;l>Ži•L¸æP±Ö _ºb5°é6r›qÜŽ¤hÍqìò½½]þn/­DÄz}\þî—‰Åzüëºë…Xo°qüØl'«0y_'ºEk²Ùäýsò9Öæ¥Ÿ9–xÑòl>OÕ¯9T¬Ÿ9–xÑúìæ\eSs_viaa_±K"õ9Êѵ½Ê0±þ!µ9ktuå –A ±B‚XˆÄB¬ b…±ÎˆEês(–hF‰Õþb ±`}XÄ‚½R¬ª5–øBv;{Õ(Öºr[ºh 6m¶.5÷+íW~¯°•.Z“M…µ£3¯ -´-q)|ƒÍÇqr±òö/Äz‹ÍÚ¿Í)²5DZË÷v×þu¿a«Z´*»kÿš\¬Rûg¬ólÞþÅïnØOÞë6Ÿ¼O.Öæ%Ú¿ú°´ÑþÃ&Ú¿‹†Õgç[5У?׫ kôÇ‹'ÖèOVb]ÄB¬ b…±+$ˆ…X!A¬«Äš-ab‰f”X-0,ì+±` Ö‡E,X±Òþ§úrö¶§X©°IîÃ^Ã6‰•JÏ»B,ØF± O\ aW¶E¬_‡Ï»ýÀ°×°Mb>ïJôÃ^öˆuü¼+Ñ { Û"V>ygŽÛC¬Í×õç*ãÁ‚­g{‰U®2,Øz¶›X°°[¶E¬Që„z½oÛ~\â(Ö •½ÞWtÍgß b…d>±Òë}[öã’ùÄÿ¾ˆ…Xˆõn ±Bb)Ö oƒ{½oÛ~\b(–å;ØkXÄ‚E,X±`ç+=VOXôl¬‡XÏ«é-z6VT¬TZ•ŠXF¬¦X,bÁ"V»Îʽj6`g+==šÀ£f v:±RéÑâ5;²³‰•7–å+TÕj¶dgë×ac™hÍŽìtb6–ÉÖìÇÎ&Öqc™fÍ–ìlbå“÷¼YC®fGv:±6_ן«tj¶ag«þ\%T³ ;µX°qìlb]¾„kx£éĽ õê b…±+$ˆ…X!A,Ä b!VHë"±¦Ë c4›X°ˆëÌ",bÁú°ˆ‹X°>,bÁ"¬‹Xë]D¯š ØÙŢűú°‰ûKØÙĢűbXZì¯a§‹ûkØÙĢűbØlòN‹=bufi±G¬¶ú\%T³ ;µX°qìlb]¾ä|x£éÄúw² b…±+$ˆ…X!A,Ä b!VHë"±¦Ë c4›X°ˆëÌ"ìÜb¥ÇŒ-z6ÖC¬ç•é–=+*V*-ÄC,#VS¬R —B+VS¬ÏÃ^Ëžë°—Ær gc5Å:èÙXM± “wn7x±¢bm¶y/å@ÏÆê‹•÷ÒXôl¬X°Ž¬¦XCÖ—TDq¬DYQ±F/+±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:ĪgEÅâX‰²šbÁÚ³ˆ‹X°>¬X‰e3V¬‡Xt騱¢b%ºtÌYM±ŠÏºáRèÄjŠUêÒIW¼/l/VT¬¼K'`GÕ û`5Å*wé ,ØzVS¬|ò¾^z6VT¬Í–.KV_,ºt,Y±`YM±¬ˆ©ŠâX‰²¢b^ÒWbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏŠŠ%űe5Å‚µg ±`}ØÎb¥ýŒå>0ì5lO±Ra‰‹Ü†½†m+eËñ> öƶˆUè¥áR»²-býÊzi8cÁö+ë¥A,Øb?ñFôÃ^öˆ•OÞ™cÁökóuý¹Êx°`ëÙ^bÕŸ«Œ ¶ží&,ì–mkÔ”^ïÛ¶—8Š5hÑ\¯÷]NØ7ˆ…X!™O¬†ôzß–ý¸d>±Æ¿/b!b½ÄB¬XŠ5èÛà^ïÛ¶—Šeyãö±` Ö‡}!V’.Ú„]§8^5е.7–.Ú‚M›­KÍ}ÅJ7ž¶œ±Þ`SaÁã¼iY ½6‰Ká,ÏÿÙ‰õq›¬óÄj`yþÏ–]¾·é>·Káý¾šjѪìþù?s‹õ8yo‚3Öi6ïYšúÁRKiòŽXï°ùä}r±6/­ÿêä‹–gyþÏþ>Vª»ƒeü¯aÓ¾gÉ æ¾ìÒþb—kÖn%j G®W&Öè•h'N¬ÑŸ¬ĺ(ˆ…X!A,Ä b!VH ±B‚XW‰5[ÂÄÍ(±Z`XØW,bÁ"¬[‹ß|܇Mté<¶éÏbeá¢-Ø4ýz¬´_è—8c½Ã¦Ò“…ÄkŽcK]:\ ßa ÝNé±*K³æP±ò.Äz‹=|²hÍqìò½Ýué Ö›ìÁ“…dkŽbË]:ˆuž=~²fÍ¡b&ï?? P-Z“Í&ϱ6/Ñ¥Ó‡¥K‡.6Ñ¥ãX4¬>;ß²™– åèÚ^e˜X£W¢åX¬ÑÕ•ƒXA,Ä b!VH ±B‚XˆÄ:#©Ï¡X¢%V ûŠE,XÄ‚õa ±`}XÄ‚E,X¶,kÞa»‹E'4l±аbÑ À.tBÃF°Ë÷–NhØþbÑ À.tBÃF°ËÓKtBÃvbŸÅ¢¶»´À°°¯X–&Ÿ‰áÅ.é?RĪgëD«žE¬A¬z±N±êYÄ:ĪgëD«žåvÙàQìâX4¬>‹X°ˆëÃ"ì•bU­q°üÀ°×°¹Xë3¬¤‹†Õg— Òï•ÊÒEÃê³¥ö¯Ä¥¶•] í_ˆÛÌ.ßÛ]û×ý&³jѰúl¹ý‹3lÄä±`[Ùåé%Ú¿`;±ÏbÑþÛ‰]Z`XØWì|ë± ’#;Ý Rĺ†E,ƒƒäÈ"–ÁArdËà 9²ˆepYÄ28HŽ,· ’#»8 «Ï",bÁú°ˆë Ömr,ýa¯a{Š•x\ l±ÖóÓf‹X°ÄÊǸÂvëWZ»¦SÚé¥üa¯a›ÄZǺ¾Â¥v˶ˆõ8K}l¶ˆÛ}òÎ ¶‡X›¯ëÏUƃ[Ïö«þ\eÓ vTͰVS¬rcÙðÁ‚­g5ÅÊ'ïëeÑx gcEÅÚlóÆ2ËžÕ+o,³èÙX±`YM±,[ªŠâX‰²¢b^wYbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏŠŠ%űe5Å‚µg ±`}XÄ‚[¬Dû—ë!í_v¬¨X‰ö/sVS¬Rû—B+VS¬Rûg,+VT¬¼ý뱬XM±ŽŸ+f9г±šb&ïÜnðbEÅÚliÿ²dõÅ¢ýË’5 Ö‘ÕkÈb«Š(Ž•(+*Öèµ¢å V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ¬¨X¢Q+QVS,X{±` Ö‡E,XÄ a×Y¹WÍììb¥§GxÔlÁN'V*=š@¼fGv6±òƲ|…ªZÍ–ìlbý:l,­Ù‘N¬ÃÆ2ÙšýØÙÄ:n,Ó¬Ù’M¬|òž7kÈÕìÈN'Öæëús•NÍ6ìÌbÕŸ«„jva§ 6ŽM¬Ë—p Ï c4X£W¡^ÄB¬ b…±+$ˆ…X!A,Ä b]$ÖttŒf ±`YÄ‚E,X±"Ù”¦ýÝôˆÅþV*½Ë:~^ÄŠbSÖX¦_s‹X½ØBcYšøiˆÕÍ˦~þbudweˆåV´$ËË+†Í&ïS?± ±"XžX†X1lšþ‰eˆ‹XÒ쀥VU4VˆÕM¬ÑkEËA,w± ±ˇE,ÄB,Äòa ±bÄÍ ±B,XÄ‚õa ±`}XÄŠc×¹³W͈%Ï>?LÅ£fÄRdSaí(+H­Š–d‹OC,«¢5ÙÂsÅ’zÍq,bud³çŠ!–WÑ’lÞþÅïnp+Z“Í'ïˆeV´y_/‹Æ=+*ÖfKû—%«/í_–¬X°Ž¬¦X–ZUEq¬DYQ±F¯-±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:ĪgEÅâX‰²šbÁÚ³ˆ‹X°>,bÁ:ˆ•ö+ä>0ì5lO±Raí”܆½†m+eë±Æ¿/b!b½ÄB¬XŠ5èÛà^ïÛ¶—Šeyãö±` Ö‡E,Ø+ÅJÒEÃê³¹Xë:vé¢aõÙåö]÷çnË ¶Y¬¼‰+q)„me—ï³Ôï?¬÷Ò ¶»|oÓý¡m·Káý†­jѰúìöR¸y& g,Ø€É;bÁ¶²ËÓKëÙK¾hX}öY¬ûK»hX}viaa_±Ëˆ%BCcxÙeŠe”› Ö5,b$G± ’#‹XÉ‘E,ƒƒäÈ"–ÁArd¹Ý`pÙűhX}±` Ö‡E,Ø ÅâwµÃv+ýY/\4¬>»V&ÎX°­l©ý‹K!l3»Ú¿ ¶™]¾·»ö/Ä‚mfËí_ˆ1yÿù‘šjѰúìòôí_°Øg±hÿ‚íÄ.-0,ì+v¾õX-1<À£ØéV¶±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:Īg¹Ýp&†x»8 «Ï",bÁú°ˆ‹X°>ìòEH@‹„±HH‹„±HH‹„±HH‹„dIéëë÷ëOï¿þü‰Æ,Ï6Ý¿Ä.Ò”Ûz¬¯‡H÷?biÉòÇ ´3 ¯HS–½HEzd)D,Ò%Ëþ[ÁÍ,ž·³»Ýðc“wÒ–W7HñŠ4…;ï$$ˆEB‚X$$±Rá«}Þ›xÅíùkó=†Õ¾ÿþ|‹µ¿Õ^;X•ÿ¿ =§Í½÷½Ýľ'ÈXéé¼r»ñóUúyåÏæçëZ¯‚ö¼?è}«Žß÷_žåñSÂûkë þè–ž†õùoë±çtÿ¡fTÕÁûþÛs¿îfB»aüúÚýW3Œe;íùQoľcëž$ïŠuæÄ³ççóUÿªC÷ý÷§ø]áÏ©=Oü_?ƒ\›+öìµï ò#VÚütð11Ýü+]_y gýä=lϾûž u7Hóë5£ˆÛ³ï¾ÿм+V¯Ÿq{öÝ÷_~¤CBòÎ/·ýaÿöÕßϽïi²üs:A<üÛßÿïé¤Cv»ïÿN'²Û}¿ñ‹ºYÄB¬Ûß#V{Þëž±î ëž±îA¬5œ±úˆuÈ"bÝþ±ÚƒXˆn7\»ïi RÄ"!A,Ä"!A,Ä"!A,’ÿÂ"7¡Ñb£ÒIEND®B`‚Bio-Graphics-2.39/t/data/t1/version7.png000444001750001750 1170512366325116 20045 0ustar00lsteinlstein000000000000‰PNG  IHDRXLÿ(c@PLTEÿÿÿÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔI¢@IDATxœíQz£¸FéÌ&fY×}ö»5¼c²? TTý®óßÛ‡ždŠæ´ íªhúšþæ‡ñça(ð“ˆXðJ±JˆÁé³”¬3Y«üýÖéÉ¿sX¼Çà+Öß?V_Óš…ë¿—§_,FåÄiþcU¦5¹á~Ë,Y€±¹ˆ5ßøÊ}ëË}æVó˜y&çãýöwÿí|CL;'ù¼ý-·Â¬39­o…‹^i§ã Ÿó8­˜u&ï6íÞç‡÷Á‰q÷ðþ•ükõ¡Ç3–÷°Ô™y­ªŠõxÆò–<¯U± iÏ»©ôÛ«¸‰õ/iÍ{±¼GWb ±Ë$ˆ…X&A,Ä2 b!–I«G,Òž·b—X_>†ŸMÄ‚ˆuˆXðR±x+zçgç# !Ö\`apÚ,+FÏõb•m¡ßw!d„Á‰±TJüÒÏLµ.­ð÷ó˜\¬}—bâ®KçÙCóqÓ¥³¼`bˆBÜté$«Ö¥ÃŠÕÏ}—-öÛ‡wÄ:ÂýÃ{r±V¢Kg éÒÙˆE—Î ºt®©Ý«©ôþ¾^ÅM,ïJ´‹c'–÷wVb]ÄB,“ b™±Ë$ˆ…X&A¬«ÄÊ3±‚ÆK¬/Ÿ ÃÏ&bAÄ‚:D,(!VÉþæ+4+÷̇ãÄ*µÝc .Çc_\éKáV§éyóœO,ïbÁ«ƒXˆeÄB,“ b™±Ë$ˆ…X&A¬‹ÄJŸyN'D,(LÄ‚ˆuˆX±  "Ô!bÑ X¤±Æ°Ð }Ó‰E'4bÙNèK˜O,:¡/a:±è„F,îÞé.D¬Ád­B,²V™1X—W»Çgžó‰õ_² b™±Ë$ˆ…X&A,Ä2 b!–Ië"±ÒÅgžÓ‰ ± bAêˆUxÃX‰"bQ™®Æ¨b•Z!bé0¨Xµ.n…J *½4êŒ*½4â *½4ê *½4êŒ*ÖŠ¬UŠ‹µJ‘AÅr©/iˆÿ̨0ªXÞåqõ V3«'ˆÕLÄê b5±z‚XÍD¬ž V3«'ˆǪ̃bÿ̨0¨XPˆ ê±`r± oE+QD,ºtÔU¬B—Ž6ƒŠUÝë†[¡ƒŠUëÒ)þ£‚ÍŒ*Ö¾K‡W½¥T¬z—Ž÷¨ ¼Xõí*yx×aT±Vä…E ˆÅK£Š *–CELSügF…QÅò.髱š‰X=A¬f"VO«™ˆÕÄj&bõ±š‰X=A¬fF+hügF…AÅ‚êD,ˆXP‡ˆ%Ä*¼a §çqÌéè¥cÄ*»r¼ ±àô<ûâJ/ ·B8MÏãÁSìziX±à±v½4ˆˆÅŽ7ÐD,v¼6b­ÈZMÄb­‚ÃÄò*AuÝsçQ‰¢XNEs£®´œpl ±L’O¬uÝ3çQI>±ü¯‹Xˆ…XGƒXˆeI±œþ<êºçΣA± D,ˆXPŸˆ/«Dœ:çgç# !Ö\napÚ,+FÏõb•»F¿ÈŠu€¥R𘶔hš·|(ÛŽÄê&ûÿlÄšîÏóób ûÿ¬8Ë2÷[áò‚mˆ! q»ÿOn±ž‹÷j"X±º¹ïYʼ±ÔݦÝÃ;báþá=¹X«Íêü‡¥Nz–6b-+VˆÁ ³dïYÊR;²ŠÕTz_¯â&–w%ÚűËû;«±. b!–I ±L‚XˆeÄB,“ ÖUbe‹™XAã%Ö—Ï…ág± bA"¼R¬ÜïÌc¡KçÉï2ȬÓ1’%}=VÙúV¬#,µ…ÜGåĩ֥íð+ÝN%oUÖ÷q×¥ƒX‡ÈÎB+ÎÇM—NÞé8IvZ8Õ»t²NDz³ÐF¬ÊÃûã-¦C”áîá=såûÏññ!ºtÆ0óZU‹.AL¼V=ĺ¤tãSòn*½Çö*nbyW¢ å½XÞ£«±‚XˆeÄB,“ b™±Ë$ˆÕ#iÏ[±‚ÆK¬/Ÿ ÃÏ&bAÄ‚:D,ˆXP‡ˆ ê±à•bå®~Ç’¶õ·"ÐcH't¡z ÐONtB"бè„D:¡WœtB!Ð ':¡G‘NèXtBâîá=swáÏññ!:¡Ç0óZU‹NèAL¼V=ĺ¤<öSòn*½Çö*nbýCZó^,ïÑÕƒXA,Ä2 b!–I ±L‚XˆeÄê‹´ç­XAã%Ö—Ï…ág± bA"¼T,ÞŠÀùÙ9ÂHBˆ5ØFœ6ËŠÆs½Xe[è÷]apb,•¿´Å3S­K§p+<Àý<&kߥƒX‡¸ëÒyöäã|Üté,/؆¢7]:ÉŪué°bõsߥC‹ýöᱎpÿðž\¬Õ‡èÒCºt6bÑ¥3ˆ….kj7Åj*½¿¯WqË»íâØ‰åýÕƒX±Ë$ˆ…X&A,Ä2 b!–Ië*±²ÅL¬ ñëËçÂð³‰X±  JˆU²¿ù ÄÊý#óá8±Jm÷Ä‚ËñØWúR¸Âizž‚Ýcà ž‹Ýcà ž‹Ýc ‰XìmÄZ‘µ šˆÅZ‡‰åUÎ1êºçΣE±œ ÐF]7hiÞØ b™$ŸX'2êºgΣ’|bù_± ±Ž±Ë$’b9ý5xÔuÏG%‚bAˆX± > &«ð&·EÄ¢èYQÅ*µâAÄÒaP±Ø—FAÅb_uFk¿/Mâ]T¬zÿ÷¨ ¼X•æýûm1ÄØ`£Šµ"/4(R@,^UdP±ªKšâ?3*Œ*–wy\=ˆÕLÄê b5±z‚XÍD¬ž V3«'ˆÕLÄê b53ªXAã?3* *T'bAÄ‚:D,˜\¬Â[ÑJ‹.5F«Ð¥£Í bÕºt¸*1¨Xµ.V,%Fkߥ3!–ƒŠÅ.=ê *»ô¨3ªX+²V)R@,Ö*EË¥&¦!þ3£Â¨by—ôÕƒXÍD¬ž V3«'ˆÕLÄê b5±z‚XÍD¬ž V3£Š4þ3£Â bAu"D,¨CÄ‚ˆeÃù©<ÂH>‰éÅ*ü oÄÂRûAßî£ú8¦kßÿC!!b ý?—0ŸXôÿ\ÂtbÑÿƒX6Ü=¼SSXƒÉZ…X6d­2c:±.¯´qÏ<çË»Xðê b™±Ë$ˆ…X&A,Ä2 b!–Ië"±ÒÅgžÓ‰ ± bA"D,¨CÄ‚ˆuˆXtB#–é„F¬1,tB_ÁtbÑ X6¤úæ‹NèK˜N,:¡ˆ»‡wº k0Y«ˆ¬UfL'Öå•Áîñ™ç|bý/Y ±L‚XˆeÄB,“ b™±Ë$ˆu‘Xéâ3ÏéÄ‚ˆ…‰X± uÄ*¼a¬D±¨LWcT±J­±tT¬Z ·B%‹^uF‹^q‹^u‹^uFkEÖ*E ˆÅZ¥È b¹Ô—4ÄfTU,ïò¸z«™ˆÕÄj&bõ±š‰X=A¬f"VO«™ˆÕÄjfT±‚ÆfTT,¨NÄ‚ˆuˆX0¹X…·¢•("]:jŒ*V¡KG›AŪîuíPˆAŪuéÿQÁfFkߥëÞR *V½KÇ{TP^¬úv•<¼ë0ªX+òBƒ"Äâ¥QEË¡"¦)þ3£Â¨by—ôÕƒXÍD¬ž V3«'ˆÕLÄê b5±z‚XÍD¬ž V3£Š4þ3£Â bAu"D,¨CÄ‚bÞ0†Óó8ætôÒÀ1b•]9Þ„Xpz}q¥—†[!œ¦çñà)v½4¬Xp„X»^Ä‚ÄbÇh";Þ@±Vd­‚&b±VÁaby• Œºî¹ó¨DQ,§¢¹Q× ZN86ˆ…X&É'Ö‰Œºî™ó¨$ŸXþ×E,ÄB¬£A,Ä2‰¤XN uÝsçQ‰ X"D,¨OÄ‚—ŠU" Nó³s„‘„k.7Ž08m–#Œçz±Ê]£_dÅ:ÀR)xL[J4Í[>”mÇ bu“ý6bM÷ç€ùy±NýVœe™‚û­pyÁ6Ä…¸Ýÿ'·XÏÅ{5¬XÝÜ÷,eÞXênÓîᱎpÿðž\¬Õ‡æ?uþÃR'=K±–+Äà„Y²÷,e©YÅj*½¿¯WqË»íâØ‰åýÕƒX±Ë$ˆ…X&A,Ä2 b!–Ië*±²ÅL¬ ñëËçÂð³‰X±  ^)VîwæÇ±Ð¥óäwdÖéÉ’¾«l ý +Ö–ÚÎBî£râTëÒáVx„•n§’·*ëû¸ëÒA¬Cdg¡çã¦K'ïtœ$; -œê]:Y§ã ÙYh#VåáýñSˆ!Êp÷ðž¹òýçøø]:c˜y­ªŠE—Î &^«b]Rºñ)y7•Þc{7±¼+Ñ„ò^,ïÑÕƒXA,Ä2 b!–I ±L‚XˆeÄê‹´ç­XAã%Ö—Ï…ág± bA"D,¨ÃiºbÄ"&A,bÄ"&A,bÄ"&A,bÄ"&™þü¹ÝþþúsÏíçŸ9™é·MËo±‹œÊt_¨ž"-ÿˆYäL¦ƒþlŒÂ+r*ÓV$Œ"#²½"’iûWÁÕSvÐÖ§þüL·û$¹ýºa•‡åñ¿eb¶-g~ úùoŽ´é©d¹nž„6y»m~µLdEÙAg6´í¨óä¨X=K¿É™¯W–ƒ~ê©þ­ð±¸—êÒ{LskÌμþWuN#±–‡–Ûíö|4]ý9?òœÐö‡w³3‹ž:GÚ^ ÝÏÙ¨g »3‹žúSrT¬QBíÎ,zêOÉ‘ŸÉúøÚ÷Ÿ}õùħΔ©üÛ›ç<¾ýìßÏÿ×›òöK×§þ§7åí—®OÝÿ¯ß~)b!ÖüyÄ‘#b-/Ö’ñb-/ÖÄZŠ5@¬·_ŠXˆ5±F±Ë$¼Üpá©3…ÒdbÄ"&A,bÄ"&A,b’ÿ@¥w‘Ýðl>IEND®B`‚Bio-Graphics-2.39/t/data/t1/version9.gif000444001750001750 3417012366325116 20031 0ustar00lsteinlstein000000000000GIF87aX°çÿÿÿÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ,X°þ? c AƒŸ T8áÁ…&Dh%¢Eˆ^Ô˜ñáÀŠ'†”Hr£Ç“Ÿ@r\‰²äH“"?ÂtÉ2fË™q¾ÜY“¦@•7yí ¨Í£>‘ê¬i4©Ó¥CBU*”*Ó©O«&mеkU®Z½5v¬Ù¨V¥†]{öhY´YÛJ|›¶n\”tïÚšW,Ü¢~÷²U+w Á…ÉÖ«·ï`ÄxKé8±åÈ[ÄÙíäËu+ÿÍœ“´é«§G·ýépëÚ¿~V–ulжg‡Ö}3èÛ°]û¦ ¹xîÔ»‘÷ö¬\7H΀B—ιàaؼKÿή¸9òãÛeþ{/S9t‚ç¦>¼øò­ÜÉ&þðxú9…_7Üš¿@ì÷¥~ÝÉçž}ÖW jÇàüéׄй6×€.˜aƒ*h x&×™uNh"€–—bˆ nX†Ëµèa{ïuö_‰Jxa€1˜Œ PÑ™H]‘ÎÈÜŠ. Èã>>&$“S>ä{êÙ¨£ƒM*Ye—\*Ùã“Ržhä™I%nk÷¥—m§[Ža¹e‡qÂG&›{º™'_7"9] $¦GåŸâ19¦¢Pö)§y6ž¤‘N&¢¨1Z¦£aúâK:ú¦sž&§)Ÿ§úé虆'§þ€Âš¨«¤î4¨¨¥ê™ê£»v*ëjyZJY®Òú±Ãþúi¯±2;+˜Ç*kª±"Û*´ÕJ«+µ,Z‹W…à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼â"Gï½øæ«/»Ú‹-‹€ˆ ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñų·\ÀwìñÇ O¬±·N:»Ç!§¬òÊ,·ìòË0üÊ0×l3Ë2›L#ÉVÐ|óÏ@-ôÐ7çLœÏD'­4ÁFÿË+·Mö¼ôÔTWmµÐMë…ôÕ\»œu©£~·u×d—möÙ]ÕØh·-r¿ÉêÛn×m÷Ý+«ÝþÝx÷]°ÞPoëtŒûnøáˆ'®øâ‡ÛËøã#÷µb6*·à•oz¹¿™£¸åŸkºçƒƒ^ºè§“Þ¹ª›Ç=:ë¯?:ì³Ë¾ºí<“¼cë”ç>ùο—»¯¼_¼ðµ?|³Ë?{»ò!yhð»7,õ—öÞ%VŸ<óß;ïûñÞ'¥ŸôPoß-öxj¯{ö§¢ˆâ|á_O>üÖŸ?s·ö_…·S_ÔÞ×¾ã pQ®š”#¡%ísã{ çrG' Eè?$ Š$èºú-‹ƒ½›Ù-˜¦ •/‚œV !è¾×L\fºRÙ·ÁN°…÷+ }lôšólI8þ'Ä!õgCqƒE"¡zÈÃôi~Ï_Å'Dh])"–R¢§B>y\|Q_Èô9퀦 £ ÕÈB/Úk„þiHÓЈ:6ÞÐ9,ÿõ?ÃÌ0PD¡;8È.î°Rˆ´Ð¿HGÕ ò‘ Õ®I»BÑ’`„$“XuI°1ò“4 $Fn5IP2“UÄd%,CQ”x¢_9KUâ–”Ä]*5)Ë\BÏ–[ôd(S¹bó˜È¼×0¿”Ìf:Ó\Ëd$ßüFÍjJ p)d¦5·ù·h.sšÜ §8ÓæMsœgæ}É—s¢ó}Sgœ´ O¿ÉWßþ¬§>ÅyÏRÚkŸxëgìØùwô \híè‰Ð¶)ô²œ‹AJQ¥=TMÿ¬h:ËQŠ<ó£ éã8Ú$‘š™$f U Ë^š²£Á”AíÓ•ò—/¥å*]šÒ›br¦Ôé-šS–¢2–B©Ü€ºFŸ ó”Lm#O¡ZÔ™´Ò‰=Ý¥V‘jÔ¨Þqª5m)Ny²ŸNªYåªSeZÕ­‚5©Y "µÄˆÂU¬DMë[»ÚVµº•–c,k(e!Œ¢õ°a=ê^׺Ծ.V{<„a`êØ±"ö®Šµlb½JHÆîï9 ”#]ÍŠÕËòU¯šÅ,g]™WÓ’lŒ¡ þíüÎXÙÖn¶¶O½-jm«Z¹¢'‘Å-[w›[Õ ·±ÄnM8IÙä"×µåíi¡ë×êþ¶°ø¤îc­›ÚéêV»Ýõl6ûYòŽ×¹åEïyOyÒz±·½0\.|çKß“ªw_œhÐ. ý­iþÕ¨€AÆß³~7±.Ú0l3øÁû½ï<ó›NúV¸\Îpƒ%œ]o”½F ƒ5L↸´Æìˆc¶àeÅ%ŽñÁNL[ï Æ^k±Ù,ã{ŒÆ¯/&ëÛD£ÀGN²’!gãà6¹¹B.®wûd»NùÊâÅo• ›b,GWÊYžð–‡d^-GY¹]sþ‡©|æç>𪙕®šýÙæôÖy½iþòx;ÛÕvÍlÎ3wå¬g7ºK¾Ív;T0Ú΂ޮ¤Ãûh<—Ž|É¢ñêèAwzÒ„ö4 ½,j¹DGuE“M+mæHSºÔ>4©Aí•+.Deµ˜ïÜjYÏÙɼÞuˆ`k¢ØÖò×Pvu¨i=jd[ÙÙX®¢5¢F7[×kžõ«™mhm/ÛiÌÝé¶ÇýíršÜç6÷µYÉÀ\ÃÚÒÞN·¼×ÍíXÇ›ÞèÆ·º» m2ÙÀ¾žÙ’þ®£8àïîõ½ù=3[Ôà5v¶û ð…£Ç¯k%q:+{Þ O8Lþ0žñ·uØ×7ÈíMñÿ”|hÖÉ“ðzûå­y9Ö 䔇ܿ Ç9Éuþ°˜gkæÏƶÇkžoîüéêâ9Ç}Îr¥£œéû®ºÈ'nuš[üæ]OúÖ—þõ ‡ËX_9ØÇ~õ² ;í*ûÏ›®u óÎ~>öÙýt´»ël÷úš2-Ýî€G<ÙqÞs¸›ZÚ„õHŸËüö¿/~ïgüÔqL›‰Dž»áÍx±+¾íš—yÏçÃT“6Îj'ýéùƒ[õµ×´±#“ÉK]õœ?<Ý…?úÊ ŽÆfnÞ {ãç¾ñ·§}éý¾˜DóþúÖ}óþ?|ÙwßùÓç{ìÂýºŸûÅGÿö/þÌóÎÌ—»ùÓÏþÙ›þüõÇ?îÛoûÔêÄ·~ûguux.¿÷Áç}ô7€ú÷bD÷_ ¸>}'~ ~hC ct€ (€Ò—îÈ ã4+X%H‚ý×p(X3*ˆ@¨~ò€9‚k3ƒ4È‚6}÷×€#ø€q‚>h05˜Fþ÷7˜D8„Sq€TH.@ȄϷyBH}Y|[h_ø‚FÈ…üq ˆc†MØ‚gˆƒÚ·ƒh…dƒfø„(‡jØ… †1(_ç!…pè†ó'‚€ø††8ˆþr'XwHˆs˜†bˆ‡Èˆyh@Ö·ð§…k„™ˆ…e}›XG¯åy“Uˆˆxˆ:hŠ<ˆŠq(‰Trj­gV³å‰zè„|X‡µ(‹ˆ‰-dk¢µh±¨‹¹è…ŸèH³È†vX„C†|Åöy‰}H‡¸À(ÂYg}ÍÈŠÏèˆÛ茶8Œ•tSä7‰Ô¸‡à¨KÁhŽÅ¨‰Ñu‰äÈß¸ŽœXŽ´xŽ¿dR„T”Žõ( èÄxú£ £èY úŸñ™B7 ¤Jº¤LÚ¤Nú¤´ ¤êI£RE¤b9dPš¥Zº¥\ª¥R:£”9¤Æi r“¤]z¦hš¦jZ¢_Z£ƒ£Vª–Òb¦kZ§vz§YÚ¦U:¦EjŸÝyc¨™”þW …Š¡­)£nª¨{j¨rj¤þ駸)©Š¨Ái©ÇI©G:ó‰Ÿ÷É©ù ªŸJ›¢Z#í¶jo*¦ŽŠ˜|z¨J ­Ú{̨Tš©žú§¡Jªºú¹:㹜ñ÷ª*¬ J¬ j¬úª“õCå¹|åw«“ ­•Ь§«¬Š»IxØÉi˜J¦µ «« §Ö*®[™œÓ&«Áú­Ãª®ÅÊ®Çê®Éú­ÖY'Û {ÝÚ§Òº©»Ú©¥­ýzk×yÏú¯úÊ«£j°¸z°üº¯GS¯éš¯¶J°˰ Û« ‹°Øzª¡¯Õ®ªz¯®Ê±‰§× ²*²—J­#;®«þ¬‚Jp„z² ®&[²ÊЧ8‹¦zúU$K®5ë³*›²—³D»¥;ënŒÊ³,;¥aÊ´&X´Pû¤GËZë´I‹´=Û²Cµ\«¤S»±3»®aÛ®cû®uA§]›¶:úµz—ªV›µo»´`ú´j[·9ʶ+±4´™Z¶ñz¶/;p1k³(Û·z+¶‡K¶‰k¶‹û·Û±?«µ~ ¹|ë­“»²U;·WKµ‘·™»¨p«¹¡ ºrKºŸ‹}´z¹B«º†K± ûºþêºb¡­©û¸˜Û¹¢[ºŠ»¦{ ¿Š®+»ÓZ¸–k»«k¼­‹±øš%Ô¬”§¼{±Òk±Ô[±ÖþKÙÊŒZ„ª› ¶È[¼Â½Õ »Ã+æz}‹4¸@K¼øú½í¾ ½²µŒ×‰µº«´§‹¿¼»»•û¾ò{®è;š¼ÿ‹¸ð»·ì²¬ ¾â+Žt]ãíq6>_ÎÍd­Ö>^´l]R?Ö;þ-C~äYãHžäþ!=¾äPÞ¥A¾1QN´SÎ3O^åZî¤W>3[ާ]N‰_>æ^ªäd¾¦aÞKY~ælŽ£i^kÞæLúæ?•ãv¾Ò2|çöÕäþ ®à0>ãîçëÝâ~-â*nè(žÎC­èlœâ‰Ü!.èüMè§íâ–^è’ÎâÑë› NéÅ}é•~ ìÙ1~è™.Ú7è‘îéŽélÎè±é¾Rà=tßœÞç¬Þé/>轸ۼçÞ>¬ê^êÀ"ܳÚë“®ìš~éÈ~x×ÔÆ>ßé%ݨ6¿ˆN펮í‡ËÝ$äÎîÛ½ÌÃAÞVÒGàêŸîêÌ^Û£´{àüzþÝÛÞøeߪ–ëžíöNë2~„ìL¯ò.íÄþïeëæ]"»®ëíè”Þà<ïñ Þ‹¾Š^ð¦¾ðû~êØÞè²ÞáÿgŽñ~þâÜNë¤,ñ*Oðü^ñ&ßï/ïò^ì$ò¡©ç8Ÿó†RR:çm-Írô>Ncq.ô?Jç`SôF¿ôGLôL_æ|5JÿôTOäæTõR[än1õXßõ\m/^?çZ/Qa_övëôfôcïQißöLž¡nÏ£H/S=_÷vî8vŸLkOê5ó3oðïëêÞê¡^øënø„øŠŸøŒÏëƒïøìþø /ùøËNù‚ùšøÏù“¿ù‹ßù¡ÿùž_ù ¿ê§Oó-ïñþžñ©ø¯ïú˜ù ßø¤?Ïúžù¥¯û£oú³ßìµ/úf{%¹Oû»oü½Ïû¶ïûÁûÑþ‚ðÿ³«?ë1ÏúÕOý/ûÍ?@ÏÎÂÿýÎþÌüÀOþî>=ÖþŠÉþûçÏþû%Ÿýñ?íÓbîÅ_þÉü˯üâïÿñé  ˆ0!B+ táCBœ¨°aFŽ=V”øñ"H†ŸFœ·ñâÄ3† öråÈ€7›þDI9íçÉ¥gŠ6M˜tfÎQ³6œsg˯i«¶=[sîÖfyç&=÷·bÙ½G‡ 5ùò¾Å‘ \}[·céÆ=?Ÿ.™yvâÛ­Ÿv¼wàØ¿C7¿8:÷ÌëÏëvŸ^yuìñÅã¾Ï¾j]þýýÿ0@$°@D0Ad°Aô/¿÷¨Ó¯B ',O ÉËÏ @1DG$±DOD1EWd±E_„1Fg¤±ÆY²pCú4œ/ÇåkHé<´±H#D2I%—d²IqÄðG·³Ãñv´½)±„îC'¿3L1Ç$sL(…ÜmË «ä2Í,×D³5"ˤþ³N;ïÄ3Ì3Õ”3ÎãøTÏÏë•mÎ<E4QEÝóÍ> Ò!ýŠMgòrQM7å´Ó#mó=K£¼òÒ6G­RÕ dµUW_…5VYg¥µ?IáSÕÍPu4Î[u4Ð_ÿ ¶Ð\}vÐb#]vÒd+=6¶fq}¿iÝUÊk‰Í–Êh»ëöÔoK%UÜjuíUÔq›ÛVÙp}mÚs‘×ÚwÕWÚ{…­ÝráÝר|ÁM—߀™=ØÙ~éM˜Ú…õ-.5Qx]×&×bŠßÜøÝŽ{ýøßy½Š¥¶þ½Pc‹SÆXˇ FÙà‚~9ã–ÃZY2áØ’xç”bþîh„gZh…Ɩ裕vin™NÚh\MM®ªASIbŽsZå›Y®Ùe§Ý…úi©£ö:ì‹í¢«®«S’Kꑵ[^µÁ®›Ý¼ýM{o†Ë&ûlnãbé­“y¶«â¯µóbÁïp»‡9òÇ'—7ª ¿š"­=溶ݾynoGýnÆ3ç»ôеôùpž=—ûuœQ›õ¿/·WwÇ-ÞuÜoŠê[M7WuÒÕF`ß+^ùÔ)·™ù§vž¶y|¥Ï÷Ö­^{™½ß=xð¹'žz½Ÿ¯^ýôÙ_Ÿüߣwoøß—«Z÷ç¿ÿÿ?Pøl'>šÕouùkßýþ å)6Ð •8AV} |`5ˆ¨"°{æs‹Bfjƒ'Da™:˜+.̓» /hÂÖІKZá¹ZØ´ûÙï…;D[éhxC"qF9ìÍFÂÊЀ ¢¥8Å!qoJ„ýzx@&²€_cÅÈ* >qz[\^ˆÆ3¾Ð‡,\£¹¨E9¦Q‚edãéØEÆ‘Iôãy>3ê‘yÄ߯ÈCÖ±Šd1çHCª”Lä -ÃKBÒ{’ì]YàÒ0P~o“…Ìd#=‰¦R–O“wœ ܬV»N¾²‰µT¥-áˆËŽr ¾„/©þFKN•­œ_.•yJD"Ó(› Í0™*^Âò˜Œd&&™À[ÎÐdnƒæ,©iÌfbÓšå¬f7¯YÁ¬9D˜¡!æ:É©Msªó\å­Â„ sœòè=JÏtîŸBL\0 Ìi*î Ë<'AšÍ|fÏœþ<^= :Њ’R£},(HkÒP‹†&]$J#ùÑ“N4¢eÚ6ãÓx Ô¦Eåˆ>è™=jP…+•~ÒvQÔ”Y‡TF=“ŠO¢RZT41UQR­ª#hU¨võXÍ(Uõ©Õ¡ú‡¬òjZSÖ’ºô…\åàðàz¨­ªÕ®d«GÅ:þ­¹æ)¯Lë+žêzWÂ2ð¯5Å)"{§Ãbg±vla%›Ô½ê•§eý\1!‘lÖ³Ÿ­ÛܺћÒôŸ¥Õ¥H9šÚ–®¢öLllMëP×R”µ)­jQûZÒÊö¶+­lLYŠÛÚ¾ô·SÍmkwk[Þê–|$­¤q›«\ßN—¸Ë•.s&Kмѹ³ÝZp ^Љ÷´bèB Ï9Z¸É½nuµ›]úÂv1ûä®K¬ÃâÚ÷¸¬î{ûÛ[òþò›£ô'çìè_÷"wÀßýoXá+`µs" …^ƒl^Úb—Áóýp}Ó²Ïýò“›Žp[LÝ‹,À¶PzU¢Ðþ¬¹Í»,N±eWß“¬Çt,{3 bkXÂ;¦°|E aGA—¿.2‘™,eYÅPžò’«LeçX¸ï„KZ2Ë Ìåó†Ó|d,屓eì™Aöb5#ÆJnÍ›á\§ÆvÏQÖr—­¬ã éyÏ*”³‹íc/·Ñ 1ô¡Í´h ÿ9Ë!Æ4 ó,iÃRútk¾²¥·h°DšÓ`ês˜í\ç6 šËI¾o™eí*O'oÕlµ«I}çúÖ¡îµ­[ ëGû9ØÎË5±ýeP:Ù¼.¶ª‡ íe;ºÚç=öö~íìl¯Ûœ6«ŸÍ'ËôÉãÆõ·Gm4þo›ÙuËï¹ÕíÂyóÝÀf÷œ-ãŠT¿ ÖtÀ/-ðQgzà/øˆ£¹pq®à×µÁqe¿šÚ_Jâï‡üû‘ùVt³ßîtƒœÑ׿ˆ… âoy›¼Òõ"Ê¥}onç›ÄW+±Ç£+ñˆ¼ç¿ø®ÅÝb~xÆå¦sÉeÞn’ã{éúyž…|b Ýå¾nzÍŸrw÷ÆÉ7þùÄÅv²W\èJÇ8ÚÏîô´³}íZo;Üß®“Y×BµF6Ì—xuaÓœî§îTª™îwkÇ}ä„ǶlL ø& ê]OüÖOnøÂëfñŒÇ!ÞµõÃë=‹O¿<æ“äx®sþ¾ò<7;ꃾiÑ_UóÞæ{Þc¿yÄ÷³õ®zä)¯û¹ŸÞ祶{ðôzp×~枟$òC©|Söž÷ª·ºä_>{ØKëÆ<ó]iý¾k?™»76õ‹ïý!;?üÜ—=úiO~ª=õ¿_=ü£ÿjþt^üëVõÁüûÓ›µÜ•;èS;t; @ù@/R¯£KÑò½ªK@,@œ@ <ÀsÁ¯·ÑÀt¿ø³@ûË¿ñë?{Ó«?Œê®ç£À ìÀù3?þ Aü³$•ë7‡KÁóÛ¿ìÁ˜ËÁÇ3=Ä@†3±œÁ,=ìóA$h\>il>e„Á`|F[„DlôEmFgìFnL?q\?jÜ>rÔ?pGu,GoŒFwœFx¬F=œBSÄQ"E>ÔG9Ãz,ÅþÜÇ6¼—ˆ sËG~ÄÃ=DH{ôÇ€|Cµ(:+±&”ÇsdÇt´Æ3DG=!Œ7l¯ÄŒ,Dsü¾‹äH#4ApòÈ–«È“$IG|Éò‹IW¤Ç”›H£#ƒH‡ŒÃž\H€ JŸÌCÀ¸9ÙÀDÉ‘¼Ék\JV|ÊZTɌªtI‘„ÊšlF­ÌF¬”ʨ쫌ÊdlJËm<ËoäJŸø:¥\Ëu|ËvôJ²ìÇeŒKŒ,Ë’œÉöcH»ÌK™ìAcÌúË=¿¬K§¼Ë”$D]ÜÅ*BF´LL¦aáî^^a ~aža^Ù†áÁÇ‹=[ÆaNana®áŽ Hß-b¾á%6Ø¢ýþanb -:¤ŒY&>Ù¦í`ô}b!Nbî¬&¤[`¾ZÈÍbüb ¶â ;0»ÈÀ*ŽâNcÞb%Žc Îݪ}'q’Óû¥ß9Öâ5vbAÆâ®[KPƒäáÞõaB–ã.&â ¶cw¢ÊcZ-dHVã;6aGÆcIÞI3d4Öd:öäNæd®c åRäTfaW&ePŽäU®åSVe\ŽeZÞä+~äÀMàbã‘í[$æeSŽãÒõßeffé`•å?ŽæÖeÞßfÆæl®Ýgnåc~e_þd[îå~Òær6çÖåfcgdgTnç\6Õs–çyNçF†ekþ^çoVÙdžç~.çz&ãhFh?¦æxöç„ff€&æ2VçjÎá{ŽhH f@f8~ç]ÎçYÞhiöfކh îèƒÎh|i(.é‰Þç”铿âö葆f˜&é•¶éA–è–Îi”¾éL¦é™–énj¸­¿~é¡¶g–æiœVê£&StéIîé_Fê‚>㘎ê!qÛKCªÎê[6j©fê©篖:«ѽõê°öâªnh~k‚ŽëH‚Q7žº-k¶ë¦kŸvkŒ&ë ÑcÄkwlxæë¶6kv>l2´†´Èæã±¦l¿^l}®ìµN콞˜­fåÆ6iþ½çÌÎëÍmË®<35mÆ&mÃnmÄm•~íé<\Ô^m̶íØÖéÛiÑfíÜžíÐæm¬ömÜÖlÝŽµŠVîåÄäãnÙîwQf…¦îê¶nù½èE6h ¾l7»îïïïfhÀ~îÝFn§–šéïõfosoí¾êš.稜îö¶ïû^èìîãøæîâönüðß÷ÞïQ&îá–ïúðgðâ%pÄÍZ¡îîW“å¶ðÎmîÒ>ï¾vîèîð×ðùFoïo—pÿ¦pçð÷pq×nqqØVqÅFñŸqǾñßp7ñ‡Þñÿñ¤.ŽK†¼çìOþò§q&×q¿à8ø6pwñ*—q+oòn6vY«UkE.ðiæq%?m-‡n37oDÖÀ+Ñ+f"'óßFsúžó'뺎òÉvs‡†s'ßò87n,òÃìMä¤ûi!Gò2ô?÷ó3?äPóDò!·ê)óGOó÷ì—ô¿–r1Wt@ïmKŸëVíOŸp*¿òVÏòF?sXßtˆìjòÖt:—u\wõA'õ¿u;ïuVõ]wô:_qb‡ô ·;ý†ð7¿tQ¯ô©Vï_ðßs¸¶uc÷ñE—ói§ö·vMÜg§ô>×ö%7‰ooðpófçsruUçguþ¯vf¿v¹Îö\v÷vz·ovGôxwwlu`öwx{÷ö`ÏôSv2Søv¿÷íõ_?öa×x^Çømwø‹?wFGöY×÷Œçø—ó’÷øŽGw•où‘×õ/v—y™u˜ßw”tœ7ù™çù•×ù–…÷UxšOùŸy›'y¤ï¸¤”wSÏw¦?z¥ù“7ú@ïô¦zªÏù«/unßy®ïyHc>nó…wöSÇt÷z_z·¯r½:±kÒ¢9¿–=:5kµ±qÃÎíûlmÞlÛ^üxXâ“/]v·ó誑K¿]½ùôåׇcWþ úlÓÞÃ3§N~±yïàÇ[?ïóvíÙãÓŸOw§üöì{wo¾¾?wéù·uÿ `~¨ "¸ ŸD(P„ïç ƒf¸ } Ö§‡–yháƒ$nxà‰vˆ_B,ÂÀâ„~xáŒjØáþçxãŽöˆâw9²ö£ŠDÖHá@ƨd’-ꤢ}Bje¤‰A†8¤”â]É:fùÙ—ÑQ©Þ“ò$#’K‰”Xn©e—nÆÉe›t®éå›`æ)f˜""‰æE06Ye”{êÖ§[c*8'œu6z§œŽêÉ褒F§fŒ6‰$¡ðuj秆Z)¤ "Jã¨|šè©“µúœ‹±–ùâ¬<¾ÚÚ­‡®:e® RŠë®®û\¯¨ÛPLj¦Z诺6Ëê°À>Ëk´ÎZêgµ¾^«m©ÂNåb˜ŠÚ˜­±ä"knyÛR;­·ê¶Û-©ËBË.±è² ¯ªôJën½úZ‹/¶þr+oþ¹” e/F ;ìpNK<1Å[|1Æ3ì鱂u, kˆ<2É%›|2Ê)«\r¦÷òÊ1ËØè¯ï~‰ã³?õ俯>ýàk®ýüϯ<þ(?ø °~™DªÂ—¯ÿ OÙ{`ÿ<AvïVÐYm5A6 ÓgÁýI0‚Á !mv¢Ön…J OÈÁ &.†œ ý7CÖ0{˜jÒ_¨AÞp]9,áeÀr°ˆïZ" 9g¦ŒôPL¢l¨Å B‘‡Räâ»x?ùe0F+ÔIAª˜E0p‡cl£uG$ºQŽaŒ^©x’ ®‘ˆ[ô#ÈA&щõb¡„ÐØÂƒÁþ0üc!!YG:ÎQ‰w„ãDÔ´'C2¯’œ„&C)ÈH:²‰MAä¯>9°–r‰ªlŸ+%éIY^r”“´¤(ÙJVò–¯d‹ï‚)Ìasw»ìa/gyLΡnuÎ|æàZ·¼_ЖÊL¦Ýš Ímr“kÒ¤5™ËeºÎ†Úì&:Ó9´o†‹–¹4%9§yNuÒ³ž9cç&ÝiÍZê’ˆó´'@J´x‚SŸý$¥?ªÐ…® Ÿ©4(<±ùNW³¢½(F‡BÐvn4Ÿ}èG-Î(–3¤ø©K*Ñ}N”—}©/!:Ε4¦&m$M# Ók:µiNgÚÓ–"sþ¨,=jMyZš ѨIõ©PêÔŸ*µªÉš"N§U«õ‹Au©TmŠÈ±*’IY +W‘JU¨‚5­O%^¯hœʴ­l-*ZïêU­²òIi<“&etV·®µ«*å+^ »U2¦$¨dj»×¼všuM¬^Ë™ÇÆv²@BéÕºØÊô¦M¥¬ÉÊGªñ³—¬bíJZŽ~³- ¬H_{XÔ¾U´²õ­m‹ÊÜš6²¼-,pa›YË×µÍ-’n™[[åÎÖ£þÌ(v³«ÝíVô¹k­«›Ê2´¼æ%œC‰;ÝÝÆ6qä=/|ãk¶ôÒÕ»U/%³)ßýòWoþôìrK»^yö·À>œ}Õ]ò½~0„k–àEI–½ú0†3|Ï kÀ ö%wC,â“b¦m…¥›â·—ºÉµ°xÕ»bw´/VqÛÛ#—Ç6ö±Ž{,ä9ÈD>²‘“\ /¹ÈMFò“•̹:P¹ÊV¾2–³¬å-s¹Ë^þ2˜Ã,æ1“¹Ìf>3šÓ¬æ5³¹Ín~3œã,ç9Ó¹Îv¾3žó¬ç=ó¹Ï~þ3 -èAºÐ†>4¢­èE3ºÑŽ~4¤#-éISºÒ–¾4¦3­éMsºÓžþ4¨C-êQ“ºÔ¦>5ªS­êU³ºÕ®~5¬c-ëYZ'Tþ¶µOê`k]‚Ö¾þ5°ƒ-j\÷š×WÞõ®-ìe3»ÙÎ4Oªœliï„ÚÓ~6¶³­ím›¹ÚÖNv´©Ííq“»Üæöö­‹}lu›»Ýî~7³Ã­ìuûÞö¾·«‰î,_ûÚøþ7À.id÷:×ûþ¶À®ð…wÚß 8Ä#.ñ‰S¼â¿8Æ3®ñs¼ã g÷±× rA\Ú"G4ºC®æ’×Úáº>¹ÇÎn—¿Ï,‡3ÍoŽó:«»çüγÎßìs,ÝÍE¹³}~ó‚[é¿õ¼Áu𠽿?G¶Éq up;ÝÚv.9Ø•Ýõ¦O=ë=§:ÃŽõ­?ýå\7þ»×‘^\ËXWºÛÅ^w½ýÎK';ÞŸ¾v«ß}ï8—·Õé÷­ç}ðgg<Ô÷ÌòÂ3^ðd<ß /wnƒ|éYÿ¼à÷Þ÷¶'¾ÍtÇ<Ñ?_ùÅ^ô­O»ÊùƳ~ôª/½ÑåíùÙ‡žô¶çýæçûÔ¿÷®Ç|ÓÑ^u»ßÞø¿}Êå2 ¡!¢v‘ŸÂÐßò›Ã(aF!aÂ8!FA!¡¨‰f¡n!v¡~áN‚¡Î-œ!¦¡®!¶¡ªáä½á–aÔ¡Þ!æ¡î!âáäõa–áãLÞÙXa¨!"&¢"Š¡"†!õÉ!$F¢$Æ¡$Â!õ"&f¢&þ¡&ú!õ ¢Ý¢!~Z#–¢)b¡Pœ"*>b%¶¢+Ò‚P¼âÒa'Ö¢-6€PÜb ¢á…(Žb§©¢0Ž!#žbÊ"2Ê!%¾"-ꢒ3ò!'Þ"/!òL#£ £6va1šâ1®á2ºb3>£9Þa4Úâ4¢W(Z#6ã6Æã*ò›0~c8Þ#,Ú2–ã9žc:Öâ:FS;jÎ;rZvQaRHáE!$R(¤E1äQ8dEA¤Q¤E^$Ff¤Fn$Gv¤G~$H†¤HŽ$I–¤Iž$J¦¤J®$K¦Z@;Bio-Graphics-2.39/t/data/t1/version15.gif000444001750001750 3444112366325116 20107 0ustar00lsteinlstein000000000000GIF87aXº÷£ÿàÿÿ‹”Óÿ‹E°ÄÞjZÍÿäÄQÿàÿúš.‹WðæŒÿcG<³qÿÖkŽ#iiiÒ´Œÿ ÿÌÝ ÝÓÓÓúë×ú€rî誀€õÞ³ô¤`€€ÜÜÜzÿÿàÍ…?øøÿHÑÌÿ£‹úðæõÿúÿÚ¹wˆ™fͪõõÜÿÁÿïÕpÛÿÿ2ÿÿÀËÿÞ­‡Îúÿõî{hîÒiÿ¥ÿÿEúúÒp€ÿ­Áÿ ÿææúÿÿ„ÿÿÿ‹‹¸† ÿúÍÿ·ÿô©©©­ÿ/[ÿd_ž Ü<Ç…™ÿÿ™·ÿÌÿ"‹" R-eÿUk/GÿÿÿÿÿGÿAiáÿ@àÐF‚´ÎÑÿÿ‡Îëÿðõÿ[ÍÛpõõõÿÿäµÚpÖÿøÜÿ zŽÿÿQ2Í2(ÿÿ¼ÿÿàºUÓýõæÿÞ¸‡ÿŽ­ÿ¥**€€€ÿi´ÿÿŒîêÿðÿ𠲪=ÿ€€€|üpÿÿ¶Áðøÿ™2ÌØ¿Øî‚îÿÿ=Š+ ¯îî½·k²""ÿäáÿúú˜û˜¿ÿÿÿëÍ‹‹ÿ2ÿ„ðÿÿÿ(ÿúðÍ\\ÿÿÔ¼€€ÿP€H=‹/OOÿÿé–zd•íÿÿÿêÿpK‚ð€€ÖÿÿÿzÀÀÀÿÿðÿeôÿ­Øæ°àæÚ¥ ÿךÍ2pÿÿÿàÿÿÓÓÓ@àÐÿÿ¥ÿÿõÞ³,Xºþ l Aƒ¿ T8áÁ…&D,¢Eˆ^Ô˜ñáÀŠ'†”Hr£Ç“¿@r\‰²äH“"?ÂtÉ2fË™q¾ÜY“¦@•7yí ¨Í£>‘ê¬i4©Ó¥CBU*”*Ó©O«&mеkU®Z½5v¬Ù¨V¥†]{öhY´YÛJ|›¶n\”tïÚšW,Ü¢~÷²U+w 0Á…ÉÖ«·ï`ÄxKé8±åÈ[ÆÙíäËu+ÿÍœ“´é«§G·ýëpëÚ¿~V–ulжg‡Ö}3èÛ°]û¦ ¹xîÔ»‘÷ö¬\7HÎÂB—ιàaؼKÿή¸9òãÛeþ{/S9t‚ç¦>¼øò­ÜÉ&þðxú9…_7Üš¿@ì÷¥~ÝÉçž}ÖW jÇàüéׄй6×€.˜aƒ*h x&×™uNh"€–—bˆ nX†Ëµèa{ïuö_‰Jxa€1˜Œ PÑ™H]‘ÎÈÜŠ. Èã>>&$“S>ä{êÙ¨£ƒM*Ye—\*Ùã“Ržhä™I%nk÷¥—m§[Ža¹e‡qÂG&›{º™'_7"9] $¦GåŸâ19¦¢Pö)§y6“ž¤‘N&¢¨1Z¦£aúâK:ú¦sž&§)Ÿ§úé虆'§þ€Âš¨«¤î4¨¨¥ê™ê£»v*ëjyZJY®Òú±Ãþúi¯±2;+˜Ç*kª±"Û*´ÕJ«+µ,Z‹W…à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼â"Gï½øæ«/»Ú‹-‹Â #ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñų·\ÀwìñÇ O¬±·N:»Ç!§¬òÊ,·ìòË0üÊ0×l3Ë2›L#ÉÁÐ|óÏ@-ôÐ7çLœÏD'­4ÁFÿË+·Mö¼ôÔTWmµÐMë…ôÕ\»œu©£~·u×d—möÙ]ÕØh·-r¿ÉêÛn×m÷Ý+«ÝþÝx÷]°ÞPoëtŒûnøáˆ'®øâ‡ÛËøã#÷µb6*·à•oz¹¿™£¸åŸkºçƒƒ^ºè§“Þ¹ª›Ç=:ë¯?:ì³Ë¾ºí<“¼cë”ç>ùο—»¯¼_¼ðµ?|³Ë?{»òÉ3½ó¾¿{óÀýôÙ[iðag{’‡jÿýñáwk>ž«–¸ýóÒÃO=øºŸ’~äC~Ôõ³~ÿ*ŠP4î- {4à´¨§[9°:ºÝþ…Àʯ{ÄÜb&ÅÁHAhIä\õBè:†NŠÐ$À^0/´à›„ÂþÜÉBö3¡ÿH@öŽ~þ¯™¸Ìt%®¯‡1Ô ½·C÷Øè5çÙ’pÞ7Ã$Šp‰<N‘¦H((>Q-DžK8ÆþÏ;WŠˆ¥¸ØÄ2º°Šp¤_ ­Ã’ü9m‚¦s#}h¼,Š105ü`Cš†GÔ鑊Xä#s((ƈLDbÏÉ7f¦ƒâ 'éÇBªŽ“BôÏ®¥4t©L© S`³™5¦´" Cʧ2¦P•iÓ?§•4*Q}ZA *q©Guå3“êÔ+BõªHMi0±*ÕœFu—^å*X©:U­Þ´«rVùÈÖ¬.ó”Äd«\ͪT·Òd?iRYß*ËUõ¥XãJמUê°iÌëZ ûW¦š³±_%,_·êÇâµ?”¡^ÛŠVÆrv¬žëdÏŠÊ'Ѳ…ì`ýúYÉVµvõþ]b©%þpt´uí,nkÆØF–µ¢-j M$HÞ¶º}mkÚæîö›ˆEOtS»ÜŸ"´Ï­nS¯ëÚ:Ù ÜenvƒëX|†×ºŸU+DÏ»]í>Ö½æ…/xå[Pòþ½ö]-~«Ü¤Î´^þýïk"àø¿ô]¨Oº`³5í£&°ÊFºÙüV–Át…pÐ,áo8Áë…¦†v`{šËÃ(¶…;Þ c·#þ‡SLã–­Œ ®]Œ‹&âKdÇ5²Ân|ÜßÈ5#²’³0YÈP˜’keaEø‹Â½²“¯Ìå.OÓÈ$­2vûËßòÎWÌݽoþ{Ñ,^2·øÍn޳™ë[f5¿—Íû…óœ\gý®¹Ï¾õóÜ=‡ÏֳŤÞÜŽÙÐÔEô -èøJÚC—5.o[ùèEŸ™Ð®ô§)MLJW³˜…k›!}[9{šÎ¤.ô« ¬ÂæÕ¤M³¨aíê]ó9Ö¡t©ñÅﲑ²²öõ¡A­ka'ÛÙÁÎÐlOÁB»ÙÏÎv´·mn¯zfµ¥ 9Ýír[Ù‘fö¹¯½n'N7³‘ªóÜkvÓ›ÕaV÷½g}´ïZ[ÛæÞ7º[ï ë;ÑÏk43Þno ÜÞ/8‹ëÍð‡W<âüN7°Žñ×ÉË ˜þ ¾ñ†s|Ò×Z”•6åh]zÔ)?¹¥^—'¯Üb-Íg^r‹;¼ãG»9Ñr®¾—óZâ86ú¯7&ô¡#Ÿ8Ò‹¬ôeÓ°éX‹zÒw󩿪êG±9Ö#öt öèG¹×©¢»Ý]Z§:מq‚×=ßgWûÝIs“ûÝç2ïúÞ¥>ø­çç}üßÑþs½{œïkwùÜ—y^ð'|æ ŸxÆR¸vôç)_x¹_žî›7}籕é=®ñ•/úä­þzÌCÜ.¦Îª5Í^Çßö¥ÿúì5^{'‡»õ$"÷â}Ÿvà§^ø§'ýóM‹#§º¯ŠÏ¾ç—þïüßÛ¾ùßÍ´uïÞÇúÅ—¾÷Q¿~õƒßø¶·™Þøî¿ßýõÿèiïõÜÛü®{Pvv÷|l}ü|0ÁJ¨€’‡€Ä'€f—~ h€#¡pó¶}ÚÇ|ùÇ~÷Wí‚hyH‚h‚˜G€ôv.˜.çw€'X€!ˆ‚5øccGb1ø€3ˆw=y¥'v9è0eÇ‚%({Hƒ#¨„*7„*¶ƒ*x„8|L¸aç„OH€>¸‚†Ä…Ÿ„X˜dPˆ„?¨y7¸…`†/S„](…è…¥‡ª/X‡Ý¤…@˜‚d(‡°Ä‡¹ä†F¨‡S˜„h(ˆoˆþmhˆx†yȈf¸„…舜ç‡ó£ˆ‰(‰ªG‰Dˆ‰Øøg…UÈ}úGŠØxC4Šh (‚­hƒžøˆwY®(Š‘‹“ˆˆ_h‰»ØIþ·ȃšØSº‡Å8‡˜ˆ~$ƒZ¨¥ŠøŒh‹Ÿ(²HúC}ŦXÆ¥ŒÇØ‡Ýø‡¼hŒáˆŒ]5~ÿÇÛ(ƒÃTãèíŽÉ¨ŽÁ3\vb}¹øŽ•Âøùˆ‹™>¿øn·øŠÎ¦ŠY‹ ‹ X¬hÿˆ›X†÷¨QH[¡ç¥¸Š ¹yŠÉIŒ%ÉŽ¹‡ü8‘Ëh‡.ù’"‡þ‡Õ’9’s¢†8¹0lØ‹þH’)9ˆÂ•“By0;)Ž?yˆ'ùT6”LO2Y‘=)I¹€MÙ”EIŽY“49Ò"„UaWéŽG¹ˆQ¹Çã•_Ra ey‘cy‰V“r9—è2†@¹ŽJÙ–*9•ÿ–•\É‘"¹•3 ˜I˜ i˜°è—ƒé‘iˆ’…ɘù˜ZI™)™‘阘y˜›™˜6i–oɓР•£‘¡i”zy—+i’§‰•Ÿé–©‰”­)–±I–¥é“µ —·)•³É–» š¹)𝹗½Ù¿ ›ÇIœi—Š•Ù™É™ši™‹é˜´è™‚IšÃþ©š|Ù[Á‰š¥õnÀØKÕ9ÎÙœÒ٘晞“YAÌx|ØIÚ™¦ù®IŸ¸ž†Q}ÚŸçy™ì™™ë9 êY eŽj•ŽÀ™œÜYœ,¹š(iŸ´©Gôè]Š5ŸòYŸ *›ê›ÛÉ¡á™IâIžúŸåi Š¢ÐI íÉ| ‰ž,š¢-£+ª¢þ ®Œ':£6úœ7J£?Ú£0*¤ ¤>z¤CÊ£J*£L;tù¤P:`T˜¤M¤Kê¤Ä¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦l ¦kiœj›qª›¥" mz§xš§zº§|Ú§~Ú¥oú Ý©|þšŸuú§ˆš¨Šº¨ŒÚ¨Y¨¬Ù¡pŠŸ¼ieŽz©˜š©šŠ©¡*§”º ‡º©¤Zª¦zªeÚ©yù©tªÈ9ª¨«²:«œj— :§Âéªm¥¼J—¶ ª…Z©¬š«Á*ªºÚ ’*¨©Ã ž¸ê¬Çz«Ñ ¬&Z¢8j¥UФEJ¤;š­TZ£ G¨Õª¡ÏzŸÅúªÓÚªç:ȗת­Ý ®Þº­WŠ­òÚ¹{ 8¨ûº¬žZ® °JŸï™&$*zéJ¬ãj¨ ­ëЬ·‰Á*æ÷”äڰ溰Â*°“Z¬Jž;¥ô:¯ñj¯& ¯Öj¤jC+[þ\ýš¬ÌÊ±Ê ³ÿб‹ŸùJm/Û¬û®ßz²?‹²û°?f;+³1k³K´Ôê³#{¯î–‘O ´U+´ ˴ꪱƪµ ë´%‹µ«´;®½ê‚¿ºµ`›²Üʶõúc´·¥ªªV坫д5뵋v*·~[«›µ\‹®zÛ³Tk›¸J·}‰·wK¶3˳7»7Š[¹‰Ê¸Þ)¹K;¸Ê©¹e[s–º}Š¹âº¶C˹ë¸u[}+º®{§¤{´›´…;¹¨+­{s¶n—¶_{¸nK²¿ µbÛµ·Û´¾{º¦+¸É;¶µ»¹ËK¼ÏK¸Å«¶Ç«¼Õþ˼ÓÛ»m‹¼× ½Ý+½ƒÓh›&»Íû¹ßÛ¹ªÛ¸³›·ÔҮؗ½{½è»¾[¾‘;’9!ˉa´þ{µÿÛ¿<À¢Ôz7Tºç›ºô»ºž{¿ ¬¾…*±ízl¹öÀ™›¾lÁ¼½ÖËÁ„%çHH½—À¸ ¿†ëÁÞ‹Âà›j <µ*<¿öK»&l»ò«À<¢Wâ>0ü¶¼V+ÀB Äû€d´ô‡ÁìÃLÄ?̽1ŒÃ®¢£<Ãì{Ã%ŒÅÆÅYLÂ[ÌÄC Å`ìÄM,ÆÀkÆ÷£»!Ç»ñëÅÔËÅ_|Æ­ûºtœ¦±›ÄL¾5ì¼n¬½NVÇþ€Œ¦wÜÃgÜÁcŒÆALƈÈŒ<¦ƒü¾ZüƇlÈ…Œ½ ÛȘü¥Œl LÑìÇ•œÂœÉ¤¼¥›\Å{l¾p,É¡lÄ£\Ê¥|ÊkÅõ›ÊLË <j¼ÆkÉ}ÜÆ« ÊÂûÄ”<Ìe\̉ŒÈE,öìÉ¿|“ìËÁ ÌÑ,Ê­ÌÌŸLÍ×,ÅÙ ÍÛÜÅTÌÍÏlÃãÌÇÓìÍÆÆYë¾ê,ÍÕìÊßÇé¬Èô|Gùû¢Ö<ÏÊLÌîϬ¬ÏÈ|dð©#áÜÅçLÎmÎïŒÍå¬Ê¢"ÁD„Äý ÐÌÍÏùlÑmD;[ ÏÑË,Î íÐþ,Ì:þnã6 Ò-Ò-ÍÐ%}ËÍ<7:¬³#mÐ MÒ;­Ó'­Í! ›øÜÎ0}ÌÓ<ýÓèüÒÈYÐGmÔEMÔ.ÓòÌÔ2ÝÓUMÕÿlÕIÔW­ÔÝ>&bZF`»|Ö2ÅÆK}d–+Ësü·Ër=ײ<¾x,7oí·nÝÖ¯<×~ÝÈu=Âq’×r{`mm.ØŒØj­5|í_}?Š=ÙtÌØ½l/‘ c™ ·”ÝÙ›—¹Ü•Ÿ=£½Èž}ÚzÝØ ½+\FÖcmÖhÛܤÚ&íÕ]ÍÕ>mÛ¹ÛYÔ»­Õ( Ü@ÍÛ[-ÜkíÛ½ ÕSÜÅÍÜÁíÜÃmÜaþ½BÐ}ÜÊýÕº½€< É MÓÝlÃø#Ý«ÝÍ}ÝV1@züÝãMÜ|ÂHG"­!ÞµÍÞÑMÌù ßéÝÝÎ<Ó/R°,ßÕ=ÝäýÜeìßzvMÈ^ß›%o§UkvtÑæýÛ¾Þ$ÑR”Á¸ Á5½-[ă"¥õ,áRÝ/ÝÑAÁ³Ü᡽áW1GhBÝžÜ%~ÛBÛƒÄáê=ßò=îÝETá<.äÞ]½÷-´]äüý¯¡ÖNäûÕ.,Ñܽ䵼ã\K nÝ5Ná3¾áœàU.åÞå4>âOmæå­æeŽæQ}²çwrn`I^„Úzž¸þ–Ýv{º}¾[yþç„.«¾1…®¸‡Î3ƒžè޾©‹>3žÚ—ý!>é˜Î¨‘N‡™N«›î‹ê€+²¦-ê¦úé®t馾ê°Kç¬~êwnÓu>ë+Eç´>S±~åú}Å»®ëVÞâ,®ã½ìXåN>ä_Þæûœì ÎæÍîæËÍì\í&ÞãÆ.¯]íPÎë¿.ìÙqwì.Ãô=íËîìèÁáídþìéŽc?Et”í6¾í¾þîë~ÏÄ>ìî~ìÀbàTíê.àçnðE,¾‚­ïORΟ,-íOñO~ÌŸá^ìÜîðÌóáVâH×WðOþòÈNÔ(>ñœ¬ÄùÝí/ntT~_òÔ~ï®ÒÄ¥ò¨ÌñùðŸ2ï!^"ò5ïåê|ä+æ+ŸÇÿM¾åoòJ®ïC½óþ>î<ÚZ>óDï^Oâpæ ïóOö=õ4ÿõi^ôg®öonÏ·÷r.Ž3÷µ^éóêz¯çD¦ê{ÿ§¨^Z?ø“Ý÷„?êü{‡¿ørmøŒ¯é¹^~ÿø”Ïç˜]ù—ù”1ù˜ßù†~ùž?ºšÏœú¦é úyø`c÷®÷uÿúÖ4úKlöýîòµö]önOðl¿æ¿¯ì¼?ükßûÚ>ôSoûÿ®ûÉÏü×þÎõÍýÏoíeïüÕ/ý×OýgýÛ¯ý·ïñ»_üÄÿöãïûÆoóR?ýøþýÊõWŸûÜÏþÖßýë¿üñoÿÞÿTjïFüð^þñë0 ˆ0!Â` táCBœ¨°aFŽ=V”øñ"H†!IŠ´˜ÒäH–Q®TÙñäÌ–0mÊdS¤Kš… öSgÏ›yæ,JçÐ_G™>MŠ´äÒ¨P©N}y5ëVšN«~Õ*ÐkX©\ËŠkÖêδJÕ®û–ìZ´¿‚ ;x7oP‚?…¶=Û0ÝÀãºE\î`Æ8+žõ1aÊ‹#_–k´qæÄ“7'þ6ü²Ù†?Ú-è7õêÊd=cm™óèØXkÏ&ü7`Ý·}ׄM[xoá­57ÞYtràAÞunõiæL‰W—¼\ôu펻ï¶]ü{]ð廎;rè™óÄ;}¡^Öè¹³wíž·þà÷Íöï·Üø›-ÀôH#ð7×cK:Õ@’î¡¿ðc‹Be»ÐBàþc¼ 9lOÃq»‡;qÀ5܈>»ø Fè¤ûð¼ÿ[о³»±FAdqÇüz<ÐÃ" È÷lrðĉ|Èã¤ô1J“¤òH+‘ 1Ë%•ÜÌþnrÑË.¯4QÌ…DPMÙTÎMåTþÑÌ1éäÑÎ5ñRÏ7ùlÓÏ9­Í “Ð< ÅqFG…4RI'¥´RK/Å4SM7å´SO?uRD„“ÔQ­+ÕSá¦W_…5VYg¥µV[oÅ5W]wåµW_6Xa‡–Æ¿T´OF«LC.Yl•Xi§¥¶Zk¯Å6[ms5¶Yõ¼rY-Áµ1YÒ¢Ý6]u×e·]wÙívÕoå ÷YÉÝPÜ÷Ð}·_ÿ8àtã5·\}Ã,ØÔ„U]˜U†8b‰'v•àƒ•µ—Yz ÎxÜ[â—b‘G&¹d`-î¸Ð”¾xφ½ûذPg¦¹f›oÆ9gwv4æ3Wþ¾óå …æøX–v¹å?‰Î饕j•ZêEŽë©ñÝrÄ®ÓdK«1¦:i­¯.ûé³Éæ_±×tì¸áNTîºéVØî¼ñfXï¾ùv6í¬ßú㯠ûgÂÑnÛçy™>ü^ØâƒÒmÅOüq¿/7ÜrÍÿ|q˜3¯—))Ï2rI7Rô¹]¿ö½eÿ›öÀ1ßfw‡5ÔÅUÝcÖÌ}èâ‹Ætã•G¾sÇ5k2úÕLû½ãà‘=¾iÛGÏþíí—ÿ¾yÈ=/½qçú‚N¾«÷šüÖ“_{øçw~øëŽ_ìø"Œqÿô+Þûê×=Î/€Äcžüþ˜@ïµMzúûÀFÀЕê~Uc`³wA³åOƒ äàŸxG¹2ÙEp!ý h?÷!Ѓ ·B¢4IN2dÜ_X>ªpƒ-Ä!ÛzÈ‘b-ˆ¯ó!¸Ä1vIŒŸgE 2‘…M´"yHà 2„g_cÅ8FLaÑŒWD£¹™Ìo,Ê¢˜Å.nñ‡gTcSÚG>öQ`r¬"ë¸Æ;¦qzôc"ù/@ÆŽ;$¤ ID.Ò’—ÜV#&ÅÚQÑ‘“äÚ19JRþJ“zãäí†ÈEJ¦Ò1¢,e,eY«SâÍ•àóä&J2öÒ—¿f¨@þ¹ÊBæñ–â+æ!©@Væ•»$¦$ ÙJh63šs¦5µ™Ljf“›Î´e5¿yÍ@Nœ²[fÉùIs®S—Þ”¦1ÅÏÂÜjéü 6Û¹MzvsŸãä§„ÔgÄyêSžð4¨2 ZNcÚs †C›tÂ…²ó ÿìç9TÑ„=Ðw¬¨ŽÊP…ŽÔ¢%ÅhB[éœþEgzõ`JIêϋ֥6¥iI©ç‰Â4u}¦Iß)Ó“æÔ¨øòèi2Q‘u¨8Õè N¡¢¢WeiD³ÚT¨º3¨NýjW:Ó$2UªU¥*XÓ*V€¶5£× éYՊΩÒ­vëFïªþ׼ʕ­okQ£*(|.5˜—:àa+Å6Ö±ÍÙ^ýzHXJ¬–²«lÄP–ÙYvÖ—åë_ãÇÙ‡VN¤ý#NPëYÖÆQ²„májYH½‘R­Åí"M Û×BM¶ŒL¬mU›[âöq·÷¬ë‰~ë¯ãbm¹ýÚlq¥ëÆæR´·Îîðžû®èN×»"«.WoJYÚB*±å}”jÑ»^ö¶×¡¢%«W×:ޣʯð¬}CKßÁ"÷ºÖí+oìßô¿â­o`ŸÊ_ýN6ÁnUi \`ãwÁ,„ãK¨¸Ú1ÃŽpƒlá°2XÁŒzjÔyâùb8Ä,¾¯‰5œ_þÜ`Õ4Z½±O#ùâ_X–1ˆ7ÜãÄx4ÅÊ1 },b“¸Å?F0”cz%–¾ÈžL埒Kìâ! ™ÆD~2“'l¨NäªÜ 2½¼dï—Ë_^s‘_ºT…Ј™`Žñ›ÙŒg7Kù§6sVmÜÒ yX͇î2¢á¬è=Ç9ÌY2+.Å d=oÙÏÀK®ƒ/]Ï­¢¹Ò泦'åQO9͉Fõ¢SÝhF[ºÔ¦pÝ;ëÈÆÚÔŸÎó¦ÛèÔ|—á½µ®'xjU›ÕQÙ®¯¹ËkL3Ûz™1±Í’le· ذvr®_Ýl[cûHÔ®öº®Ííl÷yÛÏvö®ÿîpþ,ÝÃÆµ¹Û,êy3¶Ý®í6¹¥íêz7yß¡uÀmönÄ•›Þ¡Žv¼îhm÷{Ìÿn8Âý­ð„ »à—·ÄNñ‰[\rùF7ÈÕmðŠŸ{ä_x«AÍðŒ³<嫿·Æ«ÓáÃ|å*¸ËKîpJ{Ü-G¾³Î;nrxû\x$:Ïy*h¦'YÅù´yÎqÞò©¿ÜØ1:KŒùßoÿÙÈþÒª¿ë=Ðk>Ô+@Ü+¿ÿ³,‚Àéó½¾ê+¾ ìä=$ÀÌ£¾õkÀüƒ? |@Ì@À‹<ľû{;Œ»ö¢ýë@D"¤=´=|"Ô=¼@ä?ÜAœ"?Ô?0S»$AæA\BÔAåÓ³SÂ$Ü@"üþ@*DÂÆ+Á(º<k©)ÔB0¼1|<,Á0t.úH‹@„B ì$!t?7Ä?^Jô‰4½;Á'¬C9lA:LA> Ä;º;Ë{==,B+ìAE|A?ŒAA\ÁI*ùPª§cB3¼D4ÌB2ì;M<ÃMêÂ.üÄ2ôÄLäDÂ+E'ÄH<ÌüO¤ìOøüO† ÐW!OåœOßíU Ö-MUÀaÿýÞ .ß%Î^vb)æâ.â"ž^¾á ^áÞea­ã_‹¤b ÆâÈ=â*ncøµb÷ã&ã>c3ÖãäMb&Îc>þãåÝcAäAöà7fã>Îâ@>ä;FbFvá:Öà9–_EvcG†c4Qʺc#ÆäD†äFä¦ä“°Ê0å1.ee%¶d9àÅ-KNNeO^å2.ä\&ä]ndÕú˸|½ÓídTþdR–ä+~e;æÜѽSîæZ&æ[ÆcCŽädžd,–ÝÆtæÚ=Õá-fU>f:¶fdeͬ3Ç Sjåo¶åp®äVöã”XÜIÙúmçqþgx^duve}f¬\Õ²aî^hhvŽfwÖ_„FMPæçxÖå^Vh\æåjögXÆçwnè}~hŠÎèKÞß4†Æ56æ‹Nh’feuÞb/Vé•.a0.hi~䎶èŠVfÆb雯ivio†éL¦ék6i‰Nœ&ê¢nà\{>è žæ^gÕ2ꨖj¤®gæéˆnê‰~j›–ê®Îiª¦eƒ~i¬Ži§îgŸðê´fi°h‚¾j¦.k­>kYigip†kŸ–éšÎk†6k‡–kÀ†è¾éŸ&ç½jÃÎgÄ>ì¿ÖèÀ~ìÁVlŒvl&k½®ì™fìÅÎl¾žì’þìþ“îìÊ¥[ȶlÂÆëÐjŽíÆ6E)Tí¬–ìͦlÓÖìÖæl(‘åblÖ¶mϦmÐnÑþíküå¿îÕÞjÔ¾çØŽëÙÆíaæµÛæ¹.n׆îëÎíìænßþ³lv:DìíåvnÌÖîÚînòNnÚÞV´Óòöëóîèžoù&îôöšyæíÈöîþVoú¾oÿ¶nü†?Î\ïçðñðçïÿ¶ofÜooðwp ?mø.ì7o ¿í—m¿p oÿ¶º6ñë¼ëæñ pÂHiµ†ñ—ñ£Nñ¥ÆðÔ^qÓ™ñçñgkD•Þ±fnœïñ#Grœþþñgë·¾qG#Oò)§r(^rn†Ù°îéŸÛ*÷ò/ÿâò''òG60Gó47á+×S“n3ÏÌ—óvóÄÎq(÷p¯pïp·s8ßp>ó<ô=7t GtWô _ôt.?ôFïsAÿsB‡ôDgôLwtKgqNÇñG_褶jQwkRorSßòN÷óºª.uW?uXOõO÷t<ÇïyFg1wò;/óZïõUßnÿ¾ÜÒÍÓtuZvô¦tì^ö`gÌ;,TîõRc÷õ1çuk?v[oveg\J u’õ˾tIôd¯ospC7çßv]GuqWõm?wyþOwD×ï`Ær¬}÷!Çöjßõlÿuz7p-‡wd§wåÆôMGw„'wyÆ÷pç÷÷÷}'ó~_øtMŸôŒWøƒÇø„ßx/wB›óYswˆ¯x‰¿x=§p)Wó*gsj_ùBùJOo—ù)ù“'øˆ§økWy Èy5ßù:gvŽù†?zœú#/zíœùq×ø‘W÷¦Gó§ÇÀ‰Gy ÿy§fz«÷qžoëXïù”ïz­.yâ{ Wj‹÷x–Wzg¯ù£Ÿ{¹{n¯{¼¿ûyGzªÏ{¾ÿûzß{ÁŸz›{š|†/|ºOüo|¸_|»|½Ÿ|À|įüœP͵gòþY×ö¾7|ÐgüÌ(Îls¨?|©ïxÑ—üÕ·÷çÍ»³úxg}ÊwýËWý¤oða·Äbçü|ò ¯}Ë'}ÇŸðéÆ2·~¿ýâ‡üæ‡~Ýo~ð^ÙO}Ú|Å~¿Ç}ìïuwoë_~í—þòç~çÇüí}z¾¼ÒfûQßz€Wþì7~õ}ûgwïGÿÜ?ü·}ó`¿Hð—A‚ ;ˆÐá‡#R„hq¢Ã†7*¼Ø‘cA!jühräI‰) k‰ò寒0+‚T9S¤Í˜8i®Üé“äÏž5yÞ:4hQ¡)eæ$ÚéS£J“RºªÓ¬P™j=þêuªÎ¯U»‚åŠõ¬Ø°`ÉŽÅi6-[«0ß®E[Ön[¸ñÊíë”nÞºiûåû×0âš„ã2v›˜`ËÈ’'S®lù2æÌš7sîìù³ÞЂ .~˜¡éƒS7VÌ:uiѧsÆ=;bíªÂŒñîíû7ðà‡/nü8òäÊ‘ “­Ú¶ÚÛ¯¥Jw~ØútÒÙ«kÇîýêwîsSï^nþ<úôê×o½õÝðÏ«æžo÷öû{åÃÏv~ýE§ßAå±w ‚ *hž{âÞ{ùÕ'`\¸_„ÿQ÷ ƒøi˜aw dà‚%šxâ r¸¢‡"²ˆa‡~è …3Òv¡sþ5ºx‹$¢ø#A §"…2îhdŒòé˜$„LÒˆ#tK¾èš|> y%–& %}\Ú'e‘T©¤—–¹Õ™«Uù›mºù&œqff£€`J˜f|cºh§|ê‰|ùéä€aî‰g—æˆh_ƒN"¡u2Êc¤‚N꘢Q^*f¥‹f:›£†ú犡"ù蓟~¹i“¨–ʪ¤Jªª™´¢i«š²ZŠkžjÊk¢ºz*ì¯Ä‚ ëÀ6Šl‹¾«,¥®ÎºVdÎЬ©dB‹©±«nË©´»v[븷–›kRÍ5Øœ¨ÉžÛk¸ÃZKî¼æÖ‹n¼ÅÞ o»ÓîK_µÌ’þK¿¬›ï¨ÿ.ûm«ýŠ«p´Ë‹°·ï 1·×t0Ç \°ÄRLïÈö–ŒoÈÏZ¼ðÊcË,Œ'—U°Á’ìñÁ)_ËpÂ2_ì3Ë7ü2Ïî ëÑF}{*~Ü´Ç:g{hÑÍ.ñÕàêLòÖ&w2Ñ-ãÔqå|gÕ1ÍoØI[½öÏpõÐEOMãÀyƒ<0ÚbkÝ6ÝH®´Ü.Û ó†…c­øßeôݯ¦8àŒ×í·È– ®9á•{>ߪFîïàoŽyÏœ›~øä™Ÿžôè—®öëƒÇ>±ê´³Žzç»»m¶œÁkÖúˆÂoÙÆÇ+¿<óÍ;ÿþüð¼¯ÎûíÐY™%sÄŒýy[È=øá‹?þÚW¯òïß“oœ÷¼_¿þoí?ýõÛ ü¶#îzÑïÛ}ðîͰ€< pòǹóU,}A oÈ(ÿÕ/„ 3x% *‹\CÖáÇÁ•…p}Ô Sˆ¥*̃^!Y´’ï„*¼!$C¹¹lý`ð´Ä ¦dˆF<"“¸<óí/uµ[`wF½(öm¾›官»,N‘‰^”žîºF.ÂŽŠfü¢¨Å'2ªŠqccÏ8Fþ‰1R,#±HG<ÎQuÔ£ùhÇ% Cjrä!yGýåþq‹{dd‘u²oˆl$WæÆ¹92¼d$5ƒŒ²x•¼Ù)IµIÃý±“’lc"]¹ÊÅe²…7{ÙP9"Cbr¾le-!Ë`ò°x™Ì-ui0^†r˜¿¤"gÙ8`>ó“•l)["döÉ™Ôü&4eéÍpÓK Éå6O’JBIórä¬&{ ÎOF󌥬Ù)ï¹KKÖSžïœg<›éOzŠó(Ý8 ZN„4  |h?…¢Okµss íVE{PX6”£ý(D Òˆ†ô¢M蕨ҕ²´¥žéhaªI”¶‘†9¼)N$S[îT˜=å¡Ms*Ô¡–oþ¤"-)<=:È µ©DÝ¡9iS£š”bÁ`ªS³zS¨2”ªI*R©‡U­’5…\ŨTgúÓ¨šo¬e}+ÏzÒµv5¬ÿ„Kóª×½*‘®hõë\½ºQ°’´°G5lU™iW…~U­‚½+cëØÅ:±åéc# Ùʶ³‰å§g/ëÓÌrö³Ý¬UÓŠÙÀ° ´¦U¥jGKY¥ZV²«íKÓZ{ZÒÒ6´¶•mm7Û[¢Ý³¸ÚÔ¥bƒ«Ùå–V´ÅDmrÅ™KuyìqÑ}-;cû\Þַ©K¶i³ƒÞìºÎe+w'«Üæþv»½æGô©[ØB×µç­ëz‡{ß¿6þÉLÈ|³[ßÝζ»ØuUF§÷]µ7ŸÇå&}Ó{[ï2W¿íEoÕ[ò6Ã>p»Æx¿ŽÊDS;à{¸f/‰] âS½ØÂ1vo~ lb‡’¯>þ1ƒÌ¼ XÂ2¶›[áªä%—H®?YÒQ6tªŒ|ékùÆ‘îòž=]hN—YÔg¶ô§1-9M§šÔoõ¤M}bXošÒþ®°Žm]j\ÇÙÕy¦u«uýjl£ØÆ>6²“­ìe3»ÙÎ~6´£-íiS»ÚÖ¾6¶³­íms»ÛÞþ6¸Ã-îq“»Üæ>7ºÓ­îu³»Ýî~7¼ã-ïyÓ»Þö¾7¾ó­ï}ó»ßþþ7À.ð¼à?8®ð…3¼á8Ä#.ñ‰S¼â¿8Æ3®ñs¼ãÿ8ÈC.ò‘“\Þ-)öÉ)sŒ“¯\%9Ìc.ó‰§Üå-G6ËY~ó™ó¼ç>ÿ9½%cl=2E':Г®ô¥3ýÚF?ºÎ…^ô¦S½êV¿úÓQnsœoýê^ÿ:Ø{.õs=ìf?;Ú?^s­+éHOþ;Üã.÷çÜå*g;Ôç®÷½óÝáoï;à/øÁ¾ð†?<â¯øÅ3¾ñŽ×{×qÎíÈÏ›òCŸ|¾³.ùm[Þä_9æß÷®ôéî|¸KúÔ›{ë®o»ºWî×'[öß¶½èþzÔÛÝæ»·;ÊÉuá—~ö¦‡}Î/ŸòàGý÷G?·å£¿sçûžøÊw}ñË-ýä3ø oþõŸŸ{«OæòËNþî¿?}ó¯Ÿöèæ}õÓ|îýìOýØ_võ3_ýôÇ~ÿ»užýõßüUŸ¶ßý_ÓEï)Îû¹Ÿ÷韷•_Ö ÿÕßz ömì ÿþu n ÞÞØ= J`ž` 2 ù‰ Æ  ~`ú^ößù¡à  jÞ¸‘^³¥¾ šžB_ú` !í-¡ ÎàùÅÛ¹ ‚`®üàò`~ î±^ZáÍaa†áò ³à~_žàN¡îå_ø]¡öžøEávJø!¡j]"Úa÷M _!¶Ür"¡"æ!#¦¡Òáá=¢ûѵm"Áiârâ´y"&fbµ]â¿=¢#&œ*¢"Àµb–¢,Î"-ÖbæéUºIâbÛ½É.æU.¶É/ºT0²‰-NÜ0$£2.#36£þ3>#42#Fc4®ž06f£6n#7v£7~ã6 8‚£5ƒ9ž#:¦£:®#;¶c: ;º£5ÒbÙ1J5æ£>îã4î£4á8¤@¤8d8a<&¤B.$<.ä;!=žŸ=Þ#Äù£E^d2bFf$@¤G~$1`Hbc9:¤Ižd1`Jšã<ŠÐeL$E:ÜFÎ$5ö#FZãHæä8$H–äJþd;6$J¶¤ Id÷ÄäÃѤR:£M^$Nê$Tr#O~¤O¥U¢£Pž$QÖQ2RÊäR†%G¶ÝL>eTžeHž_NVåU^eVšäVŽO=åW2Ü^<ãg cKá¥gè%KñegøåJ&gÔ¥a&b&¦b.&c6¦c>&dF¦dN&eV¦e^&ff¦fn&gj\@;Bio-Graphics-2.39/t/data/t1/version14.gif000444001750001750 3444112366325116 20106 0ustar00lsteinlstein000000000000GIF87aXºçÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿàÿÿÓÓÓ@àÐÿÿ¥ÿÿõÞ³,Xºþ l Aƒ¿ T8áÁ…&D,¢Eˆ^Ô˜ñáÀŠ'†”Hr£Ç“¿@r\‰²äH“"?ÂtÉ2fË™q¾ÜY“¦@•7yí ¨Í£>‘ê¬i4©Ó¥CBU*”*Ó©O«&mеkU®Z½5v¬Ù¨V¥†]{öhY´YÛJ|›¶n\”tïÚšW,Ü¢~÷²U+w 0Á…ÉÖ«·ï`ÄxKé8±åÈ[ÆÙíäËu+ÿÍœ“´é«§G·ýëpëÚ¿~V–ulжg‡Ö}3èÛ°]û¦ ¹xîÔ»‘÷ö¬\7HÎÂB—ιàaؼKÿή¸9òãÛeþ{/S9t‚ç¦>¼øò­ÜÉ&þðxú9…_7Üš¿@ì÷¥~ÝÉçž}ÖW jÇàüéׄй6×€.˜aƒ*h x&×™uNh"€–—bˆ nX†Ëµèa{ïuö_‰Jxa€1˜Œ PÑ™H]‘ÎÈÜŠ. Èã>>&$“S>ä{êÙ¨£ƒM*Ye—\*Ùã“Ržhä™I%nk÷¥—m§[Ža¹e‡qÂG&›{º™'_7"9] $¦GåŸâ19¦¢Pö)§y6“ž¤‘N&¢¨1Z¦£aúâK:ú¦sž&§)Ÿ§úé虆'§þ€Âš¨«¤î4¨¨¥ê™ê£»v*ëjyZJY®Òú±Ãþúi¯±2;+˜Ç*kª±"Û*´ÕJ«+µ,Z‹W…à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼â"Gï½øæ«/»Ú‹-‹Â #ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñų·\ÀwìñÇ O¬±·N:»Ç!§¬òÊ,·ìòË0üÊ0×l3Ë2›L#ÉÁÐ|óÏ@-ôÐ7çLœÏD'­4ÁFÿË+·Mö¼ôÔTWmµÐMë…ôÕ\»œu©£~·u×d—möÙ]ÕØh·-r¿ÉêÛn×m÷Ý+«ÝþÝx÷]°ÞPoëtŒûnøáˆ'®øâ‡ÛËøã#÷µb6*·à•oz¹¿™£¸åŸkºçƒƒ^ºè§“Þ¹ª›Ç=:ë¯?:ì³Ë¾ºí<“¼cë”ç>ùο—»¯¼_¼ðµ?|³Ë?{»òÉ3½ó¾¿{óÀýôÙ[iðag{’‡jÿýñáwk>ž«–¸ýóÒÃO=øºŸ’~äC~Ôõ³~ÿ*ŠP4î- {4à´¨§[9°:ºÝþ…Àʯ{ÄÜb&ÅÁHAhIä\õBè:†NŠÐ$À^0/´à›„ÂþÜÉBö3¡ÿH@öŽ~þ¯™¸Ìt%®¯‡1Ô ½·C÷Øè5çÙ’pÞ7Ã$Šp‰<N‘¦H((>Q-DžK8ÆþÏ;WŠˆ¥¸ØÄ2º°Šp¤_ ­Ã’ü9m‚¦s#}h¼,Š105ü`Cš†GÔ鑊Xä#s((ƈLDbÏÉ7f¦ƒâ 'éÇBªŽ“BôÏ®¥4t©L© S`³™5¦´" Cʧ2¦P•iÓ?§•4*Q}ZA *q©Guå3“êÔ+BõªHMi0±*ÕœFu—^å*X©:U­Þ´«rVùÈÖ¬.ó”Äd«\ͪT·Òd?iRYß*ËUõ¥XãJמUê°iÌëZ ûW¦š³±_%,_·êÇâµ?”¡^ÛŠVÆrv¬žëdÏŠÊ'Ѳ…ì`ýúYÉVµvõþ]b©%þpt´uí,nkÆØF–µ¢-j M$HÞ¶º}mkÚæîö›ˆEOtS»ÜŸ"´Ï­nS¯ëÚ:Ù ÜenvƒëX|†×ºŸU+DÏ»]í>Ö½æ…/xå[Pòþ½ö]-~«Ü¤Î´^þýïk"àø¿ô]¨Oº`³5í£&°ÊFºÙüV–Át…pÐ,áo8Áë…¦†v`{šËÃ(¶…;Þ c·#þ‡SLã–­Œ ®]Œ‹&âKdÇ5²Ân|ÜßÈ5#²’³0YÈP˜’keaEø‹Â½²“¯Ìå.OÓÈ$­2vûËßòÎWÌݽoþ{Ñ,^2·øÍn޳™ë[f5¿—Íû…óœ\gý®¹Ï¾õóÜ=‡ÏֳŤÞÜŽÙÐÔEô -èøJÚC—5.o[ùèEŸ™Ð®ô§)MLJW³˜…k›!}[9{šÎ¤.ô« ¬ÂæÕ¤M³¨aíê]ó9Ö¡t©ñÅﲑ²²öõ¡A­ka'ÛÙÁÎÐlOÁB»ÙÏÎv´·mn¯zfµ¥ 9Ýír[Ù‘fö¹¯½n'N7³‘ªóÜkvÓ›ÕaV÷½g}´ïZ[ÛæÞ7º[ï ë;ÑÏk43Þno ÜÞ/8‹ëÍð‡W<âüN7°Žñ×ÉË ˜þ ¾ñ†s|Ò×Z”•6åh]zÔ)?¹¥^—'¯Üb-Íg^r‹;¼ãG»9Ñr®¾—óZâ86ú¯7&ô¡#Ÿ8Ò‹¬ôeÓ°éX‹zÒw󩿪êG±9Ö#öt öèG¹×©¢»Ý]Z§:מq‚×=ßgWûÝIs“ûÝç2ïúÞ¥>ø­çç}üßÑþs½{œïkwùÜ—y^ð'|æ ŸxÆR¸vôç)_x¹_žî›7}籕é=®ñ•/úä­þzÌCÜ.¦Îª5Í^Çßö¥ÿúì5^{'‡»õ$"÷â}Ÿvà§^ø§'ýóM‹#§º¯ŠÏ¾ç—þïüßÛ¾ùßÍ´uïÞÇúÅ—¾÷Q¿~õƒßø¶·™Þøî¿ßýõÿèiïõÜÛü®{Pvv÷|l}ü|0ÁJ¨€’‡€Ä'€f—~ h€#¡pó¶}ÚÇ|ùÇ~÷Wí‚hyH‚h‚˜G€ôv.˜.çw€'X€!ˆ‚5øccGb1ø€3ˆw=y¥'v9è0eÇ‚%({Hƒ#¨„*7„*¶ƒ*x„8|L¸aç„OH€>¸‚†Ä…Ÿ„X˜dPˆ„?¨y7¸…`†/S„](…è…¥‡ª/X‡Ý¤…@˜‚d(‡°Ä‡¹ä†F¨‡S˜„h(ˆoˆþmhˆx†yȈf¸„…舜ç‡ó£ˆ‰(‰ªG‰Dˆ‰Øøg…UÈ}úGŠØxC4Šh (‚­hƒžøˆwY®(Š‘‹“ˆˆ_h‰»ØIþ·ȃšØSº‡Å8‡˜ˆ~$ƒZ¨¥ŠøŒh‹Ÿ(²HúC}ŦXÆ¥ŒÇØ‡Ýø‡¼hŒáˆŒ]5~ÿÇÛ(ƒÃTãèíŽÉ¨ŽÁ3\vb}¹øŽ•Âøùˆ‹™>¿øn·øŠÎ¦ŠY‹ ‹ X¬hÿˆ›X†÷¨QH[¡ç¥¸Š ¹yŠÉIŒ%ÉŽ¹‡ü8‘Ëh‡.ù’"‡þ‡Õ’9’s¢†8¹0lØ‹þH’)9ˆÂ•“By0;)Ž?yˆ'ùT6”LO2Y‘=)I¹€MÙ”EIŽY“49Ò"„UaWéŽG¹ˆQ¹Çã•_Ra ey‘cy‰V“r9—è2†@¹ŽJÙ–*9•ÿ–•\É‘"¹•3 ˜I˜ i˜°è—ƒé‘iˆ’…ɘù˜ZI™)™‘阘y˜›™˜6i–oɓР•£‘¡i”zy—+i’§‰•Ÿé–©‰”­)–±I–¥é“µ —·)•³É–» š¹)𝹗½Ù¿ ›ÇIœi—Š•Ù™É™ši™‹é˜´è™‚IšÃþ©š|Ù[Á‰š¥õnÀØKÕ9ÎÙœÒ٘晞“YAÌx|ØIÚ™¦ù®IŸ¸ž†Q}ÚŸçy™ì™™ë9 êY eŽj•ŽÀ™œÜYœ,¹š(iŸ´©Gôè]Š5ŸòYŸ *›ê›ÛÉ¡á™IâIžúŸåi Š¢ÐI íÉ| ‰ž,š¢-£+ª¢þ ®Œ':£6úœ7J£?Ú£0*¤ ¤>z¤CÊ£J*£L;tù¤P:`T˜¤M¤Kê¤Ä¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦l ¦kiœj›qª›¥" mz§xš§zº§|Ú§~Ú¥oú Ý©|þšŸuú§ˆš¨Šº¨ŒÚ¨Y¨¬Ù¡pŠŸ¼ieŽz©˜š©šŠ©¡*§”º ‡º©¤Zª¦zªeÚ©yù©tªÈ9ª¨«²:«œj— :§Âéªm¥¼J—¶ ª…Z©¬š«Á*ªºÚ ’*¨©Ã ž¸ê¬Çz«Ñ ¬&Z¢8j¥UФEJ¤;š­TZ£ G¨Õª¡ÏzŸÅúªÓÚªç:ȗת­Ý ®Þº­WŠ­òÚ¹{ 8¨ûº¬žZ® °JŸï™&$*zéJ¬ãj¨ ­ëЬ·‰Á*æ÷”äڰ溰Â*°“Z¬Jž;¥ô:¯ñj¯& ¯Öj¤jC+[þ\ýš¬ÌÊ±Ê ³ÿб‹ŸùJm/Û¬û®ßz²?‹²û°?f;+³1k³K´Ôê³#{¯î–‘O ´U+´ ˴ꪱƪµ ë´%‹µ«´;®½ê‚¿ºµ`›²Üʶõúc´·¥ªªV坫д5뵋v*·~[«›µ\‹®zÛ³Tk›¸J·}‰·wK¶3˳7»7Š[¹‰Ê¸Þ)¹K;¸Ê©¹e[s–º}Š¹âº¶C˹ë¸u[}+º®{§¤{´›´…;¹¨+­{s¶n—¶_{¸nK²¿ µbÛµ·Û´¾{º¦+¸É;¶µ»¹ËK¼ÏK¸Å«¶Ç«¼Õþ˼ÓÛ»m‹¼× ½Ý+½ƒÓh›&»Íû¹ßÛ¹ªÛ¸³›·ÔҮؗ½{½è»¾[¾‘;’9!ˉa´þ{µÿÛ¿<À¢Ôz7Tºç›ºô»ºž{¿ ¬¾…*±ízl¹öÀ™›¾lÁ¼½ÖËÁ„%çHH½—À¸ ¿†ëÁÞ‹Âà›j <µ*<¿öK»&l»ò«À<¢Wâ>0ü¶¼V+ÀB Äû€d´ô‡ÁìÃLÄ?̽1ŒÃ®¢£<Ãì{Ã%ŒÅÆÅYLÂ[ÌÄC Å`ìÄM,ÆÀkÆ÷£»!Ç»ñëÅÔËÅ_|Æ­ûºtœ¦±›ÄL¾5ì¼n¬½NVÇþ€Œ¦wÜÃgÜÁcŒÆALƈÈŒ<¦ƒü¾ZüƇlÈ…Œ½ ÛȘü¥Œl LÑìÇ•œÂœÉ¤¼¥›\Å{l¾p,É¡lÄ£\Ê¥|ÊkÅõ›ÊLË <j¼ÆkÉ}ÜÆ« ÊÂûÄ”<Ìe\̉ŒÈE,öìÉ¿|“ìËÁ ÌÑ,Ê­ÌÌŸLÍ×,ÅÙ ÍÛÜÅTÌÍÏlÃãÌÇÓìÍÆÆYë¾ê,ÍÕìÊßÇé¬Èô|Gùû¢Ö<ÏÊLÌîϬ¬ÏÈ|dð©#áÜÅçLÎmÎïŒÍå¬Ê¢"ÁD„Äý ÐÌÍÏùlÑmD;[ ÏÑË,Î íÐþ,Ì:þnã6 Ò-Ò-ÍÐ%}ËÍ<7:¬³#mÐ MÒ;­Ó'­Í! ›øÜÎ0}ÌÓ<ýÓèüÒÈYÐGmÔEMÔ.ÓòÌÔ2ÝÓUMÕÿlÕIÔW­ÔÝ>&bZF`»|Ö2ÅÆK}d–+Ësü·Ër=ײ<¾x,7oí·nÝÖ¯<×~ÝÈu=Âq’×r{`mm.ØŒØj­5|í_}?Š=ÙtÌØ½l/‘ c™ ·”ÝÙ›—¹Ü•Ÿ=£½Èž}ÚzÝØ ½+\FÖcmÖhÛܤÚ&íÕ]ÍÕ>mÛ¹ÛYÔ»­Õ( Ü@ÍÛ[-ÜkíÛ½ ÕSÜÅÍÜÁíÜÃmÜaþ½BÐ}ÜÊýÕº½€< É MÓÝlÃø#Ý«ÝÍ}ÝV1@züÝãMÜ|ÂHG"­!ÞµÍÞÑMÌù ßéÝÝÎ<Ó/R°,ßÕ=ÝäýÜeìßzvMÈ^ß›%o§UkvtÑæýÛ¾Þ$ÑR”Á¸ Á5½-[ă"¥õ,áRÝ/ÝÑAÁ³Ü᡽áW1GhBÝžÜ%~ÛBÛƒÄáê=ßò=îÝETá<.äÞ]½÷-´]äüý¯¡ÖNäûÕ.,Ñܽ䵼ã\K nÝ5Ná3¾áœàU.åÞå4>âOmæå­æeŽæQ}²çwrn`I^„Úzž¸þ–Ýv{º}¾[yþç„.«¾1…®¸‡Î3ƒžè޾©‹>3žÚ—ý!>é˜Î¨‘N‡™N«›î‹ê€+²¦-ê¦úé®t馾ê°Kç¬~êwnÓu>ë+Eç´>S±~åú}Å»®ëVÞâ,®ã½ìXåN>ä_Þæûœì ÎæÍîæËÍì\í&ÞãÆ.¯]íPÎë¿.ìÙqwì.Ãô=íËîìèÁáídþìéŽc?Et”í6¾í¾þîë~ÏÄ>ìî~ìÀbàTíê.àçnðE,¾‚­ïORΟ,-íOñO~ÌŸá^ìÜîðÌóáVâH×WðOþòÈNÔ(>ñœ¬ÄùÝí/ntT~_òÔ~ï®ÒÄ¥ò¨ÌñùðŸ2ï!^"ò5ïåê|ä+æ+ŸÇÿM¾åoòJ®ïC½óþ>î<ÚZ>óDï^Oâpæ ïóOö=õ4ÿõi^ôg®öonÏ·÷r.Ž3÷µ^éóêz¯çD¦ê{ÿ§¨^Z?ø“Ý÷„?êü{‡¿ørmøŒ¯é¹^~ÿø”Ïç˜]ù—ù”1ù˜ßù†~ùž?ºšÏœú¦é úyø`c÷®÷uÿúÖ4úKlöýîòµö]önOðl¿æ¿¯ì¼?ükßûÚ>ôSoûÿ®ûÉÏü×þÎõÍýÏoíeïüÕ/ý×OýgýÛ¯ý·ïñ»_üÄÿöãïûÆoóR?ýøþýÊõWŸûÜÏþÖßýë¿üñoÿÞÿTjïFüð^þñë0 ˆ0!Â` táCBœ¨°aFŽ=V”øñ"H†!IŠ´˜ÒäH–Q®TÙñäÌ–0mÊdS¤Kš… öSgÏ›yæ,JçÐ_G™>MŠ´äÒ¨P©N}y5ëVšN«~Õ*ÐkX©\ËŠkÖêδJÕ®û–ìZ´¿‚ ;x7oP‚?…¶=Û0ÝÀãºE\î`Æ8+žõ1aÊ‹#_–k´qæÄ“7'þ6ü²Ù†?Ú-è7õêÊd=cm™óèØXkÏ&ü7`Ý·}ׄM[xoá­57ÞYtràAÞunõiæL‰W—¼\ôu펻ï¶]ü{]ð廎;rè™óÄ;}¡^Öè¹³wíž·þà÷Íöï·Üø›-ÀôH#ð7×cK:Õ@’î¡¿ðc‹Be»ÐBàþc¼ 9lOÃq»‡;qÀ5܈>»ø Fè¤ûð¼ÿ[о³»±FAdqÇüz<ÐÃ" È÷lrðĉ|Èã¤ô1J“¤òH+‘ 1Ë%•ÜÌþnrÑË.¯4QÌ…DPMÙTÎMåTþÑÌ1éäÑÎ5ñRÏ7ùlÓÏ9­Í “Ð< ÅqFG…4RI'¥´RK/Å4SM7å´SO?uRD„“ÔQ­+ÕSá¦W_…5VYg¥µV[oÅ5W]wåµW_6Xa‡–Æ¿T´OF«LC.Yl•Xi§¥¶Zk¯Å6[ms5¶Yõ¼rY-Áµ1YÒ¢Ý6]u×e·]wÙívÕoå ÷YÉÝPÜ÷Ð}·_ÿ8àtã5·\}Ã,ØÔ„U]˜U†8b‰'v•àƒ•µ—Yz ÎxÜ[â—b‘G&¹d`-î¸Ð”¾xφ½ûذPg¦¹f›oÆ9gwv4æ3Wþ¾óå …æøX–v¹å?‰Î饕j•ZêEŽë©ñÝrÄ®ÓdK«1¦:i­¯.ûé³Éæ_±×tì¸áNTîºéVØî¼ñfXï¾ùv6í¬ßú㯠ûgÂÑnÛçy™>ü^ØâƒÒmÅOüq¿/7ÜrÍÿ|q˜3¯—))Ï2rI7Rô¹]¿ö½eÿ›öÀ1ßfw‡5ÔÅUÝcÖÌ}èâ‹Ætã•G¾sÇ5k2úÕLû½ãà‘=¾iÛGÏþíí—ÿ¾yÈ=/½qçú‚N¾«÷šüÖ“_{øçw~øëŽ_ìø"Œqÿô+Þûê×=Î/€Äcžüþ˜@ïµMzúûÀFÀЕê~Uc`³wA³åOƒ äàŸxG¹2ÙEp!ý h?÷!Ѓ ·B¢4IN2dÜ_X>ªpƒ-Ä!ÛzÈ‘b-ˆ¯ó!¸Ä1vIŒŸgE 2‘…M´"yHà 2„g_cÅ8FLaÑŒWD£¹™Ìo,Ê¢˜Å.nñ‡gTcSÚG>öQ`r¬"ë¸Æ;¦qzôc"ù/@ÆŽ;$¤ ID.Ò’—ÜV#&ÅÚQÑ‘“äÚ19JRþJ“zãäí†ÈEJ¦Ò1¢,e,eY«SâÍ•àóä&J2öÒ—¿f¨@þ¹ÊBæñ–â+æ!©@Væ•»$¦$ ÙJh63šs¦5µ™Ljf“›Î´e5¿yÍ@Nœ²[fÉùIs®S—Þ”¦1ÅÏÂÜjéü 6Û¹MzvsŸãä§„ÔgÄyêSžð4¨2 ZNcÚs †C›tÂ…²ó ÿìç9TÑ„=Ðw¬¨ŽÊP…ŽÔ¢%ÅhB[éœþEgzõ`JIêϋ֥6¥iI©ç‰Â4u}¦Iß)Ó“æÔ¨øòèi2Q‘u¨8Õè N¡¢¢WeiD³ÚT¨º3¨NýjW:Ó$2UªU¥*XÓ*V€¶5£× éYՊΩÒ­vëFïªþ׼ʕ­okQ£*(|.5˜—:àa+Å6Ö±ÍÙ^ýzHXJ¬–²«lÄP–ÙYvÖ—åë_ãÇÙ‡VN¤ý#NPëYÖÆQ²„májYH½‘R­Åí"M Û×BM¶ŒL¬mU›[âöq·÷¬ë‰~ë¯ãbm¹ýÚlq¥ëÆæR´·Îîðžû®èN×»"«.WoJYÚB*±å}”jÑ»^ö¶×¡¢%«W×:ޣʯð¬}CKßÁ"÷ºÖí+oìßô¿â­o`ŸÊ_ýN6ÁnUi \`ãwÁ,„ãK¨¸Ú1ÃŽpƒlá°2XÁŒzjÔyâùb8Ä,¾¯‰5œ_þÜ`Õ4Z½±O#ùâ_X–1ˆ7ÜãÄx4ÅÊ1 },b“¸Å?F0”cz%–¾ÈžL埒Kìâ! ™ÆD~2“'l¨NäªÜ 2½¼dï—Ë_^s‘_ºT…Ј™`Žñ›ÙŒg7Kù§6sVmÜÒ yX͇î2¢á¬è=Ç9ÌY2+.Å d=oÙÏÀK®ƒ/]Ï­¢¹Ò泦'åQO9͉Fõ¢SÝhF[ºÔ¦pÝ;ëÈÆÚÔŸÎó¦ÛèÔ|—á½µ®'xjU›ÕQÙ®¯¹ËkL3Ûz™1±Í’le· ذvr®_Ýl[cûHÔ®öº®Ííl÷yÛÏvö®ÿîpþ,ÝÃÆµ¹Û,êy3¶Ý®í6¹¥íêz7yß¡uÀmönÄ•›Þ¡Žv¼îhm÷{Ìÿn8Âý­ð„ »à—·ÄNñ‰[\rùF7ÈÕmðŠŸ{ä_x«AÍðŒ³<嫿·Æ«ÓáÃ|å*¸ËKîpJ{Ü-G¾³Î;nrxû\x$:Ïy*h¦'YÅù´yÎqÞò©¿ÜØ1:KŒùßoÿÙÈþÒª¿ë=Ðk>Ô+@Ü+¿ÿ³,‚Àéó½¾ê+¾ ìä=$ÀÌ£¾õkÀüƒ? |@Ì@À‹<ľû{;Œ»ö¢ýë@D"¤=´=|"Ô=¼@ä?ÜAœ"?Ô?0S»$AæA\BÔAåÓ³SÂ$Ü@"üþ@*DÂÆ+Á(º<k©)ÔB0¼1|<,Á0t.úH‹@„B ì$!t?7Ä?^Jô‰4½;Á'¬C9lA:LA> Ä;º;Ë{==,B+ìAE|A?ŒAA\ÁI*ùPª§cB3¼D4ÌB2ì;M<ÃMêÂ.üÄ2ôÄLäDÂ+E'ÄH<ÌüO¤ìOøüO† ÐW!OåœOßíU Ö-MUÀaÿýÞ .ß%Î^vb)æâ.â"ž^¾á ^áÞea­ã_‹¤b ÆâÈ=â*ncøµb÷ã&ã>c3ÖãäMb&Îc>þãåÝcAäAöà7fã>Îâ@>ä;FbFvá:Öà9–_EvcG†c4Qʺc#ÆäD†äFä¦ä“°Ê0å1.ee%¶d9àÅ-KNNeO^å2.ä\&ä]ndÕú˸|½ÓídTþdR–ä+~e;æÜѽSîæZ&æ[ÆcCŽädžd,–ÝÆtæÚ=Õá-fU>f:¶fdeͬ3Ç Sjåo¶åp®äVöã”XÜIÙúmçqþgx^duve}f¬\Õ²aî^hhvŽfwÖ_„FMPæçxÖå^Vh\æåjögXÆçwnè}~hŠÎèKÞß4†Æ56æ‹Nh’feuÞb/Vé•.a0.hi~䎶èŠVfÆb雯ivio†éL¦ék6i‰Nœ&ê¢nà\{>è žæ^gÕ2ꨖj¤®gæéˆnê‰~j›–ê®Îiª¦eƒ~i¬Ži§îgŸðê´fi°h‚¾j¦.k­>kYigip†kŸ–éšÎk†6k‡–kÀ†è¾éŸ&ç½jÃÎgÄ>ì¿ÖèÀ~ìÁVlŒvl&k½®ì™fìÅÎl¾žì’þìþ“îìÊ¥[ȶlÂÆëÐjŽíÆ6E)Tí¬–ìͦlÓÖìÖæl(‘åblÖ¶mϦmÐnÑþíküå¿îÕÞjÔ¾çØŽëÙÆíaæµÛæ¹.n׆îëÎíìænßþ³lv:DìíåvnÌÖîÚînòNnÚÞV´Óòöëóîèžoù&îôöšyæíÈöîþVoú¾oÿ¶nü†?Î\ïçðñðçïÿ¶ofÜooðwp ?mø.ì7o ¿í—m¿p oÿ¶º6ñë¼ëæñ pÂHiµ†ñ—ñ£Nñ¥ÆðÔ^qÓ™ñçñgkD•Þ±fnœïñ#Grœþþñgë·¾qG#Oò)§r(^rn†Ù°îéŸÛ*÷ò/ÿâò''òG60Gó47á+×S“n3ÏÌ—óvóÄÎq(÷p¯pïp·s8ßp>ó<ô=7t GtWô _ôt.?ôFïsAÿsB‡ôDgôLwtKgqNÇñG_褶jQwkRorSßòN÷óºª.uW?uXOõO÷t<ÇïyFg1wò;/óZïõUßnÿ¾ÜÒÍÓtuZvô¦tì^ö`gÌ;,TîõRc÷õ1çuk?v[oveg\J u’õ˾tIôd¯ospC7çßv]GuqWõm?wyþOwD×ï`Ær¬}÷!Çöjßõlÿuz7p-‡wd§wåÆôMGw„'wyÆ÷pç÷÷÷}'ó~_øtMŸôŒWøƒÇø„ßx/wB›óYswˆ¯x‰¿x=§p)Wó*gsj_ùBùJOo—ù)ù“'øˆ§økWy Èy5ßù:gvŽù†?zœú#/zíœùq×ø‘W÷¦Gó§ÇÀ‰Gy ÿy§fz«÷qžoëXïù”ïz­.yâ{ Wj‹÷x–Wzg¯ù£Ÿ{¹{n¯{¼¿ûyGzªÏ{¾ÿûzß{ÁŸz›{š|†/|ºOüo|¸_|»|½Ÿ|À|įüœP͵gòþY×ö¾7|ÐgüÌ(Îls¨?|©ïxÑ—üÕ·÷çÍ»³úxg}ÊwýËWý¤oða·Äbçü|ò ¯}Ë'}ÇŸðéÆ2·~¿ýâ‡üæ‡~Ýo~ð^ÙO}Ú|Å~¿Ç}ìïuwoë_~í—þòç~çÇüí}z¾¼ÒfûQßz€Wþì7~õ}ûgwïGÿÜ?ü·}ó`¿Hð—A‚ ;ˆÐá‡#R„hq¢Ã†7*¼Ø‘cA!jühräI‰) k‰ò寒0+‚T9S¤Í˜8i®Üé“äÏž5yÞ:4hQ¡)eæ$ÚéS£J“RºªÓ¬P™j=þêuªÎ¯U»‚åŠõ¬Ø°`ÉŽÅi6-[«0ß®E[Ön[¸ñÊíë”nÞºiûåû×0âš„ã2v›˜`ËÈ’'S®lù2æÌš7sîìù³ÞЂ .~˜¡éƒS7VÌ:uiѧsÆ=;bíªÂŒñîíû7ðà‡/nü8òäÊ‘ “­Ú¶ÚÛ¯¥Jw~ØútÒÙ«kÇîýêwîsSï^nþ<úôê×o½õÝðÏ«æžo÷öû{åÃÏv~ýE§ßAå±w ‚ *hž{âÞ{ùÕ'`\¸_„ÿQ÷ ƒøi˜aw dà‚%šxâ r¸¢‡"²ˆa‡~è …3Òv¡sþ5ºx‹$¢ø#A §"…2îhdŒòé˜$„LÒˆ#tK¾èš|> y%–& %}\Ú'e‘T©¤—–¹Õ™«Uù›mºù&œqff£€`J˜f|cºh§|ê‰|ùéä€aî‰g—æˆh_ƒN"¡u2Êc¤‚N꘢Q^*f¥‹f:›£†ú犡"ù蓟~¹i“¨–ʪ¤Jªª™´¢i«š²ZŠkžjÊk¢ºz*ì¯Ä‚ ëÀ6Šl‹¾«,¥®ÎºVdÎЬ©dB‹©±«nË©´»v[븷–›kRÍ5Øœ¨ÉžÛk¸ÃZKî¼æÖ‹n¼ÅÞ o»ÓîK_µÌ’þK¿¬›ï¨ÿ.ûm«ýŠ«p´Ë‹°·ï 1·×t0Ç \°ÄRLïÈö–ŒoÈÏZ¼ðÊcË,Œ'—U°Á’ìñÁ)_ËpÂ2_ì3Ë7ü2Ïî ëÑF}{*~Ü´Ç:g{hÑÍ.ñÕàêLòÖ&w2Ñ-ãÔqå|gÕ1ÍoØI[½öÏpõÐEOMãÀyƒ<0ÚbkÝ6ÝH®´Ü.Û ó†…c­øßeôݯ¦8àŒ×í·È– ®9á•{>ߪFîïàoŽyÏœ›~øä™Ÿžôè—®öëƒÇ>±ê´³Žzç»»m¶œÁkÖúˆÂoÙÆÇ+¿<óÍ;ÿþüð¼¯ÎûíÐY™%sÄŒýy[È=øá‹?þÚW¯òïß“oœ÷¼_¿þoí?ýõÛ ü¶#îzÑïÛ}ðîͰ€< pòǹóU,}A oÈ(ÿÕ/„ 3x% *‹\CÖáÇÁ•…p}Ô Sˆ¥*̃^!Y´’ï„*¼!$C¹¹lý`ð´Ä ¦dˆF<"“¸<óí/uµ[`wF½(öm¾›官»,N‘‰^”žîºF.ÂŽŠfü¢¨Å'2ªŠqccÏ8Fþ‰1R,#±HG<ÎQuÔ£ùhÇ% Cjrä!yGýåþq‹{dd‘u²oˆl$WæÆ¹92¼d$5ƒŒ²x•¼Ù)IµIÃý±“’lc"]¹ÊÅe²…7{ÙP9"Cbr¾le-!Ë`ò°x™Ì-ui0^†r˜¿¤"gÙ8`>ó“•l)["döÉ™Ôü&4eéÍpÓK Éå6O’JBIórä¬&{ ÎOF󌥬Ù)ï¹KKÖSžïœg<›éOzŠó(Ý8 ZN„4  |h?…¢Okµss íVE{PX6”£ý(D Òˆ†ô¢M蕨ҕ²´¥žéhaªI”¶‘†9¼)N$S[îT˜=å¡Ms*Ô¡–oþ¤"-)<=:È µ©DÝ¡9iS£š”bÁ`ªS³zS¨2”ªI*R©‡U­’5…\ŨTgúÓ¨šo¬e}+ÏzÒµv5¬ÿ„Kóª×½*‘®hõë\½ºQ°’´°G5lU™iW…~U­‚½+cëØÅ:±åéc# Ùʶ³‰å§g/ëÓÌrö³Ý¬UÓŠÙÀ° ´¦U¥jGKY¥ZV²«íKÓZ{ZÒÒ6´¶•mm7Û[¢Ý³¸ÚÔ¥bƒ«Ùå–V´ÅDmrÅ™KuyìqÑ}-;cû\Þַ©K¶i³ƒÞìºÎe+w'«Üæþv»½æGô©[ØB×µç­ëz‡{ß¿6þÉLÈ|³[ßÝζ»ØuUF§÷]µ7ŸÇå&}Ó{[ï2W¿íEoÕ[ò6Ã>p»Æx¿ŽÊDS;à{¸f/‰] âS½ØÂ1vo~ lb‡’¯>þ1ƒÌ¼ XÂ2¶›[áªä%—H®?YÒQ6tªŒ|ékùÆ‘îòž=]hN—YÔg¶ô§1-9M§šÔoõ¤M}bXošÒþ®°Žm]j\ÇÙÕy¦u«uýjl£ØÆ>6²“­ìe3»ÙÎ~6´£-íiS»ÚÖ¾6¶³­íms»ÛÞþ6¸Ã-îq“»Üæ>7ºÓ­îu³»Ýî~7¼ã-ïyÓ»Þö¾7¾ó­ï}ó»ßþþ7À.ð¼à?8®ð…3¼á8Ä#.ñ‰S¼â¿8Æ3®ñs¼ãÿ8ÈC.ò‘“\Þ-)öÉ)sŒ“¯\%9Ìc.ó‰§Üå-G6ËY~ó™ó¼ç>ÿ9½%cl=2E':Г®ô¥3ýÚF?ºÎ…^ô¦S½êV¿úÓQnsœoýê^ÿ:Ø{.õs=ìf?;Ú?^s­+éHOþ;Üã.÷çÜå*g;Ôç®÷½óÝáoï;à/øÁ¾ð†?<â¯øÅ3¾ñŽ×{×qÎíÈÏ›òCŸ|¾³.ùm[Þä_9æß÷®ôéî|¸KúÔ›{ë®o»ºWî×'[öß¶½èþzÔÛÝæ»·;ÊÉuá—~ö¦‡}Î/ŸòàGý÷G?·å£¿sçûžøÊw}ñË-ýä3ø oþõŸŸ{«OæòËNþî¿?}ó¯Ÿöèæ}õÓ|îýìOýØ_võ3_ýôÇ~ÿ»užýõßüUŸ¶ßý_ÓEï)Îû¹Ÿ÷韷•_Ö ÿÕßz ömì ÿþu n ÞÞØ= J`ž` 2 ù‰ Æ  ~`ú^ößù¡à  jÞ¸‘^³¥¾ šžB_ú` !í-¡ ÎàùÅÛ¹ ‚`®üàò`~ î±^ZáÍaa†áò ³à~_žàN¡îå_ø]¡öžøEávJø!¡j]"Úa÷M _!¶Ür"¡"æ!#¦¡Òáá=¢ûѵm"Áiârâ´y"&fbµ]â¿=¢#&œ*¢"Àµb–¢,Î"-ÖbæéUºIâbÛ½É.æU.¶É/ºT0²‰-NÜ0$£2.#36£þ3>#42#Fc4®ž06f£6n#7v£7~ã6 8‚£5ƒ9ž#:¦£:®#;¶c: ;º£5ÒbÙ1J5æ£>îã4î£4á8¤@¤8d8a<&¤B.$<.ä;!=žŸ=Þ#Äù£E^d2bFf$@¤G~$1`Hbc9:¤Ižd1`Jšã<ŠÐeL$E:ÜFÎ$5ö#FZãHæä8$H–äJþd;6$J¶¤ Id÷ÄäÃѤR:£M^$Nê$Tr#O~¤O¥U¢£Pž$QÖQ2RÊäR†%G¶ÝL>eTžeHž_NVåU^eVšäVŽO=åW2Ü^<ãg cKá¥gè%KñegøåJ&gÔ¥a&b&¦b.&c6¦c>&dF¦dN&eV¦e^&ff¦fn&gj\@;Bio-Graphics-2.39/t/data/t1/version12.png000444001750001750 1372012366325116 20120 0ustar00lsteinlstein000000000000‰PNG  IHDRXºÒ4Òg=PLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ+LŽŒNIDATxœíQvÛ8Eýß›èx5ÙÄ|û;ñ&z…㈱D ° ¢ˆ÷R÷iÇ™K• ¦PÆÛç_ôø ö'öͱhX}¶-VÑ.Ú†-¥ØÕ<‰­Å*_ÿC¬ãì×·šçŠõõÏêýî±pÆz…ý}zº{,ú5DZo——_î¹¾ÂÖãX6É„kk»ð•Ë( Ö¶\Fn7Žû‘­9Ž½Ì±.—¿Ë·¶ "b½ÆÞ.×Kab±nÿº®z!Ö ìm?w‰ÅjLÞ·ÉnÑšl5yO>ÇÚ}ë{Ž%^´<[ÏSõkë{Ž%^´>»;WÙÔ<—å#ر éϳ¡\]ÛOY&Ö¿¤7ÏÅZ]];ˆeÄB¬ b…±+$ˆ…X!A¬±HžŠ%šUbaab ±`}XÄ‚=S¬®5–/øDv›;{Õ(Ö¶r[ºh ¶ì]jž+Vy\Aú{…­tÑšli¬ͼ‚´Ñ¶Ä¥ð¶ÇäbÕí_ˆõ[µÝšSdkŽc[í_×¶ªE«²í_ÉÅjµqÆgëö/~wÃãä±^aëÉ{r±vߢýkKûí_1l¡ý˱hX}6ßz¬¨^ýº~Ê2±V/q<9qb­~eí ÖIA,Ä b!VH ±B‚XˆÄ:K¬l K4«Ä:ÃÂþÄ",bÁú°ˆë VyüT_îÞÃΫ4Ö!ɽ`ØsØCb•Ö~Wˆ{P¬F×BØ=xÆúüy¿+Ñ {{pŽõd¿+Ñ {;çRØÚïJôÞÃμ3Ç‚!Öîëþs•ñ`Áö³ÓîcuŸ«Œ ¶Ÿå#X9±V­šõ¼ÇŽãG±­lœõ¼¢k>ç±+$ùÄ:YÏ{ä8.É'ÖúçE,ÄB¬WƒXˆK±ý<ëyÇ%†bYÞ¸ƒ=‡E,XÄ‚õa 6·Xå¶zÂr ³±bݯ¦·èl¬¨X¥µ*±ŒXM±ØIËžÕ‹´ìYQ±ê´2ïKãÈjŠÕn,[>X°ý¬¦Xõä}»,t6VT¬Ý#;iY²úb±“–%k ¬#«)Ö‚eK]Q+QVT¬Õë.ÛA¬~±‚Xý,b ±úYÄbõ³ˆ5Äêgk ˆÕÏŠŠ%űe5Å‚µg ±`}XÄ‚Í-V¡ýËŠõ‹ö/;VT¬Bû—9«)V«ý‹K¡«)V«ý‹3–+*VÝþõ‰XV¬¦XÏ÷³èl¬¦XÉ;·¼XQ±v´Y²úbÑþeɈëÈjеd±UGÇJ”kõZÑv«ŸE¬ V?‹XA¬~±‚Xý,b ±úYÄbõ³¢b‰Fq¬DYM±`íYÄ‚E,X±`+„Ýfå^5°ÙÅ*w[xÔlÁ¦«´¶&¯Ù‘Í&VÝXV¯PU«Ù’Í&Ö¯§e¢5;²éÄzÚX&[³›M¬çeš5[²ÙĪ'ïu³†\ÍŽl:±v_÷Ÿ«tj¶a3‹Õ®ªÙ…M-l›M¬Ó—p-Ï¢÷(X«W¡žÄB¬ b…±+$ˆ…X!A,Ä b$Vº,z²‰‹X°Î,bÁ"¬‹X°ˆëÃ",bÁú°ˆµÝEôªÙ€Í.-öˆ5‡-´ØŸÂf‹{ÄŠai±?‡M'-öç°ÙĢűbØjòN‹=bMfi±G¬¶û\%T³ ›Z,Ø86›X§/9_žEïQ:±þKÄB¬ b…±+$ˆ…X!A,Ä b$Vº,z²‰‹X°Î,bÁæ«Ü>0¶èl¬‡X÷+Ó-:+*Vi-ÄC,#VS¬V —B+VS¬÷§½4–ëi/å@gc5ÅzÞKc9ÐÙXM±“wn7x±¢bíë^ËÎÆê‹U÷ÒXt6Ö@,XGVS¬%ëK:¢8V¢¬¨X«—ǵƒXý,b ±úYÄbõ³ˆ5Äêgk ˆÕÏ"Ö@«ŸK4Šc%ÊjŠkÏ",bÁú°6b–ÍX±bÑ¥cÇŠŠUèÒ1g5ÅjîuåЉÕ«Õ¥SÎx^ØY¬¨Xu—N`WÕ {c5Åjwé,,Ø~VS¬zò¾]:+*Öî‘.KV_,ºt,Y±`YM±¬ˆéŠâX‰²¢b­^Ò×bõ³ˆ5Äêgk ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~VT,Ñ(Ž•(«)¬=‹X°ˆëÃN«<~`,÷‚aÏagŠUK\ä^0ì9ì!±Jµï±`/ì±½4\ a7öàëó¾—†3ì ±ª^Ä‚ ÖóoD_0ì9ìÜÉ;s,Øbí¾î?Wl?;í>V÷¹Êx°`ûY>Ò•kÕ”YÏ{ì8.qkÑ¢¹YÏ+ºœpn ±B’O¬™õ¼GŽã’|b­^ÄB,Äz5ˆ…X!±kÑÁ³ž÷Øq\b(–å;ØsXÄ‚E,Xö±ŠtÑ&ì6Åñª9P¬m¹±tÑlÙ=ºÔ/ó€m>€XXöÿÙ³—9V¹ÁåRx½¯¦Z´*û¸ÿOn±n'ïÝ@pÆf랥ÔK5'ïˆõ [OÞ“‹µûÖö¯N¾hy–ýïc•¾;XÆ/ø¶<ö,Ô<—å#رÎY»!”¨^ýº~Ê2±V¯D;9qb­~eí ÖIA,Ä b!VH ±B‚XˆÄ:K¬l K4«Ä:ÃÂþÄ",bÁú°m±øÍÇsØB—Îí±üY¬,\´[Ò¯Ç* ý g¬WØÒÚYH¼æ8¶Õ¥Ã¥ð¶ÑíTn«²4k«îÒA¬—ا; ‰ÖǶºtëEöÉÎB²5G±í.ÄgŸï,¤Ys¨XÉû÷'ªEk²Õäý=ùk÷-ºtæ°téХút‹†Õgó-›9’gC¹º¶Ÿ²L¬Õ+ÑŒò\¬ÕÕµƒXA,Ä b!VH ±B‚XˆÄ‹ôç©X¢Y%Öö'±` Ö‡E,XÄ‚õa ±`}X:¡aO‹NhØ9b:¡aÄ¢6€¥6J,:¡aç³tBÉE'4lK'4ì bÑ ;‰å#رV¬–µá¼Š}+ÿÞ V?‹XA¬~±‚Xý,b ±úYÄbõ³ˆ5Äêg¹Ý0Ã7xË RXÄ‚õa ±`}ØÄêZã`ù‚aÏa›í_Ÿ}‹g,_0ì9lkéï•ÊÒEÃê³­ö¯Â¥ö(ÛjÿB,ØÃl«ýëz“YµhX}¶ÝþÅ 6bòŽX°GYÚ¿`O‹ö/ØI,éÀƈµbYÓÒ¾IŽlº¤ˆu‹Xo’#‹Xo’#‹Xo’#‹Xo’#‹Xo’#Ëíƒ7É‘å),bÁú°ˆ‹X°>ìd±.“cé {;S¬Âv)°SÄÚÎO»GÄ‚ VÝ8Æ¥v‚X¿ÊÖ5]ʃ^Ê/ööà«\×Ès)„ݳs.…Ÿ»GÄ‚>ygŽ;C¬Ý×ýç*ãÁ‚íg§ÝÇê>Wl?ËG:°rb­Z5ëyÇ%Žb-ZÉ9ëyS,žE,Ä I>±dÖó9ŽKò‰µþy ±ëÕ b…ÄR¬E?ÏzÞcÇq‰¡X–7î`Ïa ±`}XÄ‚Í-V¹­ž°èl¬‡X÷«é-:+*Vi­JE,#VS¬FcÙ囯Õë½j,Ûíóã9ÐÙXQ±ªÆ²÷2À®ªöÆjŠÕn,[>X°ý¬¦Xõä}»,t6VT¬ÝcÝXf9ÐÙX}±êÆ2ËÎÆˆëÈjе`ÙRWÇJ”kõºËv«ŸE¬ V?‹XA¬~±‚Xý,b ±úYÄbõ³¢b‰Fq¬DYM±`íYÄ‚E,X±`s‹Uhÿ²b=Ä¢ýËŽ«ÐþeÎjŠÕjÿâRhÅjŠÕjÿâŒeÅŠŠU·}"–«)Öó}Å,:«)VcòÎí/VT¬Ý#í_–¬¾X´Y²bÁ:²šb-YlÕűeEÅZ½V´Äêgk ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~±‚Xý¬¨X¢Q+QVS,X{±` Ö‡E,XÄ a·Y¹WÍlv±ÊÝÖ5[°éÄ*­­ Äkvd³‰U7–Õ+TÕj¶d³‰õëic™hÍŽl:±ž6–ÉÖìÇfëyc™fÍ–l6±êÉ{ݬ!W³#›N¬Ý×ýç*šmØÌbõŸ«„jvaS‹Çfëô%\˳è=J'ÖêU¨g±+$ˆ…X!A,Ä b!VH ±B‚X'‰•.‹Þ£lbÁ"¬3‹X°ˆëÃ"V$[JÚßMXQì—RåUÖñõ"V[ªÆ2ýšãXÄšÅ6ËJâÝ4k[5–¥Þÿ±&²eˆåV´$ËŽeˆÃV“÷Ô;–!VËŽeˆÖô;–!,bI³ –ZueÑX!Ö4±V¯m±ÜYÄB,ÄB,± ±ˇE,ÄŠK4‹Æ ±` Ö‡E,XÄ‚õa+ŽÝæÎ^5#–<{¿™ŠG͈¥È–ÆÚQVZ-É6wC,«¢5ÙÆ¾bE½æ8±&²Õ¾bˆåU´$[·ñ»ÜŠÖdëÉ;b™-ÏÒþ…X1l¡ý˱hX}±f±+ÖZõdÑX!Ö4±V¯m±ÜYÄB,ÄB,± ±ˇE,ÄŠK4‹Æ ±` Ö‡E,XÄ‚õa ±`}XÄ‚E,3v»äU3bɳtBû­É:¡w,bÍbé„F¬–Nè=‹XY:¡o,bÍbé„F¬¶ž¼#–YÑò,ЈÃ:¡‹†Õgk»bÙqObMë’A,w± ±ˇE,ÄB,Äòa ±bÄÍ¢±B,XÄ‚õa ±`}XÄŠd í_VE[°……~vEk²åqiѯ9ŽE¬YlÝþµÝER®±تýk¿@Y´æ8±&²í_ˆåV´$[·!–[Ñšl5ygŽeV´®öT«Ù’Í&Ö¯Æ]ˆÀ¦«±Gb°ÙÄzÞ¤¥Y³%›M¬zò^7>ÈÕìȦk÷uÿ¹J§f6³Xýç*¡š]ØÔbÁƱÙÄ:}9Ôò,zÒ‰µzEçÙA,Ä b!VH ±B‚XˆÄB¬ ÖIb¥Ë¢÷(›X°ˆëÌ",bÁú°6b•Ä¿ÚÚ‘õ+ùö!ެ¨X¥µÂ±ŒXM±ZíY\ ­XM±ê´Þ?9cY±¢b=mÒ²èl¬¦Xì¤eÏjŠÅNZö¬¨X»GvÒ²dõÅb'-KÖ@,XGVS¬% —:¢8V¢¬¨X«×]¶ƒXý,b ±úYÄbõ³ˆ5Äêgk ˆÕÏ"Ö@«ŸK4Šc%ÊjŠkÏ",bÁú°ˆ›[¬Âz,+ÖC,Ú¿ìXQ± í_欦XÍݹ¸:±šbµÚ¿ÊÏ ;‹«nÿ*쪚ao¬¦Xíö¯åƒÛÏjŠUOÞ·Ë¢ñ@gcEÅÚ=ÒþeÉê‹Eû—%k ¬#«)Ö‚¥V]Q+QVT¬ÕkEÛA¬~±‚Xý,b ±úYÄbõ³ˆ5Äêgk ˆÕÏŠŠ%űe5Å‚µg ±`}XÄ‚u«<®D{Á°ç°3Å*µSr/ööX¥Zçù‰X°öˆX&-.…°{ðŒõyߤÅ v†XU“bÁNëù]¢/övîä9ì ±v_÷Ÿ«Œ ¶Ÿv«û\e±Ö?/b!b½ÄB¬XеèÇàYÏ{ì8.1ËòÆì9,bÁ"¬‹X°gŠU¤‹†Õgk±¶uìÒEÃê³o—Ÿºß9cÁ«nâ*\ a²—3Ö×¶{iˆ;‰½Ì±ÊuÓ¶Ë¥ðzÃVµhX}v)Üí È 6`òŽX°GÙûÛ ÛÙK¾hX}öá>V黃eü‚aÏaùH6F¬K„–ÆðMrdßR,£Ü±ÎaËàMrdËàMrdËàMrdËàMrdËàMrd¹Ý`ð&9²Ü …E,X±` Ö‡m‹Åïj‡.Vù³ ^¸hX}¶µ‚´pÆ‚=ʶڿ¸Âf[í_ˆ{˜mµ!ìa¶Ýþ…X°“÷ïÔT‹†Õgiÿ‚=A,Ú¿`'±|¤#ÖŠ%Q¶1|ƒW±éV bõ³ˆ5Äêgk ˆÕÏ"Ö@«ŸE¬ V?‹XA¬~–Û #1|ƒW±Ü …E,X±` Ö‡E,ر> b‘  b‘  b‘  b‘¼•òññõßöéýÇŸ?r0o÷6]¿Ä.r(—õX7‘®Ä,r$o *Fá9”·G‘0ŠÌÈ㥱Ȕ¼=þ(¸›Åòrn7|ÅäËO7HñŠ wÞIH‹„±HHnb•ÆWymâwäÝÏVÇþûó[¬Ç[í½ƒÕùÿ :rÙý7ûØûãG;A¾Å*wç•Ë=ˆï¯Ê÷wþ<|ÝëUБßô¹UÇû/ÏÛíSÂë÷¶AüÖ­Ü ëýßö%âÈåú¡fTÕÁÇþÛs½>Ì„†ñãã῞al(;éÈ·z#Ž[w’¼*Öȉ?æÈ÷ç«ùU‡ûïOó§ÂïS{ižø?¾¹7gÙëØ ò-VÙ}:x›˜îþ•nß¹ gÿä=ìȾÇN¾¤õˆÍšQÄÙ÷ØE^kֿϸ#ûû¯é¼òËm¿ÙçûÓßç>vš¼ý;œÛ >ýÛ¯¿ÿo8å)»?ö?Ã)OÙý±_øEÝOYÄB¬Ëß#Öñ¼"Ö5b] Ö5b]ƒX[^ë›åŒU«ƒX‚XˆÄB¬p»áÜc§ 7HIH‹„±HH‹„±HH‹„±HHþ»|ÿ00­ÝIEND®B`‚Bio-Graphics-2.39/t/data/t1/version5.png000444001750001750 1150312366325116 20037 0ustar00lsteinlstein000000000000‰PNG  IHDRXLÿ(cªPLTEÿÿÿ{hîÿÞ¸‡ÿÍð€€_ž ½·k¼­ÿ/î‚îÎÑdÚpÖŠ+âÿÿpؿ؀€îèªúšðæŒd•íÿÿ/OOÇ…Ûp@àЀÿcG”Ó‡Îú™2ÌÍ…?¿ÿÿÞ­õÿú­ØæH=‹ÿ"‹"øøÿÿúúÿäÄp€iiiúúÒÿÿༀ€kŽ#ºUÓÿÿi´Ý Ý¸† jZÍÿÿÿÒ´ŒàÿÿÜÜÜÿøÜî.‹WÍ\\‹EÿEúë×Ü<Ú¥ wˆ™F‚´fͪ€€ÿ×¥**ú€rÿëÍ€ÿäµÿðõ²""ÿõîÒi©©©ÀÀÀúðæ2Í2pÛÿ¥ÿÿõõõ ²ªðøÿ‹é–zÓÓÓAiáÿææúÿÚ¹ÿÀËýõæK‚‹°ÄÞÿŒÿ z|üÿÔšÍ2‹‹ÿPUk/HÑ̘û˜¯îîÿïÕ°àæÿÿúððÿðÿÿðÿÿô¤`ÿÿÿ¶Á<³qÿäက€ÿÿúÍõÞ³ÿÿðõõÜ€ R-‹‹‡Îë˜iÝ#TIDATxœíQrã8Ùs€À÷Å'™ûøÚÛ-Š&!@¢XõTùv;ÙcI“ ²¥*cúšþæ‡ñça(ð“ˆXðJ±JˆÁé³”¬3Y«üýÖéÉ¿sX¼Çà+Öß?V_Óš…ëoËÓ/–£râ4ÿ±*ÓšÜ p?e–,ÀØ\Äšo|å> ˆu‚å>s«yÌ<“óñ~û»ÿv¾!¦Ž“|Þþ–[aÖ™œÖ·ÂE¯´Óq†ÏyœVÌ:“w›vïóÃûàĸ{xÿJþŒµúÐãË{Xê̼VUÅz &«ð&·EÄ¢èYQÅ*µâAÄÒaP±jûÒp+TbP±jûÒ°b)1ªX•}iK‰AÅ¢ÿGAÅ¢ÿGQÅZ‘µJ‘b±V)2¨X.õ% ñŸFË»<®Äj&bõ±š‰X=A¬f"VO«™ˆÕÄj&bõ±šU¬ ñŸ ª± bA"L.Vá­h%ŠˆE—Ž£ŠUèÒÑfP±j]:·B!«Ö¥SüG›U¬}—¯zK1¨Xõ.ïQAy±*[lÞo‹!ÆU¬y¡A‘bñÒ¨"ƒŠåPÓÿ™QaT±¼KúêA¬f"VO«™ˆÕÄj&bõ±š‰X=A¬f"VO«™QÅ ÿ™QaP± : "Ô!bAIJáüTa$ŸÄôbJkK­„Ð}TÇtbíû($D¬d—žK˜O,v鹄éÄb—IJáîášzÄLÖ*IJ!k•Ó‰uy¥{|æ9ŸXÞÅ‚W±Ë$ˆ…X&A,Ä2 b!–I ±L‚X‰•.>óœN,ˆXP˜ˆ ê± bA"D,¨CÄ¢±,H'4ba¡ú ¦‹NhIJ!З0ŸXtB_ÂtbÑ X6Ü=¼Ó]ˆXƒÉZ…X6d­2c:±.¯ vÏ<çëŸdA,Ä2 b!–I ±L‚XˆeÄB,“ ÖEb¥‹Ï<§ "&bAÄ‚:Ô«ð†±EÄ¢2]QÅ*µB<ÄÒaP±ª]4Ü …T¬Z/MñlfT±ö½4N¯ ëÞKã=*(/V½ž‡wFkE^hP¤€X¼4ªÈ b9T—4ÅfTU,ïò¸z«™ˆÕÄj&bõ±š‰X=A¬f"VO«™ˆÕÄjfT±‚ÆfTT,¨NÄ‚ˆuˆX0¹X…·¢•("]:jŒ*V¡KG›AŪuép+TbP±ØñFQÅbÇq‹oÔT,v¼QgT±Vd­R¤€X¬UŠ *–KMLCügF…QÅò.髱š‰X=A¬f"VO«™ˆÕÄj&bõ±š‰X=A¬fF+hügF…AÅ‚êD,ˆXP‡ˆ%Ä*¼a §çqÌéè¥cÄ*»š=!œžÇc_\é¥áV§éy ^*V‰08uÎÏÎFB¬¹Ü8Âà´™{ÓƒÛ±Ü5úEV¬,•‚Ç´¥D·9˜¶½6…[áÖöÿI-ÖTæ-JA¬S¬ìÿSüGåÄùX–)¸ß —lC Qˆ»ýR‹õ\¼WÁŠÕÍ}ÏÒWâÔv·i÷ðŽXG¸xO.ÖêCóŸ:ÿa©“ž¥XËŠbpÂ,Ù{–²Ôެb5•Þß׫¸‰å]‰vqìÄòþÎêA¬‹‚XˆeÄB,“ b™±Ë$ˆu•XÙb&VÐx‰õåsaøÙD,ˆXP‡ˆ¯+÷;óãXèÒyòV™u:F²¤¯Ç*ÛB¿ÂŠu„¥¶³û¨œ8Õºt¸a¥Û©ä­Êºw]:ˆuˆì,´â|Üté䎓dg¡…S½K'ëtœ!; mĪ<¼?Þb 1DîÞ3W¾ÿ¢Kg 3¯UU±èÒÄÄkÕC¬KJ7>%ï¦Ò{l¯â&–w%šPÞ‹å=ºzK ˆ…X&A,Ä2 b!–I ±L‚X=b‘ö¼+h¼Äúò¹0ül"D,¨CÄ‚ˆuˆX±  ^)VîêÇq,i[+bÑ =†tB:¡‡°Ð ýäD'ô(Ò ½‹NèA¤zÅùH'ôÒ ½p¢zé„ÞˆE'ô îÞ3wþ¢z 3¯UU±è„ÄÄkÕC¬KÊc?%ï¦Ò{l¯â&Ö¤5ïÅò]=ˆ%ÄB,“ b™±Ë$ˆ…X&A¬±H{ÞŠ4^b}ù\~6 "Ô!bÁKÅâ­èœŸ#Œ$„Xsm„Ái³¬a<׋U¶…~·Bȃc©”ø¥-ž™j]:…[áîç1¹Xû.Ä:Ä]—γ‡ çã¦KgyÁ6Ä…¸éÒI.V­K‡«Ÿû.Zì·ïˆu„û‡÷äb­>D—ÎÒ¥³‹.A,té\S»(VSéý}½Š›XÞ•hÇN,ïï¬ĺ(ˆ…X&A,Ä2 b!–I ±L‚XW‰•-fb—X_>†ŸMÄ‚ˆuˆXPB¬’ýÍWh Vî™ljUj»Ç \ŽÇ¾¸Ò—­NÓóxðì_ðœXì_ð”XìMÄb÷h#ÖŠ¬UÐD,Ö*8L,¯rŽQ×=w•(ŠåT€6êºAKóƱË$ùÄ:‘Q×=s•äËÿºˆ…Xˆu4ˆ…X&‘Ëé¯Á£®{î<* BÄ‚ˆõ‰X0¹X…7¹•("EÏjŒ*V©"–ƒŠUÛ—†[¡ƒŠUÛ—†K‰QŪìKƒXJ *ý?ê *ý?êŒ*ÖŠ¬UŠ‹µJ‘AÅr©/iˆÿ̨0ªXÞåqõ V3«'ˆÕLÄê b5±z‚XÍD¬ž V3«'ˆǪ̃bÿ̨0¨XPˆ ê±`r± oE+QD,ºtÔU¬B—Ž6ƒŠUëÒ™¸ 1¨Xµ.â?*ØÌ¨bí»txÕ[ŠAŪwéx Ê‹UÙbó~[ 16ØÀ¨b­È Š‹—FT,‡Š˜¦øÏŒ £Šå]ÒWb5±z‚XÍD¬ž V3«'ˆÕLÄê b5±z‚XÍŒ*VÐøÏŒ ƒŠÕ‰X±  "– ç§ò#ù$¦«PBˆXCXj%„î£ú8¦kßÿC!!b »ô\Â|b±KÏ%L'»ô – wïÔÔ#Ö`²V!– Y«Ì˜N¬Ë+mÜã3ÏùÄò.¼:ˆ…X&A,Ä2 b!–I ±L‚XˆeĺH¬tñ™çtbAÄ‚ÂD,ˆXP‡ˆ ê± bA"ЈeA:¡k ÐW0XtB#– 鄾„ùÄ¢ú¦‹NhIJáîáîBÄLÖ*IJ!k•Ó‰uye°{|æ9ŸXÿKÄB,“ b™±Ë$ˆ…X&A,Ä2 b]$VºøÌs:± bAa"D,¨C± o+QD,*ÓÕU¬R+ÄC,«ÚEíPˆAŪõÒÿQÁfFkßKãô 2ü(±ê½4Þ£‚òbÕáyx×aT±Vä…E ˆÅK£Š *–CuISügF…QÅò.«±š‰X=A¬f"VO«™ˆÕÄj&bõ±š‰X=A¬fF+hügF…AÅ‚êD,ˆXP‡ˆ“‹Ux+Z‰"bÑ¥£Æ¨bºt´T¬Z—·B%‹oÔU,v¼gP±ØñFAÅbÇuFkEÖ*E ˆÅZ¥È b¹ÔÄ4ÄfTU,ï’¾z«™ˆÕÄj&bõ±š‰X=A¬f"VO«™ˆÕÄjfT±‚ÆfTT,¨NÄ‚ˆuˆXPB¬ÂÆpzÇœŽ^8F¬²û¡ÙbÁéy<öÅ•^n…pšžÇƒ§ØõÒ°bÁbízi ‹^h"½4ÐF¬Y« ‰X¬Up˜X^%(£®{î<*QË©hnÔuƒ–Ž b!–Iò‰u"£®{æ<*É'–ÿu ±ëh ±L")–Ó_ƒG]÷ÜyT"(„ˆ ê±à¥b•ƒSçüìa$!ÄšË# N›¹7=¸Ë]£_dÅ:ÀR)xL[Jt›ƒiÛkS¸`mÿŸÔbMeÞ©Ä:ÅÊþ?ÅTNœe™‚û­pyÁ6Ä…¸Ûÿ'µXÏÅ{5¬XÝÜ÷,}%þAmw›vïˆu„û‡÷äb­>4ÿ©ó–:éYÚˆµ¬X!'Ì’½g)KíÈ*VSéý}½Š›XÞ•hÇN,ïï¬ĺ(ˆ…X&A,Ä2 b!–I ±L‚XW‰•-fb—X_>†ŸMÄ‚ˆuˆXðJ±r¿3?Ž….'oeY§c$Kúz¬²-ô+¬XGXj; ¹Ê‰S­K‡[áVºJÞª¬Ûq×¥ƒX‡ÈÎB+ÎÇM—NÞé8IvZ8Õ»t²NDz³ÐF¬ÊÃûã-¦C”áîá=såûÏññ!ºtÆ0óZU‹.AL¼V=ĺ¤tãSòn*½Çö*nbyW¢ å½XÞ£«±‚XˆeÄB,“ b™±Ë$ˆÕ#iÏ[±‚ÆK¬/Ÿ ÃÏ&bAÄ‚:D,ˆXP‡ÓôMˆA‹˜±ˆI‹˜±ˆI‹˜±ˆI‹˜dúóçûûï¯?÷|ÿü!'3ý¶iù-v‘S™î ÕS¤å1‹œÉôcПQxENeÚŠ„QdD¶·BÄ"C2mÿ*¸zŠ'äp6/7<ŒâáœË«HñŠœ ¯¼“ 1 b“ 1ÉS¬RùÝ6¯?ó.†g.Ë× :Enbݧ§´üçÿÆÏæÌeõkð©×§78uŽ<Ä*¿Ö•› åñ»òøÈ¿oþOdræíõ±ƒ¶>õçgú¾ÿH’ï_7¬òС<þ·Lìï϶ÅàÌA?ÿÍу6=u‚,·ÂÍ“Ðf"¿¿7¿Z&²¢ì 3ÚvÔyrT¬ž¥ßäÌ¿×+ËA?uŠTÿVøXÜKuéÿ~LskÌμþWuN#±–‡–ïïïç£éêÏéü‘ç„¶?¼›YôÔ9Òöé~ÎF=SØYôÔŸ’£bújwfÑSJŽüLÖÇ×¾ÿì«Ï'>u¦LåßÞ<çñígÿ~þŸÞ”·_º>õ½)o¿t}êþŸxýöK ±æÏ#ÖˆkÉx±–ŒkÉx±– ÖV¬b½ýRÄB¬ùóˆ5"ˆ…X&áå† O)”&“ 1 b“ 1 b“üWpnæ]lÔ¥IEND®B`‚Bio-Graphics-2.39/t/data/t1/version3.gif000444001750001750 3417012366325116 20023 0ustar00lsteinlstein000000000000GIF87aX°çÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ,X°þ; èb Aƒ T8áÁ…&DH%¢Eˆ^Ô˜ñáÀŠ'†”Hr£Ç“@r\‰²äH“"?ÂtÉ2fË™q¾ÜY“¦@•7yí ¨Í£>‘ê¬i4©Ó¥CBU*”*Ó©O«&mеkU®Z½5v¬Ù¨V¥†]{öhY´YÛJ|›¶n\”tïÚšW,Ü¢~÷²U+w Á…ÉÖ«·ï`ÄxKé8±åÈ[ôÃÙíäËu+ÿÍœ“´é«§G·ÝépëÚ¿~V–ulжg‡Ö}3èÛ°]û¦ ¹xîÔ»‘÷ö¬\7HÎ~B—ιàaؼKÿή¸9òãÛeþ{/S9t‚ç¦>¼øò­ÜÉ&þðxú9…_7Üš¿@ì÷¥~ÝÉçž}ÖW jÇàüéׄй6×€.˜aƒ*h x&×™uNh"€–—bˆ nX†Ëµèa{ïuö_‰Jxa€1˜Œ PÑ™H]‘ÎÈÜŠ. Èã>>&$“S>ä{êÙ¨£ƒM*Ye—\*Ùã“Ržhä™I%nk÷¥—m§[Ža¹e‡qÂG&›{º™'_7"9] $¦GåŸâ19¦¢Pö)§y6ºž¤‘N&¢¨1Z¦£aúâK:ú¦sž&§)Ÿ§úé虆'§þ€Âš¨«¤î4¨¨¥ê™ê£»v*ëjyZJY®Òú±Ãþúi¯±2;+˜Ç*kª±"Û*´ÕJ«+µ,Z‹W…à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼â"Gï½øæ«/»Ú‹-‹~€ ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñų·\ÀwìñÇ O¬±·N:»Ç!§¬òÊ,·ìòË0üÊ0×l3Ë2›L#ÉTÐ|óÏ@-ôÐ7çLœÏD'­4ÁFÿË+·Mö¼ôÔTWmµÐMë…ôÕ\»œu©£~·u×d—möÙ]ÕØh·-r¿ÉêÛn×m÷Ý+«ÝþÝx÷]°ÞPoëtŒûnøáˆ'®øâ‡ÛËøã#÷µb6*·à•oz¹¿™£¸åŸkºçƒƒ^ºè§“Þ¹ª›Ç=:ë¯?:ì³Ë¾ºí<“¼cë”ç>ùο—»¯¼_¼ðµ?|³Ë?{»ò!yhð»7,õ—öÞ%VŸ<óß;ïûñÞ'¥ŸôPoß-öxj¯{ö§¢ˆâ|á_O>üÖŸ?s·ö_…·S_ÔÞ×¾ã pQ®š”#¡%ísã{ çrG' Eè?$ Š$èºú-‹ƒ½›Ù-˜¦ •/‚œV !è¾×L\fºRÙ·ÁN°…÷+ }lôšólI8þ'Ä!õgCqƒE"¡zÈÃôi~Ï_Å'Dh])"–R¢§B>y\|Q_Èô9퀦 £ ÕÈB/Úk„þiHÓЈ:6ÞÐ9,ÿõ?ÃÌ0PD¡;8È.î°Rˆ´Ð¿HGÕ ò‘ Õ®I»BÑ’`„$“XuI°1ò“4 $Fn5IP2“UÄd%,CQ”x¢_9KUâ–”Ä]*5)Ë\BÏ–[ôd(S¹bó˜È¼×0¿”Ìf:Ó\Ëd$ßüFÍjJ p)d¦5·ù·h.sšÜ §8ÓæMsœgæ}É—s¢ó}Sgœ´ O¿ÉWßþ¬§>ÅyÏRÚkŸxëgìØùwô \híè‰Ð¶)ô²œ‹AJQ¥=TMÿ¬h:ËQŠ<ó£ éã8Ú$‘š™$f U Ë^š²£Á”AíÓ•ò—/¥å*]šÒ›br¦Ôé-šS–¢2–B©Ü€ºFŸ ó”Lm#O¡ZÔ™´Ò‰=Ý¥V‘jÔ¨Þqª5m)Ny²ŸNªYåªSeZÕ­‚5©Y "µÄˆÂU¬DMë[»ÚVµº•–c,k(e!Œ¢õ°a=ê^׺Ծ.V{<„a`êØ±"ö®Šµlb½JHÆîï9 ”#]ÍŠÕËòU¯šÅ,g]™WÓ’lŒ¡ þíüÎXÙÖn¶¶O½-jm«Z¹¢'‘Å-[w›[Õ ·±ÄnM8IÙä"×µåíi¡ë×êþ¶°ø¤îc­›ÚéêV»Ýõl6ûYòŽ×¹åEïyOyÒz±·½0\.|çKß“ªw_œhÐ. ý­iþÕ¨€AÆß³~7±.Ú0l3øÁû½ï<ó›NúV¸\Îpƒ%œ]o”½F ƒ5L↸´Æìˆc¶àeÅ%ŽñÁNL[ï Æ^k±Ù,ã{ŒÆ¯/&ëÛD£ÀGN²’!gãà6¹¹B.®wûd»NùÊâÅo• ›b,GWÊYžð–‡d^-GY¹]sþ‡©|æç>𪙕®šýÙæôÖy½iþòx;ÛÕvÍlÎ3wå¬g7ºK¾Ív;T0Ú΂ޮ¤Ãûh<—Ž|É¢ñêèAwzÒ„ö4 ½,j¹DGuE“M+mæHSºÔ>4©Aí•+.Deµ˜ïÜjYÏÙɼÞuˆ`k¢ØÖò×Pvu¨i=jd[ÙÙX®¢5¢F7[×kžõ«™mhm/ÛiÌÝé¶ÇýíršÜç6÷µYÉÀ\ÃÚÒÞN·¼×ÍíXÇ›ÞèÆ·º» m2ÙÀ¾žÙ’þ®£8àïîõ½ù=3[Ôà5v¶û ð…£Ç¯k%q:+{Þ O8Lþ0žñ·uØ×7ÈíMñÿ”|hÖÉ“ðzûå­y9Ö 䔇ܿ Ç9Éuþ°˜gkæÏƶÇkžoîüéêâ9Ç}Îr¥£œéû®ºÈ'nuš[üæ]OúÖ—þõ ‡ËX_9ØÇ~õ² ;í*ûÏ›®u óÎ~>öÙýt´»ël÷úš2-Ýî€G<ÙqÞs¸›ZÚ„õHŸËüö¿/~ïgüÔqL›‰Dž»áÍx±+¾íš—yÏçÃT“6Îj'ýéùƒ[õµ×´±#“ÉK]õœ?<Ý…?úÊ ŽÆfnÞ {ãç¾ñ·§}éý¾˜DóþúÖ}óþ?|ÙwßùÓç{ìÂýºŸûÅGÿö/þÌóÎÌ—»ùÓÏþÙ›þüõÇ?îÛoûÔêÄ·~ûguux.¿÷Áç}ô7€ú÷bD÷_ ¸>}'~ ~hC ct€ (€Ò—îÈ ã4+X%H‚ý×p(X3*ˆ@¨~ò€9‚k3ƒ4È‚6}÷×€#ø€q‚>h05˜Fþ÷7˜D8„Sq€TH.@ȄϷyBH}Y|[h_ø‚FÈ…üq ˆc†MØ‚gˆƒÚ·ƒh…dƒfø„(‡jØ… †1(_ç!…pè†ó'‚€ø††8ˆþr'XwHˆs˜†bˆ‡Èˆyh@Ö·ð§…k„™ˆ…e}›XG¯åy“Uˆˆxˆ:hŠ<ˆŠq(‰Trj­gV³å‰zè„|X‡µ(‹ˆ‰-dk¢µh±¨‹¹è…ŸèH³È†vX„C†|Åöy‰}H‡¸À(ÂYg}ÍÈŠÏèˆÛ茶8Œ•tSä7‰Ô¸‡à¨KÁhŽÅ¨‰Ñu‰äÈß¸ŽœXŽ´xŽ¿dR„T”Žõ( èÄxú£ £èY úŸñ™B7 ¤Jº¤LÚ¤Nú¤² ¤êI£RE¤b9dPš¥Zº¥\ª¥R:£”9¤Æi r“¤]z¦hš¦jZ¢_Z£ƒ£Vª–Òb¦kZ§vz§YÚ¦U:¦EjŸÝyc¨™”þW …Š¡­)£nª¨{j¨rj¤þ駸)©Š¨Ái©ÇI©G:ó‰Ÿ÷É©ù ªŸJ›¢Z#í¶jo*¦ŽŠ˜|z¨J ­Ú{̨Tš©žú§¡Jªºú¹:㹜ñ÷ª*¬ J¬ j¬úª“õCå¹|åw«“ ­•Ь§«¬Š»IxØÉi˜J¦µ «« §Ö*®[™œÓ&«Áú­Ãª®ÅÊ®Çê®Éú­ÖY'Û {ÝÚ§Òº©»Ú©¥­ýzk×yÏú¯úÊ«£j°¸z°üº¯GS¯éš¯¶J°˰ Û« ‹°Øzª¡¯Õ®ªz¯®Ê±‰§× ²*²—J­#;®«þ¬‚Jp„z² ®&[²ÊЧ8‹¦zúU$K®5ë³*›²—³D»¥;ënŒÊ³,;¥aÊ´&X´Pû¤GËZë´I‹´=Û²Cµ\«¤S»±3»®aÛ®cû®uA§]›¶:úµz—ªV›µo»´`ú´j[·9ʶ+±4´™Z¶ñz¶/;p1k³(Û·z+¶‡K¶‰k¶‹û·Û±?«µ~ ¹|ë­“»²U;·WKµ‘·™»¨p«¹¡ ºrKºŸ‹}´z¹B«º†K± ûºþêºb¡­©û¸˜Û¹¢[ºŠ»¦{ ¿Š®+»ÓZ¸–k»«k¼­‹±øš%Ô¬”§¼{±Òk±Ô[±ÖþKÙÊŒZ„ª› ¶È[¼Â½Õ »Ã+æz}‹4¸@K¼øú½í¾ ½²µŒ×‰µº«´§‹¿¼»»•û¾ò{®è;š¼ÿ‹¸ð»·ì²¬ ¾â+Žt]ãíq6>_ÎÍd­Ö>^´l]R?Ö;þ-C~äYãHžäþ!=¾äPÞ¥A¾1QN´SÎ3O^åZî¤W>3[ާ]N‰_>æ^ªäd¾¦aÞKY~ælŽ£i^kÞæLúæ?•ãv¾Ò2|çöÕäþ ®à0>ãîçëÝâ~-â*nè(žÎC­èlœâ‰Ü!.èüMè§íâ–^è’ÎâÑë› NéÅ}é•~ ìÙ1~è™.Ú7è‘îéŽélÎè±é¾Rà=tßœÞç¬Þé/>轸ۼçÞ>¬ê^êÀ"ܳÚë“®ìš~éÈ~x×ÔÆ>ßé%ݨ6¿ˆN펮í‡ËÝ$äÎîÛ½ÌÃAÞVÒGàêŸîêÌ^Û£´{àüzþÝÛÞøeߪ–ëžíöNë2~„ìL¯ò.íÄþïeëæ]"»®ëíè”Þà<ïñ Þ‹¾Š^ð¦¾ðû~êØÞè²ÞáÿgŽñ~þâÜNë¤,ñ*Oðü^ñ&ßï/ïò^ì$ò¡©ç8Ÿó†RR:çm-Írô>Ncq.ô?Jç`SôF¿ôGLôL_æ|5JÿôTOäæTõR[än1õXßõ\m/^?çZ/Qa_övëôfôcïQißöLž¡nÏ£H/S=_÷vî8vŸLkOê5ó3oðïëêÞê¡^øënø„øŠŸøŒÏëƒïøìþø /ùøËNù‚ùšøÏù“¿ù‹ßù¡ÿùž_ù ¿ê§Oó-ïñþžñ©ø¯ïú˜ù ßø¤?Ïúžù¥¯û£oú³ßìµ/úf{%¹Oû»oü½Ïû¶ïûÁûÑþ‚ðÿ³«?ë1ÏúÕOý/ûÍ?@ÏÎÂÿýÎþÌüÀOþî>=ÖþŠÉþûçÏþû%Ÿýñ?íÓbîÅ_þÉü˯üâïÿÑ©“  ˆ0!B* táCBœ¨°aFŽ=V”øñ"H†üFœ·ñâÄ3† öråÈ€7›þDI9íçÉ¥gŠ6M˜tfÎQ³6œsg˯i«¶=[sîÖfyç&=÷·bÙ½G‡ 5ùò¾Å‘ \}[·céÆ=?Ÿ.™yvâÛ­Ÿv¼wàØ¿C7¿8:÷ÌëÏëvŸ^yuìñÅã¾Ï¾j]þýýÿ0@$°@D0Ad°Aô/¿÷¨Ó¯B ',O ÉË ?1DG$±DOD1EWd±E_„1Fg¤±ÆY²pCú4œ/ÇåkHé<´±H#D2I%—d²IqÄðG·³Ãñv´½)±„îC'¿3L1Ç$sL(…ÜmË «ä2Í,×D³5"ˤþ³N;ïÄ3Ì3Õ”3ÎãøTÏÏë•mÎ<E4QEÝóÍ> Ò!ýŠMgòrQM7å´Ó#mó=K£¼òÒ6G­RÕ dµUW_…5VYg¥µ?IáSÕÍPu4Î[u4Ð_ÿ ¶Ð\}vÐb#]vÒd+=6¶fq}¿iÝUÊk‰Í–Êh»ëöÔoK%UÜjuíUÔq›ÛVÙp}mÚs‘×ÚwÕWÚ{…­ÝráÝר|ÁM—߀™=ØÙ~éM˜Ú…õ-.5Qx]×&×bŠßÜøÝŽ{ýøßy½Š¥¶þ½Pc‹SÆXˇ FÙà‚~9ã–ÃZY2áØ’xç”bþîh„gZh…Ɩ裕vin™NÚh\MM®ªASIbŽsZå›Y®Ùe§Ý…úi©£ö:ì‹í¢«®«S’Kꑵ[^µÁ®›Ý¼ýM{o†Ë&ûlnãbé­“y¶«â¯µóbÁïp»‡9òÇ'—7ª ¿š"­=溶ݾynoGýnÆ3ç»ôеôùpž=—ûuœQ›õ¿/·WwÇ-ÞuÜoŠê[M7WuÒÕF`ß+^ùÔ)·™ù§vž¶y|¥Ï÷Ö­^{™½ß=xð¹'žz½Ÿ¯^ýôÙ_Ÿüߣwoøß—«Z÷ç¿ÿÿ?Pøl'>šÕouùkßýþ å)6Ð •8AV} |`5ˆ¨"°{æs‹Bfjƒ'Da™:˜+.̓» /hÂÖІKZá¹ZØ´ûÙï…;D[éhxC"qF9ìÍFÂÊЀ ¢¥8Å!qoJ„ýzx@&²€_cÅÈ* >qz[\^ˆÆ3¾Ð‡,\£¹¨E9¦Q‚edãéØEÆ‘Iôãy>3ê‘yÄ߯ÈCÖ±Šd1çHCª”Lä -ÃKBÒ{’ì]YàÒ0P~o“…Ìd#=‰¦R–O“wœ ܬV»N¾²‰µT¥-áˆËŽr ¾t/©þFKN•­œ_.•yJD"Ó(› Í0™*^Âò˜Œd&&™À[ÎÐdnƒæ,©iÌfbÓšå¬f7¯YÁ¬9D˜¡!æ:É©Msªó\å­Â„ sœòè=JÏtîŸBL\0 Ìi*î Ë<'AšÍ|fÏœþ<^= :Њ’R£},(HkÒP‹†&]$J#ùÑ“N4¢eÚ6ãÓx Ô¦Eåˆ>è™=jP…+•~ÒvQÔ”Y‡TF=“ŠO¢RZT41UQR­ª#hU¨võXÍ(Uõ©Õ¡ú‡¬òjZSÖ’ºô…\åàðàz¨­ªÕ®d«GÅ:þ­¹æ)¯Lë+žêzWÂ2ð¯5Å)"{§Ãbg±vla%›Ô½ê•§eý\1!‘lÖ³Ÿ­ÛܺћÒôŸ¥Õ¥H9šÚ–®¢öLllMëP×R”µ)­jQûZÒÊö¶+­lLYŠÛÚ¾ô·SÍmkwk[Þê–|$­¤q›«\ßN—¸Ë•.s&Kмѹ³ÝZp ^Љ÷´bèB Ï9Z¸É½nuµ›]úÂv1ûä®K¬ÃâÚ÷¸¬î{ûÛ[òþò›£ô'çìè_÷"wÀßýoXá+`µs" …^ƒl^Úb—Áóýp}Ó²Ïýò“›Žp[LÝ‹,À¶PzU¢Ðþ¬¹Í»,N±eWß“¬Çt,{3 bkXÂ;¦°|E aGA—¿.2‘™,eYÅPžò’«LeçX¸ï„KZ2Ë Ìåó†Ó|d,屓eì™Aöb5#ÆJnÍ›á\§ÆvÏQÖr—­¬ã éyÏ*”³‹íc/·Ñ 1ô¡Í´h ÿ9Ë!Æ4 ó,iÃRútk¾²¥·h°DšÓ`ês˜í\ç6 šËI¾o™eí*O'oÕlµ«I}çúÖ¡îµ­[ ëGû9ØÎË5±ýeP:Ù¼.¶ª‡ íe;ºÚç=öö~íìl¯Ûœ6«ŸÍ'ËôÉãÆõ·Gm4þo›ÙuËï¹ÕíÂyóÝÀf÷œ-ãŠT¿ ÖtÀ/-ðQgzà/øˆ£¹pq®à×µÁqe¿šÚ_Jâï‡üû‘ùVt³ßîtƒœÑ׿ˆ… âoy›¼Òõ"Ê¥}onç›ÄW+±Ç£+ñˆ¼ç¿ø®ÅÝb~xÆå¦sÉeÞn’ã{éúyž…|b Ýå¾nzÍŸrw÷ÆÉ7þùÄÅv²W\èJÇ8ÚÏîô´³}íZo;Üß®“Y×BµF6Ì—xuaÓœî§îTª™îwkÇ}ä„ǶlL ø& ê]OüÖOnøÂëfñŒÇ!ÞµõÃë=‹O¿<æ“äx®sþ¾ò<7;ꃾiÑ_UóÞæ{Þc¿yÄ÷³õ®zä)¯û¹ŸÞ祶{ðôzp×~枟$òC©|Söž÷ª·ºä_>{ØKëÆ<ó]iý¾k?™»76õ‹ïý!;?üÜ—=úiO~ª=õ¿_=ü£ÿjþt^üëVõÁüûÓ›µÜ•;èS;t; @ù@/R¯£KÑò½ªK@,@œ@ <ÀsÁ¯·ÑÀt¿ø³@ûË¿ñë?{Ó«?Œê®ç£À ìÀù3?þ Aü³$•ë7‡KÁóÛ¿ìÁ˜ËÁÇ3=Ä@†3±œÁ,=ìóA$h\>il>e„Á`|F[„DlôEmFgìFnL?q\?jÜ>rÔ?pGu,GoŒFwœFx¬F=œBSÄQ"E>ÔG9Ãz,ÅþÜÇ6¼—ˆ sËG~ÄÃ=DH{ôÇ€|Cµ(:+±&”ÇsdÇt´Æ3DG=!Œ7l¯ÄŒ,Dsü¾‹äH#4ApòÈ–«È“$IG|Éò‹IW¤Ç”›H£#ƒH‡ŒÃž\H€ JŸÌCÀ¸9ÙÀDÉ‘¼Ék\JV|ÊZTɌªtI‘„ÊšlF­ÌF¬”ʨ쫌ÊdlJËm<ËoäJŸø:¥\Ëu|ËvôJ²ìÇeŒKŒ,Ë’œÉöcH»ÌK™ìAcÌúË=¿¬K§¼Ë”$D]ÜÅ*BF´LL¦aáî^^a ~aža^Ù†áÁÇ‹=[ÆaNana®áŽ Hß-b¾á%6Ø¢ýþanb -:¤ŒY&>Ù¦í`ô}b!Nbî¬&¤[`¾ZÈÍbüb ¶â ;0»ÈÀ*ŽâNcÞb%Žc Îݪ}'q’Óû¥ß9Öâ5vbAÆâ®[KPƒäáÞõaB–ã.&â ¶cw¢ÊcZ-dHVã;6aGÆcIÞI3d4Öd:öäNæd®c åRäTfaW&ePŽäU®åSVe\ŽeZÞä+~äÀMàbã‘í[$æeSŽãÒõßeffé`•å?ŽæÖeÞßfÆæl®Ýgnåc~e_þd[îå~Òær6çÖåfcgdgTnç\6Õs–çyNçF†ekþ^çoVÙdžç~.çz&ãhFh?¦æxöç„ff€&æ2VçjÎá{ŽhH f@f8~ç]ÎçYÞhiöfކh îèƒÎh|i(.é‰Þç”铿âö葆f˜&é•¶éA–è–Îi”¾éL¦é™–énj¸­¿~é¡¶g–æiœVê£&StéIîé_Fê‚>㘎ê!qÛKCªÎê[6j©fê©篖:«ѽõê°öâªnh~k‚ŽëH‚Q7žº-k¶ë¦kŸvkŒ&ë ÑcÄkwlxæë¶6kv>l2´†´Èæã±¦l¿^l}®ìµN콞˜­fåÆ6iþ½çÌÎëÍmË®<35mÆ&mÃnmÄm•~íé<\Ô^m̶íØÖéÛiÑfíÜžíÐæm¬ömÜÖlÝŽµŠVîåÄäãnÙîwQf…¦îê¶nù½èE6h ¾l7»îïïïfhÀ~îÝFn§–šéïõfosoí¾êš.稜îö¶ïû^èìîãøæîâönüðß÷ÞïQ&îá–ïúðgðâ%pÄÍZ¡îîW“å¶ðÎmîÒ>ï¾vîèîð×ðùFoïo—pÿ¦pçð÷pq×nqqØVqÅFñŸqǾñßp7ñ‡Þñÿñ¤.ŽK†¼çìOþò§q&×q¿à8ø6pwñ*—q+oòn6vY«UkE.ðiæq%?m-‡n37oDÖÀ+Ñ+f"'óßFsúžó'뺎òÉvs‡†s'ßò87n,òÃìMä¤ûi!Gò2ô?÷ó3?äPóDò!·ê)óGOó÷ì—ô¿–r1Wt@ïmKŸëVíOŸp*¿òVÏòF?sXßtˆìjòÖt:—u\wõA'õ¿u;ïuVõ]wô:_qb‡ô ·;ý†ð7¿tQ¯ô©Vï_ðßs¸¶uc÷ñE—ói§ö·vMÜg§ô>×ö%7‰ooðpófçsruUçguþ¯vf¿v¹Îö\v÷vz·ovGôxwwlu`öwx{÷ö`ÏôSv2Søv¿÷íõ_?öa×x^Çømwø‹?wFGöY×÷Œçø—ó’÷øŽGw•où‘×õ/v—y™u˜ßw”tœ7ù™çù•×ù–…÷UxšOùŸy›'y¤ï¸¤”wSÏw¦?z¥ù“7ú@ïô¦zªÏù«/unßy®ïyHc>nó…wöSÇt÷z_z·¯r½:±kÒ¢9¿–=:5kµ±qÃÎíûlmÞlÛ^üxXâ“/]v·ó誑K¿]½ùôåׇcWÞ úlÓÞÃ3§N~±yïàÇ[?ïóvíÙãÓŸOw§üöì{wo¾¾?wéù·uÿ `~¨ "¸–D(P„ïç ƒf¸ } Ö§‡–yháƒ$nxà‰vˆ_B,ºÀâ„~xáŒjØáþçxãŽöˆâw9²ö£ŠDÖHá@ƨd’-ꤢ}Bje¤‰A†8¤”â]É:fùÙ—ÑQ©Þ“ò$#’K‰”Xn©e—nÆÉe›t®éå›`æ)f˜""‰æE06Ye”{êÖ§[c*8'œu6z§œŽêÉ褒F§fŒ6‰$¡ðuj秆Z)¤ "Jã¨|šè©“µúœ‹±–ùâ¬<¾ÚÚ­‡®:e® RŠë®®û\¯¨ÛPLj¦Z诺6Ëê°À>Ëk´ÎZêgµ¾^«m©ÂNåb˜ŠÚ˜­±ä"knyÛR;­·ê¶Û-©ËBË.±è² ¯ªôJën½úZ‹/¶þr+oþ¹” e/F ;ìpNK<1Å[|1Æ3ì鱂u,“iˆ<2É%›|2Ê)«\r¦÷òÊ1ËØè¯ï~‰ã³?õ俯>ýàk®ýüϯ<þ(?ø °~™ñCªÂ—¯ÿ OÙ{`ÿ<AvïVÐYm5A6 ÓgÁýI0‚Á !mv¢Ön…J OÈÁ &.†œ ý7CÖ0{˜jÒ_¨AÞp]9,áeÀr°ˆïZ" 9g¦ŒôPL¢l¨Å B‘‡Räâ»x?ùe0F+ÔIAª˜E0p‡cl£uG$ºQŽaŒ^©x’ ®‘ˆ[ô#ÈA&щõb¡„ÐØÂƒÁþ0üc!!YG:ÎQ‰w„ãDÔ´'C2¯’œ„&C)ÈH:²‰MAä¯>9°–r‰ªlŸ+%éIY^r”“´¤(ÙJVò–¯d‹ï‚)Ìasw»ìa/gyLΡnuÎ|æàZ·¼_ЖÊL¦Ýš Ímr“kÒ¤5™ËeºÎ†Úì&:Ó9´o†‹–¹4%9§yNuÒ³ž9cç&ÝiÍZê’ˆó´'@J´x‚SŸý$¥?ªÐ…® Ÿ©4(<±ùNW³¢½(F‡BÐvn4Ÿ}èG-Î(–3¤ø©K*Ñ}N”—}©/!:Ε4¦&m$M# Ók:µiNgÚÓ–"sþ¨,=jMyZš ѨIõ©PêÔŸ*µªÉš"N§U«õ‹Au©TmŠÈ±*’IY +W‘JU¨‚5­O%^¯hœʴ­l-*ZïêU­²òIi<“&etV·®µ«*å+^ »U2¦$¨dj»×¼všuM¬^Ë™ÇÆv²@BéÕºØÊô¦M¥¬ÉÊGªñ³—¬bíJZŽ~³- ¬H_{XÔ¾U´²õ­m‹ÊÜš6²¼-,pa›YË×µÍ-’n™[[åÎÖ£þÌ(v³«ÝíVô¹k­«›Ê2´¼æ%œC‰;ÝÝÆ6qä=/|ãk¶ôÒÕ»U/%³)ßýòWoþôìrK»^yö·À>œ}Õ]ò½~0„k–àEI–½ú0†3|Ï kÀ ö%wC,â“b¦m…¥›â·—ºÉµ°xÕ»bw´/VqÛÛ#—Ç6ö±Ž{,ä9ÈD>²‘“\ /¹ÈMFò“•̹9P¹ÊV¾2–³¬å-s¹Ë^þ2˜Ã,æ1“¹Ìf>3šÓ¬æ5³¹Ín~3œã,ç9Ó¹Îv¾3žó¬ç=ó¹Ï~þ3 -èAºÐ†>4¢­èE3ºÑŽ~4¤#-éISºÒ–¾4¦3­éMsºÓžþ4¨C-êQ“ºÔ¦>5ªS­êU³ºÕ®~5¬c-ëYZ'Tþ¶µOæ`k]ûÖ¾þ5°ƒ-j\÷š×WÞõ®-ìe3»ÙÎ4Oªœliï„ÚÓ~6¶³­ím›¹ÚÖNv´©Ííq“»Üæöö­‹}lu›»Ýî~7³Ã­ìuûÞö¾·«‰î,_ûÚøþ7À.id÷:×ûþ¶À®ð…wÚß 8Ä#.ñ‰S¼â¿8Æ3®ñs¼ã g÷±× rA\Ú"G4ºC®æ’×Úáº>¹ÇÎn—¿Ï,‡3ÍoŽó:«»çüγÎßìs,ÝÍE¹³}~ó‚[é¿õ¼Áu𠽿?G¶Éq up;ÝÚv.9Ø•Ýõ¦O=ë=§:ÃŽõ­?ýå\7þ»×‘^\ËXWºÛÅ^w½ýÎK';ÞŸ¾v«ß}ï8—·Õé÷­ç}ðgg<Ô÷ÌòÂ3^ðd<ß /wnƒ|éYÿ¼à÷Þ÷¶'¾ÍtÇ<Ñ?_ùÅ^ô­O»ÊùƳ~ôª/½ÑåíùÙ‡žô¶çýæçûÔ¿÷®Ç|ÓÑ^u»ßÞø¿}Êå2 ¡!¢v‘ŸÂÐßò›Ã(aF!aÂ8!FA!¡¨f¡n!v¡~áN‚¡Îù,œ!¦¡®!¶¡ªáä½á–áÔ¡Þ!æ¡î!âáäõa–áãLÞÙXa¨!"&¢"Š¡"†!õÉ!$F¢$Æ¡$Â!õ"&f¢&þ¡&ú!õ ¢Ý¢!~Z#–¢)b¡Pœ"*>b%¶¢+Ê‚P¼âÒa'Ö¢-.€PÜb ¢á…(Žb§©¢0Ž!#žbÊ"2Ê!%¾"-ꢒ3ò!'Þ"/!òL#£ £6va1šâ1®á2ºb3>£9Þa4Úâ4¢W(Z#6ã6Æã*ò›0~c8Þ#,Ú2–ã9žc:Öâ:FS;jÎ;rZvQaRHáE!$R(¤E1äQ8dEA¤Q¤E^$Ff¤Fn$Gv¤G~$H†¤HŽ$I–¤Iž$J¦¤J®$K¦Z@;Bio-Graphics-2.39/t/data/t1/version15.png000444001750001750 1405312366325116 20123 0ustar00lsteinlstein000000000000‰PNG  IHDRXºÒ4ÒgXPLTE£ÿàÿÿ‹”Óÿ‹E°ÄÞjZÍÿäÄQÿàÿúš.‹WðæŒÿcG<³qÿÖkŽ#iiiÒ´Œÿ ÿÌÝ ÝÓÓÓúë×ú€rî誀€õÞ³ô¤`€€ÜÜÜzÿÿàÍ…?øøÿHÑÌÿ£‹úðæõÿúÿÚ¹wˆ™fͪõõÜÿÁÿïÕpÛÿÿ2ÿÿÀËÿÞ­‡Îúÿõî{hîÒiÿ¥ÿÿEúúÒp€ÿ­Áÿ ÿææúÿÿ„ÿÿÿ‹‹¸† ÿúÍÿ·ÿô©©©­ÿ/[ÿd_ž Ü<Ç…™ÿÿ™·ÿÌÿ"‹" R-eÿUk/GÿÿÿÿÿGÿAiáÿ@àÐF‚´ÎÑÿÿ‡Îëÿðõÿ[ÍÛpõõõÿÿäµÚpÖÿøÜÿ zŽÿÿQ2Í2(ÿÿ¼ÿÿàºUÓýõæÿÞ¸‡ÿŽ­ÿ¥**€€€ÿi´ÿÿŒîêÿðÿ𠲪=ÿ€€€|üpÿÿ¶Áðøÿ™2ÌØ¿Øî‚îÿÿ=Š+ ¯îî½·k²""ÿäáÿúú˜û˜¿ÿÿÿëÍ‹‹ÿ2ÿ„ðÿÿÿ(ÿúðÍ\\ÿÿÔ¼€€ÿP€H=‹/OOÿÿé–zd•íÿÿÿêÿpK‚ð€€ÖÿÿÿzÀÀÀÿÿðÿeôÿ­Øæ°àæÚ¥ ÿךÍ2pÿÿÿàÿÿÓÓÓ@àÐÿÿ¥ÿÿõÞ³tT©³ pHYsÄÄ•+yIDATxœív£8EùÿŸJZ3³ù­í˜Ž‘Ì– ½×ºïìpÒ,nƒBTaùøÎç[Û_°°¯ØÅ±hX}¶,VÒ.Ú†M)ÙÕ܉ÍÅJ¿ÿ‡Xíìï1Ln5÷ë÷?«Ï§mâŒõû}zzÚ&ýšãØåöñÓÓ–Ká;l>Ži•L¸æP±Ö _ºb5°é6r›qÜŽ¤hÍqìò½½]þn/­DÄz}\þî—‰Åzüëºë…Xo°qüØl'«0y_'ºEk²Ùäýsò9Öæ¥Ÿ9–xÑòl>OÕ¯9T¬Ÿ9–xÑúìæ\eSs_viaa_±K"õ9Êѵ½Ê0±þ!µ9ktuå –A ±B‚XˆÄB¬ b…±ÎˆEês(–hF‰Õþb ±`}XÄ‚½R¬ª5–øBv;{Õ(Öºr[ºh 6m¶.5÷+íW~¯°•.Z“M…µ£3¯ -´-q)|ƒÍÇqr±òö/Äz‹ÍÚ¿Í)²5DZË÷v×þu¿a«Z´*»kÿš\¬Rûg¬ólÞþÅïnØOÞë6Ÿ¼O.Öæ%Ú¿ú°´ÑþÃ&Ú¿‹†Õgç[5У?׫ kôÇ‹'ÖèOVb]ÄB¬ b…±+$ˆ…X!A¬«Äš-ab‰f”X-0,ì+±` Ö‡E,X±Òþ§úrö¶§X©°IîÃ^Ã6‰•JÏ»B,ØF± O\ aW¶E¬_‡Ï»ýÀ°×°Mb>ïJôÃ^öˆuü¼+Ñ { Û"V>ygŽÛC¬Í×õç*ãÁ‚­g{‰U®2,Øz¶›X°°[¶E¬Që„z½oÛ~\â(Ö •½ÞWtÍgß b…d>±Òë}[öã’ùÄÿ¾ˆ…Xˆõn ±Bb)Ö oƒ{½oÛ~\b(–å;ØkXÄ‚E,X±`ç+=VOXôl¬‡XÏ«é-z6VT¬TZ•ŠXF¬¦X,bÁ"V»Îʽj6`g+==šÀ£f v:±RéÑâ5;²³‰•7–å+TÕj¶dgë×ac™hÍŽìtb6–ÉÖìÇÎ&Öqc™fÍ–ìlbå“÷¼YC®fGv:±6_ן«tj¶ag«þ\%T³ ;µX°qìlb]¾„kx£éĽ õê b…±+$ˆ…X!A,Ä b!VHë"±¦Ë c4›X°ˆëÌ",bÁú°ˆ‹X°>,bÁ"¬‹Xë]D¯š ØÙŢűú°‰ûKØÙĢűbXZì¯a§‹ûkØÙĢűbØlòN‹=bufi±G¬¶ú\%T³ ;µX°qìlb]¾ä|x£éÄúw² b…±+$ˆ…X!A,Ä b!VHë"±¦Ë c4›X°ˆëÌ"ìÜb¥ÇŒ-z6ÖC¬ç•é–=+*V*-ÄC,#VS¬R —B+VS¬ÏÃ^Ëžë°—Ær gc5Å:èÙXM± “wn7x±¢bm¶y/å@ÏÆê‹•÷ÒXôl¬X°Ž¬¦XCÖ—TDq¬DYQ±F/+±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:ĪgEÅâX‰²šbÁÚ³ˆ‹X°>¬X‰e3V¬‡Xt騱¢b%ºtÌYM±ŠÏºáRèÄjŠUêÒIW¼/l/VT¬¼K'`GÕ û`5Å*wé ,ØzVS¬|ò¾^z6VT¬Í–.KV_,ºt,Y±`YM±¬ˆ©ŠâX‰²¢b^ÒWbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏŠŠ%űe5Å‚µg ±`}ØÎb¥ýŒå>0ì5lO±Ra‰‹Ü†½†m+eËñ> öƶˆUè¥áR»²-býÊzi8cÁö+ë¥A,Øb?ñFôÃ^öˆ•OÞ™cÁökóuý¹Êx°`ëÙ^bÕŸ«Œ ¶ží&,ì–mkÔ”^ïÛ¶—8Š5hÑ\¯÷]NØ7ˆ…X!™O¬†ôzß–ý¸d>±Æ¿/b!b½ÄB¬XŠ5èÛà^ïÛ¶—Šeyãö±` Ö‡}!V’.Ú„]§8^5е.7–.Ú‚M›­KÍ}ÅJ7ž¶œ±Þ`SaÁã¼iY ½6‰Ká,ÏÿÙ‰õq›¬óÄj`yþÏ–]¾·é>·Káý¾šjѪìþù?s‹õ8yo‚3Öi6ïYšúÁRKiòŽXï°ùä}r±6/­ÿêä‹–gyþÏþ>Vª»ƒeü¯aÓ¾gÉ æ¾ìÒþb—kÖn%j G®W&Öè•h'N¬ÑŸ¬ĺ(ˆ…X!A,Ä b!VH ±B‚XW‰5[ÂÄÍ(±Z`XØW,bÁ"¬[‹ß|܇Mté<¶éÏbeá¢-Ø4ýz¬´_è—8c½Ã¦Ò“…ÄkŽcK]:\ ßa ÝNé±*K³æP±ò.Äz‹=|²hÍqìò½Ýué Ö›ìÁ“…dkŽbË]:ˆuž=~²fÍ¡b&ï?? P-Z“Í&ϱ6/Ñ¥Ó‡¥K‡.6Ñ¥ãX4¬>;ß²™– åèÚ^e˜X£W¢åX¬ÑÕ•ƒXA,Ä b!VH ±B‚XˆÄ:#©Ï¡X¢%V ûŠE,XÄ‚õa ±`}XÄ‚E,X¶,kÞa»‹E'4l±аbÑ À.tBÃF°Ë÷–NhØþbÑ À.tBÃF°ËÓKtBÃvbŸÅ¢¶»´À°°¯X–&Ÿ‰áÅ.é?RĪgëD«žE¬A¬z±N±êYÄ:ĪgëD«žåvÙàQìâX4¬>‹X°ˆëÃ"ì•bU­q°üÀ°×°¹Xë3¬¤‹†Õg— Òï•ÊÒEÃê³¥ö¯Ä¥¶•] í_ˆÛÌ.ßÛ]û×ý&³jѰúl¹ý‹3lÄä±`[Ùåé%Ú¿`;±ÏbÑþÛ‰]Z`XØWì|ë± ’#;Ý Rĺ†E,ƒƒäÈ"–ÁArdËà 9²ˆepYÄ28HŽ,· ’#»8 «Ï",bÁú°ˆë Ömr,ýa¯a{Š•x\ l±ÖóÓf‹X°ÄÊǸÂvëWZ»¦SÚé¥üa¯a›ÄZǺ¾Â¥v˶ˆõ8K}l¶ˆÛ}òÎ ¶‡X›¯ëÏUƃ[Ïö«þ\eÓ vTͰVS¬rcÙðÁ‚­g5ÅÊ'ïëeÑx gcEÅÚlóÆ2ËžÕ+o,³èÙX±`YM±,[ªŠâX‰²¢b^wYbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏŠŠ%űe5Å‚µg ±`}XÄ‚[¬Dû—ë!í_v¬¨X‰ö/sVS¬Rû—B+VS¬Rûg,+VT¬¼ý뱬XM±ŽŸ+f9г±šb&ïÜnðbEÅÚliÿ²dõÅ¢ýË’5 Ö‘ÕkÈb«Š(Ž•(+*Öèµ¢å V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ¬¨X¢Q+QVS,X{±` Ö‡E,XÄ a×Y¹WÍììb¥§GxÔlÁN'V*=š@¼fGv6±òƲ|…ªZÍ–ìlbý:l,­Ù‘N¬ÃÆ2ÙšýØÙÄ:n,Ó¬Ù’M¬|òž7kÈÕìÈN'Öæëús•NÍ6ìÌbÕŸ«„jva§ 6ŽM¬Ë—p Ï c4X£W¡^ÄB¬ b…±+$ˆ…X!A,Ä b]$ÖttŒf ±`YÄ‚E,X±"Ù”¦ýÝôˆÅþV*½Ë:~^ÄŠbSÖX¦_s‹X½ØBcYšøiˆÕÍ˦~þbudweˆåV´$ËË+†Í&ïS?± ±"XžX†X1lšþ‰eˆ‹XÒ쀥VU4VˆÕM¬ÑkEËA,w± ±ˇE,ÄB,Äòa ±bÄÍ ±B,XÄ‚õa ±`}XÄŠc×¹³W͈%Ï>?LÅ£fÄRdSaí(+H­Š–d‹OC,«¢5ÙÂsÅ’zÍq,bud³çŠ!–WÑ’lÞþÅïnp+Z“Í'ïˆeV´y_/‹Æ=+*ÖfKû—%«/í_–¬X°Ž¬¦X–ZUEq¬DYQ±F¯-±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:ĪgEÅâX‰²šbÁÚ³ˆ‹X°>,bÁ:ˆ•ö+ä>0ì5lO±Raí”܆½†m+eë±Æ¿/b!b½ÄB¬XŠ5èÛà^ïÛ¶—Šeyãö±` Ö‡E,Ø+ÅJÒEÃê³¹Xë:vé¢aõÙåö]÷çnË ¶Y¬¼‰+q)„me—ï³Ôï?¬÷Ò ¶»|oÓý¡m·Káý†­jѰúìöR¸y& g,Ø€É;bÁ¶²ËÓKëÙK¾hX}öY¬ûK»hX}viaa_±Ëˆ%BCcxÙeŠe”› Ö5,b$G± ’#‹XÉ‘E,ƒƒäÈ"–ÁArd¹Ý`pÙűhX}±` Ö‡E,Ø ÅâwµÃv+ýY/\4¬>»V&ÎX°­l©ý‹K!l3»Ú¿ ¶™]¾·»ö/Ä‚mfËí_ˆ1yÿù‘šjѰúìòôí_°Øg±hÿ‚íÄ.-0,ì+v¾õX-1<À£ØéV¶±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:Īg¹Ýp&†x»8 «Ï",bÁú°ˆ‹X°>ìòEH@‹„±HH‹„±HH‹„±HH‹„dIéëë÷ëOï¿þü‰Æ,Ï6Ý¿Ä.Ò”Ûz¬¯‡H÷?biÉòÇ ´3 ¯HS–½HEzd)D,Ò%Ëþ[ÁÍ,ž·³»Ýðc“wÒ–W7HñŠ4…;ï$$ˆEB‚X$$±Rá«}Þ›xÅíùkó=†Õ¾ÿþ|‹µ¿Õ^;X•ÿ¿ =§Í½÷½Ýľ'ÈXéé¼r»ñóUúyåÏæçëZ¯‚ö¼?è}«Žß÷_žåñSÂûkë þè–ž†õùoë±çtÿ¡fTÕÁûþÛs¿îfB»aüúÚýW3Œe;íùQoľcëž$ïŠuæÄ³ççóUÿªC÷ý÷§ø]áÏ©=Oü_?ƒ\›+öìµï ò#VÚütð11Ýü+]_y gýä=lϾûž u7Hóë5£ˆÛ³ï¾ÿм+V¯Ÿq{öÝ÷_~¤CBòÎ/·ýaÿöÕßϽïi²üs:A<üÛßÿïé¤Cv»ïÿN'²Û}¿ñ‹ºYÄB¬Ûß#V{Þëž±î ëž±îA¬5œ±úˆuÈ"bÝþ±ÚƒXˆn7\»ïi RÄ"!A,Ä"!A,Ä"!A,’ÿÂ"7¡Ñb£ÒIEND®B`‚Bio-Graphics-2.39/t/data/t1/version13.png000444001750001750 1402612366325116 20121 0ustar00lsteinlstein000000000000‰PNG  IHDRXºÒ4ÒgXPLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿàÿÿÓÓÓ@àÐÿÿ¥ÿÿõÞ³ /ŒÒyIDATxœív£8EùÿŸJZ3³ù­í˜Ž‘Ì– ½×ºïìpÒ,nƒBTaùøÎç[Û_°°¯ØÅ±hX}¶,VÒ.Ú†M)ÙÕ܉ÍÅJ¿ÿ‡Xíìï1Ln5÷ë÷?«Ï§mâŒõû}zzÚ&ýšãØåöñÓÓ–Ká;l>Ži•L¸æP±Ö _ºb5°é6r›qÜŽ¤hÍqìò½½]þn/­DÄz}\þî—‰Åzüëºë…Xo°qüØl'«0y_'ºEk²Ùäýsò9Öæ¥Ÿ9–xÑòl>OÕ¯9T¬Ÿ9–xÑúìæ\eSs_viaa_±K"õ9Êѵ½Ê0±þ!µ9ktuå –A ±B‚XˆÄB¬ b…±ÎˆEês(–hF‰Õþb ±`}XÄ‚½R¬ª5–øBv;{Õ(Öºr[ºh 6m¶.5÷+íW~¯°•.Z“M…µ£3¯ -´-q)|ƒÍÇqr±òö/Äz‹ÍÚ¿Í)²5DZË÷v×þu¿a«Z´*»kÿš\¬Rûg¬ólÞþÅïnØOÞë6Ÿ¼O.Öæ%Ú¿ú°´ÑþÃ&Ú¿‹†Õgç[5У?׫ kôÇ‹'ÖèOVb]ÄB¬ b…±+$ˆ…X!A¬«Äš-ab‰f”X-0,ì+±` Ö‡E,X±Òþ§úrö¶§X©°IîÃ^Ã6‰•JÏ»B,ØF± O\ aW¶E¬_‡Ï»ýÀ°×°Mb>ïJôÃ^öˆuü¼+Ñ { Û"V>ygŽÛC¬Í×õç*ãÁ‚­g{‰U®2,Øz¶›X°°[¶E¬Që„z½oÛ~\â(Ö •½ÞWtÍgß b…d>±Òë}[öã’ùÄÿ¾ˆ…Xˆõn ±Bb)Ö oƒ{½oÛ~\b(–å;ØkXÄ‚E,X±`ç+=VOXôl¬‡XÏ«é-z6VT¬TZ•ŠXF¬¦X,bÁ"V»Îʽj6`g+==šÀ£f v:±RéÑâ5;²³‰•7–å+TÕj¶dgë×ac™hÍŽìtb6–ÉÖìÇÎ&Öqc™fÍ–ìlbå“÷¼YC®fGv:±6_ן«tj¶ag«þ\%T³ ;µX°qìlb]¾„kx£éĽ õê b…±+$ˆ…X!A,Ä b!VHë"±¦Ë c4›X°ˆëÌ",bÁú°ˆ‹X°>,bÁ"¬‹Xë]D¯š ØÙŢűú°‰ûKØÙĢűbXZì¯a§‹ûkØÙĢűbØlòN‹=bufi±G¬¶ú\%T³ ;µX°qìlb]¾ä|x£éÄúw² b…±+$ˆ…X!A,Ä b!VHë"±¦Ë c4›X°ˆëÌ"ìÜb¥ÇŒ-z6ÖC¬ç•é–=+*V*-ÄC,#VS¬R —B+VS¬ÏÃ^Ëžë°—Ær gc5Å:èÙXM± “wn7x±¢bm¶y/å@ÏÆê‹•÷ÒXôl¬X°Ž¬¦XCÖ—TDq¬DYQ±F/+±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:ĪgEÅâX‰²šbÁÚ³ˆ‹X°>¬X‰e3V¬‡Xt騱¢b%ºtÌYM±ŠÏºáRèÄjŠUêÒIW¼/l/VT¬¼K'`GÕ û`5Å*wé ,ØzVS¬|ò¾^z6VT¬Í–.KV_,ºt,Y±`YM±¬ˆ©ŠâX‰²¢b^ÒWbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏŠŠ%űe5Å‚µg ±`}ØÎb¥ýŒå>0ì5lO±Ra‰‹Ü†½†m+eËñ> öƶˆUè¥áR»²-býÊzi8cÁö+ë¥A,Øb?ñFôÃ^öˆ•OÞ™cÁökóuý¹Êx°`ëÙ^bÕŸ«Œ ¶ží&,ì–mkÔ”^ïÛ¶—8Š5hÑ\¯÷]NØ7ˆ…X!™O¬†ôzß–ý¸d>±Æ¿/b!b½ÄB¬XŠ5èÛà^ïÛ¶—Šeyãö±` Ö‡}!V’.Ú„]§8^5е.7–.Ú‚M›­KÍ}ÅJ7ž¶œ±Þ`SaÁã¼iY ½6‰Ká,ÏÿÙ‰õq›¬óÄj`yþÏ–]¾·é>·Káý¾šjѪìþù?s‹õ8yo‚3Öi6ïYšúÁRKiòŽXï°ùä}r±6/­ÿêä‹–gyþÏþ>Vª»ƒeü¯aÓ¾gÉ æ¾ìÒþb—kÖn%j G®W&Öè•h'N¬ÑŸ¬ĺ(ˆ…X!A,Ä b!VH ±B‚XW‰5[ÂÄÍ(±Z`XØW,bÁ"¬[‹ß|܇Mté<¶éÏbeá¢-Ø4ýz¬´_è—8c½Ã¦Ò“…ÄkŽcK]:\ ßa ÝNé±*K³æP±ò.Äz‹=|²hÍqìò½Ýué Ö›ìÁ“…dkŽbË]:ˆuž=~²fÍ¡b&ï?? P-Z“Í&ϱ6/Ñ¥Ó‡¥K‡.6Ñ¥ãX4¬>;ß²™– åèÚ^e˜X£W¢åX¬ÑÕ•ƒXA,Ä b!VH ±B‚XˆÄ:#©Ï¡X¢%V ûŠE,XÄ‚õa ±`}XÄ‚E,X¶,kÞa»‹E'4l±аbÑ À.tBÃF°Ë÷–NhØþbÑ À.tBÃF°ËÓKtBÃvbŸÅ¢¶»´À°°¯X–&Ÿ‰áÅ.é?RĪgëD«žE¬A¬z±N±êYÄ:ĪgëD«žåvÙàQìâX4¬>‹X°ˆëÃ"ì•bU­q°üÀ°×°¹Xë3¬¤‹†Õg— Òï•ÊÒEÃê³¥ö¯Ä¥¶•] í_ˆÛÌ.ßÛ]û×ý&³jѰúl¹ý‹3lÄä±`[Ùåé%Ú¿`;±ÏbÑþÛ‰]Z`XØWì|ë± ’#;Ý Rĺ†E,ƒƒäÈ"–ÁArdËà 9²ˆepYÄ28HŽ,· ’#»8 «Ï",bÁú°ˆë Ömr,ýa¯a{Š•x\ l±ÖóÓf‹X°ÄÊǸÂvëWZ»¦SÚé¥üa¯a›ÄZǺ¾Â¥v˶ˆõ8K}l¶ˆÛ}òÎ ¶‡X›¯ëÏUƃ[Ïö«þ\eÓ vTͰVS¬rcÙðÁ‚­g5ÅÊ'ïëeÑx gcEÅÚlóÆ2ËžÕ+o,³èÙX±`YM±,[ªŠâX‰²¢b^wYbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏŠŠ%űe5Å‚µg ±`}XÄ‚[¬Dû—ë!í_v¬¨X‰ö/sVS¬Rû—B+VS¬Rûg,+VT¬¼ý뱬XM±ŽŸ+f9г±šb&ïÜnðbEÅÚliÿ²dõÅ¢ýË’5 Ö‘ÕkÈb«Š(Ž•(+*Öèµ¢å V=‹X'‚Xõ,bbÕ³ˆu"ˆUÏ"Ö‰ V=‹X'‚Xõ¬¨X¢Q+QVS,X{±` Ö‡E,XÄ a×Y¹WÍììb¥§GxÔlÁN'V*=š@¼fGv6±òƲ|…ªZÍ–ìlbý:l,­Ù‘N¬ÃÆ2ÙšýØÙÄ:n,Ó¬Ù’M¬|òž7kÈÕìÈN'Öæëús•NÍ6ìÌbÕŸ«„jva§ 6ŽM¬Ë—p Ï c4X£W¡^ÄB¬ b…±+$ˆ…X!A,Ä b]$ÖttŒf ±`YÄ‚E,X±"Ù”¦ýÝôˆÅþV*½Ë:~^ÄŠbSÖX¦_s‹X½ØBcYšøiˆÕÍ˦~þbudweˆåV´$ËË+†Í&ïS?± ±"XžX†X1lšþ‰eˆ‹XÒ쀥VU4VˆÕM¬ÑkEËA,w± ±ˇE,ÄB,Äòa ±bÄÍ ±B,XÄ‚õa ±`}XÄŠc×¹³W͈%Ï>?LÅ£fÄRdSaí(+H­Š–d‹OC,«¢5ÙÂsÅ’zÍq,bud³çŠ!–WÑ’lÞþÅïnp+Z“Í'ïˆeV´y_/‹Æ=+*ÖfKû—%«/í_–¬X°Ž¬¦X–ZUEq¬DYQ±F¯-±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:ĪgEÅâX‰²šbÁÚ³ˆ‹X°>,bÁ:ˆ•ö+ä>0ì5lO±Raí”܆½†m+eë±Æ¿/b!b½ÄB¬XŠ5èÛà^ïÛ¶—Šeyãö±` Ö‡E,Ø+ÅJÒEÃê³¹Xë:vé¢aõÙåö]÷çnË ¶Y¬¼‰+q)„me—ï³Ôï?¬÷Ò ¶»|oÓý¡m·Káý†­jѰúìöR¸y& g,Ø€É;bÁ¶²ËÓKëÙK¾hX}öY¬ûK»hX}viaa_±Ëˆ%BCcxÙeŠe”› Ö5,b$G± ’#‹XÉ‘E,ƒƒäÈ"–ÁArd¹Ý`pÙűhX}±` Ö‡E,Ø ÅâwµÃv+ýY/\4¬>»V&ÎX°­l©ý‹K!l3»Ú¿ ¶™]¾·»ö/Ä‚mfËí_ˆ1yÿù‘šjѰúìòôí_°Øg±hÿ‚íÄ.-0,ì+v¾õX-1<À£ØéV¶±êYÄ:ĪgëD«žE¬A¬z±N±êYÄ:Īg¹Ýp&†x»8 «Ï",bÁú°ˆ‹X°>ìòEH@‹„±HH‹„±HH‹„±HH‹„dIéëë÷ëOï¿þü‰Æ,Ï6Ý¿Ä.Ò”Ûz¬¯‡H÷?biÉòÇ ´3 ¯HS–½HEzd)D,Ò%Ëþ[ÁÍ,ž·³»Ýðc“wÒ–W7HñŠ4…;ï$$ˆEB‚X$$±Rá«}Þ›xÅíùkó=†Õ¾ÿþ|‹µ¿Õ^;X•ÿ¿ =§Í½÷½Ýľ'ÈXéé¼r»ñóUúyåÏæçëZ¯‚ö¼?è}«Žß÷_žåñSÂûkë þè–ž†õùoë±çtÿ¡fTÕÁûþÛs¿îfB»aüúÚýW3Œe;íùQoľcëž$ïŠuæÄ³ççóUÿªC÷ý÷§ø]áÏ©=Oü_?ƒ\›+öìµï ò#VÚütð11Ýü+]_y gýä=lϾûž u7Hóë5£ˆÛ³ï¾ÿм+V¯Ÿq{öÝ÷_~¤CBòÎ/·ýaÿöÕßϽïi²üs:A<üÛßÿïé¤Cv»ïÿN'²Û}¿ñ‹ºYÄB¬Ûß#V{Þëž±î ëž±îA¬5œ±úˆuÈ"bÝþ±ÚƒXˆn7\»ïi RÄ"!A,Ä"!A,Ä"!A,’ÿÂ"7¡Ñb£ÒIEND®B`‚Bio-Graphics-2.39/t/data/t1/version9.png000444001750001750 1371312366325116 20050 0ustar00lsteinlstein000000000000‰PNG  IHDRX°s¯ñCPLTEÿÿÿÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ-ojCIDATxœíÑuã8E•À$±8šNb¿ýLœÄ¸Ýb[¢HH ˆ(â=×}gZÇmÏ¥Jàm¢PæåëO>Þzü ûŒ½8 «ÏÖÅ*ÚEÛ°¥»š±{±Êïÿë8û{ ‹[ÍcÅúýÏêãá±pÄz‡ýsxzx,ú5DZ—ëË/œ ßa÷ãXÉ„kk9ñ•ë( Ö¶\Gn5Žë‘­9Ž½Î±®§¿ë·–"b½ÇÞO·Sab±îÿºnz!Öì}¿V‰ÅªLÞ—ÉnÑšìnòþ‘|޵úÖ÷K¼hyv?OÕ¯9T¬ï9–xÑúìêXeSóX–t`cÄ*¤=¯†rvmÏ2M¬ÿÖ¼kvuõ –A ±B‚XˆÄB¬ b…±zÄ"íy)–hf‰u†…}Æ",bÁú°OÄjú(ÚòŸÈ.S¯šÅZØJmÁ–Õ£KÍcÅ*Û…~BJ­É–Ê¿Ì ý*Ý%œ ß`÷ã˜\¬}—b½Åîºtî=²5DZµ.Ûu5Õ¢UÙM—Nr±j]:±úÙ}—-öÛÉ;b½Ãî'ïÉÅZ}‹.1,]:téİ….Ç¢aõÙË)K7”5г_׳LköJ´“'ÖìWVbÄB¬ b…±+$ˆ…X!A¬³ÄÊ–0±D3K¬#0,ì3±` Ö‡,VÙ~ø*÷‚aÏaGŠU*ËEä^0ì9ì!±Jíî1ˆ{P¬J_ §BØ…=xÄúz~÷Ñ {{p޵éKA,Øb½¾{Œè †=‡;ygŽ;B¬Õ×íÇ*ãÁ‚mg‡]Çj>Vl;ËG:°rbÍZÎ1êymÇ%ŽbMZ€6êyE—æ b!VHò‰u £ž÷Èv\’O¬ùÏ‹Xˆ…Xï±+$–bMz<êymÇ%†bY^¸ƒ=‡E,XÄ‚õamÄ*÷¹-:ë!Öã¢gËÎÆŠŠUj‹ˈÕ«Òÿ“ù¾4ެ¦XÜ—Æžk_šÌwypd5Ū÷ÿL,ØvVS¬ýä}9-t6VT¬Õ#÷¥±dõÅâ¾4–¬X°Ž¬¦XV—4Eq¬DYQ±f/«±ÚYÄêbµ³ˆÕÄjg«#ˆÕÎ"VG«E¬Ž V;+*–hÇJ”Õ ÖžE,XÄ‚õamÄ*téX±bÑ¥cÇŠŠUèÒ1g5Ūuép*´b5ŪuépIJbEÅÚwé|!–«)Öë»ôXt6VS¬ÊäË ^¬¨X«Gºt,Y}±èÒ±d Ä‚ud5Åš²&¦!Šc%ÊŠŠ5{I_=ˆÕÎ"VG«E¬Ž V;‹XA¬v±:‚Xí,bu±ÚYQ±D£8V¢¬¦X°ö,bÁ"¬‹XËäÉ«f6»Xåá}{ÔlÁ¦«Ô~Ñ·xÍŽl6±öý?û…„j5[²ÙÄúõ²ÿG´fG6X/ûdköc³‰õºÿG³fK6›XûÉû~M½\ÍŽl:±V_·«tj¶a3‹Õ~¬ªÙ…M-l›M¬ÓWÚLϤ}”N¬Ù‹Ïb!VH ±B‚XˆÄB¬ b…±N+]&í£lbÁ"¬3‹X°ˆëÃ",bÁú°ˆµ¼'÷ªÙ€Í. «ˆ5†-4¬žÂf‹†UÄŠaiX=‡M' «ç°ÙÄ¢a±bØÝä†UÄÌÒ°ŠX1ló±J¨f6µX°ql6±N_À9=“öQ:±þMÄB¬ b…±+$ˆ…X!A,Ä b$VºLÚGÙÄ‚E,Xg±`s‹Uî[t6ÖC¬Ç•é–«Ôâ!–«)V­‹†S¡«)ÖÇË^ËÎÆŠŠõ²—Ær ³±šb½î¥±èl¬¦X•É;—¼XQ±Vû^ËÎÆê‹µï¥±èl¬X°Ž¬¦XSÖ—4Dq¬DYQ±f/«±ÚYÄêbµ³ˆÕÄjg«#ˆÕÎ"VG«E¬Ž V;+*–hÇJ”Õ ÖžE,XÄ‚õamÄ*,›±b=Ä¢KÇŽ«Ð¥cÎjŠU½× §B'VS¬Z—N9ãyaG±¢bí»tJ;«fØ;«)V½Kgú`Á¶³šbí'ïËiÑx ³±¢b­éÒ±dõÅ¢KÇ’5 Ö‘ÕkŠ˜¦(Ž•(+*Öì%}õ V;‹XA¬v±:‚Xí,bu±ÚYÄêbµ³ˆÕÄjgEÅâX‰²šbÁÚ³ˆ‹X°>ì`±Êöc¹ {;R¬RYâ"÷‚aÏa‰UvËñ¾ öÊ«ÒKéva±¾{i8bÁŽk×KƒX°Äz}ÇÑ {;vòÎ v„X«¯ÛUƃÛλŽÕ|¬2,Øv–t`åÄšµeÔóÛŽKÅš´hnÔóŠ.'ÄB¬äë@F=ï‘í¸$ŸXóŸ± ±Þ b!VH,Åšô6xÔóÛŽK Ų¼p{‹X°ˆëÃ>«HmÂ.S¯šÅZ–KmÁ–Õ£KÍcÅ*W9b½Á–ʂǼ·i¹Tzm §Â7ØJÏRn±¾®ó€e>€XXîÿ³f¯s¬r‚ë©ðv]MµhUvÓ³”\¬ûÁ{5±ºÙ}ÏRêKU'ïˆõ»Ÿ¼'kõ­å_|Ñòì¾gI¿æP±nG,í¢õÙ²íY2¨y,ËG:°1b²tC)Q=ûu=Ë4±f¯D;9qbÍ~eõ ÖIA,Ä b!VH ±B‚XˆÄ:K¬l K4³Ä:ÃÂ>c ±`}غXüæã1l¡KçþXþ.V.Ú‚-é×c•íB¿Âë¶Ôî,$^s[ëÒáTø[év*÷UYš5‡ŠµïÒA¬·Ø—w­9Ž­ué Ö›ì¦K'¹Xµ.Äêg÷]:ÉŪLÞ¿? P-Z“ÝMÞ?’ϱVߢKg K—]:1l¡KDZhX}örÆÊ“WC9»¶g™&Öì•hFy-ÖìêêA,ƒ b…±+$ˆ…X!A,Ä bõˆEÚóR,ÑÌë ûŒE,XÄ‚õa ±`}XÄ‚=Q,–&ˆUØ1bVaÄ¢a6€¥a6J,Vadz4¬Â‰EÃ*lKÃ*ì bѰ ;ˆå#ر&¬iôážÅ^Ê?¤5ˆÕÎ"VG«E¬Ž V;‹XA¬v±:‚Xí,bu±ÚÙËìwðV1ÜÁ³X.Â"¬‹X°ˆëÃ>«iƒå †=‡­¶}µ-ž±|Á°ç°µ¤V*K «ÏÖÚ¿ §BØ£l­ý ±`³µö¯ÛEfÕ¢aõÙzûG,؈É;bÁeiÿ‚=A,Ú¿`±|¤#Ö„UMsc¸“Ùt+Hë± v’#‹X;É‘E,ƒäÈ"–ÁNrdË`'9²—ÙïþOáNrd¹@ ‹X°>,bÁ"¬;X¬ëäXúÞΫp»Ø!b-ǧÕ#bÁkß8Æ©v€X¿ÊÒ5]ÊF/å {{pŽUnkä9®Ù1§Â¯Õ#bÁŸ¼3Ç‚!Öêëöc•ñ`Á¶³Ã®c5«Œ ¶å#X9±f­‹õ¼Ç¶ãG±&­äõ¼)Ï"b…$ŸX2êylÇ%ùÄšÿ¼ˆ…Xˆõn ±Bb)Ö¤·Á£ž÷Øv\b(–å…;ØsXÄ‚E,X±`s‹Uî«',:ë!ÖãjzËÎÆŠŠUj«RˈÕ«ÒXvý¦ñ@gc5ÅúØ5–­îóã9ÐÙXQ±ve¥ƒU3ìÕ«ÞX6}°`ÛYM±ö“÷å´h<ÐÙXQ±VûÆ2Ë뮐ܵo,³èl¬X°Ž¬¦X–-5Eq¬DYQ±f¯»¬±ÚYÄêbµ³ˆÕÄjg«#ˆÕÎ"VG«E¬Ž V;+*–hÇJ”Õ ÖžE,XÄ‚õa 6·X…ö/+ÖC,Ú¿ìXQ± í_欦Xµö/N…V¬¦Xµö/ŽXV¬¨Xûö¯/IJb5Åz}_1ËÎÆjŠU™¼s¹Á‹kõHû—%«/í_–¬X°Ž¬¦XS[5Dq¬DYQ±f¯­±ÚYÄêbµ³ˆÕÄjg«#ˆÕÎ"VG«E¬Ž V;+*–hÇJ”Õ ÖžE,XÄ‚õa ±BØeVîU³›]¬òpkš-Øtb•Ú­ Äkvd³‰µo,Û¯PU«Ù’Í&Ö¯—e¢5;²éÄzÙX&[³›M¬×eš5[²ÙÄÚOÞ÷Ír5;²éÄZ}Ý~¬Ò©Ù†Í,Vû±J¨f6µX°ql6±N_Â5=“öQ:±f¯B=;ˆ…X!A,Ä b!VH ±B‚XˆÄ:I¬t™´²‰‹X°Î,bÁ"¬‹X‘l)i7=bE±¿•*ﲎ¯±¢Ø²k,Ó¯9ŽE¬Ql¥±¬$¾›b cwe©ïÿƒXÙMcb¹-ÉrÇ2ÄŠaw“÷Ôw,C¬–;–!V [Òß± ±`Kš°Ôª)“Æ ±†‰5{­h=ˆåÎ"b!bù°ˆ…Xˆ…X>,b!VŒX¢™4Vˆ‹X°>,bÁ"¬‹Xqì2wöª±äÙÇ›©xÔŒXŠl©¬e©UÑ’lõŽbˆeU´&[¹¯XQ¯9ŽE¬ìî¾bˆåU´$»oÿâw7¸­Éî'ïˆeV´,bE²…ö/«¢-ØÂB?»¢5Ù²]AZôkŽck»oÿZ®")׌Xì®ýk½@Y´æ8±²›ö/Är+Z’Ý·!–[ÑšìnòþÁˬhy–ö/ÄŠa í_ŽEÃ곈5Š°Ôª)“Æ ±†‰5{­h=ˆåÎ"b!bù°ˆ…Xˆ…X>,b!VŒX¢™4Vˆ‹X°>,bÁ"¬‹XË ×«f6»Xå¡—Æ£f 6XeפU¶k§äjvd³‰UiÒúÚ®öT«Ù’Í&Ö¯Ê=º+€M'Vå]ˆÀfëu“–fÍ–l6±ö“÷}ãƒ\ÍŽl:±V_·«tj¶a3‹Õ~¬ªÙ…M-l›M¬Ó—CMϤ}”N¬Ù+:Ïb!VH ±B‚XˆÄB¬ b…±N+]&í£lbÁ"¬3‹X°ˆëÃÚˆUÿjkGÖC¬ä·qdEÅ*µžˆeÄjŠUkÏâThÅjе¿“ÖÇG,+VT¬—MZ–Õ‹;iÙ³šbq'-{VT¬Õ#wÒ²dõÅâNZ–¬X°Ž¬¦XS.5Dq¬DYQ±f¯»¬±ÚYÄêbµ³ˆÕÄjg«#ˆÕÎ"VG«E¬Ž V;+*–hÇJ”Õ ÖžE,XÄ‚õa 6·X…õXV¬‡X´Ù±¢bÚ¿ÌYM±ªwçâTèÄjŠUkÿ*gVl;ËG:°rbÍZÛ4êymÇ%ŽbMZ9êyE×©Ž b!VHò‰u £ž÷Èv\’O¬ùÏ‹Xˆ…Xï±+$–bMz<êymÇ%†bY^¸ƒ=‡E,XÄ‚õa öL±ŠtѰúì^¬e»tѰúìåú®ûcóÈ ö°Xû&®Â©ö({=býþËr- ±`±×9V¹Ý´íz*¼]°U-VŸ]Ÿ W÷äˆ0yG,Ø£ìãå†åè%_4¬>»¹ŽUÚ®`¿`ØsX>Òk ¡¹1ÜIŽì%Å2ÊUë± v’#‹X;É‘E,ƒäÈ"–ÁNrdË`'9²—ÙïþOáNrd¹@ ‹X°>,bÁ"¬[‹ßÕ;\¬òw¼pѰúlmiáˆ{”­µq*„=ÌÖÚ¿ ö0[kÿB,ØÃl½ý ±`#&ïß©© «ÏÒþ{‚X´ÁbùH6F¬ +¢|c¸ƒg±éV bµ³ˆÕÄjg«#ˆÕÎ"VG«E¬Ž V;‹XA¬vö2û¼U wð,– ¤°ˆëÃ",bÁú°—OB‚X$$ˆEB‚X$$ˆEB‚X$$ˆEB‚X$$—R>?ÿY>dýüû7BæòhÓíKì"‡r¹¨î"ÝþŠYäH. *£ðŠÊe+F‘Ùž ‹ ÉeûVp5‹'äíl.7|Åä˳ ¤xE…+ï$$ˆEB‚X$$w±Jå«mÞ›xÅmùsõÃjÛ??ÄÚ^jo¬Æÿ/hËeõgô¶×ÛØv‚|‹UŽ+×kß_•ïïü}øþºÕ« -owúتã·ýÃs¹JxûÞ2ˆßº•‡a}üi["¶\njFU¼íŸžÛ©p3Ú ãççæOË0V”´å{½ÛŽ­;IÞ«çÀ³åÇãÕøªC·ýós¹}U9a•êÿó{[sÆ–½¶ ßb•Õ§ƒ÷‰éê_éòûp¶OÞöì»í¹üÿÿå³6w5£ˆÛ²ï¶DÞkԿϸ-ûnûG¤M,B:séÿEœ·—¯úìç¹·&—ÿtç>ˆ/úûçÿv§¼d×Ûþ§;å%»Þö¿Où%‹Xˆuý9bÏ;bÝ Ö-bÝ Ö-ˆµ„#Ö±^²ˆ…Xן#Öñ b…äøÖúMÿøm§ HIH‹„±HH‹„±HH‹„±HHþ[[Û@þÞ7 IEND®B`‚Bio-Graphics-2.39/t/data/t1/version6.png000444001750001750 1230112366325116 20035 0ustar00lsteinlstein000000000000‰PNG  IHDRXLÿ(cªPLTEÿÿÿ{hîðÿð€‹î‚îAiáÿcG@àÐp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿ØõÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2ÌÿÒiÜÜÜÿÿàô¤`ðæŒ‹‹ÎÑÿÿÿõî/OO¼wˆ™fͪ˜û˜šÍ2”ÓææúÿÿF‚´d•íÿïÕîÿ‡Îú¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀºUÓÞ¸‡ÿÚ¹î誼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõȸó·ÒIDATxœí[zã8FYýž`½ƒ,evÐû›²iK²Eû£Ä áü39J' F¢d›ŒÒoú›; ìÆÇÖB)ðJD,8S,1QœŠDídA,ùûÿ¨íèÉ¿=ítÅúûÏê7m)ŒXgxž^(ªRbÊÿ¬$mÉ©ð ÷}”,™Úæó¶½ŸøäÞÄj Ü;·écäNæ­üÞ›ðûžÆº|k¥vmŸ¢&Ö?¤6ßÅÒ®®ÄrÄB¬!A,ÄÄB¬!A,ÄÄ:"©ÏW±ŒFK¬_Ãk± bA?D,8U,±Pœwækg •ÌgA,¹}ˆ…â|S6´PÏ|±ä}¢ßm"¤…âœQ SüD½*%¦Ò*áTx‚û>þÆk¿J±Nq·Jg]Cy+¯«t–lM”èˆòºJ'¸X·ÿ¾J‡ë8×>®zéW¥Å»M»‹wÄ:ÃýÅ{p±6_ºuB ”å¹*Ñâ›X¬ÒéDa•Μ¹†2ª•ÚëSfh´§ÙùiÃ2N,íGVbM bM¡Ù~ bM¡Ù~ bM¡Ù~ bM¡Ù~ bM¡ÝgÉÃ2ª•ÚëSfh´çc;ÿÀðÚD,ˆXÐ ºK¢¿ù 3»ŠûWæÃ-ÛÄ’ÒÝc .Ûs?œ5Ú’S!Ìl‹»ÇÀOl‹»ÇÀl+k$Ë爻ˆÅÝcà'¶‰µ¡$Æ*¸²›XŒUpË&±´¦sô:nÛ~¼¤U‘slKiZ¯ãš×7ˆ5ÿ¸ˆ5ŽŠb5¤×q[öã%ñÄÒ?.b#b]=ˆ5ÿ¸ˆ5Žmb)= îuܶýxI«"çØ$„ŸˆX± " .–ð&·':‹IÏÞhU,)MD,?4*–¤ý}i8z¢Q±J÷¥aÄòD«bîKƒXžhT,I¬ÿñM£b±þÇ;­Šµ¡$Æ*t c•GKe~IEô;ã…VÅÒžWbU±Ž±ª‰XG‚XÕD¬#A¬j"Ö‘ V5ëH«šVÅ2ýÎx¡Q± w"D,臈ƒ‹%¼í‰NÄb•Ž7ZKX¥ã›FÅ’´_¥“D»*XO£b•Véˆ~U°šVÅÚ¯ÒUÁJKRi•ŽvU°žFÅ*Übó~Z4Q¬ U±6”ÄóAt /z¤Q±fÄTE¿3^hU,í)}å V5ëH«šˆu$ˆUMÄ:Ī&b bU±Ž±ªiU,£ÑïŒ z'bAÄ‚~ˆX±Æ0_•[¨äJ /–0…±ºPJSÕ«ºÉ%é}ýO¦…Ú®Äpbq—ž9Œ'wé™ÂpbIâ.=3N,îÒ3‡ñÄÚPcÕ(†‹±jÉ5}¦ztúO,íÉ‚³ƒXsˆXsˆXWbÍ!bÍ!b]=ˆ5‡ˆ5‡ñÄ >‡ Î!bAÄ‚~ˆX± "D,臈k ó«ˆ*¹ËÅJhÄêCa%ô †K+¡g0œX¬„žÃxb±z É%‰•Ð3N,VBÏa<±6”ÄX5Š¡Åb¬ÇpbMŸ¬>Çë¿`A¬9D¬9D¬«±æ±æ±®ÄšCÄšÃxb…‹NŸÃ‰ç± bA?D,\,á cOt"3ӽѪXRšˆ‡X~hT,I…U4¢]¬§Q±JkiD¿*XM«bí×Òˆ‰ª`%Š%©´–F»*XO£b•Âsñî‡VÅÚPÏýÑX¼4ê‘FÅR˜]RýÎx¡U±´§Ç•ƒXÕD¬#A¬j"Ö‘ V5ëH«šˆu$ˆUMÄ:ΦU±ŒF¿3^hT,èˆ ú!bÁàb oE{¢±X¥ãVÅVéø¦Q±$íWép*ôD£bqÇï´*w¼qN£bIâŽ7¾iT,îxãVÅÚPc•?:‹±Ê#Š¥2'¦"úñB«biOé+±ª‰XG‚XÕD¬#A¬j"Ö‘ V5ëH«šˆu$ˆUM«b~g¼Ð¨XÐ; "ôCÄ‚.ÄÞ0†iÝöÙki`±d÷K³bÁ´nÏýpÖhKN…0³I¬ýZš‡^ª Z`›X»µ4ˆ3›ÄÊÉò9bÁ.b±–~b›XJb¬‚+»‰ÅX·lKk J¯ã¶íÇKZ9Ç6±”&Íõ:®Ñé„}ƒXó‹Xã¨(VCz·e?^O,ýã"Ö8"ÖÕƒXó‹XãØ&–ÒÓà^ÇmÛ—´*rŽMbAø‰ˆ ú!bÁ©b‰…â¼3_;[¨d> bÉíC,ç›±ozpÛÊ]£2b &<ŠzUJ¼õ ½¯µN…'¸ïãol±’ä[ ‰ V ÷ÿýª”˜·²´à~*\^°5Q¢#ÊûýB‹u{ðòhÁÒ±Pœ/®}\õÒ¯J‹w›vïˆu†û‹÷àbm¾të„(Ë;s-T¢Å7±–ËDqŽ)Ñ×,E™;²É¨Vj?®O™¡ÑžAf»m2N,íGVbM bM¡Ù~ bM¡Ù~ bM¡Ù~ bM¡Ù~ bM¡ÝgÉÃ2ª•ÚëSfh´çc;ÿÀðÚD,ˆXÐ Î+ö;óý(¬ÒY))…mGOJøùXò>ÑO±ÎPJwR¯J‰©´J‡Sáîû˜_E²PÛ|Þ¶»U:ˆuŠÜYhü•×U:qÛÑHáÎB±òÃÏb=ô ÛŽ®}LFíäݦÝÅûó-&%ºáîâ=òÌ÷Çöù¥›N(ÕÎÜG •hñM,Vétbà±*Óîl“ùÖJíÚ>EM,í™hŽò],íêÊA,A,ÄÄB¬!A,ÄÄB¬!A¬#b‘ú|Ëh´ÄúÕ90¼6 "ôCÄ‚ˆý± bA?D,8S¬Ø³ûQÂ.ý-ˆ%¬„îBVB +¡»PX ½2±º÷}ÌïÔY¨m>o[VB÷!+¡7Ì[a%t +¡7b凟Åzè¶-\ûÈJè¼Ý_¼?§ñ˜(Ñ wï‘W>¶Ï/ÝtB©væ>Z¨D‹ob±ºU™vgԚ̷Vj×ö)jbýKjó],íêÊA,A,ÄÄB¬!A,ÄÄB¬!A¬#b‘ú|Ëh´ÄúÕ90¼6 "ôCÄ‚SÅ Åyg¾v¶PÉ|Ä’Û‡X(Î7eC õÌKÞ'úÝ&BZ(Î¥0ÅOÔ«Rb*­ÒN…'¸ïãol±ö«tëw«tÖ5ñ˜·òºJgyÁÖD‰Ž(¯«t‚‹u{ðï«t±Žsí㪗~UZ¼Û´»xG¬3Ü_¼kó¥['Ä@YÞ™ûh¡-¾‰Å*NVéÌ™»a(£Z©ý¸>e†F{šŸ6,ãÄÒ~då Ö¤ Öšíǰ Öšíǰ Öšíǰ Öšíǰ ÖÚ}–<,£Z©ý¸>e†F{>¶ó ¯MÄ‚ˆý±  ±$ú›¯0³«X±e>ܲM,)Ý=±à²=÷ÃY£-9ÂÌ&±¸{ üÄ6±¸{ üÀ&±²F²|ŽX°‹XÜ=~b›XJb¬‚+»‰ÅX·lKk:G¯ã¶íÇKZ9Ç6±”& õ:®Ñ©y}ƒXó‹Xã¨(VCz·e?^O,ýã"Ö8"ÖÕƒXó‹XãØ&–ÒÓà^ÇmÛ—´*rŽMbAø‰ˆ ú!bÁàb or{¢±˜ôìVÅ’ÒäAÄòC£bIÚß—†S¡'«t_F,O´*Vá¾4ˆå‰FÅ’Äúß4*ë¼ÓªXJb¬òGb1Vy¤Q±Tæ—TD¿3^hU,íéqå V5ëH«šˆu$ˆUMÄ:Ī&b bU±Ž±ªiU,£ÑïŒ z'bAÄ‚~ˆX0¸XÂ[ÑžèD,Véx£U±„U:¾iT,IûU:I´«‚õ4*Vi•ŽèW«iU¬ý*1Q¬¤Q±$•VéhWëiT¬Â-6ï§EµÁ ZkCI<ôGbñÒ¨GKaFLUô;ã…VÅÒžÒWbU±Ž±ª‰XG‚XÕD¬#A¬j"Ö‘ V5ëH«šVÅ2ýÎx¡Q± w"D,臈k óU¹…J®Äðb S« ¥4…P½ªË1œX’Þ×ÿdZ¨íJ 'wé™Ãxbq—ž) '–$îÒ3ƒáÄâ.=sO¬ %1Vbh±«Æ1œXÓgÚ¨G§ÏñÄÒž,8;ˆ5‡ˆ5‡ˆuõ Ö"Ö"ÖÕƒXsˆXsO¬pÑés8±à"D,臈 ú!bAÄ‚~ˆX±Æ0¿Šh¡’+1¼X¬„F¬>VBÏ`8±$±zÉÅJè9Œ'+¡§0œX’X =ƒáÄb%ôÆkCIŒU£Z,ƪq 'Öô™ÁêÑés<±þ,ˆ5‡ˆ5‡ˆuõ Ö"Ö"ÖÕƒXsˆXsO¬pÑés8±à"D,臈ƒ‹%¼aì‰NÄbfº7ZKJñËŠ%©°ŠF´«‚õ4*Vi-èW«iU¬ýZ1Q¬¤Q±$•ÖÒhWëiT¬òBx.ÞýЪXJâù ?:‹—F=Ò¨X ³Kª¢ß/´*–öô¸r«šˆu$ˆUMÄ:Ī&b bU±Ž±ª‰XG‚XÕ´*–ÑèwÆ Š½± bA?D,\,á­hOt"«t¼ÑªXÂ*ß4*–¤ý*N…žhT,îxãVÅâŽ7ÎiT,IÜñÆ7ŠÅo¼ÓªXJb¬òGb1Vy¤Q±TæÄTD¿3^hU,í)}å V5ëH«šˆu$ˆUMÄ:Ī&b bU±Ž±ªiU,£ÑïŒ z'bAÄ‚~ˆXÐ…XÂÆ0­Û>»c- ì#–ì~ivB,˜Öí¹ÎmÉ©f6‰µ_KóÐKõ!A lk·–±`f“XY#Y>G,ØE,ÖÒÀOlkCIŒUpe7±«à–MbiMAéuܶýxI«"çØ&–Ò¤¹^Ç5:°okþqkÅjH¯ã¶ìÇK≥\ÄGĺzkþqkÛÄRzÜë¸mûñ’VEαI,?± bA?D,8U,±Pœwækg •ÌgA,¹}ˆ…â|3öMn[¹kôBF¬”„GQ¯J‰·¤÷µ6©ð÷}ü-V’| $Äjbáþ?¢_•óV–ÜO…Ë ¶&JtDy¿ÿOh±n^-X!Šóŵ«^úUiñnÓîâ±Îpñ\¬Í—neygJ´ø&Ö2b™(Î1%úš¥(sG6ÕJíÇõ)34Ú3Èl·MƉ¥ýÈÊA¬IA¬)4ÛaA¬)4ÛaA¬)4ÛaA¬)4ÛaA¬)´û,yXFµRûq}Ê ö|lç^›ˆ ú!bÁ™bÅ~g¾…U:+%¥°íèI ?KÞ'ú #ÖJéÎBêU)1•Vép*<Ã}ó«Hj›ÏÛv·J±N‘; m˜·òºJ'n;)ÜYh#V~øY¬‡^aÛѵiè¼Û´»x¾Åd¢D7Ü]¼GžùþØ>¿tÓ ¥Ú™ûh¡-¾‰Å*N jYP¶Óž=¶ê89+Ö‘¡Èž_Ç«‘EwßuˆŸ>w)ý?Ï6×fØž·ÔÏ®cä)ÖrÑòóó³^šnþ毬 ­¿x¶g§»Ž‘ºH÷=ëuM1nÏNw}•œ«×¿Ðq{vºë«äÌïd}þì÷ï~ú~à]GJ’Žfíã×ïþýþG#_t»ëF¾þèv×Çãõ×E,ÄÊßG¬9#Ö’þb-é/Ö’þb-A¬%ŒXÄúú£ˆ…XùûˆÕ#ˆ…XCÂË w)LM&C‚XdH‹ b‘!A,2$ÿ˜Úr…'‘~DIEND®B`‚Bio-Graphics-2.39/t/data/t1/version2.gif000444001750001750 2216512366325116 20023 0ustar00lsteinlstein000000000000GIF87aXLçÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõ,XLþ—@ Á‚4Há@‡ &„Hq¢Å…%bܨ±ãÃŒ9†ôq¤É’(+ŠL ’åJ•$až”é2fKš8oê|¹Ó&ÏŸ>ƒÎì9hQ¡5*MÊbÉœF›•*R«K±R½:U«×®`«†å*¶,Ù³YǦ5»íÖ¶p™>Uû¶îW¶véÞu»7nß¼xÿ ÖK8pa¾‡ý&Œxå\ -+6L¹±åÉ—%k\óР7/朙´gÑQ‹¤@hÓªOÞ=ºvjÚ·G^ÒZ¶íÒ¿}çܱ@Ð- "Wú¸ëØÐqŸ.œzôà›‘?Ô^{ïêà¯þ/<Ýî#÷VŸ¾}yñÖßËÇ>¼æõϲ×ïš{ýøôhß§!ôZÚáÇð™7 €>(áU¡é‡Ü~ÏáÇà†:á‡KE”\~ -ç^‡ ¦Èá„¶¨"$nW¡†(®â‹,â¸~½97Òn5™£.©ãI<&ô‰@)äFFyÞqÍY8"‚Trå“Eryä—Qú'f…¼‘饔N¦¹%^I¤àšpv©¦œq‚IsÚ™'šujÕfH&îyæ ‚Ú'}þz¨¡t6Z‚F*餔Vj饘fªé¦œvêé§ †*ꨤ^˜Z©¨¦ªêª2ª§[þ®A 무Öjë­¸æªë®¼öêë¯À+ì°Äkì±Ç~÷W È6ëì³Ð«¬¢ŽúÉl´Øf«í¶Üvëí·L‹×µà–kn¶â.ªnˆäžëî»ðÆ+o·éÆÕî¼øæ+k½¯V;U¬ú,ðÀƒË¯V÷¬0·SÛ/J/,ñÄW¼ï©gÜlîò™žÆ ‡,ò·#•ðÈ(ßZ²¿')«0Ç,óÌ4×lóª§Þ¬óÎ3·ì3I>ì±ÐmtÑHÿÌòºr9t´ÒDCý4ÓS/muÔT»ìtÒYKÍõÕUc ö×btØh“¶×lwíöØm{„Õ•o—½vÝwŸ©þÝj÷7Ä[¯´Ýpãí·áïÕäsyó8ÙV‰¥•Ê¹Öøå‡®ywdŽÙZåŽ#.úæ4¡Ç_’§ë‡ùã¬þ%Ꞙßê®Óîhä‘'Ø^k„‡Nzæ¾_fz¦ÒØ#ð¶ 賂>–XåÞ­ÿ½ò…ò>Q¢ÇOŸüö‹™ûGÙ«ŽüøÚ“oì06´2õµ›ïbîÌ]¨øå×ß¾ý~y.ãçës?ûq9“ÜÀú¯NxºŸ¥W7Nîd …–(0‚šyÏ6ÈÁz0TÜGHBK…ðFK™ W˜¬"‰…0œUÿ.ؽ“Åð†8¤Õ §gÃjl‡þ „N }HÄq‚éa)vDÖp‰P„a§Ä(*lŠ4dS­ÈÅ…año[ìbÀ¾Ä¿ QŒhô¢ QÆ4΋ŒH¬a çHÇ:ÞlI´£;ˆGì8°ŒYd)ÈBnîq$d" éDE62ˆˆ|ä"')ÉJbð’”[&-¹IL:Ò“ŒdP$ÑVÁPvò”ŸD¥)í3J®ahq”e,U9ËTºª•CÒ笷 ZrÒ–« f-Q8¦Áî•»¦2)Lf.³q¸„R…^6À>Ó—²t¦6³ ›hʉ—ꛑìšÉMlš˜×4ÔУ–Û<'9å©ÉŽé²Lüþ3<ß9Ï}Ò³€Þ|˜5ãéÏ‚öó Ë h˜ô‰P‚6”Ÿé|hKŠ=Nj…’2ÊÑŽîÑ ,æÕÚ(/8B‡¤ñâJÝÈÒh™¢&ÚJßõÒÅÌÔ]*m©NÏUSGRÔ>7åiG™x©•d }”HÊÄu6•$A=ªT{ÕÓ†þô|OÝ\T˕өzZUèI®ž­Ì©ëêW×ÚB‰¦†¬'õhXï#WÊõ®xÝ`Rý´T˜úõŸÝ+`ýØ×Á ö°nM¬X…XXÄ.6°ŠuècWÈNÖ±’ͬe3ØØÈ’’¡—õ¬aE µÊŽ–NÈܬjO«YÊv6´`»þg)aÙZֶ̮SÂmŽŽéÎþÀ¶¶¤ îM«Û˜Lso ¤ím… Ü߉¸Ì½ 8÷÷£æZw¹Î…Ük¯‹"v.i Øånq³ûÖí†w6²íhÅ]Öž·{æu¯—À+ßñ²—¼Ö.~‹TÊýÞ÷¿ïÍ‘~<•¼xTö p3¬à²µ¤ ®¯UãᨘõÁmõoƒÿË` /åÂ.Ö\7LâåQ¸½ 1M+ŒâŸXÃUñŠ[ ã¤vؾ –q°FìaÿíÆ4fã‡ì)×xÂFöqKœäç¾XÉGŽ2”§ŒA K™ÉKî1–Ãce*kùËMsfº¼å¦ô×ËaN3þ#É,涤¶ÍhÎ2fÙlÛô~nœW†s™ÃKç óOwVsž­Í>:œÄÓ]/ÃwèFÇÙÑNyòžw2Ýdzïјž4< =eï*IÏ &4L9}^;[é@¢µœ]œj â9Óª†tIkKkzÕ²¶±¤kÍ"ûZS­ÆuðhÔëøW<v®Ç¼kBûØTU6¬KÛla³Ú\•ö­¯Flæ>ÛºJ¶µyMXmÜH·¹oYíeÝÞ·»§MÌu›ì×ø6¡º÷MÉnÏ{Ûôþ7kýð‚üà›$8Âí-p†›­Ý'·ÃÎj~G|\¦¢xÙ«p‰C9¦þ;>ñ3™R"×8‡!®òlþyw¯n¹ÇKr‹_î¸Å§rg~ñÈÖ<åä«4>«+ó’Oïç=Ÿ §B_£Ûœ€H/:ÕN>ô¤[}³Qçyòšþt§'”åZ×ò™¥tŸ‚ÝëÌ·Ú׎`‹gíïù6¼*ïBŸ½ë •ûÜuZ÷*ß½ìyß»àkÕ÷„ÿýê¾ÔûàÓXøÿ½ïZ]üâ¿æÃ“½’Š—|)ÿu¸³–í =°Ýnù°{þôg,êÏzÄ›}õ®Oýå“÷øÖÏÞô²/wîa{Þ£¨ö±·=î…/àÒûþø»OþX¯üà;¿÷u>ôµšñá?ß—Ò·þÝ@þ~}ä’ùÄåÉMÕýæûÝû™}yêz‰þé?¼ýØÄ¹¢síÛßñà/-…>[ýûŸöùç~a³tíÁ~æw•xDuc‡€á×y˜d\÷€ÿuè€ÛÔ€ Ñwè"¢‚"¨Q—}È-` *¸‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃1Èy•d‚‚>X„Fx„H˜„J¸„Lè‚@€'ˆA)Ø„TX…Vx…X˜…–ð„…›4…Z†b8†d¨…\xt8„Á†e؆nø†pHƒgIiHT‡x˜‡zH†sØouX5‚‚zI&„vˆþˆ†ˆj˜ˆ…ø‡ŽØˆˆ8‰ê$‰^x‰j¸ˆª¥–؉‡X‰Ÿ8o†‰¡HšØITW¤Èˆ"wŠÿ£~ô7;”艬Ø4¼'¡a<´‰¥h‹»xü×9«È‹V犌D€éӋĸŒZs‹ê•O¼S}Ã8‹­gŒ¿5µÈŒgšÅ‰ÊHÙ8QØcƒèkÓ(mܸu{¸Žn؇á8gãXlì8cèŽÚÈqñèmô¸Yhà¸aéH@lȹ„þxŽ ø‹LW iiŠù(eÙɃ©ø{åHdé|Ù‘÷ø?‘"™zi’%y’þ•’,¹’09þj$¹gÞ“ÿ¨ˆ3©j£¨’!é‘9¹O©h€/Ù“—ç’isëGëE”7‰Ž?éY¸¸“;’MdF¹:Áh±È“UÙ‹W <ÈØ[T9– 9”×óŒÔek]i“Ûø”ކLI–-é–TV“qÉ•¨‘y`rYŒt SY‘‚yƒi–º¦‘ƒ™˜9X˜lésùO©˜’é„} p_ F“™™?X™Ù3?"‹´÷GªÚ±hŠªž ¬:ë|ôiµN;’²*9&B‚W;{ûI¨aÛ…6Á«e«‘Zû±?;¬’#µlz¬»f [·v{Q™q· ®Û·ÒjRþê·öª®‚[¸0 ¸†K®„›¸ŒšˆÛ¸Xh°Ñ¸[¹{ø¸–K…’{;”›¹žÛ®yû¹M¸¹fÓ¹¢{ºfx*¨«„¤+Jzûºu›3°«¥ ·6˶A˜¦¶»»sËeºÛ»iË»œu»Ä+¼mZ¼À»µ®ƒ±Ê›¼¸[:¿¼Î«¦Ìû¼Öþ Ÿ!+½çY²×Ë©(h!Ú{,k¼†×µòó<[9½X³ä‹8›¾ák}<+·ñËn¾´4´Ý«ŒF‹”ðÛ¼Å#²´oÛ´ûÛ}P»¶ÈËXT>¼À€é¿É(–íK‡æ ³` À-7¶êÛ¶»Z€ü›QÛÁüĪÁ¬I¿(\Z³ÛÂÊ*».ÌAÐÊ4\Ã6|Ã8œÃ:¼Ã<ÜÃ>üÃ@ÄB<ÄD\ÄF|ÄHœÄI ¸JÜÄNüÄPlÄ­û{-ÅV|ÅXœÅZ¼Å\ÜÅ4ÌÄ^ÆbŒÅS,`U<ÆhœÆj¼ÆlÜÅ`ÜÆpÇ6\Æ(tÆr|ÇxœÇzìÆ§²Ç~Æþtü>vüÇ„\Ȇ|È<ðÆˆ¼ÈHÈ)âŒÉ’<É|œ·”|É?ìÈï°1ÜÉ!Þ¬3[ºÂ!\¿Ë½¤L©Œ›|À«,J¨ìʲL½núÊŒ*¥Œ¦uj!¶ìt‹óÀ¹,¥³êµ^[«Á,jƒªÊ†Ç³ôs̩ר Ó˧|¿Ô”¨Òl{ý»hÎì‡é‘ª1K~Ûìz¤êÍ­\| 쫪ÌÎ&Áíôªá¬ËÃ|¾„“Φœr¸úÎÀ#@h{Íþ7Âõì²&ü¶êÌ“*<ËËÊ * ›Ðw®˜üÐíÄš¬$]Ñ5<Ѭ4ȽÑà ÑÍeÒ&mÑ# þÉ'MÉ)ÝM%½Ò0ÍÒ§Ó’ÜÒ5DÓ8-Óy—Ó‹lÓoõÒ<Ô{œÒ@-ÔxìÓcÆÐJ=z׸Ô53Ê=ÐR»åŒÏU]OVÕS ËWýÏülF±¼#ü©Õ^ ŽÎIÁ[Õuì ÌiÝÕe6Ÿþ›Z ×j×úIž“š”n]Öv l“Àúû×d ÛÉÎߥÀ…}×f×И–U÷ÕŒ~ªØo½Øm©=uٜ݊ êQUú¬PåÔ Õ®RÔw|¡†¬RFÝÚkŒÔê¹N«-Û…ÌÚ®}Ûb ÛÃë «ÝQ½m)¸Ü•ìÙ´MȪ]Û‚#ÜÊź ÖÅýÇÇmÜÉþ½ÜÔ ÅÍͱZ5Û¼ÜPUÝÞÝÄ×Í&ŸM¥Ú EÚmÚí×ëÍW„}Ùð½Ûñ-Ùïí‹ó=Ùíý{a •c}ßõíÞkžô߬´ßÏ”ÿ‹ßþ­«* ;ÅÞ N£­×R áޤ£:Á‘mÙ®àï×àˆýiƒMà$RÎøØ¶¶ÙÞáåu‚þ<à+¾ÉÞýÍâ%®z ŽÞ2óߨ7ã[÷ÝmÞ7^½Ï äh,ä1.Žiä¯Íã'ëãÉäjŒä6¾|K.åGîäÞKŒ¨åd¬åœã:3`nweãNä7Žæx}æÎæÍ¸æo>ç>Œ*^åxàs+àþt.çu>á(¾á#žän\>×bI¶p^諑ž©~é&žáí,&ŒNèH¡æZâL×ç˜.áÃ9~¸üéy®{¾úâž^ên¬5¾è’®Tz9æ¬réTÝà^>ÆTîêXý’]~ëQœë©½WîëíêiëÄ^캾rÞìZ ì-«éeÓëήÄоÞÒ.S²>ë¯.“´¾ìœíÁ>îNùíäÎânîêÞë®7£nì^ ådÉ}àÞØíž¢Þêçï÷žDˆ~´û“éN³ž\ð^‹o˜ãÌáõ®Þ¤wœÂ}Ýðµûð5ÂÁï~ _œ¨Þï†*ïÆ{çOÜÝnþSÛ®ãŸñ6Uí,¿Ã×" ê-?ó7üòö­ò@Eó:ŸÈ)?ò÷±ó4oóÂ^ò} ô-/ôJNô–lô,ô ˆóçsòèÝóïóh¾ñV_õ³óPoñTïñ`_ñ]?öüŒõZöܬô^OÖföd/¥jÿ:ïžõ„Öö´IïgO‹vÏ¿hii=›÷/¹÷ýüïˆN÷Í'øb[ð:÷öå÷œ±ðƒÎøboøzñí)ù_êøzñ”ï“nÏ øž¯ù"ò¢o™\OœR?õ“úU°û²?û´_û¶û¸Ÿûº¿û¼ßû¾ÿûÀüÂ?ü·ïô@“úeÚÄ¿üÌßüÎþÿüÐýÒOûÆoå¤o®ÓŸýÚ¿ýÜßýÞûÕ8n¯üß_þæþè_þáiãŸþîÿþðÿ½¿þq¾ö (ÿøŸÿúþôoè®TÑBà@‚ D˜PáB† >„QâDŠÀ`IFŒ9z̲#G$E–ühReJ–!Wºl92¦Lš5QÂÄióäΗ:{Þô9“§ÐŸCsEj4èQ¥I‹>%•)Ô©R—^uj5kU®X›~¥ê5ìV±ZÁš{ö(Pµe»’…Û6nZºhí¾•›·.Þ½nýνûWo`À| 6œXpßÂ9/>ÌøqcÊ“-KÆY³âÊ™9_þÞ ù³gÑ¥;keKúôèЫMƒfûµjس[×v÷nÚ½[§¾í[¶ná^ÚÎ;øòäʼn3GýysèHSÇ.]9öºcì¾]»sñÓÇW/Ÿžüzô?¯ŸÏn^þ×ãë/¹Ÿ1<ûøêÛÿï?øœOÀÜÞ+@qûÎ;Á{ÐA¾ó/@´0à ¬pà OB°C =üL ýŠp¿Ed‘C?|QÃgl5‘j”Dz¾k°£ûzÔ‘ÆI$RHÌqÈš‚dRÉ»ë1B‘,²I*LòJ+³.D%·\ðGí³ ,«ü2M-ÕäÍ5gòòÍ6Ï„þëI:Á¼“M7çijOãäSÏûc&>ùî¥~x¯×¾|óaå^úê½·÷õC&ÿ|ùç75}èÅ¿?Èð¿—/~úÿ/ŸýØ—?õÑidþ(?¾ÜÕ Øÿ-ЂøjàÈ?G¹OƒHs^E Bpƒí+á SøA"Ð…pò` W(C²ð…5”` i¨BÞ‡¥‹¡m8C!îpˆ†Ëa˜îVD&щ=ôZ1”5ÑŠM„b]'ż¤ŽL«"xÄ1^‘v\ ç4¸à™Q‹d„£Û†F³Ej,\ÅÇ=ÊQvA|CR۽чìc"?ÈÍiÍs$)¤Ÿ(IC*ratÄ‹ñ³º%N’žD$(•„IÓDò“•e*QyIF¶«–¤d,O)K<‘²N#¬È¼p™Ë£ìÒ—¿f0/þ²JÓØ²)`E„Ìÿ%Œ™„f4é§LX&mQÏœ5­'ÍR9“›ßg6Uùcþ› &C¾©Îp¶ÓÓ&1­ÓJå­S—öìå;õ¹ÏsÅ“–Œ£ç2ñù­sžÏ›üDhB‰åÏYÎóžÜd訊”‚*Ô¢ èË9“t>oamGA:R’–tRãW@«Jy²ôŸžÜhKW:S”º4T1}©LkJS²r§?íiN…ÚЦ|¬6E*O±b¦¤5eô|ÒQ•JÔ©ª¥py¤ªS h7L¨«àùê›Ô¬2E“…¢PUÕúü8Ò­âÑX‡jS<¦%iÕª\åSþqõ8œ“j^×jH;þµnÒkbUs©®¬ÍY›JAª.­Žlf»ÔV¸º³à™¬d÷¨Æ) R³såwÂ:¯´ƒE-(ϺºÓ–µH^²SmC;TSîÖ¶3Škaû[ßn¯¢Õ­sTkRæ6×¹Yás¥Ë¼äBò¢×Å.­2겊fWšÛ•§w¼;^ò¢ ¼ð+/F«Û¹ô¶7»ç¡{÷ _#ŠW¾÷E(}ÃÕ]ü2p½úéo€Ý©ß‡ ¢ÿüÝè.˜ÁÈ}Ût%<áçF—¦‚qJÜá·ÃSݰ‡,bË2Ä1ŠKÜЧØÅ+&±†Õþsx§Ç©qŽªÑXűíix ãáòuµGn¬„~lcÂrÒleZ²ŽaX×Ü*ùÅ@v •ùÊ+3+F6²aKëã.K¹Y…5Q]ÍŒå”êÇn0nËåUö‹cörž;¨Æ7cMÏt¾i¥d×5ÿÙFËmm¢—›16pN¶l¤ MäêàVksÆ´áz hJ¿ qît£«ÊåPOº˜FuªUMÝá¬ÚÕ!-5ˆøë`ZÓ¾³®5Â4Œë\÷¿·öµ‡qŠWÜâÇxÆ5¾qŽwÜãyÈE>r’—Üä'GyÊU¾r–·Üå/‡yÌe>sš×Üæ7ÇyÎu¾sž÷Üç?zÐ…>t¢ÝèGGzÒ•¾t¦7ÝéO‡zÔ¥>uªWÝêWÇzÖµ¾u®wÝë_{ØÅ>v²—ÝìgG{ÚÕ¾v¶·Ýí<@÷ÄÝîr§{Ýåþv¾÷Ýïç:Ýóžwˆ~ïz|â¿xÆÿüî…?<ä ÿøÆWÞò—Ç<Éíñ»žòs|æE?zÒgþ~ó§8áK¿zÖ·^ñŸW=ê]?{Ú×í‚ß{ìA/qÝÛÞ÷¿>Ó ¯wØGþóÁG~ò•_õÞ/ßùχ~ô¥?}êWßú×Ç~öµ¿}îwßûßÿï[`ññ—¼ü@?ÿÄÓ/òõ÷| o?Èã¿ó÷S|þ¿øiŸ~ŸæùO¹þƒ¿ÿ{¹ó3@û#@™;@õK@ý½¼¿ñ@”À‡“@¤@ˆ«¿˜«Àœ@ ü€þ+¿ ÔÀ ´@t¹øSÁAA dÁtA À–[Á„Á Á<Á,Át@À+„¿„À$Á„ÁDB"T@ò3BlBTBìþÀ*T¹!tB‰ûÀ#¬@*ÄÀÜÂ'´¿(Ã/lÁ%´Â* ü»õ‹@)<Ã&TäC,D9-ÄÈ;Â9¼B;ìÃ= @.ô?1ôC6tÂ@lÃÓÃ84Ä)¼C@”CAtCƃÃBŒDH”Ä:<ÁE49GÌÄ/DDN\ ´A>¼8EÔÄDdEôDóKÅIÅ?lE%4ÅJ$½4ÃDCRDÄW<9]4D^DÂ4Å;lÀ"ÆY\C_¼Âd,ÃeÔDc”D`ÄÅ7$DAb†®ï?Ÿù;Š}Ì»Ï Åßô½g(4_›]¡¿f;ŒýûoyY»ø›¾÷Ì…BòLíÀš rCôXw–ÙùÍëw… ½–g( ‹»B†¦|ù2ÇX{¼¾±xðÎГ7î¬Æé±þ*n¬EA"XÔ#Ê뢲E°¨GD°¨GD°¨GD°¨GD°¨GD°¨GÄﱨ‡D°¨G” –Ñ|œ¼]?+±%Ó+¼C°FR/`½}œHAºÖ ‚5–õˆõˆõˆõˆõˆú‹êL7ÀºC°FR`ùw'µ}ƒUüN(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°ŤžoÌrÓWªS±ˆ,“ÿ´Zñ¸`I¿`}qÿªÍŠÇë»Ed^¦öýûâfñ¸å®y)už–É÷!¬Xü¤¥ŠßŤÿÝ(,3‘Nv…¾lÙŽ±2¬ˆ“F¾L+X2wÖRö2ÄZ¼Ìpkk—+~7“F¾ËìçÉo¡Åã–Ûfñ“iÅi2?+âä/æ€WÌ>ŘZÃÐb³ØÚ-X~W(áì¦*~;Syþwˆ}åÆªÀJ¼ûß?š«øíPLŠùRb~±Çú«x°ì¾ÿý˜GÿÞŽý þ`¹þsûÁ• êFÅ}|á»×´bPÅNW÷Ó`™]hÆÊ€>–P€ï^[ЊAå²…þ÷¨¬ãg—`EÖSV$ùªì›gj~Íök ¿õÓ+»kÃR8;9C§-×$X•Á 7´·0°²&?Ù;ÖÏuذË'×`…dà}œÊÆË5=Kò€utüûÌ~U+Ëwk³ø÷›Ïî%Ñn’3°BîöqÒçš_BÒ¡âT(¦ëâ9bõùÅÊ*ýVXBRnÅ ŠM°VLÅ&X+¦âF§¿ 9̾^áÙO¾r‰&ß*;/©X£/ÁRU*Sq£ÓÕ¬¸ïã!Áz²ÇÔÍú}þ“ÝD°P3Á*ðaRÏ/2?–öqíOvÁBÍ«À‡I=¿ÈL°šè&‚…š V“z~‘™`5ÑM 5¬&õü"3Áj¢›jæ÷X>LêùEf‚ÕD7¬÷Í…bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bJ¬çó‰Î9¿Ç…Bñ7}ï™ ÍÖr²mb=‹¡{_¶¾”¤îú“ëñâßí¯â>ÀrW ,ÿÌöÝöÃi}÷±#]üꂲâoúÞ3š-»+48YÌfO[äÃ`².ÒõWqó`-»×K€µÀçùñ£˜]Z½ø›¾÷Ì…f+ ¬e½{°¦ð­jñ7}ï™ ÍV,;qWÈЭ/[[°üÁû²÷rsðn÷³¸—âÎËÏüºÿ…Š V-Ÿ‚ÙåÎÈœ†ØLÅ«–ï†Ùþ Pì ˆëˆåÀ’Ö*~;“z~‘¹n¨Lë¹øáWQ2¬ˆ“z~‘¹jè—s,eñ²ßtĤÁŠß Ťž_d®*~2­8Mæm‚ñaRÏ/2W 5 y°ü®PÂÙMUüv(&õü"sM°ïv‡H°Öx¬Z¾Á*&Xµ|7ÌÐy<‡3mÌ~4geÙÙ-½Õ–x­«ÔŒŸŠïÎ t›Àü{±²$X×îH·ôN[¢ÅÊY÷bJ¯'9'cò³`í °ï3ÀŠ`ÅÉF ¬/ZéîÅ”^Ôh%së`¢'3‚XãZ7­ˆÝ')ÚF‚U`¾¿+Œ„ÞØ–4W£-©z%ŠI½ÑEf‚õ.X§¿1`Rot‘™`½ Öů°˜Ô]d® Ö¥B!KysUÚrÔE(&õF™_ í¯âwB1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Váù _°"ðº‹|ï™ ÍÖ÷X·ÖÉÀ—¹ÓzŸŸÙ~J¸Vñ7}ï™ Í×z(±7 –ÙßyÌÌ]^.4͆®Í2úÅßô½g(4_bþo.Rrƒ‘x°¦'{ Ó¿Wþfwò\ñ7}ï™ Í—ëßÔßS‚õœd F,#?ÕcýUÜÑsa»a |euܰD+εäøÎ›r·ïn–ÀŒõ±é_Dr‘¿›¬1ÁšP²ÂÇ0ì&Ñs'µ}ƒU\;tvÖ\Iˆïˆ=ÖiÅ/€‘%Áê²â7ÀÈRº5ŠòÉš8buYqã#Ö²ìê±Ç:­ø °®¾KÏθŸD?”ÔŒ´9×ø Ëê¸a‰VœkÉñ7ånßÝ,ícŒ«‰ßcE*εäø~,”«“‚E°üç lto°Šß Å”Ÿÿ¥6—óÍ‚2e=º;°|µÍ°ì9Õm Cr,ËïÜ»º.SŽ–¨ù<%êÃ;ìF¡˜.Š_'æ´¬Ì"ÂŽ‘<°ÌS™íËí“`ñ+ȶ̓dµKÙ7å*EŽ–˜y×ܰöͤŸKfÏÖuætÔ 1ßȹeYÿ®kO-aÈmX̰T«Îˆ%S†%¶+XtÇÈÀˆeêÄF¬ˆ%b; K jŸNÛr>uZ|8qïY•ˆeCÖ~ºÚ™ÛËð"ÚËC†#çpS×”sŒuHÙÕuÃ3‡…Éeë±”uôñ®ùPçŇ³ñò*qlÈüö,ç>ܲ:Ö¯.ª ,®gÍgÙ)»ºnXæ˜9´¸ÞH¶K &›>¾JÙ‡bJ¯'#KÝüJh¿ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1]å>ÇÙŸþ{õýçÄüù,/—…üœ´% ½7h¿š­ÏWWù1°&V”’ÏÇ‘D°~,4[ß|>è¤&i°¾4Y Ö…fË‚õ¥dùÇìáÌc>·»;÷¡ýg –YÚå;°ìhøqk[|ö]k=Vd(4[{°ÂAæóñ0؉y,|`Ù}Bðá#~ÏD(&cŒ|[…¤¾ëªÇú«¸°Öï4oåÛzâoúÞ3ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†Có%Ö#šùEæÁ÷RüÝ*›­¸°ÜDÞ/þPcv`­w#&X[_¾¾wFŸ'31?¨v=öV±ËϬ˜Ù?×c溶y²}^ŠøIK¿š¯ðNÇۆ›¹Ð}uŠ¿é»göwÓnŽL+âË—ƒFæ(XËÿ”é:ÅßôÝ2›kšgl›jš+ Vünh¾B°Â]ᬺÅßôÝ1‹ŸøŽXæH0»­Š_Í×~WèV1X$––%œÝTÅo‡æË¼/ ÞäF;x·;D‚UVhÜ?Œh ë¯âžÀÚŒX%ùEf‚Õp(¦Œ|Ù)»ø½QU“Ý]­o±¯E5|ßäµ4¯§ù¸Ž|6nµ­TdW Œ’ëï9-LJâCL§[qߊ[¡Ž×—+K–t½=÷ ì»·¬-pÅ æHùãd´GÁ³7`e~©y»8qPùÕØ÷`Åz)¿ckx¨£‹Á ê‹®jt8Y[®ÙÞDómÈî§"cr ¬c_ÙöžXãMy~¢ovb¼âT(¦«âKZ^¬Ê#ÜÒÔf*êc¶ÀƒRot`®ÖéVÜMX1(õFæÚ` R"Á+¥ÞèÀ|8ÚÔÔ..±(hé}¬Ò´bPê.2¿Ú_Åï„bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêù»Óæßìæj…¾e(“zþ¼¿øçø6ý;Áj8SQ¾¹gw¾àz>¦¸+ô¦õ„ºïÒ±º ÅT”o/ä{&óÍìÏh‘yrÂ쮆!X=†b*Ê7ø,äØSz퉨ë5,;—ÇXý†b*Ê߀µ|–Ë/C°z ÅT”¿^Ó€ÙËpWØm(¦¢|wðn˜Ú¼›× m‡ƒwý“ÀÞ2Š©(_JÌš¾÷Ì…b*Ê'X#…b*ÊOžlÑUõWñ:=¬«ë¯b‚Ó÷žy PLEùk¤PLEùk¤PLEùk¤PLEùk¤PLEù»‹;Š¿é{ÏÁúéPLšùq°)}Ùù=©âЬx¸¹u*~ÐWŠI=¿ÈüJh¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*n¬ÏW‡U|>‘|÷áãÅßô½g(4[ÿhYþO°šãË–ë;pÙñkšÍ?§>YüMß{æB³ew…†‹˜œæŽ]]õX7Öâ ro-t{°";NíâoúÞ3š­s°¦$'4w‚ZÄVliwA·c—<ªbþU°ìv8€e±;ì ç‹ š;-â'ÓŠÓ¶Aú¡:æK,X›KV°"#V£`™B+ «89‰Æ_ÈÔe;ÿ²-%2¹&p¿@º¥wÚrÕÈ÷À:}Îp­ƾ?+óËÉœŠ““{`í 8kK°™¦#&7*Ž­âv[®*> ˜ ’ÍP+ú3›ß|§åv÷EÅÉÉ-°"?Çé¶lT^ñÁ·"v£-pÅ ®ŠßNnX×ë:,Ý숕½±+Ä+NûƱ2Öµ_útk`''ë´âã6(¬ÑuÀJZÎ'KEKű–b½;tH°º÷aRÏ/2¬†C1©ç™ VáٺóÌj`eƒ…?å†X‹zD‹zD‹zD‹zD‹zD‹zD‹zDù`Q¢\°Í©É8«è¯âÆÿ¤sž2NõW1Áªå¬b‚UË7XŽ‚eŽÔdZÏ(uÇnË©¦vAù•ë¯â^ÁúNL ùþº°…&qÿ5Úcâ*žÂkE¶W¶MÜF|˜4òͶ ¯ëi,YÁš"`IS·ŠI#ß‚ev‚sp<Œ[@³Ø‰|ߊo€-9X¦™Š› ŤïnïÜÏ¡ÙKlŇË&Ã+Ûšª¸PLåùn ï ƒ|Ýà~ÓÀ.™¬]q;¡˜ó¥ÄübõWñH`m¿TìªÇú«x °.Nä€Nî8[c"åà¸Q,œw£›Šú¸‰PLåùòßIdv>X±5¦RöŽ °ŠO¨»ÛME}ÜD(¦ò|‚E°"*Ï'X+¢òü8X«bŸ](¬ˆÃ|a`þÂüý…b}¿a¬ÎÁŠÌ–ëu¬1•²wœ§,‚E°Ô}e¡˜Êó ÁЍ<Ÿ`¬ˆÊó“_%fg²Æ³/,£ÉùÅÂy7º©¨›Ťž_d~%´¿Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò t`í¦ šIDATV1Áªå¬b‚UË7XÅ«–o°Š¬Ïg7ç󱯖ý÷X·Öçs€&’,cH"Xc†fëËEi°~¤Çú«¸° 9Ë«åŸù¾3ÿx°ì<÷Y°Ä¿¹ßÏF /þ¦ï=ó@¡˜ŠóåøÙ,917ÑcEæB1aù²Üáú{_<ó¿õÉ· >b¨€åæÊòp\™öÝÉ Í ´_ Å„å@–Wæ&ê‡]á÷í ÖB’{:®¸‡E š;h¿Š Ë·X,Ô¬$MþiöÁð;°Ìò³H š;h¿Š Ë7`-ÓX»Ã®0|²·à¡¹“¶ñ+¡˜°|{¬4M›KV°"#Áú‘PLX¾?xžÿ¼žÏf‡žoÞÄxðÞk(&,_r‹°/ÚâslÆW†`Š Ë'X‡bÂòC°þ)ëßÛ8X©¬ÎB1aù±Å„å¬C1aùkàPLX>¿n8“z~‘ù•Ðþ*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*î ¬Ü‡Kðy…c†b ܰ¢Èäƒ0GÅ”ZOX?ÒcýUÜ8XŸÃ³t&ÿ LÿOˆ„9th¶¶Oÿ &+N|^!C½/[«ÛmüJh¶TÁâCš~>4[ŸÍ3¡`…ÇS,>sØÐl¹=WpHìÒ>ëìuå|æÀ¡Ù:ÿÚÀ¿Œ~ñp˜ðëçC³•–ý.!#š#Ö¯‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áÐ|‰Ø’LöI8r|2ÜÏ÷X·ÖW,ól»ž‚‡¤–ÿFhw–,%ÿ$AûLŽX -Ë>¢r6¯ƒ't,†î}ˆüsx§õ99‹¡Q ±L`¹Cø1z¬¿Š[K& Öîù¨3G,†|Ý`ï°-ö÷A‚Åн“z~‘™`5ŠI=¿Èü|hê‘Q˜jV¬è+ Ťž_d>›­ƒDüy¨tj!Xx›÷:›A‰–¤Ó/eÛæ%°tšþöümél#M°ˆå• G¬a¤³4G¬ °xŒõ¤tú¥lÛt}ð®ãÓÙ m!Q¹{˶ &õü"óó¡:HÔ¬XÑWŠI=¿ÈüJh¬Z¾Á*&Xµ|ƒUL°jù«¸W°Ì¯,2­çgÙ_b̉[vAù•ë¯b…Pó;Ȳ'»Ý/ªë†Ýþš‚)•ïÁ ²‚oMN[îj3õW±R¨káÇ3¼nX‡&Xbÿ[.Ø™íÕ;¶’e™ó yºÚLýU¬*æ²?w9ÛÆÛ « V˜àF,±•Ë\ßÃfê¯b•P¿M§àÇ^è–Vß.`ù³”͇ë·B°dkŠ€¥=b‰]¥ìÀÚü‚`u*v"ß·bg¯ÐRkYÙö·Â wxG°z5ÀÈtÜÎv"¼‡_7ØQJd­d¶„;àhñø„`U+øºa³°ùº¡Û¡âwB1©ç™Bož¯Ð×6~,ôpöFàÃt/¿JÝ#¤êV-t“’yÓ{¾uƒU‘šºcC`¥{Û—k|˜À⑚º‰ãÕ¶ÉœìÞ3ËÕ‹ˆ´¨Sè`°à‰Âu‘¿ŸÜûa{¨«{Õ½NüK³xcE)íã<ƺYü-_Uo#òz7)™7½·û0>LU‹Ì˜ïÂï±ÌÄöFÔ‡é^~=öS¿ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç³Üô…f,cMe:\œž‹Ë¬„Ôó— ö]°Rhî‚Ñ‹S‚ ríTÜF(¦ò|³̶²?þÒìˆ5'/N Oç'X1&…|•ÅB“¸ÿí1qO›‹S6׉LÜF|˜4òͶ Ïžn¬ãÅ)Ù Õ¯¸•PLù,³œƒãa¼xÜšÅNäûV|lÉÁ2ÍTÜL(&…|w±tpm³#–ØŠ§„׉4Uq;¡˜ÊóÝ Þ+øºÁý¦]€T»âvB1)æK‰ùÅë¯â‘ÀÚžF²Ÿ-¹Å'ælRÁ*>$ß:Ï`%¤–¿œËãö!»ÙòÉXCüÃõ4¡ ºþ…d¦ì&î̙ݙY·+&XzùëfùÏñKw‹ÞèpsoOÈKpýŸîb‰%ìOýC*&X^ù»m³Ûð~$È)Þ½<Ûâ~ðŠ…d¤\•¬¥müJ(¦òüØ †­u®\¯Ë­1k£»«`ùó¨`ÝTÔÇM„bÒÈçˆusB°®&<ƺ5!XþVˆOVÖDø=ÁòRÏ/2¿Ú_Å«–o°Š V-ß`¬Z¾Á*&Xµ| fq/ÅŸ:ÓlÅ«–OÁìÀZD°¶>LêùE抡öËOóÍ›l¯+?i©â·C1©ç™ë†ú‹‹d{%¤L+âäž_d®ú%ÇKY¼ì÷í1i°âwC1©ç™k†ŠŸL+N“ÿŸ`í}˜Ôó‹ÌC H,¿+”pvS¿ŠI=¿È\¬ÄÁ»Ý!,‚5^Å«–OÏŒžâpüðò®òŠq‹;H B1)ß9X‘“²ðPq§¥5ÑM'9œ¾ˆ#ª¸øþÁJŸHš± vëÙX«8¯A'_£ˆº[üE•}7ÍÝœ}[Ïcç5Ÿã_-’‡(õF™+†Â[ ÞñneIÓÍ2…â”jcªbPê.2W刴#–¶™ÇXy¡˜îQDeŸ†y³-Ì//í_óÞþ! Ø40Ö°€Jµ]`ýÁDâ*eÔC@`¥a"Q•2ÿ5_`ýÁD’~Æñí ÒêóúÏ¿/íZÇ ¬?˜HÆ*øóòQpi_këØ@a€õIî„,’E\þm¥0Àúƒ‰d¸¬tµ0¹k2zÍ+Ùß ñ- È*ØcÛ€J¹¶/lÙ öì™Ý ¿‰jX˜HL@EÈ-A@R5Ù¾ )$Uƒ€¤jT ’ªA@R5Hª†ã€¤rTM¦€ýœWÖL䤀µÿ„Hé\ð7’ Ý X{WŠ”ÌU¯òl‚€¤jT ’ªA@R5Hª¦CÉX¹&à/4$A:pïíè'1‰ 06LM( ê±æÖÏþáLÊ?Ãé>–/ŒDÀå vË[̆‰Ü. YHËëki+>Ë­3M÷RöÙ:|<ò/ý:1´€¯Å>#àçei-:ðO¯eðωµnú¿²Ž[@¿¢Zž¶ªûÐ<.öÓ~mùR®—Þ§·’=yN@³òÕúµï¦æÖõìË·åÚþ=il[@eš=eV_ßK¬ƒš3.^@\3رC ®¨ìNH&vBl[Ž€- èß²˜€Eò€Ê?å¼ßšV&r·€‡—ů :‚]¸ è1ØlÞÜÞïÄõ’]™}¬)  OÿäÍmf½ÿ0îõ’]™ýJþ_,¡‘5l<¿Ã~¸ÞÝ9â_¦˜!‘Xàa (T¸©dG…FÀ†\yéµܳKð°‰-³DË„€ó¨¾ûýVËàã%¸µçpF—Y¤qœYÀ5ч9%`æú¿Ó¯õý+òùº€‰]ÿÝ) Ö™Epr™9ʵ’íú@ZÀØË":Ù·co/î_+ÙQ¡0&ˆÇ‹Ã¶ˆ„€9sû„€7ä@¼s1¥&›7·x®";‰YhY4X²º0L½EÀ{`"˜zûû:Æ`"˜z‹€÷ÀD0õï‰ `ê-ÞAÀÔ[¼&‚€©·xLSoð˜¦Þrð˜¦Þ"à=0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀØD0Ö—€ëe¾›ü3xôšV&p¹œÕÐü›RBÀ:…ÖLdO@w_ùÇ|òn¾[úñûG«9`E`"{«`ï¡é"Ò<5Þ4]°ÚÇÊ›Uðv„ÑjX˜H²Ô^¢„€K3·vktåC…w1 ¹.à2Q) ã± V^@ôáÂ*Ø5˜H†€:\¯É9p´šV&’ úð±ò£×°"0Ö‰€-X0†€ÿ¼ û×Y÷hn‚=Z2`[˜H“º×ÍЂ°GKl i@@sxÑN´]D›_!àx0‘üç?{‚eNióºFoôÅ4.L¤—oîµ>ÓÖõ.{´dÀ"0‘ú®ê!à 0‘&T±U0;!cÂDê ø÷¹|a³²¾–‡=Z2`˜H› &‚€ÀØD0‘V¼Ô Ñ>Aüú¨æ.Àü×Ŧøk5žíhõ?g[‚;‹øë›o]²aß„`À¥)"à6æ‚~~ nÅʬ9)jž.r„aÛ$"` &R_ÀKúý³cmÎ¥šsÒÁΔìxŠ¥«8xIÀk°ôW×tÙýÓBÀL¤¯5‚˜]2<.Ìy0»d˜S˜Ýc±ü‹}UvmŠØQa€õA@`l"˜^€ùC‚ÊÝÂݤë°dØÌ?Lï^ºÝaɰI˜iã–ÇÀš…¿Rþ¥Ç’!`/0ܼž•³g};.ÙÓ0Ì‚¹‡Îù»§ìvŸ}LgÇ%{&‚€9°u=k´_¹(ö[²ça"˜ñÖ¬a½€*Ü y¹f°Ë’!`°ÔNˆ]# ë&‚€ÀØD0Ìx{úR±àš+;­åŽÎ›â™¹‹ýDÉög xöjÙàªÓ—ïµÂõ«w4Åw–¹/Ù÷on(YbÎÕn5"`­$~Zös–€ •N—lGÛ²~DÀ–Œß)úQ`,«Ém%[U¼X²½¹?Xf"˜ñöÇUpd²åo@y¶dé™?|¢™f¼EÀÜï¶Úˆ€· xô˜¬xFLöh¬æKKÞ2A@`ÏÂD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁDâžé‚ÍÿvôšV&ò»€5 ¬?˜HJÀå å^µ{]¦ôùV¯ÃÝ¿eȸ5¬L$! ZŸÊøyÜ‚{µª—}6¨ºüþoóðÐG ¬?˜HzìŸ+ášA“×ò˜Fÿ¨ßWÁŸ>ùdœÎjX˜Èž€^-埆¸h¹Ð?,tÈšV&²· ^Z¹`ì¦dVÁKAY+% [ïÚU­Žï„øoý*˜ØLäÊè„e£×°"0Ö€íX0‘´€;z‹¿==B0ÚéÂë ö㜀{ÏZ©æ€•©“º' ½‘½ÍûU¡qu{}þ=# Ò¬Ü¸™Ô¥«a, °þ`Áú^$*`Ñçfâ’+ - °ª- Û€ÀÊ xfð3ZûôÀ:„Û ÖV¦8¬"ì3ç‚5Ù hþ Ö0ûò>¥Oþ5­CfGeŒ¥üuˆ§`ŸÑÎÖ§aË‘‡ 0e®´|v5JAD6Úr›mÀ3*¿€ÎŒà “+ ZoBVëìž)?•30s·Ë%Øù’ý­{§ªñRÉî¯F÷ç¡3ô?ús4Üw¾3}s{ˆYFY3äî'ñåz© ÛíÍPk}ëu¬L˜_Lç`®pç`ʵ§`þàÅé’]„]¨F/`f ¥\ øí`JÀSN@µû«dÍå*'ï9˜:S×`n1„)u­dúBÉþ®ÁòKæÞ6mc4çI"æÝcdÌo’#fÈ»ÐÌßiØRs'aVÀÇ`®2ï¯Æ«0³Á™Ýà¬w¥ÛÐn)o'.6Jê1˜ö•y5^†nmì/”Zç-kÐmFäÏ•õCò{ÁÇÛvë9|nƒ>Þx a'6^˜ß ~æÕ9˜9ÿÌ©qö0É·±Ã0æqæ~ýcÉ™þ¹²uà¯ïÅXz+¶?8[Ã<SêÌ}~¦Ö;³–·ØÄ Ãh`ÏÂD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€À:ÐÞå¹™¾27«ý[„mrö¦ã??°ñšV&’~FôT1•×g†‰$Œø•5ý´€ËŠÊ¿Õ8)LdO@ÿr¶‰\êÚ ü UJ è{[ס€ÊMfidƒI#à0‘,}û´<ÄK£µûî~Ö{Úìwß„†kX˜È í# ¾üL˜ÐÜ/ 6^sÀŠÀDòÜ6Zß-ÞÕðO#àL0‘Ýx£%\U;!›iVÁÀt$G‡a"«àuÏDmvBü@÷Ý‹`— ¦oœ\-ÌñáÄ~jX˜È®€ë±ãK…1mÝ…w1 á\006Ld¿»ÖìžV*L%˜,¨ß‘Š^|ÑaÉZо{qKÅÂTÐ?s6^A–¬íù^ýòg}—‰¸n%”{?EÍ­‡Ž´9ŠüJù—KÖ¬€îÉÕúåža¿LÄ|^Ö;›Çö_sþQÞëéã¦yí¸dOÃDÒ«à­†âàñÈ5ç–ÛGÃûsßË;»(Ùã0‘cÃUðFÀ ól]Ïnû&°€x&’· vSšT@óèTáNÈË+è±dÍ èvB‚KO—‰Ø¥îÙ qçÃû-Y«†£‡Û€­X0‘Œ3!a ØXa€õáT°®T2g ó5rù,˜ögmQìòÝNëó)˜ìá<çÎ]lì'Jveö ¡ÉéGç'%àûî¬^[˜qB%g)¾˜®Ó]­¹ªÉ˜âŽ€;KÛ/³ïßÜP²K³^ÀHqÏ7çÑJ{L@eöFÀ=-ÿ2ŸþŠñuZös–€ •N¯w´mSÀ/Sάâ3FX+¢|ñ“µaakÙž0~AîAÉÅ,fÎè©Í²;—À­«à2ú·O X©L5JYó|›€?—ìÒì#à»Î6`d²è2¥€§÷‚ # D¤®€÷ç vi1ý@O˜5ÏxCá@4°ga" My^ÀõŠÎe€W>è¯}Tõõ{}D¸½1Úb&RGÀ`è·€òøfe ý\²¨Íþì‹i\˜È*óD"+»ÏÎ_R¬Ö‡ù&M›ÿ¹É(Þ2eb¶^ ?äb&r«€ÊÜ¿co&ÓV>­ýuʶ€æ³Z¸u2JxùË• º˜Æ…‰ÜÛ:süóÛüÐõ†žE@óíKn®#mnÌs+nZÀa" ¸ M ¸Œð% o6¥€J#`¯0‘VÁË/`d¬V•PÅVÁj±Ò%Lä‰eÀv'$8Šòµ²¬wÍdÜ^ɺbVÊÊíÀ)àáC¶F_LãÂD8 MyL@•WÞ%·½)É]uÕ@Í+iCÀà³xœ¢ o™h1 yrl/n®/͹KN#àP0‘GT^B×ãÕ×%úÖEýòwÉéhë9úb&òœ€îž¸à.¹××MJööð.¹ø!œÑÓ¸0‘júWy—Üòâߪąգ/¦qa"VÁËgÿ¬‚Í*ÙõFçî’‹“}1 ©±²|Þî„äÝ%7Ñb&ò €‰.Cº©9`E`"lw £NŽ;úb&òìNHòêªxãØVÍ+yTÀôõ¥=Ô°"0‘Lž&n«æ€‰´ à-°ÎÓ¸0†€}Ô°"06€éÃ0=Ô°"0‘VD›&‚€ÀØD0‘V ÏÛ C•¸zaŠÅ4.L¤IÝëÎ% £/¦qa" ¨drËí"Ë÷8L¤µ»=èQNÛ ¢ï€u±˜Æ…‰4 àz\pÿ[xçHIØ£%‰ÔpUg€‰4! Š­‚Ù &R_À?enÈÜtkm_ËÃ-°L¤MA@`l"˜H}Siå ~}Ts`þëbS¼^xYÀøeªG‰-ÁEüõÍ©ùHLkwpiЏMGnÅʬ9)jž.r„aÛ$"` &Ò¯€±6çRÍ9iŽ`gJv<ÅÒÕˆ€ ¬‚ª¹kº\-Ú `Î| `9˜æÌ–ƒ‰4 àÅ\‚•= óKÉJW#_sÀŠÀD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁDX{®w!†SŠÞ\[>zÍ+I{>.{X@sóŒ ÿqß 4Ͻ怉쭂­‡ÁÛE5;пթ&s°šV&’lõFÀu¨½©p+àòvôšV&rA@÷](àçÍè5¬L䜀îiâ›ÐüŸU0°,˜Èž€~'ÄNi»bCvB€°›Âë&‚€ÀØD06²€ö±ÍÁãmƒswÕ\P÷6<)Ô±ã UâÝÔÜ·€®_ÙD§v–¬o7Nk×8hw Ƕ€Ëï«ó óPÍÙÓàî0TØ ëµLý:1Œ€Ê5öÐô×*xm2ÜPåºk zËÌ/Ìs5§‚~eÃæ»ò…=Z²§a"e[Àe˜sÅfh( kýVÀåȶÓPežPy¸æì!÷¯5åK´ÚÝ81–€kŸ¿[—Õ—þ^¯Qa‡ÕmÕ\°í`ÿÊ\ñð,L¤ü*Øž ÖN@·Äü¹;?B°új[@Ó(ûUáÅúW֯èýVº[6z=_lµTÁ…Õ›·ún°æR;!îªÜÞGÀs#˜v±›šV&RS@ÛþP˜qÓ¸0NÅFÀMG@ÄgÑi–¸tg„óÍí5—šÃœ.™+{îbc?Q²ƒÙ—ç[ðß>fG$ý9ÌæêW÷¯©žô~7ç ãóq˜Ó%óc%fiGV_²ïßÜP²ÃÙÏhX@[•~Zöó®€úÜßz%Ï•ÌoO¥Ó%ÛÑö6ýÒ©%àRîôçÍÇ»:ÿTTr[­ x¶d±âÝQ²UÅ‹%»4ûO ¨w>oæ89ÙZÀs%[ëªñ’Ï~-àÍö³ ˜_²µ®/ÙáìWߥ+/`‹i^+íË}ñÏâ»ÄbJðü©¸+9]2_W­—ìÊìs X06’€ïÏÛ÷;o„·íKx°·y»?î[}¿ÝXÛö'3ºãø¶ ó5Â[æK— OÎèß;ñÕ»±Å4.L¤¨€¾yù¼,íàûÓäüóߪËûíx¿>ïÿÞf„÷ÛOëý÷½4WæÕMG¾㾃–×õÚNÁ hè…è¸{­öèN ) ‘G/b|T Fpë;ó›?û«m hôð¯f,ÿƒ÷flÆ}-¯ËŒ`e6¿ý[WÁËïW.>)/àÛ¶_«mÓµ¼}%\~ãÆýpù6"  ¦hÆ}n( ËÌ.Ž# ßŒ øÖA ®‚í 2! 묀v¿t³€ÁDîÙ ÙpmÅ*80Ù¾—#à['Œ®‚õŽ€ì„ !àÚÀYáÞvË,\- Ý wÌX¢´»nwÂhkvBü¸Û0Ø] wBÞ~,+ å¾3jn\'ðraäNÈo°Ð§÷7ìÑ’ÛÂDZpÓþ CÀva"Íl˜C@`ÁD›&ÒŠ€áu´öºZµ÷¨ÀÑÓ¸0‘&t¯ñG/O±˜Æ…‰4  ’ψVÊÝ‚€ãÁDPËgD»ÇX² &Ò€€Kƒ'ŸºÞ]ÚLÍ+©/`ðdiœ&Ò„€*¶ f'dL˜H}ÿ–‡.o:ªñ¯åa– X&Ò€€À¦‚‰ 06L¤ª€»,ºü ÷Vüú¨æ.Àü×Ŧx©ðbalOI?<LLvg}ó­K6ì› ¸4EÜæ™Â¸~ä~p+VfÍIQót‘#DÛ&c0‘zú…uQÀX›s©æ2æc•*v<ÅRÕ¸W2Ü}[¤<9£{Û€Åaƒ‰ µ ˆ€gÇ[@½÷ähDÀg ³{°b'—`eÃüR²ÒÕˆ€Ã×°"0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀØD0‘}wnS_·×Ž^sÀŠÀD⺻÷îED@`W`"QÍ3ê&Š€À®ÀD’~Æñíàçq‘æVšõâÊ?.`’šV&’± 6®·Íâ2%¥Ö——vĽ怉$wB¼_R@wS¡kkX0‘ íjVs;Q` ¬´€d¯Íz÷K@VÁÀNÂDö¶Ý-ü›Ю‚·ßMQsÀŠÀD2΄ØV®ÅÂë&’s*Îîu4X`ýÁD8 MIV¾´?úGïYÀj½€æXŒÈĶV&’>½ôY¾¼ºP»þ›) °þ`")—ËìsÄ] ¸|F@` ¨V5+I¸lò)ë^ àÞ!ÁÑkX˜Hb/X[×½`m?Z@`†YOú.SB@`ˆÖ/L! °‰`"‰ R ¹!Ù^ë¾Ý ©$Uƒ€¤jT ’ªA@R5Hª&_@BîH®€ÝœÖÖL! °‰`"g4«òÍuÒnå<²÷èñ¾]Ö°"0‘+- Pù õõæ™Ñ‡Ï—î²æ€‰\PÙÿ/wÉ™ð嬴?@@`· hïq.¾ügVÁÀP­~†" °§tûJèvEصäÝÂë^ð×ñ85¬Lä—Ã0Êì(÷só½Þ~B¿5¬L„ÑÀØD0Ö•€O^¼CHwÖ¾¨‘ ’ªA@R5HªIÕ ©$Uƒ€¤júŒ•Þ<œþ£…ÖL! °‰`"uT… skÍ-›Hþ‚oÛy^pÅ÷Ëþ¨ ÃÜ]Õ…€æ/Åwš¬_‘N“áý:1´€þ®Íàþ>ZÀ—½ùY«?Ûs­mUÐ"àY˜Èý- ¿eÓô¼ii5ç:IþÓk[·ÞjÅ*¸qcnö$ ZÔUz2 —¬"Lä9ÍÊWO3j½æ\÷´J¨‚=5‚c èž c7è—¡]´€k÷´~/X¯7æÛ;P‡pbhÝ vBz08 c[=×tË[ ;wbhý[Õ{Í+yH@Ú `µ[ÀîkX˜ÈýÛ€G—EÂ.^stv‘âöàÄØþo4*öƒ3Æ'[öûµ·‰ `†€·ÀD0 CÀ[`"Õ\x˜SÆaîPÞr˜Ü¾Ÿpdc? LV#" ‰ `†€·ÀD0 CÀ[`"ˆNÂÎ!RÜœZÀqjX˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜È/®WüÚéû'逧›šV&ðs9ù)?oX!Ý}ÚM 8dÍ+I øÇÞWcþ1wÙ˜¾ ^þÙ fÒˇ??lÍŽÀ£¼]Xۆоµ®ð- uOk1Bÿ5¬L$¹b•{éP@mŸq€Àê ¸L/_@í÷h:¯9`E`"{;!ß«`­Ó«àu„ïpˆšV&²{F섘)ÅvB–¡«±n-M ì’€% Ã6 °ªÒ«+à…ÖL, íŸ+XmvSsÀŠÀDž0ªÄº©9`E`"%4Gµ9çÀhs0Æw5¸ ù[·ãæfÜÅ4.L¤¨€Ê­líAÀ¯Uðb£Át¡¾ 3k|ç¼MÖ°"0‘²-à"•r—¿¼¶ºæÐ`\Ó8 UÆe`kaÆ]LãÂDÊ h$ûÐv9þµ ¶gøü¸ÍÖ°"0‘ò«`{:N;m»¨ÝÉãm ˆ€³ÁDnÙ Y[@wY‚½8A¹÷fÜÍNˆ[}7[sÀŠÀDJ¯‚ÏŒ`ÚÅnjX˜HMm øCaÆ]LãÂD8l,ƒüÏçÿ$’œlª ,=þb&‚€Ù%V&‚€Ù%V&r—€ŸS¡€ŸÏ)“}ý!à€0ZÀì’+AÀì’+AÀì’+AÀì’+á@406L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀØD0†€À&‚‰ °öÌëþ—þ‚=!`´S`:¬v£€›·9YsÀŠÀDʾâÜ@Û]«ì-“«•0ì-ó«÷U­Ït×J_qÀX30‘û¤³B`çtÛyqÍ[µ«åÀD’-àg×Sõ¦ÿiÿ ñZtX ¬¼€m[¢0l»C@×§Ñqah°›Âë&‚€ÀPù}G[n§7}–wôšV&’n½€f××Ndç2ƒÑkX˜HRÀ¥Óióž¦öˆ€¦sUÓÛªk•ëü²™Âë&²+ ZÔ¬L$! 9ßëº:_Üœ«_`ýÁD{ÁÚ ¸îkÓøÑ{ø0Œòg„—)! 0Dë&‚€À°QX²Åói¬d5a"à XКTGMRp®ð†Â\>­i3ëªs ÖDí…:i .Á²b 9™|Mi‰KÁ%X¶d°á¬«Î·Ø£Š|Upù4jÍ#Õxß2NÀ‚°‚ yÊÈIDATÖ4V²š0†€À&‚‰ °®4ÛÁ›«—!Ú\:è~õPaÆ]LmÃÌvíjÁKG,Pñ'ˆ\i½€Ê_¦ªÝýròmc5¬Ì hžBªå¢‡–PÙÿ/÷ˆ˜ð嬴?@Àáaæö kþŠXô·h¯“v.¾ügVÁÁÜ]’Æ‚ÀŠÐ‚{VÁæÑ«€:†>U˜“¥ïh1 ³ë>/à'Ò‚{Z@·¥©„€*ÜæDÀÁaîþ4%TÛ=TÚ½†÷Ê­û?_;ÄÕ°°õþ4¿¬¥7í„„‡aìI&w¦iEÛ¿ƒkXXxÆ.í/ n< ÓqÍ«A@`XvýÚ–ÖKV¶[Ac x]£W÷5[¿Â¶uº–¶khT#?©Û¤€{‹aõ‡œE£ùAÝ{Ì_rn>ʆA£žr ç/-lGûM@ZÀJ¹^·cµ€lþ”4Ê©ÆÙ·-ÌX uÒ¨Íjü¶­Óµ´ß0‘î¼ûA£ÆKV¶[A¬˜C@`ÁDê¨ æÖš[¶füåŽß·~½ìŠÀ0ÌÝ…Q]hþR|‡yúé0/Ú¯C èïV ®`í£|ù[¿þôzë—/Žÿ6-àËߪbz]2‹´šs·~ýéµ­[ï¼±¿bܸ€±—zP­ꈀ*=™†KV&òœ€f嫃gy´^sþÖ/!`xJcïÁkí–¬&Lä¡Uðës'ÓÚÍW-`pë—WÁî+wëW†)¿b¬³;!½†±­žkºå €;1´€þm÷Ï–V&ò€´Àj·€ß7*£y”B–qÁS1˜¿2f'fÐ\+»RgÙÅü÷‰G)D`ÁÅhêp³ì'˜óîëÚÀ¬ 'Æp»ÀdaÌ·êl«ÃV‹XÍ]„}‰—ºHµG'ðk±‰Å´^F{ʼnã+—õ/°CñR"¯Æƒ·ÝÀDî? ]vá£Ü‚¡ù°N¨‹°sâEE,Wx½0´€­;1¸€šmÀÆ_@ö‚ Ucúm70Ž^ƒ9ï8x&Â=!ÀØD0†€½Áü†Ÿ²ißÙºí«dØÌ èû&x!`6L3ÞÚãÙæ ’R›ëðwúEé dØ ÌßÙ§ümÍÆMóÚqÉž†‰ `Ìv¼"{gñ7ô[²Ça"˜ žÇáïpþ|eϸ à ˜f¼ îDÚ¬‚íiîvAÀ›Lì„Ø1" °n`" »…¹K±~ƒm/Rk£dß… /5BÀÚ°íU‰+³r`Ê_(©Ú(™{Y­‹\uûËÍ"x¶waôºl2a_K·z5FµÛ»üŒ‹ø ,o¹l<Ü…E'öX¡³µ;p1 &‚€o/-šÝÆa÷æ’‡KV®·)¡!–„Ñ”—ðÛ€Ò:¶kÀ¶KÉ~º³S1 ²…’¹—¨Š¬CÀ;aniüSéÙ `ÃD›&§‚€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jTÍa§L?¯œ´IEND®B`‚Bio-Graphics-2.39/t/data/t2/version2.png000444001750001750 2562612366325116 20050 0ustar00lsteinlstein000000000000‰PNG  IHDRXËJ ªPLTEÿÿÿ{hîðÿð€‹î‚îAiáÿcG@àÐp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿ØõÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2ÌÿÒiÜÜÜÿÿàô¤`ðæŒ‹‹ÎÑÿÿÿõî/OO¼wˆ™fͪ˜û˜šÍ2”ÓææúÿÿF‚´d•íÿïÕîÿ‡Îú¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀºUÓÞ¸‡ÿÚ¹î誼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõȸó· IDATxœí[’¬¼’¬I³cÖÖS8ñØ/=f´GQóî•è‚ ä(RÊ}ÿ›•™àxH|%¨,.ÓDQEQEQEQEQEQEQEQEQEQEQEQ½iNMÒs2&µ}ƒUüN(&õü"3Áj8Ó×óù(æ™ VáùúüÓ<¬î*n¬/OQ¦^,þÐþ*çcèúþó™¿£ØÇ¼û¼PüMß{æBóµÙšñk¶ÃØ¿ÿ–—µ‹¿é{ÏL ùbxÅìSŒY 5Ü-6‹­Ý‚åw…Înªâ·C1•ç7ØWn¬ê¬ÄÁ»ÿý£¹ŠßŤ˜/%æ{¬¿Š‡ËþáûßyôïíØßà–ë?·PÙ nT¬ÑǾ{mA+UÜètu? –Ù…f¬ èc øîµ­Tnñ'[èŽ Á:~v Vd1`E’¯Ê¾y¦æ×l¿–ð[?½²K°6,…³“3tÚrÝH‚U¬pCÛq +{`ò“½ƒ`ýX‡ »|r VHÞÇé¡l<°\ÓC°$OXGÇ¿ÏìWµ²|·6‹¿ùìXí&9+$àn'}®ù%$*N…bº.ž#ÖYŸ_¬¬Òo…%$åV ª¸Ñ‹`ÅTÜh‚E°b*ntúËÃìëž­ñä+—hò­²óòŠ5úø,U¥B17:]ÁŠ[ð>¬'{Lݬßç?ÙM 5¬&õü"óó`i×þd7,ÔL° |˜Ôó‹Ì«‰n"X¨™`ø0©ç™ VÝD°P3Á*ðaRÏ/2¬&º‰`¡f~Uàäž_d&XMtÁzߟèœó{\(Ó÷žy Ðl-'Û&ÖC°º÷eëKIê®? °/þÐþ*î,w•ÀòÏlßm?œÖwß;Òů.(+þ¦ï=ó@¡Ù²»Bƒ“Ålö´E> &ë"ý÷X7Öâ±{½X |ž?ŠÙ¥Õ‹¿é{Ï[^I=Vd(“zþÁ¼<_ûC,3üâˆÕS(&õü½yAŠ`ý@(&õü½Y–‡Çw…2¬¾B1©çÌ"ˈµ¼‡Ó§B«™ Ťž_d&X ‡bRÏ/2¬†C1©çÇÍé"`³ìEÅç)³Ÿ‡¯‹`m¤ž3‹ü7¢ÈfJq±yÓÉ[ä}îºÖFêùG3ˆ•ßLd²B·-^€µ[ú0ÙŒ‹ zþÞ cõo3EF ,t^Çœó”Üæ^­«¸›ªøÊB1©çÌ8Yš›)sW˜@°©çGÌ(Z‹`eš1´ÁÊ6Ÿüªþè/ïç)XsëTü ¯,“z~‘ù•Ðþ*&Xµ|ƒUL°jù«˜`Õò V1ÁªåS0‹{)î¼ü̯û_¨˜`Õò)˜XîŒüÈiˆÍTL°jùn˜íŸÅž€¸ŽX,i­â·C1©ç™ë†Ê´ž‹~%ÁŠø0©ç™«†~É1ÇR/ûM§AL¬øÝPLêùEæš¡â'ÓŠÓd.Ñ&X&õü"sÅP’Ëï %œÝTÅo‡bRÏ/2×+qðnwˆ‹`W1Áªå¬b‚UËwà Çs8ÓÆìGsV–]ñÑ™ÝÒ[m‰×J°JÍø©øîÜ@· Ì¿+K‚uMà~tKï´%Z¬œu/¦ôz’s2&? Öžû>¬ØèVœ`´Àú¢•î^Léõ@V2·Öñ'z2#؉å0Þ¨uÓŠØ}’¢m$Xæû»ÂHè]aIs5Ú’ªW’¡˜Ô]d&Xï‚uú&õF™ Ö›`]ü ‹I½ÑEæš`ÝQ*²”7W¥-G]„bRot‘ù•Ðþ*~'“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5š/ò+¯»È÷žy Ð|!`ýpõWqû`<|™;­÷ù™í'ñ§„kÓ÷žy Ð|­÷{³`™ýÇÌÜååBÓlèÚ,£_üMß{æBó%æÿæ"%7‰kZp²—0ý{åov'ÏÓ÷žy Ð|°þMýý8%XÁI¦`Är1òS=Ö_Å̓%뽨×]¡K,X»k}õ#=Ö_Å̓åÞ > ?‘ƒ÷ÉÍõ»By¬ø›¾÷Ì…bJ¯GJЍì{Ïb-Ë®ž{¬ÓŠß áê»ôìŒûIôCIÍH›s-²¬Ž–hŹ–ßySîöñÝ͘Ñ>Ƹšø=V¤â\KŽïWÀB¹: XËOp®ÀFçNjû«øPLùù_js9ß,(SÖ£»Ë÷WÛ ËΑSÝf‘0$Dzüν«ë2åh‰šÏS¢>¼ÃnôqŠé¢øubNËÊ,"ìÉË<•پܮ!1 ¿‚l˃ؑÇÂw–ýÐ'>Òè÷Ì…f+–!êÖÒè÷Ì…f+ ÖöÃ-Xvä¹5b­yO4ú=ó@¡Ùr:>ÈìÁZwi»ƒ÷Í/—Üþnh¶""»Âõˆþ³9xölîXžïC„b2ÆÈ·UHêáë°®z¬¿Š;kýNóV¾= ×)þ¦ï=ó@¡˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj84_b=¢™_d~,q/Åß­²ÙŠ{ËMäýâß5fÖz7b‚µõåë{gôy2óƒj×co»üÌŠ™ýs=fî k›'Û祈Ÿ´TñÛ¡ù ï4|¸m¸™ ÝWW¡ø›¾{f§a1}áæÈD°"¾|9hdŽ‚µÌñO™®SüMß-󷹦y¶Á¶©¦¹Ò`Åï†æ++ÜnÀª[üMß³ø‰ïˆeŽ³ÛªøåÐ|íw…nC€e@ò`ùaYÂÙMUüvh¾üÁûÂÐñà}An´ƒw»C$X`…ÆýÈê±þ*î ¬ÍˆU’_d&X ‡bÊÈ—²‹ßU5ÙÝÕúûZän¨YÃ÷M^KóúxšëÈgãV[ЊAEVqÕÀH! °þžÓr|(>Äqº÷­¸êpýp¹²dI×Ûs¿À¾{ËÚW jN”?N&A{,1ÛxVæ—š·‹•_}ŸV¬—òû8¶†‡:º¬ ¾èz F‡“µåšíM4߆ì~*2&·À:ö•mï‰å0Þ”÷ñá'úf'Æ+N…bº*¾¤å5ÀªÖh \1(õFæê`nÅÝ„`ƒRot`® – %,°bPê̇£MMíBà‹B–>ÑÇ*mA+¥Þè"ó+¡ýUüN(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž¿;mîðÀn®Vè[æB1©çÏû‹Žoӿì†C1å› yvç ®çcŠ»BoZO¨û.Í«ËPLEùöB±g2/ÐÌþŒ™'w!Ìîj‚Õc(¦¢|ƒÏBŽ=¥×žˆº^£áÀ²syŒÕo(¦¢ü XËgI°ü2«×PLEùë5­X‘]a° w…݆b*ÊwÍÁ»y½Ðv8xÑ? ì-ó@¡˜Šò¥Ä¬é{ÏX©Óúê±þ*&Xpñ7}ï™ ÅT”O°F ÅT”O°F ÅT”O°F ÅT”O°F ÅT”¿»¸C¡ø›¾÷Ì…bRË'X¿ŠI=¿ÈL°Ťž_d&X ‡bRË—n{¬¿Š‡ksßåpÎ?âÎ/Ú þÐH°Ťž0IÚ¾ o«K°Ť™¿^´3mÎì;¿hg"X}„bÒË—ð¢Èe92§.ÚYG1‚Õp(&½üðY±ËrÄ,(ñ¹«ùPLšù°–“`…s¥(ôeó@¡˜4ó×àþ!5¬ØE;©ß&áÉ@Ûø•PLŠù²^´3íÞ²®/Ú!X ‡bRÌîõÑUõWñ``)„¬†C1iæ'ï•Úv™ Ť™½+4Áú•PLšùë§C1i欟Ť™KâñЗÍ…bÒÌçˆõÓ¡˜4ó ÖO‡bÒÌO~ÝýÁj8“z~‘™`5ŠI=¿ÈL°ŤžŸ2g=T—`5ŠI=?i–›¾Æ»{œPLêù Y6oå;ÝœdóH¨¢y PLêù y–9Ikúžè^=ªh(“zþ™Y6¨ÈþA<âw—²,C°š Ťž™eó žý]t÷8¡˜ÔóóÍßoO× Á–ÏÄLí2±š Ťže÷jA*–¸¥ VS¡˜Ôó/Í"s1…ìw…§õUãÝ=N(&õü|ó÷ªžíÁ»¹ŒUÜ›.º{œPLêùEæWBû«˜`%&É“ÿVá˜Ôó³Íå×ôÔ®xðPLêùÙæòÓkW^üMß{æB³õ–åÿ‹¡9¾l9°¾—¿¦Ùüsúá“Åßô½g(4[vWhȱˆ¹Á)ñaîØÕUõWqó`-ž€!÷ÖB·+²ãÔ.þ¦ï=ó@¡Ù:Ë“´§¸+74[I°Ì»]áòw…‡fË‚åÓ'ÿv ?\¾’àÁ;C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5Š©8_Ì+Y?Kß*öºø›>³ø¹GßeÞQ÷…ŠG+œlÁ’s=fÌ,÷лȓ~š©ø÷Àú>gZnR=›×î©–æþxö§<KÖÇæ˜'5ͧ#AÅ[Æ$Û”oùÌ?QU2ÿ Xâ†(ƒ˜v…ß·ë&YHrûû°Ø ÷J™˜¢Â»=НýP‚ûÐb± S²’ä6†ØŸÿ=XfùÙà(ácJrBs'¨ElÅ–v÷t;vÉ3¡*æ_Ën‡X»Ã®0|º¸à¡¹Ð"~2­8m¤ªcþA°Ä‚µ±d+2b5 –)ăåw…ÎÖU2ÿ Xîà=xoðTK³Ã Ï7ïæ¨¦ñƒw»C$X•ÁÊ,¾\hCŠÏ]°ó@¡˜°|¬ ¼·>Áj8–¿{ÃÉÛÈCv_f§—†X¼¨89IþhƒÂ]¬¤å|B°T´Tk)&¬Ñ»CÇ“·‘CÌ“u]/1Áº£T(d¹[qÚw«-hÅ Ô]d~%´¿Šß Ťž_d&X ‡b‚óÿ–ÉßEöåŸ}õ—[üßÑ|̵Q›äØ‚HsÛÜÆ¯„bBóÿìä•=Xnòw,´Çþ³ó*F'+!0?þÌàð÷þûÿŠÁ÷÷Ò-3¹%×eÜÜíz–e–5ü-ËØÁÑÌ×5üMëÜp ¶D³·Ì_P;ÔÜë ÁJÌÁú[6ÁǾr˹ýŽYÆŒ`·ƒØ2wVþ6»Â¿iÅÐò¬Õ¬Á¶–h±õ°áͽž¬„À|;üùíË5~óN°–¡ÉŽ*Ó¬0 +XÃ~­Ë*w`MÓú9Áj, 5ÇÀr›{V¸+´›<–] Ö¡Ä5%˜5÷zB°Bóÿ¶“8X©]á.“kùÜŽX;tæ«]átÞ›ËÊøÅVovsÁˆVoÞw#–?ô¶Gë‘yph¤„æ‘”¿iûùE·ÏV÷uŠI=?iÞ¼—…†ûµ¿á¶ñ+¡˜ÔóÓæpÄ*%X«‚o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`M‡+TÝÝê±"ó@¡˜Ôó·æ XË+™NNj'X ‡bRÏ÷f±·ð[Hòw•\f¬C1©ç‡f™ìÍJgwk¬å•<Z׿Ý2Û€eßýfõWqã`mw…füšƒalaÊO†¿×cýUÜ:XSÀÔ,;rùë‡{¬¿Š»ËìîXî¥?Æâ®pøÐlù\@W,î ŠÈc}ì^o3bÙ]¡™Çƒw†ÂòF{ŒUœ_d&X ‡bZfÄ*Î/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õph¾ÌdZ"h>™—7¯ÿFh·ÖW,óh»žôm„.þÐþ*î,1OSòÏPóÐŽX -+|êÛÖl#X Ýû…Oã» ‚ÅШЂX¦°Ü!ü=Ö_Å­ƒ%“ký­p¶÷g—z¬¿Š›+øºÁÞTZì¡{&õü"3Áj8“z~‘™`5š­;ÏŒ V6XøSn¨E°¨GD°¨GD°¨GD°¨GD°¨GD°¨GD°¨G”E!ÊkÑœšŒó·Šþ*nüO:ç)ãôX¬Z¾Á*&Xµ|ƒUÜ+XæHM¦õŒRwì¶œjj”_é±þ*î¬ïă%@$+X§—vÕcýUÜ1Xbÿ[.1œíõ†ÿ8ó`_zØUõWq¿`-Yt܈%†³pýâoúÞ3Š)¾ž,]…ù` Š)ºž/>vW¸K$8²"Xƒ…bŠ­bájû[¡¥ÍN„` Š)¶Šðë;JÙ¿­`-ŸëÓ÷žy PLêùEf‚Õp(&õü"3Áj8Sl5OÅ 4Ô XoŸRFa"XÔ#"XÔ#"XÔ#"XÔ#"XÔ#"XÔ#"XÔ#ê,ª3uVQ~‘ù•Ðþ*~'“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ7f¹é+ ÍXf9ÔÝ>ˆÃü§ó ðÀ‚•zþ2Á~OQ Í]Ѓµœk .™tȵSq¡˜ÊóÍv0ÛÊþøK³#Öl/–4j”yŠ\29O+æÃ¤ï¯ [h÷_£=&®â)¼Vd{eÛÄ]aćI#ßl«ðºžÖÁ’¬)–4Uq+¡˜4ò-Xf'8ÇÃxñ¸4‹È÷­øØ’ƒe𩏙PL ùîöÁýš±ÄV|¸l2¼²­©ŠÛ ÅTžï¶PpðÞ0XÁ× î7 ì’ÉÚ·ŠI1_JÌ/öXÖöKÅ®z¬¿ŠÇëâDè䎳5&RŽÅÂy7º©¨›ÅTž/ÿ/"‰ÌÎ+¶ÆTÊÞqVñ uw»©¨›ÅTžO°VDåù‹`ETžkUì³ eƒq˜/ Ì_˜¿¿P¬ï—#,‚Õ9X‘Ùr½®“5¦RöŽó‚E°–º¯,Sy>Á"X•ç,‚Qy~ò«ÄÃìŒâOÖxö…e49¿X8ïF7õq¡˜Ôó‹Ì¯„öW1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`/çc ›IDAT¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò Vño€õùìæ|>öÕò¢ÿë¯âÖÁú|ÐDòƒe IkÌÐl}¹È`# ÖôXw–!gyµü3Âwæ–ç> –ø7÷û™'®«ë¯âÆÁ²»Bƒ“¿f;Œm?t+_G,Ë”7ûËŠ¿é{ÏùvÁGÌu°Ü\YŽ+Óþ¡;9¡¹“¶ñ+¡˜°|ÈòÊÜDý°+ü¾]ÁZHrOÇ÷°hÁBs'mãWB1aù‹e˜’•¤É?íÏ>~–Y~ö ÄBs'mãWB1aù¬eËbw؆Oö<4w2Ð6~%–o•¦i3bÉ VdÄ"X?Š Ë÷ïÁóŸ×ÃóÙìðÂÃóÍÁû‚Þ{ Å„åKnöåBR|î‚͘ Å„å£`ù'y£¾~º{œPLXþÿôïíÿú÷ö¿¢J­+þT‘’–ßô™ Å„å¬C1aùkàPLX~ֿç¬oã`¥xD°: Å„åsÄ8–O°Å„å¬C1aùkàPLêùEæWBû«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«¸3°r.Á玊)poÀŠ>"“Â9Sj=9`ýHõWqã`}ÏÒ™üƒ0ý?!b|æÐ¡ÙÚ>ý+˜¬8ñy… õ¾l¬n·ñ+¡ÙR‹iúùÐl}6Ï„>‚Oy°ø ÌaC³åö\Á!y°Kû¬³×•óA˜‡fëükÿ2úÅÃaÂc¬ŸÍVXö»„ŒhŽX¿ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†Có%þaK2Ù'áÈñÉp?ßcýUÜ:X_y°Ì³Iìz ’ZVü¡ýUÜX²<–Dü“í3q8b1´,ûˆÊÙ¼žÐE°º÷!òÏáÖçä,†F}€|Ä2€åáÇè±þ*n,™,X»ç£Î±ZVðuƒymhI°ZÖ#ùEf‚Õp(&õü"óó¡©GFaªY±¢¯,“z~‘ùl¶ñça Ò©…`áElÞël$Z’N¿”m›—ÀÒiúÛð·¥³4Á"”W.|±†‘Î6Ò±2Àâ1Ö“Òé—²mÓõÁ»ŽOg3´…Dåî-Û6˜Ôó‹Ìχê Q³bE_Y(&õü"ó+¡ýUL°jù«˜`Õò V1Áªå¬â^Á2¿²È´žŸe‰1'nÙåWz¬¿ŠBÍï Ë6žìvv¿¨®vûk ¦T¾K$È ¾59ým¹«ÍÔ_ÅJ¡¬…wÎðºavš`‰ýo¹`g¶WïØJ–eÎ/äéj3õW±N¨˜ËþÜå4no7¬2Xa‚±ÄV,s]|›©¿ŠUBý6‚C{= [Z}W¸€åÏR6¬ß ]À’¬)–öˆ%v•²ków‚Õu¨Ø‰|ߊ}¼BK¬eeÛß ƒJÜáÁê9Ô#Óq;Û‰\œ^'ÒTÅí„b*Ïw[(8xo¬àë÷›vRíŠÛ Ť˜/%æ{¬¿ŠGk{É~¶äŸ˜³9JM«ø|ë<‚•Zþr.Û‡ìfË$c ñ×Ó„.èú’™²›¸3gvgfÝ®˜`é寛å?Ç/Ý-rx£Ãͽ=!/ÁõN¸‹Y$–°?õ©˜`yiäï¶ÍnÃû‘ §x÷òl‹ûÁ+’‘rT °–¶ñ+¡˜Êóc[(¶Ö¹r½.·Æ¬쮂åÏS b€tSQ7ŠI#Ÿ#ÖÍ ÁºšðëÖ„`eLø[!>!XYá÷XËK=¿ÈüJh¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò)˜Å½êL³¬Z>³k}tÁÚú0©ç™+†Ú/?Í7o²½®Hü¤¥ŠßŤž_d®ê/.’í•2¬ˆ“z~‘¹jè—s,eñ²ß·ĤÁŠß Ťž_d®*~2­8Mþ |‚µ÷aRÏ/2W 5 y°ü®PÂÙMUüv(&õü"sM°ïv‡H°Öx¬Z>=3zŠÃñÃËS¸Ê+Æ-î\ )ŤX|ç`ENÊÂCÅ–ÖD7yœäpú"ލââû+}"iÆ&Ø­gc}¬â¼]œ|"ênñETöÝ4gtp:ôihl=×|Ž|µHb Ô]d® oxÇ»•%MO47ÊŠSª©ŠA©7ºÈ\9”#VÐ>ŽXÚfcå…bº[üE•}æÍ¶0oðPáo…VÅÅÿ Xfâzý~hEã–Û8¡˜‹ÿ °šôQEQEQEQEQEQEQEQEQEQEQE=¤ÿ“žiŠZµXIEND®B`‚Bio-Graphics-2.39/t/data/t2/version19.png000444001750001750 2410712366325116 20131 0ustar00lsteinlstein000000000000‰PNG  IHDR€ÑüÁâCdPLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿàÿÿÓÓÓÿ€€@àÐÿ€ÿÿÿªªÿUUÿÿ´Wþ IDATxœí ‚«:šfs[µ¹Úšrwv ›êg4 ~ °@Óù2Ÿ¯ƒ0$NˆÁýKR1ÿª½dî ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$UðïóòRþ5íí_î ÁlÀ¦‰ °†ÔºíÂë&Pk£+ ‰ ¨µù¯ùÂë&²+àgßj¥?¯ÿüûR®ul¡0Àúƒ‰DÜî‚?/—fñµ¶Ž X0‘¸€ÊJpù·•Âë&’ à²ÓU^ÀÝS“ÑkX˜HT@¿›õ- ŸÈ.ØcÇ€Z»¶/l9 öì7!‡~Õ°"0‘˜€ÿIÈ-A@R5ɾ )$Uƒ€¤jT ’ªA@R5Hª†ë€¤rTM¢€ý|¯¬?˜H¦€µÿ„Hé\ð7’ Ý XûTŠ”ÌU¯Ñþã?l‚€¤jT ’ªA@R5Hª¦CÉX¹&à/4$A:ðèíè_b+A@`l"˜›P@ÝcÍ­?û‡3­Ïpº†€å £py‚Ýò“a"· h6ÒòúÒö±o½µ€öñØîÙ*|<ö/ý:1´€¯Å>#àçei-:ðO­eÐÛ'ÄjÿWÖ±c èwTËÓVUŸšÇÅ~Úï -_ÊõRÛâôV²Ça"Ï hv¾Jù×QÍ­ûÙ—oË•ý{Rض€Ú4{Úì¾¾·X5gþ\¼€:< y¹f°c'†0ÜQi?þH_5·w➡ݻC èß²™€Eò€Ú?å¼ßšV&r·€§·Åï :ƒ]¸ è1Ø]lÚÚÞïÄõ’]Y}¬) ¿þI[ÛÄz×aòæ½^²+«_IÀÿKèDdbBÍEÏï°îww޸׳%&¨·Î…- °ñ¦’puäåÀÍð´™‹m3Ÿ çpsÉÝ,ö3)EÀ­=§+z¾Í"ã̺šØ8¡S“)`–\²ëîœúëc}ƒ•³ 2·™«k%;,ô‰ "·€~FõÚÆ(þýð»V.mÁ‚ÒF>0à.'ðäjQüÒyÍ]º4õl‹Ø0emŸð†œ"‚€wn¦½Å¦­-æUÄè_b+A@`l"˜î½-t8Ô`ɰ‹šCÀ{`"¸÷ö÷kdƒ‰ àÞ[¼&‚€{oð˜î½EÀ{`"¸÷ï‰ àÞ[¼&‚€{oð˜î½å:à=0Ü{‹€÷ÀD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&’-àúøöÍþ™«¹ 0ÿëbKüµsçE@{!ZÿßÜĶàÁ&þúÍ·.ɰoB0áÒp›‡ sA?¿·b%Öœ5M9C„°m0©/à%ýþÙ‚±6çRÍ9iÎ`9%;_béjDÀ®^ðlÿW×t9üÓBÀL¤¯5‚˜\2­2ÿšÖ¿!sÆ£“æ æÒþ>Ä,Øg¶|ØòC6l¹òp¦Í–Àî¯F)ˆÈF@[ns ˜# ö(g_˜TõÚ Y¯«›Ó~)90ÓÛå,¿dëdV5^*ÙýÕèþð¤#Š£BfÐí²>?‹=]çÔµ‹ÍýDÉ®¬~#4¹üèúì ø¾;ë×fœÐ»«ßL×é®Ö\Õ$,ñ@Àƒ­í·Ù÷gn(Ù¥ÕÏ0RÜüæžX+¢|ñwkÃÂÖ²=!`ü†Ü“’‹UL\Ѭò;·À­»à2ú·O X©Ük”’Öù6.Ù¥ÕGÀwcÀÈbÐeJ³Ï‚ # D¤®€÷ç vi3ý@ß0ið†œ"RUÀjX¯0†€À&‚‰ 06Läy×{Ú— ZÜû¥¾®Ò靨;ÄÂ3®Ñ6Ó¸0‘:S¿”_nfÐÖÐÏMÛÊ\Ñr3 ¹S@mžÉf¥q=}§ ½>ÞÍ7iÊüÏ-FûnÈË–…YØÚEhÈÍ4.LäVµéÁh»Ó*+ŸR¾O±¶- ùY¯ ܺ­‚¼| íƒn¦qa"· ¨œ9þ –~êÚ¥qÐüö%×™6]“ÝŽ›°C˜Èc.Sw\føÐ7›R@­°W˜È­ꈀ‘]°^ÔR@ÛëÆIH—0‘[´'!Ë„íIHpåë$dÙïšÅ¸³’õ$Ä씵;y²æÆub\ï.̸›i\˜VÀÁjX˜ÈFïRÌ)ÌÁ-£o¦qa"· »O;KÀý›¾GßLãÂDðJÉ€]‡‰ à•’»iYÀ½nÓØ3L¤a5-àˆ0‘†d<$LäVÅ¥“œÂè¯pf ˜È†o3<}Ìàè›i\˜ÈSÞS`ýÁDØêô¤<»jôÍ4.L¤¾€²›æöÙUî¶¿jX˜ÈcÝ4·ŸÒaO¤‰6Ó¸0‘'´w×78§tÓT8Lä9ý|¯>"¶{ˆÎì}ÙyT@å^mçŽW¬—ÜòtÓŒ_C}3 yN@µпFôoõÎý£o¦qa" ¨#»`³Kvºnšñ/EFßLãÂDžPû£ÀåçíIHZ7͉6Ó¸0‘çT;£vuSsÀŠÀDP! °¯<)àAa²Ç&}3 yPÀ½»ûrŸï2Åf&ò €G78÷PsÀŠÀDZp÷>…¶jX˜H Þë|3 A@`ØGÍ+A@`óÈe`2O ØyÍ+A@`l"˜C@`ÁDZ0¼Æžë§ØLãÂDšн¾öoÒ}3 i@@-u]:Ì-¿GÀñ`" ¨Ô÷ ®Êv ¹ÖÅf&Ò€€ká pØw®$ìÑ’‹ÀDê ¸ª‡€3ÀDšPÇvÁœ„Œ ©/àŸ6]Òדõµ<ìÑ’‹ÀDØT0†€À&‚‰Ôp·»ðIN âÓg5wæ]l‰×«/ ¿Qÿ,±-x°‰¿~“µ;ËZç]'\Z"nÓ‘€[±kNŠš¦‹œ!BØ6‰ƒ‰ô+`¬Í¹TsNš3XNÉΗXº°]ðO5wM—«%C@LY,AÀ”õ@Àr0‘¼˜K°²—a~)YéjDÀákX˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁDX{®ý°Ã%E{½kF¯9`E`";ÆžŽ€ÀÐtÔá?n…ÍDó´•ÑkX˜ÈŽ€V²ÅÃàí¢šèߪ½&s°šV&²#à2O à:Õv«Þ ¸¼½æ€‰\Ðý.ðófôšV&’' OaÓšÿ³ –9П„Ø%mOBlcÈI°âvS`ýÁD›&‚€ÀFÐ>¸>xÀwðÝ]g5”Á½ ¿ê؉ñ §jñnjî[@7²öΰž–¬oÃ/Ý7xöRÍKùÑ/—)ËÕÍh™É…y¨æì×àî2TØ «µLý:1Œ€Ú5öÒô×.xm2ÜTí¬Æ N/Ìs5§ƒ‘µÃ!C\y‹Â-ÙÓ0‘¢ªeƒ˜ïŠÍÔP@×ú¬€Ë•m§¡NüBåáš³—Ü¿VÔ”o§ÕîÆ‰±\G=ß ¸ì¾Ô÷.x=ˆ2ó¶XsÁ±ƒý+sÅCÀ\˜HQµßGº-æ¿»ó3»¯¶4²_QQ¬eý:1Œ€Ê¥»m£Öï‹­–:¸±zsâvß ÖÜÞIˆ»+·w'Æ0oÓ.vSsÀŠÀDj h[À 3îf&RRÀç ¬?˜HI7C¡¹K;?‹aÓì²DwЃò›Ûjno=N“]27WòÚÅæ~¢d'«/¿o}HÀû˜‘ýŸÃlî~uÿšêÙŸáÏŸæª3¸ýùÌŸýÔ¶4zøW3—ÿÀ{³ 6󾃖×Ìef°2›Ïþ­»àåó+‚‰”ðmÛ¯U€¶éZÞ¾v\>ãæýpùmD@,ÑÌû6ÜP@3—Y]G@ ð­‚00ÜÛ䎀v®\í:~ èV‚‰лw(àÚŠ]p àn ø^^Œ€oµ+`t¬ä$d×Î ÷¶Gfá.8híIHx2`æ- =…p§F[sâçݶ€ÁéJxòösY-÷Psã:1€— #OB~ƒ…>½¿a– Ø&ÒŠ€›ðg¶ iF@`“ÀD›&‚€ÀØD0‘V ÷Õê£G޾™Æ…‰4) {?zyŠÍ4.L¤µ|F´Ö® 6Ži@@%ŸícÉ.xD˜H. ž|BêÚ»´™šV&R_ÀàÉÒ8L¤ ulÌIȘ0‘úþ-]Þ Tã_ËÃ-°L¤MA@`l"˜HUYtù8î­øôYÍ]€ù_[â¥jDÀ‹…±#%ýð0±ØƒMüõ›o]’aß„`Â¥%"à6ÏÆ#÷“€[±kNŠš¦‹œ!BØ6‰ƒ‰ÔÐo¬‹ÆÚœK5—°«T‰°ó%–ªÆ£’!àáÛ"-`抇!` &RQÀòÇ€˜;ïܪ£'G# >S˜Ã‹¹+{æ—’•®F¾æ€‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀØD0†€À&‚‰ °†<苨¿úw^sÀŠÀDâºn°GaؘHT@3HÂÉBؘȮ€Ÿy|;øy^©é˵>Ã^ûçULRsÀŠÀD¢nwÁfäÛ,.KÒz}y)÷L–ÑkX˜H\@ø%t½Z] X³0Àúƒ‰$hw³:xšx8Š»``¥ ${mö»_² – ‰ hÝ3$6- Ýo7EÍ+‰ ¸™Ý¶r-X0‘m+×ba€õI°ÝÂë&‚€ÀОh(7” òWÿ¾ ØC- Ð\‹± ™øÉŠÀŠÀDvüœúÚW×*7 e3…ÖLdOÀå¶û {×.?# °ÇÔ«€ ‰ì¸òië^ àÑ%ÁÑkX˜H\@#Ùæ,X™ÆØÃ—aÖ/}—%! 0.Dë&‚€ÀØD0‘¨€‡cLr5É^?à ©$Uƒ€¤jT ’ªA@R5Hª&]@BîHª€Ý|­¬?˜C@`ÁDXWšcÉÍúîè2xfôÙ󥻬9`E`"¹~^¼€Ú÷Q›‡–Ÿ>à¼ËšV&rA@mÿ¿tÓ4-àËYi?€€ÀnÐvUr.¾üÏì‚=& ^üLE@`O èÎ7´Њ °;4jÉîêëYð× ñ85¬L$[Àà2Œ6çÚ=Fßü^?À£ßšV&’+`[…ÖL! °‰`"¹>y÷y Ý Xû®ZR4HªIÕ ©$Uƒ€¤jT ’ªéO@2VzðtùX0†€À&‚‰ ° Ô… skÍ-Çè¾Ç>4èrð²*CÀ0wFw! ùKñÃÆ«WdØøpj¿N - ï6t"é£|ÙÞ÷JÿÙ±»m¨ƒsa"· øò}†ÍØÃf“öQsn˜ø?µ¶ukhû)vÁ v¸'õ* Š¨÷ÓpÉ*ÂDžÐì|Uð8­ÖkΠЭ…€:8óÐ#81¶€îFö€~™ÚE ¸ÐíÏ‚ÕúdÛz'†Ðm¼à$¤ƒË0¶ÕsM·ìƒß¹C èßêÞkX˜ÈCÒN«Ýv_sÀŠÀDnðô>´èÄSØÅ›Þr`yˆ=nNŒ-àÿ‹FÇ>#`|±%a¿ßü€˜îÂð˜îÂð˜H5×D'ž&KÀ8Ì]Ê[.“Û÷¯àgYÀØhw«‹ÀDp†€·ÀDp†€·ÀDîpÿí÷Òa9ç+\ˆn &r»€ãÔ°"0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀØD0†€À&‚‰ü"àÚçÁ.ß?ƒ-g ¼njX˜H\ÀO‡š,?oX!Ý“*Nº/à5¬LdWÀÏ<¶g¡ùÇô34£µ¼üÓ‘Í¢—þü´u6;ƒ»° ¶ ¡}kÞã'î´€Ö=¥Ä ý×°"0‘¸€ÊIö™3PÙQ>X=—å¥ ¨üMç5¬L$*ປ»`¥öwÁë ß-à5¬L$*à_p¢¡Ö“³¤ØIÈ2õo5Öí¥i]°da8VU@Z@`u¼±0Àúƒ‰ °‘´#»à¯ÃÁnjX˜È3†Sµø@75¬L¤¤€æê 2_ãù+0Ê\Œñƒí.Sþ–oŒÃyÓ 3îf&RT@ív¶ö"à×.x±Ñϰ\N4ÓÌÅ?_`ýÁDJ ø_A>þ;ÈççÿÙÉîbÿw'ujX˜&×°"0L®9`E`"w øùJ#ðó󞀻£"à€0‘»üL †€åjX˜&×°"0L®9`E`"%|¾0Àúƒ‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀØD0†€À&‚‰$ ˜6ü/ã{BÀè À X ìF7oS²æ€‰DÔ_cʉv¸V9Z&V++`8Zæ×è«Jå ×ÊXqÀX30‘ûd°B`ùºã¼¸€æ­Þ È€ÕÀR`";šyÜHÕ›ñ§ýƒÄ7j1`5°òž,T´m;…áØº1Î C ,SÀn ¬?˜kP@íôm¹“ÞýoyG¯9`E`"q?/^@sêkrp›Áè5¬LdWÀeÐió~-L ì ”r’IDATÍàªf´U×j7øe3…ÖLäP@½ ¨X˜ÈŽ€æû^7Ôù*àæû·ú…ÖL$. ‘ls¬LãG ìáË0Ú#¼, q!X¿0†€ÂvQÌOc%« NÀ‚Öü»\ ®ÞP˜‚Û§ 5m¦`]u.`Áš¨½Q'MÁ-XV@¬!™I×”¸Ü‚e[@ŽNÁºêü° €a·O£ÖõPaÆÝLmÃ̉ÕjÁKE,ÐñGgˆä ¸,Ù ¨ý}ÒÊuØ”o«9`Å`^@ó\%7}8µ¬€Úþé¤dZÀ—³Ò~‡‡™þiÖÿ ±éoÐÞ¨ï\|ùŸÙOsÝt¡÷ì‚ͳ'WU U˜ÌÒw´™Æ…Ù}ŸðiÁ=- ;ÒÔB@s"àà0×AR õöÌãµr¯agÍõüç넸±šV¶vôgÁJZpÓIHxÆ~Ëé¾ê\Ñöï ÁšV^†±[ûË‚/Ãt\sÀªÃDÖ]¿¹ªõ’ÕƒVИ^רÆí¥ÍV㯰m®¥íEÀÕÈOê6)àÑfXWý!gѨF~P÷Ó·œ[r—aШ§œèyEÀKÛÑ~°R®×íX- Ç€?åRªqöcÀ_ sVCÝŸ4j³…mët-í7L¤{¯Ã~Шñ’ÕƒVk&‚€ÀØD06¡€ºPan­¹åpÚßoûÝ÷ðe?T†€aî.ŒîB@ó—⇠U¯È¡áÔ~Z@ß]*¸…ºðåûþ©µï¡/Žÿ6-àË÷•2ãΙMÚG͹¾‡jmëÖ®_öSì‚06ä\OêU@Pï/¦á’U„‰<' Ùùªàa2­×œï{( ¿S;zôd»%« ¹_@÷p´õ.ZÀ ï¡ wÁîW®ïa†)b¬³'!½\†±­žkºeÔÎZ@ÿ¶û§k+yH@Ú `µ[ÀïžòÁl9ÏòØ…%ÜqW æoÍÁ‰47+Æn[N1ÿñ,,¸RŸ–ýsÞ}Ýœºë‰ñÜn0Yó[} ¶Õa«E¬æ.¾ÄÛ»KºG'ðk³‰Í´ÞÇ}ʼnó[çÕ/°SñöD,^'o»‰Ü.`|Û…Ï ¦¦Ã2œÐayâEE,Wx½0´€­;1¸€ŠcÀÆ_@΂ UãþÛn`"O ¨¸Ø®“Ø{Í+A@`l"˜CÀÞ`þÌCÛa*N¯ú*vsúÑY^˜ AÀ„·ö sSëMGƒ‘¡:(öó]KµïWoÜ4¯—ìi˜&ÁìÐSr|*ßۥߒ=AÀXð@ßÅþó+û•fÀD0ámÐn³ ¶ßûÑÝ opç$ÄîˆuA@`Ø-ÌÝ øl{—d%û.dx¯Ö†moKݹ50¦ýºº’¹—ÕºÈmß¿ôvAÀ<ØÑùë¶I„}mÝêÕÕî¨BŽ‹ø ,m»l<<„Eö™X¡“µ;q1 &‚€ o/mšÃÆá°wÓÃ%+7ÞžÐKÂhOÊK øŒc@iÇ€5`Û­dº³K1²…’¹—¨Š¬CÀ;anküÓ\éÙ `ÃD›&‚€ÀØD0‘¨€„<$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jþ?“G9×ÎIEND®B`‚Bio-Graphics-2.39/t/data/t2/version17.gif000444001750001750 5226212366325116 20113 0ustar00lsteinlstein000000000000GIF87a€ºçÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔªªÿUUÿ,€ºþ; H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏd©tQô@Ó§G—VÍZ êN¢[wz=[víÔ²i¿Žíz5îß·ë–Í»7ðàÈ‘?¾Ûöë寅ûŽ{zòçÖ¡_'X\»÷ìàþW^znëÝËSÿ~^¼zòíÍOý{ìîOÒ—o¿>|ãáÇßýÍçÜÌ!H]€ n—àƒ6ÈÞ€Vç_…fØ„R§!q÷Ib~bh¢ˆ$¨â‡î·â‰nhÒ~~øc‰(FxaŽ/rÇ#‹8¸cŒ#êä‘&)cDi¤’EB™"RRèc“Vbia–HN¸à7V¹eITÔX#jg‚É#ƒZR©‹nF¹dœN& g˜^Èf—r¢§f›î)&BòY§—‚执Ÿ€þùåI5 é¡}N¹(¥ 6ªé£\掊™h¥‚º©¨¤2‰¤©†v:ç¥þ®2Úªª¨Bênf¢é­fFJZ¯°ŽI(­o†ªh¦±bZ¨§Æ^™ì³œ2{ê«ÍÖɪ´³Žª,­×«åx#•™ë@iv’æ®·šk㤓f›ê°Èuûn ó†*ï¶zÖ{ê½Ðæ‹o°ñV ­¶ý~*0±Î’Inºêšv.¯é>Œ°¥SÉïÄüŒ1·«1¼O›êLJ<+ÈÈnŒrŠÞžL¯~ /¬+»Û(óšúºœpËØü¯½ãüó¾A›sϯ­ÒHí®­’2\n¹QGíÍB ´ÈÛ’ìô˜<‡0Ó<']rÊdGiöÁ^s½¬Ø]£$îýFuÃêR]«þÖD»½qÛ:·ø5¢G—=¸z€÷\¬ßÃ&÷Û…#.7‚§M1ã&+>räÖ^ŸãG¯í7èC?ùøßœ—êyƶöêúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üò´›ÄüóÐG/ýôÔWoýõØg¯ýö¾;ïGà‡/þøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ _»FR£ð€L ÈÀ:ðŒ ß7@‘p‚Ì 7ÈÁzðƒ ¡FÀï‰ð„(L¡ WȺp~ É_HÃÚð†8Ì¡ÝCÌp‡þ@ ¢‡HÄ"°‡ù¡—ÈÄ&:ñ‰9D¢G¸GÅ*ZñŠXÌ¢·ÈÅ.ÆÎ{^ £ÇHÆ2šñŒh Ì0—5•e©Séøfº8ú‹ŽMc£ÑJ—ÇÀùÑgx4œŸ6#G¥ñˆL¤" =>¶Œ‹…Ü#'IÉJZò’$|£!©0IšŠ  ¥(G9@MbK‰Œä&?9ÊVºò•;,åꢃJ ªò”¬„¥.wÉKÊrªåoùÈ\öò˜ÈLfùÇbz˜E¦2§IÍjÚ™šs’4#MmÓšà §8чÍÓi›ì&—Ð9ÎvºS™å´£®žÙÉUbòžøþ̧>¹çÈhnQªÚ§@JЂ¯ŸÞÔ"@-Ç:„ª˜„s(Ç *9‰Zl–wtãÖš¹9‹fΜ›E?'Ï‰Ž£—CéCUŠ:š£/ ¤Ú`Š6S ’¥)NCêRÁ´¡2íÜOåXRŸî´ èQ÷Ô•fs`:}jK›ªT©æ´§«¢é²’zÑ¡f”«-êÒl:S¯Æ´žVå)Uƒc³”©dêR ©¢¶g\®“kZáªÕ:bíÛ\÷†Ö·25°AÒ` KW°¾Ô¬5•]k#µÑdò±ƒèZÃúWjAŽ[¸ú X*UVjW–¹Ìµ¸ÌVt³˜Ýþ«–òšÚ[ýŠW"! »êZ’†Ö­b-m\ÊXÂ’ä¤Ru¯$E.4Í&b­•mc‡[ÕâF4bÍ­Y…&»[ÎÂv«Ôå­t^ï"Ö¸£ýìXETYI9Ì5ЕÕx5{Þ›ÎWrRjóÊ\4Ù׺¯­oY{ TëÀ¾]hy#K¤öžë4ü…ÜoŸäX£Þ÷sºµlsY“.ÿøÂ®pVÕ+\Ò"÷tàɉ;êªå>·—u¯|â[˜Æu-H&µ«†½÷¿Áõ,£…ã¯ÚxÄCþjz“|VÓ’‹­µ¥Údä±ÙN¤} mÍDYÜö¸n«ò„…uåè¹Éežqþ•§´duh¶ýð™Ìä­™Âiî˜çxÞÇmÌTÞsTç Þq¹n6²‰³låE“Xȉ^¡×Kb?Cuu.4„„×Û­N{®Ý§ÿiOâZÒwÖ矋žÜõãÍœê|®ºö_W=îiÝ<[óžùºw>ðK}Ðá«™îÆ6ò­þŸñx¿^­¾®nÑùî»þò<Çzù)œ÷ð+Zý™Þ{¤çNUòÇ_Þ÷ÿ>_á?¼_|ýé—èÇgL£À{Þæc¶·sÆ}˜Çñ6'í'bø×~å€h`3~«'u ˜|îg^iÞ7€ƒ¶€rZH€¦d€ ×”z!Hgè‚äåh÷'ÿ—ƒ(ˆ ~¸@28‚=(€È‚¥:6Xyy&a+È€¨&QCXp8…)x3¨iHȃl¶ƒLx„5h‚[¸VƒT„Q˜%˜„TH]¸4؆J(Xch~õ„q… Ć­‡*8‡ø†`È~þbdhˆyø€_èfö׈nx~px†|H{–W‰@X…Z¸‰r˜T‘¨ˆzøx—Xc8(‰)æ„f艃h„£Hˆ¥øf¬È…®èˆe¨‰„H| ˜‰‡8‰{¸Š¹x}Œz6ŒµHd?HŒR¨ŒÂR‡h‰ÀxŒAxŒwøG±ø~(Š¶ÈˆÚØŒ‰˜ŒÒȉÌXˆÖä(fÆØ†Óh‡‚H‹ìˆi¨ØŽh˜Ž§hŽòxhV਎âH'¸‹üø‰ï8‹ó8Ž÷ÙŠÉŒëøŒÂ6dç(gû¨I‘ô胉‘ÆèŒÃv¸Žé Ù ’ )’&éŽ(É‘鑽‘6þ‘iÐø‘ ©’ öX“/é’ñÈ“?IøHƒÜŽ,éf0I\2™Ky‹= ”;)”Ñx”8–”â—‘L‰•N”#’9)•I•qd•×”E©•gy‘Y©–[•ÛG“`ù”qÉ•)Yþ•fI‰rù–w9—nY—Cé…m™—¿h“ —|Y’7i—Šy˜}Ù•'ù•‰“-‰—»(–E–"ؘ3ù˜€‰ŽÉ™k‰˜¼¨82ø‘¢™±õ—‹˜ò—–¤Ùš Ù™%YB G,§ ©é“¬š()›†I›¿é›’IwÓbYxƒÂYœÀ¹—Ÿœ£é™ÍI—%T5f[¦Zyþ“_“R[fÛIг¢9˜h©—t9i›•ƒ.·¥t ƒ5¾âžJ÷ž¢!ŸP×a_ãš…ˆž½¹œ•é—„)žaiA ØV£t4ãt šWzcŸÛyœ°8žæÉ–°)Ä “ɘ+i © xƒ.VƒŸã†» ¢4G Î©ž:¡ÐY¡±™¡H‰o¢“Öi[ôé+JwŸ5¢ú LüI‚þÙ¢8¤‹X¤çY˜ÎY½¢Ø¹c?žvS3QnâveHúŠGJ¡Zž_:œ:£:©k7]2Z•¼i¤Zê¥Jj¡oJš˜™t,¥š7Ʀûé¦Lšži:–kz™ß¸¤*ʧþcª¦– §{úŸäÙ¡ªø¢aÊœ}š™Ѝƒª¨0ê™s~vŠdÏuü%nSµ¡[ºqŠ¡…꧇*§J©. _žú¡®ª}Ϲ¢‘JU› y´zª’Z¦‚ ‹\v5õ™7·õ ³gŠºj«“£Çª©ÉŠ©«ª¬_¸.ÐuZOF§¡:«„º¨º¬Iu«º¸‘Ïjªù§_Ùu;v|Øj©ª¡éЧB:•á ¦Áµ_åê!ç*«,Ú«]ꨥ*¯‰j”ñ*¦÷§]ì¬ÌE­Š¯µÊ¬©*®—ꯕ °š«ã cÁšk[Aà×®úÚ¦üú¯›§:±Ùú°k²Ûª­ìš¯¬ºþ¯M°)‹²+»°ÝÚ¬Ûª%»®dú;+ªz±!û® ´-ë±/K²êêŸTÔOêæ•Hb<ç;<µ Ë­Ôå­Â¨ªH뮃Å5`¶b;¶d[¶f{¶b[¬´äpâp¦…¶pK¶Åê{xuO·x ¶j‹2Û³ ®[´]«.y[¸†+·_Ö<2gYMK.‡‹¶ºõE(#;Zö¸g»·ùhµlc³Œ £ê‹÷µ–;ºxk·};3®Cºr«Iö:ª;¶˜K”ýz²:k¨K¸ÂûºÇ;^ÈU¼¼þ;½Åe½»‹½I ²E+²Gë¹?‹³º½Ë½|T½Ñ‹¾x¤½Ò‹®, ­§ë¼¥™´ÿÊOZ'T»¡û{Uùû½¿K0;³š;:œ«¼ÉKÀ*ë·ñë¬ Àƒ;´8k¿D+¿Ë»«ÿ«µâ+Á.›³ ÌÀ4{µ¬Àó‹Á‰I»Œ»kÁ}ˆptsw” Â\§#ì·™Z³ {³LÁ¬ÕcÕ«W ÁÔ;¾;,±L±%Œ¬9íÌ|Ñ.Í®^\@Ö±ìÔXMËuýÉIÌÖ< ×}&׊¼ÉˆLØhØšìÊ*mËÑ¬Ø MÍsؽ ÉË ¸»ÜÓ…MÙ‡íÖ• ÚŸÍÙ‹­ËÓL׉íË׌ڗ½Ò©Ù‘­Ù§mÙ™ Ûo­ÚqíÙMÚ“½ÈñÓ`-Ì{ýÕ}ýÏÁLÎm-Í¿ÍØ¿LÛ±mÛ¡ÍÛKþ(Ú» ¨ÝÒ¯íÚ­ Ù· Ý£-ÙÓ­ÜÜÅ Ø"]Ñ}ÌÝÑ ÞxèØ›ÍÞÖÈÜ«íÜݭݵmßÏíÀïÛÍÚ÷­ÞßÍߥíßùÝÉ×í×Ù àÕ-à½MßëÍàámÝûíÝ NáÍMÝ.Ýí­áñmÚË­Ûß© á.↌ßõmàŽânáóá/Îá#îâ¹íÛãœ`•œŽ¼Œ,à4Þßîã=^áúÍÈ8®à!NâNà)ŽÝÛíäÿmÌ¿ 135XZxð™71s°·â£s ÊzÕ(–×Â-æ,–Ünä^üdæb[¢«um¾å~P&ƒ æeŽçÈÞþP^à}ÞäÅ.vhVž¥Oö+°q!ú|Þ|æJ>ãCžä?>àhlälþÃq¤´DY¦<çÌE"_Ø8\ÞP­ç‚-ÖÆÑ6¬bì²énîæ¡†èù Ä$dçtŒê¥é•Þà0^ãANä*ŽéVëÜÙiY¾+vꌾԤ®Ö¼>é1nâcÜë.ÛnzþíH>í‘~âÝì¿äî=Û3êP8ÜxÜ{®êæ}Ü©®îcΫß^íÒ.î2îÞâ÷NîâÍÅ¡Ó-¥‰~¯ÔÍ Ÿƒ “ŠGÿòBóGßôDïôCoô?ÏôS¿ôHõPOõC¿õZ/õJŸõV_óaÉ$¿ÜœþôhÏõXŸö]Ÿô^ßök¯ö`/öt_õu/÷vŸ÷_Ïöc¿÷~ÿö}øqßò‚?÷z_øïöŠ¿öˆ÷‰Ïø‹oø~&eãæø‘ö÷’Ïù|÷žïø›?ø˜OúŸù¢Ÿù£úªú¡ïù«ø­oú²Oû©oû^/Æ­cP¼ßû¾ÿûÀßH3‚ã¯_úµú¸oüŸüüÎþßüËý±ý·ÏüÕ¯ù®¯ü×?ýܯýÅÏúàÿü'¯û…tö׿ýÙþÑÿýÖOøéßþÊßýɯþçûïOýî?ÿâŸÿûÿ÷/ÿÑI  v"x0¡A… 2,¸°“‹ˆT^ĘQãÆNN¼H± È‘I }=:víªqO\èöx»Ê«?)Þx÷ìͯGPý{ú]o‡}þñóMï{ÇϧýØsîºÿÚ P¦ãC0© d0ñÈ›ë)÷Pû(?‚@¦ˆ³(!ˆK°2ý@Q«Ñ;1ÅD D†¨Ó0(âPÄñE·“Gä"”¥qÄ‹D™“ÏÇWÌ«E‚t H¢8¤ð5‚žº‹Ê!¼R«þ¼ër+*RFÛ $í#ë3h¡4‹4³08ÅDþ(¡5ùcÌM挌sΟÆD2NÎô´/"(¿ËÏ7—¡Ž×V«ê‘S¬›ïeñÞYïÀgö›ÊÀ‰¦Uk÷D<\i¹]ü]½¿koƵS\ì±é¦»%4?.(¸í>ÖM2m.“f§mB“̧žE}Бd7”öz#‹½µn¸!Õ»5ø³êÝjÝ7WóöÖT7~w§’GŽÚ™Sw~ç'u¿äß=GY¡Ižœt“ÀµõxÎÏEn-Wê&Ù‰¬¾û”ä>ߢ_?ûyë7ßíØ·5ý5Ž{ÊñþP&8ïÅlk4 úâ7ÀŽ\,‚ ¼•ô¾}ýŠ~%_F„Aå,È~™!óô@ ¦~+ žÓ\ØÁ±˜…ß™á%tÃåP‚0 !]|(= ’P†4D ch $ N‰µƒÏO¨ zGŠUÌ›[ØDbM(ˆ"äb¨ž¨E†±„X„Зج5öЌǣ ôƉÅñ…sÔ¡¿(D:ÉŽ}T#„Æ(’ŒQk£ûXD9¶Ç,Ü!™Ç.îq.¼c!YÈEzå”Dä•õIQ”gL¤#;YCBž“Mô¢%³8Å:¶2Š«Üa*ÓˆËÂ’ˆx,emþ‰B^¶Å—´4Ù/ãKY&™ŒÌä.O Çanæ•y<æ ¯ÌdnÒ•Å$L6׸MeF²™³âf%uÉÉiÖrßl§«ÉÄxBœè,§ßyËzzòœ`ì'+÷IÌ€æRG,h/çYÆ„s¡þ¹'j͈BìŸø|¦?'JÏtŠñ¡À̧:ºÅ††ó£¦ì(*G*=r^™²lé(O*Ñ”Rs£ ­©;WêÆ’¢T’ªì)M*ÍœÊó¢i7£É΢Ú3¨‘̨@w:ɦjtª@­ªT‡ÊÔzô¨³Lª8WÓe&•Y5èVá‰V…Þ¢O=«ZùÉV‡~ªa5k(»ªþR¹”®&u+H£šVoÎu¯6½*Q«Ó¯’U˜õé`ÛšX®J¶®”]ëbŠYÃZ°œõ«fyQÇê´…«^ ZÏútµ¨ý«k—šÙÖ õµ­U[ѸÞ§¹Õªoß[Ûζ³x…¬PkkѾ¸„%-oUk\Ö"÷´¸]no©ëÜìN—·¥is±kÝݦŸÂ,yÑYõnw¼ÉUêw¥{^÷þ¶»ç®y5Yßá>w²âµo{å«_sò7½ð+ÁëU».8l¹Ì‘ÂX¶)L¯!“÷;`â2w½Ê0\ŒX÷÷¾š¼(‘¸¹žMÖ} ™ðJèW’þ dÿÉ0/̼3öÃÌ=q9ìßË–øÀ×ímŠ…fÝ?Ø2ùÒSëtá«iXÈ"žï†±Làøn¹ÃÚr»©d_ p3þx®«ϸk(Ê’M8$4œ@ÙÆÂR1†•ô·ÓmuÇðëñfÌ^ç©…†o\ÅüRKÎÏÌkÖsOܧâ9[¸iüš³œÃÖdoÒM›_×Êüâ'ôÏä ´S¿œjÝþXÑ!^u–ÍIfP/™Ôí+’ŠÌi5ï™×= µK(=åZÛøÍ$óT©Ùzj„~Ù»^&òg bD#ÙÄê¥õ™Gì5ÛÑe66ŒÁMì]ÓYØž&¶¶§¼ºpþ+Û¿Ì&©³éfXGûÐÖž7´mWpÏÙ‘õ·¯–înü× ‹ðKì|ëG‹ºÖ‘þ1¼Y*ë.ÇšË穼µlqÏúŸyÁïóM®®GÚáº>6·íf¬Õž6ë]V×Ê:ÇùQSØ3É~’×<¦8Æ©jïâÒ;è?õÓŽoÿó@h~÷^è‡ÌžêT–º¾w¾Ð®ÿ×Õ`§ºÇÏYö"ŸýÞ9W:V™î᯿=â6¿kØ9>÷$[=éxwæØoÊvi»ýæi¯8ß /Û©Ãß„×Ïã®Ø}'íŽO\n½gÚ É‹oºØƒNÚ¡eþ²“¯¬ç zºS…5—:Ôqõ®ø¿[Þî’< š\cÎ w3Wê;?{žSæÂubB'÷Ê#>ꈾ졟{Ü! r91©/‡±gï½ù9>æX«Âî2ß¾íyç_þîü”Õ0l*–d¿b+g¼èÓßþÛ×|Î9â˜ý¡<Õó-Ö3ýc¿ÆBk1»¿ûS5Ú»8ÀCÀôX>úÛ>Iœ¥û>ÃË»ý?÷Ã=ø«>š˜‡™¿ì›Àâ«@õ Áœ›ó 7«¿‰{Aþ[¿÷ÓÁäA$·„ë=LK–ññºÆûA <ø:¾ Ö˜±ôI=â#»ÚëþÁ%A¡kŒë;= ´Âì?SóÂÃ,Á+¼@üò»ÉBXÃŽK<„Ãè«.*¼/TÂ4¬ºµÃú3ÚƒA,\À<ìC$<Ã2ôÁCÔ„¢´FäšbrÄH”ÄI¤ÄJ´ÄKlÄóËD ü1LôÄO¶ÕxDªÅH ¬O”ÁRTÅU,Ų‚¿ú@ÅÂóÄñƒ°Å[ÄÅ\ÔÅ]äÅ^ôÅ_Æ`ÔE:¶\Œ2Ä«EaTÆeìEBÁ:š‹fôÅS¾Y¤6>«ÄëIFiäÆnôF[¤F×Ê/IÃDn:&T4‘oTÇudÇ[Ü Q3ÆìÄv¤Gp¹¾ñ5z ‹O4rAÇÈþ¨Ç€dÇp´­sÄ,¤.IÈ…dH\c<ÈŸÛÆ†äFä+ "ÑLj¬Â’RHŠôH`$HG¾ë>"›ÈDÉn¤Ž“tFLIf,½áÐÇ@ÔÃxÉ›tGWl°Bl¨“ÄÉŸlF¶`ItI üŘœŽ™DCã3Ê” ɾãC2t5Ÿlʪ\ÉxäD‰¬Ê ” ªTIšdÊ­¤È§T­‘ü@¨cÅ´T˵\ÉP$Ic˸tš¸$Km2>ºÄË´ÔÉòšÃ7|Ë£À¾K©ôÃDÄ¥”J³4ÀúªÉ8ÜHÁDLÈDDAL¤LETL;ü<žô¾Å$Î Ì¿¼²Î½5”Lo Àþ_É!iQŒ;±_k19MǼCÂ4ÄÃœÌÆd´=ÒÍVº„XM5ë5qÂâÂÐ<ËÛÃÁQ¤,*ÍMÐò$Í,dÏAT> … ¹ ‰‰PÜ>Ö¤åÀ‡ÙPóTDçÑÚlNôÌ:èÜQé|Où!J`ƒ;±™â6õ—‚ó`™¿ÿEþPæœÒQäÄ6Ó¬RØN¤Âëü?q»³›Y3‹t î¬NOC¶ìüMÍòPBŒÎ5Q-ºÓ *ÐÝÌ;%OíP=]=<,Ñó”ÎÏäÓõS7Ô\TÆT-½Ò>ÕÌ@=T)TDTFMLH5@JD5dEÀ”Ôö´Q܄ӕÓ$ÔÊiüÔ¹üÆðPÏDåºF5TTÅÒÒŒJ\]PWm6éñJa”U*½TK¥U»¬Ô==ÍU5UåóÕxÖXUL%ÕTeÕR]N+ÍÒ]ÝÒÖ|VT‘ÖÑÌÕj-×9ÅÖô$Ömm¦7uV®„Ö¹’q¥MeíVMVJåUjþDfÍV.ýÖŒ‹VoVmÍTGÍWMÝWcÕÕv]ÔJüUKUœV†5×QEWkmV:%¤Ýü"w} °ÌsÃu=Ø[½WŽ]'}/åÔ“ÍÓ„EØ…µ×b­Ùc§GåV›Õ×”M×5Ø‹åWBÕØ]D𥰮tQq8¨0BA;UŸ-Zu ÚŒ=WU}Y¡½H¥µ—ϸ õ9•íB“ÕÚ›…Ù?ÝÔÅYGù—4—ë$Â{ÓQ›ÑVÃW¤UX©½ÚkZ åK½]‘ß R%RPù4뻜KÁüëÛ:%[«ÅX¢Ý[SõWª5¢LÉ”kÒý‘•¯•°'4\‹ZžÍ[þÒYÀZÌÌZÈ Ì]!}P­ÁN¦ý»[ÔµXÖÍ]É\ÕUÛ³ýŽß£A*\5©•¤]ÐÝÛ5]”mÞ˜ÅÛÓ]ÏÕå]013…ûNù ÓrÛN>ƒZæ][³UèÅ]³uÙß-[QéBKßÒ _¤“Yç}ß~L[‡_{YßkÔ]óÝßž}^´^ùmX˜_nþu_à­Õû5àÿUÔú%`ÞPõ¾\£_FÖ&ßéE_†` F‘uܪ­ÞݵàÞÝØŸ-á¿u`°ˆÕÅÅ`±õ³YÕàœ•à^VêMa0¡×Þàòõßù}Un`v`#Þ&âˆmþâx}bpâ>_ûUb&Øb Æá+Þâ(X¶â)a&¾á±*àöâ.&c®â$nãé à8>â3_-fc.Fc¶$eᎵáö•^0ö@Bf>$îã4Öa:VcF^d=¾ã5Þãþàæ_Kb;†_IŽdGþâNd<žä^ “kÃå¥áMbÙ‘d7aWÆÚJîaK5’c$eûPQîdHÞdOÎcDæMEÖ&<»´‘Ñ3^‹=¾]C.@M¦_Nîe1†c^~æ\㙩žü5» nåfæ)ìæ:~ãP†f@ã-Ô ¯evæ"öåQ¦fw–fr~g2Bçkþ6‘á5­\.gyþfô{eoå`Öeæ!ÆÁ5w©ËнäYnèn\@~ÜXãx–¡'œNc¾3–Óæ¶ãæ€gnd‹†âþXaþåvvb•.épé–¾~åaˆ¾`Ëeg—~d˜®Cœþäq&è~^ižNi¡†gP––âyþéz6è¼ÔË©‚Øð;ºlH \¹|,vèLöé“.høa£ IK¼Š¨æ¥,–ƒ<ŠM\âv\hrUáþ㕵S îJ±FìÄ‘&k§@kl|Ç[±j…øk\¾i‘Îi“"?þ²°J¶ŽëeiÄŒL8º¢´ÂVæÆd*–iY¦éìrìþŸ|ë]öa·ÄÐÖ½<ìÍdÅ!Ææ;Ô¾ÉÑŽæÒÈÓÆlTžë±ÕjÊi¹nl¼ÆJ~ØÛ¾BÙIÕÖì­ælŠžf£¾§~jâ¾j¶oðžïÚŽopNïç^p€fmXÞn /ðæžpîî×þnúNðgfj'é¤^ï#kpzqñ~ð˜Žp ?poqÏpûÞpqqö­qNñ.ñ¥>q÷îpò Îq"_ñvn¿þqý=ò—Þñ£ò–.r)Or_r ‹rò–r-ÏrqϹoþîšðT^ªUfï/ò÷j»öò.s9oó&Ol6‡ï0›1÷ï2ÇïÖo?'s›&ðÿmBGó’ímAïsDßížhßUï-'o;7oKGoLGp:Ïs7÷î¯rN—oQgpMwqS§ñ*óuT·qJ_sR‡ð GrI—%‹ÓÖ{tUdYWqZwr<uU"ãR]w²’üs‰^tGhºŽô çnO¡o‹ÂlG¾G4e7#5'qWoua¿s`çqq7r[o4n/9ˆ#:G³³{´_þGw*'÷K¿÷LÏ÷M7ök²v¹˜Q9á”w‡w¯÷8Oø9_ø:ß÷SW÷="ºy?ºwÿw‚ÿÏ:9x&øTïøW'öRÿøq÷ísšxx_±3{¹.-¹yŸvFph7s@/t™ovi·«‰?¹£{³·e¸¦Ý o§÷‘Owj§p˜7ð†ïô~—qP/z¤·p£gq¥/v¢·÷’ŸôŸu©¯u®vs‡r°çr¦óy±¯t«Wxµgx¶wx¬wp­v¯/wªyºÇw¼×w¸Wr˜•ÂòÛõ´×{~ßjÀ×h“»{¨¯v»ßzC÷lÅžÖtŒ¸0{’GzÀ/™d{ÆŸ{þÈŸúˆ_õEËèû44ã4ÎkËz›4¥ùDÏ£&¬Î ÄÓ >w·_zÛ¯z¾·r“<é–¿=Qˆ‡aP„þ_yu?sCžóë|›ô3ïõ4¯ëMͺAó“[Fá\>{ćôgϺÿ›´Ü1}Ú½ýÁ‡xõ÷xÝý°ºçæ©ÛîRî—0‰ÿÖŸ~XÊÀ6üu?.:$8°àA„;QY˜Ð Ã…>œñ"Ä‚ 1ZäX‘¢D7fThòdG”G†ä˜òåË•(_’„)ReË™7Jìéó'P‰5e–,JÔæH?~ \ÚIéS“K]8}zp*T¦.¬þ:±jS.wÆ\X³¬ÇœEÑ¢ª©Ø¸E½FEèT)ȪWá®}è6-`œyfkôíÑ¿‚|–,ä±’5Nî[™/Í š7ûTܘ±aÃT–B•ôɬOUŸfªº¢R§£Kƒ51nǹAG–Kزï£Â»ÆÆZzµÕˆÅïbN|yxáŸïþ\ÔsèÞÀ¯WÏNeðîÚ3s.¿ûxèŒGGÿΘkTôî­‹?ß;åðíõœÎŸþxòý‡wûm×Ü[¨žuþ-hŸo "h yæYØÙ}éUÇoº[(„R(!ƒV ˆ¢Xâ„!R˜b€-ÆØ Œþ4^öâŒ^ø£P6êØVŽE‚gb‡ÿ9x£ŠÎ(¤YF&é"”=æ7%“5>¹eXI%—Y äþ²ðÇ3ï{óÏ;o5Ûxc=ÖKZ¯âòÒÏføÝ'±ç¦|ù×»MýŸí—ìýôŸsï>ðøëOpýêgO{ên„¼ó¹í{ß"I:’ƒ# ŒRïg˜¶%‚‰ õ(x *Ä‚‘Á óè·¾ÉA"ü_„Jˆ3²O…º! Päw@‚€0‚ÜßN4X½…è0ƒÒ¹¡öÈçA%Ðz'ÄáŽ\ø5JN†þC"ù”ˆ#þĉJêÄkˆE .І "9XŠ‘ bHÑÒE4n‘†m¤¡»hÁ4nñŒg¬ãD¾¨C‹è± Ò¡+Dh4múBšT‚dh5 :E- Sþ¥Þ¢=ïxÊ‘†Ò¤eñbSa Rn>Лm¬¥EéÏ}v°ˆÅüã(]ÚQ˜:uœ3ÅiM*>ž^R§KDkOXI æO®Ë´gS·)È}šô!¼èI˘ÆDr4#*bñ¸ÔaÒò®T$Q:OCÒ1ŠUìcAiÌÁæu­pm«ZÍ'TðtEð‹+@wJW+Þ•­-äJC;ÅÿV$tël?ûZÙÎ/µ»õéO ZàÎuµ¥Í›k#çÎâöˆÞ©­YtÜí ÷·v}æhíwÝkf7‰¸$]wØÝi1¡Äm­n•;Ý÷•7§¼ýizIûÝLÆW»¾Í-PY‹ÝäÊ÷½þÁmoZÏ»ßúz׿ŭ®zç;&÷WÀÜ ¯~Là*˜¼¥ðMlßñTÃvp†ŒZ›–¡V­‡)l`ô¦L+p‹oûb ÇØI3ñ…×›¿üê¸y5–n…;,âánÇA/éûãgݼv1ˆQlâ;wÈУJZ–ãºÀwÉWn²’­œà£XÌ .r™s|däwÍÔ5³v;\=JÎ0†ó‡ÑüV/TÏøÅ³Š£¼g@CÙÏNæ±›Ù{aŽ‘f*l²ÍmìâY>óÄl¦4› f5“yМ4~§œèZÆM¹ –µ–Œ-4Éyó‚KmcPZÖ@þîôŸ?­é‹×µ^tlRm•¡ekÒ¶f²¥ß¬kX[øÈ'ö´³©Þº2[È¥­ ¶gRlѺ:лn¶¯3]mÓûËÉVt´Gíã^ÓzÓG~UP½êyÄÎ4.wŸÇ}i|WºÛÖNw¸c½ìsï˜ÝßþwÀ)F,'Ø[¾JïzKð|O¼Ê|v®Þnküà%¦&ÆÝq}+{ä'9²ýMî«|ß,òÇ5rw'œÚ'Ÿx¿aîr“·¼ä5G²Î}¾ñ öü}G9©_Îg‹;sæÿ¹ÓÁ=t›=é<ºÑA.mœ—­xÆã©¢rN´âõN#;·±nîªû˜ßâ¾þ9„·Îvø8ntF3 v,‰._zoÓVtw ¾ÿÊÞF†ºÜÕNq¶†QG¸ ½8»û½Q«»îPò¨…u]ðÚ3ûÙþeø4_}éH_¼âOÀǯ\§p¢<ç.5u ³¥Mœ?ÔwÓÄyc+ßL1ë/}t¸«]òu‡½â/öñq˜=¾FmÄ«û÷>u‡ÏøÓÓ=nÈOþ󉹿ƒßíÐW[ÚÃOõÔŸ~ùRTýù°n_—íû…ÇùÛù¾{¶oÞné7¿ø™þmÇ ŸÖU_û!‹×ñÎ ó¡ò)à×éõa^â©íùÞ´eàû% ž^B“üYõþýÜΕàìàìຠ DZ`Ž z v`®Ÿò_þ±ß´Õ`r`sÙ j`!~ ña ¶Ù Îß ^ !&á áJaïU¡¦ Ž[2¡–žZ!b¡ !®Á_ò„áª!¨Í ¹á¢a*áöe!þà¢`~!‰Ñ!r¡îa†¡öùà!öaâ^á!ú™â"º Ba 2â&:b!>! 6"(¶]F"zâ ¢‚ $ª¢(fb(vâ(²á鸢,Â")¢~".V"õØ"^`"îà#ž¡)."*–b¶"'£þ'cã$Þ—/¶0b3bc2êâ1váj¢3Î"3nã*.a*f£Ê]¢Ì¡#Ì]c:²cŒ¹c;Âc©©#Éc<ÒãÅécÓñ#ðùãõ #&~c,†c/Ž£8êaB"ãBJ£=:žºtßÀŠÈ•c2äA*dFb$Aæ¢E*âjáÞj”WÄÑÜ+vd59ž$+j$J"äFÒUV”d‹Ð¤ÔÝâKºdKräN:$@Zà3RSº<šëD…–AÝõN¿¨ Nö$/æ$Oš£2R"LBeH:œk@œm ÇH«e%r0¥AZåS:å9®dSJ%7.ã)reWvåiÀ[¬€E×=KªþåGcYâå]^¤Oå:ºFÆ@ žÌä© &bÚ…×xd_‚ä^úåc:æY6ddê%Cæ`‚åWâf&æm8j#eNfLVf4š&!’&YšØ¡\J¿&R6Úkâ‰XŠfiª¦YN%5Ven®%U¶%\|æbžjî"nòeZBæq*§n -Ž‚ô ‚¥d2fs&ušY.§d^gz='Øàc=þ¤’' šç¢§% d`Z§oî¦N"çXöf^ž&wZ&ÈiÙª1ÄаI\T2ç{:'oʧmn§wNçÖÄšÔE¤-fïtÙ}Úg‚ŠYvº×mVh½\h€­¦ rªþefÛÿi(Üpèˆ h}¦¦‰ÊŠ™SŠš£¡´ìÅWDÅJh‹ÞÏ‹Z}6¦^N(‹(v.¨V@¿|J_Æ­¨qî(q é“éw(dN™¬„(†„l%‹Ii7g˜‚)[hwR©‚þ aÊ–Ö…°åèAi«ý¥{:é˜Ê)ï¡©….¨~bŠ–± àä©–)f¨žn¨•žé þfÜ¡å|è;:êþhr**ž&4é¢Â§™)ž–衞h¢âg{ê¦h|ªè¥jêªNé©é´- ¬Î*­Öª­Þ*®æª®î*¯öª¯þ*°Ò…PÚ±«±+²&«þ².+³6«³ÚJx‘ß³N+µV«µ^+¶f«¶Rž°j’´n+¸†«¸Ž+¹–«¹’N¬ž«º®+»¶«»¾k¸v+}+¼Ö«½Þ+¾æë½Ê+ Ñ«¾þ+À¬Àl±ò+ù+Á&¬Â.,Ã6,ø]¦ÃF¬ÄN,ÅF¬ÁžO°f¬Æn,Çv¬Ç~,Ȇ¬Èî*p"h¨ºè¨RèÉòhʲj¥’ê=ªç/ʬ5Ò¬JÖi«ÞéÊg¦ºjΪ˜-™2j¡šì«ViÉÂHŸ¶iIg]Ì£ªê˪ìѦi§RíÏ-¢…Vƒ‚hŒZØä?Jj¤âìÔºlÔZêÙîbÏšsàèšÄÛƒ>þmF4è<’íÝšmÚzêÎÎiÐjmÛ"½uÄתÒ@í¤BjÞšjÖrjÑRêÞbê@ ]Æ „:(¢D.Ú&®Ôj®Ï®­ÎVíž&팔Ž" ²ÌåVxnè6.ª^íæ–-ã‚.ÐnHDm î~®[Òm>âíïê-çª-ë í§R ‘îNkðçr@Zên¦tŽ'ðJ¯ðʮѺ.¬Â.ÛN®âïì¯Ö­ãþíøŠïëz#ä/ߊ.¢¦*ñª/ÖÒ.àroçÂoì.îõÊoù/€>îÚ.¢Œ¬0°ð¯º/ÌBdÚT¬?0Û“z¯‡–jÁD0g°ÓÌþSoiðVl°0 ßö†)L ¯0 —pï#`Æl·0 ×°¿p?Æ0ÂÚ°ÿð¹âðØRf Ï1¬¤¯žôpG±7ë%Óïø!°o1w±k±K®§¯õ’1þš1£±ç/øŽo[­ÿÖowï«1 Wïÿ/¯/ö"í oß jÃ1ùžïÖ~ïútŸû}nSMóîîŒ:­ùgоïËq_éÇ/2EÚÚYr&?YX MÃÍ…œÍ¨vÚqãqëñÓqWø©¤Èíg&GÊr+wV0ECÐh±®X,晩ò#òþ%;æ®—¬Iî©–~2ëïì|íR*ßèÛöEæx131+×±+Ëð77ÌáÂGá*rFs#ÿOÓV3¦P3ÈÍs(«³ýnï+crYìg-×›Ó.rëJsöèÅ]XsLté¾Hd%Ûó13t=‹±8ÓóA»éiÀi›B3'ß3omÛÓ^óÖåéV§Dƒ³>“42oòýÊ;ÏróÎò­ôÓÚ#ûélÒHÿi‡v³Ãô*0J3ò~ߘñt1³±F2ûŠjb2·/ÛÐæBgtCKõC§´I;t.Ÿt>ãòUSuVcuW[uLõT3õOt¿ÎÁ؉kàÅþ‰Äpñô޵N—gÇ@úÁì5_÷µ_ÿõL2`óµ!˜^6b'¶bûµ`#va ÛÝ6£õQ‡/ÿvYS+5ß-vb7ö`?v½6g6i{6`ƒö€DöèL6R²2DZVG4YÏiŸöVtv[×¶n+¶iÿ5j“Œj_k[v ƒjR£,é–tWìv_ÛIgû*sG7cÇÉs#&m¼ X^·klëpïoq#ïRã³lw³h3wo3vnK·zŸwsÇ5wÏuOÏöWCôõS¬÷m;vz«wt³7a»·¶v·!›oöÂö;1|3~ nãVyó·nû÷^ÿ6“·ßxþr†¸£/,KʂӶ~;8„÷w~6€g+†w¸†³8‡rf#7ßÅÎ[·®¹õZõÞÈõ8Çw]Ÿç]·¡ÍŠ´|‡5P—õ‘Wu’Ï·Yo5XÓõ‡õ§g‚{³}ïtw”[y‘C¹rûø–cù”¯g×â§r˜ÛuKyšùšsyŒžuk ´‹_vœ~wÿ¶8!¿økr—ƒù—³y Ãy›Sù›‹y8×÷Ÿ :W{y£ú£3ú“Cúãu•#ú cz¤z¦«ù•{z–+ú˜Ï쥃ú¨×l©»ù§«z¨#ø¡›z¡“ù«³ú©Ïó¢szl‹z¬“ú¬úªûú­kúþ¤K:}»ú¯Ëú±óz²£z¯#{°Ãº&;¹W9e#yµ+ùµ3ù’S{íÊ9q7ˆw¶sû·»¶Sx±[z³+û³Óú®3û²Ûz­yœK»XSú´;ú°ãú¾ {¾ã{“ky§»ûÀû¼£yÁ;ûÁch««»ƒyif‹WZûœ¯s㹎büƒ;Ïæ'VÒÄÇ[ˆHüWb{ÅW¶ws¼ßòù¹ëyŸ_&v;RÈgE/§Åï¹Ëk6ºß;±|¿‹tÖtÃaåŸJqÔ|¡,ýº )…ÏZ»ü»ËûÔÓ{Õ#|®¯^kb·pr%gr½q¨Í{=]B¯È÷nN_=Ã/þ|Ú'<»³}T½«ÇeÝz-ÚˉvÅØw¦[Â&߯½Ú·ý¦û»Ïóû¿ÿ¼xï0Ý®ÝGhºäýAËÙ—rð=kÀ[Èoþ¸w~á>çüì#> {üƒ2ýß#åˆî ¤Õüèë§\Š$à»ýåÃ=Œj~ò?ÕG»Àþî»þÉS|¹Ó9Îk¼Îç<‹Åx¸Ÿ ñ ~¿Cûà‹øüø›¥ yªK=ó[}ûc}ù³ÿùËú›ùúgþûÿüãÿþ¿½òû(@tØÉÅ@‚,hp¡À†¤‚bE‹NTˆþðáÄ#n R F‘$AúùØÉOGƒ~TžDiråJ.GÖÄY’cN›=eþÌIó¦Ï(‹Ê¤)TfR”Lg•ô(Ô¥U±N}ú(ЭZuõ–*X§ºæ<»v,WŒoáVLÛ´m]µíŠTÉöåT•s‘æ |wàU³‚¡®œ8kY¥ˆuÌs2YÉ—C>Løqe¾t9£Õìy4eÌŸƒ6—5ÆÅ‘-ÇæªæA˜-Y²Ä};¦î†·ûޏ Ú{uãÍXìrب3“v¾y5s骣^O½ÝjiÙÞ_Sç~Ô°vë˜Ã›Ž·u{‹éO{ŸS¹Àãöñ?¬o{`þï•ÊiëÏ8úŒëO>ÁÊ‹oºÊàûnÁì°;ÏÁÎŒp½Â|0¶¡»°:Njà ±[ʽGÔ5*zÛ ¸ÞBNÀþ†ËM&“ƒ©@û¬1DíœðGôÄ“pE‡Ü°H»SÉè*LòH'©¤PH#;e´Ðæ@­SÏ9M%UPBÙKµSCK½òÔW‘4QѸDEU±û ªMÒ.­ÑWû.õh8kþ ÓÅý…3O]s¥•ÎUc=+ZWmV[XeÕ•Ûm¡õ¶Ö[Q÷MYÕÇk»µÜPÍ­¶Ujé…²]lí}_våtwTx¥•wZrq—^tN˜Ø˜ø7Ý} nöÓzgÅ·ßlÿ…8àƒŸØb‡ f­ás;Öøc’¾W´%.Y呞X_%YQæŒi>9æ[ƒ™ãÖ~ Z衃6˜£‘NZ饑îT–§¡ŽZê©¡ç‹WÖùg…gö¹å”±öÚf—ÃŽxlž ®¹Ïöˆnû£™Ž;n§©®»n«Í1o Éoï(oþ;k•±þöj¿Õæm¸Ä^h·‡†[îÉþ›Æ×îË¥Æ;q"7÷´o WœkœCüóXK÷|ñ·RŸ#Þ š7Êi†·ÛqÏý6Ìy—Es­ÜuŠÃí|ø™Ë6~ÐÑ‹þìÕ/j}ù¸bZòÚç¶¼÷Ë'qçgÞcïQßdòwû{ô·†^.ᧇ«ú¢Â~rº·¿ûCøU-dâÇç¿òð|LŸù^Æ¿¹/z tÖãªw=û) ù›Z÷ ˜$éÝétt`“˜<ð‰Ž€ Tø¾.‚±“à+§2 êopÈ[_¿Âv„%!ûrèê…)ÌÈÉÃÊñyBUeÃ'®ð:œþâMGDÔAÑ]F›(Å-R±‡bô “¨Å3bQuV#w¸+21|^\ ëhÆà¡1Šr|#I¨Ç%â1~\# ³èÆC2‘vü¢ûÈÅ;BÒ_’|¤ËhÈ=Â1~š$%1fÉ ²Ð‘—Td&EiIÃ¥’•lå$1™ÆS~2–‘|¥)HJG޲й\$(óåI½Ýr•·ä%*©Êy r˜œ,â.•‰A`S–¾Ü$"ÛhMZÎҖδ#³ÉLE³:^¤f7±i-rÖP˜ã$æ2ÛÉ9oöRœòLg'Y9Ï2šsëÜ9]©On3Žù¼ç3뙳ƒê2¡ê|çþÀøùÐý%S¢ì4(AñIQ¢£ýf17:­Ž24¢! ¥FJÏx*t¤*½èGáùÒZ4¥öjé>Гš— )JoZMŸzt¦;­é@a*Í¢öt¥ß*éQ9:Í~&õ›Tµ(P­êO6ê4˜2åfs:Õ¥:”§ …ªH³jU›¦u¬cáªYƒ:¯¸‚5…oý)OíªÔ¯Âr¯]Åj[õªM¹²µ¯d=k¶ž:W£*–©Ô*6ó:Q¼Šµ°n¥¬`ÝYÖe&–°˜µ'cá*ÕŠ>œ‘½êdG«V¤¶œa­Ì¥Ì85éÇ?+5-i]v[Õ–µ§=lc©ˆÛ”é¶”À%Ö]þfk5É6&´]*q+KÔèJö·Ðõ,K;;ÔªöÖVuWr=³\Ý\×° ½ku/«ÝD™7° µ®z×ÊÝâæ@ o(Å›^í¥X/á síÛ"üî÷W&Ôl{m›Þ¦Z6µ½ït}ËØ÷zñQ÷ïq1¬£ ï7¿Mo…ib߀8€Ù]°tÉ{^ +Ø«)F°à&lD“øÂÖpr“Õ_…|8R"¶1¤z\bù:xµ.ß{âíy·hr)gäW˜Ã¶á¯›ØÄ°û˜Ê9"‹ÿÊd"óVÌ~°‹©»âCY¿[Æð9\áuÄW¾¯ˆu¤ãš¸Åê=r “þÜg%GX´nm uŒ_úÚ¹¾û]nÃÜãâÎ^nÞoCû\0£ÖЄÖôšÑ¼ÞìRË>Ô³_OCccZÅ…fõ‹ÿ¹iô‚¾Euwxêw)Ú¥¤i³Ëê3û¹É|½u±›Ò?w-½œ}²°mMì1;9ص&ó±§mli›9ڃƵûflsûÚÛ†v¹½ìpsúÕ‡f ²^d -¬XµÍã ‡îl'»¥Ëþ2­ñÝmǪ»Ù®ÅO‹ˆe¦ÿØ»‚ø¾×=ëNûûÒìM³«-^Ã’îfÞ´‰‘°ÂDkS{Üç&¹¹G®m}“ûä+7¹Ê^J '@¿Qxø;þÀ”ó»ƒvÉwq5Oœà´Ž(Í“5£Må&äa 8ºcþrž«Ñç{~vÐe=ôvk<¬ÍµQ}˜…s^;ÝáÁ-:Ñ!žuŒóYÜ(7ç˜>o…©é÷.û<«¾êŒçý‡{?ûÖù>Äj¿¿¿Ý–~@© }íWzË£Žu€ß]Ùóeü§ÑÎr˜›=í“o»Ë%ŸyhzžÝ~ï¼èCø¿›^óSWä·¡wù¾ÊþºÔÔÝíqŸ{Ýï^÷ üæñ¾úQ\õ§/¾ÀxŸ|å/÷3tþó¡/ æOŸúÌ×;ÛK?|ï’^âÕ÷þ÷o}ñŸüå7ÿùÑŸ~ð¯ŸýÇüñGÏFþöÏßûé·ÿýñŸýïŸÿý÷ÿÿ¥þpù¨n¾Pw0p°ð!0%Ðþ0wŠ+u*0qo9°=ðAÐ5p)íõ,Oí0U&B°]pWPÝoö nûPï÷\Ï—„+Iðó‡Gðúòúí¹OëXoñ5Ð÷ˆ°ç„ïꜭÚpöÜ i𠟰/ k ¯P ß/ SÏ «°ßM Œ ³ð»Ð ãP_¯RæîðäíF¶èÒÐ ÃPÇoév”ÅL ¶üX`K¨¦Z~ÅEØä$`Ëÿåѳþo?/ò6Rf$é°ìqM ‘øˆ>,eoÃL3Ñ ?‘óZÏ Ûg-瘮æ,MLê¢ÔœJÄð&…R „s"aŒ ›‘sþÎûЫ¹$åS¡"KÌëæ®/”ÑË‘Ðgë0¶ÎÁKF’M ¤ˆQEüƒoNyí?ÒÑ•ŸQÏÑñ Fð‘LôÑG\B7«c¥õÐûS±ƒoѱ Râ¤k+"Ï„"ý‹L¢2IòP@194ÏÆ. ;r )ðæˆkñ"[ÛDÑ^18ÞL!£¨i±¹ð&þ+#7r ‹’(N(ÕÑ(‹)—’#m’)5Q& öVa²*©’#˜Pù 1&¡ ¥òG,0ŒœÒ§ÑÃ2ùZð-yOoÑcÍ×p‡j,Oò*QJ.›ÏSS÷rË.·Ê'r'úö2_Ö2ø 3÷s2)³2ñ/2q}hòSÿ,P+‡]Ð2I³4Mó4}p÷7"pû2Ý03üPs6iÓ4cSw4óì:3ÿ>óÉ’Ýns7ks8¡/8Kɲ3/‹ó8‡Ñó+ÝÒ8Y3©ó%7f3))-ÒÊnG/“žó(ë ïr+®³8º2#ß0:•þ-)M-_ó)­r(¥s*ßÓ/ë“>ï³)ç“-7Ñ=»3*ËS Ô, TÇ“@ÿÑ@5?Ô Ô+óôA=+ì @±Òôàxòa•Þ¦tPÅTFí3X…ÔŽZT2.•M95=õPóôS [³4TT[†£ïªu=SU[—ÕYEµ-Ï[1T_€2³´±Y"SÿMϵ'n¯^³•[Çõ<:¯•1vçiÔ3³ü M”9¡¦Eè`Oí[iKa§7•uVU5RÇôY•ß„ëfÎ,Ëc –G¿Ó‚VoDVú° ÉOwÊ«_3W•ÓèØuK×c`y§W•â`'ÖÑÌRb[öðþ¬…g¥æEåO8ûbscmµ\ùTfu£9—ñrÕŒp6iq´?¬vU«óéUjK+9Ç–f£Öi"k­Öhg‚h£†m£hÇ/>ÝÊmÖgS†eÿOi£uf“ôi×õl·*R¶huÍ-R6Y!YgèdÇ)qWi›w^m­UlÓlqõoVd Vž¶$ç'€Öq9a—Uo{Ö9›i_;s‡K Ál½â]í‰1–,Âv|p÷Y³"_7ÕrÉup/j7×u‹—x‡÷^/ÖwS47ÏÒíjvtŸ7ƒ´“Z…×_6y™×\¥Wp»pÃ÷u³7f9—{-Ö{-tþzkKa9o{2S±Wyµ÷}MvcvcWfËöo}6î*‘Jñ—Ùü7s•}™Ö}Ë×o·NhÕ³TÓ'+V^›7]´[Á7}Å—ƒÉWÌÆ‘Fá¶L(¸~Ç}-X}ãTg2 í×|UïóL%ymWŵÿy—÷{w{w8…;ØÛî1ñX‚tIBCáÕ‡ï‡ø_{¸€õU‰a8ã 2ñFØM¦u›Nø‡•VZù~Ï—‹©‚IñH7‚³¸u¥ØÛ8‡5ø‰™¸Çx‰_Ø¡8xïŽouv˜ŽuØŽ·X=…»ø‚¿uc[8zøƒ9%è¶&ûæsQþYù2UWŽ÷¸‰ßØ“«Urp%“¸c¾VÑ2M…s÷36pm•6Žý¸Ž§8eÕ>Ey{óW=´pW·Õ¹]¢•Õ/“ÓU‘³Ò…Ÿì–Ïo/ækq9Ò儹5oðÅ8g¹· ¹±ó!í–j›Âä¶2ÃS>7¸‘ y•½x‘mœ‡™ŸYmsVš9òª‰ze.ŒóW›Z™ùžéRëÄž ×?®W‹9xŸÍ/÷ØÒ˜³sšÙ™Œ—*D9wú_N9\}Y•3ºB z¡–÷W  X–•¹“ãYuˆ’S9ˆ/yU$Z“ýskÚ‘ £è1¸zÿG]“™7–¹¹¥‡”çx›?›š©û8¥Yš¨]ª—z šª“Ú©£z¾¼ú«Á:¬Åz¬Éº¬Íú¬Ñ:­Õz­Ùº­Ýú­á:®åz®éº®íú®ñ:¯õz¯ùº¯ýú¯;°{° »° û°;±{±»±û±!;²%{²)»²-û²1;³5{³9»³=û³A;´E{´I»´Mû´Q;µU{µY»µ]ûµa;¶e{¶i»¶mû¶q;·u{·y»·}û·;¸…{¸‰»¸û¸‘;¹•{¹™»¹û¹¡;º¥{º©»ºõ: ;Bio-Graphics-2.39/t/data/t2/version18.png000444001750001750 2370512366325116 20133 0ustar00lsteinlstein000000000000‰PNG  IHDR€ÑüÁâCCPLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔªªÿUUÿï,þ IDATxœíÛ«:šF;”‰ÀïΣ2˜æU™(‰N`:´>FÄo è¶¾îãír«ÄUè_šŠùWí sIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©š¨€Ÿ——ö¯yoÿÎNLl˜kX@¥Ú. °þ`"q•2ê! °Ò0‘¨€J™ÿš/ °þ`"I?ÓøvPiõyýçß—v­c …ÖL$cüyù(¸4‹¯µul 0Àúƒ‰$BÉ".ÿ¶R`ýÁD2\6ºÚ ˜<4½æ€‰ì„øÐÈ&Øcû€J¹¶/l9öì•Ý¿‰jX˜HL@EÈ-A@R5Ù¾ )$Uƒ€¤jT ’ªA@R5Hª†ó€¤rTM¦€ý\WÖL䤀µÿ„Hé\ð7’ Ý XûPŠ”ÌU¯òl‚€¤jT ’ªA@R5Hª¦CÉX¹&à/4$A:pïíè1‰ 06LM( ê±æÖŸýÙ”†Ó}0,_5ˆ€Ëì–·˜ ¹]@³’–××ÒV|Ö[gš6î¥ì3²uøx:å_úubh_‹}FÀÏËÒZt&àŸ^ËàŸkÝôe;1¶€~Cµ­æ€‰ìm‚½‡f˜p3p‹ÿpi ÝÈ.f¼`´šV&’lµ—(!àÒÌ©uôúE@×X>T˜qWÓ¸0‘ë.3•:›``åTÁ0jl‚]ƒ‰d¨Ãíj0ŽŸ<@‘ŽVsÀŠÀDòOD-4zÍ+A@`Øba€õA@`øÏ»pŒÅõˆæ&Ø£%¶…‰4) {Ý|ZöhÉ€ma" hN/ºÓ‰Ê´€æ[8L¤ÿùÏ^`Y„SÚ¼î_Ñ}5 i@À¥Á[„{­U¶g½‹Ã-°L¤¾€«z8L¤ UlÌAȘ0‘úþ}n_Ø„¬¯åa– X&Ò€€À¦‚‰ 06L¤/ ƒµOß>ª¹ 0ÿëbsüµÏN‹€öD´úŸ³‰­ÁUüõ›o]²aß„àƒKsDÀm.ÌýüÜŠ•YsRÔ<]ä¶IDÀL¤¾€—ôûg ÆÚœK5ç¤9‚)ÙñKW#þpð’€×`é_]Óe÷O #0‘¼Ö"`vÉð¸0çDÀì’!`NavÏYÄò ,ö«ò°ksDÀŽ ¬?˜C@`ÁDöó礕ëC=¦è°dØÌ?“Nïöè°dØ$Ì´qËsˆÍ“ê‚o)ÿÒcɰ˜ zO…—…ím—ìi˜fÁÜS}÷=»ßgŸÛqɇ‰ `lÝÎZí¯Ü<û-Ùó0Ìxk¶°^@„¼\3Øeɰ Xê ÄnˆuA@`l"˜f¼=}¯bpÓŸ×r GçÍñÌÒŦ~¢dû Ž€…<{»vpÛóË›âv<šãŽ€;ëÜ—ìû;7”,±äj·°‚€V?/ûs–€ •N—lGÛ²~DÀ–ŒwUþ(°?•Õä¶’­*^,ÙÞÒ¬3Ìxûã&82Ûò= ž-Yzá©'‚€o0·À»­6"à­=§+ž†³=šªù’Å’·ÎDس0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀØD0Ö €g¡ô߽怉ü.`ÍÂë&’péb¢Ü«v¯Ëœ>¿Õëçî“¿å“qkX˜HB@µ>ôó¼÷jT/ûpZ÷éòý¿ÍÓk) °þ`"éM°°‰k}/Ãå9¡þY;~°Œ?}òÑLÕ°"0‘=½ZÊ?Ž;pÑr+ Zí5¬Ldo¼´rÁ&ØÍÉl‚—Aª6² VJ@·Ýµ›Z?ñ¿õ›`Z@`0‘+'¢–^sÀŠÀDXw¶S`ýÁDÒîù×´þ ™#•5m0•ò÷!ž‚}&;[~8 [Î<\€)s§å#°û«Q "²ЖÛìžPùtf_˜\ÕÚ Y­‹{¦ü\ÎÀLo—K°ó%û[ OU㥒Ý_îÏCgè¿ôçh*èw¾3Ó=Ĭ£¬rýI|¹^*ÃvÛj­o½N• ó«éÌîL¹vâÌŸ¼8]²‹° ÕèÌl¡”k¿L xêà ¨v¿•¬9#à±¼B@åä=SçaêÌ­¦“0¥®•L_(Ùß5X~ÉÜÛÀ¦mŒ€æ:IDÀ¼>FVÀü&9"`†¼[Íò†-5wf| æ*óþj¼ 3;œÙ ÎÚ{ü+ݶ€vOé|;q±QRÁ´¯Ìû«ñ2¬p hc¿¡ÔºlYû€n7"¬¬’? >ÞŸ°{ÏásôñÎK;±óÀüQð0¿ªÎÁÌõû§`N³§I¾ Œ†1C0ôëKÎüÏ-­þàx{/¦ÒëT™°õüÁØzæ ˜R×`îç`jížµ¾Å.^ND{&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀØD0Ö©€¶—çfþÊt$Vû]„íˆr¶ÓñŸÿ°ñšV&’~FôT1•×g†‰$Œø•5ÿ´€KEåßjœ&²' ÿG¹[Dnuí>ü|ª”ж®C•›ÍÒȳFÀ9`"Yúöiy ˆ—Fk÷»Wø³ÞÐN`÷Mh¸æ€‰œÐ>ÂàKÀÏü×ÓšÞñBÀðÃÆkX˜H¾€ÛFë»Å»Úþiœ &²{o´¤€«ªâ ds0Í&˜Žäè4Ld¼™¨ÍAˆÿÐýîÅA°Kó·gN®æøtb?5¬LdWÀõÜñ¥Â˜¶îÎÂŒ»šÆ…‰p-›&²?\köO+¦Ì?ÔHEo¾è°d­ è&ß½¹¥ba* èŸ9¯ KÖŽ€öz¯~ù«¾ËLܰʽŸ¢æÖSGڜо¥üK%kV@÷äjýrϰ_fb~^¶;›Çö_sþQÞëåã¦yí¸dOÃDқ୆âäñÈ5çÏ–ÛGÃûkßË';»(Ùã0‘cÃMðFÀ ólÝÎnÇ&°€x&’· vsšT@óèTáAÈËŸ+è±dÍ èB‚[O—™Øƒ¥î9q×Ãû-Y«†“‡û€­X0‘Œ+!a ØXa€õáR°®T2g ó5qù,˜ögíQìòÝÎëóS0ÛÃeÎ]ºØÔO”ìÊâ0B“ó.OJÀ÷ÝYo¼¶0ã„J.R|5]§»ZsU“1ÇwÖ¶_gßß¹¡d—ÿ¼€‘âžoΣ•ö˜€þÎì€'FZþe9ýãë¼ìÏY&T:½UÜѶM¿L9³‰Ï˜`­ˆòÅOÖ†…­e{BÀø ¹%‹˜¹ §vËî\·n‚Ëèß>)`¥0Õ(e-ómþ\²K‹€ï:û€‘Ù" Ë”ž> þŽ€B‘ºÞŸ/Ø¥Õô=!`Ö2? à 9D„ÑÀž…‰ 06L! °‰`"Ï ¸ÞÓ¾| Ä½_úë,úú‚½C,<âm5 ©#`ðé·€òàfe ýÜ´­Í½!WÓ¸0‘;Tæ™lV×ÓØwªPëãÝ|“¦ÍÿÜl”Ì`™™…­]„†\MãÂDnP™Œ¶;­¶òiíû+ÛšŸÕÚÀ­³Q:˜ÁËwÀP0èj&ro èÌñO°ôŸ®]Ío_rphÓ5Ùm¸i;„‰<&àòiRÀe‚/}³)T{…‰<° ^>ðF6ÁjPIUl¬!]ÂDž8Y>Ø„gQ¾B–í®™;*YBÌFY¹˜'kn\'ÆðîÂŒ»šÆ…‰ °a¬æ€‰Ü{¹KñLavny}5 ¹UÀØ}Ú§Lßô=új&‚€WJì:L¯” Øu˜H˦ºM#`Ï0‘†T´€#ÂDMð0‘§Nä/ÚÆaêkœ†&òÔ‰è“>fpôÕ4.L„+!ÀØD0‘ÇTù…ÉyvÕè«i\˜H}e7Íí³«Üm Ô°"0‘ú›`ÙMsû-öDšh5 yR@{w}pƒsN7M€CÁDž0ÐÏwñøê#b»‡øÑèÌÖ—Mð@0‘GÔîÕvîxÅzÉ-/A7Íø9ÄÑWÓ¸0‘g7Á€þ5* «wö¾šÆ…‰<* Šl‚Í&Ù ëºiÆ/ŠŒ¾šÆ…‰<» Vkƒ¶=Éë¦9Ñj&ò` ˜µ«›šV&òô>`Ç5¬L¤þ‰èe²ÓcŒ¾šÆ…‰<º NßÞ×CÍ+ytœ¾Á¹‡šV&Ò‚€ÉûÚª9`E`"-x ¬óÕ4.L!`5¬LÍ# §a€É4r"Ø40†€À&‚‰ 06L¤ûa족JÜ@8Åj&Ò¤€îõ•¾IkôÕ4.L¤•Ôué0·üǃ‰4  Ö߃ºjÛ%äX«i\˜H®=„ƒÀaß¹’°GK,©/àªÎiB@Ûs2&L¤¾€ÊtI_BÖ×ò°GK,i@@`SÁD›&R_ÀdwáƒÄ·jîÌÿºØ¯W#^0~£þQbkpgýæÔr$æµN»~piޏMGnÅʬ9)jž.r‚aÛ$"` &Ò¯€±6çRÍ9iŽ`gJv<ÇÒÕˆ€ l‚ª¹kº\-Ú `Îr `9˜æ,–ƒ‰4 àÅ\‚•= óKÉJW#_sÀŠÀD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀÚpí‡Î)Ú <è]3zÍ+I{B8{X@Ó}P…ÿ¸A6š§­Œ^sÀŠÀDö6ÁÖÃàí¢šýпթ&s°šV&’lõFÀõSÛ­z+àòvôšV&rA@÷»PÀÏ›ÑkX˜È9Ýx ›ÐüŸM0°,˜Èž€þ ÄÎi{bCB€°›Âë&‚€ÀØD06²€öÁõÁ¾ƒkwÕ\P÷6¼(Ô±ã ~ªÄº©¹oÝÈÚ‰a=;,Y߆#^º+xöTÍKûÑ/—Oþ–³;›Ñ2³ óPÍÙËàî4TØ ëµLý:1Œ€Ê5öÔô×&xm2Ü§Ê XŒœ_˜çjN#k‡C†¸ò…=Z²§a"e[Àe…˜kÅæÓP@×ú ¬€Ë™m§¡Ê¼ òpÍÙSî_ jÊ—hµ»qb,×QÏ·.›/ý½ ^w¢Ì´-Ö\°ï`ÿÊ\ñð,L¤ü&Ø^ ÖN@·Æüµ;?A°ùj[@Ó(ûUáÅúW֯èý^º[7z½^lµTÁÕ›ƒ·ùn°æR!î®ÜÞGÀs˜v±›šV&RS@ÛþP˜qWÓ¸0.ÅFÀÍPh®ÇRâg1lš—èº3Áùæö‡šK-ÇaN—ÌM•½t±©Ÿ(ÙÁâËë­ øos ’þ9ÌæîW÷¯©žôþ0ç ãËq˜Ó%óS%iGV_²ïïÜP²ÃÅÏhX@[•~^öç]õ¹¿õJž+™/ÞžJ§K¶£ímúµSKÀ¥ÜéŸ7K¬¢ç1>•œÀÖcëž-Y¬xw”lUñbÉ.-þÓêŸ7Kœœí-๒­uÕxÉŽ¿ðfûÙÌ/ÙZW—ìpñ«ïŠÒ•°‡Õ4¯€•ނ屸ÎÏâw‰Õ”žàùKqWrºd¾®Z/Ù•ÅçD4°`"l$ߟ·ïwÞo;Ù;—ð`oóvÚ·üôývSm'ØŸÍèNŒ#àÛ®ÌwÖoQ˜/]2<¹ ïįޭ¦qa"EôÍËçeiߟ&çŸÿV]ÞoïÀûõyÿ÷6¼ß~^ïϴ凉2¯n>òý+˜ö´¼~ª×vV@ó^ˆŽ»×jîÄyô"ÆGµ`·½3ßù³ßÚ¶€Fÿj¦ò_xo6ÁfÚwÐòš©ÌVfóÝ¿u¼|å"àC0‘ò¾mûµê±Ð6]ËÛWBÀå;nÚ/—ßFÔ€ÁÍ´oà 4S™ÅEÀqô;‚Qß:hÃM°Ý@&´SÐ.ã—€nñð!˜È=!»®- Ø&[À÷òb|뤀ÑM°Þƒ!\8+ÜÛî™…›à ´!áÁ€™J´€öÂNmÍAˆŸvÛ‡+áAÈÛOe´ÜwFÍëÄ@^.Œ<ù úôþ†=Z2`[˜H+nZÀŸaØ.L¤MA@`l"˜C@`ÁDZ0¼ÖÞW«ö8új&Ò¤€î5þèå)VÓ¸0‘TòÑJ¹.Ø8L¤µ|F´{Œ%›àa" ¸4xò ©kïÒfjX˜H}ƒ'K#à0‘&T±M0!cÂDê ø·`qÆ`"Cí"àÙiçPï=9ð™Â재ØÉ%XÙÓ0¿”¬t5"àð5¬L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L5,àN_DõÕ¿{ôšV&ÐuƒÝë ‹€À®ÀD¢šAfŠ€À®ÀD’~¦ñíàçy¥¦/×ú {åŸW1IÍ+ÉØ›‘l³¸ÌI©õå¥Ý3YF¯9`E`"Ƀï—Ðõju-`ÍÂë&’! Ý̪àiâá(l‚•0ìµÙî~ È&ØI˜ÈÞ> {†Ä¦´›àí令9`E`"WBl+×ba€õɹg:, °þ`"\ †€À&‚‰¤B‚aS_ÚŸýcø6`µ€^@s.ÆÎdâ'++IŸˆ~-ò}^] ¨Ý€–ÍX0‘”€ËmöAö®\~F@` ¨V5+I¸ìò)ë^ àÞ)ÁÑkX˜Hâ(X[×£`m?Z@`Ÿ†Y/ú.sB@`œˆÖ/L! °‰`"‰R ¹!Ù^?Ý ©$Uƒ€¤jT ’ªA@R5Hª&_@BîH®€Ý\ÖÖL! °‰`"¬+;äæF}·w<3úèùÒ]Ö°"0‘+- Pùž"zóÐòÜwYsÀŠÀD.¨ìÿ—nš¦|9+íØmÚ®JÎÅ—ÿ™M0°ÇT«€ŸOØSºã %t‡"ìNZ²»úzüu@ø;1´€þ­ê½æ€‰<$ í°Ú-`÷5¬Läþ}À£ûТÂ.Þôvv‘âöàÄØþo4*ö…3Æg[öûÍ߉ `†€·ÀD0 CÀ[`"Õ\ýð0§ŒÃÜ©¼å4¹}ÿ ~FÀ‘Œ}0Yˆ€X&‚€IÞAÀ$ o‰p": ;‡Hq{pbhÇ©9`E`" MA@`l"˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MùEÀµÏƒ¿Û™1ðº©9`E`"q?jN øy‹€À èžTq0Ó´€CÖ°"0‘¤€ŸilÏBóéghFkyù§#›Y/?üùÏÖÉì fìÂ&Ø6„ö­}xÿ0ÑZ÷´ô_sÀŠÀD’!V¹—Ôv”VOÀe~ùjDÓyÍ+Ù;ùÞkÞ¯|·€CÔ°"0‘ÝÓ0â ÄÌ)v²|ú·ë¶Ò´€À. X²0ì«* - °ºÞX`ýÁDØÈÚ ƒMð×î`75¬LäÃO•øB75¬L¤¤€æì 6—ñümNÆøÁv—Oþ–+Æá´ù…w5 )* r[{ðk¼Øè'XN'šÏÌÉ?´ÃµÊÑ2°XYÃÑ2¿F_ÕúÌp­Œ 5¹_@+v^@·ŸмU[°XL$Ù~¦q#UoÆŸöߨŀÕÀÊ x0SѶ% Ã> °;tc†ØI») °þ`"¬A•pдåzÓWyG¯9`E`"éÐ h}íLvn3½æ€‰$\6¯áeaZ@`hW5£­ºP¹Á/›) °þ`"»ªU@€ÀŠÀDšë½n¨óUÀÍõ·ú…ÖL$q¬­€ëQ°6- °‡OÃ(Ex™ãD4°~a" …%Q<ŸÆJV&2œ€n=ãU1IDAT­I Ôt!— o(LÁõSК6S°®:°`MÔ^©“¦à,+ Ö“É×”¸\ƒe[@öNÁºê|°#ªÈ¯ ®ŸF­y¤ï[g"à XVКÆJV&‚€ÀØD0†€À&‚‰œÐˆmnS]>ÑæÞU÷­‡ 3îjjf¬V ^:bŠ?:CäJ èTþ>ií:lÊ·Õ°b0/ y ®–«>ü´¬€Êþé¤dZÀ—³Ò~‡‡™þiÖÿ ±êoÐÞ¨ï\|ùŸÙOsÝt¡÷l‚ͳ'Wu }ª0'KßÑjf·}^ÀO¤÷´€nOS U¸Ï‰€ƒÃ\I%TÛ#TÚ½†5×㟯âÆjX ØÚAÒkiÁM!ái{•Ó]ê\Ñöï ÁšVž†±kûË‚OÃt\sÀªÃDÖ]¿¹ªõ’ÕƒíVИ^רÆí¥ÍV㯰m®¥íEÀÕÈOê6)àÞjXý!gѨF~P÷óל[Žr§aШ§èyEÀK+ÛÑ~°R®×íX- û€?årªqö}À_ sVCÝŸ4j³…mët-í7L¤{¯Ã~Шñ’ÕƒíVk&‚€ÀØD06¡€ªPan­¹ewÚßoûÝ÷ðe¿T†€aî.ŒêB@ó—⇠կȡá§ý:1´€¾»Tp u-àË÷=üÓkßC_ÿ-lZÀ—ï+eÆ3«´šs}ÿôÚÖ­]¿ì·Ø7.`lȹžT«€:" JϦá’U„‰<' Ùøêàa2­×œï{( ¯©í=z²Ý’Õ„‰<´ ~}ºÒ­vÑ}u¸ v¿r}‹À0Lùƒc=éEÀà4Œmõ\Ó-{ vîÄÐú·Ý?]X˜ÈCÒN«Ý~÷”&;ó,$,㎻b0kÖNÌ  ¹Y1v«ØrˆùïÏòˆÀ‚»!ÕánÙO0çÝ×Í© XNŒ/àv…ɘߪk°­[-b5wö%^ê.é\À¯Õ&VÓz÷'Žo׿ÀÅK‰X¼Þv¹ÿ4LtÝ…Ï >͇pB]„/*b¹jDÀë…¡l݉ÁÔì6îÄør\¨Óo»‰pðÌyÇyÀ³0ú„C@`ÁD›&‚€`þÈCÙa*v¯ú*vsúÑY^˜ AÀŒ·ö‚Š9‹©Ô¦#ÈÎÈP” {ù®¥Ê÷«7nš×ŽKö4L³`vè)9>•ïíÒoɇ‰ `,x Œïbÿù•½ä‡€'`"˜ñ6è ·ÙÛë~t·BÀ›L„Ø 1" °n`" »…¹{ƒmï’l£dß… ïuCÀÚ°ím©‰[s`Êß©«Ú(™{Y­‹ÜöýKo<Û»3]7™°¯µ[½£Úíõ@8ã"þË[/waÑ™}>¬PÙÚ¸˜AÀŒ·—VÍnã°Û»éá’•oOhˆ€%a´€å¥|Æ> ´Ž}À°íZ²?]Ù¹˜ÙBÉÜKTÅ Ö!à0·6~ƒ)Ίôì°Æa" MA@`l"˜HT@Bž ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5ÿ/ gT8€,¶IEND®B`‚Bio-Graphics-2.39/t/data/t2/version1.gif000444001750001750 4502612366325116 20024 0ustar00lsteinlstein000000000000GIF87aXËçÿÿÿ{hîðÿð€‹î‚îAiáÿcG@àÐp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿ØõÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2ÌÿÒiÜÜÜÿÿàô¤`ðæŒ‹‹ÎÑÿÿÿõî/OO¼wˆ™fͪ˜û˜šÍ2”ÓææúÿÿF‚´d•íÿïÕîÿ‡Îú¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀºUÓÞ¸‡ÿÚ¹î誼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõ,XËþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÖ „`矆0z4iϨA§½ú´ê׬aÇžíšvéÖ·eçÖ»7ïß¶ î®M|¸qß´‹#WœypÙΣo>úòêÒ[g·ÎýyrìØ]þ‚_¾Ý{ùó¦ÇwG¯]½y÷ÑÙ¯‡Ÿþºýùäéßß~¿|þÐé‡ßzÿÅ×Rhà_}è q ø`„ úGaƒç]ø „Vˆ¡† ¢‡æØR‚ "¨à‡¶Ø†.H¢‰ßÍc0Ú˜ŸŽ9ÊØc‡ÍÑ(ä(%(‘?©dBÞ¸¤“"BÉc’Rúøä”Vy%–Zn™\‘+º†"AcŠH€&•\ ×f’Mb'œ]:9§—xvy'ˆD‚™â@i"™¢  þ‰d3îÉ¡¢‰"Êâ›yºÉ&òéè’}ªh˜„ž¹"¡’FJé¤x2ú(©–Vjç¥L² Ÿ©þ˜ÚÉÒ¦dŽéé‘aÞ*ꮼ®ªj£¿žÚ«œ®ZX,ÇN(ëI â h˜¤jèŠÉfXmx×îˆê¢Ù"l¬ß¶î«Ë2‹bghj¤®êæ:®±ïz»-°ó «¸õ‚›/¾ÃÚ»è«uªm¿úÌï½ØÆ«¬Âw‹£Áä2œ0œæ¦kñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Çœ±I2×lóÍ8ç¬óÎ<÷ìóÏ@óLs…môÑH'­ôÒL7íôÓPG-õÔTWmõÕXg­õÖ\wíõ×`‡-öØa§9R‚d§­öÚl·íöÛpÇ-÷Üt×´Ù"¡m÷þÞ|÷í÷߀.øàqã’Þ„'®øâŒ7îøã+m8HˆGnùå˜g®ùæ›OþQ圇.ú褗nzÖž{ú鬷îúë°'žzGA×nûí¸ç®ûî¼÷ôо/üðÄoüñÈoÌ’{É7ïüóÐG²•wò¾óÒg¯ýöÜO½–Ö«„}ìä—o>ëi2Hðêv_¿ûçÇ/ÿü²»«0üt»ßþô÷ïÿÿoK_¨ªG´¿éÏAü È@­ ð~ôÛË“ÀZð‚LÚ÷¥"ÀM°:Ì GÀ BìYßû"Hº°„öã ¨Âýuï†8Ì¡sö=H…/%þØÛ¡‡HÄ"v¬‡¤ú!J|%CyЉXƒä0kILŠUTßKT®–*‹/zâš8F1Z‘Œ »"Í%5rQN±èÆ,Õ±hœØ¡Æ;Ò1aäS¿èÇ5nÑŽ€¤b!vH=62}Ld¹³§0ÝæEGŠU­u«'¥æF[¹Äc ¦ ]+ZŸŠVµb4­P&NÛªÓ)]Œ”G„ Ǿå3Á6_º#Ëþé0&JªôÚÕɦ<Äö̰•]_îpSÊÝ,–ŒØ ­,ÅèØAÖ_~ € VËÚÖº¶µfSþÑkW[ªv¶¸Í­n]»Áå¶¶Id!Ý€‹Õ«vkÀ½’h)jËåF”F!l\r3tÚ‚A÷¶»}mr};ÛéÞˆ»Ù ox{‹]íB |›ٰzRvÐçEŽsŸ{FÍ·¸L/æ¼Kžê¦ñGà/mã‹+ÜòÀå°‚yÃ3˜°ú-œ‚Ü»œRF·iµ½oR I% ÏæÂ‹;p‰ü±à.xÀËu0k¤á·XÅ'V0‹C cU›=Åä;w<Ò33“ &‹$‚ K.¡EãiaˉØ@èä°d,ÞíRyÀޱ–U@ÞßxÊ|{²g›,51W*•F&œþ™¡Cbx™øÄV6𗯻åwYÎóœAH樭¹˜íóãþ ¡6ó1µvþr ½:ùÁWƲeõ¬XA?ÑnMVš‡é˜0qÊ%£¬Æ ,´V³¸«´ÊëÆÒF5Ê ½n¨1;3Ë–º6EõíT2VKÒÕL2ô$åÊU¼6Õ9Æ ]‹mS½²õ$Ÿæè²ÝUOÙò¬k^Qùl“D›ØÔw³ù¬¸Nû®ÒÎ6ªŒÙ׳{ÚÚ´ÛÌ]ßtÏUÝÅv½ÁmïwKHÞm£·#ùMptÿ ÖSõ÷½Þ €³Mà´t6ÃýWhgÚàw·’¾6ˆ+Rá §x·þKòíŒßßñ¶tÝ<W“K<ä”ü`dû-ò‰ÿ‡ãjc9Jkó‚›á3÷ùÉmÄáa›è.çö9eŽZÓüéEÞÑ{žt_{èM:Õ.t¨W] (9IJÎõ¯;5ìÚN;³·mõ˜4á<»×˾u­Ë½ë¯Ò÷ÀÍ~Hx£}íj7ÛÁ¾ô·ïÕò;Òëþò»#¾¿X·.ÞÛ>yÂþò‚|Ž}qºÛ}îŸÿ»ã=ßx·çTÊ /}åÏ®yѧ^é‹üCÿx%»þöµ7£âcÏtÉçþ^»½ðUÿ{Vmžä§=éa?üÕ÷÷Ë·Þ#Îü×S¾ø ¾õ-þõÞÏžøÑçþö•O~ð—?ï²/qó¯~Öc^ûÎO¼ØGBöó³ßþâ‡>þÝ¿~MÿãýÇã÷|­·xûG€¼gxYg~ X}ñw øXéçâ&¤'úùg€(€$~r@B‚’g¶Ø~ˆ€肦w6Ÿ²gh&ƒ‚Ø·/ðç+x€òWx$!-k‚+ë’.D¸)ë¢&cB„ &Ÿ1„±‚º§‚9h0;È‚á1‚6X„…2ƒìÒ…èÒ…¸ò…ÏR†Jx†ºwøƒŒ'…ÀG…øsC£Iè,JH†Ó¢„Nx(µò,Ch‚jè†Æ‡>˜}„ƒþ7‡¬Q‡gx‡B†(|h†‘8(xhXhˆLÆcLÃ,¹ kÅ*ìÆTìÄK<ÇjÆf|ª3œÇ7|Åþ!ÄolÇìÀ#Ѷ W`üÇlŒÅ‚\Ç^¼Àøzˆü¸ÈUŒÆ—œÃYüĆ,+ÉMÍ4˜žkQùV¯ê–£ì³_œÆ‹ÜÆ„\À+¬Å HÉ$S ê‘âúNV5J©—íTÆ‘Ìî Èœ<ËžœÁ&PWÅc=;¶UÕÌ Ì­)ÄÃÜǯìÂ~ ËÙü%(á• «Êd]©TãLÍò9È×|ÇÚ¼ÎrÜÎżÅ%Må—ߪȻìËÎ|Îà$réÈ™LËkÐÉLÇÂüÉ!Ê=¶c«l+ —øTV'ËÊ’ÏðŒÇî¬É½ÑHÉÅݺ§±,ÅÍÍ=ÐÛ쥭þ¨ÛÍlÌ­¼É/ÍÑz Åß,É+­†7}MÛé$»'9­ÓÖüÓ¥"ÔQ¨B²Ò!"M,Ï,LÔôèÔº»Ó@½ÁQ-Ðò*½Pý!Y´FÍÓ² ›.•Ò4ÖîTÖfÝNæ,Qh½ÖjÝÖdÖJýÖl-×n}Öu ×A×zm×{×i}×sÍׂí×=Ø…}Ø€Ø}MØŠmØÍØØ‹ÙmMÙ“}ÙŽmÙv­P+᳘ýן-ÙŽ=ÙšÍØ¡Ø¥-Ú¦Ù§Ýڣׯ½Ú²­Ú³Ú¶×±MÛ· ÛµíÚµ½ÛH¥‘šÛ•íÛº}ÚÀ}ÜÄÜÌM×ÍMܤmÜÏþ ÙÒ]Ýv=ÝÊMÝнݿ-ݽ¼Ì¿Þâ=Þä]Þæ}ÞèÞê½ÞìÝÞä]Ó/Åݽ-ß¶ÝömßÖMßùØø­ß×½ß÷ àÞßó Úôýݔ߾àÎÖ ÎÜ.ÝNßÎà¸máþmà¾á.àÎá¹ÔÇ Jð¸Õ²)ÕIÒÓD¥Ñ ®Î&þ*/îÇy/H#JLÝ´1î ;þ J]-*NU,~ÕAýO=Þ®]=ÕÙË7.Ü6]âuô㈫¯\mÕ.ÌGY^aIžâ_½!MžÒT=ÒÒ–LÐïËÒ­ÌQü¸Ì 1,êRGÍYôŒ*ª’Ç6¸¾á«þK~å#ÛMÅçbµ-ÙÌ€>ç*-JâŒLtÎçGÌæüåàtËš«ÖùÎSrèßO»¢égí陾èíåèTêl-êׄêÞªêx‚OêcêëåL*²žPG*³!QIRZâ‘WíR9$ Šœõl"þ€®Èrì¦ì«ÁþWû­íì7Âìi-ÎÏîº,)ÔÎ#Ö¾ÖÉnìÒ¾éØþè/,æ1ÌÏ>E0¾Þ¬%îüÄ<)*ßÑïN”¿Qï¼ÎSúªï¶ÞÏ™>î#{ίaOcë!õþcOïoΙî4}ÆY·ë•üíî¶Îêðñîîð ï…ìm íÜáþïý\Ê{ª¯µ#_íî-_ð¯ñ:Æñ!ÿé#ò¬Ì”}f€ºF»~ó´ÎÙî« Od/¿P“nó=?ÎüîíIMFßçÔÜôïò+ñS_íÿœÎß#&ïôB¿% ÿïG¿n?Ïœmðs¾O¥ ì\ïö”ŽÖgñ¢^çbÏÏ?¢é(ßí)ß‘wOéÉÎÓó¼¬Óßä¹nïË¡.÷†ÏöÂ÷`Yî]NÂ0|Äoží6RT =è§^Õoèj­ùWjQÅçRŽ!œ¯òo.ñW®øŠÞú‹²ú:†ú\ÒRr¾è&Nû ¿P¤ï㦘¾_ù“Œîæ~ÒêìÒ ÓË/ÓŒþ|îmNõdŽÉf.ýÕßÅÊOÌòé"ü-ÍüÚ?ý#~ýT^üÑýàÍ%=Óœæëÿü–oüÄÿþ$ÑôïüõÿÖŒÐÂþ&­æ@  ,80¡À…>T‘¡D‡#^´˜QcCŽ;b¬ò£F‘M‚Y¤Ê'[¢tùR&Kš)SÖŒÙÐàNž=}þìi3çN¡0Î,z§Ò¤4—"Ê”hT¨R•>ÅÚTëT«U½:ÝÚ5+űbÃ’<ëèZ¶lÓÞ|Kµ¬Y¹qëÞ¥‹÷«Ý¼{õ†œ8­à¿M ÷Åz˜d[ÆÃ-y%_Å`%û½JY3ÙÍcVþîŒö2h®˜M'íX5ãÔ¤=OÝ:µìØ£]Ÿ6<Û¶î×½on½Z¸OÚ¾‹ã®9l㻕ÿþ}<úß龡Çþ¼úòæÝ½CçÍ]|xàÏ)o¯Œþ|ðìÙ¥“ Ÿº|Äêç›wþ}=þúôO_o»÷øûʾþ ÌÀÿüKÁø|P¿û¬ PÀüÆ»PAÔ ”KÃ1üÎÑC±¬pµ%<‘ÄM,ÐÅaLPÆ Y\ÆÜlKQ¸AÌÇuüÌÆ…ÜÉ•|‘É)ìQµEdÈ‰Ì Ë™¨ ÒÊ$½œÌ¡Œ²±),KËœ¼QÌ.Õ<ÒÍ!ÙŒþNÎx,ÓÌ Ñ¬ÒÎ>ùÎ"µlÓÏ@åüÐÐòÈÌÓ­Ý`/H#MhÒË mÒ£4RQÈÍÔ']’Ô&M5½FšÓG#KÓ…8õªÕŒ\ˆÖ‘hEÏÓ;E]Õ9…­ÐE‰”ÑU â”×/c¥4WX«rUVi3v×i{5öSdCý6ÕnÓ—Ðb©[¶§f#•UÓV£µLiµô xå­· k¢V\-ª–Òwõ7^ ÞEÐ×?Í%—á…Õ©ÜC1]žÖÅ— wý [| æô`Ž#²vߌùåø£€Ožwä•1îTâc)wXšiŽØá‰Ï³x'ŒÛþe7å7V‘oµ•àŠúEYe„×=:ãwƒF9a™s†ø×šÏÍZç`of¯çª¥˜j|£ÞXi¹éŒ•žuZ¨!z9åŸ;fv䘽Æzk­qn¸kÁ¿–E±a~Ún—ñ¹ñÅá~[Ú¼'uZi¨ï¶\o9çûï«÷»ó‡C¯Xl”)Ghc·ϼU‚ûµtê¡Û>›nÆËFá¡Ò}óÏEßxÒ ÷šóÒM'—vq“û·ÐÂÜ[㇗þyá GàzmN-éRÁ¾zê“_ø¾ÁW6û3 ¾}ñ§?ßúèAW{õ÷,þ}ýÃ7Ÿ~cÝç_ú·>`p~ýC`ðþgÀòÏt"Àˆž%¿V0~:‚ FD°AlÐƒè« A¨ªìe'äÚðDHA8™p!, ;8BÖ0xB7˜äƒù tCxІ Üßw<ØC#vP‚.œŠ eˆÄ†0‰âÉžgØAdŠ[,¢3øDÞð€gœo`hBj-Pübý®HC3b1‹lôac¨Á<²QŒ?Táˆ!.±" MˆH4®°Žt¬ÏËÈEr\ô#©ØHAÆÆ…pdˆ&)©QÊ±Š $8Æ<Î0%™ì#'O9ÈÊ,Rˆ£(‰8I+Îò‘´Œ${þXDK³”d$%›¸É^ÊR‰KŒá0w¨Ë%‚•¦tf3í˜E£1ŽÕûe8™yM`²¯“ãä7eÈbS›ä4g-è¿xf“„ê<Ž!õiHsŸÿh@:P‚TŸ¼ô';K‰ƒ6Ô¡ÕI5_ùÐrȡ¢hF5úPt©s. Å Hë#‚B”Ô¤'EiJUºR–¶Ô¥/…éoÙA”‚2£!)LuºS•Úš•´dCrÊÓžþå¢ )e†JT¦6µ©¶ìG’TÏyÒ +YªSµºU®"¨Ä,bM/²K!eµ«ZM$TǪȳª5¡ UŽªÁ³Öµ­@±8þ®€ÚÕ¯-jF6XÓ^Ð7f¬N‹¹•%¶µ¢ýtP_;Ù—º51R%`ÍÂJYÎrµ”YÕ$Yå„ØÎ®Ô²M!-QOk5B¥¶´‰]íU0‹¿ºöµ·MégÅ:‘82·.íLl«ØzÖl¸¿íjpÕâÑ̪i³È…nn#ºÛdÞô°Ñ ìiŽ[Ùâªi»Øeªro2[ë¼o£çE/z#zÐ-‘'½ï/EàÛ]Á×¾çÅ+7›k#G¢Sœï,gÏùòîÕ—þEp*ÑhXø¿ *ð•ì`Íž>pƒï©_Új˜Âεð‡ùbúæ7‹ûÅO!=rL„à1D$Æð‚écþ'ÂÌí°ˆzË“ÒVꯇ3ìÎ WX•'ÎqZ†ÈHi“ƒ¹4È%jL’ñ@†±‘e,Ï 9øL²\,ùDVªx*å}Þz‡IÝë~yÉãt˜Ÿ|áBW9· ™oVUézÃkþô˜ÓççºÓ¡~õ®‹½ì)Ç5º%îó‹s|ã[†ûÌã.p©³<Å"·9Ö›žw­3Ýì'ò¸Ñé#Ú깈LÉåÁv´û½ñŒ_ú†‘lwt*ÞòE<5ÏÏyŒ³vëc'pÑÇ„Q°þ»ÒÄ&æL‹iL_{³É½®úè ¯÷Ïožö|õ×ÏŸ%‡q̘góýÈj@û“ß;çÝþóÚÿ½@½®LÆ=ÍÀ_õ¥}ýøí·Ÿ}ß¿O迉A°ä-.U=|í«?™§Ç{øß.wú[ùiŸüÚÏßj›žÖi~?ØÓ"Â#ŸñÛ›¹ë¼t¼›S»œó'S3I{½Äª=ó¢ L¨ø=ù{¼ ô@Ûë8Ñ3?Y=p"»ù3@æ[@ðû@ÀAîAå²?Aç»?ÜSAɃ6ý‹AJ>´ÁìÀÌÁ/k@°s/§ê>ßY¾¶CÀ&„,($¿L”óSþ¿¬CA-dÂæ{>*ü+|*,ÜB2 ÌB3\.Ý‹>1 /Åó¼LC/¼AtBˆ;ÂÝ+«+<Á"TC <Ã@¬Ã`CäÛÃ1ìÃ;LAEäBn‘•(?,+ü±A$BF|Ä.”Ã2Ä¿tÀ?ŒÃE$ø™1ADKtA6ÁDŒB:ôËÆ$ÌÔÈÈœËN¤ÌnÜKºZÌRÌH®ÍþÍŒÊe„Éž¹ËϹ҄ÊÀ„M¹ÔÊÔÔ‰¡lGËô!ÌdLϼM»œ:Ô­Q@ÝR4¥Ï@½Òü<ÔµPCÍSôüÊ%P »/üj‚ZÏ·ZΡx,1{/p‰ÏêLTúôÓºü®ÎZB‚RŠ’½Re)pÜ'‰¨(ẫö2QDmT]Ñ!}$V¥¬‚\7ùPÕàÕìú£c3Áêã§ËL.O­RP½ÕÜÌUfÝUð"¬EŸr,@BΉj¬e¥U=ÓóÄÕ ÕÕqVØšÍÞôVð,¸u=ÖDU,US-uÖî:WÀZÂ:¼×“þ‚CÙkWÏ’V-Ò$}ÔÿœQ.¥V~MWšrW> ©Y%Tq…Vr XIT¸ì²ù:Ø˜àØˆÔz¥ØB•×eÓ‘-ÙO=Ù:ÅSï„ÔŽEY[%Ô”mÖ•½SG]Ë=åÑgeÔ™•Y‰Y–ÅY—5XvõYEÅеS2%Xž%Y¤Z›eÚp5Ù9ÝÎ¥uHµJ¡MЪeÒšµZóäÚŠÕÚm=ÚxýÙ±¥Ú›íÚPÝÑ­eÛ?…W¥½ÚºÛ¸}Z¨õÚHÛ‰Ý[˜U[š%ÚÐ Û2ÅZ»5ܘÕÛ¾ Z|Y£U\´]\§ÚÈ¥ÛÊýB‹ýVý\Ëõ[Æ•Úý[Ãx[þ³õÜÆÚ–ÚÂmÚ£ÕËm[ÊܳíÙÓ ]ÄÅËǽTÙ•ÜÞ…ÝÖµ]Ö][ÒÖÍUYáUÝÀÅ\¼í\å-TßýÜÔ]^éMÜÑÝê]òeQæM[îÝÕýZÚÞ¬í™ “¹)ô¥^¹åÝßÞë^çÍ"˜ õmûÅÝ÷Íßä]ä^øíÇÃÑ›‚IšÞ!`K™í1ýµÞýýßà _æÛœ-_×yÕ©}©›Õ‰– îànàÆÞõ­]ç•ÜùÍ– 6›‰ÐàÄáà¥Ù–øõ^èE]ñ­aŽÝÁ]]Qá“aánž¹Q_åÉa Ü.a$_&Û &þ™²ña{¡š ö`²þ%áæUâîÍb.`=ubí¡_‡Pàz™›‘"f_¾]îâï5a÷}Znãf`;fâ$~ã.ÝíÝc9öâ<Æâ/a‰Wæ1[>bøÐ¥Ìs¥¤ eN&äqÝå‹ÖÒ#¶Þƒ¨± ´]f%PE¦5¶Ýd]¦i‚ )âÜ@†äAνf6Þ‰%6‹@VÖ%=Š"?ë³›ÌÉLþcþýQjŽ›ÛS¾çGÎ^ÝUå“T&ë¬`¥o.3ã3qü)-þç4&›f‹g{^fnÖeÞY‚ö½2ú"wæ%1EÉß{!qŒä”F¼K¾V^çêêç[ÆdKnâTîèJ¤<è–v1iZè(ý³+制hÿ+f“Ws.çB–dÂ=å%‹¦'Ö_+$Š&bœ*'+5V{GrŽå·l¢o¦¾…¨|UfAöê³6NO¶ºKú¹ëe€VkM¦i=Îè¼m.³žmëMVé¥껆hòµi¸]7¥ŒUL½ªõêê©Î(@ƒeÔÊØÇflŒüXû8ªý›ìÍF:B;gŽ6ìþ7íÑí'+"ÒFí70¤ÔfmÖö©e QamíÙ.m÷‹l¥íÜÖíÝ&íצØ*ÞÎm½ª‚zªº7áVîåfnÚ.êNFçDîÖ6mpnjnÕŽí—¨èì­ús¯ìïÙN«_V¤ñ®í2(ÿ+ÙFï÷†ïôN?Tvj™>mꮤëî ïîWdåïW]ÔˆŠï÷^,Mõ øÖ«¹~‹€ðï'ìú>bëÆoì&o gnâÞïæþîÛNUp£BpSþp7qÞ.È.lÓÝp׎2ý¾ï q·í× —ñä&p.÷ñ géÏ^ñí¥pÇp#ñåÖþð$WîãƒÏÔ(ò×í%òÇåW’ò,—oì£ï5•ÒÎVìŠÖX%ËÔ…=:Î^líêÔ+k4wói.X ÏeºögÁNk;Çh´ÎóµŽîOæñ9èºVê¯l=Ý%.‡(©§LôhtDyôœiô…(„Шôœ(©ˆ˜t—¸ôAô:×s>.^é~ˆMoôGoÉM7ŠDŸHŸ U÷W T×hRf<u¶öW„puS€L“ öD‡õƒ0)IÿõGöa/ö‚8ö_Oö`vfgvVOvV?©„Xôö_`çbïôm‡öeïvgWpwm_v‚õ;u@ÞsBþ'Ùýêõ‰Èôo‡vt¯tb§ T7vlçvn×öv}ßvb/x}׈K‡õq7öi·öt?u‚v~_xhÇw†vw÷t÷t\—w:ôz'¸HÏvÏx…÷÷Ž8©WçøöŒ×taŸô–/÷…ïõgø•÷viw™ÿù}/÷—G÷ÿxiG)gj‘Oæ¿l!—sJfúˆ·zŸïw¢¯z€?z†×xj eWyœWx Gy‹ïy Ïyµßz‹'ú²×ô¸Oúr߈wŸ÷O·o¼¿u©÷ò:÷õ«W{–×ú˜ŸöšŸ{e·‰S÷x„xˆgø¬Oö£GüÀú‰çøŠŸù‹_{¹¿zþ±/vZ·k6¿é™u>mWtÀøŽ§y|÷ø¸7÷Øoöh_|²{g·öL÷ÝWvÖgû˜'÷nwnW÷âxi¿v·oúxúwþCîó¶f<LJú  Ë'uÑß{À®õ7>t¹^Ûs¯~^_uÔ×{¿~þ¨ç~¼ùöoþå‡z¿ûñ/tÓr^¶u@wzðg~þÿîHР„ 2lxp`Aˆ# ¤øP"ÆŠ7f¼èÑ"HŽCŽùÑ$I(W–l©òåI–0SÆœ)ÓcÍœ4wÞ¤©³'P—8y %jSèÏ¢AÂLʧèRuú´*Ö¥WµfEþÚu«R¯\dž-kõ«Õ³dÁ6EëV«Z³o׿œj÷nܧy÷¢åK·ª_¹pç²Ý¸0aÄ/,Ö±b³‡¡â­Lµ1äÉ€#ŠÈ)âóç‚ û$yèiÓ©WwÔÌ:³j½±]¿¶l{álÚ‘e ìL³3Dà„ëÞ]¼tíÄÇk/‡pvn觋߮ôëÃ?÷Þ>toð‰GON·¹q‹è©gOÿÜ|æõÊs[¯^^;ûΡ‡çÌ¿7g"´ç~È8Ý€÷¸ jâ'ßyôÕg›‚–š~é—’€‘‡ |ÆY(b‚ :Èàˆ†•Ÿ„VVáŠ`D†¢õ'R‡þß1£Š!öx"{>öÅãB2ö ‹–ÁhdKÀq·ß†Ý 'à”;2YXŠE¹ä–G2Èå—N—ä‹&†©]hrÞŒâm—ã™]>H¤—YÖIçcqNf§d-’9˜|¶ueZxbih¡„j©ç|ŠÞ$h¢HþiW ˆªgé£˜æ ©ŒšÉ©I nªé ’N*U¥Ž~7†­ºú*¬±Êºf˜³î×§I¶êJkV°îµ«®£ªZª§,[—Ÿ§6”ªœLùæáÑJ;-µÕZ{-¶Ô~èR°OÙŠ]®ÙŠ;­p¾Šã¹ÞŽ»n¹¡’Šì±ŠJìžÊ¢úé»=ûݺýú{í‡ß–ø­þG"ü‹m¹¾Ê¬ã °°ÍFZ,‰ñº;¦½1KqL±>ü1»®J¬%¬ k‹á7¹j2¹s¼™ÅàŽœr|kŒoÌü9Ì2Ï-ÏllG÷Ü.®™ Í3ÑôæûÞχæÜ Š6/‹sÓ5íÛ[ÏY¿±íË4c=4ÐÆÍrÒPÏköÒO/|žÔ—Í©¶‡;kM6Ü2Ã4¶ÉeÃltÖz3ÝuÑ€;]õÞQ·­ÐÆ ,ãƒG¸×o:.rÅFOž.¼»|öÙk×|xB‰#ÚùÅšófzæ‚ÿ¨zá¤×­4Û ÿ½gÚ°£~éë¬G^»î»~{¦Ëäïh?]<îÀÛüì¼3Ÿþ{ò†¯çóÊŸÞûõÅWo¼õØO¬}²²‹Nèöåó½ù¹§ß=úÊMOüùÍ?ôò³o¿÷íϯ~ø _õúòW:.~÷+àþH¼÷Qπ̞ó¸=ýu/€àÞôþ§: Fõû ¹÷@ê10H!ä`GHAâs|!‡§Á¡°‚0 á ]èÁöïp3äQ GÄ òp‡,dN è£!¾‹‰)$âqØÂ¾$‘jB¼a³˜Ã±‹Y¤NßæE(’‘‹Zœâ±œˆ:02P‰S£÷à¨Ã1š±Œ±{Ÿ9&ÇÑaqäëcÝׯ ç)¤!íhC#*þò‹€|b ïx8D€"…ŒÐ%9GG2ò‘‹¤#$%)µLfE@Èd$?ÉIP²òŠ åç&™È‡ Ò µ¬$%gIIˆ »\£']ÙJM61˜›¬—ì(iI]&²§læ, ‚ÊiB˜¯T%1a)ÌUr™Ó+%8¡ùLò—ã<È%‹yÍmf›©dç; ÃÀpÚ²–缤3}™Ès.3ÆTç0ã Ðn .ɬ&9™9‘rêSšû¤fB­P®³qü'EM%Ë|æšéd¨>o™K‡–Rq•(A+:P‹š4†âI9[WP”²” <ãMýˆ”0Âd—2Õæ1gzÑœžtþ¨• Oi§ÒŒ¦ÔK¥©P[ªQZ1¨@]iT±zU¦ÖôQImÔQÚTx>U¬]`íÕªÿÐHGl⎶ÈÕ¬þ±¬Vu*^ÉËéeˆ Nšî†S)Õ®ZÍë]õ*"vÈIRúÎãÚ*Xn°¨R,f)KôfìYQrëøãX¹Bu«¥E,]ÑjغNõpž½Uw0Ò×ÉZÖ¦a½¬fX[ÖJt3úq¶¥ ‘Ö¬©­ìjO«ØÄ2—вkW›@›£}Ñ6¹È½­m3»[Õb׫ÏEYt×ú&•T·»ÜksMk\õâVx¬êa—ßô¢v®ìÍ®73_ûÖW¹þô•/ì_çºör>0‚¬à3¸Á~0„#,á S¸Â¾p¬|;· s¸Ãþ0ˆC,⓸Ä&>1ŠSl-âØ o*~1Œc,ãÓ¸Æ6¾1޵ÆâÎæ¸Ç>þ1ƒ,ä!™Ä;Vk‘“¬ä%3¹ÉN~òÜŽ¬,C¹ÊV¾2–³¬eKùTTÞ2˜Ã,æ1“ÙÉ]žÔ—ˬæ5³¹Ínþð™ÿ”æ7Ó¹Îv¾ó›ãL& ó¹Ï~þ3 -èAºÐ†fð ňÞù2:Àg½î¢M`ý*úÑ›µî¥ «iíbÚ'_“y!miÝ6Ô™Ž4RmÊN/q»¢võ©GÝj—úO+­þj+€º#”UÄo¿­ôqclü{Ö¦ö´ªóB¥UyÇF‹Éšò¸žÜ›ÓÇ®¶¬[óé°øf´5’ܪÊÖWiˆÚot`qÛ{_Þæ—ª‚ /y5Ôkùº¬>÷½_½îóf»)ÛÞJ›¢­ë‰Ô¨Þ&Dõzû+à„/\Ý{u7b6p\r¿ÖÈÅ•zm|o\ß wxÃóoÏT<×î¼{ýÛŒƒá ÿ/̉½o/6ÙU¹5`Åû¸”ûõ¯£Ùï€%-ôËœèìv/¥WÝñiÚԛ6·›ª‘/ªßLÏ÷ÕŸ.uŽ»\ä6WÙ¡Ã.ö±“½ìf';¾Ó¯ eÎx~þ;Üã>â²A2ï5‹Ûå®÷½óýctߺ¿Ù®®¾¾ð†gWÚCîÝ»&ï‡<äßþw¬«‡êáŠ<æ3÷É/½ò‚÷ŒæC/ú<'>æ‹OºU?úÕ³¾Éœïúé!žúÖÓ¾öU~½Õ=ÏøÔŸ½÷¾ÿ=ðƒ/|ʉÐôkß}Ëso¥Î/ßÚ°çw±µýùªG?ê”o~ÝË ø¬÷Vöɯ>÷•¿R?ŸæÆ×‹å}~í_üZo¿½™_Bìç‹kâ¿Øˆ[%“‹×Ù—r“üáßý\»½° ­dý­Å²ÅÖ­dÜ„Vù ÛÌYààÒéIÎéˆÎášó‰_·åÚgþñšh œ ¹- Ú¡ßôíÎ_h—_‘ŸòÁ›¾Ä•hùÓ@à:]aÖÚÊMàtÕàû1_À]M ÚHc Ëý ¶­ Öòš§ ÜšP— nûÁ†ÄQàŠÊüßaR¡ôeaØÇ·= [•\‚yì_hyÆaœc¥¡ ÃÉÓ ªßi–‡X\pØ êŸòÚÎñ`ü º_÷i Æ N–^£'*ô±¡õµn | ‰bøUâ(ª!× àü­`ÐX®ÈŠüÙ,Ú"~ß¶ ‚¢ ºaåp £1#2"£ý‰@2£þýÍ36£4N#5&£¸Qã3Úšecã/ž_]¤ßàc5Jã2N#72H4–#;¶ã5¢c!nc/z£²âüQb!¶£5æ Z$KʤK¾¤O 6ÎäÕ$JŽ$ ¾Ü¤äB£Jþä>¥PdLN¥:†d+&¤)Úc,.%Z@¤>J¥2ÞbUVäU–å.jå*Þä.äÔ â8>$-梯øþ£ŸÙå]ªãïÍ#\Ф[ÞcIæ`úb=N"Iâ£aÆåNÂà'2åТR*d'J¦AÉå÷LfW¦bæd[.&`f`)"¤f’&g&&Nr¥i‚¦N¢žM²ægÒ£_–ækÊfhb¡k&åi‚åÑí¦%ªfmþek:å0§nÂfj‚á[V&d¦Zc"r.gd6§mn%m'n§C^çSúæf`g gl âsÎ%wçyn'bòf(F§`†'s]uŽgzò¤{fvbbpÆgoÞ'|zçjÎgrŠ’~b§x¨¢¦t>¦|è{þ'ƒö§€.è„þf}:&–ˆcfè~Ngƒ^(tþV(~’gnvg‚²§ùñg„¶§ˆBh†bæO(ez¨„§‰¶hb~¥å“P”R?Í芦(é7ª¨:çFU’‰ðèK””Ò,¨ƒZ(‡¢h‘鑾¨,EÔŽ*iF8i4Q(uŽé‡VéNéˆ6¥Í%TJ€)—6*—:H¥Ž¢§™~'ŽZéaŠfÛà¢B©£öR›‚ª£ÂT”V*=5T¥zΦ©eʨ¦¢©‹¦Å<’žN*.íÓ©ŠjC¡j=EêªjI¹*­*(¬+þ§ª ¶á§VÓ›J*¥òꯚê¯~)®f«°*«Rk*ʪ”úi Æ*¹’iìÒÆ©"*©ªk©ÒD-Ik¶îRL¹«¥‚¨yfj¸j§¶¨ŽÎ*t´ê]ªz‚+²,¿2«––(¦v œÞ«¾Ú竦iÂÞ&­þë¾6«uF,†*k²Ž«¹ÃìÄfl¹‚¬¸*lÈf©­Âhð€çÁšìÊÎl¿z,Â"©vJìa<¡¯•—g"hÉÆl‡j,}^fyn(št…Ï*¡ÍÊ,ÊVìÆ¬ªéh­”¼VF"­ð –×Î=•4aÑ-ЬΦ¬ÅR­-eŽG³9 H$Mâþšác™Å’­˜¢mÔíÔíÈží!’ x\ÏÇÏQÜF„xùÇ­ímòퟞläB­ÝnÇvàÝæ ¢âÊV^D"å™JnÙâ+ÒúménÎf.Üj¤áúßþ= jüš:®Ê>-‹šmÇê.ËzÝÑÆèÝ4›wŒ›‡LI´=É®¥àC|mÛê*ÖªïNnÓZ-Íæî¹VíßÎ ©¡éBîðVïö.lë†hÁ°ÖΑïêêmÚZîéÂïƒ&άÄ Ü/þæïýÄô¯ÿþ/ðÐËp¢üR)Ì.ëûº¯`Ò/ÂØ¯þF0ÿ 00›Œ3°ôpÞþRnø²n¶ï׬GpþNp§ðgFÛŽê6ìÏ‚ïïV.Ά0  Â`ˆ ë/h¨° 'X ß÷"p 1ûÞ°Ú¶CÌ@ìð „§ðƒL{ð k°Ð–ïõ:ëùækÐS¼Ö©¼Òé/ž®k¨ÎiU»p9û´WëõR·õAã²²,*»>”fëj°^kYwöª¶ÀB2^KvZó5Qw5:fD¹6B‘5“^„ls«h#ÔT3uLkuH£öS¯öAET´ÂvE€Tm?jªâö°*éëA_õ^S6tO¶V³¶25*?½vk¿+°Zkh+ª·æöc“ósg1K—vo¿õ³bÄa”ª²él[Ä`CkÖksì>«n5z§¶iuÆÐµÆÅwjŒ¶c—7û¶jóöLÿvFÛ‹€+‡O™Ç}“¶‚Çrtþ3¸[S7Nx.Wv;x‡/øZïöˆÿ÷p5dK÷Y_¸yƒ¸‹7x]“t>óóOŸwŒoø‰§7‡‡8cÏ!o× q‰uŽÃ8‹'x†Ÿöåϸi$ÞjÈÒæ·x#8Ž'ù•÷ø…—PÒ ×­"ö4yy–39›¹`êa zîlù 5–ù•ËùŽûw_û–”¯9G´yºi8’kù’û8†:¡ë´kíá&ºãJb˜+´‰ ú™ßõ‘O·¡K t9³)yA“ù˜;º‘:‰‹²¥y êœÀ}nrºIGv¤ú¤·¸z׸~w§¿9[Ïy®×¹ˆ“:L‡z¡Kºþ¨÷Üð%y¯où0ó4¨¯øò»êù´Go«Çù®ûú‡SzhNûgØ^›qû6ú g{b€»·Ÿ{ß;ùÖ„¡»»¿{æU˜Ë¶·Ã»½Û™º/м×úa™û½ƒY¾;·&c¬¬;‰û»ëqûµÇº’4­W¹§ß:Hƒû‹/ü°¿z“«ø§»ºŒ:²ÃúÅ۹ȿgÅ?:×¹°û¹¶ƒ¼Ágü¯;;¯ÏxÈ'»µ›üÌ˼Ãk¼Ä×<°¼ÇCzÇ—|Ï{¸Û#ò_žsmI„;½Ž§|Ìÿ<Ëýhàát}¡ÞP{3CFÞ\Í!dAÓ[|Ëc¼Ùû¼ÐÃ|ÒÎþn>ÛðFùëŠß¼Ô¯~¯¨Üí>‡ :Kâ“{OŒ!u}ÄpEÖ⢾ë÷}ëó=Í ÿUà>çV\ÿ!~¥+~ú&"ÒË®ów¤ãþΫ|Áÿ}ÐgÐtn¦{oÂô!º¼íÓ{Õ‡›#& Þk-l­üï?Ú?õW{¹½‚-ú?ìϺÜ3û~«ýÉ7=@D @‚,8paB†.|¨bEŠ'ft¸þ1bGŒ-jô(2¤C’G‚DYräI—*%Æ”9“fÍ•7]¾L¹“eOŒ:}Å ShQ˜GŠPº”iS§O¡F•JiЪCyZÍjt«É«\µ‹5,N†OÇÚT»Öæ×¯iÝvm·,\‰¥æÕ»ê¿<˜paÃ|'ŽJö']ÆvåÖuœsre¹N£Ë–sgË!!?ž|RqiÓ†Q§V½šukׯa¿6=qd³ŸEÛÎ-yëÓØNAw®wF£´‘罜ysçÏ¡G—>zrëh‹SÕ3u¿š‡‡Ÿ9ùºRïçѧW¿ž}{÷ï—W :{ï¥ð3¿÷þí®òåÃOÀ ,Ð@À,/4ʶkP î¼?þês°¿´HKк9ì°5 ­³Ð¸ /ÔŽ·1ò 6à~šB½‚QFúf,q.@LÎCs¤íÂI±F ï²>ylj+_DQH'ƒŒJ#‹œÒJƒzDÎD¯d°Ë ‰ü²J.É;ݘÜÌ(‡ ³L)ßl“Í.ݬN;EÄ“Î9ˬ3MñÖ¤rOAûäsA= %ÔOC‹CôPFóóÏásPKÅôQE…ôÒ8?ut4O”tRÏää4RUuUM;e5SPguµ.[KmóTTC%õ%dÝÖW/l `þ,H„ƒ”<«±¥pÅÐ×Qƒ¥vØVMÝu­JiMk¾kkvI—EÇ—Mv£oM27]p¥­Mqo¥÷1?µe‹Û:Ý=VYõÃÑ_xc%xÞ8]`ß ø\dá|·Û‚'&6Ú·ì- ß|‰KV†rw!d6÷⃠®WFˆAN¨agnL]yUNùÞŒ1¦ùf]9nËãŠYþ÷AfCÖ9^›5>Ëù\æˆa¼d†Øèœ‘¦ºbl§—çžiÚ—Í ž`h¯7k¡4Wá¦#bX?¯Ô>Û¿ªµ¦[,œëî“ëš¼6²å°AÖÈd¼ï–ÛËb“Zà™¥nœdí>¹p»þç.ûh½÷ïg~•uÈm²‹¦2 ¢ç3¤î(AtT¡—Ã^îP<þ_[x¥/‹æC៣¤£tñ;&sS Õ3ÃhA}Ú›¢íªhÅññ‡eüȩ̈@öá%…@ãe²¨GƒUð7gmˆÈÞ±QVà [HBF*K‚oä`ËH¶øÍOnhÌãó)Å6îÏúk•#çÈ'Õ%ÒsÒ« õ”Èʬeo‘:´$òByK0|©te-u9:Q¾0—¹4e0 ÅñЗ‡,%11øL`ŽRŠÆ„æ/w(Ç͹њӼ¦3½ÎaN²šÙú`3ƒÙÍqÚ²˜Òd'7݉Ìþ5R›½"%0Õ)O„plè‚<ñÏ|.óœÛ¼ç:õ©Á7PR;þ@:Pš3€èôDª(cYå¢Qã:Aˆ†4™ÑÜZAíYÎŒFÔS%ûWëè7‡†£,])/™gьՔ¤ß´Ëô´fkŸ65jOÅ >TT¥Gm'§Ô&S,…„w{ªSGzUœâN§ œèM9WT…Àô"‚$*RZRl¢U©õ4[SÙÊS~¹Ž£è²ªËf=¸j•¯Y¥'3™JÓ¯bõ lU+8 »×¿¢ô­‚«_IGËaþó±…Ëb‹¡¥¦Ô±‰í,2‘ôIÊR®ˆMô¬2_•bV˜[Í\W÷XYÅ“¥¡Àx?Сö¦ª•ŽTÈù£ÍfÖ¤§-nÙþB穎Z4ëNÝ(•7›€å,o»Ö¹6׈N$]ã]¯®¶Lt®xo5\aÅu°ì`n;Tæ‚×¹Ø ©t D]×î ¶S”+dá•\?Õ‡¥Õ-zÓÙ^ß*—µ‡½—z)ÖWËx¡åmâhuYÚUΖÃÁoÕè½Sºu½î°})ÙžbØÄŸ½lˆ-¶ØŠÅ®ñ„eëb7ŽŽôñd!™ÈE6ò‘‘œd%/™ÉMvò“¡e)O™ÊU¶ò•±œe-o™Ë]öò—Áf1™Ìe6ó™Ñœf5¯™Ímvó›ág9Ï™Îu¶óñœg=ï™Ï}öóŸBhAšÐ…6ô¡hE/šÑvô£!iIOšÒ•¶ô¥1iMošÓöô§AjQšÔ¥6õ©QjU¯šÕ­–H@;Bio-Graphics-2.39/t/data/t2/version20.png000444001750001750 2413712366325116 20124 0ustar00lsteinlstein000000000000‰PNG  IHDR€×*˜^dPLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿàÿÿÓÓÓÿ€€@àÐÿ€ÿÿÿªªÿUUÿÿ´Wþ IDATxœí ‚«:šfs[µ¹Úšrwv ›êg4 ~ °@Óù2Ÿ¯ƒ0$NˆÁýKR1ÿª½dî ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$UðïóòRþ5íí_î ÁlÀ¦‰ °†ÔºíÂë&Pk£+ ‰ ¨µù¯ùÂë&²+àgßj¥?¯ÿüûR®ul¡0Àúƒ‰DÜî‚?/—fñµ¶Ž X0‘¸€ÊJpù·•Âë&’ à²ÓU^ÀÝS“ÑkX˜HT@¿›õ- ŸÈ.ØcÇ€Z»¶/l9 öì7!‡~Õ°"0‘˜€ÿIÈ-A@R5ɾ )$Uƒ€¤jT ’ªA@R5Hª†ë€¤rTM¢€ý|¯¬?˜H¦€µÿ„Hé\ð7’ Ý XûTŠ”ÌU¯Ñþã?l‚€¤jT ’ªA@R5Hª¦CÉX¹&à/4$A:ðèíè_b+A@`l"˜›P@ÝcÍ­?û‡3­Ïpº†€å £py‚Ýò“a"· h6ÒòúÒö±o½µ€öñØîÙ*|<ö/ý:1´€¯Å>#àçei-:ðO­eÐÛ'ÄjÿWÖ±c èwTËÓVUŸšÇÅ~Úï -_ÊõRÛâôV²Ça"Ï hv¾Jù×QÍ­ûÙ—oË•ý{Rض€Ú4{Úì¾¾·X5gþ\¼€:< y¹f°c'†0ÜQi?þH_5·w➡ݻC èß²™€Eò€Ú?å¼ßšV&r·€§·Åï :ƒ]¸ è1Ø]lÚÚÞïÄõ’]Y}¬) ¿þI[ÛÄz×aòæ½^²+«_IÀÿKèDdbBÍEÏï°îww޸׳%&¨·Î…- °ñ¦’puäåÀÍð´™‹m3Ÿ çpsÉÝ,ö3)EÀ­=§+z¾Í"ã̺šØ8¡S“)`–\²ëîœúëc}ƒ•³ 2·™«k%;,ô‰ "·€~FõÚÆ(þýð»V.mÁ‚ÒF>0à.'ðäjQüÒyÍ]º4õl‹Ø0emŸð†œ"‚€wn¦½Å¦­-æUÄè_b+A@`l"˜î½-t8Ô`ɰ‹šCÀ{`"¸÷ö÷kdƒ‰ àÞ[¼&‚€{oð˜î½EÀ{`"¸÷ï‰ àÞ[¼&‚€{oð˜î½å:à=0Ü{‹€÷ÀD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&’-àúøöÍþ™«¹ 0ÿëbKüµsçE@{!ZÿßÜĶàÁ&þúÍ·.ɰoB0áÒp›‡ sA?¿·b%Öœ5M9C„°m0©/à%ýþÙ‚±6çRÍ9iÎ`9%;_béjDÀ®^ðlÿW×t9üÓBÀL¤¯5‚˜\2­2ÿšÖ¿!sÆ£“æ æÒþ>Ä,Øg¶|ØòC6l¹òp¦Í–Àî¯F)ˆÈF@[ns ˜# ö(g_˜TõÚ Y¯«›Ó~)90ÓÛå,¿dëdV5^*ÙýÕèþð¤#Š£BfÐí²>?‹=]çÔµ‹ÍýDÉ®¬~#4¹üèúì ø¾;ë×fœÐ»«ßL×é®Ö\Õ$,ñ@Àƒ­í·Ù÷gn(Ù¥ÕÏ0RÜüæžX+¢|ñwkÃÂÖ²=!`ü†Ü“’‹UL\Ѭò;·À­»à2ú·O X©Ük”’Öù6.Ù¥ÕGÀwcÀÈbÐeJ³Ï‚ # D¤®€÷ç vi3ý@ß0ið†œ"RUÀjX¯0†€À&‚‰ 06Läy×{Ú— ZÜû¥¾®Ò靨;ÄÂ3®Ñ6Ó¸0‘:S¿”_nfÐÖÐÏMÛÊ\Ñr3 ¹S@mžÉf¥q=}§ ½>ÞÍ7iÊüÏ-FûnÈË–…YØÚEhÈÍ4.LäVµéÁh»Ó*+ŸR¾O±¶- ùY¯ ܺ­‚¼| íƒn¦qa"· ¨œ9þ –~êÚ¥qÐüö%×™6]“ÝŽ›°C˜Èc.Sw\føÐ7›R@­°W˜È­ꈀ‘]°^ÔR@ÛëÆIH—0‘[´'!Ë„íIHpåë$dÙïšÅ¸³’õ$Ä씵;y²æÆub\ï.̸›i\˜VÀÁjX˜ÈFïRÌ)ÌÁ-£o¦qa"· »O;KÀý›¾GßLãÂDðJÉ€]‡‰ à•’»iYÀ½nÓØ3L¤a5-àˆ0‘†d<$LäVÅ¥“œÂè¯pf ˜È†o3<}Ìàè›i\˜ÈSÞS`ýÁDØêô¤<»jôÍ4.L¤¾€²›æöÙUî¶¿jX˜ÈcÝ4·ŸÒaO¤‰6Ó¸0‘'´w×78§tÓT8Lä9ý|¯>"¶{ˆÎì}ÙyT@å^mçŽW¬—ÜòtÓŒ_C}3 yN@µпFôoõÎý£o¦qa" ¨#»`³Kvºnšñ/EFßLãÂDžPû£ÀåçíIHZ7͉6Ó¸0‘çT;£vuSsÀŠÀDP! °¯<)àAa²Ç&}3 yPÀ½»ûrŸï2Åf&ò €G78÷PsÀŠÀDZp÷>…¶jX˜H Þë|3 A@`ØGÍ+A@`óÈe`2O ØyÍ+A@`l"˜C@`ÁDZ0¼Æžë§ØLãÂDšн¾öoÒ}3 i@@-u]:Ì-¿GÀñ`" ¨Ô÷ ®Êv ¹ÖÅf&Ò€€ká pØw®$ìÑ’‹ÀDê ¸ª‡€3ÀDšPÇvÁœ„Œ ©/àŸ6]Òדõµ<ìÑ’‹ÀDØT0†€À&‚‰Ôp·»ðIN âÓg5wæ]l‰×«/ ¿Qÿ,±-x°‰¿~“µ;ËZç]'\Z"nÓ‘€[±kNŠš¦‹œ!BØ6‰ƒ‰ô+`¬Í¹TsNš3XNÉΗXº°]ðO5wM—«%C@LY,AÀ”õ@Àr0‘¼˜K°²—a~)YéjDÀákX˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁDX{®ý°Ã%E{½kF¯9`E`";ÆžŽ€ÀÐtÔá?n…ÍDó´•ÑkX˜ÈŽ€V²ÅÃàí¢šèߪ½&s°šV&²#à2O à:Õv«Þ ¸¼½æ€‰\Ðý.ðófôšV&’' OaÓšÿ³ –9П„Ø%mOBlcÈI°âvS`ýÁD›&‚€ÀFÐ>¸>xÀwðÝ]g5”Á½ ¿ê؉ñ §jñnjî[@7²öΰž–¬oÃ/Ý7xöRÍKùÑ/—)ËÕÍh™É…y¨æì×àî2TØ «µLý:1Œ€Ú5öÒô×.xm2ÜTí¬Æ N/Ìs5§ƒ‘µÃ!C\y‹Â-ÙÓ0‘¢ªeƒ˜ïŠÍÔP@×ú¬€Ë•m§¡NüBåáš³—Ü¿VÔ”o§ÕîÆ‰±\G=ß ¸ì¾Ô÷.x=ˆ2ó¶XsÁ±ƒý+sÅCÀ\˜HQµßGº-æ¿»ó3»¯¶4²_QQ¬eý:1Œ€Ê¥»m£Öï‹­–:¸±zsâvß ÖÜÞIˆ»+·w'Æ0oÓ.vSsÀŠÀDj h[À 3îf&RRÀç ¬?˜HI7C¡¹K;?‹aÓì²DwЃò›Ûjno=N“]27WòÚÅæ~¢d'«/¿o}HÀû˜‘ýŸÃlî~uÿšêÙŸáÏŸæª3¸ýùÌŸýÔ¶4zøW3—ÿÀ{³ 6󾃖×Ìef°2›Ïþ­»àåó+‚‰”ðmÛ¯U€¶éZÞ¾v\>ãæýpùmD@,ÑÌû6ÜP@3—Y]G@ ð­‚00ÜÛ䎀v®\í:~ èV‚‰лw(àÚŠ]p àn ø^^Œ€oµ+`t¬ä$d×Î ÷¶Gfá.8híIHx2`æ- =…p§F[sâçݶ€ÁéJxòösY-÷Psã:1€— #OB~ƒ…>½¿a– Ø&ÒŠ€›ðg¶ iF@`“ÀD›&‚€ÀØD0†€À&‚‰ 0TÛ‘^lïR}ôÀüÑ7Ó¸0‘&t¯ñˆ¦ØLãÂDPË‘’´v"CÀñ`" ¨äHIn0vÁ#ÂDpiðä8!ë3–š©9`E`"õ ÆWBÀ `"M¨c»`NBÆ„‰Ôðozh3\«-{´dÀ"0‘6L! °‰`"U<|pïå'Áº·âÓg5wæ]l‰—ª/ÆŽüó°Åb6ñ×o¾uI†}‚ —–ˆ€Û¼ÇOÜi­{J‰ú¯9`E`"q•“ì3g  ²£| °z.ËKPù3šÎkX˜HTÀu7+vÁJíï‚×¾[À!jX˜HTÀ¿àDC­'!fI±“eêßj¬ÛKÓ»$`ÉÂp ¬ª€´€Àê xca€õA@`# hG( vÁ_‡ƒÝÔ°"0‘g §jñnjX˜HIÍÕAe¾ÆóW`”¹ãÛ \¦ü-߇ó¦fÜÍ4.L¤¨€ÚílíEÀ¯]ðb£Ÿa¹œh¦™‹5~xò&kX˜HQÕ"•v·¿¼¶ºæÐÏ`\.Ó8 uÂm`kaÆÝLãÂDÊ h$ûpÙêï]°ý†ÏÏÛlÍ+)* ÛnZ@Û.*÷åñ¶DÀÙ`"Et'k ènK°7'h÷ÞÌ»9 q»ïfkX˜HYóf0íb75¬L¤¦€¶ü¡0ãn¦qa"%|¾0Àúƒ‰”ð¿‚|&üwÏÏÿ³“ÝÅþïNêÔ°"0L®9`E`"˜\sÀŠÀDîðó•F(àçç=wG;EÀa"w ø™@  ËÕ°"0L®9`E`"˜\sÀŠÀDJ ø|a€õA@`l"˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MI0mø_Æ ö„€ÑA°ØnÞ¦8dÍ+‰ ¨¿ÆŠsíp­r´L¬VVÀp´Ì¯ÑW•Ê®•±â€! °f`"÷ È`…ÀòtÇyqÍ[½«¥ÀDv4󸑪7ãOû‰oÔbÀj`å/à'Ò‚{Z@w¤©…€:<æDÀÁa®ƒ¤êí™Ç jå^ÃΚëùÏ× qc5¬lí éÏ‚•´à¦“ð2Œý–Ó}Õ¹¢íßAƒ5¬,¼ c·ö—7^†é¸æ€U‡‰ 0¬»~sUë%«;¬ 1¼®QÛK›­Æ_aÛ:]KÛ‹€54ª‘ŸÔmRÀ£Í°®úC΢Qü î=¦o9·å.àQO9ÑóŠ€—6¶£ý& -`¥\¯Û±Z@ŽÊ¥TãìÇ€¿æ ¬†º?iÔf5þ ÛÖéZÚo˜H÷^‡ý Qã%«;¬ ÖL! °‰`"lBu¡ÂÜZsËá´¿ßö»ïáË~¨ ÃÜ]Ý…€æ/Ū^‘!Céý:1´€¾»Tp u-àË÷=üSkßC_ÿ)lZÀ—ï+eÆ3›´šs}ÿÔÚÖ­]¿ì§Ø7.`lȹžÔ«€*" Þ_LÃ%«yN@³óUÁÃdZ¯9ß÷P~§vôèÉvKV&r¿€îáhë]´€AßCî‚ݯ\ßÃ"0 Sþ$ÄXgOBz0¸ c[=×t˨;1´€þm÷O×V&ò€´Àj·€ß=åƒÙržå± K¸ã®Ìßš5‚3hnVŒÝ*¶œbþ;ãYXp7¤>=,û æ¼ûº9uÖ…ã ¸Ý`²0æ·úl«ÃV‹XÍ]„}‰·w—tN .à×f›i½ûŠç·Î«_`§âí‰X¼OÞv¹]Àø¶ Ÿ%LM‡e8¡/ÂòÄ‹ŠX®ðzah[wbpÇ€;1¾€œªÆý·ÝÀDžPq°]'&°÷šV&‚€ÀØD0†€½Áü™‡¶ÃTœ^õU2ìæô£³¼0&‚€ oí*æ*¦Ö›Ž #CuP2ìæ»–j߯޸i^;.ÙÓ0L‚Ù¡§äøT¾·K¿%{&‚€)°à0¾‹ýçWö+?Ì€‰ `ÂÛ +Üfl¿÷£»Þ,àÎIˆÝ# ë&‚€À°[˜»ð7Øö.É6Jö]Èð^7¬ ÛÞ–ºsk` Lû;uu%s/«u‘Û¾éí"‚€y°£;ó×m“ûÚºÕ«1ªÝQ„ðXÚvÙxx‹.ì3±B5&kwâbLÞ^Ú4‡Ãa驪KVn¼=¡!–„Ñž”—ðÇ€Ò:ŽkÀ¶[Éþtf—b6d %s/Q/X‡€wÂÜÖø ¦¹(Ò³À‡‰ 06L! °‰`"Q y*HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕü«–ÇÎÀ]hIEND®B`‚Bio-Graphics-2.39/t/data/t2/version16.png000444001750001750 2352412366325116 20130 0ustar00lsteinlstein000000000000‰PNG  IHDR€ºžòÚCPLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔªªÿUUÿï,þ IDATxœíÙ¡«:šF+”ŽÀïÎcgÐ1ô«2Q•@WhuÄo hZ_Õõ±±a!±¶˜Ñ¿4!ó¯Ú3@æ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5Qÿ>//í_óÞþ! Ø40Ö°€Jµ]`ýÁDâ*eÔC@`¥a"Q•2ÿ5_`ýÁD’~Æñí ÒêóúÏ¿/íZÇ ¬?˜HÆ*øóòQpi_këØ@a€õIî„,’E\þm¥0Àúƒ‰d¸¬tµ0¹k2zÍ+Ùß ñ- È*ØcÛ€J¹¶/lÙ öì™Ý ¿‰jX˜HL@EÈ-A@R5Ù¾ )$Uƒ€¤jT ’ªA@R5Hª†ã€¤rTM¦€ýœWÖL䤀µÿ„Hé\ð7’ Ý X{WŠ”ÌU¯òl‚€¤jT ’ªA@R5Hª¦CÉX¹&à/4$A:pïíè'1‰ 06LM( ê±æÖÏþáLÊ?Ãé>–/ŒDÀå vË[̆‰Ü. YHËëki+>Ë­3M÷RöÙ:|<ò/ý:1´€¯Å>#àçei-:ðO¯eðωµnú¿²Ž[@¿¢Zž¶ªûÐ<.öÓ~mùR®—Þ§·’=yN@³òÕúµï¦æÖõìË·åÚþ=il[@eš=eV_ßK¬ƒš3.^@\3رC ®¨ìNH&vBl[Ž€- èß²˜€Eò€Ê?å¼ßšV&r·€‡—ů :‚]¸ è1ØlÞÜÞïÄõ’]™}¬)  OÿäÍmf½ÿ0îõ’]™ýJþ_,¡‘5l<¿Ã~¸ÞÝ9â_¦˜!‘Xàa (T¸©dG…FÀ†\yéµܳKð°‰-³DË„€ó¨¾ûýVËàã%¸µçpF—Y¤qœYÀ5ч9%`æú¿Ó¯õý+òùº€‰]ÿÝ) Ö™Epr™9ʵ’íú@ZÀØË":Ù·co/î_+ÙQ¡0&ˆÇ‹Ã¶ˆ„€9sû„€7ä@¼s1¥&›7·x®";‰YhY4X²º0L½EÀ{`"˜zûû:Æ`"˜z‹€÷ÀD0õï‰ `ê-ÞAÀÔ[¼&‚€©·xLSoð˜¦Þrð˜¦Þ"à=0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€ÀØD0Ö—€ëe¾›ü3xôšV&p¹œÕÐü›RBÀ:…ÖLdO@w_ùÇ|òn¾[úñûG«9`E`"{«`ï¡é"Ò<5Þ4]°ÚÇÊ›Uðv„ÑjX˜H²Ô^¢„€K3·vktåC…w1 ¹.à2Q) ã± V^@ôáÂ*Ø5˜H†€:\¯É9p´šV&’ úð±ò£×°"0Ö‰€-X0†€ÿ¼ û×Y÷hn‚=Z2`[˜H“º×ÍЂ°GKl i@@sxÑN´]D›_!àx0‘üç?{‚eNióºFoôÅ4.L¤—oîµ>ÓÖõ.{´dÀ"0‘ú®ê!à 0‘&T±U0;!cÂDê ø÷¹|a³²¾–‡=Z2`˜H› &‚€ÀØD0‘V¼Ô Ñ>Aüú¨æ.Àü×Ŧøk5žíhõ?g[‚;‹øë›o]²aß„`À¥)"à6æ‚~~ nÅʬ9)jž.r„aÛ$"` &R_ÀKúý³cmÎ¥šsÒÁΔìxŠ¥«8xIÀk°ôW×tÙýÓBÀL¤¯5‚˜]2<.Ìy0»d˜S˜Ýc±ü‹}UvmŠØQa€õA@`l"˜^€ùC‚ÊÝÂݤë°dØÌ?Lï^ºÝaɰI˜iã–ÇÀš…¿Rþ¥Ç’!`/0ܼž•³g};.ÙÓ0Ì‚¹‡Îù»§ìvŸ}LgÇ%{&‚€9°u=k´_¹(ö[²ça"˜ñÖ¬a½€*Ü y¹f°Ë’!`°ÔNˆ]# ë&‚€ÀØD0Ìx{úR±àš+;­åŽÎ›â™¹‹ýDÉög xöjÙàªÓ—ïµÂõ«w4Åw–¹/Ù÷on(YbÎÕn5"`­$~Zös–€ •N—lGÛ²~DÀ–Œß)úQ`,«Ém%[U¼X²½¹?Xf"˜ñöÇUpd²åo@y¶dé™?|¢™f¼EÀÜï¶Úˆ€· xô˜¬xFLöh¬æKKÞ2A@`ÏÂD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁDâžé‚ÍÿvôšV&ò»€5 ¬?˜HJÀå å^µ{]¦ôùV¯ÃÝ¿eȸ5¬L$! ZŸÊøyÜ‚{µª—}6¨ºüþoóðÐG ¬?˜HzìŸ+ášA“×ò˜Fÿ¨ßWÁŸ>ùdœÎjX˜Èž€^-埆¸h¹Ð?,tÈšV&²· ^Z¹`ì¦dVÁKAY+% [ïÚU­Žï„øoý*˜ØLäÊè„e£×°"0Ö€íX0‘´€;z‹¿==B0ÚéÂë ö㜀{ÏZ©æ€•©“º' ½‘½ÍûU¡qu{}þ=# Ò¬Ü¸™Ô¥«a, °þ`Áú^$*`Ñçfâ’+ - °ª- Û€ÀÊ xfð3ZûôÀ:„Û ÖV¦8¬"ì3ç‚5Ù hþ Ö0ûò>¥Oþ5­CfGeŒ¥üuˆ§`ŸÑÎÖ§aË‘‡ 0e®´|v5JAD6Úr›mÀ3*¿€ÎŒà “+ ZoBVëìž)?•30s·Ë%Øù’ý­{§ªñRÉî¯F÷ç¡3ô?ús4Üw¾3}s{ˆYFY3äî'ñåz© ÛíÍPk}ëu¬L˜_Lç`®pç`ʵ§`þàÅé’]„]¨F/`f ¥\ øí`JÀSN@µû«dÍå*'ï9˜:S×`n1„)u­dúBÉþ®ÁòKæÞ6mc4çI"æÝcdÌo’#fÈ»ÐÌßiØRs'aVÀÇ`®2ï¯Æ«0³Á™Ýà¬w¥ÛÐn)o'.6Jê1˜ö•y5^†nmì/”Zç-kÐmFäÏ•õCò{ÁÇÛvë9|nƒ>Þx a'6^˜ß ~æÕ9˜9ÿÌ©qö0É·±Ã0æqæ~ýcÉ™þ¹²uà¯ïÅXz+¶?8[Ã<SêÌ}~¦Ö;³–·ØÄ Ãh`ÏÂD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&‚€À:ÐÞå¹™¾27«ý[„mrö¦ã??°ñšV&’~FôT1•×g†‰$Œø•5ý´€ËŠÊ¿Õ8)LdO@ÿr¶‰\êÚ ü UJ è{[ס€ÊMfidƒI#à0‘,}û´<ÄK£µûî~Ö{Úìwß„†kX˜È í# ¾üL˜ÐÜ/ 6^sÀŠÀDòÜ6Zß-ÞÕðO#àL0‘Ýx£%\U;!›iVÁÀt$G‡a"«àuÏDmvBü@÷Ý‹`— ¦oœ\-ÌñáÄ~jX˜È®€ë±ãK…1mÝ…w1 á\006Ld¿»ÖìžV*L%˜,¨ß‘Š^|ÑaÉZо{qKÅÂTÐ?s6^A–¬íù^ýòg}—‰¸n%”{?EÍ­‡Ž´9ŠüJù—KÖ¬€îÉÕúåža¿LÄ|^Ö;›Çö_sþQÞëéã¦yí¸dOÃDÒ«à­†âàñÈ5ç–ÛGÃûsßË;»(Ùã0‘cÃUðFÀ ól]Ïnû&°€x&’· vSšT@óèTáNÈË+è±dÍ èvB‚KO—‰Ø¥îÙ qçÃû-Y«†£‡Û€­X0‘Œ3!a ØXa€õáT°®T2g ó5rù,˜ögmQìòÝNëó)˜ìá<çÎ]lì'Jveö ¡ÉéGç'%àûî¬^[˜qB%g)¾˜®Ó]­¹ªÉ˜âŽ€;KÛ/³ïßÜP²K³^ÀHqÏ7çÑJ{L@eöFÀ=-ÿ2ŸþŠñuZös–€ •N¯w´mSÀ/Sάâ3FX+¢|ñ“µaakÙž0~AîAÉÅ,fÎè©Í²;—À­«à2ú·O X©L5JYó|›€?—ìÒì#à»Î6`d²è2¥€§÷‚ # D¤®€÷ç vi1ý@O˜5ÏxCá@4°ga" My^ÀõŠÎe€W>è¯}Tõõ{}D¸½1Úb&RGÀ`è·€òøfe ý\²¨Íþì‹i\˜È*óD"+»ÏÎ_R¬Ö‡ù&M›ÿ¹É(Þ2eb¶^ ?äb&r«€ÊÜ¿co&ÓV>­ýuʶ€æ³Z¸u2JxùË• º˜Æ…‰ÜÛ:süóÛüÐõ†žE@óíKn®#mnÌs+nZÀa" ¸ M ¸Œð% o6¥€J#`¯0‘VÁË/`d¬V•PÅVÁj±Ò%Lä‰eÀv'$8Šòµ²¬wÍdÜ^ɺbVÊÊíÀ)àáC¶F_LãÂD8 MyL@•WÞ%·½)É]uÕ@Í+iCÀà³xœ¢ o™h1 yrl/n®/͹KN#àP0‘GT^B×ãÕ×%úÖEýòwÉéhë9úb&òœ€îž¸à.¹××MJööð.¹ø!œÑÓ¸0‘júWy—Üòâߪąգ/¦qa"VÁËgÿ¬‚Í*ÙõFçî’‹“}1 ©±²|Þî„äÝ%7Ñb&ò €‰.Cº©9`E`"lw £NŽ;úb&òìNHòêªxãØVÍ+yTÀôõ¥=Ô°"0‘Lž&n«æ€‰´ à-°ÎÓ¸0†€}Ô°"06€éÃ0=Ô°"0‘VD›&‚€ÀØD0‘V ÏÛ C•¸zaŠÅ4.L¤IÝëÎ% £/¦qa" ¨drËí"Ë÷8L¤µ»=èQNÛ ¢ï€u±˜Æ…‰4 àz\pÿ[xçHIØ£%‰ÔpUg€‰4! Š­‚Ù &R_À?enÈÜtkm_ËÃ-°L¤MA@`l"˜H}Siå ~}Ts`þëbS¼^xYÀøeªG‰-ÁEüõÍ©ùHLkwpiЏMGnÅʬ9)jž.r„aÛ$"` &Ò¯€±6çRÍ9iŽ`gJv<ÅÒÕˆ€ ¬‚ª¹kº\-Ú `Î| `9˜æÌ–ƒ‰4 àÅ\‚•= óKÉJW#_sÀŠÀD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁDX{®w!†SŠÞ\[>zÍ+I{>.{X@sóŒ ÿqß 4Ͻ怉쭂­‡ÁÛE5;пթ&s°šV&’lõFÀu¨½©p+àòvôšV&rA@÷](àçÍè5¬L䜀îiâ›ÐüŸU0°,˜Èž€~'ÄNi»bCvB€°›Âë&‚€ÀØD06²€ö±ÍÁãmƒswÕ\P÷6<)Ô±ã UâÝÔÜ·€®_ÙD§v–¬o7Nk×8hw Ƕ€Ëï«ó óPÍÙÓàî0TØ ëµLý:1Œ€Ê5öÐô×*xm2ÜPåºk zËÌ/Ìs5§‚~eÃæ»ò…=Z²§a"e[Àe˜sÅfh( kýVÀåȶÓPežPy¸æì!÷¯5åK´ÚÝ81–€kŸ¿[—Õ—þ^¯Qa‡ÕmÕ\°í`ÿÊ\ñð,L¤ü*Øž ÖN@·Äü¹;?B°új[@Ó(ûUáÅúW֯èýVº[6z=_lµTÁ…Õ›·ún°æR;!îªÜÞGÀs#˜v±›šV&RS@ÛþP˜qÓ¸0NÅFÀMG@ÄgÑi–¸tg„óÍí5—šÃœ.™+{îbc?Q²ƒÙ—ç[ðß>fG$ý9ÌæêW÷¯©žô~7ç ãóq˜Ó%óc%fiGV_²ïßÜP²ÃÙÏhX@[•~Zöó®€úÜßz%Ï•ÌoO¥Ó%ÛÑö6ýÒ©%àRîôçÍÇ»:ÿTTr[­ x¶d±âÝQ²UÅ‹%»4ûO ¨w>oæ89ÙZÀs%[ëªñ’Ï~-àÍö³ ˜_²µ®/ÙáìWߥ+/`‹i^+íË}ñÏâ»ÄbJðü©¸+9]2_W­—ìÊìs X06’€ïÏÛ÷;o„·íKx°·y»?î[}¿ÝXÛö'3ºãø¶ ó5Â[æK— OÎèß;ñÕ»±Å4.L¤¨€¾yù¼,íàûÓäüóߪËûíx¿>ïÿÞf„÷ÛOëý÷½4WæÕMG¾㾃–×õÚNÁ hè…è¸{­öèN ) ‘G/b|T Fpë;ó›?û«m hôð¯f,ÿƒ÷flÆ}-¯ËŒ`e6¿ý[WÁËïW.>)/àÛ¶_«mÓµ¼}%\~ãÆýpù6"  ¦hÆ}n( ËÌ.Ž# ßŒ øÖA ®‚í 2! 묀v¿t³€ÁDîÙ ÙpmÅ*80Ù¾—#à['Œ®‚õŽ€ì„ !àÚÀYáÞvË,\- Ý wÌX¢´»nwÂhkvBü¸Û0Ø] wBÞ~,+ å¾3jn\'ðraäNÈo°Ð§÷7ìÑ’ÛÂDZpÓþ CÀva"Íl˜C@`ÁD›&ÒŠ€áu´öºZµ÷¨ÀÑÓ¸0‘&t¯ñG/O±˜Æ…‰4  ’ψVÊÝ‚€ãÁDPËgD»ÇX² &Ò€€Kƒ'ŸºÞ]ÚLÍ+©/`ðdiœ&Ò„€*¶ f'dL˜H}ÿ–‡.o:ªñ¯åa– X&Ò€€À¦‚‰ 06L¤¦€¶£šÒÏÀqoůjîÌ]lŠWª/ÆuãõÃSÀÄdwñ×7ߺdþ Á€KSDÀm:p+VfÍIQót‘#DÛ&c0‘zú…uQÀX›s©æ2æc•*v<ÅRÕ¸W2Ü}[~üSÍ•h)Æ`"è^ð˜H{Áø[5"ào…Ù=X±“K°²‡a~)YéjDÀákX˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜È¾€;·‚©¯ÛkG¯9`E`"qÝ]ˆ{÷"" °+0‘¨€æõE@`W`"I?ãøvðó¸Hs+Íúqå0IÍ+ÉX›×Ûfq™’RëËK»GbŒ^sÀŠÀD’;!Þ/) »©Ðµ€5 ¬?˜H†€v5«‚‡9‡(° VZÀ@²×f½û% «``'a"{Û€îþM hWÁÛ令9`E`"gBl+×ba€õÉ9g÷:, °þ`"œ †€À&‚‰¤wB‚^+_Úý£÷,`µ€^@s,ÆNdâÛ+Iˆ^ú,_^] ¨]‚ÍX0‘”€Ëeö1ή\># °ÇT«€‰$\6ù”u/pïàè5¬L$±¬­€ë^°6- °‡ì'}—)! 0Dë&‚€ÀØD0‘Ä©„Ül¯ußFÈnT ’ªA@R5HªIÕ ©$U“/ !w$WÀnNëë&‚€ÀØD0‘³šUùæ:i·rÙ{ôxß.kX˜È•Ð ¨ü…úzóÌèÃçKwYsÀŠÀD.¨ìÿ—»äL ørVÚ °Û´wŠ8_þ3«`` ¨V?CØSºý %t»"ìNZònáu/øk‡xœšV&òËaeö?”{йù^ï??¡ßšV&Âh`l"˜ëJÀ'/Þ!¤;k_ÔHŠIÕ ©$Uƒ€¤jT ’ªA@R5ý HÆJoNÿÑÂë&‚€ÀØD0‘:ªB…¹µæ–M$Á·í탉¦²æ€‰$üŒcï«1ÿ˜»lL_/ÿlP3éåß¶ŽfGàQÞÀ.¬‚mChßÚGWø‰к§µ¡ÿšV&’Ü ±Ê½t( ¶Ï¸G@`õ\¦—/ ö{4×°"0‘½ïU°ÖéUð:Âw 8DÍ+Ù= #vBÌ”b;!ËпÕX·–¦vIÀ’…aXUiÕðÆÂë&‚€ÀFÐöϬ‚¿6»©9`E`"ÏUâÝÔ°"0‘’š£ƒÚœÆóG`´9㻚 \†ü-gŒÃqó 3îb&RT@åV¶ö à×*x±Ñ`ºP_†™ƒ5¾sÞ&kX˜HÙp‘J¹Ë_^[]sèG°.‡iœ†*ã2°µ0ã.¦qa"å4’} h»ÿZÛ3|~ÜfkX˜HùU°=§€¶]Ôîäñ¶DÀÙ`"·ì„¬- »,Á^œ Ü{3îf'Ä­¾›­9`E`"¥WÁgF0íb75¬L¤¦€¶ü¡0ã.¦qa"œŠ6–€Aþ?ÈçóIN6Õ–1 AÀì’+AÀì’+¹KÀÏ)PÀÏ甀ɾþp@˜-`vÉ€‰ `vÉ€‰ `vÉ€‰ `vÉ€‰p ›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁDXûæuÿKÁÀž0Ú)0V»QÀÍÛ‡¬9`E`"‰Î e_qn í®Uö–I‡ÕÀÊ ö–ùÕûªÖgºk¥¯8`¬˜ÈýÒY!°óºí¼¸€æ­Ú H‡ÕÀr`"Éð3Žë©zÓÿ´øF-:¬V^Àƒ‰Š¶-Q¶Ý! ëÓè¸0´€ÀN ØMa€õA@` ¨|‡ƒ¾£-·Ó›>Ë;zÍ+I·€^@³ëk'²s™Áè5¬L$)àÒé´y O Ó{D@Ó¹ªémÕµ€Êu~ÙLa€õÙP­jV&’Мïu]¯nοÕ/ °þ`"‰½`m\÷‚µiüh=|Fù3ÂË”¢õ A@`Ø(,Ù‰âù4V²š0‘á,hMª£¦ )8WxCa .Ÿ‚Ö´™‚uÕ¹€k¢öB4—`Y±†œL¾¦´€Ä¥à,Û² Øp ÖUçÛ€ ìQE¾*¸|µæ‘j¼o™‰ '`AXAk+YM˜ô_(ÀIDATC@`ÁDXWšíàÍU‚Ëm.t¿z¨0ã.¦¶af»vµà¥#¨ø“ D®´€^@å/SÕî~9ù¶±šV æ4O!ÕrчCË ¨ìÿ—{DL ørVÚ àð0s{µÀ?E,ú[´×I;_þ3«à‰`î.IcA`EhÁ=«`óè¿U@CŸ*ÌÉÒw´˜Æ…ÙuŸðiÁ=- ÛÒTB@ns"àà0wšªížÇ *í^Ã{åÖýŸ¯âÆjX Øzšß ÖÒ‚›vBÂÃ0ö$“;Ó´¢íßAƒ5¬,< c—ö—7†é¸æ€U‡‰ 0¬»~mKë%«Û­ 1¼®Q«ûš­Æ_aÛ:]KÛ‹€54ª‘ŸÔmRÀ½Å°ÎúC΢Qü î=æ/97åàQO9ÐóŠ€—¶£ý& -`¥\¯Û±Z@¶ÊåTãìÛ€¿æ ¬†º?iÔf5þ ÛÖéZÚo˜H÷^‡ý Qã%«Û­ ÖL! °‰`"uT… skÍ-[3þrÇï[¿^öGE`æî¨.4)¾Ã<ýŠt˜í׉¡ôw«W°öѾü­_z½õËÇÿ ›ðåoU1½.™EÚG͹[¿þôÚÖ­wÞØ_± n\ÀX‡K= ¨VuD@•žLÃ%«yN@³òÕÁ³//í_ËÞþ! Øc`"¬c•ê»0Àƃ‰¤Tʨ‡€ÀjÃD’*eþë¾0Àƃ‰düŒãÛA¥Õçõß_ÚµŽ=Øx0‘‚Uðçå£àÒ,¾BëØAa€Éî„,’%\þí¥0Àƃ‰¸¬tµ0»k2{Í«ÙÞ ñ- È*ØmÛ€J¹¶/nÙ vï™Í ¿Õ°*0‘”€ÿAÈ%A@Ò4ž ©$Mƒ€¤i4 ’¦A@Ò4Hš†ã€¤q4M¡€ãœW6Lä €­ÿ„Híœð7’(à ØzWŠÔÌYÏò¬‚€¤i4 ’¦A@Ò4Hšf@É\9'à/4$Qpëíì'1U‰ 0ö ˜{ €jÄš ŸýÍ™Â=œ®ƒ!`ý¨I\î`·¼EÀb˜Èåš…´¼¾”½íÛh- ½=¶»G¶ŽoO§ü˸NL-àk±ÏøyYZ‹ÁüÓ¡ j}‡XåÿÊvbnýŠj¹ÛªS@s»ØOûµåK¹^z]œÑJv;Lä>ÍÊWk¿ðª¹°ž}ù¶\Û¿'€} ¨L³§Ìêë{‰ PsæÏÅ ¨â—kvbjã•òÏ«ær;!îÚ£;1µ€þ-‹ X"7 ¨ü]ÎÇ­9`U`"W ¸{PúÚ =؉«€nƒ­ÉÉ–ÍíõNœ/Ù™ÙGÀ–ªøôOÙÜÖ»ŠslÜó%;3ûüïTb' j.9Ùt~‡ýp½»sÄ¿îM±@@µv.n…•l¯ÐØ‘€Á‘—îqw›¹Ô2Sé±ð9®¹›É~•¸¶gwF÷—Y¢q|²€®&VN¨Ò0 óOe|­Ÿ…'?Ÿ0³ë¿9E7·ÁÁeæêã\É6 ½#ˆ-` ì‡e‘œìÛ€©·'÷‚Ï•l¯Ðˆ€ˆ€˜D„ã€9ØADŽ›°dnïð‚ì"‚€9ØADŽ‹€BzÅåÞþ¾zÊ ø jD@ì &‚€¹·x Lsoð˜æÞ"à50̽EÀk`"˜{‹€×ÀD0÷¶Ò!±K†€CÔ^A@`ìA0†€ÀA@`ìA0†€ÀA@`ìA0†€ÀA@`ìA0†€À9,`¸oØêÿž½æ€U‰$ܺ%"»A@ó_jJÛØx0‘-Ý:Í?æ“ÚÑê»å!Bbàl5¬ Ldkì=4ϧ2·¬õÍóßì=mÍ*x=Âl5¬ L$Ûj/QFÀ¥™ Ïí3ºÆò¦ÂÌ»˜æ…‰œp™¨ÐñX«/ Šn Ï*Ø9˜H€:^¯FO0;(ràl5¬ L¤ü@tòQ;Oª9`U`"l{, °ñ`" ÿ}?2ìÑ\»µdÀÖ0‘.t¯«¡a·– Ø&Ò€æð¢;œ¨L h~…€óÁD:ðßÿì –E8¥Íëö½ÙÓ¼0‘\¼E¸WxH®=ê]vkÉ€%`"í ê!à`"]¨R«`vB愉´ðïsùÂj'$¼Ö‡ÝZ2` ˜H{L! °ÁDzPÎ.Aüz¯æNÀü×Õ¦øk5íhõŸG“Z‚‹øë›o]Šaß„hÀ©)"à:7æ„~~ ®Å*¬9)j™.r„aÝ$"` &Ò^ÀSúý»SmΩšsÒìÁŽ”lе«8xJÀs°üWçtÙüÓBÀL¤Ï5‚X\2Ü/Ìq°¸dXR˜Íc©üK}UvnŠ8Pa€A@`ìA0<ó‡•ë’ܤ°d8ÌßLo^º=`ɰK˜iã–ÛÀš…E¿RþeÄ’!à(0u^‰ÏÊÙ³¾—ìn˜ÁÜMç|ï)»ÝgoÓ9pÉn‡‰ ` ,¬g­€ö+wÅqKv?L Þš5¬PÅ;!/× Y2–Û ±+bD@`ÃÀD{L Þ¾T,ºæÊNk9„£Ë¦xdîRcßQ²íGÀʽZ6ºêôåŸZáž«·7Å 7–¹/Ù÷o.(YfÎÕf5"`­$~Zös‘€•—lCÛº~DÀžL÷ý(°=–Õä²’O–lkîw–™¼ýqœ˜lý(÷–,?ó»w4AÀ‚·XZàÍVðR÷n€€ ÈÉîÕ}ÉR)[f"ì^˜C@`‚‰ 0ö ˜C@`‚‰ 0ö ˜C@`‚‰ 0ö ˜C@`‚‰ °<ò,ÿÛÙkX˜Èï¶, °ñ`"9— ¬•{Õîu™Òç[†»!ËykX˜HF@nŠ÷éíî^­€êeoÍè†.¿ÿ[Ý»ñ–Â&’_ûný®ô}l–»äù;Mø[Åÿéƒ7&¬æ€U‰l èÕRþf´‘€‹–ký½§¬9`U`"[«à¥•‹VÁnJf¼<¢e% «``µtë]»ªÕéÿ­_ÓÛ‰œ9±löšV&‚€À†°ŸÂ&’pã>[é·‡GˆF;\`cÁ>cpëV—Oª9`u`ê €îFoÊ¿ì¾-ûU¥q {}þ=" Ò¬Þ¸™Ô©«a:, °ñ`Ñú^$)`ÕÛâR* - °¦- Û€Àê xdð3ZÇ»ôÀ„Û ÖV¦8¬!ì3ç‚uY hþ B X|yŸÒÿšÂßÙãQEãFc)â!Øg´ã°åÃaØräáL™+-o]_R‘•€¶Üfðˆ€Ê/ ##øÂ” ¨B'df÷Lù©™Þ.§`ÇKöö Uã©’]_îÏCèôçh*êw¾1}Ó=Ä,£¢rýI|¹^ªÀvÛ*Ô·cÂüb:s…;S®8ó/—ì$ìD5z [(åZÀosúãpªÍ_ekθ/¯P9yÁÔq˜:s‹é L©s%Ó'JöwV^2÷6²i# 9O’°¬‘°¼INX ïZ@3‡aKÍ„Yoƒ¹Ê¼¾ÏÂÌgqƒzeØÐn)o'N6Jê6˜ö•y}5ž†Unmì/” óV´ è6#ÊgÈÊú!ù½àýí »õß·Aïo¼Ä°/Ìïßó‹êÌœ¿¿ æÔ8z˜äÛÀ•€n±ªðGþXJ¦l†løãûë{1–cÂÂñƒ#°pæ˜Rç`îó 0z„-o±‰ç9à“aj&‚€À؃`" =&‚€À؃`" =&‚€À؃`" =&‚€À؃`" =&‚€À؃`"lPm/ÏÕô•éH¬¶»Û'ÊÙNÇ~`ç5¬ L$) é¨¶3Ñ”€Nª”€Êk‰€O†‰dLøU4ý¼€KEåßj|(LdK@ÿrl5¹G¨k7ð3T)) ÚºŽTn2K#MŸ)зOË A¼4Z»ï^ñg½% Á~÷Mè¸æ€U‰ÐÞÂàKÀÏôÃÀ¼€¦w¼0ØyÍ«)pÝh}·xg[À?€O‚‰l-)`PU섬v¦YÓ‰ì†I¬‚Þ‰Zí„øî»;!ÀN Mß99[˜ýÉãÔ°*0‘MñãS…1mÝ•…™w1Í á\00ö ˜HZ@·áW|ÃÓF…ió·õ;RÉ‹/,YoºÑ7/niX˜Æú{Φ+hÀ’õ# =ß«_þ¬ï2÷X åÞ?¢æÂ¡#mŽbF¿RþeÄ’u+  ÷_óÙ‰˜ÏËzguÛþùkÎUÈ+œÞ1nš×Kv7L$¿ ÞÐj(Ï\sþh¹½5¼?÷½ü s°sˆ’ÝÙ0^¯ì 0wÁÂzvýlûˆ€`"e«`7¥‡ hþ½€*Þ yùc#–¬[ÝNHtéé2»²Ô=;!î|ø¸%ëUÀxôx°·Â&Rp&$n;+ °ñ`"œŠ6´€JæHa¾F®ŸÃÎÔÜ/t;­Ï§h²»ó\:w©±ï(Ù™Ù¯ `‚&§ŸœŸœ€ï«.¼¶°sž§»ZsUS0Å 7–¶_fß¿¹ d§fÿ¸€‰âoΓ•v›€þÊìFÆåuzìLQÅ¿M¨tx­¸¡mŸ~™rd_0B¨ˆúÅÏÖ†j!`ú‚Ü’‡ê?2£‡6Ë®\—®‚ëèßÞ)`ÃUpb²'WÁµü¹d§fßX©d§fßX©d§f¿C¯ÏìÔbúž°hžoð‚ì"Âh`÷ÂD{Lä~ÃË%®|Ðþ2»x„õìõñöÆl‹i^˜H£¡ßÊà«”5ôsÉ¢6׉M¹˜æ…‰\) 2w$²Ò¸~vþ’bnnä›4mþç&£|'¼eËÄ,,\ ?åbš&r©€Êô߱ɴ•OkߣNÙÐ|V¡ “Q:šÀË_~¬`ÒÅ4/LäÚЙãïßæ‡†=‹€æÛ—Ü #­:æ¹7-à€0‘Û\†f\FøÐ7›R@¥pT˜È «àe€0± VA@%T©U°Z`ì„ ¹c'd°Þ ‰Ž¢|í„,ë]3·WvBÌJY¹˜;kn^'æðêÂÌ»˜æ…‰ °iœ¬æ€U‰\»’¸FçHa6.ø™}1Í ¹TÀÔUЇÌ_ò8ûbš&‚€gJìqQ/¹×W'%Û=$î%—>„3ûbš&ÒL@ÿ*{É-/þ­Ê\X=ûbš&Ò`¼|ö¯Ñ*ج’ÝÓè\/¹ô1éÙÓ¼0‘;!ËçõNHY/¹-¦ya"7 ˜ydÈ05¬ L=EÀͨƒãξ˜æ…‰Ü»’½º*Ý8öUsÀªÀDn0}é5¬ L¤³§‰ûª9`U`"=x lðÅ4/L!à5¬ L=GÀüa˜jX˜H/¢=&‚€À؃`"½Ÿ ¶†*sõÂ#Ó¼0‘.t¯—(̾˜æ…‰t  ’O”[º‹,ß#à|0‘Ô®7zôD9m/ˆ¾6Äbš&Ò€¡\Ôÿ-î9RvkÉ€%`"í ê!à`"]¨R«`vB愉´ðO™™«ÇZÛ×ú°[K,é@@`‚‰ 0ö ˜H{siíe— ~½Ws'`þëjS<_xZÀôeª{I-ÁEüõÍ¡ùÈL+Œœš"®3€k± kNŠZ¦‹!AX7‰˜‚‰Œ+`ªÍ9UsNš=Ø‘’íO±v5"`«àŸjîœ.gK†€6X2X&‚€%ó€õ`"x2§`uÃüR²ÚÕˆ€Ó×°*0†€ÀA@`ìA0†€ÀA@`ìA0†€ÀA@`ìA0†€ÀA@`ý úàÄSJöŠ®¬œ½æ€U‰dLÝÝ, ¹t\Åÿ¸è®šž¶³×°*0‘­U°õ0z»¨fú·:×dNVsÀªÀD²- ^ †Ú.5k—·³×°*0‘ºïb?of¯9`U`"Çt÷Ò]µ€æÿ¬‚ÁD¶ô;!vJëÛ²¬º€ÃØx0†€ÀA@`3 hoZÝÜ1:w7XÍEepoã“B;1¿€ñP%~0LÍ} ¨|q°&RSÀÕ#Wµk´;cÛ‰HÀeÈ÷ãZË sSÍÙÓàî0TÜ ëP¦q˜F@å{húkš 7T¹‡ªð¬¸òÂÜWs*zªb|»hWÞª°[Kv7L¤n ¸,s®Ø tÍ¡Á ¸ÙvªÂ*7ל=äþ5£¦|™V{'æÐ,—o—Õ—þ^‡¨øq­}Õ\´í`ÿÊ\ñð(L¤þ*Øž ÖN@·Äü¹;?B´úê[@Ó(ûUñEø+׉iÔ~+Ý-Î[-Utaõj'Ä­¾;¬¹ÜNˆ»*wt'æðئ]¦æ€U‰´ж€?fÞÅ4/L„SqÀ¦põ ×c)óY<2ÃNKtÝáþmÀ39\27Vñܥƾ£dgfÿzÿÇÇìˆä?ÇY]ýêþ5Õ“á^Óó±›Ã%óceficiû’}ÿæ‚’šýŽ´Ué§e?O à±’ùâm©t¸dÚÎ+àRîüçÕ§ôû©¨|ÇðhÉÜXV“ËJT¢uA@`3 øþ¼}¿ËFxÛÑÞ¥„w{›·Ûã¾åÐ÷Ûµa{2³;1€o»0ßE#¼Ea¾t)ðàŒþ½3_½;[LóÂDª è›—ÏËÒ¾?Mοÿ]ÞoïÀûõyÿ÷6#¼ß~Zïϸ凉2¯n:òý+÷µ¼~¬×z V@3@/DÇÝjµgwbJ&Ò…€*µ f'dN˜H{ÿ–›.¯Tã_ëÃn-°L¤= &‚€À؃`"-´ª©}÷Vüz¯æNÀü×Õ¦x¦ðdaÜc¼êÝlc}ó­K1ì› 85E\g ×bÖœµL9B‚°n0i' _X'Lµ9§j®`>‚T…°ý)֪ƭ’!àæÛú«àŸj®þMK0A@÷Š€÷ÀD:Ø FÀߪ+ÌæÁŠœ‚Õ= óKÉjW#N_sÀªÀD{L! °ÁD{L! °ÁD{L! °ÁD{Lu,àFOõÕ»qöšV&’ÐuÛê †€ÀÎÀD’š[„ïL‰düŒãÛÁÏÝúLO†pgå{k?¤æ€U‰¬‚Í}Ãm³¸LI©ðòÒװ*0‘ìNˆ÷K èút¹°ea€)ЮfUt/Ýøö¬‚Õ0’ìµZï~ È*ØA˜ÈÖ6 ëA½jí*xýÝ#jX˜HÁ™ÛÊõX`ãÁDJNÅÙ½Ž l<˜ç‚! °ÁDò;!ÑC_ÚýãáEÀnj½€æXŒÈƒï+¬ L$ zydôòêZ@íçÖMa€É ¸\v`ï¢ëZÀå3»M@Ô¬ L$#à²É§¬{‘€[‡g¯9`U`"™½`m {ÁÚ4~´€Àn> Nú.SB@`ˆ6.L! °ÁD2¤rAŠ<÷ô,B6ƒ€¤i4 ’¦A@Ò4HšIÓ išr ¹"¥sZØx0†€À9* Y•¯®“v+÷è–½{·÷²æ€U‰œi½€Ê_¨¯W÷ŒÞ½¿ô5¬ Lä„€Êþé%gZÀ—³Òþ]& í)â\|ùϬ‚Ý&  ~†" °»tûJèvEØ•µdoá°üµCüùaa4;7²vblBûÖvÜö3- uOk1Âø5¬ L$»b•{éX@mïðŒ€ÀÚ ¸L¯\@í÷h¯9`U`"[;!ß«`­ó«à0Âw 8EÍ«Ù< #vBÌ”R;!Ëп`¬[KÓ;%`Ͱ ¬©€´€ÀÚ xaa€A@`3 hŸN­‚¿6‡©9`U`"÷UâÃÔ°*0‘š*íÎý.¥Vá Ïæqòq÷fÈßrÆ8·¼0ó.¦ya"UTnek~­‚ýæÂË0s°Æ?š²ËšV&R·\¤Rîò—×Z@×ú¬€Ëa§¡*¸ ,fÞÅ4/L¤¾€F²oíw¿VÁö Ÿ·ÛšV&RlOÇi' mµ;y¼nði0‘KvBB è.K°'(÷ÞŒ»Ú q«ïnkX˜HíUð‘L»8LÍ«i) m(̼‹i^˜§â€M#à?Q>þ7Êçóÿe’lî0mjX˜×°*0,®9`U`"W ø9¥ øùœ0û¤+œ&B X\sÀªÀD°¸æ€U‰ `qÍ«AÀâšV&Âh`ìA0†€ÀA@`ìA0†€ÀA@`ìA0†€ÀA@`ìA0†€ÀA@`ý Xöø_ž ì“æÕÀ.põ¶DÀ)kX˜HR@õõ¬87Ð>®U>-“V«+`ü´Ì¯§¯j}äq­<+ë&r½€<¬ØqÝv^Z@óV­äÕÀJ`"Ùð3Ž{RõêùÓþFâ+µx`5°úîLT´m™Â° ì Ý3ö C ì €ÃØx0Ö¡€Ê?ppùïíôæÏòÎ^sÀªÀDò- ÐìúÚ‰l\f0{Í«É ¸!À؃`" Gƒù ?eoÒ¾±u;VÉp˜Ð]¬ª_X AÀ‚·öx¶9ˆ¤Ôê:üp…ôˆ%CÀQ`¾gŸòÝš›æuà’Ý AÀ"Ø"ßrØ/êá¬CgƒqKv;LK`Ñý8|çÏWöŒ €‰ `ÁÛ¨'ÒjlO»ÐÛ/0³bWĈ€À†‰ 0æ.Åú ¶¾H­’}2¾Ô[ÃÖWf®Ì*)¡¤ê£dî%X—¸êö—Î"x ¶uatX6…°¯¥Û¼“Úm]~ÄEüV¶\VnÂ’û lPÅÚí¸XAÀ‚·§Ífã°Ù¹äæ’Õ{Ú”ÐkÂhwÊK x Œm@iÛ€-`ë¥d?Ù©˜ÙCÉÜKRÅÖ!à•0·4~ƒ)ŽŠŒì°Îa"I ¹+HšIÓ i$Mƒ€¤i4 ’¦A@Ò4HšIÓ i$Mƒ€¤i4 ’¦A@Ò4HšIÓü?xÝîÆWåœIEND®B`‚Bio-Graphics-2.39/t/data/t2/version1.png000444001750001750 2406612366325116 20044 0ustar00lsteinlstein000000000000‰PNG  IHDRXËJ @PLTEÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõKѧg IDATxœíK’´:²„I³;èaoâ5ìIoý­äöº=@9ÜíþÊ$ƒpB_ %h(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(J›ÆÒ¢¼¦bÑ:®3ÇÏ$Å$Ì<Á’›Ó/æócž`ÉMZ¯ÏŸ–BÇÂÁúñ”eª³Šés¬¬_ÌÇÒõûç3þz±}õyÀ<Á’›´^É¡Ðö_£ëÆþþ›~ì¡búKkˆ˜Z€5X亨˜>ǪÀ²¿qxñPȤÇÀ EtñPȤ¥¸zÙ1ÖÇ×Ó‹ƒw&]Äa ËU?ÓçX6XŠ‚D°¨[T Ö—¢ªE°¨[D°¨[D°¨[D°¨[D°¨[D°¨[ÄóXÔM"XÔ-ªË*óW¡§ýS° -Yþ[áñ4«'iëéq"éXG¬¾D°¨[D°¨[D°¨[D°¨[D°¨[¤,J™€u4 ÁêI:ÀŠò]´ŽëÌñ3I1 3O°ä&Å$Ì<Á’›“0óKnRL7™7mwúJÇÆ˜iñ÷TÇý‚eô‚õÃÉ„Ÿd:î¬_‹˜qZº_ôßmwú@ðdu¦Åï!vlÂB’ã§“bº ÿ¯QXva” ƒm“ö±f X™8LWä7à Öôû¯¬ÉöÔÅ&Ý­ón:~6)¦ Á²Áq-$»b&,†§Áþj¬L¦ ò;à5ö˜bƒå÷Xq¿ M¼Z”ã§“b:Ÿß㣉° ƒ÷ðýCœã§“bº0¿QZ1}Ž»Ëýáûï×<û÷vìoð«ý?·¯" Û 8¾¢Æ;qÇöu ê*°2î^ –=„Vl ¨±‰ÄÛÔ1¨ ÀúÏZ1Xë÷vÁÊl1§¬Læ=Û¯Ôt„åöÆvÁJXŠWW\³/û;I°ƒ7´ë·0°ª;¦bWF°^Öªa§wöÁŠÉÀk\îÊúËïz –©Ö:âï=wªv:—ðë`üëä½c`­ÿÌ3Q³VLÀÑãüîŸ!iåX6XëÕ¯è±JŽáfº¬{¬õj‚E°&X+§ À* Y­®¬~Ê%›ùíº|ˆã+j¼ Ö¥*%ÅD°p|E»ëΊ]|}Í_Y&‚…¬q˜„™¿¬«Çµ¯,ÁBƒ Ö‰8LÂÌ, e"Xh0Á:‡I˜y‚%¡L &X'â0 3O°$”‰`¡ÁÇâÁš±89ÌÆ@[æÍh1DÅô9ÖãŽz°&ø?¡sŸ~EÅô9~XÓv—` ñKõÓçX'X®7â¡IÓ¸j¥`…Áû´ÿc2xwÇ@ÞûLŠi¹‰ÐõS1}Ž V«¸ÎkëaóKnRLÂÌ,¹I1 3O°ä&ÅÔÈ|<“¨›À/7‹ÁœÓ`M?™ðÓÓSØÆkps(›ivÓÁwUŽ3‚¥))¦&æ@wøûÌ„Óô…ª’bºßü4¿ö¯‹²`Ùö'öXš’bºÝü„ÁzARL-À2¹C!ïÚ’bºß¼1S5Þ㥄Š)lc‚¥¡bú¬Vq9&Xaa í$H>»ãx;Ë*8¬Ã·E°51oÌ¿eš©LÄNó–3›Üö3¯k·E°50bš)A¦*i Y X‹O¯I¿H°ÝnÆê¯™2½\1Äv–ÚÝÝÛÖé2,جÁÇ…™¤…W–éB°Ê-PÚ˜`Ikó& mL°d€µó“„6~¬#*%…Bnëí$Å$¡NªÏñ3I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&­rÙìÎu«š+¦Ïñ›ÀzqÅô9–ÖÆ àÓÚa~ÎÏèÞÉÏ®¹bú‹+<ʸ‡[|ÆyíôãD“£+ùÌ;*¦Ï±x°ìÿö&%ß™Ö0áänaŠpª˜¢RUÅô9ÖÖôŒ×Á.â'šXœÌõX> …=&­—=÷¤D˜ `Ö¢Çâ¡°Ó¤õ ƒw‹Oið>øµáPȫǤ˜ÊÛ98¹£¾ŠésL°ZÅõÖÆ À*?)÷æ‡TC|™#„`åÎù:r¾ÆG›åpm}m<`¬°@ÉŠ§aX,²oÖ.ZÇuæ¸uÒчÖÊ K£ãÀ‚È2ÁRéø °².zÕ‹êÉØc©t,¼Çš>K°:~,„«ß§yº§jWÏcmî.Áò ”«‹`…θӘùvq9~&)¦úü?j«{¬øƒf¨šº; ù}µ­YDÔ¸K>'© ™¾s/|ífY‡dƒ·³dãð‚¨ñý`Ù˲*MÄ…1u`ÙY™CÅvJ;¦1aÕ!Ó•f`-²,we/‹Y‡ä‚»[Ör÷o©ñý`¹»t6¿HÎæË—õÏÛw&Úí/J»'‡*wIˆq=VëÕŸ¿7ÿ~úý³üùL?N kÊ!KzÒj}~:Ö`ÁÊRòùx’ÖË’Vë×ÈÛNiQëG“c‘`½,iµX?J¦ìÎv9ö}w¸óoºR°ì§—`¹Þðã·6ŹWÒ*¦°uw2ŸO€Á-\ÏãàÛ˽2DoÊ«˜Â6Ö–%j –%é³ – OÁŠÞ”W1…m¬¬ôÍ,×óê±æ|â*¦°U€5ä;™%Xó!m1xO¾\òPøÞ¤ÕŠˆÈ çý'¼GG6?–çཋ¤˜Xgò¯N‡©ª˜>ÇJÀšÏiÊïôט'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤õòÞy>æÛ+6†bØj„§UŠu¬,¿Ø{ÎôK+–‚5?˜`¥qõú=ýWÀ©Ç2ÑSÒÝ£b§ßYcªŸ««ªbö ºn÷L:_Jxس(ÇO'­Wü¤áÕcÃíZ蹺Ú*ž4ll-üûF°qõаk°ÓóR°Üs¬]oe¿«á1óâ?›´^ɓۣCaV[ó +§>I·l¢Õ²?œ´^ËC¡ßD`ÅýR|(4ñjQŽŸNZ¯0xŸZÞ'äz¼»"Á:V¸œŒ¨£Šés¬ ¬¤ÇzÎ<Á’›SE~³Pµùeà¥Üáj~‰9šÔná÷¢nOëj<ŒëmÔ³qh_PÇ 2›ØÛÁŒ‘Xßû4MH"8lÎ|v7V´´ßžËl€u°ˆcPc ¤ú~²Ú­`Ù³ã&«ò¤æ °–¸×`媄‹r(J+òWÓÝÖ/æ=¿r »ï’,~+îk]+·¿!«þæ|W¿Ñ‹˜w\JŠiÏü™=oVã ÞÓú1\Þsû;õ*°ÚŒ± =%X/ ûVx&)ÁÚÕ­`Ý©EØâ©¤ÀžÞQãKöu êN°ÚÅuæø™¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)¦Ì/®f^ 7¯u&X‚“bº ¬IéËòw8‚%8)¦Sùí<‹ëçë1¿Co˜/¨û}š=–ʤ˜Îeoä1îJæ š1\Ñâ®x×–ÏÈ,I1k˜/‹·çÖÜ…¨ó=,·–c,½I1]Öô^¬ð‚¥5)¦s`™ X™C¡YÜ C°4&Åt,7x·L%ƒ÷pãÏ8¬ïÆ\ØSÁ%Åt¬«Í,¹I1,…ŽßVéb UÓçøý`•.SU1}Ž V«î­ –†ŠésL°ZítomL°4TLŸc‚Õj§{kã׃•žoPZ1}Ž_V¼ XoOŠI˜y‚%7)&aæ –Ü¤˜.ËÏCáÛ“bº.¿)ïÞ´ý¡‘` NŠé~ó{7íÄÕ%X‚“bº2ÿ|ÓÎ\Ù·}ÓÎ@°t$Åt]~ß´“¹-§|ÓÎÈC¡†¤˜.kðHånË©¹i‡` NŠéÊü XÓ›E°âµVPî~’bº,“k÷¦Ò·I|Ïûiã¾À2óM;Ãrð^yÓÁœÓµ`6O°ä&Åte~‚õꤘ.«ô¬TÙSØÆ½Uzº³ìŠ)lc‚E°Þ“ÁÒØÆËNl$»b Û˜`±ÇzORLKc÷VétCõ9‚%8)&aæ –Ü¤˜„™'Xr“bjf¾jR]‚%8)¦væ³³"K¨˜Â6&X»‹ô,×_r‘Í-I/ î()¦§Í'`w1àï2ç±òèùt¹ûIŠ©©y“ b–ñ˜p¸œg#8ŸôÞàŽ’bzÖ|:Ïò† åî')¦ÍÿΞÎ7‚MïY°üéTöX¢’bjn> ªæ{z`…¯KTRLí͈ìÍ«C¡Å‰ƒwqI1=hþwWO:x··±ÿBE¹ûIŠI˜ù'’êsL° ‹âÅKpRLÏ™?Oˆr÷“Óƒ`¾,PD¹ûIŠé1ó†`)KŠé9óKYRLKc,‚õž¤˜–Æ6&X[`ñtƒ®¤˜„™"©>Ç«U\gŽ V«¸Î¬Vq9&XaÿÕy㺂%8)¦'Àš~Ê^ÉG°'Åt¿ùõÍ8aº/‚¥))¦&æÓ+ýt_<êJŠé~ó™›qŠ7,ÁI1Ýn>w3ÁÒ˜S °LîPÈÁ»¶¤˜î7¿ºgã©KpRLÂÌ,¹I1 3O°ä&Åt»ùüÕ1ÛÚI|vÇñv–UpX‡o‹`%º¬Üõ|ÛÊ4S™ˆæ-§7¹íg^×n‹`% V‚LUÒ²°Ÿ^-’~‘` V¦·€+æ‘ØÎR»»{Û:]&‚Õ¬ÓIkÒgÇX› ‚ˆ`¬Ê8L‹`UÆaº¬:´*=¼»m¬·TLŸc‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3ÇÂÁúü´ÚÄç“Éïß|eÅô9–ýŸ`1é-`ý:.× £ýgóÍ·ULŸcñ`M‡BKŽCÌwN…7kû.UÓçX{¬Šm-?-{Œ•Iú>°4Œ±ö·µøt›o…‡kžIú:°š+L‡Ž/3CÌmíúz°Ž¨” ¹¬KUJŠéò¾´bòƒ;JŠI˜y‚%7)&8ÿwZ|ëÌÝOßZóßuðvªï2é÷›dÎ}P¿¬¯[l£²+¡ ­Ø·°ºÎ1º Xù£îàk;‡ïoù÷ÿŒÁïÀ†ûÌà?9ƯM·3}fÚÂwúŒëíÚqÞÂw˜×Æ[pífüg¾‘÷«ËM°ò:Öwj:‹ûÉÎwìgloaˆ>ã·`›ÖÎÝÊ79~‡CgämÕnÁ›-:ll·”›`åu¬¯ëo†¹Éc°\WšwÈ€5uM®WV`Å b°¢-,·ú6¹kæ÷ –|°Â@+ –oî%Xñ¡Ð5y,·¬•Å9K´âêr¬¼Ðüßt‘ë[:ñg `Mï»kN VöP8l€ÅÁ»h°ÂP&t(vXæ¢+V§ƒ÷E†Þnp4Ì£¡} V´6“å!íÞS¿¬Ãæ—ƒ÷sIããÚ·»6&Xñ"î±N'%X«A\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜` «;TýÓULa¬¬é§ä‘A"*¦°»˸GøÍ›1fïAKpRL·š7ƒ{Xé?%’‡BI1Ýg~ê ÜãGÃÿÓ»’vÒÆ=ƒå?J°^“Ó`™Ü¡ƒw­I1ÝgÞ˜©ÇJž$WÒNÚ¸k°ÔTLŸc‚Õ*®3ǃåêÇž°• ùìŽãÚg¸Ã:|[+Ñ}æýÉÐcÏ;Yl±LÄNóV>f¹…|*Ä1ÁºËüi°dª’¦Õ€µøôj‘ô‹ ÐmæC +Ó[ÀÛMŸöq;ÛÞÛÖá25{X× W¬ö‘h5  ‚E°*ã0Ýh~o`B°Ö óßÑ‹:´*=¼»m¬·TLŸc‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c-`}>ÅüŸßº—WLŸcé`ýQóÙk$XLŠ‚õc&ËÁbÒL\µ&¨Fw¸³ÿ|Æ_/ö±¯¦Õ,÷êÓçX8Xé¡Ðö_cÔML……Çð}ÓçX:XCÄÔ,×s…ëÅÓçXXöpçÁò?†1…Ý'­V8ÀEtåÁâ¡IÙ1ÖÇõ’Ë í:Þ™Vtc¬‡Í,¹I1ͶÇzØ<Á’›“0óKnRLÂÌ,¹I1 3O°ä&­—}²“ôÆÎCbß§ÝTLŸcé`ýÀ2~Ö·ßvʾÙ<Á’›’±³)…9”Œñ³võS1}ŽåƒÏúæ©t¨uS1}Ž•€eÒI “žkÂÇ8¦"°ü¾Šés,,ûÜàä[áèžÏ΋IO€np•6îû ÁbÒã` 4O°ä&Å$Ì<Á’›´ZG挠:V5Xø,7TÇ"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-ª‹¢Õ‚5IØŸ ø'¹I1 3O°ä&Å$Ì<Á’›“0óKnRL¹MØ‘Z|E©»fþàÖµ€ª*¦Ï±V°~‹–1DfkóÖCUÓçX1XþfÃéÃÑÝoøÇYkûÖCUÓçX/Xöæ ù»¿áÂðPØsRL`™¬`1)¦ìvü}†f–1ÑÈŠ`u–SnöÜ}ò­ÐÑæþF×wTLŸcµ`E§\/åþR4ƒ5½ÿŽŠés¬¬Î*¦Ï1Áj×™c­`µ¼ƒºBZÀzú’2 Á¢nÁ¢nÁ¢nÁ¢nÁ¢nÁ¢nÁ¢n‘°(eRÖ©üçÌ?‘TŸãg’bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜n2 'Vlê¦q¸Áot9¿&|!XÝcûžÒ¸b,fxñ–­ùaž¸Q†cI1Ï?ßp8Oœ"¶ÇÝÍ’v¢Fßc…=ˆàäXHRLä÷…Í7÷+Ü"9Ä÷Фw¶ <fâ0]‘=˜t°Ì Ö ˜¢Š`t!X&܉èÇÃÍvº>ØÓÍ,k9úŒÇb’bº ¿¼Cô<±=Ö|Ûâ¶ÉøÎ6QŽå$Åt>ÿü%*üâ +:Ýà¿i`·LŠhã.À sù'*¦ÏqO`¥'UULŸã>ÀÚ¹º¸ck‹…,«ˆfá|O·q`ý_F&³º¬ÜKY–;`¾ ND,‚uIE$ÅD°Ve¦»Àš•{oGÕ`e"Œ?UëÌ;¿žFXK9X™Õì±’`¬ŒÁªŒÃD°Ve¦ À*J\­®Ýiü„e6s½Y8ßÓmÜXê+¦Ï1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌñ;Àú|k>÷ÓôƒþŠés,¬ÏgÍ6X–$‚ÕgÒjý¸¨`£ ÖK*¦Ï±°,9ÓOÓ?ã'~eÿ `¹uþ½èkïâTULŸcá`¹C¡ÅÉõ_£ëÆÒ7ýÆçË1^áM}ÓçX:XC`hH]?D°˜ôz°â7ýÆ7ÀòÇN…ÓçX8XÙ£^V¶Ç oëKiÅô9Ö0ÂãÁ»gh=xwãõdr´dõö¤˜®ÊÏ1Öë“bº,?{¬·'Å$Ì<Á’›“0óKnRLÂÌ,¹I1Îï&:‰'efe“P1…mÜXñ"Kü$m Ûøu`™é ׿çâÙIþæ™oÝÜYf–_;ÍhâI(åTLa¿,?…¤C̬…&kž'×a¸3“7ÁœÖ`§é6&LzƒeŒÉ‚e??†IeULa¿,7ä ¬hNhbÂ|¾¬[vº·6~XÆ•ôXÑd㙋`½$)&,?x枇ç£=àÅÃódð>!ÆÁ»Ö¤˜P°0ó¾/]1…mÜ=Xa&ï›wº·6~Xÿéïå#ý½üWV¥mågy b Û˜`¬÷$ÅD°4¶ñ«Áú>Å`ý½ÌƒUšðˆ`)KŠé8X{¬¾’b"XÛ˜`¬÷$ÅD°4¶ñëÀzeÅô9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9VVí䜯°Ï¤˜J`e§ÈäD˜='ÅTÚN X/©˜>ÇÂÁú¬æÒÂD˜áŸ1N„ÙuÒj¥³E‹'ÎWȤ!®ZKmw'iz}Òj}’9¡×`Åã©'Âì6iµü‘+’G‡´Ï¼zÞ8'Âì8iµ¶O„³'V ޱ^Ÿ´Z5`¹s ©Ùc½=)&aæ –Ü¤˜„™þ1˜¥IDAT'Xr“bfž`ÉMZ/&[ 3á˜õÌp¯¯˜>ÇÒÁú)€eâ ßNL’ª¯bú+ËN±4Ï$èæÄaŤ§ÀrSTŽöçh†.‚Ť§Á23XÁbÒR  㘊ÀòCø>*¦Ï±t°ì„oÉ·ÂÑM[É‹IO€n°?» - “žK y‚%7)&aæoOZš2 ÓëË”‹Ã$ÌüÆêkÈχê/ë¤ùkšá$$隺œk›‡ÀºfןnÀwëš6º,"AÕÂÇ«]ÓFWöX`qŒu§®©Ë¹¶Q=x¿&îšf…Dãò¬û‚¯AâõeÊÅafþ‰¤ú¬Vq9&X­â:sL°ZÅuæX+Xö+K|}–ûc/ÜrÜúR£ªbú_Ô~I®Ãó_Tç†M¿¦`*å`åŠÎšl~[VÕLú_”4€ežIÃzì®Ëߺ3ݰ3º»wœ‹{,íI½íÏßNãÛ8mØ‹ÁŠ3øË8'Ñg„VL_?‘4´é yÜý€½«…îÃÖ@°^—tËÌ` °®î±ü];fVòw‚¥:©ÿ.f`“Ü¡u)Xöúˆä[aäÄï–æ¤˜åÝYsÃsÃà=>Ýàz)cf'£{#>Ë©˜¾6~¬ètCÒÆX·œnP[±?““0ó瓼^AWß–tuõÆÁ:FHÓ+¬$”é¢à¤zaÕ‘–:Œ£ °ÊÕv€õZDZê Ž—ƒUÙ8óoÃY°ˆˆDmBƒ7& {¬ö:VÄôXcÕê "gküÂ1ÖÍ{ž¼nŠãaD/ÓEÁIõ¿/ëXð1BxË.\5²q˜z©Ø«?““0óKnRLÂÌ,¹I1 3O°ä&Åt“yè”]Ê١iææ”øâXd,O° ºÇ|ãáÇßýÍçÜÌ!H]€ n—àƒ6ÈÞ€Vç_…fØ„R§!q÷Ib~bh¢ˆ$¨â‡î·â‰nhÒ~~øc‰(FxaŽ/rÇ#‹8¸cŒ#êä‘&)cDi¤’EB™"RRèc“Vbia–HN¸à7V¹eITÔX#jg‚É#ƒZR©‹nF¹dœN& g˜^Èf—r¢§f›î)&BòY§—‚执Ÿ€þùåI5 é¡}N¹(¥ 6ªé£\掊™h¥‚º©¨¤2‰¤©†v:ç¥þ®2Úªª¨Bênf¢é­fFJZ¯°ŽI(­o†ªh¦±bZ¨§Æ^™ì³œ2{ê«ÍÖɪ´³Žª,­×«åx#•™ë@iv’æ®·šk㤓f›ê°Èuûn ó†*ï¶zÖ{ê½Ðæ‹o°ñV ­¶ý~*0±Î’Inºêšv.¯é>Œ°¥SÉïÄüŒ1·«1¼O›êLJ<+ÈÈnŒrŠÞžL¯~ /¬+»Û(óšúºœpËØü¯½ãüó¾A›sϯ­ÒHí®­’2\n¹QGíÍB ´ÈÛ’ìô˜<‡0Ó<']rÊdGiöÁ^s½¬Ø]£$îýFuÃêR]«þÖD»½qÛ:·ø5¢G—=¸z€÷\¬ßÃ&÷Û…#.7‚§M1ã&+>räÖ^ŸãG¯í7èC?ùøßœ—êyƶöêúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üò´›ÄüóÐG/ýôÔWoýõØg¯ýö¾;ïGà‡/þøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ _»FR£ð€L ÈÀ:ðŒ ß7@‘p‚Ì 7ÈÁzðƒ ¡FÀï‰ð„(L¡ WȺp~ É_HÃÚð†8Ì¡ÝCÌp‡þ@ ¢‡HÄ"°‡ù¡—ÈÄ&:ñ‰9D¢G¸GÅ*ZñŠXÌ¢·ÈÅ.ÆÎ{^ £ÇHÆ2šñŒh Ì0—5•e©Séøfº8ú‹ŽMc£ÑJ—ÇÀùÑgx4œŸ6#G¥ñˆL¤" =>¶Œ‹…Ü#'IÉJZò’$|£!©0IšŠ  ¥(G9@MbK‰Œä&?9ÊVºò•;,åꢃJ ªò”¬„¥.wÉKÊrªåoùÈ\öò˜ÈLfùÇbz˜E¦2§IÍjÚ™šs’4#MmÓšà §8чÍÓi›ì&—Ð9ÎvºS™å´£®žÙÉUbòžøþ̧>¹çÈhnQªÚ§@JЂ¯ŸÞÔ"@-Ç:„ª˜„s(Ç *9‰Zl–wtãÖš¹9‹fΜ›E?'Ï‰Ž£—CéCUŠ:š£/ ¤Ú`Š6S ’¥)NCêRÁ´¡2íÜOåXRŸî´ èQ÷Ô•fs`:}jK›ªT©æ´§«¢é²’zÑ¡f”«-êÒl:S¯Æ´žVå)Uƒc³”©dêR ©¢¶g\®“kZáªÕ:bíÛ\÷†Ö·25°AÒ` KW°¾Ô¬5•]k#µÑdò±ƒèZÃúWjAŽ[¸ú X*UVjW–¹Ìµ¸ÌVt³˜Ýþ«–òšÚ[ýŠW"! »êZ’†Ö­b-m\ÊXÂ’ä¤Ru¯$E.4Í&b­•mc‡[ÕâF4bÍ­Y…&»[ÎÂv«Ôå­t^ï"Ö¸£ýìXETYI9Ì5ЕÕx5{Þ›ÎWrRjóÊ\4Ù׺¯­oY{ TëÀ¾]hy#K¤öžë4ü…ÜoŸäX£Þ÷sºµlsY“.ÿøÂ®pVÕ+\Ò"÷tàɉ;êªå>·—u¯|â[˜Æu-H&µ«†½÷¿Áõ,£…ã¯ÚxÄCþjz“|VÓ’‹­µ¥Údä±ÙN¤} mÍDYÜö¸n«ò„…uåè¹Éežqþ•§´duh¶ýð™Ìä­™Âiî˜çxÞÇmÌTÞsTç Þq¹n6²‰³låE“Xȉ^¡×Kb?Cuu.4„„×Û­N{®Ý§ÿiOâZÒwÖ矒ÏEv£s]ß_Ïú¶÷.ö¿Ÿ|íl»7ߎw,?zaS8}‹q<÷Üëþîû³ ï6Â>óƒÇ|Ç9¯Ò¹ÑÇn¿_Ý;sB™þ„«/íÝ}ýæuª‘Öͳ5öt=»Q+´Ôm¼™SÏUvçÄïeçûë-ÿ‹ºÏ¢'w-|5˽øÁ>þÕ«þ¯gî[êÏx¼[¯VÚ?ù;´÷…5{Ë;Ó~]?Ÿ™F~¾‚þïtÜåŸ~To_ûüw €ë§~æ‡fކ6~•Çs÷§vwqá÷}øW‡å~Ã'Qh4X 8¦dÕ~yFHg'6q´ Øho \"ˆ^ø‚âGƒØûG{¯·L¨÷h}˜‚7†~˜¶‚3øW58y%Hd-ˆxJ„E8„Ýg„y·‚M`”Ç ¸QJƒ8T?èmTˆ…ùÇ€^ȃˆ†sB‚­Æ†(h…&¨†CV† ¤xUø„H‡¨…;˜„2(†€¸†8‡þÔ…‡w†~ø…‚†9È„(lC戴… æ†DèƒR¸Az¨‰‘Øx˜Xc ‰‡Ã&‡,(„|èT¥ˆ ô‰¨Š£X{ (aUˆŠ•H‹“x‹P¨gdˆ芾h‰ˆ6ˆlvƒ¦ø‡v¸ŒÆ(f¯Œ8X‡:(Œ¾Ø‡O˜b!Q‹ŠƒH8Œ=8‹‡¸Š{XŠÈH’h]8ÌXìøŒrö×HŒâŽmXóŽÙ8hòè‡Ø‡ãÈè¬hŽýØŠú”èfðx`iIå(‘Åȋꨋ i‘﨑ÎÈ‘çØŽé¸‘Ù‹ëØ‘#©Žyûx’"iˆ¨ù¨þ’0Y’ÙÄõ‰þH+é’äX‘,i’ ‰c6Y]89†-“/™ŠAY“ÙI”O‘H)”Jù“:™’K¹‹M •Êè”]I•…˜”;™Lé“©‚Í–CGEy~b¹–G9–VY–2y–W™–¸$©•XÙ“yÙ—9‘UÉ–y‘_9—r—îX—~©—Y¸˜„I—†I“ŠÙ˜•ù˜‚™“€i—[™‘a™‹‰É˜!阃 ”h¹™…y™¥Y™Qé–S9™’‰š‡I–š‰’§©“¯)Qoi^Y™›y›¶ œ3)œu¹›TÕ›±•™Ä‰—žù—ÅÙœ\™šˆÉ—Óò‰ß)Êþy„¤)ŠªI™¬é¸É™3YB G,Ø Ú›´ùœ™†˜žhøžK(ždYBf×bgè„Ò šÔ9œäéœÆÉœ:%5f[¦Zy“_“R[f jŸ¦Y þY›ºšÝ9Ÿ$iž•ƒ.·¥.Vƒ ¶¢"¢¢A¢!ê~ôIˆ³ù›*•¡Ùžê•2„zj5"J3e·£y¥7(Ú wC¡ª¡²ŸÊ¢ßù¢‰Ÿ½‘£g1#Z3'z3©±žPJsD*ŸJ:žFJ£ý)£ÿyœ„£¦£*‡vTª¦QÚeÕ¡¢"Ú¥ú¥0J§Á¦°9£ºY¦Wz¦vC¥¨ª þü5¨âve-Šê¥à™¤ˆº¤H*šÖ9+&w5ê¨_“¨è¸¥˜ Lš ’œ*© q1•:]xÊ›ìY§z¤­É¥Z£ ©­Ú©¬'«¡ ¦1š§cꚣɪ·ªªL¹Šªzz§ÃšœüH«ãÕ’'¤vÃbZ¤«Š«v*¬ÕêœÈI{Û‰dÏu8 _Æçž¶º¨s:­À©í™­Iµ­vÂeWS¥xužïš}âʨÁ* §Š¬ÅZž½J­c¹.ÐuZO–ŸS­®š©ã*§j®MÚ¯çÊ„ú•]DZcáz©¾J® {¯Z¯÷é°ÆŠû%±B±ôj±þª±ʱ‹®{:þ©+ûWÚÅ.óºZÛ­%›¯Úšª˰ÖʳØê±=;~»ò®¾’735T~*+­(+¦«¬2ס@‹¯Çš³ûJµ×º±&û°¿Ú°.Ë´,»³M««O{± ¶³*ªñ©ìšfûªå:¶Äº«ë©Rûµu[«º=ý¤nf‰$Æsn±Ã3{³U»®:˯x µ¡³0 𸹒;¹”[¹–¹Íú|ÐW gZ—û¹“›¹B*¡È±¹Úá ›º+º¶¸´y»¬w«öªƒ5¢º¶{»¡ûe͵{›{Z†»—«[Ðw6²ó»À[¹¬ÛY›²[ëµ²·ÁU»Ç;½©ûtËþ;3®C½¡Ë Iö:Ú+¹É;×K¶®+„êJ]m‹Òû½ì ¹á‹°§‚ºí ï LòÛ¾õ™a´ûû³‹û¶ð»¾óK½ù »ñ;À\\÷˾ ì¢ý«µ8‹¸‚øº¼5LÀW ¸<Ž ü½ ¬¨gKÁ «k›°pÛe³V¶´R¸WÉÂWE·ŒËGl›¬l·³›¶'ûÀÌÁ蛸þû¼/Ûµü‹Ã\‹±h+ÄXë³{¾lãÃ|¸=œÁ; ÅM,ÅNk™1ŒG3lÅäÛ¼CŒÄO<¾s €9LÄb«ÃW¼]§v¼Å0\ÃzÛ±ÿ[Æ`<Åb¬¯ü1Y¿2°àz“YÜgþ& ¿r ÄGlÄ",à ¸ q6´,G+ÇplÀÐkÆŠKȇ¬ÅlÃ"‰]îÅcÀÁ]ñøÇô—ÉqL¦s\Ä!,Ê!¸ƒz&û5¨PÊ‘\ÁAlÈæ;µa¬Äv¬ËD™a¶a¸BKÐHǶ<Ë#<È%|ÃuœÆ<|0»E²@ºZwuŒ— ÈÊ\ÌéŠË»,·x¬Â~¨ÈnªÇÎf²LÌ©l̈LÂáÆÞ|Æ”œÄÜlµolÎ'Ì«§ìÎËÜÅÍ<:N¼Íh¬ÏTÌϬÊ`XÈçLÏ‚\ËÊõl£–LÐhÐ Ík¿wÜÛpÔ§‰»ã‹•TÅm9Æå‹Î˜Ì|ÁÚ„¤ þfÆ‹¿ø²Ñ¸¸;§SÒ&=Ó ›¥‹Å"mÍ“œÏHÓ ü§¿&n2=½¡—;«¿º#Y>½Ôª«XJËÄ=Ï Ð9ÔL]½E»#½‚À_Ï 3;WÖÁûÁ§¨ÍÌÐ,•¾WøÍb ¼Œ&VíÖ\ÜÓm]׫ûÈ#hÖ}ÇòÜγ×v ¾<¿d­ÓËØMØq®PÖý|Ö|TˆØô;Ø,-ÕO8Ù”MÔoT\½×¼…Ò÷G.ìÅd8IQüÑÝÒ­É =Ñ9=Ê×¼ÐΛÌ;ÍS ÛMÕÕLÛ¹mÛ•ŒÛ±íÛ}‰¤,ÉÅÍÛ¿}ÔȼÎÉM˽þÍÜÇMÍÕ=Ì»]ÊöüгíÜË­ÝÍ]ÐáÑãÜêÜììÚÙ­ÜÓ Þ×]Îë-ÝMÜíÍÞåmÝÝ-ÞïíûíÇj ݵ-Û¯íÞùMÞým”—ÿÞÑ}Ìßmß î›ø¬Û.Ü?Lß÷Ý.àñíàõ-ß¾œó àÁÍánÜnÞ%Žâá ÎéÚ¹ìÕ«í×ðüÏ -ã)ûÙ(Ú9¾ÏŽ=×­­ã=Ú ÍãЪÞ'NÝ)Žß-âM®áÃMâåOîáßKNàWžÎÏÍàÎâîåUŽå!É]>Ò_ã NænæQ®å_LásnáK¬×?ŽÖ -äþ}­äunâ.æ·½Î9g¨Ö¸˜æ†ýænžåüçžÍÛXè3ŽãCä{ŽÙÎäŠܦ<ªs´m%Ô̧y3Ì…¥YÙ5îç7þΕëþ,ëW.ì¢cÒL´}éx³£Ï:ñèn.6v>⮘¾ì Ïív>ïò_ëxþþk/lï¢ï ò oäÉ®ð™NÆ®wòÛ.ò€Þð#Ÿò–îŸäH^±=ô/ô0Ïñ,ÿò.ßçm†×nÆôñFzM¯ŠPcN½‰,õWÏÁYÆ0Úø¼S–ÙXOÒaÏŽU³Yï“Sß‚c†éÒõÉüîë÷rÿÌŽŒë|Üîso÷r÷t÷|_÷€¿÷¾|÷}Ÿ÷÷ø…øƒÏø‡Ÿø„¯÷oø‘¯ø’¿ø?ùšŸùù—ÿù–ú‚ÿøœOú¢Où¨¿ù¦_ù¬Ÿú¥ÌnÝþ®ú~ÿú®¿ú£_û¸Oû¹ßûŽßú¼ÿû¾ïùº_üÃúÇúÁOüÉü¶þ¿üÈûÆýÊÿüÖýÔßúÌ/ý¾&±ÞŒxýÕ?þÓ¿ýÙ/üèoþýâïüäßüÜþòßþéÏþ»Oÿóÿúÿþõ_þöïÿÑI`'? ,ˆPáB :<Ȱ“ ‰-^Ęñ¢Ž=~RäH’%MžD™RåJ–-]¾„SæLš5mÞÄ™SçNž 5þª‘ŠCŠ!FlhâÑ¥›UêTêéI¡^¥šÕªV¤[»veZlT®c±z}Ê5lÙ´hɺ=kVí[¹pçÆm[w­×º}ÛîýšW°ØÁl Ó-Ê7èâŸT"&¶Ù/ÞÔ ßÅ,¹°æÊ™'{þÞ¸³èË|C>MµêÑŸM^mù5èÖ©ÏÆ¦]zâCÇŒ}7N y÷@á‹í#+øœº‚zû­A‹ôãÀÙû/)ÄPBùÓCÿêK0D/ìªÃþH„ì(9d‘»÷Z¬0CAqÂm|À?üPEM¬.ÇWÌ/!DòHE¼‘Égä‘Èì„”QÇ*c\²F'¡|rK+£t‘ËÅÜðK)¯¤±I-×T³D2Ù\/Ë6äþJ0½üΡ#‘lðH:ÍänÏ3ïdÓÏ7çœQÐ1eÒPFáLôÐ?³stÈEcTO4 í¤ÒM¥/SHmÓSN'í”ÏÅŽJU«‚@ýÑ!9QUJÇrJZmíh?RÁã•£‰t•1ƒzKÈNX‰£ò£\…ÒV‚„UöÒ ›õèYK5us ¡„ív[8ƒ}•XhË“UU  : Ât—e“] ­åT^ ¿•Î\qÝÓÖ=ªªåöI¢ŠPßO]ì²[“¥—D{ýeö\,>¶-Z¦ô¡~O±à)ÿmG¤º$hcxÛ÷+u >6©w–˜Â]¶êäéf~L!\¶™*Špþm™æƒ.Ö¸æ Kæ9dì^ÍÙ[{“ŽÙ:œ~¨Wm™8:¦©ž ë}o.ŠëVË Ni™w;]¨¿Öoj e½šãG=¶ŠUuÓõ–e€G]:ìƒ`æûà†üÖîÖ|›Ü¿­ï­qÁ×t»ði‡u|ÒÅ!fXl¹û6ÚÕgŶí·{ý;ñ #W88{{.[ìo37}BÔ þüqDÑùn‚HɪYçüoƒ7—™ðÔwüö /?¾ê¬Eœ=ïÁSžù…’Mžx©?ºàäCÿùí³‡7z öûb[ßeòÍ6¿Ól©7{NYí^ïóõ®lšÕZb⇾ÚiÏ;ÖsšÎþb=îIi•[ßÐ÷‘Ò)ïqÔØêúç³ ‚LsåkàþvA‰!p+òú üBت‚.‚×ÊÝÊ¢²”´mñŠà (2¢€‹€k³`®µxÍvA3X¶ç½mˆFjœ¨À|éðR¼!¿zhŧÑaI4R™˜Å=ñ„9ô"™Å¡‘h‹¢ ‚½^™ðˆÒŸßx¸56d~EkbÞCÄÝÁí…µBŽ­fÈ@ gläâ)×Gù «_8##b©ÄÁÒ8<Ÿ;ÙHM†‘“%ód"IG>¢’”Z+dYäxSM¢Jc k¹A+áR’ÕÙå+1þ•J]ò’m¼ã‘ùËH)3‹ÁÌd/gÉhæ2p¾$f¡Œ™Ìý9Óš,ü&ª°éM`n“xã<澪ÉLdî°˜Âä&8§)sž ñäÔ:³)9rJŸýl§-óYOkÝÓÚ„ç9÷i¢¦ó–ó JCñª…ú“ š2¨@S—P{V”T=(?RÚ2£íf4º'ˆÒ¥<)GÎÆT¥Œ“)F=ªÎ—®Ç¦4 TO›9Ò“•t›,méLÙ9L€ò4§×Ü©íŒ ÏŸJrª7­ê>¯ Ô”N´~[gRéùT˜Fu dõ©YIÖšªÕFlYV½ וºµQB•¦X1Bþ×xÊ•¨Jµ+NÿúΛ*´©RÅ+SûÌÄ>ô°g-lGõêR´Õ«„åj_[ªÆ~ȯ—íêR»ØoòÕ°¤ehg):Ù©6¨]«k3Û·ÊV° -­mEŠÛÔV6¯¨µ¨oËÚÐnv£Àý¨nËÛàF¶ Æåi%‹\§:W§´½«pGK\pŠÖ³Ð}­u¡Š]„Š·¬äå¬v¿‹ÞrªwµÔE¬{ÃË]é>—½ÑUîLCÚ[ó¦õ¾óõî{™›\ùξÍìié›ß€ê¶¾×=pl |Ûý67ÁÓpu/lß×v»%îƒÇÛáìöײ&°‰›áøªx¸(Öp€ç ãþo þðriŒ`˜Å<oWw,aowÈ.òzI\^ÇIð‘KÜäó.9½Pž±F‘LeÿZ¹½Xö±”™Üc ³VÄUþ1‘¹|b-O™Ì nó˜ƒ,Ï8_yÍ+³ß¬c33XÈuþò_ hüæX¿„ðœ?KR?ÓÙÁFª^ÏÜå4oyχ~´¡üáI³9Ó`¦0¢}|évöù©)slGˆjXYòw€—¨ÍiHÏy·¤þó§mdYßZÑÜ­šª³‰j%s$Eà é¶ãj?.÷g.<좋ZëÿŽú×Õ¾-®g êî^Ø„ô¶±‚ìÉåj`Ìž–³'—gþ÷ZÝØ–öW©íåBs»ÝºÖv¤Å n~ïΖ¤ÖÔPíossÄ]Çv^ºÅp:2\ØþžédoÌæÛÖï¦÷¦¹Ýi<»°ð¶EÞïg³ÇØ>y³Ëp…³œÇa¸ÂÞl’¯{âÿxÆsMkMï|ãó®´›½ÍÝ~|f„T5Ê×Ýò**[Ü.ÇÌ)(î™§Û'T‡6|)ÎØžo{×¾9¶Á®s¯¿™ã/fmÑ'‡õuŸ{PGøÒŸžò¶crÙåb×ÑóNsHê=è¡Æ÷ÐÙ]ï¯GÙãËüá‹öo¿=â/ùËÁMw¶OžéK¼Ýцw™ïÝêogûà5^øœÿþÎg¼émq±c\õúM{¶”’÷’gÞÜF÷7Á§¾{‚«ü91Ï|úîôÞkwë¹íúñùKú0+¾Û©½µ¡ojÑ/Údš;nÏÎkÔ“]ùf=ÙÇþúÑ›è!V²wmÐÝYõüÎß¾’É/}ïãñЇÿù©Ï|ÀóÜÞ˜ö?þ;½ ¿ù˶Äë>Ô·¤Š?ÃKÀè+»ÍjÀ,{À›k½ÒƒÀïK1ä³ÉŠ¥É@û[¼ú»Àû#Á‰I?½S?5+@¿,ÁTÀ“'!·sA׃AñÓA DAåПIª±Ì¿äÁç;Aú¢=‘K¶,!Ï‹¸A«ÀÆÒÀ›þ3 *¸Ís¥êC¡Ã¿)4¾#œÀ03³SbžYªs¥¬‹@ôÃþû9#D£éñ='êB9ûBD@=œ>Ì#ÑÂáHCÑ¡ ùËA ôA|Á›»Ÿ¤Ë ˆóÍcÁ=ŒÃÿ+? Ô??tA$6¿ Ÿ4¤´C4ÁŒA$T@‹a$“+ð£D|ìD„=?ä"@LŽAüÄP,BKô9Wl4À¸» U\>"Ã"«Â!¼2l9a‹BXJVâ>>LBQ”AÄB«Y;æ(D#²<ŒEc¤FR¶]!­Ã÷;ÆõKG9äAD¤ÂväEyÚ¿[ìÄ£’GY¼D7TÇqÜAEþìÁx,ÅWì@IëÇplEósG€„Ç0ȃôÅ…D?íZ‰^뉋´‰9*Ä@”5Œt‰ù=ÉHzc ôÈ“ ‰¸¢Á©*É([‰CòƒÉ™¤Éš´É›ÄÉœÔÉäÉž´É¨K™˜¤És#;¡ôÉ£DJœ„ˆ{¼·IJ¼Áê{Iúc T1ʧÄʬÔʈJ«ÇC ¬’”’¬¾­4˳DË™”¸‘«É¥4É´„K™l¸åq:¸’ª”·@"K§ŒË¾<Ë®,Ȥ‰jÔ2’ðËÃDÌ¡ɶ lLÌ­ÔF@ñ»lL…„2Ã|ÌÌäIÀœEƒ”H‹ÔÌÐüËô¸J®¼6¤±þÒÍÍÔK»|È®SÍÕ MÎ,5„HïŠMÙÔÍœ´“Ò$Ê·ÜMÖÌ¢ÜÄJÚ$-‚Dˆà\Mã¤GÛüÌÎ"NåTÎÞlK8NéTÊÖLKæd4ØÄNÍdÎl)äÜÇCÉóÜKAR:mCÏ”ÐË‘dÈQÄÆöDI• 9òìEËÔÇüÄÄçôÇD´FSüÇÅÏæôÌyLÆo$Ìu­DpŒHÍÇüJÕOqDH íO }M}GùÐ ]ÐÿȽFÝÅýlC++Pµ´etNÏ-ÑPeШrQ/Ñ ­F%ÇKE™ ¦Ëá€ÁâÛ*kÑ MÈ UÑÅþÃÑ(5«½ñƒ"MŸ©W £Çx²jÒµR2ÅÐ-Ór¼Í"/}:j©Ã'TRçA¡EF'ÕÐAíÕ½¾ûÔ„SV!FF­Gý›2Z¹ä½d©Tö`…RQM×'•Ö4ÅÕL}×Ü…^*5Üç“b’!Ýs‘F]´^ªâÞÀÜìMßgµVöÍ3,%v±ÔŽË_±<_þU^ôíߥ^õ )ÏÛ»gÛš§Á¤mD:]VöÞjµÕð-X†]y`, ¦T¸q¼5¬¢-E›sC ^ÿ}`¦]nà-ÚèÕ’d-gÉ£ÊàBjT¬aÞáêýàŠ þaÓµ[¡i%!ÖU£ÈAÚ¦õ[âmâ“Ý_&þ_ US)ž_رÎIâÖo%×Ò ÈÃ0]õâ1ÞÞãÔ&ãËâ×ýÐÆ{S¨»á‰L)übã c Nb¶]÷ÅÝØ}“{äQÎa%®dFÞ±-a†}ä9ÖZVôaº5c¹eQ†äFæT=®ã'¦;KFeWÎdÐ%åSŽåÛ=]Z¾ ™(åLÅå.ÖäÒíåM†Ñ÷¥dRáÜì f`öä%VäÎ,)å][Žâdž_È”_^_jžåe¾ä;fflæUn6æÆçZ†_ae^.çöMå>g!ç_–ÞuöeY6ezþFgG¾e|†g­ÜÝUÎf~žgyÞf‚¾gNÞgƒ’x¶guVèÖæƒnhˆ6aw.æ}Ñåˆv艞+îè]¦h„žf.hކXþhi“Ö¾ºMY>i•Ni’–èt^i›ži‘~i”ŽišÞhœîé‡Îi–îÎéµhXfg¤®g nižnj™êaîd¡Žj¦.jŸ¾éwh¢ž6(Þi¨~jŽü½Ü“d'“cªk´¾jµîj£&f¥ÞdbùM“á°€fkÍµê¶Æê¡–æ¯Þëã\¤pźì£k$væ°²ãf>äæeåŠ~kLîYïyÕ âYñ´Å¾ÞƾëŠãj¼Öç‘Þìþgú£ÉÕ4ŽãEöænVl:þÞÄgUnm?eá_-í*>íÃn+×Þã³îlÎîkä…iÜJrU›Ü)l³FíÕÆcåþæÝNî×>jÈ–Xjùœ ¸ëÎmÍîíñÝnÅýë´–ê„îîboPÖê’ÎkÏ¾è¤æáÇNíW–î|^ï¥>ïš®ïŸþl¿mïÞoòNo߾ﬞoù†àè~o+£O“è§“8@c†OŽ µ}ðÛÆlýÕm€çþÞÜï¼É¨ KºT]ŒvMW:÷HÉxqͺðضëðíòg¯N Tp‡þðIñÌ+¾Ø‰ðäÜNûÔîÿæîßž¦äݬc^ÎõTþm™ ÊtÆ$‰§pÖá'òY2rôBrÑäN½V[)×­-OÜ)_np~î݆í*P1Ïw0ÿ06Gfòçëün§ž`Ÿq+ñ—m8GnÜr?og÷fî#Op’pó)™ð0tîp®óCŸj·B!çoLWFM÷o;¯j¹™nEugÙ©ˆç[Ú¢c_ÔgŸ5ú o6(“qVúâ ”®)–yÖI"§UŠUWb†Ij”Z&X>úVaå•©Y±J蚸*›¦Î:k­ŠÂä*„¼j£¤ÉÚ(g›™*[¨½î÷éfÆFû×W¢Z·PžÄ¨” ‘ºªXUÑÊ휫]z µÌªE&£çÞ*’¶ÅŠª)’øêkiº˜®b»LNKmþSÏIE¼¾Ž‹Ðžä®«˜ár;æ¹bŠñ¾žêzm|ÿ¦q«VÅ;æª ‹žÁÍzÌqÊú:Û)´îJ:0ÁžÝ;óÈ%÷).½šó±·½|ó²+ JlD KÑÉ"]žÒöö:sÕ›N`Ívnb¶ò.ÜÑ“N— îKõ6MîÎYçû,À_‹Ø(ÈÁ+ìÏ ³,· n÷Ø2Öý²Ë·Ñ]?8¦Ûr5nÛ`=ÌèÂk+Â]%<•Ìg<øÕ/’|±­7DrÄ2"NµàqwŽúƦަáÕ¾^Ý««§Íóé\§¾ëì“ÂÍ»íï¾wð"]|îÂÇîTòÆ×^þtc”÷®îð®ßwõVC¯röZ__x÷eN¯ùò6ûæªoï²ß(¯eúÀ¯xëÚsìîñó'¾ï囸þ[Æ$ÀÈ PUw+ Ig­&„Âøç¾óIæ¼ %‡Ò%ƒ”à·<¿¹y°„&¬”#°f£•@¦òóãœ6)IR–J”S‘d)™È£Ì‘$«¼%$c‰¾Kæ‹–Re"WåIa‚2DÀ„¢AfJâ)±;ÇÄ%눞gŠQ‹¾¤R&ÍmæqtÊãe/eÀaV…œ‡,£4CM3¥Ž×œQ6›ÈÍb6– \â=9Ï}fq!é„8]h´gºÊœë$§ŒÚÃ#ZSœá̧ùÙÍzF²¡íØE¯(ÑÞiß è+óÀ§8¤(ügfN:¥ü¡2W-Õ—Jcš@cÊcË´^3óSÓòÔ¦+i<zSû½þ{õó^NçPx&Õ¨#ÄéKé÷T¢.Y¼è.‡ŠÔ¨ú+£Š )²´*¾ ºôwÌäêOÅú7° éªl…L:’ƒõ tåI\Ñú’»¾%¯É«»øz—¹zįr¬ÀªúU²Zhª[­kVCŠÕê€s–ŠÕ bóêWÇ D°í¬Z=»’ͪe†P\ñwY—B–²^íâjÝTZ©1Qn­íhN›ÙNÌ•!sÕl\IkWÂN„®Ä¥q òÛ£üV¹¼Õìs ²Üç—º® ’kÝì>W&Áõko;Ýëú¹©îw7²\‰xVªf…jk}7[|Õµõ]+nÛzÉÉŽH·þ….`ƒË[҅®B,]£¤—»„u°zA븚·°ov¡ÛcøºÎM-oÅãßë‚¶Ã>Xlùu_ê­˜¶Mµ$gñûâ]ÞvÆ”5ìoï:bw¯Øµ«oG¢à#$Ç!Έ€‘bçx¸„­ð_/¼`ðödÈM^rˆsœW(3ùÈÖ2{UûZÖÆ–¥ïä/‹cxÃÒÝs’!ÌdÁò•µrÅëg%ç9 NȈ½œhˆ´·«-¦¯šÉ7_±9Íï¥ê˜éäæüb6Ê65O+Þ Á€F p_­à;K8¸|þ¶tçŒa*o8µ&¯€GkaEyÂ/5óÊЬiɾY¶Ì&õÛj¬WåÑúÔr%®•+BX<yËëÝî„ê~ïûß½nø´3nË•©!w*ÅÇÊñ²Üä÷÷Êšñ‰ Üâ¡Vq¦;óÏæœåü>9ŒS.c GÖãÐu%.òŸ¿\çDwøÌ—nô‡•é6z†šM³ò)½êSº|­þð‹[vì7ÇxÏ'Þò¬}ëËëþú•ÄŽõ¸½é>¯ûÕÓîò¼ }Í`÷tÍÍ>wØ ^ïl§:Ýw÷.ÉÝð‰ÿ;ÚûN¾Àþmk_¬ÝB:Œ¹÷ò„¯¼³ñ^xÉcšôwW¼Ö+뻫é m›-j_Çžö–o¼é[/zÐCܬ‹öÆ!ïtÖËÊrµZ\ª0çOŸ½ì¼'ûêùîy¨Û>ô¨o»êe^ýÞ/“%[ ¸ÐV+æƒç¹—úõÏøÝoúÚ?¿UƒO|¯+žDÖò¹WþÈOßúÂþèõŸùõ÷1ÒÿÑœüI_HÝß÷Mþ±OóàóEàû ûñü=ñýÒ± 1E¹XLøþéLæé_õ `ï€à)ÍŸ.Õ^` fß îMЭ”ŠòùЏQçážR ¡ J`û a VVf`í1áí±ŸúߦRaVà fßfab_ªß¦ß¢ß.¡òªža¦ f ž• ®ŸÎa–¡*aFaÝ(LO©Tö| ¦OY %T!¢ ¾aÂÉàRÞ‚ž¶pTÉÔâd`b(ÔÉ^ ¥Í¥”=)â:_$º¡)F¡ÛÅÎRPÔ%vâèŒÔ™ù“ jT.™”mÎ!>Å(Bàn!:¢ªázÅb'îb’FþÁe“ýâB!¢¢ª¢¶¢½â9)ãB}!Çpb?#9²)²á0Š£v ÿp#ØM"8šS)f£:Qc=Âb.¦£5¶á"¦â5JaûÔ<†c0ZË9ÒãâcZ©c#²#ßA¢6 áÖ”D®HOYd"#6bá:&ä#&`B$ØÅ!|)`?†äG cDŠd1êaLþ£=úc>ºäIã@¢$¨M Lîä6£IÆOV\I®äK¶$e^Þ—_ºXcd]f¥²åcvæf–fV&\¦Jz%aÞ%KŽeT~&e²æbbål"&iåmަdÚ&dúfn^&^¢¦^êæo¦hJån*çq®årÊæqº¦X:gsffŒ•&§gd®&nöfaz'uj'p‚§u vœx"gS’äW†'y§fªfWv'wòæD²'aºg}2gzêç|Úçò§wJgUng€Bg–§ZçÞhÔÙ%{ΡpÌѧƒê]l>hr"è{Òf@^U4þšŠ)ù`…h{*è½0èá%(|^§|~%/e ݌茟€î'‡â¨†>çŽVg‹š§NI* V  °„(QýYè‰þ肾h~¢¨´@im’~É©l‹ˆ’ÔÃ<Ì⡉F©“¦(•ž¦‡百fM «déøe鹊©(æ±hšN§”Þ[™¢)“¶æÆ±)‘ ÍÝŒ  nP%f˜V©6éèxê(†‚¦ÿȨ—Š —Š(¥:Ž¥¶’cÞè…ž_†F*Šª6ªeª!1#É(òÑÐæÅÊ’&ª™ö©¢æé±íék.ªŸ¦¥Ÿ$Ÿ‹ g®Úª˜(£Òê¬Êª?J§þ!=)°âé˜Ni³:ªz–ª±&+~Öê³êi´žê£~jË…*¨J*×mhÚiµk¶Þ궦æº' ’Œøaé²Z"Á kbµk|â믫˜š*»NæÄM› ½–¨§+²¢«¿º+¿bëÂæ+À¦Š¹DŒ¼²iÅTãÃîk·"ìÁöë¹:kÆ) v Åš Ï8J鬿¨·Ê ¸~+¹’ª¹&¬XÞÖž„’è,_Ù߯z,ÍJ«®:ìÇ­½ò,HU¼xÑUø!?†,³6ì±v¬Ðþ,·Nkz‚¨GÄëÉVÌÅZZÏN­ÔF-ËrìØúlØZkÒÁ«Î¬*uíC¦ë°~­Ø–þk‡mÕí‡^ëÜÊlÝRí¿Ê-Ÿú-îšêmàž­ÂÚíßZmß".È*îà~'¤†ë¨R.µ .Äîãb®Æ‚ÓE~.膮èŽ.é–®éž.ꦮê®.ë^dö-äAÆ®ìÎ.íÖ®íÞ.îæ®îBÝ\ìî.ð¯ð/ñ¯ñ/%öný.ò6¯ó>/ôF¯ôN/ï¾.õ^/öf¯ön/÷:¯ò²óv¯øŽ/ù–¯ù’ï÷Nêù®/û¶¯û¾ïó¦où„/üÖ¯ýÞ/þæ¯9Ũþö¯ÿþ/÷¯ü.Oë°0'°/07°ŸîÈV.ÌJ°ËƬåάã-ÜÞ+ÀþbpÙ‚íïí7nn .¯z0ÝNî_nßmÑ6-äf®ä¶,òXp «0ß²pSð ¯g #b‘:Œ2)PÒË /.Þšð ÛpR½lG§ánÇØø*Ê^âYhëðóð»ð onG.ʼtËÂ\ –1ÏÔèsq“p“í›mKk'F ’Í –,«ÐÃðí'.çŠ,Ô¢mh äê¡ìMƒð$‹p{ñãðè‹Ó4Ì#S¬!!q +q {$ãbrÈAñsrCݘM{Ôø¡K%3ñ;ñ*kr+«r-ñ"7’±MªÎ‹þœ†Œ;%/g²33ß²!1 çqä²—r5Ÿ2ÆÎpçZ3w²;-™ê+"kn8ss9§òèQ3 {³ ‹3´&r4cs;k³×Ö0|<°>ï3?÷³?ÿ3ë’óÓÊ$E°A4Bƒ£Êöò:ƒs%4DG´DßÒB;óÕ:tM´Fo4GË¢<×,FKIG4IwtEï20¿ãÐoI·´K£¯@s'ÔK×´MçïIÿ²¿²FÞ´Oÿ4ûæ´2§ô¸P5Rs¯P相¾ÝJ4TGµTO5UCuLÇ3AÃñ&ûòP?s.ÓñWÛ14ƒ4Oƒuë²Nk5C›õ%£uW_þtY‹uXSò\[òV»5S73Jït0«µEËq]ãòY³õ]öZïj_öïD @ v[¯ÅÄ«­`ŒiQö_su^óµJëõ„2vMÎóXO[¢‹¬"eE jöưrf7t\Ó5)û1 ¦jÎRŸl?vÏí¬˜ Qé$£E(ÿ%kGÜ2ï5\'¶/G§ìÄ6¡]6éÅ^ÄxŸj£ìÿJ¡§bëvn6bw¶Wï„ÖîQÒÖiwƒ÷tÛ UXwI0·öQzKwt¿6Œ†t=ÛÚœJÓŒò ^óhgÎÎÀ‹{ëì²>E÷wZÏ·}‡wQ÷{1©¸ísãv}#÷Àþ‘-ßl÷a¶øž‚¿5ƒcø}Æö…ƒ‹ÒRLs7Öˆ/xAÚßÚ j,_*é¤$^·vˆovr‹·_ †7÷·g‹xqƒøë¸++wûÊj/y‚9ŽC¹C¸zç­‰;v•c9}kyƒ÷–‹v`£°’c¶š””T&µî™ÏÔÕHµ”9•9Y¹\ÓËÜ9žç¹žïùT6Ÿã¹ ü9¡º¡ï¹Ÿz c KÇâvŸó!´:ß÷•ƒ¹º¢KI¡/ú½ :¦:¨÷¹¦gz›#3:Kº;/.;wsZxz¨çy¢ÿ9§÷ ¬Ç:®#ú¨ÓúÍ4zò¾ù“Çyþ—[9{yUä: 'Ц«.²7{²#вkªåÜͦž X˜:°`‹9lû‰;û¬óy­¯Ï­;;®‡»®—úñžº)² GºLgõˆ—{¬£»žûKÑ»¹ƒº½Ëz¯c»°“¸“k{‰{;—‹ ¸ïº¸÷޾ï;¦÷; ÿûºg»|y°ïøƒ÷xÃ:Äß9¾ƒ‘ÃçzÇ‹ºº/»g³»£òª“1~»:!žÔš"›©9(²ùü¸yÀ»øÀW|·óø¶#¹ÅüÎ79™ë|Ñs;¥¼¥{÷…}3ýÁ;½± |Òû|ÐóüÑýÐËáÕýÓg¹˜[ýÖÛxÖGyÎ#ý×Ë9¤Kþsç¶z:¯|~ó¶~ôÚÓ³Ë˽ºÎt×sýØ÷dÚ{Ô£ýÔK=±‹}ÙOy~àkýáÃyâ ~ágüÏ›ýã3þßSýå+þÒƒýœ~æCþâSþä#þè;~é_|’{þàƒþæ«=ªÃ;VOúç[~•º½ªÛóÛâ}ÜÊþêÓ~Ó³~çKþÞ“ýì‹þðû}ïß_¶ƒ;5Å{}ò“þñ3ô›þôËeê ÿòcÿõóe÷yã£þ÷sfö;ÿÙû~èKÿö{ÿúƒñ«Õkø ýücýû[û“ÿø›¦"«þï£?@tèB`A‚ LxaCTvb(1âĉ*̈þñáŠAjÌxÑbBˆ!9ŠL™’$Ê”'U²ü¸±$ʉ0U¶¤é²fFœ:cöÌ9S%N™6‰®ú’gÓO‹F”:•jÕˆ?“Uê4*R¯#³&Åúu(Ù£Í.U˵ÓX°iÙÞ êÖ‚n˾՛·íܽgù2­«•°ß¾tƒÆ«±Ý®V!G¾ÊøïZŸ†g¶Œ6ñ`ÌBnvö°#/5D©=¼«ÁòF{ðÀô¤°¶õ”K¾rî¿GÊÏ¢ý:q®; {Å3Dï:ioEw³pÂc$1º kìÅ!ÜÑÇà@ÎDèë/Eú˜l’¢&jÒɉ¬äÊ(´rJ朄ÐCqT071Ô±GÐŒ¼QH4ƒ³L sìpÇ3é„Ó¼61LòC*¨|2Ê' ³¿úDLŽ9ü®<®?þTPBMÓÎñäsF2},Ó5ÙR“HO5åTÎíAðlùž$",©‹Iþ)I—P24EÍêaîBaëÇA—e~4tÝü ?Ë1°ƒ6tIåAïÐ'] `keÂYíŒ|,,¡•ðÃB/Áƒºþ_u¨>Ò­~¾»"}h?¢Nˆ“"hŒˆÂs‰Ï‰,Ô¬ (¢ãH‡1Ü¢Ûª¨¿Úmð޼ëâû< šî‹d,ãÆòx¶ ‰áŠXøÂ挰Wt,¤œöHÈ1ú1Œ^ܤ ‰8Ã,‚òŒú $õy>¨)L Í–ˆÄ]ä€PŠ"“üwÊídò†—$¥/XÊËüqjÀ¬á(ù˜È]–Q•kk¢1ST%<3ƒ¡œf'‡‰Íb~•ƒì%7ÉËB3ˆ‡¥8ÑHMZ¢H˜lç5‘NoŽœ9D§'uiÏyŠ1Ÿå4g3 ÏoöÓZ¥'Aƒ©M§½“ûħþ2WæP@Bô`ù('%ó n”£M0@R‘Ž”¤! ’,PšR•®”¥)ý›5/úËzNPz”è6šMƒò“¢æDdMý™Žõ-éQzÒ–.u©/}gL» Sk6Tª µiUÉYÐTNUB%*GŠT±š´kL5ëJšUSö¨:Í©;ÕúS…Rõ©\ ª¡Ω4é«mÒX + –°„=ëae‘Ö™^°­ÅêbºÓ‡6ÖŽ«Ê«=™i×eZ¥¯ k`“ZVÄšU±o…ç=uŠZœ²u®Êc­d'JYŸžó¦^ójg? Z’*u´MÝem­ÙÔ×µ²m,Mþ[[Z ^ÖŸ[µê]«ÒYD·HåmoYª\j2W«Ä¬iéWÚ>¯²õând+^ÛrVº¹­.YY…]ß:¶®ÏýícÁ{Õúª7¼Âog{ZïÞw¿þ­fó«]…žw¸ø}­jÊß®âU³ôU/ƒáj` øÂ.oå6Ü_Ó†xÂ$±‚aû_h~X‡'&p‡íka {¢ÈMñzMLãã26¹/žqŒYÜ4ËxÄ:îq‘ŒëÓ!ÙqF¾qpìã"¹Æ<~²~a,aèZÔɆòƒŒä#3Ytñr»f{¹Ä\¦òŽ×šä+Ì–3›é|g5[Ï›Íñ›þ¼æ0“ÙzfÆòµ,e4zÎn}pfÝg17šÈ‹Nt¥·›f;¹Êqæôl—Üi¹RšÐò»t©wXg«:ˆÞr÷B çQKÕZd5¢]­èLGzÏž&u€ch>ZÔ*®g­Ý—kL/XÓ«¾3¤O]l“WÚÁ¦´ ©-kcçÙÉ|6…y½é_k{Ú&·µ%ms Û×´v³[åeßݽž5±Ï o\Ë»¢°Ö÷”£ïp;ûÓì¾w¶ ¾íÌõ;xõ·»ð„—{ÅÕþ·¥•ÍðÔ=(y*ó–ž9F‡|Üy¼o ðŒ¿».ÇY^ã+˜‡(äw<ù¾SŽþq~[|à(ÿöŸ §¢¸ÈüÚÃFxÑÛo“_|×GúÁ×mN(Öl‰63ÍÌ•‘, –5”B~М7}å/ûÒ{ŽóŸçoa‹%¡&õ®ˆkb¹»¢Ô°óTÏWúÓNE³ï|ðbÛ'•ø`Å]P;Qºî~±¼ƒÍÖ}'9ÄÑîôt=ê›Oúщx¼GJ\3ÏzNˆ®xÉÃ}o©¶¼Ï xŠ›çš·wàm¨ñÈM=òo/½º¤„úŠõžô.¤»ëcïy¨W¼ð¯W{òo?{n˜WÁ,ð«d+t¥gÀçzÅXO³B>óg—ýÍUNþów¹ŒË¢ûÏlþÊ'[ýÊǽ@»­ÉúGý:7¼ÝOc‚OŸ£õ*úüôøé˜-íÒïÿÜÌö°óÐýÏù/0ù ÍüìOú®ö<°%ðòþîÑ™¼D’Tho {ÖÏÉnÿ&ùÊMô:p…JîäHçÇ®KöJ.‹ðùŽ0½þ— ¨×åÙ§i¯ù0) §Ï —ҾΠ‰\ܨæd*¯Ð1 GP C Óй¾nQÚ¨’(ÕÑðIp ±ÐïýÍôœpéÐ#¨«P5p‡ÞÐ#MõŽ殄 £ ·PÏþP ßpñÐOPuަˆ€¤~Pð!¬ÿq‰óPÁ- Íp A±[‘kËc±þ:0oñÙPð8‹1÷DkQEQ“±q k©±­ñ­Q£‘—òo ±áx±m|±,°±Íñ¯Q¾ÔqÙQÐñá‘5± •,Oç[âqù±°Úñ2 r ² ²2!uí¿qãÚ&!!r r")²"-ò"12#5r#9Ò#ò#ÏÑ¥$ «#Mò$Q2%Ur%Y²%]ò%’$¯ïOG&m’a2'ur'y²'wò&r&ñålÑÒþ‚ò(‘Ã'•r)a)r!!Qó‚Q{kÅ)’){ +r‰±E2½œqµ,¯…+o²,g1 Ír(AÍ*E.mN.-‹.ÍË.AŒýšQ7×ÒWQ£Ò§’0wQ0 “/_±ÉÛ’‰r,ûò+ÿ2ÿ1«R1S*÷2@V0 玀ÂÄ?*S-Ÿ‘-/s3Ó11ŠŒ¨„(LJó•0ÑÏ"ðpx0šâŽîFä•N2WÓ[Ó/S0IÐ…œH}³6eÓ•Ðë0_äPd“sE…)‰œ3ñ²ÅºSȾ³É8s3ëp Á0gvs(Ž“¤ÓXÔ(þ‰é‰zPë‚S53³(Ó8‹Ìð9ß3;ýã6W¦=¤ë¤É4©3…ê9·Ñ›ºQì4SÃÓR,QèÀ0Dd),Ö³Íü-Nhó9ÿÓÐ4÷Ó2ï“5ó“2O5GìE”H=¢C_ ƒ¤4có%);ÿc; i;“EÓ5[T8 Ìavô çÓG©ó0ë3#4q‰÷´¯Ie–(t<·T?‹”??£6¥Èú®ÔI«• ÔEÃTEsqB¹“KãÔK³!#GH7“N‡”1¿EÓ>ÿ0×IULý-ÍqO©²K‰´Né‚°¸gPµM‰3\•þòR±QÝMTo«¥ UM¥ÔHcQSÓQ+Uõ%QÕëRNƒ4ެ¤GÇrsçZµWuWyµW+2W©ñr"Ô~JÒ"!U÷ê¦o>ÒW™µYõYµ$É­I\²DKõ×€u¡u[¹õY³µ°„µöŠõW¯YµOõ[ǵ[ÙuÕU(½Vãr#Ö»j•=¯ÕO)5,³ï]é#SýUK=nuNy£^=rŠô*_=µOÖQÑ%`et^õ4OUQõúTQR42!”`á4Våu.GöU=è.ÖbùbÁôS;v8ùõA f2WcM•eõÕe Õcg¶SiekVeþ Vd+–QƒÖh‡–b “a µT†ÆÑBViû‰Lç3I3…ïnÖf[ÖaöV“HÎTÝ^6Eö JÐ!˜ô»g–kßcwv74šx7ólk…öÊÓ–ã<™(;[bæ¼o‘6jIödÁVqypGÍSo¡q ¡üÓ|àHm—'ŽOB)—hS6q9i')X0Aoéi'-g½Vl.sET 4&ön²>WjÃÖd—hs÷…Ä%bóóJ·ußFSä[ôƒë´N<‹¶rs÷.#‘tË–0¬LRqW7nûÖ‡””ÏS ½—„˜7tWqu—y7jQhþ€®óiU—lëÖl{„jŸÐLu”æ¼ÎÔÈt¶|G7}oW'&ÖsßVnµWt x{çVzã×>¶ÄmYn›VgÝTfÖg;n/¸Fhô€ôËÇ -„;81¦q|û—Ÿ7/£€˜&þ¥lÉ‹üÀ#4TUj&eç†á¯RAN‡Eõ^m7†YØ|¡—q?´y›ã†—J`/#)SÊp;vVíuŠDŠixÜü1 ëËØ…™w×n‰÷÷Kœø°Ä¯ˆ†ß„X 5V,Òx‡U÷Žº˜#Áõþ$Sƒ§w_9•&ÇX‹åËåRĬjWefx#?˜I d¬˜'v…É8€Ïþ×N“•.ù¬Ö¸(æxŠë¸ ߨ‹½¤4:™†?¹^îX‘k]ý׈'¹ ø„DW Š£B©xgy´xx_p™‹V¿¸¸(9‰Ïxqw·q‹9b=yb­È‡môÉq—6‚Ýš;1•k™ˆck™ãuŒ‘}•Ù•b‘#L@Xy¿+T K…[x%9œ-ù\+tüâà~à ¾à þà>á~á¾áþá!>â%~â)¾â-þâ1>ã5~ã9¾ã=þãA>äE~äI¾äMþä›= ;Bio-Graphics-2.39/t/data/t2/version8.png000444001750001750 2406712366325116 20054 0ustar00lsteinlstein000000000000‰PNG  IHDRXËJ @PLTEÿÿÿÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔI¢ IDATxœíÛ™¬:²„)W޼—ãDZa^õ>FŒÛÁéB$@ÁEd¢ˆooVWQI©¿…Š4 EQEQEQEQEQEQEQEQEQEQEQ¥MciQ^S±h×™ãg’bfž`ÉMŠéóùˆ1O°ä&­×çOK¡cá`ýxÊ2ÕYÅô9VÖ/æcéúýó½ØÇ¾ú<`ž`ÉMZ¯äPhû¯ÑucÿM?öP1}Ž¥ƒ5DL-À,r]TLŸcU`Ùƒß8¼x(dÒc`†"ºx(dÒR\½ìëãÆëiÅÁ;“.â0…ÀåÀªŸŠés,¬EA"XÔ-ªëKQÕ"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-ây,ê&,êU‚e•ù«ÐÓþ)X…–,ÿ­ðx‚Õ“´€õô8‘‚t¬#‰V_"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-Ò¥LÀ:š†`õ$`Eù.ZÇuæø™¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)¦›Ì›¶;}¥ccÌ´øûGªã~Á2zÁúádÂO2÷Ö¯EÌ8-Ý/ú;} x²:Óâ÷‹;6a!ÉñÓI1]ÿ×(,»0J…Á¶IûX3¬L¦+ò›akúý×Öd{êb“îÖy7?›Ó…`Ùƒà8„’]1ÃŒÓ`5V&Óùð{L±Áò{¬¸_Š…&^-ÊñÓI1Ïï€ñÑDX…Á{øþ!ÎñÓI1]˜ß(­˜>Ç]€åþðý÷kžý{;ö7øUÈþŸÛWmP_Qã¸cû‚:uXw¯ËB+6ÔØÄâŽí êÔ`ý{­¬õ{»`e¶˜SV&óžíƒWj:Âr{c»`%,Å«‹+®Ù—ý$XÁŠÚõ[XÕS±+#X¯kÕ°Ó;û`Ådà5.weýåw=ËÔ kñ÷ž;U;Køu0þuòÞ1°Ö晨Ù+&àh‹q~÷Ï´r,¬õêWôX%Çp3]V‡=Öz5Á"XÈN,‚•Ó`•N†¬VWV ?å’Í|Èv]>Äñ5ÞëR•’b"Xˆ8¾¢Æ]‚ugÅ.¾¾æ¯,ÁBƒ Ö‰8LÂÌßÖÕãÚW–‰`¡ÁëD&aæ –„2,4˜`ˆÃ$Ì<Á’P&‚…¬q˜„™'XÊD°Ð`žÇ:‡I˜y‚%¡LëùàŽ’bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“b*lçóÉ®Ù~Æ…ÒŠés,¬éb[‚¥Ð±x°)õ`½²búëËß%0ý3ºWé›Ãüê—Æõtù» ôULŸcñ`M€Xœfc -óf´˜?¢¿bú‹kŠqG½X|ŸÐ‹¹O¿¢bú¿¬i»K°†ø¥úŠés¬,×ñPȤi\µR°Âà}ÚŽÿ1¼»c ï}&Å´ÜDèƒú©˜>Ç«U\gŽ5‚õ°y‚%7)&aæ –Ü¤˜„™'Xr“bjd>žIÔMà—›Å` NŠé °¦ŸLøééŠ)lc‚5¸9”Í4»éà»*ÇÁÒ”SóÆN ;üŽ}fÂiú‰‡BUI1Ýo~š_û×EY°ì û{,MI1Ýn~BŠ`½ )¦`™Ü¡ƒwmI1ÝoÞ˜©ÇšïñRBŶ1ÁÒP1}Ž V«¸Î¬°0v$ŸÝq¼eÖáÛ"X‰š˜7æÿeš©LÄNó–3›Üö3¯k·E°50bš)A¦*i Y X‹O¯I¿H°ÝnÆê¯™2½\1Äv–ÚÝÝÛÖé2,جÁÇ…™¤…W–éB°Ê-PÚ˜`Ikó& mL°d€µó“„6~¬#*%…Bnëí$Å$¡NªÏñ3I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&­rÙìÎu«š+¦Ïñ›ÀzqÅô9–ÖÆ àÓÚa~ÎÏèÞÉÏ®¹bú‹+<ʸ‡[|ÆyíôãD“£+ùÌ;*¦Ï±x°ìÿö&%ß™Ö0áänaŠpª˜¢RUÅô9ÖÖôŒ×Á.â'šXœÌõX> …=&­—=÷¤D˜ `Ö¢Çâ¡°Ó¤õ ƒw‹Oið>øµáPȫǤ˜ÊÛ98¹£¾ŠésL°ZÅõÖÆ À*?)÷æ‡TC|™#„`åÎù:r¾ÆG›åpm}m<`¬°@ÉŠ§aX,²oÖ.ZÇuæ¸uÒчÖÊ K£ãÀ‚È2ÁRéø °².zÕ‹êÉØc©t,¼Çš>K°:~,„«ß§yº§jWÏcmî.Áò ”«‹`…θӘùvq9~&)¦úü?j«{¬øƒf¨šº; ù}µ­YDÔ¸K>'© ™¾s/|ífY‡dƒ·³dãð‚¨ñý`Ù˲*MÄ…1u`ÙY™CÅvJ;¦1aÕ!Ó•f`-²,we/‹Y‡ä‚»[Ör÷o©ñý`¹»t6¿HÎæË—õÏÛw&Úí/J»'‡*wIˆq=VëÕŸ¿7ÿ~úý³üùL?N kÊ!KzÒj}~:Ö`ÁÊRòùx’ÖË’Vë×ÈÛNiQëG“c‘`½,iµX?J¦ìÎv9ö}w¸óoºR°ì§—`¹Þðã·6ŹWÒ*¦°uw2ŸO€Á-\ÏãàÛ˽2DoÊ«˜Â6Ö–%j –%é³ – OÁŠÞ”W1…m¬¬ôÍ,×óê±æ|â*¦°U€5ä;™%Xó!m1xO¾\òPøÞ¤ÕŠˆÈ çý'¼GG6?–çཋ¤˜Xgò¯N‡©ª˜>ÇJÀšÏiÊïôט'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤õòÞy>æÛ+6†bØj„§UŠu¬,¿Ø{ÎôK+–‚5?˜`¥qõú=ýWÀ©Ç2ÑSÒÝ£b§ßYcªŸ««ªbö ºn÷L:_Jxس(ÇO'­Wü¤áÕcÃíZ蹺Ú*ž4ll-üûF°qõаk°ÓóR°Üs¬]oe¿«á1óâ?›´^ɓۣCaV[ó +§>I·l¢Õ²?œ´^ËC¡ßD`ÅýR|(4ñjQŽŸNZ¯0xŸZÞ'äz¼»"Á:V¸œŒ¨£Šés¬ ¬¤ÇzÎ<Á’›SE~³Pµùeà¥Üáj~‰9šÔná÷¢nOëj<ŒëmÔ³qh_PÇ 2›ØÛÁŒ‘Xßû4MH"8lÎ|v7V´´ßžËl€u°ˆcPc ¤ú~²Ú­`Ù³ã&«ò¤æ °–¸×`媄‹r(J+òWÓÝÖ/æ=¿r »ï’,~+îk]+·¿!«þæ|W¿Ñ‹˜w\JŠiÏü™=oVã ÞÓú1\Þsû;õ*°ÚŒ± =%X/ ûVx&)ÁÚÕ­`Ý©EØâ©¤ÀžÞQãKöu êN°ÚÅuæø™¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)¦Ì/®f^ 7¯u&X‚“bº ¬IéËòw8‚%8)¦Sùí<‹ëçë1¿Co˜/¨û}š=–ʤ˜Îeoä1îJæ š1\Ñâ®x×–ÏÈ,I1k˜/‹·çÖÜ…¨ó=,·–c,½I1]Öô^¬ð‚¥5)¦s`™ X™C¡YÜ C°4&Åt,7x·L%ƒ÷pãÏ8¬ïÆ\ØSÁ%Åt¬«Í,¹I1,…ŽßVéb UÓçøý`•.SU1}Ž V«î­ –†ŠésL°ZítomL°4TLŸc‚Õj§{kã׃•žoPZ1}Ž_V¼ XoOŠI˜y‚%7)&aæ –Ü¤˜.ËÏCáÛ“bº.¿)ïÞ´ý¡‘` NŠé~ó{7íÄÕ%X‚“bº2ÿ|ÓÎ\Ù·}ÓÎ@°t$Åt]~ß´“¹-§|ÓÎÈC¡†¤˜.kðHånË©¹i‡` NŠéÊü XÓ›E°âµVPî~’bº,“k÷¦Ò·I|Ïûiã¾À2óM;Ãrð^yÓÁœÓµ`6O°ä&Åte~‚õꤘ.«ô¬TÙSØÆ½Uzº³ìŠ)lc‚E°Þ“ÁÒØÆËNl$»b Û˜`±ÇzORLKc÷VétCõ9‚%8)&aæ –Ü¤˜„™'Xr“bjf¾jR]‚%8)¦væ³³"K¨˜Â6&X»‹ô,×_r‘Í-I/ î()¦§Í'`w1àï2ç±òèùt¹ûIŠ©©y“ b–ñ˜p¸œg#8ŸôÞàŽ’bzÖ|:Ïò† åî')¦ÍÿΞÎ7‚MïY°üéTöX¢’bjn> ªæ{z`…¯KTRLí͈ìÍ«C¡Å‰ƒwqI1=hþwWO:x··±ÿBE¹ûIŠI˜ù'’êsL° ‹âÅKpRLÏ™?Oˆr÷“Óƒ`¾,PD¹ûIŠé1ó†`)KŠé9óKYRLKc,‚õž¤˜–Æ6&X[`ñtƒ®¤˜„™"©>Ç«U\gŽ V«¸Î¬Vq9&XaÿÕy㺂%8)¦'Àš~Ê^ÉG°'Åt¿ùõÍ8aº/‚¥))¦&æÓ+ýt_<êJŠé~ó™›qŠ7,ÁI1Ýn>w3ÁÒ˜S °LîPÈÁ»¶¤˜î7¿ºgã©KpRLÂÌ,¹I1 3O°ä&Åt»ùüÕ1ÛÚI|vÇñv–UpX‡o‹`%º¬Üõ|ÛÊ4S™ˆæ-§7¹íg^×n‹`% V‚LUÒ²°Ÿ^-’~‘` V¦·€+æ‘ØÎR»»{Û:]&‚Õ¬ÓIkÒgÇX› ‚ˆ`¬Ê8L‹`UÆaº¬:´*=¼»m¬·TLŸc‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3ÇÂÁúü´ÚÄç“Éïß|eÅô9–ýŸ`1é-`ý:.× £ýgóÍ·ULŸcñ`M‡BKŽCÌwN…7kû.UÓçX{¬Šm-?-{Œ•Iú>°4Œ±ö·µøt›o…‡kžIú:°š+L‡Ž/3CÌmíúz°Ž¨” ¹¬KUJŠéò¾´bòƒ;JŠI˜y‚%7)&8ÿwZ|ëÌÝOßZóßuðvªï2é÷›dÎ}P¿¬¯[l£²+¡ ­Ø·°ºÎ1º Xù£îàk;‡ïoù÷ÿŒÁïÀ†ûÌà?9ƯM·3}fÚÂwúŒëíÚqÞÂw˜×Æ[pífüg¾‘÷«ËM°ò:Öwj:‹ûÉÎwìgloaˆ>ã·`›ÖÎÝÊ79~‡CgämÕnÁ›-:ll·”›`åu¬¯ëo†¹Éc°\WšwÈ€5uM®WV`Å b°¢-,·ú6¹kæ÷ –|°Â@+ –oî%Xñ¡Ð5y,·¬•Å9K´âêr¬¼Ðüßt‘ë[:ñg `Mï»kN VöP8l€ÅÁ»h°ÂP&t(vXæ¢+V§ƒ÷E†Þnp4Ì£¡} V´6“å!íÞS¿¬Ãæ—ƒ÷sIããÚ·»6&Xñ"î±N'%X«A\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜` «;TýÓULa¬¬é§ä‘A"*¦°»˸GøÍ›1fïAKpRL·š7ƒ{Xé?%’‡BI1Ýg~ê ÜãGÃÿÓ»’vÒÆ=ƒå?J°^“Ó`™Ü¡ƒw­I1ÝgÞ˜©ÇJž$WÒNÚ¸k°ÔTLŸc‚Õ*®3ǃåêÇž°• ùìŽãÚg¸Ã:|[+Ñ}æýÉÐcÏ;Yl±LÄNóV>f¹…|*Ä1ÁºËüi°dª’¦Õ€µøôj‘ô‹ ÐmæC +Ó[ÀÛMŸöq;ÛÞÛÖá25{X× W¬ö‘h5  ‚E°*ã0Ýh~o`B°Ö óßÑ‹:´*=¼»m¬·TLŸc‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c-`}>ÅüŸßº—WLŸcé`ýQóÙk$XLŠ‚õc&ËÁbÒL\µ&¨Fw¸³ÿ|Æ_/ö±¯¦Õ,÷êÓçX8Xé¡Ðö_cÔML……Çð}ÓçX:XCÄÔ,×s…ëÅÓçXXöpçÁò?†1…Ý'­V8ÀEtåÁâ¡IÙ1ÖÇõ’Ë í:Þ™Vtc¬‡Í,¹I1ͶÇzØ<Á’›“0óKnRLÂÌ,¹I1 3O°ä&­—}²“ôÆÎCbß§ÝTLŸcé`ýÀ2~Ö·ßvʾÙ<Á’›’±³)…9”Œñ³võS1}ŽåƒÏúæ©t¨uS1}Ž•€eÒI “žkÂÇ8¦"°ü¾Šés,,ûÜàä[áèžÏ΋IO€np•6îû ÁbÒã` 4O°ä&Å$Ì<Á’›´ZG挠:V5Xø,7TÇ"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-ª‹¢Õ‚5IØŸ ø'¹I1 3O°ä&Å$Ì<Á’›“0óKnRL¹MØ‘Z|E©»fþàÖµ€ª*¦Ï±V°~‹–1DfkóÖCUÓçX1XþfÃéÃÑÝoøÇYkûÖCUÓçX/Xöæ ù»¿áÂðPØsRL`™¬`1)¦ìvü}†f–1ÑÈŠ`u–SnöÜ}ò­ÐÑæþF×wTLŸcµ`E§\/åþR4ƒ5½ÿŽŠés¬¬Î*¦Ï1Áj×™c­`µ¼ƒºBZÀzú’2 Á¢nÁ¢nÁ¢nÁ¢nÁ¢nÁ¢nÁ¢n‘°(eRÖ©üçÌ?‘TŸãg’bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜n2 'Vlê¦q¸Áot9¿&|!XÝcûžÒ¸b,fxñ–­ùaž¸Q†cI1Ï?ßp8Oœ"¶ÇÝÍ’v¢Fßc…=ˆàäXHRLä÷…Í7÷+Ü"9Ä÷Фw¶ <fâ0]‘=˜t°Ì Ö ˜¢Š`t!X&܉èÇÃÍvº>ØÓÍ,k9úŒÇb’bº ¿¼Cô<±=Ö|Ûâ¶ÉøÎ6QŽå$Åt>ÿü%*üâ +:Ýà¿i`·LŠhã.À sù'*¦ÏqO`¥'UULŸã>ÀÚ¹º¸ck‹…,«ˆfá|O·q`ýF&³º¬ÜKY–;`¾ ND,‚uIE$ÅD°Ve¦»Àš•{oGÕ`e"Œ?UëÌ;¿žFXK9X™Õì±’`¬ŒÁªŒÃD°Ve¦ À*J\­®Ýiü„e6s½Y8ßÓmÜXê+¦Ï1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌñ;Àú|k>÷ÓôƒþŠés,¬ÏgÍ6X–$‚ÕgÒjý¸¨`£ ÖK*¦Ï±°,9ÓOÓ?ã'~eÿ `¹uþ½èkïâTULŸcá`¹C¡ÅÉõ_£ëÆÒ7ýÆçË1^áM}ÓçX:XC`hH]?D°˜ôz°â7ýÆ7ÀòÇN…ÓçX8XÙ£^V¶Ç oëKiÅô9Ö0ÂãÁ»gh=xwãõdr´dõö¤˜®ÊÏ1Öë“bº,?{¬·'Å$Ì<Á’›“0óKnRLÂÌ,¹I1Îï&:‰'efe“P1…mÜXñ"Kü$m Ûøu`™é ׿çâÙIþæ™oÝÜYf–_;ÍhâI(åTLa¿,?…¤C̬…&kž'×a¸3“7ÁœÖ`§é6&LzƒeŒÉ‚e??†IeULa¿,7ä ¬hNhbÂ|¾¬[vº·6~XÆ•ôXÑd㙋`½$)&,?x枇ç£=àÅÃódð>!ÆÁ»Ö¤˜P°0ó¾/]1…mÜ=Xa&ï›wº·6~Xÿô÷ò_‘þ^þ'«Ò¶ò³Šiµ>ÉœÐk°âñT‹av›´ZþÈ É£CÚg^=oœavœ´ZÛ§ ÂÙ«ÇX¯OZ­°Ü¹„ŠÔì±Þž“0óKnRLÂPN?¦IDATÌ,¹I1 3O°ä&­— “-…™pÌzf¸×WLŸcé`ýÀ2ñ„o'&IÕW1}Ž€e§Xšgtsâ°ÇbÒS`¹)*Gûs4CÁbÒÓ`™¬`1i)ЄqLE`ù!|ÓçX:Xv·ä[á覭dŤ'ÀŠN7ØŸÝ„–‹IÏ€%Ð<Á’›“0ó·'-M…éõeÊÅaf~cõ5HäçÃ@u‚uÒü5Íp ’tM]εÍC`]³ëO7à»uM] ‘ ‚jácÕ®i£+{¬ °8ƺS×Ôå\Û¨¼_wM3ÈB¢qy Ö}Á× ñú2åâ0 3ÿDR}Ž V«¸Î¬Vq9&X­â:s¬,û•%¾>Ë}‰±n¹n}©QU1}Ž/Hj¿ƒ$×áù/ªsæ_S0•ò°Œ‰rEgM6¿-«j&}Ž/JÀ2áϤa=vW‚åoÝ™nØÝÝ;ΉEŒ=–ö¤ÆÞöço§ñmœ6ìÅ`Å|eœ“è3B+¦¯ŸHÚtˆ†<î~ÀÀÞÕ‡Bwak X¯K:ef°† XW÷Xþ®³+ù;ÁRÔ3 °ŒIîк,{}Dò­0râ‡wKsR Ìòa¹aðŸnp½”1³“ѽ€åTL_?Vtº!iã¬[N7¨­XŽŸIŠI˜ùóI^¯ «oKººzã`#¤éVÊtQpR½°wÂÁjŠHKÆQXåj» Àz-"-uÇËÁªlœù·á,XDD¢6¡ƒÁ‚…‹=V{+â z,ޱju‘³5~áëæ=O^7Åñ0"—é¢à¤z‹_€—u,ø!ôÈNoµxè¼rI*²ìULRwV®…¢nk^[1Ðò[¬jôèp}~; T°e"Xx~öXk¥kòsŒuhA°*üVH°b]˜ßð<Á fþ‰¤ú¬Vq9&X­â:sL°ZÅuæ˜`µŠ» 8|¿0áÒ±Ž V«¸ Áš§"Xi&aæÛ%u'?í™7“ÞW´ûû~ÊD°„„›‹Lz'dô¸saŽ –†Š¹ûuü\ áºêèJeaŽŸMŠI˜ù†I£ûꓹ=L´Z–㇓bf¾]Ò¸_Š…&^-ÊñÓI1 3߬ÂàÝ ÁêÏ1Ájw]0z‰ÃúÍÝK¸ž(“¿èÄãxAÉjã'ÁÊ\”…'5þ²4e 8™Õå‹8b dµñ#IË’V4Áb;IèSeZã´u…lõ%˜dµqã¤å.‡ÞLšÛÎm×5oãß-R‡()mÜ<)ÜùÂûƒZ”éN¥},9%¡KÊ+Ú?öXWsŒU—“¬6~$© NÚ¾À“~+t’ÕÆO‚e¾êÇ“ÖÙ¸L‡q"X=9~&)EQEQEQEQEQEQEQEQEQEQEQÔMúÛ†¦(ÔFäIEND®B`‚Bio-Graphics-2.39/t/data/t2/version4.png000444001750001750 2562712366325116 20053 0ustar00lsteinlstein000000000000‰PNG  IHDRXËJ ªPLTEÿÿÿ{hîðÿð€‹î‚îAiáÿcG@àÐp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿ØõÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2ÌÿÒiÜÜÜÿÿàô¤`ðæŒ‹‹ÎÑÿÿÿõî/OO¼wˆ™fͪ˜û˜šÍ2”ÓææúÿÿF‚´d•íÿïÕîÿ‡Îú¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀºUÓÞ¸‡ÿÚ¹î誼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõȸó· IDATxœí[’«¼–„qDGtô4Öc¿ô˜ÑEÍ»·Ñ(ÑBHVæùÛ6$¹$¾”‹Ë4QEQEQEQEQEQEQEQEQEQEQEQTošS“ôœŒImß`¿ŠI=¿ÈL°Åôõ|>ŠùEf‚Õph¾>ÿ4O«»ŠëËS”©‹#´¿Š;ëëùº¾ÿ|æï(ö1ï>/Ó÷žy Ð|mv…füší0öï¿åeíâoúÞ3 É3µk2È ÑcýUÜXfç7¯^Ü2ôXž¡€.î šòåËc}ìñúvÄâÁ;Cw>LÞ¸?°§Çú«¸m°>‰`Q(¬?ŠÊÁ¢Á¢Á¢Á¢Á¢Á¢¿Ç¢Á¢Q&XFóqòvý¬Ä–Lÿ­ð~ ÁI½€õöq"éXw‚ÖX"XÔ#"XÔ#"XÔ#"XÔ#"XÔ#ê,ª3Ýën ÁI}€äßÔö Vñ;¡˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z¾1ËM_Q¨NÅ"²LþýÓjÅã‚%ý‚õÅIü«6+¬ï‘y™Úôï‹›Åã–»æ¥ÔyZ&ß„°bñ“–*~;“Bþw£X°ÌD:Ùú²e;ÆÊD°">Lù2­`ÉÜ XKÙËkñ2í­]¬øÝPLù,³œ'¿…n[n›ÅO¦§Éüh¬ˆ“B¾˜^1ûch 7B‹Íbk·`ù]¡„³›ªøíPLåùßM ö•«z+qðîÿh®â·C1)æK‰ùÅë¯â!À²øþ÷cý{;ö7øƒåúÏíT6¨kôñ…ï^[ЊA7:]ÝOƒev¡+úXB¾{mA+•[üÉúߣB°ŽŸ]‚YcLX‘䫲ož©ù5Û¯%üÖO¯ì¬ Káìä ¶\7’`U+ÜÐvÜÂÀʘüdï X?ÖaÃ.Ÿ\ƒ’÷qz(,×ô,ÉÖÑñï3ûU­,ß­Íâßo>»–D»IÎÀ ¸ÛÇIŸk~ I‡ŠS¡˜®‹çˆuÖç+«ô[a I¹ƒ*n4Á"X17š`¬˜Šþ2ä0ûz…gk<ùÊ%š|«ì¼<¤b>¾KU©PLÅNWG°â¼‡ëÉS7ë÷ùOvÁBÍ«À‡I=¿ÈüLêùEf‚ÕD7,ÔL° |˜Ôó‹Ì«‰n"X¨™ßcø0©ç™ VÝD°Þ7ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5Š)±žÏ':çü Åßô½g(4[Ëɶ‰õ,†î}ÙúR’ºëO¬Ç‹#´¿ŠûË]%°ü3ÛwÛ§õÝ7ÆŽtñ« ÊŠ¿é{ÏL6ã"Á¤ž¿7ÃXýÛL‘Ñ ×1ç<%·¹Wë*î¦*¾²PLêù3N–æfÊÜf,@êù3ŠÁ"X™f -‚E°²Í'¿ª?úËûy ÖÜ:?è+ Ťž_d~%´¿Š V-ß`¬Z¾Á*&Xµ|ƒUL°jùÌâ^Š;/?óëþ*&Xµ| f–;#?rb3¬Z¾fû'@±' ®#–KZ«øíPLêùE溡2­çâ‡_EÉD°">LêùE檡_ṟ”ÅË~Ói“+~7“z~‘¹f¨øÉ´â4™K´ VćI=¿È\1Ô€äÁò»B g7UñÛ¡˜Ôó‹Ì5ÁJ¼Û"Á"XãUL°jù«˜`ÕòÝ0Cçñδ1ûÑœ•eW|tf·ôV[⵬R3~*¾;7ÐmóïÅÊ’`]¸_ ÝÒ;m‰+gÝ‹)½žäœŒÉÏ‚µ'À¾Ï+6:€'-°¾h¥»Sz=P£•Ì­ƒuü‰žÌvb9Œ7jÝ´"vŸ¤h Vùþ®0zcWXÒ\¶¤ê•d(&õF™ Ö»`þÆ€I½ÑEf‚õ&X¿ÂbRot‘¹&Xw” …,åÍUiËQ¡˜Ô]d~%´¿Šß Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡æK€|ÁŠÀë.ò½g(4_X?ÜcýUÜ>X'O_æNë}~fûIü)áZÅßô½g(4_ë} ÄÞ,Xfç13wy¹Ð4º6ËèÓ÷žy Ð|‰ù¿¹HÉ FâÁšœì%Lÿ^ù›ÝÉsÅßô½g(4_¬S?N Öcp’)±\ŒüTõWqó`Éz/êuWèÁ ÖnÄZ_ýHõWqó`¹ƒwƒÏÂOäà}rsý®P+þ¦ï=ó@¡˜Òë‘’"*ûÞ3Š)½‚Åа’øD?Ì…í†%ðA–Õqí8×’ã;oÊÝ>¾»Y3ÖǦÉEþnB°ÆkBÉ ð›D?ÌÔö VqíÐÙYs%!¾#öX§¿D–L«ËŠß Ké>pÔ(Ê'kâˆÕeÅX˲«gÄë´â7ÀB¸ú.=;ã~ýPR3Òæ\Kàƒ,«ã†%Zq®%ÇwÞ”»}|w³f´1®&~©8×’ãû°P®NÁòœ+°Ñ¹“Ú¾Á*~'S~þ—Ú\Î7 Ê”õèîÀòýÕ6òsäT·Y$ ɱ,¿sïêºL9Z¢æó”¨ï°}„bº(~˜Ó²2‹;FòÀ2Oe¶/·kHL‚Eį Û2O’Ö.eß”«9Zbæ]ssÀÚ7ÿ‘>~,™=[×E˜ÓQƒÆ|[ ç–eý»®=µ„!ó”UÝÆ"vÄ’Xs£q?åA]WoJª-‡”ˆoŸrÝa›>δÔKrŠØö“¸­xj™§C×”¬§YçZd’iY6FXW&‹ñ¦œ‚uñUÐö‡ä,ÅOd>‚•3NÔK²Šˆ€u¤Y?b‰ŒXWÕEÀro³Svu屘hJ"å²õXJPû´a1ÃR ¬:#–L–Ø®`Ñ##–©±"–ˆì0,%¨}:mËùÔiñáļgU"– Yûéjgn,Ëh/6Žœ#ÀM]SÎ1Ö!eW× KÌ&—­ÇRÖIÐÇ»ægL@NÌÆË«Ä±!SðÛ³œûpËêX¿n¸¨.°¸ž5Ÿe§ìêºa™cæÐâz#Ùz,%˜lúø*eŠ)½žŒ,uó+¡ýUüN(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5ŠI=¿ÈL°Åt•ÿùgþ}øïÕ÷Ÿóç³¼\òsÒ–0ôÞd müJh¶>_]åÇÀš XQJ>GÁú±Ðl}7òù “š¤ÁúÒdY$X?š- Ö—’峇3CŽùÜîî܇öŸ-Xfi—ïÀ²£áÇ­mñÙw­õX‘y ÐlíÁ ™ÏÇÃ`'vä±ð]€e?ô Á‡4ú=ó@¡ÙŠƒeˆ:‚5OS0ª¥Á²ö-XÁ‡4ú=ó@¡ÙŠ‚µýp –ynXkÞ~Ïžæã:òÙ¸Õ´bP‘U\50RH¬¿ç´Š1EœnÅ}+n…:\?\®,YÒõöÜ/°ïÞ²¶ÀƒšS å“IÐKÌ6Þ€•ù¥æíâÄAåWcßg€ë¥ü>Ž­á¡Ž.+¨/º¨Ñádm¹f{Í·!»ŸŠŒÉ-°Ž}eÛ{b9Œ7å}|ø‰¾Ù‰ñŠS¡˜®Š/iy °*XpKS›©¨5ÚW J½Ñ¹:X§[q7!X`Å Ô˜kƒ%H‰ ¬”z£óáhSS»¸Ä¢P ¥Oô±J[ЊA©7ºÈüJh¿ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†C1©çïN›;|°›«ú–y PLêùóþâŸãÛôïp«áPLEùæBžÝù‚ëù˜â®Ð›Öê¾KsÄê2SQ¾½Gì™Ì 4³?£EæÉ]³»†`õŠ©(ßà³cOéµ'¢®×h8°ì\cõŠ©(ÖòY,¿ Áê5SQþzMkVdW,Ã]a·¡˜ŠòÝÁ»ajsðn^/´ÞEôO{Ë“fþ¬åÃ$Xá\) }ÙÁúéPLšùë§C1iæÇÁ¤x<ôeó@¡˜4ó9být(&Í|‚õÓ¡˜4ó“_7dç@°Ťž_d&X ‡bRÏ/2¬†C1©ç§ÌYÕ%X ‡bRÏOšå¦¯ñî'“z>h–Í[ùN7'Ù<ªh(“z>hÞ€eNÒš¾§ºW„*š Ťžf– *²øÝ¥,ˬ¦B1©çCfÙ<ˆgÁEÝ=N(&õü|ó÷ÛÓõB°å31S» G¬¦B1©ç_™Å½ZŠ%ni‚ÕT(&õüK³‡È\L!û]¡Ái}ÕxwŠI=?ßü½ªg{ðn.c÷¦‹î'“z~‘ù•Ðþ*&X‰Iòä?‚Õp(&õülsù5=µ+<“z~¶¹ü´ÀÚŠI=?×,«³PLêùÙf‚ÕY(&õül3Áê,“z~¶™`uŠI=?ÛL°: ŤžŸmæ× …bRÏ/2¿Ú_Å«–o°Š V-ß`¬Z¾Á*&X~"ÁÛ“óbVá˜Ôóãæ XË+™#gò¬†C1©çÌÇ‹qüã¾VO¡˜ÔócæíÈîq_ÜöŠI=ÿ`Ž\Œ“¼p`5ŠI=o^"X?ŠI=o–ÃÅ8'×Ь†C1©ç̇‹qNîúA°Ťž_d&X ‡bRÏ/2¬†C1©çïÍñ³cÎu°Yö¢âó”ƒÙÏÃ×E°6RÏß›£çó+²™ÒD\lÞt¼ÄÖyŸ».‚µ‘zþÞ|¬ 2Y¡[È.â%t¤V»  õü½ùX‘Ñ ×1ç<%·¹Wë*î¦*¾²PLêù{³Î®ðveî ³ õü½™`,•ü½™`,•ü½ùäwô¤ŠC³âáæÖ©øA_Y(&õü"ó+¡ýUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«¸q°>_VñùDò݇Ó÷žy Ðlý£eù?ÁbhŽ/[¬ïÀeǯi6ÿœ~ødñ7}ï™ Í–Ýr,bnpJ|˜;vuÕcýUÜ,6ȽÒc¦¦¨ðnâk ”`Å>´X,Ô¬$¹!öç–Y~68Jø˜’œÐÜ j[±¥Ý=ÝŽ]òL¨ŠùWÁ²Ûá–Åî°+ Ÿ..xhî´ˆŸL+NÛé‡ê˜,±`mF,YÁŠŒX‚e ñ`ù]¡„³µC•Ì?–;xžÃ<ÕÒìðÂÃóÍÁ»9ªiüàÝî Ve°2‹°/ÚâslÆ·#ÖùjW8€Åƒ÷¦Áò‡2~@1‡Õ›Ý\0b‡ÕÛƒ÷݈å½íÁÑzdÚ)áy$å/@Ú~~Ñmç³Õ}†bRÏOš÷ïe¡á~ío¸müJ(&õü´9±ŠC Áªà¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&XÓá Uw·„†z¬Èy²ß.Ó§Bë› ŤžïÍ"ˈµ¹“¤¿IüS¡ƒlãWB1©ç™ Vá˜Ôó‹Ì«áPLêù«Y–—7ïp°Yö¢âÜ{Ø—~¾.‚µ‘z¾7»/CïÝïd·Æ4›7ó>0û5ģР–r¾7ƒµA&+t ÙE¼„ŽÔj7ã"Á¤žïÌ~ ß+2Zä…“Ëøíw±î«uÝ¾²PLêùÞ¬º+¼Ýc¹·DË X€Ôó½™`Ý«øA_Y(&õüÕ,ËK‚E°Tò÷æ“ßÑ“*ÍŠ‡›[§â}e¡˜Ôó‹Ì¯„öW1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò Vq/`}>ÉüÏw^ÅâoúÞ3š¯Ô|æé¬™`1ëËL”©0Ÿ`1ôX_ÏÇÐõýç3G±y·Ì6`Ùw¿ÙcýUÜ8XÛ]¡¿æ`[˜ò‡áïõX·Ö0µËŽ\~Äúáë¯â®À2»;–{鱸+>4[~Ћ»B†"2ÇX»×ÛŒXvWhæñà¡°¼Ñcç™ Vá˜V£±Šó‹Ì«áPLêùEf‚Õp(&õü"3Áj8“z~‘™`5š/sg'™Ö‡šOæåÍ+Å¿Ú_Å­ƒõ•Ë<šÄ®'}ᇋ#´¿Š;KÌÓ”ü3”Ä<ô†#C‹À Ÿú¶€5[ÄC÷>DáӸĮ‚`14ê´à#–©,w?FõWqë`ÉdÁZ+œíýÙe ë¯âæÁ ¾n°7•ûû ÁbèÞ‡I=¿ÈL°Ťž_d&X ‡fëÎ3#¨• þ”j`,ê,ê,ê,ê,ê,ê,êåƒEQˆrÁZ4§&ãü­¢¿Šÿ“ÎyÊ8=Ö_Å«–o°Š V-ß`÷ –9R“i=£Ô»-§šÚåWz¬¿Š{ë;ñ`‰É Ö饇]õXw –Øÿ–K g{½á?Î$Xƒ‡bŠ®ç‹ÝnÀ ެÖ`¡˜b«X¸ÚþVhi³!X†bŠ­"üºÁŽRö/E+XËçúÅßô½g(“z~‘™`5ŠI=¿ÈL°Å[EÍS1( õÖÛ§”Q˜õˆõˆõˆõˆõˆõˆõˆº‹êL€U”_d~%´¿Šß Ťž_d&X ‡bRÏ/2¬†C1©ç™ Vá˜ÔóYnúŠB3–Yu·â°¿Áéü<ð…`%¤ž¿L°ßS”Bsô`-§ÀZ†‚K&ríTÜF(¦ò|³̶²?þÒìˆ5Û‹%̓ež"—LÎÁŠù0)äûëšÄý×h‰«x ¯Ù^Ù6qWñaÒÈ7Û*¼®§u°dkŠ€%MUÜJ(&| –Ù ÎÁñ0^¡în7õq¡˜Êó ÁЍ<Ÿ`¬ˆÊóã`­Š}v¡l°"ó…ù ó÷Šõýr„E°:+2[®×u²ÆTÊÞqžB°ÁR÷•…b*Ï'X+¢ò|‚E°"*ÏO~•x˜QüÉϾ°Œ&ç çÝ覢>n"“z~‘ù•Ðþ*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚Uœ´EŒ œIDATË7XÅ«–o°Š V-ß`¬Z¾Á*þ °>ŸÝœÏǾZ^ôßcýUÜ:XŸÏšH~°Œ!‰`š­/l¤Áú‘ë¯âÀ2ä,¯–æOøÎüãÁ²óÜgÁÿæ~?óÄuÕcýUÜ8XvWhp²ã×l‡±í‡nåëˆe™òïfÿaYñ7}ï™ …dš6€Ìv"X |Ò`…º•Ÿ€åööX7Vt¯€±ü‡ÓqÄR(þ¦ï=ó@¡ùZÂÃwÇÐñàݯ{ 7{KŽX¿ŠI+ŸÇX?ŠI-Ÿ#Ö¯‡bRÏ/2¬†C1©ç™ Vá˜Ôó‹Ì«áPLÅùb^ÉúÙú-¼ø›¾÷Ì…b*Ηãg[°äÄÜD™ Å„åËr‡ëï}ñÌCþÖ'ß.øˆy N–›+ËÃqeÚ?t''4w2Ð6~%–oY^™›¨v…ß·+X Iîé¸â-Xhîd müJ(&,ßb± S²’4ù§ýÙÃïÀ2ËÏþ!Xhîd müJ(&,߀µL#`Yì»ÂðÉÞ‚‡æNÚÆ¯„bÂòí±Ò4mF,YÁŠŒXëGB1aùþà=xþózx>›^xx¾9x_ãÁ{¯¡˜°|É-¾\hCŠÏ]°ó@¡˜°|,ÿ$oÔ×OwŠ Ëß=¥áÿý{ûßQ¥ÖªHIËoúŠÌ…bÂòeû\‚5R(&,Ÿ` Š ËÁú§¬oã`¥xD°: Å„åsÄ8–O°Å„å¬C1aùüºaàPLêùEæWBû«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò V1Áªå¬b‚UË7XÅ«–o°Š V-ß`¬Z¾Á*&Xµ|ƒUL°jù«¸3°r.Á玊)poÀŠ>"“Â9Sj=9`ýHõWqã`}ÏÒ™üƒ0ý?!b|æÐ¡ÙÚ>ý+˜¬8ñy… õ¾l¬n·ñ+¡ÙR‹iúùÐl}6Ï„>‚Oy°ø ÌaC³åö\Á!y°Kû¬³×•óA˜‡fëükÿ2úÅÃaÂc¬ŸÍVXö»„ŒhŽX¿ŠI=¿ÈL°Ťž_d&X ‡bRÏ/2¬†Có%þaK2Ù'áÈñÉp?ßcýUÜ:X_y°Ì³Iìz ’ZVü¡ýUÜX²<–Dü“í3q8b1´,ûˆÊÙ¼žÐE°º÷!òÏáÖçä,†F}€|Ä2€åáÇè±þ*n,™,X»ç£Î±ZVðuƒ½Ã¶Øß C÷>LêùEf‚Õp(&õü"óó¡©GFaªY±¢¯,“z~‘ùl¶ñça Ò©…`áElÞël$Z’N¿”m›—ÀÒiúÛð·¥³4Á"”W.|±†‘Î6Ò±2Àâ1Ö“Òé—²mÓõÁ»ŽOg3´…Dåî-Û6˜Ôó‹Ìχê Q³bE_Y(&õü"ó+¡ýUL°jù«˜`Õò V1Áªå¬â^Á2¿²È´žŸe‰1'nÙåWz¬¿ŠBÍï Ë6žìvv¿¨®vûk ¦T¾K$È ¾59ým¹«ÍÔ_ÅJ¡¬…wÎðºavš`‰ýo¹`g¶WïØJ–eÎ/äéj3õW±N¨˜ËþÜå4no7¬2Xa‚±ÄV,s]|›©¿ŠUBý6‚C{= [Z}W¸€åÏR6¬ß ]À’¬)–öˆ%v•²ków‚Õu¨Ø‰|ߊ}¼BK¬eeÛß ƒJÜáÁê9Ô#Óq;Û‰\œ^'ÒTÅí„b*Ïw[(8xo¬àë÷›vRíŠÛ Ť˜/%æ{¬¿ŠGk{É~¶äŸ˜³9JM«ø|ë<‚•Zþr.Û‡ìfË$c ñ×Ó„.èú’™²›¸3gvgfÝ®˜`é寛å?Ç/Ý-rx£Ãͽ=!/ÁõN¸‹Y$–°?õ©˜`yiäï¶ÍnÃû‘ §x÷òl‹ûÁ+’‘rT °–¶ñ+¡˜Êóc[(¶Ö¹r½.·Æ¬쮂åÏS b€tSQ7ŠI#Ÿ#ÖÍ ÁºšðëÖ„`eLø[!>!XYá÷XËK=¿ÈüJh¬Z¾Á*&Xµ|ƒUL°jù«˜`Õò)˜Å½êL³¬Z>³k}tÁÚú0©ç™+†Ú/?Í7o²½®Hü¤¥ŠßŤž_d®ê/.’í•2¬ˆ“z~‘¹jè—s,eñ²ß·ĤÁŠß Ťž_d®*~2­8Mþ |‚µ÷aRÏ/2W 5 y°ü®PÂÙMUüv(&õü"sM°ïv‡H°Öx¬Z>=3zŠÃñÃËS¸Ê+Æ-î\ )ŤX|ç`ENÊÂCÅ–ÖD7yœäpú"ލââû+}"iÆ&Ø­gc}¬â¼]œ|"ênñETöÝ4gtp:ôihl=×|Ž|µHb Ô]d® oxÇ»•%MO47ÊŠSª©ŠA©7ºÈ\9”#VÐ>ŽXÚfcå…bº[üE•}æÍ¶0oðPáo…VÅÅÿ Xfâzý~hEã–Û8¡˜‹ÿ °šôQEQEQEQEQEQEQEQEQEQEQE=¤ÿ—Ž~–¥(XIEND®B`‚Bio-Graphics-2.39/t/data/t2/version20.gif000444001750001750 5365712366325116 20116 0ustar00lsteinlstein000000000000GIF87a€×çÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿàÿÿÓÓÓÿ€€@àÐÿ€ÿÿÿªªÿUUÿÿ,€×þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏdƒVô@Ó§G—VÍZ ê_¢[ÿz=[víÔ²i¿Žíz5îß·ë–Í»7ðàÈ‘?¾Ûöë寅ûŽ{zòçÖ¡_'X\»÷ìàþW^znëÝËSÿ~^¼zòíÍOý{ìîOÒ—o¿>|ãáÇßýÍçÜÌ!H]€ n—àƒ6ÈÞ€Vç_…fØ„R§!q÷Ib~bh¢ˆ$¨â‡î·â‰nhÒ~Âc‰(FxaŽ/rÇ#‹8¸cŒ#êä‘&)cDi¤’EB™"RRèc“Vbia–HN¸à7V¹eIÁÔX#jg‚É#ƒZR©‹nF¹dœN& g˜^Èf—r¢§f›î)&BòY§—‚执Ÿ€þùåI5 é¡}N¹(¥ 6ªé£\掊™h¥‚º©¨¤2‰¤©†v:ç¥þ®2Úªª¨B* nf¢é­fFJZ¯°ŽI(­o†ªh¦±bZ¨§Æ^™ì³œ2{ê«ÍÖɪ´³Žª,­×«åx#•™ë@iþ’æ®·šk㤓f›ê°Èuûn ó†*ï¶zÖ{ê½Ðæ‹o°ñV ­¶ý~*0±Î’Inºêšv.¯é>Œ°¥SÉïÄüŒ1·«1¼O›êLJ<+ÈÈnŒrŠÞžL¯~ /¬+»Û(óšúºœpËØü¯½ãüó¾A›sϯ­ÒHí®­’2\n¹QG ÍB ´ÈÛ’ìô˜<‡0Ó<']rÊdGiöÁ^s½¬Ø]£$îýFuÃêR]«þÖD»½qÛ:·ø5¢G—=¸z€÷\¬ßÃ&÷Û…#.7‚§M1ã&+>räÖ^ŸãG¯í7èC?ùøßœ—êyÆ'ùáúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüì&=/ýôÔWoýõØg¯ýöÜwï}ðÑû1Ìøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  H>×…€L ÈÀ:ðŒ 'HAù°$®« 7ÈÁzðƒ ¡GX¾ ’$ƒ$L¡ WȺð…0´Ÿ G‚ÂÚð†8Ì¡wÈÃøÍP$þ5졇HÄ"ñˆüaH‚ˆÄ&:ñ‰PŒâ•’ïYñŠXÌ¢·ÈÅ.zñ‹´ ÇHÆ2šñŒhL£‰3ÌeMegcYêTD:¾™nŽþ²cÓÜh´Òí1p€ô™ ÇǧÍÈQkL¤"ÉÈFNÏ-óâ!7åÈJZò’˜Ì¤ Y$I*Œ’â“¢(GIÊRc†q$+˜ƒLR•¡4¥,gIK¢ruÑY%[ùJlé²–À ¦0;xËBvè—äå'a9Ìf:ó™,f #Ë *“$¢û2¡ÉÍnz“~ÒÔœ“¶ Ák† ‘Õü¦:×ÉÎô…ót@"çÍ)’lʳøþ̧0߉GÔܳô ‰=5IЂô Vää8»ØKj"ô¡¨DÙ8ÈN2t™âX?”ÍŒ +•ôhã6*8cN¡ª3©äPÊ1•~nr.eK-†Ë<ÂqkÓÜÜL3O‘tU5}YE;S:Â4§qÛ)GƒŠ6©UjI¡Š:©µ¨6µ\J©:Ò6rÕ§VµS—¥Õ–~õe¥)V…zÓ¾µCݪHÁÚП ²­G²YÊzŠV§ªm¬K«^3®^1L­o5$^CÊW¸.ö©sEë9×ÚÔ¢éí®UlZyjWjg°µ‘ÚhËÙ°z6±b¥,YýJTÔž´®¦þ[˜D+µ«Ë\æZœkWW³FVK†™BË+ ö°ˆý­fY+×Ìîí±UíÒ&»Û—ŠW’"š„+)Ý*÷¹›]ªt}1íÖL°¯Ani{›UæúÖ¹¯…nk¿_lö®qmw³ËÝÜÊŠ¾¼•os;ë#©«¶ÁÍ.š ߇wª¶.{×+`£z5Â2•~ÏušC.¶—«î‡'LœãŽV»¬Iׂ£+b “ –p…“ã c´Æ.&v…[\Ò¢x¯1†£…c!—´çU ÃÆØ ?éÁWmq{ïÛÑÓ«ž÷=m’D»`îÈ ~²{iìä¼ùj¸¿*®þ’ë†[—¹Ž‹­²N_å!g•ºvfëÊnåæ0”ÊY–- Ç«å"/ÉЕ¯œ“ [:ã`Ãm²ŸáÌ´EGÕÑÞEôj-e=™ÂPÆ/ž5X¯5¹[]÷P;U_Ô—Éó3f|PFßøÍ«oçêííÚv½Þb‚ÆõkãùÙ°ÈnW¨ýiP[ۗЂ†ëˆAíj[ûÚØ–æ´±MípjuÛÜ·¸ÇÍmmûAÜÞfî?hÂô¶+ÒÁY7ûøI©d'{ÖöN°ºÓÉCzÛøÙNô‘ÀMîroò7¿vº–ð‚;ÜáæF÷ÁE,o¶»nø!¶6ù]?S'ßl~oyþ@ò*Uœ…¿3–¡-dè4üáĈx¸î¶—Ãüæ Ÿx¼Ï=s×øä4 ¼W4\ £ï–$×xœ;–tÄè)L¹žGë…âÜÚ®³·Íc{Ýë[¿úͳžì­ÓªP`Ö'Œ´—°ë&5ØHŠl·‹Pêh£ú¤-*önûüé<7¸«ûNx¿³Zâ5«šm«†·3'¾ñmçøÛmÑýáݘ–ƘÝCxùé®<à›–và¯.sÁÇ4ì…'wé³ýw”nÞ”_¨å[ú;†ùõ켨?Ÿgsô8_}Οz± ë´0îù{.½^÷ÎÍ<¡–OÌä×WöÀ)þšËVŸž{Åã÷¹JäÉúдnö¥o½÷…êáÞ§8øáÏëñ –æÏ>˜õ¿ñ‚:û3æiœÖ{¡W{s×~üGdU—€³†€(^8'¸lÚG€¶—€”RÒGWc Øu&w…fW(Y¼'‚(w%èX¸ øhˆ‚-G‚6ƒaµ‚š5Ÿæ{*Xƒbƒs¤F,÷ƒŠæƒV„C(,:ˆKˆSƒHØbB)HƒIØ„nõ„x‚Ø‚#ö‚#xƒ¸D}I4q2H„ˆƒàµƒ耧…U(†WXf Ø[d8@͆qèhjX_l‚]¸„E……Ô‡ö‡þ©%…’Byè…G˜†FHˆ’†G‡6ȇ‘H‡èÇRw¨vfØ…ˆ˜i „n(ˆ-&‰}F‰ç·3A¸ˆ¹÷‰nŠÿu†ø„†(coH‹¨Èb–ˆ†¶8†®èA(‹—ø‚·øoÄø…Žxe•‰«(G±HŠvŒÕ7‡ÏxzXŒ¡vŒ9–‹£…½X‹=XTSŽ»8_º¨‰¬XŠ\à˜Ž×x€ÓˆFÖÈ€›¨Šö¸ŽøÈ~ûèˆu˜¾8ŽT¨ˆÈSöŽß‰õÈ)ŽV8ùæ¨ŽÐØÉ¨€î¨©„íh‘ÒØç8`ù‹ é÷’‰ËX‰ð˜‰’ñhþˆ#)“ÎØh0é’*y‘!)r5)‘-Ùÿ¸’8Y’¦8d?IfA)‡¹” æ“));I”'i”:‰•V©Ui’\©•^ù’`y‘E)•Gù”,™$‰–gy“ö§‘6t]•¡·j«æZ¨è:®ÙZ®Û}'&]êõº\éZaë*Š:±ê®ô‰­êú˜h¦i¦zs5Î6ªÿªñê±íú­]I± Ûžë1›]ú•þ¦ë· ÑJ²Ó ¬K¬ñj²eÕ°èq`æuHÖ± ›³Ú ®²Aë^ÈúÝêa…`=ë!?û²"»¯Ôú°~´´:ë‚`‰³H;•çÅ.+‹[´…°@ °û£D+³ïZ´êŸF«h»Â±¾’7_ªWøÊ0[³ðÚ¶y;²üš«J±j+® Ë·SÛ¯n*¸ë¨³‹;¯ƒû¶…ë¡úЏÜJ§å¹¶‘k¸GË6C ¹;³Ö:™\ë¹­ùu¨›ºË*2M‡‘¢º$WoöÆ3° re;¹>Z¹€ëX‹²ÂP À¼Â;¼Ä[¼Æ{¼Â›°âuñѺuò»È½Ã«¼3ƒ¦þwoH½Ò»½Ô{ˆ;:Ÿ»µ™K¸¿X#Û{¾è{¼>Öº;¨I÷qé½Çeo7•oé¿ÈÛ½¸x¸V«G½+°iëhæ‹¿Œ¾Øk³§šl\¼ŠUȶÀÄ«¿Èø½T•µÊ¸¥Íè¸Æ8ÀÜÁÓ‹¶´¢½,Á/(ÂL‰»äª»ŒË»Š+¥ìÁ' ÂTbŒˆhà ŒÃ€¹¹”Û¬˜›Áz+‘1,ÃÌÃþÚ3:\ÀHŒZK|Ä·‹À?Ü·„Yºà뛵›ÅôËÂ!¬ÅÖk›^üÅxË¿\µ-ÜÿËÅ¢{®~kÆ ëÆkœÄU<¾’+Ź ÄL³m¬ÇTËÇ¿)Äþ{<º},È–Û¾CìÃwLÅœ¬yLÈý»tÌÆƒ,É… ±¤Êȇºš«Éä›^G7«K eìÇ\iAŒÉLÉ¥¬/ Z¿B. ”£ìȳ¬ÊgÌiŒÇ™ Ç9©s·¶abèXÉWû¤|ˑˊ¼ÊNåÕ]IöYéÅ‹“,ÇÄ쿧ܸ»|ÌoÌÍ+i`¹‚`5 Å”µlÍÌœ…s ÈÕœ¸‘ŒÎ(Ìd»_¸rª©ØÍ´ŒÏ¶\²t̹f{²4Ü˵‹[„5‰ú Ï íÎ×ÚÏSLÆ }¹IèË} ÌöÊ.Ç Ê -¾ì|ͼÍù¬Ñ-ÒûLÒ†LþºÈÒ–lҽɼÜÉl;ÅV\Áá+ÓÞ¬Ó#ÍÓ'íÓ1=±+½ÂºÌÑM‹aœÔ[|·%J=t²¨º ùÔTíŦ›•@}Ô mÊmÄ^ ¼„Zr6JOŒ¿MœR=bª{:eýÕn¿‘ú²7íQìºÒHýÖ2\3ú5êÕ »ÖÍ%i ¿z}Ø\Îx;×½Ð4ÈsÔÖˆ-¿s»#½Øô»·sr“ÝÙÒÊàÅØÌºÌç¬ÕÇæÙPH’mÀŽ]T«Úo­lùê¶þ¬Â«Æ½ ÛñK¨¯ Ø­Ýb¯­Û{ݧÿ7Ô·]Ôí\ÒáÜÂÍÛ!ìÛ¸KÌþ-ÜLìܳ-¯.]ÌïlÚ XÕT}*UýÛCæÝäº] ÀwýÒF­ÜÉ×[ÍÊÛÍÞ‹¬ÍëíÞé\ˆÆÜÓÍÉu¬Ù‰,ÚQìßDMÚé­Ý0ÍÝŽÍ—Lßí­Þ nàõíàï=Ø÷ьʮà.ß~ÏÙ­ááëŒá®Î%ŽßñmߥÍá+®âüüÑNÍ'náû=Óý]Ó,MÁt-›-.á1>Ì?.’=.â3îáÎàE.ãA.Ë Ò!âîä#ŽäKnÎMÎÕîâ.åIäȬÊÜÒYÍâWßYîãCåóíÂ)ŽæeNáiÎåU•5¾ÓB ãqŽåO.çþynæ{®çQèkŽÆùýÓu®ß7ÙÇMà[.è»KèmNäsž—îç•çonâŽË…Ô‰ÎßµmÇ.æ‡nè7kÜgÝŸnã¡.à‹Nê«n秎癎âg.é}Žéné].ä/®«ÖýiÎ]×eYêžÞê8>ê:ÞØªÎ·áìÆŽà»®ëc®åÕîæÓ®é_žeR¦4êªí²ðön Š©ÄmÛ©ŽÜ½ÎäÙnëÎ뛞ÌMÖ-·óLÎHzÐý•¦ÂÐíôŒîÝì½ì£ ëÈ®èéŽMv¯vrÛõÊfv©ê>é¦Yë4ëˆ~ð nÓõ4¶üÅ_qMΡåþ_õÞ²[rî¢þêàÉÎòÿ,´âýß_^cJ¶#¯+¯¬©û>ñµÕòR ôU%ð9óçMôþìÞ¾cãÊaZ5|òOZÙ/óHóUôŸëÚþëTþ,*ï‡BÝ?ðFÕ[ñF~ç$®,aï½gÅWŸðe_ôYöŒ~äl~ëjnñ¢¬öJÎõî~é]ïѨ¬^ÒíµFˆøã¥¼ŽÈøèø’Ÿø”Ÿe “´{¯Ø–ÿ–•ïÚŠ?Ñ¡¿‘ÿ„ŸÜ£‡é¢ù®ò-õ¯û±dô˵ûò,õ´oû¼?û}ûºÿû½ïûßûÄßû»ûÀŸü²oüÎþ¿ü¯üÅüÇüÓýÒŸýÕ¿ýÏýÍýàüÑÿýâþÖ_þèþä¯ýÌÏüLÆúœ>òÜOýݯþóïýí?þõ¿þüŸÿø¯ÿñK @a4ˆ Áƒ >\±¡D…-NX±"FŽ7jd2cH‰IޤXR$Ê‹&S¾l¹òâG•0gžŒY“åÍ.wÒìYXÆ` Eš”a0…CmúäùSgΠS;ÊJUëÕ§2¡~õŠ'תe£žk5kZ³d·†U;víܸ]뾕›×®Ô½x%:m©Tð`‚ FœXñbÆ?†YòdÊ•-_ÆœYófÎ=þZôhÒ¥M'&œz0Ó€ÑÂm Û/_ÚgéöuËvö뻹o׆ú›wl½»uûî}\xðâÃw/—Ü&ôäBKªÆn°(B×Ê›3ÇMøxàÑÍ??}õðëÉÛvo\l{úµÅ˯ï\ºýøû/¦¨ìÔn¡î\;Р[cÁ’T0B ZÂÿºÁ ©Ã -ì B AÑà ;´îÄM,±C×6‘DetqÅ[\±FCÜpFqÜðFs$rÇ–bô±H K2I#‡Ü±  $pJa~„rÉ,;B²Ë½Ü K'µ“Ë/Ï,±Ì›SF5c„M7ÛœþqM9ë¤Ë8ÓÌSIÙ¼SL8ý|3P }²Pš’ÊìÝsNDµŒÏI·´“ÏKý“Ð>}qÓO)õTÔ;Õ4UI™,UUK]EuUY_íTSa½uVjÔQÕ4×{S:mUW?‰6صÕU,™•6YZ–ÌbˤVÙhgÍÖØf üöZg —Ss—õU°°…¨ móT¨ÒsÍr; …¼·»|ûÏÚ]7dÊ0ùx,×D(ÖuO21`.×_‚2Øá~#Fl⊠ý×`ŽúÍ1dy)Ö6ÐzÛMª ¬\yÞS'²7á 1ZXdS®6£3þmHck]f• ŸÕÕóç…1øã››ú eq™TZ;™H~ºD+–™j¨Y"ºgžúÚ¢+¥FÚÆ•Y6jmtÉ©j§G¼–µî»â®á´”wïgGòkºâŽÜƒv\ì,OüÙ° ·ùðˆ^˜ñ¿—„¼V”›V½#»!Íñf±s 'xìÑ=?ÛÀq'Œ=¢w}u^°G®œÄ×ÃÞ|êÅ//°oÁ½åÜCÒu÷{ùàSG\ÆíN>¾õÇ•¯µyä…}u—7\uÌEÛpߣÖÀòg7½ú‚µ·žÓîC5z}Ç‘^ùvìPËÒŒôÞžü¢'2áÅ@è[ZßþÊf@Úa/}õZàóH¼ÁÕoás ýA¼ÍOqg»`åÄ/¦°MœC÷£æƒÑÕ±²FdN*â?»™PN¿Ã™ cè¾»ÙχtË Õøvļ!ðƒß+ “ø?€1ŠBaégE eyù«ž}&Cx|"œ¢Ù‚ÆDÑ9±‚[¬ Æ.!+¡QD32Êq‰ûbTew?8)|'ݳH³Î†µ;X ùؾ¹uª)‡¬ß õ˜CúÍn‰£‰­Kj’^k &×HÉê’’Ìc"ý˜ÊÏÕ1(¬bÙ"·É²w> ùhþ8FBö(˜¸Ì1[ 1‰ì}Sæ)ÝtÌÒyrx•f3•¹z¡Îb©Ü¦*¸Ëjs†´4š©IJqÎr_æÄ˜ñÒYLUñ¯'¶|£4õ¹4l¢.]ÞdW?…õO!ƨ[û´Aé¹½ƒºóZ Ýä“úËcôR½Â§Q ŠP‰Rt uÜDêª:”ŸËD©ô@ÊP.TwM©HSª®’¶T¥MJMGzÓ™ús¥Ö“)9iúÓiÙTŸ:íéÅvzT¢4©.EªP ŠÓœ6µ£K½WTCÉS©~Ô¥æ êVjU-… J…)9ÍúS­žU‹T] Y·´Ö¯®¨­6¤kZÓWþ×Jæ•£Z“+·ŒšÕÀN« -,Z᪸¿ªu°ˆåkL[®»Fö¥]…jb{XÊj–«b%¬eƒ‡ÑÅV6­~u¨i‹Z£ª¬“ k{Çڥʶ¯°- m%»Ø¸Š¶X´}ê[MêT̲Q·Žåll=»×à2Õ·ÅíPŸRÞöV¯¿nE§ËÒäæv¹'-®s¯ ÝîJw¼Ô-¯vÏËÝê 7»Š-d× Ô÷’ô»Œog·KßôÞ鸣­/¸î›Ïêþ»ýµï~‹Š`+˜¸ùU®ƒ¯ÚÜÐÎwÁ–ocÜ^÷2˜¹á­°†ŒaýZøÁnõ®„Ë౪x®,îÉËaþ£—Ä6ñ„AœááêÂ)ÎñŠ=ã¿õÇæñŒÛ[cöî¸ÄI¶±“q å&Y½TæïŒå KyË=2‹|Y+ûwÌÀ /“³ìe$ƒùÅC¶ë™ag –×u³µÜæ9Å|†³Ÿ—«æ.—9ÁA~󞯜gʹÎfó¢ûlä?K:Д´œ/ÍUF÷Òf~4|yKèg:Ô›U4¨­çH«šË¥>u‡SêVúÕ>µ¦gÝàUCÚм¾u˜k ìNÓú×-îµ§Mlcç:Ö>6‘Ÿ ÞhÓ™ÙŸý´­‹íe;ÑÃF¶·Y]à•ð͇¹ef°tþƒ×‹gì.šÅJjg›Ø“&³½Ã½mhë[Ú׆6o%fSsëÙ0˜‹b"Äîÿ¹»„þÆ/ÄËojKœÖx·1.ègÓ[ØÕ&¾a†ð”±»† /ŒÃu&WyûtÚ︮ÁýoqûÚâœùK˜± Æ“€ Ÿ˜ËFgn…GÒ0#¿ãÿR~!“#ódó9Wîâ–{à×xÎ7ýác:æ/'°À{òƒ?<åŠQúÒQ^BŒ‘|çãTÞÓÛÎ4a½0sŸ:¢«žY°{àÿvµ'®õ]ï›ðí%ûØë&Lt£ýîK'À ÿø·'íeçùÙù·xxkyïÆ•¹à/~xÑãþ|ÓŸoÍE½ØÄßóB×<å>ÎOžíugºÜ__ygª½ó^F}ˆ»žï¬Ÿß\'ýÍ‘oü;×~óïæ}ÏeÏù·7<éR‡;ôí¾ûº'ú¥>“_üÂcýëW‡ùßC/vt‡Dèß—Xâ‹^ô Wqóô·}Ü#YnB½è>ÿ½ ¿'¾œ²<>‡c¾ò³6Õk¶Ò2&«V)»Ú =åS@ä8õë;â;?ä¶DÀ;ƒ–ÿó¶°ºÖº@ò›¹ôA<?ŒAD¿°ƒÀ4À/›Á¼qÃ@ÆA ½lÁÁ#BrÃÁÂä·´9?%̧ ,Â!þB2µ²ñ¥x“BY«B¤Á4¿?öCdBsBe“Á#ÌBiA›ûÂå»Â´:ô“qò¢0‰Ã%<œÂ4ô°5|@¸b D9É£›Cš½Ú@\Á6¼BÔ¨?ýÓÃï°4<ܺ üB;ÌÄNÔ¹‚Q£=„& éÌ»¦ßóDW£ÂÒ£CPœ$8š;ªyVÄÂ#Ä ÃV|ÃQ$SÄžSÄ?cD/ŒÂMôC<„ Æó™3d¥ì³Å?„›[Em#½^ĈÆQD9Å`,´b„Ai”ÄN¼šn’ÒFkÇ]¼EpËÅ€+-qÒ%éÆ=LG]„Ä$DÆ@Ü´µ`œKþüPúÄc¼ÂW$È9äă,°÷ã?Ä)¸t£\ú8p|Ç1ÌÇ俦ƒ—q3ÈhÔÄ‚LHjìÂp É%;y¾’¬HlÂHdÇu¼H1tI5\¿\•m@–„É™lEŠìÉ—ÔG‘LFXt4ŒCŸlÇckÉGJ¤¬Æ{“ɧ¤I4D¹ª å;­ •p¼RüB®Ä >º éJ´Œ°˵üÊ ;ÊSJK_«Œ_†a°Ë»Ä˼Ô˽ä˾ôË¿ÌÀÔË ²;‚ÈK¨qD-«KÁdÌÆìË€ÜÆa4LÇ|LlJK+´ óYLÊäÌÎôL»ìÃB¤ª¤ŒÓ˜Ë¬“þÍüÌÕdÍÖ”<‡<ˆÃÆÒSÍÖ´MdâE¬Íϼ‘Ì´:}BÍ5±Íá$ÎaÍÏb=Æ8É2sŒâtÎçÜKŽ9L弹݄NÇÌœRAŒál ¥L¯æ¼ÎðÌã„Ç«Ê9´NñTOÎl’Ú È°\OÊ”@XáÎ}4ÆêŒÏü”ÍÝzËŸ ¬ôÔÏåËöÜO¢M Ìùœ•Oû4IøDÐø$Ojs6¨<>P%P¼,¥IÌP¿TÐkÁÐÆœPìÀýPÖ,Q«Í Œ.¶„Ñàô—¯¾ — mÊŒ´Q®¼-tÑA R\Rw,R¦WA•Ôo’E@Ê¥F’¡hÀT4Ð[M¦LF!–M-;Å2<þÔdeS^DÓ¥ì¦`Z°q£ƒØN’¢£t¥Ç‡½Wc¥Ó~…TŠ=W› Ô€J÷£×w²éƒ×RÌÔi#O-šÌK×l†ñXnØaåW˜Õ×|ÍØT­X2=®‰'Ø”Hþ»¾xR:¡ËNpZ#OÕHž“UuÃXU7+Sš»X!­ÙµÔi ÓªuYGµXS½Z¦•X­íOíÚ›EÈoýÕ²%WpÍZRÝÚ3µÙ¨%R¬}S®Ó™5Q¯ W…4W}Œß¼ÎpÊ¥%Ûq Ö—EÛÂÛÃ%Ö³EB¼MMõÛ¡áÍÀ•ZÇÛ­ÜÁý×kÔØ>&Èå;6BÑÊ|ÒþËõܵuÚRÅܸMÖ½]ÝÉÐÈ-—ÑÝÒ\¸5R¹½]º½ST¥ZË Ð½…2ŒÉµÝÌÅ]$Õ]äåÝ}õ]œŠYNÞÔs—1^7ÝÝ×U^àe^í=Õ©…Þ#eP¡1ÂСÝè¤\ÖÕܦŭ§mÀäýÞÖí\qE’ÈÝøÑˆÍHßÜå^õ…ß±ýߺߌŠ^ Â×÷ÍCsßò¥_öå¶=]Ó-×ùU[ ®àì` nà¯e[™`|*àÍõ^n^ší_þ]_NÝ-=áBqžìHÏSÝ î^öß¾ÛÁu]—ž™y:ŠéÙot`†à Î[ÆáåÜa$~þALÕ’ýHb,â•<â ®a'¶`Æmb,6ߣÖìœ× Ú¨óY×ãÆ5#ÜÅíÖ%Öb öbØ·ÅásãkXÙC Œo4;¦bnß~ã,ŽãíÕa Vâ[à1ºƒë¥ƒU…›ŸÞ_DàÞ]Þa–_:î䥖Ëg=Ÿ¸!&kRc7>äøMá$nã*ÞI~eà„RþÇT–ÅÅ{Fè»Äz“e&äV&áPvÞ¶¥fä QåwÛHX]ÆŸ¥UfÚ‰ æ ¼âEäöàOþÝZ>—‡ÉBædÆä:n.eÞf#[cÞ#Dç4³[ Üd9Žçyþ{^žçtþYbödp†cm†eÃ]ãîb–¦Î¨çsvçÎäcnaWžão~h¹ÞŠvè{v¹ˆ.fs–hÎe>ÞäÄ-è}–ç…þ膦go_•iÏ´dvV\uh“fe„Þân=èXÆÑ‹ÖhÙéÆè–hCæbEöiÑj–æg˜&꠾ߢ~j—Ög¨^ЦjMæè¨vê”îj®Nä&çܰ†è£.ç²fè­Në‰~i´6aµ¶ç¯Æg¬~k©^«a”¾k¹Îh»Þhºnk¶^i&Vj‚Îé¥FÝAÎfÆÞižfË"-²ög±¦j°&ìÃ6ìŽîl¯FlþËÖ逆lÒ–ìu¶ânÞlÏÖÛÄÆiCç(;i¼žëÌþëÕí íÒFÞØ.X°tËšöëÁÆmãÖkêiŠNî¬â¦0~=2n9¬mÀ6êãêÏÆìåŽkÝæjêØFN;þ$nÛl·¾íæ?·enÁ¨aêXtn%«nïÎk÷žjõ†göînìÆÑfp«íÕá®oÿÞkûNoü>p¸¾jën.ÂÄãQ.Ÿ=Þµ¾ìûFïóÖn çíöÎðÚâãœÝÙ†înp×ð Oð¯j¿n×Aþ~q_q×loq_oÏmïkó¾q!ßþo"Gn%Oq&ÏîÖîíÓ¸…ŒÃ²_ƒ¤“m¥ÆøÛ³D.Õò!ïðþÆqu9_ ýÉœ+ŸÝúÌÍÅ0Kµ8óòvðwñ#Ïs±Jóõ´û½m6ÎÛ¼#9#/O;'ðŦòÆæfdµñOÑè¤s¤¦Åàβ\5Å`têvô×FíYng(ÿéJ/ÐsCÖ?'Ý;WuS_ð=OæâWO ×óUwMÅuô5ñPï`<kßp‡úõëÔõ"—\VWÜdOuPŸlÓ|l‚îéGç7+ï[10_c.‡ua_an×q>Ÿô]—õ?ömLÇvÓ6ékõ›þöX_÷$O÷ Ïw2—rc—qv÷m owøºÞ÷%/ó?s.øÂþw|¿÷s„ïw3wò?ø'xtßxf¿ø;LxsŸxx‰_øq.yŽOymxƒïø&ÏxŒù(y‡Oê)ŸwH§i{_y™¯ùüþx†·v×®wqwlrŸyÿy›oxήx…z”¿y¨¯zÖ¾úÝnz¡oy‹_z¢ßùÈ{x?úi_­aÎy—z¬_{­Ïúížzuüzªçi£wbyšßúY{©œ{¹ùZGr“ï{3ý{¿z¾?|Ãü:²ižOm¼?yÀß{u¯|}oüz|±/ûþQæj{w}‚/zï|z¿{Ÿ{¿|~_ýÏ|¶Ù|²O}¤tÕo{¸_|¨¥uÇ·u®O|Ë}€wÑ?}È'uIÏ{¦~ˆo}Šo~Âß}.w[¸D©¡'QÚK¶úÜgýèWyðgùàÇü¨Ç§ÚÃÙ™f»~3û×ýãçüÚoÿÙBûº‡+çKÚü7ÚèfT+,µiµ~»štB³Rÿb®M»±áÜ—ÿÎæ\Ùögßšokì½XwçÄ¿‰Þùrç›?—>\8ð¨Ø™OÇ;ú{hÕgÏ¢.¨Z|××ã3f5ÞÝsòíòKº‡}±òëÔ+ׇ®ÿ}~Ù½ç_»Í7Ø€îgYu Òw }™…æ‘UY­¡¤¡ihuØlF(b€ÜÈ›‚ Æ· ˆ¦xbd,šè¢ƒÿV"„þ4ާ⎠òh£Ž IšB¬e”V‚•ÞZIƦU5’˜ã‹µX¥\TÖeþm&£–‰eqaŽ©”3f &›Þ )$ŽmFÈå™=Æùã•hvIæƒrz‰bšÞ ã‚tæi§™‡úX'£_â©f]¾9Ú  g(¤ˆúÉ碊zЧŠbš(¨j¦nZº©ž¦ê(¡–9)œ¤^Šª ¶žjª¬­®Ú«›ŸæÊêž­ +g¥¸öY,³ª*û£¤´^•,¯° 좿Æjí«ÝZ§-¸Ö]»-µÍb6*±ÎVä¸Ú–ëê¬Ò‚÷n»â2çZj­u£®Ð>Kn¿sN&ŒþMZqe¤¦Ø†k¬·ÈÌnÃØÒ±µò†6±™èâ›×…@‰…qºè*¼æÈ[ÜÒ…§µbÉÍŠ¼­a ·Ü)Åî>ï1ïsgûß®úW=úK|ßcßôÔ·3ú$nò,t4 fH<©‘MÓ´4Jî_àcTêV´Ó  a_år§@‰Q[5lâ†d“Ä¿a‘däË!ÅH™?[dÇØ¸)NP*#€Î¶%îî‰ü ã¿ø:;žOC áX16VñzX;$á‰È*þ²‘Ь k ãÈIÒ1Wô£݈Jr²“ž|¤_"©“Oz’!¥YèXT²²•®œ$þÈÆÌ™²‚Ƹ%.s ?aä²—ÆØ¥/ƒ)Ì_ÆÏIcIej†©L\^è Ôd©f!^.³šÖ¼¦.‹¹/„Á ›Õ¼¤—XYµî¡rÔô&:Ó©NeBO–³Ì– -rÎ`s˜õ\'#Ÿ)„ae·l¦Üù@hÞÍŸýæ1õ¹~Îó Wd%Åx&NÒ´¢e'D¸'ÅwÒRšjh/SÒlŽÅ Z# kLÚHB±‹uéEUúÂë¤ô¢ŽÄd¡9ɘò4¦7e×, 9'˜þ3þ™ö4*>åDTk”pª¨KWÙS›*Õ§µäA):Õ­&õ” ä(<¯*OŒš‡¬^1iUý P…Æ0“QÍÌR¹ÊÔ´Zœ‚ªâ*×½’´,î ª-iÖ~µ¬j¥«:›i׫âu`|íê¶ôŠÍÅzÔ‹mý‘d+Wì}•£'?Ë£½R©¯\K «õÙUž¶µ”4­kÉÒßeµ'±½-n>°®öbµl<¹ˆS¬¾5x•­ãqט\¨÷ˆµ ërëÙÀ¦Vš½•îlûxY'F—¶Å½cvÝÚÜvW»Á5`Ÿ«Ä4~·jáÍi{#øÔ–Ž—Œ¿çyçÈÞú*wºþêîvcFÝü¶ä50rÜß÷—¿¾-¯x|àw^¼óõ®ƒ±{aóÞW¿Ï­°{7aW7Œ Ž`zãëaLdÃpA^;XÆô¡qCh 9¿ÇÅÁ1qtÜ6SŽÄDަ‚œdúÂxÁ)Î0 „Lc'™ÇÐý…•wÌ*‹@@V‹!Wâq8X]np“•Ì`ÿ½„𗥌e»xÊ,æ2Bê\’û1}&ˆžmRg@ÏY wƱžçÜgE:ÑÀø3£=ç¤:Æt.t£q /ºÒ€ö1C¬ Æ5·Ã«ûð€M]dS_NxeÞLœs6žíí¯Dà—–v¾«c‚k;Þ<õ! _(‡x¿ç¶°Å½Í[8[»ß Oˆ­ùL’i˻ش®·¬§ÝqZóäæöÃðd×zÙˆ.xÍïMò—G%Ö¼n8F þÇ3³YÅ6·Ñ׋tŠ£øÍäfœ=îñ}\$Ï.yŸ­oôÅ ü釛ùzï~Á?úú^éÛz«1üèã}ýÚ÷½û=|~׿ßúWêÅdá·¾üì§þýÝÿ1XüÚüù_ýÁúå_²Nú©MŽ_ÑŸüÁ÷ ~ø­ZöU ýE Xéß÷a ÷þi †ß J Q Zàæžêá_‚ Š  >šŸ ²  æÑþ à™ÑàÆ½`¢ 2 æ`©a2z ò`6 ò!áâ  !*aJra 2á&áâ†]ÑŽlÚ na‚¡Va RáìYáRØ.ìÀDqe©Ù‚[ Ò¡Æ!þ¡î‰á Þ!ð…Z@MçœDj"!*â>a ~ ÷aŸ6!ËðÍÛOó¬GùTbb R¢âšâ á+º!HD’þ|D;í–,²"®â!v¢ b¢'’rb–a,Íê8Oþ /¦bþ+6£ ""4Ê¡ƒ#sý ›MQ!ÖPíìxù.£3îb.öb1¢b4ú¢+ãZâ~…Ó¬Þ FFÜ9–ã¶#6B¡Æ"9®c1£*æ£@d@RcšY#“à$>£A*¤ê< Îl#:äEÞ`FJcDZäöc§$D&¤G^"H2$ßaäGª¤I~ŸHšã"Mná–ÔtÒ¾ÇLV‡#iKNŽ£:J$ ýâI¾ã)²Ž÷d–f1Óc”’`Ødg %B5åJ‘(T.S$bÜF²ã4’áKîcÎÔUjVÒØäv-SvU‘íxËN"UEeeÅme:>$L~þe5ž—#%¥7U¥&îG#ù”(iÒ!Y•OÚ%Xvä&ößPv˜Xòådñ㋌eaE$e “\:]"äOz%c²dš%d^Sf6‘D¦e¢¦"f^Jæ0~¦FÒŒæ\u%„\&=Å!núRiþ^KÆæor¤åsÍ$MÚ&lÝ–næ3*&q®äkj#˜Þ^•¶itΨš¦é”žéžR)“éiŸ–韎i Î©Öi—ê†*¨’:(›ê–òé  j¡BjÞiÆå¥rj¦bªJ*Šbh¤z*Žb_yÊ=Î%«ú(¥¢)£Žª£ºiÀx¦6&â´É¾H"ª:iŠv*—~ê°~iþ±èu¯«VΪÖê¦æª­¾i£jw²‘Ô`‘<¢‘–é%+ž.ë©Jë¡R«±jj„•¯Ú£Ñ€È¯’FÑ\ºk©’jº+޶hµjk}¦Ø½ yt£éŒ+lä«©®ª¿ÒjŽÒéÃNkÄ.(ÁŠ99ëV8+)>I¹ªë¤V¬®þœ ì£N캾ÇÊ+ÜtãÊbl#v¡µì­J¬¾öëÍ:lÎÞ%!‰’n¹¦ÎÏ: Ãò«Î6,²‚lª"*Íbë¶ZªÇÌ«F… º­Ñ&-ʆ,À¶+Ò¶*–f,[ ™ªbíÎþ+¨RíØš­¹†j"fkÍžlÙBìÖîþëÌríÕz-ÔÂm×ÊíÙŠ^Õ’íÞRìÜ^i¯ÉèNB!OomÝÒ­ÉŽ¬i.ªÓÚlà¦ì“#Â:Õ5§È^ë®JîçºíäêíÝB,Áм"®è$ãa®-Ú2­Ý6.ÎV®Öö-Ý%ÐÐÏüð!ý,.†.®>®ç’,è¯èïÀ:=.’ô.ç®ÕÊnô oÓ"/éJ/ÏJ§F½ÍüdO–"ì:îÛBîp•ìøoä¦gÏzU@©.ïŠ#ø²«øŽ.ùžeñ¦o𞯉ö¬áÚ îKâcçV¯ñæ/ý¢oùÞo«oÞÖ¯ )°ýoSné ®ín[Û°õ:°jþAðK0þR0öâ­Ÿ‚ðkð_/õÆî Ïï'ªú§ Ï0 ×° ß0ç°ï0÷°ÿ0·Ò&±1'±/17±÷”7ëO1W±_1g±o1i†ànr1‡±1—±“¥Ÿ±¯1·±¿ñG±}1×±ß1ç±XÑñÿ1 ² r˱ù1!'²"/2#7rnö±#G²$O2%G²!Çpg²&o2'w²'2(‡²(ëp‹p Ïn§,ôn*×®ëúm)«°þ²ð,»p s°uyp3p £pËòð/㲉érþ.󲢚pûò ›r-£òóí+ßn,OfÿzEò<‰lâ´òÒÊ/4Ÿòô>ó8ó»~­o`îÅI@«ÂŠ3+G³O3‡o8“söö²ÕdÈÜxŽ •7ËM@ß2/³3›³-sAðÓês¸ˆâD¼o8ÚèÐî70-#ô=kt9¿ðþ6°NnPDÛV"’EkÚJ³Ò¢´=w4A´CW ölÌÔ 4?U´7³48»´B s3³GŸ3H÷HiS®ýlÓI+kJÏóJ3uKÇ3<“p2c‹Ð¢ŽÏ¾ªL&®<«ò‹mT«íSŸkS[.:K5>‹uÖ^ô*«uÜ:þõZë´}tP'ôO3™s1+3C'ïPgt]ot`óô]/ô.3³A[ìYãä(7¶c?6dG¶dÿpY‡ì‰ÚV%g¶fo¶ûîaûuL?%g6i—6WöE_6è˜6k·¶k׿NçsUGÖk×¶m¿¶gsCÏ6OÞ¶oÿöfçö^ïvœÞ&p7r7²pç527b%7tGw/·Ý5·«·tg·v¿1u“žbÿµˆL¶x7y—·y7j˵j“uX«t\Cul»õR³w|›îb»÷[{5=ƒu}Ãu~»òX³íõKvÛubãuu#v_whût‚¶nÓõ v…v„þÃ4o+8OxZxO/Yì.=*5U*TCJøpSxˆ3ëƒx¯¼ê‡cxƒÃÑéÔÓÔ4)vOiL ‹6„×8 _· Côìø¬ê†!ŒyñÉV8“î2”­„ާx6·8á¾8‚{ŽQ;o’ß$~Ï·|ðîÇØM9MûšЧ¤Š37ƒcy¥r9ˆ÷xû–;‡ùŒ£5GãvEHÌ”šOù1®àgø’#º‹oøBÎ’dÏMï¹|çô§(®WzJüŒ1Ñws8ùe9“/ºs#¶?ËãCõ¨+ú|Ý"ìØynµî~º§ûxª ¹†ú÷M÷üsèx¸.NzWKÉþˆû/Ðõæ~¯κ¡×ºœ¹úéõH'û›/ø¡Ûz¢[;‚cû–3ú•‹´´wûŠ3û„‹{¸+û· 5Óx³ƒ;œWûº_û»g{¼o;®ƒºkÝÍk¹Qãûh¡yóõ¼«û¸Ï9·/¹0Â'¼Â/<ÃÃ%|Ã#ü% ÄG¼Å_<Æ+üÃ_üÄ¿ "óe› |¹O{§;;*pÅg|Ão¼Åw¼™¤¼ÊǼʳ|Ä»<‹||R†<ŸöÎ_¸l×;ù¼ÌKüÝp¼Q=Òc<ͯ|¢à<ÇùÀ“¼¬›|E¢|Òkü$q¼_=×/<%i}[0I¬Ø—ë<°Oõ˜Sþ:}ϵ½w½Ã}Ë=ÜwýÒ3¼Íã‰Ó?Ú¯}°³õWsîz ¸ýÐß½×Ó}Ý_=âk|Óƒqßû7™¿n›5x×¹áË|ã'|Þ“Oæ/~Æo>Ñ£ÍÞóUäëw€S>F‹:‘3óçϼÜ×¼âƒþáÇ>Ó“>ä|Ô³;µ;xÁÛõ½ŸøMé;óûðû;zCýÈó~Éßzë»ûîÃ{ôËûô×¹ª‹|»û>ÐK=­›»’{ö{‚Qÿò£ûï[¿¶cï‹¿02ÿÔ»÷S½Å˜oŸ§}Zû½ÚK>ÛþêÓûóƒ?@û5ð—@‚$¨ðW°„.„ÈaÄ)tøþP"Ç‹=~ì8²aH‹'Ob4™‘àF’*I¦“¡K”,_Ι³¥Î›+ÒÔtgQ˜Eeö yô§P§m2•êsªRˆW±fÕjµ)RœF©]vlY’QÉòT –kÒµnÙž%Ú•nU¨iãæ…{­Y½_áÚÜ ˜ðܾo ?å‹wð\¦‡ÿ:Æ+xkeËwÛ,×oãÌ>!{ö*¹mâÑŸC†6]w2ãÕš£FLólÙ›k³îüZ¬íӿ骦;öeã•…ß]œ8ìÕÉ;Oízørèº}3_.]ñuîÑ{7§Þ½:o¿‚Íg\ž=çãï±z¾t{ú???¿þuûý¿Bï¿ïJR.½¼4ð?ùv.ÁûôÃÀ ÃÏÂ!Ü®µ$¯Ã äÂé>DõDmÀë+‘@QÜC [qFí.|Æd1F }äñAKÜQC䑹“’IâŒ<0° òÆ')ËѸ(mÌ­J%kêRH*¥ ÓÅ $³Æ3¯¬°ÌÅü2Í6oä’M/µÜ2ÎçLÒ¿;ǤÓO3i´O0×,TQíÞ,rOÕtP9ó´ÐÎE ETRLÑŒtÑK‰,êÐ/ÿäTP 5ýôÑÛFm8P±¬>X;=•ÔLŸ¤ÔVWQÍ•OOCíXÍZ]57_!þÝÎI•õ8ZO-–ÙðeuXþ mòÚ:ÍOZS­4Yq7 6VgõœÖZeË­ÂoÍUQÝw·Í.Û@ÉUu^oë…²[bÑM\|S ö^]ó5øß ~qa$ vx_€ÙÕw`„ÞêàfÆöáµàuWØŠù%Yâ‹9ŽØã‰V™[–!Î8«F±¹(;>1Þhû-õgmM^åq]¶÷ã‹~ùèueÖ*›mžSâÙ!žÂúÖD‡&øëvƒ±i¥aÆùlÓfºg´Ÿ¦7j­xözì‹°¦Hëœo¾[á¶§\[h«[öûä°16ÜhÄSVÜiÆ‘ž¢¼þ¢ºo¾ë¶!Ë ²üò®-ßZóʱö|s/ÿ;î’ßf{uŠ[¼lŸ‡r¨“výv¹%¿jjªÊœïàoÎüê¾Q¿ùø—öžt‚ŒwÞâÝYÏ]vÁÍŽý¹¥×lÂcæõpðÕî"—’©j¾Ù_Èóâ•§Üý¾EÞþö«–^uêa·~{À³ç¿ïÍ?µÓùÜ&@½®pæÃPú"²>âísì[žQš‡¼Ë•NƒÄ[Ù°G;ñ-ÝS૸@^Ï{áãJ¨B †Â ^û(ø<]0kðÃßH:òŠf¸[áÿ¾R‹€¢jbp–èÂ(뉙rþ`C8G:êσ6Ô¢ü>Bµú±ï}?ì"§È¨4‘w'„"E¸Æ4Zñ…¶‹!íÈÆêm‡‹$¬¢›äG) ’Š!dÃåF:‘ ¼¢û§¡,‚°…N4$ ©ÆLB²pu<à[ÔÈ%Oæã¤79G@¦2“‹d¥(UèI*r•°dâ%qdJU†’ò²å!{é³;s˜…¬¤&iLZò²˜#;¦ó¸K/%Fyñ"I¼¶žVÖ2˜‰H2œ`#ø Êpðƒ!a ?¸D˰ð…1œa _X¸äý®{I+Þµ¼ûåJpK©]£À-FÆãO˜Æ4®ð†qŒã»·Äò ªˆÓ›ÖK÷Ç(öçiÌbÆ1VðŒke /*ÇUÎðŽ»5dèæ×Çõ^’MÜ^ú²×¸ ÖÈ’ l9'/ØrRv³2Þg9[ÎÊu^–÷¥åþηm^Þ˜}þÝû²·¼hp“ל (¿ÙÆT¶s•ñ¼:=›y¨]s™Çh.9»’+´¡_LD'xÑŒ–ð­ã vÅ—ž4põ«iþR:Åžf+¨C=Q3˜ ¦®1ªS­áHSïÕÔµ´¬Ok" zÏGþ/ jD¯¹Ô¾žr°‚­êæ ùð>ö²7=hpÏ:ÓÅ-¶z[l1÷ÙÕÝ66§Û_s»ÝÐöóø”½er³[ݘæ÷¸“ýmÄž›ÛòÖwÀáÝo‚³ÚÞñN÷¼ ÞlfÓzÛ 4À×Y‡7\áßEr¾%îfßÛù¾5ÞñˆS|âå8½ þðƒg\œ$‡!ÈY.þrŠÛÜŽ ÿ¸ÉsŽòšoüâ3÷wÊ1~ô¡«\愹Åqîí„'}áðmzÐ.î—¯\êZ?yÖGNô¨¿ÛëX§9FÉ\õÐrìag:Ç©þt«Ã}ëWïºÛãÎözýëgÇíÛùþó©]íÃÕ{ÌéÞw¥£ð>6ß;ø¿çÝîmß¹Ø~÷ËZîk¯üÞÇúÌ[ÞåŠ×³àË®ùÒG¾ð><ÔG/úÁ;ýõs‡¼êÿMøÎþóˆüãCïûàÃ~ö¬ß½ë{O|¯£þ¥ÜØAçùÄ¿öÒ¿=ésoz¦Î?]s2¸3õ$>¾ù«Ïûéãéu×~þí§ùëÇ~ûçŸ|Û;¾wžëUPsŽx,Œ°Jtˆ ʃëφoÿbOø"PùðN÷"n†Kz^‹¡à¯¢ô ²èç‡\k‡§nn!°øØoé(Ïþdoù̧†îg%¨onhˆj&50ˆJ°±ì«óÏ%Pï-°é0P‡|‡Œ§}nÐ/hŒ6ÐŒêºôÏú QP ‰ð pI°(¶rŒ–qêñm Õïú¼póZ‡û®F§Œšð¶æ''ÄHõ°ƒªð¼„åð 1S¯¯¸ Ðp p¼zè~Ð ë qõV°þñ÷îP]Fgœ$c’¾, ßÐ/Ñï OÑä˜ïƒ©SÑW1ñ^Qqò:Qyìü‚‘þrÑ=ÍtrJª¾èsƯ“6Ñc³L§‘‡ Ÿ­¦êêƒlКš•âÃ1ûj1¹pÇÿ”Ê‹g¡h ¯h¯Ñ[± 럑«ÒN²ž*ªh oâêí)é±m±¥1Ϩ‘!/ªi•ë²j‹hæp!%­!3ÒÒoqö¢©Ûq"r«§eñõ±ùqñ1³/*(sæª ë²,òÒ!²SòÑ1aQ&5'§þ¶Šªn2' ò%gQ#‰M#£ò!UÌ#r'7²';ò'?2(aR¹)UÒ)÷q¯0O,r%ÓÑiO+yÒ*}²læl.é².íò.߇,YÒ,]Òm#ß’+“/ ³0 sÎŒ!1s1³1ó1!32%2³2-/+-»ò ÃÒ+­î2A34ßg2I³4Mó4Q35Us5Y³5]Ó4E36CsÕš²ôv±Dd37+ó5y³7}ó738…s8‰³8“5u39 ³%Q9Gó8¡3:¥s:©³:­ó:±3;µ³7³Œ nuº3<ål;ɳ<Íó<Ñ3=SS<Ù3 ¨þÓæ¦ü®±=éS=íó>ï“>Û“6ÇÒ6;S-…RuC?Ù?Q“@Å33=³?cò?õr-9q)ýAÃóA”Ë2wà3jäs+¡’ü¤D3+áÒC]ÑAô+Ùò)±r*Ý’D3.O´*cÔD5ó*oTFsÔF4-‡E1t/5ô,{t3-TE#”EAH•ËM²_ª6ƒB¡QI‹G³Ô½ü/²â «"Ê#ò¤þ\´±&P¯ì¦µÿ°@‘ôJ3ô=.«”q‡X‹¡js ò6éy$K0 Sç± UG·”Gá”JÝtN=‰çئ"k+" ð +þÄOYÃ(ÕG ] PgŠQWÔQÅRgiQÛtTS J«j®KÕcFS§B;uJA›D5IIÕPˆU}4E JáïK#*WÁSý‹FE$uÕ&Y*J-+X«ôBUHé´/•¼˜Ñõ­Ü3#”µÖâó? ÕKYµ®Ô‡¤Q·UKßÕ]tWå4“ðêIùt]õYó4©˜”.œ”±²¨RõUƒÌ00?T£BTaGÔEKt_ºT«òðƒ ÖµÒÙ˜µEEôE¶FVc–c7Vÿ•W±õQu^SÕd­”9urI3vG?Vfat"(t9åUXW¶^[ªÊ¨qh•gþ­UUo/ñ³hï’//dyjŸ“1ã¬JVhiíÒ@±V=­¶.CöakÖ=9½S­Ê´á¶–.³6mÕvm§ólç2lL‰âÌ8£vCeTt“mõvoù¶oýÖ’³ß,‡<ÝsjùÑmóowqqå nëôi‡³nû±aGÖqç–q5÷51wlûja›Ö®$÷@Çš Wi_v;7lósuöùRVg©5ŒF71£vVOwHµUe}Ôu%rfxãUQ©ég#'h]VB‡Wxy×He×y«5N“yQWy›^¯7g£—^“÷M4fƒ÷ki¶c6tE¶k=V|ý²þ\-}Ë׫@~Û×|½–|g´lÓ7T`ªÈÞ÷s»‹sh’R‘Òû^÷“˜V~Ï—~‘}Ø6(–Ø“ÉNa+"ÅOLóµ Çwdó—ƒù¡’S6 Ñ´Ò6Ø} IR·æKCñL¢Oð„¸7kûÀwyKR]aJRC¬ƒQØ{X•ždŠ®âY1âO5{‰÷y±×?oX‰%"€¡u$M8|íˆ)Hˆ½5‡P¶чg8‚k˜*Ad“Q‚æ)[n{wvWº5gÐ'kÀtg¬°~=XŒëx94Duâq$öw¯µg•ä^u8ƒUV¿UAqøŠ­øŽa¶ŒÇ7§þjPw¸‡i8ƒ&b?ubÏU‘·Jƒù‡G9Œ#™íøŠÕ·‘!¹”8•My}÷x~-¶ñø‹3Y—sùYÙ‘9󉙨4Ælb•}¶€ç˜ù…åL“{—e8–õønã7‹ówJw\u—'F×;O†›#±{Á–uóq xš%X–©ùƒQŒI‡21Llf1aøZѹ4ŹFî9›m<97Î09šWy˜—¸A…™“õŸ'“`E…›ó¯v[ÓxU*÷WdZ:ÕYòÌùdK5vZ’­Ø¡Iw¦"Óû ˆjÚ6›¬i¥ãdŸÑÓ$å¹ozŒ±q¡›¹VþQz¥˜/$j7úï,Zl4†Ÿ‹šd:::?ºC™¡§º¤ã¹š©‘Øž—:Ÿ‰vpO³ŸÉ¥½º¢3×5Ÿ9¼ršÙY§I–§UD\ÚvñtÈÙ›³œiZ¬áæ®ññ©‰ºtÈ EÙ•I9˜MڰŦӉ™ãº)lš›e™ y¹­Ù–qžk¹7›°K³/[³Ýz­G±¯´c˜´3[±ßYµ{¶×™–­Ù–?[´}™ª[ù—_Ùµo›¶3Fªw[·™·Û¸gÙ·K›³kÛ³—[¶“øy›: Ãu°q[šYû´¿7±‘ûµ¯û º¨i2)g[¹[»þ»µ;ÛÓ½Ÿ›ÈLg¿¯©eª¾cû» Û½ÏÛ‰¹›¸{[¿µ;ÓrÕN)º²Âô¾³;·º‰­z½M[Á{š{ÍRóGbÐ"¹œ»Í;À¼¹Ùû½œÃw.‘q²„oµ’C{ÄÁ;ÂÛ¸z©÷›S·Ã!\œ>' [ü±¥·z½—¿S¿WœÆI|iâ["ýø!ŽrÇ)»ÇeÜzÜÁw¹Æ›\ŸüÇ\{]|vÙ2ÆózƜʩÖÊ¿ʳ<¡Á®«üů¼Wa—N¢6¿WD›ß‹ÍËü…è’ÏÒ¼¿Ï¼ª·zÿiš®ýϺ5¬»¹Xù“Ë×\-æR2ßþv§ù<еœÇÉe»oÐaÓsu®:æšžS'n }[=8ó|σœÅå¼Ï‡ûßÎzr½“VŸÿpwK¯ÔË3Òßü;C|¿Y½¸üÓ³3 $«U“± ¹¥5m9ýxs÷ÎÝrmÝÕÚ7oWÖ…4C‡¤ñ× wÎFšól[ĉœÉ…öÕIWZ…6²}¢½FÔ= ½ÝÚu=B½Ó—VÈW;^ÑÐIñžÑGç¯.=ÜdÞÝý£«9¸¯™ÜüÈýÿâ{ÈGˆÎ ÞÎñÝeN]»üÙ3ÞÌ)Í-ã Ìýû¸£Ä7ÜÜC:Ù?ËCÞÏGžÑ¡ñÞKägÐèsžÁc¾Õ{Ø?œáÇÝ×þ¿O>¹žå}<ÚÏ…×W~Õ‹å#^ê£éÞ»›Ì´~ë¹¾ë½þëÁ>ìÅ~ìɾìÍþìÑ>íÕ~íÙ¾íÝþíá>îå~îé¾îíþîñ>ïõ~ïù¾ïýþï?ðð ¿ð ÿð?ññ¿ñÿñ!?ò%ò)¿ò-ÿò1?ó5ó9¿ó=ÿóA?ôEôI¿ôMÿôQ?õUõY¿õ]ÿõa?öeöi¿ömÿöq?÷u÷y¿÷}ÿ÷?ø…ø‰¿øÿø‘?ù•ù™¿ùÿù¡?úé> ;Bio-Graphics-2.39/t/data/t2/version16.gif000444001750001750 5227412366325116 20115 0ustar00lsteinlstein000000000000GIF87a€ºçÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔªªÿUUÿ,€ºþ; H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏd©tQô@Ó§G—VÍZ êN¢[wz=[víÔ²i¿Žíz5îß·ë–Í»7ðàÈ‘?¾Ûöë寅ûŽ{zòçÖ¡_'X\»÷ìàþW^znëÝËSÿ~^¼zòíÍOý{ìîOÒ—o¿>|ãáÇßýÍçÜÌ!H]€ n—àƒ6ÈÞ€Vç_…fØ„R§!q÷Ib~bh¢ˆ$¨â‡î·â‰nhÒ~~øc‰(FxaŽ/rÇ#‹8¸cŒ#êä‘&)cDi¤’EB™"RRèc“Vbia–HN¸à7V¹eITÔX#jg‚É#ƒZR©‹nF¹dœN& g˜^Èf—r¢§f›î)&BòY§—‚执Ÿ€þùåI5 é¡}N¹(¥ 6ªé£\掊™h¥‚º©¨¤2‰¤©†v:ç¥þ®2Úªª¨Bênf¢é­fFJZ¯°ŽI(­o†ªh¦±bZ¨§Æ^™ì³œ2{ê«ÍÖɪ´³Žª,­×«åx#•™ë@iv’æ®·šk㤓f›ê°Èuûn ó†*ï¶zÖ{ê½Ðæ‹o°ñV ­¶ý~*0±Î’Inºêšv.¯é>Œ°¥SÉïÄüŒ1·«1¼O›êLJ<+ÈÈnŒrŠÞžL¯~ /¬+»Û(óšúºœpËØü¯½ãüó¾A›sϯ­ÒHí®­’2\n¹QGíÍB ´ÈÛ’ìô˜<‡0Ó<']rÊdGiöÁ^s½¬Ø]£$îýFuÃêR]«þÖD»½qÛ:·ø5¢G—=¸z€÷\¬ßÃ&÷Û…#.7‚§M1ã&+>räÖ^ŸãG¯í7èC?ùøßœ—êyƶöêúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üò´›ÄüóÐG/ýôÔWoýõØg¯ýö¾;ïGà‡/þøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ _»FR£ð€L ÈÀ:ðŒ ß7@‘p‚Ì 7ÈÁzðƒ ¡FÀï‰ð„(L¡ WȺp~ É_HÃÚð†8Ì¡ÝCÌp‡þ@ ¢‡HÄ"°‡ù¡—ÈÄ&:ñ‰9D¢G¸GÅ*ZñŠXÌ¢·ÈÅ.ÆÎ{^ £ÇHÆ2šñŒh Ì0—5•e©Séøfº8ú‹ŽMc£ÑJ—ÇÀùÑgx4œŸ6#G¥ñˆL¤" =>¶Œ‹…Ü#'IÉJZò’$|£!©0IšŠ  ¥(G9@MbK‰Œä&?9ÊVºò•;,åꢃJ ªò”¬„¥.wÉKÊrªåoùÈ\öò˜ÈLfùÇbz˜E¦2§IÍjÚ™šs’4#MmÓšà §8чÍÓi›ì&—Ð9ÎvºS™å´£®žÙÉUbòžøþ̧>¹çÈhnQªÚ§@JЂ¯ŸÞÔ"@-Ç:„ª˜„s(Ç *9‰Zl–wtãÖš¹9‹fΜ›E?'Ï‰Ž£—CéCUŠ:š£/ ¤Ú`Š6S ’¥)NCêRÁ´¡2íÜOåXRŸî´ èQ÷Ô•fs`:}jK›ªT©æ´§«¢é²’zÑ¡f”«-êÒl:S¯Æ´žVå)Uƒc³”©dêR ©¢¶g\®“kZáªÕ:bíÛ\÷†Ö·25°AÒ` KW°¾Ô¬5•]k#µÑdò±ƒèZÃúWjAŽ[¸ú X*UVjW–¹Ìµ¸ÌVt³˜Ýþ«–òšÚ[ýŠW"! »êZ’†Ö­b-m\ÊXÂ’ä¤Ru¯$E.4Í&b­•mc‡[ÕâF4bÍ­Y…&»[ÎÂv«Ôå­t^ï"Ö¸£ýìXETYI9Ì5ЕÕx5{Þ›ÎWrRjóÊ\4Ù׺¯­oY{ TëÀ¾]hy#K¤öžë4ü…ÜoŸäX£Þ÷sºµlsY“.ÿøÂ®pVÕ+\Ò"÷tàɉ;êªå>·—u¯|â[˜Æu-H&µ«†½÷¿Áõ,£…ã¯ÚxÄCþjz“|VÓ’‹­µ¥Údä±ÙN¤} mÍDYÜö¸n«ò„…uåè¹Éežqþ•§´duh¶ýð™Ìä­™Âiî˜çxÞÇmÌTÞsTç Þq¹n6²‰³låE“Xȉ^¡×Kb?Cuu.4„„×Û­N{®Ý§ÿiOâZÒwÖ矋žÜõãÍœê|®ºö_W=îiÝ<[óžùºw>ðK}Ðá«™îÆ6ò­þŸñx¿^­¾®nÑùî»þò<Çzù)œ÷ð+Zý™Þ{¤çNUòÇ_Þ÷ÿ>_á?¼_|ýé—èÇgL£À{Þæc¶·sÆ}˜Çñ6'í'bø×~å€h`3~«'u ˜|îg^iÞ7€ƒ¶€rZH€¦d€ ×”z!Hgè‚äåh÷'ÿ—ƒ(ˆ ~¸@28‚=(€È‚¥:6Xyy&a+È€¨&QCXp8…)x3¨iHȃl¶ƒLx„5h‚[¸VƒT„Q˜%˜„TH]¸4؆J(Xch~õ„q… Ć­‡*8‡ø†`È~þbdhˆyø€_èfö׈nx~px†|H{–W‰@X…Z¸‰r˜T‘¨ˆzøx—Xc8(‰)æ„f艃h„£Hˆ¥øf¬È…®èˆe¨‰„H| ˜‰‡8‰{¸Š¹x}Œz6ŒµHd?HŒR¨ŒÂR‡h‰ÀxŒAxŒwøG±ø~(Š¶ÈˆÚØŒ‰˜ŒÒȉÌXˆÖä(fÆØ†Óh‡‚H‹ìˆi¨ØŽh˜Ž§hŽòxhV਎âH'¸‹üø‰ï8‹ó8Ž÷ÙŠÉŒëøŒÂ6dç(gû¨I‘ô胉‘ÆèŒÃv¸Žé Ù ’ )’&éŽ(É‘鑽‘6þ‘iÐø‘ ©’ öX“/é’ñÈ“?IøHƒÜŽ,éf0I\2™Ky‹= ”;)”Ñx”8–”â—‘L‰•N”#’9)•I•qd•×”E©•gy‘Y©–[•ÛG“`ù”qÉ•)Yþ•fI‰rù–w9—nY—Cé…m™—¿h“ —|Y’7i—Šy˜}Ù•'ù•‰“-‰—»(–E–"ؘ3ù˜€‰ŽÉ™k‰˜¼¨82ø‘¢™±õ—‹˜ò—–¤Ùš Ù™%YB G,§ ©é“¬š()›†I›¿é›’IwÓbYxƒÂYœÀ¹—Ÿœ£é™ÍI—%T5f[¦Zyþ“_“R[fÛIг¢9˜h©—t9i›•ƒ.·¥t ƒ5¾âžJ÷ž¢!ŸP×a_ãš…ˆž½¹œ•é—„)žaiA ØV£t4ãt šWzcŸÛyœ°8žæÉ–°)Ä “ɘ+i © xƒ.VƒŸã†» ¢4G Î©ž:¡ÐY¡±™¡H‰o¢“Öi[ôé+JwŸ5¢ú LüI‚þÙ¢8¤‹X¤çY˜ÎY½¢Ø¹c?žvS3QnâveHúŠGJ¡Zž_:œ:£:©k7]2Z•¼i¤Zê¥Jj¡oJš˜™t,¥š7Ʀûé¦Lšži:–kz™ß¸¤*ʧþcª¦– §{úŸäÙ¡ªø¢aÊœ}š™Ѝƒª¨0ê™s~vŠdÏuü%nSµ¡[ºqŠ¡…꧇*§J©. _žú¡®ª}Ϲ¢‘JU› y´zª’Z¦‚ ‹\v5õ™7·õ ³gŠºj«“£Çª©ÉŠ©«ª¬_¸.ÐuZOF§¡:«„º¨º¬Iu«º¸‘Ïjªù§_Ùu;v|Øj©ª¡éЧB:•á ¦Áµ_åê!ç*«,Ú«]ꨥ*¯‰j”ñ*¦÷§]ì¬ÌE­Š¯µÊ¬©*®—ꯕ °š«ã cÁšk[Aà×®úÚ¦üú¯›§:±Ùú°k²Ûª­ìš¯¬ºþ¯M°)‹²+»°ÝÚ¬Ûª%»®dú;+ªz±!û® ´-ë±/K²êêŸTÔOêæ•Hb<ç;<µ Ë­Ôå­Â¨ªH뮃Å5`¶b;¶d[¶f{¶b[¬´äpâp¦…¶pK¶Åê{xuO·x ¶j‹2Û³ ®[´]«.y[¸†+·_Ö<2gYMK.‡‹¶ºõE(#;Zö¸g»·ùhµlc³Œ £ê‹÷µ–;ºxk·};3®Cºr«Iö:ª;¶˜K”ýz²:k¨K¸ÂûºÇ;^ÈU¼¼þ;½Åe½»‹½I ²E+²Gë¹?‹³º½Ë½|T½Ñ‹¾x¤½Ò‹®, ­§ë¼¥™´ÿÊOZ'T»¡û{Uùû½¿K0;³š;:œ«¼ÉKÀ*ë·ñë¬ Àƒ;´8k¿D+¿Ë»«ÿ«µâ+Á.›³ ÌÀ4{µ¬Àó‹Á‰I»Œ»kÁ}ˆptsw” Â\§#ì·™Z³ {³LÁ¬ÕcÕ«W ÁÔ;¾;,±L±%Œ¬9íÌ|Ñ.Í®^\@Ö±ìÔXMËuýÉIÌÖ< ×}&׊¼ÉˆLØhØšìÊ*mËÑ¬Ø MÍsؽ ÉË ¸»ÜÓ…MÙ‡íÖ• ÚŸÍÙ‹­ËÓL׉íË׌ڗ½Ò©Ù‘­Ù§mÙ™ Ûo­ÚqíÙMÚ“½ÈñÓ`-Ì{ýÕ}ýÏÁLÎm-Í¿ÍØ¿LÛ±mÛ¡ÍÛKþ(Ú» ¨ÝÒ¯íÚ­ Ù· Ý£-ÙÓ­ÜÜÅ Ø"]Ñ}ÌÝÑ ÞxèØ›ÍÞÖÈÜ«íÜݭݵmßÏíÀïÛÍÚ÷­ÞßÍߥíßùÝÉ×í×Ù àÕ-à½MßëÍàámÝûíÝ NáÍMÝ.Ýí­áñmÚË­Ûß© á.↌ßõmàŽânáóá/Îá#îâ¹íÛãœ`•œŽ¼Œ,à4Þßîã=^áúÍÈ8®à!NâNà)ŽÝÛíäÿmÌ¿ 135XZxð™71s°·â£s ÊzÕ(–×Â-æ,–Ünä^üdæb[¢«um¾å~P&ƒ æeŽçÈÞþP^à}ÞäÅ.vhVž¥Oö+°q!ú|Þ|æJ>ãCžä?>àhlälþÃq¤´DY¦<çÌE"_Ø8\ÞP­ç‚-ÖÆÑ6¬bì²énîæ¡†èù Ä$dçtŒê¥é•Þà0^ãANä*ŽéVëÜÙiY¾+vꌾԤ®Ö¼>é1nâcÜë.ÛnzþíH>í‘~âÝì¿äî=Û3êP8ÜxÜ{®êæ}Ü©®îcΫß^íÒ.î2îÞâ÷NîâÍÅ¡Ó-¥‰~¯ÔÍ Ÿƒ “ŠGÿòBóGßôDïôCoô?ÏôS¿ôHõPOõC¿õZ/õJŸõV_óaÉ$¿ÜœþôhÏõXŸö]Ÿô^ßök¯ö`/öt_õu/÷vŸ÷_Ïöc¿÷~ÿö}øqßò‚?÷z_øïöŠ¿öˆ÷‰Ïø‹oø~&eãæø‘ö÷’Ïù|÷žïø›?ø˜OúŸù¢Ÿù£úªú¡ïù«ø­oú²Oû©oû^/Æ­cP¼ßû¾ÿûÀßH3‚ã¯_úµú¸oüŸüüÎþßüËý±ý·ÏüÕ¯ù®¯ü×?ýܯýÅÏúàÿü'¯û…tö׿ýÙþÑÿýÖOøéßþÊßýɯþçûïOýî?ÿâŸÿûÿ÷/ÿÑI  v"x0¡A… 2,¸°“‹ˆT^ĘQãÆNN¼H± È‘I }=:víªqO\èöx»Ê«?)Þx÷ìͯGPý{ú]o‡}þñóMï{ÇϧýØsîºÿÚ P¦ãC0© d0ñÈ›ë)÷Pû(?‚@¦ˆ³(!ˆK°2ý@Q«Ñ;1ÅD D†¨Ó0(âPÄñE·“Gä"”¥qÄ‹D™“ÏÇWÌ«E‚t H¢8¤ð5‚žº‹Ê!¼R«þ¼ër+*RFÛ $í#ë3h¡4‹4³08ÅDþ(¡5ùcÌM挌sΟÆD2NÎô´/"(¿ËÏ7—¡Ž×V«ê‘S¬›ïeñÞYïÀgö›ÊÀ‰¦Uk÷D<\i¹]ü]½¿koƵS\ì±é¦»%4?.(¸í>ÖM2m.“f§mB“̧žE}Бd7”öz#‹½µn¸!Õ»5ø³êÝjÝ7WóöÖT7~w§’GŽÚ™Sw~ç'u¿äß=GY¡Ižœt“ÀµõxÎÏEn-Wê&Ù‰¬¾û”ä>ߢ_?ûyë7ßíØ·5ý5Ž{ÊñþP&8ïÅlk4 úâ7ÀŽ\,‚ ¼•ô¾}ýŠ~%_F„Aå,È~™!óô@ ¦~+ žÓ\ØÁ±˜…ß™á%tÃåP‚0 !]|(= ’P†4D ch $ N‰µƒÏO¨ zGŠUÌ›[ØDbM(ˆ"äb¨ž¨E†±„X„Зج5öЌǣ ôƉÅñ…sÔ¡¿(D:ÉŽ}T#„Æ(’ŒQk£ûXD9¶Ç,Ü!™Ç.îq.¼c!YÈEzå”Dä•õIQ”gL¤#;YCBž“Mô¢%³8Å:¶2Š«Üa*ÓˆËÂ’ˆx,emþ‰B^¶Å—´4Ù/ãKY&™ŒÌä.O Çanæ•y<æ ¯ÌdnÒ•Å$L6׸MeF²™³âf%uÉÉiÖrßl§«ÉÄxBœè,§ßyËzzòœ`ì'+÷IÌ€æRG,h/çYÆ„s¡þ¹'j͈BìŸø|¦?'JÏtŠñ¡À̧:ºÅ††ó£¦ì(*G*=r^™²lé(O*Ñ”Rs£ ­©;WêÆ’¢T’ªì)M*ÍœÊó¢i7£É΢Ú3¨‘̨@w:ɦjtª@­ªT‡ÊÔzô¨³Lª8WÓe&•Y5èVá‰V…Þ¢O=«ZùÉV‡~ªa5k(»ªþR¹”®&u+H£šVoÎu¯6½*Q«Ó¯’U˜õé`ÛšX®J¶®”]ëbŠYÃZ°œõ«fyQÇê´…«^ ZÏútµ¨ý«k—šÙÖ õµ­U[ѸÞ§¹Õªoß[Ûζ³x…¬PkkѾ¸„%-oUk\Ö"÷´¸]no©ëÜìN—·¥is±kÝݦŸÂ,yÑYõnw¼ÉUêw¥{^÷þ¶»ç®y5Yßá>w²âµo{å«_sò7½ð+ÁëU».8l¹Ì‘ÂX¶)L¯!“÷;`â2w½Ê0\ŒX÷÷¾š¼(‘¸¹žMÖ} ™ðJèW’þ dÿÉ0/̼3öÃÌ=q9ìßË–øÀ×ímŠ…fÝ?Ø2ùÒSëtá«iXÈ"žï†±Làøn¹ÃÚr»©d_ p3þx®«ϸk(Ê’M8$4œ@ÙÆÂR1†•ô·ÓmuÇðëñfÌ^ç©…†o\ÅüRKÎÏÌkÖsOܧâ9[¸iüš³œÃÖdoÒM›_×Êüâ'ôÏä ´S¿œjÝþXÑ!^u–ÍIfP/™Ôí+’ŠÌi5ï™×= µK(=åZÛøÍ$óT©Ùzj„~Ù»^&òg bD#ÙÄê¥õ™Gì5ÛÑe66ŒÁMì]ÓYØž&¶¶§¼ºpþ+Û¿Ì&©³éfXGûÐÖž7´mWpÏÙ‘õ·¯–înü× ‹ðKì|ëG‹ºÖ‘þ1¼Y*ë.ÇšË穼µlqÏúŸyÁïóM®®GÚáº>6·íf¬Õž6ë]V×Ê:ÇùQSØ3É~’×<¦8Æ©jïâÒ;è?õÓŽoÿó@h~÷^è‡ÌžêT–º¾w¾Ð®ÿ×Õ`§ºÇÏYö"ŸýÞ9W:V™î᯿=â6¿kØ9>÷$[=éxwæØoÊvi»ýæi¯8ß /Û©Ãß„×Ïã®Ø}'íŽO\n½gÚ É‹oºØƒNÚ¡eþ²“¯¬ç zºS…5—:Ôqõ®ø¿[Þî’< š\cÎ w3Wê;?{žSæÂubB'÷Ê#>ꈾ졟{Ü! r91©/‡±gï½ù9>æX«Âî2ß¾íyç_þîü”Õ0l*–d¿b+g¼èÓßþÛ×|Î9â˜ý¡<Õó-Ö3ýc¿ÆBk1»¿ûS5Ú»8ÀCÀôX>úÛ>Iœ¥û>ÃË»ý?÷Ã=ø«>š˜‡™¿ì›Àâ«@õ Áœ›ó 7«¿‰{Aþ[¿÷ÓÁäA$·„ë=LK–ññºÆûA <ø:¾ Ö˜±ôI=â#»ÚëþÁ%A¡kŒë;= ´Âì?SóÂÃ,Á+¼@üò»ÉBXÃŽK<„Ãè«.*¼/TÂ4¬ºµÃú3ÚƒA,\À<ìC$<Ã2ôÁCÔ„¢´FäšbrÄH”ÄI¤ÄJ´ÄKlÄóËD ü1LôÄO¶ÕxDªÅH ¬O”ÁRTÅU,Ų‚¿ú@ÅÂóÄñƒ°Å[ÄÅ\ÔÅ]äÅ^ôÅ_Æ`ÔE:¶\Œ2Ä«EaTÆeìEBÁ:š‹fôÅS¾Y¤6>«ÄëIFiäÆnôF[¤F×Ê/IÃDn:&T4‘oTÇudÇ[Ü Q3ÆìÄv¤Gp¹¾ñ5z ‹O4rAÇÈþ¨Ç€dÇp´­sÄ,¤.IÈ…dH\c<ÈŸÛÆ†äFä+ "ÑLj¬Â’RHŠôH`$HG¾ë>"›ÈDÉn¤Ž“tFLIf,½áÐÇ@ÔÃxÉ›tGWl°Bl¨“ÄÉŸlF¶`ItI üŘœŽ™DCã3Ê” ɾãC2t5Ÿlʪ\ÉxäD‰¬Ê ” ªTIšdÊ­¤È§T­‘ü@¨cÅ´T˵\ÉP$Ic˸tš¸$Km2>ºÄË´ÔÉòšÃ7|Ë£À¾K©ôÃDÄ¥”J³4ÀúªÉ8ÜHÁDLÈDDAL¤LETL;ü<žô¾Å$Î Ì¿¼²Î½5”Lo Àþ_É!iQŒ;±_k19MǼCÂ4ÄÃœÌÆd´=ÒÍVº„XM5ë5qÂâÂÐ<ËÛÃÁQ¤,*ÍMÐò$Í,dÏAT> … ¹ ‰‰PÜ>Ö¤åÀ‡ÙPóTDçÑÚlNôÌ:èÜQé|Où!J`ƒ;±™â6õ—‚ó`™¿ÿEþPæœÒQäÄ6Ó¬RØN¤Âëü?q»³›Y3‹t î¬NOC¶ìüMÍòPBŒÎ5Q-ºÓ *ÐÝÌ;%OíP=]=<,Ñó”ÎÏäÓõS7Ô\TÆT-½Ò>ÕÌ@=T)TDTFMLH5@JD5dEÀ”Ôö´Q܄ӕÓ$ÔÊiüÔ¹üÆðPÏDåºF5TTÅÒÒŒJ\]PWm6éñJa”U*½TK¥U»¬Ô==ÍU5UåóÕxÖXUL%ÕTeÕR]N+ÍÒ]ÝÒÖ|VT‘ÖÑÌÕj-×9ÅÖô$Ömm¦7uV®„Ö¹’q¥MeíVMVJåUjþDfÍV.ýÖŒ‹VoVmÍTGÍWMÝWcÕÕv]ÔJüUKUœV†5×QEWkmV:%¤Ýü"w} °ÌsÃu=Ø[½WŽ]'}/åÔ“ÍÓ„EØ…µ×b­Ùc§GåV›Õ×”M×5Ø‹åWBÕØ]D𥰮tQq8¨0BA;UŸ-Zu ÚŒ=WU}Y¡½H¥µ—ϸ õ9•íB“ÕÚ›…Ù?ÝÔÅYGù—4—ë$Â{ÓQ›ÑVÃW¤UX©½ÚkZ åK½]‘ß R%RPù4뻜KÁüëÛ:%[«ÅX¢Ý[SõWª5¢LÉ”kÒý‘•¯•°'4\‹ZžÍ[þÒYÀZÌÌZÈ Ì]!}P­ÁN¦ý»[ÔµXÖÍ]É\ÕUÛ³ýŽß£A*\5©•¤]ÐÝÛ5]”mÞ˜ÅÛÓ]ÏÕå]013…ûNù ÓrÛN>ƒZæ][³UèÅ]³uÙß-[QéBKßÒ _¤“Yç}ß~L[‡_{YßkÔ]óÝßž}^´^ùmX˜_nþu_à­Õû5àÿUÔú%`ÞPõ¾\£_FÖ&ßéE_†` F‘uܪ­ÞݵàÞÝØŸ-á¿u`°ˆÕÅÅ`±õ³YÕàœ•à^VêMa0¡×Þàòõßù}Un`v`#Þ&âˆmþâx}bpâ>_ûUb&Øb Æá+Þâ(X¶â)a&¾á±*àöâ.&c®â$nãé à8>â3_-fc.Fc¶$eᎵáö•^0ö@Bf>$îã4Öa:VcF^d=¾ã5Þãþàæ_Kb;†_IŽdGþâNd<žä^ “kÃå¥áMbÙ‘d7aWÆÚJîaK5’c$eûPQîdHÞdOÎcDæMEÖ&<»´‘Ñ3^‹=¾]C.@M¦_Nîe1†c^~æ\㙩žü5» nåfæ)ìæ:~ãP†f@ã-Ô ¯evæ"öåQ¦fw–fr~g2Bçkþ6‘á5­\.gyþfô{eoå`Öeæ!ÆÁ5w©ËнäYnèn\@~ÜXãx–¡'œNc¾3–Óæ¶ãæ€gnd‹†âþXaþåvvb•.épé–¾~åaˆ¾`Ëeg—~d˜®Cœþäq&è~^ižNi¡†gP––âyþéz6è¼ÔË©‚Øð;ºlH \¹|,vèLöé“.høa£ IK¼Š¨æ¥,–ƒ<ŠM\âv\hrUáþ㕵S îJ±FìÄ‘&k§@kl|Ç[±j…øk\¾i‘Îi“"?þ²°J¶ŽëeiÄŒL8º¢´ÂVæÆd*–iY¦éìrìþŸ|ë]öa·ÄÐÖ½<ìÍdÅ!Ææ;Ô¾ÉÑŽæÒÈÓÆlTžë±ÕjÊi¹nl¼ÆJ~ØÛ¾BÙIÕÖì­ælŠžf£¾§~jâ¾j¶oðžïÚŽopNïç^p€fmXÞn /ðæžpîî×þnúNðgfj'é¤^ï#kpzqñ~ð˜Žp ?poqÏpûÞpqqö­qNñ.ñ¥>q÷îpò Îq"_ñvn¿þqý=ò—Þñ£ò–.r)Or_r ‹rò–r-ÏrqϹoþîšðT^ªUfï/ò÷j»öò.s9oó&Ol6‡ï0›1÷ï2ÇïÖo?'s›&ðÿmBGó’ímAïsDßížhßUï-'o;7oKGoLGp:Ïs7÷î¯rN—oQgpMwqS§ñ*óuT·qJ_sR‡ð GrI—%‹ÓÖ{tUdYWqZwr<uU"ãR]w²’üs‰^tGhºŽô çnO¡o‹ÂlG¾G4e7#5'qWoua¿s`çqq7r[o4n/9ˆ#:G³³{´_þGw*'÷K¿÷LÏ÷M7ök²v¹˜Q9á”w‡w¯÷8Oø9_ø:ß÷SW÷="ºy?ºwÿw‚ÿÏ:9x&øTïøW'öRÿøq÷ísšxx_±3{¹.-¹yŸvFph7s@/t™ovi·«‰?¹£{³·e¸¦Ý o§÷‘Owj§p˜7ð†ïô~—qP/z¤·p£gq¥/v¢·÷’ŸôŸu©¯u®vs‡r°çr¦óy±¯t«Wxµgx¶wx¬wp­v¯/wªyºÇw¼×w¸Wr˜•ÂòÛõ´×{~ßjÀ×h“»{¨¯v»ßzC÷lÅžÖtŒ¸0{’GzÀ/™d{ÆŸ{þÈŸúˆ_õEËèû44ã4ÎkËz›4¥ùDÏ£&¬Î ÄÓ >w·_zÛ¯z¾·r“<é–¿=Qˆ‡aP„þ_yu?sCžóë|›ô3ïõ4¯ëMͺAó“[Fá\>{ćôgϺÿ›´Ü1}Ú½ýÁ‡xõ÷xÝý°ºçæ©ÛîRî—0‰ÿÖŸ~XÊÀ6üu?.:$8°àA„;QY˜Ð Ã…>œñ"Ä‚ 1ZäX‘¢D7fThòdG”G†ä˜òåË•(_’„)ReË™7Jìéó'P‰5e–,JÔæH?~ \ÚIéS“K]8}zp*T¦.¬þ:±jS.wÆ\X³¬ÇœEÑ¢ª©Ø¸E½FEèT)ȪWá®}è6-`œyfkôíÑ¿‚|–,ä±’5Nî[™/Í š7ûTܘ±aÃT–B•ôɬOUŸfªº¢R§£Kƒ51nǹAG–Kزï£Â»ÆÆZzµÕˆÅïbN|yxáŸïþ\ÔsèÞÀ¯WÏNeðîÚ3s.¿ûxèŒGGÿΘkTôî­‹?ß;åðíõœÎŸþxòý‡wûm×Ü[¨žuþ-hŸo "h yæYØÙ}éUÇoº[(„R(!ƒV ˆ¢Xâ„!R˜b€-ÆØ Œþ4^öâŒ^ø£P6êØVŽE‚gb‡ÿ9x£ŠÎ(¤YF&é"”=æ7%“5>¹eXI%—Y äþ²ðÇ3ï{óÏ;o5Ûxc=ÖKZ¯âòÒÏføÝ'±ç¦|ù×»MýŸí—ìýôŸsï>ðøëOpýêgO{ên„¼ó¹í{ß"I:’ƒ# ŒRïg˜¶%‚‰ õ(x *Ä‚‘Á óè·¾ÉA"ü_„Jˆ3²O…º! Päw@‚€0‚ÜßN4X½…è0ƒÒ¹¡öÈçA%Ðz'ÄáŽ\ø5JN†þC"ù”ˆ#þĉJêÄkˆE .І "9XŠ‘ bHÑÒE4n‘†m¤¡»hÁ4nñŒg¬ãD¾¨C‹è± Ò¡+Dh4múBšT‚dh5 :E- Sþ¥Þ¢=ïxÊ‘†Ò¤eñbSa Rn>Лm¬¥EéÏ}v°ˆÅüã(]ÚQ˜:uœ3ÅiM*>ž^R§KDkOXI æO®Ë´gS·)È}šô!¼èI˘ÆDr4#*bñ¸ÔaÒò®T$Q:OCÒ1ŠUìcAiÌÁæu­pm«ZÍ'TðtEð‹+@wJW+Þ•­-äJC;ÅÿV$tël?ûZÙÎ/µ»õéO ZàÎuµ¥Í›k#çÎâöˆÞ©­YtÜí ÷·v}æhíwÝkf7‰¸$]wØÝi1¡Äm­n•;Ý÷•7§¼ýizIûÝLÆW»¾Í-PY‹ÝäÊ÷½þÁmoZÏ»ßúz׿ŭ®zç;&÷WÀÜ ¯~Là*˜¼¥ðMlßñTÃvp†ŒZ›–¡V­‡)l`ô¦L+p‹oûb ÇØI3ñ…×›¿üê¸y5–n…;,âánÇA/éûãgݼv1ˆQlâ;wÈУJZ–ãºÀwÉWn²’­œà£XÌ .r™s|däwÍÔ5³v;\=JÎ0†ó‡ÑüV/TÏøÅ³Š£¼g@CÙÏNæ±›Ù{aŽ‘f*l²ÍmìâY>óÄl¦4› f5“yМ4~§œèZÆM¹ –µ–Œ-4Éyó‚KmcPZÖ@þîôŸ?­é‹×µ^tlRm•¡ekÒ¶f²¥ß¬kX[øÈ'ö´³©Þº2[È¥­ ¶gRlѺ:лn¶¯3]mÓûËÉVt´Gíã^ÓzÓG~UP½êyÄÎ4.wŸÇ}i|WºÛÖNw¸c½ìsï˜ÝßþwÀ)F,'Ø[¾JïzKð|O¼Ê|v®Þnküà%¦&ÆÝq}+{ä'9²ýMî«|ß,òÇ5rw'œÚ'Ÿx¿aîr“·¼ä5G²Î}¾ñ öü}G9©_Îg‹;sæÿ¹ÓÁ=t›=é<ºÑA.í‰ÃgËÅË$•s¢¯Gp*XÙ¹usWÝÇüþ÷Í!¼õª;zq£3š±cItùÚ{›¶¢»ùýWö62Ôç¾vŠ·}€0Œ:Â]wÇÝýïZÝu‡¢w@-¬l¯ÚÙÏö¯Ã§ùêKG:ãïxB~å:…Så9w©©-mêü¡¾›¦Î[éøfú‹[é£Ç}í“[ì‡éíŒ÷mç¼ÝÔ¾|¢«õcÿý´k}‚¿ð—#½Ê)ç}Å-ú6ë½é·ÿ|¸7>ûºŸ»Žüä· ü0¿óËo¹Ñ£?ñê¾€½_ÖÉœâMŸ×}]ìàûEÎ×)àðàNÿÑžZÿýÜðiÝÿYßžžR®ó¡f^þ¾]¢Y üÛºïIÑBS ÆàÍ ž`ûM› v ÕUj Þ ªŸþá ‚à¡–à 6—öàa:áî B!¦ íí\ná ’˜J!*á!–aj¡Çq¡2aú‘¡š!®Ñ ¥¡ Nẟvá~aøíaf`¢Ç¥!ñå " *"2â b"Bb›© ºñ¡>¡‚â”6a¢$ªá%‚"%R` –¢ ¾áÆa'ªâ'Ê](Þᮢf¢Ÿm"õ´¢%¢ ,Úâ}­Þùèâ)za%cc!:âý)cŒ"þ¢".¶—0&c,z¢&bâ4.b(â²"3–Z66b5ºâ5’"1Ü3žc*î""zã8²c7Öb8>"4êá;ã(Fb=šã1š"5î£>ª#0&Ï<.ã=þ£@bã7^ÜB6]b¤¬ˆò¢5Þ¢B¤6¤;²$PeÅH¶HLJBöã:–d;^¤JŠ£Kö¢3jRº<šëD…–AZ×õN¿°aMæcK&$?2¥NöäIþ¢ûd¤ÝÆiÀq°šk؆ëUdú$GÊàXÖ`YÖáC>#kÀV6ZWÆ XxÞÓád<ŠåNÒþ£S¤MF#y$ºFÆ@ žÀ䩦aÚ…×ÜäRš$9¢äS2&XÂaTæ%]f`¾%Wâ…ef[~%]Z¤]JecRåcædhRf~Ê¥ô ae£±&ž(åJ¢æiîeJŠfdÒbmB%7vDg"_&n~fXN¥P§yÙfiÆco fPÊrºmgrEg€)§^Bån¢`sJævš&u¦—uŽxŽæqÞ&jv§n†'p¢'v6å{Nf|~'s~京S@\¡›Äe'd§w²§˜'‘i§€ÖË@žNM¬I]\å\ØEèzšguº§R¨xZ(wª¥iä'Qêg¶þI}‚æÂ Z×…ææ+Â'ob £¡´ìÅWDvÙˆ'†¶çr’hލ†æ¤¨½èqx(àÐ(„’äb–§Š–£*©„®¨|¶(Ê ªIÊG¼æsÞY‰BçÖå–ÞωŽÙtö(‚Ve£` ‘Ö™¤‰è—žU”þg’z)™šh—Z¤‰iÙ¼Áæ¶éO˜žYŠ>)“²(œÎæ|¶i«Mâ˜.©c6©œ**i2*:êy.á]äpÆi¤ê¢ ª“bjª'”Þh€Î)—î(ŽJj…šªd2¶ª«¾*¬Æª¬Î*­Öª­Þ*®æª®î*]PÓøÑ°«°+±«±+²&+þ²ö*P*«³>+´F«´N+µV«µrδýêµn+·v«·~+¸†ëÝ1+i«¸ž+º¦«º®+»&+¹Â¹¶«¼Î+½Ö«½Þ먼+Å+¾ö«¿þ+Àl°êëùð«À,Â&¬Â.lýe+Ã>,ÄF¬Ä>,Á&¯^,Æf¬Æn,Çv¬Ç~,ÈÚ*¥^*¡þ©§Ž*ªf¨ªNhÊê(,’,O&ª¦>*§6êÌN*¤~j:*©‚ižêͦj΢lЪìËJžZ)ÒĬpYW”ì Æ,϶¬®l¨ê¤jŒ0(W‹¶Ì$rH­ÉBm§’­Íž,Ë­Ë"ªí0‡‘ÖÓ²e]HþÅÜZªÌ¢íÕö¬›ŠjÚâm Š¢ÙaJ¼¨©ª!ÍÁ˜m¦úí¦¾iÙŠmÔâe|jípÄåàÎEƒ" â­âÒ,ãžmæíæâ,ÛæHéÐèÒ>­–®ã6.äŽíêzîë&îçÒ¢äbîÓ¦i½¡©á†íî6ãYrâïæbðJãðö¥K้֮•.¤!ËVÂeë>®ÝN­ÚVíÐöíìB)ò mÍÊnìjnöþ-ßæ-Õ–éÈÞmø.îøŠ/Ö²©ÞjçÚéκnô²îôÒïýJ¯ïVêþïüRHȰ0°ïªÕþíöÎÅÄ6°?ðÀ&ðâ.°ùA°_0G_÷êì_þÁf0‡°Ä)Cú%៧° ¯0 ;¤ ?ž|ð Ï0 ×k gä ³^ ×0÷0ÄÞðFæp0î°±,w¤ÿv0Ò±?1½&1Y 1AÆð_1g±oñK0çR°õn0è¦/箯ú¶/Ÿþìªþ¯ýö/ú~ïÃ1öÊ1ùV¯ù-õ†.÷Æ/øÒ1û¾oê±ÑŽ®þŠä¬å1S óâ§é¦îî"K–úi!—0ÌÖo}21"OD¦ž÷Zr‹…Ò4܃ª‹E$¦$·18¯p¦'îêåòªfr¤œ+ço·aS4ŒKኅ)o*Sò{2Ÿ0þG®Im`JªÉßõÅ113š.I¼hîºm_dŽ·á¯gò3Ón+wòa0²ÜÎè,³]-o3¬ÕTLsL ó‡ï0Ûò9§2+èXâ'V"æDn`wó{éÅ]°3E`é¾Èßuj3=W²<Ë/&#t‘ªó°©Ë!;´ ûÚž®Z‡’óî¤ðòoBÇ3:ohCO²îNÞ©9‘š38‡4-²àê©DÈ%ôJ'7/t?Ûôt0ÇÅñò< sM³ôOW4Htä~óM‡Fl’çPã°B õJ5E;5+ëtSñSK5ISuPkõNsµ”³G? Áö—/z±èîW?Ågïuhÿõh‡Îk×¶aÇ6lKLc]cuQǵHWöoKŠmãµ(v®·r#vœ ·aÒÆ›¼%t»Fi÷¶7X÷\[6q/7nëõlËVg/·r7bëvuswv·öuµUGõe{·f‹6Z“7y›·q£÷µšö²û¢v©âñT»¶|ÌfãÚxÛwmã7`ë·µòw£qб7¿wR#Ë}þÏ·l×·‚7ƒÛux3Énû „¯¶G¸§ñùÂõíPŠZ‚#ðÁ؉nc±uO±zû¶{ 7‹¯÷U·÷€ùVëxãxUóx‘›å+yŽ 9{y¹vëð’£e•ï•wt“Cy’[ù#ù;ùsy˜“ù“39vK9"µ3ãôûóiÛqj_/d'òƒñSxûq¸ÏªöŸøjãùœëyœGvOö›»ùžÃù³ù¢Cõ…÷™{yš‹9|¿µ\Sù–£y”cú¤kz™{z—cù—o÷¥›ù˜“ú¨[ú§«z¦û8Cƒy¥›zª³z­kù­»z©ëúŽ£ú«ãúþªóz«Ûz°{®o=NAJz›;{¤{õ°{¯+û©sú®S{±ûzµÃó±k{²{û¦q–[{¶sû¶›û·£{¸¯ò¯cûº«{·»û¼'g½Óô½ô”“{§#û´³û¿Ë{º‹ûÀÓû¾W±CeéÒËó2ú¡Ûù +z£;|ŸËy€¯H¢•Âg….'fïH{¬«yÀ|»Û{Á›üšet;ÒÆËFØ z K¸ÊüÑüÁ|ij*±ô /e¬€hAGÇ ѯ ¤Õ­¾—<¾ŸüÒ+}Ò¼Á§ü «ftwfkZætLJíZffaònÓC=Ê‹}؇<¨?;ÈóvgþeFX}¶à©q¨ÄÖo&ï^ýʽÙÃz¨ËúÞ‹|Þ û¬¯½[úf×~½ÑYÜk½ËÓ}ׇäÏ“<Ù?ýßûûäƒ{ä3uàïkÕo¾W~<Ö'~;»%ãÇeW*<æ÷ýÙG;¥_~2½ä«=ëåÏær ´#ç…Rt<`ÊIk>~Ô³>Šºþé£ýêW>Àg>¿_:Ý—=êë=ñ‹ºÓ¿êCÿ%Óú˜güë??ßk¿ß7?à{?åÃ~òÇ;ä¿ÀGë£𫿘¾ûøç»ôO<´ËÚsêÓñ‹?Âsw÷íÄÇß@trщ Á",(p!C… :$H¥aĈ1b¼hþ±âBŠAfä‘dIƒ;†Ô˜ò¤I‘(UŽ ¹ÑåÊ‚g²|³fDœ;[ætI3äO›B‘Úé'Q¥G•:Åh´aU«W±6Õ)•ëV˜IúYzQ,ÏNbµõª–íĵ`eFÕ™nO»EßÊm«¯Ù§q¡B5 ˜ðÝ¿_Çæ w°áÄ{§:î ™1VË—-Óå»y±K*býˆÚÏè³¥O‡.:!é…eŸºfêÚhÑ©'×í«û°ß¥š;ûÎÍTqaás%O~Sùqʈ‡ï­´±sÞ¿—_Ns÷¬Ù9§®úlDÛËÞ^Í6lŒ¨ÏÆG_;}íÕͧG~n=<þtü“ª.¿èÄ#Ž?é4P»ÿ¤®@=cPÂ|0/î¼Ëпý¼°½Ñ\ƒí õæ[M6ù”‚Ï6Òì›4òÜKÀl¼/œ0ÆÝh´PFûóÍÁ}t‹Ã²Bð0ÔPC%;<Ò§ÛCqÄ÷®4 ½šds¯ÅòDR01‹¤ŽÈ3yÄQJä–lÓÌ5áäB7õÛ1Èü D’¿&ô.Ï9£œˆ¼ÒÒí!Ñ>Ü’¾ûB‚oK„¨¤s;2Ñ42Ð;œP=-åÔSŸ(¥óÏPß´SM9IÍ´ÏU™“ÈÏNcH5Cƒ‚ñÄYу‘,ò>SíKÔXLÔ81µÑUb5þ–ÍKOÝ,YbÚʦ­TÁO_e•UiMeÌKk‡SñÚMÉE¬Ùs‡e¶Ì1«ÜlÛUwÃn™TöHn‹ÍQÛ>ñE׳oK¶~×¥–^wηՃå][dí½Žàwöá†1®sß 'NøY†±K¸Ù–˜b;I¶Ï“K¾VeO;Î8Ý–_ŽùáN7îÎær+¾ì—Ÿúç…€)Ú裑NÚh:eiÚé§¡ŽÚéŠ ¶vgxAÞôjˆã…™å‘#Ætk”s~òë2ù¬Jèµ!Zé·ßfZê¹ç¦úì$ïÞ3ìhó¾4媅ì[Õ®µ|Ò²ý4\_ïØÚm¸!_:cºþ)‡Ún‘ »å¿×lÂÿóí½3WüGÄu6=@Ì^l<è#˜i¯ÝvÒ*Ï]–Ëe]ugIÇózA¿÷wv³ö}x½QÇLtâw}è‚d\nÝéæýf±7˜fÀ;å™ìâM^Þïà7ðæ3ëžÂ襼z¥¯Ç^jíÅç^ýÓ7~ÿÅ¿g5÷¥ |^ûßéØ÷®.CÒ›Aæ·úÙÏr8+`á<òé¯w\ë_ù:8¾rp{ŸKàUžÇ<ø¹N~<Ú)85 0|è+U/VÂÑmoD3–Âó…4ÔØË0ÂÍÙ0dJ4! èÄް‡R„þ“¨Ã+q^X •gEzÑb"KçCﱌZ#AèÆ3r±‹pÔ …gÆõ‘1Žù{¢«(Ç=2zäIèÇ)ÒÑaŠÜâÃ(ÈC2’ü"$ÛèÈ7b²Lœ%ÓgÈ/2Rˆƒäd"=i®SR“såÊÔø>D²2•øcb)'IJ#~r•…´$géËVšÒˆ¸¼d1w©JdÆ2Mºdæ _ÙÄ_2¡œæƒYÉaN²—Ú¬å Ÿ9®oºÌ™¢f4eNjfÓšÛËIÐ~*T¢²4(ªøiц¦³¢¤èCºÑ‚´ %éDá™L[f´‘õ§ÆNªÑº”¥ÿì(4MJÓjÚ4¦Mi8y9ÓšQ¤Õ);yzT}â3¤BÝ)QŠT¨þt¡(­j‹ Ϋ¶t¨ŸÌiW•IÕ›Nu«5ëJŸÊT†Fõ¢.Ëê {ŠS:ªÕªc¥«LÅW²ÚU¥Zå+PÃZÖ}>Õ«sí«[ÙúV{êñ®>lc¡ùV˜*U²3Óka¹Ù½êU³AÍ+eû»Å ²³ý«`1KÄ<ÁÈŽ!yÆØÃŽv˜¥E«TmëWÎÎö¥–UêW[Y•åA¼ŠÕ{þ„[[Þž£„5ín{Ûh江e.9 ëª×JƸ۵®s¥ÛPêÒ6Uãí-VE{^®‚gŒ¤Ýˆne« ä½±ZTŠ^äÚùæª=󭂸\ö´ߕªg+àô·tÔyŽáƒè$¾ÒDº[(mø4÷em/ûÜ[*¸­“½.y»fÞëšxÀic߃+_³æ¸¾¯F2œ+ǘPÎaˆÃÛ9W½D1ÈT<`/¸gÖ0Œueo×Âa‚TYôe 꿎ŠâX|Z0‹x¨IfrsÏ\ÝG·½N”·œ+ ?øD™„e,å#yÈ¡5²zÍþÚb@6ÍG†¢™õyáÔj¾毭\áÐd9Vµãq— ˆh"¯·ÐƒÖ´Ÿj蚑ؽ‘Æ¢¢#Ë]˜Íj3u;âV‹:Ó}6p[]ÜÐÑÎzÌ'põÓ¶þ÷Á{éŸüå7ÿùÑŸ~õ‡Ÿýí¯·ícÏlþõµŸþßWÿýñŸýïŸÿý÷ÿÿpúêo™oƒXqðvp°ð!0%p)ðþÐvÞ®”.ps¯=ðA0E9°-m„°lºOåL°Cca0+Ð[ðý¦‹ðäøF¯öl‚MPíÇKûÔnø$îí‚ù\ï—ð¤„oïR¯øtðørNèŠö¦ðò¶øHOö˜Ð[ ³/âÊ ¯ …OÝxP¼ÞPȺpóL ã0ÚâèèÄðÖ£àïQ ÏPåÆP ÑçP¯Þ+QhnÑÜÃ=ŽîÃ,ªôNeà(læj[Cåþp ½ó 1 ÑO‹PúÐW¬dÇZâå J y&=…VèƒÆâƒkQ¿P IQûr Ë®Û”Žæ`nÑ®Ä+¬s[o bQ$EpGñu‘}ч¸d±èœÑ#¬¤\QBú‹¸ î5äýQ¹1ë°EÑÙ´Ñ»HdK`Q-L-µ2\±è¸Îÿð=ØQëà±ÙP ÍÐ «îü±k±×V"Í… QÛíY+ËëÑm2 ¯ÍK.RV2òaQKÀ17…]ØpÃg¬×àp ñG‘Ì.’t2œq=/XRrþω"#¯ ¥Q)Ûq'[K —Ò)O)sf?Ï2 ›0á$srûØÇ*»+?±ŸPùn'¯ò'Ë280Ðæ² ™’ ßí,uí²÷Hr+’#²v¤2û²ÜòÒù€01)ð0w¯#Õr,w…v¤O0(.Ž1ïR15s39ÿ03÷¶§'ËÈvø©rclf;s5Y³5] °ê^d!’0í3Åï5us7[7o'4Å4÷Ï4‘P,Ó².}óys9Ç/9OÏó83B8¡2õ‘û<’´lÍ9%s¹Ó&YF4;©0C’$¨ói(3 ,!C‘+¥sþ#¾“6:‘,ýR$³2%Þr‹ÖS+2*ïùÒ?ÛÒ>4òöó´)ÿs/ûSA T.¥2<‹3;ÕÑ+×Ò=oÒB!CçS@wêëÈDÛ“‡‚_"…«Î|’CñPCß,›Ç8‡ÑŒ.ˆLñQP‘U±5P’´>“2B=fB£Ó<îƒJd2ãŒ<¿’¥‚Ñ\«{ À^ÂGÇsHy‘K˳ ?”A‹…VQçîF ”H‡#Ñâ>´ìQ$L– ôBëtC¿0LyRÛM\0QD=§1¦æ±Mý±Ï‘K(F3”>»´õô)×Dî¦ìÊN„Àîþ4Fù‰!Ï'êìÀ³K.S•-Õ´ ­ÐQ·Bg¥æDM‹4GÏÅ$û4H9N%UHôTu./R§ò?ª$æêëL1ÕK£”ŠNô!»„µ4’ѼkKwõQqôAQX%´]R˜\ô#U5Y§õKQÕW Ô6Ã2dãìHµC»U;“”]×õE[4^.Õ—8’DÝ2Twî«5Ko'Ø^‘ÕN¥‘^•ˆÖp§iä3”ü@‘0Ññ’èaw?ñKbÓ:½)^½ÕT©õWÍõ_Ãåaç†E#D9VA»3)oTvúúMË/`Ÿ´`ñg5õ`G6M»bas‡(þ‹Âd¡ÆF•PcÍÏÒ„h'¶¡hsòÆÕH*!µgc5?b–‚$q5(G¸ìhýï^_ãk¿¦eI_ÏÕ`×6g¯Ö%Ûõ¿°GhÇccÝik6ì–Önçiÿ/j“c5n“ø8‰ek'vNA%fµ´Wë2†N°twfÏs2m‡£@V\!WVƒ5)´"€¶aÿÉb%R_Go'7ŒLwHý¶h9–ž<Ö]V^=k!ÔMÈÖšòUL÷eûµw÷ô9pO`¿•mI–s÷póG™™Íx—:—éC§9så˜×\9ZS¡97.z¢c—g›99ÙwI9¥×"?3IY49ÌL™¦á$£òƒù‘7Z¡ÉÙ£¹Žù”…©QZPCxñø¸y+¦“š§—z”ŸZ„SÕ¨Åx’úy™£‡:‘»ºŒ‘°¬Íú¬Ñ:­Õz­Ùº­Ýú­á:®åz®éº®íú®ñ:¯õz¯ùº¯ýú¯;°{° »° û°;±{±»±û±!;²%{²)»²-û²1;³5{³9»³=û³A;´E{´I»´Mû´Q;µU{µY»µ]ûµa;¶e{¶i»¶mû¶q;·u{·y»·}û·;¸…{¸‰»¸û¸‘;¹•{¹™»¹û¹¡;º¥{º©»º­ûº±;»µ{»¹{°;Bio-Graphics-2.39/t/data/t2/version19.gif000444001750001750 5352312366325116 20116 0ustar00lsteinlstein000000000000GIF87a€ÑçÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔÿÿÿàÿÿÓÓÓÿ€€@àÐÿ€ÿÿÿªªÿUUÿÿ,€Ñþ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏdƒVô@Ó§G—VÍZ ê_¢[ÿz=[víÔ²i¿Žíz5îß·ë–Í»7ðàÈ‘?¾Ûöë寅ûŽ{zòçÖ¡_'X\»÷ìàþW^znëÝËSÿ~^¼zòíÍOý{ìîOÒ—o¿>|ãáÇßýÍçÜÌ!H]€ n—àƒ6ÈÞ€Vç_…fØ„R§!q÷Ib~bh¢ˆ$¨â‡î·â‰nhÒ~Âc‰(FxaŽ/rÇ#‹8¸cŒ#êä‘&)cDi¤’EB™"RRèc“Vbia–HN¸à7V¹eIÁÔX#jg‚É#ƒZR©‹nF¹dœN& g˜^Èf—r¢§f›î)&BòY§—‚执Ÿ€þùåI5 é¡}N¹(¥ 6ªé£\掊™h¥‚º©¨¤2‰¤©†v:ç¥þ®2Úªª¨B* nf¢é­fFJZ¯°ŽI(­o†ªh¦±bZ¨§Æ^™ì³œ2{ê«ÍÖɪ´³Žª,­×«åx#•™ë@iþ’æ®·šk㤓f›ê°Èuûn ó†*ï¶zÖ{ê½Ðæ‹o°ñV ­¶ý~*0±Î’Inºêšv.¯é>Œ°¥SÉïÄüŒ1·«1¼O›êLJ<+ÈÈnŒrŠÞžL¯~ /¬+»Û(óšúºœpËØü¯½ãüó¾A›sϯ­ÒHí®­’2\n¹QG ÍB ´ÈÛ’ìô˜<‡0Ó<']rÊdGiöÁ^s½¬Ø]£$îýFuÃêR]«þÖD»½qÛ:·ø5¢G—=¸z€÷\¬ßÃ&÷Û…#.7‚§M1ã&+>räÖ^ŸãG¯í7èC?ùøßœ—êyÆ'ùáúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüì&=/ýôÔWoýõØg¯ýöÜwï}ðÑû1Ìøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  H>×…€L ÈÀ:ðŒ 'HAù°$®« 7ÈÁzðƒ ¡GX¾ ’$ƒ$L¡ WȺð…0´Ÿ G‚ÂÚð†8Ì¡wÈÃøÍP$þ5졇HÄ"ñˆüaH‚ˆÄ&:ñ‰PŒâ•’ïYñŠXÌ¢·ÈÅ.zñ‹´ ÇHÆ2šñŒhL£‰3ÌeMegcYêTD:¾™nŽþ²cÓÜh´Òí1p€ô™ ÇǧÍÈQkL¤"ÉÈFNÏ-óâ!7åÈJZò’˜Ì¤ Y$I*Œ’â“¢(GIÊRc†q$+˜ƒLR•¡4¥,gIK¢ruÑY%[ùJlé²–À ¦0;xËBvè—äå'a9Ìf:ó™,f #Ë *“$¢û2¡ÉÍnz“~ÒÔœ“¶ Ák† ‘Õü¦:×ÉÎô…ót@"çÍ)’lʳøþ̧0߉GÔܳô ‰=5IЂô Vää8»ØKj"ô¡¨DÙ8ÈN2t™âX?”ÍŒ +•ôhã6*8cN¡ª3©äPÊ1•~nr.eK-†Ë<ÂqkÓÜÜL3O‘tU5}YE;S:Â4§qÛ)GƒŠ6©UjI¡Š:©µ¨6µ\J©:Ò6rÕ§VµS—¥Õ–~õe¥)V…zÓ¾µCݪHÁÚП ²­G²YÊzŠV§ªm¬K«^3®^1L­o5$^CÊW¸.ö©sEë9×ÚÔ¢éí®UlZyjWjg°µ‘ÚhËÙ°z6±b¥,YýJTÔž´®¦þ[˜D+µ«Ë\æZœkWW³FVK†™BË+ ö°ˆý­fY+×Ìîí±UíÒ&»Û—ŠW’"š„+)Ý*÷¹›]ªt}1íÖL°¯Ani{›UæúÖ¹¯…nk¿_lö®qmw³ËÝÜÊŠ¾¼•os;ë#©«¶ÁÍ.š ߇wª¶.{×+`£z5Â2•~ÏušC.¶—«î‡'LœãŽV»¬Iׂ£+b “ –p…“ã c´Æ.&v…[\Ò¢x¯1†£…c!—´çU ÃÆØ ?éÁWmq{ïÛÑÓ«ž÷=m’D»`îÈ ~²{iìä¼ùj¸¿*®þ’ë†[—¹Ž‹­²N_å!g•ºvfëÊnåæ0”ÊY–- Ç«å"/ÉЕ¯œ“ [:ã`Ãm²ŸáÌ´EGÕÑÞEôj-e=™ÂPÆ/ž5X¯5¹[]÷P;U_Ô—Éó3f|PFßøÍ«oçêííÚv½Þb‚ÆõkãùÙ°ÈnW¨ýiP[ۗЂ†ëˆAíj[ûÚØ–æ´±MípjuÛÜ·¸ÇÍmmûAÜÞfî?hÂô¶+ÒÁY7ûøI©d'{ÖöN°ºÓÉCzÛøÙNô‘ÀMîroò7¿vº–ð‚;ÜáæF÷ÁE,o¶»nø!¶6ù]?S'ßl~oyþ@ò*Uœ…¿3–¡-dè4üáĈx¸î¶—Ãüæ Ÿx¼Ï=s×øä4 ¼W4\ £ï–$×xœ;–tÄè)L¹žGë…âÜÚ®³·Íc{Ýë[¿úͳžì­ÓªP`Ö'Œ´—°ë&5ØHŠl·‹Pêh£ú¤-*önûüé<7¸«ûNx¿³Zâ5«šm«†·3'¾ñmçøÛmÑýáݘ–ƘÝCxùé®<à›–và¯.sÁÇ4ì…'wé³ýw”nÞ”_¨å[ú;†ùõ켨?Ÿgsô8_}Οz± ë´0îù{.½^÷ÎÍ<¡–OÌä×WöÀ)þšËVŸž{Åã÷¹JäÉúдnö¥o½÷…êáÞ§8øáÏëñ –æÏ>˜õ¿ñ‚:û3æiœÖ{¡W{s×~üGdU—€³†€(^8'¸lÚG€¶—€”RÒGWc Øu&w…fW(Y¼'‚(w%èX¸ øhˆ‚-G‚6ƒaµ‚š5Ÿæ{*Xƒbƒs¤F,÷ƒŠæƒV„C(,:ˆKˆSƒHØbB)HƒIØ„nõ„x‚Ø‚#ö‚#xƒ¸D}I4q2H„ˆƒàµƒ耧…U(†WXf Ø[d8@͆qèhjX_l‚]¸„E……Ô‡ö‡þ©%…’Byè…G˜†FHˆ’†G‡6ȇ‘H‡èÇRw¨vfØ…ˆ˜i „n(ˆ-&‰}F‰ç·3A¸ˆ¹÷‰nŠÿu†ø„†(coH‹¨Èb–ˆ†¶8†®èA(‹—ø‚·øoÄø…Žxe•‰«(G±HŠvŒÕ7‡ÏxzXŒ¡vŒ9–‹£…½X‹=XTSŽ»8_º¨‰¬XŠ\à˜Ž×x€ÓˆFÖÈ€›¨Šö¸ŽøÈ~ûèˆu˜¾8ŽT¨ˆÈSöŽß‰õÈ)ŽV8ùæ¨ŽÐØÉ¨€î¨©„íh‘ÒØç8`ù‹ é÷’‰ËX‰ð˜‰’ñhþˆ#)“ÎØh0é’*y‘!)r5)‘-Ùÿ¸’8Y’¦8d?IfA)‡¹” æ“));I”'i”:‰•V©Ui’\©•^ù’`y‘E)•Gù”,™$‰–gy“ö§‘6t]•¡·j«æZ¨è:®ÙZ®Û}'&]êõº\éZaë*Š:±ê®ô‰­êú˜h¦i¦zs5Î6ªÿªñê±íú­]I± Ûžë1›]ú•þ¦ë· ÑJ²Ó ¬K¬ñj²eÕ°èq`æuHÖ± ›³Ú ®²Aë^ÈúÝêa…`=ë!?û²"»¯Ôú°~´´:ë‚`‰³H;•çÅ.+‹[´…°@ °û£D+³ïZ´êŸF«h»Â±¾’7_ªWøÊ0[³ðÚ¶y;²üš«J±j+® Ë·SÛ¯n*¸ë¨³‹;¯ƒû¶…ë¡úЏÜJ§å¹¶‘k¸GË6C ¹;³Ö:™\ë¹­ùu¨›ºË*2M‡‘¢º$WoöÆ3° re;¹>Z¹€ëX‹²ÂP À¼Â;¼Ä[¼Æ{¼Â›°âuñѺuò»È½Ã«¼3ƒ¦þwoH½Ò»½Ô{ˆ;:Ÿ»µ™K¸¿X#Û{¾è{¼>Öº;¨I÷qé½Çeo7•oé¿ÈÛ½¸x¸V«G½+°iëhæ‹¿Œ¾Øk³§šl\¼ŠUȶÀÄ«¿Èø½T•µÊ¸¥Íè¸Æ8ÀÜÁÓ‹¶´¢½,Á/(ÂL‰»äª»ŒË»Š+¥ìÁ' ÂTbŒˆhà ŒÃ€¹¹”Û¬˜›Áz+‘1,ÃÌÃþÚ3:\ÀHŒZK|Ä·‹À?Ü·„Yºà뛵›ÅôËÂ!¬ÅÖk›^üÅxË¿\µ-ÜÿËÅ¢{®~kÆ ëÆkœÄU<¾’+Ź ÄL³m¬ÇTËÇ¿)Äþ{<º},È–Û¾CìÃwLÅœ¬yLÈý»tÌÆƒ,É… ±¤Êȇºš«Éä›^G7«K eìÇ\iAŒÉLÉ¥¬/ Z¿B. ”£ìȳ¬ÊgÌiŒÇ™ Ç9©s·¶abèXÉWû¤|ˑˊ¼ÊNåÕ]IöYéÅ‹“,ÇÄ쿧ܸ»|ÌoÌÍ+i`¹‚`5 Å”µlÍÌœ…s ÈÕœ¸‘ŒÎ(Ìd»_¸rª©ØÍ´ŒÏ¶\²t̹f{²4Ü˵‹[„5‰ú Ï íÎ×ÚÏSLÆ }¹IèË} ÌöÊ.Ç Ê -¾ì|ͼÍù¬Ñ-ÒûLÒ†LþºÈÒ–lҽɼÜÉl;ÅV\Áá+ÓÞ¬Ó#ÍÓ'íÓ1=±+½ÂºÌÑM‹aœÔ[|·%J=t²¨º ùÔTíŦ›•@}Ô mÊmÄ^ ¼„Zr6JOŒ¿MœR=bª{:eýÕn¿‘ú²7íQìºÒHýÖ2\3ú5êÕ »ÖÍ%i ¿z}Ø\Îx;×½Ð4ÈsÔÖˆ-¿s»#½Øô»·sr“ÝÙÒÊàÅØÌºÌç¬ÕÇæÙPH’mÀŽ]T«Úo­lùê¶þ¬Â«Æ½ ÛñK¨¯ Ø­Ýb¯­Û{ݧÿ7Ô·]Ôí\ÒáÜÂÍÛ!ìÛ¸KÌþ-ÜLìܳ-¯.]ÌïlÚ XÕT}*UýÛCæÝäº] ÀwýÒF­ÜÉ×[ÍÊÛÍÞ‹¬ÍëíÞé\ˆÆÜÓÍÉu¬Ù‰,ÚQìßDMÚé­Ý0ÍÝŽÍ—Lßí­Þ nàõíàï=Ø÷ьʮà.ß~ÏÙ­ááëŒá®Î%ŽßñmߥÍá+®âüüÑNÍ'náû=Óý]Ó,MÁt-›-.á1>Ì?.’=.â3îáÎàE.ãA.Ë Ò!âîä#ŽäKnÎMÎÕîâ.åIäȬÊÜÒYÍâWßYîãCåóíÂ)ŽæeNáiÎåU•5¾ÓB ãqŽåO.çþynæ{®çQèkŽÆùýÓu®ß7ÙÇMà[.è»KèmNäsž—îç•çonâŽË…Ô‰ÎßµmÇ.æ‡nè7kÜgÝŸnã¡.à‹Nê«n秎癎âg.é}Žéné].ä/®«ÖýiÎ]×eYêžÞê8>ê:ÞØªÎ·áìÆŽà»®ëc®åÕîæÓ®é_žeR¦4êªí²ðön Š©ÄmÛ©ŽÜ½ÎäÙnëÎ뛞ÌMÖ-·óLÎHzÐý•¦ÂÐíôŒîÝì½ì£ ëÈ®èéŽMv¯vrÛõÊfv©ê>é¦Yë4ëˆ~ð nÓõ4¶üÅ_qMΡåþ_õÞ²[rî¢þêàÉÎòÿ,´âýß_^cJ¶#¯+¯¬©û>ñµÕòR ôU%ð9óçMôþìÞ¾cãÊaZ5|òOZÙ/óHóUôŸëÚþëTþ,*ï‡BÝ?ðFÕ[ñF~ç$®,aï½gÅWŸðe_ôYöŒ~äl~ëjnñ¢¬öJÎõî~é]ïѨ¬^ÒíµFˆøã¥¼ŽÈøèø’Ÿø”Ÿe “´{¯Ø–ÿ–•ïÚŠ?Ñ¡¿‘ÿ„ŸÜ£‡é¢ù®ò-õ¯û±dô˵ûò,õ´oû¼?û}ûºÿû½ïûßûÄßû»ûÀŸü²oüÎþ¿ü¯üÅüÇüÓýÒŸýÕ¿ýÏýÍýàüÑÿýâþÖ_þèþä¯ýÌÏüLÆúœ>òÜOýݯþóïýí?þõ¿þüŸÿø¯ÿñK @a4ˆ Áƒ >\±¡D…-NX±"FŽ7jd2cH‰IޤXR$Ê‹&S¾l¹òâG•0gžŒY“åÍ.wÒìYXÆ` Eš”a0…CmúäùSgΠS;ÊJUëÕ§2¡~õŠ'תe£žk5kZ³d·†U;víܸ]뾕›×®Ô½x%:m©Tð`‚ FœXñbÆ?†YòdÊ•-_ÆœYófÎ=þZôhÒ¥M'&œz0Ó€ÑÂm Û/_ÚgéöuËvö뻹o׆ú›wl½»uûî}\xðâÃw/—Ü&ôäBKªÆn°(B×Ê›3ÇMøxàÑÍ??}õðëÉÛvo\l{úµÅ˯ï\ºýøû/¦¨ìÔn¡î\;Р[cÁ’T0B ZÂÿºÁ ©Ã -ì B AÑà ;´îÄM,±C×6‘DetqÅ[\±FCÜpFqÜðFs$rÇ–bô±H K2I#‡Ü±  $pJa~„rÉ,;B²Ë½Ü K'µ“Ë/Ï,±Ì›SF5c„M7ÛœþqM9ë¤Ë8ÓÌSIÙ¼SL8ý|3P }²Pš’ÊìÝsNDµŒÏI·´“ÏKý“Ð>}qÓO)õTÔ;Õ4UI™,UUK]EuUY_íTSa½uVjÔQÕ4×{S:mUW?‰6صÕU,™•6YZ–ÌbˤVÙhgÍÖØf üöZg —Ss—õU°°…¨ móT¨ÒsÍr; …¼·»|ûÏÚ]7dÊ0ùx,×D(ÖuO21`.×_‚2Øá~#Fl⊠ý×`ŽúÍ1dy)Ö6ÐzÛMª ¬\yÞS'²7á 1ZXdS®6£3þmHck]f• ŸÕÕóç…1øã››ú eq™TZ;™H~ºD+–™j¨Y"ºgžúÚ¢+¥FÚÆ•Y6jmtÉ©j§G¼–µî»â®á´”wïgGòkºâŽÜƒv\ì,OüÙ° ·ùðˆ^˜ñ¿—„¼V”›V½#»!Íñf±s 'xìÑ=?ÛÀq'Œ=¢w}u^°G®œÄ×ÃÞ|êÅ//°oÁ½åÜCÒu÷{ùàSG\ÆíN>¾õÇ•¯µyä…}u—7\uÌEÛpߣÖÀòg7½ú‚µ·žÓîC5z}Ç‘^ùvìPËÒŒôÞžü¢'2áÅ@è[ZßþÊf@Úa/}õZàóH¼ÁÕoás ýA¼ÍOqg»`åÄ/¦°MœC÷£æƒÑÕ±²FdN*â?»™PN¿Ã™ cè¾»ÙχtË Õøvļ!ðƒß+ “ø?€1ŠBaégE eyù«ž}&Cx|"œ¢Ù‚ÆDÑ9±‚[¬ Æ.!+¡QD32Êq‰ûbTew?8)|'ݳH³Î†µ;X ùؾ¹uª)‡¬ß õ˜CúÍn‰£‰­Kj’^k &×HÉê’’Ìc"ý˜ÊÏÕ1(¬bÙ"·É²w> ùhþ8FBö(˜¸Ì1[ 1‰ì}Sæ)ÝtÌÒyrx•f3•¹z¡Îb©Ü¦*¸Ëjs†´4š©IJqÎr_æÄ˜ñÒYLUñ¯'¶|£4õ¹4l¢.]ÞdW?…õO!ƨ[û´Aé¹½ƒºóZ Ýä“úËcôR½Â§Q ŠP‰Rt uÜDêª:”ŸËD©ô@ÊP.TwM©HSª®’¶T¥MJMGzÓ™ús¥Ö“)9iúÓiÙTŸ:íéÅvzT¢4©.EªP ŠÓœ6µ£K½WTCÉS©~Ô¥æ êVjU-… J…)9ÍúS­žU‹T] Y·´Ö¯®¨­6¤kZÓWþ×Jæ•£Z“+·ŒšÕÀN« -,Z᪸¿ªu°ˆåkL[®»Fö¥]…jb{XÊj–«b%¬eƒ‡ÑÅV6­~u¨i‹Z£ª¬“ k{Çڥʶ¯°- m%»Ø¸Š¶X´}ê[MêT̲Q·Žåll=»×à2Õ·ÅíPŸRÞöV¯¿nE§ËÒäæv¹'-®s¯ ÝîJw¼Ô-¯vÏËÝê 7»Š-d× Ô÷’ô»Œog·KßôÞ鸣­/¸î›Ïêþ»ýµï~‹Š`+˜¸ùU®ƒ¯ÚÜÐÎwÁ–ocÜ^÷2˜¹á­°†ŒaýZøÁnõ®„Ë౪x®,îÉËaþ£—Ä6ñ„AœááêÂ)ÎñŠ=ã¿õÇæñŒÛ[cöî¸ÄI¶±“q å&Y½TæïŒå KyË=2‹|Y+ûwÌÀ /“³ìe$ƒùÅC¶ë™ag –×u³µÜæ9Å|†³Ÿ—«æ.—9ÁA~󞯜gʹÎfó¢ûlä?K:Д´œ/ÍUF÷Òf~4|yKèg:Ô›U4¨­çH«šË¥>u‡SêVúÕ>µ¦gÝàUCÚм¾u˜k ìNÓú×-îµ§Mlcç:Ö>6‘Ÿ ÞhÓ™ÙŸý´­‹íe;ÑÃF¶·Y]à•ð͇¹ef°tþƒ×‹gì.šÅJjg›Ø“&³½Ã½mhë[Ú׆6o%fSsëÙ0˜‹b"Äîÿ¹»„þÆ/ÄËojKœÖx·1.ègÓ[ØÕ&¾a†ð”±»† /ŒÃu&WyûtÚ︮ÁýoqûÚâœùK˜± Æ“€ Ÿ˜ËFgn…GÒ0#¿ãÿR~!“#ódó9Wîâ–{à×xÎ7ýác:æ/'°À{òƒ?<åŠQúÒQ^BŒ‘|çãTÞÓÛÎ4a½0sŸ:¢«žY°{àÿvµ'®õ]ï›ðí%ûØë&Lt£ýîK'À ÿø·'íeçùÙù·xxkyïÆ•¹à/~xÑãþ|ÓŸoÍE½ØÄßóB×<å>ÎOžíugºÜ__ygª½ó^F}ˆ»žï¬Ÿß\'ýÍ‘oü;×~óïæ}ÏeÏù·7<éR‡;ôí¾ûº'ú¥>“_üÂcýëW‡ùßC/vt‡Dèß—Xâ‹^ô Wqóô·}Ü#YnB½è>ÿ½ ¿'¾œ²<>‡c¾ò³6Õk¶Ò2&«V)»Ú =åS@ä8õë;â;?ä¶DÀ;ƒ–ÿó¶°ºÖº@ò›¹ôA<?ŒAD¿°ƒÀ4À/›Á¼qÃ@ÆA ½lÁÁ#BrÃÁÂä·´9?%̧ ,Â!þB2µ²ñ¥x“BY«B¤Á4¿?öCdBsBe“Á#ÌBiA›ûÂå»Â´:ô“qò¢0‰Ã%<œÂ4ô°5|@¸b D9É£›Cš½Ú@\Á6¼BÔ¨?ýÓÃï°4<ܺ üB;ÌÄNÔ¹‚Q£=„& éÌ»¦ßóDW£ÂÒ£CPœ$8š;ªyVÄÂ#Ä ÃV|ÃQ$SÄžSÄ?cD/ŒÂMôC<„ Æó™3d¥ì³Å?„›[Em#½^ĈÆQD9Å`,´b„Ai”ÄN¼šn’ÒFkÇ]¼EpËÅ€+-qÒ%éÆ=LG]„Ä$DÆ@Ü´µ`œKþüPúÄc¼ÂW$È9äă,°÷ã?Ä)¸t£\ú8p|Ç1ÌÇ俦ƒ—q3ÈhÔÄ‚LHjìÂp É%;y¾’¬HlÂHdÇu¼H1tI5\¿\•m@–„É™lEŠìÉ—ÔG‘LFXt4ŒCŸlÇckÉGJ¤¬Æ{“ɧ¤I4D¹ª å;­ •p¼RüB®Ä >º éJ´Œ°˵üÊ ;ÊSJK_«Œ_†a°Ë»Ä˼Ô˽ä˾ôË¿ÌÀÔË ²;‚ÈK¨qD-«KÁdÌÆìË€ÜÆa4LÇ|LlJK+´ óYLÊäÌÎôL»ìÃB¤ª¤ŒÓ˜Ë¬“þÍüÌÕdÍÖ”<‡<ˆÃÆÒSÍÖ´MdâE¬Íϼ‘Ì´:}BÍ5±Íá$ÎaÍÏb=Æ8É2sŒâtÎçÜKŽ9L弹݄NÇÌœRAŒál ¥L¯æ¼ÎðÌã„Ç«Ê9´NñTOÎl’Ú È°\OÊ”@XáÎ}4ÆêŒÏü”ÍÝzËŸ ¬ôÔÏåËöÜO¢M Ìùœ•Oû4IøDÐø$Ojs6¨<>P%P¼,¥IÌP¿TÐkÁÐÆœPìÀýPÖ,Q«Í Œ.¶„Ñàô—¯¾ — mÊŒ´Q®¼-tÑA R\Rw,R¦WA•Ôo’E@Ê¥F’¡hÀT4Ð[M¦LF!–M-;Å2<þÔdeS^DÓ¥ì¦`Z°q£ƒØN’¢£t¥Ç‡½Wc¥Ó~…TŠ=W› Ô€J÷£×w²éƒ×RÌÔi#O-šÌK×l†ñXnØaåW˜Õ×|ÍØT­X2=®‰'Ø”Hþ»¾xR:¡ËNpZ#OÕHž“UuÃXU7+Sš»X!­ÙµÔi ÓªuYGµXS½Z¦•X­íOíÚ›EÈoýÕ²%WpÍZRÝÚ3µÙ¨%R¬}S®Ó™5Q¯ W…4W}Œß¼ÎpÊ¥%Ûq Ö—EÛÂÛÃ%Ö³EB¼MMõÛ¡áÍÀ•ZÇÛ­ÜÁý×kÔØ>&Èå;6BÑÊ|ÒþËõܵuÚRÅܸMÖ½]ÝÉÐÈ-—ÑÝÒ\¸5R¹½]º½ST¥ZË Ð½…2ŒÉµÝÌÅ]$Õ]äåÝ}õ]œŠYNÞÔs—1^7ÝÝ×U^àe^í=Õ©…Þ#eP¡1ÂСÝè¤\ÖÕܦŭ§mÀäýÞÖí\qE’ÈÝøÑˆÍHßÜå^õ…ß±ýߺߌŠ^ Â×÷ÍCsßò¥_öå¶=]Ó-×ùU[ ®àì` nà¯e[™`|*àÍõ^n^ší_þ]_NÝ-=áBqžìHÏSÝ î^öß¾ÛÁu]—ž™y:ŠéÙot`†à Î[ÆáåÜa$~þALÕ’ýHb,â•<â ®a'¶`Æmb,6ߣÖìœ× Ú¨óY×ãÆ5#ÜÅíÖ%Öb öbØ·ÅásãkXÙC Œo4;¦bnß~ã,ŽãíÕa Vâ[à1ºƒë¥ƒU…›ŸÞ_DàÞ]Þa–_:î䥖Ëg=Ÿ¸!&kRc7>äøMá$nã*ÞI~eà„RþÇT–ÅÅ{Fè»Äz“e&äV&áPvÞ¶¥fä QåwÛHX]ÆŸ¥UfÚ‰ æ ¼âEäöàOþÝZ>—‡ÉBædÆä:n.eÞf#[cÞ#Dç4³[ Üd9Žçyþ{^žçtþYbödp†cm†eÃ]ãîb–¦Î¨çsvçÎäcnaWžão~h¹ÞŠvè{v¹ˆ.fs–hÎe>ÞäÄ-è}–ç…þ膦go_•iÏ´dvV\uh“fe„Þân=èXÆÑ‹ÖhÙéÆè–hCæbEöiÑj–æg˜&꠾ߢ~j—Ög¨^ЦjMæè¨vê”îj®Nä&çܰ†è£.ç²fè­Në‰~i´6aµ¶ç¯Æg¬~k©^«a”¾k¹Îh»Þhºnk¶^i&Vj‚Îé¥FÝAÎfÆÞižfË"-²ög±¦j°&ìÃ6ìŽîl¯FlþËÖ逆lÒ–ìu¶ânÞlÏÖÛÄÆiCç(;i¼žëÌþëÕí íÒFÞØ.X°tËšöëÁÆmãÖkêiŠNî¬â¦0~=2n9¬mÀ6êãêÏÆìåŽkÝæjêØFN;þ$nÛl·¾íæ?·enÁ¨aêXtn%«nïÎk÷žjõ†göînìÆÑfp«íÕá®oÿÞkûNoü>p¸¾jën.ÂÄãQ.Ÿ=Þµ¾ìûFïóÖn çíöÎðÚâãœÝÙ†înp×ð Oð¯j¿n×Aþ~q_q×loq_oÏmïkó¾q!ßþo"Gn%Oq&ÏîÖîíÓ¸…ŒÃ²_ƒ¤“m¥ÆøÛ³D.Õò!ïðþÆqu9_ ýÉœ+ŸÝúÌÍÅ0Kµ8óòvðwñ#Ïs±Jóõ´û½m6ÎÛ¼#9#/O;'ðŦòÆæfdµñOÑè¤s¤¦Åàβ\5Å`têvô×FíYng(ÿéJ/ÐsCÖ?'Ý;WuS_ð=OæâWO ×óUwMÅuô5ñPï`<kßp‡úõëÔõ"—\VWÜdOuPŸlÓ|l‚îéGç7+ï[10_c.‡ua_an×q>Ÿô]—õ?ömLÇvÓ6ékõ›þöX_÷$O÷ Ïw2—rc—qv÷m owøºÞ÷%/ó?s.øÂþw|¿÷s„ïw3wò?ø'xtßxf¿ø;LxsŸxx‰_øq.yŽOymxƒïø&ÏxŒù(y‡Oê)ŸwH§i{_y™¯ùüþx†·v×®wqwlrŸyÿy›oxήx…z”¿y¨¯zÖ¾úÝnz¡oy‹_z¢ßùÈ{x?úi_­aÎy—z¬_{­Ïúížzuüzªçi£wbyšßúY{©œ{¹ùZGr“ï{3ý{¿z¾?|Ãü:²ižOm¼?yÀß{u¯|}oüz|±/ûþQæj{w}‚/zï|z¿{Ÿ{¿|~_ýÏ|¶Ù|²O}¤tÕo{¸_|¨¥uÇ·u®O|Ë}€wÑ?}È'uIÏ{¦~ˆo}Šo~Âß}.w[¸D©¡'QÚK¶úÜgýèWyðgùàÇü¨Ç§ÚÃÙ™f»~3û×ýãçüÚoÿÙBûº‡+çKÚü7ÚèfT+,µiµ~»štB³Rÿb®M»±áÜ—ÿÎæ\Ùögßšokì½XwçÄ¿‰Þùrç›?—>\8ð¨Ø™OÇ;ú{hÕgÏ¢.¨Z|××ã3f5ÞÝsòíòKº‡}±òëÔ+ׇ®ÿ}~Ù½ç_»Í7Ø€îgYu Òw }™…æ‘UY­¡¤¡ihuØlF(b€ÜÈ›‚ Æ· ˆ¦xbd,šè¢ƒÿV"„þ4ާ⎠òh£Ž IšB¬e”V‚•ÞZIƦU5’˜ã‹µX¥\TÖeþm&£–‰eqaŽ©”3f &›Þ )$ŽmFÈå™=Æùã•hvIæƒrz‰bšÞ ã‚tæi§™‡úX'£_â©f]¾9Ú  g(¤ˆúÉ碊zЧŠbš(¨j¦nZº©ž¦ê(¡–9)œ¤^Šª ¶žjª¬­®Ú«›ŸæÊêž­ +g¥¸öY,³ª*û£¤´^•,¯° 좿Æjí«ÝZ§-¸Ö]»-µÍb6*±ÎVä¸Ú–ëê¬Ò‚÷n»â2çZj­u£®Ð>Kn¿sN&ŒþMZqe¤¦Ø†k¬·ÈÌnÃØÒ±µò†6±™èâ›×…@‰…qºè*¼æÈ[ÜÒ…§µbÉÍŠ¼­a ·Ü)Åî>ï1ïsgûß®úW=úK|ßcßôÔ·3ú$nò,t4 fH<©‘MÓ´4Jî_àcTêV´Ó  a_år§@‰Q[5lâ†d“Ä¿a‘däË!ÅH™?[dÇØ¸)NP*#€Î¶%îî‰ü ã¿ø:;žOC áX16VñzX;$á‰È*þ²‘Ь k ãÈIÒ1Wô£݈Jr²“ž|¤_"©“Oz’!¥YèXT²²•®œ$þÈÆÌ™²‚Ƹ%.s ?aä²—ÆØ¥/ƒ)Ì_ÆÏIcIej†©L\^è Ôd©f!^.³šÖ¼¦.‹¹/„Á ›Õ¼¤—XYµî¡rÔô&:Ó©NeBO–³Ì– -rÎ`s˜õ\'#Ÿ)„ae·l¦Üù@hÞÍŸýæ1õ¹~Îó Wd%Åx&NÒ´¢e'D¸'ÅwÒRšjh/SÒlŽÅ Z# kLÚHB±‹uéEUúÂë¤ô¢ŽÄd¡9ɘò4¦7e×, 9'˜þ3þ™ö4*>åDTk”pª¨KWÙS›*Õ§µäA):Õ­&õ” ä(<¯*OŒš‡¬^1iUý P…Æ0“QÍÌR¹ÊÔ´Zœ‚ªâ*×½’´,î ª-iÖ~µ¬j¥«:›i׫âu`|íê¶ôŠÍÅzÔ‹mý‘d+Wì}•£'?Ë£½R©¯\K «õÙUž¶µ”4­kÉÒßeµ'±½-n>°®öbµl<¹ˆS¬¾5x•­ãqט\¨÷ˆµ ërëÙÀ¦Vš½•îlûxY'F—¶Å½cvÝÚÜvW»Á5`ŸÛ—aLdÃØ®DÞöŽ· ò¥}B_ÈÝ÷=þîåH~‰³ß¶wzð%/™X_å&¹ fð;¯ ¨Ó7¿þE¡‹á§fØ"~*‰¬ öB®ºa”pÕ›Óï¦ÄÞ]°oyK] X¿¾¯{+ÌÞ#$Ç%yïd‚øØ&9&ò²ãüúøÆAv²’› Œ!CyÊ7NÊ’í‹ã$G9¿Áð“³Läÿ2$Ã`T1qaŒ]›÷·h|.Š#˜^?HÄ®0²ã ‹"Ö²’-³_&ÓF̆¦1’7Lö~ÙÏ!t-ü2:ÊH&qžmã(+Ùʶo‰ ܺ ¯9t›Å{`2‚UÃhV ˜œçI?šÆ@þþ±”{¬FçÙÓŠIŽ÷¬ç^ï9Ѷ=ìN3y%ƒu /ìdozÖ@v™Cíf‹ÚÄãŠ3ªM­fðÎyÜe²sµmåûºÌ´öÈ–rgL×8ÐϾ÷»ûo?›Ùöuv­?h[ƒÝö7I̼ÇòªºÛ¢¦œÃ·=êW‹«Ü«^#…ÓMl[·ûßSþ3§i,ï€FÇÇ·±/=fjcºß|þ·ŸI\é+ÜÃõ¶¶¯ÛK>oGtƇ¸Äyî?sË™>xÆ3Òd—ÇWØñý¸AŠ\åEïßËnrÈ“Ìë!K½ÈÍvt˜#Íe(wùÑbÿt×g&ô=Üp>þ:©_|ñOW½Â;åfþV¡ƒ\éiÆ;xS½â¶Ûðívó©]-øANÜ…Oü\¤îF¾O‡ÞÜúã÷‹ðœ7|â­dñˆ3|ðžàâcwŠ“ô›o8æ®yÖ‡mô±/ýß]Oû‰§þîw]}ï[û×›^÷¶Ç½;¯ûà_ù¾g,ð•?üÝÝùè5úáç(}ëkô„O¾÷OïvÈG?üÆÇ~èŸ{ǃŸüÙ_ù§Ï|Þ³níELÿõ_~÷û.´“í™Í_õßãû© âàê¶fONd÷PÝQßìÍŸý‰þuÿ}¢™ÖúþàŠŸ%1 Z@M眄–Züqü} B Žà F`vŠîÞß¼Íñ4Ïz”ì}Ëòm߆àâáà*X V\ Fá ÞU$éÏG´Ón-¡ðÉà:˜fÊŸ†a«9¡áéx…ìlHþ Ž  ÆaÖ_Š z š êßû}atÐÞÈŽç`Pÿ!Ž¡Þ¡âÙávêá 6à&!œ}…Ó¬Þ .\$Òßä1">"Z" žŸî 2Wæà$þ¡(îß¶â*¶ò`%’a ~b-Ê)Îâ/¾¢*Æ",ž¡, ã-öb›-")6bþ(6ã(&"$ÎaÝ ãÏ!Mná–Ôt(¾G6V‡#iË7n!*"/£5ÊX1Ê ÷d–f1Óc”’`pcg¸#BÍãJ‘(†=.Ó ^j :&c«9ãÞØLõ£f% 7n×RÈc7QiÑŽ·„#RUÔ?~Þ)êâF2£:¦#:Ò;zÓ>"#t4’O‰’&’U‘£Öá3Jc)N_ ä¶%äHN4BˆBÖ'‚NK"âOÂäAîä:V#AJ\;æä5eäITP–£aÕ¥9R£TΤG"%->Ò0å\ɤAòcT¾äE:TUfåXÎ2ÂÞVFØ1 R6j£XJTn5þã8 ¥ZF£UN£M~dRÖe\BßQîå`®ßa& %¦b`ö¥Vž£Q‚¤a¦Yú¥# faÖäe:æZªN[Gchšd0þ^fæâ[Væcb¥jv& dWFfcN¦djfLr&_Òæl¶fnòfbŠàbêPoäfêflb¦dú&eçmÂårî"k2gQ"çnJ'Œ}fîÑ$jB&u'nþf‚gÀ 'tþ%W–&a&§u²%l¢'b>gGrçyަiªgy§rÚg|Fç}6§mNçw§h¦æzzf{ÒgzÎæ^çh¨qº§b (ij'czg„"è{êç€Êg†:è~þš§srh…‚h‡ògˆâg¾¦lb育g‹J(pRh}Vçƒ2hŒZ¨pŠçSòh‘gŠ6g~ÚhBè‹hŽšh‰zèbh“Êhxžæ…Béxúèp鉊è“jè„Ö&j–¡t¢Ff©ŠÞ(Œv'•ö(&¨‹’J"N›ì )Ž¢)—Î(‰Ö¨“®èr]Žðt¯È)@š)’Ú©’êišþ¨•:dpJÔ`‘´ ‘Öø‘©òé…a§ê­é†)¦©›B*' ˆÀ)iÍÙ ¢Þi”æ)›&ê•.ª 5ªú„„ª y¢éT*l°j¬ºj•zj—‚ê’¢h¨Öiþ5æjBµÅVj>É¥«–jª@q*p «šÂê§¶éAk©Â ‚«H­*+·ëž*‹*“ZëSù)æ¸Í’üßóðjêè7ë¶k«j°l·Ê*£JéŽ6E½njƒ¾+»öéÂ"+µ–)žé|’?ÅëÃVkÃ*l’2ìÄj€zé”j«¢+žúkÀzl²Rì‡zè‘¶kÈ¢ìÀ’쬚ì«Ê¬º¢¢pæ«ÉÅ:å´þ«ÊFl¦nìµf¬Ä®,ÈŽ¨!'ÚÐ ÑBè– lÎÒlÁ¦ëÉzëÁN"1Ï&6‰ì ¼f ÒíÇÂlËB¬Ðbez ýÌOÒþOÔëÌZíÖl­Ú,ºâlÞê¨]„&.’ÐmZVíж­Æ¦­Ãv,Û¦¬ÛF½ÍüH`%yâÚ.®Òª-â>îÝ&.äŠhPQ`ÏTÖ-¿–¬ÖÞìº2.Ǻ«ç^í[Ž®‘ íËØbnçjîÔ*kæ&mï²ìîçË6.ìò®âoò¢íæoÌrmàÒªjI¯uQï‰Yï·aoÏlôòm¿¶nó¾îóêíôz¯ê*(Í¥ú®/û¶¯û¾/üƯüÎ/ýÖ¯ýÞ/þPú‚%ÿö¯ÿþ/°0°÷”þ~ë/07°?0G°OpS¶ZOR0g°o0þw°çdëÐ0 —° Ÿ0 §ð‡°£ª° ¿0 ǰ Ï0U‚ÕÓ0ç°ï00 «Ï ÷°1±Ö,ñ/17±ŸðÿiþN1W±_1g±o1˯1šoÍ®nß‚oð.íð2o«mñŠïï¢ñòRmÙ†ÌÙ±Ñbì‹ñ÷’oõ‚qÖú-ëêñõrï­jïБñûîÓ±ë­ãŠîvŠϲ¡éV’ý€Î! o«Ý#r&ïÜ&³ìëE!šêÜîS‘Ó%›q'kÛñ*oèºòçFîÈK†Ìç¨P露ÜèrcíÞâñùò+»ñ0‹êþ,ÉND)7-/T,#o1sr›m#òìºì#«‰Hi”SáO-ßM*sî*X5ó3[óßÎn6öl 7ï2?Yr4cò4Ëq9+rø2r+ûç:/FiSŽ3a3‡±1 g/ÿòA÷²:3$×.ꈤÚiÓûrù³A ó9›ó5Ër×6t0'ôört{tHCóGóH«t:ƒnKKó"Ûñ>ãs;/ÓÂtFãmOËôJ£óOÇnL‹t÷bK'µR/5S7µSãï=ûn(GäWµU_5ÿ¢îF£/D›ˆc5X‡µX‡TTƒr?{ãX§µZ¯uXŽ/àþ2b±µ\ÏõXkõ‹ìK¿ÈWÓ5_÷õ Ûu ãõQG–_¶a1`+´`Ã5R¶c?v'öIsu^×#d_6f«°d²Î¶8>5h‡¶h6iƒvY/íTSóMÓt>Û´[û4Bkô]S¶g›4gËv`“tGÛ6Ûñtl?teöCuQ³tPƒtq õocsW+÷põPwr#wt;wI¿µð`éeyJwu£Mì´&nÓÝxP á¶bëvJw6c«·‚€iw[÷n×Ò&Ü‚ÎC•Æý¹÷Vûös;rsSw,5íìP´×v!q7ÉV8SÜ2”­Ä;³"oï·_7pþ×6Öz@î7_‚/wvÍíÇØM9Í@®…W8ò÷lCo{_¸~;séĆ$#8t‹8›U`WàjJpxG\’-Êøz£÷dÃxvÓêè,IöÄs| ø“ òdˆ»`¯ÚÖ‘³x9C#ù¼.ê-câCu*Jw9ïh!ìÌøØbcíô¶–Cᛃ!€wˆ«!áÆNåv#kçt£„·ÝØë?PBMøÇùy 7†37ç8¶8—÷·¡S¸‘ß6¢Ïw†ÇxB;É–Gz¡Oº›{úŠƒº£³w’/4¤‹ú¦£:œ«ºœËw‘_z©s´k•÷h½UþÒúMwh›ú‹sº/b÷—ƒ±þ0±»±;²Ã% {²»?³7»´O;µû²Oû³cÇ^¤B1z¢{»¥+º†Wz´W{²_»´g{º”»¹·»¹£{³«;žlû;v»w븫›9°«v’»ŸûÝ`;ë°û¿<²Ã;Àƒ7Û{¾Ÿz¥¿º¸c:Íü¿S¶Û¯Ágü¹OÒÅ;kÖt®2I-<¯çö£÷ú¾ëL¿¼Æ+;ËÇûÀ·¼Ì»<é¼ÂS0ÃCù·ß{”ós€ã´¿·<Â|ÌϼÆý±ËûˆÐûB–|zŸ¼É“z°ËºÌ#½µ½Ñ¼Õ»Ò‡É—¹Ã×ùÎïYïyÐýË'¼­gþ}Æo½³' Ó?VÎý<«r=kòëö¬ëc­ÃØ­ó}®£h;}–³ú¡G|¬»xÔ¾¤?¼¾;~؃;ĵÄC>Ê[þâcþÓûú2Š}¸S~âCýæ3~§k~á›>¥{þäÏù¸«þã»~äóüØëüçË~í“ýÏ›}Ý‹óÝ{òió~M«ök#þÔ+þè£þ§#¨+ÿ¨“þ¯Ãzñ‹þéÃþåSæ[ÿñcÿôƒ~ôs¾[jêKþë‹ì7|õs?¿ròƒÿú“ÿùÛþê›ÿõ£¿Ê«ÿò³ÿý»ÿüÃÿøóùû<@ü8`Aƒ #¬ Ã.l(‘¢@ˆ¿Vüuþq£ÆŽ5r¼˜ÑâD'?¢©‘dI”)aÂ\ùr¤Ç‹3]ª4™ãΘ7}âü™ÐfQšFy¶””iHŸ-…Fmªs R N±RE u*O©Y{";–lXžKÁ¢ÕjÖkWµmY"z”nR·W×¾…É5-^¸k­Êýš·fݹgý¾ lxð_»Œï &ÚW2媕 cf[–3Y¾™!ƒ]ŒX³Þ¤Cƒ~¬úpk¡Ÿ›Ö<Úudðe§vL»qnÔq'>ÛöïÚquû>¼ssÏ¥‡ëæ]|ùêêÊO·lü5tï[©÷ŽÎ<ùøêÚY‹ŸÌ=|Wô±Íw/ÿݺsû—ç篿=þröÛÏë/½§è»Î¯÷°£.¸³>¹Ô/@Õ»A•ºÏ¾ÿ?A´®Âws0Aÿ ¼ðÃ%”Ä3‘?GL< e\ÏÆÔÐG¶j RGY4ŽÃ' ‘ȽT ÁY;RHÑr”PÊ*÷k²H ±LòGç®Ä‘J1•< É)É+³À0Õ¼±MuDsK3—„RÄ.$sN[ÄðËûØÜsÌ7‘ ´NµRK"Ÿ\ÔL9ÅSAG‰Ó3Ñ4ÏôóO0)}Habü”'Q u1S=í“FI”PCíTŒÕ(;%1U8-TÕÉMÁüôSHo"U&R"õ"a/þm V-o=ÕMg]Ý,Öi㜵DK©]ØJKT×h3äU,R‘Maƒµ'ckU¶Ý<»pÙo›ÝV[keÅvÍwÝÃ×¼yq­OÜqÕýÈׂè`P:Ø¡…QZ¸Ø„â†E-¸P~[5×Û€¡­·K€CöBŽcÔWÑo#¸¬`þ…\P•™fuÙæÐ]ˆØzæsqÖ¸F’åYeLíµÕä\ANúi#Q¾6^ZY¶3\— ")cuã y†XT¢UúYçŠzm‘Öôê-ãFujw³æ6ÚdëÞuéó–ŽëçØf׿±‘E»¤³{öTَ݉èšþc^9j¹÷Ζé»éÔðËíþûèªó[¹¾Á|,Y{çÄ[/;í›'GØöŠç›ôEÿÚ–MÿwwD==p§{—wøgUïºrŠm~»£ç¡ÊWÈ_7»hŒk¶üw­9çt¿ƒ?ùx/=Vþ|x3ßwý~›?uàç”ÞøñSOküéOÿïõæ?º-/Kï[•þ¬¿j!°t{ªÜÈ$ Ï€)+Ô(¸ šàÛ ›†>réƒì 3ˆ¼ R­‚ àé"عÎσ+ÄÛ 58Â{•P‚64UÙ÷B âP…íóáçCñ¥}Åó;6B0: #þˆë"f´%BÑ‚F„` (DrÑ…NT›8ÃIŠk\Qn¬˜-RTSÌ¡?ÇÄ šñd #FÞ)ñ€„Ä”íh+Úq¯a‡‹ží â«+zD’‘ä¹vÆHk)íUn<$ a(Hâ©Q”Ìåõ˜D’ЖÄÙ±&§0˜`qqmÓiÖ6ʼn a› _!ñ¸GR¢Q˜¥ÜehLVS•ˆô¤%uùH™$Ž ‹d%§±‡=’—º„9‰ÇD¦Q™ã,&1·øËO3•QT 9݃0Lʲ`Û<–=³™Ï˜TÒhò¬§/‘™Î€¾ñ”cT§´ØéÇA2óŒíì¢þ3•9rÍ3cÔäY4§™»9Zs’žòf 黈©  ¶¿ÍMnÃâºàDNöªËLhc?œ×zþ7ÄÝo‹'ÞÒÆx¥%NëxSÜàWx =^qL_\å¬NùÉCùrkÜÖ7¿GÞþpSï;ßâjÇYi—Ñ\Ýã:Çq.ó¤ýèÕ¹Ò{NtwÓ›ä6§ºÎçÍóªï¼ÛõÖøÊ‘õ¯»œéKûÖ³Þõ=â9¯9××mömO]ëX×·Úë{v»û bw{Ñ.w†¿=íq÷ºaÇ,  ­#c{ÆÿNw¼þî†G{åã#%>"†ãŽÚÀvÅÆÿMêŸ»éø¾_žïàœù…<ïг¾ô?½íS/yËïà#\XØpj»Kþ>“«Øõ¸ySáŸM§SyÙýuÚ?ä‘G=|}_´ÚÝ”ûŽdãþé8æ¼ §¸³Ÿ¶s}“7=ý¸?¸û×ãþØ ívÞ=øg7~íKÎmûo0ô§Ïúàïæ¢y/äâgþÊ/r(çþÆødg]üo°{þOï(¯õææÖëöÀÎÉNﲨ¶ÿ¶'{ŽÑækL°ûr&ü.ÛNúP?°ýnû¨q(&ÀjøÒE'¯ufh)¥¨oÙ’Ú–0àšð|zoa0˜TÚdÏÿ†M!3°ör0þ P¥0p ºØã²CP « UÏõOÑÍ×P gлð ÑÈ ëPËJ™ˆïßpÙïý¾Îll‰£’Ï"F¯¨ ‘µ8Рìp ñp¨MþŠá.,§²©{B¯ûò' ÙP épO‘ SÅpe¦‘bqšp ›º‰|Ð u/óLñÛ0w1ðÏŠr)’¶é¢0tzû sÕOk¡Š™Ï=*qq¡q¯.[ñ 1WÏ™îi ±ÀQ£ñ58QÌVÑ sNŠþ©—lê)[ëë®»1á‘áp‘‘žzv”ñÇ '//R _ñÃÝÑ’"éå/$ñGèF]±¡C%ÅQ%÷5²# ò# ²L,'ur'y²'y² %r÷0Òé`q þ›QgÄ'•r)™²'á)¡2*¥r*©²*­ò*±Ò*›r+¹²)ÓUÑŸÎ(g°+Íò,s2+Õr-Ù²-Ýò-á2.år.é’-Ñò.ñòã8Ò'.Yðò/Ͳ.s0 ³0 ó031s1S.ó1½Òå2¬1-ó21335s39³3=ó3A“0)SÀ4¯]Fó4u24Us5Y³5]ó5ß5eÓ%óðhÒåf37?6y³7{S7sS/Y‘Ç2"=r"C8gÓ7ÝR9eó+Gò&)ñõ6r8É2%'È9Q(S(I²dJ³:íñ6Ã,±Ó<_Ò÷2#õŠ%OþcR>Ñ=IO&Û“>[Ò>;I?ß“<Ï3:ƒ’×Î?ïÓ@û@Ó=×&ëó‹“:r³‰h°IŸfé(¹³&‘s@…"4„~Ožd‰{EcRâB-,BÉ]ÇX`°\lª<´; ”“C½Óµnq™/FQŸ¦PÔXÔCp¦DsÊB«*HéICmÒCËq(ÕÓ:s”Õ´1­Q1Ôzª/ù£—F‘méHoÉI;ÔF?GCô?¯äÄ4L§gLeé–üÑ$Å%n„Ï%F±I·´£)¿Sj,P¥sÙ §šø”I;¯K‹´~:*Žö”Ë–h”P¡þô AtJdzM—­K4T'é›ÚbHÙèQ•EI´BõqN%§OãSA”ScÕS©tMÿ¦Ÿ0ŠÑUcIŸ UÍcBy)fH°Wk›n•VçSV—•AŸµFçkD½©!ÓQc‚ï¥fÒV;µJ/uCÍtG3µ67ÕóÓY»W”[kÕ[ÿ\¿µî¼ôIÑ4JM;—rV¡5]™õAq…4k¨@ѵ]ç_•Ò7 Ö'ÉUMûu?!£2§’4µõ\ÙµY¹)aŒ9561–'ÙÔ]4}Å1ióÌ„ÕÓ:v'7veY¶e33eu<£b“4í”WHæ1]vgy¶g}ög2þÃí`T³ OÖ`6-vi™–i“vÀd6i61m–:ÖbŸvj›vkI6k Tœ()Àº¶zNµ(AV_£ÓkaÙVY+!1µ^µö)%ÖQÑV]Å6lE 1Þö’øu_ ¶a?Ö66€æõLuôF¥Tp-6m£un7MW\ëUSÖqýµb7r7!+—qs2WZÃUt UERC7M×tãUqO×uG÷!K—uÖr›&KNrg×D¨ÕU³ôDét ŸÏsWs–8ó–p-ÃÌwc—ˆzTûd‘ñ*‚W¡Szß•^'·[×^ON­‰øhF¶œw]¥ëþJ‹%£¤‰OIcRWoû–s——/su?/1*£^I×àµ{óæMÍB{1‰Lýö«Òwo¯¶s‰r[‘·–„÷) }•·p7QëÈ–‚…wj¨ìƒ/ø@™‚×T)Çq.´w8d…TeÆk†eï „#ظ~ÙÐX2I3fžr‚w­Î{×RtUxãô¢•\t˜~Á¶ïw‡% {ɉ£·…Õö…‚—Rù©\°µh*ÉÙn8ŠØ†˜bËØ$u~sø‰C˜„ãX}ÏXÍ•‡ùvŒÑo„éøÑØívx÷Âs5GEQˆQu—ÍÖ{Y‡"'áxåþ˜’ûøŽ§˜o-*j„!hMÕé¨m£’6ïç“«P”•”©jQnŽ–›X,›—mF+!Iv““×–hÛÒ”Of—í6þ2¶.̂مµ8r¯®öK…+u+>9bÓ1ðÈV4/æ)ªY*¡WDë–1]Y§sP—ùsq·–“y–º¹9§ª#¶jF3¹m®Òùb…•_“T-9–ûy–1yèÜsž³rš“žíöš*›Ó_¡AÙ¨Š™žïÖ%·øœ“tó—vu#š½9—k"š'•£õY-ÙBDš˜Ã96 ™¹W™‰xzoÔ™Ë'…¹“[ •Cù™GÙ—þ9ù›N”ßo¢­¹d;c©··™7Z|¦žë‘95ø„¥Ú©#ù˜ÿØ–z™Y^›Z•ǵ¦ËÕ«Ñ£·Ž“: O’?ýY­—:¦’¿W¬/waiÚPÍY®aZvezªïš¬o—©Õù¥/š¯Û¯ç°ëš§S7nV–'®É˜ :zLÔY±¿Z±ûšÃÚ±ÇZ¯å¶…ºU•ø•ÿy²•º²iÙ„[{Í:£wíb÷‡)ÉOU›²eÛ°;´ ­q˜«Y;°ø¿ùŠ,uáˆ{«g;­_[y»Ü¦›¹×oùªWI«¸w;¶©Û»­;a»¹Ù·ÏzþÁ°Õg¸›‚¹ÛÉ{­Ÿ{¸5:¸9û¼=;±íJUÕÛ‘UOãú¾›®‹¯C[°_×¼iÛÈlûGÏW"¾©ú½ÿ{‘ÿ| œ´ËÁ¡[Â]›Ã{[¸Í8ºñŠE8¾CÜÿÅÃÄK\¼¥¼»[ÅcÜÄEöWölÑ;$“g'#,G\²[Ãå۷ù¥-±M|šb­Âíz0RóžsBéÀí›Â«WÚ¤Kv³“ƒ «òBçQ¾,[i ÓÇ{¼i¼’«{Æ pËš6ñ̹üSÆÜ¥¯.ÊW3fyÜ6…¼¼YœÍÃʧ?³‘Yãã’óFÚg»<`óþ®ÍÝ{Í/ á\0%vÎ]š‘o¯ñNÏ‹vÊû<²W{ȽÒçöÒ¥œT½üE輨­°± ¼xU.Ñ|¦/\u=Ë?[À}¦ÑúŠéQe–\.Áëû$@½•E«œ×ñÛ׳üÉ›âpSœ™pZDzÓçÖ‡ïòZ×K;Ù7œÒ߯'ÈO|¾Õ\Ý[üÔÏ]ÆÓÞ»ÚÝ­ïÔ­ëÞ‹ÛÜ÷Ü‹œßM¬Ÿ]Ú{±|Öw¼$WWààÛÝááÛÞQ]â'Üà£áœÀ­­ã=þãA>äE~äI¾äMþäQ>åU~åY¾å]þåa>æe~æi¾æmþæq>çŒu~çy¾ç}þç>è…~艾èþè‘>é•~陾éþé¡>ê¥~ꩾê­þê±>ëµ~ë¹¾ë½þëÁ>ìÅ~ìɾìÍþìÑ>íÕ~íÙ¾íÝþíá>îå~îé¾îíþîñ>ïõ~ïù¾ïýþï?ðð ¿ð ÿð?ññ¿ñÿñ!?ò%ò)¿ç;Bio-Graphics-2.39/t/data/t2/version21.gif000444001750001750 5365712366325116 20117 0ustar00lsteinlstein000000000000GIF87a€×÷€€€™ÿÿHÑÌÿäáºUÓÿ[ÿ((ÿî‚îiiiÿôÿŒ¥**ŽÿÿEúúÒ2Í2€€€šÍ2ÿÿðÎÑ‹Eÿî誷ÿjZÍÿ™ÿê_ž Ý Ý{hîpÿÿ zÿ2ÿúðæÿ×ÿ¶Á£ÿõÞ³wˆ™ÿ=¿ÿÀÀÀpÛH=‹Š+âÿ2ðÿðdîQÿ€ÿÿ‹‹Í\\ÿÿêÿô¤`‡ÎúÿÔ R- ²ªÿ£™2ÌÿcGÿ ¼<³qàÿÿÚpÖÿÌÿúÍeÿ|ükŽ#ÿÞ­àÿú€rÿ€€‡Îë˜û˜d•ífͪõõõææú"‹"„ÿÿäÄÿÿ€€GÿúšÍÿ¯îî­ØæÖÿÿQôÿøøÿ²""F‚´K‚Ò´Œ¸† [ÿÿG.‹WÿÿpýõæÿðõÿÁ‹ÿàÿïÕÿ„ÒiÓÓÓÿäµ­ÿÁÿÿpÿÿÿÀËÿi´”ÓÿÖ½·kÍ…?ÿúúð€€Uk/ÿ­ðÿÿÌÿÿÿ·/OOúë×zÿ@àÐðæŒÿøÜ°àæÿÿÿÿàÿëÍAiáõÿú°ÄÞðøÿÚ¥ ÿÿÿØ¿ØÞ¸‡­ÿ/Ûpÿzÿe=ÿ ÿÿp€ÿÿÿÿÿ¼ÿŽÿÚ¹Ü<ÿúð€õõÜ©©©ÿ¥€ÜÜÜÿP‹‹€€ÿõîé–zÇ…‹ÿÿÿàÿÿÓÓÓÿ€€@àÐÿ€ÿÿÿªªÿUUÿÿ,€×þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏdƒVô@Ó§G—VÍZ ê_¢[ÿz=[víÔ²i¿Žíz5îß·ë–Í»7ðàÈ‘?¾Ûöë寅ûŽ{zòçÖ¡_'X\»÷ìàþW^znëÝËSÿ~^¼zòíÍOý{ìîOÒ—o¿>|ãáÇßýÍçÜÌ!H]€ n—àƒ6ÈÞ€Vç_…fØ„R§!q÷Ib~bh¢ˆ$¨â‡î·â‰nhÒ~Âc‰(FxaŽ/rÇ#‹8¸cŒ#êä‘&)cDi¤’EB™"RRèc“Vbia–HN¸à7V¹eIÁÔX#jg‚É#ƒZR©‹nF¹dœN& g˜^Èf—r¢§f›î)&BòY§—‚执Ÿ€þùåI5 é¡}N¹(¥ 6ªé£\掊™h¥‚º©¨¤2‰¤©†v:ç¥þ®2Úªª¨B* nf¢é­fFJZ¯°ŽI(­o†ªh¦±bZ¨§Æ^™ì³œ2{ê«ÍÖɪ´³Žª,­×«åx#•™ë@iþ’æ®·šk㤓f›ê°Èuûn ó†*ï¶zÖ{ê½Ðæ‹o°ñV ­¶ý~*0±Î’Inºêšv.¯é>Œ°¥SÉïÄüŒ1·«1¼O›êLJ<+ÈÈnŒrŠÞžL¯~ /¬+»Û(óšúºœpËØü¯½ãüó¾A›sϯ­ÒHí®­’2\n¹QG ÍB ´ÈÛ’ìô˜<‡0Ó<']rÊdGiöÁ^s½¬Ø]£$îýFuÃêR]«þÖD»½qÛ:·ø5¢G—=¸z€÷\¬ßÃ&÷Û…#.7‚§M1ã&+>räÖ^ŸãG¯í7èC?ùøßœ—êyÆ'¥âúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüì&=/ýôÔWoýõØg¯ýöÜwï}ðѧ2Ìøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  H>×…€L ÈÀ:ðŒ 'HAù°$®« 7ÈÁzðƒ ¡GX¾ ’$ƒ$L¡ WȺð…0´Ÿ G‚ÂÚð†8Ì¡wÈÃøÍP$þ5졇HÄ"ñˆüaH‚ˆÄ&:ñ‰PŒâ•’ïYñŠXÌ¢·ÈÅ.zñ‹´ ÇHÆ2šñŒhL£‰3ÌeMegcYêTD:¾™nŽþ²cÓÜh´Òí1p€ô™ ÇǧÍÈQkL¤"ÉÈFNÏ-óâ!7åÈJZò’˜Ìd* Y$I*Œ’â“¢(GIÊRc†q$+è?LR•¡4¥,gIK¢ruÑY%[ùJlé²–À ¦0;xËBvè—äå'a9Ìf:ó™,f #Ë *“$¢û2¡ÉÍnz“~ÒÔœ“¶ Ák† ‘Õü¦:×ÉÎô…ót@"çÍ)’lʳøþ̧0߉GÔܳô ‰=5IЂô Vää8»ØKj"ô¡¨DÙ8ÈN2t™âX?”ÍŒ +•ôhã6*8cN¡ª3©äPÊ1•~nr.eK-†Ë<ÂqkÓÜÜL3O‘tU5}YE;S:Â4§qÛ)GƒŠ6©UjI¡Š:©µ¨6µ\J©:Ò6rÕ§VµS—¥Õ–~õe¥)V…zÓ¾µCݪHÁÚП ²­G²YÊzŠV§ªm¬K«^3®^1L­o5$^CÊW¸.ö©sEë9×ÚÔ¢éí®UlZyjWjg°µ‘ÚhËÙ°z6±b¥,YýJTÔž´®¦þ[˜D+µ«Ë\æZœkWW³FVK†™BË+ ö°ˆý­fY+×Ìîí±UíÒ&»Û—ŠW’"š„+)Ý*÷¹›]ªt}1íÖL°¯Ani{›UæúÖ¹¯…nk¿_lö®qmw³ËÝÜÊŠ¾¼•os;ë#©«¶ÁÍ.š ߇wª¶.{×+`£z5Â2•~ÏušC.¶—«î‡'LœãŽV»¬Iׂ£+b “ –p…“ã c´Æ.&v…[\Ò¢x¯1†£…c!—´çU ÃÆØ ?éÁWmq{ïÛÑÓ«ž÷=m’D»`îÈ ~²{iìä¼ùj¸¿*®þ’ë†[—¹Ž‹­²N_å!g•ºvfëÊnåæ0”ÊY–- Ç«å"/ÉЕ¯œ“ [:ã`Ãm²ŸáÌ´EGÕÑÞEôj-e=™ÂPÆ/ž5X¯5¹[]÷P;U_Ô—Éó3f|PFßøÍ«oçêííÚv½Þb‚ÆõkãùÙ°ÈnW¨ýiP[ۗЂ†ëˆAíj[ûÚØ–æ´±MípjuÛÜ·¸ÇÍmm§BÜÞfî?hÂô¶+ÒÁY7ûøI©d'{ÖöN°ºÓÉCzÛøÙNô‘ÀMîroò7¿vº–ð‚;ÜáæF÷ÁE,o¶»nø!¶6ù]?S'ßl~oyþ@ò*Uœ…¿3–¡-dè4üáĈx¸î¶—Ãüæ Ÿx¼Ï=s×øä4 ¼W4\ £ï–$×xœ;–tÄè)L¹žGë…âÜÚ®³·ÍcžŠ¦{Ýë[¿úͳžì­ÓªP`Ö'Œ´—°ë&5ØHŠl·‹Pêh£ú¤-*önûüé<7¸«ûNx¿³Zâ5«šm«†·3'¾ñmçøÛmÑýáݘ–ƘÝCxùé®<à›–và¯.sÁÇ4ì…'wé³ýw”nÞ”_¨å[ú;†ùõ켨?Ÿgsô8_}Οz± ë´0îù{.½^÷ÎÍ<¡–OÌä×WöÀ)þšËVŸž{Åã÷¹JäÉúдnö¥o½÷…êáÞ§8øáÏëñ –æÏ>˜õ¿ñ‚:û3æiœÖ{¡W{s×~üGdU—€³†€(^8'¸lÚG€¶—€”RÒGWc Øu&w…fW(Y¼'‚(w%èX¸ øhˆ‚-G‚6ƒaµ‚š5Ÿæ{*Xƒbƒs¤F,÷ƒŠæƒV„C(,:ˆKˆSƒHØbB)HƒIØ„nõ„x‚Ø‚#ö‚#xƒ¸D}I4q2H„ˆƒàµƒ耧…U(†WXf Ø[d8@͆qèhjX_l‚]¸„E……Ô‡ö‡þ©%…’Byè…G˜†FHˆ’†G‡6ȇ‘H‡èÇRw¨vfØ…ˆ˜i „n(ˆ-&‰}F‰ç·3A¸ˆ¹÷‰nŠÿu†ø„†(coH‹¨Èb–ˆ†¶8†®èA(‹—ø‚·øoÄø…Žxe•‰«(G±HŠvŒÕ7‡ÏxzXŒ¡vŒ9–‹£…½X‹=XTSŽ»8_º¨‰¬XŠ\à˜Ž×x€ÓˆFÖÈ€›¨Šö¸ŽøÈ~ûèˆu˜¾8ŽT¨ˆÈSöŽß‰õÈ)ŽV8ùæ¨ŽÐØÉ¨€î¨©„íh‘ÒØç8`ù‹ é÷’‰ËX‰ð˜‰’ñhþˆ#)“ÎØh0é’*y‘!)r5)‘-Ùÿ¸’8Y’¦8d?IfA)‡¹” æ“));I”'i”:‰•V©Ui’\©•^ù’`y‘E)•Gù”,™$‰–gy“ö§‘6t]•¡·j«æZ¨è:®ÙZ®Û}'&]êõº\éZaë*Š:±ê®ô‰­êú˜h¦i¦zs5Î6ªÿªñê±íú­]I± Ûžë1›]ú•þ¦ë· ÑJ²Ó ¬K¬ñj²eÕ°èq`æuHÖ± ›³Ú ®²Aë^ÈúÝêa…`=ë!?û²"»¯Ôú°~´´:ë‚`‰³H;•çÅ.+‹[´…°@ °û£D+³ïZ´êŸF«h»Â±¾’7_ªWøÊ0[³ðÚ¶y;²üš«J±j+® Ë·SÛ¯n*¸ë¨³‹;¯ƒû¶…ë¡úЏÜJ§å¹¶‘k¸GË6C ¹;³Ö:™\ë¹­ùu¨›ºË*2M‡‘¢º$WoöÆ3° re;¹>Z¹€ëX‹²ÂP À¼Â;¼Ä[¼Æ{¼Â›°âuñѺuò»È½Ã«¼3ƒ¦þwoH½Ò»½Ô{ˆ;:Ÿ»µ™K¸¿X#Û{¾è{¼>Öº;¨I÷qé½Çeo7•oé¿ÈÛ½¸x¸V«G½+°iëhæ‹¿Œ¾Øk³§šl\¼ŠUȶÀÄ«¿Èø½T•µÊ¸¥Íè¸Æ8ÀÜÁÓ‹¶´¢½,Á/(ÂL‰»äª»ŒË»Š+¥ìÁ' ÂTbŒˆhà ŒÃ€¹¹”Û¬˜›Áz+‘1,ÃÌÃþÚ3:\ÀHŒZK|Ä·‹À?Ü·„Yºà뛵›ÅôËÂ!¬ÅÖk›^üÅxË¿\µ-ÜÿËÅ¢{®~kÆ ëÆkœÄU<¾’+Ź ÄL³m¬ÇTËÇ¿)Äþ{<º},È–Û¾CìÃwLÅœ¬yLÈý»tÌÆƒ,É… ±¤Êȇºš«Éä›^G7«K eìÇ\iAŒÉLÉ¥¬/ Z¿B. ”£ìȳ¬ÊgÌiŒÇ™ Ç9©s·¶abèXÉWû¤|ˑˊ¼ÊNåÕ]IöYéÅ‹“,ÇÄ쿧ܸ»|ÌoÌÍ+i`¹‚`5 Å”µlÍÌœ…s ÈÕœ¸‘ŒÎ(Ìd»_¸rª©ØÍ´ŒÏ¶\²t̹f{²4Ü˵‹[„5‰ú Ï íÎ×ÚÏSLÆ }¹IèË} ÌöÊ.Ç Ê -¾ì|ͼÍù¬Ñ-ÒûLÒ†LþºÈÒ–lҽɼÜÉl;ÅV\Áá+ÓÞ¬Ó#ÍÓ'íÓ1=±+½ÂºÌÑM‹aœÔ[|·%J=t²¨º ùÔTíŦ›•@}Ô mÊmÄ^ ¼„Zr6JOŒ¿MœR=bª{:eýÕn¿‘ú²7íQìºÒHýÖ2\3ú5êÕ »ÖÍ%i ¿z}Ø\Îx;×½Ð4ÈsÔÖˆ-¿s»#½Øô»·sr“ÝÙÒÊàÅØÌºÌç¬ÕÇæÙPH’mÀŽ]T«Úo­lùê¶þ¬Â«Æ½ ÛñK¨¯ Ø­Ýb¯­Û{ݧÿ7Ô·]Ôí\ÒáÜÂÍÛ!ìÛ¸KÌþ-ÜLìܳ-¯.]ÌïlÚ XÕT}*UýÛCæÝäº] ÀwýÒF­ÜÉ×[ÍÊÛÍÞ‹¬ÍëíÞé\ˆÆÜÓÍÉu¬Ù‰,ÚQìßDMÚé­Ý0ÍÝŽÍ—Lßí­Þ nàõíàï=Ø÷ьʮà.ß~ÏÙ­ááëŒá®Î%ŽßñmߥÍá+®âüüÑNÍ'náû=Óý]Ó,MÁt-›-.á1>Ì?.’=.â3îáÎàE.ãA.Ë Ò!âîä#ŽäKnÎMÎÕîâ.åIäȬÊÜÒYÍâWßYîãCåóíÂ)ŽæeNáiÎåU•5¾ÓB ãqŽåO.çþynæ{®çQèkŽÆùýÓu®ß7ÙÇMà[.è»KèmNäsž—îç•çonâŽË…Ô‰ÎßµmÇ.æ‡nè7kÜgÝŸnã¡.à‹Nê«n秎癎âg.é}Žéné].ä/®«ÖýiÎ]×eYêžÞê8>ê:ÞØªÎ·áìÆŽà»®ëc®åÕîæÓ®é_žeR¦4êªí²ðön Š©ÄmÛ©ŽÜ½ÎäÙnëÎ뛞ÌMÖ-·óLÎHzÐý•¦ÂÐíôŒîÝì½ì£ ëÈ®èéŽMv¯vrÛõÊfv©ê>é¦Yë4ëˆ~ð nÓõ4¶üÅ_qMΡåþ_õÞ²[rî¢þêàÉÎòÿ,´âýß_^cJ¶#¯+¯¬©û>ñµÕòR ôU%ð9óçMôþìÞ¾cãÊaZ5|òOZÙ/óHóUôŸëÚþëTþ,*ï‡BÝ?ðFÕ[ñF~ç$®,aï½gÅWŸðe_ôYöŒ~äl~ëjnñ¢¬öJÎõî~é]ïѨ¬^ÒíµFˆøã¥¼ŽÈøèø’Ÿø”Ÿe “´{¯Ø–ÿ–•ïÚŠ?Ñ¡¿‘ÿ„ŸÜ£‡é¢ù®ò-õ¯û±dô˵ûò,õ´oû¼?û}ûºÿû½ïûßûÄßû»ûÀŸü²oüÎþ¿ü¯üÅüÇüÓýÒŸýÕ¿ýÏýÍýàüÑÿýâþÖ_þèþä¯ýÌÏüLÆúœ>òÜOýݯþóïýí?þõ¿þüŸÿø¯ÿñK @a4ˆ Áƒ >\±¡D…-NX±"FŽ7jd2cH‰IޤXR$Ê‹&S¾l¹òâG•0gžŒY“åÍ.wÒìYXÆ` Eš”a0…CmúäùSgΠS;ÊJUëÕ§2¡~õŠ'תe£žk5kZ³d·†U;víܸ]뾕›×®Ô½x%:m©Tð`‚ FœXñbÆ?†YòdÊ•-_ÆœYófÎ=þZôhÒ¥M'&œz0Ó€ÑÂm Û/_ÚgéöuËvö뻹o׆ú›wl½»uûî}\xðâÃw/—Ü&ôäBKªÆn°(B×Ê›3ÇMøxàÑÍ??}õðëÉÛvo\l{úµÅ˯ï\ºýøû/¦¨ìÔn¡î\;Р[cÁ’T0B ZÂÿºÁ ©Ã -ì B AÑà ;´îÄM,±C×6‘DetqÅ[\±FCÜpFqÜðFs$rÇ–bô±H K2I#‡Ü±  $pJa~„rÉ,;B²Ë½Ü K'µ“Ë/Ï,±Ì›SF5c„M7ÛœþqM9ë¤Ë8ÓÌSIÙ¼SL8ý|3P }²Pš’ÊìÝsNDµŒÏI·´“ÏKý“Ð>}qÓO)õTÔ;Õ4UI™,UUK]EuUY_íTSa½uVjÔQÕ4×{S:mUW?‰6صÕU,™•6YZ–ÌbˤVÙhgÍÖØf üöZg —Ss—õU°°…¨ móT¨ÒsÍr; …¼·»|ûÏÚ]7dÊ0ùx,×D(ÖuO21`.×_‚2Øá~#Fl⊠ý×`ŽúÍ1dy)Ö6ÐzÛMª ¬\yÞS'²7á 1ZXdS®6£3þmHck]f• ŸÕÕóç…1øã››ú eq™TZ;™H~ºD+–™j¨Y"ºgžúÚ¢+¥FÚÆ•Y6jmtÉ©j§G¼–µî»â®á´”wïgGòkºâŽÜƒv\ì,OüÙ° ·ùðˆ^˜ñ¿—„¼V”›V½#»!Íñf±s 'xìÑ=?ÛÀq'Œ=¢w}u^°G®œÄ×ÃÞ|êÅ//°oÁ½åÜCÒu÷{ùàSG\ÆíN>¾õÇ•¯µyä…}u—7\uÌEÛpߣÖÀòg7½ú‚µ·žÓîC5z}Ç‘^ùvìPËÒŒôÞžü¢'2áÅ@è[ZßþÊf@Úa/}õZàóH¼ÁÕoás ýA¼ÍOqg»`åÄ/¦°MœC÷£æƒÑÕ±²FdN*â?»™PN¿Ã™ cè¾»ÙχtË Õøvļ!ðƒß+ “ø?€1ŠBaégE eyù«ž}&Cx|"œ¢Ù‚ÆDÑ9±‚[¬ Æ.!+¡QD32Êq‰ûbTew?8)|'ݳH³Î†µ;X ùؾ¹uª)‡¬ß õ˜CúÍn‰£‰­Kj’^k &×HÉê’’Ìc"ý˜ÊÏÕ1(¬bÙ"·É²w> ùhþ8FBö(˜¸Ì1[ 1‰ì}Sæ)ÝtÌÒyrx•f3•¹z¡Îb©Ü¦*¸Ëjs†´4š©IJqÎr_æÄ˜ñÒYLUñ¯'¶|£4õ¹4l¢.]ÞdW?…õO!ƨ[û´Aé¹½ƒºóZ Ýä“úËcôR½Â§Q ŠP‰Rt uÜDêª:”ŸËD©ô@ÊP.TwM©HSª®’¶T¥MJMGzÓ™ús¥Ö“)9iúÓiÙTŸ:íéÅvzT¢4©.EªP ŠÓœ6µ£K½WTCÉS©~Ô¥æ êVjU-… J…)9ÍúS­žU‹T] Y·´Ö¯®¨­6¤kZÓWþ×Jæ•£Z“+·ŒšÕÀN« -,Z᪸¿ªu°ˆåkL[®»Fö¥]…jb{XÊj–«b%¬eƒ‡ÑÅV6­~u¨i‹Z£ª¬“ k{Çڥʶ¯°- m%»Ø¸Š¶X´}ê[MêT̲Q·Žåll=»×à2Õ·ÅíPŸRÞöV¯¿nE§ËÒäæv¹'-®s¯ ÝîJw¼Ô-¯vÏËÝê 7»Š-d× Ô÷’ô»Œog·KßôÞ鸣­/¸î›Ïêþ»ýµï~‹Š`+˜¸ùU®ƒ¯ÚÜÐÎwÁ–ocÜ^÷2˜¹á­°†ŒaýZøÁnõ®„Ë౪x®,îÉËaþ£—Ä6ñ„AœááêÂ)ÎñŠ=ã¿õÇæñŒÛ[cöî¸ÄI¶±“q å&Y½TæïŒå KyË=2‹|Y+ûwÌÀ /“³ìe$ƒùÅC¶ë™ag –×u³µÜæ9Å|†³Ÿ—«æ.—9ÁA~󞯜gʹÎfó¢ûlä?K:Д´œ/ÍUF÷Òf~4|yKèg:Ô›U4¨­çH«šË¥>u‡SêVúÕ>µ¦gÝàUCÚм¾u˜k ìNÓú×-îµ§Mlcç:Ö>6‘Ÿ ÞhÓ™ÙŸý´­‹íe;ÑÃF¶·Y]à•ð͇¹ef°tþƒ×‹gì.šÅJjg›Ø“&³½Ã½mhë[Ú׆6o%fSsëÙ0˜‹b"Äîÿ¹»„þÆ/ÄËojKœÖx·1.ègÓ[ØÕ&¾a†ð”±»† /ŒÃu&WyûtÚ︮ÁýoqûÚâœùK˜± Æ“€ Ÿ˜ËFgn…GÒ0#¿ãÿR~!“#ódó9Wîâ–{à×xÎ7ýác:æ/'°À{òƒ?<åŠQúÒQ^BŒ‘|çãTÞÓÛÎ4a½0sŸ:¢«žY°{àÿvµ'®õ]ï›ðí%ûØë&Lt£ýîK'À ÿø·'íeçùÙù·xxkyïÆ•¹à/~xÑãþ|ÓŸoÍE½ØÄßóB×<å>ÎOžíugºÜ__ygª½ó^F}ˆ»žï¬Ÿß\'ýÍ‘oü;×~óïæ}ÏeÏù·7<éR‡;ôí¾ûº'ú¥>“_üÂcýëW‡ùßC/vt‡Dèß—Xâ‹^ô Wqóô·}Ü#YnB½è>ÿ½ ¿'¾œ²<>‡c¾ò³6Õk¶Ò2&«V)»Ú =åS@ä8õë;â;?ä¶DÀ;ƒ–ÿó¶°ºÖº@ò›¹ôA<?ŒAD¿°ƒÀ4À/›Á¼qÃ@ÆA ½lÁÁ#BrÃÁÂä·´9?%̧ ,Â!þB2µ²ñ¥x“BY«B¤Á4¿?öCdBsBe“Á#ÌBiA›ûÂå»Â´:ô“qò¢0‰Ã%<œÂ4ô°5|@¸b D9É£›Cš½Ú@\Á6¼BÔ¨?ýÓÃï°4<ܺ üB;ÌÄNÔ¹‚Q£=„& éÌ»¦ßóDW£ÂÒ£CPœ$8š;ªyVÄÂ#Ä ÃV|ÃQ$SÄžSÄ?cD/ŒÂMôC<„ Æó™3d¥ì³Å?„›[Em#½^ĈÆQD9Å`,´b„Ai”ÄN¼šn’ÒFkÇ]¼EpËÅ€+-qÒ%éÆ=LG]„Ä$DÆ@Ü´µ`œKþüPúÄc¼ÂW$È9äă,°÷ã?Ä)¸t£\ú8p|Ç1ÌÇ俦ƒ—q3ÈhÔÄ‚LHjìÂp É%;y¾’¬HlÂHdÇu¼H1tI5\¿\•m@–„É™lEŠìÉ—ÔG‘LFXt4ŒCŸlÇckÉGJ¤¬Æ{“ɧ¤I4D¹ª å;­ •p¼RüB®Ä >º éJ´Œ°˵üÊ ;ÊSJK_«Œ_†a°Ë»Ä˼Ô˽ä˾ôË¿ÌÀÔË ²;‚ÈK¨qD-«KÁdÌÆìË€ÜÆa4LÇ|LlJK+´ óYLÊäÌÎôL»ìÃB¤ª¤ŒÓ˜Ë¬“þÍüÌÕdÍÖ”<‡<ˆÃÆÒSÍÖ´MdâE¬Íϼ‘Ì´:}BÍ5±Íá$ÎaÍÏb=Æ8É2sŒâtÎçÜKŽ9L弹݄NÇÌœRAŒál ¥L¯æ¼ÎðÌã„Ç«Ê9´NñTOÎl’Ú È°\OÊ”@XáÎ}4ÆêŒÏü”ÍÝzËŸ ¬ôÔÏåËöÜO¢M Ìùœ•Oû4IøDÐø$Ojs6¨<>P%P¼,¥IÌP¿TÐkÁÐÆœPìÀýPÖ,Q«Í Œ.¶„Ñàô—¯¾ — mÊŒ´Q®¼-tÑA R\Rw,R¦WA•Ôo’E@Ê¥F’¡hÀT4Ð[M¦LF!–M-;Å2<þÔdeS^DÓ¥ì¦`Z°q£ƒØN’¢£t¥Ç‡½Wc¥Ó~…TŠ=W› Ô€J÷£×w²éƒ×RÌÔi#O-šÌK×l†ñXnØaåW˜Õ×|ÍØT­X2=®‰'Ø”Hþ»¾xR:¡ËNpZ#OÕHž“UuÃXU7+Sš»X!­ÙµÔi ÓªuYGµXS½Z¦•X­íOíÚ›EÈoýÕ²%WpÍZRÝÚ3µÙ¨%R¬}S®Ó™5Q¯ W…4W}Œß¼ÎpÊ¥%Ûq Ö—EÛÂÛÃ%Ö³EB¼MMõÛ¡áÍÀ•ZÇÛ­ÜÁý×kÔØ>&Èå;6BÑÊ|ÒþËõܵuÚRÅܸMÖ½]ÝÉÐÈ-—ÑÝÒ\¸5R¹½]º½ST¥ZË Ð½…2ŒÉµÝÌÅ]$Õ]äåÝ}õ]œŠYNÞÔs—1^7ÝÝ×U^àe^í=Õ©…Þ#eP¡1ÂСÝè¤\ÖÕܦŭ§mÀäýÞÖí\qE’ÈÝøÑˆÍHßÜå^õ…ß±ýߺߌŠ^ Â×÷ÍCsßò¥_öå¶=]Ó-×ùU[ ®àì` nà¯e[™`|*àÍõ^n^ší_þ]_NÝ-=áBqžìHÏSÝ î^öß¾ÛÁu]—ž™y:ŠéÙot`†à Î[ÆáåÜa$~þALÕ’ýHb,â•<â ®a'¶`Æmb,6ߣÖìœ× Ú¨óY×ãÆ5#ÜÅíÖ%Öb öbØ·ÅásãkXÙC Œo4;¦bnß~ã,ŽãíÕa Vâ[à1ºƒë¥ƒU…›ŸÞ_DàÞ]Þa–_:î䥖Ëg=Ÿ¸!&kRc7>äøMá$nã*ÞI~eà„RþÇT–ÅÅ{Fè»Äz“e&äV&áPvÞ¶¥fä QåwÛHX]ÆŸ¥UfÚ‰ æ ¼âEäöàOþÝZ>—‡ÉBædÆä:n.eÞf#[cÞ#Dç4³[ Üd9Žçyþ{^žçtþYbödp†cm†eÃ]ãîb–¦Î¨çsvçÎäcnaWžão~h¹ÞŠvè{v¹ˆ.fs–hÎe>ÞäÄ-è}–ç…þ膦go_•iÏ´dvV\uh“fe„Þân=èXÆÑ‹ÖhÙéÆè–hCæbEöiÑj–æg˜&꠾ߢ~j—Ög¨^ЦjMæè¨vê”îj®Nä&çܰ†è£.ç²fè­Në‰~i´6aµ¶ç¯Æg¬~k©^«a”¾k¹Îh»Þhºnk¶^i&Vj‚Îé¥FÝAÎfÆÞižfË"-²ög±¦j°&ìÃ6ìŽîl¯FlþËÖ逆lÒ–ìu¶ânÞlÏÖÛÄÆiCç(;i¼žëÌþëÕí íÒFÞØ.X°tËšöëÁÆmãÖkêiŠNî¬â¦0~=2n9¬mÀ6êãêÏÆìåŽkÝæjêØFN;þ$nÛl·¾íæ?·enÁ¨aêXtn%«nïÎk÷žjõ†göînìÆÑfp«íÕá®oÿÞkûNoü>p¸¾jën.ÂÄãQ.Ÿ=Þµ¾ìûFïóÖn çíöÎðÚâãœÝÙ†înp×ð Oð¯j¿n×Aþ~q_q×loq_oÏmïkó¾q!ßþo"Gn%Oq&ÏîÖîíÓ¸…ŒÃ²_ƒ¤“m¥ÆøÛ³D.Õò!ïðþÆqu9_ ýÉœ+ŸÝúÌÍÅ0Kµ8óòvðwñ#Ïs±Jóõ´û½m6ÎÛ¼#9#/O;'ðŦòÆæfdµñOÑè¤s¤¦Åàβ\5Å`têvô×FíYng(ÿéJ/ÐsCÖ?'Ý;WuS_ð=OæâWO ×óUwMÅuô5ñPï`<kßp‡úõëÔõ"—\VWÜdOuPŸlÓ|l‚îéGç7+ï[10_c.‡ua_an×q>Ÿô]—õ?ömLÇvÓ6ékõ›þöX_÷$O÷ Ïw2—rc—qv÷m owøºÞ÷%/ó?s.øÂþw|¿÷s„ïw3wò?ø'xtßxf¿ø;LxsŸxx‰_øq.yŽOymxƒïø&ÏxŒù(y‡Oê)ŸwH§i{_y™¯ùüþx†·v×®wqwlrŸyÿy›oxήx…z”¿y¨¯zÖ¾úÝnz¡oy‹_z¢ßùÈ{x?úi_­aÎy—z¬_{­Ïúížzuüzªçi£wbyšßúY{©œ{¹ùZGr“ï{3ý{¿z¾?|Ãü:²ižOm¼?yÀß{u¯|}oüz|±/ûþQæj{w}‚/zï|z¿{Ÿ{¿|~_ýÏ|¶Ù|²O}¤tÕo{¸_|¨¥uÇ·u®O|Ë}€wÑ?}È'uIÏ{¦~ˆo}Šo~Âß}.w[¸D©¡'QÚK¶úÜgýèWyðgùàÇü¨Ç§ÚÃÙ™f»~3û×ýãçüÚoÿÙBûº‡+çKÚü7ÚèfT+,µiµ~»štB³Rÿb®M»±áÜ—ÿÎæ\Ùögßšokì½XwçÄ¿‰Þùrç›?—>\8ð¨Ø™OÇ;ú{hÕgÏ¢.¨Z|××ã3f5ÞÝsòíòKº‡}±òëÔ+ׇ®ÿ}~Ù½ç_»Í7Ø€îgYu Òw }™…æ‘UY­¡¤¡ihuØlF(b€ÜÈ›‚ Æ· ˆ¦xbd,šè¢ƒÿV"„þ4ާ⎠òh£Ž IšB¬e”V‚•ÞZIƦU5’˜ã‹µX¥\TÖeþm&£–‰eqaŽ©”3f &›Þ )$ŽmFÈå™=Æùã•hvIæƒrz‰bšÞ ã‚tæi§™‡úX'£_â©f]¾9Ú  g(¤ˆúÉ碊zЧŠbš(¨j¦nZº©ž¦ê(¡–9)œ¤^Šª ¶žjª¬­®Ú«›ŸæÊêž­ +g¥¸öY,³ª*û£¤´^•,¯° 좿Æjí«ÝZ§-¸Ö]»-µÍb6*±ÎVä¸Ú–ëê¬Ò‚÷n»â2çZj­u£®Ð>Kn¿sN&ŒþMZqe¤¦Ø†k¬·ÈÌnÃØÒ±µò†6±™èâ›×…@‰…qºè*¼æÈ[ÜÒ…§µbÉÍŠ¼­a ·Ü)Åî>ï1ïsgûß®úW=úK|ßcßôÔ·3ú$nò,t4 fH<©‘MÓ´4Jî_àcTêV´Ó  a_år§@‰Q[5lâ†d“Ä¿a‘däË!ÅH™?[dÇØ¸)NP*#€Î¶%îî‰ü ã¿ø:;žOC áX16VñzX;$á‰È*þ²‘Ь k ãÈIÒ1Wô£݈Jr²“ž|¤_"©“Oz’!¥YèXT²²•®œ$þÈÆÌ™²‚Ƹ%.s ?aä²—ÆØ¥/ƒ)Ì_ÆÏIcIej†©L\^è Ôd©f!^.³šÖ¼¦.‹¹/„Á ›Õ¼¤—XYµî¡rÔô&:Ó©NeBO–³Ì– -rÎ`s˜õ\'#Ÿ)„ae·l¦Üù@hÞÍŸýæ1õ¹~Îó Wd%Åx&NÒ´¢e'D¸'ÅwÒRšjh/SÒlŽÅ Z# kLÚHB±‹uéEUúÂë¤ô¢ŽÄd¡9ɘò4¦7e×, 9'˜þ3þ™ö4*>åDTk”pª¨KWÙS›*Õ§µäA):Õ­&õ” ä(<¯*OŒš‡¬^1iUý P…Æ0“QÍÌR¹ÊÔ´Zœ‚ªâ*×½’´,î ª-iÖ~µ¬j¥«:›i׫âu`|íê¶ôŠÍÅzÔ‹mý‘d+Wì}•£'?Ë£½R©¯\K «õÙUž¶µ”4­kÉÒßeµ'±½-n>°®öbµl<¹ˆS¬¾5x•­ãqט\¨÷ˆµ ërëÙÀ¦Vš½•îlûxY'F—¶Å½cvÝÚÜvW»Á5`Ÿ«Ä4~·jáÍi{#øÔ–Ž—Œ¿çyçÈÞú*wºþêîvcFÝü¶ä50rÜß÷—¿¾-¯x|àw^¼óõ®ƒ±{aóÞW¿Ï­°{7aW7Œ Ž`zãëaLdÃpA^;XÆô¡qCh 9¿ÇÅÁ1qtÜ6SŽÄDަ‚œdúÂxÁ)Î0 „Lc'™ÇÐý…•wÌ*‹@@V‹!Wâq8X]np“•Ì`ÿ½„𗥌e»xÊ,æ2Bê\’û1}&ˆžmRg@ÏY wƱžçÜgE:ÑÀø3£=ç¤:Æt.t£q /ºÒ€ö1C¬ Æ5·Ã«ûð€M]dS_NxeÞLœs6žíí¯Dà—–v¾«c‚k;Þ<õ! _(‡x¿ç¶°Å½Í[8[»ß Oˆ­ùL’i˻ش®·¬§ÝqZóäæöÃðd×zÙˆ.xÍïMò—G%Ö¼n8F þÇ3³YÅ6·Ñ׋tŠ£øÍäfœ=îñ}\$Ï.yŸ­oôÅ ü釛ùzï~Á?úú^éÛz«1üèã}ýÚ÷½û=|~׿ßúWêÅdá·¾üì§þýÝÿ1XüÚüù_ýÁúå_²Nú©MŽ_ÑŸüÁ÷ ~ø­ZöU ýE Xéß÷a ÷þi †ß J Q Zàæžêá_‚ Š  >šŸ ²  æÑþ à™ÑàÆ½`¢ 2 æ`©a2z ò`6 ò!áâ  !*aJra 2á&áâ†]ÑŽlÚ na‚¡Va RáìYáRØ.ìÀDqe©Ù‚[ Ò¡Æ!þ¡î‰á Þ!ð…Z@MçœDj"!*â>a ~ ÷aŸ6!ËðÍÛOó¬GùTbb R¢âšâ á+º!HD’þ|D;í–,²"®â!v¢ b¢'’rb–a,Íê8Oþ /¦bþ+6£ ""4Ê¡ƒ#sý ›MQ!ÖPíìxù.£3îb.öb1¢b4ú¢+ãZâ~…Ó¬Þ FFÜ9–ã¶#6B¡Æ"9®c1£*æ£@d@RcšY#“à$>£A*¤ê< Îl#:äEÞ`FJcDZäöc§$D&¤G^"H2$ßaäGª¤I~ŸHšã"Mná–ÔtÒ¾ÇLV‡#iKNŽ£:J$ ýâI¾ã)²Ž÷d–f1Óc”’`Ødg %B5åJ‘(T.S$bÜF²ã4’áKîcÎÔUjVÒØäv-SvU‘íxËN"UEeeÅme:>$L~þe5ž—#%¥7U¥&îG#ù”(iÒ!Y•OÚ%Xvä&ößPv˜Xòådñ㋌eaE$e “\:]"äOz%c²dš%d^Sf6‘D¦e¢¦"f^Jæ0~¦FÒŒæ\u%„\&=Å!núRiþ^KÆæor¤åsÍ$MÚ&lÝ–næ3*&q®äkj#˜Þ^•¶itΨš¦é”žéžR)“éiŸ–韎i Î©Öi—ê†*¨’:(›ê–òé  j¡BjÞiÆå¥rj¦bªJ*Šbh¤z*Žb_yÊ=Î%«ú(¥¢)£Žª£ºiÀx¦6&â´É¾H"ª:iŠv*—~ê°~iþ±èu¯«VΪÖê¦æª­¾i£jw²‘Ô`‘<¢‘–é%+ž.ë©Jë¡R«±jj„•¯Ú£Ñ€È¯’FÑ\ºk©’jº+޶hµjk}¦Ø½ yt£éŒ+lä«©®ª¿ÒjŽÒéÃNkÄ.(ÁŠ99ëV8+)>I¹ªë¤V¬®þœ ì£N캾ÇÊ+ÜtãÊbl#v¡µì­J¬¾öëÍ:lÎÞ%!‰’n¹¦ÎÏ: Ãò«Î6,²‚lª"*Íbë¶ZªÇÌ«F… º­Ñ&-ʆ,À¶+Ò¶*–f,[ ™ªbíÎþ+¨RíØš­¹†j"fkÍžlÙBìÖîþëÌríÕz-ÔÂm×ÊíÙŠ^Õ’íÞRìÜ^i¯ÉèNB!OomÝÒ­ÉŽ¬i.ªÓÚlà¦ì“#Â:Õ5§È^ë®JîçºíäêíÝB,Áм"®è$ãa®-Ú2­Ý6.ÎV®Öö-Ý%ÐÐÏüð!ý,.†.®>®ç’,è¯èïÀ:=.’ô.ç®ÕÊnô oÓ"/éJ/ÏJ§F½ÍüdO–"ì:îÛBîp•ìøoä¦gÏzU@©.ïŠ#ø²«øŽ.ùžeñ¦o𞯉ö¬áÚ îKâcçV¯ñæ/ý¢oùÞo«oÞÖ¯ )°ýoSné ®ín[Û°õ:°jþAðK0þR0öâ­Ÿ‚ðkð_/õÆî Ïï'ªú§ Ï0 ×° ß0ç°ï0÷°ÿ0·Ò&±1'±/17±÷”7ëO1W±_1g±o1i†ànr1‡±1—±“¥Ÿ±¯1·±¿ñG±}1×±ß1ç±XÑñÿ1 ² r˱ù1!'²"/2#7rnö±#G²$O2%G²!Çpg²&o2'w²'2(‡²(ëp‹p Ïn§,ôn*×®ëúm)«°þ²ð,»p s°uyp3p £pËòð/㲉érþ.󲢚pûò ›r-£òóí+ßn,OfÿzEò<‰lâ´òÒÊ/4Ÿòô>ó8ó»~­o`îÅI@«ÂŠ3+G³O3‡o8“söö²ÕdÈÜxŽ •7ËM@ß2/³3›³-sAðÓês¸ˆâD¼o8ÚèÐî70-#ô=kt9¿ðþ6°NnPDÛV"’EkÚJ³Ò¢´=w4A´CW ölÌÔ 4?U´7³48»´B s3³GŸ3H÷HiS®ýlÓI+kJÏóJ3uKÇ3<“p2c‹Ð¢ŽÏ¾ªL&®<«ò‹mT«íSŸkS[.:K5>‹uÖ^ô*«uÜ:þõZë´}tP'ôO3™s1+3C'ïPgt]ot`óô]/ô.3³A[ìYãä(7¶c?6dG¶dÿpY‡ì‰ÚV%g¶fo¶ûîaûuL?%g6i—6WöE_6è˜6k·¶k׿NçsUGÖk×¶m¿¶gsCÏ6OÞ¶oÿöfçö^ïvœÞ&p7r7²pç527b%7tGw/·Ý5·«·tg·v¿1u“žbÿµˆL¶x7y—·y7j˵j“uX«t\Cul»õR³w|›îb»÷[{5=ƒu}Ãu~»òX³íõKvÛubãuu#v_whût‚¶nÓõ v…v„þÃ4o+8OxZxO/Yì.=*5U*TCJøpSxˆ3ëƒx¯¼ê‡cxƒÃÑéÔÓÔ4)vOiL ‹6„×8 _· Côìø¬ê†!ŒyñÉV8“î2”­„ާx6·8á¾8‚{ŽQ;o’ß$~Ï·|ðîÇØM9MûšЧ¤Š37ƒcy¥r9ˆ÷xû–;‡ùŒ£5GãvEHÌ”šOù1®àgø’#º‹oøBÎ’dÏMï¹|çô§(®WzJüŒ1Ñws8ùe9“/ºs#¶?ËãCõ¨+ú|Ý"ìØynµî~º§ûxª ¹†ú÷M÷üsèx¸.NzWKÉþˆû/Ðõæ~¯κ¡×ºœ¹úéõH'û›/ø¡Ûz¢[;‚cû–3ú•‹´´wûŠ3û„‹{¸+û· 5Óx³ƒ;œWûº_û»g{¼o;®ƒºkÝÍk¹Qãûh¡yóõ¼«û¸Ï9·/¹0Â'¼Â/<ÃÃ%|Ã#ü% ÄG¼Å_<Æ+üÃ_üÄ¿ "óe› |¹O{§;;*pÅg|Ão¼Åw¼™¤¼ÊǼʳ|Ä»<‹||R†<ŸöÎ_¸l×;ù¼ÌKüÝp¼Q=Òc<ͯ|¢à<ÇùÀ“¼¬›|E¢|Òkü$q¼_=×/<%i}[0I¬Ø—ë<°Oõ˜Sþ:}ϵ½w½Ã}Ë=ÜwýÒ3¼Íã‰Ó?Ú¯}°³õWsîz ¸ýÐß½×Ó}Ý_=âk|Óƒqßû7™¿n›5x×¹áË|ã'|Þ“Oæ/~Æo>Ñ£ÍÞóUäëw€S>F‹:‘3óçϼÜ×¼âƒþáÇ>Ó“>ä|Ô³;µ;xÁÛõ½ŸøMé;óûðû;zCýÈó~Éßzë»ûîÃ{ôËûô×¹ª‹|»û>ÐK=­›»’{ö{‚Qÿò£ûï[¿¶cï‹¿02ÿÔ»÷S½Å˜oŸ§}Zû½ÚK>ÛþêÓûóƒ?@û5ð—@‚$¨ðW°„.„ÈaÄ)tøþP"Ç‹=~ì8²aH‹'Ob4™‘àF’*I¦“¡K”,_Ι³¥Î›+ÒÔtgQ˜Eeö yô§P§m2•êsªRˆW±fÕjµ)RœF©]vlY’QÉòT –kÒµnÙž%Ú•nU¨iãæ…{­Y½_áÚÜ ˜ðܾo ?å‹wð\¦‡ÿ:Æ+xkeËwÛ,×oãÌ>!{ö*¹mâÑŸC†6]w2ãÕš£FLólÙ›k³îüZ¬íӿ骦;öeã•…ß]œ8ìÕÉ;Oízørèº}3_.]ñuîÑ{7§Þ½:o¿‚Íg\ž=çãï±z¾t{ú???¿þuûý¿Bï¿ïJR.½¼4ð?ùv.ÁûôÃÀ ÃÏÂ!Ü®µ$¯Ã äÂé>DõDmÀë+‘@QÜC [qFí.|Æd1F }äñAKÜQC䑹“’IâŒ<0° òÆ')ËѸ(mÌ­J%kêRH*¥ ÓÅ $³Æ3¯¬°ÌÅü2Í6oä’M/µÜ2ÎçLÒ¿;ǤÓO3i´O0×,TQíÞ,rOÕtP9ó´ÐÎE ETRLÑŒtÑK‰,êÐ/ÿäTP 5ýôÑÛFm8P±¬>X;=•ÔLŸ¤ÔVWQÍ•OOCíXÍZ]57_!þÝÎI•õ8ZO-–ÙðeuXþ mòÚ:ÍOZS­4Yq7 6VgõœÖZeË­ÂoÍUQÝw·Í.Û@ÉUu^oë…²[bÑM\|S ö^]ó5øß ~qa$ vx_€ÙÕw`„ÞêàfÆöáµàuWØŠù%Yâ‹9ŽØã‰V™[–!Î8«F±¹(;>1Þhû-õgmM^åq]¶÷ã‹~ùèueÖ*›mžSâÙ!žÂúÖD‡&øëvƒ±i¥aÆùlÓfºg´Ÿ¦7j­xözì‹°¦Hëœo¾[á¶§\[h«[öûä°16ÜhÄSVÜiÆ‘ž¢¼þ¢ºo¾ë¶!Ë ²üò®-ßZóʱö|s/ÿ;î’ßf{uŠ[¼lŸ‡r¨“výv¹%¿jjªÊœïàoÎüê¾Q¿ùø—öžt‚ŒwÞâÝYÏ]vÁÍŽý¹¥×lÂcæõpðÕî"—’©j¾Ù_Èóâ•§Üý¾EÞþö«–^uêa·~{À³ç¿ïÍ?µÓùÜ&@½®pæÃPú"²>âísì[žQš‡¼Ë•NƒÄ[Ù°G;ñ-ÝS૸@^Ï{áãJ¨B †Â ^û(ø<]0kðÃßH:òŠf¸[áÿ¾R‹€¢jbp–èÂ(뉙rþ`C8G:êσ6Ô¢ü>Bµú±ï}?ì"§È¨4‘w'„"E¸Æ4Zñ…¶‹!íÈÆêm‡‹$¬¢›äG) ’Š!dÃåF:‘ ¼¢û§¡,‚°…N4$ ©ÆLB²pu<à[ÔÈ%Oæã¤79G@¦2“‹d¥(UèI*r•°dâ%qdJU†’ò²å!{é³;s˜…¬¤&iLZò²˜#;¦ó¸K/%Fyñ"I¼¶žVÖ2˜‰H2œ`#ø Êpðƒ!a ?¸D˰ð…1œa _X¸äý®{I+Þµ¼ûåJpK©]£À-FÆãO˜Æ4®ð†qŒã»·Äò ªˆÓ›ÖK÷Ç(öçiÌbÆ1VðŒke /*ÇUÎðŽ»5dèæ×Çõ^’MÜ^ú²×¸ ÖÈ’ l9'/ØrRv³2Þg9[ÎÊu^–÷¥åþηm^Þ˜}þÝû²·¼hp“ל (¿ÙÆT¶s•ñ¼:=›y¨]s™Çh.9»’+´¡_LD'xÑŒ–ð­ã vÅ—ž4põ«iþR:Åžf+¨C=Q3˜ ¦®1ªS­áHSïÕÔµ´¬Ok" zÏGþ/ jD¯¹Ô¾žr°‚­êæ ùð>ö²7=hpÏ:ÓÅ-¶z[l1÷ÙÕÝ66§Û_s»ÝÐöóø”½er³[ݘæ÷¸“ýmÄž›ÛòÖwÀáÝo‚³ÚÞñN÷¼ ÞlfÓzÛ 4À×Y‡7\áßEr¾%îfßÛù¾5ÞñˆS|âå8½ þðƒg\œ$‡!ÈY.þrŠÛÜŽ ÿ¸ÉsŽòšoüâ3÷wÊ1~ô¡«\愹Åqîí„'}áðmzÐ.î—¯\êZ?yÖGNô¨¿ÛëX§9FÉ\õÐrìag:Ç©þt«Ã}ëWïºÛãÎözýëgÇíÛùþó©]íÃÕ{ÌéÞw¥£ð>6ß;ø¿çÝîmß¹Ø~÷ËZîk¯üÞÇúÌ[ÞåŠ×³àË®ùÒG¾ð><ÔG/úÁ;ýõs‡¼êÿMøÎþóˆüãCïûàÃ~ö¬ß½ë{O|¯£þ¥ÜØAçùÄ¿öÒ¿=ésoz¦Î?]s2¸3õ$>¾ù«Ïûéãéu×~þí§ùëÇ~ûçŸ|Û;¾wžëUPsŽx,Œ°Jtˆ ʃëφoÿbOø"PùðN÷"n†Kz^‹¡à¯¢ô ²èç‡\k‡§nn!°øØoé(Ïþdoù̧†îg%¨onhˆj&50ˆJ°±ì«óÏ%Pï-°é0P‡|‡Œ§}nÐ/hŒ6ÐŒêºôÏú QP ‰ð pI°(¶rŒ–qêñm Õïú¼póZ‡û®F§Œšð¶æ''ÄHõ°ƒªð¼„åð 1S¯¯¸ Ðp p¼zè~Ð ë qõV°þñ÷îP]Fgœ$c’¾, ßÐ/Ñï OÑä˜ïƒ©SÑW1ñ^Qqò:Qyìü‚‘þrÑ=ÍtrJª¾èsƯ“6Ñc³L§‘‡ Ÿ­¦êêƒlКš•âÃ1ûj1¹pÇÿ”Ê‹g¡h ¯h¯Ñ[± 럑«ÒN²ž*ªh oâêí)é±m±¥1Ϩ‘!/ªi•ë²j‹hæp!%­!3ÒÒoqö¢©Ûq"r«§eñõ±ùqñ1³/*(sæª ë²,òÒ!²SòÑ1aQ&5'§þ¶Šªn2' ò%gQ#‰M#£ò!UÌ#r'7²';ò'?2(aR¹)UÒ)÷q¯0O,r%ÓÑiO+yÒ*}²læl.é².íò.߇,YÒ,]Òm#ß’+“/ ³0 sÎŒ!1s1³1ó1!32%2³2-/+-»ò ÃÒ+­î2A34ßg2I³4Mó4Q35Us5Y³5]Ó4E36CsÕš²ôv±Dd37+ó5y³7}ó738…s8‰³8“5u39 ³%Q9Gó8¡3:¥s:©³:­ó:±3;µ³7³Œ nuº3<ål;ɳ<Íó<Ñ3=SS<Ù3 ¨þÓæ¦ü®±=éS=íó>ï“>Û“6ÇÒ6;S-…RuC?Ù?Q“@Å33=³?cò?õr-9q)ýAÃóA”Ë2wà3jäs+¡’ü¤D3+áÒC]ÑAô+Ùò)±r*Ý’D3.O´*cÔD5ó*oTFsÔF4-‡E1t/5ô,{t3-TE#”EAH•ËM²_ª6ƒB¡QI‹G³Ô½ü/²â «"Ê#ò¤þ\´±&P¯ì¦µÿ°@‘ôJ3ô=.«”q‡X‹¡js ò6éy$K0 Sç± UG·”Gá”JÝtN=‰çئ"k+" ð +þÄOYÃ(ÕG ] PgŠQWÔQÅRgiQÛtTS J«j®KÕcFS§B;uJA›D5IIÕPˆU}4E JáïK#*WÁSý‹FE$uÕ&Y*J-+X«ôBUHé´/•¼˜Ñõ­Ü3#”µÖâó? ÕKYµ®Ô‡¤Q·UKßÕ]tWå4“ðêIùt]õYó4©˜”.œ”±²¨RõUƒÌ00?T£BTaGÔEKt_ºT«òðƒ ÖµÒÙ˜µEEôE¶FVc–c7Vÿ•W±õQu^SÕd­”9urI3vG?Vfat"(t9åUXW¶^[ªÊ¨qh•gþ­UUo/ñ³hï’//dyjŸ“1ã¬JVhiíÒ@±V=­¶.CöakÖ=9½S­Ê´á¶–.³6mÕvm§ólç2lL‰âÌ8£vCeTt“mõvoù¶oýÖ’³ß,‡<ÝsjùÑmóowqqå nëôi‡³nû±aGÖqç–q5÷51wlûja›Ö®$÷@Çš Wi_v;7lósuöùRVg©5ŒF71£vVOwHµUe}Ôu%rfxãUQ©ég#'h]VB‡Wxy×He×y«5N“yQWy›^¯7g£—^“÷M4fƒ÷ki¶c6tE¶k=V|ý²þ\-}Ë׫@~Û×|½–|g´lÓ7T`ªÈÞ÷s»‹sh’R‘Òû^÷“˜V~Ï—~‘}Ø6(–Ø“ÉNa+"ÅOLóµ Çwdó—ƒù¡’S6 Ñ´Ò6Ø} IR·æKCñL¢Oð„¸7kûÀwyKR]aJRC¬ƒQØ{X•ždŠ®âY1âO5{‰÷y±×?oX‰%"€¡u$M8|íˆ)Hˆ½5‡P¶чg8‚k˜*Ad“Q‚æ)[n{wvWº5gÐ'kÀtg¬°~=XŒëx94Duâq$öw¯µg•ä^u8ƒUV¿UAqøŠ­øŽa¶ŒÇ7§þjPw¸‡i8ƒ&b?ubÏU‘·Jƒù‡G9Œ#™íøŠÕ·‘!¹”8•My}÷x~-¶ñø‹3Y—sùYÙ‘9󉙨4Ælb•}¶€ç˜ù…åL“{—e8–õønã7‹ówJw\u—'F×;O†›#±{Á–uóq xš%X–©ùƒQŒI‡21Llf1aøZѹ4ŹFî9›m<97Î09šWy˜—¸A…™“õŸ'“`E…›ó¯v[ÓxU*÷WdZ:ÕYòÌùdK5vZ’­Ø¡Iw¦"Óû ˆjÚ6›¬i¥ãdŸÑÓ$å¹ozŒ±q¡›¹VþQz¥˜/$j7úï,Zl4†Ÿ‹šd:::?ºC™¡§º¤ã¹š©‘Øž—:Ÿ‰vpO³ŸÉ¥½º¢3×5Ÿ9¼ršÙY§I–§UD\ÚvñtÈÙ›³œiZ¬áæ®ññ©‰ºtÈ EÙ•I9˜MڰŦӉ™ãº)lš›e™ y¹­Ù–qžk¹7›°K³/[³Ýz­G±¯´c˜´3[±ßYµ{¶×™–­Ù–?[´}™ª[ù—_Ùµo›¶3Fªw[·™·Û¸gÙ·K›³kÛ³—[¶“øy›: Ãu°q[šYû´¿7±‘ûµ¯û º¨i2)g[¹[»þ»µ;ÛÓ½Ÿ›ÈLg¿¯©eª¾cû» Û½ÏÛ‰¹›¸{[¿µ;ÓrÕN)º²Âô¾³;·º‰­z½M[Á{š{ÍRóGbÐ"¹œ»Í;À¼¹Ùû½œÃw.‘q²„oµ’C{ÄÁ;ÂÛ¸z©÷›S·Ã!\œ>' [ü±¥·z½—¿S¿WœÆI|iâ["ýø!ŽrÇ)»ÇeÜzÜÁw¹Æ›\ŸüÇ\{]|vÙ2ÆózƜʩÖÊ¿ʳ<¡Á®«üů¼Wa—N¢6¿WD›ß‹ÍËü…è’ÏÒ¼¿Ï¼ª·zÿiš®ýϺ5¬»¹Xù“Ë×\-æR2ßþv§ù<еœÇÉe»oÐaÓsu®:æšžS'n }[=8ó|σœÅå¼Ï‡ûßÎzr½“VŸÿpwK¯ÔË3Òßü;C|¿Y½¸üÓ³3 $«U“± ¹¥5m9ýxs÷ÎÝrmÝÕÚ7oWÖ…4C‡¤ñ× wÎFšól[ĉœÉ…öÕIWZ…6²}¢½FÔ= ½ÝÚu=B½Ó—VÈW;^ÑÐIñžÑGç¯.=ÜdÞÝý£«9¸¯™ÜüÈýÿâ{ÈGˆÎ ÞÎñÝeN]»üÙ3ÞÌ)Í-ã Ìýû¸£Ä7ÜÜC:Ù?ËCÞÏGžÑ¡ñÞKägÐèsžÁc¾Õ{Ø?œáÇÝ×þ¿O>¹žå}<ÚÏ…×W~Õ‹å#^ê£éÞ»›Ì´~ë¹¾ë½þëÁ>ìÅ~ìɾìÍþìÑ>íÕ~íÙ¾íÝþíá>îå~îé¾îíþîñ>ïõ~ïù¾ïýþï?ðð ¿ð ÿð?ññ¿ñÿñ!?ò%ò)¿ò-ÿò1?ó5ó9¿ó=ÿóA?ôEôI¿ôMÿôQ?õUõY¿õ]ÿõa?öeöi¿ömÿöq?÷u÷y¿÷}ÿ÷?ø…ø‰¿øÿø‘?ù•ù™¿ùÿù¡?úé> ;Bio-Graphics-2.39/t/data/t2/version11.png000444001750001750 2407212366325116 20122 0ustar00lsteinlstein000000000000‰PNG  IHDRXËJ @PLTEÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõKѧg IDATxœík–«8„ñœYÀlD?gì¯g)ÞÞ”Ñ $Pð™(âtsËÆI©¯„LŠ¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(ŠÒ¦±´(¯©X´ŽëÌñ3I1 3O°ä&Åô‹ù|Ę'Xr“Öëó'‚¥Ð±p°~ÇÒÁ"¦` ¹.*¦Ï±*°ìÁoœ^<2é1°C]<2i)®^vŒõqãõ´ÇâàIq˜Bàr`ÕOÅô9– Ö‡¢ ,êUƒõ¥¨j,ê,ê,ê,ê,ê,êñ<u“u‹*Á²ÊüUèiÿ¬BK–ÿVx< ÁêIZÀzzœHA:Ö‘D«/,ê,ê,ê,ê,êé‹R¦`MC°z’°¢üG­ã:süLRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›ÓMæMÛ¾Ò±1fZüý#Õq¿`½`ýp2á'™Žûë×"fœ–îý÷CÛ>d».âøŠï‚u©JI1,D_Qã.Áº³b—__óW–‰`¡ÁëD&aæoëêqí+ËD°Ð`‚u"“0óKB™L°NÄafž`I(ÁBƒ Ö‰8LÂÌ, e"Xh0ÏcˆÃ$Ì<Á’P&‚õ|pGI1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1¶óùd×l?ãBiÅô9Öt±-ÁRèXmÇÿ˜ ÞÝ1ƒ÷>“bZn"ôAýTLŸc‚Õ*®3ÇÁzØ<Á’›“0óKnRLÂÌ,¹I152Ï$ê&ðËÍâG°'ÅôXÓO&üôtŶ1ÁÜÊfšÝtð]•ãŒ`iJŠ©‰yc'Ð~Ç>3á4ýÄC¡ª¤˜î7?ͯýë¢,Xv…ý‰=–¦¤˜n7?!E°^S °LîPÈÁ»¶¤˜î7oÌÔc̓÷x)¡b Û˜`i¨˜>Ç«U\gŽ VXH; ’Ïî8Þβ ëðm¬DMÌóD™f*±Ó¼åÌ&·ýÌëÚm¬D ̃X…fJ©JšBVÖâÓ«EÒ/,@·›‡±úk¦LoWÌ#±¥vw÷¶uºL 6“ue3U «,@-Ì£h,‚UŒ¡E°VuðÆWõ[¿¼ogÁjâ˜`½¥bú¬Vq9&X­â:sL°ZÅuæ˜`µŠ» 8þkŽ¿“Hªc‚Õ*îB°üù™ËÅ8&X­â»?wâŸ10a!ÉñÓI1 3ß4©ækñãSQö ÁZÄaf¾eR{ šq½•ñwh»¾«òoàï/SˆÃ$Ì|ä&,†§ÁÞ¢M°2q˜„™o—4î—âC¡‰W‹rütRLÂÌ7«0xwD‚E°úsL°ZÅuæ˜`µŠ; ]dzºÒÆGk6VíxY½§‡ö%ï•` Æ/Å÷×ú&°ÿîl¬Ö>Ël€u`_²f·ÎÝ’ÐÆŠÀZà^W€•ë@ÇÅæ*°~h¬'ÀÊ>mâׯ!«þæ²2͈')»ëDðñCa&éCá•eº¬ò@ ”„6&XRÀÚüÆ€IB,`í|…Å$¡ŸëˆJI¡ÀºF;I1Ih㇓êsüLRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹Ië…\6»sݪæŠésü&°^\1}Žåƒµ1ø´v˜Ÿó3ºwò³„k®˜>ÇâÁ Ï2îaÁŸq^;ý8ÑäèJ>óŽŠés,,û¿½IÉwF&€5L8¹[˜"œ*¦¨TU1}Žu€5=ãu°‹ø‰&'3D=–OÃCaIëe…Æ=)ÑæXƵè±x(ì4i½ÂàÝâS¼~m8²Çê1)¦òvNbú¬Vq½µ±°ÊCʽyà!ÕŸBæˆ!X¹s¾„œ¯ñÑf9\c[_DO$X+,P²âi‹ì›µ‹Öq9ntô¡µ2ÁÒèø° ²Ì@°T:~,€¬‹žGõ¢z²öX* ﱦÏ,…ŽŸ áê÷ižnà醚ÆÕÀóX›»K°üåj#Á"Xasî4f¾]\gŽŸIŠ©>ÿÚê+þ ª¦îŽB~_m+B5î’ÄIjB¦ïÜ _»YÖ!Ùàí,Ù8¼`j|?Xö²¬JqaLXvVæP±ÒŽéGLØ@uÈt¥YX‹,Ë]ÙËbÖ!¹àÅîÖ€µÜý[j|?Xî.Í/’ó‡‡ùòåpíóö‰vû‹Òn†ÄIÆ¡Ê]b\Ï”ºbüoùÆœ”Ë—*¿+¥}YeÉÄ-³ì,©qeH;°L‰´NÆ·bíNûҔ̗Y׆˜4IeÈÔ±¯Jó»² ÖΩ ô—d+Ë&X5ýD °êúÎ X{@¦`Õ„dz¬=w°üËê, _u,v¥ôK²·÷X–|íH®ªŸhV›Ë L«Êݲ/1XåÀ‚z¬LHXHUÙýä†÷X~SçÄ í/DÕkpËø&ÚÝ!CQ3L|U±VYöÇX{!¹àؘï®Î’­ñb÷+¹Ãpׄcà ѷg³‡‡Ìóé†ÝÒ†_Yû^u–…¯!ÙÇ!qµ7Ú¦6K©Æ{YZ…,ZÇuæø™¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)¦½üŸÏzõçïÍ¿Ÿ~ÿl>ÓӇšrÁ’ž´ZŸŸŽ€5X°²”|>ž$‚õ²¤Õú5òv§SZ”ÁúÑäX$X/KZ-Ö’é{„³]Ž}ßîü›îŸ,ûé%X®7üø­Mqî•´Š)lc]`ÅÌç`p ×ó8øvÀro† Ñ›ò*¦°5‚e‰ZƒeIúì‚åÂS°¢7åULa++}3Ëõ<‡z¬9Ÿ¸Š)lc` ùNf Ö|H[ Þ“/—<¾7iµ""2‡ÂyDÿIïÑ‘Íå9xï")¦Ö™ü«Óaª*¦Ï±°æsš‡ò»ý5æ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7i½üC†wžùöŠ¡¶ái•bkË/öž3ýÒŠ¥`ÍO#&Xi\½~OFÿpê±Lô”t÷¨ØéwÖ˜êçꪪ˜}‚®Û=“Ηö,ÊñÓIë?ixõØp»z®®¶Š…' [ ¿Æþ†¬E\½âlgÀìtƼ,÷k×[™Áïjx̼8ÇÏ&­WòäöèP˜€ÕÖ|Ê…Ç©CÒ-›hµ,Ç'­×òPè7ÑXq¿ M¼Z”ã§“Ö+ Þ'†Öƒ÷ ¹Þïî€H°N€.'#ê¨búk+鱞3O°ä&ÅT‘ß,Tm~x©w¸š_b§EŽ&µ[ø½¨ÛÓºãzõlÚÔ1¨Ì&öv0c¤Ö÷>MãC’@§›3_‡Ý-í·çò`,"äÔX©¾Ÿ,‚v+Xöì¸IÀª<©y¬%îuX¹*aÇ¢ŠÁŠüÕt·õ‹yϯÜßÂî»$‹ßŠ»ÀZ×ÊíïFȪ¿9_ãÕoôÁ"æ—’bÚ3fÏ[€Õ¸Ç‚÷´~Œ—÷ܾÀŽA½ ¬6c,hO Ö À¾žIJ°vu+Xwj‘¶x*)°§wÔø’}Aƒº¬vq9~&)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠéó‹«™ƒÁÍk –घnkARú²üŽ` NŠéT~{#ÏâzÁùzLãïÐæ ê~Ÿf¥2)¦s`ÙyŒ»’y‚f W´¸+žÃµå3rKcRLçÀæËâí¹5w!ê|†Ë­åKoRL×5½W+|†`iMŠéX&VæPhwÃ,I1Ë Þ-SÉà=Üø3«Á»1×_öTpGI1ëjóKnRLK¡ã÷ƒUºØBUÅô9~?X¥ËÃTULŸc‚Õj§{kc‚¥¡bú¬V;Ý[, Óç˜`µÚéÞÚøõ`¥ç”VLŸã׃/ÖÛ“bfž`ÉMŠI˜y‚%7)¦ËòóPøö¤˜®Ëo Á»7íDh$X‚“bºßüÞM;ñcu –घ®Ì?ß´3$Wömß´3,I1]—ßÄ7ídnË)ß´3òP¨!)¦KÁ]î~’bjjÞ$¨˜åD<&.çÙÎ'½7¸£¤˜ž5ŸNij¼áBE¹ûIŠéAó¿³§ó`Ó{,:•=–¨¤˜š›ƒªùžžXáë#Á•S{ó"{3ÅêPhqâà]\RLšÿÝÕ“Þím¬Æ¿PQî~’bfþ‰¤ú¬Â¢xñÁœÓsæÏßÓ#¢Üý$Åô X§/ Qî~’bz̼!XÊ’bzÎ<ÁR–ÁÒØÆ‹`½')&‚¥± ÖX<Ý +)&aæŸHªÏ1Áj×™c‚Õ*®3Ç«U\gŽ VXÄuÞ¸.†` NŠé °¦Ÿ²Wò,ÁI1Ýo~}3N˜î‹`iJŠ©‰ùô d?Ý…º’bºß|æfœâƒKpRL·›ÏÝŒC°4&ÅÔ,“;rð®-)¦ûͯnÆÙxêÁœ“0óKnRLÂÌ,¹I1Ýn>u̶v$ŸÝq¼eÖáÛ"X‰î+w=ß¶2ÍT&b§yËéMnû™×µÛ"X‰ƒ• S•4…¬¬Å§W‹¤_$X€D‚•é-àŠy$¶³ÔîîÞ¶N—‰`µëtÒšôÙ1Öæ‚`"X«2Á"X•q˜îë€N'­JïnÇë-Óç˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠë̱p°>?­6ñùdòû7_Y1}ŽÅƒeÿ'XLz X¿ŽËõ_ÃhÿÙ|ómÓçXšxõÕI VáÍ0xæáfµ´¼xxž Þí¨FøàÝ Vc°0ó¾/]1…mÜ=Xøl}‚%8)&¬t2†—™I'³ËŸn2ÏCaЉm…-ØãhÍÆª¯#«÷ôоl:ÎØ‚õOÐ䡸2Z‘4„5¾ÜÖêÓ[Æ®+—~Gn¨oÿ;û…dû.?°Ö}ÙÛÉçÀÚ|¯ð á7ã^o€Uyrò°–líKÔLÓŽs›¸ ¬õ´@ÝVöw¶Ø¿…¢‰+ó{\Þ—t‡Î;^Å͈ØØ1¨=Ò²Ò{¬BÒ‡BÜq9®Ï«b[ËOËce’¾, c¬ým->Ýæ[áášg’¾¬æß Ó¡ãÆËÌsc[ûŸ¾¬#*%…BnëR•’bº|§/­˜üàŽ’bfž`ÉMŠ Îÿß:ó_÷Ó·Öüw¼ê»Lúý&™sÔ߯/ëëÛ¨,ÁJ¨ÁB+ö-¬®sŒ.VA`þ¨;øÚÎáû[þý?cð{'°á>3øOΟñkÓíLŸ™¶ð>ã:G»vœ·ðæµñœE»ÿ™oäýêr¬¼N€õšÎâã~òŸóÇûÛ[X¢Ïø-XĦµs·òM…ßaÆÐùF[µ[pÆf‹ÛÛ-å&Xyëëú›anò,×Õ„æ2`M]“ëU†Xq‚¬h Ë­~§M.À†ù}‚%¬0ÐÊ‚å›{ V|(tM^Ëmkeqέ¸ºÜ+/4ÿ7]äÁú–…Cü™XÓû®ÇZ ƒ•=`qð.¬0” ŠV'‡¹¨ÇІÕéà}Ñc…¡·Í#óhhƒ­ÍdùFH»÷ßÔÆoë°ùåàý\Òø¸öí® V¼ˆ{¬ÓI Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&XÃêUÿ´ASØÆ+kú)ydˆŠ)lã®Á2î~óãfŒÙ{FÁœÓ­æÍàV:ÆO‰ä¡PgRL÷™Ÿ:(÷øÑ°Æ?Àô®¤´qÏ`¹Ç¬×$Åt'X&w(äà]kRL÷™7fê±’'I†‡Äß•´“6î,5Óç˜`µŠëÌqç`¹ú±§l%H>»ã¸öîǰßÁJtŸy2ôØóN[,±Ó¼•ÏYn!Ÿ qL°î2¬™ª¤)d5`->½Z$ý"Át›ùÐÂÀÊôpÅvÓ§}Üζ÷¶u¸LMã^Öµ‡Âë}$ZM‚ˆ`¬Ê8L7šß˜,‚uÂüÆwô¢N'­JïnÇë-Óç˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæX XŸO1ÿç·îåÓçX:XÔ|vÀ “¢`ý˜É2E°˜4W­ ªÑîì?Ÿñ׋}ì«iµ˽zgÅô9Vz(´ý×ucSaá1|_Åô9–Ö1µËõ\¡ÇzqÅô9V–=Üy°üaŒÅCa÷I«p]y°x(dRDvŒõqG½¤Çr‡B»Žƒw&…ÝëaóKnRLs í±6O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹IëeŸìd'½±óØwÆéE7ÓçX:X?°ŒŸõí·òc„o6O°ä&…dìlJa%cü¬]ýTLŸcù`ų¾…y*jÝTLŸc%`™tA‚ŤgÁšð1Ž©,?„ï£búKË>78ùV8ºç³³ÇbÒ`E§ÜC¥û>H°˜ô8XÍ,¹I1 3O°ä&­Ö‘9#¨ŽU >Ë Õ±u‹u‹u‹u‹u‹u‹u‹êÁ¢(Dµ`MögþIGnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›Snv¤_QêÇn£™?¸u- ªŠés¬¬ß"€eL‘™ÁÚ¼õPUÅô9V –¿ÙpºÅpt÷þqÀÚ¾õPUÅô9Ö –½¹Â_þîo¸0<öœÓXfk XLŠ)»Ÿ¡Y€eL4²"X%Ŕۄ=wŸ|+t´¹…¿ÑõÓçX-XÑé×K¹¿Í`Mï¿£búk«³ŠésL°ZÅuæX+X-/Å ®°ž¾¤ŒÂD°¨[D°¨[D°¨[D°¨[D°¨[D°¨[D°¨[¤,J™”€u*ÿ9óO$Õçø™¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)¦›ÌCÃɆ›†ºéDnð]Îo€ _VA÷˜Ç¾§4®XË„^¼ek~˜'n”áXFRLçóÏ7Χˆí±Fw³¤¨Ñ÷Xa"ø9’ÓùÃ}aóÍ=‚Á ·Hñ½"ém…™8LWä_Ï&,3ƒ5dÀ¦¨"X]– w"úñp³®öãt³ËZŽ>#Ʊ˜¤˜.Èïï=ÏAl5ß͏m2¾³M”c9I1Ï?‰ ¿ø‚ÁŠN7øoØ-“"Ú¸ °ÂÂ\`þ‰ŠésÜXéIEUÓ縰v.ä€.îØÚb!Ë*â€Y8ßÓmÜXÿÎÈdV׃•Ûb)Ë2b¬ÓÔ‰hc‚E°.©±ˆ¤˜ÁªŒÃtX³rïí¨¬L„ñ§j݃yç×Ó‹`)+³š=ÁB,‚•Á"X•q˜ÁªŒÃtX¥S‰«Õµ;Ÿ°Ìf®7 ç{º»K}Åô9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9~XŸÏbÍçã~š~Ð_1}Ž¥ƒõù¬ ÙË’D°úLZ­l”ÁzIÅô9V–%gúiúgüįì?,·Î¿}âoíï½@œªŠés,,w(´8¹þktÝXú¦ßøÜc9¦Â«1¼©¯búKk £ë‡“^Vü¦ßøXþØ©°bú +{Ô‹ÀÊöXáÍaÝc)­˜>ÇÂÁæAx°ÒyeVOI1,müj°þƒõ÷2ViÂ#‚¥,)¦ã` ì±úJЉ`ilc‚E°Þ“O7ô›“0óO$Õç˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæXXµ“Kp¾Â>“b*•"“aöœSi;5`½¤bú 볚Kga†bÄ8f×I«•Îþ-fœ8_!“†¸j,µmÜXœ¤éõI«õIæ„^ƒ§Xœ³Û¤ÕòG®hHÒ>óêy㜳ã¤ÕÚ>m~ÌžxX-8Æz}ÒjÕ€åÎ%T¤fõö¤˜„™'Xr“bfž´nUÙ©IDAT`ÉMŠI˜y‚%7i½L˜l)Ì„cÖ3ý¾búKë§–‰'|;1Iª¾Šés¬,;ÅÒ<“ ›‡=“žËMQ9ÚŸ£º“žËÌ` ‹IKq€&|Œc*Ëáû¨˜>ÇÒÁ²¾%ß G7m%{,&=VtºÁ=aÛ?)j?ÓçX:XÍ,¹I1 3{ÒÒ”Q˜^_¦\&aæ7V_ƒD~> T×x!X'Í_Ó × !I×Ôå\Û<Ö5»þt¾[×´Ñ•` *¨>öXÝèš6º²Çª‹c¬;uM]εêÁû5q×4ƒ,$——`Ý| ¯/S.“0óO$Õç˜`µŠëÌ1Áj×™c‚Õ*®3ÇZÁ²_Yâë³Ü—{á–ûàÖ—UÓçø‚¤ö;Hržÿ¢:7lú5S)˘(WtÖdóÛ²ªfÒçø¢¤,.ðLÖcw%XþÖé†ÑݽãœXÄØciOjìmþv߯iÃ^ VœÁ÷XÆ9‰>#´búÚø‰¤¡M‡hÈãî ì]}(t÷°‚õº¤XfkÈ€uuåïÚ1 °’¿C,ÕIýw1³Ë˜ä­KÁ²×G$ß #'~xG°4'µÀ,ïΚÖ˜ïñé×K3;ÝñXNÅôµñ3`E§’6ŽÀºåtƒÚŠõàø™¤˜„™?Ÿôàõ ºÚø¶¤««7ÞÖ1Bš^a%¡L'Õ {'¬¦ˆ´ÔaU®v°Û¬×"ÒRq¼¬ÊÆ™΂ED$j:,¸1Q¸Øcµ×±"¾ Çâ«V9[ãޱnÞóäuS#òx™. Nª·øxXÇ‚ÂóXv᪑ÃÔKÅ^åø™¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)¦›ÌC§ìVÌM37§ÄÇ"cy‚UÐ=æ±sÁ+–½9%º)žTH†cI1Ï?ß¾3_2&¶Ç‹7§ŒÉI)‚õ™ÛÃD«e9~8)&aæÛ%û¥øPhâÕ¢?“0ó Á* ÞÝ‘`¬þ¬Vq×£—8¬ßܽ„ë‰2ùkN<Ž”¬6~¬ÌEYxRã/KQ¦€“Y]¾ˆ#JV?’´|!iE,¶“„>U¦5N[WÈV_ÒˆIV7NZQþèrèͤ¹íÜv]ó6NðÝ"uˆ’ÒÆÍ“Â-/¼ßX1¨E™áTÚÇ’cPÚø±¤ì±¢ýcuu0ÇXuI1ÉjãG’ºà¤-ì <©á·B'Ymü$Xvá«~ckª1¨¾‡ðÕž±Q/.×¥\Ð-]=ú½çqÌû¹f)²K÷)Gbì‹'ÝÈéz¼š`¨Ü·—²øÁïdÿ&si$Éì®èÃÕ“n<‡¹b)KpHw}­M¸Û’ðg<V KÙÉí¬rž%º«õ!‘pz Iuß#âÖ¥<,ÁÝU%Øn/:óc‚9ai)ëš~~³­É$ñìnd´Ó=­v¿x)§±WwI6ic‚rÎídÑ} i)kÅu^ÒÝÍîF^¡û K9]º»ú½–r[L¦›*¹Õ‹¤¥¬k÷9Œ.Ö°”“Ù%/~ö#«çž¥œÅ>ÝÊ‘j¹¸#Q¾&rWÓ6•ò¬‹.M½MJ9^Iþ[Âç¡ÕsÏRNa¯îˆ{Kùž•T“ ûÚîTÓ7p°”ïYI•©°»1P{k÷«¶iÎE9äØSP¤DÂl]ÊÞ¤nY̱xöéþ÷ïeº_umü+Š¿Jcš=E’†Ý¦ûÞ·!'-c·îWî–«t×emÇ„ŒYÿÉÇ|Ïê~l±OD]Ôî™Å<¢»Ðv¿ž¹^;8{J‚¶;@ƒ ;tºÃ^Ü¥ âÿH2=j<Ý•¸<è{QWñømw4æ²#ºÛ ÄÝ¡˜t…ü¯§·k8‘Iqñ|¤þ+ïdúp‚îî[ÂíW²?¡ìÚv¶go±Jt7›°Ow½uuñ§ÿüv 'b×¶ò¢Û}y¬»1•ëždÔ„™ÃC+LçTí]ö+¼Ñª=ݵÎÎîø6J=4Bt“ê°ªýºîª¾àN¦»uÏÞ¡8} ç†ˆš.öpä÷ë•w2}ØÙU]q¥Û•½c»†s©suî?2Þ¡žkn¦|Çv 'RíêÜ­{¥ù…®ÙÙv¯uë†S¸úÈË8rš zE.¾¼ý2ÞV»WZktFoºs7S×ô§ûUÔYŒÑYÛÚª„¶;tGf #Ð:Ý¡#Ð:Ý¡#Ð:Ý¡#{‚̋ؼÆÓŒá 8ÔÌ`ï0µ‚ÏC ¹iè5£u×bÝ µ;ÔÏ ¾¥bÜý´®M#öÖ;©øº €U»KPŸ«!7†Úê¦ÔvGwh¢îtU¡=¬îFµÖ9 Âi&èt‡Ž@wèt‡Ž w‡F1•têïØ^˜9N¹-óÊ¢ Oç]N‡”'…ÉÚ™ªÓ¸.sù˜ÁñÊ¢·º‹~Rïô2õL_1›:/Y¿œ&~Ö¯<ïÃu™³±CW½Ó]¬ž>Iê#:¾Övc¢&ê<®ÌÜó¹{5—zu 13oCS4"é›ÓìŸpªÎ’^Fö¸MgîÝ\Yôkw“|g“LµùLJÉx܈ 3÷xÞ^Ε^­{f§#ÑÔ|fjÐý”Ì=žµ·smÑŸ¢{Ô¥7&íp„áÅg@ôħÍ4¹ws]Ñ:y„ÛÙûi:sïæ²¢?¦{ÛçZšÎÜ»¹ªèêPƒ$D!2Út€håXŠw1ôYMã4w¿²«g\ŠsnOº¾—‰£Ó³ëSo?R6‡)¥4š¥kUÖ]2ü˜l‰H>¢pKi©è›ýn†ÿb‚>°ËSX’ŸPòßrz“5’[Eé\s¾—ˆ$Ù[Ê®Jgô+‰sÒ}š>6D'Hîzlþg19.j5ÖFM‹{oÁ&¶abWÚa¤>©¢Ò0%PÇT\K墷k×Üß7ZÐ=\Õ¸Ÿ<tÏV<Ùù‰SÄîÁòب{.]É(»%ʬ»=tº’ùkõYJ™{y8ÖŠf²º‹dVÚ‚îAŠUiûHuR#Ý}h±¿³kiAwqºßí{I÷lµ¦j¦¤v_UwÇÑ¥sµ{±(×/£XæavX &þÔ=mÆdêú%Ý”u¦é­H'v)ëâÎí”k÷ íõ«vŸ‹c}Ñ«Úýnßsº/¬ø¹ñ¦tß®y.Nß~HWÀ¡¸‹e®Wîºô»æª[ÕâS'>å‰}™Ö`ìs”Ù‚îÉ´RJ’ýCZœRÔ=Ú\×èžYK+u¿×÷Œî¿–ÿÝ}u?·¿!n瘮€ÝqË<»r×%Ò­jñ+ÍØ”gbË“”tÏNš jÚâþ¨([œ„lÛ=IéÝ“ÄüÖýxM¹™å®jU]Õ}ät?P {ºª«âtí…°Sˆný¾>ßòÖµa¾«º>ë’„XÖ}e힬¥Zj÷ß3ݪû¡­Ý2|¦î™ý×B‘¿ªíþ“u?¸«C÷… Ÿ§{¶ ·Pä¯;2³ÈmºnסûB†ÏÒ=¿–Vé~³í¯Öý„N º/døÝ‹'ŸŠ<ÌÏ ’ð{¦o¨kºÔ6 'õØÓÜíÈn6N÷+Ny~–Õ)[˜œ™uOÖÓù‹ éù²9ûµüG/"x`™îÐÃ8ŽŸ¿ÓwsŒó'• =ð©ÝGû¿=þmÅñ†Üd>›#ß¶æÄ'¶~Gëuÿüø¨ñ1dw*߯8ÿ›29eïëÿôÛÌ¿ãCƒäR.û-åI–@w£ýh­»Uyoeþ!á9&Ý%½uÛs{=užÙb°mw_å5§»Ý™þÍ©Ïf¬{«=™Š˜uŸ„5ó·ˆñõ¾w%³šŒ‰b0îÈŒ®òšÔ}T9´_eݩܟf>Âï~Ÿô ²H÷6kw›-ß+_Ð}¤1ó$ûÕ=˜: ¨MÅØÚý‹Ö=°¢ |f|TwU§I~Ì,;]Õ§ÉêžiÌl|Y/§™Ð·.´²QWUu=×tUŸ«Ý©¬»"óKºC_”/?Cwèt‡7\p\¸šxÕõÝ!èoDÔ½ ¢ï îmù}÷NºÃѺ‡Öñ¿¤øpt‡ªðºO×sºS»C#ºO’BwhÕ˜1èêNcšÝ¡#Ð:Ý¡#Ð:B_*`¸ˆ`èîðFÆqÛ=9+â;¼“m7 ¡;TòUôÈ7õ´ÿÛ>#+ÞÆ8¢;¼û8Cû ‰Ñ=1e4þñ0î·R> ?Ç8R»ÃKQ¢ºG¾ÙçcYÅýSïüS±Âðº0Ò˜·<"(zÀ›~øWª{ü¸O#ºÃ;‰žˆIœè>nÌêNcÞJИQÏ<ŒŸKî6€±ÞÆHWºÆ tºC_ ;tºCG ;tºCG ;tºCG$ºŸP=Cü:îŒî)x7ƒÈOsóAЪcpO6°÷nV÷gþH42Wå¼™!TZ}‰Dž‡#©Ý¡>¾]U%±Q/¬Ì ;Ô‹×Ý5U¦ ‘Üét‡êtƒ¥Ø˜ùMuÇx¨ w R¿Ð/ÓU5ºÞwÝÙ‡ °ΪBG ;tºCG ;tDãºg€mÛ}¦ñv؇£(@u´®û÷#ê÷4(’ŒO~«QÐéîëu?ÞÿðáíaX}HÖØ“œo¨–>tŸÄÕcf©}ó& o·;›èPå×JëºG¢×^U©K1¼ÓÝŸŒË5x Z×=ûm›ïùÆLVw5Ýë¥3Ý%£{ÜUMuto„>tW"éÓ‘êÛßêâ~« F×@ƒîÐmëþçÏÓ)è‘—:ºÃÙüyo±£;œÎ{}Gw8Ÿ×úŽîpoõÝá ^ê{ëºÃs<½ö3 ;\ÅÓk?Cëº?‚^y§íèWðRÛÑ.à­¶£;œÏkmGw8÷ÚŽîp:/.õ¶uh\÷ñÃâd5™7uVºàZ×ýçÔrˆÌTt¯œ.tÍ·žþÖÖÿ>c<õû™ªòQ…œæ æ]ÚUÀûi]w«¸½¾Êw[ƒ‡Ÿà[ÍKí^;­ë}GºÏ;}oܦ¢æE÷Úé]w5fŒfIçE÷ÚéZ÷pL®1“êŽñ5Ó‘îºjÔë÷}§óÚ¶ÔJãºhÐ:Ý¡#Ð:Ý¡#Ð:Ý¡#Ð:Ý¡#Ð:¢ {ú®t€úìC#~ëÎÕ1L¯¤KÆ£;4H¬»è·+Ú—H‹{Ù¢è·6"2ºg3™?j¨„HwÝÕU5éÇæ¡:8« ±Q÷w¿y`™Ýº_“€+ÙÚ˜Aw¨˜½º_’˜ŽùóýM§ÿ.6wUÑýôa\­>\ÊNݯHJWˆý'è~#ÛD¢ûhÙÑý6Ðý&ÅýõJϦ¦vœfÂöt§n¿ t†Pw|¿‰=`ûq"ÝñýÐ:‚KÄ #Ðýv¸Ìî9Ðýv°ý9Ðý~Ðý1Ðý~°ý1è?ãÄàÐý)ŽèÎE};Áö§8T»sQßNÐý!ŽëÎE}ÛA÷‡8Üvç<ø°ýÐýÐýNÓ«X7íp’îˆÜº?‰§™ðÞgU¡#öéÎE}P%Gu?99W²³1ƒîP#u?71ײ·«ŠîP!Çt?5)W³û@$ºC} ;tÄþÓLØÕîÐ."Àv¨ t‡Žà1èt‡Žø?Üý27„“DœIEND®B`‚Bio-Graphics-2.39/t/data/t2/version21.png000444001750001750 2416412366325116 20125 0ustar00lsteinlstein000000000000‰PNG  IHDR€×*˜^dPLTE€€€™ÿÿHÑÌÿäáºUÓÿ[ÿ((ÿî‚îiiiÿôÿŒ¥**ŽÿÿEúúÒ2Í2€€€šÍ2ÿÿðÎÑ‹Eÿî誷ÿjZÍÿ™ÿê_ž Ý Ý{hîpÿÿ zÿ2ÿúðæÿ×ÿ¶Á£ÿõÞ³wˆ™ÿ=¿ÿÀÀÀpÛH=‹Š+âÿ2ðÿðdîQÿ€ÿÿ‹‹Í\\ÿÿêÿô¤`‡ÎúÿÔ R- ²ªÿ£™2ÌÿcGÿ ¼<³qàÿÿÚpÖÿÌÿúÍeÿ|ükŽ#ÿÞ­àÿú€rÿ€€‡Îë˜û˜d•ífͪõõõææú"‹"„ÿÿäÄÿÿ€€GÿúšÍÿ¯îî­ØæÖÿÿQôÿøøÿ²""F‚´K‚Ò´Œ¸† [ÿÿG.‹WÿÿpýõæÿðõÿÁ‹ÿàÿïÕÿ„ÒiÓÓÓÿäµ­ÿÁÿÿpÿÿÿÀËÿi´”ÓÿÖ½·kÍ…?ÿúúð€€Uk/ÿ­ðÿÿÌÿÿÿ·/OOúë×zÿ@àÐðæŒÿøÜ°àæÿÿÿÿàÿëÍAiáõÿú°ÄÞðøÿÚ¥ ÿÿÿØ¿ØÞ¸‡­ÿ/Ûpÿzÿe=ÿ ÿÿp€ÿÿÿÿÿ¼ÿŽÿÚ¹Ü<ÿúð€õõÜ©©©ÿ¥€ÜÜÜÿP‹‹€€ÿõîé–zÇ…‹ÿÿÿàÿÿÓÓÓÿ€€@àÐÿ€ÿÿÿªªÿUUÿÿÜv“o pHYsÄÄ•+ IDATxœí ‚«:šfs嵟Z…rwv ›êg4 ~ °@Óù2Ÿ¯ƒ0$NˆÁýKR1ÿª½dî ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$UðïóòRþ5íí_î ÁlÀ¦‰ °†ÔºíÂë&Pk£+ ‰ ¨µù¯ùÂë&²+àgßj¥?¯ÿüûR®ul¡0Àúƒ‰DÜî‚?/—fñµ¶Ž X0‘¸€ÊJpù·•Âë&’ à²ÓU^ÀÝS“ÑkX˜HT@¿›õ- ŸÈ.ØcÇ€Z»¶/l9 öì7!‡~Õ°"0‘˜€ÿIÈ-A@R5ɾ )$Uƒ€¤jT ’ªA@R5Hª†ë€¤rTM¢€ý|¯¬?˜H¦€µÿ„Hé\ð7’ Ý XûTŠ”ÌU¯Ñþã?l‚€¤jT ’ªA@R5Hª¦CÉX¹&à/4$A:ðèíè_b+A@`l"˜›P@ÝcÍ­?û‡3­Ïpº†€å £py‚Ýò“a"· h6ÒòúÒö±o½µ€öñØîÙ*|<ö/ý:1´€¯Å>#àçei-:ðO­eÐÛ'ÄjÿWÖ±c èwTËÓVUŸšÇÅ~Úï -_ÊõRÛâôV²Ça"Ï hv¾Jù×QÍ­ûÙ—oË•ý{Rض€Ú4{Úì¾¾·X5gþ\¼€:< y¹f°c'†0ÜQi?þH_5·w➡ݻC èß²™€Eò€Ú?å¼ßšV&r·€§·Åï :ƒ]¸ è1Ø]lÚÚÞïÄõ’]Y}¬) ¿þI[ÛÄz×aòæ½^²+«_IÀÿKèDdbBÍEÏï°îww޸׳%&¨·Î…- °ñ¦’puäåÀÍð´™‹m3Ÿ çpsÉÝ,ö3)EÀ­=§+z¾Í"ã̺šØ8¡S“)`–\²ëîœúëc}ƒ•³ 2·™«k%;,ô‰ "·€~FõÚÆ(þýð»V.mÁ‚ÒF>0à.'ðäjQüÒyÍ]º4õl‹Ø0emŸð†œ"‚€wn¦½Å¦­-æUÄè_b+A@`l"˜î½-t8Ô`ɰ‹šCÀ{`"¸÷ö÷kdƒ‰ àÞ[¼&‚€{oð˜î½EÀ{`"¸÷ï‰ àÞ[¼&‚€{oð˜î½å:à=0Ü{‹€÷ÀD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁD›&’-àúøöÍþ™«¹ 0ÿëbKüµsçE@{!ZÿßÜĶàÁ&þúÍ·.ɰoB0áÒp›‡ sA?¿·b%Öœ5M9C„°m0©/à%ýþÙ‚±6çRÍ9iÎ`9%;_béjDÀ®^ðlÿW×t9üÓBÀL¤¯5‚˜\2­2ÿšÖ¿!sÆ£“æ æÒþ>Ä,Øg¶|ØòC6l¹òp¦Í–Àî¯F)ˆÈF@[ns ˜# ö(g_˜TõÚ Y¯«›Ó~)90ÓÛå,¿dëdV5^*ÙýÕèþð¤#Š£BfÐí²>?‹=]çÔµ‹ÍýDÉ®¬~#4¹üèúì ø¾;ë×fœÐ»«ßL×é®Ö\Õ$,ñ@Àƒ­í·Ù÷gn(Ù¥ÕÏ0RÜüæžX+¢|ñwkÃÂÖ²=!`ü†Ü“’‹UL\Ѭò;·À­»à2ú·O X©Ük”’Öù6.Ù¥ÕGÀwcÀÈbÐeJ³Ï‚ # D¤®€÷ç vi3ý@ß0ið†œ"RUÀjX¯0†€À&‚‰ 06Läy×{Ú— ZÜû¥¾®Ò靨;ÄÂ3®Ñ6Ó¸0‘:S¿”_nfÐÖÐÏMÛÊ\Ñr3 ¹S@mžÉf¥q=}§ ½>ÞÍ7iÊüÏ-FûnÈË–…YØÚEhÈÍ4.LäVµéÁh»Ó*+ŸR¾O±¶- ùY¯ ܺ­‚¼| íƒn¦qa"· ¨œ9þ –~êÚ¥qÐüö%×™6]“ÝŽ›°C˜Èc.Sw\føÐ7›R@­°W˜È­ꈀ‘]°^ÔR@ÛëÆIH—0‘[´'!Ë„íIHpåë$dÙïšÅ¸³’õ$Ä씵;y²æÆub\ï.̸›i\˜VÀÁjX˜ÈFïRÌ)ÌÁ-£o¦qa"· »O;KÀý›¾GßLãÂDðJÉ€]‡‰ à•’»iYÀ½nÓØ3L¤a5-àˆ0‘†d<$LäVÅ¥“œÂè¯pf ˜È†o3<}Ìàè›i\˜ÈSÞS`ýÁDØêô¤<»jôÍ4.L¤¾€²›æöÙUî¶¿jX˜ÈcÝ4·ŸÒaO¤‰6Ó¸0‘'´w×78§tÓT8Lä9ý|¯>"¶{ˆÎì}ÙyT@å^mçŽW¬—ÜòtÓŒ_C}3 yN@µпFôoõÎý£o¦qa" ¨#»`³Kvºnšñ/EFßLãÂDžPû£ÀåçíIHZ7͉6Ó¸0‘çT;£vuSsÀŠÀDP! °¯<)àAa²Ç&}3 yPÀ½»ûrŸï2Åf&ò €G78÷PsÀŠÀDZp÷>…¶jX˜H Þë|3 A@`ØGÍ+A@`óÈe`2O ØyÍ+A@`l"˜C@`ÁDZ0¼Æžë§ØLãÂDšн¾öoÒ}3 i@@-u]:Ì-¿GÀñ`" ¨Ô÷ ®Êv ¹ÖÅf&Ò€€ká pØw®$ìÑ’‹ÀDê ¸ª‡€3ÀDšPÇvÁœ„Œ ©/àŸ6]Òדõµ<ìÑ’‹ÀDØT0†€À&‚‰Ôp·»ðIN âÓg5wæ]l‰×«/ ¿Qÿ,±-x°‰¿~“µ;ËZç]'\Z"nÓ‘€[±kNŠš¦‹œ!BØ6‰ƒ‰ô+`¬Í¹TsNš3XNÉΗXº°]ðO5wM—«%C@LY,AÀ”õ@Àr0‘¼˜K°²—a~)YéjDÀákX˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MA@`l"˜C@`ÁDX{®ý°Ã%E{½kF¯9`E`";ÆžŽ€ÀÐtÔá?n…ÍDó´•ÑkX˜ÈŽ€V²ÅÃàí¢šèߪ½&s°šV&²#à2O à:Õv«Þ ¸¼½æ€‰\Ðý.ðófôšV&’' OaÓšÿ³ –9П„Ø%mOBlcÈI°âvS`ýÁD›&‚€ÀFÐ>¸>xÀwðÝ]g5”Á½ ¿ê؉ñ §jñnjî[@7²öΰž–¬oÃ/Ý7xöRÍKùÑ/—)ËÕÍh™É…y¨æì×àî2TØ «µLý:1Œ€Ú5öÒô×.xm2ÜTí¬Æ N/Ìs5§ƒ‘µÃ!C\y‹Â-ÙÓ0‘¢ªeƒ˜ïŠÍÔP@×ú¬€Ë•m§¡NüBåáš³—Ü¿VÔ”o§ÕîÆ‰±\G=ß ¸ì¾Ô÷.x=ˆ2ó¶XsÁ±ƒý+sÅCÀ\˜HQµßGº-æ¿»ó3»¯¶4²_QQ¬eý:1Œ€Ê¥»m£Öï‹­–:¸±zsâvß ÖÜÞIˆ»+·w'Æ0oÓ.vSsÀŠÀDj h[À 3îf&RRÀç ¬?˜HI7C¡¹K;?‹aÓì²DwЃò›Ûjno=N“]27WòÚÅæ~¢d'«/¿o}HÀû˜‘ýŸÃlî~uÿšêÙŸáÏŸæª3¸ýùÌŸýÔ¶4zøW3—ÿÀ{³ 6󾃖×Ìef°2›Ïþ­»àåó+‚‰”ðmÛ¯U€¶éZÞ¾v\>ãæýpùmD@,ÑÌû6ÜP@3—Y]G@ ð­‚00ÜÛ䎀v®\í:~ èV‚‰лw(àÚŠ]p àn ø^^Œ€oµ+`t¬ä$d×Î ÷¶Gfá.8híIHx2`æ- =…p§F[sâçݶ€ÁéJxòösY-÷Psã:1€— #OB~ƒ…>½¿a– Ø&ÒŠ€›ðg¶ iF@`“ÀD›&‚€ÀØD0†€À&‚‰ 0TÛ‘^lïR}ôÀüÑ7Ó¸0‘&t¯ñˆ¦ØLãÂDPË‘’´v"CÀñ`" ¨äHIn0vÁ#ÂDpiðä8!ë3–š©9`E`"õ ÆWBÀ `"M¨c»`NBÆ„‰Ôðozh3\«-{´dÀ"0‘6L! °‰`"U<|pïå'Áº·âÓg5wæ]l‰—ª/ÆŽüó°Åb6ñ×o¾uI†}‚ —–ˆ€Û¼ÇOÜi­{J‰ú¯9`E`"q•“ì3g  ²£| °z.ËKPù3šÎkX˜HTÀu7+vÁJíï‚×¾[À!jX˜HTÀ¿àDC­'!fI±“eêßj¬ÛKÓ»$`ÉÂp ¬ª€´€Àê xca€õA@`# hG( vÁ_‡ƒÝÔ°"0‘g §jñnjX˜HIÍÕAe¾ÆóW`”¹ãÛ \¦ü-߇ó¦fÜÍ4.L¤¨€ÚílíEÀ¯]ðb£Ÿa¹œh¦™‹5~xò&kX˜HQÕ"•v·¿¼¶ºæÐÏ`\.Ó8 uÂm`kaÆÝLãÂDÊ h$ûpÙêï]°ý†ÏÏÛlÍ+)* ÛnZ@Û.*÷åñ¶DÀÙ`"Et'k ènK°7'h÷ÞÌ»9 q»ïfkX˜HYóf0íb75¬L¤¦€¶ü¡0ãn¦qa"%|¾0Àúƒ‰”ð¿‚|&üwÏÏÿ³“ÝÅþïNêÔ°"0L®9`E`"˜\sÀŠÀDîðó•F(àçç=wG;EÀa"w ø™@  ËÕ°"0L®9`E`"˜\sÀŠÀDJ ø|a€õA@`l"˜C@`ÁD›&‚€ÀØD0†€À&‚‰ 06L! °‰`" MI0mø_Æ ö„€ÑA°ØnÞ¦8dÍ+‰ ¨¿ÆŠsíp­r´L¬VVÀp´Ì¯ÑW•Ê®•±â€! °f`"÷ È`…ÀòtÇyqÍ[½«¥ÀDv4󸑪7ãOû‰oÔbÀj`å/à'Ò‚{Z@w¤©…€:<æDÀÁa®ƒ¤êí™Ç jå^ÃΚëùÏ× qc5¬lí éÏ‚•´à¦“ð2Œý–Ó}Õ¹¢íßAƒ5¬,¼ c·ö—7^†é¸æ€U‡‰ 0¬»~sUë%«;¬ 1¼®QÛK›­Æ_aÛ:]KÛ‹€54ª‘ŸÔmRÀ£Í°®úC΢Qü î=¦o9·å.àQO9ÑóŠ€—6¶£ý& -`¥\¯Û±Z@ŽÊ¥TãìÇ€¿æ ¬†º?iÔf5þ ÛÖéZÚo˜H÷^‡ý Qã%«;¬ ÖL! °‰`"lBu¡ÂÜZsËá´¿ßö»ïáË~¨ ÃÜ]Ý…€æ/Ū^‘!Céý:1´€¾»Tp u-àË÷=üSkßC_ÿ)lZÀ—ï+eÆ3›´šs}ÿÔÚÖ­]¿ì§Ø7.`lȹžÔ«€*" Þ_LÃ%«yN@³óUÁÃdZ¯9ß÷P~§vôèÉvKV&r¿€îáhë]´€AßCî‚ݯ\ßÃ"0 Sþ$ÄXgOBz0¸ c[=×t˨;1´€þm÷O×V&ò€´Àj·€ß=åƒÙržå± K¸ã®Ìßš5‚3hnVŒÝ*¶œbþ;ãYXp7¤>=,û æ¼ûº9uÖ…ã ¸Ý`²0æ·úl«ÃV‹XÍ]„}‰·w—tN .à×f›i½ûŠç·Î«_`§âí‰X¼OÞv¹]Àø¶ Ÿ%LM‡e8¡/ÂòÄ‹ŠX®ðzah[wbpÇ€;1¾€œªÆý·ÝÀDžPq°]'&°÷šV&‚€ÀØD0†€½Áü™‡¶ÃTœ^õU2ìæô£³¼0&‚€ oí*æ*¦Ö›Ž #CuP2ìæ»–j߯޸i^;.ÙÓ0L‚Ù¡§äøT¾·K¿%{&‚€)°à0¾‹ýçWö+?Ì€‰ `ÂÛ +Üfl¿÷£»Þ,àÎIˆÝ# ë&‚€À°[˜»ð7Øö.É6Jö]Èð^7¬ ÛÞ–ºsk` Lû;uu%s/«u‘Û¾éí"‚€y°£;ó×m“ûÚºÕ«1ªÝQ„ðXÚvÙxx‹.ì3±B5&kwâbLÞ^Ú4‡Ãa驪KVn¼=¡!–„Ñž”—ðÇ€Ò:ŽkÀ¶[Éþtf—b6d %s/Q/X‡€wÂÜÖø ¦¹(Ò³À‡‰ 06L! °‰`"Q y*HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕ ©$Uƒ€¤jT ’ªA@R5HªIÕüÕ~‚\ù-IEND®B`‚Bio-Graphics-2.39/t/data/t2/version7.png000444001750001750 2466212366325116 20054 0ustar00lsteinlstein000000000000‰PNG  IHDRXËJ ªPLTEÿÿÿ{hîðÿð€‹î‚îAiáÿcG@àÐp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿ØõÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2ÌÿÒiÜÜÜÿÿàô¤`ðæŒ‹‹ÎÑÿÿÿõî/OO¼wˆ™fͪ˜û˜šÍ2”ÓææúÿÿF‚´d•íÿïÕîÿ‡Îú¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀºUÓÞ¸‡ÿÚ¹î誼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõȸó· IDATxœí]º¬,’…Í~ú¦¦—= gtz9ïÚò'(*! 抪ϓ¦.bo"™[eš@ @ @ @ @ Ðóéâb3ÄÂÒ÷3cœÑWŠ5{oÖç3Âè+Åš½·ëóó°Š5{oÖÂÓ1SݾR¬Ù{S°ÍÇÒµüó™—^ìc×>}¾R¬Ù{3°ÒS¡í¿f×-–—¾R¬Ù{;°¦ˆ© Xî)¶–RÅš½wËžüXö•ØZJköÞ ¬ÀPDN…ëhsyØ1ÖÇ×Ó ƒwé…€•Ýë9£¯köÞ ¬Á €…èÅ`}ˆâXˆ.°]`!ºÀBt €…è Ñ%ð;¢S,D—(ËÆ¼_Œö`ÇÄü[áý4ë§B X£Ç‰VÜëV"€õ[°]`!ºÀBt €…è Ñ%ô€…P|°î¦X?:ÀŠ¥F!–‘¾§˜㌾R¬Ù;À,Öì` kö®,ªWe¾+&ÿŠˆÌâï-Þ3£QÒ Ö‚™—+ÝÌ‹z£Ë!s\È}ÐݪØ&²¶—˜'³ø[®=–‹äz"fF£´|¶-XvAJN…Á6¹>Ö‰íK€µÙÌ‹FiZÁ¢Y Xƶébm\wk?k&Òû13Zu`™“àòž?BEâªÌ5b ‹ðÉ0(Ú,Õû13%;à%{Nñ2׈)øœ“S!Å›…z"fF½Ñå{ú*` Þý÷ÉÞ‡ˆ™ÑÐ(ÕˆÕ´¯èôoËýáûïc¾ûCx´9y¯¨@Î_õ³™Ûe¹*ú†¤%·ªÂwÌŒêZ^Øã72³v’öY2E'¿Ë—I.Cw«*|ÇÌ8÷]T­ÿÛG Öþ½f#+“ù*˽ 5±ûU"Œ÷˺t“°7y YëªT`MÏ‚h;òg‚µí˜®›ü¢+X Ë‘•µêk°öÓí&ßwe¿–¯{ ¬½äï=÷S-™ßÖf ëÉ{·ÀÊt0 :ë¨cªiòMWö[`í7¿¡Çâ–õзÂ*”J3£º– `墺– `墺–¿†ðÓaþ沓´ÏrUô I[°šÆ¡1^T×ò¿‘™°“´ÏrUô ÀªXwjsùo fÆ8£#Ä `uWs'Æ!X«‹`¬.b€°ºˆÀê"X«‹`¬.büްºˆÀÒ)Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïK°X³w€%X¬Ù;À,Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïK°X³w€%X¬Ù;À,Öìý°>Ÿl®uZëz£¯köÞ ,sµíA9Kez)`9RÊÁjiô•bÍÞ[ƒåo0ÿÌn-}sZ×–4®§so©¥T±fï Á2€Xœfs mžvoF »ÍlRK©bÍÞ‚e4¦KšŽÀ2ð~B/æöVK©bÍÞŸË”»kŠW‡ÔRªX³÷Þ`…Þ§Bué%‚ï¦V:xwç@ ÞŦ—V¶°´[K©bÍÞ–`±fï}ÁzÎè+Åš½,ÁbÍÞ–`±fï*Á¢hÕÍàw>'­ØöþÇÁ2¯(¼ÒÕ¾¢ÓÿXf¶Z2³›N¾«rœ,Ebfй ñæÓ,»ò3ëì²ä²Q%fÆF™X°dŠ’¦™7/`È”Ÿ-±¤¬¶­&NÌŒîFÙXý¦ãSUyfÄy–Ò:_•ÕºÕŠ™Ñß(Ÿ¬ÜᾓyY”ÂPRg€Åˆ'ŒrÑXÅÌxÆ(-€%QÌŒ§Œž|UÏ~yo‡ôY^KËËF•˜㌾R¬Ù;À,Öì` kö°‹5{X]Ää_‘¿.¿ðç~Þ3cœQab–¿"ÿô2DaÞ3cœÑÁb÷'@r ®=–‹äz"fÆ8£ãÅ4­×âÇ—FØ—k³™ãŒ/䨱”yåïÐ6·¤·ØÊó>@ÌŒqFG‹),XnE›¥z!fÆ8£ƒÅd^°Â©âÍB½3cœÑÁâ£Á»;!,€%I¬Ù;À,Öì`5³®ãÙ^γù]¾DrµÈ(K«{§*¹¸hT^\VZ7}bþ¥øîD¢ƒ~` ;ï»ZV%o–Xc¼8o}ÙlT‰oµíƒÜzXŽáãŠmÁ2hãÅyëËf£J|¬ì'z9Æ'’ËþævÅWÄ*PÊÖ`UˆoŸ YeJZV¼!Xg])/š×R‹`eÜÒ™1^4¯¥1ÀÚy=7ËŒæµÔ"f~O‡Ëåe=Qñ;UÉY½0Æ‹æµüm±fïK°X³w€%X¬Ù;À,Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïK°X³w€%X¬Ù;À,Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïK°X³÷v`#57úJ±fïcÀVK©bÍÞ[‚u6ø²uŠžóc÷O÷©1úJ±fï Á¢õùcöaÁ4¯ 6[ÍKCÓléJ÷©1úJ±fï Á²ÿÙ»”|gnr8¹{˜þ^…‡ÝQ£¯köÞ,šÖçqRT˜Å‰¦¨Çòihx-¥Š5{o­Ï¢^O…,r`mz¬õ•Ö&ê(Öì½!XSôÎãÁûä·†S! ¯¥T±fïíÀ:/Œ:}¥X³w€%X¬Ù{[°ÎñÙ®³`»!Y7$Ƕ $%âÒªÜm0+¾Ù`Þ ªr"±‡„tž`,³à’OÃ[o)Xü¢X³÷ã-³ß£4(æWK-E‹5{?‹EM«±X³÷s°d5zâW¢œ¬ =Vc±fïÍz,³ïªÑRKÑbÍÞÏÁâpµì={av±]§Ó½³b–dUÜÛ.”ˆK«r·Á¬øfƒ]x/¨Ê©„ÇÕ„ß±Žl³$Ç%¼,.WWÕXkYð¹*o"þâÅš½_mæEy®…ÚèÙE¼#M%SwG *œ;w#Y“IÌ3ãëXb¾sT%ÉR&‰¼—fÉÕþnƒe+¾­/. ‹M•íuçP…°¢¦¤PORVrÀöM›o²}F¢}¨Pb>~!}XÙÚßm°\Å‹æÀÖ¹dÝ9n2ºøž`/`J¸Nµ“¬IŠ$äz¬­¯c ùùiUR‰Ku%™Cm]RNƒJÊl•Uüi°èJ²îì×ÉÅɆš®S¥{È£ƒSд”õu}4.>[9¯$ó,Fƒ…$l°â$CÁ¢Kɺs’¥Œ«T™‹v¶/ÁÚû*ÎrXûý¼”Ì1XÜ[“°XÜú Ö#=ÖÒBÜ+ù 7FfôX›,‡µßs^Åm°5ÉÝËTü)°&?x/ºAÇ Þí'¶Óå(#( W©6’hÈP"™ÝçbŒu’å¸ö7$ö¯_t¸ f“7X®öƒÀ2¦l®u¶Ó±µßžéT²Q”¤Z%ë·g:¯U$ñM»õUœå0É ‰=ä)XÅ %)m0 ™Ö$£Àb/~Q¬Ù;À,Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïK°X³w€%X¬Ù;À,Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïK°X³w€%X¬Ù;À,Öì` kö°‹5{¬Ïg¿åó÷æß«åŸñçc^š¢7¯“ÎƤŠ5{oÖg‰«\9°& V–’ÏÇ+Ö»Äå±ä‹}°å¬…¦°uöYÖ ÄåáÀZ80ÿØ3œírþ¨0 ¸þǾº£,··ËïÁr½áÇ—ftnmxuköÞ ¬¸“ù| názßX›f-z³M-¥Š5{ï –%jÖºi'7KØöþ­`Mû›vÖ1Ù-I—7íˆm_Ñé_ Öî¦i>+ÞJõ™Åˆ5{ eÀÊœ Ó›vòÏ}Û¾¢Ó¿,ÚÞ´3¯ƒwC禱í+:ýkÁº/VÓ¾¢Ó¿¬í \lukö.,ÖÃR[f#Öì]0X¬Ç;·Ì,F¬Ù;À,Öì` kö® ,âs#³±fïÚÀbs#³±fïK°X³wÁ`ýÜðÌ”2Äš½Ë âÑéÖ[Åš½+«|òÚÖ™V13ž3J5b9í+:ýO‚•_P²Jf_dÓ/sñàô+,°,Q³¹ÌyfŸ=Ÿ´-4ý¯‚E *´ˆgd‡Ü²Yæ§ÄƒÓÿ*X»EtOO|[ÅòÏŒS¡,13Æ5·ê¬7‚™÷,X/ôX¢ÄÌxÜ(ùW©XäÅK’˜Ï ¢Ü©ìÖ`É3cœÑ…)Jïö6Vò+"ÛWtz€õV±fï/«àâ?±í+:ý¯ƒe‡ÙtÏÜQ¬ÙûkÀ:º,°{æŽbÍÞ_,]bfŒ3 °t‰™1Î(ÀÒ%fÆ8£K—˜ãŒ,]bfŒ3ŠŸt‰™1Îè+Åš½,ÁbÍÞ–`±fïK°X³w•`Q´Zt]ŒØöþÇÁ2¯h>½’OlûŠNÿS`íoÆ ¿*,EbfU•göHœg)­óUY­[M ˜ݶ9Þn¢RJê °ÑÝ(À’ÃF•˜Ý,9lT‰™ÑÝèÉwôÃh“ù*=»Î¥e‰e£JÌŒqF_)Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïK°X³w€%X¬Ù;À,Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïK°X³w€%X¬Ù;À,Öì` köÞ ¬Ï»">ŸL®äÍFF_)Öì½!Xö?€ÕN¬Ù{s°–ŽËõ_Ólÿ9}SB-¥Š5{o–9Zrb¾sr¯²oJ¨¥T±fï Á2š,¿ê Û‚•9qV}¥X³÷‡Àšý.I?…S¡èôÂÁ2ÿßž ×7%ÔRªX³÷Ö`…qúV§øMÓyað®"½ °J ëhô•bÍÞ–`±fïK°X³w€%X¬Ù;À,Öì]Xd_ÑúžT¬Ø&Ê.BÈO}WøD]Þ3£Ú(íßKÁ¢¼NZûz›~Ò»Ó™~„yDÌ ^.²Ý‘y>µyígµ´Ï´sŸò,Z§Í±35Í…=A÷ö5}’«Êä&¾ób ‹néõ‰™ÁËe1¯&;qêöT¸¬®`’üt_ä&ËurCÚ×VÀšŠg à½kzebfðr9,L7E+Iþ`ûüoÁ²ûÏGÊOSr‘™µ(Û‘œcJlÚJÞ=ƒ?å}€˜¼\,Ûú{°v»Sa<»8]'Íff-Šv¤°p`ù:F›;¦W'f/—+™+Xþ¸˜÷çm%,k$€N…oî—^Ÿ˜¼\aðÍÃÍjiOxþ\g˜ŠïvT#|ðîNˆëa°xF m Éqf%bÍÞ55Ýž @lûŠN¯¬h.ÚÍx8iÃ*Ηµ™âá&‹Ç¶s‹£9&΂W•TrµÈ(K«{§*çŽs¶™qnyW…>ì0ë_´þÿ2a=.[çÉÿžº)k³·9ƒö+—þvÝ"ïãJ°ˆÙ­áà“SáwZ1tF¾Q©q ÓjÑaëm¬*13˜¹\wð Ç=Ö×uþðN°Ì>®W™v`Å b°¢¶¥~hÖ4…÷V­˜Ì\É©0–?ä[°âS¡;ä`9`¸`Í!g Vê_göâbfps}ÓE¬µÇÚœ §dŸ%o¹™ëo=%§B•bfô3j:(÷øÑõMóŠúfX=ÄÌèfôž`½HÌŒnFÉ<ëo*4Ë®™GŠ5{W–}übðdSØáQÌmˆ7ŸfÙ•ŸYg—%—*13ú­+A¦(i ÙEzC¦ül‰%e5i5¹bft3Žð °ŽOUe‹8ÿy–Ò:_•ÕªÕ‹™ÑÏhÓSáí&*…¡¤Î‹ýŒ¬Zï²ÄÌèh”ì`Ýõ.KÌŒîFO¾£F›ÌWéÙu.-K,UbfŒ3úJ±fïK°X³w€%X¬Ù;À,Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïK°X³w€%X¬Ù;À,Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïíÁú| û,Ûú}¥X³÷v`ýQó™§S°f€¥)½ °fŽ™r¹–¦ôrÀZ4K×òÏg^z±]3›-XnMN-¥Š5{oVz*´ý׺±Ùü3‡…ÇPF-¥Š5{oÖ1µËõ\¡ÇVK©bÍÞ;eOw¬¥+‹ÀºŒÝ0úJ±fïÍÀ '¸ˆ®]ˆýû‚T±fïÍþ¤SRXG£¯kö°‹5{X‚Åš½÷ËŒÔìU¥s¸.ÞŒÝÌ›nGRÛDÅš½÷kY°ˆ"ˆh‹–¼ôòÁ"{«¿ÅÐuX´öX„K`zñ`-Ðxt(ZÇ©Pvz`¥÷U,饃Enß ¶ÞÉãvXòÒ ‹Ì«eIs|* X2ÓK+ú¹ÁõRî/E+XvŸ£¯köÞ¬gŒ¾R¬Ù;À,Öì½?XO^ŠhZÀ}I‚ Ñ%¢K,D—Xˆ.°]`!ºÀBt 5`!”…°ŠsA,,=Àz«X³w€%X¬Ù;À,Öì]XT#®Ê|.6CÝt";ø]¯ˆµWû ô>XÌŒ>FI*XË"€e. —ô°þ$¶ÇšÃ-“~>=÷m¢kX¹Í¼h`4Üfh"è„6yÇS|¯Í X8f6ó¢…Q{¬’ùăE+XS,ê—^¯˜-Œ:°ÌIpy/ù1øæ¢—˜Ü‚–U °–Xª÷±bf40êï?ÏJÅU™ùb îÌózÛ¤[ßGž÷ÁbfÔõG(¼ +ú¹ÁÓp½ë –ÙGž÷Ábf44J5b5í+:ý ÁÊü¨(¶‰:Š5{—Öá…»ÍUž^.’Í\YöY¥ê[MŸ˜õFé3A™ÍÅ`å Ìe$`Õ^O7úðŽ3£Þ(ÀRÃF•˜õF–6ªĄ̈7škÜ{çQVFb0°a^¾P¬ëf„°îŠ™Qo=–6ªĄ̈7 °Ô°Q%fF½Q€¥†*13ê,5lT‰™Qoôâ·Dþ_,w’VeŸUª¾Õô‰™1Îè+Åš½,ÁbÍÞ–`±fïK°X³w€%X¬Ù;À,Öì` kö°‹5{X‚Åš½,ÁbÍÞ–`±fïK°X³w€%X¬Ù;À,Öì` kö°‹5{X‚Åš½? Öç³yóóq¯Ì …MÔQ¬Ù{;°>Ÿ4™\Ñ>–$€%6½ °. Ø8KkuköÞ,KŽyeþ™?ñšý'€å¶ù÷¢=þ¶.ï¥Ä‰m¢ŽbÍÞ›åN…'×Í®sÜ›¾ðµÇrL…µ9¼ùL-¥Š5{oÖä Ð8@f×,mé5€5O뛾ð°ü¹SCuköÞ ¬pÖÛž gJ¬ðæ´ï±¬¥T±fïÍÀšÖAx€ïŽ6Ǩ%X@¢>ôX?mŽQË«,Œ±zF›vQ9Æêi”+nsD!!½ÉÓͼgtŒ¸  +^-fÆ8£¯kö°‹5{X‚Åš½,ÁbÍÞûƒeǧ4­×gÙ/1“½pËíHj›¨£X‹÷èOî0ïqúÅ•G©XDDg•ÑD²Äš¼°Ì·Üý!öÈ5‹ì-aþ†G3ÍQV€%/=gowˆýÝ4ûC?7¨i"YbÍÞ¯6óbœÑNâêë~,×/ë!^a%°Õn.’Æ µ“Ö£ˆ<wqÖIc·¶l^0¾‘'ã&Ž”°˜*<6ѧ¡, "1N¡ã‚Å?–\¸Îó£Çê÷ñ=ÖM£c•"ò@“kcqµâGq¼‹ˆ¸V»¹H/û`F/£ÃÄ÷¡F¶V¼…Ø•ÝÌ‹¾FN¬ÙûÕf^Œ3úJ±fïK°X³w€%X¬Ù» °¨F\•ù\lê‹;óß<­—¶Q _{,fF£%Å铹@¼½;Ån¿l/påý—À²ÇÁ+÷ñ'±=Ö|xwJÔcM+·™ Œ†Kð MäÐ&"ïxН¼¦9 §ÂÌf^´0jU|ù´t°’»Sö`Q¿ôzÅÌhaÔe/ÀŸÃxXd‘[вJ¡ÑΛ y+fF£þféøîh*Weæ‹)¸3ÿÍëMHnA~yÞ‹™QoÔ¡hð.¬èçÿMÃõ®+XéßÅx,fFC£T#VÓ¾¢Ó¿,Ú¬¢—Ä*kŸùä•\’[M{z%L…÷·ˆ™Ñ̨¹˜çàúúG%ä3¯× ]÷¿$Ä·½^…¸¹0‹[Œ6ªÄÌhct=.ÿö`;䨵LŽ÷æªÆÄîÈšf‘² ¶Wþ ;¼ãÄÌhatsp(÷7tEeÙÅÙ_;¯9“„®mÓ9QG€É8¼ãĄ̈7š;BÑ™dÝJÅ–óèhG‚ó,å@å+¬€X6ªÄÌha=ÖVÓ&fF£c©`£JÌŒfFñ­0Sñ7‰™ÑÐèö|½ä¦t½è&:.PwÄ'Þß"fÆ8£¯kö°‹5{X‚Åš½,ÁbÍÞV1ùW.Qãý13Æ&ö`­S¬t3/Æ,6}’ù‘a67‚Q$¦°é}ˆ˜㌎‡›‹hšâ?Ø—k³™ãŒ/䨱”y®«&³™J‹â}€˜㌎SX¬Ó},(Ú,Õû13Æ,&ó*€N…oê}ˆ˜ãŒ ÞÝ `,IbÍÞVGqý%?¬Vz?Ù⯢ŠÌ̸gT27u™‹²øÅ¿*íYïâ€í._Ì9XŇ’ò.ùÛÀQßãtv…lñ´Ìè]KÑâ‚ö_»¯Ó²rÅ<{]s¦{*Œ1€U+悳†?¹pþ‰ŠßÂ騎‡Ž™Ñ¼–šÄè±Öú¡Çj.Æ«(33z×R89®ÅÙžúà•ÎFqhõšäUü§âÌ̸gT2CÅš½· @ @ @ @ @ @ Šã¿Ú–?>ØQIEND®B`‚Bio-Graphics-2.39/t/data/t2/version14.gif000444001750001750 1276412366325116 20113 0ustar00lsteinlstein000000000000GIF87aî çÿÿÿÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔ,î þ? H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦M–€rÞ”©ÓcÏ@ƒ J´¨Ñ£%sþ´¸)ɦ¡:JµªÕ«X³Bì)5bW­¿‚K¶¬Ù³hwŠU¨Á¥m*ýä–î\»wñÖEW`ß¶{ûêõû·.×¼€ù ^¬Ó0Ü»‰ ¯MK¹²å˘MN>xXn`Çv l º3çÒ¨Ew^:4kѧU·þI{¶[Ó™sëÞÍ»7Û½[#‡–<×tbãÀc¿µ ›8éѨãâ†]:èæ¯‡oöͽ»÷ïH·þS7X›º\ײ²f6Bv…ðtß¡´˜5,gp_qû× µÕBlUË[ á®vÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠH ¶È&,zñ‹cYºÆ2š‘*b´Ð×ÈF°§TŒj£ç8”¯”‡ŽxÌ£PìH =úñŠI•&mò õ€’/^êŠ(ÉS}RP)"dK9¢W~ª•²lÕƒPé)úôò–£TK¥ìD›…܆•È´g†Ù)Å O¿ä 3‰éL@AóV’2 *+es0Á”æŸä´©cz/Íü&3³©È@uÓS„ÌåS¬©¦%‘“+ÔþœT}ä *D}Æ”° è.—©ÏpÎ’ž¦Âç=Ê)}Æ œ‚§‚$šN5¡”ºOFó9L~bŠN¦Ú¨C¿P[ô s é8µ™ÒâˆT=•PIÚQuÚ% Ý&=“Íiºª4í¥J9zNž'ª ª^ÌIÓŠæR¥)ꢤúÒd^Ô5T}&A‰ºÕXE•¥åœé¿ÉPõ#_­ç§XÚÔqž³¬Ô1'[™J×µ*®H:&XwJS¡Þu®ØÌ'I“Ôã0ÆKg•f9!ª¢¡¾õŸ0],d%CØ‚–ˆ”‚½,e—zKÍÖʬ‰µ h‘ºŸÑFq•¡í jk²ÚÝ´6µ°þ-í‰Ú†V‹¦} nwËÛX&’·ÂI p_{à kXCn‚\åÊV.ÉîrEÒÜèZ÷ºØ•®z²{›ì^wº©®wÁËÜñ7¹ÃM¯z×ËÞöî½ÏõËwÕâÝúbw¸Ü͉}Ñk£þRè¿"Ì~ÝKà˜ÀæåQsÉ[”Ç—.ó½‰x÷›`ÎpÂÆI†s3aí*˜¸a±Aq«–·¶·ëÅIzucÜ»øÅ0ޱŒgLãR&´§bõ-ƒiÌã+MU­Z­¦[}ÊCZº’³¡<ˆ{<+v‚éÇ ukOmØÙ¨Veòý‰L?õu£œ¼éOwºÅf†¨ æ!£þ–W•ÓšJÉJ5)­¸lf¾ÖÕ¶8^óg [RIµÕ©ÆÄU›»,J¹ÍDÖ³­ÒJN7˵«LÕŽ˜uÉç,OÊñTô–©™Tݸ²Þô,6õ ä»Ö9¦E´¦ɺ¢óÕ›…µ§'»jA«ùŒ;®µ®/µä]1‘¾ög­›ëÓÞ:<½ö‘Ä[l("·Ù@q°²±ÄìC>ÛÄØÎvá;m÷ÏÆŒ´»Mn²$û*T.·º×Íîv»ûÝðŽ·¼çMïzÛûÞøÎ·¾÷-*`×èDþ^‘LùMð²¤1C ÄÏD1tì‚;¼Ä’i'%.ÈE>üâSé´‘¹hè-Ú9Nþ+>ñù”<6@¹Ê‰rp…ËC(ÒÊg^ÇŠ#|áPÃiÎó‘@ŰÖyù©Üó¢ýèHOºÒ—Îô¦;]µçæj¢³LÝ*¥[§uÈÓ,ì«o5ë Ùzu„©j˜†]ëÎÈÎý“g,›!™ÆHÛµòXü_ÔÇkSÔxI›ïŒŒ•ñ_çôçmZyÕZsõ+¥h£)%sÚ¿þÍoßõè9]útžþž©ß}ž×î“nîÓÕR¿ñàÃÜÒåÃÙîNò2ae?Ðé“õõ‡¾•[þoyã§ùÑT>òcz쯅û²eÁlUL'9Ô|•3”Ô@¯ÓÍ„w¿,ÑLú»¿¢v…jùWSüÄ[1M?VL¾weµ·~äwvTâÜD}j•€Ì×Yñ×UÁ&°¤€‚Å€.‚€ÈSæS*e±6yåMš%Y¡D|àA‡‚°¦‚‚“å‚Jƒ·e‚+(xö1ƒ8y:¨dERw§µwO·H¨%Q×DO¸„LÁƒRX…Nè^?‚#ÖÁ}½¥[@G…^¨m$^^÷ÒjâÇG¿wÙ¦(&P-f†p׆kµ[g‡vÇ^ÎqfS¨mG$eˆ‚8ˆ„ˆñÔXþûgˆtQņ‡;X†[Aˆ·1ˆ`€Pˆ˜˜‰š(ˆfõmßw”HNœ(e’¨ªTJw‰›¸Š°§Š¬Š+¥‰Œr‚걊¶èg®й˜‰$·(…¸‹Œè˜†˜[Àh‹Ã¸ˆ£XvýŒ°Hx±T‹Œ˜Á8]ch’HÛØ`ÎøÏ¨cY¸¹øU£XN¥8§yŽ¿8{Çø‹°V²cGîøŽ‚5ŒÜ¸‰}´Vò¸ýH‰mAÚ˜¿8ŽÅ!îHK^ñsŠx‰û—'áˆlQŠñX‰©¸$wxf“‘§ŽDçKI’s‚Œåhfõ¨þ sh*+É’õ”Œ¹Œ×$Œ’¨ÇHŒÝ‰5‘áØyüÑŽ"A”i¨‘jG‘ÊxŽþh€é7”þjhµÏئ´‹0gLe–Q‰]’“œ¨‹ÏTOÈCùsc)•¬("oɈ>™Œ<™?b•Áø’S mJÁ”Xs©‹·H•y©—üˆ˜Ä±•®ÈI^ Zƒi5YJ.iÐ!‹à˜•©8y‹ZŒ¢y—[9•a§—#YŒPÙŒà(vª8‰Œ‰S—Ѧ˜v)záø˜|a’é׉‰·X”r“j×–Ò8›¬˜˜”X—É‘Ûa–ΘšÕ˜w¬ù®É””á•sþɉ±©œ¶¹Œ¸ žQ M¼ù^ñ›£q™âùÄ)wƹ›ïóx›?éQÐé’c)ƒþ”–ˆi¡÷ÉrßYž8‘›ë9œÂ™…ç¹’œ¤žŠÈíï)¡ñ šZGŸ:iŸA)”ÆÉ—̸þ‰HZ[ÈÉF‘ŸÙì)žºi¡ Ê J–0ê ºZœè œ':¡Ù“éø“ : ‚šû©„Þ1¢hU¢Åu¢N¹¤£*¢ã ŸRv¾é 5*‹7êœLX¡ÍÛýà4æÝÎcá]ážÞ,cç½f¾Òë €ìæÞK ß’vàÁ¦ß< ß÷­Ù£¤â5­à(žâ â>ã¾Fànà>âo=É5o!ÝØ.ŽáF~ä áHþ`¾ä.váNÎäåÏ5åT[$~åO.ÏZþb0ÞåU^ã`[:>æXnæ^Žæj¾ælŽI;Bio-Graphics-2.39/t/data/t2/version12.png000444001750001750 2357512366325116 20132 0ustar00lsteinlstein000000000000‰PNG  IHDRXËJ @PLTEÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõKѧg IDATxœí[’¬:tD©À¿„Â_EÍÆƒ9CqMÏ z m"7ÊŒ{ët=6™H«…Šæ1 EQEQEQEQEQEQEQEQEQEQEQ¥Mß­‡íw Z×u–øS™ÀÂ,\S™ÆšÏ&<ÁÂ5-×çOKabp°Fž²LuÖbú+k¬ùXºÆ>ßqûØgŸÂ,\Ór%›B;~}Ý0ö÷ßôc-¦/1:XCÄÔ¬Á"×E‹éK¬ ,»ñûÎ/n iz¬ÀPD7…4ݪ+—c}Ü|=±8y§é¢N¦P¸œXõÓbúcƒõ¡(‘u‹ŠÁúQT±u‹u‹u‹u‹u‹u‹¸‹ºI‹ºE…`Yeþ*ôt~J¬žÜþ[áy‚Õ“´€õô<‘éXgŒV_"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-Ò¥L'À:kC°z’°"ÿ³­ë:KüŒ©L`á ®©L`á ®©L`á ®©L7…7mWºfbcÌôð÷jâ~Á2zÁq2á'ÌÄ}€5öˆùNî}ü¡íJŸ(ž¢~‡éaüEˆ›ð€”øiS™*øâÀ²Fɦ0Ä6ék‚•©“©†¿f°¦ß`M±§!6n]v˜øYS™*‚e7‚ß!ôv‹™ð0Ì8 öWƒ`eêdªàoì„רmŠ-Ʊâq)Þšøm¨ÄO›ÊtÝßoã­‰°6&ïáû\â§Meªèo”¶˜¾Ä]€åþðý÷kžý{»ìoð«’ã?·¯*D±…:‘¸FÔ[ib¡j•I÷j°ì&´`a‚66±uçÖEšX¨ `ýÏZ1Xë×ÁÊ,1§¬ŒóQì“Gj:ÂãþÂÁJXŠßÞ|£Îº¯$Áj VÜÑnÜ’U<0meëu`­:vz嬘 yoeýåW=Ë”IÖºâï5·«vÚ—00þyòÚ9°Ö晨Ù+&àloÖùÕ¿BÒ*16Xë·_1bm%wS°:±Öo,‚%Yi‚E°rªÖÖÎÕÛ…-&ßå’u>»ÌO’¸F‚UU[¦2,‰N$®ÑÆ]‚ug‹U/®ßæ¯l&‚%-&Xêd ;Xµçµ¯l&‚%-&Xêd O°š‰`I‹ Ö…:™ÀÂ,„f"XÒb‚u¡N&°ð ¡™–´˜û±.ÔÉž`!4Áz¾¸#S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™6–óùdßÙ¿Æ…ÒÓ—¬é`[‚¥01ýŠÓ—ø `MË]‚5ÄOÕ·˜¾Ä:Ár£7…4M늕‚&ïÓrüÉäÝm9yïÓT¦å"ÂÔO‹éKL°ZÕu–X#X‡'X¸¦2…'X¸¦2…'X¸¦25 ßIÔÝÀ/w?‚l*Ó`M?™ðÓÓ-¦° Öàî¡l¦»›~¨rœ,M¦25 oì t‡qÛg&œ¦Ÿ¸)Te*Óýá§ûkC”˾a∥ÉT¦ÛÃOH¬˜ÊÔ,“Ûrò®ÍT¦ûÃ3Xóä=~Dh1…}L°4´˜¾Ä«U]g‰ Vx0"$Ÿ=H¼ï²*ïÉ—E°5 oÌJ”é¦m"ºwÛÙä–Ÿy^º,‚•¨Ax!V¡›dŠLSÈJÀZ|zõŒ‹K Û˱úë¦Ìh!n1ľKéê-ër3,qx9Y5»©pSXd@°j^ŠÁ"X…Å2´Á*.Þùª~ë—÷}!XM¬·´˜¾Ä«U]g‰ V«ºÎ¬Vu%&X­ê*ÇÍñg¡&&X­ê*‚åÈφ“˜`µª;Qìþh܈C¼ÇÀ„¤ÄO›Ê¾©©æcñã]QvÁZÔɾ¥©=͸ÑÊø3´ÝØUø7ð÷7S¨“ ,|CS†§Áž¢M°2u2…ogKñ¦ÐÄoC%~ÚT&°ð ÁÚ˜¼» "Á"Xý%&X­ê:KL°ZÕ(dz:ÒÆnGKVœx]Y¼¦§Ö%Ÿ•`]-–Šï ô]`ÿ=XØ&XÇ.?°Ö‰uɆÝÛw'B+kI€{^Vnt&Þ`j5¢E°ž+{µ‰±wJVãMµfš;ORv Ö…âó›ÂŒé‰MaÍfªÖöDK(„>&X(`í~c ¡ X_aeBèãgÀ:£-SQÉ `ÕÑ©L}ü°©¾ÄϘÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`áš–KrØìÁq«š[L_â7õâÓ—¬;€Oïóu~¾î•ü]Â5·˜¾Äð`…ë@w±`‹Ïw~wúq¢ÉÑ•|æ-¦/1øwæ#V¦2m/çäÍõµ˜¾Ä«U]o}¬¬íË!å^´®ë,qkÓ¯/-•–ÆÄ€%"Ë Keâ'ÀUé:pT/*'kàˆ¥21øˆ5}–`)LüX®ÆOsww7”<ȸ¸kwu –rµc@°Vxs%\iYøvu%~ÆT¦rÿ‘Úâ+þ ŠnÝ•Œ_m J%é’Ä&%%ÓwîE®C—uI¶xß%['o°m|?Xö°¬ÂqØ2°ì]™C‹4í7ýˆ (.™Ž4+ká²\•#³.É/V·¬åêßÒÆ÷ƒåÎÒÙý"9x˜_Ç>h—¿hÚÝ’Øä;¥KJŒ±â;¥î—ÿ[¾sOÊe‰³Ê¯ÊÖº¬\2uK—ãKÚ¸°¤X¦$DÚNÆ÷béJû¦P2f]ZbR“Â’©3â\…,æWe¬ƒ]Aé/ÉžË.X%ãD °ÊÆÎ XG@¦`•”dF¬£t°üÓb—E®27Veë—ähíe.ù6¶3¹¢q¢XmF,71‘ŒXEé–c‰‘X,ш•))K2b?¹éÆã#–ŸÂ”%qÓBû Q4ÇÜÄ2>‰öpÊT”Ì“\Es¬•Ëñë¨$Wóóýƒ×Å.Ù6^¬þƒ`%g†pl˜!úölöëä%sż»á°iC‰oYûZ±Ë"׉’lÇ%qkïôM©ËV¹´Kòк®³ÄϘÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊž`ášÊtäÿù¬ßþü½ø÷ÓøÏNñç3ý8}(¼³]B°ÐM‹õu¬Á‚•¥äóñ$¬—™kìäýAgëa¬‘&Ç"Áz™i±X#%Ó?v g‡ûºÛÜùÝ?)XöÓK°ÜhøñK›êÜ3´SØÇºÀŠ™Ï'ÀàÜÈãà;˽¢ñZLak˵˒ô9Ë•§`E/ⵘÂ>VVúb –yNX³\‹)ìc` ùAf Ö¼I[LÞ“/—ܾ״X™Má<£ÿ$“÷hËæçòœ¼wa*SëŠÿjw˜ªÓ—X Xó>ÍSþnB_'<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5-—¿ÈðÁõ1ßÞbßж5ÂÕ*akË?]gú¥-–‚5_˜`¥u富>6à4b™è*éîR±Óï¬1Å×ÕUÕbö ºnõLz¿”p±g¨ÄO›–+¾Òðê²áö]ÑuuµµX¸Ò°±máß±¿akQW®øÛ°{»c^ –»Žµ­ÌàW5\f.ñ³¦åJ®Üm °Ú†oØbárêß!–Mô6Vâ‡M˵ÜúEtV<.Å›B¿ •øiÓr…ÉûÄÐzò>!×ÛäÝm Ö°âÂå͈:j1}‰5•ŒXÏ…'X¸¦2ÝÞÜ©…‰8â%SÁšÞÑÆUÖEšX¨[ÁúÝ'“šœëŠiùš¶ëd#Š E°Î˜¬C¬3¦ëPëŒ)Á:Á:cJ°E°Î˜¬CÝ ÖZ˜ˆ#^2¬ém\e]¤‰…º¬vu%~ÆT&°ð ×T&°ð ×T&°ð ×T¦Â/Žf^Lwu&XÀ¦2ÝÖ‚¤ôéöw8‚l*Ó%{"ÏâxÁùxLãÏÐæêÆOsÄRi*Ó5°ì‰<ÆÉiçËM¡S™ª‚5x¤r§å”œ´C°€MeªéŸ€5½¸ Vü®¹¾Ò½õqo`™ X‡'íl}›”¯y?}ÜXf>igXNÞ OÚ!XÀ¦2Õërx‚…k*SM‚õjS™ª‚µu­TìSØÇ½µuugìSØÇ‹`½ÇT&‚¥± ÖXF°‚l*Óý`µXéÞú˜`¬÷˜ÊT¬­Ý Åû°©L`á ®©L`á ®©LÍ›“uèÍÝ©L훓uàÍÝ©LO‡O÷rMð%ÙÜbZ±¸#S™žŸ€eÜÁ€ãaÎß­çÓÍÝ©LMÛ³¼ ›Ëùn×Mï-îÈT¦gç7âYžp¡¢¹û1•éÁðãÞÓùD°é5 –ßÊ ÊT¦æáäj>§gVøúH° Lej>@dO¦Xm -Nœ¼Ã™Êô`øñ¬žtònOc5þ‰ŠæîÇT&°ðO˜êKL°66þ#XÀ¦2=þú9=ÍÝ©L‚uù°@ˆæîÇT¦Ç‚¥ÌT¦çÂ,e¦2,}L°Ö{Le"Xû˜`íÅÝ ºLe ÿ„©¾Ä«U]g‰ V«ºÎ¬Vu%&Xá!þ«óÎq1 ØT¦'Àš~ÊÉG°€Meº?üúdœp»/‚¥ÉT¦&áÓ#ýí¾¸)Ôe*Óýá3'ãlž8H°€Meº=|îd‚¥ÑT¦`™Ü¦“wm¦2Ý~u2ÎÎU?°©L`á ®©L`á ®©L·‡Ï³¯Ë¦EöâÕm“˜`‚•;žo_UÁÚu‚Õ$1Á"Xk[‹`ÖÉD°VaL‹`ÖÉD°VaL÷ƒÅÝ ëùðO˜êKL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–¬Ï¨Õ">ŸŒ¿ñ•-¦/1X¤dœâ¦°_Óbm‚eÿ[l §ÿ¸)ìØ´X¬0OÂÓ!~qÚ%ÁÉ;Me O°pMe O°pMe O°pMe O°pMe O°pMeºìoìOÑÕ¦2wœ€n1[.qeü­ïV7dIÜXñC –)_Xþ¦w™;ýÀ$~Xã-qƆoŒ3ýìïji¯ç~Ë#°Ì|Û{§¦ïîHаŦ1É­Ê?¾(Ÿ •M ÖÆ‹é§ÁÞ8u¹)4 XÉí¾ü ÀrƒÜ#-fWÀ†Š¯öhBöL V¬aÂb¦ÌL’ï ã~ÿ—`ÙÏ-Žö3-æÆO7Zù˜~£X¸'X:VrWË,?-7…ñÝÅ÷/Û²ÅLxfœ†Õ ÙÇïË8°’ËÌ`eF,P°âq)ÞšøíÚ¦kãÅ0yîÃÝÕÒnðâéy2y·³ðÉ»Û ¬Æ`ÉÂû± ºÅöq÷` Âkë,`S™„`¥7cØyš¹iÃbgöö§›Üçaãû K°ÛÑ’…'^W¯é©uÙMœ‰-”¬AS†Í§ÑIGØàËe­>½¬X9û¹©¾qü¬KT’y8&pù°N¬ËÑJ>ÖîÓø ß~1îùX…;'kIÀÞºDÝ4¬19‘8·ˆ»ÀZÿAK¨ûÁÊþÎnŽo¡Ñ ÁÊüo¯KºBׯêfÄN¬‹8±P F,IÏ¢X¦'6…òÄÛu}ŽXËZ~{Ž•1}XæXÇËZ|ºÍ·ÂÓmž1}XÍ¿¦Sǧ™)æÎ²Ž?]¬3Ú2•ÜVUm™ÊT}¥«¶~qG¦2…'X¸¦2‰ýÓï,üÏýô+ ÿ[ï[ý–¦¿_âœû þ>~!X?÷°Ê¬„J!XÒûm¼]–Xú@°6$ô†ƒŸ~ããßÿ3ã+ ÷™ÁrþŒ7]Îô™i ¿é3np´ï~ç%ü†ùÝx .¢]ŒÿÌ/Ê^»¹ V^ÀúM]gñq?ùÏùíŽýŒ-,Ñgü,bÓ»ó°òK6…¿aÆÐùEKµKpÁæˆÛÛ-ÍM°ò:ÖÏ7ÃÜå1Xn¨ Ý;dÀš†&7ª +°bƒ¬h Ë¥þ¦E.À†ùu‚…V˜heÁòݽ+Þº.ßË-A Ö*âì½Q»¹ V^Rÿ_úë·µ)âÏl€5½îF¬:1XÙMá°'ïÐ`…©LPì´:ÙÌE#V4­N'ï‹+L½Ýähž™GSû¬èÝŒË/BÚ½þ¦>~#X§Ã/'ï×LãíÚ¯»>&XñCŸMÿÏøÞË[L_bt°þ¨ù€õ%X4•‚52“eŠ`Ñ4SW¬ ª¯ÛÜÙ>ßqûØgÓÛ,÷ì-¦/18Xé¦ÐŽ_ßh›˜ Ã÷µ˜¾Äè` SK°ÜÈF¬·˜¾ÄªÀ²›;–ÿ1̱¸)ìÞ´XaÑ•‹›BšJdçX·ÕKF,·)´ïqòNS±B¡›c=ž`ášÊ4Úëáð ×T&°ð ×T&°ð ×T&°ð ×´\öÊNö¦7ö>$ö•ïô¤›Ó—¬Q,ãïú6.gû2Â7‡'X¸¦"{7¥p%cü]»úi1}‰ñÁŠïúîSéPë¦Åô%V–Io"H°hz¬ 㘊ÀòSø>ZL_bt°ìuƒ“o…_w}vŽX4½V´»Á]Tڸ¦çÁ O°pMe O°pM‹uæžTÇ*K~—ªc,ê,ê,ê,ê,ê,ê,ꕃEQ•‚5 ìÏü“®©L`á ®©L`á ®©L`á ®©L¹EØ™Z|D©Ÿ»}ÍüÁ½cUµ˜¾ÄZÁXÆD™¬ÝSUµ˜¾ÄŠÁò'N§~Ýù†œ°öO=TÕbúëËž\á÷'\n {6•i,3ƒ5,šÊ”]Ž?ÏÐ,À2&šY¬ÎLeÊ-Âî»O¾:Ú܃?Ñõ-¦/±Z°¢Ý n”r)šÁš^G‹éK¬¬ÎZL_b‚Õª®³ÄZÁjy(UCZÀzú2J&‚EÝ"‚EÝ"‚EÝ"‚EÝ"‚EÝ"‚EÝ"‚EÝ"5`Qʤ¬Kþ×Â?aª/ñ3¦2…'X¸¦2…'X¸¦2…'X¸¦2Ý^4lØbÓT7½‡›üF‡óÁ _Ö†î /ûžÒ¸ÅX&ÜáÅG¶á‡ùƉ1Leºî?Ÿp8ß8vÄúº“%íýˆÖ ‚(1ˆ©LüÃyaóÉ=À`…S$‡ø\‘ô̶›ÂLL5ü×÷CËÌ` °·¨"Xª– g"úùp³•./öót³ËFŽ>“ÆT¦ þþòÑõ`G¬ù$¶Åi“ñ™mP‰qLeºî?‰ ¿øÀ`E»ü7 Ù)“}ÜXáÁTÿD‹éKÜXéNEU-¦/q`È!:¸co‰.«ŠaÅ~O÷q`ýGF&óv9X¹%n¹,+Àº|@D,‚U¥!Le"X«°N¦»Àš•{í@Å`e*ŒßUë.Ì;?ŸfXK9X™·9b,‰!Á"X,‚UX'Á"X…u2UkkWâêíÒ•–ï°Ì:—‡û=ÝÇ]€¥¾Åô%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%~XŸÏâÏÇý4ý ¿Åô%FëóYA³–%‰`õiZ¬‘‹6¶ÁzI‹éK¬,KÎôÓôÏ÷?³ÿ°Ü{þµèâTµ˜¾Äà`¹M¡ÅÉ__7Œ¥/ú…Ï#–c*<û†õµ˜¾Äè` ¡!äëÆ!‚EÓú`Å/ú…ï€å· [L_bp°²[½¬ìˆ^Ö#–ÒÓ—¬až„Ç“wÏÐzòîæëÈdkÉëí¦2Õòçëõ¦2UóçˆõvS™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™.û»Ä7eÜ• ¡ÅöqG`Å)Xð7iSØÇ¯ËLW¸¯‹goò7ßùÖÝ;Ë,ÀòïNw4ñM(qZLa¿, I‡˜Ym MÖ|Ÿ\‡áÁ¼ °©LB°{›ncÂM/c°Œ1Y°ìç¿á&X-¦°_ –»ä ¬èžÐ¾Ä„ûùz°nYéÞúø}`V2bE7ÏŒXë%¦2 Áò“÷èþÏóôük7xñô<™¼Oˆqò®ÕT&)X²ð~,ƒn1…}Ü=XáNÞ7¯to}ü:°þ7ÒßÓÿŽô÷ô¿²ÚZÖÿeõ@‹)ìc‚E°Þc*ÁÒØÇ¯ëoúƒõ÷4ÖÖ –2S™Îƒ5pÄêËT&‚¥± Áz©LKc¿¬W¶˜¾Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³ÄÊÀ*½¹ïWا©L[`eo‘Éaöl*ÓÖrJÀzI‹éK Ögu/!Ü3ü#ÆavmZ¬ôî_ÑÃŒïWHÓPW,‚¥¶;‹7iz½i±>É=¡×`Åó©o„Ù­i±ü–+š’G›´Ïüö¼pÞ³cÓbíï6?fw<¬8Çz½i±JÀrû ¬9b½ÝT&°ð ×T&°ð ×T&°ð ×´\&Ül)Ü Ç¬ï ÷úÓ—¬Q,ßðíÂMRõµ˜¾Ä À²·Xšï$èî‰Ã‹¦—Àr·¨üÚŸ£;t,š^ËÌ` ‹¦[uMøÇT–ŸÂ÷Ñbú£ƒeoø–|+üºÛVrÄ¢é°¢Ý ögwCK‚EÓ+`†'X¸¦2…¿Ýtë–Q2½¾™ru2…ßy»ÿª¨N‚u1|n¨ƒ’ê´Ëµ¾yiMŒìIDAT¬:«þt¾[uú¨&XD‚ *…#V7ªÓG5G¬°8ǺSuÚåZߨž¼×©«Ó XH4n^‚u_q$^ßL¹:™ÀÂ?aª/1ÁjU×Yb‚Õª®³Ä«U]g‰µ‚e¿²ÄÇg¹/1öÀ-÷Á½/5ªZL_â ¦ö;Hržÿ¢:wlú5E¦-ÿ–1‘W´×d÷Û²ªnÒ—¸’iË„<“ŽõØÕËŸº3°óugï¸$1ŽXÚM=íÏŸNãû8íØÊ`Å~Ä2.IôÐÓ×ÇO˜†>¢);0°W{SèÎ1 ` ëu¦XfkÈ€U{Äògí˜XÉß!–jSÿ]Ì,À2&9C«*Xöøˆä[a”ÄOï–fS Ìò쬹c¹aòïnp£”1s’¯{!Þã´˜¾>~¬hwCÒÇX·ìnPÛb=$~ÆT&°ð×MO¯ «o3]½ñF°ÎÒô+„fªTœ´^X;p°š"ÒR§qk»µCÜ`½‘–:‰cu° ;gþm¸ AÔ.tb°Ä)…‹#V{kÄŒXœc•ê$"WÛø…s¬›×}g>d vÄúnžœòMvJ¬çÁšÏ²˜•kãä”ä<‘›ÂLL5ü×÷¶@k}rJñ H}ÜX&œ×sú¯÷·ØîÉ)ñg`ØÊTÁߟ,D ;bmžœŸ'•ÇT¦ëþó—¨ð‹ V´»ÁÓ€ÑÇ]€*\@ñ‘Ó—¸'°ÒÃH–o—`[ï$S ­‡âQfÃùÔqkCÕü§cyü6dñ¶ùW8Þbj>Hh»øÏäÜ7äÌâȬӉ V=ÿ¹[þ­wº;ää+wwz@Þ×ÿû ¾K ¶ýCìãNÀZôÍ¢ãÃH Y齃WΤÀå¨-Àú¸ °r= [ó»-¿Ä¢N6WÑç÷]@å»ÐLKîÏ‹`­TÇŸs¬S«àß V¬Šþ†û±VXø'Lõ%&X­ê:KL°ZÕu–˜`µªë,1ÁjUW¡8|¿0áÐØÄ«U]E°æ[¬´N&°ðíLÝÎO»çͤç^ǾŸf"X'JÂÉE&=2ºÜ9Xb‚¥¡ÅÜù:þ^ á¸êèHe°ÄϚʾ¡it^}ro½•øaS™À·3Ç¥xShâ·¡?m*Xø†`mLÞÝ‘`¬þ¬VuõŠ¥‡8¬_<<„ë‰fòÇ]¸¯PX}ü$X™ƒ²ä¦Æ–ÑL'³:|QŽ˜PX}üˆéö¤]°XNRúT3­qÚ;B¶øF™°ú¸±iAóG‡Cïšæ–sÛqÍû8‰Ï)CL(”>nn*î|Ãû…mµh¦S8m­ãVb¡úø1SŽXÑúqĪ]Ì9V™©LX}üˆ©+NúÂ>‘›~+tÂêã'Á²¾ÕÏ›–Ù¸™NãD°zJüŒ)EQEQEQEQEQEQEQEQEQEQEQÔMúA~츰yIEND®B`‚Bio-Graphics-2.39/t/data/t2/version5.png000444001750001750 2407112366325116 20044 0ustar00lsteinlstein000000000000‰PNG  IHDRXËJ @PLTEÿÿÿ{hîÿÞ¸‡ÿÍð€€_ž ½·k¼­ÿ/ÁÿÌÿÖÿàÿî‚îÎÑdêÿôÿÿÿÿôÿêÿàÚpÖŠ+âÿÿpؿ؀€îèªúšðæŒd•íÿÿ/OOÇ…ÛpÿÖ@àЀÿÌÿÁÿ·ÿcGÿ­”Óÿ£ÿ™‡ÎúÿŽÿ„ÿz™2ÌÍ…?¿ÿÿÞ­õÿú­ØæH=‹ÿ"‹"øøÿÿúúÿäÄp€iiiÿpúúÒÿeÿ[ÿÿàÿQ¼ÿGÿ=ÿ2€€kŽ#ÿ(ÿºUÓÿÿÿi´Ý Ý¸† jZÍÿÿÿÒ´ŒàÿÿÜÜÜÿøÜî.‹WÍ\\ÿ ‹EÿEúë×Ü<Ú¥ wˆ™F‚´fͪ€€ÿ×¥**ú€rÿëÍ€ÿäµÿðõ²""ÿõîÒi©©©ÀÀÀúðæ2Í2pÛÿ¥ÿÿõõõ ²ªðøÿ‹é–zÓÓÓAiáÿææúÿÚ¹ÿÀËýõæK‚‹°ÄÞÿŒÿ z|üÿÔšÍ2‹‹ÿPUk/HÑ̘û˜¯îîÿïÕ°àæÿÿ ÿÿÿúðÿ(ÿðÿðÿÿ2ÿ=ÿGÿQÿðÿÿô¤`ÿÿÿ¶Á<³q[ÿÿäáeÿpÿzÿ„ÿ€€€Žÿ™ÿ£ÿÿ­ÿ·ÿÿúÍõÞ³ÿÿðõõÜ€ R-‹‹‡Îë§ê^S IDATxœíKš«:„ñànC=îÞg즇½é.£H à!2QÄw/§lœdúKÈ a (Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(mK‹òšŠEë¸Î?““0óKnRL¿˜ÏGŒy‚%7i½>"X  ëÇS–©Î*¦Ï±°~1K×ïŸÏøëÅ>öÕçóKnÒz%‡BÛ®ûûoú±‡Šés,¬!bjÖ`‘ë¢bú«ËüÆyàÅC!“+0ÑÅC!“–âêeÇX7^O{,Þ™t‡).VýTLŸcÙ`}( Á¢nQ5X_ŠªÁ¢nÁ¢nÁ¢nÁ¢nÁ¢nÁ¢nÏcQ7‰`Q·¨,«Ì_…žöOÁ*´dùo…ÇÓ¬ž¤¬§Ç‰¤C`ID°úÁ¢nÁ¢nÁ¢nÁ¢nÁ¢n‘°(e:ÖÑ4«'é+ÊtÑ:®3ÇÏ$Å$Ì<Á’›“0óKnRLÂÌ,¹I1ÝdÞ´Ýé+c¦Åß?R÷ –Ñ Ö'~’鸰~-bÆié~Ñ?´ÝéÁ“Õq˜¿_„ر IŽŸNŠé‚ü¿Fq`Ù…Qr( ¶MÚÇš`eâ0]‘ß 3XÓï¿°&ÛS›t·Î»èøÙ¤˜.ËÇ!´ìŠ™°fœû«A°2q˜.Èoì€×ØcŠ –ßcÅýR|(4ñjQŽŸNŠé|~Œ&À* ÞÃ÷qŽŸNŠéÂüFiÅô9î,÷‡ï¿_óìßÛ±¿Á¯BöÿܾЀlƒ:àøŠïÄÛÔ1¨«Àʸ{5XöZ±1 Æ&wl_PÇ .ë_kÅ`­ßÛ+³Åœ"°2™÷l¼RÓ–ÛÛ+a)^]\q;ìï$Áj VÜЮßÂÀªî˜Š]ÁzX«†ÞÙ+&¯q¹+ë,¿ë1X¦NX눿÷Ü©Úé\¯ƒñ¯“÷޵þ3ÏDÍX1Gk\Œó»†¤•cÙ`­W¿¢Ç*9†›é°:ì±Ö« ÁBvš`¬œ.«t2dµº²bø)—læC¶ëò!ޝ¨ñ.X—ª”ÁBtÀñ5î¬;+vyðõ5e™L°NÄafþv°®×¾²L &X'â0 3O°$”‰`¡ÁëD&aæ –„2,4˜`ˆÃ$Ì<Á’P&‚…ó<Ö‰8LÂÌ, e"XÏw”“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›Sa;ŸOvÍö3.”VLŸcá`MÛ,…ŽÅƒåH©ë•ÓçXXþ.éŸÑ½JßæW¿4®§Ëß] ¯bú‹kÄâä0m™7£ÅüýÓçX½Z$ý"Át»y«¿fÊôpÅ<ÛYjwwo[§ËD°`ó8YW6Så¡°*ÁÔÂ<ŠÁ"X•ÁZ‹`Uo|U¿õËûv¬&Ž Ö[*¦Ï1Áj×™c‚Õ*®3Ç«U\gŽ V«¸ ‚ã¿æø;‰¤:&X­â.Ë_‘Ÿ¹ QŒc‚Õ*î@°û q ñ’?“0óM“ša¾?>eÏp¬E&aæ[&µ· ×[‡¶ë»*ÿþþ2…8LÂÌ7LjÂb˜qì-Ú+‡I˜ùvIã~)>šxµ(ÇO'Å$Ì|C° ƒww@$X«?Ç«U\gŽ V«¸ÁÐu<«+mìq´fcՎבÕ{zh_ò^ ÖÙ`üR|m oûïÎÆŠ`í¸üÀXö%kvëÜ( m¬¬%îuX¹Þt\ì`®ë‡Áz¬ìÓ&~m¼²êo.+ÓŒØq’²ûH°N?f’8^Y¦ Á*´@Ihc‚%¬Ío ˜$´1Á’ÖÎWXLÚø°Ž¨” ¹¬k´““„6~8©>ÇÏ$Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›´^Èe³;×­j®˜>ÇoëÅÓçX>X3€Ok‡ù9?£{'?K¸æŠés,¬ð(ãlñçµÓMŽ®ä3礼>ÇâÁ²ÿÛ›”|gdXÄ“»…)©bŠJUÓçXXÓ3^»ˆŸhbq2CÔcù4<ö˜´^öPhÜ“ýa.€eX‹‹‡ÂN“Ö+ Þ->¥Áûà׆C!{¬“b*oçàäŽú*¦Ï1Áj×[+«ü8¤Ü›R ñy dŽ8‚•;çë@Èùm–Ã5¶õE´ñd@‚E°Â%+ž†a±È¾Y»h×™ãÖIGZ+3,Ž "Ë K¥ã'ÀȺè9pT/ª'k`¥Ò±ðkú,ÁRèø °®~Ÿæéžn¨Y`\ <µ¹»Ë/P®6,‚8WàNcæÛÅuæø™¤˜êóÿ¨­î±âš¡jêî(ä÷Õ¶"dQã.ùHœ¤&dúνðµ›e’ ÞÎ’Ã v Æ÷ƒe/˪4ÆÔegeÛ)í˜~Ä„ T‡LWšU€µÈ²Ü•½,f’ ^ìn XËÝ¿¥Æ÷ƒåîÒÙü"9x˜/_×>oß™h·¿(ífHœdªÜ%!ÆõXñL©Û!Æÿ–oÌI¹ q©ò»RÚ—U–LÜ2Ë~Á’W†´ËÔ˜Hëd|+Öî´/-@É|™umˆI“T†Lûªd1¿+›`íœ JI¶²l‚UÓO´«®ïÌ€µd VMH¦ÇÚs—Ë¿¬Î²ðUÇbaWJ¿${{eÉרŽäªú‰`µé±ÜÀ鱪Ü-ûƒõX,¨ÇʄԅôX•ÝOn¸ñxå‡0uNܰÐþBT±7°Œo¢Ý2$5#ÀÄWÕk•eŒµ’ ŽùñþÎÉëê,Ù/vÿA°’; wM86Ì}{6ÛqxÈ1ŸnØ-mñ•µïUgYø:’­qW{£mj³”j¼—¥XÈ¢u\gŽŸIŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bÚËÿù¬WþÞüûé÷ÏFðç3ý8}(¬)‡,éI«õùéXƒ+KÉçãI"X/KZ­_#ow:¥E¬MŽE‚õ²¤Õr`ý(™þ±G8ÛåØ÷ÝáοéþIÁ²Ÿ^‚åzÃßÚç^I«˜Â6ÖVÜÉ|>·p=ƒo,÷fȽ)¯b ÛX#X–¨5X–¤Ï.X.<+zS^Ŷ±B°Ò7S°\Ïs¨Çšó‰«˜Â6VÖïd–`͇´Åà=ùrÉCá{“V+""s(œGôŸdðÙüXžƒ÷.’b `É¿:¦ªbú+k>§y(¿Ð_cž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“ÖË?dxçù˜o¯ØŠa«žV)Ö±°übï9Ó/­X Öü4b‚•ÆÕë÷dô_§ËDOIwŠ~g©~®®ªŠÙ'èºÝ3é|)áaÏ¢?´^ñ“†W ·k¡çêj«XxÒ°±µðkìoÁZÄÕ+~Àv¬ÁNw`ÌKÁrϱv½•ü®†ÇÌ‹sülÒz%On… XmÍ7¬Xxœú8$ݲ‰VËrüpÒz-…~]€÷Kñ¡ÐÄ«E9~:i½Âà}bh=xŸëmðîˆëXqàr2¢Ž*¦Ï±&°’ë9óKnRLùÍBÕæ——jp‡«ù%vZähR»…ß‹º=­«ñ0®·QÏÆ¡}AƒÊlbo3F `}ïÓ4>4! tŠà°9ðuØÝXÑÒ~{.?°ÖÁ"BŽA%êûÉ"h·‚eÏŽ›¬Ê“š'ÀZà^W€•«v,Ê¡(¬È_Mw[¿˜÷üÊý-ì¾K²ø­¸ ¬u­Üþn„¬ú›ó5^ýF,bÞq))¦=ógö¼X{,xOëÇXpyÏí ìÔ«Àj3Æ‚ö”`½,ì[ᙤkW·‚u§I`‹§’{zG/ÙÔ1¨;Áj×™ãg’bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜n0¿¸šy1ܼ֙` NŠé&°$¥/Ëßá–घNå·7ò,®œ¯Ç4þ½a¾ î÷iöX*“b:–½‘Ǹ+™'hÆpE‹»â9\[>#G°4&Åt¬a¾,Þž[s¢Î÷hx°ÜZޱô&ÅtXÓ{E°Âg–Ö¤˜Îe2`e…fq7 ÁÒ˜Ó9°ÜàÝ2• ÞÃ?ã°¼sýE`Ow”ÓI°®6O°ä&ÅD°:~?X¥‹-TULŸã÷ƒUº,QI1µ7 ²7S¬…'ÞÅ%Åô ùß]=éàÝÞÆjü åî')&aæŸHªÏ1Á*,Šÿ,ÁI1=gþü=="ÊÝORL‚uú²@åî')¦ÇÌ‚¥,)¦çÌ,eI1,mL°Ö{’b"XÛ˜`mÅÓ º’bfþ‰¤ú¬Vq9&X­â:sL°ZÅuæ˜`…EüWçëb–घžkú){%ÁœÓýæ×7ã„é¾–¦¤˜š˜O¯@öÓ}ñP¨+)¦ûÍgnÆ)Þ8H°'Åt»ùÜÍ8KcRL-À2¹C!ïÚ’bºßüêfœ§~,ÁI1 3O°ä&Å$Ì<Á’›ÓíæóWÇlk'AòÙÇÛYVÁa¾-‚•è~°r×óm+ÓLe"vš·œÞä¶Ÿy]»-‚•H0X 2UISÈjÀZ|zµHúE‚H$X™Þ®˜Gb;Kíîîmët™V °N'­IŸcm. ‚E°*ã0,‚U‡é~°ètÒªôðî¶qL°ÞR1}Ž V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î ëóÓjŸO&¿ó•ÓçX½eì*°réwä†úÆñ¿³/QHf±Oàò`Ø—½|¬Í—ñ ß~3îõX•''kIÀÖ¾DÍ4¬19à8·‰»ÀZÿA Ôý`eg‹ý[(šH°2¿Çå}Iwè¼ãUÜŒØ}ƒjÐc!-+½Ç*$=p(Ä—ãúì±*¶µü´ì1V&éûÀÒ0ÆÚßÖâÓm¾®y&éëÀjþ­0:n¼Ì 17¶µÿéëÁ:¢RR(ä°.U))¦ËwúÒŠÉî()&aæ –Ü¤˜àüßiñ­3ÿu?}kÍ×ÁÛ©¾Ë¤ßo’9÷AýmüB°¾n±Ê¬„J,´bßÂê:Çè‚`溃¯í¾¿åßÿ3¿wî3ƒÿäü¿6ÝÎô™i ßé3®s´kÇy ßa^oÁY´›ñŸùFÞ¯.7ÁÊëXß©é,>î'ÿ9ܱŸ±½…E úŒß‚ElZ;w+ßäPøf ‘o´U»gl¶è° °ÝRn‚•×°¾®¿æ&Ár]MhÞ!ÖÔ5¹^eX'ˆÁж°ÜêwÚä¬a˜ß'XòÁ ­,X¾¹—`ŇB×ä°ÜP°Vç,ÑŠ«ËM°òBóÓE¬oéP8ÄŸ)€5½ïz¬:1XÙCá°ï¢Á C™Ð¡Øaur˜‹z¬hXÞ=Vz»ÁÑ<2†ö1XÑÚL–o„´{ÿMmüF°›_ÞÏ%kßîÚ˜`Å‹¸Ç:”`¬q9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚5¬îPõOKT1…mL°°¦Ÿ’G‰¨˜Â6î,ãá7?nƘ½g,ÁI1ÝjÞ îa¥cü”H u&ÅtŸù©ƒr küLïJÚI÷ –{ü(ÁzMRLw‚er‡BÞµ&ÅtŸyc¦+y’dxHü]I;iã®ÁRS1}Ž V«¸Îw–¨{zÀV‚ä³;ŽkŸQà~ ëðm¬D÷™÷'C=ïd±Å2;Í[ù˜åò©Çë.ó§ÁJ©JšBVÖâÓ«EÒ/,@·™-|¬LoWl7}ÚÇíl{o[‡ËÔ4î`]{(<\±ÚG¢Õ$ X€ÁªŒÃt£ù½ Á"X'Ìo|G/êtÒªôðî¶qL°ÞR1}Ž V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\g޵€õùó~ë^^1}Ž¥ƒõGÍg¬‘`1) Ö™,S‹I3qÕš ÝáÎþó½ØÇ¾šV[°Ü«wVLŸcá`¥‡BÛQ761Ã÷ULŸcé` SK°\Ïz¬WLŸcU`ÙÃËÿÆX<vŸ´ZáÑ•‹‡B&EdÇXwÔKz,w(´ë8xgRX!б6O°ä&Å4ÚëaóKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›´^öÉNvÒ;‰}gœ^tS1}Ž¥ƒõSËøYß~Û)?FøfóKnRHÆÎ¦æP2ÆÏÚÕOÅô9–V<ë[˜§Ò¡ÖMÅô9V–I'$XLz¬ 㘊ÀòCø>*¦Ï±t°ìsƒ“o…£{>;{,&=VtºÁ=TڸIƒ%Ð<Á’›“0óKnÒj™3‚êXÕ`á³ÜP‹`Q·ˆ`Q·ˆ`Q·ˆ`Q·ˆ`Q·ˆ`Q·ˆ`Q·¨,ŠBT Ö$a6àŸtä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1å6aGjñ¥~ì6šùƒ[תª˜>ÇZÁú-XÆD™¬Í[UULŸcÅ`ù› §[ Gw¿ág¬í[UULŸc½`Ù›+üåïþ† ÃCaÏI1m€ef°‚Ť˜²Ûñ÷šXÆD#+‚ÕYRL¹MØs÷É·BG›[ø]ßQ1}ŽÕ‚np½”ûKÑ Öôþ;*¦Ï±V°:«˜>Ç«U\g޵‚ÕòR ê iëéKÊ(L‹ºE‹ºE‹ºE‹ºE‹ºE‹ºE‹ºEjÀ¢”I X§òŸ3ÿDR}ŽŸIŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bºÉ<4œlX±i¨›NÄá¿Ñåü˜ð…`tyì{J㊰L˜áÅ[¶æ‡yâFŽe$Åt>ÿ|ÃáÇ=•žTTU1}ŽûkçBè⎭-²¬"˜…ó=ÝÆ}€õŸŒLfu=X¹-–²,#vÀ:}Aˆ6&Xë’‹HЉ`¬Ê8Lw5+÷ÞŽªÁÊDªÖ=˜w~=°–r°2«Ùc,$!Á"X,‚U‡‰`¬Ê8L€U:•¸Z]»Óø Ëlæz³p¾§Û¸ °ÔWLŸc‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™ãw€õù,Ö|>î§éýÓçX:XŸÏ šm°,I«Ï¤ÕúqQÁF¬—TLŸc`Yr¦Ÿ¦ÆOüÊþÀrëü{Ñ'þÖþÞ Ä©ª˜>ÇÂÁr‡B‹“ë¿F×¥oúÏ=–c*¼Ûú*¦Ï±t°†ÀÐ2º~ˆ`1éõ`Åoúo€å +¦Ï±p°²G½¬lÞÖ=–ÒŠés,¬a„ǃwÏÐzðîÆëÈähÉëíI1]•Ÿc¬×'ÅtY~öXoOŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“b:ßMtOÊÌÊ&¡b Û¸#°âE –øIÚ¶ñëÀ2Ó®Ïų“üÍ3ߺ¹³Ì,¿vš!ÐÄ“PÊ©˜Â6~X~ I‡˜Y MÖÄ„ù|=X·ìtomü>°Œ+鱢ɯ3=ÁzIRL X~ðÍÿ<ÏG{À‹‡çÉà}BŒƒw­I1¡`aæ}_&ºb Û¸{°ÂLÞ7ïtomü>°ÒYþéïå³*m+?«ÈSØÆï+W†`õ”ÁÒØÆ¯ëO1X/ó`•&<"XÊ’b:ÖÀ«¯¤˜–Æ6&Xë=I1`ñtC¿I1 3ÿDR}Ž V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ•U;¹ç+ì3)¦XÙ)29fÏI1•¶SÖK*¦Ï±p°>«¹t†0fø'FŒav´Zéì_ÑbƉó2iˆ«ÁRÛÆÅIš^Ÿ´ZŸdNè5Xñx*€Å‰0»MZ-䊆äÑ!í3¯ž7Ή0;NZ­íÓáÇ쉇Ղc¬×'­V Xî\BEjöXoOŠI˜y‚%7)&aæ Û,Ù¨IDAT–ܤ˜„™'Xr“Ö˄ɖÂL8f=3Üë+¦Ï±t°~ `™x·“¤ê«˜>Ç À²S,Í3 º9qØc1é)°Ü•£ý9š¡‹`1éi°Ì Ö@°˜´hÂÇ8¦"°ü¾Šés,,;á[ò­ptÓV²ÇbÒ`E§Ü¶ñ“¢öS1}Ž¥ƒ%Ð<Á’›“0ó·'-M…éõeÊÅaf~cõ5HäçÃ@u‚uÒü5Íp ’tM]εÍC`]³ëO7à»uM] ‘ ‚jácÕ®i£+{¬ °8ƺS×Ôå\Û¨¼_wM3ÈB¢qy Ö}Á× ñú2åâ0 3ÿDR}Ž V«¸Î¬Vq9&X­â:s¬,û•%¾>Ë}‰±n¹n}©QU1}Ž/Hj¿ƒ$×áù/ªsæ_S0•ò°Œ‰rEgM6¿-«j&}Ž/JÀ2áϤa=vW‚åoÝ™nØÝÝ;ΉEŒ=–ö¤ÆÞöço§ñmœ6ìÅ`Å|eœ“è3B+¦¯ŸHÚtˆ†<î~ÀÀÞÕ‡Bwak X¯K:ef°† XW÷Xþ®³+ù;ÁRÔ3 °ŒIîк,{}Dò­0râ‡wKsR Ìòa¹aðŸnp½”1³“ѽ€åTL_?Vtº!iã¬[N7¨­XŽŸIŠI˜ùóI^¯ «oKººzã`#¤éVÊtQpR½°wÂÁjŠHKÆQXåj» Àz-"-uÇËÁªlœù·á,XDD¢6¡ƒÁ‚…‹=V{+â z,ޱju‘³5~áëæ=O^7Åñ0"—é¢à¤z‹_€—u,ø!ôÈNoµxè¼rI*²ìULRwV®…¢nk^[1Ðò[¬jôèp}~; T°e"Xx~öXk¥kòsŒuhA°*üVH°b]˜ßð<Á fþ‰¤ú¬Vq9&X­â:sL°ZÅuæ˜`µŠ» 8|¿0áÒ±Ž V«¸ Áš§"Xi&aæÛ%u'?í™7“ÞW´ûû~ÊD°„„›‹Lz'dô¸saŽ –†Š¹ûuü\ áºêèJeaŽŸMŠI˜ù†I£ûꓹ=L´Z–㇓bf¾]Ò¸_Š…&^-ÊñÓI1 3߬ÂàÝ ÁêÏ1Ájw]0z‰ÃúÍÝK¸ž(“¿èÄãxAÉjã'ÁÊ\”…'5þ²4e 8™Õå‹8b dµñ#IË’V4Áb;IèSeZã´u…lõ%˜dµqã¤å.‡ÞLšÛÎm×5oãß-R‡()mÜ<)ÜùÂûƒZ”éN¥},9%¡KÊ+Ú?öXWsŒU—“¬6~$© NÚ¾À“~+t’ÕÆO‚e¾êÇ“ÖÙ¸L‡q"X=9~&)EQEQEQEQEQEQEQEQEQEQEQÔMú?Ïžúp²F+ÓIEND®B`‚Bio-Graphics-2.39/t/data/t2/version3.gif000444001750001750 5177012366325116 20031 0ustar00lsteinlstein000000000000GIF87a€¯çÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔªªÿUUÿ,€¯þ; H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏd©tQô@Ó§G—VÍZ êN¢[wz=[víÔ²i¿Žíz5îß·ë–Í»7ðàÈ‘?¾Ûöë寅ûŽ{zòçÖ¡_'X\»÷ìàþW^znëÝËSÿ~^¼zòíÍOý{ìîOÒ—o¿>|ãáÇßýÍçÜÌ!H]€ n—àƒ6ÈÞ€Vç_…fØ„R§!q÷Ib~bh¢ˆ$¨â‡î·â‰nhÒ~~øc‰(FxaŽ/rÇ#‹8¸cŒ#êä‘&)cDi¤’EB™"RRèc“Vbia–HN¸à7V¹eITÔX#jg‚É#ƒZR©‹nF¹dœN& g˜^Èf—r¢§f›î)&BòY§—‚执Ÿ€þùåI5 é¡}N¹(¥ 6ªé£\掊™h¥‚º©¨¤2‰¤©†v:ç¥þ®2Úªª¨Bênf¢é­fFJZ¯°ŽI(­o†ªh¦±bZ¨§Æ^™ì³œ2{ê«ÍÖɪ´³Žª,­×«åx#•™ë@iv’æ®·šk㤓f›ê°Èuûn ó†*ï¶zÖ{ê½Ðæ‹o°ñV ­¶ý~*0±Î’Inºêšv.¯é>Œ°¥SÉïÄüŒ1·«1¼O›êLJ<+ÈÈnŒrŠÞžL¯~ /¬+»Û(óšúºœpËØü¯½ãüó¾A›sϯ­ÒHí®­’2\n¹QGíÍB ´ÈÛ’ìô˜<‡0Ó<']rÊdGiöÁ^s½¬Ø]£$îýFuÃêR]«þÖD»½qÛ:·ø5¢G—=¸z€÷\¬ßÃ&÷Û…#.7‚§M1ã&+>räÖ^ŸãG¯í7èC?ùøßœ—êyƶöêúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üò´›ÄüóÐG/ýôÔWoýõØg¯ýö¾;ïGà‡/þøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ _»FR£ð€L ÈÀ:ðŒ ß7@‘p‚Ì 7ÈÁzðƒ ¡FÀï‰ð„(L¡ WȺp~ É_HÃÚð†8Ì¡ÝCÌp‡þ@ ¢‡HÄ"°‡ù¡—ÈÄ&:ñ‰9D¢G¸GÅ*ZñŠXÌ¢·ÈÅ.ÆÎ{^ £ÇHÆ2šñŒh Ì0—5•e©Séøfº8ú‹ŽMc£ÑJ—ÇÀùÑgx4œŸ6#G¥ñˆL¤" =>¶Œ‹…Ü#'IÉJZò’$|£!©0IšŠ  ¥(G9@MbK‰Œä&?9ÊVºò•;,åꢃJ ªò”¬„¥.wÉKÊrªåoùÈ\öò˜ÈLfùÇbz˜E¦2§IÍjÚ™šs’4#MmÓšà §8чÍÓi›ì&—Ð9ÎvºS™å´£®žÙÉUbòžøþ̧>¹çÈhnQªÚ§@JЂ¯ŸÞÔ"@-Ç:„ª˜„s(Ç *9‰Zl–wtãÖš¹9‹fΜ›E?'Ï‰Ž£—CéCUŠ:š£/ ¤Ú`Š6S ’¥)NCêRÁ´¡2íÜOåXRŸî´ èQ÷Ô•fs`:}jK›ªT©æ´§«¢é²’zÑ¡f”«-êÒl:S¯Æ´žVå)Uƒc³”©dêR ©¢¶g\®“kZáªÕ:bíÛ\÷†Ö·25°AÒ` KW°¾Ô¬5•]k#µÑdò±ƒèZÃúWjAŽ[¸ú X*UVjW–¹Ìµ¸ÌVt³˜Ýþ«–òšÚ[ýŠW"! »êZ’†Ö­b-m\ÊXÂ’ä¤Ru¯$E.4Í&b­•mc‡[ÕâF4bÍ­Y…&»[ÎÂv«Ôå­t^ï"Ö¸£ýìXETYI9Ì5ЕÕx5{Þ›ÎWrRjóÊ\4Ù׺¯­oY{ TëÀ¾]hy#K¤öžë4ü…ÜoŸäX£Þ÷sºµlsY“.ÿøÂ®pVÕ+\Ò"÷tàɉ;êªå>·—u¯|â[˜Æu-H&µ«†½÷¿Áõ,£…ã¯ÚxÄCþjz“|VÓ’‹­µ¥Údä±ÙN¤} mÍDYÜö¸n«ò„…uåè¹Éežqþ•§´duh¶ýð™Ìä­™Âiî˜çxÞÇmÌTÞsTç Þq¹n6²‰³låE“Xȉ^¡×Kb?Cuu.4„„×Û­N{®Ý§ÿiOâZÒwÖçŸæ±y6_¼ýëÏ´_ÕÏsö™ü L}ømÿHÓÙÿ E)ßÇWýoæ}³„g~É·æ%bò&`s~˜€{‡ø€H|Å€ ¤Øhhô—~ØuïG èz—WX€À‚)瀈~¨Æy&a7xH‚1ø‚|Æ42Øp«'u6˜‚š„ðƒX„赂Ø‚…•·ƒD6~G¸A"ˆ…ChJV`#¨g=(lCö…5…@ø„ xFMˆ†‚¥†Ýç‚o8h&¨„H&‡ñdžC5}zè„ X‡r€xXZyWˆþTøxaH{cȃˆ¸†È‚H‡’8‡U(„v¨ƒŽV‰{‰‡´ˆ5¶‰ŸˆƒsW†Û÷ˆ–¨ˆ˜8ˆó§ŠH‰¥èŠˆŠ˜…xˆ·Šˆöƒ«Xˆ¢øf'˜ƒ¶ˆ…(¸‹¦HˆÈèƒwx‹Çè…ÉøŠË8Œ§‹€(‹¾‹—(ˆfèf¼(fÅHŠÙxÛȉäÈŠÜhÏØj™Ž%¨‰ïèŽLhŽß(gÍhŒÄhÁÈó8‹Ô¨ŒÐH‹ýˆfâx™‹R8Žõx`úµ‘ÙŠ)Ù8ÖÄõÿÈYÿç‰ Y‘éhy'‰Õ8ê˜,éŒ.™þ‘-¹’2 “4ÉŽÌé‘|H!i‘3)8y‘ù’ºX“*)”Ãö“)™òØ“”9”©ø’I9•Ki’>©•Qi“Jy†L¹•G)~: •%I”"¹„hÉ“$ÙŒGI•^‰•`É•i)•E‰”NI‘j ”(ÙLú÷‘R–ç–Øh˜åØ•W™—r¹˜k¹4%”pĘà1˜a©˜{i•™©—©™Y“%”t-–„W¸™išYÙ—Mù™§Éš©YXa`¶eª•7ù5)µe!`f›è(–xù˜Ø–gù–Ãy˜ )Cª›P1V£œK×tJ'Êy[Àè—Ži¨Y—ªþé›sɘ¯Io‡›V£t4ãtä™WzCÒÉ_teÀ™ˆÕ¹š;Yœ‰y—Ýùž¢eAæ'žxƒ.ÍY3J§+Øa™üIs½‰™®©¿‰ ê—iŸ¡Ùü)1´Y5¾‚.Ô©žJwžÔ)øù‹Ê óù”ÄI¢Æi‹Úe´th¥t7»9›ì)n»éž"*œ&ZŸˆy öy'—3Xzä•j—9ŸÜÉ£G*¤ÙŽu¤¥Ù KJ¤ô©£E¢òi£|Y•œ9¢YzŸ5Z¢]ФÊ¥F¹UJ£W ¦žI¦[Š¥kꦠi¦Sj¤Ïu1ºr‡å¥iz¢aª¤dù p)§7ª£þ­·Ÿðu|zš¤Pú§R:¨t ¡‚Ú§•ÆeW ys[é9{£¸¨E˜ئj ª|Z¦ø¥”¸.ÐuZO&šSµ {Š£sj¥ŠÊ¦ré£ zŸú•]DZcˆ*¦;ê§ ¨±Š¦Üi«CJ”û¥««ڗ¨c §­I«ßé«Zª¯úxÚÅ.•Ê\ªZ§ÍJ­Ãú5ªT®À4®Âb¬Qª–»R©¾r©vã0íi€Òz«àꨲú¬¡Z«‘ú¦û:­ÀJUž[¿Ê©+¬(Ú¯¢ «øJ¬ú:ª [® +®~©®Œº˰’Z¯Çꪳ ­ßi±Áj—TÔOêv“b<ç;<£þ²ß°á7°7V­ühªåX# ³:»³<Û³>û³@»³šº¢µV gZA›´=«©¾÷£¯“²Jµ9;´þ²ö ³Iµ®2›U8+µ`¶<{Yž&s–u²ä"¶A«[_„2²£ej ´Tk³Û¥"{°´øµqÛ·J{u;3®ã·K[›Iö:„;¶½ŠµÔÕµW¬ ­OÈ·‰[¹SÛ¨´â–{¹Èº¹ 0·# ±’û¯·š·vk’”ë¹q ºç*𻹬;X¯k¹±œ¤Û±Î ©Öú±ž˜ºª ¶µk¶§2»•¼GC¼‰k¼ ê°¸«¥£{˜ü„±-+|xþé²­š»gJ±=¹[·Y{·þ*ºßë¼#K½4»µ6+±kµ¸{¯í{»ëê±]iºá‹¹ã«±ù˾ûû¨Ûۺݻ»Ë¿ë¿s:YòºœâV˜æ:X\+¾q*ÀÍë¾ó«½< «z¨ÙÀãõÀøÁ5{­<±lŽ´gíÊr§y8Áòû¼œ°ü¿¼¾#L‘Øå^<6ƒZf,¼¼K¾¥ë½W ¾ Áìx›g²_/ e>LÂ5,Âùª»!Äú[ÀSl{a†+´Žñ+Äï˸läý›Å?:/¸[Ìšž«uW½HÃlÃh,ÃU<À7|ÆÌ»s'¬¢l›þØÆz̽VLÀü:ÃiÌGŒ¾‰ŒG‹L¿.,Æl¿GüÁÑ{Å—lÈåKÁ0 ¿¤zÇ‘ŒÉ›üÂç Ér Äx\ÇxKÄclÄelÉ}¨P%b¸FhjÖ·;ÖXI¯<–¥Ãa,Ê÷÷»°‹+ fp;Ìý‚Ë<¸;§ƒ¼ÂüÌI[ ÙKÉ»lÊÜgk ÍÉk7¤¹0áæ¹…§;`躺#YÚ|Î;eà÷—©¼Ç×L„ٌΫû®;Ò+àüE¤\0³#Ïüü³w™¬\ÁžŒÅîLÎÜÏÑ<¼à ËÁŒÐ=¯yJÍ£ƒÄ£,ÉãçÐÀ«ÐÈlÍÑüLÏÍ*Ñ,å¸ÅsÜ„íþÑK«Ñ´ËÐn–Ò*M»IxU¼¬·ŒlÒ¨<Ž·V½¶Ìѹ#ì¢coì®â;þä9^åOöå\.ØA}åZnÝ-îÞo~\5 æbò`þË™æÜZ2>äÚߎàþÙአ1òúÆ2Êl$¾+vCæB©¾äŒMè‰nè¼}á®èÆ}r4 çyäE~é‹«ä©NçÕ,פ’âÓ…ê/«ê³ÎêÙMêmnê{­Þ˜ÎæsÞåïéXNߥ¾å0Üf,üÒé¤ã·ìkìì( í&,íSÈ0Z+Ú¬ÅÇÔ®ÓÛ®í{ûìßíá.‰érí¡f6žÁ”>æëÎÆ+üîð¾îìîîê>ïéÞî÷Îîöïú¾ÅòîïøÎïôþïŸïßïü¾ï_ï¯ð¯î ñ /ñoð_ð_ñ ?ñ¿ñÿñòïð_þò¯îïeî^æ/òïò¿ð2ð ?ò/Oó0ïñ3oò-Ïó5ó@ò9¿ó1óFïóG/ô6_ôAßòKÿóL¯ôMOôNóh¢òäÉ1õCÿôTõ:ïõI_õdöH/ö\öBöiÏõlõ=/õpö]ÿöf?÷u/÷t?ö{ßícP€ø‚?ø„ßH4¾«x¯öw_ö_òvßø$¯÷ïö’Ï÷Ž_ùoù™¿ù‰ßöxÏùŒ¯ø{ú“ßù’59†ùª¿ø£¿ú¥Ïú—ú¤û­/û¦û¢où¹ù¶ßû ?û¹üž_ûÄ¿îW/R°žËÝÎkËoÐÍþ¯üãþ‡ÉoÌŽP·‚õÁ꼀ϋÓ\ÕOUßÿWá~ã­àެŒVîQuþæßýXèþXþI%ÿWFÿÔeÿ_ƒÿ¿ÿƒcíÑIà@‚ DH A|‘¡Ã‰Fì´Ðb'Œ7z”¸±#F)†D 2åÈ%M¦T3&K˜$?b¤ùråIyÊÄù3'P…7Ö<ÚÓåL¡MEþt9TªÓ—}šµjʨT{NÕê3áX²ýtyÖ,Ó°lWªí÷«W·_åÚTëânR¢0÷Zõx-RÂ=gþH%ðY½m±n¬t0⹎R^¸1äº)/þ\—/Ø·3ûÙ\™óãÈ1 ]¸¯aœŸC§îÌ:÷årËþîÛjo¸ŒGÓÅxV­oÝÍù*ç ·sÙÉS'Ny·lè=‹O?5\¼Ëï&Ø=æ]ʤUǽ®P®vê´Ó ·i|u¯ãSn6‡R;ýÚCî9cP8¹4R1ò, µµÌÛξ Ê뾼̫oÀàêp¸ ×r/C cË>ÏS͸ëîEË6,¹ÛlÔ°G•dô® ßS‘CÉDÛÌ8þ´r½ìP¤°Çgt0É E´È¿É,kÁÄî;qIôô;qB1‰ŒhJÉ>dF·šÌÏ<*¯ÌþIM×â’°Í3ßôˆJ »K±>; tQOIƒ3½ÐD›3Ä:¼I@Ý|,QÀ`›ôF)!%Ô?* @߸Ä34/ÅŠL3J“R64W%ÓPŸ>4óPª,ý²¸Z_ÅQÖ’ÆÛT”pm¹]éäiТ 6Êû òÂcM–Ó¢hÓV(ýÌnZXáËQ¾ÅôjVÓu%µËàLL5@a7-3[,‡µv86?u6Mh]›OVd³¬÷Ëe}÷Y½ËŒQm³U–]Oy]˜XQý¥àpí½(Ó…cÜ·S…ç…¸a Å×\©&Nw,õðSÒ=C¬ñâ¯,6Ð2†òeÓ®ÃTÈœåþ%¿žFòÛõxV Â- 𼡠-ZçÿnwÈÿ:i§¹.-9z:f¦ª9i‡[¤GM¹e³Œ5µã|…òRÉ™en;3º£¼ßŽ;V é¾LkÁR[ñîþ CpM&"›wì­bÎÍñÄ!>·p%¯¼oŸ%7\ó´K#pœïZЄOm›¬® §}dÎO?Rq©s¿}î–D¯ÕÞƒTwã‹~ðßwo}yåŸç÷«…¸Ù¡Ÿþ*àå½>yïµg¾àî§ÏÞwì[l>üeÏ7z|Ë¿7ß{䥩êËrû÷À?^|ýË'Þûæ?²yùS_Xþø—¾ã!°^Y ýøâ@‚Ì~÷ %È }ÜX;8ÁÿÕo„,!ŒD@&z+4 4xBÞaPv)< 墲ƒ>l CHà ö0†È#Ÿ×WAÜé0‰-|`ð.hÃq‡Î»" ]? Qˆ$¢ÿ¶XÀ,qŒ&좣øB*þÆŠOüáÕÈÄø9Q‰²yãk¨G/žQ…atVõgÇ/ r‹SlãAÆ4ò‹î!¤ÙEG)Ò\†\#õø8ÇEBÒ’Ü{$yCI±‘— ¥?É9LRÒvp4c&ÉË>Êrtd)9J„´²‰«¼’/ëþL¦2‘´¥"‰‰EZrr™q,c-]ÉE^Vјû{¦ ¯YdNs€§¡BOhºs’%@¡èÍ[úóž ý£BñHÐ=RTxU¥Dµ Ï„T™E¢=QÉÑŒâr¤ø4¥IAIÒp‚tŸE_3ŠÑ–zô ¤LO Ñ|ºt ,ŦO±HÓ ªôœ@å&N¡IÔ¤Úô¦B}¥HWŠÒ]:t§L (T£§TMZ”Ÿ³”êQ©O§^”«ê$âWªÓ©ò4¥Vm+VëéU˜.‘­bukUmªþÖˆužHͪ_‹ عö©‚-ìXªØ’¯r-¨GùÚSÄNÔ°½¬YµŠÖ.Nö­wý+ckêØÐ敬Nõ¬^ÃZZÈbV´[Ý,W¿YYךv±¶m,hûÚ¦–Õ³® 금ƒ ËŽ8d™n‹Û¥žU¶È­VgKÚÀRw¡­E¢GOBàöVUĹQÂ$bÜ·!W:×äìS{ZåZ–·ÕmïFß»\ì®·£NÅsÐ{\EWB"/žÌ[2£¦7šöÍíjwËÜ¢Z×½ î­ƒå aøj×XÉÌi†û_«nÃ[̯6çªü²äpùÝQfH´¨R¨¦%‚GßþqÖ5§ ¾®s¥ ]Úf× ùŰr,äâ½iømü 0‰GŒ®OäÄB^qÉudU¹øµ0棌Lã—f6¦8~0v¿LW/ÛÕÂT¾p•õ,ñ&·É fñwš“×µºÇb½à5/»4á>óŒà™eênšz¦är9]Ú8û?I®án{s~sÛÕÞó˜G=ð3}¹×5×±¿©Ê#°Ô_Ír O—ì["Z§¾ö¶/þ>ëŽ;×µîÛºQÞáв<·ëÝã{G{ó€wŠ¿cä¨=.®n'úÙUþôÚûØŠY»’¬nØÃž½Œúç·u²÷ ì¾gþúéí/ú+%ß®ƒõÅòοoçyÌ}’{ú¾aO¨Ç’¤+~õQwÿ~»Ïy¯7Y¸¥J–ž)?ƒ/èË¿K=ê{?‰»< Šm“;à#>Î3Àõ“>ß2 6 »ýÃ= ?ͳ7 <½ Ä? „>j%Z¾°z¼«’@𾡛Àl?Ô¿´8Ü+|»¼½lÁß3½Âà›»™Ó²;SBÛ¦%tÂ'„Â(”Â)¤B%Lþ<+üÀ*ÔÂ-7 `BÓàB'ô©-Œº04Ã34ÃrÂ@©!CøÒBòƒÃ9¤Ã:´Ã;ÄÃ<ÔÃ=äÃ>´Ã[#±:üº×ŠC?4ÄCÌC3y8Ùë DÔC⺜7Œ¹-ÄBtÄKÄÄL”CHÜ2‘£¿*Ì$u"CðDM4ÅSDÅEÁ»¸Dœ+ET„E½Ù tƒÅ@ J4æEï¨Å^¬EN<5YÃBı'ôÅcDÆ;ÄŒWD{ÅdtÄô¯ÀøÅ%œÁ÷2FhÔF?ÆX;>ä­gÜÆqÄDí`FW$ÇhÔÅ_ôÀ4‹t„ÇVl§5BÙÇxÄÇD\ytGVÌG>þlFaG»÷ûGxìFfòÄz”®{<ȇ4G~¬9‡|H[\ÇXllj¬ÈqLH|ûFÄ?4É‘$Isì‰,É” H²IÉŒä*•„É‘TÆIõËÁL@ï>¾Aœ|ÊûKÊŸ$Æ·DÊ…Ky¢ÞHK\[K¤0.­a‘•ì,pŒÊž J®¼²œä¿|3LÄ;±»+•U¼µá]Aè–E‘´Ë“¤C¾ë»J¨M¹ÜJº„Kþ¯lÌ,J"Á\ûš9K ôƒ_1’HSËJÁ0Ä1Bq³ÃÄJÚ{̰D̹<Ê®$ʼ¼œÊÉ›À©™©Í SŽÞÄÂÉ0æ|½4¹ ÂT¯áÌÊÖ4N² ÂÒ“K¼,NÝØ=Þ°³ä ˜èd5)?' ¨y åÓ$î<0ïN­´Kä ÏÕ¬&ñŒ¸å˜«´AYŽ›±(‹O±5¢Á¼}Q°!BÓìÏÅŒK üÏš4Ïà” ¯ïºNô°U2F‘8ÏÑLy2oãLà*M =ÍãÄPÕäÏ ÕÐ%ÍÑ¡*ÍкÄQ 5B¥1¥GåtÍBÒÏ‹3ÒÄDÍ¥¼P¥³þQðÔQ ÒÔtR•Ò,mÒ ÏíÒ*•ÑÅÂ\<‘´Jâ$REëR0]Ò"P^jÓ}ÔG”« ŠÈ4ýN$õR>uÓÒ®sL@• ŠÜË0s<ÝC¸OûÓ+…RHõÏ?¥ÒAýR:ÅÃC=´DÕDFeLBQ!ÎÝÓâSQõ›G4S¢ÆLôÔÅÒ>=Ï(å·O­TÖôSLUÆUåèT=ÝÏK•ÔåÒ7eÓ8MÁ75T^åTWV&5V%U5%Õ`åÓSUôŒB;M‘ù@Ãg…Ói-Õ5•Va Ôò´Ô\}ü<@ï`A[U×s}TyEUjEW\ÕaÝRYþ%W]šS}­UX½ËtÍWzÍVZ]¥F]°‚U+5ØÅ×~µFyŽÐ˜}{=}>„5'…ͱj…VqµVS%X‰% ŠåV‹éäšS£ÔxmØyÙzWAX¥ “ÌQ9{Q·¤²úT-ŽÝÀ)…ÙP=X€MرŒVîMÏ\ã»+–=/”µ½šuØ™MÚ‡T¢u¬©l£Õq—lcÏpaÙË\[ Z¥íXxeX¤T¯%ÖY^1Ûø»¾Ùԉı;ÑTŒƒÛ¢-Ö¼ WsåZˆ Цõ‘½SÏÕ!±ÛL’ƒ Ü][«—[{•YºýÚ [¦E\˜ÑÙþeÑbZÍLZ{[»ÝWÍ5Ù‰Ýr½Ö’ÅY×¼Û¥ÝÍÕÚÎå\šÙȳݭ}—¼ûXâýÝ®]ÜÏuÝ€5Z’½Yä-ÕŽ E¹Ý´rܼ"Ûå½[l­Û;ýÖÖÞU\Ͻ[ØÕ]EVªÌ^tÖòMÞï5ß×Û»òXDµÙÆ]îèT¬¥_е_ëMßm_ìåÐáõ]sQTU…ßÞßÄ=Úøe^îÝWïà‚Yà:`VÞùuÞÃmààÍ_9-`ÓøÕ&ß aé]ána´àó5š ÎÔý%`ÖÞîN–Ý[Õ_¦™ðUáæÝî` –a~W$Ôáüäþaâc}âœâöa®b'Žâݽ^*ÞbõÍâ[ß±mb1ã;cfàNcnÞèua"Fm3^Êá!†à"&â.¶âÚ…ã–b¶c Ñ~â×5îa<dEæâNÖ6n Ê Ìª;<ê%Üæ]Z½`$þ_LŽ[&†äZ5ÛJ3dôeá=Fd(fd0¾âGþâÕ=ì$ÅÈ«ú]âçåc-nå~eö e ¦eúD¼ë»e%$Nå<Þe3þe2æD4¨}’0ÙÏBå8fæUöâ^fãg¦¢í­¯ kŒIž­clÆådÖä$ödÃ=ä{ýaoNd=Þæeþ^d{ÎçfFcp¶!qæäŽgmÞgnîc}ndyÆâXþfzfe„ve‡îfˆöe?žgŠÎ«˜”I\’Â胙–'Ä`>åu>$eÎQä/¢a„Ô”)d’mUàŒküatßTœÉ^鈆ދæçÞÈ]5Ý'lèn+Óõ iZcDÅéôXêÌ5éêmç Vé#©–NGœhé\Œjü¿p<¨î«;Æèz~c 6èhÒjr´d´žiŒ4ʶÖàc~çЭjŽáN~:ºÞÆ·~èfÕé¹&k;æi¬6bÆ]h‰>"¿ÖFÀžhÁ>EÈnìÂVgd>é¼Îä#=k"Òh4Õeþ&iãTÉÎæž®èŸ^ìÎŽìµvfÆæeÖ>è vcGf††k|Nh‚ÞmÔ>jÚ6;Õ†eØ~mÙŽmàŽ@×îgâ^ná¾mæVcÝöiäÞ>ßÎmÞžnÛ†fÜlåŽnìNmêÎ]éoíç2nnñvAï®mòþmöî´^mõB÷¾nëînûÎoð~o…nã.nú&Oþ¾oÄVeýnmÿ~nOoøNnŸm¯n¿ç”þc /h?n oßoüNp Wk p_oopÿnpßnènoqßpq/q?ïh>qoq¯q Ïq!OqŸo¯o"_þq ïm&Ïnoóþgô^rùíêOm(p%¿ñXÝk>m'/o-Ÿp+ç`3Olÿ´°°vMü„Ѽrxs4?p.r2ïp–5Sö 7ÿ ”Æñ"ô*ßä3/ô4ïÞ=2ct¥är37÷Ìr;ßòAïr:¯pK¿s#¥_Ó¶(s3ØìL^»4ÍÆr³pGÕôJóþæôDÂØO§ù6ûM\»ßMEò_õ2?ô:ïõ<÷rE·GóZQr3e¼ËõEãîoõÇô §t_OtwŠuH;vbƒ4e´RŸô`ïqqOrrçõhÿðaÇvE|Ñ‘àÙs³uÍŒfþÿ8ßtsWut‡öiorÅþïT_X€?Þjv~r‚wuq„/w}ÿq|ø]ÏwƒóWq'tw¦`0Ÿêi¢w—“øˆ×ñ)çñ†§xW‡øOyüÅó„÷÷ïפ;¼þby†?w:ŸùÉd]“ÿõLwø ×ó 7øúCO¶ÔRŽÇlª†Œ™?•kvv{gõ“—v5¿jôêL¯µ8\_#ÓÒ¡PsFú»¾+Â{wì+fñy›Ÿøž§ö _øê#Pù“´›¿Ö½MÄÙlT.Ó©Ì©I¼´_y]oyž¿ö·?A¾yú£û#½»§5Þä=¼wœÄ̽aNtÓ¾‚gûþ~ïüƒwû#7¹¨ýæƒüø4IÇ)ä¯ ûOXëc»œŸ‘MüŸòÁzç¾ø³zÍ4c|Þ<›¦Oß”üϯx ƒ?õ½êì½›7~”·}AWxÑw¼«¿N¤ÃLð‚¿˜œÈ$6`S7*²Ÿd³ßy¢WùèÏx¾öà½Ç[ ¤lïQ€6toÿS?l©O÷—ßýÍŠò?;u¢B ‹ƒ&dèðáBˆ4(‘bÄŒ1N”Øñ EEbäXRáÈ”!7¢%wõò»›.ˆ{qדçw>€ è]} ½'Úgð `}ü Õ\J5÷–bÿ-x!†ª×àešU÷áUûuHY’gž‰ã¡¨!}"WØ).Xß_ÙQˆŸ}þ6Þç F2²ø£Š.QŒ@‚Gäq#f'¢P¢å£‘QFÉ!d Z™‰:úåzÊWŸ@?~vcG‰Žd*YYkj×£”qÒ7š§…)ejoîè&“ZÊæ‚kr :¥tµ]ieŸmBÆeƒŒºw¦¢qÉ š<î)T¢zúè F)ݤ3n:ªZYFÊ\§©fH¥Ÿ9Ѝ©š*¶Ù—œ¦×(¤²¢Ê"—¶ê`¦u¶ªªµžzž¤¦YW°¾æGl±Ñ²š_d¯RÖ¬²ŽÑº¡­èáÊë¯p‚Ëæ²Ù*ì±âF‹á§v ä´ºZaºÎ*¸.¾·*[­µ’aën«›½æÞþÀ’B÷"ºvBW©› ç«ÃŸs¸H»º´Ò.sìt·|tÓ¥5¹0+]õÔ\?íõÐIÖV»šÃG9ä@¶DoOÅvØùÉ­Ý Ñ óÝL¹SÞ#îóÓQ—Í´Ú_n8Íu;n(ãb§ýxãg£í´â NwÞP³Õ÷Ø Î·fyEûÊ6Ì`ý$懻¾8Ÿ±W¹õ±“·nùµ¶¬9àzk~·Ûœ³mºèkô¶òT(ŸþPñcýðŸwôÃ+¯½õÙ»ð<÷ßOÓõ¹ÝPùÝçíüMÛ—ýßžyÎõ#Nùȸ;®;á³ëÿ°ØvÇ;ùŽZÀ^G”w<„,y¸œù8gŸ½aï2ï» ð¨§9—°}Á›H“øU°{ÔcÝ=˜ÀZO|-4Ÿí‡ºÐýï>þ“aíØ?Ú­€ºâ×Ñô:®xrSçÀåyOtè› aø#P|ID!ç0BE®„0ÄÞ£øÂ *‘ŠA¢ù¾hDùÅÐs=ÔaþpøÆÄÉŽ‡’óá€DÊñwhìb­¸AÕY/N,¤A6?‡€þñŠQÄâ7ˆHä%±…`d¤%IÆÊä$DæWÇò 6´cîLI´>¦ŽöÓcù—¿Í!0 táHX>/‘™$Šñª¸@/BR’ǃß ©A\.ñ“zÓ¥ǧD•x2„SÄ_ÒN§ÍÆ ñ‡¨ÜŸ*ÆJpºri° ,_™Æe~}"ô"«èÄæE~(4Ê߆)Hxf¯{,ì`õ@¸Èz^2xîáA±÷¼ì•°žòŒ£ïXNúE´•t¼Ý8–Nsî1Dá Ì +ª™”p¢ñ9Òjë›eéI3j¯Rt†/5)F;Š%œþŽ”Wcä"yz?Æ¥4þ"÷ÔÚE{*ÓR Õ›>ÅMG¹ÔŸ65:­JTsjÓ™Âtc[ejR øT`u©"½iX:U¨–u¨WåãYO9Ö¦ÕªsÅT[¥öUªÖU®k%kUýW°b“£oå¦K»W¶v•ƒåkakºM‰öÕ±‹leÅùXÆf¤‡Eì]ÍzYºFVª›Åliµ:Y‹¦V©§%m7íúWØ&Ö²oͪkG‹×ÆjV·°ã­gCËÜŠu¶»ílK…»Rà&÷³põíPWKN„Ä+!K:• @äÆôµÇmmq½û[îzUºh¯Z?KÜôBw¹Ô}ÉL(ˆ¶w»è•­x‡›WÈ™—«þÌín}™µßÊÝvÀ:û¯NÆTšÐXW v0Cª«Øþ6¶Îëzñà›i·r†¬…m{Õ _Á±ñ Lƒb0FRÛa‡9l\Ñ~˜³÷-1y…XÛÞÖµ!îmM] ³Ló ‡$lÙÓ6ÆÙİŸ,äç2¹¼Pž2䂜ã!OÙÈ^nL’é[åñÞxÉWÞ²^Ǭ_,{øÌeòˆ£\85kGÅ+Vñ‘[Ìbù*™Çnþqpg¼f4ó÷Ï;t~ÝûfD–Äfž²À@3_:ÙÉ@¶Œ­h@77Ñöå4€éüéCwzÃfµWµ¼èR‹ZÀl>0šígHË9¤íþ•5£[-cO8ί–r¬kMê&kºÐ´þõœ íäd›Ð½Ö)®Y­ìb·¹Ù«õ´y ëkƒ–ÚÛFµŽ—}NÞEÛÀE±ÄBv±Gj S÷¦Róî‰9Û¦fv°‘=nË•Ûʼeð»ò5Ÿ>g„7IiwË  >çéI¾aŠÂ)•]oŸzØþη³+¥jps9³—”ÀD¥áts&¿¡ öðmÊ;àã2,ÅïÇñ4Û[×fóuÆ]æÔ„\@çv¸ƒš8yÆæBºSÊa®íŠ‹Ûâdžy–qôŽ¿ùã¢éù—ín{E|àZW—§êmm¨WãS×ëÆNõ[YX7þÖÒeÎu¢Ýå"¸´Ç®všë½éÎ¥òGm]ctƒüíp¿÷ÖAE÷˜£<ì{âc.xö[´i÷;ã{¤îÕ=è8‚wæÓ½îÇ#þ\{7¶ÙÉ®q©«^ç3¯üÚ÷{¾§þôe?ûìQ{aÿ=÷·=ïCïù{O¾©¾ÿ¶ìƒyÓc^½Ê/}·ã^ü´ßõÉ×·íwMüì3]òúÁßYñ—\þ5ü÷‘ÿ}“Úóy_þ`ú_ß! s) ûéߢ  þ@àòEþE BßðݾÍÎßÖßþ¶ßv –`έßõ­àMþ_ø z ¢à ªàÙéû¹`2`íÁŸÖ` j šŸê`ëÎå9à ¾Ÿr ’ š J  Qà8m`Rábá¡i¡HÅ`zá’aFafà¢!îàïµ "Ÿr¹aÎáÍAÛÞáŠá Ù¡öá N!žáó­¡ *¡úù¡tbîa .â ‚áS½ É8¢¦ab¢iâ­Aâ#Záâàþý „^¤`W®Éà(*¢ªâN"'ÒŽkÌj½H*–a!†"!&b&á/â! ~"0~rà"ê £¹¥¡ò"þ%®#Α0F#eM#,âU!Œ‹PÄg,ؘ( 76J‚ð`$¶¢.úbzb&ªã&b#´Õ"‚XZƒF<Ì‹Õ#¥Ñá:‚¢+fá5òã9a:Z¡–½È¥AXxØÙƒ¤8^Ü "+F¡3Æ"å±c'$Î1d8£Brä=Þr#1ZcD6c?†á?£!b¤Nyd=ž†æÅ£KÒ#>¶5²DcN¤JN¤EÊ¢;v”À äu%G.¤7å8ÆáHîäJöäIVbJ’¤NJbïÙQnÖMNUòdW>åWú$@2c!"¢ÊµKamåy9¥XBe@æ`Uš#Y¢cüåCZþe\JdTBãT²å^j%)ºå\ $Xúå[®b^šäa¾bïÁ‹‰†¥aWžIÖ_.–Zú—`Þ¥\j¦^.¦?^¥‹=æA2Þ-#g*æ`Â¥Wfj"æjâ¥óAf‹IšžEæ—‘^[†eeÖØeVlæoæ¦SÀ•ÆHŸµØdšpn&çnRM_B§g¢$hg>Òf„)gi:äs:g9vfk2fbîbt–“%ö‹AÈ×lš¢)¾ÆPfuJeIšç|òe}Ò¥pþæmÅ—‹ÉælæÙrªÖyªMo‚uŽçg–§~hZ c†æ{ â€æÖ~‚gS&èiÚ§‚Z'ƒ¦YþªfsŠç†6è}f~æ…ª!ëièw’è‹¢f‰ª¨ƒ¶Ñˆšaˆºær茊èŠÊhŒòhÒå[mž‘)’&©’.)“6©“>)”F©”N)•6H‘–f©–n)—v©—~)˜†©˜‰suݘž)š¦©š®)›¶©›b•fã›Î)Ö©Þ)žæ©—ÆiK꩟þ) ª *òiG™)¡&ª¢.*£6ª£ê!ª£N*¥Vª¥^*—BjI*¦vª§~*¨†ªÄ£¨–ª©ž*ª–ª¦P•¶ª«¾*¬Æª¬Î*­Öª­>)hfæÒè‰Zætbè>êjxâh‹k;Úå®úhþfÚkëEªdŽ’g³Âè° iµšh‡Ò燊h´G7JŠP×Ìæ“\+¯f+~n«Žþ¨µf(üu+b§l†d»(ãG«°º+µê+š«²ö*o&þ¨˜hL„¼¦ØhZi¸*lE"«¿®ë²Šº¢¨ºJk]ÖËžEDr,ÁæÆÃZ,»bkB,ÀJgŠrk±Ö ˜„dÁÂG{ÖÃßO6l¾«n–,zþ*‹êa5JÁ†«ËƧËòk»Ú,kŽ,ÈF,n*­Ò]¬ãX©‘µlžùì½Æ,õͬÌ:,ÑŠl²’ìÄúj®>m{xY-‡{أ eÿi­ÑºèÇ.è´öëÖ‚þhÊÊmÛ:+P²-¾Þì×ìÉê(¼jkÜíÞm×&-ΨÎ+ÏÖláºíÜþkßšlÅÂíŽiÝ:È­n.çv®ç~.èRéßZlà>Iªž.ê¦.–vgÖBkæº §ª®ìÎ.íêKåzhlZLíî.ïönÖÝ®à:í»ù.ñ¯ï²îÕ²¤PÆJì¯ó>/£"ïøåMNóB/öf¯ŸJïÚºnã>­ö†¯øR*÷ õÆóޝú®ï –ož/:1oèÎ/ýÖ¯ýÞïüŽ®å–.Å.×¾-î^î¹"­å†,Ý~¯ápð°äp3°×:pðò/Øoºúïn3­|þNnΆmãÎ{ÞßÿFnâÝc*gÚž­Ã¡¥AîÝîk 3îòêmä\Z÷Ùíã ׊ý'¥±ç½rc™à$ ï° 1 W/Ö¶¬žkÑÕ¦«9©ØzªpŒkT1‚â-Íò­_°ð1OÈkÔþ,žE1k0%gh„DqÂ'7… ›OqÏpY¾nóE #ç{ig.[Ÿ —ñË‚™4æ1rÞzo KñIˆ&ºˆÐ’p›pia²h$rI$%Z¾çZ’q$¯±‹1ûíËlxT¨ ˷DZÁ²0‚ül#›ò;r!¿+7pk¸þ7",ðBò/“ K¨RB-ÚbL)ÏròRr3 3û²r´Ý [óôÚð)ó8só5å*S.Ô,¥o‚s÷¢2'opâ>¨þp:°÷¯s*ë3#®+.›sÚ:GnLgUéAWÌ Ó¯8góóÎN2»æ÷=¢×½Þfkì÷cqø×~Dz¤)·ïSÿ«?@têäB`A‚ <¨0!•„.dˆ0bE‹) t˜þ#Ä‹9J9rcȇE¢<ù‘$K•SºüXòaM›7qj”ÉqdLž/5úñ#Ћ¡„"¥8ÔhÁ¢D&…Êñ©ÓˆG‘6íØsåÏ™]·íè3lÃe½¦íH“+L°#Ûr¤I®Ø¸cͺÕkrïÚ³uÿÒ•ÈÖnáÀo羬˜qA¶9!GÖ©0åÅŽ‡&%˜4sF©H?s&úY¤Ð£TLGuºYèe¾¯;>Ü÷nKËaß•}›¶adzsûöÛ8Þ¯¼ƒß–y忉‰#7>YruÈГK×µ¶pç#«Å>|÷ãÙ›»žwy±Ë¿«7ÿ[»wõðåÛG\|>þ{úèãkÏ6ÿ¼Ïºq¯¿ûB-:ËK-6þôkPÀ TC÷Îã°¾¿4¤P¹ E¤,Ä¥ÃD©c°ÀöCÁ!\p°kôŽF=\¯GÜ1¿RÇsìÐF¿’I‹ÒD$TRÆ©”ÒÇÈ~éÒË/»L˜1É,ÓÌ3Éd±YØlÓÍ7áló¿µl2Ë'óz1ÊýÔ¬óÆ=•ëÎ@'$tÉýÄsÎ+±ìSѹSR1Ѭ´R5ãÌTÓE7“d5FF%srT+s’tÒ‚,íÕLL5 ÖMNͰØW‰þe5Èc=mYW\5Ö-SUÓVhߣõÊkŸ%oÖ„LóCW0ÃõÕ\`ÂMWÝuMÖ]Y’VZg õÑn£­×UQ±‘Ù ùÅ—TyõuVÛê¸mV·Çý’Òs-öÝMOý×_e¾Wá? ¾7à/îØÞ[­µ8Ńy_†“Wˆ#–wâ`ã·Î„«¥ÖäçvæñãœíĘÈ~Kúd”­ÃùØomjÙe`ŽyÞ™)6è›{†’hy•–Uc »VÙê¬aµÙc¤“&ÛBëœþåᨕ™ê8k.xY£!ü¹ç°Í®ûëû^™d®Õ†i´Uµ;ãÁçå»`½ñ¦÷ï£þ·n¼po''1“QDã;9ÇMZ±’šÄã%yID^Ñ‘‡äÙ'ý(EX R•¯L¤&k´[‚q€y\ã(ãJÁÒ—o”å.E™KºÓÀ¤0mxÊY¦ò˜¬´d5KéId‚²‹Ãܦä IKlFrQÒü¦8‰‰J¿A“™­t&&»ËtNsñl§"ÍiM\Ž3œÔœç9ýùÍ{îóŸúÔ¦A!ÙÏrÎpGŸ¥þC¤"‡ær ÍfBã‰Nª³b½¨7ÊMWF“¡™hE"©@ô(åE9:6’³£¥gMC ÎŒ4§e>•Rˬ4#]fL}·EŸ‚ô£:5*O›ºTyÚ  Ý`º.§„F«F k¢‚—š†¥ VÒ‘Ô¼”‘4•)UsªÑž"Õ­·S(N£J×Gnu4Eõë_¥Ò¿‚Õ«!!j`ÑšØÑö¯8lª\ózÓ·ÎU²IMT!ÛGÌJR‰ˆõ+Wù °ª•)¤¹Êi>«Ø¾ŠÖ³ |,T5«×"Ê­–eÜfë9RÜBª³GáŒoU›ÚÑÖ´9,pþC+ܳV…‚¯Íí;1úÔç´²u¥¢sñÛêîu4¦-hW+Øßv·¸ ok \ÆÞp·“lU³ËNÙJwŽØu¯vák°Þ.EBêRîYQR^Òú¥}õ/bY#X×ÖÖº¼ë}å»ÝÙÖ—Á¶ë„õ;CRÀ™… z[a _˜¾¶ç|¡k˸Â6Âù=œî6\-­6S?_õŠ•Y6ûÚ¶ríåñö|Üà覘¤aÄ1?1ücöy¦V2ؘ ×sW¤Döð‰%\b[™ÅXv±«œãéî ÅxL+ZWC^±²ÕƒMN2˜Êå1G.Ⱦ®ˆµ|g'SÙY™Š‚[þ .6QÎÞ³üfDYÌñõòŠç¿:s·$Oñíf²BÞÕ zŒ…æã¡G¬gE‡:Ñ%~ò³ìé-7:ÃFV ¦™’f¥¨¦´¤Ës©=}êƒúÖŒ¾œ®›‹gU‹ÚÔ|ÞH¬S³æš÷ÕœÖ#e¿¼è0ÿΓîõ´Ëìóú‘eÈ¥emÜåŠÕH.¶´ãÌjmRج^5µÑmín“ÍDÉ*³ñM»jGÚv´nùý^›à©6³Vќֳ^ÅÖÃÆµº÷jw;×6©}mc¿_w[¹=ñ‡ÃãØÞãÇ))l ¶ÛÜ7Ç[ìq‹Ëüå/©Ä[þñšß’]=÷ùÏt ë¼äé&ùµ®q*Ë[ä?¹¢„u©O=ès³úÕ±. ªoëTßö¨‘.ü˜]7ûÙ{žuµ¯ímwûÛáw´Ïîÿ&²Øo?ºïÝìq÷ûßxÁžð…7üáµÎwÅO}„/ÝâÙ…xÉOžò•·üå1ŸyÍoÞï_×Ò{æyÑûœó¥7ýéQŸúÓžõþ=¡ãÇô²·žö~PýíqÏùÚÓÞîÔ½ø^eïæsëi÷­ÏýÌŠÏú¯?ìeÎ;Í‹|)31ù£'zóq.|—SæžòΡýß;Üé¬D9'ÁÞíî|üM7¹ùgþýþè¯ÿîÎwuûs~tò¿¿‘ç'%˵ïúö/éžôÔäÌd­¥n*¨¢ãäOüÂo¥¯ßp± ­î-ÁŠ;@¬ðéùôÅÏ2-¢Èmµ<ƒ}/Ýáü*p'𽊋 Ó0¡<ÙšiìˆïÏhͼ¼ *PP§ìPÿ`þ¨«ÖšíÕ–ëÞ†!JðŽ@On"Ð*|ë-¦PҘ̲ïÓo Çp®¶0Р0 g*œ³®pOK ÕÛ°#¾0‡b°‘ ™OÃÎfÍ«è.ü,mðïÏf¸£ ï <Æí#ñ² ÏPà^0ÿ”.úÖþ *2ð!2cÆð¢ ‹¬—¨„ipëko«õ•J)ñûè¥RQY±± M)í « \MͼÏ)P1‘ù° kè7mÆ‚Ð*’Ëq31 7·Ñ·Ï1æ*ÿÐ ñ pþl‘Ç1¹ÍÃÛ«ú¢®þê‘ýTPÑâóHûqÜð‘ôTï …îõâïùq1Ö%N>/‰R «I!«îø4ró0èj1Á1"±n"Kq}‚¬#n#Ur%YðPÒç~Çÿ`H$ïó`møFñZr'y²'}òøÝÂEóD±"þ5î%Óî'•r){)Ù%&-Ž&]Ò¿niö0æœR*™r+¯.+]¯ÇhñyB+©†$É(×Q‘Ð+ÓåöØR/H&Ÿ ÕqÀ†NHÒвÙ$—ñ´Þ2ÖqõÑ/›1:R€€ñý‘/Õ’.Áq ³ÿ2s òÿ27“1ë’2]På.S2?óäž<32-²4¯2Óo/A³›–íݺ‘IÙŠ’ÓÌŠÝú°31s2MsãSÆf“âHS5ñf­Q3ñ=C­‚í7“3«óas8‹„ ³‚3㨊S ‘É L)t34î0&êðÿ¨óSþ80;[3J1ÜÈ< Ó=ß) [E›¢ ‚ƒÉ:õ39áSÿä“!åÐ3MíMDz0 J“¢Òz¢>ÇÕòÓÛ“C_s4W“=êM¼îÑi3-mSŸ:),4À"¡,<sCí;A´6íÃÏ ‹9=? R9mÔ?:s: ÔCßó:ç1A«ÈwÐLÙQÁÔÐ’´F 7Í“q‘qù‚“5´/#ÐIjrŽ”=¯ô!#45“I NôFQ´S$Ä7×TBß´@Cô@qT8ç“ûd”9°p\qL=dc”ô,znQÔOëPUýµ.Úþ…M’-dl¯Ã´“/ÔåM\z:•cɲMžRM—”OÿTLŸ”8i”<„BSzs?jUU=³-ËRáŽ$W5õÜ"íØÅG÷TIURÓRg•+2Õ]ªQ.l/— 4Cõíük™¦UT«5u†õðV•O5EKã“N—Õ;€unNÊ)‚…ÓFéY ¯PÝÕV™…WQOQÛT<#UNkÓLã ×õ]©t-¶ÕM ÖZñµí²1VU»•q¾ÕðÂõ*͵OýEviîe`6ÆÌb]×s\³ê.‘ÏWýEd…5U­®X!´C/öUtY7ÖkFåY7‘J5I¯bgŒT3þ'–[¿r.[YãÔU5]IIèUÅ5V.5ô“U=]v×òÔM÷uFË”i?õ16f'VÏ44a–M-S»Ö›•kÓVOÛ6/umŽmãn·–_ËUm÷ÖkûVn×Öëö#ûUiÓU_"p@ÇÖoWp?oÿÖmi1\TbUý"Wo?—oE“rCpçÖnó+­‘´ªÔ1åòVtc×t×$Ã, W,£ @»s±÷u=÷j·iÍ6` ðme·réöËæ°50pô8QSx1Wf•u\kVlNs•ts­HÅíA—âñ´t-·{“×FI—þzÉ6q‹÷XP‘áD ¥Æ·|ÙrïWrÕ—p‘—v•uNu7•36—Á4i«·lg{Á6PÅ6½Û—x8lÉutù÷r'Ø‚3ót }ý×|—÷k×W‚ñׄõ‚-"1a·ur–©†—ƒåç¬tm7wq·Ï·MSu]ŒvLög»ì„3w/ÒV{în3„wxv›Xh{¶e¿òDD^%Ò¡¶WÅúöˆáކ—¶„‹xƒø‚Ae±Õõ>Çd'&\²X—"‹3&mVPux„™ØŽÝJ-j·óaGò ˜•¢x'§8 ¸R;؉ñ¸Œ¹óÐøNôZÉÊ5ÿþŽ1O޵WV5˜ˆ­7cÝWÍ<öd9ùÊ©•;ÚØXÒ’“Œ;9†Ç8‘·¶‡Õå‡X…8Òù·jhOÙ,1ø†ë€ïؘ=Ø ÓÔqé…§êzeT¼˜Š_y‰“9‡79…Q8‚Ø“šÇ˜ÏÄyœÉ¹œÍùœÑ9ÕyÙ¹Ýùá9žåyžé¹žíùžñ9ŸõyŸù¹ŸýùŸ: z  º  ú :¡z¡º¡ú¡!:¢%z¢)º¢-ú¢1:£5z£9º£=ú£A:¤Ez¤Iº¤Mú¤Q:¥Uz¥Yº¥]ú¥a:¦ez¦iº¦mú¦q:§uz§yº§.}ú§:¨…z¨‰º¨ú¨‘:©•z©™º©ú©¡:ª¥zª©ºª­úª±:« : ;Bio-Graphics-2.39/t/data/t2/version15.png000444001750001750 2334312366325116 20126 0ustar00lsteinlstein000000000000‰PNG  IHDR€¯ÍéŽòCPLTEÿQÍ…?.‹WkŽ#ðÿððæŒK‚ÿÿ2ÿÿÿŒÿ¥HÑÌÒiêÿÿäµúë×õõõ€€€€¿ÿ€€ÿäáH=‹ÿëÍF‚´ÿÿÿê™2̸† úðæGÿ@àÐÿõîÿÚ¹/OOÿÖ™ÿúúÒÿÿÌÿUk/eÿú€rÿ¼àÿÿ=ÿ­ØæÝ ÝôÿýõæÿúÍîèªÿ€€wˆ™ÿÿÞ­øøÿô¤`"‹"pÛÿ2fͪÿ¶ÁÿeÜÜÜ‹‹Ç…Ò´Œ€€€°ÄÞÿÀËðÿÿÿcGÿ™ÿ·jZÍÿÿà ÿdÿðõ‡ÎúÓÓÓÿ(îiiiÿÿÿ„Qÿ{hîÍÿ z‹EÿGºUÓÿÌÿ€ÿ€ÚpÖ¥**šÍ2ÿÿÞ¸‡ÿõÿúÿÿEÛpŽÿÿ|üõÞ³ÿÿð€€[ÿ©©©˜û˜zÿ‹‹úšp€Öÿé–zÿÿàÿÚ¥ pææú¼‹ÎÑAiáÿà°àæ(ÿŠ+âÿô_ž ­ÿØ¿Ø ²ªÿïÕÜ<ÀÀÀ­ÿ/ÿz‡Îë¯îî£ÿÿ­‹ÿÿÿ R-d•íÿ=ÿ£ÿ[½·kÿ î‚îÿPpÿð€€õõÜ„ÿÍ\\ÿúðÁÿÿøÜÿäÄÿi´ÿ×ÿ·ÿ”ÓÿÁ²""2Í2ÿŽÿúúÿÿÿpðøÿ<³qÿÔªªÿUUÿï,þ IDATxœíÛ«:šF;”‰ÀïΣ2˜æU™(‰N`:´>FÄo „,Ð…õuoeX–X%®ÿÒ„4Ì¿Zòì i$Mƒ€¤i4 ’¦A@Ò4HšIÓ i$Mƒ€¤i4 ’¦A@Ò4HšIÓ i$MðïóòÒþ5ïíßقـ=&‚€À:P©¾ l<˜H\@¥Œz¬6L$* Ræ¿î l<˜HRÀÏ<¾TZ}^ÿù÷¥]ëØCa€ÉØ^> .Íâkm;( °ñ`"ɃE²ˆ€Ë¿½Øx0‘ —®ö&Mf¯9`U`"û!¾ôÙ»mP)×ö…- !Àî½²»ã÷ šV&PrI4M¶€oBªIÓ i$Mƒ€¤i4 ’¦á< i$M“)à8×9)`ë?!R;%þFC@d8[J‘š)°”‡€d$Mƒ€¤i4 ’¦A@Ò4 HæJ™€¿ÐLÀ½·³_ÄV&‚€À؃`"ìªknýÙΤüN×Á°~aÔ$.#Ø-o0&r¹€f%-¯¯¥­ø¬·Á4mÜKÙ1²u8<ò/ã:1µ€¯Å>#àçei-ðO¯eðãÄZ7ý_ÙÀNÌ- ßP-£­ê14ÃÅ~Úï -_ÊõÒÛâŒV²Ûa"÷ h6¾Z¿ÖSâÃÔܺ}ù¶\Û¿'€} ¨L³§Ìæë{ PsæÏÅ ¨Âƒ—kvbjà •=OÀÄAˆm˰gý[V°HnPùQÎÇ­9`U`"W xxPüÞ #XÁ]@·Á¶ˆèbó¾íõN”—¬äë#`KUxù'ïÛfÖûó–—¬äë7ðÿb ˆL̨¹èbãùöÃýîÎÿz´Ä ‰Ä [@¡ÂE%;*4v$àêÈK¯À=»Û˜Ø:K´LøÕ÷s¿Õ2ùx ní9ü¢Çë,Ò8>YÀ5щ‡9%`æž§_ëûWäçr‡þ»K ¬3«àä:s”²’íú@ZÀØë"ºØ÷co ‚ËJvThD@D@Œ "ÂyÀì$"ÅM˜ómïð‚"‚€)ØIDŠ‹€BzÅ¥Þþ¾y:}$;c5" öAÀÔ[¼&‚€©·x LSoð˜¦Þ"à50L½EÀk`"˜z[é”X‡%CÀ!j¯‰ 0ö ˜C@`‚‰ 0ö ˜C@`‚‰ 0ö ˜C@`‚‰ 0ö ˜C@`‚‰œp½Ëró&Ï^sÀªÀD¢.wó" °všÿbKJئ0Àƃ‰ì èº5˜ÌOþiG›ß-úg«9`U`"{›`ï¡y>•²ÖO4ϳcÚšMðv†ÙjX˜H²Ô^¢„€K3·>·ÏèË› 3ïjš&R.à²P) ã± V_@ Ï&XL$C@nWƒ'È9q¶šV&’"úpLÛÙkX˜DÀ l<˜CÀÞ…ƒû¯G4Án-°-L¤KÝëfjEØ­%¶…‰t  9½èN'ÚçSšO!à|0‘üç?{eNióºEoöÕ4/L¤—oîµ)jÏzW‡ÝZ2`˜H{Wõð 0‘.T±M0!sÂDÚ ø÷¹}as²¾Ö‡ÝZ2`˜H{L! °ÁDz°è!0ûñ飚+€ù_W[â¯Õxv^´'¢ÕÿœMl î¬â¯ß|ë’ û&Š–ˆ€ÛÜ\˜ýüÜŠ•YsRÔ<]ä ¶IDÀL¤½€Eúý³cmNQÍ9iŽ`gJv¼ÄÚÕˆ€?œ,° –þU™.»Z‰t `Y#ˆ€Ù%CÀãœW³K†€9…Ù=gË/°Ø¯êÃÊ–ˆ€Øx0†€ÀAÀ˜?%¨\–è.Ý€%CÀ!`~H0½{ëö€%CÀ.a¦[†5…ŸRþeÄ’!à(0t^ ¯ÊÙ«¾—ìn˜fÁÜ s¾÷”Ýï³Ãt\²Ûa"˜[·³V@û+7€â¸%»&‚€oÍÖ ¨Âƒ—k‡,K„Ø 1" °a`" =&‚€oOß*Üse—µœÂÑyK<óíbsßQ²ý/Ž€•<{·lp×éË?µÂ=Wïh‰;î¬s_²ïÏ\P²Ä7W»Õˆ€ ´’øeÙŸ³L¨tºd;ÚÖð£ ö$`¼§èGý¹¬&—•lU±°d{ßþ`‰ `ÆÛ7Á‘ÅÖï€roÉÒ_þpD3Ìx‹€¹Þmµ/ðh˜lxF,öh®îKKÞ:A@`÷ÂD{L! °ÁD{L! °ÁD{L! °ÁD{Lu(à™'`ùÏÎ^sÀªÀD~°ea€I ¸Ü`­Ü«v¯Ë’>¿Õët7åo™2oÍ«I¨ÖAñ>½ÝÝ«P½ìÐŒnêòù¿ÍØ·Øx0‘ô&ØwëwÍ ïc³Œ’çGšðCÅÿé““ VsÀªÀDöôj)?m à¢åV@?Vã”5¬ Ldo¼´rÁ&Ø-Él‚—G´ld ¬–€n»k7µ:~âë7Á´€À`"%'¢–Í^sÀªÀDØpöS`ãÁDÒ{z†`¶Ó…6ì3Ç9÷†º|RÍ«S't½ƒÄS°Ïlça˧aË™‡˜2wZÞ»¾¥ "m¹Í>à•_Agfð…ÉP­ÕúuÏÀ”_ʘéíR;_²¿õòT5•ìújt:C@ÿ¡?GSA¿óå›î!fe}!ןėë¥2l·¡ÖúÖë\™0¿šÎÁ\áÎÁ”k'NÁüÉ‹Ó%+„T£0³…R®üv0%à©?' ÚýT²æŒ€Çò •“÷L‡©2˜[M'aJ••L”ì¯ –_2÷6°i# ¹N0¯‘0¿IŽ˜!ïV@óýNÖš; ³Þs•y}5–ÂÌgvƒ³öÿʰ- ÝS:ßN6Jê6˜ö•y}5Ã*·€6öJ­ß-kÐíFä!+ë‡ä‚÷'ìÞs8nƒ>Þy a'v^˜? ¾æWÕ9˜¹~Ì©qö4É·±Ó0f8óG¿þ±ä,ÿܲuàÏoïÅ\z+¶ž?8[OÃÜSª æ~¾¦ÖáYë[ìâ…áD4°{a" =&‚€À؃`" =&‚€À؃`" =&‚€À؃`" =&‚€À؃`" =&‚€ÀÐöòÜ,_™ŽÄj¿‹°}¢œítüç'v^sÀªÀDÒcD—褊 ¨¼–ød˜HBÀˆ_YËO ¸ôPTþ­FÀ‡ÂDöôÿ(÷ÀV#‘{„ºv?S•’ú§­ëP@å³4²Á¢ð0‘,}û´ â¥ÑÚýîþ¬÷´3Øß}:®9`U`"'´C| øYþ:1- é/ 'v^sÀªÀDòÜ6Zß-^i ø§ðI0‘݃x£%\U!›ƒi6ÁÀt$G§a"›àõÈDmBüD÷»!ÀŠ –oÏœ”æøtâ85¬ LdWÀõÜqQaL[weaæ]MóÂD¸ =&²ÿ¸ÖìO¦Ì ꤢ7_ X²Þt³ïÞÜÒ°0ôcÎÆ+hÀ’õ# ½Þ«_þªï²÷X åÞ?¢æÖSGڜŠ>¥üˈ%ëV@7rµ~¹1ì—…˜Ÿ—íÎfØþùkÎå½^Þ1nš×Kv7L$½ ÞÐj(NÏ\sþl¹Þ_û^>8Ù9DÉn‡‰ n‚7vP˜»`ëvvûlûˆ€'`"y›`·¤‡ hþ½€*<yùs#–¬[ÝAHpëé²{²Ô=!îzø¸%ëUÀpöp°·Â&’q%$l;+ °ñ`"\Š6´€JæLa¾f®ŸÂJjîº]Öç§`±‡ß9÷ÛÅæ¾£d%_¿‚€š\~ôû¤|_õÆk +°œîjÍUMÆwÜYÛ~}æ‚’}ýóFŠ{¾9VÚmú;³ –×éq°D~6¢Òé­â޶} øeÊ™M|Æ kEÔ/~²6T ã7ä”|­þ3_ôÔnÙ•kàÒMpýÛ;l¸ Ž,¶p\KÀŸKVôõð€•JVôõð€•JVôõ;ðú|ÁŠVÓô„€Yßù/È "œˆv/L! °ÁDîp½£s™ ÄÚßfΰý€½?"Üߘm5Í i#`0õ[@y|3ƒ²†~nYÔæ>±)WÓ¼0‘+TfD"+ëgço)VëàF¾IÓæn1ÊwÂ[°,ÌÂÖä§\MóÂD.P™þ;¶3™¶òií{Ô)ÛšŸÕÚÀ­‹Q:XÀËß~¬`ÒÕ4/LäÚЙãÇoóS×=‹€æ·/¹¸Î´é˜ç6Ü´€ÂDnp™šp™áK@ßlJ•FÀQa"7l‚— ^ÀÈ&X­*) Šm‚Õã dH˜È!Ë„íAHpåë dÙîšÅ¸£’õ Äl”•;€¹³ææub^¯.̼«i^˜›VÀÉjX˜Èµ!‘{tÎf熟ÙWÓ¼0‘KŒÝ¥xJÀô-³¯¦ya"XR2`å0,)°r˜HϦ: "àÈ0‘ŽT´€3ÂD:Mð”0‘»Nä/ÚÆaêkœ†™&r׉蓲5ûjš&•`ìA0‘ÛLí&{Ém;%¹»®:¨9`U`"}ü,†STaG­¦ya"wn‚íÍÍÁý¥9½ä4N¹U@å%tO¼úºEߺ¨_¾—œŽ¶ž³¯¦ya"÷ èúĽä^_”l÷°—\üÎì«i^˜H3ý«ì%·¼ø·*qcõì«i^˜HƒMðò³ 6Áf“ìžFçzÉÅÏIÏ¾šæ…‰´8Y~Þ„äõ’{Ðjš&r£€‰G† SsÀªÀDØSÜ-Œ:9ïì«i^˜È½!É»«âc_5¬ LäVÓ÷—ŽPsÀªÀDz0y™¸¯šV&Òƒ€—À_MóÂDŽQsÀªÀDØsLŸ†¡æ€U‰ôr"ØS`" =&Ò‹€áµ`»c¨w/ª¹˜ÿuµ%–W# ¿Mõ(±5¸³Š¿~sê{$–µÎ»N(Z"n3€[±2kNŠš§‹œ!BØ6‰ƒ‰Œ+`¬Í)ª9'ÍìLÉŽ—X»°ƒMðO5W¦KiÉÐs¾Öƒ‰ `Î÷@Àz0‘,L¬îi˜_JV»púšV&‚€À؃`" =&‚€À؃`" =&‚€À؃`" =&‚€À؃`"¬?×>8á’¢=€‚;+g¯9`U`" c£C" °›4·Ž«ð7€îf¢éi;{Í«ÙÛ[ƒ·‹jv¢«SMæd5¬ L$Ùê€ëTÛ¥f+àòvöšV&R  û](àçÍì5¬ L䜀n,ÝM hþÏ&XLdO@b—´=±!!Àª 8La€A@`ìA06³€vÐÒ`pÇàÚÝ`5”Á½ / ìÄü†S•øÀ05÷- {ªbâ‘N–ll7\Õ®qÐîDŽm'—)ßkÍ/ÌM5g/ƒ»ÓPaƒ®×2ëÄ4*×8ØSÓ_›àµÉpS•{Xað¬¸üÂÜWs*xªb8\´+oUØ­%»&R·\Vˆ¹Vl¦†ºæÐÏ`\Îl; Uæ•›kΞrÿú¢¦|‰V{'æp}âåVÀeó¥¿7ÁëNTø¸Ö¾j.Øw°e®xx&Rl/k' [cþÚŸ!Ø|õ- i”ýUáÅúW6®Ó¨ý^º[7z½^lµTÁÕ›ƒ·ùî°æR!î®ÜјGÀs3˜vq˜šV&ÒR@ÛþP˜yWÓ¼0.Å›FÀÍc0\¥ÄÏâ‘vY¢;èÎ ÷ï–ätÉÜ\Ùß.6÷%+ùú× øos ’þ9ÌæîW÷¯©žô ÷ ÿ‡9]2?Wâ+í¬m_²ïÏ\P²¢¯ß±€¶*ý²ìÏx®d¾x{*.ÙŽ¶ó ¸”;ýóæÇôû©¨tÇðlÉÜ\V“ËJ¶ªXX²½¯ŸDGr¡€zçgùºéÆðlÉÖºê¼dE_ßE]u^²¢¯ïi-NÃèØÎ°ÿ]b5¥gí4LfÉ|]õ^²’¯Ï‰h`ÀDØL¾?oßï¼Þv¶w.áÀÞæíþ¼o9õývsmgØ_ÌìNÌ#àÛ®ÌwÖ oQ˜/]2<ùEÿÞ‰_½;[MóÂDª è›—ÏËÒ¾?MÎ?ÿ­º¼ßÞ÷ëóþïmfx¿ý²ÞŸyßKse^ÝräûW0ï;hyý\¯í¬€f‚^ˆŽ»×jÏîÄ”yô"ÆGµ`·½3Ÿù³ŸÚ¶€Fÿjæòxo6ÁfÞwÐòš¹Ì VfóÙ¿u¼|~å"àM0‘ú¾mûµê±Ð6]ËÛWBÀå3nÞ/—ßFÔ€Áͼoà 4s™¯‹€óèw£¾uІ›`»Lhç:+ ýŽ_º¯€7ÁD®9ÙpmÅ&80Ù¾—#à['Œn‚õŽ€„L!àÚÀYáÞvÏ,Ü- = Ì\¢´‡îpÂhkBü¼Û08\ BÞ~.+ å¾3jn^'&°¸0ò ä7XèÓûvkÉ€ma"½¸i†!`¿0‘nö˜C@`‚‰ 0ö ˜H/†÷ÑÚûjÕÞP³¯¦ya"] è^ãC/?b5Í é@@%LjVÊuÁFÀù`"¨åÑnK6Á3ÂD:piðä©ë¸©ÝÔ°*0‘ö#K#à`"]¨b›`B愉´ðotyó ÿZvkÉ€E`"ìQ0†€Ài) }PMí1pÜ[ñ飚+€ù_W[bI5"`aaÜc¼ê¶³Š¿~ó­K6ì›L(Z"n3€[±2kNŠš§‹œ!BØ6‰ƒ‰´Я¬BcmNQÍe|UªLØñkUã^Ép÷mýMðO5WÐRŒÁDн"à=0‘Ž‚ð·jDÀß ³{²b'E°º§a~)YíjDÀékX˜C@`‚‰ 0ö ˜C@`‚‰ 0ö ˜C@`‚‰ 0ö ˜C@`‚‰ °ŽÜ鉣¾z7Î^sÀªÀDâºN`{]ÁX L$* "ü`¡¬&’ð3o?£õ™ž ëÎÊ÷Ö~HÍ«ÉØ›qÃm³¸,I©õå¥Ýˆ³×°*0‘äAˆ÷K èút¹°ea€ÉÐnfU0–n8†=›``µ ${m¶»_² v&²·èzPoZ@» Þþî5¬ L$ãJˆmåz, °ñ`"9—âìQG‡…6L„kÁÀ؃`"éƒà¡/íÏþñð"`7µ€^@s.Æ.äÁ㊫IŸˆ^½¼ºP»Ç¹uS`ãÁDR.·ØQt] ¸üŒ€ÀnP­jV&’pÙåSÖ½@À½S‚³×°*0‘ÄQ°¶®GÁÚ4~´€Àn> ³^ô]–„€À8 l\˜C@`‚‰$nH%ä‚d Xöô,Bvƒ€¤i4 ’¦A@Ò4HšIÓ iš| ¹"¹sYØx0†€À9+ Ù”oî“v÷`ÈÞ£á}‡¬9`U`"%- PùõõfÌèÃñ¥‡¬9`U`"*ûÿ¥—œi_ÎJûv™€¶§ˆsñåf ì6Õ*àg*»K@w¼¡„€îP]) QKö^‚¿ˆç©9`U`"¿œ†QæøC¹QÌÍïõþø ãÖ°*0NDC@`‚‰ °¡¼óærC†°õM¤j4 ’¦A@Ò4HšIÓ i$M3ž€d®Œ&àáòo- °ñ`" =&ÒF@U©0—Öܲ‹äoø¶Ï îø~ÙU!`˜« £†Ðü¥ø‡&ëWä¡ÉáÔq˜Z@ßk3¸‡Œðe;?kõgŸ\k@´€x&r} è»lš'ošU:F͹‡$ÿéµ­[{ ÚO± î\ÀØC7GP­ꈀ*½˜ŽKÖ&rŸ€f㫃ьz¯9÷xZ%TÁ‘‡šÁ‰¹t#ÈØúeê-àúxZ¬×Žù¶êNL- [yÁAÈ(§al«çšnÙzp'¦пU£×°*0‘›¤Öº¾æ€U‰\¿xtPtâ!¬ðž£3°sˆw'æð£Q±œ0¾Øš°ßï½EÀL“0¼&‚€I^i&àšèÄÜ0s§ò–Óäöý+øg0öZÀd5" "`˜&ax L“0¼&‰è$ì"ÅÁ‰©œ§æ€U‰ 0ö ˜C@`‚‰ 0ö ˜C@`‚‰ 0ö ˜C@`‚‰ 0ö ˜È/®÷»Ùåûñ7Î<~b˜šV&ðs3å)?oX%]/Ń…¦œ²æ€U‰$üÌcï*7ÿ˜{ÌÍHÝ/?2žYôòߟ¶Îfg` [`›`ÛÚ·¶ã¶Ÿ˜h­{Z‹Ư9`U`"Ƀ«ÜK‡j;Â3k'಼|µ?¢¼æ€U‰ì„|o‚µNo‚×¾[À)jX˜Èîiqb–;Y¦þ­Æº­4- °"k†}@`M¤ÖVÀ l<˜›Y@ûtš`üµ;8LÍ«¹GÀpª¦æ€U‰ÔPiwíwy(µZŸðl'wo¦ü-WŒÃyó 3ïjš&RU@å6¶ö$à×&x±ÑÏ` ¼L3'kü£)»¬9`U`"u[ÀE*ånymtÍ¡ŸÁ ¸œ¦qªŒÛÀÖÂÌ»šæ…‰ÔÐHö- }àî×&Ø^áóóv[sÀªÀDêo‚íå8í´í¢v·- > &rÉAÈÚºÛìÍ Ê½7ónBÜæ»ÛšV&R{|fÓ.SsÀªÀDZ h[À 3ïjš&Â¥8`s äÿƒ|~þO"ÉŦ£ç_MóÂD0»dÀªÀD0»dÀªÀD®ðsI#ðósJÀä“®pB˜-`vÉ€U‰ `vÉ€U‰ `vÉ€U‰ `vÉ€U‰p"{L! °ÁD{L! °ÁD{L! °ÁD{L! °ÁDXÿæ=þ—ç»CÀèCy`5° ܼÍpÊšV&’xX¡|Vœ›h×*Ÿ–É«Õ0|Zæ×ÓWµ>ó¸Vž u¹^@Vì¼€n?/. y«¶òÀj`90‘d ø™Ç=©zóüi?øF-X ¬¾€ m[¢0ì»B@÷L£ãÂÐ;)à0…6Lu( òôÚr½é«¼³×°*0‘t è4‡¾v!;·Ì^sÀªÀD’.6¯áeaZ@`·h®jž¶êZ@å~ÙMa€ÙP­jV&’Ð\ïu:_Ü\k_`ãÁDGÁÚ ¸kÓøÑ»ù4ŒòW„—%! 0ND&‚€À°SXò!ŠçÓYÉZÂD¦°¢5©5¤â·BÀ SqýT´¦ÏT¬«Á¬X­WêCSq ÖkÈÉäkJ H\*®Áº- û€§b] ¾ØÁUäW×O§ÖÜR×­3‘鬫hMg%k A@`ìA06”€f?xs—à2E›[ݧn*̼«©o˜Ù¯]-xéˆ*>rHI èTþ6UíúËÉ·Õ°j0/ …TËUN­+ ²ÿ_úˆ˜ð嬴@Àéa¦{µÀž› VOIDAT¿"Vý%Úû¤‹/ÿ3›àÁ\/IcA`EhÁ5›`3ôß* Ž¡OædéZMóÂì¶Ï ø‰´àšÐíi*!  ÷9pr˜ëŸ¦„€j{äq€J»×°¯Üzüóu@ÜYÍ«[û§ù£`--¸è $< c/2¹+M+ÚþtXsÀªÀÂÓ0vmYpái˜kXs˜CÀ6°ò{[z/Y;ØnÍ)`¹F-îîë¶…mët-í(¶Ð¨E~R·K÷VÃúÕoð)µÈê^#`þšsߣÞi4)z–X´²í7i¥¼nçjÙü)?h”SOßüµ0%°êþ¤QŸÕø+l[§ki¿a"à XûA£ÎKÖ¶[A¬˜C@`‚‰´PU*Ì¥5·ìÍøÛ¿»~½ì‡ªÀ0ÌÕ…QChþRüóô+òÀ¼pê¸NL- ï­ÜÁ:F øò]¿þôÚõËÇ »ð廪˜§.™U:F͹®_zmëÖž7öSl‚;0öÀ¥‘T«€:" J/¦ã’5„‰Ü' Ùøê`,ÞkÎwý†—4ö^ë·d-a"7m‚_ŸžLëc¾†hƒ®_:Ü»_¹®_U`¦þAˆ±Î„Œ"`pƶz®é–wbjýÛáÇ–V&r“€´ÀZ·€ß•ƒÙÎ ¥„eÜðT æïŒ™Á‰'hî‹Ý©³bþûÄP Xp3š:Ü-û æ¼ûº70‰ùÜ®0Yó[UÛê°Õ"Vs…°/ñR7©ŽèÄä~­6±šÖÛhKœ8¾sYÿ;/%bõjn=±¸óNÓEL¡p¹cÕO‹éKŒ Ö‡¢D"XÔ-*ëGQÅ"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-âq,ê&,ê‚e•ù«ÐÓù)±6zrûo…çmVOÒÖÓû‰”H§À:cD°úÁ¢nÁ¢nÁ¢nÁ¢nÁ¢n‘°(e:ÖY‚Õ“t€ùŸ}h]×YâgLe O°pMe O°pMe O°pMeº)¼i»Ò5c¦‡¿P÷ –Ñ Öˆ“ ?a&GÌwzt¿èãmWúDñõ;Lã/BœØ„¤ÄO›ÊTÁì–}0J6…!¶IÇX3¬LL5üÍ0ƒ5ýþëkŠ= ±Épë²ÀÄÏšÊT,»ü¡‡°[Ì„‡aÆi°¿+S'ScwxݦØbü+—âM¡‰ß†Jü´©L×ýý0Þšhkcç=|ÿ€Kü´©LýÒÓ—¸ °Ü¾ÿ~ͳo—ý ~UrüçöU…(¶P'×hヺsë"M,T-°2é^ –Ý„,LÐÆ&– îܺH U¬ÿ®ƒµ~í¬ÌsŠÀÊ8Å>y¦¦# <î/쬄¥øíÍ7ê¬ËñJ¬Æ`ÅíÆ-XÅÓæPF°^Öªc§WŽÁŠÉ·ñöPÖX~Õc°L™`­+þ^s‡j§c ããŸ'¯kýgž‰š=°bζñf_ý+$­cƒµ~û#ÖVbq7Õ«Ãký6Á"X’•&X+§ `m Y½]ØbòC.YçS±Ëü$‰k´ñ!XUµe*Á’èDâmÜ%Xw¶XõâúmþÊf"XÒb‚u¡N&°ð·ƒU{¿ö•ÍD°¤ÅëBL`á B3,i1ÁºP'Xx‚…ÐLKZL°.ÔÉž`!4Á’ó8Ö…:™ÀÂ,„f"XÏwd*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*Xx‚…k*ÓÆr>Ÿì;û÷¸PÚbúƒƒ5lK°&†Ë‘RÖ+[L_b`ù«¦¾îYúâ0?mÜH—¿º@_‹éK ÖˆÅÉaö ´e^Œæèo1}‰áÁšjÜVo¬ ¾ÀOÅܧ_Ñbú¿¬i¹K°†ø©úÓ—X'Xn4⦦i]±R°ÂÎû´ÿc²óî¶ÜyïÓT¦å"ÂÔO‹éKL°ZÕu–X#X‡'X¸¦2…'X¸¦2…'X¸¦25 Ï$ê&ðËÍâG°€Mez¬é'~zºÅö1ÁÜÊfšÝtðC•ãŒ`i2•©Ixc'ÐÆmŸ™pš~â¦P•©L÷‡Ÿæ×‡( –}ÃþÄK“©L·‡Ÿ"X/0•©X&·)äλ6S™îoÌ4bÍ;ïñ#B‹)ìc‚¥¡Åô%&X­ê:KL°ÂƒéÀ ùìAâ}—UqxO¾,‚•¨Ixcþ#Q¦›¶‰8èÞmg“[~æyé²V¢á…X…nJ)2M!+kñéÕC2.,n/Æê¯›2£…¸Å<û.¥«{´¬ËÍD°ÄáådÕì¦ÂMa‘Á¨Ex)Z‹`ËÐ"X«¸xç«ú­_Þ÷]„`5IL°ÞÒbú¬Vu%&X­ê:KL°ZÕu–˜`µª«Pÿ5Ç_I„š˜`µª«–?#?s"Lb‚ÕªîD±û q' ñ?m*Xø¦¦f˜ÏÅEÙ#\kQ'Xø–¦ö4ãF+ã¯ÐvcWáßÀßßL¡N&°ð MMxfœ{‰6ÁÊÔɾi<.Å›B¿ •øiS™ÀÂ7kcçÝm Áê/1ÁjU×Yb‚ÕªîD±è<žÕ™6v;Z²°âÄëÊâ5=µ.ù¬ëj±üT|n ïûïÁÂ6Á:&pù°N¬K6ìÞ±;¡úXXKÜó°r£ƒ0ñæS ¬-‚õXÙ»MŒ}¼S²oª5ÓŒØy’²ëH°.ŸßfLOl k6SE°¶w´„Bèc‚…Öî7™ú˜`a€uðV&„>~¬3Ú2•ÜV˜Ê„ÐÇ›êKüŒ©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®©L`á ®i¹$§Íœ·ª¹Åô%~X/n1}‰ñÁÚ™|zw˜ïóóu¯äg ×ÜbúÃîeÜÍ‚->ßùÝélj&GWò™w´˜¾Äð`ÙÿíEJ~02¬aÂÉ]ÂáT0E¥ªÓ—XXÓ=^ûßÑÄâd†hÄò6ÜöhZ.»)4îN‰~3À2¬ÅˆÅMa§¦å ;÷Á¿6…±z4•i{9''wÔ×bú¬Vu½õ±°¶o‡”{ñÄMªE|ž(™+N”Èš;—ëDÉõ6>Û-§Ûض¯D;w$X+Öàv,ã‹hw’Š’=À$WÑ>ÖÊåxë¨$Wóûû¯‹]²m¼XýÁJ®0< áØ0CôíÙì×ÉKæŠùpÃaӆ߲öµb—E®%Ù6ŽKâÖÞé›R—­6>ri–ä¡u]g‰Ÿ1• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5• ,<ÁÂ5•éÈÿóY¿ýù{ñï§ñŸâÏgúqúPxg»„`¡›ë3ê Xƒ+KÉçãI"X/3-ÖØÉûƒÎÖÃ6X#MŽE‚õ2Ób9°FJ¦ìÎ9öu·¹ó/ºR°ì§—`¹Ñðã—6Õ¹gh-¦°u2ŸO€Á=¸‘ÇÁw–{18D/ⵘÂ>Ö–%j –%és–+OÁŠ^Äk1…}¬¬ôÅ,7òœ±f?¸SØÇ*ÀòƒÌ¬y“¶ØyO¾\rSø^ÓbEDd6…óý'Ùy¶l~_ž;ï]˜ÊÀºâ¿:¦ªÅô%VÖ|Ló”¿Û¡¯ž`ášÊž`ášÊž`ášÊž`áš–Ëßdøàþ˜oo±oh Ûán•°‰µ€åŽî3ýÒKÁšïFL°ÒºrwFp±Lt—tw«ØéwÖ˜âûêªj1{]·z&/%Üì*ñÓ¦åŠï4¼ºm¸}Wt_]m-î4ll[øwìoÁZÔ•+¾Áv¬ÁNw`ÌKÁr÷±v£•üª†ÛÌÃ%~Ö´\ÉÛ£MaVÛð [,ÜNý;$ò‰ÞÆJü°i¹–›B¿ˆ.ÀŠÇ¥xShâ·¡?mZ®°ó>1´ÞyŸëmçÝm Ö°âÂådDµ˜¾ÄšÀJF¬çÂ,\S™î oîÔÂDñ’©`Mïhã*ë"M,Ô­`ýî“IMN€uÅ´|MÛ€u²E‰…"XgL Ö¡ÖS‚u(‚uÆ”`Š`1%X‡"XgL Ö¡nëN-LÄ/™ ÖôŽ6®².ÒÄBÝ V»ºÎ?c*Xx‚…k*Xx‚…k*Xx‚…k*Ó ág3/vwÏu&XÀ¦2ÝÖ‚¤ôéöw8‚l*Ó%{!Ïâ|Áù|Lã¯ÐæêÆOsÄRi*Ó5°ì…<ÆÉ~?XµÃ,\S™–ÂÄïkëd U-¦/ñûÁÚ:=LU‹éKL°Z­to}L°4´˜¾Ä«ÕJ÷ÖÇKC‹éKL°Z­to}üz°Òã J[L_â׃?¬·›Êž`ášÊž`ášÊTÍŸ›Â·›ÊTÏßl^´ý¡‘`›Êtø£‹vâÛê,`S™júÏí É™}ûí K‡©LõüM|ÑN沜í‹v¾Üj0•©*XƒG*wYNÉE; ØT¦šþ XÓ‹›`Åïšë+Ý[÷–É€uxÑÎÖ·Iùš÷ÓÇ}eæ‹v†åÎ{áE; ØT¦º`]O°pMeªéO°^m*SU°¶î•ŠÝb û¸7°¶îîŒÝb û˜`¬÷˜ÊD°4ö1ÁúË–@°€Meº¬+Ý[,‚õS™ª‚µu¸¡ø˜Á6• ,<ÁÂ5• ,<ÁÂ5•©Yxs²½¹û1•©]xs²¼¹û1•ééðéQ® ¾ä$›[L+wd*ÓÓá°Œ;p<Íù[¸õ|º¹û1•©ix“ b–ñ˜°¹œg#¸nzoqG¦2=>ˆgyÁ…ŠæîÇT¦ÃGOç Á¦×,Xþp*G,(S™š‡;Uó5= °Â×G‚e*Sûð"{1ÅjShqâÎ;œ©L†¯êIwÞíe¬Æ?QÑÜý˜Êþ S}‰ ÖÆÃæÉ ØT¦çÂ_¿¦¢¹û1•éA°.ŸÑÜý˜ÊôXxC°”™Êô\x‚¥ÌT&‚¥± Áz©LKc¬=°x¸A—©L`áŸ0Õ—˜`µªë,1ÁjU×Yb‚Õª®³Ä+<ÄuÞ9/†`›ÊôXÓOÙ3ù°©L÷‡__Œ¦û"XšLej>=ÙO÷ÅM¡.S™îŸ¹góÂA‚l*Óíásã,¦2µËä6…Üy×f*ÓýáWãìÜõƒ`›Êž`ášÊž`ášÊt{øüÙ1ûºlZd/^Ý6‰ V!X¹óùöU¬]!XM,‚E°¶E°VaL‹`ÖÉD°VaL‹`ÖÉt?X<Ü@°žÿ„©¾Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ÁÁúŒZ-âóÉøû_ÙbúÃeÿ'X4½¬qàrã×ðµÿì¾ø¶Ó—¬iShÉqˆùÁiãÅÒ±KU‹éK ÖT1äŸ:è–`e6œµÃ,\ÓbíƒHJÆ)n û5-Ö&Xö¿Å¦pú›ÂŽM‹åÀ ûéCx:Ä/N‡$¸óNS™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™ÀÂ,\S™.ûûSt·©ÌŒÐ-f‹Ã-®ŒŸún5! LâžÀŠR°Lù²Àò“ÞefúIü>°Æ)qƆ'Æ™~ö³ZÚûã¹ßò,3O›cgjúîŽ [l“ܪŒñã›ò™ðPÙ”`m¼h™~ìÄ©ËM¡IÀJ¦ûò€å¹GZÌ®€ ßíÑ„ì7˜¬,XÄÅ4L™™$߯ýþ/Á²ŸÿZígZÌŸn´ò1ýF±p N°6t¬dVË,?-7…ñìâû·mÙb&< 3NÃj†ìã÷eXɈef°2#(Xñ¸o MüvmS‚µñbØyæáfµ´¼x÷<Ùy·{5à;ïnƒH°ƒ% ïÇ2èSØÇ݃5ï­O°€Me‚•Nưó43iÃâ`öö§›Ìó°1ÅľÂìv´daʼnוÅkzj]vgb %럠)ÃæÓè¤#lðå²VŸÞ V ¬œýÜ®¾qü¬KT’y8&pù°N¬ËÑJ>ÖîÓø ß~1îùX…'kIÀÞºDÝ4¬19‘8·ˆ»ÀZÿAK¨ûÁÊþÎnŽo¡Ñ ÁÊüo¯KºBׯêfÄN¬‹8±P F,IÏ¢X¦'6…òÄÛu}ŽXËZ~{+cú>°4ìc/kñé6ß O·yÆôu`5ÿV˜î:î<Íìbî,ëøÓõÁ:£-SQÉ `UÕ–©LÕWºj‹áwd*Xx‚…k*“Øÿ7=üÊÂÿÜO¿Òð¿uñ¾Õoiúû%ιêïã‚õsû¨,ÁJ¨‚%m±ßÆÛe‰¥kCBÿh8øÙÁá7>þý?c0¾ØpŸü'çÏøwÓåLŸ™–ð›>ãGûîw^Âo˜ß—à"ÚÅøÏü¢ìµ››`åu¬ßÔu÷“ÿœßîØÏØÑÂ"}Æ/Á"6½;+¿dSøf ]_´T»lŽè° °ÝÒÜ+¯3`ýÜx3Ì]ƒå†šÐ½C¬ihr£Ê°+6ˆÁŠ–°\êoZä¬a˜_'Xø`…­,X¾»—`Å›B×å`¹%HÁZEœ]¢7j77ÁÊKêÿKò`ý¶6…Cü™ °¦×݈µ@'+»)vÀâÎ;4XaW& (v·:ÙÌE#V´[î¼/F¬°ëívŽæ=óh×>+z7ãò‹v¯¿©ßÖéðË÷k¦ñví×]¬ø!±.›,‚Õ ®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°†Õªþn @-¦° VÖôSrË ˆSØÇ]ƒeÜ-üæÛÍst ‚l*Ó­áÍànVúïÉM¡NS™î ? Pîö£áÓ»L;éãžÁr·%X¯1•éN°LnSÈw­¦2ÝÞ˜iÄJî$n—i'}Ü5XjZL_b‚Õª®³ÄƒåvÔÏÝ=`Ï ùìAâÒ{¸Ã{òe¬D÷…÷CÏÝïd±Äm"º·ð>0Ë%ä­$‰ Ö]á/ƒ• SdšBVÖâÓ«‡d\$XÝ>ôð °2£…¸ÅíÓ1î`ÙGË:ÝLMë^VÝMáé+½%Z‰Áˆ`¬Â:™n ´cB°Ö…ð;ßÑ7uÙ´È^¼ºm¬·´˜¾Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³ÄZÀú|6ý?ã{/o1}‰ÑÁú£æsÖ—`ÑT ÖÈL–)‚EÓL]±&¨¾nsgÿù|ÇQìcŸMo[°Ü³w¶˜¾Äà`¥›B;~}£alb*Ÿ4û`Y’VŸ¦Å¹(`c¬—´˜¾Ä À²äL?Mÿ|?ñ3ûO˽ç_‹>ñ÷îøZ NU‹éK –ÛZœÜøõuÃXú¢_øÖëMeªæÏëí¦2…'X¸¦2…'X¸¦2…'X¸¦2]öwÄ“² feCh1…}ÜXñC ü$m ûøu`™é×ã}ñì$óÌ·nî,³Ë¿;ÍhâI(qZLa¿,?…¤C̬6…&kž'×ax0“7Á6•IÖ`§é6&LzƒeŒÉ‚e?ÿ “bµ˜Â>~)XnÉXќоĄù|=X·¬to}ü>°Œ+±¢ÉÆ3#Áz‰©LB°üÎ{4ÿó¼{þµ¼x÷<ÙyŸãλVS™¤`ÉÂû± ºÅöq÷`…™¼o^éÞúø}`¥³4ü/ÒßÓgµµ¬ü¬"´˜Â>~Xé¼2«'S™–Æ>~5XŠÁú{škkÂ#‚¥ÌT¦ó` ±ú2•‰`iìc‚E°Þc*“,nè×T&°ðO˜êKL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:K¬ ¬ÒÉ%8_aŸ¦2m•"“aöl*ÓÖrJÀzI‹éK Ög5—Î& ÿĈq"Ì®M‹•Îþ=Ì8q¾Bš†ºb,µ}ÜXœ¤éõ¦Åú$sB¯ÁŠ÷§Xœ³[Óbù-W´KmÒ>óÛóÂ9fǦÅÚ?l~ÌxX=pëõ¦Å*ËK(°æˆõvS™ÀÂ,\S™ÀÂ,\S™ÀÂ,\Ór™0ÙR˜ Ǭg†{}‹éKŒÖ¨–‰'|»0Iª¾Ó—XXvŠ¥y&A7'G,š^ËMQùµ?G3t,š^ËÌ` ‹¦[uMøÇT–ß…ï£Åô%FËNø–|+üºi+9bÑôXÑáw‡mcü¤¨ý´˜¾Äè`†'X¸¦2…¿ÝtkÊ(™^ßL¹:™ÀÂï¼]‰ü|RÕÉB°.†¯Ó u@Rsì*óIDATv¹Ö7UgÕŸîÀw«NÕ‹HPA¥ðqÄêFuú¨æˆU÷±îTv¹Ö7ªwÞëÔÕé,$7/Áº¯¸¯o¦\L`áŸ0Õ—˜`µªë,1ÁjU×Yb‚Õª®³ÄZÁ²_Yâó³Ü—{â–ûàÞ—U-¦/qSû$9ÏQ;6ýš"Ó–˘È+:j²ûmYU7éK\É4€e žIÇzìj‚å/Ý™.Øùº«w\‹G,í¦Æ^öç/§ñ}œvle°b?b—$ú h‹éëã'LCŸÑ.»0°W{Sè®1 ` ëu¦XfkÈ€U{ÄòWí˜XÉß!–jSÿ]Ì,À2&¹B«*Xöüˆä[a”ÄïÞ,ͦ˜åÕYsÇsÃÎ{|¸ÁRÆÌI¾î…xŒÓbúúø°¢Ã IG`Ýr¸Am‹õøS™ÀÂ_7=y¾‚®>¾ÍtuöÆÁ:GHÓ3¬š©RqÒzaíÀÁjŠHKƬíÖq€õZDZê$ŽÕÁ*ìœù·á*XDQ»Ð‰Áw¦.ŽXíu®_0bq«T'¹ÚÆ/ÜǺyÍ“çMq<ÈãÍT©8i½Å/ÀËÀ:W|ŽDz®5²u2õÒb¯JüŒ©L`á ®©L`á ®©L`á ®©L7…²kØbv×4sqJ|r¬d_ž`mèžð²cÁ[,{qJtR<©Fb S™®ûÏ—ï̧ŒÁŽXßÍ‹S¾ÉA)‚õøV?oZdãf:Áê)ñ3¦EQEQEQEQEQEQEQEQEQEQEQ7éÿr2â›##ßIEND®B`‚Bio-Graphics-2.39/t/data/t2/version9.png000444001750001750 2406412366325116 20052 0ustar00lsteinlstein000000000000‰PNG  IHDRXËJ @PLTEÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõKѧg IDATxœíi’¬:t„©/À½…yìÆ‹¹KqmÏ]h@ ” â”ïÕí™H_ Í0 EQEQEQEQEQEQEQEQEQEQEQ¥Mcé¡üNÅCëºÎ?cŠIXx‚%×Ó¯æóž`É5­×çOKabá`ýxÊ2ÕY‹éK¬¬_ÍÇÒõûç3þF±}öy <Á’kZ¯dShÇ¯Ñ cÿM?öÐbúKkˆ˜Z€5Xäºh1}‰Ue7~ã<ñ⦦ÇÀ EtqSHÓR]½ìëãæëéˆÅÉ;Mu˜BárbÕO‹éK,¬EA"XÔ-ªëKQÕ"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-"XÔ-â~,ê&,êU‚e•ù«ÐÓù)X…ž,ÿ­ð¸ ÁêIZÀzzžHA:Ö#‚Õ—u‹u‹u‹u‹u‹ô€E)Ó°ŽÚ¬ž¤¬ÈÿèCëºÎ?cŠIXx‚%ד°ðK®)&aá –\SL7…7mWúÊÄÆ˜éá爫ûËè뇓 ?ÉLÜX¿1ãôè~Ñ?´]éÅSÔq˜~¿qb$%~ÚÓþ¿Nq`Ù£dSb›tŒ5ÁÊÔaºÂß 3XÓï¿°¦ØÓ› ·.»˜øYSL‚e7‚ãzHv‹™ð0Ì8 öWƒ`eê0]àoì„רmŠ-–?bÅãR¼)4ñÛ¢?mŠé¼¿ßÆ[ `&ïáû‡¸ÄO›bºÐß(m1}‰»Ëýáûï×<û÷vìoð«’ý?·¯* Ø $¾¢wꎭ šÔU`eÒ½,» ­XÐÆ&Pwl]ÐÄ .ëÖŠÁZ¿¶ Vf‰9E`eœ÷bX1x—‡²þÀò«ƒeꀵ®ø{Ííªö%üÿbù)L]7-´¿Us¬ÁM,ã“hw§ IEÍ 0ÉU5ÇZ¹ìϱöJrÅq0?ßßÙy]í’mãÅê?Vr†ándž¢oÏf»/™+æÝ »MJ|ËÚת]¹”dÛ8.‰[{£oj]Jm¼çÒ ,ä¡u]g‰Ÿ1Å$,<Á’kŠIXx‚%ד°ðK®)&aá –\SLÂÂ,¹¦˜„…'XrM1 O°äšbž`É5Å$,<Á’kŠIXx‚%ד°ðK®)&aá –\SLÂÂ,¹¦˜„…'XrM1 O°äšbž`É5Å$,<Á’kŠIXx‚%ד°ðK®)¦=ÿÏgýöçïÅ¿Ÿ~ÿl>ÓÓ‡Â;å‚%Ý´ZŸŸŽ€5X°²”|>ž$‚õ2Ójý:y{Ð)=”ÁúÑäX$X/3­–ëGÉôÝÂÙ!Ǿî6wþE÷O –ýô,7~üÒ¦:÷LZ‹)ìc]`ŃÌç`pnäqðí€å^ Ñ‹òZLak˵˒ôÙË•§`E/Êk1…}¬¬ôÅ,7ò±f?q-¦°U€5ä™%Xó&m1yO¾\rSø^ÓjEDd6…óŒþ“LÞ£-›ŸËsòÞ…)¦ÖÿÕî0U-¦/±°æ}š‡üÝ„þšðK®)&aá –\SLÂÂ,¹¦˜„…'XrMëå/2¼s}Ì··ØöF¸Z¥ØÄZÀò{×™~i‹¥`ÍW#&Xi]½~WFÿ5à4b™è*éîR±Óï¬1Õ×ÕUÕbö ºnõLz¿”p±gQ‰Ÿ6­W|¥áÕeÃí»ÐuuµµX¸Ò°±máß±¿akQW¯øÛ°{»c^ –»Žµ­ÌàW5\f^\âgMë•\¹=Ú&`µ ß°ÅÂåÔÇ!–Mô¶¬Ä›Ök¹)ô‹è¬x\Š7…&~[Tâ§Më&ïCëÉû„\o“w·A$X'ÀŠ —7#ê¨Åô%ÖV2b=ž`É5ÅTáoª¿,¼TƒÛ\ÍO±Ý"GMí~OêÖ´®‡q½Œz6­ šTf{+˜ Rë{Ÿ¦ù¡ &Ð.‚ÃáL À·Ãöûsù °6"”ÔX©~œ,‚v+Xvï¸IÀªÜ©y¬%îyX¹V¶E9%‚å«nëæ5¿r} «ïL¿wµn+·¾%«ñæ|¯~£6b>qÉÓ^ø3kÞ¬Æ#¼¦õs,¸yÏ­ œÔ«Àj3ǂ֔`½,ì[áS‚µ«[ÁºS 8â)S`MïhãKÖM êN°ÚÕu–øSLÂÂ,¹¦˜„…'XrM1 O°äšbº!üâhæÅdpóXg‚%ØÓM`-HJŸ–¿Ã,Á¦˜NùÛyÇ ÎÇc†Þ0P÷û4G,•¦˜ÎeOä1îHæ š1ÑâŽxÇ–ÏÈ,¦˜Î5̇ÅÛ}kî@Ôù –{—s,½¦˜®kz­Vø ÁÒjŠéX&VfShgÃ,¦˜Îå&ï–©dòNü‡Õäݘë{ª¸#SL'Áº:<Á’kЉ`)Lü~°J[¨j1}‰ßVéð0U-¦/1ÁjµÒ½õ1ÁÒÐbú¬V+Ý[, -¦/1ÁjµÒ½õñëÁJ÷7(m1}‰_Vü@°ÞnŠIXx‚%ד°ðK®)¦Ëü¹)|»)¦ëüM¡x÷¤èK°)¦ûÃï´_V—` 6Åt¥ÿ|ÒÎÙ·}ÒÎ@°t˜bºÎßÄ'ídNË)Ÿ´3rS¨ÁÓ¥` ©Üi95'í,Á¦˜®ôOÀš^,‚¿»q9`ÍÝ)¦KÁ2°vOÚ)}›Ä×¼Ÿ>î ,3Ÿ´3,'ï•'í,Á¦˜®ëtx‚%×Ó•þëÕ¦˜.«t­TÙ-¦°{«tugÙ-¦° Áz)&‚¥± –½±‘ìSØÇ‹#Ö{L1,}ÜX¥Ý Õû–`SLÂÂ,¹¦˜„…'XrM15 _uS]‚%ØS»ðÙ»"Kh1…}L°vÒ½\|ÉA6·˜^XÜ‘)¦§Ã'`w0àï0ç±rëùts÷cŠ©ix“ b–7â1as9ßà¼é½Å™bz6|z#žå *š»SL†ÿí=O›^³`ùÝ©±D™bj>Lªæsz`…¯K”)¦öáDödŠÕ¦ÐâÄÉ»8SL†ÿÕ“NÞíi¬Æ?QÑÜý˜bþ S}‰ Vá¡xðÁlŠé¹ðçÏéÑÜý˜bz¬Ó‡Šhî~L1=Þ,e¦˜ž O°”™b"Xû˜`¬÷˜b"Xû˜`mÅÝ ºL1 ÿ„©¾Ä«U]g‰ V«ºÎ¬Vu%&Xá!þ«óÆq1K°)¦'Àš~ÊÉG°›bº?üúdœp»/‚¥ÉS“ðéÈþv_Üê2ÅtøÌÉ8Å –`SL·‡ÏŒC°4šbj–Ém 9y×fŠéþð«“q6®úA°›bž`É5Å$,<Á’kŠéöðù£c¶µc|v'ñ¶Ëª8¼‡/‹`%º¬Üñ|ÛÊtS™ˆî-Û›Üò3Ïk—E° +A¦Ê4…¬¬Å§WɸH°‰+3ZÀ-æ‘Øv©]ݽen&‚Õ¬Ó¦5öÙ9ÖæÁD°Ve&‚E°*ë0ÝÖ6­²‡W·Mb‚õ–Ó—˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,±p°>?­ñùdüý‹¯l1}‰Åƒeÿ'X4½¬ßÀ寝a´ÿl¾ø¶Ó—X¦ß(VnÁ VAGÀJîjåG£å¦0¾»øöe`[¶˜ ÌӰ‚EöñûÀ2¬dÄ23X™K(Xñ¸o MüöÕ¦«ðb˜¼G÷áîji7xñô<™¼ÛYðÉ»Û ¬Æ`aáýX&ºÅöq÷` àµõ –`SL XéÍ6žfnÚ°Ø™]þt“û<n1±­°»­YXuâueõšZ—Íęؠ@°þMŠO£7’ްÁ—ËZ}z+ØU`åìwä¦úÆñ¿³.QIæaŸÀå6À:°.{+ùX›Oã7|GøÅ¸ç`Uîœ|¬%[ëuÓ°Æä@âÜ"îký-P÷ƒ•ý-Žo¡ÑD‚•ù=.¯KºBç¯êfĬ œTƒ éYé#VÁôÀ¦O\®ësĪXÖòÓ²çXÓ÷¥a޵¿¬Å§Û|+<ÜæÓ×Õü[a:uÜxš™bn,kÿÓ׃uD%S¨ä°.UÉÓå+}i‹É/îÈ“°ðK®)&Øÿ;=|ëÂÝOßÚðßuñ¶Õwiúý&ιêïã‚õuÛ¨,ÁJ¨ÁB[ì[x».1ú@° ý£áàk‡ïïñïÿƒß+ ÷™ÁrþŒ7]Îô™i ßé3np´ïŽó¾Ãün¼Ñ.Ææe¿º¹ V^'ÀúN]gñq?ùÏùíŽýŒ-,Ñgü,bÓ»ó°òM6…ßaÆÐùFKµKpÁæˆÛÛ-ÍM°ò:Ö×7ÃÜå1Xn¨ Ý;dÀš†&7ª +°bƒ¬h Ë¥~§E.À†ùu‚%¬0ÑÊ‚å»{ V¼)t]^Ë-kqv‰Þ¸º¹ V^¨ÿ7}ȃõ-m ‡ø3°¦×݈µ@'+»)6Àâä]4Xa*;­N6sшM«ÓÉûbÄ So79šgæÑÔ>+z7ãòv¯¿©ßÖáðËÉû9Óx»öí® VüX§M ÁjP×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&XÃê UµA-¦° VÖôSrÉ -¦°»˸KøÍ—›1fïAK°)¦[ÛÁ]¬tŒ¯ÉM¡NSL÷…Ÿ(wùÑðŽ¿€é]¦ôqÏ`¹Ë¬×˜bº,“Ûrò®ÕÓ}á™F¬äJ’á"ñw™vÒÇ]ƒ¥¦Åô%&X­ê:KÜ9Xn¢~ìê[Égw×^£ÀýÞ×E°ÝÞï =v½“ÅËDìtoåu`–KÈ[!‰ Ö]áOƒ• SešBVÖâÓ«‡d\$X€n zøX™Ñn±]ûtŒÛYöÞ²7SÓºW€uí¦ðp‹Õ^­Æ€`"X«²Óá÷&&‹`¿ñ½¨Ó¦Uöðê¶IL°ÞÒbú¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎkëó)ú~ï½¼Åô%–Ö5Ÿ°F‚ES¬3Y¦M3uÕš ÝæÎþó£ØÇ>›Þ¶`¹gïl1}‰…ƒ•n íø5FÃØÄTxð¾¯Åô%–Ö1µË\aÄzq‹éK¬ ,»¹ó`ùË›ÂîM«6p]y°¸)¤)";Çú¸­^2b¹M¡}“wšÂ …nŽõpx‚%×Ó\hG¬‡Ã,¹¦˜„…'XrM1 O°äšbž`É5­—½²“½é½‰}eœžtÓbúKë§–ñw}û-§|á›Ã,¹¦Œ½›R¸‡’1þ®]ý´˜¾ÄòÁŠïúîSéPë¦Åô%V–Io"H°hz¬ 㘊ÀòSø>ZL_bé`Ùë'ß Gw}vŽX4=V´»Á]Tڸ¦ÇÁž`É5Å$,<Á’kZ­#÷Œ :V5Xø]n¨ŽE°¨[D°¨[D°¨[D°¨[D°¨[D°¨[D°¨[TE!ªk’°?ðO:rM1 O°äšbž`É5Å$,<Á’kŠ)·;S‹(õs·ÑÌÜ:PU‹éK¬¬ßC˘"3ƒµyꡪÓ—X1XþdÃéÃÑoøÇYkûÔCU-¦/±^°ìÉþðw…ᦰgSL`™¬`ÑSv9þ‰mqÚd|f›¨ÄrL1÷Ÿ¿D…_|Á`E»ü7 ì”I}ÜXáÁ\þ‰Ó—¸'°ÒŠªZL_â>ÀÚ9:¸ck‰—U۰ßÓ}ÜXÿ‘‘ɼ]Vn‰%—eÅX§¨ÑÇ‹`]ÒÆ"L1,‚UY‡é.°få^ÛQ5X™ ãwÕº óÎϧÁRVæmŽX 1$X+#‚E°*ë0,‚UY‡é°J»Wo×®4¾Ã2ë\ö{º»K}‹éKL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:Kü°>ŸÅ;ŸûiúA‹éK,¬ÏgÍ6X–$‚Õ§iµ~\T°Që%-¦/±°,9ÓOÓ?ã'~fÿ `¹÷ükÑ'þÞý½ˆSÕbú Ëm -NnüÝ0–¾è>XŽ©ðl /êk1}‰¥ƒ5††ÑC‹¦×ƒ¿è¾–ßv*l1}‰…ƒ•ÝêE`eG¬ðâ°±”¶˜¾ÄÂÁæIx~Xþ’1³Úš¬ù>¹Ã;y,Á¦˜@°{›ncÂM/c°Œ1Y°ìçÇp“@Y-¦°_ –»ä ¬èžÐ¾Ä„ûùz°nYéÞúø}`V2bE7ÏŒXë%¦˜@°üä=ºÿó<=í/žž'“÷ 1NÞµšbBÁÂÂû±Lt‹)ìãîÁ wò¾y¥{ëã×õ¿‘þžþw¤¿§ÿ•UiYÿ—Õ-¦° Áz)&‚¥±_ Ößô)ëïi¬Ò –2SLÇÁ8bõeЉ`iìc‚E°ÞcЉ`iìã×õÊÓ—˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–˜`µªë,1ÁjU×Yb‚Õª®³Ä«U]g‰ V«ºÎ¬Vu%&X­ê:KL°ZÕu–XXµ7—àý û4ÅT+{‹LÞ³gSL¥åÔ€õ’Ó—X8XŸÕ½t†p#ÌðOŒo„ÙµiµÒ»E3N¼_!MC]µ–Ú>î,Þ¤éõ¦Õú$÷„^ƒϧX¼f·¦Õò[®hJmÒ>óÛóÂy#ÌŽM«µ½Û ü˜Ýñ°zàëõ¦ÕªËíK¨°æˆõvSLÂÂ,¹¦˜„…'aŠ[£IDATXrM1 O°äšÖË„›-…;á˜õá^ßbúKë§–‰oøvâ&©úZL_b`Ù[,Íwt÷ÄáˆEÓS`¹[TŽöçè]‹¦§Á23XÁ¢i©ЄqLE`ù)|-¦/±t°ì ß’o…£»m%G,šž+ÚÝ`v7´$X4=–ÀðK®)&aáo7-Ý2 Óë›)W‡IXø·¯Aâß%º& Á:þšn¸ Iº¦]ÎõÍC`]³êOwà»uM] ‘ ‚jáãˆÕ®é£+G¬ °8ǺS״˹¾Q=y¿¦îšn…Dãæ%X÷_ƒÄë›)W‡IXø'Lõ%&X­ê:KL°ZÕu–˜`µªë,±V°ìW–øø,÷%Ƹå>¸õ¥FU‹éK|©ý’‡ç¿¨Î›~MÁTò`yE{M6¿-«ê&}‰/2 `™p€gÒ±»+Áò§îL'ìŒîì—Ä"ÆK»©±§ýùÓi|§{1X±ƒ±ŒK}Fh‹éëã'LCŸÑ”ÇØ»zSèÎ1 ` ëu¦XfkÈ€uõˆåÏÚ1 °’¿C,Õ¦þ»˜Y€eLr†Ö¥`Ùã#’o…Q?½#XšM-0˳³æŽ5æ†É{¼»ÁRÆÌIF÷B¼–Óbúúø°¢Ý IG`ݲ»Am‹õøSLŸ7=x¼‚®>¾ÍtuôÆÁ:FHÓ#¬$4ÓEÅIë…µVSDZê0Ž‚À*·vˆÛ¬×"ÒRq¼¬ÊΙ΂ED$j:,¸3Q¸8bµ×±F|ÁˆÅ9V­"r¶_8ǺyÍ“çMq<ŒÈãÍtQqÒz‹_€—u¬ø!Üe\kdë0õÒb¯JüŒ)&aá –\SLÂÂ,¹¦˜„…'XrM1ÝÚe×°ÅìÔ4srJ|p,2—'XÝÛܸŲ'§D' Å7’‘X†)¦óþóé;ó!cbG¬±xrʘì”"Xσ5Ÿe1*/¬ÂÉ)Éy"7…™:LWø¯ïm!¬õÉ)Õ' ‰èã¾À2἞Ãí¸¿Å6ON‰?#&±SLøû“¥£“hÅŽXÅ“SâóDD%–cŠé¼ÿü%*üâ +ÚÝà¿i`' ‰èã.À \@ñ‘Ó—¸'°ÒÃH–o×`¥w’)Pé¡z”)8:Î`t™ÿt,߆,Þ6ÿ*çÃ%¦æƒ„ÊÅ&Ǿ1ø#gGfNL°®óŸ»åßz§»C_鸻Óò \ÿöŒK J‡þIìãNÀZôÍ¢ãÃH€¬ôV‡Á+gRá²T 0I}ÜX¹І­ùÝŠ‰–_bU§G›«èóÛ.P9ÀN4ÁÂý9b¬•®ñçëÐÁªxà·B‚ëBÃýX+HXø'Lõ%&X­ê:KL°ZÕu–˜`µªë,1ÁjUwAqø~a¡3b¬Vu‚5ß:ˆ`¥u˜„…ogêv~Ú=o&=¯h÷:öý4Á:PN.2é™ÑåÎ…%&XZ̯ã«ŽŽT–øYSLÂÂ74ΫOîía¢·e%~Ø“°ðíLãq)ÞšømQ‰Ÿ6Å$,|C° “w·A$X«¿Ä«UÝuÅè!ëwáz¢™ü±@'.Ç JV? Væ ,ÜÔøÃÒD4SÀɬ_Ä%«1-HZÑ‹å$¥O5Ó§­#d«iÄ$«›V4t8ô¦in9·×¼|¶Hb ¤ôqsS¸ò ïV,jÑL‡p*­c)1( }ü˜)G¬hý8b]]Ì9V)&Y}üˆ©+NúÂ>ÁM ¿:Éêã'Á²¾Õ›ÖÙ¸™ãD°zJüŒ)EQEQEQEQEQEQEQEQEQEQEQÔMú¢.BIÈIEND®B`‚Bio-Graphics-2.39/t/data/t2/version6.png000444001750001750 2407412366325116 20050 0ustar00lsteinlstein000000000000‰PNG  IHDRXËJ @PLTEÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõKѧg IDATxœíK–³:„ñ9=èaoDÞôØßÝŠ·×eô@ Ç]€åþðý÷kžý{;ö7øUÈþŸÛWmP_Qã¸cû‚:uXw¯ËB+6ÔØÄâŽí êÔ`ýw­¬õ{»`e¶˜SV&óžíƒWj:Âr{c»`%,Å«‹+®Ù—ý$XÁŠÚõ[XÕS±+#X¯kÕ°Ó;û`Ådà5.weýåw=ËÔ kñ÷ž;U;Køu0þuòÞ1°Ö晨Ù+&àh‹q~÷Ï´r,¬õêWôX%Çp3]V‡=Öz5Á"XÈN,‚•Ó`•N†¬VWV ?å’Í|Èv]>Äñ5ÞëR•’b"Xˆ8¾¢Æ]‚ugÅ.¾¾æ¯,ÁBƒ Ö‰8LÂÌßÖÕãÚW–‰`¡ÁëD&aæ –„2,4˜`ˆÃ$Ì<Á’P&‚…¬q˜„™'XÊD°Ð`žÇ:‡I˜y‚%¡LëùàŽ’bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“b*lçóÉ®Ù~Æ…ÒŠés,¬éb[‚¥Ð±x°)õ`½²búëËß%0ý3ºWé›Ãüê—Æõtù» ôULŸcñ`M€Xœfc -óf´˜?¢¿bú‹kŠqG½X|ŸÐ‹¹O¿¢bú¿¬i»K°†ø¥úŠés¬,×ñPȤi\µR°Âà}ÚŽÿ1¼»c ï}&Å´ÜDèƒú©˜>Ç«U\gŽ5‚õ°y‚%7)&aæ –Ü¤˜„™'Xr“bjd>žIÔMà—›Å` NŠé °¦ŸLøééŠ)lc‚5¸9”Í4»éà»*ÇÁÒ”SóÆN ;üŽ}fÂiú‰‡BUI1Ýo~š_û×EY°ì û{,MI1Ýn~BŠ`½ )¦`™Ü¡ƒwmI1ÝoÞ˜©ÇšïñRBŶ1ÁÒP1}Ž V«¸Î¬°0v$ŸÝq¼eÖáÛ"X‰š˜7æ?ˆ2ÍT&b§yË™Mnû™×µÛ"X‰˜± Í” S•4…¬¬Å§W‹¤_$X€n7cõ×L™Þ®˜Gb;Kíîîmët™l'ëÊfª<V% X€Z˜GÑ"X«2C‹`¬êà¯ê·~yß΂ÕÄ1ÁzKÅô9&X­â:sL°ZÅuæ˜`µŠëÌ1ÁjwApü×'‘TÇ«UÜ…`ù+ò3—!ŠqL°ZÅv4îÄ!>c`ÂB’ã§“bf¾iR3Ì×âǧ¢ì.‚µˆÃ$Ì|ˤö4ãz+ãïÐv}WåßÀß_¦‡I˜ù†IMX 3Nƒ½E›`eâ0 3ß.iÜ/ŇB¯åøé¤˜„™oVað`õç˜`µŠëÌ1Ájw ºŽgu¥=ŽÖl¬Úñ:²zOíKÞ+Á:Œ_Šï¯ ôM`ÿÝÙX¬}—ØëÀ¾dÍn»%¡µ$À½®+×;€Ž‹ÌU`ýÐ"XO€•}Úį7BVýÍeeš;NRv Ö‰àã‡ÂLÒ‡Â+Ët!Xå( mL°¤€µù“„6&X2ÀÚù ‹IB?Ö•’B!7€uv’b’ÐÆ'Õçø™¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“Ö ¹lvçºUÍÓçøM`½¸búËkcðií0?çgtïäg ×\1}ŽÅƒžeÜÂ->ã¼vúq¢ÉÑ•|æÓçX„ÌB°rç|9_ã£Ír¸Æ¶¾ˆ6ž H°VX dÅÓ0,Ù7k­ã:sÜ:éèCke‚¥Ññ`Ad™`©tüXY=ŽêEõd ì±T:ÞcMŸ%X ?ÂÕïÓ<ÝÀÓ 5 Œ«ç±6w—`ùÊÕF‚E°Âç ÜiÌ|»¸Î?“S}þµÕ=VüA3TMÝ…ü¾ÚV„,"jÜ%‰“Ô„Lß¹¾v³¬C²ÁÛY²qxÁÔø~°ìeY•&â˜:°ì¬Ì¡b;¥Ó˜°êéJ³ °Y–»²—ŬCrÁ‹Ý­k¹û·Ôø~°Ü]:›_$çóåËáÚçí;íö¥Ý ‰“ŒC•»$ĸ+ž)u;Äøßò9)—!.U~WJû²Ê’‰[fÙ/XRãÊv`™iŒoÅÚö¥(™/³® 1i’Ê©1b_•,æwe¬SAé/ÉV–M°jú‰`Õõ°ö€LÁª ÉôX{î2`ù—ÕY¾êX,ìJé—doï±,ùÛ‘\U?Ѭ6=–˜ =V•»e_b°ËõX™:°«²ûÉ 7ï±ü¦Î‰Ú_ˆª1Öà–ñM´»C†$¢f˜øªc­²ì±öBrÁ±1?Þß9y]%[ãÅî?Vr‡á® dž¢oÏf;™#æÓ »¥ !¾²ö½ê, _B²5ŽCâjo´Mm–R÷²´ Y´ŽëÌñ3I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnRL{ù?ŸõêÏß›?ýþÙþ|¦§…5å‚%=iµ>?k°`e)ù|qSØÆ*Àò̬ù¶¼'_.y(|oÒjEDd…óˆþ“ Þ£#›ËsðÞERL¬3ùW§ÃTULŸc%`Íç4åwúkÌ,¹I1 3O°ä&Å$Ì<Á’›“0óKnÒzù‡ ï<óíC1l5ÂÓ*Å:Ö–_ì=gú¥KÁšŸFL°Ò¸zýžŒþ+àÔc™è)éîQ±Óï¬1ÕÏÕUU1û]·{&/%<ìY”ã§“Ö+~Òðê±áv-ô\]m O6¶~ý #X‹¸zÅØÎ€5ØéŒy)Xî9Ö®·2ƒßÕð˜yqŽŸMZ¯äÉíÑ¡0«­ù† S‡¤[6ÑjYŽNZ¯å¡Ðo¢ °â~)>šxµ(ÇO'­W¼O ­ïr½ ÞÝ‘`+\NFÔQÅô9ÖVÒc=gž`ÉMŠ©"¿Y¨Úü2ðR îp5¿ÄN‹Mj·ð{Q·§u5Æõ6êÙ8´/¨cP™Mìí`ÆH¬ï}šÆ‡&$N6g¾»+ZÚoÏå6À:XDÈ1¨±R}?YíV°ìÙq“€UyRóXKÜë °rUÂŽE9%‚ù«énëóž_¹¿…ÝwI¿wµ®•ÛßUs¾Æ«ßèƒEÌ;.%Å´gþÌž·«qïiý .ï¹}ƒzXmÆXО¬€…}+<“”`íêV°îÔ" lñTR`Oï¨ñ%û‚:u'Xíâ:süLRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›Ó æW3/ƒ›×:,ÁI1ÝÖ‚¤ôeù;ÁœÓ©üöFžÅõ‚óõ˜Æß¡7ÌÔý>ÍKeRLçÀ²7òw%óÍ®hqW<‡kËgä–Ƥ˜Î5Ì—ÅÛskîBÔù –[Ë1–Þ¤˜®kz¯Vø ÁÒšÓ9°L¬Ì¡Ð,î†!X“b:–¼[¦’Á{¸ñgVƒwc®¿ì©àŽ’b: ÖÕæ –ܤ˜–BÇï«t±…ªŠésü~°J—‡©ª˜>Ç«ÕN÷ÖÆKCÅô9&X­vº·6&X*¦Ï1ÁjµÓ½µñëÁJÏ7(­˜>ǯ+^¬·'Å$Ì<Á’›“0óKnRL—åç¡ðíI1]—ß‚woÚ‰þÐH°'Åt¿ù½›vâÇê,ÁI1]™¾igH®ìÛ¾ig X:’bº.¿‰oÚÉÜ–S¾igä¡PCRL—‚5x¤r·åÔÜ´C°'Åteþ¬éÍ"XñÚÇ+(w?I1] –É€µ{ÓNéÛ$¾çý´q_`™ù¦a9x¯¼i‡` NŠéZ°N›'Xr“bº2?ÁzuRL—‚UzVªìŠ)lãÞÀ*=ÝYvŶ1Á"XïIЉ`ilc‚e'6’]1…mL°Øc½')&‚¥±{«tº¡úœÁœ“0óKnRLÂÌ,¹I153_5©.ÁœS;óÙY‘%TLa¬ÝEz–k‚/¹Èæ–¤w”ÓÓæ°Œ»ðw™óXyô|ºÜý$ÅÔÔ¼IP1ˉxL8\γœOzopGI1=k>ˆgyÃ…Šr÷“ÓƒægOçÁ¦÷,Xþt*{,QI157Uó== °Â×G‚%*)¦öæDöfŠÕ¡ÐâÄÁ»¸¤˜4ÿ»«'¼ÛÛX¡¢Üý$Å$ÌüIõ9&X…Eñâ?‚%8)¦çÌŸ¿§GD¹ûIŠéA°N_(¢Üý$Åô˜yC°”%Åôœy‚¥,)&‚¥± ÁzORLKc¬-°xºAWRLÂÌ?‘TŸc‚Õ*®3Ç«U\gŽ V«¸Î¬°ˆÿê¼q] ÁœÓ`M?e¯ä#X‚“bºßüúfœ0ÝÁÒ”SóéÈ~º/ u%Åt¿ùÌÍ8Å –घn7Ÿ»‡`iLŠ©X&w(äà][RL÷›_ÝŒ³ñÔ‚%8)&aæ –Ü¤˜„™'Xr“bºÝ|þê˜mí$H>»ãx;Ë*8¬Ã·E°ÝVîz¾meš©LÄNó–Ó›Üö3¯k·E° +A¦*i Y X‹O¯I¿H°‰+Ó[ÀóHlg©Ýݽm.ÁjÖé¤5é³c¬ÍÁD°Ve&‚E°*ã0ÝÖNZ•ÞÝ6Ž Ö[*¦Ï1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™cá`}~ZmâóÉä÷o¾²bú‹ËþO°˜ô°~—뿆Ñþ³ùæÛ*¦Ï±x°¦C¡%Ç!æ;§Â›µ}—ªŠés,¬)&bÈ¿tÐ-ÁÊ8¯6O°ä&­Ö6X¤¤Ÿâ¡°ß¤Õ*‚eÿ[ §ÿx(ì8iµXaœ>„—CüætJ‚ƒw&Å$Ì<Á’›“0óKnRLÂÌ,¹I1 3O°ä&Å$Ì<Á’›ÓéüîyØÑӦʊ½m§/Ž˜ì'ë”ê¸'°âE òZ`ùIï23ýˆqü>°~Sâ ÓCªGû³ŸÕÒø‡[/À2ó´9v¦¦q³'hX±©Or»ò³?”Ï„ÅÅI VáM ÈôÓ`'N] MV2Ý—Ÿ,×É=R1»ÖTü´G¼ß”`eÁ&,¦nÊÌ$ùÆ0î÷ –ýühq4FX®ÿt½•·éŠ•Gp‚Uа’Y-#°|o´<Ƴ‹o?¶eÅLX 3Nê ÙÆïË8°’ËÌ`ez,¡`ÅýR|(4ñê«“¬Â›aðÍÃÍjixñð<¼ÛQðÁ»; ¬Æ`aæ}_&ºb Û¸{°ðÙúKpRL Xéd /3“6,Nf—?Ýdž‡ÂÛ [°ÇÑšU;^GVïé¡}Ùtœ± 럠ÉCñe´"ik|¹­Õ§·Œ]V.ýŽÜPß8þwö% É,ö \~`¬û²·“ϵù2^áÂoƽޫòää`- ØÚ—¨™†5&ç6qXë?hº¬ìïl± E Væ÷¸¼/éw¼Š›;°/°cP z,¤e¥÷X…¤…¸ãr\Ÿ=VŶ–Ÿ–=ÆÊ$}XÆXûÛZ|ºÍ·ÂÃ5Ï$}XÍ¿¦CÇ—™!æÆ¶ö?}=XGTJ …ÜÖ¥*%ÅtùN_Z1ùÁ%Å$Ì<Á’›œÿ;-¾uæ¿î§o­ùï:x;Õw™ôûM2ç>¨¿_Ö×-¶QY‚•P ‚…Vì[X]ç]¬‚ÀüQwðµÃ÷·üûÆà÷N`Ã}fðŸœ?ãצۙ>3má;}ÆuŽví8oá;Ìkã-8‹v3þ3ßÈûÕå&Xyë;5ÅÇýä?ç;ö3¶·°DŸñ[°ˆMkçnå› ¿ÃŒ¡3ò¶j·àŒÍ¶¶[ÊM°ò:Ö×õ7ÃÜä1X®« Í;dÀšº&׫ +°â1XÑ–[ýN›\€5 óûK>Xa •Ë7÷¬øPèš¼–Û ÖÊâœ%Zqu¹ V^hþoºÈƒõ- ‡ø3°¦÷]µ@'+{(6Àâà]4Xa(:;¬NsQ «ÓÁû¢Ç Co78šGæÑÐ>+Z›Éòvï¿©ßÖaóËÁû¹¤ñqíÛ]¬x÷X§“,‚Õ ®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°†Õªþi ‚*¦° VÖôSòÈ SØÆ]ƒeÜ#üæÇͳ÷Œ ‚%8)¦[Í›Á=¬tŒŸÉC¡Î¤˜î3?uPîñ£a€é]I;iãžÁr%X¯IŠéN°LîPÈÁ»Ö¤˜î3oÌÔc%O’ ‰¿+i'mÜ5Xj*¦Ï1Áj×™ãÎÁrõcOØJ|vÇqí3 Üa¾-‚•è>óþdè±ç,¶X&b§y+Ÿ³ÜB>â˜`Ýeþ4X 2UISÈjÀZ|zµHúE‚è6ó¡…€•é-àŠí¦Oû¸mïmëp™šÆ½¬k…‡+VûH´š Á"X•q˜n4¿70!Xë„ùïèENZ•ÞÝ6Ž Ö[*¦Ï1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠë̱°>ŸbþÏoÝË+¦Ï±t°þ¨ùì€5,&EÁú1“eŠ`1i&®ZT£;ÜÙ>ã¯ûØWÓj –{õΊés,¬ôPhû¯1êÆ&¦ÂÂcø¾Šés,¬!bj –ë¹BõâŠés¬ ,{¸ó`ùˇÂî“V+à"ºò`ñPȤˆìëãŽzIå…vïL +º1ÖÃæ –ܤ˜æ@Ûc=lž`ÉMŠI˜y‚%7)&aæ –Ü¤˜„™'Xr“ÖË>ÙÉNzcç!±ïŒÓ‹n*¦Ï±t°~ `?ëÛo;åÇßlž`ÉM ÉØÙ”ÂJÆøY»ú©˜>ÇòÁŠg} óT:Ôº©˜>ÇJÀ2é$‚‹IÏ‚5ácSX~ßGÅô9––}npò­ptÏggŤ'ÀŠN7¸‡J÷}`1éq°š'Xr“bfž`ÉMZ­#sFP«,|–ªc,ê,ê,ê,ê,ê,ê,êÕƒEQˆjÁš$ìÏü“ŽÜ¤˜„™'Xr“bfž`ÉMŠI˜y‚%7)¦Ü&ìH-¾¢ÔÝF3pëZ@UÓçX+X¿E˘"3ƒµy롪Šés¬,³át‹áèî7üã,€µ}롪Šés¬,{s…¿üÝßpax(ì9)¦ °Ì Ö@°˜Sv;þ>C³Ë˜hdE°:KŠ)· {î>ùVèhs £ë;*¦Ï±Z°¢Ó ®—r)šÁšÞGÅô9Ö VgÓç˜`µŠë̱V°Z^ŠA]!-`=}I…‰`Q·ˆ`Q·ˆ`Q·ˆ`Q·ˆ`Q·ˆ`Q·ˆ`Q·H X”2)ëTþsæŸHªÏñ3I1 3O°ä&Å$Ì<Á’›“0óKnRL7™‡†“ +6 uÓ‰8Üà7ºœß¾¬‚î1}Oi\±– 3¼xËÖü0OÜ(ñŒ¤˜ÎçŸo8œ'NÛcîfI;Q£ï±ÂDð r,$)¦ ò‡ûÂæ›{ƒn‘â{EÒ;Û 3q˜®È¿ž?L:XfkÈ€LQE° º,îDôãáf;]ìÇéf–µ}FŒc1I1]ß?Þ!zžƒØk¾‰mqÛd|g›(Çr’b:Ÿþ~ñƒnðß4°[&E´q`……¹ÀüÓç¸'°Ò“Šª*¦Ïq`í\È]ܱµÅB–Uijp¾§Û¸°þ•‘ɬ®+·ÅR–eÄX§/¨ÑÆ‹`]RcI1,‚U‡é.°fåÞÛQ5X™ãOÕºóί§ÁRVf5{,‚…$$X+#‚E°*ã0,‚U‡é°J§W«kw?a™Í\oÎ÷tw–úŠésL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sü°>ŸÅšÏÇý4ý ¿búKëóYA³ –%‰`õ™´Z?.*Ø(ƒõ’Šés¬,KÎôÓôÏø‰_ÙXn/úÄßÚß{8UÓçX8XîPhqrý×躱ôM¿ñ¹ÇrL…WcxS_Åô9–Ö@F×,&½¬øM¿ñ °ü±SaÅô9Vö¨•í±Â›ÃºÇRZ1}Ž…ƒ5̃ðxðîZÞÝx=™-Ùc½=)¦«òsŒõú¤˜.ËÏëíI1 3O°ä&Å$Ì<Á’›“0óKnRL§ó»‰NâIÙ€YÙ$TLawV¼HÁ?I›Â6~XfzÂõï¹xv’¿yæ[7w–Y€å×N3šxJ9SØÆïËO!é3«C¡IÀšçÉuîÌäM°'Å‚5Øiº “^Æ`c²`ÙÏa’@YSØÆ/ËÍ#¹+šÚ‡˜0Ÿ¯ë–î­ß–q`%=V4Ùx¦Ç"X/IŠ ËÞ£ùŸçáùhxñð<¼Oˆqð®5)&,̼ïËDWLawV˜Éûæî­ßV:KÃÿ"ý½üwV¥mågy b Ûø}`¥óʬž’b"XÛøÕ`ý)ëïe¬Ò„GKYRLÇÁØcõ•ÁÒØÆ‹`½')&,žnè7)&aæŸHªÏ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠëÌ1Áj×™c‚Õ*®3Ç«U\gŽ V«¸Î¬Vq9&X­â:sL°ZÅuæ˜`µŠë̱2°j'—à|…}&ÅT+;E&'Âì9)¦ÒvjÀzIÅô9Ög5—Î& ÿĈq"Ì®“V+ý+ZÌ8q¾B& qÕ"XjÛ¸#°8IÓë“Vë“Ì ½+O°8f·I«å\Ñ<:¤}æÕóÆ9fÇI«µ}Ú ü˜=ñ°ZpŒõú¤ÕªËK¨HÍëíI1 3O°ä&Å$é0rÁ«IDATÌ<Á’›“0óKnÒz™0ÙR˜ Ǭg†{}Åô9–ÖO,Oøvb’T}ÓçXXvŠ¥y&A7'{,&=–›¢r´?G3t,&= –™Á“–âMøÇT–Â÷Q1}Ž¥ƒe'|K¾ŽnÚJöXLz¬ètƒ{¶1~RÔ~*¦Ï±t°š'Xr“bfþö¤¥)£0½¾L¹8LÂÌo¬¾‰ü|¨®ñB°Nš¿¦®AB’®©Ë¹¶y¬kvýé|·®i£+Á"TP-|챺Ñ5mteUÇXwꚺœkÕƒ÷kâ®iYH4./Áº/ø$^_¦\&aæŸHªÏ1Áj×™c‚Õ*®3Ç«U\g޵‚e¿²Ä×g¹/1öÂ-÷Á­/5ª*¦ÏñIíwä:<ÿEunØôk ¦Rþ–1Q®è¬Éæ·eUͤÏñEIX&\à™4¬ÇîJ°ü­;Ó ;£»{Ç9±ˆ±ÇÒžÔØÛþüí4¾Ó†½¬8ƒï±Œs}FhÅôµñIC›ÑÇÝØ»úPèî1 ` ëuI'°Ì ÖëêËßµc`%‡ Xª“úïbf–1ÉZ—‚e¯H¾FNüðŽ`iNjYÞ57¬17 ÞãÓ ®—2fv2º7â°œŠékãgÀŠN7$muËéµëÁñ3I1 3>éÁëtµñmIWWo¼¬c„4½ÂJB™. NªöN8XMi©Ã8 «\í`·X¯E¤¥âx9X•3ÿ6œ‹ˆHÔ&t0Xpc¢p±Çj¯cE|AÅ1V­"r¶Æ/cݼçÉë¦8Fäñ2]œToñ ð2°Ž#„ç±ìÂU#‡©—нÊñ3I1 3O°ä&Å$Ì<Á’›“0óKnRL7™‡NÙ5¬˜šfnN‰/ŽEÆò« {Ìcç‚W,{sJtR<© Ç2’b:Ÿ¾}g¾dLl5oN““Rëy°æ»,æKåƒU¸9%¹Odà¡0‡éŠüë¹-¤ƒµ¾9¥ú$mÜX&Ü×sø¯÷Wl󿔸3b‹IŠé‚üþféè&Z±=Vñæ”ø>QŽå$Åt>ÿü%*üâ +:Ýà¿i`7 ‰hã.À ‹  øHÅô9î ¬ô2’åêÚ¬´&•Õ½L!ó¡ëVA—埮åñÇÅjóOåx¸ÄÔ|‘P9ø/ɱo þʙŕY‡¬ëòÏÍòÏú¤»Cßé¸¹Ó ò \ÿœ'—@•.ý“ØÆ€µh›EÇžÙé­W.IE– J€Ijã.ÀʵPÔmÍk+Z~‹U®¢Ïog€Êv¢L ÏÏ‹`­tM~ޱ-VÅ‚ß V¬ óžÇ"XAÂÌ?‘TŸc‚Õ*®3Ç«U\gŽ V«¸Î¬Vq‡ï&\:#Ö1Ájw!XóÔA+Ã$Ì|»¤îä§=ófÒûŠvŸcßO™Öps‘Iw.Ì1ÁÒP1w¿ŽŸ+!\W]©,Ìñ³I1 3ß0it_}2·‡‰VËrüpRLÂÌ·K÷Kñ¡ÐÄ«E9~:)&aæ‚U¼»"Á"Xý9&X­â® F/qX¿¹{ ×eò×x/(Ymü$X™‹²ð¤Æ_–&¢L'³º|G ”¬6~$iùBÒŠ&Xl' }ªLkœ¶®­¾¤“¬6nœ´¢üÑåЛIsÛ¹íºæmœà»Eê%¥›'…[ _x¿±bP‹2©´%Ç $´ñcIÙcEûÇëê`ޱê’b’ÕÆ$uÁI[ØxRÃo…N²ÚøI°ìÂWýxÒ: —é0N«'ÇÏ$¥(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(ŠºIÿB»n¸uë]IEND®B`‚Bio-Graphics-2.39/t/data/t2/version2.gif000444001750001750 4473112366325116 20027 0ustar00lsteinlstein000000000000GIF87aXËçÿÿÿ{hîðÿð€‹î‚îÿpAiáÿeÿcGÿ[ÿQÿGÿ=ÿ2@àÐÿ(ÿÿp€¿ÿ©©©<³qÿäÄH=‹ÿÿPÿŒØ¿Øÿ õÞ³ÛpÿäµÚ¥ ÿEÿðõÿÿÿ.‹WÿúÍÿÞ­Ò´Œÿýõ怀ÿÿð½·kúšé–zÿi´­Øæ"‹"€€iiiK‚€€€úë×°ÄÞðÿÿÿ¥ÍÿÔÓÓÓÿÿÀËÿÍ…?²""­ÿ/ÿëÍõõÜjZÍ2Í2úúÒàÿÿÜ<‹øøÿÿ z€Ý ÝõÿúkŽ# R-ú€r°àæHÑÌÍ\\ÿ×€€ppÛ‡Îë ²ªÿøÜ_ž d™2Ìÿ[ÿÒieÿÜÜÜpÿzÿ„ÿŽÿ™ÿ£ÿ­ÿÿÿàô¤`·ÿðæŒ‹‹ÎÑÿÿÿÿõî ÿ/OO¼ÿwˆ™ÿfͪ(ÿ2ÿ=ÿGÿQÿ˜û˜šÍ2”ÓææúÁÿÌÿÿÿF‚´Öÿd•íÿïÕàÿêÿîôÿÿÿÿôÿêÿ‡Îúÿà¯î ðøÿ‹EUk/|üÿúúÿÿ‹‹ÿúðð€€ÚpÖÀÀÀÿÖÿÌÿÁºUÓÿ·ÿ­ÿ£Þ¸‡ÿÚ¹ÿ™ÿŽîèªÿ„ÿz¼¥**€ÿÿÿÇ…úðæÿÿÿäáÿ¶ÁŠ+âõõõ,XËþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÖº„`矆0š´çÓ Q‹Vm:µëÕ¯aËn={´mÖ·cÓÞ»6îß±K÷æ ÜwðâÆ“?Î|öråã#>½zóçЭg¿N»vìÃ]þJ¿þûøíÞÓ£Ç^^}ûõïãŸ/ßü÷úîç‡×oß=þõüé €÷µZÜ7à 2¸à|ö߃ÒGa~ÈEˆ¡H^‡*∥¥„ ‚&Èa… îÇâ‹0z8aŒ$Ô"5n(â:î–£Œìñd‰'!(‘=þ¨¤’ 2‰£KBÙ¤”OÒ8¥•Uö¥‰*¶v"A_°Ä‰H@¦–X¦9¤jŽè$šm^ çšÆ© IR™$—(T&’(š ‘cª¨'o"z¨›‹ÊIç£.šhƒV8é‚-ýÙ¥ …©bŸsF‰çŒ¡nYiž£Z˜*¦§’i–þ¯î¹’¦`~Ù©™]âZ*¬—fØ*¥«Þ¹+ªÃBÚëŠÅ2,y( ê禹Þj$¡Hþ ¡µ¾.ëê±Ûb[g²Žr¤¶ª‚[`³'vF¦ Ô~ên™ÞîH®‹æ«±ñŽ[¯¢ó²&.«ýêf jœú›ïµ;wp¶ûÛ0 {¯Ã‡»ð¬ëf¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4wlRÍ8ç¬óÎ<÷ìóÏ@-ôÐ?ßÀ-H'­ôÒL7íôÓPG-õÔTWmõÕXg­õÖ\wíõ×`‡-öØd—m6ÙeŽ„àÙl·íöÛpÇ-÷Üt×m÷Ýx/¶þHkçí÷߀.øà„n8Ý{‡Ô÷áŒ7îøãG.ùäM'Òâ”g®ùæœwî¹ç–„ù礗nú騧Îuè®úë°Ç.û쌳ÞѸç®ûî¼÷îûïÀmtðÄoüñÈ'¯üò³4 óÐG/ýôÔ¯L.m¾¯ô|õÜwïý÷Ê_Ÿ"ïÚkç:í觯~éiÿŠýÑ—¯Þùë×oÿýµG›êû‚Ëýø  8·öí/EýSÉöÈÀ:ðllÿâ§@óÁïÌ «ÁбÉS LÉ7Hš°ƒ“š àü÷šð…0´ %…@ ŠÐ‚àË¡wÈÉïYþä«àüzHÄ"ñˆ!û¡§‚xC{ý‹aDVù1)>ñ[S¤Ø–0}eBsâŸXEy•±\_”Ø}4F/®±;i´bÅc©6Ò+ŽfÄ#ßh°.‘Xä6H…‘Šz„X"ûXÈù‘‘‹ ¤?I2VÒs<¤'I<ò“y¤<ùš˜R ¦Le 9iIQŠòŽ®Ô$!/9œS6²•¬¤e†H Ov†”Ÿñe›^ IWæò™t^SÅË,¡™H¥-=ÉKc‚’ä’¦3£iÊ`Ró7ÀŒf‰)É.’—攥õÍg¤š¤Œç5ωÍFúšñþ¬¦mxùËq“’Ö¼%&Ó©L1Ú ˜ÐDe0Q9Ï>¡Ò'CµùNÏðs˜(,sIO:Ô\E¥<½©J]^s£«âçE*›m‚æ¢É¢'2Í™Q“:GrŒS;¹)Îpv²¡'è¯ô¹R‘¢F˜•`M;ºTŽâ´[mjæh¨ѤÚôª(m˜6ÙM£êS¤%ýjL› T3™,œå]ŠNÊT¨e½ê[ƒJ×¶^Ò£ˆL”ÆR 2‚5o¬@ìÙkúº¯ì¹êe¡bjqt(«´®SM*ó«Í»DÁʆ°S4,qR GÄâ«8Ú ­-•ÕÆ"ê©{<‚jÀÚÖºöµ®íþàja[ƒ.ÓS´Í­nwûZx=K·¶“ åæ[°¾s´5\]—®$ZŠJ§¹Uäs†+¹âµÒUmx›[Ùn—¶ÁEäl¹K^îZw¼° oˆ¨ 7x©27œ}–׬‹èV5Qö-éÿ.ºåžË±9-zË[[ýá¼þì ÌàôúwÁ{ßf$ý²G•†ZqóËÖzê’×åoçè Æ‚æU» f-‚š;àÖ®˜Ã0†q‹SLàksÆ*@>EÊUÒLsÇÜìñ3=™á¶­˜T-(²Ól\RµÎ¾71çHœ!ìBQ¯ßm°w»›`ÒâŠÆ`>o–#\X)ÛÊXTrþå|bš.ÖÌšC³ˆ¬ìÈ2ÓxËÆèoÁœb1·ËBR³ÙäìaAëÍ›tsiáœ9B‡‡Î¡DqŸŒcõÎÇ|Þ­Ÿ¹,aFÑw4´Ò}å'¿™} ®²‰-à”I–cz®,Ïû±N3Q‘žõr@“cÚAz ­FÙ«7k\ùŒÖÍl落k‹)š×9l¬ÛlÖºbõ¬1 T«Ím+¶Ûxeµ\9JÖ`/ÀãŽë·åú묦Üå¾—¨ãFjkÏÔ­ñŽåª¬nSwûÞšw{S]Nx÷ûànm7¶ ÎðkwÚqõþ÷Âïšo´N[Ü»Î8¹!ëiÀEÜáv]ã\þ%g7\ãxÇÿöñ‘ƒüå¹Â þûG§0ÁCîo›oÜ3çù³Q~ò@¯Üo-¯øÐÎî}?¶èKOùz“‡n¢SÜÚ º·™nõ®wHÛ©•z¾\žu§W½ç^:Ôñu®» Þ¶ÏÕ>÷µ_äx‡9\nv¹§ýŒdW:Ûó~ó·ó=îa·»È_÷»¿¼ðb¿žÖcŽöÊG~ðÿ»?ÏÉï=ócg¼æÅÅyÅ[þðç·é•øxч¾í—w¼¾ŸÝØ“Þõt_<ìWùÙ§þé g=äy¿yÜÞø›÷¼½?¯{Â#ÿö»~ï-ÞDjK¿øÑ¾ì þ¿}Û»Oùy§¼ð¹?z÷=ßüÙ§>JL~}è;?ý¹?}÷‰Ozðëþô}þÇÿþÞþ¥×~ú×zÞÇÓW€€çw@ø'€ ø~ûw|×w‰ç€JÕ€å÷€Øt8„ò§zógh‚èçÃ*‚î1‚À×|Xƒ(˜‚¾Gβ!0hƒòwƒ'(„:„F(yEâ.Ʀ)íò%K-!x&KdòRˆq¨}DHC˜…ä7vè’.ºÒ)œâ,í¢+¸"-Ðò,ž2†Õ2ƒ^ˆ€Cx„X‡*8Lè’?X†Jx†s+£Á„Nè‚Xh€wxþ9¸‚‡èOh4z˜ )â)j膃-oȆm82Ø…þW‚4¨…q˜ˆx˜„ø>’¸.mH†î2‰™ˆ†Ó‰—èw¡¸ˆ«$‡E؉Ÿ¨~|ã_?¸„¤q‰gè‹ê2ˆ¨X( r…$˜‹¶¨ˆ[¨ÍˆˆMG{ž‹÷@¸ŒÅІøŒnÑAȵhâÈ…¢;¸~·uvXŽÙH‡ž8‹î˜X ȉ8ÈŽ´h*ö8‡ØSõHŽð¨ŒçØ ˆŽ_ˆ„ÒXgøÈ0ÕKUÕd¥ÖŒ8ã˜ïw¿wv¸èNÆTÑ´PµG‘æh‘”E’Ùˆ)‹ñ÷^TER`S þl&)*"y‘íß÷I|Î4MåNÂQ*y“éŒyÚø:© (MÙS¾áS1énóx’5Y’UI“ј’ØuR…OQÙK]‰“Û(di¹$ÿ¸ù4d%;EM ¹“3©Wi•uÉ+ºhìçu§Ô“Af\‚ÉM>ii9’Yi—y™XNµ”†y—ºv”ñX–E‰–Ù$k™”üx™zY™›9™D©” ù˜c¦yšbµ&0F•µ„šÐÅ”CZ ⚯əµ˜§å˜2©y¦¾ù›ÀœÂ9œÄYœ©ù0v æ-PœÎ)œ IÍ¥Ó©ÍùœØ Çþi–”šÉ§›¬Ù½™äYžÀùU FCË9Uæiœ/%Zª)ZìٞùÝù™‰i)™I~ãIŸþéœð šÍõŸÁIQ47›ÚD çy˜i›¹9š»i„ý© jŸH9×Y¡°I#ª ŠŸÜéõž÷wJ¡þù¡·¨œ(ª*J *ÊŒg ¢É•!Ù~'Ú¢ä9£F‰1úŸÑ)~=¤)Ê Œ¹# ¡á)¢\E›Pz_D¥²Iš#B¥Š›…è¤û³ŸHª` Y£©™+ª¥˜â¥º¥ ¹¦ešŸ·é¦Š£t §j*f ‡ž9¦’¹¤rú¢wª‘\z¡yJ£þƒú£¨W}u¢6¨›—ša]6ù§Cɦ9ɤ%*¦ˆ¹§c'VA)–™ú¥‘ ª˜I¢Š©‘J§­_ñÅSöN…©•dJ¨iz¦¤*tŒª§¢j÷TQ@VE…«³Š§·*)h*©cY¨hQª„O÷ET–i¬9ŠªÿÕ§VjªX©©V¢R©ÁRÒ¹OÏ*­€J©]Z«[—«oj­@⬫ѫ­“>z®ÈŠ—±:®–Zªñ «Ø £NI˜Þ$QV† ­sŠ®jI®D*®ßJ°Ÿ:¬k§àz]Ë| Û ®m:±I ‰¨Éˆ±`:¯úŠ¥"{_û´ª±1²ÈµŽ›uš¡zþ²(û²®‰#Åú°ÇʰEÊ£-ºRVUó©¡C‚šêqšMŠJ8[´æiK£Z¯¶Š°¦Qe´J˜Cz\£e¤ô,ÛE@{²PÛµØÙUÒÆ±ÂÊ´ÀZ±DëµWûª."M9Û\;~ö…¶rKœ)ë3ë±-k¶Ñ4·GkEVÛžSk±²:Ë·F;Z¾±Ë§¤Šª$…k¸ º-Û£«£+·§”´Ô¡÷ª˜ )“{¹ÛJ¡ûµ•;z¥{¹€;ºôq·K±4;U0+²~‹²§³›»¶%®k³òš¯‹¼Û¸ÄK¯›;´Ã{ŸÉë»øj®Ö»ª¦´å¬‚«¼Åþ›°¯{»Î›¸Ò{°Ë+¼× ¾ ‹·}I¾ú©¸á'±Ö»¾‚ʼ K¶ƒ+sè[Në¾§¾˾⛀óŽæ«½Ô;©ß›¿öKý[Mû¹¼¿ \¶ÐË,̸㛽¿KÁÍ[À|¨ê¯œ·,Àñû¿Ï+ÂÜ{¼—jÁå‹Â°‹¿!¬¿ ̧b[½í ¿ÜÁ)lÃ* ¼)Ô»4|­Û{à ÜÂ3üÁìÁÃ,Ä=œÀ$ Ä/Ì£ؽê‹ÃœÄìÄØ;ÄK<­1 Â.ü¾D­V¬Ä* ÀweÄa|Áz Æ]\ÃAÌÆ0¼Á#<Æq,Å›ÅSÜÄkì(Áºj¬PyœÁþi<°\ŃìÅ`¸ÇdüÅ'LÇ|Ɔ\È÷{£%Ñ’ƒ©_ùS™Ë¯<6QÍ„´+ É>À5KÅž«ÃĺÇòôRâÔO.“<õ‘?åÇ)— UÊrÜÈ·ü¶Œ¬Ë¤,³ˆÌPRkT/éÊR̲ì®|<¶xŒÅ¹¬ÌŽüÉ»¬Å$–>¦Ê°¬_iU­¼Y€|Ä ÜÍÏʽ,Îò{>¹cÚa¥1MYµsyÌhìÍÌÍ2ÜÆälÇkÎdùÔɯÚSAùM„YËäɉÎàÜÌõ¼Ìb,Ê%ű\¿öÜÐl¯ôÌÅóümU üȨnŒÐ¸üÑ­ﺴ»qþÒ§ÒáÂÒÅ£¢“¢ÒŽ Í„ÉÍŒ.­%ÕÄêìÌíÀ;WC}¥0]Ó~jÔ ]K6Ò8 ÌCXÔÒÓ)á®A OÕ­ÕPí¯^ÍÕ_ÕW=Ö[MÖ]ÝÓ`ÖfÖeÍÑl}Ök­ÖmÝÕo]×r ×s×zm×q½Ö|×wý×€Ý׃]؆-؈ͩ>}Ӈ؄½×íØ‡ØhýØ’ ÙA}ÙšMÙb=Ù–ÙœíÙ¢=Ú›íס٤]Ù©ýÙÔiÒ'kÙ¥½ÚyÛ¨]Û¶}Ú´}Û¬MÚ¹Û`ÝÛ»½×À-ÛÄ=ÜtíÛÁíÕS…ʺÛÜÎýÜÐÝÒþ=ÝÔ]ÝÖ}ÝØÝÏýËNÝØÈ]Ü¿ýݺ=ÛâmÜ^mÞå­Úã½ÞuÞÉ­ÞîíÝï=ßnÞɽÜUÍØ¶ßì ßöÍÛÿÝß™àæÍßšmàåà°Mà®àyTmS Ô9}ªR­F^¤G %2½(4ÍáMß ]áè˜ááæÌÄ".ÔÂgâ³¹á/Ô òá1^Ç@úÔÊíŒ.Î(ÎÝ MâݼãW&äÌ ã0*ȾԬáâ/~ÏA­ÓóÒãpüãÏøLå„LÒH>ÎÆbÆÜ*)­ —à²,™,dî“f»ŠÒLí²œÅºM•Ý”Ìzœ[Eç¡tækÎ$þz^ÍmÂý–9næOY²bÓþ*â€y/‹ÞÝPY,~™!éOçbéÖìçâ¦é-Uèëèéþ*ê3žèMêO èK»Í#¥&êÔ!uͲÍÈÙÎ<òê½!о!¸nQ«OÞ _¦ñªÑì‹ì©?yé²¼m½îkþÓÈÒìP½èÐ.#´®è¶n¼[<ʬžì>ìaYÍ»ní µ»:îø!íÃ.OjÛê>R;#ïþN@ɹÎî)]æèžUê’ñNEý®ï?rí§^êÓû霼/ýþ“=ëå.épÙï¹þÊ92ï¿þÏÒð õð oî_ð þ’ /”¤¥ñYòBðï9çß<Üí1_é#¿­b¾ïÚáò‡.îó-õè·ôR ˜®ÜñDáìíJôÙ¬ówò9ŸòNOïÿ^éOKÏ¿½ºNЄ®R®zèÕþâbßÕÙ>'‘Žæõè±öRéç†õg?êiÏæVÿžÓ~÷÷=Ï÷³ä÷voìG^÷þ¾ì;ÁÜÁReß$DÕÏsäòøÃü”.Nù>Æöÿ˜øt]êzŸù{~œqžù?ú3ØùÚŠönQÊÊé;ŽùMö婾í}Ìå#û¶¬åJîä¼?gŠ/Ñ =üHLü!}üýÆ'¡âßœûòþ\å»_ÑxŸüoû[þüY®û!ŽüпýÔ¯íSÎËØïÑÚÐÍýãÏý‰ßõþ«Ðs\þïŸþ¾ÿ%lý2îþ£,ÿ­ÿÙoüWüç@à@‚ DXp Á… | ¢D†Z„ˆ‘âEŽ;z¹1dD’K~™òäH“-?N\©Ò%Ë—3iÞ”YSgÈœ8cþ´ 3èÐ=}=ZT¨R¤Fc&„UjÓ§@™^MŠÕ)U[µZͬװdÍŽ­ÊõkÓ³jË¢uÛ6.\­SíÞ«0ïÚ¢rŲ¥û—ï`¿… 6{x/NÅ„Ó:^œ²±`Æx-KE¼”òd£œ3wþý ¹oèÍc=G>-š'éÔª[Kfûò쩬_ËŽŒÛµnعQó¶ ü·o·‡ïŽK[¹ÞâÂ]oN¼4óéÈ¥s†^ݺvîηc_>øõñßgÇî==yÀ죛oÿ}÷äá——§ÿ\ýùýÉûÏGÏ´ÿ6 0¾ü¸+°.û”Ã/Á·Ü{P>4ŒB!¬à %ÌCÓ¤­A mr0±ë:1Â;\QD A{Å+ñ2=$1ÅÎtܰEÿfÜÈK|ÌGy¬Q¼q”‘IÆMÈ¥D Ê'©\ Ë ì,IËn4RE"aärH+{+“Ì0Y³J-‹l“'/ñþ1€Ä²óΆò\ÒΈìÜ PýÞT3Î-×4“PE³L3ÊFåœ3¡<ý\"Aáô!A³š”#JÚt¥M×{ôPCá<óÔ)KÕLU7YÔ.AGå/¯LA½ó*J/èÓ^sí‰ÖJ]eQ‰5öH-‘EuÙXšõÎLTO:½VZ`ù¤Ûly½õW\=i×\«]¨Ú_/UwPX_MVÌTÏl¶Tf MõÙƒ¢ÍV"jÏ àOm±]‚]€/º5Ü~ÅͶ܀û¶àƒÍ]XXeßÅØÔyE3^9¾W_¨øV[r¿ý—`ƒAR7]k®øaOÕ˜dšv×ãD39ãzuþ¦®g û¹ ›ý5¹á£%¶4W¦7¢Øe‘6Ø"ŠkžXf†-žãVé zcŸÃ^lx‘-Úhœo&wé•‘7ê~5e­¡~øß¶³–šßœ…úë²½&Û^³‹E;m\ó$Iï†íž;eÆQ^\rË>yf©ív™[•½%uè+Ç&¼tÄÅýc{?¨qÌMÖWÕS¼ðÔ7ÜôÛñùpÖÚ“[1ìtgÚ}Ç}wÝk_yÛ ýÝ 0ÑöyÒOüzå±ç¹úèÛ¾cê›'¿ûò÷>ü‰¾ÿ»z÷Ïü}íã‡?ßß[訅Zç—_ýçSÅ_þZÀ=é£ÿþ@½n%€?Ÿù8¿n y @.xö/èc ØÄ€#9!þH‘¢.‚þÓRKØB ª°%Ìàw:Ø»ú9ë~4! Y’ª€K(böÐç0‰Ñ›´Œ#A¾9Nr–ÓœçDg:É J6êr‹\Rg<åéN)¾ò#ó\'‚€"ÏПÿè<‹L¿ÄÓ,m’o±P†6Ô¡…hD%:QŠVÔ¢§,¢C7 O‹vÔ£%¤ÛIL~¤ŽágVâ)MqšÔ¥/…éBWù¡`¢2âÛB‰SžöÔ§·He-KÚÐ1’T=-øiR˜Êž´Q¡>]¥NS—Ò&Õª<)‰L9ή­œWkX‰*@r•BHëKƒ:%þ”œû3æÉ™VºR4«D«é°<ˆþÖºö¦QÕhEŒz¾úµ¢wE\acŠØáY󞆅,Pš×‹Åõ©‘ÅìD;Ö7r4³'“bÿÚ¾kNò³ueìS:=Šö´ŸÝ,C+8ÆY¾¢© šk]Š[Ø2&ºµmOy )nêõ˜# hr•ûÏ{z3†Ë…îp‰]ÒúÒŸÑÅn@'[ÜÊú¶´Žµ¬wÁ›Í^ÒnµÆ¯Ž¬ˆÌðbS½ÚäÙy»;Mëº÷»Ìd¯xÛëÌè±ö¾ämfzÉßý ˜Kí'Ø ©’Ô.®Õ,0~! àüÚ»]õ_ƒ•EôFX¿žð{Ë =ùbø5Fd%mjBÞ’ÅP\a-©bþÒV^ǵï üaúš—²&æM*õ'd\úщ…œ±;»E¿È8†r}£,á{ Áþ%LCjÀa‚rÆdÑÈÎWÄ=æñ€G¬Þ³)Èa¼H»ìä/§Ìq¾³“Ý<å4ëxÍj°/¼g×Ù‘3+‘,ÄCÏ.Þ%¡=ŒfúÌ|fó%ÍÚ‚L]!Œ_ŒèaÚr„K]kBCüßJW˜Õ¯>p›Ë7vÒ°¦2®/-e[YÖÇzó|íê^—h½}Îõê4=ëB›³·”Öu«‘½ëdß:ÖË6­5ûìh{Õ~¶´´ÍL¡+w˜ÓÛµ«=mrþïÚ¼ô3ÍÍàJ6Ýìöö¸1tìw¯;Óƒf6wêÍØoû»Ûâ÷Á­ì=l«:Èèžµñ nuK\ܘ&㯮mÐFüâÅþ¸Áámq…Pã7n¶³=žoŒ<äçe¸3Þp”k°vyÉÕ“ðœ÷Ü×4·uÁíî–/çF—ùµžmï›èMGøÓE>ucŸ<èg¼w¿Iîó¡½ëIÿùÒ7ΤOÓΑ–â†Uy6}Sæ_¯øËÿ-oa»\Ã>±¡“÷öv}ëH'v¼û;o uºÓíDe£g+dÊ8ñœÄ©ßåÎr¨Ç<ð$ºñ„b"ñˆ”5ÕèiO·þ˜©¤ÿŸÎ.yÊS}òJ§û“ɾKGË•Ëy¦}ÚÁ,fÜךçq_=Øá.tr[]óg…ó’‡xö>"Rùz?"ï*?|­¿ðÄß·ñW5ÕÏ;Ѥ3£»ÿý[–=òÓï;úƒ|·[8ö›P¨•gS×^'ªãkhd§î½ú­ÿ»L¿Ë›»Á«»0aªós=ü¿¨óºÄ>„Ó>nƒ'é[Àöc=>l»*šÀ¬íÂ@õÓ@ö»¾…«³QTDKtE3tBÄÃ÷ 8Q Æú²ûK5SDAJ”ÅWÔB)DE#|į@,S¢$ FFäE4¼ARœÅ6„?Õ‹1“h¼SZ;5ZÅ"“$`,E_ŒBp,ÆäD ´Å2 ³Hz¾]dÆe\ÂVtDM„Ä)At *=n==c´KþÈLÄGV¬Da¤E¦óAÝÛ£Jâ#"Ê£“øD?¤GE’GqœHr´GI„ÅG‹(ò<&ë½dLjÈ„ŒÅpŒÇ‚4¹ŒìÄÄ;â¿C®™l'—´ÈID›LIbIsìÅDI‰ÄI¡ÔÉ“dÃ0ÌÁoü-,L½¡,Ix$J¨|J0d,TJ›Á_,Êê2IŠTÉMìI¶»H‚C­”Êg¬H Ç×ÀA7œ¾@MNëSxþ Ñ7­G}N~ Ph}×8-ØýÔÐp™quPÿ4S-X`EXmR:}Ö‡eX%Ø~EWpÝX‘Ö¦DÑ‹Ù/õXŒ5ÙÅH€íT”åØWõ×2X’5Øí2T+X7-Ù—MØ­Ó-‹ÕyíX•eÒ¢Ù3Y¶Zí!Z˜EÚ¨=ÚšX—YyYªýY­ÍXˆåM¯eÎMÅÚ¡ÍÚ“Ú­5[®OwmαuÚ²uس¥Ù´ÍÙAýZPlZ:zZº5ÚžMÚ©åÛ¿Å[·Õ[¸mXÁ¥X© \µZa%ÜP¬[°mÕ”E\U[yÜãTܸ½\Ymܹí[ÔÈ[È ]þ™uÖµõYЭ\±eYbý\Ô}]žMÜÎ=T¶eÝ›5ÒÓ}RÛ•ÜØ­ÚÍ=\Ét …9 ã]\À-]¥¥]Õe\¹Õ*Öñ›ã}¦@^ÎMÞìÅÞí]]‰M]¦•Þµñœâiʉ‚™]í ^¨UÞîíZ¿ »´!Þ’‰© ¸©šp‘Ó\9Õ]Ï…Þu`QœP‰œ¤Éþe›ÇQ®éÝ®ÝïÝ] àæÞüuœ~™üe^ñßåàž`ßMa V­ðE=éàn1ûÝßΛê=áÿ=X ^a &`6`úÝàuÁHßñÍœ#&aæÕaËmþâßâÖ|bÇmݽ5áø]ß+¦\àeb¦©*6\.Îa/†]1–_÷eß•ÅÝžbçEcî}Þ(ÞS-¶ÙXíá6.c9Î]<–ÝVá/^ã|å],öcŽÐ?Þc2Æ+0ž‘UÌ*wä¶K¡6:c>¾`LNŒÑ?º¸9ÜKã÷µ2Ú²ÐnìbDfc:¾ZFβ[Ò?Î3ÐÓk¼w‚HP3´ šå>Žã ÓGÄ뤹ġ]Ve´æóàd@>>š?GÎ!¢Ñ;#RuìGb†_¢˜?m?âÈ,®f]eà d)'Wº=ûTHÏCÆg®P1"pòæKÎÓS 5e¾?ïûæPþàH®c‹ÍãŽL>l6g{n>~ôˆVzH µÛ°=‹Az4´›fÔ+d=Xd;ÆYq¿yèuÄ¥t.Ñ‚h€NèÉmT{ö¢Iäf3–dCF‰c~TW.?‚†4ü‹Òš¬å"2´.Êe(Öd>¥¡WÒè‚vªsõ^TdEb‹Nä{’HŽÆç•~ãˆþé¦viâ ç9&³ß©¨¦êbîg°®`¤î’ÌEærz±|B.ªú¢žnkØTi²®×¬¬'[j®åbP~ʹæktz¾ ÎêC&"K ìÂ6l12ìĶÄVìÆVìM²§þ'ǦìÂÞ¨¥½§ÊÖìÍæìÄÞ²ÅsÇþèlÍfJÛ»©EM§ÜíÑfíÖvmʆ¼Šæç±lØ6¡Ê.¢×^ì‘r‰XÖí¢ÂìÚÖíávlTCÇû#n˾k¿~.uš¤ä†îè>ì\Úd³~TܾmÛÖ ßfJâîIÕgÑ”îè†dñnè~«°^Ãrïöîô^äÀžèßÂîíÖnúímÍïm–k÷&néú"òvbÎ]mÿ6pÎN$’Äj¦Nåì.noìÜ~m£¦ï 7i¥ÆïwmïHi®+p ñÇæï¥žíLžìûq·ï ×o ßêþñÑæðOîÒnYt]ñq†Zë G]k[ÍÊÂ(r…‹¾Æþ'UÃ×£Öq%‡r[5f ¿Û––è¤îæ¿jq–@*Gò-žjan_¯ÖrŠlÇrš¸…X(.]ó”xó*Šs™xó‡¸ݸóBY¨‹¨ó™Èós8¾gA_MùÎq:ψ7ŸsésXsP\ôŠhôŒsĈôw¶òªnp–n[V.J€>_ó=†*õQg S/‰QsR?õI§†ZV/õPouRo(ˆPõ†jˆ6Sõ% u’`õ^ÿsZu‡¨ôa/ödWv@sN/óð¦bCwÝ‘uQtTŸõ`çvøóDßö_ÿõ^7 Zv[ïöc¯õŽÈóIg÷uWt•þÀõr?õuu]çs]Ÿ÷:_vhô@ÿê,¯v4çr}çw_oôGuooøU—uIGø†/us‡ø=÷÷‡oxv§ø„wˆ÷·x†hu{×xVötOô‰GyWWy'ó€?å-_/Šl_y6Ï÷;ÿög¯x‰—ˆ’ÿõa'yrÏx†usïøŽÿx‘ù¤¯ub'÷Ÿ?y÷ù|z£Çv€‡g‚wc2›g QÏù‘OúžGx_çóqo÷`7 EGõ¬Gz·§ø~¿÷º7ù¹yeŸwªWx«ŸønÏúZ‡õK÷iBGü—ö°÷ôƘ{¬·s\ùµ§û•wu`·uXŸuT?zþ¬Ç|a÷w¨WwgÏ|¿§÷Ñ/ý¿õÕOøÁ¯ûËÏg±>|vp6x­ŽÚ½ŸöÜuŽ`x²MËÄŸù+— ˜&Ô¡×|0ÏŒÞ÷ˆßÛà§ý1&ën|Íù®_|B~°ýŠÑÙÏ~å~™—~šãë]±î;–}j®}îÿèÜê‡þíoÿ¯—jøÇtÅ·ýg¯,HÐ`A„ &Øð Ã…%Bœ‘âÃŒ7^´è±âGAŠ ÉqdI’'U¢¤ÈÒd˘0?¾¬™òæÊ‡6sò”ið'РB‡ Åés§O£3k²lQ³T¨£*eZõjÏ¥H—bMþú³+׬ ·’kU¬ÙªeѲmÖëH¢rçÒMûÕíZ¸1¦tÊÐ/Àyõ.¬Ó.a³†ñ¦\œX¬ã·’'#¦|÷1f­t7sÎ<¶r䳡 tJºôé¨| V úµKØž˶·vèÃŒwó¶=9wïÎÂ7ƒ>;6BÓ-¦NhzàrÔÅqã6î[ôõêÔƒ[Ý]{ðâÃÇÅû»ó¨š.ºùíÇÃÓ¯Ÿýòýù4å_?¯??€c‘7 zöyÇAÏ1÷žG ®ç™Fx ®Uß…„M8]†¿ø!‡ÿçiR­÷Þs¥-XkñG¡ˆÆá‹!hã†þ.vHÖ‡ b8£„é­x"‹§­HÚT&Ò¸£…@ÂxãPþ—£†5FI¥f=’‡£•U2¹–……Ù¤”ýuiæ—G)æšji¹å•m‚)§šiþFçvb7æœzÒægŸN*öæx\zt©¶(£:ú(¤êÅ©’û‰E)¦§íy$£…eŠé¡– ªã¨K–ê!¡Âz*ÎÔ‚%±Ê:+­µÚz+®´¶(¨KQzi®ÁÎ ˜{Jä¨O° +ì®e¶êgÐþɪ›©v¶ª³M®ݲÝz{k‹¿¾˜`¤)û­­Ä"»˜£Š¢ ®´øñ‰(µ¤f ™µ×ƯB¾ûï²ÆÞ[çþ^¬«jÈýÇèÁÃò[¯—ç)1Sùr†í¼¢n[ZÃëúðuç6L¬ÂΊ|p³Œ&ÅjáY±ÅuíÛ²Âæ1Ζ¤ü²§8“L¯É>ƒ¬ò´+³9tÌ2›j4™žœó¿;ëÙ³Ç?‹tÕC¿\4Ñ%w´¾K}õ«Ÿš}¶¤L:ÚlrÛ«ýöØs³l7Ì`…ñÖòö 2ד-8ÞdÖ]wàÐê-ߊ®Ít?î·ã€S9æÏf®Óâ{Ï\¸×„#ºÖ¥oNzæ£}xçå‰=¹å±n:è«Ã~ºí´³Þ:P§~{í¿iå¸Ïþ»ìÃ7Æ{ïŸþ¼êÇ+ùðÑGküô’+Î<õšg/½ÊÖCþýõä‹ß=ÏÀ¿;÷A&oýùɯ/ºúèO]ÿûíO‰?öóë=ßÀþÙbúÛŸÿ§@ìÁäó¡wÀ'5pæs` ˜@ rp‚îë`XÀê P„4!'è;Zðy't!KBöµo…á“![˜¾Ò‡Û;  wA±ˆ(²™‰tf£9ʳ•²Df1í¸LDzò˜¥œ&8!ùÌ]†²—‚ä+­9Pf“ŒÛ¤%7oÉK_2“œkú£(ÅIÍÖͱ ™Œå;½ùImfÒŸœœg8¡©Kiês¡ å™;’ÎÄ=ô›Ž´çŽð‰Q\³†Á&êzÊ‹Ò3£æ©BýQCnÔh5å/Q9Î’²ÊƒA´hJcJR‡¢´ž4uéJ&S†æÔþ§<-ªIa Qæ-êAC* t檗Vô¨3µ*QÚÓ©M0EOÕ”ƒ’tDŽ4ŸH­éIÏŠP0¶/:$‚j‘ŒäU¥â´¥åüé]«ZVÑéo5íaM¢à Uªn«†]«YµªÖ Я•zERä—´^µ°{Í*f9:ÔÔµu"o…ÏE”£Êfö²zÍëNMkÙPrd“eQ`×3UÒV§‰­+^ÇEÛêµ6a¯¤$5[ºj6µ‹Õ-qk×qÕpË5ao[\é*7·Ðmî­ë¤è>w»»µmwÕÛ¸‘·¼æ=/zÓ«Þõ²·½î}/|ã+ßùÒ·¾ëêÜÓ ¦ßýò·¿þþý/€,à¸À>0‚uÆ»ü&¸Á~0„#,á S¸ÂÎZë|á s¸Ãþ0ˆC,âý Fo1ŠS¬â³¸Å.~W‰ÁvâÓ¸Æ6¾1ŽsÜß'mÆ:þ1ƒ,ä!§˜Ç1ó1‘“¬ä%3¹Éú5²Åìä)S¹ÊVV2”óeß-s¹Ë^þ2˜Ã,æ1“¹Ìê #Kµ+ÞïV¼jîw÷ɽ›N·Ív.-j©›çð»3®bï\Û{²·§½§Ÿ…§gB'×̓6´j{]4“¥©,rU’ÒöT•LöŠu~3r iG¯Ñ”KŠš3ö˜Ëjäú`©G-èꊭþ6µþóY¾(¸—võ\_‡ç@;©›ô¬Y{jžÀ¶Ó²uª‚\ :»´Ð¶õ±I-éí&z'q,I¢Ýg§ùÚ´Ž5¶-ëb×´Û7Ì[1_“›ÕL6±ÍÍXkŸ{Ûâu7EJ|i¨N[]ét½Ëî~ãÛØêþt­ºìdù6QMî¼’ÕP{ß·^7ÄÑ]í·{âŠæ3x²Ýðt/Úá-/y®=lÏ\ß¡~8ÃÎX€ÄÌ>ÿ9Ѓ.ô¡ æÊŽ9a¤|å¥3½éþ•šw;:g`9½êV¿:‰Žk&ë^ÿ:Ø»õ5KyfQzØÓ®ö*Î4þùSÖ.÷¹;½í)g+×ÙF÷½óÝÉv—Þ§Þõ¾¾ð@þ;ωt½¾ñŽ1âaJÞè–¿<æ3¯ùÍw*äáã¹Vø½gPCå¥'}ÔŸw¡â|ôw}Íc{÷î.#ùÈU®ó›¿<÷­ßºàË-rëÞæ§/~ÎÏmÛ¯ ~‘'þï/Åqت5š–öh]núÄGæ«W8ö4E{Þóg9ÔW’ÍVm®Øú¾÷Ðw?s™¯='ý>Oõø?0^Wÿ¯¾¶8¯0òÍÞÊIÜâ±Þ†ˆÛ` Ög ŸÞËom аÿÁ„ÍêIÞöIèϨüÖN då_êþA Æ! ûQ`‚Œ[òÉÞÂߤ ø™à ªß¶\ ’ œªU_Dˆ–‘dîžþÁàòÉ`víೕˆSýÄóaàëUEkP_úÕ_Ü¡òé`÷à÷%¡É¤ Â[º,ʦ¡õ á‘XßcA¡ázGR”Ý„Õi¡ jö•aǽ _É_èùIöåξßþa"~ž z ÜÄMÀAJvYÏ•ËÂdÞŸ!rbí!á&¾H )–¢)žâ)¦Ì(¢")>aó­"+Æ¢,΢)Û,ºbÏ…˜´…TÞ›šGò"nÀ"-¢¢*Ê"."t#36#þØ"2Ú9Ø.b– 'VG0Zcw£3>cÀE#6zã7–c+öÜ-J£.†â/ [Æà²#ý™c+B 2r=æã3>Ê-’ˆ?ŠUÚ ?NcƒU#ø "¶clãAJc>c,&㞣>2#4F¤:‚˜A–O6^GN Cr¤(>d8bä8V¤9^$+J¤»h¤<^c'&"0>¢v#I¢£Iv"E¢d:šKOA&ØF’U/*"Ë"(žÜÞ¤Oæ¤.#O:£JcF~ØPæa¾µ ¶-URzÏ„”×$ºÍ8rÙ%Rb&bÞK¥Ìm%WѤ0!6Ê$÷©å\"$ Êþ™Ù­eVê![2¢GÊ¥ðÑåBº%7Ú¥*¤/úe\Âeû!e<*å;.fd6&c&¤bÆ$^Rž^òáQ"¦Qbæd>eîa6äe&&LZæzÞ^¶fF…$Q¦d¦f#º&kr¦V_^º#mþ¥gnfg†æÝ}$–¦HþfZÊ&ežæp*§j:bWÞÞÞ¥p&súæuÖef¶Îg>§mæ&nzge6'r¢Jt6`"`zv'yV§vºgqžçüõæ{Ò'h®&x§}Ò¡qÆæxbç~¶'~ò%uèLʧ2Žfmþçlöå€.hv&‚B¢`ªgyZh„¢¦ƒn¨nj&oVè þ‚(p.§~¨sjc^Î+­Ä$­“,…èwhxBèƒZg‰J(?­Ò̬¨D]“&±ÒˆŠg†²'€Šhr2h|vN:í(I(µh}rèŒ.bê§”Þ¦ ÒE Ó1½ÓAqé@5é–riAu©‹V’AaRaN©•žh‘ºi”Âi’*©ŽÔD-©““ú¨@“@½Ò’šf~ªŒ¶)’j¨œòg5nR1QR&ù)zēʓŸJ*&Yªbi•’è•*~*i.ê2¹è1=ª75ê¤VD¥öé0ê@½%§ŠjÒ*•Úª¡f):ÝRžžj7õª£î©1ê¥Þ)-É*¨Þjþ¢iƒÆh­reŽò(˜bS7Åj—®êCpžFêDY« j²æj¸zª³*k[NhMÖ±nê¸ i§Š&q"ꡊGŠÆ ˜çé³²)¹ò«»Ýczåz‚¡‘f¹Š+¸&lü¡+²âê},†¾k¨îk¾jlb¥¿ (ÄÂhÆÚ¨Ãþk‡r§¾fEXíbÂ'¼ì‘V,dÞ¨˜\¬àá^pÅUÆé¼¾iÇ6kÎ>,´_Ä>ŪeÚ‚ d‘Ü Z X¥F@rм²ìÏl¿Î*Ô~bÀJ'Ûˆ¢-Ö²al%´-¡ B–̶ìÆìÔN¬¹:mµ0ìšö\`U\E”¬ÑŠþ FD o¹ Ž,ž-Ϊ-z^èÚVíß& VÜfÒíB×á®®ÙîlÊÞ¬Íê*Û~«¢`­?6aÿih¡ŸI8›âmßJ¬Çò­ÎJ­äÒëå⫯íªjDÕkýU!FVÒn­lÝîÓRîãúíʶ+ÚzŸÏr¬Ûv&*lÚšnå2ïïºì Ô«g°äà¦òîíêêmÔ ïéž«àÎçS`"èù–¯ù’ï@ €ú®/û¶¯û"^4 î]/Ïúnïo–´.»¾J®Æùþ¯¤ïû°ûÆïÁÌ/Åroê*pýZî÷&h¥õï@ðù 0_0üz†üNgöþš¨ý¯ó*êSh_ôoTP°ùFcðym°‚./ý‚, £îœî¦Áœ  —¯¯ðû0À ð ±êbo{añFn.âŠÿîp „0ÿ‹ñö~¬Æ.ëŽpºâ0O°÷p³ï¿K_qcqéª1HJoȈ¯?1ŒñkðsðËp/‹p/?oÙrÓpÓ†0ërqÃ2³60"k¯£qãè“­{0þ ìCro²Åºqœe²ÕÆk#O®(.o²èò$r óq$¿2wÀlí/+ï1K2./p û± ßï#cr0 2#¯ñþ-÷q"W²&£l)wò)·í0s/'ó/ƒð4sr÷>3æ¶²53„ÐòXa¬Ë2/39³'›§"Có5 s;£ó.ë²<Ÿ³/{è k³ë²%s367ï;¿¬*Ÿ±)Co?Ãs4w3?²þŠ32ô@ë3 §ó2´B¯ó6ÇóC_²AÓ³37´?‡lç4³1ç2Gô8›3,£4<*ó(«ì>ãsctJgóAã‹íUk>W”^ª4«ôI“ôLÿt9'´:³4N³X´*¥¾¨{ôF{ó=×4!5Ð2¶ž„Rg4U#´L›´S÷ôVƒÉ 騷r,i+™ê阢5Y)H­þÒ2t,ûô<u]Óô?GoŽzS@ÍR2aªªŠéR[’¥¾ª£®«\Ûõ\5^C5Xwuïõ°’Ñ£ÆÓŸ v·ö(a»ª:¶¦&vc‡õT õ]5d×0Øl«_¯v;Áêe—„R6`{kN‹öKKõmçuSëvE«RR¶e¯¶±^«`³ª;7g›ªgC°F»²csõWCwIó®®5@ÁuaCéUŸée‡)rë½Ú2c“öb›vtïösÛ´d'ævßb ´bÇ·WOwTóvQëÍN# HJxƒ¶yÓ·swi;²}Wu@ãñ€—w‚wt·4ä8‡2n?öyv…çvzþ÷v5£·mG4L/²€+¸VxWÁmÒ. rî ÿ7]‹8ƒg8†wøò4Öת_z–×2³C¿¸ŒƒøiøSs†!È[ÅU†3|‡vïø|Ë7‹¯t†Q`Öú d!9‚¸H»3ŒO4DÏxk±ÇcíJ•Kxƒsø’ky³ó–n”Û†½‘ùš›ù…sysKw‹£è‚ý ç† ¼©8)3ùG§ùE×¹ƒë8u/˜‰«!ÆADŽStŒŸùS‡¸“Oº¤ôBËøœ[¸‹+ù‚ƒú¨Ztm“x-oºMp^Þª9¡—ú„³ù†{zž7y¿¨zT¸˜­ ׃G:Ç:¯ka®CÅþã1Y°×,§¿æÓç ;³c]±C¹ŒÅW³O;µÏÝ|%{±W»¶³]°C»È¢9–fû¶ÿس¿ºX'{ ƒ{è;®w{º[z¯Û3…c9cy±Ç´¹ƒï«7©‹÷¥ã9¥‹z¥¸¡×ûÂö;ª|–Ã;½ËzÀú¿ó;K£r—ûxÁ;ü““7G¼†Ë;Àk<­ƒ|Æ;Çÿú¬G6©[Zׂùõ± ‡úÈ:Ä_âÏ|Ýs½©[yHð ƒà¡ö…Ú·®À­¼Û÷ù«Ù[ܼâÓýÜoüìç‚VÂ~"‰ÔsŽqª¼ŠÜŸøeýÆñ¼ºËüѾØW<«O×ÍÛ_Â4:ï£ òÓD„¯2ãÛ>óSü¾cüíoñă}èGWн;ç üÃ7Š^#¼¦ÓÐmÐz’?9ÃÔJçå¯ûÓ¿^Äÿ¸ï@´8`Aƒ&D€!€% >l(1"DŠ-fœ¨þ±âFŽ=v räE“/’Tyñ %—/aÆ„yp$D›7qæÔ‰ódÈ•6{–´¨hQ£e&Uº”iS§O¡F•:•jU«W±fez”kׄ?Q†õ¬PŸe j]jpg[·oËÆõªPm]»wñæÕ»—o_¿ŸÎU(Ölá¸* VJnc¸d!%¼Rpe®Š1gÖ¼™ó]ËŸ‰Ž)P KŒ4NLEjÁІhÑç>)QSAí”SQc$õM[/ÔÔ±YÝ|õTD—cl¹aqíÖ@þýóWXÿ„5ØVu”#g%SVcAýïØý®ÍS×]笶¤fz•@`‰7Ân/U÷¡COUÕUßöW°ä-6ÛpÙ…Mßvû…ðÛÆx-^s]5Ý€ku—_þ”"j1"÷Þ“àuÛP÷e±cn7x`×–ó`DS‰Q‡‘ýw]5MubŒŸmõQ—Sü˜cœAä¹e–¹™äLEµ8Øa3>×g&—ÞYÝDËEu^`ë(æ”›føg­…äÚ_ Ú­‚ŸžZê•Ñ[[×¶µPsW®ÑFS%(R¯ÛV»g½·Ylp‰fÛì®ý¼oà Gœo€ ozÔÅû{'²þe/çñ FsÕ[¤¸ñiÚï½GW<ïÒ%»džzi Ë kÁimU0µ™„íOvh?GJ>ç:Eýká…‡ðó”Rωr*/¶Ö]’xÒÑnŒQâ òw™³ ¡+'ýóâ&>yžVw8û­¤Kvù4ï©ú¬®Géý˜TÓwÀzÙôòÇw<*î|è œËÖh!f-Ó#Põ"76°K‰ùÎïx'¾ÿm0qá³Öø ø£Ç] ‚I”ýL¿ YP+õsŸ =—¤ýý¥# y´= z0„dœ¥šÃçݯ}êºÎüšÂìÝov:œaU¾w'ÂŽx7ìþ {èCÿ…/{¯á´š6Û±0z¹ËÏîh‡E”ÅÀS!‡À)~ŽYìê$HE²dÎ%â\“bÇœ…Ngäû ­˜CóÙqyˆÄ¡!¯XÅG&RŽäëhÇ[©1Ž–ä¤ñæÊKzl”¥ìd&™>Iš’ŠLd+[YÉ:R’ŽœÔä&aùJZŠÒ•žÌå$y KM6r–À4¥,?i>®qE$R,ké5hs˜ª”#+wyÌà,S^IË—³™ÌCbó‘Õ< 8#)ºpz­PÏZ¹H“±¤3˜º¬g9SyÎ_’S›TÜPf¿Ìó™ë´g?zK\ %þ­Æ¸ kaë£C£©Î{²Òœ?ägC§)Ș Tj!ñ\ ºQŸY$¦-ºOÈeNZu«b4¦ÒUb”šùôèJÉS8¶Ó‹G㦰–Iτʔ© ôé…ÕF™ÒdéG›JÀŽB5«Å\êU+BH—¨¨bŒé¶¾"Õ­Ú0¨;íêJÙˆ;»]5D´]¯ 4º€§Ò\+¶¾ÚÖ³*®{Qq£*ÉØÆ Þq°;J^#Æ¿«y}+»â Ù?.ˆ†Íc;™½î&²Nz*[+ëËÆ‚-±™¡èéJ(•ÅþÔª¢mí­—ÇMd:µìj1‹DÏl¶·íZþ>K¦Ëîñ±¼)­†xë´å¬Â+¬-‡ØÎb¥/푚ۛ´/º§®FûÕÌ–q®µ³MïêÞÐ’j´ÜÍnÖÊ»C ¦–¿û «sªž²ï¼@ìë+óKJ©Ø« ž¯ÝÊ`È)”¶ð…1œa o˜Ãöð‡Ab˜Ä%6ñ‰Qœb¯˜Å-vñ‹acϘÆ5¶ñqœcï˜Ç=öñd!™ÈE6ò‘‘œd%/™ÉMvò“¡e)O™ÊU¶ò•±œe-o™Ë]öò—Áf1™Ìe6ó™Ñœf5¯™Ímvó›ág9Ï™Îu¶óñœg=ï™Ï}öóŸè#;Bio-Graphics-2.39/lib000755001750001750 012366325116 14450 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/lib/Bio000755001750001750 012366325116 15161 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/lib/Bio/Graphics.pm000555001750001750 645012366325116 17424 0ustar00lsteinlstein000000000000package Bio::Graphics; use strict; use Bio::Graphics::Panel; our $VERSION = '2.39'; 1; =head1 NAME Bio::Graphics - Generate GD images of Bio::Seq objects =head1 SYNOPSIS # This script generates a PNG picture of a 10K region containing a # set of red features and a set of blue features. Call it like this: # red_and_blue.pl > redblue.png # you can now view the picture with your favorite image application # This script parses a GenBank or EMBL file named on the command # line and produces a PNG rendering of it. Call it like this: # render.pl my_file.embl | display - use strict; use Bio::Graphics; use Bio::SeqFeature::Generic; use Bio::SeqIO; my $file = shift or die "provide a sequence file as the argument"; my $io = Bio::SeqIO->new(-file=>$file) or die "could not create Bio::SeqIO"; my $seq = $io->next_seq or die "could not find a sequence in the file"; my @features = $seq->all_SeqFeatures; # sort features by their primary tags my %sorted_features; for my $f (@features) { my $tag = $f->primary_tag; push @{$sorted_features{$tag}},$f; } my $wholeseq = Bio::SeqFeature::Generic->new(-start=>1,-end=>$seq->length); my $panel = Bio::Graphics::Panel->new( -length => $seq->length, -key_style => 'between', -width => 800, -pad_left => 10, -pad_right => 10, ); $panel->add_track($wholeseq, -glyph => 'arrow', -bump => 0, -double=>1, -tick => 2); $panel->add_track($wholeseq, -glyph => 'generic', -bgcolor => 'blue', -label => 1, ); # general case my @colors = qw(cyan orange blue purple green chartreuse magenta yellow aqua); my $idx = 0; for my $tag (sort keys %sorted_features) { my $features = $sorted_features{$tag}; $panel->add_track($features, -glyph => 'generic', -bgcolor => $colors[$idx++ % @colors], -fgcolor => 'black', -font2color => 'red', -key => "${tag}s", -bump => +1, -height => 8, -label => 1, -description => 1, ); } print $panel->png; exit 0; =head1 DESCRIPTION Please see L for the full interface. Also try the script glyph_help.pl for quick help on glyphs and their options. =head1 SEE ALSO L, L, L, L, L, L, L, L L =head1 FEEDBACK =head2 Mailing Lists User feedback is an integral part of the evolution of this and other Bioperl modules. Send your comments and suggestions preferably to the Bioperl mailing list. Your participation is much appreciated. bioperl-l@bioperl.org - General discussion http://bioperl.org/wiki/Mailing_lists - About the mailing lists =head2 Reporting Bugs Report bugs to the Bioperl bug tracking system to help us keep track of the bugs and their resolution. Bug reports can be submitted via the web: http://bugzilla.open-bio.org/ =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics000755001750001750 012366325116 16721 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/lib/Bio/Graphics/Pictogram.pm000555001750001750 3300212366325116 21362 0ustar00lsteinlstein000000000000# BioPerl module for Bio::Graphics::Pictogram # # Cared for by Shawn Hoon # # Copyright Shawn Hoon # # You may distribute this module under the same terms as perl itself # POD documentation - main docs before the code =head1 NAME Bio::Graphics::Pictogram - generate SVG output of Pictogram display for consensus motifs =head1 SYNOPSIS use Bio::Graphics::Pictogram; use Bio::SeqIO; my $sio = Bio::SeqIO->new(-file=>$ARGV[0],-format=>'fasta'); my @seq; while(my $seq = $sio->next_seq){ push @seq, $seq; } my $picto = Bio::Graphics::Pictogram->new(-width=>"800", -height=>"500", -fontsize=>"60", -plot_bits=>1, -background=>{ 'A'=>0.25, 'C'=>0.18, 'T'=>0.32, 'G'=>0.25}, -color=>{'A'=>'red', 'G'=>'blue', 'C'=>'green', 'T'=>'magenta'}); my $svg = $picto->make_svg(\@seq); print $svg->xmlify."\n"; #Support for Bio::Matrix::PSM::SiteMatrix now included use Bio::Matrix::PSM::IO; my $picto = Bio::Graphics::Pictogram->new(-width=>"800", -height=>"500", -fontsize=>"60", -plot_bits=>1, -background=>{ 'A'=>0.25, 'C'=>0.18, 'T'=>0.32, 'G'=>0.25}, -color=>{'A'=>'red', 'G'=>'blue', 'C'=>'green', 'T'=>'magenta'}); my $psm = $psmIO->next_psm; my $svg = $picto->make_svg($psm); print $svg->xmlify; =head1 DESCRIPTION A module for generating SVG output of Pictogram display for consensus motifs. This method of representation was describe by Burge and colleagues: (Burge, C.B.,Tuschl, T., Sharp, P.A. in The RNA world II, 525-560, CSHL press, 1999) This is a simple module that takes in an array of sequences (assuming equal lengths) and calculates relative base frequencies where the height of each letter reflects the frequency of each nucleotide at a given position. It can also plot the information content at each position scaled by the background frequencies of each nucleotide. It requires the SVG-2.26 or later module by Ronan Oger available at http://www.cpan.org Recommended viewing of the SVG is the plugin available at Adobe: http://www.adobe.com/svg =head1 FEEDBACK =head2 Mailing Lists User feedback is an integral part of the evolution of this and other Bioperl modules. Send your comments and suggestions preferably to one of the Bioperl mailing lists. Your participation is much appreciated. bioperl-l@bioperl.org - General discussion http://bioperl.org/wiki/Mailing_lists - About the mailing lists =head2 Reporting Bugs Report bugs to the Bioperl bug tracking system to help us keep track the bugs and their resolution. Bug reports can be submitted via the web: http://bugzilla.open-bio.org/ =head1 AUTHOR - Shawn Hoon Email shawnh@fugu-sg.org =head1 APPENDIX The rest of the documentation details each of the object methods. Internal methods are usually preceded with a "_". =cut package Bio::Graphics::Pictogram; use strict; use SVG 2.26; use Bio::SeqIO; use base qw(Bio::Root::Root); use constant MAXBITS => 2; =head2 new Title : new Usage : my $picto = Bio::Graphics::Pictogram->new(-width=>"800", -height=>"500", -fontsize=>"60", -plot_bits=>1, -background=>{ 'A'=>0.25, 'C'=>0.18, 'T'=>0.32, 'G'=>0.25}, -color=>{'A'=>'red', 'G'=>'blue', 'C'=>'green', 'T'=>'magenta'}); Function: Constructor for Pictogram Object Returns : L =cut sub new { my ($caller,@args) = @_; my $self = $caller->SUPER::new(@args); my ($width,$height,$fontsize,$color,$background,$bit,$normalize) = $self->_rearrange([qw(WIDTH HEIGHT FONTSIZE COLOR BACKGROUND PLOT_BITS NORMALIZE)],@args); $width||=800; $height||=600; my $svg = SVG->new(width=>$width,height=>$height); $self->svg_obj($svg); $fontsize ||= 80; $self->fontsize($fontsize) if $fontsize; $color = $color || {'T'=>'black','C'=>'blue','G'=>'green','A'=>'red'}; $self->color($color); $background = $background || {'T'=>0.25,'C'=>0.25,'G'=>0.25,'A'=>0.25}; $self->background($background); $self->plot_bits($bit) if $bit; $self->normalize($normalize) if $normalize; return $self; } =head2 make_svg Title : make_svg Usage : $picto->make_svg(); Function: make the SVG object Returns : L Arguments: A fasta file or array ref of L objects or a L =cut sub make_svg { my ($self,$input) = @_; my $fontsize = $self->fontsize; my $size = $fontsize * 0.75; my $width= $size; my $height= $size+40; my $color = $self->color; #starting x coordinate for pictogram my $x = 45+$size/2; my $pos_y = $size * 2; my $bit_y = $pos_y+40; my @pwm; my $bp = 1; #input can be file or array ref of sequences if(ref($input) eq 'ARRAY'){ @pwm = @{$self->_make_pwm($input)}; } elsif(ref($input) && $input->isa("Bio::Matrix::PSM::SiteMatrixI")){ @pwm = $self->_make_pwm_from_site_matrix($input); } else { my $sio = Bio::SeqIO->new(-file=>$input,-format=>"fasta"); my @seq; while (my $seq = $sio->next_seq){ push @seq, $seq; } @pwm = @{$self->_make_pwm(\@seq)}; } my $svg = $self->svg_obj; my $seq_length = scalar(@pwm + 1) * $width + $x + $x; my $seq_grp; #scale the svg if length greater than svg width if($seq_length > $svg->{-document}->{'width'}){ my $ratio = $svg->{-document}->{'width'}/($seq_length); $seq_grp = $svg->group(transform=>"scale($ratio,1)"); } else { $seq_grp= $svg->group(); } #do the drawing, each set is a base position foreach my $set(@pwm){ my ($A,$C,$G,$T,$bits) = @$set; my @array; push @array, ['a',($A)]; push @array, ['g',($G)]; push @array, ['c',($C)]; push @array, ['t',($T)]; @array = sort {$b->[1]<=>$a->[1]}@array; my $count = 1; my $pos_group = $seq_grp->group(id=>"bp $bp"); my $prev_size; my $y_trans; #draw each letter at each position foreach my $letter(@array){ my $scale; if($self->normalize){ $scale = $letter->[1]; } else { $scale = $letter->[1] * ($bits / MAXBITS); } if($count == 1){ if($self->normalize){ $y_trans = 0; } else { $y_trans = (1 - ($bits / MAXBITS)) * $size; } } else { $y_trans += $prev_size; } $pos_group->text('id'=> uc($letter->[0]).$bp,height=>$height, 'width'=>$width,x=>$x,y=>$size, 'transform'=>"translate(0,$y_trans),scale(1,$scale)", 'style'=>{"font-size"=>$fontsize, 'text-anchor'=>'middle', 'font-family'=>'Verdana', 'fill'=>$color->{uc $letter->[0]}})->cdata(uc $letter->[0]) if $scale > 0; $prev_size = $scale * $size; $count++; } #plot the bit if required if($self->plot_bits){ $seq_grp->text('x'=>$x, 'y'=>$bit_y, 'style'=>{"font-size"=>'10', 'text-anchor'=>'middle', 'font-family'=>'Verdana', 'fill'=>'black'})->cdata($bits); } $bp++; $x+=$width; } #plot the tags $seq_grp->text(x=>int($width/2),y=>$bit_y,style=>{"font-size"=>'10','text-anchor'=>'middle','font-family'=>'Verdana','fill'=>'black'})->cdata("Bits:") if $self->plot_bits; $seq_grp->text(x=>int($width/2),y=>$pos_y,style=>{"font-size"=>'10','text-anchor'=>'middle','font-family'=>'Verdana','fill'=>'black'})->cdata("Position:"); #plot the base positions $x = 45+$size/2-int($width/2); foreach my $nbr(1..($bp-1)){ $seq_grp->text(x=>$x+int($width/2),y=>$pos_y,style=>{"font-size"=>'10','text-anchor'=>'left','font-family'=>'Verdana','fill'=>'black'})->cdata($nbr); $x+=$width; } # $seq_grp->transform("scale(2,2)"); return $self->svg_obj($svg); } sub _make_pwm_from_site_matrix{ my ($self,$matrix) = @_; my $bgd = $self->background; my @pwm; my $consensus = $matrix->consensus; foreach my $i(1..length($consensus)){ my %base = $matrix->next_pos; my $bits; $bits+=($base{pA} * log2($base{pA}/$bgd->{'A'})); $bits+=($base{pC} * log2($base{pC}/$bgd->{'C'})); $bits+=($base{pG} * log2($base{pG}/$bgd->{'G'})); $bits+=($base{pT} * log2($base{pT}/$bgd->{'T'})); push @pwm, [$base{pA},$base{pC},$base{pG},$base{pT},abs(sprintf("%.3f",$bits))]; } return @pwm; } sub _make_pwm { my ($self,$input) = @_; my $count = 1; my %hash; my $bgd = $self->background; #sum up the frequencies at each base pair foreach my $seq(@$input){ my $string = $seq->seq; $string = uc $string; my @motif = split('',$string); my $pos = 1; foreach my $t(@motif){ $hash{$pos}{$t}++; $pos++; } $count++; } #calculate relative freq my @pwm; #decrement last count $count--; foreach my $pos(sort{$a<=>$b} keys %hash){ my @array; push @array,($hash{$pos}{'A'}||0)/$count; push @array,($hash{$pos}{'C'}||0)/$count; push @array,($hash{$pos}{'G'}||0)/$count; push @array,($hash{$pos}{'T'}||0)/$count; #calculate bits # relative entropy (RelEnt) or Kullback-Liebler distance # relent = sum fk * log2(fk/gk) where fk is frequency of nucleotide k and # gk the background frequency of nucleotide k my $bits; $bits+=(($hash{$pos}{'A'}||0) / $count) * log2((($hash{$pos}{'A'}||0)/$count) / ($bgd->{'A'})); $bits+=(($hash{$pos}{'C'}||0) / $count) * log2((($hash{$pos}{'C'}||0)/$count) / ($bgd->{'C'})); $bits+=(($hash{$pos}{'G'}||0) / $count) * log2((($hash{$pos}{'G'}||0)/$count) / ($bgd->{'G'})); $bits+=(($hash{$pos}{'T'}||0) / $count) * log2((($hash{$pos}{'T'}||0)/$count) / ($bgd->{'T'})); push @array, abs(sprintf("%.3f",$bits)); push @pwm,\@array; } return $self->pwm(\@pwm); } ###various get/sets =head2 fontsize Title : fontsize Usage : $picto->fontsize(); Function: get/set for fontsize Returns : int Arguments: int =cut sub fontsize { my ($self,$obj) = @_; if($obj){ $self->{'_fontsize'} = $obj; } return $self->{'_fontsize'}; } =head2 color Title : color Usage : $picto->color(); Function: get/set for color Returns : a hash reference Arguments: a hash reference =cut sub color { my ($self,$obj) = @_; if($obj){ $self->{'_color'} = $obj; } return $self->{'_color'}; } =head2 svg_obj Title : svg_obj Usage : $picto->svg_obj(); Function: get/set for svg_obj Returns : L Arguments: L =cut sub svg_obj { my ($self,$obj) = @_; if($obj){ $self->{'_svg_obj'} = $obj; } return $self->{'_svg_obj'}; } =head2 plot_bits Title : plot_bits Usage : $picto->plot_bits(); Function: get/set for plot_bits to indicate whether to plot information content at each base position Returns :1/0 Arguments: 1/0 =cut sub plot_bits { my ($self,$obj) = @_; if($obj){ $self->{'_plot_bits'} = $obj; } return $self->{'_plot_bits'}; } =head2 normalize Title : normalize Usage : $picto->normalize($newval) Function: get/set to make all columns the same height. default is to scale height with information content. Returns : value of normalize (a scalar) Args : on set, new value (a scalar or undef, optional) =cut sub normalize{ my $self = shift; return $self->{'normalize'} = shift if @_; return $self->{'normalize'}; } =head2 background Title : background Usage : $picto->background(); Function: get/set for hash reference of nucleodtide bgd frequencies Returns : hash reference Arguments: hash reference =cut sub background { my ($self,$obj) = @_; if($obj){ $self->{'_background'} = $obj; } return $self->{'_background'}; } =head2 pwm Title : pwm Usage : $picto->pwm(); Function: get/set for pwm Returns : int Arguments: int =cut sub pwm { my ($self,$pwm) = @_; if($pwm){ $self->{'_pwm'} = $pwm; } return $self->{'_pwm'}; } #utility method for returning log 2 sub log2 { my ($val) = @_; return 0 if $val==0; return log($val)/log(2); } 1; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/Layout.pm��������������������������������������������������������000555��001750��001750�� 35534�12366325116� 20726� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Bio::Graphics::Layout; # shamelessly stolen from Mitch Skinner's JBrowse package and ported to perl. # Original copyright here #Copyright (c) 2007-2010 The Evolutionary Software Foundation # #Created by Mitchell Skinner # #This package and its accompanying libraries are free software; you can #redistribute it and/or modify it under the terms of the LGPL (either #version 2.1, or at your option, any later version) or the Artistic #License 2.0. Refer to LICENSE for the full license text. use strict; # /* # * Code for laying out rectangles, given that layout is also happening # * in adjacent blocks at the same time # * # * This code does a lot of linear searching; n should be low enough that # * it's not a problem but if it turns out to be, some of it can be changed to # * binary searching without too much work. Another possibility is to merge # * contour spans and give up some packing closeness in exchange for speed # * (the code already merges spans that have the same x-coord and are vertically # * contiguous). # */ sub new { my $class = shift; my ($leftBound, $rightBound) = @_; my $self = bless {},ref $class || $class; $self->{leftBound} = $leftBound; $self->{rightBound} = $rightBound; # a Layout contains a left contour and a right contour; # the area between the contours is allocated, and the # area outside the contours is free. $self->{leftContour} = Bio::Graphics::Layout::Contour->new(); $self->{rightContour} = Bio::Graphics::Layout::Contour->new(); $self->{seen} = {}; $self->{leftOverlaps} = []; $self->{rightOverlaps} = []; $self->{totalHeight} = 0; return $self; } sub totalHeight {shift->{totalHeight}} sub addRect { my $self = shift; my ($id,$left,$right,$height) = @_; if (defined $self->{seen}{$id}) {return $self->{seen}{$id}}; # for each contour, we test the fit on the near side of the given rect, my $leftFit = $self->tryLeftFit($left, $right, $height, 0); my $rightFit = $self->tryRightFit($left, $right, $height, 0); my $top; # and insert the far side from the side we tested # (we want to make sure the near side fits, but we want to extend # the contour to cover the far side) if ($leftFit->{top} < $rightFit->{top}) { $top = $leftFit->{top}; $self->{leftContour}->insertFit($leftFit->{fit}, $self->{rightBound} - $left, $top, $height); $self->{rightContour}->unionWith($right - $self->{leftBound}, $top, $height); } else { $top = $rightFit->{top}; $self->{rightContour}->insertFit($rightFit->{fit}, $right - $self->{leftBound}, $top, $height); $self->{leftContour}->unionWith($self->{rightBound} - $left, $top, $height); } my $existing = {id => $id, left => $left, right => $right, top => $top, height => $height}; $self->{seen}{$id} = $top; if ($left <= $self->{leftBound}) { push(@{$self->{leftOverlaps}},$existing); if ($self->{leftLayout}) { $self->{leftLayout}->addExisting($existing); } } if ($right >= $self->{rightBound}) { push(@{$self->{rightOverlaps}},$existing); if ($self->{rightLayout}) { $self->{rightLayout}->addExisting($existing); } } $self->{seen}{$id} = $top; $self->{totalHeight} = Bio::Graphics::Math::max($self->{totalHeight}, $top + $height); return $top; } # this method is called by the block to the left to see if a given fit works # in this layout # takes: proposed rectangle # returns: {top: value that makes the rectangle fit in this layout, # fit: "fit" for passing to insertFit} sub tryLeftFit { my $self = shift; my ($left,$right,$height,$top) = @_; my ($fit, $nextFit); my $curTop = $top; while (1) { # check if the rectangle fits at curTop $fit = $self->{leftContour}->getFit($self->{rightBound} - $right, $height, $curTop); $curTop = Bio::Graphics::Math::max($self->{leftContour}->getNextTop($fit), $curTop); # if the rectangle extends onto the next block to the right; if ($self->{rightLayout} && ($right >= $self->{rightBound})) { # check if the rectangle fits into that block at this position $nextFit = $self->{rightLayout}->tryLeftFit($left, $right, $height, $curTop); # if not, nextTop will be the next y-value where the rectangle # fits into that block if ($nextFit->{top} > $curTop) { # in that case, try again to see if that y-value works $curTop = $nextFit->{top}; next; } } last; } return {top=> $curTop, fit=> $fit}; } # this method is called by the block to the right to see if a given fit works # in this layout # takes: proposed rectangle # returns: {top: value that makes the rectangle fit in this layout, # fit: "fit" for passing to insertFit} sub tryRightFit { my $self = shift; my ($left,$right,$height,$top) = @_; my ($fit, $nextFit); my $curTop = $top; while (1) { # check if the rectangle fits at curTop $fit = $self->{rightContour}->getFit($left - $self->{leftBound}, $height, $curTop); $curTop = Bio::Graphics::Math::max($self->{rightContour}->getNextTop($fit), $curTop); # if the rectangle extends onto the next block to the left; if ($self->{leftLayout} && ($left <= $self->{leftBound})) { # check if the rectangle fits into that block at this position $nextFit = $self->{leftLayout}->tryRightFit($left, $right, $height, $curTop); # if not, nextTop will be the next y-value where the rectangle # fits into that block if ($nextFit->{top} > $curTop) { # in that case, try again to see if that y-value works $curTop = $nextFit->{top}; next; } } last } return {top => $curTop, fit => $fit}; } sub hasSeen { my $self = shift; my $id = shift; return defined $self->{seen}{$id}; } sub setLeftLayout { my $self = shift; my $left = shift; for (my $i = 0; $i < @{$self->{leftOverlaps}}; $i++) { $left->addExisting($self->{leftOverlaps}[$i]); } $self->{leftLayout} = $left; }; sub setRightLayout { my $self = shift; my $right = shift; for (my $i = 0; $i < @{$self->{rightOverlaps}}; $i++) { $right->addExisting($self->{rightOverlaps}[$i]); } $self->{rightLayout} = $right; }; sub cleanup { my $self = shift; undef $self->{leftLayout}; undef $self->{rightLayout}; }; # expects an {id, left, right, height, top} object sub addExisting { my $self = shift; my $existing = shift; if (defined $self->{seen}[$existing->{id}]) {return}; $self->{seen}{$existing->{id}} = $existing->{top}; $self->{totalHeight} = Bio::Graphics::Math::max($self->{totalHeight}, $existing->{top} + $existing->{height}); if ($existing->{left} <= $self->{leftBound}) { push(@{$self->{leftOverlaps}},$existing); if ($self->{leftLayout}) { $self->{leftLayout}->addExisting($existing); } } if ($existing->{right} >= $self->{rightBound}) { push(@{$self->{rightOverlaps}},$existing); if ($self->{rightLayout}) { $self->{rightLayout}->addExisting($existing); } } $self->{leftContour}->unionWith($self->{rightBound} - $existing->left, $existing->{top}, $existing->{height}); $self->rightContour->unionWith($existing->{right} - $self->{leftBound}, $existing->{top}, $existing->{height}); } package Bio::Graphics::Layout::Contour; use constant INF => 1<<16; sub new { my $class = shift; my $top = shift; # /* # * A contour is described by a set of vertical lines of varying heights, # * like this: # * | # * | # * | # * | # * | # * | # * # * The contour is the union of the rectangles ending on the right side # * at those lines, and extending leftward toward negative infinity. # * # * <=======================| # * <=======================| # * <==========| # * <=================| # * <=================| # * <=================| # * # * x --> # * # * As we add new vertical spans, the contour expands, either downward # * or in the direction of increasing x. # */ # // takes: top, a number indicating where the first span of the contour # // will go $top ||= 0; # // spans is an array of {top, x, height} objects representing # // the boundaries of the contour # // they're always sorted by top return bless {spans => [ {top=> $top, x => INF, height => 0} ] },ref $class || $class; } sub spans {shift->{spans}} # // finds a space in the contour into which the given span fits # // (i.e., the given span has higher x than the contour over its vertical span) # // returns an ojbect {above, count}; above is the index of the last span above # // where the given span will fit, count is the number of spans being # // replaced by the given span sub getFit { my $self = shift; my ($x,$height,$minTop) = @_; my ($aboveBottom, $curSpan); my $above = 0; my $spans = $self->spans; if ($minTop) { # set above = (index of the first span that starts below minTop) for (; $spans->[$above]{top} < $minTop; $above++) { if ($above >= (@$spans - 1)) { return {above=> @$spans - 1, count=> 0}; } } } # slide down the contour my $count; ABOVE: for (; $above < @$spans; $above++) { $aboveBottom = $spans->[$above]{top} + $spans->[$above]{height}; for ($count = 1; $above + $count < @$spans; $count++) { $curSpan = $spans->[$above + $count]; if (($aboveBottom + $height) <= $curSpan->{top}) { # the given span fits between span[above] and # curSpan, keeping curSpan return {above=> $above, count=> $count - 1}; } if ($curSpan->{x} > $x) { # the span at [above + count] overlaps the given span, # so we continue down the contour next ABOVE; } if (($curSpan->{x} <= $x) && (($aboveBottom + $height) < ($curSpan->{top} + $curSpan->{height}))) { # the given span partially covers curSpan, and # will overlap it, so we keep curSpan return {above=> $above, count=> $count - 1}; } } # the given span fits below span[above], replacing any # lower spans in the contour return {above=> $above, count => $count - 1}; } # the given span fits at the end of the contour, replacing no spans return {above => $above, count => 0}; } # add the given span to this contour where it fits, as given # by getFit sub insertFit { my $self = shift; my ($fit,$x,$top,$height) = @_; my $spans = $self->spans; # if the previous span and the current span have the same x-coord, # and are vertically contiguous, merge them. my $prevSpan = $spans->[$fit->{above}]; if ((abs($prevSpan->{x} - $x) < 1) && (abs(($prevSpan->{top} + $prevSpan->{height}) - $top) < 1) ) { $prevSpan->{height} = ($top + $height) - $prevSpan->{top}; # a bit of slop here is conservative if we take the max # (means things might get laid out slightly farther apart # than they would otherwise) $prevSpan->{x} = Bio::Graphics::Math::max($prevSpan->{x}, $x); splice(@$spans,$fit->{above} + 1, $fit->{count}); } else { splice(@$spans,$fit->{above} + 1, $fit->{count}, { top => $top, x => $x, height => $height }); } } # add the given span to this contour at the given location, if # it would extend the contour sub unionWith { my $self = shift; my ($x,$top,$height) = @_; my ($startBottom, $startIndex, $endIndex, $startSpan, $endSpan); my $bottom = $top + $height; my $spans = $self->spans; START: for ($startIndex = 0; $startIndex < @$spans; $startIndex++) { $startSpan = $spans->[$startIndex]; $startBottom = $startSpan->{top} + $startSpan->{height}; if ($startSpan->{top} > $top) { # the given span extends above an existing span $endIndex = $startIndex; last START; } if ($startBottom > $top) { # if startSpan covers (at least some of) the given span, if ($startSpan->{x} >= $x) { my $covered = $startBottom - $top; # we don't have to worry about the covered area any more $top += $covered; $height -= $covered; # if we've eaten up the whole span, then it's submerged # and we don't have to do anything if ($top >= $bottom) { return }; next; } else { # find the first span not covered by the given span for ($endIndex = $startIndex; $endIndex < @$spans; $endIndex++) { $endSpan = $spans->[$endIndex]; # if endSpan extends below or to the right # of the given span, then we need to keep it if ((($endSpan->{top} + $endSpan->{height}) > $bottom) || $endSpan->{x} > $x) { last START; } } last START; } } } # if the previous span and the current span have the same x-coord, # and are vertically contiguous, merge them. my $prevSpan = $spans->[$startIndex - 1]; if ((abs($prevSpan->{x} - $x) < 1) && (abs(($prevSpan->{top} + $prevSpan->{height}) - $top) < 1) ) { $prevSpan->{height} = ($top + $height) - $prevSpan->{top}; $prevSpan->{x} = Bio::Graphics::Math::max($prevSpan->{x}, $x); splice(@$spans,$startIndex, $endIndex - $startIndex); } else { splice(@$spans,$startIndex, $endIndex - $startIndex, { top => $top, x => $x, height => $height }); } } # returns the top of the to-be-added span that fits into "fit" # (as returned by getFit) sub getNextTop { my $self = shift; my $fit = shift; return $self->spans->[$fit->{above}]{top} + $self->spans->[$fit->{above}]{height}; }; package Bio::Graphics::Math; sub max {$_[0] > $_[1] ? $_[0] : $_[1]} 1; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/FeatureDir.pm����������������������������������������������������000555��001750��001750�� 15044�12366325116� 21475� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Bio::Graphics::FeatureDir; =head1 NAME Bio::Graphics::FeatureDir -- A directory of feature files and conf files =head1 SYNOPSIS my $fd = Bio::Graphics::FeatureDir->new('/path/to/dir'); $fd->add_file('tracks.conf'); $fd->add_file('foo.gff3'); $fd->add_file('foo.wig'); $fd->add_fh(\*STDIN); my $option = $fd->setting('EST' => 'bgcolor'); my @features = $fd->get_features_by_name('M101'); =head1 DESCRIPTION This class implements most of the methods of Bio::Graphics::FeatureFile, but stores the data files and features in a directory indexed by the Bio::DB::SeqFeature::Store::berkeleydb adaptor. Therefore it is fast. =head2 Methods =over 4 =cut use strict; use warnings; use base 'Bio::Graphics::FeatureFile'; use Bio::DB::SeqFeature::Store; use File::Path; use File::Spec; use File::Basename 'basename'; use File::Temp 'tempdir','mktemp'; use Carp 'croak'; =item $fd = Bio::Graphics::FeatureDir->new('/path/to/dir'); =item $fd = Bio::Graphics::FeatureDir->new(-dir => '/path/to/dir'); Create a new FeatureDir, based in the indicated directory. In addition to the -dir directory argument, it takes any of the options that can be passed to Bio::Graphics::FeatureFile except for the -file and -text arguments; =cut sub new { my $class = shift; my %args; if (@_ == 1) { %args = (-dir=>shift); } else { %args = @_; } $args{-dir} ||= tempdir(CLEANUP=>1); delete $args{-file}; delete $args{-text}; my $self = $class->SUPER::new(%args); $self->{dir} = $args{-dir}; $self->{verbose} = $args{-verbose}; $self->_init_featuredb; $self->_init_conf; return $self; } =item $db->_init_featuredb Internal method. Initializes the underlying feature database. =cut sub _init_featuredb { my $self = shift; my $dir = $self->dir; my $needs_init = $self->_maybe_create_dir($dir); my $index = File::Spec->catfile($dir,"indexes"); $needs_init++ unless -e $index; my @args = (-adaptor => 'berkeleydb', -dir => $dir, -write => 1, ); push @args,(-create => 1) if $needs_init; push @args,(-verbose => 1) if $self->{verbose}; $self->{db} = Bio::DB::SeqFeature::Store->new(@args) or die "Couldn't initialize database"; return $self->{db}; } =item $db->_init_conf Internal method -- initialize the configuration file(s) =cut sub _init_conf { my $self = shift; my $dir = $self->dir; my $needs_init = $self->_maybe_create_dir($dir); my $master_conf = File::Spec->catfile($dir,'indexes','master.conf'); $needs_init++ unless -e $master_conf; if ($needs_init) { open my $fh,'>',$master_conf or die "$master_conf: $!"; my $pack = __PACKAGE__; print $fh <{conf} = Bio::Graphics::FeatureFile->new(-file=>$master_conf); } =item $created = $db->_maybe_create_dir($dir) Create $dir and its parents if it doesn't exist. Return true if the directory was created. Throws an exception on filesystem errors. =cut sub _maybe_create_dir { my $self = shift; my $dir = shift || $self->{dir}; unless (-e $dir && -d $dir) { mkpath($dir) or die "Couldn't create directory $dir: $!"; return 1; } return; } =item $dir = $db->dir Returns the base directory. =cut sub dir {shift->{dir}} =item $conf = $db->conf Returns the underlying Bio::Graphics::FeatureFile object =cut sub conf {shift->{conf}} =back =item $db = $db->db Returns the underlying Bio::DB::SeqFeature::Store object =cut sub db { my $self = shift; return $self->{db} ||= Bio::DB::SeqFeature::Store->new( -adaptor => 'berkeleydb', -dir => $self->dir, -write => 1); } =item $db->add_file($file) Add the file to the directory. Can add files of type .fa, .gff, .gff3, .conf and .ff. =cut sub add_file { my $self = shift; my $file = shift; my $basename = basename $file; open my $fh,$file or croak "Couldn't open $file: $!"; $self->add_fh($fh,$basename); close $fh; } =item $db->add_fh(\*FILEHANDLE [,'name']) Add the contents of the indicated filehandle to repository. Name is optional; if provided it will be used as the base for all files created. =cut sub add_fh { my $self = shift; my ($fh,$name) = @_; $name =~ s/\.\w+$//; # get rid of extensions $name ||= mktemp('XXXXXXXX'); # status == unknown # config # gff3 # gff2 # ff # wiggle # fasta my ($status,$new_status); my $dir = $self->dir; my %splitter; while (<$fh>) { # figure out transitions $new_status = /^\#\#gff-version\s+3/i ? 'gff3' :/^\#\#gff/i ? 'gff2' : /^track/i ? 'wig' : /^\[(.+)\]/i ? 'conf' : /^>\w+/i ? 'fa' : /^reference/i ? 'ff' : undef; unless ($status || $new_status) { # guess what it is my @tokens = split /\s+/; $new_status = 'gff3' if @tokens >= 9 && $tokens[8] =~ /=/; $new_status = 'ff' if $tokens[2] =~ /\d+(\.\.|-)\d+/; } if ($new_status) { # this will create a new conf file for each section if ($new_status eq 'conf') { $splitter{conf} = Bio::Graphics::FileSplitter->new( File::Spec->catfile($dir,"${name}.$1.${new_status}")); } else { $splitter{$new_status} ||= Bio::Graphics::FileSplitter->new( File::Spec->catfile($dir,"${name}.${new_status}")); } $status = $new_status; } next unless $splitter{$status}; $splitter{$status}->write($_); } undef %splitter; $self->db->auto_reindex($dir); $self->_init_conf; } package Bio::Graphics::FileSplitter; sub new { my $class = shift; my $path = shift; open my $fh,'>',$path or die "Could not open $path for writing: $!"; return bless {fh=>$fh},ref $class || $class; } sub write { my $self = shift; $self->{fh}->print($_) foreach @_; } sub DESTROY { my $fh = shift->{fh}; close $fh if $fh; } =cut =head1 SEE ALSO L, L =head1 AUTHOR Lincoln Stein Elincoln.stein@gmail.comE. Copyright (c) 2009 Ontario Institute for Cancer Research This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut 1; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/GDWrapper.pm�����������������������������������������������������000444��001750��001750�� 4453�12366325116� 21255� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Bio::Graphics::GDWrapper; use base 'GD::Image'; use Memoize 'memoize'; use Carp 'cluck'; memoize('_match_font'); my $DefaultFont; #from http://reeddesign.co.uk/test/points-pixels.html my %Pixel2Point = ( 8 => 6, 9 => 7, 10 => 7.5, 11 => 8, 12 => 9, 13 => 10, 14 => 10.5, 15 =>11, 16 => 12, 17 => 13, 18 => 13.5, 19 => 14, 20 => 14.5, 21 => 15, 22 => 16, 23 => 17, 24 => 18, 25 => 19, 26 => 20 ); my $GdInit; sub new { my $self = shift; my ($gd,$default_font) = @_; $DefaultFont = $default_font unless $default_font eq '1'; $gd->useFontConfig(1); return bless $gd,ref $self || $self; } sub default_font { return $DefaultFont || 'Arial' } # print with a truetype string sub string { my $self = shift; my ($font,$x,$y,$string,$color) = @_; return $self->SUPER::string(@_) if $self->isa('GD::SVG'); my $fontface = $self->_match_font($font); # warn "$font => $fontface"; my ($fontsize) = $fontface =~ /-(\d+)/; $self->stringFT($color,$fontface,$fontsize,0,$x,$y+$fontsize+1,$string); } sub string_width { my $self = shift; my ($font,$string) = @_; my $fontface = $self->_match_font($font); my ($fontsize) = $fontface =~ /-([\d.]+)/; my @bounds = GD::Image->stringFT(0,$fontface,$fontsize,0,0,0,$string); return abs($bounds[2]-$bounds[0]); } sub string_height { my $self = shift; my ($font,$string) = @_; my $fontface = $self->_match_font($font); my ($fontsize) = $fontface =~ /-(\d+)/; my @bounds = GD::Image->stringFT(0,$fontface,$fontsize,0,0,0,$string); return abs($bounds[5]-$bounds[3]); } # find a truetype match for a built-in font sub _match_font { my $self = shift; my $font = shift; return $font unless ref $font && $font->isa('GD::Font'); # work around older versions of GD that require useFontConfig to be called from a GD::Image instance $GdInit++ || eval{GD::Image->useFontConfig(1)} || GD::Image->new(10,10)->useFontConfig(1); my $fh = $font->height-1; my $height = $Pixel2Point{$fh} || $fh; my $style = $font eq GD->gdMediumBoldFont ? 'bold' :$font eq GD->gdGiantFont ? 'bold' :'normal'; my $ttfont = $self->default_font; return "$ttfont-$height:$style"; } 1; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/FeatureFile.pm���������������������������������������������������000555��001750��001750�� 161110�12366325116� 21652� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Bio::Graphics::FeatureFile; # This package parses and renders a simple tab-delimited format for features. # It is simpler than GFF, but still has a lot of expressive power. # See __END__ for the file format =head1 NAME Bio::Graphics::FeatureFile -- A set of Bio::Graphics features, stored in a file =head1 SYNOPSIS use Bio::Graphics::FeatureFile; my $data = Bio::Graphics::FeatureFile->new(-file => 'features.txt'); # create a new panel and render contents of the file onto it my $panel = $data->new_panel; my $tracks_rendered = $data->render($panel); # or do it all in one step my ($tracks_rendered,$panel) = $data->render; # for more control, render tracks individually my @feature_types = $data->types; for my $type (@feature_types) { my $features = $data->features($type); my %options = $data->style($type); $panel->add_track($features,%options); # assuming we have a Bio::Graphics::Panel } # get individual settings my $est_fg_color = $data->setting(EST => 'fgcolor'); # or create the FeatureFile by hand # add a type $data->add_type(EST => {fgcolor=>'blue',height=>12}); # add a feature my $feature = Bio::Graphics::Feature->new( # params ); # or some other SeqI $data->add_feature($feature=>'EST'); =head1 DESCRIPTION The Bio::Graphics::FeatureFile module reads and parses files that describe sequence features and their renderings. It accepts both GFF format and a more human-friendly file format described below. Once a FeatureFile object has been initialized, you can interrogate it for its consistuent features and their settings, or render the entire file onto a Bio::Graphics::Panel. This module is a precursor of Jason Stajich's Bio::Annotation::Collection class, and fulfills a similar function of storing a collection of sequence features. However, it also stores rendering information about the features, and does not currently follow the CollectionI interface. =head1 The File Format There are two types of entry in the file format: feature entries, and formatting entries. They can occur in any order. See the Appendix for a full example. =head2 Formatting Entries Formatting entries are in the form: [Stanza Name] option1 = value1 option2 = value2 option3 = value3 [Stanza Name 2] option1 = value1 option2 = value2 ... There can be zero or more stanzas, each with a unique name. The names can contain any character except the [] characters. Each stanza consists of one or more option = value pairs, where the option and the value are separated by an "=" sign and optional whitespace. Values can be continued across multiple lines by indenting the continuation lines by one or more spaces, as in: [Named Genes] feature = gene glyph = transcript2 description = These are genes that have been named by the international commission on gene naming (The Hague). Typically configuration stanzas will consist of several Bio::Graphics formatting options. A -option=>$value pair passed to Bio::Graphics::Panel->add_track() becomes a "option=value" pair in the feature file. =head2 Feature Entries Feature entries can take several forms. At their simplest, they look like this: Gene B0511.1 Chr1:516..11208 This means that a feature of type "Gene" and name "B0511.1" occupies the range between bases 516 and 11208 on a sequence entry named Chr1. Columns are separated using whitespace (tabs or spaces). Embedded whitespace can be escaped using quote marks or backslashes: Gene "My Favorite Gene" Chr1:516..11208 =head2 Specifying Positions and Ranges A feature position is specified using a sequence ID (a genbank accession number, a chromosome name, a contig, or any other meaningful reference system, followed by a colon and a position range. Ranges are two integers separated by double dots or the hyphen. Examples: "Chr1:516..11208", "ctgA:1-5000". Negative coordinates are allowed, as in "Chr1:-187..1000". A discontinuous range ("split location") uses commas to separate the ranges. For example: Gene B0511.1 Chr1:516..619,3185..3294,10946..11208 In the case of a split location, the sequence id only has to appear in front of the first range. Alternatively, a split location can be indicated by repeating the features type and name on multiple adjacent lines: Gene B0511.1 Chr1:516..619 Gene B0511.1 Chr1:3185..3294 Gene B0511.1 Chr1:10946..11208 If all the locations are on the same reference sequence, you can specify a default chromosome using a "reference=": reference=Chr1 Gene B0511.1 516..619 Gene B0511.1 3185..3294 Gene B0511.1 10946..11208 The default seqid is in effect until the next "reference" line appears. =head2 Feature Tags Tags can be added to features by adding a fourth column consisting of "tag=value" pairs: Gene B0511.1 Chr1:516..619,3185..3294 Note="Putative primase" Tags and their values take any form you want, and multiple tags can be separated by semicolons. You can also repeat tags multiple times: Gene B0511.1 Chr1:516..619,3185..3294 GO_Term=GO:100;GO_Term=GO:2087 Several tags have special meanings: Tag Meaning --- ------- Type The primary tag for a subfeature. Score The score of a feature or subfeature. Phase The phase of a feature or subfeature. URL A URL to link to (via the Bio::Graphics library). Note A note to attach to the feature for display by the Bio::Graphics library. For example, in the common case of an mRNA, you can use the "Type" tag to distinguish the parts of the mRNA into UTR and CDS: mRNA B0511.1 Chr1:1..100 Type=UTR mRNA B0511.1 Chr1:101..200,300..400,500..800 Type=CDS mRNA B0511.1 Chr1:801..1000 Type=UTR The top level feature's primary tag will be "mRNA", and its subparts will have types UTR and CDS as indicated. Additional tags that are placed in the first line of the feature will be applied to the top level. In this example, the note "Putative primase" will be applied to the mRNA at the top level of the feature: mRNA B0511.1 Chr1:1..100 Type=UTR;Note="Putative primase" mRNA B0511.1 Chr1:101..200,300..400,500..800 Type=CDS mRNA B0511.1 Chr1:801..1000 Type=UTR =head2 Feature Groups Features can be grouped so that they are rendered by the "group" glyph. To start a group, create a two-column feature entry showing the group type and a name for the group. Follow this with a list of feature entries with a blank type. For example: EST yk53c10 yk53c10.3 15000-15500,15700-15800 yk53c10.5 18892-19154 This example is declaring that the ESTs named yk53c10.3 and yk53c10.5 belong to the same group named yk53c10. =head2 Comments Lines that begin with the # sign are treated as comments and ignored. When a # sign appears within a line, everything to the right of the symbol is also ignored, unless it looks like an HTML fragment or an HTML color, e.g.: # this is ignored [Example] glyph = generic # this comment is ignored bgcolor = #FF0000 link = http://www.google.com/search?q=$name#results Be careful, because the processing of # signs uses a regexp heuristic. To be safe, always put a space after the # sign to make sure it is treated as a comment. =head2 The #include and #exec Directives The special comment "#include 'filename'" acts like the C preprocessor directive and will insert the comments of a named file into the position at which it occurs. Relative paths will be treated relative to the file in which the #include occurs. Nested #include directives (a #include located in a file that is itself an include file) are #allowed. You may also use one of the shell wildcard characters * and #? to include all matching files in a directory. The following are examples of valid #include directives: #include "/usr/local/share/my_directives.txt" #include 'my_directives.txt' #include chromosome3_features.gff3 #include gff.d/*.conf You can enclose the file path in single or double quotes as shown above. If there are no spaces in the filename the quotes are optional. The #include directive is case insensitive, allowing you to use #INCLUDE or #Include if you prefer. Include file processing is not very smart and will not catch all circular #include references. You have been warned! The special comment "#exec 'command'" will spawn a shell and incorporate the output of the command into the configuration file. This command will be executed quite frequently, so it is suggested that any time-consuming processing that does not need to be performed on the fly each time should be cached in a local file. =cut use strict; use Bio::Graphics::Feature; use Bio::DB::GFF::Util::Rearrange; use Carp 'cluck','carp','croak'; use IO::File; use File::Glob ':glob'; use Text::ParseWords 'shellwords'; use Bio::DB::SeqFeature::Store; use File::Basename 'dirname'; use File::Spec; use Cwd 'getcwd'; # default colors for unconfigured features my @COLORS = qw(cyan blue red yellow green wheat turquoise orange); # package variable which holds the limited set of libraries accessible # from within the Safe::World container (please see the description of # the -safe_world option). # my $SAFE_LIB; use constant WIDTH => 600; use constant MAX_REMAP => 100; =head2 METHODS =over 4 =item $version = Bio::Graphics::FeatureFile-Eversion Return the version number -- needed for API checking by GBrowse =cut sub version { return 2 } =item $features = Bio::Graphics::FeatureFile-Enew(@args) Create a new Bio::Graphics::FeatureFile using @args to initialize the object. Arguments are -name=Evalue pairs: Argument Value -------- ----- -file Read data from a file path or filehandle. Use "-" to read from standard input. -text Read data from a text scalar. -allow_whitespace If true, relax GFF2 and GFF3 parsing rules to allow columns to be delimited by whitespace rather than tabs. -map_coords Coderef containing a subroutine to use for remapping all coordinates. -smart_features Flag indicating that the features created by this module should be made aware of the FeatureFile object by calling their configurator() method. -safe Indicates that the contents of this file is trusted. Any option value that begins with the string "sub {" or \&subname will be evaluated as a code reference. -safe_world If the -safe option is not set, and -safe_world is set to a true value, then Bio::Graphics::FeatureFile will evalute "sub {}" options in a L environment with minimum permissions. Subroutines will be able to access and interrogate Bio::DB::SeqFeature objects and perform basic Perl operations, but will have no ability to load or access other modules, to access the file system, or to make system calls. This feature depends on availability of the CPAN-installable L module. The -file and -text arguments are mutually exclusive, and -file will supersede the other if both are present. -map_coords points to a coderef with the following signature: ($newref,[$start1,$end1],[$start2,$end2]....) = coderef($ref,[$start1,$end1],[$start2,$end2]...) See the Bio::Graphics::Browser (part of the generic genome browser package) for an illustration of how to use this to do wonderful stuff. The -smart_features flag is used by the generic genome browser to provide features with a way to access the link-generation code. See gbrowse for how this works. If the file is trusted, and there is an option named "init_code" in the [GENERAL] section of the file, it will be evaluated as perl code immediately after parsing. You can use this to declare global variables and subroutines for use in option values. =cut # args array: # -file => parse from a file (- allowed for ARGV) # -text => parse from a text scalar # -map_coords => code ref to do coordinate mapping # called with ($ref,[$start1,$stop1],[$start2,$stop2]...) # returns ($newref,$new_coord1,$new_coord2...) sub new { shift->_new(@_); } sub _new { my $class = shift; my %args = @_; my $self = bless { config => {}, features => {}, seenit => {}, types => [], max => undef, min => undef, stat => [], refs => {}, safe => undef, safe_world => undef, },$class; $self->{coordinate_mapper} = $args{-map_coords} if exists $args{-map_coords} && ref($args{-map_coords}) eq 'CODE'; $self->smart_features($args{-smart_features}) if exists $args{-smart_features}; $self->{safe} = $args{-safe} if exists $args{-safe}; $self->safe_world(1) if $args{-safe_world}; $self->allow_whitespace(1) if $args{-allow_whitespace}; $self->init_parse(); # call with # -file # -text if (my $file = $args{-file}) { no strict 'refs'; if (defined fileno($file)) { # a filehandle $self->parse_fh($file); } elsif ($file eq '-') { $self->parse_argv(); } else { $self->parse_file($file); } } elsif (my $text = $args{-text}) { $self->parse_text($text); } $self->finish_parse(); return $self; } =item $features = Bio::Graphics::FeatureFile-Enew_from_cache(@args) Like new() but caches the parsed file in /tmp/bio_graphics_ff_cache_* (where * is the UID of the current user). This can speed up parsing tremendously for files that have many includes. Note that the presence of an #exec statement always invalidates the cache and causes a full parse. =cut sub new_from_cache { my $self = shift; my %args = @_; my $has_libs; unless ($has_libs = defined &nfreeze) { $has_libs = eval <_new(@_); (my $name = $args{-file}) =~ s!/!_!g; my $cachefile = $self->cachefile($name); if (-e $cachefile && (stat(_))[9] >= $self->file_mtime($args{-file})) { # cache is valid # if (-e $cachefile && -M $cachefile < 0) { # cache is valid my $parsed_file = lock_retrieve($cachefile); $parsed_file->initialize_code if $parsed_file->safe; return $parsed_file; } else { mkpath(dirname($cachefile)); my $parsed = $self->_new(@_); $parsed->initialize_code(); eval {lock_store($parsed,$cachefile)}; warn $@ if $@; return $parsed; } } sub cachedir { my $self = shift; my $uid = $<; return File::Spec->catfile(File::Spec->tmpdir,"bio_graphics_ff_cache_${uid}"); } sub cachefile { my $self = shift; my $name = shift; return File::Spec->catfile($self->cachedir,$name); } =item $mtime = Bio::Graphics::FeatureFile->file_mtime($path) Return the modification time of the indicated feature file without performing a full parse. This takes into account the various #include and #exec directives and returns the maximum mtime of any of the included files. Any #exec directive will return the current time. This is useful for caching the parsed data structure. =back =cut sub file_mtime { my $self = shift; my $file = shift; my $mtime = 0; for my $f (glob($file)) { my $m = (stat($f))[9] or next; $mtime = $m if $mtime < $m; open my $fh,'<',$file or next; my $cwd = getcwd(); chdir(dirname($file)); local $_; while (<$fh>) { if (/^\#exec/) { return time(); # now! } if (/^\#include\s+(.+)/i) { # #include directive my ($include_file) = shellwords($1); my $m = $self->file_mtime($include_file); $mtime = $m if $mtime < $m; } } chdir($cwd); } return $mtime; } sub file_list { my $self = shift; my @list = (); my $file = shift; for my $f (glob($file)) { open my $fh,'<',$file or next; my $cwd = getcwd(); chdir(dirname($file)); while (<$fh>) { if (/^\#include\s+(.+)/i) { # #include directive my ($include_file) = shellwords($1); my @files = glob($include_file); @files ? @list = (@list,@files) : push(@list,$include_file); } } chdir($cwd); } return \@list; } # render our features onto a panel using configuration data # return the number of tracks inserted =over 4 =item ($rendered,$panel,$tracks) = $features-Erender([$panel, $position_to_insert, $options, $max_bump, $max_label, $selector]) Render features in the data set onto the indicated Bio::Graphics::Panel. If no panel is specified, creates one. All arguments are optional. $panel is a Bio::Graphics::Panel that has previously been created and configured. $position_to_insert indicates the position at which to start inserting new tracks. The last current track on the panel is assumed. $options is a scalar used to control automatic expansion of the tracks. 0=auto, 1=compact, 2=expanded, 3=expand and label, 4=hyperexpand, 5=hyperexpand and label. $max_bump and $max_label indicate the maximum number of features before bumping and labeling are turned off. $selector is a code ref that can be used to filter which features to render. It receives a feature and should return true to include the feature and false to exclude it. In a scalar context returns the number of tracks rendered. In a list context, returns a three-element list containing the number of features rendered, the created panel, and an array ref of all the track objects created. Instead of a Bio::Graphics::Panel object, you can provide a hash reference containing the arguments that you would pass to Bio::Graphics::Panel->new(). For example, to render an SVG image, you could do this: my ($tracks_rendered,$panel) = $data->render({-image_class=>'GD::SVG'}); print $panel->svg; =back =cut #" sub render { my $self = shift; my $panel = shift; # 8 arguments my ($position_to_insert, $options, $max_bump, $max_label, $selector, $range, $override_options ) = @_; my %seenit; unless ($panel && UNIVERSAL::isa($panel,'Bio::Graphics::Panel')) { $panel = $self->new_panel($panel); } # count up number of tracks inserted my @tracks; my $color; my @labels = $self->labels; # we need to add a dummy section for each type that isn't # specifically configured my %types = map {$_=>1 } map { shellwords ($self->setting($_=>'feature')||$_) } @labels; my %lc_types = map {lc($_)}%types; my @unconfigured_types = sort grep {!exists $lc_types{lc $_} && !exists $lc_types{lc $_->method} } $self->types; my @configured_types = keys %types; my @labels_to_render = (@labels,@unconfigured_types); my @base_config = $self->style('general'); my @pack_options = (); if ($options && ref $options eq 'HASH') { @pack_options = %$options; } else { $options ||= 0; if ($options == 1) { # compact push @pack_options,(-bump => 0,-label=>0); } elsif ($options == 2) { #expanded push @pack_options,(-bump=>1); } elsif ($options == 3) { #expand and label push @pack_options,(-bump=>1,-label=>1); } elsif ($options == 4) { #hyperexpand push @pack_options,(-bump => 2); } elsif ($options == 5) { #hyperexpand and label push @pack_options,(-bump => 2,-label=>1); } } for my $label (@labels_to_render) { my @types = shellwords($self->setting($label=>'feature')||''); @types = $label unless @types; next if defined $selector and !$selector->($self,$label); my @features = !$range ? grep {$self->_visible($_)} $self->features(\@types) : $self->features(-types => \@types, -seq_id => $range->seq_id, -start => $range->start, -end => $range->end ); next unless @features; # suppress tracks for features that don't appear # fix up funky group hack foreach (@features) {$_->primary_tag('group') if $_->has_tag('_ff_group')}; my $features = \@features; my @auto_bump; push @auto_bump,(-bump => @$features < $max_bump) if defined $max_bump; push @auto_bump,(-label => @$features < $max_label) if defined $max_label; my @more_arguments = $override_options ? @$override_options : (); my @config = ( -glyph => 'segments', # really generic -bgcolor => $COLORS[$color++ % @COLORS], -label => 1, -description => 1, -key => $features[0]->type || $label, @auto_bump, @base_config, # global $self->style($label), # feature-specific @pack_options, @more_arguments, ); if (defined($position_to_insert)) { push @tracks,$panel->insert_track($position_to_insert++,$features,@config); } else { push @tracks,$panel->add_track($features,@config); } } return wantarray ? (scalar(@tracks),$panel,\@tracks) : scalar @tracks; } sub _stat { my $self = shift; my $file = shift; defined fileno($file) or return; my @stat = stat($file) or return; if ($self->{stat} && @{$self->{stat}}) { # merge #includes so that mtime etc are max age for (8,9,10) { $self->{stat}[$_] = $stat[$_] if $stat[$_] > $self->{stat}[$_]; } $self->{stat}[7] += $stat[7]; } else { $self->{stat} = \@stat; } } sub _visible { my $self = shift; my $feat = shift; my $min = $self->min; my $max = $self->max; return $feat->start<=$max && $feat->end>=$min; } =over 4 =item $error = $features-Eerror([$error]) Get/set the current error message. =back =cut sub error { my $self = shift; my $d = $self->{error}; $self->{error} = shift if @_; $d; } =over 4 =item $smart_features = $features-Esmart_features([$flag] Get/set the "smart_features" flag. If this is set, then any features added to the featurefile object will have their configurator() method called using the featurefile object as the argument. =back =cut sub smart_features { my $self = shift; my $d = $self->{smart_features}; $self->{smart_features} = shift if @_; $d; } sub parse_argv { my $self = shift; local $/ = "\n"; local $_; while (<>) { chomp; $self->parse_line($_); } } sub parse_file { my $self = shift; my $file = shift; $file =~ s/(\s)/\\$1/g; # escape whitespace from glob expansion for my $f (glob($file)) { my $fh = IO::File->new($f) or return; my $cwd = getcwd(); chdir(dirname($f)); $self->parse_fh($fh); chdir($cwd); } } sub parse_fh { my $self = shift; my $fh = shift; $self->_stat($fh); local $/ = "\n"; local $_; while (<$fh>) { chomp; $self->parse_line($_) || last; } } sub parse_text { my $self = shift; my $text = shift; foreach (split m/\015?\012|\015\012?/,$text) { $self->parse_line($_); } } sub parse_line { my $self = shift; my $line = shift; $line =~ s/\015//g; # get rid of carriage returns left over by MS-DOS/Windows systems $line =~ s/\s+$//; # get rid of trailing whitespace if (/^#include\s+(.+)/i) { # #include directive my ($include_file) = shellwords($1); # detect some loops croak "#include loop detected at $include_file" if $self->{includes}{$include_file}++; $self->parse_file($include_file); return 1; } if (/^#exec\s+(.+)/i) { # #exec directive my ($command,@args) = shellwords($1); open (my $fh,'-|') || exec $command,@args; $self->parse_fh($fh); return 1; } return 1 if $line =~ /^\s*\#[^\#]?$/; # comment line # Are we in a configuration section or a data section? # We start out in 'config' state, and are triggered to # reenter config state whenever we see a /^\[ pattern (config section) my $old_state = $self->{state}; my $new_state = $self->_state_transition($line); if ($new_state ne $old_state) { delete $self->{current_config}; delete $self->{current_tag}; } if ($new_state eq 'config') { $self->parse_config_line($line); } elsif ($new_state eq 'data') { $self->parse_data_line($line); } $self->{state} = $new_state; 1; } sub _state_transition { my $self = shift; my $line = shift; my $current_state = $self->{state}; if ($current_state eq 'data') { return 'config' if $line =~ m/^\s*\[([^\]]+)\]/; # start of a configuration section } elsif ($current_state eq 'config') { return 'data' if $line =~ /^\#\#(\w+)/; # GFF3 meta instruction return 'data' if $line =~ /^reference\s*=/; # feature-file reference sequence directive return 'config' if $line =~ /^\s*$/; #empty line return 'config' if $line =~ m/^\[(.+)\]/; # section beginning return 'config' if $line =~ m/^[\w:\s]+=/ && $self->{current_config}; # configuration line return 'config' if $line =~ m/^\s+(.+)/ && $self->{current_tag}; # continuation section return 'config' if $line =~ /^\#/; # comment -not a meta return 'data'; } return $current_state; } sub parse_config_line { my $self = shift; local $_ = shift; # strip right-column comments unless they look like colors or html fragments s/\s*\#.*$// unless /\#[0-9a-f]{6,8}\s*$/i || /\w+\#\w+/ || /\w+\"*\s*\#\d+$/; if (/^\s+(.+)/ && $self->{current_tag}) { # configuration continuation line my $value = $1; my $cc = $self->{current_config} ||= 'general'; # in case no configuration named $self->{config}{$cc}{$self->{current_tag}} .= ' ' . $value; # respect newlines in code subs $self->{config}{$cc}{$self->{current_tag}} .= "\n" if $self->{config}{$cc}{$self->{current_tag}}=~ /^sub\s*\{/; return 1; } elsif (/^\[(.+)\]/) { # beginning of a configuration section my $label = $1; my $cc = $label =~ /^(general|default)$/i ? 'general' : $label; # normalize push @{$self->{types}},$cc unless $cc eq 'general'; $self->{current_config} = $cc; return 1; } elsif (/^([\w: -]+?)\s*=\s*(.*)/) { # key value pair within a configuration section my $tag = lc $1; my $cc = $self->{current_config} ||= 'general'; # in case no configuration named my $value = defined $2 ? $2 : ''; $self->{config}{$cc}{$tag} = $value; $self->{current_tag} = $tag; return 1; } elsif (/^$/) { # empty line # no longer required -- new sections are indicated by the start of a [stanza] # line and not by termination with a blank line # undef $self->{current_tag}; return 1; } } sub parse_data_line { my $self = shift; my $line = shift; $self->{loader} ||= $self->_make_loader($line) or return; $self->{loader}->load_line($line); } sub _make_loader { my $self = shift; local $_ = shift; my $db = $self->db; my $type; # we support gff2, gff3 and featurefile formats if (/^\#\#gff-version\s+([23])/) { $type = "Bio::DB::SeqFeature::Store::GFF$1Loader"; } elsif (/^reference\s*=.+/) { $type = "Bio::DB::SeqFeature::Store::FeatureFileLoader"; } else { my @tokens = shellwords($_); unshift @tokens,'' if /^\s+/ and length $tokens[0]; if (@tokens >=8 && $tokens[3]=~ /^-?\d+$/ && $tokens[4]=~ /^-?\d+$/) { $type = 'Bio::DB::SeqFeature::Store::GFF3Loader'; } else { $type = 'Bio::DB::SeqFeature::Store::FeatureFileLoader'; } } eval "require $type" unless $type->can('new'); my $loader = $type->new(-store => $db, -map_coords => $self->{coordinate_mapper}, -index_subfeatures => 0, ); eval {$loader->allow_whitespace(1)} if $self->allow_whitespace; # gff2 and gff3 loaders allow this $loader->start_load() if $loader; return $loader; } sub db { my $self = shift; return $self->{db} ||= Bio::DB::SeqFeature::Store->new(-adaptor=>'memory', -write => 1); } =over 4 =item $flat = $features-Eallow_whitespace([$new_flag]) If true, then GFF3 and GFF2 parsing is relaxed to allow whitespace to delimit the columns. Default is false. =back =cut sub allow_whitespace { my $self = shift; my $d = $self->{allow_whitespace}; $self->{allow_whitespace} = shift if @_; $d; } =over 4 =item $features-Eadd_feature($feature [=E$type]) Add a new Bio::FeatureI object to the set. If $type is specified, the object's primary_tag() will be set to that type. Otherwise, the method will use the feature's existing primary_tag() to index and store the feature. =back =cut # add a feature of given type to our list # we use the primary_tag() method sub add_feature { my $self = shift; my ($feature,$type) = @_; $feature->configurator($self) if $self->smart_features; $feature->primary_tag($type) if defined $type; $self->db->store($feature); } =over 4 =item $features-Eadd_type($type=E$hashref) Add a new feature type to the set. The type is a string, such as "EST". The hashref is a set of key=Evalue pairs indicating options to set on the type. Example: $features->add_type(EST => { glyph => 'generic', fgcolor => 'blue'}) When a feature of type "EST" is rendered, it will use the generic glyph and have a foreground color of blue. =back =cut # Add a type to the list. Hash values are used for key/value pairs # in the configuration. Call as add_type($type,$configuration) where # $configuration is a hashref. sub add_type { my $self = shift; my ($type,$type_configuration) = @_; my $cc = $type =~ /^(general|default)$/i ? 'general' : $type; # normalize push @{$self->{types}},$cc unless $cc eq 'general' or $self->{config}{$cc}; if (defined $type_configuration) { for my $tag (keys %$type_configuration) { $self->{config}{$cc}{lc $tag} = $type_configuration->{$tag}; } } } =over 4 =item $features-Eset($type,$tag,$value) Change an individual option for a particular type. For example, this will change the foreground color of EST features to my favorite color: $features->set('EST',fgcolor=>'chartreuse') =back =cut # change configuration of a type. Call as set($type,$tag,$value) # $type will be added if not already there. sub set { my $self = shift; croak("Usage: \$featurefile->set(\$type,\$tag,\$value\n") unless @_ == 3; my ($type,$tag,$value) = @_; unless ($self->{config}{$type}) { return $self->add_type($type,{$tag=>$value}); } else { $self->{config}{$type}{lc $tag} = $value; } } # break circular references sub finished { my $self = shift; delete $self->{features}; } sub DESTROY { my $self = shift; $self->finished(@_); # $self->{safe_context}->unlink_all_worlds # if $self->{safe_context}; } =over 4 =item $value = $features-Esetting($stanza =E $option) In the two-element form, the setting() method returns the value of an option in the configuration stanza indicated by $stanza. For example: $value = $features->setting(general => 'height') will return the value of the "height" option in the [general] stanza. Call with one element to retrieve all the option names in a stanza: @options = $features->setting('general'); Call with no elements to retrieve all stanza names: @stanzas = $features->setting; =back =cut sub setting { my $self = shift; if (@_ > 2) { $self->{config}->{$_[0]}{$_[1]} = $_[2]; } elsif (@_ <= 1) { return $self->_setting(@_); } elsif ($self->safe) { return $self->code_setting(@_); } elsif ($self->safe_world) { return $self->safe_setting(@_); } else { $self->{code_check}++ && $self->clean_code(); # not safe; clean coderefs return $self->_setting(@_); } } =head2 fallback_setting() $value = $browser->setting(gene => 'fgcolor'); Tries to find the setting for designated label (e.g. "gene") first. If this fails, looks in [TRACK DEFAULTS]. If this fails, looks in [GENERAL]. =cut sub fallback_setting { my $self = shift; my ($label,$option) = @_; for my $key ($label,'TRACK DEFAULTS','GENERAL') { my $value = $self->setting($key,$option); return $value if defined $value; } return; } # return configuration information # arguments are ($type) => returns tags for type # ($type=>$tag) => returns values of tag on type # ($type=>$tag,$value) => sets value of tag sub _setting { my $self = shift; my $config = $self->{config} or return; return keys %{$config} unless @_; return keys %{$config->{$_[0]}} if @_ == 1; return $config->{$_[0]}{$_[1]} if @_ == 2 && defined $_[0] && exists $config->{$_[0]}; return $config->{$_[0]}{$_[1]} = $_[2] if @_ > 2; return; } =over 4 =item $value = $features-Ecode_setting($stanza=E$option); This works like setting() except that it is also able to evaluate code references. These are options whose values begin with the characters "sub {". In this case the value will be passed to an eval() and the resulting codereference returned. Use this with care! =back =cut sub code_setting { my $self = shift; my $section = shift; my $option = shift; croak 'Cannot call code_setting unless feature file is marked as safe' unless $self->safe; my $setting = $self->_setting($section=>$option); return unless defined $setting; return $setting if ref($setting) eq 'CODE'; if ($setting =~ /^\\&([:\w]+)/) { # coderef in string form my $subroutine_name = $1; my $package = $self->base2package; my $codestring = $subroutine_name =~ /::/ ? "\\&$subroutine_name" : "\\&${package}\:\:${subroutine_name}" ; my $coderef = eval $codestring; $self->_callback_complain($section,$option) if $@; $self->set($section,$option,$coderef); $self->set_callback_source($section,$option,$setting); return $coderef; } elsif ($setting =~ /^sub\s*(\(\$\$\))*\s*\{/) { my $package = $self->base2package; my $coderef = eval "package $package; $setting"; $self->_callback_complain($section,$option) if $@; $self->set($section,$option,$coderef); $self->set_callback_source($section,$option,$setting); return $coderef; } else { return $setting; } } sub _callback_complain { my $self = shift; my ($section,$option) = @_; carp "An error occurred while evaluating the callback at section='$section', option='$option':\n => $@"; } =over 4 =item $value = $features-Esafe_setting($stanza=E$option); This works like code_setting() except that it evaluates anonymous code references in a "Safe::World" compartment. This depends on the L module being installed and the -safe_world option being set to true during object construction. =back =cut sub safe_setting { my $self = shift; my $section = shift; my $option = shift; my $setting = $self->_setting($section=>$option); return unless defined $setting; return $setting if ref($setting) eq 'CODE'; if ($setting =~ /^sub\s*(\(\$\$\))*\s*\{/ && (my $context = $self->{safe_context})) { # turn setting from an anonymous sub into a named # sub in the context namespace # create proper symbol name my $subname = "${section}_${option}"; $subname =~ tr/a-zA-Z0-9_//cd; $subname =~ s/^\d+//; my ($prototype) = $setting =~ /^sub\s*\(\$\$\)/; $setting =~ s/^sub?.*?\{/sub $subname {/; my $success = $context->eval("$setting; 1"); $self->_callback_complain($section,$option) if $@; unless ($success) { $self->set($section,$option,1); # if call fails, it becomes a generic "true" value return 1; } my $coderef = $prototype ? sub ($$) { return $context->call($subname,$_[0],$_[1]) } : sub { if ($_[-1]->isa('Bio::Graphics::Glyph')) { my %newglyph = %{$_[-1]}; $_[-1] = bless \%newglyph,'Bio::Graphics::Glyph'; # make generic } $context->call($subname,@_); }; $self->set($section,$option,$coderef); $self->set_callback_source($section,$option,$setting); return $coderef; } else { return $setting; } } =over 4 =item $flag = $features-Esafe([$flag]); This gets or sets and "safe" flag. If the safe flag is set, then calls to setting() will invoke code_setting(), allowing values that begin with the string "sub {" to be interpreted as anonymous subroutines. This is a potential security risk when used with untrusted files of features, so use it with care. =back =cut sub safe { my $self = shift; my $d = $self->{safe}; $self->{safe} = shift if @_; $self->evaluate_coderefs if $self->{safe} && !$d; $d; } =over 4 =item $flag = $features-Esafe_world([$flag]); This gets or sets and "safe_world" flag. If the safe_world flag is set, then values that begin with the string "sub {" will be evaluated in a "safe" compartment that gives minimal access to the system. This is not a panacea for security risks, so use with care. =back =cut sub safe_world { my $self = shift; my $safe = shift; if ($safe && !$self->{safe_content}) { # initialise the thing eval "require Safe::World; 1"; unless (Safe::World->can('new')) { warn "The Safe::World module is not installed on this system. Can't use it to evaluate codesubs in a safe context"; return; } unless ($self->{safe_lib}) { $self->{safe_lib} = Safe::World->new(sharepack => ['Bio::DB::SeqFeature', 'Bio::Graphics::Feature', 'Bio::SeqFeature::Lite', 'Bio::Graphics::Glyph', ]) or return; $self->{safe_lib}->eval(<{safe_context} = Safe::World->new(root => $self->base2package) or return; $self->{safe_context}->op_permit_only(':default'); $self->{safe_context}->link_world($self->{safe_lib}); $self->{safe_world} = $safe; } return $self->{safe_world}; } =over 4 =item $features-Eset_callback_source($type,$tag,$value) =item $features-Eget_callback_source($type,$tag) These routines are used internally to get and set the source of a sub {} callback. =back =cut sub set_callback_source { my $self = shift; my ($type,$tag,$value) = @_; $self->{source}{$type}{lc $tag} = $value; } sub get_callback_source { my $self = shift; my ($type,$tag) = @_; $self->{source}{$type}{lc $tag}; } =over 4 =item @args = $features-Estyle($type) Given a feature type, returns a list of track configuration arguments suitable for suitable for passing to the Bio::Graphics::Panel-Eadd_track() method. =back =cut # turn configuration into a set of -name=>value pairs suitable for add_track() sub style { my $self = shift; my $type = shift; my $config = $self->{config} or return; my $hashref = $config->{$type}; unless ($hashref) { $type =~ s/:.+$//; $hashref = $config->{$type} or return; } return map {("-$_" => $hashref->{$_})} keys %$hashref; } =over 4 =item $glyph = $features-Eglyph($type); Return the name of the glyph corresponding to the given type (same as $features-Esetting($type=E'glyph')). =back =cut # retrieve just the glyph part of the configuration sub glyph { my $self = shift; my $type = shift; my $config = $self->{config} or return; my $hashref = $config->{$type} or return; return $hashref->{glyph}; } =over 4 =item @types = $features-Econfigured_types() Return a list of all the feature types currently known to the feature file set. Roughly equivalent to: @types = grep {$_ ne 'general'} $features->setting; =back =cut # return list of configured types, in proper order sub configured_types { my $self = shift; my $types = $self->{types} or return; return @$types; } sub labels { return shift->configured_types; } =over 4 =item @types = $features-Etypes() This is similar to the previous method, but will return *all* feature types, including those that are not configured with a stanza. =back =cut sub types { my $self = shift; my $db = $self->db; $self->_patch_old_bioperl; return $self->db->types; } sub _patch_old_bioperl { my $self = shift; if ($Bio::Root::Version::VERSION >= 1.0069 && $Bio::Root::Version::VERSION <= 1.006901 ) { # bad version! local $^W=0; *Bio::DB::SeqFeature::Store::memory::types = sub { my $self = shift; eval "require Bio::DB::GFF::Typename" unless Bio::DB::GFF::Typename->can('new'); my @types; for my $primary_tag ( keys %{$$self{_index}{type}} ) { for my $source_tag ( keys %{$$self{_index}{type}{$primary_tag}} ) { push @types, Bio::DB::GFF::Typename->new($primary_tag,$source_tag); } } return @types; } } } =over 4 =item $features = $features-Efeatures($type) Return a list of all the feature types of type "$type". If the featurefile object was created by parsing a file or text scalar, then the features will be of type Bio::Graphics::Feature (which follow the Bio::FeatureI interface). Otherwise the list will contain objects of whatever type you added with calls to add_feature(). Two APIs: 1) original API: # Reference to an array of all features of type "$type" $features = $features-Efeatures($type) # Reference to an array of all features of all types $features = $features-Efeatures() # A list when called in a list context @features = $features-Efeatures() 2) Bio::Das::SegmentI API: @features = $features-Efeatures(-type=>['list','of','types']); # variants $features = $features-Efeatures(-type=>['list','of','types']); $features = $features-Efeatures(-type=>'a type'); $iterator = $features-Efeatures(-type=>'a type',-iterator=>1); $iterator = $features-Efeatures(-type=>'a type',-seq_id=>$id,-start=>$start,-end=>$end); =back =cut # return features sub features { my $self = shift; my ($types,$iterator,$seq_id,$start,$end,@rest) = defined($_[0] && $_[0]=~/^-/) ? rearrange([['TYPE','TYPES'],'ITERATOR','SEQ_ID','START','END'],@_) : (\@_); $types = [$types] if $types && !ref($types); my @args = $types && @$types ? (-type=>$types) : (); push @args,(-seq_id => $seq_id) if $seq_id; push @args,(-start => $start) if defined $start; push @args,(-end => $end) if defined $end; my $db = $self->db; if ($iterator) { return $db->get_seq_stream(@args); } else { my @f = $db->features(@args); return wantarray ? @f : \@f; } } =over 4 =item @features = $features-Efeatures($type) Return a list of all the feature types of type "$type". If the featurefile object was created by parsing a file or text scalar, then the features will be of type Bio::Graphics::Feature (which follow the Bio::FeatureI interface). Otherwise the list will contain objects of whatever type you added with calls to add_feature(). =back =cut sub make_strand { local $^W = 0; return +1 if $_[0] =~ /^\+/ || $_[0] > 0; return -1 if $_[0] =~ /^\-/ || $_[0] < 0; return 0; } =head2 get_seq_stream Title : get_seq_stream Usage : $stream = $s->get_seq_stream(@args) Function: get a stream of features that overlap this segment Returns : a Bio::SeqIO::Stream-compliant stream Args : see below Status : Public This is the same as feature_stream(), and is provided for Bioperl compatibility. Use like this: $stream = $s->get_seq_stream('exon'); while (my $exon = $stream->next_seq) { print $exon->start,"\n"; } =cut sub get_seq_stream { my $self = shift; local $^W = 0; my @args = $_[0] =~ /^-/ ? (@_,-iterator=>1) : (-types=>\@_,-iterator=>1); $self->features(@args); } =head2 get_feature_by_name Usage : $db->get_feature_by_name(-name => $name) Function: fetch features by their name Returns : a list of Bio::DB::GFF::Feature objects Args : the name of the desired feature Status : public This method can be used to fetch a named feature from the file. The full syntax is as follows. Features can be filtered by their reference, start and end positions @f = $db->get_feature_by_name(-name => $name, -ref => $sequence_name, -start => $start, -end => $end); This method may return zero, one, or several Bio::Graphics::Feature objects. =cut sub get_feature_by_name { my $self = shift; my ($name,$ref,$start,$end) = rearrange(['NAME','REF','START','END'],@_); my @args; push @args,(-name => $name) if defined $name; push @args,(-seq_id => $ref) if defined $ref; push @args,(-start => $start)if defined $start; push @args,(-end => $end) if defined $end; return $self->db->features(@args); } sub get_features_by_name { shift->get_feature_by_name(@_) } =head2 search_notes Title : search_notes Usage : @search_results = $db->search_notes("full text search string",$limit) Function: Search the notes for a text string Returns : array of results Args : full text search string, and an optional row limit Status : public Each row of the returned array is a arrayref containing the following fields: column 1 Display name of the feature column 2 The text of the note column 3 A relevance score. =cut sub search_notes { my $self = shift; return $self->db->search_notes(@_); } =head2 get_feature_stream(), top_SeqFeatures(), all_SeqFeatures() Provided for compatibility with older BioPerl and/or Bio::DB::GFF APIs. =cut *get_feature_stream = \&get_seq_stream; *top_SeqFeatures = *all_SeqFeatures = \&features; =over 4 =item @refs = $features-Erefs Return the list of reference sequences referred to by this data file. =back =cut sub refs { my $self = shift; my $refs = $self->{refs} or return; keys %$refs; } =over 4 =item $min = $features-Emin Return the minimum coordinate of the leftmost feature in the data set. =back =cut sub min { my $self = shift; $self->_min_max(); $self->{min}; } =over 4 =item $max = $features-Emax Return the maximum coordinate of the rightmost feature in the data set. =back =cut sub max { my $self = shift; $self->_min_max(); $self->{max}; } sub _min_max { my $self = shift; return if defined $self->{min} and defined $self->{max}; my ($min,$max); if (my $bases = $self->setting(general=>'bases')) { ($min,$max) = $bases =~ /^(-?\d+)(?:\.\.|-)(-?\d+)/; } if (!defined $min) { # otherwise sort through the features my $fs = $self->get_seq_stream; while (my $f = $fs->next_seq) { $min = $f->start if !defined $min or $min > $f->start; $max = $f->end if !defined $max or $max < $f->start; } } @{$self}{'min','max'} = ($min,$max); } sub init_parse { my $s = shift; $s->{max} = $s->{min} = undef; $s->{types} = []; $s->{features} = {}; $s->{config} = {}; $s->{loader} = undef; $s->{state} = 'config'; $s->{feature_count}= 0; } sub finish_parse { my $s = shift; if ($s->safe) { $s->initialize_code; $s->evaluate_coderefs; } elsif ($s->safe_world) { $s->evaluate_safecoderefs; } $s->{loader}->finish_load() if $s->{loader}; $s->{loader} = undef; $s->{state} = 'config'; } sub evaluate_coderefs { my $self = shift; for my $s ($self->_setting) { for my $o ($self->_setting($s)) { $self->code_setting($s,$o); } } } sub evaluate_safecoderefs { my $self = shift; for my $s ($self->_setting) { for my $o ($self->_setting($s)) { $self->safe_setting($s,$o); } } } sub clean_code { my $self = shift; for my $s ($self->_setting) { for my $o ($self->_setting($s)) { $self->_setting($s,$o,1) if $self->_setting($s,$o) =~ /\Asub\s*{/; } } } sub initialize_code { my $self = shift; my $package = $self->base2package; my $init_code = $self->_setting(general => 'init_code') or return; my $code = "package $package; $init_code; 1;"; eval $code; $self->_callback_complain(general=>'init_code') if $@; } sub base2package { my $self = shift; return $self->{base2package} if exists $self->{base2package}; my $rand = int rand(1000000); return $self->{base2package} = "Bio::Graphics::FeatureFile::CallBack::P$rand"; } sub split_group { my $self = shift; my $gff = $self->{gff} ||= Bio::DB::GFF->new(-adaptor=>'memory'); return $gff->split_group(shift, $self->{gff_version} > 2); } # create a panel if needed sub new_panel { my $self = shift; my $options = shift; eval "require Bio::Graphics::Panel" unless Bio::Graphics::Panel->can('new'); # general configuration of the image here my $width = $self->setting(general => 'pixels') || $self->setting(general => 'width') || WIDTH; my ($start,$stop); my $range_expr = '(-?\d+)(?:-|\.\.)(-?\d+)'; if (my $bases = $self->setting(general => 'bases')) { ($start,$stop) = $bases =~ /([\d-]+)(?:-|\.\.)([\d-]+)/; } if (!defined $start || !defined $stop) { $start = $self->min unless defined $start; $stop = $self->max unless defined $stop; } my $new_segment = Bio::Graphics::Feature->new(-start=>$start,-stop=>$stop); my @panel_options = %$options if $options && ref $options eq 'HASH'; my $panel = Bio::Graphics::Panel->new(-segment => $new_segment, -width => $width, -key_style => 'between', $self->style('general'), @panel_options ); $panel; } =over 4 =item $mtime = $features-Emtime =item $atime = $features-Eatime =item $ctime = $features-Ectime =item $size = $features-Esize Returns stat() information about the data file, for featurefile objects created using the -file option. Size is in bytes. mtime, atime, and ctime are in seconds since the epoch. =back =cut sub mtime { my $self = shift; my $d = $self->{m_time} || $self->{stat}->[9]; $self->{m_time} = shift if @_; $d; } sub atime { shift->{stat}->[8]; } sub ctime { shift->{stat}->[10]; } sub size { shift->{stat}->[7]; } =over 4 =item $label = $features-Efeature2label($feature) Given a feature, determines the configuration stanza that bests describes it. Uses the feature's type() method if it has it (DasI interface) or its primary_tag() method otherwise. =back =cut sub feature2label { my $self = shift; my $feature = shift; my $type = $feature->can('type') ? $feature->type : $feature->primary_tag; $type or return; (my $basetype = $type) =~ s/:.+$//; my @labels = $self->type2label($type); @labels = $self->type2label($basetype) unless @labels; @labels = ($type) unless @labels; wantarray ? @labels : $labels[0]; } =over 4 =item $link = $features-Elink_pattern($linkrule,$feature,$panel) Given a feature, tries to generate a URL to link out from it. This uses the 'link' option, if one is present. This method is a convenience for the generic genome browser. =back =cut sub link_pattern { my $self = shift; my ($linkrule,$feature,$panel,$dont_escape) = @_; $panel ||= 'Bio::Graphics::Panel'; if (ref($linkrule) && ref($linkrule) eq 'CODE') { my $val = eval {$linkrule->($feature,$panel)}; $self->_callback_complain(none=>"linkrule for $feature") if $@; return $val; } require CGI unless defined &CGI::escape; my $escape_method = $dont_escape ? sub {shift} : \&CGI::escape; my $n; $linkrule ||= ''; # prevent uninit warning my $seq_id = $feature->can('seq_id') ? $feature->seq_id() : $feature->location->seq_id(); $seq_id ||= $feature->seq_id; #fallback $linkrule =~ s!\$(\w+)! $escape_method->( $1 eq 'ref' ? (($n = $seq_id) && "$n") || '' : $1 eq 'name' ? (($n = $feature->display_name) && "$n") || '' : $1 eq 'class' ? eval {$feature->class} || '' : $1 eq 'type' ? eval {$feature->method} || $feature->primary_tag || '' : $1 eq 'method' ? eval {$feature->method} || $feature->primary_tag || '' : $1 eq 'source' ? eval {$feature->source} || $feature->source_tag || '' : $1 =~ 'seq_?id' ? eval{$feature->seq_id} || eval{$feature->location->seq_id} || '' : $1 eq 'start' ? $feature->start || '' : $1 eq 'end' ? $feature->end || '' : $1 eq 'stop' ? $feature->end || '' : $1 eq 'segstart' ? $panel->start || '' : $1 eq 'segend' ? $panel->end || '' : $1 eq 'length' ? $feature->length || 0 : $1 eq 'description' ? eval {join '',$feature->notes} || '' : $1 eq 'id' ? eval {$feature->feature_id} || eval {$feature->primary_id} || '' : '$'.$1 ) !exg; return $linkrule; } sub make_link { my $self = shift; my ($feature,$panel) = @_; my ($linkrule) = $feature->each_tag_value('link'); unless ($linkrule) { for my $label ($self->feature2label($feature)) { $linkrule ||= $self->setting($label,'link'); $linkrule ||= $self->setting(general=>'link'); } } return $self->link_pattern($linkrule,$feature,$panel); } sub make_title { my $self = shift; my $feature = shift; for my $label ($self->feature2label($feature)) { my $linkrule = $self->setting($label,'title'); $linkrule ||= $self->setting(general=>'title'); next unless $linkrule; return $self->link_pattern($linkrule,$feature,undef,1); } my $method = eval {$feature->method} || $feature->primary_tag; my $seqid = $feature->can('seq_id') ? $feature->seq_id : $feature->location->seq_id; my $title = eval { if ($feature->can('target') && (my $target = $feature->target)) { join (' ', $method, (defined $seqid ? "$seqid:" : ''). $feature->start."..".$feature->end, $feature->target.':'. $feature->target->start."..".$feature->target->end); } else { join(' ', $method, $feature->can('display_name') ? $feature->display_name : $feature->info, (defined $seqid ? "$seqid:" : ''). ($feature->start||'?')."..".($feature->end||'?') ); } }; warn $@ if $@; $title; } # given a feature type, return its label(s) sub type2label { my $self = shift; my $type = shift; $self->{_type2label} ||= $self->invert_types; my @labels = keys %{$self->{_type2label}{lc $type}}; wantarray ? @labels : $labels[0] } sub invert_types { my $self = shift; my $config = $self->{config} or return; my %inverted; for my $label (keys %{$config}) { my $feature = $config->{$label}{feature} || $label; foreach (shellwords($feature||'')) { $inverted{lc $_}{$label}++; } } \%inverted; } =over 4 =item $citation = $features-Ecitation($feature) Given a feature, tries to generate a citation for it, using the "citation" option if one is present. This method is a convenience for the generic genome browser. =back =cut # This routine returns the "citation" field. It is here in order to simplify the logic # a bit in the generic browser sub citation { my $self = shift; my $feature = shift || 'general'; return $self->setting($feature=>'citation'); } =over 4 =item $name = $features-Ename([$feature]) Get/set the name of this feature set. This is a convenience method useful for keeping track of multiple feature sets. =back =cut # give this feature file a nickname sub name { my $self = shift; my $d = $self->{name}; $self->{name} = shift if @_; $d; } 1; __END__ =head1 Appendix -- Sample Feature File # file begins [general] pixels = 1024 bases = 1-20000 reference = Contig41 height = 12 [mRNA] glyph = gene key = Spliced genes [Cosmid] glyph = segments fgcolor = blue key = C. elegans conserved regions [EST] glyph = segments bgcolor= yellow connector = dashed height = 5; [FGENESH] glyph = transcript2 bgcolor = green description = 1 mRNA B0511.1 Chr1:1..100 Type=UTR;Note="putative primase" mRNA B0511.1 Chr1:101..200,300..400,500..800 Type=CDS mRNA B0511.1 Chr1:801..1000 Type=UTR reference = Chr3 Cosmid B0511 516..619 Cosmid B0511 3185..3294 Cosmid B0511 10946..11208 Cosmid B0511 13126..13511 Cosmid B0511 11394..11539 EST yk260e10.5 15569..15724 EST yk672a12.5 537..618,3187..3294 EST yk595e6.5 552..618 EST yk595e6.5 3187..3294 EST yk846e07.3 11015..11208 EST yk53c10 yk53c10.3 15000..15500,15700..15800 yk53c10.5 18892..19154 EST yk53c10.5 16032..16105 SwissProt PECANEX 13153-13656 Note="Swedish fish" FGENESH "Predicted gene 1" 1-205,518-616,661-735,3187-3365,3436-3846 "Pfam domain" # file ends =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/ConfiguratorI.pm�������������������������������������������������000555��001750��001750�� 10427�12366325116� 22216� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������# BioPerl module for Bio::Graphics::ConfiguratorI # # Cared for by Robert Hubley # # Copyright Robert Hubley # # You may distribute this module under the same terms as perl itself # POD documentation - main docs before the code =head1 NAME Bio::Graphics::ConfiguratorI - A sectioned map of configuration options (a map of maps), with a default section. Intended to augment existing tag-Evalue semantics (ie. of Bio::AnnotationCollectionI) for object-representation information (eg. foreground color), and for general interface preferences (eg. image width in gbrowse). =head1 SYNOPSIS # get a ConfiguratorI somehow my $fg_color = $configurator->get('fgcolor'); =head1 DESCRIPTION This object contains various configuration parameters. It is divided up into sections and tags. This is essentially a multi-level map (section-Etag-Evalue). There is also the concept of a default section which is referenced when no section is passed to the ConfiguratorI methods. =head1 FEEDBACK =head2 Mailing Lists User feedback is an integral part of the evolution of this and other Bioperl modules. Send your comments and suggestions preferably to the Bioperl mailing list. Your participation is much appreciated. bioperl-l@bioperl.org - General discussion http://bioperl.org/wiki/Mailing_lists - About the mailing lists =head2 Reporting Bugs Report bugs to the Bioperl bug tracking system to help us keep track of the bugs and their resolution. Bug reports can be submitted via the web: http://bugzilla.open-bio.org/ =head1 AUTHOR - Robert Hubley Email rhubley@systemsbiology.org =head1 CONTRIBUTORS Paul Edlefsen, pedlefsen@systemsbiology.org Lincoln Stein, lstein@cshl.org Heikki Lehvaslaiho, heikki-at-bioperl-dot-org =head1 APPENDIX The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _ =cut # Let the code begin... package Bio::Graphics::ConfiguratorI; use strict; use Carp; use base qw(Bio::Root::RootI); =head2 get_sections Title : get_sections Usage : my @values = $configurator->get_sections(); Function: Returns a list of the valid sections except the default or undef. Returns : A list of the sections which can be queried. Args : (optional section as string, tag as string) =cut sub get_sections { my ($self) = @_; $self->throw_not_implemented(); } =head2 get_tags Title : get_tags Usage : my @values = $configurator->get_tags(); or my @values = $configurator->get_tags('dna'); Function: Returns a list of tags for a given section or only the default tags section if no section is given. Returns : A scalar list of tags Args : =cut sub get_tags { my ($self) = @_; $self->throw_not_implemented(); } =head2 get Title : get Usage : my $value = $configurator->get('height'); or my $value = $configurator->get('dna','height'); Function: Returns a tag value from a configurator from the either the default "_general" section or from a specified section or undef. Returns : A scalar value for the tag Args : (optional section as string, tag as string) =cut sub get { my ($self) = @_; $self->throw_not_implemented(); } =head2 set Title : set Usage : $configurator->set('fgcolor','chartreuse'); or $configurator->set('EST','fgcolor','chartreuse'); Function: Set a value for a tag Returns : The old value of the tag Args : (optional section as string, tag as string, value as scalar) =cut sub set { my ($self) = @_; $self->throw_not_implemented(); } =head2 get_and_eval Title : get_and_eval Usage : my $value = $configurator->get_and_eval('height'); or my $value = $configurator->get_and_eval('dna','height'); Function: This works like get() except that it is also able to evaluate code references. These are options whose values begin with the characters "sub {". In this case the value will be passed to an eval() and the resulting codereference returned. Returns : A value of the tag or undef. Args : (optional section as string, tag as string) =cut sub get_and_eval { my ($self) = @_; $self->throw_not_implemented(); } 1; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/Feature.pm�������������������������������������������������������000555��001750��001750�� 27513�12366325116� 21042� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Bio::Graphics::Feature; =head1 NAME Bio::Graphics::Feature - A simple feature object for use with Bio::Graphics::Panel =head1 SYNOPSIS use Bio::Graphics::Feature; # create a simple feature with no internal structure $f = Bio::Graphics::Feature->new(-start => 1000, -stop => 2000, -type => 'transcript', -name => 'alpha-1 antitrypsin', -desc => 'an enzyme inhibitor', ); # create a feature composed of multiple segments, all of type "similarity" $f = Bio::Graphics::Feature->new(-segments => [[1000,1100],[1500,1550],[1800,2000]], -name => 'ABC-3', -type => 'gapped_alignment', -subtype => 'similarity'); # build up a gene exon by exon $e1 = Bio::Graphics::Feature->new(-start=>1,-stop=>100,-type=>'exon'); $e2 = Bio::Graphics::Feature->new(-start=>150,-stop=>200,-type=>'exon'); $e3 = Bio::Graphics::Feature->new(-start=>300,-stop=>500,-type=>'exon'); $f = Bio::Graphics::Feature->new(-segments=>[$e1,$e2,$e3],-type=>'gene'); =head1 DESCRIPTION This is a simple Bio::SeqFeatureI-compliant object that is compatible with Bio::Graphics::Panel. With it you can create lightweight feature objects for drawing. All methods are as described in L with the following additions: =head2 The new() Constructor $feature = Bio::Graphics::Feature->new(@args); This method creates a new feature object. You can create a simple feature that contains no subfeatures, or a hierarchically nested object. Arguments are as follows: -seq_id the reference sequence -start the start position of the feature -end the stop position of the feature -stop an alias for end -name the feature name (returned by seqname()) -type the feature type (returned by primary_tag()) -primary_tag the same as -type -source the source tag -score the feature score (for GFF compatibility) -desc a description of the feature -segments a list of subfeatures (see below) -subtype the type to use when creating subfeatures -strand the strand of the feature (one of -1, 0 or +1) -phase the phase of the feature (0..2) -id an alias for -name -seqname an alias for -name -display_id an alias for -name -display_name an alias for -name (do you get the idea the API has changed?) -primary_id unique database ID -url a URL to link to when rendered with Bio::Graphics -configurator an object (like a Bio::Graphics::FeatureFile) that knows how to configure the graphical representation of the object based on its type. -attributes a hashref of tag value attributes, in which the key is the tag and the value is an array reference of values -factory a reference to a feature factory, used for compatibility with more obscure parts of Bio::DB::GFF The subfeatures passed in -segments may be an array of Bio::Graphics::Feature objects, or an array of [$start,$stop] pairs. Each pair should be a two-element array reference. In the latter case, the feature type passed in -subtype will be used when creating the subfeatures. If no feature type is passed, then it defaults to "feature". =head2 Non-SeqFeatureI methods A number of new methods are provided for compatibility with Ace::Sequence, which has a slightly different API from SeqFeatureI: =over 4 =item attributes() An alternative interface to get_tag_values. Pass the name of an attribute to get the value(s) of that attribute: $expression_level = $gene->attributes('expression'); Call attributes() without any arguments to get a hash of all attributes: %attributes = $gene->attributes; =item url() Get/set the URL that the graphical rendering of this feature will link to. =item add_segment(@segments) Add one or more segments (a subfeature). Segments can either be Feature objects, or [start,stop] arrays, as in the -segments argument to new(). The feature endpoints are automatically adjusted. =item my @features = get_SeqFeatures('type1','type2','type3'...) Get the subfeatures of this feature. If an optional list of types is provided, then only returns subfeatures with the indicated primary_tag. (This is an extension of the Bio::SeqFeatureI interface). =item $feature->add_hit($hit) For nucleotide alignments, add a feature that is a "hit" on the feature. =item $hit = $feature->hit Return the hit. =cut sub add_hit { my $self = shift; my $hit = shift; $self->{_hit} = $hit; } sub hit { shift->{_hit} } sub get_SeqFeatures { my $self = shift; my %filter = map {$_=>1} @_; my @pieces = %filter ? grep {$filter{$_->primary_tag}} $self->SUPER::get_SeqFeatures() : $self->SUPER::get_SeqFeatures; return @pieces; } sub each_tag_value { my $self = shift; my $tag = shift; my $value = $self->{attributes}{$tag} or return; my $ref = CORE::ref $value; return $ref && $ref eq 'ARRAY' ? @{$self->{attributes}{$tag}} : $self->{attributes}{$tag}; } =item segments() An alias for get_SeqFeatures(). =item get_all_SeqFeatures() Alias for get_SeqFeatures() =item merged_segments() Another alias for sub_SeqFeature(). =item stop() An alias for end(). =item name() An alias for seqname(). =item exons() An alias for sub_SeqFeature() (you don't want to know why!) =item configurator() Get/set the configurator that knows how to adjust the graphical representation of this feature based on its type. Currently the only configurator that will work is Bio::Graphics::FeatureFile. =back =cut use strict; use base 'Bio::SeqFeature::Lite'; # usage: # Bio::Graphics::Feature->new( # -start => 1, # -end => 100, # -name => 'fred feature', # -strand => +1); # # Alternatively, use -segments => [ [start,stop],[start,stop]...] # to create a multisegmented feature. sub new { my $self = shift->SUPER::new(@_); my %arg = @_; for my $option (qw(factory configurator)) { $self->{$option} = $arg{"-$option"} if exists $arg{"-$option"}; } $self; } =head2 factory Title : factory Usage : $factory = $obj->factory([$new_factory]) Function: Returns the feature factory from which this feature was generated. Mostly for compatibility with weird dependencies in gbrowse. Returns : A feature factory Args : None =cut sub factory { my $self = shift; my $d = $self->{factory}; $self->{factory} = shift if @_; $d; } =head2 display_name Title : display_name Usage : $id = $obj->display_name or $obj->display_name($newid); Function: Gets or sets the display id, also known as the common name of the Seq object. The semantics of this is that it is the most likely string to be used as an identifier of the sequence, and likely to have "human" readability. The id is equivalent to the LOCUS field of the GenBank/EMBL databanks and the ID field of the Swissprot/sptrembl database. In fasta format, the >(\S+) is presumed to be the id, though some people overload the id to embed other information. Bioperl does not use any embedded information in the ID field, and people are encouraged to use other mechanisms (accession field for example, or extending the sequence object) to solve this. Notice that $seq->id() maps to this function, mainly for legacy/convenience issues. Returns : A string Args : None or a new id =head2 accession_number Title : accession_number Usage : $unique_biological_key = $obj->accession_number; Function: Returns the unique biological id for a sequence, commonly called the accession_number. For sequences from established databases, the implementors should try to use the correct accession number. Notice that primary_id() provides the unique id for the implemetation, allowing multiple objects to have the same accession number in a particular implementation. For sequences with no accession number, this method should return "unknown". Returns : A string Args : None =head2 alphabet Title : alphabet Usage : if( $obj->alphabet eq 'dna' ) { /Do Something/ } Function: Returns the type of sequence being one of 'dna', 'rna' or 'protein'. This is case sensitive. This is not called because this would cause upgrade problems from the 0.5 and earlier Seq objects. Returns : a string either 'dna','rna','protein'. NB - the object must make a call of the type - if there is no type specified it has to guess. Args : none Status : Virtual =head2 desc Title : desc Usage : $seqobj->desc($string) or $seqobj->desc() Function: Sets or gets the description of the sequence Example : Returns : The description Args : The description or none =head2 location Title : location Usage : my $location = $seqfeature->location() Function: returns a location object suitable for identifying location of feature on sequence or parent feature Returns : Bio::LocationI object Args : none =head2 location_string Title : location_string Usage : my $string = $seqfeature->location_string() Function: Returns a location string in a format recognized by gbrowse Returns : a string Args : none This is a convenience function used by the generic genome browser. It returns the location of the feature and its subfeatures in the compact form "start1..end1,start2..end2,...". Use $seqfeature-Elocation()-EtoFTString() to obtain a standard GenBank/EMBL location representation. =head2 configurator Title : configurator Usage : my $configurator = $seqfeature->configurator([$new_configurator]) Function: Get/set an object that provides configuration information for this feature Returns : configurator object Args : new configurator object (optional) A configurator object provides hints to the Bio::Graphics::Feature as to how to display itself on a canvas. Currently this stores the Bio::Graphics::FeatureFile and descendents. =cut # get/set the configurator (Bio::Graphics::FeatureFile) for this feature sub configurator { my $self = shift; my $d = $self->{configurator}; $self->{configurator} = shift if @_; $d; } =head2 url Title : url Usage : my $url = $seqfeature->url([$new_url]) Function: Get/set the URL associated with this feature Returns : a URL string Args : new URL (optional) Features link to URLs when displayed as a clickable image map. This field holds that information. =cut # get/set the url for this feature sub url { my $self = shift; my $d = $self->{url}; $self->{url} = shift if @_; $d; } =head2 make_link Title : make_link Usage : my $url = $seqfeature->make_link() Function: Create a URL for the feature Returns : a URL string Args : none This method will invoke the configurator in order to turn the feature into a link. Used by Bio::Graphics::Panel to create imagemaps. =cut # make a link sub make_link { my $self = shift; if (my $url = $self->url) { return $url; } elsif (my $configurator = $self->configurator) { return $configurator->make_link($self) if $configurator->can('make_link'); } else { return; } } 1; __END__ =head1 SEE ALSO L,L, L L =head1 AUTHOR Lincoln Stein Elstein@cshl.eduE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/Wiggle.pm��������������������������������������������������������000555��001750��001750�� 64366�12366325116� 20674� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Bio::Graphics::Wiggle; =head1 NAME Bio::Graphics::Wiggle -- Binary storage for dense genomic features =head1 SYNOPSIS # all positions are 1-based my $wig = Bio::Graphics::Wiggle->new('./test.wig', $writeable, { seqid => $seqid, start => $start, step => $step, min => $min, max => $max }); $wig->erase; my $seqid = $wig->seqid('new_id'); my $max = $wig->max($new_max); my $min = $wig->min($new_min); my $step = $wig->step($new_step); # data stored at modulus step == 0; all else is blank $wig->set_value($position => $value); # store $value at position $wig->set_values($position => \@values); # store array of values at position $wig->set_range($start=>$end,$value); # store the same $value from $start to $end my $value = $wig->value($position); # fetch value from position my $values = $wig->values($start,$end); # fetch range of data from $start to $end $wig->window(100); # sample window size $wig->smoothing('mean'); # when sampling, compute the mean value across sample window my $values = $wig->values($start,$end,$samples); # fetch $samples data points from $start to $end =head1 DESCRIPTION IMPORTANT NOTE: This implementation is still not right. See http://genomewiki.ucsc.edu/index.php/Wiggle for a more space-efficient implementation. This module stores "wiggle" style quantitative genome data for display in a genome browser application. The data for each chromosome (or contig, or other reference sequence) is stored in a single file in the following format: 256 byte header 50 bytes seqid, zero-terminated C string 4 byte long integer, value of "step" (explained later) 4 byte perl native float, the "min" value 4 byte perl native float, the "max" value 4 byte long integer, value of "span" 4 byte perl native float, the mean 4 byte perl native float, the standard deviation 2 byte unsigned short, the version number (currently version 0) 4 byte long integer, sequence start position (in 0-based coordinates) null padding to 256 bytes for future use The remainder of the file consists of 8-bit unsigned scaled integer values. This means that all quantitative data will be scaled to 8-bit precision! For a convenient method of creating Wiggle files from UCSC-type WIG input and creating GFF3 output, please see L. =head1 METHODS =head2 Constructor and Accessors =over 4 =item $wig = Bio::Graphics::Wiggle->new($filename,$writeable,{options}) Open/create a wiggle-format data file: $filename -- path to the file to open/create $writeable -- boolean value indicating whether file is writeable. Missing files will only be created if $writeable set to a true value. If path is empty (undef or empty string) and writeable is true, new() will create a temporary file that will be deleted when the object goes out of scope. {options} -- hash ref of the following named options, only valid when creating a new wig file with $writeable true. option name description default ----------- ----- ------- seqid name/id of sequence empty name min minimum value of data points 0 max maximum value of data points 255 step interval between data points 1 span width of data points value of "step" The "step" can be used to create sparse files to save space. By default, step is set to 1, in which case a data value will be stored at each base of the sequence. By setting step to 10, then each value is taken to correspond to 10 bp, and the file will be 10x smaller. For example, consider this step 5 data set: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 20 . . . . 60 . . . . 80 . . . We have stored the values "20" "60" and "80" at positions 1, 6 and 11, respectively. When retrieving this data, it will appear as if positions 1 through 5 have a value of 20, positions 6-10 have a value of 60, and positions 11-14 have a value of 80. In the data file, we store, positions 1,6,and 11 in adjacent bytes. Note that no locking is performed by this module. If you wish to allow multi-user write access to the databases files, you will need to flock() the files yourself. =item $seqid = $wig->seqid(['new_id']) =item $max = $wig->max([$new_max]) =item $min = $wig->min([$new_min]) =item $step = $wig->step([$new_step]) =item $span = $wig->span([$new_span]) =item $mean = $wig->mean([$new_mean]); =item $stdev = $wig->stdev([$new_stdev]); These accessors get or set the corresponding values. Setting is only allowed if the file was opened for writing. Note that changing the min, max and step after writing data to the file under another parameter set will produce unexpected (and invalid) results, as the existing data is not automatically updated to be consistent. =item $trim = $wig->trim([$new_trim]); The trim method sets the trimming method, which can be used to trim out extreme values. Three methods are currently supported: none No trimming stdev Trim 1 standard deviation above and below mean stdevN Trim N standard deviations above and below the mean In "stdevN", any can be any positive integer. =back =head2 Setting Data =over 4 =item $wig->set_value($position => $value) This method sets the value at $position to $value. If a step>1 is in force, then $position will be rounded down to the nearest multiple of step. =item $wig->set_range($start=>$end, $value) This method sets the value of all bases between $start and $end to $value, honoring step. =item $sig->set_values($position => \@values) This method writes an array of values into the datababase beginning at $position (or the nearest lower multiple of step). If step>1, then values will be written at step intervals. =back =head2 Retrieving Data =over 4 =item $value = $wig->value($position) Retrieve the single data item at position $position, or the nearest lower multiple of $step if step>1. =item $values = $wig->values($start=>$end) Retrieve the values in the range $start to $end and return them as an array ref. Note that you will always get an array of size ($end-$start+1) even if step>1; the data in between the step intervals will be filled in. =item $values = $wig->values($start=>$end,$samples) Retrieve a sampling of the values between $start and $end. Nothing very sophisticated is done here; the code simply returns the number of values indicated in $samples, smoothed according to the smoothing method selected (default to "mean"), then selected at even intervals from the range $start to $end. The return value is an arrayref of exactly $samples values. =item $string = $wig->export_to_wif($start,$end) =item $string = $wig->export_to_wif64($start,$end) Export the region from start to end in the "wif" format. This data can later be imported into another Bio::Graphics::Wiggle object. The first version returns a binary string. The second version returns a base64 encoded version that is safe for ascii-oriented formata such as GFF3 and XML. =item $wig->import_from_wif($string) =item $wig->import_from_wif64($string) Import a wif format data string into the Bio::Graphics::Wiggle object. The first version expects a binary string. The second version expects a base64 encoded version that is safe for ascii-oriented formata such as GFF3 and XML. =back =cut # read/write genome tiling data, to be compatible with Jim Kent's WIG format use strict; use warnings; use IO::File; use Carp 'croak','carp','confess'; use constant HEADER_LEN => 256; # seqid, step, min, max, span, mean, stdev, version, start use constant HEADER => '(Z50LFFLFFSL)@'.HEADER_LEN; use constant BODY => 'C'; use constant DEBUG => 0; use constant DEFAULT_SMOOTHING => 'mean'; use constant VERSION => 0; our $VERSION = '1.0'; sub new { my $class = shift; my ($path,$write,$options) = @_; $path ||= ''; # to avoid uninit warning my $mode = $write ? -e $path # if file already exists... ? '+<' # ...open for read/write : '+>' # ...else clobber and open a new one : '<'; # read only my $fh = $class->new_fh($path,$mode); $fh or die (($path||'temporary file').": $!"); $options ||= {}; my $self = bless {fh => $fh, write => $write, dirty => scalar keys %$options }, ref $class || $class; my $stored_options = eval {$self->_readoptions} || {}; $options->{start}-- if defined $options->{start}; # 1-based ==> 0-based coordinates my %merged_options = (%$stored_options,%$options); # warn "merged options = ",join ' ',%merged_options; $merged_options{version}||= 0; $merged_options{seqid} ||= 'chrUnknown'; $merged_options{min} ||= 0; $merged_options{max} ||= 255; $merged_options{mean} ||= 128; $merged_options{stdev} ||= 255; $merged_options{trim} ||= 'none'; $merged_options{step} ||= 1; $merged_options{start} ||= 0; $merged_options{span} ||= $merged_options{step}; $self->{options} = \%merged_options; $self->_do_trim unless $self->trim eq 'none'; return $self; } sub new_fh { my $self = shift; my ($path,$mode) = @_; return $path ? IO::File->new($path,$mode) : IO::File->new_tmpfile; } sub end { my $self = shift; unless (defined $self->{end}) { my $size = (stat($self->fh))[7]; my $data_len = $size - HEADER_LEN(); return unless $data_len>0; # undef end $self->{end} = ($self->start-1) + $data_len * $self->step; } return $self->{end}; } sub DESTROY { shift->write } sub erase { my $self = shift; $self->fh->truncate(HEADER_LEN); } sub fh { shift->{fh} } sub seek { shift->fh->seek(shift,0) } sub tell { shift->fh->tell() } sub _option { my $self = shift; my $option = shift; my $d = $self->{options}{$option}; if (@_) { $self->{dirty}++; $self->{options}{$option} = shift; delete $self->{scale} if $option eq 'min' or $option eq 'max'; } return $d; } sub version { shift->_option('version',@_) } sub seqid { shift->_option('seqid',@_) } sub min { shift->_option('min',@_) } sub max { shift->_option('max',@_) } sub step { shift->_option('step',@_) } sub span { shift->_option('span',@_) } sub mean { shift->_option('mean',@_) } sub stdev { shift->_option('stdev',@_) } sub trim { shift->_option('trim',@_) } sub start { # slightly different because we have to deal with 1 vs 0-based coordinates my $self = shift; my $start = $self->_option('start'); $start++; # convert into 1-based coordinates if (@_) { my $newstart = shift; $self->_option('start',$newstart-1); # store in zero-based coordinates } return $start; } sub smoothing { my $self = shift; my $d = $self->{smoothing} || DEFAULT_SMOOTHING; $self->{smoothing} = shift if @_; $d; } sub write { my $self = shift; if ($self->{dirty} && $self->{write}) { $self->_writeoptions($self->{options}); undef $self->{dirty}; $self->fh->flush; } } sub _readoptions { my $self = shift; my $fh = $self->fh; my $header; $fh->seek(0,0); return unless $fh->read($header,HEADER_LEN) == HEADER_LEN; return $self->_parse_header($header); } sub _parse_header { my $self = shift; my $header = shift; my ($seqid,$step,$min,$max,$span, $mean,$stdev,$version,$start) = unpack(HEADER,$header); return { seqid => $seqid, step => $step, span => $span, min => $min, max => $max, mean => $mean, stdev => $stdev, version => $version, start => $start, }; } sub _generate_header { my $self = shift; my $options = shift; return pack(HEADER,@{$options}{qw(seqid step min max span mean stdev version start)}); } sub _writeoptions { my $self = shift; my $options = shift; my $fh = $self->fh; my $header = $self->_generate_header($options); $fh->seek(0,0); $fh->print($header) or die "write failed: $!"; } sub _do_trim { my $self = shift; # don't trim if there is no score range ($self->max - $self->min) or return; my $trim = lc $self->trim; my ($method,$arg); if ($trim =~ /([a-z]+)(\d+)/) { $method = "_trim_${1}"; $arg = $2; } else { $method = "_trim_${trim}"; } unless ($self->can($method)) { carp "invalid trim method $trim"; return; } $self->$method($arg); } # trim n standard deviations from the mean sub _trim_stdev { my $self = shift; my $factor = shift || 1; my $mean = $self->mean; my $stdev = $self->stdev * $factor; my $min = $self->min > $mean - $stdev ? $self->min : $mean - $stdev; my $max = $self->max < $mean + $stdev ? $self->max : $mean + $stdev; warn "_trim_stdev (* $factor) : setting min to $min, max to $max (was ",$self->min,',',$self->max,')' if DEBUG; $self->min($min); $self->max($max); } sub set_value { my $self = shift; croak "usage: \$wig->set_value(\$position => \$value)" unless @_ == 2; $self->value(@_); } sub set_range { my $self = shift; croak "usage: \$wig->set_range(\$start_position => \$end_position, \$value)" unless @_ == 3; $self->value(@_); } sub value { my $self = shift; my $position = shift; my $offset = $self->_calculate_offset($position); $offset >= HEADER_LEN or die "Tried to retrieve data from before start position"; $self->seek($offset) or die "Seek failed: $!"; if (@_ == 2) { my $end = shift; my $new_value = shift; my $step = $self->step; my $scaled_value = $self->scale($new_value); $self->fh->print(pack('C*',($scaled_value)x(($end-$position+1)/$step))) or die "Write failed: $!"; $self->{end} = $end if !exists $self->{end} || $self->{end} < $end; } elsif (@_==1) { my $new_value = shift; my $scaled_value = $self->scale($new_value); $self->fh->print(pack('C*',$scaled_value)) or die "Write failed: $!"; $self->{end} = $position if !exists $self->{end} || $self->{end} < $position; return $new_value; } else { # retrieving data my $buffer; $self->fh->read($buffer,1) or die "Read failed: $!"; my $scaled_value = unpack('C*',$buffer); # missing data, so look back at most span values to get it if ($scaled_value == 0 && (my $span = $self->span) > 1) { $offset = $self->_calculate_offset($position-$span+1); $offset >= HEADER_LEN or die "Tried to retrieve data from before start position"; $self->seek($offset) or die "Seek failed: $!"; $self->fh->read($buffer,$span/$self->step); for (my $i=length($buffer)-2;$i>=0;$i--) { my $val = substr($buffer,$i,1); next if $val eq "\0"; $scaled_value = unpack('C*',$val); last; } } return $self->unscale($scaled_value); } } sub _calculate_offset { my $self = shift; my $position = shift; my $step = $self->step; my $start = $self->start; return HEADER_LEN + int(($position-$start)/$step); } sub set_values { my $self = shift; croak "usage: \$wig->set_values(\$position => \@values)" unless @_ == 2 and ref $_[1] eq 'ARRAY'; $self->values(@_); } # read or write a series of values sub values { my $self = shift; my $start = shift; if (ref $_[0] && ref $_[0] eq 'ARRAY') { $self->_store_values($start,@_); } else { $self->_retrieve_values($start,@_); } } sub export_to_wif64 { my $self = shift; my $data = $self->export_to_wif(@_); eval "require MIME::Base64" unless MIME::Base64->can('encode_base64'); return MIME::Base64::encode_base64($data); } sub import_from_wif64 { my $self = shift; my $data = shift; eval "require MIME::Base64" unless MIME::Base64->can('decode_base64'); return $self->import_from_wif(MIME::Base64::decode_base64($data)); } # subregion in "wiggle interchange format" (wif) sub export_to_wif { my $self = shift; my ($start,$end) = @_; # get the 256 byte header my $data = $self->_generate_header($self->{options}); # add the range to the data (8 bytes overhead) $data .= pack("L",$start); $data .= pack("L",$end); # add the packed data for this range $data .= $self->_retrieve_packed_range($start,$end-$start+1,$self->step); return $data; } sub export_to_bedgraph { my $self = shift; my ($start,$end,$fh) = @_; my $max_range = 100_000; $start ||= 1; $end ||= $self->end; my $lines; for (my $s=$start;$s<$end;$s+=$max_range) { my $e = $s + $max_range - 1; $e = $end if $e > $end; my $b = $self->values($s,$e); $lines .= $self->_bedgraph_lines($s,$b,$fh); } return $lines; } sub _bedgraph_lines { my $self = shift; my ($start,$values,$fh) = @_; my $seqid = $self->seqid; my $result; my ($last_val,$last_start,$end); $last_start = $start-1; # 0 based indexing for (my $i=0;$i<@$values;$i++) { my $v = $values->[$i]; if (!defined $v) { if (defined $last_val) { $result .= $self->_append_or_print_bedgraph($fh,$seqid,$last_start,$start+$i-1,$last_val); undef $last_val; } $last_start = $start+$i; next; } if (defined $last_val && $last_val != $v) { $result .= $self->_append_or_print_bedgraph($fh,$seqid,$last_start,$start+$i-1,$last_val); $last_start = $start+$i-1; } $last_val = $v; $end = $start+$i-1; } $result .= $self->_append_or_print_bedgraph($fh,$seqid,$last_start,$end+1,$last_val) if $last_val; return $result; } sub _append_or_print_bedgraph { my $self = shift; my ($fh,$seqid,$start,$end,$val) = @_; my $data = join("\t",$seqid,$start,$end,sprintf("%.2f",$val))."\n"; if ($fh) { print $fh $data; return ''; } else { return $data; } } sub import_from_wif { my $self = shift; my $wifdata = shift; # BUG: should check that header is compatible my $header = substr($wifdata,0,HEADER_LEN); my $start = unpack('L',substr($wifdata,HEADER_LEN, 4)); my $end = unpack('L',substr($wifdata,HEADER_LEN+4,4)); my $options = $self->_parse_header($header); my $stored_options = eval {$self->_readoptions} || {}; my %merged_options = (%$stored_options,%$options); $self->{options} = \%merged_options; $self->{dirty}++; # write the data $self->seek($self->_calculate_offset($start)); $self->fh->print(substr($wifdata,HEADER_LEN+8)) or die "write failed: $!"; $self->{end} = $end if !defined $self->{end} or $self->{end} < $end; } sub _retrieve_values { my $self = shift; my ($start,$end,$samples) = @_; my $data_start = $self->start; my $step = $self->step; my $span = $self->span; croak "Value of start position ($start) is less than data start of $data_start" unless $start >= $data_start; croak "Value of end position ($end) is greater than data end of ",$self->end+$span, unless $end <= $self->end + $span; # generate list of positions to sample from my $length = $end-$start+1; $samples ||= $length; # warn "samples = $samples, length=$length, span=$span, step=$step"; # if the length is grossly greater than the samples, then we won't even # bother fetching all the data, but just sample into the disk file if ($length/$samples > 100 && $step == 1) { my @result; # my $window = 20*($span/$step); my $interval = $length/$samples; # my $window = 100*$interval/$span; my $window = $interval/2; # warn "window = $window, interval = $interval"; for (my $i=0;$i<$samples;$i++) { my $packed_data = $self->_retrieve_packed_range(int($start+$i*$interval-$window), int($window), $step); my @bases= grep {$_} unpack('C*',$packed_data); if (@bases) { local $^W = 0; my $arry = $self->unscale(\@bases); my $n = @$arry; my $total = 0; $total += $_ foreach @$arry; my $mean = $total/$n; my $max; for (@$arry) { $max = $_ if !defined $max || $max < $_ } # warn $start+$i*$interval,': ',join(',',map {int($_)} @$arry), # " mean = $mean, max = $max"; # push @result,$mean; push @result,$max; } else { push @result,0; } } return \@result; } my $packed_data = $self->_retrieve_packed_range($start,$length,$step); my @bases; $#bases = $length-1; if ($step == $span) { # in this case, we do not have any partially-empty # steps, so can operate on the step-length data structure # directly @bases = unpack('C*',$packed_data); } else { # In this case some regions may have partially missing data, # so we create an array equal to the length of the requested region, # fill it in, and then sample it for (my $i=0; $iunscale(\@bases); $r = $self->sample($r,$samples); $r = $self->smooth($r,$self->window * $samples/@bases) if defined $self->window && $self->window>1; return $r; } sub _retrieve_packed_range { my $self = shift; my ($start,$length,$step) = @_; my $span = $self->span; my $offset = $self->_calculate_offset($start); $self->seek($offset); my $packed_data; $self->fh->read($packed_data,$length/$step); # pad data up to required amount $packed_data .= "\0" x ($length/$step-length($packed_data)) if length $packed_data < $length/$step; return $packed_data; } sub sample { my $self = shift; my ($values,$samples) = @_; my $length = @$values; my $window_size = $length/$samples; my @samples; $#samples = $samples-1; if ($window_size < 2) { # no data smoothing needed @samples = map { $values->[$_*$window_size] } (0..$samples-1); } else { my $smoothsub = $self->smoothsub; for (my $i=0; $i<$samples; $i++) { my $start = $i * $window_size; my $end = $start + $window_size - 1; my @window = @{$values}[$start..$end]; my $value = $smoothsub->(\@window); $samples[$i] = $value; } } return \@samples; } sub smoothsub { my $self = shift; my $smoothing = $self->smoothing; my $smoothsub = $smoothing eq 'mean' ? \&sample_mean :$smoothing eq 'max' ? \&sample_max :$smoothing eq 'min' ? \&sample_min :$smoothing eq 'none' ? \&sample_center :croak("invalid smoothing type '$smoothing'"); return $smoothsub; } sub smooth { my ($self,$data,$window) = @_; my $smoothing = $self->smoothing; $window ||= $self->window; return $data if $smoothing eq 'none' || $window < 2; my @data = @$data; my $smoother = $self->smoothsub; $window++ unless $window % 2; my $offset = int($window/2); for (my $i=$offset; $i<@$data-$offset; $i++) { my $start = $i - $offset; my $end = $i + $offset; my @subset = @data[$start..$end]; $data->[$i] = $smoother->(\@subset); } return $data; } sub window { my $self = shift; my $d = $self->{window}; $self->{window} = shift if @_; $d; } sub sample_mean { my $values = shift; my ($total,$items); for my $v (@$values) { next unless defined $v; $items++; $total+=$v; } return $items ? $total/$items : undef; } sub sample_max { my $values = shift; my $max; for my $v (@$values) { next unless defined $v; $max = $v if !defined $max or $max < $v; } return $max; } sub sample_min { my $values = shift; my $min; for my $v (@$values) { next unless defined $v; $min = $v if !defined $min or $min > $v; } return $min; } sub sample_center { my $values = shift; return $values->[@$values/2]; } sub _store_values { my $self = shift; my ($position,$data) = @_; # where does data start my $offset = $self->_calculate_offset($position); my $fh = $self->fh; my $step = $self->step; my $scaled = $self->scale($data); $self->seek($offset); my $packed_data = pack('C*',@$scaled); $fh->print($packed_data) or die "Write failed: $!"; my $new_end = $position+@$data-1; $self->{end} = $new_end if !exists $self->{end} || $self->{end} < $new_end; } # zero means "no data" # everything else is scaled from 1-255 sub scale { my $self = shift; my $values = shift; my $scale = $self->_get_scale; my $min = $self->{options}{min}; if (ref $values && ref $values eq 'ARRAY') { my @return = map { my $i = ($_ - $min)/$scale; my $v = 1 + int($i+0.5*($i<=>0)); # avoid call to round() $v = 1 if $v < 1; $v = 255 if $v > 255; $v; } @$values; return \@return; } else { my $v = 1 + round (($values - $min)/$scale); $v = 1 if $v < 1; $v = 255 if $v > 255; return $v; } } sub unscale { my $self = shift; my $values = shift; my $scale = $self->_get_scale; my $min = $self->{options}{min}; if (ref $values && ref $values eq 'ARRAY') { my @return = map {$_ ? (($_-1) * $scale + $min) : undef} @$values; return \@return; } else { return $values ? ($values-1) * $scale + $min : undef; } } sub _get_scale { my $self = shift; unless ($self->{scale}) { my $min = $self->{options}{min}; my $max = $self->{options}{max}; my $range = $max - $min || 0.001; # can't be zero! $self->{scale} = $range/254; } return $self->{scale}; } sub round { return int($_[0]+0.5*($_[0]<=>0)); } 1; __END__ =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE. Copyright (c) 2007 Cold Spring Harbor Laboratory This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/RendererI.pm�����������������������������������������������������000555��001750��001750�� 5126�12366325116� 21302� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������=head1 NAME Bio::Graphics::RendererI - A renderer for the Bio::Graphics class that renders Bio::SeqFeature::CollectionI objects onto Bio::Graphics::Panels using configuration information provided by a Bio::Graphics::ConfiguratorI. =head1 SYNOPSIS # Get a renderer somehow, called $renderer # create a new panel and render contents a feature collection onto it my $config = new ConfigIO( $config_file )->getConfig(); my $features = $data_provider->getCollection(); my ( $tracks_rendered, $panel ) = $renderer->render( $features, $prefs ); =head1 DESCRIPTION Renderer of Bio::SeqFeature::CollectionIs (collections of features) onto a Bio::Graphics::Panel using a Bio::Graphics::ConfiguratorI for general and track-specific rendering options. =head1 FEEDBACK =head2 Mailing Lists User feedback is an integral part of the evolution of this and other Bioperl modules. Send your comments and suggestions preferably to the Bioperl mailing list. Your participation is much appreciated. bioperl-l@bioperl.org - General discussion http://bioperl.org/wiki/Mailing_lists - About the mailing lists =head2 Reporting Bugs Report bugs to the Bioperl bug tracking system to help us keep track of the bugs and their resolution. Bug reports can be submitted via the web: http://bugzilla.open-bio.org/ =head1 AUTHOR Paul Edlefsen Epaul@systemsbiology.orgE. Copyright (c) 2003 Institute for Systems Biology This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =head1 APPENDIX The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _ =cut # Let the code begin... package Bio::Graphics::RendererI; use strict; use base qw(Bio::Root::RootI); =head2 render Title : render Usage : ( $rendered, $panel ) = $renderer->render( $collection, $configurator [, $panel ] ); Function: Renders the SeqFeatures in the given collection onto a Bio::Graphics::Panel (if no panel is given, one will be created), using the given Bio::Graphics::ConfiguratorI for general and track-specific rendering options. Returns : In a scalar context returns the number of tracks rendered. In a list context, returns a two-element list containing the number of features rendered and the panel. Args : A Bio::SeqFeature::CollectionI and a Bio::Graphics::ConfiguratorI and optionally a Bio::Graphics::Panel. Status : Public =cut sub render { shift->throw_not_implemented(); } 1; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/DrawTransmembrane.pm���������������������������������������������000555��001750��001750�� 136020�12366325116� 23075� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Bio::Graphics::DrawTransmembrane; use strict; use warnings; use GD; use base 'Bio::Root::Root'; my %DRAWOPTIONS = ( ## general parameters 'topology' => { 'private' => 'topology_array', 'default' => []}, 'topology_string' => { 'private' => 'topology_string', 'default' => 0}, 'n_terminal' => { 'private' => 'n_term', 'default' => 'out', }, 'title' => { 'private' => 'title', 'default' => ''}, 'inside_label' => { 'private' => 'in', 'default' => "Cytoplasmic"}, 'outside_label' => { 'private' => 'out', 'default' => "Extracellular"}, 'membrane_label' => { 'private' => 'membrane', 'default' => "Plasma Membrane"}, ## dimensions 'helix_height' => { 'private' => 'helix_height', 'default' => 130}, 'helix_width' => { 'private' => 'helix_width', 'default' => 50}, 'loop_width' => { 'private' => 'loop_width', 'default' => 20}, 'vertical_padding' => { 'private' => 'vertical_padding', 'default' => 140}, 'horizontal_padding' => { 'private' => 'horizontal_padding', 'default' => 150}, 'membrane_offset' => { 'private' => 'offset', 'default' => 6}, ## loop lengths and limits 'short_loop_height' => { 'private' => 'short_loop', 'default' => 90}, 'medium_loop_height' => { 'private' => 'medium_loop', 'default' => 120}, 'long_loop_height' => { 'private' => 'long_loop', 'default' => 150}, 'short_loop_limit' => { 'private' => 'short_loop_limit', 'default' => 15}, 'long_loop_limit' => { 'private' => 'long_loop_limit', 'default' => 30}, 'n_terminal_height' => { 'private' => 'n_terminal_height', 'default' => 150}, 'c_terminal_height' => { 'private' => 'c_terminal_height', 'default' => 80}, 'loop_heights' => { 'private' => 'loop_heights', 'default' => {}}, 'n_terminal_offset' => { 'private' => 'n_term_offset', 'default' => 0}, 'c_terminal_offset' => { 'private' => 'c_term_offset', 'default' => 0}, ## colour scheme & display options 'show_labels' => { 'private' => 'labels', 'default' => 'on'}, 'bold_helices' => { 'private' => 'bold_helices', 'default' => 1}, 'bold_labels' => { 'private' => 'bold_labels', 'default' => 0}, 'colour_scheme' => { 'private' => 'scheme', 'default' => 'yellow'}, 'draw_cytosol' => { 'private' => 'draw_cytosol', 'default' => 0}, 'draw_bilayer' => { 'private' => 'draw_bilayer', 'default' => 1}, 'draw_loops' => { 'private' => 'draw_loops', 'default' => 1}, 'draw_terminai' => { 'private' => 'draw_terminai', 'default' => 1}, 'draw_helices' => { 'private' => 'draw_helices', 'default' => 1}, ## labeling options 'labels' => { 'private' => 'loop_labels', 'default' => {}}, 'text_offset' => { 'private' => 'text_offset', 'default' => 0}, 'helix_label' => { 'private' => 'helix_label', 'default' => 'S'}, 'n_term_label' => { 'private' => 'n_term_label', 'default' => 'N-Terminal'}, 'c_term_label' => { 'private' => 'c_term_label', 'default' => 'C-Terminal'}, 'dontsort' => { 'private' => 'dontsort', 'default' => 0}, 'ttf_font' => { 'private' => 'ttf_font', 'default' => 0}, 'ttf_font_size' => { 'private' => 'ttf_font_size', 'default' => 8}, ); sub new { my ($class, @args) = @_; my $self = $class->SUPER::new(@args); my %opt = @args; %opt = map {my $k = $_; $k =~ s{^-}{}; $k => $opt{$_}} keys %opt; # need to shore up private variables, check for req'd parameters for my $param (sort keys %DRAWOPTIONS) { my ($priv, $def) = ($DRAWOPTIONS{$param}->{'private'},$DRAWOPTIONS{$param}->{'default'}); $self->{$priv} = (exists $opt{$param}) ? $opt{$param} : $def; } $self->{'loop_count'} = 1; return $self; } sub png { my $self = shift; my @numeric = ('helix_height','helix_width','loop_width','vertical_padding','horizontal_padding','short_length','medium_loop_length','long_loop_length','short_loop_limit','long_loop_limit','n_terminal_height','membrane_offset','text_offset','n_term_offset','c_term_offset'); foreach (@numeric){ die "\nParameter $_ must be numeric.\n\n" if exists $self->{$_} && $self->{$_} =~ /-{?}\D+/; } foreach (keys %{$self->{'loop_labels'}}){ die "\nLabel position $_ must be numeric.\n\n" if $_ =~ /\D+/; } foreach (keys %{$self->{'loop_heights'}}){ die "\nLoop number $_ must be numeric.\n\n" if $_ =~ /\D+/; } foreach (values %{$self->{'loop_heights'}}){ die "\nLoop height $_ must be numeric.\n\n" if $_ =~ /\D+/; } ## n-terminal defaults to outside in it's not in,inside,out,outside $self->{'n_term'} = 'out' if (($self->{'n_term'} ne 'in')&&($self->{'n_term'} ne 'inside')&&($self->{'n_term'} ne 'out')||$self->{'n_term'} eq 'outside'); $self->{'n_term'} = 'in' if $self->{'n_term'} eq 'inside'; if ($self->{'topology_string'}){ $self->{'topology_string'} =~ s/\D\.//g; $self->{'topology_string'} =~ s/;/,/g; @{$self->{'topology_array'}} = split(/,/,$self->{'topology_string'}); } ## check to make sure we have pairs of helix boundaries and that data is numeric otherwise quit if (scalar @{$self->{'topology_array'}} % 2){ die "\nUneven number of helix boundaries.\n\n"; } foreach (@{$self->{'topology_array'}}){ if ($_ =~ /\D/){ die "\nTopology data is not numeric. $_\n\n"; } } ## check to make sure the TTF font exists, otherwise use gdSmallFont if ($self->{'ttf_font'}){ unless (-e $self->{'ttf_font'}){ print "\nCan't find font ".$self->{'ttf_font'}.".\n"; $self->{'ttf_font'} = 0; } } my @sorted_topology = sort {$a <=> $b} @{$self->{'topology_array'}}; ## Don't automatically sort the topology array @sorted_topology = @{$self->{'topology_array'}} if $self->{'dontsort'}; $self->{'helix_count'} = scalar @{$self->{'topology_array'}} / 2; unless ($self->{'helix_count'}){ die "\nNo topology data found.\n\n"; } ## put helix start/stop points in $self->{'helix_span'} and loop lengths in $self->{'loop_length'} foreach (0..($self->{'helix_count'} - 1)){ my $count = $_ * 2; $self->{'helix_span'}{$_ + 1}{'start'} = $sorted_topology[$count]; $self->{'helix_span'}{$_ + 1}{'stop'} = $sorted_topology[$count + 1]; $self->{'loop_length'}{$_ + 1} = scalar ($sorted_topology[$count + 2] - $sorted_topology[$count + 1]) unless ($_ + 1 == $self->{'helix_count'}); } $self->{'width'} = ($self->{'horizontal_padding'} * 2) + ($self->{'helix_width'} * $self->{'helix_count'}) + ($self->{'loop_width'} * ($self->{'helix_count'} - 1)); $self->{'height'} = $self->{'helix_height'} + ($self->{'vertical_padding'} * 2); ## create a new image $self->{'im'} = new GD::Image($self->{'width'},$self->{'height'}); $self->{'black'} = $self->{'im'}->colorAllocate(0,0,0); $self->{'white'} = $self->{'im'}->colorAllocate(255,255,255); $self->{'im'}->fill(0,0,$self->{'white'}); ## write title if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,4,12,$self->{'title'},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'title'}; }else{ $self->{'im'}->string(gdSmallFont,4,3,$self->{'title'},$self->{'black'}) if $self->{'title'}; } $self->draw_cytosol if $self->{'draw_cytosol'}; $self->draw_bilayer if $self->{'draw_bilayer'}; $self->draw_loops if $self->{'draw_loops'}; $self->draw_terminai if $self->{'draw_terminai'}; $self->draw_helices if $self->{'draw_helices'}; ## use GD to convert to png return $self->{'im'}->GD::Image::png; } sub add_tmhmm_feat { my $self = shift; my $feat = shift; #print Dumper $feat; ## add a helix from a tmhmm feature if ($feat->{'_primary_tag'} eq 'transmembrane'){ push @{$self->{'topology_array'}},$feat->{'_location'}{'_start'}; push @{$self->{'topology_array'}},$feat->{'_location'}{'_end'}; } ## i've made a few changes to TmHmm.pm to include the inside/outside loops. ## this bit looks for the topology of the 1st residue so we can now position the n-terminal if ($feat->{'_location'}{'_start'} == 1){ if ($feat->{'_primary_tag'} =~ /(\w+)_loop/){ $self->{'n_term'} = $1; } } return $self; } sub draw_cytosol { my $self = shift; my $cytosol_offset = 5; my $light_grey = $self->{'im'}->colorAllocate(164,164,164); ## draw cytosol $self->{'im'}->filledRectangle(($self->{'horizontal_padding'} / 3) ,($self->{'vertical_padding'} + $self->{'helix_height'} - $cytosol_offset),($self->{'width'} - ($self->{'horizontal_padding'} / 3)),($self->{'vertical_padding'} + ($self->{'helix_height'} * 2 ) + $cytosol_offset),$light_grey); return $self; } sub draw_bilayer { my $self = shift; my $dark_grey = $self->{'im'}->colorAllocate(40,40,40); my $dark_grey1 = $self->{'im'}->colorAllocate(50,50,50); my $dark_grey2 = $self->{'im'}->colorAllocate(60,60,60); my $dark_grey3 = $self->{'im'}->colorAllocate(70,70,70); ## label either side of membrane if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'horizontal_padding'} / 3) + 2,($self->{'vertical_padding'} + $self->{'offset'} - 3),$self->{'out'},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'horizontal_padding'} / 3) + 2,($self->{'vertical_padding'} + $self->{'helix_height'} - $self->{'offset'} + 12),$self->{'in'},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'horizontal_padding'} / 3) + 2,($self->{'vertical_padding'} + $self->{'offset'} - 14),$self->{'out'},$self->{'black'}) if $self->{'labels'}; $self->{'im'}->string(gdSmallFont,($self->{'horizontal_padding'} / 3) + 2,($self->{'vertical_padding'} + $self->{'helix_height'} - $self->{'offset'} + 1),$self->{'in'},$self->{'black'}) if $self->{'labels'}; } ## draw membrane with graded fill $self->{'im'}->filledRectangle(($self->{'horizontal_padding'} / 3),($self->{'vertical_padding'} + $self->{'offset'}),($self->{'width'} - $self->{'horizontal_padding'} / 3),($self->{'vertical_padding'} + $self->{'helix_height'} - $self->{'offset'}),$dark_grey); $self->{'im'}->filledRectangle(($self->{'horizontal_padding'} / 3) + 1,($self->{'vertical_padding'} + $self->{'offset'}) + 1,($self->{'width'} - $self->{'horizontal_padding'} / 3) - 1,($self->{'vertical_padding'} + $self->{'helix_height'} - $self->{'offset'}) - 1,$dark_grey1); $self->{'im'}->filledRectangle(($self->{'horizontal_padding'} / 3) + 2,($self->{'vertical_padding'} + $self->{'offset'}) + 2,($self->{'width'} - $self->{'horizontal_padding'} / 3) - 2,($self->{'vertical_padding'} + $self->{'helix_height'} - $self->{'offset'}) - 2,$dark_grey2); $self->{'im'}->filledRectangle(($self->{'horizontal_padding'} / 3) + 3,($self->{'vertical_padding'} + $self->{'offset'}) + 3,($self->{'width'} - $self->{'horizontal_padding'} / 3) - 3,($self->{'vertical_padding'} + $self->{'helix_height'} - $self->{'offset'}) - 3,$dark_grey3); ## label membrane if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'white'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'horizontal_padding'} + ($self->{'helix_count'} * $self->{'helix_width'}) + (($self->{'helix_count'} - 1) * $self->{'loop_width'}) + 4) + 1,($self->{'vertical_padding'} + $self->{'helix_height'} - $self->{'offset'} - 3),$self->{'membrane'},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'horizontal_padding'} + ($self->{'helix_count'} * $self->{'helix_width'}) + (($self->{'helix_count'} - 1) * $self->{'loop_width'}) + 4) + 1,($self->{'vertical_padding'} + $self->{'helix_height'} - $self->{'offset'} - 14),$self->{'membrane'},$self->{'white'}) if $self->{'labels'}; } return $self; } sub draw_helices { my $self = shift; my $x = $self->{'horizontal_padding'}; my $y = $self->{'vertical_padding'}; my ($colour,$colour1,$colour2,$colour3,$colour4,$colour5,$colour6); if($self->{'scheme'} eq 'blue'){ $colour = $self->{'im'}->colorAllocate(90,160,255); $colour1 = $self->{'im'}->colorAllocate(80,150,255); $colour2 = $self->{'im'}->colorAllocate(70,140,255); $colour3 = $self->{'im'}->colorAllocate(60,130,255); $colour4 = $self->{'im'}->colorAllocate(50,120,255); $colour5 = $self->{'im'}->colorAllocate(40,110,255); $colour6 = $self->{'im'}->colorAllocate(30,100,255); }elsif($self->{'scheme'} eq 'pink'){ $colour = $self->{'im'}->colorAllocate(255,1,255); $colour1 = $self->{'im'}->colorAllocate(240,1,255); $colour2 = $self->{'im'}->colorAllocate(230,1,255); $colour3 = $self->{'im'}->colorAllocate(220,1,255); $colour4 = $self->{'im'}->colorAllocate(200,1,255); $colour5 = $self->{'im'}->colorAllocate(180,1,255); $colour6 = $self->{'im'}->colorAllocate(160,1,255); }elsif($self->{'scheme'} eq 'green'){ $colour = $self->{'im'}->colorAllocate(5,240,0); $colour1 = $self->{'im'}->colorAllocate(5,230,0); $colour2 = $self->{'im'}->colorAllocate(5,220,0); $colour3 = $self->{'im'}->colorAllocate(5,205,0); $colour4 = $self->{'im'}->colorAllocate(5,195,0); $colour5 = $self->{'im'}->colorAllocate(5,185,0); $colour6 = $self->{'im'}->colorAllocate(5,155,0); }elsif($self->{'scheme'} eq 'red'){ $colour = $self->{'im'}->colorAllocate(240,0,0); $colour1 = $self->{'im'}->colorAllocate(230,0,0); $colour2 = $self->{'im'}->colorAllocate(220,0,0); $colour3 = $self->{'im'}->colorAllocate(205,0,0); $colour4 = $self->{'im'}->colorAllocate(190,0,0); $colour5 = $self->{'im'}->colorAllocate(170,0,0); $colour6 = $self->{'im'}->colorAllocate(150,0,0); }elsif($self->{'scheme'} eq 'white'){ $colour = $self->{'white'}; $colour1 = $self->{'white'}; $colour2 = $self->{'white'}; $colour3 = $self->{'white'}; $colour4 = $self->{'white'}; $colour5 = $self->{'black'}; $colour6 = $self->{'black'}; }else{ ## default is yellow $colour = $self->{'im'}->colorAllocate(255,235,55); $colour1 = $self->{'im'}->colorAllocate(255,230,50); $colour2 = $self->{'im'}->colorAllocate(255,220,40); $colour3 = $self->{'im'}->colorAllocate(255,210,30); $colour4 = $self->{'im'}->colorAllocate(255,200,20); $colour5 = $self->{'im'}->colorAllocate(255,190,10); $colour6 = $self->{'im'}->colorAllocate(255,180,0); } for (1..$self->{'helix_count'}){ ## draw helix, with graduated fill $self->{'im'}->filledRectangle($x,$y,($x + $self->{'helix_width'})-1,($y + $self->{'helix_height'})-1,$colour6); $self->{'im'}->filledRectangle($x+1,$y+1,($x + $self->{'helix_width'})-1,($y + $self->{'helix_height'})-1,$colour5); $self->{'im'}->filledRectangle($x+2,$y+2,($x + $self->{'helix_width'})-2,($y + $self->{'helix_height'})-2,$colour4); $self->{'im'}->filledRectangle($x+3,$y+3,($x + $self->{'helix_width'})-3,($y + $self->{'helix_height'})-3,$colour3); $self->{'im'}->filledRectangle($x+4,$y+4,($x + $self->{'helix_width'})-4,($y + $self->{'helix_height'})-4,$colour2); $self->{'im'}->filledRectangle($x+5,$y+5,($x + $self->{'helix_width'})-5,($y + $self->{'helix_height'})-5,$colour1); $self->{'im'}->filledRectangle($x+6,$y+6,($x + $self->{'helix_width'})-6,($y + $self->{'helix_height'})-6,$colour); ## draw a white box around it if ($self->{'bold_helices'}){ $self->{'im'}->rectangle($x,$y,($x + $self->{'helix_width'}),($y + $self->{'helix_height'}),$self->{'black'}); $self->{'im'}->rectangle($x - 1,$y - 1,($x + $self->{'helix_width'} + 1),($y + $self->{'helix_height'} + 1),$self->{'white'}); }else{ $self->{'im'}->rectangle($x,$y,($x + $self->{'helix_width'}),($y + $self->{'helix_height'}),$self->{'white'}); } ## this is the text on each helix my $text = substr($self->{'helix_label'},0,1).$_; ## draw a white box in the centre and label the helix my $x_offset = 5; $x_offset = 8 if $_ >= 10; my $white_box = 12; $white_box = 17 if $_ >= 10; $self->{'im'}->filledRectangle(($x + ($self->{'helix_width'} / 2) - $x_offset) - 5,($y + ($self->{'helix_height'} / 2) - 7) - 3,$white_box + ($x + ($self->{'helix_width'} / 2) - $x_offset) + 3,12 + ($y + ($self->{'helix_height'} / 2) - 4),$colour1) if $self->{'labels'}; $self->{'im'}->filledRectangle(($x + ($self->{'helix_width'} / 2) - $x_offset) - 4,($y + ($self->{'helix_height'} / 2) - 7) - 2,$white_box + ($x + ($self->{'helix_width'} / 2) - $x_offset) + 2,12 + ($y + ($self->{'helix_height'} / 2) - 5),$colour2) if $self->{'labels'}; $self->{'im'}->filledRectangle(($x + ($self->{'helix_width'} / 2) - $x_offset) - 3,($y + ($self->{'helix_height'} / 2) - 7) - 1,$white_box + ($x + ($self->{'helix_width'} / 2) - $x_offset) + 1,12 + ($y + ($self->{'helix_height'} / 2) - 6),$colour3) if $self->{'labels'}; $self->{'im'}->filledRectangle(($x + ($self->{'helix_width'} / 2) - $x_offset) - 2,($y + ($self->{'helix_height'} / 2) - 7),$white_box + ($x + ($self->{'helix_width'} / 2) - $x_offset),12 + ($y + ($self->{'helix_height'} / 2) - 7),$self->{'white'}) if $self->{'labels'}; if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($x + ($self->{'helix_width'} / 2) - $x_offset - 1),($y + ($self->{'helix_height'} / 2) + 4),$text,{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($x + ($self->{'helix_width'} / 2) - $x_offset),($y + ($self->{'helix_height'} / 2) - 7),$text,$self->{'black'}) if $self->{'labels'}; } ## label start and end positions of helices $self->{'x'} = $x; $self->{'y'} = $y; if ($self->{'labels'}){ if (($self->{'n_term'} eq 'out')&&($_ % 2)){ $self->label_helix_o_i(); }elsif($self->{'n_term'} eq 'out'){ $self->label_helix_i_o(); }elsif(($self->{'n_term'} eq 'in')&&($_ % 2)){ $self->label_helix_i_o(); }else{ $self->label_helix_o_i(); } } $x = $self->{'horizontal_padding'} + ($_ * ($self->{'helix_width'} + $self->{'loop_width'})); } if ($self->{'labels'}){ $x = $self->{'horizontal_padding'}; $y = $self->{'vertical_padding'}; for (1..$self->{'helix_count'}){ my $y_mod = 0; foreach my $l (sort {$b <=> $a} keys %{$self->{'loop_labels'}}){ if (($l >= $self->{'helix_span'}{$_}{'start'})&&($l <= $self->{'helix_span'}{$_}{'stop'})){ my $label_length = 0; if ($self->{'ttf_font'}){ ## Might need to fiddle with this my $size_dif = $self->{'ttf_font_size'} - 8; $label_length = 6 + (6 * (length $self->{'loop_labels'}{$l}) + (8 * $size_dif)); }else{ $label_length = 9 + (6 * length $self->{'loop_labels'}{$l}); } if ($_ % 2){ if ($self->{'bold_labels'}){ $self->{'im'}->filledRectangle(($x + ($self->{'helix_width'} / 2)) + 5,($y + ($self->{'helix_height'} / 2) - 30) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2)) + 2,12 + ($y + ($self->{'helix_height'} / 2) - 24) + $y_mod,$self->{'black'}); my $b = new GD::Polygon; $b->addPt(($x + ($self->{'helix_width'} / 2)) + 4,($y + ($self->{'helix_height'} / 2) - 30) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $b->addPt(($x + ($self->{'helix_width'} / 2)) - 5,($y + ($self->{'helix_height'} / 2) - 21) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $b->addPt(($x + ($self->{'helix_width'} / 2)) + 4,($y + ($self->{'helix_height'} / 2) - 12) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $self->{'im'}->filledPolygon($b,$self->{'black'}); } ## add darker box $self->{'im'}->filledRectangle(($x + ($self->{'helix_width'} / 2)) + 6,($y + ($self->{'helix_height'} / 2) - 29) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2)) + 1,12 + ($y + ($self->{'helix_height'} / 2) - 25) + $y_mod,$colour6); ## add white box $self->{'im'}->filledRectangle(($x + ($self->{'helix_width'} / 2)) + 7,($y + ($self->{'helix_height'} / 2) - 28) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2)),12 + ($y + ($self->{'helix_height'} / 2) - 26) + $y_mod,$self->{'white'}); ## draw darker arrowhead my $poly = new GD::Polygon; $poly->addPt(($x + ($self->{'helix_width'} / 2)) + 5,($y + ($self->{'helix_height'} / 2) - 29) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $poly->addPt(($x + ($self->{'helix_width'} / 2)) - 3,($y + ($self->{'helix_height'} / 2) - 21) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $poly->addPt(($x + ($self->{'helix_width'} / 2)) + 5,($y + ($self->{'helix_height'} / 2) - 13) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $self->{'im'}->filledPolygon($poly,$colour6); ## draw white arrowhead my $poly2 = new GD::Polygon; $poly2->addPt(($x + ($self->{'helix_width'} / 2)) + 6,($y + ($self->{'helix_height'} / 2) - 28) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $poly2->addPt(($x + ($self->{'helix_width'} / 2)) - 1,($y + ($self->{'helix_height'} / 2) - 21) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $poly2->addPt(($x + ($self->{'helix_width'} / 2)) + 6,($y + ($self->{'helix_height'} / 2) - 14) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $self->{'im'}->filledPolygon($poly2,$self->{'white'}); ## add label if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($x + ($self->{'helix_width'} / 2)) + 10,($y + ($self->{'helix_height'} / 2) - 16) + $y_mod,$self->{'loop_labels'}{$l},{linespacing=>0.6,charmap => 'Unicode',}); }else{ $self->{'im'}->string(gdSmallFont,($x + ($self->{'helix_width'} / 2)) + 9,($y + ($self->{'helix_height'} / 2) - 27) + $y_mod,$self->{'loop_labels'}{$l},$self->{'black'}); } $y_mod = $y_mod - 19; }else{ if ($self->{'bold_labels'}){ $self->{'im'}->filledRectangle(($x + ($self->{'helix_width'} / 2)) + 5,($y + ($self->{'helix_height'} / 2) + 9) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2)) + 2,13 + ($y + ($self->{'helix_height'} / 2) + 15) + $y_mod,$self->{'black'}); my $b = new GD::Polygon; $b->addPt(($x + ($self->{'helix_width'} / 2)) + 4,($y + ($self->{'helix_height'} / 2) + 10) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $b->addPt(($x + ($self->{'helix_width'} / 2)) - 5,($y + ($self->{'helix_height'} / 2) + 19) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $b->addPt(($x + ($self->{'helix_width'} / 2)) + 4,($y + ($self->{'helix_height'} / 2) + 28) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $self->{'im'}->filledPolygon($b,$self->{'black'}); } ## add darker box $self->{'im'}->filledRectangle(($x + ($self->{'helix_width'} / 2)) + 6,($y + ($self->{'helix_height'} / 2) + 11) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2)) + 1,12 + ($y + ($self->{'helix_height'} / 2) + 15) + $y_mod,$colour6); ## add white box $self->{'im'}->filledRectangle(($x + ($self->{'helix_width'} / 2)) + 7,($y + ($self->{'helix_height'} / 2) + 12) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2)),12 + ($y + ($self->{'helix_height'} / 2) + 14) + $y_mod,$self->{'white'}); ## draw darker arrowhead my $poly = new GD::Polygon; $poly->addPt(($x + ($self->{'helix_width'} / 2)) + 5,($y + ($self->{'helix_height'} / 2) + 11) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $poly->addPt(($x + ($self->{'helix_width'} / 2)) - 3,($y + ($self->{'helix_height'} / 2) + 19) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $poly->addPt(($x + ($self->{'helix_width'} / 2)) + 5,($y + ($self->{'helix_height'} / 2) + 27) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $self->{'im'}->filledPolygon($poly,$colour6); ## draw white arrowhead my $poly2 = new GD::Polygon; $poly2->addPt(($x + ($self->{'helix_width'} / 2)) + 6,($y + ($self->{'helix_height'} / 2) + 12) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $poly2->addPt(($x + ($self->{'helix_width'} / 2)) - 1,($y + ($self->{'helix_height'} / 2) + 19) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $poly2->addPt(($x + ($self->{'helix_width'} / 2)) + 6,($y + ($self->{'helix_height'} / 2) + 26) + $y_mod,$label_length + ($x + ($self->{'helix_width'} / 2))); $self->{'im'}->filledPolygon($poly2,$self->{'white'}); ## add label if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($x + ($self->{'helix_width'} / 2)) + 10,($y + ($self->{'helix_height'} / 2) + 24) + $y_mod,$self->{'loop_labels'}{$l},{linespacing=>0.6,charmap => 'Unicode',}); }else{ $self->{'im'}->string(gdSmallFont,($x + ($self->{'helix_width'} / 2)) + 9,($y + ($self->{'helix_height'} / 2) + 12) + $y_mod,$self->{'loop_labels'}{$l},$self->{'black'}); } $y_mod = $y_mod + 19; } } } $x = $self->{'horizontal_padding'} + ($_ * ($self->{'helix_width'} + $self->{'loop_width'})); } } return $self; } sub draw_terminai { my $self = shift; my $loop_number = ($self->{'helix_count'} - 1); ## width of terminal $self->{'w'} = $self->{'helix_width'} + $self->{'loop_width'}; $self->{'cx'} = $self->{'horizontal_padding'} - ($self->{'loop_width'} / 2); $self->{'cy'} = $self->{'vertical_padding'}; ## draw N-terminal if ($self->{'n_term'} eq 'out'){ $self->{'im'}->arc(($self->{'cx'} - $self->{'n_term_offset'}),$self->{'cy'},($self->{'w'} + (2 * $self->{'n_term_offset'})),$self->{'n_terminal_height'},270,360,$self->{'black'}); if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'horizontal_padding'} - ($self->{'w'} / 2) - 33 - $self->{'n_term_offset'}),($self->{'cy'} - ($self->{'n_terminal_height'} / 2) + 5),$self->{'n_term_label'},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'horizontal_padding'} - ($self->{'w'} / 2) - 40 - $self->{'n_term_offset'}),($self->{'cy'} - ($self->{'n_terminal_height'} / 2) - 6),$self->{'n_term_label'},$self->{'black'}) if $self->{'labels'}; } ## label n-terminal my $y_mod = 0; foreach (sort {$b <=> $a} keys %{$self->{'loop_labels'}}){ if ($_ <= $self->{'helix_span'}{1}{'start'}){ if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'horizontal_padding'} - ($self->{'w'} / 2) - 33 - $self->{'n_term_offset'}),($self->{'cy'} - ($self->{'n_terminal_height'} / 2) - 6) - 4 + $y_mod,$self->{'loop_labels'}{$_},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'horizontal_padding'} - ($self->{'w'} / 2) - 40 - $self->{'n_term_offset'}),($self->{'cy'} - ($self->{'n_terminal_height'} / 2) - 6) - 15 + $y_mod,$self->{'loop_labels'}{$_},$self->{'black'}) if $self->{'labels'}; } $y_mod = $y_mod - 15; } } }else{ $self->{'cy'} = $self->{'cy'} + $self->{'helix_height'}; $self->{'im'}->arc(($self->{'cx'} - $self->{'n_term_offset'}),$self->{'cy'},($self->{'w'} + (2 * $self->{'n_term_offset'})),$self->{'n_terminal_height'},0,90,$self->{'black'}); if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'horizontal_padding'} - ($self->{'w'} / 2) - 33 - $self->{'n_term_offset'}),($self->{'cy'} + ($self->{'n_terminal_height'} / 2) + 5),$self->{'n_term_label'},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'horizontal_padding'} - ($self->{'w'} / 2) - 40 - $self->{'n_term_offset'}),($self->{'cy'} + ($self->{'n_terminal_height'} / 2) - 6),$self->{'n_term_label'},$self->{'black'}) if $self->{'labels'}; } ## label n-terminal my $y_mod = 0; foreach (sort {$a <=> $b} keys %{$self->{'loop_labels'}}){ if ($_ <= $self->{'helix_span'}{1}{'start'}){ if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'horizontal_padding'} - ($self->{'w'} / 2) - 33 - $self->{'n_term_offset'}),($self->{'cy'} + ($self->{'n_terminal_height'} / 2) - 6) + 26 + $y_mod,$self->{'loop_labels'}{$_},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'horizontal_padding'} - ($self->{'w'} / 2) - 40 - $self->{'n_term_offset'}),($self->{'cy'} + ($self->{'n_terminal_height'} / 2) - 6) + 15 + $y_mod,$self->{'loop_labels'}{$_},$self->{'black'}) if $self->{'labels'}; } $y_mod = $y_mod + 15; } } } $self->{'cx'} = ($self->{'helix_count'} * $self->{'helix_width'}) + (($self->{'helix_count'} - 1) * $self->{'loop_width'}) + $self->{'horizontal_padding'} + ($self->{'loop_width'} / 2); ## draw C-terminal if (($self->{'n_term'} eq 'out')&&($loop_number % 2)){ $self->draw_ext_c_term; }elsif($self->{'n_term'} eq 'out'){ $self->draw_int_c_term; }elsif(($self->{'n_term'} eq 'in')&&($loop_number % 2)){ $self->draw_int_c_term; }elsif($self->{'n_term'} eq 'in'){ $self->draw_ext_c_term; } return $self; } sub draw_loops { my $self = shift; $self->{'x'} = $self->{'horizontal_padding'} + ($self->{'helix_width'} / 2); $self->{'h'} = $self->{'medium_loop'}; $self->{'w'} = $self->{'helix_width'} + $self->{'loop_width'}; for (1..($self->{'helix_count'} - 1)){ ## Alter loop height according to its actual length if ($self->{'loop_length'}{$_} < $self->{'short_loop_limit'}){ $self->{'h'} = $self->{'short_loop'}; }elsif($self->{'loop_length'}{$_} > $self->{'long_loop_limit'}){ $self->{'h'} = $self->{'long_loop'}; } $self->{'l_start'} = $self->{'helix_span'}{$_}{'stop'}; $self->{'l_stop'} = $self->{'helix_span'}{$_ + 1}{'start'}; if (($self->{'n_term'} eq 'out')&&($_ % 2)){ $self->draw_int_loop; }elsif($self->{'n_term'} eq 'out'){ $self->draw_ext_loop; }elsif(($self->{'n_term'} eq 'in')&&($_ % 2)){ $self->draw_ext_loop; }elsif($self->{'n_term'} eq 'in'){ $self->draw_int_loop; } $self->{'x'} = $self->{'x'} + $self->{'helix_width'} + $self->{'loop_width'}; $self->{'x'} = $self->{'horizontal_padding'} if $_ == ($self->{'helix_count'} - 1); } return $self; } sub label_helix_o_i { my $self = shift; my $offset = 6; $offset = 3 if $self->{'helix_span'}{$_}{'start'} < 100; if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'x'} + ($self->{'helix_width'} / 2) - $offset) - 1,$self->{'y'} + 13,$self->{'helix_span'}{$_}{'start'},{linespacing=>0.6,charmap => 'Unicode',}); }else{ $self->{'im'}->string(gdSmallFont,($self->{'x'} + ($self->{'helix_width'} / 2) - $offset) - 1,$self->{'y'} + 1,$self->{'helix_span'}{$_}{'start'},$self->{'black'}); } $offset = 3 if $self->{'helix_span'}{$_}{'stop'} < 100; $offset = 6 if $self->{'helix_span'}{$_}{'stop'} >= 100; if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'x'} + ($self->{'helix_width'} / 2) - $offset) - 1,($self->{'y'} + $self->{'helix_height'} - 3),$self->{'helix_span'}{$_}{'stop'},{linespacing=>0.6,charmap => 'Unicode',}); }else{ $self->{'im'}->string(gdSmallFont,($self->{'x'} + ($self->{'helix_width'} / 2) - $offset) - 1,($self->{'y'} + $self->{'helix_height'} - 14),$self->{'helix_span'}{$_}{'stop'},$self->{'black'}); } return $self; } sub label_helix_i_o { my $self = shift; my $offset = 6; $offset = 3 if $self->{'helix_span'}{$_}{'stop'} < 100; if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'x'} + ($self->{'helix_width'} / 2) - $offset) - 1,$self->{'y'} + 13,$self->{'helix_span'}{$_}{'stop'},{linespacing=>0.6,charmap => 'Unicode',}); }else{ $self->{'im'}->string(gdSmallFont,($self->{'x'} + ($self->{'helix_width'} / 2) - $offset) - 1,$self->{'y'} + 1,$self->{'helix_span'}{$_}{'stop'},$self->{'black'}); } $offset = 3 if $self->{'helix_span'}{$_}{'start'} < 100; if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'x'} + ($self->{'helix_width'} / 2) - $offset) - 1,($self->{'y'} + $self->{'helix_height'} - 3),$self->{'helix_span'}{$_}{'start'},{linespacing=>0.6,charmap => 'Unicode',}); }else{ $self->{'im'}->string(gdSmallFont,($self->{'x'} + ($self->{'helix_width'} / 2) - $offset) - 1,($self->{'y'} + $self->{'helix_height'} - 14),$self->{'helix_span'}{$_}{'start'},$self->{'black'}); } return $self; } sub draw_int_c_term { my $self = shift; ## draw internal c-terminal $self->{'im'}->arc(($self->{'cx'} + $self->{'c_term_offset'}),($self->{'vertical_padding'} + $self->{'helix_height'}),($self->{'w'} + (2 * $self->{'c_term_offset'})),$self->{'c_terminal_height'},90,180,$self->{'black'}); if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'cx'} + 4 + $self->{'c_term_offset'}),(($self->{'vertical_padding'} + $self->{'helix_height'}) + ($self->{'c_terminal_height'} / 2) + 5),$self->{'c_term_label'},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'cx'} + 3 + $self->{'c_term_offset'}),(($self->{'vertical_padding'} + $self->{'helix_height'}) + ($self->{'c_terminal_height'} / 2) - 6),$self->{'c_term_label'},$self->{'black'}) if $self->{'labels'}; } ## label terminal if ($self->{'labels'}){ my $y_mod = 0; foreach (sort {$a <=> $b} keys %{$self->{'loop_labels'}}){ if ($_ >= $self->{'helix_span'}{$self->{'helix_count'}}{'stop'}){ if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'cx'} + 4 + $self->{'c_term_offset'}),(($self->{'vertical_padding'} + $self->{'helix_height'}) + ($self->{'c_terminal_height'} / 2) - 6) + 26 + $y_mod,$self->{'loop_labels'}{$_},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'cx'} + 3 + $self->{'c_term_offset'}),(($self->{'vertical_padding'} + $self->{'helix_height'}) + ($self->{'c_terminal_height'} / 2) - 6) + 15 + $y_mod,$self->{'loop_labels'}{$_},$self->{'black'}); } $y_mod = $y_mod + 15; } } } return $self; } sub draw_ext_c_term { my $self = shift; ## draw external c-terminal $self->{'im'}->arc(($self->{'cx'} + $self->{'c_term_offset'}),$self->{'vertical_padding'},($self->{'w'} + (2 * $self->{'c_term_offset'})),$self->{'c_terminal_height'},180,270,$self->{'black'}); if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,,($self->{'cx'} + 3 + $self->{'c_term_offset'}),($self->{'vertical_padding'} - ($self->{'c_terminal_height'} / 2) + 5),$self->{'c_term_label'},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'cx'} + 3 + $self->{'c_term_offset'}),($self->{'vertical_padding'} - ($self->{'c_terminal_height'} / 2) - 6),$self->{'c_term_label'},$self->{'black'}) if $self->{'labels'}; } ## label terminal if ($self->{'labels'}){ my $y_mod = 0; foreach (sort {$b <=> $a} keys %{$self->{'loop_labels'}}){ if ($_ >= $self->{'helix_span'}{$self->{'helix_count'}}{'stop'}){ if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'cx'} + 3 + $self->{'c_term_offset'}),($self->{'vertical_padding'} - ($self->{'c_terminal_height'} / 2) - 6) - 4 - $y_mod,$self->{'loop_labels'}{$_},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'cx'} + 3 + $self->{'c_term_offset'}),($self->{'vertical_padding'} - ($self->{'c_terminal_height'} / 2) - 6) - 15 - $y_mod,$self->{'loop_labels'}{$_},$self->{'black'}); } $y_mod = $y_mod + 15; } } } return $self; } sub draw_int_loop { my $self = shift; ## draw internal loop $self->{'cx'} = $self->{'x'} + ($self->{'helix_width'} / 2) + ($self->{'loop_width'} / 2); ## this sets the height to the value given by the loop_heights hash foreach (sort {$a <=> $b} keys %{$self->{'loop_heights'}}){ $self->{'h'} = $self->{'loop_heights'}{$_} if $_ == $self->{'loop_count'}; } $self->{'im'}->arc($self->{'cx'},($self->{'vertical_padding'} + $self->{'helix_height'}),$self->{'w'},$self->{'h'},0,180,$self->{'black'}); ## label loop if ($self->{'labels'}){ my $y_mod = 0; foreach (sort {$a <=> $b} keys %{$self->{'loop_labels'}}){ if (($_ >= $self->{'l_start'})&&($_ <= $self->{'l_stop'})){ $self->{'im'}->line($self->{'cx'},($self->{'vertical_padding'} + $self->{'helix_height'} + ($self->{'h'} / 2)),$self->{'cx'},($self->{'vertical_padding'} + $self->{'helix_height'} + ($self->{'h'} / 2) + 5),$self->{'black'}) unless $y_mod; if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'cx'} + $self->{'text_offset'} - 3),($self->{'vertical_padding'} + $self->{'helix_height'} + ($self->{'h'} / 2) + 17) + $y_mod,$self->{'loop_labels'}{$_},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'cx'} + $self->{'text_offset'}),($self->{'vertical_padding'} + $self->{'helix_height'} + ($self->{'h'} / 2) + 6) + $y_mod,$self->{'loop_labels'}{$_},$self->{'black'}) ; } $y_mod = $y_mod + 15; } } } $self->{'loop_count'}++; return $self; } sub draw_ext_loop { my $self = shift; ## draw external loop $self->{'cx'} = $self->{'x'} + ($self->{'helix_width'} / 2) + ($self->{'loop_width'} / 2); ## this sets the height to the value given by the loop_heights hash foreach (sort {$a <=> $b} keys %{$self->{'loop_heights'}}){ $self->{'h'} = $self->{'loop_heights'}{$_} if $_ == $self->{'loop_count'}; } $self->{'im'}->arc($self->{'cx'},$self->{'vertical_padding'},$self->{'w'},$self->{'h'},180,360,$self->{'black'}); ## label loop if ($self->{'labels'}){ my $y_mod = 0; foreach (sort {$b <=> $a} keys %{$self->{'loop_labels'}}){ if (($_ >= $self->{'l_start'})&&($_ <= $self->{'l_stop'})){ $self->{'im'}->line($self->{'cx'},($self->{'vertical_padding'} - ($self->{'h'} / 2)),$self->{'cx'},($self->{'vertical_padding'} - ($self->{'h'} / 2) - 5),$self->{'black'}) unless $y_mod; if ($self->{'ttf_font'}){ $self->{'im'}->stringFT($self->{'black'},$self->{'ttf_font'},$self->{'ttf_font_size'},0,($self->{'cx'} + $self->{'text_offset'} - 3),($self->{'vertical_padding'} - ($self->{'h'} / 2) - 8) + $y_mod,$self->{'loop_labels'}{$_},{linespacing=>0.6,charmap => 'Unicode',}) if $self->{'labels'}; }else{ $self->{'im'}->string(gdSmallFont,($self->{'cx'} + $self->{'text_offset'}),($self->{'vertical_padding'} - ($self->{'h'} / 2) - 19) + $y_mod,$self->{'loop_labels'}{$_},$self->{'black'}); } $y_mod = $y_mod - 15; } } } $self->{'loop_count'}++; return $self; } 1; =head1 NAME Bio::Graphics::DrawTransmembrane - draw a cartoon of an Alpha-helical transmembrane protein. =head1 SYNOPSIS use Bio::Graphics::DrawTransmembrane; my @topology = (20,45,59,70,86,109,145,168,194,220); ## Simple use - -topology is the only option that is required my $im = Bio::Graphics::DrawTransmembrane->new( -title => 'This is a cartoon displaying transmembrane helices.', -topology => \@topology); ## More advanced use my %labels = (5 => '5 - Sulphation Site', 21 => '1st Helix', 47 => '40 - Mutation', 60 => 'Voltage Sensor', 72 => '72 - Mutation 2', 73 => '73 - Mutation 3', 138 => '138 - Glycosylation Site', 170 => '170 - Phosphorylation Site', 200 => 'Last Helix'); my $im = Bio::Graphics::DrawTransmembrane->new(-n_terminal=> 'out', -topology => \@topology, -bold_helices=> 1, -labels=> \%labels, -text_offset=> -15, -outside_label=>'Lumen', -inside_label=>'Cytoplasm', -membrane_label=>'Membrane', -vertical_padding=> 155); ## Parse Tmhmm data use Bio::Tools::Tmhmm; my $im = Bio::Graphics::DrawTransmembrane->new( -title=>'Let\'s parse some Tmhmm output...', -bold_helices=> 1); open(FILE, 'tmhmm.out'); my $parser = new Bio::Tools::Tmhmm(-fh => \*FILE ); while(my $tmhmm_feat = $parser->next_result ) { ## Load features into DrawTransmembrane object $im->add_tmhmm_feat($tmhmm_feat); } close FILE; ## Now write the image to a .png file open(OUTPUT, ">output.png"); binmode OUTPUT; print OUTPUT $im->png; close OUTPUT; =head1 DESCRIPTION A module to draw a cartoon of an alpha-helical transmembrane protein. It uses GD and allows the image to be written to a .png file. The options are a set of tag/value pairs as follows: Option Value Default ------ ----- ------- -topology Array containing transmembrane helix none boundaries. This is the only option that is required -topology_string Alternative to -topology, provide a string none containing the topology data in the form A.11,31;B.41,59;C.86,107;D.145,166 -n_terminal Location of the N-terminal of the sequence, out either 'in' or 'out' -title Title to add to the image none -inside_label Label for the inside of the membrane Cytoplasmic -outside_label Label for the outside of the membrane Extracellular -membrane_label Label for the membrane Plasma Membrane -colour_scheme Colour scheme to use. Current choices are blue blue, yellow, red, green, pink or white. -labels Label loops and helices using data from a none hash, e.g. %labels = (138 => 'Glycosylation Site', 190 => 'Binding Site'); The hash key must be numeric, ranges are not allowed. -bold_helices Draws black boxes round helices 1 -bold_labels Draws black boxes round labels 0 -text_offset Shift the text labeling the loops. Use a 0 negative value to shift it left, a positive value to shift it right -helix_height Transmembrane helix height 130 -helix_width Transmembrane helix width 50 -loop_width Loop width 20 -vertical_padding Vertical padding 140 -horizontal_padding Horizontal Padding 150 -membrane_offset Offest between helix end and membrane 6 -short_loop_height Height of short loops 90 -medium_loop_height Height of medium loops 120 -long_loop_height Height of long loops 150 -short_loop_limit Length in residues below which a loop is 15 classed as short -long_loop_limit Length in residues above which a loop is 30 classed as long -loop_heights Explicitly set heights of each loop, e.g. %loop_heights = (1 => 45, 2 => 220, 3 => 50, 4 => 220, 9 => 70); The key corresponds to the loop number. Both key and value must be numeric. If you use -loop_height and there is a defined height for the current loop then other height values will be overridden -n_terminal_height Height of N-terminal 150 -c_terminal_height Height of C-terminal 80 -n_terminal_offset Shift the N-terminal left by this amount 0 -c_terminal_offset Shift the C-terminal right by this amount 0 -helix_label Change the 'S' label on each helix. Only 1 S character is allowed -show_labels Display text labels on -draw_cytosol Show the cytosol false -draw_bilayer Show the membrane true -draw_loops Show the loops true -draw_terminai Show the terminai true -draw_helices Show the helices true -dontsort Don't automatically sort the topology array 0 -ttf_font Path to TTF font, e.g. none /usr/share/fonts/msttcorefonts/arial.ttf -ttf_font_size Default size for TTF font. Use 7-9 with 8 Arial for best results Height, width, padding and other numerical values can gernerally be left alone. They are useful if your labels consists of a lot of text as this may lead to them overlapping. In this case try increasing the loop_width or helix_width options. -text_offset is also very useful for avoiding overlapping. =head1 AUTHOR Tim Nugent Etimnugent@gmail.comE =cut ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/Util.pm����������������������������������������������������������000555��001750��001750�� 1735�12366325116� 20342� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Bio::Graphics::Util; # Non object-oriented utilities used here-and-there in Bio::Graphics modules =head1 NAME Bio::Graphics::Util - non-object-oriented utilities used in Bio::Graphics modules =cut use strict; require Exporter; use base qw(Exporter); use vars '@EXPORT','@EXPORT_OK'; @EXPORT = 'frame_and_offset'; use Bio::Root::Version; =over 4 =item ($frame,$offset) = frame_and_offset($pos,$strand,$phase) Calculate the reading frame for a given genomic position, strand and phase. The offset is the offset from $pos to the first nucleotide of the reading frame. In a scalar context, returns the frame only. =back =cut sub frame_and_offset { my ($pos,$strand,$phase) = @_; $strand ||= +1; $phase ||= 0; my $codon_start = $strand >= 0 ? $pos + $phase : $pos - $phase; # probably wrong my $frame = ($codon_start-1) % 3; my $offset = $strand >= 0 ? $phase : -$phase; return wantarray ? ($frame,$offset) : $frame; } 1; �����������������������������������Bio-Graphics-2.39/lib/Bio/Graphics/Panel.pm���������������������������������������������������������000555��001750��001750�� 320505�12366325116� 20523� 0����������������������������������������������������������������������������������������������������ustar�00lstein��������������������������lstein��������������������������000000��000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Bio::Graphics::Panel; use strict; use Bio::Graphics::Glyph::Factory; use Bio::Graphics::Feature; use Bio::Graphics::GDWrapper; # KEYLABELFONT must be treated as string until image_class is established use constant KEYLABELFONT => 'gdMediumBoldFont'; use constant KEYSPACING => 5; # extra space between key columns use constant KEYPADTOP => 5; # extra padding before the key starts use constant KEYCOLOR => 'wheat'; use constant KEYSTYLE => 'bottom'; use constant KEYALIGN => 'left'; use constant GRIDCOLOR => 'lightcyan'; use constant GRIDMAJORCOLOR => 'lightgrey'; use constant MISSING_TRACK_COLOR =>'gray'; use constant EXTRA_RIGHT_PADDING => 30; use base qw(Bio::Root::Root); our $GlyphScratch; my %COLORS; # translation table for symbolic color names to RGB triple my $IMAGEMAP = 'bgmap00001'; read_colors(); sub api_version { 1.8 } # Create a new panel of a given width and height, and add lists of features # one by one sub new { my $class = shift; $class = ref($class) || $class; my %options = @_; $class->read_colors() unless %COLORS; my $length = $options{-length} || 0; my $offset = $options{-offset} || 0; my $spacing = $options{-spacing} || 5; my $bgcolor = $options{-bgcolor} || 'white'; my $keyfont = $options{-key_font} || KEYLABELFONT; my $keycolor = $options{-key_color} || KEYCOLOR; my $keyspacing = $options{-key_spacing} || KEYSPACING; my $keystyle = $options{-key_style} || KEYSTYLE; my $keyalign = $options{-key_align} || KEYALIGN; my $suppress_key = $options{-suppress_key} || 0; my $allcallbacks = $options{-all_callbacks} || 0; my $gridcolor = $options{-gridcolor} || GRIDCOLOR; my $gridmajorcolor = $options{-gridmajorcolor} || GRIDMAJORCOLOR; my $grid = $options{-grid} || 0; my $extend_grid = $options{-extend_grid}|| 0; my $flip = $options{-flip} || 0; my $empty_track_style = $options{-empty_tracks} || 'key'; my $autopad = defined $options{-auto_pad} ? $options{-auto_pad} : 1; my $truecolor = $options{-truecolor} || 0; my $truetype = $options{-truetype} || 0; my $image_class = ($options{-image_class} && $options{-image_class} =~ /SVG/) ? 'GD::SVG' : $options{-image_class} || 'GD'; # Allow users to specify GD::SVG using SVG my $linkrule = $options{-link}; my $titlerule = $options{-title}; my $targetrule = $options{-target}; my $background = $options{-background}; my $postgrid = $options{-postgrid}; $options{-stop}||= $options{-end}; # damn damn damn my $add_categories= $options{-add_category_labels}; if (my $seg = $options{-segment}) { $offset = eval {$seg->start-1} || 0; $length = $seg->length; } $offset ||= $options{-start}-1 if defined $options{-start}; $length ||= $options{-stop}-$options{-start}+1 if defined $options{-start} && defined $options{-stop}; # bring in the image generator class, since we will need it soon anyway eval "require $image_class; 1" or $class->throw($@); return bless { tracks => [], width => $options{-width} || 600, pad_top => $options{-pad_top}||0, pad_bottom => $options{-pad_bottom}||0, pad_left => $options{-pad_left}||0, pad_right => $options{-pad_right}||0, global_alpha => $options{-alpha} || 0, length => $length, offset => $offset, gridcolor => $gridcolor, gridmajorcolor => $gridmajorcolor, grid => $grid, extend_grid => $extend_grid, bgcolor => $bgcolor, height => 0, # AUTO spacing => $spacing, key_font => $keyfont, key_color => $keycolor, key_spacing => $keyspacing, key_style => $keystyle, key_align => $keyalign, suppress_key => $suppress_key, background => $background, postgrid => $postgrid, autopad => $autopad, all_callbacks => $allcallbacks, truecolor => $truecolor, truetype => $truetype, flip => $flip, linkrule => $linkrule, titlerule => $titlerule, targetrule => $targetrule, empty_track_style => $empty_track_style, image_class => $image_class, image_package => $image_class . '::Image', # Accessors polygon_package => $image_class . '::Polygon', add_category_labels => $add_categories, key_boxes => [], },$class; } sub rotate { my $self = shift; my $d = $self->{rotate}; $self->{rotate} = shift if @_; $d; } sub pad_left { my $self = shift; my $g = $self->{pad_left}; $self->{pad_left} = shift if @_; $g; } sub pad_right { my $self = shift; my $g = $self->{pad_right}; $self->{pad_right} = shift if @_; $g; } sub pad_top { my $self = shift; my $g = $self->{pad_top}; $self->{pad_top} = shift if @_; $g; } sub pad_bottom { my $self = shift; my $g = $self->{pad_bottom}; $self->{pad_bottom} = shift if @_; $g; } sub extend_grid { my $self = shift; my $g = $self->{extend_grid}; $self->{extend_grid} = shift if @_; $g; } sub flip { my $self = shift; my $g = $self->{flip}; $self->{flip} = shift if @_; $g; } sub truetype { my $self = shift; my $g = $self->{truetype}; $self->{truetype} = shift if @_; $g; } # values of empty_track_style are: # "suppress" -- suppress empty tracks entirely (default) # "key" -- show just the key in "between" mode # "line" -- draw a thin grey line # "dashed" -- draw a dashed line sub empty_track_style { my $self = shift; my $g = $self->{empty_track_style}; $self->{empty_track_style} = shift if @_; $g; } sub key_style { my $self = shift; my $g = $self->{key_style}; $self->{key_style} = shift if @_; $g; } sub auto_pad { my $self = shift; my $g = $self->{autopad}; $self->{autopad} = shift if @_; $g; } # public routine for mapping from a base pair # location to pixel coordinates sub location2pixel { my $self = shift; my $end = $self->end + 1; my @coords = $self->{flip} ? map { $end-$_ } @_ : @_; $self->map_pt(@coords); } # numerous direct calls into array used here for performance considerations sub map_pt { my $self = shift; my $offset = $self->{offset}; my $scale = $self->{scale} || $self->scale; my $pl = $self->{pad_left}; my $pr = $self->{width}; my $flip = $self->{flip}; my $length = $self->{length}; my @result; foreach (@_) { my $val = $flip ? $pr - ($length - ($_- 1)) * $scale : ($_-$offset-1) * $scale; $val = int($val + 0.5 * ($val<=>0)); $val = -1 if $val < 0; $val = $pr+1 if $val > $pr; push @result,$val; } @result; } sub map_no_trunc { my $self = shift; my $offset = $self->{offset}; my $scale = $self->scale; my $pl = $self->{pad_left}; my $pr = $pl + $self->{width}; # - $self->{pad_right}; my $flip = $self->{flip}; my $length = $self->{length}; my $end = $offset+$length; my @result; foreach (@_) { my $val = $flip ? int (0.5 + $pl + ($end - ($_- 1)) * $scale) : int (0.5 + $pl + ($_-$offset-1) * $scale); push @result,$val; } @result; } sub scale { my $self = shift; $self->{scale} ||= $self->width/($self->length); } sub start { shift->{offset}+1} sub end { $_[0]->start + $_[0]->{length}-1} sub offset { shift->{offset} } sub width { my $self = shift; my $d = $self->{width}; $self->{width} = shift if @_; $d; } sub left { my $self = shift; $self->pad_left; } sub right { my $self = shift; $self->pad_left + $self->width; # - $self->pad_right; } sub top { shift->pad_top; } sub bottom { my $self = shift; $self->height - $self->pad_bottom; } sub spacing { my $self = shift; my $d = $self->{spacing}; $self->{spacing} = shift if @_; $d; } sub key_spacing { my $self = shift; my $d = $self->{key_spacing}; $self->{key_spacing} = shift if @_; $d; } sub length { my $self = shift; my $d = $self->{length}; if (@_) { my $l = shift; $l = $l->length if ref($l) && $l->can('length'); $self->{length} = $l; } $d; } sub gridcolor {shift->{gridcolor}} sub gridmajorcolor {shift->{gridmajorcolor}} sub all_callbacks { shift->{all_callbacks} } sub add_track { my $self = shift; $self->_do_add_track(scalar(@{$self->{tracks}}),@_); } sub unshift_track { my $self = shift; $self->_do_add_track(0,@_); } sub insert_track { my $self = shift; my $position = shift; $self->_do_add_track($position,@_); } # create a feature and factory pair # see Factory.pm for the format of the options # The thing returned is actually a generic Glyph sub _do_add_track { my $self = shift; my $position = shift; # due to indecision, we accept features # and/or glyph types in the first two arguments my ($features,$glyph_name) = ([],undef); while ( @_ && $_[0] !~ /^-/) { my $arg = shift; $features = $arg and next if ref($arg); $glyph_name = $arg and next unless ref($arg); } my %args = @_; my ($map,$ss,%options); foreach (keys %args) { (my $canonical = lc $_) =~ s/^-//; if ($canonical eq 'glyph') { $map = $args{$_}; delete $args{$_}; } elsif ($canonical eq 'stylesheet') { $ss = $args{$_}; delete $args{$_}; } else { $options{$canonical} = $args{$_}; } } $glyph_name = $map if defined $map; $glyph_name ||= 'generic'; local $^W = 0; # uninitialized variable warnings under 5.00503 my $panel_map = ref($map) eq 'CODE' ? sub { my $feature = shift; return 'track' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'track' }; return 'group' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'group' }; return 'scale' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'scale' }; return $map->($feature,'glyph',$self); } : ref($map) eq 'HASH' ? sub { my $feature = shift; return 'track' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'track' }; return 'group' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'group' }; return 'scale' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'scale' }; return eval {$map->{$feature->primary_tag}} || 'generic'; } : sub { my $feature = shift; return 'track' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'track' }; return 'group' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'group' }; return 'scale' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'scale' }; return $glyph_name; }; $self->_add_track($position,$features,-map=>$panel_map,-stylesheet=>$ss,-options=>\%options); } sub _add_track { my $self = shift; my ($position,$features,@options) = @_; # build the list of features into a Bio::Graphics::Feature object $features = [$features] unless ref $features eq 'ARRAY'; # optional middle-level glyph is the group foreach my $f (grep {ref $_ eq 'ARRAY'} @$features) { next unless ref $f eq 'ARRAY'; $f = Bio::Graphics::Feature->new( -segments=>$f, -type => 'group' ); } # top-level glyph is the track my $feature = Bio::Graphics::Feature->new( -segments=>$features, -start => $self->offset+1, -stop => $self->offset+$self->length, -type => 'track' ); my $factory = Bio::Graphics::Glyph::Factory->new($self,@options); my $track = $factory->make_glyph(-1,$feature); splice(@{$self->{tracks}},$position,0,$track); return $track; } sub _expand_padding { my $self = shift; my $track = shift; my $extra_padding = $self->extra_right_padding; my $keystyle = $self->key_style; my $empty_track_style = $self->empty_track_style; return unless $keystyle eq 'left' or $keystyle eq 'right'; return unless $self->auto_pad; $self->setup_fonts(); my $width = $self->{key_font}->width; my $key = $self->track2key($track); return unless defined $key; my $has_parts = $track->parts; next if !$has_parts && $empty_track_style eq 'suppress'; my $width_needed = $self->{key_font}->width * CORE::length($key)+3; if ($keystyle eq 'left') { my $width_i_have = $self->pad_left; $self->pad_left($width_needed) if $width_needed > $width_i_have; } elsif ($keystyle eq 'right') { $width_needed += $extra_padding; my $width_i_have = $self->pad_right; $self->pad_right($width_needed) if $width_needed > $width_i_have; } } sub extra_right_padding { EXTRA_RIGHT_PADDING } sub height { my $self = shift; $self->setup_fonts; for my $track (@{$self->{tracks}}) { $self->_expand_padding($track); } my $spacing = $self->spacing; my $key_height = $self->format_key; my $empty_track_style = $self->empty_track_style; my $key_style = $self->key_style; my $bottom_key = $key_style eq 'bottom'; my $between_key = $key_style eq 'between'; my $side_key = $key_style =~ /left|right/; my $draw_empty = $empty_track_style =~ /^(line|dashed)$/; my $keyheight = $self->{key_font}->height; my $height = 0; for my $track (@{$self->{tracks}}) { my $draw_between = $between_key && $track->option('key'); my $has_parts = $track->parts; next if !$has_parts && ($empty_track_style eq 'suppress' or $empty_track_style eq 'key' && $bottom_key); $height += $keyheight if $draw_between; $height += $self->spacing; my $layout_height = $track->layout_height; $height += ($side_key && $keyheight > $layout_height) ? $keyheight : $layout_height; } # get rid of spacing under last track $height -= $self->spacing unless $bottom_key; return $height + $key_height + $self->pad_top + $self->pad_bottom + 2; } sub setup_fonts { my $self = shift; return if ref $self->{key_font}; my $image_class = $self->image_class; my $keyfont = $self->{key_font}; my $font_obj = $image_class->$keyfont; $self->{key_font} = $font_obj; } sub gd { my $self = shift; my $existing_gd = shift; local $^W = 0; # can't track down the uninitialized variable warning return $self->{gd} if $self->{gd}; $self->setup_fonts; unless ($existing_gd) { my $image_class = $self->image_class; eval "require $image_class; 1" or $self->throw($@); } my $height = $self->height; my $width = $self->width + $self->pad_left + $self->pad_right; my $pkg = $self->image_package; $height = 12 if $height < 1; # so GD doesn't crash $width = 1 if $width < 1; # ditto my $gd = $existing_gd || $pkg->new($width,$height, ($self->{truecolor} && $pkg->can('isTrueColor') ? 1 : ()) ); $gd->{debug} = 0 if $gd->isa('GD::SVG::Image'); # hack $self->{gd} = $gd; if ($self->{truecolor} && $pkg->can('saveAlpha')) { $gd->saveAlpha(1); } my %translation_table; my $global_alpha = $self->{global_alpha} || 0; for my $name (keys %COLORS) { my $idx = $gd->colorAllocate(@{$COLORS{$name}}); $translation_table{$name} = $idx; } $self->{translations} = \%translation_table; $self->{gd} = $gd->isa('GD::SVG::Image') ? $gd : $self->truetype ? Bio::Graphics::GDWrapper->new($gd,$self->truetype) : $gd; eval {$gd->alphaBlending(0)}; if ($self->bgcolor) { $gd->fill(0,0,$self->bgcolor); } elsif (eval {$gd->isTrueColor}) { $gd->fill(0,0,$translation_table{'white'}); } eval {$gd->alphaBlending(1)}; my $pl = $self->pad_left; my $pt = $self->pad_top; my $offset = $pt; my $keyheight = $self->{key_font}->height; my $bottom_key = $self->{key_style} eq 'bottom'; my $between_key = $self->{key_style} eq 'between'; my $left_key = $self->{key_style} eq 'left'; my $right_key = $self->{key_style} eq 'right'; my $empty_track_style = $self->empty_track_style; my $spacing = $self->spacing; # we draw in two steps, once for background of tracks, and once for # the contents. This allows the grid to sit on top of the track background. for my $track (@{$self->{tracks}}) { my $draw_between = $between_key && $track->option('key'); next if !$track->parts && ($empty_track_style eq 'suppress' or $empty_track_style eq 'key' && $bottom_key); $gd->filledRectangle($pl, $offset, $width-$self->pad_right, $offset+$track->layout_height + ($between_key ? $self->{key_font}->height : 0), $track->tkcolor) if defined $track->tkcolor; $offset += $keyheight if $draw_between; $offset += $track->layout_height + $spacing; } $self->startGroup($gd); $self->draw_background($gd,$self->{background}) if $self->{background}; $self->draw_grid($gd) if $self->{grid}; $self->draw_background($gd,$self->{postgrid}) if $self->{postgrid}; $self->endGroup($gd); $offset = $pt; for my $track (@{$self->{tracks}}) { $self->startGroup($gd); my $draw_between = $between_key && $track->option('key'); my $has_parts = $track->parts; my $side_key_height = 0; next if !$has_parts && ($empty_track_style eq 'suppress' or $empty_track_style eq 'key' && $bottom_key); if ($draw_between) { $offset += $self->draw_between_key($gd,$track,$offset); } $self->draw_empty($gd,$offset,$empty_track_style) if !$has_parts && $empty_track_style=~/^(line|dashed)$/; $track->draw($gd,$pl,$offset,0,1); if ($self->{key_style} =~ /^(left|right)$/) { $side_key_height = $self->draw_side_key($gd,$track,$offset,$self->{key_style}); } $self->track_position($track,$offset); my $layout_height = $track->layout_height; $offset += ($side_key_height > $layout_height ? $side_key_height : $layout_height)+$spacing; $self->endGroup($gd); } $self->startGroup($gd); $self->draw_bottom_key($gd,$pl,$offset) if $self->{key_style} eq 'bottom'; $self->endGroup($gd); return $self->{gd} = $self->rotate ? $gd->copyRotate90 : $gd; } sub gdfont { my $self = shift; my $font = shift; my $img_class = $self->image_class; if (!UNIVERSAL::isa($font,$img_class . '::Font') && $font =~ /^(gd|sanserif)/) { my $ref = $self->{gdfonts} ||= { gdTinyFont => $img_class->gdTinyFont(), gdSmallFont => $img_class->gdSmallFont(), gdMediumBoldFont => $img_class->gdMediumBoldFont(), gdLargeFont => $img_class->gdLargeFont(), gdGiantFont => $img_class->gdGiantFont(), sanserif => $img_class->gdSmallFont(), }; return $ref->{$font} || $ref->{gdSmallFont}; } else { return $font; } } sub string_width { my $self = shift; my ($font,$string) = @_; my $class = $self->image_class; return $font->width*CORE::length($string) unless $self->truetype && $class ne 'GD::SVG'; return Bio::Graphics::GDWrapper->string_width($font,$string); } sub string_height { my $self = shift; my ($font,$string) = @_; my $class = $self->image_class; return $font->height unless $self->truetype && eval{$class eq 'GD' || $class->isa('GD::Image')}; return Bio::Graphics::GDWrapper->string_height($font,$string); } sub startGroup { my $self = shift; my $gd = shift; $gd->startGroup if $gd->can('startGroup'); } sub endGroup { my $self = shift; my $gd = shift; $gd->endGroup if $gd->can('endGroup'); } # Package accessors # GD (and GD::SVG)'s new() resides in GD::Image sub image_class { return shift->{image_class}; } sub image_package { return shift->{image_package}; } sub polygon_package { return shift->{polygon_package}; } sub boxes { my $self = shift; if (my $boxes = $self->{boxes}){ # cached result return wantarray ? @$boxes : $boxes; } my @boxes; my $offset = 0; $self->setup_fonts; my $pl = $self->pad_left; my $pt = $self->pad_top; my $between_key = $self->{key_style} eq 'between'; my $bottom_key = $self->{key_style} eq 'bottom'; my $empty_track_style = $self->empty_track_style; my $keyheight = $self->{key_font}->height; my $spacing = $self->spacing; my $rotate = $self->rotate; for my $track (@{$self->{tracks}}) { my $draw_between = $between_key && $track->option('key'); next if !$track->parts && ($empty_track_style eq 'suppress' or $empty_track_style eq 'key' && $bottom_key); $offset += $keyheight if $draw_between; my $height = $track->layout_height; my $boxes = $track->boxes($pl,$offset+$pt); $self->track_position($track,$offset); push @boxes,@$boxes; $offset += $track->layout_height + $self->spacing; } if ($rotate) { my $x_offset = $self->height-1; @boxes = map { @{$_}[1,2,3,4] = @{$_}[4,1,2,3]; ($_->[1],$_->[3]) = map {$x_offset - $_} @{$_}[1,3]; $_; } @boxes; } $self->{boxes} = \@boxes; return wantarray ? @boxes : \@boxes; } sub track_position { my $self = shift; my $track = shift; my $d = $self->{_track_position}{$track}; $self->{_track_position}{$track} = shift if @_; $d; } # draw the keys -- between sub draw_between_key { my $self = shift; my ($gd,$track,$offset) = @_; my $key = $self->track2key($track) or return 0; my $x = $self->{key_align} eq 'center' ? $self->width - (CORE::length($key) * $self->{key_font}->width)/2 : $self->{key_align} eq 'right' ? $self->width - CORE::length($key) : $self->pad_left; # Key color hard-coded. Should be configurable for the control freaks. my $color = $self->translate_color('black'); $gd->string($self->{key_font},$x,$offset,$key,$color) unless $self->{suppress_key}; $self->add_key_box($track,$key,$x,$offset); return $self->{key_font}->height; } # draw the keys -- left or right side sub draw_side_key { my $self = shift; my ($gd,$track,$offset,$side) = @_; my $key = $self->track2key($track) or return; my $pos = $side eq 'left' ? $self->pad_left - $self->{key_font}->width * CORE::length($key)-3 : $self->pad_left + $self->width + EXTRA_RIGHT_PADDING; my $color = $self->translate_color('black'); unless ($self->{suppress_key}) { $gd->filledRectangle($pos,$offset, $pos+$self->{key_font}->width*CORE::length($key),$offset,#-$self->{key_font}->height)/2, $self->bgcolor); $gd->string($self->{key_font},$pos,$offset,$key,$color); } $self->add_key_box($track,$key,$pos,$offset); return $self->{key_font}->height; } # draw the keys -- bottom sub draw_bottom_key { my $self = shift; my ($gd,$left,$top) = @_; my $key_glyphs = $self->{key_glyphs} or return; my $color = $self->translate_color($self->{key_color}); $gd->filledRectangle($left,$top,$self->width - $self->pad_right,$self->height-$self->pad_bottom,$color); my $text_color = $self->translate_color('black'); $gd->string($self->{key_font},$left,KEYPADTOP+$top,"KEY:",$text_color) unless $self->{suppress_key}; $top += $self->{key_font}->height + KEYPADTOP; $_->draw($gd,$left,$top) foreach @$key_glyphs; } # Format the key section, and return its height sub format_key { my $self = shift; return 0 unless $self->key_style eq 'bottom'; return $self->{key_height} if defined $self->{key_height}; my $suppress = $self->{empty_track_style} eq 'suppress'; my $between = $self->{key_style} eq 'between'; if ($between) { my @key_tracks = $suppress ? grep {$_->option('key') && $_->parts} @{$self->{tracks}} : grep {$_->option('key')} @{$self->{tracks}}; return $self->{key_height} = @key_tracks * $self->{key_font}->height; } elsif ($self->{key_style} eq 'bottom') { my ($height,$width) = (0,0); my %tracks; my @glyphs; local $self->{flip} = 0; # don't want to worry about flipped keys! # determine how many glyphs become part of the key # and their max size for my $track (@{$self->{tracks}}) { next unless $track->option('key'); next if $suppress && !$track->parts; my $glyph; if (my @parts = $track->parts) { $glyph = $parts[0]->keyglyph; } else { my $t = Bio::Graphics::Feature->new(-segments=> [Bio::Graphics::Feature->new(-start => $self->offset, -stop => $self->offset+$self->length)]); my $g = $track->factory->make_glyph(0,$t); $glyph = $g->keyglyph; } next unless $glyph; $tracks{$track} = $glyph; my ($h,$w) = ($glyph->layout_height, $glyph->layout_width); $height = $h if $h > $height; $width = $w if $w > $width; push @glyphs,$glyph; } $width += $self->key_spacing; # no key glyphs, no key return $self->{key_height} = 0 unless @glyphs; # now height and width hold the largest glyph, and $glyph_count # contains the number of glyphs. We will format them into a # box that is roughly 3 height/4 width (golden mean) my $rows = 0; my $cols = 0; my $maxwidth = $self->width - $self->pad_left - $self->pad_right; while (++$rows) { $cols = @glyphs / $rows; $cols = int ($cols+1) if $cols =~ /\./; # round upward for fractions my $total_width = $cols * $width; my $total_height = $rows * $width; last if $total_width < $maxwidth; } # move glyphs into row-major format my $spacing = $self->key_spacing; my $i = 0; for (my $c = 0; $c < $cols; $c++) { for (my $r = 0; $r < $rows; $r++) { my $x = $c * ($width + $spacing); my $y = $r * ($height + $spacing); next unless defined $glyphs[$i]; $glyphs[$i]->move($x,$y); $i++; } } $self->{key_glyphs} = \@glyphs; # remember our key glyphs # remember our key height return $self->{key_height} = ($height+$spacing) * $rows + $self->{key_font}->height +KEYPADTOP; } else { # no known key style, neither "between" nor "bottom" return $self->{key_height} = 0; } } sub add_key_box { my $self = shift; my ($track,$label,$x,$y, $is_legend) = @_; my $value = [$label,$x,$y,$x+$self->{key_font}->width*CORE::length($label),$y+$self->{key_font}->height,$track]; push @{$self->{key_boxes}},$value; } sub key_boxes { my $ref = shift->{key_boxes}; return wantarray ? @$ref : $ref; } sub add_category_labels { my $self = shift; my $d = $self->{add_category_labels}; $self->{add_category_labels} = shift if @_; $d; } sub track2key { my $self = shift; my $track = shift; return $track->make_key_name(); } sub draw_empty { my $self = shift; my ($gd,$offset,$style) = @_; $offset += $self->spacing/2; my $left = $self->pad_left; my $right = $self->width-$self->pad_right; my $color = $self->translate_color(MISSING_TRACK_COLOR); my $ic = $self->image_class; if ($style eq 'dashed') { $gd->setStyle($color,$color,$ic->gdTransparent(),$ic->gdTransparent()); $gd->line($left,$offset,$right,$offset,$ic->gdStyled()); } else { $gd->line($left,$offset,$right,$offset,$color); } $offset; } # draw a grid sub draw_grid { my $self = shift; my $gd = shift; my $gridcolor = $self->translate_color($self->{gridcolor}); my $gridmajorcolor = $self->translate_color($self->{gridmajorcolor}); my @positions; my ($major,$minor); if (ref $self->{grid} eq 'ARRAY') { @positions = @{$self->{grid}}; } else { ($major,$minor) = $self->ticks; my $first_tick = $minor * int($self->start/$minor); for (my $i = $first_tick; $i <= $self->end+1; $i += $minor) { push @positions,$i; } } my $pl = $self->pad_left; my $pt = $self->extend_grid ? 0 : $self->pad_top; my $pr = $self->right; my $pb = $self->extend_grid ? $self->height : $self->height - $self->pad_bottom; my $offset = $self->{offset}+$self->{length}+1; for my $tick (@positions) { my ($pos) = $self->map_pt($self->{flip} ? $offset - $tick : $tick); my $color = (defined $major && $tick % $major == 0) ? $gridmajorcolor : $gridcolor; $gd->line($pl+$pos,$pt,$pl+$pos,$pb,$color); } } # draw an image (or invoke a drawing routine) sub draw_background { my $self = shift; my ($gd,$image_or_routine) = @_; if (ref $image_or_routine eq 'CODE') { return $image_or_routine->($gd,$self); } if (-f $image_or_routine) { # a file to draw my $method = $image_or_routine =~ /\.png$/i ? 'newFromPng' : $image_or_routine =~ /\.jpe?g$/i ? 'newFromJpeg' : $image_or_routine =~ /\.gd$/i ? 'newFromGd' : $image_or_routine =~ /\.gif$/i ? 'newFromGif' : $image_or_routine =~ /\.xbm$/i ? 'newFromXbm' : ''; return unless $method; my $image = eval {$self->image_package->$method($image_or_routine)}; unless ($image) { warn $@; return; } my ($src_width,$src_height) = $image->getBounds; my ($dst_width,$dst_height) = $gd->getBounds; # tile the thing on for (my $x = 0; $x < $dst_width; $x += $src_width) { for (my $y = 0; $y < $dst_height; $y += $src_height) { $gd->copy($image,$x,$y,0,0,$src_width,$src_height); } } } } # calculate major and minor ticks, given a start position sub ticks { my $self = shift; my ($length,$minwidth) = @_; my $img = $self->image_class; $length = $self->{length} unless defined $length; $minwidth = $img->gdSmallFont->width*7 unless defined $minwidth; my ($major,$minor); # figure out tick mark scale # we want no more than 1 major tick mark every 40 pixels # and enough room for the labels my $scale = $self->scale; my $interval = 10; while (1) { my $pixels = $interval * $scale; last if $pixels >= $minwidth; $interval *= 10; } # to make sure a major tick shows up somewhere in the first half # # $interval *= .5 if ($interval > 0.5*$length); return ($interval,$interval/10); } # reverse of translate(); given index, return rgb triplet sub rgb { my $self = shift; my $idx = shift; my $gd = $self->{gd} or return; return $gd->rgb($idx); } sub transparent_color { my $self = shift; my ($opacity,@colors) = @_; return $self->_translate_color($opacity,@colors); } sub translate_color { my $self = shift; my @colors = @_; return $self->_translate_color(1.0,@colors); } sub _translate_color { my $self = shift; my ($opacity,@colors) = @_; $opacity = '1.0' if $opacity == 1; my $default_alpha = $self->adjust_alpha($opacity); $default_alpha ||= 0; my $ckey = "@{colors}_${default_alpha}"; return $self->{closestcache}{$ckey} if exists $self->{closestcache}{$ckey}; my $index; my $gd = $self->gd or return 1; my $table = $self->{translations} or return 1; if (@colors == 3) { $index = $gd->colorAllocateAlpha(@colors,$default_alpha); } elsif ($colors[0] =~ /^\#([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i) { my ($r,$g,$b,$alpha) = (hex($1),hex($2),hex($3),hex($4)); $index = $gd->colorAllocateAlpha($r,$g,$b,$alpha); } elsif ($colors[0] =~ /^\#([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i) { my ($r,$g,$b) = (hex($1),hex($2),hex($3)); $index = $gd->colorAllocateAlpha($r,$g,$b,$default_alpha); } elsif ($colors[0] =~ /^(\d+),(\d+),(\d+),([\d.]+)$/i || $colors[0] =~ /^rgba\((\d+),(\d+),(\d+),([\d.]+)\)$/) { my $alpha = $self->adjust_alpha($4); my (@rgb) = map {/(\d+)%/ ? int(255 * $1 / 100) : $_} ($1,$2,$3); $index = $gd->colorAllocateAlpha(@rgb,$4); } elsif ($colors[0] =~ /^(\d+),(\d+),(\d+)$/i || $colors[0] =~ /^rgb\((\d+),(\d+),(\d+)\)$/i ) { my (@rgb) = map {/(\d+)%/ ? int(255 * $1 / 100) : $_} ($1,$2,$3); $index = $gd->colorAllocateAlpha(@rgb,$default_alpha); } elsif ($colors[0] eq 'transparent') { $index = $gd->colorAllocateAlpha(255,255,255,127); } elsif ($colors[0] =~ /^(\w+):([\d.]+)/) { # color:alpha my @rgb = $self->color_name_to_rgb($1); @rgb = (0,0,0) unless @rgb; my $alpha = $self->adjust_alpha($2); $index = $gd->colorAllocateAlpha(@rgb,$alpha); } elsif ($default_alpha < 127) { my @rgb = $self->color_name_to_rgb($colors[0]); @rgb = (0,0,0) unless @rgb; $index = $gd->colorAllocateAlpha(@rgb,$default_alpha); } else { $index = defined $table->{$colors[0]} ? $table->{$colors[0]} : 1; } return $self->{closestcache}{$ckey} = $index; } # change CSS opacity values (0-1.0) into GD opacity values (127-0) sub adjust_alpha { my $self = shift; my $value = shift; my $alpha = $value =~ /\./ # floating point ? int(127-($value*127)+0.5) : $value; $alpha = 0 if $alpha < 0; $alpha = 127 if $alpha > 127; return $alpha; } # workaround for bad GD sub colorClosest { my ($self,$gd,@c) = @_; return $gd->colorResolve(@c) if $GD::VERSION < 2.04; my $index = $gd->colorResolve(@c); return $index if $index >= 0; my $value; for (keys %COLORS) { my ($r,$g,$b) = @{$COLORS{$_}}; my $dist = ($r-$c[0])**2 + ($g-$c[1])**2 + ($b-$c[2])**2; ($value,$index) = ($dist,$_) if !defined($value) || $dist < $value; } return $self->{translations}{$index}; } sub bgcolor { my $self = shift; return unless $self->{bgcolor}; return $self->translate_color($self->{bgcolor}); } sub set_pen { my $self = shift; my ($linewidth,$color) = @_; return $self->{pens}{$linewidth,$color} if $self->{pens}{$linewidth,$color}; my $gd = $self->{gd}; my $pkg = $self->image_package; my $pen = $self->{pens}{$linewidth} = $pkg->new($linewidth,$linewidth); my @rgb = $self->rgb($color); my $bg = $pen->colorAllocate(255,255,255); my $fg = $pen->colorAllocate(@rgb); $pen->fill(0,0,$fg); $gd->setBrush($pen); return $self->image_class->gdBrushed(); } sub png { my $gd = shift->gd; $gd->png; } sub svg { my $gd = shift->gd; $gd->svg; } # WARNING: THIS STUFF IS COPIED FROM Bio::Graphics::Browser.pm AND # Bio::Graphics::FeatureFile AND MUST BE REFACTORED # write a png image to disk and generate an image map in a convenient # CGIish way. sub image_and_map { my $self = shift; my %args = @_; my $link_rule = $args{-link} || $self->{linkrule}; my $title_rule = $args{-title} || $self->{titlerule}; my $target_rule = $args{-target} || $self->{targetrule}; my $tmpurl = $args{-url} || '/tmp'; my $docroot = $args{-root} || $ENV{DOCUMENT_ROOT} || ''; my $mapname = $args{-mapname} || $IMAGEMAP++; $docroot .= '/' if $docroot && $docroot !~ m!/$!; # get rid of any netstat part please (my $tmpurlbase = $tmpurl) =~ s!^\w+://[^/]+!!; my $tmpdir = "${docroot}${tmpurlbase}"; my $url = $self->create_web_image($tmpurl,$tmpdir); my $map = $self->create_web_map($mapname,$link_rule,$title_rule,$target_rule); return ($url,$map,$mapname); } sub create_web_image { my $self = shift; my ($tmpurl,$tmpdir) = @_; # create directory if it isn't there already # we need to untaint tmpdir before calling mkpath() return unless $tmpdir =~ /^(.+)$/; my $path = $1; unless (-d $path) { require File::Path unless defined &File::Path::mkpath; File::Path::mkpath($path,0,0777) or $self->throw("Couldn't create temporary image directory $path: $!"); } unless (defined &Digest::MD5::md5_hex) { eval "require Digest::MD5; 1" or $self->throw("Sorry, but the image_and_map() method requires the Digest::MD5 module."); } my $data = $self->png; my $signature = Digest::MD5::md5_hex($data); my $extension = 'png'; # untaint signature for use in open $signature =~ /^([0-9A-Fa-f]+)$/g or return; $signature = $1; my $url = sprintf("%s/%s.%s",$tmpurl,$signature,$extension); my $imagefile = sprintf("%s/%s.%s",$tmpdir,$signature,$extension); open (my $F,">", $imagefile) || $self->throw("Can't open image file $imagefile for writing: $!\n"); binmode($F); print $F $data; return $url; } sub create_web_map { my $self = shift; my ($name,$linkrule,$titlerule,$targetrule) = @_; $name ||= 'map'; my $boxes = $self->boxes; my (%track2link,%track2title,%track2target); eval "require CGI" unless CGI->can('escapeHTML'); my $map = qq(\n); foreach (@$boxes){ my ($feature,$left,$top,$right,$bottom,$track) = @$_; next unless $feature->can('primary_tag'); my $lr = $track2link{$track} ||= (defined $track->option('link') ? $track->option('link') : $linkrule); next unless $lr; my $tr = exists $track2title{$track} ? $track2title{$track} : $track2title{$track} ||= (defined $track->option('title') ? $track->option('title') : $titlerule); my $tgr = exists $track2target{$track} ? $track2target{$track} : $track2target{$track} ||= (defined $track->option('target')? $track->option('target') : $targetrule); my $href = $self->make_link($lr,$feature); my $title = CGI::escapeHTML($self->make_link($tr,$feature,1)); my $target = CGI::escapeHTML($self->make_link($tgr,$feature,1)); my $a = $title ? qq(title="$title") : ''; my $t = $target ? qq(target="$target") : ''; $map .= qq(\n) if $href; } $map .= "\n"; $map; } sub make_link { my $self = shift; my ($linkrule,$feature,$escapeHTML) = @_; eval "require Bio::Graphics::FeatureFile;1" unless Bio::Graphics::FeatureFile->can('link_pattern'); return Bio::Graphics::FeatureFile->link_pattern($linkrule,$feature,$self,$escapeHTML); } sub make_title { my $self = shift; my $feature = shift; eval "require Bio::Graphics::FeatureFile;1" unless Bio::Graphics::FeatureFile->can('make_title'); return Bio::Graphics::FeatureFile->make_title($feature); } sub read_colors { my $class = shift; local ($/) = "\n"; local $_; while () { chomp; last if /^__END__/; my ($name,$r,$g,$b) = split /\s+/; @{$COLORS{$name}} = (hex $r,hex $g, hex $b); } } sub color_name_to_rgb { my $class = shift; my $color_name = shift; $class->read_colors() unless %COLORS; return unless $COLORS{$color_name}; return wantarray ? @{$COLORS{$color_name}} : $COLORS{$color_name}; } sub color_names { my $class = shift; $class->read_colors unless %COLORS; return wantarray ? keys %COLORS : [keys %COLORS]; } sub glyph_scratch { my $self = shift; my $d = $GlyphScratch; $GlyphScratch = shift if @_; $d; } sub finished { my $self = shift; for my $track (@{$self->{tracks} || []}) { $track->finished(); } delete $self->{tracks}; } 1; __DATA__ white FF FF FF black 00 00 00 aliceblue F0 F8 FF antiquewhite FA EB D7 aqua 00 FF FF aquamarine 7F FF D4 azure F0 FF FF beige F5 F5 DC bisque FF E4 C4 blanchedalmond FF EB CD blue 00 00 FF blueviolet 8A 2B E2 brown A5 2A 2A burlywood DE B8 87 cadetblue 5F 9E A0 chartreuse 7F FF 00 chocolate D2 69 1E coral FF 7F 50 cornflowerblue 64 95 ED cornsilk FF F8 DC crimson DC 14 3C cyan 00 FF FF darkblue 00 00 8B darkcyan 00 8B 8B darkgoldenrod B8 86 0B darkgray A9 A9 A9 darkgreen 00 64 00 darkkhaki BD B7 6B darkmagenta 8B 00 8B darkolivegreen 55 6B 2F darkorange FF 8C 00 darkorchid 99 32 CC darkred 8B 00 00 darksalmon E9 96 7A darkseagreen 8F BC 8F darkslateblue 48 3D 8B darkslategray 2F 4F 4F darkturquoise 00 CE D1 darkviolet 94 00 D3 deeppink FF 14 100 deepskyblue 00 BF FF dimgray 69 69 69 dodgerblue 1E 90 FF firebrick B2 22 22 floralwhite FF FA F0 forestgreen 22 8B 22 fuchsia FF 00 FF gainsboro DC DC DC ghostwhite F8 F8 FF gold FF D7 00 goldenrod DA A5 20 gray 80 80 80 grey 80 80 80 green 00 80 00 greenyellow AD FF 2F honeydew F0 FF F0 hotpink FF 69 B4 indianred CD 5C 5C indigo 4B 00 82 ivory FF FF F0 khaki F0 E6 8C lavender E6 E6 FA lavenderblush FF F0 F5 lawngreen 7C FC 00 lemonchiffon FF FA CD lightblue AD D8 E6 lightcoral F0 80 80 lightcyan E0 FF FF lightgoldenrodyellow FA FA D2 lightgreen 90 EE 90 lightgrey D3 D3 D3 lightpink FF B6 C1 lightsalmon FF A0 7A lightseagreen 20 B2 AA lightskyblue 87 CE FA lightslategray 77 88 99 lightsteelblue B0 C4 DE lightyellow FF FF E0 lime 00 FF 00 limegreen 32 CD 32 linen FA F0 E6 magenta FF 00 FF maroon 80 00 00 mediumaquamarine 66 CD AA mediumblue 00 00 CD mediumorchid BA 55 D3 mediumpurple 100 70 DB mediumseagreen 3C B3 71 mediumslateblue 7B 68 EE mediumspringgreen 00 FA 9A mediumturquoise 48 D1 CC mediumvioletred C7 15 85 midnightblue 19 19 70 mintcream F5 FF FA mistyrose FF E4 E1 moccasin FF E4 B5 navajowhite FF DE AD navy 00 00 80 oldlace FD F5 E6 olive 80 80 00 olivedrab 6B 8E 23 orange FF A5 00 orangered FF 45 00 orchid DA 70 D6 palegoldenrod EE E8 AA palegreen 98 FB 98 paleturquoise AF EE EE palevioletred DB 70 100 papayawhip FF EF D5 peachpuff FF DA B9 peru CD 85 3F pink FF C0 CB plum DD A0 DD powderblue B0 E0 E6 purple 80 00 80 red FF 00 00 rosybrown BC 8F 8F royalblue 41 69 E1 saddlebrown 8B 45 13 salmon FA 80 72 sandybrown F4 A4 60 seagreen 2E 8B 57 seashell FF F5 EE sienna A0 52 2D silver C0 C0 C0 skyblue 87 CE EB slateblue 6A 5A CD slategray 70 80 90 snow FF FA FA springgreen 00 FF 7F steelblue 46 82 B4 tan D2 B4 8C teal 00 80 80 thistle D8 BF D8 tomato FF 63 47 turquoise 40 E0 D0 violet EE 82 EE wheat F5 DE B3 whitesmoke F5 F5 F5 yellow FF FF 00 yellowgreen 9A CD 32 gradient1 00 ff 00 gradient2 0a ff 00 gradient3 14 ff 00 gradient4 1e ff 00 gradient5 28 ff 00 gradient6 32 ff 00 gradient7 3d ff 00 gradient8 47 ff 00 gradient9 51 ff 00 gradient10 5b ff 00 gradient11 65 ff 00 gradient12 70 ff 00 gradient13 7a ff 00 gradient14 84 ff 00 gradient15 8e ff 00 gradient16 99 ff 00 gradient17 a3 ff 00 gradient18 ad ff 00 gradient19 b7 ff 00 gradient20 c1 ff 00 gradient21 cc ff 00 gradient22 d6 ff 00 gradient23 e0 ff 00 gradient24 ea ff 00 gradient25 f4 ff 00 gradient26 ff ff 00 gradient27 ff f4 00 gradient28 ff ea 00 gradient29 ff e0 00 gradient30 ff d6 00 gradient31 ff cc 00 gradient32 ff c1 00 gradient33 ff b7 00 gradient34 ff ad 00 gradient35 ff a3 00 gradient36 ff 99 00 gradient37 ff 8e 00 gradient38 ff 84 00 gradient39 ff 7a 00 gradient40 ff 70 00 gradient41 ff 65 00 gradient42 ff 5b 00 gradient43 ff 51 00 gradient44 ff 47 00 gradient45 ff 3d 00 gradient46 ff 32 00 gradient47 ff 28 00 gradient48 ff 1e 00 gradient49 ff 14 00 gradient50 ff 0a 00 __END__ =head1 NAME Bio::Graphics::Panel - Generate GD images of Bio::Seq objects =head1 SYNOPSIS # This script parses a GenBank or EMBL file named on the command # line and produces a PNG rendering of it. Call it like this: # render.pl my_file.embl | display - use strict; use Bio::Graphics; use Bio::SeqIO; my $file = shift or die "provide a sequence file as the argument"; my $io = Bio::SeqIO->new(-file=>$file) or die "could not create Bio::SeqIO"; my $seq = $io->next_seq or die "could not find a sequence in the file"; my @features = $seq->all_SeqFeatures; # sort features by their primary tags my %sorted_features; for my $f (@features) { my $tag = $f->primary_tag; push @{$sorted_features{$tag}},$f; } my $panel = Bio::Graphics::Panel->new( -length => $seq->length, -key_style => 'between', -width => 800, -pad_left => 10, -pad_right => 10, ); $panel->add_track( arrow => Bio::SeqFeature::Generic->new(-start=>1, -end=>$seq->length), -bump => 0, -double=>1, -tick => 2); $panel->add_track(generic => Bio::SeqFeature::Generic->new(-start=>1, -end=>$seq->length), -glyph => 'generic', -bgcolor => 'blue', -label => 1, ); # general case my @colors = qw(cyan orange blue purple green chartreuse magenta yellow aqua); my $idx = 0; for my $tag (sort keys %sorted_features) { my $features = $sorted_features{$tag}; $panel->add_track($features, -glyph => 'generic', -bgcolor => $colors[$idx++ % @colors], -fgcolor => 'black', -font2color => 'red', -key => "${tag}s", -bump => +1, -height => 8, -label => 1, -description => 1, ); } print $panel->png; $panel->finished; exit 0; =head1 DESCRIPTION The Bio::Graphics::Panel class provides drawing and formatting services for any object that implements the Bio::SeqFeatureI interface, including Ace::Sequence::Feature and Das::Segment::Feature objects. It can be used to draw sequence annotations, physical (contig) maps, or any other type of map in which a set of discrete ranges need to be laid out on the number line. The module supports a drawing style in which each type of feature occupies a discrete "track" that spans the width of the display. Each track will have its own distinctive "glyph", a configurable graphical representation of the feature. The module also supports a more flexible style in which several different feature types and their associated glyphs can occupy the same track. The choice of glyph is under run-time control. Semantic zooming (for instance, changing the type of glyph depending on the density of features) is supported by a callback system for configuration variables. The module has built-in support for Bio::Das stylesheets, and stylesheet-driven configuration can be intermixed with semantic zooming, if desired. You can add a key to the generated image using either of two key styles. One style places the key captions at the top of each track. The other style generates a graphical key at the bottom of the image. Note that this module depends on GD. The optional SVG output depends on GD::SVG and SVG. The installed script glyph_help.pl provides quick help on glyphs and their options. =head1 METHODS This section describes the class and object methods for Bio::Graphics::Panel. Typically you will begin by creating a new Bio::Graphics::Panel object, passing it the desired width of the image to generate and an origin and length describing the coordinate range to display. The Bio::Graphics::Panel-Enew() method has many configuration variables that allow you to control the appearance of the image. You will then call add_track() one or more times to add sets of related features to the picture. add_track() places a new horizontal track on the image, and is likewise highly configurable. When you have added all the features you desire, you may call png() to convert the image into a PNG-format image, or boxes() to return coordinate information that can be used to create an imagemap. =head2 CONSTRUCTORS new() is the constructor for Bio::Graphics::Panel: =over 4 =item $panel = Bio::Graphics::Panel-Enew(@options) The new() method creates a new panel object. The options are a set of tag/value pairs as follows: Option Value Default ------ ----- ------- -offset Base pair to place at extreme left none of image, in zero-based coordinates -length Length of sequence segment, in bp none -start Start of range, in 1-based none coordinates. -stop Stop of range, in 1-based none coordinates. -end Same as -stop. -segment A Bio::SeqI or Das::Segment none object, used to derive sequence range if not otherwise specified. -width Desired width of image, in pixels 600 -spacing Spacing between tracks, in pixels 5 -pad_top Additional whitespace between top 0 of image and contents, in pixels -pad_bottom Additional whitespace between top 0 of image and bottom, in pixels -pad_left Additional whitespace between left 0 of image and contents, in pixels -pad_right Additional whitespace between right 0 of image and bottom, in pixels -bgcolor Background color for the panel as a white whole -key_color Background color for the key printed wheat at bottom of panel (if any) -key_spacing Spacing between key glyphs in the 10 key printed at bottom of panel (if any) -key_font Font to use in printed key gdMediumBoldFont captions. -key_style Whether to print key at bottom of none panel ("bottom"), between each track ("between"), to the left of each track ("left"), to the right of each track ("right") or not at all ("none"). -add_category_labels false Whether to add the "category" to the track key. The category is an optional argument that can be attached to each track. If a category is present, and this option is true, then the category will be added to the track label in parentheses. For example, if -key is "Protein matches" and -category is "vertebrate", then the track will be labeled "Protein matches (vertebrate)". -auto_pad If "left" or "right" keys are in use true then setting auto_pad to a true value will allow the panel to adjust its width in order to accomodate the length of the longest key. -empty_tracks What to do when a track is empty. suppress Options are to suppress the track completely ("suppress"), to show just the key in "between" mode ("key"), to draw a thin grey line ("line"), or to draw a dashed line ("dashed"). -flip flip the drawing coordinates left false to right, so that lower coordinates are to the right. This can be useful for drawing (-) strand features. -all_callbacks Whether to invoke callbacks on false the automatic "track" and "group" glyphs. -grid Whether to draw a vertical grid in false the background. Pass a scalar true value to have a grid drawn at regular intervals (corresponding to the minor ticks of the arrow glyph). Pass an array reference to draw the grid at the specified positions. -gridcolor Color of the grid lightcyan -gridmajorcolor Color of grid major intervals cyan -extend_grid If true, extend the grid into the pad false top and pad_bottom regions -background An image or callback to use for the none background of the image. Will be invoked I drawing the grid. -postgrid An image or callback to use for the none background of the image. Will be invoked I drawing the grid. -truecolor Create a truecolor (24-bit) image. false Useful when working with the "image" glyph. -truetype Render text using scaleable vector false fonts rather than bitmap fonts. -image_class To create output in scalable vector graphics (SVG), optionally pass the image class parameter 'GD::SVG'. Defaults to using vanilla GD. See the corresponding image_class() method below for details. -link, -title, -target These options are used when creating imagemaps for display on the web. See L. Typically you will pass new() an object that implements the Bio::RangeI interface, providing a length() method, from which the panel will derive its scale. $panel = Bio::Graphics::Panel->new(-segment => $sequence, -width => 800); new() will return undef in case of an error. Note that if you use the "left" or "right" key styles, you are responsible for allocating sufficient -pad_left or -pad_right room for the labels to appear. The necessary width is the number of characters in the longest key times the font width (gdMediumBoldFont by default) plus 3 pixels of internal padding. The simplest way to calculate this is to iterate over the possible track labels, find the largest one, and then to compute its width using the formula: $width = gdMediumBoldFont->width * length($longest_key) +3; In order to obtain scalable vector graphics (SVG) output, you should pass new() the -image_class=E'GD::SVG' parameter. This will cause Bio::Graphics::Panel to load the optional GD::SVG module. See the gd() and svg() methods below for additional information. You can tile an image onto the panel either before or after it draws the grid. Simply provide the filename of the image in the -background or -postgrid options. The image file must be of type PNG, JPEG, XBM or GIF and have a filename ending in .png, .jpg, .jpeg, .xbm or .gif. You can also pass a code ref for the -background or -postgrid option, in which case the subroutine will be invoked at the appropriate time with the GD::Image object and the Panel object as its two arguments. You can then use the panel methods to map base pair coordinates into pixel coordinates and do some custom drawing. For example, this code fragment will draw a gray rectangle between bases 500 and 600 to indicate a "gap" in the sequence: my $panel = Bio::Graphics::Panel->new(-segment=>$segment, -grid=>1, -width=>600, -postgrid=> \&draw_gap); sub gap_it { my $gd = shift; my $panel = shift; my ($gap_start,$gap_end) = $panel->location2pixel(500,600); my $top = $panel->top; my $bottom = $panel->bottom; my $gray = $panel->translate_color('gray'); $gd->filledRectangle($gap_start,$top,$gap_end,$bottom,$gray); } The B<-truetype> argument will activate rendering of labels using antialiased vector fonts. If it is a value of "1", then labels will be rendered using the default font (Verdana). Pass a font name to use this font as the default: -truetype => 'Times New Roman', Note that you can change the font on a track-by-track basis simply by using a truetype font name as add_track()'s -font argument. =back =head2 OBJECT METHODS =over 4 =item $track = $panel-Eadd_track($glyph,$features,@options) The add_track() method adds a new track to the image. Tracks are horizontal bands which span the entire width of the panel. Each track contains a number of graphical elements called "glyphs", corresponding to a sequence feature. There are a large number of glyph types. By default, each track will be homogeneous on a single glyph type, but you can mix several glyph types on the same track by providing a code reference to the -glyph argument. Other options passed to add_track() control the color and size of the glyphs, whether they are allowed to overlap, and other formatting attributes. The height of a track is determined from its contents and cannot be directly influenced. The first two arguments are the glyph name and an array reference containing the list of features to display. The order of the arguments is irrelevant, allowing either of these idioms: $panel->add_track(arrow => \@features); $panel->add_track(\@features => 'arrow'); The glyph name indicates how each feature is to be rendered. A variety of glyphs are available, and the number is growing. You may omit the glyph name entirely by providing a B<-glyph> argument among @options, as described below. Currently, the following glyphs are available: Name Description ---- ----------- anchored_arrow a span with vertical bases |---------|. If one or the other end of the feature is off-screen, the base will be replaced by an arrow. arrow An arrow; can be unidirectional or bidirectional. It is also capable of displaying a scale with major and minor tickmarks, and can be oriented horizontally or vertically. box A filled rectangle, nondirectional. Subfeatures are ignored. cds Draws CDS features, using the phase information to show the reading frame usage. At high magnifications draws the protein translation. crossbox A box with a big "X" inside it. diamond A diamond, useful for point features like SNPs. dna At high magnification draws the DNA sequence. At low magnifications draws the GC content. dot A circle, useful for point features like SNPs, stop codons, or promoter elements. ellipse An oval. extending_arrow Similar to arrow, but a dotted line indicates when the feature extends beyond the end of the canvas. generic A filled rectangle, nondirectional. Subfeatures are shown as rectangles that are not connected together. graded_segments Similar to segments, but the intensity of the color is proportional to the score of the feature. This is used for showing the intensity of blast hits or other alignment features. group A group of related features connected by a dashed line. This is used internally by Panel. image A pixmap image that will be layered on top of the graphic. heterogeneous_segments Like segments, but you can use the source field of the feature to change the color of each segment. line A simple line. pinsertion A triangle designed to look like an insertion location (e.g. a transposon insertion). processed_transcript multi-purpose representation of a spliced mRNA, including positions of UTRs primers Two inward pointing arrows connected by a line. Used for STSs. redgreen_box A box that changes from green->yellow->red as the score of the feature increases from 0.0 to 1.0. Useful for representing microarray results. rndrect A round-cornered rectangle. segments A set of filled rectangles connected by solid lines. Used for interrupted features, such as gapped alignments. ruler_arrow An arrow with major and minor tick marks and interval labels. toomany Tries to show many features as a cloud. Not very successful. track A group of related features not connected by a line. This is used internally by Panel. transcript Similar to segments, but the connecting line is a "hat" shape, and the direction of transcription is indicated by a small arrow. transcript2 Similar to transcript, but the direction of transcription is indicated by a terminal exon in the shape of an arrow. translation 1, 2 and 3-frame translations. At low magnifications, can be configured to show start and stop codon locations. At high magnifications, shows the multi-frame protein translation. triangle A triangle whose width and orientation can be altered. xyplot Histograms and other graphs plotted against the genome. stackedplot A column plot showing multiple data series across multiple categories. ternary_plot Ternary (triangle) plots. whiskerplot Box and whisker plot for statistical data If the glyph name is omitted from add_track(), the "generic" glyph will be used by default. To get more information about a glyph, run perldoc on "Bio::Graphics::Glyph::glyphname", replacing "glyphname" with the name of the glyph you are interested in. The "box" glyph is optimized for single features with no subfeatures. If you are drawing such a feature, using "box" will be noticeably faster than "generic." The @options array is a list of name/value pairs that control the attributes of the track. Some options are interpretered directly by the track. Others are passed down to the individual glyphs (see L<"GLYPH OPTIONS">). The following options are track-specific: Option Description Default ------ ----------- ------- -tkcolor Track color white -glyph Glyph class to use. "generic" -color_series Dynamically choose false bgcolor. -stylesheet Bio::Das::Stylesheet to none use to generate glyph classes and options. B<-tkcolor> controls the background color of the track as a whole. B<-glyph> controls the glyph type. If present, it supersedes the glyph name given in the first or second argument to add_track(). The value of B<-glyph> may be a constant string, a hash reference, or a code reference. In the case of a constant string, that string will be used as the class name for all generated glyphs. If a hash reference is passed, then the feature's primary_tag() will be used as the key to the hash, and the value, if any, used to generate the glyph type. If a code reference is passed, then this callback will be passed arguments consisting of the feature and the panel object. The callback is expected to examine the feature and return a glyph name as its single result. Example: $panel->add_track(\@exons, -glyph => sub { my ($feature,$panel) = @_; $feature->source_tag eq 'curated' ? 'ellipse' : 'box'; } ); The B<-stylesheet> argument is used to pass a Bio::Das stylesheet object to the panel. This stylesheet will be called to determine both the glyph and the glyph options. If both a stylesheet and direct options are provided, the latter take precedence. The B<-color_series> argument causes the track to ignore the -bgcolor setting and instead to assign glyphs a series of contrasting colors. This is usually used in combination with -bump=>'overlap' in order to create overlapping features. A true value activates the color series. You may adjust the default color series using the B<-color_cycle> option, which is either a reference to an array of Bio::Graphics color values, or a space-delimited string of color names/value. If successful, add_track() returns an Bio::Graphics::Glyph object. You can use this object to add additional features or to control the appearance of the track with greater detail, or just ignore it. Tracks are added in order from the top of the image to the bottom. To add tracks to the top of the image, use unshift_track(). B It is not uncommon to add a group of features which are logically connected, such as the 5' and 3' ends of EST reads. To group features into sets that remain on the same horizontal position and bump together, pass the sets as an anonymous array. For example: $panel->add_track(segments => [[$abc_5,$abc_3], [$xxx_5,$xxx_3], [$yyy_5,$yyy_3]] ); Typical usage is: $panel->add_track( transcript => \@genes, -fillcolor => 'green', -fgcolor => 'black', -bump => +1, -height => 10, -label => 1); The track object is simply a specialized type of glyph. See L for a description of the methods that it supports. =item $track = unshift_track($glyph,$features,@options) unshift_track() works like add_track(), except that the new track is added to the top of the image rather than the bottom. =item $track = $panel-Einsert_track($position,$glyph,$features,@options) This works like add_track(), but the track is inserted into the indicated position. The track will be inserted B the indicated position; thus specify a track of 0 to insert the new track at the beginning. =item $gd = $panel-Egd([$gd]) The gd() method lays out the image and returns a GD::Image object containing it. You may then call the GD::Image object's png() or jpeg() methods to get the image data. Optionally, you may pass gd() a preexisting GD::Image object that you wish to draw on top of. If you do so, you should call the width() and height() methods first to ensure that the image has sufficient dimensions. If you passed new() the -image_class=E'GD::SVG' parameter, the gd() method returns a GD::SVG::Image object. This object overrides GD::Image methods in order to generate SVG output. It behaves exactly as described for GD::Image objects with one exception: it implements and svg() method instead of the png() or jpeg() methods. Currently there is no direct access to underlying SVG calls but this is subject to change in the future. =item $png = $panel-Epng The png() method returns the image as a PNG-format drawing, without the intermediate step of returning a GD::Image object. =item $svg = $panel-Esvg The svg() method returns the image in an XML-ified SVG format. =item $panel-Efinished Bio::Graphics creates memory cycles. When you are finished with the panel, you should call its finished() method. Otherwise you will have memory leaks. This is only an issue if you're going to create several panels in a single program. =item $image_class = $panel-Eimage_class The image_class() method returns the current drawing package being used, currently one of GD or GD::SVG. This is primarily used internally to ensure that calls to GD's exported methods are called in an object-oriented manner to avoid compile time undefined string errors. This is usually not needed for external use. =item $image_package = $panel-Eimage_package This accessor method, like image_class() above is provided as a convenience. It returns the current image package in use, currently one of GD::Image or GD::SVG::Image. This is not normally used externally. =item $polygon_package = $panel-Epolygon_package This accessor method, like image_package() above is provided as a convenience. It returns the current polygon package in use, currently one of GD::Polygon or GD::SVG::Polygon. This is not normally used externally except in the design of glyphs. =item $boxes = $panel-Eboxes =item @boxes = $panel-Eboxes The boxes() method returns a list of arrayrefs containing the coordinates of each glyph. The method is useful for constructing an image map. In a scalar context, boxes() returns an arrayref. In an list context, the method returns the list directly. Each member of the list is an arrayref of the following format: [ $feature, $x1, $y1, $x2, $y2, $track ] The first element is the feature object; either an Ace::Sequence::Feature, a Das::Segment::Feature, or another Bioperl Bio::SeqFeatureI object. The coordinates are the topleft and bottomright corners of the glyph, including any space allocated for labels. The track is the Bio::Graphics::Glyph object corresponding to the track that the feature is rendered inside. =item $boxes = $panel-Ekey_boxes =item @boxes = $panel-Ekey_boxes Returns the positions of the track keys as an arrayref or a list, depending on context. Each value in the list is an arrayref of format: [ $key_text, $x1, $y1, $x2, $y2, $track ] =item $position = $panel-Etrack_position($track) After calling gd() or boxes(), you can learn the resulting Y coordinate of a track by calling track_position() with the value returned by add_track() or unshift_track(). This will return undef if called before gd() or boxes() or with an invalid track. =item $rotate = $panel-Erotate([$new_value]) Gets or sets the "rotate" flag. If rotate is set to true (default false), then calls to gd(), png(), gif(), boxes(), and image_and_map() will all return an image and/or imagemap that has been rotated to the right by 90 degrees. This is mostly useful for drawing karyotypes with the ideogram glyph, in order to rotate the chromosomes into the usual vertical position. =item @pixel_coords = $panel-Elocation2pixel(@feature_coords) Public routine to map feature coordinates (in base pairs) into pixel coordinates relative to the left-hand edge of the picture. If you define a -background callback, the callback may wish to invoke this routine in order to translate base coordinates into pixel coordinates. =item $left = $panel-Eleft =item $right = $panel-Eright =item $top = $panel-Etop =item $bottom = $panel-Ebottom Return the pixel coordinates of the I of the panel, that is, exclusive of the padding. =back =head1 GLYPH OPTIONS Each glyph has its own specialized subset of options, but some are shared by all glyphs: Option Description Default ------ ----------- ------- -key Description of track for undef display in the track label. -category The category of the track undef for display in the track label. -fgcolor Foreground color black -bgcolor Background color turquoise -linewidth Width of lines drawn by 1 glyph -height Height of glyph 10 -font Glyph font gdSmallFont -fontcolor Primary font color black -font2color Secondary font color turquoise -opacity Value from 0.0 (invisible) 1.0 to 1.0 (opaque) which controls the translucency of overlapping features. -label Whether to draw a label false -description Whether to draw a false description -bump Bump direction 0 -sort_order Specify layout sort order "default" -feature_limit Maximum number of features undef (unlimited) to display -bump_limit Maximum number of levels undef (unlimited) to bump -hbumppad Additional horizontal 0 padding between bumped features -strand_arrow Whether to indicate undef (false) strandedness -stranded Synonym for -strand_arrow undef (false) -part_labels Whether to label individual undef (false) subparts. -part_label_merge Whether to merge undef (false) adjacent subparts when labeling. -connector Type of connector to none use to connect related features. Options are "solid," "hat", "dashed", "quill" and "none". -all_callbacks Whether to invoke undef callbacks for autogenerated "track" and "group" glyphs -subpart_callbacks Whether to invoke false callbacks for subparts of the glyph. -box_subparts Return boxes around feature 0 subparts rather than around the feature itself. -link, -title, -target These options are used when creating imagemaps for display on the web. See L. -filter Select which features to display. Must be a CODE reference. B Colors can be expressed in either of two ways: as symbolic names such as "cyan", as HTML-style #RRGGBB triples, and r,g,b comma-separated numbers. The symbolic names are the 140 colors defined in the Netscape/Internet Explorer color cube, and can be retrieved using the Bio::Graphics::Panel-Ecolor_names() method. Transparent and semi-transparent colors can be specified using the following syntax: #RRGGBBAA - red, green, blue and alpha r,g,b,a - red, green, blue, alpha blue:alpha - symbolic name and alpha rgb(r,g,b) - CSS style rgb values rgba(r,g,b,a) - CSS style rgba values Alpha values can be specified as GD style integers ranging from 0 (opaque) to 127 (transparent), or as CSS-style floating point numbers ranging from 0.0 (transparent) through 1.0 (opaque). As a special case, a completely transparent color can be specified using the color named "transparent". In the rgb() and rgba() forms, red, green, blue values can be specified as percentages, as in rgb(100%,0%,50%); otherwise, the values are integers from 0 to 255. In addition, the -fgcolor and -bgcolor options accept the special color names "featureScore" and "featureRGB". In the first case, Bio::Graphics will examine each feature in the track for a defined "score" tag (or the presence of a score() method) with a numeric value ranging from 0-1000. It will draw a grayscale color ranging from lightest (0) to darkest (1000). If the color is named "featureRGB", then Bio::Graphics will look for a tag named "RGB" and will use that as the color. B The -fgcolor option controls the foreground color, including the edges of boxes and the like. B The -bgcolor option controls the background used for filled boxes and other "solid" glyphs. The foreground color controls the color of lines and strings. The -tkcolor argument controls the background color of the entire track. BFor truecolor images, you can apply a default opacity value to both foreground and background colors by supplying a B<-opacity> argument. This is specified as a CSS-style floating point number from 0.0 to 1.0. If the color has an explicit alpha, then the default is ignored. B The -tkcolor option used to specify the background of the entire track. B The -font option controls which font will be used. If the Panel was created without passing a true value to -truecolor, then only GD bitmapped fonts are available to you. These include 'gdTinyFont', 'gdSmallFont', 'gdLargeFont', 'gdMediumBoldFont', and 'gdGiantFont'. If the Panel was creaed using a truevalue for -truecolor, then you can pass the name of any truetype font installed on the server system. Any of these formats will work: -font => 'Times New Roman', # Times font, let the system pick size -font => 'Times New Roman-12' # Times font, 12 points -font => 'Times New Roman-12:Italic' # Times font, 12 points italic -font => 'Times New Roman-12:Bold' # Times font, 12 points bold B The -fontcolor option controls the color of primary text, such as labels B The -font2color option controls the color of secondary text, such as descriptions. B The -label argument controls whether or not the ID of the feature should be printed next to the feature. It is accepted by all glyphs. By default, the label is printed just above the glyph and left aligned with it. -label can be a constant string or a code reference. Values can be any of: -label value Description ------------ ----------- 0 Don't draw a label 1 Calculate a label based on primary tag of sequence "a string" Use "a string" as the label code ref Invoke the code reference to compute the label A known bug with this naming scheme is that you can't label a feature with the string "1". To work around this, use "1 " (note the terminal space). B The -description argument controls whether or not a brief description of the feature should be printed next to it. By default, the description is printed just below the glyph and left-aligned with it. A value of 0 will suppress the description. A value of 1 will "magically" look for tags of type "note" or "description" and draw them if found, otherwise the source tag, if any, will be displayed. A code reference will be invoked to calculate the description on the fly. Anything else will be treated as a string and used verbatim. B A glyph can contain subglyphs, recursively. The top level glyph is the track, which contains one or more groups, which contain features, which contain subfeatures, and so forth. By default, the "group" glyph draws dotted lines between each of its subglyphs, the "segment" glyph draws a solid line between each of its subglyphs, and the "transcript" and "transcript2" glyphs draw hat-shaped lines between their subglyphs. All other glyphs do not connect their components. You can override this behavior by providing a -connector option, to explicitly set the type of connector. Valid options are: "hat" an upward-angling conector "solid" a straight horizontal connector "quill" a decorated line with small arrows indicating strandedness (like the UCSC Genome Browser uses) "dashed" a horizontal dashed line. The B<-connector_color> option controls the color of the connector, if any. B The B<-bump> argument controls what happens when glyphs collide. By default, they will simply overlap (value 0). A -bump value of +1 will cause overlapping glyphs to bump downwards until there is room for them. A -bump value of -1 will cause overlapping glyphs to bump upwards. You may also provide a -bump value of +2 or -2 to activate a very simple type of collision control in which each feature occupies its own line. This is useful for showing dense, nearly-full length features such as similarity hits. A bump of 3 or the string "fast" will turn on a faster collision-detection algorithm that only works properly with the default "left" sort order. Finally, a bump value of "overlap" will cause features to overlap each other and to made partially translucent (the translucency can be controlled with the -opacity setting). Features that are on opposite strands will bump, but those on the same strand will not. The bump argument can also be a code reference; see below. For convenience and backwards compatibility, if you specify a -bump of 1 and use the default sort order, the faster algorithm will be used. If you would like to see more horizontal whitespace between features that occupy the same line, you can specify it with the B<-hbumppad> option. Positive values increase the amount of whitespace between features. Negative values decrease the whitespace. B The -key argument declares that the track is to be shown in a key appended to the bottom of the image. The key contains a picture of a glyph and a label describing what the glyph means. The label is specified in the argument to -key. B Ordinarily, when you invoke the boxes() methods to retrieve the rectangles surrounding the glyphs (which you need to do to create clickable imagemaps, for example), the rectangles will surround the top level features. If you wish for the rectangles to surround subpieces of the glyph, such as the exons in a transcript, set box_subparts to a true numeric value. The value you specify will control the number of levels of subfeatures that the boxes will descend into. For example, if using the "gene" glyph, set -box_subparts to 2 to create boxes for the whole gene (level 0), the mRNAs (level 1) and the exons (level 2). B If set to true, each subpart of a multipart feature will be labeled with a number starting with 1 at the 5'-most part. This is useful for counting exons. You can pass a callback to this argument; the part number and the total number of parts will be arguments three and four. For example, to label the exons as "exon 1", "exon 2" and so on: -part_labels => sub { my ($feature,undef,$partno) = @_; return 'exon '.($partno+1); } The B<-label> argument must also be true. B If true, changes the behavior of -part_labels so that features that abut each other without a gap are treated as a single feature. Useful if you want to count the UTR and CDS segments of an exon as a single unit, and the default for transcript glyphs. B If set to true, some glyphs will indicate their strandedness, usually by drawing an arrow. For this to work, the Bio::SeqFeature must have a strand of +1 or -1. The glyph will ignore this directive if the underlying feature has a strand of zero or undef. B: By default, features are drawn with a layout based only on the position of the feature, assuring a maximal "packing" of the glyphs when bumped. In some cases, however, it makes sense to display the glyphs sorted by score or some other comparison, e.g. such that more "important" features are nearer the top of the display, stacked above less important features. The -sort_order option allows a few different built-in values for changing the default sort order (which is by "left" position): "low_score" (or "high_score") will cause features to be sorted from lowest to highest score (or vice versa). "left" (or "default") and "right" values will cause features to be sorted by their position in the sequence. "longest" (or "shortest") will cause the longest (or shortest) features to be sorted first, and "strand" will cause the features to be sorted by strand: "+1" (forward) then "0" (unknown, or NA) then "-1" (reverse). In all cases, the "left" position will be used to break any ties. To break ties using another field, options may be strung together using a "|" character; e.g. "strand|low_score|right" would cause the features to be sorted first by strand, then score (lowest to highest), then by "right" position in the sequence. Finally, a subroutine coderef with a $$ prototype can be provided. It will receive two B as arguments and should return -1, 0 or 1 (see Perl's sort() function for more information). For example, to sort a set of database search hits by bits (stored in the features' "score" fields), scaled by the log of the alignment length (with "start" position breaking any ties): sort_order = sub ($$) { my ($glyph1,$glyph2) = @_; my $a = $glyph1->feature; my $b = $glyph2->feature; ( $b->score/log($b->length) <=> $a->score/log($a->length) ) || ( $a->start <=> $b->start ) } It is important to remember to use the $$ prototype as shown in the example. Otherwise Bio::Graphics will quit with an exception. The arguments are subclasses of Bio::Graphics::Glyph, not the features themselves. While glyphs implement some, but not all, of the feature methods, to be safe call the two glyphs' feature() methods in order to convert them into the actual features. The '-always_sort' option, if true, will sort features even if bumping is turned off. This is useful if you would like overlapping features to stack in a particular order. Features towards the end of the list will overlay those towards the beginning of the sort order. B<-feature_limit>: When this option is set to a non-zero value, calls to a track's add_feature() method will maintain a count of features added to a track. Once the feature count exceeds the value set in -feature_limit, additional features will displace existing ones in a way that effects a uniform sampling of the total feature set. This is useful to protect against excessively large tracks. The total number of features added can be retrieved by calling the track's feature_count() method. B<-bump_limit>: When bumping is chosen, colliding features will ordinarily move upward or downward without limit. When many features collide, this can lead to excessively high images. You can limit the number of levels that features will bump by providing a numeric B option. After the limit is hit, features will pile up on top of each other, usually as a band at the bottom of the track. The B<-filter> option, which must be a CODE reference, will be invoked once for each feature prior to rendering it. The coderef will receive the feature as its single option and should return true if the feature is to be shown and false otherwise. =head2 Options and Callbacks Instead of providing a constant value to an option, you may subsitute a code reference. This code reference will be called every time the panel needs to configure a glyph. The callback will be called with three arguments like this: sub callback { my ($feature,$option_name,$part_no,$total_parts,$glyph) = @_; # do something which results in $option_value being set return $option_value; } The five arguments are C<$feature>, a reference to the IO::SeqFeatureI object, C<$option_name>, the name of the option to configure, C<$part_no>, an integer index indicating which subpart of the feature is being drawn, C<$total_parts>, an integer indicating the total number of subfeatures in the feature, and finally C<$glyph>, the Glyph object itself. The latter fields are useful in the case of treating the first or last subfeature differently, such as using a different color for the terminal exon of a gene. Usually you will only need to examine the first argument. This example shows a callback examining the score() attribute of a feature (possibly a BLAST hit) and return the color "red" for high-scoring features, and "green" for low-scoring features: sub callback { my $feature = shift; if ($feature->score > 90) { return 'red'; else { return 'green'; } } The callback should return a string indicating the desired value of the option. To tell the panel to use the default value for this option, return the string "*default*". The callback for -grid is slightly different because at the time this option is needed there is no glyph defined. In this case, the callback will get two arguments: the feature and the panel object: -glyph => sub { my ($feature,$panel) = @_; return 'gene' if $panel->length < 10_000; return 'box'; } When you install a callback for a feature that contains subparts, the callback will be invoked first for the top-level feature, and then for each of its subparts (recursively). You should make sure to examine the feature's type to determine whether the option is appropriate. Also be aware that some options are only called for subfeatures. For example, when using multi-segmented features, the "bgcolor" and "fgcolor" options apply to the subfeatures and not to the whole feature; therefore the corresponding callbacks will only be invoked for the subfeatures and not for the top-level feature. To get information that applies to the top-level feature, use the glyph's parent_feature() method. This returns: * the parent if called with no arguments or with an argument of (1) * the parent's parent if called with an argument of (2) * the parent's parent's parent if called with an argument of (3) * etc. The general way to take advantage of this feature is: sub callback { my ($feature,$option_name,$part_no,$total_parts,$glyph) = @_; my $parent = $glyph->parent_feature(); # do something which results in $option_value being set return $option_value; } or, more concisely: sub callback { my $feature = shift; # first argument my $glyph = pop; # last argument my $parent = $glyph->parent_feature(); # do something which results in $option_value being set return $option_value; } Some glyphs deliberately disable recursion into subparts. The "track", "group", "transcript", "transcript2" and "segments" glyphs selectively disable the -bump, -label and -description options. This is to avoid, for example, a label being attached to each exon in a transcript, or the various segments of a gapped alignment bumping each other. You can override this behavior and force your callback to be invoked by providing add_track() with a true B<-all_callbacks> argument. In this case, you must be prepared to handle configuring options for the "group" and "track" glyphs. In particular, this means that in order to control the -bump option with a callback, you should specify -all_callbacks=E1, and turn on bumping when the callback is in the track or group glyphs. The -subpart_callbacks options is similar, except that when this is set to true callbacks are invoked for the main glyph and its subparts. This option only affects the -label and -description options. =head2 ACCESSORS The following accessor methods provide access to various attributes of the panel object. Called with no arguments, they each return the current value of the attribute. Called with a single argument, they set the attribute and return its previous value. Note that in most cases you must change attributes prior to invoking gd(), png() or boxes(). These three methods all invoke an internal layout() method which places the tracks and the glyphs within them, and then caches the result. Accessor Name Description ------------- ----------- width() Get/set width of panel spacing() Get/set spacing between tracks key_spacing() Get/set spacing between keys length() Get/set length of segment (bp) flip() Get/set coordinate flipping pad_top() Get/set top padding pad_left() Get/set left padding pad_bottom() Get/set bottom padding pad_right() Get/set right padding start() Get the start of the sequence (bp; read only) end() Get the end of the sequence (bp; read only) left() Get the left side of the drawing area (pixels; read only) right() Get the right side of the drawing area (pixels; read only) =head2 COLOR METHODS The following methods are used internally, but may be useful for those implementing new glyph types. =over 4 =item @names = Bio::Graphics::Panel-Ecolor_names Return the symbolic names of the colors recognized by the panel object. In a scalar context, returns an array reference. =item ($red,$green,$blue) = Bio::Graphics::Panel-Ecolor_name_to_rgb($color) Given a symbolic color name, returns the red, green, blue components of the color. In a scalar context, returns an array reference to the rgb triplet. Returns undef for an invalid color name. =item @rgb = $panel-Ergb($index) Given a GD color index (between 0 and 140), returns the RGB triplet corresponding to this index. This method is only useful within a glyph's draw() routine, after the panel has allocated a GD::Image and is populating it. =item $index = $panel-Etranslate_color($color) Given a color, returns the GD::Image index. The color may be symbolic, such as "turquoise", or a #RRGGBB triple, as in #F0E0A8. This method is only useful within a glyph's draw() routine, after the panel has allocated a GD::Image and is populating it. =item $panel-Eset_pen($width,$color) Changes the width and color of the GD drawing pen to the values indicated. This is called automatically by the GlyphFactory fgcolor() method. It returns the GD value gdBrushed, which should be used for drawing. =back =head2 Creating Imagemaps You may wish to use Bio::Graphics to create clickable imagemaps for display on the web. The main method for achieving this is image_and_map(). Under special circumstances you may instead wish to call either or both of create_web_image() and create_web_map(). Here is a synopsis of how to use image_and_map() in a CGI script, using CGI.pm calls to provide the HTML scaffolding: print h2('My Genome'); my ($url,$map,$mapname) = $panel->image_and_map(-root => '/var/www/html', -url => '/tmpimages', -link => 'http://www.google.com/search?q=$name'); print img({-src=>$url,-usemap=>"#$mapname"}); print $map; We call image_and_map() with various arguments (described below) to generate a three element list consisting of the URL at which the image can be accessed, an HTML fragment containing the clickable imagemap data, and the name of the map. We print out an EimageE tag that uses the URL of the map as its src attribute and the name of the map as the value of its usemap attribute. It is important to note that we must put a "#" in front of the name of the map in order to indicate that the map can be found in the same document as the EimageE tag. Lastly, we print out the map itself. =over 4 =item ($url,$map,$mapname) = $panel-Eimage_and_map(@options) Create the image in a web-accessible directory and return its URL, its clickable imagemap, and the name of the imagemap. The following options are recognized: Option Description ------ ----------- -url The URL to store the image at. -root The directory path that should be appended to the start of -url in order to obtain a physical directory path. -link A string pattern or coderef that will be used to generate the outgoing hypertext links for the imagemap. -title A string pattern or coderef that will be used to generate the "title" tags of each element in the imagemap (these appear as popup hint boxes in certain browsers). -target A string pattern or coderef that will be used to generate the window target for each element. This can be used to pop up a new window when the user clicks on an element. -mapname The name to use for the EmapE tag. If not provided, a unique one will be autogenerated for you. This method returns a three element list consisting of the URL at which the image has been written to, the imagemap HTML, and the name of the map. Usually you will incorporate this information into an HTML document like so: my ($url,$map,$mapname) = $panel->image_and_map(-link=>'http://www.google.com/search?q=$name'); print qq(),"\n"; print $map,"\n"; =item $url = $panel-Ecreate_web_image($url,$root) Create the image, write it into the directory indicated by concatenating $root and $url (i.e. "$root/$url"), and return $url. =item $map = $panel-Ecreate_web_map('mapname',$linkrule,$titlerule,$targetrule) Create a clickable imagemap named "mapname" using the indicated rules to generate the hypertext links, the element titles, and the window targets for the graphical elements. Return the HTML for the map, including the enclosing EmapE tag itself. =back To use this method effectively, you will need a web server and an image directory in the document tree that is writable by the web server user. For example, if your web server's document root is located at /var/www/html, you might want to create a directory named "tmpimages" for this purpose: mkdir /var/www/html/tmpimages chmod 1777 /var/www/html/tmpimages The 1777 privilege will allow anyone to create files and subdirectories in this directory, but only the owner of the file will be able to delete it. When you call image_and_map(), you must provide it with two vital pieces of information: the URL of the image directory and the physical location of the web server's document tree. In our example, you would call: $panel->image_and_map(-root => '/var/www/html',-url=>'/tmpimages'); If you are working with virtual hosts, you might wish to provide the hostname:portnumber part of the URL. This will work just as well: $panel->image_and_map(-root => '/var/www/html', -url => 'http://myhost.com:8080/tmpimages'); If you do not provide the -root argument, the method will try to figure it out from the DOCUMENT_ROOT environment variable. If you do not provide the -url argument, the method will assume "/tmp". During execution, the image_and_map() method will generate a unique name for the image using the Digest::MD5 module. You can get this module on CPAN and it B be installed in order to use image_and_map(). The imagename will be a long hexadecimal string such as "e7457643f12d413f20843d4030c197c6.png". Its URL will be /tmpimages/e7457643f12d413f20843d4030c197c6.png, and its physical path will be /var/www/html/tmpimages/e7457643f12d413f20843d4030c197c6.png In addition to providing directory information, you must also tell image_and_map() how to create outgoing links for each graphical feature, and, optionally, how to create the "hover title" (the popup yellow box displayed by most modern browsers), and the name of the window or frame to link to when the user clicks on it. There are three ways to specify the link destination: =over 4 =item 1. By configuring one or more tracks with a -link argument. =item 2. By configuring the panel with a -link argument. =item 3. By passing a -link argument in the call to image_and_map(). =back The -link argument can be either a string or a coderef. If you pass a string, it will be interpreted as a URL pattern containing runtime variables. These variables begin with a dollar sign ($), and are replaced at run time with the information relating to the selected annotation. Recognized variables include: $name The feature's name (display name) $id The feature's id (eg, PK from a database) $class The feature's class (group class) $method The feature's method (same as primary tag) $source The feature's source $ref The name of the sequence segment (chromosome, contig) on which this feature is located $description The feature's description (notes) $start The start position of this feature, relative to $ref $end The end position of this feature, relative to $ref $length Length of this feature $segstart The left end of $ref displayed in the detailed view $segend The right end of $ref displayed in the detailed view For example, to link each feature to a Google search on the feature's description, use the argument: -link => 'http://www.google.com/search?q=$description' Be sure to use single quotes around the pattern, or Perl will attempt to perform variable interpretation before image_and_map() has a chance to work on it. You may also pass a code reference to -link, in which case the code will be called every time a URL needs to be generated for the imagemap. The subroutine will be called with two arguments, the feature and the Bio::Graphics::Panel object, and it should return the URL to link to, or an empty string if a link is not desired. Here is a simple example: -link => sub { my ($feature,$panel) = @_; my $type = $feature->primary_tag; my $name = $feature->display_name; if ($primary_tag eq 'clone') { return "http://www.google.com/search?q=$name"; } else { return "http://www.yahoo.com/search?p=$name"; } The -link argument cascades. image_and_map() will first look for a -link option in the track configuration, and if that's not found, it will look in the Panel configuration (created during Bio::Graphics::Panel-Enew). If no -link configuration option is found in either location, then image_and_map() will use the value of -link passed in its argument list, if any. The -title and -target options behave in a similar manner to -link. -title is used to assign each feature "title" and "alt" attributes. The "title" attribute is used by many browsers to create a popup hints box when the mouse hovers over the feature's glyph for a preset length of time, while the "alt" attribute is used to create navigable menu items for the visually impaired. As with -link, you can set the title by passing either a substitution pattern or a code ref, and the -title option can be set in the track, the panel, or the method call itself in that order of priority. If not provided, image_and_map() will autogenerate its own title in the form "EmethodE Edisplay_nameE EseqidE:start..end". The -target option can be used to specify the window or frame that clicked features will link to. By default, when the user clicks on a feature, the loaded URL will replace the current page. You can modify this by providing -target with the name of a preexisting or new window name in order to create effects like popup windows, multiple frames, popunders and the like. The value of -target follows the same rules as -title and -link, including variable substitution and the use of code refs. NOTE: Each time you call image_and_map() it will generate a new image file. Images that are identical to an earlier one will reuse the same name, but those that are different, even by one pixel, will result in the generation of a new image. If you have limited disk space, you might wish to check the images directory periodically and remove those that have not been accessed recently. The following cron script will remove image files that haven't been accessed in more than 20 days. 30 2 * * * find /var/www/html/tmpimages -type f -atime +20 -exec rm {} \; =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L L L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/FeatureBase.pm000555001750001750 127612366325116 21613 0ustar00lsteinlstein000000000000package Bio::Graphics::FeatureBase; =head1 NAME Bio::Graphics::FeatureBase - Compatibility module =head1 SYNOPSIS This module has been replaced by Bio::SeqFeature::Lite but exists only for compatibility with legacy applications. =cut use strict; use base 'Bio::SeqFeature::Lite'; 1; __END__ =head1 SEE ALSO L, L, L,L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE. Copyright (c) 2006 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph.pm000555001750001750 22312712366325116 20551 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph; use strict; use Carp 'croak','cluck'; use constant BUMP_SPACING => 2; # vertical distance between bumped glyphs use Bio::Root::Version; use Bio::Graphics::Layout; use Memoize 'memoize'; memoize('options') unless $^O =~ /mswin/i; # memoize('option',NORMALIZER=>'_normalize_objects'); # helps ?? # my %OptionCache; # works better? use base qw(Bio::Root::Root); my %LAYOUT_COUNT; our @FEATURE_STACK; # the CM1 and CM2 constants control the size of the hash used to # detect collisions. use constant CM1 => 20; # big bin, x axis use constant CM2 => 20; # big bin, y axis use constant CM3 => 50; # small bin, x axis use constant CM4 => 50; # small bin, y axis use constant INF => 1<<16; use constant NINF => -INF(); use constant DEBUG => 0; use constant QUILL_INTERVAL => 8; # number of pixels between Jim Kent style intron "quills" ########################################################## # glyph-specific options # # the data structure returned by my_options will be merged # with values returned by this method in subclasses to # create a merged hash of all options that can be invoked # # retrieve this merged hash with # Bio::Graphics::Glyph::the_subclass->options # ########################################################## sub my_description { return < [ 'integer', 10, 'Height of the glyph.'], box_subparts=> [ 'integer', 0, 'If this option is greater than zero, then imagemaps constructed from this glyph will contain', 'bounding boxes around each subpart of a feature (e.g. each exon in a gene). The value of the', 'option indicates the depth of recursion.' ], fgcolor => [ ['color','featureScore','featureRGB'], 'black', 'The foreground color of the glyph, used for drawing outlines.', 'A value of "featureScore" will produce a greyscale gradient from the', "feature's score value based on a range from 0 (lightest) to 1000 (darkest).", 'A value of "featureRGB" will look for a feature tag named "RGB" and use that', 'for the color value.', 'See the next section for color choices.'], bgcolor => [ ['color','featureScore','featureRGB'], 'turquoise', 'The background color of the glyph, used for filling its contents.', 'A value of "featureScore" will produce a greyscale gradient from the', "feature's score value based on a range from 0 (lightest) to 1000 (darkest).", 'A value of "featureRGB" will look for a feature tag named "RGB" and use that', 'for the color value.', 'See the next section for color choices.'], fillcolor => [ 'color', 'turquoise', 'A synonym for -bgcolor.'], tkcolor => [ 'color', undef, 'Rarely-used option to flood-fill entire glyph with a single color', 'prior to rendering it.'], opacity => [ 'float', '1.0', 'Default opacity to apply to glyph background and foreground colors.', 'This is a value between 0.0 (completely transparent) to 1.0 (completely opaque.', 'If the color contains an explicit opacity (alpha) value, the default value', 'will be ignored'], linewidth => [ 'integer', 1, 'Thickness of line used to draw the glyph\'s outline.'], strand_arrow => [ 'boolean', undef, "Whether to indicate the feature's strandedness. If equal to 'ends'", "then only the right and left ends of multi-part features will show", "strandedness." ], stranded => [ 'boolean', undef, 'Synonym for -strand_arrow.', "Indicates whether to indicate the feature's strandedness. If equal to 'ends'", "then only the right and left ends of multi-part features will show", "strandedness." ], key => [ 'string', undef, 'The printed label to use to describe this track.'], category => [ 'string', undef, 'A descriptive category that will be added to the track key.'], no_subparts => [ 'boolean', undef, 'Set this option to a true value to suppress drawing of all its subparts.'], ignore_sub_part => [ 'string', undef, 'Pass a space-delimited list of primary_tag() names in order to selectively', 'suppress the drawing of subparts that match those primary tags.'], maxdepth => [ 'integer', undef, 'Specifies how many levels deep the glyph should traverse features looking', 'for subfeatures. A value of undef allows unlimited traversal. A value of', '0 suppresses traversal entirely for the same effect as -no_subparts.'], sort_order => [ ['left','right','low_score','high_score','longest','shortest','strand','name'], 'left', 'Control how features are layed out so that more "important" features sort', 'towards the top. See the Bio::Graphics::Glyph documentation for a description of how this' , 'works.'], always_sort => [ 'boolean', undef, 'Sort even when bumping is off.'], bump => [ 'integer', 1, 'This option dictates the behavior of the glyph when two features collide horizontally.', 'A value of +1 will bump the colliding feature downward using an algorithm that uses spaces efficiently.', 'A value of -1 will bump the colliding feature upward using the same algorithm.', 'Values of +2 and -2 will bump using a simple algorithm that is faster but does not use space as efficiently.', 'A value of 3 or "fast" will turn on a faster collision detection algorithm which', 'is only compatible with the default "left" sorting order.', 'A value of 0 suppresses collision control entirely.'], bump_limit => [ 'integer', -1, 'This option will cause bumping to stop after the indicated number of features', 'pile up. Subsequent collisions will not be bumped.'], feature_limit => [ 'integer', 0, 'This option will set an upper bound on the number of features to be displayed.', 'For this to work properly, features must be added one at a time using add_feature().'], hbumppad => [ 'integer', 2, 'Ordinarily collison control prevents two features from overlapping if they come within', '2 pixels of each other. This option allows you to change this value to give glyphs', 'more or less breathing space on the left and right.' ], hilite => [ 'color', undef, 'Highlight the glyph in the indicated color. Usually used as a callback to', 'selectively highlight glyphs that meet certain criteria.'], link => [ 'string', undef, 'When generating an imagemap, specify the pattern or callback for formatting', 'the link URL associated with the glyph.'], title => [ 'string', undef, 'When generating an imagemap, specify the pattern or callback for formatting', 'the link title associated with the glyph.'], target => [ 'string', undef, 'When generating an imagemap, specify the pattern or callback for formatting', 'the link target associated with the glyph.'], }; } # return a demo feature for the user to play with # The feature must not be longer than 500 bp for this to work. # Default is to return nothing. sub demo_feature { return; } sub gd { shift->panel->current_gd } # a bumpable graphical object that has bumpable graphical subparts # args: -feature => $feature_object (may contain subsequences) # -factory => $factory_object (called to create glyphs for subsequences) # In this scheme, the factory decides based on stylesheet information what glyph to # draw and what configurations options to us. This allows for heterogeneous tracks. sub new { my $class = shift; my %arg = @_; my $feature = $arg{-feature} or $class->throw("No feature $class"); my $factory = $arg{-factory} || $class->default_factory; my $level = $arg{-level} || 0; my $flip = $arg{-flip}; push @FEATURE_STACK,($feature,undef); my $self = bless {},$class; $self->{feature} = $feature; $self->{factory} = $factory; $self->{level} = $level; $self->{flip}++ if $flip; $self->{top} = 0; my $panel = $factory->panel; my $p_start = $panel->start; my $p_end = $panel->end; my @subfeatures; my @subglyphs; warn $self if DEBUG; warn $feature if DEBUG; @subfeatures = $self->subfeat($feature); if ($self->option('ignore_sub_part')) { my @tmparray; foreach (@subfeatures) { my $type = $_->method; my @ignore_list = split /\s+/, $self->option('ignore_sub_part'); my $ignore_str = join('|', @ignore_list); unless ($type =~ /$ignore_str/) { push @tmparray, $_; } } @subfeatures = @tmparray; } my @visible_subfeatures = grep {$p_start <= $_->end && $p_end >= $_->start} @subfeatures; $self->feature_has_subparts(@subfeatures>0); if (@visible_subfeatures) { # dynamic glyph resolution @subglyphs = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [$_, $_->left ] } $self->make_subglyph($level+1,@visible_subfeatures); $self->{feature_count} = scalar @subglyphs; $self->{parts} = \@subglyphs; } # warn "type=",$feature->type,", glyph=$self, subglyphs=@subglyphs"; my ($start,$stop) = ($self->start, $self->stop); if (defined $start && defined $stop && $start ne '') { # more paranoia ($start,$stop) = ($stop,$start) if $start > $stop; # sheer paranoia # the +1 here is critical for allowing features to meet nicely at nucleotide resolution my ($left,$right) = $factory->map_pt($start,$stop+1); $self->{left} = $left; $self->{width} = $right - $left + 1; } if (@subglyphs) { my $l = $subglyphs[0]->left; # this clashes with the pad_left calculation and is unecessary # $self->{left} = $l if !defined($self->{left}) || $l < $self->{left}; my $right = ( sort { $b<=>$a } map {$_->right} @subglyphs)[0]; my $w = $right - $self->{left} + 1; # this clashes with the pad_right calculation and is unecessary # $self->{width} = $w if !defined($self->{width}) || $w > $self->{width}; } $self->{point} = $arg{-point} ? $self->height : undef; splice(@FEATURE_STACK,-2); return $self; } # override this if you want to make a particular type of glyph rather than have the # factory decide. sub make_subglyph { my $self = shift; my $level = shift; my $factory = $self->{factory}; $factory->make_glyph($level,@_); } sub parts { my $self = shift; return unless $self->{parts}; return wantarray ? @{$self->{parts}} : $self->{parts}; } sub feature_count { my $self = shift; return $self->{feature_count} || 0; } sub features_clipped { my $self = shift; my $d = $self->{features_clipped}; $self->{features_clipped} = shift if @_; return $d; } sub _bump_feature_count { my $self = shift; my $count = shift || 1; return $self->{feature_count} += $count; } # this is different than parts(). parts() will return subglyphs # that are contained within the current viewing range. feature_has_subparts() # will return true if the feature has any subparts, even if they are off the # screen. sub feature_has_subparts { my $self = shift; return $self->{feature_has_subparts} = shift if @_; return 0 if $self->maxdepth == 0; my $feature = $self->feature; return 1 if $feature->can('compound') && $feature->compound; return $self->{feature_has_subparts}; } sub feature { shift->{feature} } sub factory { shift->{factory} } sub panel { shift->factory->panel } sub point { shift->{point} } sub scale { shift->factory->scale } sub flip { my $self = shift; my $d = $self->{flip}; $self->{flip} = shift if @_; $d; } sub start { my $self = shift; return $self->{start} if exists $self->{start}; if ($self->{flip}) { $self->{start} = defined $self->{feature}->end ? $self->panel->end + 1 - $self->{feature}->end : 0; } else { $self->{start} = defined $self->{feature}->start ? $self->{feature}->start : $self->panel->offset - 1 } return $self->{start}; } sub stop { my $self = shift; return $self->{stop} if exists $self->{stop}; if ($self->{flip}) { $self->{stop} = defined $self->{feature}->start ? $self->panel->end + 1 - $self->{feature}->start : $self->panel->offset - 1; } else { $self->{stop} = defined $self->{feature}->end ? $self->{feature}->end : $self->panel->offset+$self->panel->length+1; } return $self->{stop} } sub end { shift->stop } sub length { my $self = shift; $self->stop - $self->start }; sub score { my $self = shift; return $self->{score} if exists $self->{score}; return $self->{score} = ($self->{feature}->score || 0); } sub strand { my $self = shift; return $self->{strand} if exists $self->{strand}; return $self->{strand} = ($self->{feature}->strand || 0); } sub map_pt { shift->{factory}->map_pt(@_) } sub map_no_trunc { shift->{factory}->map_no_trunc(@_) } # add a feature (or array ref of features) to the list sub add_feature { my $self = shift; my $factory = $self->factory; for my $feature (@_) { if (ref $feature eq 'ARRAY') { $self->add_group(@$feature); $self->_bump_feature_count(scalar @$feature); } else { warn $factory if DEBUG; my $parts = $self->{parts} ||= []; my $limit = $self->feature_limit; my $count = $self->_bump_feature_count; if (!$limit || $count <= $limit) { push @$parts,$factory->make_glyph(0,$feature); } elsif (rand() < $limit/$count) { $self->features_clipped(1); $parts->[rand @$parts] = $factory->make_glyph(0,$feature); # subsample } } } } # link a set of features together so that they bump as a group sub add_group { my $self = shift; my @features = ref($_[0]) eq 'ARRAY' ? @{$_[0]} : @_; my $f = Bio::Graphics::Feature->new( -segments=>\@features, -type => 'group', ); $self->add_feature($f); $f; } sub top { my $self = shift; my $g = $self->{top}; $self->{top} = shift if @_; $g; } sub left { my $self = shift; return $self->{left} - $self->pad_left; } sub right { my $self = shift; return $self->left + $self->layout_width - 1; } sub bottom { my $self = shift; $self->top + $self->layout_height - 1; } sub height { my $self = shift; return $self->{height} if exists $self->{height}; my $baseheight = $self->option('height'); # what the factory says return $self->{height} = $baseheight; } sub width { my $self = shift; my $g = $self->{width}; $self->{width} = shift if @_; return $g; } sub layout_height { my $self = shift; push @FEATURE_STACK,$self->feature; my $result = $self->layout; pop @FEATURE_STACK; return $result; } sub layout_width { my $self = shift; return $self->width + $self->pad_left + $self->pad_right; } # returns the rectangle that surrounds the physical part of the # glyph, excluding labels and other "extra" stuff sub calculate_boundaries {return shift->bounds(@_);} sub bounds { my $self = shift; my ($dx,$dy) = @_; $dx += 0; $dy += 0; ($dx + $self->{left}, $dy + $self->top + $self->pad_top, $dx + $self->{left} + $self->{width} - 1, $dy + $self->bottom - $self->pad_bottom); } sub box { my $self = shift; my @result = ($self->left,$self->top,$self->right,$self->bottom); return @result; } sub unfilled_box { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2,$fg,$bg,$lw) = @_; $lw = $self->linewidth; unless ($fg) { $fg ||= $self->fgcolor; $fg = $self->set_pen($lw,$fg) if $lw > 1; } unless ($bg) { $bg ||= $self->bgcolor; $bg = $self->set_pen($lw,$bg) if $lw > 1; } # draw a box $gd->rectangle($x1,$y1,$x2,$y2,$fg); # if the left end is off the end, then cover over # the leftmost line my ($width) = $gd->getBounds; $gd->line($x1,$y1+$lw,$x1,$y2-$lw,$bg) if $x1 < $self->panel->pad_left; $gd->line($x2,$y1+$lw,$x2,$y2-$lw,$bg) if $x2 > $width - $self->panel->pad_right; } # return boxes surrounding each part sub boxes { my $self = shift; push @FEATURE_STACK,$self->feature; my ($left,$top,$parent) = @_; $top += 0; $left += 0; my @result; $self->layout; $parent ||= $self; my $subparts = $self->box_subparts || 0; for my $part ($self->parts) { my $type = $part->feature->primary_tag || ''; if ($type eq 'group' or $subparts > $part->level) { push @result,$part->boxes($left,$top+$self->top+$self->pad_top,$parent); next if $type eq 'group'; } my ($x1,$y1,$x2,$y2) = $part->box; $x2++ if $x1==$x2; push @result,[$part->feature, $left + $x1,$top+$self->top+$self->pad_top+$y1, $left + $x2,$top+$self->top+$self->pad_top+$y2, $parent]; } pop @FEATURE_STACK; return wantarray ? @result : \@result; } sub box_subparts { my $self = shift; return $self->{box_subparts} if exists $self->{box_subparts}; return $self->{box_subparts} = $self->_box_subparts; } sub _box_subparts { shift->option('box_subparts') } # this should be overridden for labels, etc. # allows glyph to make itself thicker or thinner depending on # domain-specific knowledge sub pad_top { my $self = shift; return 0; } sub pad_bottom { my $self = shift; return 0; } sub pad_left { my $self = shift; my @parts = $self->parts or return 0; my $max = 0; foreach (@parts) { my $pl = $_->pad_left; $max = $pl if $max < $pl; } $max; } sub pad_right { my $self = shift; my @parts = $self->parts or return 0; my $max = 0; my $max_right = 0; foreach (@parts) { my $right = $_->right; my $pr = $_->pad_right; if ($max_right < $pr+$right) { $max = $pr; $max_right = $pr+$right; } } $max; } # move relative to parent sub move { my $self = shift; my ($dx,$dy) = @_; $self->{left} += $dx; $self->{top} += $dy; # because the feature parts use *absolute* not relative addressing # we need to move each of the parts horizontally, but not vertically $_->move($dx,0) foreach $self->parts; } # get an option sub option { my $self = shift; my $option_name = shift; local $^W=0; my @args = ($option_name,@{$self}{qw(partno total_parts)}); my $factory = $self->{factory} or return; return $factory->option($self,@args); } # get an option that might be a code reference sub code_option { my $self = shift; my $option_name = shift; my $factory = $self->factory or return; $factory->get_option($option_name); } # set an option globally sub configure { my $self = shift; my $factory = $self->factory; my $option_map = $factory->option_map; while (@_) { my $option_name = shift; my $option_value = shift; ($option_name = lc $option_name) =~ s/^-//; $option_map->{$option_name} = $option_value; } } # some common options sub color { my $self = shift; my $color = shift; my $index = $self->option($color); # turn into a color index return $self->translate_color($index) if defined $index; return 0; } sub translate_color { my $self = shift; my $color = shift; return $self->_translate_color($color); } sub _translate_color { my $self = shift; my $color = shift; my $opacity = $self->default_opacity; return $opacity < 1 ? $self->factory->transparent_color($opacity,$color) : $self->factory->translate_color($color); } # return value: # 0 no bumping # +1 bump down # -1 bump up # +2 simple bump down # -2 simple bump up # +3 optimized (fast) bumping sub bump { my $self = shift; my $bump = $self->option('bump'); return $bump; } # control horizontal and vertical collision control sub hbumppad { my $self = shift; return $self->{_hbumppad} if exists $self->{_hbumppad}; my $hbumppad = $self->option('hbumppad'); $hbumppad = 2 unless defined $hbumppad; return $self->{_hbumppad}= $hbumppad; } sub default_opacity { my $self = shift; return $self->{default_opacity} if defined $self->{default_opacity}; my $o = $self->option('opacity'); return $self->{default_opacity} = defined $o ? $o : 1.0; } # we also look for the "color" option for Ace::Graphics compatibility sub fgcolor { my $self = shift; my $fgcolor = $self->option('color') || $self->option('fgcolor'); my $index = $fgcolor; $index = 'black' unless defined $index; if ($index eq 'featureRGB') { ($index) = eval{$self->feature->get_tag_values('RGB')}; $index ||= $fgcolor; } elsif ($index eq 'featureScore') { $index = $self->score_to_color; } return $self->_translate_color($index); } #add for compatibility sub fillcolor { my $self = shift; return $self->bgcolor; } # we also look for the "fillcolor" option for Ace::Graphics compatibility sub bgcolor { my $self = shift; my ($bgcolor) = eval{$self->feature->get_tag_values('bgcolor')}; $bgcolor ||= $self->option('bgcolor'); # Let feature attribute override color my $index = defined $bgcolor ? $bgcolor : $self->option('fillcolor'); $index = 'white' unless defined $index; if ($index eq 'featureRGB') { ($index) = eval{$self->feature->get_tag_values('RGB')}; $index ||= $bgcolor; } elsif ($index eq 'featureScore') { $index = $self->score_to_color; } return $self->_translate_color($index); } # for compatibility with UCSC genome browser useScore option sub score_to_color { my $self = shift; my $feature = $self->feature; my ($score) = $feature->can('score') ? $feature->score : eval{$feature->has_tag('score')} || 0; my $max_score = 945; # defined by UCSC docs my $min_score = 166; my $min_gray = 0; my $max_gray = 255; my $rgb_per_score = ($max_gray-$min_gray)/($max_score-$min_score); $score = $max_score if $score > $max_score; $score = $min_score if $score < $min_score; my $gray = int($max_gray - ($min_gray + ($score-$min_score) * $rgb_per_score)); return "rgb($gray,$gray,$gray)"; } sub getfont { my $self = shift; my $option = shift || 'font'; my $default = shift; my $font = $self->option($option) || $default; return unless $font; my $gdfont = $self->panel->gdfont($font); $self->configure($option => $gdfont); return $gdfont; } sub tkcolor { # "track color" my $self = shift; $self->option('tkcolor') or return; return $self->color('tkcolor') } sub image_class { shift->{factory}->{panel}->{image_class}; } sub polygon_package { shift->{factory}->{panel}->{polygon_package}; } sub layout_sort { my $self = shift; my $sortfunc; my $opt = $self->code_option("sort_order"); if (!$opt) { $sortfunc = sub { $a->start <=> $b->start }; } elsif (ref $opt eq 'CODE') { $self->throw('sort_order subroutines must use the $$ prototype') unless prototype($opt) eq '$$'; $sortfunc = $opt; } elsif ($opt =~ /^sub\s+\{/o) { $sortfunc = eval $opt; } else { # build $sortfunc for ourselves: my @sortbys = split(/\s*\|\s*/o, $opt); $sortfunc = 'sub { '; my $sawleft = 0; # not sure I can make this schwartzian transformed for my $sortby (@sortbys) { if ($sortby eq "left" || $sortby eq "default") { $sortfunc .= '($a->start <=> $b->start) || '; $sawleft++; } elsif ($sortby eq "right") { $sortfunc .= '($a->end <=> $b->end) || '; } elsif ($sortby eq "low_score") { $sortfunc .= '($a->score <=> $b->score) || '; } elsif ($sortby eq "high_score") { $sortfunc .= '($b->score <=> $a->score) || '; } elsif ($sortby eq "longest") { $sortfunc .= '(($b->length) <=> ($a->length)) || '; } elsif ($sortby eq "shortest") { $sortfunc .= '(($a->length) <=> ($b->length)) || '; } elsif ($sortby eq "strand") { $sortfunc .= '($b->strand <=> $a->strand) || '; } elsif ($sortby eq "name") { $sortfunc .= '($a->feature->display_name cmp $b->feature->display_name) || '; } } unless ($sawleft) { $sortfunc .= ' ($a->left <=> $b->left) '; } else { $sortfunc .= ' 0'; } $sortfunc .= '}'; $sortfunc = eval $sortfunc; } # cache this # $self->factory->set_option(sort_order => $sortfunc); my @things = sort $sortfunc @_; return @things; } # handle collision detection sub layout { my $self = shift; return $self->{layout_height} if exists $self->{layout_height}; my @parts = $self->parts; return $self->{layout_height} = $self->height + $self->pad_top + $self->pad_bottom unless @parts; my $bump_direction = $self->bump; my $bump_limit = $self->bump_limit || -1; $bump_direction = 'fast' if $bump_direction && $bump_direction == 1 && !$self->code_option('sort_order'); $_->layout foreach @parts; # recursively lay out # no bumping requested, or only one part here, or the tracks are supposed to be overlay if (@parts == 1 || !$bump_direction || ($bump_direction eq 'fast' and $self->code_option('overlay') == 1)) { my $highest = 0; foreach (@parts) { my $height = $_->layout_height; $highest = $height > $highest ? $height : $highest; } return $self->{layout_height} = $highest + $self->pad_top + $self->pad_bottom; } if ($bump_direction eq 'fast' or $bump_direction == 3) { return $self->{layout_height} = $self->optimized_layout(\@parts) + $self->pad_bottom + $self->pad_top -1;# - $self->top + 1; } my (%bin1,%bin2); my $limit = 0; my $recent_pos = 0; my $max_pos = 0; # strand bumping turns on bumping for features that are in opposite strands! # features in the same strand are allowed to overlap my $strand_bumping; if ($bump_direction eq 'overlap') { $bump_direction = 1; $strand_bumping++; } for my $g ($self->layout_sort(@parts)) { my $height = $g->{layout_height}; # Simple +/- 2 bumping. Every feature gets its very own line if (abs($bump_direction) >= 2) { $g->move(0,$limit); $limit += $height + BUMP_SPACING if $bump_direction > 0; $limit -= $height + BUMP_SPACING if $bump_direction < 0; next; } # we get here for +/- 1 bumping my $pos = 0; my $bumplevel = 0; my $left = $g->left; my $right = $g->right; my $strand = $g->strand || 0; my $search_mode = 'down'; while (1) { # stop bumping if we've gone too far down if ($bump_limit > 0 && $bumplevel++ >= $bump_limit) { $g->{overbumped}++; # this flag can be used to suppress label and description foreach ($g->parts) { $_->{overbumped}++; } last; } # look for collisions my $bottom = $pos + $height; my $bin = \%bin1; $bin = $strand >= 0 ? \%bin1 : \%bin2 if $strand_bumping; my $collision = $self->collides($bin,CM1,CM2,$left,$pos,$right,$bottom) or last; if ($bump_direction > 0) { $pos = $collision->[3] + BUMP_SPACING; # collision, so bump } else { $pos -= BUMP_SPACING; } $pos++ if $pos % 2; # correct for GD rounding errors } $g->move(0,$pos); my $bin = \%bin1; $bin = $strand >= 0 ? \%bin2 : \%bin1 if $strand_bumping; # note reversed order - features in opposite strands bump $self->add_collision($bin,CM1,CM2,$left,$g->top,$right,$g->bottom); $recent_pos = $pos; $max_pos = $pos if $pos > $max_pos; } # If -1 bumping was allowed, then normalize so that the top glyph is at zero if ($bump_direction < 0) { my $topmost; foreach (@parts) { my $top = $_->top; $topmost = $top if !defined($topmost) or $top < $topmost; } my $offset = - $topmost; $_->move(0,$offset) foreach @parts; } # find new height my $bottom = 0; foreach (@parts) { $bottom = $_->bottom if $_->bottom > $bottom; } return $self->{layout_height} = $self->pad_bottom + $self->pad_top + $bottom - $self->top + 1; } # the $%occupied structure is a hash of {left,top} = [left,top,right,bottom] sub collides { my $self = shift; my ($occupied,$cm1,$cm2,$left,$top,$right,$bottom) = @_; my @keys = $self->_collision_keys($cm1,$cm2,$left,$top,$right,$bottom); my $hspacing = $self->hbumppad; my $collides = 0; for my $k (@keys) { next unless exists $occupied->{$k}; for my $bounds (@{$occupied->{$k}}) { my ($l,$t,$r,$b) = @$bounds; next unless $right+$hspacing > $l and $left-$hspacing < $r and $bottom >= $t and $top <= $b; $collides = $bounds; last; } } $collides; } sub add_collision { my $self = shift; my ($occupied,$cm1,$cm2,$left,$top,$right,$bottom) = @_; my $value = [$left,$top,$right,$bottom]; my @keys = $self->_collision_keys($cm1,$cm2,@$value); push @{$occupied->{$_}},$value foreach @keys; } sub _collision_keys { my $self = shift; my ($binx,$biny,$left,$top,$right,$bottom) = @_; my @keys; my $bin_left = int($left/$binx); my $bin_right = int($right/$binx); my $bin_top = int($top/$biny); my $bin_bottom = int($bottom/$biny); for (my $x=$bin_left;$x<=$bin_right; $x++) { for (my $y=$bin_top;$y<=$bin_bottom; $y++) { push @keys,join(',',$x,$y); } } @keys; } # jbrowse layout that acts by keeping track of contours of the free space sub optimized_layout { my $self = shift; my $parts = shift; my $hspacing = $self->hbumppad; my $bump_limit = $self->bump_limit; my @rects = map { $_ => [ $_->left, $_->right + $hspacing, $_->{layout_height}+BUMP_SPACING ] } $self->layout_sort(@$parts); my $layout = Bio::Graphics::Layout->new(0,$self->panel->right); my $overbumped; while (@rects) { my ($part,$rect) = splice(@rects,0,2); my $offset = $layout->addRect("$part",@$rect); if ($overbumped && $offset > $overbumped) { $part->move(0,$overbumped); next; } $part->move(0,$offset); $overbumped = $offset if $bump_limit > 0 && $offset >= $bump_limit * $rect->[2]; } return $overbumped && $overbumped < $layout->totalHeight ? $overbumped : $layout->totalHeight; } sub draw_it { my $self = shift; push @FEATURE_STACK,$self->feature; $self->draw(@_); pop @FEATURE_STACK; } sub draw { my $self = shift; my $gd = shift; my ($left,$top,$partno,$total_parts) = @_; $self->panel->startGroup($gd); my $connector = $self->connector; if (my @parts = $self->parts) { # invoke sorter if user wants to sort always and we haven't already sorted # during bumping. @parts = $self->layout_sort(@parts) if !$self->bump && $self->option('always_sort'); my $x = $left; my $y = $top + $self->top + $self->pad_top; $self->draw_connectors($gd,$x,$y) if $connector && $connector ne 'none'; my $last_x; for (my $i=0; $i<@parts; $i++) { # lie just a little bit to avoid lines overlapping and make the picture prettier my $fake_x = $x; $fake_x-- if defined $last_x && $parts[$i]->left - $last_x == 1; $parts[$i]->draw_highlight($gd,$fake_x,$y); $parts[$i]->draw_it($gd,$fake_x,$y,$i,scalar(@parts)); $last_x = $parts[$i]->right; } } else { # no part $self->draw_connectors($gd,$left,$top) if $connector && $connector ne 'none'; # && $self->{level} == 0; $self->draw_component($gd,$left,$top,$partno,$total_parts) unless $self->feature_has_subparts; } $self->panel->endGroup($gd); } sub connector { return } sub parts_overlap { my $self = shift; return $self->option('parts_overlap'); } sub bump_limit { shift->option('bump_limit') } # the "level" is the level of testing of the glyph # groups are level -1, top level glyphs are level 0, subcomponents are level 1 and so forth. sub level { shift->{level}; } # return the feature's parent; sub parent_feature { my $self = shift; my $ancestors = shift; $ancestors = 1 unless defined $ancestors; return unless @FEATURE_STACK; my $index = $#FEATURE_STACK - $ancestors; return unless $index >= 0; return $FEATURE_STACK[$index]; } sub draw_connectors { my $self = shift; return if $self->{overbumped}; my $gd = shift; my ($dx,$dy) = @_; my @parts = sort { $a->left <=> $b->left } $self->parts; for (my $i = 0; $i < @parts-1; $i++) { # don't let connectors double-back on themselves next if ($parts[$i]->bounds)[2] > ($parts[$i+1]->bounds)[0] && !$self->parts_overlap; $self->_connector($gd,$dx,$dy,$parts[$i]->bounds,$parts[$i+1]->bounds); } # extra connectors going off ends if (@parts) { my($x1,$y1,$x2,$y2) = $self->bounds(0,0); my($xl,$xt,$xr,$xb) = $parts[0]->bounds; $self->_connector($gd,$dx,$dy,$x1,$xt,$x1,$xb,$xl,$xt,$xr,$xb) if $x1 < $xl; @parts = sort {$a->right<=>$b->right} @parts; my ($xl2,$xt2,$xr2,$xb2) = $parts[-1]->bounds; if ($x2 > $xr2) { $self->_connector($gd,$dx,$dy,$parts[-1]->bounds,$x2,$xt2,$x2,$xb2); } } else { # This code draws the connectors from end-to-end when there are no parts in # view (e.g. zoomed into a gap in an alignment). my ($x1,$y1,$x2,$y2) = $self->bounds($dx,$dy); $self->draw_connector($gd,$y1,$y2,$x1,$y1,$y2,$x2); } } # return true if this feature should be highlited sub hilite_color { my $self = shift; return if $self->level>0; # only highlite top level glyphs my $index = $self->option('hilite') or return; $self->factory->translate_color($index); } sub draw_highlight { my $self = shift; my ($gd,$left,$top) = @_; my $color = $self->hilite_color or return; my @bounds = $self->bounds; $gd->filledRectangle($bounds[0]+$left - 3, $bounds[1]+$top - 3, $bounds[2]+$left + 3, $bounds[3]+$top + 3, $color); } sub _connector { my $self = shift; my ($gd, $dx,$dy, $xl,$xt,$xr,$xb, $yl,$yt,$yr,$yb) = @_; my $left = $dx + $xr; my $right = $dx + $yl; my $top1 = $dy + $xt; my $bottom1 = $dy + $xb; my $top2 = $dy + $yt; my $bottom2 = $dy + $yb; # restore this comment if you don't like the group dash working # its way backwards. return if $right-$left < 1 && !$self->isa('Bio::Graphics::Glyph::group'); $self->draw_connector($gd, $top1,$bottom1,$left, $top2,$bottom2,$right, ); } sub draw_connector { my $self = shift; my $gd = shift; my $color = $self->connector_color; my $connector_type = $self->connector or return; if ($connector_type eq 'hat') { $self->draw_hat_connector($gd,$color,@_); } elsif ($connector_type eq 'solid') { $self->draw_solid_connector($gd,$color,@_); } elsif ($connector_type eq 'dashed') { $self->draw_dashed_connector($gd,$color,@_); } elsif ($connector_type eq 'quill') { $self->draw_quill_connector($gd,$color,@_); } elsif ($connector_type eq 'crossed') { $self->draw_crossed_connector($gd,$color,@_); } else { ; # draw nothing } } sub draw_hat_connector { my $self = shift; my $gd = shift; my $color = shift; my ($top1,$bottom1,$left,$top2,$bottom2,$right) = @_; cluck "gd object is $gd" unless ref $gd; my $center1 = ($top1 + $bottom1)/2; my $quarter1 = $top1 + ($bottom1-$top1)/4; my $center2 = ($top2 + $bottom2)/2; my $quarter2 = $top2 + ($bottom2-$top2)/4; if ($center1 != $center2) { $self->draw_solid_connector($gd,$color,@_); return; } if ($right - $left > 4) { # room for the inverted "V" my $middle = $left + int(($right - $left)/2); $gd->line($left,$center1,$middle,$top1,$color); $gd->line($middle,$top1,$right-1,$center1,$color); } elsif ($right-$left > 1) { # no room, just connect $gd->line($left,$quarter1,$right-1,$quarter1,$color); } } sub draw_solid_connector { my $self = shift; my $gd = shift; my $color = shift; my ($top1,$bottom1,$left,$top2,$bottom2,$right) = @_; my $center1 = ($top1 + $bottom1)/2; my $center2 = ($top2 + $bottom2)/2; $gd->line($left,$center1,$right,$center2,$color); } sub draw_dashed_connector { my $self = shift; my $gd = shift; my $color = shift; my ($top1,$bottom1,$left,$top2,$bottom2,$right) = @_; my $center1 = ($top1 + $bottom1)/2; my $center2 = ($top2 + $bottom2)/2; my $image_class = $self->panel->image_class; my $gdTransparent = $image_class->gdTransparent; my $gdStyled = $image_class->gdStyled; $gd->setStyle($color,$color,$gdTransparent,$gdTransparent); $gd->line($left,$center1,$right,$center2,$gdStyled); } sub draw_quill_connector { my $self = shift; my $gd = shift; my $color = shift; my ($top1,$bottom1,$left,$top2,$bottom2,$right) = @_; my $center1 = ($top1 + $bottom1)/2; my $center2 = ($top2 + $bottom2)/2; $gd->line($left,$center1,$right,$center2,$color); my $direction = $self->feature->strand; return unless $direction; $direction *= -1 if $self->{flip}; if ($direction > 0) { my $start = $left+4; my $end = $right-1; for (my $position=$start; $position <= $end; $position += QUILL_INTERVAL) { $gd->line($position,$center1,$position-2,$center1-2,$color); $gd->line($position,$center1,$position-2,$center1+2,$color); } } else { my $start = $left+1; my $end = $right-4; for (my $position=$start; $position <= $end; $position += QUILL_INTERVAL) { $gd->line($position,$center1,$position+2,$center1-2,$color); $gd->line($position,$center1,$position+2,$center1+2,$color); } } } sub draw_crossed_connector { my $self = shift; my $gd = shift; my $color = shift; my ($top1,$bottom1,$left,$top2,$bottom2,$right) = @_; #Draw the horizontal line my $center1 = ($top1 + $bottom1)/2; my $center2 = ($top2 + $bottom2)/2; $gd->line($left,$center1,$right,$center2,$color); #Extra validations ($left, $right) = ($right, $left) if ($right < $left); ($top1, $bottom1) = ($bottom1, $top1) if ($bottom1 < $top1); ($top2, $bottom2) = ($bottom2, $top2) if ($bottom2 < $top2); #Draw the "X" my $middle = int(($right - $left) / 2) + $left; my $midLen = int(($bottom1 - $top1) / 2); $gd->line($middle-$midLen,$top1, $middle+$midLen,$bottom2,$color); $gd->line($middle-$midLen,$bottom1,$middle+$midLen,$top2,$color); } sub filled_box { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2,$bg,$fg,$lw) = @_; $bg ||= $self->bgcolor; $fg ||= $self->fgcolor; $lw ||= $self->option('linewidth') || 1; $x2 = $x1+1 if abs($x2-$x1) < 1; $gd->filledRectangle($x1,$y1,$x2,$y2,$bg); $fg = $self->set_pen($lw,$fg) if $lw > 1; # draw a box $gd->rectangle($x1,$y1,$x2,$y2,$fg); # if the left end is off the end, then cover over # the leftmost line $self->blunt($gd,$x1,$y1,$x2,$y2,$bg,$fg,$lw); } sub blunt { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2,$bg,$fg,$lw) = @_; # if the left end is off the end, then cover over # the leftmost line my ($width) = $gd->getBounds; $bg = $self->set_pen($lw,$bg) if $lw > 1; $gd->line($x1,$y1+$lw,$x1,$y2-$lw,$bg) if $x1 < $self->panel->pad_left; $gd->line($x2,$y1+$lw,$x2,$y2-$lw,$bg) if $x2 > $width - $self->panel->pad_right; } sub filled_oval { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2,$bg,$fg,$lw) = @_; my $cx = ($x1+$x2)/2; my $cy = ($y1+$y2)/2; $fg ||= $self->fgcolor; $bg ||= $self->bgcolor; $lw ||= $self->linewidth; $fg = $self->set_pen($lw) if $lw > 1; # Maintain backwards compatability with gd 1.8.4 # which does not support the ellipse methods. # can() method fails with GD::SVG... if ($gd->can('ellipse') || $gd =~ /SVG/ ) { $gd->filledEllipse($cx,$cy,$x2-$x1,$y2-$y1,$bg); # Draw the edge around the ellipse $gd->ellipse($cx,$cy,$x2-$x1,$y2-$y1,$fg); } else { $gd->arc($cx,$cy,$x2-$x1,$y2-$y1,0,360,$fg); $gd->fillToBorder($cx,$cy,$fg,$bg); } } sub oval { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = @_; my $cx = ($x1+$x2)/2; my $cy = ($y1+$y2)/2; my $fg = $self->fgcolor; my $linewidth = $self->linewidth; $fg = $self->set_pen($linewidth) if $linewidth > 1; # Maintain backwards compatability with gd 1.8.4 which does not # support the ellipse method. if ($gd->can('ellipse') || $gd =~ /SVG/ ) { $gd->ellipse($cx,$cy,$x2-$x1,$y2-$y1,$fg); } else { $gd->arc($cx,$cy,$x2-$x1,$y2-$y1,0,360,$fg); } } sub filled_arrow { my $self = shift; my $gd = shift; my $orientation = shift; my ($x1,$y1,$x2,$y2,$fg,$bg,$force) = @_; $orientation *= -1 if $self->{flip}; my ($width) = $gd->getBounds; my $indent = $y2-$y1 < $x2-$x1 ? $y2-$y1 : ($x2-$x1)/2; my $panel = $self->panel; my $offend_left = $x1 < $panel->pad_left; my $offend_right = $x2 > $panel->width + $panel->pad_left; return $self->filled_box($gd,@_) if !$force && (($orientation == 0) or ($x1 < 0 && $orientation < 0) or ($x2 > $width && $orientation > 0) or ($indent <= 0) or ($x2 - $x1 < 3) or ($offend_left && $orientation < 0) or ($offend_right && $orientation > 0)); $fg ||= $self->fgcolor; $bg ||= $self->bgcolor; my $lw = $self->option('linewidth') || 1; $fg = $self->set_pen($lw,$fg) if $lw > 1; my $pkg = $self->polygon_package; my $poly = $pkg->new(); if ($orientation >= 0) { $poly->addPt($x1,$y1); $poly->addPt($x2-$indent,$y1); $poly->addPt($x2,($y2+$y1)/2); $poly->addPt($x2-$indent,$y2); $poly->addPt($x1,$y2); } else { $poly->addPt($x2,$y1); $poly->addPt($x2,$y2); $poly->addPt($x1+$indent,$y2); $poly->addPt($x1,($y2+$y1)/2); $poly->addPt($x1+$indent,$y1); } $gd->filledPolygon($poly,$bg); $gd->polygon($poly,$fg); # blunt it a bit if off the end $self->blunt($gd,$x1,$y1,$x2,$y2,$bg,$fg,$lw) if ($offend_left && $orientation > 0) or ($offend_right && $orientation < 0); } sub linewidth { shift->option('linewidth') || 1; } sub font_width { my $self = shift; my $font = shift; $self->panel->string_width($font||$self->font,'m'); } sub font_height { my $self = shift; my $font = shift; $self->panel->string_height($font||$self->font,'hj'); } sub string_width { my $self = shift; my ($string,$font) = @_; $self->panel->string_width($font||$self->font,$string||'m'); } sub string_height { my $self = shift; my ($string,$font) = @_; $self->panel->string_height($font||$self->font,$string||'hj'); } sub fill { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = @_; if ( ($x2-$x1) >= 2 && ($y2-$y1) >= 2 ) { $gd->fill($x1+1,$y1+1,$self->bgcolor); } } sub set_pen { my $self = shift; my ($linewidth,$color) = @_; $linewidth ||= $self->linewidth; $color ||= $self->fgcolor; return $color unless $linewidth > 1; $self->panel->set_pen($linewidth,$color); } sub draw_component { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; my($x1,$y1,$x2,$y2) = $self->bounds($left,$top); # clipping my $panel = $self->panel; return unless $x2 >= $panel->left and $x1 <= $panel->right; if ($self->stranded) { $self->filled_arrow($gd, $self->feature->strand, $x1, $y1, $x2, $y2) } else { $self->filled_box($gd, $x1, $y1, $x2, $y2) } } sub show_strand { my $self = shift; my $s = $self->option('strand_arrow'); return $s if defined $s; return $self->option('stranded'); } sub stranded { my $self = shift; my $s = $self->show_strand; return unless $s; return 1 unless $s eq 'ends'; my $f = $self->feature; my $strand = $f->strand; $strand *= -1 if $self->{flip}; my $part_no = $self->{partno}; my $parts = $self->{total_parts}; return ($strand > 0 && $part_no == $parts-1) || ($strand < 0 && $part_no == 0); } sub no_subparts { return shift->option('no_subparts'); } sub maxdepth { my $self = shift; my $maxdepth = $self->option('maxdepth'); return $maxdepth if defined $maxdepth; # $feature->compound is an artefact from aggregators. Sadly, an aggregated feature can miss # parts that are out of the query range - this is a horrible mis-feature. Aggregated features have # a compound flag to hack around this. my $feature = $self->feature; return 1 if $feature->can('compound') && $feature->compound; return; } sub feature_limit { return shift->option('feature_limit') || 0; } sub exceeds_depth { my $self = shift; my $max_depth = $self->maxdepth; return unless defined $max_depth; my $current_depth = $self->level || 0; return $current_depth >= $max_depth; } # memoize _subfeat -- it's a bottleneck with segments sub subfeat { my $self = shift; my $feature = shift; return $self->_subfeat($feature) unless ref $self; # protect against class invocation return if $self->level == 0 && $self->no_subparts; return if $self->exceeds_depth; return @{$self->{cached_subfeat}{$feature}} if exists $self->{cached_subfeat}{$feature}; my @ss = $self->_subfeat($feature); $self->{cached_subfeat}{$feature} = \@ss; @ss; } sub _subfeat { my $class = shift; my $feature = shift; return $feature->segments if $feature->can('segments'); my @split = eval { my $id = $feature->location->seq_id; my @subs = $feature->location->sub_Location; grep {$id eq $_->seq_id} @subs; }; return @split if @split; # Either the APIs have changed, or I got confused at some point... return $feature->get_SeqFeatures if $feature->can('get_SeqFeatures'); return $feature->sub_SeqFeature if $feature->can('sub_SeqFeature'); return; } # synthesize a key glyph sub keyglyph { my $self = shift; my $feature = $self->make_key_feature; my $factory = $self->factory->clone; $factory->set_option(label => 1); $factory->set_option(description => 0); $factory->set_option(bump => 0); $factory->set_option(connector => 'solid'); return $factory->make_glyph(0,$feature); } # synthesize a key glyph sub make_key_feature { my $self = shift; my $scale = 1/$self->scale; # base pairs/pixel # one segments, at pixels 0->80 my $offset = $self->panel->offset; my $feature = Bio::Graphics::Feature->new(-start =>0 * $scale +$offset, -end =>80*$scale+$offset, -name => $self->make_key_name(), -strand => '+1'); return $feature; } sub make_key_name { my $self = shift; # breaking encapsulation - this should be handled by the panel my $key = $self->option('key') || ''; return $key unless $self->panel->add_category_labels; my $category = $self->option('category'); my $name = defined $category ? "$key ($category)" : $key; return $name; } sub all_callbacks { my $self = shift; return $self->{all_callbacks} if exists $self->{all_callbacks}; # memoize return $self->{all_callbacks} = $self->_all_callbacks; } sub _all_callbacks { my $self = shift; my $track_level = $self->option('all_callbacks'); return $track_level if defined $track_level; return $self->panel->all_callbacks; } sub subpart_callbacks { my $self = shift; return $self->{subpart_callbacks} if exists $self->{subpart_callbacks}; # memoize return $self->{subpart_callbacks} = $self->_subpart_callbacks; } sub _subpart_callbacks { my $self = shift; return 1 if $self->all_callbacks; my $do_subparts = $self->option('subpart_callbacks'); return $self->{level} == 0 || ($self->{level} > 0 && $do_subparts); } sub default_factory { croak "no default factory implemented"; } sub finished { my $self = shift; delete $self->{factory}; foreach (@{$self->{parts} || []}) { $_->finished; } delete $self->{parts}; } ############################################################ # autogeneration of options documentation ############################################################ sub options { my $self = shift; my $seenit = shift || {}; no strict 'refs'; my $class = ref $self || $self; my $isa = "$class\:\:ISA"; $seenit->{$class}++; my $options = $self->my_options if defined &{"$class\:\:my_options"}; my @inherited_options; for my $base (@$isa) { next if $seenit->{$base}++; $base->can('options') or next; my $o = $base->options($seenit); push @inherited_options,%$o; } return wantarray ? ($options,{@inherited_options}) : {@inherited_options,%$options}; } sub options_usage { my $self = shift; my ($read,$write); pipe($read,$write); my $child = fork(); unless ($child) { close $read; print $write $self->options_pod; exit 0; } close $write; eval "use Pod::Usage"; pod2usage({-input =>$read, -verbose=>2, }); } sub options_man { my $self = shift; my $nroff; chomp($nroff = `which nroff`) if $ENV{SHELL}; unless ($nroff) { $self->options_usage; return; } my $class = ref $self || $self; my $extra = ''; if ($ENV{TERM} && $ENV{TERM}=~/^(xterm|vt10)/) { my ($pager) = grep {`which $_`} ($ENV{PAGER},'less','more'); $extra = "|$pager"; } open my $fh,"| pod2man -n $class | $nroff -man $extra" or die; print $fh $self->options_pod; close $fh; # exit 0 ?? } sub options_pod { my $self = shift; my ($new_options,$old_options) = $self->options; my $class = ref $self || $self; my ($glyph_name) = $class =~ /([^:]+)$/; my $description = join "\n",$self->my_description; my $pod = ''; $pod .= "=head1 NAME\n\n"; $pod .= < glyph. END ; $pod .= "=head1 SYNOPSIS\n\n"; $pod .= <<"END"; $description See the L manual page for full details. \$panel->add_track(\$features, -glyph => $glyph_name, -option1 => \$value1, -option2 => \$value2...); To experiment with this glyph\'s options, use the glyph_help.pl script with either the -v or -p switch. Run "glyph_help -help" for details. END ; $pod .= "=head1 OPTIONS DEFINED IN THIS GLYPH\n\n"; $pod .= "Glyph-specific options for the I<$glyph_name> glyph:\n\n"; $pod .= "=over 4\n\n"; $pod .= $self->_pod_options($new_options || {}); $pod .= "=back\n\n"; $pod .= "=head1 INHERITED OPTIONS\n\n"; $pod .= "Options inherited from more general glyph classes:\n\n"; $pod .= "=over 4\n\n"; $pod .= $self->_pod_options($old_options || {}); $pod .= "=back\n\n"; $pod .= "=head1 COLOR OPTIONS\n\n"; $pod .= "The following list of named colors can be used as an argument to any option "; $pod .= "that takes a color:\n\n"; eval "require Bio::Graphics::Panel" unless Bio::Graphics::Panel->can('color_names'); for my $c (sort Bio::Graphics::Panel->color_names) { $pod .= " $c\n"; } $pod; } sub _pod_options { my $self = shift; my $options = shift; my $pod = %$options ? '' : "B<(none)>\n\n"; for my $option (sort keys %$options) { my ($range,$default,@description) = @{$options->{$option}}; $default = $range eq 'boolean' ? "'undef' (false)" : "'undef'" unless defined $default; $default = "1 (true)" if $range eq 'boolean' && $default == 1; $range = join ', ',map {"'$_'"} @$range if ref $range eq 'ARRAY'; $pod .= "=item B<-$option> <$range> [default $default]\n\n"; $pod .= join "\n",@description; if ($range eq 'font') { $pod .= "\nValid choices: 'gdTinyFont', 'gdSmallFont', 'gdMediumBoldFont', 'gdLargeFont', 'gdGiantFont'"; } elsif ($range eq 'color') { $pod .= "\nSee next section for color choices.\n"; } $pod .= "\n\n"; } return $pod; } # normalizer for memoize sub _normalize_objects { my ($obj,$option_name) = @_; my @args = (%$obj,$option_name); return "@args"; } 1; __END__ =head1 NAME Bio::Graphics::Glyph - Base class for Bio::Graphics::Glyph objects =head1 SYNOPSIS See L. =head1 DESCRIPTION Bio::Graphics::Glyph is the base class for all glyph objects. Each glyph is a wrapper around an Bio:SeqFeatureI object, knows how to render itself on an Bio::Graphics::Panel, and has a variety of configuration variables. End developers will not ordinarily work directly with Bio::Graphics::Glyph objects, but with Bio::Graphics::Glyph::generic and its subclasses. Similarly, most glyph developers will want to subclass from Bio::Graphics::Glyph::generic because the latter provides labeling and arrow-drawing facilities. =head1 METHODS This section describes the class and object methods for Bio::Graphics::Glyph. =head2 CONSTRUCTORS Bio::Graphics::Glyph objects are constructed automatically by an Bio::Graphics::Glyph::Factory, and are not usually created by end-developer code. =over 4 =item $glyph = Bio::Graphics::Glyph-Enew(-feature=E$feature,-factory=E$factory) Given a sequence feature, creates an Bio::Graphics::Glyph object to display it. The B<-feature> argument points to the Bio:SeqFeatureI object to display, and B<-factory> indicates an Bio::Graphics::Glyph::Factory object from which the glyph will fetch all its run-time configuration information. Factories are created and manipulated by the Bio::Graphics::Panel object. A standard set of options are recognized. See L. =back =head2 OBJECT METHODS Once a glyph is created, it responds to a large number of methods. In this section, these methods are grouped into related categories. Retrieving glyph context: =over 4 =item $factory = $glyph-Efactory Get the Bio::Graphics::Glyph::Factory associated with this object. This cannot be changed once it is set. =item $panel = $glyph-Epanel Get the Bio::Graphics::Panel associated with this object. This cannot be changed once it is set. =item $feature = $glyph-Efeature Get the sequence feature associated with this object. This cannot be changed once it is set. =item $feature = $glyph-Eparent_feature() Within callbacks only, the parent_feature() method returns the parent of the current feature, if there is one. Called with a numeric argument, ascends the parentage tree: parent_feature(1) will return the parent, parent_feature(2) will return the grandparent, etc. If there is no parent, returns undef. =item $feature = $glyph-Eadd_feature(@features) Add the list of features to the glyph, creating subparts. This is most common done with the track glyph returned by Bio::Graphics::Panel-Eadd_track(). If the Bio::Graphics::Panel was initialized with B<-feature_limit> set to a non-zero value, then calls to a track glyph's add_feature() method will maintain a count of features added to the track. Once the feature count exceeds the value set in -feature_limit, additional features will displace existing ones in a way that effects a uniform sampling of the total feature set. This is useful to protect against excessively large tracks. The total number of features added can be retrieved by calling the glyph's feature_count() method. =item $feature = $glyph-Eadd_group(@features) This is similar to add_feature(), but the list of features is treated as a group and can be configured as a set. =item $glyph-Efinished When you are finished with a glyph, you can call its finished() method in order to break cycles that would otherwise cause memory leaks. finished() is typically only used by the Panel object. =item $subglyph = $glyph-Emake_subglyph($level,@sub_features) This method is called to create subglyphs from a list of subfeatures. The $level indicates the current level of the glyph (top-level glyphs are level 0, subglyphs are level 1, etc). Ordinarily this method simply calls $self-Efactory-Emake_subglyph($level,@sub_features). Override it in subclasses to create subglyphs of a particular type. For example: sub make_subglyph { my $self = shift; my $level = shift; my $factory = $self->factory; $factory->make_glyph($factory,'arrow',@_); } =item $count = $glyph-Efeature_count() Return the number of features added to this glyph via add_feature(). =item $flag = $glyph->features_clipped() If the panel was initialized with -feature_limit set to a non-zero value, then calls to add_features() will limit the number of glyphs to the indicated value. If this value was exceeded, then features_clipped() will return true. =back Retrieving glyph options: =over 4 =item $fgcolor = $glyph-Efgcolor =item $bgcolor = $glyph-Ebgcolor =item $fontcolor = $glyph-Efontcolor =item $fontcolor = $glyph-Efont2color =item $fillcolor = $glyph-Efillcolor These methods return the configured foreground, background, font, alternative font, and fill colors for the glyph in the form of a GD::Image color index. =item $color = $glyph-Etkcolor This method returns a color to be used to flood-fill the entire glyph before drawing (currently used by the "track" glyph). =item ($left,$top,$right,$bottom) = $glyph-Ebounds($dx,$dy) Given the topleft coordinates of the glyph, return the bounding box of its contents, exclusive of padding. This is typically called by the draw() and draw_component() methods to recover the position of the glyph. =item ($left,$top,$right,$bottom) = $glyph-Ecalculate_boundaries($dx,$dy) An alias for bounds(), used by some glyphs for compatibility with older versions of this module. =item $width = $glyph-Ewidth([$newwidth]) Return the width of the glyph, not including left or right padding. This is ordinarily set internally based on the size of the feature and the scale of the panel. =item $width = $glyph-Elayout_width Returns the width of the glyph including left and right padding. =item $width = $glyph-Eheight Returns the height of the glyph, not including the top or bottom padding. This is calculated from the "height" option and cannot be changed. =item $font = $glyph-Efont Return the font for the glyph. =item $option = $glyph-Eoption($option) Return the value of the indicated option. =item $index = $glyph-Ecolor($option_name) Given an option name that corresponds to a color (e.g. 'fgcolor') look up the option and translate it into a GD color index. =item $index = $glyph-Etranslate_color($color) Given a symbolic or #RRGGBB-form color name, returns its GD index. =item $level = $glyph-Elevel The "level" is the nesting level of the glyph. Groups are level -1, top level glyphs are level 0, subparts (e.g. exons) are level 1 and so forth. =item @parts = $glyph-Eparts For glyphs that can contain subparts (e.g. the segments glyph), this method will return the list of subglyphs it contains. Subglyphs are created automatically by the new() method and are created subject to the maximum recursion depth specified by the maxdepth() method and/or the -maxdepth option. =back Setting an option: =over 4 =item $glyph-Econfigure(-name=E$value) You may change a glyph option after it is created using set_option(). This is most commonly used to configure track glyphs. =back Retrieving information about the sequence: =over 4 =item $start = $glyph-Estart =item $end = $glyph-Eend These methods return the start and end of the glyph in base pair units. =item $offset = $glyph-Eoffset Returns the offset of the segment (the base pair at the far left of the image). =item $length = $glyph-Elength Returns the length of the sequence segment. =back Retrieving formatting information: =over 4 =item $top = $glyph-Etop =item $left = $glyph-Eleft =item $bottom = $glyph-Ebottom =item $right = $glyph-Eright These methods return the top, left, bottom and right of the glyph in pixel coordinates. =item $height = $glyph-Eheight Returns the height of the glyph. This may be somewhat larger or smaller than the height suggested by the GlyphFactory, depending on the type of the glyph. =item $scale = $glyph-Escale Get the scale for the glyph in pixels/bp. =item $height = $glyph-Elabelheight Return the height of the label, if any. =item $label = $glyph-Elabel Return a human-readable label for the glyph. =back These methods are called by Bio::Graphics::Track during the layout process: =over 4 =item $glyph-Emove($dx,$dy) Move the glyph in pixel coordinates by the indicated delta-x and delta-y values. =item ($x1,$y1,$x2,$y2) = $glyph-Ebox Return the current position of the glyph. =back These methods are intended to be overridden in subclasses: =over 4 =item $glyph-Ecalculate_height Calculate the height of the glyph. =item $glyph-Ecalculate_left Calculate the left side of the glyph. =item $glyph-Ecalculate_right Calculate the right side of the glyph. =item $glyph-Edraw($gd,$left,$top) Optionally offset the glyph by the indicated amount and draw it onto the GD::Image object. =item $glyph-Edraw_label($gd,$left,$top) Draw the label for the glyph onto the provided GD::Image object, optionally offsetting by the amounts indicated in $left and $right. =item $glyph-Emaxdepth() This returns the maximum number of levels of feature subparts that the glyph will recurse through. For example, returning 0 indicates that the glyph will only draw the top-level feature. Returning 1 indicates that it will only draw the top-level feature and one level of subfeatures. Returning 2 will descend down two levels. Overriding this method will speed up rendering by avoiding creating of a bunch of subglyphs that will never be drawn. The default behavior is to return undef (unlimited levels of descent) unless the -maxdepth option is passed, in which case this number is returned. Note that Bio::Graphics::Glyph::generic overrides maxdepth() to return 0, meaning no descent into subparts will be performed. =back These methods are useful utility routines: =over 4 =item @pixels = $glyph-Emap_pt(@bases); Map the list of base position, given in base pair units, into pixels, using the current scale and glyph position. This method will accept a single base position or an array. =item $glyph-Efilled_box($gd,$x1,$y1,$x2,$y2) Draw a filled rectangle with the appropriate foreground and fill colors, and pen width onto the GD::Image object given by $gd, using the provided rectangle coordinates. =item $glyph-Efilled_oval($gd,$x1,$y1,$x2,$y2) As above, but draws an oval inscribed on the rectangle. =item $glyph-Eexceeds_depth Returns true if descending into another level of subfeatures will exceed the value returned by maxdepth(). =back =head2 OPTIONS The following options are standard among all Glyphs. See individual glyph pages for more options. Also try out the glyph_help.pl script, which attempts to document each glyph's shared and specific options and provides an interface for graphically inspecting the effect of different options. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type undef (false) -connector_color Connector color black -strand_arrow Whether to indicate undef (false) strandedness -stranded Whether to indicate undef (false) strandedness (same as above)) -label Whether to draw a label undef (false) -description Whether to draw a description undef (false) -no_subparts Set to true to prevent undef (false) drawing of the subparts of a feature. -ignore_sub_part Give the types/methods of undef subparts to ignore (as a space delimited list). -maxdepth Specifies the maximum number undef (unlimited) child-generations to decend when getting subfeatures -sort_order Specify layout sort order "default" -always_sort Sort even when bumping is off undef (false) -bump_limit Maximum number of levels to bump undef (unlimited) -hilite Highlight color undef (no color) -link, -title, -target These options are used when creating imagemaps for display on the web. See L. For glyphs that consist of multiple segments, the B<-connector> option controls what's drawn between the segments. The default is undef (no connector). Options include: "hat" an upward-angling conector "solid" a straight horizontal connector "quill" a decorated line with small arrows indicating strandedness (like the UCSC Genome Browser uses) "dashed" a horizontal dashed line. "crossed" a straight horizontal connector with an "X" on it (Can be used when segments are not yet validated by some internal experiments...) The B<-connector_color> option controls the color of the connector, if any. The label is printed above the glyph. You may pass an anonymous subroutine to B<-label>, in which case the subroutine will be invoked with the feature as its single argument and is expected to return the string to use as the label. If you provide the numeric value "1" to B<-label>, the label will be read off the feature's seqname(), info() and primary_tag() methods will be called until a suitable name is found. To create a label with the text "1", pass the string "1 ". (A 1 followed by a space). The description is printed below the glyph. You may pass an anonymous subroutine to B<-description>, in which case the subroutine will be invoked with the feature as its single argument and is expected to return the string to use as the description. If you provide the numeric value "1" to B<-description>, the description will be read off the feature's source_tag() method. To create a description with the text "1", pass the string "1 ". (A 1 followed by a space). In the case of ACEDB Ace::Sequence feature objects, the feature's info(), Brief_identification() and Locus() methods will be called to create a suitable description. The B<-strand_arrow> option, if true, requests that the glyph indicate which strand it is on, usually by drawing an arrowhead. Not all glyphs will respond to this request. For historical reasons, B<-stranded> is a synonym for this option. Multisegmented features will draw an arrowhead on each component unless you specify a value of "ends" to -strand_arrow, in which case only the rightmost component (for + strand features) or the leftmost component (for - strand features) will have arrowheads. B: By default, features are drawn with a layout based only on the position of the feature, assuring a maximal "packing" of the glyphs when bumped. In some cases, however, it makes sense to display the glyphs sorted by score or some other comparison, e.g. such that more "important" features are nearer the top of the display, stacked above less important features. The -sort_order option allows a few different built-in values for changing the default sort order (which is by "left" position): "low_score" (or "high_score") will cause features to be sorted from lowest to highest score (or vice versa). "left" (or "default") and "right" values will cause features to be sorted by their position in the sequence. "longest" (or "shortest") will cause the longest (or shortest) features to be sorted first, and "strand" will cause the features to be sorted by strand: "+1" (forward) then "0" (unknown, or NA) then "-1" (reverse). Finally, "name" will sort by the display_name of the features. In all cases, the "left" position will be used to break any ties. To break ties using another field, options may be strung together using a "|" character; e.g. "strand|low_score|right" would cause the features to be sorted first by strand, then score (lowest to highest), then by "right" position in the sequence. Finally, a subroutine coderef with a $$ prototype can be provided. It will receive two B as arguments and should return -1, 0 or 1 (see Perl's sort() function for more information). For example, to sort a set of database search hits by bits (stored in the features' "score" fields), scaled by the log of the alignment length (with "start" position breaking any ties): sort_order = sub ($$) { my ($glyph1,$glyph2) = @_; my $a = $glyph1->feature; my $b = $glyph2->feature; ( $b->score/log($b->length) <=> $a->score/log($a->length) ) || ( $a->start <=> $b->start ) } It is important to remember to use the $$ prototype as shown in the example. Otherwise Bio::Graphics will quit with an exception. The arguments are subclasses of Bio::Graphics::Glyph, not the features themselves. While glyphs implement some, but not all, of the feature methods, to be safe call the two glyphs' feature() methods in order to convert them into the actual features. The '-always_sort' option, if true, will sort features even if bumping is turned off. This is useful if you would like overlapping features to stack in a particular order. Features towards the end of the list will overlay those towards the beginning of the sort order. The B<-hilite> option draws a colored box behind each feature using the indicated color. Typically you will pass it a code ref that returns a color name. For example: -hilite => sub { my $name = shift->display_name; return 'yellow' if $name =~ /XYZ/ } The B<-no_subparts> option will prevent the glyph from searching its feature for subfeatures. This may enhance performance if you know in advance that none of your features contain subfeatures. =head1 SUBCLASSING Bio::Graphics::Glyph By convention, subclasses are all lower-case. Begin each subclass with a preamble like this one: package Bio::Graphics::Glyph::crossbox; use strict; use base qw(Bio::Graphics::Glyph); Then override the methods you need to. Typically, just the draw() method will need to be overridden. However, if you need additional room in the glyph, you may override calculate_height(), calculate_left() and calculate_right(). Do not directly override height(), left() and right(), as their purpose is to cache the values returned by their calculating cousins in order to avoid time-consuming recalculation. A simple draw() method looks like this: sub draw { my $self = shift; $self->SUPER::draw(@_); my $gd = shift; # and draw a cross through the box my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $fg = $self->fgcolor; $gd->line($x1,$y1,$x2,$y2,$fg); $gd->line($x1,$y2,$x2,$y1,$fg); } This subclass draws a simple box with two lines criss-crossed through it. We first call our inherited draw() method to generate the filled box and label. We then call calculate_boundaries() to return the coordinates of the glyph, disregarding any extra space taken by labels. We call fgcolor() to return the desired foreground color, and then call $gd-Eline() twice to generate the criss-cross. For more complex draw() methods, see Bio::Graphics::Glyph::transcript and Bio::Graphics::Glyph::segments. Please avoid using a specific image class (via "use GD" for example) within your glyph package. Instead, rely on the image package passed to the draw() method. This approach allows for future expansion of supported image classes without requiring glyph redesign. If you need access to the specific image classes such as Polygon, Image, or Font, generate them like such: sub draw { my $self = shift; my $image_class = shift; my $polygon_package = $self->polygon_package->new() ... } =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/FeatureFile000755001750001750 012366325116 21114 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/lib/Bio/Graphics/FeatureFile/Iterator.pm000555001750001750 253012366325116 23403 0ustar00lsteinlstein000000000000package Bio::Graphics::FeatureFile::Iterator; =head1 NAME Bio::Graphics::FeatureFile::Iterator -- Iterator across a Bio::Graphics::FeatureFile =head1 SYNOPSIS use Bio::Graphics::FeatureFile; my $data = Bio::Graphics::FeatureFile->new(-file => 'features.txt'); my $iterator = $data->get_seq_stream; while (my $feature = $iterator->next_seq) { print $feature->display_id,"\t",$feature->start,"\t",$feature->end,"\n"; } =head1 DESCRIPTION This is a Bio::SeqIO-like object that recognizes the next_seq() and next_feature() methods. The two methods are synonymous. There is also a rewind() method which will start iterating from the beginning again. =head1 SEE ALSO L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut sub new { my $package = shift; return bless {features => shift, index => 0},$package; } sub next_seq { my $self = shift; return unless $self->{features}; return $self->{features}[$self->{index}++]; } *next_features = \&next_seq; sub rewind { my $self = shift; $self->{index} = 0; } 1; Bio-Graphics-2.39/lib/Bio/Graphics/Wiggle000755001750001750 012366325116 20137 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/lib/Bio/Graphics/Wiggle/Loader.pm000555001750001750 5012112366325116 22062 0ustar00lsteinlstein000000000000package Bio::Graphics::Wiggle::Loader; =head1 SYNOPSIS my $loader = Bio::Graphics::Wiggle::Loader->new('/base/directory/for/wigfiles','wibfilename'); my $fh = IO::File->new('uploaded_file.txt'); $loader->load($fh); my $gff3_file = $loader->featurefile('gff3',$method,$source); my $featurefile = $loader->featurefile('featurefile'); my @features = $loader->features(); =head1 USAGE This module loads Bio::Graphics::Wiggle files from source files that use Jim Kent's "WIG" format: http://genome.ucsc.edu/google/goldenPath/help/wiggle.html Several data sets can be grouped together in a single WIG source file. The load() method accepts the path to a WIG source file, and will create one or more .wib ("wiggle binary") databases of quantitative data in the directory indicated when you created the loader. Call the featurefile() method to return a text file in either GFF3 or Bio::Graphics::FeatureFile format, suitable for loading into a gbrowse database. =head2 METHODS =over 4 =item $loader = Bio::Graphics::Wiggle::Loader->new('/base/directory' [,'my_data']) Create a new loader. The first argument specifies the base directory in which the loaded .wib files will be created. The second argument specifies the base name for the created .wib files, or "track" if not specified. =item $loader->load($fh) Load the data from a source WIG file opened on a filehandle. =item $data = $loader->featurefile($type [,$method,$source]) Return the data corresponding to a GFF3 or Bio::Graphics::FeatureFile. The returned file will have one feature per WIG track, and a properly formatted "wigfile" attribute that directs Bio::Graphics to the location of the quantitative data. $type is one of "gff3" or "featurefile". In the case of "gff3", you may specify an optional method and source for use in describing each feature. In the case of "featurefile", the returned file will contain GBrowse stanzas that describe a reasonable starting format to display the data. =item @features = $loader->features Returns one or more Bio::Graphics::Features objects, which can be used to create Bio::Graphics tracks with the wiggle_xyplot (and related) glyphs. =item $loader->allow_sampling(1) If allow_sampling() is passed a true value, then very large files (more than 5 MB) will undergo a sampling procedure to find their minimum and maximum values and standard deviation. Otherwise, file will be read in its entirety to generate those statistics. =back =head2 EXTENSIONS Several extensions to the WIG format "track" declaration are recognized. =over 4 =item transform= Specify a transform to be performed on all numeric data within this track prior to loading into the binary wig file. Currently, the following three declarations are recognized: transform=logtransform y' = 0 for y == 0 y' = log(y) for y > 0 y' = -log(-y) for y < 0 transform=logsquared y' = log(y**2) for y != 0 y' = 0 for y == 0 transform=none y' = y (no transform - the default) =item trim= Specify a trimming function to be performed on the data prior to scaling. Currently, the following trim functions are recognized: trim=stdev1 trim to plus/minus 1 standard deviation of the mean trim=stdev2 trim to plus/minus 2 standard deviations of the mean (default) trim=stdevN trim to plus/minus N standard deviations of the mean trim=none no trimming =back Example entended track declaration: track type=wiggle_0 name="example" description="20 degrees, 2 hr" \ trim=stdev2 transform=logsquared =cut use strict; use Carp 'croak'; use Statistics::Descriptive; use IO::Seekable; use File::Spec; use Bio::Graphics::Wiggle; use Bio::Graphics::FeatureFile; use Text::ParseWords(); use File::stat; use CGI 'escape'; use vars '%color_name'; # If a WIG file is very large (> 5 Mb) use constant BIG_FILE => 5_000_000; use constant BIG_FILE_SAMPLES => 5_000; # number of probes to make use constant DEFAULT_METHOD => 'microarray_oligo'; use constant DEFAULT_SOURCE => '.'; sub new { my $class = shift; my $base = shift or croak "Usage: Bio::Graphics::Wiggle::Loader->new('/base/path','trackname')"; my $trackname = shift || 'track'; my $wigclass = shift || 'Bio::Graphics::Wiggle'; -d $base && -w _ or croak "$base is not a writeable directory"; return bless { base => $base, tracks => {}, trackname => $trackname, tracknum => '000', track_options => {}, allow_sampling => 0, wigclass => $wigclass, },ref $class || $class; } sub allow_sampling { my $self = shift; my $d = $self->{allow_sampling}; $self->{allow_sampling} = shift if @_; $d; } sub wigclass { my $self = shift; my $d = $self->{wigclass}; $self->{wigclass} = shift if @_; return $d; } sub basedir { shift->{base} } sub wigfiles { shift->{wigfiles} } sub conf_stanzas { my $self = shift; my ($method,$source) = @_; $method ||= DEFAULT_METHOD; $source ||= DEFAULT_SOURCE; my $tracks = $self->{tracks}; my @lines = (); for my $track (sort keys %$tracks) { my $options = $tracks->{$track}{display_options}; my $name = $options->{name} ||= $track; $options->{visibility} ||= 'dense'; $options->{color} ||= $options->{visibility} =~ /pack/i ? '255,0,0' : '0,0,0'; $options->{altColor} ||= $options->{visibility} =~ /pack/i ? '0,0,255' : '0,0,0'; # stanza push @lines,"[$track]"; if (my $graph_type = $options->{glyph}) { if ($graph_type =~ /box/) { push @lines, "glyph = wiggle_box"; } else { push @lines,"glyph = ". ($graph_type =~/density/ ? 'wiggle_density' : 'wiggle_xyplot'); } } else { push @lines,"glyph = ". ($options->{visibility}=~/pack/ ? 'wiggle_density' : 'wiggle_xyplot'); } push @lines,"key = $options->{name}" if $options->{name}; push @lines,"description = $options->{description}" if $options->{description}; if (my $color = $options->{color}) { push @lines,"bgcolor=".format_color($color); } if (my $color = $options->{altColor}) { push @lines,"fgcolor=" . format_color($color); } if (exists $options->{viewLimits} and my ($low,$hi) = split ':',$options->{viewLimits}) { push @lines,"min_score = $low"; push @lines,"max_score = $hi"; } if (exists $options->{maxHeightPixels} and my ($max,$default,$min) = split ':',$options->{maxHeightPixels}) { push @lines,"height = $default"; } push @lines,"smoothing = $options->{windowingFunction}" if $options->{windowingFunction}; my $smoothing_window = $options->{smoothingWindow} || 0; push @lines,"smoothing window = $options->{smoothingWindow}" if $options->{smoothingWindow}; push @lines,''; } return join "\n",@lines; } sub featurefile { my $self = shift; my $type = shift; my ($method,$source) = @_; $method ||= DEFAULT_METHOD; $source ||= DEFAULT_SOURCE; $type ||= 'featurefile'; $type =~ /^(gff3|featurefile)$/i or croak "featurefile type must be one of 'gff3' or 'featurefile'"; my @lines; my $tracks = $self->{tracks}; if ($type eq 'gff3') { push @lines,"##gff-version 3",""; } else { push @lines,$self->conf_stanzas($method,$source),""; } for my $track (sort keys %$tracks) { my $options = $tracks->{$track}{display_options}; my $name = $options->{name} ||= $track; my $seqids = $tracks->{$track}{seqids}; my $note = escape($options->{description}); my @attributes; push @attributes,qq(Name=$name) if defined $name; push @attributes,qq(Note=$note) if defined $note; # data, sorted by chromosome my @seqid = sort keys %$seqids; for my $seqid (@seqid) { $seqid or next; $tracks->{$track}{seqids}{$seqid}{wig}->write(); my $attributes = join ';',(@attributes,"wigfile=$seqids->{$seqid}{wigpath}"); if ($type eq 'gff3') { push @lines,join "\t",($seqid,$source,$method, $seqids->{$seqid}{start}, $seqids->{$seqid}{end}, '.','.','.', $attributes ); } else { push @lines,''; push @lines,"reference=$seqid"; push @lines,"$track $seqid.data $seqids->{$seqid}{start}..$seqids->{$seqid}{end} $attributes"; } } } return join("\n",@lines)."\n"; } sub features { my $self = shift; my $text = $self->featurefile('featurefile'); my $file = Bio::Graphics::FeatureFile->new(-text=>$text); return $file->features; } sub load { my $self = shift; my $infh = shift; my $format = 'none'; local $_; LINE: while (<$infh>) { chomp; next if /^#/; next unless /\S/; if (/^track/) { $self->process_track_line($_); next; } if (/^fixedStep/) { $self->process_fixed_step_declaration($_); $format = 'fixed'; } if (/^variableStep/) { $self->process_variable_step_declaration($_); $format = 'variable'; } if (/^\S+\s+\d+\s+\d+\s+-?[\dEe.]+/) { $self->process_first_bedline($_); $format = 'bed'; } if ($format ne 'none') { # remember where we are, find min and max values, return my $pos = tell($infh); $self->minmax($infh,$format eq 'bed' ? $_ : '') unless $self->{track_options}{chrom} && exists $self->current_track->{seqids}{$self->{track_options}{chrom}}{min}; seek($infh,$pos,0); $self->process_bed($infh,$_) if $format eq 'bed'; $self->process_fixedline($infh) if $format eq 'fixed'; $self->process_variableline($infh) if $format eq 'variable'; $format = 'none'; } redo LINE if defined $_ && /^(track|variableStep|fixedStep)/; } return 1; } sub process_track_line { my $self = shift; my $line = shift; my @tokens = shellwords($line); shift @tokens; my %options = map {split '='} @tokens; $options{type} eq 'wiggle_0' or croak "invalid/unknown wiggle track type $options{type}"; delete $options{type}; $self->{tracknum}++; $self->current_track->{display_options} = \%options; } sub process_fixed_step_declaration { my $self = shift; my $line = shift; my @tokens = shellwords($line); shift @tokens; my %options = map {split '='} @tokens; exists $options{chrom} or croak "invalid fixedStep line: need a chrom option"; exists $options{start} or croak "invalid fixedStep line: need a start option"; exists $options{step} or croak "invalid fixedStep line: need a step option"; $self->{track_options} = \%options; } sub process_variable_step_declaration { my $self = shift; my $line = shift; my @tokens = shellwords($line); shift @tokens; my %options = map {split '='} @tokens; exists $options{chrom} or croak "invalid variableStep line: need a chrom option"; $self->{track_options} = \%options; } sub process_first_bedline { my $self = shift; my $line = shift; my @tokens = shellwords($line); $self->{track_options} = {chrom => $tokens[0]}; } sub current_track { my $self = shift; return $self->{tracks}{$self->{tracknum}} ||= {}; } sub minmax { my $self = shift; my ($infh,$bedline) = @_; local $_; my $transform = $self->get_transform; my $seqids = ($self->current_track->{seqids} ||= {}); my $chrom = $self->{track_options}{chrom}; if ($self->allow_sampling && (my $size = stat($infh)->size) > BIG_FILE) { warn "Wiggle file is very large; resorting to genome-wide sample statistics for $chrom.\n"; $self->{FILEWIDE_STATS} ||= $self->sample_file($infh,BIG_FILE_SAMPLES); for (keys %{$self->{FILEWIDE_STATS}}) { $seqids->{$chrom}{$_} = $self->{FILEWIDE_STATS}{$_}; } return; } my %stats; if ($bedline) { # left-over BED line my @tokens = split /\s+/,$bedline; my $seqid = $tokens[0]; my $value = $tokens[-1]; $value = $transform->($self,$value) if $transform; $stats{$seqid} ||= Statistics::Descriptive::Sparse->new(); $stats{$seqid}->add_data($value); } while (<$infh>) { last if /^track/; last if /chrom=(\S+)/ && $1 ne $chrom; next if /^\#|fixedStep|variableStep/; my @tokens = split(/\s+/,$_) or next; my $seqid = @tokens > 3 ? $tokens[0] : $chrom; my $value = $tokens[-1]; $value = $transform->($self,$value) if $transform; $stats{$seqid} ||= Statistics::Descriptive::Sparse->new(); $stats{$seqid}->add_data($value); } for my $seqid (keys %stats) { $seqids->{$seqid}{min} = $stats{$seqid}->min(); $seqids->{$seqid}{max} = $stats{$seqid}->max(); $seqids->{$seqid}{mean} = $stats{$seqid}->mean(); $seqids->{$seqid}{stdev} = $stats{$seqid}->standard_deviation(); } } sub sample_file { my $self = shift; my ($fh,$samples) = @_; my $transform = $self->get_transform; my $stats = Statistics::Descriptive::Sparse->new(); my $size = stat($fh)->size; my $count=0; while ($count < $samples) { seek($fh,int(rand $size),0) or die; scalar <$fh>; # toss first line my $line = <$fh>; # next full line $line or next; my @tokens = split /\s+/,$line; my $value = $tokens[-1]; next unless $value =~ /^[\d\seE.+-]+$/; # non-numeric $value = $transform->($self,$value) if $transform; $stats->add_data($value); $count++; } return { min => $stats->min, max => $stats->max, mean => $stats->mean, stdev => $stats->standard_deviation, }; } sub get_transform { my $self = shift; my $transform = $self->current_track->{display_options}{transform}; return $self->can($transform) if $transform; } # one and only transform currently defined # Natural log of the square of the value. # Return 0 if the value is 0 sub logsquared { my $self = shift; my $value = shift; return 0 if $value == 0; return log($value**2); } sub logtransform { my $self = shift; my $value = shift; return 0 if $value == 0; if ($value < 0) { return -log(-$value); } else { return log($value); } } sub process_bed { my $self = shift; my $infh = shift; my $oops = shift; my $transform = $self->get_transform; $self->process_bedline($oops) if $oops; while (<$infh>) { last if /^track/; next if /^#/; chomp; $self->process_bedline($_); } } sub process_bedline { my $self = shift; my ($line,$transform) = @_; my ($seqid,$start,$end,$value) = split /\s+/,$line; $value = $transform->($self,$value) if $transform; $start++; # to 1-based coordinates my $wigfile = $self->wigfile($seqid); $wigfile->set_range($start=>$end, $value); # update span $self->current_track->{seqids}{$seqid}{start} = $start unless exists $self->current_track->{seqids}{$seqid}{start} and $self->current_track->{seqids}{$seqid}{start} < $start; $self->current_track->{seqids}{$seqid}{end} = $end unless exists $self->current_track->{seqids}{$seqid}{end} and $self->current_track->{seqids}{$seqid}{end} > $end; } sub process_fixedline { my $self = shift; my $infh = shift; my $seqid = $self->{track_options}{chrom}; my $wigfile = $self->wigfile($seqid); my $start = $self->{track_options}{start}; my $step = $self->{track_options}{step}; my $span = $wigfile->span; # update start and end positions $self->{track_options}{span} ||= $wigfile->span || 1; my $chrom = $self->current_track->{seqids}{$seqid}; $chrom->{start} = $start if !defined $chrom->{start} || $chrom->{start} > $start; my $end = $chrom->{start} + $span - 1; $chrom->{end} = $end if !defined $chrom->{end} || $chrom->{end} < $end; my $transform = $self->get_transform; # write out data in 500K chunks for efficiency my @buffer; while (<$infh>) { last if /^(track|variableStep|fixedStep)/; next if /^#/; chomp; push @buffer,$_; if (@buffer >= 500_000) { @buffer = map {$transform->($self,$_)} @buffer if $transform; $wigfile->set_values($start=>\@buffer); my $big_step = $step * @buffer; $start += $big_step; $self->current_track->{seqids}{$seqid}{end} = $start + $big_step - 1 + $span; @buffer = (); # reset at the end } } @buffer = map {$transform->($self,$_)} @buffer if $transform; $wigfile->set_values($start=>\@buffer) if @buffer; $self->current_track->{seqids}{$seqid}{end} = $start + @buffer*$step - 1 + $span; } sub process_variableline { my $self = shift; my $infh = shift; my $seqid = $self->{track_options}{chrom}; my $chrom = $self->current_track->{seqids}{$seqid}; my $wigfile = $self->wigfile($seqid); my $span = $wigfile->span; my $transform = $self->get_transform; while (<$infh>) { last if /^(track|variableStep|fixedStep)/; next if /^#/; chomp; my ($start,$value) = split /\s+/ or next; $value = $transform->($self,$value) if $transform; eval { $wigfile->set_value($start=>$value); 1; } or croak "Data error on line $.: $_\nDetails: $@"; # update span $chrom->{start} = $start if !defined $chrom->{start} || $chrom->{start} > $start; my $end = $start + $span - 1; $chrom->{end} = $end if !defined $chrom->{end} || $chrom->{end} < $end; } $self->current_track->{seqids}{$seqid}{end} ||= $self->current_track->{seqids}{$seqid}{start}; } sub wigfile { my $self = shift; my $seqid = shift; my $ts = time(); my $current_track = $self->{tracknum}; my $tname = $self->{trackname} || 'track'; unless (exists $self->current_track->{seqids}{$seqid}{wig}) { my $path = File::Spec->catfile($self->{base},"$tname\_$current_track.$seqid.$ts.wib"); my @stats; foreach (qw(min max mean stdev)) { my $value = $self->current_track->{seqids}{$seqid}{$_} || $self->{FILEWIDE_STATS}{$_} || next; push @stats,($_=>$value); } my $step = $self->{track_options}{step} || 1; my $span = $self->{track_options}{span} || $self->{track_options}{step} || 1; my $trim = $self->current_track->{display_options}{trim} || 'stdev10'; my $transform = $self->current_track->{display_options}{transform}; my $class = $self->wigclass; unless ($class->can('new')) { warn "loading $class"; eval "require $class"; die $@ if $@; } my $wigfile = $class->new( $path, 1, { seqid => $seqid, step => $step, span => $span, trim => $trim, @stats, }, ); $wigfile or croak "Couldn't create wigfile $wigfile: $!"; $self->current_track->{seqids}{$seqid}{wig} = $wigfile; $self->current_track->{seqids}{$seqid}{wigpath} = $path; } return $self->current_track->{seqids}{$seqid}{wig}; } sub format_color { my $rgb = shift; return $rgb unless $rgb =~ /\d+,\d+,\d+/; my ($r,$g,$b) = split ',',$rgb; my $hex = '#'.join '',map {sprintf("%02X",$_)}($r,$g,$b); return translate_color($hex); } # use English names for the most common colors sub translate_color { my $clr = shift; unless (%color_name) { while () { chomp; my ($hex,$name) = split or next; $color_name{$hex} = $name; } } return $color_name{$clr} || $clr; } # work around an annoying uninit variable warning from Text::Parsewords sub shellwords { my @args = @_; return unless @args; foreach(@args) { s/^\s+//; s/\s+$//; $_ = '' unless defined $_; } my @result = Text::ParseWords::shellwords(@args); return @result; } 1; __DATA__ #000000 black #FFFFFF white #0000FF blue #00FF00 green #FF0000 red #FFFF00 yellow #00FFFF cyan #FF00FF magenta #C0C0C0 gray __END__ =head1 SEE ALSO L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE. Copyright (c) 2007 Cold Spring Harbor Laboratory This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph000755001750001750 012366325116 20004 5ustar00lsteinlstein000000000000Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/ragged_ends.pm000555001750001750 1027712366325116 22773 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::ragged_ends; use strict; use base qw(Bio::Graphics::Glyph::generic); sub draw_component { my $self = shift; my $gd = shift; my $fg = $self->fgcolor; my $bg = $self->option('bgcolor'); my ($left,$top) = @_; my($x1,$y1,$x2,$y2) = $self->bounds(@_); my $zig = $self->option('zig') || 4; my $zag = $self->option('zag') || 4; my $polygon = GD::Polygon->new; $polygon->addPt($x1, $y1); my $yoff = $y1 + $zig; my $i = 1; if ($self->option("ragged_left")) { while ($yoff <= $y2) { $polygon->addPt( $x1 + ($i * $zag), $yoff ); $i = !$i; $yoff += $zig; } } $polygon->addPt($x1, $y2); $polygon->addPt($x2, $y2); $yoff = $y2 - $zig; $i = 1; if ($self->option("ragged_right")) { while ($yoff >= $y1) { $polygon->addPt( $x2 - ($i * $zag), $yoff ); $i = !$i; $yoff -= $zig; } } $polygon->addPt($x2, $y1); $polygon->addPt($x1, $y1); # close the polygon $gd->polygon($polygon, $fg); $gd->filledPolygon($polygon, $bg) if $bg; } 1; =head1 NAME Bio::Graphics::Glyph::ragged_ends - The "ragged ends" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This is identical to the "box" glyph except that it will draw the subparts of features that contain subfeatures. The subparts are not connected -- use the "segments" glyph for that. "Generic" is the default glyph used when not otherwise specified. =head2 OPTIONS This glyph provides two extra options to control whether the right and/or left ends of the drawn box are to be drawn "raggedly" with zigzags instead of vertical lines. Option Values Default -raggedleft 0 | 1 1 -raggedright 0 | 1 1 -zig > 3 4 -zag > 3 4 The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -pad_top Top padding 0 -pad_bottom Bottom padding 0 -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -strand_arrow Whether to indicate 0 (false) strandedness -hilite Highlight color undef (no color) -pad_top and -pad_bottom allow you to insert some blank space between the glyph's boundary and its contents. This is useful if you are changing the glyph's height dynamically based on its feature's score. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Aaron J Mackey Eamackey@pcbi.upenn.eduE. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/christmas_arrow.pm000555001750001750 621612366325116 23716 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::christmas_arrow; use strict; use base qw(Bio::Graphics::Glyph::generic); use Math::Trig; sub my_description { return < ['integer',4, 'Radius of the circle glyph.'], length => ['integer',20,'Length of the arrow.'], } } sub default_radius { return 4; } sub default_length { return 20; } sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $fg = $self->fgcolor; my $radius = defined $self->option('radius') ? $self->option('radius') : $self->default_radius (); $gd->filledEllipse($x1+$radius, $y2-$radius, 2*$radius, 2*$radius, $fg); my $length = defined $self->option('length') ? $self->option('length') : $self->default_length(); my $angle = deg2rad(30); my $dx = 6; my $dy = 4; my $midX = $x2-$dx; my $midY = $y1+$dy; $gd->line($x1+$radius, $y2-$radius, $x1+$radius, $y1+$dy, $fg); return if ($x2-$x1 <= $radius); $x2 = $x1+$radius+$length; $gd->line($x1+$radius, $midY, $x2, $midY, $fg); $gd->line($x2, $midY, $x2-$dx, $y1, $fg); $gd->line($x2, $midY, $x2-$dx, $y1+2*$dy, $fg); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::christmas_arrow - The "christmas arrow" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws an arrow which has a circle ("christmas ball") dangling at one end. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -radius Radius of the circle 4 glyph -length Length of the arrow 20 -height Standard option, but 10 important here =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Vsevolod (Simon) Ilyushchenko Esimonf@cshl.eduE. Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/extending_arrow.pm000555001750001750 415012366325116 23701 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::extending_arrow; use strict; use base qw(Bio::Graphics::Glyph::anchored_arrow); # this is solely so that the documentation system shows # glyph-specific options. *my_options = \&Bio::Graphics::Glyph::anchored_arrow::my_options; sub my_description { my $desc = shift->SUPER::my_description; return 'This glyph is identical to "anchored_arrow".',$desc; } =head1 NAME Bio::Graphics::Glyph::extending_arrow -- The "extending arrow" glyph =head1 SYNOPSIS This is deprecated. Use L instead. =head1 DESCRIPTION This glyph was designed to show a segment that goes beyond the panel. If the segment is contained within the panel, a vertical base is shown. Otherwise, an arrow is shown. Also see the arrow glyph. =head2 OPTIONS See L. This glyph has been deprecated. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Originally by Shengqiang Shu. Temporarily deprecated by Lincoln Stein. Copyright (c) 2001 Berkeley Drosophila Genome Project This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut 1; Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/wiggle_xyplot.pm000555001750001750 4464512366325116 23434 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::wiggle_xyplot; use strict; use base qw(Bio::Graphics::Glyph::wiggle_data Bio::Graphics::Glyph::xyplot Bio::Graphics::Glyph::smoothing); use IO::File; use File::Spec; sub my_description { return <export_to_wif(). coverage-- a simple comma-delimited string containing the quantitative values, assumed to be one value per pixel. statistical_summary() -- a method for generating statistical information including validCount, maxVal, minVal, sumData, and sumSquares. END } sub my_options { { basedir => [ 'string', undef, 'If a relative path is used for "wigfile", then this option provides', 'the base directory on which to resolve the path.' ], variance_band => [ 'boolean', 0, 'If true, draw a semi-transparent band across the image that indicates', 'the mean and standard deviation of the data set. Only of use when a wig', 'file is provided.' ], z_score_bounds => [ 'integer', 4, 'When using z_score autoscaling, this option controls how many standard deviations', 'above and below the mean to show.' ], autoscale => [ ['local','chromosome','global','z_score','clipped_global'], 'clipped_global', 'If set to "global" , then the minimum and maximum values of the XY plot', 'will be taken from the wiggle file as a whole. If set to "chromosome", then', 'scaling will be to minimum and maximum on the current chromosome.', '"clipped_global" is similar to "global", but clips the top and bottom values', 'to the multiples of standard deviations indicated by "z_score_bounds"', 'If set to "z_score", then the whole plot will be rescaled to z-scores in which', 'the "0" value corresponds to the mean across the genome, and the units correspond', 'to standard deviations above and below the mean. The number of SDs to show are', 'controlled by the "z_score_bound" option.', 'Otherwise, the plot will be', 'scaled to the minimum and maximum values of the region currently on display.', 'min_score and max_score override autoscaling if one or both are defined' ], interval_method => [ ['mean', 'sum', 'min', 'max'], 'mean', 'When working with features that offer a statistical_summary() method,', 'such as those from Bio::DB::BigWig, define the method for reporting', 'scores within each interval.', ], }; } # Added pad_top subroutine (pad_top of Glyph.pm, which is called when executing $self->pad_top # returns 0, so we need to override it here) sub pad_top { shift->Bio::Graphics::Glyph::xyplot::pad_top(@_) } sub pad_left { my $self = shift; my $pad = $self->SUPER::pad_left(@_); return $pad unless $self->option('variance_band'); $pad += length('+1sd')/2 * $self->font('gdTinyFont')->width+3; return $pad; } sub clip_color { my $self = shift; return $self->translate_color('orange'); } # we override the draw method so that it dynamically creates the parts needed # from the wig file rather than trying to fetch them from the database # sub draw() { } is now mostly in wiggle_data.pm sub draw { my $self = shift; my ($gd,$dx,$dy) = @_; my $result = $self->Bio::Graphics::Glyph::wiggle_data::draw(@_); # inhibit the scale if we are non-bumping $self->configure(-scale => 'none') if $self->bump eq 'overlap'; return $result; } sub draw_coverage { my $self = shift; my $feature = shift; my $array = shift; if (! $array || ref($array) ne 'ARRAY'){ unshift(@_,$array); my @arr = (eval{$feature->get_tag_values('coverage')}); $array = $arr[0]; } else { $array = [split ',',$array] unless ref $array; } return unless @$array; my ($start,$end) = $self->effective_bounds($feature); my $bases_per_bin = ($end-$start)/@$array; my $pixels_per_base = $self->scale; my @parts; for (my $pixel=0;$pixel<$self->width;$pixel++) { my $offset = $pixel/$pixels_per_base; my $s = $start + $offset; my $e = $s+1; # fill in gaps my $v = $array->[$offset/$bases_per_bin]; push @parts,[$s,$s,$v]; } $self->draw_plot(\@parts,@_); } sub draw_plot { my $self = shift; my $parts = shift; my ($gd,$dx,$dy) = @_; my $pivot = $self->bicolor_pivot; $self->panel->startGroup($gd); my ($left,$top,$right,$bottom) = $self->calculate_boundaries($dx,$dy); # There is a minmax inherited from xyplot as well as wiggle_data, and I don't want to # rely on Perl's multiple inheritance DFS to find the right one. my ($min_score,$max_score,$mean,$stdev) = $self->minmax($parts); my $rescale = $self->option('autoscale') eq 'z_score'; my $side = $self->_determine_side(); my ($scaled_min,$scaled_max); if ($rescale) { $scaled_min = int(($min_score-$mean)/$stdev + 0.5); $scaled_max = int(($max_score-$mean)/$stdev + 0.5); my $bound = $self->z_score_bound; $scaled_max = $bound if $scaled_max >= 0; $scaled_min = -$bound if $scaled_min <= 0; } elsif ($side) { $scaled_min = int($min_score - 0.5); $scaled_max = int($max_score + 0.5); } else { ($scaled_min,$scaled_max) = ($min_score,$max_score); } my $height = $bottom - $top; my $y_scale = $scaled_max > $scaled_min ? $height/($scaled_max-$scaled_min) : 1; my $x = $left; my $y = $top; my $x_scale = $self->scale; my $panel_start = $self->panel->start; my $feature = $self->feature; my $f_start = $feature->start > $panel_start ? $feature->start : $panel_start; $y += $self->pad_top; # position of "0" on the scale my $y_origin = $scaled_min <= 0 && $pivot ne 'min' ? $bottom - (0 - $scaled_min) * $y_scale : $bottom; $y_origin = int($y_origin+0.5); $self->panel->startGroup($gd); $self->_draw_grid($gd,$x_scale,$scaled_min,$scaled_max,$dx,$dy,$y_origin) unless $self->option('no_grid'); $self->panel->endGroup($gd); return unless $scaled_max > $scaled_min; my $lw = $self->linewidth; my $positive = $self->pos_color; my $negative = $self->neg_color; my $midpoint = $self->midpoint; my $clip_color = $self->clip_color; my $flip = $self->{flip}; $midpoint = ($midpoint - $mean)/$stdev if $rescale; my ($clip_top,$clip_bottom); my @points = map { my ($start,$end,$score) = @$_; $score = ($score-$mean)/$stdev if $rescale; my $x1 = $left + ($start - $f_start) * $x_scale; my $x2 = $left + ($end - $f_start) * $x_scale; if ($x2 >= $left and $x1 <= $right) { my $y1 = $bottom - ($score - $scaled_min) * $y_scale; my $y2 = $y_origin; $y1 = $top if $y1 < $top; $y1 = $bottom if $y1 > $bottom; $x1 = $left if $x1 < $left; $x2 = $right if $x2 > $right; $x1 = $right - ($x1-$left) if $flip; $x2 = $right - ($x2-$left) if $flip; my $color = $score > $midpoint ? $positive : $negative; [int($x1+0.5),int($y1+0.5),int($x2+0.5),int($y2+0.5),$color,$lw]; } else { (); } } @$parts; my $svg_workaround = $gd->isa('GD::SVG::Image'); $self->panel->startGroup($gd); my $type = $self->graph_type; if ($type eq 'boxes' or $type eq 'histogram') { for (@points) { my ($x1,$y1,$x2,$y2,$color,$lw) = @$_; next unless abs($y2-$y1) > 0; if ($svg_workaround && $x1==$x2) { $gd->line($x1,$y1,$x2,$y2,$color); } else { $gd->filledRectangle($x1,$y1,$x2,$y2,$color); } # this tops off clipped peaks with a distinct color, but I just don't like how it looks # $gd->line($x1+1,$top-2, $x1-1,$top, $clip_color) if $y1 == $top; # $gd->line($x1+1,$bottom, $x1-1,$bottom+2, $clip_color) if $y1 == $bottom; } } if ($type eq 'line' or $type eq 'linepoints') { my $current = shift @points; my $lw = $self->option('linewidth'); $gd->setThickness($lw) if $lw > 1; for (@points) { my ($x1,$y1,$x2,$y2,$color,$lw) = @$_; $gd->line(@{$current}[0,1],@{$_}[0,1],$color); $current = $_; } $gd->setThickness(1); } if ($type eq 'points' or $type eq 'linepoints') { my $symbol_name = $self->option('point_symbol') || 'point'; my $filled = $symbol_name =~ s/^filled_//; my $symbol_ref = $self->symbols->{$symbol_name}; my $pr = $self->point_radius; for (@points) { my ($x1,$y1,$x2,$y2,$color,$lw) = @$_; $symbol_ref->($gd,$x1,$y1,$pr,$color,$filled); } } if ($self->option('variance_band') && (my ($mean,$variance) = $self->global_mean_and_variance())) { if ($rescale) { $mean = 0; $variance = 1; } my $y1 = $bottom - ($mean+$variance - $scaled_min) * $y_scale; my $y2 = $bottom - ($mean-$variance - $scaled_min) * $y_scale; my $yy1 = $bottom - ($mean+$variance*2 - $scaled_min) * $y_scale; my $yy2 = $bottom - ($mean-$variance*2 - $scaled_min) * $y_scale; my ($clip_top,$clip_bottom); if ($y1 < $top) { $y1 = $top; $clip_top++; } if ($yy1 < $top) { $yy1 = $top; $clip_top++; } if ($y2 > $bottom) { $y2 = $bottom; $clip_bottom++; } if ($yy2 > $bottom) { $yy2 = $bottom; $clip_bottom++; } my $y = $bottom - ($mean - $scaled_min) * $y_scale; my $mean_color = $self->panel->translate_color('yellow:0.80'); my $onesd_color = $self->panel->translate_color('grey:0.30'); my $twosd_color = $self->panel->translate_color('grey:0.20'); $gd->filledRectangle($left,$y1,$right,$y2,$onesd_color); $gd->filledRectangle($left,$yy1,$right,$yy2,$twosd_color); $gd->line($left,$y,$right,$y,$mean_color); my $side = $self->_determine_side(); my $fcolor=$self->panel->translate_color('grey:0.50'); my $font = $self->font('gdTinyFont'); my $x1 = $left - $self->string_width('+2sd',$font) - ($side=~/left|three/ ? 15 : 0); my $x2 = $left - $self->string_width('mn',$font) - ($side=~/left|three/ ? 15 : 0); $gd->string($font,$x1,$yy1-$self->string_height('+2sd',$font),'+2sd',$fcolor) unless $clip_top; $gd->string($font,$x1,$yy2-$self->string_height('-2sd')/2,'-2sd',$fcolor) unless $clip_bottom; $gd->string($font,$x2,$y - $self->string_height('mn',$font),'mn', $fcolor); } $self->panel->endGroup($gd); $self->panel->startGroup($gd); $self->_draw_scale($gd,$x_scale,$scaled_min,$scaled_max,$dx,$dy,$y_origin); $self->panel->endGroup($gd); $self->draw_label(@_) if $self->option('label') || $self->record_label_positions; $self->draw_description(@_) if $self->option('description'); $self->panel->endGroup($gd); } sub make_key_feature { my $self = shift; my $scale = 1/$self->scale; # base pairs/pixel # one segments, at pixels 0->80 my $offset = $self->panel->offset; my $start = 0 * $scale + $offset; my $end = 80*$scale+$offset; my $span = int(0.5+($end-$start)/50); eval "require Bio::Graphics::Wiggle; 1"; my $wig = Bio::Graphics::Wiggle->new(undef, 1, {seqid=>'chr1', start => int($start), span => $span}); my @values = map { (sin($_/60)+sin($_/12))*100+rand(100) } 0..50; my $min = $values[0]; my $max = $values[0]; my $tot = 0; for (@values) {$min = $_ if $min > $_; $max = $_ if $max < $_; $tot += $_; } $wig->min($min); $wig->max($max); $wig->stdev(120); # just make it up $wig->mean($tot/@values); $wig->set_value(($_*$span)+$start=>$values[$_-1]) for (0..50); my $feature = Bio::Graphics::Feature->new(-start => $start, -end => $end, -name => $self->make_key_name(), -strand => '+1', -attributes => {wigfile=>$wig}, ); return $feature; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::wiggle_xyplot - An xyplot plot compatible with dense "wig"data =head1 SYNOPSIS See and . =head1 DESCRIPTION This glyph works like the regular xyplot but takes value data in Bio::Graphics::Wiggle file format: reference = chr1 ChipCHIP Feature1 1..10000 wigfile=./test.wig ChipCHIP Feature2 10001..20000 wigfile=./test.wig ChipCHIP Feature3 25001..35000 wigfile=./test.wig The "wigfile" attribute gives a relative or absolute pathname to a Bio::Graphics::Wiggle format file. The data consist of a packed binary representation of the values in the feature, using a constant step such as present in tiling array data. Wigfiles are created using the Bio::Graphics::Wiggle module or the wiggle2gff3.pl script, currently both part of the gbrowse package. Alternatively, you can place an array of quantitative data directly in the "wigdata" attribute. This can be an arrayref of quantitative data starting at feature start and ending at feature end, or the data string returned by Bio::Graphics::Wiggle->export_to_wif64($start,$end). The glyph also supports features which offer a statistical_summary() method, such as those from Bio::DB::BigWig. This method returns a hash of values, including validCount, maxVal, minVal, sumData, and sumSquares. For each interval, a statistical score is generated from these values. The mean, minimum, maximum, or sum of the values may be reported. =head2 OPTIONS In addition to all the xyplot glyph options, the following options are recognized: Name Value Description ---- ----- ----------- basedir path Path to be used to resolve "wigfile" and "densefile" tags giving relative paths. Default is to use the current working directory. Absolute wigfile & densefile paths will not be changed. autoscale "local" or "global" If one or more of min_score and max_score options are absent, then these values will be calculated automatically. The "autoscale" option controls how the calculation is done. The "local" value will scale values according to the minimum and maximum values present in the window being graphed. "global" will use chromosome-wide statistics for the entire wiggle or dense file to find min and max values. smoothing method name Smoothing method: one of "mean", "max", "min" or "none" smoothing_window integer Number of values across which data should be smoothed. variance_band boolean If true, draw a grey band across entire plot showing mean and +/- 1 standard deviation (for wig files only). bicolor_pivot name Where to pivot the two colors when drawing bicolor plots. Options are "mean" and "zero". A numeric value can also be provided. pos_color color When drawing bicolor plots, the fill color to use for values that are above the pivot point. neg_color color When drawing bicolor plots, the fill color to use for values that are below the pivot point. interval_method method When working with bigWig features that use the statistical_summary() method, define the method for reporting one or more scores within each interval. Options include "mean", "sum", "min", or "max". Default is "mean". =head2 SPECIAL FEATURE TAGS The glyph expects one or more of the following tags (attributes) in feature it renders: Name Value Description ---- ----- ----------- wigfile path name Path to the Bio::Graphics::Wiggle file or object for quantitative values. wigdata string Data exported from a Bio::Graphics::Wiggle in WIF format using its export_to_wif64() method. densefile path name Path to a Bio::Graphics::DenseFeature object (deprecated) denseoffset integer Integer offset to where the data begins in the Bio::Graphics::DenseFeature file (deprecated) densesize integer Integer size of the data in the Bio::Graphics::DenseFeature file (deprecated) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Esteinl@cshl.eduE. Copyright (c) 2007 Cold Spring Harbor Laboratory This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/merged_alignment.pm000555001750001750 2453412366325116 24033 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::merged_alignment; # this glyph acts like graded_segments but the bgcolor of each segment is # more configurable. Supply a list of colors and corresponding # bins. Each bin is a range of x-y scores, where score n is > x and <= y # e.g. # [ALIGNMENT] # feature = alignment # bins = 0-50 50-70 70-90 90-100 # bincolors = white powderblue cornflowerblue blue # for sematic zooming (at lower magnification), to # reduce visual complexity of alignment # [ALIGNMENT:20000] # segment length >= 20000 # feature = alignment # merge_parts = 1 # max_gap = 500 # do not merge across gaps > 500 bp use strict; use base qw(Bio::Graphics::Glyph::graded_segments); use constant COLORS => "lightgrey powderblue cornflowerblue blue"; sub my_description { return < [ 'integer', undef, "Maximum value of the feature's \"score\" attribute.", "If undef, the value will be calculated automatically."], min_score => [ 'integer', undef, "Minimum value of the feature's \"score\" attribute.", "If undef, the value will be calculated automatically."], bincolors => [ 'string', 'lightgrey powderblue cornflowerblue blue', 'A space-delimited string of colors to be assigned to score bins.'], bins => [ 'integer', undef, 'Size of the score bins. If undefined, the range of scores will be divided', 'into the number of bins indicated by the size of the list of bincolors.'], merge_parts => [ 'boolean', undef, 'Whether to merge small subfeatures to simplify the display at low magnifications.'], } } # override draw method sub draw { my $self = shift; # bail out if this isn't the right kind of feature # handle both das-style and Bio::SeqFeatureI style, # which use different names for subparts. my @parts = $self->parts; @parts = $self if !@parts && $self->level == 0; return $self->SUPER::draw(@_) unless @parts; my $cols = $self->option('bincolors') || COLORS; my @cols = split /\s+/, $cols; my $bins = $self->option('bins'); my @bins = $bins ? split /\s+/, $bins : $self->get_bins(\@parts, @cols); my %color; @color{@bins} = @cols; @parts = $self->merge_parts(@parts) if $self->option('merge_parts'); # figure out the colors for my $part (@parts) { my ($bin) = grep { $part->in_range($_) } @bins; my $idx = $bin ? $self->panel->translate_color($color{$bin}) : $self->panel->translate_color('white'); $part->{partcolor} = $idx; } $self->{parts} = \@parts; $self->Bio::Graphics::Glyph::merge_parts::draw(@_); } sub in_range { my $self = shift; my $range = shift; my ($low,$high) = split '-', $range; my $s = $self->score || shift; return 1 if $s >= $low && $s <= $high; return 0; } # overide background method to paint glyph white as # a last resort sub bgcolor { my $self = shift; return $self->{partcolor} || 'white'; } # used if bins are not defined in the configuration # makes equal sized bins corresponding to the number of # colors specified sub get_bins { my $self = shift; my $parts = shift; my $cols = @_; my ($min,$max) = $self->minmax($parts); my $range = $max - $min; return ($max) if $range == 0; my $increment = $range/$cols+1; my ($score,@bins) = $min; until ($score > $max) { my $range = "$score-"; $score += $increment; $range .= $score-1; push @bins, $range; } return @bins; } # synthesize a key glyph sub keyglyph { my $self = shift; my $scale = 1/$self->scale; # base pairs/pixel # two segments, at pixels 0->50, 60->80 my $offset = $self->panel->offset; my $feature = Bio::Graphics::Feature->new( -segments=>[ [ 0*$scale +$offset,25*$scale+$offset], [ 25*$scale +$offset,50*$scale+$offset], [ 50*$scale+$offset, 75*$scale+$offset] ], -name => $self->option('key'), -strand => '+1'); my @scores = $self->example_scores; my @segments = $feature->segments; for ($feature->segments) { $_->score(shift @scores); } my $factory = $self->factory->clone; $factory->set_option(label => 1); $factory->set_option(bump => 0); $factory->set_option(connector => 'solid'); my $glyph = $factory->make_glyph(0,$feature); } sub example_scores { my $self = shift; my $bins = $self->option('bins'); if ($bins) { my @bins = split /\s+/, $bins; $bins[0] =~ s/(\S+)\-\S+/$1/; $bins[-1] =~ s/\S+\-(\S+)/$1/; my $mid = $bins[0] + ($bins[-1] - $bins[0])/2; return ($bins[0], $mid, $bins[-1]); } if ($self->option('min_score') || $self->option('max_score')) { my ($min,$max) = $self->minmax; my $mid = $min + ($max - $min)/2; return($min,$mid,$max); } return (0,50,100); } 1; =pod =head1 NAME Bio::Graphics::Glyph::merged_alignment - The "merged_alignment" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph acts like graded_segments but the bgcolor of segments (sub-feature) is controlled by binned scores. It also supports semantic zooming to optimize glyph drawing for larger sequence displays. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition, the merged-alignment glyph recognizes the following glyph-specific options: Option Description Default ------ ----------- ------- -max_score Maximum value of the Calculated feature's "score" attribute -min_score Minimum value of the Calculated feature's "score" attribute -bincolors Colors assigned to bins lightgrey powderblue cornflowerblue blue (in order) -bins Bins to which scores are Calculated assigned -merge_parts 0 (false) Whether to simplify the alignment at low magnification -max_gap Do not merge across gaps Calculated that exceed this threshold If max_score and min_score are not specified, then the glyph will calculate the local maximum and minimum scores at run time. If the bins are not specified, they will be calculated based on the number of colors assigned and the local (or user-specified) minimum and maximum scores. Calculated bins are equal in size. User-specified bins are expressed as ranges, bins = 0-50 50-70 70-90 90-100 where each range means greater than the lower number and less than or equal to the higher number. =head2 Simplifying the display of alignment features for large segments The "merge_parts" option is used for semantic zooming. Specifically, if features are small and dense, they will not be displayed very well for large segments and the color-coding will be lost. If merge-parts is set to a true value, adjacent alignment parts will be merged until a gap exceeding a calculated or user-specified value is encountered. Unless specified, the maximum gap allowed for merging adjacent features is calculated as (L/10000)*(L/500), where L = the length of the sequence displayed in the browser. The exponentially increasing gap threshold allows more aggressive merging of alignment features as the size of the displayed sequence grows larger. The score of the merged feature is calculated as a weighted average. For example, consider two adjacent HSPs that are each 400 bp in length and have scores of 60% and 70%. If the merge_parts option is set to a true value, the two HSPs would be merged in the display to a single 800 bp alignment block with an average score of 65%. The merge_parts option is turned off by default. =head2 SAMPLE CONFIGURATION Sample gbrowse configuration stanzas for an alignment feature using this glyph. The scores are assumed to be expressed as percent identity (0-100). # base configuration [BLASTZ] feature = blastz_alignment glyph = merged_alignment bincolors = #A0A0A0 powderblue cornflowerblue blue bins = 60-70 70-80 80-90 90-100 category = Sequence Similarity Tracks height = 6 bump = 1 label = 1 fgcolor = black key = BLASTZ Semantic zooming with defined maximum gap between merged features for different zoom levels # if the displayed segment is >= 20000 in length, # use the merge_parts option to simplify the alignment # display [BLASTZ:20000] feature = blastz_alignment merge_parts = 1 max_gap = 50 # do not merge across gaps > 50 bp # if the displayed segment is >= 50000 in length [BLASTZ:50000] feature = blastz_alignment merge_parts = 1 max_gap = 500 # do not merge across gaps > 500 bp --OR-- Semantic zooming with dynamically calculated maximum gap # if the displayed segment is >= 20000 in length, [BLASTZ:20000] feature = blastz_alignment merge_parts = 1 =head1 BUGS Please report them. =head1 SEE ALSO L, L L, L, L, L, L =head1 AUTHOR Sheldon McKay Emckays@cshl.eduE Copyright (c) 2005 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/anchored_arrow.pm000555001750001750 1470712366325116 23530 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::anchored_arrow; # package to use for drawing an arrow use strict; use base qw(Bio::Graphics::Glyph::arrow); sub my_description { return < [ [0..2], 0, 'Draw a scale with tickmarks on the arrow.', 'A value of 0 suppresses the scale.', 'A value of 1 draws major ticks only.', 'A value of 2 draws major and minor ticks.',], relative_coords=> [ 'boolean', undef, 'When drawing the scale, start numbering at position 1 instead of at', 'the start of the feature in global (e.g. chromosomal) coordinates.'], relative_coords_offset=> [ 'integer', 1, 'When drawing a scale with relative_coords set to true, begin numbering', 'the scale at this starting value.'], no_arrows => [ 'boolean', undef, "Do not draw an arrow when the glyph is partially offscreen."], }; } sub draw_label { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; my $label = $self->label or return; my $label_align = $self->option('label_align'); if ($label_align && ($label_align eq 'center' || $label_align eq 'right')) { my $x = $self->left + $left; my $font = $self->option('labelfont') || $self->font; my $middle = $self->left + $left + ($self->right - $self->left) / 2; my $label_width = $self->string_width($label,$font); if ($label_align eq 'center') { my $new_x = $middle - $label_width / 2; $x = $new_x if ($new_x > $x);; } else { my $new_x = $left + $self->right - $label_width; $x = $new_x if ($new_x > $x); } $x = $self->panel->left + 1 if $x <= $self->panel->left; #detect collision (most likely no bump when want centering label) #lay down all features on one line e.g. cyto bands return if (!$self->option('bump') && ($label_width + $x) > $self->right); $gd->string($font, $x, $self->top + $top, $label, $self->fontcolor); } else { $self->SUPER::draw_label(@_); } } sub arrowheads { my $self = shift; my ($ne,$sw,$base_e,$base_w); my $feature = $self->feature; my $gstart = $feature->start; my $gend = $feature->end; my $pstart = $self->panel->start; my $pend = $self->panel->end; if (!defined $gstart || $gstart <= $pstart) { # off left end $sw = 1; } if (!defined $gend || $gend >= $pend) { # off right end $ne = 1; } ($sw,$ne) = ($ne,$sw) if $self->panel->{flip}; return ($sw,$ne,!$sw,!$ne); } sub no_trunc { !shift->option('no_arrows'); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::anchored_arrow - The "anchored_arrow" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws an arrowhead which is anchored at one or both ends (has a vertical base) or has one or more arrowheads. The arrowheads indicate that the feature does not end at the edge of the picture, but continues. For example: |-----------------------------| both ends in picture <----------------------| left end off picture |----------------------------> right end off picture <------------------------------------> both ends off picture You can also set the glyph so that the end is just truncated at the end of the picture. |----------------------------- =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition to the standard options, this glyph recognizes the following: Option Description Default -tick draw a scale 0 (false) -relative_coords use relative coordinates 0 (false) for scale -relative_coords_offset set the relative offset 1 for scale -no_arrows don't draw an arrow when 0 (false) glyph is partly offscreen The argument for B<-tick> is an integer between 0 and 2 and has the same interpretation as the B<-tick> option in Bio::Graphics::Glyph::arrow. If B<-rel_coords> is set to a true value, then the scale drawn on the glyph will be in relative (1-based) coordinates relative to the beginning of the glyph. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/wiggle_data.pm000555001750001750 3343412366325116 23000 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::wiggle_data; use strict; use base qw(Bio::Graphics::Glyph::minmax); use File::Spec; use Data::Dumper; sub minmax { my $self = shift; my $parts = shift; my $autoscale = $self->option('autoscale') || 'local'; my $min_score = $self->min_score unless $autoscale eq 'z_score'; my $max_score = $self->max_score unless $autoscale eq 'z_score'; my $do_min = !defined $min_score; my $do_max = !defined $max_score; if (@$parts && $self->feature->can('statistical_summary')) { my ($min,$max,$mean,$stdev) = eval {$self->bigwig_stats($autoscale,$self->feature)}; $min_score = $min if $do_min; $max_score = $max if $do_max; return $self->sanity_check($min_score,$max_score,$mean,$stdev); } elsif (eval {$self->wig}) { if (my ($min,$max,$mean,$stdev) = eval{$self->wig_stats($autoscale,$self->wig)}) { $min_score = $min if $do_min; $max_score = $max if $do_max; return $self->sanity_check($min_score,$max_score,$mean,$stdev); } } if ($do_min or $do_max) { my $first = $parts->[0]; for my $part (@$parts) { my $s = ref $part ? $part->[2] : $part; next unless defined $s; $min_score = $s if $do_min && (!defined $min_score or $s < $min_score); $max_score = $s if $do_max && (!defined $max_score or $s > $max_score); } } return $self->sanity_check($min_score,$max_score); } sub bigwig_stats { my $self = shift; my ($autoscale,$feature) = @_; my $s; if ($autoscale =~ /global/ or $autoscale eq 'z_score') { $s = $feature->global_stats; } elsif ($autoscale eq 'chromosome') { $s = $feature->chr_stats; } else { $s = $feature->score; } return $self->clip($autoscale, $s->{minVal},$s->{maxVal},Bio::DB::BigWig::binMean($s),Bio::DB::BigWig::binStdev($s)); } sub wig_stats { my $self = shift; my ($autoscale,$wig) = @_; if ($autoscale =~ /global|chromosome|z_score/) { my $min_score = $wig->min; my $max_score = $wig->max; my $mean = $wig->mean; my $stdev = $wig->stdev; return $self->clip($autoscale,$min_score,$max_score,$mean,$stdev); } else { return; } } sub clip { my $self = shift; my ($autoscale,$min,$max,$mean,$stdev) = @_; return ($min,$max,$mean,$stdev) unless $autoscale =~ /clipped/; my $fold = $self->z_score_bound; my $clip_max = $mean + $stdev*$fold; my $clip_min = $mean - $stdev*$fold; $min = $clip_min if $min < $clip_min; $max = $clip_max if $max > $clip_max; return ($min,$max,$mean,$stdev); } sub z_score_bound { my $self = shift; return $self->option('z_score_bound') || 4; } # change the scaling of the data points if z-score autoscaling requested sub rescale { my $self = shift; my $points = shift; return $points unless $self->option('autoscale') eq 'z_score'; my ($min,$max,$mean,$stdev) = $self->minmax($points); foreach (@$points) { $_ = ($_ - $mean) / $stdev; } return $points; } sub global_mean_and_variance { my $self = shift; if (my $wig = $self->wig) { return ($wig->mean,$wig->stdev); } elsif ($self->feature->can('global_mean')) { my $f = $self->feature; return ($f->global_mean,$f->global_stdev); } return; } sub global_min_max { my $self = shift; if (my $wig = $self->wig) { return ($wig->min,$wig->max); } elsif (my $stats = eval {$self->feature->global_stats}) { return ($stats->{minVal},$stats->{maxVal}); } return; } sub series_stdev { my $self = shift; my ($mean,$stdev) = $self->global_mean_and_variance; return $stdev; } sub series_mean { my $self = shift; my ($mean) = $self->global_mean_and_variance; return $mean; } sub series_min { my $self = shift; return ($self->global_min_max)[0]; } sub series_max { my $self = shift; return ($self->global_min_max)[1]; } sub wig { my $self = shift; my $d = $self->{wig}; $self->{wig} = shift if @_; $d; } sub datatype { my $self = shift; my $feature = $self->feature; my ($tag,$value); for my $t ('wigfile','wigdata','densefile','coverage') { if (my ($v) = eval{$feature->get_tag_values($t)}) { $value = $v; $tag = $t; last; } } if (!$value && $feature->can('statistical_summary')) { $tag = 'statistical_summary'; $value = eval{$feature->statistical_summary}; } $tag ||= 'generic'; return wantarray ? ($tag,$value) : $tag; } sub get_parts { my $self = shift; my $feature = $self->feature; my ($start,$end) = $self->effective_bounds($feature); my ($datatype,$data) = $self->datatype; return $self->subsample($data,$start,$end) if $datatype eq 'wigdata'; return $self->create_parts_from_wigfile($data,$start,$end) if $datatype eq 'wigfile'; return $self->create_parts_for_dense_feature($data,$start,$end) if $datatype eq 'densefile'; return $self->create_parts_from_coverage($data,$start,$end) if $datatype eq 'coverage'; return $self->create_parts_from_summary($data,$start,$end) if $datatype eq 'statistical_summary'; return []; } sub effective_bounds { my $self = shift; my $feature = shift; my $panel_start = $self->panel->start; my $panel_end = $self->panel->end; my $start = $feature->start>$panel_start ? $feature->start : $panel_start; my $end = $feature->end<$panel_end ? $feature->end : $panel_end; return ($start,$end); } sub create_parts_for_dense_feature { my $self = shift; my ($dense,$start,$end) = @_; my $span = $self->scale> 1 ? $end - $start : $self->width; my $data = $dense->values($start,$end,$span); my $points_per_span = ($end-$start+1)/$span; my @parts; for (my $i=0; $i<$span;$i++) { my $offset = $i * $points_per_span; my $value = shift @$data; next unless defined $value; push @parts,[$start + int($i * $points_per_span), $start + int($i * $points_per_span), $value]; } return \@parts; } sub create_parts_from_coverage { my $self = shift; my ($array,$start,$end) = @_; $array = [split ',',$array] unless ref $array; return unless @$array; my $bases_per_bin = ($end-$start)/@$array; my $pixels_per_base = $self->scale; my @parts; for (my $pixel=0;$pixel<$self->width;$pixel++) { my $offset = $pixel/$pixels_per_base; my $s = $start + $offset; my $e = $s+1; # fill in gaps my $v = $array->[$offset/$bases_per_bin]; push @parts,[$s,$s,$v]; } return \@parts; } sub create_parts_from_summary { my $self = shift; my ($stats,$start,$end) = @_; $stats ||= []; my $interval_method = $self->option('interval_method') || 'mean'; my @vals; if ($interval_method eq 'mean') { @vals = map {$_->{validCount} ? $_->{sumData}/$_->{validCount} : undef} @$stats; } elsif ($interval_method eq 'sum') { @vals = map {$_->{validCount} ? $_->{sumData} : undef} @$stats; } elsif ($interval_method eq 'min') { @vals = map {$_->{validCount} ? $_->{minVal} : undef} @$stats; } elsif ($interval_method eq 'max') { @vals = map {$_->{validCount} ? $_->{maxVal} : undef} @$stats; } else { warn "unrecognized interval method $interval_method!"; } return \@vals; } sub create_parts_from_wigfile { my $self = shift; my ($path,$start,$end) = @_; if (ref $path && $path->isa('Bio::Graphics::Wiggle')) { return $self->create_parts_for_dense_feature($path,$start,$end); } $path = $self->rel2abs($path); if ($path =~ /\.wi\w{1,3}$/) { eval "require Bio::Graphics::Wiggle" unless Bio::Graphics::Wiggle->can('new'); my $wig = eval { Bio::Graphics::Wiggle->new($path)}; return $self->create_parts_for_dense_feature($wig,$start,$end); } elsif ($path =~ /\.bw$/i) { eval "use Bio::DB::BigWig" unless Bio::DB::BigWig->can('new'); my $bigwig = Bio::DB::BigWig->new(-bigwig=>$path); my ($summary) = $bigwig->features(-seq_id => $self->feature->segment->ref, -start => $start, -end => $end, -type => 'summary'); return $self->create_parts_from_summary($summary->statistical_summary($self->width)); } } sub subsample { my $self = shift; my ($data,$start,$end) = @_; my $span = $self->scale > 1 ? $end - $start : $self->width; my $points_per_span = ($end-$start+1)/$span; my @parts; for (my $i=0; $i<$span;$i++) { my $offset = $i * $points_per_span; my $value = $data->[$offset + $points_per_span/2]; push @parts,[$start + int($i*$points_per_span), $start + int($i*$points_per_span), $value]; } return \@parts; } sub rel2abs { my $self = shift; my $wig = shift; return $wig if ref $wig; my $path = $self->option('basedir'); return File::Spec->rel2abs($wig,$path); } sub draw { my $self = shift; my ($gd,$dx,$dy) = @_; my $feature = $self->feature; my $datatype = $self->datatype; my $retval; $retval = $self->draw_wigfile($feature,@_) if $datatype eq 'wigfile'; $retval = $self->draw_wigdata($feature,@_) if $datatype eq 'wigdata'; $retval = $self->draw_densefile($feature,@_) if $datatype eq 'densefile'; $retval = $self->draw_coverage($feature,@_) if $datatype eq 'coverage'; $retval = $self->draw_statistical_summary($feature,@_) if $datatype eq 'statistical_summary'; $retval = $self->SUPER::draw(@_) if $datatype eq 'generic'; return $retval; } sub draw_wigfile { my $self = shift; my $feature = shift; my ($wigfile) = eval{$feature->get_tag_values('wigfile')}; $wigfile = $self->rel2abs($wigfile); eval "require Bio::Graphics::Wiggle" unless Bio::Graphics::Wiggle->can('new'); my $wig = ref $wigfile && $wigfile->isa('Bio::Graphics::Wiggle') ? $wigfile : eval { Bio::Graphics::Wiggle->new($wigfile) }; unless ($wig) { warn $@; return $self->SUPER::draw(@_); } $self->_draw_wigfile($feature,$wigfile,@_); } sub draw_wigdata { my $self = shift; my $feature = shift; my ($data) = eval{$feature->get_tag_values('wigdata')}; if (ref $data eq 'ARRAY') { my ($start,$end) = $self->effective_bounds($feature); my $parts = $self->subsample($data,$start,$end); $self->draw_plot($parts,@_); } else { my $wig = eval { Bio::Graphics::Wiggle->new() }; unless ($wig) { warn $@; return $self->SUPER::draw(@_); } $wig->import_from_wif64($data); $self->_draw_wigfile($feature,$wig,@_); } } sub draw_densefile { my $self = shift; my $feature = shift; my ($densefile) = eval{$feature->get_tag_values('densefile')}; $densefile = $self->rel2abs($densefile); my ($denseoffset) = eval{$feature->get_tag_values('denseoffset')}; my ($densesize) = eval{$feature->get_tag_values('densesize')}; $denseoffset ||= 0; $densesize ||= 1; my $smoothing = $self->get_smoothing; my $smooth_window = $self->smooth_window; my $start = $self->smooth_start; my $end = $self->smooth_end; my $fh = IO::File->new($densefile) or die "can't open $densefile: $!"; eval "require Bio::Graphics::DenseFeature" unless Bio::Graphics::DenseFeature->can('new'); my $dense = Bio::Graphics::DenseFeature->new(-fh=>$fh, -fh_offset => $denseoffset, -start => $feature->start, -smooth => $smoothing, -recsize => $densesize, -window => $smooth_window, ) or die "Can't initialize DenseFeature: $!"; my $parts = $self->get_parts; $self->draw_plot($parts); } sub draw_coverage { my $self = shift; my $feature = shift; my ($array) = eval{$feature->get_tag_values('coverage')}; $self->_draw_coverage($feature,$array,@_); } sub draw_statistical_summary { my $self = shift; my $feature = shift; my $stats = $feature->statistical_summary($self->width); $stats ||= []; my $interval_method = $self->option('interval_method') || 'mean'; my @vals; if ($interval_method eq 'mean') { @vals = map {$_->{validCount} ? $_->{sumData}/$_->{validCount} : undef} @$stats; } elsif ($interval_method eq 'sum') { @vals = map {$_->{validCount} ? $_->{sumData} : undef} @$stats; } elsif ($interval_method eq 'min') { @vals = map {$_->{validCount} ? $_->{minVal} : undef} @$stats; } elsif ($interval_method eq 'max') { @vals = map {$_->{validCount} ? $_->{maxVal} : undef} @$stats; } else { warn "unrecognized interval method $interval_method!"; } return $self->_draw_coverage($feature,\@vals,@_); } sub _draw_coverage { my $self = shift; my $feature = shift; my $array = shift; $array = [split ',',$array] unless ref $array; return unless @$array; my ($start,$end) = $self->effective_bounds($feature); my $bases_per_bin = ($end-$start)/@$array; my $pixels_per_base = $self->scale; my @parts; for (my $pixel=0;$pixel<$self->width;$pixel++) { my $offset = $pixel/$pixels_per_base; my $s = $start + $offset; my $e = $s+1; # fill in gaps my $v = $array->[$offset/$bases_per_bin]; next unless defined $v; # skip missing values push @parts,[$s,$s,$v]; } $self->draw_plot(\@parts,@_); } sub _draw_wigfile { my $self = shift; my $feature = shift; my $wigfile = shift; $self->feature->remove_tag('wigfile') if $self->feature->has_tag('wigfile'); $self->feature->add_tag_value('wigfile',$wigfile); eval "require Bio::Graphics::Wiggle" unless Bio::Graphics::Wiggle->can('new'); my $wig = ref $wigfile && $wigfile->isa('Bio::Graphics::Wiggle') ? $wigfile : eval { Bio::Graphics::Wiggle->new($wigfile) }; $wig->smoothing($self->get_smoothing); $wig->window($self->smooth_window); $self->wig($wig); my $parts = $self->get_parts; $self->draw_plot($parts,@_); } 1; Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/alignment.pm000555001750001750 771512366325116 22472 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::alignment; use strict; use base qw(Bio::Graphics::Glyph::graded_segments); sub my_description { return < [ 'integer', undef, "Maximum value of the feature's \"score\" attribute."], min_score => [ 'integer', undef, "Minimum value of the feature's \"score\" attribute."], vary_fg => [ 'boolean', undef, "Vary the foreground color as well as the background."], merge_parts => [ 'boolean', undef, "At low magnifications, smooth small gaps to improve the visual display.", "See this glyph's manual page for the gory details."], max_gap => [ 'integer', undef, 'Do not merge across gaps that exceed this threshold.'], } } 1; __END__ =head1 NAME Bio::Graphics::Glyph::alignment - The "alignment" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This is identical to the "graded_segments" glyph, and is used for drawing features that consist of discontinuous segments. The color intensity of each segment is proportionate to the score. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -strand_arrow Whether to indicate 0 (false) strandedness -hilite Highlight color undef (no color) In addition, the alignment glyph recognizes the following glyph-specific options: Option Description Default ------ ----------- ------- -max_score Maximum value of the Calculated feature's "score" attribute -min_score Minimum value of the Calculated feature's "score" attribute If max_score and min_score are not specified, then the glyph will calculate the local maximum and minimum scores at run time. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/segmented_keyglyph.pm000555001750001750 421712366325116 24375 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::segmented_keyglyph; # Don't use this package. It's just for inheriting the segmented glyph in the panel key. use strict; use base qw(Bio::Graphics::Glyph::generic); sub make_key_feature { my $self = shift; my $scale = 1/$self->scale; # base pairs/pixel # two segments, at pixels 0->50, 60->80 my $offset = $self->panel->offset; my $feature = Bio::Graphics::Feature->new( -segments=>[ [ 0*$scale +$offset,50*$scale+$offset], [60*$scale+$offset, 80*$scale+$offset] ], -name => $self->make_key_name(), -strand => '+1', ); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::segmented_keyglyph - The "segmented_keyglyph" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used internally by Bio::Graphics::Panel as a base class for drawing the keys at the bottom of the panel. It should not be used explicitly. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/text_in_box.pm000555001750001750 617312366325116 23033 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::text_in_box; use strict; use base qw(Bio::Graphics::Glyph::generic); sub default_text { return "3'"; } sub default_text_pad { return 3; } sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $fg = $self->fgcolor; my $font = $self->option('labelfont') || $self->font; my $text = defined $self->option('text') ? $self->option('text') : $self->default_text(); my $text_pad = defined $self->option('text_pad') ? $self->option('text_pad') : $self->default_text_pad(); my $width = $self->string_width($text); my $height = $self->font_height; my $midY = ($y2+$y1) / 2; my $poly_pkg = $self->polygon_package; my $polygon = $poly_pkg->new(); $polygon->addPt($x1,$midY-$height/2-$text_pad); $polygon->addPt($x1+$width+2*$text_pad,$midY-$height/2-$text_pad); $polygon->addPt($x1+$width+2*$text_pad,$midY+$height/2+$text_pad); $polygon->addPt($x1, $midY+$height/2+$text_pad); if (defined (my $bgcolor = $self->option('text_bgcolor'))) { $gd->filledPolygon($polygon,$self->factory->translate_color($bgcolor)); } $gd->polygon($polygon,$fg); $gd->string($font, $x1+$text_pad, $midY-$height/2, $text, $self->fontcolor); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::text_in_box - The "text in box" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws the specified text in a rectangular box. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -text The text to draw in the box 3' -text_pad The number of pixels to offset 3 the box -text_bgcolor none The background color of the box =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Vsevolod (Simon) Ilyushchenko Esimonf@cshl.eduE. Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/image.pm000555001750001750 3541512366325116 21614 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::image; use strict; use GD; use base 'Bio::Graphics::Glyph::generic'; our @ISA; # # |--------------------| true position ('height' high) # . . # . . diagonal (vertical spacing high) # . . # +--------------------------+ # | | # | | # | | image # | | # | | # | | # +--------------------------+ use constant VERTICAL_SPACING => 20; sub my_description { return < [ 'string', undef, 'Specify the image path or URL to use for the feature.', 'If no image option is specified, then the glyph will look', 'inside the feature itself for an image path or URL in a tag named "image"', ], image_prefix => [ 'string', undef, 'A string to prepend to each image path.', 'You may use this to prepend a directory path or a partial URL.'], vertical_spacing => [ 'integer', 20, 'Vertical distance from the box that shows the physical span of the', 'feature to the top of the picture, in pixels.'], glyph_delegate => [ 'string', 'generic', 'The glyph to use for the part of the glyph that shows the physical', 'span of features.'] } } sub demo_feature { my $self = shift; my $ex_image = 'http://www.catch-fly.com/sites/awhittington/_files/Image/Drosophila-melanogaster.jpg'; return Bio::Graphics::Feature->new(-start=>1, -end=>500, -name=>$ex_image, -attributes => { image=>$ex_image, }, ); } sub new { my $self = shift->SUPER::new(@_); $self->{image} = $self->get_image(); return $self; } sub get_image { my $self = shift; my ($format,$image) = eval { $self->image_data }; unless ($image) { warn $@ if $@; return; } my $gd = $format eq 'image/png' ? GD::Image->newFromPngData($image,1) : $format eq 'image/jpeg' ? GD::Image->newFromJpegData($image,1) : $format eq 'image/gif' ? GD::Image->newFromGifData($image) : $format eq 'image/gd' ? GD::Image->newFromGdData($image) : $format eq 'image/gd2' ? GD::Image->newFromGd2Data($image) : $self->throw("This module cannot handle images of type $format"); return $gd; } sub _guess_format { my $self = shift; my $path = shift; return 'image/png' if $path =~ /\.png$/i; return 'image/jpeg' if $path =~ /\.jpe?g$/i; return 'image/gif' if $path =~ /\.gif(87)?$/i; return 'image/gd' if $path =~ /\.gd$/i; return 'image/gd2' if $path =~ /\.gd2$/i; my ($extension) = $path =~ /\.(\w+)$/; #cop-out return $extension; } sub image_path { my $self = shift; my $feature = $self->feature or $self->throw("no feature!"); my $dirname = $self->image_dir; my $basename = $self->option('image'); # can't get it from callback, so try looking for an 'image' attribute if (!$basename && $feature->can('has_tag') && $feature->has_tag('image')) { ($basename) = $feature->get_tag_values('image'); } return unless $basename; return $basename if $basename =~ m!^\w+:/!; # looks like a URL return $basename if $basename =~ m!^/!; # looks like an abs path return "$dirname/$basename"; } sub image_data { my $self = shift; my $path = $self->image_path or return; if ($path =~ m!^\w+:/!) { # looks like a URL require LWP::UserAgent; my $ua = LWP::UserAgent->new(env_proxy => 1); my $response = $ua->get($path); if ($response->is_success) { return ($response->content_type,$response->content); } else { $self->throw($response->status_line); } } else { my $content_type = $self->_guess_format($path); open F,$path or $self->throw("Can't open $path: $!"); binmode F; my $data; $data .= $_ while read(F,$_,1024); close F; return ($content_type,$data); } } sub pad_left { my $self = shift; my $pad = $self->SUPER::pad_left; my $image = $self->{image} or return $pad; my $width_needed = ($image->width - $self->width)/2; return $pad > $width_needed ? $pad : $width_needed; } sub pad_right { my $self = shift; my $pad = $self->SUPER::pad_right; my $image = $self->{image} or return $pad; my $width_needed = ($image->width - $self->width)/2; return $pad > $width_needed ? $pad : $width_needed; } sub pad_bottom { my $self = shift; my $pb = $self->SUPER::pad_bottom; my $image = $self->{image} or return $pb; $pb += $self->vertical_spacing; $pb += $image->height; return $pb; } sub vertical_spacing { my $self = shift; my $vs = $self->option('vertical_spacing'); return $vs if defined $vs; return VERTICAL_SPACING; } sub draw_description { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; $self->SUPER::draw_description($gd,$left,$top,$partno,$total_parts); } sub image_dir { my $self = shift; return $self->option('image_prefix'); } sub draw_component { my $self = shift; my $gd = shift; my($x1,$y1,$x2,$y2) = $self->bounds(@_); my $delegate = $self->option('glyph_delegate') || 'generic'; if ($delegate eq 'generic') { $self->SUPER::draw_component($gd,@_); } else { eval "require Bio::Graphics::Glyph::$delegate"; local @ISA = ("Bio::Graphics::Glyph::$delegate"); my $method = "Bio::Graphics::Glyph::${delegate}::draw_component"; $self->$method($gd,@_); } my $image = $self->{image} or return; my $fgcolor = $self->fgcolor; my $bgcolor = $self->bgcolor; my $height = $self->option('height'); my $half = 4; my $vs = $self->vertical_spacing; my $delta = (($x2-$x1) - $image->width)/2; my($x,$y) = ($x1+$delta,$y1+$vs+$self->height); if ($gd->can('copy') && !$gd->isa('GD::SVG::Image')) { $gd->copy($image,$x,$y,0,0,$image->width,$image->height) ; } elsif ($gd->isa('GD::SVG::Image') && $self->image_path =~ m!^(ftp|http)+:/!) { # a URL my ($img,$id) = $gd->_prep($x,$y); $img->image('x' => $x, 'y' => $y, width => $image->width, height => $image->height, id => $id, 'xlink:href' => $self->image_path); } else { my $gray = $self->panel->translate_color('gray'); $gd->filledRectangle($x,$y,$x+$image->width,$y+$image->height,$gray); } if ($vs > 0) { $gd->line($x1,$y2+2,$x1,$y2+$half,$fgcolor); $gd->line($x2,$y2+2,$x2,$y2+$half,$fgcolor); $gd->line($x1,$y2+$half,$x,$y-$half,$fgcolor); $gd->line($x2,$y2+$half,$x+$image->width-1,$y-$half,$fgcolor); $gd->line($x,$y-$half,$x,$y-2,$fgcolor); $gd->line($x+$image->width-1,$y-$half,$x+$image->width-1,$y-2,$fgcolor); } } 1; __END__ =head1 NAME Bio::Graphics::Glyph::image - A glyph that draws photographs & other images =head1 SYNOPSIS use Bio::Graphics; use Bio::Seq; use Bio::SeqFeature::Generic; my $bsg = 'Bio::SeqFeature::Generic'; my $seq = Bio::Seq->new(-length=>1000); my $whole = $bsg->new(-display_name => 'Clone82', -start => 1, -end => $seq->length); my $image1 = $bsg->new(-start => 100, -end => 300, -display_name => 'Excretory System', -tag=>{ image=>"http://www.flybase.org/anatomy/image-browser_files/excretory-system.gif" } ); my $image2 = $bsg->new(-start => 500, -end => 800, -display_name => 'Expression Pattern', -tag=>{ image=>"http://www.flybase.org/anatomy/image-browser_files/embryonic-expression-pattern.gif" } ); my $panel = Bio::Graphics::Panel->new(-length => $seq->length, -width => 800, -truecolor => 1, -key_style => 'between', -pad_left => 10, -pad_right => 10, ); $panel->add_track($whole, -glyph => 'arrow', -double => 1, -tick => 2, -label => 1, ); $panel->add_track([$image1,$image2], -glyph => 'image', -label => 1, -key => 'Example images'); binmode STDOUT; print $panel->png; =head1 DESCRIPTION This glyph inserts an image into the track at the indicated feature coordinates. The image can be in PNG, JPEG, GIF or GD format, and can be either 8-bit or 24-bit ("truecolor"). The image can be located on the local filesystem or located at a remote URL (provided that you have the LWP module installed). When working with photographic images, you may wish to have Bio::Graphics::Panel create 24-bit (truecolor) images in order to avoid running out of colors. The symptom of this is that images appear posterized. To turn on truecolor images, pass the -truecolor option to Bio::Graphics::Panel as shown in the synopsis. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) The following additional options are available to the "image" glyph: Option Description Default ------ ----------- ------- -image Specify the image path or URL none to use for this feature. -image_prefix String to prepend to none each image path. You may prepend a directory or a partial URL. -vertical_spacing Vertical distance from the box 20 that shows the physical span of of the feature to the top of the picture (in pixels). -glyph_delegate Glyph to use for the part of 'generic' the glyph that shows the physical span of the feature. Set B<-vertical_spacing> to 0 to completely suppress the diagonal lines that connect the physical span of the feature to the image. =head2 Specifying the Image The path to the image can be specified in two ways. First, you can place it in the feature itself using a tag named "image". Second, you can specify it as a track option using a callback: $panel->add_track(\@features, -glyph=>'image', -image => sub { my $feature = shift; my $image_path = do_something(); return $image } ); You can of course give -image a constant string, in which case each feature will show the same image. The image can be a file on the local operating system or a URL. However, URL fetching will only work if the LWP module is installed on your system. Otherwise the glyph will fail with an error message. If the image is a relative path (it does not begin with a slash or a URL protocol), then the contents of -image_prefix will be prepended to it. This allows you to specify images that are relative to a particular directory or a partial URL. Example: $panel->add_track(\@features, -glyph => 'image', -image_prefix => 'http://www.flybase.org/anatomy/image-browser_files', ); This specifies that each feature's "image" tag is to be appended to the partial FlyBase URL, thereby saving space. =head2 Glyph Delegation The image glyph consists of two parts: an upper part that shows the extent of the feature in base pair coordinates, and a lower part that shows the image. No scaling of the image is done; its height and width are fixed. By default the upper part uses the "generic" glyph, which is a simple rectangle filled with the bgcolor and outlined with the fgcolor. To use a different glyph in the upper part, specify the -glyph_delegate option, giving the name of the glyph you wish to use. For instance, to use the "span" glyph: $panel->add_track(\@features, -glyph => 'image', -glyph_delegate => 'span' ); This feature does not work with all glyphs, and in particular requires a recent CVS checkout of Bio::Perl to work properly with the "arrow", "span" and "primers" glyphs (support for the feature did not make it into version 1.5). =head1 BUGS AND LIMITATIONS This glyph does not work with GD::SVG. If you try to render it onto a GD::SVG panel, the image will be shown as a gray box. This will be fixed in a future version of GD::SVG. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE, Todd Harris Eharris@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/hidden.pm000555001750001750 527312366325116 21744 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::hidden; # a simple inverted V (used by DAS) use strict; use base qw(Bio::Graphics::Glyph::line); sub my_description { return < and L. =head1 DESCRIPTION This glyph does nothing. It is used by DAS rendering to draw an empty space between components of a compound feature. =head2 OPTIONS This glyph takes only the standard options. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -strand_arrow Whether to indicate 0 (false) strandedness -hilite Highlight color undef (no color) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/xyplot.pm000555001750001750 6775312366325116 22103 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::xyplot; use strict; #use GD 'gdTinyFont'; use base qw(Bio::Graphics::Glyph::segments Bio::Graphics::Glyph::minmax); use constant DEFAULT_POINT_RADIUS=>4; use Bio::Root::Version; our $VERSION = ${Bio::Root::Version::VERSION}; use constant DEBUG=>0; use constant EXTRA_LABEL_PAD=>8; sub my_description { return <<'END'; This glyph is used for drawing features that have a position on the genome and a numeric value. It can be used to represent gene prediction scores, motif-calling scores, percent similarity, microarray intensities, or other features that require a line plot. The plot is designed to work on a single feature group that contains subfeatures. It is the subfeatures that carry the score information. For a more efficient implementation that is suitable for dense genome-wide data, use Bio::Graphics::Wiggle and the wiggle_xyplot glyph. END } sub my_options { { point_radius => [ 'integer', 1, 'When drawing data points, this specifies the radius of each point.', ], clip => [ 'boolean', 0, 'If min_score and/or max_score are manually specified,', 'then setting this to true will cause values outside the', 'range to be clipped.' ], graph_type => [ ['histogram','line','points','linepoints'], 'histogram', 'Type of graph to generate. Options are "boxes",', '"line","points", or "linepoints".', 'The deprecated "boxes" subtype is equivalent to "histogram".' ], point_symbol => [ 'string', 'none', 'Symbol to use for each data point when drawing line graphs.', 'Options are "triangle", "square", "disc", "filled_triangle",', '"filled_square", "filled_disc", "point" and "none"', ], scale => [ 'string', 'three', 'Position where the Y axis scale is drawn, if any.', 'Options are one of "left", "right", "both", "three" or "none".', '"three" will cause the scale to be drawn in the left, right and center.', ], scale_color => [ 'color', 'fgcolor', 'Color of the X and Y scales. Defaults to the same as fgcolor.', ], }; } my %SYMBOLS = ( triangle => \&draw_triangle, square => \&draw_square, disc => \&draw_disc, point => \&draw_point, ); sub extra_label_pad { return EXTRA_LABEL_PAD; } # Default pad_left is recursive through all parts. We certainly # don't want to do this for all parts in the graph. sub pad_left { my $self = shift; return 0 unless $self->level == 0; my $left = $self->SUPER::pad_left(@_); my $side = $self->_determine_side; $left += $self->extra_label_pad if $self->label_position eq 'left' && $side =~ /left|both|three/; return $left; } # Default pad_left is recursive through all parts. We certainly # don't want to do this for all parts in the graph. sub pad_right { my $self = shift; return 0 unless $self->level == 0; return $self->SUPER::pad_right(@_); } sub point_radius { shift->option('point_radius') || DEFAULT_POINT_RADIUS; } sub pad_top { my $self = shift; my $pad = $self->Bio::Graphics::Glyph::generic::pad_top(@_); if ($pad < $self->font_height($self->getfont('gdTinyFont'))+8) { $pad = $self->font_height($self->getfont('gdTinyFont'))+8; # extra room for the scale } $pad; } sub pad_bottom { my $self = shift; my $pad = $self->Bio::Graphics::Glyph::generic::pad_bottom(@_); if ($pad < $self->font_height($self->getfont('gdTinyFont'))/4) { $pad = $self->font_height($self->getfont('gdTinyFont'))/4; # extra room for the scale } $pad; } sub scalecolor { my $self = shift; local $self->{default_opacity} = 1; my $color = $self->color('scale_color') || $self->fgcolor; } sub default_scale { return 'three'; } sub record_label_positions { my $self = shift; my $rlp = $self->option('record_label_positions'); return $rlp if defined $rlp; return -1; } sub graph_type { my $self = shift; $self->option('graph_type') || $self->option('graphtype') || 'boxes'; } sub draw { my $self = shift; my ($gd,$dx,$dy) = @_; my ($left,$top,$right,$bottom) = $self->calculate_boundaries($dx,$dy); my @parts = $self->parts; return $self->SUPER::draw(@_) unless @parts > 0; $self->panel->startGroup($gd); my ($min_score,$max_score) = $self->minmax(\@parts); my $side = $self->_determine_side(); # if a scale is called for, then we adjust the max and min to be even # multiples of a power of 10. if ($side) { $max_score = max10($max_score); $min_score = min10($min_score); } my $height = $bottom - $top; my $scale = $max_score > $min_score ? $height/($max_score-$min_score) : 1; my $x = $left; my $y = $top + $self->pad_top; # position of "0" on the scale my $y_origin = $min_score <= 0 ? $bottom - (0 - $min_score) * $scale : $bottom; $y_origin = $top if $max_score < 0; my $clip_ok = $self->option('clip'); $self->{_clip_ok} = $clip_ok; $self->{_scale} = $scale; $self->{_min_score} = $min_score; $self->{_max_score} = $max_score; $self->{_top} = $top; $self->{_bottom} = $bottom; # now seed all the parts with the information they need to draw their positions foreach (@parts) { my $s = $_->score; $_->{_y_position} = $self->score2position($s); warn "y_position = $_->{_y_position}" if DEBUG; } my $type = $self->option('graph_type') || $self->option('graphtype') || 'boxes'; my (@draw_methods) = $self->lookup_draw_method($type); $self->throw("Invalid graph type '$type'") unless @draw_methods; $self->panel->startGroup($gd); $self->_draw_grid($gd,$scale,$min_score,$max_score,$dx,$dy,$y_origin); $self->panel->endGroup($gd); for my $draw_method (@draw_methods) { $self->$draw_method($gd,$dx,$dy,$y_origin); } $self->panel->startGroup($gd); $self->_draw_scale($gd,$scale,$min_score,$max_score,$dx,$dy,$y_origin); $self->panel->endGroup($gd); $self->draw_label(@_) if $self->option('label') or $self->record_label_positions; $self->draw_description(@_) if $self->option('description'); $self->draw_legend(@_) if $self->option('overlay'); $self->panel->endGroup($gd); } sub lookup_draw_method { my $self = shift; my $type = shift; return '_draw_boxes' if $type eq 'histogram'; # same thing return '_draw_boxes' if $type eq 'boxes'; return qw(_draw_line _draw_points) if $type eq 'linepoints'; return '_draw_line' if $type eq 'line'; return '_draw_points' if $type eq 'points'; return; } sub normalize_track { my $self = shift; my @glyphs_in_track = @_; my ($global_min,$global_max); for my $g (@glyphs_in_track) { my ($min_score,$max_score) = $g->minmax($g->get_parts); $global_min = $min_score if !defined $global_min || $min_score < $global_min; $global_max = $max_score if !defined $global_max || $max_score > $global_max; } # note that configure applies to the whole track $glyphs_in_track[0]->configure(-min_score => $global_min); $glyphs_in_track[0]->configure(-max_score => $global_max); } sub get_parts { my $self = shift; my @parts = $self->parts; return \@parts; } sub score { my $self = shift; my $s = $self->option('score'); return $s if defined $s; return eval { $self->feature->score }; } sub score2position { my $self = shift; my $score = shift; return undef unless defined $score; if ($self->{_clip_ok} && $score < $self->{_min_score}) { return $self->{_bottom}; } elsif ($self->{_clip_ok} && $score > $self->{_max_score}) { return $self->{_top}; } else { warn "score = $score, _top = $self->{_top}, _bottom = $self->{_bottom}, max = $self->{_max_score}, min=$self->{_min_score}" if DEBUG; my $position = ($score-$self->{_min_score}) * $self->{_scale}; warn "position =$position" if DEBUG; return $self->{_bottom} - $position; } } sub log10 { log(shift)/log(10) } sub max10 { my $a = shift; return 0 if $a==0; return -min10(-$a) if $a<0; return max10($a*10)/10 if $a < 1; my $l=int(log10($a)); $l = 10**$l; my $r = $a/$l; return $r*$l if int($r) == $r; return $l*int(($a+$l)/$l); } sub min10 { my $a = shift; return 0 if $a==0; return -max10(-$a) if $a<0; return min10($a*10)/10 if $a < 1; my $l=int(log10($a)); $l = 10**$l; my $r = $a/$l; return $r*$l if int($r) == $r; return $l*int($a/$l); } sub _draw_boxes { my $self = shift; my ($gd,$left,$top,$y_origin) = @_; my @parts = $self->parts; my $lw = $self->linewidth; # Make the boxes transparent my $positive = $self->pos_color + 1073741824; my $negative = $self->neg_color + 1073741824; my $height = $self->height; my $midpoint = $self->midpoint ? $self->score2position($self->midpoint) : $y_origin; my $partcolor = $self->code_option('part_color'); my $factory = $self->factory; # draw each of the boxes as a rectangle for (my $i = 0; $i < @parts; $i++) { my $part = $parts[$i]; my $next = $parts[$i+1]; my ($color,$negcolor); # special check here for the part_color being defined so as not to introduce lots of # checking overhead when it isn't if ($partcolor) { $color = $self->translate_color($factory->option($part,'part_color',0,0)); $negcolor = $color; } else { $color = $positive; $negcolor = $negative; } my ($x1,$y1,$x2,$y2) = $part->calculate_boundaries($left,$top); next unless defined $part->{_y_position}; # prevent boxes from being less than 1 pixel $x2 = $x1+1 if $x2-$x1 < 1; if ($part->{_y_position} < $midpoint) { $gd->filledRectangle($x1,$part->{_y_position},$x2,$y_origin,$color); } else { $gd->filledRectangle($x1,$y_origin,$x2,$part->{_y_position},$negcolor); } } # That's it. } sub _draw_line { my $self = shift; my ($gd,$left,$top) = @_; my @parts = $self->parts; my $fgcolor = $self->fgcolor; my $bgcolor = $self->bgcolor; # connect to center positions of each interval my $first_part = shift @parts; my ($x1,$y1,$x2,$y2) = $first_part->calculate_boundaries($left,$top); my $current_x = ($x1+$x2)/2; my $current_y = $first_part->{_y_position}; for my $part (@parts) { ($x1,$y1,$x2,$y2) = $part->calculate_boundaries($left,$top); my $next_x = ($x1+$x2)/2; my $next_y = $part->{_y_position}; $gd->line($current_x,$current_y,$next_x,$next_y,$fgcolor) if defined $current_y and defined $next_y; ($current_x,$current_y) = ($next_x,$next_y); } } sub _draw_points { my $self = shift; my ($gd,$left,$top) = @_; my $symbol_name = $self->option('point_symbol') || 'point'; my $filled = $symbol_name =~ s/^filled_//; my $symbol_ref = $SYMBOLS{$symbol_name}; my @parts = $self->parts; my $fgcolor = $self->fgcolor; my $bgcolor = $self->bgcolor; my $pr = $self->point_radius; my $partcolor = $self->code_option('part_color'); my $factory = $self->factory; for my $part (@parts) { my ($x1,$y1,$x2,$y2) = $part->calculate_boundaries($left,$top); my $x = ($x1+$x2)/2; my $y = $part->{_y_position}; next unless defined $y; my $color; if ($partcolor) { $color = $self->translate_color($factory->option($part,'part_color',0,0)); } else { $color = $fgcolor; } $symbol_ref->($gd,$x,$y,$pr,$color,$filled); } } sub _determine_side { my $self = shift; my $side = $self->option('scale'); return if $side eq 'none'; $side ||= $self->default_scale(); return $side; } sub _draw_scale { my $self = shift; my ($gd,$scale,$min,$max,$dx,$dy,$y_origin) = @_; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries($dx,$dy); my $crosses_origin = $min < 0 && $max > 0; my $side = $self->_determine_side() or return; my $fg = $self->scalecolor; my $font = $self->font('gdTinyFont'); my $middle = ($x1+$x2)/2; # minor ticks - multiples of 10 my $y_scale = $self->minor_ticks($min,$max,$y1,$y2); my $p = $self->panel; my $gc = $self->translate_color($p->gridcolor); my $mgc= $self->translate_color($p->gridmajorcolor); $gd->line($x1,$y1,$x1,$y2,$fg) if $side eq 'left' || $side eq 'both' || $side eq 'three'; $gd->line($x2,$y1,$x2,$y2,$fg) if $side eq 'right' || $side eq 'both' || $side eq 'three'; $gd->line($middle,$y1,$middle,$y2,$fg) if $side eq 'three'; $gd->line($x1,$y_origin,$x2,$y_origin,$mgc); my @points = ([$y1,$max],[$y2,$min]); push @points,$crosses_origin ? [$y_origin,0] : [($y1+$y2)/2,($min+$max)/2]; my $last_font_pos = -99999999999; for (sort {$a->[0]<=>$b->[0]} @points) { $gd->line($x1-3,$_->[0],$x1,$_->[0],$fg) if $side eq 'left' || $side eq 'both' || $side eq 'three'; $gd->line($x2,$_->[0],$x2+3,$_->[0],$fg) if $side eq 'right' || $side eq 'both' || $side eq 'three'; $gd->line($middle,$_->[0],$middle+3,$_->[0],$fg) if $side eq 'three'; my $font_pos = $_->[0]-($self->font_height($font)/2); $font_pos-=2 if $_->[1] < 0; # jog a little bit for neg sign next unless $font_pos > $last_font_pos + $self->font_height($font)/2; # prevent labels from clashing if ($side eq 'left' or $side eq 'both' or $side eq 'three') { $gd->string($font, $x1 - $self->string_width($_->[1],$font) - 3,$font_pos, $_->[1], $fg); } if ($side eq 'right' or $side eq 'both' or $side eq 'three') { $gd->string($font, $x2 + 5,$font_pos, $_->[1], $fg); } if ($side eq 'three') { $gd->string($font, $middle + 5,$font_pos, $_->[1], $fg); } $last_font_pos = $font_pos; } for (my $y = $y2-$y_scale; $y > $y1; $y -= $y_scale) { my $yr = int($y+0.5); $gd->line($x1-3,$yr,$x1,$yr,$fg) if $side eq 'left' or $side eq 'both' or $side eq 'three'; $gd->line($x2,$yr,$x2+3,$yr,$fg) if $side eq 'right' or $side eq 'both' or $side eq 'three'; $gd->line($middle-1,$yr,$middle+2,$yr,$fg) if $side eq 'three'; } } sub _draw_grid { my $self = shift; my ($gd,$scale,$min,$max,$dx,$dy,$y_origin) = @_; my $side = $self->_determine_side(); return unless $side; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries($dx,$dy); my $p = $self->panel; my $gc = $self->translate_color($p->gridcolor); my $y_scale = $self->minor_ticks($min,$max,$y1,$y2); for (my $y = $y2-$y_scale; $y > $y1; $y -= $y_scale) { my $yr = int($y+0.5); $gd->line($x1-1,$yr,$x2,$yr,$gc); } $gd->line($x1,$y1,$x2,$y1,$gc); $gd->line($x1,$y2,$x2,$y2,$gc); } sub minor_ticks { my $self = shift; my ($min,$max,$top,$bottom) = @_; my $interval = 1; my $height = $bottom-$top; my $y_scale = 1; if ($max > $min) { while ($height/(($max-$min)/$interval) < 2) { $interval *= 10 } $y_scale = $height/(($max-$min)/$interval); } } # Let the feature attributes override the labelcolor sub labelcolor { my $self = shift; my ($labelcolor) = eval {$self->feature->get_tag_values('labelcolor')}; return $labelcolor ? $self->translate_color($labelcolor) : $self->SUPER::labelcolor; } # we are unbumpable! sub bump { return 0; } sub connector { my $self = shift; my $type = $self->option('graph_type'); return 1 if $type eq 'line' or $type eq 'linepoints'; } sub height { my $self = shift; return $self->option('graph_height') || $self->SUPER::height; } sub draw_description { my $self = shift; return if $self->bump eq 'overlap'; return $self->SUPER::draw_description(@_); } sub draw_triangle { my ($gd,$x,$y,$pr,$color,$filled) = @_; $pr /= 2; my ($vx1,$vy1) = ($x-$pr,$y+$pr); my ($vx2,$vy2) = ($x, $y-$pr); my ($vx3,$vy3) = ($x+$pr,$y+$pr); my $poly = GD::Polygon->new; $poly->addPt($vx1,$vy1,$vx2,$vy2); $poly->addPt($vx2,$vy2,$vx3,$vy3); $poly->addPt($vx3,$vy3,$vx1,$vy1); if ($filled) { $gd->filledPolygon($poly,$color); } else { $gd->polygon($poly,$color); } } sub draw_square { my ($gd,$x,$y,$pr,$color,$filled) = @_; $pr /= 2; my $poly = GD::Polygon->new; $poly->addPt($x-$pr,$y-$pr); $poly->addPt($x+$pr,$y-$pr); $poly->addPt($x+$pr,$y+$pr); $poly->addPt($x-$pr,$y+$pr); if ($filled) { $gd->filledPolygon($poly,$color); } else { $gd->polygon($poly,$color); } } sub draw_disc { my ($gd,$x,$y,$pr,$color,$filled) = @_; if ($filled) { $gd->filledArc($x,$y,$pr,$pr,0,360,$color); } else { $gd->arc($x,$y,$pr,$pr,0,360,$color); } } sub draw_point { my ($gd,$x,$y,$pr,$color) = @_; $gd->setPixel($x,$y,$color); } sub keyglyph { my $self = shift; my $scale = 1/$self->scale; # base pairs/pixel my $feature = Bio::Graphics::Feature->new( -segments=>[ [ 0*$scale,9*$scale], [ 10*$scale,19*$scale], [ 20*$scale, 29*$scale] ], -name => 'foo bar', -strand => '+1'); ($feature->segments)[0]->score(10); ($feature->segments)[1]->score(50); ($feature->segments)[2]->score(25); my $factory = $self->factory->clone; $factory->set_option(label => 1); $factory->set_option(bump => 0); $factory->set_option(connector => 'solid'); my $glyph = $factory->make_glyph(0,$feature); return $glyph; } sub symbols { my $self = shift; return \%SYMBOLS; } sub draw_label { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; my $label = $self->label or return; if ($self->bump eq 'overlap') { my $x = $self->left + $left + $self->pad_left; $x = $self->panel->left + 1 if $x <= $self->panel->left; $x += ($self->panel->glyph_scratch||0); my $font = $self->labelfont; my $width = $self->string_width($label,$font)+4; my $height= $self->string_height('',$font); unless ($self->record_label_positions) { $gd->filledRectangle($x,$top,$x+$width+6,$top+$height,$self->bgcolor); local $self->{default_opacity} = 1; $gd->string($font,$x+3,$top,$label,$self->contrasting_label_color($gd,$self->bgcolor)); } $self->panel->glyph_scratch($self->panel->glyph_scratch + $width); $self->panel->add_key_box($self,$label,$x,$top) if $self->record_label_positions; } elsif ($self->label_position eq 'left') { my $font = $self->labelfont; my $x = $self->left + $left - $self->string_width($label,$font) - $self->extra_label_pad; my $y = $self->{top} + $top; $self->render_label($gd, $font, $x, $y, $label); } else { $self->SUPER::draw_label(@_); } } sub contrasting_label_color { my $self = shift; my ($gd,$bgcolor) = @_; my ($r,$g,$b) = $gd->rgb($bgcolor); my $avg = ($r+$g+$b)/3; return $self->translate_color($avg > 128 ? 'black' : 'white'); } sub draw_legend { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; return if $self->bump eq 'overlap'; my $color = $self->option('fgcolor'); my $name = $self->feature->{name}; my $label = " " . $name . "" or return; my $font = $self->labelfont; my $x = $self->left + $left - $self->string_width($label,$font) - $self->extra_label_pad; my $y = $self->{top} + $top; my $is_legend = 1; $self->render_label($gd, $font, $x, $y, $label, $is_legend); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::xyplot - The xyplot glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used for drawing features that have a position on the genome and a numeric value. It can be used to represent gene prediction scores, motif-calling scores, percent similarity, microarray intensities, or other features that require a line plot. The X axis represents the position on the genome, as per all other glyphs. The Y axis represents the score. Options allow you to set the height of the glyph, the maximum and minimum scores, the color of the line and axis, and the symbol to draw. The plot is designed to work on a single feature group that contains subfeatures. It is the subfeatures that carry the score information. The best way to arrange for this is to create an aggregator for the feature. We'll take as an example a histogram of repeat density in which interval are spaced every megabase and the score indicates the number of repeats in the interval; we'll assume that the database has been loaded in in such a way that each interval is a distinct feature with the method name "density" and the source name "repeat". Furthermore, all the repeat features are grouped together into a single group (the name of the group is irrelevant). If you are using Bio::DB::GFF and Bio::Graphics directly, the sequence of events would look like this: my $agg = Bio::DB::GFF::Aggregator->new(-method => 'repeat_density', -sub_parts => 'density:repeat'); my $db = Bio::DB::GFF->new(-dsn=>'my_database', -aggregators => $agg); my $segment = $db->segment('Chr1'); my @features = $segment->features('repeat_density'); my $panel = Bio::Graphics::Panel->new(-pad_left=>40,-pad_right=>40); $panel->add_track(\@features, -glyph => 'xyplot', -graph_type=>'points', -point_symbol=>'disc', -point_radius=>4, -scale=>'both', -height=>200, ); If you are using Generic Genome Browser, you will add this to the configuration file: aggregators = repeat_density{density:repeat} clone alignment etc Note that it is a good idea to add some padding to the left and right of the panel; otherwise the scale will be partially cut off by the edge of the image. The "boxes" variant allows you to specify a pivot point such that scores above the pivot point are drawn in one color, and scores below are drawn in a different color. These "bicolor" plots are controlled by the options -bicolor_pivot, -pos_color and -neg_color, as described below. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition, the xyplot glyph recognizes the following glyph-specific options: Option Description Default ------ ----------- ------- -max_score Maximum value of the Calculated feature's "score" attribute -min_score Minimum value of the Calculated feature's "score" attributes -graph_type Type of graph to generate. Histogram Options are: "histogram", "boxes", "line", "points", or "linepoints". -point_symbol Symbol to use. Options are none "triangle", "square", "disc", "filled_triangle", "filled_square", "filled_disc","point", and "none". -point_radius Radius of the symbol, in 4 pixels (does not apply to "point") -scale Position where the Y axis none scale is drawn if any. It should be one of "left", "right", "both" or "none" -graph_height Specify height of the graph Same as the "height" option. -part_color For boxes & points only, none bgcolor of each part (should be a callback). Supersedes -neg_color. -scale_color Color of the scale Same as fgcolor -clip If min_score and/or max_score false are manually specified, then setting this to true will cause values outside the range to be clipped. -bicolor_pivot 0 Where to pivot the two colors when drawing bicolor plots. Scores greater than this value will be drawn using -pos_color. Scores lower than this value will be drawn using -neg_color. -pos_color When drawing bicolor plots, same as bgcolor the fill color to use for values that are above the pivot point. -neg_color When drawing bicolor plots, same as bgcolor the fill color to use for values that are below the pivot point. Note that when drawing scales on the left or right that the scale is actually drawn a few pixels B the boundaries of the glyph. You may wish to add some padding to the image using -pad_left and -pad_right when you create the panel. The B<-part_color> option can be used to color each part of the graph. Only the "boxes", "points" and "linepoints" styles are affected by this. Here's a simple example: $panel->add_track->(\@affymetrix_data, -glyph => 'xyplot', -graph_type => 'boxes', -part_color => sub { my $score = shift->score; return 'red' if $score < 0; return 'lightblue' if $score < 500; return 'blue' if $score >= 500; } ); =head2 METHODS For those developers wishing to derive new modules based on this glyph, the main method to override is: =over 4 =item 'method_name' = $glyph-Elookup_draw_method($type) This method accepts the name of a graph type (such as 'histogram') and returns the name of a method that will be called to draw the contents of the graph, for example '_draw_histogram'. This method will be called with three arguments: $self->$draw_method($gd,$left,$top,$y_origin) where $gd is the GD object, $left and $top are the left and right positions of the whole glyph (which includes the scale and label), and $y_origin is the position of the zero value on the y axis (in pixels). By the time this method is called, the y axis and labels will already have been drawn, and the scale of the drawing (in pixels per unit score) will have been calculated and stored in $self-E{_scale}. The y position (in pixels) of each point to graph will have been stored into the part, as $part-E{_y_position}. Hence you could draw a simple scatter plot with this code: sub lookup_draw_method { my $self = shift; my $type = shift; if ($type eq 'simple_scatterplot') { return 'draw_points'; } else { return $self->SUPER::lookup_draw_method($type); } } sub draw_points { my $self = shift; my ($gd,$left,$top) = @_; my @parts = $self->parts; my $bgcolor = $self->bgcolor; for my $part (@parts) { my ($x1,$y1,$x2,$y2) = $part->calculate_boundaries($left,$top); my $x = ($x1+$x2)/2; # take center my $y = $part->{_y_position}; $gd->setPixel($x,$y,$bgcolor); } lookup_draw_method() may return multiple method names if needed. Each will be called in turn. =item $y_position = $self-Escore2position($score) Translate a score into a y pixel position, obeying clipping rules and min and max values. =back =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/arrow.pm000555001750001750 4174012366325116 21662 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::arrow; # package to use for drawing an arrow # Non object-oriented utilities used here-and-there in Bio::Graphics modules =head1 NAME Bio::Graphics::Glyph::arrow - the "arrow" glyph =cut use strict; use Bio::Coordinate::Pair; use Bio::Location::Simple; use base qw(Bio::Graphics::Glyph::generic); sub my_description { return < [ [0..2], 0, 'Draw a scale with tickmarks on the arrow.', 'A value of 0 suppresses the scale.', 'A value of 1 draws major ticks only.', 'A value of 2 draws major and minor ticks.',], tickcolor => [ 'color', undef, 'Color to use for the tick marks on the scale. If the value is undef,', 'then the fgcolor will be used.'], tickwidth => [ 'integer', 0, 'Line width to use for ticks.', 'If the value is undef, then the linewidth will be used.'], parallel => [ 'boolean', 1, 'Whether to draw the arrow parallel to the direction of the sequence', '(left/right) or perpendicular to it (up/down).'], northeast => [ 'boolean', 1, 'Force a north or east arrowhead, depending on the arrow\'s orientation.'], east => [ 'boolean', 1, 'Synonym for "northeast".'], southwest=> [ 'boolean', 1, 'Force a south or west arrowhead, depending on the arrow\'s orientation.'], west=> [ 'boolean', 1, 'Synonym for "southwest".'], double => [ 'boolean', undef, 'Force a double-headed arrow.'], base => [ 'boolean', undef, 'Draw a vertical base at the non-arrowhead side of the glyph line.'], scale => [ 'integer', 1, 'Deprecated option; do not use.'], arrowstyle => [ [qw(regular filled)], 'regular', 'Control the arrowhead style.', '"regular" creates a simple thin arrowhead.', '"filled" creates a thick filled arrowhead.'], relative_coords => [ 'boolean', undef, "Start numbering the scale at position 1 rather than at the position", "of the feature in global (e.g. chromosome-relative) coordinates."], relative_coords_offset => [ 'integer', 1, 'When using relative coordinates for the arrowhead tick labels,', 'this option sets the starting position.'], units => [ 'string', undef, 'Add units to the tick labels, such as "bp".'], unit_divider => [ 'integer', 1, 'Divide the tick label by the indicated amount prior to displaying them.', 'Useful for displaying the scale in a custom unit, such as cM.'] }; } my %UNITS = (p => 1e-12, n => 1e-9, u => 1e-6, m => 0.001, c => 0.01, k => 1000, M => 1_000_000, G => 1_000_000_000); sub pad_bottom { my $self = shift; my $val = $self->SUPER::pad_bottom(@_); $val += $self->string_height($self->font) if $self->option('tick'); $val; } # override draw method sub draw_component { my $self = shift; my $parallel = $self->option('parallel'); $parallel = 1 unless defined $parallel; $self->draw_parallel(@_) if $parallel; $self->draw_perpendicular(@_) unless $parallel; } sub draw_perpendicular { my $self = shift; my $gd = shift; my ($dx,$dy) = @_; my ($x1,$y1,$x2,$y2) = $self->bounds(@_); my $ne = $self->option('northeast'); my $sw = $self->option('southwest'); $ne = $sw = 1 unless defined($ne) || defined($sw); # draw a perpendicular arrow at position indicated by $x1 my $fg = $self->set_pen; my $a2 = ($y2-$y1)/4; my @positions = $x1 == $x2 ? ($x1) : ($x1,$x2); for my $x (@positions) { if ($ne) { $gd->line($x,$y1,$x,$y2,$fg); $gd->line($x-$a2,$y1+$a2,$x,$y1,$fg); $gd->line($x+$a2,$y1+$a2,$x,$y1,$fg); } if ($sw) { $gd->line($x,$y1,$x,$y2,$fg); $gd->line($x-$a2,$y2-$a2,$x,$y2,$fg); $gd->line($x+$a2,$y2-$a2,$x,$y2,$fg); } } # add a label if requested $self->draw_label($gd,$dx,$dy) if $self->option('label'); # this draws the label aligned to the left } sub draw_parallel { my $self = shift; my $gd = shift; my ($dx,$dy) = @_; my ($x1,$y1,$x2,$y2) = $self->bounds(@_); my $fg = $self->set_pen; my $a2 = ($self->height)/2; my $center = $y1+$a2; my $trunc_left = $x1 < $self->panel->left; my $trunc_right = $x2 > $self->panel->right; $x1 = $self->panel->left if $trunc_left; $x2 = $self->panel->right if $trunc_right; # warn $self->feature,": x1=$x1, x2=$x2, start=$self->{start},end=$self->{end}, strand=$self->{strand}"; # warn join ' ',%$self; $trunc_left = 0 if $self->no_trunc; $trunc_right = 0 if $self->no_trunc; my ($sw,$ne,$base_w,$base_e) = $self->arrowheads; $gd->line($x1,$center,$x2,$center,$fg); $self->arrowhead($gd,$x1,$center,$a2,-1) if $sw && !$trunc_left; # west arrow $self->arrowhead($gd,$x2,$center,$a2,+1) if $ne && !$trunc_right; # east arrow $gd->line($x1,$center-$a2,$x1,$center+$a2,$fg) if $base_w && !$trunc_left; #west base $gd->line($x2,$center-$a2,$x2,$center+$a2,$fg) if $base_e && !$trunc_right; #east base # turn on ticks if ($self->option('tick')) { local $^W = 0; # dumb uninitialized variable warning my $font = $self->font; my $width = $self->string_width('m',$font); my $font_color = $self->fontcolor; my $height = $self->height; my $relative = $self->option('relative_coords'); my $flipped = $self->{flip}; my $end = $self->panel->end + 1; my $tickwidth = $self->option('tickwidth'); $tickwidth = $self->linewidth unless defined $tickwidth; my $tickcolor = $self->color($self->option('tickcolor') || $self->option('fgcolor')); my $tickpen = $self->set_pen($tickwidth, $tickcolor); my $relative_coords_offset = $self->option('relative_coords_offset'); $relative_coords_offset = 1 unless defined $relative_coords_offset; my $start = $relative ? $relative_coords_offset : $self->feature->start-1; my $stop = $start + $self->feature->length - 1; my $map = Bio::Coordinate::Pair->new(-in => Bio::Location::Simple->new( -seq_id => "rel", -start => $start, -end => $stop, -strand => 1, ), -out => Bio::Location::Simple->new( -seq_id => "abs", -start => $self->feature->start, -end => $self->feature->end, -strand => $self->feature->strand, ), ) if $relative; my $unit_label = $self->option('units') || ''; my $unit_divider = $self->option('unit_divider') || 1; my $units_in_label = $self->option('units_in_label'); my $units = $self->calculate_units($start/$unit_divider,$self->feature->length/$unit_divider); my $divisor = $UNITS{$units} || 1; $divisor *= $unit_divider; my $format = min($self->feature->length,$self->panel->length)/$divisor > 10 ? "%d" : "%.6g"; $format .= "$units%s" unless $units_in_label; my $scale = $self->option('scale') || 1; ## Does the user want to override the internal scale? my $model = sprintf("$format ",$stop/($divisor*$scale),$unit_label); $model = "-$model" if $start < 0; my $minlen = $width * length($model);# * 1.5; my ($major_interval,$minor_interval) = $self->panel->ticks(($stop-$start+1)/$unit_divider,$minlen); my $left = $sw ? $x1+$height : $x1; my $right = $ne ? $x2-$height : $x2; # adjust for portions of arrow that are outside panel if ($relative && $self->feature->strand == -1) { $start += $self->feature->end - $self->panel->end if $self->feature->end > $self->panel->end; $stop -= $self->panel->start - $self->feature->start if $self->feature->start < $self->panel->start; } else { $start += $self->panel->start - $self->feature->start if $self->feature->start < $self->panel->start; $stop -= $self->feature->end - $self->panel->end if $self->feature->end > $self->panel->end; } my $first_tick = $major_interval * int($start/$major_interval); my $last_tick = $major_interval * int(($stop+2)/$major_interval); my $label_intervals = $self->label_intervals; my $interval_width = $major_interval * $self->scale/2; my %drewit; for (my $i = $first_tick; $i <= $last_tick; $i += $major_interval) { my $abs = $i; if ($relative) { $abs = $map->map( Bio::Location::Simple->new(-seq_id => "rel", -start => $i, -end => $i, -strand => 1, ) )->match; next unless $abs; $abs = $abs->start; } $abs = $end - $abs + 1 if $flipped; my $tickpos = int $dx + $self->map_pt($abs); next if $tickpos < $x1 || $tickpos > $x2; $drewit{$tickpos}++; $gd->line($tickpos,$center-$a2,$tickpos,$center+$a2,$tickpen) unless $tickpos < $left or $tickpos > $right; my $label = $scale ? $i / $scale : $i; my $scaled = $label/$divisor; $label = sprintf($format,$scaled,$unit_label); my $label_len = length($label) * $width; my $middle = $tickpos - $label_len/2; $middle += $interval_width if $label_intervals; $gd->string($font,$middle,$center+$a2-1,$label,$font_color) unless ($self->option('no_tick_label') || $middle > $x2); } if ($self->option('tick') >= 2) { $first_tick = $minor_interval * int($start/$minor_interval); $last_tick = $minor_interval * int(($stop+2)/$minor_interval); my $a4 = $self->height/4; for (my $i = $first_tick; $i <= $last_tick; $i += $minor_interval) { my $abs = $i; if ($relative) { $abs = $map->map( Bio::Location::Simple->new(-seq_id => "rel", -start => $i, -end => $i, -strand => 1, ) )->match; next unless $abs; $abs = $abs->start; } $abs = $end - $abs if $flipped; my $tickpos = int $dx + $self->map_pt($abs); next if $tickpos < $left-1 or $tickpos > $right+1; next if $drewit{$tickpos} || $drewit{$tickpos-1} || $drewit{$tickpos+1}; # prevent roundoff errors from appearing $gd->line($tickpos,$center-$a4,$tickpos,$center+$a4,$tickpen); } } } # add a label if requested $self->draw_label($gd,$dx,$dy) if $self->option('label'); $self->draw_description($gd,$dx,$dy) if $self->option('description'); } sub label { my $self = shift; my $label = $self->SUPER::label(@_); return $label unless $self->option('units_in_label'); my $unit_divider = $self->option('unit_divider') || 1; my $unit_label = $self->option('units') || ''; my $start = $self->feature->start-1; my $units = $self->calculate_units($start/$unit_divider,$self->feature->length/$unit_divider); return $label . " ($units$unit_label)"; } sub label_intervals { return shift->option('label_intervals'); } sub arrowheads { my $self = shift; my ($ne,$sw,$base_e,$base_w); if ($self->option('double')) { $ne = $sw = 1; } else { $ne = $self->option('northeast') || $self->option('east'); $sw = $self->option('southwest') || $self->option('west'); } # otherwise use strandedness to define the arrow unless (defined($ne) || defined($sw)) { # turn on both if neither specified $ne = 1 if $self->feature->strand > 0; $sw = 1 if $self->feature->strand < 0; ($ne,$sw) = ($sw,$ne) if $self->{flip}; } return ($sw,$ne,0,0) unless $self->option('base'); return ($sw,$ne, (!$sw && $self->feature->start>= $self->panel->start), (!$ne && $self->feature->end <= $self->panel->end)); } sub no_trunc { 0; } sub calculate_units { my $self = shift; my ($start,$length) = @_; return 'G' if $length >= 1e9; return 'M' if $length >= 1e6; return 'k' if $length >= 1e3; return '' if $length >= 1; return 'c' if $length >= 1e-2; return 'm' if $length >= 1e-3; return 'u' if $length >= 1e-6; return 'n' if $length >= 1e-9; return 'p'; } sub min { $_[0]<$_[1] ? $_[0] : $_[1] } 1; __END__ =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws arrows. Depending on options, the arrows can be labeled, be oriented vertically or horizontally, or can contain major and minor ticks suitable for use as a scale. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -tick Whether to draw major 0 and minor ticks. 0 = no ticks 1 = major ticks 2 = minor ticks -tickcolor Color to use for tick marks fgcolor -tickwidth Line width to use for ticks linewidth -parallel Whether to draw the arrow 1 (true) parallel to the sequence or perpendicular to it. -northeast Force a north or east 1 (true) arrowhead(depending on orientation) -east synonym of above -southwest Force a south or west 1 (true) arrowhead(depending on orientation) -west synonym of above -double force-doubleheaded arrow 0 (false) -base Draw a vertical base at the 0 (false) non-arrowhead side -scale Reset the labels on the arrow 0 (false) to reflect an externally established scale. -arrowstyle "regular" to create a simple regular arrowhead. "filled" to create a thick filled arrowhead -relative_coords use relative coordinates 0 (false) for scale -relative_coords_offset set the relative offset 1 for scale -label_intervals 0 (false) Put the numeric labels on the intervals between the ticks rather than on the ticks themselves. -units add units to the tick labels none e.g. bp -unit_divider 1 divide tick labels by the indicated amount prior to displaying (use, for example if you want to display in cR units) Set -parallel to 0 (false) to display a point-like feature such as a polymorphism, or to indicate an important location. If the feature start == end, then the glyph will draw a single arrow at the designated location: ^ | Otherwise, there will be two arrows at the start and end: ^ ^ | | Scale: Pass in a externally established scale to reset the labels on the arrow. This is particularly useful for manually constructed images where the founding parameters of the panel are not 1-based. For example, a genetic map interval ranging from 0.1 - 0.3 can be constructed by first multiplying every value by 100. Passing arrow(-scale=>100); will draw tick marks labelled appropriately to your external scale. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/saw_teeth.pm000555001750001750 411512366325116 22466 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::saw_teeth; # DAS-compatible package to use for drawing a line of saw teeth use strict; use base qw(Bio::Graphics::Glyph::repeating_shape); sub draw_repeating_shape { my ($self, $gd, $x1, $y1, $x2, $y2, $fg) = @_; my $midX = ($x2-$x1) / 2 + $x1; $gd->line($x1,$y2,$midX,$y1,$fg); $gd->line($midX,$y1,$x2,$y2,$fg); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::saw_teeth - The "saw teeth" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a line of saw teeth. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -width Width of one tooth 10 -interval Interval between teeth 10 =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Vsevolod (Simon) Ilyushchenko Esimonf@cshl.eduE. Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/wiggle_density.pm000555001750001750 4734312366325116 23552 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::wiggle_density; use strict; use base qw(Bio::Graphics::Glyph::wiggle_data Bio::Graphics::Glyph::box Bio::Graphics::Glyph::smoothing Bio::Graphics::Glyph::xyplot ); sub my_description { return <export_to_wif(). coverage-- a simple comma-delimited string containing the quantitative values, assumed to be one value per pixel. END } sub my_options { { basedir => [ 'string', undef, 'If a relative path is used for "wigfile", then this option provides', 'the base directory on which to resolve the path.' ], z_score_bounds => [ 'integer', 4, 'When using z_score autoscaling, this option controls how many standard deviations', 'above and below the mean to show.' ], autoscale => [ ['local','chromosome','global','z_score','clipped_global'], 'clipped_global', 'If set to "global" , then the minimum and maximum values of the XY plot', 'will be taken from the wiggle file as a whole. If set to "chromosome", then', 'scaling will be to minimum and maximum on the current chromosome.', '"clipped_global" is similar to "global", but clips the top and bottom values', 'to the multiples of standard deviations indicated by "z_score_bounds"', 'If set to "z_score", then the whole plot will be rescaled to z-scores in which', 'the "0" value corresponds to the mean across the genome, and the units correspond', 'to standard deviations above and below the mean. The number of SDs to show are', 'controlled by the "z_score_bound" option.', 'Otherwise, the plot will be', 'scaled to the minimum and maximum values of the region currently on display.', 'min_score and max_score override autoscaling if one or both are defined' ], graph_type => [ undef, undef, 'Unused option', ], }; } sub pad_top { my $self = shift; my $overlap = $self->bump eq 'overlap'; return $overlap ?$self->Bio::Graphics::Glyph::xyplot::pad_top(@_) :$self->SUPER::pad_top(@_); } sub draw { my $self = shift; my ($gd,$dx,$dy) = @_; my $retval = $self->SUPER::draw(@_); if ($retval) { $self->draw_label(@_) if $self->option('label'); $self->draw_description(@_) if $self->option('description'); $self->panel->endGroup($gd); return $retval; } else { # This draws a filled box for null value data #return $self->Bio::Graphics::Glyph::box::draw(@_); } } sub draw_coverage { my $self = shift; my $feature = shift; my $array = shift; if (! $array || ref($array) ne 'ARRAY'){ unshift(@_,$array); my @arr = (eval{$feature->get_tag_values('coverage')}); $array = $arr[0]; } else { $array = [split ',',$array] unless ref $array; } return unless @$array; my ($gd,$left,$top) = @_; my ($start,$end) = $self->effective_bounds($feature); my $length = $end - $start + 1; my $bases_per_bin = ($end-$start)/@$array; my @parts; my $samples = $length < $self->panel->width ? $length : $self->panel->width; my $samples_per_base = $samples/$length; for (my $i=0;$i<$samples;$i++) { my $offset = $i/$samples_per_base; my $v = $array->[$offset/$bases_per_bin]; push @parts,$v; } my ($x1,$y1,$x2,$y2) = $self->bounds($left,$top); $self->draw_segment($gd, $start,$end, \@parts, $start,$end, 1,1, $x1,$y1,$x2,$y2); } sub draw_segment { my $self = shift; my ($gd, $start,$end, $seg_data, $seg_start,$seg_end, $step,$span, $x1,$y1,$x2,$y2) = @_; # clip, because wig files do no clipping $seg_start = $start if $seg_start < $start; $seg_end = $end if $seg_end > $end; # figure out where we're going to start my $scale = $self->scale; # pixels per base pair my $pixels_per_span = $scale * $span + 1; my $pixels_per_step = 1; my $length = $end-$start+1; # if the feature starts before the data starts, then we need to draw # a line indicating missing data (this only happens if something went # wrong upstream) if ($seg_start > $start) { my $terminus = $self->map_pt($seg_start); $start = $seg_start; $x1 = $terminus; } # if the data ends before the feature ends, then we need to draw # a line indicating missing data (this only happens if something went # wrong upstream) if ($seg_end < $end) { my $terminus = $self->map_pt($seg_end); $end = $seg_end; $x2 = $terminus; } return unless $start < $end; # get data values across the area my $samples = $length < $self->panel->width ? $length : $self->panel->width; my $data = ref $seg_data eq 'ARRAY' ? $seg_data : $seg_data->values($start,$end,$samples); # scale the glyph if the data end before the panel does my $data_width = $end - $start; my $data_width_ratio; if ($data_width < $self->panel->length) { $data_width_ratio = $data_width/$self->panel->length; } else { $data_width_ratio = 1; } return unless $data && ref $data && @$data > 0; my $min_value = $self->min_score; my $max_value = $self->max_score; my ($min,$max,$mean,$stdev) = $self->minmax($data); unless (defined $min_value && defined $max_value) { $min_value ||= $min; $max_value ||= $max; } my $rescale = $self->option('autoscale') eq 'z_score'; my ($scaled_min,$scaled_max); if ($rescale) { my $bound = $self->z_score_bound; $scaled_min = -$bound; $scaled_max = +$bound; } else { ($scaled_min,$scaled_max) = ($min_value,$max_value); } my $t = 0; for (@$data) {$t+=$_} # allocate colors # There are two ways to do this. One is a scale from min to max. The other is a # bipartite scale using one color range from zero to min, and another color range # from 0 to max. The latter behavior is triggered when the config file contains # entries for "pos_color" and "neg_color" and the data ranges from < 0 to > 0. my $poscolor = $self->pos_color || $self->fgcolor; my $negcolor = $self->neg_color || $self->bgcolor; my $data_midpoint = $self->midpoint; $data_midpoint = 0 if $rescale; my $bicolor = $poscolor != $negcolor && $scaled_min < $data_midpoint && $scaled_max > $data_midpoint; my ($rgb_pos,$rgb_neg,$rgb); if ($bicolor) { $rgb_pos = [$self->panel->rgb($poscolor)]; $rgb_neg = [$self->panel->rgb($negcolor)]; } else { $rgb = $scaled_max > $scaled_min ? ([$self->panel->rgb($poscolor)] || [$self->panel->rgb($self->bgcolor)]) : ([$self->panel->rgb($negcolor)] || [$self->panel->rgb($self->bgcolor)]); } my %color_cache; @$data = reverse @$data if $self->flip; if (@$data <= $self->panel->width) { # data fits in width, so just draw it $pixels_per_step = $scale * $step; $pixels_per_step = 1 if $pixels_per_step < 1; my $datapoints_per_base = @$data/$length; my $pixels_per_datapoint = $self->panel->width/@$data * $data_width_ratio; my %temps; map{$temps{$_}++} (@$data); my %colorss = (); for (my $i = 0; $i <= @$data ; $i++) { my $x = $x1 + $pixels_per_datapoint * $i; my $data_point = $data->[$i]; defined $data_point || next; $data_point = ($data_point-$mean)/$stdev if $rescale; $data_point = $scaled_min if $scaled_min > $data_point; $data_point = $scaled_max if $scaled_max < $data_point; my ($r,$g,$b) = $bicolor ? $data_point > $data_midpoint ? $self->calculate_color($data_point,$rgb_pos, $data_midpoint,$scaled_max) : $self->calculate_color($data_point,$rgb_neg, $data_midpoint,$scaled_min) : $self->calculate_color($data_point,$rgb, $scaled_min,$scaled_max); my $idx = $color_cache{$r,$g,$b} ||= $self->panel->translate_color($r,$g,$b); $colorss{$idx} = $data_point; $self->filled_box($gd,$x,$y1,$x+$pixels_per_datapoint,$y2,$idx,$idx); } (keys %colorss); # Alleviate a silent crash somewhere in GD that causes density graph get drawn as a solid-colored box } else { # use Sheldon's code to subsample data $pixels_per_step = $scale * $step; my $pixels = 0; # only draw boxes 2 pixels wide, so take the mean value # for n data points that span a 2 pixel interval my $binsize = 2/$pixels_per_step; my $pixelstep = $pixels_per_step; $pixels_per_step *= $binsize; $pixels_per_step *= $data_width_ratio; $pixels_per_span = 2; my $scores = 0; my $defined; for (my $i = $start; $i < $end ; $i += $step) { # draw the box if we have accumulated >= 2 pixel's worth of data. if ($pixels >= 2) { my $data_point = $defined ? $scores/$defined : 0; $scores = 0; $defined = 0; $data_point = $scaled_min if $scaled_min > $data_point; $data_point = $scaled_max if $scaled_max < $data_point; my ($r,$g,$b) = $bicolor ? $data_point > $data_midpoint ? $self->calculate_color($data_point,$rgb_pos, $data_midpoint,$scaled_max) : $self->calculate_color($data_point,$rgb_neg, $data_midpoint,$scaled_min) : $self->calculate_color($data_point,$rgb, $scaled_min,$max_value); my $idx = $color_cache{$r,$g,$b} ||= $self->panel->translate_color($r,$g,$b); $self->filled_box($gd,$x1,$y1,$x1+$pixels_per_span,$y2,$idx,$idx); $x1 += $pixels; $pixels = 0; } my $val = shift @$data; # don't include undef scores in the mean calculation # $scores is the numerator; $defined is the denominator $scores += $val if defined $val; $defined++ if defined $val; # keep incrementing until we exceed 2 pixels # the step is a fraction of a pixel, not an integer $pixels += $pixelstep; } } } sub draw_plot { my $self = shift; my $parts = shift; my ($gd,$dx,$dy) = @_; my $x_scale = $self->scale; my $panel_start = $self->panel->start; my $feature = $self->feature; my $f_start = $feature->start > $panel_start ? $feature->start : $panel_start; my ($left,$top,$right,$bottom) = $self->calculate_boundaries($dx,$dy); # There is a minmax inherited from xyplot as well as wiggle_data, and I don't want to # rely on Perl's multiple inheritance DFS to find the right one. my ($min_score,$max_score,$mean,$stdev) = $self->minmax($parts); my $rescale = $self->option('autoscale') eq 'z_score'; my ($scaled_min,$scaled_max); if ($rescale) { $scaled_min = int(($min_score-$mean)/$stdev + 0.5); $scaled_max = int(($max_score-$mean)/$stdev + 0.5); my $bound = $self->z_score_bound; $scaled_max = $bound if $scaled_max > $bound; $scaled_min = -$bound if $scaled_min < -$bound; } else { ($scaled_min,$scaled_max) = ($min_score,$max_score); } my $pivot = $self->bicolor_pivot; my $positive = $self->pos_color; my $negative = $self->neg_color; my $midpoint = $self->midpoint; my ($rgb_pos,$rgb_neg,$rgb); if ($pivot) { $rgb_pos = [$self->panel->rgb($positive)]; $rgb_neg = [$self->panel->rgb($negative)]; } else { $rgb = $scaled_max > $scaled_min ? ([$self->panel->rgb($positive)] || [$self->panel->rgb($self->bgcolor)]) : ([$self->panel->rgb($negative)] || [$self->panel->rgb($self->bgcolor)]); } my %color_cache; my $flip = $self->{flip}; $self->panel->startGroup($gd); foreach (@$parts) { my ($start,$end,$score) = @$_; next unless defined $score; # undefined (absent) score transparent $score = ($score-$mean)/$stdev if $rescale; $score = $scaled_min if $scaled_min > $score; $score = $scaled_max if $scaled_max < $score; my $x1 = $left + ($start - $f_start) * $x_scale; my $x2 = $left + ($end - $f_start) * $x_scale; if ($flip) { $x1 = $right - ($x1-$left); $x2 = $right - ($x2-$left); ($x1,$x2) = ($x2,$x1); } my ($r,$g,$b) = $pivot ? ($score > $midpoint ? $self->calculate_color($score,$rgb_pos, $midpoint,$scaled_max) : $self->calculate_color($score,$rgb_neg, $midpoint,$scaled_min) ) : $self->calculate_color($score,$rgb, $scaled_min,$scaled_max); my $idx = $color_cache{$r,$g,$b} ||= $self->panel->translate_color($r,$g,$b); $self->filled_box($gd,$x1,$top,$x2,$bottom,$idx,$idx); } return 1; } sub _draw_coverage { my $self = shift; my $feature = shift; my $array = shift; $array = [split ',',$array] unless ref $array; return unless @$array; my ($start,$end) = $self->effective_bounds($feature); my $bases_per_bin = ($end-$start)/@$array; my $pixels_per_base = $self->scale; my @parts; for (my $pixel=0;$pixel<$self->width;$pixel++) { my $offset = $pixel/$pixels_per_base; my $s = $start + $offset; my $e = $s+1; # fill in gaps my $v = $array->[$offset/$bases_per_bin]; #$v = 0 unless defined $v; # don't want undefined values push @parts,[$s,$s,$v]; } $self->Bio::Graphics::Glyph::wiggle_density::draw_plot(\@parts,@_); } sub calculate_color { my $self = shift; my ($s,$rgb,$min_score,$max_score) = @_; $s ||= $min_score; return (255,255,255) unless $max_score - $min_score; # avoid div by zero my $relative_score = ($s-$min_score)/($max_score-$min_score); $relative_score = 0 if $relative_score < 0; $relative_score = 1 if $relative_score > 1; return map { int(255 - (255-$_) * $relative_score) } @$rgb; } sub min { $_[0] < $_[1] ? $_[0] : $_[1] } sub max { $_[0] > $_[1] ? $_[0] : $_[1] } sub record_label_positions { my $self = shift; my $rlp = $self->option('record_label_positions'); return $rlp if defined $rlp; return 1; } sub draw_label { shift->Bio::Graphics::Glyph::xyplot::draw_label(@_); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::wiggle_density - A density plot compatible with dense "wig"data =head1 SYNOPSIS See and . =head1 DESCRIPTION This glyph works like the regular density but takes value data in Bio::Graphics::Wiggle file format: reference = chr1 ChipCHIP Feature1 1..10000 wigfile=./test.wig;wigstart=0 ChipCHIP Feature2 10001..20000 wigfile=./test.wig;wigstart=656 ChipCHIP Feature3 25001..35000 wigfile=./test.wig;wigstart=1312 The "wigfile" attribute gives a relative or absolute pathname to a Bio::Graphics::Wiggle format file. The optional "wigstart" option gives the offset to the start of the data. If not specified, a linear search will be used to find the data. The data consist of a packed binary representation of the values in the feature, using a constant step such as present in tiling array data. =head2 OPTIONS The same as the regular graded_segments glyph, except that the following options are recognized: Name Value Description ---- ----- ----------- basedir path Path to be used to resolve "wigfile" and "densefile" tags giving relative paths. Default is to use the current working directory. Absolute wigfile & densefile paths will not be changed. autoscale "local" or "global" If one or more of min_score and max_score options are absent, then these values will be calculated automatically. The "autoscale" option controls how the calculation is done. The "local" value will scale values according to the minimum and maximum values present in the window being graphed. "global" will use chromosome-wide statistics for the entire wiggle or dense file to find min and max values. smoothing method name Smoothing method: one of "mean", "max", "min" or "none" smoothing_window integer Number of values across which data should be smoothed. bicolor_pivot name Where to pivot the two colors when drawing bicolor plots. Options are "mean" and "zero". A numeric value can also be provided. pos_color color When drawing bicolor plots, the fill color to use for values that are above the pivot point. neg_color color When drawing bicolor plots, the fill color to use for values that are below the pivot point. =head2 SPECIAL FEATURE TAGS The glyph expects one or more of the following tags (attributes) in feature it renders: Name Value Description ---- ----- ----------- wigfile path name Path to the Bio::Graphics::Wiggle file for vales. (required) densefile path name Path to a Bio::Graphics::DenseFeature object (deprecated) denseoffset integer Integer offset to where the data begins in the Bio::Graphics::DenseFeature file (deprecated) densesize integer Integer size of the data in the Bio::Graphics::DenseFeature file (deprecated) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Esteinl@cshl.eduE. Copyright (c) 2007 Cold Spring Harbor Laboratory This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/wiggle_whiskers.pm000555001750001750 2205612366325116 23724 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::wiggle_whiskers; use strict; use base qw(Bio::Graphics::Glyph::wiggle_data Bio::Graphics::Glyph::wiggle_xyplot ); sub my_description { return < [ 'color', 'black', 'The color drawn from the zero value to the mean value.' ], mean_color_neg => [ 'color', 'same as mean_color', 'The color drawn from the zero value to the mean value, for negative values.' ], stdev_color => [ 'color', 'grey', 'The color drawn from the mean value to +stdev.' ], stdev_color_neg => [ 'color', 'same as stdev_color', 'The color drawn from the mean value to -stdev.' ], max_color => [ 'color', 'lightgrey', 'The color drawn from +stdev to max.' ], min_color => [ 'color', 'same as max_color', 'The color drawn from -stdev to min.' ], graph_type => [ ['histogram','whiskers'], 'histogram', 'Type of graph to generate. Options are "histogram" (for a barchart),', 'or "whiskers" (for a whiskerplot showing mean, +/- stdev and max/min.', 'The deprecated "boxes" subtype is a synonym for "histogram."' ], } } sub color_series { my $self = shift; return $self->{color_series} if exists $self->{color_series}; return $self->{color_series} = $self->option('color_series'); } sub overlaps { my $self = shift; return $self->{overlaps} if exists $self->{overlaps}; return $self->{overlaps} = $self->bump eq 'overlap'; } sub pad_top { my $self = shift; return $self->Bio::Graphics::Glyph::wiggle_xyplot::pad_top; } sub extra_label_pad { return 8 } sub graph_type { shift->glyph_subtype; } sub glyph_subtype { my $self = shift; return $self->option('glyph_subtype') || $self->option('graph_type') || 'histogram'; } sub mean_color { my $self = shift; return $self->bgcolor if $self->color_series; return $self->color('mean_color') || $self->translate_color('black'); } sub mean_color_neg { my $self = shift; return $self->bgcolor if $self->color_series; return $self->color('mean_color_neg') || $self->mean_color; } sub stdev_color { my $self = shift; return $self->bgcolor if $self->color_series; return $self->color('stdev_color') || $self->translate_color('grey'); } sub stdev_color_neg { my $self = shift; return $self->bgcolor if $self->color_series; return $self->color('stdev_color_neg') || $self->stdev_color; } sub max_color { my $self = shift; return $self->bgcolor if $self->color_series; return $self->color('max_color') || $self->translate_color('lightgrey'); } sub min_color { my $self = shift; return $self->bgcolor if $self->color_series; return $self->color('min_color') || $self->max_color; } sub draw { my $self = shift; my ($gd,$dx,$dy) = @_; my ($left,$top,$right,$bottom) = $self->calculate_boundaries($dx,$dy); $self->panel->startGroup($gd); my $feature = $self->feature; my $stats = eval {$feature->statistical_summary($self->width)}; if ($@ =~ /can\'t locate object method/i) { warn "This glyph only works properly with features that have a statistical_summary() method, but you passed a ",ref($feature)," object"; return; } $stats ||= []; my ($min_score,$max_score,$mean,$stdev) = $self->minmax($stats); my $rescale = $self->option('autoscale') eq 'z_score'; my $side = $self->_determine_side(); # if a scale is called for, then we adjust the max and min to be even # multiples of a power of 10. my ($scaled_min,$scaled_max); if ($rescale) { my $bound = $self->z_score_bound; $scaled_min = int(($min_score-$mean)/$stdev + 0.5); $scaled_max = int(($max_score-$mean)/$stdev + 0.5); $scaled_max = $bound if $scaled_max > $bound; $scaled_min = -$bound if $scaled_min < -$bound; $self->{_stdev} = $stdev; $self->{_mean} = $mean; $self->{_zfold} = $bound; } elsif ($side) { $scaled_min = Bio::Graphics::Glyph::xyplot::max10($min_score); $scaled_max = Bio::Graphics::Glyph::xyplot::min10($max_score); } my $height = $bottom - $top; my $scale = $scaled_max > $scaled_min ? $height/($scaled_max-$scaled_min) : 1; my $x = $left; my $y = $top + $self->pad_top; # position of "0" on the scale my $y_origin = $scaled_min <= 0 ? $bottom - (0 - $scaled_min) * $scale : $bottom; $y_origin = $top if $scaled_max < 0; my $clip_ok = $self->option('clip'); $self->{_clip_ok} = $clip_ok; $self->{_scale} = $scale; $self->{_min_score} = $scaled_min; $self->{_max_score} = $scaled_max; $self->{_top} = $top; $self->{_bottom} = $bottom; $self->panel->startGroup($gd); $self->_draw_grid($gd,$scale,$scaled_min,$scaled_max,$dx,$dy,$y_origin); $self->panel->endGroup($gd); $self->panel->startGroup($gd); $self->_draw_whiskers($gd,$dx,$dy,$y_origin,$stats); $self->panel->endGroup($gd); $self->panel->startGroup($gd); $self->_draw_scale($gd,$scale,$scaled_min,$scaled_max,$dx,$dy,$y_origin); $self->panel->endGroup($gd); $self->draw_label(@_) if $self->option('label') or $self->record_label_positions; $self->draw_description(@_) if $self->option('description'); $self->panel->endGroup($gd); # inhibit the scale if we are non-bumping $self->configure(-scale => 'none') if $self->overlaps; } sub _draw_whiskers { my $self = shift; my ($gd,$dx,$dy,$origin,$stats) = @_; my $scale = $self->{_scale}; my $mean_color = $self->mean_color; my $mean_color_neg = $self->mean_color_neg; my $stdev_color = $self->stdev_color; my $stdev_color_neg = $self->stdev_color_neg; my $max_color = $self->max_color; my $min_color = $self->min_color; my $clip_color = $self->clip_color; my $graph_type = $self->graph_type; my ($left,$top,$right,$bottom) = $self->calculate_boundaries($dx,$dy); my $pos = $self->{flip} ? $right : $left; for my $bin (@$stats) { next unless $bin->{validCount}; my $mean = $bin->{sumData}/$bin->{validCount}; my $stdev = $self->calcStdFromSums($bin->{sumData}, $bin->{sumSquares}, $bin->{validCount}); my $max = $bin->{maxVal}; my $min = $bin->{minVal}; if (my $fold = $self->{_zfold}) { $mean = ($mean - $self->{_mean}) / $self->{_stdev}; $max = ($max - $self->{_mean}) / $self->{_stdev}; $min = ($min - $self->{_mean}) / $self->{_stdev}; $stdev /= $self->{_stdev}; } my $mean_pos = $self->score2position($mean); my $plus_one = $self->score2position($mean+$stdev); my $minus_one = $self->score2position($mean-$stdev); my $max_pos = $self->score2position($max); my $min_pos = $self->score2position($min); my ($clip_top,$clip_bottom); foreach (\$mean_pos,\$plus_one,\$minus_one,\$max_pos,\$min_pos) { if (int($$_) < $top - 2) { $$_ = $top; $clip_top++; } elsif (int($$_) > $bottom + 2) { $$_ = $bottom; $clip_bottom++; } } if ($graph_type =~ /histogram|boxes/) { if ($mean >= 0) { $gd->line($pos,$origin,$pos,$mean_pos, $mean_color); $gd->line($pos,$mean_pos,$pos,$plus_one,$stdev_color) if $mean_pos != $plus_one; $gd->line($pos,$plus_one,$pos,$max_pos, $max_color) if $plus_one != $max_pos; } else { $gd->line($pos,$origin,$pos,$mean_pos, $mean_color_neg); $gd->line($pos,$mean_pos,$pos,$minus_one,$stdev_color_neg) if $mean_pos != $minus_one; $gd->line($pos,$minus_one,$pos,$min_pos, $min_color) if $minus_one != $min_pos; } } else { $gd->setPixel($pos,$mean_pos,$mean_color); $gd->line($pos,$mean_pos-1,$pos,$plus_one,$stdev_color) if $plus_one != $mean_pos; $gd->line($pos,$plus_one-1,$pos,$max_pos,$max_color) if $max_pos != $mean_pos; $gd->line($pos,$mean_pos+1,$pos,$minus_one,$stdev_color) if $minus_one != $mean_pos; $gd->line($pos,$minus_one+1,$pos,$min_pos,$min_color) if $min_pos != $mean_pos; } # this tops off clipped peaks with a distinct color, but I just don't like how it looks $gd->line($pos,$top-2, $pos,$top, $clip_color) if $clip_top; $gd->line($pos,$bottom,$pos,$bottom+2, $clip_color) if $clip_bottom; } continue { $self->{flip} ? $pos-- : $pos++; } } sub calcStdFromSums { my $self = shift; my ($sum,$sumSquares,$n) = @_; my $var = $sumSquares - $sum*$sum/$n; if ($n > 1) { $var /= $n-1; } return 0 if $var < 0; return sqrt($var); } 1; Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/heat_map_ideogram.pm000555001750001750 1305112366325116 24147 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::heat_map_ideogram; # Glyph to draw chromosome heat_map ideograms use strict qw/vars refs/; use GD; use base qw(Bio::Graphics::Glyph::ideogram Bio::Graphics::Glyph::heat_map); sub my_description { return < for a full explanation of standard options. See L for an explanation of heat_map options. See L for an explanation of ideogram options. END } sub draw { my $self = shift; my @parts = $self->parts; @parts = $self if !@parts && $self->level == 0; return $self->SUPER::draw(@_) unless @parts; $self->{single}++ if @parts == 1; $self->calculate_gradient(\@parts); # adjust for label and description my ($gd,$x,$y) = @_; $x += $self->left + $self->pad_left; $y += $self->top + $self->pad_top; # Draw centromeres and telomeres last my @last; for my $part (@parts) { push @last, $part and next if $part->feature->method eq 'centromere' || $part->feature->start <= 1 || $part->feature->stop >= $self->panel->end - 1000; $self->draw_component($part,$gd,$x,$y); } for my $part (@last) { my $tile = $self->create_tile('right') if $part->feature->method eq 'centromere'; $self->draw_component($part,$gd,$x,$y); } $self->draw_label(@_) if $self->option('label'); $self->draw_description(@_) if $self->option('description'); } sub draw_component { my $self = shift; my $glyph = shift; my $gd = shift; my ( $x1, $y1, $x2, $y2 ) = $glyph->bounds(@_); # force odd width so telomere arcs are centered $y2 ++ if ($y2 - $y1) % 2; my $arcradius = $self->option('arcradius') || 7; my $feature = $glyph->feature; my $score = $feature->score; my $is_cent = 1 if $feature->method eq 'centromere'; my $fgcolor = $self->fgcolor; my $bgcolor; # skip normal cytobands return if $feature->attributes('stain') && !$is_cent; # Set the bgcolor unless ($is_cent || defined $score || defined $self->score_range ) { my @rgb = @{$self->low_rgb}; $bgcolor = $self->color_index(@rgb); } else { my @rgb = $self->calculate_color($score); $bgcolor = $self->color_index(@rgb); } # bgcolorindex must return true $bgcolor ||= $self->adjust_bgcolor; # Is this a centromere? if ( $is_cent ) { $fgcolor = $self->color_index(0,0,0); if ( $self->panel->image_class =~ /SVG/ ) { $bgcolor = $gd->colorResolve( 102, 102, 153 ); $self->draw_centromere( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor ); } else { $self->draw_centromere( $gd, $x1, $y1, $x2, $y2, gdTiled, $fgcolor ); } } # a telomere? elsif ( $feature->start <= 1 ) { # left (top) my $status = 1 unless $self->panel->flip; # if this is a full-length chromosome? $status = -1 if $feature->stop >= $self->panel->end - 1000; $self->draw_telomere( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor, $arcradius, $status ); } elsif ( $feature->stop >= $self->panel->end - 1000 ) { # right (bottom) my $status = 1 if $self->panel->flip; $self->draw_telomere( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor, $arcradius, $status ); } # or a regular band? else { $self->draw_cytoband( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor ); } } # Nudge the color over just a bit if the color index # is 0 (panel bgcolor). This overcomes default bgcolor # and fgcolor when the index does not return true sub adjust_bgcolor { my $self = shift; my $gd = $self->panel->gd; my @rgb = $self->panel->rgb($self->panel->bgcolor); for (@rgb) { $_++ if $_ < 255; $_-- if $_ == 255; } return $gd->colorResolve(@rgb); } sub fgcolor { my $self = shift; my $clr = $self->option('fgcolor') || $self->option('outline') || 'black'; return $self->panel->translate_color($clr); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::heat_map_ideogram - The "heat_map_ideogram" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a chromosome ideogram using scored features instead of cytobands. It is a hybrid of the heat_map and ideograms glyphs and accepts options for both. A typical usage would be to pair this glyph with an aggregator that groups scored features such as blast hits or gene_density bins, etc with a centromere. The result is a chromosome ideogram that has bands whose colors vary porportionate to the feature score. =head2 OPTIONS See L for a full explanation of standard options. See L for an explanation of heat_map options. See L for an explanation of ideogram options. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L =head1 AUTHOR Sheldon McKay Emckays@cshl.eduE Copyright (c) 2006 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/flag.pm000555001750001750 610412366325116 21414 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::flag; # Non object-oriented utilities used here-and-there in Bio::Graphics modules sub my_description { return < [ 'string', 'ori', 'Text to draw next to the flag.'], width => [ 'integer', 20, 'Width of the flag.'], } } =head1 NAME Bio::Graphics::Glyph::flag - the "flag" glyph =cut use strict; use base qw(Bio::Graphics::Glyph::generic); sub default_text { return "ori"; } sub default_width { return 20; } sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $fg = $self->fgcolor; my $bg = $self->bgcolor; my $width = $self->option('width') || $self->default_width; my $text = $self->option('text') || $self->default_text; my $oneThirdY = $y1 + ($y2-$y1) / 3; my $twoThirdsY = $y1 + 2 * ($y2-$y1) / 3; my $poly_pkg = $self->polygon_package; my $polygon = $poly_pkg->new(); $polygon->addPt($x1, $y1); $polygon->addPt($x1+$width, $oneThirdY); $polygon->addPt($x1, $twoThirdsY); $gd->polygon($polygon, $fg); $gd->fillToBorder($x1+$width/2, $oneThirdY, $fg, $bg); $gd->line($x1, $y1, $x1, $y2, $fg); my $font = $self->option('labelfont') || $self->font; $gd->string($font, $x1 + 3, $twoThirdsY-3, $text, $self->fontcolor); } 1; __END__ =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a flag with a text next to it. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -text Text to draw next to the flag ori -width Width of the flag 20 =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Vsevolod (Simon) Ilyushchenko Esimonf@cshl.eduE. Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/allele_tower.pm000555001750001750 1540012366325116 23200 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::allele_tower; # Glyph for drawing each allele found at a SNP position in a column. use strict; use vars '@ISA'; @ISA = 'Bio::Graphics::Glyph::generic'; use Bio::Graphics::Glyph::generic; # Give enough height to fit in the alleles sub height { my $self = shift; my @alleles = eval{$self->feature->get_tag_values('Alleles')}; @alleles = split /\//,$self->option('alleles') unless @alleles >= 2; my $size = 2 + 10 * ($#alleles +1); return $size; } # Need to make room for the allele bars if there is room sub pad_right { my $self = shift; my $right = $self->SUPER::pad_right; return $right > 55 ? $right : 55 if $self->label; my $width = GD::Font->Small->width * 2.5; return $width > $right ? $width : $right; } sub draw_component { my $self = shift; my $gd = shift; my $fg = $self->fgcolor; # find the center and vertices my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $feature = $self->feature; my @alleles = eval{$feature->get_tag_values('Alleles')}; @alleles = split /\//,$self->option('alleles') unless @alleles == 2; if (@alleles) { # If it is on the minus strand if (my $strand = $self->option('ref_strand') <0){ foreach (@alleles) { tr/ACTG/TGAC/ if $self->option('complement'); } $fg = $self->bgcolor if $self->bgcolor; } for (my $i=0;$i<@alleles;$i++) { my $position = -2+ $i * 10; # Space out each allele # for the allele frequency horizontal bars (maf lines) # x1, x2 are the same, y2 is bigger than y1 my $maf = defined ($self->option('maf'))? $self->option('maf') : "NO"; # If the MAF freq = 0, the major allele will be length 44 + 6 my $bar_length = $maf*44 +6 unless $maf eq "NO"; my $y_delta = ($y2- $y1)/(2 * ($#alleles +1)); # correct for height if (my $minor_allele = $self->option('minor_allele')){ if ($alleles[$i] eq $minor_allele) { # Print the letter $gd->string(GD::Font->Small,$x1-1, $position + $y1, $alleles[$i], $fg); } else { # If this is the major allele, the bar length must be 44 +6 - maf length $bar_length = 44-($maf*44) +6 unless $maf eq "NO"; # Print the letter $gd->string(GD::Font->MediumBold,$x1-1, $position + $y1, $alleles[$i], $fg); } # Print the line for the allele freq. bar if ($self->label){ $gd->line($x1+6, $y1 + (2*$i +1)*$y_delta, $x1+$bar_length, $y1 + (2*$i +1)*$y_delta, $fg) unless $maf eq "NO"; } } # if no minor allele is defined, use the small fonts for both else { $gd->string(GD::Font->Small,$x1-1, $position + $y1, $alleles[$i], $fg); } } # end of for } } ; __END__ =head1 NAME Bio::Graphics::Glyph::allele_tower - The "allele_tower" glyph =head1 SYNOPSIS See and . =head1 DESCRIPTION This glyph draws a letter for each allele found at a SNP position, one above the other (i.e. in a column). For example: A G See also http://www.hapmap.org/cgi-perl/gbrowse/gbrowse 'genotyped SNPs' for an example. The common options are available (except height which is calculated based on the number of alleles). In addition, if you give the glyph the minor allele frequency (MAF) and indicate which is the minor allele, the glyph will display these differences. =head2 GETTING THE ALLELES To specify the alleles, create an "Alleles" attribute for the feature. There should be two such attributes. For example, for a T/G polymorphism, the GFF load file should look like: Chr3 . SNP 12345 12345 . . . SNP ABC123; Alleles T ; Alleles G Alternatively, you can pass an "alleles" callback to the appropriate section of the config file. This option should return the two alleles separated by a slash: alleles = sub { my $snp = shift; my @d = $snp->get_tag_values('AllelePair'); return join "/",@d; } =head2 OPTIONS . Glyph Colour . Different colour for alleles on the reverse strand . Print out the complement for alleles on the reverse strand . Major allele shown in bold . Horizontal histogram to show allele frequency =head3 GLYPH COLOR The glyph color can be configured to be different if the feature is on the plus or minus strand. Use fgcolor to define the glyph color for the plus strand and bgcolor for the minus strand. For example: fgcolor = blue bgcolor = red For this option to work, you must also set ref_strand to return the strand of the feature: ref_strand = sub {shift->strand} =head3 REVERSE STRAND ALLELES If the alleles on the negative strand need to be the complement of what is listed in the GFF files, (e.g. A/G becomes T/C), set the complement option to have value 1 complement = 1 For this option to work, you must also set ref_strand to return the strand of the feature: ref_strand = sub {shift->strand} =head3 MAJOR/MINOR ALLELE Use the 'minor_allele' option to return the minor allele for the SNP. If you use this option, the major allele will appear in bold type. =head3 ALLELE FREQUENCY HISTOGRAMS Use the 'maf' option to return the minor allele frequency for the SNP. If you use this option, a horizontal histogram will be drawn next to the alleles, to indicate their relative frequencies. e.g. A______ C__ Note: The 'label' option must be set to 1 (i.e. on) and the 'minor_allele' option must return a valid allele for this to work. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Fiona Cunningham Ecunningh@cshl.eduE in Lincoln Stein's lab Esteinl@cshl.eduE. Copyright (c) 2003 Cold Spring Harbor Laboratory This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/repeating_shape.pm000555001750001750 710412366325116 23642 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::repeating_shape; # DAS-compatible package to use for drawing a line of repeating shapes use strict; use base qw(Bio::Graphics::Glyph::generic); sub default_width { return 10; } sub default_interval { return 10; } sub connector { 'none' } sub draw_component { my $self = shift; my $gd = shift; my $fg = $self->fgcolor; my $width = defined $self->option('width') ? $self->option('width') : $self->default_width; my $interval = defined $self->option('interval') ? $self->option('interval') : $self->default_interval; # find the center and vertices my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $bWidth = $x2-$x1; if ($bWidth < $width) { $self->draw_repeating_shape($gd,$x1,$y1,$x2,$y2,$fg); return; } if ($bWidth < $width+2*$interval) { my $leftoverInterval = $bWidth - $width; my $halfInt = $leftoverInterval/2; $halfInt = 0 unless $interval; $gd->line($x1,$y2,$x1+$halfInt,$y2,$fg); $self->draw_repeating_shape($gd,$x1+$halfInt,$y1,$x2-$halfInt,$y2,$fg); $gd->line($x2-$halfInt,$y2,$x2,$y2,$fg); return; } my $count = int ($bWidth / ($width+$interval)); my $leftoverInterval = $bWidth % ($width+$interval)+$interval; my $halfInt = $leftoverInterval/2; $halfInt = 0 unless $interval; $gd->line($x1,$y2,$x1+$halfInt,$y2,$fg); foreach (my $i=1; $i<=$count; $i++) { my $shapeStart = $x1 + $halfInt + ($i-1)*($width+$interval); $self->draw_repeating_shape($gd,$shapeStart,$y1,$shapeStart+$width,$y2,$fg); if ($i < $count) { $gd->line($shapeStart+$width,$y2,$shapeStart+$width+$interval,$y2,$fg); } } $gd->line($x2-$halfInt,$y2,$x2,$y2,$fg); } sub draw_repeating_shape { warn "Subclasses must implement 'draw_repeating_shape'!\n"; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::repeating_shape - A glyph that draws the same shape repeatedly. =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is a generic superclass for drawing the same shape repeatedly. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -width Width of one tooth 10 -interval Interval between teeth 10 =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Vsevolod (Simon) Ilyushchenko Esimonf@cshl.eduE. Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/heterogeneous_segments.pm000555001750001750 1253312366325116 25307 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::heterogeneous_segments; # this glyph acts like graded_segments but the bgcolor of each segment is # controlled by the source field of the feature. Use the source field name # to set the background color: # -waba_strong_color => 'blue' # -waba_weak_color => 'red' # -waba_coding_color => 'green' use strict; use base qw(Bio::Graphics::Glyph::graded_segments); sub my_description { return < \$color For example, if the feature consists of a gene containing both confirmed and unconfirmed exons, you can make the confirmed exons green and the unconfirmed ones red this way: -confirmed_color => 'green', -unconfirmed_color => 'red' END } # override draw method to calculate the min and max values for the components sub draw { my $self = shift; # bail out if this isn't the right kind of feature # handle both das-style and Bio::SeqFeatureI style, # which use different names for subparts. my @parts = $self->parts; @parts = $self if !@parts && $self->level == 0; return $self->SUPER::draw(@_) unless @parts; @parts = $self->merge_parts(@parts) if $self->option('merge_parts'); # figure out the colors $self->{source2color} ||= {}; my $fill = $self->bgcolor; for my $part (@parts) { my $s = eval { $part->feature->source_tag } or next; $self->{source2color}{$s} ||= $self->color(lc($s)."_color") || $fill; $part->{partcolor} = $self->{source2color}{$s}; } $self->Bio::Graphics::Glyph::segments::draw(@_); } # synthesize a key glyph sub keyglyph { my $self = shift; my $scale = 1/$self->scale; # base pairs/pixel # two segments, at pixels 0->50, 60->80 my $offset = $self->panel->offset; my $feature = Bio::Graphics::Feature->new( -segments=>[ [ 0*$scale +$offset,25*$scale+$offset], [ 25*$scale +$offset,50*$scale+$offset], [ 50*$scale+$offset, 75*$scale+$offset] ], -name => $self->option('key'), -strand => '+1'); my @sources = grep {/_color$/} $self->factory->options; foreach (@sources) {s/_color$//} ($feature->segments)[0]->source_tag($sources[1]); ($feature->segments)[1]->source_tag($sources[0]); ($feature->segments)[2]->source_tag($sources[2]); my $factory = $self->factory->clone; $factory->set_option(label => 1); $factory->set_option(bump => 0); $factory->set_option(connector => 'solid'); my $glyph = $factory->make_glyph(0,$feature); return $glyph; } 1; =head1 NAME Bio::Graphics::Glyph::heterogeneous_segments - The "heterogeneous_segments" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph acts like graded_segments but the bgcolor of each segment (sub-feature) can be individually set using the source field of the feature. Each segment type color is specified using the following nomenclature: -{source}_color => $color For example, if the feature consists of a gene containing both confirmed and unconfirmed exons, you can make the confirmed exons green and the unconfirmed ones red this way: -confirmed_color => 'green', -unconfirmed_color => 'red' =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/lightning.pm000555001750001750 1164212366325116 22511 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::lightning; # A lightning bolt glyph to add some pizazz to your displays. Yeow! use strict; use base qw(Bio::Graphics::Glyph::generic); sub my_description { return < [ [qw(N S)], 'N', 'Control the direction of the lightning bolt. One of', 'orth, or outh'], } } sub draw_component { my $self = shift; my $gd = shift; my $fg = $self->fgcolor; # find the center and vertices my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $h = $self->option('height'); my $w = $h*0.6; my $poly_pkg = $self->polygon_package; my $polygon = $poly_pkg->new(); # lightning bolt points up or down if ($self->option('orient') eq 'N') { $y1 = $y1 + $h/4; $polygon->addPt($x2,$y1+($h/2)); $polygon->addPt($x2-($w*0.7),$y1+($h/2)); $polygon->addPt($x2-($w*0.2),$y1+($h*0.15)); $polygon->addPt($x2-($w*0.6),$y1+($h*0.15)); $polygon->addPt($x2,$y1-$h/2); $polygon->addPt($x2-($w*0.1),$y1-($h*0.05)); $polygon->addPt($x2+($w*0.5),$y1-($h*0.05)); $polygon->addPt($x2,$y1+($h/2)); } else { $y1 = $y1 + $h/2; $polygon->addPt($x1,$y1-($h/2)); $polygon->addPt($x1+($w*0.7),$y1-($h/2)); $polygon->addPt($x1+($w*0.2),$y1-($h*0.15)); $polygon->addPt($x1+($w*0.6),$y1-($h*0.15)); $polygon->addPt($x1,$y1+$h/2); $polygon->addPt($x1+($w*0.1),$y1+($h*0.05)); $polygon->addPt($x1-($w*0.5),$y1+($h*0.05)); $polygon->addPt($x1,$y1-($h/2)); } # Have to draw TWO polygons for fills in order to get an outline # because filledPolygon in GD croaks with extra parameters (and # doesn't support drawing of stroke anyways). if (my $c = $self->bgcolor) { $gd->filledPolygon($polygon,$c); $gd->polygon($polygon,$fg); } else { $gd->polygon($polygon,$fg); } } 1; __END__ =head1 NAME Bio::Graphics::Glyph::lightning - The "lightning" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a lightning bolt of specified height with relative width, with the point of the lightning bolt centered on the feature. The height of the bolt is specified by the "height" option. Due to the complexity of this glyph, it doesn't resolve well with heights less than 11 pixels. This glyph was designed to indicate point mutations on a nucleotide or protein backbone. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) The following options are specific to this Glyph. Option Description Default ------ ----------- ------- -orient direction of lightning bolt N =head1 BUGS No reported bugs. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Todd Harris Eharris@cshl.orgE Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/transcript2.pm000555001750001750 1437412366325116 23006 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::transcript2; use strict; use base qw(Bio::Graphics::Glyph::transcript); use constant MIN_WIDTH_FOR_ARROW => 8; sub show_strand { my $self = shift; my $s = $self->SUPER::show_strand; return $s if defined $s; return 'ends'; } sub extra_arrow_length { my $self = shift; my $strand = $self->feature->strand || 0; $strand *= -1 if $self->{flip}; my $first = $strand < 0 ? ($self->parts)[0] : ($self->parts)[-1]; $first ||= $self; my @rect = $first->bounds(); my $width = abs($rect[2] - $rect[0]); return 0 if $width >= MIN_WIDTH_FOR_ARROW; return $self->arrow_length; } sub pad_left { my $self = shift; my $pad = $self->Bio::Graphics::Glyph::generic::pad_left; return $pad if $self->feature->strand > 0; my $extra_arrow_length = $self->extra_arrow_length; if ($self->label_position eq 'left' && $self->label) { return $extra_arrow_length+$pad; } else { return $extra_arrow_length > $pad ? $extra_arrow_length : $pad; } } sub pad_right { my $self = shift; my $pad = $self->Bio::Graphics::Glyph::generic::pad_right; return $pad if $self->feature->strand < 0; my $extra_arrow_length = $self->extra_arrow_length; return $extra_arrow_length > $pad ? $extra_arrow_length : $pad; } sub draw_connectors { my $self = shift; my ($gd,$dx,$dy) = @_; my $part; my $strand = $self->feature->strand; $strand *= -1 if $self->{flip}; #sigh if (my @parts = $self->parts) { $part = $strand >= 0 ? $parts[-1] : $parts[0]; } elsif ($self->feature_has_subparts) { # no parts -- so draw an intron spanning whole thing my($x1,$y1,$x2,$y2) = $self->bounds(0,0); $self->_connector($gd,$dx,$dy,$x1,$y1,$x1,$y2,$x2,$y1,$x2,$y2); $part = $self; } else { return; } my @rect = $part->bounds(); my $width = abs($rect[2] - $rect[0]); my $filled = $width >= MIN_WIDTH_FOR_ARROW; if ($filled) { $self->Bio::Graphics::Glyph::generic::draw_connectors(@_); } else { $self->SUPER::draw_connectors(@_); } } sub draw_component { my $self = shift; return unless $self->level > 0; my $gd = shift; my ($left,$top) = @_; my @rect = $self->bounds(@_); my $f = $self->feature; my $strand = $f->strand; my $str = $strand * ($self->{flip} ? -1 : 1); my $width = abs($rect[2] - $rect[0]); my $filled = defined($self->{partno}) && $width >= MIN_WIDTH_FOR_ARROW; my ($pwidth) = $gd->getBounds; $filled = 0 if $str < 0 && $rect[0] < $self->panel->pad_left; $filled = 0 if $str > 0 && $rect[2] > $pwidth - $self->panel->pad_right; if ($self->stranded && $filled) { my ($first,$last) = ($self->{partno} == 0 , $self->{partno} == $self->{total_parts}-1); ($first,$last) = ($last,$first) if $self->{flip}; if ($strand < 0 && $first) { # first exon, minus strand transcript $self->filled_arrow($gd,-1,@rect); } elsif ($strand >= 0 && $last) { # last exon, plus strand $self->filled_arrow($gd,+1,@rect); } else { $self->filled_box($gd,@rect); } } else { $self->filled_box($gd,@rect); } # copied from generic::draw_component $self->draw_translation($gd,@_) if $self->{cds_translation}; # created earlier by calculate_cds() $self->draw_sequence($gd,@_) if $self->option('draw_dna') && $self->dna_fits; } sub bump { my $self = shift; return $self->SUPER::bump(@_) if $self->all_callbacks; return 0; # never allow our components to bump } 1; __END__ =head1 NAME Bio::Graphics::Glyph::transcript2 - The "transcript2" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used for drawing transcripts. It is like "transcript" except that if there is sufficient room the terminal exon is shaped like an arrow in order to indicate the direction of transcription. If there isn't enough room, a small arrow is drawn. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -strand_arrow Whether to indicate 0 (false) strandedness -hilite Highlight color undef (no color) In addition, the alignment glyph recognizes the following glyph-specific options: Option Description Default ------ ----------- ------- -arrow_length Length of the directional 8 arrow. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/operon.pm000555001750001750 434712366325116 22014 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::operon; use strict; use base 'Bio::Graphics::Glyph::segments'; #use Data::Dumper; sub draw_component { my $self = shift; my ($gd,$dx,$dy) = @_; my ($left,$top,$right,$bottom) = $self->bounds($dx,$dy); my $feature = $self->feature; $feature->type =~ /^([\S_]+):/; if ($1 eq 'TSS') { # draw the promoter as an arrow if ($feature->strand == 1){ $self->vline($gd, $left, $top-5, ($top+$bottom)/2); $self->arrow($gd,$left,$left+5,$top-5); } if ($feature->strand == -1){ $self->vline($gd, $right, $top-5, ($top+$bottom)/2); $self->arrow($gd,$right,$right-5,$top-5); } return; } if ($1 eq 'terminator') { # draw the terminator as an lollipop if ($feature->strand >= 0){ $self->vline($gd, $right, $top-5, ($top+$bottom)/2); $gd->filledEllipse($right,$top-4,6,6,$self->translate_color('red')); } if ($feature->strand < 0){ $self->vline($gd, $left, $top-5, ($top+$bottom)/2); $gd->filledEllipse($left,$top-4,6,6,$self->translate_color('red')); } return; } $self->SUPER::draw_component(@_); } sub pad_top{ return 10; } sub pad_right{ return 10; } sub pad_left{ return 10; } sub default_width{ return 20; } sub vline { my $self = shift; my $image = shift; my ($x,$y1,$y2) = @_; my $fg = $self->set_pen; $image->line($x,$y1,$x,$y2,$fg); } 1; =head1 NAME Bio::Graphics::Glyph::operon - The "polycistronic operon" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used for drawing polycistronic operons. It is essentially a "segments" glyph in which subfeatures of specific types "TSS" and "terminator" are displayed as line+arrow and a red lollipop, respectively. Note that these are hardcoded SO types =head2 OPTIONS accepts standard options so far. This version does not yet allow user configuration of things like terminator color, promoter arrow size etc. =head1 BUGS Please report them. =head1 SEE ALSO =head1 AUTHOR Jim Hu Ejimhu@tamu.eduE Copyright (c) 2011 Texas A&M Univ. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/weighted_arrow.pm000555001750001750 760512366325116 23524 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::weighted_arrow; use strict; use base qw(Bio::Graphics::Glyph::generic); use Math::Trig; sub default_weight_size { return 8; } sub default_length { return 20; } sub default_left_alignment { return 1; } sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $fg = $self->fgcolor; my $bg = $self->bgcolor; my $weight_size = defined $self->option('weight_size') ? $self->option('weight_size') : $self->default_weight_size(); my $length = defined $self->option('length') ? $self->option('length') : $self->default_length(); my $left_alignment = defined $self->option('left_alignment') ? $self->option('left_alignment') : $self->default_left_alignment(); my ($w_x1, $l_x1); if ($left_alignment == 1) { $w_x1 = $x1+1; $l_x1 = $x1; } else { $w_x1 = $x2-1-$weight_size; $l_x1 = $x2; } my $poly_pkg = $self->polygon_package; my $polygon = $poly_pkg->new(); $polygon->addPt($w_x1,$y2); $polygon->addPt($w_x1,$y2-$weight_size); $polygon->addPt($w_x1+$weight_size,$y2-$weight_size); $polygon->addPt($w_x1+$weight_size,$y2); $gd->filledPolygon($polygon,$bg); my $angle = deg2rad(30); my $dx = 6; my $dy = 4; my $midX = $x2-$dx; my $midY = $y1+$dy; $gd->line($l_x1, $y2, $l_x1, $y1+$dy, $fg); return unless $left_alignment == 1; return if ($x2-$x1 <= $weight_size); $x2 = $x1+$weight_size+1+$length; $gd->line($l_x1, $midY, $x2, $midY, $fg); $gd->line($x2, $midY, $x2-$dx, $y1, $fg); $gd->line($x2, $midY, $x2-$dx, $y1+2*$dy, $fg); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::weighted_arrow - The "weighted arrow" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws an arrow which has is "weighted" by a square on the left side of the glyph or a "weight" and a vertical line, but no arrow on its right side. The arrow/line is drawn with the foreground color, the square - with the background color. The first mode is the default. To get the second mode, specify the "left_alignment 0" option. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -weight_size Size of the square 8 -length Length of the arrow 20 -left_alignment Whether the glyph is drawn 1 on the left or on the right side of the available space. -height Standard option, but 10 important here =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Vsevolod (Simon) Ilyushchenko Esimonf@cshl.eduE. Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/fb_shmiggle.pm000444001750001750 5332212366325116 22772 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::fb_shmiggle; # [ to see proper formatting set tab==2 ] # # 2009-2010 Victor Strelets, FlyBase.org use constant DEBUG => 0; #use strict; use GD; use vars '@ISA'; use Bio::Graphics::Glyph::generic; BEGIN{ @ISA = 'Bio::Graphics::Glyph::generic'; local($colors_selected,$black,$red,$white,$grey); @colors= (); @colcycle= ( # red/orange 'A62A2A', # + 'CC3299', # + 'FF7F00', # + # yellow/brown 'B87333', # + # greenish '6B8E23', # + '238E68', # + # blue/violet '6982CA', # + '2222AD', # + ); %Indices= (); local(*DATF); } #-------------------------- sub draw { my $self = shift; my $gd = shift; my ($left,$top,$partno,$total_parts) = @_; my $ft= $self->feature; my $ftid= $ft->{id}; my $pn= $self->panel; my $fgc = $self->fgcolor; my $bgc = $self->bgcolor; my($r,$g,$b); unless( $colors_selected ) { $black= $gd->colorClosest(0,0,0); $yellow= $gd->colorClosest(255,255,0); $white= $gd->colorClosest(255,255,255); $red= $gd->colorClosest(255,0,0); $lightgrey= $gd->colorClosest(225,225,225); $grey= $gd->colorClosest(200,200,200); $darkgrey= $gd->colorClosest(125,125,125); foreach my $ccc ( @colcycle ) { if( $ccc=~/^[#]?(\S\S)(\S\S)(\S\S)$/ ) { ($r,$g,$b)= ($1,$2,$3); eval('$r=hex("0x'.$r.'");'); eval('$g=hex("0x'.$g.'");'); eval('$b=hex("0x'.$b.'");'); } my $c= $gd->colorClosest($r,$g,$b); push(@colors,$c); } $colors_selected= 1; } my($pnstart,$pnstop)= ($pn->start,$pn->end); # in seq coordinates my $nseqpoints= $pnstop - $pnstart + 1; my($xf1,$yf1,$xf2,$yf2)= $self->calculate_boundaries($left,$top); my $leftpad= $pn->pad_left; my $datadir= $ENV{SERVER_PATH} . $ft->{datadir}; my($start,$stop)= $pn->location2pixel(($ft->{start},$ft->{end})); my $ftscrstop= $stop + $leftpad; my $ftscrstart= $start + $leftpad; my $chromosome= $ft->{ref}; #warn("pn start stop leftpad nseq dir = $pnstart $pnstop $leftpad $datadir $chromosome\n"); my $flipped= $self->{flip} ? 1 : 0; my($subsets,$subsetsnames,$signals)= $self->getData($ft,$datadir,$chromosome,$pnstart,$pnstop,$xf1,$xf2,$flipped); my $poly_pkg = $self->polygon_package; my @orderedsubsets= @{$subsets}; my $nsets= $#orderedsubsets+1; my($xstep,$ystep)= (2,int(100.0/$nsets)); $ystep= 7 unless $ystep>=7; # empiricaly found - to read lines of tiny fonts $ystep= 12 if $ystep>12; # empirically found - to preserve topo feel when number of subsets is small $ystep= 7 if $ystep>7; # tmp unification my($xw,$yw)= ( $nsets*$xstep, ($nsets-1)*$ystep ); my $polybg= $poly_pkg->new(); $polybg->addPt($xf1,$yf2-$yw); $polybg->addPt($xf2,$yf2-$yw); $polybg->addPt($xf2-$xw, $yf2); $polybg->addPt($xf1-$xw, $yf2); $gd->filledPolygon($polybg,$lightgrey); # background for( my $xx= $xf1+2; $xx<$xf2; $xx+=6 ) { $gd->line($xx,$yf2-$yw,$xx-$xw,$yf2,$grey); } # grid-helper my $xshift= 0; my $yshift= $nsets * $ystep; ($r,$g,$b)= (10,150,80); my $colcycler= 0; my @screencoords= @{$signals->{screencoords}}; my $max_signal= 30; my $koeff= 4; if( exists $signals->{max_signal} ) { $max_signal= $signals->{max_signal}; $koeff= 80.0/$max_signal; } my $predictor_cutoff= int($max_signal*0.95); # empirically found my @prevx= (); my @prevy= (); my @prevvals= (); my $profilen= 0; my %SPEEDUP= (); foreach my $subset ( @orderedsubsets ) { my $edgecolor= ($xshift==0) ? $black : $yellow; #my $color= ($xshift==0) ? $darkgrey : $gd->colorClosest(oct($r),oct($g),oct($b)); my $color= ($profilen==0) ? $darkgrey : $colors[$colcycler]; $xshift -= $xstep; $yshift -= $ystep; my @values= @{$signals->{$subset}}; my($xold,$yold)= ($xf1+$xshift,$yf2-$yshift+1); my $xpos= 0; my $poly= $poly_pkg->new(); $poly->addPt($xold,$yold+1); my @allx= ($xold); my @ally= ($yold); my @allvals= (0); my $runx= $xf1 + $xshift; foreach my $val ( @values ) { $scrx += $leftpad; my $x= $screencoords[$xpos] + $xshift; my $visval; if( exists $SPEEDUP{$val} ) { $visval= $SPEEDUP{$val}; } else { $visval= int($val*$koeff); $SPEEDUP{$val}= $visval; } my $y= $yf2 - $yshift - $visval; push(@allx,$x); push(@ally,$y); push(@allvals,$visval); if( $xpos>0 ) { $poly->addPt($x,$y+1); } ($xold,$yold)= ($x,$y); $xpos++; } $poly->addPt($xf2+$xshift, $yf2-$yshift+1); $gd->filledPolygon($poly,$color) unless $profilen==0; # not on MAX predictor ($xold,$yold)= ($allx[0],$ally[0]); for( my $en=1; $en<=$#allx; $en++ ) { my $x= $allx[$en]; my $y= $ally[$en]; $gd->line($xold,$yold,$x,$y,$edgecolor); ($xold,$yold)= ($x,$y); } if( $profilen==0 ) { # drawing mRNA (cutoff-based) predictor on MAX subset my($xxx,$yyy)= ($allx[1]-1,$yf2-$yw); $gd->line($xxx-4,$yyy,$xxx-2,$yyy,$black); $gd->string(GD::Font->Tiny,$xxx-12, $yyy-3,'0',$black); $gd->line($xxx-2,$yyy,$xxx-2,$yyy-50,$black); $gd->line($xxx-4,$yyy-47,$xxx-2,$yyy-50,$black); $gd->line($xxx,$yyy-47,$xxx-2,$yyy-50,$black); $gd->line($xxx-4,$yyy-44,$xxx-2,$yyy-44,$black); $gd->string(GD::Font->Tiny,$xxx-18, $yyy-47,$max_signal,$black); my($inexon,$exstart,$exend,$ymax)= (0,0,0,999); for( my $en=1; $en<=$#allx; $en++ ) { my $y= $ally[$en]; $ymax= $y if $y < $ymax; if( $allvals[$en]>=$predictor_cutoff ) { my $x= $allx[$en]; unless( $inexon ) { $inexon= 1; $exstart= $x; } # start exon $exend= $x; } elsif( $inexon ) { # end exon and draw it $inexon= 0; $ymax -= 6; my $allowedymax= $yf2-$yshift-45; $ymax= $allowedymax if $ymax < $allowedymax; # set limit for huge peaks $gd->line($exstart,$ymax,$exstart,$ymax+2,$red); $gd->line($exstart,$ymax,$exend,$ymax,$red); $gd->line($exend,$ymax,$exend,$ymax+2,$red); ($inexon,$exstart,$exend,$ymax)= (0,0,0,999); } } if( $inexon ) { # exon which ends beyond this screen $ymax -= 6; my $allowedymax= $yf2-$yshift-45; $ymax= $allowedymax if $ymax < $allowedymax; # set limit for huge peaks $gd->line($exstart,$ymax,$exstart,$ymax+2,$red); $gd->line($exstart,$ymax,$exend,$ymax,$red); } } if( 0 && $profilen>1 ) { # blocked - drawing roof lines doesn't work well with this view.. for( my $en=3; $en<=$#allx; $en+=6 ) { next if $allvals[$en]==0 || $prevvals[$en]==0; my $y= $ally[$en]; $yold= $prevy[$en]; if( $yold<$y ) { my $x= $allx[$en]; $xold= $prevx[$en]; $gd->line($xold,$yold,$x,$y,$darkgrey); } } } $gd->string(GD::Font->Tiny,$xf2+$xshift+3, $yf2-$yshift-5,$subsetsnames->{$subset},$color); $colcycler++; $colcycler= 0 if $colcycler>$#colors; unless( $profilen==0 ) { @prevx= @allx; @prevy= @ally; @prevvals= @allvals; } $profilen++; } return; } #-------------------------- sub getData { my $self = shift; my($ft,$datadir,$chromosome,$start,$stop,$scrstart,$scrstop,$flipped) = @_; my %Signals= (); $self->openDataFiles($datadir); my @subsets= (exists $ft->{'subsetsorder'}) ? @{$ft->{'subsetsorder'}} : sort split(/\t+/,$Indices{'subsets'}); shift(@subsets) if $subsets[0] eq 'MAX'; warn("subsets: @subsets\n") if DEBUG; my %SubsetsNames= (exists $ft->{'subsetsnames'}) ? %{$ft->{'subsetsnames'}} : map { $_, $_ } @subsets; $SubsetsNames{MAX}= 'MAX'; my $screenstep= ($scrstop-$scrstart+1) * 1.0 / ($stop-$start+1); my $donecoords= 0; foreach my $subset ( @subsets ) { my $nstrings= 0; # scan seq ranges offsets to see where to start reading my $key= $subset.':'.$chromosome; my $poskey= $key.':offsets'; my $ranges_pos= (exists $Indices{$poskey}) ? int($Indices{$poskey}) : -1; if( $ranges_pos == -1 ) { next; } # no such signal.. warn(" positioning for $poskey starts at $ranges_pos\n") if DEBUG; if( $start>=1000000 ) { my $bigstep= int($start/1000000.0); if( exists $Indices{$key.':offsets:'.$bigstep} ) { my $jumpval= $Indices{$key.':offsets:'.$bigstep}; warn(" jump in offset search to $jumpval\n") if DEBUG; $ranges_pos= int($jumpval); } } seek(DATF,$ranges_pos,0); my($offset,$offset1)= (0,0); my $lastseqloc= -999999999; my $useoffset= 0; while( (my $strs=) ) { $nstrings++ if DEBUG; if( DEBUG ) { chop($strs); warn(" positioning read for coord $start ($strs)\n"); } last unless $strs=~m/^(-?\d+)[ \t]+(\d+)/; my($seqloc,$fileoffset)= ($1,$2); if( DEBUG ) { chop($strs); warn(" positioning read for $poskey => $seqloc, $fileoffset ($strs)\n"); } $offset1= $offset; $offset= $fileoffset; $lastseqloc= $seqloc; if( $seqloc > $start ) { $useoffset= int($offset1); last; } } warn(" will use offset $useoffset\n") if DEBUG; warn(" (scanned $nstrings offset strings)\n") if DEBUG; if( $useoffset==0 ) { # data offset cannot be 0 - means didn't find where to read required data.. next; my @emptyvals= (); for( my $ii= $scrstart; $ii++ <= $scrstop; ) { push(@emptyvals,0); } $Signals{$subset}= \@emptyvals; } $nstrings= 0; # read signal profile seek(DATF,$useoffset,0); $lastseqloc= -999999999; my $lastsignal= 0; my($scrx,$scrxold)= ($scrstart,$scrstart-1); my $runmax= 0; my @values= (); my @xscreencoords= (); while( (my $str=) ) { $nstrings++ if DEBUG; unless( $str=~m/^(-?\d+)[ \t]+(\d+)/ ) { warn(" header read: $str") if DEBUG; last; # because no headers were indexed at the beginning of data packs } my($seqloc,$signal)= ($1,$2); warn(" signal read: $seqloc, $signal line: $str") if DEBUG; last if $lastseqloc > $seqloc; # just in case, as all sits merged in one file.. if( $seqloc>=$start ) { # current is the next one after the one we need to start from.. unless( $lastseqloc== -999999999 ) { # expand previous $lastseqloc= $start-2 if $lastseqloc<$start; # limit empty steps (they may start from -200000) while( $lastseqloc < $seqloc ) { # until another (one we just retrieved) wiggle reading last if $lastseqloc > $stop; # end of subset data next if $lastseqloc++ < $start; # we have actual new seq position in our required range my $scrpos= int($scrx); $runmax= $lastsignal if $runmax < $lastsignal; if( $scrpos != $scrxold ) { # we have actual new seq _and_ screen position push(@values,$runmax); push(@xscreencoords,$scrpos) unless $donecoords; $scrxold= $scrpos; $runmax= 0; } $scrx += $screenstep; # remember - it is not integer } } } ($lastseqloc,$lastsignal)= ($seqloc,$signal); last if $seqloc > $stop; # end of subset data } if( $lastseqloc < $stop ) { # if on the end of signal profile, but still in screen range # just assume that we are getting one more reading with signal == 0 my $signal= 0; while( $lastseqloc++ < $stop ) { my $scrpos= int($scrx); if( $scrpos != $scrxold ) { # we have actual new seq _and_ screen position push(@values,$signal); push(@xscreencoords,$scrpos) unless $donecoords; $scrxold= $scrpos; } $scrx += $screenstep; } } warn(" (scanned $nstrings signal strings)\n") if DEBUG; $nstrings= 0; if( $flipped ) { my @ch= reverse @values; @values= @ch; } warn(" ".$subset."=> ".@values." values @values\n") if DEBUG && $#values<1000; $Signals{$subset}= \@values; $Signals{screencoords}= \@xscreencoords unless $donecoords; $donecoords= 1; } # foreach my $subset ( @subsets ) { if( exists $Indices{max_signal} ) { $Signals{max_signal}= $Indices{max_signal}; warn(" max_signal=> ".$Indices{max_signal}." \n") if DEBUG; } # prepare MAX profile - will be used as a base for exon/UTR prediction my @maxprofile= (); my @ruler= @{$Signals{screencoords}}; for( my $npos= 0; $npos<=$#ruler; $npos++ ) { my $maxval= 0; foreach my $subset ( @subsets ) { my $p= $Signals{$subset}; my $val= $p->[$npos]; $maxval= $val if $maxval < $val; } push(@maxprofile,$maxval); } $Signals{MAX}= \@maxprofile; warn(" MAX=> ".@maxprofile." values @maxprofile\n") if DEBUG && $#maxprofile<1000; unshift(@subsets,'MAX'); return(\@subsets,\%SubsetsNames, \%Signals); } #-------------------------- sub openDataFiles { my $self = shift; my $datadir= shift; $datadir.= '/' unless $datadir=~m|/$|; my $datafile= $datadir.'data.cat'; open(DATF,$datafile) || warn("cannot open $datafile\n"); use BerkeleyDB; # caller should already used proper 'use lib' command with path my $bdbfile= $datadir . 'index.bdbhash'; tie %Indices, "BerkeleyDB::Hash", -Filename => $bdbfile, -Flags => DB_RDONLY || warn("can't read BDBHash $bdbfile\n"); if( DEBUG ) { foreach my $kk ( sort keys %Indices ) { warn(" $kk => ".$Indices{$kk}."\n"); } } return; } 1; =pod =head1 TopoView Glyph =begin html Warning: This software is still in the developmental stage and is distributed "as is", without packaging and in the same exact condition as currently used by FlyBase. You are free to use it, modify and develop further, but proper reference to the original author and FlyBase is required.

"fb_shmiggle.pm" TopoView (AKA shmiggle) glyph was developed for fast 3D-like demonstration of RNA-seq data consisting of multiple individual subsets. Main purposes were to compact presentation as much as possible (in one reasonably sized track) and to allow easy visual detection of coordinated behavior of the expression profiles of different subsets.

It was found that log2 conversion dramatically changes perception of expression profiles and kind of illuminates coordinated behavior of different subsets. Glyph and data indexer/formatter were in fact modified with the assumption that final data produced by indexer/formatter will always be a log2 conversion of the original coverage, therefore represented by short integer with values in range of 0-200 or so.

Comparing performance (retrieval of several Kbp of data profiles for several subsets of some RNA-seq experiment) of wiggle binary method and of several possible alternatives, it was discovered that one of the approaches remarkably outperforms wiggle bin method (although it requires several times more space for formatted data storage). Optimal storage/retrieval method stores all experiment data (all subsets of the experiment) in one text file, where structure of the file in fact is one of the most simple wiggle (coverage files) formats with the addition of some positioning data (two-column format, without runlength specification, without omission of zero values). This is the only format which glyph is able to handle (there are many reasons for that) so any modification of indexer/formatter _must_ produce exact equivalent of that format. In my experience, 90% of the debugging with new incoming data was related to the problems of that exact format conversion. Example of the formatted data:

# subset=BS107_all_unique chromosome=2LHet
-200000 0
0       0
19955   1
19959   0
19967   2
19972   0
19977   2
20027   0
20031   2
20035   0
20043   1
20045   0
20049   1
20055   0
20062   2
20069   0
20073   2
20082   0
20097   3
20115   0
20125   3
20127   0
20134   3
20139   0
20140   3
20144   0
20145   3
20150   0
20157   3
20162   0
20172   3
20183   0

Glyph is supplied with a "index_cov_files.pl" data indexer/formatter which is converting original coverage (wiggle) files into data structure which will be used for fast retrieval. You should run this script in some separate directory, containing original coverage files (gzipped form works too). After it finishes, directory will contain two new files: data.cat and index.bdbhash. Both files required for data retrieval by glyph. Files can be moved freely between different directories or even operational systems (Mac and PC included, I think). Content of the dat file is subject of accurate check - this is if you want to avoid long debugging sessions on the level of running GBrowse. Size of files is quite big, but in my experience it is like twice less than gzipped size of all initial coverage files - which is quite acceptable.

Example of GBrowse conf file insert (shows actual FlyBase config sections for Baylor and modENCODE RNA-seq tracks):

[baylor_wiggle]
feature       = RNAseq_profile:Baylor
glyph         = fb_shmiggle
height        = 124
bgcolor       = sub { my $f= shift;
        $f->{datadir}= '/.data/genomes/dmel/current/rnaseq-gff/baylor/'; # trick it this way..
        my @subsetsorder= qw(
                E2-4hr
                E2-16hr
                E2-16hr100
                E14-16hr
                L
                L3i
                L3i100
                P
                P3d
                MA3d
                FA3d
                A17d
                );
        $f->{subsetsorder}= \@subsetsorder;
        return 'lightgrey';
        }
key           = Baylor group RNA-seq coverage by subsets (devel.stages) [log2 converted]
category      = RNA-seq data
label         = ""
title         = ""
link = sub { my $f= shift;
  my $id= $f->{'id'};
  my $lnk="javascript:void(0);";
  "$lnk\" id=\"$id\" onmouseover=\"showdata_description('Baylor');return false;\" onmouseout=\"delsumm_overlib();";
  }

[celniker_wiggle]
feature       = RNAseq_profile:Celniker 
glyph 				= fb_shmiggle
height      	= 250
bgcolor       = sub { my $f= shift;
	$f->{datadir}= '/.data/genomes/dmel/current/rnaseq-gff/celniker/'; # trick it this way..
	my @subsetsorder= qw(
		BS40_all_unique
		BS43_all_unique
		BS46_all_unique
		BS49_all_unique
		BS54_all_unique
		BS55_all_unique
		BS58_all_unique
		BS62_all_unique
		BS66_all_unique
		BS67_all_unique
		BS71_all_unique
		BS73_all_unique
		BS107_all_unique
		BS111_all_unique 
		BS113_all_unique 
		BS196_all_unique 
		BS200_all_unique 
		BS203_all_unique 
		BS129_all_unique 
		BS133_all_unique 
		BS136_all_unique 
		BS137_all_unique 
		BS140_all_unique 
		BS143_all_unique 
		BS150_all_unique 
		BS156_all_unique 
		BS162_all_unique 
		BS153_all_unique 
		BS159_all_unique 
		BS165_all_unique 
		);
	$f->{subsetsorder}= \@subsetsorder;
	my %subsetsnames= qw(
		BS40_all_unique em0-2hr
		BS43_all_unique em2-4hr
		BS46_all_unique em4-6hr
		BS49_all_unique em6-8hr
		BS54_all_unique em8-10hr
		BS55_all_unique em10-12hr
		BS58_all_unique em12-14hr
		BS62_all_unique em14-16hr
		BS66_all_unique em16-18hr
		BS67_all_unique em18-20hr
		BS71_all_unique em20-22hr
		BS73_all_unique em22-24hr
		BS107_all_unique L1
		BS111_all_unique L2
		BS113_all_unique L3_12hr
		BS196_all_unique L3_PS1-2
		BS200_all_unique L3_PS3-6
		BS203_all_unique L3_PS7-9
		BS129_all_unique WPP
		BS133_all_unique WPP_12hr
		BS136_all_unique WPP_24hr
		BS137_all_unique WPP_2days
		BS140_all_unique WPP_3days
		BS143_all_unique WPP_4days
		BS150_all_unique AdM_Ecl_1days
		BS156_all_unique AdM_Ecl_5days
		BS162_all_unique AdM_Ecl_30days
		BS153_all_unique AdF_Ecl_1days
		BS159_all_unique AdF_Ecl_5days
		BS165_all_unique AdF_Ecl_30days
		);
	$f->{subsetsnames}= \%subsetsnames;
	return 'lightgrey';
	}
key           = modENCODE Transcription Group RNA-seq coverage (unique reads only) by subsets (devel. stages) [log2 converted]
category      = RNA-seq data
label         = "" 
title         = ""
link = sub { my $f= shift;
  my $id= $f->{'id'};
	my $lnk="javascript:void(0);";
	"$lnk\" id=\"$id\" onmouseover=\"showdata_description('Celniker');return false;\" onmouseout=\"delsumm_overlib();";
	}

In configuration, it is very important to set 'datadir' variable (relative to server DOCUMENT_ROOT) so that glyph will know where to take data and index.

Setting 'subsetsorder' allows you to display expression profiles of subsets in some predefined order. If setting omitted, glyph will display sets in alphabetical order of the initial subsets names.

Setting 'subsetsnames' allows to rename subsets (very important as in most cases workflow names of subsets are unsutable for intelligent data display to end users). If setting omitted, initial subsets names will be used for display.

For the glyph to be properly activated, you need to insert in all of your GFF files (ones for which you have RNA-seq data) virtual contig-long features which will activate expression data display. To cover whole range of the contig (chromosome arm), it is better to use coordinates presented in 'sequence-region' definition at the top of GFF file. Example of such feature lines for FlyBase data is shown below:

2LHet   Baylor  RNAseq_profile  1       368874  .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
2L      Baylor  RNAseq_profile  1       23011544        .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
2RHet   Baylor  RNAseq_profile  1       3288763 .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
2R      Baylor  RNAseq_profile  1       21146708        .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
3LHet   Baylor  RNAseq_profile  1       2555493 .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
3L      Baylor  RNAseq_profile  1       24543557        .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
3RHet   Baylor  RNAseq_profile  1       2517509 .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
3R      Baylor  RNAseq_profile  1       27905053        .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
4       Baylor  RNAseq_profile  1       1351857 .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
XHet    Baylor  RNAseq_profile  1       204113  .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
X       Baylor  RNAseq_profile  1       22422827        .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks
YHet    Baylor  RNAseq_profile  1       347040  .       +       .       Comment=This is a reference feature for RNAseq wiggle tracks

Questions about TopoView glyph should be directed to Victor Strelets (strelets@bio.indiana.edu). =end html Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/oval.pm000555001750001750 527012366325116 21447 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::oval; use strict; use base qw(Bio::Graphics::Glyph::ellipse); sub my_description { return < and L. =head1 DESCRIPTION This glyph draws an oval instead of a box. It is an alias for the "ellipse" glyph. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/graded_segments.pm000555001750001750 2011212366325116 23651 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::graded_segments; use strict; use base qw(Bio::Graphics::Glyph::segments Bio::Graphics::Glyph::minmax Bio::Graphics::Glyph::merge_parts); sub my_description { return 'This glyph is used for drawing features that consist of discontinuous segments.', 'The color intensity of each subfeature proportional to its score tag.' } sub my_options { return { max_score => [ 'integer', undef, "Maximum value of the feature's \"score\" attribute."], min_score => [ 'integer', undef, "Minimum value of the feature's \"score\" attribute."], vary_fg => [ 'boolean', undef, "Vary the foreground color as well as the background."], merge_parts => [ 'boolean', undef, "At low magnifications, smooth small gaps to improve the visual display.", "See this glyph's manual page for the gory details."], max_gap => [ 'integer', undef, 'Do not merge across gaps that exceed this threshold.'], } } # override draw method to calculate the min and max values for the components sub draw { my $self = shift; # bail out if this isn't the right kind of feature # handle both das-style and Bio::SeqFeatureI style, # which use different names for subparts. my @parts = $self->parts; @parts = $self if !@parts && $self->level == 0; return $self->SUPER::draw(@_) unless @parts; my ($min_score,$max_score) = $self->minmax(\@parts); return $self->SUPER::draw(@_) unless defined($max_score) && defined($min_score) && $min_score < $max_score; my $span = $max_score - $min_score; # allocate colors my $fill = $self->bgcolor; my ($red,$green,$blue) = $self->panel->rgb($fill); @parts = $self->merge_parts(@parts) if $self->option('merge_parts'); foreach my $part (@parts) { my $s = eval { $part->feature->score }; unless (defined $s) { $part->{partcolor} = $fill; next; } my ($r,$g,$b) = $self->calculate_color($s,[$red,$green,$blue],$min_score,$span); my $idx = $self->panel->translate_color($r,$g,$b); $part->{partcolor} = $idx; } $self->SUPER::draw(@_); } sub calculate_color { my $self = shift; my ($s,$rgb,$min_score,$span) = @_; return map { 255 - (255-$_) * min(max( ($s-$min_score)/$span, 0), 1) } @$rgb; } sub min { $_[0] < $_[1] ? $_[0] : $_[1] } sub max { $_[0] > $_[1] ? $_[0] : $_[1] } sub subseq { my $class = shift; my $feature = shift; return $feature->segments if $feature->can('segments'); return $feature->sub_SeqFeature if $feature->can('sub_SeqFeature'); return; } # synthesize a key glyph sub keyglyph { my $self = shift; my $scale = 1/$self->scale; # base pairs/pixel # two segments, at pixels 0->50, 60->80 my $offset = $self->panel->offset; my $feature = Bio::Graphics::Feature->new( -segments=>[ [ 0*$scale +$offset,20*$scale+$offset], [ 30*$scale +$offset,50*$scale+$offset], [60*$scale+$offset, 80*$scale+$offset] ], -name => $self->option('key'), -strand => '+1'); ($feature->segments)[0]->score(10); ($feature->segments)[1]->score(50); ($feature->segments)[2]->score(100); my $factory = $self->factory->clone; $factory->set_option(label => 1); $factory->set_option(bump => 0); $factory->set_option(connector => 'solid'); return $factory->make_glyph($feature); } # component draws a shaded box sub bgcolor { my $self = shift; return defined $self->{partcolor} ? $self->{partcolor} : $self->SUPER::bgcolor; } sub fgcolor { my $self = shift; return $self->SUPER::fgcolor unless $self->option('vary_fg'); return defined $self->{partcolor} ? $self->{partcolor} : $self->SUPER::fgcolor; } 1; =head1 NAME Bio::Graphics::Glyph::graded_segments - The "graded_segments" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This is identical to the "alignment" glyph, and is used for drawing features that consist of discontinuous segments. The color intensity of each segment is proportionate to the score. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition, the alignment glyph recognizes the following glyph-specific options: Option Description Default ------ ----------- ------- -max_score Maximum value of the Calculated feature's "score" attribute -min_score Minimum value of the Calculated feature's "score" attribute -vary_fg Vary the foreground color as 0 (false) well as the background -merge_parts 0 (false) Whether to simplify the alignment at low magnification -max_gap Do not merge across gaps Calculated that exceed this threshold If max_score and min_score are not specified, then the glyph will calculate the local maximum and minimum scores at run time. Since many scoring functions are exponential you may wish to take the log of your scores before passing them to this glyph. =head2 Simplifying the display of alignment features for large segments The "merge_parts" option is used for semantic zooming. Specifically, if features are small and dense, they will not be displayed very well for large segments and the color-coding will be lost. If merge-parts is set to a true value, adjacent alignment parts will be merged until a gap exceeding a calculated or user-specified value is encountered. Unless specified, the maximum gap allowed for merging adjacent features is calculated as (L/10000)*(L/500), where L = the length of the sequence displayed in the browser. The exponentially increasing gap threshold allows more aggressive merging of alignment features as the size of the displayed sequence grows larger. The score of the merged feature is calculated as a weighted average. For example, consider two adjacent HSPs that are each 400 bp in length and have scores of 60% and 70%. If the merge_parts option is set to a true value, the two HSPs would be merged in the display to a single 800 bp alignment block with an average score of 65%. The merge_parts option is turned off by default. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/ruler_arrow.pm000555001750001750 2504412366325116 23072 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::ruler_arrow; # package to use for drawing an arrow as ruler (5' and 3' are marked as label) # Non object-oriented utilities used here-and-there in Bio::Graphics modules =head1 NAME Bio::Graphics::Glyph::ruler_arrow - glyph for drawing an arrow as ruler (5' and 3' are marked as label) =cut use strict; use base qw(Bio::Graphics::Glyph::generic); my %UNITS = (K => 1000, M => 1_000_000, G => 1_000_000_000); sub pad_bottom { my $self = shift; my $val = $self->SUPER::pad_bottom(@_); $val += $self->font_height if $self->option('tick'); $val; } # override draw method sub draw { my $self = shift; my $parallel = $self->option('parallel'); $parallel = 1 unless defined $parallel; $self->draw_parallel(@_) if $parallel; $self->draw_perpendicular(@_) unless $parallel; $self->draw_label(@_) if ($self->option('label')); } sub draw_perpendicular { my $self = shift; my $gd = shift; my ($dx,$dy) = @_; my ($x1,$y1,$x2,$y2) = $self->bounds(@_); my $ne = $self->option('northeast'); my $sw = $self->option('southwest'); $ne = $sw = 1 unless defined($ne) || defined($sw); # draw a perpendicular arrow at position indicated by $x1 my $fg = $self->set_pen; my $a2 = ($y2-$y1)/4; my @positions = $x1 == $x2 ? ($x1) : ($x1,$x2); for my $x (@positions) { if ($ne) { $gd->line($x,$y1,$x,$y2,$fg); $gd->line($x-$a2,$y1+$a2,$x,$y1,$fg); $gd->line($x+$a2,$y1+$a2,$x,$y1,$fg); } if ($sw) { $gd->line($x,$y1,$x,$y2,$fg); $gd->line($x-$a2,$y2-$a2,$x,$y2,$fg); $gd->line($x+$a2,$y2-$a2,$x,$y2,$fg); } } # add a label if requested # $self->draw_label($gd,$dx,$dy) if ($self->option('label') && !$self->option('ruler')); # this draws the label aligned to the left } sub draw_parallel { my $self = shift; my $gd = shift; my ($dx,$dy) = @_; my ($x1,$y1,$x2,$y2) = $self->bounds(@_); my $fg = $self->set_pen; my $a2 = ($self->height)/2; my $center = $y1+$a2; $x1 = $self->panel->left if $x1 < $self->panel->left; $x2 = $self->panel->right if $x2 > $self->panel->right; my ($sw,$ne,$base_w,$base_e) = $self->arrowheads; $gd->line($x1,$center,$x2,$center,$fg); $self->arrowhead($gd,$x1,$center,$a2,-1) if $sw; # west arrow $self->arrowhead($gd,$x2,$center,$a2,+1) if $ne; # east arrow $gd->line($x2,$center-$a2,$x2,$center+$a2,$fg) if $base_e; #east base $gd->line($x1,$center-$a2,$x1,$center+$a2,$fg) if $base_w; #west base # turn on ticks if ($self->option('tick')) { local $^W = 0; # dumb uninitialized variable warning my $font = $self->font; my $font_color = $self->fontcolor; my $height = $self->height; my $relative = $self->option('relative_coords'); my $start = $relative ? 1 : $self->feature->start; my $stop = $start + $self->feature->length - 1; my $offset = $relative ? $self->feature->start-1 : 0; my $reversed = $self->feature->strand < 0; my $units = $self->option('units') || ''; my $divisor = $UNITS{$units} || 1 if $units; my ($major_ticks,$minor_ticks) = $self->panel->ticks($start,$stop,$font,$divisor); ## Does the user want to override the internal scale? my $scale = $self->option('scale'); my $left = $sw ? $x1+$height : $x1; my $right = $ne ? $x2-$height : $x2; my $format = ($major_ticks->[1]-$major_ticks->[0])/($divisor||1) < 1 ? "%.1f$units" : "%d$units"; for my $i (@$major_ticks) { my $tickpos = $dx + ($reversed ? $self->map_pt($stop - $i + $offset) : $self->map_pt($i + $offset)); next if $tickpos < $left or $tickpos > $right; $gd->line($tickpos,$center-$a2,$tickpos,$center+$a2,$fg); my $label = $scale ? $i / $scale : $i; if ($units) { my $scaled = $label/$divisor; $label = sprintf($format,$scaled); } my $middle = $tickpos - $self->string_width($label)/2; $gd->string($font,$middle,$center+$a2-1,$label,$font_color) unless ($self->option('no_tick_label')); } if ($self->option('tick') >= 2) { my $a4 = $self->height/4; for my $i (@$minor_ticks) { my $tickpos = $dx + ($reversed ? $self->map_pt($stop - $i + $offset) : $self->map_pt($i + $offset)); next if $tickpos < $left or $tickpos > $right; $gd->line($tickpos,$center-$a4,$tickpos,$center+$a4,$fg); } } } # add a label if requested # $self->draw_label($gd,$dx,$dy) if ($self->option('label'); # $self->draw_description($gd,$dx,$dy) if $self->option('description'); } sub arrowheads { my $self = shift; my ($ne,$sw,$base_e,$base_w); if ($self->option('double')) { $ne = $sw = 1; } else { $ne = $self->option('northeast') || $self->option('east'); $sw = $self->option('southwest') || $self->option('west'); } # otherwise use strandedness to define the arrow unless (defined($ne) || defined($sw)) { # turn on both if neither specified $ne = 1 if $self->feature->strand > 0; $sw = 1 if $self->feature->strand < 0; } return ($sw,$ne,0,0) unless $self->option('base'); return ($sw,$ne,!$sw,!$ne); } sub draw_label { my $self = shift; my ($gd,$left,$top) = @_; my $label5 = "5'"; my $label3 = "3'"; my $relative = $self->option('relative_coords'); my $start = $relative ? 1 : $self->feature->start; my $stop = $start + $self->feature->length - 1; my $offset = $relative ? $self->feature->start-1 : 0; my $reversed = $self->feature->strand < 0; my $units = $self->option('units') || ''; my $divisor = $UNITS{$units} || 1 if $units; my ($major_ticks,$minor_ticks) = $self->panel->ticks($start,$stop,$self->font,$divisor); my $tick_scale = " ($major_ticks bp/"; $tick_scale .= ($self->option('tick') >= 2)?"major tick)":"tick)"; my $top_left_label = $label5; $top_left_label .= $tick_scale if ($self->option('no_tick_label') && $self->option('tick')); #-1 direction mean lower end is 3' (minus strand on top) ($label5, $label3) = ($label3, $label5) if ($self->option('direction') == -1); my $x = $self->left + $left; $x = $self->panel->left + 1 if $x <= $self->panel->left; my $font = $self->option('labelfont') || $self->font; $gd->string($font, $x, $self->top + $top, $top_left_label, $self->fontcolor); my $x1 = $left + $self->panel->right - $self->string_width($label3); $gd->string($font, $x1, $self->top + $top, $label3, $self->fontcolor); if ($self->option('both')) {#minus strand as well $gd->string($font, $x, $self->bottom - $self->pad_bottom + $top, $label3, $self->fontcolor); my $x1 = $left + $self->panel->right - $self->string_width($label5); $gd->string($font, $x1, $self->bottom - $self->pad_bottom + $top, $label5, $self->fontcolor); } } 1; __END__ =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws arrows. Label, if requested, will be 5' and 3' at both ends and tick scale is printed if no_tick_label option is set and tick option set. Depending on options, the arrows can be labeled, be oriented vertically or horizontally, or can contain major and minor ticks suitable for use as a scale. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -tick Whether to draw major 0 and minor ticks. 0 = no ticks 1 = major ticks 2 = minor ticks -label 5' at start, 3' at end 0 above arrow -both 5', 3' above, 0 and 3', 5' below arrow -direction 0 = ruler is plus strand 0 -1 = ruler is minus strand -parallel Whether to draw the arrow true parallel to the sequence or perpendicular to it. -northeast Force a north or east true arrowhead(depending on orientation) -east synonym of above -southwest Force a south or west true arrowhead(depending on orientation) -west synonym of above -double force-doubleheaded arrow -base Draw a vertical base at the false non-arrowhead side -scale Reset the labels on the arrow false to reflect an externally established scale. Set -parallel to false to display a point-like feature such as a polymorphism, or to indicate an important location. If the feature start == end, then the glyph will draw a single arrow at the designated location: ^ | Otherwise, there will be two arrows at the start and end: ^ ^ | | Scale: Pass in a externally established scale to reset the labels on the arrow. This is particularly useful for manually constructed images where the founding parameters of the panel are not 1-based. For example, a genetic map interval ranging from 0.1 - 0.3 can be constructed by first multiplying every value by 100. Passing arrow(-scale=>100); will draw tick marks labelled appropriately to your external scale. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Shengqiang Shu Esshu@bdgp.lbl.govE Lincoln Stein Elstein@cshl.orgE. Copyright (c) 2001 BDGP, Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/dumbbell.pm000555001750001750 2530612366325116 22316 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::dumbbell; # DAS-compatible package to use for drawing a line of repeating shapes use strict; use base qw(Bio::Graphics::Glyph::generic); use Math::Trig; sub my_description { return < [ 'integer', 10, 'The size of the shape on both ends.'], end_shape => [ ['square','diamond','tree','clover', 'star','bubble','arrow','wave'], 'square', 'The type of shape to place at the ends of the dumbbell.'], bubble_text => [ 'string', undef, 'The text to show in the bubble if the bubble option is', 'chosen (the -shape_size option is ignored in this case).'], antiparallel => [ 'boolean', undef, 'Whether the right arrow is reversed.'], arc => [ 'boolean', undef, 'If true, the end shapes will be connected by a curved', 'arc rather than a straight line.'], } } sub default_shape_size { return 10; } sub default_shape { return 'square'; } sub draw_end_shape { my ($self, @args) = @_; my $shape = $self->option('end_shape') || $self->default_shape(); my $method = "draw_end_$shape"; if ($self->can($method)) { return $self->$method(@args); } else { return $self->draw_end_square(@args); } } sub draw_end_square { my ($self, $gd, $x1, $y1, $shape_size, $fg) = @_; my $x2 = $x1 + $shape_size; my $y2 = $y1 + $shape_size; my $poly_pkg = $self->polygon_package; my $polygon = $poly_pkg->new(); $polygon->addPt($x1,$y1); $polygon->addPt($x2,$y1); $polygon->addPt($x2,$y2); $polygon->addPt($x1, $y2); $gd->filledPolygon($polygon,$fg); return ($x1, $x2); } sub draw_end_diamond { my ($self, $gd, $x1, $y1, $shape_size, $fg) = @_; my $x2 = $x1 + $shape_size; my $y2 = $y1 + $shape_size; my $poly_pkg = $self->polygon_package; my $midX = ($x1+$x2)/2; my $midY = ($y1+$y2)/2; my $polygon = $poly_pkg->new(); $polygon->addPt($x1,$midY); $polygon->addPt($midX,$y1); $polygon->addPt($x2,$midY); $polygon->addPt($midX,$y2); $gd->filledPolygon($polygon,$fg); return ($x1, $x2); } sub translated_polygon { my ($self, $midX, $midY, $scale_factor, @coords) = @_; my $poly_pkg = $self->polygon_package; my $polygon = $poly_pkg->new(); for (my $i=0; $i<(scalar @coords) / 2; $i++) { $polygon->addPt($coords[2*$i], $coords[2*$i+1]); } $polygon->scale($scale_factor, $scale_factor); $polygon->offset($midX, $midY); return $polygon; } sub draw_end_star { my ($self, $gd, $x1, $y1, $shape_size, $fg) = @_; #my @coords = (95, -31, -58, 81, 0, -100, 58, 81, -95, -31); my @coords1 = (31, 42, 31, -42, -49, -30, -38, 0, -49, 30); my @coords2 = (100, 0, -81, 59, 31, -95, 31, 95, -81, -58); my $star_size = 190; my $scale_factor = $shape_size / $star_size; my ($midX, $midY) = ($x1+$shape_size/2, $y1+$shape_size/2); $gd->filledPolygon($self->translated_polygon($midX, $midY, $scale_factor, @coords1), $fg); $gd->filledPolygon($self->translated_polygon($midX, $midY, $scale_factor, @coords2), $fg); return ($midX, $midX); } sub draw_end_tree { my ($self, $gd, $x1, $y1, $shape_size, $fg) = @_; my $x2 = $x1 + $shape_size; my $y2 = $y1 + $shape_size; my $trunk_width = $shape_size/4; my $midX = ($x1+$x2)/2; my $midY = ($y1+$y2)/2; my $poly_pkg = $self->polygon_package; my $polygon = $poly_pkg->new(); $polygon->addPt($midX-$trunk_width/2,$midY); $polygon->addPt($midX+$trunk_width/2,$midY); $polygon->addPt($midX+$trunk_width/2,$y2); $polygon->addPt($midX-$trunk_width/2,$y2); $gd->filledPolygon($polygon, $fg); $self->filled_oval($gd, $x1, $y1, $x2, $y1+2*$shape_size/3, $fg, $fg); return ($midX, $midX); } sub draw_end_clover { my ($self, $gd, $x1, $y1, $shape_size, $fg) = @_; my $x2 = $x1 + $shape_size; my $y2 = $y1 + $shape_size; my $trunk_width = $shape_size/4; my $midX = ($x1+$x2)/2; my $poly_pkg = $self->polygon_package; my $polygon = $poly_pkg->new(); $polygon->addPt($midX-$trunk_width/2,$y1+0.4*$shape_size); $polygon->addPt($midX+$trunk_width/2,$y1+0.4*$shape_size); $polygon->addPt($midX+$trunk_width/2,$y2); $polygon->addPt($midX-$trunk_width/2,$y2); $gd->filledPolygon($polygon, $fg); my $radius = $shape_size / 4.3; $self->filled_oval($gd, $midX-$radius, $y1, $midX+$radius, $y1+2*$radius, $fg, $fg); $self->filled_oval($gd, $x1, $y1+1.3*$radius, $x1+2*$radius, $y1+3.3*$radius, $fg, $fg); $self->filled_oval($gd, $x2-2*$radius, $y1+1.3*$radius, $x2, $y1+3.3*$radius, $fg, $fg); return ($midX, $midX); } sub draw_end_bubble { my ($self, $gd, $x1, $y1, $shape_size, $fg) = @_; my $x2 = $x1 + $shape_size; my $y2 = $y1 + $shape_size; my $midX = ($x1+$x2)/2; my $midY = ($y1+$y2)/2; my $bubble_text = defined $self->option('bubble_text') ? $self->option('bubble_text') : "Text"; my $font = $self->option('labelfont') || $self->font; my $bubble_text_length = $self->string_width($bubble_text,$font); my $bubble_text_x = $midX - $bubble_text_length/2; my $bubble_text_y = $midY - $self->font_height($font)/2; $gd->string($font, $bubble_text_x, $bubble_text_y, $bubble_text, $self->fontcolor); my $oval_width = $bubble_text_length * 1.414; my $oval_height = $self->font_height($font) * 1.414; $self->oval($gd, $midX-$oval_width/2, $midY-$oval_height/2, $midX+$oval_width/2, $midY+$oval_height/2); return ($midX-$oval_width/2, $midX+$oval_width/2); } sub draw_end_arrow { my ($self, $gd, $x1, $y1, $shape_size, $fg, $antiparallel) = @_; my $x2 = $x1 + $shape_size; my $y2 = $y1 + $shape_size; my $angle = deg2rad(30); my $dx = 2*$shape_size*cos($angle)/5; my $dy = 2*$shape_size*sin($angle)/5; my $midX = $x2-$dx; my $midY = ($y1+$y2)/2; $gd->line($x1, $midY, $x2, $midY, $fg); if ($antiparallel) { $gd->line($x1, $midY, $x1+$dx, $midY-$dy, $fg); $gd->line($x1, $midY, $x1+$dx, $midY+$dy, $fg); } else { $gd->line($x2, $midY, $x2-$dx, $midY-$dy, $fg); $gd->line($x2, $midY, $x2-$dx, $midY+$dy, $fg); } return ($x1, $x2); } sub draw_end_wave { my ($self, $gd, $x1, $y1, $shape_size, $fg) = @_; my $x2 = $x1 + $shape_size; #Make the heigh constant my $y2 = $y1 + $shape_size/2; $y1 = $y2-10; my $step = $shape_size/6; $gd->line($x1, $y2, $x1+$step, $y1, $fg); $gd->line($x1+$step, $y1, $x1+2*$step, $y2, $fg); $gd->line($x1+2*$step, $y2, $x1+3*$step, $y1, $fg); $gd->line($x1+3*$step, $y1, $x1+4*$step, $y2, $fg); $gd->line($x1+4*$step, $y2, $x1+5*$step, $y1, $fg); $gd->line($x1+5*$step, $y1, $x1+6*$step, $y2, $fg); return ($x1, $x2); } sub draw_component { my $self = shift; my $gd = shift; my $fg = $self->fgcolor; my $shape_size = defined $self->option('shape_size') ? $self->option('shape_size') : $self->default_shape_size; # find the center and vertices my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); if ($x2-$x1 < $shape_size) { return $self->SUPER::draw_component($gd, @_); } my $midX = ($x2-$x1) / 2 + $x1; my $midY = ($y2-$y1) / 2 + $y1; my $startY = $midY - $shape_size/2; my $antiparallel = $self->option('antiparallel'); #We need to store the bounds of the shapes drawn because the connecting line will have #different length depending on them. my ($leftX1, $leftX2) = $self->draw_end_shape($gd, $x1, $startY, $shape_size, $fg); my ($rightX1, $rightX2) = $self->draw_end_shape($gd, $x2-$shape_size, $startY, $shape_size, $fg, $antiparallel); if ($self->option('arc') == 1) { #Draw an arc of an ellipse relative to the midpoint between shapes #whose center is at (0, -q) and which intersects with the X axis at (p,0) and (-p, 0). my $p = ($rightX1 - $leftX2) / 2; my $q = $shape_size/2; my $c = 2 * $p / sqrt(3); my $d = 2 * $q; my $b = $q - $d; my $angle = atan2(sqrt(3), 1); my $deg = rad2deg($angle); $gd->arc($leftX2+$p,$midY+$q,2*$c,2*$d,270-$deg,270+$deg,$self->factory->translate_color('black')); } else { $gd->line($leftX2,$midY,$rightX1,$midY,$fg); } if (my $caption = $self->option('caption')) { my $font = $self->option('labelfont') || $self->font; my $midX = ($x2-$x1-2*$shape_size)/2+$x1+$shape_size; my $startCaption = $midX - $self->string_width($caption,$font)/2; $gd->string($font, $startCaption, $midY-$self->font_height($font), $caption, $self->fontcolor); } } 1; __END__ =head1 NAME Bio::Graphics::Glyph::dumbbell - A glyph that draws a "dumbbell" with the same shapes on both ends. =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a "dumbbell" with the same shapes on both ends. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -shape_size The size of the shape 10 on both ends. -end_shape One of 'square', 'diamond', square 'tree', 'clover', 'star', 'bubble', 'arrow', 'wave' -bubble_text The text to show in the bubble Text if the bubble option is chosen above (shape_size is then ignored) -antiparallel Whether the right arrow 0 is reversed -arc Whether the shapes are 0 connected by an arc (a straight line is the default). =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Vsevolod (Simon) Ilyushchenko Esimonf@cshl.eduE. Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/fixedwidth.pm000555001750001750 2147512366325116 22672 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::fixedwidth; use strict; use base 'Bio::Graphics::Glyph::box'; use Carp 'cluck'; use constant TOP_SPACING => 8; sub my_description { return < [ 'integer', 0, 'Width of the content.'], fixed_height => [ 'integer', undef, 'Height of the content. If undef, then the glyph -height is used.'], fixed_gap => [ 'integer', 8, 'Vertical gap between the box that shows the extent of the', 'feature and the fixed-width content. If -fixed_gap is less', 'than 8 then the diagonal connecting lines are not drawn.'], } } sub pad_left { my $self = shift; my $pl = $self->SUPER::pad_left; my $width = $self->width; my $needed = $self->width_needed; my $extra = ($needed-$width)/2 + 1; if ($extra > $pl) { return $extra; } else { return $pl; } } sub pad_right { my $self = shift; my $pr = $self->SUPER::pad_right; my $width = $self->width; my $needed = $self->width_needed; my $extra = ($needed-$width)/2; $extra = 0 if $extra < 0; if ($extra > 0 && $extra > $pr) { return $extra; } else { return $pr-$extra; } } sub width_needed { my $self = shift; $self->option('fixed_width'); } sub height_needed { my $self = shift; my $h = $self->option('fixed_height'); return $h if defined $h; return $self->SUPER::height; } sub height { shift->height_needed; } sub span_height { shift->option('span_height') || 3; } sub top_spacing { my $self = shift; my $spacing = $self->option('fixed_gap'); return $spacing if defined $spacing; return TOP_SPACING; } sub pad_top { my $self = shift; my $top = $self->SUPER::pad_top; return $top + $self->top_spacing + $self->span_height; } sub maxdepth { 0 } sub draw { my $self = shift; my $gd = shift; my ($dx,$dy) = @_; my($x1,$y1,$x2,$y2) = $self->bounds(@_); my $width = $self->width_needed; my $xmid = ($x1+$x2) / 2; my $top = $y1 - $self->span_height-$self->top_spacing; my $bottom = $y2; my $left = $xmid - $width/2; my $right = $xmid + $width/2; my $fgcolor = $self->fgcolor; my $span_height = $self->span_height; $self->filled_box($gd,$x1,$top,$x2,$top+$span_height); if ($self->top_spacing >= 8) { $top += $span_height; $gd->line($x1,$top+2,$x1,$top+4,$fgcolor); $gd->line($x2,$top+2,$x2,$top+4,$fgcolor); $gd->line($x1,$top+4,$left,$y1-4,$fgcolor); $gd->line($x2,$top+4,$right,$y1-4,$fgcolor); $gd->line($left,$y1-4,$left,$y1-2,$fgcolor); $gd->line($right,$y1-4,$right,$y1-2,$fgcolor); } $self->draw_contents($gd,$left,$y1,$right,$y2); my $pl = $self->pad_left; $self->draw_label($gd,$dx-$pl,$dy) if $self->option('label'); $self->draw_description($gd,$dx-$pl,$dy) if $self->option('description'); } sub draw_contents { my $self = shift; my ($gd,$left,$top,$right,$bottom) = @_; $self->filled_box($gd,$left,$top,$right,$bottom); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::fixedwidth - A base class fixed width glyphs =head1 SYNOPSIS use Bio::Graphics; use Bio::Seq; use Bio::SeqFeature::Generic; my $bsg = 'Bio::SeqFeature::Generic'; my $seq = Bio::Seq->new(-length=>1000); my $whole = $bsg->new(-display_name => 'Clone82', -start => 1, -end => $seq->length); my $f1 = $bsg->new(-start => 100, -end => 300, -display_name => 'feature 1', ); my $f2 = $bsg->new(-start => 500, -end => 800, -display_name => 'feature 2', ); my $panel = Bio::Graphics::Panel->new(-length => $seq->length, -width => 800, -key_style => 'between', -pad_left => 10, -pad_right => 10, ); $panel->add_track($whole, -glyph => 'arrow', -double => 1, -tick => 2, -label => 1, ); $panel->add_track([$f1,$f2], -glyph => 'fixedwidth', -label => 1, -fixed_height => 20, -fixed_width => 20, -key => 'fixed width'); binmode STDOUT; print $panel->png; =head1 DESCRIPTION This glyph is a base class for glyphs that wish to draw a fixed width content, such as an icon, image, scatterplot, and it would be inappropriate for the content to be stretched to match the start and end point of the associated feature. Instead the glyph draws a simple box spanning the feature's start:end region, two diagonal connecting lines, and then a fixed width rectangle beneath the box. This glyph does nothing very interesting itself. It is intended that subclasses should override the draw_contents() method to draw something interesting. See "Subclassing" for a simple example. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) The following additional options are available to the "fixedwidth" glyph: Option Description Default ------ ----------- ------- -fixed_width Width of the content 0 -fixed_height Height of the content Same as -height -fixed_gap Vertical gap between the box 8 that shows the extent of the feature and the fixed-width content. If -fixed_gap is less than 8 then the diagonal connecting lines are not drawn. =head2 EXAMPLE SUBCLASS To draw something interesting in the fixed rectangle, override the draw_contents method. It takes four arguments consisting of the GD object, and the left, top, right and bottom coordinates of the fixed rectangle. Example: package Bio::Graphics::Glyph::fixedexample; use strict; use base 'Bio::Graphics::Glyph::fixedwidth'; sub draw_contents { my $self = shift; my ($gd,$left,$top,$right,$bottom) = @_; $self->unfilled_box($gd,$left,$top,$right,$bottom); $gd->line($left,$top,$right,$bottom,$self->fgcolor); $gd->line($left,$bottom,$right,$top,$self->fgcolor); } 1; This will draw the outline of the fixed rectangle. The rectangle will contain two diagonal lines. Not very interesting, but an example, nonetheless. See the stackedplot glyph for a more interesting subclass. =head1 BUGS AND LIMITATIONS This glyph should used as the base for the image glyph, but isn't. This will be fixed. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2007 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/translation.pm000555001750001750 3101012366325116 23053 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::translation; use strict; use Bio::Graphics::Util qw(frame_and_offset); use base qw(Bio::Graphics::Glyph::generic); my %default_colors = qw( frame0f cornflowerblue frame1f blue frame2f darkblue frame0r magenta frame1r red frame2r darkred ); # turn off description sub description { 0 } # turn off label # sub label { 1 } sub default_color { my ($self,$key) = @_; return $self->factory->translate_color($default_colors{$key}); } sub height { my $self = shift; my $font = $self->mono_font; my $lines = $self->translation_type eq '3frame' ? 3 : $self->translation_type eq '6frame' ? 6 : 1; return $self->protein_fits ? $lines*$font->height : $self->SUPER::height; } sub pixels_per_base { my $self = shift; return $self->scale; } sub pixels_per_residue { my $self = shift; return $self->scale * 3; } sub gridcolor { my $self = shift; my $color = $self->option('gridcolor') || 'lightgrey'; $self->factory->translate_color($color); } sub show_sequence { my $self = shift; my $show_sequence = $self->option('show_sequence'); return 1 unless defined $show_sequence; # default to true return $show_sequence; } sub triletter_code { my $self = shift; my $triletter_code = $self->option("triletter_code"); return 0 unless defined $triletter_code; # default to false return $triletter_code; } sub longprotein_fits { my $self = shift; return unless $self->show_sequence; my $pixels_per_residue = $self->pixels_per_residue; my $font = $self->mono_font; my $font_width = $font->width * 4; # not 3; leave room for whitespace return $pixels_per_residue >= $font_width; } sub translation_type { my $self = shift; return $self->option('translation') || '1frame'; } sub arrow_height { my $self = shift; $self->option('arrow_height') || 1; } sub show_stop_codons { my $self = shift; my $show = $self->option('stop_codons'); return $show if defined $show; return 1; } sub show_start_codons { my $self = shift; my $show = $self->option('start_codons'); return $show if defined $show; return 0; } sub strand { my $self = shift; return $self->option('strand') || '+1'; } sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->bounds(@_); my $type = $self->translation_type; my $strand = $self->strand; my @strands = $type eq '6frame' ? (1,-1) : $strand > 0 ? (1) : -1; my @phase = (0,1,2); for my $s (@strands) { for (my $i=0; $i < @phase; $i++) { $self->draw_frame($self->feature,$s,$i,$phase[$i],$gd,$x1,$y1,$x2,$y2); } } } sub draw_frame { my $self = shift; my ($feature,$strand,$base_offset,$phase,$gd,$x1,$y1,$x2,$y2) = @_; my ($seq,$pos); $seq = $self->get_dna($feature) or return; # no sequence, arggh. my $strand0 = $strand; $strand *= -1 if $self->{flip}; $pos = $strand < 0 ? $feature->end : $feature->start; my ($frame,$offset) = frame_and_offset($pos,$strand,$phase); # warn "frame=$frame, phase=$phase"; my ($x1_orig,$x2_orig) = ($x1,$x2); # remember this for arrowheads ($strand >= 0 ? $x1 : $x2) += $self->pixels_per_base * $offset; my $y0 = $y1; my $lh; if ($self->translation_type eq '6frame') { $lh = $self->height / 6; $y1 += $lh * $frame; $y1 += $self->height/2 if $strand < 0; } else { $lh = $self->height / 3; $y1 += $lh * $frame; } $y1 = $y0 + ($self->height - ($y1-$y0)) - $lh if $self->{flip}; $y2 = $y1; my $codon_table = $self->option('codontable') || $self->option('geneticcode') || 1; # the dreaded difference between a Bio::SeqFeature and a Bio::Seq my $realseq = $self->get_seq($feature); return unless $realseq; $realseq = $realseq->revcom if $strand < 0; my $protein = $realseq->translate(undef,undef,$base_offset,$codon_table)->seq; my $k = $strand >= 0 ? 'f' : 'r'; my $color = $self->color("frame$frame$k") || $self->color("frame$frame") || $self->default_color("frame$frame$k") || $self->fgcolor; my $awo = 0; if ($self->protein_fits) { $self->draw_protein(\$protein,$strand,$color,$gd,$x1,$y1,$x2,$y2); $awo += $self->mono_font->height/2; } else { $self->draw_orfs(\$protein,$strand,$color,$gd,$x1,$y1,$x2,$y2); } $strand0 > 0 ? $self->arrowhead($gd,$x2_orig+5,$y1+$awo,3,+1) : $self->arrowhead($gd,$x1_orig-5,$y1+$awo,3,-1) } sub draw_protein { my $self = shift; my ($protein,$strand,$color,$gd,$x1,$y1,$x2,$y2) = @_; my $pixels_per_base = $self->pixels_per_base; my $font = $self->mono_font; my $flip = $self->{flip}; my $left = $self->panel->left; my $right = $self->panel->right; my $longprotein = $self->triletter_code && $self->longprotein_fits; my %abbrev = ( A => "Ala", B => "Asx", C => "Cys", D => "Asp", E => "Glu", F => "Phe", G => "Gly", H => "His", I => "Ile", J => "???", K => "Lys", L => "Leu", M => "Met", N => "Asn", O => "???", P => "Pro", Q => "Gln", R => "Arg", S => "Ser", T => "Thr", U => "Sec", V => "Val", W => "Trp", X => "Xaa", Y => "Tyr", Z => "Glx", '*' => " * ", ); my @residues = split '',$$protein; my $fontwidth = $font->width; for (my $i=0;$i<@residues;$i++) { my $x = $strand > 0 ? $x1 + 3 * $i * $pixels_per_base : $x2 - 3 * $i * $pixels_per_base - $pixels_per_base; next if $x+1 < $x1; last if $x > $x2; if ($flip) { $x -= $pixels_per_base - $font->width - 1; #align right, not left if ($longprotein) { $gd->string($font,$right-($x-$left+$pixels_per_base)+1,$y1,$abbrev{$residues[$i]},$color); } else { $gd->char($font,$right-($x-$left+$pixels_per_base)+2,$y1,$residues[$i],$color); } } else { if ($longprotein) { $gd->string($font, $x+1, $y1, $abbrev{$residues[$i]}, $color); } else { $gd->char($font,$x+2,$y1,$residues[$i],$color); } } } } sub draw_orfs { my $self = shift; my ($protein,$strand,$color,$gd,$x1,$y1,$x2,$y2) = @_; my $pixels_per_base = $self->pixels_per_base * 3; $y1++; my $right = $self->panel->right; my $left = $self->panel->left; my $flip = $self->{flip}; my $gcolor = $self->gridcolor; $gd->line($x1,$y1,$x2,$y1,$gcolor); if ($self->show_stop_codons) { my $stops = $self->find_codons($protein,'*'); for my $stop (@$stops) { my $pos = $strand > 0 ? $x1 + $stop * $pixels_per_base : $x2 - $stop * $pixels_per_base; next if $pos+1 < $x1; last if $pos > $x2; if ($flip) { $gd->line($right-($pos-$left),$y1-2,$right-($pos-$left),$y1+2,$color); } else { $gd->line($pos,$y1-2,$pos,$y1+2,$color); } } } my $arrowhead_height = $self->arrow_height; if ($self->show_start_codons) { my $starts = $self->find_codons($protein,'M'); for my $start (@$starts) { my $pos = $strand > 0 ? $x1 + $start * $pixels_per_base : $x2 - $start * $pixels_per_base; next if $pos+1 < $x1; last if $pos > $x2; $pos = $self->{flip} ? $right - $pos : $pos; # little arrowheads at the start codons $strand > 0 ? $self->arrowhead($gd,$pos-$arrowhead_height,$y1, $arrowhead_height,+1) : $self->arrowhead($gd,$pos+$arrowhead_height,$y1, $arrowhead_height,-1) } } $strand *= -1 if $flip; } sub find_codons { my $self = shift; my $protein = shift; my $codon = shift || '*'; my $pos = -1; my @stops; while ( ($pos = index($$protein,$codon,$pos+1)) >= 0) { push @stops,$pos; } \@stops; } sub make_key_feature { my $self = shift; my @gatc = qw(g a t c); my $offset = $self->panel->offset; my $scale = 1/$self->scale; # base pairs/pixel my $start = $offset; my $stop = $offset + 100 * $scale; my $seq = join('',map{$gatc[rand 4]} (1..500)); my $feature = Bio::Graphics::Feature->new(-start=> $start, -end => $stop, -seq => $seq, -name => $self->option('key') ); $feature; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::translation - The "6-frame translation" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws the conceptual translation of DNA sequences. At high magnifications, it simply draws lines indicating open reading frames. At low magnifications, it draws a conceptual protein translation. Options can be used to set 1-frame, 3-frame or 6-frame translations. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -translation Type of translation to 1frame perform. One of "1frame", "3frame", or "6frame" -strand Forward (+1) or reverse (-1) +1 translation. -frame0 Color for the first frame fgcolor -frame1 Color for the second frame fgcolor -frame2 Color for the third frame fgcolor -gridcolor Color for the horizontal lightgrey lines of the reading frames -start_codons Draw little arrowheads 0 (false) indicating start codons -stop_codons Draw little vertical ticks 1 (true) indicating stop codons -arrow_height Height of the start codon 1 arrowheads -show_sequence Show the amino acid sequence 1 (true) if there's room. -triletter_code Show the 3-letter amino acid 0 (false) code if there's room -codontable Codon table to use 1 (see Bio::Tools::CodonTable) =head1 SUGGESTED STANZA FOR GENOME BROWSER This produces a nice gbrowse display in which the DNA/GC Content glyph is sandwiched between the forward and reverse three-frame translations. The frames are color-coordinated with the example configuration for the "cds" glyph. [TranslationF] glyph = translation global feature = 1 frame0 = cadetblue frame1 = blue frame2 = darkblue height = 20 fgcolor = purple strand = +1 translation = 3frame key = 3-frame translation (forward) [DNA/GC Content] glyph = dna global feature = 1 height = 40 do_gc = 1 fgcolor = red axis_color = blue [TranslationR] glyph = translation global feature = 1 frame0 = darkred frame1 = red frame2 = crimson height = 20 fgcolor = blue strand = -1 translation = 3frame key = 3-frame translation (reverse) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/span.pm000555001750001750 370312366325116 21446 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::span; use strict; use base qw(Bio::Graphics::Glyph::anchored_arrow); sub no_trunc { 0 } sub arrowheads {0,0,1,1} 1; __END__ =head1 NAME Bio::Graphics::Glyph::span - The "span" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a span that looks like this: |-----------------------------| If one or both ends go off the edges of the panel, they are truncated: ----------------------| left end off picture |---------------------------- right end off picture ------------------------------------- both ends off picture =head1 OPTIONS The standard options are recognized. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/cds.pm000555001750001750 4265312366325116 21305 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::cds; use strict; use Bio::Graphics::Glyph::segments; use Bio::Graphics::Util qw(frame_and_offset); use Bio::Tools::CodonTable; use base qw(Bio::Graphics::Glyph::segmented_keyglyph Bio::Graphics::Glyph::translation); sub my_description { return < [ 'color', undef, 'Color for the first (+) frame. If undefined, uses the bgcolor.'], frame1f => [ 'color', undef, 'Color for the second (+) frame. If undefined, uses the bgcolor.'], frame2f => [ 'color', undef, 'Color for the third (+) frame. If undefined, uses the bgcolor.'], frame0r => [ 'color', undef, 'Color for the first (-) frame. If undefined, uses the bgcolor.'], frame1r => [ 'color', undef, 'Color for the first (-) frame. If undefined, uses the bgcolor.'], frame2r => [ 'color', undef, 'Color for the third (-) frame. If undefined, uses the bgcolor.'], gridcolor => [ 'color', 'lightslategray', 'Color for the "staff".'], translation => [ ['3frame','6frame'], '3frame', 'Number of lines of reading frames to show.', 'For best results, specify a height of at least 30 pixels for "6frame",', 'and at least 15 pixels for 3frame.'], sixframe => [ 'boolean', undef, 'Draw a six-frame staff. This option overrides -translation,', 'which essentially does the same thing.'], require_subparts => [ 'boolean', undef, "Don't try to draw reading frames unless the feature has subparts."], sub_part => [ 'string', undef, 'For features with multiple subpart types, define which one is the CDS', 'part that contains phase information.'], codontable => [ 'integer', 1, 'Which codon table to use for translations, see L.'], phase_style => [ ['012','021'], '012', 'The way the phase method is to be interpreted. See the manual page of this', 'glyph for an explanation.'], ignore_empty_phase => [ 'boolean', undef, 'Only draw features that have a phase defined.'], cds_only => [ 'boolean', undef, 'Only draw features of type "CDS".'], } } my %default_colors = qw( frame0f cornflowerblue frame1f blue frame2f darkblue frame0r magenta frame1r red frame2r darkred ); my %swap_phase = ( 0 => 0, 1 => 2, 2 => 1, '' => 0); sub connector { 0 }; sub description { my $self = shift; return if $self->level; return $self->SUPER::description; }; sub default_color { my ($self,$key) = @_; return $self->factory->translate_color($default_colors{$key}); } sub sixframe { my $self = shift; return $self->{sixframe} if exists $self->{sixframe}; my $sixframe = $self->option('sixframe'); $sixframe = $self->option('translation') eq '6frame' unless defined $sixframe; return $self->{sixframe} = $sixframe; } sub maxdepth { 1 }; sub require_subparts { my $self = shift; my $rs = $self->option('require_subparts'); $rs = $self->feature->type eq 'coding' if !defined $rs; # shortcut for the "coding" aggregator $rs; } sub ignore_undef_phase { shift->option('ignore_empty_phase'); } sub ignore_non_cds { shift->option('cds_only'); } sub phase_style { shift->option('phase_style') || '012'; } # figure out (in advance) the color of each component sub draw { my $self = shift; my ($gd,$left,$top) = @_; $self->panel->startGroup($gd); my @parts = $self->parts; @parts = $self if !@parts && $self->level == 0 && !$self->require_subparts; my $fits = $self->protein_fits; my $strand = $self->feature->strand || 1; # draw the staff (musically speaking) if ($self->level == 0) { my ($x1,$y1,$x2,$y2) = $self->bounds($left,$top); my $line_count = $self->sixframe ? 6 : 3; my $height = ($y2-$y1)/$line_count; my $grid = $self->gridcolor; for (0..$line_count-1) { my $offset = $y1+$height*$_+1; $gd->line($x1,$offset,$x2,$offset,$grid); # with three-frame translation, the position of the arrows changes depending on # the strand of the feature. With six-frame translation, we draw the first three # staff lines with an arrow to the right, and the second three to the left my $forward = ($line_count == 6) ? ($_ < 3) : ($strand > 0); if ($forward) { $gd->line($x2,$offset,$x2-2,$offset-2,$grid); $gd->line($x2,$offset,$x2-2,$offset+2,$grid); } else { $gd->line($x1,$offset,$x1+2,$offset-2,$grid); $gd->line($x1,$offset,$x1+2,$offset+2,$grid); } } } $self->{cds_part2color} ||= {}; my $fill = $self->bgcolor; # figure out the colors of each part # sort minus strand features backward @parts = map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [$_, $_->left ] } @parts if $strand < 0; my $codon_table = $self->option('codontable'); $codon_table = 1 unless defined $codon_table; my $translate_table = Bio::Tools::CodonTable->new(-id=>$codon_table); my $ignore_undef_phase = $self->ignore_undef_phase; my $ignore_non_cds = $self->ignore_non_cds; my $broken_phase = $self->phase_style eq '021'; for (my $i=0; $i < @parts; $i++) { my $part = $parts[$i]; my $feature = $part->feature; my $type = $feature->can('method') ? $feature->method : $feature->can('type') ? $feature->type : ''; next if ($self->option('sub_part') && $type ne $self->option('sub_part')); next if $ignore_non_cds && lc($type) ne 'cds'; my $pos = $feature->strand >= 0 ? $feature->start : $feature->end; my $phase = $feature->can('phase') ? $feature->phase # bioperl uses "frame" but this is incorrect usage :$feature->can('frame') ? $feature->frame :undef; next if $ignore_undef_phase && !defined($phase); $phase ||= 0; $phase = $swap_phase{$phase} if $broken_phase; my $strand = $feature->strand; my ($frame,$offset) = frame_and_offset($pos, $strand, $phase); my $suffix = $strand < 0 ? 'r' : 'f'; my $key = "frame$frame$suffix"; $self->{cds_frame2color}{$key} ||= $self->color($key) || $self->default_color($key) || $fill; $part->{cds_partcolor} = $self->{cds_frame2color}{$key}; $part->{cds_frame} = $frame; $part->{cds_offset} = $offset; if ($self->do_cds_translation && (my $seq = $feature->seq)) { BLOCK: { $seq = $self->get_seq($seq); # do in silico splicing in order to find the codon that # arises from the splice my $protein = $seq->translate(undef,undef,$phase,$codon_table)->seq; $part->{cds_translation} = $protein; length $protein >= $feature->length/3 and last BLOCK; ($feature->length - $phase) % 3 == 0 and last BLOCK; my $next_part = $parts[$i+1] or do { $part->{cds_splice_residue} = '?'; last BLOCK; }; my $next_feature = $next_part->feature or last BLOCK; my $next_phase = eval {$next_feature->phase} or last BLOCK; my $splice_codon = ''; my $left_of_splice = substr($self->get_seq($feature->seq), -$next_phase, $next_phase); my $right_of_splice = substr($self->get_seq($next_feature->seq),0 , 3-$next_phase); $splice_codon = $left_of_splice . $right_of_splice; length $splice_codon == 3 or last BLOCK; my $amino_acid = $translate_table->translate($splice_codon); $part->{cds_splice_residue} = $amino_acid; } } } $self->Bio::Graphics::Glyph::generic::draw($gd,$left,$top); $self->panel->endGroup($gd); } sub do_cds_translation { return shift->protein_fits } # draw the notes on the staff sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->bounds(@_); my $color = $self->{cds_partcolor} or return; my $feature = $self->feature; my $frame = $self->{cds_frame}; my $linecount = $self->sixframe ? 6 : 3; unless ($self->protein_fits && $self->{cds_translation}) { my $height = ($y2-$y1)/$linecount; my $offset = $y1 + $height*$frame; $offset += ($y2-$y1)/2 if $self->sixframe && $self->strand < 0; # ugh. This works, but I don't know why $offset = $y1 + (($y2-$y1) - ($offset-$y1))-$height if $self->{flip}; $gd->filledRectangle($x1,$offset,$x2,$offset+2,$color); return; } # we get here if there's room to draw the primary sequence my $font = $self->mono_font; my $pixels_per_residue = $self->pixels_per_residue; my $strand = $feature->strand; my $y = $y1-1; my $fontwidth = $font->width; $strand *= -1 if $self->{flip}; $y += ($y2-$y1)/2 if $self->sixframe && $strand < 0; # have to remap feature start and end into pixel coords in order to: # 1) correctly align the amino acids with the nucleotide seq # 2) correct for the phase offset my $start = $self->map_no_trunc($feature->start + $self->{cds_offset}); my $stop = $self->map_no_trunc($feature->end + $self->{cds_offset}); ($start,$stop) = ($stop,$start) if $stop < $start; # why does this keep happening? my @residues = split '',$self->{cds_translation}; push @residues,$self->{cds_splice_residue} if $self->{cds_splice_residue}; for (my $i=0;$i<@residues;$i++) { my $x = $strand > 0 ? $start + $i * $pixels_per_residue : $stop - $i * $pixels_per_residue; next unless ($x >= $x1 && $x <= $x2); $x -= $fontwidth + 1 if $self->{flip}; # align right when flipped $gd->char($font,$x+1,$y,$residues[$i],$color); } } sub make_key_feature { my $self = shift; my @gatc = qw(g a t c); my $offset = $self->panel->offset; my $scale = 1/$self->scale; # base pairs/pixel my $start = $offset; my $stop = $offset + 100 * $scale; my $seq = join('',map{$gatc[rand 4]} (1..1500)); my $feature = Bio::Graphics::Feature->new(-start=> $start, -end => $stop, -seq => $seq, -name => $self->option('key'), -strand=> +1, ); $feature->add_segment(Bio::Graphics::Feature->new( -start=> $start, -end => $start + ($stop - $start)/2, -seq => $seq, -name => $self->option('key'), -strand=> +1, ), Bio::Graphics::Feature->new( -start=> $start + ($stop - $start)/2+1, -end => $stop, -seq => $seq, -name => $self->option('key'), -phase=> 1, -strand=> +1, )); $feature; } # never allow our components to bump sub bump { my $self = shift; return $self->SUPER::bump(@_) if $self->all_callbacks; return 0; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::cds - The "cds" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws features that are associated with a protein coding region. At high magnifications, draws a series of boxes that are color-coded to indicate the frame in which the translation occurs. At low magnifications, draws the amino acid sequence of the resulting protein. Amino acids that are created by a splice are optionally shown in a distinctive color. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -strand_arrow Whether to indicate 0 (false) strandedness -hilite Highlight color undef (no color) In addition, the cds glyph recognizes the following glyph-specific options: Option Description Default ------ ----------- ------- -frame0f Color for first (+) frame background color -frame1f Color for second (+) frame background color -frame2f Color for third (+) frame background color -frame0r Color for first (-) frame background color -frame1r Color for second (-) frame background color -frame2r Color for third (-) frame background color -gridcolor Color for the "staff" lightslategray -translation Number of lines of reading 3frame frames to show. One of "3frame", or "6frame". For 6frame, specify a height of at least 30 pixels. -sixframe Draw a six-frame staff 0 (false; usually draws 3 frame) This value overrides -translation, which essentially does the same thing. -require_subparts Don't draw the reading frame 0 false unless it is a feature subpart. -sub_part For objects with multiple undef subpart types, defines which is the CDS part. -codontable Codon table to use 1 (see Bio::Tools::CodonTable) -phase_style The way phase is to be interpreted. One of "012" "012" or "021" -ignore_empty_phase false Only draw features that have their phase defined. -cds_only Only draw features of type false 'CDS' This glyph is more sensitive to the underlying data model than usual, so there are a few additional options to use to help adapt the glyph to different environments. The -require_subparts option is suggested when rendering spliced transcripts which contain multiple CDS subparts. Otherwise, the glyph will hickup when zoomed way down onto an intron between two CDSs (a phantom reading frame will appear). For unspliced sequences, do *not* use -require_subparts. The -phase_style controls how the value returned by the phase() or frame() methods is to be interpreted. The official interpretation is that the phase value indicates the offset into the feature at which the reading frame starts -- e.g. a phase of "2" means the reading frame starts after skipping two bases from the beginning of the feature. However, many GFF2 format feature files interpret this field to mean the position reading frame of the first base of the feature -- e.g. a phase of "2" means that the reading frame starts after skipping just one base from the beginning of the feature. Specify "012" to interpret the phase field in the correct way, and "021" to interpret the phase field in the legacy way. The default is "012." Here is how the option names were chosen: * * * Base the reading frame starts on A B C A B C A B C... 0 1 2 PHASE REPRESENTED CORRECTLY 0 2 1 PHASE REPRESENTED IN THE LEGACY WAY Set the -ignore_empty_phase option to true if you wish to skip subfeatures that do not have a defined phase() or frame(). This is useful if you are rendering exons that have both translated and untranslated parts, and you wish to skip the untranslated parts. Set the -cds_only option to true if you wish to draw the glyph only for subfeatures of type 'CDS'. This is recommended. =head1 SUGGESTED STANZA FOR GENOME BROWSER Using the "coding" aggregator, this produces a nice gbrowse display. [CDS] feature = coding glyph = cds frame0f = cadetblue frame1f = blue frame2f = darkblue frame0r = darkred frame1r = red frame2r = crimson description = 0 height = 13 label = CDS frame key = CDS citation = This track shows CDS reading frames. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/triangle.pm000555001750001750 752212366325116 22315 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::triangle; # DAS-compatible package to use for drawing a triangle use strict; use base qw(Bio::Graphics::Glyph::point_glyph); sub pad_left { my $self = shift; my $left = $self->SUPER::pad_left; return $left unless $self->option('point'); my $extra = $self->option('height')/3; return $extra > $left ? $extra : $left; } sub pad_right { my $self = shift; my $right = $self->SUPER::pad_right; return $right unless $self->option('point'); my $extra = $self->option('height')/3; return $extra > $right ? $extra : $right; } sub orient { my $self = shift; my $o = $self->option('orient'); $o = $self->option('direction') unless defined $o; return $o || 'S'; } sub draw_component { my $self = shift; my $gd = shift; my $fg = $self->fgcolor; my $orient = $self->option('orient') || 'S'; # find the center and vertices my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $xmid = ($x1+$x2)/2; my $ymid = ($y1+$y2)/2; my ($vx1,$vy1,$vx2,$vy2,$vx3,$vy3); #make an equilateral my ($p,$q) = ($self->option('height'),($x2-$x1)/2); if ($self->option('point')){ $q = $p/sqrt(3); #2; $x1 = $xmid - $q; $x2 = $xmid + $q; $y1 = $ymid - $q; $y2 = $ymid + $q; } if ($orient eq 'S'){$vx1=$x1;$vy1=$y1;$vx2=$x2;$vy2=$y1;$vx3=$xmid;$vy3=$y2;} elsif($orient eq 'N'){$vx1=$x1;$vy1=$y2;$vx2=$x2;$vy2=$y2;$vx3=$xmid;$vy3=$y1;} elsif($orient eq 'W'){$vx1=$x2;$vy1=$y1;$vx2=$x2;$vy2=$y2;$vx3=$x2-$q*2;$vy3=$ymid;} elsif($orient eq 'E'){$vx1=$x1;$vy1=$y1;$vx2=$x1;$vy2=$y2;$vx3=$x1+$q*2;$vy3=$ymid;} # now draw the triangle my $poly_pkg = $self->polygon_package; my $poly = $poly_pkg->new(); $poly->addPt($vx1,$vy1); $poly->addPt($vx2,$vy2); $poly->addPt($vx3,$vy3); if (my $c = $self->bgcolor){ $gd->filledPolygon($poly,$c); } $gd->polygon($poly,$fg); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::triangle - The "triangle" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws an equilateral triangle when -point is defined. It draws an isoceles triangle otherwise. It is possible to draw the triangle with the base on the N, S, E, or W side. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -point If true, the triangle 0 will drawn at the center of the range, and not scaled to the feature width. -orient On which side shall the S base be? (NSEW) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/rainbow_gene.pm000555001750001750 2455012366325116 23167 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::rainbow_gene; use strict; use base qw(Bio::Graphics::Glyph::gene Bio::Graphics::Glyph::heat_map); sub my_descripton { return <red), or gradients progressing through the colors of the rainbow (magenta->blue->green->yelloe->red) can be created. For example: # a white->red heat map start_color = white stop_color = red # a rainbow start_color = magenta stop_color = red # green->yellow->red start_color = green stop_color = red This glyph is a subclass of the gene and heat_maps glyphs, and recognizes the same options. END } sub my_options { { transcript_only => [ 'boolean', undef, 'If true, thes score of the transcript or mRNA feature will be '. 'will be used to calculate the background color. Otherwise the '. 'score of exon sub-features are used' ], } } sub draw { my $self = shift; my @parts = $self->parts; @parts = $self if !@parts && $self->level == 0; return $self->SUPER::draw(@_) unless @parts; my $top_score = $self->feature->score if $self->option('transcript_only'); $self->calculate_gradient(\@parts); my $low_rgb = $self->low_rgb; for my $part (@parts) { my $score = $top_score || $part->feature->score; unless (defined $score && $self->score_range ) { $part->{partcolor} = $self->color_index(@$low_rgb); } else { my @rgb = $self->calculate_color($score); $part->{partcolor} = $self->color_index(@rgb); } } return $self->SUPER::draw(@_); } sub extra_arrow_length { my $self = shift; return 0 unless $self->{level} == 1; local $self->{level} = 0; # fake out superclass return $self->SUPER::extra_arrow_length; } sub pad_left { my $self = shift; my $type = $self->feature->primary_tag; return 0 unless $type =~ /gene|mRNA/; $self->SUPER::pad_left; } sub pad_right { my $self = shift; return 0 unless $self->{level} < 2; # don't invoke this expensive call on exons my $strand = $self->feature->strand; $strand *= -1 if $self->{flip}; my $pad = $self->SUPER::pad_right; return $pad unless defined($strand) && $strand > 0; my $al = $self->arrow_length; return $al > $pad ? $al : $pad; } sub pad_bottom { my $self = shift; return 0 unless $self->{level} < 2; # don't invoke this expensive call on exons return $self->SUPER::pad_bottom; } sub pad_top { my $self = shift; return 0 unless $self->{level} < 2; # don't invoke this expensive call on exons return $self->SUPER::pad_top; } sub bump { my $self = shift; return 1 # top level bumps, other levels don't unless specified in config if $self->{level} == 0 && lc $self->feature->primary_tag eq 'gene'; return $self->SUPER::bump; } sub label { my $self = shift; return unless $self->{level} < 2; if ($self->label_transcripts && $self->{feature}->primary_tag =~ /RNA|pseudogene/i) { return $self->_label; } else { return $self->SUPER::label; } } sub label_position { my $self = shift; return 'top' if $self->{level} == 0; return 'left'; } sub label_transcripts { my $self = shift; return $self->{label_transcripts} if exists $self->{label_transcripts}; return $self->{label_transcripts} = $self->_label_transcripts; } sub _label_transcripts { my $self = shift; return $self->option('label_transcripts'); } sub draw_connectors { my $self = shift; if ($self->feature->primary_tag eq 'gene') { my @parts = $self->parts; return if @parts && $parts[0] =~ /rna|transcript|pseudogene/i; } $self->SUPER::draw_connectors(@_); } sub maxdepth { my $self = shift; my $md = $self->Bio::Graphics::Glyph::maxdepth; return $md if defined $md; return 2; } sub _subfeat { my $class = shift; my $feature = shift; if ($feature->primary_tag =~ /^gene/i) { my @transcripts; for my $t (qw/mRNA tRNA snRNA snoRNA miRNA ncRNA pseudogene/) { push @transcripts, $feature->get_SeqFeatures($t); } return @transcripts if @transcripts; return $feature->get_SeqFeatures; # no transcripts?! return whatever's there } elsif ($feature->primary_tag =~ /^CDS/i) { my @parts = $feature->get_SeqFeatures(); return ($feature) if $class->{level} == 0 and !@parts; return @parts; } my @subparts; if ($class->option('sub_part')) { @subparts = $feature->get_SeqFeatures($class->option('sub_part')); } elsif ($feature->primary_tag =~ /^mRNA/i) { @subparts = $feature->get_SeqFeatures(qw(CDS five_prime_UTR three_prime_UTR UTR)); } else { @subparts = $feature->get_SeqFeatures('exon'); } # The CDS and UTRs may be represented as a single feature with subparts or as several features # that have different IDs. We handle both cases transparently. my @result; foreach (@subparts) { if ($_->primary_tag =~ /CDS|UTR/i) { my @cds_seg = $_->get_SeqFeatures; if (@cds_seg > 0) { push @result,@cds_seg } else { push @result,$_ } } else { push @result,$_; } } # fall back to drawing a solid box if no subparts and level 0 return ($feature) if $class->{level} == 0 && !@result; return @result; } sub bgcolor { my $self = shift; return defined $self->{partcolor} ? $self->{partcolor} : $self->SUPER::bgcolor; } sub fgcolor { my $self = shift; return $self->option('vary_fg') ? $self->bgcolor : $self->SUPER::fgcolor; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::gene - A GFF3-compatible gene glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used for drawing genes that may have alternatively-spliced transcripts. The various isoforms are stacked on top of each other and given a single label and description that apply to the entire stack. Each individual transcript's name is optionally printed to the left of the transcript glyph. Transcripts (splice isoforms) are drawn using the processed_transcript glyph. CDS features are drawn in the background color, and the UTRs are drawn in an alternate color selected by the utr_color option. In addition, you can make the UTRs thinner than the CDS by setting the "thin_utr" option. This glyph is designed to work properly with GFF3-style three-tier genes, in which the top level feature has the Sequence Ontology type of "gene", the second level feature(s) have the SO type "mRNA", and the third level feature(s) have the SO type "CDS", "five_prime_utr" and "three_prime_utr." Subparts named "UTR" are also honored. The feature can contain other subparts as well (e.g. exon, intron, translation), but they are currently ignored unless the option sub_part is supplied. If the sub_part option is used that feature type will be used and CDS and UTR features will be excluded. This could be used for specifying that exons be used instead, for example. This glyph is a subclass of processed_transcript, and recognizes the same options. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type undef (false) -connector_color Connector color black -label Whether to draw a label undef (false) -description Whether to draw a description undef (false) -strand_arrow Whether to indicate undef (false) strandedness -hilite Highlight color undef (no color) In addition, the gene glyph recognizes the following glyph-specific options: Option Description Default ------ ----------- ------- -label_transcripts undef (false) Flag. If true, then the display name of each transcript will be drawn to the left of the transcript glyph. -thin_utr Flag. If true, UTRs will undef (false) be drawn at 2/3 of the height of CDS segments. -utr_color Color of UTR segments. Gray #D0D0D0 -decorate_introns Draw strand with little arrows undef (false) on the intron. The B<-adjust_exons> and B<-implied_utrs> options are inherited from processed_transcript, but are quietly ignored. Please use the processed_transcript glyph for this type of processing. =head1 BUGS The SO terms are hard-coded. They should be more flexible and should recognize ISA relationships. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/primers.pm000555001750001750 751612366325116 22174 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::primers; # package to use for drawing something that looks like # primer pairs. use strict; use base qw(Bio::Graphics::Glyph::generic); use constant HEIGHT => 8; # override draw method sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $height = $self->option('height') || $self->option('size') || HEIGHT; my $fg = $self->fgcolor; my $a2 = $height/2; my $center = $y1 + $a2; # just draw us as a solid line -- very simple if ($x2-$x1 < $height*2) { $gd->line($x1,$center,$x2,$center,$fg); return; } # otherwise draw two pairs of arrows # --> <-- my $trunc_left = $x1 < $self->panel->left; my $trunc_right = $x2 > $self->panel->right; unless ($trunc_left) { $gd->setThickness(2) if $height > 6; $gd->line($x1,$center,$x1 + $height,$center,$fg); $gd->line($x1 + $height,$center,$x1 + $height - $a2,$center-$a2,$fg); $gd->line($x1 + $height,$center,$x1 + $height - $a2,$center+$a2,$fg); $gd->setThickness(1); } unless ($trunc_right) { $gd->setThickness(2) if $height > 6; $gd->line($x2,$center,$x2 - $height,$center,$fg); $gd->line($x2 - $height,$center,$x2 - $height + $a2,$center+$a2,$fg); $gd->line($x2 - $height,$center,$x2 - $height + $a2,$center-$a2,$fg); $gd->setThickness(1); } # connect the dots if requested if ($self->connect) { my $c = $self->color('connect_color') || $self->bgcolor; $gd->line($x1 + ($trunc_left ? 0 : $height + 2),$center, $x2 - ($trunc_right ? 0 : $height + 2),$center, $c); } # add a label if requested $self->draw_label($gd,@_) if $self->option('label'); $self->draw_description($gd,@_) if $self->option('description'); } sub connect { my $self = shift; return $self->option('connect') if defined $self->option('connect'); 1; # default } 1; __END__ =head1 NAME Bio::Graphics::Glyph::primers - The "STS primers" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws two arrows oriented towards each other and connected by a line of a contrasting color. The length of the arrows is immaterial, but the length of the glyph itself corresponds to the length of the scaled feature. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -connect Whether to connect the true two arrowheads by a line. -connect_color The color to use for the bgcolor connecting line. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/dna.pm000555001750001750 3511712366325116 21273 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::dna; use strict; use base qw(Bio::Graphics::Glyph::generic); my %complement = (g=>'c',a=>'t',t=>'a',c=>'g',n=>'n', G=>'C',A=>'T',T=>'A',C=>'G',N=>'N'); sub my_description { return < [ 'boolean', 1, 'Whether to draw the GC graph at low magnifications.'], gc_window=> [ 'integer', undef, 'Size of the sliding window to use in the GC content', 'calculation. If this is not defined, non-overlapping', 'bins will be used. If this is set to "auto", then the', 'glyph will choose a window equal to 1% of the interval.'], gc_bins => [ 'integer', 100, 'Fixed number of intervals to sample across the track.'], axis_color => [ 'color', 'black', 'Color of the vertical axes in the GC content graph.'], strand => [ [qw(forward reverse both auto)], 'auto', 'Show both forward and reverse strand, one of "forward", "reverse",', '"both" or "auto". In "auto" mode, +1 strand features will', 'show the plus strand, -1 strand features will', 'show the reverse complement and strandless features will show both.'], }; } # turn off description sub description { 0 } # turn off label # sub label { 1 } sub pad_top { my $self = shift; my $font = $self->mono_font; my $pt = $self->SUPER::pad_top; return $self->dna_fits ? $pt + $font->height+5 : 16; } sub height { my $self = shift; my $font = $self->mono_font; return $self->dna_fits ? 2*$font->height : $self->do_gc ? $self->SUPER::height : 0; } sub do_gc { my $self = shift; my $do_gc = $self->option('do_gc'); return if defined($do_gc) && !$do_gc; return 1; } sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->bounds(@_); my $dna = eval { $self->feature->seq }; $dna = $dna->seq if ref($dna) and $dna->can('seq'); # to catch Bio::PrimarySeqI objects $dna or return; # workaround for my misreading of interface -- LS $dna = $dna->seq if ref($dna) && $dna->can('seq'); if ($self->dna_fits) { $self->draw_dna($gd,$dna,$x1,$y1,$x2,$y2); } elsif ($self->do_gc) { $self->draw_gc_content($gd,$dna,$x1,$y1,$x2,$y2); } } sub draw_dna { my $self = shift; my ($gd,$dna,$x1,$y1,$x2,$y2) = @_; my $pixels_per_base = $self->scale; my $feature = $self->feature; my $strand = $feature->strand || 1; $strand *= -1 if $self->{flip}; my @bases = split '',$strand >= 0 ? $dna : $self->reversec($dna); my $color = $self->fgcolor; my $font = $self->mono_font; my $lineheight = $font->height; $y1 -= $lineheight/2 - 3; my $strands = $self->option('strand') || 'auto'; my ($forward,$reverse); if ($strands eq 'auto') { $forward = $feature->strand >= 0; $reverse = $feature->strand <= 0; } elsif ($strands eq 'both') { $forward = $reverse = 1; } elsif ($strands eq 'reverse') { $reverse = 1; } else { $forward = 1; } # minus strand features align right, not left $x1 += $pixels_per_base - $font->width - 1 if $strand < 0; for (my $i=0;$i<@bases;$i++) { my $x = $x1 + $i * $pixels_per_base; $gd->char($font,$x+2,$y1,$bases[$i],$color) if $forward; $gd->char($font,$x+2,$y1+($forward ? $lineheight:0), $complement{$bases[$i]}||$bases[$i],$color) if $reverse; } } sub draw_gc_content { my $self = shift; my $gd = shift; my $dna = shift; my ($x1,$y1,$x2,$y2) = @_; $dna = $self->reversec($dna) if $self->{flip}; my $font = $self->mono_font; # get the options that tell us how to draw the GC content my $bin_size = length($dna) / ($self->option('gc_bins') || 100); $bin_size = 10 if $bin_size < 10; my $gc_window = $self->option('gc_window'); # if ($gc_window && $gc_window eq 'auto' or $gc_window <= length($dna)) { if ($gc_window) { if ($gc_window eq 'auto') { $gc_window = length($dna)/100; } elsif ($gc_window > length($dna)) { $gc_window = length($dna); } } # Calculate the GC content... my (@bins, @datapoints, $i); my $gc = 0; my $maxgc = -1000; my $mingc = +1000; if ($gc_window) { # ...using a sliding window... my @dna = split '', $dna; for ($i = 0; $i < @dna; $i++) { if ($dna[$i] eq 'G' or $dna[$i] eq 'C' or $dna[$i] eq 'g' or $dna[$i] eq 'c') { $dna[$i] = 1; } else { $dna[$i] = 0; } } for ($i = 0; $i < $gc_window; $i++) {$gc += $dna[$i]} push @datapoints, $gc; $datapoints[$#datapoints] > $maxgc and $maxgc = $datapoints[$#datapoints]; $datapoints[$#datapoints] < $mingc and $mingc = $datapoints[$#datapoints]; for ($i = 0; $i < @dna - $gc_window; $i++) { $gc -= $dna[$i]; $gc += $dna[$i + $gc_window]; push @datapoints, $gc; $datapoints[$#datapoints] > $maxgc and $maxgc = $datapoints[$#datapoints]; $datapoints[$#datapoints] < $mingc and $mingc = $datapoints[$#datapoints]; } my $scale = $maxgc - $mingc; $scale = 1 unless $scale; for ($i = 0; $i < @datapoints; $i++) { $datapoints[$i] = ($datapoints[$i] - $mingc) / $scale; } $maxgc = int($maxgc * 100 / $gc_window); $mingc = int($mingc * 100 / $gc_window); } else { # ...or a fixed number of bins. for (my $i = 0; $i < length($dna) - $bin_size; $i+= $bin_size) { my $subseq = substr($dna,$i,$bin_size); my $gc = $subseq =~ tr/gcGC/gcGC/; my $content = $gc/$bin_size; $maxgc = $content if ($content > $maxgc); $mingc = $content if ($content < $mingc); push @bins,$content; } my $scale = $maxgc - $mingc; foreach (my $i; $i < @bins; $i++) { $bins[$i] = $scale != 0 ? ($bins[$i] - $mingc) / $scale : 0; } $maxgc = int($maxgc * 100); $mingc = int($mingc * 100); } # Calculate values that will be used in the layout push @bins,0.5 unless @bins; # avoid div by zero my $bin_width = ($x2-$x1)/@bins; my $bin_height = $y2-$y1; my $fgcolor = $self->fgcolor; my $bgcolor = $self->factory->translate_color( $self->option('grid color') || $self->panel->gridmajorcolor ); my $axiscolor = $self->color('axis_color') || $fgcolor; # Draw the axes my $fontwidth = $font->width; $gd->line($x1, $y1, $x1, $y2, $axiscolor); $gd->line($x2-2,$y1, $x2-2,$y2, $axiscolor); $gd->line($x1, $y1, $x1+3,$y1, $axiscolor); $gd->line($x1, $y2, $x1+3,$y2, $axiscolor); $gd->line($x1, ($y2+$y1)/2,$x1+3,($y2+$y1)/2,$axiscolor); $gd->line($x2-4,$y1, $x2-1, $y1, $axiscolor); $gd->line($x2-4,$y2, $x2-1, $y2, $axiscolor); $gd->line($x2-4,($y2+$y1)/2,$x2-1,($y2+$y1)/2,$axiscolor); $gd->line($x1+5,$y2, $x2-5,$y2, $bgcolor); $gd->line($x1+5,($y2+$y1)/2,$x2-5,($y2+$y1)/2,$bgcolor); $gd->line($x1+5,$y1, $x2-5,$y1, $bgcolor); $gd->string($self->font,$x1-$self->string_width('% gc',$self->font),$y1,'% gc',$axiscolor) if $bin_height > $self->font_height($font)*2; # If we are using a sliding window, the GC graph will be scaled to use the full # height of the glyph, so label the right vertical axis to show the scaling that# is in effect $gd->string($self->font,$x2+3,$y1,"${maxgc}%",$axiscolor) if $bin_height > $self->font_height*2.5; $gd->string($self->font,$x2+3,$y2-$self->font_height,"${mingc}%",$axiscolor) if $bin_height > $self->font_height*2.5; # Draw the GC content graph itself if ($gc_window) { my $graphwidth = $x2 - $x1; # the $points_to_draw variable here can be used in various ways to adjust the # sampling of the graphic output. It could be converted to a glphy # option that can be set by user. Here we are just using $graphwidth # my $points_to_draw = 1800; my $points_to_draw = $graphwidth; # if $points_to_draw is taken to mean the total number of points to show along the graph then my $inc = int (length($dna) / $points_to_draw) + 1; # it might be useful to set this to the x pixel resolution of your # screen or the "default width" option in the gbrowse config file or current pixel width # if $points_to_draw is taken to mean the number of points per $gc_window length then # my $inc = int ($gc_window / $points_to_draw) + 1; my $gc_window_width = $gc_window * $self->panel->scale; # pixels for the gc_window length my $scale = ($graphwidth - $gc_window_width) / @datapoints; for ($i = $inc; $i < @datapoints; $i += $inc) { my $x = $i + $gc_window / 2; # the base at the center of the gc_window my $xlo = $x1 + ($x - $inc) * $scale; # pixel coordinate for previous point my $xhi = $x1 + $x * $scale; $gd->line($xlo, $y2 - ($bin_height * $datapoints[$i-$inc]), $xhi, $y2 - ($bin_height * $datapoints[$i]), $fgcolor); } } else { for (my $i = 0; $i < @bins; $i++) { my $bin_start = $x1+$i*$bin_width; my $bin_stop = $bin_start + $bin_width; my $y = $y2 - ($bin_height*$bins[$i]); $gd->line($bin_start,$y, $bin_stop,$y, $fgcolor); $gd->line($bin_stop,$y, $bin_stop,$y2 - ($bin_height*$bins[$i+1]), $fgcolor) if $i < @bins-1; } } } sub make_key_feature { my $self = shift; my @gatc = qw(g a t c); my $offset = $self->panel->offset; my $scale = 1/$self->scale; # base pairs/pixel my $start = $offset+1; my $stop = $offset+100*$scale; my $feature = Bio::Graphics::Feature->new(-start=> $start, -stop => $stop, -seq => join('',map{$gatc[rand 4]} (1..500)), -name => $self->option('key'), -strand => '+1', ); $feature; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::dna - The "dna" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws DNA sequences. At high magnifications, this glyph will draw the actual base pairs of the sequence (both strands). At low magnifications, the glyph will plot the GC content. By default, the GC calculation will use non-overlapping bins, but this can be changed by specifying the gc_window option, in which case, a sliding window calculation will be used. For this glyph to work, the feature must return a Bio::PrimarySeq DNA object in response to the seq() method. For example, you can use a Bio::SeqFeature::Generic object with an attached Bio::PrimarySeq like this: my $dna = Bio::PrimarySeq->new( -seq => 'A' x 1000 ); my $feature = Bio::SeqFeature::Generic->new( -start => 1, -end => 800 ); $feature->attach_seq($dna); $panel->add_track( $feature, -glyph => 'dna' ); A Bio::Graphics::Feature object may also be used. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -do_gc Whether to draw the GC true graph at low mags -gc_window Size of the sliding window EnoneE to use in the GC content calculation. If this is not defined, non- overlapping bins will be used. If this is set to "auto", then the glyph will choose a window equal to 1% of the interval. -gc_bins Fixed number of intervals 100 to sample across the panel. -axis_color Color of the vertical axes fgcolor in the GC content graph -strand Show both forward and auto reverse strand, one of "forward", "reverse", "both" or "auto". In "auto" mode, +1 strand features will show the plus strand -1 strand features will show the reverse complement and strandless features will show both NOTE: -gc_window=E'auto' gives nice results and is recommended for drawing GC content. The GC content axes draw slightly outside the panel, so you may wish to add some extra padding on the right and left. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE. Sliding window GC calculation added by Peter Ashton Epda@sanger.ac.ukE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/hat.pm000555001750001750 603112366325116 21256 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::hat; # a simple inverted V (used by DAS) use strict; use base qw(Bio::Graphics::Glyph::line); sub my_description { return <fgcolor; my $center = ($high+$low)/2; my $middle = ($left+$right)/2; $gd->line($left,$center,$middle,$high,$fg); $gd->line($middle,$high,$right,$center,$fg); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::hat - The "hat" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws an inverted V parallel to the sequence segment. It is different from other glyphs in that it is designed to work with DAS tracks. The inverted V is drawn BETWEEN subparts as if you specified a connector type of "hat". =head2 OPTIONS This glyph takes only the standard options. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -strand_arrow Whether to indicate 0 (false) strandedness -hilite Highlight color undef (no color) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/group.pm000555001750001750 722312366325116 21642 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::group; use strict; use base qw(Bio::Graphics::Glyph::segmented_keyglyph); sub my_description { return < [ 'boolean', undef, 'Attach a label to the group; this is independent of the label option which applies', 'to features within the group' ], group_label_position => [ [qw(top left)], 'left', 'Position in which to draw the group label.' ], } } # group sets connector to 'dashed' sub connector { my $self = shift; my $super = $self->SUPER::connector(@_); return $super if $self->all_callbacks; return 'dashed' unless defined($super) && ($super eq 'none' or !$super); } # we don't label group (yet) sub label { my $self = shift; return $self->{_group_label} if exists $self->{_group_label}; return $self->{_group_label} = $self->option('group_label') ? $self->feature->display_name : '' } sub labelfont { my $self = shift; return $self->getfont('groupfont','gdMediumBoldFont'); } sub pad_left { my $self = shift; return 0 unless $self->option('group_label'); return $self->string_width($self->label,$self->labelfont) +3; } sub draw { my $self = shift; $self->SUPER::draw(@_) if $self->feature_has_subparts; $self->draw_label(@_) if $self->option('group_label'); } sub draw_label { my $self = shift; my $label = $self->label or return; my $panel= $self->panel; $self->SUPER::draw_label(@_) unless $panel->{suppress_key}; my ($gd,$left,$top,$partno,$total_parts) = @_; my $font = $self->labelfont; my $x = $self->left + $left; # valid for both "top" and "left" because the left-hand side is defined by pad_left my $y; if ($self->label_position eq 'top') { $x += $self->pad_left; # offset to beginning of the drawn part of the feature $x = $panel->left + 1 if $x <= $panel->left; $y = $self->top + $top - 1; } elsif ($self->label_position eq 'left') { $y = $self->{top} + ($self->height - $self->font_height($font))/2 + $top; $y = $self->{top} + $top if $y < $self->{top} + $top; } $panel->add_key_box($self,$label,$x,$y); } sub label_position { my $self = shift; my $pos = $self->option('group_label_position') || 'left'; return $pos; } sub new { my $self = shift; return $self->SUPER::new(@_,-level=>-1); } # don't allow simple bumping in groups -- it looks terrible... sub bump { my $self = shift; my $bump = $self->SUPER::bump(@_); return 1 if $bump > 1; return -1 if $bump < -1; return $bump; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::group - The "group" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used internally by Bio::Graphics::Panel for laying out groups of glyphs that move in concert. It should not be used explicitly. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/ideogram.pm000555001750001750 5047712366325116 22326 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::ideogram; # Glyph to draw chromosome ideograms use strict qw/vars refs/; use vars '@ISA'; use GD; use base qw(Bio::Graphics::Glyph::generic Bio::Graphics::Glyph::heat_map); sub my_description { return < [ 'string', ' gneg:white gpos25:silver gpos50:gray gpos:gray gpos75:darkgray gpos100:black acen:cen gvar:var', 'This option is redefined to map each chromosome band\'s "stain" attribute', 'into a color or pattern. The default value is saying to use ', '"white" for features whose stain attribute is', '"gneg", "silver" for those whose stain attribute is "gpos25", and so', 'on. Several special values are recognized: "B" draws a narrower', 'gray region and is usually used to indicate an acrocentric', 'stalk. "B" creates a diagonal black-on-white pattern if B<-pattern> is enabled.', '"B" draws a centromere.', 'If -bgcolor is just a color name, like "yellow", the glyph will ignore', 'all bands and just draw a filled in chromosome.'], bgfallback => [ 'color', 'yellow', 'Color to use when no bands are present.'], pattern => [ 'boolean', undef, 'Enable drawing a vertical line pattern for centromeres and "var" regions.', 'This is off by default due to an intermittent gd2 library crash on certain 64-bit platforms.'], } } sub demo_feature { my $self = shift; my $data = <can('new'); my $db = Bio::Graphics::FeatureFile->new(-text=>$data) or die; return $db->get_features_by_name('Chr22'); } sub bgfallback { my $self = shift; return $self->option('bgfallback') || 'yellow'; } sub bgcolor { my $self = shift; my $bgcolor = $self->option('bgcolor'); return $bgcolor if defined $bgcolor; return 'gneg:white gpos25:silver gpos50:gray gpos:gray gpos75:darkgray gpos100:black acen:cen gvar:var'; } sub can_pattern { my $self = shift; return unless $self->option('pattern'); return $self->panel->image_class !~ /svg/i; } sub draw { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; my $fstart = $self->feature->start; my $fstop = $self->feature->end; my @parts = $self->parts; # Draw the sides for the whole chromosome (in case # there are missing data). $self->draw_component(@_) if $self->level == 0; if (@parts) { $left += $self->left + $self->pad_left; $top += $self->top + $self->pad_top; } else { @parts = ($self); } # Make unaggregated bands invisible if requested. # This is for making image maps for individual # bands of whole aggregate chromosomes. $self->{invisible} ||= $self->option('invisible') unless @parts > 1; $parts[0]->{single}++ if @parts == 1; # if the bands are subfeatures of an aggregate chromosome, # we can draw the centomere and telomeres last to improve # the appearance my @last; for my $part (@parts) { push @last, $part and next if $part->feature->primary_tag =~ /centromere/i || $part->feature->start <= $fstart || $part->feature->end >= $fstop; my $tile = $part->create_tile('left'); $part->draw_component($gd,$left,$top); } for my $part (@last) { my $tile; if ($part->feature->method =~ /centromere/) { $tile = $self->create_tile('right'); } else { $tile = $part->create_tile('left'); } my $status = $part->{single} ? 'single' : $part->feature->method =~ /centromere/ ? 'centromere' : $part->feature->start <= $fstart ? 'left telomere' : $part->feature->end >= $fstop ? 'right telomere' : undef; $part->draw_component($gd,$left,$top,$status); } $self->draw_label(@_) if $self->option('label'); $self->draw_description(@_) if $self->option('description'); } sub draw_component { my $self = shift; my $gd = shift; my ($x,$y,$status) = @_; my $feat = $self->feature; my $arcradius = $self->option('arcradius') || 7; my ($x1, $y1, $x2, $y2 ) = $self->bounds(@_); return if $x2 <= $self->panel->left; return if $x1 >= $self->panel->right; $x2 = $self->panel->right if $x2 > $self->panel->right; # force odd width so telomere arcs are centered $y2 ++ if ($y2 - $y1) % 2; my ($stain) = $feat->get_tag_values('stain'); ($stain) = $feat->get_tag_values('Stain') unless $stain; # Some genome sequences don't contain substantial telomere sequence (i.e. Arabidopsis) # We can suggest their presence at the tips of the chromosomes by setting fake_telomeres = 1 # in the configuration file, resulting in the tips of the chromosome being painted black. my $fake_telomeres = $self->option('fake_telomeres') || 0; my $bgcolor_index = $self->bgcolor; if ((my $fallback = $self->bgfallback) && !$stain) { $bgcolor_index = $fallback; } elsif ($bgcolor_index =~ /\w+:/) { ($bgcolor_index) = $self->bgcolor =~ /$stain:(\S+)/ if $stain; ($bgcolor_index,$stain) = qw/white none/ if !$stain; } my $black = $gd->colorAllocate( 0, 0, 0 ); my $cm_color = $self->{cm_color} ||= $self->cm_color; my $var_color = $self->{var_color} ||= $self->var_color; my $bgcolor = $self->factory->translate_color($bgcolor_index); my $fgcolor = $self->fgcolor; # special color for gvar bands if ( $bgcolor_index =~ /var/) { $bgcolor = $self->can_pattern ? gdTiled : $var_color; } if ( $feat->method !~ /centromere/i && $stain ne 'acen') { # are we at the end of the chromosome? if (($status eq 'single' || $status eq 'left telomere') && $stain ne 'tip') { # left telomere my $state = $status eq 'single' ? -1 : $self->panel->flip ? 0 : 1; $bgcolor = $black if $fake_telomeres; $self->draw_telomere( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor, $arcradius, $state ); } elsif ($status eq 'right telomere' && $stain ne 'tip') { # right telomere my $state = $self->panel->flip ? 1 : 0; $bgcolor = $black if $fake_telomeres; $self->draw_telomere( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor, $arcradius, $state ); } # or a stalk? elsif ( $stain eq 'stalk') { $self->draw_stalk( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor ); } # or a regular band? else { $self->draw_cytoband( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor ); $self->draw_outline( $gd,$x1,$y1,$x2,$y2,$bgcolor,$fgcolor) if $bgcolor_index =~ /var/i; } } # or a centromere? else { if ( $self->can_pattern ) { my $tile = $self->create_tile('right'); $self->draw_centromere( $gd, $x1, $y1, $x2, $y2, gdTiled, $fgcolor ); } else { $self->draw_centromere( $gd, $x1, $y1, $x2, $y2, $cm_color, $fgcolor ); } } } sub draw_cytoband { my $self = shift; my ( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor) = @_; # draw the filled box $self->filled_box($gd,$x1,$y1,$x2,$y2,$bgcolor,$bgcolor); # outer border $gd->line($x1,$y1,$x2,$y1,$fgcolor); $gd->line($x1,$y2,$x2,$y2,$fgcolor); } sub draw_outline { my $self = shift; my ( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor) = @_; # side borders $gd->line($x1,$y1,$x1,$y2,$fgcolor); $gd->line($x2,$y1,$x2,$y2,$fgcolor); } sub draw_centromere { my $self = shift; my ( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor ) = @_; # blank slate $self->wipe(@_); # draw a sort of hour-glass shape to represent the centromere my $poly = GD::Polygon->new; $poly->addPt( $x1, $y1 ); $poly->addPt( $x1, $y2 ); $poly->addPt( $x2, $y1 ); $poly->addPt( $x2, $y2 ); $gd->filledPolygon( $poly, $bgcolor ); # filled $gd->line( $x2 - 1, $y1 + 1, $x2 - 1, $y2 - 1, $fgcolor ); $gd->polygon( $poly, $fgcolor ); # outline } sub draw_telomere { my $self = shift; my ($gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor, $arcradius, $state ) = @_; # blank slate $self->wipe(@_); # For single, unaggregated bands, make the terminal band # a bit wider to accomodate the arc if ($self->{single}) { $x1 -= 5 if $state == 1; $x2 += 5 if $state == 0; } # state should be one of: # 0 right telomere # 1 left telomere # -1 round at both ends (whole chromosome) my $outline++ if $state == -1; my $arcsize = $y2 - $y1; my $bwidth = $x2 - $x1; my $new_x1 = $x1 + $arcradius - 1; my $new_x2 = $x2 - $arcradius; my $new_y = $y1 + int($arcsize/2 + 0.5); my $orange = $self->panel->translate_color('lemonchiffon'); my $bg = $self->panel->bgcolor; $self->draw_cytoband( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor ); $self->draw_outline( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor ); if ( $state ) { # left telomere my $x = $new_x1; my $y = $new_y; # erase extra stuff $gd->line($x1,$y1,$x1+5,$y1,$bg); $gd->line($x1,$y1,$x1,$y2,$bg); $gd->line($x1,$y2,$x1+5,$y2,$bg); $gd->arc( $x, $y, $arcradius * 2, $arcsize, 90, 270, $fgcolor); # erase off-target colors $gd->fill($x1+1,$y1+1,$bg); $gd->fill($x1+1,$y2-1,$bg); } if ( $state < 1 ) { # right telomere my $x = $new_x2; my $y = $new_y; # erase extra stuff $gd->line($x2-5,$y1,$x2,$y1,$bg); $gd->line($x2,$y1,$x2,$y2,$bg); $gd->line($x2-5,$y2,$x2,$y2,$bg); $gd->arc( $x, $y, $arcradius * 2, $arcsize, 270, 90, $fgcolor); # erase off-target colors $gd->fill($x2-1,$y1+1,$bg); $gd->fill($x2-1,$y2-1,$bg); } unless ( $self->can_pattern ) { $self->draw_cytoband( $gd, $new_x1 - 1, $y1 + 2, $new_x1 + 1, $y2 - 2, $bgcolor, $bgcolor ); } } # for acrocentric stalk structure, draw a narrower cytoband sub draw_stalk { my $self = shift; my ( $gd, $x1, $y1, $x2, $y2, $bgcolor, $fgcolor, $inset ) = @_; # blank slate $self->wipe(@_); my $height = $self->height; $inset ||= $height > 10 ? int( $height / 10 + 0.5 ) : 2; $_[2] += $inset; $_[4] -= $inset; $self->draw_cytoband(@_); $gd->line( $x1, $y1, $x1, $y2, $fgcolor ); $gd->line( $x2, $y1, $x2, $y2, $fgcolor ); } sub create_tile { my $self = shift; my $direction = shift; my $gd = $self->panel->gd; return unless $gd->can('setTile'); # Prepare tile to use for filling an area my $tile; if ( $direction eq 'right' ) { $tile = GD::Image->new(3,3); my $black = $tile->colorAllocate(0,0,0); my $white = $tile->colorAllocate(255,255,255); $tile->filledRectangle(0, 0, 3, 3, $white); $tile->line( 0, 0, 3, 3, $black); } elsif ( $direction eq 'left' ) { $tile = GD::Image->new(4,4); my $black = $tile->colorAllocate(0,0,0); my $white = $tile->colorAllocate(255,255,255); $tile->filledRectangle(0,0,4,4, $white); $tile->line( 4, 0, 0, 4, $black); } $gd->setTile($tile); return $tile; } # This overrides the Glyph::parts method until I # can figure out how the bands get mangled there sub parts { my $self = shift; my $f = $self->feature; my $level = $self->level + 1; my @subf = sort {$a->start <=> $b->start} $f->get_SeqFeatures; return $self->factory->make_glyph($level,@subf); } # erase anthing that might collide. This is for # clean telomeres, centromeres and stalks sub wipe { my $self = shift; my $whitewash = $self->panel->bgcolor; $self->filled_box(@_[0..4],$whitewash,$whitewash); } # Disable bumping entirely, since it messes up the ideogram sub bump { return 0; } sub cm_color { my $self = shift; my $bgcolor = $self->bgcolor; my ($c) = $bgcolor =~ /cen:(\S+)/; $c ||= 'lightgrey'; return $self->translate_color($c); } sub var_color { my $self = shift; my $bgcolor = $self->bgcolor; my ($c) = $bgcolor =~ /var:(\S+)/; $c ||= '#805080'; return $self->translate_color($c); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::ideogram - The "ideogram" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a section of a chromosome ideogram. It relies on certain data from the feature to determine which color should be used (stain) and whether the segment is a telomere or centromere or a regular cytoband. The centromeres and 'var'-marked bands are rendered with diagonal black-on-white patterns if the "-patterns" option is true, otherwise they are rendered in dark gray. This is to prevent a libgd2 crash on certain 64-bit platforms when rendering patterned images. The cytobandband features would typically be formatted like this in GFF3: ... ChrX UCSC cytoband 136700001 139000000 . . . Parent=ChrX;Name=Xq27.1;Alias=ChrXq27.1;stain=gpos75; ChrX UCSC cytoband 139000001 140700000 . . . Parent=ChrX;Name=Xq27.2;Alias=ChrXq27.2;stain=gneg; ChrX UCSC cytoband 140700001 145800000 . . . Parent=ChrX;Name=Xq27.3;Alias=ChrXq27.3;stain=gpos100; ChrX UCSC cytoband 145800001 153692391 . . . Parent=ChrX;Name=Xq28;Alias=ChrXq28;stain=gneg; ChrY UCSC cytoband 1 1300000 . . . Parent=ChrY;Name=Yp11.32;Alias=ChrYp11.32;stain=gneg; which in this case is a GFF-ized cytoband coordinate file from UCSC: http://hgdownload.cse.ucsc.edu/goldenPath/hg16/database/cytoBand.txt.gz and the corresponding GBrowse config options would be like this to create an ideogram overview track for the whole chromosome: The 'chromosome' feature below would aggregated from bands and centromere using the default chromosome aggregator [CYT:overview] feature = chromosome glyph = ideogram fgcolor = black bgcolor = gneg:white gpos25:silver gpos50:gray gpos:gray gpos75:darkgray gpos100:black acen:cen gvar:var arcradius = 6 height = 25 bump = 0 label = 0 A script to reformat UCSC annotations to GFF3 format can be found at the end of this documentation. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) The following options are specific to the ideogram glyph. Option Description Default ------ ----------- ------- -bgcolor Band coloring string none -bgfallback Coloring to use when no bands yellow are present B<-bgcolor> is used to map each chromosome band's "stain" attribute into a color or pattern. It is a string that looks like this: gneg:white gpos25:silver gpos50:gray \ gpos:gray gpos75:darkgray gpos100:black acen:cen gvar:var This is saying to use "white" for features whose stain attribute is "gneg", "silver" for those whose stain attribute is "gpos25", and so on. Several special values are recognized: "B" draws a narrower gray region and is usually used to indicate an acrocentric stalk. "B" creates a diagonal black-on-white pattern. "B" draws a centromere. If -bgcolor is just a color name, like "yellow", the glyph will ignore all bands and just draw a filled in chromosome. If -bgfallback is set to a color name or value, then the glyph will fall back to the indicated background color if the chromosome contains no bands. =head1 UCSC TO GFF CONVERSION SCRIPT The following short script can be used to convert a UCSC cytoband annotation file into GFF format. If you have the lynx web-browser installed you can call it like this in order to download and convert the data in a single operation: fetchideogram.pl http://hgdownload.cse.ucsc.edu/goldenPath/hg18/database/cytoBand.txt.gz Otherwise you will need to download the file first. Note the difference between this script and input data from previous versions of ideogram.pm: UCSC annotations are used in place of NCBI annotations. #!/usr/bin/perl use strict; my %stains; my %centros; my %chrom_ends; foreach (@ARGV) { if (/^(ftp|http|https):/) { $_ = "lynx --dump $_ |gunzip -c|"; } elsif (/\.gz$/) { $_ = "gunzip -c $_ |"; } print STDERR "Processing $_\n"; } print "##gff-version 3\n"; while(<>) { chomp; my($chr,$start,$stop,$band,$stain) = split /\t/; $start++; $chr = ucfirst($chr); if(!(exists($chrom_ends{$chr})) || $chrom_ends{$chr} < $stop) { $chrom_ends{$chr} = $stop; } my ($arm) = $band =~ /(p|q)\d+/; $stains{$stain} = 1; if ($stain eq 'acen') { $centros{$chr}->{$arm}->{start} = $stop; $centros{$chr}->{$arm}->{stop} = $start; next; } $chr =~ s/chr//i; print qq/$chr\tUCSC\tcytoband\t$start\t$stop\t.\t.\t.\tParent=$chr;Name=$chr;Alias=$chr$band;stain=$stain;\n/; } foreach my $chr(sort keys %chrom_ends) { my $chr_orig = $chr; $chr =~ s/chr//i; print qq/$chr\tUCSC\tcentromere\t$centros{$chr_orig}->{p}->{stop}\t$centros{$chr_orig}->{q}->{start}\t.\t+\t.\tParent=$chr;Name=$chr\_cent\n/; } =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Gudmundur A. Thorisson Emummi@cshl.eduE Copyright (c) 2001-2006 Cold Spring Harbor Laboratory =head1 CONTRIBUTORS Sheldon McKay Emckays@cshl.edu This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/scale.pm000555001750001750 477712366325116 21610 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::scale; use strict; use base qw(Bio::Graphics::Glyph::segmented_keyglyph Bio::Graphics::Glyph::xyplot); sub my_description { return <calculate_boundaries($dx,$dy); $self->panel->startGroup($gd); my $max_score = $self->max_score || 100; my $min_score = $self->min_score || 0; $max_score = Bio::Graphics::Glyph::xyplot::max10($max_score); $min_score = Bio::Graphics::Glyph::xyplot::min10($min_score); my $height = $bottom - $top; my $scale = $max_score > $min_score ? $height/($max_score-$min_score) : 1; my $x = $left; my $y = $top + $self->pad_top; # position of "0" on the scale my $y_origin = $min_score <= 0 ? $bottom - (0 - $min_score) * $scale : $bottom; $y_origin = $top if $max_score < 0; $self->panel->startGroup($gd); $self->_draw_scale($gd,$scale,$min_score,$max_score,$dx,$dy,$y_origin); $self->panel->endGroup($gd); } sub _determine_side { my $self = shift; return 'three'; } # Added pad_top subroutine (pad_top of Glyph.pm, which is called when executing $self->pad_top # returns 0, so we need to override it here) sub pad_top { my $self = shift; my $pad = $self->Bio::Graphics::Glyph::generic::pad_top(@_); if ($pad < ($self->font('gdTinyFont')->height)) { $pad = $self->font('gdTinyFont')->height; # extra room for the scale } $pad; } sub pad_left { my $self = shift; my $pad = $self->SUPER::pad_left(@_); return $pad unless $self->option('variance_band'); $pad += length('+1sd')/2 * $self->font('gdTinyFont')->width+3; return $pad; } sub new { my $self = shift; return $self->SUPER::new(@_,-level=>-1); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::scale - The "scale" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used internally by GBrowse to draw a scale bar. It should not be used explicitly. =head1 BUGS Please report them. =head1 SEE ALSO L, =head1 AUTHOR Copyright (c) 2010 Ontario Institute for Cancer Research This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/stackedplot.pm000555001750001750 3107412366325116 23044 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::stackedplot; use strict; use base 'Bio::Graphics::Glyph::fixedwidth'; use GD::Simple; use Carp 'cluck'; use Memoize; memoize('scale_width'); memoize('width_needed'); sub width_needed { my $self = shift; my $column_width = $self->column_width; my $column_spacing = $self->column_spacing; my $columns = $self->data_series; my $needed = @$columns * ($column_width + $column_spacing); return $needed; } #sub pad_right { # my $self = shift; # my $pr = $self->SUPER::pad_right; # my $sw = $self->scale_width; # return $pr+$sw; #} sub pad_right { my $self = shift; my $pr = $self->SUPER::pad_right; my $sw = $self->scale_width + $self->column_width/2; my $content_width = $self->width_needed; my $total = $sw + $content_width; my $additional = $pr - $total; return $pr if $pr > $additional; return $additional; } sub scale_width { my $self = shift; return 0 unless $self->do_draw_scale; my ($min,$max) = $self->min_max; my $middle = ($min+$max)/2; my ($longest) = sort {$b<=>$a} map {length($_)} ($min,$middle,$max); return $longest * $self->scale_font->width; } sub pad_bottom { my $self = shift; my @labels = $self->column_labels; my $bottom = $self->SUPER::pad_bottom; return $bottom unless @labels; return $bottom + $self->font('gdTinyFont')->height; } sub column_width { shift->option('column_width') || 8 } sub column_spacing { shift->option('column_spacing') || 2 } sub maxdepth { 0 } sub min_max { my $self = shift; my $min_score = $self->option('min_score') || 0.0; my $max_score = $self->option('max_score') || 1.0; return ($min_score,$max_score); } # this behaves more like the image glyph -- it draws a generic glyph, two diagonal lines, and then the # plot underneath. sub draw_contents { my $self = shift; my ($gd,$left,$top,$right,$bottom) = @_; my ($min_score,$max_score) = $self->min_max; my $height = $bottom-$top; my $scale = $max_score > $min_score ? $height/($max_score-$min_score) : 1; my $y_origin = $min_score <= 0 ? $bottom - (0 - $min_score) * $scale : $bottom; my $scale_width = $self->scale_width; $y_origin = $top if $max_score < 0; $self->draw_stackedplot($gd,$left,$right,$top,$y_origin,$scale,$min_score,$max_score); $self->draw_scale($gd,$left,$top,$right,$bottom); } sub draw_stackedplot { my $self = shift; my ($gd,$left,$right,$top,$bottom,$scale,$min,$max) = @_; my $fgcolor = $self->fgcolor; my $bgcolor = $self->bgcolor; my @colors = $self->series_colors; my @labels = $self->column_labels; my $column_width = $self->column_width; my $column_spacing = $self->column_spacing; my $font = $self->column_font; my $fwidth = $font->width; my $fontcolor = $self->fontcolor; # data_series() returns 1 or more values to stack upwards # the totals of the values must be no greater than max_score if (my $values = $self->data_series) { my $x_offset = 0; for (my $cluster = 0; $cluster < @$values; $cluster++) { # this will give us a series of data series my $series = $values->[$cluster]; my $y_offset = 0; for (my $i = 0; $i < @$series; $i++) { my $value = $series->[$i]; my $v = $self->clip($value,$min,$max); my $color = $colors[$i] || $bgcolor; my $y = $bottom - ($v-$min) * $scale; my $box_bottom = $bottom - $y_offset; my $box_top = $y - $y_offset; $self->filled_box($gd,$left+$x_offset,$box_top,$left+$column_width+$x_offset,$box_bottom,$color); $y_offset += $box_bottom-$box_top; } if (@labels) { my $x = $left+$x_offset+($column_width-$fwidth*$labels[$cluster])/2-1; $gd->string($font,$x,$bottom,$labels[$cluster],$fontcolor); } $x_offset += $column_spacing+$column_width; } } } sub clip { my $self = shift; my ($value,$min,$max) = @_; $value = $min if defined $min && $value < $min; $value = $max if defined $max && $value > $max; return $value; } sub series_colors { my $self = shift; my $values = $self->option('series_colors'); my @colors; if ($values && !ref $values) { @colors = split /\s+/,$values; } elsif (ref $values eq 'ARRAY') { @colors = @$values; } else { @colors = qw(red blue green orange brown grey black); } return map {$self->translate_color($_)} @colors; } sub column_labels { my $self = shift; my $values = $self->option('column_labels'); my @labels; if ($values && !ref $values) { @labels = split /\s+/,$values; } elsif (ref $values eq 'ARRAY') { @labels = @$values; } return @labels; } # NOTE! # probably data_series should return this: # [series1 => [value1,value2,value3,value4], # series2 => [value1,value2,value3,value4], # series3 => [value1,value2,value3,value4], # ... # ] sub data_series { my $self = shift; my $values = $self->option('series'); return $values if defined $values; # otherwise get it from the feature my @values; my @tagvalues = $self->feature->get_tag_values('series'); for my $v (@tagvalues) { if (ref $v && ref $v eq 'ARRAY') { # already in right format push @values,$v; } else { push @values,[split /[,\s]+/,$v]; } } return \@values; } sub do_draw_scale { my $self = shift; my $drawit = $self->option('draw_scale'); return defined $drawit ? $drawit : 1; } sub scale_font { my $self = shift; $self->getfont('scale_font','gdTinyFont'); } sub column_font { my $self = shift; $self->getfont('column_font','gdSmallFont'); } sub draw_scale { my $self = shift; my ($gd,$left,$top,$right,$bottom) = @_; my ($min,$max) = $self->min_max; $self->panel->startGroup($gd); my $simple = GD::Simple->new($gd); $simple->font($self->scale_font); my $dx = 1; my $dy = $simple->font->height/2; # these drew a vertical scale line, which didn't look very nice # $simple->moveTo($right,$bottom); # $simple->lineTo($right,$top); $simple->moveTo($right,$top); $simple->line(3); $simple->move($dx,$dy); $simple->string($max); $simple->moveTo($right,($bottom+$top)/2); $simple->line(3); $simple->move($dx,$dy); $simple->string(($max+$min)/2); $simple->moveTo($right,$bottom); $simple->line(3); $simple->move($dx,$dy); $simple->string($min); $self->panel->endGroup($gd); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::stackedplot - The stackedplot glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION The stackedplot glyph can be used to draw quantitative feature data using a stacked column plot. It differs from the xyplot glyph in that the plot applies to a single top level feature, not a group of subfeatures. The data to be graphed is derived from an attribute called "data_series." The data to be graphed is represented as a list of arrays: ( [1, 2, 8], [6, 1, 1], [10,8, 0], [1, 1, 1], ) Each array is a column in the stacked plot. Its values become the subdivisions of the column. In this example, there are four columns, each of which has three subdivisions. You can add labels to the columns and change the colors of the subdivisions. To assign data to a feature, you can add a "series" tag: $snp1 = Bio::SeqFeature::Generic ->new (-start => 500,-end=>501, -display_name =>'example', -tag=> { series => [ [10,20,30], [30,30,0], [5,45,10], [5,45,10], [5,45,10], [50,0,50], ], } ); Note that the series tag must consist of an array of arrays. If you are using a gff3 representation, you can load a database with data that looks like this: chr1 test feature 1 1000 . . . series=10 20 30;series=30 30 0;series=5 45 10... If you are using a gff2 representation, you can load a database with data that looks like this: chr1 test feature 1 1000 . . . series 10 20 30; series 30 30 0 series 5 45 10... Or you can pass a callback to the -series option: $panel->add_track(\@data, -glyph => 'stackedplot', -series => sub { my $feature = shift; return [ [10,20,30], [30,30,0], [5,45,10], ] } ); =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition, the alignment glyph recognizes all the options of the xyplot glyph, as well as the following glyph-specific option: Option Description Default ------ ----------- ------- -fixed_gap Vertical distance between 8 the rectangle that shows the start:end range of the feature and the fixed width stacked plot. -series_colors A list giving a series of red,blue,green,orange, color names for the data brown,grey,black series (the values inside each stacked column). -column_labels A list of labels to print -none- underneath each column. -column_width The width of each column. 8 -column_spacing Spacing between each 2 column. -min_score Minimum score for the 0.0 sum of the members of each data series. -max_score Maximum score for the 1.0 sum of the members of each data series. -scale_font Font to use for the scale. gdTinyFont -column_font Font to use for the column gdSmallFont labels. -draw_scale Whether to draw a scale to true right of the columns. Note that -min_score and -max_score represent the minimum and maximum SUM of all the values in the data series. For example, if your largest column contains the series (10,20,30), then the -max_score is 60. =head1 EXAMPLE To understand how this glyph works, try running and modifying the following example: #!/usr/bin/perl use strict; use warnings; use Bio::Graphics; use Bio::SeqFeature::Generic; my $segment = Bio::Graphics::Feature->new(-start=>1,-end=>700); my $snp1 = Bio::SeqFeature::Generic ->new (-start => 500,-end=>590, -display_name =>'fred', -tag=> { series => [ [10,20,30], [30,30,0], [5,45,10], [5,45,10], [5,45,10], [50,0,50], ], }, -source=>'A test', ); my $snp2 = Bio::SeqFeature::Generic->new(-start => 300, -end => 301, -display_name => 'rs12345', -tag=> { series => [ [30,20,10 ], [80,10,10 ], ], }, -source=>'Another test', ); my $panel = Bio::Graphics::Panel->new(-segment=>$segment,-width=>800); $panel->add_track($segment,-glyph=>'arrow',-double=>1,-tick=>2); $panel->add_track([$snp1,$snp2], -height => 50, -glyph => 'stackedplot', -fixed_gap => 12, -series_colors => [qw(red blue lavender)], -column_labels => [qw(a b c d e f g)], -min_score => 0, -max_score => 100, -column_width => 8, -column_font => 'gdMediumBoldFont', -scale_font => 'gdTinyFont', -label => 1, -description=>1, ); print $panel->png; =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2006 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/segments.pm000555001750001750 11761012366325116 22375 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::segments; use strict; use Bio::Location::Simple; use constant RAGGED_START_FUZZ => 25; # will show ragged ends of alignments # up to this many bp. use constant DEBUG => 0; # These are just offsets into an array data structure use constant TARGET => 0; use constant SRC_START => 1; use constant SRC_END => 2; use constant TGT_START => 3; use constant TGT_END => 4; eval { require Bio::Graphics::Browser2::Realign; 1; } || eval { require Bio::Graphics::Browser::Realign; }; use base qw(Bio::Graphics::Glyph::segmented_keyglyph Bio::Graphics::Glyph::generic); my %complement = (g=>'c',a=>'t',t=>'a',c=>'g',n=>'n', G=>'C',A=>'T',T=>'A',C=>'G',N=>'N'); sub my_description { return < [ 'boolean', undef, 'If true, draw the dna residues of the TARGET (aligned) sequence when the', 'magnification level allows.', 'See L.' ], draw_protein_target => [ 'boolean', undef, 'If true, draw the protein residues of the TARGET (aligned) sequence when the', 'magnification level allows.', 'See L.'], ragged_extra => [ 'boolean', undef, 'When combined with -draw_target, draw extra bases beyond the end', 'of the alignment. The value is the maximum number of extra bases.', 'See L.'], show_mismatch => [ 'integer', undef, 'When combined with -draw_target, highlights mismatched bases in', 'the mismatch color. A value of 0 or undef never shows mismatches.', 'A value of 1 shows mismatches at the base pair alignment level, but', 'not at magnifications too low to allow the DNA to be displayed.', 'Any other positive integer will show mismatches when the track is showing', 'a region less than or equal to the specified value.', 'See L.'], mismatch_color => [ 'color', 'lightgrey', 'The color to use for mismatched bases when displaying alignments.', 'See L.'], indel_color => [ 'color', 'lightgrey', 'The color to use for indels when displaying alignments.'], insertion_color => [ 'color', 'green', 'The color to use for insertions when displaying alignments; overrides indel_color'], deletion_color => [ 'color', 'red', 'The color to use for deletions when displaying alignments; overrides indel_color'], mismatch_only => [ 'boolean', undef, 'If true, only print mismatched bases when displaying alignments.'], true_target => [ 'boolean', undef, 'Show the target DNA in its native (plus strand) orientation, even', 'if the alignment is to the minus strand.', 'See L.'], split_on_cigar => [ 'boolean', undef, 'If true, and if the feature contains a CIGAR string as the value of the Gap', 'tag, then split the feature into subparts based on the CIGAR.'], realign => [ 'boolean', undef, 'Attempt to realign sequences at high magnification to account', 'for indels.', 'See L.'], } } sub mismatch_color { my $self = shift; my $c = $self->option('mismatch_color') || 'lightgrey'; return $self->translate_color($c); } sub indel_color { my $self = shift; my $c = $self->option('indel_color'); return $self->mismatch_color unless $c; return $self->translate_color($c); } sub insertion_color { my $self = shift; my $c = $self->option('insertion_color'); $c ||= $self->option('indel_color'); $c ||= $self->my_options->{insertion_color}[1]; return $self->translate_color($c); } sub deletion_color { my $self = shift; my $c = $self->option('deletion_color'); $c ||= $self->option('indel_color'); $c ||= $self->my_options->{deletion_color}[1]; return $self->translate_color($c); } sub show_mismatch { my $self = shift; my $smm = $self->option('show_mismatch'); $smm ||= 1 if $self->option('mismatch_only'); return unless $smm; return 1 if $smm == 1 && $self->dna_fits; return 1 if $smm >= $self->panel->length; } sub mismatch_only { shift->option('mismatch_only') } sub pad_left { my $self = shift; return $self->SUPER::pad_left unless $self->level > 0; my $ragged = $self->option('ragged_start') ? RAGGED_START_FUZZ : $self->option('ragged_extra'); return $self->SUPER::pad_left unless $self->draw_target && $ragged && $self->dna_fits; my $extra = 0; my $target = eval {$self->feature->hit} or return $self->SUPER::pad_left + $extra; return $self->SUPER::pad_left + $extra unless $target->start<$target->end && $target->start < $ragged; return ($target->start-1) * $self->scale + $extra; } sub pad_right { my $self = shift; return $self->SUPER::pad_right unless $self->level > 0; my $ragged = $self->option('ragged_start') ? RAGGED_START_FUZZ : $self->option('ragged_extra'); return $self->SUPER::pad_right unless $self->draw_target && $ragged && $self->dna_fits; my $target = eval {$self->feature->hit} or return $self->SUPER::pad_right; return $self->SUPER::pad_right unless $target->end < $target->start && $target->start < $ragged; return ($target->end-1) * $self->scale; } sub labelwidth { my $self = shift; return $self->SUPER::labelwidth unless $self->draw_target && $self->dna_fits && $self->label_position eq 'left'; return $self->{labelwidth} ||= (length($self->label||'')+1) * $self->mono_font->width; } sub draw_target { my $self = shift; return if $self->option('draw_dna'); return $self->option('draw_target'); } sub draw_protein_target { my $self = shift; return if $self->option('draw_protein'); return $self->option('draw_protein_target'); return $self->option('draw_target'); } sub height { my $self = shift; my $height = $self->SUPER::height; return $height unless $self->draw_target || $self->draw_protein_target; if ($self->draw_target) { return $height unless $self->dna_fits; } if ($self->draw_protein_target) { return $height unless $self->protein_fits; } my $fontheight = $self->mono_font->height; return $fontheight if $fontheight > $height; } # group sets connector to 'solid' sub connector { my $self = shift; return $self->SUPER::connector(@_) if $self->all_callbacks; return ($self->SUPER::connector(@_) || 'solid'); } # never allow our components to bump sub bump { my $self = shift; my $bump = $self->SUPER::bump(@_); return $bump if $self->all_callbacks; return $self->parts_overlap ? $bump : 0; } sub maxdepth { my $self = shift; my $md = $self->Bio::Graphics::Glyph::maxdepth; return $md if defined $md; return 1; } # this was willfully confusing #sub fontcolor { # my $self = shift; # return $self->SUPER::fontcolor unless $self->draw_target;# || $self->option('draw_dna'); # return $self->SUPER::fontcolor unless $self->dna_fits; # return $self->bgcolor; #} # Override _subfeat() method to make it appear that a top-level feature that # has no subfeatures appears as a feature that has a single subfeature. # Otherwise at high mags gaps will be drawn as components rather than # as connectors. Because of differing representations of split features # in Bio::DB::GFF::Feature and Bio::SeqFeature::Generic, there is # some breakage of encapsulation here. sub _subfeat { my $self = shift; my $feature = shift; my @subfeat = $self->SUPER::_subfeat($feature); if (!@subfeat && $self->option('split_on_cigar')) { my $cigar = $self->_get_cigar($feature); if ($cigar && @$cigar) { return $self->_split_on_cigar($feature,$cigar); } } return @subfeat if @subfeat; if ($self->level == 0 && !@subfeat && !$self->feature_has_subparts) { return $self->feature; } else { return; } } sub _split_on_cigar { my $self = shift; my ($feature,$cigar) = @_; my $source_start = $feature->start; my $source_end = $feature->end; my $ss = $feature->strand; my $ts = $feature->hit->strand; my $target_start = eval {$feature->hit->start} || return $feature; my (@parts); # BUG: we handle +/+ and -/+ alignments, but not +/- or -/- # (i.e. the target has got to have forward strand coordinates) # forward strand if ($ss >= 0) { for my $event (@$cigar) { my ($op,$count) = @$event; if ($op eq 'I' || $op eq 'S' || $op eq 'H') { $target_start += $count; } elsif ($op eq 'D' || $op eq 'N') { $source_start += $count; } elsif ($op eq 'P') { # Do NOTHING for pads. Irrelevant for pairwise # alignments, since we cannot show the pad in # the reference sequence } else { # everything else is assumed to be a match -- revisit push @parts,[$source_start,$source_start+$count-1, $target_start,$target_start+$count-1]; $source_start += $count; $target_start += $count; } } # minus strand } else { for my $event (@$cigar) { my ($op,$count) = @$event; if ($op eq 'I' || $op eq 'S' || $op eq 'H') { $target_start += $count; } elsif ($op eq 'D' || $op eq 'N') { $source_end -= $count; } elsif ($op eq 'P') { # do nothing for pads } else { # everything else is assumed to be a match -- revisit push @parts,[$source_end-$count+1,$source_end, $target_start,$target_start+$count-1]; $source_end -= $count; $target_start += $count; } } } my $id = $feature->seq_id; my $tid = $feature->hit->seq_id; my @result = map { my ($s1,$s2,$t1,$t2) = @$_; my $s = Bio::Graphics::Feature->new(-seq_id=> $id, -start => $s1, -end => $s2, -strand => $ss, ); my $h = Bio::Graphics::Feature->new(-seq_id=> $tid, -start => $t1, -end => $t2, -strand => $ts, ); $s->add_hit($h); $s; } @parts; return @result; } sub draw { my $self = shift; my $draw_target = $self->draw_target && $self->dna_fits && eval {$self->feature->hit->seq}; $self->SUPER::draw(@_); return if $self->feature_has_subparts; return unless $draw_target; my $drew_sequence; $drew_sequence = $self->draw_multiple_alignment(@_); my ($gd,$x,$y) = @_; $y += $self->top + $self->pad_top if $drew_sequence; # something is wrong - this is a hack/workaround my $connector = $self->connector; $self->draw_connectors($gd,$x,$y) if $connector && $connector ne 'none' && $self->level == 0; } sub draw_component { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; my ($x1,$y1,$x2,$y2) = $self->bounds($left,$top); my $draw_target; my $strand = $self->feature->strand; if ($self->draw_target && $self->dna_fits) { $draw_target++; my $stranded = $self->stranded; my $bgcolor = $self->bgcolor; if ($stranded) { $x1 -= 6 if $strand < 0 && $x1 >= $self->panel->left; $x2 += 6 if $strand > 0 && $x2 <= $self->panel->right; $self->filled_arrow($gd,$strand,$x1,$y1,$x2,$y2) } else { $self->filled_box($gd,$x1,$y1,$x2,$y2,$bgcolor,$bgcolor); } } else { $self->SUPER::draw_component(@_); } return unless $self->show_mismatch; my $mismatch_color = $self->mismatch_color; my $feature = $self->feature; my $start = $self->feature->start; my $end = $feature->end; my (@mismatch_positions,@del_positions,@in_positions); if (my ($src,$matchstr,$tgt) = eval{$feature->padded_alignment}) { my @src = split '',$src; my @match = split '',$matchstr; my @tgt = split '',$tgt; my $pos = $start; # skip over src padding (probably soft clipped) while ($src[0] eq '-') { shift @src; shift @tgt; } while ($src[-1] eq '-') { pop @src; pop @tgt; } for (my $i=0;$i<@src;$i++) { if ($src[$i] eq '-') { push @in_positions,$pos; } elsif ($tgt[$i] eq '-') { push @del_positions,$pos; $pos++; } elsif ($src[$i] ne $tgt[$i]) { push @mismatch_positions,$pos; $pos++; } else { $pos++; } } } else { my $sdna = eval {$feature->dna}; my $tdna = eval {$feature->target->dna}; # works with GFF files return unless $sdna =~ /[gatc]/i; return unless $tdna =~ /[gatc]/i; my @src = split '',$sdna; my @tgt = split '',$tdna; for (my $i=0;$i<@src;$i++) { next if $src[$i] eq $tgt[$i]; warn "$src[$i] eq $tgt[$i], strand=$strand"; my $pos = $strand >= 0 ? $i+$start : $end-$i; push @mismatch_positions,$pos; } } my $pixels_per_base = $self->scale; my $panel_right = $self->panel->right; for my $a ([\@mismatch_positions,$self->mismatch_color], [\@del_positions,$self->deletion_color], [\@in_positions,$self->insertion_color,0.5,0.5] ) { my $color = $a->[1]; my $offset = $a->[2]||0; my $width = $a->[3]||1; my @pixel_positions = $self->map_no_trunc(@{$a->[0]}); foreach (@pixel_positions) { next if $_ < $x1; next if $_ > $x2; next if $_ >= $panel_right; my $left = $_ - $pixels_per_base*$offset; my $right = $left+($width*$pixels_per_base); my $top = $y1+1; my $bottom= $y2-1; my $middle= ($y1+$y2)/2; if ($self->stranded && $left <= $x1+$pixels_per_base-1 && $self->strand < 0) { $self->filled_arrow($gd,$self->strand, $draw_target ? ($left-4):$left+2, $top, $draw_target ? $right:$right+5,$bottom,$color,$color,1); } elsif ($self->stranded && $right >= $x2-$pixels_per_base+1 && $self->strand > 0) { $self->filled_arrow($gd,$self->strand, $left,$top,$draw_target ? ($right+4): $right-2,$bottom,$color,$color,1); } else { $self->filled_box($gd, $left, $top, $right, $bottom, $color,$color); } } } } # BUG: this horrible subroutine has grown without control and needs # to be broken down into manageable subrutines. sub draw_multiple_alignment { my $self = shift; my $gd = shift; my ($left,$top,$partno,$total_parts) = @_; my $flipped = $self->flip; my $ragged_extra = $self->option('ragged_start') ? RAGGED_START_FUZZ : $self->option('ragged_extra'); my $true_target = $self->option('true_target'); my $show_mismatch = $self->show_mismatch; my $do_realign = $self->option('realign'); my $pixels_per_base = $self->scale; my $feature = $self->feature; my $panel = $self->panel; my ($abs_start,$abs_end) = ($feature->start,$feature->end); my ($tgt_start,$tgt_end) = ($feature->hit->start,$feature->hit->end); my ($panel_start,$panel_end) = ($self->panel->start,$self->panel->end); my $strand = $feature->strand; my $panel_left = $self->panel->left; my $panel_right = $self->panel->right; my $bgcolor = $self->bgcolor; my $drew_sequence; if ($tgt_start > $tgt_end) { #correct for data problems $strand = -1; ($tgt_start,$tgt_end) = ($tgt_end,$tgt_start); } warn "TGT_START..TGT_END = $tgt_start..$tgt_end" if DEBUG; my ($bl,$bt,$br,$bb) = $self->bounds($left,$top); $top = $bt; my $stranded = $self->stranded; my @s = $self->_subfeat($feature); # FIX ME # workaround for features in which top level feature does not have a hit but # subfeatures do. There is total breakage of encapsulation here because sometimes # a chado alignment places the aligned segment in the top-level feature, and sometimes # in the child feature. unless (@s) { # || $feature->isa('Bio::DB::GFF::Feature')) { @s = ($feature); } my $can_realign; if (Bio::Graphics::Browser2::Realign->can('align_segs')) { $can_realign = \&Bio::Graphics::Browser2::Realign::align_segs; } elsif (Bio::Graphics::Browser::Realign->can('align_segs')) { $can_realign = \&Bio::Graphics::Browser::Realign::align_segs; } my (@segments,%strands); my ($ref_dna,$tgt_dna); for my $s (@s) { my $target = $s->hit; my ($src_start,$src_end) = ($s->start,$s->end); # next unless $src_start <= $panel_end && $src_end >= $panel_start; my ($tgt_start,$tgt_end) = ($target->start,$target->end); my $strand_bug; unless (exists $strands{$target}) { my $strand = $feature->strand; if ($tgt_start > $tgt_end) { #correct for data problems $strand = -1; ($tgt_start,$tgt_end) = ($tgt_end,$tgt_start); $strand_bug++; } $strands{$target} = $strand; } my $cigar = $self->_get_cigar($s); if ($cigar || ($can_realign && $do_realign)) { ($ref_dna,$tgt_dna) = ($s->dna,$target->dna); warn "$s: ",$s->seq_id,":",$s->start,'..',$s->end if DEBUG; warn "ref/tgt" if DEBUG; warn "$ref_dna\n$tgt_dna" if DEBUG; my @exact_segments; if ($cigar) { warn "Segmenting [$target,$src_start,$src_end,$tgt_start,$tgt_end] via $cigar.\n" if DEBUG; @exact_segments = $self->_gapped_alignment_to_segments($cigar,$ref_dna,$tgt_dna); } else { warn "Realigning [$target,$src_start,$src_end,$tgt_start,$tgt_end].\n" if DEBUG; @exact_segments = $can_realign->($ref_dna,$tgt_dna); } foreach (@exact_segments) { warn "=========> [$target,@$_]\n" if DEBUG; my $a = $strands{$target} >= 0 ? [$target,$_->[0]+$src_start,$_->[1]+$src_start,$_->[2]+$tgt_start,$_->[3]+$tgt_start] : [$target,$src_end-$_->[1],$src_end-$_->[0],$_->[2]+$tgt_start,$_->[3]+$tgt_start]; warn "[$target,$_->[0]+$src_start,$_->[1]+$src_start,$tgt_end-$_->[3],$tgt_end-$_->[2]]" if DEBUG; warn "=========> [@$a]\n" if DEBUG; warn substr($ref_dna, $_->[0],$_->[1]-$_->[0]+1),"\n" if DEBUG; warn substr($tgt_dna,$_->[2],$_->[3]-$_->[2]+1),"\n" if DEBUG; push @segments,$a; } } else { push @segments,[$target,$src_start,$src_end,$tgt_start,$tgt_end]; } } # get 'em in the right order so that we don't have to worry about # where the beginning and end are. @segments = sort {$a->[TGT_START]<=>$b->[TGT_START]} @segments; # adjust for ragged (nonaligned) ends my ($offset_left,$offset_right) = (0,0); if ($ragged_extra && $ragged_extra > 0) { # add a little rag to the left end $offset_left = $segments[0]->[TGT_START] > $ragged_extra ? $ragged_extra : $segments[0]->[TGT_START]-1; if ($strand >= 0) { $offset_left = $segments[0]->[SRC_START]-1 if $segments[0]->[SRC_START] - $offset_left < 1; $abs_start -= $offset_left; $tgt_start -= $offset_left; $segments[0]->[SRC_START] -= $offset_left; $segments[0]->[TGT_START] -= $offset_left; } else { $abs_end += $offset_left; $tgt_start -= $offset_left; $segments[0]->[SRC_END] += $offset_left; $segments[0]->[TGT_START] -= $offset_left; } # add a little rag to the right end - this is complicated because # we don't know what the length of the underlying dna is, so we # use the subfeat method to find out my $current_end = $segments[-1]->[TGT_END]; $offset_right = length $segments[-1]->[TARGET]->subseq($current_end+1,$current_end+$ragged_extra)->seq; if ($strand >= 0) { $abs_end += $offset_right; $tgt_end += $offset_left; $segments[-1]->[TGT_END] += $offset_right; $segments[-1]->[SRC_END] += $offset_right; } else { $abs_start -= $offset_right; $tgt_end += $offset_left; $segments[-1]->[TGT_END] += $offset_right; $segments[-1]->[SRC_START] -= $offset_right; } } # get the DNAs now - a little complicated by the necessity of using # the subseq() method $ref_dna ||= $feature->subseq(1-$offset_left,$feature->length+$offset_right)->seq; # this may not be right if the alignment involves only a portion of the target DNA $tgt_dna ||= $feature->hit->dna; # none of these seem to be working properly with BAM alignments # my $tgt_len = abs($segments[-1]->[TGT_END] - $segments[0]->[TGT_START]) + 1; # my $tgt_dna = $feature->hit->subseq(1-$offset_left,$feature->length+$offset_right)->seq; # my $tgt_dna = $feature->hit->subseq(1-$offset_left,$tgt_len+$offset_right)->seq; # work around changes in the API $ref_dna = $ref_dna->seq if ref $ref_dna and $ref_dna->can('seq'); $tgt_dna = $tgt_dna->seq if ref $tgt_dna and $tgt_dna->can('seq'); $ref_dna = lc $ref_dna; $tgt_dna = lc $tgt_dna; # sanity check. Let's see if they look like they're lining up warn "$feature dna sanity check:\n$ref_dna\n$tgt_dna\n" if DEBUG; # now we're all lined up, and we're going to adjust everything to fall within the bounds # of the left and right panel coordinates my %clip; for my $seg (@segments) { my $target = $seg->[TARGET]; warn "preclip [@$seg]\n" if DEBUG; # left clipping if ( (my $delta = $seg->[SRC_START] - $panel_start) < 0 ) { warn "clip left delta = $delta" if DEBUG; $seg->[SRC_START] = $panel_start; if ($strand >= 0) { $seg->[TGT_START] -= $delta; } } # right clipping if ( (my $delta = $panel_end - $seg->[SRC_END]) < 0) { warn "clip right delta = $delta" if DEBUG; $seg->[SRC_END] = $panel_end; if ($strand < 0) { $seg->[TGT_START] -= $delta; } } my $length = $seg->[SRC_END]-$seg->[SRC_START]+1; $seg->[TGT_END] = $seg->[TGT_START]+$length-1; warn "Clipping gives [@$seg], tgt_start = $tgt_start\n" if DEBUG; } # remove segments that got clipped out of existence # no longer doing this because it interferes with ability to # detect insertions in the target # @segments = grep { $_->[SRC_START]<=$_->[SRC_END] } @segments; # relativize coordinates if ($strand < 0) { # breaks BAM, but probably needed for non-BAM features $ref_dna = $self->reversec($ref_dna) unless eval { $feature->reversed } ; $tgt_dna = $self->reversec($tgt_dna); } my ($red,$green,$blue) = $self->panel->rgb($bgcolor); my $avg = ($red+$green+$blue)/3; my $color = $self->translate_color($avg > 128 ? 'black' : 'white'); my $font = $self->mono_font; my $lineheight = $font->height; my $fontwidth = $font->width; my $mismatch = $self->mismatch_color; my $insertion= $self->insertion_color; my $deletion = $self->deletion_color; my $grey = $self->translate_color('gray'); my $mismatch_font_color = eval { my ($r,$g,$b) = $self->panel->rgb($mismatch); $self->translate_color(($r+$g+$b)>128 ? 'black' : 'white'); }; my $insertion_font_color = eval { my ($r,$g,$b) = $self->panel->rgb($insertion); $self->translate_color(($r+$g+$b)>128 ? 'black' : 'white'); }; my $deletion_font_color = eval { my ($r,$g,$b) = $self->panel->rgb($deletion); $self->translate_color(($r+$g+$b)>128 ? 'black' : 'white'); }; unless (@segments) { # this will happen if entire region is a target gap for (my $i = $bl;$i<$br-$self->scale;$i+=$self->scale) { $gd->char($font,$self->flip ? $i+$self->scale-4 : $i+2,$top,'-',$deletion_font_color); } return; } for my $seg (@segments) { $seg->[SRC_START] -= $abs_start - 1; $seg->[SRC_END] -= $abs_start - 1; $seg->[TGT_START] -= $tgt_start - 1; $seg->[TGT_END] -= $tgt_start - 1; if ($strand < 0) { ($seg->[TGT_START],$seg->[TGT_END]) = (length($tgt_dna)-$seg->[TGT_END]+1,length($tgt_dna)-$seg->[TGT_START]+1); } if (DEBUG) { warn "$feature: relativized coordinates = [@$seg]\n"; warn $self->_subsequence($ref_dna,$seg->[SRC_START],$seg->[SRC_END]),"\n"; warn $self->_subsequence($tgt_dna,$seg->[TGT_START],$seg->[TGT_END]),"\n"; } } # draw my $base2pixel = $self->flip ? sub { my ($src,$tgt) = @_; my $a = $fontwidth + ($abs_start + $src-$panel_start-1 + $tgt) * $pixels_per_base - 1; $panel_right - $a; } : sub { my ($src,$tgt) = @_; $fontwidth/2 + $left + ($abs_start + $src-$panel_start-1 + $tgt) * $pixels_per_base - 1; }; my $mismatch_only = $self->mismatch_only; my ($tgt_last_end,$src_last_end,$leftmost,$rightmost,$gaps); my $segment = 0; for my $seg (sort {$a->[SRC_START]<=>$b->[SRC_START]} @segments) { my $y = $top-1; my $end = $seg->[SRC_END]-$seg->[SRC_START]; for (my $i=0; $i<$end+1; $i++) { my $src_base = $self->_subsequence($ref_dna,$seg->[SRC_START]+$i,$seg->[SRC_START]+$i); my $tgt_base = $self->_subsequence($tgt_dna,$seg->[TGT_START]+$i,$seg->[TGT_START]+$i); my $x = $base2pixel->($seg->[SRC_START],$i); $leftmost = $x if !defined $leftmost || $leftmost > $x; $rightmost= $x if !defined $rightmost || $rightmost < $x; next unless $tgt_base && $x >= $panel_left && $x <= $panel_right; my $is_mismatch = $show_mismatch && $tgt_base && $src_base ne $tgt_base && $tgt_base !~ /[nN]/; $tgt_base = $complement{$tgt_base} if $true_target && $strand < 0; $gd->char($font,$x,$y,$tgt_base,$tgt_base =~ /[nN]/ ? $grey :$is_mismatch ? $mismatch_font_color :$color) unless $mismatch_only && !$is_mismatch; $drew_sequence++; } # deal with gaps in the alignment if (defined $src_last_end && (my $delta = $seg->[SRC_START] - $src_last_end) > 1) { for (my $i=0;$i<$delta-1;$i++) { my $x = $base2pixel->($src_last_end,$i+1); next if $x > $panel_right; next if $x < $panel_left; $gd->char($font,$x,$y,'-',$deletion_font_color); } $gaps = $delta-1; } # indicate the presence of insertions in the target $gaps ||= 0; my $pos = $src_last_end + $gaps; my $delta = $seg->[TGT_START] - $tgt_last_end; my $src_delta = $seg->[SRC_START] - $src_last_end; if ($segment && $delta && ($delta > $src_delta-$gaps)) { # an insertion in the target relative to the source my $gap_left = $base2pixel->($pos+0.5,0); my $gap_right = $base2pixel->($seg->[SRC_START],0); ($gap_left,$gap_right) = ($gap_right+$fontwidth,$gap_left-$fontwidth) if $self->flip; warn "delta=$delta, gap_left=$gap_left, gap_right=$gap_right" if DEBUG; next if $gap_left <= $panel_left || $gap_right >= $panel_right; my $length = $delta-1; $length = 1 if $length <= 0; # workaround my $gap_distance = $gap_right - $gap_left; my $pixels_per_inserted_base = $gap_distance/$length; if ($pixels_per_inserted_base >= $fontwidth) { # Squeeze the insertion in for (my $i = 0; $i<$delta-1; $i++) { my $x = $gap_left + $pixels_per_inserted_base * $i; my $bp = $self->_subsequence($tgt_dna,$tgt_last_end+$i+1,$tgt_last_end+$i+1); next if $x < $panel_left; $gd->char($font,$x,$y,$bp,$color); } } else { #here's where we insert the insertion length if ($gap_distance >= $fontwidth*length($length)) { $gd->string($font,$gap_left,$y,$length,$color); } } } } continue { $tgt_last_end = $seg->[TGT_END]; $src_last_end = $seg->[SRC_END]; $segment++; } return $drew_sequence; } sub _gapped_alignment_to_segments { my $self = shift; my ($cigar,$sdna,$tdna) = @_; my ($pad_source,$pad_target,$pad_match); warn "_gapped_alignment_to_segments\n$sdna\n$tdna" if DEBUG; for my $event (@$cigar) { my ($op,$count) = @$event; warn "op=$op, count=$count" if DEBUG; if ($op eq 'I') { $pad_source .= '-' x $count; $pad_target .= substr($tdna,0,$count,''); $pad_match .= ' ' x $count; } elsif ($op eq 'D' || $op eq 'N') { $pad_source .= substr($sdna,0,$count,''); $pad_target .= '-' x $count; $pad_match .= ' ' x $count; } elsif ($op eq 'S') { $pad_source .= '-' x $count; $pad_target .= substr($tdna,0,$count,''); $pad_match .= ' ' x $count; } elsif ($op eq 'H' || $op eq 'P') { # Nothing to do. This is simply an informational operation. } else { # everything else is assumed to be a match -- revisit $pad_source .= substr($sdna,0,$count,''); $pad_target .= substr($tdna,0,$count,''); $pad_match .= '|' x $count; } } warn "pads:\n$pad_source\n$pad_match\n$pad_target" if DEBUG; return $self->pads_to_segments($pad_source,$pad_match,$pad_target); } sub pads_to_segments { my $self = shift; my ($gap1,$align,$gap2) = @_; warn "pads_to_segments" if DEBUG; warn "$gap1\n$align\n$gap2\n" if DEBUG; # create arrays that map residue positions to gap positions my @maps; for my $seq ($gap1,$gap2) { my @seq = split '',$seq; my @map; my $residue = 0; for (my $i=0;$i<@seq;$i++) { $map[$i] = $residue; $residue++ if $seq[$i] ne '-'; } push @maps,\@map; } my @result; while ($align =~ /(\S+)/g) { my $align_end = pos($align) - 1; my $align_start = $align_end - length($1) + 1; push @result,[@{$maps[0]}[$align_start,$align_end], @{$maps[1]}[$align_start,$align_end]]; } return wantarray ? @result : \@result; } sub _get_cigar { my $self = shift; my $feat = shift; # some features have this built in if ($feat->can('cigar_array')) { my $cigar = $feat->cigar_array; @$cigar = reverse @$cigar if $feat->strand < 0; return $cigar; } my ($cigar) = $feat->get_tag_values('Gap'); return unless $cigar; my @arry; my $regexp = $cigar =~ /^\d+/ ? '(\d+)([A-Z])' : '([A-Z])(\d+)'; if ($cigar =~ /^\d+/) { while ($cigar =~ /(\d+)([A-Z])/g) { my ($count,$op) = ($1,$2); push @arry,[$op,$count]; } } else { while ($cigar =~ /([A-Z])(\d+)/g) { my ($op,$count) = ($1,$2); push @arry,[$op,$count]; } } return \@arry; } sub _subsequence { my $self = shift; my ($seq,$start,$end,$strand) = @_; my $sub; if ((defined $strand && $strand < 0)) { my $piece = substr($seq,length($seq)-$end,$end-$start+1); $sub = $self->reversec($piece); } else { $sub = substr($seq,$start-1,$end-$start+1); } return $self->flip ? $complement{$sub} : $sub; } # draw the classic "i-beam" icon to indicate that an insertion fits between # two bases # sub _draw_insertion_point { # my $self = shift; # my ($gd,$x,$y,$color) = @_; # my $top = $y; # $x--; # my $bottom = $y + $self->font->height - 4; # $gd->line($x,$top+2, $x,$bottom-2,$color); # $gd->setPixel($x+1, $top+1,$color); # $gd->setPixel($x+$_, $top,$color) for (2..3); # $gd->setPixel($x-1, $top+1,$color); # $gd->setPixel($x-$_, $top,$color) for (2..3); # $gd->setPixel($x+1, $bottom-1,$color); # $gd->setPixel($x+$_, $bottom, $color) for (2..3); # $gd->setPixel($x-1, $bottom-1,$color); # $gd->setPixel($x-$_, $bottom, $color) for (2..3); # } # don't like that -- try drawing carets sub _draw_insertion_point { my $self = shift; my ($gd,$left,$right,$top,$bottom,$color) = @_; my $poly = GD::Polygon->new(); $poly->addPt($left-3,$top+1); $poly->addPt($right+2,$top+1); $poly->addPt(($left+$right)/2-1,$top+3); $gd->filledPolygon($poly,$color); $poly = GD::Polygon->new(); $poly->addPt($left-3,$bottom); $poly->addPt($right+2,$bottom); $poly->addPt(($left+$right)/2-1,$bottom-2); $gd->filledPolygon($poly,$color); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::segments - The "segments" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used for drawing features that consist of discontinuous segments. Unlike "graded_segments" or "alignment", the segments are a uniform color and not dependent on the score of the segment. =head2 METHODS This module overrides the maxdepth() method to return 1 unless explicitly specified by the -maxdepth option. This means that modules inheriting from segments will only be presented with one level of subfeatures. Override the maxdepth() method to get more levels. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -strand_arrow Whether to indicate 0 (false) strandedness -hilite Highlight color undef (no color) In addition, the following glyph-specific options are recognized: -draw_dna If true, draw the dna residues 0 (false) when magnification level allows. -draw_target If true, draw the dna residues 0 (false) of the TARGET sequence when magnification level allows. See "Displaying Alignments". -draw_protein_target If true, draw the protein residues 0 (false) of the TARGET sequence when magnification level allows. See "Displaying Alignments". -ragged_extra When combined with -draw_target, 0 (false) draw extra bases beyond the end of the alignment. The value is the maximum number of extra bases. See "Displaying Alignments". -ragged_start Deprecated option. Use -ragged_extra instead -show_mismatch When combined with -draw_target, 0 (false) highlights mismatched bases in the mismatch color. Can be 0 (don't display); 1 (display when the DNA fits); or another positive integer (display when the region in view is <= this value). See "Displaying Alignments". -mismatch_only When combined with -draw_target, 0 (false) draws only the mismatched bases in the alignment. Implies -show_mismatch. See "Displaying Alignments". -mismatch_color The mismatch color to use 'lightgrey' -insertion_color The color to use for insertions 'green' relative to the reference. -deletion_color The color to use for deletions 'red' relative to the reference. -indel_color The color to use for indels, used 'lightgrey' only if -insertion_color or -deletion_color are absent -true_target Show the target DNA in its native 0 (false) (plus strand) orientation, even if the alignment is to the minus strand. See "Displaying Alignments". -realign Attempt to realign sequences at 0 (false) high mag to account for indels. See "Displaying Alignments". If the -draw_dna flag is set to a true value, then when the magnification is high enough, the underlying DNA sequence will be shown. This option is mutually exclusive with -draw_target. See Bio::Graphics::Glyph::generic for more details. The -draw_target, -ragged_extra, and -show_mismatch options only work with seqfeatures that implement the hit() method (Bio::SeqFeature::SimilarityPair). -draw_target will cause the DNA of the hit sequence to be displayed when the magnification is high enough to allow individual bases to be drawn. The -ragged_extra option will cause the alignment to be extended at the extreme ends by the indicated number of bases, and is useful for looking for polyAs and cloning sites at the ends of ESTs and cDNAs. -show_mismatch will cause mismatched bases to be highlighted in with the color indicated by -mismatch_color. A -show_mismatch value of "1" will highlight mismatches only when the base pairs are displayed. A positive integer will cause mismatches to be shown whenever the region in view is less than or equal to the requested value. At high magnifications, minus strand matches will automatically be shown as their reverse complement (so that the match has the same sequence as the plus strand of the source dna). If you prefer to see the actual sequence of the target as it appears on the minus strand, then set -true_target to true. Note that -true_target has the opposite meaning from -canonical_strand, which is used in conjunction with -draw_dna to draw minus strand features as if they appear on the plus strand. =head2 Displaying Alignments When the B<-draw_target> option is true, this glyph can be used to display nucleotide alignments such as BLAST, FASTA or BLAT similarities. At high magnification, this glyph will attempt to show how the sequence of the source (query) DNA matches the sequence of the target (the hit). For this to work, the feature must implement the hit() method, and both the source and the target DNA must be available. If you pass the glyph a series of Bio::SeqFeature::SimilarityPair objects, then these criteria will be satisified. Without additional help, this glyph cannot display gapped alignments correctly. To display gapped alignments, you can use the Bio::Graphics::Brower::Realign module, which is part of the Generic Genome Browser package (http://www.gmod.org). If you wish to install the Realign module and not the rest of the package, here is the recipe: cd Generic-Genome-Browser-1.XX perl Makefile.PL DO_XS=1 make make install_site If possible, build the gbrowse package with the DO_XS=1 option. This compiles a C-based DP algorithm that both gbrowse and gbrowse_details will use if they can. If DO_XS is not set, then the scripts will use a Perl-based version of the algorithm that is 10-100 times slower. The display of alignments can be tweaked using the -ragged_extra, -show_mismatch, -true_target, and -realign options. See the options section for further details. There is also a B<-draw_protein_target> option, which is designed for protein to nucleotide alignments. It draws the target sequence every third base pair and is supposed to align correctly with the forward and reverse translation glyphs. This option is experimental at the moment, and may not work correctly, to use with care. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/phylo_align.pm000555001750001750 10376312366325116 23061 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::phylo_align; use strict; use base qw(Bio::Graphics::Glyph::generic Bio::Graphics::Glyph::xyplot); use Bio::TreeIO; use Bio::Graphics::Wiggle; use POSIX qw(log10); use Carp 'croak','cluck'; use Data::Dumper; my %complement = (g=>'c',a=>'t',t=>'a',c=>'g',n=>'n', G=>'C',A=>'T',T=>'A',C=>'G',N=>'N'); # turn off description sub description { 0 } # turn off label # sub label { 1 } sub height { my $self = shift; my $font = $self->mono_font; #adjust the space to take if conservation scores are drawn instead if (! $self->dna_fits) { my $species_spacing_score = $self->option('species_spacing_score') || 5; $self->factory->set_option('species_spacing', $species_spacing_score); } my $species_spacing = $self->option('species_spacing') || 1; #Height = NumSpecies x Spacing/species x FontHeight my $height = ($self->known_species + $self->unknown_species + 1) * $species_spacing * $font->height; #use this if you want to show only those species that have alignments in the viewing window #$height = ($self->extract_features + 1) * 2 * $font->height; $self->factory->set_option('height', $height); return $height; } ##### # TODO: extract the wigfiles covering the range as well ##### # get all features within the viewing window sub extract_features { my $self = shift; #my $segment = $self->feature->{'factory'}->segment($self->feature->refseq, # $self->feature->start => $self->feature->stop); #my @match = $segment->features('submatch:pa'); my @match = $self->feature->features('submatch:pa'); warn $self->feature->features; #print "Match has ",$#match,"

\n"; # exract wifiles here too: my @wmatch = $self->feature->features('wfile:pa'); #push @match, $self->feature->features('wfile:pa'); # print "xxxxxx

",Dumper(@wmatch),"
cccccc"; #print "WMatch has ",$#wmatch,"

\n"; #print "Halfwaypoint

"; #for my $feature (@match,@wmatch) { #my %attributes = $feature->attributes; #my $species = $attributes{'species'}; #print "

Feature $species:\n",Dumper(%attributes),"
\n"; #} my %alignments; # for my $feature (@match) { for my $feature (@match,@wmatch) { my %attributes = $feature->attributes; my $species = $attributes{'species'}; push @{$alignments{$species}}, $feature; } %alignments; } #known species (all those that are in the Phylo tree) sub known_species { my $self = shift; my $tree = shift; if ($tree) { my @leaves = $tree->get_leaf_nodes; my @allspecies = map {$_->id} @leaves; return @allspecies } else { #this may be too simple of an assumption, especially for non newick files my $tree_file = $self->option('tree_file'); open (FH, $tree_file); my $newick = ; close FH; my @allspecies = $newick =~ /([a-zA-Z]\w*)/g; return @allspecies; } } sub unknown_species { my $self = shift; my %alignments; #all species in viewing window my $refspecies; #all species from cladogram info my @current_species; #all species in viewing window my @known_species; #species in GFF but and clado my @unknown_species; #species in GFF but not in clado # current - known = unknown if (@_) { %alignments = %{$_[0]}; $refspecies = $_[1]; @current_species = @{$_[2]}; @known_species = @{$_[3]}; } else { %alignments = $self->extract_features; $refspecies = $self->option('reference_species'); @current_species = keys %alignments; #all species in viewing window @known_species = $self->known_species; #all species from cladogram info } #would have combined the two cases into one line using || but Perl will treat the arrays as num of elem #do set subtraction to see which species in viewing range but not in tree my %seen; # build lookup table @seen{@known_species} = (); foreach my $item (@current_species, $refspecies) { push(@unknown_species, $item) unless exists $seen{$item}; } return @unknown_species; } sub set_tree { my $self = shift; #warn"My species are ".Dumper(@species); my $tree_file = $self->option('tree_file'); my $tree_format = $self->option('tree_format') || 'newick'; my $treeio = new Bio::TreeIO(-file => $tree_file, -format => $tree_format); my $tree = $treeio->next_tree; my $root = $tree->get_root_node; # would be ideal to remove all species that don't have features (alignments) within # viewing window but there is a bug in Bio::Tree library where you can't remove the # first leaf node. # $tree->remove_Node('dog'); # etc... #set the leaf x coodinate (make all evenly spaced) my @leaves = $tree->get_leaf_nodes; for (my $i=0; $i<@leaves; $i++) { my $leaf = $leaves[$i]; #note that leaves can use "description" functions while intermediate nodes cannot #thus objects must be handled directly $leaf->description({'x'=>$i}); } #set root height to 0 $root->{'description'}{'y'} = 0; #set the x and y coordinates of all intermediate nodes get_n_set_next_treenode($root, 0); flip_xy($tree); $tree; } sub get_max_height { my $tree = shift; my $max_height; #get the max height for my $child ($tree->get_leaf_nodes) { my $x = $child->{'_description'}{'x'}; $max_height = $x if $max_height < $x; } $max_height; } sub draw_clado { my $self = shift; my $tree = shift; my $gd = shift; my ($x1, $y1, $x2, $y2, $color, $xscale, $yscale, $xoffset, $yoffset, $start_x, $draw_clado_left) = @_; my @bounds = $gd->getBounds; my $root = $tree->get_root_node; my @nodes = $root->get_all_Descendents; #draw bg for cladogram my $font = $self->mono_font; my $clado_bg = $self->color('clado_bg') || $self->bgcolor; my @coords = (0, $y1, $start_x+$xoffset+$font->width-1, $y2+1); my @coords2 = ($x1, $y1, $start_x+$xoffset/2, $y2); if ($draw_clado_left) { $gd->filledRectangle(@coords, $clado_bg); $gd->filledRectangle(@coords2, $self->color('clado_bg')); $gd->filledRectangle($x2, $x1, $bounds[0], $bounds[1], $self->color('bg_color')) if $self->dna_fits; } else { $gd->filledRectangle($bounds[0]-$coords[2], $coords[1], $bounds[0]-$coords[0], $coords[3], $self->color('bg_color')); $gd->filledRectangle($bounds[0]-$coords2[2], $coords2[1], $bounds[0]-$coords2[0], $coords2[3], $clado_bg); $gd->filledRectangle(0, $y1, $x1, $y2+1, $self->color('bg_color')) if $self->dna_fits; } #draw the lines of the tree for my $node ($root,@nodes) { next if $node->is_Leaf; my $x = $node->{'_description'}{'x'} * $xscale; #draw vertical line covering all children my $topx = $node->{'_description'}{'childmin'} * $yscale; my $botx = $node->{'_description'}{'childmax'} * $yscale; @coords = ($x+$xoffset, $topx+$yoffset, $x+$xoffset, $botx+$yoffset); if ($draw_clado_left) { $gd->line(@coords, $self->fgcolor); } else { $gd->line($bounds[0]-$coords[2], $coords[1], $bounds[0]-$coords[0], $coords[3], $self->fgcolor); } #draw a line connecting the bar to each child my @children = $node->each_Descendent; for my $child (@children) { my $cx = $child->{'_description'}{'x'} * $xscale; my $cy = $child->{'_description'}{'y'} * $yscale; $cx = $start_x if $child->is_Leaf; #print"($cx, $cy)"; @coords = ($x+$xoffset, $cy+$yoffset, $cx+$xoffset, $cy+$yoffset); if ($draw_clado_left) { $gd->line(@coords, $self->fgcolor); } else { $gd->line($bounds[0]-$coords[2], $coords[1], $bounds[0]-$coords[0], $coords[3], $self->fgcolor); } } } #my $tree = $treeio->next_tree; #my @nodes = grep { $_->bootstrap > 70 } $tree->get_nodes; #warn"my nodes are:\n".Dumper(@nodes); print""; $start_x + $xscale; } #tree is made with root on top but this will switch x and y coords so root is on left sub flip_xy { my $tree = shift; my $root = $tree->get_root_node; my @nodes = $root->get_all_Descendents; for my $node ($root, @nodes) { if ($node->is_Leaf) { $node->{'_description'} = { 'x' => $node->{'_description'}{'y'}, 'y' => $node->{'_description'}{'x'} } } else { $node->{'_description'} = { 'x' => $node->{'_description'}{'y'}, 'y' => $node->{'_description'}{'x'}, 'child_pos' => $node->{'_description'}{'child_pos'}, 'childmin' => $node->{'_description'}{'childmin'}, 'childmax' => $node->{'_description'}{'childmax'} } } } } #recursive function that sets the x and y coordinates of tree nodes sub get_n_set_next_treenode { my $node = shift; my $height = $node->{'_description'}{'y'}; my @children = $node->each_Descendent; my $x = 0; my $min_child_x = -1; my $max_child_x = -1; #iterate through children to find the x's and set the y's (height's) for my $child (@children) { #set the y coordinate as parent's height + 1 $child->{'_description'}{'y'} = $height + 1; get_n_set_next_treenode($child); #retrieve the child's x coordinate my $child_x = $child->{'_description'}{'x'} || 0; $x += $child_x; $min_child_x = $child_x if $min_child_x==-1 || $child_x < $min_child_x; $max_child_x = $child_x if $max_child_x==-1 || $max_child_x < $child_x; #$x += $child->discription->{'x'}; #cannot do this for intermediate nodes #store the x values of all children push @{$node->{'_description'}{'child_pos'}}, $child_x; } #set the current x coordinate as the average of all children's x's if (@children) { $x = $x / @children; $node->{'_description'}{'x'} = $x; $node->{'_description'}{'childmin'} = $min_child_x; $node->{'_description'}{'childmax'} = $max_child_x; } $node->{'_description'}{'y'} = $height; } sub get_legend_and_scale { my $yscale = shift; my $height = shift; if ($yscale < 2*$height - 1) { $height = 0; } ######### # chage scale later so that the base can be anything and not just 1!! # scale legend goes in order from min, axis, max, if either min or max = 1, then will only have min & max my @order = sort {$a <=> $b} (1, @_); my $graph_scale = - ($yscale - $height) / (log10($order[2]) - log10($order[0])); my $graph_legend = {1 => $graph_scale * (log10(1) - log10($order[2])), $order[0] => $graph_scale * (log10($order[0]) - log10($order[2])), $order[2] => 0}; #print "order is @order and the yscale is $yscale and height is $height
"; return ($graph_legend, $graph_scale); } #main method that draws everything sub draw { my $self = shift; my $font = $self->mono_font; my $height = $font->height; my $scale = $self->scale; my $gd = shift; my ($left,$top,$partno,$total_parts) = @_; my ($x1,$y1,$x2,$y2) = $self->bounds($left, $top); my @bounds = $gd->getBounds; my $draw_clado_left = $self->option('draw_clado_left'); #spacing of either DNA alignments or score histograms in units of font height my $species_spacing = $self->option('species_spacing') || 1; my $xscale = $font->width; my $yscale = $height * $species_spacing; my $xoffset = $x1; my $yoffset = $y1 + 0.5*$font->height; #method that reads the tree file to create the tree objects my $tree = $self->set_tree; my $max_height = get_max_height($tree); my $start_x =($max_height-1) * $xscale +$xoffset; my $connector = $self->connector; #all species having alignments in viewing window (key=name, val=feat obj) my %alignments = $self->extract_features; #print "Species are:",keys %alignments,"
\n"; my ($min_score, $max_score) = $self->get_score_bounds(%alignments); #$min_score = 0 unless $min_score; my ($graph_legend, $graph_scale) = get_legend_and_scale($yscale, $height, $min_score, $max_score); #print "min/max scores: $min_score, $max_score
\n", #"graph legend and scale: $graph_legend, $graph_scale"; # TODO: Gap entries give an undef for the min values for some reason my $refspecies = $self->option('reference_species'); my @current_species = keys %alignments; #all species in viewing window my @known_species = $self->known_species($tree); #all species from cladogram info my @unknown_species = $self->unknown_species(\%alignments, $refspecies, \@current_species, \@known_species); #species in GFF but not in clado ########is this even used? #my @allfeats; #for my $species (keys %alignments) { # push @allfeats, @{$alignments{$species}}; #} #this y value is the base for the next species' alignment/histogram and is incremented at each step my $y = $y1; for my $species (@known_species,@unknown_species) { my $y_track_top = $y + $height; my $y_track_bottom = $y + $yscale; if ($yscale < 2*$height-1) { #small scale $y_track_top = $y;# + $height; my $y_track_bottom = $y + $height; } #process the reference sequence differently if ($species eq $refspecies) { #draw DNA alignments if zoomed close enough my ($fx1,$fy1) = ($x1, $y_track_top); my ($fx2,$fy2) = ($x2,$y_track_bottom); if ($self->dna_fits) { my $dna = eval { $self->feature->seq }; $dna = $dna->seq if ref($dna) and $dna->can('seq'); # to catch Bio::PrimarySeqI objects my $bg_color = $self->color('ref_color') || $self->bgcolor; $fy2 = $fy1 + $font->height || $y2; $self->_draw_dna($gd,$dna,$fx1,$fy1,$fx2,$fy2, $self->fgcolor, $bg_color); } else { } my $x_label_start = $start_x + $xoffset + $font->width; $self->species_label($gd, $draw_clado_left, $x_label_start, $y, $species) unless ($self->option('hide_label')); $y += $yscale; next; } #skip if the there is no alignments for this species in this window unless ($alignments{$species}) { my $x_label_start = $start_x + $xoffset + $font->width; $self->species_label($gd, $draw_clado_left, $x_label_start, $y, $species) unless ($self->option('hide_label')); $y += $yscale; next; } my @features = @{$alignments{$species}}; #draw the axis for the plots $self->draw_pairwisegraph_axis($gd, $graph_legend, $x1, $x2, $y_track_top, $y_track_bottom, $draw_clado_left, @bounds) unless $self->dna_fits; #iterate through the wigfiles and put them on the graph ### # todo ### #iterate through features, and put them on the graph for my $feat (@features) { my ($start, $stop, %attributes) = ($feat->start, $feat->stop, $feat->attributes); my ($fx1,$fy1) = ($x1 + ($start-$self->start)*$scale, $y_track_top); my ($fx2,$fy2) = ($x1 + ($stop-$self->start)*$scale,$y_track_bottom); my $gapstr = $attributes{'Gap'} || "M".($stop-$start+1); my @gapstr = split " ", $gapstr; my @gaps; for my $gap (@gapstr) { my ($type, $num) = $gap =~ /^(.)(\d+)/; push @gaps, [$type, $num+0]; } #draw DNA alignments if zoomed close enough if ($self->dna_fits) { my $test = 0; my $hit = $feat->hit; if (!defined $hit) { warn "No hit for feature $feat, skipping drawing DNA"; next; } my $hit_seq = $hit->seq || print "No seq for hit
\n"; my $targ_dna = $hit_seq->seq || print "No seq for hit_seq
\n"; my $seq = $feat->seq || print "No sequence object for feature
\n"; my $ref_dna = $seq->seq || print "No ref dna"; #doesn't work as planned # my $ref_dna = $feat->seq->seq || print "No ref dna"; # my $targ_dna = $feat->hit->seq->seq || print "No targ dna"; next if !defined $ref_dna || !defined $targ_dna; $self->draw_dna($gd,$ref_dna, $targ_dna,$fx1,$fy1,$fx2,$fy2,\@gaps); } else { my $wigfile = $attributes{'wigfile'}; if ($wigfile) { if (-e $wigfile) { $self->pairwise_draw_wig_graph($gd, $feat, $x1, $scale, \@gaps, $graph_legend->{1}, $graph_scale, $fx1, $fy1, $fx2, $fy2,$wigfile); } else { warn "Wigfile $wigfile does not exist, skipping ..."; } } else { $self->pairwise_draw_graph($gd, $feat, $x1, $scale, \@gaps, $graph_legend->{1}, $graph_scale, $fx1, $fy1, $fx2, $fy2); } } } #label the species in the cladogram my $x_label_start = $start_x + $xoffset + $font->width; $self->species_label($gd, $draw_clado_left, $x_label_start, $y, $species) unless ($self->option('hide_label')); $y += $yscale; } $self->draw_clado($tree, $gd, $x1, $y1, $x2, $y2, $self->fgcolor, $xscale, $yscale, $xoffset, $yoffset, $start_x, $draw_clado_left); } sub species_label { my $self = shift; my $gd = shift; my $draw_clado_left = shift; my $x_start = shift; my $y_start = shift; my $species = shift; my $font = $self->mono_font; $x_start += 2; my $text_width = $font->width * length($species); my $bgcolor = $self->color('bg_color'); #make label if ($draw_clado_left) { $gd->filledRectangle($x_start-2, $y_start, $x_start + $text_width, $y_start+$font->height, $bgcolor); $gd->rectangle($x_start-2, $y_start, $x_start + $text_width, $y_start+$font->height, $self->fgcolor); $gd->string($font, $x_start, $y_start, $species, $self->fgcolor); } else { my ($x_max, $y_max) = $gd->getBounds; my $write_pos = $x_max - $x_start - $text_width; $gd->filledRectangle($write_pos, $y_start, $write_pos + $text_width+2, $y_start+$font->height, $bgcolor); $gd->rectangle($write_pos, $y_start, $write_pos + $text_width+2, $y_start+$font->height, $self->fgcolor); $gd->string($font, $write_pos+2, $y_start, $species, $self->fgcolor); } } # draws the legends on the conservation scale sub draw_pairwisegraph_axis { my $self = shift; my ($gd, $graph_legend, $x1, $x2, $y_track_top, $y_track_bottom, $draw_clado_left, @bounds) = @_; my $font = $self->mono_font; my $axis_color = $self->color('axis_color') || $self->fgcolor; my $mid_axis_color = $self->color('mid_axis_color') || $axis_color; for my $label (keys %$graph_legend) { my $y_label = $graph_legend->{$label} + $y_track_top; my $col = $axis_color; $col = $mid_axis_color if ($y_label != $y_track_top && $y_label != $y_track_bottom); $gd->line($x1,$y_label,$x2,$y_label,$col); my @coords = (0, $y_label, $x1, $y_label); if ($draw_clado_left) { #draw the legend on the right $coords[0] = $bounds[0] - $coords[0]; $coords[2] = $bounds[0] - $coords[2]; my $x_text_offset = length($label) * $font->width; $gd->string($font, $coords[0]-$x_text_offset, $coords[1], $label, $self->fgcolor); $gd->line(@coords, $self->fgcolor); $gd->line($x2,$y_track_top,$x2,$y_track_bottom,$self->fgcolor); } else { #draw the legned on the left $gd->string($font, @coords[0..1], $label, $self->fgcolor); $gd->line(@coords, $self->fgcolor); $gd->line($x1,$y_track_top,$x1,$y_track_bottom,$self->fgcolor); } } } #find min and max from features within the bounds sub get_score_bounds { my $self = shift; my %alignments = @_; my $min = -1; my $max = -1; for my $species (keys %alignments) { for my $feature (@{$alignments{$species}}) { my $score = $feature->score; #check to see if wigfile if ($score == undef) { my %attributes = $feature->attributes; if (-e $attributes{'wigfile'}) { ($min, $max) = $self->get_score_bounds_wigfile($feature,$min,$max,$attributes{'wigfile'}); } next; } $min = $score if $min == -1 || $score < $min; $max = $score if $max == -1 || $max < $score; } } my @parts = $self->parts; return ($min, $max) } #find min and max of sampled wigfile sub get_score_bounds_wigfile { my $self = shift; my $feature = shift; my ($min,$max,$wigfile) = @_; my $start = $feature->start < $self->start ? $self->start : $feature->start; my $stop = $self->stop < $feature->stop ? $self->stop : $feature->stop; #print $self->stop, "-", $feature->stop, "checking @_ $start - $stop\n"; #extract wig file contents my $wig = Bio::Graphics::Wiggle->new($wigfile, 0, {step => 1}) or die; #todo: make step configurable my $step = 100; for (my $i=$start; $i<$stop; $i += $step) { my $v = $wig->value($i); next unless defined $v; $min = $v if !defined $min or $v < $min; $max = $v if !defined $max or $max < $v; } #print "min and max are $min , $max
\n"; return ($min,$max); } sub pairwise_draw_graph { my $self = shift; my $gd = shift; my $feat = shift; # current feature object my $x_edge = shift; # x start position of the track my $scale = shift; # pixels / bp my $gaps = shift; # gap data for insertions, deletions and matches my $zero_y = shift; # y coordinate of 0 position my $graph_scale = shift; # scale for the graph. y_coord = graph_scale x log(score) my ($x1,$y1,$x2,$y2) = @_; my $fgcolor = $self->fgcolor; my $errcolor = $self->color('errcolor') || $fgcolor; my $score = $feat->score; my %attributes = $feat->attributes; my $log_y = log10($score); my $y_bottom = log10($score) * $graph_scale + $zero_y + $y1; my $y_top = $zero_y+$y1; my @y = sort {$a <=> $b} ($y_bottom, $y_top); #missing gap data unless ($gaps) { $x1 = $x_edge if $x1 < $x_edge; return if $x2 < $x_edge; #$gd->filledRectangle($x1,$y[0],$x2,$y[1],$fgcolor); return; } my $bp = 0; #draw a bar representing the score for the span of base pairs for my $tuple (@$gaps) { my ($type, $num) = @$tuple; #warn"$type and $num"; if ($type eq "M") { my $x_left = $x1 + ($bp*$scale); my $x_right = $x_left + $num*$scale; $bp += $num; $x_left = $x_edge if $x_left < $x_edge; next if $x_right < $x_edge; $gd->filledRectangle($x_left,$y[0],$x_right,$y[1],$fgcolor); } elsif ($type eq "D") { $bp += $num; } elsif ($type eq "I") { my $x_left = $x1 + ($bp*$scale); $gd->line($x_left-2, $y1-4, $x_left, $y1, $errcolor); $gd->line($x_left, $y1, $x_left+2, $y1-4, $errcolor); } } } sub pairwise_draw_wig_graph { my $self = shift; my $gd = shift; my $feat = shift; # current feature object my $x_edge = shift; # x start position of the track my $scale = shift; # pixels / bp my $gaps = shift; # gap data for insertions, deletions and matches my $zero_y = shift; # y coordinate of 0 position my $graph_scale = shift; # scale for the graph. y_coord = graph_scale x log(score) my ($x1,$y1,$x2,$y2,$wigfile) = @_; my $fgcolor = $self->fgcolor; my $errcolor = $self->color('errcolor') || $fgcolor; my $score = $feat->score; my %attributes = $feat->attributes; # my $log_y = log10($score); # my $y_bottom = log10($score) * $graph_scale + $zero_y + $y1; # my $y_top = $zero_y+$y1; # # my @y = sort {$a <=> $b} ($y_bottom, $y_top); #print "checking wigfile $wigfile
\n"; #todo: make step variable my $start = $feat->start < $self->start ? $self->start : $feat->start; my $stop = $self->stop < $feat->stop ? $self->stop : $feat->stop; # my $wig = Bio::Graphics::Wiggle->new($wigfile, 0) or die; my $wig = Bio::Graphics::Wiggle->new($wigfile, 0, {step => 1}) or die; ##### not sure why this was here # my $vals = $wig->values($start,$stop); # my ($vmin,$vmax); # for my $v (@$vals) { # next unless defined $v; # $vmin = $v if !defined $vmin or $v < $vmin; # $vmax = $v if !defined $vmax or $vmax < $v; # } # print "min and max are $vmin , $vmax\n"; # $min = $min < $vmin ? $min : $vmin; # $max = $vmax < $max ? $max : $vmax; # print "min and max are $min , $max\n"; # return ($min,$max); # print Dumper($vals); # my $pos = $start; # $gd->rectangle($x1,$y1,$x2,$y2,$fgcolor); # $gd->line($x1,$y1,$x2,$y2,$fgcolor); # $gd->line($x2,$y1,$x1,$y2,$fgcolor); # print "Start and stop: $start and $stop
\n"; # print "
\n$x1, $x2, $x_edge, $start, $stop
\n"; if ($scale < 1) { #### Algorithm 1, when zoomed at scale 1bp / pixel or more #### sample 10 values across the pixel (prevents redrawing same pixel over #### and over). The sample values are averaged. my $bp = $start; for (my $pix=$x1; $pix < $x2; $pix++) { $bp = ($pix - $x1)/$scale + $start; #todo: make samplesize an option my $samplesize = 10; my $score = 0; my $trial; for ($trial=0; $trial < $samplesize; $trial++) { my $samp_bp = $bp + ($trial/$samplesize)/$scale; last if $samp_bp > $stop; $score += $wig->value($samp_bp); #print "trial $trial: $samp_bp\tPixel $pix\tpos $x1
\n" if ($bp > 1700 && $bp < 1750); } #print "Pixel: $pix : Total $score and trial $trial
\n"; next if $trial == 0 || $score == 0; $score = $score / $trial; $self->draw_log10_rectangle($score, $graph_scale, $zero_y, $y1, $zero_y, $pix, $pix, $gd, $fgcolor); } } else { #### Algorithm 2, when zoomed in close at less than 1bp / pixel (1 bp spans #### 1 pixel or more), draw each value directly my $step = 1; for (my $i=$start; $i<$stop; $i += $step) { my $val = $wig->value($i); next if !defined $val; my $bp = $i - $start; my $x_left = $x1 + ($bp*$scale); my $x_right = $x_left + 1*$scale; $score = $val; $self->draw_log10_rectangle($score, $graph_scale, $zero_y, $y1, $zero_y, $x_left, $x_right, $gd, $fgcolor); } } return; } sub draw_log10_rectangle { my $self = shift; my $score = shift; my $graph_scale = shift; my $zero_y = shift; my $y1 = shift; $zero_y = shift; # oy vey - this will be overwritten my $x_left = shift; my $x_right = shift; my $gd = shift; my $fgcolor = shift; my $log_y = log10($score); my $y_bottom = log10($score) * $graph_scale + $zero_y + $y1; my $y_top = $zero_y+$y1; my @y = sort {$a <=> $b} ($y_bottom, $y_top); #print "$x_left,$y[0],$x_right,$y[1]
\n"; $gd->filledRectangle($x_left,$y[0],$x_right,$y[1],$fgcolor); } sub draw_dna { my $self = shift; my ($gd,$ref_dna, $dna,$x1,$y1,$x2,$y2, $gaps) = @_; my $pixels_per_base = $self->scale; my $fgcolor = $self->fgcolor; my $bg_color = $self->color('targ_color') || $self->bgcolor; my $errcolor = $self->color('errcolor') || $fgcolor; my $font = $self->mono_font; $y2 = $y1 + $font->height || $y2; #missing gap data, draw as is unless ($gaps) { warn"no gap data for DNA sequence $dna"; $self->_draw_dna($gd, $dna, $x1, $y1, $x2, $y2); return; } #parse the DNA segments by the gaps for my $tuple (@$gaps) { my ($type, $num) = @$tuple; if ($type eq "M") { my $dnaseg = substr($dna, 0, $num); my $ref_dnaseg = substr($ref_dna, 0, $num); $self->_draw_dna($gd,$dnaseg, $x1, $y1, $x2, $y2, $fgcolor, $bg_color,$ref_dnaseg); $dna = substr($dna, $num); $ref_dna = substr($ref_dna, $num); $x1 += $num * $pixels_per_base; } elsif ($type eq "D") { my $dnaseg = '-' x $num; $self->_draw_dna($gd, $dnaseg, $x1, $y1, $x2, $y2, $fgcolor); $gd->rectangle($x1, $y1-1, $x1+$num * $pixels_per_base, $y2+1, $errcolor); $ref_dna = substr($ref_dna, $num); $x1 += $num * $pixels_per_base; } elsif ($type eq "I") { $dna = substr($dna, $num); $gd->line($x1-2, $y1-2, $x1+2, $y1-2, $errcolor); $gd->line($x1, $y1-1, $x1, $y2+1, $errcolor); $gd->line($x1-2, $y2+1, $x1+2, $y2+1, $errcolor); } } } sub _draw_dna { my $self = shift; #the last argument is optional. If the reference seq is given, it will check it with target my ($gd,$dna,$x1,$y1,$x2,$y2, $color, $bg_color, $ref_dna) = @_; my $pixels_per_base = $self->scale; my $feature = $self->feature; unless ($ref_dna) { $gd->filledRectangle($x1+1, $y1, $x2, $y2, $bg_color); } my $strand = $feature->strand || 1; $strand *= -1 if $self->{flip}; my @bases = split '',$strand >= 0 ? $dna : $self->reversec($dna); my @refbases = split '',$strand >= 0 ? $ref_dna : $self->reversec($ref_dna); $color = $self->fgcolor unless $color; $bg_color = 0 unless $bg_color; my $font = $self->mono_font; my $lineheight = $font->height; # $y1 -= $lineheight/2 - 3; ##################NOT SURE WHY THIS WAS HERE BEFORE my $strands = $self->option('strand') || 'auto'; my ($forward,$reverse); if ($strands eq 'auto') { $forward = $feature->strand >= 0; $reverse = $feature->strand <= 0; } elsif ($strands eq 'both') { $forward = $reverse = 1; } elsif ($strands eq 'reverse') { $reverse = 1; } else { $forward = 1; } # minus strand features align right, not left $x1 += $pixels_per_base - $font->width - 1 if $strand < 0; for (my $i=0;$i<@bases;$i++) { my $x = $x1 + $i * $pixels_per_base; my $x_next = $x + $pixels_per_base; #draw background if DNA base aligns with reference (if ref given) $gd->filledRectangle($x+1, $y1, $x_next, $y2, $bg_color) if ( ($forward && $bases[$i] eq $refbases[$i]) || ($reverse && $complement{$bases[$i]} eq $refbases[$i]) ); $gd->char($font,$x+2,$y1,$bases[$i],$color) if $forward; $gd->char($font,$x+2,$y1+($forward ? $lineheight:0), $complement{$bases[$i]}||$bases[$i],$color) if $reverse; } } 1; __END__ =head1 NAME Bio::Graphics::Glyph::phylo_align - The "phylogenetic alignment" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a cladogram for any set of species along with their alignment data in relation to the reference species. At high magnification, base pair alignements will be displayed. At lower magnification, a conservation score plot will be drawn. Gaps as specified by CIGAR are supported. Currently the scores are drawn to a log plot with the restriction that the score will be the same across all base pairs within an alignment. It is hoped that this restriction can be addressed in the future. For this glyph to work, the feature must return a DNA sequence string in response to the dna() method. Also, a valid tree file must be available in a format readable by the Bio::Tree library. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -draw_clado_left Draws the Cladogram on left 0 -species_spacing Spacing of species in DNA 1 mode in units of font height -species_spacing_score Spacing of spcies in 5 conservation view in units of font height -hide_label Whether to label spcies 0 -tree_file Path of file containing undef cladogram tree information -tree_format Format of tree file newick -axis_color Color of the vertical axes fgcolor in the GC content graph -errcolor Color of all misalignment fgcolor indicators -mid_axis_color Color of the middle axis of the conservation score graph axis_color -clado_bg Color of the clado bg bgcolor indicators -ref_color Color of base pair bg for bgcolor the reference sequence -targ_color Color of base pair bg for bgcolor all base pairs that match reference =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHORS Hisanaga Mark Okada Lincoln Stein Elstein@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/splice_site.pm000555001750001750 565512366325116 23020 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::splice_site; use strict; use base qw(Bio::Graphics::Glyph::generic); use constant PWIDTH => 3; sub draw_component { my $self = shift; my $gd = shift; my ($left,$top) = @_; my($x1,$y1,$x2,$y2) = $self->bounds(@_); my $center = int(0.5+($x1+$x2)/2); my $direction = $self->option('direction'); my $height = $y2 - $y1; my $fraction = $self->option('height_fraction') || 1.0; my $bottom = $y2; $top = $y2 - $fraction * $height; # draw the base my $fgcolor = $self->fgcolor; $gd->line($center,$bottom,$center,$top,$fgcolor); if ($direction eq 'right') { $gd->line($center,$top,$center + PWIDTH,$top,$fgcolor); } elsif ($direction eq 'left') { $gd->line($center,$top,$center - PWIDTH,$top,$fgcolor); } } 1; =head1 NAME Bio::Graphics::Glyph::splice_site - The "splice_site" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph was designed to show an inverted "L" representing splice donors and acceptors. The vertical part of the L points downwards and is positioned in the center of the range (even if the range is quite large). In addition to the usual glyph options, this glyph recognizes: Option Value Description ------ ----- ----------- direction "left" or "right" direction the short part of the L points height_fraction 0.0 - 1.0 fractional height of the glyph, usually a callback that uses the feature's score to determine its height =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Xiaokang Pan Epan@cshl.orgE Copyright (c) 2001 BDGP This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/merge_parts.pm000555001750001750 720312366325116 23014 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::merge_parts; use strict; use base qw(Bio::Graphics::Glyph); sub my_description { return < [ 'integer', undef, 'This is the maximum gap, measured in bp, across which the glyph will', 'attempt to merge subfeatures in an attempt to simplify the appearance', 'at low magnifications. If undef, the max_gap will be calculated using', 'a simple exponential heuristic.'], } } sub merge_parts { my ($self,@parts) = @_; # This is the largest gap across which adjacent segments will be merged my $max_gap = $self->max_gap; my $last_part; my @sorted_parts = sort {$a->start <=> $b->start} @parts; for my $part (@sorted_parts) { if ($last_part) { my $start = $part->start; my $end = $part->stop; my $score = $part->score; my $pstart = $last_part->start; my $pend = $last_part->stop; my $pscore = $last_part->score || 0; my $len = 1 + abs($end - $start); my $plen = 1 + abs($pend - $pstart); # weighted average score my $new_score = (($score*$len)+($pscore*$plen))/($len+$plen); # don't merge if there is a gap > than the allowed size my $gap = abs($start - $pend); my $total = abs($end - $pstart); my $last_f = $last_part->feature; if ($gap > $max_gap) { $last_part = $part; next; } $part->{start} = $pstart; $part->{score} = $new_score; my ($left,$right) = $self->map_pt($pstart,$end+1); $part->{left} = $left; $part->{width} = ($right - $left) + 1; # flag the left feature for removal $last_part->{remove} = 1; } $last_part = $part; } @parts = grep {!defined $_->{remove}} @parts; return @parts; } sub max_gap { my $self = shift; $self->panel->{max_gap} ||= $self->option('max_gap'); return $self->panel->{max_gap} || $self->calculate_max_gap; } sub calculate_max_gap { my $self = shift; my $segment_length = $self->panel->length; # allow more aggressive merging for larger segments # by exponentially increasing max_gap my $max_gap = ($segment_length/10000)*($segment_length/500); $self->panel->{max_gap} = $max_gap; return $max_gap; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::merge_parts - a base class which suppors semantic zooming of scored alignment features =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This is a base class for Bio::Graphics::Glyph::graded_segments, Bio::Graphics::Glyph::heterogeneous_segments and Bio::Graphics::Glyph::merged_alignment. It adds internal methods to support semantic zooming of scored alignment features. It is not intended for end users. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L L L =head1 AUTHOR Sheldon McKay Emckays@cshl.eduE Copyright (c) 2005 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/processed_transcript.pm000555001750001750 2676212366325116 24777 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::processed_transcript; use strict; use base qw(Bio::Graphics::Glyph::transcript2); use constant DEFAULT_UTR_COLOR => '#D0D0D0'; sub new { my $class = shift; my $self = $class->SUPER::new(@_); $self->guess_options if !defined $self->option('implied_utrs') && !defined $self->option('adjust_exons'); $self; } sub guess_options { my $self = shift; my ($exons,$utrs,$cds); foreach ($self->parts) { $exons++ if $_->feature->type =~ /exon/i; $utrs++ if $_->feature->type =~ /utr$/i; $cds++ if $_->feature->type =~ /^cds/i; $self->configure(implied_utrs=>1) if $exons && $cds && !$utrs; $self->configure(adjust_exons=>1) if $exons && $utrs; } } # this option will generate implied UTRs by subtracting the # CDS features from the exons. sub create_implied_utrs { my $self = shift; return if $self->{'.implied_utrs'}++; # parts should be ordered from left to right my @features = sort {$a->start <=> $b->start} map {$_->feature} $self->parts; my @exons = grep {$_->type =~ /^exon/} @features; my @cds = grep {$_->type =~ /^CDS/ } @features; my @old_utr = grep {$_->type =~ /UTR/ } @features; # if there are already UTRs then we don't modify anything return if @old_utr; # if exons or CDS features are missing, then we abandon ship return unless @exons && @cds; my $first_cds = $cds[0]; my $last_cds = $cds[-1]; my $strand = $self->feature->strand; my $factory = $self->factory; # make the left-hand UTRs for (my $i=0;$i<@exons;$i++) { my $start = $exons[$i]->start; last if $start >= $first_cds->start; my $end = $first_cds->start > $exons[$i]->end ? $exons[$i]->end : $first_cds->start-1; my $utr = Bio::Graphics::Feature->new(-start=>$start, -end=>$end, -strand=>$strand, -type=>$strand >= 0 ? 'five_prime_UTR' : 'three_prime_UTR'); unshift @{$self->{parts}},$factory->make_glyph($self->{level}+1,$utr); } # make the right-hand UTRs for (my $i=$#exons; $i>=0; $i--) { my $end = $exons[$i]->end; last if $end <= $last_cds->end; my $start = $last_cds->end < $exons[$i]->start ? $exons[$i]->start : $last_cds->end+1; my $utr = Bio::Graphics::Feature->new(-start=>$start, -end=>$end, -strand=>$strand, -type=>$strand >= 0 ? 'three_prime_UTR' : 'five_prime_UTR'); push @{$self->{parts}},$factory->make_glyph($self->{level}+1,$utr); } } # Preprocess the glyph to remove overlaps between UTRs and # exons. The exons are clipped so that UTRs have precedence sub adjust_exons { my $self = shift; return if $self->{'.adjust_exons'}++; # find everything that is not an exon (utrs and cds's) my @parts = sort {$a->{left}<=>$b->{left}} $self->parts; my @exon = grep {$_->feature->type =~ /exon/i} @parts; my %seen = map {$_=>1} @exon; my @other = grep {!$seen{$_}} @parts; my @clipped_parts; my %positions = map {("$_->{left}:$_->{width}" =>1)} @other; my @unique_exons = grep {!$positions{"$_->{left}:$_->{width}"}} @exon; # the first and last exons may need to be clipped if they overlap # with another feature (CDS or UTR) my $first_exon = $unique_exons[0]; my $last_exon = $unique_exons[-1]; # deal with left hand side first my $e_left = $first_exon->{left}; my $e_right = $e_left + $first_exon->{width}; for my $other (@other) { my $o_left = $other->{left}; my $o_right = $o_left + $other->{width}; next if $e_left > $o_right; last if $e_right < $o_left; #dgg- need to skip 3prime/right utr for 1exon; end same as exon last if (@unique_exons == 1 && $o_left > $e_left); #dgg- o_ is 3prime not 5 # clip left hand side; may get clipped into oblivion! $first_exon->{left} = $o_right + 1; $first_exon->{width} = $e_right - $first_exon->{left}; } # deal with right hand side $e_left = $last_exon->{left}; $e_right = $e_left + $last_exon->{width}; for (my $i=$#other; $i>=0; $i--) { my $o_left = $other[$i]->{left}; my $o_right = $o_left + $other[$i]->{width}; next if $e_right < $o_left; last if $e_left > $o_right; # clip right hand side; may get clipped into oblivion! #dgg- !! this always clips to oblivion: $last_exon->{width} = ($e_left - 1) - $last_exon->{left}; $last_exon->{width} = $o_left - $last_exon->{left}; #dgg- } $self->{parts} = [ grep {$_->width > 0} sort {$a->{left}<=>$b->{left}} (@other,@unique_exons)]; } sub fixup_glyph { my $self = shift; return unless $self->level == 0; $self->create_implied_utrs if $self->option('implied_utrs'); $self->adjust_exons if $self->option('implied_utrs') || $self->option('adjust_exons'); } sub draw { my $self = shift; $self->fixup_glyph(); $self->SUPER::draw(@_); return unless $self->thin_utr; my $gd = shift; my ($dx,$dy) = @_; my $bgcolor = $self->bgcolor; my @parts = $self->parts; for (my $i = 0; $i < @parts; $i++) { if ($i >= 1 && ($parts[$i-1]->is_utr != $parts[$i]->is_utr)) { next unless $parts[$i-1]->end+1 == $parts[$i]->start; my ($x1,$y1,$x2,$y2) = $parts[$i]->bounds($dx,$dy+$self->top+$self->pad_top); my $height = $parts[$i-1]->is_utr ? $parts[$i-1]->height : $parts[$i]->height; my $center = ($y1+$y2)/2; $gd->line($x1,$center-$height/2,$x1,$center+$height/2,$bgcolor); # erase } } } sub boxes { my $self = shift; $self->fixup_glyph(); $self->SUPER::boxes(@_); } sub is_utr { my $self = shift; return $self->feature->primary_tag =~ /UTR|untranslated_region/i; } sub thin_utr { my $self = shift; $self->option('thin_utr'); } sub utr_color { my $self = shift; return $self->SUPER::bgcolor if $self->thin_utr; return $self->color('utr_color') if $self->option('utr_color'); return $self->factory->translate_color(DEFAULT_UTR_COLOR); } sub height { my $self = shift; my $height = $self->SUPER::height; return $height unless $self->thin_utr; return $self->is_utr ? int($height/1.5+0.5) : $height; } sub pad_top { my $self = shift; my $pad_top = $self->SUPER::pad_top; return $pad_top unless $self->thin_utr && $self->is_utr; return $pad_top + int(0.167*$self->SUPER::height + 0.5); } sub bgcolor { my $self = shift; return $self->SUPER::bgcolor unless $self->is_utr; return $self->utr_color; } sub connector { my $self = shift; return 'quill' if $self->option('decorate_introns'); return $self->SUPER::connector(@_); } sub _subfeat { my $self = shift; return $self->SUPER::_subfeat(@_) unless ref($self) && $self->{level} == 0 && $self->option('one_cds'); my $feature = shift; my @subparts = $feature->get_SeqFeatures(qw(CDS five_prime_UTR three_prime_UTR UTR)); # The CDS and UTRs may be represented as a single feature with subparts or as several features # that have different IDs. We handle both cases transparently. my @result; foreach (@subparts) { if ($_->primary_tag =~ /CDS|UTR/i) { my @cds_seg = $_->get_SeqFeatures; if (@cds_seg > 0) { push @result,@cds_seg } else { push @result,$_ } } else { push @result,$_; } } return @result; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::processed_transcript - The sequence ontology transcript glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used for drawing processed transcripts that have both CDS and UTR segments. The CDS is drawn in the background color, and the UTRs are drawn in an alternate color selected by the utr_color option. In addition, you can make the UTRs thinner than the CDS by setting the "thin_utr" option. For this glyph to produce the desired results, you should pass it a compound Bio::SeqFeature that has subfeatures of primary_tag "CDS" and "UTR". In fact, you may give it more specific types of UTR, including 5'-UTR, 3'-UTR, or the Sequence Ontology terms "untranslated_region," "five_prime_untranslated_region," and "three_prime_untranslated_region." =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type undef (false) -connector_color Connector color black -label Whether to draw a label undef (false) -description Whether to draw a description undef (false) -strand_arrow Whether to indicate undef (false) strandedness -hilite Highlight color undef (no color) In addition, the alignment glyph recognizes the following glyph-specific options: Option Description Default ------ ----------- ------- -thin_utr Flag. If true, UTRs will undef (false) be drawn at 2/3 of the height of CDS segments. -utr_color Color of UTR segments. Gray #D0D0D0 -decorate_introns Draw strand with little arrows undef (false) on the intron. -adjust_exons Fix exons so that they don't undef (false) overlap UTRs -implied_utrs Whether UTRs should be implied undef (false) from exons and CDS features -one_cds Some databases (e.g. FlyBase) represent their transcripts as having a single CDS that is broken up into multiple parts. Set this to true to display this type of feature. The B<-adjust_exons> option is needed to handle features in which the exons (SO type "exon") overlaps with the UTRs (SO types "five_prime_UTR" and "three_prime_UTR"). The exon parts of the glyph will be clipped so that it doesn't overlap with the UTR parts. The B<-implied_utrs> option is needed if there are no explicit UTR features. In this case, UTRs are derived by subtracting the positions of "CDS" subfeatures from the positions of "exon" subfeatures. B<-implied_utrs> implies the B<-adjust_exons> option. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/line.pm000555001750001750 1030712366325116 21452 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::line; use strict; use base qw(Bio::Graphics::Glyph::generic); sub my_description { return <SUPER::draw(@_); my $gd = shift; my $fg = $self->fgcolor; my $linewidth = $self->linewidth; $fg = $self->set_pen($linewidth) if $linewidth > 1; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $center = ($y1+$y2)/2; my ($lowest,$highest); my @parts = $self->parts; my $previous = -1; for (my $i = 0;$i<@parts;$i++) { my $part = $parts[$i]; my ($l,undef,$xx1,$yy1) = $part->calculate_boundaries(@_); $lowest = $l if !defined $lowest || $lowest > $l; $highest = $xx1 if !defined $xx1 || $highest < $xx1; my $next_part = $parts[$i+1] or last; my ($xx2,$yy2,undef,undef) = $next_part->calculate_boundaries(@_); $self->draw_connector($gd,$xx1,$xx2,$y1,$y2) if $xx1 < $xx2; } if ($lowest && $x1 < $lowest) { $self->draw_connector($gd,$x1,$lowest,$y1,$y2); } if ($highest && $x2 > $highest) { $self->draw_connector($gd,$highest,$x2,$y1,$y2); } my $height = $self->height; $height = 12 unless $height > 12; return unless $self->parts; if ($self->feature->strand > 0) { $self->arrow($gd,$x2,$x2+$height/2,$center); } elsif ($self->feature->strand < 0) { $self->arrow($gd,$x1,$x1-$height/2,$center); } } sub draw_connector { my $self = shift; my $gd = shift; my ($left,$right,$high,$low) = @_; my $fg = $self->fgcolor; my $center = ($high+$low)/2; $gd->line($left,$center,$right,$center,$fg); } sub bump { 0 } sub maxdepth { return } 1; __END__ =head1 NAME Bio::Graphics::Glyph::line - The "line" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a line parallel to the sequence segment. It is different from other glyphs in that it is designed to work with DAS tracks. The line is drawn BETWEEN the subparts, as if you specified a connector type of "line". =head2 OPTIONS This glyph takes only the standard options. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -strand_arrow Whether to indicate 0 (false) strandedness -hilite Highlight color undef (no color) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/three_letters.pm000555001750001750 612012366325116 23352 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::three_letters; # DAS-compatible package to use for drawing a line of groups of three letters # Non object-oriented utilities used here-and-there in Bio::Graphics modules =head1 NAME Bio::Graphics::Glyph::three_letters - DAS-compatible package to use for drawing a line of groups of three letters =cut use strict; use base qw(Bio::Graphics::Glyph::repeating_shape); sub pad_top { my $self = shift; my $top = $self->SUPER::pad_top; my $extra = 0.2 * $self->font->height; return $top + $extra; } sub default_interval { return 20; } sub default_text { return "CAG"; } sub draw_repeating_shape { my ($self, $gd, $x1, $y1, $x2, $y2, $fg) = @_; my $text = defined $self->option('text') ? $self->option('text') : $self->default_text(); while (length $text < 3) { $text .= " "; } $text = substr($text,0,3); my @letters = split //, $text; my $oneThird = ($x2-$x1) / 3; my $secondLetterX = $x1 + $oneThird; my $thirdLetterX = $x1 + 2*$oneThird; my $font = $self->option('labelfont') || $self->font; $gd->string($font, $x1, $y2-$font->height, $letters[0], $self->fontcolor); $gd->string($font, $secondLetterX, $y2-1.7*$font->height, $letters[1], $self->fontcolor); $gd->string($font, $thirdLetterX, $y2-$font->height, $letters[2], $self->fontcolor); } 1; __END__ =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws groups of three letters separated by horizontal lines. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -text The three letters to show "CAG" -width Width of one letter group 20 -interval Interval between 10 letter groups =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Vsevolod (Simon) Ilyushchenko Esimonf@cshl.eduE. Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/crossbox.pm000555001750001750 542212366325116 22347 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::crossbox; use strict; use base qw(Bio::Graphics::Glyph::generic); sub my_description { "This is a box with an 'X' inside the glyph." } # override draw_component to draw a crossed box rather than empty sub draw_component { my $self = shift; my $gd = shift; my $fg = $self->fgcolor; my ($left,$top) = @_; my($x1,$y1,$x2,$y2) = $self->bounds(@_); $self->filled_box($gd, $x1, $y1, $x2, $y2); $gd->line($x1,$y1,$x2,$y2,$fg); $gd->line($x1,$y2,$x2,$y1,$fg); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::crossbox - The "crossbox" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This is a box with an 'X' inside the glyph. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/dashed_line.pm000555001750001750 1107412366325116 22764 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::dashed_line; use strict; use base qw(Bio::Graphics::Glyph::generic); sub my_description { return < [ 'integer', 6, 'Width of the dash.'], space_size => [ 'integer', 3, 'Width of the space between dashes.'], space_color => [ 'color', undef, 'Color of the interval between dashes.', 'Nothing will be drawn between dashes if undef.'], shear => [ 'boolean', undef, 'Whether to offset the dash and space to create an interlocking effect.'], } } sub default_linewidth { return 1; } sub default_dash_size { return 6; } sub default_space_size { return 3; } sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $fg = $self->fgcolor; my $midY = ($y1+$y2) / 2; my $linewidth = defined $self->option('linewidth') ? $self->option('linewidth') : $self->default_linewidth(); my $dash_size = defined $self->option('dash_size') ? $self->option('dash_size') : $self->default_dash_size(); my $space_size = defined $self->option('space_size') ? $self->option('space_size') : $self->default_space_size(); my $space_color = $self->option('space_color'); my $shear = $self->option('shear') || ""; $space_color = $self->factory->translate_color($space_color) if $space_color; my ($x, $_y1, $_y2); $x = $x1; while ($x<$x2) { my $newX = $x+$dash_size; $newX = $x2 if $newX > $x2; if ($shear == 1) { $_y1 = $midY-$linewidth; $_y2 = $midY; } else { $_y1 = $midY - $linewidth/2; $_y2 = $midY + $linewidth/2; } $self->filled_box($gd,$x,$_y1,$newX,$_y2,$fg,$fg); last if $newX >= $x2; $x = $newX; $newX = $x+$space_size; $newX = $x2 if $newX > $x2; if ($space_color) { if ($shear == 1) { $_y1 = $midY; $_y2 = $midY+$linewidth; } else { $_y1 = $midY - $linewidth/2; $_y2 = $midY + $linewidth/2; } $self->filled_box($gd, $x,$_y1,$newX,$_y2,$space_color,$space_color); } $x = $newX; } } 1; __END__ =head1 NAME Bio::Graphics::Glyph::dashed_line - The "dashed line" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a dashed line. The lengths of the dash and the space are configurable. The space can be filled with a different color, thus making a two-colored line. Also, the two colors can be "sheared". =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -dash_size Width of one dash 6 -space_size Width of one space 3 between dashes -space_color Color of the space none between dashes -shear Whether to use shearing 0 (1 or 0) -linewidth Standard option, but 1 important here =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Vsevolod (Simon) Ilyushchenko Esimonf@cshl.eduE. Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/gene.pm000555001750001750 2472612366325116 21453 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::gene; use strict; use base 'Bio::Graphics::Glyph::processed_transcript'; sub my_descripton { return < [ 'boolean', undef, 'If true, then the display_name of each transcript', 'will be drawn to the left of the transcript glyph.'], thin_utr => [ 'boolean', undef, 'If true, UTRs will be drawn at 2/3 of the height of CDS segments.'], utr_color => [ 'color', 'grey', 'Color of UTR segments.'], decorate_introns => [ 'boolean', undef, 'Draw chevrons on the introns to indicate direction of transcription.' ], } } sub extra_arrow_length { my $self = shift; return 0 if $self->feature->primary_tag =~ /exon|utr/i; return $self->SUPER::extra_arrow_length unless $self->feature->primary_tag =~ /gene/; return 0 unless $self->{level} == 1; local $self->{level} = 0; # fake out superclass return $self->SUPER::extra_arrow_length; } sub pad_left { my $self = shift; my $type = $self->feature->primary_tag; return 0 unless $type =~ /gene|mRNA|transcript/; $self->SUPER::pad_left; } sub pad_right { my $self = shift; return 0 unless $self->{level} < 2; # don't invoke this expensive call on exons return $self->SUPER::pad_right; } sub pad_bottom { my $self = shift; return 0 unless $self->{level} < 2 || $self->is_utr; # don't invoke this expensive call on exons return $self->SUPER::pad_bottom; } sub pad_top { my $self = shift; return 0 unless $self->{level} < 2 || $self->is_utr; # don't invoke this expensive call on exons return $self->SUPER::pad_top; } sub bump { my $self = shift; my $bump; if ($self->{level} == 0 && lc $self->feature->primary_tag eq 'gene' && eval {($self->subfeat($self->feature))[0]->type =~ /RNA|pseudogene/i}) { $bump = $self->option('bump'); } else { $bump = $self->SUPER::bump; } return $bump; } sub label { my $self = shift; return unless $self->{level} < 2; if ($self->{feature}->primary_tag =~ /rna|transcript|pseudogene/i && $self->label_transcripts) { return $self->_label; } else { return $self->SUPER::label; } } sub label_position { my $self = shift; return 'top' if $self->{level} == 0; return 'left'; } sub label_transcripts { my $self = shift; return $self->{label_transcripts} if exists $self->{label_transcripts}; return $self->{label_transcripts} = $self->_label_transcripts; } sub _label_transcripts { my $self = shift; return $self->option('label_transcripts'); } sub draw_connectors { my $self = shift; if ($self->feature->primary_tag eq 'gene') { my @parts = $self->parts; return if @parts && $parts[0]->feature->primary_tag =~ /rna|transcript|pseudogene/i; } $self->SUPER::draw_connectors(@_); } sub maxdepth { my $self = shift; my $md = $self->Bio::Graphics::Glyph::maxdepth; return $md if defined $md; return 2; } sub _subfeat { my $class = shift; my $feature = shift; if ($feature->primary_tag =~ /^gene/i) { my @transcripts; for my $t (qw/mRNA tRNA snRNA snoRNA miRNA ncRNA pseudogene/) { push @transcripts, $feature->get_SeqFeatures($t); } return @transcripts if @transcripts; my @features = $feature->get_SeqFeatures; # no transcripts?! return whatever's there return @features if @features; # fall back to drawing a solid box if no subparts and level 0 return ($feature) if $class->{level} == 0; } elsif ($feature->primary_tag =~ /^CDS/i) { my @parts = $feature->get_SeqFeatures(); return ($feature) if $class->{level} == 0 and !@parts; return @parts; } my @subparts; if ($class->option('sub_part')) { @subparts = $feature->get_SeqFeatures($class->option('sub_part')); } elsif ($feature->primary_tag =~ /^mRNA/i) { @subparts = $feature->get_SeqFeatures(qw(CDS five_prime_UTR three_prime_UTR UTR)); } else { @subparts = $feature->get_SeqFeatures('exon'); } # The CDS and UTRs may be represented as a single feature with subparts or as several features # that have different IDs. We handle both cases transparently. my @result; foreach (@subparts) { if ($_->primary_tag =~ /CDS|UTR/i) { my @cds_seg = $_->get_SeqFeatures; if (@cds_seg > 0) { push @result,@cds_seg } else { push @result,$_ } } else { push @result,$_; } } # fall back to drawing a solid box if no subparts and level 0 return ($feature) if $class->{level} == 0 && !@result; return @result; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::gene - A GFF3-compatible gene glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used for drawing genes that may have alternatively-spliced transcripts. The various isoforms are stacked on top of each other and given a single label and description that apply to the entire stack. Each individual transcript's name is optionally printed to the left of the transcript glyph. Transcripts (splice isoforms) are drawn using the processed_transcript glyph. CDS features are drawn in the background color, and the UTRs are drawn in an alternate color selected by the utr_color option. In addition, you can make the UTRs thinner than the CDS by setting the "thin_utr" option. This glyph is designed to work properly with GFF3-style three-tier genes, in which the top level feature has the Sequence Ontology type of "gene", the second level feature(s) have the SO type "mRNA", and the third level feature(s) have the SO type "CDS", "five_prime_utr" and "three_prime_utr." Subparts named "UTR" are also honored. The feature can contain other subparts as well (e.g. exon, intron, translation), but they are currently ignored unless the option sub_part is supplied. If the sub_part option is used that feature type will be used and CDS and UTR features will be excluded. This could be used for specifying that exons be used instead, for example. This glyph is a subclass of processed_transcript, and recognizes the same options. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type undef (false) -connector_color Connector color black -label Whether to draw a label undef (false) -description Whether to draw a description undef (false) -strand_arrow Whether to indicate undef (false) strandedness -hilite Highlight color undef (no color) In addition, the gene glyph recognizes the following glyph-specific options: Option Description Default ------ ----------- ------- -label_transcripts undef (false) Flag. If true, then the display name of each transcript will be drawn to the left of the transcript glyph. -thin_utr Flag. If true, UTRs will undef (false) be drawn at 2/3 of the height of CDS segments. -utr_color Color of UTR segments. Gray #D0D0D0 -decorate_introns Draw strand with little arrows undef (false) on the intron. The B<-adjust_exons> and B<-implied_utrs> options are inherited from processed_transcript, but are quietly ignored. Please use the processed_transcript glyph for this type of processing. =head1 BUGS The SO terms are hard-coded. They should be more flexible and should recognize ISA relationships. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/hybrid_plot.pm000555001750001750 2404312366325116 23044 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::hybrid_plot; use strict; use base qw(Bio::Graphics::Glyph::wiggle_xyplot); use constant DEBUG=>0; use constant NEGCOL=>"orange"; use constant POSCOL=>"blue"; our $VERSION = '1.0'; sub my_options { { min_score => [ 'integer', undef, "Minimum value of the signal graph feature's \"score\" attribute."], max_score => [ 'integer', undef, "Maximum value of the signal graph feature's \"score\" attribute."], flip_sign => [ 'boolean', 0, "Optionally flip the signal for wigfileB (if the scores are positive but we wish to paint the signal along negative y-axis)"] }; } sub my_description { return <option('u_method') || 'match'; } # Override height and pad functions (needed to correctly space features with different sources): sub height { my $self = shift; my $h = $self->SUPER::height; return $self->feature->method eq $self->_check_uni ? 3 : $h; } sub pad_top { my $self = shift; return $self->feature->method eq $self->_check_uni ? 0 : 4; } sub pad_bottom { my $self = shift; return $self->feature->method eq $self->_check_uni ? 0 : 4; } # we override the draw method so that it dynamically creates the parts needed # from the wig file rather than trying to fetch them from the database sub draw { my $self = shift; my ($gd,$dx,$dy) = @_; my ($left,$top,$right,$bottom) = $self->calculate_boundaries($dx,$dy); my $height = $bottom - $top; my $feature = $self->feature; my $set_flip = $self->option('flip_sign') || 0; #Draw individual features for reads (unlike wiggle features reads will have scores) my $t_id = $feature->method; if($t_id && $t_id eq $self->_check_uni){return Bio::Graphics::Glyph::generic::draw_component($self,@_);} #Draw multiple graph if we don't have a score my @wiggles = $self->get_wiggles($feature); my ($fasta) = $feature->get_tag_values('fasta'); my($scale,$y_origin,$min_score,$max_score); $self->panel->startGroup($gd); #Depending on what we have (wiggle or BigWig) pick the way to paint the signal graph for(my $w = 0; $w < @wiggles; $w++){ if ($w > 0) { $self->configure('bgcolor', NEGCOL); $self->configure('no_grid', 1); } else { $self->configure('bgcolor', POSCOL); } if ($wiggles[$w] =~ /\.wi\w{1,3}$/) { $self->draw_wigfile($feature,$wiggles[$w],@_); } elsif ($wiggles[$w] =~ /\.bw$/) { my $flip = ($w > 0 && $set_flip) ? -1 : 1; eval "require Bio::DB::BigWig;1" or die $@; eval "require Bio::DB::Sam; 1" or die $@; my @args = (-bigwig => "$wiggles[$w]"); push @args,(-fasta => Bio::DB::Sam::Fai->open($fasta)) if $fasta; my $wig = Bio::DB::BigWig->new(@args); my ($summary) = $wig->features(-seq_id => $feature->segment->ref, -start => $self->panel->start, -end => $self->panel->end, -type => 'summary'); my $stats = $summary->statistical_summary($self->width); my $interval_method = $self->option('interval_method') || 'mean'; my @vals; if ($interval_method eq 'mean') { @vals = map {$_->{validCount} ? $_->{sumData}/$_->{validCount} * $flip : undef} @$stats; } elsif ($interval_method eq 'sum') { @vals = map {$_->{validCount} ? $_->{sumData} * $flip : undef} @$stats; } elsif ($interval_method eq 'min') { @vals = map {$_->{validCount} ? $_->{minVal} * $flip : undef} @$stats; } elsif ($interval_method eq 'max') { @vals = map {$_->{validCount} ? $_->{maxVal} * $flip : undef} @$stats; } else { warn "unrecognized interval method $interval_method!"; } $self->_draw_coverage($summary,\@vals,@_); } } } sub get_wiggles { my $self = shift; my $feature = shift; my @wiggles; foreach ('A'..'Z') { my $filename = 'wigfile'.$_; my ($wiggle) = $feature->get_tag_values('wigfile'.$_); push (@wiggles, $wiggle) if $wiggle; } return @wiggles; } sub minmax { my $self = shift; my $parts = shift; my $autoscale = $self->option('autoscale') || 'local'; my $set_flip = $self->option('flip_sign') || 0; my $min_score = $self->min_score unless $autoscale eq 'z_score'; my $max_score = $self->max_score unless $autoscale eq 'z_score'; my $do_min = !defined $min_score; my $do_max = !defined $max_score; my @wiggles = $self->get_wiggles($self->feature); my ($min,$max,$mean,$stdev); my @args = (-seq_id => (eval{$self->feature->segment->ref}||''), -start => $self->panel->start, -end => $self->panel->end, -type => 'summary'); for my $w (@wiggles) { my ($a,$b,$c,$d); if ($w =~ /\.bw$/) { eval "require Bio::DB::BigWig;1" or die $@; my $wig = Bio::DB::BigWig->new(-bigwig=>$w) or next; ($a,$b,$c,$d) = $self->bigwig_stats($autoscale,$wig->features(@args)); } elsif ($w =~ /\.wi\w{1,3}$/) { eval "require Bio::Graphics::Wiggle;1" or die $@; my $wig = Bio::Graphics::Wiggle->new($w); ($a,$b,$c,$d) = $self->wig_stats($autoscale,$wig); } $min = $a if !defined $min || $min > $a; $max = $b if !defined $max || $max < $b; $mean += $c; $stdev += $d**2; } $stdev = sqrt($stdev); $min = $max * -1 if ($set_flip); $min_score = $min if $do_min; $max_score = $max if $do_max; return $self->sanity_check($min_score,$max_score,$mean,$stdev); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::hybrid_plot - An xyplot plot drawing dual graph using data from two or more wiggle files per track =head1 SYNOPSIS See and . =head1 DESCRIPTION Note that for full functionality this glyph requires Bio::Graphics::Glyph::generic (generic glyph is used for drawing individual matches for small RNA alignments at a high zoom level, specified by semantic zooming in GBrowse conf file) Unlike the regular xyplot, this glyph draws two overlapping graphs using value data in Bio::Graphics::Wiggle file format: track type=wiggle_0 name="Experiment" description="snRNA seq data" visibility=pack viewLimits=-2:2 color=255,0,0 altColor=0,0,255 windowingFunction=mean smoothingWindow=16 2L 400 500 0.5 2L 501 600 0.5 2L 601 700 0.4 2L 701 800 0.1 2L 800 900 0.1 ##gff-version 3 2L Sample_rnaseq rnaseq_wiggle 41 3009 . . . ID=Samlpe_2L;Name=Sample;Note=YourNoteHere;wigfileA=/datadir/track_001.2L.wig;wigfileB=/datadir/track_002.2L.wig The "wigfileA" and "wigfileB" attributes give a relative or absolute pathname to Bio::Graphics::Wiggle format files for two concurrent sets of data. Basically, these wigfiles contain the data on signal intensity (counts) for sequences aligned with genomic regions. In wigfileA these data are additive, so for each sequence region the signal is calculated as a sum of signals from overlapping matches (signal). In wigfileB the signal represents the maximum value among all sequences (signal quality) aligned with the current region so the user can see the difference between accumulated signal from overlapping multiple matches (which may likely be just a noise from products of degradation) and high-quality signal from unique sequences. For a third wiggle file use the attribute "wigfileC" and so forth. It is essential that wigfile entries in gff file do not have score, because score used to differentiate between data for dual graph and data for matches (individual features visible at higher magnification). After an update to wiggle_xyplot code colors for dual plot are now hard-coded (blue for signal and orange for signal quality). Alpha channel is also handled by wiggle_xyplot code now. =head2 OPTIONS In addition to some of the wiggle_xyplot glyph options, the following options are recognized: Name Value Description ---- ----- ----------- wigfileA path name Path to a Bio::Graphics::Wiggle file for accumulated vales in 10-base bins wigfileB path name Path to a Bio::Graphics::Wiggle file for max values in 10-base bins fasta path name Path to fasta file to enable BigWig drawing u_method method name Use method of [method name] to identify individual features (like alignment matches) to show at high zoom level. By default it is set to 'match' =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Peter Ruzanov Epruzanov@oicr.on.caE. Copyright (c) 2008 Ontario Institute for Cancer Research This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/dot.pm000555001750001750 1123612366325116 21313 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::dot; # DAS-compatible package to use for drawing a ring or filled circle use strict; use base qw(Bio::Graphics::Glyph::point_glyph); use constant PI => 3.14159; sub my_description { return < [ 'boolean', undef, 'If true, draws a fixed-radius ellipse at the center of the feature,', 'regardless of the feature\'s length.'], } } sub draw { my $self = shift; my $gd = shift; my $fg = $self->fgcolor; # now draw a circle my ($left,$top) = @_; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $xmid = (($x1+$x2)/2); my $width = abs($x2-$x1); my $ymid = (($y1+$y2)/2); my $height = abs($y2-$y1); # only point ovals allowed now my $r = $self->height; # Code to maintain compliancy with gd 1.8.4 # gd 1.8.4 does not support the ellipse() or filledEllipse() methods. # Let's maintain the filledEllipse approach for installations # using gd2 or for drawing images with GD::SVG # Otherwise, we will use fill as before. # The can() method fails with GD::SVG. Why? my $bg = $self->bgcolor; if ($gd->can('filledEllipse') || $gd =~ /SVG/ ) { $gd->filledEllipse($xmid,$ymid,$r,$r,$bg) if ($bg); # Draw the border (or unfilled ellipse) $gd->ellipse($xmid,$ymid,$r,$r,$fg); } else { # Let's draw a circle in the gd 1.8.4 manner $gd->arc($xmid,$ymid,$r,$r,0,360,$fg); $gd->fillToBorder($xmid,$ymid,$fg,$bg) if ($bg); } #how about a fuse for the bomb? #work in degrees, not radians. So we define PI above if(defined $self->option('stem')){ my $angle = $self->option('stem'); $gd->line($xmid+($r/PI*sin($angle*PI/180)), $ymid+($r/PI*cos($angle*PI/180)), $xmid+($r*sin($angle*PI/180)), $ymid+($r*cos($angle*PI/180)),$fg); } $self->draw_label($gd,@_) if $self->option('label'); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::dot - The "dot" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws an ellipse the width of the scaled feature passed, and height a possibly configured height (See Bio::Graphics::Glyph). =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -point Whether to draw an ellipse feature width the scaled width of the feature or with radius point. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/protein.pm000555001750001750 2064012366325116 22204 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::protein; use strict; use base qw(Bio::Graphics::Glyph::cds); # turn off description sub description { 0 } # turn off label # sub label { 1 } sub height { my $self = shift; my $font = $self->mono_font; return $self->dna_fits ? 2 * $font->height : $self->do_kd ? $self->SUPER::height : 0; } sub do_kd { my $self = shift; my $do_kd = $self->option('do_kd'); return if defined($do_kd) && !$do_kd; return 1; } sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->bounds(@_); if ($self->protein_fits && $self->{cds_translation}) { return $self->SUPER::draw_component($gd,@_); } elsif ($self->{cds_translation}) { $self->draw_kd_plot($gd,$self->{cds_translation},$x1,$y1,$x2,$y2); } else { $self->Bio::Graphics::Glyph::generic::draw_component($gd,@_); } } sub do_cds_translation { return 1 } sub draw_protein { my $self = shift; my ($gd,$protein,$x1,$y1,$x2,$y2) = @_; my $pixels_per_base = $self->scale; my $feature = $self->feature; my @bases = split '', $protein; my $color = $self->fgcolor; my $font = $self->mono_font; my $lineheight = $font->height; $y1 -= $lineheight/2 - 3; my $start = $self->panel->left + $self->map_pt($feature->start); my $end = $self->panel->left + $self->map_pt($feature->end); my $offset = int(($x1-$start-1)/$pixels_per_base); for (my $i=$offset;$i<@bases;$i++) { my $x = $start + $i * $pixels_per_base; next if $x+1 < $x1; last if $x > $x2; $gd->char($font,$x+2,$y1,$bases[$i],$color); } } sub draw_kd_plot { my $self = shift; my $gd = shift; my $protein = shift; my ($x1,$y1,$x2,$y2) = @_; my $kd_window = $self->option('kd_window') || 9; # Calculate the KD plot ... my %scores = ( I => 4.5, V => 4.2, L => 3.8, F => 2.8, C => 2.5, M => 1.9, A => 1.8, G => -0.4, T => -0.7, W => -0.9, S => -0.8, Y => -1.3, P => -1.6, H => -3.2, E => -3.5, Q => -3.5, D => -3.5, N => -3.5, K => -3.9, R => -4.5, ); my @datapoints; my @seq = split('', uc($protein)); $kd_window = $kd_window < scalar(@seq) ? $kd_window : scalar(@seq); my $maxkd = 4.5; my $minkd = -4.5; my $kd = 0; for (my $i = 0 ; $i < @seq && $i < $kd_window ; $i++) { $kd += $scores{$seq[$i]} || 0; } my $content = $kd / $kd_window; push @datapoints, $content; for (my $i = $kd_window; $i < @seq; $i++) { $kd -= $scores{$seq[$i-$kd_window]} || 0; $kd += $scores{$seq[$i]} || 0; $content = $kd / $kd_window; push @datapoints, $content; } my $scale = $maxkd - $minkd; foreach (my $i = 0; $i < @datapoints; $i++) { $datapoints[$i] = ($datapoints[$i] - $minkd) / $scale; } # Calculate values that will be used in the layout my $bin_height = $y2-$y1; my $fgcolor = $self->fgcolor; my $bgcolor = $self->factory->translate_color($self->panel->gridcolor); my $axiscolor = $self->color('axis_color') || $fgcolor; # Draw the axes $gd->line($x1, $y1, $x1, $y2, $axiscolor); $gd->line($x2-2,$y1, $x2-2,$y2, $axiscolor); $gd->line($x1, $y1, $x1+3,$y1, $axiscolor); $gd->line($x1, $y2, $x1+3,$y2, $axiscolor); $gd->line($x1, ($y2+$y1)/2,$x1+3,($y2+$y1)/2,$axiscolor); $gd->line($x2-4,$y1, $x2-1, $y1, $axiscolor); $gd->line($x2-4,$y2, $x2-1, $y2, $axiscolor); $gd->line($x2-4,($y2+$y1)/2,$x2-1,($y2+$y1)/2,$axiscolor); $gd->line($x1+5,$y2, $x2-5,$y2, $bgcolor); $gd->line($x1+5,($y2+$y1)/2,$x2-5,($y2+$y1)/2,$bgcolor); $gd->line($x1+5,$y1, $x2-5,$y1, $bgcolor); my $label = 'Kyte-Doolittle hydropathy plot'; $gd->string($self->mono_font,$x1+5,$y1,$label,$axiscolor) if $bin_height > $self->mono_font->height*2 && $self->width > $self->mono_font->width*length($label); $gd->string($self->mono_font,$x2-20,$y1,$maxkd,$axiscolor) if $bin_height > $self->mono_font->height*2.5; $gd->string($self->mono_font,$x2-20,$y2-$self->mono_font->height,$minkd,$axiscolor) if $bin_height > $self->mono_font->height*2.5; my $graphwidth = $x2 - $x1; $scale = $graphwidth / (@datapoints + $kd_window - 1); for (my $i = 1; $i < @datapoints; $i++) { my $x = $i + $kd_window / 2; my $xlo = $x1 + ($x - 1) * $scale; my $xhi = $x1 + $x * $scale; my $y = $y2 - ($bin_height*$datapoints[$i]); $gd->line($xlo, $y2 - ($bin_height*$datapoints[$i-1]), $xhi, $y, $fgcolor); } } sub make_key_feature { my $self = shift; my @gatc = qw(A C D E F G H I K L M N P Q R S T V W Y); my $offset = $self->panel->offset; my $scale = 1/$self->scale; # base pairs/pixel my $start = $offset+1; my $stop = $offset+100*$scale; my $feature = Bio::Graphics::Feature->new(-start=> $start, -stop => $stop, -seq => join('',map{$gatc[rand 4]} (1..500)), -name => $self->option('key'), -strand => '+1', ); $feature; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::protein - The "protein" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws protein sequences. At high magnifications, this glyph will draw the actual amino acids of the sequence. At low magnifications, the glyph will plot the Kyte-Doolite hydropathy. By default, the KD plot will use a window size of 9 residues, but this can be changed by specifying the kd_window option. The feature may return either a protein sequence or a DNA sequence in response to the seq() method. However, if it returns a DNA sequence, then the feature must also return the correct phase and strand in order for the glyph to translate its open reading frame correctly! =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -do_kd Whether to draw the Kyte- true Doolittle hydropathy plot at low mags -kd_window Size of the sliding window 9 to use in the KD hydropathy calculation. -axis_color Color of the vertical axes fgcolor in the KD hydropathy plot -phase_style The way phase is to be interpreted. One of "012" "012" or "021" =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Aaron J. Mackey, based on the "dna" glyphy by Lincoln Stein Elstein@cshl.orgE and Peter Ashton Epda@sanger.ac.ukE. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/smoothing.pm000555001750001750 274412366325116 22520 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::smoothing; use base 'Bio::Graphics::Glyph'; use strict; use constant SMOOTHING => 'mean'; sub my_options { { smoothing => [ ['none','mean','max','min'], 'none', 'Whether to smooth data values across a defined window.', 'Mean smoothing will run a rolling mean across the window.', 'Max smoothing will take the maximum value across the window,', 'and min smoothing will take the minimum value.' ], smoothing_window => [ 'integer', undef, 'Size of the smoothing window. If not specified, the window', 'will be taken to be 10% of the region under display.' ], }; } sub get_smoothing { my $self = shift; return 'none' if $self->smooth_window == 1; return $self->option('smoothing') or SMOOTHING; } sub smooth_window { my $self = shift; my $smooth_window = $self->option('smoothing_window') || $self->option('smoothing window'); # drat! return $smooth_window if defined $smooth_window; my $start = $self->smooth_start; my $end = $self->smooth_end; $smooth_window = int (($end - $start)/(10*$self->width)); $smooth_window = 1 unless $smooth_window > 2; return $smooth_window; } sub smooth_start { my $self = shift; my ($start) = sort {$b<=>$a} ($self->feature->start,$self->panel->start); return $start; } sub smooth_end { my $self = shift; my ($end) = sort {$a<=>$b} ($self->feature->end,$self->panel->end); return $end; } 1; Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/point_glyph.pm000444001750001750 70312366325116 23013 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::point_glyph; use strict; use base qw(Bio::Graphics::Glyph::generic); sub box { my $self = shift; my @result = $self->SUPER::box(); return @result unless $self->option('point') && $result[2]-$result[0] < 3; my $h = $self->option('height')/2; my $mid = int(($result[2]+$result[0])/2); $result[0] = $mid-$h-1; # fudge a little to make it easier to click on $result[2] = $mid+$h+1; return @result; } 1; Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/track.pm000555001750001750 742012366325116 21611 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::track; use strict; use base qw(Bio::Graphics::Glyph); # track sets connector to empty sub connector { my $self = shift; return $self->SUPER::connector(@_) if $self->all_callbacks; return 'none'; } sub draw { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; # the clipping code here prevents poorly-behaving glyphs from # drawing outside the track my @clip; if ($gd->can('clip')) { @clip = $gd->clip(); # glyphs are allowed a slop area of ~3 on either side and 6 on the top and bottom # in order to spill out over their boundaries. Beyond this they start overlapping # with other glyphs in an ugly way. my @cliprect = ($left-$self->panel->pad_left, $top-6, $self->panel->right+$self->panel->pad_right, $top+$self->layout_height+6); $gd->clip(@cliprect); } my @parts = $self->parts; # give the glyph a chance to do track-wide normalization if it supports it $self->normalize_track(@parts); # dynamic assignment of colors if ($self->option('color_series') || $self->option('color_cycle')) { my $series = $self->option('color_cycle'); $series ||= 'red blue green yellow orange brown aqua black fuchsia green lime maroon navy olive purple silver teal magenta'; my @color_series = ref($series) eq 'ARRAY' ? @$series : split /\s+/,$series; my $index = 0; my %color_cache; my $closure = sub { my $glyph = pop; return $color_cache{$glyph} ||= $color_series[$index++ % @color_series]; }; $self->configure(bgcolor => $closure); } local $Bio::Graphics::Panel::GlyphScratch; # set $GlyphScratch to undef for (my $i=0; $i<@parts; $i++) { $parts[$i]->draw_highlight($gd,$left,$top); $parts[$i]->draw_it($gd,$left,$top,0,1); } $gd->clip(@clip) if @clip; } # do nothing for components # sub draw_component { } sub normalize_track { my $self = shift; my @parts = @_; @parts = map {$_->isa('Bio::Graphics::Glyph::group') ? $_->parts : $_} @parts; $parts[0]->normalize_track(@parts) if $parts[0] && $parts[0]->can('normalize_track'); } sub bump { my $self = shift; return 1 if $self->option('group_subtracks'); my $bump = $self->SUPER::bump; return 1 if $bump eq 'fast' or $bump == 3; return $bump; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::track - The "track" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used internally by Bio::Graphics::Panel for laying out tracks. It should not be used explicitly. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/whiskerplot.pm000555001750001750 3252212366325116 23101 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::whiskerplot; use strict; use base qw(Bio::Graphics::Glyph::xyplot); sub lookup_draw_method { my $self = shift; return 'draw_whiskerplot'; } sub draw_whiskerplot { my $self = shift; my ($gd,$left,$top) = @_; my @parts = $self->parts; my $fgcolor = $self->fgcolor; for my $part (@parts) { my ($x1,$y1,$x2,$y2) = $part->calculate_boundaries($left,$top); my $y = $part->{_y_position}; # get the range and tendency if (my $range = $part->get_range) { unshift @$range,undef if @$range == 4; # backward compatibility my ($median,$range_low,$range_high,$lower_quartile,$higher_quartile) = @$range; $y = $part->{_y_position} = $self->score2position($median) if defined $median; # draw the quartile box my ($box_top,$box_bottom) = ($y,$y); if (defined $lower_quartile && defined $higher_quartile) { $box_top = $self->score2position($higher_quartile); $box_bottom = $self->score2position($lower_quartile); $self->filled_box($gd,$x1,$box_top,$x2,$box_bottom); } # calculate positions of the range whiskers if (defined $range_low && defined $range_high) { my $range_top = $self->score2position($range_high); my $range_bottom = $self->score2position($range_low); my $center = ($x1+$x2)/2; my $whisker_left = $center-5; my $whisker_right = $center+5; $whisker_left = $x1 if $whisker_left < $x1; $whisker_right = $x2 if $whisker_right > $x2; # top whisker $gd->line($center,$box_top,$center,$range_top,$fgcolor); $gd->line($whisker_left,$range_top,$whisker_right,$range_top,$fgcolor); # bottom whisker $gd->line($center,$box_bottom,$center,$range_bottom,$fgcolor); $gd->line($whisker_left,$range_bottom,$whisker_right,$range_bottom,$fgcolor); } } # draw the median $gd->line($x1,$y,$x2,$y,$fgcolor); } } sub get_range { my $self = shift; my $range = $self->option('range'); return $range if defined $range; # otherwise get it from the feature return [$self->feature->get_tag_values('range')]; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::whiskerplot - The whiskerplot glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is used for drawing features associated with numeric data using "box and whisker" style data points, which display the mean value, extreme ranges and first and third quartiles (or standard deviation). The boxes drawn by this glyph are similar to L, except that they are oriented vertically so that the position and height of the box indicates the mean value and spread of the data, and the width indicates the genomic extent of the value. Like the xyplot glyph (from which it inherits the whiskerplot is designed to work on a single feature group that contains subfeatures. It is the subfeatures that carry the score information. The best way to arrange for this is to create an aggregator for the feature. We'll take as an example a histogram of repeat density in which interval are spaced every megabase and the score indicates the number of repeats in the interval; we'll assume that the database has been loaded in in such a way that each interval is a distinct feature with the method name "density" and the source name "repeat". Furthermore, all the repeat features are grouped together into a single group (the name of the group is irrelevant). If you are using Bio::DB::GFF and Bio::Graphics directly, the sequence of events would look like this: my $agg = Bio::DB::GFF::Aggregator->new(-method => 'repeat_density', -sub_parts => 'density:repeat'); my $db = Bio::DB::GFF->new(-dsn=>'my_database', -aggregators => $agg); my $segment = $db->segment('Chr1'); my @features = $segment->features('repeat_density'); my $panel = Bio::Graphics::Panel->new; $panel->add_track(\@features, -glyph => 'xyplot', -scale => 'both', ); If you are using Generic Genome Browser, you will add this to the configuration file: aggregators = repeat_density{density:repeat} clone alignment etc Note that it is a good idea to add some padding to the left and right of the panel; otherwise the scale will be partially cut off by the edge of the image. The mean (or median) of the data will be taken from the feature score. The range and quartile data must either be provided in a feature tag named "range", or must be generated dynamically by a -range callback option passed to add_track. The data returned by the tag or option should be an array reference containing the following five fields: [$median,$range_low,$range_high,$quartile_low,$quartile_high] where $range_low and $range_high correspond to the low and high value of the "whiskers" and $quartile_low and $quartile_high correspond to the low and high value of the "box." If $median is undef or missing, then the score field of the feature will be used instead. It may be useful to repeat the median in the score field in any case, in order to allow the minimum and maximum range calculations of the graph itself to occur. See Examples for three ways of generating an image. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) In addition, the alignment glyph recognizes all the options of the xyplot glyph, as well as the following glyph-specific option: Option Description Default ------ ----------- ------- -range Callback to return median, none - data comes from feature "range" tag range and quartiles for each sub feature =head1 EXAMPLES Here are three examples of how to use this glyph. =head2 Example 1: Incorporating the numeric data in each subfeature #!/usr/bin/perl use strict; use Bio::Graphics; use Bio::SeqFeature::Generic; my $bsg = 'Bio::SeqFeature::Generic'; my $feature = $bsg->new(-start=>0,-end=>1000); for (my $i=0;$i<1000;$i+=20) { my $y = (($i-500)/10)**2; my $range = make_range($y); my $part = $bsg->new(-start=>$i,-end=>$i+16, -score=>$y,-tag => { range=>$range }); $feature->add_SeqFeature($part); } my $panel = Bio::Graphics::Panel->new(-length=>1000,-width=>800,-key_style=>'between', -pad_left=>40,-pad_right=>40); $panel->add_track($feature, -glyph=>'arrow', -double=>1, -tick=>2); $panel->add_track($feature, -glyph=>'whiskerplot', -scale=>'both', -height=>200, -min_score => -500, -key =>'Whiskers', -bgcolor => 'orange', ); print $panel->png; sub make_range { my $score = shift; my $range_top = $score + 5*sqrt($score) + rand(50); my $range_bottom = $score - 5*sqrt($score) - rand(50); my $quartile_top = $score + 2*sqrt($score) + rand(50); my $quartile_bottom = $score - 2*sqrt($score) - rand(50); return [$score,$range_bottom,$range_top,$quartile_bottom,$quartile_top]; } =head2 Example 2: Generating the range data with a callback #!/usr/bin/perl use strict; use Bio::Graphics; use Bio::SeqFeature::Generic; my $bsg = 'Bio::SeqFeature::Generic'; my $feature = $bsg->new(-start=>0,-end=>1000); for (my $i=0;$i<1000;$i+=20) { my $y = (($i-500)/10)**2; my $part = $bsg->new(-start=>$i,-end=>$i+16,-score=>$y); $feature->add_SeqFeature($part); } my $panel = Bio::Graphics::Panel->new(-length=>1000,-width=>800,-key_style=>'between', -pad_left=>40,-pad_right=>40); $panel->add_track($feature, -glyph=>'arrow', -double=>1, -tick=>2); $panel->add_track($feature, -glyph=>'whiskerplot', -scale=>'both', -height=>200, -min_score => -500, -key =>'Whiskers', -bgcolor => 'orange', -range => \&make_range, ); print $panel->png; sub make_range { my $feature = shift; my $score = $feature->score; my $range_top = $score + 5*sqrt($score) + rand(50); my $range_bottom = $score - 5*sqrt($score) - rand(50); my $quartile_top = $score + 2*sqrt($score) + rand(50); my $quartile_bottom = $score - 2*sqrt($score) - rand(50); return [$score,$range_bottom,$range_top,$quartile_bottom,$quartile_top]; } =head2 Example 3: Generating the image from a FeatureFile =over 4 =item The file: [general] pixels = 840 pad_left = 40 pad_right = 40 [contig] glyph = arrow double = 1 tick = 2 [data] glyph = whiskerplot scale = both height = 200 min_score = -500 max_score = 2800 key = Whiskers bgcolor = orange chr1 . contig 1 1000 . . . Contig chr1 chr1 . data 0 16 2500 . . Dataset data1; range 2209,2769,2368,2619 chr1 . data 20 36 2304 . . Dataset data1; range 2051,2553,2163,2435 chr1 . data 40 56 2116 . . Dataset data1; range 1861,2384,1983,2253 chr1 . data 60 76 1936 . . Dataset data1; range 1706,2181,1819,2059 chr1 . data 80 96 1764 . . Dataset data1; range 1516,1995,1646,1849 chr1 . data 100 116 1600 . . Dataset data1; range 1359,1834,1513,1699 chr1 . data 120 136 1444 . . Dataset data1; range 1228,1654,1330,1565 chr1 . data 140 156 1296 . . Dataset data1; range 1105,1520,1198,1385 chr1 . data 160 176 1156 . . Dataset data1; range 983,1373,1062,1270 chr1 . data 180 196 1024 . . Dataset data1; range 853,1184,914,1116 chr1 . data 200 216 900 . . Dataset data1; range 722,1093,801,965 chr1 . data 220 236 784 . . Dataset data1; range 621,945,724,859 chr1 . data 240 256 676 . . Dataset data1; range 532,833,605,742 chr1 . data 260 276 576 . . Dataset data1; range 433,714,485,653 chr1 . data 280 296 484 . . Dataset data1; range 331,600,418,545 chr1 . data 300 316 400 . . Dataset data1; range 275,535,336,459 chr1 . data 320 336 324 . . Dataset data1; range 198,434,270,374 chr1 . data 340 356 256 . . Dataset data1; range 167,378,219,322 chr1 . data 360 376 196 . . Dataset data1; range 114,303,118,249 chr1 . data 380 396 144 . . Dataset data1; range 39,248,87,197 chr1 . data 400 416 100 . . Dataset data1; range 17,173,68,141 chr1 . data 420 436 64 . . Dataset data1; range -14,125,18,84 chr1 . data 440 456 36 . . Dataset data1; range -8,74,11,64 chr1 . data 460 476 16 . . Dataset data1; range -46,77,0,43 chr1 . data 480 496 4 . . Dataset data1; range -40,43,-7,36 chr1 . data 500 516 0 . . Dataset data1; range -43,0,-43,22 chr1 . data 520 536 4 . . Dataset data1; range -6,52,-4,54 chr1 . data 540 556 16 . . Dataset data1; range -5,38,-27,52 chr1 . data 560 576 36 . . Dataset data1; range -43,109,18,66 chr1 . data 580 596 64 . . Dataset data1; range -1,134,3,112 chr1 . data 600 616 100 . . Dataset data1; range 49,186,69,124 chr1 . data 620 636 144 . . Dataset data1; range 79,225,71,169 chr1 . data 640 656 196 . . Dataset data1; range 124,289,120,266 chr1 . data 660 676 256 . . Dataset data1; range 154,378,197,320 chr1 . data 680 696 324 . . Dataset data1; range 220,439,249,396 chr1 . data 700 716 400 . . Dataset data1; range 291,511,331,458 chr1 . data 720 736 484 . . Dataset data1; range 350,627,400,572 chr1 . data 740 756 576 . . Dataset data1; range 446,718,502,633 chr1 . data 760 776 676 . . Dataset data1; range 515,833,576,777 chr1 . data 780 796 784 . . Dataset data1; range 606,959,724,856 chr1 . data 800 816 900 . . Dataset data1; range 747,1058,799,1004 chr1 . data 820 836 1024 . . Dataset data1; range 817,1231,958,1089 chr1 . data 840 856 1156 . . Dataset data1; range 961,1341,1069,1225 chr1 . data 860 876 1296 . . Dataset data1; range 1103,1511,1219,1385 chr1 . data 880 896 1444 . . Dataset data1; range 1218,1660,1338,1535 chr1 . data 900 916 1600 . . Dataset data1; range 1377,1828,1496,1703 chr1 . data 920 936 1764 . . Dataset data1; range 1547,2020,1674,1858 chr1 . data 940 956 1936 . . Dataset data1; range 1691,2188,1824,2043 chr1 . data 960 976 2116 . . Dataset data1; range 1869,2376,2019,2225 chr1 . data 980 996 2304 . . Dataset data1; range 2040,2554,2178,2418 =item The script to render it #!/usr/bin/perl use strict; use Bio::Graphics::FeatureFile; my $data = Bio::Graphics::FeatureFile->new(-file=>'test.gff'); my(undef,$panel) = $data->render; print $panel->png; =back =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/toomany.pm000555001750001750 451412366325116 22174 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::toomany; # DAS-compatible package to use for drawing a box use strict; use base qw(Bio::Graphics::Glyph::generic); # draw the thing onto a canvas # this definitely gets overridden sub draw { my $self = shift; my $gd = shift; my ($left,$top) = @_; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries($left,$top); # $self->filled_oval($gd,$x1,$y1,$x2,$y2); for (my $m = 3;$m > 0;$m--){ my $stack = $m * $self->height / 2; $self->unfilled_box($gd,$x1-$stack,$y1-$stack,$x2-$stack,$y2-$stack); } # add a label if requested $self->draw_label($gd,$left,($top-($self->height*1.1))) if $self->option('label'); } sub label { return "too many to display"; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::toomany - The "too many to show" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is intended for features that are too dense to show properly. Mostly a placeholder, it currently shows a filled oval. If you choose a bump of 0, the ovals will overlap, to give a cloud effect. =head2 OPTIONS There are no glyph-specific options. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/ex.pm000555001750001750 635312366325116 21125 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::ex; # Non object-oriented utilities used here-and-there in Bio::Graphics modules =head1 NAME Bio::Graphics::Glyph::ex - the "ex", or "crossed box" glyph =cut use strict; use base 'Bio::Graphics::Glyph::generic'; sub my_description { return <fgcolor; my ($left,$top) = @_; my($x1,$y1,$x2,$y2) = $self->bounds(@_); #if widthless if($self->option('point')){ my $arm = int($self->height/2); my $minx = $x2 > $x1 ? $x1 : $x2; my $centerx = abs($x2 - $x1) + $minx; my $miny = $y2 > $y1 ? $y1 : $y2; my $centery = abs($y2 - $y1) + $miny; $gd->line($centerx-$arm, $centery-$arm, $centerx+$arm, $centery+$arm, $fg); $gd->line($centerx-$arm, $centery+$arm, $centerx+$arm, $centery-$arm, $fg); return; } else { $gd->line($x1,$y1,$x2,$y2,$fg); $gd->line($x1,$y2,$x2,$y1,$fg); } } 1; __END__ =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This is a box with an 'X' inside glyph. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE. Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/pentagram.pm000555001750001750 1001212366325116 22472 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::pentagram; use strict; use base qw(Bio::Graphics::Glyph::generic); sub my_description { return <option('labelfont') || $self->font; my $pad = $font->height; if ($self->option('text')) { $pad *= 2; } return $pad; } sub default_text { return ''; } sub default_text_pad_x { return 0; } sub default_text_pad_y { return 3; } sub default_size { return 20; } sub draw_component { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $fg = $self->fgcolor; my $bg = $self->bgcolor; my $size = defined $self->option('size') ? $self->option('size') : $self->default_size(); my $poly_pkg = $self->polygon_package; my $polygon = $poly_pkg->new(); if ($self->option('inverted') == 1) { $polygon->addPt($x1,$y2); $polygon->addPt($x1+$size/2,$y2-$size/2); $polygon->addPt($x1,$y2-$size); $polygon->addPt($x1+$size, $y2-$size); $polygon->addPt($x1+$size, $y2); } else { $polygon->addPt($x1,$y2); $polygon->addPt($x1,$y2-$size); $polygon->addPt($x1+$size/2,$y2-$size); $polygon->addPt($x1+$size, $y2-$size/2); $polygon->addPt($x1+$size/2, $y2); } $gd->filledPolygon($polygon, $bg); $gd->polygon($polygon,$fg); my $text = defined $self->option('text') ? $self->option('text') : $self->default_text(); if ($text) { my $text_pad_x = defined $self->option('text_pad_x') ? $self->option('text_pad_x') : $self->default_text_pad_x(); my $text_pad_y = defined $self->option('text_pad_y') ? $self->option('text_pad_y') : $self->default_text_pad_y(); my $font = $self->option('labelfont') || $self->font; $gd->string($font, $x1+$text_pad_x, $y2-$size-$text_pad_y-$font->height, $text, $fg); } } 1; __END__ =head1 NAME Bio::Graphics::Glyph::pentagram - The "pentagram" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws a pentagram with the sharp angle pointing right or,if the 'inverted' option is set to 1, an "inverted" pentagram (with the sharp angle pointing inwards, not outwards). There may be an optional text above the glyph. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -size Width and height of the 20 glyph -text Text to show none -text_pad_x Number of pixels between 0 the left edge of the glyph and the start of text -text_pad_x Number of pixels between 3 the pentagram and the text =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Vsevolod (Simon) Ilyushchenko Esimonf@cshl.eduE. Copyright (c) 2004 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/wiggle_box.pm000555001750001750 2474112366325116 22660 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::wiggle_box; use strict; use base qw(Bio::Graphics::Glyph::box Bio::Graphics::Glyph::smoothing); use File::Spec; sub draw { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; my $feature = $self->feature; my $drawnit; my ($wigfile) = eval{$feature->get_tag_values('wigfile')}; if ($wigfile) { $self->draw_wigfile($feature,$self->rel2abs($wigfile),@_); $drawnit++; } my ($wigdata) = eval{$feature->get_tag_values('wigdata')}; if ($wigdata) { $self->draw_wigdata($feature,$wigdata,@_); $drawnit++; } my ($coverage) = eval{$feature->get_tag_values('coverage')}; if ($coverage) { $self->draw_coverage($feature,$coverage,@_); $drawnit++; } # support for BigWig/BigBed if ($feature->can('statistical_summary')) { my $stats = $feature->statistical_summary($self->width); my @vals = map {$_->{validCount} ? $_->{sumData}/$_->{validCount}:0} @$stats; $self->draw_coverage($feature,\@vals,@_); $drawnit++; } if ($drawnit) { $self->draw_label(@_) if $self->option('label'); $self->draw_description(@_) if $self->option('description'); return; } return $self->SUPER::draw(@_); } sub wig { my $self = shift; my $d = $self->{wig}; $self->{wig} = shift if @_; $d; } sub draw_wigdata { my $self = shift; my $feature = shift; my $data = shift; eval "require MIME::Base64" unless MIME::Base64->can('decode_base64'); my $unencoded_data = MIME::Base64::decode_base64($data); my $wig = eval { Bio::Graphics::Wiggle->new() }; unless ($wig) { warn $@; return $self->SUPER::draw(@_); } $wig->import_from_wif($unencoded_data); $self->wig($wig); $self->_draw_wigfile($feature,$wig,@_); } sub draw_wigfile { my $self = shift; my $feature = shift; my $wigfile = shift; eval "require Bio::Graphics::Wiggle" unless Bio::Graphics::Wiggle->can('new'); my $wig = Bio::Graphics::Wiggle->new($wigfile) or die; $self->wig($wig); $self->_draw_wigfile($feature,$wig,@_); } sub _draw_wigfile { my $self = shift; my $feature = shift; my $wig = shift; my ($gd,$left,$top) = @_; my $start = $self->smooth_start; my $end = $self->smooth_end; my ($x1,$y1,$x2,$y2) = $self->bounds($left,$top); $self->draw_segment($gd, $start,$end, $wig,$start,$end, 1,1, $x1,$y1,$x2,$y2); } sub draw_coverage { my $self = shift; my $feature = shift; my $array = shift; $array = [split ',',$array] unless ref $array; my ($gd,$left,$top) = @_; my ($start,$end) = $self->effective_bounds($feature); my $length = $end - $start + 1; my $bases_per_bin = ($end-$start)/@$array; my @parts; my $samples = $length < $self->panel->width ? $length : $self->panel->width; my $samples_per_base = $samples/$length; for (my $i=0;$i<$samples;$i++) { my $offset = $i/$samples_per_base; my $v = $array->[$offset/$bases_per_bin]; push @parts,$v; } my ($x1,$y1,$x2,$y2) = $self->bounds($left,$top); $self->draw_segment($gd, $start,$end, \@parts, $start,$end, 1,1, $x1,$y1,$x2,$y2); } sub effective_bounds { # copied from wiggle_xyplot -- ouch! my $self = shift; my $feature = shift; my $panel_start = $self->panel->start; my $panel_end = $self->panel->end; my $start = $feature->start>$panel_start ? $feature->start : $panel_start; my $end = $feature->end<$panel_end ? $feature->end : $panel_end; return ($start,$end); } sub draw_segment { my $self = shift; my ($gd, $start,$end, $seg_data, $seg_start,$seg_end, $step,$span, $x1,$y1,$x2,$y2) = @_; # clip, because wig files do no clipping $seg_start = $start if $seg_start < $start; $seg_end = $end if $seg_end > $end; # figure out where we're going to start my $scale = $self->scale; # pixels per base pair my $pixels_per_span = $scale * $span + 1; my $pixels_per_step = 1; my $length = $end-$start+1; # if the feature starts before the data starts, then we need to draw # a line indicating missing data (this only happens if something went # wrong upstream) if ($seg_start > $start) { my $terminus = $self->map_pt($seg_start); $start = $seg_start; $x1 = $terminus; } # if the data ends before the feature ends, then we need to draw # a line indicating missing data (this only happens if something went # wrong upstream) if ($seg_end < $end) { my $terminus = $self->map_pt($seg_end); $end = $seg_end; $x2 = $terminus; } return unless $start < $end; # get data values across the area my $samples = $length < $self->panel->width ? $length : $self->panel->width; my $data = ref $seg_data eq 'ARRAY' ? $seg_data : $seg_data->values($start,$end,$samples); # scale the glyph if the data end before the panel does my $data_width = $end - $start; my $data_width_ratio; if ($data_width < $self->panel->length) { $data_width_ratio = $data_width/$self->panel->length; } else { $data_width_ratio = 1; } return unless $data && ref $data && @$data > 0 && grep {$_} @$data; # allocate colors my $bg_idx = $self->panel->translate_color($self->panel->rgb($self->bgcolor)); my $fg_idx = $self->panel->translate_color($self->panel->rgb($self->fgcolor)) || $bg_idx; $pixels_per_step = $scale * $step; $pixels_per_step = 1 if $pixels_per_step < 1; my $datapoints_per_base = @$data/$length; my $pixels_per_datapoint = $self->panel->width/@$data * $data_width_ratio; my $xstart; for (my $i = 0; $i <= @$data ; $i++) { $xstart ||= $x1 + $pixels_per_datapoint * $i if $data->[$i]; # trigger to draw the previous box is empty space of the end of the stack if (!$data->[$i] || ($i+1 == @$data)) { $xstart || next; my $xend = $x1 + $pixels_per_datapoint * $i; $self->filled_box($gd,$xstart,$y1,$xend,$y2,$bg_idx,$fg_idx); undef $xstart; } } } sub rel2abs { my $self = shift; my $wig = shift; my $path = $self->option('basedir'); return File::Spec->rel2abs($wig,$path); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::wiggle_box - A generic box glyph compatible with dense "wig"data =head1 SYNOPSIS See and . =head1 DESCRIPTION This glyph works like the regular 'box' glyph but takes value data in Bio::Graphics::Wiggle file format: reference = chr1 ChipCHIP Feature1 1..10000 wigfile=./test.wig;wigstart=0 ChipCHIP Feature2 10001..20000 wigfile=./test.wig;wigstart=656 ChipCHIP Feature3 25001..35000 wigfile=./test.wig;wigstart=1312 The "wigfile" attribute gives a relative or absolute pathname to a Bio::Graphics::Wiggle format file. The optional "wigstart" option gives the offset to the start of the data. If not specified, a linear search will be used to find the data. The data consist of a packed binary representation of the values in the feature, using a constant step such as present in tiling array data. This glyph is intended for dense, qualitative feature data. Any score data for each data point is only evaluated for true/false, when true, a box of the specified bgcolor is drawn, when false, nothing is drawn. No data smoothing is used. Two primary benefits of using this glyph (with wiggle data) are: 1) For large, genome-wide data sets, the speed of panel rendering is greatly improved. 2) Large sets of related features can be rendered as a UCSC-style subtrack without the need for aggregation or a GFF3 containment hierarchy. A disadvantage to this approach is that individual features will have no attributes associated with them and will appear as anonymous blocks within a sub-track. An example use for this glyph is annotated transcribed regions from microarray experiments. Such regions are identified based on raw microarray data but do not necessarily have a score associated with them. In this case, using the wiggle_box glyph provides a graphical summary of an expression array experiment. =head2 DATA The wiggle data used for this glyph should be loaded using the 'BED' format in order to allow features of variable width. The fourth column should be a true value, with numeric or ".". An example is shown below: track type=wiggle_0 name="transfrags" description="D. melanogaster transcribed fragments 0-2hrs" 2L 9309 9451 1 2L 10697 11021 1 2L 11101 11345 1 2L 11410 11521 1 2L 11771 12243 1 2L 12314 12954 1 2L 13516 15746 1 2L 17033 17191 1 2L 18232 18580 1 2L 19860 19999 1 =head2 OPTIONS This glyph accepts the standard generic option set. It differs in that the label and description and title/mouseover labels apply to the whole, panel-wide sub-track feature rather than to individual boxes. See Bio::Graphics::Glyph::wiggle_xyplot for a description of the wiggle-specific options and data formats. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Sheldon McKay Emckays@cshl.eduE. Copyright (c) 2008 Cold Spring Harbor Laboratory This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/heat_map.pm000555001750001750 4475712366325116 22321 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::heat_map; use strict; use base qw(Bio::Graphics::Glyph::generic); use Bio::Graphics::Glyph::minmax; # A glyph to draw a heat map for scored features along a continuous color # gradient calculated in HSV color space sub my_description { return <red), or gradients progressing through the colors of the rainbow (magenta->blue->green->yelloe->red) can be created. For example: # a white->red heat map start_color = white end_color = red # a rainbow start_color = magenta end_color = red # green->yellow->red start_color = green end_color = red END } sub my_options { { start_color => [ 'color', 'white', 'Beginning of the color gradient, expressed as a named color or', 'RGB hex string.'], end_color => [ 'color', 'red', 'End of the color gradient.'], brightness => [ 'integer', undef, 'Color brilliance: an integer between 0 and 100. This will override', 'the value calculated from the name color.'], saturation => [ 'integer', undef, 'Color saturation: an integer between 0 and 100. This will override', 'the value calculated from the named color.'], pure_hue => [ 'boolean', undef, 'Use the pure hue (brightness and saturation both at 100)', 'for the named color.'], min_score => [ 'integer', undef, "Minimum value of the feature's \"score\" attribute."], max_score => [ 'integer', undef, "Maximum value of the feature's \"score\" attribute."], vary_fg => [ 'boolean', 1, 'Vary both the foreground and background colors.'], }; } # set up getter/setter methods BEGIN { no strict 'refs'; my @subs = qw/ h_start s_start v_start h_range s_range v_range min_score max_score low_rgb low_hsv high_rgb score_range/; for my $sub ( @subs ) { *{$sub} = sub { my ($self, $v) = @_; my $k = "_$sub"; if (defined $v) { $self->{$k} = $v; } return $self->{$k}; } } } sub draw { my $self = shift; my @parts = $self->parts; @parts = $self if !@parts && $self->level == 0; return $self->SUPER::draw(@_) unless @parts; $self->calculate_gradient(\@parts); my $low_rgb = $self->low_rgb; for my $part (@parts) { my $score = $part->feature->score; # use start color if no score or no score gradient unless (defined $score && $self->score_range ) { $part->{partcolor} = $self->color_index(@$low_rgb); } else { my @rgb = $self->calculate_color($score); $part->{partcolor} = $self->color_index(@rgb); } } return $self->SUPER::draw(@_); } # We want an exact match, so allocate the color # if required sub color_index { my ($self, @rgb) = @_; my $gd = $self->panel->gd; return $gd->colorResolve(@rgb); } # Override minmax method to get user supplied # values. This will be helpful for single or # unaggregated features. sub minmax { my ($self, $parts) = @_; my $min = $self->option('min_score'); my $max = $self->option('max_score'); return ($min,$max) if $min && $max && $min < $max; return (0,$max) if $max && !$min; # minscore may be zero return (0,100) unless $parts; return $self->SUPER::minmax($parts); } # convert named color or hex string to RGB value, then HSV sub color2hsv { my ($self,$color) = @_; my $color_idx = $self->panel->translate_color($color); my @rgb = $self->panel->rgb($color_idx); return [$self->RGBtoHSV(@rgb)]; } sub calculate_gradient { my ($self, $parts) = @_; my $start_color = lc $self->option('start_color') || 'white'; my $stop_color = lc $self->option('end_color') || 'red'; my $hsv_start = $self->color2hsv($start_color); my $hsv_stop = $self->color2hsv($stop_color); my ($h_start,$s_start,$v_start) = @$hsv_start; my ($h_stop,$s_stop,$v_stop ) = @$hsv_stop; my $s_range = $s_stop - $s_start; my $v_range = $v_stop - $v_start; my $h_range; # special case: if start hue = end hue, we want to go round # the whole wheel once. Otherwise round the wheel clockwise # or counterclockwise depending on start and end coordinate if ($h_start != $h_stop) { my $direction = abs($h_stop - $h_start)/($h_stop - $h_start); my ($sstart,$sstop) = sort {$a <=> $b} ($h_start,$h_stop); $direction *= -1 if $sstop - $sstart > 256/2; #reverse the direction if we cross 0 $h_range = ($sstop - $sstart) <= 256/2 ? ($sstop - $sstart)*$direction : (256 - $sstop + $sstart)*$direction; } else { $h_range = 256; } # override brightness and saturation if required if (my $bri = $self->option('brightness')) { $bri = int($bri*255/100 + 0.5); $v_start = $v_stop = $bri; $v_range = 0; } if (my $sat = $self->option('saturation')) { $sat = int($sat*255/100 + 0.5); $s_start = $s_stop = $sat; $s_range = 0; } if ($self->option('pure_hue')) { $hsv_start = [$h_start,255,255]; $hsv_stop = [$h_stop,255,255]; $v_start = $v_stop = 255; $s_start = $s_stop = 255; $v_range = $s_range = 0; } # darkness or monochrome gradient? if ( !_isa_color($start_color) || !_isa_color($stop_color) ) { # hue (H) is fixed $h_range = 0; # gradient S V # white -> color 0->255 255 # color -> white 255->0 255 # white -> black 0 255->0 # black -> white 0 0->255 # black -> color 0->255 0->255 # color -> black 255->0 255->0 if ( $start_color eq 'white' && _isa_color($stop_color) ) { $s_range = 255; $s_start = 0; $v_range = 0; $v_start = 255; $h_start = $h_stop; } elsif ( _isa_color($start_color) && $stop_color eq 'white' ) { $s_range = -255; $s_start = 255; $v_range = 0; $v_start = 255; } elsif ( $start_color eq 'white' ) { # end black $s_range = 0; $s_start = 0; $v_range = -255; $v_start = 255; } elsif ( $stop_color eq 'white' ) { # start black $s_range = 0; $s_start = 0; $v_range = 255; $v_start = 0; } elsif ( _isa_color($start_color) ) { # end black $s_range = 255; $s_start = 0; $v_range = 255; $v_start = 0; } elsif ( _isa_color($stop_color) ) { # start black $s_range = -255; $s_start = 255; $v_range = -255; $v_start = 255; } } # store gradient info $self->h_range($h_range); $self->h_start($h_start); $self->s_start($s_start); $self->v_start($v_start); $self->s_range($s_range); $self->v_range($v_range); # store score info my ($min,$max) = $self->minmax($parts); $self->score_range($max - $min); $self->min_score($min); $self->max_score($max); # store color extremes my @low_rgb = $self->HSVtoRGB(@$hsv_start); my @high_rgb = $self->HSVtoRGB(@$hsv_stop); $self->low_hsv($hsv_start); $self->high_rgb(\@high_rgb); $self->low_rgb(\@low_rgb); return 1; } sub _isa_color { my $color = shift; return $color =~ /white|black|FFFFFF|000000/i ? 0 : 1; } sub calculate_color { my ($self,$score,$min,$max,$range) = @_; $score ||= 0; # relative score $min = $self->min_score || 0 unless defined $min; $max = $self->max_score unless defined $max; $range = $self->score_range || 1 unless defined $range; # reset off-scale scores $score = $min if $score < $min && $min; $score = $max if $score > $max && $max; my $score_diff = ($score - $min)/$range; # Hue my $hue = $self->h_start; my $h_diff = $score_diff * $self->h_range; $hue += $h_diff; $hue = $hue < 255 ? int($hue+0.5) : 255; # Saturation my $sat = $self->s_start; $sat += $score_diff * $self->s_range; $sat = $sat < 255 ? int($sat+0.5) : 255; # Brightness my $bri = $self->v_start; $bri += $score_diff * $self->v_range; $bri = $bri < 255 ? int($bri + 0.5) : 255; return $self->HSVtoRGB($hue,$sat,$bri); } # synthesize a key glyph sub keyglyph { my $self = shift; my $scale = 1/$self->scale; # base pairs/pixel my $offset = $self->panel->offset; my ($min,$max) = $self->minmax; my $range = $max - $min; my ($segments, $low); for my $start (0..9) { $start *= 10; push @$segments, [ $start*$scale + $offset, ($start + 10)*$scale + $offset ]; } my $feature = Bio::Graphics::Feature->new( -segments => $segments, -name => $self->option('key'), -strand => '+1' ); for (0..9) { my $score += ($range/10) * $_; ($feature->segments)[$_]->score($score); } my $factory = $self->factory->clone; $factory->set_option(label => 1); $factory->set_option(bump => 0); $factory->set_option(min_score => 0); $factory->set_option(max_score => 100); return $factory->make_glyph(0,$feature); } sub bgcolor { my $self = shift; return defined $self->{partcolor} ? $self->{partcolor} : $self->SUPER::bgcolor; } sub fgcolor { my $self = shift; return $self->option('vary_fg') ? $self->bgcolor : $self->SUPER::fgcolor;; } sub RGBtoHSV { my ($self, $r, $g ,$bl) = @_; my ($min,undef,$max) = sort {$a<=>$b} ($r,$g,$bl); my $range = $max - $min or return (0,0,$r); my $v = $max; my $s = 255 * ($max - $min)/$max; my $h; if ($max == $r) { $h = 60 * ($g-$bl)/$range; } elsif ($max == $g) { $h = 60 * ($bl-$r)/$range + 120; } else { $h = 60 * ($r-$g)/$range + 240; } $h = int($h*255/360 + 0.5); $h += 255 if $h < 0; $h -= 255 if $h > 255; return ($h, $s, $v); } # method courtesy of Lincoln Stein sub HSVtoRGB { my $self = shift; @_ == 3 or die "Usage: GD::Simple->HSVtoRGB(\$hue,\$saturation,\$value)"; my ($h,$s,$v)=@_; my ($r,$g,$b,$i,$f,$p,$q,$t); if( $s == 0 ) { ## achromatic (grey) return ($v,$v,$v); } $h %= 255; $s /= 255; ## scale saturation from 0.0-1.0 $h /= 255; ## scale hue from 0 to 1.0 $h *= 360; ## and now scale it to 0 to 360 $h /= 60; ## sector 0 to 5 $i = $h % 6; $f = $h - $i; ## factorial part of h $p = $v * ( 1 - $s ); $q = $v * ( 1 - $s * $f ); $t = $v * ( 1 - $s * ( 1 - $f ) ); if($i<1) { $r = $v; $g = $t; $b = $p; } elsif($i<2){ $r = $q; $g = $v; $b = $p; } elsif($i<3){ $r = $p; $g = $v; $b = $t; } elsif($i<4){ $r = $p; $g = $q; $b = $v; } elsif($i<5){ $r = $t; $g = $p; $b = $v; } else { $r = $v; $g = $p; $b = $q; } return (int($r+0.5),int($g+0.5),int($b+0.5)); } 1; =head1 NAME Bio::Graphics::Glyph::heat_map - The "heat_map" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws "scored" features using a continuous color gradient is the HSV color space. The color of each segment is proportionate to the score. =head1 OPTIONS =head2 Global glyph options: See L =head2 Glyph-specific options: The color_map glyph recognizes the following glyph-specific options: Option Description Default ------ ----------- ------- -start_color Beginning of the color white gradient, expressed as a named color or RGB hex string -end_color End of the color gradient red -brightness Color brilliance: 0-100 Calculated This will override the value from the named color -saturation Color saturation: 0-100 Calculated This will override the value from the named color -pure_hue Use the pure hue (bright- 0 (false) ness and saturation both at 100) for the named color -max_score Maximum value of the Calculated feature's "score" attribute -min_score Minimum value of the Calculated feature's "score" attribute -vary_fg Vary the foreground color 1 (true) with the background color If max_score and min_score are not specified, the glyph will calculate the local maximum and minimum scores at run time. If single features, unaggregated features, or multiple aggregates are being drawn, this will result in an inconsistent color scale. It is recommended that global maximum and minimum scores be specified in the track configuration. Since many scoring functions are exponential, you may wish to take the log of your scores before passing them to this glyph. =head2 Color Gradients The color gradient is calculating by progressing along the rainbow spectrum from red to violet, also incrementing brightness and saturation, all proportate to the score value. To vary the hue only, "pure" hues can be used. Pure hues have brightness and saturation values of 100. Some examples, in order, are red, yellow, lime, aqua/cyan, blue and magenta. The gradient can progress in reverse orientation with the respect to the visible light spectrum if a lower-order color is used as the start and a higher order color used as the end (for example lime->red). Using the "pure_hue" option results in a brighter, more vibrant color spectrum, Choosing darker start and end colors, such as green or maroon, will result in a darker spectrum. A single color spectrum can be created by using black or white as the start or end color. A grayscale spectrum will result if black and white are used as start and end colors. One example of an effective visual heat map is to progress from white->red. For the start_color and end_color options, 140 named webcolors and their corresponsing RGB hex codes (listed below) are supported. steelblue #4682B4 royalblue #041690 cornflowerblue #6495ED lightsteelblue #B0C4DE mediumslateblue #7B68EE slateblue #6A5ACD darkslateblue #483D8B midnightblue #191970 navy #000080 darkblue #00008B mediumblue #0000CD blue #0000FF dodgerblue #1E90FF deepskyblue #00BFFF lightskyblue #87CEFA skyblue #87CEEB lightblue #ADD8E6 powderblue #B0E0E6 azure #F0FFFF lightcyan #E0FFFF paleturquoise #AFEEEE mediumturquoise #48D1CC lightseagreen #20B2AA darkcyan #008B8B teal #008080 cadetblue #5F9EA0 darkturquoise #00CED1 aqua #00FFFF cyan #00FFFF turquoise #40E0D0 aquamarine #7FFFD4 mediumaquamarine #66CDAA darkseagreen #8FBC8F mediumseagreen #3CB371 seagreen #2E8B57 darkgreen #006400 green #008000 forestgreen #228B22 limegreen #32CD32 lime #00FF00 chartreuse #7FFF00 lawngreen #7CFC00 greenyellow #ADFF2F yellowgreen #9ACD32 palegreen #98FB98 lightgreen #90EE90 springgreen #00FF7F mediumspringgreen #00FA9A darkolivegreen #556B2F olivedrab #6B8E23 olive #808000 darkkhaki #BDB76B darkgoldenrod #B8860B goldenrod #DAA520 gold #FFD700 yellow #FFFF00 khaki #F0E68C palegoldenrod #EEE8AA blanchedalmond #FFEBCD moccasin #FFE4B5 wheat #F5DEB3 navajowhite #FFDEAD burlywood #DEB887 tan #D2B48C rosybrown #BC8F8F sienna #A0522D saddlebrown #8B4513 chocolate #D2691E peru #CD853F sandybrown #F4A460 darkred #8B0000 maroon #800000 brown #A52A2A firebrick #B22222 indianred #CD5C5C lightcoral #F08080 salmon #FA8072 darksalmon #E9967A lightsalmon #FFA07A coral #FF7F50 tomato #FF6347 darkorange #FF8C00 orange #FFA500 orangered #FF4500 crimson #DC143C red #FF0000 deeppink #FF1493 fuchsia #FF00FF magenta #FF00FF hotpink #FF69B4 lightpink #FFB6C1 pink #FFC0CB palevioletred #DB7093 mediumvioletred #C71585 purple #800080 darkmagenta #8B008B mediumpurple #9370DB blueviolet #8A2BE2 indigo #4B0082 darkviolet #9400D3 darkorchid #9932CC mediumorchid #BA55D3 orchid #DA70D6 violet #EE82EE plum #DDA0DD thistle #D8BFD8 lavender #E6E6FA ghostwhite #F8F8FF aliceblue #F0F8FF mintcream #F5FFFA honeydew #F0FFF0 lightgoldenrodyellow #FAFAD2 lemonchiffon #FFFACD cornsilk #FFF8DC lightyellow #FFFFE0 ivory #FFFFF0 floralwhite #FFFAF0 linen #FAF0E6 oldlace #FDF5E6 antiquewhite #FAEBD7 bisque #FFE4C4 peachpuff #FFDAB9 papayawhip #FFEFD5 beige #F5F5DC seashell #FFF5EE lavenderblush #FFF0F5 mistyrose #FFE4E1 snow #FFFAFA white #FFFFFF whitesmoke #F5F5F5 gainsboro #DCDCDC lightgrey #D3D3D3 silver #C0C0C0 darkgray #A9A9A9 gray #808080 lightslategray #778899 slategray #708090 dimgray #696969 darkslategray #2F4F4F black #000000 =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L L =head1 AUTHOR Sheldon McKay Emckays@cshl.eduE Copyright (c) 2006 Cold Spring Harbor Laboratory This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/generic.pm000555001750001750 7031112366325116 22140 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::generic; use strict; use Bio::Graphics::Util qw(frame_and_offset); use base qw(Bio::Graphics::Glyph); use Memoize 'memoize'; #memoize('pad_left'); #memoize('pad_right'); my %complement = (g=>'c',a=>'t',t=>'a',c=>'g', G=>'C',A=>'T',T=>'A',C=>'G'); # new options are 'label' -- short label to print over glyph # 'description' -- long label to print under glyph # label and description can be flags or coderefs. # If a flag, label will be taken from seqname, if it exists or primary_tag(). # description will be taken from source_tag(). sub my_description { return < [ 'string', undef, 'Whether to label the feature. A value of 1 will label the feature with', 'the value returned by its display_name() method. Any other true value', 'will label the feature with the provided value. Undef will suppress labeling', 'entirely.'], label_position => [ [qw(top left alignment_left)], 'top', 'Where to place the feature label.', '"top" will place the label above the glyph aligned with its left side.', '"left" will place the label to the left of the glyph, vertically centered with it.', '"alignment_left" will place the label to the left of the glyph in the panel pad-left positon.', 'The last option is used internally for drawing DNA alignments which span the screen.' ], part_labels => [ 'boolean', undef, 'If false, do not label subparts of the feature. If equal to a value of 1, subparts', 'are labeled with their display_name(). Any other true value, will be used as the subpart label.', 'A false value suppresses the printing of subpart labels.'], arrowhead => [ [qw(regular filled)], 'regular', 'Set the style of arrowhead used when drawing a stranded feature.', '"regular" will generate a thin arrowhead that protrudes from the feature.', '"filled" will taper the feature itself to turn it into an arrowhead.'], description => [ 'string', undef, 'Whether to place a description underneath the feature. ', 'A value of 1 will describe the feature using the values returned', 'by its source_tag() method. Any other true value', 'will label the feature with the provided value. Undef will suppress labeling', 'entirely.'], draw_translation => [ 'boolean', undef, 'Draw the protein translation of the feature (assumes that the feature is attached to a DNA sequence.' ], draw_dna => [ 'boolean', undef, 'If true, draw the dna residues when magnification level', 'allows (assumes that the feature is attached to a DNA sequence.'], pad_top => [ 'integer', 0, 'Additional whitespace (in pixels) to add to the top of this glyph.'], pad_bottom => [ 'integer', 0, 'Additional whitespace (in pixels) to add to the bottom of this glyph.'], pad_right=> [ 'integer', 0, 'Additional whitespace (in pixels) to add to the right of this glyph.'], pad_left=> [ 'integer', 0, 'Additional whitespace (in pixels) to add to the left of this glyph.'], labelcolor => [ 'color', 'black', 'The color to use for drawing label text in this glyph (also known as fontcolor).'], fontcolor => [ 'color', 'black', 'The color to use for drawing label text in this glyph (also known as labelcolor).'], font2color => [ 'color', 'black', 'The color to use for drawing description text in this glyph (also known as descriptioncolor.'], descriptioncolor => [ 'color', 'black', 'The color to use for drawing description text in this glyph (also known as font2color.'], basecolor => [ 'color', 'black', 'The color to use for drawing DNA/protein residues at the base level', ], font => [ 'font', 'gdSmallFont', 'Font for glyph label and description.'], connector=>[ [qw(hat solid quill dashed crossed undef)], undef, 'Type of line to use for connecting discontinuous pieces of the feature.', 'Leave this undef to draw no connector at all.'], connector_color => [ 'color', 'black', 'Color to use for lines connecting discontinuous pieces of the feature.'], record_label_positions => [ 'integer', undef, 'If true, remember the coordinates of the glyph label and return it', 'by calling $panel->key_boxes. If -1, then remember coordinates, but', "don't actually draw the label", ] } } sub connector { return shift->option('connector',@_); } sub connector_color { my $self = shift; $self->color('connector_color') || $self->fgcolor; } sub mono_font { return GD->gdSmallFont; } sub font { my $self = shift; return $self->getfont('font','gdSmallFont'); } sub fontcolor { my $self = shift; my $fontcolor = $self->color('labelcolor') || $self->color('fontcolor'); return defined $fontcolor ? $fontcolor : $self->fgcolor; } sub font2color { my $self = shift; my $font2color = $self->color('descriptioncolor') || $self->color('font2color'); return defined $font2color ? $font2color : $self->fgcolor; } sub basecolor { my $self = shift; my $basecolor = $self->color('basecolor'); return defined $basecolor ? $basecolor : $self->fgcolor; } sub labelcolor {shift->fontcolor} sub descriptioncolor {shift->font2color} sub record_label_positions { shift->option('record_label_positions') } sub height { my $self = shift; my $h = $self->SUPER::height; return $h unless $self->option('draw_translation') && $self->protein_fits or $self->option('draw_dna') && $self->dna_fits; my $fh = $self->font_height + 2; return $h > $fh ? $h : $fh; } sub pad_top { my $self = shift; my $top = $self->option('pad_top'); return $top if defined $top; my $pad = $self->SUPER::pad_top; $pad += $self->labelheight if $self->label && $self->label_position eq 'top'; $pad; } sub pad_bottom { my $self = shift; my $bottom = $self->option('pad_bottom'); return $bottom if defined $bottom; my $pad = $self->SUPER::pad_bottom; $pad += $self->labelheight+6 if $self->description; $pad += $self->labelheight+6 if $self->part_labels && $self->label_position eq 'top'; $pad; } sub pad_right { my $self = shift; my $pad = $self->SUPER::pad_right; return $pad unless $self->label; my $label_width = $self->label_position eq 'top' ? $self->labelwidth : 0; my $description_width = $self->descriptionwidth; my $max = $label_width > $description_width ? $label_width : $description_width; my $right = $max - $self->width; return $pad > $right ? $pad : $right; } sub pad_left { my $self = shift; my $pad = $self->SUPER::pad_left; return $pad unless $self->label_position eq 'left' && $self->label; $pad += $self->labelwidth + 3; $pad; } sub labelfont { my $self = shift; my $font = $self->getfont('label_font',$self->font); $font = GD->gdTinyFont if $self->string_height($font) > $self->height && $self->label_position eq 'left'; return $font; } sub descfont { my $self = shift; return $self->getfont('desc_font',$self->font); } sub labelwidth { my $self = shift; return $self->{labelwidth} ||= $self->string_width($self->label||'',$self->labelfont); } sub descriptionwidth { my $self = shift; return $self->{descriptionwidth} ||= $self->string_width($self->description||'',$self->descfont); } sub labelheight { my $self = shift; return $self->{labelheight} ||= $self->string_height($self->labelfont); } sub label_position { my $self = shift; return $self->{labelposition} ||= $self->option('label_position') || 'top'; } sub label { my $self = shift; return if $self->{overbumped}; # set by the bumper when we have hit bump limit return unless $self->subpart_callbacks; # returns true if this is level 0 or if subpart callbacks allowed return $self->_label if $self->{level} >= 0; return exists $self->{label} ? $self->{label} : ($self->{label} = $self->_label); } sub description { my $self = shift; return if $self->{overbumped}; # set by the bumper when we have hit bump limit return unless $self->subpart_callbacks; # returns true if this is level 0 or if subpart callbacks allowed return $self->_description if $self->{level} > 0; return exists $self->{description} ? $self->{description} : ($self->{description} = $self->_description); } sub part_labels { my $self = shift; my @parts = $self->parts; return ($self->{level} == 0) && @parts && @parts>1 && $self->option('part_labels'); } sub part_label_merge { shift->option('part_label_merge'); } sub maxdepth { my $self = shift; my $maxdepth = $self->option('maxdepth'); return $maxdepth if defined $maxdepth; return 1; } sub _label { my $self = shift; # allow caller to specify the label my $label = $self->option('label'); return unless defined $label; return "1" if $label eq '1 '; # 1 with a space return $label unless $label eq '1'; # figure it out ourselves my $f = $self->feature; if ($f->can('display_name') && (my $name = $f->display_name)) { return $name; } if ($f->can('attributes') && (my @aliases = $f->attributes('Alias'))) { return $aliases[0]; } return $f->info if $f->can('info'); # deprecated API return $f->seq_id if $f->can('seq_id'); return eval{$f->primary_tag}; } sub _description { my $self = shift; # allow caller to specify the long label my $label = $self->option('description'); return unless defined $label; return "1" if $label eq '1 '; return $label unless $label eq '1'; return $self->{_description} if exists $self->{_description}; return $self->{_description} = $self->get_description($self->feature); } sub get_description { my $self = shift; my $feature = shift; local $^W = 0; # common places where we can get descriptions return join '; ',$feature->notes if $feature->can('notes'); return $feature->desc if $feature->can('desc'); if ($feature->can('has_tag')) { return join '; ',$feature->get_tag_values('note') if $feature->has_tag('note'); return join '; ',$feature->get_tag_values('Note') if $feature->has_tag('Note'); return join '; ',$feature->get_tag_values('description') if $feature->has_tag('description'); } my $tag = $feature->source_tag; return if $tag eq ''; $tag; } sub draw { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; local($self->{partno},$self->{total_parts}); @{$self}{qw(partno total_parts)} = ($partno,$total_parts); $self->calculate_cds() if $self->option('draw_translation') && $self->protein_fits; $self->panel->startGroup($gd); $self->SUPER::draw(@_); $self->draw_label(@_) if $self->option('label'); $self->draw_description(@_) if $self->option('description'); $self->draw_part_labels(@_) if $self->option('label') && $self->option('part_labels'); $self->panel->endGroup($gd); } sub draw_component { my $self = shift; $self->SUPER::draw_component(@_); $self->draw_translation(@_) if $self->{cds_translation}; # created earlier by calculate_cds() $self->draw_sequence(@_) if $self->option('draw_dna') && $self->dna_fits; } # mostly stolen from cds.pm -- draw the protein translation sub draw_translation { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->bounds(@_); my $feature = $self->feature; my $strand = $feature->strand; my $font = $self->mono_font; my $pixels_per_residue = $self->scale * 3; my $y = $y1 + ($self->height - $font->height)/2; my $fontwidth = $font->width; my $color = $self->basecolor; $strand *= -1 if $self->{flip}; # have to remap feature start and end into pixel coords in order to: # 1) correctly align the amino acids with the nucleotide seq # 2) correct for the phase offset my $start = $self->map_no_trunc($feature->start + $self->{cds_offset}); my $stop = $self->map_no_trunc($feature->end + $self->{cds_offset}); ($start,$stop) = ($stop,$start) if $stop < $start; # why does this keep happening? my $x_fudge = $self->{flip} ? -1 : 2; my $right = $self->panel->right; my $left = $self->panel->left; my @residues = split '',$self->{cds_translation}; # warn "residues = @residues, start=$start, stop=$stop, strand=$strand, x1=$x1, x2=$x2, cds_offset = $self->{cds_offset}"; push @residues,$self->{cds_splice_residue_tail} if $self->{cds_splice_residue_tail}; for (my $i=0;$i<@residues;$i++) { my $x = $strand > 0 ? $start + $i * $pixels_per_residue : $stop - $i * $pixels_per_residue; $x -= $fontwidth + 1 if $self->{flip}; # align right when flipped my $pos = $x+$x_fudge; $gd->char($font,$pos,$y,$residues[$i],$color) if $pos >= $x1 && $pos <= $x2; } if ($self->{cds_splice_residue_head}) { $gd->char($font,$x1+2,$y,$self->{cds_splice_residue_head},$color) if $strand > 0 && $start >= $left; $gd->char($font,$x2-$fontwidth-2,$y,$self->{cds_splice_residue_head},$color) if $strand < 0 && $stop <= $right; } } sub draw_sequence { my $self = shift; my $gd = shift; my ($x1,$y1,$x2,$y2) = $self->bounds(@_); my $feature = $self->feature; my $strand = $feature->strand; my $font = $self->mono_font; my $pixels_per_base = $self->scale; my $y = $y1 + ($self->height - $font->height)/2 - 1; my $fontwidth = $font->width; my $color = $self->basecolor; $strand *= -1 if $self->{flip}; # have to remap feature start and end into pixel coords in order to: my $start = $self->map_no_trunc($feature->start); my $stop = $self->map_no_trunc($feature->end); ($start,$stop) = ($stop,$start) if $stop < $start; # why does this keep happening? my $x_fudge = $self->{flip} ? 1 : 2; my $right = $self->panel->right; my $left = $self->panel->left; my $seq = $self->get_dna($self->feature); my $canonical = $self->option('canonical_strand'); my @bases = split '',$seq; for (my $i=0;$i<@bases;$i++) { my $x = $strand >= 0 ? $start + $i * $pixels_per_base : $stop - $i * $pixels_per_base; next unless ($x >= $x1 && $x <= $x2); $x -= $fontwidth + 1 if $self->{flip}; # align right when flipped if ($strand >= 0) { last if $x + $fontwidth > $right; } else { next if $x >= $right; last if $x < $left; } my $base = $self->{flip} ? $complement{$bases[$i]} : $bases[$i]; $base = $complement{$base} if $canonical && $strand < 0; $gd->char($font,$x+$x_fudge,$y,$base,$color); } } sub min { $_[0] <= $_[1] ? $_[0] : $_[1] } sub max { $_[0] >= $_[1] ? $_[0] : $_[1] } sub draw_label { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; my $label = $self->label or return; local $self->{default_opacity} = 1; my $x = $self->left + $left; # valid for both "top" and "left" because the left-hand side is defined by pad_left my $font = $self->labelfont; if ($self->label_position eq 'top') { $x += $self->pad_left; # offset to beginning of the drawn part of the feature $x = $self->panel->left + 1 if $x <= $self->panel->left; $self->render_label($gd, $font, $x, $self->top + $top - 1, $label); } elsif ($self->label_position eq 'left') { # my $y = $top + $self->{top} + ($self->height - $self->string_height($font))/2; my $y = $top + $self->{top} - 1; $self->render_label($gd, $font, $x, $y, $label); # used for alignments, doesn't account for padding, viewer discretion is advised... } elsif ($self->label_position eq 'alignment_left') { my $y = $self->{top} + ($self->height - $font->height)/2 + $top; $self->render_label($gd, $font, 1, $y, $label); } } sub render_label { my $self = shift; my ($gd,$font,$x,$y,$label,$is_legend) = @_; my $rlp = $self->record_label_positions; unless ($rlp || $is_legend) { $gd->string($font,$x,$y,$label,$self->labelcolor); } $self->panel->add_key_box($self,$label,$x,$y) if $rlp } sub draw_description { my $self = shift; my ($gd,$dx,$dy,$partno,$total_parts) = @_; my $label = $self->description or return; local $self->{default_opacity} = 1; my ($left,$top,$right,$bottom) = $self->bounds($dx,$dy); $bottom += $self->pad_bottom; $bottom -= $self->labelheight; $bottom -= $self->labelheight if $self->part_labels && $self->label_position eq 'top'; $gd->string($self->descfont, $left, $bottom-3, $label, $self->descriptioncolor); } sub draw_part_labels { my $self = shift; my ($gd,$left,$top,$partno,$total_parts) = @_; return unless $self->{level} == 0; my @p = $self->parts or return; local $self->{default_opacity} = 1; @p > 1 or return; @p = reverse @p if $self->flip; my $font = $self->font; my $width = $font->width; my $color = $self->labelcolor; my $y = $top + $self->bottom - $self->pad_bottom; my $merge_em = $self->part_label_merge; my @parts; my $previous; if ($merge_em) { my $current_contig = []; for my $part (@p) { if (!$previous || $part->feature->start - $previous->feature->end <= 1) { push @$current_contig,$part; } else { push @parts,$current_contig; $current_contig = [$part]; } $previous = $part; } push @parts,$current_contig; } else { @parts = map {[$_]} @p; } my $last_x; # avoid overlapping labels for (my $i=0; $i<@parts; $i++) { my $x1 = $parts[$i][0]->left; my $x2 = $parts[$i][-1]->right; my $string = $self->part_label($i,scalar @parts); my $x = $left + $x1 + ($x2 - $x1 - $width*length($string))/2; my $w = $width * length($string); next if defined $last_x && $self->flip ? $x + $w > $last_x : $x < $last_x; $gd->string($font, $x,$y, $string, $color); $last_x = $x + ($self->flip ? 0 : $w); } } sub part_label { my $self = shift; my ($part,$total) = @_; local $self->{partno} = $self->feature->strand < 0 ? $total - $part -1 : $part; my $label = $self->option('part_labels'); return unless defined $label; return "1" if $label eq '1 '; return $label unless $label eq '1'; return $self->{partno}+1; } sub dna_fits { my $self = shift; my $pixels_per_base = $self->scale; my $font = $self->mono_font; my $font_width = $font->width; return $pixels_per_base >= $font_width; } sub protein_fits { my $self = shift; my $font = $self->mono_font; my $font_width = $font->width; my $pixels_per_residue = $self->scale * 3; return $pixels_per_residue >= $font_width; } sub arrowhead { my $self = shift; my $image = shift; my ($x,$y,$height,$orientation) = @_; my $fg = $self->set_pen; my $style = $self->option('arrowstyle') || 'regular'; if ($style eq 'filled') { my $poly_pkg = $self->polygon_package; my $poly = $poly_pkg->new(); if ($orientation >= 0) { $poly->addPt($x-$height,$y-$height); $poly->addPt($x,$y); $poly->addPt($x-$height,$y+$height,$y); } else { $poly->addPt($x+$height,$y-$height); $poly->addPt($x,$y); $poly->addPt($x+$height,$y+$height,$y); } $image->filledPolygon($poly,$fg); } else { if ($orientation >= 0) { $image->line($x,$y,$x-$height,$y-$height,$fg); $image->line($x,$y,$x-$height,$y+$height,$fg); } else { $image->line($x,$y,$x+$height,$y-$height,$fg); $image->line($x,$y,$x+$height,$y+$height,$fg); } } } sub arrow { my $self = shift; my $image = shift; my ($x1,$x2,$y) = @_; my $fg = $self->set_pen; my $height = $self->height/4; $height = 3 if $height < 3; $image->line($x1,$y,$x2,$y,$fg); $self->arrowhead($image,$x2,$y,$height,+1) if $x1 < $x2; $self->arrowhead($image,$x2,$y,$height,-1) if $x2 < $x1; } sub reversec { my $self = shift; my $dna = shift; $dna =~ tr/gatcGATC/ctagCTAG/; $dna = reverse $dna; return $dna; } # This gets invoked if the user has requested that the protein translation # gets drawn using the draw_translation option and protein_fits() returns # true. It is a rather specialized function and possibly belongs somewhere else, # but putting it here makes it possible for any feature to display its protein # translation. sub calculate_cds { my $self = shift; return if exists $self->{cds_translation}; my $f = $self->feature; my @subfeats = $self->find_subfeats_with_phase($f) or return; my @parts = $self->feature_has_subparts ? $self->parts : $self; my @parts_with_phase = grep {defined eval {$_->feature->phase}} @parts; my %parts = map {$_->feature->start => $_} @parts_with_phase; my $codon_table = $self->option('codontable'); $codon_table = 1 unless defined $codon_table; require Bio::Tools::CodonTable unless Bio::Tools::CodonTable->can('new'); my $translate_table = Bio::Tools::CodonTable->new(-id=>$codon_table); my $strand = $f->strand; $strand *= -1 if $self->{flip}; my $panel_start = $self->panel->start; my $panel_end = $self->panel->end; for (my $i=0; $i < @subfeats; $i++) { my $feature = $subfeats[$i]; my $prior = $subfeats[$i-1] if $i>0; my $next = $subfeats[$i+1] if $i<$#subfeats; ($prior,$next) = ($next,$prior) if $f->strand < 0; my $part = $parts{$feature->start} or next; my $pos = $feature->strand >= 0 ? $feature->start : $feature->end; my $phase = eval {$feature->phase}; next unless defined $phase; my $seq = $self->get_seq($feature); next unless defined $seq; my ($frame,$offset) = frame_and_offset($pos, $feature->strand, $phase); $part->{cds_frame} = $frame; $part->{cds_offset} = $offset; # do in silico splicing in order to find the codon that # arises from the splice my $protein = $seq->translate(undef,undef,$phase,$codon_table)->seq; $part->{cds_translation} = $protein; # warn "protein = $protein"; if ($phase == 2 && $prior) { # get 1 bp from end of previous my $dna = $self->get_dna($feature); my $prior_dna = $self->get_dna($prior); my $spliced_codon = substr($prior_dna,-1,1); $spliced_codon .= substr($dna,0,2); $part->{cds_splice_residue_head} = $translate_table->translate($spliced_codon); # warn "codon = $spliced_codon, splice_residue_head = $part->{cds_splice_residue_head}"; } if ($next && $next->phase == 1) { my $dna = $self->get_dna($feature); my $next_dna = $self->get_dna($next) if $next; my $spliced_codon = substr($dna,-2,2); $spliced_codon .= substr($next_dna,0,1); $part->{cds_splice_residue_tail} = $translate_table->translate($spliced_codon); # warn "codon = $spliced_codon, splice_residue_tail = $part->{cds_splice_residue_tail}"; } } return; } sub find_subfeats_with_phase { my $self = shift; my $feat = shift; return $feat if $feat->can('phase') && defined $feat->phase; return grep {$_->can('phase') && defined $_->phase} $feat->get_SeqFeatures; } # hack around changed feature API sub get_seq { my $self = shift; my $feature = shift; my $dna = $self->get_dna($feature); return Bio::PrimarySeq->new(-seq=>$dna); } sub get_dna { my $self = shift; # could be a PrimarySeq, or some kind of feature my $thing = shift or return; my $key = join ':', map { eval{ $thing->$_->() } || '' } qw( seq_id start end strand ); my $panel = $self->panel; if (exists $panel->{_seqcache}{$key}) { return $panel->{_seqcache}{$key}; } else { my $obj = $thing->seq; $obj = $obj->seq if ref $obj; return $panel->{_seqcache}{$key} = $obj; } } 1; =head1 NAME Bio::Graphics::Glyph::generic - The "generic" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This is identical to the "box" glyph except that it will draw the subparts of features that contain subfeatures. The subparts are not connected -- use the "segments" glyph for that. "Generic" is the default glyph used when not otherwise specified. =head2 METHODS This module overrides the maxdepth() method to return 0 unless the -maxdepth option is provided explicitly. This means that any module that inherits from generic will need to override maxdepth() again in order to draw subfeatures. In general, those implementing multi-segmented feature glyphs should inherit from Bio::Graphics::Glyph::segments, which allows for one level of descent. In addition, the following new methods are implemented: =over 4 =item labelfont(), descfont(), labelwidth(), descriptionwidth() Return the font, width for the label or description. =item label() Return the glyph label text (printed above the glyph). =item description() Return the glyph description text (printed below the glyph). =item draw_translation() Draw the protein translation of the feature (assumes that the feature is attached to a DNA sequence). =item draw_sequence() Draw the sequence of the feature (either DNA or protein). =back =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Default font gdSmallFont -label_font Font used for label gdSmallFont -desc_font Font used for description gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -pad_top Top padding 0 -pad_bottom Bottom padding 0 -label Whether to draw a label 0 (false) -label_position Where to draw the label "top" (default) or "left" -description Whether to draw a description 0 (false) -strand_arrow Whether to indicate 0 (false) strandedness -hilite Highlight color undef (no color) -draw_dna If true, draw the dna residues 0 (false) when magnification level allows. -canonical_strand If true, draw the dna residues 0 (false) as they appear on the plus strand even if the feature is on the minus strand. -pad_top and -pad_bottom allow you to insert some blank space between the glyph's boundary and its contents. This is useful if you are changing the glyph's height dynamically based on its feature's score. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Allen Day Eday@cshl.orgE, Lincoln Stein Elincoln.stein@gmail.comE Copyright (c) 2001 Cold Spring Harbor Laboratory Copyright (c) 2010 Ontario Institute for Cancer Research This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/minmax.pm000555001750001750 1116312366325116 22015 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::minmax; use strict; use base qw(Bio::Graphics::Glyph); sub my_description { return < [ 'float', undef, 'The minimum score of the quantitative range.'], max_score => [ 'float', undef, 'The maximum score of the quantitative range.'], bicolor_pivot => [ ['mean','zero','float','max','min','1SD','2SD','3SD'], undef, 'A value to pivot the display on. Typically this involves changing the color of the', 'glyph (and scale axis) depending on whether the feature is above or below the pivot value.', 'Provide "mean" to pivot on the mean of the data series, "zero" to pivot on the', 'zero value, "min" to pivot on the min and "max" on max of data series, also it is', 'possible to use any arbitrary integer or floating point number to pivot at that value.'], pos_color => [ 'color', undef, 'The color to use for values that exceed the bicolor_pivot value.'], neg_color => [ 'color', undef, 'The color to use for values that are below the bicolor_pivot value.'], }; } sub min_score { shift->option('min_score'); } sub max_score { shift->option('max_score'); } sub minmax { my $self = shift; my $parts = shift; # figure out the colors my $max_score = $self->max_score; my $min_score = $self->min_score; my $do_min = !defined $min_score; my $do_max = !defined $max_score; if ($do_min or $do_max) { my $first = $parts->[0]; for my $part (@$parts) { my $s = eval { $part->feature->score } || $part; next unless defined $s; $max_score = $s if $do_max && (!defined $max_score or $s > $max_score); $min_score = $s if $do_min && (!defined $min_score or $s < $min_score); } } return $self->sanity_check($min_score,$max_score); } sub sanity_check { my $self = shift; my ($min_score,$max_score,@rest) = @_; return ($min_score,$max_score,@rest) if $max_score > $min_score; if ($max_score > 0) { $min_score = 0; } else { $max_score = $min_score + 1; } return ($min_score,$max_score,@rest); } sub midpoint { my $self = shift; my $default = shift; my $pivot = $self->bicolor_pivot; if ($pivot eq 'none') { return } elsif ($pivot eq 'zero') { return 0; } elsif ($pivot eq 'mean') { return eval {$self->series_mean} || 0; } elsif ($pivot eq 'min') { return eval {$self->series_min} || 0; } elsif ($pivot eq 'max') { return eval {$self->series_max} || 0; } elsif ($pivot =~ /^(\d+)SD/i) { my $stdevs = $1; return eval {$self->series_mean + $self->series_stdev * $stdevs} || 0; } elsif ($pivot =~ /^[\d.eE+-]+$/){ return $pivot; } else { my $min = $self->min_score or return $default; my $max = $self->max_score or return $default;; return (($min+$max)/2); } } sub bicolor_pivot { my $self = shift; my $pivot = $self->option('bicolor_pivot'); return if defined $pivot && $pivot eq 'none'; return $pivot; } sub pos_color { my $self = shift; my $pivot = $self->bicolor_pivot || 'none'; return $self->bgcolor if $pivot eq 'none'; return defined $self->color('pos_color') ? $self->color('pos_color') : $self->bgcolor; } sub neg_color { my $self = shift; my $pivot = $self->bicolor_pivot || 'none'; return $self->bgcolor if $pivot eq 'none'; return defined $self->color('neg_color') ? $self->color('neg_color') : $self->bgcolor; } # change the scaling of the y axis sub rescale { my $self = shift; my ($min,$max) = @_; return ($min,$max); # don't do anything here } 1; __END__ =head1 NAME Bio::Graphics::Glyph::minmax - The minmax glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is a common base class for L and L. It adds an internal method named minmax() for calculating the upper and lower boundaries of scored features, and is not intended for end users. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2003 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/pairplot.pm000555001750001750 2165712366325116 22367 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::pairplot; # Triangle plot for showing pairwise quantitative relationships. # Similar to pairwise_plot, which was originally distributed in GBrowse, # except that the signal intensity is handled using a callback that takes # the two features to be compared. sub my_description { return < [ 'CODEREF', undef, 'Pass a coderef to a subroutine with the following signature: sub ($$). The', 'two arguments are the first and second feature to compare. Return a floating point', 'number to indicate the score at the intersection of these two features.' ], min_score => [ 'float', 0.0, 'Minimum possible pairwise score.' ], max_score => [ 'float', 1.0, 'Maximum possible pairwise score.' ], angle => [ 'float', 45, 'Angle between the side of the triangle and the base, in degrees.' ], } } use strict; use Math::Trig; use base 'Bio::Graphics::Glyph::generic'; sub maxdepth { my $self = shift; my $md = $self->Bio::Graphics::Glyph::maxdepth; return $md if defined $md; return 1; } # return angle in radians sub angle { my $self = shift; my $angle = $self->{angle} ||= $self->option('angle') || 45; $self->{angle} = shift if @_; deg2rad($angle); } sub slope { my $self = shift; return $self->{slope} if exists $self->{slope}; return $self->{slope} = tan($self->angle); } sub x2y { my $self = shift; shift() * $self->slope; } sub intercept { my $self = shift; my ($x1,$x2) = @_; my $mid = ($x1+$x2)/2; my $y = $self->x2y($mid-$x1); return (int($mid+0.5),int($y+0.5)); } # height calculated from width sub layout_height { my $self = shift; return $self->{height} if exists $self->{height}; return $self->{height} = $self->x2y($self->width)/2; } sub min_score { my $self = shift; my $min = $self->option('min_score'); return 0 unless defined $min; } sub max_score { my $self = shift; my $max = $self->option('max_score'); return 1.0 unless defined $max; } sub calculate_color { my $self = shift; my ($s,$rgb) = @_; return $self->{colors}{$s} if exists $self->{colors}{$s}; my $max_score = $self->max_score; my $min_score = $self->min_score; my $scale = 255/($max_score-$min_score); my $value = ($s-$min_score) * $scale; # will range from 0 to 255 return $self->{colors}{$s} = $self->panel->translate_color(map { 255 - $value} @$rgb); } sub draw { my $self = shift; my $gd = shift; my ($left,$top,$partno,$total_parts) = @_; my $fgcolor = $self->fgcolor; my ($red,$green,$blue) = $self->panel->rgb($self->bgcolor); my @points = $self->get_points(); $gd->line($self->left+$left, $top+1, $self->right+$left,$top+1, $fgcolor); my $points = $self->option('point'); my @parts = sort {$a->left<=>$b->left} $self->parts; $_->draw_component($gd,$left,$top-10) foreach @parts; # assumption: parts are not overlapping if ($points) { @points = map { int (($parts[$_]->right+$parts[$_+1]->left)/2)} (0..$#parts-1); unshift @points,int($parts[0]->left); push @points,int($parts[-1]->right); } for (my $ia=0;$ia<@parts-1;$ia++) { for (my $ib=$ia+1;$ib<@parts;$ib++) { my ($l1,$r1,$l2,$r2); if (@points) { ($l1,$r1) = ($points[$ia]+1,$points[$ia+1]-1); ($l2,$r2) = ($points[$ib]+1,$points[$ib+1]-1); } else { ($l1,$r1) = ($parts[$ia]->left,$parts[$ia]->right); ($l2,$r2) = ($parts[$ib]->left,$parts[$ib]->right); } my $intensity = eval{$self->feature->pair_score($parts[$ia],$parts[$ib])}; warn $@ if $@; $intensity = 1.0 unless defined $intensity; my $c = $self->calculate_color($intensity,[$red,$green,$blue]); # left corner my ($lcx,$lcy) = $self->intercept($l1,$l2); my ($tcx,$tcy) = $self->intercept($r1,$l2); my ($rcx,$rcy) = $self->intercept($r1,$r2); my ($bcx,$bcy) = $self->intercept($l1,$r2); my $poly = GD::Polygon->new(); $poly->addPt($lcx+$left,$lcy+$top); $poly->addPt($tcx+$left,$tcy+$top); $poly->addPt($rcx+$left,$rcy+$top); $poly->addPt($bcx+$left,$bcy+$top); $gd->filledPolygon($poly,$c); } } } sub get_points { my $self = shift; my @points; my @parts = $self->parts; return unless @parts; for my $g (@parts) { push @points,$g->left; push @points,$g->right; } @points; } # never allow our internal parts to bump; sub bump { 0 } 1; __END__ =head1 NAME Bio::Graphics::Glyph::pairplot - The "pairwise plot" glyph =head1 SYNOPSIS use Bio::Graphics; # create the panel, etc. See Bio::Graphics::Panel # for the synopsis # Create one big feature using the PairFeature # glyph (see end of synopsis for an implementation) my $block = PairFeature->new(-start=> 2001, -end => 10000); # It will contain a series of subfeatures. my $start = 2001; while ($start < 10000) { my $end = $start+120; $block->add_SeqFeature($bsg->new(-start=>$start, -end =>$end ),'EXPAND'); $start += 200; } $panel->add_track($block, -glyph => 'pairplot', -angle => 45, -bgcolor => 'red', -point => 1, ); print $panel->png; package PairFeature; use base 'Bio::SeqFeature::Generic'; sub pair_score { my $self = shift; my ($sf1,$sf2) = @_; # simple distance function my $dist = $sf2->end - $sf1->start; my $total = $self->end - $self->start; return sprintf('%2.2f',1-$dist/$total); } =head1 DESCRIPTION This glyph draws a "triangle plot" similar to the ones used to show linkage disequilibrium between a series of genetic markers. It is basically a dotplot drawn at a 45 degree angle, with each diamond-shaped region colored with an intensity proportional to an arbitrary scoring value relating one feature to another (typically a D' value in LD studies). This glyph requires more preparation than other glyphs. First, you must create a subclass of Bio::SeqFeature::Generic (or Bio::Graphics::Feature, if you prefer) that has a pair_score() method. The pair_score() method will take two features and return a numeric value between 0.0 and 1.0, where higher values mean more intense. You should then create a feature of this new type and use add_SeqFeature() to add to it all the genomic features that you wish to compare. Then add this feature to a track using the pairplot glyph. When the glyph renders the feature, it will interrogate the pair_score() method for each pair of subfeatures. =head2 OPTIONS In addition to the common options, the following glyph-specific options are recognized: Option Description Default ------ ----------- ------- -point If true, the plot will be 0 drawn relative to the midpoint between each adjacent subfeature. This is appropriate for point-like subfeatures, such as SNPs. -angle Angle to draw the plot. Values 45 between 1 degree and 89 degrees are valid. Higher angles give a more vertical plot. -bgcolor The color of the plot. cyan =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.edu. Copyright (c) 2004 Cold Spring Harbor Laboratory This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/ellipse.pm000555001750001750 607412366325116 22146 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::ellipse; use strict; use base qw(Bio::Graphics::Glyph::generic); sub my_description { return <bounds(@_); $self->filled_oval($gd, $x1, $y1, $x2, $y2); $self->draw_label($gd,@_) if $self->option('label'); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::ellipse - The "ellipse" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph draws an oval instead of a box; otherwise it is similar to the "generic" or "box" glyphs. The width of the oval is determined by the feature width, and the height by the -height option. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/read_pair.pm000555001750001750 245112366325116 22432 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::read_pair; #specialized for SAM read pairs use base 'Bio::Graphics::Glyph::segments'; sub my_description { return <level == 0 ? 'dashed' : 'solid'; } sub parts_overlap { 1 } sub box_subparts { 2 } sub stranded { my $self = shift; my $s = $self->SUPER::stranded; return defined $s ? $s : 1; } sub bgcolor { my $self = shift; my $bg = $self->option('bgcolor'); $bg = $self->feature->strand > 0 ? 'red' : 'blue' unless defined $bg; return $self->factory->translate_color($bg); } sub draw_target { my $self = shift; my $t = $self->option('draw_target'); return $t if defined $t; return 1; } sub show_mismatch { my $self = shift; my $t = $self->option('show_mismatch'); return $t if defined $t; return 1; } sub label_position { my $self = shift; my $t = $self->option('label_position'); return $t if defined $t; return 'left'; } sub maxdepth { 2 } 1; Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/decorated_gene.pm000444001750001750 1025212366325116 23447 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::decorated_gene; use strict; use base 'Bio::Graphics::Glyph::decorated_transcript'; sub extra_arrow_length { my $self = shift; return 0 unless $self->{level} == 1; local $self->{level} = 0; # fake out superclass return $self->SUPER::extra_arrow_length; } sub pad_left { my $self = shift; my $type = $self->feature->primary_tag; return 0 unless $type =~ /gene|mRNA/; $self->SUPER::pad_left; } sub pad_right { my $self = shift; return 0 unless $self->{level} < 2; # don't invoke this expensive call on exons my $strand = $self->feature->strand; $strand *= -1 if $self->{flip}; my $pad = $self->SUPER::pad_right; return $pad unless defined($strand) && $strand > 0; my $al = $self->arrow_length; return $al > $pad ? $al : $pad; } sub pad_bottom { my $self = shift; return 0 unless $self->{level} < 2; # don't invoke this expensive call on exons return $self->SUPER::pad_bottom; } sub pad_top { my $self = shift; return 0 unless $self->{level} < 2; # don't invoke this expensive call on exons return $self->SUPER::pad_top; } sub bump { my $self = shift; return 1 if $self->{level} == 0; # top level bumps, other levels don't unless specified in config return $self->SUPER::bump; } sub label { my $self = shift; return unless $self->{level} < 2; if ($self->label_transcripts && $self->{feature}->primary_tag eq 'mRNA') { # the mRNA return $self->_label; } else { return $self->SUPER::label; } } sub label_position { my $self = shift; return 'top' if $self->{level} == 0; return 'left'; } sub label_transcripts { my $self = shift; return $self->{label_transcripts} if exists $self->{label_transcripts}; return $self->{label_transcripts} = $self->_label_transcripts; } sub _label_transcripts { my $self = shift; return $self->option('label_transcripts'); } sub draw_connectors { my $self = shift; return if $self->feature->primary_tag eq 'gene'; $self->SUPER::draw_connectors(@_); } sub maxdepth { my $self = shift; my $md = $self->Bio::Graphics::Glyph::maxdepth; return $md if defined $md; return 2; } sub _subfeat { my $class = shift; my $feature = shift; return $feature->get_SeqFeatures('mRNA') if $feature->primary_tag eq 'gene'; my @subparts; if ($class->option('sub_part')) { @subparts = $feature->get_SeqFeatures($class->option('sub_part')); } else { @subparts = $feature->get_SeqFeatures(qw(CDS five_prime_UTR three_prime_UTR UTR)); } # The CDS and UTRs may be represented as a single feature with subparts or as several features # that have different IDs. We handle both cases transparently. my @result; foreach (@subparts) { if ($_->primary_tag =~ /CDS|UTR/i) { my @cds_seg = $_->get_SeqFeatures; if (@cds_seg > 0) { push @result,@cds_seg } else { push @result,$_ } } else { push @result,$_; } } return @result; } 1; __END__ =head1 NAME Bio::Graphics::Glyph::decorated_gene - A GFF3-compatible gene glyph with protein decorations =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph has the same functionality as the L glyph, but uses the L glyph instead of the L glyph to draw transcripts. One usecase for the 'decorated_gene' glyph is to highlight protein features of different splice forms of the same gene to see how splice forms differ in terms of protein features, for example the presence of predicted signal peptides or protein domains. See L for a description of how to provide protein decorations for transcripts. =head1 BUGS =head1 SEE ALSO L, L =head1 AUTHOR Christian Frech Ecfa24@sfu.caE This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/redgreen_box.pm000555001750001750 1172612366325116 23174 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::redgreen_box; use strict; use base qw(Bio::Graphics::Glyph::generic); sub bgcolor { my $self = shift; $self->{force_bgcolor}; } sub fgcolor { my $self = shift; return $self->option('border') ? $self->SUPER::fgcolor : $self->{force_bgcolor}; } sub color_subparts { shift->option('color_subparts') } sub bump { my $self = shift; return 0 if $self->color_subparts; return $self->SUPER::bump; } sub draw { my $self = shift; my $val = $self->feature->score; # we're going to force all our parts to share the same colors # unless otherwise requested my @parts = $self->parts; @parts = $self if !@parts && $self->level == 0; unless ($self->color_subparts) { my @rgb = map {int($_)} HSVtoRGB(120*(1-$val),1,255); my $color = $self->panel->translate_color(@rgb); $_->{force_bgcolor} = $color foreach @parts; } else { foreach (@parts) { my $val = $_->feature->score; my @rgb = map {int($_)} HSVtoRGB(120*(1-$val),1,255); my $color = $self->panel->translate_color(@rgb); $_->{force_bgcolor} = $color; } } $self->SUPER::draw(@_); } sub HSVtoRGB ($$$) { my ($h,$s,$v)=@_; my ($r,$g,$b,$i,$f,$p,$q,$t); if( $s == 0 ) { ## achromatic (grey) return ($v,$v,$v); } $h /= 60; ## sector 0 to 5 $i = int($h); $f = $h - $i; ## factorial part of h $p = $v * ( 1 - $s ); $q = $v * ( 1 - $s * $f ); $t = $v * ( 1 - $s * ( 1 - $f ) ); if($i<1) { $r = $v; $g = $t; $b = $p; } elsif($i<2){ $r = $q; $g = $v; $b = $p; } elsif($i<3){ $r = $p; $g = $v; $b = $t; } elsif($i<4){ $r = $p; $g = $q; $b = $v; } elsif($i<5){ $r = $t; $g = $p; $b = $v; } else { $r = $v; $g = $p; $b = $q; } return ($r,$g,$b); } sub mMin { my $n=10000000000000; map { $n=($n>$_) ? $_ : $n } @_; return($n); } sub mMax { my $n=0; map { $n=($n<$_) ? $_ : $n } @_; return($n); } 1; =head1 NAME Bio::Graphics::Glyph::redgreen_box - The "redgreen_box" glyph =head1 SYNOPSIS See L and L. =head1 DESCRIPTION This glyph is similar to the graded_segments glyph except that it generates a green-Ered gradient suitable for use with microarray data. A feature score of 0 is full green; a feature score of 1.0 is full red; intermediate scores are shades of yellow. =head2 OPTIONS The following options are standard among all Glyphs. See L for a full explanation. Option Description Default ------ ----------- ------- -fgcolor Foreground color black -outlinecolor Synonym for -fgcolor -bgcolor Background color turquoise -fillcolor Synonym for -bgcolor -linewidth Line width 1 -height Height of glyph 10 -font Glyph font gdSmallFont -connector Connector type 0 (false) -connector_color Connector color black -label Whether to draw a label 0 (false) -description Whether to draw a description 0 (false) -hilite Highlight color undef (no color) The following glyph-specific option is recognized: -border Draw a fgcolor border around 0 (false) the box -color_subparts Give each subpart a separate 0 (false) color based on its score If the B<-color_subparts> option is true, then the glyph will individually coloriz each of its subparts. In addition, internal bumping of features will be turned off. This will produce an effect similar to graded_segments. =head1 BUGS Please report them. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L =head1 AUTHOR Lincoln Stein Elstein@cshl.orgE Copyright (c) 2001 Cold Spring Harbor Laboratory This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/vista_plot.pm000555001750001750 4376512366325116 22725 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::vista_plot; use strict; use base qw(Bio::Graphics::Glyph::wiggle_xyplot Bio::Graphics::Glyph::wiggle_density Bio::Graphics::Glyph::wiggle_whiskers Bio::Graphics::Glyph::heat_map Bio::Graphics::Glyph::smoothing); our $VERSION = '1.0'; sub my_options { { start_color => [ 'color', 'white', 'Beginning of the color gradient, expressed as a named color or', 'RGB hex string.'], end_color => [ 'color', 'red', 'End of the color gradient.'], min_peak => [ 'integer', 1, "Minimum value of the peak feature's \"score\" attribute."], max_peak => [ 'integer', 255, "Maximum value of the peak feature's \"score\" attribute."], min_score => [ 'integer', undef, "Minimum value of the signal graph feature's \"score\" attribute."], max_score => [ 'integer', undef, "Maximum value of the signal graph feature's \"score\" attribute."], peakwidth => [ 'integer', 3, "Line width determine the thickness of the line representing a peak."], glyph_subtype => [ ['peaks+signal','peaks','signal','density'], 'vista', "What to show, peaks or signal, both (vista plot) or density graph."], graph_type => [ ['whiskers','histogram','boxes','line','points','linepoints'], 'boxes', "Type of signal graph to show."], alpha => [ 'integer', 100, "Alpha transparency of peak regions", ], }; } sub my_description { return <{$k} = $v; } return $self->{$k}; } } } sub peakwidth { shift->option('peakwidth') || 3; } sub alpha_c { my $self = shift; return $self->option('alpha') || 100; } # Need to override wiggle_xyplot padding function to enable adequate height control in density mode sub pad_top { my $self = shift; return 0 if $self->glyph_subtype eq 'density'; my $pad = $self->Bio::Graphics::Glyph::generic::pad_top(@_); if ($pad < ($self->font('gdTinyFont')->height)) { $pad = $self->font('gdTinyFont')->height; # extra room for the scale } $pad; } sub bigwig_summary { my $self = shift; my $d = $self->{bigwig_summary}; $self->{bigwig_summary} = shift if @_; $d; } # Need to override this too b/c we need unconventional mean and stdev calculation sub global_mean_and_variance { my $self = shift; if (my $wig = $self->wig) { my @result = eval{($wig->mean,$wig->stdev)}; return @result if @result; } if (my $sum = $self->bigwig_summary){ use Bio::DB::BigWig qw(binMean binStdev); my $stats = $sum->statistical_summary(1); return eval{(binMean($stats->[0]),binStdev($stats->[0]))}; } return; } sub glyph_subtype { my $self = shift; my $only_show = $self->option('only_show') || $self->option('glyph_subtype') || 'vista'; $only_show = 'vista' if $only_show eq 'both' || $only_show eq 'peaks+signal'; return $only_show; } sub graph_type { my $self = shift; return $self->option('graph_type') || $self->options->{graph_type}[1]; } # we override the draw method so that it dynamically creates the parts needed # from the wig file rather than trying to fetch them from the database sub draw { my $self = shift; my($gd,$dx,$dy) = @_; my $only_show = $self->glyph_subtype; my $feature = $self->feature; # Draw dual graph if we have both types of attributes, BigWig and wiggle format supported my %features = (wig => (eval{$feature->get_tag_values('wigfile')})[0], peak => (eval{$feature->get_tag_values('peak_type')})[0], fasta=> (eval{$feature->get_tag_values('fasta')})[0]); $self->panel->startGroup($gd); $self->draw_signal($only_show,\%features,@_) if $only_show =~ /signal|density|vista/; $self->draw_peaks(\%features,@_) if $features{peak} && $only_show =~ /peaks|vista|both/; $self->Bio::Graphics::Glyph::xyplot::draw_label(@_) if $self->option('label'); $self->draw_description(@_) if $self->option('description'); $self->panel->endGroup($gd); } # this should be refactored from wiggle_xyplot and wiggle_density sub draw_signal { my $self = shift; my $signal_type = shift; my $paths = shift; my $feature = $self->feature; # Signal Graph drawing: if ($paths->{wig} && $paths->{wig}=~/\.wi\w{1,3}$/) { eval "require Bio::Graphics::Wiggle" unless Bio::Graphics::Wiggle->can('new'); my $wig = eval { Bio::Graphics::Wiggle->new($paths->{wig}) }; $self->wig($wig); $self->_draw_wigfile($feature,$wig,@_); } elsif ($paths->{wig} && $paths->{wig}=~/\.bw$/i) { eval "use Bio::DB::BigWig 'binMean'" unless Bio::DB::BigWig->can('new'); my @args = (-bigwig => "$paths->{wig}"); if ($paths->{fasta}) { eval "use Bio::DB::Sam" unless Bio::DB::Sam::Fai->can('open'); my $fasta_accessor = Bio::DB::Sam::Fai->can('open') ? Bio::DB::Sam::Fai->open("$paths->{fasta}") : Bio::DB::Fasta->new("$paths->{fasta}"); push @args,(-fasta => $fasta_accessor); } my $bigwig = Bio::DB::BigWig->new(@args); $self->wig($bigwig); my ($summary) = $bigwig->features(-seq_id => $feature->segment->ref, -start => $self->panel->start, -end => $self->panel->end, -type => 'summary'); local $self->{feature} = $summary; if ($signal_type ne 'density' and $self->graph_type eq 'whiskers') { $self->Bio::Graphics::Glyph::wiggle_whiskers::draw(@_); } else { my $stats = $summary->statistical_summary($self->width); my $interval_method = $self->option('interval_method') || 'mean'; my @vals; if ($interval_method eq 'mean') { @vals = map {$_->{validCount} ? Bio::DB::BigWig::binMean($_) : undef} @$stats; } elsif ($interval_method eq 'sum') { @vals = map {$_->{validCount} ? $_->{sumData} : undef} @$stats; } elsif ($interval_method eq 'min') { @vals = map {$_->{validCount} ? $_->{minVal} : undef} @$stats; } elsif ($interval_method eq 'max') { @vals = map {$_->{validCount} ? $_->{maxVal} : undef} @$stats; } else { warn "unrecognized interval method $interval_method!"; } $self->bigwig_summary($summary); if ($signal_type eq 'density') { $self->Bio::Graphics::Glyph::wiggle_density::_draw_coverage($summary,\@vals,@_); } else { $self->Bio::Graphics::Glyph::wiggle_data::_draw_coverage($summary,\@vals,@_); } } } } sub draw_peaks { my $self = shift; my $paths = shift; my($gd,$dx,$dy) = @_; my($left,$top,$right,$bottom) = $self->calculate_boundaries($dx,$dy); # Peak drawing: my $alpha_c = $self->alpha_c; my $feature = $self->feature; my $p_type = $paths->{peak}; my @peaks = $self->peaks(); my $x_scale = $self->scale; my $panel_start = $self->panel->start; my $f_start = $feature->start > $panel_start ? $feature->start : $panel_start; my $lw = $self->peakwidth; my($max_s,$min_s) = ($self->option('max_peak'),$self->option('min_peak')); $max_s = 255 if !defined $max_s; $min_s = 1 if !defined $min_s; my $grad_ok = 0; if (defined $max_s && defined $min_s) { $grad_ok = $self->calculate_gradient($min_s,$max_s); } my $flip = $self->{flip}; $self->{peak_cache} = []; # remember coordinates of the peaks foreach my $peak (@peaks) { my $x1 = $left + ($peak->{start} - $f_start) * $x_scale; my $x2 = $left + ($peak->{stop} - $f_start) * $x_scale; if ($x2 >= $left and $x1 <= $right) { my $y1 = $top; my $y2 = $bottom; $x1 = $left if $x1 < $left; $x2 = $right if $x2 > $right; $alpha_c = $alpha_c <=127 ? $alpha_c : 0; # Reset to zero if illegal value is passed my $score = $peak->{score}; if ($score eq "."){$score = 255;} # Set score to 255 if peak is unscored my $color; if ($grad_ok && defined $score && $score!=255) { my @rgb = $self->Bio::Graphics::Glyph::heat_map::calculate_color($score, $self->min_peak_score, $self->max_peak_score, $self->peak_score_range); $color = $self->color_index(@rgb); }else{ $color = $self->fgcolor; } my $bgcolor = $self->bgcolor; if ($alpha_c > 0){ $gd->alphaBlending(1); $bgcolor = $self->add_alpha($gd,$bgcolor,$alpha_c); } if ($flip) { $x1 = $right - ($x1-$left); $x2 = $right - ($x2-$left); ($x1,$x2) = ($x2,$x1); } my @rect = (int($x1+0.5),int($y1+0.5),int($x2+0.5),int($y2+0.5)); $self->filled_box($gd,@rect,$bgcolor,$bgcolor,0.5) if abs($y2-$y1) > 0; $gd->setThickness($lw); $gd->line(int($x1+0.5),int($y1+0.5),int($x2+0.5),int($y1+0.5),$color); $gd->setThickness(1); push @{$self->{peak_cache}},[$peak,@rect]; } } } # Adding alpha channel to a color: sub add_alpha { my($self,$im,$color,$alpha) = @_; my($r,$g,$b) = $im->rgb($color); return $im->colorAllocateAlpha($r,$g,$b,$alpha); } # Slightly modified function from heat_map.pm sub calculate_gradient { my($self, $min, $max) = @_; my $start_color = lc $self->option('start_color') || 'white'; my $stop_color = lc $self->option('end_color') || 'red'; my $hsv_start = $self->color2hsv($start_color); my $hsv_stop = $self->color2hsv($stop_color); my ($h_start,$s_start,$v_start) = @$hsv_start; my ($h_stop,$s_stop,$v_stop ) = @$hsv_stop; my $s_range = abs($s_stop - $s_start); my $v_range = abs($v_stop - $v_start); my $h_range; # special case: if start hue = end hue, we want to go round # the whole wheel once. Otherwise round the wheel clockwise # or counterclockwise depending on start and end coordinate if ($h_start != $h_stop) { my $direction = abs($h_stop - $h_start)/($h_stop - $h_start); my ($sstart,$sstop) = sort {$a <=> $b} ($h_start,$h_stop); $direction *= -1 if $sstop - $sstart > 256/2; #reverse the direction if we cross 0 $h_range = ($sstop - $sstart) <= 256/2 ? ($sstop - $sstart)*$direction : (256 - $sstop + $sstart)*$direction; } else { $h_range = 256; } # darkness or monochrome gradient? if ( !_isa_color($start_color) || !_isa_color($stop_color) ) { # hue (H) is fixed $h_range = 0; # gradient S V # white -> color 0->255 255 # color -> white 255->0 255 # white -> black 0 255->0 # black -> white 0 0->255 # black -> color 0->255 0->255 # color -> black 255->0 255->0 if ( $start_color eq 'white' && _isa_color($stop_color) ) { $s_range = 255; $s_start = 0; $v_range = 0; $v_start = 255; $h_start = $h_stop; } elsif ( _isa_color($start_color) && $stop_color eq 'white' ) { $s_range = -255; $s_start = 255; $v_range = 0; $v_start = 255; } elsif ( $start_color eq 'white' ) { # end black $s_range = 0; $s_start = 0; $v_range = -255; $v_start = 255; } elsif ( $stop_color eq 'white' ) { # start black $s_range = 0; $s_start = 0; $v_range = 255; $v_start = 0; } elsif ( _isa_color($start_color) ) { # end black $s_range = 255; $s_start = 0; $v_range = 255; $v_start = 0; } elsif ( _isa_color($stop_color) ) { # start black $s_range = -255; $s_start = 255; $v_range = -255; $v_start = 255; } } # store gradient info $self->h_range($h_range); $self->h_start($h_start); $self->s_start($s_start); $self->v_start($v_start); $self->s_range($s_range); $self->v_range($v_range); # store score info $self->peak_score_range($max - $min); $self->min_peak_score($min); $self->max_peak_score($max); # store color extremes my @low_rgb = $self->HSVtoRGB(@$hsv_start); my @high_rgb = $self->HSVtoRGB(@$hsv_stop); $self->low_hsv($hsv_start); $self->high_rgb(\@high_rgb); $self->low_rgb(\@low_rgb); return 1; } sub _isa_color { my $color = shift; return $color =~ /white|black|FFFFFF|000000/i ? 0 : 1; } sub level { -1 } # Need to override this so we have a nice image map for overlayed peaks sub boxes { my $self = shift; my($left,$top,$parent) = @_; return if $self->glyph_subtype eq 'density'; # No boxes for density plot my @boxes = $self->SUPER::boxes(@_); if (my $rects = $self->{peak_cache}) { push @boxes,[@$_,$parent] foreach @$rects; } return wantarray ? @boxes : \@boxes; } # Modified and fused functions from wiggle_density.pm and wiggle_xyplot.pm sub _draw_wigfile { my $self = shift; my $feature = shift; my $wig = shift; $wig->smoothing($self->get_smoothing); $wig->window($self->smooth_window); my ($gd,$left,$top) = @_; my ($start,$end) = $self->effective_bounds($feature); if ($self->glyph_subtype eq 'density') { my ($x1,$y1,$x2,$y2) = $self->bounds($left,$top); $self->draw_segment($gd, $start,$end, $wig,$start,$end, 1,1, $x1,$y1,$x2,$y2); $self->Bio::Graphics::Glyph::xyplot::draw_label(@_) if $self->option('label'); $self->draw_description(@_) if $self->option('description'); } else { my ($start,$end) = $self->effective_bounds($feature); $self->wig($wig); my $parts = $self->create_parts_for_dense_feature($wig,$start,$end); $self->draw_plot($parts,@_); } } sub peaks { my $self = shift; return @{$self->{_peaks}} if $self->{_peaks}; my $feature = $self->feature; my $db = $feature->object_store; my ($p_type) = eval{$feature->get_tag_values('peak_type')}; unless ($db && $p_type) { $self->{_peaks} = []; return; } my @peaks = $db->features(-seq_id => $feature->segment->ref, -start => $self->panel->start, -end => $self->panel->end, -type => $p_type); $self->{_peaks} = \@peaks; return @{$self->{_peaks}}; } 1; =head1 NAME Bio::Graphics::Glyph::vista_plot - The "vista_plot" glyph =head1 SYNOPSIS See L, L and L. =head1 DESCRIPTION This glyph draws peak calls (features with discreet boundaries, i.e. putative transcription sites, over signal graph (wiggle_xyplot) requires a special load gff file that uses attributes 'wigfile' and 'peak_type' B 2L chip_seq vista 5407 23011573 . . . Name=ChipSeq Exp 1;wigfile=SomeWigFile.wigdb;peak_type=binding_site:exp1 The glyph will draw the wiggle file first, than overlay the peaks (if there are any) over signal graph. Elsewhere in the GFF3 file, there should be one or more features of type "binding_site:exp1", e.g.: 2L exp1 binding_site 91934 92005 . . . Options like 'balloon hover' and 'link' are available to customize interaction with peaks in detail view. B Supported bigwig format also requires another attribute to be supplied in load gff file (fasta) which specifies sequence index file for the organism in use. The data file should have the 'bw' extension - it is used to detect the BigWig format by vista_plot 3L chip_seq vista 1 24543530 . . . Name=ChipSeq Exp 2;wigfile=SomeBigWigFile.bw;peak_type=binding_site:exp2;fasta=YourOrganism.fasta Note that all attributes should be present in load gff, as the code currently does not handle situation when only some of the attributes are in gff. To omit peak or signal drawing use "" (i.e. peak_type="") In both cases, the stanza code will look the same (only essential parameters shown): [VISTA_PLOT] feature = vista:chip_seq glyph = vista_plot label = 1 smoothing = mean smoothing_window = 10 bump density = 250 autoscale = local variance_band = 1 max_peak = 255 min_peak = 1 peakwidth = 3 start_color = lightgray end_color = black pos_color = blue neg_color = orange bgcolor = orange alpha = 80 fgcolor = black database = database_with_load_gff_data box_subparts = 1 bicolor_pivot = min key = VISTA plot =head1 OPTIONS Options are the same as for wiggle_xyplot and heat_map B B set transparency for peak area. B Display only 'peaks', 'signal', 'density' or 'peaks+signal'. Aliases for 'peaks+signal' include "both" and "vista". B for proper peak drawing transparency should be enabled by setting B in I file =head1 BUGS Please report them. =head1 SEE ALSO L L L L L =head1 AUTHOR Peter Ruzanov pruzanov@oicr.on.ca Copyright (c) 2010 Ontario Institute for Cancer Research This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER.txt for disclaimers of warranty. =cut Bio-Graphics-2.39/lib/Bio/Graphics/Glyph/ternary_plot.pm000555001750001750 1653612366325116 23257 0ustar00lsteinlstein000000000000package Bio::Graphics::Glyph::ternary_plot; # Draw ternary (triangle plots) use strict; use base qw(Bio::Graphics::Glyph::generic); use Bio::Graphics::Glyph::xyplot; use constant Sin60 =>0.866025403784439; use constant Tan60 =>1.73205080756888; sub calculate_side { my $self = shift; $self->option('height') / Sin60; } # positioning this properly is a bit tricky, because if the side of the triangle # is greater than the width of the feature, then we need to add extra left and right # padding. sub pad_left { my $self = shift; my $feature = $self->feature; my $left = $self->SUPER::pad_left; my $side = $self->calculate_side; my ($a,$b) = $self->map_pt($feature->start,$feature->stop); my $width = abs($b-$a); my $extra = $width > $side ? 0 : ($side-$width)/2; return $extra > $left ? $extra : $left; } sub pad_right { my $self = shift; my $right = $self->SUPER::pad_right; my $side = $self->calculate_side; my $feature = $self->feature; my ($a,$b) = $self->map_pt($feature->start,$feature->stop); my $width = abs($b-$a); my $extra = $width > $side ? 0 : ($side-$width)/2; return $extra > $right ? $extra : $right; } sub pad_top { my $self = shift; my $pad = $self->SUPER::pad_top; return $pad unless $self->option('vertices'); my $font = $self->image_class->gdTinyFont(); my $lh = $font->height/2; return $pad > $lh ? $pad : $lh; } sub pad_bottom { my $self = shift; my $pad = $self->SUPER::pad_bottom; return $pad unless $self->option('vertices'); my $font = $self->image_class->gdTinyFont(); my $lh = $font->height/2; return $pad > $lh ? $pad : $lh; } sub triples { my $self = shift; my $triples = $self->option('triples'); return $triples if defined $triples; my @triples = $self->feature->get_tag_values('triples'); for my $t (@triples) { next if ref $t && ref $t eq 'ARRAY'; # already in right format $t = [split /[,\w]/,$t]; } return \@triples; } sub draw_component { my $self = shift; my $gd = shift; my $fg = $self->fgcolor; my $bg = $self->bgcolor; # position the left (A) edge my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $xmid = ($x1+$x2)/2; my $side = $self->calculate_side; my $left = $xmid - $side/2; my $right = $left + $side; my $top = $y1; my $bottom=$y2; # draw the triangle my $poly_pkg = $self->polygon_package; my $poly = $poly_pkg->new(); $poly->addPt($left,$bottom); $poly->addPt($right,$bottom); $poly->addPt($xmid,$top); $gd->polygon($poly,$fg); # draw vertex labels, if any my $fontcolor = $self->fontcolor; my $font = $self->image_class->gdTinyFont(); my $lh = $font->height; my $lw = $font->width; if (my $vertex_labels = $self->option('vertices')) { my @labels = @$vertex_labels; $gd->string($font,$left-$lw*length($labels[0]),$bottom+$lh/2,$labels[0],$fontcolor); $gd->string($font,$right,$bottom+$lh/2,$labels[1],$fontcolor); $gd->string($font,$xmid-$lw*length($labels[2])-3,$top-3,$labels[2],$fontcolor); } # get triples my $data = $self->triples; for my $triple (@$data) { my ($a,$b,$c,$color,$label) = @$triple; $color = defined $color ? $self->factory->translate_color($color) : $bg; my $x = $xmid + $side * ($b - $a)/2; my $y = $bottom - $side * ($c * Tan60)/2; draw_disc($gd,$x,$y,3,$color); if ($label) { $gd->string($font,$x+3,$y,$label,$fontcolor); } } } sub draw_disc { my ($gd,$x,$y,$pr,$color) = @_; $gd->filledArc($x,$y,$pr,$pr,0,360,$color); } 1; __END__ =head1 NAME Bio::Graphics::Glyph::ternary_plot - Draw ternary plot data =head1 SYNOPSIS #!/usr/bin/perl use strict; use warnings; use Bio::Graphics; use Bio::Graphics::Feature; my $segment = Bio::Graphics::Feature->new(-start=>1,-end=>700); my $snp1 = Bio::Graphics::Feature->new(-start => 500, -end => 501, -name => 'rs000001', -attributes=> {triples => [ [0.01, 0.81, 0.18, 'red', 'CEPH'], [0.25, 0.25, 0.50, 'blue', 'JPT+CHB'], [0.81, 0.01, 0.18, 'green','YRI'], ] } ); my $snp2 = Bio::Graphics::Feature->new(-start => 300, -end => 301, -name => 'rs12345', -attributes=> {triples => [ [0.04, 0.64, 0.32, 'red', 'Controls'], [0.16, 0.36, 0.48, 'blue', 'Cases'], ] } ); my $panel = Bio::Graphics::Panel->new(-segment=>$segment,-width=>800); $panel->add_track($segment,-glyph=>'arrow',-double=>1,-tick=>2); $panel->add_track([$snp1,$snp2], -glyph => 'ternary_plot', -height => 80, -fgcolor => 'lightgrey', -vertices => ['AA','GG','AG'], -label => 1, ); print $panel->png; =head1 DESCRIPTION This glyph draws a light gray equilateral triangle with its base centered on the feature. The top of the equilateral triangle is equal to the specified height. To look good, please choose a height of E= 15. Inside, the glyph will plot one or more data points using ternary plot conventions (see http://en.wikipedia.org/wiki/Ternary_plot). The data consists of a series of (A,B,C) triplets chosen such that the range of each component is [0.0,1.0] and A + B + C = 1.0. The left, right and apex of the triangle represent the proportions of A, B and C respectively. As a component approaches 1.0, it gets closer to its corresponding vertex. The data can be represented as one or more feature tags called "triples" each in the format: A1,B1,C1,,