GenomicAlignments/DESCRIPTION0000644000175200017520000000540314551577536016731 0ustar00biocbuildbiocbuildPackage: GenomicAlignments Title: Representation and manipulation of short genomic alignments Description: Provides efficient containers for storing and manipulating short genomic alignments (typically obtained by aligning short reads to a reference genome). This includes read counting, computing the coverage, junction detection, and working with the nucleotide content of the alignments. biocViews: Infrastructure, DataImport, Genetics, Sequencing, RNASeq, SNP, Coverage, Alignment, ImmunoOncology URL: https://bioconductor.org/packages/GenomicAlignments Video: https://www.youtube.com/watch?v=2KqBSbkfhRo , https://www.youtube.com/watch?v=3PK_jx44QTs BugReports: https://github.com/Bioconductor/GenomicAlignments/issues Version: 1.38.2 License: Artistic-2.0 Encoding: UTF-8 Authors@R: c( person("Hervé", "Pagès", role=c("aut", "cre"), email="hpages.on.github@gmail.com"), person("Valerie", "Obenchain", role="aut"), person("Martin", "Morgan", role="aut"), person("Fedor", "Bezrukov", role="ctb"), person("Robert", "Castelo", role="ctb")) Depends: R (>= 4.0.0), methods, BiocGenerics (>= 0.37.0), S4Vectors (>= 0.27.12), IRanges (>= 2.23.9), GenomeInfoDb (>= 1.13.1), GenomicRanges (>= 1.41.5), SummarizedExperiment (>= 1.9.13), Biostrings (>= 2.55.7), Rsamtools (>= 1.31.2) Imports: methods, utils, stats, BiocGenerics, S4Vectors, IRanges, GenomicRanges, Biostrings, Rsamtools, BiocParallel LinkingTo: S4Vectors, IRanges Suggests: ShortRead, rtracklayer, BSgenome, GenomicFeatures, RNAseqData.HNRNPC.bam.chr14, pasillaBamSubset, TxDb.Hsapiens.UCSC.hg19.knownGene, TxDb.Dmelanogaster.UCSC.dm3.ensGene, BSgenome.Dmelanogaster.UCSC.dm3, BSgenome.Hsapiens.UCSC.hg19, DESeq2, edgeR, RUnit, BiocStyle Collate: utils.R cigar-utils.R GAlignments-class.R GAlignmentPairs-class.R GAlignmentsList-class.R GappedReads-class.R OverlapEncodings-class.R findMateAlignment.R readGAlignments.R junctions-methods.R sequenceLayer.R pileLettersAt.R stackStringsFromGAlignments.R intra-range-methods.R coverage-methods.R setops-methods.R findOverlaps-methods.R coordinate-mapping-methods.R encodeOverlaps-methods.R findCompatibleOverlaps-methods.R summarizeOverlaps-methods.R findSpliceOverlaps-methods.R zzz.R git_url: https://git.bioconductor.org/packages/GenomicAlignments git_branch: RELEASE_3_18 git_last_commit: d740c47 git_last_commit_date: 2024-01-16 Repository: Bioconductor 3.18 Date/Publication: 2024-01-16 NeedsCompilation: yes Packaged: 2024-01-16 22:12:46 UTC; biocbuild Author: Hervé Pagès [aut, cre], Valerie Obenchain [aut], Martin Morgan [aut], Fedor Bezrukov [ctb], Robert Castelo [ctb] Maintainer: Hervé Pagès GenomicAlignments/NAMESPACE0000644000175200017520000001210014516004601016405 0ustar00biocbuildbiocbuilduseDynLib(GenomicAlignments) import(methods) importFrom(utils, read.table) importFrom(stats, setNames) import(BiocGenerics) import(S4Vectors) import(IRanges) import(GenomeInfoDb) import(GenomicRanges) import(SummarizedExperiment) import(Biostrings) import(Rsamtools) importFrom(BiocParallel, bplapply) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S4 classes ### exportClasses( GAlignments, GAlignmentPairs, GAlignmentsList, GappedReads, OverlapEncodings ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S3 methods ### S3method(as.data.frame, OverlapEncodings) S3method(levels, OverlapEncodings) ### We also export them thru the export() directive so that (a) they can be ### called directly, (b) tab-completion on the name of the generic shows them, ### and (c) methods() doesn't asterisk them. export( as.data.frame.OverlapEncodings, levels.OverlapEncodings ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S4 methods for generics not defined in GenomicAlignments ### exportMethods( length, names, "names<-", c, "[[", show, coerce, unlist, order, sort, rank, levels, update, ## Generics defined in BiocGenerics: as.data.frame, is.unsorted, order, sort, rank, start, end, width, strand, "strand<-", invertStrand, updateObject, ## Generics defined in S4Vectors: bindROWS, getListElement, parallel_slot_names, "elementMetadata<-", pcompare, ## Generics defined in IRanges: ranges, rglist, relistToClass, findOverlaps, windows, narrow, coverage, pintersect, ## Generics defined in GenomeInfoDb: seqinfo, "seqinfo<-", seqnames, "seqnames<-", seqlevelsInUse, ## Generics defined in GenomicRanges: granges, grglist, ## Generics defined in Biostrings: encoding, ## Generics defined in S4Vectors: first, second ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export non-generic functions ### export( validCigar, CIGAR_OPS, explodeCigarOps, explodeCigarOpLengths, cigarToRleList, cigarRangesAlongReferenceSpace, cigarRangesAlongQuerySpace, cigarRangesAlongPairwiseSpace, extractAlignmentRangesOnReference, cigarWidthAlongReferenceSpace, cigarWidthAlongQuerySpace, cigarWidthAlongPairwiseSpace, cigarNarrow, cigarQNarrow, cigarOpTable, queryLoc2refLoc, queryLocs2refLocs, GAlignments, GAlignmentPairs, GAlignmentsList, GappedReads, Lencoding, Rencoding, Lnjunc, Rnjunc, findMateAlignment, makeGAlignmentPairs, getDumpedAlignments, countDumpedAlignments, flushDumpedAlignments, readGAlignments, readGAlignmentPairs, readGAlignmentsList, readGappedReads, NATURAL_INTRON_MOTIFS, summarizeJunctions, readTopHatJunctions, readSTARJunctions, sequenceLayer, pileLettersAt, stackStringsFromGAlignments, stackStringsFromBam, alphabetFrequencyFromBam, encodeOverlaps1, flipQuery, selectEncodingWithCompatibleStrand, extractQueryStartInTranscript, countCompatibleOverlaps, Union, IntersectionNotEmpty, IntersectionStrict ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S4 generics defined in GenomicAlignments + export corresponding ### methods ### export( ## GAlignments-class.R: rname, "rname<-", cigar, qwidth, njunc, ## GAlignmentPairs-class.R: last, strandMode, "strandMode<-", isProperPair, ## GappedReads-class.R: qseq, ## OverlapEncodings-class.R: Loffset, Roffset, flippedQuery, encodingHalves, isCompatibleWithSplicing, ## readGAlignments.R: readGAlignments, readGAlignmentPairs, readGAlignmentsList, readGappedReads, ## junctions-methods.R: junctions, ## intra-range-methods.R: qnarrow, ## encodeOverlaps-methods.R: encodeOverlaps, isCompatibleWithSkippedExons, extractSteppedExonRanks, extractSpannedExonRanks, extractSkippedExonRanks, ## findCompatibleOverlaps-methods.R: findCompatibleOverlaps, ## summarizeOverlaps-methods.R: summarizeOverlaps, ## findSpliceOverlaps-methods.R: findSpliceOverlaps, ## coordinateMapping-methods.R: mapToAlignments, pmapToAlignments, mapFromAlignments, pmapFromAlignments ) ### Exactly the same list as above. exportMethods( rname, "rname<-", cigar, qwidth, njunc, first, last, strandMode, "strandMode<-", isProperPair, qseq, Loffset, Roffset, flippedQuery, encodingHalves, isCompatibleWithSplicing, readGAlignments, readGAlignmentPairs, readGAlignmentsList, readGappedReads, junctions, qnarrow, encodeOverlaps, isCompatibleWithSkippedExons, extractSteppedExonRanks, extractSpannedExonRanks, extractSkippedExonRanks, findCompatibleOverlaps, summarizeOverlaps, findSpliceOverlaps, mapToAlignments, pmapToAlignments, mapFromAlignments, pmapFromAlignments ) GenomicAlignments/NEWS0000644000175200017520000002723514516004601015704 0ustar00biocbuildbiocbuildCHANGES IN VERSION 1.38.0 ------------------------- - No changes in this version. CHANGES IN VERSION 1.36.0 ------------------------- NEW FEATURES o Add 'strandMode' argument to readGAlignmentsList() (contributed by Robert Castelo). BUG FIXES o Increase 'cigar_buf' size to reduce risk of buffer overflow in cigar-utils C code. CHANGES IN VERSION 1.34.0 ------------------------- BUG FIXES o Fix buffer overflow in cigarNarrow()/cigarQNarrow() See commit 5d0a29b2795a95dfb006e8e54c7532b12bd5e79c. CHANGES IN VERSION 1.32.0 ------------------------- - No significant changes in this version. CHANGES IN VERSION 1.30.0 ------------------------- - No changes in this version. CHANGES IN VERSION 1.28.0 ------------------------- - No changes in this version. CHANGES IN VERSION 1.26.0 ------------------------- - No changes in this version. CHANGES IN VERSION 1.24.0 ------------------------- - No changes in this version. CHANGES IN VERSION 1.22.0 ------------------------- NEW FEATURES o Add stackStringsFromGAlignments(). Analog to stackStringsFromBam() except that it stacks the read sequences stored in a GAlignments object instead of a BAM file. BUG FIXES o Fix summarizeJunctions() error when no junctions are found and 'genome' is specified. CHANGES IN VERSION 1.20.0 ------------------------- No NEW FEATURES or SIGNIFICANT USER-VISIBLE CHANGES or BUG FIXES since version 1.18.0 CHANGES IN VERSION 1.18.0 ------------------------- No NEW FEATURES or SIGNIFICANT USER-VISIBLE CHANGES or BUG FIXES since version 1.16.0 CHANGES IN VERSION 1.16.0 ------------------------- NEW FEATURES o Add coercion from list to GAlignmentsList. SIGNIFICANT USER-VISIBLE CHANGES o Improve performance of [[<- on GAlignmentsList objects. This is a 100x speedup or more on a big GAlignmentsList object. BUG FIXES o Remove spurious warning in summarizeOverlaps(). CHANGES IN VERSION 1.14.0 ------------------------- SIGNIFICANT USER-VISIBLE CHANGES o makeGAlignmentPairs() no more drops pairs with discordant seqnames. o Change 'maxgap' and 'minoverlap' argument defaults in methods of the findOverlaps() so they adhere to the new argument defaults of the generic defined in IRanges 2.12.0. See NEWS file in the IRanges package for more information about this change. DEPRECATED AND DEFUNCT o Remove 'force' argument from seqinfo() and seqlevels() setters (the argument got deprecated in BioC 3.5 in favor of new and more flexible 'pruning.mode' argument). BUG FIXES o Fix bug in pairing code of readGAlignmentPairs() when one mate in a pair is lost because of user-supplied filtering (e.g. mapqFilter=10). CHANGES IN VERSION 1.12.0 ------------------------- NEW FEATURES o seqlevels() setter now supports "fine" and "tidy" pruning modes on GAlignmentsList objects (in addition to "coarse" mode, which is the default). o Add "pcompare", "is.unsorted", "order", "sort", and "rank" methods for GAlignments objects. o Add encodingHalves(), a low-level overlap encoding utility. SIGNIFICANT USER-VISIBLE CHANGES o Tweak behavior of isCompatibleWithSplicing() on paired-end encodings. o Minor tweaks to low-level encoding utilities Lencoding(), Rencoding(), Lnjunc(), Rnjunc(), and njunc(). All of them now are based on new encodingHalves() low level utility. o Speed up first() and last() on GAlignmentPairs object when the object has no names. Thanks to Pete Hickey for the suggestion. o 2x to 3x speedup to "junctions" methods. DEPRECATED AND DEFUNCT o Argument 'force' of seqinfo() and seqlevels() setters is deprecated in favor of new and more flexible 'pruning.mode' argument. BUG FIXES o Make grglist() work on GAlignmentPairs object with strandMode set to 0. Thanks to Dario Strbenac for catching and reporting this. o Fix bug affecting extractSteppedExonRanks() on certain paired-end encodings. o Fix subsetting of OverlapEncodings objects and modernize their "show" method. CHANGES IN VERSION 1.10.0 ------------------------- NEW FEATURES o The GAlignmentPairs container now supports pairs with discordant strand and/or seqnames. The "granges" and "ranges" methods for GAlignmentPairs objects get new argument 'on.discordant.seqnames' to let the user control how to handle pairs with discordant seqnames. See ?GAlignmentPairs for more information. o Add "invertStrand" method for GAlignmentPairs objects. o Add 'use.names' argument to the "ranges", "granges", "grglist" and "rglist" methods for GAlignments and GAlignmentsList objects. o Add 'use.names' argument to the "granges" and "grglist" methods for GAlignmentPairs objects. o Add "ranges" method for GAlignmentPairs objects. SIGNIFICANT USER-VISIBLE CHANGES o The 'at' argument of pileLettersAt() is now expected to be a GPos object (GRanges still accepted). o 50x speed-up of the granges() extractor for GAlignmentPairs object. The improvement is based on a suggestion by Arne Muller. DEPRECATED AND DEFUNCT o Remove left() and right() generics and methods (were defunct in BioC 3.3). o Remove 'invert.strand' argument from "first" and "last" methods for GAlignmentPairs objects (was defunct in BioC 3.3). o Remove strand() setter for GAlignmentPairs objects (was defunct in BioC 3.3). o Remove 'order.as.in.query' argument from "grglist" method for GAlignmentPairs objects and from "grglist" and "rglist" methods for GAlignmentsList objects (was defunct in BioC 3.3). BUG FIXES o Fix 'use.names=FALSE' in "grglist" and "rglist" methods for GAlignmentsList objects. CHANGES IN VERSION 1.8.0 ------------------------ NEW FEATURES o Add coercion from GAlignments or GAlignmentPairs to DataFrame, and from GAlignmentsList to GAlignmentPairs. SIGNIFICANT USER-VISIBLE CHANGES o Use DESeq2 instead of DESeq in summarizeOverlaps examples (better late than never). DEPRECATED AND DEFUNCT o After being deprecated in BioC 3.2, the left() and right() getters and strand() setter for GAlignmentPairs objects are now defunct. o After being deprecated in BioC 3.2, the 'invert.strand' argument of the first() and last() getters for GAlignmentPairs objects are now defunct. o After being deprecated in BioC 3.2, the 'order.as.in.query' argument of the "grglist" method for GAlignmentPairs objects is now defunct. o After being deprecated in BioC 3.2, the 'order.as.in.query' argument of the "rglist" and "grglist" methods for GAlignmentsList objects are now defunct. o Remove the "mapCoords" and "pmapCoords" methods (were defunct in BioC 3.2). o Remove the readGAlignment*FromBam() functions (were defunct in BioC 3.2). BUG FIXES o seqnames() setter for GAlignments objects is now consistent with seqnames() setter for GRanges objects. CHANGES IN VERSION 1.6.0 ------------------------ NEW FEATURES o Add strandMode() getter and setter for GAlignmentPairs objects in response to the following post: https://support.bioconductor.org/p/65844/ See ?strandMode for more information. o The readGAlignment*() functions now allow repeated seqnames in the BAM header. o Add "coverage" method for GAlignmentsList objects. o The strand setter now works on a GAlignmentsList object in a restricted way (only strand(x) <- "+" or "-" or "*" is supported). SIGNIFICANT USER-VISIBLE CHANGES o summarizeOverlaps() now returns a RangedSummarizedExperiment object (defined in the new SummarizedExperiment package) instead of an "old" SummarizedExperiment object (defined in the GenomicRanges package). o Slightly modify the behavior of junctions() on a GAlignmentPairs object so that the returned ranges now have the "real strand" set on them. See ?junctions and the documentation of the 'real.strand' argument in the man page of GAlignmentPairs objects for more information. o Add 'real.strand' argument to first() and last() getters for GAlignmentPairs objects. DEPRECATED AND DEFUNCT o Deprecate left() and right() getters and strand() setter for GAlignmentPairs objects. o Deprecate 'invert.strand' argument of first() and last() getters for GAlignmentPairs objects. o Deprecate 'order.as.in.query' argument of "grglist" method for GAlignmentPairs objects. o Deprecate 'order.as.in.query' argument in "rglist" method for GAlignmentsList objects (this concept is not defined for these objects in general and the argument was ignored anyway). o After being deprecated in BioC 3.1, the "mapCoords" and "pmapCoords" methods are now defunct. mapToAlignments() should be used instead. o After being deprecated in BioC 3.1, the readGAlignment*FromBam() functions are now defunct. Everybody says "Let's all use the readGAlignment*() functions instead! (no FromBam suffix). Yeah!" BUG FIXES o Various fixes to grglist/granges/rglist/ranges methods for GAlignmentsList objects: - Respect cigar information (as claimed in man page). - Restore 'drop.D.ranges' argument in "grglist" method (mistakenly got deprecated at the beginning of BioC 3.2 devel cycle). - The 'drop.D.ranges' argument in "rglist" method now works (was ignored). - Handle empty list elements. CHANGES IN VERSION 1.4.0 ------------------------ NEW FEATURES o All "findOverlaps" methods now support 'select' equal "last" or "arbitrary" (in addition to "all" and "first"). SIGNIFICANT USER-VISIBLE CHANGES o Add mapToAlignments(), pmapToAlignments(), mapFromAlignments(), and pmapFromAlignments() as replacements for the "mapCoords" and "pmapCoords" methods for GAlignments objects. o Clarify use of 'fragments' in summarizeOverlaps() man page. o Tweak "show" method for GAlignments objects to display a shorter version of long CIGARs. o Add checks and more helpful error message for summarizeOverlaps() when "file does not exist" DEPRECATED AND DEFUNCT o Deprecated readGAlignment*FromBam() functions in favor of readGAlignments(), readGAlignmentPairs(), readGAlignmentsList() and readGappedReads(). o Deprecated "mapCoords" and "pmapCoords" methods. o Removed Lngap(), Rngap(), introns(), and makeGAlignmentsListFromFeatureFragments() functions, and "ngap", "map", "pmap", and "splitAsListReturnedClass" methods (were defunct in GenomicAlignments 1.2.0). BUG FIXES o Fix off-by-one error when processing 'S' in query_locs_to_ref_locs(). CHANGES IN VERSION 1.2.0 ------------------------ NEW FEATURES o Add 'preprocess.reads' argument to "summarizeOverlaps" methods. o Add alphabetFrequencyFromBam(). SIGNIFICANT USER-VISIBLE CHANGES o Export GappedReads() constructor. o coverage,Bamfile-method now returns empty RleList rather than NULL o Add "mapCoords" and "pmapCoords" methods. o Defunct "map" and "pmap" methods (skip deprecation). BUG FIXES o Bug fix in flipQuery(). o Fix issue with "show" method for GAlignments and GAlignmentPairs objects when 'showHeadLines' global option is set to Inf. CHANGES IN VERSION 1.0.0 ------------------------ The first version of GenomicAlignments was included in Bioconductor 2.14. The package was created from existing code in IRanges, ShortRead, Rsamtools and GenomicRanges. NEW FEATURES o coverage,BamFile-method uses \code{yieldSize} to iterate through large files o coverage,character-method calculates coverage from a BAM file GenomicAlignments/R/0000755000175200017520000000000014551551747015416 5ustar00biocbuildbiocbuildGenomicAlignments/R/GAlignmentPairs-class.R0000644000175200017520000006132614516004601021657 0ustar00biocbuildbiocbuild### ========================================================================= ### GAlignmentPairs objects ### ------------------------------------------------------------------------- ### ### "first" and "last" GAlignments must have identical seqinfo. setClass("GAlignmentPairs", contains="List", representation( strandMode="integer", # single integer (0L, 1L, or 2L) first="GAlignments", # of length N, no names, no elt metadata last="GAlignments", # of length N, no names, no elt metadata isProperPair="logical", # of length N NAMES="character_OR_NULL", # R doesn't like @names !! elementMetadata="DataFrame" # N rows ), prototype( strandMode=1L, elementType="GAlignments" ) ) ### Combine the new "parallel slots" with those of the parent class. Make ### sure to put the new parallel slots **first**. See R/Vector-class.R file ### in the S4Vectors package for what slots should or should not be considered ### "parallel". setMethod("parallel_slot_names", "GAlignmentPairs", function(x) c("first", "last", "isProperPair", "NAMES", callNextMethod()) ) ### Formal API: ### strandMode(x) - indicates how to infer the strand of a pair from the ### strand of the first and last alignments in the pair: ### 0: strand of the pair is always *; ### 1: strand of the pair is strand of its first alignment; ### 2: strand of the pair is strand of its last alignment. ### These modes are equivalent to 'strandSpecific' equal 0, 1, ### and 2, respectively, for the featureCounts() function ### defined in the Rsubread package. ### length(x) - single integer N. Nb of pairs in 'x'. ### names(x) - NULL or character vector. ### first(x) - returns "first" slot. ### last(x) - returns "last" slot. ### seqnames(x) - same as 'seqnames(first(x))' or 'seqnames(last(x))'. ### strand(x) - obeys strandMode(x) (see above). ### njunc(x) - same as 'njunc(first(x)) + njunc(last(x))'. ### isProperPair(x) - returns "isProperPair" slot. ### seqinfo(x) - returns 'seqinfo(first(x))' (same as 'seqinfo(last(x))'). ### granges(x) - GRanges object of the same length as 'x'. ### grglist(x) - GRangesList object of the same length as 'x'. ### show(x) - compact display in a data.frame-like fashion. ### GAlignmentPairs(x) - constructor. ### x[i] - GAlignmentPairs object of the same class as 'x' ### (endomorphism). ### setGeneric("strandMode", function(x) standardGeneric("strandMode")) setGeneric("strandMode<-", signature="x", function(x, value) standardGeneric("strandMode<-") ) setGeneric("isProperPair", function(x) standardGeneric("isProperPair")) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### updateObject() ### setMethod("updateObject", "GAlignmentPairs", function(object, ..., verbose=FALSE) { object@first <- updateObject(object@first, ..., verbose=verbose) object@last <- updateObject(object@last, ..., verbose=verbose) callNextMethod() } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters. ### setMethod("strandMode", "GAlignmentPairs", function(x) x@strandMode ) setMethod("names", "GAlignmentPairs", function(x) x@NAMES ) .make_it_real <- function(strand, strand_mode) { if (strand_mode == 0L) return(Rle(strand("*"), length(strand))) invertStrand(strand) } .first_strand <- function(x, real.strand=FALSE) { if (!isTRUEorFALSE(real.strand)) stop("'real.strand' must be TRUE or FALSE") ans <- strand(x@first) if (real.strand && strandMode(x) != 1L) ans <- .make_it_real(ans, strandMode(x)) ans } .last_strand <- function(x, real.strand=FALSE) { if (!isTRUEorFALSE(real.strand)) stop("'real.strand' must be TRUE or FALSE") ans <- strand(x@last) if (real.strand && strandMode(x) != 2L) ans <- .make_it_real(ans, strandMode(x)) ans } setMethod("first", "GAlignmentPairs", function(x, real.strand=FALSE) { if (!isTRUEorFALSE(real.strand)) stop("'real.strand' must be TRUE or FALSE") ans <- x@first x_names <- names(x) if (!is.null(x_names)) ans <- setNames(ans, x_names) if (real.strand && strandMode(x) != 1L) strand(ans) <- .first_strand(x, real.strand=TRUE) ans } ) setGeneric("last", function(x, ...) standardGeneric("last")) setMethod("last", "GAlignmentPairs", function(x, ...) second(x, ...)) setMethod("second", "GAlignmentPairs", function(x, real.strand=FALSE) { if (!isTRUEorFALSE(real.strand)) stop("'real.strand' must be TRUE or FALSE") ans <- x@last x_names <- names(x) if (!is.null(x_names)) ans <- setNames(ans, x_names) if (real.strand && strandMode(x) != 2L) strand(ans) <- .last_strand(x, real.strand=TRUE) ans } ) setMethod("seqnames", "GAlignmentPairs", function(x) { ans <- seqnames(x@first) ans[seqnames(x@last) != ans] <- NA ans } ) setMethod("strand", "GAlignmentPairs", function(x) { ans <- .first_strand(x, real.strand=TRUE) x_last_strand <- .last_strand(x, real.strand=TRUE) ans[ans != x_last_strand] <- "*" ans } ) setMethod("njunc", "GAlignmentPairs", function(x) {njunc(x@first) + njunc(x@last)} ) setMethod("isProperPair", "GAlignmentPairs", function(x) x@isProperPair ) setMethod("seqinfo", "GAlignmentPairs", function(x) seqinfo(x@first) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Setters. ### .normarg_strandMode_replace_value <- function(value) { if (!isSingleNumber(value)) stop("invalid strand mode (must be 0, 1, or 2)") if (!is.integer(value)) value <- as.integer(value) if (!(value %in% 0:2)) stop("invalid strand mode (must be 0, 1, or 2)") value } setReplaceMethod("strandMode", "GAlignmentPairs", function(x, value) { x@strandMode <- .normarg_strandMode_replace_value(value) x } ) setMethod("invertStrand", "GAlignmentPairs", function(x) { strand_mode <- strandMode(x) if (strand_mode != 0L) strandMode(x) <- 3L - strand_mode x } ) setReplaceMethod("names", "GAlignmentPairs", function(x, value) { if (!is.null(value)) value <- as.character(value) x@NAMES <- value validObject(x) x } ) setMethod("seqlevelsInUse", "GAlignmentPairs", function(x) { in_use1 <- seqlevelsInUse(x@first) in_use2 <- seqlevelsInUse(x@last) ## We cannot just do union() because we want the returned levels ## to be in the order they appear in 'seqlevels(x)'. intersect(seqlevels(x), union(in_use1, in_use2)) } ) setReplaceMethod("seqinfo", "GAlignmentPairs", function(x, new2old=NULL, pruning.mode=c("error", "coarse", "fine", "tidy"), value) { if (!is(value, "Seqinfo")) stop("the supplied 'seqinfo' must be a Seqinfo object") dangling_seqlevels <- GenomeInfoDb:::getDanglingSeqlevels(x, new2old=new2old, pruning.mode=pruning.mode, seqlevels(value)) if (length(dangling_seqlevels) != 0L) { dropme_in_first <- seqnames(x@first) %in% dangling_seqlevels dropme_in_last <- seqnames(x@last) %in% dangling_seqlevels dropme <- dropme_in_first | dropme_in_last x <- x[!dropme] } seqinfo(x@first, new2old=new2old) <- value seqinfo(x@last, new2old=new2old) <- value x } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.GAlignmentPairs.strandMode <- function(x) { if (!(isSingleInteger(x@strandMode) && x@strandMode %in% 0:2)) return("'x@strandMode' must be 0L, 1L, or 2L") NULL } .valid.GAlignmentPairs.isProperPair <- function(x) { x_isProperPair <- x@isProperPair if (!is.logical(x_isProperPair) || !is.null(attributes(x_isProperPair))) { msg <- c("'x@isProperPair' must be a logical vector ", "with no attributes") return(paste(msg, collapse="")) } if (S4Vectors:::anyMissing(x_isProperPair)) return("'x@isProperPair' cannot contain NAs") NULL } .valid.GAlignmentPairs.seqinfo <- function(x) { if (!identical(seqinfo(x@first), seqinfo(x@last))) return("'seqinfo(x@first)' and 'seqinfo(x@last)' must be identical") NULL } .valid.GAlignmentPairs <- function(x) { c(.valid.GAlignmentPairs.strandMode(x), .valid.GAlignmentPairs.isProperPair(x), .valid.GAlignmentPairs.seqinfo(x)) } setValidity2("GAlignmentPairs", .valid.GAlignmentPairs, where=asNamespace("GenomicAlignments")) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructor. ### GAlignmentPairs <- function(first, last, strandMode=1L, isProperPair=TRUE, names=NULL) { if (!(is(first, "GAlignments") && is(last, "GAlignments"))) stop("'first' and 'last' must be GAlignments objects") if (length(first) != length(last)) stop("'first' and 'last' must have the same length") strandMode <- .normarg_strandMode_replace_value(strandMode) if (identical(isProperPair, TRUE)) isProperPair <- rep.int(isProperPair, length(first)) new2("GAlignmentPairs", strandMode=strandMode, NAMES=names, first=first, last=last, isProperPair=isProperPair, elementMetadata=S4Vectors:::make_zero_col_DataFrame(length(first)), check=TRUE) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### List methods. ### ### TODO: Remove the "[[" method below after the definition of the ### GAlignmentPairs class is changed to derive from CompressedList. ### (The "[[" method for CompressedList objects should do just fine i.e. it ### should do something like x@unlistData[x@partitioning[[i]]] and that ### should be optimal.) .GAlignmentPairs.getElement <- function(x, i) { c(x@first[i], x@last[i]) } setMethod("[[", "GAlignmentPairs", function(x, i, j, ... , drop=TRUE) { if (missing(i) || !missing(j) || length(list(...)) > 0L) stop("invalid subsetting") i <- normalizeDoubleBracketSubscript(i, x) .GAlignmentPairs.getElement(x, i) } ) ### TODO: Remove this method after the definition of the GAlignmentPairs ### class is changed to derive from CompressedList. setMethod("unlist", "GAlignmentPairs", function(x, recursive=TRUE, use.names=TRUE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") x_first <- x@first x_last <- x@last collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(x)) ans <- c(x_first, x_last)[collate_subscript] if (use.names) names(ans) <- rep(names(x), each=2L) ans } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### ### 'caller' must be "ranges" or "granges". .error_on_discordant_seqnames <- function(caller) { if (caller == "ranges") { range_type <- "range" returned_object <- "IRanges" a_returned_object <- "an IRanges" alternate_caller <- "rglist" alternate_returned_object <- "an IRangesList" } else { range_type <- "genomic range" returned_object <- "GRanges" a_returned_object <- "a GRanges" alternate_caller <- "grglist" alternate_returned_object <- "a GRangesList" } wmsg( "For some pairs in 'x', the 2 alignments are not on the same ", "chromosome. Cannot associate a unique ", range_type, " to ", "such pairs. Please call ", caller, "() with ", "'on.discordant.seqnames=\"drop\"' to drop these pairs, ", "or with 'on.discordant.seqnames=\"split\"' to represent ", "each of them with 2 ", range_type, "s in the returned ", returned_object, " object. Note that in both cases the returned ", "object won't be parallel to 'x'. Alternatively, please ", "consider using ", alternate_caller, "() instead of ", caller, "() ", "to turn 'x' into ", alternate_returned_object, " object instead of ", a_returned_object, " object. See ?GAlignmentPairs for more ", "information." ) } .make_split_IRanges_from_GAlignmentPairs <- function(x, use.names=TRUE, use.mcols=FALSE) { x_first_ranges <- ranges(x@first, use.names=FALSE) x_last_ranges <- ranges(x@last, use.names=FALSE) x_len <- length(x) collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(x_len) partitioning <- PartitioningByEnd(2L * seq_len(x_len)) range_pairs <- relist(c(x_first_ranges, x_last_ranges)[collate_subscript], partitioning) x_first_seqnames <- seqnames(x@first) x_last_seqnames <- seqnames(x@last) merge_idx <- x_first_seqnames == x_last_seqnames range_pairs[merge_idx] <- range(range_pairs[merge_idx]) if (use.names) names(range_pairs) <- names(x) ans <- unlist(range_pairs, use.names=use.names) if (use.mcols) { i <- rep.int(seq_len(x_len), elementNROWS(range_pairs)) mcols(ans) <- extractROWS(mcols(x, use.names=FALSE), i) } ans } setMethod("ranges", "GAlignmentPairs", function(x, use.names=TRUE, use.mcols=FALSE, on.discordant.seqnames=c("error", "drop", "split")) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") on.discordant.seqnames <- match.arg(on.discordant.seqnames) ans_seqnames <- seqnames(x) is_discordant <- is.na(ans_seqnames) if (any(is_discordant)) { if (on.discordant.seqnames == "error") stop(.error_on_discordant_seqnames("ranges")) if (on.discordant.seqnames == "split") return(.make_split_IRanges_from_GAlignmentPairs(x, use.names=use.names, use.mcols=use.mcols)) ## on.discordant.seqnames == "drop" x <- x[!is_discordant] } x_first_ranges <- ranges(x@first, use.names=FALSE) x_last_ranges <- ranges(x@last, use.names=FALSE) ans <- punion(x_first_ranges, x_last_ranges, fill.gap=TRUE) if (use.names) names(ans) <- names(x) if (use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) .make_split_GRanges_from_GAlignmentPairs <- function(x, use.names=TRUE, use.mcols=FALSE) { x_first_seqnames <- seqnames(x@first) x_last_seqnames <- seqnames(x@last) is_discordant <- x_first_seqnames != x_last_seqnames ndiscordant <- sum(is_discordant) collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(ndiscordant) partitioning <- PartitioningByEnd(2L * seq_len(ndiscordant)) seqnames1 <- x_first_seqnames[is_discordant] seqnames2 <- x_last_seqnames[is_discordant] discordant_seqnames <- relist(c(seqnames1, seqnames2)[collate_subscript], partitioning) ans_seqnames <- as(x_first_seqnames, "List") ans_seqnames[is_discordant] <- discordant_seqnames ans_ranges <- .make_split_IRanges_from_GAlignmentPairs(x, use.names=use.names, use.mcols=use.mcols) strand1 <- .first_strand(x, real.strand=TRUE)[is_discordant] strand2 <- .last_strand(x, real.strand=TRUE)[is_discordant] discordant_strand <- relist(c(strand1, strand2)[collate_subscript], partitioning) ans_strand <- as(strand(x), "List") ans_strand[is_discordant] <- discordant_strand GRanges(unlist(ans_seqnames, use.names=FALSE), ans_ranges, unlist(ans_strand, use.names=FALSE), seqinfo=seqinfo(x)) } setMethod("granges", "GAlignmentPairs", function(x, use.names=TRUE, use.mcols=FALSE, on.discordant.seqnames=c("error", "drop", "split")) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") on.discordant.seqnames <- match.arg(on.discordant.seqnames) ans_seqnames <- seqnames(x) is_discordant <- is.na(ans_seqnames) if (any(is_discordant)) { if (on.discordant.seqnames == "error") stop(.error_on_discordant_seqnames("granges")) if (on.discordant.seqnames == "split") return(.make_split_GRanges_from_GAlignmentPairs(x, use.names=use.names, use.mcols=use.mcols)) ## on.discordant.seqnames == "drop" x <- x[!is_discordant] ans_seqnames <- seqnames(x) } ans <- GRanges(ans_seqnames, ranges(x, use.names=use.names), strand(x), seqinfo=seqinfo(x)) if (use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) ### Shrink CompressedList 'x' (typically a GRangesList) by half by combining ### pairs of consecutive top-level elements. shrinkByHalf <- function(x) { if (length(x) %% 2L != 0L) stop("'x' must have an even length") x_eltNROWS <- elementNROWS(x) if (length(x_eltNROWS) == 0L) { ans_nelt1 <- ans_nelt2 <- integer(0) } else { ans_nelt1 <- x_eltNROWS[c(TRUE, FALSE)] ans_nelt2 <- x_eltNROWS[c(FALSE, TRUE)] } ans_eltNROWS <- ans_nelt1 + ans_nelt2 ans_partitioning <- PartitioningByEnd(cumsum(ans_eltNROWS)) ans <- relist(x@unlistData, ans_partitioning) mcols(ans) <- DataFrame(nelt1=ans_nelt1, nelt2=ans_nelt2) ans } setMethod("grglist", "GAlignmentPairs", function(x, use.names=TRUE, use.mcols=FALSE, drop.D.ranges=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") x_mcols <- mcols(x, use.names=FALSE) if (use.mcols && "query.break" %in% colnames(x_mcols)) stop("'mcols(x)' cannot have reserved column \"query.break\"") x_first <- x@first x_last <- x@last if (strandMode(x) == 0L) { x_first <- unstrand(x_first) x_last <- unstrand(x_last) x_unlisted <- c(x_first, x_last) } else if (strandMode(x) == 1L) { x_last <- invertStrand(x@last) x_unlisted <- c(x_first, x_last) } else if (strandMode(x) == 2L) { x_first <- invertStrand(x@first) x_unlisted <- c(x_last, x_first) } else { ## Should never happen. stop("unsupported strandMode: ", strandMode(x)) } ## Not the same as doing 'unlist(x, use.names=FALSE)'. collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(x)) x_unlisted <- x_unlisted[collate_subscript] grl <- grglist(x_unlisted, order.as.in.query=TRUE, drop.D.ranges=drop.D.ranges) ans <- shrinkByHalf(grl) if (use.names) names(ans) <- names(x) ans_mcols <- DataFrame(query.break=mcols(ans, use.names=FALSE)$nelt1) if (use.mcols) ans_mcols <- cbind(ans_mcols, x_mcols) mcols(ans) <- ans_mcols ans } ) setAs("GAlignmentPairs", "IntegerRanges", function(from) ranges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentPairs", "GRanges", function(from) granges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentPairs", "GRangesList", function(from) grglist(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentPairs", "GAlignments", function(from) unlist(from, use.names=TRUE) ) setAs("GAlignmentPairs", "DataFrame", function(from) { firstDF <- as(first(from), "DataFrame") colnames(firstDF) <- paste0(colnames(firstDF), ".first") lastDF <- as(last(from), "DataFrame") colnames(lastDF) <- paste0(colnames(lastDF), ".last") DataFrame(firstDF, lastDF, mcols(from, use.names=FALSE)) }) setMethod("as.data.frame", "GAlignmentPairs", function(x, row.names = NULL, optional = FALSE) { as.data.frame(as(x, "DataFrame"), row.names=row.names, optional=optional) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### fillJunctionGaps() ### ### Not exported. Used in the SplicingGraphs package. ### fillJunctionGaps <- function(x) { if (!is(x, "GRangesList")) stop("'x' must be a GRangesList object") query.breaks <- mcols(x, use.names=FALSE)$query.break if (is.null(query.breaks)) stop("'x' must be a GRangesList object with a \"query.breaks\" ", "metadata column") idx <- sequence(query.breaks, from=start(x@partitioning)) half1_partitioning <- PartitioningByEnd(cumsum(query.breaks)) half1 <- relist(x@unlistData[idx], half1_partitioning) half1 <- range(half1)@unlistData half2_eltNROWS <- elementNROWS(x) - query.breaks half2_partitioning <- PartitioningByEnd(cumsum(half2_eltNROWS)) half2 <- relist(x@unlistData[-idx], half2_partitioning) half2 <- range(half2)@unlistData collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(x)) ans_unlistData <- c(half1, half2)[collate_subscript] ans_partitioning <- PartitioningByEnd(2L * seq_along(x), names=names(x)) relist(ans_unlistData, ans_partitioning) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### "show" method. ### .makeNakedMatFromGAlignmentPairs <- function(x) { lx <- length(x) nc <- ncol(mcols(x, use.names=FALSE)) pair_cols <- cbind(seqnames=as.character(seqnames(x)), strand=as.character(strand(x))) x_first <- x@first first_cols <- cbind(ranges=showAsCell(ranges(x_first))) x_last <- x@last last_cols <- cbind(ranges=showAsCell(ranges(x_last))) ans <- cbind(pair_cols, `:`=rep.int(":", lx), first_cols, `--`=rep.int("--", lx), last_cols) if (nc > 0L) { tmp <- do.call(data.frame, lapply(mcols(x, use.names=FALSE), showAsCell)) ans <- cbind(ans, `|`=rep.int("|", lx), as.matrix(tmp)) } ans } showGAlignmentPairs <- function(x, margin="", print.classinfo=FALSE, print.seqinfo=FALSE) { lx <- length(x) nc <- ncol(mcols(x, use.names=FALSE)) cat(class(x), " object with ", lx, " ", ifelse(lx == 1L, "pair", "pairs"), ", strandMode=", strandMode(x), ", and ", nc, " metadata ", ifelse(nc == 1L, "column", "columns"), ":\n", sep="") out <- S4Vectors:::makePrettyMatrixForCompactPrinting(x, .makeNakedMatFromGAlignmentPairs) if (print.classinfo) { .PAIR_COL2CLASS <- c( seqnames="Rle", strand="Rle" ) .HALVES_COL2CLASS <- c( ranges="IRanges" ) .COL2CLASS <- c(.PAIR_COL2CLASS, ":", .HALVES_COL2CLASS, "--", .HALVES_COL2CLASS) classinfo <- S4Vectors:::makeClassinfoRowForCompactPrinting(x, .COL2CLASS) ## A sanity check, but this should never happen! stopifnot(identical(colnames(classinfo), colnames(out))) out <- rbind(classinfo, out) } if (nrow(out) != 0L) rownames(out) <- paste0(margin, rownames(out)) ## We set 'max' to 'length(out)' to avoid the getOption("max.print") ## limit that would typically be reached when 'showHeadLines' global ## option is set to Inf. print(out, quote=FALSE, right=TRUE, max=length(out)) if (print.seqinfo) { cat(margin, "-------\n", sep="") cat(margin, "seqinfo: ", summary(seqinfo(x)), "\n", sep="") } } setMethod("show", "GAlignmentPairs", function(object) showGAlignmentPairs(object, margin=" ", print.classinfo=TRUE, print.seqinfo=TRUE) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Concatenation ### setMethod("bindROWS", "GAlignmentPairs", GenomicRanges:::concatenate_GenomicRanges_objects ) GenomicAlignments/R/GAlignments-class.R0000644000175200017520000005167714516004601021053 0ustar00biocbuildbiocbuild### ========================================================================= ### GAlignments objects ### ------------------------------------------------------------------------- ### setClass("GAlignments", contains="Ranges", representation( seqnames="Rle", # 'factor' Rle start="integer", # POS field in SAM cigar="character", # extended CIGAR (see SAM format specs) strand="Rle", # 'factor' Rle #mismatches="character_OR_NULL", # see MD optional field in SAM format #specs NAMES="character_OR_NULL", # R doesn't like @names !! elementMetadata="DataFrame", seqinfo="Seqinfo" ), prototype( seqnames=Rle(factor()), strand=Rle(strand()), elementMetadata=new("DFrame") ) ) ### Combine the new "parallel slots" with those of the parent class. Make ### sure to put the new parallel slots **first**. See R/Vector-class.R file ### in the S4Vectors package for what slots should or should not be considered ### "parallel". setMethod("parallel_slot_names", "GAlignments", function(x) c("seqnames", "start", "cigar", "strand", "NAMES", callNextMethod()) ) ### Formal API: ### names(x) - NULL or character vector. ### length(x) - single integer. Nb of alignments in 'x'. ### seqnames(x) - 'factor' Rle of the same length as 'x'. ### rname(x) - same as 'seqnames(x)'. ### seqnames(x) <- value - replacement form of 'seqnames(x)'. ### rname(x) <- value - same as 'seqnames(x) <- value'. ### cigar(x) - character vector of the same length as 'x'. ### strand(x) - 'factor' Rle of the same length as 'x' (levels: +, -, *). ### qwidth(x) - integer vector of the same length as 'x'. ### start(x), end(x), width(x) - integer vectors of the same length as 'x'. ### njunc(x) - integer vector of the same length as 'x'. ### grglist(x) - GRangesList object of the same length as 'x'. ### granges(x) - GRanges object of the same length as 'x'. ### rglist(x) - CompressedIRangesList object of the same length as 'x'. ### ranges(x) - IRanges object of the same length as 'x'. ### as.data.frame(x) - data.frame with 1 row per alignment in 'x'. ### show(x) - compact display in a data.frame-like fashion. ### GAlignments(x) - constructor. ### x[i] - GAlignments object of the same class as 'x' (endomorphism). ### ### qnarrow(x, start=NA, end=NA, width=NA) - GAlignments object of the ### same length and class as 'x' (endomorphism). ### ### narrow(x, start=NA, end=NA, width=NA) - GAlignments object of the ### same length and class as 'x' (endomorphism). ### ### findOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. Just a convenient wrapper for ### 'findOverlaps(grglist(query), subject, ...)', etc... ### ### countOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. Just a convenient wrapper for ### 'countOverlaps(grglist(query), subject, ...)', etc... ### ### subsetByOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. ### setGeneric("rname", function(x) standardGeneric("rname")) setGeneric("rname<-", function(x, value) standardGeneric("rname<-")) setGeneric("cigar", function(x) standardGeneric("cigar")) setGeneric("qwidth", function(x) standardGeneric("qwidth")) setGeneric("njunc", function(x) standardGeneric("njunc")) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### updateObject() ### ### Internal representation of GAlignments objects has changed in ### GenomicAlignments 1.15.11 (Bioc 3.7). ### .get_GAlignments_version <- function(object) { if (.hasSlot(object, "elementType")) "current" else "< 1.15.11" } setMethod("updateObject", "GAlignments", function(object, ..., verbose=FALSE) { ## elementType slot. version <- .get_GAlignments_version(object) if (version == "current") { if (verbose) message("[updateObject] Internal representation of ", class(object), " object is current.\n", "[updateObject] Nothing to update.") } else { if (verbose) message("[updateObject] ", class(object), " object uses ", "internal representation from\n", "[updateObject] GenomicAlignments ", version, ". ", "Updating it ...") object@elementType <- new(class(object))@elementType } callNextMethod() } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters. ### setMethod("names", "GAlignments", function(x) x@NAMES) setMethod("seqnames", "GAlignments", function(x) x@seqnames) setMethod("rname", "GAlignments", function(x) seqnames(x)) setMethod("cigar", "GAlignments", function(x) x@cigar) setMethod("width", "GAlignments", function(x) cigarWidthAlongReferenceSpace(x@cigar) ) setMethod("start", "GAlignments", function(x, ...) x@start) setMethod("strand", "GAlignments", function(x) x@strand) setMethod("qwidth", "GAlignments", function(x) cigarWidthAlongQuerySpace(x@cigar) ) setMethod("njunc", "GAlignments", function(x) {unname(elementNROWS(rglist(x))) - 1L} ) setMethod("seqinfo", "GAlignments", function(x) x@seqinfo) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Setters. ### setReplaceMethod("names", "GAlignments", function(x, value) { if (!is.null(value)) value <- as.character(value) x@NAMES <- value validObject(x) x } ) setReplaceMethod("seqnames", "GAlignments", function(x, value) { value <- GenomicRanges:::.normalize_seqnames_replacement_value(value, x) BiocGenerics:::replaceSlots(x, seqnames=value) } ) setReplaceMethod("rname", "GAlignments", function(x, value) `seqnames<-`(x, value) ) setReplaceMethod("strand", "GAlignments", function(x, value) { x@strand <- GenomicRanges:::normalize_strand_replacement_value(value, x) x } ) ### Does NOT suppoprt pruning mode "fine". Pruning modes "coarse" and "tidy" ### are equivalent on a GAlignments object. ### FIXME: This repeats most of the code in ### GenomicRanges:::set_GenomicRanges_seqinfo! set_GAlignments_seqinfo <- function(x, new2old=NULL, pruning.mode=c("error", "coarse", "fine", "tidy"), value) { pruning.mode <- match.arg(pruning.mode) if (pruning.mode == "fine") stop(wmsg("\"fine\" pruning mode not supported on ", class(x), " objects")) if (!is(value, "Seqinfo")) stop("the supplied 'seqinfo' must be a Seqinfo object") dangling_seqlevels <- GenomeInfoDb:::getDanglingSeqlevels(x, new2old=new2old, pruning.mode=pruning.mode, seqlevels(value)) if (length(dangling_seqlevels) != 0L) { ## Prune 'x'. non_dangling_range <- !(seqnames(x) %in% dangling_seqlevels) x <- x[non_dangling_range] } old_seqinfo <- seqinfo(x) x@seqnames <- GenomeInfoDb:::makeNewSeqnames(x, new2old, seqlevels(value)) x@seqinfo <- value geom_has_changed <- GenomeInfoDb:::sequenceGeometryHasChanged( seqinfo(x), old_seqinfo, new2old=new2old) if (any(geom_has_changed, na.rm=TRUE)) validObject(x) x } setReplaceMethod("seqinfo", "GAlignments", set_GAlignments_seqinfo) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.GAlignments.start <- function(x) { x_start <- start(x) if (!is.integer(x_start) || !is.null(names(x_start)) || S4Vectors:::anyMissing(x_start)) return("'start(x)' must be an unnamed integer vector with no NAs") NULL } .valid.GAlignments.cigar <- function(x) { x_cigar <- cigar(x) if (!is.character(x_cigar) || !is.null(names(x_cigar)) || any(is.na(x_cigar))) return("'cigar(x)' must be an unnamed character vector with no NAs") tmp <- validCigar(x_cigar) if (!is.null(tmp)) return(paste("in 'cigar(x)':", tmp)) NULL } .valid.GAlignments.strand <- function(x) { x_strand <- strand(x) if (!is(x_strand, "Rle") || !is.factor(runValue(x_strand)) || !identical(levels(runValue(x_strand)), levels(strand())) || !is.null(names(x_strand)) || any(is.na(x_strand))) return("'strand(x)' must be an unnamed 'factor' Rle with no NAs (and with levels +, - and *)") NULL } .valid.GAlignments <- function(x) { c(GenomicRanges:::.valid.GenomicRanges.seqnames(x), .valid.GAlignments.start(x), .valid.GAlignments.cigar(x), .valid.GAlignments.strand(x), GenomicRanges:::valid.GenomicRanges.seqinfo(x)) } setValidity2("GAlignments", .valid.GAlignments, where=asNamespace("GenomicAlignments")) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructor. ### .asFactorRle <- function(x) { if (is.character(x)) { x <- Rle(as.factor(x)) } else if (is.factor(x)) { x <- Rle(x) } else if (is(x, "Rle") && is.character(runValue(x))) { runValue(x) <- as.factor(runValue(x)) } else if (!is(x, "Rle") || !is.factor(runValue(x))) { stop("'x' must be a character vector, a factor, ", "a 'character' Rle, or a 'factor' Rle") } x } GAlignments <- function(seqnames=Rle(factor()), pos=integer(0), cigar=character(0), strand=NULL, names=NULL, seqlengths=NULL, ...) { ## Prepare the 'seqnames' slot. seqnames <- .asFactorRle(seqnames) if (any(is.na(seqnames))) stop("'seqnames' cannot have NAs") ## Prepare the 'pos' slot. if (!is.integer(pos) || any(is.na(pos))) stop("'pos' must be an integer vector with no NAs") ## Prepare the 'cigar' slot. if (!is.character(cigar) || any(is.na(cigar))) stop("'cigar' must be a character vector with no NAs") ## Prepare the 'strand' slot. if (is.null(strand)) { if (length(seqnames) != 0L) stop("'strand' must be specified when 'seqnames' is not empty") strand <- Rle(strand()) } else if (is.factor(strand)) { strand <- Rle(strand) } ## Prepare the 'elementMetadata' slot. varlist <- list(...) elementMetadata <- if (0L == length(varlist)) S4Vectors:::make_zero_col_DataFrame(length(seqnames)) else do.call(DataFrame, varlist) ## Prepare the 'seqinfo' slot. if (is.null(seqlengths)) { seqlengths <- rep(NA_integer_, length(levels(seqnames))) names(seqlengths) <- levels(seqnames) } else if (!is.numeric(seqlengths) || is.null(names(seqlengths)) || any(duplicated(names(seqlengths)))) { stop("'seqlengths' must be an integer vector with unique names") } else if (!setequal(names(seqlengths), levels(seqnames))) { stop("'names(seqlengths)' incompatible with 'levels(seqnames)'") } else if (!is.integer(seqlengths)) { storage.mode(seqlengths) <- "integer" } seqinfo <- Seqinfo(seqnames=names(seqlengths), seqlengths=seqlengths) ## Create and return the GAlignments instance. new("GAlignments", NAMES=names, seqnames=seqnames, start=pos, cigar=cigar, strand=strand, elementMetadata=elementMetadata, seqinfo=seqinfo) } setMethod("update", "GAlignments", function(object, ...) { BiocGenerics:::replaceSlots(object, ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Internal helper function used by higher level coercion functions. ### ### NOT exported. ### ### Names are propagated via 'x@partitioning' ('x' is a CompressedIRangesList). make_GRangesList_from_CompressedIRangesList <- function(x, seqnames, strand, seqinfo) { x_eltNROWS <- elementNROWS(x) seqnames <- rep.int(seqnames, x_eltNROWS) strand <- rep.int(strand, x_eltNROWS) unlisted_ans <- GRanges(seqnames=seqnames, ranges=x@unlistData, strand=strand) seqinfo(unlisted_ans) <- seqinfo ans <- relist(unlisted_ans, x) mcols(ans) <- mcols(x, use.names=FALSE) ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### setMethod("ranges", "GAlignments", function(x, use.names=TRUE, use.mcols=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") if (use.names) { ans_names <- names(x) } else { ans_names <- NULL } ans <- IRanges(start=start(x), width=width(x), names=ans_names) if (use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) setMethod("granges", "GAlignments", function(x, use.names=TRUE, use.mcols=FALSE) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") ans <- GRanges(seqnames(x), ranges(x, use.names=use.names), strand(x), seqinfo=seqinfo(x)) if (use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) setMethod("grglist", "GAlignments", function(x, use.names=TRUE, use.mcols=FALSE, order.as.in.query=FALSE, drop.D.ranges=FALSE) { rgl <- rglist(x, use.names=use.names, use.mcols=use.mcols, order.as.in.query=order.as.in.query, drop.D.ranges=drop.D.ranges) make_GRangesList_from_CompressedIRangesList(rgl, seqnames(x), strand(x), seqinfo(x)) } ) setMethod("rglist", "GAlignments", function(x, use.names=TRUE, use.mcols=FALSE, order.as.in.query=FALSE, drop.D.ranges=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") if (!isTRUEorFALSE(order.as.in.query)) stop("'order.as.in.query' must be TRUE or FALSE") ans <- extractAlignmentRangesOnReference(x@cigar, x@start, drop.D.ranges=drop.D.ranges) if (order.as.in.query) ans <- revElements(ans, strand(x) == "-") if (use.names) names(ans) <- names(x) if (use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) setAs("GAlignments", "IntegerRanges", function(from) ranges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignments", "GRanges", function(from) granges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignments", "GRangesList", function(from) grglist(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignments", "IntegerRangesList", function(from) rglist(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignments", "DataFrame", function(from) { DataFrame(seqnames=seqnames(from), strand=strand(from), cigar=cigar(from), qwidth=qwidth(from), start=start(from), end=end(from), width=width(from), njunc=njunc(from), mcols(from, use.names=FALSE), row.names=names(from), check.names=FALSE) }) setMethod("as.data.frame", "GAlignments", function(x, row.names=NULL, optional=FALSE, ...) { as.data.frame(as(x, "DataFrame"), row.names=row.names, optional=optional) } ) setAs("GenomicRanges", "GAlignments", function(from) { from_mcols <- mcols(from, use.names=FALSE) ans_cigar <- from_mcols[["cigar"]] if (is.null(ans_cigar)) ans_cigar <- paste0(width(from), "M") ans <- GAlignments(seqnames(from), start(from), ans_cigar, strand(from), if (!is.null(names(from))) names(from) else from_mcols$name, seqlengths(from), from_mcols[setdiff(colnames(from_mcols), c("cigar", "name"))] ) metadata(ans) <- metadata(from) seqinfo(ans) <- seqinfo(from) ans } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting ### ### Avoid infinite recursion that we would otherwise get: ### GAlignments(Rle(factor("chr1")), 11L, "20M", strand("+"))[[1]] ### # Error: C stack usage 7969700 is too close to the limit setMethod("getListElement", "GAlignments", function(x, i, exact=TRUE) stop(wmsg(class(x), " objects don't support [[, $, as.list(), ", "lapply(), or unlist()")) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### "show" method. ### .from_GAlignments_to_naked_character_matrix_for_display <- function(x) { x_len <- length(x) x_mcols <- mcols(x, use.names=FALSE) x_nmc <- ncol(x_mcols) ans <- cbind(seqnames=as.character(seqnames(x)), strand=as.character(strand(x)), cigar=S4Vectors:::sketchStr(cigar(x), 23L), qwidth=qwidth(x), start=start(x), end=end(x), width=width(x), njunc=njunc(x)) if (x_nmc > 0L) { tmp <- as.data.frame(lapply(x_mcols, showAsCell), optional=TRUE) ans <- cbind(ans, `|`=rep.int("|", x_len), as.matrix(tmp)) } ans } showGAlignments <- function(x, margin="", print.classinfo=FALSE, print.seqinfo=FALSE) { lx <- length(x) nc <- ncol(mcols(x, use.names=FALSE)) cat(class(x), " object with ", lx, " ", ifelse(lx == 1L, "alignment", "alignments"), " and ", nc, " metadata ", ifelse(nc == 1L, "column", "columns"), ":\n", sep="") out <- S4Vectors:::makePrettyMatrixForCompactPrinting(x, .from_GAlignments_to_naked_character_matrix_for_display) if (print.classinfo) { .COL2CLASS <- c( seqnames="Rle", strand="Rle", cigar="character", qwidth="integer", start="integer", end="integer", width="integer", njunc="integer" ) classinfo <- S4Vectors:::makeClassinfoRowForCompactPrinting(x, .COL2CLASS) ## A sanity check, but this should never happen! stopifnot(identical(colnames(classinfo), colnames(out))) out <- rbind(classinfo, out) } if (nrow(out) != 0L) rownames(out) <- paste0(margin, rownames(out)) ## We set 'max' to 'length(out)' to avoid the getOption("max.print") ## limit that would typically be reached when 'showHeadLines' global ## option is set to Inf. print(out, quote=FALSE, right=TRUE, max=length(out)) if (print.seqinfo) { cat(margin, "-------\n", sep="") cat(margin, "seqinfo: ", summary(seqinfo(x)), "\n", sep="") } } setMethod("show", "GAlignments", function(object) showGAlignments(object, margin=" ", print.classinfo=TRUE, print.seqinfo=TRUE) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Concatenation ### setMethod("bindROWS", "GAlignments", GenomicRanges:::concatenate_GenomicRanges_objects ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Comparing/ordering. ### setMethod("pcompare", c("GAlignments", "GAlignments"), function(x, y) { x <- granges(x, use.names=FALSE) y <- granges(y, use.names=FALSE) callGeneric(x, y) } ) setMethod("is.unsorted", "GAlignments", function(x, na.rm=FALSE, strictly=FALSE, ...) { x <- granges(x, use.names=FALSE) callGeneric() } ) setMethod("order", "GAlignments", function(..., na.last=TRUE, decreasing=FALSE, method=c("auto", "shell", "radix")) { args <- list(...) order_args <- c(lapply(args, granges, use.names=FALSE), list(na.last=na.last, decreasing=decreasing, method=method)) do.call(order, order_args) } ) setMethod("sort", "GAlignments", function(x, decreasing=FALSE, ...) { oo <- GenomicRanges:::order_GenomicRanges(x, decreasing=decreasing, ...) extractROWS(x, oo) } ) setMethod("rank", "GAlignments", function(x, na.last=TRUE, ties.method=c("average", "first", "last", "random", "max", "min"), ...) { x <- granges(x, use.names=FALSE) callGeneric() } ) GenomicAlignments/R/GAlignmentsList-class.R0000644000175200017520000002421114516004601021667 0ustar00biocbuildbiocbuild### ========================================================================= ### GAlignmentsList objects ### ------------------------------------------------------------------------- ### setClass("GAlignmentsList", contains="CompressedRangesList", representation( unlistData="GAlignments", elementMetadata="DataFrame" ), prototype( elementType="GAlignments", elementMetadata=new("DFrame") ) ) ### Formal API: ### names(x) - NULL or character vector. ### length(x) - single integer. Nb of alignments in 'x'. ### seqnames(x) - 'factor' Rle of the same length as 'x'. ### rname(x) - same as 'seqnames(x)'. ### seqnames(x) <- value - replacement form of 'seqnames(x)'. ### rname(x) <- value - same as 'seqnames(x) <- value'. ### cigar(x) - character vector of the same length as 'x'. ### strand(x) - 'factor' Rle of the same length as 'x' (levels: +, -, *). ### qwidth(x) - integer vector of the same length as 'x'. ### start(x), end(x), width(x) - integer vectors of the same length as 'x'. ### njunc(x) - integer vector of the same length as 'x'. ### grglist(x) - GRangesList object of the same length as 'x'. ### granges(x) - GRanges object of the same length as 'x'. ### rglist(x) - CompressedIRangesList object of the same length as 'x'. ### ranges(x) - IRanges object of the same length as 'x'. ### show(x) - compact display in a data.frame-like fashion. ### GAlignmentsList(x, ...) - constructor. ### x[i] - GAlignmentsList object of the same class as 'x' ### (endomorphism). ### ### findOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. Just a convenient wrapper for ### 'findOverlaps(grglist(query), subject, ...)', etc... ### ### countOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. Just a convenient wrapper for ### 'countOverlaps(grglist(query), subject, ...)', etc... ### ### subsetByOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. ### ### qnarrow(x, start=NA, end=NA, width=NA) - GAlignmentsList object of the ### same length and class as 'x' (endomorphism). ### ### narrow(x, start=NA, end=NA, width=NA) - GAlignmentsList object of the ### same length and class as 'x' (endomorphism). ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters. ### setMethod("seqnames", "GAlignmentsList", function(x) relist(seqnames(unlist(x, use.names=FALSE)), x) ) setMethod("rname", "GAlignmentsList", function(x) relist(rname(unlist(x, use.names=FALSE)), x) ) setMethod("cigar", "GAlignmentsList", function(x) relist(cigar(unlist(x, use.names=FALSE)), x) ) setMethod("strand", "GAlignmentsList", function(x) relist(strand(unlist(x, use.names=FALSE)), x) ) setMethod("qwidth", "GAlignmentsList", function(x) relist(qwidth(unlist(x, use.names=FALSE)), x) ) setMethod("njunc", "GAlignmentsList", function(x) relist(njunc(unlist(x, use.names=FALSE)), x) ) setMethod("seqinfo", "GAlignmentsList", function(x) seqinfo(unlist(x, use.names=FALSE)) ) setMethod("elementMetadata", "GAlignmentsList", GenomicRanges:::get_GenomicRangesList_mcols ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Setters. ### setReplaceMethod("rname", "GAlignmentsList", function(x, value) `seqnames<-`(x, value) ) setReplaceMethod("elementMetadata", "GAlignmentsList", GenomicRanges:::set_CompressedGenomicRangesList_mcols ) setReplaceMethod("strand", "GAlignmentsList", GenomicRanges:::set_CompressedGenomicRangesList_strand ) setReplaceMethod("strand", c("GAlignmentsList", "character"), function(x, ..., value) { if (length(value) > 1L) stop("length(value) must be 1") strand(x@unlistData) <- value x } ) setReplaceMethod("seqinfo", "GAlignmentsList", GenomicRanges:::set_CompressedGenomicRangesList_seqinfo ) setReplaceMethod("seqnames", "GAlignmentsList", GenomicRanges:::set_CompressedGenomicRangesList_seqnames ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.GAlignmentsList <- function(x) { ## TDB: Currently known pitfalls are caught by ## GAlignments validity. } setValidity2("GAlignmentsList", .valid.GAlignmentsList) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructors. ### GAlignmentsList <- function(...) { listData <- list(...) if (length(listData) == 0L) { unlistData <- GAlignments() } else { if (length(listData) == 1L && is.list(listData[[1L]])) listData <- listData[[1L]] if (!all(sapply(listData, is, "GAlignments"))) stop("all elements in '...' must be GAlignments objects") unlistData <- suppressWarnings(do.call("c", unname(listData))) } relist(unlistData, PartitioningByEnd(listData)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### setMethod("ranges", "GAlignmentsList", function(x, use.names=TRUE, use.mcols=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") ans <- unlist(range(rglist(x)), use.names=FALSE) if (use.names) names(ans) <- names(x) if (use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) setMethod("granges", "GAlignmentsList", function(x, use.names=TRUE, use.mcols=FALSE, ignore.strand=FALSE) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") if (ignore.strand) strand(x@unlistData) <- "*" msg <- paste0("For some list elements in 'x', the ranges are ", "not on the same chromosome and strand. ", "Cannot extract a single range for them. ", "As a consequence, the returned GRanges object ", "is not parallel to 'x'.") rg <- range(grglist(x, ignore.strand=ignore.strand)) is_one_to_one <- all(elementNROWS(rg) == 1L) if (!is_one_to_one && all(width(x@partitioning) > 0)) { if (ignore.strand) warning(msg) else warning(paste0(msg, " Consider using 'ignore.strand=TRUE'.")) } ans <- unlist(rg, use.names=use.names) if (is_one_to_one && use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) setMethod("grglist", "GAlignmentsList", function(x, use.names=TRUE, use.mcols=FALSE, drop.D.ranges=FALSE, ignore.strand=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") if (!isTRUEorFALSE(ignore.strand)) stop("'ignore.strand' must be TRUE or FALSE") if (ignore.strand) strand(x@unlistData) <- "*" unlisted_x <- unlist(x, use.names=FALSE) grl <- grglist(unlisted_x, drop.D.ranges=drop.D.ranges) ans <- IRanges:::regroupBySupergroup(grl, x) if (!use.names) names(ans) <- NULL if (use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) setMethod("rglist", "GAlignmentsList", function(x, use.names=TRUE, use.mcols=FALSE, drop.D.ranges=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") unlisted_x <- unlist(x, use.names=FALSE) rgl <- rglist(unlisted_x, drop.D.ranges=drop.D.ranges) ans <- IRanges:::regroupBySupergroup(rgl, x) if (!use.names) names(ans) <- NULL if (use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) setAs("GAlignmentsList", "IntegerRanges", function(from) ranges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentsList", "GRanges", function(from) granges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentsList", "GRangesList", function(from) grglist(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentsList", "IntegerRangesList", function(from) rglist(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentPairs", "GAlignmentsList", function(from) { if (length(from) == 0L) pbe <- PartitioningByEnd() else pbe <- PartitioningByEnd(seq(2, 2*length(from), 2), names=names(from)) new("GAlignmentsList", unlistData=unlist(from, use.names=FALSE), partitioning=pbe) } ) setAs("GAlignmentsList", "GAlignmentPairs", function(from) { from_mcols <- mcols(from, use.names=FALSE) ga <- unlist(from[from_mcols$mate_status != "unmated"]) first <- c(TRUE, FALSE) last <- c(FALSE, TRUE) ga_mcols <- mcols(ga, use.names=FALSE) isProperPair <- if (!is.null(ga_mcols$flag)) { bamFlagTest(ga_mcols$flag[first], "isProperPair") } else { TRUE } GAlignmentPairs(ga[first], ga[last], isProperPair=isProperPair, names=names(ga)[first]) } ) setAs("list", "GAlignmentsList", function(from) do.call(GAlignmentsList, from)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting. ### ## "[", "[<-" and "[[", "[[<-" from CompressedList ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Going from GAlignments to GAlignmentsList with extractList() and family. ### setMethod("relistToClass", "GAlignments", function(x) "GAlignmentsList" ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### show method. ### setMethod("show", "GAlignmentsList", function(object) GenomicRanges:::show_GenomicRangesList(object) ) GenomicAlignments/R/GappedReads-class.R0000644000175200017520000000517514516004601021012 0ustar00biocbuildbiocbuild### ========================================================================= ### GappedReads objects ### ------------------------------------------------------------------------- ### setClass("GappedReads", contains="GAlignments", representation( qseq="DNAStringSet" ## TODO: Maybe add the read quality? mismatch information? ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters. ### setGeneric("qseq", function(x) standardGeneric("qseq")) setMethod("qseq", "GappedReads", function(x) x@qseq) ### Overriding "qwidth" method for GAlignments objects with a faster ### method. setMethod("qwidth", "GappedReads", function(x) width(qseq(x))) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.GappedReads.qseq <- function(x) { x_qseq <- qseq(x) if (class(x_qseq) != "DNAStringSet" || !is.null(names(x_qseq))) return("'qseq(x)' must be an unnamed DNAStringSet instance") if (length(x_qseq) != length(cigar(x))) return("'qseq(x)' and 'cigar(x)' must have the same length") if (!identical(width(x_qseq), cigarWidthAlongQuerySpace(cigar(x)))) return(paste("'width(qseq(x))' and", "'cigarWidthAlongQuerySpace(cigar(x))'", "must be identical")) NULL } .valid.GappedReads <- function(x) { .valid.GappedReads.qseq(x) } setValidity2("GappedReads", .valid.GappedReads, where=asNamespace("GenomicAlignments")) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructor. ### GappedReads <- function(seqnames=Rle(factor()), pos=integer(0), cigar=character(0), strand=NULL, qseq=DNAStringSet(), names=NULL, seqlengths=NULL) { galn <- GAlignments(seqnames=seqnames, pos=pos, cigar=cigar, strand=strand, names=names, seqlengths=seqlengths) new("GappedReads", galn, qseq=qseq) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting. ### setMethod("extractROWS", "GappedReads", function(x, i) { i <- normalizeSingleBracketSubscript(i, x, as.NSBS=TRUE) x@qseq <- extractROWS(x@qseq, i) callNextMethod() } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Combining. ### setMethod("c", "GappedReads", function (x, ..., recursive = FALSE) { stop("coming soon") } ) GenomicAlignments/R/OverlapEncodings-class.R0000644000175200017520000003045614516004601022075 0ustar00biocbuildbiocbuild### ========================================================================= ### OverlapEncodings objects ### ------------------------------------------------------------------------- ### setClass("OverlapEncodings", contains="Vector", representation( Loffset="integer", # no NAs, >= 0 Roffset="integer", # no NAs, >= 0 encoding="factor", # no NAs flippedQuery="logical" # no NAs ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### parallel_slot_names() ### ### Combine the new "parallel slots" with those of the parent class. Make ### sure to put the new parallel slots **first**. See R/Vector-class.R file ### in the S4Vectors package for what slots should or should not be considered ### "parallel". setMethod("parallel_slot_names", "OverlapEncodings", function(x) c("Loffset", "Roffset", "encoding", "flippedQuery", callNextMethod()) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters. ### setGeneric("Loffset", function(x) standardGeneric("Loffset")) setMethod("Loffset", "OverlapEncodings", function(x) x@Loffset) setGeneric("Roffset", function(x) standardGeneric("Roffset")) setMethod("Roffset", "OverlapEncodings", function(x) x@Roffset) ### encoding() generic is defined in Biostrings. setMethod("encoding", "OverlapEncodings", function(x) x@encoding) ### S3/S4 combo for levels.OverlapEncodings levels.OverlapEncodings <- function(x) levels(encoding(x)) setMethod("levels", "OverlapEncodings", levels.OverlapEncodings) setGeneric("flippedQuery", function(x) standardGeneric("flippedQuery")) setMethod("flippedQuery", "OverlapEncodings", function(x) x@flippedQuery) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The encodingHalves(), Lencoding() and Rencoding() low-level utilities. ### .split_encoding_halves <- function(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE) { if (!is.character(x)) stop("'x' must be a character vector") if (!isTRUEorFALSE(single.end.on.left)) stop("'single.end.on.left' must be TRUE or FALSE") if (!isTRUEorFALSE(single.end.on.right)) stop("'single.end.on.right' must be TRUE or FALSE") if (!isTRUEorFALSE(as.factors)) stop("'as.factors' must be TRUE or FALSE") encoding_blocks <- CharacterList(strsplit(x, ":", fixed=TRUE)) unlisted_blocks <- unlist(encoding_blocks, use.names=FALSE) block_halves <- CharacterList(strsplit(unlisted_blocks, "--", fixed=TRUE)) ## Check that the blocks in any given encoding are either all single-end ## or all paired-end. nhalves <- unique(relist(elementNROWS(block_halves), encoding_blocks)) if (any(elementNROWS(nhalves) != 1L)) stop("some encodings are ill-formed") nhalves <- as.integer(nhalves) if (any(nhalves > 2L)) stop("some encodings are ill-formed") halves2encoding <- function(halves, skeleton) { blocks <- relist(as.character(halves), skeleton) encoding <- unstrsplit(blocks, sep=":") if (length(encoding) != 0L) encoding <- setNames(paste0(encoding, ":"), names(encoding)) encoding } Lencoding <- halves2encoding(heads(block_halves, n=1L), encoding_blocks) Rencoding <- halves2encoding(tails(block_halves, n=1L), encoding_blocks) if (!(single.end.on.left && single.end.on.right)) { idx <- which(nhalves == 1L) if (!single.end.on.left) Lencoding[idx] <- NA_character_ if (!single.end.on.right) Rencoding[idx] <- NA_character_ } if (as.factors) { Lencoding <- factor(Lencoding, levels=unique(Lencoding)) Rencoding <- factor(Rencoding, levels=unique(Rencoding)) } list(Lencoding, Rencoding) } setGeneric("encodingHalves", signature="x", function(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE) standardGeneric("encodingHalves") ) setMethod("encodingHalves", "character", .split_encoding_halves) setMethod("encodingHalves", "factor", function(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE) { levels_halves <- encodingHalves(levels(x), single.end.on.left=single.end.on.left, single.end.on.right=single.end.on.right, as.factors=as.factors) x <- as.integer(x) list(levels_halves[[1L]][x], levels_halves[[2L]][x]) } ) setMethod("encodingHalves", "OverlapEncodings", function(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE) { encodingHalves(encoding(x), single.end.on.left=single.end.on.left, single.end.on.right=single.end.on.right, as.factors=as.factors) } ) Lencoding <- function(x, ...) encodingHalves(x, ...)[[1L]] Rencoding <- function(x, ...) encodingHalves(x, ...)[[2L]] ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The njunc(), Lnjunc(), and Rnjunc() low-level utilities. ### ### 'x' must be a character vector of single-end encodings. .njunc_single_end_encodings <- function(x) { if (!is.character(x)) stop("'x' must be a character vector") old_warn <- getOption("warn") options(warn=2L) on.exit(options(warn=old_warn)) M <- try(as.integer(sub(":.*", "", x)), silent=TRUE) if (inherits(M, "try-error")) stop("some encodings are ill-formed") options(warn=old_warn) if (any(M < 1L, na.rm=TRUE)) warning(wmsg("some encodings start with a value < 1 and that is ", "interpreted as a negative number of junctions)")) setNames(M - 1L, names(x)) } Lnjunc <- function(x, single.end.on.left=FALSE) { Lencoding <- Lencoding(x, single.end.on.left=single.end.on.left, as.factors=TRUE) .njunc_single_end_encodings(levels(Lencoding))[as.integer(Lencoding)] } Rnjunc <- function(x, single.end.on.right=FALSE) { Rencoding <- Rencoding(x, single.end.on.right=single.end.on.right, as.factors=TRUE) .njunc_single_end_encodings(levels(Rencoding))[as.integer(Rencoding)] } ### We make this the default "njunc" method although it will only work on ### objects supported by encodingHalves() (which is called behind the scene), ### that is, for character, factor, and OverlapEncodings objects. So instead ### of defining 3 "njunc" methods (one for each type of object supported by ### encodingHalves()), we define a single one for expediency. Another advantage ### of this approach is that if, in the future, encodingHalves() is extended to ### support more types of objects, then njunc() will work out-of-the-box on ### them i.e. with no need to define additional "njunc" methods. setMethod("njunc", "ANY", function(x) { Lnjunc <- Lnjunc(x, single.end.on.left=TRUE) Rnjunc <- Rnjunc(x) Rnjunc[is.na(Rnjunc)] <- 0L Lnjunc + Rnjunc } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### ### S3/S4 combo for as.data.frame.OverlapEncodings as.data.frame.OverlapEncodings <- function(x, row.names=NULL, optional=FALSE, ...) { if (!(is.null(row.names) || is.character(row.names))) stop("'row.names' must be NULL or a character vector") data.frame(Loffset=Loffset(x), Roffset=Roffset(x), encoding=encoding(x), flippedQuery=flippedQuery(x), row.names=row.names, check.rows=TRUE, check.names=FALSE, stringsAsFactors=FALSE) } setMethod("as.data.frame", "OverlapEncodings", as.data.frame.OverlapEncodings) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Displaying ### .make_naked_matrix_from_OverlapEncodings <- function(x) { x_len <- length(x) x_mcols <- mcols(x, use.names=FALSE) x_nmc <- if (is.null(x_mcols)) 0L else ncol(x_mcols) ans <- cbind(Loffset=as.character(Loffset(x)), Roffset=as.character(Roffset(x)), encoding=as.character(encoding(x)), flippedQuery=as.character(flippedQuery(x))) if (x_nmc > 0L) { tmp <- do.call(data.frame, c(lapply(x_mcols, showAsCell), list(check.names=FALSE))) ans <- cbind(ans, `|`=rep.int("|", x_len), as.matrix(tmp)) } ans } showOverlapEncodings <- function(x, margin="", print.classinfo=FALSE) { x_class <- class(x) x_len <- length(x) x_mcols <- mcols(x, use.names=FALSE) x_nmc <- if (is.null(x_mcols)) 0L else ncol(x_mcols) cat(classNameForDisplay(x), " object of length ", x_len, " with ", x_nmc, " metadata column", ifelse(x_nmc == 1L, "", "s"), ":\n", sep="") out <- S4Vectors:::makePrettyMatrixForCompactPrinting(x, .make_naked_matrix_from_OverlapEncodings) if (print.classinfo) { .COL2CLASS <- c( Loffset="integer", Roffset="integer", encoding="factor", flippedQuery="logical" ) classinfo <- S4Vectors:::makeClassinfoRowForCompactPrinting(x, .COL2CLASS) ## A sanity check, but this should never happen! stopifnot(identical(colnames(classinfo), colnames(out))) out <- rbind(classinfo, out) } if (nrow(out) != 0L) rownames(out) <- paste0(margin, rownames(out)) ## We set 'max' to 'length(out)' to avoid the getOption("max.print") ## limit that would typically be reached when 'showHeadLines' global ## option is set to Inf. print(out, quote=FALSE, right=TRUE, max=length(out)) } setMethod("show", "OverlapEncodings", function(object) showOverlapEncodings(object, margin=" ", print.classinfo=TRUE) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Detection of "splice compatible" overlaps. ### build_compatible_encoding_subpatterns <- function(njunc) { ## Each "atom" must match exactly 1 code in the encoding. ATOM0 <- "[fgij]" if (njunc == 0L) return(ATOM0) #ntimes <- function(atom, n) rep.int(atom, n) ntimes <- function(atom, n) { if (n == 1L) atom else c(atom, "{", n, "}") } LEFT_ATOM <- "[jg]" MIDDLE_ATOM <- "g" RIGHT_ATOM <- "[gf]" WILDCARD_ATOM <- "[^:-]" sapply(seq_len(njunc + 1L), function(i) { if (i == 1L) { atoms <- c(LEFT_ATOM, ntimes(WILDCARD_ATOM, njunc)) } else if (i == njunc + 1L) { atoms <- c(ntimes(WILDCARD_ATOM, njunc), RIGHT_ATOM) } else { atoms <- c(ntimes(WILDCARD_ATOM, i-1L), MIDDLE_ATOM, ntimes(WILDCARD_ATOM, njunc-i+1L)) } paste0(atoms, collapse="") }) } .build_compatible_encoding_pattern <- function(max.njunc) { subpatterns <- sapply(0:max.njunc, function(njunc) paste0(build_compatible_encoding_subpatterns(njunc), collapse=":") ) paste0(":(", paste0(subpatterns, collapse="|"), "):") } ### 'x' must be a character vector of single-end encodings. .is_compatible_with_splicing <- function(x) { if (!is.character(x)) stop("'x' must be a character vector") max.njunc <- max(c(0L, .njunc_single_end_encodings(x))) pattern <- .build_compatible_encoding_pattern(max.njunc) setNames(grepl(pattern, x), names(x)) } setGeneric("isCompatibleWithSplicing", function(x) standardGeneric("isCompatibleWithSplicing") ) setMethod("isCompatibleWithSplicing", "character", function(x) { halves <- encodingHalves(x, single.end.on.left=TRUE, single.end.on.right=TRUE) ans1 <- .is_compatible_with_splicing(halves[[1L]]) ans2 <- .is_compatible_with_splicing(halves[[2L]]) ans1 & ans2 } ) setMethod("isCompatibleWithSplicing", "factor", function(x) isCompatibleWithSplicing(levels(x))[as.integer(x)] ) setMethod("isCompatibleWithSplicing", "OverlapEncodings", function(x) isCompatibleWithSplicing(encoding(x)) ) GenomicAlignments/R/cigar-utils.R0000644000175200017520000002764714516004601017763 0ustar00biocbuildbiocbuild### ========================================================================= ### Low-level CIGAR utilities ### ------------------------------------------------------------------------- ### See p. 4 of the SAM Spec v1.4 at http://samtools.sourceforge.net/ for the ### list of CIGAR operations and their meanings. CIGAR_OPS <- c("M", "I", "D", "N", "S", "H", "P", "=", "X") .normarg_cigar <- function(cigar) { if (is.factor(cigar)) cigar <- as.character(cigar) if (!is.character(cigar)) stop("'cigar' must be a character vector or factor") cigar } .normarg_flag <- function(flag, cigar) { if (!is.null(flag)) { if (!is.numeric(flag)) stop("'flag' must be NULL or a vector of integers") if (!is.integer(flag)) flag <- as.integer(flag) if (length(cigar) != length(flag)) stop("'cigar' and 'flag' must have the same length") } flag } .normarg_pos <- function(pos, cigar) { if (!is.numeric(pos)) stop("'pos' must be a vector of integers") if (!is.integer(pos)) pos <- as.integer(pos) if (length(pos) != 1L && length(pos) != length(cigar)) stop("'pos' must have length 1 or the same length as 'cigar'") pos } .select_reference_space <- function(N.regions.removed) { if (!isTRUEorFALSE(N.regions.removed)) stop("'N.regions.removed' must be TRUE or FALSE") if (N.regions.removed) { space <- 2L # REFERENCE_N_REGIONS_REMOVED } else { space <- 1L # REFERENCE } space } .select_query_space <- function(before.hard.clipping, after.soft.clipping) { if (!isTRUEorFALSE(before.hard.clipping)) stop("'before.hard.clipping' must be TRUE or FALSE") if (!isTRUEorFALSE(after.soft.clipping)) stop("'after.soft.clipping' must be TRUE or FALSE") if (before.hard.clipping) { if (after.soft.clipping) stop("'before.hard.clipping' and 'after.soft.clipping' ", "cannot both be TRUE") space <- 4L # QUERY_BEFORE_HARD_CLIPPING } else if (after.soft.clipping) { space <- 5L # QUERY_AFTER_SOFT_CLIPPING } else { space <- 3L # QUERY } space } .select_pairwise_space <- function(N.regions.removed, dense) { if (!isTRUEorFALSE(N.regions.removed)) stop("'N.regions.removed' must be TRUE or FALSE") if (!isTRUEorFALSE(dense)) stop("'dense' must be TRUE or FALSE") if (N.regions.removed) { if (dense) stop("'N.regions.removed' and 'dense' ", "cannot both be TRUE") space <- 7L # PAIRWISE_N_REGIONS_REMOVED } else if (dense) { space <- 8L # PAIRWISE_DENSE } else { space <- 6L # PAIRWISE } space } .normarg_ops <- function(ops) { if (is.null(ops)) return(ops) if (!is.character(ops)) stop("'ops' must be a character vector") if (any(is.na(ops))) stop("'ops' cannot contain NAs") if (length(ops) == 1L) { ops <- strsplit(ops, NULL, fixed=TRUE)[[1L]] } else if (any(nchar(ops) != 1L)) { stop("when 'length(ops) != 1', all its elements ", "must be single letters") } if (anyDuplicated(ops)) stop("'ops' cannot contain duplicated letters") if (!all(ops %in% CIGAR_OPS)) stop("'ops' contains invalid CIGAR operations") ops } validCigar <- function(cigar) { cigar <- .normarg_cigar(cigar) .Call2("valid_cigar", cigar, 0L, PACKAGE="GenomicAlignments") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Transform CIGARs into other useful representations ### explodeCigarOps <- function(cigar, ops=CIGAR_OPS) { cigar <- .normarg_cigar(cigar) ops <- .normarg_ops(ops) .Call2("explode_cigar_ops", cigar, ops, PACKAGE="GenomicAlignments") } explodeCigarOpLengths <- function(cigar, ops=CIGAR_OPS) { cigar <- .normarg_cigar(cigar) ops <- .normarg_ops(ops) .Call2("explode_cigar_op_lengths", cigar, ops, PACKAGE="GenomicAlignments") } cigarToRleList <- function(cigar) { cigar_ops <- explodeCigarOps(cigar) cigar_op_lengths <- explodeCigarOpLengths(cigar) if (length(cigar) == 0L) { unlisted_cigar_ops <- character(0) unlisted_cigar_op_lengths <- integer(0) } else { unlisted_cigar_ops <- unlist(cigar_ops, use.names=FALSE) unlisted_cigar_op_lengths <- unlist(cigar_op_lengths, use.names=FALSE) } ## Prepare 'ans_flesh'. ans_flesh <- Rle(unlisted_cigar_ops, unlisted_cigar_op_lengths) ## Prepare 'ans_skeleton'. nops_per_cigar <- elementNROWS(cigar_op_lengths) ans_breakpoints <- cumsum(unlisted_cigar_op_lengths)[cumsum(nops_per_cigar)] ans_skeleton <- PartitioningByEnd(ans_breakpoints) ## Relist. relist(ans_flesh, ans_skeleton) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Summarize CIGARs ### cigarOpTable <- function(cigar) { cigar <- .normarg_cigar(cigar) ans <- .Call2("cigar_op_table", cigar, PACKAGE="GenomicAlignments") stopifnot(identical(CIGAR_OPS, colnames(ans))) # sanity check ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### From CIGARs to ranges ### .cigar_ranges <- function(cigar, flag, space, pos, f, ops, drop.empty.ranges, reduce.ranges, with.ops) { cigar <- .normarg_cigar(cigar) flag <- .normarg_flag(flag, cigar) if (!isSingleNumber(space)) stop("'space' must be a single integer") if (!is.integer(space)) space <- as.integer(space) pos <- .normarg_pos(pos, cigar) if (!is.null(f)) { if (!is.factor(f)) stop("'f' must be NULL or a factor") if (length(f) != length(cigar)) stop("'f' must have the same length as 'cigar'") } ops <- .normarg_ops(ops) if (!isTRUEorFALSE(drop.empty.ranges)) stop("'drop.empty.ranges' must be TRUE or FALSE") if (!isTRUEorFALSE(reduce.ranges)) stop("'reduce.ranges' must be TRUE or FALSE") if (!isTRUEorFALSE(with.ops)) stop("'with.ops' must be TRUE or FALSE") .Call2("cigar_ranges", cigar, flag, space, pos, f, ops, drop.empty.ranges, reduce.ranges, with.ops, PACKAGE="GenomicAlignments") } cigarRangesAlongReferenceSpace <- function(cigar, flag=NULL, N.regions.removed=FALSE, pos=1L, f=NULL, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) { space <- .select_reference_space(N.regions.removed) C_ans <- .cigar_ranges(cigar, flag, space, pos, f, ops, drop.empty.ranges, reduce.ranges, with.ops) if (is.null(f)) return(C_ans) compress <- length(C_ans) >= 200L IRangesList(C_ans, compress=compress) } cigarRangesAlongQuerySpace <- function(cigar, flag=NULL, before.hard.clipping=FALSE, after.soft.clipping=FALSE, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) { space <- .select_query_space(before.hard.clipping, after.soft.clipping) .cigar_ranges(cigar, flag, space, 1L, NULL, ops, drop.empty.ranges, reduce.ranges, with.ops) } cigarRangesAlongPairwiseSpace <- function(cigar, flag=NULL, N.regions.removed=FALSE, dense=FALSE, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) { space <- .select_pairwise_space(N.regions.removed, dense) .cigar_ranges(cigar, flag, space, 1L, NULL, ops, drop.empty.ranges, reduce.ranges, with.ops) } ### A convenience wrapper to cigarRangesAlongReferenceSpace(). extractAlignmentRangesOnReference <- function(cigar, pos=1L, drop.D.ranges=FALSE, f=NULL) { if (!isTRUEorFALSE(drop.D.ranges)) stop("'drop.D.ranges' must be TRUE or FALSE") ## Not sure why we include "I" operations here since they don't generate ## coverage on the reference (they always produce zero-width ranges on the ## reference). if (drop.D.ranges) { ops <- c("M", "=", "X", "I") } else { ops <- c("M", "=", "X", "I", "D") } cigarRangesAlongReferenceSpace(cigar, flag=NULL, pos=pos, f=f, ops=ops, drop.empty.ranges=FALSE, reduce.ranges=TRUE) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### From CIGARs to sequence lengths ### .cigar_width <- function(cigar, flag, space) { cigar <- .normarg_cigar(cigar) flag <- .normarg_flag(flag, cigar) if (!isSingleNumber(space)) stop("'space' must be a single integer") if (!is.integer(space)) space <- as.integer(space) .Call2("cigar_width", cigar, flag, space, PACKAGE="GenomicAlignments") } cigarWidthAlongReferenceSpace <- function(cigar, flag=NULL, N.regions.removed=FALSE) { space <- .select_reference_space(N.regions.removed) .cigar_width(cigar, flag, space) } cigarWidthAlongQuerySpace <- function(cigar, flag=NULL, before.hard.clipping=FALSE, after.soft.clipping=FALSE) { space <- .select_query_space(before.hard.clipping, after.soft.clipping) .cigar_width(cigar, flag, space) } cigarWidthAlongPairwiseSpace <- function(cigar, flag=NULL, N.regions.removed=FALSE, dense=FALSE) { space <- .select_pairwise_space(N.regions.removed, dense) .cigar_width(cigar, flag, space) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Narrow CIGARs ### cigarNarrow <- function(cigar, start=NA, end=NA, width=NA) { cigar_width <- cigarWidthAlongReferenceSpace(cigar) cigar_ranges <- IRanges(start=rep.int(1L, length(cigar_width)), width=cigar_width) threeranges <- threebands(cigar_ranges, start=start, end=end, width=width) C_ans <- .Call2("cigar_narrow", cigar, width(threeranges$left), width(threeranges$right), PACKAGE="GenomicAlignments") ans <- C_ans[[1L]] attr(ans, "rshift") <- C_ans[[2L]] ans } cigarQNarrow <- function(cigar, start=NA, end=NA, width=NA) { cigar_qwidth <- cigarWidthAlongQuerySpace(cigar) cigar_qranges <- IRanges(start=rep.int(1L, length(cigar_qwidth)), width=cigar_qwidth) threeranges <- threebands(cigar_qranges, start=start, end=end, width=width) C_ans <- .Call2("cigar_qnarrow", cigar, width(threeranges$left), width(threeranges$right), PACKAGE="GenomicAlignments") ans <- C_ans[[1L]] attr(ans, "rshift") <- C_ans[[2L]] ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Translate coordinates between query-based and reference-based ### queryLoc2refLoc <- function(qloc, cigar, pos=1L) { stop(wmsg("Not implemented yet, sorry! Please use mapToAlignments() ", "and family if you need to map coordinates between query reads ", "and reference genome on the basis of the reported CIGAR. ", "See '?mapToAlignments'")) } queryLocs2refLocs <- function(qlocs, cigar, pos=1L, flag=NULL) { stop(wmsg("Not implemented yet, sorry! Please use mapToAlignments() ", "and family if you need to map coordinates between query reads ", "and reference genome on the basis of the reported CIGAR. ", "See '?mapToAlignments'")) } GenomicAlignments/R/coordinate-mapping-methods.R0000644000175200017520000001270014516004601022741 0ustar00biocbuildbiocbuild### ========================================================================= ### coordinate mapping methods ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Generics ### setGeneric("mapToAlignments", signature=c("x", "alignments"), function(x, alignments, ...) standardGeneric("mapToAlignments") ) setGeneric("pmapToAlignments", signature=c("x", "alignments"), function(x, alignments, ...) standardGeneric("pmapToAlignments") ) setGeneric("mapFromAlignments", signature=c("x", "alignments"), function(x, alignments, ...) standardGeneric("mapFromAlignments") ) setGeneric("pmapFromAlignments", signature=c("x", "alignments"), function(x, alignments, ...) standardGeneric("pmapFromAlignments") ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### mapToAlignments() and mapFromAlignments() methods ### .mapFromAlignments <- function(x, alignments) { if (!length(x) && !length(alignments)) return(GRanges(xHits=integer(), transcriptsHits=integer())) if (is.null(xNames <- names(x)) || is.null(alignmentsNames <- names(alignments))) stop ("both 'x' and 'alignments' must have names") ## name matching determines pairs match0 <- match(alignmentsNames, alignmentsNames) match1 <- match(xNames, alignmentsNames) group0 <- splitAsList(seq_along(alignmentsNames), match0) group1 <- group0[match(na.omit(match1), names(group0))] xHits <- rep(which(!is.na(match1)), elementNROWS(group1)) alignmentsHits <- unlist(group1, use.names=FALSE) if (!length(xHits <- na.omit(xHits))) stop ("none of 'names(x)' are in 'names(alignments)'") x <- x[xHits] alignments <- alignments[alignmentsHits] s <- .Call("query_locs_to_ref_locs", start(x), cigar(alignments), start(alignments), FALSE) e <- .Call("query_locs_to_ref_locs", end(x), cigar(alignments), start(alignments), TRUE) e <- pmax(e, s - 1L) ## remove non-hits keep <- !is.na(s) & !is.na(e) seqname <- as.character(seqnames(alignments)) GRanges(Rle(seqname[keep]), IRanges(s[keep], e[keep], names=names(x)[keep]), xHits=xHits[keep], alignmentsHits=alignmentsHits[keep]) } .mapToAlignments <- function(x, alignments) { if (!length(x) && !length(alignments)) return(GRanges(xHits=integer(), transcriptsHits=integer())) if (is.null(names(alignments))) stop ("'alignments' must have names") ## map all possible pairs; returns hits only map <- .Call("map_ref_locs_to_query_locs", start(x), end(x), cigar(alignments), start(alignments)) xHits <- map[[3]] alignmentsHits <- map[[4]] if (length(xHits)) GRanges(Rle(names(alignments)[alignmentsHits]), IRanges(map[[1]], pmax(map[[2]], map[[1]] - 1L), names=names(x)[xHits]), strand="*", xHits, alignmentsHits) else GRanges(xHits=integer(), transcriptsHits=integer()) } setMethod("mapToAlignments", c("IntegerRanges", "GAlignments"), function(x, alignments, ...) ranges(.mapToAlignments(x, alignments)) ) setMethod("mapToAlignments", c("GenomicRanges", "GAlignments"), function(x, alignments, ...) .mapToAlignments(x, alignments) ) setMethod("mapFromAlignments", c("IntegerRanges", "GAlignments"), function(x, alignments, ...) ranges(.mapFromAlignments(x, alignments)) ) setMethod("mapFromAlignments", c("GenomicRanges", "GAlignments"), function(x, alignments, ...) .mapFromAlignments(x, alignments) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### pmapToAlignments() and pmapFromAlignments() methods ### .pmapAlignments <- function(x, alignments, reverse) { if (length(x) && length(alignments)) { if (length(x) != length(alignments)) stop("'x' and 'alignments' must have the same length") if (reverse) { FUN <- "query_locs_to_ref_locs" seqname <- as.character(seqnames(alignments)) } else { if (is.null(names(alignments))) stop ("'alignments' must have names") FUN <- "ref_locs_to_query_locs" seqname <- names(alignments) } s <- .Call(FUN, start(x), cigar(alignments), start(alignments), FALSE) e <- .Call(FUN, end(x), cigar(alignments), start(alignments), TRUE) e <- pmax(e, s - 1L) ## non-hits if (any(skip <- is.na(s) | is.na(e))) { s[skip] <- 0L e[skip] <- -1L seqname[skip] <- "UNMAPPED" } GRanges(Rle(seqname), IRanges(s, e, names=names(x))) } else { GRanges() } } setMethod("pmapToAlignments", c("IntegerRanges", "GAlignments"), function(x, alignments, ...) ranges(.pmapAlignments(x, alignments, FALSE)) ) setMethod("pmapToAlignments", c("GenomicRanges", "GAlignments"), function(x, alignments, ...) .pmapAlignments(ranges(x), alignments, FALSE) ) setMethod("pmapFromAlignments", c("IntegerRanges", "GAlignments"), function(x, alignments, ...) ranges(.pmapAlignments(x, alignments, TRUE)) ) setMethod("pmapFromAlignments", c("GenomicRanges", "GAlignments"), function(x, alignments, ...) .pmapAlignments(ranges(x), alignments, TRUE) ) GenomicAlignments/R/coverage-methods.R0000644000175200017520000000410414516004601020753 0ustar00biocbuildbiocbuild### ========================================================================= ### "coverage" methods ### ------------------------------------------------------------------------- setMethod("coverage", "GAlignments", function(x, shift=0L, width=NULL, weight=1L, method=c("auto", "sort", "hash", "naive"), drop.D.ranges=FALSE) { x <- grglist(x, drop.D.ranges=drop.D.ranges) coverage(x, shift=shift, width=width, weight=weight, method=method) } ) setMethod("coverage", "GAlignmentPairs", function(x, shift=0L, width=NULL, weight=1L, method=c("auto", "sort", "hash", "naive"), drop.D.ranges=FALSE) { x <- grglist(x, drop.D.ranges=drop.D.ranges) ## Should we do this instead? ## See https://support.bioconductor.org/p/123463/#123552 #x <- reduce(grglist(x, drop.D.ranges=drop.D.ranges)) coverage(x, shift=shift, width=width, weight=weight, method=method) } ) setMethod("coverage", "GAlignmentsList", function(x, shift=0L, width=NULL, weight=1L, ...) { x <- unlist(x, use.names=FALSE) callGeneric() } ) setMethod("coverage", "BamFile", function(x, shift=0L, width=NULL, weight=1L, ..., param=ScanBamParam()) { if (!isOpen(x)) { open(x) on.exit(close(x)) } cvg <- NULL repeat { aln <- readGAlignments(x, param=param) if (length(aln) == 0L) { if (is.null(cvg)) cvg <- coverage(aln, shift=shift, width=width, weight=weight, ...) break } cvg0 <- coverage(aln, shift=shift, width=width, weight=weight, ...) if (is.null(cvg)) cvg <- cvg0 else cvg <- cvg + cvg0 } cvg }) setMethod("coverage", "character", function(x, shift=0L, width=NULL, weight=1L, ..., yieldSize=2500000L) { if (!isSingleString(x)) stop("'x' must be a single string for coverage,character-method") bf <- BamFile(x, yieldSize=yieldSize) coverage(bf, shift=shift, width=width, weight=weight, ...) }) GenomicAlignments/R/encodeOverlaps-methods.R0000644000175200017520000007661714551551747022174 0ustar00biocbuildbiocbuild### ========================================================================= ### encodeOverlaps() and related utilities ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### encodeOverlaps1() - A low-level utility. ### ### > query <- IRanges(start=c(7, 15, 22), end=c(9, 19, 23)) ### > subject <- IRanges(start=c(1, 4, 15, 22, 1, 30, 25), ### end=c(2, 9, 19, 25, 10, 38, 25)) ### > encodeOverlaps1(query, subject, as.matrix=TRUE) ### [,1] [,2] [,3] [,4] [,5] [,6] [,7] ### [1,] "m" "j" "a" "a" "i" "a" "a" ### [2,] "m" "m" "g" "a" "m" "a" "a" ### [3,] "m" "m" "m" "f" "m" "a" "a" ### > encodeOverlaps1(query, subject) ### $Loffset ### [1] 1 ### ### $Roffset ### [1] 2 ### ### $encoding ### [1] "3:jmm:agm:aaf:imm:" ### ### > query.space <- c(0, 1, 0) ### > encodeOverlaps1(query, subject, query.space=query.space)$encoding ### [1] "3:mXm:jXm:aXm:aXf:iXm:aXa:aXa:" ### > query.space <- rep(-1, length(query)) ### > subject.space <- rep(-1, length(subject)) ### > encodeOverlaps1(rev(query), rev(subject), ### query.space=query.space, subject.space=subject.space) ### $Loffset ### [1] 2 ### ### $Roffset ### [1] 1 ### ### $encoding ### [1] "3:aai:jmm:agm:aaf:" ### ### > encodeOverlaps1(query, subject, query.break=2)$encoding ### [1] "2--1:jm--m:ag--m:aa--f:im--m:" ### > encodeOverlaps1(rev(query), rev(subject), ### query.space=query.space, subject.space=subject.space, ### query.break=1)$encoding ### [1] "1--2:a--ai:j--mm:a--gm:a--af:" ### 'query.space' must be either an integer vector of the same length as ### 'query', or NULL. If NULL, then it's interpreted as ### 'integer(length(query))' i.e. all the ranges in 'query' are considered to ### be on space 0. encodeOverlaps1 <- function(query, subject, query.space=NULL, subject.space=NULL, query.break=0L, flip.query=FALSE, as.matrix=FALSE, as.raw=FALSE) { if (!is(query, "IntegerRanges")) stop("'query' must be an IntegerRanges object") if (!is(subject, "IntegerRanges")) stop("'subject' must be an IntegerRanges object") if (is.numeric(query.space) && !is.integer(query.space)) query.space <- as.integer(query.space) if (is.numeric(subject.space) && !is.integer(subject.space)) subject.space <- as.integer(subject.space) if (!isSingleNumber(query.break)) stop("'query.break' must be a single integer value") if (!is.integer(query.break)) query.break <- as.integer(query.break) if (!isTRUEorFALSE(flip.query)) stop("'flip.query' must be TRUE or FALSE") if (!isTRUEorFALSE(as.matrix)) stop("'as.matrix' must be TRUE or FALSE") if (!isTRUEorFALSE(as.raw)) stop("'as.raw' must be TRUE or FALSE") .Call2("encode_overlaps1", start(query), width(query), query.space, query.break, flip.query, start(subject), width(subject), subject.space, as.matrix, as.raw, PACKAGE="GenomicAlignments") } ### TODO: Put this in the (upcoming) man page for encodeOverlaps(). ### A simple (but inefficient) implementation of the "findOverlaps" method for ### IntegerRanges objects. Complexity and memory usage is M x N where M and N ### are the lengths of 'query' and 'subject', respectively. findRangesOverlaps <- function(query, subject) { ovenc <- encodeOverlaps1(query, subject, as.matrix=TRUE, as.raw=TRUE) offsets <- which(charToRaw("c") <= ovenc & ovenc <= charToRaw("k")) - 1L q_hits <- offsets %% nrow(ovenc) + 1L s_hits <- offsets %/% nrow(ovenc) + 1L cbind(queryHits=q_hits, subjectHits=s_hits) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The .RangesList_encodeOverlaps() helper. ### ### This is the power horse behind all the "encodeOverlaps" methods. ### .RangesList_encode_overlaps <- function(query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces) { .Call2("RangesList_encode_overlaps", query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces, PACKAGE="GenomicAlignments") } .Hits_encode_overlaps <- function(query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces, hits, flip.query) { if (queryLength(hits) != length(query.starts) || subjectLength(hits) != length(subject.starts)) stop("'hits' is not compatible with 'query' and 'subject'") .Call2("Hits_encode_overlaps", query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces, queryHits(hits), subjectHits(hits), flip.query, PACKAGE="GenomicAlignments") } .RangesList_encodeOverlaps <- function(query.starts, query.widths, subject.starts, subject.widths, hits, flip.query=NULL, query.spaces=NULL, subject.spaces=NULL, query.breaks=NULL) { if (is.null(hits)) { C_ans <- .RangesList_encode_overlaps(query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces) flip.query <- logical(length(C_ans$encoding)) } else { if (!is(hits, "Hits")) stop("'hits' must be a Hits object") if (is.null(flip.query)) { flip.query <- logical(length(hits)) } else { if (!is.logical(flip.query)) stop("'flip.query' must be a logical vector") if (length(flip.query) != length(hits)) stop("'flip.query' must have the same length as 'hits'") } C_ans <- .Hits_encode_overlaps(query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces, hits, flip.query) } encoding <- as.factor(C_ans$encoding) new2("OverlapEncodings", Loffset=C_ans$Loffset, Roffset=C_ans$Roffset, encoding=encoding, flippedQuery=flip.query, check=FALSE) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### encodeOverlaps() generic and methods for IntegerRangesList objects. ### setGeneric("encodeOverlaps", signature=c("query", "subject"), function(query, subject, hits=NULL, ...) standardGeneric("encodeOverlaps") ) setMethods("encodeOverlaps", list(c("IntegerRangesList", "IntegerRangesList"), c("IntegerRangesList", "IntegerRanges"), c("IntegerRanges", "IntegerRangesList")), function(query, subject, hits=NULL, ...) { .RangesList_encodeOverlaps(as.list(start(query)), as.list(width(query)), as.list(start(subject)), as.list(width(subject)), hits) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### .isWrongStrand() internal helper. ### .oneValPerTopLevelElt <- function(x, errmsg) { if (!is(x, "RleList")) stop("'x' must be an RleList object") vals <- runValue(x) vals_eltNROWS <- elementNROWS(vals) if (!all(vals_eltNROWS == 1L)) stop(errmsg) unlist(vals, use.names=FALSE) } .isWrongStrand <- function(query, subject, hits) { if (!is(query, "GRangesList") || !is(subject, "GRangesList")) stop("'query' and 'subject' must be GRangesList objects") ## Extract the top-level strand and seqnames of the query. errmsg <- c("some alignments in 'query' have ranges on ", "more than 1 reference sequence (fusion reads?)") query_seqnames <- .oneValPerTopLevelElt(seqnames(query), errmsg) errmsg <- c("some alignments in 'query' have ranges on ", "both strands") query_strand <- .oneValPerTopLevelElt(strand(query), errmsg) ## Extract the top-level strand and seqnames of the subject. errmsg <- c("some transcripts in 'subject' mix exons from ", "different chromosomes (trans-splicing?)") subject_seqnames <- .oneValPerTopLevelElt(seqnames(subject), errmsg) errmsg <- c("some transcripts in 'subject' mix exons from ", "both strands (trans-splicing?)") subject_strand <- .oneValPerTopLevelElt(strand(subject), errmsg) ## Expand the top-level strand and seqnames of the query and subject. if (!is.null(hits)) { if (!is(hits, "Hits")) stop("'hits' must be NULL or a Hits object") if (queryLength(hits) != length(query) || subjectLength(hits) != length(subject)) stop("'hits' is not compatible with 'query' and 'subject' ", "('queryLength(hits)' and 'subjectLength(hits)' don't ", "match the lengths of 'query' and 'subject')") query_seqnames <- query_seqnames[queryHits(hits)] query_strand <- query_strand[queryHits(hits)] subject_seqnames <- subject_seqnames[subjectHits(hits)] subject_strand <- subject_strand[subjectHits(hits)] } ## Should never happen if 'encodeOverlaps(query, subject, hits)' ## was called with 'hits' being the result of a call to ## 'findOverlaps(query, subject)'. if (!all(query_seqnames == subject_seqnames)) stop("cannot use 'flip.query.if.wrong.strand=TRUE' to ", "encode overlaps across chromosomes") query_strand != subject_strand } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### flipQuery() ### flipQuery <- function(x, i) { if (!is(x, "GRangesList")) stop("'x' must be a GRangesList object") i <- normalizeSingleBracketSubscript(i, x, as.NSBS=TRUE) xi <- extractROWS(x, i) x <- replaceROWS(x, i, invertStrand(revElements(xi))) xi_query.break <- mcols(xi, use.names=FALSE)$query.break if (!is.null(xi_query.break)) { revxi_query.break <- elementNROWS(xi) - xi_query.break mcols(x)$query.break <- replaceROWS(mcols(x, use.names=FALSE)$query.break, i, revxi_query.break) } x } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Should we use generic + methods for this? ### .get_GRanges_spaces <- function(x) { ans <- as.integer(seqnames(x)) x_strand <- as.integer(strand(x)) is_minus <- which(x_strand == as.integer(strand("-"))) ans[is_minus] <- - ans[is_minus] ans } .get_GRangesList_spaces <- function(x) { unlisted_ans <- .get_GRanges_spaces(x@unlistData) as.list(relist(unlisted_ans, x)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### "encodeOverlaps" method for GRangesList objects. ### .GRangesList_encodeOverlaps <- function(query, subject, hits, flip.query.if.wrong.strand) { if (!isTRUEorFALSE(flip.query.if.wrong.strand)) stop("'flip.query.if.wrong.strand' must be TRUE or FALSE") seqinfo <- merge(seqinfo(query), seqinfo(subject)) seqlevels(query) <- seqlevels(subject) <- seqlevels(seqinfo) if (flip.query.if.wrong.strand) { flip.query <- .isWrongStrand(query, subject, hits) } else { flip.query <- NULL } query.breaks <- mcols(query, use.names=FALSE)$query.break .RangesList_encodeOverlaps(as.list(start(query)), as.list(width(query)), as.list(start(subject)), as.list(width(subject)), hits, flip.query, query.spaces=.get_GRangesList_spaces(query), subject.spaces=.get_GRangesList_spaces(subject), query.breaks=query.breaks) } setMethod("encodeOverlaps", c("GRangesList", "GRangesList"), function(query, subject, hits=NULL, flip.query.if.wrong.strand=FALSE) .GRangesList_encodeOverlaps(query, subject, hits, flip.query.if.wrong.strand) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### selectEncodingWithCompatibleStrand(). ### selectEncodingWithCompatibleStrand <- function(ovencA, ovencB, query.strand, subject.strand, hits=NULL) { if (!is(ovencA, "OverlapEncodings")) stop("'ovencA' must be an OverlapEncodings object") if (!is(ovencB, "OverlapEncodings")) stop("'ovencB' must be an OverlapEncodings object") if (!is.null(hits)) { if (!is(hits, "Hits")) stop("'hits' must be a Hits object or NULL") query.strand <- query.strand[queryHits(hits)] subject.strand <- subject.strand[subjectHits(hits)] } ans <- ovencA names(ans) <- NULL mcols(ans) <- NULL is_wrong_strand <- query.strand != subject.strand idx <- which(is_wrong_strand) ans@Loffset[idx] <- ovencB@Loffset[idx] ans@Roffset[idx] <- ovencB@Roffset[idx] ans_encoding <- as.character(ans@encoding) ans_encoding[idx] <- as.character(ovencB@encoding[idx]) ans@encoding <- as.factor(ans_encoding) ans@flippedQuery[is_wrong_strand] <- TRUE ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### isCompatibleWithSkippedExons(). ### ### FIXME: Revisit this and make sure it's doing the right thing for ### paired-end encodings. Maybe look at isCompatibleWithSplicing() for some ### inspiration (used to suffer from similar issue on paired-end encodings but ### was refactored). setGeneric("isCompatibleWithSkippedExons", signature="x", function(x, max.skipped.exons=NA) standardGeneric("isCompatibleWithSkippedExons") ) .build_CompatibleWithSkippedExons_pattern0 <- function(max.njunc1, max.Lnjunc, max.Rnjunc, max.skipped.exons=NA) { if (!identical(max.skipped.exons, NA)) stop("only 'max.skipped.exons=NA' is supported for now, sorry") ## Subpattern for single-end reads. skipped_exons_subpatterns <- function(n) paste0(":(", strrep(".", n + 1L), ":)*") subpattern1 <- sapply(0:max.njunc1, function(njunc) paste0(build_compatible_encoding_subpatterns(njunc), collapse=skipped_exons_subpatterns(njunc))) subpattern1 <- paste0(":(", paste0(subpattern1, collapse="|"), "):") ## Subpattern for paired-end reads. Lsubpattern <- sapply(0:max.Lnjunc, function(njunc) paste0(":", build_compatible_encoding_subpatterns(njunc), "-", collapse=".*")) Lsubpattern <- paste0("(", paste0(Lsubpattern, collapse="|"), ")") Rsubpattern <- sapply(0:max.Rnjunc, function(njunc) paste0("-", build_compatible_encoding_subpatterns(njunc), ":", collapse=".*")) Rsubpattern <- paste0("(", paste0(Rsubpattern, collapse="|"), ")") LRsubpattern <- paste0(Lsubpattern, ".*", Rsubpattern) ## Final pattern. paste0("(", subpattern1, "|", LRsubpattern, ")") } .build_CompatibleWithSkippedExons_pattern <- function(x, max.skipped.exons=NA) { njunc <- njunc(x) Lnjunc <- Lnjunc(x) Rnjunc <- Rnjunc(x) max.njunc1 <- max(c(0L, njunc[is.na(Lnjunc)])) max.Lnjunc <- max(c(0L, Lnjunc), na.rm=TRUE) max.Rnjunc <- max(c(0L, Rnjunc), na.rm=TRUE) .build_CompatibleWithSkippedExons_pattern0(max.njunc1, max.Lnjunc, max.Rnjunc, max.skipped.exons=max.skipped.exons) } .isCompatibleWithSkippedExons <- function(x, max.skipped.exons=NA) { if (!is.character(x)) stop("'x' must be a character vector") pattern1 <- .build_CompatibleWithSkippedExons_pattern(x, max.skipped.exons) grepl(pattern1, x) & !isCompatibleWithSplicing(x) } setMethod("isCompatibleWithSkippedExons", "character", .isCompatibleWithSkippedExons ) setMethod("isCompatibleWithSkippedExons", "factor", function(x, max.skipped.exons=NA) { ok <- isCompatibleWithSkippedExons(levels(x), max.skipped.exons=max.skipped.exons) ok[as.integer(x)] } ) setMethod("isCompatibleWithSkippedExons", "OverlapEncodings", function(x, max.skipped.exons=NA) isCompatibleWithSkippedExons(encoding(x), max.skipped.exons=max.skipped.exons) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### extractSteppedExonRanks(). ### .extract_njunc_from_encoding <- function(x) { as.integer(unlist(strsplit(sub(":.*", "", x), "--", fixed=TRUE), use.names=FALSE)) - 1L } .extractSteppedExonRanksFromEncodingBlocks <- function(encoding_blocks, encoding_patterns) { patterns <- paste0("^", encoding_patterns, "$") ii <- lapply(patterns, grep, encoding_blocks) ii_eltNROWS <- elementNROWS(ii) if (any(ii_eltNROWS == 0L)) return(integer(0)) if (any(ii_eltNROWS != 1L)) stop("cannot unambiguously extract stepped exon ranks from ", "encoding \"", paste0(encoding_blocks, collapse=":"), "\"") ans <- unlist(ii, use.names=FALSE) diff_ans <- diff(ans) if (any(diff_ans <= 0L)) return(integer(0)) ans } ### 'encoding' must be a single encoding. ### Returns an integer vector. If the encoding is single-end then the vector ### is unnamed and strictly sorted. If it's paired-end then it's made of the ### concatenation of the 2 strictly sorted integer vectors that correspond to ### each end. In that case the vector is named. .extractSteppedExonRanks <- function(encoding, for.query.right.end=FALSE) { if (!isTRUEorFALSE(for.query.right.end)) stop("'for.query.right.end' must be TRUE or FALSE") encoding_blocks <- strsplit(encoding, ":", fixed=TRUE)[[1L]] njunc <- .extract_njunc_from_encoding(encoding_blocks[1L]) encoding_blocks <- encoding_blocks[-1L] if (length(njunc) == 1L) { ## Single-end read. if (for.query.right.end) stop("cannot use 'for.query.right.end=TRUE' ", "on single-end encoding: ", encoding) encoding_patterns <- build_compatible_encoding_subpatterns(njunc) return(.extractSteppedExonRanksFromEncodingBlocks(encoding_blocks, encoding_patterns)) } if (length(njunc) != 2L) # should never happen stop(encoding, ": invalid encoding") ## Paired-end read. encoding_blocks <- strsplit(encoding_blocks, "--", fixed=TRUE) if (!all(elementNROWS(encoding_blocks) == 2L)) # should never happen stop(encoding, ": invalid encoding") encoding_blocks <- matrix(unlist(encoding_blocks, use.names=FALSE), nrow=2L) Lencoding_patterns <- build_compatible_encoding_subpatterns(njunc[1L]) Lranks <- .extractSteppedExonRanksFromEncodingBlocks(encoding_blocks[1L, ], Lencoding_patterns) Rencoding_patterns <- build_compatible_encoding_subpatterns(njunc[2L]) Rranks <- .extractSteppedExonRanksFromEncodingBlocks(encoding_blocks[2L, ], Rencoding_patterns) if (for.query.right.end) return(Rranks) # unnamed! (like for a single-end read) names(Rranks) <- rep.int("R", length(Rranks)) names(Lranks) <- rep.int("L", length(Lranks)) c(Lranks, Rranks) } setGeneric("extractSteppedExonRanks", function(x, for.query.right.end=FALSE) standardGeneric("extractSteppedExonRanks") ) setMethod("extractSteppedExonRanks", "character", function(x, for.query.right.end=FALSE) { lapply(x, .extractSteppedExonRanks, for.query.right.end) } ) setMethod("extractSteppedExonRanks", "factor", function(x, for.query.right.end=FALSE) { if (length(x) == 0L) return(list()) ranks <- extractSteppedExonRanks(levels(x), for.query.right.end=for.query.right.end) ranks[as.integer(x)] } ) setMethod("extractSteppedExonRanks", "OverlapEncodings", function(x, for.query.right.end=FALSE) { ranks <- extractSteppedExonRanks(encoding(x), for.query.right.end=for.query.right.end) ranks_eltNROWS <- elementNROWS(ranks) tmp <- unlist(unname(ranks), use.names=TRUE) # we want the inner names tmp <- tmp + rep.int(Loffset(x), ranks_eltNROWS) flevels <- seq_len(length(ranks)) f <- factor(rep.int(flevels, ranks_eltNROWS), levels=flevels) unname(split(tmp, f)) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### extractSpannedExonRanks(). ### setGeneric("extractSpannedExonRanks", function(x, for.query.right.end=FALSE) standardGeneric("extractSpannedExonRanks") ) setMethod("extractSpannedExonRanks", "character", function(x, for.query.right.end=FALSE) { .extractRanks <- function(encoding) { ranks <- .extractSteppedExonRanks(encoding, for.query.right.end=for.query.right.end) if (length(ranks) == 0L) return(c(NA_integer_, NA_integer_)) c(ranks[1L], ranks[length(ranks)]) } ranks <- lapply(x, .extractRanks) if (length(ranks) == 0L) { firstSpannedExonRank <- lastSpannedExonRank <- integer(0) } else { ranks <- unlist(ranks, use.names=FALSE) firstSpannedExonRank <- ranks[c(TRUE, FALSE)] lastSpannedExonRank <- ranks[c(FALSE, TRUE)] } data.frame(firstSpannedExonRank=firstSpannedExonRank, lastSpannedExonRank=lastSpannedExonRank, check.names=FALSE, stringsAsFactors=FALSE) } ) setMethod("extractSpannedExonRanks", "factor", function(x, for.query.right.end=FALSE) { if (length(x) == 0L) return(list()) ranks <- extractSpannedExonRanks(levels(x), for.query.right.end=for.query.right.end) ans <- ranks[as.integer(x), , drop=FALSE] rownames(ans) <- NULL ans } ) setMethod("extractSpannedExonRanks", "OverlapEncodings", function(x, for.query.right.end=FALSE) { ranks <- extractSpannedExonRanks(encoding(x), for.query.right.end=for.query.right.end) ranks$firstSpannedExonRank <- ranks$firstSpannedExonRank + Loffset(x) ranks$lastSpannedExonRank <- ranks$lastSpannedExonRank + Loffset(x) ranks } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### extractSkippedExonRanks(). ### setGeneric("extractSkippedExonRanks", function(x, for.query.right.end=FALSE) standardGeneric("extractSkippedExonRanks") ) setMethod("extractSkippedExonRanks", "character", function(x, for.query.right.end=FALSE) { .extractRanks <- function(encoding) { ranks <- .extractSteppedExonRanks(encoding, for.query.right.end=for.query.right.end) if (length(ranks) == 0L) return(ranks) ranks_names <- names(ranks) if (is.null(ranks_names)) # single-end read return(setdiff(ranks[1L]:ranks[length(ranks)], ranks)) ## Paired-end read. ranks <- split(unname(ranks), ranks_names) Lranks <- ranks$L Lranks <- setdiff(Lranks[1L]:Lranks[length(Lranks)], Lranks) Rranks <- ranks$R Rranks <- setdiff(Rranks[1L]:Rranks[length(Rranks)], Rranks) names(Lranks) <- rep.int("L", length(Lranks)) names(Rranks) <- rep.int("R", length(Rranks)) c(Lranks, Rranks) } lapply(x, .extractRanks) } ) setMethod("extractSkippedExonRanks", "factor", function(x, for.query.right.end=FALSE) { if (length(x) == 0L) return(list()) ranks <- extractSkippedExonRanks(levels(x), for.query.right.end=for.query.right.end) ranks[as.integer(x)] } ) setMethod("extractSkippedExonRanks", "OverlapEncodings", function(x, for.query.right.end=FALSE) { ranks <- extractSkippedExonRanks(encoding(x), for.query.right.end=for.query.right.end) ranks_eltNROWS <- elementNROWS(ranks) tmp <- unlist(unname(ranks), use.names=TRUE) # we want the inner names tmp <- tmp + rep.int(Loffset(x), ranks_eltNROWS) flevels <- seq_len(length(ranks)) f <- factor(rep.int(flevels, ranks_eltNROWS), levels=flevels) unname(split(tmp, f)) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### extractQueryStartInTranscript(). ### ### TODO: Maybe put this in IRanges and rename it setElementNROWS, or even ### better introduce an "elementNROWS<-" generic and make this the method ### for CompressedList objects? .setElementNROWS <- function(x, eltNROWS) { if (!is(x, "CompressedList")) stop("'x' must be a CompressedList object") if (!is.numeric(eltNROWS) || length(eltNROWS) != length(x)) stop("'eltNROWS' must be an integer vector of the same length as 'x'") if (!is.integer(eltNROWS)) eltNROWS <- as.integer(eltNROWS) if (S4Vectors:::anyMissingOrOutside(eltNROWS, lower=0L)) stop("'eltNROWS' cannot contain NAs or negative values") x_eltNROWS <- elementNROWS(x) if (!all(eltNROWS <= x_eltNROWS)) stop("'all(eltNROWS <= elementNROWS(x))' must be TRUE") from <- cumsum(c(1L, x_eltNROWS[-length(x_eltNROWS)])) ii <- sequence(eltNROWS, from=from) x@unlistData <- x@unlistData[ii] x@partitioning@end <- unname(cumsum(eltNROWS)) x } ### Returns a data.frame with 1 row per overlap, and 3 integer columns: ### 1. startInTranscript ### 2. firstSpannedExonRank ### 3. startInFirstSpannedExon ### Rows for overlaps that are not "compatible" or "almost compatible" ### contain NAs. extractQueryStartInTranscript <- function(query, subject, hits=NULL, ovenc=NULL, flip.query.if.wrong.strand=FALSE, for.query.right.end=FALSE) { if (!is(query, "GRangesList") || !is(subject, "GRangesList")) stop("'query' and 'subject' must be GRangesList objects") seqinfo <- merge(seqinfo(query), seqinfo(subject)) seqlevels(query) <- seqlevels(subject) <- seqlevels(seqinfo) if (is.null(hits)) { if (length(query) != length(subject)) stop("'query' and 'subject' must have the same length") } else { if (!is(hits, "Hits")) stop("'hits' must be a Hits object or NULL") if (queryLength(hits) != length(query) || subjectLength(hits) != length(subject)) stop("'hits' is not compatible with 'query' and 'subject' ", "('queryLength(hits)' and 'subjectLength(hits)' don't ", "match the lengths of 'query' and 'subject')") query <- query[queryHits(hits)] subject <- subject[subjectHits(hits)] } if (is.null(ovenc)) { ovenc <- encodeOverlaps(query, subject, flip.query.if.wrong.strand=flip.query.if.wrong.strand) } else { if (!is(ovenc, "OverlapEncodings")) stop("'ovenc' must be an OverlapEncodings object") if (length(ovenc) != length(query)) stop("when not NULL, 'ovenc' must have the same length ", "as 'hits', if specified, otherwise as 'query'") } if (!isTRUEorFALSE(for.query.right.end)) stop("'for.query.right.end' must be TRUE or FALSE") query <- flipQuery(query, flippedQuery(ovenc)) ## Extract first range from each list element of 'query'. if (for.query.right.end) { query.break <- mcols(query, use.names=FALSE)$query.break if (is.null(query.break)) stop("using 'for.query.right.end=TRUE' requires that ", "'mcols(query)' has a \"query.break\" column ", "indicating for each paired-end read the position of the ", "break between the ranges coming from one end and those ", "coming from the other end") query <- tails(query, n=-query.break) } query1 <- unlist(heads(query, n=1L), use.names=FALSE) ## A sanity check. if (length(query1) != length(query)) stop("some list elements in 'query' are empty") query_start1 <- start(query1) query_end1 <- end(query1) query_strand1 <- as.factor(strand(query1)) ## Extract start/end/strand of the first spanned exon ## in each top-level element of 'subject'. exrank <- extractSpannedExonRanks(ovenc, for.query.right.end=for.query.right.end)$firstSpannedExonRank sii1 <- start(subject@partitioning) + exrank - 1L subject_start1 <- start(subject@unlistData)[sii1] subject_end1 <- end(subject@unlistData)[sii1] subject_strand1 <- as.factor(strand(subject@unlistData))[sii1] ## A sanity check. if (any(!is.na(exrank) & (query_strand1 != subject_strand1))) { ## TODO: Error message needs to take into account whether 'hits' ## and/or 'ovenc' was supplied or not. stop("'ovenc' is incompatible with the supplied 'query' ", "and/or 'subject' and/or 'hits'") } ## Compute the "query start in first spanned exon". startInFirstSpannedExon <- rep.int(NA_integer_, length(query)) is_on_plus <- query_strand1 == "+" idx <- which(!is.na(exrank) & is_on_plus) startInFirstSpannedExon[idx] <- query_start1[idx] - subject_start1[idx] + 1L idx <- which(!is.na(exrank) & !is_on_plus) startInFirstSpannedExon[idx] <- subject_end1[idx] - query_end1[idx] + 1L ## Truncate each transcript in 'subject' right before the first spanned ## exon and compute the cumulated width of the truncated object. subject2_eltNROWS <- exrank - 1L subject2_eltNROWS[is.na(exrank)] <- 0L subject2 <- .setElementNROWS(subject, subject2_eltNROWS) subject2_cumwidth <- unname(sum(width(subject2))) subject2_cumwidth[is.na(exrank)] <- NA_integer_ ## Compute the "query start in transcript". startInTranscript <- subject2_cumwidth + startInFirstSpannedExon data.frame(startInTranscript=startInTranscript, firstSpannedExonRank=exrank, startInFirstSpannedExon=startInFirstSpannedExon, check.names=FALSE, stringsAsFactors=FALSE) } GenomicAlignments/R/findCompatibleOverlaps-methods.R0000644000175200017520000000264314516004601023622 0ustar00biocbuildbiocbuild### ========================================================================= ### findCompatibleOverlaps ### ------------------------------------------------------------------------- ### setGeneric("findCompatibleOverlaps", function(query, subject) standardGeneric("findCompatibleOverlaps") ) .GAlignmentsORGAlignmentPairs.findCompatibleOverlaps <- function(query, subject) { ## Starting with BioC 3.2, the 'order.as.in.query' argument is not ## supported anymore for GAlignmentPairs objects. if (is(query, "GAlignmentPairs")) grl <- grglist(query) else grl <- grglist(query, order.as.in.query=TRUE) ## TODO: Use 'type="within"' when it's supported for circular ## sequences like the mitochondrial chromosome. ov <- findOverlaps(grl, subject, ignore.strand=TRUE) ovenc <- encodeOverlaps(grl, subject, hits=ov, flip.query.if.wrong.strand=TRUE) ov_is_compat <- isCompatibleWithSplicing(ovenc) ov[ov_is_compat] } setMethod("findCompatibleOverlaps", c("GAlignments", "GRangesList"), .GAlignmentsORGAlignmentPairs.findCompatibleOverlaps ) setMethod("findCompatibleOverlaps", c("GAlignmentPairs", "GRangesList"), .GAlignmentsORGAlignmentPairs.findCompatibleOverlaps ) countCompatibleOverlaps <- function(query, subject) { compatov <- findCompatibleOverlaps(query, subject) tabulate(queryHits(compatov), nbins=queryLength(compatov)) } GenomicAlignments/R/findMateAlignment.R0000644000175200017520000003034714516004601021115 0ustar00biocbuildbiocbuild### ========================================================================= ### findMateAlignment() ### ------------------------------------------------------------------------- ### ### For each element in GAlignments object 'x', finds its mate in GAlignments ### object 'y'. ### ### Alignments 'x[i1]' and 'y[i2]' are considered mates iff they pass all the ### following tests: ### ### (A) names(x[i1]) == names(y[i2]) ### ### (B) mcols(x[i1])$mrnm == seqnames(y[i2]) & ### mcols(y[i2])$mrnm == seqnames(x[i1]) ### ### (C) mcols(x[i1])$mpos == start(y[i2]) & ### mcols(y[i2])$mpos == start(x[i1]) ### ### (D) isMateMinusStrand(x[i1]) == isMinusStrand(y[i2]) & ### isMateMinusStrand(y[i2]) == isMinusStrand(x[i1]) ### ### (E) isFirstSegment(x[i1]) & isLastSegment(y[i2]) | ### isFirstSegment(y[i2]) & isLastSegment(x[i1]) ### ### (F) isProperPair(x[i1]) == isProperPair(y[i2]) ### ### (G) isSecondaryAlignment(x[i1]) == isSecondaryAlignment(y[i2]) .checkMetadatacols <- function(arg, argname) { if (!is(arg, "GAlignments")) stop("'", argname, "' must be a GAlignments object") if (is.null(names(arg))) stop("'", argname, "' must have names") arg_mcols <- mcols(arg) REQUIRED_COLNAMES <- c("flag", "mrnm", "mpos") if (!all(REQUIRED_COLNAMES %in% colnames(arg_mcols))) { colnames_in1string <- paste0("\"", REQUIRED_COLNAMES, "\"", collapse=", ") stop("required columns in 'mcols(", argname, ")': ", colnames_in1string) } if (!is.integer(arg_mcols$flag)) stop("'mcols(", argname, ")$flag' must be an integer vector") if (!is.factor(arg_mcols$mrnm)) stop("'mcols(", argname, ")$mrnm' must be a factor") if (!identical(levels(arg_mcols$mrnm), levels(seqnames(arg)))) stop("'mcols(", argname, ")$mrnm' and 'seqnames(", argname, ")' ", "must have exactly the same levels in the same order") if (!is.integer(arg_mcols$mpos)) stop("'mcols(", argname, ")$mpos' must be an integer vector") arg_mcols } ### 'names', 'flagbits', 'mrnm', and 'mpos', must all come from the same ### GAlignments object x. ### 'names': names(x). ### 'flagbits': integer matrix (of 0's and 1's) obtained with ### bamFlagAsBitMatrix(mcols(x)$flag, bitnames=.MATING_FLAG_BITNAMES) ### 'mrnm': factor obtained with mcols(x)$mrnm ### 'mpos': integer vector obtained with mcols(x)$mpos ### Returns 'names' with NAs injected at positions corresponding to alignments ### that satisfy at least one of following conditions: ### 1. Bit 0x1 (isPaired) is 0 ### 2. Read is neither first or last mate ### 3. Bit 0x8 (hasUnmappedMate) is 1 ### 4. 'mrnm' is NA (i.e. RNEXT = '*') ### 5. 'mpos' is NA (i.e. PNEXT = 0) ### My understanding of the SAM Spec is that 3., 4. and 5. should happen ### simultaneously even though the Spec don't clearly state this. .MATING_FLAG_BITNAMES <- c("isPaired", "hasUnmappedMate", "isFirstMateRead", "isSecondMateRead") .makeGAlignmentsGNames <- function(names, flagbits, mrnm, mpos) { is_paired <- flagbits[ , "isPaired"] is_first <- flagbits[ , "isFirstMateRead"] is_last <- flagbits[ , "isSecondMateRead"] has_unmappedmate <- flagbits[ , "hasUnmappedMate"] alter_idx <- which(!is_paired | is_first == is_last | has_unmappedmate | is.na(mrnm) | is.na(mpos)) names[alter_idx] <- NA_integer_ names } ### Puts NAs last. .getCharacterOrderAndGroupSizes <- function(x) { x2 <- match(x, x, nomatch=.Machine$integer.max, incomparables=NA_character_) xo <- base::order(x2) ox2 <- Rle(x2[xo]) group.sizes <- runLength(ox2) ngroup <- length(group.sizes) if (ngroup != 0L && runValue(ox2)[ngroup] == .Machine$integer.max) group.sizes <- group.sizes[-ngroup] list(xo=xo, group.sizes=group.sizes) } ### Should return the same as: ### args <- as.list(setNames(rep(TRUE, length(bitnames)), bitnames)) ### tmp <- do.call(scanBamFlag, args) ### tmp[[2L]] - tmp[[1L]] .makeFlagBitmask <- function(bitnames) { bitpos <- match(bitnames, FLAG_BITNAMES) sum(as.integer(2L ^ (bitpos-1L))) } ### 'x_hits' and 'y_hits' must be 2 integer vectors of the same length N ### representing the N edges of a bipartite graph between the [1, x_len] and ### [1, y_len] intervals (the i-th edge being represented by (x[i], y[i])). ### Returns an integer vector F of length 'x_len' where F[k] is defined by: ### - If there is no occurence of k in 'x', then F[k] = NA. ### - If there is more than 1 occurence of k in 'x', then F[k] = 0. ### - If there is exactly 1 occurence of k in 'x', at index i_k, then ### F[k] = y[i_k]. ### In addition, if more than 1 value of index k is associated to F[k], then ### F[k] is replaced by -F[k]. .makeMateIdx2 <- function(x_hits, y_hits, x_len) { idx1 <- which(has_duplicates(y_hits)) y_hits[idx1] <- - y_hits[idx1] idx2 <- which(has_duplicates(x_hits)) y_hits[idx2] <- 0L ans <- rep.int(NA_integer_, x_len) ans[x_hits] <- y_hits ans } .showGAlignmentsEltsWithMoreThan1Mate <- function(x, idx) { if (length(idx) == 0L) return() cat("\n!! Found more than 1 mate for the following elements in 'x': ", paste(idx, collapse=", "), ".\n!! Details:\n!! ", sep="") showGAlignments(x[idx], margin="!! ", print.classinfo=TRUE, print.seqinfo=FALSE) cat("!! ==> won't assign a mate to them!\n") } .dump_envir <- new.env(hash=TRUE, parent=emptyenv()) .dumpEnvir <- function() .dump_envir flushDumpedAlignments <- function() { objnames <- ls(envir=.dumpEnvir()) rm(list=objnames, envir=.dumpEnvir()) } dumpAlignments <- function(gal) { objnames <- ls(envir=.dumpEnvir()) nobj <- length(objnames) if (nobj == 0L) { new_objname <- 1L } else { new_objname <- as.integer(objnames[nobj]) + 1L } new_objname <- sprintf("%08d", new_objname) assign(new_objname, gal, envir=.dumpEnvir()) } countDumpedAlignments <- function() { sum(unlist(eapply(.dumpEnvir(), length, USE.NAMES=FALSE))) } getDumpedAlignments <- function() { objnames <- ls(envir=.dumpEnvir()) args <- unname(mget(objnames, envir=.dumpEnvir())) do.call(c, args) } ### Takes about 2.3 s and 170MB of RAM to mate 1 million alignments, ### and about 13 s and 909MB of RAM to mate 5 million alignments. findMateAlignment <- function(x) { x_names <- names(x) if (is.null(x_names)) stop("'x' must have names") x_mcols <- .checkMetadatacols(x, "x") ## flushDumpedAlignments() must be placed *after* the first reference to ## 'x', otherwise, when doing 'findMateAlignment(getDumpedAlignments())', ## the flushing would happen before 'x' is evaluated, causing 'x' to be ## evaluated to NULL. flushDumpedAlignments() x_flag <- x_mcols$flag bitnames <- c(.MATING_FLAG_BITNAMES, "isMinusStrand", "isMateMinusStrand") x_flagbits <- bamFlagAsBitMatrix(x_flag, bitnames=bitnames) x_mrnm <- x_mcols$mrnm x_mpos <- x_mcols$mpos x_gnames <- .makeGAlignmentsGNames(x_names, x_flagbits, x_mrnm, x_mpos) x_seqnames <- as.factor(seqnames(x)) x_start <- start(x) xo_and_GS <- .getCharacterOrderAndGroupSizes(x_gnames) xo <- xo_and_GS$xo group.sizes <- xo_and_GS$group.sizes ans <- Rsamtools:::.findMateWithinGroups(group.sizes, x_flag[xo], x_seqnames[xo], x_start[xo], x_mrnm[xo], x_mpos[xo]) dumpme_idx <- which(ans <= 0L) if (length(dumpme_idx) != 0L) { dumpAlignments(x[xo[dumpme_idx]]) ans[dumpme_idx] <- NA_integer_ } ans[xo] <- xo[ans] # isn't that cute! dump_count <- countDumpedAlignments() if (dump_count != 0L) warning(" ", dump_count, " alignments with ambiguous pairing ", "were dumped.\n Use 'getDumpedAlignments()' to retrieve ", "them from the dump environment.") ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### makeGAlignmentPairs(). ### ### TODO: Make isFirstSegment() an S4 generic function with methods for ### matrices, integer vectors, and GAlignments objects. Put this with the ### flag utils in Rsamtools. .isFirstSegment.matrix <- function(x) { is_paired <- as.logical(x[ , "isPaired"]) is_first0 <- as.logical(x[ , "isFirstMateRead"]) is_last0 <- as.logical(x[ , "isSecondMateRead"]) ## According to SAM Spec, bits 0x40 (isFirstMateRead) and 0x80 ## (isSecondMateRead) can both be set or unset, even when bit 0x1 ## (isPaired) is set. However we are not interested in those situations ## (which have a special meaning). is_paired & is_first0 & (!is_last0) } .isFirstSegment.integer <- function(flag) { bitnames <- c("isPaired", "isFirstMateRead", "isSecondMateRead") .isFirstSegment.matrix(bamFlagAsBitMatrix(flag, bitnames=bitnames)) } .isFirstSegment.GAlignments <- function(x) .isFirstSegment.integer(mcols(x, use.names=FALSE)$flag) ### TODO: Make isLastSegment() an S4 generic function with methods for ### matrices, integer vectors, and GAlignments objects. Put this with the ### flag utils in Rsamtools. .isLastSegment.matrix <- function(x) { is_paired <- as.logical(x[ , "isPaired"]) is_first0 <- as.logical(x[ , "isFirstMateRead"]) is_last0 <- as.logical(x[ , "isSecondMateRead"]) ## According to SAM Spec, bits 0x40 (isFirstMateRead) and 0x80 ## (isSecondMateRead) can both be set or unset, even when bit 0x1 ## (isPaired) is set. However we are not interested in those situations ## (which have a special meaning). is_paired & is_last0 & (!is_first0) } .isLastSegment.integer <- function(flag) { bitnames <- c("isPaired", "isFirstMateRead", "isSecondMateRead") .isLastSegment.matrix(bamFlagAsBitMatrix(flag, bitnames=bitnames)) } .isLastSegment.GAlignments <- function(x) .isLastSegment.integer(mcols(x, use.names=FALSE)$flag) ### 'x' must be a GAlignments objects. makeGAlignmentPairs <- function(x, use.names=FALSE, use.mcols=FALSE, strandMode=1) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) { if (!is.character(use.mcols)) stop("'use.mcols' must be TRUE or FALSE or a character vector ", "specifying the metadata columns to propagate") if (!all(use.mcols %in% colnames(mcols(x, use.names=FALSE)))) stop("'use.mcols' must be a subset of 'colnames(mcols(x))'") } mate <- findMateAlignment(x) x_is_first <- .isFirstSegment.GAlignments(x) x_is_last <- .isLastSegment.GAlignments(x) first_idx <- which(!is.na(mate) & x_is_first) last_idx <- mate[first_idx] ## Fundamental property of the 'mate' vector: it's a permutation of order ## 2 and with no fixed point on the set of indices for which 'mate' is ## not NA. ## Check there are no fixed points. if (!all(first_idx != last_idx)) stop("findMateAlignment() returned an invalid 'mate' vector") ## Check order 2 (i.e. permuting a 2nd time brings back the original ## set of indices). if (!identical(mate[last_idx], first_idx)) stop("findMateAlignment() returned an invalid 'mate' vector") ## One more sanity check. if (!all(x_is_last[last_idx])) stop("findMateAlignment() returned an invalid 'mate' vector") ## Check the 0x2 bit (isProperPair). x_is_proper <- as.logical(bamFlagAsBitMatrix(mcols(x, use.names=FALSE)$flag, bitnames="isProperPair")) ans_is_proper <- x_is_proper[first_idx] ## The big split! ans_first <- x[first_idx] ans_last <- x[last_idx] ans_names <- NULL if (use.names) ans_names <- names(ans_first) names(ans_first) <- names(ans_last) <- NULL if (is.character(use.mcols)) { mcols(ans_first) <- mcols(ans_first, use.names=FALSE)[use.mcols] mcols(ans_last) <- mcols(ans_last, use.names=FALSE)[use.mcols] } else if (!use.mcols) { mcols(ans_first) <- mcols(ans_last) <- NULL } GAlignmentPairs(ans_first, ans_last, strandMode=strandMode, isProperPair=ans_is_proper, names=ans_names) } GenomicAlignments/R/findOverlaps-methods.R0000644000175200017520000001471114516004601021621 0ustar00biocbuildbiocbuild### ========================================================================= ### findOverlaps methods ### ------------------------------------------------------------------------- setMethod("findOverlaps", c("GAlignments", "Vector"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(grglist(query), subject, maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) setMethod("findOverlaps", c("Vector", "GAlignments"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(query, grglist(subject), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) ### Not strictly needed! Defining the above 2 methods covers that case but ### with the following note: ### > findOverlaps(al1, al0) ### Note: Method with signature "GAlignments#ANY" chosen for ### function "findOverlaps", target signature ### "GAlignments#GAlignments". ### "ANY#GAlignments" would also be valid setMethod("findOverlaps", c("GAlignments", "GAlignments"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(grglist(query), grglist(subject), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) setMethod("findOverlaps", c("GAlignmentPairs", "Vector"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(grglist(query), subject, maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) setMethod("findOverlaps", c("Vector", "GAlignmentPairs"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(query, grglist(subject), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) setMethod("findOverlaps", c("GAlignmentPairs", "GAlignmentPairs"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(grglist(query), grglist(subject), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) setMethod("findOverlaps", c("GAlignmentsList", "Vector"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { hits <- findOverlaps(grglist(unlist(query, use.names = FALSE)), subject, maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) ## TODO: Replace 'factor(togroup(PartitioningByWidth(...)))' with ## 'as.factor(PartitioningByWidth(...))' when "as.factor" method for ## ManyToOneGrouping objects becomes available. query_map <- factor(togroup(PartitioningByWidth(query))) remapHits(hits, Lnodes.remapping=query_map) } ) setMethod("findOverlaps", c("Vector", "GAlignmentsList"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { hits <- findOverlaps(query, grglist(unlist(subject, use.names = FALSE)), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) ## TODO: Replace 'factor(togroup(PartitioningByWidth(...)))' with ## 'as.factor(PartitioningByWidth(...))' when "as.factor" method for ## ManyToOneGrouping objects becomes available. subject_map <- factor(togroup(PartitioningByWidth(subject))) remapHits(hits, Rnodes.remapping=subject_map) } ) setMethod("findOverlaps", c("GAlignmentsList", "GAlignmentsList"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { hits <- findOverlaps(grglist(unlist(query, use.names = FALSE)), grglist(unlist(subject, use.names = FALSE)), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) ## TODO: Replace 'factor(togroup(PartitioningByWidth(...)))' with ## 'as.factor(PartitioningByWidth(...))' when "as.factor" method for ## ManyToOneGrouping objects becomes available. query_map <- factor(togroup(PartitioningByWidth(query))) subject_map <- factor(togroup(PartitioningByWidth(subject))) remapHits(hits, Lnodes.remapping=query_map, Rnodes.remapping=subject_map) } ) GenomicAlignments/R/findSpliceOverlaps-methods.R0000644000175200017520000003031614516004601022760 0ustar00biocbuildbiocbuild### ========================================================================= ### "findSpliceOverlaps" methods ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Low-level helper functions ### .rangeForSorted <- function(x) { part <- PartitioningByWidth(x) xflat <- unlist(x, use.names=FALSE) IRanges(start(xflat)[start(part)], end(xflat)[end(part)]) } .compatibleTranscription <- function(query, subject, splice, clip=0L) { qrng <- ranges(query) srng <- ranges(subject) sprng <- ranges(splice) ## FIXME : should clip be a modifiable parameter? ## Or we could consider taking it out entirely... the aligner should clip if (clip != 0L) { bounds <- .rangeForSorted(qrng) - clip qrange <- restrict(qrng, start(bounds), end(bounds), keep.all.ranges = TRUE) } bnds <- elementNROWS(setdiff(qrng, srng)) == 0L splc <- elementNROWS(intersect(srng, sprng)) == 0L bnds & splc } .novelBounds <- function(query, subject, qhits) { qrange <- range(query) qstrand <- as.character(strand(qrange)) qrange <- unlist(qrange, use.names=FALSE) srange <- unlist(range(subject), use.names=FALSE) ## bounds violation for each match lviol <- start(qrange) < start(srange) rviol <- end(qrange) > end(srange) TSSviol <- as.logical(ifelse(qstrand != "-", lviol, rviol)) TSEviol <- as.logical(ifelse(qstrand != "+", lviol, rviol)) ## bounds violation across all subjects hit (grouped) lviol <- start(qrange) == start(srange) rviol <- end(qrange) == end(srange) TSSmatch <- as.logical(ifelse(qstrand != "-", lviol, rviol)) TSEmatch <- as.logical(ifelse(qstrand != "+", lviol, rviol)) TSSgroup <- (rowsum(as.integer(TSSmatch), qhits)[,1] > 0L)[factor(qhits)] TSEgroup <- (rowsum(as.integer(TSEmatch), qhits)[,1] > 0L)[factor(qhits)] TSS <- TSSviol & !TSSgroup TSE <- TSEviol & !TSEgroup DataFrame(TSS=TSS, TSE=TSE) } .allMatch <- function(x, idx) { (rowsum(as.integer(x), idx)[,1] == table(idx))[idx] } .oneMatch <- function(x, idx) { xcnt <- rowsum(as.integer(x), idx)[,1] oneMatch <- rep((xcnt == 1L), table(idx)) unname(x & oneMatch) } .novelExon <- function(splice, intronRegion) { splice_eltNROWS <- elementNROWS(splice) if (sum(splice_eltNROWS) == 0L) return(logical(length(splice))) ## subset on elements with splices ans <- logical(length(splice)) idx <- splice_eltNROWS > 0L splice <- splice[idx] internal <- unlist(.gaps(splice), use.names=FALSE) if (sum(length(internal)) == 0L) return(ans) ## FIXME : not competely "within" hits <- findOverlaps(internal, intronRegion, ignore.strand=TRUE) if (length(hits) > 0L) { ans0 <- logical(length(splice)) togroup <- togroup(PartitioningByWidth(splice), j=queryHits(hits)) ne <- table(togroup) == 1L ans0[unique(togroup)] <- ne ans[idx] <- ans0 ans } ans } .novelSpliceEvent <- function(splice, intron) { splice_eltNROWS <- elementNROWS(splice) intron_eltNROWS <- elementNROWS(intron) if (sum(splice_eltNROWS) == 0L | sum(intron_eltNROWS) == 0L) DataFrame(Site=rep.int(FALSE, length(splice)), Junction=rep.int(FALSE, length(splice))) ## subset on elements with splices site <- junction <- rep.int(FALSE, length(splice)) idx <- splice_eltNROWS > 0L splice <- splice[idx] intron <- intron[idx] iflat <- unlist(intron, use.names=FALSE) sflat <- unlist(splice, use.names=FALSE) site[idx] <- .spliceEvent("site", iflat, sflat, splice) junction[idx] <- .spliceEvent("junction", iflat, sflat, splice) DataFrame(Site=site, Junction=junction) } .spliceEvent <- function(type, iflat, sflat, splice) { elt <- togroup(PartitioningByWidth(splice)) if (type == "site") { combiner <- c elt <- rep(elt, each=2) } else if (type == "junction") { combiner <- paste } ikeys <- paste(seqnames(iflat), combiner(start(iflat), end(iflat)), strand(iflat), sep = ":") skeys <- paste(seqnames(sflat), combiner(start(sflat), end(sflat)), strand(sflat), sep = ":") novel <- !(skeys %in% ikeys) rowsum(as.integer(novel), elt) > 0L } .novelRetention <- function(query, intronRegion) { ans <- logical(length(query)) if (length(query) == 0L) return(ans) hits <- findOverlaps(unlist(query, use.names=FALSE), intronRegion, ignore.strand=TRUE) if (length(hits) > 0L) { togroup <- togroup(PartitioningByWidth(query), j=queryHits(hits)) ans[unique(togroup)] <- TRUE } ans } .intronicRegions <- function(tx, intron) { txflt <- unlist(tx, use.names = FALSE) intronflt <- unlist(intron, use.names = FALSE) regions <- setdiff(intronflt, txflt, ignore.strand = TRUE) #map <- findOverlaps(regions, intronflt) #mcols(regions)$tx_id <- # splitAsList(names(tx)[togroup(introns)][subjectHits(intronic_to_tx)], # queryHits(intronic_to_tx)) regions } .result <- function(hits, nc=NULL, compatible=NULL, unique=NULL, coding=NULL, strandSpecific=NULL, novelTSS=NULL, novelTSE=NULL, novelSite=NULL, novelJunction=NULL, novelExon=NULL, novelRetention=NULL) { nms <- c("compatible", "unique", "coding", "strandSpecific", "novelTSS", "novelTSE", "novelSite", "novelJunction", "novelExon", "novelRetention") ## full result if (!is.null(nc)) { mcols(hits) <- DataFrame(compatible, unique, coding, strandSpecific, novelTSS, novelTSE, novelSite, novelJunction, novelExon, novelRetention) hits ## no overlaps } else if (is.null(compatible)) { mat <- matrix(logical(0), length(hits), length(nms)) mcols(hits) <- DataFrame(mat) names(mcols(hits)) <- nms hits ## no compatible overlaps } else { mat <- matrix(FALSE, length(hits), length(nms)) mcols(hits) <- DataFrame(cbind(compatible, unique, coding, strandSpecific, mat)) names(mcols(hits)) <- nms hits } } .insertGaps <- function(reads) { query.break <- mcols(reads, use.names=FALSE)$query.break if (is.null(query.break)) stop("missing 'query.break' metadata variable: reads not paired?") reads_flat <- unlist(reads, use.names = FALSE) reads_part <- PartitioningByWidth(reads) left_end <- start(reads_part) + query.break - 1L right_start <- left_end + 1L start <- end(reads_flat)[left_end] end <- pmax(start(reads_flat)[right_start], start - 1L) if (any(seqnames(reads_flat)[left_end] != seqnames(reads_flat)[right_start])) stop("reads are on different chromosomes") GRanges(seqnames(reads_flat)[left_end], IRanges(start, end), strand(reads_flat)[left_end]) } ## Until we have the formal 'gaps' method for GRangeList .isNumericOrNAs <- S4Vectors:::isNumericOrNAs .gaps <- function(x, start=NA, end=NA) { if (!.isNumericOrNAs(start)) stop("'start' must be an integer vector or NA") if (!is.integer(start)) start <- as.integer(start) if (!.isNumericOrNAs(end)) stop("'end' must be an integer vector or NA") if (!is.integer(end)) end <- as.integer(end) ## seqname and strand consistent in list elements if (all(elementNROWS(runValue(seqnames(x))) == 1L) && all(elementNROWS(runValue(strand(x))) == 1L)) { flat <- unlist(x, use.names=FALSE) gaps <- gaps(ranges(x), start, end) ### FIXME: this makes this function more of an 'introns' than a .gaps. ### FIXME: this breaks when the GRangesList is not ordered by position if (!is.null(mcols(x, use.names=FALSE)$query.break)) { insert_gaps <- as(ranges(.insertGaps(x)), "CompressedIRangesList") gaps <- setdiff(gaps, insert_gaps) } idx <- elementNROWS(gaps) != 0 ## FIXME : can't handle lists with empty elements ## 'start' and 'end' not quite right here firstseg <- start(PartitioningByWidth(x)) seqnms <- rep(seqnames(flat)[firstseg], elementNROWS(gaps)) strand <- rep(strand(flat)[firstseg], elementNROWS(gaps)) gr <- relist(GRanges(seqnms, unlist(gaps, use.names=FALSE), strand), gaps) gr } else { ### FIXME: does not handle query.break column yet setdiff(range(x), x) } } .findSpliceOverlaps <- function(query, subject, ignore.strand=FALSE, cds=NULL) { ## adjust strand based on 'XS' if (!is.null(xs <- mcols(query, use.names=FALSE)$XS)) { strand <- ifelse(!is.na(xs), xs, "*") strand(query) <- relist(Rle(strand, elementNROWS(query)), query) } ## NOTE: this misses reads completely within an intron, but this ## is intentional: a read is only assigned to a transcript if it ## hits an exon. Otherwise, it could be from another gene inside ## an intron (happens frequently). olap <- findOverlaps(query, subject, ignore.strand=ignore.strand) if (length(olap) == 0L) return(.result(olap)) if (!is.null(cds)) { coding <- logical(length(olap)) hits <- findOverlaps(query, cds, ignore.strand=ignore.strand) coding[queryHits(olap) %in% queryHits(hits)] <- TRUE } else { coding <- rep.int(NA, length(olap)) } query <- query[queryHits(olap)] subject <- subject[subjectHits(olap)] splice <- .gaps(query) compatible <- .compatibleTranscription(query, subject, splice) unique <- .oneMatch(compatible, queryHits(olap)) strandSpecific <- all(strand(query) != "*") mcols(olap) <- DataFrame(compatible, unique, coding, strandSpecific) olap } setGeneric("findSpliceOverlaps", signature=c("query", "subject"), function(query, subject, ignore.strand=FALSE, ...) standardGeneric("findSpliceOverlaps") ) setMethod("findSpliceOverlaps", c("GRangesList", "GRangesList"), function(query, subject, ignore.strand=FALSE, ..., cds=NULL) { .findSpliceOverlaps(query, subject, ignore.strand, cds=cds) }) setMethod("findSpliceOverlaps", c("GAlignments", "GRangesList"), function(query, subject, ignore.strand=FALSE, ..., cds=NULL) { findSpliceOverlaps(grglist(query, order.as.in.query=TRUE), subject, ignore.strand, ..., cds=cds) }) setMethod("findSpliceOverlaps", c("GAlignmentPairs", "GRangesList"), function(query, subject, ignore.strand=FALSE, ..., cds=NULL) { ### FIXME: ### instead of relying on query.break column, maybe we should add a ### 'splice = .gaps(query)' argument to .findSpliceOverlaps that we ### set to junctions(query) here. The downside is that a GRangesList ### derived from GAlignmentPairs will no longer work. findSpliceOverlaps(grglist(query), subject, ignore.strand, ..., cds=cds) }) setMethod("findSpliceOverlaps", c("character", "ANY"), function(query, subject, ignore.strand=FALSE, ..., param=ScanBamParam(), singleEnd=TRUE) { findSpliceOverlaps(BamFile(query), subject, ignore.strand, ..., param=param, singleEnd=singleEnd) }) setMethod("findSpliceOverlaps", c("BamFile", "ANY"), function(query, subject, ignore.strand=FALSE, ..., param=ScanBamParam(), singleEnd=TRUE) { findSpliceOverlaps(.readRanges(query, param, singleEnd), subject, ignore.strand, ...) }) .readRanges <- function(bam, param, singleEnd) { if (!"XS" %in% bamTag(param)) bamTag(param) <- c(bamTag(param), "XS") if (singleEnd) reads <- readGAlignments(bam, param=param) else { reads <- readGAlignmentPairs(path(bam), param=param) first_xs <- mcols(first(reads), use.names=FALSE)$XS last_xs <- mcols(last(reads), use.names=FALSE)$XS if (!is.null(first_xs) && !is.null(last_xs)) { xs <- first_xs xs[is.na(xs)] <- last_xs[is.na(xs)] mcols(reads)$XS <- xs } } metadata(reads)$bamfile <- bam reads } GenomicAlignments/R/intra-range-methods.R0000644000175200017520000000641614516004601021377 0ustar00biocbuildbiocbuild### ========================================================================= ### Intra-range methods ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### updateCigarAndStart() -- NOT exported ### setGeneric("updateCigarAndStart", function(x, cigar=NULL, start=NULL) standardGeneric("updateCigarAndStart") ) setMethod("updateCigarAndStart", "GAlignments", function(x, cigar=NULL, start=NULL) { if (is.null(cigar)) { cigar <- cigar(x) } else { if (!is.character(cigar) || length(cigar) != length(x)) stop("when not NULL, 'cigar' must be a character vector ", "of the same length as 'x'") ## There might be an "rshift" attribute on 'cigar', typically. ## We want to get rid of it as well as any other potential ## attribute like names, dim, dimnames etc... attributes(cigar) <- NULL } if (is.null(start)) start <- start(x) else if (!is.integer(start) || length(start) != length(x)) stop("when not NULL, 'start' must be an integer vector ", "of the same length as 'x'") x@cigar <- cigar x@start <- start x } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### narrow() ### ### The default "narrow" method calls windows() so we only need to implement ### a "windows" method for GAlignments objects to make narrow() work on these ### objects. setMethod("windows", "GAlignments", function(x, start=NA, end=NA, width=NA) .narrowGAlignments(x, cigarNarrow, start, end, width) ) setMethod("narrow", "GappedReads", function(x, start=NA, end=NA, width=NA, use.names=TRUE) { stop("coming soon") ## ans_cigar <- cigarNarrow(cigar(x), ## start=start, end=end, width=width) ## ans_start <- start(x) + attr(ans_cigar, "rshift") ## updateCigarAndStart(x, cigar=ans_cigar, start=ans_start) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### qnarrow() ### setGeneric("qnarrow", signature="x", function(x, start=NA, end=NA, width=NA) standardGeneric("qnarrow") ) .narrowGAlignments <- function(x, CIGAR_CUTTER, start, end, width) { ans_cigar <- CIGAR_CUTTER(cigar(x), start=start, end=end, width=width) ans_start <- start(x) + attr(ans_cigar, "rshift") updateCigarAndStart(x, cigar=ans_cigar, start=ans_start) } setMethod("qnarrow", "GAlignments", function(x, start=NA, end=NA, width=NA) .narrowGAlignments(x, cigarQNarrow, start, end, width) ) setMethod("qnarrow", "GAlignmentsList", function(x, start=NA, end=NA, width=NA) { gal <- qnarrow(x@unlistData, start=start, end=end, width=width) relist(gal, x@partitioning) } ) setMethod("qnarrow", "GappedReads", function(x, start=NA, end=NA, width=NA) { stop("coming soon") ## ans_cigar <- cigarQNarrow(cigar(x), ## start=start, end=end, width=width) ## ans_start <- start(x) + attr(ans_cigar, "rshift") ## updateCigarAndStart(x, cigar=ans_cigar, start=ans_start) } ) GenomicAlignments/R/junctions-methods.R0000644000175200017520000003355014516004601021203 0ustar00biocbuildbiocbuild### ========================================================================= ### Extract junctions from genomic alignments ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### junctions() generic and methods. ### setGeneric("junctions", signature="x", function(x, use.mcols=FALSE, ...) standardGeneric("junctions") ) setMethod("junctions", "GAlignments", function(x, use.mcols=FALSE) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") rgl <- cigarRangesAlongReferenceSpace(cigar(x), pos=start(x), ops="N") names(rgl) <- names(x) ans <- make_GRangesList_from_CompressedIRangesList(rgl, seqnames(x), strand(x), seqinfo(x)) if (use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) setMethod("junctions", "GAlignmentPairs", function(x, use.mcols=FALSE) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") first_junctions <- junctions(first(x, real.strand=TRUE)) last_junctions <- junctions(last(x, real.strand=TRUE)) ## pc() is a fast "parallel c()" for list-like objects. ## In the case below, it's equivalent to (but faster than) doing ## 'mendoapply(c, first_junctions, last_junctions)'. ans <- pc(first_junctions, last_junctions) if (use.mcols) { mcols(ans) <- mcols(x, use.names=FALSE) } else { mcols(ans) <- NULL } ans } ) setMethod("junctions", "GAlignmentsList", function(x, use.mcols=FALSE, ignore.strand=FALSE) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") if (!isTRUEorFALSE(ignore.strand)) stop("'ignore.strand' must be TRUE or FALSE") if (ignore.strand) strand(x@unlistData) <- "*" grl <- junctions(x@unlistData) ans_breakpoints <- end(grl@partitioning)[end(x@partitioning)] ans_partitioning <- PartitioningByEnd(ans_breakpoints, names=names(x)) ans <- relist(grl@unlistData, ans_partitioning) if (use.mcols) mcols(ans) <- mcols(x, use.names=FALSE) ans } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Natural intron motifs taken from: ### http://www.ncbi.nlm.nih.gov/pmc/articles/PMC84117/ NATURAL_INTRON_MOTIFS <- c("GT-AG", "GC-AG", "AT-AC", "AT-AA", "AT-AG") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### summarizeJunctions() ### .extract_unoriented_intron_motif <- function(genome, junctions) { mcols(junctions) <- NULL junctions_len <- length(junctions) Ldinucl_gr <- Rdinucl_gr <- junctions end(Ldinucl_gr) <- start(Ldinucl_gr) + 1L start(Rdinucl_gr) <- end(Rdinucl_gr) - 1L all_dinucl <- getSeq(genome, c(Ldinucl_gr, Rdinucl_gr)) Ldinucl <- head(all_dinucl, n=junctions_len) Rdinucl <- tail(all_dinucl, n=junctions_len) xscat(Ldinucl, rep.int("-", junctions_len), Rdinucl) } .infer_intron_strand <- function(unoriented_intron_motif) { natural_intron_motifs <- DNAStringSet(NATURAL_INTRON_MOTIFS) intron_strand <- rep.int(NA, length(unoriented_intron_motif)) idx <- which(unoriented_intron_motif %in% natural_intron_motifs) intron_strand[idx] <- FALSE idx <- which(unoriented_intron_motif %in% reverseComplement(natural_intron_motifs)) intron_strand[idx] <- TRUE if (any(is.na(intron_strand))) warning("For some junctions, the dinucleotides found at the intron ", "boundaries don't\n match any of the natural intron motifs ", "stored in predefined character vector\n ", "'NATURAL_INTRON_MOTIFS'. For these junctions, the ", "intron_motif and\n intron_strand metadata columns ", "were set to NA and *, respectively.") strand(intron_strand) } .orient_intron_motif <- function(unoriented_intron_motif, intron_strand) { ans <- unoriented_intron_motif idx <- which(intron_strand == "-") ans[idx] <- reverseComplement(ans[idx]) ans <- factor(as.character(ans), levels=NATURAL_INTRON_MOTIFS) } summarizeJunctions <- function(x, with.revmap=FALSE, genome=NULL) { if (!isTRUEorFALSE(with.revmap)) stop("'with.revmap' must be TRUE or FALSE") if (!is.null(genome)) { if (!requireNamespace("BSgenome", quietly=TRUE)) stop(wmsg("Couldn't load the BSgenome package. Please install ", "the BSgenome package in order to use the 'genome' ", "argument.")) genome <- BSgenome::getBSgenome(genome) } x_junctions <- junctions(x) if (!is.null(genome)) { si1 <- seqinfo(x_junctions) si2 <- seqinfo(genome) seqinfo(x_junctions) <- suppressWarnings(merge(si1, si2)) if (length(intersect(seqlevels(si1), seqlevels(si2))) == 0L) warning(wmsg("the genome specified via the 'genome' argument ", "doesn't seem to be the same as the reference ", "genome used for the alignments in 'x'")) } unlisted_junctions <- unlist(x_junctions, use.names=FALSE) unstranded_unlisted_junctions <- unstrand(unlisted_junctions) ans <- sort(unique(unstranded_unlisted_junctions)) unq2dups <- as(findMatches(ans, unstranded_unlisted_junctions), "List") ans_score <- elementNROWS(unq2dups) tmp <- extractList(strand(unlisted_junctions), unq2dups) ans_plus_score <- sum(tmp == "+") ans_minus_score <- sum(tmp == "-") ans_mcols <- DataFrame(score=ans_score, plus_score=ans_plus_score, minus_score=ans_minus_score) if (with.revmap) { crossed_by <- togroup(PartitioningByWidth(x_junctions)) ans_revmap <- extractList(crossed_by, unq2dups) ## 'ans_revmap' should never contain duplicates when 'x' is a ## GAlignments object, because a given junction can show up at most ## once per SAM/BAM record (i.e. per element in 'x', or per alignment). ## This doesn't hold anymore if the elements in 'x' consist of more ## than 1 SAM/BAM record (or alignment) e.g. if 'x' is a ## GAlignmentPairs or GAlignmentsList object, because, in that case, ## the same junction can show up more than once per element in 'x'. if (!is(x, "GAlignments")) ans_revmap <- unique(ans_revmap) ans_mcols$revmap <- ans_revmap } if (!is.null(genome)) { unoriented_intron_motif <- .extract_unoriented_intron_motif(genome, ans) ans_intron_strand <- .infer_intron_strand(unoriented_intron_motif) ans_intron_motif <- .orient_intron_motif(unoriented_intron_motif, ans_intron_strand) ans_mcols <- cbind(ans_mcols, DataFrame(intron_motif=ans_intron_motif, intron_strand=ans_intron_strand)) } mcols(ans) <- ans_mcols ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readTopHatJunctions() ### ### Read splice junctions file (junctions.bed) generated by the TopHat ### aligner into a GRanges object. ### Usage: ### readTopHatJunctions("junctions.bed") ### ### Comparing with output of bed_to_juncs script (assuming the ### 'new_list.juncs' file was obtained by passing 'junctions.bed' thru ### bed_to_juncs): ### junctions1 <- readTopHatJunctions("junctions.bed") ### junctions2 <- readTopHatJunctions("new_list.juncs", ### file.is.raw.juncs=TRUE) ### stopifnot(all(junctions1 == junctions2)) ### .bed_to_Juncs <- function(x) { if (!is(x, "GRanges")) stop("'x' must be a GRanges object") if (!identical(mcols(x, use.names=FALSE)$thick, ranges(x))) stop("this BED file doesn't look like the junctions.bed file ", "generated by TopHat") blocks <- mcols(x, use.names=FALSE)$blocks stopifnot(all(elementNROWS(blocks) == 2L)) unlisted_blocks <- unlist(blocks, use.names=FALSE) even_idx <- 2L * seq_along(x) odd_idx <- even_idx - 1L ans_start <- start(x) + end(unlisted_blocks)[odd_idx] ans_end <- start(x) + start(unlisted_blocks)[even_idx] - 2L ans <- GRanges(seqnames(x), IRanges(ans_start, ans_end), strand=strand(x)) mcols(ans) <- DataFrame(name=mcols(x, use.names=FALSE)$name, score=as.integer(mcols(x, use.names=FALSE)$score)) ans } ### 'file' must be the path or a connection object to a junctions.bed file as ### generated by TopHat, or to a tab-delimited file obtained by running ### TopHat's bed_to_juncs script on a junctions.bed file. ### Returns the junctions in a GRanges object. ### IMPORTANT NOTE: readTopHatJunctions() does NOT follow the convention used ### by TopHat that describes a junction by the position of the nucleotide ### immediately before and after the intron. In the GRanges object returned ### by readTopHatJunctions(), a junction is considered to start at the ### left-most and to end at the right-most nucleotide of the intron. readTopHatJunctions <- function(file, file.is.raw.juncs=FALSE) { if (!isTRUEorFALSE(file.is.raw.juncs)) stop("'file.is.raw.juncs' must be TRUE or FALSE") if (is.character(file)) { if (!isSingleString(file)) stop("'file' must be a single string") file_ext0 <- ".bed" file_ext <- substr(file, start=nchar(file) - nchar(file_ext0) + 1L, stop=nchar(file)) if (file.is.raw.juncs) { if (file_ext == file_ext0) stop("'file.is.raw.juncs=TRUE' is not aimed to be ", "used on a file\n with the .bed extension") df <- read.table(file, stringsAsFactors=FALSE) ## The 2nd and 3rd columns in 'new_list.juncs' are the left and ## right positions of the junctions, respectively. The convention ## used by TopHat is that these are NOT the positions of the ## left-most and right-most nucleotides of the intron, but rather ## the positions immediately before and after, respectively, that ## is, the last and the first positions of the flanking exons. ## Also these positions are *both* 0-based. ans_ranges <- IRanges(df[[2L]] + 2L, df[[3L]]) ans <- GRanges(df[[1L]], ans_ranges, strand=df[[4L]]) return(ans) } if (file_ext != file_ext0) warning("'file' has no .bed extension, suggesting it may not ", "be a junctions.bed\n file as generated by TopHat. ", "I will assume it is this file anyway (or a BED\n file ", "with similar content). If 'file' is a tab-delimited ", "file obtained\n by running TopHat's bed_to_juncs script ", "on a junctions.bed file, you\n should use ", "'file.is.raw.juncs=TRUE'") } junctions_bed <- rtracklayer::import(file) .bed_to_Juncs(junctions_bed) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readSTARJunctions() ### ### Read splice junctions file (SJ.out.tab) generated by the STAR aligner ### into a GRanges object. ### Usage: ### readSTARJunctions("SJ.out.tab") ### .STAR_INTRON_MOTIFS <- c("GT-AG", "CT-AC", "GC-AG", "CT-GC", "AT-AC", "GT-AT") .get_STAR_intron_motif_levels <- function() { ans <- .STAR_INTRON_MOTIFS[(1:3)*2L - 1L] stopifnot(all(ans == NATURAL_INTRON_MOTIFS[1:3])) rev_motifs <- .STAR_INTRON_MOTIFS[(1:3)*2L] stopifnot(all(rev_motifs == reverseComplement(DNAStringSet(ans)))) ans } readSTARJunctions <- function(file) { motif123 <- .get_STAR_intron_motif_levels() df <- read.table(file, stringsAsFactors=FALSE) ans_seqnames <- df[[1L]] ans_start <- df[[2L]] ans_end <- df[[3L]] ans_strand <- strand(df[[4L]] == 2L) STAR_intron_motif_code <- df[[5L]] if (!is.integer(ans_start) || !is.integer(ans_end) || !is.integer(STAR_intron_motif_code) || S4Vectors:::anyMissingOrOutside(STAR_intron_motif_code, lower=0L, upper=6L)) stop("'file' does not look like a junction file generated ", "by the STAR aligner (normally the SJ.out.tab file)") STAR_intron_motif_code[STAR_intron_motif_code == 0L] <- NA_integer_ code1 <- STAR_intron_motif_code + 1L ans_intron_motif <- factor(motif123[code1 %/% 2L], levels=motif123) ans_intron_strand <- strand(as.logical(code1 %% 2L)) has_code_zero <- is.na(ans_intron_motif) stopifnot(identical(has_code_zero, ans_intron_strand == "*")) idx0 <- which(!has_code_zero) if (!identical(ans_strand[idx0], ans_intron_strand[idx0])) warning("For some junctions, the strand reported in the motif_strand ", "metadata column\n (which was inferred from the STAR intron ", "motif code stored in column 5 of\n 'file') is conflicting ", "with the strand of the junction reported in column 4\n ", "of 'file'. Bug in STAR? Obscure feature? Or corrupted file? ", "Please ask on the\n STAR general user mailing list ", "(https://groups.google.com/d/forum/rna-star)\n for ", "clarifications about this (only if you're confident that ", "your SJ.out.tab\n file is not corrupted though).") GRanges(ans_seqnames, IRanges(ans_start, ans_end), strand=ans_strand, intron_motif=ans_intron_motif, intron_strand=ans_intron_strand, um_reads=df[[7L]], mm_reads=df[[8L]]) } GenomicAlignments/R/pileLettersAt.R0000644000175200017520000001105114516004601020277 0ustar00biocbuildbiocbuild### ========================================================================= ### pileLettersAt() ### ------------------------------------------------------------------------- ### .pileLettersOnSingleRefAt() is the workhorse behind pileLettersAt(). ### 'x', 'pos', 'cigar': 3 parallel vectors describing N strings aligned ### to the same reference sequence. 'x' must be an XStringSet (typically ### DNAStringSet) object containing the unaligned strings (a.k.a. the ### query sequences) reported with respect to the + strand. 'pos' must ### be an integer vector where 'pos[i]' is the 1-based position on the ### reference sequence of the first aligned letter in 'x[[i]]'. 'cigar' ### must be a character vector containing the extended CIGAR strings. ### 'at': must be an integer vector containing the positions of interest ### with respect to the reference sequence. ### Returns an XStringSet (typically DNAStringSet) object parallel to ### 'at' (i.e. with 1 string per position of interest). .pileLettersOnSingleRefAt <- function(x, pos, cigar, at) { stopifnot(is(x, "XStringSet")) N <- length(x) # nb of alignments stopifnot(is.integer(pos) && length(pos) == N) stopifnot(is.character(cigar) && length(cigar) == N) stopifnot(is.integer(at)) ops <- c("M", "=", "X") ranges_on_ref <- cigarRangesAlongReferenceSpace(cigar, pos=pos, ops=ops) ranges_on_query <- cigarRangesAlongQuerySpace(cigar, ops=ops) ## 'ranges_on_ref' and 'ranges_on_query' are IRangesList objects parallel ## to 'x', 'pos', and 'cigar'. In addition, the 2 IRangesList objects ## have the same "shape" (i.e. same elementNROWS()), so, after ## unlisting, the 2 unlisted objects are parallel IRanges objects. unlisted_ranges_on_ref <- unlist(ranges_on_ref, use.names=FALSE) unlisted_ranges_on_query <- unlist(ranges_on_query, use.names=FALSE) ## 2 integer vectors parallel to IRanges objects 'unlisted_ranges_on_ref' ## and 'unlisted_ranges_on_query' above. range_group <- togroup(PartitioningByWidth(ranges_on_ref)) query2ref_shift <- start(unlisted_ranges_on_ref) - start(unlisted_ranges_on_query) hits <- findOverlaps(at, unlisted_ranges_on_ref) hits_at_in_x <- at[queryHits(hits)] - query2ref_shift[subjectHits(hits)] hits_group <- range_group[subjectHits(hits)] unlisted_piles <- subseq(x[hits_group], start=hits_at_in_x, width=1L) piles_skeleton <- PartitioningByEnd(queryHits(hits), NG=length(at), names=names(at)) piles <- relist(unlisted_piles, piles_skeleton) unstrsplit(piles) } ### 'x', 'seqnames', 'pos', 'cigar': 4 parallel vectors describing N ### aligned strings. 'x', 'pos', and 'cigar' as above. 'seqnames' must ### be a factor-Rle where 'seqnames[i]' is the name of the reference ### sequence of the i-th alignment. ### 'at': must be a GPos object containing the genomic positions of ### interest. 'seqlevels(at)' must be identical to 'levels(seqnames)'. ### Returns an XStringSet (typically DNAStringSet) object parallel to ### 'at' (i.e. with 1 string per genomic position of interest). pileLettersAt <- function(x, seqnames, pos, cigar, at) { stopifnot(is(x, "XStringSet")) N <- length(x) # nb of alignments stopifnot(is(seqnames, "Rle")) stopifnot(is.factor(runValue(seqnames))) stopifnot(length(seqnames) == N) stopifnot(is.integer(pos) && length(pos) == N) stopifnot(is.character(cigar) && length(cigar) == N) if (!is(at, "GPos")) at <- GPos(at) stopifnot(identical(seqlevels(at), levels(seqnames))) ## We process 1 chromosome at a time. So we start by splitting ## 'x', 'pos', 'cigar', and 'start(at)' by chromosome. The 4 ## resulting list-like objects have 1 list element per chromosome ## in 'seqlevels(at)' (or in 'levels(seqnames)', which is identical ## to 'seqlevels(at)'). x_by_chrom <- split(x, seqnames) # XStringSetList pos_by_chrom <- split(pos, seqnames) # IntegerList cigar_by_chrom <- split(cigar, seqnames) # CharacterList at_by_chrom <- split(start(at), seqnames(at)) # IntegerList ## Unsplit index. split_idx <- unlist(split(seq_along(at), seqnames(at)), use.names=FALSE) unsplit_idx <- integer(length(at)) unsplit_idx[split_idx] <- seq_along(at) do.call("c", lapply(seq_along(seqlevels(at)), function(i) .pileLettersOnSingleRefAt( x_by_chrom[[i]], pos_by_chrom[[i]], cigar_by_chrom[[i]], at_by_chrom[[i]])))[unsplit_idx] } GenomicAlignments/R/readGAlignments.R0000644000175200017520000004163514516004601020575 0ustar00biocbuildbiocbuild### ========================================================================= ### readGAlignments() and related functions ### ------------------------------------------------------------------------- ### A "flag filter" is represented as a 'flag' vector of length 2 with names ### keep0 and keep1. The .combineBamFlagFilters() function performs a logical ### AND between 2 "flag filters". It returns a "flag filter". .combineBamFlagFilters <- function(flagfilterA, flagfilterB) { if (!identical(names(flagfilterA), c("keep0", "keep1")) || !identical(names(flagfilterB), c("keep0", "keep1"))) stop("input must be BAM flag filters") ans <- bamFlagAND(flagfilterA, flagfilterB) if (!all(bamFlagAsBitMatrix(ans[["keep0"]]) | bamFlagAsBitMatrix(ans[["keep1"]]))) stop("BAM flag filters to combine are incompatible") ans } .normargParam <- function(param, flag0, what0) { if (is.null(param)) param <- ScanBamParam() bamFlag(param) <- .combineBamFlagFilters(bamFlag(param, asInteger=TRUE), flag0) bamWhat(param) <- union(bamWhat(param), what0) param } ### 'x' must be a GAlignments object. .bindExtraData <- function(x, use.names, param, bamcols, with.which_label=FALSE) { if (use.names) names(x) <- bamcols$qname if (is.null(param)) return(x) colnames <- c(bamWhat(param), bamTag(param)) if (with.which_label) colnames <- c(colnames, "which_label") if (length(colnames) != 0L) { df <- do.call(DataFrame, bamcols[colnames]) ## Sadly, the DataFrame() constructor is mangling the duplicated ## colnames to make them unique. Since we of course don't want this, ## we need to fix them. colnames(df) <- colnames mcols(x) <- df } x } .load_bamcols_from_BamFile <- function(file, param, what0, with.which_label=FALSE) { flag0 <- scanBamFlag(isUnmappedQuery=FALSE) param <- .normargParam(param, flag0, what0) res <- scanBam(file, param=param) if (length(res) == 0L) # should never happen stop("scanBam() returned a list of length zero") Rsamtools:::.load_bamcols_from_scanBam_res(res, param, with.which_label=with.which_label) } .load_seqlengths_from_BamFile <- function(file, seqlevels) { seqlengths <- seqlengths(file) if (is.null(seqlengths)) return(NULL) bad <- setdiff(seqlevels, names(seqlengths)) if (length(bad) == 0L) return(seqlengths) bad <- paste(bad, collapse="' '") msg <- sprintf("'rname' lengths not in BamFile header; seqlengths not used\n file: %s\n missing rname(s): '%s'", path(file), bad) warning(msg) NULL } .open_BamFile <- function(file, index=file, asMates=FALSE, param=NULL) { if ((missing(index) || identical(index, file)) && (is.null(param) || length(bamWhich(param)) == 0L)) index <- character(0) open(BamFile(file, index=index, asMates=asMates), "rb") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGAlignments() ### setGeneric("readGAlignments", signature="file", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) standardGeneric("readGAlignments") ) .readGAlignments.BamFile <- function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (is.null(param)) param <- ScanBamParam() if (!asMates(file)) bamWhat(param) <- setdiff(bamWhat(param), c("groupid", "mate_status")) what0 <- c("rname", "strand", "pos", "cigar") if (use.names) what0 <- c(what0, "qname") bamcols <- .load_bamcols_from_BamFile(file, param, what0, with.which_label=with.which_label) seqlengths <- .load_seqlengths_from_BamFile(file, levels(bamcols[["rname"]])) ans <- GAlignments(seqnames=bamcols$rname, pos=bamcols$pos, cigar=bamcols$cigar, strand=bamcols$strand, seqlengths=seqlengths) .bindExtraData(ans, use.names, param, bamcols, with.which_label=with.which_label) } setMethod("readGAlignments", "BamFile", .readGAlignments.BamFile) setMethod("readGAlignments", "character", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) { bam <- .open_BamFile(file, index=index, param=param) on.exit(close(bam)) readGAlignments(bam, character(0), use.names=use.names, param=param, with.which_label=with.which_label) } ) setMethod("readGAlignments", "BamViews", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) { if (missing(index)) index <- bamIndicies(file) if (is.null(param)) { param <- ScanBamParam(which=bamRanges(file)) } else if (!identical(bamRanges(file), bamWhich(param))) { warning("'bamRanges(file)' and 'bamWhich(param)' differ; using 'bamRanges(file)'") bamWhich(param) <- bamRanges(file) } fun <- function(i, bamViews, verbose) readGAlignments(file=bamPaths(bamViews)[i], index=bamIndicies(bamViews)[i], use.names=use.names, param=param, with.which_label=with.which_label) ### Rsamtools:::.BamViews_delegate requires the ShortRead package! Rsamtools:::.BamViews_delegate("readGAlignments", file, fun) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGAlignmentPairs() ### setGeneric("readGAlignmentPairs", signature="file", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE, strandMode=1) standardGeneric("readGAlignmentPairs") ) ### 'use.mcols' can be TRUE, FALSE, or a character vector specifying the ### *inner* metadata columns to return, i.e., the metadata columns to set on ### the 2 halves of the returned GAlignmentPairs object. .make_GAlignmentPairs_from_GAlignments <- function(gal, strandMode=1L, use.mcols=FALSE) { groupid <- Rle(mcols(gal, use.names=FALSE)[ , "groupid"]) stopifnot(isStrictlySorted(runValue(groupid))) mate_status <- Rle(mcols(gal, use.names=FALSE)[ , "mate_status"]) ## Dump alignments with "ambiguous" mate status. flushDumpedAlignments() dumped_gal <- gal[mate_status == "ambiguous"] dumped_count <- length(dumped_gal) if (dumped_count != 0L) { dumpAlignments(dumped_gal) warning(" ", dumped_count, " alignments with ambiguous pairing ", "were dumped.\n Use 'getDumpedAlignments()' to retrieve ", "them from the dump environment.") } ## Keep alignments that (1) have a mate status set to "mated" and ## (2) belong to a group of size 2. ok <- mate_status == "mated" & Rle(runLength(groupid) == 2L, runLength(groupid)) if (!all(ok)) gal <- gal[ok] ## Check flag bits 0x40 and 0x80. flag <- mcols(gal, use.names=FALSE)[ , "flag"] is_first_mate <- as.logical(bamFlagAsBitMatrix(flag, bitnames="isFirstMateRead")) is_last_mate <- as.logical(bamFlagAsBitMatrix(flag, bitnames="isSecondMateRead")) bits_0x40_0x80_are_ok <- is_first_mate != is_last_mate stopifnot(all(bits_0x40_0x80_are_ok)) ## Split and order the pairs by ascending start position of the first mate. idx1 <- which(is_first_mate) idx2 <- which(is_last_mate) oo1 <- orderIntegerPairs(as.integer(gal@seqnames)[idx1], gal@start[idx1]) idx1 <- idx1[oo1] idx2 <- idx2[oo1] ans_first <- gal[idx1] ans_last <- gal[idx2] groupid1 <- mcols(ans_first, use.names=FALSE)[ , "groupid"] groupid2 <- mcols(ans_last, use.names=FALSE)[ , "groupid"] stopifnot(identical(groupid1, groupid2)) ## Drop the names. ans_names <- names(ans_first) names(ans_first) <- names(ans_last) <- NULL ## Check isProperPair (0x2) and isSecondaryAlignment (0x100) flag bits. flag1 <- mcols(ans_first, use.names=FALSE)[ , "flag"] flag2 <- mcols(ans_last, use.names=FALSE)[ , "flag"] is_proper1 <- bamFlagAsBitMatrix(flag1, bitnames="isProperPair") is_proper2 <- bamFlagAsBitMatrix(flag2, bitnames="isProperPair") stopifnot(identical(is_proper1, is_proper2)) is_secondary1 <- bamFlagAsBitMatrix(flag1, bitnames="isSecondaryAlignment") is_secondary2 <- bamFlagAsBitMatrix(flag2, bitnames="isSecondaryAlignment") stopifnot(identical(is_secondary1, is_secondary2)) ## Make the GAlignmentPairs object and return it. if (is.character(use.mcols)) { mcols(ans_first) <- mcols(ans_first, use.names=FALSE)[use.mcols] mcols(ans_last) <- mcols(ans_last, use.names=FALSE)[use.mcols] } else if (!use.mcols) { mcols(ans_first) <- mcols(ans_last) <- NULL } GAlignmentPairs(ans_first, ans_last, strandMode=strandMode, isProperPair=as.logical(is_proper1), names=ans_names) } .readGAlignmentPairs.BamFile <- function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE, strandMode=1) { if (!asMates(file)) { asMates(file) <- TRUE ## This is required because BamFile objects have a pass-by-address ## semantic. on.exit(asMates(file) <- FALSE) } if (is.null(param)) param <- ScanBamParam() flag0 <- scanBamFlag(isPaired=TRUE, hasUnmappedMate=FALSE) what0 <- c("flag", "groupid", "mate_status") param2 <- .normargParam(param, flag0, what0) gal <- readGAlignments(file, use.names=use.names, param=param2, with.which_label=with.which_label) use.mcols <- c(bamWhat(param), bamTag(param)) if (with.which_label) use.mcols <- c(use.mcols, "which_label") .make_GAlignmentPairs_from_GAlignments(gal, strandMode=strandMode, use.mcols=use.mcols) } setMethod("readGAlignmentPairs", "BamFile", .readGAlignmentPairs.BamFile) setMethod("readGAlignmentPairs", "character", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE, strandMode=1) { bam <- .open_BamFile(file, index=index, asMates=TRUE, param=param) on.exit(close(bam)) readGAlignmentPairs(bam, character(0), use.names=use.names, param=param, with.which_label=with.which_label, strandMode=strandMode) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGAlignmentsList() ### setGeneric("readGAlignmentsList", signature="file", function(file, index=file, use.names=FALSE, param=ScanBamParam(), with.which_label=FALSE, strandMode=NA) standardGeneric("readGAlignmentsList") ) .setRealStrand <- function(gal, param, strandMode) { if (strandMode == 0L) strand(gal) <- Rle(strand("*"), length(gal)) else { gal_mcols <- mcols(gal, use.names=FALSE) if (is.null(gal_mcols$flag)) warning("Flag information missing in GAlignmentsList object. Strand information might not be accurate.") else { mask_first_mate <- bamFlagTest(gal_mcols$flag, "isFirstMateRead") if (strandMode == 1L) strand(gal[!mask_first_mate]) <- invertStrand(strand(gal[!mask_first_mate])) else if (strandMode == 2L) strand(gal[mask_first_mate]) <- invertStrand(strand(gal[mask_first_mate])) else stop("strandMode should be either 0, 1 or 2.") } } ## if the user didn't request the 'flag' info ## then remove it to reduce memory footprint if (!"flag" %in% bamWhat(param)) mcols(gal)$flag <- NULL gal } .matesFromBam <- function(file, use.names, param, what0, with.which_label, strandMode) { bamcols <- .load_bamcols_from_BamFile(file, param, what0, with.which_label=with.which_label) seqlengths <- .load_seqlengths_from_BamFile(file, levels(bamcols$rname)) gal <- GAlignments(seqnames=bamcols$rname, pos=bamcols$pos, cigar=bamcols$cigar, strand=bamcols$strand, seqlengths=seqlengths) if (!is.na(strandMode)) { flag0 <- scanBamFlag() what0 <- "flag" param2 <- .normargParam(param, flag0, what0) gal <- .bindExtraData(gal, use.names=FALSE, param2, bamcols, with.which_label=with.which_label) gal <- .setRealStrand(gal, param, strandMode) } else gal <- .bindExtraData(gal, use.names=FALSE, param, bamcols, with.which_label=with.which_label) if (asMates(file)) { f <- factor(bamcols$groupid) gal <- unname(split(gal, f)) mcols(gal)$mate_status <- bamcols$mate_status[match(levels(f), bamcols$groupid)] } else { ## groupid=NULL when asMates=FALSE gal <- unname(split(gal, seq_along(gal))) } if (use.names) names(gal) <- unique(splitAsList(bamcols$qname, bamcols$groupid)) gal } .readGAlignmentsList.BamFile <- function(file, index=file, use.names=FALSE, param=ScanBamParam(), with.which_label=FALSE, strandMode=NA) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!asMates(file)) bamWhat(param) <- setdiff(bamWhat(param), c("groupid", "mate_status")) what0 <- c("rname", "strand", "pos", "cigar", "groupid", "mate_status") if (!is.na(strandMode)) what0 <- c(what0, "flag") if (use.names) what0 <- c(what0, "qname") .matesFromBam(file, use.names, param, what0, with.which_label, strandMode) } setMethod("readGAlignmentsList", "BamFile", .readGAlignmentsList.BamFile) setMethod("readGAlignmentsList", "character", function(file, index=file, use.names=FALSE, param=ScanBamParam(), with.which_label=FALSE, strandMode=NA) { bam <- .open_BamFile(file, index=index, asMates=TRUE, param=param) on.exit(close(bam)) readGAlignmentsList(bam, character(0), use.names=use.names, param=param, with.which_label=with.which_label, strandMode=strandMode) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGappedReads() ### setGeneric("readGappedReads", signature="file", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) standardGeneric("readGappedReads") ) .readGappedReads.BamFile <- function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (is.null(param)) param <- ScanBamParam() if (!asMates(file)) bamWhat(param) <- setdiff(bamWhat(param), c("groupid", "mate_status")) what0 <- c("rname", "strand", "pos", "cigar", "seq") if (use.names) what0 <- c(what0, "qname") bamcols <- .load_bamcols_from_BamFile(file, param, what0, with.which_label=with.which_label) seqlengths <- .load_seqlengths_from_BamFile(file, levels(bamcols[["rname"]])) ans <- GappedReads(seqnames=bamcols$rname, pos=bamcols$pos, cigar=bamcols$cigar, strand=bamcols$strand, qseq=bamcols$seq, seqlengths=seqlengths) .bindExtraData(ans, use.names, param, bamcols, with.which_label=with.which_label) } setMethod("readGappedReads", "BamFile", .readGappedReads.BamFile) setMethod("readGappedReads", "character", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) { bam <- .open_BamFile(file, index=index, param=param) on.exit(close(bam)) readGappedReads(bam, character(0), use.names=use.names, param=param, with.which_label=with.which_label) } ) GenomicAlignments/R/sequenceLayer.R0000644000175200017520000006005314516004601020331 0ustar00biocbuildbiocbuild### ========================================================================= ### sequenceLayer() ### ------------------------------------------------------------------------- .make_empty_sequences <- function(skeleton, class="BStringSet") { if (is.null(skeleton)) return(NULL) skeleton <- PartitioningByEnd(skeleton) skeleton_len <- length(skeleton) if (skeleton_len == 0L) { unlisted_len <- 0L } else { unlisted_len <- end(skeleton)[skeleton_len] } unlisted_ans <- rep.int(as("", class), unlisted_len) relist(unlisted_ans, skeleton) } ### 'filler_width' must be an integer vector, and 'letter' an XString object ### of length 1. .make_sequence_fillers_from_widths <- function(filler_width, letter) { if (length(filler_width) == 0L) { max_width <- 0L at <- IRanges() } else { max_width <- max(filler_width) at <- IRanges(1L, filler_width) } biggest_filler <- rep.int(letter, max_width) extractAt(biggest_filler, at) } ### 'filler_widths' must be an IntegerList object (or list of integers). .make_sequence_fillers_from_list_of_widths <- function(filler_widths, letter) { unlisted_widths <- unlist(filler_widths, use.names=FALSE) unlisted_ans <- .make_sequence_fillers_from_widths(unlisted_widths, letter) relist(unlisted_ans, filler_widths) } ### Parallel combine. .pcombine <- function(x, y) { if (is.null(x)) return(y) if (is.null(y)) return(x) if (length(x) != length(y)) stop("'x' and 'y' must have the same length") xy <- c(x, y) collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(x)) ans_flesh <- unlist(xy[collate_subscript], use.names=FALSE) ans_breakpoints <- end(PartitioningByEnd(x)) + end(PartitioningByEnd(y)) ans_skeleton <- PartitioningByEnd(ans_breakpoints) relist(ans_flesh, ans_skeleton) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### sequenceLayer() ### .make_fillers <- function(cigar, ops, letter) { ops_width <- explodeCigarOpLengths(cigar, ops=ops) .make_sequence_fillers_from_list_of_widths(ops_width, letter) } .D_ranges_on_query_space <- function(cigar, before.hard.clipping=FALSE, after.soft.clipping=FALSE) { cigarRangesAlongQuerySpace(cigar, before.hard.clipping=before.hard.clipping, after.soft.clipping=after.soft.clipping, ops="D") } .N_ranges_on_query_space <- function(cigar, before.hard.clipping=FALSE, after.soft.clipping=FALSE) { cigarRangesAlongQuerySpace(cigar, before.hard.clipping=before.hard.clipping, after.soft.clipping=after.soft.clipping, ops="N") } .D_and_N_ranges_on_query_space <- function(cigar, before.hard.clipping=FALSE, after.soft.clipping=FALSE) { D_ranges <- .D_ranges_on_query_space(cigar, before.hard.clipping=before.hard.clipping, after.soft.clipping=after.soft.clipping) N_ranges <- .N_ranges_on_query_space(cigar, before.hard.clipping=before.hard.clipping, after.soft.clipping=after.soft.clipping) .pcombine(D_ranges, N_ranges) } .make_D_and_N_fillers <- function(cigar, D.letter, N.letter) { D_fillers <- .make_fillers(cigar, "D", D.letter) N_fillers <- .make_fillers(cigar, "N", N.letter) .pcombine(D_fillers, N_fillers) } sequenceLayer <- function(x, cigar, from="query", to="reference", D.letter="-", N.letter=".", I.letter="-", S.letter="+", H.letter="+") { if (!is(x, "XStringSet")) stop("'x' must be an XStringSet object") ## The 8 spaces below are also defined at the top of the src/cigar_utils.c ## file in the GenomicAlignments package. SPACES <- c("reference", "reference-N-regions-removed", "query", "query-before-hard-clipping", "query-after-soft-clipping", "pairwise", "pairwise-N-regions-removed", "pairwise-dense") from <- match.arg(from, SPACES) to <- match.arg(to, SPACES) D.letter <- Biostrings:::.normarg_padding.letter(D.letter, seqtype(x)) N.letter <- Biostrings:::.normarg_padding.letter(N.letter, seqtype(x)) I.letter <- Biostrings:::.normarg_padding.letter(I.letter, seqtype(x)) S.letter <- Biostrings:::.normarg_padding.letter(S.letter, seqtype(x)) H.letter <- Biostrings:::.normarg_padding.letter(H.letter, seqtype(x)) if (from == to) return(x) ## Right now, the way 'S.letter' and 'H.letter' are injected in 'x' when ## 'to' is "query-before-hard-clipping" can result in padding in the ## wrong order (i.e. padding with 'H.letter' followed by padding with ## 'S.letter') so we temporarily work around this by enforcing 'S.letter' ## and 'H.letter' to be the same. if (from != "query" && to == "query-before-hard-clipping" && as.character(S.letter) != as.character(H.letter)) stop("'H.letter' must be the same as 'S.letter' ", "when 'from' is not \"query\" and 'to' ", "is \"query-before-hard-clipping\"") ## TODO: What follows is a big ugly piece of stinking code (350 lines!). ## There is of course a better way... inject_at <- ops_to_remove <- NULL if (from == "reference") { getCigarRanges <- function(cigar, ops) cigarRangesAlongReferenceSpace(cigar, ops=ops) if (to == "reference-N-regions-removed") { ## "reference" -> "reference-N-regions-removed" ops_to_remove <- "N" } else if (to == "query") { ## "reference" -> "query" ops_to_remove <- c("D", "N") I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) inject_at <- .pcombine(I_inject_at, S_inject_at) fillers <- .pcombine(I_fillers, S_fillers) } else if (to == "query-before-hard-clipping") { ## "reference" -> "query-before-hard-clipping" ops_to_remove <- c("D", "N") I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(I_inject_at, S_inject_at) inject_at <- .pcombine(inject_at, H_inject_at) fillers <- .pcombine(I_fillers, S_fillers) fillers <- .pcombine(fillers, H_fillers) } else if (to == "query-after-soft-clipping") { ## "reference" -> "query-after-soft-clipping" ops_to_remove <- c("D", "N") ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise") { ## "reference" -> "pairwise" ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise-N-regions-removed") { ## "reference" -> "pairwise-N-regions-removed" ops_to_remove <- "N" ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise-dense") { ## "reference" -> "pairwise-dense" ops_to_remove <- c("D", "N") } } else if (from == "reference-N-regions-removed") { getCigarRanges <- function(cigar, ops) cigarRangesAlongReferenceSpace(cigar, N.regions.removed=TRUE, ops=ops) if (to == "reference") { ## "reference-N-regions-removed" -> "reference" ops_to_inject <- "N" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, N.letter) } else if (to == "query") { ## "reference-N-regions-removed" -> "query" ops_to_remove <- "D" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) inject_at <- .pcombine(I_inject_at, S_inject_at) fillers <- .pcombine(I_fillers, S_fillers) } else if (to == "query-before-hard-clipping") { ## "reference-N-regions-removed" -> "query-before-hard-clipping" ops_to_remove <- "D" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(I_inject_at, S_inject_at) inject_at <- .pcombine(inject_at, H_inject_at) fillers <- .pcombine(I_fillers, S_fillers) fillers <- .pcombine(fillers, H_fillers) } else if (to == "query-after-soft-clipping") { ## "reference-N-regions-removed" -> "query-after-soft-clipping" ops_to_remove <- "D" ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise") { ## "reference-N-regions-removed" -> "pairwise" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) N_inject_at <- getCigarRanges(cigar, "N") N_fillers <- .make_fillers(cigar, "N", N.letter) inject_at <- .pcombine(I_inject_at, N_inject_at) fillers <- .pcombine(I_fillers, N_fillers) } else if (to == "pairwise-N-regions-removed") { ## "reference-N-regions-removed" -> "pairwise-N-regions-removed" ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise-dense") { ## "reference-N-regions-removed" -> "pairwise-dense" ops_to_remove <- "D" } } else if (from == "query") { getCigarRanges <- function(cigar, ops) cigarRangesAlongQuerySpace(cigar, ops=ops) if (to == "reference") { ## "query" -> "reference" ops_to_remove <- c("I", "S") inject_at <- .D_and_N_ranges_on_query_space(cigar) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "reference-N-regions-removed") { ## "query" -> "reference-N-regions-removed" ops_to_remove <- c("S", "I") ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "query-before-hard-clipping") { ## "query" -> "query-before-hard-clipping" ops_to_inject <- "H" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, H.letter) } else if (to == "query-after-soft-clipping") { ## "query" -> "query-after-soft-clipping" ops_to_remove <- "S" } else if (to == "pairwise") { ## "query" -> "pairwise" ops_to_remove <- "S" inject_at <- .D_and_N_ranges_on_query_space(cigar) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "pairwise-N-regions-removed") { ## "query" -> "pairwise-N-regions-removed" ops_to_remove <- "S" ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "pairwise-dense") { ## "query" -> "pairwise-dense" ops_to_remove <- c("I", "S") } } else if (from == "query-before-hard-clipping") { getCigarRanges <- function(cigar, ops) cigarRangesAlongQuerySpace(cigar, before.hard.clipping=TRUE, ops=ops) if (to == "reference") { ## "query-before-hard-clipping" -> "reference" ops_to_remove <- c("H", "S", "I") inject_at <- .D_and_N_ranges_on_query_space(cigar, before.hard.clipping=TRUE) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "reference-N-regions-removed") { ## "query-before-hard-clipping" -> "reference-N-regions-removed" ops_to_remove <- c("H", "S", "I") ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "query") { ## "query-before-hard-clipping" -> "query" ops_to_remove <- "H" } else if (to == "query-after-soft-clipping") { ## "query-before-hard-clipping" -> "query-after-soft-clipping" ops_to_remove <- c("H", "S") } else if (to == "pairwise") { ## "query-before-hard-clipping" -> "pairwise" ops_to_remove <- c("H", "S") inject_at <- .D_and_N_ranges_on_query_space(cigar, before.hard.clipping=TRUE) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "pairwise-N-regions-removed") { ## "query-before-hard-clipping" -> "pairwise-N-regions-removed" ops_to_remove <- c("H", "S") ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "pairwise-dense") { ## "query-before-hard-clipping" -> "pairwise-dense" ops_to_remove <- c("I", "S", "H") } } else if (from == "query-after-soft-clipping") { getCigarRanges <- function(cigar, ops) cigarRangesAlongQuerySpace(cigar, after.soft.clipping=TRUE, ops=ops) if (to == "reference") { ## "query-after-soft-clipping" -> "reference" ops_to_remove <- "I" inject_at <- .D_and_N_ranges_on_query_space(cigar, after.soft.clipping=TRUE) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "reference-N-regions-removed") { ## "query-after-soft-clipping" -> "reference-N-regions-removed" ops_to_remove <- "I" ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "query") { ## "query-after-soft-clipping" -> "query" ops_to_inject <- "S" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, S.letter) } else if (to == "query-before-hard-clipping") { ## "query-after-soft-clipping" -> "query-before-hard-clipping" S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(S_inject_at, H_inject_at) fillers <- .pcombine(S_fillers, H_fillers) } else if (to == "pairwise") { ## "query-after-soft-clipping" -> "pairwise" inject_at <- .D_and_N_ranges_on_query_space(cigar, after.soft.clipping=TRUE) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "pairwise-N-regions-removed") { ## "query-after-soft-clipping" -> "pairwise-N-regions-removed" ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "pairwise-dense") { ## "query-after-soft-clipping" -> "pairwise-dense" ops_to_remove <- "I" } } else if (from == "pairwise") { getCigarRanges <- function(cigar, ops) cigarRangesAlongPairwiseSpace(cigar, ops=ops) if (to == "reference") { ## "pairwise" -> "reference" ops_to_remove <- "I" } else if (to == "reference-N-regions-removed") { ## "pairwise" -> "reference-N-regions-removed" ops_to_remove <- c("I", "N") } else if (to == "query") { ## "pairwise" -> "query" ops_to_remove <- c("D", "N") ops_to_inject <- "S" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, S.letter) } else if (to == "query-before-hard-clipping") { ## "pairwise" -> "query-before-hard-clipping" ops_to_remove <- c("D", "N") S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(S_inject_at, H_inject_at) fillers <- .pcombine(S_fillers, H_fillers) } else if (to == "query-after-soft-clipping") { ## "pairwise" -> "query-after-soft-clipping" ops_to_remove <- c("D", "N") } else if (to == "pairwise-N-regions-removed") { ## "pairwise" -> "pairwise-N-regions-removed" ops_to_remove <- "N" } else if (to == "pairwise-dense") { ## "pairwise" -> "pairwise-dense" ops_to_remove <- c("I", "D", "N") } } else if (from == "pairwise-N-regions-removed") { getCigarRanges <- function(cigar, ops) cigarRangesAlongPairwiseSpace(cigar, N.regions.removed=TRUE, ops=ops) if (to == "reference") { ## "pairwise-N-regions-removed" -> "reference" ops_to_remove <- "I" ops_to_inject <- "N" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, N.letter) } else if (to == "reference-N-regions-removed") { ## "pairwise-N-regions-removed" -> "reference-N-regions-removed" ops_to_remove <- "I" } else if (to == "query") { ## "pairwise-N-regions-removed" -> "query" ops_to_remove <- "D" ops_to_inject <- "S" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, S.letter) } else if (to == "query-before-hard-clipping") { ## "pairwise-N-regions-removed" -> "query-before-hard-clipping" ops_to_remove <- "D" S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(S_inject_at, H_inject_at) fillers <- .pcombine(S_fillers, H_fillers) } else if (to == "query-after-soft-clipping") { ## "pairwise-N-regions-removed" -> "query-after-soft-clipping" ops_to_remove <- "D" } else if (to == "pairwise") { ## "pairwise-N-regions-removed" -> "pairwise" ops_to_inject <- "N" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, N.letter) } else if (to == "pairwise-dense") { ## "pairwise-N-regions-removed" -> "pairwise-dense" ops_to_remove <- c("I", "D") } } else if (from == "pairwise-dense") { getCigarRanges <- function(cigar, ops) cigarRangesAlongPairwiseSpace(cigar, dense=TRUE, ops=ops) if (to == "reference") { ## "pairwise-dense" -> "reference" D_inject_at <- getCigarRanges(cigar, "D") D_fillers <- .make_fillers(cigar, "D", D.letter) N_inject_at <- getCigarRanges(cigar, "N") N_fillers <- .make_fillers(cigar, "N", N.letter) inject_at <- .pcombine(D_inject_at, N_inject_at) fillers <- .pcombine(D_fillers, N_fillers) } else if (to == "reference-N-regions-removed") { ## "pairwise-dense" -> "reference-N-regions-removed" ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "query") { ## "pairwise-dense" -> "query" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) inject_at <- .pcombine(I_inject_at, S_inject_at) fillers <- .pcombine(I_fillers, S_fillers) } else if (to == "query-before-hard-clipping") { ## "pairwise-dense" -> "query-before-hard-clipping" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(.pcombine(I_inject_at, S_inject_at), H_inject_at) fillers <- .pcombine(.pcombine(I_fillers, S_fillers), H_fillers) } else if (to == "query-after-soft-clipping") { ## "pairwise-dense" -> "query-after-soft-clipping" ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise") { ## "pairwise-dense" -> "pairwise" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) D_inject_at <- getCigarRanges(cigar, "D") D_fillers <- .make_fillers(cigar, "D", D.letter) N_inject_at <- getCigarRanges(cigar, "N") N_fillers <- .make_fillers(cigar, "N", N.letter) inject_at <- .pcombine(.pcombine(I_inject_at, D_inject_at), N_inject_at) fillers <- .pcombine(.pcombine(I_fillers, D_fillers), N_fillers) } else if (to == "pairwise-N-regions-removed") { ## "pairwise-dense" -> "pairwise-N-regions-removed" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) D_inject_at <- getCigarRanges(cigar, "D") D_fillers <- .make_fillers(cigar, "D", D.letter) inject_at <- .pcombine(I_inject_at, D_inject_at) fillers <- .pcombine(I_fillers, D_fillers) } } at <- inject_at if (is.null(inject_at)) { value <- NULL } else { value <- fillers } if (length(ops_to_remove) != 0L) { at2 <- getCigarRanges(cigar, ops_to_remove) value2 <- .make_empty_sequences(at2, class=class(x)) at <- .pcombine(at, at2) value <- .pcombine(value, value2) } replaceAt(x, at, value=value) } GenomicAlignments/R/setops-methods.R0000644000175200017520000000162314516004601020500 0ustar00biocbuildbiocbuild### ========================================================================= ### Set operations ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### pintersect() ### ### TODO: Revisit this method (seems to do strange things). setMethod("pintersect", c("GAlignments", "GRanges"), function(x, y, ...) { bounds <- try(callGeneric(granges(x), y), silent=TRUE) if (inherits(bounds, "try-error")) stop("CIGAR is empty after intersection") start <- start(bounds) - start(x) + 1L start[which(start < 1L)] <- 1L end <- end(bounds) - end(x) - 1L end[which(end > -1L)] <- -1L narrow(x, start=start, end=end) } ) setMethod("pintersect", c("GRanges", "GAlignments"), function(x, y, ...) { callGeneric(y, x) } ) GenomicAlignments/R/stackStringsFromGAlignments.R0000644000175200017520000001547114516004601023164 0ustar00biocbuildbiocbuild### ========================================================================= ### stackStringsFromGAlignments() & related ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### stackStringsFromGAlignments() ### ### All the alignments in GAlignments object 'x' must be on the **same** ### chromosome. This is NOT checked! .stack_reads <- function(x, from, to, what="seq", D.letter="-", N.letter=".", Lpadding.letter="+", Rpadding.letter="+") { x_mcols <- mcols(x, use.names=FALSE) what_col_idx <- match(what, colnames(x_mcols)) if (is.na(what_col_idx)) stop(wmsg("'x' does not have a \"", what, "\" metadata column")) what_col <- x_mcols[[what_col_idx]] if (what == "qual") what_col <- BStringSet(what_col) layed_seq <- sequenceLayer(what_col, cigar(x), D.letter=D.letter, N.letter=N.letter) ans <- stackStrings(layed_seq, from, to, shift=start(x)-1L, Lpadding.letter=Lpadding.letter, Rpadding.letter=Rpadding.letter) names(ans) <- names(x) mcols(ans) <- x_mcols ans } stackStringsFromGAlignments <- function(x, region, what="seq", D.letter="-", N.letter=".", Lpadding.letter="+", Rpadding.letter="+") { if (!is(x, "GAlignments")) stop(wmsg("'x' must be a GAlignments object")) if (!is(region, "GRanges")) region <- as(region, "GRanges") if (length(region) != 1L) stop(wmsg("'region' must contain a single genomic range")) region_seqname <- seqlevelsInUse(region) if (!(region_seqname %in% seqlevels(x))) stop(wmsg("seqlevel not in 'x': ", region_seqname)) what <- match.arg(what, c("seq", "qual")) x <- x[overlapsAny(granges(x), region)] .stack_reads(x, start(region), end(region), what=what, D.letter=D.letter, N.letter=N.letter, Lpadding.letter=Lpadding.letter, Rpadding.letter=Rpadding.letter) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### stackStringsFromBam() ### ### Should always return a ScanBamParam object containing exactly 1 genomic ### region. .normarg_param <- function(param) { if (isSingleString(param)) { tmp1 <- strsplit(param, ":", fixed=TRUE)[[1L]] if (length(tmp1) != 2L) stop(wmsg("when a character string, 'param' must be ", "of the form \"chr14:5201-5300\"")) tmp2 <- as.integer(strsplit(tmp1[2L], "-", fixed=TRUE)[[1L]]) if (length(tmp2) != 2L || any(is.na(tmp2))) stop(wmsg("when a character string, 'param' must be ", "of the form \"chr14:5201-5300\"")) param <- GRanges(tmp1[1L], IRanges(tmp2[1L], tmp2[2L])) } if (is(param, "GenomicRanges")) { if (length(param) != 1L) stop(wmsg("when a GRanges object, 'param' must have length 1")) seqlevels(param) <- seqlevelsInUse(param) param <- ScanBamParam(which=param) return(param) } if (is(param, "IntegerRangesList")) { ## We support IntegerRangesList just because ScanBamParam() supports ## it too and also because that's what's returned by bamWhich(). param <- param[elementNROWS(param) != 0L] if (length(unlist(param, use.names=FALSE)) != 1L) stop(wmsg("when an IntegerRangesList object, 'param' must contain ", "exactly 1 genomic region (i.e. 'unlist(param)' must ", "have length 1)")) param <- ScanBamParam(which=param) return(param) } if (!is(param, "ScanBamParam")) stop(wmsg("'param' must be either a ScanBamParam or IntegerRangesList ", "object containing exactly 1 genomic region, or a GRanges ", "object of length 1, or a character string specifying a ", "singe genomic region (in the \"chr14:5201-5300\" format)")) param_which <- bamWhich(param) param_which <- param_which[elementNROWS(param_which) != 0L] if (length(unlist(param_which, use.names=FALSE)) != 1L) stop(wmsg("when a ScanBamParam object, 'param' must contain exactly ", "1 genomic region (i.e. 'unlist(bamWhich(param))' must ", "have length 1)")) bamWhich(param) <- param_which param } stackStringsFromBam <- function(file, index=file, param, what="seq", use.names=FALSE, D.letter="-", N.letter=".", Lpadding.letter="+", Rpadding.letter="+") { param <- .normarg_param(param) region_range <- unlist(bamWhich(param), use.names=FALSE) what <- match.arg(what, c("seq", "qual")) param_what <- bamWhat(param) if (!(what %in% param_what)) bamWhat(param) <- c(param_what, what) gal <- readGAlignments(file, index=index, use.names=use.names, param=param) ans <- .stack_reads(gal, start(region_range), end(region_range), what=what, D.letter=D.letter, N.letter=N.letter, Lpadding.letter=Lpadding.letter, Rpadding.letter=Rpadding.letter) if (!(what %in% param_what)) { ## Remove the what metadata column. ans_mcols <- mcols(ans, use.names=FALSE) what_col_idx <- match(what, colnames(ans_mcols)) ans_mcols <- ans_mcols[ , -what_col_idx, drop=FALSE] ## Sadly, subsetting a DataFrame will mangle the colnames of the ## returned DataFrame if it has duplicated colnames. Since we of ## course don't want this, we fix them. colnames(ans_mcols) <- param_what mcols(ans) <- ans_mcols } ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### alphabetFrequencyFromBam() ### alphabetFrequencyFromBam <- function(file, index=file, param, what="seq", ...) { param <- .normarg_param(param) region_range <- unlist(bamWhich(param), use.names=FALSE) region_seqname <- names(bamWhich(param)) what <- match.arg(what, c("seq", "qual")) bamWhat(param) <- what gal <- readGAlignments(file, index=index, param=param) seqlevels(gal) <- region_seqname what_col <- mcols(gal, use.names=FALSE)[ , what] if (what == "qual") what_col <- BStringSet(what_col) at <- start(region_range) - 1L + seq_len(width(region_range)) at <- GRanges(region_seqname, IRanges(at, width=1L)) piles <- pileLettersAt(what_col, seqnames(gal), start(gal), cigar(gal), at) alphabetFrequency(piles, ...) } GenomicAlignments/R/summarizeOverlaps-methods.R0000644000175200017520000003031114516004601022707 0ustar00biocbuildbiocbuild### ========================================================================= ### summarizeOverlaps() generic and methods ### ------------------------------------------------------------------------- setGeneric("summarizeOverlaps", signature=c("features", "reads"), function(features, reads, mode=Union, ignore.strand=FALSE, ...) standardGeneric("summarizeOverlaps") ) ### ------------------------------------------------------------------------- ### Methods for GAlignments, GAlignmentsList and GAlignmentPairs objects ### .dispatchOverlaps <- function(features, reads, mode, ignore.strand, inter.feature, preprocess.reads, ...) { if (ignore.strand) { if (is(features, "GRangesList")) { r <- unlist(features) strand(r) <- "*" features@unlistData <- r } else { strand(features) <- "*" } } if (!is.null(preprocess.reads)) reads <- preprocess.reads(reads, ...) mode(features, reads, ignore.strand=ignore.strand, inter.feature=inter.feature) } .summarizeOverlaps <- function(features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) { if (!isTRUEorFALSE(ignore.strand)) stop("'ignore.strand' must be TRUE or FALSE") if (!ignore.strand) { reads_strand <- strand(reads) if (is(reads_strand, "List")) reads_strand <- unlist(reads_strand, use.names=FALSE) if (all(reads_strand == "*")) ignore.strand <- TRUE } mode <- match.fun(mode) counts <- .dispatchOverlaps(features, reads, mode, ignore.strand, inter.feature, preprocess.reads, ...) colData <- DataFrame(object=class(reads), records=length(reads), row.names="reads") SummarizedExperiment(assays=SimpleList(counts=as.matrix(counts)), rowRanges=features, colData=colData) } setMethod("summarizeOverlaps", c("GRanges", "GAlignments"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRangesList", "GAlignments"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRanges", "GAlignmentsList"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRangesList", "GAlignmentsList"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRanges", "GAlignmentPairs"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRangesList", "GAlignmentPairs"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRanges", "GRanges"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRangesList", "GRanges"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRanges", "GRangesList"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRangesList", "GRangesList"), .summarizeOverlaps ) ### ------------------------------------------------------------------------- ### 'mode' functions ### Union <- function(features, reads, ignore.strand=FALSE, inter.feature=TRUE) { ov <- findOverlaps(features, reads, ignore.strand=ignore.strand) if (inter.feature) { ## Remove ambigous reads. reads_to_keep <- which(countSubjectHits(ov) == 1L) ov <- ov[subjectHits(ov) %in% reads_to_keep] } countQueryHits(ov) } IntersectionStrict <- function(features, reads, ignore.strand=FALSE, inter.feature=TRUE) { ov <- findOverlaps(reads, features, type="within", ignore.strand=ignore.strand) if (inter.feature) { ## Remove ambigous reads. reads_to_keep <- which(countQueryHits(ov) == 1L) ov <- ov[queryHits(ov) %in% reads_to_keep] } countSubjectHits(ov) } .removeSharedRegions <- function(features, ignore.strand=FALSE) { if (is(features, "GRanges")) { regions <- disjoin(features, ignore.strand=ignore.strand) } else if (is(features, "GRangesList")) { regions <- disjoin(features@unlistData, ignore.strand=ignore.strand) } else { stop("internal error") # should never happen } ov <- findOverlaps(features, regions, ignore.strand=ignore.strand) regions_to_keep <- which(countSubjectHits(ov) == 1L) ov <- ov[subjectHits(ov) %in% regions_to_keep] unlisted_ans <- regions[subjectHits(ov)] ans_partitioning <- as(ov, "PartitioningByEnd") relist(unlisted_ans, ans_partitioning) } IntersectionNotEmpty <- function(features, reads, ignore.strand=FALSE, inter.feature=TRUE) { features <- .removeSharedRegions(features, ignore.strand=ignore.strand) Union(features, reads, ignore.strand=ignore.strand, inter.feature=inter.feature) } ### ------------------------------------------------------------------------- ### Methods for BamFiles and BamViews objects ### .checkArgs <- function(bam, singleEnd, fragments) { if (singleEnd) { if (all(isTRUE(asMates(bam)))) stop("cannot specify both 'singleEnd=TRUE' and 'asMates=TRUE'") if (fragments) stop("when 'fragments=TRUE', 'singleEnd' should be FALSE") ## all paired-end reading now goes through new C algo } else { asMates(bam) <- TRUE } } .getReadFunction <- function(singleEnd, fragments) { if (singleEnd) { FUN <- readGAlignments } else { if (fragments) FUN <- readGAlignmentsList else FUN <- readGAlignmentPairs } FUN } .countWithYieldSize <- function(FUN, features, bf, mode, ignore.strand, inter.feature, param, preprocess.reads, ...) { if (is.na(yieldSize(bf))) { x <- FUN(bf, param=param, ...) .dispatchOverlaps(features, x, mode, ignore.strand, inter.feature, preprocess.reads, ...) } else { if (!isOpen(bf)) { open(bf) on.exit(close(bf)) } ct <- integer(length(features)) while (length(x <- FUN(bf, param=param, ...))) { ct <- ct + .dispatchOverlaps(features, x, mode, ignore.strand, inter.feature, preprocess.reads, ...) } ct } } .dispatchBamFiles <- function(features, reads, mode, ignore.strand, count.mapped.reads=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { exist <- sapply(reads, function(bf) file.exists(path(bf))) if (!all(exist)) stop(paste0("file(s): ", paste(path(reads)[!exist], collapse=","), " do not exist")) FUN <- .getReadFunction(singleEnd, fragments) cts <- bplapply(setNames(seq_along(reads), names(reads)), function(i, FUN, reads, features, mode, ignore.strand, inter.feature, param, preprocess.reads, ...) { bf <- reads[[i]] .countWithYieldSize(FUN, features, bf, mode, ignore.strand, inter.feature, param, preprocess.reads, ...) }, FUN, reads, features, mode=match.fun(mode), ignore.strand=ignore.strand, inter.feature=inter.feature, param=param, preprocess.reads=preprocess.reads, ... ) counts <- as.matrix(do.call(cbind, cts)) if (count.mapped.reads) { countBam <- countBam(reads) flag <- scanBamFlag(isUnmappedQuery=FALSE) param <- ScanBamParam(flag=flag, what="seq") colData <- DataFrame(countBam[c("records", "nucleotides")], mapped=countBam(reads, param=param)$records, row.names=colnames(counts)) } else { colData <- DataFrame(row.names=colnames(counts)) } SummarizedExperiment(assays=SimpleList(counts=counts), rowRanges=features, colData=colData) } setMethod("summarizeOverlaps", c("GRanges", "BamFile"), function(features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { .checkArgs(reads, singleEnd, fragments) .dispatchBamFiles(features, BamFileList(reads), mode, ignore.strand, inter.feature=inter.feature, singleEnd=singleEnd, fragments=fragments, param=param, preprocess.reads=preprocess.reads, ...) }) setMethod("summarizeOverlaps", c("GRangesList", "BamFile"), function(features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { .checkArgs(reads, singleEnd, fragments) .dispatchBamFiles(features, BamFileList(reads), mode, ignore.strand, inter.feature=inter.feature, singleEnd=singleEnd, fragments=fragments, param=param, preprocess.reads=preprocess.reads, ...) }) .summarizeOverlaps_character <- function(features, reads, mode=Union, ignore.strand=FALSE, yieldSize=1000000L, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { if (!all(file.exists(reads))) stop("file(s) do not exist:\n ", paste(reads[!file.exists(reads)], collapse="\n ")) if (is.null(names(reads))) { if (any(duplicated(reads))) stop("duplicate 'reads' paths not allowed; use distinct names()") } else if (any(duplicated(names(reads)))) stop("duplicate 'names(reads)' file paths not allowed") reads <- BamFileList(reads, yieldSize=yieldSize, obeyQname=FALSE, asMates=!singleEnd) summarizeOverlaps(features, reads, mode, ignore.strand=ignore.strand, inter.feature=inter.feature, singleEnd=singleEnd, fragments=fragments, param=param, preprocess.reads=preprocess.reads, ...) } setMethod("summarizeOverlaps", c("GRanges", "character"), .summarizeOverlaps_character ) setMethod("summarizeOverlaps", c("GRangesList", "character"), .summarizeOverlaps_character ) .summarizeOverlaps_BamFileList <- function(features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { if (any(duplicated(names(reads)))) stop("duplicate 'names(reads)' not allowed") .checkArgs(reads, singleEnd, fragments) .dispatchBamFiles(features, reads, mode, ignore.strand, inter.feature=inter.feature, singleEnd=singleEnd, fragments=fragments, param=param, preprocess.reads=preprocess.reads, ...) } setMethod("summarizeOverlaps", c("GRanges", "BamFileList"), .summarizeOverlaps_BamFileList ) setMethod("summarizeOverlaps", c("GRangesList", "BamFileList"), .summarizeOverlaps_BamFileList ) setMethod("summarizeOverlaps", c("BamViews", "missing"), function(features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { se <- callGeneric(bamRanges(features), BamFileList(bamPaths(features)), mode=mode, ignore.strand=ignore.strand, inter.feature=inter.feature, singleEnd=singleEnd, fragments=fragments, param=param, preprocess.reads=preprocess.reads, ...) colData(se)$bamSamples <- bamSamples(features) colData(se)$bamIndices <- bamIndicies(features) metadata(se)$bamExperiment <- bamExperiment(features) se }) GenomicAlignments/R/utils.R0000644000175200017520000000137514516004601016666 0ustar00biocbuildbiocbuild### ========================================================================= ### Some low-level (non exported) utility functions. ### ------------------------------------------------------------------------- ### 3 equivalent implementations for this: ### (a) x %in% x[duplicated(x)] ### (b) duplicated(x) | duplicated(x, fromLast=TRUE) ### (c) xx <- match(x, x); ans <- xx != seq_along(xx); ans[xx] <- ans; ans ### Comparing the 3 implementations on an integer vector of length 12 millions: ### (a) is the most memory efficient; ### (b) is a little bit faster than (a) (by only 8%) but uses between 12-14% ### more memory; ### (c) is as fast as (a) but uses about 30% more memory. has_duplicates <- function(x) { x %in% x[duplicated(x)] } GenomicAlignments/R/zzz.R0000644000175200017520000000024014516004601016351 0ustar00biocbuildbiocbuild.onUnload <- function(libpath) { library.dynam.unload("GenomicAlignments", libpath) } .test <- function() BiocGenerics:::testPackage("GenomicAlignments") GenomicAlignments/README.md0000644000175200017520000000072714516004601016461 0ustar00biocbuildbiocbuild[](https://bioconductor.org/) **GenomicAlignments** is an R/Bioconductor package for representing and manipulating short genomic alignments (typically aligned reads). See https://bioconductor.org/packages/GenomicAlignments for more information including how to install the release version of the package (please refrain from installing directly from GitHub). GenomicAlignments/build/0000755000175200017520000000000014551577536016320 5ustar00biocbuildbiocbuildGenomicAlignments/build/vignette.rds0000644000175200017520000000104014551577536020652 0ustar00biocbuildbiocbuildUo00MC]ueGJ:Mb:uG,b;?|s E)g+?R\xR3ޑy}h\0s\\KAHSZw(H/x$ZZBNL<^%(4%N|2@_h-ǒ>.c}&IoSχ@ZȸΉ}K~f+ s𱤓Z펺'R,1PjM86F kV xi.w'80&E J ~tO>ȕIVaHVx7;XYAuK Rj^ǧ+hyɃ S>roC*E‹!~*Vy.45j23G)kڱه.˹ڑr`lҥKVz9a~8S"'7| I6jH1 b/of6E ($77+^UGenomicAlignments/inst/0000755000175200017520000000000014551577536016176 5ustar00biocbuildbiocbuildGenomicAlignments/inst/CITATION0000644000175200017520000000165414516004601017314 0ustar00biocbuildbiocbuildcitEntry(entry="article", title = "Software for Computing and Annotating Genomic Ranges", author = personList( as.person("Michael Lawrence" ), as.person("Wolfgang Huber" ), as.person("Herv\\'e Pag\\`es" ), as.person("Patrick Aboyoun" ), as.person("Marc Carlson" ), as.person("Robert Gentleman" ), as.person("Martin Morgan" ), as.person("Vincent Carey" )), year = 2013, journal = "{PLoS} Computational Biology", volume = "9", issue = "8", doi = "10.1371/journal.pcbi.1003118", url = "http://www.ploscompbiol.org/article/info%3Adoi%2F10.1371%2Fjournal.pcbi.1003118", textVersion = "Lawrence M, Huber W, Pag\\`es H, Aboyoun P, Carlson M, et al. (2013) Software for Computing and Annotating Genomic Ranges. PLoS Comput Biol 9(8): e1003118. doi:10.1371/journal.pcbi.1003118" ) GenomicAlignments/inst/doc/0000755000175200017520000000000014551577536016743 5ustar00biocbuildbiocbuildGenomicAlignments/inst/doc/GenomicAlignmentsIntroduction.R0000644000175200017520000000261514551577455025077 0ustar00biocbuildbiocbuild### R code from vignette source 'GenomicAlignmentsIntroduction.Rnw' ################################################### ### code chunk number 1: options ################################################### options(width=72) ################################################### ### code chunk number 2: install (eval = FALSE) ################################################### ## if (!require("BiocManager")) ## install.packages("BiocManager") ## BiocManager::install("GenomicAlignments") ################################################### ### code chunk number 3: initialize ################################################### library(GenomicAlignments) ################################################### ### code chunk number 4: readGAlignments ################################################### library(GenomicAlignments) aln1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") aln1 <- readGAlignments(aln1_file) aln1 length(aln1) ################################################### ### code chunk number 5: accessors ################################################### head(seqnames(aln1)) seqlevels(aln1) head(strand(aln1)) head(cigar(aln1)) head(qwidth(aln1)) head(start(aln1)) head(end(aln1)) head(width(aln1)) head(njunc(aln1)) ################################################### ### code chunk number 6: SessionInfo ################################################### sessionInfo() GenomicAlignments/inst/doc/GenomicAlignmentsIntroduction.Rnw0000644000175200017520000001302614516004601025415 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{An Introduction to the GenomicAlignments Package} %\VignetteDepends{Rsamtools} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass[10pt]{article} \usepackage{times} \usepackage{hyperref} \textwidth=6.5in \textheight=8.5in %\parskip=.3cm \oddsidemargin=-.1in \evensidemargin=-.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\software}[1]{\textsf{#1}} \newcommand{\R}{\software{R}} \newcommand{\Bioconductor}{\software{Bioconductor}} \newcommand{\GenomicRanges}{\Rpackage{GenomicRanges}} \title{An Introduction to the GenomicAlignments Package} \author{Herv\'{e} Pag\`{e}s} \date{\today} \begin{document} \maketitle <>= options(width=72) @ \tableofcontents \section{Introduction} The \Rpackage{GenomicAlignments} package serves as the foundation for representing genomic alignments within the \software{Bioconductor} project. In the \software{Bioconductor} package hierarchy, it builds upon the \Rpackage{GenomicRanges} (infrastructure) package and provides support for many \software{Bioconductor} packages. This package defines three classes: \Rclass{GAlignments}, \Rclass{GAlignmentPairs}, and \Rclass{GAlignmentsList}), which are used to represent genomic alignments, pairs of genomic alignments, and groups of genomic alignments. The \Rpackage{GenomicAlignments} package is available at bioconductor.org and can be downloaded via \Rfunction{BiocManager::install}: <>= if (!require("BiocManager")) install.packages("BiocManager") BiocManager::install("GenomicAlignments") @ <>= library(GenomicAlignments) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignments}: Genomic Alignments} The \Rclass{GAlignments} class which is a container for storing a set of genomic alignments. The class is intended to support alignments in general, not only those coming from a 'Binary Alignment Map' or 'BAM' files. Also alignments with gaps in the reference sequence (a.k.a. \emph{gapped alignments}) are supported which, for example, makes the class suited for storing junction reads from an RNA-seq experiment. More precisely, a \Rclass{GAlignments} object is a vector-like object where each element describes an \emph{alignment}, that is, how a given sequence (called \emph{query} or \emph{read}, typically short) aligns to a reference sequence (typically long). As shown later in this document, a \Rclass{GAlignments} object can be created from a 'BAM' file. In that case, each element in the resulting object will correspond to a record in the file. One important thing to note though is that not all the information present in the BAM/SAM records is stored in the object. In particular, for now, we discard the query sequences (SEQ field), the query ids (QNAME field), the query qualities (QUAL), the mapping qualities (MAPQ) and any other information that is not needed in order to support the basic set of operations described in this document. This also means that multi-reads (i.e. reads with multiple hits in the reference) don't receive any special treatment i.e. the various SAM/BAM records corresponding to a multi-read will show up in the \Rclass{GAlignments} object as if they were coming from different/unrelated queries. Also paired-end reads will be treated as single-end reads and the pairing information will be lost. This might change in the future. \subsection{Load a `BAM' file into a \Rclass{GAlignments} object} First we use the \Rfunction{readGAlignments} function from the \Rpackage{GenomicAlignments} package to load a toy `BAM' file into a \Rclass{GAlignments} object: <>= library(GenomicAlignments) aln1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") aln1 <- readGAlignments(aln1_file) aln1 length(aln1) @ 3271 `BAM' records were loaded into the object. Note that \Rfunction{readGAlignments} would have discarded any `BAM' record describing an unaligned query (see description of the field in the SAM Format Specification \footnote{\url{http://samtools.sourceforge.net/SAM1.pdf}} for more information). The reader interested in tracking down these events can always use the \Rfunction{scanBam} function but this goes beyond the scope of this document. \subsection{Simple accessor methods} There is one accessor per field displayed by the \Rmethod{show} method and it has the same name as the field. All of them return a vector or factor of the same length as the object: <>= head(seqnames(aln1)) seqlevels(aln1) head(strand(aln1)) head(cigar(aln1)) head(qwidth(aln1)) head(start(aln1)) head(end(aln1)) head(width(aln1)) head(njunc(aln1)) @ \subsection{More accessor methods} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignmentPairs}: Pairs of Genomic Alignments} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignmentsList}: Groups of Genomic Alignments} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Session Information} All of the output in this vignette was produced under the following conditions: \begin{small} <>= sessionInfo() @ \end{small} \end{document} GenomicAlignments/inst/doc/GenomicAlignmentsIntroduction.pdf0000644000175200017520000027066514551577455025463 0ustar00biocbuildbiocbuild%PDF-1.5 % 45 0 obj << /Length 2010 /Filter /FlateDecode >> stream xYK6Whs1Uk!oz7dnV#Ab%)οn48d h4oϙJn+2+- +YV%7z#T|_uM;o;_GIW[W~{SCu类%k`nhU DXUqjBЪtS -Xm`~21! ζy)\ +.Y&uXv tHTou+8!ZH0)eM2:c)70' Fҍ_B~ۉCR כ QJ>aԳ6h %?vG,=~Tr%}OSQNWu/`k10'g_?%7Ks HLJ8YZ@J@kH*I ͥoO65307Ua'}EtYEo_oj)B]XsTBWA[R!Z-1'l)3Mxr dK+ϢwmǵJZ%@T&ßerir宥S}e,).Cak}ol5s@iA!ws6EU8J̗~bөn:V8qHsHs>bd&.\ܲ mjc>t9$bUHtԼqmiֵ. LF&X*FjAf/ |"FQFrrx6/Qv:g|QCO&ܺTH37.%a#$3|z<1o\Yξacqyǁmb2bľb}iy7VfqpqFU }LsCk3d{g+yWmgrag C#!|9Ub"Bw덆DKsxo&hxqGE%3jf~4-lw8jn?sN0m'c(^|l; '!.3 gڢ`:9|+C6UXx" "KkHJ -BJG?X &"'  Wx*T ^ #hiD*z!K)F;<٨u}f>_;{zIoItljdbKrb5x%Vq֑b,,[$/ u3{:8Wk]P1Ρm$ ;O莧{V<ַ%_WDΞTܬVBcChW6'l;@J>Jn%f*ʐ6Kܿ?KhmnW=R;ıBřP`( ~z@t[70;%Dv$z,> stream xڵXo6~_a2V+"%R Hv k=eJKN?\^~G)K8ˋwGwGoo^\g,󔦳,MlQ즜z+ ٬[Us-iD,*{WחQDѪC3١ӭ5!7Qpa+-}o愙m4 ZV(HS4no:E#Dir* V] #x' g dƕN(XPruKo}He[kj8kFYkQo7H< %xiP~N2kvVjga<\Pp.50W9C! 1q}̠ۉB!C<4MR͕lD 1Z  BڦDP3s8.ɪBn;b#@1eJnK”Ro]ą&86!qFCF{U[TlfO_%*-lP|AZ~Kh{ 8;#1i%k33 JL"pbrLwu1h8Vv?J-7[Gb˛5+d75iHhǜa$4ޓ(匡7~]uѪw[o>\Rv7,8M d.RuQx$I*Άw- Iie_e < YZr(GeqH)+vovZtUa@ =~u%I% D4rL'K6kgႀ"Ur7]ٮn)Z~N:4BK+1 Wcw?^|x۶.;vyD#45e ƾLy|52^|F~M<޶'#DTpTվn:=x5%Ԭnށ dib#k !01O l)^h,6O]0Kݒ/>4.?-aBSpJNE-} h̫b9ņyh+Iy;M"d-{^lG0tV%KSMG>!\"FjI/l:14|u(j֋)=jz <5>"]ܭ]C'j.cF' L tP.gY{BnimjYx)9wW~Ԡ:`TÛ綖݌Slt#h6z/|ן̗jgIȢ.Ė >ԍw7/i endstream endobj 65 0 obj << /Length 1168 /Filter /FlateDecode >> stream xڵWKo6W{ԅ>$J -P4H$:FRG]!973f G9TJIMtwFcw$LFN濿]`~xw[dW?g,9N?#cߓ.v,=x(8Kb'{hZ7KBɒYԓY_u7, f}kFuf)4{dz&ӈz?b14=L&ˋ k jDmY F$ђ0XW endstream endobj 70 0 obj << /Length 1238 /Filter /FlateDecode >> stream xڥVߏ8~_#<$J=) wE=]W!xYIbg_q,d ۞=3c*}3~l ȱ'n>wꆑhh`\> stream x51 0F!%M.QAWRR(zS;%uAF`! b =ZZ3Qy^{ ZX< ÔA.]@Br;[Rږm zl.I}+)n endstream endobj 84 0 obj << /Length1 1612 /Length2 16378 /Length3 0 /Length 17212 /Filter /FlateDecode >> stream xڬcpf].v8ضmwl;cvǶ͎tl'}9ǪZs1kQ5֢ QR6s0J8ػ330L\UnBv8 Qg+ 4M,,fnnn8 +Z]E?%LCw=;hz*p̭lQE%miI:@ht6(ZL.@3 ?0v\V=M@g;++:Mm _9:; bl UILqZ`ퟔ Wjlepz0rq5/տps@ cg3[_T?o;:zkÿW V.@[s8f>M]cQL9Q3406s\P߱G-F;BK*m 3cl?vV^ P p]C/!L LZHXy͔\M-ƶ+/@_tjV6* /I QXKZMQY)Uo`3yCDCҳr8:bf?x ]<SfbWϕ7u0WT]6usvN߄cF=pk!Yuy#Sb}#ejŅ?zrW}Ԇ24iZ:s:2{ OKkrFeh͝cW9<-o̕Z{XBxGga5EƼr@kjxIA D3@4 fC.Ղc(V3Yo9c?lHh趃Tʔ­#67oD"3E^yUT>%Y߼ۛOX#BI+Hew ԃ71GV18@D3SlS:[[, D1di8r 'rqDhףw=odtG4T0r;7 ]#J)}f|:ӡ\½WIF"kǓ,x{Ccbi̗]|@վQgUgg y`@ڪN $?tw_S!P,-Q9rwM'%SkV1)!2gѪC\XjJ/~scUVRt|f$C4eH}γ M)#hjQ3"S??ʪ-y% kVd;{swpa~9T1kHb \*Ij!LVm]}l CJ%aN2oC>`/ZhOs}Fc玉 b0^cG ň3侑"^c\iڷ`W7nqQ>F/ǖuM_qJz)0+͖i =b@\7=keCs-cdT$RؓFƇJ#31*R`,4dC[Od 2y Tt:I\(ۮą9'ts-5刁1eW'6/:+[zXnFi0;Б@ŠlWU9[+>qgdVR232I6Pm uU 7M}tNP:V_žt eqIN2 Эȵ?|bK+#G%O [yURh/Jϵb3ʑkGQо *0^ռR@%h4-p*~wipv a/эQ1m=goѺXMuY_"V ÃH3\*q6ٌۓ斍EfOx*nEM҅Ds)1rR*(կ(A ," _ad͘X˂lޝ6RkPy2Otl2:!϶R չĤ kQoXz gVp L<æh"6A-m!iaɈ>}?1]`̀#2cc ?LO0alh4IB$#%uD"f1 r)u%A$lT+{nATl(dbzPyqZ%p3Te,%($^%KQa_@7X9qwaC+3y=9j1΋D5Z7Jl|zE.WJxqZ|k3{{umY?NwJ(zt/iMvH| 0OW qwxrxN%5^&scއ펓!($:b֣*8y{Xgm2$`"l-+T?dtMߦx8~j`(!&ʰ['3nO\ <CF0'_"o %PMl(&~e몟"+4ZuLj&:eP[#,Ȼ@)U*–JK ZC%@Xp/SC4rFzA5p $=5*+4,l>įWWr̼5;[)vBvg[,]b&3ʗ؉ҌrOH􈖃ÁϘ_}h #{U9Rl)^'mNl|O0x**˦Y"6@Q{mnLy,Y1?nh=ny +NyTeVA>\]@J.dK/Hn7W2S K(^’MiDžG L~kcT*+ftth/`7bX'_²2L؅9!#T3ccK Jftaxm1ǩ$~͈*J-m1Py_x~1 CDgXCK;I 2;Q=2ۯBiCiwh K L8Kyzp?g&][ՒA`Zb Djq[بIT/]uct!qoiYlwƏ;wVm_:^,z_A Ea=NSȴPfU¼#P)9]/ND4af@3+~c&#} gm9j^eہosm}b.wJ'm_- NccTآŃuW6r"4'$Vi~`a5q+wTO{~|X˖\hh!KCBvVck5k'j FvD^S4j Nӽ+Ji b&/S/u%i尖 ;;_Kk|ò#E8QQp6].w s~^tefZؘV}r<0Ľ!': LY^X*X1ج)J>I j%CAlEZH,lfM=Y^(k \\U2Ng"ޡ){0SΑ,Ԇ \>?ƎL$VsKJˁH{wYy&-0V)sGMoxS/0»N==z؟{/UP* ͞_9 \߲IE/cn=Cq+g|uy~1$0TױD ^[-ICSL{>P@L0py _X~S=«iL/jZ7t< kٮ(Sv{.a3M}*'ek {> 3б[$j%yGN*F p mJBoJ ԧP/LsLM>/ˤrACRP7_^laqL%QCsgV|~7OzgmuHW!l:p>pec8\Ū<G--LWYПwCC }l.ZAms?bڐb`_/ cښp{6MLwP UV'XsmB_sV)xy4.|R.؍@dD9znAWސ{A dGxbu)X3G Fx'DKXQvDc0Gw]y%jx n8e(RvѬMkjG,Ñ#/" ߿CV+z򑤕̺9'c8=apjRv.N]o[ q[D)&R?ة9<Cd x!Ş'{spY!k=/`>Ll(*yFxd1u'%X4\9n+ īS}: s!J_[%/BvM(R'g0f<-xb Ƕ%F4)͂ODr2L@8g" c-aG|t\dV%dm߈/ ߳zfT/Pq`Q}. >0,%Z ̈&P<]s`eT\klјf1Ϻ(_!셐n]Y9Zkge<վ{/SMqBs3󞠞D媷z۝a撹 ѻzUrG(q%-C>X#b-A␄)/D+ՓRygE̗|;-v'˔ă(7~QQZg\ۿk6%ٚch үL?끿M' Qְ[z΄\B2+I`Px Uf ~RvEJ!3\Xnn$M(Çx[G}kkvP:l86v7 V7â(i:<8gU@_\Ȟ@z {O/(]ZfOk43%U-m[<ĸ";4 @/b1DPlP `^ˌ*[6^ xk‹݆]rCE9H tE$dCbeyQάڢ.4"f I[jNҐgƏd㲗DV{')j,qt $koQ dXG1\y~QְK#O_fZ)ejPȠ,91QUaZGZ=RBuRVѱVpuo }&ηG½oUfE}0A ?6ZqJ+xQh>4P6ZޚP0$t O0w%c1R|{a O?VE6 t:Aλ נqw"ͻ1PFp( $E~Ne<OF^^3@[檌iqM]2Ar.{uӇwV:SaȬM \ ڒ#GB:bFxRkLYd %NvL[E_tX/s妛'%$Xx\O#Q=^%R#Ӿ=iu5$_?3,S}0{X +1cV,Kx^!$=8Y^vaOQtGۣ;Q4lE'$V[`luwkV lYIz#X**;IbqtwN4¯%s\`M %9l[}!dt'Wn[]wl -"Е {1*s9U\n !,pwl#}<擄N1pT9#(TD`>^bۭ{c \5~8 LU`=+['B+pvCk7DUs+XzRD!>j/#ݪx-7ZIT N籖t?T(F=!ܲXt%:;GZ%l$ No ϼ7C#Ͱ4RJi]E{,9RɖRC8V"*J#_(iFU27=i6nByc: 5;" Zm!qb}c{bQlqE`1|) a{rΟtOaB6r^ uZjʖI 5(0\XL E1Gwlݸ-Y:K !rt:Ŏ@5y@ԑ5ցΞψҶIrr=zQ}HSzJ-&󡋬XoUTx1oLt|Swy@ g/5Am# Ay}6IPL:bdu4Xm*,鋁cCG3;X]pwqm43|+=- b6Wv)t[e-uye.=p1$tGOr="oآuC&vU^$hCNH#y'Ui9r_%iC H˒k^\&bBv\2S(Υ oR,H묡d`ZG'*b ;}΃DJ;Feѵzckuak=v7E_& _}|{56]گ|rSbt֯CԻt6|Z$l&3 y~.]$̇]d K, T*ҲNk{2~^r( Xz]5ǩ?wlJxI2 r3TQ&7ٵy£dɺ:P*౩sD]gkVD PkU&H@Mz C2mR/{$%Brd+r>Fh/$%Ns0,:-%# Bd_pK+@;]A6JB/&;gr9q5 *Tj-Nw]QHg7?{մe[H4y͛9"rYÒRLj;ci/UcԯlT2[_iOjFA-Q@ K) "('&_V=JP˨/oOGW=#]lU"G=8J;Vat"zDvب|CboJe sфB2IfQTf*QO)˵,EmY⏹G h谤RU;ÝS8:fwn~y't$ Ū`dѲ*4h]eå\NC1`0؜y>TG'ѢrF֓`J;OO1~ˀIy=LZ)U[׵|pY{aC?&::=?b_HJ?4~/(&J:/(-D~"/Ȃ +6*g8w=Yhvyop  nE p oՊqEe,t sXVPTvD[J~&>CȘQa;?_1E__E ¥I@tɇW/ T8Zg6g&McvSJ6Ԙh2XW@`@`L*3Nt$LKP#w&3vIG0yogrBc`ۆ!cu;1#n|{)Xl&E "nLtM!}!$r:+m轏! m5+rM.o) ,sx[S,qx`2zI*W_qd'b#rm3yszxpΎ{`;qro5h$/ҥpĄk<M^0WOحD8k6hb'cI<C*>5tփH検OP,YpD:2l~Bvw~a DH?> 䫖U|{iD FPz3ݼ8#c0oS?UX{ۗ&M~PZCR.۷WVEvF~{ftʗJ}Ҕ<5B]u*P[ ]3u51cɍG\^DǞ#wU#%<:KkIovjm/_r_V;XCV4A eֿ>S9UYTy$Mu 5#A*,J>Gqt[ 6 pA?+[nnai{FNbN,r:ur{ }Q8z91ZJ"6V\tH]ʔ1kQƥxkA/A-j{z{{~07Ĵ[kGξ6bCCmC>j_U@:w{ 퍯Ux  uz-1mS4>v_F_k]MTCꇭhWdsUYJuUgV1@J\|V{ _W+)}61͍ǻGP;3Cl Nql4n+)-yiǘ63[W<6n Ʌ%ZpmtGee枯hjoBԱi(P*>m/yQzg6C1֖( ֺ̧wvd'@XsͶԖD>C=έxE9b| | |qYF 7sLq]%H(phgW&)W~`76 rAJpJBO˴og)E>VeaPyO}-eSƇЏ>񩇃WN/F7೤o˻6|1k6s'ĸ'Q `\&0"8av4> S g2)MҤFttj# 7!)=s(5{} yX26F<$Ń F:*>SE#Q5޵Eq*Ӡ]fc :e f|SⲚ[oI4:Yƽ5y9%H9szͱئˇh߶R`xWג[vq>hl:uLJ0 'G V:Pa|Vh})G#ܣĒuƳȯfje;LcPE0[p\?#-TgPWGغTaɭ^z0 䎹mTEF(@ '7Ln.uOzfpZhW;yB30͋e=,jcV!PN'ٓEbK(m8qMU#Ż݇kƎ9}5<>XerOV|!{aD$A)Qh= .ȼ$CC'6g;|z9 G; 6z4 vr4\:y})cŹQN{{rrU˜~a(.a9`H7|#~CxnRG/Xis ٸLq.3KDMF&0ysXweDcpUmL. Ez(Ii|Rt/MiuA}3-B"ȲUK*7razLFuQ* /۠F዇2yʰM2 +˼]>++.Gz OrXm"?&HD/\u,{V-[ȠlS'٭H#}AYkҺ&Zj3<9|Qq!Sf9wLe/{#!a~,'\%2#89eYXrBIJ%+W`vÄ@Co‚b\ynp=IJy7rThm]3j& pFcgVeShqXhM.#>xe%ҏmA stҽP.K8&ZS\ğqŅ b6h?{s$[!@ #_Oz,!͟,7_ğX'*( ;ߓx(ARR~+gF8@q Y4s'<FL]NBֶ+Aɯԇ6sO1Bǟ.Px~0T8?`S.-snE&D%ḪMF,qik/C7HzsUyH*aty[c,А4\|2243[S}ʅhxdr"-P-VqjCK}#A aP\%WW!ya-y`/=!]#P&ݝ_\kESK- EΖ+#}?.KSBِƄY#y %9\,8ʣBQ7;Z4 |t)܆ oQ"ߝT 'ߒ_%&6qCCip+f0FpOY3}:}93l@xn UMk**m):lNfl*8ANOӉ6"Z4 c0C*vʭ O}A)BtVSW{M=hd.vx>luhV.I؄t\eqPopz!!dNO Pojp$$kFw%T/\%oP[I–6 z}ob,P&rN@+}0 J#2 |fQ-uxE:-^W,lޚO#D#"7 W/6, }7IwR5-'\sI%]À0lChJnPsM[iMB'\y)`iNpK7mqa"O|b~=ZL oP[L}œ6iAONXJP/SvKR\rpWvqcw x2qTEĕ]Cjk ܩR93Jk#,%v}/o󉛐I[0s & 繺RSA)JA7,?#m 3<~Z6?=Ju%}`}{e= endstream endobj 86 0 obj << /Length1 1630 /Length2 10236 /Length3 0 /Length 11078 /Filter /FlateDecode >> stream xڭteXے5Np Nh4 \hn --@pww>ιss53?wתZ%T`?,e D ȢrQ1^TZZIg)v2:@  @H=AVP,>n?oL w>;+;; Flh@M,^? .ί}_݁ `s/6)RYRAE5~?m)e&AM3O;vےr|:rqVv،0Ru"Nxٵw6ԍ Gߜ0Q\;b~6O~ۂ] [wpHws{ c)3VȔseޕmCH-01§Jq#^ [oCD: -"(X0Y~6BykGq ) #d|LG~^xPhʖ.!;`7Bqe}gXb)Kߵ 8ǃ;y7Pk!_ '6][ \9iOe{,4O(/K9sJ7G'O9` 7ڻzw'UaTm'ɦ|oVAhh[)NJ@ߦ(ݥ^^L>Qz_TRX@d2LҦŷI!Ԕh=\޾'BS[!8SȀ6_un`H$x4p)a Rp{3“<:1},e fYLcݳQ2'jU^,T 0!e?zXSy8˚4Fȯeȏ7>C+m3.-)4BG1(/#VFc"EkoҖ7=HU9_(wwIA܈ خfu;Dь)vP73( vm}ߦ)MfqTyCe[slxTxSPt5 83ϔ< s컴`0#9__Ne#/F8U?jXFt R.4j5ÐxئxpӪ)O=Ji[ˀ~\10A7#1yXa{s_[$̠xx`W.,!p\o>n=OC]ILuxVMe"_LH06/C}#+EvN `G> NlFrɢ-fJZv-a|e~ V"L5ԫb؅NvK `P'EFn6p9LMĸ3h :*XVյ^NGk6www첌Fsf{76>xg!8~ߨQ| A ⨛ݡYo~< Y٫ǡc$3FLbIԩAϙ&#B8 !uV7tg-7{#[ޡY ;b%:Zi~T6٥Q|a?#/g-lӠ]N(@m @tX՘^zg*ԍ'SSżUlo^Y=fE>u7=M0 Ĵa'"KdaBRSh%}MؠAIKQGۜSU1T.$OԷ:}y|Ӣn99Q( Jh,yvjQhpݍᨩ|[6{ Ns&41dX"s`0u}ɐVU0 *K2X%T> OWR!ϛ6CwZD,ef&,Xw$,Z4t&=Xm!1d9(IȞܡ"o/Um]Fį@J֨_Q:kU3 (^U6_U68H%~?2ꁔ;pNlPƧ5qӅeąe4ۇ2R`ClZ 4:/Bܻ,MvdV'<|ʑvK1/r9~^KWddJ&wDa\3|te+9։$Xz?KGt=)T6e#}&no31NZ0W^|&y|}jx(B7Sw\'6LUqg v!Wp\%ʭG L8gd*oC,,h.˕kf/}ePgUq,5+z-LZkoɯkrn0r(u2L g(h=pdN/KcKϤaO`"p[~20 gN)O&9_}eK [qwٕdO+i:w0W/VAL^1Ec[[SP>PT?&>x? ޜ v/a' *rGϾ  oEM#(X+Zl*`}k}X ]NXw`_{P}7zCeE͆պ-HT(ހJ~I@V7#qF` _mlVWLZ=Eū&}8?"o,dOZ݅yY7o祘ާio5ݦG"p<EqAȶ #UtNƔJ_ VkۆSndJT4GpVYF v;^ :9GdyGNɧ^hhu/[Э$ܨQ77LCR7{0 0aJGc pa(@siPV#Y/`d$sc6נ/礟=]v/8dy]'+po(v-HΟ/ mFk:j9U"ź)W[XTMRh4̔gO*'q>4$ b&c;ʭ;4P"G$i }-*{cl/ލ%]1Xc#kL"о5A?SU us[VH4ʁ?su=ft/кNgN#64H@ 9#^1cMkٯ[GƻIѡ=MJ/lɾ.]E [}nw?ܠ zl?Sr1_ wx\n5%P1Qhk{-``ȑ{r"' ?p+֗;Q*|З:"fx*fAWxDB4Bz\c1jDs{$)CmnL6󱰅Z,&F]L}YMpYz}]pCə8IvGxwx{V0gWx^mC&h)DQ|O<cu?:z)L96S=hQZ;2@rEB Knq&lB."  3ƙ)a_plr&Ya!)nLsq@ 2? /H[D)}mz !rJ1_peS *A?V|fKI⺫!C$Q2:H0I3mX&UcPPAKȶiTpJ[ 2z6db( kg *;m{w%1tݙu9'O3|3{ԠjQRUgwmRr D(=%#Ru`z>Y3^L/JXE0riXd[`uV^3G A;O~̀jr,<qO.s3\jq6`T8TY?ç85`GqȐfç#B@AݟtkTYiB|b^T 9MpݏOFE,jaCOk;}%wȝG,E 44_X|5}"R}{E=zذi۪ hs%!dBqusxEn"wzA&_jٲcG||ͬ-h$s'c^ v950{o ib 72/:uS܄(ۧVF:B6Mx4T(d_hrVk"VRZ;.Tb4~8 P #j|NszyӦLgp(zI-5ɸ$@[n[ =GE ϸ@g?-a'|NKE^"pM/Vg0,je2s>1qK.̕dV7XwO.]A"jHENfw>Üp)H:@ a&MP$+ |;Y6R?Lg[g\,t*b gTz#*%E/2y)s÷(vyD71yn{Ttt}n I)6D1=a."~NAe_ҙ^f3>a"8lvc;RzٝNqĽ#$ ]>Oɖ,EHH:ezzV‡3_  `:Pf*rr^= O$xJ2ƙ|"nF$._Oca ޟ?mESC/uqw⢬8.6Kq.']AԂ<L,2*|56S/¢;?VE*~aev>9xV[iJ囙G{LY!b\$"SFGWF+RXA= k̋jb [y8[^•Ap>t*Wv ^(WeIU䀣Gfv7nwG9[δeU=t@Ò*ܥ>rŦݙo [@m}” J2_(`~}G Ա4+";C=ԿBŁDu#J&:(D)?\$Fj(f}3caݨXA`qhx978Hi "k_3aY8"H6K(b ?\'aCqD!399ˆ~/_ 7;xTTхY5|+눼+Ry JO-LR0ݨo-]"3~ZÝ 7ͦ3pEg?zҐihTy%9o\ zB[SGh&/K<=ϥY0(R+?w!cm;ƲVt֦|gI{D)!i߶O'9wseIemoi6mbW?R?.˯h.Rf.].FdXAm, ~;*UxAܓ.ѧfP#neGƂBrCycmfgʋA搡c&ND$>wۺ>'~*)xI쁟t3q4aBKUYsTKAeQ{ap] 6Sf0_ O/iCDj{+?#Ewq/xSyg{yo9ƥZۆcaJ 7ˆrcy S ^]Q$`ڈC ozf1p#5d6cjqA'd;Fx1B '!6Ge~]t] p#-͏!?+1t8W; }Ic9䏥jmF c8`O+cf lOD^҉4UNϗ*%4I|GVo6:aX= ߙ7+g+.܉S٫fVGK{e主ϣXR4.qƥ&@5殚):p6> stream xuSy<['bX"Sv ƾ6"Q4 B!ktmeM%,Je)d,IQス{s;rGRNCM\_ 18>kL8 Q??A|q}sơ} Bww $`~IiL@18@RC14F&g{9  5/T]nڨ{Rʉ2qR~O orgL#.o2W&k&k\{̢嫵l4?@z?:_K˞3 |d|dE\ǰI 853{֖E@v>i_ۚ/ku|£,=ߔ8VU?Ѐi V}p)VhyŻRx~L'noo:eY {FC2o=l~.ɮ6$OX,83T#Gb5}3z[ky {M73xG_7lo|;P&`/B,O &͟7GNW1oTQZ…%d&BD泄f!Ϭ{ܮda RuU^ӘT a.Uup`޳;An.7IUEC kb"Kn;ZE%0{ ;MxaIgL<9fs[ȱ+!X 4&[6 yI|3tCT%W] ^}[cٟBb5M dex zO't|!2W(]T yQJYux2,5"zG(V{XO ;X]SԻ}Z8 YQѧh`U7[XKUcg= CdT7T1O_7ӞϊM 3dz\I/ntIU*5m\gv(ա1wLHkt2fک0;zD`VeBܢtDdߪDsSU{Z3Rʚx0Vts b7p+6Pч͜J|62n5 k8K1P{uS4Iw_ m^P혅mX~:#vHmɷ ONeZ>qtw6T?ģjZd?Vdc"c62#xI .ud0)|-N=-U -~o4-c;*>NUcs4sؿ l4z/ăo2V cJ7:H3p ԁyPj|o/q30δfʳ{6ކXG}`)g[̜8VN ci'2~ל :6' cLq&G󅙬ùg|儫C^*? LY I`s`Łж!aBwy'*9%$d?VihdֶFrecƢ6ya ObV ܋FgfXC"aB LVOվ$&}5_SuWA Z4?,x8}xQ6&8ӇOKHfђ)8Ksmr]{c]^{ﶜ˝.Wn-~$8e:׳|F'%}ZO) w2iaÕ_rBikBȖp01̦aekDZNZoK$7-?lW⧧W|>y'NBdTwWx ް򪀪MvN ,)v Q376ysr>t9Tna}pjENV4bj;ΰz"@K aߵ3dZu?V vX|'C޾v.V]#z_8Z "7 5}xw"_ 1EܞZi1.lRMDoG rɞN $c5,9d41 ݼ0 q]b?n7^18|Nnct_>,;TUC(\*\Nle"Νs>-~yXke w2gwk78+7o#qҘ=Zxt|dL4Jqt3{Y /ƘTl'/>v|aYOw "-9=yAuxXkMnm>Vkfj*C~-2wL5ǖ̞N *xUؼ"5Nь}|I.K-+7{X^X/+ŸDr>.LrVU;3o1RQ'܏mL8ХqorH-9zSGqwL4<%< _|H:.p+];ܾkvY VGf?o/l~TTZȤ:WȾet ƣ}l y{ZޚC'x٬Nh;YϢ]gAQ5ũQ⪩#./Nعx~5(>w=}eWrgj2>E |`<;-q,T endstream endobj 90 0 obj << /Length1 1626 /Length2 11139 /Length3 0 /Length 11984 /Filter /FlateDecode >> stream xڭteTۖ-wk(܂TA /AwGEҝ3ސ {"哚M2K`&G/k!luXiY-꽩ZĦYJOԟ?4#v'88jy*jmñQ!x& qZ?[}ڎ_t:B44x y(֟$?#sU|NW#!K^$&1UY _> UM-ءyA2WR /l+ؖȟSOQ=Ȁ˹C,.9(8ai9.LQ]T'{r! a&TWՀ.xeSkLLkRf?ܱgolxڙ{Na89&G*9- Q1?B3_NHN+YXN\"]u. [m0z;GgW̞.Wm0F9d%f>ynd9V1RlMz׺ҏ|:z٪דS x '1Wo80ْ23Ɏ\LzNSZg[si`jZrVpGsɏϛ=$DE D6?cfii`cNŻP~z!uƻ,ܪmhR&LkkJ]ݷD]$1v[wϲ5|gn*u7FI[ݟ~yYR[6ڪه$CUĈ]PvKs=Aд!,PI鐺3(1kTgytx 8LwW_Qn)})B}|m.%[`oy`Hb2au>=3_;±`![==Tr.]w /AQVWX^Fnj>v7' z:Au\>hulЏ2Oi(0dIp=2Hy]b1J zN1,(݄wxU&wXGV{n= ;pmҭ.?B߈)wV[fTxsGuTpx<-H)?."SI,HUhF;5@^]ҟ}k _>!+d=V#Ȩqr1f> Boq2&|^=_ވM.PojHȗ~M~zPx.'F-v#Ȟe$H `M`{uD? #7Ar+){z:ίL|3T q&oJUJrgۊ 'V6 +7+בcḶxe [K4̀G5^`9=-#ѩ2z+9.o{M4I/~YUr>}5jaƑ֍YKnڹ#V۪GiKH֢zmz2{ރȦ `܋Ja]| z8!V]*A?`L$i'p0d6mvEڬkz7|5ͱ].v֙Ƿqn1.qPЩ 9P8f,_(q4I.kmz Hk)cH) $qN 8*˜&,muѾj{ņ`,!zT%g4?/UP?~۫l$*zvۉo#b&&I}gS/@ZNGm>(՜sQ D%_y1Qz2BB*gBKzfR9.EӆA)4k/ %^5x֯h#c>TzBԊ\q|DZEƴ ! T~ 2~Q\*wG R,L3wV8,wRmsgX%yEhe`,/ h+"Z1z.>]IZ'fe Fz Xԍ 3TKKǝWZ}ގ r(M1+N_6&|#!6HJfvD>#{;HM^\C82b]21VŽ?mٰF =mu5(R ڸBa,<VpqV6+rFT=9gz=hpv~0\{ķy:'Pщ#̢ L|9 "h\U)"B@#O:$'|Ic8-QX}rF뼋ZQ)\HaI![nuy&mR[码|*!z0e]agqi:HNh8F2vn픍pn:tnܥW +t.rsbu%i'2UކE+39S-}ڙNG)z@_ɺW[53 t%fWHm9+S,Ϧx귅 2)6* ~q|a ~*Ôy̍<Oj'n>9*!FJ旿Bi,_2[҉eY-O0*LP?!V wR8d`W%lh5s'T1~Z*R]i[fzd\R2x뙦gIPJy=<]I:_{=˗Wpm dP}DB>Oӄ_.m Mft( >@""by_G?R26'lA[jv;s@"p+䗕f9"]XZ}Q ZߑٝGP&ۜB$qв9JYL+(g!u]e㲹~~ FSZ[VFOuI#"-ـx>fk̆/ѦWi6{- cX D5塖HJMc(S;yS,*[3h=YI#zB %%r8fnȹe }{8ø,]႟*۞I Jr(  ͧ{ zΥAWU/]u p'EQM@k@N )F;|2G,5M:׿kӇ2DJ%|&@N0Kg/Qu]"nv!e -< <2ņ1>B։-zcQw{Lܻ-Sv$%s!:7V)bdOۉAa7ʇ7K,۾N&V4RּtBTz5C&bu : EͳhL^㇨7V]fCh bѽy $bLd @p)N&nB|,V dw X۷- y(!E!FyYo1~ę[v|gl+$ODl^tx"8L[Tf;ȒV9ӕBI3p7m+.5j('":1WAxjȕ|\oDEAb^mjQ ܆ hK>ߘl[/jhIwN)R伍Hb>Z_;F|eu7[ n$i+P;*A^#L.MS<[71-u!>KZ[ ~}9I'J6JU a[\[=uz% "EH7N|b4uc 6IHU;x(3\A̞_ I^y6B6tsŷ\z0YzMD7g# %d4[NѠi/+F}c*i9?0׏ϠH? lɠxy"A=xN(KݽzSnPl$ybNw)7Kcy(L+|Zlס8ղȜ_! F!@iљi5{^F4'ō}cl9*o5[jO;z^xIz mUľQ'LsM~V?}s QdNRGEoljmM1.o [Eϲ# pΘ\IgStq’~WbLM╺-3wb\MȲ-vB$PJ-jce<؃+e K}{S_N<%MX<Djo Ml[V4iGˁZMkP ʯdhS}dp\[zJG]fwVzIu$pF7eeh~j )#c^~?S"Vl+_d۹~^.55!ͶYJ-̡PuM8ㅇ}$'@OIU{.zfl}́]~M8A8B8ZFrrģbxN,׻hX[\;@GK-ʒasq K81CJ*j_(/U(_~%EnS}'Loz0 gxdO[=W? /4X*ٕe {1;ŅG?>e+Chr&y)=-3~EaWAM '7lR{&Eh3dPJy?oSVNx_ƚ&;$^$]<7&yD\׮*hE.7F f SUdAV`FbSʋ?G[f v@u6kܠSX^F>j{hf^di׳ߢ efa߹yw'jW]|_č_z)P1iʴpa|q4 OTtXcy\&_tnMU$ڣG+E"i?:;q &'m!=2}SQt;ϐVN c6]g,>&^a/!ׁ[ڠ;ox/[DШOYH&66D?)Yc7FQOQ1#FWg_R(-J;U[&c&ض}K͇2]dSQgo=rś waz;@V*DX_4}j{KPM)vx얤r]6<(Xւ 4.j_2=ԥ[ێk6O.4CU/r}&cn/-͊rRr>nvHّ¤jWCԪY1|3oF9̢R2K'L#0cW_a[(xKVӣDǃ rZEZ78acE3$3,BNm~h+;*}ff#gK0%{U\|a 5+B96]Q}Wo9+VNHO r++;tî;aog)̡Gn"sseE"1~,OW4H JR r[I߈F}L+ʢ_]GԔo<"A>eS6KPǔdJDg|!t%vZh3UfA$D`z<z~⟏O*\zȂ໅tP樓So֔z 'X"6sXo)%' {z|ʄpsݗSxl1+caE';TM\ɌCɍB"';""whѶI}P-t(k-^slj"fAB:W~doSwL2DADYc joZ^gk[|,50 ,5H|:*HfPyhc{Q٭bXk^q\9K>t$sРSy $ktx?O:H81eLQaztЊiȍuG҈* Βk΅U,UA&TL7Կ =MCIDN8: (|wksr>RGHcWJJ&AFgrSWW Ra5 7NQmmcC2s$A{(lWm|.yjy~^oxp?JpTBqGq ˎ}PG-<+FeWGtnS$ IJţM;Iv1+rM2[kpp-/s#>E`~hF=A}M#ٟy CgYLIIwRk4z}3S vspR-0o`U0atPnʘJ0BSrϽ^$Dָdv%҉ʷWo/(lagOɁѤ,."HjsHjvH-)gmJ"~&OA~CFa5ĖBe-UR endstream endobj 92 0 obj << /Length1 1642 /Length2 6839 /Length3 0 /Length 7679 /Filter /FlateDecode >> stream xڭtgXSm.U U{Gj^E:!  ID H7@H "QDR{XZ3959VQPeh8۰o¨Kq Gm#NjiCOH i4hZF?1n@}x&!o^*}۷ţޅwCiebo)72zdguT@c-s7S8q]˵Ly+-VPoy?jݿsVς֥x>_v6z3;k<ٟjV!rdb{ kthGK4ֹ^65z8{ɽlPL 0U#s[˜TzqZNLJFwox|SxAOVℷ{Un|S\WNr E58 S+l>/D+O'bb*J{\ L|yY^˾ oOA8զr[Z{Q .iTnr_˸nǏR@p>Mܺё+;x+M\v"k Ʉ5105l!2e \I㏶\nF1H׷ 4.}(xߪ8'R8,0HIEʤ + %g< mu4{Z79^6f[X=ԓ'=$-e'N=J<,uܠq ffjh, V"jM4ɿ8?\x>ܢ߇sB]ːn+lC&P_-{bHa4Mokjyk>&9TGp!V=0ALy@#Ru> V]C_BϪQ2D!S,*gbj^ Ze xQ( z^);%&-m| X࢑[_hby770A֌q**j_qEDT5Mv')Yr~@?tiX\V'+jRyd;\&z;*Mוꪎ›<XBd1=8~n*¥ 16}2ix&˶Р1UhOK2Z kjX/UIA`b7KYMىsDZv2qbX7wuX3Lł֍U[җ ןv/_`+CR$@W`nl'挛WP{NEO0sw)OW9\Ns̸ʆ515% ^<R3?Q1|/Ȏ$"L'UT.9:V $kU3ڥLLl? O-(+$FJ &^:O~|wu/.nhus2>#:%3q1m8膧'%m'&ϣF"5Yͨ[3pr`^R~ ˄QWL=ELfh)9{!o0=[F73>ƻ)g2?8)L-BgjN}qʙ*ncťB g.RnG9Le1vjW4; w 2xzM^#RrV\ #m`V-EN>">yz/`wB1JcwIXЅ9`dPTSyetOlM}VM {[Y!uΗV)i~8d2ܜ^۽zr\mՙr2D| A˹nII`;MG֟)lrM4D1'*Dn Se/OX_PħVU~,r+> e{S5ѝIRrgx_9_-aW_ ψ V!Ɵ cuLqџR ,$ }lR[S+ zt?-.(5dDauao/U8yF.H_Z [*{J}?5h[ox|YD W6;F-:/'|,^-W28qN+IQ=U ^$[{[ѭ]4Xd` QNrT:цEGl־@*g4lP:Vtw*-\EwQy+CS.3&Tĝ8PrfwͅC=菊e#5̓(&!K*"LP5msD^-fvs}'بI*˲̉&-i nNSśR7Ĩ,25sj#e."3ljLjT<[a0Fze?V}L؈,6 ddۚFZ?w\:)wW T;NչT R <ͱz _qwx`Jw)^ߎRp"|n$(m8P4(12Xr-_sն[t4L*CWM6: ,%>IdiJ!cMc/5"BVoi.GHD2˹yOŏ/@ D.hj?|wowT ,VVr~4D.K%*?q JM={Nw3*JUn[hF#L!b:'ߒ6 mb#.ukʜm*?|޾v1/}\׹wOD0ޟe-OU:g3\T{hB^62KOfᤓ Qͯݻ>i&7M.Q?׎(jɺw-28QG}Y.|ۂ%O(6uBU}3G,mP]nL>Ҍ̮nF]rMO(F0r*twL^(޼Ǖ7}[hCN Rp-H0$&#NXšq'C*QZ7@qP64g J&YH=:4FRc#+Y#k&#Сʀ:F sx^s}Ѡo#۬Iƛf"Ho:|I}]B~O@X.sCtv[`MDk4[4b4mYo W'/¢̆&b%T.q!w5yܗݷnJuK-2E>UٞS9*$yZfn 4VH;*ذTpL=ʕ|qO}L)/AW_7!bj.xBOV.o $MuYR,h =`$gm%Qfq +yK;cEͽm"xϐU/vw4+zND;~-!g3O>dGnڲ Y9ܰDA$j@lS=6.=nʺ-dd#z&^{KL||ԯ+'6^s|)$Q)9p 9~%Jzl*Ν-.w1M&>zF>N_d ` R8fBm{}.(H]ծzmVg۴txHAaa=%bu]nPH5+򻘜JIܥ%J!" 9zu+$U1Hw|d>I ucvF)u8_ieb -_b|۟^ e*+ԟOxƁf.Yfyw #ǒFS6ujK}9k"B^_ge2q:Gdp؋1|N rM#NynEkB!ǩPkYQCYa`}:}{˜YNG5=E]fRJA҅,yǞqF0V( ]&n^2Ae'SItg|A)TCȂ*UeBն^ @}l {:VѮ0+$p{(^bxG[Ȇjc(6)R{.@FI**25QI"1p(7`Sbj2IOd Qi4E5XӥS>ʫcxHkƪj2s0-BIrEpWyE /w2ރ}:AmzEG4>)ƴ~1WyB*D%o4bOXT@@6Ew!#e~Aذn$!KmNeן:o.ށvkҐ)-͒y0oX3Hq].ζ#xłK¯< n0=X"5Go`u"UݡeR.j c#>%Xk=.nﻧKBlnN:^GsoG(L]C dZrY`o|]MRe9.ʖ2c2jҞ=UF>E2Y"UH~zAuH.vh ̂ f{u$;B*"TpfsP#%,]EH0\Uo5U/",6̎z6,;n1k|} vDm pAGtOdp[DCnwr5({Su90im9mOI}6-\mJl|0JN\5=fjT2Guc)eM~hG{x;>pЩWcm#Sn!?;(QaORVZlfzٲNT$T10q_Ƽ?h1JȌθ~U/6fG3<]Jjbޫ3*,`A3\#zz(?Cî'6ur[Oz0S6fƬR4OxhR asf zf5ѵ|Ra3 ?v2Xݐʘ19ho0t#qJ={_K8^ JB䉑ǻ WwˈF͡3~•䨈jkY7I|(qe.q5LJW|p7huet"zN}sQȞq|6`tȡs 7 ]d(TP\dFj<u1c-Җ==8Uռ \x vm7}Wh,Ni5dZՠ]p2on H01h,:7"?f}t[*πZRL+xЊdLyO]-}ťy]_ x=ck̔xܻx86DQEn參< ~i@|!^.&eSq`: i ymr|0Z+oz5 4@!z.SޟH ͤIDG#9w˖vRJQ*> _U_1l Siʧoi86(ǞB&P/~3~\ 8Z%(*RB¿%bm7?! 5oౣV2HC7?R9 =";߿ Diy Y}fpL67ypLV$kJS HQ XdtMҾ7d |Z4'*5>z\E~'n{輓>~h y\Z`N?K9`_{k2/{N*~+c%Dž& l7_ (ZpeHا\1JV+I܈{;IHb2ʽ}_FMo31mL'DQ%q;oDdHv~I(u=PD!\[49*_i囸QOQk)i3Iw[8+=yIO0QhrYLUk();Թ\:CĖ`yYG:+EٷַFR ^U! ͝ShVjf `L jaϞM8 ^b&E J*~(ߒ>* t!m;>o"e RJu2I'2OC$ lnuRbͯc;Aѕ! Wٸt*mLG߻ pm5c8M^(ŽJetG_*)(uFkʥ[OԼWwj:ۊ*jzw $$)Li55JBYDԅ̹q-vCof7idcP>]eʟȺ¡BSD@`cu:`8A? 0tU+,*>Rt'mRf墦oqhn@gp v[bko(9ĚLLLҢ*.˘F7oГlmAaKXe;goQoT3}6Sz5)̨'bAayˋ q 'kk.`Z,o7rdEK3|" CEfSwutpd1_4^~@rWzfByA h3ʪzel#enQBK[⸧RʙQ^''0TA ,cރ_=XPNH~4l}Aٹf6Ȥ7Frˤ97y&Y/p5OrW6Շ*ܪT+Y+w'Ю|W\Ӯ?')3 X&I*%#TO-/ƻXX]7:יyRon|oH MeX9ݦ|?<]Լl =)c~SqfB2r` hѽ!ISj`;휕tw;"]J` 9 x6ۡhٕقS>!J:E~ Eqx.$c1Q4VJ3y n[ v21a?&}`k;jXYz+tw~%}`KM.֓'zo+Bё&ÖTx$$6%|ldx0u ,,p@&ÔNQ E˸ٵJ?](KH%li-*J9Ak#[~+p5TsV,Ǜn5SG :N2ZoӬ-9KmwNI!,*/1zч@]~=ɆVfR FiPm6{I3R9ⳙ~-oA%KW>K47ߠȓswf9ol@QH'it|YZtS+&VY\QÕfHI7*è)0dKiQ @Bfu(EujIsnA+zh hTѩ4BHX{ojzYU3KH>)KѾu)t?Yhpp[(Tyk@AŸǭ^>x;fg`J?&z9I`cgs2yɖ`-KhRlQ#Sayo}^4P)ED7Oy$9;DL>H{:] KKٙr?y6 zf_N15ry:Kf bu7)|K"6cMX[ˬbNH`U$^>:WBv8 mGi68p,RފtθEW:n-C|7q!f|`tQ5?&qH0$FۖCrppUv1q-e !RXjE䫃-hg * &j?qWyS\daLfZJVl UIu)7L1*_ᙓ+JX)J֒2lasɔSMd#JxJwOP a?}+yQ}.=ߖ*+<\&? ԛx?9ԃ0TXk._<g`jvEf](#:2kv]j8jT9"t#'46wl`vV$4[SW>G\yϝ-GA\urf޾vgT}$D%)ȴw8~iKx. Cւc=\ 2%݃v q"yhiYEJq$4ιk]QiZ2V""g8 sM 7ǹd|4x4%6a u3ZIP쾼-Kcjϯv~nw]=*힌u|lAiRuqk 6W[ei] ɐ!@dY~H_Ns>̈́5fޘ aLPjNm)k%ÈN;itAГ(D[W =0㱂 .ix` I5󌑤IMڀg ŝB*/o.6w:!fDZp.cyĂJFR~3Rn[lܗ8\2ڍ#GP tgBDos9Q91aLe  ~r*S{{ˡ_V%-&L[ aq|5vGG0%B7!}(`#5A1YI@MnpN;T#P=f) >s|y`' Fd` ,u S CaǍ>Ӗ'jHDgՂrt#nҶvY6V2,As_$)j>.>><[_;=hExO`B m ꃄ2#fk p sWȤigvV|">;@9aATg'@ .wjt218;_&vgj,7Dv?,JyN30_5*Z C4RKӢnJgW8].-b46aA?&0ntsfVF ч, ?hwN?jNnE";muJg~72,P4߅h\?L@2!܂m#[W@-&lц/IJ51<Ò?B>'E Iy9 3~1t[&yh*YՋt+]![dK kQ`\W:ߚ|I9AusM BelL(gг0Y"DB `!%Z菨.4I<`HYipS]HX釬l  L&׫9S^\T"Sن۠=Gy[8m0BcfBpYn Pn0+_.%>;~%;,Gea"*GtVuri8:7c%=níAq;J@p>*(GG2W w^z:%~ S&|+ʹyFyyz5އj YM.'7 e؍+bb"B6<%ʽX ۼgrIqV`{?!e(Xë򶧊,[s$P2/?]1#'N8KxYO]^j/93U:+lg) @ppzeRQOOzoMM_kNshO^ZW[((<Ƥd[ bیԩA.w Bv4ۓY xcTi&r!1ji({hL4L515nY@<¥2dK` Ahp11nG,f}N+ W -拳n*ZBa W(yj,4PN@rNY Z!<B|NLTCHll0cW^սݛ S+gchŭ 5A9joКB^Vn}-^\Z8,.l2v vDe3b݅~GnLlv\ `T{?+ӂ6ufH}N""3DvZW5`O@)IkT&9:"2x(\BAcw'S^ tP 7-['j//B,g" 1,b z<Ns[@ß1 &5SYSNqH<0- Wn/(3*2M;VYcQ2:2u,Ey}#*P"v5ӤBNgt_9|~2^[; m kݩ>VM$?|#H>,Fׯ]X o/02B =Q%@9'2?!`G^HPEcv! ӀPyEGr ٭sQ,um~2}N8"M뷧RSR:K0P #O/0` I'ObINv@ansiGFba|2-̿Pb7=@Б:a+h""s!K0] $ lTu7Z}Q|Q*2Roxh][6JPNk*ブr{}B~>'M"IWR, A*/ Ą"Ox̋N$%0R^^ӘJ=@L >.byGLy{(c^g:X%$0Hw]lJlXڵR5L#xtÚgU{+kr8l·>GH=H)t)/66{e`ږ$ ;xՙZ`Sx:oTUWb}#G7ůຩi #g/mܽ]foR8.%V ;bD,c.671 V*=+<_DsBLeܦ6KBi]ܧm:A=Pr0O5>0D̄L~dAerĵ#fBpwą,ٟ:+M3ҊٗnLr >)Va_)C;7N>EAD@ܠیۄ]t2FOV_>'pMd#"ho?==#%&te;_-hh,š@Xd*7)8izwl/0.͋n}>$@TܶL\L]{¹g]&abH *`}KMbݒ#YdPơ(4iK-Vs!iTy>B<&nl<ڋ=KF۬jo UsmC:H*A9;[h Rzzz9ӚA|p tU W5~"ɩeg,*Yf)cM+y 9tdBƌVhjcIid%cq5=*o:YEQ>$APt3Ю$ܻO[IX C(Qi AG3v=eSPs0V:E Y2?((5Xyɕwb,ϣQ<6Ts+vLfmlbD4!\w]gt,倐|dwϲ5P΅Déq4G`7]W;?`Wn1*-[H9#4ZN|||";쓀ssf)s:}q3SeԵ:۔08Z'11!RxZ |:ꅿS]c٭:g AA`3&z$Gк)_B\?H8+PEG<+&=2i6-^ F X=t{UxtQ@G5TK&kePY11]D=,ko+ԃjg .}gK$`F5sHpսW K3V~<%jvXPpTX !5"%JĿТ{0,rK<5?`MF|,wk`M(Yn+ߧ:kd !|ÉV)ꑎf>4_~ϵ:aT;kN`GP=8aa'x4&Ts2ݶ;Ȑ/ηَ}nET.Tdyd;J I9 E!d=1͖*IDLqrM;Ȁ#~Le$4buqԛWgbXI9h> SX13tSk-*Υ|0Mmr#浻=ѷzѷqN]+Q%""!Ҩ䏨&&vQ.b{̤m=PdTG3&mOpo6 <# ^휿aKýӒ ]"X羽!tuas]lA{WmB?+ֳy(T+,ԅթUIK["MTnZ?]30%JeLfl- 3+^t*VI+1R'g ſ8*@].TRGO\ B[7ί4۵m%~KK4zNFO[OoX_@K~ۆ6`].@ QάM 3f5W}CRժdϕ@!q );?T6ZW A0 ax 屣IJ|9/УAD ͭ!a,O֧No>p! ृ4A_h#?@t;:%'__@:''ؔ5QN 6ڐq?8%'H:ʫu6vHNǼwE\4aFeςHO GMf:͚c_c)-ٛ#y +J5| Z2W8Un^_=ab`Y:snAhA a~q1XdLUDUA%F^E7:F'9$㌭FLLF}{3h^pKycc:! \hʔCTmn0u1 _VMYEFp@ݹM@$RAO_xԻb]sMS&]6z0n;tr)X(?`r9rSG%+(K`v7nFvD@ ֗ҀFR8dQgx,E_G 2r*z]('g&v 'O5NG6 K o$l.Gp#FS%~ l(*ljQ'ywHPP؋ FMt-YJI;$J6u_Bfeu`,N_\ |_">HCع+!7ed<v7snsS 7l'UU(ΰq|cl H'a)r)N*$}L)/V[P|]]5w ^4- c‘ĉ6-fCLfrrj-t*svp^!12˞OWfF%5"7H &f;̞V*N&JifbN(о0Lj,8ي0wV g'-ktiOc{PY_O :.(٩z#ၕ H$IrťyKբU`OX)P52׎# Bi{V@C}[ዙO985Fi4ek~@T'cKřMWoGGbN~36Ꮳ2vF|V+,pyrƵǍZ| P+imq;̫d=ǔ\d\vSS{ .~{SΜq(!^+4XlcEÁ2LnrO6RJA>4_r<܌e+>k\!V>>IJl&rP7{1%QtV.AKTsi_0>UdC9x? syufVFyX7 0L)%=J`{SqNxB\G_|BWsN=d(kg :#LRP[ppR=a8R-bN5ieĬh8+,Yea8t< vwcG:=sqgB_~ ߣ+fӋ}gP̍**7m6!G^ W@4['>لx#Dv)iے½Sjּ:QvrG=޺z~[!nJ$/P> ,6`Spp[kDvH1![CP 8Ѣ1=Ri2+҈TU1V!^#fEE`.qdq=;DhKloԁ]x,˷@']6++>(%It=nV߆ݵL =Go0ך!ߦQ- }?߿0XS"z~3DťR4F>7&nĨq +ͮtVZF(JoKY/kR9߸||i0ȶ )j:^Sscdr*-xA@. t!߮Qo o4bN%՜XǏ<}1@#=4IڿٱPD¦aƥ{G[ .clϩ}c]ڞ{  pviքnބA[qaЄt}J[cw'.' 70Rhք"\) ZvUoMP+׼574PhDO^KX`z (1Ǫi# Q3T"(.t,~*8e?K0_J-#6Ƞ/"8)#l)\VHkqL5 H*B-8堻c >G!ڶbL9 ޏ|UrX'i/#z $spDVGq{^;>0|bBړO~Vy/-NK\F9EF_Hܷ~ǃx  rta$ߦ Gkrwb;[Q%ޢ wɠ~(:IEM0BLDoVPjөHuiVl|g>T] Ɠ$*5q0X1 7fKO[60B?[ ]P;p|3]7*n8_]}#aTH'b( JuK:Ax$k(( I"͐/J-lw@0~C3e{S6UȭLS!9Bn%QfM=v}70l MCi)ڰ{1g;>#lbaBUcnJ=]7 x.>hB3)Mo? 0>.܏oIˢ"T7 č]$, }rN[-VtoQF%_FT,tWj\nEpWw+A)yI+ t}d~f>9tf_^TeA=M}mgI ަCQM?V,a Y5k[u^[o5]8O_VޘM/W+D\ h@\Iǫy3_T[iH9<ӤRh(ӯ) O>4)K :!+Ȩ:PaݸnyJ~2;|3j<'Q3sղ͢v`KP?2[7kցdOsb"O`Df{3G1Gy.68ѣJő2eJ.@K#)m?-w }s@v5)P,8s> nNrZ`mK$^ertqL#> 4H7ǜt&g;kO kErpC.q<+ v4rrwG Q( 9P:/ĭgO"C_u<_,sM)M(Yy}U` ~k[wM~&h4.lD.J9. ը#!'s #܍>kNzvM|^I2[rq?5$.׾=ļ[%G䶌 {c[c><:V6۷m4swF&>p2\85?g:Ar7dDAe_H:k UƗw\K׳q۶ݶ/{5)BA 9p K(Q'V[whVƧP% endstream endobj 96 0 obj << /Length1 1647 /Length2 8318 /Length3 0 /Length 9165 /Filter /FlateDecode >> stream xڭTeTےE]w'X@cݸAkp %@p.Cr7̟{}vծ6,urcbA-]jP!6-``q[ANn`a> \BBB (bc`gfaa c+ 9)ρ`0 82j &5] ؄PN`f5:YA~% c X0#qظX8=ށq9[.n S=i@]\A.1_uZ yPGO+(wKGG p{e XA\aޏ`.?eBlU+lcbvu}y};_DCx+1'1 (:YC\٭a<..0?aaurX18Ԡn)L7}"$o'5/N-f8㢱p< qp^8 p8xoUr+ͣBl\||!/ d px?v]'+ (} c ;V/duP]ٶ5Mg&}U?^_6.~!c||BܼC?D\:Z@Ɯ윜\uz79'iY8Y=? aˣc8y`1; ٥U~5̅+ vFV׍ [Wzā#|COܙEe#ô;mW?pJe?갦i-*h sGn9 'RK܊W@P9c@_oO1JsXt ҀD7osZ=ʵ;'/aڝ;]m*Tg;4tD:ŵvֶVF"_|] (oK.'E6_ߓ9x)zXd[61iScjKk6l>#JɜqQ-pcߺI@X&錠;1ަ=s֪жߩ,,:񹭱jNv+~D;hjȕ<)FV5?^Ώt.KM裊Utox_34[v&q˲ZRڱ 4R )qo41h' IɈy1 }G(beąsWu,qvD-V3Ő1fUG|o~hb:UdL"K"7mB62@dV%vɈV>'Y 6.O}U@- ivT{Tp^<\]9:Z:#!쀓CͲX^W%E]OL>#wJ="ۤ5LH r kʹC˕˟ohU ϥL4gKmw%l#:J栣bIX}{cp^Qp?6;[;nm=֖6}RbIhǴ9A{ O 1F~]fgŸ!)gj"tsZV b:_;D~]~m*K칑7n9U#fs9צ]0Jx iҟcץLDP&:ܰ#hJF3c۶@X'$Mo4yCZ\&jw'n ]BȅdVU15"36}I(fK w&NɼKᤆvCp]ln{_]5,.t b<27EEa[L=C8uwXc𴲹i{vXJLe8PxzcwtVN1>#8Wث_]Z"Sj`~ױX, Qc/:E|" zH*id9e5z>8ݦM/%䵥<(5RC!Gs՘lvHKro6U*r~-kz Է9X,Bci41i^?CC)Ű|+@I6n4m: n$?s#*xc #NJ^8|UdmTdybiV}hc x$]_9> ."/`r~ñk&5 ݆뮏PXEic܇Yv|сD,PIkݣ1xubŦՒݞ 8a!i͔ٯC9D Ӕ`pətѻt-dt[vӾ&BUmuN(E̋ Ql rO` .M_1!J:LXcmdϜs^Ւ g,Qʓ]DڣAZs3~aӹw?0tv"Cn*h%WT4DČ(僞vv>$ܜ%]`KYE^`^=kU.D?mfǨ؏f!U:Ų`4P[|=`rGNBqp0M,u*]H^ٯ@ M,߁mlfrC.FBhZi5(11 Cި{s4rba xTM2GMs+Aaʛ";EBv$|;]FeSFwINW2{Q@D4LFK^._L8bSy { h'F1g 20)Wi!'m-ܓiY)}CkO\Kd|k*.)F6"=5խ(6$B{3[ 3 _DuL]VɮxqlTo4-AJW`5 T*s|hHzGz({_߿2"c*\3Ocy{2#BɱJ1ehg\س(zS7$"iy;>kƓ ]\ԣbϱ*(]2JʮYFȼvhG嚮BVm{=;gpS&SsG?%g.¡]lG3 !PWnCzcR9lьBͻ>LuzIW힔D,++?yUϨ13x#`6G ?>PZcv6hɥ_з.u62;CL%{"Q%N) )lUJϋ!Q7'[~!HX]MSqD1BoMyqFH8z4e) vu>2z^wBťB+GM.Vӽv|aR"(}qg'(FAchOb_'DEӭݍOzȄ! )ϬF иg'֜+<"rKW5}@5C!j':w :ӿa y!%[gʔ`Fqcݧ.LpS@lkr -m}\DSOlt:N[~PFhyڻ߳oLz+fgBG&u59j҉:5=e.JOJV H"@z;1s ܵf?P'UQkP2r逶g I,_6z񒗹lE0w6Ϯ-0MבWiH|\5=^{ w>RRLSO#PbU>ʪH,a^lYgSeh;rHYHN5%mGEr|CV}U%Hj2ډX4Ȁ){pB?s NF ڃ1?TF$Q>t$XU"˪G@A v$fb3_J=MfN\j~ܧFX# ށYD(l9f.@qAKY\t|COWgtM2R8v3-`| 7%OA52|c=O)I5kdG(thBg^V7o*!8GEӔ~T~OG u"Ӑ_$7w{*T֭/E7l)Ux)k7e8N+ꣶ/wL4R:a-anULvvH;0_4aGZN\z4%"U%6ERuϟ uvIt$9M47}RՒkzuŧ>/z8T5TAh{JVIDs12% OSD PЦd]%b-:*#"$yAbACK{lrb{9>D 5s_dNťYB=Vi?V}C/ϓn2/NFe zmMfuTڛWS<-E$P;Prז;&"n.aBE:pLQA zc}[! AjɈ<,?t)[ci4P 35#.="ϷPBe,rgӸywt?`D1ZrKOy>5NQ RpS.!W踦RW#j|ƉĨS+v}9D{MY2v#"Lzg'5{ACS_~~PhB:>oP;$| rwˁ4^3ou7\χsd bqzCGQcz>;EDy%0󍨎;"  Z8#bːIYI 9aaݹ`Gʷ[ \z` =Geu8?7GHPqa6zC&pwD0v-k4>]J7OQѱB] ؿNcR"F\KOQ&ƒM8V8h},q]Cڼqzl0\P;Jl5Q`|@B2%BuS2ztf]%}%w?(;5m1%B`>M)e8OަNC1afV1>ɕ0{CbRB[FOϥ(c1@˔/)*gIK+-x xΘ#_b鎙L B! %|l#= UOL$ƳmI @x.$mTXh͛$i ,<˔ݺ#2'Z+H #_okm|0q q#Td{4p+vJ C~tuag7CL"° j/nwWquVs"oЧ9oM9-.O |{q?"p;0YFqEUt4BqLڐڌUjZm8kYLgT!o")4h_̸ O-Ģ8Eߓb'J.ǣNmKE%U~LH%enҀULlv{*Њ#c+ҋg C a\ٻXvl+|E b:tRd@7wҝ<ZY)rPD)C)Eߠ1c9]Z61ra_묤w߉Ю(T185-WRJ[Y)2-jV޷]+LGQV~3$m4L!Ce{&ޒU[ς*k`jnp;ْ;x 'hO3w L[ 2}I#ܦb͜CV~@鐑{}Yptw"%2>Mp+epIMʐ4WC^HqJ \̝CYlŕ_&Do<h5(tȏx~77zxWPPN* 7|rz~ʱNj)q0YH3W ַTM,?GWtL 6r+޶٧Ҝg==(ky̢+Օ&|aꔐ4ivY=U$}/`kt! .|A¦RᚂH6hNmrO Ӈ7.ZN4E*M t>Qzl9mJm oYRsjޕ:@>wź^G9TxFLUClsjC|,&I/weǷ=5OK~_S!?_mߟZ2~3X3ߐtB@h|5V?6l!3GlKrb' +?d[>bw&bM񉿻u?|VAxf1yy*pV+h6Sodk/哎d"$'Gtk161. 2܀(gp 剎y"i55vw"#kdoh.)X]gfq%a%p}Aƙs:P|ҶC#$eǻ^ endstream endobj 98 0 obj << /Length 664 /Filter /FlateDecode >> stream xmTMo0WxNB+8l[+ML7RI";onDo3ތ?n~<&yݽIr/ŋ=wWIG77eW]Nm=ij몝m-m3Q/oMq'}vIֿ/ ˺sӵBK)ɱn;A9n1vAxHŢn!XN4$>΃=mc-bB}hjM^Uwww BF˥푊QM]1ʫڞCeݡ}BʥXl6ȶ5R^clFrJՒk ;%9& }8K|y091x&GϹPT#Z%)&!lRvDr䨑\#G|bǚHUʸ4'22| ^Dm=^sS<cLUي_3;S}Ш2?}LN=8g,u..Q/)87l _??q Zqб<4 4谡Цg~ѧ,I 4sY^y?4hv5O#ܵy7S4 &*s0P.9S0׬p~ne8|p\ouqn6|kq_^~& am endstream endobj 99 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTn0CB*D rضj^SpH ;olvR3ތm~<&yݽIr+œG۞m=ģ몝=b[ntC۶z;vʾ6%:svI>77 N!._ M u+$bEw!y1 vxHŢnSX: {Nm]XNDW[״bݹ,,-FVL"~C۷6ZHfٶ )/16X9CjIxļ$Bi#cΓ@l MDϹPT#ZC%)&!lR&TG5k䨑}WLԌ]Uz@K~bo#?қHљ<-+`q}ʂbI2_́Y_%X?Na~ZjGcrj59c+ϳEHDܰ%~WLz9ܓ2ƛFϲ`'I&se?zyxмj5F̹k#niM7>T20P-9SA˰֬p~ne8|p99[ڴw=ߣ& c endstream endobj 100 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲVZCcYy#9햅ļ{3񸟤e&Oo]&C]]Mq>zwt߉Ǯ)n.pCx?nڽVgx=itO"i [\l\WM}'ԭ̚t4pXeȉeU oq yM\-CnCW_Ey}wP dZz891euB)] W-\v\]~[S!8&+Zce"'2Ɍ5I@|"B2AQhSlLء28a}ɑFq5ҍnnbfǮCG= Wܢe$g;A,:sx l=NOTƘ$0_س/vЧQ%~Zx pX2]$^qnaK??q FqMyc0=) &l(mi,3|d &\c ]͹&ӈ9w{d-tx\ \cΜekqLJs?<@>qhx .׷8wl~1V<*m"mmDa endstream endobj 101 0 obj << /Length 664 /Filter /FlateDecode >> stream xmTMo0WxvB+8l[jWHL7RI;onDo3ތ?n~<&Y$ŝK_IsE77E[^N\5sߖ;7|[lzmS_*7F?h3΃;mc-bB`ew\_7oK׽;(2Z.ETz}ܟ~o9V^MVK7-\f\S}[S!pcSs|TXo1/ȡ aeuC> stream xmTn0+Jb;!B Hv[jWHL7RI7vJwD/3ތ|{M=I|/ų;tnn\3pr ܹAboR1A+Z7k Cm $_D+!8u<u/$bTy{s4 b::MGҢ!YhH޽w66Z,^EǾr}ݼ۫-w{s d\crb/)ʝ}}ꢅKlkީr8)9*QK"&VZ 5ID b!"U\H(jm} ۄ @*&"C,jdkknn"cW}O= W¢mu|]CXz :3xl=΀WOTƘ$U ۊu':S9xT>&^s 1eΘOd~`xՌk?s׾G0N-۰o|e>ha>6h Z8sseY1:@++܊psqKoZ׺q=71cf endstream endobj 103 0 obj << /Length 664 /Filter /FlateDecode >> stream xmTMo0WxvB+8l[+ML7RI;onDo3ތ?n~<&YվI|/ŋ;t硋nn\3<:Wj\=?-wn6pGۦ|Tnʽgxté7~qzxKlqrnX7UޞMjuSAxHiQ,'wͱ 1}hW7q{UEݥ-rG*F>NNL7u]tNhWS;wE )b,#TTHy=)9>*QKr7P:MȡQ^s$LD6aȑ*s.$S56`>ƄmÁ#TL 5kd}WXssc*zRh/#? bE$L|ږ8^y>eSQc̯bV̯cNa'_OAJ195kd3EH@8ܰ%~As*=F 0`{RLPh33Y$LƹǬ oqMsȼ tx\ \cΜ-eksL ?"@>qhx ׷=l~1֍>*]!MBa endstream endobj 104 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTn0C6U@"mTt@;olvR3ތm~<&YվI|+œ;t羋<]3;Wj|{}[ mmᆂMv{Kt=c_~B?zxoBS6wBJ)X7UaMuSxHiQV,4$O;nC-bD/OCnC_n^ѻs׽9X2Z.ET~{~ʶrn_~߼h!R,6ew*ؔb%k e+Kӄ$a"1x*s.$S56P>Ƅm„A Fs 5577vرϾ+uaя6R:!,əCxg+ѧy*JcL|*m:fvuiWUꧏɩ\g%<Ϛ"sÖ0_:3x0kjhyIYx0aCnOg3$cx0<<v5O#ܵu7A 6*sZ ZcΜ-ܠeYksL ?"@>qh|tngk;dGGM@c endstream endobj 112 0 obj << /Producer (pdfTeX-1.40.22) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20240116171156-05'00') /ModDate (D:20240116171156-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) kpathsea version 6.3.4/dev) >> endobj 2 0 obj << /Type /ObjStm /N 91 /First 735 /Length 3427 /Filter /FlateDecode >> stream x[Ys6~_vK )WlDzNUhDIGCyqI R>$$h|} 90d8qKg"HN5OՂNljGB8 0)6 d˕fK99"q$[% 5)AV'BYI6%Ш UDY`*43#Rڦ@ B`A iA:SFC?B!41q1؁蝓k"Ƭ!P L@gDLA)@|i V@ ^D3kr@Wm )@t (pFVBlwpK3"h@!NAY :L8Agiǹt9P*Kp .3O=^ cp ѓxgR8q`  w"g \HƐJt9p[.,3#@gŽ'ЧŻG^M%||/(spnBԝ@\dY̲cF9F ] .5#o }W'}:#"чŬfU  GmV$+q[|J>2h ZzbdY|> 﫴+^WNF|߈/N+}>b~=~BGdN"LRX jLR%.X"9)fk< QCaJS95D*&fXXMw (X8¢*APXhx:6lcv$Ν$1x(@DkIkdؖ$oH{ Q"ޘ1=lcQt`NO)O[ =VBd"`Pp&CB lfTqؽh֞MsnpcӜ[yۤN af^L3=GO}}A$ ' n$*0l7+uPUr'U*Y;UJ5v9TSwpD`@$RD@46${v^mHC)\D!IU8>\/&1\#ܿ?1}9{Uu*i*>/Y2*z|pēN40jG?S}?g;!Hh]>};n얱QlE[`fݎqvhon'԰Yus?VxPl*YllJ$&HY ghW¦h;@e>JX!|ל w;xi=kB-,ʸK0F 8#X}Q)~FnAJӶutގaTUEhV-R6}<[-Ĉ5o~'SKYQ;^#m:,%H9!vd,,``A-:/L<؎҆y[Mulm%lYIT<8" QnѴ&xAbk3m}fyo}n!53g7d{ڍK3(4B p[omANƀ8fvgZ%[Gj [i1x eOt1,Vo<7!fk;Z̲nh0۰U_z.eu,V/sm4mH92ozYTd~80e]f;ZuKп\QVNuU^?<տ^W.@1_DդZ}~ H9nl .؍а_?KXk \=|r0ffʮ~$臦X\_CzD_ } w=~?1U6OǓOY5Ϋ| SJь!iy1sz9lQgcE/lFs+Dt%3:g-hkz??G,.J~^Uvv:sZ2<+-Vg~+.fgټ~ѯ͋ Or^6?}>&6601J0h`#0lךhR\]kCye_'Xj4ՠ:77?8~hxyb~[-zɥeлrJRZX@gK(}G&/QW w{5ҚK8 ̱XZ5r"'3|5ax#v5t2 pjusxgWXLǯTr޾q"miGx^\}>EWOAo@*oU[D_ zH[̶+bv/J-Ћ( xdQAu1tPc.@!K}b T쀕A5]%``qsryޤ\b;`7Ǻ-CʍXvh>uTi2fuIAlZ%J {8Z\>iSe^C|9K.#}-lV Ej/-H endstream endobj 113 0 obj << /Type /XRef /Index [0 114] /Size 114 /W [1 3 1] /Root 111 0 R /Info 112 0 R /ID [ ] /Length 280 /Filter /FlateDecode >> stream xI2Ab A, c")8C8U#@o󫯺_wUWD|z!TAp ePq8 A 0P @-A&BP ahfhD!]*gBC;l6dUiЧZ!#*m4LD=[MYyH,RvbIjYjEhlZWM|Ymfs: oҫpP (BI >?E$d endstream endobj startxref 94110 %%EOF GenomicAlignments/inst/doc/OverlapEncodings.R0000644000175200017520000007642714551577513022343 0ustar00biocbuildbiocbuild### R code from vignette source 'OverlapEncodings.Rnw' ################################################### ### code chunk number 1: style ################################################### BiocStyle::latex() ################################################### ### code chunk number 2: options ################################################### options(width=100) .precomputed_results_dir <- "precomputed_results" .loadPrecomputed <- function(objname) { filename <- paste0(objname, ".rda") path <- file.path(.precomputed_results_dir, filename) tempenv <- new.env(parent=emptyenv()) load(path, envir=tempenv) updateObject(get(objname, envir=tempenv)) } .checkIdenticalToPrecomputed <- function(obj, objname, ignore.metadata=FALSE) { precomputed_obj <- .loadPrecomputed(objname) if (ignore.metadata) metadata(obj) <- metadata(precomputed_obj) <- list() ## Replace NAs with FALSE in circularity flag (because having the flag set ## to NA instead of FALSE (or vice-versa) is not considered a significant ## difference between the 2 objects). isCircular(obj) <- isCircular(obj) %in% TRUE isCircular(precomputed_obj) <- isCircular(precomputed_obj) %in% TRUE if (!identical(obj, precomputed_obj)) stop("'", objname, "' is not identical to precomputed version") } ################################################### ### code chunk number 3: untreated1_chr4 ################################################### library(pasillaBamSubset) untreated1_chr4() ################################################### ### code chunk number 4: readGAlignments ################################################### library(GenomicAlignments) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U1.GAL <- readGAlignments(untreated1_chr4(), use.names=TRUE, param=param0) head(U1.GAL) ################################################### ### code chunk number 5: U1.GAL_names_is_dup ################################################### U1.GAL_names_is_dup <- duplicated(names(U1.GAL)) table(U1.GAL_names_is_dup) ################################################### ### code chunk number 6: U1.GAL_qnames ################################################### U1.uqnames <- unique(names(U1.GAL)) U1.GAL_qnames <- factor(names(U1.GAL), levels=U1.uqnames) ################################################### ### code chunk number 7: U1.GAL_dup2unq ################################################### U1.GAL_dup2unq <- match(U1.GAL_qnames, U1.GAL_qnames) ################################################### ### code chunk number 8: skipped-regions-in-U1.GAL ################################################### head(unique(cigar(U1.GAL))) table(njunc(U1.GAL)) ################################################### ### code chunk number 9: no-indels-in-U1.GAL ################################################### colSums(cigarOpTable(cigar(U1.GAL))) ################################################### ### code chunk number 10: readGAlignmentPairs ################################################### U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) ################################################### ### code chunk number 11: first-and-last-U3.galp ################################################### head(first(U3.galp)) head(last(U3.galp)) ################################################### ### code chunk number 12: isProperPair ################################################### table(isProperPair(U3.galp)) ################################################### ### code chunk number 13: keep-only-proper-pairs ################################################### U3.GALP <- U3.galp[isProperPair(U3.galp)] ################################################### ### code chunk number 14: U3.GALP_names_is_dup ################################################### U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) ################################################### ### code chunk number 15: U3.GALP_qnames ################################################### U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) ################################################### ### code chunk number 16: U3.GALP_dup2unq ################################################### U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) ################################################### ### code chunk number 17: skipped-region-in-U3.GALP ################################################### head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) ################################################### ### code chunk number 18: no-indels-in-U3.GALP ################################################### colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) ################################################### ### code chunk number 19: txdb ################################################### library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) TxDb.Dmelanogaster.UCSC.dm3.ensGene txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene ################################################### ### code chunk number 20: exbytx ################################################### exbytx <- exonsBy(txdb, by="tx", use.names=TRUE) length(exbytx) # nb of transcripts ################################################### ### code chunk number 21: CHECK_exbytx ################################################### .checkIdenticalToPrecomputed(exbytx, "exbytx", ignore.metadata=TRUE) ################################################### ### code chunk number 22: check-for-trans-splicing-in-exbytx ################################################### table(elementNROWS(runLength(seqnames(exbytx)))) table(elementNROWS(runLength(strand(exbytx)))) ################################################### ### code chunk number 23: exbytx_strand ################################################### exbytx_strand <- unlist(runValue(strand(exbytx)), use.names=FALSE) ################################################### ### code chunk number 24: exbytx2gene ################################################### tx <- transcripts(txdb, columns=c("tx_name", "gene_id")) head(tx) df <- mcols(tx) exbytx2gene <- as.character(df$gene_id) exbytx2gene <- factor(exbytx2gene, levels=unique(exbytx2gene)) names(exbytx2gene) <- df$tx_name exbytx2gene <- exbytx2gene[names(exbytx)] head(exbytx2gene) nlevels(exbytx2gene) # nb of genes ################################################### ### code chunk number 25: U1.OV00 ################################################### U1.OV00 <- findOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) ################################################### ### code chunk number 26: length-of-U1.OV00 ################################################### length(U1.OV00) ################################################### ### code chunk number 27: U1.GAL_ntx ################################################### U1.GAL_ntx <- countQueryHits(U1.OV00) mcols(U1.GAL)$ntx <- U1.GAL_ntx head(U1.GAL) table(U1.GAL_ntx) mean(U1.GAL_ntx >= 1) ################################################### ### code chunk number 28: U1.GAL_ntx_again (eval = FALSE) ################################################### ## U1.GAL_ntx_again <- countOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) ## stopifnot(identical(unname(U1.GAL_ntx_again), U1.GAL_ntx)) ################################################### ### code chunk number 29: U1.uqnames_ntx ################################################### U1.OV10 <- remapHits(U1.OV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ntx <- countQueryHits(U1.OV10) names(U1.uqnames_ntx) <- U1.uqnames table(U1.uqnames_ntx) mean(U1.uqnames_ntx >= 1) ################################################### ### code chunk number 30: U1.exbytx_nOV10 ################################################### U1.exbytx_nOV10 <- countSubjectHits(U1.OV10) names(U1.exbytx_nOV10) <- names(exbytx) mean(U1.exbytx_nOV10 >= 50) ################################################### ### code chunk number 31: top-10-transcripts-based-on-U1.exbytx_nOV10 ################################################### head(sort(U1.exbytx_nOV10, decreasing=TRUE), n=10) ################################################### ### code chunk number 32: U3.OV00 ################################################### U3.OV00 <- findOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) ################################################### ### code chunk number 33: length-of-U3.OV00 ################################################### length(U3.OV00) ################################################### ### code chunk number 34: U3.GALP_ntx ################################################### U3.GALP_ntx <- countQueryHits(U3.OV00) mcols(U3.GALP)$ntx <- U3.GALP_ntx head(U3.GALP) table(U3.GALP_ntx) mean(U3.GALP_ntx >= 1) ################################################### ### code chunk number 35: U3.GALP_ntx_again (eval = FALSE) ################################################### ## U3.GALP_ntx_again <- countOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) ## stopifnot(identical(unname(U3.GALP_ntx_again), U3.GALP_ntx)) ################################################### ### code chunk number 36: U3.uqnames_ntx ################################################### U3.OV10 <- remapHits(U3.OV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ntx <- countQueryHits(U3.OV10) names(U3.uqnames_ntx) <- U3.uqnames table(U3.uqnames_ntx) mean(U3.uqnames_ntx >= 1) ################################################### ### code chunk number 37: U3.exbytx_nOV10 ################################################### U3.exbytx_nOV10 <- countSubjectHits(U3.OV10) names(U3.exbytx_nOV10) <- names(exbytx) mean(U3.exbytx_nOV10 >= 50) ################################################### ### code chunk number 38: top-10-transcripts-based-on-U3.exbytx_nOV10 ################################################### head(sort(U3.exbytx_nOV10, decreasing=TRUE), n=10) ################################################### ### code chunk number 39: U1.grl_and_U1.grlf ################################################### U1.grl <- grglist(U1.GAL, order.as.in.query=TRUE) U1.grlf <- flipQuery(U1.grl) # flipped ################################################### ### code chunk number 40: U1.ovencAB ################################################### U1.ovencA <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00) U1.ovencB <- encodeOverlaps(U1.grlf, exbytx, hits=U1.OV00) ################################################### ### code chunk number 41: U1.ovenc ################################################### U1.grl_strand <- unlist(runValue(strand(U1.grl)), use.names=FALSE) U1.ovenc <- selectEncodingWithCompatibleStrand(U1.ovencA, U1.ovencB, U1.grl_strand, exbytx_strand, hits=U1.OV00) U1.ovenc ################################################### ### code chunk number 42: U1.ovenc_again ################################################### U1.ovenc_again <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00, flip.query.if.wrong.strand=TRUE) stopifnot(identical(U1.ovenc_again, U1.ovenc)) ################################################### ### code chunk number 43: U1.ovenc_table ################################################### U1.unique_encodings <- levels(U1.ovenc) length(U1.unique_encodings) head(U1.unique_encodings) U1.ovenc_table <- table(encoding(U1.ovenc)) tail(sort(U1.ovenc_table)) ################################################### ### code chunk number 44: U3.ovenc ################################################### U3.grl <- grglist(U3.GALP) U3.ovenc <- encodeOverlaps(U3.grl, exbytx, hits=U3.OV00, flip.query.if.wrong.strand=TRUE) U3.ovenc ################################################### ### code chunk number 45: U3.ovenc_table ################################################### U3.unique_encodings <- levels(U3.ovenc) length(U3.unique_encodings) head(U3.unique_encodings) U3.ovenc_table <- table(encoding(U3.ovenc)) tail(sort(U3.ovenc_table)) ################################################### ### code chunk number 46: U1-unique-compatible-encodings ################################################### sort(U1.ovenc_table[isCompatibleWithSplicing(U1.unique_encodings)]) ################################################### ### code chunk number 47: U1.OV00_is_comp ################################################### U1.OV00_is_comp <- isCompatibleWithSplicing(U1.ovenc) table(U1.OV00_is_comp) # 531797 "splice compatible" overlaps ################################################### ### code chunk number 48: U1.compOV00 ################################################### U1.compOV00 <- U1.OV00[U1.OV00_is_comp] ################################################### ### code chunk number 49: U1.compOV00_again (eval = FALSE) ################################################### ## U1.compOV00_again <- findCompatibleOverlaps(U1.GAL, exbytx) ## stopifnot(identical(U1.compOV00_again, U1.compOV00)) ################################################### ### code chunk number 50: U1.GAL_ncomptx ################################################### U1.GAL_ncomptx <- countQueryHits(U1.compOV00) mcols(U1.GAL)$ncomptx <- U1.GAL_ncomptx head(U1.GAL) table(U1.GAL_ncomptx) mean(U1.GAL_ncomptx >= 1) ################################################### ### code chunk number 51: U1.GAL_ncomptx_again (eval = FALSE) ################################################### ## U1.GAL_ncomptx_again <- countCompatibleOverlaps(U1.GAL, exbytx) ## stopifnot(identical(U1.GAL_ncomptx_again, U1.GAL_ncomptx)) ################################################### ### code chunk number 52: U1.uqnames_ncomptx ################################################### U1.compOV10 <- remapHits(U1.compOV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ncomptx <- countQueryHits(U1.compOV10) names(U1.uqnames_ncomptx) <- U1.uqnames table(U1.uqnames_ncomptx) mean(U1.uqnames_ncomptx >= 1) ################################################### ### code chunk number 53: U1.exbytx_ncompOV10 ################################################### U1.exbytx_ncompOV10 <- countSubjectHits(U1.compOV10) names(U1.exbytx_ncompOV10) <- names(exbytx) mean(U1.exbytx_ncompOV10 >= 50) ################################################### ### code chunk number 54: top-10-transcripts-based-on-U1.exbytx_ncompOV10 ################################################### head(sort(U1.exbytx_ncompOV10, decreasing=TRUE), n=10) ################################################### ### code chunk number 55: U3-unique-compatible-encodings ################################################### sort(U3.ovenc_table[isCompatibleWithSplicing(U3.unique_encodings)]) ################################################### ### code chunk number 56: U3.OV00_is_comp ################################################### U3.OV00_is_comp <- isCompatibleWithSplicing(U3.ovenc) table(U3.OV00_is_comp) # 106835 "splice compatible" paired-end overlaps ################################################### ### code chunk number 57: U3.compOV00 ################################################### U3.compOV00 <- U3.OV00[U3.OV00_is_comp] ################################################### ### code chunk number 58: U3.compOV00_again (eval = FALSE) ################################################### ## U3.compOV00_again <- findCompatibleOverlaps(U3.GALP, exbytx) ## stopifnot(identical(U3.compOV00_again, U3.compOV00)) ################################################### ### code chunk number 59: U3.GALP_ncomptx ################################################### U3.GALP_ncomptx <- countQueryHits(U3.compOV00) mcols(U3.GALP)$ncomptx <- U3.GALP_ncomptx head(U3.GALP) table(U3.GALP_ncomptx) mean(U3.GALP_ncomptx >= 1) ################################################### ### code chunk number 60: U3.GALP_ncomptx_again (eval = FALSE) ################################################### ## U3.GALP_ncomptx_again <- countCompatibleOverlaps(U3.GALP, exbytx) ## stopifnot(identical(U3.GALP_ncomptx_again, U3.GALP_ncomptx)) ################################################### ### code chunk number 61: U3.uqnames_ncomptx ################################################### U3.compOV10 <- remapHits(U3.compOV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ncomptx <- countQueryHits(U3.compOV10) names(U3.uqnames_ncomptx) <- U3.uqnames table(U3.uqnames_ncomptx) mean(U3.uqnames_ncomptx >= 1) ################################################### ### code chunk number 62: U3.exbytx_ncompOV10 ################################################### U3.exbytx_ncompOV10 <- countSubjectHits(U3.compOV10) names(U3.exbytx_ncompOV10) <- names(exbytx) mean(U3.exbytx_ncompOV10 >= 50) ################################################### ### code chunk number 63: top-10-transcripts-based-on-U3.exbytx_ncompOV10 ################################################### head(sort(U3.exbytx_ncompOV10, decreasing=TRUE), n=10) ################################################### ### code chunk number 64: Dmelanogaster ################################################### library(BSgenome.Dmelanogaster.UCSC.dm3) Dmelanogaster ################################################### ### code chunk number 65: U1-reference-query-sequences ################################################### library(GenomicFeatures) U1.GAL_rqseq <- extractTranscriptSeqs(Dmelanogaster, U1.grl) head(U1.GAL_rqseq) ################################################### ### code chunk number 66: U3.grl_first-and-U3.grl_last ################################################### U3.grl_first <- grglist(first(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) U3.grl_last <- grglist(last(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) ################################################### ### code chunk number 67: U3-reference-query-sequences ################################################### U3.GALP_rqseq1 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_first) U3.GALP_rqseq2 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_last) ################################################### ### code chunk number 68: U1.OV00_qstart ################################################### U1.OV00_qstart <- extractQueryStartInTranscript(U1.grl, exbytx, hits=U1.OV00, ovenc=U1.ovenc) head(subset(U1.OV00_qstart, U1.OV00_is_comp)) ################################################### ### code chunk number 69: txseq ################################################### txseq <- extractTranscriptSeqs(Dmelanogaster, exbytx) ################################################### ### code chunk number 70: U1.OV00_rqseq-vs-U1.OV00_txseq ################################################### U1.OV00_rqseq <- U1.GAL_rqseq[queryHits(U1.OV00)] U1.OV00_rqseq[flippedQuery(U1.ovenc)] <- reverseComplement(U1.OV00_rqseq[flippedQuery(U1.ovenc)]) U1.OV00_txseq <- txseq[subjectHits(U1.OV00)] stopifnot(all( U1.OV00_rqseq[U1.OV00_is_comp] == narrow(U1.OV00_txseq[U1.OV00_is_comp], start=U1.OV00_qstart$startInTranscript[U1.OV00_is_comp], width=width(U1.OV00_rqseq)[U1.OV00_is_comp]) )) ################################################### ### code chunk number 71: U3.OV00_Lqstart ################################################### U3.OV00_Lqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc) head(subset(U3.OV00_Lqstart, U3.OV00_is_comp)) ################################################### ### code chunk number 72: U3.OV00_Rqstart ################################################### U3.OV00_Rqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc, for.query.right.end=TRUE) head(subset(U3.OV00_Rqstart, U3.OV00_is_comp)) ################################################### ### code chunk number 73: U3.OV00_Lrqseq_and_Rrqseq ################################################### U3.OV00_Lrqseq <- U3.GALP_rqseq1[queryHits(U3.OV00)] U3.OV00_Rrqseq <- U3.GALP_rqseq2[queryHits(U3.OV00)] ################################################### ### code chunk number 74: U3.OV00_Lrqseq_and_Rrqseq ################################################### flip_idx <- which(flippedQuery(U3.ovenc)) tmp <- U3.OV00_Lrqseq[flip_idx] U3.OV00_Lrqseq[flip_idx] <- reverseComplement(U3.OV00_Rrqseq[flip_idx]) U3.OV00_Rrqseq[flip_idx] <- reverseComplement(tmp) ################################################### ### code chunk number 75: U3.OV00_txseq ################################################### U3.OV00_txseq <- txseq[subjectHits(U3.OV00)] ################################################### ### code chunk number 76: U3.OV00_Lrqseq-vs-U3.OV00_txseq ################################################### stopifnot(all( U3.OV00_Lrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Lqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Lrqseq)[U3.OV00_is_comp]) )) ################################################### ### code chunk number 77: U3.OV00_Rrqseq-vs-U3.OV00_txseq ################################################### stopifnot(all( U3.OV00_Rrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Rqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Rrqseq)[U3.OV00_is_comp]) )) ################################################### ### code chunk number 78: findSequenceHits ################################################### ### A wrapper to vwhichPDict() that supports IUPAC ambiguity codes in 'qseq' ### and 'txseq', and treats them as such. findSequenceHits <- function(qseq, txseq, which.txseq=NULL, max.mismatch=0) { .asHits <- function(x, pattern_length) { query_hits <- unlist(x) if (is.null(query_hits)) query_hits <- integer(0) subject_hits <- rep.int(seq_len(length(x)), elementNROWS(x)) Hits(query_hits, subject_hits, pattern_length, length(x), sort.by.query=TRUE) } .isHitInTranscriptBounds <- function(hits, qseq, txseq) { sapply(seq_len(length(hits)), function(i) { pattern <- qseq[[queryHits(hits)[i]]] subject <- txseq[[subjectHits(hits)[i]]] v <- matchPattern(pattern, subject, max.mismatch=max.mismatch, fixed=FALSE) any(1L <= start(v) & end(v) <= length(subject)) }) } if (!is.null(which.txseq)) { txseq0 <- txseq txseq <- txseq[which.txseq] } names(qseq) <- NULL other <- alphabetFrequency(qseq, baseOnly=TRUE)[ , "other"] is_clean <- other == 0L # "clean" means "no IUPAC ambiguity code" ## Find hits for "clean" original queries. qseq0 <- qseq[is_clean] pdict0 <- PDict(qseq0, max.mismatch=max.mismatch) m0 <- vwhichPDict(pdict0, txseq, max.mismatch=max.mismatch, fixed="pattern") hits0 <- .asHits(m0, length(qseq0)) hits0@nLnode <- length(qseq) hits0@from <- which(is_clean)[hits0@from] ## Find hits for non "clean" original queries. qseq1 <- qseq[!is_clean] m1 <- vwhichPDict(qseq1, txseq, max.mismatch=max.mismatch, fixed=FALSE) hits1 <- .asHits(m1, length(qseq1)) hits1@nLnode <- length(qseq) hits1@from <- which(!is_clean)[hits1@from] ## Combine the hits. query_hits <- c(queryHits(hits0), queryHits(hits1)) subject_hits <- c(subjectHits(hits0), subjectHits(hits1)) if (!is.null(which.txseq)) { ## Remap the hits. txseq <- txseq0 subject_hits <- which.txseq[subject_hits] hits0@nRnode <- length(txseq) } ## Order the hits. oo <- orderIntegerPairs(query_hits, subject_hits) hits0@from <- query_hits[oo] hits0@to <- subject_hits[oo] if (max.mismatch != 0L) { ## Keep only "in bounds" hits. is_in_bounds <- .isHitInTranscriptBounds(hits0, qseq, txseq) hits0 <- hits0[is_in_bounds] } hits0 } ################################################### ### code chunk number 79: which.txseq (eval = FALSE) ################################################### ## chr4tx <- transcripts(txdb, vals=list(tx_chrom="chr4")) ## chr4txnames <- mcols(chr4tx)$tx_name ## which.txseq <- match(chr4txnames, names(txseq)) ################################################### ### code chunk number 80: U1.sbcompHITS (eval = FALSE) ################################################### ## U1.sbcompHITSa <- findSequenceHits(U1.oqseq, txseq, ## which.txseq=which.txseq, max.mismatch=6) ## U1.sbcompHITSb <- findSequenceHits(reverseComplement(U1.oqseq), txseq, ## which.txseq=which.txseq, max.mismatch=6) ## U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) ################################################### ### code chunk number 81: LOAD_U1.sbcompHITS ################################################### U1.sbcompHITSa <- .loadPrecomputed("U1.sbcompHITSa") U1.sbcompHITSb <- .loadPrecomputed("U1.sbcompHITSb") U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) ################################################### ### code chunk number 82: U1.uqnames_nsbcomptx ################################################### U1.uqnames_nsbcomptx <- countQueryHits(U1.sbcompHITS) names(U1.uqnames_nsbcomptx) <- U1.uqnames table(U1.uqnames_nsbcomptx) mean(U1.uqnames_nsbcomptx >= 1) ################################################### ### code chunk number 83: U1.exbytx_nsbcompHITS ################################################### U1.exbytx_nsbcompHITS <- countSubjectHits(U1.sbcompHITS) names(U1.exbytx_nsbcompHITS) <- names(exbytx) mean(U1.exbytx_nsbcompHITS >= 50) ################################################### ### code chunk number 84: top-10-transcripts-based-on-U1.exbytx_nsbcompHITS ################################################### head(sort(U1.exbytx_nsbcompHITS, decreasing=TRUE), n=10) ################################################### ### code chunk number 85: encoding-based-compatible-implies-string-based-compatible ################################################### stopifnot(length(setdiff(U1.compOV10, U1.sbcompHITS)) == 0) ################################################### ### code chunk number 86: string-based-compatible-does-NOT-imply-encoding-based-compatible ################################################### length(setdiff(U1.sbcompHITS, U1.compOV10)) ################################################### ### code chunk number 87: U1-unique-almost-compatible-encodings ################################################### sort(U1.ovenc_table[isCompatibleWithSkippedExons(U1.unique_encodings)]) ################################################### ### code chunk number 88: U1.OV00_is_acomp ################################################### U1.OV00_is_acomp <- isCompatibleWithSkippedExons(U1.ovenc) table(U1.OV00_is_acomp) # 1202 "almost splice compatible" overlaps ################################################### ### code chunk number 89: U1.acompOV00 ################################################### U1.acompOV00 <- U1.OV00[U1.OV00_is_acomp] ################################################### ### code chunk number 90: U1.GAL_nacomptx ################################################### U1.GAL_nacomptx <- countQueryHits(U1.acompOV00) mcols(U1.GAL)$nacomptx <- U1.GAL_nacomptx head(U1.GAL) table(U1.GAL_nacomptx) mean(U1.GAL_nacomptx >= 1) ################################################### ### code chunk number 91: U1.exbytx_nacompOV00 ################################################### U1.exbytx_nacompOV00 <- countSubjectHits(U1.acompOV00) names(U1.exbytx_nacompOV00) <- names(exbytx) table(U1.exbytx_nacompOV00) mean(U1.exbytx_nacompOV00 >= 50) ################################################### ### code chunk number 92: U1.OV00_qstart ################################################### head(subset(U1.OV00_qstart, U1.OV00_is_acomp)) ################################################### ### code chunk number 93: U3-unique-almost-compatible-encodings ################################################### sort(U3.ovenc_table[isCompatibleWithSkippedExons(U3.unique_encodings)]) ################################################### ### code chunk number 94: U3.OV00_is_acomp ################################################### U3.OV00_is_acomp <- isCompatibleWithSkippedExons(U3.ovenc) table(U3.OV00_is_acomp) # 141 "almost splice compatible" paired-end overlaps ################################################### ### code chunk number 95: U3.acompOV00 ################################################### U3.acompOV00 <- U3.OV00[U3.OV00_is_acomp] ################################################### ### code chunk number 96: U3.GALP_nacomptx ################################################### U3.GALP_nacomptx <- countQueryHits(U3.acompOV00) mcols(U3.GALP)$nacomptx <- U3.GALP_nacomptx head(U3.GALP) table(U3.GALP_nacomptx) mean(U3.GALP_nacomptx >= 1) ################################################### ### code chunk number 97: U3.exbytx_nacompOV00 ################################################### U3.exbytx_nacompOV00 <- countSubjectHits(U3.acompOV00) names(U3.exbytx_nacompOV00) <- names(exbytx) table(U3.exbytx_nacompOV00) mean(U3.exbytx_nacompOV00 >= 50) ################################################### ### code chunk number 98: U3.OV00_Lqstart-and-U3.OV00_Rqstart ################################################### head(subset(U3.OV00_Lqstart, U3.OV00_is_acomp)) head(subset(U3.OV00_Rqstart, U3.OV00_is_acomp)) ################################################### ### code chunk number 99: U1.GAL_is_nsj ################################################### U1.GAL_is_nsj <- U1.GAL_nacomptx != 0L & U1.GAL_ncomptx == 0L head(which(U1.GAL_is_nsj)) ################################################### ### code chunk number 100: U1.OV00_is_nsj ################################################### U1.OV00_is_nsj <- queryHits(U1.OV00) %in% which(U1.GAL_is_nsj) ################################################### ### code chunk number 101: narrow-U1.OV00_is_nsj ################################################### U1.OV00_is_nsj <- U1.OV00_is_nsj & U1.OV00_is_acomp U1.nsjOV00 <- U1.OV00[U1.OV00_is_nsj] ################################################### ### code chunk number 102: U1.nsjOV00_skippedex ################################################### U1.nsjOV00_skippedex <- extractSkippedExonRanks(U1.ovenc)[U1.OV00_is_nsj] names(U1.nsjOV00_skippedex) <- queryHits(U1.nsjOV00) table(elementNROWS(U1.nsjOV00_skippedex)) ################################################### ### code chunk number 103: U1.exbytx_skippedex ################################################### f <- factor(names(exbytx)[subjectHits(U1.nsjOV00)], levels=names(exbytx)) U1.exbytx_skippedex <- split(U1.nsjOV00_skippedex, f) ################################################### ### code chunk number 104: names-of-U1.exbytx_skippedex ################################################### head(names(U1.exbytx_skippedex)) # transcript names ################################################### ### code chunk number 105: FBtr0089124-skipped-exons ################################################### U1.exbytx_skippedex$FBtr0089124 ################################################### ### code chunk number 106: FBtr0089147-skipped-exons ################################################### U1.exbytx_skippedex$FBtr0089147 ################################################### ### code chunk number 107: sessionInfo ################################################### sessionInfo() GenomicAlignments/inst/doc/OverlapEncodings.Rnw0000644000175200017520000016240314516004601022656 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Overlap encodings} %\VignetteDepends{pasillaBamSubset, GenomicAlignments, GenomicFeatures, BSgenome.Dmelanogaster.UCSC.dm3, TxDb.Dmelanogaster.UCSC.dm3.ensGene} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Overlap encodings} \author{Herv\'e Pag\`es} \date{Last modified: December 2016; Compiled: \today} \begin{document} \maketitle <>= options(width=100) .precomputed_results_dir <- "precomputed_results" .loadPrecomputed <- function(objname) { filename <- paste0(objname, ".rda") path <- file.path(.precomputed_results_dir, filename) tempenv <- new.env(parent=emptyenv()) load(path, envir=tempenv) updateObject(get(objname, envir=tempenv)) } .checkIdenticalToPrecomputed <- function(obj, objname, ignore.metadata=FALSE) { precomputed_obj <- .loadPrecomputed(objname) if (ignore.metadata) metadata(obj) <- metadata(precomputed_obj) <- list() ## Replace NAs with FALSE in circularity flag (because having the flag set ## to NA instead of FALSE (or vice-versa) is not considered a significant ## difference between the 2 objects). isCircular(obj) <- isCircular(obj) %in% TRUE isCircular(precomputed_obj) <- isCircular(precomputed_obj) %in% TRUE if (!identical(obj, precomputed_obj)) stop("'", objname, "' is not identical to precomputed version") } @ \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In the context of an RNA-seq experiment, encoding the overlaps between the aligned reads and the transcripts can be used for detecting those overlaps that are ``splice compatible'', that is, compatible with the splicing of the transcript. Various tools are provided in the \Rpackage{GenomicAlignments} package for working with {\it overlap encodings}. In this vignette, we illustrate the use of these tools on the single-end and paired-end reads of an RNA-seq experiment. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Load reads from a BAM file} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load single-end reads from a BAM file} BAM file {\tt untreated1\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains single-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated1\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads): <>= library(pasillaBamSubset) untreated1_chr4() @ We use the \Rfunction{readGAlignments} function defined in the \Rpackage{GenomicAlignments} package to load the reads into a \Rclass{GAlignments} object. It's probably a good idea to get rid of the PCR or optical duplicates (flag bit 0x400 in the SAM format, see the SAM Spec \footnote{\url{http://samtools.sourceforge.net/}} for the details), as well as reads not passing quality controls (flag bit 0x200 in the SAM format). We do this by creating a \Rclass{ScanBamParam} object that we pass to \Rcode{readGAlignments} (see \Rcode{?ScanBamParam} in the \Rpackage{Rsamtools} package for the details). Note that we also use \Rcode{use.names=TRUE} in order to load the {\it query names} (aka {\it query template names}, see QNAME field in the SAM Spec) from the BAM file (\Rcode{readGAlignments} will use them to set the names of the returned object): <>= library(GenomicAlignments) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U1.GAL <- readGAlignments(untreated1_chr4(), use.names=TRUE, param=param0) head(U1.GAL) @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query} (i.e. per read stored in the input file, typically a FASTQ file), we shouldn't expect the names of \Rcode{U1.GAL} to be unique: <>= U1.GAL_names_is_dup <- duplicated(names(U1.GAL)) table(U1.GAL_names_is_dup) @ Storing the {\it query names} in a factor will be useful as we will see later in this document: <>= U1.uqnames <- unique(names(U1.GAL)) U1.GAL_qnames <- factor(names(U1.GAL), levels=U1.uqnames) @ Note that we explicitely provide the levels of the factor to enforce their order. Otherwise \Rcode{factor()} would put them in lexicographic order which is not advisable because it depends on the locale in use. Another object that will be useful to keep near at hand is the mapping between each {\it query name} and its first occurence in \Rcode{U1.GAL\_qnames}: <>= U1.GAL_dup2unq <- match(U1.GAL_qnames, U1.GAL_qnames) @ Our reads can have up to 2 {\it skipped regions} (a {\it skipped region} corresponds to an N operation in the CIGAR): <>= head(unique(cigar(U1.GAL))) table(njunc(U1.GAL)) @ Also, the following table indicates that indels were not allowed/supported during the alignment process (no I or D CIGAR operations): <>= colSums(cigarOpTable(cigar(U1.GAL))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load paired-end reads from a BAM file} BAM file {\tt untreated3\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains paired-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated3\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads). We use the \Rfunction{readGAlignmentPairs} function to load them into a \Rclass{GAlignmentPairs} object: <>= U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) @ The \Rcode{show} method for \Rclass{GAlignmentPairs} objects displays two {\tt ranges} columns, one for the {\it first} alignment in the pair (the left column), and one for the {\it last} alignment in the pair (the right column). The {\tt strand} column corresponds to the strand of the {\it first} alignment. <>= head(first(U3.galp)) head(last(U3.galp)) @ According to the SAM format specifications, the aligner is expected to mark each alignment pair as {\it proper} or not (flag bit 0x2 in the SAM format). The SAM Spec only says that a pair is {\it proper} if the {\it first} and {\it last} alignments in the pair are ``properly aligned according to the aligner''. So the exact criteria used for setting this flag is left to the aligner. We use \Rcode{isProperPair} to extract this flag from the \Rclass{GAlignmentPairs} object: <>= table(isProperPair(U3.galp)) @ Even though we could do {\it overlap encodings} with the full object, we keep only the {\it proper} pairs for our downstream analysis: <>= U3.GALP <- U3.galp[isProperPair(U3.galp)] @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query template} (i.e. per pair of sequences stored in the input files, typically 1 FASTQ file for the {\it first} ends and 1 FASTQ file for the {\it last} ends), we shouldn't expect the names of \Rcode{U3.GALP} to be unique: <>= U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) @ Storing the {\it query template names} in a factor will be useful: <>= U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) @ as well as having the mapping between each {\it query template name} and its first occurence in \Rcode{U3.GALP\_qnames}: <>= U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) @ Our reads can have up to 1 {\it skipped region} per end: <>= head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) @ Like for our single-end reads, the following tables indicate that indels were not allowed/supported during the alignment process: <>= colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Find all the overlaps between the reads and transcripts} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load the transcripts from a \Rclass{TxDb} object} In order to compute overlaps between reads and transcripts, we need access to the genomic positions of a set of known transcripts and their exons. It is essential that the reference genome of this set of transcripts and exons be {\bf exactly} the same as the reference genome used to align the reads. We could use the \Rfunction{makeTxDbFromUCSC} function defined in the \Rpackage{GenomicFeatures} package to make a \Rclass{TxDb} object containing the dm3 transcripts and their exons retrieved from the UCSC Genome Browser\footnote{\url{http://genome.ucsc.edu/cgi-bin/hgGateway}}. The Bioconductor project however provides a few annotation packages containing \Rclass{TxDb} objects for the most commonly studied organisms (those data packages are sometimes called the {\it TxDb} packages). One of them is the \Rpackage{TxDb.Dmelanogaster.\-UCSC.\-dm3.ensGene} package. It contains a \Rclass{TxDb} object that was made by pointing the \Rfunction{makeTxDbFromUCSC} function to the dm3 genome and {\it Ensembl Genes} track \footnote{See \url{http://genome.ucsc.edu/cgi-bin/hgTrackUi?hgsid=276880911&g=ensGene} for a description of this track.}. We can use it here: <>= library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) TxDb.Dmelanogaster.UCSC.dm3.ensGene txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene @ We extract the exons grouped by transcript in a \Rclass{GRangesList} object: <>= exbytx <- exonsBy(txdb, by="tx", use.names=TRUE) length(exbytx) # nb of transcripts @ <>= .checkIdenticalToPrecomputed(exbytx, "exbytx", ignore.metadata=TRUE) @ We check that all the exons in any given transcript belong to the same chromosome and strand. Knowing that our set of transcripts is free of this sort of trans-splicing events typically allows some significant simplifications during the downstream analysis \footnote{Dealing with trans-splicing events is not covered in this document.}. A quick and easy way to check this is to take advantage of the fact that \Rcode{seqnames} and \Rcode{strand} return \Rclass{RleList} objects. So we can extract the number of Rle runs for each transcript and make sure it's always 1: <>= table(elementNROWS(runLength(seqnames(exbytx)))) table(elementNROWS(runLength(strand(exbytx)))) @ Therefore the strand of any given transcript is unambiguously defined and can be extracted with: <>= exbytx_strand <- unlist(runValue(strand(exbytx)), use.names=FALSE) @ We will also need the mapping between the transcripts and their gene. We start by using \Rfunction{transcripts} to extract this information from our \Rclass{TxDb} object \Rcode{txdb}, and then we construct a named factor that represents the mapping: <>= tx <- transcripts(txdb, columns=c("tx_name", "gene_id")) head(tx) df <- mcols(tx) exbytx2gene <- as.character(df$gene_id) exbytx2gene <- factor(exbytx2gene, levels=unique(exbytx2gene)) names(exbytx2gene) <- df$tx_name exbytx2gene <- exbytx2gene[names(exbytx)] head(exbytx2gene) nlevels(exbytx2gene) # nb of genes @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Single-end overlaps} \subsubsection{Find the single-end overlaps} We are ready to compute the overlaps with the \Rfunction{findOverlaps} function. Note that the strand of the queries produced by the RNA-seq experiment is typically unknown so we use \Rcode{ignore.strand=TRUE}: <>= U1.OV00 <- findOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) @ \Rcode{U1.OV00} is a \Rclass{Hits} object that contains 1 element per overlap. Its length gives the number of overlaps: <>= length(U1.OV00) @ \subsubsection{Tabulate the single-end overlaps} We will repeatedly use the 2 following little helper functions to ``tabulate'' the overlaps in a given \Rclass{Hits} object (e.g. \Rcode{U1.OV00}), i.e. to count the number of overlaps for each element in the query or for each element in the subject: Number of transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_ntx <- countQueryHits(U1.OV00) mcols(U1.GAL)$ntx <- U1.GAL_ntx head(U1.GAL) table(U1.GAL_ntx) mean(U1.GAL_ntx >= 1) @ 76\% of the alignments in \Rcode{U1.GAL} have an overlap with at least 1 transcript in \Rcode{exbytx}. Note that \Rfunction{countOverlaps} can be used directly on \Rcode{U1.GAL} and \Rcode{exbytx} for computing \Rcode{U1.GAL\_ntx}: <>= U1.GAL_ntx_again <- countOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) stopifnot(identical(unname(U1.GAL_ntx_again), U1.GAL_ntx)) @ Because \Rcode{U1.GAL} can (and actually does) contain more than 1 alignment per {\it original query} (aka read), we also count the number of transcripts for each read: <>= U1.OV10 <- remapHits(U1.OV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ntx <- countQueryHits(U1.OV10) names(U1.uqnames_ntx) <- U1.uqnames table(U1.uqnames_ntx) mean(U1.uqnames_ntx >= 1) @ 78.4\% of the reads have an overlap with at least 1 transcript in \Rcode{exbytx}. Number of reads for each transcript: <>= U1.exbytx_nOV10 <- countSubjectHits(U1.OV10) names(U1.exbytx_nOV10) <- names(exbytx) mean(U1.exbytx_nOV10 >= 50) @ Only 0.869\% of the transcripts in \Rcode{exbytx} have an overlap with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_nOV10, decreasing=TRUE), n=10) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Paired-end overlaps} \subsubsection{Find the paired-end overlaps} Like with our single-end overlaps, we call \Rfunction{findOverlaps} with \Rcode{ignore.strand=TRUE}: <>= U3.OV00 <- findOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) @ Like \Rcode{U1.OV00}, \Rcode{U3.OV00} is a \Rclass{Hits} object. Its length gives the number of paired-end overlaps: <>= length(U3.OV00) @ \subsubsection{Tabulate the paired-end overlaps} Number of transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_ntx <- countQueryHits(U3.OV00) mcols(U3.GALP)$ntx <- U3.GALP_ntx head(U3.GALP) table(U3.GALP_ntx) mean(U3.GALP_ntx >= 1) @ 71\% of the alignment pairs in \Rcode{U3.GALP} have an overlap with at least 1 transcript in \Rcode{exbytx}. Note that \Rfunction{countOverlaps} can be used directly on \Rcode{U3.GALP} and \Rcode{exbytx} for computing \Rcode{U3.GALP\_ntx}: <>= U3.GALP_ntx_again <- countOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) stopifnot(identical(unname(U3.GALP_ntx_again), U3.GALP_ntx)) @ Because \Rcode{U3.GALP} can (and actually does) contain more than 1 alignment pair per {\it original query template}, we also count the number of transcripts for each template: <>= U3.OV10 <- remapHits(U3.OV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ntx <- countQueryHits(U3.OV10) names(U3.uqnames_ntx) <- U3.uqnames table(U3.uqnames_ntx) mean(U3.uqnames_ntx >= 1) @ 72.3\% of the templates have an overlap with at least 1 transcript in \Rcode{exbytx}. Number of templates for each transcript: <>= U3.exbytx_nOV10 <- countSubjectHits(U3.OV10) names(U3.exbytx_nOV10) <- names(exbytx) mean(U3.exbytx_nOV10 >= 50) @ Only 0.756\% of the transcripts in \Rcode{exbytx} have an overlap with at least 50 templates. Top 10 transcripts: <>= head(sort(U3.exbytx_nOV10, decreasing=TRUE), n=10) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Encode the overlaps between the reads and transcripts} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Single-end encodings} The {\it overlap encodings} are strand sensitive so we will compute them twice, once for the ``original alignments'' (i.e. the alignments of the {\it original queries}), and once again for the ``flipped alignments'' (i.e. the alignments of the ``flipped {\it original queries}''). We extract the ranges of the ``original'' and ``flipped'' alignments in 2 \Rclass{GRangesList} objects with: <>= U1.grl <- grglist(U1.GAL, order.as.in.query=TRUE) U1.grlf <- flipQuery(U1.grl) # flipped @ and encode their overlaps with the transcripts: <>= U1.ovencA <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00) U1.ovencB <- encodeOverlaps(U1.grlf, exbytx, hits=U1.OV00) @ \Rcode{U1.ovencA} and \Rcode{U1.ovencB} are 2 \Rclass{OverlapsEncodings} objects of the same length as \Rclass{Hits} object \Rcode{U1.OV00}. For each hit in \Rcode{U1.OV00}, we have 2 corresponding encodings, one in \Rcode{U1.ovencA} and one in \Rcode{U1.ovencB}, but only one of them encodes a hit between alignment ranges and exon ranges that are on the same strand. We use the \Rfunction{selectEncodingWithCompatibleStrand} function to merge them into a single \Rclass{OverlapsEncodings} of the same length. For each hit in \Rcode{U1.OV00}, this selects the encoding corresponding to alignment ranges and exon ranges with compatible strand: <>= U1.grl_strand <- unlist(runValue(strand(U1.grl)), use.names=FALSE) U1.ovenc <- selectEncodingWithCompatibleStrand(U1.ovencA, U1.ovencB, U1.grl_strand, exbytx_strand, hits=U1.OV00) U1.ovenc @ As a convenience, the 2 above calls to \Rfunction{encodeOverlaps} + merging step can be replaced by a single call to \Rfunction{encodeOverlaps} on \Rcode{U1.grl} (or \Rcode{U1.grlf}) with \Rcode{flip.query.if.wrong.strand=TRUE}: <>= U1.ovenc_again <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00, flip.query.if.wrong.strand=TRUE) stopifnot(identical(U1.ovenc_again, U1.ovenc)) @ Unique encodings in \Rcode{U1.ovenc}: <>= U1.unique_encodings <- levels(U1.ovenc) length(U1.unique_encodings) head(U1.unique_encodings) U1.ovenc_table <- table(encoding(U1.ovenc)) tail(sort(U1.ovenc_table)) @ Encodings are sort of cryptic but utilities are provided to extract specific meaning from them. Use of these utilities is covered later in this document. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Paired-end encodings} Let's encode the overlaps in \Rcode{U3.OV00}: <>= U3.grl <- grglist(U3.GALP) U3.ovenc <- encodeOverlaps(U3.grl, exbytx, hits=U3.OV00, flip.query.if.wrong.strand=TRUE) U3.ovenc @ Unique encodings in \Rcode{U3.ovenc}: <>= U3.unique_encodings <- levels(U3.ovenc) length(U3.unique_encodings) head(U3.unique_encodings) U3.ovenc_table <- table(encoding(U3.ovenc)) tail(sort(U3.ovenc_table)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect ``splice compatible'' overlaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% We are interested in a particular type of overlap where the read overlaps the transcript in a ``splice compatible'' way, that is, in a way that is compatible with the splicing of the transcript. The \Rfunction{isCompatibleWithSplicing} function can be used on an \Rclass{OverlapEncodings} object to detect this type of overlap. Note that \Rfunction{isCompatibleWithSplicing} can also be used on a character vector or factor. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``splice compatible'' single-end overlaps} \subsubsection{``Splice compatible'' single-end encodings} \Rcode{U1.ovenc} contains 7 unique encodings compatible with the splicing of the transcript: <>= sort(U1.ovenc_table[isCompatibleWithSplicing(U1.unique_encodings)]) @ Encodings \Rcode{"1:i:"} (455176 occurences in \Rcode{U1.ovenc}), \Rcode{"2:jm:af:"} (72929 occurences in \Rcode{U1.ovenc}), and \Rcode{"3:jmm:agm:aaf:"} (488 occurences in \Rcode{U1.ovenc}), correspond to the following overlaps: \begin{itemize} \item \Rcode{"1:i:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"2:jm:af:"} \begin{verbatim} - read (1 skipped region): ooooo---ooo - transcript: ... >>>>>>>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"3:jmm:agm:aaf:"} \begin{verbatim} - read (2 skipped regions): oo---ooooo---o - transcript: ... >>>>>>>> >>>>> >>>>>>> ... \end{verbatim} \end{itemize} For clarity, only the exons involved in the overlap are represented. The transcript can of course have more upstream and downstream exons, which is denoted by the ... on the left side (5' end) and right side (3' end) of each drawing. Note that the exons represented in the 2nd and 3rd drawings are consecutive and adjacent in the processed transcript. Encodings \Rcode{"1:f:"} and \Rcode{"1:j:"} are variations of the situation described by encoding \Rcode{"1:i:"}. For \Rcode{"1:f:"}, the first aligned base of the read (or ``flipped'' read) is aligned with the first base of the exon. For \Rcode{"1:j:"}, the last aligned base of the read (or ``flipped'' read) is aligned with the last base of the exon: \begin{itemize} \item \Rcode{"1:f:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"1:j:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \end{itemize} <>= U1.OV00_is_comp <- isCompatibleWithSplicing(U1.ovenc) table(U1.OV00_is_comp) # 531797 "splice compatible" overlaps @ Finally, let's extract the ``splice compatible'' overlaps from \Rcode{U1.OV00}: <>= U1.compOV00 <- U1.OV00[U1.OV00_is_comp] @ Note that high-level convenience wrapper \Rfunction{findCompatibleOverlaps} can be used for computing the ``splice compatible'' overlaps directly between a \Rclass{GAlignments} object (containing reads) and a \Rclass{GRangesList} object (containing transcripts): <>= U1.compOV00_again <- findCompatibleOverlaps(U1.GAL, exbytx) stopifnot(identical(U1.compOV00_again, U1.compOV00)) @ \subsubsection{Tabulate the ``splice compatible'' single-end overlaps} Number of ``splice compatible'' transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_ncomptx <- countQueryHits(U1.compOV00) mcols(U1.GAL)$ncomptx <- U1.GAL_ncomptx head(U1.GAL) table(U1.GAL_ncomptx) mean(U1.GAL_ncomptx >= 1) @ 75\% of the alignments in \Rcode{U1.GAL} are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Note that high-level convenience wrapper \Rfunction{countCompatibleOverlaps} can be used directly on \Rcode{U1.GAL} and \Rcode{exbytx} for computing \Rcode{U1.GAL\_ncomptx}: <>= U1.GAL_ncomptx_again <- countCompatibleOverlaps(U1.GAL, exbytx) stopifnot(identical(U1.GAL_ncomptx_again, U1.GAL_ncomptx)) @ Number of ``splice compatible'' transcripts for each read: <>= U1.compOV10 <- remapHits(U1.compOV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ncomptx <- countQueryHits(U1.compOV10) names(U1.uqnames_ncomptx) <- U1.uqnames table(U1.uqnames_ncomptx) mean(U1.uqnames_ncomptx >= 1) @ 77.5\% of the reads are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``splice compatible'' reads for each transcript: <>= U1.exbytx_ncompOV10 <- countSubjectHits(U1.compOV10) names(U1.exbytx_ncompOV10) <- names(exbytx) mean(U1.exbytx_ncompOV10 >= 50) @ Only 0.87\% of the transcripts in \Rcode{exbytx} are ``splice compatible'' with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_ncompOV10, decreasing=TRUE), n=10) @ Note that this ``top 10'' is slightly different from the ``top 10'' we obtained earlier when we counted {\bf all} the overlaps. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``splice compatible'' paired-end overlaps} \subsubsection{``Splice compatible'' paired-end encodings} WARNING: For paired-end encodings, \Rcode{isCompatibleWithSplicing} considers that the encoding is ``splice compatible'' if its 2 halves are ``splice compatible''. This can produce false positives if for example the right end of the alignment is located upstream of the left end in transcript space. The paired-end read could not come from this transcript. To eliminate these false positives, one would need to look at the position of the left and right ends in transcript space. This can be done with \Rcode{extractQueryStartInTranscript}. \Rcode{U3.ovenc} contains 13 unique paired-end encodings compatible with the splicing of the transcript: <>= sort(U3.ovenc_table[isCompatibleWithSplicing(U3.unique_encodings)]) @ Paired-end encodings \Rcode{"1{-}{-}1:i{-}{-}i:"} (100084 occurences in \Rcode{U3.ovenc}), \Rcode{"2{-}{-}1:jm{-}{-}m:af{-}{-}i:"} (2700 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}af:"} (2480 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}1:i{-}{-}m:a{-}{-}i:"} (287 occurences in \Rcode{U3.ovenc}), and \Rcode{"2{-}{-}2:jm{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} (153 occurences in \Rcode{U3.ovenc}), correspond to the following paired-end overlaps: \begin{itemize} \item \Rcode{"1{-}{-}1:i{-}{-}i:"} \begin{verbatim} - paired-end read (no skipped region on the first end, no skipped region on the last end): oooo oooo - transcript: ... >>>>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}1:jm{-}{-}m:af{-}{-}i:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, no skipped region on the last end): ooo---o oooo - transcript: ... >>>>>>>> >>>>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}af:"} \begin{verbatim} - paired-end read (no skipped region on the first end, 1 skipped region on the last end): oooo oo---oo - transcript: ... >>>>>>>>>>>>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}1:i{-}{-}m:a{-}{-}i:"} \begin{verbatim} - paired-end read (no skipped region on the first end, no skipped region on the last end): oooo oooo - transcript: ... >>>>>>>>> >>>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}2:jm{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, 1 skipped region on the last end): ooo---o oo---oo - transcript: ... >>>>>> >>>>>>> >>>>> ... \end{verbatim} \end{itemize} Note: switch use of ``first'' and ``last'' above if the read was ``flipped''. <>= U3.OV00_is_comp <- isCompatibleWithSplicing(U3.ovenc) table(U3.OV00_is_comp) # 106835 "splice compatible" paired-end overlaps @ Finally, let's extract the ``splice compatible'' paired-end overlaps from \Rcode{U3.OV00}: <>= U3.compOV00 <- U3.OV00[U3.OV00_is_comp] @ Note that, like with our single-end reads, high-level convenience wrapper \Rfunction{findCompatibleOverlaps} can be used for computing the ``splice compatible'' paired-end overlaps directly between a \Rclass{GAlignmentPairs} object (containing paired-end reads) and a \Rclass{GRangesList} object (containing transcripts): <>= U3.compOV00_again <- findCompatibleOverlaps(U3.GALP, exbytx) stopifnot(identical(U3.compOV00_again, U3.compOV00)) @ \subsubsection{Tabulate the ``splice compatible'' paired-end overlaps} Number of ``splice compatible'' transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_ncomptx <- countQueryHits(U3.compOV00) mcols(U3.GALP)$ncomptx <- U3.GALP_ncomptx head(U3.GALP) table(U3.GALP_ncomptx) mean(U3.GALP_ncomptx >= 1) @ 69.7\% of the alignment pairs in \Rcode{U3.GALP} are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Note that high-level convenience wrapper \Rfunction{countCompatibleOverlaps} can be used directly on \Rcode{U3.GALP} and \Rcode{exbytx} for computing \Rcode{U3.GALP\_ncomptx}: <>= U3.GALP_ncomptx_again <- countCompatibleOverlaps(U3.GALP, exbytx) stopifnot(identical(U3.GALP_ncomptx_again, U3.GALP_ncomptx)) @ Number of ``splice compatible'' transcripts for each template: <>= U3.compOV10 <- remapHits(U3.compOV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ncomptx <- countQueryHits(U3.compOV10) names(U3.uqnames_ncomptx) <- U3.uqnames table(U3.uqnames_ncomptx) mean(U3.uqnames_ncomptx >= 1) @ 70.7\% of the templates are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``splice compatible'' templates for each transcript: <>= U3.exbytx_ncompOV10 <- countSubjectHits(U3.compOV10) names(U3.exbytx_ncompOV10) <- names(exbytx) mean(U3.exbytx_ncompOV10 >= 50) @ Only 0.7\% of the transcripts in \Rcode{exbytx} are ``splice compatible'' with at least 50 templates. Top 10 transcripts: <>= head(sort(U3.exbytx_ncompOV10, decreasing=TRUE), n=10) @ Note that this ``top 10'' is slightly different from the ``top 10'' we obtained earlier when we counted {\bf all} the paired-end overlaps. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Compute the {\it reference query sequences} and project them on the transcriptome} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Compute the {\it reference query sequences}} The {\it reference query sequences} are the query sequences {\bf after} alignment, by opposition to the {\it original query sequences} (aka ``true'' or ``real'' query sequences) which are the query sequences {\bf before} alignment. The {\it reference query sequences} can easily be computed by extracting the nucleotides mapped to each read from the reference genome. This of course requires that we have access to the reference genome used by the aligner. In Bioconductor, the full genome sequence for the dm3 assembly is stored in the \Rpackage{BSgenome.Dmelanogaster.UCSC.dm3} data package \footnote{See \url{http://bioconductor.org/packages/release/data/annotation/} for the full list of annotation packages available in the current release of Bioconductor.}: <>= library(BSgenome.Dmelanogaster.UCSC.dm3) Dmelanogaster @ To extract the portions of the reference genome corresponding to the ranges in \Rcode{U1.grl}, we can use the \Rfunction{extractTranscriptSeqs} function defined in the \Rpackage{GenomicFeatures} package: <>= library(GenomicFeatures) U1.GAL_rqseq <- extractTranscriptSeqs(Dmelanogaster, U1.grl) head(U1.GAL_rqseq) @ When reads are paired-end, we need to extract separately the ranges corresponding to their {\it first} ends (aka {\it first} segments in BAM jargon) and those corresponding to their {\it last} ends (aka {\it last} segments in BAM jargon): <>= U3.grl_first <- grglist(first(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) U3.grl_last <- grglist(last(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) @ Then we extract the portions of the reference genome corresponding to the ranges in \Rclass{GRangesList} objects \Rcode{U3.grl\_first} and \Rcode{U3.grl\_last}: <>= U3.GALP_rqseq1 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_first) U3.GALP_rqseq2 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_last) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Project the single-end alignments on the transcriptome} The \Rfunction{extractQueryStartInTranscript} function computes for each overlap the position of the {\it query start} in the transcript: <>= U1.OV00_qstart <- extractQueryStartInTranscript(U1.grl, exbytx, hits=U1.OV00, ovenc=U1.ovenc) head(subset(U1.OV00_qstart, U1.OV00_is_comp)) @ \Rcode{U1.OV00\_qstart} is a data frame with 1 row per overlap and 3 columns: \begin{enumerate} \item \Rcode{startInTranscript}: the 1-based start position of the read with respect to the transcript. Position 1 always corresponds to the first base on the 5' end of the transcript sequence. \item \Rcode{firstSpannedExonRank}: the rank of the first exon spanned by the read, that is, the rank of the exon found at position \Rcode{startInTranscript} in the transcript. \item \Rcode{startInFirstSpannedExon}: the 1-based start position of the read with respect to the first exon spanned by the read. \end{enumerate} Having this information allows us for example to compare the read and transcript nucleotide sequences for each ``splice compatible'' overlap. If we use the {\it reference query sequence} instead of the {\it original query sequence} for this comparison, then it should match {\bf exactly} the sequence found at the {\it query start} in the transcript. Let's start by using \Rfunction{extractTranscriptSeqs} again to extract the transcript sequences (aka transcriptome) from the dm3 reference genome: <>= txseq <- extractTranscriptSeqs(Dmelanogaster, exbytx) @ For each ``splice compatible'' overlap, the read sequence in \Rcode{U1.GAL\_rqseq} must be an {\it exact} substring of the transcript sequence in \Rcode{exbytx\_seq}: <>= U1.OV00_rqseq <- U1.GAL_rqseq[queryHits(U1.OV00)] U1.OV00_rqseq[flippedQuery(U1.ovenc)] <- reverseComplement(U1.OV00_rqseq[flippedQuery(U1.ovenc)]) U1.OV00_txseq <- txseq[subjectHits(U1.OV00)] stopifnot(all( U1.OV00_rqseq[U1.OV00_is_comp] == narrow(U1.OV00_txseq[U1.OV00_is_comp], start=U1.OV00_qstart$startInTranscript[U1.OV00_is_comp], width=width(U1.OV00_rqseq)[U1.OV00_is_comp]) )) @ Because of this relationship between the {\it reference query sequence} and the transcript sequence of a ``splice compatible'' overlap, and because of the relationship between the {\it original query sequences} and the {\it reference query sequences}, then the edit distance reported in the NM tag is actually the edit distance between the {\it original query} and the transcript of a ``splice compatible'' overlap. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Project the paired-end alignments on the transcriptome} For a paired-end read, the {\it query start} is the start of its ``left end''. <>= U3.OV00_Lqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc) head(subset(U3.OV00_Lqstart, U3.OV00_is_comp)) @ Note that \Rfunction{extractQueryStartInTranscript} can be called with \Rcode{for.query.right.end=TRUE} if we want this information for the ``right ends'' of the reads: <>= U3.OV00_Rqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc, for.query.right.end=TRUE) head(subset(U3.OV00_Rqstart, U3.OV00_is_comp)) @ Like with single-end reads, having this information allows us for example to compare the read and transcript nucleotide sequences for each ``splice compatible'' overlap. If we use the {\it reference query sequence} instead of the {\it original query sequence} for this comparison, then it should match {\bf exactly} the sequences of the ``left'' and ``right'' ends of the read in the transcript. Let's assign the ``left and right reference query sequences'' to each overlap: <>= U3.OV00_Lrqseq <- U3.GALP_rqseq1[queryHits(U3.OV00)] U3.OV00_Rrqseq <- U3.GALP_rqseq2[queryHits(U3.OV00)] @ For the single-end reads, the sequence associated with a ``flipped query'' just needed to be ``reverse complemented''. For paired-end reads, we also need to swap the 2 sequences in the pair: <>= flip_idx <- which(flippedQuery(U3.ovenc)) tmp <- U3.OV00_Lrqseq[flip_idx] U3.OV00_Lrqseq[flip_idx] <- reverseComplement(U3.OV00_Rrqseq[flip_idx]) U3.OV00_Rrqseq[flip_idx] <- reverseComplement(tmp) @ Let's assign the transcript sequence to each overlap: <>= U3.OV00_txseq <- txseq[subjectHits(U3.OV00)] @ For each ``splice compatible'' overlap, we expect the ``left and right reference query sequences'' of the read to be {\it exact} substrings of the transcript sequence. Let's check the ``left reference query sequences'': <>= stopifnot(all( U3.OV00_Lrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Lqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Lrqseq)[U3.OV00_is_comp]) )) @ and the ``right reference query sequences'': <>= stopifnot(all( U3.OV00_Rrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Rqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Rrqseq)[U3.OV00_is_comp]) )) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Align the reads to the transcriptome} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Aligning the reads to the reference genome is not the most efficient nor accurate way to count the number of ``splice compatible'' overlaps per {\it original query}. Supporting junction reads (i.e. reads that align with at least 1 skipped region in their CIGAR) introduces a significant computational cost during the alignment process. Then, as we've seen in the previous sections, each alignment produced by the aligner needs to be broken into a set of ranges (based on its CIGAR) and those ranges compared to the ranges of the exons grouped by transcript. A more straightforward and accurate approach is to align the reads directly to the transcriptome, and without allowing the typical skipped region that the aligner needs to introduce when aligning a junction read to the reference genome. With this approach, a ``hit'' between a read and a transcript is necessarily compatible with the splicing of the transcript. In case of a ``hit'', we'll say that the read and the transcript are ``string-based compatible'' (to differentiate from our previous notion of ``splice compatible'' overlaps that we will call ``encoding-based compatible'' in this section). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Align the single-end reads to the transcriptome} \subsubsection{Find the ``hits''} The single-end reads are in \Rcode{U1.oqseq}, the transcriptome is in \Rcode{exbytx\_seq}. Since indels were not allowed/supported during the alignment of the reads to the reference genome, we don't need to allow/support them either for aligning the reads to the transcriptome. Also since our goal is to find (and count) ``splice compatible'' overlaps between reads and transcripts, we don't need to keep track of the details of the alignments between the reads and the transcripts. Finally, since BAM file {\tt untreated1\_chr4.bam} is not the full output of the aligner but the subset obtained by keeping only the alignments located on chr4, we don't need to align \Rcode{U1.oqseq} to the full transcriptome, but only to the subset of \Rcode{exbytx\_seq} made of the transcripts located on chr4. With those simplifications in mind, we write the following function that we will use to find the ``hits'' between the reads and the transcriptome: <>= ### A wrapper to vwhichPDict() that supports IUPAC ambiguity codes in 'qseq' ### and 'txseq', and treats them as such. findSequenceHits <- function(qseq, txseq, which.txseq=NULL, max.mismatch=0) { .asHits <- function(x, pattern_length) { query_hits <- unlist(x) if (is.null(query_hits)) query_hits <- integer(0) subject_hits <- rep.int(seq_len(length(x)), elementNROWS(x)) Hits(query_hits, subject_hits, pattern_length, length(x), sort.by.query=TRUE) } .isHitInTranscriptBounds <- function(hits, qseq, txseq) { sapply(seq_len(length(hits)), function(i) { pattern <- qseq[[queryHits(hits)[i]]] subject <- txseq[[subjectHits(hits)[i]]] v <- matchPattern(pattern, subject, max.mismatch=max.mismatch, fixed=FALSE) any(1L <= start(v) & end(v) <= length(subject)) }) } if (!is.null(which.txseq)) { txseq0 <- txseq txseq <- txseq[which.txseq] } names(qseq) <- NULL other <- alphabetFrequency(qseq, baseOnly=TRUE)[ , "other"] is_clean <- other == 0L # "clean" means "no IUPAC ambiguity code" ## Find hits for "clean" original queries. qseq0 <- qseq[is_clean] pdict0 <- PDict(qseq0, max.mismatch=max.mismatch) m0 <- vwhichPDict(pdict0, txseq, max.mismatch=max.mismatch, fixed="pattern") hits0 <- .asHits(m0, length(qseq0)) hits0@nLnode <- length(qseq) hits0@from <- which(is_clean)[hits0@from] ## Find hits for non "clean" original queries. qseq1 <- qseq[!is_clean] m1 <- vwhichPDict(qseq1, txseq, max.mismatch=max.mismatch, fixed=FALSE) hits1 <- .asHits(m1, length(qseq1)) hits1@nLnode <- length(qseq) hits1@from <- which(!is_clean)[hits1@from] ## Combine the hits. query_hits <- c(queryHits(hits0), queryHits(hits1)) subject_hits <- c(subjectHits(hits0), subjectHits(hits1)) if (!is.null(which.txseq)) { ## Remap the hits. txseq <- txseq0 subject_hits <- which.txseq[subject_hits] hits0@nRnode <- length(txseq) } ## Order the hits. oo <- orderIntegerPairs(query_hits, subject_hits) hits0@from <- query_hits[oo] hits0@to <- subject_hits[oo] if (max.mismatch != 0L) { ## Keep only "in bounds" hits. is_in_bounds <- .isHitInTranscriptBounds(hits0, qseq, txseq) hits0 <- hits0[is_in_bounds] } hits0 } @ Let's compute the index of the transcripts in \Rcode{exbytx\_seq} located on chr4 (\Rfunction{findSequenceHits} will restrict the search to those transcripts): <>= chr4tx <- transcripts(txdb, vals=list(tx_chrom="chr4")) chr4txnames <- mcols(chr4tx)$tx_name which.txseq <- match(chr4txnames, names(txseq)) @ We know that the aligner tolerated up to 6 mismatches per read. The 3 following commands find the ``hits'' for each {\it original query}, then find the ``hits'' for each ``flipped {\it original query}'', and finally merge all the ``hits'' (note that the 3 commands take about 1 hour to complete on a modern laptop): <>= U1.sbcompHITSa <- findSequenceHits(U1.oqseq, txseq, which.txseq=which.txseq, max.mismatch=6) U1.sbcompHITSb <- findSequenceHits(reverseComplement(U1.oqseq), txseq, which.txseq=which.txseq, max.mismatch=6) U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) @ <>= U1.sbcompHITSa <- .loadPrecomputed("U1.sbcompHITSa") U1.sbcompHITSb <- .loadPrecomputed("U1.sbcompHITSb") U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) @ \subsubsection{Tabulate the ``hits''} Number of ``string-based compatible'' transcripts for each read: <>= U1.uqnames_nsbcomptx <- countQueryHits(U1.sbcompHITS) names(U1.uqnames_nsbcomptx) <- U1.uqnames table(U1.uqnames_nsbcomptx) mean(U1.uqnames_nsbcomptx >= 1) @ 77.7\% of the reads are ``string-based compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``string-based compatible'' reads for each transcript: <>= U1.exbytx_nsbcompHITS <- countSubjectHits(U1.sbcompHITS) names(U1.exbytx_nsbcompHITS) <- names(exbytx) mean(U1.exbytx_nsbcompHITS >= 50) @ Only 0.865\% of the transcripts in \Rcode{exbytx} are ``string-based compatible'' with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_nsbcompHITS, decreasing=TRUE), n=10) @ \subsubsection{A closer look at the ``hits''} [WORK IN PROGRESS, might be removed or replaced soon...] Any ``encoding-based compatible'' overlap is of course ``string-based compatible'': <>= stopifnot(length(setdiff(U1.compOV10, U1.sbcompHITS)) == 0) @ but the reverse is not true: <>= length(setdiff(U1.sbcompHITS, U1.compOV10)) @ %To understand why the {\it overlap encodings} approach doesn't find all %the ``string-based compatible'' hits, let's look at the second hit in %\Rcode{setdiff(U1.sbcompHITS, U1.compOV10)}. This is a perfect hit between %read SRR031728.4692406 and transcript 18924: % %<<>>= %matchPattern(U1.oqseq[[6306]], txseq[[18924]]) %U1.GAL_idx <- which(U1.GAL_qnames == "SRR031728.4692406") %U1.GAL[U1.GAL_idx] %U1.GAL_idx %in% queryHits(U1.OV00) %U1.GAL[12636] %which(queryHits(U1.OV00) == 12636) %U1.OV00[305] %as.character(encoding(U1.ovenc)[305]) %@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Align the paired-end reads to the transcriptome} [COMING SOON...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect ``almost splice compatible'' overlaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In many aspects, ``splice compatible'' overlaps can be seen as perfect. We are now insterested in a less perfect type of overlap where the read overlaps the transcript in a way that {\it would} be ``splice compatible'' if 1 or more exons were removed from the transcript. In that case we say that the overlap is ``almost splice compatible'' with the transcript. The \Rfunction{isCompatibleWithSkippedExons} function can be used on an \Rclass{OverlapEncodings} object to detect this type of overlap. Note that \Rfunction{isCompatibleWithSkippedExons} can also be used on a character vector of factor. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``almost splice compatible'' single-end overlaps} \subsubsection{``Almost splice compatible'' single-end encodings} \Rcode{U1.ovenc} contains 7 unique encodings ``almost splice compatible'' with the splicing of the transcript: <>= sort(U1.ovenc_table[isCompatibleWithSkippedExons(U1.unique_encodings)]) @ Encodings \Rcode{"2:jm:am:af:"} (1015 occurences in \Rcode{U1.ovenc}), \Rcode{"2:jm:am:am:af:"} (144 occurences in \Rcode{U1.ovenc}), and \Rcode{"3:jmm:agm:aam:aaf:"} (21 occurences in \Rcode{U1.ovenc}), correspond to the following overlaps: \begin{itemize} \item \Rcode{"2:jm:am:af:"} \begin{verbatim} - read (1 skipped region): ooooo----------ooo - transcript: ... >>>>>>> >>>> >>>>>>>> ... \end{verbatim} \item \Rcode{"2:jm:am:am:af:"} \begin{verbatim} - read (1 skipped region): ooooo------------------ooo - transcript: ... >>>>>>> >>>> >>>>> >>>>>>>> ... \end{verbatim} \item \Rcode{"3:jmm:agm:aam:aaf:"} \begin{verbatim} - read (2 skipped regions): oo---oooo-----------oo - transcript: ... >>>>>>> >>>> >>>>> >>>>>>>> ... \end{verbatim} \end{itemize} <>= U1.OV00_is_acomp <- isCompatibleWithSkippedExons(U1.ovenc) table(U1.OV00_is_acomp) # 1202 "almost splice compatible" overlaps @ Finally, let's extract the ``almost splice compatible'' overlaps from \Rcode{U1.OV00}: <>= U1.acompOV00 <- U1.OV00[U1.OV00_is_acomp] @ \subsubsection{Tabulate the ``almost splice compatible'' single-end overlaps} Number of ``almost splice compatible'' transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_nacomptx <- countQueryHits(U1.acompOV00) mcols(U1.GAL)$nacomptx <- U1.GAL_nacomptx head(U1.GAL) table(U1.GAL_nacomptx) mean(U1.GAL_nacomptx >= 1) @ Only 0.27\% of the alignments in \Rcode{U1.GAL} are ``almost splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``almost splice compatible'' alignments for each transcript: <>= U1.exbytx_nacompOV00 <- countSubjectHits(U1.acompOV00) names(U1.exbytx_nacompOV00) <- names(exbytx) table(U1.exbytx_nacompOV00) mean(U1.exbytx_nacompOV00 >= 50) @ Only 0.017\% of the transcripts in \Rcode{exbytx} are ``almost splice compatible'' with at least 50 alignments in \Rcode{U1.GAL}. Finally note that the ``query start in transcript'' values returned by \Rfunction{extractQueryStartInTranscript} are also defined for ``almost splice compatible'' overlaps: <>= head(subset(U1.OV00_qstart, U1.OV00_is_acomp)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``almost splice compatible'' paired-end overlaps} \subsubsection{``Almost splice compatible'' paired-end encodings} \Rcode{U3.ovenc} contains 5 unique paired-end encodings ``almost splice compatible'' with the splicing of the transcript: <>= sort(U3.ovenc_table[isCompatibleWithSkippedExons(U3.unique_encodings)]) @ Paired-end encodings \Rcode{"2{-}{-}1:jm{-}{-}m:am{-}{-}m:af{-}{-}i:"} (73 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}am:a{-}{-}af:"} (53 occurences in \Rcode{U3.ovenc}), and \Rcode{"2{-}{-}2:jm{-}{-}mm:am{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} (9 occurences in \Rcode{U3.ovenc}), correspond to the following paired-end overlaps: \begin{itemize} \item \Rcode{"2{-}{-}1:jm{-}{-}m:am{-}{-}m:af{-}{-}i:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, no skipped region on the last end): ooo----------o oooo - transcript: ... >>>>> >>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}am:a{-}{-}af:"} \begin{verbatim} - paired-end read (no skipped region on the first end, 1 skipped region on the last end): oooo oo---------oo - transcript: ... >>>>>>>>>>> >>> >>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}2:jm{-}{-}mm:am{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, 1 skipped region on the last end): o----------ooo oo---oo - transcript: ... >>>>> >>>> >>>>>>>> >>>>>> ... \end{verbatim} \end{itemize} Note: switch use of ``first'' and ``last'' above if the read was ``flipped''. <>= U3.OV00_is_acomp <- isCompatibleWithSkippedExons(U3.ovenc) table(U3.OV00_is_acomp) # 141 "almost splice compatible" paired-end overlaps @ Finally, let's extract the ``almost splice compatible'' paired-end overlaps from \Rcode{U3.OV00}: <>= U3.acompOV00 <- U3.OV00[U3.OV00_is_acomp] @ \subsubsection{Tabulate the ``almost splice compatible'' paired-end overlaps} Number of ``almost splice compatible'' transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_nacomptx <- countQueryHits(U3.acompOV00) mcols(U3.GALP)$nacomptx <- U3.GALP_nacomptx head(U3.GALP) table(U3.GALP_nacomptx) mean(U3.GALP_nacomptx >= 1) @ Only 0.2\% of the alignment pairs in \Rcode{U3.GALP} are ``almost splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``almost splice compatible'' alignment pairs for each transcript: <>= U3.exbytx_nacompOV00 <- countSubjectHits(U3.acompOV00) names(U3.exbytx_nacompOV00) <- names(exbytx) table(U3.exbytx_nacompOV00) mean(U3.exbytx_nacompOV00 >= 50) @ Only 0.0034\% of the transcripts in \Rcode{exbytx} are ``almost splice compatible'' with at least 50 alignment pairs in \Rcode{U3.GALP}. Finally note that the ``query start in transcript'' values returned by \Rfunction{extractQueryStartInTranscript} are also defined for ``almost splice compatible'' paired-end overlaps: <>= head(subset(U3.OV00_Lqstart, U3.OV00_is_acomp)) head(subset(U3.OV00_Rqstart, U3.OV00_is_acomp)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect novel splice junctions} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{By looking at single-end overlaps} An alignment in \Rcode{U1.GAL} with ``almost splice compatible'' overlaps but no ``splice compatible'' overlaps suggests the presence of one or more transcripts that are not in our annotations. First we extract the index of those alignments ({\it nsj} here stands for ``{\bf n}ovel {\bf s}plice {\bf j}unction''): <>= U1.GAL_is_nsj <- U1.GAL_nacomptx != 0L & U1.GAL_ncomptx == 0L head(which(U1.GAL_is_nsj)) @ We make this an index into \Rcode{U1.OV00}: <>= U1.OV00_is_nsj <- queryHits(U1.OV00) %in% which(U1.GAL_is_nsj) @ We intersect with \Rcode{U1.OV00\_is\_acomp} and then subset \Rcode{U1.OV00} to keep only the overlaps that suggest novel splicing: <>= U1.OV00_is_nsj <- U1.OV00_is_nsj & U1.OV00_is_acomp U1.nsjOV00 <- U1.OV00[U1.OV00_is_nsj] @ For each overlap in \Rcode{U1.nsjOV00}, we extract the ranks of the skipped exons (we use a list for this as there might be more than 1 skipped exon per overlap): <>= U1.nsjOV00_skippedex <- extractSkippedExonRanks(U1.ovenc)[U1.OV00_is_nsj] names(U1.nsjOV00_skippedex) <- queryHits(U1.nsjOV00) table(elementNROWS(U1.nsjOV00_skippedex)) @ Finally, we split \Rcode{U1.nsjOV00\_skippedex} by transcript names: <>= f <- factor(names(exbytx)[subjectHits(U1.nsjOV00)], levels=names(exbytx)) U1.exbytx_skippedex <- split(U1.nsjOV00_skippedex, f) @ \Rcode{U1.exbytx\_skippedex} is a named list of named lists of integer vectors. The first level of names (outer names) are transcript names and the second level of names (inner names) are alignment indices into \Rcode{U1.GAL}: <>= head(names(U1.exbytx_skippedex)) # transcript names @ Transcript FBtr0089124 receives 7 hits. All of them skip exons 9 and 10: <>= U1.exbytx_skippedex$FBtr0089124 @ Transcript FBtr0089147 receives 4 hits. Two of them skip exon 2, one of them skips exons 2 to 6, and one of them skips exon 10: <>= U1.exbytx_skippedex$FBtr0089147 @ A few words about the interpretation of \Rcode{U1.exbytx\_skippedex}: Because of how we've conducted this analysis, the aligments reported in \Rcode{U1.exbytx\_skippedex} are guaranteed to not have any ``splice compatible'' overlaps with other known transcripts. All we can say, for example in the case of transcript FBtr0089124, is that the 7 reported hits that skip exons 9 and 10 show evidence of one or more unknown transcripts with a splice junction that corresponds to the gap between exons 8 and 11. But without further analysis, we can't make any assumption about the exons structure of those unknown transcripts. In particular, we cannot assume the existence of an unknown transcript made of the same exons as transcript FBtr0089124 minus exons 9 and 10! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{By looking at paired-end overlaps} [COMING SOON...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rcode{sessionInfo()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= sessionInfo() @ \end{document} GenomicAlignments/inst/doc/OverlapEncodings.pdf0000644000175200017520000110163514551577513022702 0ustar00biocbuildbiocbuild%PDF-1.5 % 232 0 obj << /Length 1348 /Filter /FlateDecode >> stream x\Ms6WHT 8nIF8Z]u$Rh]$-*jZDAh. 46WB`P"1^cE8Q_mjzJ(Q d0 $%ZC$,΃6_&hm:n}m⊫ …DB00dф8|q&wxV=a:`)h00o])\UWה ;M6ᥝ JXh 2k:[˶$O"$UeW({68&`1&ERzZxL^giaӢ;I7b&5' `e9&+ʕwyOpM),p֍Ŋh.ygl6 BLbkhIضAf $`"B=0 u 5@x!pC1Rԅ@ _+dVx@V,/u [1Z4Ut]e$\?uT(3tOj<הjJR[\3%iUbbah ɤ$LCNq:/m7;+؆/_iը |!pwm±Z}2+P@E>ž}jusd[P=aaDA yDiyMˤ^zPwL9[H J22 $U2:6ɇ#+TJ2LhOJ/) \Ag!2kKVPMն2T=hMY"zFw6\uĈ6hNj^ZB^xX"ڥxirφq7bVYZ'ŢZh--JI(-ųw5pk ~ 6f\f\E7U7LKO!X%IY*NxcjLq(񭥃i b\)3Qy}O %w-~aTY^)(g9>z]s_P;o?QJT[+I~o&XM{i0D{CyVx/N[CnJ‰'<+K홁za&hV@5;'JU/6>YGtÉrZX,v,@9EΏw~r aٗdKW9j~P4řU)6'p;F90WvG^(qFz endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 862 /Length 1921 /Filter /FlateDecode >> stream x[]oH}uH }J6&) ~uI\;iR33g={ -DFDAB& ))(`P$BR+cB7&*БU;&gEZfo㠗HKQa4:uDJ@mЕ`P;@1^:x''"xG.@wΒ$4H{D '' BeDDžHPETUçU'O%N^iUT\.“/4]OdV8xLK_q-f)da0K)d$Yk ppokG\| S8)LkQmTOkYAڮ⊄6V9۹ձQ{7O6+iՍsf4ZRƂqsGU7G?mSw,WtP^[&i4y|Zo밪6j36XK.qP aQT̒g ȠRʤ:OS.$#SCϽ !]X#~59~"?%mG+>EƦi'~mZ~PUlMzWKre*"??Hen, KZΏģGYd(zYx43bˬz8_LC>D^ON>l:ṛi4=Fy3/gb.ї}Fc xEuY۲.BiKX.vNI*k]ֶ}YvTQiGvTکΔ*Ui.폳 텿Yݼt9폧'iA<{{&;fMsdVxK$؜Q[crMv{͆#&W |nq%ۑ"& |E)Sd`KY8/s~J> stream x\Y~_K*q8ᇸ$R$J$U $AbE:}g Rw63_&W M]qO|ھ^}tϹf%ßvvQ:a$sLwV?ډ _TQ4D٤Gn`>u FŻ ?iKP‹d `ĹVb"K./uE+Fh)IW^i0iUyy " ;O@ә>OI ƔMϔ>`>S%uquY¿)̂Dz sヱX^C8S2x0.:W;&u|Pw[MAx QX-M |e""DIDh߽wC 0X-O!׉y1}sy~?O]x>H=lU?}ݷ,C2\,QeU].k7lxS nHΖU#+O׌𰩲85g=aֲXP`+k }W'PN'E-Qx!2ܼ̄ G80T}+l<:ۭ -YCqay:|"hixnyÇPyXkXpS!(g٪\s"OtjbhFܤ_ӫNᨯ]: /o'-8$[MuY$] ky}[`1[㗗VޣрG`Y#ظL} Yq4l '?!Hw{ ܪkcv#Rjk*y<є|Nן'פaS3]+eo7דrn3Ízfo׀Y^gXLgjh'X5}1:D}Ӵow'W-wLjaE9rxC_ LUpuwKEU (&_6k܇?$glY< 7نJ#=θ$3TP㬍p?Ѩw5  >z~#7=)H KUP;@.n)_)XDmJTlrK6rb(X)RiY:+>5Tϕ8jRSai̷ېWVG\ߣ_^]u& j0!M3 n`0 gCG2JB,C() ŐQq1/1$q#t`?et!cʂrĘI-<: ְ@y (*ACuĄ_QI.@qU֡_<ۀ3B 됥b/Џo,] aXs8µe34?5 S04J1j?iU<]q{M #JDfoCw/f=K_28H܁RbɌ"u Pt#%UR]oWd@]A ^.Cu[~~M^@><- endstream endobj 288 0 obj << /Length 2500 /Filter /FlateDecode >> stream xZ[s۶~s"7DӓxΙ&iltPLRq.DYv8/p.-`"8N#ˬ&bTFL[]ow\[eL҉(Ywx kihbMuR.HYzk&J`Hb+{e餩:>oX0}#bd볲~`SmӻaRӬc`VdUPk9ɘ4趡SXeݝ_V8: #DdU%|q&a1W$Qˣ_Go fc.Q(Ƶ`U `up݋__eh8n8IDS,BTMVOp=aHD8,J T8-zISg-ClgrV_)>_ySu]-1;wKzrZBYiZtru]YYۇI_:C(c?U%ņ?|{eݻcґq@i'Eq%iMG뀦r$!ThS+C5}2g ~VءeՃYJo^KgvRL$`*Si`jf(CqpCN$kZ܋ e={T=F Q"[,]3L11x?` ;.H`(aA0\~xXY< Z+P4qA2(d*$=G XWTϔΪPʄ âfڱ*.GJ:b ?*FR> 9/߱\$؏%z y >xFǩ_^#by_{N62!Fo[(,kRP؀! }"Di&L , i֕d|c'@j.ʞV*NTDZh EA$mC1 f1X-(~c4ABN>}omƹ~:rALz6$bVk84*jxzweK;˄;ko(bppk0@Uy_Li +!%xH*81gcCL i<CVV2ofmf9Rh/0¶s c󰴣oY!P$0pĨ.$RɄT ޹_AƹoA Fpo>k8lOc+$hmrX笘Wk 7n E\R0T}j-WߩCN25g61j6OKmׇ2mj]΢m 63J'0,I# *:~Z#[=iiĻF 7k`rU_"N%#?7vu"FJw+\<]߹ 'G-hc L{gB2"2+z_a V1zËp DKf^Nu-oj}#ࠂikQxjjdOOΞλLW8XC&B%,j՝M-ߧn"{sMAt%g'T>y9MPg> stream xZ۶?r&u'Nzڙӡ%H%R&n=D.zwMlx@tO47v>2RDQe FSckts&ڟf&9QDhT8&?gLPӐ6.YQȧMjzyh^_ Or-r BVlOtwKaa`S:~lA.:N&?010O$u`0J[1@+_Š &%x)Hy@ATv6y\sS#, l00<w-?66_ML;V ^dn.؋O2D.T.C#CvoН`mn0Pt }󢄏j(ȆKo6ɰV;>u@ A* {#s0"~|D)Ĩ!F2O'isQ[گS3.Kr%$$SDppIEm"0 P>mGaI9mIX5LmܙY=7z6E6Q+S€[I<¤ \":iIm=D1` c#|sl^af >fRf>I'kƅ' Y>}CjjN:sٶGBoЮ<0^c˲Gܟa<ߐL -_Ih#P'.D+> 2W" 1A!c 6N!2;9> Ewqpv% %0GeU)E /gGKqLjyJLBv t'B6m P]5-^vxhX6X0cux L5C#n>H eT_\W ##IoW{(O500]&,2~xYÎEyC(zLf L)-\3VYzNP0뾂̜F9SȞl x#{t Уb8W4OM#5ʇP <̈́sʥvf$c?cS*Ԣ1ŗmQN: RpkfSLe *,c9X+\|/YƵX?@=0ӠLD/ JfQݞP!.B/@Ҩ{#)E"4tlV9 Ƒ6I.=#v(gҪ,J‡8RYYwBXިͼ;D\5 LtYu7*f>1 x=3ۿcuhw׶G`&(|F,Me5%Fh# v,LS&NC{#3Aˑ$ ` ճ.v`򴸘k/v W |y_53,~ D)9 "/)SxuG?zjI[{#T*|1C<`MQXK]ˇLe׳t)==O{;gӺ׃S }98w:z37_Rs08qAc6l endstream endobj 296 0 obj << /Length 2354 /Filter /FlateDecode >> stream xZ[o~ r( Rp$ACQI*n}go)Ӊۍ\.wf8Y$8yu/N 2rqÓY6SQdJN*jL_02>Er~YȯP_;ϩ@ĨPI]$߿˾K2S+, "&RKDVS\Uٺh&SiڴuV&SN Or Fuzu]d0+۰lG׮ʭ:|OUɔP)_fuE'ʪ-}\L H`93H0M ˚PN'SN: k"anΨ#I{n?vd9R$$Xn`-49NtE p7n(8Y|EIfO|=#AyCRau7NWRLP^(Sol "`yYQVjE^b'EY>X+^$ M! C=˧!)ViZq|^ÌY[n]frQ?ldwS^g~euQc f:\L{`IMI~/#{J++֏a"[xʰ~ V.s'P M8 AfKSAT sI8X e'$F԰11 ˏC 96]T"Ukn1;> ¢;kD4yg=gi&0`/L Vg۳rM@$Af!@L؀5 18 g?2u]x{iKtu& ~bNnPvi$ ltrtk|aSPQH)5V`X=G0P4M"%u߳BL"Fobt!(ZCHĥ7U ك\H Wu$)DݡB PqPں )£>"CHjC2Xֆ\xP4j0 T}Xgâ0V[/䁝ꗧ^e/P5BO M#Q p `{K;&u*v>V3?mF":\zv{]L9V+?ixG7.#J8bM\&mߣS..Y>7e4<0T!ihDx8ԫ_߄Ŵ^ qWRWDaU0 ]Y\H5~1®pMP~ڿϠI+ܫ?  BU($=0fsm6K*kdKTrJYr?{5{mI:k 8 eݵ~hU*^ڕc2V5Ӌqt__ dp[AWSNub/*vj܀GC9.[k;:X SP>/B%@.fZ?ʶ > stream xZmo8_! _E@pznb,17CRٴM! Eə"8QiOy+T#3Peuꨩ'TAĤqޖ\.ڲx:$ qCS=N9-*;R5귙 t(l7+ԗe{9$+"*DS7_' }(JE%W:J/_hU zIVpKn^^.;}+^ ]6 +| xC d$3#T38 M`W#\B1O_ǩ8x^]6_9)߷U˲9(c`Gw6hB@V)1 pqS`ڑR*F.T=da:B&6*ĉ3?8x`8/nЅAmG[+;U12[Zj_r~Ye6,n7nWqX||?s{@Q *{~;[jm/B'vUֶSA61퓯Тgkyخ]Ly޷1Ǽ^N3?о EhڟC4wI*I A)K?<7LGuGNsɽ4'Hh+m|ƔiLI%' "D  YTH ;IKЩ'LW NU hs]O X\Eb?aAڬ rq>r_$E5&= D׎rg4ZEDӾ؁tՎ0I z:+|"vetf.z{m%\sgwSe\$ۼ 8" N{<3+ri]2l;h|9J.fL,IWCE51N=Qeml>OJ%fik褻G1ۅN 7eڏ=LJ睟.= V,-}$.A +n{H_-Q|uz^Ԉit3S I 8T3Tޞ,V7pdGP dN;Yj'ҍ|ԌͶV J6rssFv_aIf]28n1NEp)vq6JE㩇zLE$ `*{ @I wg} a)8D @)s@SH2Efd0*6ibƒǻB"@Fw& @( Y)gYl(0{Y`mp$IUfEoux GmF dč`A;MlC'"j|5gDadnpƅ@1BvMilgB nV4UPrfFwcz$i㐨u!뺂n[Mv0bUen<6ݲva(Ğ AXew>s.Opy)>qO?`rdcij LWJNxJ W-Eo7:8RAPQ`}8w1ǙOZ h),9`# _i'wHxeJ,3KPa&E ;^-` JX{iz_b[ CgP{CCB y?lS|W` 8*D69#Q4u9R~:#.GJ_]ɳ C)`{*Z_SoʱڦMpUΛ8 `? }fq n;̟*H)zf׻av;䧰G|d&7ë> stream xZ[o8~ϯ`jWQ ͭlI2Ӈ`!K-=lIqL.;-C\?Ӏww^(I08%Q- γwS͒hdbZq7j_k(kmw"&Bc#j  ƜDL8C̀X(9ʛKjǸDbU)ڵsFEԭSn]ZMI ]px.ݵ0H, o5 n:}誣o; ҀS 䊰XLiBa?\Cv G Ԡ5 "F!ʋoja\pMG>QQd:|+r4!z/g~A4Imw@:e>G*_8;JF"xDG!l/31p gVN,,9:9~"*i4sOr9q'tÉT1^ԓyܲE~M^AU9wL"[MYݡd蜺iN3:YԞ;U^^K)m6 [!^+i:bvZvA/'yc9%wm}vѿvtz*Cwq|zuz,)iR7"l.)jl}T`zuN:AS1w!AP \u*hYԮ9%&=X ._.;d%NJRv)GxSSuh{Vpb.[rBd{l,0"Y$)3Kx3( E=+3דUsݷ3:16y\emHMףۜ3b\~%3Ne.Ť69#nw/AVxz$Y$@siү،0h`9'p[b9,OɌvj|gV"`TО|Ys?6##@Ewx߁rT.+LP58UkGpl̀2d5ңݿx:q}<𴇲1c UN>O¸GNB:T4)?ρ^;lY9 $.=UB3 j"^PlPh=޳(I YRFw÷efg@=1+F(S{H𪘵&j<g%jm`^}yY]ԕP.\Է;&w8h_pۧ& BUd@Xi+ATMT}ot(!5I>ՏI ҡ^Hg .#)QJ U.,#h.dU9pJu | ށJE7}.C˶. |Ye\D (;[q5P&BWm.6xXRT b9| r$Ux7P-mօ'$߫oc36^,7Nfp];~ ʣ[<1-}lB PLfBǙBOϰ:Y|ǘݿ-0ńTGiktymrĔ EQ2lPBj~/u ,F%hvO岞if&kw #g7ɶG, 'PF1&Jg<OͶ= Qf"ꖾ{٢\3KfKsx`;9[0֊r-cc1`r"X=K7VkwqkИ'{>@۞}d-|Csb ͮyXŌ'ީf|KuQ5/()bFW{O=9I1&E9abm`!nyos*i ,cpWy TCnat,qJ/@u`Z,DqZGkwd gf_!5~k8v/|"H ,yK%f1աZcQZbbD't<(*U_ŗ|u]7iLe. /X #uFDm9s2 ttO٠弨ߤ8g[ϰ=--ɾ<{х íUKd %z_uo[~=p4 ~kU_ӐwBbZkV\ܶ>3(ȚE4?52|X˥sI#,Q+cI/z܎ J(;ޟ 8]?IL3yomlHHi!UXEDR49 endstream endobj 315 0 obj << /Length 2010 /Filter /FlateDecode >> stream xZ[o6~ϯ=X~)v!+EmJr;ȶd-YG49| NV N^|{zs29]&#i8At?M]TVy(U;{s ad8!2*O?Wߝ=!'KfI>qtN"F%qDN,O~P)7KD!#0uE0EFDjuNq/gsLfn9_bV T \s k"%̞+  tJ)3ENqQ35yڷE-P7` ?$t7e)RMŚV:v`4rh EA 1$&xگ]u:ݕ5!{:(0%Yus?-EBX 8RZXl{O%HP{ < JΖכMqltUφUPijP;Qiΐ~J}8I|sÁ^l1S Km׃`s\xm28Nyf= L$Bjf' |L넯I7O,mHp#"vI7 SZA$WLU`pĸ S$ 1dn/2Ct'19x mХQvZj# zυR)d$"GV1>/z :-h>#95{H0HQ97X\mm.N h{+gC ہ?M2`:aZ#u'AS(c,y1c`Nh*KwCDWat"HS%,+:C# x*aI_;ȺH p(()ծɜ?3|Rp+NpEh;臯_= {udEbm.Ћp7*,,Bv C> ?] @ɸ18m",̇Hxh0cPh/XJOEXxjwQU7 `<(zӇ ]0NqE9潁0 ԇ %0O%G0ųO8(V髆b 91NK]kGre3byo>VBV|o&u&]ìIټ +D(NsueE 3licІA M p(ei`nUζ=+:f}>\gR#0CETj2rn8-#;7VH>pуMݭtXTt:g[ R;Ti@2Qy +ezj^ c! : e]$̓ʢ8–{o\luhwP! z #Uh[4DgD {H.h>.#ApF(6=6?d⯷.[d]fYW!C?'xҼXeM||XxL.k8 OݟQy2?_.7?mzBQuvu?G`X3\*A<7nx endstream endobj 319 0 obj << /Length 1831 /Filter /FlateDecode >> stream xZYoF~K 6{AE 4(hJLR9rII.6^=8{ # .&Hk(N7<·_|-Ctlb3pBd`_8>#@cUh~f9P;q09{w(ma)(dVXSdH /E bp|0dptۡ$4B% &F0P?2Rx0ZKCB% "kGB -d)oR cl?LM>:LTS G.eUa+}+UC%#-.V-"ړ$-i?s[ m5.)f7on.ٰYn.<7پy~6-uNN#=`r ugs7R\"%$if-$0Ř}SFO,^N*1KjVK8e5OCE2]-EɊBB,հS#j)SgOcZTpRny:WXǙ(KIʩ%\0g5Xԓ׹'!Bz+L[W8ިy}USDQgO5iޛOO #%d<%5.M928Je,&*v,8- *bfi A1 IX"L3KQ{2,IQjUh%]gV_/9t͔y S׊Ӿ|qC Hj a-#{'`hNE[HսSi뵓]J)SE)] Ф*)n0@d-Pea$;'y<*g[v߰U`3} ,شeX-(߯Ԓ%ifm &sg{lXI:x^Eɡ$}8>0&{_.x?>&d@Xfu;F'^cM;VU;Rގ ohjj#۱C(i[_gdA\Tk|*|)k$<wX$=70;HA΀6߸}fMnFn؇zFd^2Z]RT 仁z})4xRsݡ'jV6$x*L * endstream endobj 323 0 obj << /Length 1936 /Filter /FlateDecode >> stream xZo6_ %ECYڗv9rj9Y Q$Iq>:M1y;C$˭[w, Tv0$%@#Š`}bV &wp>Vz- Qbc*?W`C4cJ1Ά[~^$+b.o!ۺ*J ^W#e] E!?ve#gL+"#Ff^mTV櫽R;))d~=QF܏scF 2Ɍ 7]Jx e-4+@k#ӽjePpΑQg?|G.eUӓe&U<HjM6G[j3F\ LɊ`ťx-+/ 4)Ȓãe 瀻4igQe^MG2>_.(  j,Ӳ?^ &X|;[@ڋ#jT#/yU8J"c v͘1j>*nE0KFs,.3n 4 aʕvzN)[4TֿX!lBGG nNcw#w>LjӅLa>`2?brzͅ@ F+A ۰vI&I9` CvDz5D3 1.”G L[_?;a9 Tp 1 Y :L&4 }Y0mθ&"KY " ]+~QGʄ,3M1\p ?R&RᢎL9 P2Bwk^P"3v6ldhb-H"dit% Gjp*V L}6Lџfw ᪓d="<=(2nUN^>{&f!sL'IkK:9cGL\UDNz`@1RD܆k'n~OXO0-J?C+ZQ]kxpg?ߠgցRa~ރ똉m>hѧfYeT<;=+V+I>U屫 &ǙIz_k&~cRIӽ3JC4iy4wjse8;n;~b[}ʙf&>QH͇G C eufʙPy~fհ/39J*nLն+5F!YX˵-1~ %|^Ͳ!jq'XӪ>qxcO\5?vx_`ey8s- vejbó#Vu7hBl XtTGűL+3t&>m?M0 XXonQ5i(4g&95| 'M:qF:G8e(Sv9|_'|.+\ GNz-P7 endstream endobj 327 0 obj << /Length 1812 /Filter /FlateDecode >> stream xZYoF~K6;wQh$EQM% ZmPTYR")+m)6˽fvofVe“G/Ύ6qiE8#I'qap9+x|T'oG<ę:em]w<;tD'50M2q3qYrqLeetbS`zjf z~<,抿/eh81SKfNy~Z/&Dk;KC1l̀&h^ ]Jx2Dɜ$ <9 !Ņo堺@:\,<Н-T٤l]?ALD[I䤇܅`*mEyj̊W-&h2`f WFyx^_&Uf"v!jLŨ̫ǡIA)z@ Oc[GouQZ'ݨծ;2m@(*R"&'C<Tu%՝ڏ|A5 B$||A(ѓTDLF2u.`w"Dht'%P|ܩqo2PEr׻nLPn0@-JrCo<)Q5|ʣpW}"gwWmIJMH͔ w; D{BWr7C+EqLYsSHGg ՁXf ;ߑ>HB׈d{ LͺBs躀tꂶ)FBAveJ]Mah}b)h&OtAI{Qflw/$2f@V-b>ȋ?S?St+"0Ȑ[.2LYF$74`QL> _?e EzhTU1c"%3;Uy_ӆyȁPKΚ(cd4\Nt `׭>-[Ӫl6U@#> {_ "|Q^PAya U*ƒ}QbUYsG#U8p_Rȕ{Ld({xlT ~R] F #ֽ@|vly]|C 7~FFԔdntc6(*;gJR/{8VBzQRJt:Pp@{p]R(u *BhC)[m=v@(CbE7v^Eݭf$&qu:h`]{?'̸́@"傻 endstream endobj 331 0 obj << /Length 2734 /Filter /FlateDecode >> stream x[o8_!^ll巤]]=, ,>AqhGw䵔oCɖ$Mj}ͯ 3@l{k*d*)OH>'O_L;_ b<4}՗KfY!<{)Cw1!0R-8C=4!kiE b7 A-.d] |YSG+:N?tAE b V<̹/_/U^W/8vo6Vr)1Τ~p~@#)JXjxcHPPPOc7V=Q;IG0\_&{egw\R[WpZ8`1?i z v U +h6epH'~{'qAҨ )ĀZhvгv1zR\1HҎ*` X$,L}"H/TǁWAz*.lEGle~-Jl! r-*ࣥ @1:^\]BKtiLOr`l/gO$BV1K=mfPOY“n. d|;V`bXuiNn(EIp֤Cl,諤2-ag235-˂ΒߕYD$܎7oT=\ܙ_nAlZ 1X|-~ /R"' r L|$C^+ƹl$a`N0j18Z=zt@͹~BR tP`:D$2"mPv )QStV!~5i#}4Esk%iC6ό%x3MUx0 G9AH Q ї:|IB,:H-;gx# iѹ樹[F2$×Zq-ay3m[5jPPGP[-因kIjiBҫ]B!MhRY}kL|Cjro^fg]HҤ׽%| W+{LMWjПyEY|1E_%: D7 CznIJ  40RTx+E %gf]sFˍg:,]\q##hphQ$ AA}cC!<4g8mdxsvKU|V>_8|;c-@~[|T>B[IX߅d„@ endstream endobj 335 0 obj << /Length 1352 /Filter /FlateDecode >> stream xXn8}W}YX ] -6KZ,vV*)i;ȑl'u}p(Ù#4Gq8zVT1gHl CZP,Rhev6I6c̫i7/Hz=d(BȧeNι43@^W, f]7tfR[?k;}Q !XhTJ pQ55->Fk͑Ʃ$y-%V)~^0F#F )&4ՈZee?\0XH|=IaΑ!=HB8G?^/&=U{$eHҝc$Rc!).Iֳ(Lu55{֢(M9GKX2Fl`ͦjVb+v/Nb%۞<'=ɧ _эX1$46^v^\m}=>z1p[YQMU}?1#nm^xv@"R ~dL(NsfWO=ɽ]Q)e1i!$dҿ fYhjd=[&4 L F f8@T׆^5 m^8ku-~.%j^ˢ uwo?jZP}0F'D4X8|ym^3YYa`\Zqo9}uxi&mV rԺDYEDa:ߋNKBm6,<_,P j6klkץ+GR`Zk4rXvn^#ΠTnY͋<+_=ߒm'MI ׻J$G'ŵ 6CCCț $1,¨ؐ^<% C >?Tq l<\Gw#sx5B)^4 Ea- Hw9 J ,UQ坑@hhyw*$/4ņtCu9ޘuWW(Wi,%DAJ/] endstream endobj 340 0 obj << /Length 2810 /Filter /FlateDecode >> stream x[KoFW~frŮ6 %Q !%~3$G3J`誯{xvg8ˏg+mvqμӂ頳U&C]wB:We7WOg< YBl^eOU~8L<zs-oϰ\KDpQ[m_]WNe%JHLje$fuQܞ/ 2*XE KKlps{^Ey%6ő)pBX)ksN蔔>8 /5%ZOpν&;áNBÍwu;G<^ֆL8&2+ڬ@Ԍ"eG᭔[ˊ uʛ0B. HVnm%6xg+ nklM1To (ACLJGLyJknr!]]ۼtն| dV}M#~Je5%?F;\M4A0?\T:%UJ`ݶܴm}Qj2%ŋ^ Z.}G6|\x( .;[,実#`e:]Rw}X:T9jO;L~AX A6hJ&a㙒;-@haS{ caKulL+@x&cDYQ}s;ID'% z"$ s$9Rp ^"s5Q1LSJg4>AC5E;l8GPH죟Ek5IjH4)61MgFSIu*(C<51V'pͱf 8d\,cuDdmTu,t?r:&avz aE`FyC2o&]#41LAEU ׊hT,zb/X][l8= rn :~Dь_ )IiF$^𕄃R8[wR A1=3:|ryqJ&hNcΧ4h S*3!s߁l{=ϑp8Mq9W̓҂bX`;9mq88ş-O<Xv6ׂYvteii9y M}Ej iGYapk>ֆ nѵ vfAu;u}Dx#voCj2KXGM+] ySb_'qIto!C6"t`)h!$=Bl< +ՑBC /j卂JTf>yxCqU㓡yis v$O'ȩf<*C1wxpOGeK=2sl0>)0e!+ϫO=$'9s߂jW-EVZMÄt*85b/*IO߾,0Z7aav͗3tfѣ4HT5dyhMZ6b3T(VZΨ`F>%i1N.m|Hۦswm\*’} ࣼzyM}rjtËzi/4°f]]vQ+lMT1 *ƫ cӒd}uQrM}C-( {X&WFR ږ= LzH[ʲ~jHG(xaK'㼲OP`!m -Fn7m2]vr ؁aVN 2$źJsR^T KuR .ߘruoZ*[٤ϘhL Pv&ʘz22)yTFƦ}K *y[_v,יVN82yc\<q,5mGr]_mo0lS3zghè=[cMc!ɳb;u*!Tt>Pxڪtj{ήK 2{'?̐`Y+ Ն uNj0Q/aDِНчҺ.hS=qs@L?Mkv{tOڶ~q`f4t:zE( endstream endobj 244 0 obj << /Type /ObjStm /N 100 /First 887 /Length 2196 /Filter /FlateDecode >> stream xZo ~߿BOC5)R"?4@ Ihqqn/}?NZ7kOm>RGR!J2WB(`PJ)A0[ȹ@2Q\beÓDx ^Ax5 $7\33F S`ȧP>\'l"Nj C1Ɂl>!^U!,X\ \ڌBr(ŗT7b&,⥖dG$; uvr2^}8݃bu/ޮ?_,~u旯fz{=z-of݋:ΔIhM}&{NNB2tO{[ɋ"Ï?wMl Q""WoK̓hCb"NcI#ԡê3 *l<ͣ6L2 0b<k]ȡFUzO{h*B" McaDs4-ӈF@ =H B&Bkd$DhSyNl +"<^A$}0N( JDv;"9{  2F;.Di"g;ݐ5#(j[i696Uq![cWKE(>Ç7{Ey#Ne,^''盧8%p#6DLLP7u/g/$t? ݫfY f?Z^]W=2wqpk-ϺO/W?txz9_} ݳ[agOf+hUEHf^lZڡ_r2 r: r6 6}E^zF~罛wNNtz^v?x߽_?V?󸘯lqZVO`+>W8I Z-J:(%l>=5$Q5r8(R4&k(+ ;6QWPBκEMk6}dPŢܓeE ϨF4 S(~;^HxW"ϟSױDw4KvPQ+Vocu`ļs /zD, I\GNlH_Q;*qEϞTXl.I.CChKĆ[EHXco4͞/ ͹qL͏k5voOi(RMDN/q *Ld& 0T^%An9`d-s BV# ~rE:)b<^Uwv~_r&AtVb/h_i+bO-l,.|u2,bttB\j ^%? DwN$q)GC2j^o'{O׷A|w3M,p)vrB?Y3jZchWx,i,dI+B}=:nk9;(.NcE4ŷDjԘilj~v3Jk>c}C?lrrTxnI㩃|L9bڎ)јnn0U紣~݌f Bm|F'H_5* ~+eq=*m5.م endstream endobj 345 0 obj << /Length 1981 /Filter /FlateDecode >> stream xZYF~_AxA`'AƓ;8TKW"eǧHXMv7i8wϹN 2|qÓi:,$J*iY͛?% {d\#Ixk6$0z0n_v-utqJxZǟe)1xoɫؔ6pdDc>C7= a M0XhW%RL9531AF@PkQAO'fLWkzv~Y0`~’bu&Ammow;%I5vGzp#TPz/WR$ȕdgb!"wnJAKމ>(3aH0UAO"'b gUWa;M9 ʗOǓ1.mM,$6ܴ { MH] &IXmUA6,L@$>ؑ2#Lj#⋇] _₣BF#.qA0JLj<ΫrQ1OCXP(kPp&KBq ֍d(lie) PaMv%.T vF nƕB S/u% WCБ`+b6ec8PkG$ ؗ"B \ HA*y0SZ% rSʇG8h(fY ǻ$ތbHJ*Ru!HrWo/Aay۸~̍fwa* !Tk$b]WW_ݴآB]ok0p:b:^<]je6M(/Z_ ze$"3   h0D=AGͮzqWsۼ,vk-)yZgwo:篡 ЃqH\iq6Acy(ՙ˽-k<kbax\˜\^nK)lYDF CS4}ق2BK1 mPM^gą42w5;@E P:rt_@\̺w Wf0$s 1P"Gٮ.b7.{x WUx³n8/: lg+"a]՗8t$%@H[k'VCq{# _ۨCP-&U9wn?Un>X/5XUQ/{{/ӷU EAM6" (l9ó~ N c5vF2\b_m>ۼrpV ?﩯|e.Em&cPN  MyHO+۪+#&Pcߟ-xP"wyv=(h@rf:J *4QbqCI!`*Ug_ mh){~=Sjƅd"kF݅n5w65&5d]bdB5nGɸѕc-SM%]nvt)u) ;eƺRrr-]=R~̦Kƍߡ%"\6^:f~&yWoNiao&7\V4XBGd4B?\UE9+s[+|x}e?uY2v47Owws5E)GD *9(2 endstream endobj 350 0 obj << /Length 1981 /Filter /FlateDecode >> stream xZ[o6~ϯK9/Z` ðb[[I4زg)Q$m]6i4i|2O'/Ny)m\ggZɈt2;go&E>rc'E5[>}w Q$c:lߣ?N=a K3 "l<˒+œɌ%FlSd')]U^UNT^3zdq#֘v]cu6Cu_t$bd z: # %Fӄ aR+(1NY4!3aj&nPTȰʠzlZdƺ8唩\и(E/Zi<0O"<]y*13{S'=%q,^6R7]x#G%w'\"INLV~ EwYEffñeGVF&+wvz8RORYi+mMX0Óv~drZWM<_oK?UBEq4gr<H jOR}?@g>$0@]~[5Ep o ߼*/}Of}QmqMn3_)JrcerB6%C| cxFX6[]W=/CzFB!Y$Hj=P" 1!ETM_u~0+ ")­HWZY62_\6=.J5Z͋ֈ-ϺM=[ˢy wuU(.Obq$#; ObMoXKĩ&o@\)4&!VݦQX" .6,kjԮ]J2mKW-jQ.Y>D:g[F8鶌bN㵌Yl#_|ҍipmsN6 t#J{o7a}On}OT m}M')QmT߯ 1J?D#-܁΄#'FiG] 7%%a0)N=6y}O1k>kcD\vGے={'}ahTWѽJQjc=WU҂z'ђnxbI..t *ID,yF}'Ø ̴#;xa7#>d^%'1N;9+C4c`"Bzk^`WZgD|R=c{aQE͆ jvZR[Rtu.iwTΰC*tˤ|!pJ̙qh3&ιϽÜRߵLOXGQu!6|(;vaz/tV]z!Issp;+0д0OEyy>H׼| C)xfL9i˪_EEfo~UQ^j}IB1wXtK֣.aOO]L Gi6 b ocj`> stream x][6~_!I"<nCMfч$X8yFSj{sHJdg&HHD%|u.$&#Ns\E<1druIo$Ʀj.V7ɻ]Pu$IJUhjL˟%L!5G!h)FcEx%o2L>(s,Ygf/O8M9\~3-uzTaUo'l 0u #NΉ`!>KjLrdLP׉^O?\BKΥ/'ZAi+M}/B+l>zO_zh"L'%xW_0Џ&,J)U&Fdm{d~Eo@X5ZZb 0҂Pf*ݓF%׺eg*CQ]j" ߥTr Tm0XٓFУv飉bnPKmS+k_$G$e0z~-$q։K"I'蒛JGuSCO(I8ewiud`$oW:K߂ird& }}Xq3JJRNˀˀ\?{.Tp.>䱝߱Ge¥dYjӫ"9BKbЄJοyt^A yUItYģmqs"Ks{0z޺o(nV|=Ğt_nͧpv"&0S1jxb;]fbtjK@-U_*;fE,no߆<>ˎ&VBh/bY@SR~;ԐȔ/6y Yū}e̥Cp 8ƀe*Typ+Wr(߅@fu d.yR+Dx)'^W,}`"fD=У2PȅC+_ <~U~4^kN{fTw/ O c(bNelDHa@\~(8-#Jf f9X^cIRҍ>8LnizKFq #__-j)}_qHWl7 l7g4]B+7r@Mɨ"<ɲ_γny9Ͳr1! _Ӕc2P8ꤌ%;u{ap%YV@L}nG+XeYĒASZ5ϪeT%,L5 ]m M5eQRZ/cAQr*lbjR3ZX HJK9] |J_b6N)NQe6o5{{ֱf2 5A"!JX H}ú WD5޼5\,H룿u {Mq9G8-X!T'^/j~$ @P[Lj*8 pdު~ '$X׶:A >`~N B^v_a(lHÌ=*6̼O8 $'P#'8M)&,PQaUi A+iAqGMȲɚ0rqd>z]10Q w?cJAPG&DFNڤ%V=Ti=k.5S׈n0()=F\vAGb*0CB \0ca uzP*3(*FZE%eB,/'(pRR%38 K O%Xt׸85 ,v)1ц3po<&FbGbwS\PbyGӔ(kk4+ڝ a9@\@cQ7tWGհT87۩k= jPKT!T7Ew/CV{zH%)ae2L..>)L'”YgW+ kZ_ݓtaףL71@a^~OzjOc['>?WT 9U bz$#m=Ku}%[eL0e>$~#%B@{RvDs=U!_q#ofWO\¼mA#iTbZk}u &T'Z >œɔ'V x(<7f@#_0SuMXM16=F@Ĥ⌅%B@[քi7 q>lЁ DzgbW,V,ÜURۙ=v_2 oqÊ=%U5}Fp[T5pT2T rӌ+FC˄ wt_S>[bqkf wJ8T~uxҠ2e m߿mlXwH*j t)˫h142P!TZnƋK'GۑmMs+o:ʡß=M*Wʌ6B|{qwB~۷$~րg¯ z@SS=woZEP0-E(P| endstream endobj 358 0 obj << /Length 2225 /Filter /FlateDecode >> stream xZoFh( 's'h EH/~pF2[TE*?~HJ\v GGg_^=|H#-(Mi8A\j]?6"ؔjz3*)H4JxRLgq4g3jy\ɛ,aǻ}^`aaHlFbk; FOYAׁTH}9@x f8fc} iN*:ȷ\qFuqD3 CXh> DAJ=-~:VSwR4CFQ7߹kq+JUXG*`|^\z}|5_?ys|Ss{ `DΛXpFH S{Ao:or[T`Jp KF0Dm goε:pz+[ah>Nf]w(j8~$K8I} 䫛0Mͫ Ci)o30lG s) " *<|t_X#Zׄk&+JN'N2E[`e;yAR*q y8.U#S#j!4|uєH!`)@޴1FڰS@@Hl{oA~u]}k ƭ\ïWq>lL߁a!r!zy0D PVm&2J pkOo]ѲETb㮁ϸlҮp?N%\?T-ἁ/NcJט h5(5/\ѕ(.LQ͸L9L h6Y^:}٨aRfDـY2n&Ă~\0C}X 9'g)@ls2U'9Lv+C}j1[yM}աJxB3o_k|0u~T|YV/yVɉՎ;XZ>ax>ՏHu-Gfp87鴀)DGqbkګ6\zuJ/(ez;JW3"3*lCHmmyP-~ȸnlKya5 2dqB ܧ@eLӗ1M+a+ $QL1RcSc/8-m߄@u^Znw^槝پ:o{9fQw/ҞlTvLeHwPs~oJ1R͛p ,Aۼ5.9 Z։09g,dEI)dTm0%u+66`[;Q Aw^4⚼/a$c47Tr@L$䟐ٷ endstream endobj 362 0 obj << /Length 1872 /Filter /FlateDecode >> stream xZݏ6 /Q%{X Ea(ֵ-_xHqߏv]C ZD$*ɫgg_ Xb2+IasVp b\Nj9t =~ "! C e~ei8LK,*C׾gғy9ԚVWɾW^,+SImf~^wP0@L,% .P^uRe;1&VRps@idDYW:sEtfP~@Y>rHbQb ̲t0b9E0 c9axʔ6D ;m@J< xUg_/_ ~4A[b؂,tD0̈Z셇X+LU0;|U6gFIs%EkO\ex:/fi= {%CB-Nof1U6Ou?p^$[f̓bzۜt-7(],V~|3Vbyچ%% al7ĭfyVY3fkvQgi8I7[W=^BQPɗisZ-  Eh ܱxXi0S)p&*j + c/k$c"p2P5"RC|iCqJ}v>bpx$H`k''?]j ?pXSg"`~77[ET¥]6^zKش/=G_z ֨s*ZߣJq,T`{kOP k{%oiڐ#1R༟4#ĉ0l76M$%nDmZ]km75k_[} ڎVDj*g;z" K[` )>M\lEDk/ rIr'(\9bB|" bޭ)> stream xZYoH~>ȀdD,h9# I%`VKq죮il,.^./_(I $x%#2rM!-wru4IUmun +MZjRD`)%T0K.ĕfDA0DYij9K$a:(ᙡEp7<5 GL -r&%klWuq)$]rHV?'۴.]T:D$Nȯ{&s"n,Kx 'C:js.]VնUl쳥>~H]rK- 2cY紴K)ޘE>z+z5&f<3Ib4Pvɼ5/AEMׯ"PXm(M [PM6J*Ka$P?ں2A]Cںٸ= i4KFVGcا}3=\4~ ́_1&hG@Ǯ2N&JQ1a'yѐD`e;Zɮr;LJl`(궧YnovKJƃMAq\ -x:;6bL,;!\m棞KcFU5βYF`ԾY^ihL7-.U ǎ ڥE1=%6 #BB0y؂=_֦,eSlcn8 Ye 68U1+L0 99JV`K?hpYA70D¶+4"mHLUN^ #"#j{/Փ ׀"|`imp:WUG7kKcNmJ3+ xyv}KbTț-?'z_#+-k=),AvY=’pDάaCvc*>MY5})k|,hY` 8ܾ(;{s3@&̏W´|q@O$wz87e츁*y]>ʮkzXY C Ei 0>> stream x[s6_-"S`G8:mh4RpJec Vd%h ɩN9x ,YRNR5sRA"  ^*+m@T~bDACI.`˘[>]5=dO](d̛yr_]4W|Y[[OutL%Lb3#bYf Ui"@mP6{” `\dEND=V<|1i{a ~+Ը5[~B{@NR;IN}]Ohol{\: t+ĈXoLDe=mU+R wo4x&SŒr((R¼öXIi<bo@Յ%=9GdȂj66VUnwÕS\D0wF^tBf5pL4s{y>=a$,QiT K}(&|2-n ԡ 7#e"x,C|SJk\0UY].~CJժyB r܂l>(G,B;ThhJ4v&uSy8jDt&W>[%tO9 8rŁ(_x$9.}&H[0Ubb߳f8(2м(F 'ҽs_MC)pDC6_. 2fR>U9:Gq b6ܽon.rG$}iv@!oC?M06uS^/E鸒-+=(
> stream xZ[s۸~[驅ōi:ӝI{:}f:DYʔM;HıC_L\̣ˈG?|q+Fˌ42J8KSY-tt?Qt&m|(?Ox8L a鷾--ˋ<XfW'4eDf#0U䗯%r(+k"˲KUȤ$,3JEzV9,V2 KPq D|}7WΓ///?\]'|n}&bRIl`:94\ƴH~Jf@Y b6Ogf Q]Tͪ3EAD.L^ c'ʂ̋eQƛۢ-NE-f bjuyݎ+-U]yo\z]mJ uE7/VH46 JI3SI{!:Al./*_{0/Rusmun{ w1[PmɎ2,Xg)Be1{̳uE([^ Ӥ0N?)|PHOwɓ7k=Tܔ;|lxU?=6c{ܹkZƓ&?M8Mw:Pn&߻}݂NHybUiM[.PQ]u;尌I|}`R{*z[YIzc[* ;lm2pӋ0&U:+C=҇ ʵd G~Kdf٪ڡvb-MEh3 Y>uE6+OvDN$;"`bv BX~ }ts֞wcow10$ӳ.o4rpS&ʹ7s)?2x4e*߸.~ \G}1^[κ+\mY[0; QU)>B ݵANo~vpRxjP>؞;WƉ@#5}?G$< r*(_E endstream endobj 387 0 obj << /Length 2301 /Filter /FlateDecode >> stream xZ_oܸCӢYIQT4C8p> EwF䕼iιC%Cjf8!l:/Md"Kt\\ik0 .2|Zk)ڲj6?Τ_:;Xh`mRJŋ\4lOZGаuذaZjV*n횒;3h |/JâT3j#ff!b~ƹr\mhҠZ)1kwlԣXQv׮h}eXIfL˫Ε^m< c7+&uVT$tO7[/l=w4lGB+2T,MWg d0VDIgH7:*A ٠sϏ0lX_jt,Z ʐEl։U]b:Q"/ayO[5lbF۹gvX3'%h+G > kA^z7_VW)iMDlO#[Eb쉺e)UbJe"!yTR).'T X_%+^)Y~Q/<^m_rdV2:ę?Ởa `4 d鋮 ? 8ˋ-O) с"@ӧc/B4_Mu̓į G|2]~2_KO=cTBZeIwFqN*>?ŔQ/FQj 7U9lha2{zE)hB'SI >P]}s#D6"b>3BNbơ$I'Pk$ޒ$OC>OگojGAIOQ סv4236 r|V[p)ߚaz[֯^pV2ዚNze1,%+vs%1889[0), nzx/0=}5Bޢ=fT2fA3^zZ;o\Ss ^'2J5|^d:x,]>|wDG2H\O[l4kS1kFų3/җg^3oϽݸS4"M5 σa𗽿u)m|L]m 17ӃLpK[9{>6~vyӓPmP$jWWu/c;}nWbv5G~ d[~wl+_HH:wh!Ѓylf‹k¼gN_wi?q쵀v}}o&mo>ˆ|<<žmT矎 -ߡ?F `'ٳP"GԂ E)C{cklh ۖwcˍ-*/΅Vt̅y 6ަk;)gN[^@x70 8L#SopXXe#y]ƫJ!IcieՁ3w<&NI( Z 9Ij#@'j]j7|F nW nJL& I".L1gR0kHz|-%L]d IƈӶk;0-n!8W1l \ӀCȘIHM:;`<> C0c=xӸ1^kFlP dIįNs ,<xMpENдdX/S#5wނdT׹bS.f1Hv= :OG߯cɮ)(B* -*I~A.V'G>cϣPHPPC)=ԬS U]s@Ѡx/ N-8}e㈈U?>.a&L$bl K endstream endobj 391 0 obj << /Length 2116 /Filter /FlateDecode >> stream xY[s۸~` rӮwnę}p<J,6TlOg{)Rm{y;ܻы*D2.^YKO+Twd>oPJ Pr`CWQN ?Pl\ɯg&rgs;knmTXGDW6g,۸0d؀BA@Y1ǸD09& Lc3ފ#iHyغݪ1 Vlt)V)rIZN,x=BmFTȌkS,B;-,f˅qhhȾ6<#9nę֒V="l |]Q].3Ps'cKNo:i3_#GƯ >Ku"amLe3,`b9妸nVP}2i*Ђ{m<-nw:鈅:-[&b{=UCye;f?x{c/+'**q#UJ9-5nCC}u_:lv!}ux ]ryi#bU2z ı連奣}龚l#zM##g0SN(|/'m+5o,i6ѤGv+'b^ߙ1(4|M=O9YH|7k.aqQ2>S S|<χ࿔*X c >x endstream endobj 395 0 obj << /Length 1426 /Filter /FlateDecode >> stream xڽYmo6_`1w2tݚ[vmeŠtAIiS eQuII={x'*ѯg4$|1G"@%UfxY1O#A )B<>˫h}|t3BZ-/F`Bjd)fIјJDTh1s_mc  XG<@뻣)N>=r'i>weZWn(J72cRU'{Ue*`̬OjYR7ma.RA D̵ͼ.jM@/z/Ƞs&WX*g˓ވvjՑ2-WRi[!SHd|Ե*C;ARg XzH'H~\ Ba>_*bhA(PZv--vkɺPvy,BPO.ov&/ K `1E^OޟeK!n:j~!ykk̬9lX3oB#X 8eB_cu{v#Aѱ gr):IGtD{6R؀k4؍n(U+S=m* b.m3mK1*G  &!o w\&˹*FȫVW|eę"Chh̆ Dq} 834EΏy޺cÀj;0ۗ}rl[C)E}IK6WS/.yP@1 01hӹSs$fez]\|%Ɇzk|G܇ T O5~wu)j9g~QVC3Uc8ZTh[,׍g~3(ӐcLuec#.bP}06p|@4i .?wַX׊H ۟5:C *ݜYRN=.+{1֡%k{qåøHt]b3]KJ3 \0\?3dڹs$і#S;֪ȤPD҉t`z}"]6ÝqcRϨ2ƮȞ[ABrce dR.uoިξ&%q#JSk eQ-m.R9SD~{_L z~0EjⲤ:_R`8C/}!ɪ,j7> stream xYs5_q/8C,fi C0[M; J.6MխծvەLf/N|\&LQb-όdD:Mf_Z17vi9[7'4 9w)ųRB~;0d86z]ojyӶҀ|)|ʟQ7~A:o _wxԊ|>#c)hҮ# 5Ð5-뼘E+1c)N,@!8,&eSe5"+tdvF9G4W@7"_ۭ+MkT)W {)$&l 8mv@qAca4ΣZEj?׾ fiB 1SEo)휎+Qn$zQn4D B6+2:H@h]*5e"N2!nc]/sֳ iZPVl6] g2mp<|6?}Bљ]x gք8aq<kG0R_ U/Hbv!슩6_Q_ 4obc>G0mr qy7Es+{ne+8[ob}t-kGVV˲HJvrvv%~FScPːi㔧":m#>l嘅=9e*`)<ŹŹGjeVk'_!s 릂6k?CnI,WMbTyQO妩:ArIi@.`acbxNEX2(C#$T#%1VOIh~If;c gٍꤩ],`\\@ y <ۿaa #:ٯ<8i4>#XVF8PFc(OT$*UDM6QVR;bmqu`d߽*pkb+6pHAUJUZ-AWfxd krtWB&&61 AH_8}F~#yX0B]1}^,f ?B:`3%d1|EdVu[ ![ A{Ԗp]i.NJ6>켃,\Qg!v8-!X*Z0,\/b>m}4DFCXЊ"''7o|%3pYy8gGQYg%Ͽn**NȠ1ݵqG@ʀ0+T0 u s ma]j Ƀn 2nͅVoTFj8wI:IOS(BF:CzyH{2ےq]֔P3ffO۞g򪇌xVß;qEk-|mk_(߿~${M n,=2: &uSnػMhr>OWFWP-v"dip0"U^\?Y endstream endobj 404 0 obj << /Length 2489 /Filter /FlateDecode >> stream x[moܸ_!_@W44w1 yWko|ΐVҮ㭭mq7q83CFޟ, OE(1GZ2"E|5+Wdʵ|V̗u5<񄆉,ţ4P''S!D\dPf0o*2^V1/a}vi+K᳼3zw~ hY$x4=vaVG"!ʨ̢?>$*QV DK"|3&ǫ,o>SE/ ,Hu5+nk?ڰFa_(PJ42 \K6Jڗl@} }(N~]?bI1ILjA! Kքe)SZ߯׹yXKe6f,WaL1[F4ffwuqpj8%Bo{$>}$\}XApLɞX V3P-_:^@9궨B[-gAxip #o/& ɯKR5<{´sqI9k74ZE tsooyVഋǷi/Yz%#P0;ـ\(gS N~\f3JeyC?r4@ƿN/X.ڃYU7G;3]~.ARܵ넦bMV~Ƞ7 Kw`]H1[`HJ>!ahǝ{_NsM(3F(МM04/ q˷EK0 +_tBaev BE d\rݵP:jX*UM ˃B И7213XbLa O ,>NL88qpp}'Ek W +ZiPg?Y]8,ǐi!@**Gⴲ[X0#gQXO$=qhh@\t(1g4_$&`ɒD=$P}~E+:O:u.O]$;؉r:y^/P+OiFi/OZew P<2`kgIBh"!8iqepzbBf j35kfًwpK44xjւèH;|Cn1`uV@L(@(JcQ#xIt >VV$ҝcVx$htl Dhy$}F+ ᝐe Hj3ؤ gˇ,plvcH!IZ4]FD+\BA#ZAYp0hccit;$sƞF:^0]UΣb{P%ٍRtȐx/q,x$nӪ h- kF&l V+@El!:,j."87bF|U4zglp(D8ç[qP[c 0 ̍%>xri|-4y.sE>_vP4wr wXoIBIB,$a kh&i"Y6q))@2ԌhNR$IVEYkVj"FY:vvbYm|n,b0}{ZkP/AMCPChշbߺ QR+\.؁7U[v'#䖱- qD̂Fl\? z endstream endobj 408 0 obj << /Length 1662 /Filter /FlateDecode >> stream xYYoF~CRh)(q8AAkE@~|g$- ,'w ''/89z #LN.4Q nxrr?Y_2tjbz^_G8dɺ}w=?9>"@'W 0I19r DJdf72ٕbBF`deГюzG1vICn%AZ0HidK Vb:sWOM/z|ezry\O,2JB1 :cO8(GZYUu3p8& QsrHǖ+jtILyY'r v8p[0#ZA7NwcgB1ŋ.Y1jD{QMN3\dg#Ɔ&}O)#p8\R@plf=~Q@H=lp#N@,&gpGx%[Iz n<ŬjZ|x͋˰.q=ͶY GXH_kj%@3$%K(|&RQ?혒C$d |X(\#. 4Tk[r lV󥏝tQ7ovvgc8 $0 ͤVN`i5DR؉q BVrri>#n0!/".63pu.ГsUâ,lM ZL_\^Ƴ_8>8`sy``XϚ#?."5^>'Ǖ5U\.v;>ר@JG=>ƌ($ 9w).g+ MLJ DB/A{FΤ_q_ -YT\HYCL3lit̐ȺxB`e2."i?)SHantYҥlO*섵vZd#]H}3ڡ ,ƻonU( AO쾹cl^Z#KK~sVMqМ8o.ZEr &]+[elXPZ4&y =w:1514G>-j3H>[[֑El[j}WD'-֒.}3LGaY-{=%@Noۻ+U;y=,L~4%M)vA"B{2ħкq *U?Ŝegn{^߉aA(R Χjlۺ˽@I]kmaRv2n+e77|t!ivyQ—{@teIӸ/t7<ɷ JjW5`pϸ0I:c91P\ endstream endobj 412 0 obj << /Length 2699 /Filter /FlateDecode >> stream x\mo8_!p 3ػ.vq޶ٻiqP#ӗ3"%SZQ_gLx6O'?;rg]f3Df0Uvv~jWoדgg^\n⡵~<;y-ϠW{8 ̀ f dYvyCLeef\d SfuTf||"dJ2nUY/3LV$U9]^]pN2|RH<)SŧO6>]|zRqoI&m.R]iTmoNz+m{Eoܰ kF( &d3TٌP5 X7-  2* =jVV݉f M(sD3;nSsl&& sC5뎃q&Q'BP{Z|JH_)-eۼĪz%UMh]֢4hNA !bܩL (.G+ڨȸkKiKW7_o;anṢqVi 8,G`fRȝxf8hKmEwD8+?&̈́SH+;ƃ&C`ߐ 5 (o_5*%;ǜy ׃\ RM(jiW$KnL<~^0E#|[qcm=R1$hc,jiG 4]HL\R2=>\.b%%T&>Se1OC N@ʴ׻;t8 Juw򂜾͛lݿ6X~M&jچfͺG:􃓅{M-o/fZΟ֕ "_Wie _bJY]]!fRx. 觃vAE6S~E=xSOn})xH=:ֳ6(!RVkbonGm7-O/Zx2a )\t\nQ=fh6&B_ !Gtc&ϋ%Uȿ.E1.r:0:4M@W j~ث{oi~@ܺq1ۭgٻ~ ;9VYMڼ"{6"\qC:zWAryP~nmxBb?T8X9J۱AѣiT׬6m!;kfq>,?Hعr~^+HGCoJb?Zb_밉cqP+ 9څLm,@XżEQWEquZ_ 8_eiGHt%Pu7u/b Mmk8nᇁoIr +H[9P'C"EY :_p@ZGFGx_P.PXt@tǃ+Fh5@+h(H@@Ƅ`2`An GMM A?Υ9Ns@}!cQtCډoYvհN7+"va?(yB{HDS%Bsv'V^<4Z]z⹪U|$VҏiXeWz;ָPmA -ǂJ@=<-> stream xZYs~@)I[1Fs,UJJRr,Rv$]`uTǧ]&`o' N3299OFZDq"9M_eeTԖjQ8 zLD!#0uRD$iLlILf|SY))BhezQ[|qCc '4H`y̖y,aI(ֿz\Up^l&A7 )7J(Gq5| 4# A G M3}!dJGӠUcݜ_2xzU[W`iug38$g$ure٦meiȺNwQTEyS!aǿA߼&M^]x!bj"B} 5N"F% edlRr)9:0LܟGaЋ`$$A ._GJK~__ԃmZÄƝ[)^/evq (.RBH (hrGu6j^#J<ʗ z,݊m*upc.1{$}Ϟiď_ƎQaRKK7KG@! 5+|8<&`6Ha?vΛ 8pZ~{_CvZ2nN%6D䁭M`_ `oOw.n_!p&XM\}c5&i3jޔ#0=(!~zayDR\1" WV#87v\f4#.Of߫ep衄*Qڃ58-%P?^͈HͨH V+8X_7Z>DLY$iu|@7[xm޲|Y\+lˈne͕_`-`Hcn!hp#'}#D2dO`#;زh!䋼[/Ve} o|eP>,j.,R[̊KOQ J8bb`|{Gs,G;u';UR[-^g^o;z&1fD.)6t~IBӿui2EeTBoi'8)-Z@L*a8ˌ2c%7b[:ѫG4Mňc8x?|Z?ta:s~'(ŔKskA?p2u]l7^&H)Bx6jyM+[[iZ*뵝E{waje#Qfc[%:D N;;cW(yF7s ؋cR4>-S=- xx/ duOίy95e /軸cw:{s)yA[@d}]v_ˏ`)aVW"CMހBޞuNyWڬoF}r7xMXא>S`.kFPJt.z<듰?FB?/.;m ̗0#~x1@.ABBlϕ71g\.> stream xZo6_=l%:`֭Enm=tŠJ֡RKn~ɒ$Nj{0Dw4;hOGYb4+i:\̋K73wV?;%V0,}gr|4c-RB &GIJevz}V&VR{e9RF-MܫFcE!Ssw)@P#F8]mT6}wŤ|TK׼Z-'oJktcD)Llg3pw.7#)ahbjyy#CVpTZqg WP- JzќLOGP3h<5ԘENŐX&qX[boti/mnVDju~xzuDyixÀ.TFY=φ[X˒SsOaFP:LEbv%@Rkgm{~<Z4X) ah(%K\;w <6pe184$0iW@EU7񽾜&T̂k}5Uh't[>*vl"u }lPf@OrDƹ풹M>&!SXoQ7\h?oDIR[ HM!]+ rpm]w@ѣ{*[:[Jn/|qAP!QqpI3jA`vu02c0&YL܂ endstream endobj 425 0 obj << /Length 1741 /Filter /FlateDecode >> stream xZYoF~ ҤhQNQ ̓kȔC҉;{&*uv^{87P2gGON 2hqÓyrxouv>RS[6XV_p<# v[.]S/o맣w i lL2;;p DJAB ՕBF`te$DJ蠫'SiA/( aRaa)-ig\!-I:?D ZlVY2+VqmEܳ1"vlUܕ:h Ohpa:zW*6P0t/WOAJ0xìV4(?8^^߄vڸ.vJRIlkH:;][Ϯ-^xj@nI!kJ0 O`ދh,S[[[_ۦ6>q-i۽g* ) Ă0/5pQ2O'.0\sDE0X 4-<ԤςOe4MF;u&H_zfe~^!MU}?CIls()e=Xfػ)Bf/OjPھzN#jꇁ-d]7 "1CX4JY'W[НA8PrQq=I1k˛B}@5D<^`<2f37v}[:f:!ѬdI=3^6Gp+E! D-N=\Ԟr Yoa)Хkkֆ)qʍ#mA|N2/A^AK`p\#ż3[5PH""@1()㘻HWJu;3JH^ GK"ɋi} 1cl6> QfXPo"YK/CO|IY]b![&[`3ca|q4,-32`m!K;ThV@!69:ڋNngZ0u1a. E@e(;</%TXaXE7'+"3p)Z\@0 Ӈġs1H>|4XE&qQwޏAnyrO\}"WpEN:ʗvm whBF2 endstream endobj 430 0 obj << /Length 2160 /Filter /FlateDecode >> stream xio{~ ,20bH"L|Xdlˉ[r%9ǿ{|cy<7w4=};QDK &^YK(Tػj;4ru{,QBhosm_z7KzIN7ẒDyUMR"eeBϰ$eLLǚJ|Br'@s Nz/2YSX9ġ_M'54q"*e]VWof (#_ґrBglF6^P&?haoA(>\~M{xݚ2#4"f$쇡 N1M N&ta$ذШ,4LE-MTo1$,b_0/̓B$V,ؿb&֠u<g 2LZ_`Y3t[ ELF2E叠5ĢYw}rSYpL7#WqJB  1zFIw]cyfO{@8!CL5-C~h(BhjI܆@XHIdˈ'9ZoMezT ƍy/, QW'RlOX_Ulт@dtQg+5D=ٯw̨,KE `Fnx1j2.E:}a\׳heZX N^dH8 Tْϰ@?84Z.#%%_/3](g 8[poR4x\z>Gv#kͱ,l4MA%5]ϛ`9Mo s l<*-VEwSf#d ܟmt6ڪcdġۢo^!Rb1cX i"+ bx+yaF5&5 c | ʀ*mlPI $#;++Ea5[fޯi4S(F.%cf#lcj2 |3MÝ@ar!Nd,)Vs1 $,Bh?? VnpsЂe7;{ ԸyBV4KoB9FqN5U C~MxQMT&.997ien)4h1)mB! (8C))&C^75:XFWr/88KWWt涖EnlPo+P Դbֿ% xzX G93 L ۷JSݧ$Y %$#׬$L1 w@MH)Ӳ͋k@oqU62dH#A`0q2 !!.|uxvrtwqvvf"4L |X!dUt&i% t8*CoS0^ke +|Yjd+GrnOdދ%` [1 ƕd* ORBG騘O8^drmoPQpƽ1ATf!pwoOVRܛz(ݱ>·z3 mI8"7 ~] {9O ֡P%!@G*")6iLj? %\KU0SHux6y@Ϲjc/2(Y.9n^~NҦȼ*߭q6If 8%brr4\pX|p֬.;w/^Z4/Q+qCNGft/I֣ݴc Zz:>G$8'\ާ^/ǻ\`/JBƂIvzy~: ] N\.by7ԋxv|^iodi~gUH%jN{ݯW`&A&lKPxyb\{.=Z<65>sspX!˪'dޖʚ>~; Li4| 'ew;,f,;w0: XvGg$Wf絈` r6!ajA.5/ endstream endobj 434 0 obj << /Length 1952 /Filter /FlateDecode >> stream xڥYMs6W(`n5I&Xޭ-dcͯH<ɒM6fqpt{qu~ Q )_LSeL53UV/j^~@lk{[7]XG$K9E2eQV^s*I DEV5!X  L-X)C>IQ”KsKLg_|>+Mg`hJ#T"{Qd~{< fd r_8mmdk;SbE( ]tO/tntצ>ӯ|+uk9T}&xn!+kgumO.uvt~SX|^&]wq?: :l|m44hY2wT2A1G-Q?$"<"QL%CѓܙϽgw}{Z#Tr:+PAL!]EK^rr\wZ TMim}$Z n $3RHD$=kBgpFǵ=R 9sW. FVAeG50SJqQePߧ\{Qv?*]$@ny5? 1_1WDΖbLVg8Q\IQ/^]W*/LQg"JG9caH";h . lR>[\q b'%ۦʩ-\ƂP>Xm`PL&Hg`9;iÿ}1dփOc.n9pʁq ,>DL 35؏7w7y6AaA"M_?坙Nx(&Eya&gY]n0B ;cbpȃ0Vk%di(')٦`L]\SDt <`Sn OtYl1@ yEiLÛP$Sin*>DJ@ZH\\$}zOVoM_DwCr.}9YUO%09_ץe]3U\Ete,|Y>e*t<=L,O3NELw:^(EkM @LR?WȧO=XbAri`lv b#4zYM;U}CWW#@ 49f'%NN#۟k7)Q]*Lep?7Oj?qM> stream x-ɱA($ \vTSHB $:@\#Q_TQUE&MG-nu8M [Yð,ΐV]'v=WN;S3uz3x:cE_ endstream endobj 347 0 obj << /Type /ObjStm /N 100 /First 879 /Length 1956 /Filter /FlateDecode >> stream xZo6~_ǻ An.]ځĊ;:(Qp8fDi28(QEl*)G{V"obVޣIc&Mݫ}H,U2;ܣ&u&@w.( Az`a@xSI6JACr`Z0 𐕋֪qA 2ZchQdQ6T€Jg*(P&K(B FLipDyՉ|E ܌DAΓWl-evbqvق2=bH1(/$F 3tX j^j Sc!ҳuQy&@Np,XY|pc>ŸOB$""g-82%TY -# Lp 'DpBB2l *̈ +I-ѱ) 2\gp0 cD͢ 2ГB 3A3Hf 2 Z+YD1%xx@ō 䤪|ըMU^vjEtyU}lכE-oaa\.?Յ#X+ݬݬɉߩ|o⳪ߪƓ7Es_W;Du,ި *UvZxVן>" 4^FW;Gmu]"{5݈u.u=Kw+i~1m֋wN]7gsnxnopI-mlz:܏#L&*@nJP='ڂkif {!x g#II;,bO>{bnp0/pcpOEؙc#Cm/jjZ;:wȹg~iWէe)vY]~}*3( 9Ib5JA;FwwP[\V:9)ԯzU:+?>vW_z^]^/v^o>Wos[oO|ԗݼ⟰sa .hzXonhBC.褉e:i/= gྲྀ#'wl}h--۩yc|po7wjϝb]\픞h&-{1linY{lFrֲ z+T/\% ֩\hD;l<{cpI&oGZk>'={ɜ7ۡfzS۞ @'Nl'O l/9Mӗ<<} w?N&C׾Gcxcpl#O 9鍾Muecd}FrfK'wޛz^HlaR.`axsQ#cBP裣M ;d~,au. <b}Yl^oTU|rq[|(fX_.W'#}[>`H'`݀oZ寿6*vC=|BNZ>w!) R%Ѯ;.NNxG-'|[3Z>1+ )YЁp ]Yu#t1^֔r|$M\,vjdm)Mf-_ȄHR'N\WHyV[z߬/]nOG$6q2G.#kڧiȌ}' +W R[Ysk"Qm"YQt_se&#-'滖wmIelT|MAz(t(. endstream endobj 457 0 obj << /Length1 2069 /Length2 7369 /Length3 0 /Length 8512 /Filter /FlateDecode >> stream xڍWu\첦UX:;YXbFBiiA:IAA9q;33o,t4j0s `dHffP'eƪ788lttpJ!-kgp @nd2ip sUj prmpv wB2@r[v %6  0w8`1$ 'r= @ b4~G94N` ؂38٩#sw!vHy$86Ad n` 5d @` V9A~w_>-k vr ] nof_`+G/*rZǰ ` 0ܱ3D"''!+`g%g% {<vߦ/]%?] إA|v; `C@!$B+!$B!$?ɮvwɮqwuZRBjѽCH-zwE$4CH'Ihns#@`qgyǁxA0;N'D[eYɁTK)oK][k q#o7Od]F34?"6ٜ;ż.>w~d+ '2 n}n\07'+<ȭ, g8rW zmĿ%900 žlS$RïHyzˎv9ڛ==9ZYϣL#Y6aئ>孂5I&@T2:{pM}-J̺1#뗳Ѓv[ވіO?A>Ͻ,' ?qt&WF ZQ"C1{ڻd `1nPr{ԓ^#Q{&E)?Rއܨʆ2/~iwflS6%]SJ2vIxd)^23EnraHRw0nڡ+J t. ҩ#&ULaߘx%PfEKfUN2/ X;}⻥@>!EPɠ9ݼ ƍ;^F{j%M"\ըpY>lfd0A]EO x< cG('lZ,xvBy*< S-(x'Go61[4PgF](hL0dXyS~R`ϳ܃AQx|+ Tzݐ}LDy2QƷ}zHq# 5DceDjz'GX.FQ[ɘcyg.?RQÖX0V֐Kly!JX?vŞQˠDRРsqM@ ޖwk߯܂PstWi;cm|eJHHdd6D*nmERoU.98l'`&>zlHzcQɐ̟aeYxYʅ- p?vLM ť3?\\|kY:M~kh] U%ėQh MEot~:( 7&v8"u0&%OT FZpD :[*oXo4+é󖳎N.v WCSE}h>/VpchJ\ 'Ǭo*DHFZxԽ$/ [dѡN5jw&%'ҋ= vL I4?dx#pbȥ8-Y>zXsD'\idq!#O}3}atqd![]ֽ;:EC6;/^|~Wipˤw4M%UJ|5 P|BWnڬ15ҟCpㅽ*>A ~p6Bn2 Oh0CpmS;a@LƲ3mfÉ\16T#&M?]ꜹ$c. o%{zسer8ÿ6~|q8j LxZ۝3|>dVį-Z`QFc*ݴ~]&t=z]bob{0.NΦ^_[נ_v gSma#V4J@|($/_s;f0dJt,-h.HV` v(@%3ۉV)vA(b4y']uԏ9R  W0rwڷw}[b9٩| ?}tŴ_Ŵ;m?1>U4iB#ӆ5p~¬ְm4OO˛޽k/4T|yl M|}}(̅&G!lZ5[7ZW 0z Y&S}7VtGaKq~=K^'+^6WWWH~D~!hpM&[G%f|:S`; Lҗz4n;AMC)QUbͿu訨$"{u"wf3F\1?:{Uj5([NaIm[dKN܄ծDG#@7 In5jYwB})oC7 C{Q=Œr׋VzrI?I\~\} q&f䠨d*0JJV3еG+u(z֍-;VK =JzGԛUI;eWȓ2Acm@@WwSoy%mI#se'|9*I䃔\#Z; ht2NyM˭GY{4?*Gcafo+UMف 3aZ:K8g%m#kų/D.ڈX) Dz")Sðɞ,šŏˆMW3ΏM]n_r,SRgYj0\WR9`ń2+2M&?Z5٧ހd })&S,JSQ{^֢h羂i,IsD`CiVŠ)Iۼ<q'cHS٦3m[r* 5嗍eU' efa׽l(r&Y%=O*>1ћ$њ&uf~ũiPYl[,N1*pU mܣ{QL>9EO #iA ?w#<Ɯf:8$?Uc>u~ӵp@es{7vdӴ(CJ;t_Hq*~~1،u=]ύ&)M%w֣.`\)Wa:Fp5!V>31LAXT 35fnUP"UI@Ibcz>Q+@*֦\4v`H[ ?T&b~pAz`ߞrfrˀe ZM@n/៳Ŵ%p$Q9M_-4W|>}2oaiQ~E:SUO`c{ ^`Ƭ1,ti<֧aFZY]!ò䀹ᖹUQ~dNE3y {b@G.fàKo>PCy`z.u<*qQ$JAwQ<yGk^,Howwޕٳ҂h3*][-;HYUp$혇-9ovVǓUy2[FgZ'3veTWrY'AQ wIXYJj~V"ΰmS/:Ȭ[l囐W H y+Q}pZ+} :9cU*ڄδ#;QILRb` zEkq}׸3tMUaLo<^/PzdO3~V2 <>&bz2+/)Z?B,k'EIKX|cUB}_h͌߂vwQ"2H_1JJe9Eu9~JD5nƴ;5Vu3"پy¦Ü0+ %ejV:B3nXXhuƆsA?YljY|cs"5)!tbɂ]EF[gO6pIиŪ7wsM?;<#4C@+urs0 pJ`AÇ',xf#:Z 1[jCVEEQ+NogWξT[v=*PfؒMŘe9.'Ac/TX4pY\Zɱp8L}o8b"onq ~`u, d)N7DLMKW~JӚS8Ӥ!jeANmbm':C؉cYyT\ð+U s Ď%S)G96IS v+if=Зq-Eblpa?#;@EK,60bܽ]*mdʇȳx e {ERsv) T6fSJ(u>Rۑ" ^- e |:f5IVno[Khȉf5!2]c13k/_b|Ina*鐇k҅ $V*G싰ux:|;.Eּ6K%vg\ 0j":I{Vi zP ; ox.WIVp$8Ym iz Ilak%B!H-b]'yGe Zpi`y:Z # nѕxPg/zpj\߶SޓW$[eaU+EWBKDO瓅R}!$r5yJWs[B̹/.Πšt0\s |k0ih2y̟X3krѕg1Q|Ð4ȋ5^GJlEs`rF'6﫚@+X!v8~Bg5l-FU t,J=M<Ey`mZa4`j-C"ui mEpo _X~L!&jW&"QwEjdʫr2%U*k.\߫-%H-K2m#!o8*45+|KMqITeB6X{M#L1aJ)Bf;DV>LՖTc>o(OH8汗VJӜ.f>\Wr=7aX;U h렉f['B[k$XHUք6!6l@/פz]1"8Enj{da8vY]7'l+|{FjGxIN"eܞ[ 垼g#W+AÅ)¾^d(d'%z%Iv_?VܸAA… M>)ڈ"_QT63Ik;,OV;l9wJ˥vrPgR7|?+y+#!!Exkʠx!%֠erϚN.rχ^MdX+Ӯf[$Nm= QuV@򫝩3b_RV0^~ozsK |=Ĺ|Zzҡ`zh50]9*cuo!!fmuV3$ݍT]?&r8s ͏L ܏a:zZwY{h-}||q*;4U0^\r`MN%,eNeʸYʺ1a!XD$FafMY'XRŝzuj ]V'K6Ȝ* l~4q+3U3u ;o{(RK#Zo[R63C"iaK#.5 P'7dY7|Eq|^Բ_=ϕNt kUK+13$OT.t;vH/vWi:ҒLZX*\ lݽÀwk]BR9^69~#4Lt"2WED<%S8K;F[ Y ,l}-C˝Sk^zLΫR> stream xmu\>LKw!ݝ,.]J7HH% ҩHwK<9s?kyQkJXA,+' @bevU!j gw Nh݀m[w9%z-:ꪸ@}8'TNN `Q*!Nۭܝߙ`;m;xXwUsG fр?Q7w9x_f81\eA^@+u-ڕuV@q 4δmA`+OGz@Qh?`ӿ˩ʳc bx..ިC/J5!n?|v?#>3z `zFvg$`>#Ng`FvgeWzFPvgS}FP>?OA4OA]Au]Ak @? z_͡#n!P''T%h?fݏ9m? b qt| }ZZA]r/ ?YjW,[?gzXagb}^#k}.) B7$+A{Z@$5: h0 {VM?*m4'Mŵu!@lݛ~a@__1pqeF|@λ[!m }Ҩ^^BC϶.H8dV|Gw#z"d=o@ܠiUjX^d|&iRdPlOi3:6%IjbB7v55|C$s2ҳ$@2_yĕD0_kMM_U!.ܯO}?nQQ:p.9//o#ׅ4[ih8%ѕe3 y~yi0ە {:\V<[:OD)#;-D|{l=bei̴dz;BSOjW[i qJsezDHWΈI3B%JɹfYXu|ru YݛmZm6)JO /Ş~dq bbϣ'<(۹{zRMgwK,Bs,`:/>c:$ }R0J_n[/_4_GڃU*o f5P.W ʊNDpldJv?FN#va {@lq ~P>J'7no4r ,be|R_V$**v_B,<1"(/ײ7MgM=ݏV໏8j%)kwu C; K}I6-ԎVȻ2 ]MEQٿ 3鶠~'bo2IJf JU^,˵9L]5{*wpiQ ڞAUϭV (t0g@匼i|;O{F.4VČ=l\0Yg̓}{auX{0A޻0 8IE6}/6Z߭DLLڃl0,U2y~ 49/}M?{ԳScn}MDH[*Tv.U{Dc~~kৎV/Ρ5oge1'ĞaT0Ǽg"T~f3rY^'V4M[ҏM yI3S#xە fhdjb;G YMp4~a)֫xʻ5;( F9E&uKC9;"KjS{+8u/nTb4<4R/ .V;"B2MDj!qDRQj1<YSt"Z\[AXC2%2DnTi zP<,j!լ ll<[ } \;Ј],uLʼy?"G!CaJARP`B=F 5Y\I#>U'k tW5V5t'W-RR|1cH3n[Rc$N"X2|YeB+hq`M`w+6C.%{Xw"h|kO)%_OW 84F۞n;ve G3S/ֳH6I5{Y;bŴ\ޯ3Y'}/,oa;o0֒)cnѯ:-Ҥ'N1cC;R"%=ɥO-L$^q1DɸǻyȖ;P5@lNd)Dz}*"yw1!f*%xR2hqsQP]_ &{~ܬ]uaV%:Rwt#G߫@?odl -eH!cixBlEM0&dI$p4op䄛/ogĦڇMe˓&6 ?,#iDhE4it m~:c}}u:;x>'%5 OK9fk? .@p jRට.\ t;2=6h^W~ᄏ(FjLm/2sk`hm1t꣚L\ t'&]/D~A9c1p2YG84YDeE"B MU@qQZG1NEηA qKXcM<#E)0*ͺL_[&n B4`֖m6YWI9[ Ή1:f{2Φnla,ˡ.TȊ[L5F(2OW [SAyx=m<ĻlxJ/$Դߥ-c勯;i'wB`sggh~]#PF pǪD똖U͍uG߼d rǙV򓖒m/0!# MRv8jq.s+%P/“7 %ɁuqPXC ̘Q~TMlzy:ogOx3T<}VzލQ5)1ZxMhVUՖ=L_6O鑕InEx(i$ev{ќ=\¸4L?r2-@ڴ U%\TlVyirb&DoOH&09q7VԽFk ݷ95=մp)7D20C|j+(>a2aUC& ?'4+fezw=?o)3  Njܗz^>]~{^ةm{~S>?TUP嘬8L[{iΖxy5Ub}3h4~k-vЫK'{YAcOeV ]?Ol~{WJӦn{ \v 7K朘rY8 8to }ث[29,V~J%ZQ :癆ab_Ǝ >hWmW%Ip%dcPCM^b,1nYG#M:v1N-$)30d., ԓ$Xch5#!.{̌2z5Nȷs! =I8L {ך9Gp?#]pm#+el*nII;Nd#;Sp2׺s'ZqH5RAtʯ  ua(R?d|L,jg#!HBE#IbcP vPaQH`2-8Qf#x i{/FT`VK[ӧu̙| m%eC[ItPe_fwk%Ӣn ==9#o ]{C?ZjIZ?d5*; K*tp[ZLR{twэ/CdCY6[/y0 K=Ŵ9eJda'ƵBp T%rg^쿝_c,zQvy3n~GR-bT~`k17BW֏YeJ_(uYybJ@/JcߢD ӥ"Dz +x<^:E/Ԗkh=e:IcPm'W Ts+FO[ ~ܰUځ?2\I8J 8O h}s6X)T9;0`Zc!n4G:kdԆi(&TZ?isLbQ\.=^϶Ԥ?HDE瞘A`ɶaZ~N@ SYO>.U{Yb>_Ĉ3symǾ8 gqqV5L_N7S;F#Hf؛ BsQ;4=|Q831BO/k-8NBe]7|M:BgY:vP=Mn$weK8jE"ql0fh w,T8{Px9r=SeĸE)-><܄T+`ޱ#S+Sb\ UQ+UY8-MM9`;O',et; o/q(hn(xEVrŧ<y9)WqmضbF5UŨ(O2J1C'Q\n!<+>PK}>Nae_$29ӃTA$"Xu9?gLbK)@.g}iK5|V0jSgBǯW'Oy0?td?T6tq'" utA~s̽pW0:E]YD@*NhTH(&ր>^h#>e= b 6֠cn.Ē3)f 1c=sC*&LlX3Y(Dn<RoJ qY-dM32d.a&2~'fƿUnF>͔$otbufL c??E[C{ྜɢ+<VV[}<)ð=3k LsFoݠEODU 0?7й% Y;k׉-*+aDإF&vYg)'v/31>9l85>M{!,#'˚>,K)ut13#I=,"Oc^\jA ?){cli:sYMdĂkZA Ʈj<v{BlLָɡ[v0qզ9:#6~0"#cH2אr /nYy CXpxXŸF7oZA|߼?`upWRkq7Zho|ΰ X20$pʯKywEi};*G!~mctd[^jL˙MҬ$3kg8᎐0ͨ$OYJpg vr~z⢲QxI|t߄3-?݌"Lh)9i%iY) M柳+ [6t[YJwA5THʌ<|H-h^jV%A[ ''"ͯ Nvf s}ټ^)jq@5LDp.3s ,6a@^}b m=@aj3fYLVw6尧9I~z ~G6EA!ʒ{1ʸU fJBp|,dzA[=|֛y#mbH Ptpn U5d}[ċ>!95iy0aUp{KDRc.&G-Q':0,`Q'G0Ga_]W /Cǔf.@(J._-caSjde(`H<~~|z)IV%縊:qB2="D~ &振yHxDa' kV~?bf~Èl)}\Ѻn,IfQ+׌9ؿiWXg _:2y!NlsoՕ'9BW6b _)t:wg9ek/{B7ؖ=> SQdO"ԱN3WKj;ph ,nr6H K7DV`v4~h{M{k2A-;eXp.ӣ^ '6OHieA09P ^pQ6_e99IIQ!uuz0R*nVaV&e ga,>]?o h<)j-.?MTwHmw'o(Z׾ ["0,gyG-"9!Qg/JrbOgiCwri$Hd|<-+o#0 E =zQl+xoQ, C~\dž` x>fյ:p9܌Cbé "Y .QBdh$t3z+7eȈ־e={k1Wo! c@R.BKV%UQ1BH~4&Ü :P' mf'djV cYd#rpu/e]0gs'P\pIH9бʟ i çOdA~p4 |O: ĆaR>7̀F]6X%V_/v1؟,^VOGfT䇶USx=G2͍;NB2&!\4e9mSOȔ 1Z0#샱3}t %D5iyQ!(gz& endstream endobj 461 0 obj << /Length1 2842 /Length2 23344 /Length3 0 /Length 24967 /Filter /FlateDecode >> stream xڴuX=Lw4Cwwww4C3Cw" %%-]! H 9s53ZJ mVIk%P `dj[99XNn.6ZZi7=$c{ԭ< AZ<t8U `{ZZC@=Iyl)6#`(= X,l`- Rfdtqim]y,A۲t <骲::x6:2iT7?;!vvooo6[Ow6-?t`7G 1 kH;=*{S*V@;w_NgH+!IAӿ@YpyA +H;hM/@oCoR`^;ZxY</ rwpWE [=cSTSaU U $eT|NAdHeA`ggjw퓱̵# 6 kߝtaٻze/bBcz8@Wʎ7? iC `c B~P-7O`ߎF(k{+ȠC ?A6`%v0sP! rXmP`3[qN?ZnNwZk{X+zX@f_dl?& 2gG|rAHy?j ~@C?O{k{֐7ɿBT- ǘrqBϿ3/?_RR`VhVnrps1OZ柋7V}V(ˋ`+樲 rxZAJ1DNB*xQhkH]XEA$(%Tl@і\ZSEj xnXRHy7Rna lV{b;9@wXZ>kG*|xO-xnN8>KX]$K]/xc-% ƕ\zpwc??.:3'z=eLu򺳥BG' qd͛8{.*OU YLΡA=5,FwPs79~DSa<&dJ>Chl3Dg4Gx)E|M\dJ't)TזZpbZi /՛p*=Mm ;%6{^>F4p;pP1/8N&ގͽ/ڌtgf9 W\RV3Eq=H8A#TmUwHz:5q72>Pc.n 6gWr{~Np-|ہF}?&uAymvenۢF" !EvEoj62YrΗG՜֦dK-W\MQ/xɳ \zL rН6)2$t:kA2bo]=w HX\p GLז piDt6=x )K64Ѷˍ쒩r[a>,{;<ŕCd)@,XI%:SK=qVf{.uxyᒰ@_t9y7[.E2h~~%/C1St&,mtb,Z=dէ{š놁ͤEmŇ_xFi JۓæDx4AF ge4YuHJk""Jm o&]AE$6kyn=_O9-=oʩ==~Mrj]6^y] -aךUphbzʮ,0uyM j5ө{맄nW%)0Xl?lCs-q&0$?{yUG@[\| 3bfԋ[$xW c2ͿeC-@-玄iiJ3}-gB>Գ:jvH{DUToST7 o Iڬ0(vAv;0e;S24FJ#,53'!7δ(;,ͥ?CMkuO/4}bi RUtm&@bMzRH[M'1oXAS1bAfm[pyRw¹uo0$"D[C 0MAv%o6FCfܦ{nhUEŷvIJDHhS/"Vb:zXڜCk;קTq75Ħݪe3|,p?p$1z ڜ Uߓw\ = ҡ| _U`@f ?_=Z4 `}3*M`yWNq䚿0tnXػbQ7L\Їee* K]U={W!jCM:LvE-0S6u'IvtE4+%MpM,8\g MFE[uѡ#V+=]>#F\|GŤz$:0̱TIYܾ|J&Ll0C61z]ĘgF@]0|8}I*7$P٫Ez۬P[^,о<..`Z!Y Қ3x i-XU 5Y?f2(压KJW5$)ϙL 27d qZ TR؆ U5[`ʯ?~Frb/Jqh͹:.8xR~̚$=qr5PQoN]} 2i@Twf8}xsuuq`˹OھvKKՊtoZbwNa6k7[0ULL6ju~LC`ĈM8>dNP6fŲ9'E|||FPDyȃua#EdIZ&`2S}|u:c 9{/:&R<3 uAJ&mz=ݓ}u߯Lb2'Lp$n#PBv8&P32-<Q&bDe: _Uk*`#:h!!$MK&(Wѓ} '-K JUL\9_4̗R<\ ;vV(DยwҙFξ SQ<9dF_FÛl}v=i t?p~xdu8 YiӨ#~ 2)Cp"9t>|=G_zq -W3(xas%m'뭩g"eci%E8#y#fxjLI7ˤo~Td3%=T_!?|MChXoy#Źk0.|˲RRb9JM?OLy})'K֝)9x"4ےu*pc8Ts">%5&&$n{K82@!/V̚Ì+j?cwX&*.~D.2Pgv_k[yWĥ3hLWfp^eQ$W)IiQYqFe up8 wxs8w4R#]xdwQcBs\pTO\4e=-9tYqs>]Glۛ5VCtv)ߵW8SloݡFͫ4fMbRL dx. aVq&M_Zt_^F4!kׁNNR@ ʎ}Ԇ۠>I17u\-_QˉK0mT$BYW&tY6"Qo pݘ=4M]խۙzg}2id^z>^>X8>`ꆌNsCD o҄0Dlgw+OŸl ͺZGˆ?v(KRNJN̬btHuuu+Qq"h_ɍV LL=ֈ|dr^Q׾DaQ)]ۿ=4lF5r|A\rP?. dOtb8sj:{!tK*\V0JsD=E5^ Hv+X'idDZoIy)_"n$BZ}︨`(n)T/J^oS0{ni|~.>WōN rqLIbMO<;"0V`}~Ay|YFG˱'×DqV~ 鄱?Cltmk⎯$"k7ɦFʫJ=8a)Q5EfbZWrڠr'xnY~zyٸ-hc1ѵ+xok5FU* dDR ݛh_1M* ^22|f&K( 9͎7MNHIj%#Z^],zF"%#ZarK)9&I ۢ􁨢WeUkfk%Ben$:-{1].lVޞ5OJlQY?xM~f.)wX:㴬-?&If#mzl~{í;"AiK{'66U_4P,uuQ.u>`bǡB^dUփgGGl \vlzPJD^~ZKۍe^n]&oma_Ib<\rޥԞN@jy/ B#%xAnf8NnvVl} B"1Kw ʡOSZdP68x9%JXGn{!օ4"La`DndsSVTRU } I. KY&E >g%;NZ= " [aWUOe=oQ +tE9/"yt5֟Ef4VOVń"֥jm@{ʩXG8tޏ }p^1g1i9>`m{(yɂل"2j LQi1R` [f~ߓr }gAҾZF*;&ぼt|Kg'k {F%5o2vҏetV o&lJ2$@mWo~N3s[c/Ol|&̮Dc1>(Yȿw#NnGlux$ԏ6F±rGigA~{%"HE?ܯ9?(vJ䣒p?\̚K^:(#eZ8~t޺ɷR!I٫8tE`my4|Y .}`laVa)p | hW@<d#t1?cA)zmG B7_K%Y!/6ѵg\ ¹ۇ.Z 锴L[N:#3M4ZԄ dGV1nUȮX/4l05l@GSƝJw~p=9O3~2h7 zݵ k.naX/Y{9-..GH ]6ٲf:Tԉ;|H2sA#hKuŠ[.2S,(uBmniEw=8yW>);"-޲#ù=%:X=MY; o ý}C9{R#˪{(N"#uʟC7;\})(ĪY~P־A,dI+ nύ,GN2i34hUqt^]m"[;&o@%3}A23䚹ɷRAw?ϯ8u *Ƞ;;jJpevh׀C"ICXI|C{rڞ߯tY BrHYS^ / pycȦ}=z)^ ~D0[<|";]gGϬsSq8K:rq߇;%|* 0ZΚ<"hpa\*;0w3d& Ī%7{ҟ!Qd7>J_Q"8UZǸVvoڶ b@vt=8僤R,/V "LOR_R~g,bRC1%OV&~t,z̽DD>E/^:^բ9 n~hu^La 3?Dy}nLQZ%$}gw}~pwwAF|NϝT UtH' G]  /ϝ)?Na@Z^cL ߤJ۶fڽ6=-x65nYOZ\Ěp*N鐶!G Ti략o#̨bڏh^r;gFP'KqNO][GLpR\@' f99 '}|oBs#;IX@#ƕ۫ktWdCh"a[B2NX; kt)Ne]MOPv iغy~u9wt׃o@P{ͣ5%gE2CBɃ0&_Sx/ě@۽]y RsZ{= U_/l/Ta]_{qD5bZ<"\9v95dyMn"[̶&id|6:NtȤ;::["vM~$Uyp|0%%&#=.es)wgB9H4:{5a5>×]c&e:R>ߔG" I۟B絨j$<*Ff\w{Դ[ٹ3)tyǣ•]I"Z0zg B3o 3)=mwxtKyE{/ sG1a~u heEBu~"*,\d؟3BZ SF0&0{3w!O7 '4Yn,JK-w)t;t 09;~[@;_C m6F2n^Lm%%J;UKT6:(tkvFgP9@r4 P;*5?b٫s y^hIfvLSI"cZ+RgfW`pc ^F9\gz*e:s}a"`,,00fRx+Ӵ O|P Jݰxߣ,\ _zSr=+OϤjW&&9p\ Y #K#ƌ6f8秌rڧ0[-2 dn e;)ɑ(Vk׌ck(%\a)CAH.FYvÄqbp_J'*t f g˪_.>7ug1aNW^FݕN?Rqz!.Kѿ2َ,IÁbnY)U.hQ},?#%P莁TlgCWOVJn2sch4'{ϯ_CYyH$r8s'Q/^HL2 򍣎BS͹HQ ރ;iNIa|FϛPxbH9+9 s(zp"x#[PIa_sxjwgS I %}I7i7@깬{Uڋr% d2̟H\/맘YpI]E|DnZ0-8))3! ⤭MLLV_\d}- ]x"IGI+B;Y|L}#cSE?Q;nŧ{8Ifx ]<^Q݄D>)j, " WA&!hQvjfD׎g]\Ev.2.SW't`PnL#Χ{ȹl.7Ȯ}@؝b"a7^ JZ#hsNtБo(]\B*!;0G R&ag0?cbCw276Q:WNQQTBk tQA&qJYj2?{>&LIN#\-4)= zlIg{h<5h9ΐ#ԈfE)\e6po|ɦƞ' b3Mt?=PFm>YmDd! 檸kc nYŠ P>FD}q[؆gݳj!1?GJU1Y!rTji')Ճn?׎,~gH`H.Dٷ V$Q[ӿ? AV|hЦb$r4F|)[5]{2k2 QO0cneS~'5fSw_'eձ^;ӱV쫋<0RAΖ}r:/{ $<@0w ]|s1[7N(tG5?&6z51j9^@o,g5,aֻn,>l^Y3GYvHMk7EN$b!!qxAT2Rdi_xOkc.lVʨ\*{IKX0/EF[]p'v Jgk]t9ϵ >o̥,֚߆ 7B&yp9#= cG@q- k-:m+O=_Mx9`}0t6;*BL3xRmCj`>!WozXW ǯ~*Y)'wbX€*9,^ ~}9`g'@S#ivb_U&x[bXE8gS% r 1AL߳3`lV^c4>$/y$vDS/RC8 R+j5# /!+MJIN +`juQCeJq_7ch]])+@H wj.x#GE!X%M֍Z[YBs ci`䜯̡J,otñqi$7{MkD3BU5oOjLǰipC?s«s$ GhU]R=mGO٨Nزǡ5R VRK]cihJ6MS.\K䫶9wQݱ,y"rUcj 㟴Z )|'/3_V'!V: K 7gEwz2P '%a`ez=u\GvFЎP{J915:ԉ&i;*aC'')(9Ӣ+J?))Kmf:pxS8n%(/U_x6P-Qm|n^?qI="~B.q۟l*.t2kպZc&}fIyŧWX/;BF=:&r-_?L^8E[`bS(yG񉜹dKi"U>c[c[e˻<mrz6kdi/t. CePk]97Sb?"W35)7+I'6O̅"8 )1Q]mb-.G}X ݘ/osHmڤgTqwN[%1YPطF6Ꝣ*ڻ`^3i.:Xu+a7cG-hMnH@Q'i3F+Ⓝ'clmR=yheBgL-v+!9eDxW06.cd|؝t,Ʊw_?S03!ť }h r1, ׹0n*5ckl̦Qt4 ŋiͱ{AKݶy _ fw̱;OYwN}fߍf^w&'&hd?j`rs#2m;iW%N[4Y@PZP!i)?}vrlI]i=-o$ֆ.Vn ~86*$ Hط,Jg31WJh f!),>:*c7;yP=tRv-z,xّm\xƱXrX1(r?͚/HCqe!-/Y 6ʈP5[s(#`])ũ/jnxBSLw-6mA9ͨ;֨]t&)]{B'. >59δFu-cG"In`iP8弒;]7}kؖl`E5T6/})X YkKԛQgu4ب3F$<Cʹڪ'B|mYoB:WajTr@q_2]"2?j{wldL"!y`F}'rxt'ns{]BZ~ֳ$}:Qkݛ(so)Ekf-d ^U|ވw)[7 Vbܵ9âm%F+]pKU Σ0[(QJ$"XP$)WC5HcV3tHn )= uS]ʎJ19mVe9IPfW@;(;EE8CWhGɖR^hX {E};:-G|o”}/Ȁrv-%Nyf&'.X*S4V,͔>On i  m#1k3 -53rb{> 5U[`pu ?.uJ=rYld1DNh+7EnϙMUf>Uf MA!dDOBgx$Lw +>e8 EUFXeă In_ v]R>r cFdd_ruilS!J˨F0O\f=0AOuQ/ܵ'e4yz}&WOKo_HGݬ|vxdiN8qF~sk~Վo>p7tƶJ#8͖4'`^kQՄX'-eqȇpB#Guw?ZG vib-Ɵ_V㊹\wѵU.7De +c2r,E ѳ~d.^֢~ۄ#]{l}P.D0x4qO'+.1~[ /_42>p'OвRقܵbVQg{PM̂ <#]/`ٚS\Ki2D<<6p`&~RGI1K'Dk_nET},?k$-H9#z5ӹt3Zb1Է.MZ ճMJшUf:CȢLJG2Yۘ*]YQ0GE~g'E&v}Q4Af#S40!Bg (.qP^ySlAKŁ?Ql/}^g)'Jt#4o];&U.Pm@o!,x+Axb.j3ytnnԥbl&R]eBTjj3BI,bP\b 9?֌:*Qcѻ]P"Y]‹H~99P~?]5D  s|vg &ێ悯yljNy%(=@ Ӝt$'F< ?qa>YḶlG [7ɧ#~}מf".w=%m%.N4T7VqDMZBa^Ww0V?1 \1B7QY} j`I &p @4R n9q~|صF#}X0gg)fI v0 2>oy+Eg00Sk̺ ySF߱R ĻZ>Aocf</F'p)Ntu@ʋP`lGt=Wp8K4֌%h x==C!JnWgD)~ zC*U"RHY\Djוzޙv*',KM PYbʾAou8s(|D?X6aF6Kg't?fBgUeej7%Yra.cgLNzxM-a4DaT΁6vt5H'| %2B.8YAםIXRu+}M:sXex1BSVYy<Ҳ"r[Heh? 1#Q Agʹs x޴=͖}~Y&P:Zui{2αC`9|owy. p0Eq/˘ʉ5F  װqȺcԕ\R oy,BGț:>BѼ f(sGGY9._0Lb,3!GN}=Y,yU(*+Kֳ' 60+ؗ<}$c"#e5FP&Z;Ч*1awUe ` B@k' p[ȥX NkGtWM4)дs7yOdbc3&XUϠ;!]2yS eї~/kGמ q?4 l43U_%.YyLF˼b):+;u=5%O|7!ŽKˀ%ɒC?*s U$vؒe{ ͮ]'ؼ|{ "\0GF)e܈ 8^|zۄ9^(1C7\:B 'b5/#,Z ҜE ~G#W;x(c5'3,~T y/ q6kA}+2CL7wS4S}ZehsH i b},e@)7` V8r} *;X\lvhTukugZ޶ &}r]bq( 9UK!rdz~v;a`?%Q`Ew75?(Bx'bIx6Zo O[(H L=ayh\OVΤ7k$zB#ЍFrvȶ/YAcY`Ƙie x9#N3 bPO>kt#kZ6QH쎋(/D 9M '/ϕP ]ǀ*9g!TY÷>YHH |JSQ'V'C+1 H@I Ĩ]R hrS{_#cZ=Z(}܎? {8aiӚxn`ج+ d:ԍknNTxbyvXH0ָ_U%cLmag-l,Q>55`2sϹK3Wj&.{#vf=2Fj8={ORS> !!T!84:#eI #+2"w0do ''rLCج^II?;*y\IZE\u%c템Lj(s`G4|9m+q}ğ7DG0۴I;MqhUƁTRrRLFKH?$BެANP ck&O|G)#o[;V#dhAfQYs'8.Wғ'䭜1d[\ö`wғπ6T ZU紨2|#<嵔La7B`D3(W˻cCvtA,~l웚oDźHW!ٜd2@-$c01&]HnZäv+4mݯ6 !H^RE &*TPzucڝ Y`n Ot8aT(h[ht_eVS{v^5(kF܈r]kA{w"Ds]i)=y/r^C*A|&R|.AJXqC"=YǬfh%x̗'L7 RYhbgk-Rs4Ϫ ;7,3P6԰㟱v-T=A)?Og5421~(%'=֨MhBÈVWS}ʊM $>sxk]]bˡ\nxHxB98='6j%R!}eDl ˄3dmwsEfrE[an;֡`f<;l,:nҞiVT+QR?PcOz4svvKLj@/urV],|Iu`w1d  J0b<[O#&'4~x=.w%Ba{bn,wj19MSs/oL3Yxg)PyQ>@2qar,q(|D,701SF"ށ̰M0ybSJ4@LydIjuKt-to;gWekJK2IbNE!P;{[!\A@ %֛J{c;#W} _^?e]qEYi9DKML*kDV%,O,47FPvD~I^9!LwB/c)',F3vAoBVrG*C1'sM-${VQmϟPTI>(?XdM}{E3J!^Gp4`:,hQ[nL.q3*7EXTf.$UCü!!qyTH̟$3Zܦ;éBblyh?hX1;Lb6ԙja p;?T ɁX@8Kݚ%+HUZVF4{CCqcbKi5a'<.E1*4_k; slu'sW6/{>4 'Z@xގ+w2; >nK_lgd]ԘZ¢bqIA9fDWPo$IWYޗ\֐ٝ.d?(@? o`bSaakߕWS3,ۅjbt xͺs@R~55nR3?{,'ll 셈rwHkX %] k: @ ^R9wu(~b薆 =3b<_no6q7^-2)&6*.>~$ ]S F/*ۗ 8HV8}!s~?סyuZY%5WeN;?ޢ5raT#Q͠B_CEu]Сwe\, Dtt^!A> 2KT#|PvHRi2 gN_{2Ć0KۼCq0CJۃɐ@ & @se˦{~"Ɂ.Cqe&" tX~Az~c TK@M9=ڏ[3Bn:N61.>)7Pw5&{.$7ݫ,6M^OIJoM eZfN,|A<HƓ/oCg8p1Po2p;?Q<#^QW?^REyf02KVh$z>0is7xv]暴ǂgvt g5)IT#IJBSr={]\VAd"n > stream xڴeT\[@pP8 N;w=r뾷o(ksF( mNtLY9 ؑNdl t032"8N`QdP0vz|`dB H 7  rہTM YAo."vfNb[ 4uu&iz9z@e ֦́[S*H"PVPST lggIDU uZWU~3ZO7?rbBZbL z0\@Omo.*s'';nWWWz3gG'z[3z;S5p:X@֠qdW?k0AmyMވp_GҘUT-N 0lftrv%{{L(U  'ܿUI҅m:ӵΎ6;Z8:9+"`ja S5%SQ}<0;`z'7p2XoC*6y}o<9:3X[m]/&v j` {g=fl'_GGFh0!x:]@'g?8&NocU.6pKVɿU7TmS=jb vLmƁ]?ĝ6 à64 ПJmlpp(Z8ɥos/6-_"?[mf?{Gc+0 Fj JZBw`ۚXlm LolrkL `[77R8 AL N߈7b0qqA,o16vogc&5qtƶo[`0| [-}; `0S uvÛ?[o ۙYY[6C ~;ߪ[38?:fzk" ?:d{3wp;[@GxK2Udo}:-?K.o `u\6:Kw= 89Z4,L%a"trpa|;Иouc}Z&U}#|ui0}+ d8gkdR#?QKE\_S:f1} G4g$P/VV['\Ie֜TDIp#烏,&4N!WAJ}(U:BP9j|fEL!-kYɅu-ajtFw[@k_htz}-L|د7GdyG%ʍJ%dQq9kc0ل_dkNoatՍ.0߽HoW"bcZ~9LHp=5/w262Ԣܚb nD[ C}<Cl65Q iwSb辇M]$N[ Kf槓Vü% @EʉURnQCL.vY.&Vph*5\bHOqK_tϏ*|]vY!qqy"/ѠAH.Փ72yh/|qӎNw4.ˡ+U]ϯs 2QCQ n!\L23`n 5ib{W!H`l[n F/U 6BF &Őf5s#X#]fefadIQ f`QDj1d\J`vjԮ*1jOYE-_ВXO[-SV|iSN5NΤޠIu_>T<$~ueL7$XZ~'" #oL:1`Bo-#QrHy,~͂JנWKב-CPp6mP_2]͟K@Fa{ScBb\j"]gSb+&ȶ_yzC/_ h䑤; ,6{;g]Dh-}ޗp,z7K4G,w FNIK!MV s$JS3dFɹkk֠-*^Ru<_׈|j2wϢ~Xu Jo"9oo=Mcߦ=VºD'&Q=ҩS47 khq.I7"PS@gيw2iS'|goĺ?[4^ځEcq8R.0y쩋a0>l/}ig+@2{%!Ȱlbr=Xޑ`+ (`zyH4ژ9L0>QbP G(&eSW&=Xg4`8Bh2BT/!\ިdY&lTff%s]H8F8"LZݹ|3s&Lt=^2RJ~ Y 7ï\>h8ү# ;G:4%dw=f$+w ?ɔ'7u)Ya;n~i#j6I*HwAx޹jynkQ_o i҈poS 5v ^PNGUNe%Jf`X-|,<7#Ni{NYYiaծs NݑQcxopK(jcWyJ:ӗ \K5V O h6w_iIzV4/kT aMU&NO9w?ђ؝}U 07X^7XW J=a)ҏYd6I3_Wdsyq$gC4"v:(Fw}{B_øG`l{da?ӷ4LMwZ+ҨƠ,Vy{#S#doXY8)kfz.~d!x%[Nmc7tˁUGKn@]## _Md Hpt~SR'~ Ϙ0Po󚔏p `Ղ}hun O ڹyC.SbBU?fA#lc|g1};Hǔ: i/vء>)"'{;[*嚅\o=|NXV4c1:ӍF9S FlQ!ݼocvG׏X`gM Nq9&Xy(Jj<4,#~u'Nmt3I:jru]O3!E: TiqHګ u<~'pۄQm~VQ|N$LMT;CXh5%1C?/򒳠6Z JRJnXL ܓ?w_g~^1[8θj•*2H|["j_!ŶŸ!Q. 9Z/zbs6b|z | 4A{;^tea0= rd9xD9`kݨmlRөf_ 2 eNM'I;8vxN︼qC%Ԡw(_I'Xv^3_2[i|f!1 vhh& /\y` Ӻ%h(SELteHCTV$7%}OaF;3FQ pTjm| "}#U "sOcw׍u+ŷn7Ϯ+6i(ɌĤ:*Vcg2uE|vdML?5ZX`Py!{6=3DIh 2EXMw P#wZ EbgA)Akx-!5?M}5E9&ٴ'#Ml.R;TuF,VՌoI76pxbd رSG'<`Ro;Il@7#ysVK_nw.L[UJIG:k[i6ξY*FD4{RbMHg4!w:qGjyLsrC)8cڛGyTI Jj4Wx !~UrУ4 Ȋ,悚q2OGt`VC7/ɦQŬ2wΨN`[&~Rw~b4-<%_ja _4﹚`'$ȹlnʋ'i6sIrWSٺ\mfO(ܮNSi~kHb`EF![[r} _+HBJ|=`+CPH9_W/¿3::襇'?B %_ 3h`Nt~ =y5c!yX53 4%u2=kvv?$~0,$•4밷i(5;EVr'QOQ3;LGh=~j*q(+_㲣 gCL8kef/s^ZΓCpb$WI$sP_`xj$c<1`MuUCE5'ė*("ʸ<4hiD(ʟ$^~;VYsY6ցtBj3d4A:X#뭠ըq$n=@̺(s,R+\TI ]kKn,5U̲vXΚ~^?GY"TamԚ,u_zBj?Qwca# >!Y, lE9Twˮ0 !Opu\-=QL(XUrG]?.mD"$ܳ_b^IWPhoÇ&t0aCRS# Fdgd6ksN@$fW%e 1'`o9e[iWڄz%NK1+3 A`ifi~ހu[Mj3ϡȯz09EZl,_ʲz%*)%ܚ!y_7U\!d+ɚv`L5/I<-a "xvVEܤ:q8JZ y֢ͿbF9CĪ2~=HQ}OQ^ɝfJ&5EVkɖ:7^7r/'>#_[s -^D#V~`Oo=[j55X"mфq͌e.J}Ovr>qvE͌e3RetˑG_4u UP44TJ{3mˋyTGφ˪ [6#"xdF4[Ɔ?^sNHB1<.󏛌܇F/2\Bc\_NM!E?4ꑾ9CH9٩w2z*ڍ흟wlR|vM"yǑ+A ̲|>h4jT_ES-!.(jBoPR!$FUYx^wtuɍ%VQt*;HJگQ~Yo0▞좭oؤ6{p)z]! *qX]Յڐ0шE%;go#OfX/m,,a#m }ETf^:K3dt 9o`(jFՎtd$?W|5/-Q|%\a.͓YsŢCupxJ\mge$'nh=d%uU?)UItE6HƵij OC~dY²y-~m~`OV # #wD/d]6*8}ѣutuPG̕EcD6*BxuGM1&S43ծttݐ"!Tc&,v1))K|/B{g2$Y?Ar]VbayJb6(Ƌަ~($_Ɔ0p#i-=aAF A5i WL<֤T'j7(};~ @#T10fYG\e?=~mU†a.Arlrr8THh2;pAGqt+xP)9p#-/;.4 }PŁ2{/.io\g;ٻ6/xݭ'Z{k$D`p {a贈\\ 郶ugVʢڶ`f3QJWBz$`43KB:˚b\dr"-~A%Hd"jY-xi" }1 Z@[ino\4OgrXy%4EY5Dȥg%jAǷOg|u+F0jp薂ww P5{J,<[;R40%1@De*[|B'+;7ӑ մ,v4Cnfb1=QK:4 -q|[FCx(q=Y+DHgc݅N0'KK.?,c0GsR=~^aEj&gα@%-$;Z 5%k `:l(biW-ԁg_(Εm~OVE]ֱv:̩lY#vv wGS֧w1%'U].OduH.a#,{uq=Xs1G`,|i ?&)I˴͂췻g(#2Όf$vv" O4OE/{Ś}iU!bC3.b.)cQwZ__>pF\.,qrs@n66,ݕFԔ-WdkJVL@`& WYW)S4HJ7 i]D' V5i+if|e,Mq>Wzΰ0:qؐב\Sr8PNk.Ea_m֡2*f4[kc(FnQZ>EՒdɱv&l4UT3a~? gv#?7QpqބHÐnbNĝRb"JϓyE9ɗXB\]{? ~ud]ZSf4i^ zҬjgF`1 rMD62bԫ*V_rƠ >FK:r=4hto r+idܗF%}4I'FO=ao,0Dֹ9|)# $P:P7GwF7 }3s9s}+qEN A()n~J]Ԯ-|+?J`.Q-y)H 6@i3T>BO.*&4FƹqfE6j$tk^qPv]%9 y4b8 lv?:'1L:L^J]؈0ەHN^՘2.:h cSv=geGNSN}r^4ðLBCVW~ѱ* 0*$rC~@OngiAH M$ʘU34Tu;[~-R_c&$҃fflɬ<zԈ’`mP ^=ŤJޔ:Ilq;NUIh)=y!v[-e9\cVRVy~^̲R]h>I ^5;!]ZG>28x_$qaӮwejLth?e4n:oGZ:pV%#]r{P_ *wP r? Ȝ:SJGrbc7b8TlJY3,nd ޛm NE|6hFGc.\rf ˦Ki`f8`uHG9&LjPg%?w&hy<؝YW)7DyL@qT'Q Hj,O6x (Q'?1_O7Xze]6$l> CKГI;"tX~W3 C=]{Ei{vJt/+,J&aѻ@u2e/)rPB'k2$߀4ȣ4uIw0LzT5M痷8G6Pzz zkc~_WޯE(0e;-wV*BjŌkCRMUTtahStnUC̿2LB f3Is?@%YLl #*+&cү@yT]fHF%;_r,YD?%`Hf'c~{:+^"'fV YBuC5.\<9_wv[)#6Lv1IS11XeO2騖 H/ 'M"x:>kêf|=F0Yw)%;*mN/`?^Ƙz*iR,!^.C43q%j/rĒFޅNF޿}i$=a M^%Ж][}컱Llt[jFLH`\.ʴeNeXRsLm+yYkrAO5.FW+$0\kDְXđOEw>B'Dx0Møhׯ3|1f'ltTϢu%Pboc#,2lk;# ~4=NG2ႫEUߵ5d~ezC3:FkJ}h#NģqXe0j긶1DA_wJ?+"^#0t.!EGn ds<]U׵5YH[nF X œ=6Yw?m`ycg!~HCG7 "ù_šM@C#aT\Jb_ prkN6@mY~G=1aH[ ieD69 ݞpZ^N~dl~*\K%ZE ףWiӕaz 82|k|Ywm> U2pKۮ=WÓqD]ٓ'[ԚY,4-arӼ/Lze&iBh4&&7(SЗ7>WD;֣5FU}$8 >Ck.Q y#Ҡ>Zɰhhث畬".MxnRlťA?Yv٠O5!រ(XMf/մu2lŏԒ$\K}f+*xx[Rr.sC qQ(/.Jә|ENLtfb**ER4j8IΩq29HLLvtOA3pɇLc8*r-e)tx.11gT*@E'ǟb#NBHK.nI QJ}Q2N"/~OP^3tNƻT>3Y] "C`:hpsL˫ }[즭~g`::芊PN7U>ǮS޲1?gA@8FAjhBpy:A/&9pvYAp %ivT-s\(+səod+i&; pUtaaHĺ J<7:Ly<ڴH qg7צ`#MR0̥Ţ2JQj3ojP fh ݨmgw qf&D$([:&[ECtzet"]=FF.43 _Sc4 y+HO K:Q>+z`e*I +0TsUJ"󹲛WN9/=^=L.eUbWpf5iQ;X/ݡt-ܛ=oU5UΔ@7#"F71K-x ^ј'P['L^\94>RKڭָބʫ"(I 8&:5u7"U|}-\,HQ{n+%+4=C d5\*lL څw5YV@_SPdA{Y\' bJ̔HnN-DL-+4K`XY 68Is䝘)(o % .71:^c8w暥j_@||0m|xqwG \|# ^NY=fPB*{ mKE^(j<^$֮U]$VX Bٌc$Д'okYQuA.ikWmw xbݐ ##0۸uXVo٬|Ɠf5A~M}cM B`zT }?7m~>ޓTMx Kp2d9Լ&Y A9Uak.n_>%3/пZiQc0Ps7 zAxO¦N#&s-ppk) %"L;,RF㫚,y0(E vMlUb>ݾN=W@+؀!pb7}bŲ8; Dyvu$&G@ O$To{JDeMv|T>$7Ey+ }3c/1zT=r:][0O::jOuF. GJkPX6 d')4#Q/+355%HF32~e~AlힻVA> w&i2{oTd;Ɓ+xZL teMpzjbLS9QUA#';*!K~ݍ5ܱH".0>X/@0g&O+"J{$[+D UV,7Ey+fGց&@޺0Pc'I\=rXR5>nx_9U;ivy(گ}E":CP~y v+I|a ~K6+[~Le+ ;7GKSwaDkWуr.u=HJ$>#q+@vKCC,olQ:1ܥ6b֐Vr&*Rv`^B5kd;?cm8}_f)dQoU/Wzʇ3I1?3cOh5a>aұ7oT!4>? ~ѐɝ.\Q9/>sRaYԫ5De#hO*Po>BVq'0 %i*Ezrk9#V'C%wc)<;YH%XTur2: `2Yi!MohFKWUV~˒6w4RV",'el=cdv endstream endobj 465 0 obj << /Length1 1798 /Length2 22735 /Length3 0 /Length 23850 /Filter /FlateDecode >> stream xڴspd>v:msbۜv2dbĶm}uVW嵟ݧ* Pޕ 'jl `khbk223QP9]ō].WKg3 :&^y#@m`bi[Xi>C,,]`c`o(#@ `loeg(8x|*9JTՕTi?9::8^Tԥ" j=@J]U zڧoOǿj"jJ,L`](?;OkvP[:21yxx0Z2:8[0:ӟ yuNWK)7H_FO(?>'s2.))쌭]Ʈn.toտܜ֐/E>Wgg;fl6uwrquWF {{feN^DAFRBUAx 3z7/`$g.pً?r?̭#_T `@OSKea_5_'~>sc[9b:|Jp,\3+SO ?eEcS7pK DL?|gߩ`Դ2_.ƮV̟de)@?sEE<}?q``` eaac?:ϭ/=pKLB[*JMWBR0Vc j&B,eNwo(yڗjQ`ھLݚ) $!2%PCJs$W]>ՑAP;}e@N#իX-(gipE\D_uxˆ1Y3* rE)zhul +9bA†(9.$A&N{JKƳNC:5ʕiKp0`%;F݁"ƲzC QDɍV__8eTFņ+ա0,2GIh)oG*ok&'ߐx +d9s ~{> wrn`4Mm9{X% ´mT79p}Xv3A!U#tJ_p9!0jh @aqA1(S&dX9{m҅+Gze/n|*YޡTa?+ueQy{#uzc1Rb87Fee RTY]W,.$<;'LF~S߇9sH;ON; FK "9f mh`ҽ;bP?V%H.f9Eʶ1) Z}}vx00 Y^/ (Aj 5- ^)ӘɊ<:[s08ʧfPkQhHI'Z+u5s}$=QWV^+TUu$OӞU i:xհfVn9:^] jG83eHѢ|q/>r {K=kiB8xpHq0߽Qxvt î?䫦kbea(n,3:<89~o+hQKODhދ*7Bl>t#˖oO^%r_/'auӖ4|I@M"E K~Y. Wt:<▽ф àuY刕%񡍿Ar˂06ISw߯ļ'߹ 6&*'zrguV"1V C CT_Q >j̠2)hВzآsq޲z}@(^W͟9߷)V~E V_ji3mq@;Ux$tիNnJðέ$US)wT=*Q9xLof+KѣgOĺג6a삀+[Փ C9$AkVX`>ÁHIF T 0Q>} j1Q4a,Bgl #?/=z e M<ĈS7d:hcxRNzd\w+S-*)>>"YEsH4x)M.o_Iz\a:L[{Nbuy( 3YPBDLZO|2> u<}h˜f!Ҫ@|?z&A9ᑚ`twVvQ'q!0Q5nyKfͨ5qn "glxH0MWORDx}ZejYrjgli!e%Kwf3afvsd\)lL"ahAp.!js8pCC%?3 "VEt&-E^1FoBЗK+6E5< /da}}$WmR"|na+#q-U9UӼLS[ޭ>4G[_ y[Q+d nά1S3f&^0D9xxb?C!'-XmnE﷬{Rm}@a2 A;fck !bnjJQyuFs/?cH~,dXбIhe~R t,S.h7&A߉%a"e4m V]26Q{ê2@9ƕI FNka[[M/0yD1n`#F,tcw]? "E@yȸe)˹~œҫE|V7ՎiuoR@ P)=q:?i8gjqUІSUE1|> iY'wQǢ7ºc?x91M1Gi$96:: [􂿉7CN +-BCYˑBqQTei8PFmW3-7k*1na'oٔk,'й'$ϰzk̆ o_MxRGX!ZaVUGPL^25`ϾCof 6M@}*b3xCc\Ls: zXgZeoaje~6$ڱP2R0Sq'#RURbfll̼~& sX+#<Ơi<%RU]FpWp}sm~n>59'.΃y%L 4\)QZU4=KxYTf6Z2?U3n[d1A-[44/UuڂW!$uITˆo{If:؉^:bk/Ev!WLCJaF# U'3xwsNV<.ϋ|MBA6I_? 5 uOa?UwTճ5m봎wҙ 5hRi_̔(M0-~ @"k%kt!hp4F}Iph«Yif߆#j1C|PsֲUq˯F ]f6{R6=-KBUTl#?*oL_&QjdzKƶp^nEC`$g*~; dsZ%2-%yL]rnO' l)b%2NY?Z[G'6_ f3I¼.3WQPJ.PYecX3^s @S'PQ [6~G^/@ԎQ7DB864L3􏝤 1SZ+;Rvk7Z~~HXFй8jcUY+3M-T(X m~hMδ<bJ_E&t{*jM3|!r^{-1Ṡ˟݄؇tGSNqŷ)7tj_m9O jԢCl㚴xg)C#9h$U H1 BQpNZس$̳1 3d~|TYyD;OSM3^h)ٜe;0ٝx6h緩Yw%nmGG!-nY#5}ʭ7WTό+7z?JQ,IS2tW WfIfkv%ʖ`#UU?ĂW.Gik&GUpib l?5'F,-Vя3c5sƾ ^TGuQL$wIwUj^%ҖuzwR^a ./2= nB4[F5_qp@"KU`]Cm9gTw*h:Gnܗ'34#ZH_`]9i=ӺH%ie ̷EW 1Wt=R޴\ILTv,(ZN>F-jjҁ?u'V'u&,N0}I!>RH0IAs/n>dw[Ei=_;}؛IC7~C$nןY2H}9_P嬟LFN*D_u; kK RwQnF'iݦPk&G/նM5{eH)C@n,ӎhK̪fWmR,+NίIm^D }|5KUTB(@ š}uePܢOt 8 T]̣*&amuʞ>>׉, ¼&/^>}1r-.+zp!^I)ǭ(dE|KRBCr;jYnGނ;Eix 5 wIoHҠb8 '$^!>Qy^yveh/c"l|F '1-3FS;ڌaH`M3$;n>ɱkbXUquIjY_i^`on谣f^bXV+liF$hJ*G (@w2{zGE[$%mgA#ԡ,Uܑ6]Ϋƣ\N)O$W")O=ov/;]H:h߼"mݯNaf{2&)~16!~H4KXn k|YqWnִ3^tfDMS+sj&eQ8Q憾ƺL;<jP4` Y" L<7nvL;AWcӜkwQM]i?mJe;g襠#x~d0eP/8M'[57t>' ;xڝOlp* 7k]B-CCEWķA ո|tpc~"I^2,XC9 [ot,~CGtt.(j  `OnA:2fKYdH aKӴ&cܽtztH$=x<Ō͑`ڂJYuЕMYS'U9K#n|kN\} y?J7`y.RA)G*U(q}ƣ,jGnŬ}Izr0q^"VD6>zӔ 5SYV;?v#\bG2Dԋ2NOEn4V8>TIpcT/(ںVG2m3~yWg8a@دRiHO]MCbV,J56 *y/E.&5p<׹_QƼ@P4J9/m͆'ﯫB,αel-cS J[6Fgd\pȖ ^ a4W9#seXr֎Q%!? ܺ6xrSh&ImJEɄU慌r)+\`J0h}e۩U M0\ H` A-4=k=h1OU58]_%Y0V));|,^.|s7opgh`h"u >YFYPI,T:%H7 ,(7 `VG/8Kͦ+J-@eĢpj`o0n?U|2nA#:Hc( "<~^I3g-.EIdd[CL; "FG;:I`5챛  RbpwNO>L ~ vLqLh)oc&T?m̊&^ɾ噝NSJ]tPj/隸(! ݰal{#mxAp[xd.'dwyW61DVQI@'$ /iTRx5?hJ,&&H' fP}I(u` Ezw(:7ig:?G~{;1+ku۵߲h~SKYcvbR^୻`I6Ws%Nv*OL/D=%/:r|وՍyba_?#Wb7zQIp6d_jA_hFBSĆV7*,4E;5y_zd7xSb"Jħo^4a[݃WBN ɜۧ?==k_w`< jʃ{H*R^dACw…T<)_Kʩ}f_G a|TTe mg!nI9%;hФxG"h{66|t@:E&F!I qAg~c'ٷ:/ I, p \nPjd D1 țEp6׎?λrB MS{] TukzxvJD.,"")ZégHsUT.se]$A=13_\'WĬ$AfX%NʢDȍ5w]1Z∲1R[7,6d e⾸k:V bΩ) ϱ,RoxpnQWr-_ fnjݽ1Ҷe| ȑi{sL #V\j=O (2I/^ah99jG(nI6׮ozOv buHUDLV?͜Nl,F:+!sjt#!sTL#ӷBM"TW1V!ԙȊ¼D-503P5vڀ p1E iXCW 4d=1(^~Wɚk3-j?7򃞵(N5'Y9&N uN=pgf0M>.D*&cяDil1//lyNŤgu~)(HwPf@rk_wQ:nk347raЂ1q/d:#Ra C[ jdQB !MlQ>W)o=gz<Ga˶^ ͩQaZd:nmdR1 \VI:s9_+? ŋ*~f057Uy-Gh":Hoj)K76ꝝjͰT"K*"6`V[[ rN/rӸ&.Uwh7u,`i8:$lށ6s0Qf m Fgio^ڜ5vi^F7?31.f63_JJ4a؂ISД4FPJ8WJP:70g`2G'琘!S,E5o;m ^}}-Kj']9y/AB΃:_H }wɈJ_0nU'z)AOASỽrE6+ uo7J5|ZZa!7#2Lq!.SqLa8D !'"IxCo%vrݦ?G/=jXe8n]L֜nCtl 8TL\scTC #GT_o#z^| ZD 3oM\S7Pҍ$wl~3×ҮyS1P 4tmg 3z$ʆIaZO(OJji/gepx=0ߟBRb Py9sota|1^ϸXa,YfՊ ~ ϾfL%^2FO!QY v'9I9>^TƧ +!7ܒitMGԺ !!v|ڲ[HkdW BJ0~17s:p7Q;d gRg",s%yhJ# ~5b4f(J:&՚ڭ,2̚i9g] zzn?x؟߮lG'Idk}벉$l)FVE9 8p)XluByYmI:#?Dvx-5˞8[ՀR*8mcKz=p/"8ne*6Gu'd;hxuB7(Ot/$[0PDD'c] ywucdz['L}TOɉ3΅=$CI77B 4ڒ1gQTBޅPv|Zֈwp9chď҄em%Y k;Uct+87 /`[s?ugEَdq2S\}҉5y$'E-dUh *e1X9VCTVAWTF{Z[p5&u -H1IA- +f/k""b0xgQ;Mpx+dZz"[ 1|`2ڑ\R8MW΅2A FQGd[3vR:Ar)a/}˥kjI؜%t9*Iwa 2YN*/] _j8ED+!nJg؅}hMRڬr]D@:^G8@7&iL2R_Cy=R I-.@eubJyYw'!:aq16 a߹dXP# ˭6 -=Z&ʵ]Cf6 o0{_c9=1v|=EaI ̉+S6kwƎף ۊh;+|N}>&\k9#x-O' Zɻb!gDc6fCh bvTU.M(eD{+ue(l!]M5&q$y"5H vp9|zQ>i{D%馩U ff0\wuaD%xp?=jc7A~9ٻ92G5}v Lkm$ ItYJ㬰x&%X14&iY8f'at򄺛A0BtoZV7de3\{)m22oL:%U3&[\h7'@/;7P?RM|zH~#-C(>ܫam›/ eû{'dWKa+꫄knD)G bcUBQZ^:GL'r9 ,AU^HǹHYFѮǐ0`9[ϓ^\)QeOsfo+p(&aCY3*T j?Z|X,R3`W `ωj %E[z. "L+aw!0 ^g<+8pw|^ 1z`lHJ+mNEx,wژݭ<>]{9 KlI)`ChyGBpF} NSzw<[9rf.xGY,iY~~G\s ~@@QWм%Dfk3 4#Ki*\d|),t e~nb9ttn6UJv[#e[;ަ6pQ2r LNu9/E\qiRS6#ųjŽl Rٞdq'gldN?R-U;'3~,ڔ*z f x!KީI>&9qcEf)a&i*-Q gC]ONSQYKO׏@M,|$S&2+ēAsVmuw*^%SŌl_:/| R,S70ঽNG@I|^ `UP8M&O [ΗH\FaZ$z8ao2(5u.CtaFqlʝy0QX{Oa7 2|z̾-.w/M%R(i7H=V!(| u|;ڀL~t!oJV^ ,rH+c.MO­Ux* 1E *k*~?E6pj{p VBJ"[ղǿ=-i3V]{:9CfKiv;k+ʴȖOڼi58TOI1d }-SP:O_&^IRDψ?{~?g`-5 Kk/qA &_YGK&t{(dڞo -SHdQ桩+\Cؠqpdb;.&koVԙ#1se%"< P]՗\nq{p]'lϮxE;mO{8 cܭ[ͺg H.2I]6K @1`,\#>a`L}VK ƢW)]܍*k2&7|5z|gi=n @c ƅt-岇t;eIܘ )ZxZ8 safr 9#r 2%x2{M3&AԪV\KE<- ,5^~m*$G%ŋgI|s4Icw\soc~W1vY22&đn)4"/ݢ@x5yZ;TuQ´g573|t_OTnYZ\[ [БH![s *^?ξ@uʶf S&&,J>+jM @J͏%nxO/-=FnYCS9wMBur4l1r3I1(+濓R:8;7 (žR5cKVog?JJV;_B%ys868W/BB://6p=Zc,BS~ +b9q֓Ay/(RwPU*͜ bJCq!H?Z*Dy՚sW*9d\))4'3-Ƥ1@zUV`hv+|)?a_=ƻ,hW'̏fc&Y Tu)1xJ!F+-ڿjD-GsȑvH7x'үE7d2]_x(]nR{)ҚrJM[Zj%a/sxij.EQD~(PwE6#cܼXPryet= t1I[v9"_QDe@h`6/cRb uA7ٺi}[X\GpȘ7lL=ԯ"GpߑՑuy/)~/] 멣X :U=]7~O8\^"yOg 55GLLl} 6{# M-"W|Wjzĵi{#)KA_6 9Ӎ)AeT#@VHG}$ϖ\9zY_S269@zH(!S\y94cKQb)EGRZlJB=ڑ,Fk6,8uljϦPvx4π0ci=j buɑQow~V<6~گ~KU6kxS)YcYPNjcJRP eL9}kf.!4NsAH͓PKDy dF j0CMVd RJm.ʊ/zzX?̓XEaPtSs 3.RT=@w`4spg" >˞}+ aTM# Y,"9}f疆 CˌGHԎHhCgIt A^Jy$DT(OTM H-RjFfPV'Vb0/L ^a?ƱMny0eXkqkޟ3yΘx0lԐX2ח-亂x翱^H #xԻ 22H sWtKǭ0w-{3=S$e#$\tΕ"hAg:wl0ufHBk'ÝY/S+dRc``+*,5'UuGj7_.zM_k6;pd#"j?` '&}A+ U BdujYj*섇ӯW>Tu>ߒAZ`ٺ\B xl/'z8 euI8}q'lY.ت~|Enߋ2903tR`'(,ɈhGVn=0<jw@]1g=  ʘHJn54H!#Tj;+"6P"ޓMD_NYN6z æ<2Cv:p)}$HzVrgF {t`eB C'kG4|X[?\@ͧv/EUQXrijpN G]1 <ԫv'#N6/X`nWBkObWAw lMB1ke)IzUG;`Oa^Bt̃OűNSfόB&oU^Mfa*xiyR<OA|2ێs!&˴z1t#ƣQYrBQyst"~ײ;C]es*im0>͏ptSPNnŷ% %{eN=%![1!ԧ--!yWWb:!T'ܵt69,d¹I+I)!]3~Uo[נ $`z0KfwNk P/tx C^FѶ|ҳVe縇Nw_f*h$)c*VgZ"?o90J2R|t endstream endobj 467 0 obj << /Length1 2098 /Length2 23493 /Length3 0 /Length 24759 /Filter /FlateDecode >> stream xڴxeT۲-ww.; =;Np >ܽ hfUͪjZ+ ā. L<Y9#{gf&za) \ h/jbt(|,LLp 3{3) gb` 2 (]荍?fVf˟2a 3Ll6V#{S4@aPfF9@L"PVPSTfHt-"*jtQ!yU1:@BME_U3ty:rbBZb̌`99[)_(>A5wU@e`t`pK3dxu251t4W?;21w6Ci҇}4ON_\YEEYG3/ǯ)D\Ԑ[0ce޾FcF^.hlfs+[?왕_69!y)q1Uzُ~tǞ?Dey\Lfn6ǐٛ>T;iG\N96@w{2[ٛ鹩~Yf3K??f?z;FfVf/pFnf'W3_:1sLL\>F]Cɿ]TQi 1]>F Z⮶FvfT20#Z9[y*ZXK} ~eRsl?±s_81&6f.ֿ\f/m#,*)LW 0rr2cvv7y5!F{ 0:ENӿQ'Qo`_3}FFE>Gmacc`4d0,ͭ. tuG<;C? lvC%J+CGmCu~g+>ԺŇdXӿ9Zӿ. gh*.N@3 +ӏ78Yy0}vϿ_T` =8,"V68.\ Є7:9OWHrno҉Y3xآ;$fŁ@YI=@RM ۷m)UӷJwńԂVvPKieONP?~ezGN#}ҽdcoe =>ƨOhfް( s\ʡm4D7yC3ޅ͂PO(o%1'XL,XjA1RQ _ԱTP lDބY.-cY }291j@ FwM!6DW] UK1 DM$;#!|P7^"AGgN.S.}E;|fmm8>D]@Fvn V!bW[puEa9E?1ۉsŝ<$(wLh"g%Q\&oFw ĀLꂘC-kZY&(}7겖/b5|*[OFP^~gCT) ~/@4ebW9k W"vB_ob*TV $9cX~"W&]nIg@Se쮫uԮcvdRO I:II,8( .<\~IG*"1^&}z I )hJPfgx^f(tb)qzw!zut{pgC,Ӯ9M+UO n\vY?޶@stv5 U#FukyîBq`j/K惤IZ\a.]^nMrf p}d|j]0l0PÜ~#qmD$U|r8͘/ s'~`<͆yKYu 0q&D 0;Xm1W:.x՝YwHN= yߪ%9)z ~%fX=y+μIOf-x͑_wӔ\M q;Q0vKtCNMV4C;x)Om ԕAlu0Gb"gyĖNQ2N>]ϖWpG2Bd/ZF VTCn\8* aXE_:iՄIr@;@@~# ۳ |lc` kdlY%(I⥣!uŽпV!߯^RVOpE@:$x]=VQ8;À`yīg!,oj.lܔi?GB$R9 q!-r(@wUaҎE<@ _WY71~OL{ZL|#@܁!G1ͥ,d(.?S5g˼nq`uHʾM[.GUwlqg9WP1T{n֨1?Pa-`;WF)[i\5;cCp3n ^VԵU5=!(?#<jYhK+ZcYr%}U䰴bm+7JuWw*0?Q .8e^cIN>ΚAkpo;Ļźaց832z6H\Ңp/|UiSe٘J۷0xus2D8c +ߗ`Ry`$iHDb=FlJ+׷?,h_>ͰWo4"u&|_NzR\gv3nyѮ{fu-)(+S$~P5GXt ?.5wfhB8Ό eid;,=fXsFp冮ӊcG oR^Dm׾XGkT '|!-? &6{4)ڬjM f> &+g5\-%qE z:$O@%ˢRPx㦳ӂhَ|$<ngn! XE}_1q$:qp=*rm/5'ߘLjAsG˂A9AĭQ4 +@Td">[q|igYS8Sm 0Pdf ڶ{1:ٚx9a5].m03u[ /t]إ#uִ4‹QdK f3I4 ~ߊʁkYmT!¬1 ug "B ATTJďD}4iB-IH@еT=C^.ֻGk_{{ Jwfu'22ooCz%@WckGuPF^mw l}㤡M%R9 WL.DR\RNb:kݨ|B㻅,@:Ҹ=$,=C{gog}N3F(f!%=ReH6:, پ8fHF!e͠$ irE!ށ@qr:S2Yh)rQ%m7?ޞ%-po ^IR|L1d^bZXUpf"ؘQm]Su YWЎ))WONQ*Z(J&UETȢ&Y`ķ+GJ0 جaT<*n-yF,MؼQQ8P REJ^#*g)BͿo=$,QZdM)֜8VVj&LJQk6DދT:|c45v룋ٶ6޷3j[Gϧ@M'hڶ&EN75UqJ EIxAIzHǬJi n_`9`:5lQr~<Œg8XZzGw jw#O5ʹ2HˁN%\e\ԃ? "N7Ңʧ byOO2$UZվM:{g`]{b6W}EdJY>y.;K;b#N/%Φr?0>TZ(ʦdbHUUmˌU=t:~Ex񉘻LQ_dq#cK&9X@6/3s[нDžnaJQH;g0i/,CE70u>޿$|iG \ÁOs5⺘+@w8#YJؘxs餘w/xI;9%0 I~)i21cOnk)U-9ƈ =Eh)eK4ȯH5Y )o;I D|l0yi2y#(1`w}idPO I X0S )"*5hm(Az~"]A X,A\#\ieوkY.l^ *E34-^̖C.pA1 +𶿼/.*puA(bPU-(ܣ;+fOeUW,6TdcBسgsNrA}~ DkHcVj^R᪉Y}w = 7sl_вu q\ow.8̏8\TJ_I?y~ BcNf_Z4*@YSࠏ#O~KfA6piIe`x@$Wi0e]u͚y#V6֩bcI˃Wwql.k _,ތLPq= WkCI5X%2WAF6 8݂1r3a ɢ s(AKDޯ2''%xOe:yJG`Z)9Es(>~*9!9aߋoH-{'ţ;8ZIJKMIyI`CVs_>q90@5,Xxr̗VlUO[5=W;v~|KG@67{+ M9ԎA5pWoI. OWI '堈w˴jJSc5VZpDxvdѕfpjJM&R`lCs j [wB@~xFYP啙+ɐɥ> ډį K`"O}+wY[0V+LkK%I] 31yGFi?൏mNbcv\UsH+iG;zetz8:UZĄ*t7i\yXD.es=jrZ8IRbv >pylycU7衍4T"P5 # [ z!dۃ/$kCL#-vu4C2d\=3Vci * (.nlÃhST"׆-]͗9_ؕ28 I!z"MPDb~l C5W6Ys̪"^[W2W>t/FJ ڜ8)RG/D[ mB,?0[×SbNS$p4c> "Ss&:T-Cy{@nIj;ݥɌ8hfոtJX{1Ozi:F,$\+7Fҽe2md-аޝ, ;nQ]vCzU,WpH5Tf/ZtBQ~avt>}J@~PAp/Y&t`miiƒ1tZP]'7d͢mg~dEw$&rz6PHμUl7QSc Ym[Af|9{,Yyq&HX&DX!dLn$}hrmzğ槜n2͜ߡ$R8]8z"G^l>p&b7x#V'HG' ?pfꉽ( (^ќXCȝTʠHhp^R|;l=M`G(4|-TD{f1iŞ$ q+x&Ɣ1zѕN06G6B1!.8~<5 u y6G!!TsrŚpr"МIW(=fB,MI;VNU 8\?[9z1 ARB&D7AvVAR#SJ[r&VD_N[ DϜ0XHSÌf q@0GmOKa >dݍ-K?^|p"q'ƵPȪ>8b_ ꯌ %+R "9fS5x8ܹߋH*=0) P/ 4Ț`r-MɗNK 7 ¿V5F`|+-区Uj5"HėEەuuL0YvFvp(9~ REB3Y⢅WanGT} *}\ }9c(נ\saB@f#o!7TUIնn?5Y*5΄FebqѣzytI$RRO EW șbi`.'PHq]h4 ޠc2_;'U>U.yR2 kxS[q1nDQ*HqderPكTC콷㕢 ͳ/U/0 ŪκOr7&$n'9z8Ū8RW42+d?Ob܂)o`Ƣ:NXpA-5 NghT4I &",_ I&|Ut6&*lʺ{usQ sϓK891^}2 9>ۇt$ 5="TV1Z^? JP1-d#bo3xֽS9zBzlC 7 avճ%@aJq5?ߐ'2eⴖ>ot|N8oK+ 6JgW1TS (<_P;C)˘C^{%>4pO,S1򪒁nm|?k+F$(<`qGѷ-38\0bAp^A/+jֈ a:r4N􀣙Xu?!9޼'k3dr+js\݂5$v+iY2uS̅ٔ4A ebZxPjtРvF@zQ?* M'] {QܖlK&r h 3֮;hxm>oW1ȑ=U*79/@[Im(+v)]'/DNLlOO%ԳF鑡8 jJƘ{>chRA2$ wE9p 6eYYǮ".  !~B|ra,et)Ѳcj rEhRݜjy,{MU_MU[82, [U ]ݳH?Ѿ02_uEjӫ`B ⻾rJZ^}ѵ6$81/p^c)2$gVD"r3"T\vG)'XjU,B"8}GuL x딥AnW:(!ݳFW>0RA]\-80%TXyyoh%0M_Ґ>{[OM*yŋ5g@Su6m}DzT(X/v/osrTBԱ~c l2+H~-!?gǫ`@F-y(+v3^e!q͗ K!ܬ0Fx#Պ. &kb4d]x2i)K#Vȏ<[Pugnn;λV/_kd#c~ہ̳P:Q&%-c%GuLD^@Ԟ8TM\; 9qN b;'؟SFgY3qQvsAUt@6lBI>%ft)$˥eB 5GMl/=_^LtH5I,qk<ł(5&R/Ǯ3k;$QeW锸i_hKLS5N S0( ~`\{˜upVZm}$I嘖zO t~ӾSYF7kB\U/O#N~)=NFa6\le)\6((ݴYlVjVSۿGcnsBVZ""1$kQ`aɴ1s(WN|Nu4zzS6#)H7({BB2}';,zmUp-b3 uP6oY<ĿרWfb΃t<d6k}1"eW*U m_Xmؐ'##]JL]$Ya;/ȔQ:QEt\.2ojf؁EVs0>! :wْE bZ/ЬJlZ.;J PKI;sppϷbsWzψw wHqfsʉ- ?cH78 wx:@ ݒ߱B}_lu_8HLUF#&kof@ RC'f^w,vx3Кc+DMhS%]f cl1{f'hLAh]Jq]opl*UDum a@{Xܵd7GE,Xk{4Ja+T1D*s끊uJ /!v!p7Ԉ(9 /ukS} sͣ(&MMQE {KsNglN=`Mb|: ([0yYM= j*?+M3›sZu.ԗ̵g VaeC&x!5B+KrK:nД{8Xk0_ze5йksCX>Y)_C[ PAh2S6L"=C۵#29be=<ΙT6$RM3v\um #k# c@ V䦖 {q@=i(7 %N3ISRvzX>~'\rM=aa 2ػV J0fF$:1Uܴ 7YF‹]ku Ao޼4f=%BxvnfҲ vӃ4)na&+A9܊i+D]M[6 f.2MrcGAjQf`^ZosF l9% K{яQJ'ZRkicUzȕ,nOrs\ E߶g=ޓhQp;['TQ7牑u~X$ z0U>[Y[!]B _pjV>h 1'?5-Bq[āVfGɹ4wnD-[ˉ{*߁ UW~<JP xϧ*h9#㷉y!5AG1]“ X2TR :#Bu^t{V${HD%ixj vz+@e^ޓu/ IJ1оʡ@m1)D Y-O|/HԽGxK'mh%Sݞzr5o K0FDd*NW82c 6冼Bm?4 מlwQny]2.Y ɾ#M٣JeLtI(L6"ǘH}jt#ŭEG:5MW[38קeڝK|,yٞ@y)8-%tc-9WYXd(3QC#}W#9h1 8Z#"{q)'7ʗĉ/{3K ӦD؉6D,"f8g7o/p`4+37hGI/1ypVvOoPec)Mt'>R8Z" }6m%@` c`[Xf @i7xĭ&b &?^Gف~|B⦮Q4^:p26\Hs%C{VxPxcIG[äm2)5l/GG@)aZ~SJԞ(T8 qSX^}mmDP{A_aUqķ`ǧU4]~8K/b~v~bd@wPyRk U_jhҫ Te7UYh6-])g`L [Bm9tzKrH1D᮪ Rϖ}ϒrC,PJ8alT _ _gƨP1w胯}[Mm8j2ʜ:@BSNڣ<65蓢Z U,J=n.EZ1p?wZ.md.X`4%Vc[fFJ| Crř5.ԌL<.6 VԜR#V3 <*·C1شe>]4եvŦڵ/-^I2ˢ[WltdV}^}y/jV!Mkߡ7 |9o tԵr^ieHw!0gTY0ZW{.;'f1]gy/lo@72k*7ϴ4o;Ph&zohAjj2雠0$bTcj󽘽hf&??2g\`d0r\V-!lPM:I&[G9"+Z,5Д)c&` #J-+.;HVb SBFBec@gֹvLworI%Gw=!_.-EtI#{Edr2>N>O-XL[ދ[h_y򶐌rXk8QpmnjU,/t˹ _2I/jlQbcƌ-\.yy{xJHV";x2.s ['_;I5_5'T?⤉I%30\Ŏ1/kGqՕOɋl(LWsEo.'{.C>n()ZD!l?#4M?P'Ya8>*qب{ +>VG6OɒL3RT+'M"xϤ6u{!v^P2лNͦaFJl4jrq 0^I |ʣ ?Ί&`x(QQ+_Te%`>N!U5Dh3ReΩ_" Mz_f=pVrD+Fb_ ˭P D0['>A|cCZ<=ɉ<"Hi -8iWΰ0"8Cۖ#bO>⩭*'EIsg 7Y`94ӭ'%zwِY&$9S/E{M[O:?˳nFbv !A&D:<@kh3$n{;(0JF,xKrѵ~;TuaȑR\btv$&VJ:$U',E0eէ"w`M%V0TOӔ!|VtYSg*,ƯƗ$𖂩JuRڼU,p-s0v0:zroњ]}ĨjMpwkbPt:,x.UQ %Y'(ߔs0bL}vf:FU1*֚6*oJ&#_ثJQGEt Cn0fet.ЎFP/1 *1yP+ۃzH. ?[Cí6&9"sUgUt{ 8Qs =u:wVQ9^?,F0AhLGs~|u]*k/ fpl<*sJ/3FPڒo$qrQL̔/KrɹpX SxF<65'i&Y. !գ`lj;8pZyeGZlPbT:6/w@_%`v];wHs3j,}Ixt.%(u"x@N@lb*u6c{A9LǁjD Az{6n\ tJ ;;%&2:"+l\TI,/yYZϤ]/ ` J$osaMܥ|汕7/Lծda2,M~UwHv]bmc{`:415MϻJAB-,S=cjP3aJ)/,ĩ,,!q/DYsJlhd!MowH@ *ǽWFN7Le"_/6}Nߍ ?ʤt1}F ƆQX\si'FBՙ|a0F ^*[҄H ܀iPd=l&0a3Ȃǥv!"IK"H)Ap'&t)Loص~zэ{DfgUo x_!Еk11jouY@WώQHxҒ#8xh&Lflpd|4LsFkZʎS;hVL&|'Cp;)v8Nçece=SG!W X7TWcJNޙk_ǵE $e&4`n)oE!M>R#O {IuӅ?aLEB}n@v|^Ld漣+ |h7#2 6ҶÎcʍ5WF li1VkTfBuB4e¤@Hτ=,_..{ 5 1gTmtVjQ)n@I4bw VM <_}68} /wߜYcXy9Pj="pVuR=|)̡ 0zh fTbg*ba{\}i;=}NoGO#ސly_}fP?.k7b_Bsy,vk'4%j`QXwI}F҆qpy!oc\U[dse'v1w)y-{эh*Gw$9R& IPf7{>BWL<Pl,,'ɺASlOC+pF50e` "p>B[} n~uZOPYdT 2ѿ,5˧<{;)2кQ9þZ̿q*bP? ]N佊[M,N<'"(cbR V1W9I[innʲ1j2x>H<Լ%X9p{^)N{fW=%O(WfnhQ*ɸFoC/nP'E73d\jPadܠJgfeF-i";Alyindc.UP xrݽU9pNR7t'a["-"97j9߫HZ_@R90wQ6 $Ni%ӿ'xjk5rCā?.0|PFY? +6GOHu$ wS:b`k wmݴHf%9gPN΀d؇8jJql GlH ,:y%nBgh1XѷsU>&f۴|xy^7+dž-2ܴ; i<RQf )~߃aN.˥`bD&fV xSDVlF\r}[5h'ܚ m⸻QmQSDh2P7BsHUkmUӗrj$ZQġvF}ZUS3VToK+ eѬxg1 t @CpU6bѵx??w/J+Z\ޱ%j*~&Sh|`"ţY@7S3u k{ Xa^'1^rAOHrQO.@al H0*yoh_ = c&$EkD/{J:Qڏ3C6DYhHщAʬnӐ'I%~O/G<[LsrdUYP`\o6BiaG8-腰pIFO8&F*V?ho0Wy.)/XXΪe])ic1$ZGg&i\$N!n=)vԛTDP,xLQ%e"Q*YoְuG%oFbPd7n~*jew `dSj\L3:׋A!Zu*!XUc%Tˀ3j[#ߺ{CD4d3 ;? r%3sjXw^'07#חg G;%[&WFOrQCQ%L bVM`5#,M.v n8в @ ~PmubXA@8Cr3-{̊nJu>K5\՘p/~k{}Z~mx p+mNb@$Kk+$i]B(?<hCt@rmКx2+ŲT]WKD@B=d&Ƀ7t?:*/.\l7ә{ۆA,d>)l؜G}OdVkxRq)p܄(NedBL"O!?! CIm Ni7ˍ%߆ 3v:#G3`yJiߗAO0e-$~nb`1ޕF/ y>:WTw]C=v$mW{/_<ՌXڇq:6 `*prlR(ZL!!^qL^>͕ޖi-`rDJi2X? uI(TI4NMbʴ8.# tM.ȣ&ai K{n H'C˜P f4zo$3:MeJ, ?D$W >S?ՒD1 R=IT4݁VݹڈňwJ1Wqv. 8j9K"Pi-OG7V8X/%>/Fԯ.1 X;pn .ZڸR pDF#+_n4̣Xv*ŗ~J׷11tl;y&H<,C{>!PgCF\$vGüi4| 88ej2}8*ɄuE'8whռy7j_GwBZ>:{5r6l#-P c HSײ8z9HzK^/d*jÂ;MLHm a)͙<؇4Ϻo Q1DY=Q1* lU_G?\Pl~,K$ߊ@mTI) Hs't&~Vp޾LaL2gFmnob,h09lAXpOs(My2kngQ}Ԗ>lUm[O=V7iuo^/{I=6 0'9S{>8ܫFɾ|_E02 GyK%'MhNڧ;{u~bgԍ܁CR|ھt5"LϐXxn?,MA U9}w0p R+@}YblT$1" _l(%ySÄF o"Qň&E.yT Fu5ez#j< ][-2Ud끚>N/bhlU=81!H+w'LP <:!*DY tLԥWf+[z%ݣ$Ys+B<ia'CdM kɟmM"2P<Â&徼(QPYz9845m]m@82[#.WB$K[ ܆(Mp ܊K 8ej2-X4cGl60_~gOXWˮօ%֍]"䋫Q#CBHv],4u%@8eo;'6N(RY޾GMTZAh^ufXI(謷וqaA5 (6.im Aʒ,Iބ済 n M} bh,1$I&E qj`Y2k)CKU`g-Ԁ9Ϩ f]q6P Aok;ޝݶ!ȃ/i~R%I!Q_ꟁ)zW+}("&ٿc@Q4f>-PL4,Y4MQak^$)}MGSY0#Bvn hjUH\ce|W~V I*0K05 ,KNӘ+VX!74NA2EJkz^MeE`榴-nG-f0C~M^RlуOd;ѯ1`#X&H煓F#D ?de:1eU ,ϣnb-Ƞ+?#~vtN%p>2꼕zfَf\ѓ1XqP-yy#ܥpQ:\H =(wldjRuJVU7 4"F? \P Ж¾)ߙۡ5vICXw4Oyj.k ]oȝ endstream endobj 469 0 obj << /Length1 2262 /Length2 23769 /Length3 0 /Length 25061 /Filter /FlateDecode >> stream xڴuTۺ= ww Rݥ 8ݝEww+VJG} sYke\UYd9YJl*f6n@ "5 lr4`k9-ƏH :]ޜ3/ldЙTA`f3S77H"rrҟlq`hgQb(<ތ6:# hmjo Y4- )u =[a 7''pԒaH)kJL- ?@7VLe7>oҕ44TYpi_hޘjr v`e`rs\Xim >]qsxl W?hcttI&[қoboBԴW86֦**Lm@GSG@)`hA/@˟Jrw.z[?1SG7Wh69ڸ]Ua8eSSdV|@ O"Dv^9m6 _-AߘFJK-@^ %"26t%foloI;?"+B+2|66@ U]l6bV@3;ǿZ6依>67ކ b|(0U[SBNKL_aR G+7 m8>oSmkV, [  y<V?!߈*7JRFlV;Uo`uPUQ7{7zSqX5F\VͿXX5| |#`7x˵տ!k/'k?"lLx[?O7ooLQ)T8]l@XY7\߈r[9F?t{V/,c{& k]@v@oQ2x곽Dog >C-.aa0sIQ:6?7#,ClӚaY*quW2;%w("[>f|) :Rؿl&WMX+Jihe)-,?++jKh#hHwtpLb\Rxϳ7ccz.v-OwB_M{VL paucAF<.;7x>O~vj\hrd7Aq=w4E^ yT&l G@J:}n̐ulA< Dv>⎑: hϾ}B M>5@aq^x+i`fhgm% e_څJ` jE~Z(Ї?vϽI ֆyd+ޛaP bɊr-~;HCzztKYQt.7x0X map'5C eNz SPHjHf*#f Ǝ0Ȧ-dϬ'#!CT|!h '#G /.(oZ$џEK~|`Qkf`J\ 8e W_Ƃ|ܹXydФUR2hrq[1t}g9˱w0unZo3[w)x%T= sEgsFi'gv6Rǜr$ЖJ8M%t5һUt>jD* YXFϾ0cX {,I9""xvV`m@vڥ5@vG G=mv4}P<}eMXtNgJW_֥Ott6G)ŕBRqP-Pe}bHg 8XERhҎE1̚FwFa7'`l3}md[˴_[oDn 0,e MȢ`CMabjrEk$wcnH.VaV<(4Qw^џH߳t <{kE#on=V^Rig)GXk={(v28=dyD D~P()DS%E Q 0&ɝ.Jmǎ|I5(dPP+G"#ᰗBb575L~Xxh @:8KoXs;8a$v^<ⵓtjnj)MȐ'Bd.s%f0 mIk^J̤[AY^HiӍȎt VG^_vk Sccqt<= AAjq0'd&4q9 jul{JTeIڼ '޴e2S(?zF^/+)4]XʟWˇI sbz㱓]TP pEۖ=pufD1"!>HFp|dl͸ƫEN9%DZuQaI4$V5D/bO 5mw#V%(.%c51+}x7qX:,{XdҬ r,fh$uWQ5 ޴reѸSL`ex3 X'O>ϓϑ稼DeI*Y8h|?%- K\Of)s udGDR\~avrM`^* PoT tܑI|'F[U+jJe3] QĆĤiNmK9OR`6ZSjLdg> E0s i)<Ʈ!Lhp9O  -eAREA5G©Ek k"IH1Ahu> K<4+W^ |_4 [~q{ߖ% e9:6ySP*%)>!J9uXN~Qn@%@a wQFbGg&c엘*y=M.R/'9ޓ_w<(zE,^'-%Ca,Zhq PaԹbE}+];vb~lw-|dxב6˼0G-\'/*zTS+q憾$yP$+]\{Pӡ1~X_,)5 /+'(.A°KM v'U`)"30y "IL-u6z5Ck;n%EP4D:cQb]@fq5bT?w2Y;(S8DXxrT-iΐ< @Ѱxmv^X*bjі``3OרG-!^ѹ 2A/@+}=Y c#A@B ]t) @^?&H<`|0H i ǰTrZJGW.?qRJ7$Y QmT~iްeDg4c;)_͉_ alTQ"7SG7 vVqꉊT()P10B7EfշbVF4Eufe]S@OK Q Z[h|]rO7$s -̚-H%D1$vZdB9ˏ.bU4I!lD-'3Uϰ;TAeQC<֔ːQ*cXTAWi2K%HM,3(ZBBK4x0E\+@Ȁ !g?E1n"˛ o c畳@9#JKP E>OKK5oe#,[`=8\U%\&:QfbéUr&`\Fw̠υx_rO=2szmh~!-RImTmϊTZ$$W>[h+FYbwlk暪Ty%p ϰzT3$xteB60?hgWHՑFdh2?DWBJ'f1IUaD@ae:ӁLu#p P=_n2W~\z9j*Nw=^Cڹf%.}]OiXثk-RNQVN~GajJj_BS78$0٨IĊ07&Dض{j8-@,]{8j#pɩl0XH-0CB*<,V }5߯hC2OCjY;IK"m KnA٫TҼc{y\ ])΍;gU0Anf`^O'L,DCy^hf?vx0,Z(dFjϲFzTNeE]s;x&CV;w:6#%}qyYв{ʹ//c`t<_IN,Nǧ}X}@!͚9-I%%Xߝfԛ|ayE ?琙vR943ҍ$SR;f* ]*ajgk@C"ЗWmX@S )d_t Aˑj&Lֻy8E~hm0+N2` H2p[LÓjFexU>켤5n5% +1e|iRX kO 6A7OXzٴYƮ~)<-ųC6OsZXgăwqCcٴ#ơ귉h\M"1bTɅc#{|v"zd ZhE&Gz17Ct,"ۄwoɁwDrRYj}N>mX_6tࣞ,BmUǟ,F'[)ViꨊD`-􍞸mH9@x]^W2Iʣ<%ˡOҘ*d.fYc.y ^Oբ/C1jmXyHԬ^1=1ӝjY@UsjIK0ha⮭ 4>7w '8 iI)W3C@Wyvٟ*OMludx>Er^T+Q.H,tFs/Q)O;q^ZdkVXZa23ceh~Z㿋 iJoǫPP2`kJ ~Q0>Kt+>}lQ3v'r _‰@vCXʃo.Q!75UTB ?wu|җQ/HgǷ/O,xRμf}V2 =gTR/jX{O1E#cřۥ%F2k]@6◉s[Bƣ8`b=oyñ43Oep:S XHobġ0#ESB(}ȱ8zDv]Q58~$\a1=W:M."p:,2:ʖ Qz,yQ} Ev7RK]V:֓kBnƋg"\+K(ʘg"Sw̔;ߙZǿ51bqڴk"7Mܞaހ]{kdbP첑}-ߡsbmy\ԆV̆M-*x UZ?b~%J\~dǬİd.QC\ ?DO*qucJ`,dĥ[ª () f'Lf>)RFU8 1N]CYO! Y[-3ZP&/b 8|NB"L4922ϣ. Ќu'<BxhãZMa4U;;iٶ=TP"&Kjqk[e d,8Wpl~=HYei][{~QVg1h?]k()Y&W. r1%x9T Tt, (qL1)91NwYýIZjOI3K~L͋!E>{c}.'m/trm*(cپyc&US}nʥ+˙җgġnCV>G/L鹛M4]B=o&Bq4K9ZMbQ2<]?|'y$/qCTbWoc 7eG Bn} wV99񦧹rnWK• j -OcUߑԪ]S}z6/yo?OU&ԩe^lR; ʢ5B AX1(`qn3h[#116fRD!=U HYupN2 vFOk<>Jp'@ ~ $j@QɛjBJA:@= }G[x 4qqk9{Mڱ/ԧX*6qA-?74^ Eeuvh ܠ`,n,e HGS\n>=ua L UM%QӞ{3 3vYDd`F `v>~vJdkSF2K|?8ͯ1h,y_97@&Т'Bzh k|d:&U8^ 5qn"fxϣ7yiiz ZyH?l:ѻ D7?~#n;-4zγ652CrV! ʇ] ~^#Gpl^'UNIoU4EzUPW|R{ apn+ciڊ:cr]3xagD`f w$G{q:vZ-򩎟%VGp}np1\M<>.HGgh?g͘4$}1u"녥dV} WfXFUMdz*Dy*>1C$hU|Bm^ȃ%%maExR>ky\4)?ಌWF %Em"abNzJEpdhъQPp#pq'MBk\V[bG9IXTΚ5Tg&P%lI Rz\'r;q|\YMCO-&ӻ l2, @SVcEQ[zj4+L{q(c 4cO+nF;G{'Ofo`QȂSif_2W\j|$GAϫK9ʣ>-K:RʐbLEIH|4tϿا=~jR6nROEZsA4n=LOA!vO$Iz_ ga+{: F+X+)|`lbwc!'`ݠ?ʕpw1RpEgGt,ӰbY[ۖA+HS ^) biԞlQiU]>Z h`7gLnbw$\.Z2aM.Mb\ƿЧqؕ 䰴w6D9oN;or杷Mԙ!*DDp݌PRKX_K]1!΅&ǚ.\f +ݫ"9Q @Pz\(YP.LI8J~-y+3 CyF+\<,r{?ՑWЛJFCzaKg1ʵms +L괤bw4W,HH]yCyI.pSFt N ;Sm̙3G @4717\ Nl~)6${C{B?wGm[\NZm~vF?4aC$E}w0* ,RrA:GqԾ/eA3Pb,"hў3Mf匉Q?ߞ4FRy2"~n;jYEr2Qψ7.ژԣTCmŚG;vݲnJV. "'=F4 [T$HcIr#M(?%.ގT ۥife4Tά)6u}X5srP(!BDzgO4>Xqp*;`! C k\R gf=xMi}u|ED":=vs4;!ΔkχN9ܾ䲫z5 !+}.v'1 -$y[:odGQ.U"d_RQcXٍȁ=13"EޢnsL<=PʰA_Pb9&ψ+4$5{+?,x[v쾐 [%]-ɽ*oY(S1N`217hhO.X&iő">j!5 a2`5Uxk^\}tcۻ}VWNbۛmq-%~K_qf:x(.fCWy/JJ/uV 2Q^~y15|:mYh!]W:度!F(wGn~N &=I9(i{-됱Bjc3}w^} hm'3aw6M <3k(#urʚb24iI͎t T&f`jh<ل)l8NlDE. S얎B d&["F94uf"-<קjm9-} M۪K#*8-d",P"2#b~b# ιpqWЕB16?g$}:7ԥdr}ƲvFpnAJa"ô j#$"zҘ׆ Mo^G'IlWc"s³GzmYzIH@:}ӓ TE£zaIh_MWzlZ>=UN_xu?wLP6&q(Bb3qffGsqb}\!q5 Qggi2]>ɧ'>fc^ jk5hy,ktU.8y+nqq_hO&[0֣kǒo.2r듯E>F7!gy"9;C`XAy. xgO-0ȵ$n=<l8,5޺?S_sxٕVFrbbY#Y\bt+GMn]gc힣(ODPWuD6H)>V) s`+ r@=Kg )p}̅c:z2"eyI%=:h~Eem !iw s E\N M U&!O3+-Ng?M [Aphfm!,''-qR^'G,YeR8A݈um.*6/>nYA%5N]Xc߲~k'Wܢnv|z~H]999I{ip0NS)jT$]GvյjiITb3 +˱ GSӇ4~8C OiW4&yE2.ח * ۜ'u*e$gv#Z.WVJJ]rAʌW??G?QUx,m ł1GY<$>˛LX#_ Bgpў T;,>EZ/KCT^MՅ#Czr놛tjW偹C3e6ǩ%RgEkqĻ.<(&U LZse~=5X#sNqwϥ-j: NW|bMXYɂ*ˠY%_[8mO&N&얒 km^J9}M)Ƽ<3* H7վ O@b;(x5FGo(41ڐB ?@1+%@}t=FH k+XZh}Y^E5a9FRl::Rõ<#IUEur @Y EJ#cbYjew*$w3זлZlnbEc d[λT& ^+!M6%3[8ӅcCrf}z&xӏ-wjAa$;>b!Q'EѱQX5 i2К;Y8pz{zaw.3=qlòB;B]mQ ;Au#_.> 0|: mzmȺh1gJ!hP[IGaίu]7'ؒ|3Y1#bA/ι7 1+iN5](m~gV\kKt$M-{,Yq[pMh,hʾb 4AgQ9(F.'N7~Ń#jxjF:x.=H4E^<ۀ#]9:Hux1\%z6uh| &MB\h`\A͒y= *磺TPƾ]l%½!le)^kσ)`w(́eIlQءQe ܐvxD]hH}S=W _*,␬'e1eB9*=(H~TfC>|Bg R!]'e6PzDE+L">7`gc$FzDs}@4s->~_R rɂS9WnaUnb\wʶiuN;EZ3g+6vJY}H9_sb33Ů2"y2C;Ɋ!\BMUZG r)]v:E? i-tk$~ xIP:`~q7ⳠSsZ:Xyԧ[eŒs7dCYMn>؟}Țixj6w+SᲇT07'PETehrGF^*&B[hEA-ޥ4Ew/oϢ-${'}ƧozeFM.`<*]FF{aU p@jiQ awJmD\p!$yN'=D3LIE_HPgX#O'ā lK 8okv 8c6Wund+ąYN%-uZH% ҿ؉H,F>ay ?r(AOn bs֖EA]@TORPe }= ~uWEC͕TN7G'"sY_ OyDNn)CgXhI7>#2[n3]OC rd zO9;<[ݨԸ9F[md^_q-6'a)3Heh/Pz n\DB|=o\|PhtM~2ߛg0Yæ·;N^I-Q(Z4FL Хf` $!sc8>Ԣ<^uj $)}y< n"٥{V0e:#4Onfh'N035_7y/ʵM_IѻG:#2ҸGcb3v#D˫ry - ϋVWV\:Riiofˑ!ُSľjx8uFoANTetHSB iy?TL.VMP>hHmcL`IXwk pkkUݎ&Sw9zp 4:*Ƭ۞`ſ^za{y7nq3"y<'6MoECk+$۶7:v:m۶͎m۶m[mf33QUs*tQ|],{ =㳲Vlwn?ÎnQޞz`v4h0<Ԧ:fC=mVXSZh-&OQF/@zI1ZqrKr-2j&-j0p8oכ'<H$W.6,19b2h|OU- |0[c 8@@IW% qkV0wn&Eh|4 BOSfl32sQBl(qL&lF&{>AcxBoO}XKEwWS0DbiZvVgE0/[%F.I4\pl« gɭ맻 #\OEr}ђ*=od©R*J(oM%<  ՙ│4q32g:2ڶBM)\p KXQQBNvq'<߁lE-+\BUMU߇(›OU ;1r ZEd:8m̦{]&q[V|bSrz#`SZWt"̈2mѝoutԑOgFu6_;X~tTZ uc9E\3YZ, $xuL-PgjZ QVh/;78kt2FL<ћUFP%nP*ުl';dgl1T3*hC\tu1 ڄ &]:u4508NkK #\3۝G0kPP\!wxB~Sʠ,zr2%haRx_1 o4nT/^8-a ~ FdHM~}tGqC. 6l;,) Db%r0'|]v ߅C{ͦZ V}ؙ,"")ȚYʵx%z->h.xUUq?]%R 9zcVtJ@K!qnH Ŗ9r#wi̳ܰb鰏e}اĴɲ*C޵GڶtvCڜRYmWƮ.Fl._k ĩ%PDcvWOAd"3o#Qf:^-HazBꍘbO8) ᾊЛˊݔFv-#fߎv,Q5*I;&?$X:{ЗqˋC=5+ Qv˱wD=w ڴc2ž ;Tŕ]4rIr0z V]!xݧChu2$w@y:a{oieKBvZ9EO'2ց 똓ul8ϛÃpܺV'G ;^-h;cI9lwz + dn\)Z6GE/0$[mC–tÂITh$Kk/&0ZɌUUgA2I;$~Šтv)u DΤ=Ϙn6z\fy_$-e =TT`p!m0F .Mk>+Ϫ,.RB*ÄxdFLv[$pO|1=g5*J1kVz_ ŗEsOQƼ#O@#` 5f/%~snZvv:H:$g3AvU?1UmRs!ˠl8Wl;yz׭F`B.WgCQl RH9Ȳ>(oa[cI-7!!9-2n4X*,n 3dXUR_LEjޛe@p۶\PM|7XQﭿ؀ҷc5X]:YVL: 'ʘ0MH 3 -Zf,WOU'"ᥥ_qqP4H5bbzȾ&OUpӣ貔,adk.!1zh^Hhl!L ,t峯ڿ·E#㧶O%)Tp af0uVc] Iya2v7vNl;~AjK\M@1O>kyG&2sp*VA3hOZ4" yˣ߽Zd|5@a)eQf5/0'iXhzQ<9oD=C<U\|V=!z2(f=Eџ7/4uf?R@kf{ySɓi3QݟVU7Gt핳S-16!6왓Q&l"",ATjiEzo 2JOZ]GCU ; `%: JmH.lW1j[})m:,J  ؎⸌BG3rgzszҶN~i^IX+Hj[ U5^Nqf^Wc]W^t~ZuOb&ͷōc `LDm8mzT0*eʋ_jᰢyAU򲗫g"ȳw \wA9EtI}%w)fJ%1&]+M^*GxӰ !2"@iˁŠ(k8V_>9@Ӂ?1I,}'A<֙]ԲJ iM:bp9Q 'dзst/:EeӁt~?y4:$Bq ! 桯oa  qDBa-[$(LDj`Ou$V8J=-ԉ 6,' PZbK=J9lK)|d,TRFÊ6cْ8 BS;:t͒~ oُ$o m$2X~ֲ5r΋Ʌ!d;1%C>̐lW}*p%A=jrnΒ{:"Ḳ}m vn|Җsw'h-| ,H@"ͼ{T0Җ7}4x8w [C!v*q:ŢsgLA{0"# %jOQoz4ïѱS3[d6:GGBz%?RAcNɾa"޿S;s fyFl̀gbuO10O`$U^gt{Tġbvkh"ك%k˟`fY3d E/VDZj"@~[#Kɨ$ NѠ\w}r@n:m_ Oyb:j֔bNlr#k<Khtt =BL,B81PXe _Gm"?CnwVQyys*rY_OG ǐ'Fx@.c I G1:TT~}3-eDVp7Iw+US@^L~%YI  ;hQx"=" (սϒ?T"tk CQwx`YD73kۋh'MHIO#6E 1oTP2#0*Q 8'ONsifxЕ-WGY g}M[Ζ͗/uϣK1| ? 1$Ue\)=:񁷘ʿ,Po^[^O4tiB#8r*ك uГ/ y\Jl8g} 2y_҂;VKE]2.J{RԤ+\^%#mh$R0EyڒOSn( g 2w?'Td9d+6rqe@_'5VvK#P~n,! > ŝ* O̎h!;f:R$ 5m a%Dş|Iڈ'ZRC ҫs0x"W5M) K`n=WPɇ%FBgXHST}3gSE}jQyas̠XNoyt9 Ѯ}[4nog"rK,e^2Rpdm BK.wbꖉ}8d 3Or۞E9.KV # dx\W鴿[0@+(:eXl_eRE˗QF/JUlruU!+|3'Ek%z̺mML&TU~̣ٻV05"++dWqd oo@Ź@ƞrI/.k^*]z;IJ!,S/SjNDh 8x ITO^B K9]QW(7]s ؄_׻OloI_cmF/]{j }`QOi3.z;)i!Iz5uULcc~3Fpa40iKjn@P/O t0,5 cZl˓E[H1 26ĿoEG`z>t>$y߬|󬭦2VȐhc5Azm]霂s[T+xV[NXV&Wt5t,2F-T͎L!m2`#B endstream endobj 471 0 obj << /Length1 1757 /Length2 18989 /Length3 0 /Length 20151 /Filter /FlateDecode >> stream xڴeT\ݶ-ݽ@!8P[pnCK}=Vj1cU%Hڑ Uҷv2X9 LL" }G3kQ}G7 oj`fb₧|Y?F7,Q_P#(88;|A&f [7{3Sǿ9Xf-7qq0[dr6.J35doi 1(*JbJ* J4 lmm%etQ!9e1HUEI2:oǿbB b@ƿk {e7G?Ԧ܌... &N 6& ljp|\Aq67 cfv ʏmǿ9-pWS}bedVf֎ k}kGG}G'?7D֐o-߭ |LK?wL߰6v0sptWF{{ffNVHNR\LI^x6X38:7 7b0}THk}hcYEɖQNR?T39 ;ДoW `o23}\=AG{'ǿ:~cX.iml6T)5tl?AϜG-q'KK9}+B~Vfn?<@{ҷ+H_K/}!kK/߁`c0q탔 +?&0ȪJ?Mзwg3j#?\02X8~l6 hWdA&2G2Md0 `7 o"DBn{ J3 u #+9X̌>n"ho郏뿿i3J-,lA gaYY.lg>r/'5xMBQr1cKB.Nfo}Өmd$ ),[+&n {z f2.vIejNƶTFEڻ"ѮɴJ[Ws\ fM讋`OBK_frGm{0uL9Y`eQ*N4ᔬlx3!!㋔T/`] Ql.%"e$/uEl#剮;1ʀ3Pۨg]ruC1WۀeWFW|1`[ڕW/ 8_6Y),]G6nNWeNÉ[ZprKx MKPxbb$ƅԌtDϲ"@x٘}j!g %>Vyj_g&<<$o,I@3%-BK%ik1F: jRd$&+; 13Ú5TS{?󰻾ZbA~|@I0X\l}*oCthޓ $o[?]I1ƙ7)(uVq{p黹Rh)nM(n֠3|F>W=!r}: m]ګAr@m&d{hvLù7C\Xjɶ?[ *ܺ -ٞ@tHG[&iȧ(}U6coE2jz\ehlu~Y0\ע%\t.t֐!>^1|FCY-_]prQE۲_j_EXOj{vdhR1=V`IK'[DXҩ\tRxG oٟ/* i"x6u&I>jK׏>m\eڨb zx"{>I9੊q:y"yMlᄔn:Yh=]vOS[@V̸Ϝh\ 4}uH[#K{!?FM\aw\qSw M^1͞fShN%!}}4?M^OjK.xZrLv0DXhP?=߼Hs:8 tF @oq9?Qۊ]vݰB&Fd:ux%̆d ;K}C W jL%zݟ ˡYx<,-6J*,)DO*zNYLƚJ$X /:ЇyJK6 *iWB 6KWydp%ˡ+2Mgдń;RnU G0+&}5 ;RFy!ni{l¸0Z;AC`w4 Xug.11c\1b骢>zi~wBPkdM(Hukq0a9{Lj)#YXRNs+{`KZM)MY:wy3ݨiO"6>OPURqF֭3֊@R V,[{3 벖0l.8yNsxؔƋizY꬯$hdBőm #`k;Mr[:mӍ=kTu7"R( YC*F>s q;74.ίnSC&Gz<,WJ@k.BlWU7 ꣅ%d@wI6g"ԜI#i);pj=y4h1S%z+[KqͱaRGD ѸݙddR~'յz͈K5ZZ_[-{-8/YXjT͐oO *v0]<ļ ?~ذ QƅjѬ j=yˎqct0TvWٴ趄'j@Q$y٠&8}֛bءVۿͮD O쐝o$T<+%Jn>_'7NJ#: B/Cy!P*:xl@U11>0u6:ZH$`yʵdPJOɬ4ƗH\' xm2T(moÕ 6g}+ږC[plO9]Uay :$|7R{N>+t=ZQaŎe+[L/ݵoJ@BY+/HQZBFJ}!U)3"4o278$՜(}Z$%n@#+7B/h/n46Y~w2dt;RkO*`R-2,ݭN!)M~YЕLuzHif_GT{[ho^͡yKJ:\Cy5\k-V<*\C05Cc+GyDT"ΙmJW?Z¯3P<#̺/?WXښHWlUva4wQIwC,5:VX+ŽEz/wG (H~LE Eb:wTWLx~Hpҏw=ţ\,&wB%gLF|([P)4f=`Hj&N paAFQ9I{B d'dZvJrї7Zk7+;fn$C W 4:VJ#0Y+7" AdԬe./~6üE׊ցC*Qԋ鰺+--oIZ\ |0 Bޕ?xo˔utb1JusOϼ eV3a" Ȯ[Pb{G!qiQpbΜCo'gjȹN-БEYppuz qi;g k#uJ )i Ïھ iKj2\ΌZpjYx5ȟ+ MXO))$حw+҇8jR 4s`UYϹգ[y`@g+.E2}҂;/;f5ylP>spB)tb3k~ XlkU|_RYlA ZJ]x wYp풻ed)GQ;EgD7[Jdcci+^5n߷&?>_?<{LN yZžݓKY/ǛEp]BCaםc {5^PWMj!\.ީg\{[GauLxDMqzӍͣ卺rۣ7 ?/85QrWk&4Օ^)G 3|ec$}{Om&ˋOChc_ێ%"P )ܺb]~M {Yb` 񌽗GH6v2z͸ |t%o {94o_7'\>ݸvZ#رWV ʘMঐGY}иsIT=0+aO &-ۉ_h[?QYN 1!pf6\x.iTkJS,Ȁ U-)%﬜j.hԃNMi@ vLNVZTmf)F[8mJv0/J9OS-%$(?6΢T3zg`}ȧ )vPP{JJ'9DWՃ)wrʔ 0$;?JUZIQ[OƝ$݊8>͍51QZ>B'/ݐͅS?*qgm Hxq69:Q &s 'qЍό\E9~/G}xusPN(^2K9MjX9()HS,9_Ǿ,{<:t,'SXߌ&'GSv:zbܨ#b4;*Or weYLv>okPt(r jE (J暪\_۫ Q[ qE*?Mx5K^?+_@1?_ Xy*C٬[."{Qh_˞!׹vɋc/k7ڙIxr:Ccej*]5킙Օ[V D$OR?@12M?$f?̘i N xJ08pÜa (\]RP jn ƭ.ڢ`{wόb47QT!?a^@YhD\'6luHK:+=aA1|8/ןw(It'n/V!KZ84R_"%TBzr[5tD.;ZBg>ǤLWPyON%kqKpS %Ax_;x U|U׻6t-P)uհsǫS&"b%Qϟ|94p4HkC޾.f Vg(}U,B Hq)q;;cGd0E1`iό#T0i\S$WzrpQԴ,_,܂Y2WV/D۬3hrJ/sv6H D2}i2|yٺu{ׇԇQXCK]Tjz0P<+`>),48|b[N<ƙsDOne*Pg#NȲHGc-%M!1؈c`H%-^EY5q h` jVM,lI*cʞF ɪuJ՚yϋ^99ao,h,1 ?)HBpZ Q M͒ٷ!nytn l}G%e8Õzӽ>Ϊ*&vA wW{V1b/ԋL ҄2Qwi6 HAg _nUmDT(-#MhU4RU/]ØBv2>t(u7ھSijs DˆtFy2w'u_[ʝsdM D,gfz tg{\8}|/H1'Q|&(F;B?+pb-@-%km *5 qvhZ1Vƛ$Zx`1^LYc:\SSTэOK I̯_=]ZgfYbuSߪ$>ET<rJTRd&87dTY9S0Nx8t}/PJe+ݴF&5M+W?:@λW@e.JI$^&jW9b7})bO\6' y3DBLs\2es}+8GOj1,9gϳW+$B} m ;tFqwyr3x~3 \'5w|hoµg\'u^q?,U!c u'"lj0LKE'?]dP^=NIxU3_TJ{>F~n|D˼qqbwxeι@%(ܨET}o\8rqAV"p9%1(Nt'}EOIM':QcDB=W^CtϽa<^<eئ("УB[HMűжH͛2"v6Pa ##{-%/B8΢x|y-tN{0+ p!^b;^ՍW.&"9QGRYFgܗrπdĨgSx X*\LL.H1V#áϤmZ+m899B,@ѝK+-Q*~ڟ3BF6g&A8Mٙ1a8{5<8 oj<{-5.ۻ(~1kP#{ 7+7R4OZ.nfjfmԗ T_D5- #ӶdNO逶~6=:X_-ds9+H}Dlks|*a }M3*…k(Csdm_D)'.xyHqj.02г零@6dXqm7^Z̨ 4#t:ϖFw3Jd_(7O6`7񭚣'9S_MJpH/RJ*<.XOlJ笒Z֗%PɎ3[ tGHB@ g_$6вoVJ.,&pkH_{R{Q)zp9uЏoxI[s99k` Z˒ϩtKacY'M:7a&= Y iAI{P*GQ\;5h]"ox>B3:eE%!{Oȹx)P-3O[kw-~G$߮U)cmT:/R3Tnx8YކoFbܹb7N۔I ̞WFoYi% 34O#sg=9k%fH"dWNd"ɀ&EG+vLɆiU[cVag6{d ">A \PB['Śy܏qϧUtKNȡ%MJ7qнk`xXXEkZ'Aʮ ЧE'-ȃnLʙtLJS's)Ϡms6[[mQ;f|wi=Hֶᅴ[ꋵXX*)I/WȤ0SKP}aށU*؟lPI-b;`0cEz-l8 ͯH=,YIYC'وLS\D`y@qv6Uύv%&r&bllT"G*Њ='%~N:_΍ xK  $^y>(W׆hy eaYB&ҒUڀ(o7%U TVdxU%7#etX|8j=pGXO9%0`[mt$H@V@: 3q_D-k:_2G.:\pK Ь#4-B%To׶iM~o+.&&}J #߾t f^1iAJYb_t=2?S}~0ѯgzVJz1[mؾ6R?7%Q!~dԫ _JdƏxfzjI2謟zx&i_pBaXt5v"W-"4v> ƻ@v A3;E"D#aWMaf&Peoo5BrmdT>K=KW]g-lZ<җav{oODXSؔ?kRm6JvyV %Aڏbi#eVح~AXU]mtzo~&;𫴅H؍  aRttY&OTMF[xCS˜%('IX6fﻁ:ʃ?hX~ZgM ,?!fֻ;s#`e\cUa:Ή\ַ`ypq/Fy*E:=K4.lu$Ù0iprZiMbmw-HAXw5b1K/'ɬ>_i #YZ[>UV]y;/SU T˳g>(l ;hE X-" ^]F^iN.w-!)'Ϯ33"67F>g$,0X>ڽ(;7R~Ui,Ϭ6~bЖ6|{ pD4v&\+gv;㯅|Q_&jvGf4ڟ?&uUt~vS\Dv>՗> /sATӪa_XK _a?k뽨Apt]~]z {>9u.}om29H:e~lS/5bʲ"eq_Dt`(:+]IH,T y"l˄|6拿((?~Ҋy2b#3wȱx {Z+dBpT ϊtŚ-K#JcR^VEhwi)_/ #Qĭy>AWu܆T~-2v(?~$dwO]rKs/8fmJDrآr"?xvtN_?[;CgtKc"6$Ćc:[j\M6L֒"pVX|6\+&®HO1F}@ܸ,2+2?'fC4w a#h[g&Я-39͇4X̹=zgy*%Ԯ'vH0-R;/yWg55V9Y~68'[Մk)4ask{\ojaw=={ 8ZЦUj(mEᄈ_mJDg]'y=NN,2Yxf4pOFЗ:NgڪT%-w{\),9H&o:=i[@V^%T3> e%UNtdj8SV͞ zExhQp@bk'S?L41߈:.[]pPՒ>w7 hߒIy! }JX~VHAK kU18lz w܋'1*䵠@ͤ޵ьԔqԇ{CqC: b!G uK.Fsş[p,}ba3:V-z3^phgV gaA'i/dV(y&wKP罉w hh/ 9BNPb{e(zaX ,/v'4ۗgBs )4rM@ͪ@:?@vw2-ńg% ڗ]ia-]'nz ޛTv2x-:!i#C&od( G B[==nSzӴ͌ 賿Xqw\[Q&PHHK|f4vK9TQߠ6'^v@|bSb֙'IN,5LkME)[uw"6o:nqIz"ym8LSyL,Y{62iŪBS$zd$!ZADo\YY\͵DCU%LYд>xr k8HA =. g$p*pLw NljSm#Lgw̵xxRlPk4] P QĒB,97bGV ,`1 +me.q d# Ic݃R-W&b>hlۈ9}P,`E'NpT&r?NL"E6H(7ը\OQ-$v%BZB-up*>9)&|9]5"m™.&,~[_`#ڮ'N$iH4Ma*nӯd T"mL68ߙ[ُr_7o9T$K4D¸ID1݋2"B!E")~'W5G_RO,ڋR .v'4ۗgB|E?jMۧK(!6pRMv8XP!\yUgҽs;M uoFC N݆Йk]SPݕ+$K>"(HhEj1H6KO@lK+z:xX |ap)wv agj;(X{׳VLԕkyߥP4S%hY"0 L&:u?k-`qzh R7{.j9ɚsj73pȵ;ut{~Buh MH {%/^ބ-7=lmTOwE9!d@fx>DZ[C0#E!V:"~GrwBK 9֏7xj"=`p C#vv!WB{tz!- /EJ}d[} .ҹJNq}a-nBVJD] 4Z"+wxP~AE'KPwH2.Hw Γ?}Y2]7+-ɯ 0Hw}PBGӢ4u=WRb/M!-T+E~I`!0Į;#tx;4 ӸNnZUܷ%0P*]A&OJ2JJI3%e]}v@3:)m!nuY05j~Ky/d/췺,:%Fn9)SFeh`oL`>Э M0B \({ endstream endobj 473 0 obj << /Length1 1757 /Length2 16583 /Length3 0 /Length 17746 /Filter /FlateDecode >> stream xڴeX6S]ݝNpwZ8) ݝ};{ɝ:s )P WP3qpebP2vvX)(\& kGq(>B]<)h0(A&^N@?+ tv|9:yX[Z`c`o(#@``eT`(:z|(ԎShIT4h?999W/bjRqEu P Sѿ%=@Q·p uue g܁.GoP G @ '^&&FK7W%?[Y<]lO`?ỲA2@>i/w+X+,7vL>A& 7W?7М_ bn..k(E?Nog7foc9:Z\Y;SQPSg : O?9,<J89t >q@.^L׶>Woa`nys7'& :P0r寚?'G'+q5q@.n@?7o `nm ǰ]/G'm/ P34Sj`0Z3):>AϜG-I7;;E{ B~&v^?<{Vtt7'\df/`|p_``aR@}0cX]^V} d?Z@o&E)mm%Ú$ͭ,/x*rp|X>Xm+&FGG pt{<<&$fDV,&L&\M0`r?>߹-d5-P\L@.֞z|d*@?oѢ> <~+_Y. 4_Yr4 Im /ȟ)a<ԖZI & fP8K'9iSbٽnM5W1W'@dPX,"9)fho#httazGN!/k[˅(\`itC\F$X6Y7 qF5Q1E$+2;U X~mOp`l1ǥxK8U7+'Q6#R|#EZ.cTxŬnSkC,-[nRcgYd4̣,~(:b>шc{a N#% Yj" 决iwhU=Okm"C{,eob/D@bjO"oUݣ(?,ď͢EG̰jL.U%ej+W?{t7'\G؏q 3UL7/?$.ٱq/nbS~A3ΝuX3`SâP $P0D7'{Ӎ# |cKph0= wB6~187n['r ;o)Kg+;ib@v6,kOxC#U+Ȅ4:IGb7!XWb#*$PZI_b礇kV߉ĞёxJ8eV _W:5xҳ;/5532ꅅVRufHx9}IZ fiy -̝7䜖s\\뼢>Ko1\ rӓ~:}3ije;&o]BQ7T$ ^e0 u8qM)QPʾއy`tLȤm &GqXzvYҲ#HeMʨJn֮Vm?[Y/d:Ob#F_& G!dNmHfc>}33<4 ] YnKeͦՆt`ީĠb6[ ]4nq~SjIuiVPsXA@>Oȥ?j ʧD}>ƭDTt"G n..R/CͷNkGX=I #VNm#ۑ?j#W>Jh',tt 4l,k^8#pll[JJQundߑe\]?`dU"w>I#z/<G U@ps n@R.uy)n]1I8 :S$V,oj=Pg󫥒>M&K+w 34*Z&Ėd͂ x-ǾЫiYʪگ#MELh'_MaA1m]uv9WLRFkRra+uRu]]97> Vr <zN}vUG4~FU/6_SB1h($ړj`N)#Ҏ_I,}x2((ѲY@Y_ԒP#W,L Kk1UDmu[(('n`*&d,D'5x)5g8v4FPfL\Mpg$X|L?"9'}ɲH gf>:uJi8ĻrO^e6y[[v0uBy҅l'"/Ilt *MRB.ݤ1yLȑo(Ʃ8zwm@DںRˣˢs3u0\6XyLGX:'x<=(,$4īS&ܫqVw?(-5gNF4Zi/NI-# !BNm}U{Mڬ`MI٭g v.)wu =LOu Q e-|/EQEocr{`TF7's1ρRPyg: S|Y*O3$ݕeD?wPo)40 @9Be'.7uӫ0i)hTȵ >Q%J}K=/d]ݎv|lD)R}j1.y{IƯ9huDp CɅNoSS͆דޟdRH=r49lЭwӿ)9\9p@HRD#=%٦Ww0k+IOcIY8#4Tc2{\H|pÒu;0EFgjX~2W+N5pgq%;|ה'' EaQ.2Ӛ1`HRanSsM]* 3_.+e8r&]( wֿ)puV[\fC|׶YnrKFYuŀ!K;* 1q J963g#XU8p 4Lkpd]Pca3-VwxZJD[K킳ec/r s}.hU1@Zl)\+6@% H-Jۛ~{ nyyP'zcT`n›F)B9WgN.;: ~Fѐ9 U]RX %.&\D\bF钰 ??5EiOgRڋZ:SGŊXJ;߉NѮaJc׌@\q=\P1nܑ*7mEȣ,}[x{Lxm&.2onV5Z-Qslβ# )\n¡&&ĩVy/a1 S"[M+2l󯴭[=CG`2ٜm2Zڕ*$ٮkK6B#3N`Zd@YVokuT xF")rX)D(,ORRtkV@v^5ZO%>QpHX& ok%[v 9h‰/?jtbcW/~MLoڶh3DB6sxo4%1X m4e(8L䘤,JhL2)ci{> 0[4wfe8P8٨ZJ /OG=S NRc"<# =dq։hNjEnN<sèuY<V\帾O0ƪ~ZO5C#f~#`;17h/=~زG7d,eb\ ŵy'_ԷxxvPȮԧ 8O@yRS{0ى9ɓ;{IN/Sw=ޑX0l7Dmg].8kWnZ\mjIe N}阃?˦rpL(Llcxwpg~ AbTR绫 yGnk+Ft,WY A"7 n"V{ˡҏQ2CV_y֘;PR c^+i Q8"3*HmUyx"x.uk`){,?.Ik2ɂV]ƓyC>`F\E>?^"-RTn!s69ѭV^gAIT4q2ryV_t6\+=&\L"oZH=l: D 37ظC K [ZS$vJ j))Q ̦"4L T{K 9ء0喝k©5x*͖Ũ(t w,LRDԹZ7YwBdϔ`ꯞekM>=uOzrhk/H_3peF{cq+BH0P@(>DX)H5sW$ n:\^ I"Xo%?`ҮoYDgPOߑz.ܤZzxzW2|x][eoZW;#jF~;$rѱDn!K`IYOs2ٵ;7B ?YlJo]]} >A򟪗ΐIs/"oʔYG7$6?jM+G$RorgJܻV#O]sS#qB8?Ol5 ƞ[uA3Aurrˏ\ Ep%xܸޔ|do"ལ.$8/3$_-*6c u驪!$|Qme5#dn GpH y[1٨4$njFżpS$A͵U.ļ/M= f~=N]3da*w@!,k TTB X]'ZoH~fNAq~LG^\٫b tXĉjao1_ХmsT3uW~'!oRSɃ=Un."`Z&]bn}mV0rd:զS^0-ڧ3Hr48h=nޅ5>USp jB\_5a-((sPD'y]lk&)]_wc$m?`hY7eejk4oR~2Ϟ;苙gQGW׺ьp+yjIʡΆCƓ?-3\!-ϴEوIbG"\DgOH)48}8*;.^}Mycު 4ƭMX% ^xJw՜uub*Zw:salr?|Oڼ;5yZ"?P;f8?Qhcɷn#[G6z\\{_OwLq$S7171L9Խg@h6Ĕ bsa $H;v;e&G㓲EdȾq5ű56P&Dr.N\(aച`C9ȣ5l+nwItֺ@<^pݣYMI$K'0v<[ؿ0' 1τ-)獶o/࢑[T{-kjYczP5)IZ3}>t| 'eH4|= %{q'jdQ p+jp[i,`_r$S,u]s2BDӸ%\X”.KD'łS&U:݃HG K+ͣ_ɧ&Ml~"P{Ԯөݶ&0Ad,)pYƲ[;X3ɞPДLsO[8E\?Y kSK]Knv4 < {~u Smv&tgoe !PbL'`]a{?};Shk\J㼧BDhD)7 F]+0ٶI!xc핒aa붥8>)sN鋰C6]/*e6jENݗzgNgTDد!=҄r py*.ڠ&djlUZ!bv |Xj3ׄ.:kB&d(5 $^9UMt#1ƅtԼrҏ ޅ2U wy"9Ts/EV/l ))>s|eR\]Oc0+moXAŦ}d t3~';g!]%.28aauDG3%S>3(XzҬs׉bx@f%:G(%B d&c Aٝ*==eI: mMXХ lbOLeXr腒<@]tHr)& $ФMy~30gx q:z[hq/11^ /= SR^aDȦ96C'V 5b˳wڭo;&| ;(VM7qE:/hʹɁY4lLdǻM:u.ѧu߅?\&O:G46*.)4dԫ`(~\vjLyty2J$N[*Q7duVi^z7?F ˋj^hEa"fut'o`m6u!T+_繭`k2]j@}7ڈ>u%Sg}v'TF_ZbǨbIms%S71΁ژ'Sifߵ˷c/ē8IڇsK!w/R:M6r4]క|U" OlElizh)$^[WR SHmk?(7*8:#Ư KVg*fBg@V!0ؖr(USc@ۗ]U_Oě&0fQj_? Pɠ{&L"?x)|ySϿ7M<^a[=#͵׮:ZnjR[DJB '10ujS~r(bߙKv P!*1~K*YKZA70e3=Y|t6ҘSu81X?meмI"ZW%.&+A},4hD!$Y'_Kd%]C$#|ϑ<%9v{l$}14QW}}i HNy%I V"=}j|P\Uj/ Թޥ=Jxz˽ ޯ`D7Fܝ&5D#Z=5X\vY{OVe#׽61_JZ7FDX+(-7heQ6-)@΍Uef\Tꌾ=[޳XH=< ?x"w_H}6Hbͧ fz;̍(uu|fΈ;|anim";Rƍ3} yN=P >I\̀ʄ?O dD qm蓇.OZ ѱ_aC !Wη D}~nL>O~RKL~ ;Z e  Md ū&ߠ e2|G3 ԞX$ſG%IqVsKh4%C9{}i*,ub^UzhMbhn*لF6'O[wM1}v7^E%Խoȯg]&TNLķZ65U[/#D=je4[giKrꤗfx"MKUE6P#VXȑ"QiSmjt:;]1 mu \8Oe:/?:hEB=Q{7u?(+‰aMдVTd8iÛu5sZC]~Ra"}c5Zv= %+agnK{zKoع/SR,oКآ򫞭(t|\E^) 2nq7dƔOb6xu-$$S|iƫݹi!14 =1sx4ng6} {l\r9w+OggW_RXlRo+#1;W6Oe5%01BG" 8wm Ffi$wq;K(lNx桌 nK갅|+;Mq~U+kIwJI+LN ^R?[9A:Xuh!<}O(GߊUrRvjEr97)N?O/'LC=IW fEeR!+YxmU_3#e&e{. :UPmW?o b]keYІ"]K4ZWD$92x1LbLM? ܴ!Gox05r7:S-np~V:57]UI;y45̓+L9gh,Qd fv4]tOx0m`P:.&7^:am@k]0eo< JnorBesh V3&↿mU.e\tv^iqTN%n>i%&E4(?l ep":b\gAR6E(㜬gqdR$f3.B{Uja47zbfyd Pӵ5T蝄dRtHn`Bp\hfݓzjP~^CKsd,y'V(395/쟰$?!00h qLwp/kH/F2`d'yLgɊ#KeGҗU cm5ے}6!Q[Jɺ6+L./:sFB'&.ՠ?ϋT⊺kRŵ乿i~*39fO[yZBDO  vN OR {IoMDr$=@!p(Y(~Y§ y $t4vYv9e])gHL7QՃt_qvdd61jtzd=< \ޑqY j(4NLv;zu°y1ũ^~T E>Ti~@#x/քĥl<^bhtQ2h-#9^|Y8ھ2XP̘k=/ Ik>: ?ԓͯn.+e[/!?n<4@)|E/cA=\3n~UAZ󨚭5X\ JH P۪r8mbDC`;Rfւ~BV̋vT;ϙcD&$h4n &R%m,u" GVn5}}Hyi13 ⩖b/ Qˇb,%,Mv}8v77DV57;<߻3i=!kEk}$E΃\I[SʹF:l6Uru%WZ2LY6Le^ںOqa۸bFߩ1am*Ѳy1͈*H"fޠ_Oz{j'λ1}{yeFNODn+`R=skXHpڳQfh>QySv ڍls4z\(%$('Jh>(Yॷq VU4図D&i;?8K.[*O K#2< rwpd 'CV߱XeY$EFPc^j>qd/Ǹ %P뼅$\TMG,{ޚ BL`T$+y"8ؖo^hEdeFr}%H}ǬCfpP'=_&PU ˣ_;F>cvDgıx%7Ԙ%jB1b .k'*UncbtlS;ՕTATlѠ'ruN+~U飙CwOMh@ ` q?TeuevH%4/Sa?]GyU,"jOI+CƎ'1!{Xb9ZY<9u[Iّӵr_Z#x3zG! aG4q R1E2Hۂ61iw,DcهT.m9IҨk=^[7Z}nhM)x2#Pݐ |&cPu'%Eǵd<!7dflu%/4 'z+!N7l %ٌ& GOMnzg,F\ae#b(-ZVm6J]G@1:)7TTސ(0NTlK>D)zE0(a{u)@1ouŨ/@SC!_cN HUy¿W/UyV`DX`l}ڝFRfaA/61`NVL݃Y6ýJ:2j:$`*VK^)݂]~A#jܩZ TOraؾi- ȓ=Rȸ?]٣7"^\V48ˬG\(: FQ?XAzZ\>=[WKkR&W-T}|$͜nV*VT`p;TE7p_˻%F]GFf-Yڬr]ޅ` lN@Ɯip]՝I\褤Eb=2F.C>ZUpJn) or,.rAb-}=u@ew-kaq3+#k\yFi `!l'K+ד=;[mo_$RaaTT7;ҎKEwb3H<i+';{h Ah<58g| A 0qD|n͢0AN3/!o#W"SPoG*I)U( ctǢ^S2ߪS س.͕]iDI_shIR>-+|a#S_$A&݈.`"ثVS hpG]'&y endstream endobj 475 0 obj << /Length1 1608 /Length2 7409 /Length3 0 /Length 8229 /Filter /FlateDecode >> stream xڭVuTDBASQRa``aFSJFK鐸w9w}ucx]CO n Ð\"e:.0 äH@l<<naaa\z$D4մYY0uG=`pC6`|P  -s TQՕS0*kd00:B! "كpaf߭sc`b؂6{o`3@`-~asS#A-p_UUJ/HK wm{}74~'vsE!0{] 0B.l?4!01` @los{:?B]' 5湯 B׶p9/o`#g@Lw 渜p}IMe#Gw%C8@@ܿ0E7m PDm_ x?70{)8rBe `3Ud 0Bgǯ 3#^?cs-a Y~]@O 3;{yQek'K^u=C nO7- `l\a>aSl% q724 7'H ~9 -`3;=Y%$!KһI鷵puUhdyÛ MK9*Enk]oެɳ<26gRy1f=gd]4{v0'흚ѧkLz^97cgHJ3ƎCֵi8@2m8 t^,?@ j,y}Ԗ/yC@3?(y I{*{N9|M9|i+-6O1e;%ͬ,߇#pF<:xx6q,4ue( 2.ln~ RZ6T23LEbo=T:ꁢ>Ն|*Yq)LAKATe8)>T:{Wf|K!msޚ>-xcCQ.2m,(Im%KR<=y ewn"F %G9D8@knFY]r7KmaK-MIUx/xHц\Q1:]z٫?rӷ}9cJ D!s/Q| ܻ8s2BlvKGft [{MSIpPJ E'AN,l'm::"1,wy uݽ^# t'nDYXr>]HT%%5y:˝O#$GuGlƚh྾J chʹ0(i%&~o!Bqd  ;g{}aQIkxRId:Z"V@G*%v܈t~J tƤ{Uv:c L1qk>{8c~|iLFEStֈٱ+Le&F8q(Dꂜ\?R@RV%F< Zc11>5qo++{z_~$[~  2G&z'=)lܦ nak^0jԽ%$jCe(ч#CIUW]-TqFc H9a ar'<| ҽ"7]cr.GIR"ehOC~+ts}hteiժ;Yטe{v[=U.Bh%ӦCQSч ]1Z?T\K+7GmJLq٨ 3%WAIhM"®Z\|wߠ"~cBEXxjh˗Qpȋ:4RkerKY<Ӏ/U}>QpF}($Y[4-"YQi'ްcA)vg4JǶIqtq7&8M;RZF!3gp@yQQS 'h݃2北銑Qh:6YmJlST+t!ξ@ZNBXߊעx6.,}<3Gڢ[Tsb}WoR}HVaȩy`K^k7̗1 ɯ0$f8r4ĝfUfLfGJBU@[>C7a#YC螆- % y* /A[R`|f@"쌬&ݾԼ4(} CUy.Q5.yzDgVteN!s֚@bWhp]᠒;ryA"2Ob_.8$5^!;+uDbJ)>޳t+fIDxk2cMb /Ҕ ^/V4.ʕFIsqgPr-+3vݓi('UN^K_B GZcUJ'eogrW.j/OU0W)ʉ|r=/]5_7><WZ|Oð* #/|t*ͭ6vFx~Yk\>dxBwTl4ך&m; 7J+<{EZo7N;l6oMh\voь,ɵ -Y:W{a\f,h]Đ+aZo ^[I{*̷`I`\P]SӜGIDZZ mb[w%錡ydyp!(_ӭkױՠ"pMˈd0\_zʃSfԮ~ԻQa|)8yl;NUxsjz4%?GMz\R@6'gCRQlI-h?;`1,V;ByQ9Ş,J2sIK~ۧcʕAF^sϸ;Fa6|vg@.6 d1J^ l}Pq ~l^vNy9Sњa?;k]~Jh>C9K 3jӛ6Od5fCԃ//(p*3Kg;lI;^>f8B4+"YG#nJm'W/p-, 5GBŶ;޴~F+ƛ~U5dA4MeQ˱>E5+r=R~L;=̾VKe8n24ңQ GGR/Q_-Zt*S1cMHɔ|ӭ=uV9DlDe^mӤ6H]LQG~َ;һd#c\FJՉR,-eމt< Tgҳ75Ue3+WUN;Y6&_\G]c/fŞr2C/G2sLWQǢ®$/j^#7^ 6v'cM!U,4yh]%hI~g.,ihns Qn“CvqO{QړK6=TCol# X,Z?<8ǢbZ ii{gJF~UQػΓpoȓ7U~zʱiQ>wt|~rVu靉9z¡^qWx[C6Y.:uWKvCts7v_f?dxu1߅,VP)e5K`S:g>ZBc2WfU*r0P{K0Y"$ɑh(Rm }}Kmd^aopTI)^#&h:Gy] &}-m,.B5'4_Y N>RZx_1_\^CFG70ܛ$ٙʑ9&ٌB,eǫr8|]k(*g`3!|ϵȐ9 2SNkb~ Ԋ0wo_~H^.L|,*~U rO<>:0/{q&HRP 4_bY@4eDDiNi$tѣ5Ш -1MC<|(q GGcͤ5mLB=W h}7C<eSeηYGàq.kzt-W2Rro*B̟G*1,oP|zuWw_Dn% ^;8:(y1'%] Jb4U6gc`,.˽148A)+Irhlꌛ2_}͸sJwB+CU3G%v12}+ߞMq1 !;|:J_lW -jm~N \w>eXN'PUL]z' QZ@f/Cwm~q\.h8Y^m<`GCVF)O x vn5}5 4ieTv_tC0ܤqFm?8{~|L%{aߵQlmqeI e5[_; d֊TL%Yג,')? tx &z|?(.n9[-2ޥp |Crh/'yAWk3ẗZ=;hw׶>lG7X݁{39jpiʼSy?+5VXCrzA/YAus暇p ']8{;KweN6y?1p1\(ӽI]/>x]FuKz =xxjcڛ2CuQ?r-ӵ%TG_J yA=YsFMf0TwաJD-{cEC%͖ ӇJa/t-r$ik$Z>w&vdn 1ˬ-b򑂲 bj|v%PT\DI}sYܛz 9bVϷRc*~daT;n9"۾aɥ_I%uW{v٦/q7C[2}/oʁ%VWM~]U>u[4SC(gΕrь R:dm4QݖƷL<{y$F|+&IsYYN*0]@ft&4*vKzPVp6^ֿ{Ee/fS+0Um{@llɢ,J[a> UG=G_f냹PKȲj-!z-_z6ѓVP(] '炞K5]N8r$reCZ\b#ڸg(2ϼ)3q>[dswu Rⰳhr:_ނNtR"+!NIWA~04n [{㶵қSPvulpg"EHWPS_uU:.iȒWew^Lx{5hP=N]94\~x$U\X\z6tJJF&RT 67ͤfk&Q5"4??UQob."13D_L0)Mi?#:N}a"ډ$R\fe;=bxZF^DM.1+wCbuE}ה,՛W@ͭ,k+[vG0!Y1Ɋ-c9#(z2kM$pc\XwVNQz~ȍ & *ݰ WRJ(p|h&0pxN1Z[bQN=1 >G2(~Q2tEur='82KfmQ;-,ct;(d}3 ~`j$r@A{\[xԋ'[MDF-YVgBU/e_W.˔4)IJ)K%ol} E.jn>zyJkk4w3\}'Y%v}U֤ys޷|vS6+8ˁ)K-|= *ynЏMG2gI[`#Q&+`+o/~ endstream endobj 477 0 obj << /Length1 1144 /Length2 7572 /Length3 0 /Length 8339 /Filter /FlateDecode >> stream xuseX\ɺ5 7.58Ӎ48]'!CpIef99{][ZEK*iBPVN6!9XUd|y1hi7 s,m}m݁*@. '/_W!\ϔ4 j;;;ځ4AnwWK |qB :z,#@ ؿ4 {^x!dzAE[nm.ce] -,lmzܬ (;s2`7?0+)?x} [ْ3 ߘ  \ /K[?RjÜA`+?g3 gg za{PWwKheg Zlogd^j4`r{e|V#pUs'2?{wY%gEA^*oEV[C<ru{v!O2SI6[^g<8OZ9dƁϝh_Nv?@5w8{Lvnv^ +u;_ [@7?,?))e+; P ?sWЖkom\ XX ׇ|$dӹ|ruΆЧ p(#->KZ}VQ>,D&AP ?A>ADUa򔣟81EҀVVUٵή yEA @CAWJ=j/K->"%=w7\9;b h%Jl.{Ql.#(mf68Q Wġ M^ԄKF6N>baHNEnE]pIHIk⳴S:#'lIiB5Ldkpfjh[Cy7zz %k;De7>~!˻ ah|8d'(]PeK9KZ_bM`bou>ߣ+)L)ڗ:4:iTebPi8J@m4jQMFYRpl 0^1 7=̓ *AcpY3.#BձDa\cJ0aCimKjpYgFH%A uܟ_!-Wu'4Q6-1&˂[Zwޒ[ͺiOzSι"REaV4 Guw%{v4*b us9Y٢y!I1>]VdoY$dw6wԢPlhj$_طb|ݡ?,&ߪ8φhVJd,2P+a#)M-_ټi^s5rQybc1--{7H%߾pɕ=LѱEָH[גnJ1 :u WY^+W{2IV=k@Ӄ-QײDR#\h9 Z C1Up9N'u[ 0/KUiA]F¼"K@6a sp'i Eɰhulz|i6,iNӚV-d/Niͥ1\M 2g0G#`ݰ 0ɢWII:!~"~u!uq ]. F5$:sJ=0 | 5V?Bbn,_euXB:<d>,ƪphN;epF*꩕TCܳpxΟ:;!ߩh՟!#mrW\lZ - |/{ أZZU:kvF:8oyJ)-ɱ57hl2~'$Dr8ߑzLОx WFކ5CdK/F҅=Y'L>Q֕h,k6P7J&*,okczX&^?-BeMj߻RX-r͋ou8}Ma,Cˋ]O"GwgvI&ĩ 8'oTC QC$T%n3V2%mT<0*R1WQ%x{xfхwQH2VȾ,/WT3j[ nS^ BYE7KOIНx$>Q?%5e+:WsJ_t}D"JʪDB1˟WXѶ?:N]>al]W]uWTL rⰄv*I#D"u؅0F [%HO̦r> Lt|oBSI.;Ii7|/6/ѣ_hD+ƺ"c47r:?JT-/'4 =fVFf)" 5Q\듈 R/]iָR|luL^L # W@`$ F[yH.q|%APk%˟ w`;|9,<.Lqp  OTوe!wR~ym^> ;Y^29DíAgxP78G7U|Xٍ=Rڥs-E'|< )KI%VBƣ@s,ΣHĚ RDYK{X)LJoQ5/QTMu5핈f2&X #Jl>w8xMd&Ҷ6r5rQ5EemLrJW,W7 +_$ce\r̽g\b(zH]IDt8y<_P ];^W8v=xfa6n՗_!"X]S&srÎVlD;1x`Q/rs) YT| si/DPH U24ؔf&h2SZű.zqMmSK# _>u|tFubJ4i8=^E1xQ)aq$e[Y 'q_Eۺ_(ո]/hIG _ٚ¤dB/,c0cr((:xN,# )7 y Qޘ-eIh/Uc~ûeDe:{kWCg[ {'D";p<!h4xΏ1[`@g(גKxnj4K".;Dʌ1:)%H8ݝ1J}r=0ZH7]zDt%QD;sO Zjv]UVV2|d:JY̿f_cHM7TRpXNY GcL~ǩGz{_##,U_mZi`b:e7ҚhZO]ߨ*ŏ ;1{GJ*tnq!?xY/8W s^01:$DtvCT̫\GJ8XoFS=X -om1q&RT=IH'97 Ҁol)+OJ\܊ۇn~S Vu_y,,_39=#1r߁Iw2TEN(yIhpѫr GԷ/c+7QO8w}Uy#i&&?py`Twa,t:S R3v=8J_K9)LAbx趻eFUWޙm;atR|4O8p=ף9Gj$_o6 E 1]iCQ7аUBcR)=X7sMOV#4Q`-v}QS3e5XuH9sJe4ϕ8S \r _Kz*ʸE#äk&lB>n&C4(5oL ZS* Dwo5"a"Z5Z#֚ы%jkʱV%=yplMX(|T@oJG2[R{WaD 1TD#!ǖU^ $2 zhuZf.!Nn4]Vl3+/72&b~us*QX*!~N,H˜ WӬ$,=RA'N@"GFIvYM^E(iU6Sfw@Jr@6 v uOXE\FHň.botY yd_2;t0ζ24&ҔG1چ!gy Cz%qFf"{7rZ'\\(si3+/ԧE[׮TJMn+ȧN* 9Vs| G[ >%,}\|uZ]2/fM;f1*VIrFQ5 gL[Ȯ}c5hI⾣]vlyꀂS4a0hKhg8/ ϡ7 񬝻Kwyx)QpesY}Qe,n iצѣu': crO 1'3 sY(V;jkZ0W0Wdǖ|څ.I]^,D0'_$|+ =C>pᴇpjʼb2o9YǤ[4oۚ&+6](8k:̼]Э{!a=4y759WMBJ˯Pf?T'Id :qqus1[Ç!Eof}ah*Js5Ϛ!`0;C endstream endobj 479 0 obj << /Length1 1177 /Length2 1595 /Length3 0 /Length 2323 /Filter /FlateDecode >> stream xmS{rC%R8\AVA+mm&*N1 p1@JNKxHc~B[cc!+IdD8F IxlDF͏KOj$NI aD0.O 8Z&$0F)N@_D;:0^ICIT ybH'x1¤rď;u*| LVa {0)PH }W8~2܇ TG.]eTG'hRqtUx׮(! 'ǧM@ pWBV&~b0@VYEQp?FN?.g`5!ˠИ~1Df/9pr?]p1T q@c|фK& D0*3B`~$d2܊@?FF!.'|h\*4~Sx[ {PԈS] gM FF Գ OH|# J:f\*C{OWHJ`g9Fҗ6Tttt9#}VW(M9[ XzԨ{AgͮZtuf0\hrkI}Ŗ6/[l:5ss i߱G5tVw[5;xF&ZFA//UjxǍKŘ]t G35e48΋Zw%#-@Wk.pN%5yoj{c]:DjH/{Cj9^;DZ~6VKmXkNG_>U_'\{1/Ecf7T/UxyAhQ )&je?uB.U:h҆ivqvˢ*x?dmuzVg eGW坻4{4G/ղ"Tz溒=i #vjZ`E5gќy:O([JW EΜu6Q*agǁ:y*yyf` &,[ph=Cz 1J \-kjAﭷJuPɽ؟>m7{Soz Tn2&gfezse OoKԞ^[,s:ko6hkLeְqXӥBMPsM L9K9b?a؈qj*ZמZ,Wh\y'4$p6H|Z}]'ϟ8Z]1Ds7k'*̳ :7\pVЩ0m`f3N0Uu[ת:ҷ@-x{%/=LbZЩqSv{5+ m"3]սEݚhkBaFHabj%[Ĕ4ԞSg=ZnXtNÅun=+M>x@497#yFjvg_~4Lqt#Gul4ut|2ne m ;]\hL6c8Ai`*8*#e/xe[O]kq^dbȋt8"2MM_; T6=S>H03EwޥO={0?-q7֪PXE)mu2æ> stream xmUMo0+J! ᫊"RVmk N7R$ݪ70W?g_,ɍehܬ=WWU\;;׺v7MOtҺ=po>fv8 | G՗_n}w̭][GL2sQ擾ݾk^!00jYV%H~~v}\; C}h{ϗC`Rރѩc~^ON6[7ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCvW endstream endobj 482 0 obj << /Length 842 /Filter /FlateDecode >> stream xmUn0CƆ"RVmk N7R$L̛O3 /~\k4~VzhO{|wޝn8O.oN?'uRG]>3dX;ҷ*נ_~vC̵:}W {1Esgq]ߍG@]dbڣH~z~ohTǰ9wxΏU]~NÛ Ju~*6{y~?xڰvtش~>ZjR˦YE3=sׁpuRA)`*R2$!`8li9UEХGSj043`4`4Ý(?Q  rt\e #q5p眛[q>x \iEܰpNMk l4\? 皞c:gN5^ ELOup3%M6`^ۘ1ل150ym 1F}3&ԗ0 bKl+֌>oRa Oѷ`)w`)?\֟agYg ֙P.L(ulgYˉx/N|N|&ٝ N|N'>cv'>7'>S} ~)>_Sϔ+>cR|&L|'a9i0K)cR{XTG5;)NͽRPs> stream xuUMo@Wla_BZXʡIW ld!fm웙7շĶM[؟McpuUӃsk/zfN꺼Ɠfn݅R^w}9qdMoXj_v}EQ>>pø;en>ڲ?`1&5vaj UkNAm<}\MxHM0}Z7WuI]ǽBnz/_ N{y;:ڰox\7nXw.kP^k3^Kյ u/A )`JbD>`2$`TY'``9&Dkx+0*NXXQQ3c w"]j~1F60aG+gıcW c rn q9Qܗ8% DMq.5Sh]`4$a]~9Vk ]8 IncT5obY:socsOPcYB?9Os֙3\Q.4ٰX3Z9#>^Z} ?L[ V|V|oV|3[: } B|)W|L| ,Y a!SMV,鸞:?8C8G潪N$ĸ<ޏ< Nuν_B,u7zl endstream endobj 484 0 obj << /Length 846 /Filter /FlateDecode >> stream xuUMo@Wla_BZXʡMW ldiof<ۻW_W7nzrc7)U7Nߜk]{7+wR}uN7|5s. )裮ݏk&8n~iyQqE0N[,g IM/*D@f`B9xczOpm`>W'9WRzL E]PwWqD`PދoSφ}= imX]ӷn<7̵^y]/׵Il/ܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1L.S5?׃[#M cL#F3X1+N978Nsk`q KpN8q )q4ϮEp O.5Ypc.Y7ь1O*ezl,d mY%0ymȋ,aYʘ8 xA} 3/Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{xᇣI^U E'b\o|s C:].cDܛX=oNܙ endstream endobj 485 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQիԒ ؇6jo73o{q3mfѭVOn/Cf)rtskzf꺼Ɠpi?p>fv8coJ?< a9(})suזÌ\$qATh L}s6G 7o],jotuþ{UןtptZ|MÏѩNN6[7ݫ ZԲWO&suB`ilB =@ )U 9yI(ѥ S*043``MSiv|kiCXc, pDˆzA:x0)ljsn l9u}SrI4"nXCA8%&ٵ6AI cMϱXS_S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7a/c?w:'dEgtdbP2ڂ endstream endobj 486 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQիԒ ؇6jo73o{q3mfѭVOn/Cf)rtskzf꺼Ɠpi?p>fv8coBy>x sXQO7SVk-#RInߵR/P,+m$oƳ;w>X. C}?77 D`RއۣS/&}g= imX[ӷnx\i"EܰpJMkl4\?ǚc:7^EHOupQF^odž1BЖEQ?[0^׆ƨАԗ0 9+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrYφ}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gxg ,; f)Rx jb&'W *.lMr0߫j١hGF}o.:_hW~tOȢή*ڌ endstream endobj 487 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQիԒ ؇6jo73o{q3mfѭVOn/Cf)rtskzf꺼Ɠpi?p>fv8coRy>x sXQO7SVk-#RInߵR/P,+m$oƳ;w>X. C}?77 D`RއۣS/&}g= imX[ӷnx\i"EܰpJMkl4\?ǚc:7^EHOupQF^odž1BЖEQ?[0^׆ƨАԗ0 9+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrYφ}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gxg ,; f)Rx jb&'W *.lMr0߫j١hGF}o.:_hW~tOȢήڥ endstream endobj 488 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲV6vFrBbތf}\xM}qV'7t羋<]swrո:܉Ǿ-w$mm o\1A+Z7!؛~B?Fߗb n;nX7U{[LG5 @@N,Gw͡ 1}ԿhWWq}QEݹ-r*FNL7uY~~l+l+7tE )b,#TTHy9)9>*QKr7P:MȡQ^s$LD6aȑ*s.$S56`>ƄmÁ#TL 5kd}WXssc*{Rh/#? bE$L|ږ8^y>eSQc̯bV̯cNa'O;Q~{5pX2]$\^snaK??q FqMyc0=) &l(mi,s|d &\cV ]͸&ӈ9w{d :mB Ƈ\..Ա g~n59&\pe[N 8\4<[n6|kq_]~&)a endstream endobj 489 0 obj << /Length 666 /Filter /FlateDecode >> stream xmTn0C6U@"mTt@Կyct+%13nU틛ķR<=]tuUӽsƷÝxrN:ۦ>P)Εrus ~v?'Ǿ5~D !8뇺mRn=MuSxHiQ)YiH޽'w66Z,^DӇr}ݼ-w{s d\{?:1 kmn_~߼h!R,6ew*ؔb%k e+Kӄ$a"1x*s.$S56P>Ƅm„A Fs 5577vر׾+uaя6R:!,əCxg+ѧy*JcL|*m:fvui0ܓ`†›F2g'I`2e?fyx0j5F̹k#n'im7>T20P-9[A˲,p~nE8|p9j7o-kݸJv?ƏVR`c endstream endobj 490 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲVZCcYy#9톅ļ{3񼛤es^7箰 nn8l=hzI-._뫦~^JIu]f `tTsr*o8{&X,dew+mWos~X(2X.EiTz}ܟ^7uY~lVNMєo R.bY.֔O9؄b%9vsr(MXa#D$ar bqMDs!FKRLDP0.BEHQ#͸FuŎ577v}QȕanOd$g;A,əCR;6+ѧx**Ę$90q'oקfQ%n;5pX2]$^q~+s"F!CyhIh~CMnOf1$#h)r~hмj5F̹k#ni<7>Tsa>s\8s&wsaY1:+r1\ut[ZM,k4w6_%aJ endstream endobj 491 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲVZCcYy#9햅ļ{3񸟤e&Oo]&C]]Mq>zwt߉Ǯ)n.pCx?nڽVgx=itO"i [\l\WM}'ԭ̚t4pXeȉeU oq yM\-CnCW_Ey}wP dZz891euB)] W-\v\]~[S!8&+Zce"'2Ɍ5I@|"B2AQhSlLء28a}ɑFq5ҍnnbfǮCG= Wܢe$g;A,:sx l=NOTƘ$0_س/vЧQ%~Zx pX2]$^qnaK??q FqMyc0=) &l(mi,3|d &\c ]͹&ӈ9w{d-tx\ \cΜekqLJs?<@>qhx .׷8wl~1V<*m"mmDa endstream endobj 492 0 obj << /Length 666 /Filter /FlateDecode >> stream xmTn0C6U@"۪V{Mi@Կyct+%13nUķR<=]tuU*Wo;зΝu-M}mS+7F?h^q~M}k $|y'BpOu u+$bTy{!y1  GҢSX< {NmmX#N;{}y[D]`Ah;P5K_;'4S}}⢅Klkީ|cSs&^s 1eΘOd~`xՌk?s׾G0N-۰o|e>ha>6h Z8sseY1:@++܊psqsoZ׺q=7÷c endstream endobj 493 0 obj << /Length 701 /Filter /FlateDecode >> stream xuTn0+Cl m8(zu$:`K$Q4pufn}f)ɻ|tùA<]u6m;O޴\+$ޚv}qff0(h$iƃ}E>.>ttPRJ(:X/rߴu&^!3PZM5^F$o߇7 V+1ؿһ`׮o7qIݞO!Znz/~N̿Z䄦buUWᴫ\k\r-Ve\[3sB A `ehHiJ }*>`!â)dHUA^UwEZK5h"uS/g bρ#)p̹18yi r<ܗ8-pN(T1 PUF9a*~0'ujE5z4jgǺ4QSkj sE8-_ZQY\2=<"NNL>9fѓ@D9{&&gnI0䑱Ӊ3 hxRE"7Yp/hJXCKH eR3ə$Sޛ{cYrwDz~ !G9Kûq_nY3/Bu{XcD~ӺԝE?zO,Fez~ endstream endobj 448 0 obj << /Type /ObjStm /N 100 /First 940 /Length 4471 /Filter /FlateDecode >> stream x\Y~篘G\TtXuE-).=pwG+&\R&_f3̒$Ent$ZWZJ9_i+ JhY *L*^ba k;T*2V BWVj8^Y k'+-3;[9$T|嬔3yByХ0X*& UPP*[%T\,!q-% Υ)+e>Kof4N5H8LB%R0iZJ l3XUeg ha[65-q\Z^9 rR0!18@TXipF 4JXC  %P#x'j(!q@ aq3)BQBQ %4XBМhҀV*xeqG= 踜ʚj*TXKX ]tAe9Flڨ*PS =̃zjVRdW‚0( Όj- ъ8>G9PU0 @$d^(6 2g^\^3p89kgR_gynNm%9 u*SiK{S2Zb=~Oe\%/NJ{uúri 8ZaD @Jἆ4S{w N4()gMCxHP͘H!8)F~gu%qD K`͉г ш|t,!bnrw#!Z!R&֩F'b! Q)C5֜PJOyZSu;%9^9֢R!'݀a,{ 4Chj,pF+ֵAdSHTvޠ5zACXHEyP\F` dzĒmFbZ%!$iB'ٍ"# ?$y[ju*#2Cuv8aiH8+8KH6K8 uWkܘp6S XN|- EOv ڱۚq\b[jyƒ LuZ#vw\I/Tb $3a_y`r~t}[ۉN.-\=W;@m3 b wƞ岮WV$d9>7o]=dc̞{^ {~aw=쌝7l3?{[֟vM}sv^WP^]X/0f</'ifv.7|Wog/[%[-b+Zj:7劭/M" Tԛ}Y^oz[߯׻l+r6l˶WXsƶ3۱M]?].`f_?7'gY߉&{O__ѫ>˳‰AL{Sq"}s65)hI_r~w$kindG1>wsO^ח@Q? ~,#i\;#1~`1OP4rYNJ߂?te{o ֦CX9TZފc,>,o0`x>0 :7==ASލQqZK^LjeE!0Kcţ^w[zy1xB@[~"dû9?5Gj;x́K"k_sso_?x^_-O*;}*&US-̷("nHEZDW[O~y5% 6|̼ć3ʯL]:ۃDd>n7pg$rioΎrwNEQţ_>iu7(I ~w)1SԌ*rE?Bѣ7~}6?L}?7ҖV#3pcC'X%s-_g(OB pAu?^ϞYf14K?T}D!5MFTc ^QD";{|jj =Qa×?}:9# |y?طX|}wXqS z[& ݤR94WnW=U48ddx C lр!+tZ#G/"\Y/jx\\".3JTAW*m Ϫz]zm# 62STEhA}cJ}wqsWeEpeUkʚ mo-,YI%srn!_[seߚ4 *g/2oIv}=|T6p-O7+.27+d.mJ{ jٸ&w@=>=&L%A*Vl<^~x|.] $<:ǥ %AsS%A~wiwue`.}g_uUj\;H=wڳ<;u u5]#{6yֻZ?NUJSmHP-_K:M Ȗo8Ãɛ|Stoɮ:w5HlY Edtצ،.lq l}B|JiA;}/o1cň!vv0wv,cK[؜.{I$Bxwe\N7K"=^r %r %rz$УyNtbpv0=M-rzғQ2ǥ$2.Uƥ`Qk6Ɩܴ C`C #=DٻpfPzȭ$lsNo.{Ȑn 0U;@( EXS8PW=}gHh&%׮b+uv[a]> endobj 509 0 obj << /Type /ObjStm /N 8 /First 62 /Length 327 /Filter /FlateDecode >> stream xڝSn0{lHUsS}hbEH BFxfv͂2ׄTf$T#m 5'ežk=}mRLe*`3rRiH 5JSlF9뵛=Dz}TIVmlOM4 S"η3F՗)U$6b><f{Wt{9bqQEĈ:vqzgl# ] /Length 1284 /Filter /FlateDecode >> stream x%KlUUI>UʳP(- (P^JRh58Hq`pdL0 8p! 1CV%DcLB~{ιk !\/B&X(z9=gHoa;IX;AX',C A*#D%Fj!ExE"G 6"Mx'6#FGZ&" .DGY7 YaC؎,+ \o7Jd^.H^o'd-<~NI \tm'܀ti{x<<%܄lA6-VZ.M)̈́z~mx.;}$J&>M:vJESN8uL4h (:["sR((iVT鎨QӏrDNwENDUNTk籆-FT%HB9P nkl@h^i'8DNŢNNENNU%N56h)ݑW!y t|̉uB rj ͝:Z m(H. ~DG:%V=z.h֍V#,vL:2w[C ̦H5cNFz!Y}]-8lh8X87+s&N"#/̿8ZbA3&z+1E%H[ J%)p2*HW40p6# H#}c&ibsakEEhԷY}UF[<=p5: 2M iA#\3vۂh0\ˑ6+{IAdЬ.2kD!8r̬\ ir¬cN"o2fqG;3FʮNXX窶4!}bϦH6:R)lu]\fv7Ds|D͊*-sIK,`VTmnQe{LTkٿ;EyUz\mVTgi.\7u97]&.L=2=B~!E?N_JROS~/~V aV aV a=/~R : endstream endobj startxref 294297 %%EOF GenomicAlignments/inst/doc/WorkingWithAlignedNucleotides.R0000644000175200017520000001211314551577523025017 0ustar00biocbuildbiocbuild### R code from vignette source 'WorkingWithAlignedNucleotides.Rnw' ################################################### ### code chunk number 1: style ################################################### BiocStyle::latex() ################################################### ### code chunk number 2: bamfiles ################################################### library(RNAseqData.HNRNPC.bam.chr14) bamfiles <- RNAseqData.HNRNPC.bam.chr14_BAMFILES names(bamfiles) # the names of the runs ################################################### ### code chunk number 3: quickBamFlagSummary ################################################### library(Rsamtools) quickBamFlagSummary(bamfiles[1], main.groups.only=TRUE) ################################################### ### code chunk number 4: ScanBamParam ################################################### flag1 <- scanBamFlag(isFirstMateRead=TRUE, isSecondMateRead=FALSE, isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param1 <- ScanBamParam(flag=flag1, what="seq") ################################################### ### code chunk number 5: readGAlignments ################################################### library(GenomicAlignments) gal1 <- readGAlignments(bamfiles[1], use.names=TRUE, param=param1) ################################################### ### code chunk number 6: read_sequences ################################################### mcols(gal1)$seq ################################################### ### code chunk number 7: original-query-sequences ################################################### oqseq1 <- mcols(gal1)$seq is_on_minus <- as.logical(strand(gal1) == "-") oqseq1[is_on_minus] <- reverseComplement(oqseq1[is_on_minus]) ################################################### ### code chunk number 8: is_dup ################################################### is_dup <- duplicated(names(gal1)) table(is_dup) ################################################### ### code chunk number 9: same-name-implies-same-seq-in-U1-oqseq ################################################### dup2unq <- match(names(gal1), names(gal1)) stopifnot(all(oqseq1 == oqseq1[dup2unq])) ################################################### ### code chunk number 10: oqseq1 ################################################### oqseq1 <- oqseq1[!is_dup] ################################################### ### code chunk number 11: most_frequent_cigars ################################################### head(sort(table(cigar(gal1)), decreasing=TRUE)) ################################################### ### code chunk number 12: cigarOpTable ################################################### colSums(cigarOpTable(cigar(gal1))) ################################################### ### code chunk number 13: table_njunc ################################################### table(njunc(gal1)) ################################################### ### code chunk number 14: readGAlignmentPairs ################################################### library(pasillaBamSubset) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) ################################################### ### code chunk number 15: first-and-last-U3.galp ################################################### head(first(U3.galp)) head(last(U3.galp)) ################################################### ### code chunk number 16: isProperPair ################################################### table(isProperPair(U3.galp)) ################################################### ### code chunk number 17: keep-only-proper-pairs ################################################### U3.GALP <- U3.galp[isProperPair(U3.galp)] ################################################### ### code chunk number 18: U3.GALP_names_is_dup ################################################### U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) ################################################### ### code chunk number 19: U3.GALP_qnames ################################################### U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) ################################################### ### code chunk number 20: U3.GALP_dup2unq ################################################### U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) ################################################### ### code chunk number 21: gaps-in-U3.GALP ################################################### head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) ################################################### ### code chunk number 22: no-indels-in-U3.GALP ################################################### colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) ################################################### ### code chunk number 23: sessionInfo ################################################### sessionInfo() GenomicAlignments/inst/doc/WorkingWithAlignedNucleotides.Rnw0000644000175200017520000003411614516004601025352 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Working with aligned nucleotides} %\VignetteDepends{GenomicAlignments, RNAseqData.HNRNPC.bam.chr14, pasillaBamSubset, BSgenome.Hsapiens.UCSC.hg19, BSgenome.Dmelanogaster.UCSC.dm3, GenomicFeatures, TxDb.Hsapiens.UCSC.hg19.knownGene, TxDb.Dmelanogaster.UCSC.dm3.ensGene} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Working with aligned nucleotides (WORK-IN-PROGRESS!)} \author{Herv\'e Pag\`es} \date{Last modified: January 2014; Compiled: \today} \begin{document} \maketitle \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% This vignette belongs to the \Rpackage{GenomicAlignments} package. It illustrates how to use the package for working with the nucleotide content of aligned reads. After the reads generated by a high-throughput sequencing experiment have been aligned to a reference genome, the questions that are being asked about these alignments typically fall in two broad categories: {\bf positional only} and {\bf nucleotide-related}. {\bf Positional only} questions are about the position of the alignments with respect to the reference genome. Note that the position of an alignment is actually better described in terms of genomic ranges (1 range for an alignment with no gaps, 2 or more ranges for an alignment with gaps). Knowing the ranges of the alignments is sufficient to perform common tasks like {\it read counting} or for {\it computing the coverage}. {\it Read counting} is the process of counting the number of aligned reads per gene or exon and is typically performed in the context of a differential analysis. This task can be accomplished with the \Rfunction{summarizeOverlaps} function provided in the \Rpackage{GenomicAlignments} package and is explained in details in the ``Counting reads with summarizeOverlaps'' vignette (also located in this package). {\it Computing the coverage} is often the preliminary step to peak detection (ChIP-seq analysis) or to a copy number analysis. It can be accomplished with the \Rfunction{coverage} function. See \Rcode{?\`{}coverage-methods\`{}} for more information. {\bf Nucleotide-related} questions are about the nucleotide content of the alignments. In particular how this content compares to the corresponding nucleotides in the reference genome. These questions typically arise in the context of small genetic variation detection between one or more samples and a reference genome. The \Rpackage{GenomicAlignments} package provides a suite of low- to mid-level tools for dealing with {\bf nucleotide-related} questions about the alignments. In this vignette we illustrate their use on the single-end and paired-end reads of an RNA-seq experiment. Note that these tools do NOT constitute a complete variant toolbox. If this is what you're looking for, other \Bioconductor{} packages might be more appropriate. See the GeneticVariability and SNP views at this URL \url{http://bioconductor.org/packages/release/BiocViews.html#___AssayDomains} for a complete list of packages that deal with small genetic variations. Most of them provide tools of higher level than the tools described in this vignette. See for example the \Rpackage{VariantTools} and \Rpackage{VariantAnnotation} packages for a complete variant toolbox (including variant calling capabilities). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Load the aligned reads and their sequences from a BAM file} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In this section, we illustrate how aligned reads and their sequences can be loaded from a BAM file. The reads we're going to use for this are paired-end reads from a published study by Zarnack et al., 2012. A subset of these reads are stored in the BAM files located in the \Rpackage{RNAseqData.HNRNPC.bam.chr14} data package. The package contains 8 BAM files, 1 per sequencing run: <>= library(RNAseqData.HNRNPC.bam.chr14) bamfiles <- RNAseqData.HNRNPC.bam.chr14_BAMFILES names(bamfiles) # the names of the runs @ Each BAM file was obtained by (1) aligning the reads (paired-end) to the full hg19 genome with TopHat2, and then (2) subsetting to keep only alignments on chr14. See \Rcode{?RNAseqData.HNRNPC.bam.chr14} for more information about this data set. As a preliminary step, we check whether the BAM files contain single- or paired-end alignments. This can be done with the \Rfunction{quickBamFlagSummary} utility from the \Rpackage{Rsamtools} package: <>= library(Rsamtools) quickBamFlagSummary(bamfiles[1], main.groups.only=TRUE) @ This confirms that all the alignments in the 1st BAM file (run ERR127306) are paired-end. This means that we should preferably load them with the \Rfunction{readGAlignmentPairs} function from the \Rpackage{GenomicAlignments} package. However for the purpose of keeping things simple, we will ignore the pairing for now and load only the alignments corresponding to the first segment of the pairs. We will use the \Rfunction{readGAlignments} function from the \Rpackage{GenomicAlignments} package for this, together with a \Rclass{ScanBamParam} object for the filtering. See \Rcode{?ScanBamParam} in the \Rpackage{Rsamtools} package for the details. Furthermore, while preparing the \Rclass{ScanBamParam} object to perform the filtering, we'll also get rid of the PCR or optical duplicates (flag bit 0x400 in the SAM format, see the SAM Spec \footnote{\url{http://samtools.sourceforge.net/}} for the details), as well as reads not passing quality controls (flag bit 0x200 in the SAM format). Finally we also request the read sequences (a.k.a. the {\it segment sequences} in the SAM Spec, stored in the SEQ field) via the \Rclass{ScanBamParam} object: <>= flag1 <- scanBamFlag(isFirstMateRead=TRUE, isSecondMateRead=FALSE, isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param1 <- ScanBamParam(flag=flag1, what="seq") @ We're now ready to load the alignments and their sequences. Note that we use \Rcode{use.names=TRUE} in order to also load the {\it query names} (a.k.a. the {\it query template names} in the SAM Spec, stored in the QNAME field) from the BAM file. \Rfunction{readGAlignments} will use them to set the names of the returned object: <>= library(GenomicAlignments) gal1 <- readGAlignments(bamfiles[1], use.names=TRUE, param=param1) @ This returns a \Rclass{GAlignments} object. The read sequences are stored in the \Rcode{seq} metadata column of the object: <>= mcols(gal1)$seq @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Compute the {\it original query sequences}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Because the BAM format imposes that the read sequence is ``reverse complemented'' when a read aligns to the minus strand, we need to ``reverse complement'' it again to restore the {\it original query sequences} (i.e. the sequences before alignment, that is, as they can be seen in the FASTQ file assuming that the aligner didn't perform any hard-clipping on them): <>= oqseq1 <- mcols(gal1)$seq is_on_minus <- as.logical(strand(gal1) == "-") oqseq1[is_on_minus] <- reverseComplement(oqseq1[is_on_minus]) @ Because the aligner used to align the reads can report more than 1 alignment per read (i.e. per sequence stored in the FASTQ file), we shouldn't expect the names of \Rcode{gal1} to be unique: <>= is_dup <- duplicated(names(gal1)) table(is_dup) @ However, sequences with the same {\it query name} should correspond to the same {\it original query} and therefore should be the same. Let's do a quick sanity check: <>= dup2unq <- match(names(gal1), names(gal1)) stopifnot(all(oqseq1 == oqseq1[dup2unq])) @ Finally, let's reduce \Rcode{oqseq1} to one {\it original query sequence} per unique {\it query name} (like in the FASTQ file containing the 1st end of the unaligned reads): <>= oqseq1 <- oqseq1[!is_dup] @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Mismatches, indels, and gaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Because the aligner possibly tolerated a small number of mismatches, indels, and/or gaps during the alignment process, the sequences in \Rcode{mcols(gal1)\$seq} gnerally don't match exactly the reference genome. The information of where indels and/or gaps occur in the alignments is represented in the CIGAR strings. Let's have a look at these string. First the most frequent cigars: <>= head(sort(table(cigar(gal1)), decreasing=TRUE)) @ Then a summary of the total number of insertions (I), deletions (D), and gaps (N): <>= colSums(cigarOpTable(cigar(gal1))) @ This tells us that the aligner that was used supports indels (I/D) and junction reads (N). Finally we count and summarize the number of gaps per alignment: <>= table(njunc(gal1)) @ Some reads contain up to 3 gaps (i.e. span 3 splice junctions). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Put the read sequences and reference sequences ``side by side''} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TODO (with \Rfunction{sequenceLayer}) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{OLD STUFF (needs to be recycled/updated)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load paired-end reads from a BAM file} BAM file {\tt untreated3\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains paired-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated3\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads). We use the \Rfunction{readGAlignmentPairs} function to load them into a \Rclass{GAlignmentPairs} object: <>= library(pasillaBamSubset) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) @ The \Rcode{show} method for \Rclass{GAlignmentPairs} objects displays two {\tt ranges} columns, one for the {\it first} alignment in the pair (the left column), and one for the {\it last} alignment in the pair (the right column). The {\tt strand} column corresponds to the strand of the {\it first} alignment. <>= head(first(U3.galp)) head(last(U3.galp)) @ According to the SAM format specifications, the aligner is expected to mark each alignment pair as {\it proper} or not (flag bit 0x2 in the SAM format). The SAM Spec only says that a pair is {\it proper} if the {\it first} and {\it last} alignments in the pair are ``properly aligned according to the aligner''. So the exact criteria used for setting this flag is left to the aligner. We use \Rcode{isProperPair} to extract this flag from the \Rclass{GAlignmentPairs} object: <>= table(isProperPair(U3.galp)) @ Even though we could do {\it overlap encodings} with the full object, we keep only the {\it proper} pairs for our downstream analysis: <>= U3.GALP <- U3.galp[isProperPair(U3.galp)] @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query template} (i.e. per pair of sequences stored in the input files, typically 1 FASTQ file for the {\it first} ends and 1 FASTQ file for the {\it last} ends), we shouldn't expect the names of \Rcode{U3.GALP} to be unique: <>= U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) @ Storing the {\it query template names} in a factor will be useful: <>= U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) @ as well as having the mapping between each {\it query template name} and its first occurence in \Rcode{U3.GALP\_qnames}: <>= U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) @ Our reads can have up to 1 gap per end: <>= head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) @ Like for our single-end reads, the following tables indicate that indels were not allowed/supported during the alignment process: <>= colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rcode{sessionInfo()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= sessionInfo() @ \end{document} GenomicAlignments/inst/doc/WorkingWithAlignedNucleotides.pdf0000644000175200017520000066737114551577523025415 0ustar00biocbuildbiocbuild%PDF-1.5 % 53 0 obj << /Length 2389 /Filter /FlateDecode >> stream x˒6>_QU7^;N''4,SBR'_hP5JŒj.6ݍn ]L qfIM,O;GO $gJ]#YȦ 3gѻq~(d ?-tU݌Dx]L$+u4_i:x{l,O媬*w4PrG\'=D¤0YMQ "lʓ]wcG-elAf_|n*Rau6uїM}r[OYf߫2`J(Jt^:/_ @):,fMùG#~y$[Ggď.ȲfXpaȼma0gjp.+w>t8ԿoY˯G3V'6uֻSLd墬 bic*`,zN66n-]Y\ ؘE:AJ KKtxugǤRXS#!=0[7ٵI}6Ru,tǺ* bN &Hi/&y& z L&rdW/E_>Mkĵor⮨z5{7ladLg_rW2dD2w1llu]EF]TrB"V3Y6ʓchC~]~' wng?D#/׷%,W=^iL!NcW5"c Gfjgm!SզͲ,=rxòGNLlqCpl2MS? iYUo!EHihԺsF .a/)PPLJx ANփ6R ExEСfNcں!oa)LYC DP@#d9\!3|Q;rq;of]aJ|"a咈řG7,;LW#s*ox~wv3^\Rf7nϼ0*Pݴ0Yջ03!@%[n~Uф94qR$}© >!Y,m0WqA_ j[7]ck㦮a&bI)+٪uהL05.p *QX7ѝ(0;֙JXgkIKrV$]H Bl-W{ꀥ!;TȓA1Iˤ` Lo|@A%H i7ܣc)6SPHD` ׅnhE+fYV e8P-"֙8_hFyfC}FUBR,2{OeX&k1a7P ֒;+4b}] r0w]١!KD| HOiFxlP[vTewH"zVń4:+])G)0ZpBJ?T4KAaPB})1je"8JzyJ3md əI -`-=|'ӽcv* ' >yBɩ<FUB,Mz*S 㬈lG"1Жb <"[aDP/C#@ReOyYu.xrϴT &%ŨA_*^H+(+CUWSMޔ0zs -0 Y8Z3Ov|_-^)t>` endstream endobj 69 0 obj << /Length 3284 /Filter /FlateDecode >> stream xZmsܶ_qu>Qx#ffDvƊ#)LLJQ:yIL|w(On;v`qlv=cO/ElI,,b1bUfØU&/B6oWTJ̖T)9 C"|5+/?/Nl_vsD=I"%Hʄq"(uUUTlWT9:"_@O j 6nFE_ d.6[yUrH׫MeZ5yc&2azjJEN]_n5r 9("!T=KEZb!\EyB8:CaXӬ)=CMxq6gžuuC7)9ɂfX-nNVu/EvTfԢ-wX ܛʼ9 9YdY} ԝMAPP7tyQlN۬[5m2gDH ЍRxyNk :[3_tT5 QnD؟sw:GN'LDRR7pAFwUU$یo趗[BǢ¼ó:xqIgī̟ٔnuw7ҫPSqPiJ-2=i`r]6R"]L}Ţ H3\J7& r!fi; N~N>g=e^@%@xI]x% .(MZ_&]x0,]G`bFnLwܘvN++oIG:irw"xcMb X)PiɈĶSN2 끔ڶ"G׮"Ŵ6oܜн!TlL3h1QKnwS\ %?i\ 5d-}"cq015Ə! JvxngQ\4ƌ| $k(2i-,:-=aߤm~{zv2]UՄJfQ, 5@'N}(([D`k?qu(8nOsGv87yz[~٠=䐜Zr5{yȾE/Q( p3N; ^9x4ʭas"AC!F{H&dvPg/?9wq9IJ3|pb&z|₩3bͧKE4A(L3 ^h3.dQ7qC2ndJxs5=!BI$]ط4@6e҆:Ktz3Y=9Vm s46MyLJ LZMkPR=S2˂M`V۴|:@c}Ԗ 7s%h^T1gskq?IC57 N"xAr&yc=RV`B)~}e]޲W;Dz?~b :ӇUOW;r ΄=қ Bj9`xz=~D3XGm'_tC0lY&3q'SC%;hl"X(ޮ:bɕCa,q!5K9tB@b8uS'{.qa q`eiX?oH*`pp!zOGe@8&qKF {ǹ;D&@ƈGl xt7$8hEzOt`ҳ"R`KnsvoDŽ[9h @»m1{R(Հvx@=ku(1i9nFeR/% Gr~W=xRMp4hk7r 𺮶&DN#9v.o|b&(/7[2 X:4Q2ck/uek4,ev 6p}C^V?<n}.GZ'0op=hpoØ2j&`#*0/gBšt] [o *ud*gS졪x@T'Oz[fDNyOA}7*όoQ&> stream xZst&T<LHLZ[%v($@`ށ@Љmю&nw >X `r|zr~i d'n`8 9`:ԃ|fөLJy.#Çx.dn_S٩eW<)ͿG?^oersq{LuSWB'δ # , #-kn%r&{lt`\yY ߝAp/K#79dsJ*M1KSŇ"aYR0$AI|ꪋd@GIxV'دa"|TY2;yLʠr \!%"x|T6:y\ҢlL$X]NG"Ps.lP)η}Ia`$0gZ,yq|F>)~W#t !?J,]E-Jv,ٍb<\Ub'U:m$fZgl븨*3 >#6 /] | d}j1b\a2Ue-Wj3R &fޣʨ,~J+nxs*xnzu- ~mË[sqs#guk)b_qZ$Q{ie:,soVl=nmfwSaQRov2Nu bB=4$pjS!𸏌H23!@ދ$O"0Ӷdf`]D<8t$C~2Bwe'28L@2 LDe  wlf m=W. cm't^q~UcO1 '$YJg:hE zrgbSjC~lW{ӽX h)5p 28vHv4K.zٙ5pP;$wd(,'2^ K}/ʜD4B:V&5{kf, 9X Ba ep>t*U! RIxmBM麾:DJ#2F1/HR+$!TBHi$zOc a[) Z"IN:{ SFh8!k33E%To<5'Un)nH_.q٦@X$ÇrX[\AG ELpPQ+n Pg&;6wXe[[aB,sMS9!6'sp DACJ{=q#N^W,^ڗf kri"e}Vv+4>b‰ w!Iz=N]3k_ Rm<'L׽``ԘFxб1|I>K;jou/][ei ^o Bp혝bYT*RqC +9auBFPm)w.FYvz[,^b@e}&7 rۮ3 {Pc1 PCbڼ,/nLzc ?NT][&sf@ʡ.5ļxmr*"04ޑ @?xp):=YRQƃ0)Fy3  ]W] W+VǗ0X#~ ulz󟋳Rx +ێ]F/n/oJj n|qΫYMܑBQPg$#pWϾ7fCSW% 3uuצR.-e#Km?t.˕,٦Ȳέ팴;8"9xv-B3ܯwklϙvgTQd0%E3TmTERm vޟ**CnTEeLqW'ۋLk"^vxuylF"65bg68n ?ic:guDU;K!lJ1.Pgo% 7)O5Qj1@P8*@B \CKp{ MU\u!-*;*& 9;" Rwd Η3(d:I濿n+,&ad c~Bgyo멎НyF$Ze:&Q8GdD؊1(Ad~h p(v7hz*6!HHցTELIGg#474^ pvHMQ <&=Tǔ|_t`ȝZDUYn~BZG#w!-8q IogMhajhf伂מعɄu'Bxdw[H$pq`UIjop4q endstream endobj 83 0 obj << /Length 2455 /Filter /FlateDecode >> stream xZmo_Lz_eQKq)"lɕDGJ$/}gGRpF;;3sG{NKdq$8=$bA*h,2UB¶UR~K[ѥ4+JMb$u;Tm"oOۣcS98~sr t{ 5~c K"U 4!it}O4DH*jp}D3*z3h{RS1 b+]uQ5y8FwXap{3YJ7{7{ (sg$(G3|2ׁ`2,޻Q/,KcA`X2{W7=zyh[*`;5\ }v64u:/mߎ| twh+^zAOmǧKŢfPgRZsL{BU[Uq}a KCm7ZBub jp"\U3~w8csOfq>;crtrtr'Y:.sx ۘ`B}u1hz40wa]'Z7%U8nM3h}ȋiXax+×'lv]yo8^&hZlFּC/s\FE]]_x6k[3i,Ƽww|] S+"*`G N)z>?4?"]mݣ]5ūenʨs@ @X&v*RKP/ `*cu{Qy`("Q/^ѷW1SjImw,NDbL0@ot6?d.MӘ(xmI dXbBAev} oP؂Tt{1,*)1(7AQ;g0b3-:n{2N!mxɜ҈;c;dQM A)V-,Ag`,vnj Xah [b{^Id5/ag< H`Ĉ"`=ty<--S0})T1f p 4-"^+}F4It0К?DdqArs=Fh h8N\vF%|0~.E;D}dn/F]<Θ7*zc5&9lOd=<1a . @ഞ"e$u,'mצrJSJ5Oa%|YxvBa8uOBB?.=leYzg+SY|nסiX#$ #FB?v#s+?r'4K|,}d|\4 Ms`P\Dgv("Λ֐nNTsBMW~x})Z3ame-aW(PfH,|]-IN' @wɦymj8ށi2c)PM㉻vxD:?1w>2q)~>wgn.R:sPS`ᑐN#$8?T"bjJ]O E~Xgob=3c 'vbvmWuDm+\Z]bY;A /2FAےg%].P;-"˜7Ū:& 7OH3&X_!)ZR9 9IYT8LAOxJ|2}31:L!F̥k@X}&mu_@8_yu_3zv=IL"S3%CR\24Qq6ah.Mgo7[rN[5Խ}Ϊ8.ۃ.P{;mI,zW.z CQʺ3jEu[40M8QwR)tGDbmgƒ1Y- jÃ4PX&x.!eP0&G$%G\:Uf~<;:,u&2F@mMBŎ%") . 5e^fff skU|A4&}35\5;zc$o4X['c[Yò%HĀ28ͺ-?<4Co{=r}u> r&8 ؃Bl %@#lrǁIB[]vm]< E_, F$!*bE/W=. endstream endobj 88 0 obj << /Length 2413 /Filter /FlateDecode >> stream xZms6_FU t$84qmg!th RBJ$Ҋ򴞱 mw}yvi>zq~XNgdier>M>GuGQGcX]V^MK5b4]OFWԵa3U#v?ͻɩy}0FFsÑDd, 1/ Y\YL]eZ.4Mq .[(Nh%#Ӭ™2Q7O^z|*}]MVE]˧;c+D긨aͅ&灆4]OZVŅ翓|9ALdzppJt2|6kCї#GA&,_rEJ̎~/zA͉UYA$dQ͞ƚt_›w!Qڈ]"uI.l–L9= , u(@l:nӐ{f;[О.-B{ K=( p*'>:L@!%͈2|%1poz[$,.޿bJP"IƲǑI$(>n]mȈ6MBWLs$(k`VD: i}xY>vxQ" T_s+eɮoX SU~l1lW `ɟ{ %6,*`&u^T7X6@ObwjލN,ei"jl-U9˟m7wN1NO`epjcI֣P熖2m!WR[RWp yOe!Qߤbbhؖ2[pH昱w $!,>cҀU8w92_ GahhZ2ΕMn66Ar0E}C`*Th1۪>S f}M.ݤ.r s, (,!h?`%ZcVPxT (bô!se}u+~jI; Ɇ>rcyӓ= w#$)E"дheuYFW#Yfl1DŦup~:|)ٴ@0F ) #|DAPsAu]f{ Bl9\[e7qU lޡl/4% \4};Ҹ62l߁lw߰#n /%[$HičvNj*g=Vx )n.2L'TIəL'> stream xnF`oMf' tIrhzP#D:$'7HZiG^elo߆2ыϏ>W42hE(IS%idt>L4C^,'Seެ|Y9N 6p]sW[OM_;d>-Sɘjݴ5G ҈usIdm0DR3bXU.Zq_.WQB+SAd?)Tv<~leUB^4n)h92JXf3*X@T&RNd*(X3[U@xd$KcLe4@p&cM qIH՝():(1(ǭ$P4d4Р7WTIu߆lpk}S.y(~FC).Os~[d¤O!ܴ20N:+ݺt7۪ǼXhXܺ"9OUA8ne"/,]Qn';njJHus_.ֶnZ]_"Ix^qE2Z{a,\-{mNqظmcqΌ" n: MЅ򥭠Jwcnlմ%P{ӛ]_F}h-柴OETۨ0fzP{փ[eVhڃPKwӐ) 𒠆, _) l>fUt$ O,+PEp7Yܬ.D`G7$4R!3eQ?{Pj%%\u6[hL6(Ŏ @l9@[ewa_~ApeH]nWGT*aJj>as5! ϣ}ׄ~g6#~  TKyUz??}^uPܨ!aR>~ R Oʰ'O*˕Y|y9~$w/@]D_ȌCNG`w9pdT(xEcg [n?ETζk R^!50-V 7 lL-& endstream endobj 96 0 obj << /Length 1740 /Filter /FlateDecode >> stream xYmo6_d b.qXXuk4qi0lkeG/w|,9N&1/&y=DΌU6NufO }T!IJu44DG1y] Ъ'm<,k}Hj. ?֖.2P6 / F#X<SmShI&7 8 װvl=8ljPq!i70~ O3O`B"! h)Cp mP] "`ޚ2tr=_H¸ )v%שޅҬy 9RN4< \ 0l/P`N:f1QUd#T@h1Yˈb /)KÉVRnc q`sW֪_?#-)֩96uu(WEyHV_h]܄j]Ք,J $+fTER&`VPj't[]aIҔl4Zu7$a.$ r%E?(\uHw'YLB.9GGH)dY!/\L"wbGE|8q0\cV6W.W W^{J\ox+xS, `eb딚d$iH%saM{A.),<c0 &ܧXB5pu, :Uǔғ5&)Rлj?<ȨZ5H%P e5)Y\o1j*nk`؇E}sdr.vJnqӒG~$vQ4x]iQ"ElJK 5_`l@ "4~fz*ϊy&y\wt((mߖdejߟfhVB^۬:i&Y倬z,ӪzJX$  q,fQuHv5n!M/v=qkskCB25-C9yK{Wr 3%r5 ϒ`ˆ3?ݲx} endstream endobj 101 0 obj << /Length 1710 /Filter /FlateDecode >> stream xڵYs8~_ȒHt7n6q|sN.s1q#ܦoi2ӷ߮Dְv9_tzoLȶ-5#!Afbݞ}Z,N>ѺS.ξك:V&|q^+/U/& _>7|$ݻŻ.U]F&6+0Zy5|F8dt!"!FĶК|W,G,ygFbhI5KZTsÎ|NMd`[#1iN\ S#←nH%$G)"|9#-I0%f)ir藑2 Œ5I7qHjuN>*tXj)%(2VL1|`1Hjb!-ONi~X2 MAzw2d ϴABϮna*e(<3J;SsxI CY却J15tBtbg0MJJ:,SYNv'+5IX(F_!.,}n1?&@d1l۪js|E]@ (^;  \$\{aegz[A}%؄}]>+'Yo9L-(p 36Ske#a3N*ES0x. ‹4k4aBƚ5K20sMۚ !H~P8j_H(Ap .mGjVV3 I pΝpY05!]\Y_~ (K-]TWr-l:aAzd3p2;C=fv gh6s tG{CJfqr!zoIjMPDEؠ` ܏4v*Aڳ;f?|"ZCKNU鑔syHn$dD뢮=( ".'?L GPSXf,?!hsii)9S9Vy͢;"oVyrSO"yƿ =L ⻓}C-:V1 endstream endobj 105 0 obj << /Length 1427 /Filter /FlateDecode >> stream xڥXMs6W7 {kbǓiY3L%JRI_%ȲH`::P$%hfb1QIeXE#i8A iNu3eqYU .Ns(u6Mu-.H(V P[sӘIBx>nC) z~Ntp +Ԇ \eeXqň>`"H%K^Y1F02,f3ʰ Lc #CBQ1d-Gb<,02xVjyxץw$ S4M ;\"aQ>;WRNSaYF9hO(ZW# `s;ʚ]ӎӝ޲zm}k _gCܓZyz{Wql6վ2{oAlvI,DHW8c'~`0ꠠl> a3&0Xp&RxӘf;Ead{}ߕA&ƨyXdU]fU}uwe:s%BI-caz;E bՠd 41aaxO!gSl۳RzSӱ^gl,ܭ&Π%:o2d\#oUցṼI/XЋ!-նzz{NVa*_ϯx+VPg JH? >m endstream endobj 112 0 obj << /Length 122 /Filter /FlateDecode >> stream x-ɱA($ \vTSHB $:@\#Q_TQUE&MG-nu8M [Yð,ΐV]'v=WN;S3uz3x:cE_ endstream endobj 124 0 obj << /Length1 2008 /Length2 7121 /Length3 0 /Length 8227 /Filter /FlateDecode >> stream xڍue\[6H H ] 1P *%!)tt HJ73>kuk,z??||;G ` w pq;w<$ 4؁!@M8](; B \0#, S肑`wTrB5m\=xc O#Reu`!GNr0;0kÑ WN #aSFw G@ oh 3U?W" s67zh$8y^(;#PX rHF5A"5?r@kfWFh'ͮqͮEk_#45B^#45D{Z Z5B_#4?H +mA|h [u-ar`:.OO P7˵>C7DU+"wsXr-qǟ4&#:oF,Akw oW0F:x:݀ho@9׊.@ךѝ|նq]\aka>u^3/s~q;SkkɵR H+ZS'gEȑ~L}teV_[Tjl\M M!{]JcT*&jK9r=$qA(P|+aBQ:!1КrZ *I# nGipQ/U8 ,XAWzJ]㍙w;}у҉w(cRmot =4Sʏ|{b*J\q(z>"u?i H{]q+n$ ̎)IP^6{ybkCfniQ?m 0MS?ʏ{—{~hR qbE3l36ͦUH)9c 2ž|V[Χ'\kQ'auǜ  ?O+8ck)r|%c?E++$B_:pL-] dMwҮA֡(:M2/"VCCBz^`4{R^ͺRo6У }7M7MB{PܘP YF@.ҿ1syr1n3.zs).3r7\F\rx6틒`b?Zi޻nAe9}5y?p7gsd,kv~_B{ȀO*ۃ+z6M&G.Z*ysD6"N^鐟R"V/~Cp;_5䱞M:;.Rl|RWCڋŜ*H/eK yjvzηjEPBEլ-j]βҞ6!^NżhyA.p֙ rXBqZn݆^gn]rt^ %h'b.EMtZw#7Z̓A>cN.lF,#H7ؓ̃[?6RfPKA91k'r;U4(1qZõ>]}vQ;*Үy@''gsK2KN&_Eb*Yjcr&~ E=H{-?R;>O! d^YQrԶ[d: ߥ!WRPݖ *mK`$z@uՋi')!~bmѣL~KeoNh]w pg>?W"Lv)c0e<ۆA[y;X/ o|*0XqhAf-ճsᛥ;cđٚO]KDW{|GlYL/,#>@sG Em? H({T5 jk_u߫ieq۴# j)FDUz!khNI9ۋ>|W!FgE[ Tm^⚌{qN&; ޅW3^QRuhUuSudhiBŕJ~%c䉿T{Yە5 PTx>>)N{Q%D=n;o0fbY-H':#܎T"T8W .B`^gF*yRto>BA}A 7jAVʬ+ 85?cm/#3U+^Im79/ $Vb)0CIhr[I?O[N?@( rZļyڶ}ʃ`cQs]<\ĊҢt;wy)kZ<-VGUXG`zlCf ; ?>Hɲ0>eN23=7w"ᄇZYigL?NXY[ҍW´1Y!7L0:7Ĩw+k66# &׎9!! ٞ:]2l-ҫYw*jJ`90f<}NxŹlxFrEY]ܐKS"l]G&sό|"r46ۍH-8UDV?/̟P}^ךӌW82q!7+iّx#ӂfCvrY3ßSp6{U3a$QZn6]5:yHЃPT~+֧BN S!+ rGZ)*>%<[S)]+ Q}uKK$4N+b80sݣ 1cU`D=O=W4~"Ӕtd1hU5 & c+f XNS8/S+"{+]gfz|׋Uֺ`}Q@=CVx7J_AWè;lj^> )Ř 2?MZ6#{s*=$FYArn͙ssSJKOp^1&z;~8EHxi!gꚄ={GKo)yZc"+]bwozԦ+,+!O{ xsPW>Vޅp3n~eimUjrrk״d/htxM1+wɛ3\꺝}2"|nꓓ#6URP K; %E^%̍l;p8ڻS5KXI *~4[¬"/O=a tLm&c(F+(Ee"#01z_N_e_Z_i3=ɒt0YmM `U)\<) { /^qV_4s6ȯ6' wG,X&&y񏈩˱{jWX1՜R``Z$y\51L:.{} A( i5Yhd@N@%؁Jnf,㋤NyPT#yG"yt֡Tejwxf!'D"m=sM zϫ^|R E!(v跑*5[#ҫAGMC 9/f`dqaaBZq30oZ)p3sqB+RLO".w[S!gì;Q㻗)S)j y (dRo˨-yo; '.bVGKPTֽnY^ R]SSaVi:Od.fxhH_XM_z;ǥ왥eTJ,\80\Ո6_7/SDN>~QElFȡdDe+GZ.=<;7@]yIVOQ-#_G4)1,{ve}uOh2/1չ+uk8d>0"+d#K;?.#b<+Y*Knb}yIsDi`NL+۞l ˄`ьO.f:n8ЛVI4BmWPOA?B;d'ba6DN"5B3n͛L)S}V^vZ@/Rx,Yw?nr+f v0.R}F\ARf5g~+7u(Ѧނū1Nz}7"С>)2]/y+̇|/`g󥶫i\̈.kko{=GE< {bPRJF&2\]}НGh-EBIG0Vbѽk9+.05%Pecx>IĚM',3~C']GzwG&IAù^Ua>fS̒ZȞ ԃl0'|}=1Ā.}xH;srE^s:Ox|?fQwXqu|\,iC|_>N ^6Yb<];}[IMƀ4?آI CA%?~X.or%mm?O8e MYAٷ(|v{cco$Zp3_66'<|eX~8/|9RsRQIKd/E7? U=^%^\宾/z~*n[.OAMҚ1ќ 2j"7ݵuM [t']za' 2\# 65ĪMSBmZߺ4v_;(2a) ?tމuG`4" xQ?\?̫ek2l0KgGOq|7J@5iYMbEAE8޽X.zbZR4uݑj k@ERzP6'޴%&JUӐaXKM.v1(mٶ+( tj9Y6h=KP6Y Ǭ ^ĪDbB0=/gPH! qE'$[@sAYv=fM#Q ǞL[=8T[#!%M>YouGR`Do.K?@wDUꏬwBG̈\e 嶲|.;koL'!W3Z'FGB40Idȥ`] 9жXE+qzV'C_&p9<yis PhBIÑul~>cYRAj]#g:jwTˎY]>K zIwzT]Jl!XfwiH-\Gā˱jM>'RtwwUev+'xk= Ya$-XxTg9T:L*}?7Q*0?|ߝ5bq,fIm9*oO +NTPPi'{3],;JV7|Ћ0k۾=5NKu6*&].n;PL/>c>Mh6.= Tӿ%lBHg AtZ) gϼ֫OcJ@קf]p{a+ڞo =lT@}ws|B9S*6j_:ˣLh!Su\l3ܡ~ElY9і4,N+=Xa42LC|b/W/'ǏH~dQQzcDQ,VUfõL= ode\d֓Ծx95so )į.q NkMӫ0NC\~73_M ygzǞY-Mdyì I%EhO>'ov"w)ϖR^QR6W곮4<.6H[X榽KJ~"?w^op 1go,#6^Z|^n,ehE/TK[&1,F\YkD^'s/0߯sV@u ]6۳;PMVe=/R*a퓭US,̃_ȠCN}rp0kE%@zwvEXJNZ\0GR[)Y"i @!NDc8t؊Y.†e!Y Ƚb&.cƘlMLFS_)lT{r jd+2$%8RS}2Si}{~:C\` U׹='Ώ S֘7/HWF#܅6 0'k}[.ÇruϿT7!1əTtX cb|VXݷh endstream endobj 126 0 obj << /Length1 1737 /Length2 6917 /Length3 0 /Length 7900 /Filter /FlateDecode >> stream xmu\ARbP!gb  IPJQ@S|sgf}n9;8 wEpI!66ZpW80  (x@lNpWED`۸b">>!tS-: "9"`+]5W{8_q;yA<~'%o]/+pC"p? D$ U%1-x!Q>-xUnI]- xn yKh=[BiZ?$ӹ%-n KB^[Bnmn %Bqvm!!-]}DxAAtP_hMm;z;X 9A?G&zq?w ګst}!ecN!ڻ_n_gt?vݨ G'J \0/3 ^ k]0zI7Ds߄ŸA<{#g~t$aH8bU~t%F{A8z@nKF{F<5UӅ^ {]8^!1nQ-s[:o}tl\>nu/e-# 0/?>?4yy7}Ap yL[z_z?e{' xClfᶒaί2zFK R 8WchՍ=W_c,qrOCNrKK9 4]6н ǔJRmF3-ZL Mp&,g]Qq1Оm!~ظ\VZ$yVhM &Nd<&t^Cj̣U!o-=QJ~(o"Q==?WX%.pO]_ͻl-ԅ/4%ZrgҐcX w=6'<2HrjКk Ki?kx{DR7#tr! FO{NN:< 60̕uY#TAwr/'TpBMpM KtHG~io֤zܪ6 %{w>Z(M,FQEGgpwnچs5_m=GWXuGw1y^=30ķ(h%&Khۊ[ۥ7oږ (96uͺo4+{~S pڔ.D@Qy1jX,~v,_l+H=~+ڻx0yHDiX\1THT"d0דK.)˔MPtBlx»b^0%t'FjO 2FoOv:p3* yik OQ+$RDW_ѸJd (T2*5Q/͚xgr۰,`YeQf֩}21!q2x؆t}' I"HJ.F!ĺIu/qrutSX6K*“WPXyzv5}-t%VR=&%exmegO!HZERjD$ǭu,Ei WvLT;ҎAk6ct ~wȲ2^H'H*ovlMvdoULHX˔i/ WOA.mEeCî͊&_8ƨirIf6v~ݹ4|'Z2H }TzJ=.7V_bickr (ogUH:$X3hQ"k~N ħhD?W ί"`=q N߲+sd=)E2K$ !K;.9Hf=D6sYr ,^+?Rz78fhZL/'Kѫ#ʓқ޻qm1 UL;c=ZnY$~Ǧ;v=2tᢎ>Y/}Y:vF6%E$>ʁ }􈷚]gﮯag-V'_ui6"L) D ZO+Ea|LIh 4J i$pdo}jjY3x#QZ7|e ]Wf^f<b SkRBn\ F+1!la4;o^$\u*.'Si s0`dqCYHC8<1xUbE c})Ug[4 f![ՙXmT ʈF%=B:˲45KEmZ2gV09?p4!5C5c9cz‡}T1bcی{Xےl!n`@r%՚Ǘ1{ |V@*mTՁP=Z!wz eEtJAB:T=+evcG$~FzChm|~VΕ^NYȃAeC2 VכR7@>+Bb{@?zv?PXu~.h!4]tlIg{o'3h)O}k 5 Ѕτg@\00%x1XAaIT%+̱> %X [bI\ja鍾qǴu5r+um41(=/?(*yDӯ, 6OE /tOx[K~,s삁NTFnW Z[}=+bU$D畋E81~C7s˘U%!M<^Yczpm+؍2Wnˏl }1l/shN1(vG./9`8&yQG˝ k G0H_,Qq55n^vd \g`A9| הonչCQfs9R*bMuG.8Uog͋Gx TݸAa#L`"gFZ$$7bzw2e{k!>X~>(4nd3r޵?Yse ƕ {yF-[r9fBHj/myÂs^scp)! ^16Vs _|Hń=m5-fA(X԰J/Nx~'eۯfѓ,;Bn}ą aF9 i>3Yjr_?&55< h!"%fZ8u+LE%C7qKqS=wjاA1H}FTIm vOf'_^u@N]\|5wV9f.v{j%B0md>^Δ=>rQ>RF<9,~Rчk{xbW}zyXLn2=_H%nMKQk|t5؊[dq()CiԴQ#q1 ^^j: |?Y` > A~"N[,qS\5칊xMezp. &Mg&Ok^zq'r^KԤK\LV?Rj Y7y)h&jUo:RI郳/km@VKAK!w"-YeAV쮆w͵ew #M CtW"f4=8)#_h V hcX] hw?~n`|$|tέkj{!}* M,O0p7vMcǫș2o,8\`b]+wٮ'E}CEB1BQ?Zʥí ~K7!J$jR*qDqLňUGCdȦ/t}q$(eK =g‡wRÆ%,5C#&i .u-,GrI~qU9safa o)h3 N֎]X<zVA%ib J蒪f*Bt9'p~Yj49 6`5[q%OՇ{??x"\W|-NtߑxE YC=5z1̕oz!V!Unz3l'"0Hy黗;;o*Yw0E-l&^z1 XI jޮߙ/)]rX^Hc){6{}l)ڌ2 ڃVAwN?#z+gAᆡ<2˲]^-yF}zsuʉHBy"pzίNJ$HTCpHH1L*D+ʳΐ/Q?-JH LA0%s xRڞ?aH:EOx!r:VՀ+R<3s>2YAіst>D֏,:GDJRF:NB@wS{R2T?5/YVoV wrOw/ںW;Tp S.4qy9yީy ޯ۩nH# ~<9:s>^r`AJ6lL'ߛrbS_/RU͠pX0jU5o*Yf]aN/ {+$\+3MY+$ Av)/Hv0n}h[bk`C*Rݤ%BiIWLja $w+(οrMVId++^ PlTPyrŀ "OPx9> ,t 2ǵ?қr/Qk;J~׶,:R3 /Q0b1_vl%zi B-8)?&B mS!ȼ`#?>  ɞXNU̕JnѲﳺYpeQ6[1nn?O{.՛ygBꝒ+_IߺҤ R7dC;)Zfjj|{ϥOXi9(GY5U:q)axs3wJieR,m v]iQ_ͰS^\zbh2y x7A?x;ŧ!k4}ӱNbQ;uEן{HU["{eHZigRƞ1ZZa]( #(I(2ذv@B>V*KzWOUPIctج3n4ː\lc$J+8 ;}O$dD&I-P'|BiZ)(qKr >FBxUw_ʣNB:;A+g7$$v4|$OpNoPqx s!j,=)Z"lbA;;ҳe4Aå΃/þ:yQUdV29l- ,a̸*ߡ&9!GhHkn.*k1ūNEM>'N{<x"P $ayZB9L+\? C4sgYYc5HT/v/\auh.6!]x|  հF\j@ "AOidqMnIxTI[ r2 :s U3>v-&_4}˱3OѬMqI0NYU;yKZ1K/CFՀYă Ǜjm5 cC;¡ d-0[D%.ړXzHɒ4ٴi-xKYp͆I×[~\^߼1,\,s en:9Ҕ34 h J? y3韣;Ym`*+> stream xڴuX= HwK3t7Hww7 0 ݝ!!JIwwtIw |s~ ε׾RbXe!`wVN6!؍Uhh bArZ `i wfMFpp`+i -}:͝ mA` #4E s]wْlE +`(T!^P#,v6 @ђik1A ky8;C\ @ZBU[ehi C۲T}Ud% e8 ~nPf?Ԡ6ݝٽl= lΎӶ +0`kv)e$ *%4 jw1k:+W; rՕN ;l[{A֯EpuC.7uIteƎ~^c`7߿e[An 7wUl@~MEBUAVFKU:x`VT0?ѿIH+ 8<ʀ NNPnAur?sx_ lm[ykgv0 P-Vv3-͜P! G7`@s]=~;rAVA+m L`2BO5ڠBܡ9^N@,@>?z\T!Nɂ w+ /t%@c}s }~?<|ノW*j.]]PGCdVkpuA//:@&CS+K6 % ~$`2Av?.q nA+A*$AkA`\t (?E?H, (O??곂8B''?Aj*@Y3@hrA;ڀ`nh9?~GC<\ʇJb2WWc/U/]_䄒S N41jZW''thG6s tAN@. zaX:WIN?.?vN'tni wy hfW h? xts5AP9ܽ %@kxXhܬ k ]__C-v Bgh%_OeB`-wWPd } +Dm8vϿ3t.ѿ%%!~<5rC瓓NWտJ߯ h0O,4Q@'vPT_1~!cH:w(VI_Q2 Lѧ 'p|ZmJ*ve!"P%SFb$GM'4Se>q_1'ߠg*93r %q5sBm\Ҽy{t~ ?EӴy~$"sWb/c;+."[J`0*x]SʼL0>t-Yu*/WFk>SE-n_h#9k|bӛ#TlG-kLT~QC<}Ӕ"!د(BMI2[bEΥ?5v5<4-Ύ0ԂN[84qF|{s`ώEx۽U_qZI!ߠ$F:ڎͽԇo*Zf \V1ȸ;N=Ji%MexwJȦB;Zp ְ3z>`ͭgq{ %ed* 7&vF5:52aQ!̐|mOQbEz-??A%{.*If'$y\tזؤտ 猸HX4IKw |SB16L F%ɿ:qJ'W n=ڀDd*,Μl'*KNQnۋ~x(b{w5ɉhr]d>T1[>4Ε]X"*<@43haʃ yxqA=džj4oq#D1VfaUZOܥ09@\:|?yF7׻Dsi/S`O)@1zKn&qI`}AO9FG,FCB J["f Hz",vjF F-gy掘xQ+׃mHdnS_i3Oi7cGl|ӗ>;y=G1ȸIQ`4,$:J<lЎu>#G1['T6UIp |cuv%d "h{Ք?pe0!1⑚it=\C+V3i0B8w23( Ky63fm"pM9kX^#kNdG;tPLȥƻ!(^Z k",quy@0b\1 JM{g6Gﴦ.:YU69x +2=x[t:ϾW\? *Gq3}A/4^ѫ;Dž߮)OgʲNƓN|X}nk7;XDh@# }n?, Q7f8u u ;RsY+%t>]='5rQMd3dOViu1h2?-$Nqj¡Rӑă+_QE4T\o`(< qEc/ bZQ3/| |UM-٤k1qN*>Y(  JD(~&֟8-hmI|hiOQ+j8es={E "&r;Td$lnbz#t aw;ԍ>S ȒJeL>h-DBBX!Wf' mWj+ݟDS v ˍ"Aߩi yR4} 9^78dqrU",8]}֏"рinD}`-fPuͺ+4^K*vkk|XJJ"J1fCE2a~1r T -d^JGW EW?U4`(ns7r~|OȟhiJ6,GbweGwol,Hi*S,}LB^|tzN: %PwdoB * 8[ D3q܅) Ux"C.2 ,H8/\=|Miٲȟ22pO-3Oi wpFƠE8bQվu!MvpD2+0&f" B 2ZTY"`_ВN3#}#ZTtS٤v *(ܡHQI PNJ:T7]EBN_FRD5Wg} /y7>ەox*˛H07o2 K0nNp`{ [K |w:!& 2Ŝw7)/U 7 d[Q&Cﳄu?X*qxXXYۄS9o_<0 nj:&dҙsEvqT$;摡;32I|*/(Yhl#)oLw:W{yyvgݩȯO ThOktz;-lQA|oXǭP" eu"t8eS&Z?&ޡY0bNl%٬E3')HbȤn?Gz?}i 2u_:8⇙,c$zg-|y;>c<L=Γgl1*Ids,FZoU IB{$*KQa7 H!&(&,{"3E Me#Ze$?R[N!T EfZHHƇ+ RRu)uW0GrB"m_(eDu:`)*12>+ɑ=M;&x$>TE+]#Qd?D4Мˠ 4햼pHixmO07=V{p3'7 0b1IͩɾwWͷ>E$*]!8Kk`ys(>+gFJ|N,?O 'h2Ke74mhcl {ܳ<7u {KH,J~.+ɴGfJ$D4V&b(.2,%{!p=*Z.{:Zu=`l7mb^U2a4@ޯE.Sӂzb6'lT!V>շ#k?2)3+G,]WnI{S*+2 R ir/gvšlZyl!ࡇ[9„c( :fŌQ奤ɻgGɬhXqv'T;>-g$,"}-XD?f]^Cm0vO/ڴy*)ΤT_~ r!#@!i%(yG;[_T#i(u`gJ&vx"gmz7Ԯ]M ʺWxH{,v:avKEZޙ39?-փsc8)EN2wW@Qרgf& {)ZfƜzϏ)W;_"7@foU@H[-=%[ cy&MJk$Rs#D&0Kf/eʎvd;+B n'ń2  w_ Eܭm|Np y i/do!p~"R 2uaK Wx}g`b+ ^t+!> ߎuA[EJ)zʛ<^7Vx+`a7tH+ ~&;&1b>+MGب-$Um3{>pZK 2OtMU63#HlmK=a~dCwq_ l t}@Oh+.6c9LzBuR}q iꟂr[Bo>_wԸ"_{A!y>|LMn<_~##wzEH-R_Z?%;ϺSƩ/n B$2NRkU?n`!<gvю^z]7)=$ZЁV8C\J(sQ&n0z 2V|cld*!yW3Nav!6w%?%.GUj'j/[U,QS.mA۴,_Oh:h&_ 935B;+Ҧi%kYsրFr!fB࣬x~/:*Fz˅ 8w!W;p5Q)Ļ^,_mۑ_BƱ(I\کذ}+לF כ+t_`l*^ v,}X?4ٚykzyl蔆۰<( e鰹x(jW uF$>Ygs/:.EuYҼ>޴٦}itm;Ϧ8UkB!w; M7;Vu k/>hbeʊɣYomLii8 XeZI{}~W 3fZv=ՂhU4_Lm $D7 {MfVcP )ϑڲ3'{gH=p{es9IjG'Ir7G%%=)d3(j:oxգ1_M1{ AC`/}euiMϮG6O^-i՝0Y)"涌dkUtrȈTeU*ᱲQ*u$Y{\ nD؛#i̵娶[.փ9 GhR0ee@eRV}Gq#6&i6,ABGJ1).ȋaiwY#[ ];ymcB.<@Ճ IMLO#gb05ipjcoЇX4^;ے*\F/9I"JYEbf9,r=_% xSJn:?8"4:_˟!r_Xb_Jp@[QGη9wOz]G4lЎ( N後ND2yM9a^e -;~;dj75AětSy|@zNۄf0:揓q ĮYI t t]_k8l+ke $M%,wQ]zDJmGٌ\%볻Ň'{ +"@R5vF$]/oHk\-U!VlqW~gұ YODRγ-;u)Z~]+:[ٍ;&/E3^r9Iw.jJN/9uf$ēöep6U[ р OͰ&.ɛ}{}4WZ|}۲~ -d~nW%Tg("s6^q>)0=_ }I 'N%:) jڽbVU& b|j3X[sU,jj2̘mnDaeH6 \˸fJ}#iVBK/v #8꣆M!U?w f%}nA*6i}Xv~x cLuMȵXaf Ut^ uETU@Z%zz}HojvnM6ܿ?od>}XaHups\{DMmc'~}W/f04hjhwoXI\XĞ w.Ne"KU"n.nT7Qc3Da6tqͿdv1W\TU]۶?l>o3QuYu?Ot.璘#*@ꥩˉ+2Dwҏ}d"F{!$BH;!Z5edznG;qTSF\#_ƪl;z7 B'A¥ f鹝>^ w"o1gbu`NĶ5?RT̴_\]0بӕ;<>OoUǿ0g.u|NbvHUN$eZ+\kfi \L5Tov$mZkպ2E5 ޢ4ur3{R/  3e"]/'=.D;~)no9BQ',ݓ)0ބDnges>1Ԣ%baI~z@np]8, ("]PA龵R~ @uRlWA%mK Ybg*b̚M.KJ+y]C%5TIK"CO M7,Ub2C_?:)L 3uEG/8BO,Z&Ff8B ^-?D'C<ʡoȞMY6߁'_ƫunV"]nvSEpٍN.$;5 X,aA`lʁhq^B$'g9>۔[K6$0L ]e]7kGK\lBdIWڛ5Imn 9/]UgG"䟞t7gZI2lj@miky]w]GEzFT2: {AE: v]4$T MH9 TQ0x9yR;1Se] ˘,_Z\_ޔ龅qep:.DLgqy{qA~+Fi}-4]|fk`i`m1uG aĻ-y&i \^_tu )^Ǹ`|T'{i"c:!e͜=!jҾt4FAC%#,VF }6QR6Ɔl|0L45H˿eF%5~CzROȊ0ڃPG!=ͨ=biP7&@;5ä!*bY,I5ù̊buM Ok/ 9H"t7M1*^}5Jy/swGrt 0#&ɒD 7)O#ܭhw0OQCV/^Z &l3M>RJ{j |XLU0SO3;S6 -ZvbDMtn.6=+C|yTdHiK=)&k_2Xf sR#n)]1!$Qc_֗8m퐵•mnh>K%b3\EX~n+G;uɺS_bޗ>.Ը(y9L+*vfNuf=0)Z[殖B3p-WDǂg+숿]NYWw7Tt?,`ـ6t,ǭq;f95ٸLvy'fOkm F[Lvs-B{jl8v%0,=f93(^9%cT\LbpQJL}"Ǵ=*[ĐfCvghc0j:5\fxƖSb0߭m*z쬓To >![T둄J >c޳ʁ8C}G}Afn U 5^ Y#-uI&Vvʮ;zю/mǥSȉJmln?!|%#Uť{*94VNMa/"{FMs0?i9e~ + "LÔxLCh9w.;+wAJѭk;M l]m,6!};+xLeAjF}Dq=i Ƚ=z~QJ 2j*&Hӆ3!ajTx !se ALS}Po"3Y~WRQVLE&9oA sO߻ .V \V w.2K"I "yASFvԒ!][\̑>ݙf-Ă 9{ eGEuWpHa?X &$De7~8AJ{@zG1\Ä jp{B;t Eɕ~GM+}GyDվ ZNe2Z$ $ӛ*IBmC[k*&m#&.! G)žfxm53_,ℯɟM0xtgsnc)Ry7 a2ye9VMŭ1 3E1N =mIZV"!Y9ioY?6)pՁAUo5;[ #1fl Ruj[u rC/2RN3j\[f#yis;vdsw  ߠw9K$gCFp6 u^2 F~MPʒnvR>WD{&Y-F,a8`y C*B]Y1pݖCaD Շß}C+|bN9+zU5Y=s(a3oNR~ׯ/:UX ЊI"0emPP^<~pS$^OE.L1öx)]&ck3[R;6iIWx]v-\NAA <̫Q9X K&0'Yw֙ Ipİ%c/_VtJC{7I20Je s$>ɼ7qpPB~lC->I/Vnj6*v4|׀6s%a.2%o` 6.$w2/gq\j5[3WdE[ك.,)%t9g y,8oPQ$$8c -2!z#u٩ qÞ"îZI64Imlp ܚv˶6EZ߶`&b9/d>DV!(caVf+BOu pǻw8CKU}|1ю>T,fgG p?(iwWkȖ\[[: $DQ;I+5:@c  tJp(fAҊdLz0#`3&lB@,Oϴlj_^8nfT6 "2`LSKCP (Xp%cӜIXZ\`dV7KN1qc71.C2j^FJ>> 5yg|ЦfzQe0MQK(h~ 9g}x {P(l۬Jё,*EkAXpD(ӫH8Z\]^gؗb=pm!_bNg Xb(1MׯDzre>#E6z 'ˣV7gh/ո`'$V<)>`kG}c^齇w&2l";'st綐U2Lmn$5XY0c lj>wa.z<z3օ'9gqN5>9a:VY;D%45l|DXTǹ:Ù#V䎊磙>O?эxOu] FћÞkzƊ`Ey.6PT[6ʒhәinOm8DT_&N"gqoJY=SGr꡺\2s^c1)Xayig/p>yc 6+oE,*vR{4OqnS7*mf$`CUnS4Ot~2qm5+4dl4;;_r|BZ>sSsfauòvDͽ2m#RQ~Q dWU[bg[hui!ۋZ"N|NtUhs#N}ötpN qlVv2!BtR$FimvsH|HPwyk[-] ;4A2QA@y 4~&'?э_&-*4^3w(O29`K bJZh]WΛLB bCfKƄ QJ):5= "1KߒQ\J! 3R$МX=gKr}X$vu9Fۍ_@Ew=ֻuuo\|ԶL|/ep>5D}@ WIkcMh tY[#jcԖT\$H4Ma*nӯd1̷o"e,INTf{KБp+v$`KĠ}=rj݃m>۟r:=:J|LH}p<*TjCIo{P^=oa1*'828 *}`ؙ.͠Ú萑<ٺσ:X'7s}m$l}"X.+Ak\@ɾ0Zy5#7k`6dtqi0:k S:vm?g>A4L,?,H\]C5R}d}08~xĔV1(c^}qwtG%1"qFI\0,{ KH~m:.~IAv/ћRm8SuopR"πaJAy3N[bO.e4/Sc׹^LC󽃲;B5P De)2Uf`CfUg9~Uhۅz&927MZ޷ԉCx`.)l7&ƹ>&ʴhNж쒟W7%V@Dd'fdՃ0ZR<&B"C= XMe;YW8$ym_3VWbsO {V S,7}~{?Rnn@Y&1@P%nҴq4`_ \ [5 F Ȧ~vc=$yhf]͇/) wy;+Jf*n: CR]@%7GI`a ;bZM!H~:EZ#43ߔhnidɲ(D_ nbb\ ݤv:i!&E >AK")C  mt1E,{N- `;/8ZHW<5ٌ_prUɄ@X JTi?.ؽ蠽eL.FD*۴ޯaA`M[4TnʵZ/ydZ r2&L8`ɣ0w`T'xk %r~p4W,yMƌ"):gw1ݕTA5w{3^~c=EyFHv$$+c;WesnL^^mZ_1Sfb֞w"9sxȤlm<;c^d*b[B4ybT|("AO7//"u Ȕwu-8[$rraxQ'<)Jsp WnN|[2AZnmD kg+Вj&/"=QȔ N׵^C$XGp7s'3LOtNN=M[3I1Ya\ﮦ1>bɾV ,vN kD  y򰿣\I,Mcm yQ"-.Dخ n;BRU3q5~o-=f>|1̸sfnB9T@*Ns",!]80 ٽXeO'͞]MhDI!H "# 9]wSX^Հ 8@HLu&ƌ714򢱋O݄Jv^q6m'l^}~`đ #H&5T4;񼖀L]|垖 }/Vdø gNAlD~ ?{|2 .7&c=r07\acu+ 7}r״4Wș,-r*1^,TE˚\~ˤr' sˍATHl[ dJI3To- A{Itj$L4Ixt4.-%J+9xh:2G,XǠcYE!Ɓp j\"ZO "f&B~!u%*R-WWx׳Ġ(> :AQtj(|p]mTk|vB!#lfN>>fB>Yu:p7D5|lZ$Y-l=]\Pd벟Jbe{|q}Cxv k. B^GL l qM AN*lM*6?3"yǚICKub K+uOnk-ZϲwyYB~.J4[V/㔁={b?0ⓕ0>6LбOc .ҡJBU\r9u)jT][DK( ⹪}Yӆy(C=T׃FC5QrX 3A8L5,h򫑃 ![IN[zʑj$/3ղ f<'Y43;h2T]4/3ɐ Kv>$5̲9^N.SR[c2 ٮHIQzپzg21@b*tow_S223GkbC@%A0\6OKbU?O9dKe~ -FDq(YT7ۺqF: lv *T6[ZwZZ77~j/^DK }?^Ɇ \\˘$S2s"-6'DClڤP %wbeRG!Bs:Pґ{]+YEMή Xb<M ~rB|2xE"I=wtфP|')BOE}gѤE"is vs,-[Ì2{tI?֦"Ac:0$F6P]TnNoS.[羛CVF/lj1lЇؔ߫ZGL iQI<sPe/1Q!x`I@~8#%Pi+x,jE RVH+* 4NtVJR-Am.ATEIpښó>7tR-iǨF]Ju(QQO:,U20/&wKViQ<ۦHU :NxrSTч0,rs^[Ī6nӣ1':Dt';^uF¯}ыvQ(N;Z @ I,яs5Pڌ%Dlo5%$W2fU#q2+bĒ+Wcp7Q:8t\4Y:Eg`c\H2z`v~D<]Q4jٺ35}6\ß/۞.=ܘQqQ-$sbYy(RaEtuܚ7NO3K9lb!RiBw[a)HW^DAZ Bm ἘW"7㴟He6*KN)$|YNWa`¤٣3Zǜ@X1El="FƓSp e}3%Rb%횙 r|lp c<^kn͏ Œ'X]nOJ]nNE7bs#FkhlZzBw7_@NQ,aW3!h.K t8j^SN,TKt ٖ&^Fc?d|j҉藸S1 =fˆ=WQHXbtZMd!cy4ETH[d 74KH9$fީ"=?J;ORAbybgʞF@sOoT nUz2Ds.&L)e%m)Yi $~Q*.H&"0^:.Lڧn=t)i˙z-P3iz1|-UL} ;f<i4w^'^\9F9YǷT `%@MI@fp 2<{:]+FB v:"hlUf~?Z RʡٹAJFռֳ\׆on;^ :CvhWNh:5yV 'D1QLdDS3 ]?q~g oc-T=Hҹw{8! flhcʺe/Z~MB*фGO1r2YI2{/LlIKD#o?DpOR,> stream xڵzuT.-Z@wR(EwšH\wϹ߻X}fޙ7+YVbX `(+'@EU* usppqpJ- X Co//hy XzTP m/' '/qZZ`[" qrAfe鏷@jXJll5Nj`@;  hjj5k1rsri-my,W~oP~b]UV[R@]O N;'q{a7W_ vP;+ b?m;+bxy5 lN] +_Z"/F@t G; ׿|UU 0[B-nd/@k n..rKiE] Rϲ `W+@ 3J)ji U0x2*B> eHeG֮h'zcmx}/ lmnN:`PQ_DhcY##~i `c _h>@ O"4N~5 2/WtE  ɿT3 )ˎZC^k 2 rɹ98Y8mfr0eP8Z8*ZVvo"e%#Kg^fq]]|/M//.)-#', b x..^h/S |gk_c`gC/.'7(D#A"^qx)_NN; n `s|o`G"ΗDe~3$`UX$J,ohE_HQI|˚uPL Gꢶ-ZF`iQV]MN֕V@;wxmR>>\ӮO'dVBKgI`"\y9O(,<<[1c4\7,KFp[& ܅JofP|ampI !\$[78n`]e7Q@a0!{9c;XMtH\j0\UNyxG S k.}}"E9QL6`eQQ7`W(cBBLќ3e/ʑcC3E+߽x +i7 `$6)Si:Y$o.̲Uu~45򊈝C"U-8:SB=Jlkb=J-̷e-?qyXW!ZOvjN-i豘Inv4\VZ E.aWʍ8BO_A\ٶu9J:wPBr(l~_*"GOe'^]WYj @n, =M,11 #'4 ib/;_fOt_J87y(O.3vrǀ^5m4ߙ^z 9)fX/fEzW9V.a g l#8-םH?%DBc^}ĥ[J5o ½j9+Qއ6e(g@6D+gQ82,ܷ7vQ.UjIvA*%%inuvH}\gUG 2]XY1|נ_>rɿ?7uݗV&x8aU#R0֗>ylgdWs Cx+4 |HljQib~0@_Ugof:yBhJQE#?IH ٷ;:U{ uX]sC;:Ε8wHH Qu x dFyˇ-{P n 2;m2l- یs^Kv& iݰ -F `toA%5*~:jh|KfHcM6j熯%ʂ\s[6R {.EJ\0 D`ߜjL$łs2S C~4^U[܎$*#!>$Ul-VF6/][*鳹YqFN]U7*'@Oqפ< Fϑ\kznkۼ2>rm%2Н|"m,Nv;, I3V-(6 |k Fb9^ރ hBa4QYn-l>*,u>wDo3:;wgԿ#i@@ ӼonMjTH#?o\ۘ؅e{7' $yE0YwKf%/v6G#iyrudEۻ駁SxoiMQ `߯;&^~gxC7Fc[uo>BUB6si$o9.&^YնGՌv> 5[(pc ' ,viYh"k>F"6ת)]Cڊ#"0]HYͯPOF -8 H7IJypX'P sI߂*܂`[@둚"h1CG1Ӏߗ4l_!mQ_2m㻳'b㸚3w:(ƍG*|g廋`QwqnR] V+Y;е9W;Upm_uSzK)rɪ&RlBLb}E1z%?#!wԊQΊ:Ա6hr. eݔ:OZ+BK5›$8gv0w\{_Ӌ@XkڠVͳ gSG>p. rkUI+MFW ߤ qʛҭo59[f;8tm|,oqH5TlŜKZr_GȻkMͣޒ|*VlU 19IᒨƄa-<LG\CΩN.[5`d!+B'*jZ+`h  P'4&S¿EMkfqYhVοg_a~]'qx9&yԵϸ/s!tUz JgTk6ha 4h*L>o0 {u{oȓ'J&‹1l`z` +1_mrA'0[$n&(⢚DjQ%AUʈ˼Q<~=Z8$kEd?QMF$rzyF=t|$Dz[`yDj'G}p .*C-Niܒ0}D3ِ K/hi/I~n\ԧx AL&Dk8`^Eo |#*kt,V_֬yw0 Ty)D %C&vҮ{-U'}2YzuOBx0v~\,Ie7 2GL\mXɐP^aҋ,B + O˵V֮Yl9faeڳNX½\`"ARC,)xϧ8F' VDoN7]dߝ])?QiZ'gʕ9 ~5tz5LX2i͸yYJw=m(q daαl:0<<zS:rvLN~´"ްr.KL`4ZP],]=vŇ8tcVhٹK".U:yFb=o%5+wrZ>cß@ռ~ _SIq|jomϭހD+I =% glw |tuI\8agZl2BEu0it #?.k2<"{CdG0j*TL/(#V HHm[!!{Pqw:^1*[@{[k `t^~Z\ԕm{`,`xjH6f<__{ɑ㊯.c C'r[XoM$bs`.7{R#7Bˮ1`K]Z#߄% .?Q]\@FVmSՎl\͸hY}5~ CE}w{!pR աL,=-N}KMVȠtg0$ 2R.k #jO|)-R`gc)UDHtaSˠIm]MnVϩ;caIRLۻP[n rωgL*JeWo~VJirً"HK+ 0d7MSoL[%mo̾CўY)­V,?NrGʈ F=%e:Μx6zqvBxt'ӴCm#7KR_ɫZR^1^{y+o]/1Uf6I(8"{)IL./\lp_ O`! #n/N^Srp.\ 6Zelg*LٳpfXsrYD*RHu+' 7sJRrB49ULRfU,MD5b9_-FdշMDw-_/؅dң \~/)6i91|] u#/2;# {ݨ0 1Ϭkȗmwn_,@$Q!ygs Vddn019ipܮnJ\$MK)`rĿ*N|1]k|#:dam!>j1mAfow>rRNȌE3,3B. ~DQ}L^78\ռҢ#Zx'AN WB~0CFsV|?Q6~pR]q짺Y{6;aEJ!k{6u *i-c;M7U&WNgUÎTBG9GÛ!PNjև<.ڋQrJǮpZm nuP;Xc8U_zgV?(op%=Td P\.{~.ׂxar ˋ_˻6]-aoyy ;Xf.drA…>Fh)j"*9ZW{ک92V8A&(!TMD Se ``rk'Q{Z2v +^rŚ!orcƭ&F3>2c^7a'*p/6iNlw"R?Ⱥ|W^ I[h."#RCz 5G ɉ"&Eqk=[ >27+ʥ2R9 r$7.q /{1D: cSl D˵ek<{NbLw{AV7sLf0 F5e`5ymnCgq75!-ő+7*倾^9{w0lt$A EI" aNqlg]\w|r%?󚟙~jEЅOqcn'fۑ R9>E8%Mi~*rUE"::Vq)"HNdT~OwY_E680/+'d=eNq-RUYGJLsZOc?6[ {dB7*YҀCգ\@wn*Ix}BCn#pg1Akio|%G]ٻږm"uĵ"")?}3h GnND3[flk G!QZq쓄c]!zj ُ *+`Kgb\ED<[H5an$=h;.]*])o l#cC߯(V-S Qyg }yZ4(/sF$ bg93~jrcF%ٛڼԳly c+iԾ5X@OH)NG)],P4ie; FfEB%ٙXljbm~+GSsQ =^pxj7Jt@ɾa͞yGu:n z*\aV){7|<7ӉŻz ÏIT|PK T,3A(yCnZ[1$i$8 G!^$8X: ud?}bp'},#Nv҄(1ku2~)9?nS@}#C"ͯDi:wUԑh/xM`LxT&P;'5a}k_`R wVWպaړ|ȓ'ݎ`;)}HH|Xp V_Gi+rΒ {VֹY:xGb`Cٲ7W;f?@IY`"yciF%zggϧ]4^4y ^ӥNd8ݻ23>*fm6uz_R,yqUm:e|؁{2/}ԆBG3sV O@{w*|@8eEfq: 9"ohDa{8cq+WԜ_V§2 pJsQD> 7M,ЏgYDB6? %cP%qSE5k{! DA1 A=w_<ᮓg*?䚝UýIMt9*/նD^"ti\U6ڇ> v;0}][eaR)lZ?H 'RZ0˜DI^IX-WTÎe=!.CG ՗ҹ߬ C%Wr޴Fu"aR>I^C[@4ǿ3#WJ@OshXx@++J}K@ayh2k&ʹj oqsCyZT ,)iS|,#WUsc$qԈ JaCin-Zs?s mJwτv ` =L@@rT" cy˶8h%r&FF/ר0|:55D40jPHP.ҒWN.$D)ww2yw(p%Ư*S>~S9N`W34Q:9n!=Q/GXXH;,vzvlKr؛9˥u5ZKOA1Vm:3Yk [֔j9d~Zҽ600gK?PbPT-ة,`f|ݎмkkӤX P~NvlO 1 ؍e6iˆX0 aPmQ(e&7%}gZR#}6|Xat̹.|T<#u Zw7jvV1/d=wKֳE,j M v'bi"{s-`op3#sB.@ ˈ.?UJcK>=>"WV cd%j)!Lm}߭6 vSB-0 vP'pqWR4[0t 잉s}/! $B5ZulQ|v}ufsuExY([PJFVg:XMsw"KuAO1>ONވ]3oCc% O HM3k&]ؤNUξ 2"B%$ϛMlbPM_k|n Q-}*u ֏0(eS5 }e]>P z,tm8(#NCrtZ޶SNϓK&iF<).' G[RNEdjUě.hwWjQ{ .N%Bl[AG?l,U 38!!nT+ąWFxޞ "}b:aS]@}7|-bP!d@ "ɣЦúp7=_(2ɑBmƆ=T/SlPovpG,$̫;&P=vF"痼Ko/%$IX%y3]J26.:_k!#3 6Ro!r -U6CO;{Ig ԩ|g'ҏD U޾FڰB'NVR V~;Z'%$v7Bt)[U'JWsP S MN"lWKň}5$KBஉV/3]G>d;M&~tawxP8g*[(U<ϥܾM*CRv?)Ǜܹ!Sɑ\9"H &1 󞰘z)f"cÚdD~6GH ?RBWբ;$T#?&M,⍭2d5:'\Q j#ty^+/v.S裹Į%MDU7l ouU{r `S "yk(-Q6QǝefЫ T_V-!誧դmr `V5~!tb[Gj. ~vEYe|l/o]DC's҂~0\ZOl?Aۅ2m*$tPwP-f]<ɅLUz4y*j@G*'eg`vQƞsL$ s+oT߼rrkwnupX<9+ⲕ,4lV(4;˰8f*kc{ǯ tb,ޢYp wU1\ jM3\{1MIBDJ{tK,EUq9-鲚\k/D驌97N9D;޹ki(Lyx6!a .|tBGC  HWYXjv?;aO$#;Q9چ7ȼ[1DA0n{^\:J.Y|.m]yKf`K!J+z̫}sTE3n``Cȯh%wzs=L!^mb >s'"#v_zܥF{\Rj>5K&JĻN?p˓Oпz>ݔx_c2ܳo_#3(.lRV\}2AX>tX7h *lddb:f\Ls66 NmI!~vlG;>^iۆb>ϳo2 ̖ýkN.6߫]wNV04^uG1$VBi_gyfSOvy/2ш֘Vu*>re} ˾ w:(0QhDaA ;:&힣`b9uA(ޑ>JEIjmn,C9Sfor@YZFu!cQXfi;*,}ѵ`4@@L\x;ڐ5=،L5Ip0W =mGc <ޱ_! ݷ*Y}_TYMn#ZC_ߨ~H!NGqy ND-w!*]-8VEjUî_% UZ||6l<N5&RC@G~@`ӡұc{ JHiGuɃ+e#!A#}kb5T)NP2+CUx6 =<ϧt6 Qglֹ$06j3$ִ :rk1HxezZ9t] RE{ȒйjČdyK}mO'SD^=b)j5 } hX=38̅WqWPDlVÐ!d^IAlpqv>E\ endstream endobj 132 0 obj << /Length1 1798 /Length2 22735 /Length3 0 /Length 23850 /Filter /FlateDecode >> stream xڴspd>v:msbۜv2dbĶm}uVW嵟ݧ* Pޕ 'jl `khbk223QP9]ō].WKg3 :&^y#@m`bi[Xi>C,,]`c`o(#@ `loeg(8x|*9JTՕTi?9::8^Tԥ" j=@J]U zڧoOǿj"jJ,L`](?;OkvP[:21yxx0Z2:8[0:ӟ yuNWK)7H_FO(?>'s2.))쌭]Ʈn.toտܜ֐/E>Wgg;fl6uwrquWF {{feN^DAFRBUAx 3z7/`$g.pً?r?̭#_T `@OSKea_5_'~>sc[9b:|Jp,\3+SO ?eEcS7pK DL?|gߩ`Դ2_.ƮV̟de)@?sEE<}?q``` eaac?:ϭ/=pKLB[*JMWBR0Vc j&B,eNwo(yڗjQ`ھLݚ) $!2%PCJs$W]>ՑAP;}e@N#իX-(gipE\D_uxˆ1Y3* rE)zhul +9bA†(9.$A&N{JKƳNC:5ʕiKp0`%;F݁"ƲzC QDɍV__8eTFņ+ա0,2GIh)oG*ok&'ߐx +d9s ~{> wrn`4Mm9{X% ´mT79p}Xv3A!U#tJ_p9!0jh @aqA1(S&dX9{m҅+Gze/n|*YޡTa?+ueQy{#uzc1Rb87Fee RTY]W,.$<;'LF~S߇9sH;ON; FK "9f mh`ҽ;bP?V%H.f9Eʶ1) Z}}vx00 Y^/ (Aj 5- ^)ӘɊ<:[s08ʧfPkQhHI'Z+u5s}$=QWV^+TUu$OӞU i:xհfVn9:^] jG83eHѢ|q/>r {K=kiB8xpHq0߽Qxvt î?䫦kbea(n,3:<89~o+hQKODhދ*7Bl>t#˖oO^%r_/'auӖ4|I@M"E K~Y. Wt:<▽ф àuY刕%񡍿Ar˂06ISw߯ļ'߹ 6&*'zrguV"1V C CT_Q >j̠2)hВzآsq޲z}@(^W͟9߷)V~E V_ji3mq@;Ux$tիNnJðέ$US)wT=*Q9xLof+KѣgOĺג6a삀+[Փ C9$AkVX`>ÁHIF T 0Q>} j1Q4a,Bgl #?/=z e M<ĈS7d:hcxRNzd\w+S-*)>>"YEsH4x)M.o_Iz\a:L[{Nbuy( 3YPBDLZO|2> u<}h˜f!Ҫ@|?z&A9ᑚ`twVvQ'q!0Q5nyKfͨ5qn "glxH0MWORDx}ZejYrjgli!e%Kwf3afvsd\)lL"ahAp.!js8pCC%?3 "VEt&-E^1FoBЗK+6E5< /da}}$WmR"|na+#q-U9UӼLS[ޭ>4G[_ y[Q+d nά1S3f&^0D9xxb?C!'-XmnE﷬{Rm}@a2 A;fck !bnjJQyuFs/?cH~,dXбIhe~R t,S.h7&A߉%a"e4m V]26Q{ê2@9ƕI FNka[[M/0yD1n`#F,tcw]? "E@yȸe)˹~œҫE|V7ՎiuoR@ P)=q:?i8gjqUІSUE1|> iY'wQǢ7ºc?x91M1Gi$96:: [􂿉7CN +-BCYˑBqQTei8PFmW3-7k*1na'oٔk,'й'$ϰzk̆ o_MxRGX!ZaVUGPL^25`ϾCof 6M@}*b3xCc\Ls: zXgZeoaje~6$ڱP2R0Sq'#RURbfll̼~& sX+#<Ơi<%RU]FpWp}sm~n>59'.΃y%L 4\)QZU4=KxYTf6Z2?U3n[d1A-[44/UuڂW!$uITˆo{If:؉^:bk/Ev!WLCJaF# U'3xwsNV<.ϋ|MBA6I_? 5 uOa?UwTճ5m봎wҙ 5hRi_̔(M0-~ @"k%kt!hp4F}Iph«Yif߆#j1C|PsֲUq˯F ]f6{R6=-KBUTl#?*oL_&QjdzKƶp^nEC`$g*~; dsZ%2-%yL]rnO' l)b%2NY?Z[G'6_ f3I¼.3WQPJ.PYecX3^s @S'PQ [6~G^/@ԎQ7DB864L3􏝤 1SZ+;Rvk7Z~~HXFй8jcUY+3M-T(X m~hMδ<bJ_E&t{*jM3|!r^{-1Ṡ˟݄؇tGSNqŷ)7tj_m9O jԢCl㚴xg)C#9h$U H1 BQpNZس$̳1 3d~|TYyD;OSM3^h)ٜe;0ٝx6h緩Yw%nmGG!-nY#5}ʭ7WTό+7z?JQ,IS2tW WfIfkv%ʖ`#UU?ĂW.Gik&GUpib l?5'F,-Vя3c5sƾ ^TGuQL$wIwUj^%ҖuzwR^a ./2= nB4[F5_qp@"KU`]Cm9gTw*h:Gnܗ'34#ZH_`]9i=ӺH%ie ̷EW 1Wt=R޴\ILTv,(ZN>F-jjҁ?u'V'u&,N0}I!>RH0IAs/n>dw[Ei=_;}؛IC7~C$nןY2H}9_P嬟LFN*D_u; kK RwQnF'iݦPk&G/նM5{eH)C@n,ӎhK̪fWmR,+NίIm^D }|5KUTB(@ š}uePܢOt 8 T]̣*&amuʞ>>׉, ¼&/^>}1r-.+zp!^I)ǭ(dE|KRBCr;jYnGނ;Eix 5 wIoHҠb8 '$^!>Qy^yveh/c"l|F '1-3FS;ڌaH`M3$;n>ɱkbXUquIjY_i^`on谣f^bXV+liF$hJ*G (@w2{zGE[$%mgA#ԡ,Uܑ6]Ϋƣ\N)O$W")O=ov/;]H:h߼"mݯNaf{2&)~16!~H4KXn k|YqWnִ3^tfDMS+sj&eQ8Q憾ƺL;<jP4` Y" L<7nvL;AWcӜkwQM]i?mJe;g襠#x~d0eP/8M'[57t>' ;xڝOlp* 7k]B-CCEWķA ո|tpc~"I^2,XC9 [ot,~CGtt.(j  `OnA:2fKYdH aKӴ&cܽtztH$=x<Ō͑`ڂJYuЕMYS'U9K#n|kN\} y?J7`y.RA)G*U(q}ƣ,jGnŬ}Izr0q^"VD6>zӔ 5SYV;?v#\bG2Dԋ2NOEn4V8>TIpcT/(ںVG2m3~yWg8a@دRiHO]MCbV,J56 *y/E.&5p<׹_QƼ@P4J9/m͆'ﯫB,αel-cS J[6Fgd\pȖ ^ a4W9#seXr֎Q%!? ܺ6xrSh&ImJEɄU慌r)+\`J0h}e۩U M0\ H` A-4=k=h1OU58]_%Y0V));|,^.|s7opgh`h"u >YFYPI,T:%H7 ,(7 `VG/8Kͦ+J-@eĢpj`o0n?U|2nA#:Hc( "<~^I3g-.EIdd[CL; "FG;:I`5챛  RbpwNO>L ~ vLqLh)oc&T?m̊&^ɾ噝NSJ]tPj/隸(! ݰal{#mxAp[xd.'dwyW61DVQI@'$ /iTRx5?hJ,&&H' fP}I(u` Ezw(:7ig:?G~{;1+ku۵߲h~SKYcvbR^୻`I6Ws%Nv*OL/D=%/:r|وՍyba_?#Wb7zQIp6d_jA_hFBSĆV7*,4E;5y_zd7xSb"Jħo^4a[݃WBN ɜۧ?==k_w`< jʃ{H*R^dACw…T<)_Kʩ}f_G a|TTe mg!nI9%;hФxG"h{66|t@:E&F!I qAg~c'ٷ:/ I, p \nPjd D1 țEp6׎?λrB MS{] TukzxvJD.,"")ZégHsUT.se]$A=13_\'WĬ$AfX%NʢDȍ5w]1Z∲1R[7,6d e⾸k:V bΩ) ϱ,RoxpnQWr-_ fnjݽ1Ҷe| ȑi{sL #V\j=O (2I/^ah99jG(nI6׮ozOv buHUDLV?͜Nl,F:+!sjt#!sTL#ӷBM"TW1V!ԙȊ¼D-503P5vڀ p1E iXCW 4d=1(^~Wɚk3-j?7򃞵(N5'Y9&N uN=pgf0M>.D*&cяDil1//lyNŤgu~)(HwPf@rk_wQ:nk347raЂ1q/d:#Ra C[ jdQB !MlQ>W)o=gz<Ga˶^ ͩQaZd:nmdR1 \VI:s9_+? ŋ*~f057Uy-Gh":Hoj)K76ꝝjͰT"K*"6`V[[ rN/rӸ&.Uwh7u,`i8:$lށ6s0Qf m Fgio^ڜ5vi^F7?31.f63_JJ4a؂ISД4FPJ8WJP:70g`2G'琘!S,E5o;m ^}}-Kj']9y/AB΃:_H }wɈJ_0nU'z)AOASỽrE6+ uo7J5|ZZa!7#2Lq!.SqLa8D !'"IxCo%vrݦ?G/=jXe8n]L֜nCtl 8TL\scTC #GT_o#z^| ZD 3oM\S7Pҍ$wl~3×ҮyS1P 4tmg 3z$ʆIaZO(OJji/gepx=0ߟBRb Py9sota|1^ϸXa,YfՊ ~ ϾfL%^2FO!QY v'9I9>^TƧ +!7ܒitMGԺ !!v|ڲ[HkdW BJ0~17s:p7Q;d gRg",s%yhJ# ~5b4f(J:&՚ڭ,2̚i9g] zzn?x؟߮lG'Idk}벉$l)FVE9 8p)XluByYmI:#?Dvx-5˞8[ՀR*8mcKz=p/"8ne*6Gu'd;hxuB7(Ot/$[0PDD'c] ywucdz['L}TOɉ3΅=$CI77B 4ڒ1gQTBޅPv|Zֈwp9chď҄em%Y k;Uct+87 /`[s?ugEَdq2S\}҉5y$'E-dUh *e1X9VCTVAWTF{Z[p5&u -H1IA- +f/k""b0xgQ;Mpx+dZz"[ 1|`2ڑ\R8MW΅2A FQGd[3vR:Ar)a/}˥kjI؜%t9*Iwa 2YN*/] _j8ED+!nJg؅}hMRڬr]D@:^G8@7&iL2R_Cy=R I-.@eubJyYw'!:aq16 a߹dXP# ˭6 -=Z&ʵ]Cf6 o0{_c9=1v|=EaI ̉+S6kwƎף ۊh;+|N}>&\k9#x-O' Zɻb!gDc6fCh bvTU.M(eD{+ue(l!]M5&q$y"5H vp9|zQ>i{D%馩U ff0\wuaD%xp?=jc7A~9ٻ92G5}v Lkm$ ItYJ㬰x&%X14&iY8f'at򄺛A0BtoZV7de3\{)m22oL:%U3&[\h7'@/;7P?RM|zH~#-C(>ܫam›/ eû{'dWKa+꫄knD)G bcUBQZ^:GL'r9 ,AU^HǹHYFѮǐ0`9[ϓ^\)QeOsfo+p(&aCY3*T j?Z|X,R3`W `ωj %E[z. "L+aw!0 ^g<+8pw|^ 1z`lHJ+mNEx,wژݭ<>]{9 KlI)`ChyGBpF} NSzw<[9rf.xGY,iY~~G\s ~@@QWм%Dfk3 4#Ki*\d|),t e~nb9ttn6UJv[#e[;ަ6pQ2r LNu9/E\qiRS6#ųjŽl Rٞdq'gldN?R-U;'3~,ڔ*z f x!KީI>&9qcEf)a&i*-Q gC]ONSQYKO׏@M,|$S&2+ēAsVmuw*^%SŌl_:/| R,S70ঽNG@I|^ `UP8M&O [ΗH\FaZ$z8ao2(5u.CtaFqlʝy0QX{Oa7 2|z̾-.w/M%R(i7H=V!(| u|;ڀL~t!oJV^ ,rH+c.MO­Ux* 1E *k*~?E6pj{p VBJ"[ղǿ=-i3V]{:9CfKiv;k+ʴȖOڼi58TOI1d }-SP:O_&^IRDψ?{~?g`-5 Kk/qA &_YGK&t{(dڞo -SHdQ桩+\Cؠqpdb;.&koVԙ#1se%"< P]՗\nq{p]'lϮxE;mO{8 cܭ[ͺg H.2I]6K @1`,\#>a`L}VK ƢW)]܍*k2&7|5z|gi=n @c ƅt-岇t;eIܘ )ZxZ8 safr 9#r 2%x2{M3&AԪV\KE<- ,5^~m*$G%ŋgI|s4Icw\soc~W1vY22&đn)4"/ݢ@x5yZ;TuQ´g573|t_OTnYZ\[ [БH![s *^?ξ@uʶf S&&,J>+jM @J͏%nxO/-=FnYCS9wMBur4l1r3I1(+濓R:8;7 (žR5cKVog?JJV;_B%ys868W/BB://6p=Zc,BS~ +b9q֓Ay/(RwPU*͜ bJCq!H?Z*Dy՚sW*9d\))4'3-Ƥ1@zUV`hv+|)?a_=ƻ,hW'̏fc&Y Tu)1xJ!F+-ڿjD-GsȑvH7x'үE7d2]_x(]nR{)ҚrJM[Zj%a/sxij.EQD~(PwE6#cܼXPryet= t1I[v9"_QDe@h`6/cRb uA7ٺi}[X\GpȘ7lL=ԯ"GpߑՑuy/)~/] 멣X :U=]7~O8\^"yOg 55GLLl} 6{# M-"W|Wjzĵi{#)KA_6 9Ӎ)AeT#@VHG}$ϖ\9zY_S269@zH(!S\y94cKQb)EGRZlJB=ڑ,Fk6,8uljϦPvx4π0ci=j buɑQow~V<6~گ~KU6kxS)YcYPNjcJRP eL9}kf.!4NsAH͓PKDy dF j0CMVd RJm.ʊ/zzX?̓XEaPtSs 3.RT=@w`4spg" >˞}+ aTM# Y,"9}f疆 CˌGHԎHhCgIt A^Jy$DT(OTM H-RjFfPV'Vb0/L ^a?ƱMny0eXkqkޟ3yΘx0lԐX2ח-亂x翱^H #xԻ 22H sWtKǭ0w-{3=S$e#$\tΕ"hAg:wl0ufHBk'ÝY/S+dRc``+*,5'UuGj7_.zM_k6;pd#"j?` '&}A+ U BdujYj*섇ӯW>Tu>ߒAZ`ٺ\B xl/'z8 euI8}q'lY.ت~|Enߋ2903tR`'(,ɈhGVn=0<jw@]1g=  ʘHJn54H!#Tj;+"6P"ޓMD_NYN6z æ<2Cv:p)}$HzVrgF {t`eB C'kG4|X[?\@ͧv/EUQXrijpN G]1 <ԫv'#N6/X`nWBkObWAw lMB1ke)IzUG;`Oa^Bt̃OűNSfόB&oU^Mfa*xiyR<OA|2ێs!&˴z1t#ƣQYrBQyst"~ײ;C]es*im0>͏ptSPNnŷ% %{eN=%![1!ԧ--!yWWb:!T'ܵt69,d¹I+I)!]3~Uo[נ $`z0KfwNk P/tx C^FѶ|ҳVe縇Nw_f*h$)c*VgZ"?o90J2R|t endstream endobj 134 0 obj << /Length1 2072 /Length2 22981 /Length3 0 /Length 24255 /Filter /FlateDecode >> stream xڴzeTں-E =ݡ+n-.JG}θHt+ %@ L<Y9#;gf&z{S 9dio'f8A{ :;M9 H 2 (;荍@;sK; {O Vz?d0dLݜ-Fv9ۻ@eo0Z٘@M @RYAMQὰpUQU ˫tI5?@wtyw>UUř p:9[i_(ޙjdoW` bw2gp3%黜  'I_Nw)ߓ%.OMhcaW,33y\ޟ@SD]tm|{nj\=.@ {?{fiMNX^ZB\E^}ձcSOXL`f0;kg?Yw`ϡw/M],]bnBf@GĂO䏙]/{3 l \>^t'B`ZG U]/;g:` 4C`_$\lllTZxGEh?r-%,݁ i/4}mIy }gf/X\ w0J*I*#ngbojig`a99y 0 ;;}MMpp"{?'Qo`qq1qW1qMۼo LL!{A3˿+C{ -<,v(n|ga^oko:ߗo@[T=IRv?x7yZ`{/rjX#Dd~ -"bEgy fN%Gɿn7s@w ꒽ oUjshxL497YLX P(?^VG79Dx:Z`܊E LnV)\ojE;bXoRHt+mC/0`9`}_=aE b8vcG "oshƿ^ -;eAƁ'/>M'# ?OrO}>amd#j̰!rg9+Z͞<+&sy ]ͪܘOEdv6UD |%thOD_L7X0Z3ax{]uN ]|͸lCda } ĭR" dKh!@ᵻxKgZUL&uGeAqQ`஍;MQVdЕT`*Ÿ#.ZNWˬB8 ټאx*G@4q8T6YX57Lx_dU-g^ʪpe>)~Ö8N1$ p\"4|]sԐ8 g_+a8g5ǽN[W8ޝPD:gPv]P !^RɚQ;0כeP8w!ڧ03\<=JD k{+t'H nL!j UqC%9shX!1Z[@Fê4Lt3;J_3g~3Ķmk-~s `_4_Toq1*i<-c~lW#ZEj@PJCز'eU,S$gƜB"PTMm Q0"mz'?!!4oFr 5ᲷcHLp&=v:QfX& Jul4UԄJ֌ي:<,/i(([´?TVY.!|uP!d&[%J|]KKuF1ѺVYUaU@~t}VDtE_K6^M3' LP/z׭4GfP-E'kcꇫ7=ey] / ƌ}tkM["b-B{-f»6TrJӚO ʳ*| uThǰ:t5W1%)n]Uߊ LiJ1|Mzkaf/e8XW{@H Nhv5BWoV>9Yb$Tn&n= wbAQxSuQ5곸0#D5D aTfUғ*J?KlQVdƒ4O.q6.{xȧ1 H*RC^X$C aӄQQ,]4oAy7-SI% :H +w N=INVSa&`ur+Gj Iy{xx\Ð4~˵O2B/m:Dl]tFPc=&s#6 >%$ީPhYV8;Q!H! ;tޟM\5"'7m7OຐŞc"|c)E_GOe%|.wiZiJtl*bWxX $0sQi8IߔQY:Mڂ%-S#o˷ |fKl×XZqHm܃c"yLݥ/Ǚ,l84ĬYۤ @bѓ*zFG^@S[,~t|fey-?\=/ z]+& FoʣG"z %O01 gut ( /ɀئ'K &rr5. %CF`7,_`=݈U45vUE; ^\j3#3v:A̷4kyԑ$N6{w24 IO㜐'(F`9.\DZ4jDFT:r[0A3D=uL4ʶ{B,EegL)"[ATOjᜨG\L!d(Z4@tu:z#?"VSetR?Ww&q VUvG]i Z"6T܎2 /.ܫ)4^5`l ޾X䕊0Ԏ&S9R+sqoAYExNw%-|8A@\QmdmRQ\k]3'd}aH58Q~Rqae H0V%/"sFG1M6)E)WR2ޛ5ʳCQ"ns*V50۷օj=a#.,U3[ ©\_S,o*Ɗ~: l9d]Qי-DTV|Z0wW NQ J\ &Jz (`> o?~F֠ʖ&XI|g08&LA,}4->m y5~24" ؔÜ(9y aN&Dr '+Of':e+˭+NQ[\ =|+l#q7ҍuV_Ӻzh7 i"#?2-XN 0g|,A9c/ yzor}Sn0+fY|h5UӞ:l#>P◪ơKƪ،Du]ʒbճÛstd˴6|<Yp,4 :xjd\<071к8hKpP'JMFDHdDD,u02rҽ=|>MH5jmq.*5˄!Vþki]fRtOwtr12&gDDk'"Ӣg{ȃ}D2Q]DpV@*qy͋眳t6Rx=|!K+ vԢrV.4鑃G\=-F&y9nST3փ$Z [<`}zn>O h-=#(0i!Q|\8';'Pm=)fD/m)4}m D\t^[׉)6_vJz6@B _LD}GOUPޯ]uSg b߶6ljOpf8Hd-n WTEw8s.Iz sk3hfzdmmƴ3Ad`bl=]3܉\0<>L7.KpHgQ=!DuB<^PzY2kU$D#HpX]cqc\K_ӟ]Hw_,o}ڥb$mP3Gt5*^kz+XԨMD~Q7F[/TgF>WPH)x; :`6֖]vG2YyTC R&mo3 m%6f%ەqv3v_ׇ<U<2!5/vbJ袳1ls0DXeeu¿(pŔѨ=5j9#TԮxShy4tp홺 ⷻ3Z^s #~KqR$=J8 ROx]=} 9ZD;k&Nk)7ʢ:a& nBoI [ϱZZ((&)|s+96޻һXqghȗLi^IjWo?v`KEtWOh7)V\jfxw"p_ljQhs boPr/L8Rtش#YI >Q#f"92

R!D^ڼ6c Uu">m(,"z@ ?]TVuN򚓹#TóHRө ,G:8k+CVf% d}r,BϥOΆ=eeIo^)ӛ (^ io~P pOe}#q_TCRvitpb+Unn7? sX, }o/Yʤs'iFHRsu/ ATMԵ*fgۂ |H{u*nzu?FCU:q 3}4X%zVk)OcEɝɞ33.5r}seDiJƬx] 9$+,ǵE,qxky\vL³rJ;ۇN2xOLp1zi]2qARQѼ0t-xfs*Γ4%^klQ{4!q2cA)4>pӯj \_?Moj4k-"cz5r"rkao8ܫîEʳO)qO8p~6xD$?IIS\݁7NMz)*9Ilh[q:<N~e% \BcRJ*ϭJc)o&7>꾤K*h:O.{F908x%U׹i8Qwrj\VysMGTR,;u*L n Վ}T DˏZ9%?2MVhץD̜]> . bhuҊڦx7UdU_XpOվ),!::ҦK'?鈧zI  vW!̗ҋ0g }6GWrP^KrgNI;>QO QvcHm: K̀ `A^-yXM*C |dg}E-qa&~!Ŭ?,AEb\޽}a$)P1dZFeȶCF[K&)P$&@ێrN"]bWXb\xBa1`k g8"QF|oŞ pl6v8)^jA2(nv d9zhe`/6VbSN ^6t Q.Ve7>VȡL%.(Biٜ~7t]M{n糸9'@~ Ǔ05J|rGn7UgYWc #>?sWR+x>X?`ɏ1TΞ65{}35e.n tL+廰@V`%)Ѩ)>:GTuĘnAR@%AIV~ `EA)Uъ&T>WB}1r<0Ed3Ӫc'G}eWbRCxe{:%SK"XZDAoqrYB~ެe]Ky@c^f$!l92#uMnyZ,r_%VFv_{r^靦zE#"='F쭿C྽@˹I& &Fؘ(AgբG,AdQ`4'@zȴM` l#GHO_0Q4c\sfRK Tv՚_~q,bz?tmhC+EH d24qmTP_wLF S9Bfp%I)nO[bQzsxTϼϝlh<7@]FnmJD@Bً v-/Cn *iA] յ*lI<0 v\pfcsDvR5"Z]ˈń.Fk~1֜;착$-.?sEq}M}*c2Բ$ކu2){`3j^ar})&Tc\]|O' |q8x+*XX,M a5ntT+Qox&է_ݛp hq&Lx{z>_n0Gsyܹ'$I| lql , 0 g9h&û&Jm y.Y`AmH="KRRH:Ihղ8mOkg ջj2m`a` g^X#yT15 GC-"4QDVhI'99≹֯|„)1 !qZK?nWtǟB`1r<7jh27"hɠB"vG$r aC*g@l8Mvqc*b̰FXP`´+ˢ |a~Q͡{F;-y6O@0E֬il)6t\3*׷i˧ z=Wou-c/nLl n[Z.1ARz ʞ%/b Ϗ@gl/A g\wAeG{\)Hʁ,5w1I BOfQeP 'isVۗ+Ww6||C>ya"~]V[Tb C"oY8x;\pi3r5tTlxz~,"ݞ$Ln~ϏH"hOq}z!N#CylD8NZeUJ_9iT߀SJz??O ^ Ѷ^[O6[8o"; j%}*k"7j*I]צjXBmnVGK|||P 5\Zq=yj`_u,0 ,n@;YRcerg~./vPחvh[X<Y"%ڞA@ AAgg->&e"z~w9ȋ9hWWV!pd^/ ouӈ%r&[ S8!Ȫei[4Txk}F_‚'ԣvTd$ƇFRmQOnW18AL&(<(@8Mgkl09LbQW !b`Zf=eѱ8>{y.ޡahsYu,d| WsIљe8[[ w6U(!$' G#58?ЬC!M+ @&gnu=(b5phx5> ɝr|r3_QȌ*E-%Y7@<8JnˀMIUv0% 9I98E7h>rvah-χOIzܸ OLΫ62{1Q9!Es8gB=TT[%āU<} V5ys ˽U&BG+\tDt~RBy'yY~8j磠!Yө n H S?lg4u96_mtL?H`=6v?wQmX l5> vE>\~Hb^TqpLnىD mx8jx!p?̙>a+yjBY%tdlIڋlp=YA'`f3fW~N962}.LL$Qe<(q^vG6p$6vMuWz 䏭Vs=`̈Bka+gҷmK3 g¼b#rX|/ ܦč2=jEWCxCRyzzv|.xy!w'tƗmzz$G:5MONԞxܭ%-vS:8S:`U~WCHL1-`rWJ?"-^ ggZ9ټ!Kf.$r6BD:v΢T׫pD?,w?Ws0~sٳQ?4 x[q4hikiOG|@:x4['\͇1Dm1gOugN*~!OVd p= CkI=maM1c?i51E$ev=i1ko09|Z9o:OOJ]Y\q`ܶDwz[doVc {-(i)ko~1rҲ մsF2~l(Z͠cQi,f^UѷyyiCBu[>hjc8fO"(̲CԯrONo[RUG)m O qmo>q(Y wq1NʛM#oq &bCRwQG_7w[U5ǯ67ݚ{B# ߄`_)k_exX]&kPG~6kpd^^HE0`1aP@ K-[ elHayUnz&mM#Sc Qh]rY׿ M;|N͂$Ch́QxY/>هϿѱB&>'a9NHGP#vwuYTugh&" 'rlT!U{2jq}RIyPƽ7 *P u6;H8^a_My;ԭi۫)l~pI~3f )W&4yM TYP2M_\–74eyCZ/i.In˱%w Z` &&>'Wָ2( +ˋ~ !7k6CѤ22*d׍r'"d՚"U)Yv'L> |e?qd)WQ.ㄐn{#0[0~D^}odZ?r#UZ >|Fw0'h! eV4o,/ `F-2oΏj<1SHY0&êU2dz)2;jt땴<șC懱w!V>JaOx\qZc'.GU)/b 70F~OEg?tpd-oju\#ZV@m)tCllr`zh  KkUO4Z;V쀏LRB.Z' }d&ߥ#. Lx ; ؔp'\D6z0z6G0o'T]WvoaA63¯&c벣ђ1,G313BEWז90teVˮekҲe۵l۶ny|W8m&)8lh4y+>pJDLvO,Y:YOUET#@2Y֜vҽh(5dcrs7:Lc47!h9x]wr|w4"/B$XV·T*%lT.ј󯊤;q.o~DRL/GN২JyEb,2"U݅bQBC5x*10 YXЪUe=*J `*Bb=s pLw"li\u{I-A4B-הf={yoރy-g%:bYs"sh:-?@K Og8J*T≂%Cw_"k$U7ޜCC!^a:*đ=U{W@vL4Nbm5#OIT^d9.9 {Kt'npn%oĴR+V8Eb1QA+bH&qڄFtR%8d 9y8YYъMyUP(2xdr6s@s23! >nIU{' UMv̈I7~Ϟ2 YHwIIHBLށMPo|+dU E_X'WIrhq*ԛU< 8{0DR&N#AܦN=+5.1$N(Vx,R@QƇ48It C!ȺK}(arRo+zU_k5yt۠*+6Np5F} 9Бi]o#%t==}$(G 4ej5!ad^]jp|З2j'F]3JҨ-̗ӫ&|4pM'M=:8|5ks-ۈW[/б' <\#"*^gE?X׻@A¿6Vrܘ:v ݞ]1"fHOuQp%˳2|LU8$OauEA U XP`N943h7Ar\ֈ%(@>%8(0ڪK\\=4óh:!4W'5p5bzVb(}['L-`B[)w$r=kOCse޽jӹ(!qkۇW9hi[A<gO)b7kHFO +Jd^?o)Ѣ-ipU6E]Y3M=}@2{Rj)o}a*Z≖囆tt`WQn}{M*a _;P%O>+=eT`Uhr鐗ŇQ{+>g~{N,= I'ӜD)f?ќ2^[>Op7BI·٬ ȵvm"]Z.C"U"sӃ%ͿTDJn.^|1,4E28C2I= ؗޛgYԣiF^1LU@nP( pS=3csJ`o3q`ZHQFWoUJƓ;D6DBTzx]U.e(EBȢө;@n}3J%{zsKeކ.~4ύ5-1vLA( rbw1=Iɽޠ?xE #%7TL8z/ym R<,/,KD3t<3kVQ˝"؟&1I$$+@N GX72/ҶJh ^ dYk Btz6y"/_4y7[irhJ1m乨PVVf M'OpNTٜJcdijCЉ(z,Zx5`vܯBGOwMX;Nn"4g&*rQ{V%,Oȼ9_)*Zʊ ߰{1z?,Dn/Y1ӥ )Bl0)CX%5}뉖% Ŕ^ ƘPjzf07wb TDc}6YXq6Wm?(nXa=q@""D!!{꯴0"n⥉%W:>LFc(0<\W6>wX!g6n8[~?{[% %G!ԣ//\JZE8bطq9tKk=jJ~{n#IW|y˝g|mr0Sw HETo;ƥi<0{V0+c=8Qfp[|V}!x7RoC@S:h!xx ##')Gվot46бrϨ:}kK2v~^`l3K?}v00B"7_|!K%VɎF"]Ȃ|o(Rx7ABd,gw>Wxp!4Z:({(rRJKwqF?&R>]y6aL0\yC(zewޘ !q$#=]:E1и~{S;. :96jP jrC܊=[(N#9XY]~,D_/sBZ } |@(9k-"(mE#km0SEIN S:Z Tl-cA`>m+g\DLw_UK>C+ij9ORJY'S7}+u󝎳Vc5 Lk7٭P^ِ|ƊR$a \/RrX˸dX2'FzzSl'y${ߊwpcFz:>,Gb#IsV$F$` Z+0 rS\+_#/n"i Ch,(g}U$|CK84V`=_B}VGׄ`Քa>G&8ܿ j|Hoq2'k54fxfgx<b6K},]L>tvv#lE-%t].Mo9̳:IH: 퀶B\7O q6x6L9ւkS/$yڹ)}SC/8$bR" zŬck,)gCW bwzX=\߷)Q+p8%v2ʻa;6QzcՄ10+ zɮف\nD{.7XF&Rj  !WS]!JK('Z6 ̶bsi6 R=_ YȿJ I0q sp?B 7xElTB. 즗ZZ~AlJj,[P #!1f Mi>N1*%(쯺E rD!w*S$fRPR%N QtE D3lſN}HQm1c&#q`C?4Ii`}DþcA[PGB?ģ)eػ_imjoS&X2'1DSC-CCu݌yhH am`.tm ]ԏSG䐳\,9[z(SSC+D6r- H|B PLVʯU mAy%sT+@$"3[Կe*Q-螖ʏ ֕AeE.`Ú؉o򮜻j儉~N9RY*31ezyB:*z뒀BcHٴKQhNֿW'0QgN89& h#S^k& UX[.e}Q* KY)'rZvu ΋q&鲪fns h9坨\i퇭TgYUߩ0z؆!DN( [(X(>v򫓷!A*~ٛk vd/TH<}YHX1Z9bd?(rF# "BySMD&]o< JZƘGX]!U<%XVĿ&C-0D,JQ%z.d\II(|2r7J7G@.#ש)j2dF.{O{&b$#c0KϽ(8evduqehFT!ѝ'@bc;_KI(f"HmXrq0"x{|m0{0*z)0}_rʴU:FI~6S|cp/aQh~1lãĘQ&n( 023|mP( %e4ÌrÐF+WӿYbvխMZtF0m6z~iSR_Lu)޺6jۡםO6; ŋVe!KA矍}"_(RVpeܥ"4s(ыqal2}3h`,iʖepK(@s@1GErE7J~ڸV$!FfA'385"}f3Hy鵲LQ|g\S ׸qf<ɏFqMs(;ïsaם 4gE<^q5#,B /O4Nyά./j{ &i\ OL[:e7jݡh.\cqc YY[ F?\U[)f;|]( ΛލYQs,b!!ڇ&hQs{XURKW7/F0Yۜ1,pGUco. H%P9k_Yn0.bK#LduD+19M R!IG%;eѥkK/^m2t|G ǯܞ xcuut@e╯?csdut@cS'EVl 8pVJqyjS׌_0!oPޥ+ɫ5O'YiyZ;쁪aM;(ܞeuyp E)jyny\7 ~"X( wa $N#$W}mX7`G[}36TݑՀ,vq/|hrI&n'xmߚ,c!`m}NT<sd۸_g"d.-ЖN=FEtA +zqC aUA]&3qLV˿%f/}Xs_1P\d4n.hut* endstream endobj 136 0 obj << /Length1 2156 /Length2 22489 /Length3 0 /Length 23781 /Filter /FlateDecode >> stream xڴeT\۶5S8'8wwww-]wwww  }d{j%}h}9WUQ(( 2ʆvLF6.&&V8 a'SC!Д?R,LL\pqS;S  k 4Tp0eP읁FnS;sK;Sa{'Ks T-24wsڙdrnFK `oP1**)ĕUi> +88;aeUq:(T U9@NGtYQAMQf?k0\M-/nSH5stfdtssc0wq2;38Ofd xw21K;9*d,MM$i!G҇obBԴW8?X:+ 5 .lOS489!._B+ӱ1t+fhmsvΖ@U4YژaYeUV<;zYup2XLC*jg"lok|":<\[ٻy_M\U$E'`:Lݍ-kZ?drw8X~y9N.>^t'cX?cU]/uPQi>v Q1%bc#ghkJߒwDWrN6tt75Q[K%/hgnc gfQφ܏be/P[ۙ:;Xr~_?C(- I0Q;c{K;s ;cX^Smb׬) dg0 1 FF'Q߈(7b0J>"8 Hg߈7ooo`47bfhholfo?HY~eAߐ?C֏X{0 Fw0uR?9~Pqj~w*<9 NOaeǽ!@'KwmOрBB^L~l?c\*:>?4nuޘ'*9W`OC*b5cG$wԔ0?^F[79X"m-jDQ`WITp"GA50SvſTNf |f{|;@uD+;M Nyz[s ^l( #6ڰ_pwP )(}"B6s}Hl73SΖ kcu7ғ6Bh\QdPE󂇙 wdΡA53uLFחuƉ-@PX$ (g&[wNH0<{4X(?Ҩ 4t71^x{ |=]cHLAD?He}OܓOyTgm]$.V0F;÷ô5grpp߿"p.~[J4=HcŊ NBic 4g6bH.1ڀԁ @؃̵/\u("Ƙ`iL=a]9۷+ ܱH~^Ynx؊8y2xphNk0]d^JJQHDTݪ_X%s1q\P96\bKsd ^W[71 $崄 ]f^Ǔt /mo_(N7{Ko[>$gFC#j~]HyF Eq^Os 6 -K`#&qP6,ޞL+"0eW wũ=6٤A seƁԜ X𝠱"ڞI`~}@$gW nkAH7fA[q .̭? vltKS@d| ] ߦ*iHF+NXZU] *L}Kc#?E2hUo5H9ʶ Bg5\aG+n;iyJ zMiF?Pe"EӬDD[@]] I8YͮU)Y]mxk5IY R2/ <\ݠcBc%q+'XĖ9D:2 =GV$0<_-ݺٛnkǴb v @K8M* ;sZ{Hx'˂ӂֶZwFjO`6Ӝ^p9TUGD8S"k8FYeR!^!bחڬLF$P;<9n|dQp/qO9m~hFA闏`;XHU]< i%ZZm0RX/ < HnX4>I$]j(A>KJ>=oJN/a_\} /Nf|]kp:%登 V3x|+ TE[KglK{$L&7z(4ISQ!Fz)YRuog^uI" &Z#?62. 7%egXT)sH[bR8_zw?F5J=6xg!Mh}9+wa}16 羓|"Θ=[z<"9/7I S2p+bZBA}ڟ$l54#xS/ψ2OԖ-B/=\e2=x,|a ouR5X p80Aeo5Q6XSy>"扙VzӬ2C^8ՐҔ$@u1IwZ̎6e(C^I]sq_.-^<7RěѮl鉦ga<#˨^k"o?-8:2 kֱxz+`]Rj4]K1rK-Q*;Gzep>b?J[%}L^8]l8 m@j;*-D_ 56]l͜Vwypl=EDD||viq2Z3O!O>duթ+sCʒ3;i@V7JJ1!1DDjF5ٟ;MKc3U4C}F>¬je-:3ӝFDZ+`wbkC[9L{ gsN"UEA|n/c4Mhw) W`K;GLހqExqΞm˲a:H]hHLuGͮMW`v'&Ǝ5fd玒,В\7`{bC+ՙ=}w-6%q^"S$_S /i>_ϛɮBGQj$:q\%h=(=זE쟼)qGqz*!hCKFoh]C/dեp ԧ68Ȃ>RYJvߥ@FfӴ$vtzQjKs92 ȑ'=6 g!>Ow:T$Θ׼/i1PV@2{]Uɔ{Ao.-p%lh Y_Ee"]jcY+Y M"ьɄ*ߕ }*ś0 fØal40-f49J?UisA/ {M|Dvr-;t̍^3;lגWMȴxjz>pǘ@& !wqqT!eYt:G9bbxr߿Zjow@Q{h K]y2gc̏uUs.!@=A]|UF3b `Kq(/l< w@]1}t~~ Kʍi.V Ԑ~`Bؿ%C#G?XV26!.N›H^+7dub S>c'ц;12@oF׵>%:;;W jR:IsaQ~9]YDA\>C<"wS%'<>>jќ?LRi)4m}ս{W WB99`w2hT$[bv,>5p"xCkJOcU~v%BZL{jE: ٽǩ|8LGPr6 %9Uc8uSefUO3/:Kj3¹O.Ռ9Ri]qy+~_~DdG;QeqPiAJjPi%/=S? dT]gﹾFz &(?図eLъ gLc/73uK>..Ӌ#i#t@ckQʐ.E)6F_+#cJϑpLpj*k YR@i5il 0N59EAg\Q?Ak8!ziT8.Usi=W+`DDS#dO|m38FY[ >b}P;K-knhlN0Px#3hpNICFGiYPBk׾'AGE㧠* irgr頜'˗\UzKW>74Wkۻ+b-C涋2TD ] ,VÊW)1CLngJYty E8iQL 8 i\cgfzIVJ)ʚ)le0ڣo"5m\߫4Ń;@ؗ_tۜ$3 Ц{$#~* W^-P qo^0Vy<ir)%U '0AwIs1.B{_ШH?X 5/<sr̈́-55߷ hH!\,x(>DŽ*kϭ> 17H:^2#:Ď}*QNk@@]{݊8À 'yǭ&T*EkvADѶ1I; kؕM8vfR4F.t[g9p"ܮ+7#%X hR羨~fX,s@HT|}-%H675E.=pTsM˓RT NT0V*ލ)ӧ{o@Yyc]gT>,2`ReuS|$CܨKjhǜs"n֢nSݟ(`S/t=Fx BdkZ ~kbB.M@VEw{II1F2 {TOIu :2o7A}0Ujq?*NBZr_jEwqPNjUG[^h6ϡݺiͰOdg%sLF'NV(rOk4FʞqRi AD?sM "_Pz0[7|*df"cM ԳsKwl{=ur۟~Nf@y[ˉJA&{t$z^<`{T6hE k=S6؅i]\i gѲ@Gk%^=[L-oW nt 11~QI)ͷg/;YHcNnuU9q 0CSqt),!D˳Ւ&[rr.V"YLkd[Cq2?[OoUz'pHܫꆛU)& ]GCU([~=y6IbԐXȯ9$utڑb^ǘeyUB:o#SxE5U#GnDj3z}Ѐ벵:j},KrC:N&_ i%Am5`sW`X`2{B諟t0Q*.bkzͤ'59ZZتiߟy׿c? U(Ř (ROo9yǻS]s3=t2(H||r_hp̂ G^z)MIyCmUZap~}M<~(a}}.NqiM$T yCO)O\ l",ӎ|^/w('srYE3B+Xe-5Bm$04j5bݻuk n~Xj #,2%jYP:HWQ.8/g7-w@bw:j~ >0B1%㬯S5qiPcO2"Y o#5 ,]32oHݻ؀՟7~V ^ @RS.4SX.ØANt^=~ti4)=HձK@*^ț@Ъ~?F0?eu譸YZ{nM˼ H_ʰ*cDŽ^:V= %df%'q˝#|'Qӯ I.`u뒂>ȳzύ'tR"xeVrNŲi4;7NAؓ%;53`YWhO\5\XT1pBZe W'Lz?_o"*hͰ^niB: s;6o7$:₌h>7% 8txl˅ALP=|3KȢ~UTu zS}IH|v*ïvnh^5 b~YvpiF9um*FNR:s}t}FoW5C;2t~u& 3LPNYb'Bb5JߛH,Kත(?1UT@7XKL6T]r^ zǝq Cvs4z:VsEAPVLPAҡAٳu ;%r'd()5mKMRr˸*~)RRc2ecH`^ ܠ&c7&o@oA&ѕ}τזo4GOڴyK-xa҄P.tlQ)kȨYL|FṉZ>l])ꆉCy#|Faô H VR^6Gs"聺11룟.=^fI]nC\T^ aA{,#e:6`֋D7ϓi$o,H{t iI7,b ͡~2t$UˏH j*(t`C j-3$z玬ٙxUk q0OCRr9SAi:F&% htEV@S%Koᐿ{ڐ/V.J7FQ*+r_uy|""مd>$0/^ؙ<왺,Y;(:rIo}o0. A03 ^NyT ]s UkZ_e-h>Sp a“i<6$ UCFޖkZ2nVM]fI]vo fz7-%ٮ&Di*@ವ iۂuceS[9t']gkƜ-&Jի71/H6MGO^m6Us]9"~ѣQaiAUiGEҒ'Pz;'6Gy8Zq6lHuOuM'0ՈvmTPψP=،`K/_LJV>P͂h~grɵG)SAE2$4u ݿsH[!zmo>*+H-0t5C~[ZBA1NWAt寕[$y-~ ,7apw`חJ`|aVnη ۜe*ٻڇn5'\!:&7 w3/6~,8y"ʑ`,bvU#G_Rz;ooRym}1Na&Kq[b${w[|ck> a< AE r Mt =WM2XWs{A {;@dfF?-E" 4K2m.spݡġ_]e qR%Kd;fjV*LK_-~JR{lI qm!># CYs^I;sE)ϭ!m}_P^>_*z;Bh.| Y3SҘ%MWiuۮ8e/Vv'7cjvcYf>#n!ue<ˬ!?!qaS%o"xN-gD( F^lRh` w"2כ\s0Tk=߿躶TD,[S,J`;`q5eQޭ_(@kǎ|,(&vS뙳Ħt{l_cՇdKO\WVk2VhU{M/9Z<4ˌHXR/r%+^Mn7*d ;y}~۠x<Ϯ]"GA O9TA J#a0(zYv42?uLD@% % H&TiBnv^OeҐ`?`_?@96|MBxҌÀqnK+~$fׂOSRYhigЙ5ķ)aaI69d[`@CN'sQw>64:i\Kq=3[VJVTgn@r9Neg4ۑ֌IL90)4qVր&J<\iPM/-ywPxe Ήm{}<}փ!('+unAڃ/np`x%IzE ׎0}w2ov>s@'! sV8Mys7 d^d-DBWR@0ס[O^2=K m/3`/OQZ#B8%!do/r=peQel1[B}75okgyr̹4 `Т9P%A4Tz*$TKb[ZPiE!Zes8DG޲/Rހ8Zxqyx[(Iƶ̰!q1UU+I6,,o$E?&k@ JxEa^BW*wQ5{GFZbmX)+pwyqFSl75F@֨=9 uyQ]QAӸN4nU{ХCpY`"sޤP_g9d rY>32ɋU_] w:Ƽd%'Æp:pE#xZę,"`sN̕v}I(qt+2/gϘLtCFW1M*Uc^+;d=/KgvgEfNˏU-tCH(T6K4#u OT4+6AnIFW ͒PP*EdM+-~u.%3[MԹ#KŹ'pA̕0a%MuRR8΄~b řcE@Ia%9]K,l܆S/J 9!_&޼ݔXT!td4}o^Be"؜8MģED} %;Bitxs_ UYdW(r\szJʆO}I'Ʉ!,o,& 0Fgw}1YomF S.;, v {<vfZCj(]`\a:sްxzJ~鹮T஌B  eg73Xa(8Bз`oh ut~/= {VÉJv%=:Zs͏O@}՟~(~n}d\T'%8 RtpKJ?lNx#4hA7#rΐ^oE<5"Vi>9_(.ˠI¤x-<XImgrY])N_EG"K]X4(,aIe>Red+|$3W$ð`ov5tK̔/-VtCǰ #L>:`# *2)+R侵1b(xWb7W $g6S٩'= ~p?Ь~SAUv߆ߗqP=,KypK@pR^#ڒ <}S똈s0s!&ƺŠ8jA!@dbAFk1BLODJ5V<qUnwe?୫)+e9n*xw?te.F5BmF\nG!] F=٤[A " znɧ`DXtcM ~N!4az4K:אkG0OuSR"cF<2 Apn탟WLbCaIn0q 4}=#?0'DEUȳ^VIE eS`,"+HѸ(S" MOx,|7(!yBL0 Jcu[@z$#I:}d6jrYn}t=) B:Nggu{нKhR"&Ls{rUY,SZnH3FC'.9\J:b`EXkH)²*"w4:Η;O8o#;Z ~c3JW覥BCn<0f΄s!"$ϷgAx\^`z[ 8 &+s7eE:5eѮݑMFOle),fM(yv"8Ou[omZD!1<)A-p  hT p}Sfg9Qo X#^GZF9D(3sּ=ó!R^NDB7ŭlgq% Cpӽdl~^2 Q4Y暧>D*aT9oYlH;UhV;Na֏NL#^xoЌI|`w_~a%h*^*bbI dQ_L`U7b;?&b)\QY\Q4=^S li g'S^:K.*\fmP>I"cĒ%/<Ŏ z,BM°PRZjr!e]ǂ0Qɫ i'syj!-g9zX_1\38"Fs1}O^hf7ƍEW :jym(u,ÞPʎGVHmTIKy.D̵d83ڽB#^-[-m{<3Z\M' Ke-)BRVltҵy %pڦW\P5q*|o',&|,~zE2 倩!Exe-DT Vo)ڎc>uWϯTXjҵ*hAcN74LP/"([dFPKUz,~" /S~SV'4f!\߽lGZr{uqsɗ҅s<[wAüW3q=&ԭ>ftfkQ2Ƶ5]tC5S5.l Zu87ܪ]-ޣ z\A, gxv^t?Uy1xn1V'>:H0,G:^4R =dp*j5MI[?M}T[u *w韠ڱ$Sh-4=DutTpίU=8(9[5{l)2O=3{M㚳Xs !\CTʱo硨Aڳ4U yŚw;}>%^k+2nW\# $  ,TnBh=  霑רf'0Dޕj@*Mݕ 4KaTjNDaDNS5KZl\^l=#{mQe|K͗oDL3r,4&Hx."1T 3:ܝr`'{Jٝ{sH<ޒ[A3C;ZŖ9,7ˬի90`8{ur'Z'<-U²;ٶm۶mZs}w/ 3J5bLikjOjV(ٗ?x}2.NRiRjڝBB0jd+)'9C&XgܱU?d2?yLWF]rtdLޠΈܜTͭ- 97O>B mhI aױ3}z@Nځkr@N /Zb)f h,ʘ\*O*8\-G,9O ;>x(hnK[ut,=/?,/183:ˣFXo^,M1(b?V#CZu=]$Kk'gv M7#MqX{Sw8G*T Fp&2tCM[#Ay 4W*.J< W5Lt&7/b|BSķ Cv=gjT⤋KLR8R dwpzwu ZjiLG0Q'84ke:M~#_ϬJe?L,#v@2nÈtK>!#6%>eB{~+mǝ. ) }(XpcYbjoJPlL( K3HV,% //BMN{%C j1jJ˜dLc`' ` @E9nrw ׇ«QEj{^Zz4c{`SA*܈JX%_4RLa:EJ 0U@}QA/(ikЏdƷR^lV:y5Rsr}W+ ,5<%.Pȳ NI@n4&ZdT#F 7G\>Q,. Gq>Nj#ܿ;ZHlAP%/A|h$@ߞy<9~^ڔw'ŌkΧ4Vk!Vbve]J#Y!Zı kuY]A~ǶR(/.SacE ~x--cL5Q(F8>ڰR1=$&A)O#~J<%|.Sr'7 IЀi?^d'SifKhdlyV*H/7(ZYF߬p>S* \Ai&9t&Yl0>޳t,⌋ m=;]|-C/RT <JIu!qC9.feȦ; Q'B=whPX*-A*0Mho|ttlg:Yq?;RxCNW0gtxO)[.4Rߔi\e4W(f_ijx|FGj}<(C*\)xtJ CҥQwWF¯SW,QNYEgA<>FxO9.P{;6XB]b(Qgl,⾙^6OdŌJ D>8WᄉgG$v>g,iI½~I` D-lI4{ E?[K^EMHίW%  A Ypj9]-]߬#v9To௖=e>׫T MI<`|~sV^WMZ`n2WJE3ѓ:5"zhs_Knƴ!2wJAEEnJ[mlo@wqa ׏dƇXe%Aڗ%Sj8ۧĽM`Bj?Wz,ՀcV'<3CP/S=s. \!Z+Vհ밠LljFh);QBv.ӷ":b >?,+wӦxlhҖK3$cy{x i-7?kM <5!J^uS\ԱN̄ZJwwqwAe6N4$}L7.މ[=$Z*4:8L nBЅ٫Lܢf}_U>6 ewr]\w^,[}~a|R A]RA s:@@.&ƽwXvZu{An_q!\Z)GH}}l6N^5GeKCB^ˢI U bѢLƪ_Ǽp%]Y?eW=?%m;A(LîBRxFy/gLʢ+a }" ||SJd Cu,j-d8R{WJ[\|vgOo)͒ufT6R]EH8&B^eHRfwE˃- D&}-Os6>?$MpP`)v2qcۊRhvu?hhyNicƎKGȊ!'`-JqHd v0uޥoj+S ,h:FӺ#3<ϫՊ~Z!N3ܷZ9bޡ:/>zP_+!OP#(F9fttR;-s" kȯ N3 2vPȐba-Glk^a}š!DM'>" bJ?3,~៮ ?xG\ q*}rTw9xMCKs T/`Y,jwK"uӇH9am^  lozyfӰ)sZAWTJHyqmAƇ dc"^IMB*_[ 躄fO~W-Ⱥ[邡\jژ.B Zy6%,p=k0݂:R6@Z6uE 4CTƔļ5>;vÊwT>ÇgA\;u6GfO:j[̞sJ߿{0 ,!DKdL) ; (wLqߡv H4d" \v`)̮흕iLwQqqЊwFH-%@Ə5]%!}EJ.\%)Z(:pRHԘM *[S{G|ҝ\Q99μ l2oʳS]50+MHb[ e.v~6/Qt B):wxwY QAj4h Bb:axi>-Qj %Psw*'_|,\Ȟ*zn<:q^T&կځJEV?@\ٰ/v1}[9qFkZxG&Z۔|K5,V檜@^k]?ֶV:+oeqS48-_(pIVB{ơ *'Yץ.H.Kf']? (CQY(I? y/xX-B%Yn&DgJ %Vn xLs39QѾm2PsJfq@㭫gQHrEv ^Y7it&^v-G?2y;W4&++~QAFIj xl'HN썔v ox~}SA&X5T͟=Ӟ8k䶁Xo%.&_nu)h_BƎ߳1̣_(CfK@y,xӞhKL73/4Qh,A;*LDNC)ợRS8+^4^?)goSvC"UD??94`Kp݈aT"U' yoGBʚwUu+9g`]*ˆ|ekEH)i9? (.uoOU/JS#7R ̼o GzM cm+L*f^ldGю=EUC@>I͊)4yP>/ E]' )E_Z7P@7SeaޯW[),TdJ g\rZ[V~k+ (Xƞj%Ci 7Jc3/A#Ҁܒx%#Ɍpݚ8-/2&Sӑh76P%+6,t$(Auc=ֶ(Y";3Ѵu(!}mXY57\\b1Y ʳÕ224djf+g&`7L!7c49*ww.(hm$er>ӹf}VDa^U#$Oj ؐOSjrcPse8>4-lE}Ht)@FA`2r{%"9špXE&`RIіZK_~q0MF[o! 7~rԢz ]òm,͢EX%ПWX)b ͦxMj".:VIY1EZ [>d {9œhFhW8Qd΄#^>nygCFA 졋/H\EŏGX=O?gnRz-oP_#Xy g~n @}Ub7fNAC5pi -2[4 gB](:ť0泽E:`Œ*Rny Δ"W:n(!7LePƬ|M2Hftoxm!a%+$TM?u+2TU @M~]f 6N ID4#;l5l DLMߜ,˼may&)/w&8w KBAO?ǽhK|sHZ8mTrЮ|eZzML5*%[U%P@-Mi+fl'X}Ewvаjbd<ȥM&sG+uwMb_Vj&y [M 64<ɔ(z l] Y;ue5_ߨTɤ!ߗ>D5CcDCK zq`'?ՃQ΍å iED1wFƠk vXCŮ*GzQBo#߽͵Q7{AP5Ƙ#ہz!|ƓI0j_9-)–&X㳳aBcB)9N0 K*eތ=Z>;f |&Xj> O|DHuit" g&O0};T`h$Nq,ok[٤H9~ֿkŠee8=@hӉi5HdRc9GjڡD,$ɢ +v̯JƘ~ga<#YrBш3ʐGUD_.Ab*ӯg W2'21OuF=bzH`> stream xڴuT߶.]ܡš(Zܵ[å}=3}=kΕ"SUg3w4J;:21M\ؙTL݀vfVVN** Aq~쬬|T4z&^N@6?@ŕC tv}H8:y-\`b鯷83@``gVb(;z|ShKdT4U?999 u MFTtߒ𯻒gU)6k܁ i6SڇZ+WW'~fK7WfG%?iXY<A+h7:] wSf@_'i)?p>p_ 2qWQUU`ob t0q00t5qus#xiU  ͡*Mߥ;~L?w߸6stpvquWD z{fLILYNZJ]I?q`vto<1IE~/+7ѤRU O'WG׶>/nN,ere!B% :fV,-l489:,L\~ ; r#6G ?,|TߪjcJ@ eG׏g#=?)O;{k;e*;MCg"m 4Wv5˹|/߁܏GS:]\DG-..-t?fRfv.n d \\6z+fGw?x,&EB|X,\l ~r7 `oF0տG?? YVw9?>GDdl3_ g [\ӇA''p/_kV7{@Oʢ@MjShTt4Y|9P1yn*C+ ^8T~4XiS]xu{G(Rulc(}Nj!@Nɞ f%ZKF.^C)b*רJUn Ӛ1)ɈB}.̯`/GiA4})n:}9e^=e,&S'Ygb+5K n7*p&+`-I*z*f ސmf{b{CHx.ӍracKc[ .V#@:zF$6L.3)x |GDcI7d1VM^E~).n3uNgzMWHK܅-q8@doIYC@]R5|vZ)O']TZV򙺟 Jvs3,6-]WFUiSHP:e蓟XE!6ɗigv,w=Ё,h1ʷ:/Zڮ<|]dAGZ#>EhPVsc4HI/DhB*77w&_I`))8$ WcM|Ұ{m.Crx9fofM]k &H6r6z6$b h,lka* nB\@S‰zQTQBW'M57FlzBFƒ)uyMS9_V~}|A[~^jW$_P( ڜYxuo;[\qg8~pbinYj)o½р]9@\r"acJBѮh}ayb(hć){EGtNl3P$VuVe.nag4'9BlV@j9vwOɷld<0Fl m~j,$䕿p㯔|Ʊ,jh=_>w&./wLtQ%5Ζq?|\|M[ҕ6c)͘W?ZѳQ79W=Ά{>FD:j(4L @ A[aerj|5E q8>|/}rٺV+] {c|Ǧb|o\7ө'VY5.o' tLx08:lIl%_KW$ 8Ą90lj[ qW5i듆\u+c2P(ѿտJq֟tfRZ?[2df."Vwm nZ$0UX.R]DugYt e5Ğ5-r0%*DއʻkI-<|oiQqbշڑZ|f'D3|([TL:Ͽ\ /'=/~{UqEZjGLe* 1IwHSlT6)lض; F "nE 񞯍 *csXdčdCJg;14fHOx!D%=UV2W tĬ筜yl͹trP?u/-f*>p+-3O|~C,?!:]q5-hY5sy#ʃb& Ll*1AdZRȑ|} ,̎it {}Kn℥P SVɶ*/Rʯ/#(>V ?=Yz"PQ2uU ,U3]yo4FR2ܲ;5Y ʹiX4O"!9^ĜF3GU,`󩪨+jSE w]_rGݝV)EZ9<.qs6ӌ(c$՗O{s8-Ǜ˝e9˂}Эfo,$S_rN1T4~8TBq'#]. %>>77ss b0F@TcA/NEi _e ZЂ0 0BTzm )X3OJÞU?'4$̇ep{!?`5/7y KO#(#Sw,DE%Kz;4.Qb#EĒS58&'K-AC7)L̺X3rcG2KWk{SN 3Ё9, +Jui܉aJZo2ȵW01m1j!ꞔ()9B 9TAn.K8BARє3T*],L;fBy E,6Q3dȌ6EԜ +.˂h="ŇJ͘c-d I?S؅H.~<M.3@kiQrDxUeD;4b]-KUYF`=M|J VwY\= nj@QvMjpz>j_4}_Jh𷞗.N$RR+o Xɡ+iB^q|C\QVs5ƃ(|@q3DQؠ9x-O{ rZ+'.<+B4\EjQ+_vDf+@uDΡmǙQ$ DByQlkbe& د,?sHJ4Pg]hZESu$c2UE͜'?L R,ȝ(,c8[@.'b_KS[u, H9$KҦI!*8Z?NЀ@SX}/ :}*m.']ST ~WυPKpxîzӃhoE"kG LL-SQ ӂRqoRwf/)84A*P3]ʛ4-:DFy:K*e''Q5'?pCe&Q]R5'>䐸*"$!ʫ2C܆c³LQ<|ĒZdP;gp &*Lf&w PM'F)D6:LD-!Ӓw1l 0}B0!/ps\yl! o)@L|[Yֹ j7`TBI.!Qu+sUtFC(~,jc\"wŁeŎ$e!T]H"2 6BT9~ ea1(ʹyOxW@T.)֌|e>љmf7mZ6ܟSlӠ4n+4dwVd"y9 PZ|$V5y_2!IvL'b?+l#+Bjfu OEZnzވ XFѣXOC?j~VVYX$&, Kxs`4;!&(n3TcleQH,`Jۿ/7`#=BgYW]ku[sNPYo^l'kK]u9%U6m~ yi?vF؂<,i.*CU_ڨT3 6BhsM1&Ѐ@=>YeF[CaIbƧCE41竂lc\E)V9f̼7ZTZ~}MuⓧM 'EECWP-|HeģhkOʯ69ٜM°j mÄ 8OS{jć} _y}k4lv3oMMR~3ѡ$^7fܧʏF2mMß%ԸzDie[fzmǮKgudJ@-xF#s"[hfJ82d,˼I*a{dׄ@kI=1Ԝ7+]eUapEŸwQZq`Õ36ޞd)3/:8?j"P}%tԭ}EA)՗,HzTl|)5 Ai=Y]Eñ@oT^euԦpT[TB K,bbk Aq^E3UKԵDaW.8 Jkvf*>Q^rNe=Nj-spbpdO-Z55E싽> !fe:S_e~+=:DLeډ~5/1V7@:at̻gGJ$Tjc9_3 {Q.*˺!'F1E;VL}Xf&.P5NjC.Gwh|}S=W_R9bQ'f Ogc|)}ܐ0c$ڋF4Tw4Q:jV;e|| s>}XOvŮӌǠ' пzԄhpYfV`d>Y0l |\EJ@®VhA.ф-aMFS8KA7#c@[шо|يuu GkéoKC{?ަ&=_.m <4HG[ݙ>L1M|J$k08. .w Y-Ļfw .T5W|$Ot"nf>/ 8Zm?~fVD{iC7yo!  \22y#-bfp CY$U?_7qoYƙQmH"HeDJ U0/*Dڶ;E1&?]|Us hBtQ7jAUT wO/ օYҘQے-vɪ&Sam  Jì``0O3xŮE;iӍ)fn霟pAXC(~'kWضIYt5^(K %N?ݐ]gNX"גhhF"MFL$-xz9dapU=WuvRHNnǢSpsܫ%В>9K߁`媋P3+Ŋp½98m`N[u%zY(?($A!\oo{O8AZ"J$v% mdkrS=4}֊~r|;p4Svgg}#|X:E?KY6I$j(q*73-c!T*`6aO5QS%bi!ڙW3xʏTZAW[{Hꂱ/@=AAm^xD{CwpF-lG5uP5ǹ1t^C-X~-Τ2:@}GCf#D]a0kж`Sms0\g;L-77FTx;cprp`m4_yHЎrWTq ײkm{őN>ơ&fvG- 4ݥ TKV^5+!?]j8lI|ZAF s4$h۩=9<1&`;CQ5{ Za)]0=KG`S "kX髹RZLj>,QI՛Ybf&>Vt7a=52DP4$ď8/X5iT"lsN o.D*[6H` 7 6eKva.S]Bq]2{kFzE [ka-b[u57&6I߭)vDiԑmF9~& v<33d8eeB]V" Uqtbx>f-uKf%+K~Lg;+wL]\'rv T狨]-4Ѳt8ln.ߣ$St>\[VnTD(sw]gMi)o 2̒z` "JxOJFZ }zh!!QT 3bRB;ټIsN$z7]b2.08^ct[RMkCTj"Oz❦Sg-7Jyz +f": ]jY`iz@O#MMԸC4rEyN@@iR1fk?0YU:q=5}>kSa+jcWE!Erm˓ H K!Q(#8&q:eMB[dHzp{WUcTP$Z-~Ņ4[L{o7j{F!tNzތ Ib@BL@ă=ي]-("|6ׂzI2ܥOⴅF[ŋ5G& ,=,ov 0o#Tޏ%%µRG*hը9mt(wϦ grH6s& r9R{YfEټlc\o.qWvQȘY.BSjW2E]WNu_$":T>Ee#4O3 A]$Zl/%6=o;-IeBch-^|+lA=X.*"}RRI6cLX%!,іgH:.hSm~5v|*D=cc8$O'&*Ļ2kNo&fR(T,=+q]6bH5Atg8)Imf'0%WWP/;'R`Ʈ4K >:Na%c톾{GӬef¡I)J7b5PN1zUαWFH?Nm~gU%ٱJ~,OԐB+٨gNhobPbyR[dx \t Ɯ{\q"|94>W:Z`;}m9 LʂO^&CXQI,}I .< {Q(6' /£Ʀw+Bĉg߲aNsՇMB:zDoJ#/⃖ V6L6ٟBMBeJ,h rn ڕH8T#V9l(1˓&1 7QHW^ `]S f`a+!"`S֜k q+8y~l^2Ǯg-|PƦ&OjZ *N5wUz[I,Hw`B2|q9.ST– ݡ r,W{wx6o|EBuxRN&?\ٿʳB5Fqլ wSrϒL W/Q5QY_(rXPcvI W$@@<th<+Wu2T2(C/.:׆u" /@^9IYB5lؔvCrt񯕤 Y GpBDCɵbXF,ݙ̜Y pR)T:a^ bB=Љ鳫D]TKp\!]_eh': `(H=.+v; ߾9j띵I@a$5?8C+Bbss1mC3#vQ1̃ˠSmneW|PT ̰~.&Ua)cNy V,V4hqDw`wmݠqF*9bKը07nş.EppzA5: *Owubg@@6vSak4qAfZ ]-b1<t_#; Czm0d-tn]"EC.x|kp`f^ $DN/kpƒ7N"|ʃl3 ۑb~CECشn\R+bJHП_GbZL]oc\SddO fEGdk+cI~:ebF,4 b31>ǖ|>Rpo!_Z"W!S'b/g2/)K{ ޣI 5M3V_;ǩ$# ,w߉ZZ9~$ySF>QgR kx B!@xu|GrtA|^MDxZ;۲8d=O>VfaԇpuEgxE2.O}X+lfb`Pt93~ɚ~p aWyPQdbhge$^xV<$6w~qgp: >4zՉ\7;%aI\NwV.8جP>G~VL2r7ҩrVK+{CB 2p"Je^d5|)V_wӤ0pj:E`'`{eL~\RGðH a@Y8iV~gQ3jO:QEr.8T)%U*sݱj|v/B׍$Jbz stD.Jw%l\~`@ 0"qɦcJ̳.TxZG;l; |OnDAuM=o:>E.ɒbĢtKro2Vяdm2m'X[߅|DrQ̜L>,"A21 UN)fnszkwwWS:|/XY9318t6:lD~'p/ %^m$4-^ f9'J LT e>v]@h9Chk=D048$qhmФ"ΉHCryu(f < b2]tgK8CKxONyz○<1Y S.͠V)pʅblQ4AK /sⓣ" }f6Y3JOjQYv:%h5mB->O$ljR-{d}{7س㌪mD&+!6`#sY]᮶Q[RJR|e`ظ_ ,>Џ:CzOJ #fA3ZeUNItWן=#_VޖȽBN2ڛ)*0k Y6Gþg [bk?P82k;3^-a)UcERִf]VA1T5nNSd~ clg>eD,hL4&eY Fh@Q-MφtflKz{* IjzW[$}O0lhUʩ *2 %V0TOӔ!|Vpm%b&A 34)& z9~zL9ש֭V%<`!TpU >3k&F)%NXD"<.- !JyX™!57L2@otYI1<(eZ {uH1Vy _Q4IE?8$_sܘ•ø+k TrX$u㘜;jk0Ϊm>S2*ɀNmгQ-Tfc,)d"ˤo]CCEKJ`@Gj @ZR=˳`B ԏ0f1bewyu4ZcERִf]VA1Tumer{g=kg5dIVB]XTz Or E]:i~S8i7uЧ5h,W\\.F5*r& j(j)BL5K`]V'ym Qv L^C}GUdlyB/$a Jjj)GD<,hݠ'PBhlx9< LTb(bPKF` qnZ}}o_Ce5C+!P7a>Ǎ־6XWLi-'Ա(MH] I GF=tG.o; yO֋s_kKUO ~tIɂ+lIJ G~eY*>#?osh"}Z Ȭ,ݓG iǞu";  MWj T;jl&nxbd)PC}H ^ hPt+= k :1Rp :ϐcb:uR-K-g).YLsUĴ*Y08Bh@ ~gN)I~WbJo/nKz/#TݖFfH+>)m™.&,~[^bOkg%]'5c.anG-_<ԛcm\؉N<6̇#G<.>DrnԬ[{g~cQ R]ᕖ wP)eſM Jө#-B*{t/s,9hTyOrBrH:.VmU8릃4+0l6E$2mض2sֹ/gl)8ޯa]D~u+dVHɼ,YiP[G2/؁+y7d8̿7GӢG+.=*:Gݍ[J&U, ͸ ۫+|BxT|H؉É^MKmPWhz 4E JTȾ~dPp;+73%/ܣ#4v;ᏭȟyNtXՊjT瓘( 01ٱX&myÞ!&.#';ԃB622e|7 D0?fj:?::ȂPF]:<r@oG^]?fвiZ'CHwbU6P쌒g_f*?jF.%s5(] ;{P15)bt]al;TYC8LfaӟiɿDJGk掃Я(;ZZ"Td_8uخ>RO 7e]}~ha7[ G)L362< e-9FTZ6৙~萌u $' 7c'_c}~aWԧ 1:;@ƑqvΒ' /C֋d5 6-Bγ ] u/ Ι]N #hFqCdV%Y魉r8P{0Nz#Z5>md~ߩ/6nΟ\V q5lcA` t ?Of0gz=sl̛'_>7.+S 6gbS6pOc"AbDcxSz?7H?&wj$kTH ߞ>l-\,;WZ#|7:X׻ѽ?B);}Y^鱅YP)jGri>ȦW P}nIx>XӕKsvFK9l'a7BnjchdD,*ی{ʣ >Qg}=5z$9-a ?baL#@Qsf-Ɓ-ظyls$ d>W{ 6k"M2"+L1[\QL+J*Xee5"DyBdU֎@%.h~b=8w ]МrP;<%P`t`bl2Uz%Cuq1Dd]N7$K3Q[Ka }Ui^2s$5@HH_Qn}̗-a{؉h(T7!%rQiBRA[$zsZ6T/ezN3/LWWF3VbДH hC&y9ļppeVb/3.>~$/=0%} l4YS9\^7aY bJMgaz5(|n(18O u.U5?2li\_./i"lk/"FuOqP y`[E^:7/6%$@2УPj~_ϳ^S򥍚;+m,1ITXzs9j^`{x+U-T-OC<ċ4[ٵ[]57L$η^FPrTd`w||^u0}X٥\X83T-<6r *`geRƵ&IK`9IBo hGn".AJl%Kic3t&4_AVђ< 蘵XI޿~,e \=EHR! ,sM+ :X>Y3|6i%7SUpVچ"nWJJ@,â (_ZXgI2g=*?Œb >@|Fȓs ւ">(Jr@|Ys&ɺ WLykm-〩.s.|rO21x\b?6 endstream endobj 140 0 obj << /Length1 1816 /Length2 18475 /Length3 0 /Length 19642 /Filter /FlateDecode >> stream xڴuT߶. ww P')^nsg7279WޑTYQ(iradeb+YLl]6&xJJ1'=Hv(|:XXx)R@Ci0(]< i?\<,,]`gd鯷(@ ` 22)0?V{hilk7_TR_ԕUi>:8;W-bjR qE5 P U ߂𯻂+5Xn@'gi6Sڇ? 4..|L.LNLԧfi pw|\q}b W2$C oL_yeey2~:}Td&fogQ3_ĭ>xrwddV 3̛:0dC?2 t=L-[Y?hvw:}́xogc7 YfV.1,Dx%U4 *ǔكl=f@sxfE{g#?)O;c;+[e(;Yhlbj/b%q1}-/߁܏`dOGSڀ.T" `VQV3 0vr2gh6NN7GW=3 0wf㿢!^A,fAvſANտA@V3G( r ~Dv7Q@PM#i`,85>>GDC壕Y?~P7# w_?c) h `obOh[PK6r9kW< (TMUl//ͧ*բ }hN1S5S#@`RVX ( =+.nIl!u>ƲM]長@̱6b:٢{,,M?b,aB;twk`dmNP) M+ V\Y~&80@- =zE~WLx6V!Qʎ4`&k<0!%Ü翯.GUNk44Ǿ|Ü&w#ѱy=Z˕*a~&Vڸ vAmlэ_/zJ!M8g( KTƮn5y"xD\s ) r/}.!o K3Skh$ ٖixڀ>+=F=UZ+$)lpS`Fv#e-\{h}S:̕?f{l9_|ךu 4ei_3 ?1͜[1`RRRd%Q-VQ鄃V1bj pm f *3N P'uT{NsԊ@l#-]8jo!V̲4| ] 1(S5DL7Jwtt K\5(|=^#1s丷=\gi89FNKv@鈽=ѐ'B3?VX!~ۊsh& *M Nsp "c;Wwuap":*:1גN">{5DG5O4O"vG2Xatd\o-:;#Xv-VOܣ$c&]̞OO*sTCyr*g3sJ>4qiD.(@ ~5_]s(Wb\gҪ0,|uyS" βFm7 ǞDgkE^lxz{].WɠV-xw;RݪhCt77(*qN3 +a|O:jKnWl6@^R 1(FOCٕ "=١*DzEaL}9)&!7NnlZ[TK9Ôy>Mݑ[DDmT<\|%KcA\k =E렡pld3SWqFSbc|pᒬEWU֢{_O|!5IPgzz@˚lM w[=EB{))L~wk \gF^i3{]n=#sM^PJ1kM ҡSdieh %_}C:/~x0vtp\N +S;&s<~7MrZzMO^jC2g*kCjd@DFh9Hn("1anöpgB{I}i%-LM0O\u#EVw`_6*rG% nOkw`5X'@ɝm5D]9=ַ?0!!йʈ%aҍ**A܎aM*'ZIn^w!M@d?OE`6N:ӧϰ_:]|Q v >i,,օ}G w#Wu-g2H^eUH PK\.(kfs po257 $ynt-|ãT /1 |ǖ$1Dqto #]o`J1GhRv9K|lJPNAN^+ED)P= <g&HFR(DH ~N=S>KPxu?eݱK *H%+,%B me^/@yI*?4]î1W 0MZᲤVY@S2YȁGAN1;B6+$U)ʇcp;^pGNkֆL~*On֐^ ~TKgXHH{&IS_6ui>]NBPR}$ m*|AVâ fˉ<3[js0bd^+r[mRR۶ Ea\]G[7!'UA.{#cuucI #Tkli:zߝA0Ӎ(Q_%w5;0feK!\  ud@5,ziw'J V<{bk֣RzZܯz0XD4aʚuEwHZLSSYl}>ٳ?tD?ƍ4uN#A\d,ܴh,)+}lg{-? +SQiBEe؏?:ƺ%>ا@D:_yjʣ8q|mӆ^ᴴzOԼA|u)P_>$T/lr0׌&'6Εp*XmA+D6։O.Y! }'EX[/+0m}pZ4: -{3 } ~Xg-t^MF"PT2fGOo]Ԗt֥+;\d=H1DrgnKTŜ4s8ćVZϯR` m|T.U;؆\VBt;:)ýar[WNkOQC%|I.& 2QGQ ȓ98n_qNfOBSG=g-c ^,˨5\oUmc,xYU2xbPyltl3񪰶* ^$&Q ό5wo^W!ܜ\?,s?T08$.}\? @Ȉ4"!VZ)3_R/$HJ!DU(O'48\-$A # 8:+$biYyKwd$c%̰R#͡t'WAy EmmݠHf}{;"e&Ars0!JzfPйHڸakj< AEӎ{0Bə6BˉXsSA&o/'murс̦҄7TK H8N*^۞L#9# UpIQ9؉R8%U[#+V4+)'5UoЗ쌝drUԩ^u^_ *ML*ec3< K#pQ]uXbKJaajyʉf`M Ma41x}Yk3óɒ)?z&Y K:1̿/a`ԧϒѩ!YEBS7k Cg|IZ l׎"7s3zhJ";D"?J8W"lX8BNqH,LKop*Nƙ-|iȢU^x5Qbjv|3Z5޿"&75EGRN5>lWҝf|]u;@߻2@rrȀ] &kp!1 vꒆ|-&*^΋@Zkލ, J?7@fʷWe_Im~[]y[ S j;I.֞ɤnsmoV+݉kt%qV;037 ] œ:{lDyG'ommNij3iSM5 `5 eE 3"xC;&J-1hz5_<ӟ:iШx*ڸ9LU`tU=-me&I1pY!uO7vn$Ȥ!5l yWM:n<B A61JGcaQ"*} 'wG&^;SW QAWxB:L +rg៟k™8=_ w gVG4*!_j_];b>Wd/*T%c`,W 1B^VWK&Ę{)s:)"պn U3i2zDתJS oFWc(m+;rWi/\p'1>e(L[|T(LI>.gtX[LhdOP9 N9swҼF|K|I& ~ /!Zd1 <5whRرDM~yO[_jeE!y`n!p]bXxifɉ= {:6~!y}M`r=2똁ݻsݱDjj[Yԕd08$GmW,974acIӔ8~ Tn=3_eƝIգ9kx00y[l)+ aĆu]1Yj_]83Ɇvm#ܤbmNE.@SFW1WdNl]waG]hs6;54?UMjx9E‹3=;ґ*%TJLݔ;;6-C{bg`j#U1I9M(Y,rF+}!՞u&0MQ ,d<2 YӼGp IdͮL]m-`_6]P |HIZ ="<*Ty"R0Q8E`KWn?Aْ亮 $sBDA|׀t0[x6mg_ !ےo+XN`ߩ^Gѷ_7,G) s >/QǑ?sxvPn[,yލ [^=qRq73 &Q'A;C,0)'53WYRHaʐ6tps4IgƎ5;ڊ[۳waI}S ۄ9/Җ,b_'5{)=u"Ag򇲑~oe(.[Vx=}ÚbmlpR:gap#T4 Zү:4M˭_ݱ5_\ u}i4!o,FGr+_ HERǟ'iQ|l?ú헖ejdZ$m+ӒGWĭ5]l}'Kcľ2Lha:6!)V=u gh5Tn˧fo648-^s 88D%av[} /v lu8i'd:B^ު5n*ÖaEYc/-KA2*<Ɣ.XMR[*F˕N$=s IʣWk۫pmo hs%,(V4gq|3XRPJl㵓a [7x\f? ;u)*7*ֺ7DBhEgt+ӈU1HF\I3['%+Vn˞ukOTǓ.y_5x5 (PW [ E*UE;?JDwAUR!lZl=JV%¸]vh2ޡA=NՄ ڇyc7a*D@+@KrŮJ8vÈu~QF%]BSzeQlbkscLK ὬR\oO 15)2nFg.2>wɮpkYVhgk{zl+kc ӹYx2XSI}%i k_ꓒ 5,bKے.?Y0%VK]Gv!1N2$Y #wvT-9ͣD5˰[Q-`Z١hFH]-^#vY/J`PG㾥n#( ",aσ"<RS#uK 9WbFJQ޶P\}40$j=A8T1Adn͙R ώVg f_3ժjG'}E!ە=6R1ınr/w|fU?LWB)g\x2^E~l6Bw]y}_`-J[OqTOPu9]9ȉO\+o^N+&m?.~1[ٵ"!w!lD]^⡛p]yxtN\.d/([ )otgLqQp%Y?cd eP]k2ދ%`Gl3B2-o`uP(z`Dx/C86s={L"x8q*^NTIv,ZM>S!-~aUNt `ϋ]veG]>/UiCDz: e[>x`N`W[0OZWRQqS-Yaxj-~vZ1ea7}Eq<'tލJuO^V%5JQQbHDWqɿ zlk O-r y7%'Xx;O-2ݚm5TjKr3γ,/Z0].a] ABVn'dQZ6zp[+[_NxA]*q;wL'RD>4Ɯ,^Xg* \|ĥމ U#6L?p^E]gDcՋҜa/U)`d~*+pR:QFr Gj)Vft sj}9q! kP_Ҥ1w #9謟| j-VSf8# ASR@-ҩ P_Ÿ̟ۅUHA[`\U*b:7cinYo9D p(}nzǸלɐCvewe\!% e;28gw[Pˬ:4xFI 6B~@Wc&;6l'b9}m[$}0Gs'c"4F5o/G}qAdm܅GDQ{G-rJk\U4f*uꂵzWhEIĦ\vYRh*gI>@:뷐vRW^I!t8跐J FsZŰ@DrӚx?/D%FJ̫: >O $/J7ym\5e׫ peuH$;՜C4O d*禵. vbH5c U@Ϩ"O0_l_ eDM 1LټN l @C^tX5R~I%1Xnw6\N;:уaKA]%Ӭ"=%lhbadѐkNMl~*_v@qU$}t)oNWGuB"l/Ыm_{ڸqZ[ p, Y|fr]cY1v+s>Ezr]3jkKq^Y",p8js,_<`-ptl2^ft=a/V:}Cͱ!wg}SL?ZNJc(aU )8x 8!ɠ 5}* r5Q :GyafR$ofٞ/b?<wKKӘY\k*?.*SVN?j)SZՁ]dqL N)+iT>?=nѨQj do*0vXRF-B[|_lmr̿>Ao'JpnBAe]V@m+mk;@ k4fxv aVo$1(֞L[|&k[لE{E ̸QWXCGD|mR?H1@f0M9xdq1R&ý\Cpb+U!%|yoFcL,V''C6#rFeA%@}҉m(6vݽ!`t~1vgKkw,}(nԳΦc 4XԳ\ah4hHKgZ^=%gyE3pPZ\\ቴEŐaspJ$7Ddߪswo74a nZ8WQgy@&9i*v3?7Hw++o4|sMpa˖'ߵ0DFf~译"iH9"PvP0Ni}ٕ*c)fv2Mَǀh?MvR7A4ºwEehBEAw)ZsVkWBN d80_&X K:L ƦT &\A ه[#1 FP<ёJ,z@% _cl?UuyӫQU8#nza#cD(l)#{uwE=-Ț0aWP X):4Q❐T0-Ge`)_"Y0 :l~k`f /G Dsp;*H4qP&rIT?_*~D3Z?6?tsAM\Ig~M+Vd8v\qI!(\yyZ$- 4woJ\WgFڭf7W ͕LHˬ hxhkB}=Ӝ ވ6OzUyY Gq!D 3;~~w}v[{8(?Uhư}{~F 󩠿V Хo%ΆDS+S gsj躁'7K^kvӞ nΩI뙢;UwimTqs!!UX둸 u2O`(~O=4hN~A ݍ16B¨fdtG .=~;"+ aWf-؍ GeMkii&7?wgaL/pmiO_DT2I$6˞IjMw" q &Ò4ͱjbxfo}/{#2H^& A~'"?sxECw٣;UQ:ZN(m_ n7[ffa9wٵ#%UsGT߅J6*ye8yGC'so))u<ȃi{ٝ#^mJ*61DY3?DUbo$DOaU3E6b~'QE|O!Iv$i_ۘAzNctF :OK!1 Ȩ\|s)hC݋7K U+_a*B]7/d#!(|sM,ϱ^d BMT > MD.xPM3aUc͒ lėWX^.>֤x xƪhlI8\I I$i7^TN`KH\|wR7f<0sŹ׋^ ʺcoL.F0ߧvpt:[ΣeWBD¬_ՕE18!964e~}ѼX ųK}\ç(_+)aՈ3!JVPmFONGLf?.5;QB쟚v@2;U)8lWL z|opOܾO wJݡEmyBQ*wo"H/yJ>/(WݸB#̊[j-+|" ~[JE&|%H 3-9΍so"_;'/Ơ' q قTA;^ UW,BFX#<ĸߠ*"rhodo Ptl;ƋYUP! DZGȮ#59?|7H/|Nw4 @.7A3dFXRfrUN`3.T7vv{0KX 0e@gjO YHEb225A R'è wnfٓt EB]7xe38qz rI3yWҖg+Yj 0)k눦𗎱Hٮ۫4&D3?Y&G+ SLX=כ[@927i[&٦+-]mDşYQb\UYG2Vjȅd$c;fU:z+C!qiNyN2 \ s߲Q 7*02.A)<3G/~_Kfq (C#Џ y (0BU%.4C4 9P:9W妜kfcmj[CRAJ|,IӪF6R,:-*ُZiYC;PhKr&wOMS?g[Y@GͫsgE:|dX݆,}dRp;`jHh g[- WKQCa wp-XxjӚa1"Qnft(+}Z튰y1K&{vW:|>޾0FnPOCjȹ}ovrޔ7Yѭ^W\.a~Q<㈟)0n~Ehor; 'O?C"a-of<  9pAL^f04(iIf`;;9 )O~3;BГZ!v+fx_^d~xiBa/p66=F?H:0qR4W)'>U'e_ Qj _nN KG(Ud"$8p`"! mw+dΎ؅P鮆~tfk8PZF*g&  "J-7f(F,4u-Q8e>R6ǔtZ4{H/UY$JfF1  c;:|TҦ S!l2zX |fy`),`lQ1_-POEʠ%O;e#¼/ПNB{w0[:PͩE 4a }reN28!Cn+ ]ɎS q8-W9 =<+);ӛۓ6F9yr>&;wE9? & <^c ./#QEUha|\z6w]z’Hnnkl\X=^PCn62F=PЄ`Qߵ_V 9v +øo>aCwDe]u, 5W= X#|[ yqJylեLc6{l }mNd/{D2m՛v8ο$|4\: : DK-4;%dMd RD`b(S&_#猿Hg;g f !(ONKXUF ~p}+__Eqf8K{#yYwb`%cD[zXhfoN ɓηaIJvrdaU?mqYgP.o2 ?Ǵrb! }x{?Dc6ܰw7GIcx9Aro~MSI"fW4k2$Qycg? v~Y_"Xsޠ;K,A[{^A -O]ŐQż0\ٮvd:4rٽ1Sըaxk)BO;oّR~|RJꏵtlΊ~j\,w_؇9` O^i:ŜۓZg1i3c-Q#H&ORw^9`VGGSkܒ/!iC @z3asC10ıE%F <8 OٸB oA$5ɯBJW#. >o[f-kqSG,q3dŖH%x>^;1tS]IV#(R} ğ4P/aVXͮHM7NerW5lN,:Zw+VFW-zzڟ=Rlzқ GёS}5 "Qً5F ?,B!=-ӛ%_)Ȟef1bRzhv҂|SF(D^)"*Œf"gL͆CehƻwYL t+ &Xg%ֶomFy,3('Pk8]Kǭ]u! 4)ׇj6(<ߌڇu.D{'UZ*>(]U/rYցJ (|8hT-Rn8#i`C+w~zxwx5VK8O1#[B"͗jb`|&e 8ՆO,pioBj a3sXU!Rw|c^9*]SDWչԆ$LgSS[OYt}W G'>d[˻Uc }*_oj~m:&2RFs9PPpJB,ŽX: 7_fmF=It‘ur 8%? \X̐pogvhW3,3 ~plP endstream endobj 142 0 obj << /Length1 1608 /Length2 8687 /Length3 0 /Length 9511 /Filter /FlateDecode >> stream xڭteXᶶ14Hݍt# 0 % %%%) ݍt()͇s>ίsϽe8<Ş.p3 pO н;GHz\0-iCB4Yw% T?3%E3BUmCP^iR#CV:w[d H2^!EKӥLQD'3}voaP3P k2>rxP8⇚Ibpȥ[=ڟ[U[[GdW?uXQ787P }j)P青Cy<xYjZz|Ě|ք &P/pc h/U݅{7 h `TMFz)vxؐ$h?KCёdiOxx̍ΔfD~"LQ! : 7.b>|r=ЄYUJˌ[8/4 3%X) M^%VBk/`p{\;. aE QGAOqEWQn-ŮG.v>(MHc^ɪ/Djf-(&EdDQϽ!Pg:ɀw_)ې'~YfbP/UG&Ym ꒉ'i8T}y?24!˱O'DP(1U1܁~µyU.0Mwl{ڐ '֎w\:K>bX oN!#1M14R%n_5Oib [',Ee^G  ]#'`"<+Qw?1  ^w뒸0ʱ澡Z,{E\u"x"еeo QC7"D5кe:3~a9WLvT!ESSу3pYR_̾eEH~m2Hި[}-E7hKJ&T Ysy?n~zIõMb;Ph :wZf=8p Z2}YcQÃ*&T{x#R- 7P"l(T u.Zވp)yX,s[`?T  V `knA;gYj8{הoE'f^첅[1$q}vһB0Ot>D[c2Yn[juݚL3Bl;ºKMSp_X`Fgۻ?94CIVG&qi6oVE ,=2 ~]TuPU Cە3ZW@G3P&Ԫch|Y7~Wt|uv@{=ݢi$52Bʄ2,]Ь=˳_ MRmu3шGR 2qhFdx~}ȱE[g</qt@;#P={ʦ"X*jE|9,m@VsXȫ{P1d  o2,Y_txǃakm7YH!{W6E '֧WVy&cS -!_csaT&`]p "6|* 4br̹Su77Ԋ-ba .ӷAdW/՝FVhouu/(BҮO]>roۛ#;QS>dEY.|`Lq2aGd&z _Yw:ibQ\~a^Ym6φ*V46s=+Yfؕ%QW(e/UY{251p^ @ϥVn⊣=[NYq$'Q=jfsՂ{ڷ]FуMkzՕVxflZtӕqZ>_B_V<iiPu9)8oԏ09\°{<bW|4>AGT5EЭ/dUZO|-s.# C!RV ;7:i8qM`xAe|P}{ZE+uw Q .i1. A:,+6P U3,:,(f`֞n;;o*'@đ\8 WY x{|zE{) }zpTO s޽RTn\f?4'dwIKhYGڜo٦KI&۾]cʏ {ѿL ;ih-OtvejCc20pqAIryxRfcr-s%x:_q# j>d[\!qZ `gڠ3-tM0Go[!-KB+ (u +d1[CKNAN*ձ*Z6c!-a(g=ol6j}ϖM/:Ӛ\.뀼:ɂ(1BF-A_}(Wd1R]*Lhuol#w#KHq }/Ok :gq/)9Q* fF3 0}#*sr4 ֿ_#,?%jFНRLy}^6j b-p<=n|GLEuF{d| =]_ůX "DgwzY7p[Z-Hৎ"_E0JŕVFM+EMZwH" #Qy= [dmk鶈5#;p^VLmMR2GgrP(a(wOuSFatZPpkV21M봖\V V30M7xW(SqTC"Jh㾭/NɴzAi,]Iڏ<Dd] $ـ-Xrshx9-IɿL`p"aܓ0K5>*_r&Crur? \EiYdM~㹂%/}*H hLmUCeԡxbxOYAx^@pOEAv >Q9ɩ LV_?=cmF8=S'C&wmҪH|k6ЫȀ$۶tEc憷PMqWjvȮft +8{HYY"ejUT|qG(0(Fbu/,&,2jaީ2Kb{L棝0UB(cXՅ7N\3H-?*Z<!*oGكA~o+P tVIwnHdTe;~CbtNR#ݎ#\[Q5K'I|$ {2oh֢ S8NǸnx|%iR݇1fӖUB) BF;{JpیN/y헾{'pk1F_]"ex/(Guzx-AMP,WgB-r'eeF\ᘤBFDjNN0d.|+d WMUw4&XlT} 85Lc((HָyDsD*U_.w~ &Q9ܮp-e}C#`<(uMw (2![PLŹ5kgw ts'(ӫ^!467B7M}(!θF1Yh]k?X")~bUGv7*[: \9zKeNXf?2ޏNɆ03ީÃC忿M74Ϧ,@7́ƭ:i%V2N۹e%_uP[^(<|r]i+1go. [Ѣ3ɸJB0ofkDŽS$5J^,`+`k rxOwˬPp[FdZEq1c-l6l7~Q߇~䤘oĶ\%yEr"t$kJ:srg{EyGNb$]0`QJJ< ~c5a<[ՕJ-blYpUp̈́3% 'ۜ:MXbU<')t;=%+yS;[^`%+rKXnB[S_MG83ae;(ŹX7XѼZqGqL;jL 4㽭itY#T]:os |q*KiBJk">&d6E 8Jޮɢ_DIutUH0\.ib`6$ԧlֺU,ZdzgfӜ%n?@kG2wE|AyGl' ޮ .@b/ q=h]:ٞzhHa^u5Cn )Ȓ;5ZFk1X83J[k*MP뗆Zv&">|H AA-cs{m)fL䴴H7QmqQMdʹ6$?:9Q:?@RwKujV3ʇ ynrnZ㶦x_k7DVә#*8#5LdtJ\G(9ϒ(_ީm[Z:A`49"ҜCc!g\CEع^ɈaM'-nQGAm1/^i'|Ɔ=F%C~{|ACT.haL^LmZc^7YP5WpZ|>A?S d| ꩯgtyo^Ou $_~?_.4=u%8κi/t[p,>E0鬛8\*͵X82Cʹ]Jə9Zʼn,o!uk %WvJ۵1T8ƳLg=Q"zYۥX4U|mT +D8 >++O'[7Te"}N&6"*y%eykԺF6%mE*y D"oV`kR!YWxi)K<Jܑuēvz ھ*0['|SSRއ;|A4~M ״飐V*ihWbn㰠`YXrs] aq d+-{IR0^0TY fpJb (稺nƌ>8e$^ȮGb)g_Hem"oDѢLǙ[9EϏEqH>$bʿvѣi&X> >_\ ~crQlre:'*ԁmSJcgp #qp~ Csswg +(83\eJ6 eyhQt̅ ^*2ѐ8;4 ڙ}0w6ШnqPJcYuY2&]N_\ͅ6٩z)ڻwK<%D }Rϛ [r nYĊ콵 g @bWKR e;GTtw[4<ʨ@< d%V r"Djka:`fjO4umcՑ7 "o^ (c(ĶK)l Ŝ,pe& =6QY8\>^v%v5m_WI&dx/ݜԌqjgZ8Ӟd2vx;%*q/}jF!H|_Y/3a!PbnM9 .l: FŽO4%(Ry?#8kH tV$LW1b"'8 u0%i'Mlgv4^*@a}gq_4R<6}*ORKl_KkwfHĻ^Y]`1?>ole8C͟zOo*#niC"^#f@KYVDE[_a>:[3pju+|9KQc>.=E B%Oyҽv=g%u/̜Jq.[ >OQ] 9#|]Mهk7/Z֘Z,nxLRi_?S<}hCF˨\-Gmd>'nm!{me}ۅvVPM;IK7ABG;~>5D=~s37PCrUfą$h2aEBoJI} .&}ᓟ G 4& 0tdx90M*CxvЃ HG^RNhKj endstream endobj 144 0 obj << /Length1 1144 /Length2 7551 /Length3 0 /Length 8318 /Filter /FlateDecode >> stream xuveT\ٺ-w Sx]KU = ¥9Nך[5FS]n ع9DGKwWL]lxA 7('B ra '^rpDD\ 4] p& (Y#pw+橲 ;y@l@=m}fVVnaaa,b 0>-]O0毽0p{etppu# %- d?9IQ Va%  WOW`'Jp7$&\\Oxzq?sȻCqSUCA.r@  B=&< l qz0?8&7 `kr]]'Y# n tܞr7m4?/6`/`p'Ǒ;T<2d ԉ?1w@,؟g& 9Ph~|8sˤlxtMTAh17/%Bӭ̒°\PsήCE8&islTdUl\Rҩ`~UG%+t"GOژ5|:RwU4qE͹i\q{smyc2*&Z!C?%LV>{a"z "H`燤T{S:f?Q4+}ȷU U׀aUnij-P\w=!ຫ^Lؕ1%{_ɱKȭvY5+8c;W6^I::i%_Q`n+>Zg-!Ptn]P1o@hĨ~ cءWYU.=kx-/|,3Ց^3զ'6;lm&vMvOvbՏә',O|^ҐttLU#(0qP_m肃N)|BdNYg-}Mw21?0o0IG޶Z.kMS"估n܊0[PJ7? mݾF6Y꫖pJj=!1/5AXOv|MtRX͹mM^*VMeQu%+io 5wf2M,j4bo_+z@[D F%0n|q*(x9TCt/nb幆%7 p$\@Sh(V]],y2M ԜDJ` 4\ҩ`BiQf1O[P>i\;:}'ȵmv9/:X+4h+$S/r[b-yD^˯߾R+ı5,o({m(@.źp[v-6s`~%R~EB.%=y;Yx&1lkH]ۋ8dW+16z2-@8u&Ќ!]wܳPdklL3gr? Kkm, U6'H*FXVKZh5Oթ)S!GNi[[.ɐ3~٢Yد9Nw|e4LR.1~%$B92)=g >3y~m5Cӗ#+ tb G0xT,;}6~)>epBTn60KS[T6_bXH|޼:h@PUݬ^B v(k^i$p{7"تFV:%CXҢ èF;+Z";&!I H"ޤ:eۋG\4#=ܳ qcd41T^[>˟TT6˺h0_ҕeo&4?=Idv;D'< d[4{CY** @?L. O j}bbf%mW;4=' ns<ʝle?(a81Iӽ]fEK6czhIiȅUt/ ^wE&^^-6.B,Ż#q9#T+nJCnuYڴ97.[x鳨6H~)sZ0$٩/.INCm<nVs̷-=ȟR I 2r0wIUw3c SMFy}*Q m嶑WZIO@w{pz7Y3f*0%څRkI2r՜X+ ?vYv9dKpDwg^ ڬd]aíNܙ"clEŦY$"Э3[2eaPAM# 53o4Nf@5aX5_mwv!܍,$T%F8iOowG\atԖFc]c_ޤT3LDwBD~P 2:H|NSo- ;/~Ϩ|C޷2:Dջw׮-!0m^wX*"aٗ0 Bn#bՒNgVcNy`+؉d?VqSTfUme`WS4'\k4 g\xbǓ[󻧿v9<8 u,7w ]&)(i͹xe!}H~F;)Ǔ~.N\~LGQa`4`Zǡ*/ zJ}nk9bT_ {D~.ekd'Vɨya;[ZǺ"|v+E[`[@L KzLB1g"m8AZ+*KV"C !nQz "M7k5=0)R4{e1ز,ٛrGlsC&}&b~1x"bT<Ʉ/Z"hf׿*fg5BsxF#6DSKݺ;I5HH;AUf52%fm& Jb>.0<*<[;Y#6slKQX  1-3T+iby@EKIgF!BxI*(R0=ZVlzn\<؛\@,Z< 9W|iЭ;+ǿ KKI"#"zS lJe>{Fdk桿u8pi46UcI{>`b&(j@ׂ/ju!MʝC 8w?!}q :e;0pi` DQu~? %V d{]'iUM-4Uisxppy_>@ xߪfm>1ɑױrU4߯S_][k[̓^))6~̯䭧ޫwY`г lZ|<\v)@~Yh/+gIةzK3;)[aHW@"~Uj1G`"jfB.&J#mzAר/8o6OHwGҳ yƌ8r,jq=eI st fyd_Lom|wٿ-۪}ߚQ]T8 3 R+LPb c6.D^9?_ʆ Y?*8<rk0XDEڍ[l3׶̱;#{LzˋX!9r+R3`T|77w(C-*8 'ĢxDɫōDFvDKAP~prabk_Q@b{zW j|3*AN6\Q4fA|8wNM#gHtF(Jאӹ1WY$qF2pbSj`XĆX\txh8x=c9pGa>͸$-obsn4RuY+"upEJ_(GStRNf<~`l?Zƌ+(~.Ď ʺ~5syn`֗p:nAdV!EhiGB輤)7/Vs21Dm[ @DlYtEe; P_[6џ )+*!U0^(QNp=<'0b:yɠu`C*JidK|`t6P £ꗋYi|@GsJXfj( OB>TlF??_*`V$7~N_5>{0`UL-i}j/A2m}DJ}Y19}֛xoFXBOo{[i3Y͋;KxAb0w!茱K-fHIqUQbI",VVlb +蜃= ֖tV!Gش֫"\J>}ݩ.yعT'I"GlŠWm|ߝP|~7MgE*Pia%GDN^ b1I-%7h3GF/r!MZgfT9U1<*2tYo#uc jr*Kh>iVLk?v<# zGroEY $|tCgv4Ë2݆ÉԲ%S{<,R,>DhZ35$BSrNU9 83f NW,&s+h7T Y[];mޒr}(V>6'I oul[D vdGM%[!;&Q0]|1 FS?$SZk‚$$x_lD7MQȀZX׊bTp9ckd-`lrɓ>ym!kJбv*Ժ3Q\5@wjսKaХo#"Qǧ,ZdN5+U42/ JDvX(RAUK D`11zhxVs[ y(6'f|چn;ɟ}O.j/?2ԥҢN|U+=v#G`,b®DpZ%J#o#̛|x3$P\_= 6Ⳏٻk |n7Y-&@VkٙC 3Ɖ9k#'Gkx\"nl ){T;_} QH4٘U!.jVxlʐn?o%B4H9oʈJ+Mש,-lXk$n{&pTm:ث9XUFCxjcWrcoF:dmPAg{ hD)]WX#E6p&sf (]%]_MkrU1<~w!Ɉ{ k<@XqPY0'fc3o 5@ CіR>$<'W3JQRi0hq _Yz¼@7 $KΔ$n4d-G#Gw~Y\o6.4ǙuZts1[`Zt*գ/GZ<\Ӂ.l _[ֲ(+{9igV b[ ۗ+"=>{Kkr\- C; \4|q ,AM)]3WJjJgqAUx4d(2`eiP_Vo G86bD$Q +^wE@V6By>N\L!_,*ߪ] ,*b'-u!\m pL;QgMhs@Huc&[GI,!<)'vH22_Pޚ3Ԩܦ8bbl? ǜ>rubf"PM#HGjtbЏ6lIq#&up1mKߝXGŅEөnixXp01-#'[5 ѡ )9L'RXdf kMLv/eEyn]bu4hBwqpKN@?Ɩ[Ӱ"F*kU+W|Zi3t i=ߺ}:FrkUϧBkh[SSf+SP:Zhڻ.UbNz[u6()6v ayG*a;ޮ7`*C̠z }مv+ƿ}IӜkLF^s0IbCĆ#Enӊ^(M@cśB& s6b ĉHt-4).1Y8~1ǐfP`JlWhA0;@\Y1/Ep!(?9rzlS`rbUv/ ؿx٨rsFCfp endstream endobj 146 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N7R$ݪ70W?g_,ɍehܬ=WWU\;;׺v7MOtҺ=po>fv8 | G՗_n}w̭][GL2sQ擾ݾk^!00jYV%H~~v}\; C}h{ϗC`Rރѩc~^ON6[7ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCvW endstream endobj 147 0 obj << /Length 842 /Filter /FlateDecode >> stream xmUn0CƆ"RVmk N7R$L̛O3 /~\k4~VzhO{|wޝn8O.oN?'uRG]>3dX;ҷ*נ_~vC̵:}W {1Esgq]ߍG@]dbڣH~z~ohTǰ9wxΏU]~NÛ Ju~*6{y~?xڰvtش~>ZjR˦YE3=sׁpuRA)`*R2$!`8li9UEХGSj043`4`4Ý(?Q  rt\e #q5p眛[q>x \iEܰpNMk l4\? 皞c:gN5^ ELOup3%M6`^ۘ1ل150ym 1F}3&ԗ0 bKl+֌>oRa Oѷ`)w`)?\֟agYg ֙P.L(ulgYˉx/N|N|&ٝ N|N'>cv'>7'>S} ~)>_Sϔ+>cR|&L|'a9i0K)cR{XTG5;)NͽRPs> stream xuUMo@Wla_BZXʡIW ld!fm웙7շĶM[؟McpuUӃsk/zfN꺼Ɠfn݅R^w}9qdMoXj_v}EQ>>pø;en>ڲ?`1&5vaj UkNAm<}\MxHM0}Z7WuI]ǽBnz/_ N{y;:ڰox\7nXw.kP^k3^Kյ u/A )`JbD>`2$`TY'``9&Dkx+0*NXXQQ3c w"]j~1F60aG+gıcW c rn q9Qܗ8% DMq.5Sh]`4$a]~9Vk ]8 IncT5obY:socsOPcYB?9Os֙3\Q.4ٰX3Z9#>^Z} ?L[ V|V|oV|3[: } B|)W|L| ,Y a!SMV,鸞:?8C8G潪N$ĸ<ޏ< Nuν_B,u7zl endstream endobj 149 0 obj << /Length 846 /Filter /FlateDecode >> stream xuUMo@Wla_BZXʡMW ldiof<ۻW_W7nzrc7)U7Nߜk]{7+wR}uN7|5s. )裮ݏk&8n~iyQqE0N[,g IM/*D@f`B9xczOpm`>W'9WRzL E]PwWqD`PދoSφ}= imX]ӷn<7̵^y]/׵Il/ܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1L.S5?׃[#M cL#F3X1+N978Nsk`q KpN8q )q4ϮEp O.5Ypc.Y7ь1O*ezl,d mY%0ymȋ,aYʘ8 xA} 3/Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{xᇣI^U E'b\o|s C:].cDܛX=oNܙ endstream endobj 150 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQիԒ ؇6jo73o{q3mfѭVOn/Cf)rtskzf꺼Ɠpi?p>fv8coJ?< a9(})suזÌ\$qATh L}s6G 7o],jotuþ{UןtptZ|MÏѩNN6[7ݫ ZԲWO&suB`ilB =@ )U 9yI(ѥ S*043``MSiv|kiCXc, pDˆzA:x0)ljsn l9u}SrI4"nXCA8%&ٵ6AI cMϱXS_S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7a/c?w:'dEgtdbP2ڂ endstream endobj 151 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQիԒ ؇6jo73o{q3mfѭVOn/Cf)rtskzf꺼Ɠpi?p>fv8coBy>x sXQO7SVk-#RInߵR/P,+m$oƳ;w>X. C}?77 D`RއۣS/&}g= imX[ӷnx\i"EܰpJMkl4\?ǚc:7^EHOupQF^odž1BЖEQ?[0^׆ƨАԗ0 9+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrYφ}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gxg ,; f)Rx jb&'W *.lMr0߫j١hGF}o.:_hW~tOȢή*ڌ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 836 /Length 4461 /Filter /FlateDecode >> stream x\sƒοUa s_\JGd{+e'VTY$)B=8%ҒU[) xf23 33}&Tft Y8,(I:RR4pp6L#2 HDGr8$TȤ 56@,-3 pC 6!3Xd `feLYz ij8–P>s9<\N : |fULg3/3#̼A8@ǁNy~u#`m&ẇ z0qEv` ceGp h$.AgW"s `)ˁ~΁D 'x|r`LPkPIV=x1x /4&qm:"RH "d[0@dUޑǁS ~$t؃CۀWщ 4 V¢T"@\L8Q@?8v08LoBɓgiAøM0?fg?pp6p!6lFؔ\`3Ŧ\7W?Q.(_4L<5"&A#U#sa ϸx  ͵O 2Eë|lMvfA6ؼ\h_F]-RNm!n& h0B23B`f~&7!ZkNx9nT6:ڊ۾R4:.pEULMbwk2'o6eKiqc˽l?Ym h |ıt؜`s45v*IZ0qQ7  c`|یu+2K 7,K&KVfփvް]pxp}|²Qmz/sPi(cNIz[dMr8)qfvQ1.^#2,.ݽKvaB <밧rzUufy6Ma}rP|{0;L ("ᰄOF1@tRU`ԑNK5ba }~~창rtQH ~ƞl4wIv %]@sM&P`)rT&9 rkZAPa+!r4a^}Q03 7 %GrMJɵ$\4 |sY!Qfo-lqr bVsbg`,x 쟭a\ńHpҀ[hV[i[U\*ICF@lxt08[E"%vRkB I πOL*tuf3MUêF$Fe IBn)LC\a>{YxF<\6r)NC,FRd|>yB]vNdre^L{r+v}lT `{@_5ί'7?w׃\ NFh8KpT [ZjQ=f $u|qb™-"qn~8x E<`Z.3K{(LevN5Lr0#(WE>,&^}H EJTg7eģ ]8?sgPy)-*(PV7Ú[! Gm [rNsR#\n`v2W[6[9oVAld>`b` Ol\[(bk waApex<,k{8[;7bQ/% kpXbK+<8n]l&!yzV;]QߛVXw&8B}j:2 ?'^.sC?mCu؇ 嶦+ 2pK9hy *NhF) NSB YqurK 6|0IPϘFJQ|(DMJ$4. #=?B:HcDstJ0$JrOQWݛ1NF}N9"E0zC4aPo Je;Ɠq&/&1E1ʋѠ$Ecz[}S;!(// il|d(K[/0@Q/{u(h=gϤE-R8uMp m\Z iP'im GƢ*ƂZCh4'LEWCUDSAkAB`hz~ ^Dۓ,I_q'DhTD10sF[Ea$´"( Է4Bk#]\*9Q 1ۑvđ<|w{w'I2I_@f oqƒ}P;i9MMcD_z|AS5WZܨO-*J(> cDdzd d; s4% DfVHۊpx z25GP18$. 9Ι!H)TkIMnj}> jJfiq'RJբ9XJGBLQDS oq{c6߾[78߃5lPxD|c͔nE*lcH@)Ut2{'==a/Kfoد섽cYdP\N땃rM]r04%.e9+v5*bĮbG6`b1&"t1"` .E-S4_Hm?N!@HD ?} 1@y ~Zawš\7&$7?& TaŷWXo6W~&|P_G_F&U빴ʗi'ܪROT۟a `Q \ Y 0OGB×&vnژjOާbZ^<9p_%6ZMTbaU7#ꯂw.|kuw4K"/%[M; |bqTb&"P(5AEF[|l."hIX.S![Ooo8o1۬ Yj!(wV( }xH%1gi{qAo"]"07Kx5<hxW]VyauKXA> stream xuUMo@+H.ȲrhQիԒ ؇6jo73o{q3mfѭVOn/Cf)rtskzf꺼Ɠpi?p>fv8coRy>x sXQO7SVk-#RInߵR/P,+m$oƳ;w>X. C}?77 D`RއۣS/&}g= imX[ӷnx\i"EܰpJMkl4\?ǚc:7^EHOupQF^odž1BЖEQ?[0^׆ƨАԗ0 9+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrYφ}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gxg ,; f)Rx jb&'W *.lMr0߫j١hGF}o.:_hW~tOȢήڥ endstream endobj 154 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲV6vFrBbތf}\xM}qV'7t羋<]swrո:܉Ǿ-w$mm o\1A+Z7!؛~B?Fߗb n;nX7U{[LG5 @@N,Gw͡ 1}ԿhWWq}QEݹ-r*FNL7uY~~l+l+7tE )b,#TTHy9)9>*QKr7P:MȡQ^s$LD6aȑ*s.$S56`>ƄmÁ#TL 5kd}WXssc*{Rh/#? bE$L|ږ8^y>eSQc̯bV̯cNa'O;Q~{5pX2]$\^snaK??q FqMyc0=) &l(mi,s|d &\cV ]͸&ӈ9w{d :mB Ƈ\..Ա g~n59&\pe[N 8\4<[n6|kq_]~&)a endstream endobj 155 0 obj << /Length 666 /Filter /FlateDecode >> stream xmTn0C6U@"mTt@Կyct+%13nU틛ķR<=]tuUӽsƷÝxrN:ۦ>P)Εrus ~v?'Ǿ5~D !8뇺mRn=MuSxHiQ)YiH޽'w66Z,^DӇr}ݼ-w{s d\{?:1 kmn_~߼h!R,6ew*ؔb%k e+Kӄ$a"1x*s.$S56P>Ƅm„A Fs 5577vر׾+uaя6R:!,əCxg+ѧy*JcL|*m:fvui0ܓ`†›F2g'I`2e?fyx0j5F̹k#n'im7>T20P-9[A˲,p~nE8|p9j7o-kݸJv?ƏVR`c endstream endobj 156 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲVZCcYy#9톅ļ{3񼛤es^7箰 nn8l=hzI-._뫦~^JIu]f `tTsr*o8{&X,dew+mWos~X(2X.EiTz}ܟ^7uY~lVNMєo R.bY.֔O9؄b%9vsr(MXa#D$ar bqMDs!FKRLDP0.BEHQ#͸FuŎ577v}QȕanOd$g;A,əCR;6+ѧx**Ę$90q'oקfQ%n;5pX2]$^q~+s"F!CyhIh~CMnOf1$#h)r~hмj5F̹k#ni<7>Tsa>s\8s&wsaY1:+r1\ut[ZM,k4w6_%aJ endstream endobj 157 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲVZCcYy#9햅ļ{3񸟤e&Oo]&C]]Mq>zwt߉Ǯ)n.pCx?nڽVgx=itO"i [\l\WM}'ԭ̚t4pXeȉeU oq yM\-CnCW_Ey}wP dZz891euB)] W-\v\]~[S!8&+Zce"'2Ɍ5I@|"B2AQhSlLء28a}ɑFq5ҍnnbfǮCG= Wܢe$g;A,:sx l=NOTƘ$0_س/vЧQ%~Zx pX2]$^qnaK??q FqMyc0=) &l(mi,3|d &\c ]͹&ӈ9w{d-tx\ \cΜekqLJs?<@>qhx .׷8wl~1V<*m"mmDa endstream endobj 166 0 obj << /Producer (pdfTeX-1.40.22) /Author()/Title(\376\377\000W\000o\000r\000k\000i\000n\000g\000\040\000w\000i\000t\000h\000\040\000a\000l\000i\000g\000n\000e\000d\000\040\000n\000u\000c\000l\000e\000o\000t\000i\000d\000e\000s\000\040\000\050\000W\000O\000R\000K\000-\000I\000N\000-\000P\000R\000O\000G\000R\000E\000S\000S\000!\000\051)/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20240116171234-05'00') /ModDate (D:20240116171234-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) kpathsea version 6.3.4/dev) >> endobj 153 0 obj << /Type /ObjStm /N 23 /First 181 /Length 805 /Filter /FlateDecode >> stream xڝmO0SK*ĒǖV(PMU"ki;;M6]#*$L$xA,!f b I cPh 0OiQ2E 5"@.P I9ђH()bCaJPZ(IRcf 0o _ rub;^|/i^br0xf&pgͳYU 7euA'AO2}sIe:s>*Y>!OR{n<#"svxwmb(xI./7yX+^bp}jY!u-OӢ$I1o|7,,oiك{c&-|V<-I*2Oɀ칡';\l\OH@:'$fP^*hjwuQ\t*Td 4mk ?@;ݜQ˩61Dy |Ė[/m'NtZ fYB\?+$ 7fjl= w6fLZK:ǸʓAٕi-w_uE׀E\.Co t^Z7{ z?׳9ʳE+8zr~=ijU ] /Length 443 /Filter /FlateDecode >> stream x%һOasf r[DWE@W@En  4й[Jk%zg7Yۿ,1OǛj JG(N1RgUP{at3;Lp! ʡAJhVvdts*3koPDujU&Wu4Oecfz}Exơz9Y@p+ZaNr^g;tiwO @[/fV5978,Ўf@ ka pm2UXk0 O`mj[\p&LmwLMյn/n߷/GߛYO& 7Aq-XepTPPO_ԼNs endstream endobj startxref 224318 %%EOF GenomicAlignments/inst/doc/summarizeOverlaps.R0000644000175200017520000001677614551577536022637 0ustar00biocbuildbiocbuild### R code from vignette source 'summarizeOverlaps.Rnw' ################################################### ### code chunk number 1: style ################################################### BiocStyle::latex() ################################################### ### code chunk number 2: options ################################################### options(width=72) options("showHeadLines" = 3) options("showTailLines" = 3) ################################################### ### code chunk number 3: firstExample ################################################### library(GenomicAlignments) library(DESeq2) library(edgeR) fls <- list.files(system.file("extdata", package="GenomicAlignments"), recursive=TRUE, pattern="*bam$", full=TRUE) features <- GRanges( seqnames = c(rep("chr2L", 4), rep("chr2R", 5), rep("chr3L", 2)), ranges = IRanges(c(1000, 3000, 4000, 7000, 2000, 3000, 3600, 4000, 7500, 5000, 5400), width=c(rep(500, 3), 600, 900, 500, 300, 900, 300, 500, 500)), "-", group_id=c(rep("A", 4), rep("B", 5), rep("C", 2))) olap <- summarizeOverlaps(features, fls) deseq <- DESeqDataSet(olap, design= ~ 1) edger <- DGEList(assay(olap), group=rownames(colData(olap))) ################################################### ### code chunk number 4: simple ################################################### rd <- GAlignments("a", seqnames = Rle("chr1"), pos = as.integer(100), cigar = "300M", strand = strand("+")) gr1 <- GRanges("chr1", IRanges(start=50, width=150), strand="+") gr2 <- GRanges("chr1", IRanges(start=350, width=150), strand="+") ################################################### ### code chunk number 5: simpleGRanges ################################################### gr <- c(gr1, gr2) data.frame(union = assay(summarizeOverlaps(gr, rd)), intStrict = assay(summarizeOverlaps(gr, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(gr, rd, mode="IntersectionNotEmpty"))) ################################################### ### code chunk number 6: simpleGRangesList ################################################### grl <- GRangesList(c(gr1, gr2)) data.frame(union = assay(summarizeOverlaps(grl, rd)), intStrict = assay(summarizeOverlaps(grl, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(grl, rd, mode="IntersectionNotEmpty"))) ################################################### ### code chunk number 7: data ################################################### group_id <- c("A", "B", "C", "C", "D", "D", "E", "F", "G", "G", "H", "H") features <- GRanges( seqnames = Rle(c("chr1", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1")), strand = strand(rep("+", length(group_id))), ranges = IRanges( start=c(1000, 2000, 3000, 3600, 7000, 7500, 4000, 4000, 3000, 3350, 5000, 5400), width=c(500, 900, 500, 300, 600, 300, 500, 900, 150, 200, 500, 500)), DataFrame(group_id) ) reads <- GAlignments( names = c("a","b","c","d","e","f","g"), seqnames = Rle(c(rep(c("chr1", "chr2"), 3), "chr1")), pos = as.integer(c(1400, 2700, 3400, 7100, 4000, 3100, 5200)), cigar = c("500M", "100M", "300M", "500M", "300M", "50M200N50M", "50M150N50M"), strand = strand(rep.int("+", 7L))) ################################################### ### code chunk number 8: GRanges ################################################### data.frame(union = assay(summarizeOverlaps(features, reads)), intStrict = assay(summarizeOverlaps(features, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(features, reads, mode="IntersectionNotEmpty"))) ################################################### ### code chunk number 9: lst ################################################### lst <- split(features, mcols(features)[["group_id"]]) length(lst) ################################################### ### code chunk number 10: GRangesList ################################################### data.frame(union = assay(summarizeOverlaps(lst, reads)), intStrict = assay(summarizeOverlaps(lst, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(lst, reads, mode="IntersectionNotEmpty"))) ################################################### ### code chunk number 11: gff (eval = FALSE) ################################################### ## library(rtracklayer) ## fl <- paste0("ftp://ftp.ensembl.org/pub/release-62/", ## "gtf/drosophila_melanogaster/", ## "Drosophila_melanogaster.BDGP5.25.62.gtf.gz") ## gffFile <- file.path(tempdir(), basename(fl)) ## download.file(fl, gffFile) ## gff0 <- import(gffFile) ################################################### ### code chunk number 12: gff_parse (eval = FALSE) ################################################### ## idx <- mcols(gff0)$source == "protein_coding" & ## mcols(gff0)$type == "exon" & ## seqnames(gff0) == "4" ## gff <- gff0[idx] ## ## adjust seqnames to match Bam files ## seqlevels(gff) <- paste("chr", seqlevels(gff), sep="") ## chr4genes <- split(gff, mcols(gff)$gene_id) ################################################### ### code chunk number 13: pasilla_param ################################################### param <- ScanBamParam( what='qual', which=GRanges("chr4", IRanges(1, 1e6)), flag=scanBamFlag(isUnmappedQuery=FALSE, isPaired=NA), tag="NH") ################################################### ### code chunk number 14: pasilla_count (eval = FALSE) ################################################### ## fls <- c("treated1.bam", "untreated1.bam", "untreated2.bam") ## path <- "pathToBAMFiles" ## bamlst <- BamFileList(fls) ## genehits <- summarizeOverlaps(chr4genes, bamlst, mode="Union") ################################################### ### code chunk number 15: pasilla_exoncountset (eval = FALSE) ################################################### ## expdata <- MIAME( ## name="pasilla knockdown", ## lab="Genetics and Developmental Biology, University of ## Connecticut Health Center", ## contact="Dr. Brenton Graveley", ## title="modENCODE Drosophila pasilla RNA Binding Protein RNAi ## knockdown RNA-Seq Studies", ## pubMedIds="20921232", ## url="http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?acc=GSE18508", ## abstract="RNA-seq of 3 biological replicates of from the Drosophila ## melanogaster S2-DRSC cells that have been RNAi depleted of mRNAs ## encoding pasilla, a mRNA binding protein and 4 biological replicates ## of the the untreated cell line.") ## ## design <- data.frame( ## condition=c("treated", "untreated", "untreated"), ## replicate=c(1,1,2), ## type=rep("single-read", 3), ## countfiles=path(colData(genehits)[,1]), stringsAsFactors=TRUE) ## ## geneCDS <- DESeqDataSet(genehits, design=design, metadata=list(expdata=expdata)) ################################################### ### code chunk number 16: pasilla_genes (eval = FALSE) ################################################### ## chr4tx <- split(gff, mcols(gff)$transcript_id) ## txhits <- summarizeOverlaps(chr4tx, bamlst) ## txCDS <- DESeqDataSet(txhits, design=design, metadata=list(expdata=expdata)) GenomicAlignments/inst/doc/summarizeOverlaps.Rnw0000644000175200017520000003243314516004601023143 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Counting reads with summarizeOverlaps} %\VignetteDepends{GenomicAlignments, DESeq2, edgeR, rtracklayer} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Counting reads with \Rfunction{summarizeOverlaps}} \author{Valerie Obenchain} \date{Edited: April 2016; Compiled: \today} \begin{document} \maketitle \tableofcontents <>= options(width=72) options("showHeadLines" = 3) options("showTailLines" = 3) @ \section{Introduction} This vignette illustrates how reads mapped to a genome can be counted with \Rfunction{summarizeOverlaps}. Different "modes" of counting are provided to resolve reads that overlap multiple features. The built-in count modes are fashioned after the "Union", "IntersectionStrict", and "IntersectionNotEmpty" methods found in the HTSeq package by Simon Anders (see references). \section{A First Example} In this example reads are counted from a list of BAM files and returned in a \Robject{matrix} for use in further analysis such as those offered in \Biocpkg{DESeq2} and \Biocpkg{edgeR}. <>= library(GenomicAlignments) library(DESeq2) library(edgeR) fls <- list.files(system.file("extdata", package="GenomicAlignments"), recursive=TRUE, pattern="*bam$", full=TRUE) features <- GRanges( seqnames = c(rep("chr2L", 4), rep("chr2R", 5), rep("chr3L", 2)), ranges = IRanges(c(1000, 3000, 4000, 7000, 2000, 3000, 3600, 4000, 7500, 5000, 5400), width=c(rep(500, 3), 600, 900, 500, 300, 900, 300, 500, 500)), "-", group_id=c(rep("A", 4), rep("B", 5), rep("C", 2))) olap <- summarizeOverlaps(features, fls) deseq <- DESeqDataSet(olap, design= ~ 1) edger <- DGEList(assay(olap), group=rownames(colData(olap))) @ %% By default, the \Rfunction{summarizeOverlaps} function iterates through files in `chunks' and with files processed in parallel. For finer-grain control over memory consumption, use the \Rfunction{BamFileList} function and specify the \Rcode{yieldSize} argument (e.g., \Rcode{yieldSize=1000000}) to determine the size of each `chunk' (smaller chunks consume less memory, but are a little less efficient to process). For controlling the number of processors in use, use \Rfunction{BiocParallel::register} to use an appropriate back-end, e.g., in linux or Mac to process on 6 cores of a single machine use \Rcode{register(MulticoreParam(workers=6))}; see the \Biocpkg{BiocParallel} vignette for further details. \section{Counting Modes} The modes of "Union", "IntersectionStrict" and "IntersectionNotEmpty" provide different approaches to resolving reads that overlap multiple features. Figure~\ref{fig-summarizeOverlaps-modes} illustrates how both simple and gapped reads are handled by the modes. Note that a read is counted a maximum of once; there is no double counting. For additional detail on the counting modes see the \Rfunction{summarizeOverlaps} man page. \begin{figure}[!h] \begin{center} \includegraphics{summarizeOverlaps-modes.pdf} \caption{Counting Modes} \label{fig-summarizeOverlaps-modes} \end{center} \end{figure} \newpage \section{Counting Features} Features can be exons, transcripts, genes or any region of interest. The number of ranges that define a single feature is specified in the \Rcode{features} argument. When annotation regions of interest are defined by a single range a \Rclass{GRanges} should be used as the \Rcode{features} argument. With a \Rclass{GRanges} it is assumed that each row (i.e., each range) represents a distinct feature. If \Rcode{features} was a \Rclass{GRanges} of exons, the result would be counts per exon. When the region of interest is defined by one or more ranges the \Rcode{features} argument should be a \Rclass{GRangesList}. In practice this could be a list of exons by gene or transcripts by gene or other similar relationships. The count result will be the same length as the \Rclass{GRangesList}. For a list of exons by genes, the result would be counts per gene. The combination of defining the features as either\Rclass{GRanges} or \Rclass{GRangesList} and choosing a counting mode controls how \Rfunction{summarizeOverlaps} assigns hits. Regardless of the mode chosen, each read is assigned to at most a single feature. These options are intended to provide flexibility in defining different biological problems. This next example demonstrates how the same read can be counted differently depending on how the \Rcode{features} argument is specified. We use a single read that overlaps two ranges, gr1 and gr2. <>= rd <- GAlignments("a", seqnames = Rle("chr1"), pos = as.integer(100), cigar = "300M", strand = strand("+")) gr1 <- GRanges("chr1", IRanges(start=50, width=150), strand="+") gr2 <- GRanges("chr1", IRanges(start=350, width=150), strand="+") @ \noindent When provided as a \Rclass{GRanges} both gr1 and gr2 are considered distinct features. In this case none of the modes count the read as a hit. Mode \Rcode{Union} discards the read becasue more than 1 feature is overlapped. \Rcode{IntersectionStrict} requires the read to fall completely within a feature which is not the case for either gr1 or gr2. \Rcode{IntersetctionNotEmpty} requires the read to overlap a single unique disjoint region of the \Rcode{features}. In this case gr1 and gr2 do not overlap so each range is considered a unique disjoint region. However, the read overlaps both gr1 and gr2 so a decision cannot be made and the read is discarded. <>= gr <- c(gr1, gr2) data.frame(union = assay(summarizeOverlaps(gr, rd)), intStrict = assay(summarizeOverlaps(gr, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(gr, rd, mode="IntersectionNotEmpty"))) @ \noindent Next we count with \Rcode{features} as a \Rclass{GRangesList}; this is list of length 1 with 2 elements. Modes \Rcode{Union} and \Rcode{IntersectionNotEmpty} both count the read for the single feature. <>= grl <- GRangesList(c(gr1, gr2)) data.frame(union = assay(summarizeOverlaps(grl, rd)), intStrict = assay(summarizeOverlaps(grl, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(grl, rd, mode="IntersectionNotEmpty"))) @ In this more complicated example we have 7 reads, 5 are simple and 2 have gaps in the CIGAR. There are 12 ranges that will serve as the \Robject{features}. <>= group_id <- c("A", "B", "C", "C", "D", "D", "E", "F", "G", "G", "H", "H") features <- GRanges( seqnames = Rle(c("chr1", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1")), strand = strand(rep("+", length(group_id))), ranges = IRanges( start=c(1000, 2000, 3000, 3600, 7000, 7500, 4000, 4000, 3000, 3350, 5000, 5400), width=c(500, 900, 500, 300, 600, 300, 500, 900, 150, 200, 500, 500)), DataFrame(group_id) ) reads <- GAlignments( names = c("a","b","c","d","e","f","g"), seqnames = Rle(c(rep(c("chr1", "chr2"), 3), "chr1")), pos = as.integer(c(1400, 2700, 3400, 7100, 4000, 3100, 5200)), cigar = c("500M", "100M", "300M", "500M", "300M", "50M200N50M", "50M150N50M"), strand = strand(rep.int("+", 7L))) @ \noindent Using a \Rclass{GRanges} as the \Rcode{features} all 12 ranges are considered to be different features and counts are produced for each row, <>= data.frame(union = assay(summarizeOverlaps(features, reads)), intStrict = assay(summarizeOverlaps(features, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(features, reads, mode="IntersectionNotEmpty"))) @ \noindent When the data are split by group to create a \Rclass{GRangesList} the highest list-levels are treated as different features and the multiple list elements are considered part of the same features. Counts are returned for each group. <>= lst <- split(features, mcols(features)[["group_id"]]) length(lst) @ <>= data.frame(union = assay(summarizeOverlaps(lst, reads)), intStrict = assay(summarizeOverlaps(lst, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(lst, reads, mode="IntersectionNotEmpty"))) @ If desired, users can supply their own counting function as the \Rcode{mode} argument and take advantage of the infrastructure for counting over multiple BAM files and parsing the results into a \Rclass{RangedSummarizedExperiment} object. See \Rcode{?'BamViews-class'} or \Rcode{?'BamFile-class'} in the \Biocpkg{Rsamtools} package. \section{\Rcode{pasilla} Data} In this excercise we count the \Biocpkg{pasilla} data by gene and by transcript then create a \Rclass{DESeqDataSet}. This object can be used in differential expression methods offered in the \Biocpkg{DESeq2} package. \subsection{source files} Files are available through NCBI Gene Expression Omnibus (GEO), accession number GSE18508. \url{http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?acc=GSE18508}. SAM files can be converted to BAM with the \Rfunction{asBam} function in the \Biocpkg{Rsamtools} package. Of the seven files available, 3 are single-reads and 4 are paired-end. Smaller versions of untreated1 (single-end) and untreated2 (paired-end) have been made available in the \Biocpkg{pasillaBamSubset} package. This subset includes chromosome 4 only. \Rfunction{summarizeOverlaps} is capable of counting paired-end reads in both a \Rcode{BamFile}-method (set argument \Rcode{singleEnd=TRUE}) or a \Rcode{GAlignmentPairs}-method. For this example, we use the 3 single-end read files, \begin{itemize} \item treated1.bam \item untreated1.bam \item untreated2.bam \end{itemize} Annotations are retrieved as a GTF file from the ENSEMBL web site. We download the file our local disk, then use \Biocpkg{Rtracklayer}'s \Rfunction{import} function to parse the file to a \Rclass{GRanges} instance. <>= library(rtracklayer) fl <- paste0("ftp://ftp.ensembl.org/pub/release-62/", "gtf/drosophila_melanogaster/", "Drosophila_melanogaster.BDGP5.25.62.gtf.gz") gffFile <- file.path(tempdir(), basename(fl)) download.file(fl, gffFile) gff0 <- import(gffFile) @ Subset on the protein-coding, exon regions of chromosome 4 and split by gene id. <>= idx <- mcols(gff0)$source == "protein_coding" & mcols(gff0)$type == "exon" & seqnames(gff0) == "4" gff <- gff0[idx] ## adjust seqnames to match Bam files seqlevels(gff) <- paste("chr", seqlevels(gff), sep="") chr4genes <- split(gff, mcols(gff)$gene_id) @ \subsection{counting} The \Rcode{param} argument can be used to subset the reads in the bam file on characteristics such as position, unmapped or paired-end reads. Quality scores or the "NH" tag, which identifies reads with multiple mappings, can be included as metadata columns for further subsetting. See \Rcode{?ScanBamParam} for details about specifying the \Rcode{param} argument. <>= param <- ScanBamParam( what='qual', which=GRanges("chr4", IRanges(1, 1e6)), flag=scanBamFlag(isUnmappedQuery=FALSE, isPaired=NA), tag="NH") @ We use \Rfunction{summarizeOverlaps} to count with the default mode of "Union". If a \Rcode{param} argument is not included all reads from the BAM file are counted. <>= fls <- c("treated1.bam", "untreated1.bam", "untreated2.bam") path <- "pathToBAMFiles" bamlst <- BamFileList(fls) genehits <- summarizeOverlaps(chr4genes, bamlst, mode="Union") @ \noindent A \Rcode{CountDataSet} is constructed from the counts and experiment data in \Rclass{pasilla}. <>= expdata <- MIAME( name="pasilla knockdown", lab="Genetics and Developmental Biology, University of Connecticut Health Center", contact="Dr. Brenton Graveley", title="modENCODE Drosophila pasilla RNA Binding Protein RNAi knockdown RNA-Seq Studies", pubMedIds="20921232", url="http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?acc=GSE18508", abstract="RNA-seq of 3 biological replicates of from the Drosophila melanogaster S2-DRSC cells that have been RNAi depleted of mRNAs encoding pasilla, a mRNA binding protein and 4 biological replicates of the the untreated cell line.") design <- data.frame( condition=c("treated", "untreated", "untreated"), replicate=c(1,1,2), type=rep("single-read", 3), countfiles=path(colData(genehits)[,1]), stringsAsFactors=TRUE) geneCDS <- DESeqDataSet(genehits, design=design, metadata=list(expdata=expdata)) @ If the primary interest is to count by transcript instead of by gene, the annotation file can be split on transcript id. <>= chr4tx <- split(gff, mcols(gff)$transcript_id) txhits <- summarizeOverlaps(chr4tx, bamlst) txCDS <- DESeqDataSet(txhits, design=design, metadata=list(expdata=expdata)) @ \section{References} \url{http://www-huber.embl.de/users/anders/HTSeq/doc/overview.html} \noindent\url{http://www-huber.embl.de/users/anders/HTSeq/doc/count.html} \end{document} GenomicAlignments/inst/doc/summarizeOverlaps.pdf0000644000175200017520000067670314551577536023211 0ustar00biocbuildbiocbuild%PDF-1.5 % 55 0 obj << /Length 2021 /Filter /FlateDecode >> stream x[K6ϯ`@VMcWOrsHЈ|$5OAII툊 Kl@h-8xq`$P1q@\|'HJ*E 0RR nj]Yy7hZUgr+ xsP%鏓R0 Jy _̊ C`QPR$j,.D!%WJQ!e{FjŞ)Ft_)X%&ٔ2WH҉a$: J:NfR%Y_:^׃if fg &fyjV`ɗY=sE4PIqx"dL \4"FL[(UΖiVYY!,3D!3[.WWIx2<,7b"vob囎rھNʝ W0; H(ܚ,zD,FVmӟfSHHo0ro"_m]׳6v߀ %RZ[%Hɍ HS:GH|RBI0,fE#uBYݴz!-V>8`#q$ q{.p2c52!h$-eZS>8<2]gFlC!wˆ ĸȇ K;8iyB Ip(!|f4ƆQۛѧnFy d6b"( (z<=7s ˾K|̘0H`Xct%ȏQ̘Gzt6պi;Ř Z>H:  DDY{69HRc0nծޤպ3$FHpK q?S f-!H.Il{w>1ͯ8a ۞E)ub.^Mu2-ynYn403;n.ѰgiyL~WE7+ffTW`eMD( w`vM+Lk r`=Om5VѾL ;#1_ka) endstream endobj 73 0 obj << /Length 2188 /Filter /FlateDecode >> stream xZs۸~_S kә.\ig)w$sB I>o>*n<văUgoξiT:Y$#9Q,n,6IXlQχg2tiby+L׏o{`԰Ĩ77g0 )4+ KRgCD 0Z g}")*OPޭG;|`P$θ9Dht:hM&dBiro$:8iH0P"^֮d`gZ ncdX}2hpgE!LI|D3C)%Q_^4C|?%?qՇ|ܽWvKŧQGi֎r؋zg8Tđʯ|vYxbў]:{@?dqTG::n߱)Ŏ.w3_HYg4fͮucYy~.kkМrO6|_XH޾S^ɳ;.r*6:eAwWZWq߻CJ[xQ/]\R- ;N]BEU HSO*, Hs zMDrN4x"MBY3駑,.={MʻE,S9:>S/wyoyc5$]?q!'o1m>_ZYnF94Tb Aq{#3($ֵq* *#Ȋb&E^QK= qjnؼ4UYJyo/xm~溥Mt1w8X0(o8B)K*ۿ&3XS?4PrQzzl1@1'a6|[>iO8a\:1wM D\QL&{D%q2҂eߡ Ns[,CY@(;L22]y< H':ڭjCAe+v""KH3.4DdсLH%RH&A'hȫOiJⴚw!MQdaƶTM\49ӚrP ,Tf;}WBWɩV;r=b;wۼ&'JӐLdxIKR^mW)FSaUz;s{$_9N!0l(٭o=4nkPվE8( PT J(PeHI,A0r>`6"0!}~&HՁDK׈cj@,\Cj'c`"JO7Tv؎éVGvp ,),]/pT0۶'fvUxP߻G%|澟МƘigѾ:Sخw.Wk@\. Y9X/EKU i(Kd**;f >cYDAg_L2>r@0H"'lweeٚZꃭWzxy#IKFR2U/ D\Lq$(vbǻ~$^x ͌ \p{O~1=}ئi׺nh+߃p0ˋ m)EG8"8v%Q{63CY]{F szg,tspYA\_־I Hߝ26SI:6冞8zmuS{efmH[փ狖"G0-lE'wjHGI|n!M.,}Ȍ}Qܑgi|)&#:F*W 3дC;w&̋bW7$<: , ḥAv{*Jp~6Fݭ;?O3xҵRgva3nN767-9Ym3fk0>T sZ3Ng_җrw[}0jJ6[,rR>CNЗ^doTw+nRa"[͗3:?ԃh, _<> 98 1:߄" 3vGR/BR.Yt^^V ~EL%D0.T- v0:~~ endstream endobj 78 0 obj << /Length 1168 /Filter /FlateDecode >> stream xXKoFW;=a#"XCRu_owIUU8>,1;|32#kՍSo!{uN+r]U繰.kbզϧ?.sCU {wGRq$5!by{ Wr{[↢NhҔ~L#4#zDpQЉcc2eZ?F-.J3DQ$jϲ09? F+ :z(ۄ;!XR`0*3p3n r«[N~Ñ|;?|(A@h,PbcějoTv,⎤{虔,U#V ^K6v5[ ɹ8Hsl4H|Frsդ.,:i,%#]A0!lwYa dw)%4HFGaǝK@iPpA\eˢ>Pfey )vTݰ.A|.lPQIMvu>mVuW_&*H~NKELhM[iaXNO_C;TqFUX^ẋs` *ᮄcDw7FA\HA#T2PkA.e)4̆)]/5GEb {ԫ)lpT)nCrn߅m:8Ž\lI} /Z{F|$G"&B%q$hÚ)kfQPiC,ҟ΢\Km"MN1_EX#tc&4|lmL&,bN&f-)/!I1pC”QkjLjl7S!iEZ(]Z<^+Q.;79P^\ Hpx>tզ^-0ShSsk*{9;B@B 7;t,qDҧlRCMvS褐NLhx#zɑ"N endstream endobj 70 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpmCQAKD/Rbuild22b5f4197191e/GenomicAlignments/vignettes/summarizeOverlaps-modes.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 82 0 R /BBox [0 0 612 792] /Group 80 0 R /Resources << /Font << /F1 83 0 R/F2 84 0 R/F3 85 0 R>> /ProcSet [ /PDF /Text ] >> /Length 1902 /Filter /FlateDecode >> stream xZK7 W9z, ؛]&-u撿_>4<?"%lÏͿAaLfuۇ៍&Sa;!Aq0_o6ƺO~kgTřm,8!VA 5O*XbfA <04bh> ^[bz$l=@jNgaTԢǍkXP ح9VMǓH3K S(xI*6FUx2;='9ÎM; U DE)bYeKM(J/KJqC1YP -.󞙟R]7[j2OOux^iev^Y`lt٤"Ǹ*D`OÐvwcr;Iv,’~$G>]Z1Jln ,Ch ԐujzQut@ .9p.QWځ=L>R.;A윃Ʈ䜨έcPvиNv+.цW.q]~g&cCT3eޤk9VTFѯS :a.ܣ:S,PDhX]gzUt|r@`}5(QDcDZ%- tHUjpunu aXSQxWS bR\ @CR^8a7YeL P,vtK endstream endobj 87 0 obj << /Length 295 /Filter /FlateDecode >> stream x]Mo0 9v@HH 4B~m:smO$F9;aiƕ_eI6aM?KCnn᫣:x`ɫSԄY#+Ku[Ҏk]~Y˟X)=EN fJpBQr,]/?[i ە3%8%"xG>l#Hu<o"ID"&{&:ҟ#WTGNq ;]˛sa|0[6S;3* endstream endobj 89 0 obj << /Length 369 /Filter /FlateDecode >> stream x]n0 em˺w)BZ[Fm ,rei!\;X*]hDIX'1r,#4B)&aV) \|d f|@.)LҹyB.c/??z%?9#J)c):HOS+?xS;͟eAm2'jl8}֍ v7;8a=꒸ endstream endobj 91 0 obj << /Length 269 /Filter /FlateDecode >> stream x]j >aqB`ٲCд`t 1}uܶЃgᛱtѡxV訍KLڐSeExY8RDm-ΌiHsKݝ/^fK~u f02ҶT< ,f(PTL}s@9e" ^ HXK%`Կ\ɲd𱴌Uu#će T%>fƚ:3O|B,=jd1gt*Wظh7M .|_ endstream endobj 92 0 obj << /Length 95 0 R /Filter /FlateDecode /Length1 29464 >> stream x} x[Ź9Z-Z,YeIG:lKE^ǎ+8$'8,NXKh-R(r 嶽 -iP(z9v }}C'3?o3sd;(Ң݈EBX C!l4/*$B*Ͻg![O rk#`4z=B@b.RBm{/ f7 E?\.ҿ=rXœlu_C쮱X M!HDtS>"d|0<PA ++*uFKoKȎPeH :A6_:fb>ZE[aQ3.B]H 1a"9NCGmYX:nA{p.Z<eEtLzF߇VKh-L=s }ݎӑ z0z( Q+BЭ@C#G%Y _A ݊BSxN&OrM`%թPԓw7%&Ы2o@e8 (at:FXۣr|MOD}hė9-?!; `}at/=Zv|}Uf] !q6q{`h2TF!| >:c?U@ ]Z{!:^g9>NUL#qso r(_xn_*P'>ZR%t& {`\/F:rj+A*f} gnVvx: ^WjcwNA[^<\VZR* y\/qs.#Ǟm˲fZ&Aj*B.c ^.M||kk4D4&8hj9'R4\L0>)"&6p6X5\gM<77M|78Mv 藺`pYM\r͉{{!MZ#M Ci5%!l`5Sl9a 69ҟ\dw oI ~EB(NP4&tn*YKla M SYg@u^;9k#ս{ov-uhX&wo L9bzfcJ`JJ\_o&-r 5{i/&{or'#(ۻw'|w)]75c8۹=C(Cz > Qt[,& \t*E޾*@O7Q~PBػPCmæ{kwo ϵMs~8k]lћ쉖u"qM=,˔ha?Pβ*!eO(M){#J!a6(+`xLm3`nc.d; G@lfS'ݭ]YzJϧ?Ojck1f:sz$'_Ots&wyә2s`9<?W@sX=|ՊR`]x+b\W ŝc*ҥdu~2|GVSn8Czŵ5OIqqi>_nz&WBy::OBzd={Pb4gfVTþ<_N]=y>)k*ÿ̩^mտ\la|u&~f}=\ܡqϜyɐ['=N3(Ȏ EՇ4jΦ愪 \kW/Y\°/>.6Wm?w2/Fr4+s.),|y7i9+SgCƬrҖ !ߜ️%M35aZJh)ްVرZg< ! }z ZNjX\5:G4Ȭ ZFjtlzz='KD=4L8.9Z-Jj>ޣ<%?z/3ʭS {yylƼ:S+mwy\*sm}@}f \0c4EDa BsZ7µ=e4 9 eo.#,+(~`s1\> amdLS @+RԌZ` ZΥct,D5夘0-3BpŠY1rd\^g) 9st*s!jO-Q;{=xNS➒bp+2>"Q_æaӦ5+a /;c䀹yx]:>CnAz:i"UOSU vZj @X/òl+Ţ3äg/<'zĘ!.-4)֦56}8j<+`{:YFaמA L99Ò(>{Nv-Uuƫ*ÔV>Nl m?frM+tc}ݺ}Y*@cJPS6YI6[IPw|{tϝzX*k(ә}WO<+_m=+/yoϼIfB-Tԧq&N3^9dd]v^I#JjO4!m,m.M2&ƹIt1)v Tt[# rh3(z)VϼyfYp7;]Xd~D`XkId W $kRen[B>>-C3f fr X#hẌ́:aY.8䚇v,!%gL˔ٜ!hd'ʘ8fز;.w X ^i3zywjX82 /ĕVyx>CCsݗv]uh}g_re-܂w?9EK pХ0{̣AK4kʬM6YYҦ-#`G=;i5^T&V28sdv_R>3Z:B):;w]2u(;)yBƧ֘1?]I;*USlh)3ÆE?hl:cX@NTrdZsI.S.ݺxg-98 NG=7#~qI%ŏ T`G1{%`6eu CPA+5g5y\+ש ,ڕ6BZTBw0. S؉s) _Y.vWv6q@ٟg6ݑWI (MNIc]F0Ybr >,<^J0ׄ7GaEؤWTJ"._p|Ots2M\' YaJ0U\MsJ,x=)30p>h 4h dH\>E)@@9F vҭ2End"өwΦ~71A$SDwo\NP o6~42 CB>$ZA̹A` XR0Ԟx;ESdq-û/zz!2xrqxIp" \E]̗4Ԙ91Ɲ6x_o)^^;x[pW>zhb0/ VzoqK_S;veU$~u|G^5V#~Qp!7_PouPHp~5;12v>y,׈%9Iس㓘a3X;ÒezۈiVF6B 8#G7}+)UJx|ΑǕX`JW?=H΄X~j jcux5&k5ݞ{&s~ʥI ?=zr_|jYZa= *Ju~/Ҧꦎzk,PDNdNmEuVE;ݬ"ʀ8Ko C1 E`k7 gT;&A*6+\L%spq.ŗ -M(ېdo)U>Fe;; KI"Pxyy ˗[kf<>,!fAH7e/421@aWIfWr&1Oϩ*b Yp0)f=Km^|,f(q}yEdj \;B~~*Ll,veטrs ű=rEo>.t=۩o}A>T098xf{ :ʮś6\>e6pˉ_'M&VUBة6 9^WPѓajJoy1J;8ېcza3u=VJT"ƚҫ1:Ǽӎ}NWzE=}[4!-"{,MՐݐ^Av 9zP{7GJr7+7vn<'ßɌr(2L2 fl0rD 89&qҠ2!)3|Tӛ?!Q/1&.c85I' 0|/s=lͻƺu<¬ars5|U6ݓrsa1ooFA%C8)ll}[`U=\Qt#%ƴ[[nޗliiL(,wZjr(90BG@ 7(XJ,%3`dV5sTU_ڬ&KPkL=dǔ/)z娒Q <`Bh`:/pg@Ɛ9?pLԹ9[K z^"d6sFbN=FjPd{HB5kk;x|-<1eV%W>Pg)|>m@$#\/]a(OVe>Po3'ƙ+.\ /97v@RL.t 6\BR@ŕӢ6 {^W>uוBx]ỷGxa,^W += ˜2@Z[ilRdg ֹVY՚׻ޟm;mێX^s{EA ҮcAV 2אUTW4p/m8hH45!Ȏ7 7y+8{{!\M9ɻXN `Aw pyC%vF'Wr|%"'V(l'BR'kkUS93ORV)1}KleZ6ZQuhZU ,ZiA=c+ Bπ;ҤBY,:JZkĺ^7H$C5r솉4W lgV,T|3tl3 ;&s  9yA9dwʡ)|Cㆍ:oe~pX<{&w}|Z4;K/M ^m>^qP_  6SHW %2Pu) R^GVTkJIa2*r}.nt@gJ")f-R(ΰ;K0%BIgXDu&AS;=km9Nu2pVrLAkEQDB-YJ$zZ|SJL^Af9m×[U}Nt_6PՅtPBt),L@~fJ悛V{PK͜mtYp }tcw(ۖ"%/ry~bH[rڗΜ.``Ŭ`pyἦ<6wɏf?P 9e8C#_`- ={f(UQ ~I8OeQYļgiE2Ԫjɝ'zGUL_fdk*1/Ek_75?ؾW4Ϳ-i\uet9*>˞_czk:ܓuYn!zivƚBOqoAKo7~ܞY_ʦ?7u+-gjE1)\st=ߌ.ZD܏QQsObY j!t@~PvΥoDjT-Tv|by.h=$وVB#P5{!nBfc't H0X~ ,<+ TKH _H]ϼ/in ֠ կ$XԭSVW%-26|_1K0d̢ cːxˑx+P^ Va$X2LFe/2La%ы.l? ڵ$X mRXM`Я%@Ǿ\Af C ZA?K07!ߜ@~wI07 C I0 ӈ/I0h7,C d- R8X~`PqN (cLL " (l&K0SNa /` seR'$?KaOI0Ź+%l Or ~{(ߖ`/Kl  Ha?OQ|DI$(j`_"ʏhZI;OTI3z)yShBc(PAɡ!m@nGhR\P#&&yڇ(-0&R -rơ3&qbF~nUUSTJ[`0`V!NGz1H穣Bi:IqF-Wy?{yq#kF:[lqu*9t` 4 >1Fxqٱ 5m8\ߥ#>6AWZ!5N@A%pLsGk| =@K8$@5Fy} O-¼1XQjo'jCM)2%aP-?N9I5[-D,H9P"wg1Aѵȇ@}/hJ24#]ɀ> 8mPZ&Q3(P]$an E)_#R9"vRms9*IP3%REaLmA"ֶR9EstsQShJ-Jm!Oѷ#Pm'|TK%,hDtdDI8)zDeFvPC2VF>Ad=!=m6a|L\ j9]./ڥ()+qE랤)MҵsvRZb#KJ'5BI:H.BgO)ODi\/HqO.D={&#ar4F%;$EOsNŅ8uɼ$vSIO,/.bO,۳-a5>[/cΞ bYQOГTzDZv)JjL\W+:k?P<ŖFiVG>,eQzro( qhQi?=w_\Q=WE>$gaY@O Hý0*nA^ ܖÐyCt!j0z\ wJ:Í$BwƅЇnD܆(>:2&qtblt"ƆH&bq.26H<tRe 5Dw"cщBnf987 Ź mqܪ87--$0 &0e뛈Rƀauh$2q;AXvP79򀡡hUĖ>ahhbtr 腋^ĆvDaQU&F ;&&'`Y6"}1nE$%Aغ8HqOi2FFvF'ƢH|<$,r;b)Pm`d"cZ|/m鏌Qn+YG0Y0薡L<96 H;QLetp}P9deh{dkdH4&ZD< QBG&%plƆ#SbcD|h0 vY]dNh0}8=NMh{lsqxdwF%!k6jYذa՚nM zUcsfa 4]E! PH c\j "75:IF@4YBzXazdD4JVuð(ktK< i;q@AI |[.%'D4)y/Y`#܎$ )X,_:</>/>/>/>/>/>/>/ {5Җ舕4;r\oCנow_#ZQ>gGlƉX4*?\N$0IOb=Tk_92NL(UrY|ɘO,f'F$K|g1ۤ3O %؈~s1x4/7 1#9;\*B(e2v$sJmprANfiJX!U"0Ԑ&C-H 0h:j&ǡyǘ0{fFQ*4ؿNH J$iH LKDR࿅8HY1 Ǵ.@"oddLtKJ;og؟#Ai(P>=3zCnMv 6-v*>*dhN:/mHc^AQb8<.vݖ,uqG{S}cF!4XJc_c!3`,K;BJfgԺ Zv9 bqIsy|Q&c W'-({ wwRUF]z\z_@3*E >sB}W/o&MP͛774"c_@! HN%AG(/=^^0ahjFN8"iʠhWhKcGk 1kVQ t)gd/j-rQ0pcnj*=TC#={ KA: >H!Ih` fH,wΤKGMtdz1J՚x(+gX{m#Yv$]$ &3U5G6 $բ4ΤtM1Twl-u1%_c,nh!/1Rv)tR Y 襠Rt XSJAbAmH zH =$$9m@{1 ~H P AnH Azc0bwCJ@z%;47XQ!BmB FxfeiôQ% dUԻlZPwYS375eWXMߴ~;kܯدd5haCx [Xt fA=VR[ujgҋo |+ ʅ"skl3;NX ` ^͘f%S4ٯ9Ih45bNq\qRBީU)v++(.eHY@ O@bnS@{ ?Ni1Z y1 @7:$Bm B+x2ȋޓ^&2s 5 tSy<z!y'xȋ <+ 6;!E!!Қr$r}&t,s{ X8"3 zv {;cnK6ےŢ쥆j. ;;)B)~$ ?8n3 xs;<gvA.AàLMFiy49dr2(f"I ZN\/hxyݏxݷy]CsB4 ^ݫ^S^7ޣ_#%Znʇq9}^t?t?twqnNW: l:5叄u=ʀlI=Re|1ұiIkUӂq'sI7@aO";>EFfWCp2q1ڤtkB y_I??(O8x/9]R| 0@99 _G,#1B9lGaTs9N|({W,+9P77C)(nOz|JVe,nd;0lA1l/b[gP %N[! ֍rI{O/Ad;I !ҠBp#9"$ŀVX.J69*2ƕo* ~!'+9P39 2YM2eL !\4@)!aY1z_UoPtݗ?`}``VU,K|]r]Sϸ.'Y]CuAXVovS?k}9]C]Ѫ::@G=]ТDF(g~溰{ x7 H* wJҩ4L**]UT*JbTH3;f e60w b(1mW$*mԺDU-켸_m>ԶKik7% 0 +9|v ]8EF\g'quwwY:cuKdRtsj-m8H98 367adבv< h(cj'1:,AÇP]"H4k(&q){nHM~&Hha-Ҁ*!_)^{;_7H,g}"Gg1o 3wtWoBMܴc0+{ !#-}D;hSbo-.ҽo:7tMf>=ӱjn\jCU:?{tw\dնnn:B+_k Io鵻Wd,sg]eT}HNh $l6.piҕN+en>F~g55|Ic1QYbG> stream xy\8|<3><0+;CHx0;H!a 14Xh ֵ5uKCQ*ZXf~*moU;!j#Os9 gFz" ݻҏ~(Ba}a>[w}+>DCmOW!wv\_P#Tb'AA yߎ]W|Qz䓐3GI/uEe"!]z?= #I _;H}:ӛ{p{0<bgXN$HerRhuzCdXmvGŻD7CX\ȎP= v"3?m(s*CV#5ڇ_Acb2d"t'z]2 &kqQP*6MSJӸC W0Qd?Ⱦ/b_ZyGe?L}h+z_Fnԉnʸٝh:~jFDoN~UlSٷG0ꅑ>n'gEh1ZMlŬ ff_VxDJԁ>j΢/Gy IքFЕ {=Ÿ13f;OӸ ){(9[-fQ E/q ܰdjXa:^<~ t3́C.RBU =h/ pE->#r]):h@Khƾ4&yV< kv|߆'MF̸A8 KB$VH&yh PXCel,b**k:3̾=$ eˁ#aŸ p/|yUZ˖uz.C.=\R%zD5{lSZD (*C ?@v~ix2*t5:nyCG/_w>}Hufxď7oa< g1ۙ๕9ͼuv{'79q\VT эůHB0=S46Y4km/>1;Aa'w@wW`H{AZ_x6-tx<(,_?H;`m'y? O[w 1Â4 `Rzf9¬g;3O0{C2'Ygcl;~} O\6r۹kW׸7E.QhыbLA|qHĒVVUHR?h`ݧ.Ry xHT]¦EY7?mXf؝ٯ˘x#<.Q5 ݄7yg!IfgT3r׈3TS̷kkϡj=-=k0Ls#̕G}@z/anEO{oY/ *\Ƥ#qgMA_D~ O"bī%pkQJ0}?`'q1V}V|-ďЕIYvLtZ#hdA??,آ7D7FZD+oٌG%iP]=A2h_X {ab< ;`h&'󰳦P#57q:AOjܗ-SlFg)% l6TmArQ<=4 \^ 8/}ʭ{[rXaب`_F}Q=nm써#{oR>wOvU6f(•} /W>c #<_Aޔ)2=<@`EϢ]O@*]Ü.c`Bd̺}/EN .Y\:UUYQ^VZRLcHQ8 }^w9 vb6:FR*2D,XhwY'?+b$킂<-8Ir-XנXo?hx%\p3(|eG?;e{vnlN(^y,N*7{'y cn> yǭ8oodscnEq}w8.DhTO׏K4|Y ?:|Ӥm({=]ng0nBo>n${A~%ֺIc3e7 0s]q|Lȓu5Vm$%2R×wcl} Mx*{7{vo[WD:vI[/EOhu9PkR蝯mNt#JqL6{aMU$Ba5wVC^{~⒮|د}HɼA<G%4_dƽi- mڪ@|Im%symO !ig:I\q9~F?dhQ=M7Wߴtɖ|6X\Nx#N|0Qx S p"i-щPb;JO#߉86}},-JHHGE##RD.+b$nr.)tn0$,.u7 ɥJN0ثT1 6Ą& `0`$( cNp:̅bH,ħ9R{Ļ-Ϸfjk9 ];SO%:} aN3siq ֕TTqMfSi]^ZfPW ^o@WE`cUr>,y:>`Q]${yi`evvUo+b)I5LMKFcL<MNOpӏJUJeYY3x;!?LTN!?sc3L=#pƕ2NӞHKuc㨄J9 nU~71LytHYQ[;h3g۵Ӄ rPѥک %s d~|+2TVUT1bT.enat4.{D)LwhX큨Z\ "@"EEEW_}5ofZ=:nωŰd̄&OS<,lZ%I E+@c)RM*C$C*T,uE~6P^VYQQY^*J#)ꠏXE*w|~Mj&'Ə^fC/7kJcMz[q5=Ұjt^^_pFߡmO:^R8v-\75 $kԊrS SýןB:ew0Lm᝺;7MZ`-ćlE٢Pv޳%haMFb؏a֘&]p`6 FQ,F5 ӫld#$~WJ' B8sWj Zøapp 6t:9D|b ~}Z; 6s,#,֙S>3v!v*R@r8RQWziȽD67}r(fs/xۖC[K;nSߊ@/P6ފB9v⃝tp<ȕ)*] ^dZ 8 _(čA~".r\pdEGÓs_oVØhy }/ۉ5!}B!BȎK7~/Nkwht́:MsYN("oI;OHn gsUc`Q׵Fv5r;ҶFu%v쟹{b5#YS*pB &KTKFyrxR?a}4XXlv^]+>ء:@+i-ʭ.]Oegˮw{.;v{e.`I-V,-|C:%=-e]|=>fVwrv3]Z%9=][CXq2i4RMw*+fdi,^I/ mamA|Xh:#3BK db*;,#1xτs<k+y!2Ҭ% ZwDTZ@^#o!SB5)=SYV}עw-tJk|J 3`ߵ!pd:2'6j`N')`;4)Fk`MlBb;J*H1nZ9,֍ ؋ D8.v[Fg큖l(gZxQ"$z/3>xn.od)T7 Q#~eٷ ߔF&u&!͛vK()q \xTG_sO7ΉwT ʣJF9(0i ؒod];Mul.NSJm<6H2<fYE- PܦAL٘˱F*:ƐwZctŘq8Ǵ|L.E9͛ża,9DRp,$L#jH5 b 72bMB<ٺ5iA-O KBu5$/_eL-^-h\6cBg^ٸRg7 h.K:.|>j#+lZovT l+ pF<u̇;}iߘOZ}@"Q+%%e4Υd.i*ĭ2aGvOAkt7(JBĠ̒]}9IMm9STYU>IYѦl̂[-ӒYYYD W]$2MrҜ%C8, b D ]QyB-**Ykql}}.8mn&5EEf3PVw}1[sHXB`tX8d,t=bu܇ J}%UPc1X$*=W zAyRs@394VӌE9#3}V3' 8nuaKeë܆Kg*\r/L+_Z;]die +k_TSm'=U7eJ"uڶ(P^YtP,-ڣ4v;YCV`q]wXns|[p_W_>ŕ.[V"A_Y˹*(US3$ݡ?W'Wjnu. 陙3p/nѫ$M8犗+ K=kK˚5ŜΕK‹/i;qhQt$a{EM.ŜUƆ~$vo%s u&ڴ4,DBx`iI0֤;zej،=VtXUB\zQ)D|2lv\Jǿ<{: /?Am<HSEd|K/A;?.z({sߛ7B[]vۃ]v۫qٍn/*EZoz%ƢJzdڒ6l+T)Ԗ8qh|*~:ƣأQO':4^y_vsKv`t}MDs (6JQZTvo)ʛX8\!'8E/Bnޅ0oG;}J%CNM`W^9e3ϔn؃ͥ/Oh-ԕ-qkח2uE*0O+8^.;&e%/ɍ?z/PQ ydVm1znhxd}C]G4Fݏۿ 3"Y%^7Z68:NKqXaL7fy/$/Yߖu?-bf~F׍W3ʞ@1%n ' n)11-θϹUmoi%_&)$hA$B>UX*w)q8d -J"u4Ch A2RlؘV>jöI N91Fb'łX$?|>=3egPG;#Az;K.U`Irܦ' )VĜi% m*ADs u\aW߸K_/.r^ŗ{h2|ob[o`@"`rz}sv4:R>#_D8Ү~J{H]ŋ^<:$ݧVzm?eͥmee'l(7az(n :QX.mb # E]R쒏əN3r%aV`)3Ƅ9ܝ/6CEyjjm '%*, $'T*x\ͻς}a zUf,Pr}ic%9adW`[`×ސ~xUEĜj孕AQuZL޵g% ʼڟL};}Y&Eq-iQ}x[yͶ~4Ƣ'!{u?<-_^ si$^֙JtMOL%$Bb4 ]M"Y!|R\Q~`ѱd*q.<5"{Fh[m~J(:?,yJ"E@j*NC0hs8 \ME{ѨU­KzcitĺLc&NUL߹Hrq}>w#L\$4lbpҠ? х($H(U"RF9s|7.]p3y~tmg}-b.q1칸;Sھl6^?P/7ҩψݕP Kn4` uuJ]Ncң{c2X+a::"C~)ŃwJ&Y::w2NoƑV-&zX*k>מ<ñIo(2*zN{F}2VW\+`rԘPSj}˘{C NyzwgstMLvFjO䍣,0ƀr`rr[ ,4vdyK/ۋRl48LKɺ_CKO m.sKW\x]='2[VHCYe0o} !qt& 8$lbG۰-cmpfd>xSv (< !"F$z[v.@Xl[ W6 pH$7Ij"T)WHĜH|Yqb6N8͏ lrASG|UJd*IySojWsk33<̠fm3 zTܹmr Isqc")l.Y;TK7Z- ۣnz\فs6cO/?3,!T]vqnOw{]%nC.r1e_^f b]7x`ޓ=<=g;\w.hF8NPoanq;;҄Ct!v &]\v+xjIfJ0p fu^õCLIc6"NT#,Ȑ(0W;. 7eex;6xfJcݫ ( 럷Z3/;ѯvVIZ+??w)ՆKBo؉MU(GQHÅPXi-LW= +*ltX;lvH%RjnX1VѤiW:N^8:Vs0PV*U K 88ɻX֤3J-._ZQ^QI11R.^*W\Zzi٥VlT Eؠ zQ8Yg |wHHܙ|(1z;skUv4؏W1`C*a/pٝΧ IIHF.P*e h"b*1b)I :-uuoX$sIףΈVeh?s< Lay2,$=x8˰%oO#irg8I%"f5f6~,Hi>?Mv8w KJ "*+Ea 9 $!+)KBp,ըE~=M q)׉Awy 3n6vmwko#9#h0wTX4).IB]׷?z"KƍM~vQ6km>տc6\s6re.YRڴۮ[/-֙kl:9|[~\nu%Si)]5[b*,|ꆕ׽ T_MТKo\67_oX*%wٳ[QGm)ky?;}tmۡRrvW;TZ.W@4 l0?h~`@W*-h5n.- 67HFoߥ4?}Tw 3t:B" Ye!q\׵J6Zֆ)ho!07]o>`U6WWdRpf~90N5Zv(u"\ԸNk2{Ii(Of L l!0)H2b5^Db-X  (~xtaHVr !E Fb3rGR , MOOްwK`OZ1+~-+kŗ$cɹB,?( JA`!0`@l0!}a: ģs):&wakԆOO%ڦg΂NM[Pm9k֞'a:ٴ%w}GsZ(pAZ"R怹H1Ki grt*-P&NBj  0$1 cj]m$/ǂ%"/rwwU.tsËs?ʍ޿Q[EjlJ}_)/1{/hu5{KVa&4˒>?gO,ScŬLˢ(E*R,m-Dr<$wKGKŚI ^Q-ϼތw }m=;?zaQۨ}q(v$")yRk*;Lְ=zN_)U(*RQzEꇼKΡ K9t.wlG&sIltE9a16Ri}D*=zϫRp MDN'/>cZȕp)_uuO"fLj&q` ڬqKG|C5d`2<*otF_ΐnޖJNb=Ouo.pW$RT9w-篵g.6G(:ĥ8,u ^t IHs&b{_7t76 ֣(s=K5fwzn)[9r,(ބݾ6B5% YSXײ6bFT4RJS_ID=Ekʗ؛KC*j1a =LOEy=sNh&jU0 pNЫ``/39^/`9|&3tFq+ύw*qM]tEsNWgWŪB)7|IԦ;xٳxG dFKOI U+ƬǬX@)F0lx~dA?ˆAitcr$_y8hn)Iq0cX b bc $T [0,K~oB&K($ɦcV>c^&fm{ 1 pd`K%V(z̸23X+hcBV >1|A B-dv`'x0huh}|;}w @/m# bQ. 2|Tv\ȮS^WPѿl(!P:VB .hFFtc)93kH*Ta󄪧ՌsӜ6ACUy}΄T0)qw*119H9aZ1BM+ NH/;>m-[>[[][Hu߯XUH.`ӏ4`Jؿ(\(*cO<]>V.qX(˙r Slvjr҄N*4Tܧ4%[hr'q)HңW|Jc\p'8t,T,}N?[[YmhPԃ9 oi /л7{KS?oR+.2ry\6,+ָ_U6+M ޻𳳅BϷ%"kekV)E߯Ws*qu$ OmD7<vpC~IfcF*L0*-5BPA} |y2e h"N!% -QRyy-D= mx1GZfK؟p;EWD_k%zɟ:dɟSܯ[Q7kJ/?iYY^jlkϯЃ6#3LՁC)]nAr+0FNci/5vaEyїYyXz%ߏu5“Eq es~PJS yȓ6Q7ztCreiw9)C=Ahϝy?c-ysr>9Ipnܜt,20w-+T[4羋9#Qi!|ϛ;!94T*s y=B?n_~#TFKkv*/Gy\/x)]NRsoȜM^tOӄ]4l_^'<8Ƿ/J=ŶsBtuf^K=N0ޜw+yZ@ۜ=B)N1^ {W^KU|\Цп[XIQœg7`59KMC<|F&\Oޖ#wB ޼=.΍Q>樕[pޖ>Xׇh T ymk>޼%379?GN*!8 NUP$d0~@)W~ũT2QIm1<įY߷w_ӻ_;k#] ?T7fȤ%>ם6PhЊu?!~}wWWf'?߮n}aha5|˶mqkw?Իw4Ϗ؞Jطot۽fu]{Q~c_@_ݕ= d--Yop!(wmx/34wӽ]yIsek\=VwP+ݛ`;w}ޮ!woޞ8ϯw@֡{`W/?Gw 3F{SL/FmV?b ̇2ݔ[}&và پ^1ܻ{oO/,ptf $3пpbHzgȂv ptKd|%<8PrtC!ҳ7颲ߵ{ܗ#3H>~ѕ邾0p_u$ǟ4qxN{Ewo?Yp?־}0Ho\v7#Grru``EhW+v" ;`29 -4z]r={z3}dDb޽]yBAt;w'v 51LX!;2N*Î{{$.kZ֯\nʖ5|2~5k׬WUrw7 wP)@?fUZD {*ȉ,.wm6趣 5u ( ܻ{D r/ޜ& g@D`h@3;p)% pᅽؑSͭ֔ׄ ]PD+灊DƷӾ]==}dP%J[K>T߮vd_ t20(D>|8 4I5Z00 <& c㇥(wwn k4ذJ2WWŒeɤL eeWVJ/vݿ݌$ȣG!1 !qVq9 oSen'wqŞ`c4'/V>yɋO^O^|b+X'/V>yɋO^|b+X䋕n?.]C}z/y?f?ysMrn1ĩf :_{r߁,Ze#8>e0>xO>e8aZ> ;I>^<&VdF 4R_r'BG!%w ;Pn6i/{o8c&.myI,@t+V`1{ Og:i r)kKyZr HH((E_6WثU*hsP%|CW B!@!U!h?IA8Fr^c:^>rm?JjavIkaɑ 9"|!m{imIRhNvOC`P>e pl/z]vIv`".ـϳ%U@$l @WvҲQLD˺[˶"Vrqub\18ħgĢkwQXFөH+FV+ AѪ$XuV k!!APγAnt).r1i@*iJ5PִB脐׊kH Ԫ*ȩ Zf> Z! NbZH_+8ϒ0jjJDzu xo%r?W׆jބ?JϹ.+亟;WX=j.D$YBS&JMb8,ނ" .  1(} JC-: cD@ב򣴎@?:Q]RnXQAi8ghyK1ZNZ #Jp Uw[`nA: !Ы&b48v oopME'P|t\'ЖOGP >Zs g hx#TEV(V8rPzjqA@|"b ?{ ]"L G3tG4ۍ=cwQ勱@qgg,gl9%]g˨cw9{nK#-ب#iӞ]T4(S )i^@Ϧ"LcM@ 5 h8P&qA=F6L 62LTcHJE,"%*!)N)_f1=U" TJpN> ;wiƟ k[ePHAl,nnvfkw MMH˛VjVt^S{r=Uj+q tw1\su+]K9TN\IB;0sjrLY[@RTENt֮}`z> stream x|{|Tյy&ɐ9a!dBy"` π%$H2̄Z+>ZE:mJm*Xڪh᪽,Vܵ9y z{~s^{zBB~ap{=3MQq2nIw!s{;/(7h]7ttPiye\ @r1;Ǿ}mAcz.gNl4ED R[^Wn6qv@NS6{8x:x> j:~4 yRE'3l#Y=|YMģ*'<9~ P ] p`wIjd/ÃK+H{9\  D>Mxgm̄JX ~\x=ed(#rWGc/:r ^|^Eo?q7 π !! "tDd B=BQ.G$\-T*G‘Hef{)&Khf}> $!-=0;$Zs&H\XW!auchP#~9 k5`-J(wz->[bA|Y~ +'+::Bq>mC{W>M OkgĠG!PSɷ[䏴n? WB7O?HY@VoNr5|C^!Ǵ6M) ?F knܪxqkcDnUסw~8 o>|H4$# |k!ZF3L|4@w}(>gB0Sp B$Q;yF@Gڹ@CSKym[zпrν7c7чVQz>;0➆I4Jr"rZfH ^c.S9iDm\G )r5 NvE}z!w{2M-=̡m_vI?"ͳ0,@Eț٘aVNAKCP8 *hNX宬tW,|aY邒‚ysrfgrfe:ffH4kjJrRbB|c2:F(GmvEc9`gJGKX®4aI)H%JB鞠$fJ5)JC%WjDjG>zq8AI鬖¤E nivGUqN.6F!X8ѻ$/"5e)M(Tꨮ :a!^:-#iNnTyap,Ǻ8 Tq6amUXH> *=4|ۨZ[\m6ưib<,.[NDdjih0\Xsx&)Ʃlj5p.ͪmEַHȍnkj mRb0dG i( Ŏ-pVfX`4Gڶ;WIuKG6[UhTD'gX &cDXJ(IuZ y { ~ G|aCU˰aM! 0<ǣh85.W8' }2.9GkBJ,͟|ZZը%hMw)L[ȡĵldh|dbz#y/&ΉXsR|MgY$}Ͱ׭qԭQnQm[0/Sp|UFU |r1k4F,n1*yj斥Jd'FΰY.sMo/֞&^!XpqpZaCCcT3g4rhMV0.90MśâsNn-&ZT;2 :$cx?}>?[28kokB[u9@ |jo:XZ(Fx@^9AP7/R\ʗ?-?Wb K% Gp >I<ޮvY  Pj:Ӂ SPwD(JQA"h6.\B>͌rPŕ7BKFb]»_s+5+{\;^ ""umضh$gSVkJN^Ԓԛ$$b4?`ff3`>6mbTۄrfMdckO鎢vbO*4gܙ9Ev]nNХ(ZϝXnsOAũs'*NqK\ii\鼹I_$k`1CaXtIIIs1S+\y /?;M&^8{۹wn1.Nf7Yz@'ƪGj%mhl(!3wLT5g)'4?$,gYN9gɗ2wt{~`}̔HR>z4f뫓=ٞ)*KsKs\zksM/Efe))!9?( #!ell:ۖS=fgL$F31BLMHf6OJ;fA,cM1{ +#s~m)9:vjJJ49+ef~AQ-k+T;oF[ߩOO\gO}Z~I@  sBߩ>fb~p͟_Ÿ"ݬE ) > IPDKH$sKK7A kn:8#s얛_i6$|Ζzؿskkض 1&kfg%M})}ֹ=m9Kwm-Xqh|FD,QP*m2WQF5τM":}E׫ݩA'ЅuttZR,54}z|%3!jH_bre%39-BK0aI`J[roa3Ļi^$?D]N}# w?VT)=;.O2I$>)J F IY)Edr($/2g5lXEktL"10HcѰطYK*Z`|\stKd)$n=z'"1VCDSrȅ Fkܦ" a"iI:@6` ϫd\M Ef-|{o.Ԓ#XX{- !o0Rєe*2U4 Ŷiqu[moB ͛咽?p:?RO8nؓv9}V+K6ݲ膘Mm1W]Ksq''XF4mt3w=tYY1[6@jLQ=+,2JR1'h }>%4L~c̍AaXw V*4d[yc?*7z_k07`ɝgb\1ט+JpM7|QE Mzӻ#.}֧?deеOo}Gӓ?=[vE ק[C3Noqx»-[U/_zנ.K B¥2>2̗0zI"9K%抯``|XFzkn3KKb-ϊ!zJ"IH5x\Zߡ:8L~zpN70CōBGAv}{x ]7a#*N@ct*.@K5mSq-_:h5ߠz7DzHţ`^Ή(?&Ac /%!"zt0$Z(u#. >JyMG)WqQ'*>J]U*>J8(u@Gօ*>zT}dGٟTq#_GfsQLYx41W43]fx5 sUhǹ. 2XKBtrЃR$~ J8=]8?j?\)B2 HOo yP\bgtat !>k5Df,ې*d#ȣ [-B)} 0 `){M=zqԏ~rfOYfNRԣ&[Oq2{niCIB\"f ی& J>_'W mAz6OULZdRGL^J*RuLQ;H'J;!{xKA&*.I[ynEB*J$xdXἦƋW]ec3LNWT/q=W2¤pyQޫzP SGs8R{نڝSZ ~!"^5RхpM[ŇWf5~cܢ]|>[5oVTMVB;]j]}u&>N[^ (]8&sjpB6כ\M^$u۬||;Ucď%ћUk++LfyWǽizST4ݾb;n. RNׄݼ5/D/UyۦŦ }?n~oؖx l MLveԬ즠eSU|"5[G'#Mƭw{xdnʃ!Ŋ!>\{y u9.[?B8Vgi>˞ߟc_y0+{)K*|˛'U{B(-&w+-;Oj_wJjo:9d H>ofsWM6IZ `HmG !5JOHrJ Ҋ<&]Ay&VB}Oo.Yx|=lM;GZoť.O0y}i u@3-(n&[`P zЂh$_&}=b/Ry|8RgŗNjj`  >4y/*({`ЏB\)ԥ=4 ur3tml6Q EBrO'#`-,ee˪*X..[VU|MTduMM}dlD[E Bܢb\LAifzY>R(_{:"1Oji +F834M,dt,!s;qR.BI'k0z[C45EYq0'L11Ei1BΓuR3G ^&5Њ=<\O[Feg\KBu}L!dMA%Hyyw[XG.%%XNrW{;I<(_=Bd |*+$iv,V l@؎AXa+A3|-$UV^U7\ޤzBV+R+\*bTp2IHc^, = !@d: vD 9$H#4āRF=1iXV D8p4}|ޣ!ջPa'A:.fdxLjXbwPGJJ sĕ",INSQۑfGH.sF \ V" "h{ `NZy Ax-FXF(=:\lL_A2k^L_o/yX/ۡ2 瘱6c=qHDرG@Xa;3GqȳpDH9xHv cLbİ)tRs=dccck3bpmD+6 İ4sd&"UZi4"`|&2~0횝c:@#CCdH&CגP9 Ȑ !7z,@S iRw :B$CA2$CYd( I=J3FW{*پE(cZ4:A,"DxˍDL853T(RN| ^0zaeC"Zoe,"FrqN#P">W^Z|_ɠfe^*lt"=NK 82JLaPiw0qZol}|2|E:R Nv1.}:;̵ 1l>gOlяm'd&<Kzy9J: q'ppgƶľde ܱ+Kqj[5+lWb6g}.Rv3uזNwnQB7_We4]>NoF^Ջz}hsE*JfJJ.pPG,&uC^kg8Fqac1 A]Wݨ.:\ V~q7!w4ao> stream xr_'yb# ΤdN7nCZ%v$+R~})Cڙ/jg|}sF,,Mj$ٿߗ΋|eE^g9-qJ!Xw`U}/>:ŌvLد,uv؞ cnM%|fKD!LݧQ(|b1Jq;FhU#Tl:&B0#V9f1iTMvWN\7?"eRKmY://LSeWy;[*;_ձUQp 9%~XJQ}KNV|uN| wlXBG(zbfg.qp쁙#1Sw (qqG;wʂ r7DHjAA@IGރs 2Y~(lպoR L,Ԅ>{QY]i>[v\%R5*hsiAlu8 8"l4t6y8?Nemt|lR-v]O`D.+YLZ%5\yoMրd5jUR`p@3ob>lvuYmcm P:L;fi\)=zHrd<}Z cņ1=-cԁ0T.JK #o[)PD 쨅˲M Z·ۛ(Q uh:ya%Fjfށƒdx* (U2. #&:=b6Kt@fw妢:luW)yA#;m78A*gR+N@ f]\e:P\A@ʴϡV~Gl"udbU#u@F+TU*hRP r8t# e*i)Q{ؾmSUlvJK]נRh'>%YM嶬8:Pym<գN[ kʻ`uRd ]|IO20 䛼%Pw^PٵC[_D[vr/ f i$sM59!!%1M_X!kD~-*7A}`%v;^,)}`BO"igLzhAZkrxDNdҔК (=%\<P REkb=O?Gf1ʀlIuF >FDˆa/ډ)$6?*x;~G`}L+j&k@2 9ar~&)MPp@-.O痆KTwm@#_xdo.h PIRaìz'@Mwe^V1+s{B}B">_l[ L` SW7a/w D:9"CUgm}oE;6=< _>4P md?w7,jSO8S:n t<X6=fDlkll AX^,iĨF%5ZnUmn|!' ^ъUQ;zsBIx!qQi ɨ!H=90Z0nB#6Et{Q蓬γ|_@5,܀e,&<*'@O0:NGCԑ|('c-)}Є"LcTJ 䋢&|=* %eGG &0c$G ɑA!'iz/Ǵˈ~a?sʋrmʨ2kc s%FǸig<:8PO3T"WuXS5XW|mmNft't׺AeȁR!jDA֭JHfJ@B#֐?OY4"BJ P|=nU0 K 5=6\fX82(w!1 QJ@MqL::yURIw X ;&cW78vFE#X?yX#9`Cz t ,.{H*bH8!(bF E^щSHŢ@?RmK tM! j#ڸ6nn L4:i&ʀm+eVgvmC.s e} ٷv57(Jɤ6ILJVJ7Y]vF\onh ԛ;3G;kmK@9Xٿe/pX2mHNw$M.sBw;M??CⵇzóJ"i 4:|9i% .MIIK1IOt(D?0=hVޮX5pgbX / 'hú',!X8+NCUHIQE?C&:OpXduf 6eZ Zmd/!,ڸ#TqRa4bC%틢 0i̴2!!0Diʼ2OÛ>+# 4eCtD]'gU{psHvb iz#&2*36'Gt84qHyh3IP=93ET$lj :W%hLܱ+|>FA}}5KE@tPW] "V!aݪ?%/_#u&ޱƆo.oHPݧA!02):|o_*@K )s 6 lEi)C?e)0(4J}?  endstream endobj 104 0 obj << /Length 1587 /Filter /FlateDecode >> stream xn6_!AcwR:d2! զmܢ%r'N7C <Œj Qz*lL&_ŜaYL 72>\Ncp*$"e}>dƞ2O9ٱڞڝ3!8tՖo̓4/Yasq2?/j^.ZcD Y<`E1!g/wKPE3fc\ @@UlD fUm/N˅g!u =k}ghɽ'y7xRtUwt ol_5fӬ*kͪ߷$'y$' kO-;"\vKqVgaSoq&_>Imw@2CQ(Yn)2rE((v9*yV(K+Q0T`(MD-Khd1P-K Uj ".dP)j)(;"Q8Տ#% 7ȗ>:cT!I2oczӨ3 d*ҩʹ? UH#f Vߵ &Sޖ}& Ax61K\{⌏6nv \؀m3&,<:J%^@NShV'*]:YH-I/.y++/=(JeN;D$-Sl`^I yû~]^no?ɚ갛wA#&lKU }S9VlxLjGN j$}E ^fV!ͽ?YtoeCsr }1WUݰIV}W3aR@a\S0)6YZz]azK~譒HLIoӢ)@5E:_'|1YQSs$LJN( \&Q\ ;s%+cbV۬L7˖n2Z\7uaswYB9ŽeC:7pheOߞcEz&4ʭZ4~LDR =gEvzr΂dӌMӧSƑ o~V$*krD^ȞPϡ 9xRu蜠{V?.)"Щ]$nVm endstream endobj 115 0 obj << /Length 2973 /Filter /FlateDecode >> stream xr]_KށN݌˪;Zjg:B{@J%e}d9 'GG'oE9\MZ,LGAey횷is}ߏB J$$nj—2 V枡UooU .>>N U/$dA"&QrR蟏DҲHMb2d„}|Ӥ8$$ԇ j)ʓҜE<"::!L.T70F)9(DTOWjGQ4oF,{& >QA]|]&uE1-)eXfLiѼ/|OUȂWur)!(rάn^yDf)E,B8 rn^xW4ͬIˢ_] 6ν:cLhxLud^OyH FE/݇`2}h_O;M~E_DY=y˺ 3Nb[$̓Adu rfI f\gsm5c>7NW,օE7ԛ(&8 C aˉpI߀H<GgJ5%4R6:ٞR ZsS4I~=f:0N1AV|%h9*(gaiֳf]=؞]̶u֤/9}k| L~XDrDԛ}6+SF>Y$ҙ/LBIbihM-$V8F }v)g;v`E W<VOA7+"$RA')5ξ4zXKJݡ 7(aBE}¦ѣH!=,*Fa'hAhCƅ;M^)KNwR>@04!ꐾA > mh JVRZ!4KE\U))i>X@( d(#f[CԎ_ mjJYːVW:H?O|$~z8$r`cdlRI h_ ##Q'yJGi%O)Fjo&A.Usȹ 'sMn|S'9M{FǤP0N1ƅ`63,=Aѳ5RV:GvORnzg`BKSx2\]a JzVe)FGm.s (g-@vֵ{zB8=] \:]-umS b Jj#S*r]͌ ͇<ËsR2[3?n4K2\Ul D>Ezc9^zYwvνhV~30"OaiV>9%*%E"&P'KS|^ۄ0%e=|_X˜6V*ߞ׬,nLՠ*5实 ]o U Z||]DqpAwђp<ې wu$x>EkbIX;E*Eq*/ţ8;TE*i͍4*c!S ꠆Z%4!18ӵ\i{]zqlbL1)0v'Yf-zvoCBl^7 yj)߸q:1Cr ~t5Lq"j^j'D"r"tϊO҅nshc$箮*ܸ}"; k'}"A69U::8/ȩwiom$s?>Ę(V*붕3d\1wMjػ5n{lڜC1i3aw̕("4_f FH2fY7d_&b# >I۲=1SL)>gurb]s^E@[woU(ǫ`fDq-A2PQhe!PA$ S # "b& XMh510#jCVY0u.G&ild Y x:M:";'u>q>I?+ FO8*E*@[-W6YSXwl'i_ mJ{tSƗTtث+ۊ@U'FýU?aO($9u hnro(Q" R#HuQMҸ"nt:p/{!_SVq'_B+bz`o/g?:)kFiXV&kmO}\c5BEAoy`ֿb=$;QFKcEb m*߳݇ 6>KN!6[.}ܾN\c.w:` #- vk(ж2۾3 o5vozs3tnnbMNu3Ctv^nanSE\{WURڕ;ST6eo"s߿Lwԍ q {S&HY-OV뫓d&T=4b,NUY]ڗk3&Kr(U-)+Bf c49}s}%@YbHpA\,lcz*iW%7l8 Y$E}KnVaV20V([+oTBaWsQ( endstream endobj 120 0 obj << /Length 2490 /Filter /FlateDecode >> stream xZo8Bf$zNHI-Dڕ%GÑlǹmQ )rșqˣ7G'Gs7BFx#0:`OהT|GXm*&b XB,͓k۞\Юq=/"FΘďbzyxVnۙ.)|ʼ}4 FzlrWecLtVWcoX8Ů!DQf,՟nq=<Խ<#Bk{еF?U5>@1\φ!njp!˴y<\ r;vVEąKS-TIBexQ@w<+w ?D&=`zߎ!|qڇahۉ5s٣F0‚5}a! ;nE۲iuDj+#zѦ3}!3 =@JF,3.DJ:s^HEiGj{)34$GIO٤6q`k[t>=?,AT>sLX3I#6q䬷jayD,r|p8q[ࣜpp$1Q%gpǻۃx< BbKx4$qlt9q+(A'fвʈqYyCM̋ݼ4[4u2^PDSCFy%8tQoN\5y >ָe9 A2K`xy0|mäzl6 i`|x?r=%  ϰcp9@ΗE/`y#i~H҂TAZ,35RBBBhZKd̛,k_.ɶ_on}Dr> ΀U#`e[LU|72Iab>qS/r6C0 u>Ko= g"/ 4pX- 6mɃ*XF2k  "/~G} gpג $8QL((U "ݪ{Q҅4I ' 3Yry%ʩ006~8nmO{I!I}}7ٻӟ ݼywYt{ +l WV}}0} qN!;$$n'套RHx[$ ƚ:Kw`G?3Ǻx"5~L0 a=Ѿ~^nIl AߺEQm0AUy {*ȧ1r" ףsS3&U=3x_B2d0NWmcƐn1GÌ:y> * dXAsSW-&afR?QG!>$+}JϪr0z"wT+ q .tV=T 0WE5}0`0 CzghY6ZIKEփ.6j"mYMyjXEhqY 8|M@}/g׺j,ͩeT=5OvJ>V$2byZf&PinFu fm=)ۜŜLO' ќLeurHSNM.Ͻwݻ[@d,UM{TEZ0gkR3]Bk#U:>~i"Yؠ sfp_*R28T(=&4;O"KzܻHb#+΍Zto "u{nU,RWĽ7.V4B1ɰ`RPNU'P*Џge`"#c%-费;&zLČ^]vbxռ&% JLk+{|^x<ăj3Bm~pQB endstream endobj 127 0 obj << /Length 847 /Filter /FlateDecode >> stream xڵVKs0W%3Z^60n$`+YIN@J^O!h0z;Mދ e8SLIaH iwMf1N6Ikm#3AB 1 2 ~[sBuj(VC VETd*56FzdDE %iI||L8=QT9)&2ZeÌ^F`m &w.-/lT1J17UeX Lusz''p̘AX,ZSNT6.cc^B0Dzqw]or)".oUoڼfmޙ5|o`NgiV.w媉o1}\xRJ/$Bd?8O.40> stream xmyzpwO.2=@1 0D(܅6t@0( gˠ #2)V!8M @[Za,L- e*u'5hqf/ A <Q[Y$.f@ؗ^ ;zaKY^޻=Vuz[Y)N^py0;,еfQ7Jy볎m֤:%?لD=Wϕ4\{@HO7:lZ W:8"mS w]YWjRF2E6mn=rMnжyrVRU5Tl[l%i_0;]U6tQ7eMvzx<}KZLTtGd= $\QO f&.!hڐ$m9XvA].7'M6*^xdȜRΏBg=>h7d)4ؾ X SdRjR,؈ nqٍKCyZE%e}MU5$6G0~JXS`D5پ[eGxGg<Juʟ=$w^ohg桏P'ʶ_9A_ۥ|0Ÿ[IW{&]R+í#aWvjkݛC9W5@F[3VZ2=Ngl4?jaNt%@)z_uj>z0 oC\USB؇k2>fkQUY5& k9pQVoz*?.*PqR{nW9S3Jyz-B f rRJu%]_Z=WZ*Pڼ;Y/{DNd~rl~pZzi[>)zwy[/) 8>uBxu awY fӃ"2w8]Ta/|Xp9`Jdz\DKt7ff 5 %,mKrP.UDVy Ot?ɸ8ϱNEwm endstream endobj 146 0 obj << /Length1 1747 /Length2 5972 /Length3 0 /Length 6964 /Filter /FlateDecode >> stream xڍwc'{ qqP'lR"ޔQlRY n~u]y1Wc\4V\ZBJPGB-h?# #n))/EaКP,Bt~ -S@RR@k#?+>FoPHKp \Qh ߪzh$/WW]k1h`@RHc(x\ݰ0L䷼  ~X|Ij(? @%1 _K~oz<"POL 6QA) sVh8FbP7 KK @#.ߓc|%@s[LM[80 v@`SO` T@ A $%,>džH/#Iߦ H qN9)Z }NҀ9Is$ gxNx=s^뙞^ $ HZ~Zs«[C xu9gp<XO{nUǁo04% x|+ՃC=Hω) wS?9J:/Ƨ7?~̹:>/7]s77׶e]Ea @ |i#&Ǟ[;7!X #_%QbHo/6&A?@ ~o!W A-'Bc-y~)9A8/;ä B8H@ H>߁0_a_HE 01 L)=-3[կi uGA&~4IZhͭI~2D @'MQccO~% h m]^aNsM-/_o&v2فU*p]nkŠ_A\/ ՞d崐ge2I9l㻁`g+N~A?BQșa{ߊ~=(m&*ݕIX"1}}wnf$%PC$9b5Ε+v,4E%ذZleV %_~hcѮbQ%ڸ<~M̞.O_W+Mo6e/9h uiz9ЖgxY'3M;Fܤ^5%V7 pmqP9uf Oؗ! T}Zb@S  gҳtՈaAS#]yq FkÈbNkMmSF܋L$H6Ej,sE ^mRO >0q,!r3qHWsˢJ63lI zeYH6 @KHP^%GJƫ`3t Vm(0ݱCg2Zޞ0S­1[1FzbhIF_ά+(-9 ?t5>Wd9@y=zh\7aYUdBeͰq9~i[$?Pcj(FnE"Ű˒˄v۔Cy5eʌ:++A'#ڶjvN W&X+}[SQ3,/ﯼ}u58'cǪ}iS+u?<|e Vt@ l $ɤ 7@Gy|'ʭ"uga 7[H$y+*uk495MfkמLBfIԬDXCuTacJ+S ['ߦnbHvܹW/s l?7h]պ&I7`sK M1f1k-_fv*΁<3bgUAeƻ"ѵ£o8.Wh)-re ;NܘȮA_(V󳊌~;pJ Gosr9O#Pom]ܾ㫄2(Pv)sc5;eP,z0̘؝:NњX9g9#-2O+W+zzA/㴹:.;2^_Ϩr7\vqIOge6" _G zhFL:#x/\LJn&FA7iK3a["Aqs#euv2 :Ri CHHO_|iu:5)MpGZO9+ln_i#s{W}dd,ҧh2BehHyy0Cg_Z%LMG8 =~so*EJBHn!7Uj0*J*ŽFeZ‰Y]2)/6azzN{wM+X,QËXfd&^];$.[aP>tqV%4ÙqOU4ϪPo|̜cΠwdI.2i .V0u/$?d3@(QcfDM8M=K~orj4*m4F6ȡOe(;D}-C~0m9h*؟=lMȌ#"mFJSd[[8ʊ./rLn<^ WX.qƖ?][Bl` #ohB۩5rjZ3-sa:?3n=&.;iN5k j$PlGj, yTxR q nͮ407T6U^OSdg@کKA&8R~ l"8 |{GtJ`^ 0QNI EH10AH< EӋ8 NJSLK`Gj٧Մ-,b"vVF<5jd?U_iqmYxZƑJnM% ęOn\go#9VO<6V@.ŭG/q$̶z<A*7+=(80NoTPÏ}0=B-l\7U|u3UCuB"_8K? n0G{僁˳cn0\FM[}-D$ >ѶT>k-a7WP%oHcdIj/+BBR00D 68ej"Ui]6v\u+d gwUk{@Od{S|ScݣOo9$^sbH_@SBnԾ͏ _p0sҼD_kEnƜhH$0js;=BP"y{_,Zq$oeӡtQ7]@7{'^Qڭb_PFt S>W}\ [kz:'L N,`` ؠJ%*$#P#/j8rWgw(T+/ɽTt25:0tx^-:">'A'η~uB9+~!HGBJҥAoRRJ g`]ecW>w%_#~v\;~YZ:'iUdY?qw+sONJZ4~B\]:=|0\w!(˸U%mKr\"zz[TI!e;r%>sW$"Z돲f%pGl _ }n܁z@˛O6oޕ,>з+l0 5|%oU^|o'!x%yN(Pbupڂ^֖t"e]1@OɅUEy$;a}3E/j3We]HOݣp^5nۻj 킻phJ2:TI"14r|*KG|q]̥ϣeqYFdt%HX;}5 ;[lUbk %0$,}dzԜ4'M)VE?Pu[[&KCnt|=|+)+g?N`{,+-at!zt#v6ήfU?j)OdG}ֈ!7ih`qWݭv6뒏*3a3w r#-?( zX֓VR}jum!mQ\XUF\C߅V'dG)HIi=*u5nJ=jאwwLTjyjڡЗ [TyS:tY>SalRfK;]z0t`XgY̒Ð/Wm.|w*8Oj[V 76sIZ_u>J0V4(Q*cB~GܭXaZWѬ|7G/='|md+3uґ^`HdOݐJ :3"Ќr"Q}ߐ[[U{>a#Jefk`'#3}PcZ!t9٫2FW#8C&lD$vEv2 ={RM>'rW>tl^[>SoG)<'tQusLB/[x ToN{(0j#(7%֢U.j>0L䢬-jYa6jaK_hɬ»9SuWiy&OcJ&NQK >Q46%8p^'8 V)bwHQSlb6-W2l{3Jja睌]YdaT73ͱػ2 aWV&*_D"am-(V(o)Ge)'!6O9?6>k),BőVꂉObCg0_㗮͆qW~'zJɩxtWc|Q%alb-y"XJ8s ]yshIa5&AErvoN14jY P? GeJpEOMZN&D b_<~ԥ^!o>%,wFy6Yȃe)՟ ?]cJ9 Ok1]{hkᄌCF0~p9kJ{GZ,L[}2jfWbnNp8ًgbָgB.CSVO>)e&O70@]Fw8| HZ]gRKn(S WXuSv+:Q;7\^{s'dtiFmٱd< [?c^ ϔߧ(wX\Y)4Z|N;Vڴ!7Ki4)lk1_Ԙ?Kq/6fm5=+#13W e.WN5\{0|d/.%?kM7 3ۻ[g]i[[9E^M_ _?"U<{YEhBVFH܌ b?J4Yd})\Z\bl}7,`n㡒P}A)c+c1KmS]iƱ˓~$*kz@W>]Dͼ^Z̤?pJKQH||6I׃PU3Bllo_Rѕu4Vnَ>v%%Y^o㘀h(<"\?oB,\7^.QB;`g,E衅#=?Z*}ogReνf 7_lHǫs\(]כL;£)VgzT2V}D?XQh|> stream xmuu\6HH+!(twwwò !J ҡ KtK( 9yχ?kf2=aYaPwv.Na4J 5!.`''7'''+Ze+([%(- EyY!bNNߟ.. A8?JP[6!,ඁA}6`[YGGu+'0fр?r8_'w#$s(cC6w=ѕzP# քAtqt! ( /_.0sur_PѧTeX1*l P;7?}r I7 8pp\q4_~@e(/@*= B= Bi||x@]_$` حw 1r!.< A qsxHHa"]@`wG_?w_bп sDܷ9yX4s!A,B و)_G>Aȵx7"!#ogAh1{g{0 D(}D/h΃b~D<?N @ŇE<ڇ!N_{ P7 ar?G͋q "W\Cr?F;V.܎ڔq:Y:-BٳKb죟 <뗑.Q+z7I3aw820aۻ fW~JHgAcu/@d"DdD%HPOy7k~nއ9r8ھPy1VAϏ<88hǥg\ONS615k.7hi9ǚ3~Å\Schn༖H.ɅIoH$Ho2ti-lڳDv&YrEґEL | ngT@0ij'0;\{DfMuDΫw[rg/ʼ&7]*c:yq)D'|ճחDIG}2#ﮝ7s R%K'usBڝba޶4$%Q:,&$kFu0([Y30myJNɒ"!شSF\ $(D試6Kx.5r\p3-mL5J5B7V CYȺBØ $sFYD,v^X6i)eN Ypݶ&kx1]~TKmd.d)K65]B?5/ 蜤M,e7>C)f`Ӈ;Wn.E& pUDh'xb#:?*KW*تа?9 w7`# 4pؚzҊॹ.𹄐B+j/%*w™ Q[)f,JWxݪ4/#h ۾=?ܹ}Bk4'@e/T7ΐpѬy?ڏ moC J502TPd5j}_i`Ojڴ TH p^2#U$osW38WRYY*VUL'mkWT~,(6_ A٢WW8%g|-9d@z݁/fͨBP{=Vh+p~=O>J]''e/ʸGp~`&F42mx`nS|q癗[̓B'Y(+9]Q^5k@Gdw8Gz4lgrEqѠx{V@\pR֝^Ϯs|Zyz\kw_caO<N{M^ʭȻr1_|6E/_Kd`O$-~w!6GP\T/{8ᎆ3;lt'Mُ=D>gZ(rN-/h3Hϡ亘&QAdC;>OO}pl{x:W4fwǂL'LHE5N`NBLI+LҦla<- {%'uBl~`jcZ:d%oQ&;PaTVV7oP^%:ʕ6cˎ2 NzeB!VN q8)3#V4C7{ dIJU7idW&rEΜ 9Q-RO:W\݌o~{+l+9y&bE\hO%@ %Fv2ZNjK@uAΩe-䊯̵⫢)*/y<4 {\n_:$ꣿҦȪ+tƄ򣴴δa˪`۴k5e+aX""#_{&r8VpR.SY\0/3Haf 7dƲGm2=rnSMuA{Y0ފa'Ȑx &G?tD0637^Sd*BYh^UETV` dnk8K\v=_.liAokjbEF?;BY-B{>pL8Y c9yPb'3(n{wƽf r 3١^q5CbmBtK^0H>|{bYRy-j0JITdEYPo5]f}Ϛ ^P,GHK ܃X}{; vg: gf }0BB%چ[rr%\FduM 51XcYlMÂ|z6fg͝y|qCӦ<)!_3e<&(c;to9c3%橉$g#a5rvSQ]HP[EU=x~lyʿ\ERa)AmC9pP2x^!e;]z4oҮ)Xnl՞ o; \cw3P&cbϋ P^XX65tb|eHɐ(eKĊSuzFR\el`9K:+<%!+r/$ư1|ؼVu '@^_HW='<%R=4›EIeG'Sဧ;BN1y|@cBDmob8 :] +ۄ{v6S4/*U(蔲\{Q'g!zlRhjpGvNT$_d_iS<$rr*!2 "|a/Xqӝ{fQN1i4 2B2s1IZ* Ii⬄oe综P&ƛ1{GSyVr " Q2qnGoB54^.WҤt=I#HIH;WZeH5Dw6Y ڛAZ"MÓ>Mcl~h$UR^͆bx4tS8Շa}'wd<]L ǒF *$6 hςTnWoR%Wmq1˭y`2)8Y*E-%RPĕ2_6؆F.uyOQwr7.p]kt iFzEZ!t`8Ems M2o]Rdcᶖ 9}D&$]<(`iRLŝ4;vWՏ׽&g)t#6ߴqPel 6bؠZ(<i>_ec$k^h%iVQscL )qy|vJ[r^l hT@;IDb:&rb(yA#Хx޾$kIx4Kh{nPn~[ߪBjl. W?M|R`}<+sYCkϪn &tϤV:ZJM,!6Fbٺ^ӷad*ߨyQ:\XɮzE,h6mΜM Zg6* W~BEqml;S.{-xTa-c 2}F]Fi|\Uc<`mci~I@}NY}SD5ۓ~ ZEW/5TW(i,D1kH%TTٹ[u?#B[LK|h\HV0VA[y_aR}ux(>nL( CpB]Ӎ^kvtOo^֯QDU}| F~_W'/bW2 %V>ߋFw*y1 Y2q鬦c3a=Bih|Z"{Y3ՐRd9ܼ\>D ca|zj%ⱄ.P wB'ZjzbȦjsM&oكp,nӫk`UDu(HLVZ5Þ#n3eK~T͜4AMx** $\*#?:mV {٧: }bSO ٻrFx#{)5eabou UFYsr8<{zW`@'";h*mỏ*{]Bq B燇Pnv U]U|~ *Z~ J`ܳ\U9m;aqien ̏ÍeEJͲXhWj$Œ/]i#g^?G f9\ϥ3BoK */J:w# KGcDQe!_`}Ŵ'lu0v+mٗfQ!ǫ-KWHĈd`玟Ve~ns΢OSV'Պ9?ϴ)%8UmCkI?g7?Dv տ| 7l~3:R&6ŤJR"6ikK%>]#fˋ284.uv`-W>_gNG{rNyu!1Ϭ-M;jS*KyoTqQЖrt \ZȀ´xA-Wǟ׉=2/Z\ғ2]1嚫 uRwé_$[-:&LGjB}5 TY) O&'|=>wj LeE8xDPrHQ Wh_/ R=J`UX [x MО/\~3 zj"rT#Բe9On rhJvG֣*ϼ~vKR91 4oI U'd7zV%]XPz> %Nt14~&kND8rU. nl闅Wi `&|bϔJۿ7p(%p*6\ؗk5:O-kDrT-~MMdv.04`&q 7yb;YF(wWMfn y,"FTcQˏ8}H\%΋⥙REKR^30/ stv({nlGgǃ率 -Q"Rxb\4Y>@]#\zmbzMSwwBxVfg␙jNL >ߢxr"ax~Xݯ>H|EM 8USDs Em+)Ɓb9W%2bzJ% o c$k<+Kk!!W.}gaf0(?ذ2kAz{T#/{RM{.31! )1+_9Lgru̷-lH2(^vU_5Jm~Cֶ?uٙ|ٽ:Urm>bג01,;] + endstream endobj 150 0 obj << /Length1 2745 /Length2 22683 /Length3 0 /Length 24259 /Filter /FlateDecode >> stream xڴeT]]5 A9$ Npww;~`a֪Y5W6c@I(jh rtpcdeb((80-L\lL,,.@7kG 7  l y"P@Т9t3vhL*n&e"bmi;;#LŘr&fs"@d8:LV&vG P.VSTQe%VwwrrtZ54J{@P % opEI Q IV=X@WߴS2@.hܜ===,]ݘ],Ob }` 7`mtprע=HJP@Bi/w+_4V&*(M܀&f G77wW?67М_..9.Lw/mm3GWkW7e,퀿wgEd$5@RǁD%<,\V^ hH%AU"O73׶N̚@Y,n2bMϴ66durtXع-_W #VnhAA{F柃J :vsh hsKNHyw4J.&vf*e4Wv3˺f_ڔLhnAߏ.#+F W$ wfm)i1gfqt0s4vqrL\\LX@ eʹ9I0398BNn G߻ `m0Af?,%YR+Ybue S@|JO?Ġ `@jA > ^2@A zSФ<@& Nhmm$_OL;jd`a'o''+;O@T%qHfW;Wrpr5^ < p /AE{AS(_TLS}s]y?XemzEKtװ젯f_ɿ|9@=0FFpWٿ;@Oߗ>!,r4Im( ̟Mt\#->O"w (\AU gPMmڜT1~m*eERt8=fH|з2:S- -Cq޶·72o-yО3X.v^h'MzD覍F 8uwbnG ?pAvfR&VE^F5ih$ڂ!\$;$r&˕MW5:ɿO'SJfkB}!C;dFاeĺ5ӛA8ä!Lh7ktX>0-$9tIXѨᒮ5>:Vd@_7t7T>fC86( >Nif}dve-ƉT%׳:_\OADl-~nT'FY4Wlbf1p"?Ӿ5W6bȆtc`f#bZk,CdwLq.IN,G`kk?'\s`ng0IIV( ]ʤG8 O5I1k>2In 5gK6=KV}zc s =^`VM4Z:soٱ9 mɯ~8汐E4ڪ$?Ea9uǵǫLΝxC-k&%߲+8u3=zȹ xu}lč oasY?}>cKHvS}-cT1r5<]@p@Z5"? Ř:U`Z.B؄46X`{8ך6.ֻ`ؾR\nPR)@a*[SvfeZ+8cΨi͝fnМY}<3]w5or#W-Qeb}Gi&lgiVMG,$Pwx`Y-ڝʏZ >Vz Mg4P0#W4na ]hxɭ~EӜ!M k>4}F TimS -fs~}SS86iF>Vjbh'8A1,^&"<DZP1e%VTkZ5:"+Enp)?J+ԫ #sQceè_4mNgAa&8Mt#}fB}Ȁ5}_[Qn3붳 >^%<7=4'i?0 I%6P<4y)~)&Zt4KvpxTLgْOS/n˾=^1=Z5B RGH]OXWo@~H5z<*\`W2D]DH8:'o?:9sda~z 1ec} S~!M@)Å.匛=-We"!58#8|4z)ΘYD?*Z-ӭS$uVV⛘c*0r+m?*'n)"c6GJnf"c 48oBKint|0.ArDCڿƢ:̍H˛/f1x9<#R6בBW4koqP.` n#V>!i%â;K7!nnwt|ڵ,TQZe'_(uڦxaʕJ٣0E9uY fHdCI T%1jM}G_bqB߳Oœ5L6o]5 6\x= }J@KQ,3#K,Џo vTfi\\Q׌V1U<7=Dcѻ2|("z[Yj8m o8$)C Y  F8ZL_Ow~Dcm^ɷ_9eۗr[@Q2t2?NiW,wu*UnbΒ3Q]ƾ]hC`HgS[v= -Jv~K1!3],i 3ׇ \UL7aa_dIo]SOoo{-)3_<8~/F~0k8EN 3h~ 1z^C~ze>bσ!a6$!i|8YTxMdvk.tlDq9h62CQȣ@$5:ѹ^ U5?YB#mz^H>4t3J=aٹ'Jr Qd-BH)Hk,WVÒkyZj-x'Sc/!+-BfXا‹N0[8vm^B;J xvcMTwU?kq諠G)*_6!fn ں?6"E靐PJa ?' ML)eF!+2IN|n[W-WXL&g?IcaC2iHt[urFyxE%wV^DR:q3 !ccJ^51r;+0%H/0(iKE?A3yʞ7z(M.e N^7n4NYtxGvM>[蕦p;qڮ6+ #0w߹¯>5N2vUKD)>8.|Ogm1ScSs VBIu8)Y]B9(LiQEK#||YWr\IC# tX("G ݚV oJSwlQ!z4DSE8f w y.Gt/( jDӼye6> ?>s{]׷MX1BN\ekB((酰xV\6iw*~K" ʧTԚY߼1N8o$.f}RV4p-F~'poǍm ja"HkpX.QSvrU(lg6xCdh !7#o`Ŕ2'0u7q29"w4S)_GC y\s g] ޒ`fѕtjNwE[X,{?=,bIoxڗ)?X)r$SI !NpaBNe& qWpBi\tGF;$8eNjminlq"ɢPE?G+b(I@()!<_#r5-.;0Y_)+‘F,GP=MP #k TR>+ }JQ@=jjoyg1t,\nO=jE4+Tej2kR/ZC@epu0kN+cz%rxY>x@M*]ٲ/ת]+l_in嚫{Hƿ͵/_.cmu r]+SoOynжIm'6q롾 Wg5?Ǩ j0L9l՞a[2?6OuX&3'uLavh[4\PUAY+F`> zO8bۀ<8A5/=Cw{Xլ߱#\|OoG9u_h䡒a VpP~~ʼ00ݝD[ڇ=Hԓ׮b/i11]BEٮ`M ftJ+8BMI9MMY&Pf\[T6ȀW£4ǭv|LdO{k>;j 8#?aذ~>x=wpHAѠǚz#C@Gvh)v-^&զT"vӚ?sErT v"6߂Q\^Pye43<3qJ]&B"(E;17y2e/W:)KMW28R/G1cі0腷>Jv}yq ]Wv1uigs _ԫJ |Iw[-EU"mw1&n!>dDŽ42MyYXpGy0 ;ѱ4JeElyDqvtE4E.,eT)^$y7 J8N֔PvA[:2͏=p s"($'.]|@:-*Aw^-2{135mLm//G+ gҸji4#4]joo:x[M90j;nZ)W=y垙 u[%T0g䴾}M,u.V]s$>m+73- 4r] dLMx#63鋜 cx˹Ɏ=5:&"%hXL\[Q5bq!oif~D>2 a9O /tlvqeQD;:~!_o(V$J.^+!rGt t:_?RGf^bNTȚz14@[@m~K\MiJTH[ң26+$2DŒZIQEOh!.8>6҃fF'dzTs&$E*1 v)\4kYba +>?L>xTfsWΑNы-`@K&tY#]"Kq)ESKXe!\O`ΥQ暹ׄ,FtFDƥ[5<(r0r.24ŕj6X%P'+ٗpx}wW]l_{Xm.6ylGDm>"閝T| g.Y8juD j#;p蚮] R 1t~ 8&t0S*ԅ>#9-nxwIZ*hBL+jCJ)dd5%npkL*Ez[Rr6+Ska  5xnU?=Iҧcԥջd^+搚l[1Y8L\36??P3KHYf{vJ&Hr]T0dWmS;^{:9ޅO7;%cV ӭĔz WZәu2$*G&F}+}܀(h3~MI.5/KY۞ rbNjS|.+0ְs~s!L4_?}óyYgEƤ.1EO1Qi sloG(@gUX%*β-n5=%v#Ay(QYS5"]f"m M$#nTY7ܭD>ýG RH%YwA8}xRLM}ݤ>Cm: 9$$ eI-d=<~h,*E)/FEok~\}h1e%]<(BW: UXkLRg5~*ޫ7:fg)=VZt~p_j +#L_?@~{3uNB=It<3V & B fbOe]ǹLll(p {B*.&dC8V=Žf=з8{hLi@e: <wGLY | @ٙ]kcZ,v3jF&dM1kjH^][2Mj+y5ho/o!]Ԕ:cj81P' A3δ{+cqAC/meg Y`bƿK}ߒ,jTHN% t7 aQɹ{N"yt9e_ NĘPfKKvOzH t m1G7;Ǖů(4T:JӽZ®?vEK&|ĝڣ01FXϥ? .V8i:c)U,* We%0-BC7imyp@֛}ø# {ݴ/{]][Vsޑ䥾%H=@KTGpJgl^\Pv[[Pxeee Gj`GIwR\mf c)^)$sp^O]z_Ct-07=HxFZ͍n:&=Ԩ>xjrgUӷ2akcu 35L a:$v>8[ԍ]NP2PWJ>6N:~yz.A$@wa!qUZ}r0cb1qJF/"2=pV,O%YUd57~YV[(T[kc4ƗǦi,Gfs$I8Yg>e Uc/ Z''N.7]D&՚ Z:Zy]=i[t~ UƮϰV64eu'E}EnK73.\E{udMF~$8Qt$oƶ@}7>α( uwB7S"mioYKr ODnXYh(;Ȑ]q-T6EBXehݠ@隂yi0^ֽL-5r)fsfhr1IaPIPhz[c#o aNs:ru5}Mծ[bL[w dy4 _}Ջ.G i52l[/&UC *H.>3&˚vdc mgY)!h o ek*"f+nܬ ]'*s8ŸAM]S( vx7_}xHf_+=|_dQZML1<(B6Ҟmcj<}ČKCբs qn{?{^,fKʗyY>eٓ ŐuRtR̤eCQY=j 4?QdxNl6D0}(|\+CdKd+.[21S*k[0QeaU84B!qr fo;\' >Cuy$Ħ9Emg+O'7z! M_ ˖x /T_cbӥʩ!x_l2L3{ArAcsnjອgDj_3LL |p;OIzoT3 6?ZT6z#tW4%T ؋N^od+TJ6jt? OP) GˑNSww \;,HwhOyx<#?|}ƁuwӄWrщ=Gqe)ѣCZ^MU%Ɠ?Ag]ǪOLv_ȴFKV,d/g\"HYgh2'-s?Θ%zahd!U.+F5gu( ,SUB;y^/,Frg҆ >3tCVT) U1(YT* 6''l5Sl}ҰuʛMmEH'(#b؋g%3| n^:4D d 1}t4t$ޥa1?jPM%xMOg#d-;nZ)P@8iQCz+mhԎo9(MA)Sϝ&XS̱h;y0垢?ek:}!,>v`}}ߕ'L]ӈUf z_И |X D4+Ċ1fX#|0/,ۚ=1WTDLw{K"yYM,a҄䏢Տsc94\jdlvSݑyXBXƣ+96;)EU=;63&JяMB䲜# ˰ʼnj61;mcP3BŌ,sfǁuvf64ry))3uY֟Df\Ykrв |X%@&0L^D>vGg(!/#KY7*TDCZ3ʲGlrA/4 \KJ7mmsyXktRI%ΞPoC DN~#/2m~˃a(~POفn^O+zۻS[2<>n҆ٚ1rxTQfڸVxekiQ&Lu*L&`uz;Ƥ¹5xYn o1zt>d i ¥&W2OLpZF+kUTgɇrLƩjC0Z9O<_3V _L^Z9\YsJSYTC@3;-`-E `h<|TT57^)91vcZ:4FήZܾqe#(LG6VB' &x+a2Ӧ>L&<45Wƫv%afZ3`T&_ǧz=`6|{[UXTQnXqMQj\iE+k=ͅHw9 y}|$G07:Oa5&w׆1Qb`{{tWh#y& b8>"\T@v&Wk!aZP$[dK |ReKQdb0??)V7 eCkjٟ(O^r"P3Ot1mREjl;>’U4k"mӬ 5bt d|fZcr '?$),)1x*ŗA+W§ Vsk<2vf!ZZk;fRC<˂JG1ιgtuJyk=ŧyʹ)/-YuXJl~`oӡp!J(El;WN,Aj`w{\} l僣 !EU 0׌A^ GT @:jW ]I.J7|u:ds!El F]Tq6.H#П|v쾁WV5$SY87+) ـ;``K;Ӱ1Č}7PS2Ӈ|nCF4cB<"[',=Xx>֥{_v_F8u .m!YvYBp~HJV3u`tQ0_ dFBJUlZkcCO*8-9ThG2!I՘N~Ԝ6F}{vBMbFݠ04rbQ 1%9NH~ YdҜk,BE} u4@[n*Ű#nXsjKjR܉T9h:a'wKET亱Lcj?p|D0&hI ?3%KwGs8')օGWFll9xՐꬣrVrpUF US[,˱Ńn0ӓ([#oݽkd٥яMl5KmIFk?¼k=A51:ƄN͸. g׾fԽHPyU"xpKFB o)a1_RP$ψxg v.ȡyljeEIFP0kM;Y6=TNEOl bPl96|&Cԕu9uх<|#k ǻ4JU3PٷxySQVTAMMλRf39|bGpEk,$Q%PMe\{c3X2 Ί}p ||bW:^Q~`5wb|[_* 57NhmDksQF!c^i+N8o% jm".%X,= ;'0<#ݰ!l18*gY{,2RF[Gn[゜'|"1yV2 _vQ3c-Ӈ}s'0-KVa3(ދCGzPmE]VRrӱ[åZ"k3Yw~jy'hsD(w>QI*% nStܮI0e7EbZAⴗ*S݃M) }Vk\@Kw{Dڗ6P,n~^:w؄$%u*l|bT*6n596He+θvR̬[\Gɋ!-Y} OY-G~m2J0ȢJC]-,# h.pFb ߈v ⡶qۆЭI.ֆ,ƭpTҒ72 oړ/ 0fܷxE|`:8z;gZ&/)ȃyQfl/T;P|Q0ty|ճG.NH^R\Q1دd7(T' Ɔa6˻s\7FlN;+Ql.68e9l:GKAm wbCX0Jί&$he#x;i>,'|> X ㈼ ߅D<$@N{r{o'>n> bb2j:j nX/`׎y.(wDmF(ɡ̣H+m5Ԏ/GT6o֟J"w)AG=k}7}jEiwl85,G qǫ^ϳ@2dZdWYcx@[BsRvaKL*ZkXBƿDOUjqq0ѥCӷRfpo0nQBx]YRZel ȘQ8;\;0Dz<{DU^4cKR>\Qd!aoy= EݷxY+pn?.vh{⯓7*׌g)6Y?nWSyTH¶do蘝:M{S/x\\޵^3jTalp:rc4a iIߜTihԒrf"Š,Oؕ u k)5YV*IiAk-QRN(IJ}E ˏl52+]]#pnՁ*w18Q1lszd{HG(A{|Bs]y1&?tHQ&܆;P/Q&,f4=ʕ-ƅv@Wl?=n!TЩVX{E 8R9|'ڞ!7Pt~}Q/g)l5 OEਲ਼к=-h "BqüU#ג)5l=i,ۖ2%czE~#]ްP(lћsx28H e/`.# "7Ʀр X)YYc: 81]7"BVޓ/0sR aOTJRݝ( n{M΍Ag|15V'<5oKQ?(ϱ)_&.r |+Jb6 r$RDtIvD>Nx_MStO _x^d=+pBtm]؃@KW~KZUkL}%Gly1ϧ[c y0غ*Ur{)ZCw7F inʫV_H@m 9ܲJ |fG@څ6Qt|B+,g֋V5) dgȲ],. ӈ RGR/ /I\B27 k*Ey}(1#nkVJd7!!+]S(6eؽJ 9c< 8/ _b**3 C# h4]6kxE'j8lG3PK`h? r4mܱ d 'æW'@<THhl.nNO+?8,:Qjg+Qړ7:kzV{VFdT{ac3G: Ʌ'jolzb՛է轗6u(NESl.]TRK돫x[ɘ'ghŔ1sgV+xU5]+zH#R4b^_KfVjԦ  [2MAkV>&88ݎ$6\ v0ۮ#g[FtCAU;W- - T&W[ϕ)2(u %h\^\ Z{. KM^Hkvۓ6EyԔվ!R]ijgNƂ`xoi4$X_W:ω܁'9,?^ Ża%)xw($[eѤ܇n :bh} uڏAjBM`w鈧VJVW](pDlQb npP#5~aFģ澖7BqM͗)ϱ?OS^3[覎@P: OFsZ2;?z9|ۑᗮ7-+DT҉hWELݟd^kl5ȼ@ݳ@c٧<'Fw3tNVF e)~G{ڧ4[4#4%"ce]^TO[$)9FDk&}E0wޓp{g yzqjEtJ.?m!Va8E*ӆ8FX #Uhm4]#fHHlYW0ϐPee}l S7E6dkjIF@qi;e`r4_¾YԐkItQe/+Y=>?#/@@lq@Ud@W{ckkޥF{E/ "v&p1<*@X3R xz ߿6jN)P|#$=m!:LʇNА٘*u9Y" ˟ nò1N8P_0@F(i>;P1r?.Y@eW~Z[Z{ǿw% ?R?'9kSjUnp_AIiFXs-upfq m~4ADj/S 8Y4Rsx }`&g_W!^{{Pg I/XXe@9P@PP GBN{)oe3M h8U\X;e%o#dDa6'ߩ,]lD8cN-TUPnf_aH*9=ӬLd5e秈C ״E? '1cAp\E{ŶI ^AQ9O#y"R̘~#?o~ η e#-Cktl(Ajd3:=#R. EB(*4wFq7;K5BX$ks r,n>3MJ x I/$R)(i漏cƣrXBH! h9<P$[몠 Y(@~vEQpX >tN-|-j:j jH5īd>5@I-e.ï1Ctcn&E^>+&#zK qH, \WXp ^\:i& O+Xh-IvqMvC+A|ͩ/Խ +s6:ۈ| < T (J4xthn֏*>R|#p+LW'&ToV%hX(ƭ X6= $nC7%fn×P߾0A`6[C0rn_Smq?FNUo/`vLB^:G6&3>+,ZYyTR2g$${ [:pVJ] ~OZ.?y:jh+ބrygGtfw[PtvR0^.*85]"˙>U_c uyD6i7(Yfno." p\ɘg>Z1/=RR.ѕC3&C)T%W.."RF`ͷ"lz|+|dEtY30KAȣ%R _N+qe۪&s;7YL[2b`_iK u2ZYOmcH7pN6Yj!:ktпi,Dɚn{D|N]DjJwdQ5A03CbMDZRF%eq2||#w!cPE"w0W8pg= ީ-`ؿ Ηv>U Z c."קdE`1gP]{ =] K dƢ\wk|D*db[WhEҎ9Hy*wċ͚`v +0I3O!YLYpۑ2#Ad1Wt4]RW[@7] i(1lY`0ޮuwZHnzh :na:zi$hsj(ce ة_ߙHYc _FM&:Cw$ uUjI3b\H)`WoP~ @aLLwzKxj tP-[/ '!x؟N+yhMq~2V@vM;ZY9 %“t 76x'ҡxd,5偨oG3=0SU#X|fHo`K?*s^K%'?aJwn:3)a&i*2 ZLov^(YQ8I]1r%+|QP.,{`e4',!11d_?.5Xs=84`fQٜ0j(bOӅnlLz  ʥa]}կ6£\+m[js6vi,>FW&ixwxiy+ "9TmZ̆-M,e'R)~삺 endstream endobj 152 0 obj << /Length1 1778 /Length2 13664 /Length3 0 /Length 14801 /Filter /FlateDecode >> stream xڵeTۺ=wwwA  E{q-^ܽ@q/R }gޯ`_kVRiHX8dVvA&Ϣr:8YٹQhiA@X  Uskk; -@9:-fej.3˫^S=m!jp'[hnbk-XY*F`Y,Z =&@NCU[M"- PђtrښZ~k[1T^IWђW` b?f{:?Z:;@o 8 Z@XXOl x}:@ xb W?{P1]@d5^ip _m.*)6` BWl/ݿ\P{tIוyc@߸e;]l\ .X؁Lglٔ%Tde4X^fQvxe  ! ` Buj?Iۼqpdm`law WG6m+HA_M(Y v 0f/1s1ڹ|m,Aoqvz`acyQA /$v: gl Y8@^@)G/YW;;=3 hocLJlEdf1+@[ف^/d{ϵ`C^hn xr^IǼ&$'O%6w[8yx@gg' 8yxry%+pt,Ql%/M/q,9lA. ?5777 ` oFI?5ք8;؂tm,^?" 8xwՀ?Goْ,ܼ.n^_:#{o@ sysae~2Ǖz2&I?oR 2:( %hCZL\[oH0d$FsuX2;pOg&Gڻ?rL2*o]Ƀw/huX" Y쀆{%g᏾Cp٫4B"QJb5L[Cx=K BTj6n;N̿(My nTgJZtD\l{+‘餜YKÏfw s3[a}nFtI/]8g9c1bKYՠ09 >um47xQ)"C>0$h!0D U [Y2~{%u^N.73+ՠB׀Eq8L+UwLe4Hqb]{2E~/Uʃ:bDTK%NJDzԍW]ZZ1\ѩsvGٖ}!a GsDc<T〮e/R~tH7#1p igP޸b1 AY1_ -uT>YE7edD'fb[S50pA_5>D Axli;$u{k$'Ί0p+E.P2QT|s6P 2"b߇ R|1FaVRfdHp^%"y lͅaO`@ǿ{Pb} d+Gб0+0 fr0{7n-_`αUpm{G!Q.n[V5$3SlxXPN+Ļa!;R0yq\%6VWvz^%q^N)lvZ 4M~y? W*_V3N]\:F<e@bu[b;w4o*@%| iW'f_*d({tSzK^a2tYEEE3 Q&fLKJg.<) 񤎝[vs$WOY;Ry?{iM ~*Zw{7OgU~Vѝkm34^:FQ>/c)nП@ntOWpIUw7a.D, !ޔG8'92r&Lz;!Hx =G5QjIz&O>3J,k `nGXA/!s!XZG⮠@+E4>"װ~Df ``tVG\纰B/p8J-wvZ!Y^? o/K?5~ e PmPOaPC)CL2ޱUSUEЕDnZ9L$(4,| Qb>nBGR%V2[°Q?15HmzA`|0|kdA PtGn/ŕ\9TsJ5U/ț(w'h*EyJ)8w̄țXƴl↷=]"n6,J;O}bW_*}qa9Oo:R\ :kIh&?Xkt5]QBr n\qfIX}*:ɉ5`?=sQkξK&Z2 XrlFdWЃEH(ee,5=KT5KTciUϵGwAV޲`^Γ[0yOr`2_ݞn+]1cj sQDڡ ڵ4\:ф*ף""aVL0J8yŶq!#&8b4@"QSe5C@S`UF*ֈK@+7%3}yg1[Gl,i8Ռ[xc Z[& ^!UZ\J9tyܥձ}{, x \脠9ni 5AAnR8Qg#txn"|o[e#?wirOR!|.~-57M8t+׵jtMoPLjSyN{lNH$2ϵ#Pti xP*pB=&">em_!p8RղOߗuש S_7}kM\\(M?~U͖CLVX&85`0X5gY<9gzΩqL#v2'zZoj0 !#{9=+23;2[ᱰa6#3[jx=̺tc (x&.~砞a(7JAC|D ro).ѠwPa1-ɳT\Hwʙ#osw9E4ɮCaq|hcUyНشRRue Am'g$ &eɚK%, Sbr3)ux6}QgS{V$ 5g"t,V%t5ݦe$"`{k ^]Y^e_2؇jT?Fy xtpIF0 Q `^|+: Qg+ 2ƪ*Qo8BK+ܡ@Ab~yēGov`"v ?qj-AR`n4M<䍊DފdJ8Bw*y#ڡC4)*~CA*<- )}7)hz#bOe'ʎgOx6#>K2ܾ {/(a>5FXRfͯ/m9Έ,=y.ȜFgFVӻaEMިvǜ*m o2'i1[m׊rĆוkjǒrWrG;싾\l0>B y4gC&kw<  _#*ꒅR_֟jJg|r2 ݥܑ {T;?&g rB4>L{#ng^i uw6yZJ끡oz4ijUE4W+o Jak'?0#|}RɐaW'>st\,S[X$&~? fNӞ Me+0uOz;` AcY"~q8؊G//౹Dwa1-엋XvUFWpV/0,,q {1I0vH_ˢ쥓qi6U<{lcC}睇"XLY  -`-~yq+`:tyjTys7 o!Y9o'!hvF) iԲ )ۓ>;-q|7M4ܸƁ"T"'EJF)q׎{i qw#k>4T%'QM4V+{`?dt))ks%\|6o. MD 7WRklI3[G-2IFVS32#"6DQJZS(Gƶ뷷{HQV57[,,:r;O5b?R!w=f~ww1RNq_[zҿ#l 7{#SY%k*ck,`Cz9Mva d-}['RgpcԔqmSPe7|~b2&??f-YajZ6Ojc%z|.TU#.ىrM. eat'f_3b: EtMrZv\ >c?%y\c##x[K;Dt @)r JNWνKV\ PÃ| NjEc)ȕ ? 5 \3}!&[Fyc',3:]j#  wKL|s pc|ӡdC)/>Xs{jBe4yx5Tp/Rr39r`'7ȹp&u+>t#?,VIUt vM:3j癲~tFА>jATYO{ݽPpf={fYkN kpQ+i9+'robnh'd͍00f^+*}qN>v'Z&SU>N, ze`ƾSDz \j'J4'w =G]Tz OfÎ2rP@jwU1O.E)CRQpuceSi̥p䘵]'z뮜jhL$kFZ량uB"mن-J=Oy !3_!?oh|˽ё>*L\l*ิf x\Q40j6ks:#$"P ݇"^y>X)"JjI0w%(f2A_=pϏQ/sZ1svQ:H5T3oP$b+0)C4(-ubg? {Ԃp"l_Q? D<E9 ~\!uEBtG|=, kJ SQ'ytrd4 *dӤlIu哄cX{@7V2TfVjczo`Ħz4AG( ˒b^IZO5ugwBL \.]d|U-}P0yL{& 1IOߑXt* ~U e0eO?$H+iϬ) 7?(oMС+%k>}3d+_Y'eYgɞmx|7}CMwRV/ǸDɘݡByҺWFeN0kž`v) RI۳L]_Q ϬmVb*7Pq U( a&X?~0} 0p&R@>igK RãD}Xw#CJ=⹑?BES4TЙQOTuƜ::L{c_|(qSfUu"U@UaNTNca ,[`>ڳ(1#(|u(r9RtUSi<𕥾# `!KšbrzgBo`q{cʘ{UBQFy}Y[~4܇Z N_ﰺL4$cÅMɏAT 0⤆fd^h?%7 BAc*QQg5ɑLJ1xmcĻb.\~N뇃ζJjYS?gM̉ [>eb9F'h:!F# Y{8OԬxP׋*L8Zd൚9/K(TwKxwd:a.2(Bˠ|KT/r.]d N#T,IӉy.dgN! FWM#Q'|pמD94+,f#CACylfO懚ޮ»úKٷ1YAHA|GPR_xt{<R:;ԛ'KyelndbȨQ'Ӄ69~id< {=ۯV",*I iEm4QǫM$_h7دnq1yqFr[Yc-<,$dN;c4w{>e@sLoe({. jRmr ڲ845O2|kkAy~ZlEU\ogQnѬ/Ȩ0SxtD}[ĄyX`{yՍ7poZX% ?aצR0c(cQLREڢzVtiގoǑ26fkɹ`P͂J.N_:7sAP7̰^EbW% rZ~9409yL֠/QA@@oeO[9ag 1eK9)$dE7/B{!W y$GNar#|'Ǫlo3F1BqQS\pu&dB97O|^ ꨖ1Y:l,|n+и{~&hº\82)1$($HRqy*<|}_[/#اo*"I{?!:eP`_;Mgr__6xt9hjBѠ%Gϡ<'7PyZ R>1)u Mtp T:4 %HApT`52%LS U>-]sd9Y9jVw^)>jg BX~u,%<Χ k%V3wn)D,禿Ep Qc˖BJ SK`;my +>@j: z5>\F}Ʈ'K 1\d*hk!$ہloκU9E <`TY>gM,úȥn@~eV'eλ :Oi=߬P8lT~5syCnaj. u׈* p^?L}T bu5Ugo~bU8*CWZW];FOѧ35="5O&\xf3p‡ӿZ,Ơt7NX\h1vi?*s:%*%er|Sόs6kqغ{*gK(vOx}5zONb5bP?'X媜f!CSOgx^d6Llٸ{t~WpEbWʞ'mu7Fuw[t|d>|r* rZGF=![|D9M& k0]M|J6y*5EhtYU& A~HgLIF?+ M-ΛG42l.I}Z蛭m G(Gg1׼<3c*z~˕4}Ҿ7Z뻉P#} +{Cv:&U V%Q=]&5U:;C-|\ivMgqUE13o1Pv IsDL͒V>g^hS~^$1:u. o8W:?p{K0ԏaVz v]boC%'h;C7w|$ݾŅyQ8>؞5R~х_^~ 5OtDH52B DЦ$3gUtZ~64RuFn=5tp;ւGT~gw`Q&^cu(Qnt@y%;X XAAmgPgĀ`R:$2lf\qX{1Q~DaG16i]t N'9ښ۟;O<'Nl>0N{1FD^xi24wθ!DYuNѫ"4JyLRZo=GPh d6[ 50­)P i5*>6b,2?ԓ:0soףah 3w O|A&=NUfsI?ns.8(h2̞Wr7cG=&$ƮCѧTȮ?.誷B.&jŪǭ˱iлFϒ~vh -r80Xnv!W q$rc>>UW!2Pu@蛖#^T>w:ۉsSbswiaV2< rbb[B>}k /Cl]K;+u-F?*Ej?;<\Q,EaP;ű)Zj η!؆}N!tJd%wA\U`_fED=b!E ;nl!̴"H37ˍ4>{nlg`|憎݀ƃ,uvRQ=zzF5!zLtFNfsyYD8["<- 挢&t&yDPLrU^Rğv f9uAew$/Ϲ!%+Q7zIbኾp&[ KkӄWaϭ@x]T+q Ӌ7f+i!NP#b-5ܹ"ZXat}Iޱ$"x3T6li> #~vL  ϼf^˽+c̦]J>svGuhYC/aܗ1xUE.(a#EpgOY?n"qӾ |xtB'dBsҢhQge M$%j>8΃"3ϸL}gkိVϥ ,- נ^eH ᨗ"BGP\pL~> stream x[[s8~ׯ&5e~-_$U̬Lh#)2~),EٝIL$Fw$2-cR4IAQ3 =3Y`̚0P9myTr;TdA(j4,FA0K!3t`n`$=ͤ(]TJ@4 [ޣg{=(@m;#T1e@Y1DQKz#{Urt+fF@@)Xfv M0GQn MX"9nhOP<9:x۬Q{eAT*4sBz@N)48 I!E:"2/ A{ \0q0 9m"^H$hN!hHM`'j'Il 5%e $C%=`$%ґdT"$qiHTL)T@M9{R8rz!vH(3ƏQ'u1I&mh5.BR0WL(RRQRRrFɌavԽ<]ۣZQ{vͦ뮫9sJ>SSrE5%cJ0* oxlOf3E{ڽO]yG:54v~5\w]I1t:;MRي&:+TAm°-noC|ޕ,xuP`m;bp4}O=={6'_ //'b2apUâ&)F^xȺF~_T욵TΫb2+6fcoaqbSPLa˛w'}#gJ0a(Knf!1 mHyRP,0>dzi=:{euVTi,=_wg=8e'B"L&~m6Dgg;gHԣ 1= B3SHflFYUtO!YЛAEfS'3D~#H(t5Rg(inGju>SFe4I)qtpf) r8dY"٪k>SkFt !Kk Lhp}74Y1]O.r~:*l6UVV: [^>`5EQx=F`⨇=gFвBdh':JP 9 ۊu!5qqoN)J*HJ7N>h~"U%ىY$cl&bV0^*^m;Y(Q }e^RNUÊGWউflzYVyq~CX+)+ZƩ4!WE>x3oaTͰmDlۡkv؂(yP|Z'UBJH(#_e^LP.]誨/>W㝽r|5e^11,݀st6$cgm0f 4SN4D렌=7*|PjtM ?MF`oi}chq>nxv< 蚿OW[o~h[VAC>]naOXaO&4٭FxE)V,0u ^ <ہ/*5|__Wq~Q3KFXX-ThjGŸC2$!JޢQbtq9M5iq3lLh\(XaJ u6 [_he栵_ : Z.~ h3-ʁѠHC˾cк[{eK2߂T)~]x`hΜNM uJ}|;4sᱝ1n%t@辑&Haص.\bWoe\ͤmCWέ>+|E  }\6mu. ,c!iQe8;+.3^qrˏEqT|.WY T;}! dzsX#BHFsUn빼Desyד} @e4}Dg.-MPBDI~(LBdyDSRShf3նE붋:p1Җ(6i߷ $Jf ~\YG#}0@>ujX'ASXEo]:K;$fWSIJh#{M* 2jߒ^α-DCJo$o[ Ujõӥi7CCJ@-4~hQ1 K'*!RI-6O|\\P7NcYd~*)6dƦ7i}5ibYif$ezڔ]pZ'IOcjǟ\kYQ9[.齌2ХΓB@8B_C3!Ѷm;xuh,}-m.:k-D >UĠy؞TeLmz>AqcdT%]Y&$@w%$n8ÄĴL)[)  4e x5Ƶ Ef/Ѹ4ҾM5}7o%IlLfi^kMyT)KڿDttHmGSۖ!ɒ469;Sjx < m͎Iu`1,|zKJvgWcC!L2-L4M H$- WW3tq~vs޼XY탵ıퟖ+ c{|H[ =x#??Ni뷘\Q{6*償e^|c~G ~^*~/\_ &/yt*5 _ըO?IPg+rYf.2ep:R[Ŧ&W?:<#|rz8MGEbe+?`Uq^m}VTr!'^}2:d+ j"B="Pzח7c6؆eUlԑpy勽^! b稸IQ>ޡj5 } k j;X?iFx\ zE7d=&M1넙W&ըYj]zV+2Mђ~1~ۗ)}۞g2kDZC$ p8]v'?[(y endstream endobj 154 0 obj << /Length1 1801 /Length2 25378 /Length3 0 /Length 26502 /Filter /FlateDecode >> stream xڴuT\ߒ>w%@pww8 4C.݂ww Asgsz9]Tyv>k&WQg5w0J9\Y & gv6f1;seS;k'W Z 4qvI]f.p0 Fs'@bdЙ#8808 Kk" roh15dcQd(9+t )`4%jʚ*,]U4@BTICbHkkjA[24;+JjjH}; v?jy ?C-$Y8򳲺X:8-YO@;?ĸt+߅(XA )ߩ|]_aDi/w3X8UPQQ؛X\ ٻ3hNqW0o6_.] }MsL@^~l3"v;]3k?:EQ%Y)Iu f1+:bqpo K; _JͿem4TG-)#? 3sk%`x"777́t 8,W#U$Vx#``7jo{$͉߱៖gkGVw;_hg{Ww}_ g -&N3fo=f fBlRJ$ `XN+pt`3ډ%r)2i;(KPؽ$UNޚ)Jhhe*.uRsd&4GڻrLa\Pα7a0= ;: ]`ǘ.39taB ?Rl86]Ήv~*8BFC.rB@TQa}9|Ao+p +wŹL_au(kq!jU[Һc8P~4LwG@Rh],gO\jݑTݍcBFpZ“Dk[<܊I&mLcä;r[#+۳\Ydrz5:ν͸nhSYԲvᬔ*3s+Wɪ)srDA0B UM%TIQJhy &fl?p$ vrŽ4t5Sz&sUt^ h!#`g Q2Ott:)c(;تU:]H]#Wg?`ʐFd p+*|8!'emگ IoU~ԁX{wm41̧M3h{b=P-p!^uʍjq̯SEмsʹͧãd UE)93Na%a1·]]G :"@~rN?SJw'BMbX2aj,װ coL |]_WeK#ExH vUd4֘Cs(8q|XYωhe}jʓvxAzצ큣2aێ:=/sMnM T(rc/tpB)[OU` s]9`oReW>+ ȷ.>Ml1,$3"ve|/gu,ɑ.+F@A4!.|?k67QJzE8Fڰ;dtK5㩥:g+E.̉nlA&,Hn&~VO|ֆDOb5{#@JmhD`k`oɴ*O˟2@3KK|bN7 h-&[洇A(e'R ifJUb[,J:(Ziػqzϰ8!2h8| 8fӌ]QXM Syj͛$irw8~𧖪@,ΧHnM.hro;L0mH]ec _Hdr)&mi8Ʀ{ՔT6LQ bZ%|%WnHاbYh'*b7{(GA%4#=ϵYNS+{ά]>A_Cf0}f{2C/~8om10$ =T<3|ÂI뱿.kz4 G(k":u)`M/ >#"pcVPۭgw{7"d}ڦ¢?,YvJ˫]QK<7NvT~:0bf'>Dl\iVjI8 m7a._'8(Nј&rZi:o33UHc.Dd׬#|6sQ<$劘 )w5 ୆V;`zﶮpB~QA8%eh?:0VeH,eg-͙b F&KOŮ?b~$ӟ}JC"?5&5ui:(_骣ПnrbA//|ڹY@A[AK cTrYt/uq$Tqeeӑ/IU!:l66qIq$'`ןgRi[Ͷz/{f5\Ҫ\={+ȗQkPbq>,8dt2o~Xm H`myAw^ &_VJvGD>^x;q* ]{_Z+PD?#1Um2({'>V%GbAqwn`՟0p# |ʈς>O+u?Іg\`HfYR+slH 4E Xqo1\&?Fsy@ O JLZFOS d[~&"D}d1w>0!m))|B%bǝ?Vg>Bx`c:蘧lx "M4&ā4blY,p% #Lb`FYHCj"vX/v=$â*0@.ܠ PMpbNNh]!IQȴp28sB,+D-WH0! K怪:(QB{K8wiF/٤;ƣʩ(@CEu]wba?Rߖl n/f!/.8ZR{_}af]Y(X!qpљpLv_Jߩr'b"Th `M:$@~^ HB[ 'GhWɾT> .]A t"ˁq;loᯨݟJQ7!agAؑNb2PByHCȥw{euh$Q{AM{5Mu".d4!ΐ0'<jC({ ɉBk*hDi&v:@:uWxF1bl!ƳzCɌb/,;iwY H5%i7_ݦ-(ザp:۠ySu%P_jbk|K*جFV'z3Ƹ bz -Y\V`.+:Mjx-y&Kg,(궺2+~ ^AMe߲ף}](jf~d:WT0,kjZ< z{ANu]ۭ9hC󩆍_f5؈Gb釬'N^6qf #+.TԂ̆!}>ZLn~!hKc Pm"tr4gg;vx%k)Jp^1~Z"RރB<ܞ\NHo 0e-Z,胰"?<# }iύ9i(As(MeqݤjCOƄXWW"7|}A ޛ)|dtBz}?_{(  =ޮgk Lh {-W]{#=i-ϠT_l7[Q⟧[vn#]`({ EGTF{٭.!9[ב'bpZde`!.W~^x;ڽEjxuoNlNi{cUChw-bQ/q ?_ikJ=6Qk\[Sv}9p2drj/-]wh^ ?G6K<Ʊoq907D7 {[yz_jF_"5hDI&zE 1#zaLaD|x|WG}5>ؽAB*aڻ-!m<"SF*g=6Ng?u3#J/`vho`f4 mAt2` (`w8<\ v@eA6[. J=[]Ņ|$qKp;KgM\ycOA㒙M[%_$ǰ_=vXuMuWdldrޠ~0+Ae/D.$;MђW,+Ojf*uPᡆLaߤoǗɁԴI|l '#z /Jp3g'X4Qr;}X(iߍ|x˧|)cH}f+ ~N`>㊘Pvp:MW9LjY~on |91ܓӧ 0֨ՔP&}u}r)( O+jCֹx.ӡmV.%>BU٭cѥ؁i"h[d qMoרG'[obWzc@{5#~a?/q? wSqzG ?.rdT l"mq1=vP7=LPO'ny* `btpitq amb vŷ0<0U6&ĒI -w$b|;X zCbP \>$m4˰?O3*U~bFSbP=P@BCrʑ'$jf,q9x/O(`V)"(nJ&E!_,8WM 57B_IJ:(˿S^VIKRqlhr{x1F7zcKU˳|ZȼKjH3J'/°p0 pu ,Fq7ڹnQ!=_Wq~";F=f n%# [>x>tibR6`ցBj0_&lP )kr$2L>}AhKJ NQCވFZQ&WF3ٜeuwFFB.n = <{c)SĂr5݈_NKθ~u!SUtWC&K22gWQ^}$Y>r/Kƫ~???3jWY^EU$AKZ2WH]O;no z}vٛ$3GX}5 kv/6B^p#),n!EܜpncȊv]T +؁ѪiD :{ sQqaN1n%t $}2M I4Hmj]HW|ߪTHN2?T&]̥ڌm5D_%JŔ6$^7~4u*M8ϟjɔV+YIӪAu>+,ZNW=~nk1/<n7,%ϟI]l=Oǘ;dCDiϹS>UrWT]حY18 —. ^BRAlK9gWa/etlN(`+@~]r\: HdZǫS.P[Asqqbg~2ߦexՄN}_߂t?G8Sڨs^@1vTM.bå!-a-&ܒNjT2=GᲧ(4GL'3* '[EkJQxTǡoe| ?1~^ZӀ}gLY$#,Ÿjd*ȨL=OO- *_;<-Px}oSP]˿iմč~Jfӎ_Eh113\nt=,gS\Їo;8Bt?}{ңH0wW_f'(abxOKbdFס]HG3t̡WS ah"ȄsN" ]tn晄 ը3N'}J,JSsv1Խfhj#"u4خ}/Qv qNq<+=[Vlr\:nB\>qlj{›2~XU ;3B[I=amK|q^s**| cVOu>+ k\(Rϳ.A܂fpՇ9CMɏC'1)a{537Vs"#q0~֦͚*+)oIQa*XwȲ> g?d۶Nqb ЂQ9J3(@)bm8Y#ىcDe=%L%:,_z$?]60N%7ҸxVa!< R[O&$ZbUYB> n<錩yxca :WE\֤Q p qv=3˄TkOI`Ixnfύt?^yy!.`ׅha i=iz a HbŪϭdUA)B <6K=8f Q%4isu>IrX&xc;AvTI?u!³9E6`nU@2{a䔻;4uQghG;eݪ0R 46kI'`CB9$ZD)o6`QZ@0:t]#DFɖ!FD1M_j- h<֦nW7T ArqzMY5a٥BEꧼrq/:?ey/:'/D-Ġ-U\y{`Va-xI`104A{lsh&a2Y FCz0ep={^$ >(ws3'W0Y]5Q2_^='~fj B逷x(xYڅBxSo>Q ,as }K /Tdn8R]GSCoH~Lǀ[xŞ륬5dD][y/,~) ]TTey͝/*q(i|u įwpafX]=!WQ d۶V/[TeHcOm W`ƢlcJ7^ \2ҔXtO,w]A8{|=# :j\96ϚQ%!y&xY:0`\i1C&V'$V`ez -^{5t|U_QdH=+ >9ZWLw %w7Cr*qI&׈#2Py5Ql8u8isb@!B g9w(QW r03P0>B'hzC8ls{ k!n*<h uk՞Zfn*;쇩:B3s.w\yBR.no;f%;APA p9=s1c}Bap8l5r%r/ ?FZ%,F]=6.tEr! ԻY32Єے%ںHo_0}{XC { m7$zڦRA=UzI@v10Ċk,#K.RIZf"3{y"p^l*Ҳm.ce}D42gɇU^md Myse CPpWĭ&ۭ|l̞.:RLUO P 3i/ 驃!_?I=n_ڑQ|0  QC]d_)kQ'SKJ)`m|g_xI5ЮˡcNҨz68F/(xqŠ47ZKkݑlS(fE ]?)t)pKz F&}2 ޒd(!}k"AZEc֢Qdt Cc{Y θ^W ,1PalVHH dE=,U\ @ K L8hzZyjܒڪ@`>&Mg?uS4NK0j`Fz%"}'{*^@t8i{ 8m9j ' n6Ufӑ/woѝ`3jG$͎jŧ>HBŲ$'!ί(%KZ!@5'$󘟔XUG:^7'ta HTLm5ǬǗ^&$^fg40"YyK65ǔJ럦.׼QYx'/Z"F96 M89~!$z&v}BZPߢ8T& T1q`D(vd/wAz]ҚbQOJ%]7a쵐ӭEu9LeZ~-jA&ei}jmȵj`W.H%uEZC*c/a͵{5 1|I5z}ςLzHкnތ5>7ϛVm <%JN|w)GXfH:I%NZĀ,cy)Ѧ=UJD>.DiPY]gXV.^Qv~&?,W9tʌeTF߽$Dڴ2uy ')P="/IӢX{ ]tӱ ke:׼G伾gIr)w9P=hGg&1{= ||S晦ϩ'[)Se$hLm^A}=p(\?;!?R7Ř*b'>^r#ҭd_iɊ.Io,q*m5[eb3RK$FBYA:<KX @։;-~m} v{z .* KiND#ٸu UE/ZWT biQ{kYx?&'.km LdY7"o}60REJ&W{ :&*Q)Ux*$Z?}LY8O=^wR/UU j3Bj.=Q!-ϝ'Oi CARmZfRU_Cl#:=Ύ=,Z}LcXz яzM)'I?5EĤʺJLxbD(,WO_?;]!xwa~{PP\.ٿ |:_Ƿt5v3b V~MjJ_0A !Utj;{/ ٌԱ5~D{ɤ>2 )aej"Us- ]o[4bvj9|=F Twcz6ѧO~E#/ґW ~X%h%G<k0% yDE+40U`T؎&lqR_- ZhӭqTpi ~86pf'8ږ~{aiB x(TFYԯr5U2^6t<<~n̗COF)Xёln "BA Ut^bt{qBT|-듛jxYSq%vw4Bl&y]#MF0-M%AF) ,!!T$ iɬ؏VtWai*v] Me IY?>٘kb <0ӿ$Fl|qSÏC1"a MFgAGܶv6xY f0,dx3*K$rVz4*iE`4,u҆ YY>OA&ʝUGP)cP=QhC'-"F"WpȎ*~Sv1^w2B%NCUKũ%#%L~!650u OzJIaٽRYg}s#>kEv3!N:c!Rɉ]Req=tُ}gfN:XBIIL(s֖CQ$ OA5;fILX|R3qPVN~ysz 2z(Yޮ)Q(%|}Tuy%ӛBHGrxm5.7V;+L|ߩ?F}͡9 9^ #|E3q>YMQDXIGqRXަL!LAҥc\Vg4ոLkԬ%V.%뮶 ֠jA7ImNi`Ѩ>2TuT;i2iR՜b~hko5{ #)}"׏f _eTݺ_ӗ#0׻:;\`/Jt"=lkh~nO39t{f&:Ԏ_:l@ |\NgܬEu% =>@ހ/{(\Y-[jjnvc7KuIpI#F?WY׉fj@ PBMԼ%l$"fStٳK:ŴY^e/=]k-Fuln333;GEEB.7Զ=%ZbY6Ɵd"pWM ]eLVUK1 .dP'qʄTo33+lh8Xcx4oSFKk*Zrwj->Τ A?r)$lD4 40/b1):-4ѱW}3!H[ۉs(*yz4䈰R'O˂&6*6#6@Qp5ʚlcdcm۶m۶mL[a/|yD1\!1ӥR6©NaɃXzȚgLO_l'F%-ߊۻ/).c/W݅oof P+DsP(,VԂ sIH "_}afzzjW䲧=+u-D%Cjj2HP cET>+ ;H2*}~{6AtWc6 `bwTxCwx+jmncX2,?y$ɱWvA8 |Lv2`T.4͝q"MS]A4sZD?*g2GF6ɛJh]eB(Wdg|obffx|Qf?S4k"cŸK$lm  W~B"-$3a*JggF{y/VH Tc_> ڱLS DjXLL퐠F@늨ᔹHUsFs'`: -?/C`~17JYgh ~il9li Tgb/0Zm"f꘸~ 8GLI8ېk ˬOjT3Mj+Sn#CMZSݬa"Mp wXND?k6ށ7uKtQ<*rvH^,i ]"s-IpB|SAʹWK1r+"ao>P%gH!Eh4Ao=EW.e gpǪ$A6ن%\+R.4^Ieϒ-j"T>bҒUL*=-C`[{T/'{gj CU6+dN΂MK-ɱG(v O/YPp:FgU)f"1GrTȆ `9Wxf}}{@a:̪}3wt9B^IH2 4I uO}v2/4u?fQ_pe `[6T(Pm\`$XR5dE*&olfS דYużL{ʹ}8")ˌrո<= *SWɳkyƞHevޮYP6-?9Uxײ_{6v)Bׄ+@)Wj\-T_SXEG|]xoPG4se0 ?xZCͿyˆȎKzN\,p8"4"mSk,1*&uGTCuzo2\VĬf]Ɵ iBLx7DdR|Z;ъ^2?2y6KObiWz9M?ᆚ 3ut?aVk!}:?L,bvjGv( 0ct;岡Wg' !LVfQ>.F9[kw؞"Ž_C|S>ʌ~qwUe#M h?+:>Hs}[oh+iOcǍUfpf%̀zSK`?xHG9Yw"F~+<8"yDKbц}ZDNZ%q.qNbRH=gJ$eU!оH8on!/%Af 57|yFwقnU"28;N%9KbTxfCHt uK5$j>G\D=ҹ8s$W@Ğxi$WGNT_i,nMMͦ/>vXZ'{LK0dk$N&k,2gtݼh枅w47lьu\BW󹐚w6hH3km̸S\ hl$6RMYo~@/Ĥ#͂4 %t~ڋɒdHG78_Bt} fҌ l.^qb-GXԒWN|甝 <7^ME~*,W1Yw5xȐق34tI_ku"&^^rG!cBSFRv91aAa0HмRN)A, KXVtea-TM3*ݑT@w̔!Re' lnO#՗U9e26'@-lMPث15X [{G-c!u:gGܙ @lB\`YPGd}NNF"=YwsIFyd⧾7h?Ħ*Er%82袷^'xN/c_B3u*&fy՘w{ c$ѧD6#n]}Eb.2Xt ád䳷Y4mժS;jr^(+S WBf̧}7>~rMQjyW l Taꪟ^fRN1,~K%QJ71Q %V`F,+˷gnF4|ɯ\VnHW$g "f7~j+@9] t- {_֚EQ^*ȝ(rfc3R)+1RZ706şQU+~v CԞ?4M|*ߍTQ{7(sń( 6]Ҋ2iîq þZ_q3 uN$Xa('Yx-ŭ;8!n~'cnjǁ`t"srSƒ 8cryIE$/RVnehi>_%^ o I j Ryw3xhhkuNo۔W(!zo(˻f( rSȵ,?#G xOr9%&/F߸&5SQ3[:*giy, c#/SkYI\̔% O7vK-,1δ86R"2٠r{opneHq=PX G:G## 5UQDG .}T(Bqў\lWN5s!'LN!Y9y\G~/%L%Zŏ̠cHrS4U } /Jm`;lI:ئ{OqRg fv!Fڜi})MI[sr̀"hT]XZ 2۫;,}PU3I :fU" ~P#lN\BZ_H8P_7Olj! gL#Dn~>CRewt7ձb4  3b~x0H&NlS}Nȡ\:ζQ7սP>bT|<e"Q?,A`MVhe]bntyM|5ёOPT/R8{>d 5N(gFdITX_fԯ1FwM 1:Xi(E^|0Y"bluA a}9@x 'XW=sm,gpJ[H;@Ã(D) prbtav8ҕnZ:Nͮ>tN3ԐMcr/C; hi u&ELiNTlbb+X]@RGq҇z원5$ ΄SЇ)~N<yi^ _-|(Nj|]۩HdBu:*gvO$+JE~ -O(d5!\jἏS?Y_6:y|n7vVcϿwmCf'mY.MY43uHS,]qT`0 f-o5s]*O`f +uE w,~d K9}N{=nI{$AOA 3jo"$wպg:JuD Ywזl&J(i+n|u҇{eӚԶ/a*6 bCe)-C Xv=>lna( fN!G|C#X(^ō6T`zqL][MKd-N}bB37X!u4Cv7tRÙ~q G"1LÑ'M]IG /ءX}Un{ Lq|S!.=O =_8qIfU:Sm( Nqϛn[_CI/YҵZܸJ{J "DEvsJt(C W%$-Q4 k@DmR&kruԽCx>Ul=Ɲ{5.G%\I=ɾxejUᆫkGsiy Ә75w":ޗ퓢NP0y?ؿ7Fc=*M߽}#a\-I)ά2O2XQD AG0i'EOtg xLg6lK ~MSrL*yc1 ݳ~WOT}̥ Aj+sšR^H{a 3[E!cؗaQEWH `ۉ#ߟ ;:&qY r#?^ES)ӕr=sHl;<<4/vŞV[G,jFb]M}9|Zw{ (vN+y>ٔk6jLkujxh*S)׻5 -e+syBWIAmѧL{؍,Zn,(p%KBv͏GYG/7%.is  :Rh 6[\6qT^l&{""21Wpa]܍b W''Vzԯkf] -`|h sF1ZV4ܓ{8.-.hd2^ւZ wmƹ`#*"yxhvR/Q,"ίY_U9c;Oh@=@f*EVWԓ+E2z" L( jKo;t.JPհ`Q\_Iﬕvu&HZI_HQ;fWwG><*(n1Hh@皩^)Qu' tPrG-"ѝ;o܆s핓'qdo+w3| -蕃ޟ27:A[4L3x&'_77\N6녆Jw Wخ˼? pWXi&CO S(`QeX1RVnBvϘF:m{p립bHj$t@vvqT_AIso"*-yW_G#%DC<> x,U<=N${SBh15.J]Џ7̖*g3!7CHwCz.wK{(AQ1̉/#.wR;]ԁEE6 1n7o2Q٥ RsJ7S8$0fx)8> f C!2_Fins+L5L ;u588=vH|/7!?A> 4U~ J=̴$ךl:Ģ:Gtcu8{ܸvKoUPL (Ԟh0>4⇌:U)'j\}e!Q [s%mv9?sc<, wUvXR[Gz9ϲZ[n> stream xڴxeT[ۺ6^\Cqwwww) ww+RSKqw/݋G}θ}\Y"W`3w4I;:214`6V&qG;s;3++' j tx\*foq.vVV>$* f4z@@M/'ve2 Kk[LL2gl=9@Y::LAV@; @ ҐRȨhj1%psrrt,Z2I1eM)H SߒfSO˟5  oho.Z:xxx0[]],§ie x8ޮ. ;_ĸ9jW?(Z?AҎ2ڿQw_`oDi/w2V@_{+` tuLҽA4Ho7tqǷ=c@7?e9:e,@Ѓ/&90)9|b^Vn'mH%P'iƓ)--pnĢ`7:K+r<ͬXkNqrtX ?k  t\]@~>406s}mWv9 G߿oHmEdĢ6 vՒvSڃhv[yy?b֞ sUkW3q/+m,@oKgٽ ہc0qrml@`0/荁Fi}e}]|ͭ,\ mع>loSlkB,o!'7W? ҟ.rsX%X$,R+pXW{ `1s{[54X!X@g`X8[ or;C|77_G?oŜ!a0כ7doz[{#?o-ZA.rϖ9Ȭ5\]mA:o7(]]= Xv!ۛo?=}8YLoef{[Ě,xB 2CZw4Ik /*c>++f)s_2o=H(%0QQjC.U(+s5?X6Vpb`E{zY[IZcG|]q쓯?7h]͇(ckv\ Zt}N-7)sz [,@U?MDvN;L'0 "."Uό"Rĝtqi|pd>;S?Usx`sOpJTb:zz^j7MݟV|;b*ΕmAa9dYHC`eKs2{4l0TĀc;i2"RIaL}v}^ st gēEdpgr204wIbRA~NG݋ԎJgS&$(18'+#=\܀ ;C/FMb8^AC^CKu"l 7,/,pk]{Q[ .E8'lɇI2-knSy {nde/n>,*(E~*ũgS77{wOߢ "ld ߱0g}˖4 ۧQO(E }I: ʓ'\RaT(GlݤMH %yWJoDHz-}}lzE˨N&dpq2Ri>~gIN`D:2wƃz;y472fFhYÅz0622" cUOAf=T;wwQPo&1GU=xkr 3SLl=SGl{aYJ Ҝ/#vG&+rmd @>me̦KO ) `]/,:b7@4{A7\ܬr#raT:dJ+\K8%^<*[C[b;;ATDTFdR&E5N5We +V>Qٹʍ֚vNqc I/ZO/H6`RU 8xiYdԥ\i/Z7Ʋ=p)ӣJC͌ٺQ==?9#W{n|z2|R\!>ʍ?-v_6htH8=u~Qa)p _hO5=Tv=_bT]퇿:I%K-Rpln){!3]u &aX"`>/5wmp N . Tk̀-뻰2;]yF&t䉟CSg3)_P8֕T9O1kr[K@3N'Z헚-?~phK9/i,|]_/IV4˃-D-̝|΍? HjYB%fCːS8gpX%9NOhC^m'r~eSb~b@1AΓ;wpT:EG[({}vb/ҪĊTKӠc-4gC>f[B؆U0D]vam#Rz U-.#%M!6K4m2^=1䏙SUKu7}x{89t <PFl_sB9\k"Vٝb2^t4eԿܷf~ЉА:UޓX0 %jK\>.cƂs ݨWtq%ù#j?w–t'ZR42PE#>Wo˔ٸ>nۑ4c =/hn_å=tc7ף:x[eT${< V.Wքܜ9Dc^'`+хt0MZrFY}!jnljZ|I&ى }^,[OG`Vj7\`ƳJM@|Ik5uGݗ՝%Wm.&0CLULYz ^Xm̆Z`y:wD۬Nvə6`#;W{5rcKӛʳ+ 4Fq0ک ud/-5_v odJ.2n{݆2xT7J n* "2kӄlV{|#GVW,7L?_- F"; 6ݏbH{Ue\n ztmj?UHAzM  =4gEik:9j,˺O޾3:;Fa?fA>tl$3QD6Ft:X+]A̛fęJhXO=sc]ZV%'%g%V{:FWJ 9t #ډ~{|{4~S"*pXR#il/rn: G"fWzզ%܅2MzP eғ θEt]HLOLF-v;PznU9V5Њe쥘kٰQ9rT6y:-  M=Ŭd⺎dL=ڲqC!Qw$hgP/ %F,y?ِP:f͑qgqxHW/'sIW!c\L;KuaC]ǔC샍QL.E# fRiٻs2L=VF]Ewk/g.!IA:@6-ސ`Vo]԰Pc1"\w'>mVW5 ts6\? wR #U%:}^dJc72ɬpl4яˬVm-|O>#]Vi߬1"5;9Π4vF|p[u[R ]s7w~SU4!6u|aoG+/K鷚܍I:nPؼ+YMy /]誋F -l,s !}rWΚ)vtOԂiw 1$~g!wS._q6EF^m(K"$IgAR]xFԽI/5=eO?/9|/ad ?@fREYЉqC(b wCIt~@~OF-l*xO(:cTչ..c˿w[y7ې6F.uQQXQ<[W{- klku1#Q.P𡵶uCpU-;㩱VdDWFi\ԥYϪ'x0xZŲbX-:7?ԏ(}ɭIONH 2je!HZkf {4I[]gD*W_5G} E~|Y Dt v=7.7ӑg8^OZ>miuOYENH (-Gkș M?WC ӫGY^ k(lk{ |4tGuWP|1rN\_<6rrys֎W܁/hnm;A#kZJ~u'n0.MT2;wQ0# kz81[SK~)尵cLF3qnA!98uޤqݵXnG=NOԤBMȨ\~ͫCEEVeGk)zT]Hc5Z zX[3k3⊩#$g7,Ƭt@v _5nk2*6\M䮐W ";8 S̠˜iY?c'Vc-pmh j4JVl!ͭ;X"R +dqL>y _;SS׻VL ERDSI."fw%Mc4N;4)ˡoq2 1L4.3ߔ:T]&kU8uWuo@˷edW@Fq̪g_<Kwdp"2.;,a$&+D֥Qvkz28I>VW0i;H Yp4DLPJ6?mv.^payp?,މôqŀn2ã-Ff̫Gla Q^bR9x;"Ldɒlt$=g't@gdƧ+uxa[:5AN$(^ tq,"p?,݁P~+֛Ag}1mBۘ8`!2d38>%%!ugIz©Ot.s;؈Ja4 f}eL\i"li96 6o̘70a5_[tt{w)O!Ky5{6J :p}{ Oǽf%Ca-{@!cZp%ȄTo3Ԙi1qb:)/F8GQ4rnn,L LG7?n \J_yֳ1СtwYJ؝v2̞s/E4H!N8kBڰZe y:u@*ߙevX[n<кxgA3d գ) ҍIkE-0=MesIfJ/+ #eoj1qz_wN)5tPcK5;i'FJ|[.,J}\Ͼw&jxNN0Il9E.q-q.^XpR7vEB^0yK\=:Fͳ/Nz&i؍v1U"?ee9yD\Y(%@8j/BڙbKPOu¯2pk!R% &oh!ӖU{O U!oc[ٝ5XZ% O]O4 ɟB鯑;vZQr0;bNRa8 Sؾ0/;:H-NʌGZqn4&Q﫳<@v&5{˝sd[Ȭl(.ep?E }s-JoS,Bu0V<׌iʺ+H:UcV_n2RHd Wxiͻ.bJ.v+9m&3C*=|a'ȱ6j$=6:pSlu~n |G6θSDq*z])B9hv!="tOc܊ Q;H_knc} ycVO1L+~+)b) ]y1`4zy]+ /:Od})"A||ꊎ;67w*JsQhjp'ěG>8i#V%KbcŹg 1Mg HnI i> 4I  YQXEDƇU%nKEt~)k?1 B/!7稣.&,wdC0O> ܛVNkDFqq d_;'{$ZبKv*1fD&tlr[{jRSl i^D#?c_*`n>AR~d3uKv;c~zW\G8J1ccV8>1ka@p}'Z ,X|nQyF*"b`ڜ4,T]ּ:Q \dJf"ӵ&"T3 \`A"Wb0Y DP7¹ 7I%!9PMY P\ ,j/5uK&KˑK׹&1J6SXջ:|i ϒ9.ɠQًɞ-kĸM`"O:tQ!7X'hKwg2$DUg 0i[o]9[Ct3\s_yhڒY]siCK*%cZaʼ|lzkuPƴOyjaqSkvuQϬy[U-ixuP{(9)oۑKd(c#\jjy[Zo!HخMkseV"Y9fmV'ޖ:g ]X/hy\wR67EfZ.k'0  هェcp&k.4F0F >G%1fm󽜀X#xt +.C+MԱ%V_vK|٠"{F]1"$w,80W^LC}¢ XpC =4zƳB_ g%gƍ4a?Iن8cåBަBu҈PWiya/8MgXdځ铘#!r7$d RD'J5^A7EMfBt"",Sc|ӞρU*܍ɑECb iEU৛gz0x^}MZw0]TOoRc!l{5A*z}5 \heѣVVոȲpxT/@ix0W.Vb3:h,y,Sn@oS.0J0bT$ukwA(_[Qgv ?=2AL>c DkQ)ySͩF&x?KۈJ\ed?̝q@`jY*?lڟ?v^JPNIy?銴'W5/g$V6B7jsùi蠐(iC Z9@a1%/md,[ J^2+$FX` $A9+kHmIJ}͜b'5bӡ/6uI =b >,hLX'8p(Z\Z,=I2A8>G 4Wj18_1ƎI|;.P xDyØ|iq k$ie2sMe8 }%$x'ewvb\mD/27ȸ bU []vK~?(Qgđ@okqwl-ϔ˂I ،TcJe4'4*;d_-qc%'ZMk59WX~GSgLv.IcI"zLm`:N'Bf,^ɶ[ʍG%HΑ.4@hKܖƥ5&߫fF[؟#YjIKz+V}La{c}–ȠB_T"GB_UIlmo-2OkTN_Ij/MFL@KY]b%/SZymmڲhr:Z iv0 t%0pT1; 03ˆmS\C>1~k,g!*')>cMtXw67]h‡Uz&]zSsڲUo_ȱ,;Oܚp=]nᮾ&@F>f @ =:x}y^:aԅd> <‰ Zј&|]@>-Gts(k4&>)X5xR`?mְLsCWpTߏ:LfNDZF|lJΰ\rAbԵA.)SCqEFz&vo q.M@XR(Ui6JnDĎ7kL[ G48=F=QSWJp,1-O  k2 ObiFTɍ=%3d1He? T\nfOpxTCnbӵZy1x',Q|Lj{Ht>}TZ&̬6Q2EA~V:Ѐ>D* 3F/*89QE4NTO2*R1l:OL+yer(wXr/SBsgEQ1mu(oPMyhy?A+e3`,+= QZ-pGuN#YՊ>(O}Gm9ʸ3l-Y]H|'7Oﲚ@1b.IBc ռrO&E~z좏SzJS7LFP?`>!R^Mqhʁ(U *|W~qH@ ؒS& :cCMn=G^{j6BaD4AON=ݳ*ధ7leKp|;q wnE 5#FrqO\=+ C]>=)E.lK]_+!Lj\ uCPӔ}_IIJl2p{r'OkIjH7Y ˸~ܲ ҘISH6߈>aIޜ_'&,Qf=K<ޱgNMގ=ҰүNZҢ{J;7[UNߥbc;+v=) qqOdL_Rɗ GMrt[ QNk}լ>v}fI/^Yrvu凝6HzF܆EG3b[:l g_vb>`*Z|QKq{K΂>gU{W%1Gܓز(o~-,AdsNK !Ϯ8I2 Qӡ[R44fBLygμ;g 5+wBpuԒZ,o, k%r,~%U}'7|*$Td>5DgXs2 /4nS5%Wg@"\D)oZ =W÷_Ԕ=8 $D"S'Tń-#tQ%Oja~Zϝ(nNVʖ}B">ߟz(n:6XΧ7p#&'ԃç?OsW$<r-^Z.ĴgBI۳|9EcG+T¸5IYaUۻ5i:rhu|VAi)EA+n-`roKbsI`/97*o;CzI,́]2.q{ش(2XsAõpz*3ЎCU٨cW"-=Cm󬗍R!p1Eޖ`q ?iT9kr3%UmkS{uk prϠ_%pT/؀]0LnSF Z\,?(F3q$7DwAdlZLR`}p>pl.`^c va'>5AF[QJt$}wАi] t~ /ݨ6kd,Fhα8~\R0]`)󖀉p \ @b> <5xp&E("%'igw+9i@\1*jt8;CNBy*].ۈy9!z8y^" q T>$("zג_S?Nr,*ΞT&KL,~U3-~:[UՂ:`2.3E@JvSGV-``R[SKhŞ>\s$*ca rw[dftfE2Yt gD]8vVwom=j#-顦>Cyu^?((L':zv>U xd|!Cھ0v *PED^8eZ% ѹ@Ω׀]΃0-8ZVɖFͯB:XP0V?uEk= KRrCaה-j,ݵDE]61qɕEɳP΀LGq#$O00 ȋ;|?I 4Q9B 4˥puiNDMf1&tSZ5<^ ҿKC)+U51 Y,0t[,G@5\ͬԬ T=]>)a] t B/p^0Y G1FIm7T1mCth[F~3+']/ oF<ҽj3i$]: >ކޤz;[uBHRGbh"d.,TwQM&"RL B;Z_h\'ӥ !]ECE=w;X^yùN j0㧅:k|Si+!bUBb)I@$Sr([}yُ '5k7AFgN%(W4t=Rm2N4,gL Rq&B5)6:s`Ֆĸ{KEQI|D vQK;6a*P\G?nW]*"j+y5}dXPFV6ܴ&eޝRkXum!MJOA`}ye& ?|1|$"XiDߏmʰX )}P6FPLyx,qv*+> ѳz@ "Xl|DqQvaOn0r:kHXeRuϰȀ vvtW`XNNc:Þ>mElDE_!\ۜ{×RzwTly|+IՆ)LȨx gͯ8ǯwhAǝ.f5/߂Nj]=)ij餎 6I:M>=G\RcR~x4ܾ) #W¼;KamflPa6/ܬ)\ <N?wo pL}*T&K^}8]y/{@d:N} /㼨=fNK;5d3 \"75քa&<Gːeq(\:< z2N{u{+~f,Dks愤Av7=$q!9,On2 a_q;khJtS+/fWxSR-ŝzC-Lga@VbAh>+lIt G]DYM%ٯz`Ȍӏ9ZT^-38\}堄2dօL=."  )Ǯ (QZf^:&B]?Ke3$QHqS<muv@:kE +LWD6%nJmT(e@eXRj̦7<;,i4N.JF9J_ ءUk;}кb9" ϺIiGå9z>ӂja=?TCdHҪIR:N| 5yS~xb|`DFgyEV|~7{|yCΗ0>*+E:iNYan֝?6BIIEwЗMDCWűz$|,}Z#:(&= E' vXJԩfrFD~0O&(J@~ ёx! k p|w~;m2E,{IO]ʌ_i^cxsnEzJe;:8xFZw nZϦ f g 1F(5YteLJg$Néi.u՜ƤXjY r0PUV`ĒHvm\Lj"Шb]ǒA|wẕ^EJ 6hEy 'lA{Ėv[&ލ:G*gI~I\h7c:U ˴?%пsG'_$McXz.ƾLALvIg;E|P#B [^BgbPѿv}R??hU*8B> ݦ)۬RG' t\\f\zMedF{}rq$;_Grfٱ{$X!S='9ly# >˚\% }P!~˸[ǪY dDnW 13~|`;^ntV6 [])5;u1UN{[K)Mv3cv⭧=c}]8XP_%ŤH T{:%8!Z{|'Y=^d}:늁 ~g!|yx[\!sE#99ݍj)u`%m81hYUN4 q e@: $+j]pODR@zrӶ~LozRDJr y&a`߮Ko"_ $k6yFᲹ}A|T싴Fγ%VM1 ~1|Q4~6RiK 彽R"GQhbK #y@m+C)' 0kV(;QhkC~9tIc"Bm3Lm|3{ O j`z-YI{Uڌ"Sb 3?7Yw7YeiAeE ?0I+&6ٮeIWϼO>W! #s|[Iuc6lq)+RB/Pd5R&$ ?(97AV*br& skC>jd?ZMU|*~MNJ:fPZrISSs2bqMb'd$^wR8e+\_y"xE k^҈ChUJd(G by?vnK˂N<_UPU6XYLDYqr ?92})ySb91StZw|+ipGvt#Y:m=i@FD<*e!)R%Z!qhl֡C"(G5q6-GL?N,tʈNqKo7pPN "go׈52ݺQUfiCn0'}'78Vcj[_JGHg Kݴu;Ĵesp,]3U9vXj` z PyVVڄ\a3vo }fq﹛mf9缳zGȜźX>1w~Kl!u-M!@qS5RM7X 8I&F42ϔU"4L3SPk4dK \PSa\\Píh?ad]@7v`BrSڽ} ߫cp*~,qԱB%:Iv"ȋb"B. _\娷f"w/)4f>c5)ؚ4&Xr50ԃTeR 7)P!>/·!4gщ<(Cb,ܓEdl;򼙠 t .RGl/M!&\JI)aA \Uk]xKI ~Qs36B=rXhO9f}v; J녗h! ǯ{K/ BO͊P]qZjaZ*Φhl1bPu[M) }kF$ )iJ(@,ҏ n#!Aڍj.@42(&Eۢ*Ghˢ36ryCd\t=M@QjYYSH^{m_`̥#֙1<lR͉RMh_/ig̜#>5zR*}۰4"{7k3Ҹ.t~yOWR΍Q*^8RņjX d d]M{zhx6CQye6ImB/XA 4Dn1e_nGIT o] ⱻX#NqzfN[[?$%߫ʜ-",bҳG8S FBG;F7QyS,~KlI8MoKgrϖ:yyG0c<,U{ .&Ħy'#VѪA42c`ʽڀg2>H^E 2\ϟ49 Fx9wpUC&ɟUo:kw(e}fdR2!ҟŖ'ۺ3Wafˣ}UTfMt=(0 n&¢:9vz8D$c.Ʉ݈bu\/-aR4/æ$XҘ]Fc``n |Zn3.>92wX)H< rnדּ_`RSG :mꀰixS2AG1lZB nb=LdzC@IV74-K_hDz2A#S*Q)^9j$&QܕpqqҒ^?[L58>) Knz7#0O~?Kcs%O@d7?:Nc"2UPGi/PeI :d'׬D xx_i<%s4P :oUus}̯k}ዡ B@E8A# LzLzGO \/fI2 mĶ}̄Y D^gO05=+'}^6IFcF vtb^EY;'j.wR?ԙOՑK60l9*5}װbp/7gʁj/l:wWe\1*Xo2ÎwC+ھ'O~sS܏w oM5\B1 Q7zvIUD,F$sh֕n*nq)( \٫ ?e " ⭬" J7QO*@EXz Vxr>/%=ˀ1+w9UljywC {9ɼM9WG9l_Gf`}W FwiK56g<ԧj>.GbVϐ2 ꓯk{rL*_~egOxutp.~wyvtjL\l1K=r7^+_'IuUcGUeV`je]D _T-GZWVR4{L= @ڪ$g0M$d@z( 3ZNt;PMoapml0d$-=C=.HZ1-=WDbD ےci@ςέ^"ۉ;3[Gh+֐\!Vf RBY2U߲5x(F3z;vznԈ3+&363BpH֘X2v}^9 *drL[b*g2[$'/]: ֌/*i͙\6H@AoZ_9)s{Ǿ;b_Nr)E7IkG BwYY5bA_k٠| endstream endobj 159 0 obj << /Length1 2082 /Length2 22334 /Length3 0 /Length 23626 /Filter /FlateDecode >> stream xڴeT\۶5w w$A[ ޳9}ZIX}UZQ*1L-$An,L̼y5GWfF%S{gw +33;<% Q͂f P2s{Ou23S,-\ޝSo / ruc45q}w[8Z8Zо]l`cdSO(@jg0q42)0AF `jambo Y-jj)U% e5ZjNN "!QTXh24[8b(y ., OF 7TK_ 4nnN@'Ŋ/~6O;_\ş$Iп|Oz ԴW8?X+,p0qtp4q4{t3qswe{ZS@OuRL󿯘?f69ڸ{?/:@qdrr+O=qy^73'.R Gs1;kW?ytmtvKGs?7wwj8ɈO o` 2iZYrXػZXZxX\-}O01s{f%/;uhڨh 0*A>^&4=3qвÕF`b_>WI/ se73 _v7w8Z[YXeߕ~9]{+/ ttTtj p48ZX98&..&R`/L ?zrrLB߈7bFyF,F߈ T7MFLFXߋ|/koZ{;Y[8#f?{o!{by |_?;@v? 9y;K!?;JG׹VssYh٘Q`bYd (>-* edd0]<Vf::PE 0_YڦHT@S0Wa jCdtYfRy K)C_7ۓUL%Ds543+zhOds tJg3;;b<]O_XnS+:=YZ1]ѽQ gޞ0cMDV °ea{18p.czy_)ijoZ+{f r9&˓IW1vQ8A85\2iل{i_fH.ϯE[P:=mY+؀&DG4BJ@`nO}oqK 7pފv,ޒUeqk{oTkX8$*{990DhЧAj%JCh@a0t'aL} $Sb2|gtjsYn@%GU]` 'gAx0 hϦ&WiUS%Z pQj\v1Vrה٫0j˸<&-UwEs8gd ,][RJrznj@}c~ZytgBh 7RaLmըv:tvOlNrvȍSw2J[H[MaɰG%tKɓ؝֑q܁CNQ[Mm\G_)4 CRhТ7&rtNm(~VC>UMT0qA5_{b#V }lGK6NS L`/I}u l$(WG0!!< =i!AB71" 0}f44+ w >&ĮiaC˜":2%/2-)|!ie3艎Q|+o73VՑ WW.G0@ !´MA6)B nx칗fTDq#al*azé L h\Wy͵-K./h]YR{rθF8bbH_4N*h748ʟ wdt((,6⑰_=Z_NK"Brr*?nPPSuY*zB|A{R]4[%'cI1=JNm)210KDd&N)%kk#M"< >PfE ,c8*5~ޭ g0mD5 ocj=JN[m\-+Lт$ 4f( /2nj['ҬZ`/2Δ c͊<Я 25"ddE~X7ׁzgIR"7a!.!`'ǵj¢]ay]CgmrzK{^Vύ'C|z$b T](071zTAuWsJķaKB=es`hdBE/:%|R >"4x۔,2חQ Mi-J?#aq„ j@pXZ'i)7צu.#= X7^ڏӭ_QT ^>!.R)S0bLv Rw8rQWzd3҄q,@j &cPN 6ėUaY#ޡ5Hp^XEdqpq},X.(V{eriZ5ߡ& \ģ0y4JFF" L,gk 1\uPG)N_aM [w>u*W9lgZpö Y[džKЩ*qY[?^z;8B/C[&g?x }}|0ɷWhs0ť܎65).XbI37!*a Ɗz1,RiX{&BP]W 'M/qy[{[PҷQ%q\F J^gp0sJ5(Т(Χ"uLD[f *c@)w5Aa#{}>R9NIACNs̤X p* :-{qAkah5H(L.Z/P`י ww·+Ys7bNL3sY>(L@,?h6AE~BQw<#I$NkrC US'tŇR$5 *Чuz.RPdΖ>v!rz3+Li4٭I,d9M,"4 *L)*QXjri?gsY ,To3z]k?6o*#W9Td`<@Nj?/ hV0'LZ+X5a9Z|gsiO9$9W.޶m"`JH|჌R 6)NW%،Z_afmc-7:&pn\nlGcB 픦FgNєw=Un5ijFPp2y3ŦKʣUZZ/y,{^>$6Ć{VE 3]b;ϭ1w~]dJ ='i(+ 8 HH 95>䗨A|KA ~K!뛇  OL9}\g$s s57ok7s;_mMMLXܯy8%8p1JOb[% )O39Zuh@閣b⁄X@ 6Q /a¼{8&8ݦޥx=S=/NcFJn}ܓ0 fI`[;֛[CoQ"E^cTv^L p'uGsEZ'7^P,2*InjZ|jZQȩib V%ND[L;AK>R>Ngb8qO-NMd0P`BMAZ$k'ʰqY><5N>'ڍ<m bOVWm'*,]=.Y ٳPCŶdO%|BTXO6̂%Ye=nOZhhQXMZZE~< ~8?fk7?w r {~]0#+? .~fU#O8ý jli 3'Fp ~1.:y(*Ut8Qvc9V&ԉxwgfhU dsY.< `*>A:^mAHBD3Vem>-NOfa8Hԛ*-6br~ _ȎH瑈xY zS)ZX%\}?]*\u s2/JGk~IT~ꏵi';$Ûp-5qy?a6-^Kh=25W!ɥD?V`1h{2u\"y5*:S&X=kD ݕ k[1YW MUԲeI".q/f o>>^mb\A[&%*e( V t&y (nB7Ԧm/l̶, :{R7B8MeE0T $\W(~/x\{ + ?dC5dWf#YэT(Mvo>޻ rz#/ӛXc;F᷻Ψ-ϕ|J(S?qg`;|:Ҁ\Pfvi^np`eG އlhW 'zf~ RBrj)FT\hO0cG0d\Ւ>yL`=EGw b8Q]`t@wѬEsllvCA-&{ؑri ^d$*ӼÒw;A}Ɲi7lͨ_9?׺[oKB>.Vh -"EUdYD+9$Sv,8yGioMP$ ˒TݽQuvdP1N*]md»0"]a nipLyYSwwmnv6w_ ?%tȍ`A[SKc~=u$%`+ޱ>dJQ{ 8[Q\\zҵ5%rq8|Ea?Syw~*]/b$V~t<4a0a9b~>Fz~%X:[y#0?qj\Z>Q~=5~w9/to /R\XszUlR"h*BպCVYUEOarVrWԺRx"}t#=寮j^c?<YƺvLQB KwviA݌U_֊N^JiՄ` ;kΦ0k$3RȂ¾dr!A˭E[T+-ЏR lt970S ݧM3(0v ī] "r^˫j'nP(h-Uux&ٿ,' a pD8`6vG'&6>_z95WT! N ƬLU^P$*}+y66P͖@\9N~A{̧/`eYیsx>M & Kܵ\]&/ʥRYҋ^ײ3{[wio-N~C^Pr&y#l]5hW̽Qr3qo1`FNm {\ٸ,29\`52|p3w$/ u!6Bm)Xg$'`Tbbu85@TU,.5Va?OOg/0-5sw7=lUhvHXȇĦ f%_hioĈ X[<pp}76, zYjk0^[~< !qNS#b=, 3LѢ9]\mԜeIFLD_*V֟0;\34Y+7&+9}Ģ |_#]:Tи؇|HuN!AC{dI'\Yaf>tMПnԫEM3fA 4ɃjSɐŴj_751fr:▆ CE8TE隦*Ur ࢅSݛ%v1b[ ww7ke>깓ӎ[vS+jxqդ~;N^w{9|anq~wPҵGgl),W1c_U۵Tp V׼jҰ1 ^%PT$~H8YW5fYAV0^bCYdz gGsu|3oqzyd6ŎKc!h>sRQ\ K7\P8,p)6m#Do\|/n99pMVU  ~3e[@/ 6uȵ^p+ o&о[" Q@7 V|΀Ibj1o a"@W3e7";DPz骤&v!-2wnDQbƽ4*_b*"yr{ǡ_ e/wQʅR3bGkwvsW?9D%ͅlrh3 &C)>\I~u\U30t[y<-X4SuGJ(?Qsi]ujzlxMtFc9EȈO a&8 ȎU ]{O[vj,Mt Hk$Q]oj D#Y6;Wd`f}p kkYޙ ̑n%22}Zo93VOԝ6AwU_e[zp4ܚA gHpDO9ĵl<֤Ǧ3Lx`Gu2C\oogAqR.${u"%+'eM2\֣d1d> pWQs2+w6msItN??j%H]ȄjkY1%mZj1V粨R?Ҡtn L| J?}xyii/E2O:I}D:<7Lȵ;A9ޙƒ,rcNwu1s/ t/`A9PՆɞc8ƥ=(I ۧGTZU2էM-run#pOicayqV9U^\ukQ.{ƺjN h}bJ >NBNNȺbjsM KŘ ɲ{%3Sw# bo+>Ԉs] ASkqߜQJ,#r><7DtuQ@ZF}0e98yS=+s2\ȩKKafXQXy|/jGV:>@/zCȭeŧt̳R5Of>bɐXs~^(h^h >vk}Λ1=n`uߙ7\gLOɏO}^QїohG,b$,@ǓMz(/V_Ch5>U10эVzgY|VTQA K>Ztiesw4ч;Zc4J谘c Lx,ŕ{YS& ʛeLyg)Y~guJ讌f;|pUQ0¡a=ev{m4?{Ke2Xg D,:$>g9/ Xhfswôs`{YROaJy3 ·Kok9DI{b>nYc\*#Q*pdIaOћ* *Vfy"!LA-{vx^̭7(iݰ+Ō% .-"23I(U(¼a/c^PTVV渲/*uRجG\Et 6 mj& ̝xAVtvvqc`m=ʲUɇW} 6{%Ѭ=ws@UKM1dAHsehKWp0M$GQ6^:*W=OBO-2u;ՠ#d[Yu/r}Υc<YBGt[2K30 :eCPe Vf`}[RϏ.\k[mcIBJV>} }~Mj? M]iJGN`NQJjg0֙{DVz˵0?'Z$U`@W)]9nBf+*ԟ l?~loXunu.ZȍwxFHǘ_s&±bU;z>ix8EC 'xiѣ=֌|TL\ [;gd.;#rwIacpygB)l#աz?9C*񿽝$^qG/ wmqKq#.DV\aW~ ʭF6k! ACk@:"R9D8a{(do~!T,T"U7ŀ8="3\~tt$^E~)Ŗ@2fy^F=@gjBjd?jK-R0mL#E5pŏT$)hH cǟzl܃N~M0SUH CjX#!aIce=g\^.?mγ LUK)QۉmJI]l+RP,{{ '6pN~$s(X ~Ok;1r>3.Dwe[]5e'OR$ #op4;%:ΈR}3u,:(4(z_T4C76cC+`VHE# |y1*`1]_\<nkMl޶,뷤=ܔĺA[WƚڷڭG=)I͐I}0pǐp+eUo6iVhco쩣N4H{r[N8?:TbILшlheOXvtқg;_X"'ǢJm,k"OUwRN}[I:Ĭ{ϊ&"8<#\k .oJ81x2 AzJs;C❲җ2466,CڅyVLy)|ZX*vYC50J"F|S%WPF92g˼5K/Mm;&AFAUK_zYlJuZѺȄc?W *ý)F$q6:E~ wY:~7kO66צL" =ъ”~я~f:/r㨼ofڪ3MPv!}tPbb!W_MVatcf-z\xl+\sW.X˖,ђ7PnVcv~@H.G;c-WZzF_aHm`0k(]Ƕx{ou SYT!)ȢK/L)ӨSTxG:=_Ip؜m}<,D'mV `mj)00abuQwYēOs eJ[cvtQiϻx:5}GC t}J4_H} >cS6ucNd(ۛ*ͣ1a`Bwu:qo}9?%ZMU$"c #`v(a  [722+O ϯ8>r61s}u.96' Nv)WSq˸ ]LtMpo.3b]vR㺛6+ː_] AӘ.lӮ vF?JTFaQFN|xx ϡ{ӂMGٹѷD9Ry&I`XJ '=gEas}Bi+2NSOZ/{?2ebs30n 1/Ipvu@\8. ko?&X݀fU20~dAH.}?v,r=;6fx[R|du3cQR_bOݜ+V6/(&H)pmq"gS%ld%?>S9qY.CkL@C[$wX /e-}0zLl4c(t͝Htrx4?ښ:rR|x1i}ճ."դrZk*a6ɶ19v4vjΚIm6z?k `?=c[g.@Av7]8+{g1{6#= 1_x:2{oﶖ[Ie]M!Y_nʔ$W}FOn ^d!J.%N-C ߀(T#lLNV" ;Mg?! SLDžpB>[mۦr "; ɞT9FAAcvF뎤)g֋#wW(GmKh\3Bޏi4wίwWWqD {4^I TdXr$o>Jk "SC87Έ%B1aǔO߉Y%J(ݸt5nv0帻Vz,).-P#z#d+-+_lC>uE}B[}*&":=[>r11LMp5 zȤ{:k;~4I ֌Noϱޝ>!M;1_,%oiجqA {k^{ AU xy}FXa{֎ک AzDԾ=JX&._8)b{*j>kDYd%?z$1ҘF|YThNZE&'S TёUSבe଻;YkUTw̎8& K=ny44Sɶ`~U4>T&XVv3y0{}קvO~udwfD(/?y(`GlFF[zzǮ].he)Ğ?3n8oBE7gdz22rc5}=# d  vYgX\FoHuuBSun7 EI0*&UF DzcaB'LBW͗m2r"'B>>+9-:ڌ{*ww"j"^-3 k&9%!pEu&1l ևYlۘ8'S8r)_ص_tX5%#EJz٭z%{t'+𮹣ZॅBEP.Z (|Norxsoӫlgi% Iߌ0On G(񌯆.9Ir%vonՖ;%m>:B5 Rl8&ϻKQ.HٌZu0^tAG2VhU零FgYSnnOq 4P w]%y':Cll@=ɎsYdwmU '@'imrf<0uF&IO]b1nXج[j4Ea}/(X$g(=6Z(Ɨ/'W̧zOby~BX6R郡1M-A0˕q9^{{\I?~*qgL榗!S8E98Vҕ`})G#XX]SqR!2;l82UYP-|9zUm8͇࠿JkD̸h x&tɪe L嫮N?f<06Nq4VP&=G,JZ%VOqMH$9ykJJq P(xRmxΰ[)PQ_rLkG4K:4&%T"'a/?WM Ą"`(q%vձɛ>~G]%kCk8PSҟكDHU)'Qj*)wtϹyנA6 :b";]=*A[`$|^3AI jXڞ]E 80kx/fm뎻5HQӍn \-j5b-]:tTrq WQ=qdָ EIK{.Ȑ՛h8=x uIq-ǏN0sX33G=#j2^T*J}N:f@!c!N&/cy+B|fef'&! OF 3_d n%ɏ `W`Te2ʩ91 EaGF֭b:o-yiw2ZRBcﮱS3WUMeۧ,83Xn%$ Oz.:GNQ Y*aiX6 oC>#x`DE)4 eR[jtڟ&Ou.uOE(Q}Ǫ@cnr6kHb{lCds*CҼăkND("7JFm48k݊yD(dO؞ <{dDϲ d1#Q6L.i{B0[8 H~O/7?RxՃfQ# YPUO7%^lhN:e뤒lc4,e[CsKb֤b݋qb{=4wu[x++*_~t3wRְTAӼl9CS>G<΢!9691yb]ERXwfy_XA 5G4uٻŭ:0t0`.&ynxlbphmw=A!1*w]B(px#L;nY⥥U坶'{*䫡%=U]6F|@݁g Dr”"\56UM3BX۲x]8D HDKT[>6_JwҎX_pk*j.Ε3ywߴM$Vucf#Yw\v)d-`BҎJ\g4j󩷏d5X.N,-۵k~Tu§[ ViL y%]q"Iq0Z>7h)w ~,'։#|8f{q< /d57Qy +i"Um.3y(S7lcGE-3A✈'@\HH#v?P¸B\F&M5_r-=p~wX-4C=+gg)= `ւM )Pɮ t,էv(|0Zߚ#,aK ܑvEMn,"8Gߐs0V>D!om_ \$S!biE-1g]}uqkLxиIhNf WtҠ}}7]&_*#1cqaP<ʻ.,#Nߪ?uͦt][m#9VK(שdDsNqr w(ބ/8_ b`} h_OI6phĵ@mlHjN~TDB-S΍gGSt*]S>*x VYAg_pQOk9Vyh$vULkr14^/Jn LO>}3+C|Zc{3]tR` ޞf,;s Y#"LC[@4m_9\mKưj|ߢEQ`3: ꩩRiӼgw'>?*Og!5wabz3Qb`;|uSZ XA)}j&hiZ[K i\k/Tkf' $',#? a o?ǧn qNJK&B] B[H dӽrsz5*G;oiQ@+A ^[|p5pJ)[ ޅhL%Vu2>&y}& I_ᵅ@k!q1ÿ`~3-1״ EġyRSǡ4uoAi?mJ{7uiZ ӑI݂BTȋp>MgeS@+'==u]vt6U>֞xv9;;Cz5͖j|TD,ϲQ֜{}?6Xm`I3V>~C^'Zh.G0t3UŘ1G;z/cFǽΎƌ/!^JҖv5?紥RKtC٘s8XB+5}.cK 0ՙJG٦ռA =mg\bM%>k9QhSLXk -1ɻ'<8"Oۆ$uX٫!c]kW|pj[2v 7Z26'SFy\'/D4T$$#(oBmٶS`W/F0/WShAtqbLаXK$:hT,uM#YUv->P-kMwoE >51J#7I=ZKH^0Q#La}K)$`Xw4Δ l%84tJ( q.{+1'3tW~ֲelsDΚCkxߤ͇$ !ߞK&+>p~[r]4x $͢Lfk?ڢZ%Gd+Flduq}1[Yzy6D U"}[FV12Ɏljt-)~p\I'gF#Ʉ6/%3H4S-ƫ([Mɪ)U6J[ďDV o`uAzڵ;*3X&#g/Sٹ^c?(Tzv Mxz݌Raå_!k9Xe#嵭9v% 7/|T.F&lsƗd3XbUMU />`Irnw)#@8پs9 ]z;2oA] S)Wz1u<8=RL·"vQQzil4#4Lh6c#%t7"GirwO) ڕLNG;l(~3洽K(blFü[T l՗fYܺ~ld+TK+Ϊ *tw%p/1&-`ghl-'T|25 d<-j|Hb'tIax~4QI |zgٳOpl*V;IR|](fq9-FgϠ*q#dN[zw:nP%*?8l6cY/$kjowJL4]+.=3]g2RzP> /Vr0j*+"e¹]pD.PKB>TD٧Ok\}XM(hJ2#h5[ւM+;NOp!J:Nx-ɣZabMZ}&v bbeue"3G_̼N.R=ܫŭaa>Lkp0ɳVNٛEtxɡsGh*e5?ec NMDTuoe&Ө1lpYidLb:Y7,&#UM/XglA oH^VOo2Z9"%Iŝ 6οYrЇĬL9^X(>E~ք?0VvBfY%k^$emD#]K:iqK8 P endstream endobj 161 0 obj << /Length1 1608 /Length2 7239 /Length3 0 /Length 8055 /Filter /FlateDecode >> stream xڭTeXV:UZz@;.a``f(i)ii)A:Nxuua唱[0$'/@`9eP+SQ DB0y ,0[ WTT wp",:NXz#r\P?H[0䴴U4,J%0 ],@`V50+\X2p A C @` o~kB =6D!H}Umyſx"mߵ0n}inO>B`] @`ΐ?4\Ϳp6@g+(= NdCpxkm 0ߋxy[8# v3 ;zOhA=V`knM8$2N#Fߡ]PM_@_@d=ޏAfs/_NB҆ Ak ~F0+3kgN^Al! { aVg~/z:jZJMdi߫p'}hiƐ<9y< * oD:CMiY/~._:~A.-`;3KJMFVe~7hEXX[oI Y`qSU3$v1xʶF enMgSy?cm!cjf_~Uc W7CMX\s|"i~R"w{)n✹kWz*%{F68M6]<tY&4H*gmc@[$~]nbKoK Qm^^Y,npo{hYie.Y寢B#*o8d`N"*!%lIC:ҕs \]FFFmx {BV耶"+am{:qo] n~)E3"M8911ɩ1e y(boB@oV=_CgzUy> lBцY|*Ϣ7~vP"F{Y)9h_eg7vXQ,)F3řex/,0w߄1>4LQr+Rf I=ʼ 3$]Ff}@%G/m`xqS7?1+gIjwb$z-(Gya$>QOzPb 罹zт>Zj!$y96ߟf22)Mb˴lHl~oڡM3B?X_dr哾y?k}rJ4PvK'ôNhc>Ie.>5X̉B+Ȝ/S>#7={BAɎD Y\YL|cYsGy-=߭f׾è-&3V] قv4a]~b$<հyO1.~x"dZ'V''IӏO-W}K}I[dѼ07lC{ǯĩ/LYS55gyL+^2JftJ=,(rC9ʖ#q3[Q||R7i7ƻޮaDVQ~6ҀɚfclX) {F/OǏ|i=8-(8.X0ȶ#ΨFB!n,WhTkq4:\K3x5J(UlǹqL2-x7;'4,R`l~b." I椼޵vpDȺ<`#G<{aX9\D:R-</qWn`,4~㳇T;+!/4qOY.$㴬)]MY4WR3F*o4tP#c+N<̻5328(;,_"|›[Tܖ1ijwh.Dudq `WGhc98R# Q`,[Zi+ o ;ژ8P9P)YVgjJ]Y҇r>SM-2">Լo:&xF2:ZBzULHq!~51E*iYevoڿƧKg[KdPm12)#*7c}ffC!_ϝ;{}Dƻ%kۢ5~h7]SwWλŸ /]Y%EF=9L~C")ucDtomK:kģ~c#]?A&sOlII"2pHvW(r-4,ruY$ kwƵG-xyQ}:@ΎꙶZ`E A8RjN%KO/R̥k]F*lqr=W$~xB''5 zLVJh'>}3DGo0ZΙ"L1^FzD/e*y:׉}SU(5zxM%Eلp UM i>NXvJIFRZ=zj0i-FF*b7k|-dөw/ 0h /.(`K](*i2 nEʝ"?r M%]ugAX~C?X(<u\#/ivqn&"[/ PamULYztg)զ WϨړ^~' +xHmESmJ\ =Ov+4229Jq/+VQY|̑PpisØ;H'9< sDKҺ..A;]2"0Ӳ#2;)DF,E#t|GZ/oFJ ^=`>*Ѭ9>8y<읲+C,]*I+i7is0N@d`S|&áTkQOT%F }/[oP&gni P!oz6?d!AP0cHca9.䩴FP@9k3ã5D{B*a՜6ѫS5^D"v(R ^z@%dÝGq^}cnK6X:Ryw#9N@8Ni"28o!DI]Sfm pK'{iCxv 0P ϻP2ԝF(Wo[6,J@Mt5sUo W۰<@ Lz [PbBI$by&1Vq8I\u'tԖzn iP ɺpo{M5j|a8˅6ۛWjlSup+Qs1^zKQ d[v­n6Jlu"@D:_Gd%+ZrZzqYr8+ѫ&Ь`qLT>ݧxJUHM1;*",J/-)2 /u4^yиA.|89(/h8,HXMzcްħmabǼh|paBM8oVdm[pd.)C{  _eQjh +2}%ܭSf/T>|Y+nzYxIoPھ&\["(+hly 8{u$>di DЭ+MomzǙDHq|>e  @hڭ^)SꗲpQ+6z ղUx|ʼBwBogGk5)P[?纣:ڤ1 rZz}Sm)YEJ&[N .cr%?iQ;";qD| Jk8lōrk1 :.7~~T #O-W -OڇT0؇䗝lz,ޕ.P sqnO0J)C$x,G#4SⲗWEu[*Vy93`άoLE,N[;Nv`\kNrB;v唶yOOClgNEH+WG6f'^I╆xz wOB弋e8؏ri/ŦwU,:png֋5@g.tpe̿G?|販_D8s|7vpKr-Ņԉ Ǻ>:(ir;na"MjjbϳLpn12V+7JLPSҘC+zgUrP{jO\K?yK{w`7ɟ;%R_ ?aǴ5h_|m6au %[gIQߘ17嵊: ՇyI]h92,ϳRDr+{|2}`w!J%Bqfq[m2?tbam c0'r/&iRv(6_-FɤYTԞRۡ#HZ(qo`A k#l.ˠQyEՁR C,r⼗-O0%ѿ|a^l.άMe|*H ϦѺ`^En[x\G@-!OݣCX> ΜO!x>K NR9K-M̗x+{Qdwy&+P_ϊLμy؂ƺ1)S~[ޜ{T>Y ^qHS)stam (/XhѾ%@Y4Nba-h 7:-Ma뤟+S&mC~騍 4ef9Tm)=[ Beui$ ]Dd];No돊K.䟽וiZN5P(2>|U{\ù0c.lick0p,,6+nFyyRUS1S ZP&e(nJ$bρy@iL]+irB Mܮd(g,U }MxP9XщU]E/t?v:gބ,gI5ߔZ[+ /讯1PH)J3Lua? #CIk!XIf?Kou6,ju)2Lur9ڊh> F>W-|Z՚Q)ՎFY?w朂9W_NDKIcS< "'v<VLC+ƗHfPhPQJ _(vz6^G'ELsٴ MA7:IgY3JS\ &1n߅,&458I~Բ>=~#+SoSMvH ʶqGIe߅JGhgtY-3Tyr5z3پ\cg44xUJom=H.LfD.zcÐCY8TJh ٻ[+(9%[T҂-!ϝ^"҄!brQl6. Yv w,E87]'qGdd(at/%~E'^yqNO38BE I>Σ{njcJ_ˆ5w-En!&(3 fgOAC\ޘF w ᅚN3H}D~vffpm+FsEeӰjRJAphT2=HDUº H}މa/ȴMQG[l 7NހON5J7!VzVSd_3$h8TmpқwJGhơG# xeތS'ϳ+xة;$6+ oE&EUx 3 E2fA*.?>TAO%SC@낝)|wgl3eAy\w9Dyi5ě%kS]f&YlURsGvA`Tf)>tQ ̏#hFDgV8T. }V"&/Qrly@$X n-ٕlW`r-{Ǒr-U?f4p$8Q9F^\Mlᡐ1#@ t7<Ƥ3{ Fɡ(2>0Rj(b( ֠pgֶuŕ|T&&_mg ṧg巄xbLNyKaKg3۳זsT f~GQq~[c.E9 wJS5L_A櫩.CrG{Hktw ;O1)=ҢjLĤS4A:=.Ս;n\ȼdH' c -QF3_-~NLa=/( endstream endobj 163 0 obj << /Length1 1144 /Length2 6109 /Length3 0 /Length 6872 /Filter /FlateDecode >> stream xuVw<ۺFDuDMN%>a0FoQw-z/QQD/{AreϾgsǷyz7(Bbx q&bTсٸo@! "]8C,0pRsں5,@~  o Qhq6j004QV.0$舀à:0g ,?Ph-ȭcpG#`111_ P A9o0w %);VB nm89Z[n0^gk^$ wP$T[hMS|=őO wro D7f@ 1?[N-P/G# [nD^0 Ŀ` nZlnof^A B($pM OAE +JVu# 8FQLHa5 (g7xWƅ@? {J( $AB<tT0 106ce1?86tmVH`H?R* PP8 rAoݜko )sYMU5T0~ wt"H^Ԥ/b%:]^V-X(7{1^|/)pyIh~>E&enyt+`-92䐒L FQ1o8i10jm> RF>m$ rm-k0% V"TY2~n?mQnnŵ~7@|`G @JK;/xʊ!umW0w/@tGiݲ^gQF:IIdPeTqo_M\:[3c=eCU$J궼U f9)J1vb2?jZc X2!?LM9o?.9_(C6qg_++Mh"kJa<, ˁ :G(N"1#ˇBݝb S N{cd%A/u" aQf6ǖ"N s~cl/"CoribV$ _Ku #J ^qĄv`y*J+Ege-}VwR! H6GLˆ'Gf5w}L|B@cF4|;'rRh|#Sz¡KJQ>AR:gvYCqYq}ߧק" 7wm SkY)o^r=7#6i=hJsRN-Nzݴf0lW\Hb;XW?(gycxi"@_<1{dg,0uy`ȸ00Ȱشf,zz)-i{F?FcV=榈66X>%?7,U>%0aSm\>& m8V4GoRCi--t}F\˯o O-O}(rnKmV`W5Bqxl[ic\1xbVypfhj<Ww zɻ/chrX1UWr|~N~,[]1S'ӔE̒ #|$Ly6w'jmr{$Ƣ rp>Bk3)Š0bm+bPK4G_CDsutNqvL+/n7ruŌjowgxE.ټM%%/ wh}r7?7բA#t?KFH4drOzΠMb]AIQPPqS!dC.?24^DQ-O uR ZZ%Ժv X!uH}7[\٦` gaѳ|LtZ8Dӥsn$B>yI]-C"ͻЖ\UZTJinw7 [\\gj$8B\[\|hYȞVn&ZI g _gXlJN=`> `* XOa% ×U͌L1,3F:M CC-7wm @&c쓱 m}OhȎUB5CKEq9\ɠú/ ͼaJ$  "4+9IަOTic=D9l |4q{c^#JGxe+ǖjx3sFo H'}WMzOKXn'Be#(_d~A9մz?oŎ#}̭ѵ=$IENsisӃ(˖AGf afAm "ٺ&UU?V}&ֽkʽ/dԑ2\%,W"=+Ҁ-Q/d\Fr U♬:!.|g-9Z+B?K >t槊ӃF']}zI| onP(%#Q'-@Ƌ=*G0k }Vm>/Ќ;H^;c]“eÛD3".Rfpl3"Cav)Plʀ5[b0eG0vVd 'KfZH9!X튅mK< e.[4Ĭo[SUH*5 c\]AZIp.5i\3Hѽ6P>OiTMx{rܤRNM#;ϐžu/)fڰLv2_%}-lKȲ=9{ln~%a?in~{!5 uzY~ڳGJLCĮ\qlE'+n{E9Ep[ބ~9`_uu~>~Kʈ_RVXh'߇Vrys!&K56DmuVrÐ YUq;g@˹ͷ=}.M#;~>.YiY¾a/7IYpW ]8i{Yk5o>0n4Q0ERN.Rd1d%t^wBkZ{9c?hޝv#u%_EsDF}0h ygIFk%&A-iqT9&!&qG1#bHҝN"1t6x@kyˣJTνwUeZWt"to.N>2Oȣיz+Myl:[pVBXZ)G!N]`\kK5rz? s;anшN&ykM.*Vxf+3m7Ig[Km e ,yט˚[-ߵhB@H ^}4"-z C:sypݡ$o&˛GZFeT|4u<'@C~H AM0ýe įp;XTJ]pzbޗrvDpv.^֣ij564#^g<a]}yFkw)ʨgȇS9379FD #1$ok*ޑΔɻ=z.|3 ZiMaN y{o:>{inDOpPKqZ E6Dl@|" &YYyӇMdt>'e1\^Q iYY;5卦1@q^9N^]2¼y_{ NИ*س$fgW[k $P[r0DiCӎ%'xT>h݄'eW5FrJNW~6U 1y i/75v_vmK`eA i<؎orGV~z,6 SPtkX窒$,фUޡѪAh5"~!!a4MÇmdݑ^C ~XgGbn_?6ʸ?z_?'Z_'^V4W$P T򥌫.mpd'伓MN_N1@E(|U\$z] JWخx{KNh1a KM']A"%^yR\, "E˅gCZqA=HK}X>1RpՃZ sM DzʚXQNφ_?7nO-fk+#yFz,HO*i R]=b%DJ^wUlM~݉jqeRyVjEgwզ&JXZX+#LVyq`>ptߍf w\w6/t t>\\Q_Q@a3Wi 5I# DeޱZA&kb8#⫨6۟%:U(;SH% z EWWJ-krzY.KR1OU;%V`_> 5bL*(~={Ia@ tRzJcJ\V}uhl4[`*3m3˖'Uv'4r!V15ftZ4P,X/<ĉ!.<앦ydTPj@=n zqx߼3o^yYYfqau| .&}ǨOdDHp82/^'5[?afr.r090]%LBi$-by`dBzcE8N.N\͠fZܞ<͂$;`д1[RbTduȻSCO$ʃid 0{3wߧlROĈvj~A>YSt/Ln4a28Wk1aq#Ͱ)RXN{\9UԶ4R؉My4KΙPQ +/cQWQNBkpk&pC@sZ Q)c&&]68fqⵚ%V\&m䧧r_i9qX*'1a j񼴄j꼙IfjjѥoRd"D 2[$٘!WE=6ۄkZ2pxzV.3*$*(]{=8~w'cvR$||"H)vܨzjezBr6ij[d9cE#8Of~, B[ng]3![ 箕񲼮"{͔ЋەsڢbD>C 'ӈ8w|0wl|8; Ğ(nygCOR endstream endobj 165 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N7R$ݪ70W?g_,ɍehܬ=WWU\;;׺v7MOtҺ=po>fv8 | G՗_n}w̭][GL2sQ擾ݾk^!00jYV%H~~v}\; C}h{ϗC`Rރѩc~^ON6[7ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCvW endstream endobj 166 0 obj << /Length 842 /Filter /FlateDecode >> stream xmUn0CƆ"RVmk N7R$L̛O3 /~\k4~VzhO{|wޝn8O.oN?'uRG]>3dX;ҷ*נ_~vC̵:}W {1Esgq]ߍG@]dbڣH~z~ohTǰ9wxΏU]~NÛ Ju~*6{y~?xڰvtش~>ZjR˦YE3=sׁpuRA)`*R2$!`8li9UEХGSj043`4`4Ý(?Q  rt\e #q5p眛[q>x \iEܰpNMk l4\? 皞c:gN5^ ELOup3%M6`^ۘ1ل150ym 1F}3&ԗ0 bKl+֌>oRa Oѷ`)w`)?\֟agYg ֙P.L(ulgYˉx/N|N|&ٝ N|N'>cv'>7'>S} ~)>_Sϔ+>cR|&L|'a9i0K)cR{XTG5;)NͽRPs> stream xuUMo@Wla_BZXʡIW ld!fm웙7շĶM[؟McpuUӃsk/zfN꺼Ɠfn݅R^w}9qdMoXj_v}EQ>>pø;en>ڲ?`1&5vaj UkNAm<}\MxHM0}Z7WuI]ǽBnz/_ N{y;:ڰox\7nXw.kP^k3^Kյ u/A )`JbD>`2$`TY'``9&Dkx+0*NXXQQ3c w"]j~1F60aG+gıcW c rn q9Qܗ8% DMq.5Sh]`4$a]~9Vk ]8 IncT5obY:socsOPcYB?9Os֙3\Q.4ٰX3Z9#>^Z} ?L[ V|V|oV|3[: } B|)W|L| ,Y a!SMV,鸞:?8C8G潪N$ĸ<ޏ< Nuν_B,u7zl endstream endobj 168 0 obj << /Length 846 /Filter /FlateDecode >> stream xuUMo@Wla_BZXʡMW ldiof<ۻW_W7nzrc7)U7Nߜk]{7+wR}uN7|5s. )裮ݏk&8n~iyQqE0N[,g IM/*D@f`B9xczOpm`>W'9WRzL E]PwWqD`PދoSφ}= imX]ӷn<7̵^y]/׵Il/ܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1L.S5?׃[#M cL#F3X1+N978Nsk`q KpN8q )q4ϮEp O.5Ypc.Y7ь1O*ezl,d mY%0ymȋ,aYʘ8 xA} 3/Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{xᇣI^U E'b\o|s C:].cDܛX=oNܙ endstream endobj 169 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQիԒ ؇6jo73o{q3mfѭVOn/Cf)rtskzf꺼Ɠpi?p>fv8coJ?< a9(})suזÌ\$qATh L}s6G 7o],jotuþ{UןtptZ|MÏѩNN6[7ݫ ZԲWO&suB`ilB =@ )U 9yI(ѥ S*043``MSiv|kiCXc, pDˆzA:x0)ljsn l9u}SrI4"nXCA8%&ٵ6AI cMϱXS_S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7a/c?w:'dEgtdbP2ڂ endstream endobj 170 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! Ҕet md~[f43nUM{)^M.)rrsAf~Cb~w ;d}jUꧏɩ\g%󯼟9.E9-a t;S13g`Ԙ>0ܓ`†BF2g'I`2e=f`xՌkB?s׾G0N.۰o|e|lBpl.\cuWVEcpfnQYh|`=n a1 endstream endobj 171 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲV6vFrBbތf}\xM}qV'7t羋<]swrո:܉Ǿ-w$mm o\1A+Z7!؛~B?Fߗb n;nX7U{[LG5 @@N,Gw͡ 1}ԿhWWq}QEݹ-r*FNL7uY~~l+l+7tE )b,#TTHy9)9>*QKr7P:MȡQ^s$LD6aȑ*s.$S56`>ƄmÁ#TL 5kd}WXssc*{Rh/#? bE$L|ږ8^y>eSQc̯bV̯cNa'O;Q~{5pX2]$\^snaK??q FqMyc0=) &l(mi,s|d &\cV ]͸&ӈ9w{d :mB Ƈ\..Ա g~n59&\pe[N 8\4<[n6|kq_]~&)a endstream endobj 172 0 obj << /Length 666 /Filter /FlateDecode >> stream xmTn0C6U@"mTt@Կyct+%13nU틛ķR<=]tuUӽsƷÝxrN:ۦ>P)Εrus ~v?'Ǿ5~D !8뇺mRn=MuSxHiQ)YiH޽'w66Z,^DӇr}ݼ-w{s d\{?:1 kmn_~߼h!R,6ew*ؔb%k e+Kӄ$a"1x*s.$S56P>Ƅm„A Fs 5577vر׾+uaя6R:!,əCxg+ѧy*JcL|*m:fvui0ܓ`†›F2g'I`2e?fyx0j5F̹k#n'im7>T20P-9[A˲,p~nE8|p9j7o-kݸJv?ƏVR`c endstream endobj 173 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲVZCcYy#9톅ļ{3񼛤es^7箰 nn8l=hzI-._뫦~^JIu]f `tTsr*o8{&X,dew+mWos~X(2X.EiTz}ܟ^7uY~lVNMєo R.bY.֔O9؄b%9vsr(MXa#D$ar bqMDs!FKRLDP0.BEHQ#͸FuŎ577v}QȕanOd$g;A,əCR;6+ѧx**Ę$90q'oקfQ%n;5pX2]$^q~+s"F!CyhIh~CMnOf1$#h)r~hмj5F̹k#ni<7>Tsa>s\8s&wsaY1:+r1\ut[ZM,k4w6_%aJ endstream endobj 174 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲVZCcYy#9햅ļ{3񸟤e&Oo]&C]]Mq>zwt߉Ǯ)n.pCx?nڽVgx=itO"i [\l\WM}'ԭ̚t4pXeȉeU oq yM\-CnCW_Ey}wP dZz891euB)] W-\v\]~[S!8&+Zce"'2Ɍ5I@|"B2AQhSlLء28a}ɑFq5ҍnnbfǮCG= Wܢe$g;A,:sx l=NOTƘ$0_س/vЧQ%~Zx pX2]$^qnaK??q FqMyc0=) &l(mi,3|d &\c ]͹&ӈ9w{d-tx\ \cΜekqLJs?<@>qhx .׷8wl~1V<*m"mmDa endstream endobj 175 0 obj << /Length 701 /Filter /FlateDecode >> stream xuTn0+Cl m8(zu$:`K$Q4pufn}f)ɻ|tùA<]u6m;O޴\+$ޚv}qff0(h$iƃ}E>.>ttPRJ(:X/rߴu&^!3PZM5^F$o߇7 V+1ؿһ`׮o7qIݞO!Znz/~N̿Z䄦buUWᴫ\k\r-Ve\[3sB A `ehHiJ }*>`!â)dHUA^UwEZK5h"uS/g bρ#)p̹18yi r<ܗ8-pN(T1 PUF9a*~0'ujE5z4jgǺ4QSkj sE8-_ZQY\2=<"NNL>9fѓ@D9{&&gnI0䑱Ӊ3 hxRE"7Yp/hJXCKH eR3ə$Sޛ{cYrwDz~ !G9Kûq_nY3/Bu{XcD~ӺԝE?zO,Fez~ endstream endobj 184 0 obj << /Producer (pdfTeX-1.40.22) /Author()/Title(\376\377\000C\000o\000u\000n\000t\000i\000n\000g\000\040\000r\000e\000a\000d\000s\000\040\000w\000i\000t\000h\000\040\000[\000f\000u\000n\000c\000t\000i\000o\000n\000c\000o\000l\000o\000r\000]\000s\000u\000m\000m\000a\000r\000i\000z\000e\000O\000v\000e\000r\000l\000a\000p\000s)/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20240116171245-05'00') /ModDate (D:20240116171245-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) kpathsea version 6.3.4/dev) >> endobj 156 0 obj << /Type /ObjStm /N 37 /First 306 /Length 1744 /Filter /FlateDecode >> stream xڭX[s:~W豙N͗Ng Izȥ5M'ė4=|@ շ> Tڄ Fi)>ħ P/G+[A59A(E{¸-;Igb&1%aanp&$\`44&5N-2-"peLB-_!.$"B0zBAa>шichgIZZv$Ni9DR0& %Rpԉ#4)߁۟ EG"oQ'k_s;=z߸AL^/*4iLDn녯ۡ@8Lc ~@7 !GTyYC[g{n0$j~ fup(37Q yp. a fD9q(·;e||hf!UHeYF(77&څ#8O(sƘ$L,9B(X@{iBɏR (ldCׯmkA p-lFuzI:\5$Mas1SjϚWMOgnn:y{͇i ȇZ\S1.9Y2c1Vg&kV0jmRKb$gub_)Gӑ{)36O)I^T%YTя?=9>;:s&~&k[6ͥӇ38G帅j Wm"/oIov±L1o2Q F*&L84LTe)q7C,w|؛†FR.XW-tc=EQ)vJU,Y:<nxNXa&6b8>L#|Jʼn%r߫?S8#._l#0rGU /Y.(H1&> #E']Sx#DRFxX=FLrZ,bx{*x}ɹvF q< ox0} *|`WUĖ@,íBWDM ?ͷB+7?LJ۷=yA`-2{wo½no]vGM!b@l]o𮪗, NM||o`EhkԈuv*Y'r uЮFʝ/au˶eFr!+R("KO[MQ&y f*]k\.ǫj\G䑲dJG/B]RX!. U^:+sJWf6\Qk <4583D094D5BF452CE29DBDB1CC52F94E>] /Length 486 /Filter /FlateDecode >> stream xNSQA+@[@j ((*ȥ11QT0701s@:0:5ơ ?gӜYy31KO"Y;@PYOmp}T=4k{mYkvNZ&ky@̺4s6V)V9V%ր*Ǫ L14/Y~=T3 0d)24qJn9ӭíaTpC[!rV=pz~n%Հ[gJkZ{Gm B)8eP' vasp.E0g~efRS0UWhun˺dnp^YJomJ/ s0`a }MkOT+IJj}T0O_3O{*4;J=<~OtGf?EV" ZK*p=h1x,򴢳-4eOG≗?kZA endstream endobj startxref 228061 %%EOF GenomicAlignments/inst/extdata/0000755000175200017520000000000014516004601017603 5ustar00biocbuildbiocbuildGenomicAlignments/inst/extdata/sm_treated1.bam0000644000175200017520000014560214516004601022504 0ustar00biocbuildbiocbuildBC]j0`O];hnZv+VA.붻hP:/?PZI@&NHf/fJ'KB|ϻ s@w;uf7<ߣ?6boru<w jނ[4Zp܉:1 x\35J*lV ؁찄Oh!y [h{{d^ԡdJf||߮32BzΗCvn J'DcnP'[݄BCg;}{,[ZS]]U^ݧ f~$nvL`FBU`WcJB!$j5ȘQ j"FQJ`}VZUGg_[qxQ?_;_X|-&g' (uY/~ҫ֋WCV;nu %Dy;ys'|e0_xx(fLJvxݟ7t_먮3] m(6QCe ʣvG*WUY>JK:1_/Żŧ7(/6(aaxu^.Œ6z(:Qq]ooo4xA:̋0VÁnJza*ʏ`o \<;k>'f*S49F!H9,d2tkE(}<(IQ2nW۔eʫ* 8'n ޽_ɸ,KݪU9wa;(OODCUU] " hP׋~=U ]ygAAA!/}ƋꋱVվ~e^up!9}4/p$b?K#Fqa 5dAJDAW<ϔ9$$=eEK\N q^:SP:!=ng$,r=P>GoAjo4S Ŷ:7e=i,0OeUaZ(x6LӜ'lks-G^+}Uaz oQOR:R۴ 4E%~ x3z<D0@Ƭ_w4PNs ^ 0lHwz/g @0 hG=2+(0 CI,Yp`CڴAQ 8caCw%-7`>`Py]r37 =o:$$oA5r7Pwk1K{7EnD)QVn_Z.Lr%ŷ粰GQ(,6E`#Iq{Dbf)>|"ŘLtW-1t6{&$:^iK|eRČ<ڮvltUO@?)tߒMEs ry%gI&eE'+O}vJNJ4L=GF_sAǨ=`jp4LW#G8Ax3B4(3CDx`@ƾiNMȉ4D!o6LKBCE:HAqb*\4znCJ\xA)1$Ƥoɢ(pn~ #E$Q>L؉e)5lCA1[pz؄ QX &L27$xpb; 9&5( @-@f[W/W؈g!z TdA; T3I-IIj$@CQxS]ST,ǝr(8dhaY=g{ NgE8D bXXBs2sgpʐc`؉Pvj}WN6M>:܏ MQ:x8GQ;F: Y懀һ> .QGm;>i|S9I8oBT*22u(WQ!('1_1_"GM#1lOAʬss8P>)3w ShкG$:" }- '_pL3ǘk)9$QD1\)8tBסH v"FQ Q0Y4DpS]2UA}r(C C IEMU  ?;Q80 ÈrID(C Ί8GdɿW) :ɩHɩ (Ϙq`rJ1JWc<},PAEmtB1> UBPjМeN Oa, q-Cxhv큝S><,-U~GKMݚ4M:DY!:z91@P< ؞P,O(EQBUw@aQC:PDQ,|>Em:1,t>e* r) r ;jڜk^3v%CC:$4}8G|+:Aq8s(]O%s/a'y!6!'M}f`YgZ\2 X"7Dte9o͜zďYx1Hj)F|ʶ:8GӌM4`%ܶK1a[2-(BY2zcr}Pp6,û?1#1U jq4<ټG 4"o ^ΔQH(.j9~.teÍ[yd /_몚L4u:1M>kΰ/~ZNyjkKO oL@e QmBkHȡHR,d%NP؁ >'#`i\=1-0c⁡y8}ER Y^@Ӈ7t* O"^(mڗ?s9%|2*yـ F&'dچy5Pv֕?#e$͋1;g,~ebg$HAGaxxT3-]@D82+ &aY.rnĘ,Em+8-Ĵ 礸") {QupU?aPwQd21jO\L;֗BŢVa }Fq9~;2~W](~S6I5m.0b$2 Y!+ C.bY>5a&xކ ;YE'Mb( þA<Zg@8dj $:ҔU*ŀ7^y,7tYn tfp՗I+@\x XU~QrI}JL&w(Fgiq>_|;dr8 ƟM\Q  ]mR; xpzo7b ,azR,E}=Dt(饴8`hz7!ԆI`Qk& {U'<ݺuE i,:UܳPpc^FQ;(NgIX;L'dfvwH/01ԗ-%ꇙp/z6%u "xޫsdbt+.[JJD RR,xmI0 r1{wKqtaƌɪꓩѓ:.IGG`׊v}*JCW0T0Sޚ nG8¦n {C4mjuݢq#)qr vgF۝W;ǥ5kŨgI1Eq$!X/7 ^'ף3rnYC ʃR=? u"q%Y^FNaTj;)1Jw,\UDcnR߽{rw 8]5X&p"`_?Z6Y|}ֵQBc_->[Qo\m{L->Oe2]RT !euIWVX6R B{Tb"Q%um\ 'Y״(3x(.1Bh]ۑ64Wd&j -=#Lf-c ;ESU,`~{:z.!8n8,IyO1 p$o S \! q@`3A^EF tȬwQߕ@)0ļ_3NɣWmCfNX TG}9_-qE׹FEW Q!Vct_ &t]QzH1g\Y%DYt,f(8A(@r~@MVi؍V=aPھo".96ՑniXbZeͯ;$Fgρae(%4]!1-2(!2p"i|$3-^EO=)" ︿(LtX;DtY2"KrDD͘EZ1Tպ5~HufMDbhgo Q47[͙~k:D6OMhߜ߾),  0`:X*q$I}3kS+ RRsF38udJ'RHG1t'}0=h3HHd[ )\: )CNjqD<#n:N]ӵ)[\1E~_ωnSEAy E~)5ŐI1Z$$"P `xuǨ?+sV,:~֎0!6Shk7^L)R q1Dej ( j~ӿfl>ɥs)TXdq۾M 040%XGDT`.Y[E='k !5Vl|`ыkQF<5lvU j\Lt ra)qt}('U:FQ^۶Є;=݂QQ-+RQJZPΊJ,o|= Ǡ/e?"eEA&jӿB1  ?7+@1vE٢k%f{?*%' D'1g؛ ~jWP$Ea$CfV,)X8Q:C8bB.kfdIHi'(C ܂k/¼b=pފ@{8UI ֕^p7EiNE= ˲&M'( 8 F1f@l;j ~)QuUc^QfESs'P}=4'x aQ3?kfe3iaڔϣ:YM:?.%.B?D碬Ѷ5ϋe !JFh?zWblhTY C Q_U鿔IOBHbƑ(ؿ:ȏӌf}81tǘtOyYصD&0ӰMlS I"waN6qGtQ0FPi;UĘCG3JY8\~'*<|sPN="X'9z! U"3H7XVBTVNHJ0?J"3T= s8Vot&D&g oC)Qz( >TDBlhr(lVGvQ)+:ˣY2F EnS#??= ,tpP޽<]+Gid;,/rL(¹iΫo(Kd` &ȹr",B0yK,pN sWd)"W| GQ)JJNBXgo{rxo&pG-Bpl>&NM-b jPqȍǝW oz]E'EW fh۠z0>%u АMkuu'1t{.oC'b()z=%7#& |W{obl=ql.-dPGAJ.)[ לL.ვp tA@+QϺ؜[GO:\tX[/XjEqHi-e͂HN03y(tQ-ŝ1jaAI-(;؛JcҢT Z`{qخC=zZa@tLVKϗb4(P(mWg?t0Y*SVo܄H S4=Tp4Ba90IǽD#s&7567BW_"?@NT@zlA)"ɊSD91am' !dr(RP!)/@Vg&E}œ|) .b.wx dJ& G 1^ g/xq LQτ'="G*QqxM}DǭQA) IӬQ(@pc$=-H-ZO&m&氅('1K/"FfzhW>RoK߀u x\ ŗJEey'[C#]Oi0A?*eYA&AD[;[gC&e`EcRvJ6W,خKlw-$`دT<6OcX, JOahP(0!6V#%=R<+&.:x]gAXoOI" ߼Ip7&k܉gu:4&_L/E&Y3Sb4dz67`[$ox(fk$x"n7/xWbl2C* 6;8$ŕ`֒u}z[6mQri^qTGؠxMI[WT!F0-]@TA Bi9)\,MNtm4((Fv܍z@Ʀ. b`QC/W`DpgLpk:G5f=~ q(X+,<Cak61oU/M8HqEY݇:%0Bq_'gfw+@1R|cb]5)@`Eyѫ;rw#p|O⟚V^1]{եfܝG,螄 >дyr,tN e ޜ̊`awM*@'rXMvUyXQ骪ް{"&-ـ'BEZͮM*qWWUV((%4!45gO9<?oۇ(px,ԇ %Ih{~_yEntIN.DA"3OlضXsY7lsR<7l `C0;2 /0X6pf8,b6sR$*?g{'BTUWϲ?/AGOFNYfLF,(KO\.25P~6 {!E9IȺ f9WXTu=aCUl\\$W(/luE w$F-\p4A3j)s^j5w燊HĞSMQmJI|ЗP Wu`@kDQk7" O`߃ nh!7Ez͋obT`?ߍ'6A&q llP$k[JhSEJb✭s!s|q֫xc݂{R k*(ڟ8Pbp 3ǚ;2%わq(Ms3 4qvP?rEXI|̓-iu)dᙸɁ].ϱ8( ohQf@hd1~C!Ax'[$l iFP7h~rJQ$1 oʝ騆1%gLa7W<(żb4xBʕ(F>xA|krz ^BRfiT/~SQ{ ?uU϶~\1q/bTqf)Xq95j"y"F}ST"&[ fK@u`ysZ3IƣAOc*qi XhږsƨaǠI1MqXW&PkIql+ѪG`*l %5wN+)*Hs* %j~bEa&"OsXbssHHs<0*b*bPxg(>϶rixS3y6ⳍbDE G-jC5i'i0O`AtvmK̠W<&+_șv\6Y$yX =F堒}Qp>"a'AppϊiW hHiR4燱U5UB3un4U@O+>]~AY3E{xS41B03+10*RL6d1H-PDXe ]ukP-'c4@@>Ipcv=Aa<),kƪGpCsg3l̟_Z~Ląm";<\@aJ*<郔Xٶ:fֳtEuk)?x)31Ǟ5p+j?C UrsWtK3YIؕ~

HH"4x).kuַ7AKӴqo 3bȁ |Ӣ?S~Dq3Q7_7Q|w Б 6"/xXxA.9,[D'ɜyAϚtT0h_tȝc*h}JO.$I"F_c( X*.!A< m!  mN H .R kN6̦7Xi8W+|YaPTI&(6_$ T2*~ |t|u>,57ҊGKϖ,=9:.Ofa>134Wr60!Qw},'6KR"Xuc8֍y&zlxw'|6մoO9Z~;![,=ahέ)P*n $>,l9[L_3=HI$f*'7ՓJ EWzBLV+~'yb}p] հeSG`X}ZWR٧}\@`ӄ$b"&qCFHh=ybyNGm\:q&13@&DqV/~@i6PE{סHȏQ3& {0:#̉Hgwu4VT5Hрj8ʹeLVO5 m]l^WdEr瑰uds,-AN Z`V芘/%bEsj@l6cSχkImyh0h0m]J"YBkZc2=BPq^.zMr(I['[o=5'(( QsQ=pՓSr?>)N&DYע` Pעx֤vɶU'wK\R9 )ЀGw<M,Ŕ1s) 1cW^RHW|6_8lp,,Y<[vc8AƷBUrI4o=Ro{!wQJ^LIꭜ)fYMu?1 rXJ{KūhVŮ:Pb:+4CjʷA'!(F?uFe^s/%Cߏ"*@ ҁ8&*ZI\SfBޘQ :8 ]7W5O H1L: 9)Ada C%QDy5{SCarZDEdPX֎xc(D}"8l]WCmz*/N盫aB -nRNRA|@j$se~W'3v/6RΔ\\.ZWQq1Լi $PdyC߯;(HcQ7da+>(GNMro@+&F!&!"E@a4P$*J@QPHT~hk`XA"!+L4Cipܺ6EܛQQa1 laJ,%}nȥ&9B ,"e_FoN ma"y [0sM 5pBty3dQ&o+`aBf]|lO@ O؈,Ub^{Wt)|,Cձd?TAX݂tZO[EES-Idh_$qbž'(5{̹C _w㋤GPDAܸ"aYX,}e]ٮC`T$8 ߘH݂""rFȐC!k\B%,AL${j qZ`]0R;`u\/+A9]]w"r(Ҹc@aZ.Lk(x}ƛh0b8nD\iM֞-өb[dN|\'`SēՆ1[޹ =`'J-QM>t_Ị" '֪:2apAD&AY煃wGۀP`@vBQ6(6 ܦFtA$6?Jޱ8@ >֋Yq 2У(D 3:Ko .z3kY`(Lr`pL ,_ǾF,0!h-E@&:nuR&ŢRs _I*Yxzo񸿸TEqWֽ_&; 8k*Z:̰*Kxap٤[%\.ExF^)|>nū^ f$E %}ugM˱cglR*"?5x( +0ҳf~Mn@*A(kx91[:](]Fig̽GOFj)繐Wx]gEeYaٳ;3i Qx ;w/WJwIqJ qcQΆpX ꏯ8&0 y` m^=󼌦뎺1şg!:}²]#@<(m- ()+QtQIopTZ'!9#gamOaؽaDOJmoxaYՋkQnATCQ:,0J(ޕ|<տaH;p\;HYa6tEWKUR/'Qb;>1 ׍5r#+td%1|'n8@QTR78}:RzLc:lui0ċĺ7HBOA`UBO<UOI0k[^ԡG by8dʂ]c G|\* =0>Nx oK^y"p7_+5QMw rJuۤdfQSOUIX8<d}*YĴ⥢/hR+IQmvݏ_b.=(ߔʁܦa(K KPЋ'ד>P^(b(#҅K-׌aW_G=Zy%59hVKz3r49f/tx1¿ |b{% XԶ-efm&Q* p j#1BHDqIeAxFFYΕ؎hz襈( $>2@5d'/2PHd0?/v >ka~ae 5Mt0sBH]=),HAѽ$l`#2⪗{"?|+[zs)ER c>E,.I#FU~N?+4XuMBf0C{W~ZFG &bU]嫽)(`G! ׌F~%~ u*v"6wݶYaP )ZEgqx(P f \YERX1nHN<̒,PbfaA*v[4Cx^| ($]f]ڠ$(w@{U$i -3 fdxS(.?8 kA9 ?8W_0ԏ .f$WԱeuJb4P*\!NIi 240 ?k[AQP%Ԭz(C4Y}Sԙ^}z-(OAMJ]X9!!}X BbJN~ -2 8Ѥ]!JQxcuȂNʂ2I|DY)2Y FJ7IKw779*  f~*dfAlrxBlU(MODFy23-Fq+ŠBHsMngqX 0ro^qfɤxxcJ õaD8<9a n#D|C U ?XI(*E.|ta%۽2-x?@=ݏ}LoB,08S@9{H޸Dif\R鏿QK¼pf Qot0go$^'a(=9Dd ^6}$0)%L 8.qSY҇SN Cpu%s9+u,C쩭k1d[Hdy{b48OrO[([1]-(C?ԫY*N G8!tRDjq~mͪt){ų2E;kq`3 ?r%L kYp, 7lQv;_*+߄ShV'ج3u /"5DBksjYe"l`1_xS)V]90WQa鰕:Jﳅ Tl[( ȣ&ldڮ~ł8Ho$+c{,j"W'Ii5 '}( Ca3!o E]8krqh,Q, 5J A 4 2s4BFbÑF>+(+y *I"ʫr 6S0L%S?gtEGZSmߑP&i)@4 Ӵ.>iP1QoM2+A=cǞ ɱ񍃕hN L.69F,( ݥ4~E8 d_.ң2?|-=ΦL4F#^fG8'jc5B౦c[@u|W *"ē9Zh^]Y3&~qS4{P`ϓ@Lj+E+JEzՓ"8. ,,Y.xH Ƃ83,|ʛ ò uRς>ү%.@$*Qѱl"&'F)rqrp;E!>%o50ļ4 rX&b~N) (m{RNgha0ܧ|zuBi=mT'5GKb44 6ݝrF 7gl40\}?#qB1SȾu/X輎ea?S|C"4(3t r)fFMӫ6oEqyMr~xCo:=6?kO4!CG۬KbXֆ<b#bb}qwQ]jw EYrqLhSȀ<,x:«l@߮<@%K/&DKyǟ1 ?(1Cql<ֻz[\7~x;5,(^]| v"n׻nZ7wjTyf'o༩yZ 4ORD?"u+,Pt6ivwoC'6ދE<2 \V7ݬ݇]OMuxk-:DXW~ na#J hnw^/nux\״~ذDD'/>Y!RW4fy[ÙoAq1{-hLY3ӶGe]z󉊄G}y(F.ymz^mn_ܙaž j3 ΈǭZI?<j$y?=6z_cZ"R!wO ōqY7D/.YE10u5Zѿ@"W8,+>f7 1; [㋒['2>Zå_輦ؤf]k_? >b޷  vs7b}{BGk~H@mVb+FQ1m4cJ 9f2/g Qւ9U]n˧ xn;i+˯X5F(0:f6.mp4ғh2|F@KOR [{ t.2Xe7 mX{i"<3wzo!]:<b b\.bٽ{? Dvv˻Xα`2O ĢN[C|1=>{8y&.0 [`z۹|QkW5V2I"/:Ɨ;կ7ހvHG~fmL^v8w!/Xi (ʳb\ .\wrﮍ#.~hl`:4fY&4.Ow+]x˴tƣ>W}$|t/ mMi>wא1z/杩9oU5Dv];E]HЯ]i}}twא`2Qb^Xr'vΟrޮv׻f<$Va?~ _rd>&eats cXlˎE,%?Ye樑<|eO g^>__9SoS˹^˃eS(l\}5*=$oMcrǛr̀-8bD[!NkꊨD <nt u\7..OF2B \`qT#kXO~ÇqkqAߜ"Sݢ Ȼx#>Y }\l?n!]>46tF93kvۘ *~g/^AU^~'lGI!=b݋Lq~.iqy].w'dC:~r7: #6 Q_x:E}zy|o݅{}=X_/b|?>Aǔ[` .?3+fV,U!Ǹ?]Wxsټcc}R-W&,fA֑Vf+@p :oivL@ 4xl8fuJDOhQl)0),rvT]xܢ~q')ҹrq<Qcd.5踻U,j׫D6҆ ":fc rB[Z}/d:R˱C n cKM&s}jO//ŕjGUᆈ&$t#:d#` ɓuS9m+龯*ȕF|O>=q|T>"w:ֲ5o549, hjnJddѩjqѕ/jQas?+2]#{gg6#677zyg5 {}sn;( <[FcFx1X >um>bsɜŔѹ6܇>)#ֱɈcO,퀄SjӁ{2 OF !&VQ$4:}T6bd4/&kzY/:sűS|.׻nyq$:6ŏ)1Wz$Y[ƽYc5_AY^,bgQWKȿ{==ǬYV[H1toyCta8mckB!BŽ8QGza"ZJF/@:̠CzKW$rR$~!t2&$M,M4hfV*SyJng)D$&㭖W.4AL J0(VR(@ Bu2+۬&넭~CzmIFRN{ڔR-&N]av 4dDఉ6%:(#v5şL ?*͇W뼤஥r]^(jH@ꍾ?èRK-| *L4%jkD~[x=Z4|n"&TA$TnhS}J ]+,ZF԰aD Dk弗+Zc&2t'2 Ѭ (Ɋ;tZ bfȬs#xԸARO4pb2;~8jO)Om +r+wp/N 6LXŠ&Vԭ3Zk!b|~)jǭYWe{V [c&f&~7TeEG%yI͔^hp Y) \N"Ԗ@Pc,.$ I-,㠈C>Rc>%h$rbJ܀=SDA1{-h4벟H[?<*OTBLHBś(czIA5->P~@IbLVs3x+l!GaxSbẸ;nÔE@$f}) ]VhQ01QWZc(.Z]|&TgIa-22@mc:U75dC7|qbIMc@8#Q[!Ap6)7%&KrOJG8IVz!􀰾 1d*MGtdF֧ͣg Z꫌[G WH2yQ[F)vhFk(T ()"1&KaϚ8x qB>A bUO*xhlG秢b9mͬsr@%΋/N٨'; /eϰQ)wŒ1ڑ9@54$dC܈O͞]r0GhQImuȹ%Ɋ;-Daqu)tb?jԜi|=IٶqزK8OL4nLM{RQ)ÑƥЏPC48gG5twaqʘl Kj1m:ټ~FTCFXq#>CPͻdJqq1ݵkFϫYI@9EaGJdb2uWm%8+B 0M=q-æ&?5iHrp %8X-Mv^C~\lCHŬc0B*t A5EPҌd[yrם3/ 3UmlwQ ܊S*ZLafav6ū|zM!n9/ԴN UpbWq {^/WOv&Jmg@D҂'84И* \8Y9#'7S=(&ZygJ|?}eo+LnrBTʅ~W8uk/k=+qw_guf[ݽ > Ag+PnK/z] NeHH (/FeV1aQSWԥRIy8_$D?:Q1өLHo@(R+Q" ͬrN˃csRXEhXeUF쎀}ٍ2}+2'E*<ײ\]esJ:|ċ`O#k}]Xw\9n#jD~h%d4 `Ag,eWndDW {t<ċ#m*#|h Aq{!L>,F5xS_C_?>џCqxJ1S {f[{=TV%E Ѳ˪ӀemZ0Ř OtLH(!oC;R3_l˝+pbkkG'J(!#*;"^^JDEЍh.z?U<"llp.1-{1 "lL?uc/\.0)#mvjj2KN fN((4da4$Bd3ivp\"0"/S.~̢ <`GD{3 jZt幆̰L-#+!&#a^{A(H[LlT#NQp1Sw{Ieq5J NdK$(c4h<QFmAMs_p&'[6Ve2zh Pg>þSJ^`KčY[KqfS['UDìNr(|5&CI"ճv>d"żӥ~ar0:CBx4"BMH-jl8LjYA F4my3IY7~fNeQe߶$"p&Ɩk՞kv>~&2kX'04Snj6׎$ =F((@IdD; ž,U5'wA@U򐧦p-1ub1G:wᏆl| r~(NAwd8k, թ,$*P|4P)"jQbA/;>Q֔,5a愚p캼ݦ5'\F;$ɕZó"S]]G6m_L(A*G_%4$}`c;ZQ)ed6N//lbбaSv=tN buu6xW2O)4x'k-?OsOM~aKFq (8NO.zag%~9#u-fw0(7i: x6\<~Q@De"pތ!#s,s"ՃQ~Ikc9 Y{"Qcx5}x|b;3qIzRxנx_՘Zͧ*~GI]t]Dn Lrp~VhTD 6^U?2pQ mb8Kp&qրU t3x[bFTYסQ::(s^U+M:Y0[,m!`\Cӈr?Sš,cİ/a1@C3:xp%-q}>NHCO=mTj>2IǞzQjg <5?+(PB>s~U*jy.Ñd PCoV5/9Y$O4Thz*:8V*{7xBO ̄G9i8&? B֫v a0-.Bxepvt&zed^r*4?}>QXL8L<4#˒="/X$wZ1! IpÈ HYZw"8n(e:&=6r~9}=T+0$)}]|{_ D'}4qCz Syi9Mg8ᕡSڧd:p"X^ʴvAei7eԘH~fG'/&)W-ZRQ0M~j׳"JsO5ۦOl[QƱ26M<>h8c{d`F&/0 ӹ" T4D"R: FtQEf9F 8m۱JsD@\ ik}d~*]65 )4)(or_E^ISFe+ LDn{~$\iFTO~Fw뤇 O]S뇲{5?^OkO=?ɕDV\]G;(ln^kl7O2pLBJAo "Uy&Lw$D Ѻ+O wdWzt&O :穬 (?lxFU1|D3-{#{ĦOwy&ʡ [nco2"GՐ°yus~0xE,!ڔ+ģ]jnfOY& /Ă% SdHv'VgtԝGk݆aFfqx\FBh]E}D/  Pt$cOM5'Pjg˚e(LqT;Lj`a=_9g7}raG[׊Oйw$DY*edS;( !OQ+cLqC6H:wڎ f2~lOKCW#_<3)G@^O e0/HNSN4:(rL z(83aZQ֌=4{[;WkQyep-'WF{$/"#G=4}(=Sᾏ9=%IN&W[V̐7Z߉̎ܪ023_GZ-3HkQ"QaBJ>(#/T[6:q̒Ԝ$JHz=QkK! q\ؗZך&=/Z$6' Nr dQza]45:3 ;VͫDc|~Q7DiɊ\ou#Q'igd gAˉxeėݚQeaEf5‡YEl "UE2y}`ϗQ v/158{Q^y/3&oo( bϓF"{1,?-;)j (SF:aOF ,QR {2,b:e}[k,a@I22>OCNHi,6oheD>NVtZWjg'S FĶ+Cű۴F ,AZHkPԈp9.b4h1Л;&AϢ[l|(X>oBa1z*$tAYQJ_O Lmʎ^oDgGg$Nwpigae.{1 âT=Lz1m%ⲃ2PL&bE\UЋwDtl{CQ)&6dik<(cHZ#c6Q XH͟{Em&8 yHwƏ>'!R\͒k?(!zq /ӣq+C/('EWjFt:w $ /?*=yVnQPi~UFDxnc 8˹Dq2!I ՏH}z{BDE!t#u_" t8Si?dy_" EQ_L<=zvJ<fikmᆚ<"?Xe?m?=f3HIA)Nn(Fi &,0&xu[g^!c"2-Q%0<,IPDyZ9 A]WwmEuE-o -z',DŨ6"IAɈ? +BC/Ku "x\ܮ:z $޶nv(v)?(/L/ԐMZL7ȡ#a%,Zȥw9 .2j.X_\~/|cGϞ}>/컋 Q&I-D_>H"KӴ6C}>eAG(HYH&oq}82ʲ̛LD0VhJgj~#P*-;=z' Tl|L(>B>:&~]?k;}uViтZNhp1&Zh@Te1/sJyHx@{BiiTlʙE?2*gH,1lF!QJɧ)5DO'gͪgh3?GZH(乆f HŸI7$NCؔ0#_냇$ҢHҰ:6(dk$g-&ϓJjE|!cUԅ0q!dˉ <{^ 8_@Qm (E gKl{y faTY54Γ{f4|G^`CG2H11.,J\EQ%ԧD7e_Y0t)KoS01p<,H2DȊvBTx VFa /zHg52bUeTE"VF7z"x<Wmf+[m!QSMz<̢>GRFeMj\5ʜ )u؏q%H<MY$hEhߏCu*/"ϲ2+("XEo>9c N 9n!ZDme[烏7VO/&&ϻͯoA G ꈾ= "MVD +x#}d 5T̺Ӓ)f,풝#OP@/fIW!CX뇔S؈YkEb ,);j3VUCJ!SsVj5521 kVFӰ.< l͆'T5IqBʪ}G!2URyU~WU(> uǐT&g>p|˃U"DT:?vcAnπ`\`h>>DY!Һ'u/ MI ;>?]Fj Y(SHa"U (/&oN#R6I%?r,OTۻ7LjBDAY2L{$h@&Hg: [P,_vIM56E̪4Ijͦx^(x]nr).zz-cJyia|3iQKI< a(J癿rcȊ7,'ںW @L&@}Ry!Dd~0|=uE$*몬À'la 3c #!!r"Q@TTّUe,]TVMT2UZc" YʣoL"/piOw]ŗ׋˔++:|Y.Ýa0~w3kL~4!lTo1oDʒ-;@TUmY(1!)cZhh ˢkZ4"o.zO۟}瀤u9})"m.c8qe<J`>?YG. ږ!zԼ6v<__ z#IBQT=f]JtyW="iD,;/ 6gY:Sj5FEmL{XD_:DV嵎uG?򮢭f6Z2:OAX:<&/+eAv3 Z(O;KT9qYN'`t)Q{;HD+ok4A26ivŅ4Z`ljoy(Q> p:|!5lCڞF'q,O)zB8cX[/<y"i m^Zz(^ՉgO.ʪ<\()Vˬ46yWa~GW! joR_/X-'Z r~'?$b~Rl:cZOeRy=AX/Mح[Ȯ@3.Ã(t|BT5i 7 mU{}]Q<8]{#&=ŷ?gaQVWMS)2LDxWI&EQ6EנGVC=ꥎʬ4#׷//CL/,XQ,+*Qt]eB!'x v nˉDUMfjfl" #ѤYef"a˦!\Nu.ĩH|F>ќ۟@e=4 Ϻb>}eAqoKG4glDϤ~^ !?SL.'ɓIzkSֆڲ6Yo&&Ě֍ik~0;ldx~c!֩:\B AkO 1OȄDƻti7IQOgS ~cXjV)T!ʿ6$Xf, ,1גЁb;_+VyVL%ꭏ$R'Lݶ"aw; LB5smG{!@w8l|ZX$.[+k&4(n\rP%CN]#vH@v;io(%K1%2|EHerNj! {1aJL:eTdE&ʪQ؃)r8ZAQq쮒OiQc +e)Di&,=(=²fm-#IYQv$ةB^͖:ak9lc&#XT"9}L5QZ ZQTwlΔ m(ee*D'@:SMD" ÐmERNe>D;H2F<|QץDX4e%A=K-QԛiNA¹L̍U_R:|6fOdρ<^cR>+0jl2&&}CZӲ&&hC a'"~Ѥ}U_coqυdѣc%|@D?d$k*]Hh@H #\B܇ J+lI]H« 81q9H@2m#vR@͍XL4xf( 5Cc z!w.Fal{QVz4_FnrƧC4wtA/\j$d<m#<ݖ+"+r{L{kgIP9/dTWI5[hd/'*Qv˙DAHvS9xx=Q6uS7[/ r?{ Y=R' p8zj+2'Z7Ina!C#rZAYc&;Ҥ)QNF۶Kkjq41ίtasÕb GB#i.//Ye1gwO\>]f[DcJkkFcn ޣL5zgxBza:̷9H$MBzlvb DY  B[~,]6_+o!EA`r ‘>6le\IQ.D H*[VGjDuJ}pZ,ԡ4@T׵pklOU-=~uY(gu]ԩ)9Rg1傷u@KDTUnNeD^ϲ9$j7j_h@dciM@$&mYFZRY;D!#"¶ <ֺDjDBq@O$?j; Zən*G%*[Ѩ nD^C=EgŻHjvUgO_\{}sww֤͛Z>D]kHT >gcW9h[..w8/j珀LG[ i3% ڋxav,?\NTBk'AX9NuZ6yZzSn^95,}0 uVMw󩋌6xU56Z2qQS7&1aW# mp(r"QyU.n5F>}|rR"(1U˨#WrOם$* ^k3뻻uw{"޼zO֌ں!A& ?ߛj&~Vٮu!lf?-$lEJOwZ|a1$|BkH~GD[ziʢ~L~t6me ҟrƢ{K+ku "01u]D E lf" q'Dhy zSsMub^ubuseK޴jږ+? DsP#bOmy "6Yϻ",>5~! 9>;6gWiޔPRYD"&Gg'Φ~~Vi)dO4y`](!λ# YlZ&yON]KEE<";yyPb"1`>z+dEz4NyD!,Ȥ}AKivZVMWn.D8(~OKd{w9AD9@6AtՆDe!6.;\o3Н6.&ʓREa"bZ~}0 :Tgit&8 86!(^F P4/(:Hsڄ ݽXҦdԇ"< 2"JLd;G.p661qǃ}aHR;#ɤCxE7u ='YF(4]l; 'N*ew^@@@dž ،&%{DtޱQU__h\ڷDlVȟɗ:sGyږ}f1Q^WH)]VY]ڐNO4`:K #R۵-}GCd5X^>ȬF[|˴r&ȧxo<ÖK.u<YS]#y:ég%OV%aWfr{v̕ҟz)sŶ2+;$?u ~ܗ+e<\Y6"?y^c9O+-O_Уq`@l7t\WkX:V#!c׎\\jddO ,}K#kv v?}`)/#\wD"˦LO >8~ʓnvL 5űm;P2欗Q5u2 3Nq DE UL=9BĮ {'#Vʨ,2ONעeؓccٱ.xPk/yzgF\Pm1 #K:-*^O3aG| Aϖד vfȳeO:ڳ}<`W!Wcmt$ŁD${uec-5D"aR9 6Agq"#SY@$&OX5߭b/#X́5semoD.Ё:"pfuިe2x"0"_GZ"i5D<#bX""lˈzn[ie ͩzn?%E|!:>`3v801rX,r^ (yU+,{b@Է'vg{t~)e~ljRUۨ"r9x(#>lj`Mg6ظhDX?_6g'$:޼HxinMmb"@}?1:KNL鱛5 pO-J/$eWKtaoUIVdVZh)V I6#h|0H!$,vR9aD[ ĬL'Ӧ;Go2/~/O'!ʡkhK2XCO_! Nabt#I?ʌJP㶎!L"_%J ʼ1ˊʹD̕`kXg|MH$(΍D'TOkex= BleXGaj3$2kzri%sߒ-y<ǛA6-YV䐨@ cyd!,[ .'*+|j@GCFD8]q 1㻯|s-#ReWNw(MvS_M# G09RFydyet!-Õ _ɨ?5Jm+ݫO~ w7m;:Q1ЧfIw-yGDԖQ*z!oV% "ִc2_ HDjN2Fg$kQF?kww]O|ϿYW] sˈ֡5X̳Eu.W&q@`A!C<0IdeQuf"HuM9pC^hqpPG#rx҄fՆA`UV:!0:~՚>? `߱ .>2BN=Xů-'j2p"& |7.8LB"<-nz"& VPgw(#-'ʛ({2D̅p☫C%tωE#L8J;[EJyuNz֮oXPRůޝe$ӼU! [!{^+/e>+M|bon  mY_^FR!8ԡ*!fCGKj&/ϪE*ѢǺ-bF4AB54_cg(QS} @)UT%L{}I+"sul.$͈!q9m{x3򾦵U|+NQM{hD#e61~D(>9?@7(v!iljuQtv0|gnvM\VB ]DV Q@$6(hJ|R!3vJ7%M̦gJW16XfM޿5!<Eoۉ̬Vk3BtEۖb9,mkb˴^٩@c6lo-i}SEkhͫ[jQe±?>XߚRgyҿXudH~c :Jt(qZKEe۳-W_t˃#! VeW֫e=>:pem|'hmDe7R,H0 25ZH$cxuz!rlDZ1 GE[J*'SPx;gDj}~/gg kkb^CBP݄w5xzp8 1>{gyR7I"K.΃}EKVcx@$ߺ߀з;LkeD:{}6$feA( +2) b D8Wq~ DMSݪO{l @T!>Q> {_jwT/ EGCdOs3 }}^Q".<džWfр]cO/$'Ҧ &jhv0P̀DXeH9@9YB4Ԣ#]r\l?h7[Bpn~e>x}z}}FD<+Ϩ;ԱE1ќr%ƼC0튽|0~meFx1BL}cMQ%I;xTCt,vx\2Sh(m/h$dĎ|e~ntIy; MtE";>Quοs+DEUuetv͕v_Am,T+Ɂ~gM-:_?A4%ND8ˎA]^BCK,&uЧ~;3v6 L2࠻sAC ̟MnF^;AP@D&x ۉ-6ډg鮮g^j:uթS<C_=4?O'yZEٖmQ|.>>=9=={q“O|B[Q,暌z7~'k@YviJcu{DyD_BAGKh֨ף@2J/$M$DE;]kA@ bSj"iڤQOȄߏw`c ЅoH$"ʫ{Mu"S0\oB3z{-k(KN$Q#,T%B0}wO#eI7Ga/yDE]mDN/~2(ck?Ue]D;¹oN)sQD3&z.c=Nhί¹ᜟ^n⣻hg&!t땛n n=ABC]X;̪mCӲϟ=G=^zc }mӻt[fQZD]1סc%Q- oΛZ~h1!ķš2joDJ(RH(kN ;DKk3b(ج}TK˴,*%t+' s n}:AjEY +gԧc~689/scF$K?ˈ"_gxq[nEEeVUʵ 睈.oAckMQӍ1kHcqAB@>ݚp{).eXB@ϵ}5.٥ʣ!\.KfD@/ؤ-^"zD"UCD5#-0(ō6,;BJ0Vz@\JD y ݞC"ZGMYHݹ9.d_Ð;P=X2$Da,y7<]^_iGiZcg$yU5I kcL4URe mZ%Ʒ Ef VR $,n赚DyU͢AB@QҠ$re丮GyH@dF6jZv] : rd ?Ƿ/nJ"iꦯXInPY̰(OL 5V>+AD:oU9f 0H|DtIY"p/' "LqDlP# e_I tȳxr"%JB"Dl Dc"@o/ch5£,I݆@t-="Pl2}ΚJddCP5MdD)XfdR$MZ[(!D6~&{s!Q@<.Zؽd]Y(lbcCѾ")4UlB }kfb"tt)ѿ"X PiaڰfA(=Q)̋VI)"x4-G;2'KN#H`r VIw`B)R! Ӥ G:сlxhƋ5T~Y[-DFB49Ubnƒ1a~Y֐]y6qfOy.]j] F+|`Q)p.`+;F7%\w$D4nu'_MRdu65HeH\JOGyq^]@o4 ;"KDc7n\@+zi@7t 'FZϯ}`5Q$u?"'H+ v%.52` E+M[C9d`ۇ8ig_\'!Ey5JhQ#ۉ}`U\mU}" nIU#-"X=lg \/"UkMdQDlҁj*>Odto!Swy M*)P9pC4BVk˧UdjTvF qa1b^ wzSIRuz*3VO/]steDN z@E[Moe"lx#>:"@PfY_?x|Fǎ 22t\>%£ r|^FcmG{ˡD=c"ѯkaGCw^F*A| oϤD?(-y מ繄e4+MFR3@2?,X_ a,6u֝IMeT'y0 =˘muvHoNw3:()XVSMg>Sh@4|"ʼΆbt{]\/SvΣ.!DM}É G!v<`;DWD Iwc盓-(o6{h~4l[m=QЗUCM4{=QY-]D1G/{R0Y5Grw?''XjQܩS'N{oChSꒉ!<~LE+'9^Ӂ1:1ɰJY/˪8. z`x^^X%ug@S-^.!&dHDzųʦkI3|x'<16@RJ{3^<\i/EрDDOеKw?V1[Gt8y5 yVh R1$l@+uա /* *"ANCX'kI|(i.Fc6$?ʀ yFy-(VU:>M9+ }V]ga2~Kt-4e]=ѵH'Px^}{iƘm(Zn]nھT.,16|6WaZ.a28g#IHKp"'#EӦhzΟP!z< x5Oin^7<#ԃce1F'5֬/t zгp8V y)Oju5m[!HD Oi z] <',\;G }J&m֏-޸⣻HN`EOIn:%K4-dQǁ۠~^ G]w}0!l TƎǰnܱ@C%^D*Y-/DAE}?Ӵ鑠͟siUI:9y<[1Db(<8@ ' ^IY7՝π<*՝uDyYY]>\V@\~.5qkҋ,ϊf{$-%R==#&& j$M]`x 01ɂ m|Zmdm zm B!0DrVDK֔J5o>WL dz"TVڋ6tҶuq$6_2-]x%>aKEVJ+21l|vGhvZ9.-AN_N\2L\m:hg&[: /D$hI (i:O& hw| 1 |X£*+Z~s4y2bw8.;XISlh9JoMC:M^Z$yGe?OD3_ޤǺ`HOo%N7'Cw@t.'g0lz#ꆂRY3QVhG{'}XX\4YO*&{c@4'Cw%o^4JdX <*M[@֊(* # a$az_(1ZBWB ,RD /H[wY6'22)ºU?T@x8)9OvCJմi+>^Dh)D eY!!?2})EVCuUy1w}V+/\EdEFE>ǒIn-':IvIHavKf BڕF`aqm)]Fx%ERD,TJԍE靖gz<|_" .kwv*WE7tc ts?=8{kIMZϐ-]Bl%O^yهNov֦7=GЉ%`1qXOP_fḧ́h0b`aU`HKD>B-/yַR;1lE5V7{ݦy_?m~"He~*zs{JǦƀ9$qil3ѹyT@` gDD9C_/ x'*6)lYH.еN-,iudIxuz\;';5I)$iR2DDSmŽy|5NAJ)T< PX7ّ LOBJ(D)!B\k+gOeeZJ" euDBc,P{ De 탳DDR&6Ki> 9S|ycxcȺ˨JKi#v !y;ZFD˳׫m]9jگO?VO23bSay䯼M<'Ct R$[>`ʴ)Ji?ff/EFJ:mT"#A)a[_5bb*Ҿ[Jy۲(tdfj+9rUd2Ro r+lJ\)#.փJLU+" қ#"`VB043-"#t$`=D\{{~%6OD=>2-sb{E4dp"M֣nӤ%Ep3) 2n/rD{L8!k8IvXSjjƞFSdyV|š[ :C(xbk5ĎpSp.W"äm"Sh%FRTn;fDкq=Qɐg~5zҴ\ee575Deu qh\\|yDeҩyx6CA/>. ͹Yl ʉ .LBře``eDe[@52~1K5:iA?2-&0pCzlvdU*c⸝0tW8w<q5|Dmf$tb@$B<B]f0)7:|mɋ:TQ$Mc.#@^Y0@Dds:/3|2!H4vzWE~pY?::q ty1$cIX|xW!O2Lwyj3fbQdF 7eYSUY KuJyVJ>\7A/1͓CLTrKcZnSg\UJHV^56`m+)R`8=2w5 ޮNuQ& FRmD_;lxP5.#F,G^ö_Y_/١;R"16.ڳc _;b]ĄV=%ͷ\B|?=g BT%LgC]O^61*7g 5DcJFK۴ITJ:ZQQLzaln L_y dE+eD3)Ld$nӘ"oa̚ܕx6{p"v h. +$*2i3Ƒo|Ge3*)~Euv5ހ]yE_ U&ICdCW)uazgq|^u7wc 6'͛f^>6f?GRi;rIҦm # 0X7'\?Mv]JGB XʓЕ$ u/<47 y+;֓u"'䀚nl> H2_|cʒnu$ xjuR\g+z ߚ|^Eko -x4^ܒlЄԔe[-ZOmRJH@o]C))䥜d$sG2#:$D~"\kݼI&+ ڞ^-t(KB!~?W: Z{xJ*y#T$QvQ6^O$I7 D71c:|UdmoK62p=%:}HgFyCTtj b*|]X M3DAE]JJ"~ z˴ˍa`ln&]n4D>Dgr\|LCY # _V.8z۲+I3n #H#/] cYDlO^Uu1HlgXw\B>:Z'1YE]'d>j^{fn;Ik:&}Zv2 |ijɧ8lj_{溛[lct{7&9aQ r1ЗK۷ʉ#Du@,r P90+!ZQǶhL5A6k&IQu] Pf8]xL%A} 6%5@!Zd4<:yKD= 4$$)ƒ/>y^=+z,?hz'4i[dt4̉mX תQ3fF`; ~_'gcF'!c~S'R#t%Kkx{}!Q7:7Y#QOt:+.;F& OWVDK/+-LzmZW_,Z)#Ztʛ *["EVehf@`̃ 1W~&7l5hHBB>ŕD5-(cD.vHgm3Hzi#yaf /8h9 bFj”Hgک$ygX!Yxj8!ϻR5V|l; R5OL|ZA~-mouRgi9)'J0^OB鴨lPzd /5T1N] IW>,Q\i˳Sͻ^i#}WkϗE#{/Dw1z~g~m*蜂oFF  3Lq]-V|joc)*KoH{`,$ !!3.&`!'Rj6M2zʰ'?5z%Q7*=?Kb. (ug Uã4e[t82 7x  o{|ZJmBEoiz%%2+avThO2 8^:t/)%7P!O!P~_.Q^ERjcǽ#֔Qٔ=\o=x 58 !2r/Ȉ>!z%ڲ(JtkGj{q@<BCGenomicAlignments/inst/extdata/sm_untreated1.bam0000644000175200017520000027143714516004601023055 0ustar00biocbuildbiocbuildBCej0`k`cvr]M٭5mMֱh3 s.p`g{AlI{lVA4>B!!P! AB0v~ѵ:ι!kS[ն|47W;sZfBi$4x<8V&DSu2Y/XWhT{>Ua7c !G+K8x?oip?ϭTozp^~>oLBCjP{l]vt7]ԩs>}xjfz?۝LYH!A?ꪴ1؀"L xF BDJPBbd!YkOU۵owV?V?Ek?Eo-|~o-x9Y}5/&xٺ|movwιmv6 mlnbm J0i*pmQQZ0kθBÃH&BTɫS0h'y݂0m!e7M.9. %9*R׌k(SU Bó J 3j?N9$id2M&+G2v[1iRS=px(9DnCkd][PJe#? Kw|L^EX~@@E.Wi@/c*=ltÓhS9)NeIZ-'Ō ?E{(2~4?^4d0^q˲ūdW5@~y O$l^vn>˅rB9'q#2Hy:_-Fsǐmf_m'Sk|PߣYx1[nz/k~׊IР〭A*lFϥl(80$`O I1^/&׌2f50 4d9Ai6̠3x4cȴF Dkvʩ2AL> 28+FLPeY '+BV pjW@aoA*3(b:q1Gh[;?PT =XYCl9zo>+IB5 ( hd=^DcX-ƿИh2]OOLB4M ~Q7'G?pTRBj1'6&+n,]`ksPhӐ,sPuG3zj=-}*]mv7 ̛vwp倃V$7^]f9Z)o=_|30%fL,K"jWܰu GTj)(ѿֺ`},[jKT~ͩiξR}Gts󊱿DjHVLb ?1 29j խ h32~mn|ݞ |#mBpr 'Jy:Lb0cYV> ?_ti j5 Y#ʵ1Wid>O\C ih/08uC+D"f4ףCl}IKmP+&S쯱d`cFe7`t @f`MCen۫{/+ȕ,: 4.V:xHJ5pLHH>ՌQ\F˅w'f>3'>`jPaQ5}N_<:٧5:Id,e~&f/_*gf l ɱd5D5:Y2 'umNٌt3=;x-(8>lYQY5yX}kwtwyl4BMw gYٯJι(^Z Qdu< !7<bً{*YUo l N4 Xh$֜C=`nv5}\f:H"xNসݱmBv{/"u1eۯ#}+eԳ3!^LOcʉc`ܡAkCHw!~b^.> i*u8ZH+MK!NaJx=]w/U봵G"c1g*jnNkkV,T.LlQc5 36*z'r5e>TJIyTQ\`鸰BT]U0,r1L. !G OK90&W R}/!  ba CJN!Lj }&uۂ5|u@#]v ` aCd io!pox<a|7͑LV8Kozu[;vrmnb51nρ5~?@Ml8M=0}<07I#W4-{p]N>Lh98\?KT?0SZbsaN|u*$1b~Gil2דL&dU ,4 z60h|Yv~a]v+#-/GY=6ði(<..O 06SԶx&A^OFg%ϨCFqCo.z`coǵ߈ɫm9I(mTmZ7] Gbnn6a{;蝩t?\ƏS)IRNeh<-s >ЖGi`}q3hFwv 7 Y1S)RZ7w2k MV`Wj" NWwc&k)0S^KAe/K9|TeuX%(?$R 0+_qjCj8&}I ('Di VUڗNWäDj:H(7~#R,ۜ&}/5#T|ֻ}QM z)y;WS!#\b2 rYf[ r+$PRFj߹9ErDHRQ)mr< <\!uRz''(lx3PQL: d@ b5 umo:[0r`d-@g 1QȫcyFD~"2O!iz1ZGq,>/a>Jg-_.8 Ѿ_KVق|{q#H1Yހ U!jUy\/jg i|KG(2Վ0qKAZub d6 xoQ+8$^H{TM[C#L i_]N@͠X ZRK855d94k[#l`:[IuL\e!s݈*-|a *q=mnh)h $4*P¢pMW4-T2lο2eTW R^}5C'Ua<zvUŐ"= &Rz3F!&[$>3lPaH INjŤV;@(nmgzshϳ+w\8mz~J;h@J?.kL5&IΓY]A`iB^&Hpށo]Bcl50:T) LI*}.hN?yEx2n seCx.ē|m,-Џ{T|!)qS}d^nYw=HZM sdHs2fDp¿vZxGiŢr1ڰ@Y,(F u] 2k≀WJBűRae HMPJS&yIɼՌ%6 k3#"WTdAEHNmw#/ |5OeBuC ^s'ZRI.1[̧˨gq01"yPaGȽO(!|=HJJf58{P+*bbg9h]eZMuPHdzl^,֓dl -$%8Y\PӨC584_ n 7yyxO-|?ÉPn:Ϧ '@TdƚaY]Y~A-j#W̰2ʊ 6Z8.ttZc| 7f* 74L,#Yd(7D:Mʣl><^NI j+VqyɻIr x #kۉ!+/@mx إچ1>(8Tkz qOT+L4'I8ݴGa66Jk~]3i1Wl;l ۲npJ[wy#aOG*tR[?at[gǿ? 7@YUsQI1)/_N.-ZMcN fbՂˢ}Ņ0REIPɟ 8o U<Ջ?h <v/2Tt%7XNOh a*mY_xd\X.f,B~N;Ⱦ Q| 87Bǧ4+/1,}Rsi@F0 @4́z8> /F:b$N?]A[=hH|c#֞?Ѝ GO!Jb,֣8>lwy2kn2 DПn;鞔ݡ2T f֏0*򂲓ZZ9M`tvy=;#$؄rEϚGD,])py:^֋ >с 0l~gYv|֕8E$kZJ0g I'l*ifה?EḟNcntI ^{X 9 6:͝o%):jÝʳ=q_6ֵv6mSG>-?;iF>֧!/qզa֪3QIQ%9֊ Ic8 l>z:\I3uliPG4`}3ơ3ȁrf`"KadpN `DF3&Ik B>O- Sٓ_Db!QtU$ cyq֊S'Y-`-c3"dܙ,Ga Pi bۃ Zp,6 8w[DQ}53O%AOG(sh,ہ^x4(a&'uL,EJ;e~/ZbwDI\ƇjWMyPdPg0fYx;BZ#Vs_g 팡&X94_-{d 79IM~5=lh{C^(+feg,O!o4<:+-/Ki=ǵJ!S9~qS ƍT2g\0rʴ-/xϋg=5p[Q4nB. <;:V7-czX\&B}n`; / ^Â3% UUl5P! S?A!F [lr,d䷒qaضҊR3r 0lIt#54s78+1hRԕT:hq7] Q#9|`h?m (Aij|뽣ӷgaqS>˱g{>I"W\A+ PK_)1Zeq)*Qkd `2uj0R h2k7e*@Qh!Y0YBi 6ڵ.vӤ@^5O2"@R"̤!0Fe"cZS_qL@"!f nՂ~l\YDȔ"ZTg |I+<{XP]?􊢯:K<OG˰gõE%l1iVƅD*b%Ҟ2~.-Fy%i\C ;pĝCB˦GZ蓮Ѭ- ǻg4Ub[#޺+-Pؓ\ KYa6[q ŏ`nnrwE:w1 A녯X)N:C$1NBtZ)b]~;Ն7=C2@=?c9Meg̷||ߒ# R$I!ZæՍUuAX֬`h*pW(ZK7,9c] _ t_Eb W=J6;?|y{{ EJMkU|OPb n>"*1bXn=\eӗ=mG>!*L $T5h1A_d׈HNo)iDmx : oN!$`dH`_6*h7ZMÙqcv3=Po29up7Ŗm&tG|X;[Z.!pmi L38C6`{SK0a+}),`xbR S+e )+-X3R i2:eBCh푿C^~=]Sz^/0n>:ѰFԠ1jGvMTc(p*'NN' y{B$1FE4nQ[C9f;EӼF~҆ac 2;syB/+&cdijͥ FPlnGݥZW>@ Dܣ#T| C?wW7Z-ҢyEA{c$|Aſ 5k֢_P*yyA)Kuƺ^|;ikP ѧ@WZBF4c=G{A Mbthzk(!-eC޻klH e^BId,& r.aY4m4ުy&HzWŦs5.0_~]bLi|u~6/tBqk􏚼NW)ߐf'$S{Js$R#\Æ+E."ا؂ 4j B-v0!IWb96֯0>Lw%ᣍ?f߆Jco<}~)U|cЈ@1`1]+#AMF\z05i XN)8#i1aAlɊk-^1Qeѷg/0~ߗ8H'JaD_9G)vA}>vJQn nd ⽣]/qƹ]+Cށ:jxpqwicXOO YhhDLvV܅AnfbQ\ݵq9,OgGm݆e=7$xl?,cjq[(eSYúS?aLY/'x]>?gkg2.XC=`GY,Iqb8isg~M{X⺚ǾbՅSȿ=Mʣrf[H5J:S  (Mf>Q ՔtmOyw_et;~Ŵ+ 3L*UˬO1݉|ɲ-|{SSJn} U")&%z9hB( j\RO?2dze9LxC (7U~}yc5(nA҂b1G89zEa3 4s)ZdkTu;N=E^EF׸^S<bN)s(uF)c$ "zx{ |P8\X]Q9D0D[fwNx9Ck"W8;>/I/,eӎ`?Q)n-4}b: vr:ӗy0и2S IrhQ[^[U lPb1.+%ыߛTޚNƣ0"<YW@I"8H^dqƏ6`0Z[{lq^B4b{CN#p3 "*qeVICohl v@5[WPRh0[B~ ,t~k+-.҄wO?dpV!N%3/T4tE=LiPoo hd\j/}x:b VN}G{CFmr6~?&l=ƾxE]SX%OyW.ݬ4Cy\ݵ CXnj;|CIqڰgLugaR #Qg:Yl WYwGiRk%8G{Kj/nIt2ϨŬڱ/SMǎJY" ro_ Ik(s Mk`gu9r 1;|cG$>jXoUm{vKwNx=]iMgfalUd ,91Q2a!C) S|'uhW|dl#}eiQTLaj@Cvƹ'ݵZ^BS"t3)n]y(ͺRStN(-@(o}JwE2V17tt6,}U:996Qj}$IxIsYxs@URSd ; F%0ۘ4x Af-W?znx^[lÞ'Ӓ߆]<mySS'Y.Wȅd7զMJ8w_Š}+1N' EIwd7n{?l}kw6!BEy2J]V?Op]pjEu!͓VY{nn}뿅l]fAe\߽77H;dgEXYxORn"! TUOQ4p_NKf8*Ux6uޡ!O<} }qp=TFG*d]"c~}2bUQYRAq_rRN B^@*XhTYQ44 sMpnƏS52Y<=-gChw+3CR"0;hGZ^hs.ĒO%1Oay%&ȔՐF#bu;5 W$w ;I%9\q-M+lqh\J?ZA=TeS,tq=FBhtڇBr9a@VQ:J?R^¼Qp! -57h\i/iEjR~A|o@oq}.|t-+ =?NU $$I 1peXؿva\}q2I*CH  j+\!qYFƴugY;Id$4J~QVڕ}~AjJMp~x6L'')Nxvpl$к 퀐Sf,nTBńDK>ki?}33A3p7x:U/ECz^zB.l( 8$ʹQ&&A^r):Q56w).ޝߍ8kɤ_..8,bIri_hz@l3c*yv7IB^Np|q|PþEL`3%F~~O-7W5"{UTNb^y _y(6GG*/#h4$QP 4zc3 %6I C>/M>_àg"ڜ*FJƸ8^lxsⲃ`/P5mLZA$Zzw /Wic{I}T۰9Z^x@w mH +,*wK{,ixԒ6Bi'~hdA;O y$l>o~}8)@ۣfi~@ы4tӄ7(APpP?&?G w_Cd],| 2ERw9bWz)qy6IGK͍!ţa|jN)Mɟ҂D";͍ØmLIT9T: ߧw +V˪C8K <1rsd:/2[S&oci7&yl5lGa iK#ޒXnB|!Z .JT}w 6†%bor2kxV7m9n۶E=iPa>,N')zZCgn 9swH$;]Fڴ$*M5JqgD6&Ly9F…& "MCt(<۞m#byc1,B}Eyq7=c :`">g*uZU 3?OoH ,Ia+nMLQOCJ !twd2BKyS8:*ѹ~x>^C&]u؆hBN$C2/֪ O0 5\uthICDȆ;k߮1.,|@*dw lCu:F3a^>^mRmRɧ#1džlA_C<䷵]<{-C$| ߶+1cNOm_Z ;Rq8>{<Do$Nm?ϰ? "-3opAIE]E՞!z*%-Z'zЌ{fڲK ̈́W?СBJL M^ߝr R>A̞BYP$믯}jbMR=+P$O_%w'h4>ٰ9U@SZZVAJIs)^(*TFO3Lg:[t1?̇]̨]h41QE jXrZ3 FH3Qe`c$ް{&1;6v#QU) HL5ߠ*Bs96+ wc@S ݷM44?{+=ֵFƾRZM"eU&b>\}iź߅%O.{k3k nqmJw$%z! 4Qo[-uD6Px ]Yi#(< mu#e*AZh]Ulfjq6b̠PLGa d_ \&)ZFiŊ׼)U=I.PSǚ^ͫ1Aؗ*rU @ۼ(%佊GKɭI3\@t0 '"kY筴4em@\؀[;ߓԩ2\H,VxMD&C$ 5Ț9%|7W܂H-ktQtKkCZ2$ ֮-ѻX FD;ښyHf ciR@(yW{^[ ÒrB/ W%3?R8J{Tb5-s-ًh2y"gXQK{v(ƠesJ ,wxTv_XͶdH!{Zc5DoE4t56W*` 4S?xc(S}%,ۻ}~7=첇}{\`ra}WDז5Tբ7)R Rk}`zLx<on{h.je_Cޫ5he~V|N2~"~~5(r!>Y.lq.] -R +u͔(zLԃ`}V9+tv\W҈Z'E?dMf!LPᮧ^pS'!Fv8.HUʿ>|У|{ƿd0Ƴ4tS%@]][uV06M^OdUŕ ~ΨϧRvjwwW;(dex&ߩo5(‡|73֋Uc|y9O #-5~|cHZ\MSR4wx*D*A4NC7A)_W}g_T(M꿚ߚߤN|^䨂ru'@) $CG|xa0U\N( yX{^+y.$۫*S^8ꢄTJls&`f.:wwHn1 W$ :Ձj~%kX,*cNfL6#+OX㐲qg=;=|s7ͨ/ëևM|/"׮_5c>y'.pbc l$ho81^ 3Wy>-¸S29PȡS Ɇos7o([Y8y,4cڿS$z9(>7o4ZIS4h&V˛v+>ɆBq>u1B+֟9̂Iq _;NyOa]^5h~?%і1 D_hz$?k\U~ i}U/9]j=Ym "^kӯ!бbe5a (i*)!lo|uczܾș=c?&Wl 6EA9@ UO҈`J *Zgs]d];X%oK?K],A`Vmi1( k=G{gAE.!/=L}uڅ:=?XػR/!j v(aR^븉heuxM>"+i|:[J~ 8Ћ-(DJ?FF@aDrf,׳!𰸏'OL7&k.(A'lEږTY^29V7 4nG lU!p|5(_q^b} m i1CC"EQ?-H|7tc,x]L:M14TdTģ 6'SޕKi'}u:I1,o rQ/6c`= R~KSS  T^07Po;Md/D-A-4ɝ ]hֹHV/q[x+ ʲ'*Ɗa~0#ɮ9Ǫq҂eA 5&֢Emn %*]\ѠT qQ^ΊTYK NĬ m}FJliUi*jHiYK4t4cd˺wXy:ޱr~wMÿn"OhpOUc`樔?gx_P_aGwfǏ;>OI]ۘ% p-?1ԗtzC?OXOQ { a"a{_)߁C2^@_8ϢDQ"(dF .:TO//e=OI'|XO}H>=7&4mvn{ƥTؕ)4QC7'M.r@|&oa!ZAxOc{.va^) XjSṆq_ 6VKGI[gыN ^=l#OiϴlT_ ?yXwaƶ7/8hjӛ|ߦC|&hBs  8ܣ/`23 'g{,XœP6dJ=χxZ}|AD0*?xFR];۰ŵCW40/?w~R6ܔj=gA ӧ^^wzFG}RwVIg^GgGЁU_ϷLz?%!;hS};F ?=߱kT)!vW+8&:a4ۇc3ğN*&&k P|4+۲ws*m?91xE(W6oXwJ. 1:=ybc4MmVv ԮS;l4MR  Lsv:lnV~G9)> |++nbѝq3E&\.!΢ؚ__Kw7by'zaM(l[mR#@n dT)Sx K1}덴/z4xkS" +J~*Y/$ALƫdsV}ka-85̟Zt Mj'dC*K$Ř.fU Nls?(Kz:Pz<R2 r]cSb$sM(. \oQ;Ktm>(ѧf%̒6Kt\pVc_S8ڈ0Ou^țu{Mذm+˄=ixq]ۖy/agBd/×|د:epnZoAzj80=ҟG[wk.5_݄:d8YcO;zSq~/eyY z&*| }4p7ҚRѻnj(?'m?\$cBCJ[_vTW|}|iBF~*J0;P2`HB ]BfA"HW@'&!y% %`d@~ kNsj:]V߷kAX x?熓bh5.}upp߻+v/͇_}4޸v_7uxxϴQՑҺ?{oW/Gpdw^:Z缷 `ЀYXڱ3kM-lY ޼yh4/ @dnq }sp*xax-yy(x7CWanfB#PJ#NxHm66R6+#.u$;\yUY_<@A  %V~X g x 24tPe=^ m% A MRnP0%^Rh 6O:mf*lUG4UhGPpR5.0zQ~P; K'x:aSt1 (&-.-bPu e%@%}dtN捄}||z9Np;*>cYHW}z.8U(Kh,#νI1zO1Tn\,YfkG}^hf+Kr&)t\>@{0=tтvapmeAP S3;hS]VEyeS_8gMyz[\_?7WK`ϫEG_nޓ:ӾReV;u]*i&<{kGiS\e4׮(?̀6쫷5w iW\w\_e$;qŃ؉?h4]:Q#w/c_m[=h2'ッ}B֎4F5@1p%9Ґ+R$E ;]2d?>j||Sեy$]/ PoK9r6Z2;vv_ g?f;( /ïS 8յ5WuFO!ѭAV;{ߊvOO>h<:!Mh4d[հ>g)bd'zc&]ą{ kCT@7a; g>;[G kYQWAgxCfm.aS ֕dJzPr!IV[SWfg'?x{(ЕJCK (HJ`re`g9odD)6o |p<]q# ʢ$W9l |]=y7Jt+E]ʽoni?A#̐P*"0Do_6 O{3U#k04 l<]-^߷A)K0eir659d7C-U^4Ӽ,-<7p/& G-nK2/4 ,!Pti[ oZ'wE_0˲j+ߥ4?\g ~MԜ]{{Yj́0`0V 'ư ҕ93U9I?`g#!p維[AlFuw%ؿi19Gc/ӗ(\[^ƭV P3Gʁ+\!!n 7֭I:/8]uѿmAPFK;9,`W~&Pl :-+K-W3=/?.)mM(EX5(`ܘƼt3ͳ?|x5 ~.8dp (IX;W!OgbƓ{N{ƹX>vO?{nx~{ׂ<…( e06 F1`1k\SUySXUj3[<۵/MqNlEx)k1gFn[kNT+T"A(Al9|WlnN :TX%4x1/jހ@kj̮9p>^Lg//MP=4s0ഺE" LT1]sZ\ՙ%?Aa@c)N'A;V.#JX7kP6k3y$5 ]Qڿ${ .rNp,F%oH{Q _24b[+QZ۪:Eo0+^ \kSjQ(i?- 5{o6ICCfCR0+H,qZu]Tk$oe<YM"#Aɹw޵^([ur(ڮz@K9W'by;Ц5%1q YZ*@ʆZQ<1p͞/?G/-SK!d $8CV2g& Kͦ6-2;JPx@mNGc߀NӍ(l>%V^ɖR~ Sr ĊTt8&CWb1]FXFkKxQ5 G}#mT7!l9a_Z*Aأ k@k 9ಮ>?I<@q$T a(f@ @pPE6MY˘|ʧVIq&Ã߉| JbBu&F0aJ%"T0R fw5/OoGg>j,r@QX ]UPY+)bU#rNDШ;"[|yk~}S>–j @(X}c#\yW9gh2L;5OGy$ʳZ "ۏz|Z?rj8|@PZs Hi*R7BH #|R58JXZVaHl$T<e&fӉZ/ ~b=p5^PQnm馅M _{pZ΂%%Prc$F|f|_-#UAD9oů9HQ1&ỳ$XvNnA(Dчйa;Mgh~5wIn -VlSdg$ FOuT!ZbMBf&ˣ0e`Fֲ>[nY$Ua7[c1vX`Iѓ"ǷI'd .!B~J&n|~ sQ m4. Jkd y5PjEo0%b-GEkW>'an0xT$<4<)=:yV_c}Zx*_4"dbS4DżL/}j 9:==4RX=Bx)oOx[y-dUWRST)z#M-b4w\3\ ߇pрYLOh-rm'(I-?}z/ޚy^8岬E(+' 4zў3̷ l\D[L\\bhH.m׻氹CRUJSZґs9Fp|ˆK*%nj<0g=w1yma92m^.?c[m6Nl_λ̈́U/QDMݞˤ[Әa7:,5Pk!k5ɣ4?28A40V6.A3'8ۚ1,} ύ/ i*~A\ds1:bf7 2dw|D lQI.H3qL Fjr bmLUr|9'Bf9ta5^9t(b\ [Z) y]Lب#mO3co Nx:KLˌՓ0M@*@aUP9xژ ~I>#h]{]S!R1Ofxm̎*Z#cPA).sPh"TuVp}.q"+2 (A6 Fr0X8Zsyy# 6F)'_ yH<&XK6@sGuf P99*M 6tX}'k}sG,Pl$X g-y8ljpA: !/Rנ0y52'bS@zZ0'{pTejkex2:'?(HU9?Z"Ԙh6N,6yIG:e7(b2,b 6q}6V6L510q 77R}[F{&͠1R@mj҆J;7d%1*UIR~0ʘ& ثfN䛫W|`A<;3~Zk[JJ`Ϝq,e^f̨CHB 1E g 8!6thN`ȕZSG{431$ Ib1-MXbv>)Nb+]4cpߕ1HCp-1_cVd`eǼۅZ\'|Py^gZ+T%F4K{ny>}jURy\-Aťl>Zu`88tN5hpxIZZpf lJS̘,PM]8Ш 4Mb9.s\SQ8İC~J0~!6T)Bϊ~&R߁G6yٽ8m2~*)00&]09|5xӔ&K!X U]k2Pݒ-ы6PK} $3po+ـ~ˬ8}e%,G"tpE%}[yb5\눟[ZeU<x2HvsmaTQy?j6BqxQHf JXۤ8G)o4K,n|GSi:y<G\jYM>UaZltn0Rnn{w<2ANQo ,Ջ[i,'1T%z#ۀAFʅ$h4<9qj3LQR}A4vmp"\ bd2aIaV[=Ibv\VP@Z 4ap 9 2P I|ݯr ɘB ry w܉Fk"'Up |'iyd\wˌrp3a+5X""PwR / %5V֊_yX9Z')Pa+uާN'qJ:ǘ(YY2W,$}- /\c05* = Of  }]k NlQnttgcö1W6 t-FRyo$@f&oTYQ [ꎬ#! @s08j!}!cj1Y Y4>n_h:NmZl)8[K0H<.(F/zMWgy]Q{5ȏPUmHRQ0hNigt~ʷaeV\|ݜ} jj̙9tفP_Xa.>K!ϧ(NNemAW:H@? O/hcBgƱ!b4ॲJn0@wv u]~loꠢy!|>oajCyU`XOspNf~;\˶d`dVWylLhŕ:O͹.8nWP^嫴lܒVt7p黭!;yN(We.4A`c5`r@ncM $&`# MPp0u9Wcw"s?c)=msQp+H0(229„*c0˄9wKme.D?jnO7C/Ǐ9E@?dpUvQcY[d 2+F6IWJ^H~R:Dwn>rk*:ʁ./JA|޼kH ΀.i'k)8eW-rڜQ2n|d>ʡAXlu$=IF2xb6jM#1zN[}LZ us8.†4k,m[8Ƴ|+)"q8H<67dq1b+!5ѹ3k.*I!~u Ҁ4RGgxGyΩvkPwdtϦ6='-MsE0X}@ Ra1)N{v`k>/+ٌ%bǟ%ʀ)Ϙ,n46YFI'I <ta;)͖vtj 9? .2:p`]qX2>|̇ G@CEP8J]ATjOM5'G93{ej1|ZLM\Z0c5-ba_X<LwژZnuVC^"Lfewk/ġԊdŽ]%hXxmR+!o9슁8hrؗ14Oq~شjJRX-"*؄/%A^ƫYJXcvI!C:ϰszhN$!RIgK*A9V !/$A1-o6tC x^0f.(I_)Oq:h2̂H|MmudːLb(ʭygu<ղIJNk4e+.S8aeñ L5qq]ȥ:PmB31|KzltcK qjHgGR >.pzGIד a~SR &t^׺,65SaJkGCZtcꘇ۴)Oף,tPW rɽyRXcFB>:ug` ܌S]RD_N,ɘpR%2kX*_\0@EsA?(d~Ь@05d}3+妓y/O.P_]`ކDűj&Z/Շ:$XNy:` 3n_J+/Y}qsɅfAi4h ছ،c]#88`C*~e;)я"ǐ?x CJT\1TN], fi_{z4oi?)f7dZfܗ>&7]kԸ V{0%μ2_2C00^m!q>xS@ش hi$`50 πZsTynJk)F>)$kx0kၧght) ;p N73NO:,<΍Bx(@(:NX2u;EJm#f[b+ñQB)mFPXh: AP##M?HSsr$0.I!ec2(iU)%-5 ! r"5> FcAڮ jC;ATzer)T0ؾgn>3`z yiYk'+jD}KkS cl2FM$)Ӛ;:{EY;׈K` ^mzEңimkHy7$1PD(݁DcƇi*v9|p\)&m`jn K2S p$ m-,_Z Pz`{B[9Oj4ـjv. ݢF҆b3@j%. MnoxVp9iK&eUe#2)y)x֯.p*F̨*edU2:֖"> iC)HAdtAtAPϺPߕJ {@: Eզ"B!f}5/hh2J];vt/^ךژlsJPo&`qx(ElocځxyF?(D9APqdE9 ̏H(H*!Q_8C/z $ C;޲L(FؖkcpW+[rB0-bYq $# ;x={{AM&YVU8Gqrg _ yc #ȗ gfRXTlbɅh&q>MZu< [40Neܽynr^Uqؘ##U|4+.|4]7氖9 wo@mпr`?17:2O{U8BYnXim[⬨}P[7߿ZZNlwtXtf'(#Wim_߰~>V%s SLMOt5umHxVnAU۷^ b;woxǰ?l+oL_MJb9pcmZ,Rzͯ}A|Vv_ dSV~֣>Q=Pխ ':c3 Tp ʿfG ˫= 㩊 bM [ :ax 亊4OE12%i7[Mcy_(PiÅA}-Ypݵdt <cV̉WEB61qb]v݆mG>D WSv~)GN )t)*14&54tcڮ۞2'+[o<&4Vzn<'~e7 4Zbţ= lҢLR~^6mW '%EwcO:='joAK_^]ӭw777`C""w6GZU\s _zۂRBȷ8=wa3WVU}AWG_W.B_2yy2]g˛2ϳ{^ ('?QpR;hG {)1y"1VĔ:g9?Y@߿1T\Z+5ąڒ̶% v}9 +S?dZhK)ko|~syP.UvthqEGfK11TWs'~{g~4/Gp_cd\pq݌;"sqNZmǣnQD]?~RDO3qbnU\6m֙SdRk`ؾjiEGb?AX,i'=|?DB`>N"Hma]il^FC^/ih 埲e%?eV^eafGaz]M1Iшhio/vfs4>/GqTսCH}ĞIdN/r63P>#;d~,.(KA(0e-=p\"uI^K`wUx8YTMK"w N7j7ÌsGQAM}9q7Ґ 8 s@Іp|^J1-4 R8ہ!Egyhqchٵ]*؇.23P5m5M|~)|l9/]v(QQK6D a4L! a5>G0r{HM>2uʲWnh%APY<mSf.5" ߈_<7W1I?P\]{(_Tתӣ-goa<}6]-ve߯MuG)]W.jF-om(xc6fl43/}VSN!זC[~wɩk(Bk.08S=%Iv '][! MăV9}Pc; ybꊜ/pYŽrBlwG?/qDگ =E7&օfrycу]2]|Wt/|&ԏ9ݘ]w>/j5ԌY`R7&3\א%ڪzmd-~jΖƞ9^~{ڶ]U}8nal#5vr5^u s*ߨ~6(Aj:]YD Q,]+dr1CN :[_1 l?ү7&m\?44vDdky-pWA'&/pm |3C0)%s>ZvOK k:foyʊ]yOj4ُĚV31b,I(*#58$jŸ‹,Vۨc6c'fhj>~\?{ ۵W@ٹfO<,mt8]ٹ]S0sНH!~C!تz hے54^>ߌpbRC+9>x{-xFd.LPiFgjC8;PuSF!cBT޻ނa IH !̩py 3OWEI·5uCZ)VK#:_C̆b˲n(< SVa+Ϧ~U-  Y At,/Vƈ>aQ}Hk *s1 w(gBvC>}ֻrk+| ҰX}^x#ʶ* Ў9.W= ]zB{BC*>}Y$vVKUnabX\ -\!$oh 0@B!w^;zsGDUfWWeuOWUVgϞ /Ϟmx_|W򓲩zx Mw,gϞ}j6ͧml>|ɲM7ۍCgkh,>%h-G)F_=~~g?}집ǦG;?˗)$>Dh#b仝/*#TlO=¯Psx(3 ٨Z9< s? M eVV\hE&w'^Aru)jSCKꠣ息"a29>NqۚgR/K+/d8/quTu _5zX>[-x e(x(^6lыs/L0}o˲W+N'^ĆXGDWx鑌b.Vc ߺgb--dOl3u}u۲md%^p]/&f/P+C:L܅Non~Jj(JTT$#ٌZpVL\f;۱0["'w-2EK.}%Ǫ2[Zɢ*a;u_BsF82P:"c?[]X]t#@>'6?~s9T1ILxzg53d,="Dzp:'!dJ (6@yZ p`zrڿAzP^O?t7qMg˿/\;'~lN斞_$?£qf}W1J1ޫ6-̿$i~h˪cAA:f6+'ORn+4i$3Ԕ`(҉gJO}]Mj}"16 LE U 9^LACxa| P61'_x\JX3C/ۺ"E43^t!'MH ]tq1$ӵ}RxJԁ_,(uJ3R>UH˭^*`{K2>ܛ7DW \ش\+hEKrAx$\BM&U?@H;;l^Ş?嵔;8M?~<,ß!Z8(CeǪr_xQYODͨnҡ.Ãiv+у[ Iz RT~;?_Ѹg|32BqDYǓeHX U9MS )ڿy*U(xmv>ʶQ 4S>+c'69cxeȦCl9|]PLSer@2rNWӽK)^!g@%iI#.-i>*}9p!>dF5TڒM-S"뀙cW1>S8ccи0 uFۨ%\j.~SU-Z2 ߧ wwEJh;z|Wgf$ؖc,lV6)o]A%N[3DuVM߹O_v\v h8v`kоf|rzWTO?>Fmܲ,#;g~kMLUGgy 톙`Y)\\_>r 5?au1yvI!}}j{g?5mDv0hFyKAqG$I0ĕx [99ț:ku_=T#pi@ V;ˋ6 ڻ~WIOyk<-rUfG." _3J %X^1L>C9YBW5y7 ItU$l~,~[ﮬ%vY!b6**Hu,oF,ːܨSG7~V}Y U0TʐWf!%7ae+K)*}譺|y YPp{`'Fuq_MWn׹KIfʼ"W{<^a\pAA>-ǽ <'T;,Cmd_cOn7SdŠ4ǚ x_{,7Xc*3TYkz*`}]S{rs{7BM~7p 1d;i,J4r#niLψ<+/pu폭~+bx/9V)Xb`5N,E! 9(x,}M|7}eWgPBPխQk* <|eԹ,/JE^-Bx~wi(c׮WG8t:kRPigyE!U^<>w\O4_!HUuIRy!Yy]UZ;\Hd:<1"VHnO ]V|P;9 jR ZJ-6ɸڿ_ޏK~=401AP]C\<.5 VBd XMYzriBoq\tQ01Qf'ىGoxr>pumo POR뒌.3}Ps,`O+!cc1۱}-jDW8>s/uJ- <{x?orhLRMUE&*L]n^ N>~W#,1𧤺 w;l]X@T~ ~k!&DIB壱R|.+X`${h)3_5O  z*GRdГ1$*\mӠE Le4. H3 Ppt= Sօ-=uW8111c˓Vu|_0Uݔqk͵7\)TEbg_g4nBb݋^ԼŅ$g(4]GjEHs(N?4y* - }#5e4[yzJglz8hj7ԭ(Y 7cg>\nť.$ uGJ%`gbRكעРofu; \L17w_m{ -OAJ#^:< /]{ Vj=cXE\~T)N8R: I`H +uӶQW7R"gƬaL#8kN~#ᑜ*]J}"+x$MI#۝xc2qtalS7SHp(r`-lCb]?; W7:!iw1Aa\ZﬓY BA&nM䃳O z}ܺ<…KHiO 8IHsHM5]ar}4&. 앛uJLo)ޭ)ԅ4O0yM jBЌi%\ &NĆJO'\&܌ɧĘ /+3}HVtJW)]aBG932>}=4,**8wIt䶤*Hb8v])sIJ1A+a,/VW-~{7}C\7;mr8`Ow 1h2UhMa+.mCYB{KZ\zDf&ϯ_le{\ѭT IX5$O,gW?G Q 5ᓵΤ#ST`}>ocUE+Y(bsXYPW~߈s!9Ԕ& @%]]݋"9 @zR}ݵe2[uX$oɇ{u DeEg̺WVPMՅ֘e)!=37+aڶ]95Q 8u3Ua P6Xv SjM,-*g8M| ? rrC!BWYpt. ǺjZuD9,;0 GZq*t&ҏ+Gz2Xe7#\T1,39RWCl QuXNډL1\8褆 wWVk35Q,ƉO0\,*(#O|4VSECD{(.'-Ke`H`b` aG6ƨQgSZn` a[z:L~C]^SM{hX4 ŵõ}YG GLbl|`sS "B/=CA|="~?i[^yƈ-^FN_L1ahh܄4S/H~AHQ9?/+P~.%s.:ѓK# {&lsM -GFuv`rBP%K+ODinni$džRRzG`߂6}1I2yF($&Ŝכq&EO,Lfd{#N<燫Ex,2%fOZLy Xs?Sjhy2>[i-DcYvJkV<] W9/>GOKeI;]e(P 9Wov_'n^Q4>"-l8ɒZeδ M5W㾺\uQZ.G70bY]bB=b9̃[ly_'\l^Hr'6W][+<.$E=92ߗwg$}&6)#+UT\ݹ['{׺+|_kRͲ>z3˴ \#sf@oQ*Χ}?uiI[61YBl8G ["N.>6N"ḻɝ`5ySOt nnQI0}s<_uژ_~͊V*ROx+$;^$CqZjjJȍU;?Z]Só_LOo@G$P.a:6D>o6Nπctfџ\o*IQ?ZUӍVsOo'zb\F ̈."8O9VM|T *ܖ%htf RiKjGj& :W}ya7m? XK.c*)T*;!hqq])Xs;9HDPPJITgvY6+׫?f>O8q&bEAD8y49Ȕe4|hT ܩߡu:* [GKx1}*@Kk$؋k.E%7\B<x`t|9ݱTC |ߢqENud0KN*GldT`{C,e47IxM7:zΑ!E16R ج 8Z+pϘҜɧ~7m9n6{O薰f SWSxL}APO?} 7rIIwV(D.xi45<\BՆ_gū]|hs ,o1cݝ?OP-&=)ʓ$=yIW"Bh>w4ܔԭ zg";8ƯU=Н>nC$P)/e&1'G`a~ MuuK_IqU` F,e|LuZ_{CKyVA(tZRS’INOV3?=4GϹ?X-T1OSO~3tx黂O+W lMI-9+Umm,vGmBh{$J*E y]ϫL>9 X\Dh 翬leչFsnDd |V@jK%tfuL8(NՉC[{=O;ꝮJi. ;->qTS[]zXuVFʻ7>ݡo8}0Q؎I+|v8mY(3|- K+OX{dwSx҂F/8f들 l帜ssyGJHx^Y䛺V!7i*ʞ\(No_d<4:o X'@=3 t,v!Yd$PLܽ?Y\?^8><&ҥ 3~] Z1eg^ Y${+ { wdTm=|~yq`%R}.wʀI/v#NŴ! _~XW>D3U3U'Nw _VCXԼqox艳:uVifP s;I,&5q.k7]\Zjt_a U;EPRybs?DzQ3$*4lj80sVh/hze_~7 c[_qܠkc(Aܱ/cl+3.hB")t|\Z2u{"+|ˋիW>eio4.fwn<쎽d "#_*u-)(?r:gY!Nr8nb%8H7<~]UJr8# T@'u8 ϔS6SSxJI燊ϩu1)۶&ZIEwxTXOh~)ƅ$o8gwǟT.8.J|$tB cUgխhuuQ`PQᖒq.V[/Tx Vvxq6IZ(.7߆ثatE:r3h s3ZYLvb5jFMy.Nuί?!U*E.ppqۮ}\>\n=" xYDh6*{H1v.Ÿǽ Yڪi떦q UTv8UE& $Y8kBD["򤫫kIZ1gG<8XUQz?`tfxP%ZH}sK~%\աKf.*ߦ⌳k^$b S1m%v}͞(a2=S84!V*{DhB+ss%L/u^oh8%Έ4Q($zEʏUv!Jh7W`>^emU AqqG"SWj?xEԩGUش1m(DVtyUdfGEI,uzސ"u <ģi%i>>#ML*4ռ[gv@ NAm599ճ.iL{~M6bG1%mq h, #; 8}e+vڗfB%)\)%? ݱR &TwpYhb*Oʊ$=.yV 뮉sCLF9wwBȓԭa7עH~}1Tǿ]8}!YL*w Otႛ WJ?lfjz(&]3s,wW )7 m]ly[e֥[qRS&e͝a8SyOs7QHN7"cELY ,ޅoH:5L wCvAi$.Xv: g>-\ҊaBQ/_ {/۩cw|Ēca8ԣE>=pƩr1 {MRx{؇W>H+(JzF߰)g&%we~UPٍm"I)Xqu;rI"n L%@"f8ZGKs}Ԉ/"Iq٢9\x6U8U<dS9T ِRr;e )u 7#ꮎgXrZ oy) p)h?$& ~)?qv8~]^ 1q<%8[7v~ VC3-o 2xw_ rg{ ׈p ZU!ѳtkW:Oe+^>9{[n 6(`zغȮF߹3p5}@7 jh%v3!v;nv\HkLۇӅ=F'/+ݕHgqYC"㿬I_禅r۠k4xܪbNxB#C-T(N!L؞YCII#"/ʯ!ΥyxCbb__mP!>Uu}|f 7\0aګKʺi~ڭfffp娏prN+c䌥&U5w+g LewjRi}}c9~wΝx s;um4(ɋ Jɋ{y+<ŴnJ0Doʶlعۻ*: E'ZRv'(F$G\G_x[XT:*6xm嗀UtvL61r=ZNrW\@4##i̸ݎŜزb|<*8 4zD4M)m&L*iβ$g󥍯zҫN:oucss 8KLE&Xw0[8=rsɗXre9`.{폑7׆PSa!I)T!v.;c759%I_z/c2b+Gf;'W9)WAWرTȈߕq7A\@+KwQ܍:cI8uff9eLnވBM>ehesX}%f[3an !܂b"$,k ǡxqފ1Ňr=0Lk3;~MAC _nX^蟹YJ?l?۰iq5~ FaR˞q1/>VCX73IQ3987iژ2',w^_]þe2dF2wpc3we@cUUఴgt0ս;}?1?I A||.DR)+iGq\|UMٰPa0jQ+`)>dr2 8+<ƛ1[b҆4חnz-LtݖWKu4)^QL-?q ^#Y1*WCH9v(O|A`?WN#z3awSdꨨߚ3dIy$x8O՚8:i,rboCcEԍUaO+Pͅ/gtW Æbufv(AmhMe k `lwOJgubəxcS 4ʜC x>`"Oʤ|0BR%mr!gBrEx~2+,~݀O56C7,=dEQiɍP'[nF4~gEH.2+srjBCHΰMߵ],cY:Be椵 (!T q(_m90nQ<JN9.E qs\/r(]-;]apӛkK|3h $LsXjPj2xutSQRݨnOMn"/ q'RsKM'Ƒ GNigb'u۶jgqhհa9d+bI-L&,[Sٳ 7{+PG:/T:n B>!>OhrEmB,ۧH O:{)Dljܑ~C3¨[Kc?{q__* LؿAfoQyNeFTfvUfַ̺?|O?x1{f?y1y>bܯ7~k^_x1vTx~z;oC^Lg۩aROjZ/I+Oz!`B>̿OO؋{G߭00Ji8Om8t,nMؕs%UaQ*ϳ\˧~ݭ׫?)a8loH2 }dMG[2\;ϚƱ8tӿ$$<*Gl|zuEO;(G"<]\/#CX&^M f<$˻n!l};tobci Kels2L\כnl}ޙKvL œW:kzcH {C\~E?x_vzݜJmNًR$yTFleD=(;=WtQ)Y]^^*1٬ I p_?g$' ;d˴/L,ΐ(rO:}|$鯆KA+bY'o\a00 @U7 @ۦYmF>{#%*4D{Α2IG5G$njfœeviZh0+IIS KGv""LraOa^.Wn ~kazHqZ(+Axje yt᭿r0_^s&\}趔k[l7y2:d;Å( ހ G-K뢼Ttw:`ᣫսf D5VYRt ~8 ƹm(䬻tQ&|nr;,V0s#WmP#y_mH7c\]|t|( Sɿ,o3'GqFCk[ǣS ތؒEe/bmܿtn* "}rMgoRe+OkOcGWz >f B!Oa&hM5F*9>0?kͬɬ49]=`UrcǪ3R&NU8'q%y\rPZk\c GK=r PugdnH H 0|+Naa{8r |*)g;CEq?"ͼ),JFwͪuo5Nj'S(02J.e$j.&Z.m.Lr|k\!Ʋ!ߥ"8rQxV17@Vc qZȈ&`G5 WTFNJeqIT3~YG)l=äS¦:6 AK\Nc-zX/92+ᯗ$u۬Gtޜ҄Qew!A .mj |r:M9[k5S_iETFز&vȽלf'E }[HkNp*a= tYO_?!<`Pϑv`]ઌP7rUF O;ֻja9uj7$ܝ15 !<fߍ#lu#i>({4KМI雙O;׫z^r mN7DiGJ瓑BtjM>hiV#?n,8Xgm#@a p1:A-@5>̓gn'9R;>h|2vsUL?vkFyJDIJc胿'IO6;Lq跳 ~fmtRpZK7箨 g$sRW(mSm.f{O={?V7h0-5E r- R_OجN'g*#S#[CxܰA0V!3(qJx 9[qz fmlpj,ф- DW=ݭD7G$ io[@Ȧ,XE"C x:=է4N]6B 4 9ǓTЈ=V &*u)c%Ӆg,0I*ytu?4]Ve J= pwv`n- GTuKBkHse>&'2qiW猗Td<3yNr<2u *qYށ 03t6*Jr:j!B?yX!1 \Ye@^e1U):مy%g6˅qe^PL9#B0D~"V 2wL3[[܏vz"!3ӒRk6ŏJø(a ].d[m]5.3x_Ӫ,bE16{J3Ul2B9fG(3ѴS@ \j+i{J.&W3UI_g9XkȞHDphf=F{f<-ХsWW3GyWƪr.=~@'RSww׃-YIduW:<Ul`!p^ū[?~\'<$>Ki6p3 kL mM8}=g]0=)J ~* {Zz SZUBY!+'pҧavMs1>bL@b=)DZt( 2nt0\#ylMXFoS:j uV'OHE?:6fj?P ,+, { 2f3j\PXLS~@k$XW #Wam=c/N X#!>w y>fۤ07X+oP2qy'̹7KPbcJezsu!`vOMȴ E{ )*^Apc NP'LԨzi2]Yw=cf.n8kMpўٹ1|VC)fADȩ(*X5} !29Y(ζfrp J0@QˀGڈ20h zM\|[  %ʍI v]> s Ȥʉ)OJtph{iDzFkseP*vJ!tb'(|/uO eJ)t&D駿Y.V$%z0G˱UۻB-QblɑTN,J:l]H#LH"E^Hϟjo}$*Ta2Sҟsor)rDvrWJ=:ڞTcdzt$,ɿnZT . QGKRrRIvSqԲ5 C07[0v;f9k ht_+ 䍸|&p̪d$\ y<flGqvkJ"UƳCt~Ht Jpc򣮕πOlx DFsH[[XFV+MIme;u+45͞>DŽu ycTNۢMlݓ}krWf+n $: m~B2",>7(O{HG`IM+ć4I͉H+Q) )n7\].p'9C7M)wB"4.:z5!tA wC)=AA:CţX|2IA/w-!v;ˤ+1JV`yUWWi]eT9,QMŪ{R+1 ݝMeoU$*6[]GQXghؖK !ؒ.?nZ: V;| _\fr ~PjV4D%}!%ƐL)tI1̒EvM׺\g8|{+>>736@a \5G'.q-deY9yU,-*!L6EtDֻ}|I1 uU1{|>EAJߊ캘1{r/I|coǼ\vo말'IHNL=Ɉ;`Pm΋ #>?XSBs;N{WzA`pUaeSwtkɟ'!}z 䶨4o6!w'hO͸ms%(:3Q% DmECwt-7b땹x@;y*0e9'gw2=4v{mP\Ц]wnҁ#e, f{H9c%5QN0STTtW{osmghs'Sb$iR }'<8R#Kp~b`NCγz"/][FWp5yPcm ~`ij=a>Gѭ3Wlu), zLkEV\!C&-5Yg*N ΢ \"0'H0ptuE!\=e{WfixYe [q:]Kҗi+kZ%e%ޡe_Y[Ӈ?U=gΞ\WUM8,*^Q_ 2\<:e6V}#"M;-:>ہSCC@Dvb4]Nfe,䒟GƊH8#/28bE)8ܭ9ĭOB|2e|1qNb(%i|#t2#t-èw}N 3 )225ƥ\+L1hO ^Ka hWU+U/SRz >m[B:J Q7:)t!迼x|-Q3𯶋~;@|~l(|nbD1<[#\D<|f3 <#Y-n4zjd7}AY^}s䱻.)C;qt#yäA a?@]hΐ_{ɡ2IZvԶ݇÷߾C&W߉?D;DŔ4t"Y ?ɋ8-&1NXBAyD%Z?ϑ7fێD Rͅ,* nuSgeqFNn&tLsг՛2|6nڤŁJ2;Ulzz`.6c 'sBՏ6]1f'ΎI*+RAPi݈I3^ʥ#?yf#e=ܚ &IG|yɍ=-)[>bz? -[n7m"7cICXcq4-VklC0aJiė"M}Çp+no?"oImfd>G<:s!M1:otQy!W"8gqRE)}_|QO| ݳU=D6keѐІ|n'_zmy"{2+Yno㯆rwد>}"Β&ڸ.]H }u Aǿ-Wrx " (Q!| wy!u?1M4$s|wUvH վ%0,qPR1ݛKoZ;|=pEv}w7*VM ۊ@~ š(97 /]mށi::!NN -Ool8%uqu=it2QO=a#V _۩a&զ !!Q T"d*W_!+~9+'= m_M'xW[=#Hߐn j' Nn: Wޏ_mZMx%(Ļk]E<*MOq6 4bqI0CN=ycoh6 Nű6d,< %›g}t]/df À7~^:TeEOxUhG oTG՞%ȬÞ0ٯIfc׎]w& Eb?\OjNLs#Lrg3vM0o3NfH9[^ƕ곢N; Zcx'᳢I_cZQχԍ{RT-'ѱuD'oVo>j⚵tH&@uVPc)%ԕv\l ?Dn+Be՝!@IQ.3QjO7ᗨ$`6O8n{!3-0On\O3Kֱhʷ閫]|}ZFCfΕ.o'.-h8p:#GAsq`n,=I];tVyaob$Gƥ S3r8SP!@NSѶL$03sm,2v^)Μx-Svl=uqfF|~zfm ?| k,ؘ l*Vi&e4C;X/ww=a97xC?|odC,Gi\tWjhHړ!?,Xm!>W*)UaVIC.ĺ )`j y!%{WIV10̑>(ϣg C!y}5)Ӻ$A6;v/zfjX9&Mznm{ί"ozÑGA1?q|!eg)ǴKYY tz7=꫔^uYChaA7XŜuAh &@iڵ&u_Yuk*xD 5)Q{kۧTDYho5;UloEV?NZǐ'P;h j YTk|y|b5=\P29EI6rc“#5)=ZoV1Bkvhq,ؒR;ӴTJD#3nqXVQ޷iKL1%4|sR{=Cݮ4hE ŇDėh$”{rG垊Peia;ǯ8 Ռq΃LJ8>9+CW1rPTI&YgWdiWo߇wF1}+:fg[SG /{uI0tg47eR:pmj̖kV\ GB:+4܇m90|6j@xX %W*nE4V\fhTif6fl{𭸹9NlRd$ȈKJmx1Sҗ\[)u5 yi-axnw_t7 seoU|-Sd4fKғsԏЙcp9妔di0kK<Ĵ;Q[e.=/4rNSz*Փ o 7cA.6N ˩\DpBfJ.$QLZl6\fgSԵT0MQ@V\akgb8y)JیY)Ý+2ii9OZ̓ r8njTD5-pg_ڶu_H7pC plR;&㟊`z_YF u}_~` HzvQ,&Ӫ]~-ozM\gC r(߇'ia,wL}]\7&eօ-uHV|!bDCF^\'Pfuk' bF~*1WX]FDu ڪNBɈ0sa\^첨~ד0ҰH(<_>ٻqz#.E g;\8?'3rHA:rQ\D?#KcҒ!ur\NZUb7N\)6~3B`͓d+^? t=#sn[xSҚGNN,QehQ3`R[JHqlX'9e4[Yg;V|ښTOhyHCTչ\hy%LA+jZݗw~Xm.QPifJ:˶ԤV8vQ*J%f4k=Ii:Bo To~E^zVq Hq&٭75JKQr9;G3On0ܥkBDyu:~9P ],r\1 f90Ȳ@\ {ʗOGAI7ce|kQ,s5vL[mU&D]O ޯ>!#Kuv䲝/& W*njԮ %)qV^6jL׵ՠ Xdی W؁cOI2UȐ!dq,h#Id9YS]\-6(뜭u~\b>*xIwryyL"A3kz\:M/* m(<a1L~۵\kw{k(|ްi.4~)e>Ns ;SX}ƪn7*mZ ?Qk{[(DOF4v6G7+L#<]xۊm9'N[4vN ǃImKJ=oׇf B;ے!7*DvhRx$;ř+oQ;[Pל=?~En%]zW֡aއළ#0.a*-W0" yK)F(>9jGe)';ZaGWs 2)6R9B{ӋM),$yZžNٷ?$TU v&Iqm3ѐ}U$rYh O{bTQ :_9(Γ ̀}YqTb\h,&]08!jFIӜFmL?>i8D%Zug&$mO%"|@n$RBSrIqsQ:}Qw>Kg|iUjyH@ʹjiwɱ}xh $-@|:{ o/}h:hIlAPP}Y~ NCBNOh]+^NÚ}rXxznvԼśZbϵjm,+kj&T!Qlj ]y,Ou*6V! :71VZU*oB놲*lyBD|vx"Eq6*Ű9|߇氞nIcw׼<*?Wb PTor,I:抓-uv?O%4zk`%i9;P)fNıtPED K&89^Wښ#g7{6!lwݜa6Q2=R7XփIʗ'$REH[wow=LeH[Oxfwٜsn{@nD9\ua5wN_`lX9+}ś"fZCo?>ir,7r ъrC@EYti&Ź8aRj R1rbDV5.: Ǻ󸗥3qC(?t%$yN)+'dJ_T$M+cu˱DÆZ9B. QʟXm7i@yPcTMlřOSUE_LNq(1ORf8fpخx“s8Qsq)$rwmϾKS.$6]Z[}{ȉ|S_kL#% 2rFжf ;̬ SaD-I9̧zl}glm1 |XYj_6H×'IoMO;T.#fGX~}$|ح~繍*ͩ*p!ym4`=I\!,*o A rڑûmzfW:NCeO:` $|^*dZ7*am= l3(xjmF ȄkԤn6OO" K Xp䪁7~j Ow1qK5n,0i hCpkEy 54O罒qw},=r%ѹPsNL=Ө=NQ|a\U+8OUI%1jn#`bS voV|HS+q vN}S X,WrFt2^PWZU'31`I* S _Xʼ-6Q0ێ12Ę`4r r.Py'&3[}k[m>4z$/_$嵱f֖k8wzAǬ ėrFX+ əV](S#XIz_!$1빙rQk9[z(ORRFZ_R#_/j?G LŌ7)vTS *#@RKLY<߇Ägݮt!7;ҋ+)8[! 3G$UA^'^DEBN=HAUHiò2tJU((yzpZ칌rۓEĤ@Ny2h_yp7n9E & F(C3!1UqQp+.g ӵ V̫{;Yr䘶ΝsҤfYQO7<oHHᘐk~?ln OZG,G <I+24 SNG#o֫z1 >h}r]Ͻ!{ry+")%bWeƘ\Au:lJ;oJ:3Ev=)ns<וoqV8T (.HdvE[6 '̓έΑatjV ol,9ReƜ؋]D"|= X.=}jzV@u#\"&y\w\B{Q#Hg܇zڰ[rH~=Q4)Ŭ40Hq6 73SWDٶ_mK}8{qMUtYQβI_ җ9=9T$0ܧ=VE/}r,)0A^^3_N= KWR~&TH%" 5oE:'6]U7G:awwIV7i!&H I<\5X:ٮ6޹+)'ҝR=:~wXCKQ̋:#JK"fU&kDS(7΄Mcxac9C!z ~ w`K{U{N բ5tQ\.y7E%WwMVq;K.3Đo] $& $+H;?x7s=EsL+ΧdsL:Xz~hXUj^R?Li}fRorWY~&* ĺ"Ɇ k#cqfr̴29fpaՐߎ90)֒@6q_b~= .ұZ|m! ׻v;2yY m. l˭rYcHb쵉)*z-ÿ~foD*{q5#kH8f AdQ&sAj,PRiK)+6&73]6* H1-um)ۓg<suX6K|Ave]V])qV3WUK =]iDXyMW[OOaMyK9)Rcn?ƚ;YyCk }!/>-<4i U]e כ܆wf.tIa xD_&gRIɭ3ӹػYhF 7wQ'~sMbr8?*k%%znA0ۏ뼡2O!Oz̽*_btlv қ/H~L;ZR%sq g/1i<zݤ213}@j&D9K)n #tͣ,J59[C]m>hՇ_z ?kzV(vF0ɳ\@ \NJBco g:FdE&80+3I)<KTյ \W9D Ʃ%[3۞.e>č i2HB:xW^:mY(fO>l4^4-' 9\2Q>6!9`cNU.*s||O0w%Ոӷl.2<|i˧w؃?Dn#=Թ8ra[4wS^t` !g`pXSqHH(u}g̻֛ ($RN'zw%*];dn0VUEN72xc '<$;dÛghU٤}> ?'X'_ӡVx^υ{gi.va}A +"mAäK7_҆;^JZ7hع6Ж>~٦5DÄ$)0lc\VEC~J߯ 4|НjJ&/ gʆB˒ؑ!U"k_K/&E'O-Ϫ̔Ds,'}U%*`]9y4աIm1Dy'=ncNRBC_Eۏ$ԧ=.}OȌ y0ȼ7vyx?@B10ƶ, /6  |8{GFUfUEtUNOMUVk[ӫW^ÿ?UX ߿_zkVfޮo^i׷>2s/ggkkOxyֵ7uGO[üW޴V:~/~WG~/?#/Ŀm#s6ʿό_Gn=~<'. |xY'7m|kEĊzN߇$#v.MxB^(/QJI jٴ-;)"hmHSЀՉWx>8?BVmZ?73Ѓ.\> t >Q{!1C0^c{VWЃ$s; gҲ0x40 0: y< lԃ9%cyTMl۱syWG*pGU"[d VCuNnw&ڝq_++#[H8=w{/n|%Fx: R_1Eh,F\(JEO_ڃ4_J1e )+9~&$%$WIZmP`LL4n }.Q.΂Dɣ O@:)}n@AwޏBo6h?5wBkHHw‹tчڅFwl9RWha XQp`]kd)`1YO1;@QO*)8T D#| Ȅ5\МMuΧ'0%. Vy%^d1W '57|qSj|7 Wzלvj|ή~иd]2Ty-@ k ̠Hdfm<+Ls|ނ+3[x; W@xlXWt-L2*c/]NXم^i >`#{h6j9  rUH&T&q [;V/1unIeQ} ]\e> T ]9= (_^ p@ٳ‡Heߊ< N9: fS"~+!8e=~AyFX- x&aS9`r=bw"nkdk']n) 4&IsNg: }їiȍO6>X1ytt8Nq5N$<"+,&}1 <zqqϮg\9?= tƸ ޞXCqOiÄ0)`u(cizF4M@ORygV̈́(}ZKiYҿ1Bj`$ 8*5g  ^rAO_ozXTY%1^1/ M۵) \GnbLb"5߼L;OJ hw΃5C"g GRlʌ¿m7~5>ӒH҄֊gL t_@m tyeK+죟>PqxmC5ϥ55EC=eH&NE\o׻ם`Ҧ2,9WI}b sJ~%sg ż:P6z_UspX<C.:g㝊lW)i23] -^R a! !rXG.I kS2%v;(iyo,r:L@|H-V!z4A>f6S JM: O14(jTb^~5˥z UEٌ2Olm''ﮮ2"(d7g + '}ireM~ɤ.8!. O#XH8/ 1- ([dcc |p + A%tI%KQN-c}h|M\MY'R4LAsLŇ8]n)r|,,Vʹ :9J!ƘU,/gBXx 1?Zw|:oV; ؝~QڐIGflSC[}og`snj)=&[H,H?,/bVǠ%Cyd۷Jaz 6$k*{G!,.1zi9b~ Ohgگ5Ae$Jft9:2i? G"Z{AјN u 0='NyZ')4=}2!NO)~޴fzkg ]iC&YS|H?b*.%݆I=@?.z2נN;:Yo#'hXA$ j 8)r]TK9{jdo |mD{~&S]gMw>nc ѢXh/Wzym :W|&d몺Rox3āzԅ?BXS' o&F+="k0+n,TZ#\qa񋒞^X}sWy>?%}1@ 9'\u@#*/p}no oΤ&!2ST}ۭV>z\.Wűe  gEƮ`l,&Ymx2l7e;A=$D~-y0:u;,ŊL&گ6Ay{ ~50Oe?@~<EP)A.4n >߭~?ZynnzǸB+Kc oePlqJi+5!"*$] éن.?3DCu{8}\#Zwm7d$)~yV'l!nEGӖh)k\l:shȮKfo,O^SK@9EẾ0Z{a<S.nDfX\sZku8v+b'|$|lFDyB^W>H'Se%}  -j隆݂1 [-&tXa>ނ@O,Wv?0`1>5jcJ( "Nv)1p6r^["%v>$"=ا8_uloACc;ؖ&`|__i!9f᧑!>'m\&vq8<([>78$496L0Q g$i'!v!~O.-'|'fHdM9~FfFOLdA^,w?e s硾3coINX{Eז!Zbrgu{& np MfPu4:68e^~v]TPf%8ca4mc~-7a$k¬(8Ah(\*WZYa7?@T0THNq)Jߕfq&8y;I~xx{)~z.RQ1R!ܭ>(c־YF5N%VTd34Æ:%Fn@tlOv,=&?4N{v۶]ŦCaׁOc&7p7%dkͯ Y*DeF9#=&%2.;x>12rķ8y{YZv\˫`xu |^T|>[)tjwٴMjaztD\e'`v$8Q;>N"lf5'D=|eb,}pvc(=ԦcSKtz=Z?f` v6 K̿<7#؝}UD?f2|YbrᐙM9}*'iv ?eSfUpnp *L-:ż:,_V7UyULϗm7?q8+Rf3cTns]e+PVs+muSv w$n ?]))|kWr1&^Yc8qJ! Q+[\ڣ|J7pMml +ԘyAHW>XǙnӮcc8s%(f(agM|UQ&~g?0xl'3)gW؃([0ݤӰ:%GOOv\ugcַg#ц{VUr$tbqIeVI8pag~n<drv,C?ߓ珇2r lS@Y"b558ّo#:AqҞ3 Vm9.'j@ѲSYI?W7mlmCxgjДLY:*JiZ0>gpFQI7252~Aչ ^ԛ.LB!KSKucu9~狂IipڈK)̭\Y% ץ,eC xsVq:u n7rS#,3fMYe.Bq˘Uy9cfhvƔz-%gYJ뼪f3lk;<ގڒl7]|@?ίM /UQ/TcV]Tłgzc(/qX8\4N!'p*CUZG &5n2Ұ(:JrտI& wq PĆ*ke42XK`b)JOjuG~>jPVZqɹ6HNCc9*cQOc5cx ZI}K/YT&<t w*͎6|vY}қ0z1 99PFI+2Zh[\om~;>hfzK@=mY()8zihl74ㅃoO3YQ=WX]o X|@y>K|34lUC[ p/x<ۯH39٘O}. D;{\fYHl.;_݇^5)L{bNu{Ie3KiU(\U&0! [)IlmYB/N#@9zF0XoW8UUp&y,pKqz2ݪiWއ{~M'8j4s1 a9ڜM>}Xb/- ++% _$3փ]mqx?<.kb:8ϭ*%$`Y:u7Gziqۻ>::֤j Y@jq1֯=TW"r{]Ghx%JQЀfPWJ,,EٹR]-n Nv:锻ˆ?&Mӹv1g%Ƭγ7eu3pDe)? 1=f2Ƌ?Z-lTW մ ,k2V`W8xLOOGQmR3&=< A'RWҡt)mEBunj'(l /:F宾XnxD).sW(E.h,JXbS #nZbet [b}gZo@'4CnEE#@8ٮ6& fYN ~cBc7&Y#Lbp4xyD:Q6.d?<C\}МQuߴiCC8/G}K#ugbO;=B~D—a|p )SVBΤ1⪪UŊz>zbmzov (e@J.A ߐB Xuq"42`iLb,G7ix# ɺ*rU.U !c8ã)qė_ε3Xv,V*;**DaNPUhņ߭&Tl~T %%;V]9..sW3]e&ʂeRv*P)rvNYve(2.# `s9(\sA;<0+fdݢRJ(כM>wVE"gm G}U\ibށR -$.53“ĉ%/χi׻U:h\8TG] ֠hR Hv#9p4$8ԝG9)imz+DH+Ȟߵk St?_,,L7!sÝ<{҈BvM{(|/DCۭvI'\@*jhW#l|9Gmსs j}|ItA1>S;iU'ovu&Hg.}W}\+ .60) .tp ܝw܏4/kC]nJOZ:NEq8ј-.5r) { WP +#'򤖘MPsǻ@05BZ+܏(тT/*ïqr[c ۯ.zA6OcJ[BY5e|.v<XUѱy?H"99*jԸ*c^$"u3E/'} ]*?>gI{1049Y|Vbsm3*̠ uJ 6zv >엘a ri b?`$$KH%$ BGʇ}=l>Nնi~{|C]<]Sl RNb|uxWM'iV/3Grƙ,((}=9ca*53ӣ߇?9t|:CY\w}yu Ѹ^8Y<@A%jNĺ#͟M=hwn@/FN3S32;95WƖn0U֜-2{rs~d߮f51JaAi!|l>Sq%'[qw3 ˌ+y,.WA &=8` ί_ow&8X|t?z˹;6~Lp7M mB&4c Ҿ 685.,WiG~VfH/$5$RFRfCIǕn>gcClumF_豛KW3L0kardaoI0շ\;[q Kazw߭g@aI6U=ָ9`[ge}?>ĉrKqL8$"=e菤=TDݑ,ȟ>/m!(,U|5mP3?&ncPc~q/'}(=32ziPLW$+(MJeCD;&jSku ׎G"71'2}q1jdd^1SϨBZ+B%W^zf>gv.wG'&Սđ̴Vcv"|kw+`$|T$dyiLk])i#!$ӾxuKVqރ ;8Zh4. BnjF[MMMہGvnׇF辟7aS6c)U1'o~8z30=cgTgtbpF^c hsiv&9q R{-#b,8nAS0[0/afP8EkM 5j{_6m,>`/bhNK$<ҫKα uG7aċ5^5|; [#IvM/ [_sZ=3ڸ.sZfL>MIgpLcfHdȪDG~pno[]|?!YDž[i8boކM <.cwas侞 !5BFW^/Nn]AK]!@ThR4/mm>FIC+}ﰳ䲈0hnj=Ay\p5UAfZUraMS);x>_y=ct_QD/jpTV͹6 DNp[pi.2i%3I&<,s\Ө*^BB7kCR\i1}?-ϲ2O ՞c-s8\g<8<<}n q΅z.K|lek','g]Q;IX/3]:d;6ZCg$,:vq } v?~ H ^TyŁ(8:w~?ڬu\q3FsZJ@%a+x3T5SxLSe vf^zqIuއM6&Y{p$Bazc8ɚuN 5<Kl:R׸S1]=~AYY-)w}zX^~Z+Fɨ?*U! ])k Z6'Tx1$Z#*aA\հJn$1[Rܥ즪o7n]M. FcA[4\vhou/Ohj|{No?Ѕ>T(__~SЈ:>C; wߟgd&9vWs(8!q78VBh=Z:~w]H'Cǩ#ۂ*-bwx-ADy+7]tƅRGz& /`t)Gdo :s~ m۬G=XpU &^ܸ N7M W??OY/D V>x&r+d赛{bd..)-U`*ߴfkϜU3if}ۿsHq-ǙqCd4&ܺXh$g; vİGpzW>TҶ~K= 𥔁ݰ} x_]Zc]|6CpukM{hk|]aqZ'?=5;hccIИa:_nrQq.%D Nwc.Z̘EVIʗ)ee|w?Kݴó`TYx.fDLm}_?=?RZmbzaN7 K7h 㥷kʡVRQ3;>Co' 0X.EʳstIE ~}vO.t.3.I&msJGag(ljy^1PO@2}E}(&vu̿8̸mYnJCA:y?0 mt38RtQ|^*Ʈ q_I_[õ\1lrU`Ѣzkj+ 4n$ޫ'\6#5kd?Z"⮻3F(sT".Wۨ/vsXDmo#gό̐w9hah 1,OG9ՠUNqOISOώBtm\?TcTOUƅE7-C|qT\ESz<vdpo'v2MX?! c57ei*M" nihpakDmWŸIsɴ6!d]jNv}wpäWJп/ }m Ǩ:]ω|_ŬOO19$>\K|MVG|.^Jï@5]mSqHRws\./9%SB,K]RY!n-ƙ:6 6>}_`I,yZ)x&x"18KQJ !o|zMrtJKC$2M{6#J鞹\>S/#ύ`L|EM .Z_"ۧ|.B#3A(D/aҘ0Vf) #ta]U /H?B6YKN&E .7$8C6:Ѧ6m9 Rl'{.&ZQY!a S\2My{T0.1]3%7oF{D/zۼń:ZY~I]R/,ݟa?\9wG`gOwMsW>B4o5nrUXTᲛGQ(dhI0f*{$v^W񪭱lh ڠTdt169~"=~vm)_Kr4b;FrC^ \JS;:pއ;<6Ͽ}Jq}eO| BTΦLTm̓F'l'I% Px+tEjt  Ÿ?:o!ݴS/\BŞX*0 `nXatZ0 ې6r5Ix^s\aь'ZD%۠@\KF9_7َx%tۮB;>*b~S]yO4}q6S2|Dԕ R?\Q_S!Et٬)uA&$]2$!h\3z qэ;Rf*;vfm- Nt|LJN=SyjĸX^kԵd׵s^NJJ jeodow~yksoa# lkxK+6:}֦Ǖ`I * |2dH=jcGbEӳϔ9 ]ӬIn.3F7G&%,+9 ueJŝ e1~ˮVS,'EB#=|M:RݛZ۝Yѕ\c6D"4IVJ>qQgXe:= 5w‹ʼ#I7U9g8Z]E?.%R2^e^ ܦ^j!$ z@5'l6С2pw",c{r91yfXJ']EۗyvUυmݭ cX V51"k; aYE<x*++|}ssn6S_7eǗ2'rV o&mZ>B.K68Dqhu:ly\ 3")EQ `9j~nO>KF LXhK Sȇ). &ucIHAI:?nTMqi\iCyy6#Ԡ<Nr: ix}pXʘ&ԅ}GܸP5{?= A DRϬc}X?A953ե(IW_ﶻx8kJ;E)d SR6D04( SΟ Uœ;@"-zI#mJ:8}}7k܆F?ށtF̄bY/ᰊ̚Lꊝf.r]mvb_nGC䛏+|ߴz8ʃM *ZD P$8ߏ: >SQq% =L`"MԂ UN8 pjjӭ(0 fC]0`&?O=0xJb.V܉LWo~7~awC-09ԫCJa@j| E1s2CdF89vDlӅ6:vxNſZI7//B1KG;Ľ/M"FE%0Za+ִ}~q9m۶ƪ1yoMW)&\P IHѸ6zC_<&Sۛ} QGut*m^ ڈs1cTYp$x)]ߝBƅ*Ǩ~DօtY-.5ձ>K\&ċߜCߜ| }>U0>F-RZKi.a\U2p+d-]Gyv4)z'Pp+I=^r[fC`X9nCŧy_u/ ~L[o?SHNWh`4U=3jQ\?H8Ơ=BbM99vY])Se?7 Z[QY`W%MYkS[j)_$07]9^S&*~M=-|iw\m_gק>d8E}TclhO' %[*WO{_H[vwFf?>R7*iGMn6̍Ce::ҕ:N]# wIU wa`;s~ҝ4Bw66211:U2AkKnoC+-9bP[e87dWҸf鎅ϣ3$]-m v]"G2wzÓ┎L𣱡A7j-GEH]6ޒxpR!!:uImv5(+1xO*$5$@Ӭ)N T:+^٭>^C4*DqMH̅ u*x^2VT ş?pvcHvԂDxC&Oow5ő5p7в:" _YvTCi\X&hG!=8T=azf_1B+fj s.ʠ|P oRQ|7dvl [bժmf4DH%ez'쑌.ׂ>1ڳkM;.loB [8&!B* fw+{=hov wXq8O#A}\H}';?ўrr?g_>ck+HCɸ_x/W]i;scPBl_ tAqrP!t )U78=~OS'&桺_ך.1y=njmPf/ qA |; .Ɛ]Qc5@ݸ mm}yd}|%vKQ&ծweDA!fe]?W?V>>Ѕ&1  (iλX. Lg^{2=1} d8rڱxirѾ$4Y0cGχl.n7p6b.e9*=>61A'^߇_8+IW ]*Cw? +#Vݭ,XQغ#}3> ZX Z\\Wf1JwTIdBQS ݝ_kmfMfiAWU?Blouؽ?Be.6So](tşi!p%@(%73W2Z6$W"cEe:DBC ZMsDEI `vgtI~=J|`+#(KRIrي㲓TNrKgf+"wMXJoz^~݃/'w'^~<-I:_b^ ~l6k07pmm.Gf}_>f%cr;c|߳ c XmZ ^k½i C_SJ_!_ WOyC9.hx;!XI:98;$]cwvDk݈>ժ3Ƈ״1Ƹ ܀(u$%^!c1/t V:Vb01qk$nQ\{F'J^)!d JR~ 9RCz;ӐϻE`|(6r#ܕ^r`C-s_e3yJMj}c>5aBfƣFzȒe )C}nI/{|1Q|0c4?It/U>!|?nE(5u$'dˈҊE I)0>Yy8Xx=rY9;gcmz%[W}wk A>.K>eU-W]=`ųFۯzHZ8ӰA'* mO/{h|:u 5H#SD*Q)|y<eNH6ܹ[u?oyy,]i/Azx B IBAɇ%}'lv9a+&h=&|`c뎠i@"zڞkoͳG̋b5I35̱B tEy7L9vl!q)}{7E6}_L~KEܴͪـ`E.uelK_ZםlEB%ݪM/\R{-Ҕ'Ө . gq.Uނ_O}w "4ebpa$CzbQ>$'vSYg/VXA"Cg4tu-Qb'qi_;e5x0i@֡Alʱu餚YQ2_ͻ"3>]аDh*XZ5$&劈oZOnVyQ.{ST;EGXC٤Pnڠ^4~ZxWeH=S=VzW4C3Sj`r*n#6HAݻ!f9X!4[2BEpkO+$ayJV!z7~WXowy ™ h*$ќ"?YR >37$E ?Xp8wIMaV6ɬjFo*[yqj4eM5yVEZE?7%AGK S#0yhN7t o}Xh.DLi&US`a=EҚ|no_w8Zf~~doˌ5+3zЄ|V]oiXxTeOh4A43(v4_9?E9LhRT§|Qo;~'`5_?澮G$?m4 ~4nl`N%VѭQ\*.zU$-''(J HI-AH!D$*ns ? 8']4AZ.0T ++H#a'y>eYUY> mmi.a ×5 Yi=x/-]NJJ"ph!Ō"KKsE>;;S4|+"dʋgݑEyYh& S JNĀ'V>FE,Pyo.\ א[9P3:sRoЉ"u2ڡ݆w_-e{= Zsr0wKxP}uFZLidN 4;?׭rSLp݌}G[lX9H7k5̰m Ub+2hI#SG0sFݗ|( hmH?'BCGenomicAlignments/inst/unitTests/0000755000175200017520000000000014547043765020175 5ustar00biocbuildbiocbuildGenomicAlignments/inst/unitTests/test_GAlignments-class.R0000644000175200017520000000222614516004601024652 0ustar00biocbuildbiocbuildtest_GAlignments_constructor <- function() { checkTrue(validObject(GAlignments())) checkTrue(validObject(GAlignments(seqnames=factor("A"), pos=1L, cigar="1M", strand=strand("-")))) } test_GAlignments_seqlevels <- function() { gal0 <- GAlignments(seqnames=Rle(c("chr1", "chr2")), pos=as.integer(c(10, 100)), cigar=c("50M", "50M"), strand=strand(c("*", "*"))) ## Drop gal <- gal0 seqlevels(gal, pruning.mode="coarse") <- "chr2" checkIdentical("chr2", seqlevels(gal)) ## Rename gal <- gal0 seqlevels(gal)[seqlevels(gal) == "chr2"] <- "2" checkIdentical(c("chr1", "2"), seqlevels(gal)) } test_GAlignments_combine <- function() { galn <- GAlignments(seqnames=factor("A"), pos=1L, cigar="1M", strand=strand("-")) galn_c <- GAlignments(seqnames=rep(factor("A"), 2), pos=rep(1L, 2), cigar=rep("1M", 2), strand=rep(strand("-"), 2)) checkIdentical(galn_c, c(galn, galn)) } GenomicAlignments/inst/unitTests/test_GAlignmentsList-class.R0000644000175200017520000001166614516004601025516 0ustar00biocbuildbiocbuild.noGaps <- GAlignments( Rle(factor(c("chr1", "chr2", "chr1", "chr3")), c(1, 3, 2, 4)), pos=1:10, cigar=paste0(10:1, "M"), strand=Rle(strand(c("-", "+", "*", "+", "-")), c(1, 2, 2, 3, 2)), names=head(letters, 10), score=1:10) .Gaps <- GAlignments( Rle(factor(c("chr2", "chr4")), c(3, 4)), pos=1:7, cigar=c("5M", "3M2N3M2N3M", "5M", "10M", "5M1N4M", "8M2N1M", "5M"), strand=Rle(strand(c("-", "+")), c(4, 3)), names=tail(letters, 7), score=1:7) GAList <- GAlignmentsList(a=.noGaps, b=.Gaps) quiet <- suppressWarnings test_GAlignmentsList_construction <- function() { checkTrue(validObject(GAlignmentsList())) checkTrue(validObject(new("GAlignmentsList"))) checkTrue(validObject(GAlignmentsList(.noGaps, .Gaps))) checkTrue(validObject(GAlignmentsList(GAlignments()))) checkTrue(validObject(GAlignmentsList(a=GAlignments()))) checkException(GAlignmentsList(GRanges()), silent = TRUE) } test_GAlignmentsList_coercion <- function() { galist <- GAlignmentsList(a=.noGaps[seqnames(.noGaps) == "chr3"], b=.Gaps[seqnames(.Gaps) == "chr4"]) ## IRangesList rgl <- rglist(galist) checkIdentical(length(galist), length(rgl)) for (i in seq_along(galist)) { target <- unlist(rglist(galist[[i]]), use.names=FALSE) checkIdentical(target, rgl[[i]]) } ## GRangesList grl <- grglist(galist) checkIdentical(length(galist), length(grl)) for (i in seq_along(galist)) { target <- unlist(grglist(galist[[i]]), use.names=FALSE) checkIdentical(target, grl[[i]]) } ## IntegerRanges checkIdentical(length(ranges(galist)), length(ranges(galist[1])) + length(ranges(galist[2]))) checkIdentical(length(quiet(granges(galist))), length(quiet(granges(galist[1]))) + length(quiet(granges(galist[2])))) checkIdentical(length(granges(galist, ignore.strand=TRUE)), length(granges(galist[1], ignore.strand=TRUE)) + length(granges(galist[2], ignore.strand=TRUE))) gr <- granges(galist, ignore.strand=TRUE) ir <- ranges(galist) checkIdentical(length(gr), length(ir)) gr <- quiet(granges(galist, ignore.strand=FALSE)) checkTrue(length(gr) == 4L) ## data.frame galist <- GAlignmentsList(a=.noGaps[1:2], b=.Gaps[1:2]) df_group <- togroup(PartitioningByWidth(galist)) df <- data.frame(group=df_group, group_name=names(galist)[df_group], seqnames=factor(c("chr1", rep("chr2", 3)), seqlevels(galist)), strand=strand(c("-", "+", "-", "-")), cigar=c("10M", "9M", "5M", "3M2N3M2N3M"), qwidth=c(10L, 9L, 5L, 9L), start=c(1L, 2L, 1L, 2L), end=c(10L, 10L, 5L, 14L), width=c(10L, 9L, 5L, 13L), njunc=c(0L, 0L, 0L, 2L), score=c(1L, 2L, 1L, 2L), row.names=c("a", "b", "t", "u"), stringsAsFactors=FALSE) checkTrue(all.equal(as.data.frame(galist), df)) ## introns galist <- GAList grl <- junctions(galist) checkIdentical(names(galist), names(grl)) checkTrue(length(galist) == length(grl)) checkTrue(length(grl[[1]]) == 0L) checkTrue(length(grl[[2]]) == 4L) ## empty ranges galist <- GAlignmentsList( GAlignments("chr1", 20L, "10M", strand("+")), GAlignments()) checkTrue(length(ranges(galist)) == 1L) checkTrue(length(rglist(galist)) == 2L) checkTrue(length(granges(galist)) == 1L) checkTrue(length(grglist(galist)) == 2L) } test_GAlignmentsList_accessors <- function() { galist <- GAlignmentsList(.noGaps, .Gaps) target <- RleList(lapply(GAList, seqnames), compress=TRUE) checkIdentical(seqnames(GAList), target) target <- RleList(lapply(GAList, rname), compress=TRUE) checkIdentical(rname(GAList), target) target <- CharacterList(lapply(GAList, cigar), compress=TRUE) checkIdentical(cigar(GAList), target) target <- RleList(lapply(GAList, strand), compress=TRUE) checkIdentical(strand(GAList), target) target <- IntegerList(lapply(GAList, width)) checkIdentical(width(GAList), target) target <- SplitDataFrameList(lapply(GAList, mcols)) checkIdentical(mcols(GAList, level="within"), target) } test_GAlignmentsList_subset_combine <- function() { galist <- GAList score <- seq_len(nobj(PartitioningByWidth(galist))) meta <- DataFrame(score=score, more=score+10) mcols(galist@unlistData) <- meta ## 'c' checkIdentical(GAlignmentsList(), c(GAlignmentsList(), GAlignmentsList())) checkIdentical(GAlignmentsList(.noGaps, .Gaps), quiet(c(GAlignmentsList(.noGaps), GAlignmentsList(.Gaps)))) ## '[' checkIdentical(galist, galist[]) checkIdentical(galist, galist[Rle(TRUE)]) checkIdentical(galist[c(TRUE, FALSE),], galist[1]) } GenomicAlignments/inst/unitTests/test_cigar-utils.R0000644000175200017520000001042614516004601023563 0ustar00biocbuildbiocbuild### test_cigarRangesAlongReferenceSpace <- function() { cigar <- c("30M5000N10M", "50M4S", "90=10X5I50M10D40M", "18M10I22M", "99I") pos <- c(101, 201, 1001, 301, 2001) seqlevels <- c("chr2", "chr6") rname <- factor(c("chr6", "chr6", "chr2", "chr6", "chr2"), levels=seqlevels) ops <- c("M", "=", "X", "I", "D") current <- as.list(cigarRangesAlongReferenceSpace(cigar, pos=pos, f=rname, ops=ops)) ir2 <- IRanges(start=c(1001, 1091, 1101, 1101, 1151, 1161, 2001), end=c(1090, 1100, 1100, 1150, 1160, 1200, 2000)) ir6 <- IRanges(start=c(101, 5131, 201, 301, 319, 319), end=c(130, 5140, 250, 318, 318, 340)) target <- list(chr2=ir2, chr6=ir6) checkIdentical(target, current) current <- as.list(cigarRangesAlongReferenceSpace(cigar, pos=pos, f=rname, ops=ops, reduce.ranges=TRUE)) ir2b <- c(reduce(ir2[1:6]), reduce(ir2[7])) ir6b <- c(reduce(ir6[1:2]), reduce(ir6[3]), reduce(ir6[4:6])) target <- list(chr2=ir2b, chr6=ir6b) checkIdentical(target, current) current <- as.list(extractAlignmentRangesOnReference(cigar, pos=pos, f=rname)) checkIdentical(target, current) current <- as.list(cigarRangesAlongReferenceSpace(cigar, pos=pos, f=rname, ops=setdiff(ops, "D"))) ir2 <- ir2[-5] target <- list(chr2=ir2, chr6=ir6) checkIdentical(target, current) current <- as.list(cigarRangesAlongReferenceSpace(cigar, pos=pos, f=rname, ops=setdiff(ops, "D"), reduce.ranges=TRUE)) ir2 <- c(reduce(ir2[1:5]), reduce(ir2[6])) ir6 <- c(reduce(ir6[1:2]), reduce(ir6[3]), reduce(ir6[4:6])) target <- list(chr2=ir2, chr6=ir6) checkIdentical(target, current) current <- as.list(extractAlignmentRangesOnReference(cigar, pos=pos, drop.D.ranges=TRUE, f=rname)) checkIdentical(target, current) } test_cigarQNarrow <- function() { cigar <- c("25M4D10M", "6S17M6I3M3S") ans <- cigarQNarrow(cigar) ans0 <- cigar attr(ans0, "rshift") <- c(0L, 0L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=3, end=-3) ans0 <- c("23M4D8M", "4S17M6I3M1S") attr(ans0, "rshift") <- c(2L, 0L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=7, end=-4) ans0 <- c("19M4D7M", "17M6I3M") attr(ans0, "rshift") <- c(6L, 0L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=8, end=-5) ans0 <- c("18M4D6M", "16M6I2M") attr(ans0, "rshift") <- c(7L, 1L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=25) ans0 <- c("1M4D10M", "5I3M3S") attr(ans0, "rshift") <- c(24L, 17L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=26) ans0 <- c("10M", "4I3M3S") attr(ans0, "rshift") <- c(29L, 17L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=26, end=-8) ans0 <- c("3M", "3I") attr(ans0, "rshift") <- c(29L, 17L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=26, end=-10) ans0 <- c("1M", "1I") attr(ans0, "rshift") <- c(29L, 17L) checkIdentical(ans, ans0) } test_cigarNarrow <- function() { cigar <- c("25M4D10M", "6S17M6I3M3S") ans <- cigarNarrow(cigar) ans0 <- c("25M4D10M", "17M6I3M") attr(ans0, "rshift") <- c(0L, 0L) checkIdentical(ans, ans0) ans <- cigarNarrow(cigar, start=3, end=-3) ans0 <- c("23M4D8M", "15M6I1M") attr(ans0, "rshift") <- c(2L, 2L) checkIdentical(ans, ans0) ans <- cigarNarrow(cigar, start=7, end=-4) ans0 <- c("19M4D7M", "11M") attr(ans0, "rshift") <- c(6L, 6L) checkIdentical(ans, ans0) ans <- cigarNarrow(cigar, start=8, end=-5) ans0 <- c("18M4D6M", "9M") attr(ans0, "rshift") <- c(7L, 7L) checkIdentical(ans, ans0) ans <- cigarNarrow(cigar[1], start=26, end=-10) ans0 <- "1M" attr(ans0, "rshift") <- 29L checkIdentical(ans, ans0) } GenomicAlignments/inst/unitTests/test_coordinate-mapping-methods.R0000644000175200017520000001431614547043765026605 0ustar00biocbuildbiocbuild## CIGAR ops M, =, X x1 <- GRanges("chr1", IRanges(c(5, 10, 20, 25), width=2, names=LETTERS[1:4])) align1 <- GAlignments(rep("chr1", 3), rep(10L, 3), c("11M", "11=", "11X"), strand(rep("+", 3)), names=letters[1:3]) ## CIGAR ops S, N, D, I, H, P x2 <- GRanges("chr1", IRanges(c(1, 20), width=6, names=LETTERS[1:2])) cigar <- c("1S6M1S", "3M2N3M", "3M2D3M", "3M2I3M", "1H6M1H", "1P6M1P") align2 <- GAlignments(rep("chr1", 6), rep(10L, 6), cigar, strand(rep("+", 6))) align3 <- GAlignments(rep("chr1", 6), rep(20L, 6), cigar, strand(rep("+", 6))) names(align2) <- names(align3) <- letters[1:6] x2bis <- GRanges("chr1", IRanges(1:6, width=1, names=LETTERS[1:6])) align2bis <- GAlignments("chr1", 2L, cigar = "1S2M1S", strand("+")) names(align2bis) = letters[1] test_mapToAlignments <- function() { ans <- mapToAlignments(x1, align1) checkIdentical(start(ans), rep(1L, 3)) checkIdentical(end(ans), rep(2L, 3)) checkIdentical(mcols(ans)$xHits, c(rep(2L, 3))) checkIdentical(mcols(ans)$alignmentsHits, c(1L, 2L, 3L)) checkIdentical(names(ans), rep("B", 3)) checkIdentical(seqlevels(ans), letters[1:3]) ans <- mapToAlignments(x2, align3) checkIdentical(end(ans), c(7L, 4L, 4L, 8L, 6L, 6L)) checkIdentical(mcols(ans)$alignmentsHits, as.integer(1:6)) ans <- mapToAlignments(x2bis, align2bis) checkIdentical(start(ans), c(2L, 3L)) checkIdentical(end(ans), c(2L, 3L)) checkIdentical(mcols(ans)$xHits, c(2L, 3L)) } test_mapFromAlignments <- function() { x <- x1 names(x) <- rep("all", length(x)) align <- align1 names(align) <- rep("all", length(align)) ans <- mapFromAlignments(x, align) checkIdentical(start(ans), c(14L, 14L, 14L, 19L, 19L, 19L)) checkIdentical(mcols(ans)$xHits, c(rep(1L, 3), rep(2L, 3))) checkIdentical(mcols(ans)$alignmentsHits, rep(1:3, 2)) checkIdentical(seqlevels(ans), "chr1") checkIdentical(names(ans), rep("all", 6)) names(x) <- c("hit", "hit", "blank", "blank") names(align) <- c("BLANK", "hit", "BLANK") ans <- mapFromAlignments(x, align) checkIdentical(names(ans), c("hit", "hit")) checkIdentical(seqlevels(ans), "chr1") x <- x2 names(x) <- rep("all", length(x)) align <- align2 names(align) <- rep("all", length(align)) ans <- mapFromAlignments(x, align) checkIdentical(start(ans), rep(10L, 6)) checkIdentical(end(ans), c(15L, 17L, 17L, 13L, 15L, 15L)) checkIdentical(mcols(ans)$alignmentsHits, as.integer(1:6)) } test_pmapToAlignments <- function() { x <- x1 align <- rep(align1[1], length(x1)) ans <- pmapToAlignments(x, align) checkIdentical(length(ans), length(x)) checkIdentical(width(ans), c(0L, 2L, 0L, 0L)) checkIdentical(start(ans), c(0L, 1L, 0L, 0L)) checkIdentical(end(ans), c(-1L, 2L, -1L, -1L)) checkIdentical(names(ans), names(x)) checkTrue(all(seqlevels(ans) %in% c("a", "UNMAPPED"))) x <- rep(x2[2], length(align3)) align <- align3 ans <- pmapToAlignments(x, align) checkIdentical(width(ans), c(6L, 4L, 4L, 8L, 6L, 6L)) checkIdentical(start(ans), c(2L, rep(1L, 5))) checkIdentical(end(ans), c(7L, 4L, 4L, 8L, 6L, 6L)) } test_pmapFromAlignments <- function() { x <- x1 names(x) <- rep("all", length(x)) align <- rep(align1[1], length(x1)) names(align) <- rep("all", length(align)) ans <- pmapFromAlignments(x, align) checkTrue(ncol(mcols(ans)) == 0L) checkTrue(length(ans) == length(x1)) checkIdentical(width(ans), c(2L, 2L, 0L, 0L)) checkIdentical(start(ans), c(14L, 19L, 0L, 0L)) checkIdentical(names(ans), names(x)) checkTrue(all(seqlevels(ans) %in% c("chr1", "UNMAPPED"))) x <- rep(x2[1], length(align2)) names(x) <- LETTERS[seq_along(x)] align <- align2 ans <- pmapFromAlignments(x, align) checkIdentical(width(ans), c(6L, 8L, 8L, 4L, 6L, 6L)) checkIdentical(end(ans), c(15L, 17L, 17L, 13L, 15L, 15L)) checkIdentical(names(ans), names(x)) checkTrue(all(seqlevels(ans) %in% "chr1")) } test_ref_locs_to_query_locs <- function() { cigar <- "66S42M2I20M8I18D15M43243N5M1D38M1D85M1D115M139S" pos <- 525842L ref <- 43425L + pos - 1L query <- 238L ans <- .Call("ref_locs_to_query_locs", ref, cigar, pos, FALSE, PACKAGE="GenomicAlignments") checkIdentical(ans, query) ## out of bounds ans_s <- .Call("ref_locs_to_query_locs", start(x1[1]), cigar(align1[1]), start(align1[1]), FALSE, PACKAGE="GenomicAlignments") ans_e <- .Call("ref_locs_to_query_locs", end(x1[1]), cigar(align1[1]), start(align1[1]), TRUE, PACKAGE="GenomicAlignments") checkIdentical(ans_s, NA_integer_) checkIdentical(ans_e, NA_integer_) } test_query_locs_to_ref_locs <- function() { ## out of bounds ans_s <- .Call("query_locs_to_ref_locs", start(x1[4]), cigar(align1[1]), start(align1[1]), FALSE, PACKAGE="GenomicAlignments") ans_e <- .Call("query_locs_to_ref_locs", end(x1[4]), cigar(align1[1]), start(align1[1]), TRUE, PACKAGE="GenomicAlignments") checkIdentical(ans_s, NA_integer_) checkIdentical(ans_e, NA_integer_) } test_map_ref_locs_to_query_locs <- function() { ## hit map <- .Call("map_ref_locs_to_query_locs", 12L, 16L, "11M", 10L) checkIdentical(unlist(map), c(3L, 7L, 1L, 1L)) ## first record out of bounds map <- .Call("map_ref_locs_to_query_locs", c(5L, 12L), c(16L, 16L), "11M", 10L) checkIdentical(unlist(map), c(3L, 7L, 2L, 1L)) ## second record out of bounds map <- .Call("map_ref_locs_to_query_locs", c(12L, 5L), c(16L, 16L), "11M", 10L) checkIdentical(unlist(map), c(3L, 7L, 1L, 1L)) ## first alignment out of bounds map <- .Call("map_ref_locs_to_query_locs", 12L, 16L, c("11M", "11M"), c(20L, 10L)) checkIdentical(unlist(map), c(3L, 7L, 1L, 2L)) ## second alignment out of bounds map <- .Call("map_ref_locs_to_query_locs", 12L, 16L, c("11M", "11M"), c(10L, 20L)) checkIdentical(unlist(map), c(3L, 7L, 1L, 1L)) } GenomicAlignments/inst/unitTests/test_findSpliceOverlaps-methods.R0000644000175200017520000002333614516004601026601 0ustar00biocbuildbiocbuild## TODO: Add tests for the following "findSpliceOverlaps" methods: ## findSpliceOverlaps,GAlignments,GRangesList ## findSpliceOverlaps,GAlignmentPairs,GRangesList ## findSpliceOverlaps,character,ANY ## findSpliceOverlaps,BamFile,ANY .extract <- function(x, col) as.logical(mcols(x)[[col]]) test_findSpliceOverlaps_compatible <- function() { genes <- GRangesList( GRanges("chr1", IRanges(5, 15), "+"), GRanges("chr1", IRanges(5, 15), "-")) reads <- GRangesList(GRanges("chr1", IRanges(3, 13), "+")) res <- findSpliceOverlaps(reads, genes[1]) checkIdentical(FALSE, .extract(res, "compatible")) res <- findSpliceOverlaps(reads, genes[2]) checkIdentical(logical(0), .extract(res, "compatible")) ## exact match to intron boundaries ## (no overlap between 'reads' and 'genes') genes <- GRangesList( GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+")) reads <- GRangesList( GRanges("chr1", IRanges(11, 19), "+")) res <- findSpliceOverlaps(reads, genes) checkIdentical(logical(0), .extract(res, "compatible")) ## overlap and span intron boundaries genes <- GRangesList( GRanges("chr1", IRanges(c(5, 20, 30), c(10, 25, 35)), "+")) reads <- GRangesList( GRanges("chr1", IRanges(5, 12), "+"), GRanges("chr1", IRanges(18, 23), "+"), GRanges("chr1", IRanges(c(4, 30), c(26, 36)), "+")) res <- findSpliceOverlaps(reads[1], genes) ## not a junction read checkIdentical(FALSE, .extract(res, "compatible")) res <- findSpliceOverlaps(reads[2], genes) ## not a junction read checkIdentical(FALSE, .extract(res, "compatible")) res <- findSpliceOverlaps(reads[3], genes) ## junction read checkIdentical(FALSE, .extract(res, "compatible")) } #test_findSpliceOverlaps_novelTSS <- function() #{ # ## strand # genes <- GRangesList( # GRanges("chr1", IRanges(5, 15), "+"), # GRanges("chr1", IRanges(5, 15), "-"), # GRanges("chr1", IRanges(5, 15), "*")) # reads <- GRangesList(GRanges("chr1", IRanges(3, 13), "+")) # res <- findSpliceOverlaps(reads, genes[1]) # checkIdentical(TRUE, .extract(res, "novelTSS")) # res <- suppressWarnings(findSpliceOverlaps(reads, genes[2])) # checkIdentical(logical(0), .extract(res, "novelTSS")) # res <- findSpliceOverlaps(reads, genes[3]) # checkIdentical(TRUE, .extract(res, "novelTSS")) # # ## multiple matches # genes <- GRangesList( # GRanges("chr1", IRanges(15, 20), "+"), # GRanges("chr1", IRanges(10, 20), "+"), # GRanges("chr1", IRanges(5, 20), "+")) # reads <- GRangesList(GRanges("chr1", IRanges(5, 20), "+")) # res <- findSpliceOverlaps(reads, genes[1]) # checkIdentical(TRUE, .extract(res, "novelTSS")) # res <- findSpliceOverlaps(reads, genes[1:2]) # checkIdentical(c(TRUE, TRUE), .extract(res, "novelTSS")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(c(FALSE, FALSE, FALSE), .extract(res, "novelTSS")) # # ## junctions # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 15), c(10, 20)), "+")) # reads <- GRangesList( # GRanges("chr1", IRanges(12, 23), "+"), # GRanges("chr1", IRanges(3, 18), "+")) # res <- findSpliceOverlaps(reads[1], genes) # checkIdentical(FALSE, .extract(res, "novelTSS")) # res <- findSpliceOverlaps(reads[2], genes) # checkIdentical(TRUE, .extract(res, "novelTSS")) #} #test_findSpliceOverlaps_novelTSE <- function() #{ # ## strand # genes <- GRangesList( # GRanges("chr1", IRanges(5, 15), "+"), # GRanges("chr1", IRanges(5, 15), "-"), # GRanges("chr1", IRanges(5, 15), "*")) # reads <- GRangesList(GRanges("chr1", IRanges(12, 18), "+")) # res <- findSpliceOverlaps(reads, genes[1]) # checkIdentical(TRUE, .extract(res, "novelTSE")) # res <- findSpliceOverlaps(reads, genes[2]) # checkIdentical(logical(0), .extract(res, "novelTSE")) # res <- findSpliceOverlaps(reads, genes[3]) # checkIdentical(TRUE, .extract(res, "novelTSE")) # # ## multiple matches # genes <- GRangesList( # GRanges("chr1", IRanges(5, 15), "+"), # GRanges("chr1", IRanges(5, 20), "+"), # GRanges("chr1", IRanges(5, 25), "+")) # reads <- GRangesList(GRanges("chr1", IRanges(5, 25), "+")) # res <- findSpliceOverlaps(reads, genes[1]) # checkIdentical(TRUE, .extract(res, "novelTSE")) # res <- findSpliceOverlaps(reads, genes[1:2]) # checkIdentical(c(TRUE, TRUE), .extract(res, "novelTSE")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(c(FALSE, FALSE, FALSE), .extract(res, "novelTSE")) # # ## junctions # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 15), c(10, 20)), "+")) # reads <- GRangesList( # GRanges("chr1", IRanges(2, 12), "+"), # GRanges("chr1", IRanges(18, 23), "+")) # res <- findSpliceOverlaps(reads[1], genes) # checkIdentical(FALSE, .extract(res, "novelTSE")) # res <- findSpliceOverlaps(reads[2], genes) # checkIdentical(TRUE, .extract(res, "novelTSE")) #} #test_findSpliceOverlaps_novelExon <- function() #{ # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+")) # ## 'within' intron boundaries # reads <- GRangesList( # GRanges("chr1", IRanges(c(7, 12, 20), c(10, 18, 23)), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(TRUE, .extract(res, "novelExon")) # # ## FIXME :currently TRUE # ## Do we want a novel exon to be completely w/in? # reads <- GRangesList( # GRanges("chr1", IRanges(c(5, 9, 20), c(7, 12, 23)), "+"), # GRanges("chr1", IRanges(c(7, 15, 23), c(10, 21, 25)), "+")) # res <- findSpliceOverlaps(reads[1], genes) # checkIdentical(TRUE, .extract(res, "novelExon")) # res <- findSpliceOverlaps(reads[2], genes) # checkIdentical(TRUE, .extract(res, "novelExon")) # # ## region not 'intronic' in all transcripts # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+"), # GRanges("chr1", IRanges(c(5, 20), c(15, 25)), "+")) # reads <- GRangesList( # GRanges("chr1", IRanges(c(7, 12, 20), c(10, 18, 23)), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(c(FALSE, FALSE), .extract(res, "novelExon")) #} #test_findSpliceOverlaps_novelRetention <- function() #{ # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+")) # ## 'within' intron boundaries # reads <- GRangesList( # GRanges("chr1", IRanges(c(7, 12, 20), c(10, 18, 23)), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(TRUE, .extract(res, "novelRetention")) # # ## exact match to intron boundaries # ## (no overlap between 'reads' and 'genes') # reads <- GRangesList( # GRanges("chr1", IRanges(11, 19), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(logical(0), .extract(res, "compatible")) # # ## overlap and span intron boundaries # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20, 30), c(10, 25, 35)), "+")) # reads <- GRangesList( # GRanges("chr1", IRanges(5, 12), "+"), # GRanges("chr1", IRanges(18, 23), "+"), # GRanges("chr1", IRanges(c(4, 30), c(26, 36)), "+")) # res <- findSpliceOverlaps(reads[1], genes) ## not a junction read # checkIdentical(TRUE, .extract(res, "novelRetention")) # res <- findSpliceOverlaps(reads[3], genes) ## junction read # checkIdentical(TRUE, .extract(res, "novelRetention")) # # ## FIXME : hits a portion of the intronic region # ## but is not completely 'within' # ## region is not 'intronic' in all transcripts # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+"), # GRanges("chr1", IRanges(c(5, 20), c(15, 25)), "+")) # reads <- GRangesList( # GRanges("chr1", IRanges(4, 26), "+")) # res <- findSpliceOverlaps(reads[1], genes) # checkIdentical(c(TRUE, TRUE), .extract(res, "novelRetention")) #} # #test_findSpliceOverlaps_novelSite <- function() #{ # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 15), c(10, 20)), "+")) # ## single novel site, novel junction # reads <- GRangesList( # GRanges("chr1", IRanges(c(5, 15), c(7, 20)), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(TRUE, .extract(res, "novelSite")) # checkIdentical(TRUE, .extract(res, "novelJunction")) # # ## two novel sites, novel junction # reads <- GRangesList( # GRanges("chr1", IRanges(c(5, 17), c(7, 20)), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(TRUE, .extract(res, "novelSite")) # checkIdentical(TRUE, .extract(res, "novelJunction")) #} # #test_findSpliceOverlaps_novelJunction <- function() #{ # ## novel junction, no novel sites # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+"), # GRanges("chr1", IRanges(c(5, 22), c(15, 25)), "+")) # # ## query = GRanges # reads <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(15, 25)), "+")) # GRres <- findSpliceOverlaps(reads, genes) # checkIdentical(c(TRUE, TRUE), .extract(GRres, "novelJunction")) # checkIdentical(c(FALSE, FALSE), .extract(GRres, "novelSite")) # # ## query = GAlignments # gal <- GAlignments("chr1", 5L, "11M4N6M", strand("+")) # GALres <- findSpliceOverlaps(gal, genes) # checkIdentical(c(TRUE, TRUE), .extract(GALres, "novelJunction")) # checkIdentical(c(FALSE, FALSE), .extract(GALres, "novelSite")) # # ## query = GAlignmentPairs # gal1 <- GAlignments("chr1", 5L, "11M4N6M", strand("+")) # gal2 <- GAlignments("chr1", 50L, "6M", strand("-")) # galp <- GAlignmentPairs(gal1, gal2) # GALPres <- findSpliceOverlaps(galp, genes) # checkIdentical(c(TRUE, TRUE), .extract(GALPres, "novelJunction")) # checkIdentical(c(FALSE, FALSE), .extract(GALPres, "novelSite")) #} GenomicAlignments/inst/unitTests/test_intra-range-methods.R0000644000175200017520000000315214516004601025206 0ustar00biocbuildbiocbuild.noGaps <- GAlignments( Rle(factor(c("chr1", "chr2", "chr1", "chr3")), c(1, 3, 2, 4)), pos=1:10, cigar=paste0(10:1, "M"), strand=Rle(strand(c("-", "+", "*", "+", "-")), c(1, 2, 2, 3, 2)), names=head(letters, 10), score=1:10) .Gaps <- GAlignments( Rle(factor(c("chr2", "chr4")), c(3, 4)), pos=1:7, cigar=c("5M", "3M2N3M2N3M", "5M", "10M", "5M1N4M", "8M2N1M", "5M"), strand=Rle(strand(c("-", "+")), c(4, 3)), names=tail(letters, 7), score=1:7) test_GAlignments_qnarrow <- function() { gal <- GAlignments(seqnames=rep(factor("A"), 8), pos=10:17, cigar=c("5M", "5X", "3M2I3M", "3M2D3M", "3M2N3M", "3M2S3M", "3M2H3M", "3M2P3M"), strand=Rle(strand(rep("+", 8)))) n1 <- narrow(gal, start=3) q1 <- qnarrow(gal, start=3) checkIdentical(qwidth(n1), qwidth(q1)) checkIdentical(width(n1), width(q1)) n2 <- narrow(gal, start=4) q2 <- qnarrow(gal, start=4) checkIdentical(width(n2), width(q2)) ## M and X checkIdentical(qwidth(n2[1:2]), qwidth(q2[1:2])) ## I checkIdentical(qwidth(q2[3]), width(q2[3]) + 2L) ## D, N and P checkIdentical(qwidth(q2[c(4,5,8)]), width(q2[c(4,5,8)])) ## S and H checkIdentical(qwidth(q2[6]), width(q2[6]) + 2L) checkIdentical(qwidth(q2[7]), width(q2[7])) } test_GAlignmentsList_qnarrow <- function() { galist <- GAlignmentsList(.noGaps[1:6], .Gaps) qn <- qnarrow(galist, end=-4) checkIdentical(qnarrow(galist[[1]], end=-4), qn[[1]]) checkIdentical(qnarrow(galist[[2]], end=-4), qn[[2]]) } GenomicAlignments/inst/unitTests/test_readGAlignmentPairs.R0000644000175200017520000002774514516004601025234 0ustar00biocbuildbiocbuild### test_readGAlignmentPairs.R # Flag bits summary # ----------------- # 0x1: template having multiple segments in sequencing # 0x2: each segment properly aligned according to the aligner # 0x4: segment unmapped # 0x8: next segment in the template unmapped # 0x10: SEQ being reverse complemented # 0x20: SEQ of the next segment in the template being reversed # 0x40: the first segment in the template # 0x80: the last segment in the template # 0x100: secondary alignment # 0x200: not passing quality controls # 0x400: PCR or optical duplicate make_samline <- function(QNAME, mapped=0, RNAME="*", POS=0, strand="+", primary=1, flagbits=0, RNEXT="*", PNEXT=0, proper=0) { FLAG <- 0x4 * (!mapped) + 0x10 * (strand == "-") + 0x100 * (!primary) + 0x2 * proper + flagbits if (mapped) { CIGAR <- "14M" } else { CIGAR <- "*" } paste(QNAME, FLAG, RNAME, POS, "255", CIGAR, RNEXT, PNEXT, "0", "*", "*", sep="\t") } make_mapped_pair <- function(QNAME, RNAME1, POS1, CIGAR1, strand1, RNAME2, POS2, CIGAR2, strand2, primary, proper, pair_id=NA) { flag0 <- 0x1 + 0x2 * proper + 0x100 * (!primary) FLAG1 <- flag0 + 0x40 + 0x10 * (strand1 == "-") + 0x20 * (strand2 == "-") FLAG2 <- flag0 + 0x80 + 0x10 * (strand2 == "-") + 0x20 * (strand1 == "-") line1 <- paste(QNAME, FLAG1, RNAME1, POS1, "255", CIGAR1, RNAME2, POS2, "0", "*", "*", sep="\t") line2 <- paste(QNAME, FLAG2, RNAME2, POS2, "255", CIGAR2, RNAME1, POS1, "0", "*", "*", sep="\t") if (!identical(pair_id, NA)) { pair_id_tag <- paste0("pi:Z:", pair_id) line1 <- paste(line1, pair_id_tag, sep="\t") line2 <- paste(line2, pair_id_tag, sep="\t") } c(line1, line2) } make_mapped_pairs <- function(mapped_pair_table) { if (!is.data.frame(mapped_pair_table)) { if (is.character(mapped_pair_table)) mapped_pair_table <- textConnection(mapped_pair_table) mapped_pair_table <- read.table(mapped_pair_table, header=TRUE, stringsAsFactors=FALSE) } row_groups <- unname(split(seq_len(nrow(mapped_pair_table)), mapped_pair_table$QNAME)) unlist(lapply(row_groups, function(row_group) { lines <- unlist(lapply(row_group, function(i) do.call("make_mapped_pair", mapped_pair_table[i, ]))) if (length(row_group) == 3L) { lines[c(2L, 4L, 6L)] <- lines[c(6L, 2L, 4L)] } else { lines[c(FALSE, TRUE)] <- rev(lines[c(FALSE, TRUE)]) } lines })) } make_toy_bamfile <- function(mapped_pair_table, filename) { lines0 <- c("@HD\tVN:1.3", "@SQ\tSN:chr1\tLN:2450", "@SQ\tSN:chr2\tLN:1882", "@SQ\tSN:chrX\tLN:999") ## Single end reads lines1 <- c( ## s001: 1 primary alignment make_samline("s001", mapped=1, RNAME="chr1", POS=10, strand="+", primary=1), ## s002: 1 primary alignment + 3 secondary alignments make_samline("s002", mapped=1, RNAME="chr1", POS=20, strand="+", primary=1), make_samline("s002", mapped=1, RNAME="chr1", POS=21, strand="+", primary=0), make_samline("s002", mapped=1, RNAME="chr1", POS=22, strand="+", primary=0), make_samline("s002", mapped=1, RNAME="chr1", POS=20, strand="+", primary=0), ## s003: unmapped make_samline("s003") ) ## Paired end reads lines2 <- c( ## Mapped pairs make_mapped_pairs(mapped_pair_table), ## p991: 1 pair with a missing mate (can happen if file was subsetted ## with e.g. filterBam) make_mapped_pair("p991", "chr2", 150, "18M", "+", "chr2", 199, "18M", "-", primary=1, proper=1)[2L], ## p992: 1 pair with 1st mate unmapped and 2nd mate mapped make_samline("p992", flagbits=0x1 + 0x40, RNEXT="chr2", PNEXT=150), make_samline("p992", mapped=1, RNAME="chr2", POS=150, strand="+", primary=1, flagbits=0x1 + 0x8 + 0x80), ## p993: 1 pair with both mates unmapped make_samline("p993", flagbits=0x1 + 0x8 + 0x40), make_samline("p993", flagbits=0x1 + 0x8 + 0x80) ) ## Reads with multiple segments lines3 <- c( ## m001: 3 segments in the template (index of each segment in template ## is known) make_samline("m001", mapped=1,, RNAME="chrX", POS=10, strand="+", flagbits=0x1 + 0x40, RNEXT="chrX", PNEXT=20, proper=1), make_samline("m001", mapped=1, RNAME="chrX", POS=20, strand="+", flagbits=0x1 + 0x40 + 0x80, RNEXT="chrX", PNEXT=30, proper=1), make_samline("m001", mapped=1, RNAME="chrX", POS=30, strand="+", flagbits=0x1 + 0x80, RNEXT="chrX", PNEXT=10, proper=1), ## m002: 3 segments in the template (index of each segment in template ## was lost) make_samline("m002", mapped=1, RNAME="chrX", POS=10, strand="+", flagbits=0x1, RNEXT="chrX", PNEXT=20, proper=1), make_samline("m002", mapped=1, RNAME="chrX", POS=20, strand="+", flagbits=0x1, RNEXT="chrX", PNEXT=30, proper=1), make_samline("m002", mapped=1, RNAME="chrX", POS=30, strand="+", flagbits=0x1, RNEXT="chrX", PNEXT=10, proper=1) ) samfile <- paste0(filename, ".sam") cat(c(lines0, lines1, lines2, lines3), file=samfile, sep="\n") bamfile <- asBam(samfile, filename, overwrite=TRUE) ## Should never happen. if (bamfile != paste0(filename, ".bam")) stop("asBam() returned an unexpected path") bamfile } ### 1 line per mapped pair. Each line will generate 2 lines/records in the ### SAM file. The pair_id field will be stored in the SAM/BAM file as a user ### defined tag ("pi" tag). mapped_pair_table <- " QNAME RNAME1 POS1 CIGAR1 strand1 RNAME2 POS2 CIGAR2 strand2 primary proper pair_id # p001: 1 primary proper pair p001 chr2 10 18M + chr2 110 18M - 1 1 p001 # p002: 1 primary non proper pair p002 chr2 20 18M + chr2 120 18M - 1 0 p002 # p003: 2 proper pairs: 1 primary + 1 secondary p003 chr2 30 18M + chr2 130 18M - 1 1 p003a p003 chr2 31 18M + chr2 131 18M - 0 1 p003b # p004: 2 non proper pairs: 1 primary + 1 secondary p004 chr2 40 18M + chr2 140 18M - 1 0 p004a p004 chr2 41 18M + chr2 141 18M - 0 0 p004b # p005: 2 primary pairs (some aligners seem to produce that, even though they # probably shouldn't) p005 chr2 50 18M + chr2 150 18M - 1 1 p005a p005 chr2 51 18M + chr2 151 18M - 1 1 p005b # p006: 3 pairs: 1 primary proper + 1 secondary proper + 1 secondary non # proper p006 chr2 60 18M + chr2 160 18M - 1 1 p006a p006 chr2 61 18M + chr2 161 18M - 0 1 p006b p006 chr2 62 18M + chr2 60 18M - 0 0 p006c # p007: 2 pairs mapped to the same position: 1 primary proper + 1 secondary # proper p007 chr2 70 9M1D9M + chr2 170 18M - 1 1 p007a p007 chr2 70 18M + chr2 170 7M2I9M - 0 1 p007b # p008: 3 pairs mapped to the same position: 1 primary proper + 1 secondary # proper + 1 secondary non proper p008 chr2 80 18M + chr2 180 18M - 1 1 p008a p008 chr2 80 9M2D9M + chr2 180 7M2I9M - 0 1 p008b p008 chr2 80 6M3I9M + chr2 180 9M3D9M - 0 0 p008c # p009: 3 pairs mapped to the same position: 1 primary proper + 2 secondary # proper. The secondary pairs can NOT be disambiguated. p009 chr2 90 18M + chr2 190 18M - 1 1 p009a p009 chr2 90 9M2D9M + chr2 190 7M2I9M - 0 1 p009b p009 chr2 90 6M3I9M + chr2 190 9M3D9M - 0 1 p009c " toy_bamfile <- make_toy_bamfile(mapped_pair_table, tempfile()) test_readGAlignmentPairs <- function() { param <- ScanBamParam(tag="pi") galp <- suppressWarnings( readGAlignmentPairs(toy_bamfile, use.names=TRUE, param=param) ) ## Check the dumped alignments dumped_gal <- getDumpedAlignments() checkTrue(validObject(dumped_gal, complete=TRUE)) pi_target <- rep(c("p009b", "p009c"), each=2) checkIdentical(pi_target, sort(mcols(dumped_gal)$pi)) ## Check 'galp' checkTrue(validObject(galp, complete=TRUE)) pi_target <- c("p001", "p002", "p003a", "p003b", "p004a", "p004b", "p005a", "p005b", "p006a", "p006b", "p006c", "p007a", "p007b", "p008a", "p008b", "p008c", "p009a") checkIdentical(pi_target, mcols(first(galp))$pi) checkIdentical(pi_target, mcols(last(galp))$pi) } ### Starting with BioC 2.14, readGAlignmentPairs() behavior changed when ### using the 'which' argument. Old behavior: the same pair was returned once ### per each range in 'which' that had an overlap with the *two* segments in ### the pair. New behavior: the same pair is returned once per each range in ### 'which' that has an overlap with *any* of the 2 segments in the pair. ### The new behavior is a consequence of using ### scanBam(BamFile(asMates=TRUE), ...) ### behind the scene instead of ### findMateAlignment() ### for the pairing. ### The new behavior breaks the test below so I'm turning it off for now. if (FALSE) { test_readGAlignmentPairs_which <- function() { ## 4 non-overlapping regions of interest: first two regions only overlap ## with first p001 mate and last two regions only with last p001 mate. my_ROI <- GRanges("chr2", IRanges(c(10, 15, 110, 115), width=1)) my_ROI_labels <- c("chr2:10-10", "chr2:15-15", "chr2:110-110", "chr2:115-115") param <- ScanBamParam(tag="pi", which=my_ROI[c(1, 4)]) target1 <- readGAlignmentPairs(toy_bamfile, use.names=TRUE, param=param, with.which_label=TRUE) checkTrue(validObject(target1, complete=TRUE)) checkIdentical(1L, length(target1)) checkIdentical(Rle(factor(my_ROI_labels[1], levels=my_ROI_labels[c(1, 4)])), mcols(first(target1))$which_label) checkIdentical(Rle(factor(my_ROI_labels[4], levels=my_ROI_labels[c(1, 4)])), mcols(last(target1))$which_label) mcols(target1@first)$which_label <- mcols(target1@last)$which_label <- NULL ## Checking all possible combinations of ranges in 'which'. check_my_ROI_subsets <- function(subset) { check_my_ROI_subset <- function(i) { #print(i) param <- ScanBamParam(tag="pi", which=my_ROI[i]) current <- suppressWarnings( readGAlignmentPairs(toy_bamfile, use.names=TRUE, param=param) ) if (sum(i <= 2L) == 1L && sum(i >= 3L) == 1L) { checkIdentical(target1, current) } else { checkIdentical(0L, length(current)) } } check_my_ROI_subset(subset) if (length(subset) >= 2L) { check_my_ROI_subset(rev(subset)) if (length(subset) >= 4L) check_my_ROI_subset(c(4L, 1:3)) } TRUE } for (m in 1:length(my_ROI)) combn(length(my_ROI), m, FUN=check_my_ROI_subsets) } } GenomicAlignments/inst/unitTests/test_readGAlignments.R0000644000175200017520000000431114516004601024400 0ustar00biocbuildbiocbuildtest_readGAlignments <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") which <- IRangesList(seq1=IRanges(1, width=100)) param <- ScanBamParam(which=which) result <- readGAlignments(fl, param=param) checkTrue(validObject(result)) checkIdentical(c(seq1=1575L, seq2=1584L), seqlengths(result)) } test_readGAlignments_missing_param <- function() { fl <- system.file("unitTests", "cases", "ex1_noindex.bam", package="Rsamtools") result0 <- readGAlignments(fl) checkTrue(validObject(result0)) bf <- open(BamFile(fl, character())) result1 <- readGAlignments(bf) checkIdentical(result1, result0) } test_readGAlignments_length0 <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") which <- IRangesList(seq1=IRanges(100000, width=100)) param <- ScanBamParam(which=which) result <- readGAlignments(fl, param=param) checkTrue(validObject(result)) which <- IRangesList(seq1=IRanges(c(1, 100000), width=100)) param <- ScanBamParam(which=which) result <- readGAlignments(fl, param=param) checkTrue(validObject(result)) } test_readGAlignments_tag <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") ## valid param <- ScanBamParam(tag=("NM")) gal <- readGAlignments(fl, param=param) checkIdentical(924L, sum(mcols(gal)[["NM"]])) ## empty param <- ScanBamParam(tag=("FO")) gal <- readGAlignments(fl, param=param) checkIdentical(rep.int(NA, length(gal)), mcols(gal)[["FO"]]) } test_readGAlignments_BamViews <- function() { checkTrue(validObject(readGAlignments(BamViews()))) src <- system.file("unitTests", "cases", package="Rsamtools") fl <- c(system.file("extdata", "ex1.bam", package="Rsamtools"), file.path(src, "ex1_shuf1000.bam")) bv <- BamViews(fl, auto.range=TRUE) rng <- bamRanges(bv) aln <- readGAlignments(bv) checkEquals(length(bamPaths(bv)), length(aln)) fl <- c(fl, tempfile()) bv <- BamViews(fl, bamRanges=rng) current <- suppressWarnings({ tryCatch({ aln <- readGAlignments(bv) }, error=identity) }) checkTrue(is(current, "bperror")) } GenomicAlignments/inst/unitTests/test_readGAlignmentsList.R0000644000175200017520000001766114516004601025250 0ustar00biocbuildbiocbuildlibrary(pasillaBamSubset) chr4 <- untreated3_chr4() test_readGAlignmentsList_construction <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") bf <- BamFile(fl, asMates=TRUE) galist <- readGAlignmentsList(fl) checkTrue(is.null(names(galist))) galist <- readGAlignmentsList(fl, use.names=TRUE) target <- c("EAS54_61:4:143:69:578", "EAS219_FC30151:7:51:1429:1043") checkIdentical(names(galist)[1:2], target) ## first segment first param <- ScanBamParam(what="flag") galist <- readGAlignmentsList(fl, param=param) mates <- galist[mcols(galist)$mate_status == "mated"] flagBit <- bamFlagAsBitMatrix(mcols(unlist(mates))$flag, bitnames="isFirstMateRead") m <- matrix(flagBit, nrow=2) checkIdentical(c(1572L, 0), rowSums(m)) } test_readGAlignmentsList_noYieldSize <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") bf <- BamFile(fl, asMates=TRUE) galist <- readGAlignmentsList(fl) checkTrue(validObject(galist)) } test_readGAlignmentsList_yieldSize <- function() { bf <- BamFile(chr4, asMates=TRUE, yieldSize=1) scn1 <- scanBam(bf) galist1 <- readGAlignmentsList(bf) checkTrue(length(scn1[[1]]$qname) == 2) checkTrue(length(unique(scn1[[1]]$qname)) == 1) checkTrue(length(unique(scn1[[1]]$qname)) == length(galist1)) bf <- BamFile(chr4, asMates=TRUE, yieldSize=2) scn2 <- scanBam(bf) galist2 <- readGAlignmentsList(bf) checkTrue(length(scn2[[1]]$qname) == 4) checkTrue(length(unique(scn2[[1]]$qname)) == 2) checkTrue(length(unique(scn2[[1]]$qname)) == length(galist2)) } test_readGAlignmentsList_mcols <- function() { bf <- BamFile(chr4, asMates=TRUE, yieldSize=100) param <- ScanBamParam(tag=("NM")) galist <- readGAlignmentsList(bf, param=param) checkIdentical(colnames(mcols(unlist(galist))), "NM") checkTrue(names(mcols(galist)) == "mate_status") param <- ScanBamParam(tag=("FO")) galist <- readGAlignmentsList(bf, param=param) checkIdentical(rep.int(NA, length(unlist(galist))), mcols(unlist(galist))[["FO"]]) } test_readGAlignmentsList_compare_pairs <- function() { bamfile <- BamFile(untreated3_chr4(), asMates=TRUE) galist <- readGAlignmentsList(bamfile) mates <- galist[mcols(galist)$mate_status == "mated"] galp <- readGAlignmentPairs(bamfile) checkIdentical(length(galp), 75409L) tbl <- table(mcols(galist)) checkIdentical(tbl[["mated"]], 75409L) checkIdentical(tbl[["ambiguous"]], 0L) checkIdentical(tbl[["unmated"]], 21227L) } test_readGAlignmentsList_flags <- function() { bamfile <- BamFile(untreated3_chr4(), asMates=TRUE) param <- ScanBamParam(flag=scanBamFlag(isProperPair=TRUE)) galist <- readGAlignmentsList(bamfile, param=param) status <- table(mcols(galist)$mate_status) checkIdentical(status[["mated"]], 45828L) checkIdentical(status[["ambiguous"]], 0L) checkIdentical(status[["unmated"]], 0L) } ## toy_bamfile read summary: ## -------------------------- ## single-end ## s001: 1 primary alignment ## s002: 1 primary alignment + 3 secondary alignments ## s003: unmapped ## paired-end ## p991: 1 pair with a missing mate (can happen if file was subsetted) ## p992: 1 pair with 1st mate unmapped and 2nd mate mapped ## p993: 1 pair with both mates unmapped ## multi-segments ## m001: 3 segments in the template (index of each segment is known) ## m002: 3 segments in the template (index of each segment was lost) ## mapped pairs ('pi' tag only exists for these mapped pairs) ## p001: 1 primary proper pair ## p002: 1 primary non proper pair ## p003: 2 proper pairs: 1 primary + 1 secondary ## p004: 2 non proper pairs: 1 primary + 1 secondary ## p005: 2 primary pairs ## p006: 3 pairs: 1 primary proper + 1 secondary proper + ## 1 secondary non proper ## p007: 2 pairs mapped to the same position: ## 1 primary proper + 1 secondary proper ## p008: 3 pairs mapped to the same position: 1 primary proper + ## 1 secondary proper + 1 secondary non proper ## p009: 3 pairs mapped to the same position: ## 1 primary proper + 2 secondary proper. source(system.file("unitTests", "test_readGAlignmentPairs.R", package="GenomicAlignments")) bf <- BamFile(toy_bamfile, asMates=TRUE) test_readGAlignmentsList_toybamfile <- function() { param <- ScanBamParam(tag="pi") galp <- readGAlignmentPairs(toy_bamfile, use.names=TRUE, param=param) galist <- readGAlignmentsList(bf, use.names=TRUE, param=param) ## 'mated' mated_galist <- unlist(galist[mcols(galist)$mate_status == "mated"]) pi_target <- c("p001", "p002", "p003a", "p003b", "p004a", "p004b", "p005a", "p005b", "p006a", "p006b", "p006c", "p007a", "p007b", "p008a", "p008b", "p008c", "p009a") checkTrue(all(mcols(mated_galist)$pi %in% pi_target)) ## 'ambiguous' GAList match 'dumped' GAPairs ambig_galist <- unlist(galist[mcols(galist)$mate_status == "ambiguous"]) dumped_galp <- getDumpedAlignments() pi_target <- rep(c("p009b", "p009c"), each=2) checkIdentical(pi_target, sort(mcols(dumped_galp)$pi)) checkIdentical(pi_target, sort(mcols(ambig_galist)$pi)) ## 'unmated': unmated_galist <- unlist(galist[mcols(galist)$mate_status == "unmated"]) ## unmated single-end, paired-end or multi-segment (no pi tags) name_target <- c("m001", "m002", "p991", "p992", "s001", "s002") unmated <- names(unmated_galist)[is.na(mcols(unmated_galist)$pi)] checkTrue(all(unmated %in% name_target)) ## non-proper mapped-pairs (have pi tags) pi_target <- c("p002", "p004a", "p004b", "p006c", "p008c") unmated <- na.omit(unique(mcols(unmated_galist)$pi)) checkTrue(all(unmated %in% pi_target)) ## Reads of this type cannot be filtered out wrt readGAlignmentsList. ## They are always returned by readGAlignmentsList but never returned by ## readGAlignmentPairs. bamFlag(param) <- scanBamFlag(isProperPair=TRUE, hasUnmappedMate=FALSE, isUnmappedQuery=FALSE, isPaired=TRUE) galist <- readGAlignmentsList(bf, use.names=TRUE, param=param) unmated_galist <- unlist(galist[mcols(galist)$mate_status == "unmated"]) unmated <- names(unmated_galist)[is.na(mcols(unmated_galist)$pi)] name_target <- c("m001", "m002", "p991") checkTrue(all(unmated %in% name_target)) } test_readGAlignmentsList_which <- function() { ## 4 non-overlapping regions of interest: first two regions only overlap ## with first p001 mate and last two regions only with last p001 mate. my_ROI <- GRanges("chr2", IRanges(c(10, 15, 110, 115), width=1)) my_ROI_labels <- c("chr2:10-10", "chr2:15-15", "chr2:110-110", "chr2:115-115") param <- ScanBamParam(tag="pi", which=my_ROI[c(1, 4)]) target1 <- readGAlignmentsList(toy_bamfile, use.names=TRUE, param=param, with.which_label=TRUE) ## Duplicate results with distinct 'which_label' checkIdentical(2L, length(target1)) checkIdentical(as.vector(mcols(target1)$mate_status), c("mated", "mated")) rng1 <- as.vector(mcols(unlist(target1[1]))$which_label) checkTrue(all(rng1 %in% my_ROI_labels[1])) rng2 <- as.vector(mcols(unlist(target1[2]))$which_label) checkTrue(all(rng2 %in% my_ROI_labels[4])) } text_readGAlignmentsList_findOverlaps <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") bf <- BamFile(fl, asMates=TRUE) galist <- readGAlignmentsList(bf, strandMode=1L) f <- GRanges(seqnames="seq1", IRanges(30, 250), strand="-") ov <- findOverlaps(galist[1], f, ignore.strand=FALSE) checkIdentical(0L, length(ov)) galist <- readGAlignmentsList(bf, strandMode=2L) f <- GRanges(seqnames="seq1", IRanges(30, 250), strand="-") ov <- findOverlaps(galist[1], f, ignore.strand=FALSE) checkIdentical(1L, length(ov)) } GenomicAlignments/inst/unitTests/test_summarizeOverlaps-methods.R0000644000175200017520000003042014516004601026525 0ustar00biocbuildbiocbuild.getCounts <- function(res) { as.integer(assays(res)$counts) } quiet <- suppressMessages gr <- GRanges(c(rep("chr1", 7), rep("chr2", 4)), IRanges(c(1000, 3000, 3600, 4000, 4000, 5000, 5400, 2000, 3000, 7000, 7500), width = c(500, 500, 300, 500, 900, 500, 500, 900, 500, 600, 300)), "+", group = c("A", "B", "C", "C", "D", "D", "E", "F", "G", "H", "H")) rds <- GAlignments(c(rep(c("chr1", "chr2"), 3), "chr1"), as.integer(c(1400, 2700, 3400, 7100, 4000, 3100, 5200)), c("500M", "100M", "300M", "500M", "300M", "50M200N50M", "50M150N50M"), strand(rep("+", 7))) test_summarizeOverlaps_Union_single <- function() { ## single-end no junctions mode <- "Union" ga <- GAlignments("chr1", 20L, "11M", strand("+")) ann <- GRanges("chr1", IRanges(c(1, 10, 25, 22), c(50, 25, 40, 26)), "+") res <- summarizeOverlaps(ann[1], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[2], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[3], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[4], ga, mode) checkIdentical(1L, .getCounts(res)) ## >1 feature res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 0L, 0L, 0L), .getCounts(res)) } test_summarizeOverlaps_Union_paired <- function() { ## single-end with a junction (behaves like paired-end) mode <- "Union" ga <- GAlignments("chr1", 1L, "10M4N11M", strand("+")) ga1 <- GAlignments("chr1", 1L, "10M", strand("+")) ga2 <- GAlignments("chr1", 15L, "11M", strand("-")) galp <- GAlignmentPairs(ga1, ga2) ann <- GRanges("chr1", IRanges(c(1, 5, 12, 20), c(25, 20, 14, 30)), "+") res_ga <- summarizeOverlaps(ann[1], ga, mode) res_galp <- summarizeOverlaps(ann[1], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[2], ga, mode) res_galp <- summarizeOverlaps(ann[2], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[3], ga, mode) res_galp <- summarizeOverlaps(ann[3], galp, mode) checkIdentical(0L, .getCounts(res_ga)) checkIdentical(0L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[4], ga, mode) res_galp <- summarizeOverlaps(ann[4], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) ## >1 feature res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 0L, 0L, 0L), .getCounts(res_ga)) checkIdentical(c(0L, 0L, 0L, 0L), .getCounts(res_galp)) } test_summarizeOverlaps_IntersectionStrict_single <- function() { ## single-end, no junctions mode <- "IntersectionStrict" ga <- GAlignments("chr1", 7L, "6M", strand("+")) ann <- GRanges("chr1", IRanges(c(1, 5, 10), width=10), "+") res <- summarizeOverlaps(ann[1], ga, mode) checkIdentical(0L, .getCounts(res)) res <- summarizeOverlaps(ann[2], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[3], ga, mode) checkIdentical(0L, .getCounts(res)) ## >1 feature ann <- GRanges("chr1", IRanges(c(5, 6, 10), c(15, 16, 15)), "+") res <- summarizeOverlaps(ann[1:2], ga, mode) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ann[c(1,3)], ga, mode) checkIdentical(c(1L, 0L), .getCounts(res)) } test_summarizeOverlaps_IntersectionStrict_paired <- function() { ## single-end with a junction (behaves like paired-end) mode <- "IntersectionStrict" ga <- GAlignments("chr1", 10L, "6M4N6M", strand("+")) ga1 <- GAlignments("chr1", 10L, "6M", strand("+")) ga2 <- GAlignments("chr1", 20L, "6M", strand("-")) galp <- GAlignmentPairs(ga1, ga2) ann <- GRanges("chr1", IRanges(c(1, 1, 20), c(30, 15, 30)), "+") res_ga <- summarizeOverlaps(ann[1], ga, mode) res_galp <- summarizeOverlaps(ann[1], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[2], ga, mode) res_galp <- summarizeOverlaps(ann[2], galp, mode) checkIdentical(0L, .getCounts(res_ga)) checkIdentical(0L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[3], ga, mode) res_galp <- summarizeOverlaps(ann[3], galp, mode) checkIdentical(0L, .getCounts(res_ga)) checkIdentical(0L, .getCounts(res_galp)) ## >1 feature res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, galp, mode) checkIdentical(c(1L, 0L, 0L), .getCounts(res_ga)) checkIdentical(c(1L, 0L, 0L), .getCounts(res_galp)) } test_summarizeOverlaps_IntersectionNotEmpty_single <- function() { ## single-end, no junctions mode <- "IntersectionNotEmpty" ga <- GAlignments("chr1", 10L, "11M", strand("+")) ann <- GRanges("chr1", IRanges(c(1, 5, 12), c(15, 30, 15)), "+") res <- summarizeOverlaps(ann[1], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[2], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[3], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 1L, 0L), .getCounts(res)) ## >1 feature ann <- GRanges("chr1", IRanges(c(5, 15), c(20, 25)), "+") res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(1L, 0L), .getCounts(res)) ann <- GRanges("chr1", IRanges(c(5, 12), c(18, 25)), "+") res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 0L), .getCounts(res)) ann <- GRanges(rep("chr1", 3), IRanges(c(1L, 20L, 20L), width=c(50, 11, 11)), c("+", "+", "-")) ga <- GAlignments("chr1", 23L, "5M", strand("*")) res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 0L, 0L), .getCounts(res)) strand(ga) <- "-" res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 0L, 1L), .getCounts(res)) ga <- GAlignments("chr1", 28L, "5M", strand("+")) res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(1L, 0L, 0L), .getCounts(res)) ## ignore.strand ann <- GRanges("chr1", IRanges(c(5, 1), end=c(10, 6)), strand=c("+", "-")) reads <- GRanges("chr1", IRanges(2, 2), strand="+") checkIdentical(c(0L, 1L), IntersectionNotEmpty(ann, reads, ignore.strand=TRUE)) } test_summarizeOverlaps_IntersectionNotEmpty_paired <- function() { ## single-end with a junction (behaves like paired-end) mode <- "IntersectionNotEmpty" ga <- GAlignments("chr1", 10L, "6M4N6M", strand("+")) ga1 <- GAlignments("chr1", 10L, "6M", strand("+")) ga2 <- GAlignments("chr1", 20L, "6M", strand("-")) galp <- GAlignmentPairs(ga1, ga2) ann <- GRanges("chr1", IRanges(c(1, 1, 20), c(30, 15, 30)), "+") ## single-end, junctions res_ga <- summarizeOverlaps(ann[1], ga, mode) res_galp <- summarizeOverlaps(ann[1], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[2], ga, mode) res_galp <- summarizeOverlaps(ann[2], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[3], ga, mode) res_galp <- summarizeOverlaps(ann[3], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) ## > 1 feature res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, galp, mode) checkIdentical(c(0L, 0L, 0L), .getCounts(res_ga)) checkIdentical(c(0L, 0L, 0L), .getCounts(res_galp)) ann <- GRanges("chr1", IRanges(c(1, 2), c(23, 23)), "+") res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, galp, mode) checkIdentical(c(0L, 0L), .getCounts(res_ga)) checkIdentical(c(0L, 0L), .getCounts(res_galp)) ann <- GRanges("chr1", IRanges(c(1, 21), c(23, 30)), "+") res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, galp, mode) checkIdentical(c(0L, 0L), .getCounts(res_ga)) checkIdentical(c(0L, 0L), .getCounts(res_galp)) ann <- GRanges("chr1", IRanges(c(1, 1), c(23, 21)), "+") res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, galp, mode) checkIdentical(c(1L, 0L), .getCounts(res_ga)) checkIdentical(c(1L, 0L), .getCounts(res_galp)) } test_summarizeOverlaps_inter.feature_GRanges <- function() { ## rows 5,6,7 from figure in vignette ft <- gr[10:11] rd <- GAlignments(rep("chr2", 3), as.integer(c(7100, 7100, 7500)), c("300M", "500M", "50M"), strand(rep("+", 3))) mode <- "Union" res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=TRUE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=FALSE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=TRUE) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=FALSE) checkIdentical(c(1L, 1L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=TRUE) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=FALSE) checkIdentical(c(1L, 1L), .getCounts(res)) mode <- "IntersectionStrict" res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=TRUE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=FALSE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=TRUE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=FALSE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=TRUE) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=FALSE) checkIdentical(c(1L, 1L), .getCounts(res)) mode <- "IntersectionNotEmpty" res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=TRUE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=FALSE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=TRUE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=FALSE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=TRUE) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=FALSE) checkIdentical(c(0L, 0L), .getCounts(res)) ## read spans both features rd <- GAlignments("chr2", 7000L, "750M", strand("+")) res <- summarizeOverlaps(ft, rd, mode, inter.feature=TRUE) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd, mode, inter.feature=FALSE) checkIdentical(c(1L, 1L), .getCounts(res)) } test_summarizeOverlaps_inter.feature_GRangesList <- function() { grl <- split(gr, mcols(gr)[["group"]]) mode <- "Union" res <- quiet(summarizeOverlaps(grl, rds, mode)) checkIdentical(c(1L, rep(0L, 4), rep(1L, 3)), .getCounts(res)) res <- quiet(summarizeOverlaps(grl, rds, mode, inter.feature=FALSE)) checkIdentical(c(1L, 1L, 2L, 2L, rep(1L, 4)), .getCounts(res)) co <- countOverlaps(grl, rds, type="any") checkIdentical(unname(co), .getCounts(res)) mode <- "IntersectionStrict" res <- quiet(summarizeOverlaps(grl, rds, mode)) checkIdentical(c(0L, 0L, 0L, 1L, 0L, rep(1L, 3)), .getCounts(res)) res <- quiet(summarizeOverlaps(grl, rds, mode, inter.feature=FALSE)) checkIdentical(c(0L, 0L, 1L, 2L, 0L, rep(1L, 3)), .getCounts(res)) co <- countSubjectHits(findOverlaps(rds, grl, type="within")) checkIdentical(unname(co), .getCounts(res)) mode <- "IntersectionNotEmpty" rd <- rds[c(5,7)] ft <- grl[3:5] res <- quiet(summarizeOverlaps(ft, rd, mode)) checkIdentical(c(0L, 1L, 0L), .getCounts(res)) res <- quiet(summarizeOverlaps(ft, rd, mode, inter.feature=FALSE)) checkIdentical(c(0L, 1L, 0L), .getCounts(res)) } GenomicAlignments/man/0000755000175200017520000000000014547043765015771 5ustar00biocbuildbiocbuildGenomicAlignments/man/GAlignmentPairs-class.Rd0000644000175200017520000004040014547043765022405 0ustar00biocbuildbiocbuild\name{GAlignmentPairs-class} \docType{class} % Class: \alias{class:GAlignmentPairs} \alias{GAlignmentPairs-class} \alias{parallel_slot_names,GAlignmentPairs-method} \alias{updateObject,GAlignmentPairs-method} % Constructors: \alias{GAlignmentPairs} % Accessors: \alias{strandMode} \alias{strandMode,GAlignmentPairs-method} \alias{strandMode<-} \alias{strandMode<-,GAlignmentPairs-method} \alias{invertStrand,GAlignmentPairs-method} \alias{names,GAlignmentPairs-method} \alias{names<-,GAlignmentPairs-method} \alias{first} \alias{first,GAlignmentPairs-method} \alias{second} \alias{second,GAlignmentPairs-method} \alias{last} \alias{last,GAlignmentPairs-method} \alias{seqnames,GAlignmentPairs-method} \alias{strand,GAlignmentPairs-method} \alias{njunc,GAlignmentPairs-method} \alias{isProperPair} \alias{isProperPair,GAlignmentPairs-method} \alias{seqinfo,GAlignmentPairs-method} \alias{seqlevelsInUse,GAlignmentPairs-method} \alias{seqinfo<-,GAlignmentPairs-method} % List methods: \alias{[[,GAlignmentPairs,ANY,ANY-method} \alias{unlist,GAlignmentPairs-method} % Coercion: \alias{ranges,GAlignmentPairs-method} \alias{granges,GAlignmentPairs-method} \alias{grglist,GAlignmentPairs-method} \alias{coerce,GAlignmentPairs,IntegerRanges-method} \alias{coerce,GAlignmentPairs,GRanges-method} \alias{coerce,GAlignmentPairs,GRangesList-method} \alias{coerce,GAlignmentPairs,GAlignments-method} \alias{coerce,GAlignmentPairs,DataFrame-method} \alias{as.data.frame,GAlignmentPairs-method} % "show" method: \alias{show,GAlignmentPairs-method} % Concatenation: \alias{bindROWS,GAlignmentPairs-method} \title{GAlignmentPairs objects} \description{ The GAlignmentPairs class is a container for storing \emph{pairs of genomic alignments}. These pairs are typically obtained by aligning paired-end reads to a reference genome or transcriptome. } \details{ A GAlignmentPairs object is a list-like object where each list element represents a pair of genomic alignment. An \emph{alignment pair} is made of a "first" and a "last"/"second" alignment, and is formally represented by a \link{GAlignments} object of length 2. In most applications, an \emph{alignment pair} will represent an aligned paired-end read. In that case, the "first" member of the pair represents the alignment of the first end of the read (aka "first segment in the template", using SAM Spec terminology), and the "last" member of the pair represents the alignment of the second end of the read (aka "last segment in the template", using SAM Spec terminology). In general, a GAlignmentPairs object will be created by loading records from a BAM (or SAM) file containing aligned paired-end reads, using the \code{readGAlignmentPairs} function (see below). Each element in the returned object will be obtained by pairing 2 records. } \section{Constructor}{ \describe{ \item{\code{GAlignmentPairs(first, last, strandMode=1, isProperPair=TRUE, names=NULL)}:}{ Low-level GAlignmentPairs constructor. Generally not used directly. } } } \section{Accessors}{ In the code snippets below, \code{x} is a GAlignmentPairs object. \describe{ \item{\code{strandMode(x)}, \code{strandMode(x) <- value}:}{ The \emph{strand mode} is a per-object switch on GAlignmentPairs objects that controls the behavior of the \code{strand} getter. More precisely, it indicates how the strand of a pair should be inferred from the strand of the first and last alignments in the pair: \itemize{ \item 0: strand of the pair is always *. \item 1: strand of the pair is strand of its first alignment. This mode should be used when the paired-end data was generated using one of the following stranded protocols: Directional Illumina (Ligation), Standard SOLiD. \item 2: strand of the pair is strand of its last alignment. This mode should be used when the paired-end data was generated using one of the following stranded protocols: dUTP, NSR, NNSR, Illumina stranded TruSeq PE protocol. } These modes are equivalent to \code{strandSpecific} equal 0, 1, and 2, respectively, for the \code{featureCounts} function defined in the \pkg{Rsubread} package. Note that, by default, the \code{\link{readGAlignmentPairs}} function sets the \emph{strand mode} to 1 on the returned GAlignmentPairs object. The function has a \code{strandMode} argument to let the user set a different \emph{strand mode}. The \emph{strand mode} can also be changed any time with the \code{strandMode} setter or with \code{invertStrand}. Also note that 3rd party programs TopHat2 and Cufflinks have a \code{--library-type} option to let the user specify which protocol was used. Please refer to the documentation of these programs for more information. } \item{\code{length(x)}:}{ Return the number of alignment pairs in \code{x}. } \item{\code{names(x)}, \code{names(x) <- value}:}{ Get or set the names on \code{x}. See \code{\link{readGAlignmentPairs}} for how to automatically extract and set the names when reading the alignments from a file. } \item{\code{first(x, real.strand=FALSE)}, \code{last(x, real.strand=FALSE)}, \code{second(x, real.strand=FALSE)}:}{ Get the "first" or "last"/"second" alignment for each alignment pair in \code{x}. The result is a \link{GAlignments} object of the same length as \code{x}. If \code{real.strand=TRUE}, then the strand is inverted on-the-fly according to the \emph{strand mode} currently set on the object (see \code{strandMode(x)} above). More precisely, if \code{strandMode(x)} is 0, then the strand is set to * for the \link{GAlignments} object returned by both, \code{first()} and \code{last()}. If \code{strandMode(x)} is 1, then the strand of the object returned by \code{last()} is inverted. If \code{strandMode(x)} is 2, then the strand of the object returned by \code{first()} is inverted. } \item{\code{seqnames(x)}:}{ Get the sequence names of the pairs in \code{x} i.e. the name of the reference sequence for each alignment pair in \code{x}. The sequence name of a pair is the sequence name of the 2 alignments in the pair if they are the same (\emph{concordant seqnames}), or NA if they differ (\emph{discordant seqnames}). The sequence names are returned in a factor-\link[S4Vectors]{Rle} object that is \emph{parallel} to \code{x}, i.e. the i-th element in the returned object is the sequence name of the i-th pair in \code{x}. } \item{\code{strand(x)}:}{ Get the strand for each alignment pair in \code{x}. Obey \code{strandMode(x)} above to infer the strand of a pair. Return \code{*} for pairs with \emph{discordant strand}, or for all pairs if \code{strandMode(x)} is 0. } \item{\code{njunc(x)}:}{ Equivalent to \code{njunc(first(x)) + njunc(last(x))}. } \item{\code{isProperPair(x)}:}{ Get the "isProperPair" flag bit (bit 0x2 in SAM Spec) set by the aligner for each alignment pair in \code{x}. } \item{\code{seqinfo(x)}, \code{seqinfo(x) <- value}:}{ Get or set the information about the underlying sequences. \code{value} must be a \link[GenomeInfoDb]{Seqinfo} object. } \item{\code{seqlevels(x)}, \code{seqlevels(x) <- value}:}{ Get or set the sequence levels. \code{seqlevels(x)} is equivalent to \code{seqlevels(seqinfo(x))} or to \code{levels(seqnames(x))}, those 2 expressions being guaranteed to return identical character vectors on a GAlignmentPairs object. \code{value} must be a character vector with no NAs. See \code{?\link{seqlevels}} for more information. } \item{\code{seqlengths(x)}, \code{seqlengths(x) <- value}:}{ Get or set the sequence lengths. \code{seqlengths(x)} is equivalent to \code{seqlengths(seqinfo(x))}. \code{value} can be a named non-negative integer or numeric vector eventually with NAs. } \item{\code{isCircular(x)}, \code{isCircular(x) <- value}:}{ Get or set the circularity flags. \code{isCircular(x)} is equivalent to \code{isCircular(seqinfo(x))}. \code{value} must be a named logical vector eventually with NAs. } \item{\code{genome(x)}, \code{genome(x) <- value}:}{ Get or set the genome identifier or assembly name for each sequence. \code{genome(x)} is equivalent to \code{genome(seqinfo(x))}. \code{value} must be a named character vector eventually with NAs. } \item{\code{seqnameStyle(x)}:}{ Get or set the seqname style for \code{x}. Note that this information is not stored in \code{x} but inferred by looking up \code{seqnames(x)} against a seqname style database stored in the seqnames.db metadata package (required). \code{seqnameStyle(x)} is equivalent to \code{seqnameStyle(seqinfo(x))} and can return more than 1 seqname style (with a warning) in case the style cannot be determined unambiguously. } } } \section{Vector methods}{ In the code snippets below, \code{x} is a GAlignmentPairs object. \describe{ \item{\code{x[i]}:}{ Return a new GAlignmentPairs object made of the selected alignment pairs. } } } \section{List methods}{ In the code snippets below, \code{x} is a GAlignmentPairs object. \describe{ \item{\code{x[[i]]}:}{ Extract the i-th alignment pair as a \link{GAlignments} object of length 2. As expected \code{x[[i]][1]} and \code{x[[i]][2]} are respectively the "first" and "last" alignments in the pair. } \item{\code{unlist(x, use.names=TRUE)}:}{ Return the \link{GAlignments} object conceptually defined by \code{c(x[[1]], x[[2]], ..., x[[length(x)]])}. \code{use.names} determines whether \code{x} names should be propagated to the result or not. } } } \section{Coercion}{ In the code snippets below, \code{x} is a GAlignmentPairs object. \describe{ \item{\code{granges(x, use.names=TRUE, use.mcols=FALSE, on.discordant.seqnames=c("error", "drop", "split"))}, \code{ranges(x, use.names=TRUE, use.mcols=FALSE, on.discordant.seqnames=c("error", "drop", "split"))}:}{ Return a \link{GRanges} object (for \code{granges()}) or \link[IRanges]{IRanges}) object (for \code{ranges()}). If \code{x} contains no pairs with \emph{discordant seqnames}, the operation is guaranteed to be successful and to return an object \emph{parallel} to \code{x}, that is, an object where the i-th element is the range of the genomic region spanned by the i-th alignment in \code{x} (all gaps in the region are ignored). If \code{x} contains pairs with discordant seqnames, then an error is raised, unless the \code{on.discordant.seqnames} argument is set to \code{"drop"} or \code{"split"}, in which case the pairs with discordant seqnames are either dropped or represented with 2 genomic ranges (or 2 ranges for \code{ranges()}) in the returned object. In that case, the returned object is NOT \emph{parallel} to \code{x}. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. } \item{\code{grglist(x, use.mcols=FALSE, drop.D.ranges=FALSE)}:}{ Return a \link{GRangesList} object of length \code{length(x)} where the i-th element represents the ranges (with respect to the reference) of the i-th alignment pair in \code{x}. The strand of the returned ranges obeys the \emph{strand mode} currently set on the object (see \code{strandMode(x)} above). More precisely, if \code{grl1} and \code{grl2} are \code{grglist(first(x, real.strand=TRUE), order.as.in.query=TRUE)} and \code{grglist(last(x, real.strand=TRUE), order.as.in.query=TRUE)}, respectively, then the i-th element in the returned \link{GRangesList} object is \code{c(grl1[[i]], grl2[[i]])} if \code{strandMode(x)} is 0 or 1, or \code{c(grl2[[i]], grl1[[i]])} if \code{strandMode(x)} is 2. Note that, if \code{strandMode(x)} is 1 or 2, this results in the ranges being in consistent order with the original "query template", that is, being in the order defined by walking the "query template" from the beginning to the end. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. If \code{drop.D.ranges} is TRUE, then deletions (Ds in the CIGAR) are treated like junctions (Ns in the CIGAR), that is, the ranges corresponding to deletions are dropped. } \item{\code{as(x, "GRanges")}, \code{as(x, "IntegerRanges")}, \code{as(x, "GRangesList")}:}{ Alternate ways of doing \code{granges(x, use.names=TRUE, use.mcols=TRUE)}, \code{ranges(x, use.names=TRUE, use.mcols=TRUE)}, and \code{grglist(x, use.names=TRUE, use.mcols=TRUE)}, respectively. } \item{\code{as(x, "GAlignments")}:}{ Equivalent of \code{unlist(x, use.names=TRUE)}. } } } \section{Other methods}{ In the code snippets below, \code{x} is a GAlignmentPairs object. \describe{ \item{\code{show(x)}:}{ By default the \code{show} method displays 5 head and 5 tail elements. This can be changed by setting the global options \code{showHeadLines} and \code{showTailLines}. If the object length is less than (or equal to) the sum of these 2 options plus 1, then the full object is displayed. Note that these options also affect the display of \link{GRanges} and \link{GAlignments} objects, as well as other \link[S4Vectors]{Vector} derivatives defined in the \pkg{IRanges} and \pkg{Biostrings} packages (e.g. \link[IRanges]{IRanges} and \link[Biostrings]{XStringSet} objects). } } } \author{Hervé Pagès} \seealso{ \itemize{ \item \code{\link{readGAlignmentPairs}} for reading aligned paired-end reads from a file (typically a BAM file) into a GAlignmentPairs object. \item \link{GAlignments} objects for handling aligned single-end reads. \item \code{\link{makeGAlignmentPairs}} for pairing the elements of a \link{GAlignments} object into a GAlignmentPairs object. \item \link{junctions-methods} for extracting and summarizing junctions from a GAlignmentPairs object. \item \link[GenomicAlignments]{coverage-methods} for computing the coverage of a GAlignmentPairs object. \item \link[GenomicAlignments]{findOverlaps-methods} for finding range overlaps between a GAlignmentPairs object and another range-based object. \item \code{\link[GenomeInfoDb]{seqinfo}} in the \pkg{GenomeInfoDb} package for getting/setting/modifying the sequence information stored in an object. \item The \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} classes defined and documented in the \pkg{GenomicRanges} package. } } \examples{ library(Rsamtools) # for the ex1.bam file ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") galp <- readGAlignmentPairs(ex1_file, use.names=TRUE, strandMode=1) galp length(galp) head(galp) head(names(galp)) first(galp) last(galp) # or second(galp) strandMode(galp) first(galp, real.strand=TRUE) last(galp, real.strand=TRUE) strand(galp) strandMode(galp) <- 2 first(galp, real.strand=TRUE) last(galp, real.strand=TRUE) strand(galp) seqnames(galp) head(njunc(galp)) table(isProperPair(galp)) seqlevels(galp) ## Rename the reference sequences: seqlevels(galp) <- sub("seq", "chr", seqlevels(galp)) seqlevels(galp) galp[[1]] unlist(galp) grglist(galp) # a GRangesList object strandMode(galp) <- 1 grglist(galp) ## Alternatively the strand mode can be changed with invertStrand(): invertStrand(galp) stopifnot(identical(unname(elementNROWS(grglist(galp))), njunc(galp) + 2L)) granges(galp) # a GRanges object } \keyword{methods} \keyword{classes} GenomicAlignments/man/GAlignments-class.Rd0000644000175200017520000004545714547043765021612 0ustar00biocbuildbiocbuild\name{GAlignments-class} \docType{class} % Class: \alias{class:GAlignments} \alias{GAlignments-class} \alias{parallel_slot_names,GAlignments-method} \alias{updateObject,GAlignments-method} % Accessors: \alias{names,GAlignments-method} \alias{seqnames,GAlignments-method} \alias{rname} \alias{rname,GAlignments-method} \alias{strand,GAlignments-method} \alias{names<-,GAlignments-method} \alias{seqnames<-,GAlignments-method} \alias{rname<-} \alias{rname<-,GAlignments-method} \alias{strand<-,GAlignments,ANY-method} \alias{cigar} \alias{cigar,GAlignments-method} \alias{qwidth} \alias{qwidth,GAlignments-method} \alias{start,GAlignments-method} \alias{width,GAlignments-method} \alias{njunc} \alias{njunc,GAlignments-method} \alias{seqinfo,GAlignments-method} \alias{seqinfo<-,GAlignments-method} % Constructor: \alias{GAlignments} \alias{update,GAlignments-method} % Coercion: \alias{ranges,GAlignments-method} \alias{granges,GAlignments-method} \alias{grglist,GAlignments-method} \alias{rglist,GAlignments-method} \alias{coerce,GAlignments,IntegerRanges-method} \alias{coerce,GAlignments,GRanges-method} \alias{coerce,GAlignments,GRangesList-method} \alias{coerce,GAlignments,IntegerRangesList-method} \alias{coerce,GAlignments,DataFrame-method} \alias{as.data.frame,GAlignments-method} \alias{coerce,GenomicRanges,GAlignments-method} % subsetting \alias{getListElement,GAlignments-method} % "show" method: \alias{show,GAlignments-method} % Concatenation: \alias{bindROWS,GAlignments-method} % Comparison/ordering: \alias{pcompare,GAlignments,GAlignments-method} \alias{is.unsorted,GAlignments-method} \alias{order,GAlignments-method} \alias{sort,GAlignments-method} \alias{rank,GAlignments-method} \title{GAlignments objects} \description{ The GAlignments class is a simple container which purpose is to store a set of genomic alignments that will hold just enough information for supporting the operations described below. } \details{ A GAlignments object is a vector-like object where each element describes a genomic alignment i.e. how a given sequence (called "query" or "read", typically short) aligns to a reference sequence (typically long). Typically, a GAlignments object will be created by loading records from a BAM (or SAM) file and each element in the resulting object will correspond to a record. BAM/SAM records generally contain a lot of information but only part of that information is loaded in the GAlignments object. In particular, we discard the query sequences (SEQ field), the query qualities (QUAL), the mapping qualities (MAPQ) and any other information that is not needed in order to support the operations or methods described below. This means that multi-reads (i.e. reads with multiple hits in the reference) won't receive any special treatment i.e. the various SAM/BAM records corresponding to a multi-read will show up in the GAlignments object as if they were coming from different/unrelated queries. Also paired-end reads will be treated as single-end reads and the pairing information will be lost (see \code{?\link{GAlignmentPairs}} for how to handle aligned paired-end reads). Each element of a GAlignments object consists of: \itemize{ \item The name of the reference sequence. (This is the RNAME field in a SAM/BAM record.) \item The strand in the reference sequence to which the query is aligned. (This information is stored in the FLAG field in a SAM/BAM record.) \item The CIGAR string in the "Extended CIGAR format" (see the SAM Format Specifications for the details). \item The 1-based leftmost position/coordinate of the clipped query relative to the reference sequence. We will refer to it as the "start" of the query. (This is the POS field in a SAM/BAM record.) \item The 1-based rightmost position/coordinate of the clipped query relative to the reference sequence. We will refer to it as the "end" of the query. (This is NOT explicitly stored in a SAM/BAM record but can be inferred from the POS and CIGAR fields.) Note that all positions/coordinates are always relative to the first base at the 5' end of the plus strand of the reference sequence, even when the query is aligned to the minus strand. \item The genomic intervals between the "start" and "end" of the query that are "covered" by the alignment. Saying that the full [start,end] interval is covered is the same as saying that the alignment contains no junction (no N in the CIGAR). It is then considered to be a simple alignment. Note that a simple alignment can have mismatches or deletions (in the reference). In other words, a deletion (encoded with a D in the CIGAR) is NOT considered to introduce a gap in the coverage, but a junction is. } Note that the last 2 items are not expicitly stored in the GAlignments object: they are inferred on-the-fly from the CIGAR and the "start". Optionally, a GAlignments object can have names (accessed thru the \code{\link[base]{names}} generic function) which will be coming from the QNAME field of the SAM/BAM records. The rest of this man page will focus on describing how to: \itemize{ \item Access the information stored in a GAlignments object in a way that is independent from how the data are actually stored internally. \item How to create and manipulate a GAlignments object. } } \section{Constructor}{ \describe{ \item{\code{GAlignments(seqnames=Rle(factor()), pos=integer(0), cigar=character(0), strand=NULL, names=NULL, seqlengths=NULL, ...)}:}{ Low-level GAlignments constructor. Generally not used directly. Named arguments in \code{...} are used as metadata columns. } } } \section{Accessors}{ In the code snippets below, \code{x} is a GAlignments object. \describe{ \item{\code{length(x)}:}{ Return the number of alignments in \code{x}. } \item{\code{names(x)}, \code{names(x) <- value}:}{ Get or set the names on \code{x}. See \code{\link{readGAlignments}} for how to automatically extract and set the names when reading the alignments from a file. } \item{\code{seqnames(x)}, \code{seqnames(x) <- value}:}{ Get or set the name of the reference sequence for each alignment in \code{x} (see Details section above for more information about the RNAME field of a SAM/BAM file). \code{value} can be a factor, or a 'factor' \link[S4Vectors]{Rle}, or a character vector. } \item{\code{rname(x)}, \code{rname(x) <- value}:}{ Same as \code{seqnames(x)} and \code{seqnames(x) <- value}. } \item{\code{strand(x)}, \code{strand(x) <- value}:}{ Get or set the strand for each alignment in \code{x} (see Details section above for more information about the strand of an alignment). \code{value} can be a factor (with levels +, - and *), or a 'factor' \link[S4Vectors]{Rle}, or a character vector. } \item{\code{cigar(x)}:}{ Returns a character vector of length \code{length(x)} containing the CIGAR string for each alignment. } \item{\code{qwidth(x)}:}{ Returns an integer vector of length \code{length(x)} containing the length of the query *after* hard clipping (i.e. the length of the query sequence that is stored in the corresponding SAM/BAM record). } \item{\code{start(x)}, \code{end(x)}:}{ Returns an integer vector of length \code{length(x)} containing the "start" and "end" (respectively) of the query for each alignment. See Details section above for the exact definitions of the "start" and "end" of a query. Note that \code{start(x)} and \code{end(x)} are equivalent to \code{start(granges(x))} and \code{end(granges(x))}, respectively (or, alternatively, to \code{min(rglist(x))} and \code{max(rglist(x))}, respectively). } \item{\code{width(x)}:}{ Equivalent to \code{width(granges(x))} (or, alternatively, to \code{end(x) - start(x) + 1L}). Note that this is generally different from \code{qwidth(x)} except for alignments with a trivial CIGAR string (i.e. a string of the form \code{"M"} where is a number). } \item{\code{njunc(x)}:}{ Returns an integer vector of the same length as \code{x} containing the number of junctions (i.e. N operations in the CIGAR) in each alignment. Equivalent to \code{unname(elementNROWS(rglist(x))) - 1L}. } \item{\code{seqinfo(x)}, \code{seqinfo(x) <- value}:}{ Get or set the information about the underlying sequences. \code{value} must be a \link[GenomeInfoDb]{Seqinfo} object. } \item{\code{seqlevels(x)}, \code{seqlevels(x) <- value}:}{ Get or set the sequence levels. \code{seqlevels(x)} is equivalent to \code{seqlevels(seqinfo(x))} or to \code{levels(seqnames(x))}, those 2 expressions being guaranteed to return identical character vectors on a GAlignments object. \code{value} must be a character vector with no NAs. See \code{?\link{seqlevels}} for more information. } \item{\code{seqlengths(x)}, \code{seqlengths(x) <- value}:}{ Get or set the sequence lengths. \code{seqlengths(x)} is equivalent to \code{seqlengths(seqinfo(x))}. \code{value} can be a named non-negative integer or numeric vector eventually with NAs. } \item{\code{isCircular(x)}, \code{isCircular(x) <- value}:}{ Get or set the circularity flags. \code{isCircular(x)} is equivalent to \code{isCircular(seqinfo(x))}. \code{value} must be a named logical vector eventually with NAs. } \item{\code{genome(x)}, \code{genome(x) <- value}:}{ Get or set the genome identifier or assembly name for each sequence. \code{genome(x)} is equivalent to \code{genome(seqinfo(x))}. \code{value} must be a named character vector eventually with NAs. } \item{\code{seqnameStyle(x)}:}{ Get or set the seqname style for \code{x}. Note that this information is not stored in \code{x} but inferred by looking up \code{seqnames(x)} against a seqname style database stored in the \pkg{seqnames.db} metadata package (required). \code{seqnameStyle(x)} is equivalent to \code{seqnameStyle(seqinfo(x))} and can return more than 1 seqname style (with a warning) in case the style cannot be determined unambiguously. } } } \section{Coercion}{ In the code snippets below, \code{x} is a GAlignments object. \describe{ \item{\code{granges(x, use.names=TRUE, use.mcols=FALSE)}, \code{ranges(x, use.names=TRUE, use.mcols=FALSE)}:}{ Return a \link{GRanges} object (for \code{granges()}) or \link[IRanges]{IRanges}) object (for \code{ranges()}) \emph{parallel} to \code{x} where the i-th element is the range of the genomic region spanned by the i-th alignment in \code{x}. All gaps in the region are ignored. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. } \item{\code{grglist(x, use.names=TRUE, use.mcols=FALSE, order.as.in.query=FALSE, drop.D.ranges=FALSE)}, \code{rglist(x, use.names=TRUE, use.mcols=FALSE, order.as.in.query=FALSE, drop.D.ranges=FALSE)}:}{ Return either a \link{GRangesList} or a \link[IRanges]{IntegerRangesList} object of length \code{length(x)} where the i-th element represents the ranges (with respect to the reference) of the i-th alignment in \code{x}. More precisely, the \link[IRanges]{IntegerRangesList} object returned by \code{rglist(x)} is a \link[IRanges]{CompressedIRangesList} object. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. The \code{order.as.in.query} toggle affects the order of the ranges \emph{within} each top-level element of the returned object. If FALSE (the default), then the ranges are ordered from 5' to 3' in elements associated with the plus strand (i.e. corresponding to alignments located on the plus strand), and from 3' to 5' in elements associated with the minus strand. So, whatever the strand is, the ranges are in ascending order (i.e. left-to-right). If TRUE, then the order of the ranges in elements associated with the \emph{minus} strand is reversed. So they end up being ordered from 5' to 3' too, which means that they are now in decending order (i.e. right-to-left). It also means that, when \code{order.as.in.query=TRUE} is used, the ranges are \emph{always} ordered consistently with the original "query template", that is, in the order defined by walking the "query template" from the beginning to the end. If \code{drop.D.ranges} is TRUE, then deletions (D operations in the CIGAR) are treated like junctions (N operations in the CIGAR), that is, the ranges corresponding to deletions are dropped. See Details section above for more information. } \item{\code{as(x, "GRanges")}, \code{as(x, "IntegerRanges")}, \code{as(x, "GRangesList")}, \code{as(x, "IntegerRangesList")}:}{ Alternate ways of doing \code{granges(x, use.names=TRUE, use.mcols=TRUE)}, \code{ranges(x, use.names=TRUE, use.mcols=TRUE)}, \code{grglist(x, use.names=TRUE, use.mcols=TRUE)}, and \code{rglist(x, use.names=TRUE, use.mcols=TRUE)}, respectively. } } In the code snippet below, \code{x} is a \link[GenomicRanges]{GRanges} object. \describe{ \item{\code{as(from, "GAlignments")}:}{ Creates a GAlignments object from a \link[GenomicRanges]{GRanges} object. The metadata columns are propagated. cigar values are created from the sequence width unless a "cigar" metadata column already exists in \code{from}. } } } \section{Subsetting and related operations}{ In the code snippets below, \code{x} is a GAlignments object. \describe{ \item{\code{x[i]}:}{ Return a new GAlignments object made of the selected alignments. \code{i} can be a numeric or logical vector. } } } \section{Concatenation}{ \describe{ \item{\code{c(x, ..., ignore.mcols=FALSE)}:}{ Concatenate GAlignments object \code{x} and the GAlignments objects in \code{...} together. See \code{?\link[S4Vectors]{c}} in the \pkg{S4Vectors} package for more information about concatenating Vector derivatives. } } } \section{Other methods}{ \describe{ \item{\code{show(x)}:}{ By default the \code{show} method displays 5 head and 5 tail elements. This can be changed by setting the global options \code{showHeadLines} and \code{showTailLines}. If the object length is less than (or equal to) the sum of these 2 options plus 1, then the full object is displayed. Note that these options also affect the display of \link{GRanges} and \link{GAlignmentPairs} objects, as well as other objects defined in the \pkg{IRanges} and \pkg{Biostrings} packages (e.g. \link[IRanges]{IntegerRanges} and \link[Biostrings]{DNAStringSet} objects). } } } \references{ \url{http://samtools.sourceforge.net/} } \author{Hervé Pagès and P. Aboyoun} \seealso{ \itemize{ \item \code{\link{readGAlignments}} for reading genomic alignments from a file (typically a BAM file) into a GAlignments object. \item \link{GAlignmentPairs} objects for handling aligned paired-end reads. \item \link{junctions-methods} for extracting and summarizing junctions from a GAlignments object. \item \link[GenomicAlignments]{coverage-methods} for computing the coverage of a GAlignments object. \item \link[GenomicAlignments]{findOverlaps-methods} for finding overlapping genomic alignments. \item \code{\link[GenomeInfoDb]{seqinfo}} in the \pkg{GenomeInfoDb} package for getting/setting/modifying the sequence information stored in an object. \item The \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} classes defined and documented in the \pkg{GenomicRanges} package. \item The \link[IRanges]{CompressedIRangesList} class defined and documented in the \pkg{IRanges} package. } } \examples{ library(Rsamtools) # for the ex1.bam file ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") gal <- readGAlignments(ex1_file, param=ScanBamParam(what="flag")) gal ## --------------------------------------------------------------------- ## A. BASIC MANIPULATION ## --------------------------------------------------------------------- length(gal) head(gal) names(gal) # no names by default seqnames(gal) strand(gal) head(cigar(gal)) head(qwidth(gal)) table(qwidth(gal)) head(start(gal)) head(end(gal)) head(width(gal)) head(njunc(gal)) seqlevels(gal) ## Invert the strand: invertStrand(gal) ## Rename the reference sequences: seqlevels(gal) <- sub("seq", "chr", seqlevels(gal)) seqlevels(gal) grglist(gal) # a GRangesList object stopifnot(identical(unname(elementNROWS(grglist(gal))), njunc(gal) + 1L)) granges(gal) # a GRanges object rglist(gal) # a CompressedIRangesList object stopifnot(identical(unname(elementNROWS(rglist(gal))), njunc(gal) + 1L)) ranges(gal) # an IRanges object ## Modify the number of lines in 'show' options(showHeadLines=3) options(showTailLines=2) gal ## Revert to default options(showHeadLines=NULL) options(showTailLines=NULL) ## --------------------------------------------------------------------- ## B. SUBSETTING ## --------------------------------------------------------------------- gal[strand(gal) == "-"] gal[grep("I", cigar(gal), fixed=TRUE)] gal[grep("N", cigar(gal), fixed=TRUE)] # no junctions ## A confirmation that none of the alignments contains junctions (in ## other words, each alignment can be represented by a single genomic ## range on the reference): stopifnot(all(njunc(gal) == 0)) ## Different ways to subset: gal[6] # a GAlignments object of length 1 grglist(gal)[[6]] # a GRanges object of length 1 rglist(gal)[[6]] # a NormalIRanges object of length 1 ## Unlike N operations, D operations don't introduce gaps: ii <- grep("D", cigar(gal), fixed=TRUE) gal[ii] njunc(gal[ii]) grglist(gal[ii]) ## qwidth() vs width(): gal[qwidth(gal) != width(gal)] ## This MUST return an empty object: gal[cigar(gal) == "35M" & qwidth(gal) != 35] ## but this doesn't have too: gal[cigar(gal) != "35M" & qwidth(gal) == 35] } \keyword{methods} \keyword{classes} GenomicAlignments/man/GAlignmentsList-class.Rd0000644000175200017520000003312214547043765022430 0ustar00biocbuildbiocbuild\name{GAlignmentsList-class} \docType{class} % Class \alias{class:GAlignmentsList} \alias{GAlignmentsList-class} \alias{GAlignmentsList} % Constructors: \alias{GAlignmentsList} % Accessors: \alias{names,GAlignmentsList-method} \alias{names<-,GAlignmentsList-method} \alias{seqnames,GAlignmentsList-method} \alias{seqnames<-,GAlignmentsList-method} \alias{rname,GAlignmentsList-method} \alias{rname<-,GAlignmentsList-method} \alias{strand,GAlignmentsList-method} \alias{strand<-,GAlignmentsList-method} \alias{strand<-,GAlignmentsList,character-method} \alias{cigar,GAlignmentsList-method} \alias{qwidth,GAlignmentsList-method} \alias{njunc,GAlignmentsList-method} \alias{elementMetadata,GAlignmentsList-method} \alias{elementMetadata<-,GAlignmentsList-method} \alias{seqinfo,GAlignmentsList-method} \alias{seqinfo<-,GAlignmentsList-method} % Coercion: \alias{ranges,GAlignmentsList-method} \alias{granges,GAlignmentsList-method} \alias{grglist,GAlignmentsList-method} \alias{rglist,GAlignmentsList-method} \alias{coerce,GAlignmentsList,IntegerRanges-method} \alias{coerce,GAlignmentsList,GRanges-method} \alias{coerce,GAlignmentsList,GRangesList-method} \alias{coerce,GAlignmentsList,IntegerRangesList-method} \alias{coerce,GAlignmentPairs,GAlignmentsList-method} \alias{coerce,GAlignmentsList,GAlignmentPairs-method} \alias{coerce,list,GAlignmentsList-method} % extractList() and family: \alias{relistToClass,GAlignments-method} % show: \alias{show,GAlignmentsList-method} \title{GAlignmentsList objects} \description{ The GAlignmentsList class is a container for storing a collection of \link{GAlignments} objects. } \details{ A GAlignmentsList object contains a list of \link{GAlignments} objects. The majority of operations on this page are described in more detail on the GAlignments man page, see ?\code{GAlignments}. } \section{Constructor}{ \describe{ \item{\code{GAlignmentsList(...)}:}{ Creates a GAlignmentsList from a list of \link{GAlignments} objects. } } } \section{Accessors}{ In the code snippets below, \code{x} is a GAlignmentsList object. \describe{ \item{\code{length(x)}:}{ Return the number of elements in \code{x}. } \item{\code{names(x)}, \code{names(x) <- value}:}{ Get or set the names of the elements of \code{x}. } \item{\code{seqnames(x)}, \code{seqnames(x) <- value}:}{ Get or set the name of the reference sequences of the alignments in each element of \code{x}. } \item{\code{rname(x)}, \code{rname(x) <- value}:}{ Same as \code{seqnames(x)} and \code{seqnames(x) <- value}. } \item{\code{strand(x)}, \code{strand(x) <- value}:}{ Get or set the strand of the alignments in each element of \code{x}. } \item{\code{cigar(x)}:}{ Returns a character list of length \code{length(x)} containing the CIGAR string for the alignments in each element of \code{x}. } \item{\code{qwidth(x)}:}{ Returns an integer list of length \code{length(x)} containing the length of the alignments in each element of \code{x} *after* hard clipping (i.e. the length of the query sequence that is stored in the corresponding SAM/BAM record). } \item{\code{start(x)}, \code{end(x)}:}{ Returns an integer list of length \code{length(x)} containing the "start" and "end" (respectively) of the alignments in each element of \code{x}. } \item{\code{width(x)}:}{ Returns an integer list of length \code{length(x)} containing the "width" of the alignments in each element of \code{x}. } \item{\code{njunc(x)}:}{ Returns an integer list of length \code{x} containing the number of junctions (i.e. N operations in the CIGAR) for the alignments in each element of \code{x}. } \item{\code{seqinfo(x)}, \code{seqinfo(x) <- value}:}{ Get or set the information about the underlying sequences. \code{value} must be a \link[GenomeInfoDb]{Seqinfo} object. } \item{\code{seqlevels(x)}, \code{seqlevels(x) <- value}:}{ Get or set the sequence levels of the alignments in each element of \code{x}. } \item{\code{seqlengths(x)}, \code{seqlengths(x) <- value}:}{ Get or set the sequence lengths for each element of \code{x}. \code{seqlengths(x)} is equivalent to \code{seqlengths(seqinfo(x))}. \code{value} can be a named non-negative integer or numeric vector eventually with NAs. } \item{\code{isCircular(x)}, \code{isCircular(x) <- value}:}{ Get or set the circularity flags for the alignments in each element in \code{x}. \code{value} must be a named logical list eventually with NAs. } \item{\code{genome(x)}, \code{genome(x) <- value}:}{ Get or set the genome identifier or assembly name for the alignments in each element of \code{x}. \code{value} must be a named character list eventually with NAs. } \item{\code{seqnameStyle(x)}:}{ Get or set the seqname style for alignments in each element of \code{x}. } } } \section{Coercion}{ In the code snippets below, \code{x} is a GAlignmentsList object. \describe{ \item{\code{granges(x, use.names=TRUE, use.mcols=FALSE, ignore.strand=FALSE)}, \code{ranges(x, use.names=TRUE, use.mcols=FALSE)}:}{ Return either a \link{GRanges} or a \link[IRanges]{IRanges} object of length \code{length(x)}. Note this coercion IGNORES the cigar information. The resulting ranges span the entire range, including any junctions or spaces between paired-end reads. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. \code{granges} coercion supports \code{ignore.strand} to allow ranges of opposite strand to be combined (see examples). All ranges in the resulting GRanges will have strand \sQuote{*}. } \item{\code{grglist(x, use.names=TRUE, use.mcols=FALSE, ignore.strand=FALSE)}, \code{rglist(x, use.names=TRUE, use.mcols=FALSE)}:}{ Return either a \link{GRangesList} or an \link[IRanges]{IRangesList} object of length \code{length(x)}. This coercion RESPECTS the cigar information. The resulting ranges are fragments of the original ranges that do not include junctions or spaces between paired-end reads. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. \code{grglist} coercion supports \code{ignore.strand} to allow ranges of opposite strand to be combined (see examples). When \code{ignore.strand} is TRUE all ranges in the resulting GRangesList have strand \sQuote{*}. } \item{\code{as(x, "GRanges")}, \code{as(x, "IntegerRanges")}, \code{as(x, "GRangesList")}, \code{as(x, "IntegerRangesList")}:}{ Alternate ways of doing \code{granges(x, use.names=TRUE, use.mcols=TRUE)}, \code{ranges(x, use.names=TRUE, use.mcols=TRUE)}, \code{grglist(x, use.names=TRUE, use.mcols=TRUE)}, and \code{rglist(x, use.names=TRUE, use.mcols=TRUE)}, respectively. } \item{\code{as.data.frame(x, row.names = NULL, optional = FALSE, ..., value.name = "value", use.outer.mcols = FALSE, group_name.as.factor = FALSE)}:}{ Coerces \code{x} to a \code{data.frame}. See as.data.frame on the \code{List} man page for details (?\code{List}). } \item{\code{as(x, "GALignmentsList")}:}{ Here \code{x} is a \link{GAlignmentPairs} object. Return a GAlignmentsList object of length \code{length(x)} where the i-th list element represents the ranges of the i-th alignment pair in \code{x}. } } } \section{Subsetting and related operations}{ In the code snippets below, \code{x} is a GAlignmentsList object. \describe{ \item{\code{x[i]}, \code{x[i] <- value}:}{ Get or set list elements \code{i}. \code{i} can be a numeric or logical vector. \code{value} must be a GAlignments. } \item{\code{x[[i]]}, \code{x[[i]] <- value}:}{ Same as \code{x[i]}, \code{x[i] <- value}. } \item{\code{x[i, j]}, \code{x[i, j] <- value}:}{ Get or set list elements \code{i} with optional metadata columns \code{j}. \code{i} can be a numeric, logical or missing. \code{value} must be a GAlignments. } } } \section{Concatenation}{ \describe{ \item{\code{c(x, ..., ignore.mcols=FALSE)}:}{ Concatenate GAlignmentsList object \code{x} and the GAlignmentsList objects in \code{...} together. See \code{?\link[S4Vectors]{c}} in the \pkg{S4Vectors} package for more information about concatenating Vector derivatives. } } } \references{ \url{http://samtools.sourceforge.net/} } \author{Valerie Obenchain} \seealso{ \itemize{ \item \code{\link{readGAlignmentsList}} for reading genomic alignments from a file (typically a BAM file) into a GAlignmentsList object. \item \link{GAlignments} and \link{GAlignmentPairs} objects for handling aligned single- and paired-end reads, respectively. \item \link{junctions-methods} for extracting and summarizing junctions from a GAlignmentsList object. \item \link[GenomicAlignments]{findOverlaps-methods} for finding range overlaps between a GAlignmentsList object and another range-based object. \item \code{\link[GenomeInfoDb]{seqinfo}} in the \pkg{GenomeInfoDb} package for getting/setting/modifying the sequence information stored in an object. \item The \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} classes defined and documented in the \pkg{GenomicRanges} package. } } \examples{ gal1 <- GAlignments( seqnames=Rle(factor(c("chr1", "chr2", "chr1", "chr3")), c(1, 3, 2, 4)), pos=1:10, cigar=paste0(10:1, "M"), strand=Rle(strand(c("-", "+", "*", "+", "-")), c(1, 2, 2, 3, 2)), names=head(letters, 10), score=1:10) gal2 <- GAlignments( seqnames=Rle(factor(c("chr2", "chr4")), c(3, 4)), pos=1:7, cigar=c("5M", "3M2N3M2N3M", "5M", "10M", "5M1N4M", "8M2N1M", "5M"), strand=Rle(strand(c("-", "+")), c(4, 3)), names=tail(letters, 7), score=1:7) galist <- GAlignmentsList(noGaps=gal1, Gaps=gal2) ## --------------------------------------------------------------------- ## A. BASIC MANIPULATION ## --------------------------------------------------------------------- length(galist) names(galist) seqnames(galist) strand(galist) head(cigar(galist)) head(qwidth(galist)) head(start(galist)) head(end(galist)) head(width(galist)) head(njunc(galist)) seqlevels(galist) ## Rename the reference sequences: seqlevels(galist) <- sub("chr", "seq", seqlevels(galist)) seqlevels(galist) grglist(galist) # a GRangesList object rglist(galist) # an IRangesList object ## --------------------------------------------------------------------- ## B. SUBSETTING ## --------------------------------------------------------------------- galist[strand(galist) == "-"] has_junctions <- sapply(galist, function(x) any(grepl("N", cigar(x), fixed=TRUE))) galist[has_junctions] ## Different ways to subset: galist[2] # a GAlignments object of length 1 galist[[2]] # a GAlignments object of length 1 grglist(galist[2]) # a GRangesList object of length 1 rglist(galist[2]) # a NormalIRangesList object of length 1 ## --------------------------------------------------------------------- ## C. mcols()/elementMetadata() ## --------------------------------------------------------------------- ## Metadata can be defined on the individual GAlignment elements ## and the overall GAlignmentsList object. By default, 'level=between' ## extracts the GALignmentsList metadata. Using 'level=within' ## will extract the metadata on the individual GAlignments objects. mcols(galist) ## no metadata on the GAlignmentsList object mcols(galist, level="within") ## --------------------------------------------------------------------- ## D. readGAlignmentsList() ## --------------------------------------------------------------------- library(pasillaBamSubset) ## 'file' as character. fl <- untreated3_chr4() galist1 <- readGAlignmentsList(fl) galist1[1:3] length(galist1) table(elementNROWS(galist1)) ## When 'file' is a BamFile, 'asMates' must be TRUE. If FALSE, ## the data are treated as single-end and each list element of the ## GAlignmentsList will be of length 1. For single-end data ## use readGAlignments() instead of readGAlignmentsList(). bf <- BamFile(fl, yieldSize=3, asMates=TRUE) readGAlignmentsList(bf) ## Use a 'param' to fine tune the results. param <- ScanBamParam(flag=scanBamFlag(isProperPair=TRUE)) galist2 <- readGAlignmentsList(fl, param=param) length(galist2) ## --------------------------------------------------------------------- ## E. COERCION ## --------------------------------------------------------------------- ## The granges() and grlist() coercions support 'ignore.strand' to ## allow ranges from different strands to be combined. In this example ## paired-end reads aligned to opposite strands were read into a ## GAlignmentsList. If the desired operation is to combine these ranges, ## regardless of junctions or the space between pairs, 'ignore.strand' ## must be TRUE. granges(galist[1]) granges(galist[1], ignore.strand=TRUE) ## grglist() galist <- GAlignmentsList(noGaps=gal1, Gaps=gal2) grglist(galist) grglist(galist, ignore.strand=TRUE) } \keyword{methods} \keyword{classes} GenomicAlignments/man/GappedReads-class.Rd0000644000175200017520000000253014547043765021542 0ustar00biocbuildbiocbuild\name{GappedReads-class} \docType{class} % Class: \alias{class:GappedReads} \alias{GappedReads-class} % Constructor: \alias{GappedReads} % Accessors: \alias{qseq} \alias{qseq,GappedReads-method} \alias{qwidth,GappedReads-method} % Combining: \alias{c,GappedReads-method} \title{(Legacy) GappedReads objects} \description{ The GappedReads class extends the \link{GAlignments} class. A GappedReads object contains all the information contained in a \link{GAlignments} object plus the sequences of the queries. Those sequences can be accessed via the \code{qseq} accessor. } \section{Constructor}{ GappedReads objects are typically created when reading a file containing aligned reads with the \code{\link{readGappedReads}} function. } \section{Accessors}{ In the code snippets below, \code{x} is a GappedReads object. \describe{ \item{\code{qseq(x)}:}{ Extracts the sequences of the queries as a \code{\link[Biostrings]{DNAStringSet}} object. } } } \references{ \url{http://samtools.sourceforge.net/} } \author{Hervé Pagès} \seealso{ \itemize{ \item \link{GAlignments} objects. \item \code{\link{readGappedReads}}. } } \examples{ greads_file <- system.file("extdata", "ex1.bam", package="Rsamtools") greads <- readGappedReads(greads_file) greads qseq(greads) } \keyword{methods} \keyword{classes} GenomicAlignments/man/OverlapEncodings-class.Rd0000644000175200017520000003060614547043765022632 0ustar00biocbuildbiocbuild\name{OverlapEncodings-class} \docType{class} \alias{class:OverlapEncodings} \alias{OverlapEncodings-class} \alias{OverlapEncodings} \alias{parallel_slot_names,OverlapEncodings-method} \alias{Loffset} \alias{Loffset,OverlapEncodings-method} \alias{Roffset} \alias{Roffset,OverlapEncodings-method} \alias{encoding,OverlapEncodings-method} \alias{levels,OverlapEncodings-method} \alias{levels.OverlapEncodings} \alias{flippedQuery} \alias{flippedQuery,OverlapEncodings-method} \alias{encodingHalves} \alias{encodingHalves,character-method} \alias{encodingHalves,factor-method} \alias{encodingHalves,OverlapEncodings-method} \alias{Lencoding} \alias{Rencoding} \alias{Lnjunc} \alias{Rnjunc} \alias{njunc,ANY-method} \alias{as.data.frame.OverlapEncodings} \alias{as.data.frame,OverlapEncodings-method} \alias{show,OverlapEncodings-method} \alias{isCompatibleWithSplicing} \alias{isCompatibleWithSplicing,character-method} \alias{isCompatibleWithSplicing,factor-method} \alias{isCompatibleWithSplicing,OverlapEncodings-method} \title{OverlapEncodings objects} \description{ The OverlapEncodings class is a container for storing the "overlap encodings" returned by the \code{\link{encodeOverlaps}} function. } \usage{ ## -=-= OverlapEncodings getters =-=- \S4method{Loffset}{OverlapEncodings}(x) \S4method{Roffset}{OverlapEncodings}(x) \S4method{encoding}{OverlapEncodings}(x) \S4method{levels}{OverlapEncodings}(x) \S4method{flippedQuery}{OverlapEncodings}(x) ## -=-= Coercing an OverlapEncodings object =-=- \S4method{as.data.frame}{OverlapEncodings}(x, row.names=NULL, optional=FALSE, ...) ## -=-= Low-level encoding utilities =-=- encodingHalves(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE) Lencoding(x, ...) Rencoding(x, ...) \S4method{njunc}{ANY}(x) Lnjunc(x, single.end.on.left=FALSE) Rnjunc(x, single.end.on.right=FALSE) isCompatibleWithSplicing(x) } \arguments{ \item{x}{ An OverlapEncodings object. For the low-level encoding utilities, \code{x} can also be a character vector or factor containing encodings. } \item{row.names}{ \code{NULL} or a character vector. } \item{optional}{ Ignored. } \item{...}{ Extra arguments passed to the \code{as.data.frame} method for OverlapEncodings objects are ignored. Extra arguments passed to \code{Lencoding} or \code{Rencoding} are passed down to \code{encodingHalves}. } \item{single.end.on.left, single.end.on.right}{ By default the 2 halves of a single-end encoding are considered to be NAs. If \code{single.end.on.left} (resp. \code{single.end.on.right}) is \code{TRUE}, then the left (resp. right) half of a single-end encoding is considered to be the unmodified encoding. } \item{as.factors}{ By default \code{encodingHalves} returns the 2 encoding halves as a list of 2 character vectors parallel to the input. If \code{as.factors} is \code{TRUE}, then it returns them as a list of 2 factors parallel to the input. } } \details{ Given a \code{query} and a \code{subject} of the same length, both list-like objects with top-level elements typically containing multiple ranges (e.g. \link[IRanges]{IntegerRangesList} objects), the "overlap encoding" of the i-th element in \code{query} and i-th element in \code{subject} is a character string describing how the ranges in \code{query[[i]]} are \emph{qualitatively} positioned relatively to the ranges in \code{subject[[i]]}. The \code{\link{encodeOverlaps}} function computes those overlap encodings and returns them in an OverlapEncodings object of the same length as \code{query} and \code{subject}. The topic of working with overlap encodings is covered in details in the "OverlapEncodings" vignette located this package (\pkg{GenomicAlignments}) and accessible with \code{vignette("OverlapEncodings")}. } \section{OverlapEncodings getters}{ In the following code snippets, \code{x} is an OverlapEncodings object typically obtained by a call to \code{\link{encodeOverlaps}(query, subject)}. \describe{ \item{\code{length(x)}:}{ Get the number of elements (i.e. encodings) in \code{x}. This is equal to \code{length(query)} and \code{length(subject)}. } \item{\code{Loffset(x)}, \code{Roffset(x)}:}{ Get the "left offsets" and "right offsets" of the encodings, respectively. Both are integer vectors of the same length as \code{x}. Let's denote \code{Qi = query[[i]]}, \code{Si = subject[[i]]}, and [q1,q2] the range covered by \code{Qi} i.e. \code{q1 = min(start(Qi))} and \code{q2 = max(end(Qi))}, then \code{Loffset(x)[i]} is the number \code{L} of ranges at the \emph{head} of \code{Si} that are strictly to the left of all the ranges in \code{Qi} i.e. \code{L} is the greatest value such that \code{end(Si)[k] < q1 - 1} for all \code{k} in \code{seq_len(L)}. Similarly, \code{Roffset(x)[i]} is the number \code{R} of ranges at the \emph{tail} of \code{Si} that are strictly to the right of all the ranges in \code{Qi} i.e. \code{R} is the greatest value such that \code{start(Si)[length(Si) + 1 - k] > q2 + 1} for all \code{k} in \code{seq_len(L)}. } \item{\code{encoding(x)}:}{ Factor of the same length as \code{x} where the i-th element is the encoding obtained by comparing each range in \code{Qi} with all the ranges in \code{tSi = Si[(1+L):(length(Si)-R)]} (\code{tSi} stands for "trimmed Si"). More precisely, here is how this encoding is obtained: \enumerate{ \item All the ranges in \code{Qi} are compared with \code{tSi[1]}, then with \code{tSi[2]}, etc... At each step (one step per range in \code{tSi}), comparing all the ranges in \code{Qi} with \code{tSi[k]} is done with \code{rangeComparisonCodeToLetter(compare(Qi, tSi[k]))}. So at each step, we end up with a vector of \code{M} single letters (where \code{M} is \code{length(Qi)}). \item Each vector obtained previously (1 vector per range in \code{tSi}, all of them of length \code{M}) is turned into a single string (called "encoding block") by pasting its individual letters together. \item All the encoding blocks (1 per range in \code{tSi}) are pasted together into a single long string and separated by colons (\code{":"}). An additional colon is prepended to the long string and another one appended to it. \item Finally, a special block containing the value of \code{M} is prepended to the long string. The final string is the encoding. } } \item{\code{levels(x)}:}{ Equivalent to \code{levels(encoding(x))}. } \item{\code{flippedQuery(x)}:}{ Whether or not the top-level element in query used for computing the encoding was "flipped" before the encoding was computed. Note that this flipping generally affects the "left offset", "right offset", in addition to the encoding itself. } } } \section{Coercing an OverlapEncodings object}{ In the following code snippets, \code{x} is an OverlapEncodings object. \describe{ \item{\code{as.data.frame(x)}:}{ Return \code{x} as a data frame with columns \code{"Loffset"}, \code{"Roffset"} and \code{"encoding"}. } } } \section{Low-level encoding utilities}{ In the following code snippets, \code{x} can be an OverlapEncodings object, or a character vector or factor containing encodings. \describe{ \item{\code{encodingHalves(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE)}:}{ Extract the 2 halves of paired-end encodings and return them as a list of 2 character vectors (or 2 factors) parallel to the input. Paired-end encodings are obtained by encoding paired-end overlaps i.e. overlaps between paired-end reads and transcripts (typically). The difference between a single-end encoding and a paired-end encoding is that all the blocks in the latter contain a \code{"--"} separator to mark the separation between the "left encoding" and the "right encoding". See examples below and the "Overlap encodings" vignette located in this package for examples of paired-end encodings. } \item{\code{Lencoding(x, ...)}, \code{Rencoding(x, ...)}:}{ Extract the "left encodings" and "right encodings" of paired-end encodings. Equivalent to \code{encodingHalves(x, ...)[[1]]} and \code{encodingHalves(x, ...)[[2]]}, respectively. } \item{\code{njunc(x)}, \code{Lnjunc(x, single.end.on.left=FALSE)}, \code{Rnjunc(x, single.end.on.right=FALSE)}:}{ Extract the number of junctions in each encoding by looking at their first block (aka special block). If an element \code{xi} in \code{x} is a paired-end encoding, then \code{Lnjunc(xi)}, \code{Rnjunc(xi)}, and \code{njunc(xi)}, return \code{njunc(Lencoding(xi))}, \code{njunc(Rencoding(xi))}, and \code{Lnjunc(xi) + Rnjunc(xi)}, respectively. } \item{\code{isCompatibleWithSplicing(x)}:}{ Returns a logical vector \emph{parallel} to \code{x} indicating whether the corresponding encoding describes a \emph{splice compatible} overlap i.e. an overlap that is compatible with the splicing of the transcript. WARNING: For paired-end encodings, \code{isCompatibleWithSplicing} considers that the encoding is \emph{splice compatible} if its 2 halves are \emph{splice compatible}. This can produce false positives if for example the right end of the alignment is located upstream of the left end in transcript space. The paired-end read could not come from this transcript. To eliminate these false positives, one would need to have access and look at the position of the left and right ends in transcript space. This can be done with \code{\link{extractQueryStartInTranscript}}. } } } \author{Hervé Pagès} \seealso{ \itemize{ \item The "OverlapEncodings" vignette in this package. \item The \code{\link{encodeOverlaps}} function for computing "overlap encodings". \item The \code{\link[IRanges]{pcompare}} function in the \pkg{IRanges} package for the interpretation of the strings returned by \code{encoding}. \item The \link[GenomicRanges]{GRangesList} class defined and documented in the \pkg{GenomicRanges} package. } } \examples{ ## --------------------------------------------------------------------- ## A. BASIC MANIPULATION OF AN OverlapEncodings OBJECT ## --------------------------------------------------------------------- example(encodeOverlaps) # to generate the 'ovenc' object length(ovenc) Loffset(ovenc) Roffset(ovenc) encoding(ovenc) levels(ovenc) nlevels(ovenc) flippedQuery(ovenc) njunc(ovenc) as.data.frame(ovenc) njunc(levels(ovenc)) ## --------------------------------------------------------------------- ## B. WORKING WITH PAIRED-END ENCODINGS (POSSIBLY MIXED WITH SINGLE-END ## ENCODINGS) ## --------------------------------------------------------------------- encodings <- c("4:jmmm:agmm:aagm:aaaf:", "3--1:jmm--b:agm--i:") encodingHalves(encodings) encodingHalves(encodings, single.end.on.left=TRUE) encodingHalves(encodings, single.end.on.right=TRUE) encodingHalves(encodings, single.end.on.left=TRUE, single.end.on.right=TRUE) Lencoding(encodings) Lencoding(encodings, single.end.on.left=TRUE) Rencoding(encodings) Rencoding(encodings, single.end.on.right=TRUE) njunc(encodings) Lnjunc(encodings) Lnjunc(encodings, single.end.on.left=TRUE) Rnjunc(encodings) Rnjunc(encodings, single.end.on.right=TRUE) ## --------------------------------------------------------------------- ## C. DETECTION OF "SPLICE COMPATIBLE" OVERLAPS ## --------------------------------------------------------------------- ## Reads that are compatible with the splicing of the transcript can ## be detected with a regular expression (the regular expression below ## assumes that reads have at most 2 junctions): regex0 <- "(:[fgij]:|:[jg].:.[gf]:|:[jg]..:.g.:..[gf]:)" grepl(regex0, encoding(ovenc)) # read4 is NOT "compatible" ## This was for illustration purpose only. In practise you don't need ## (and should not) use this regular expression, but use instead the ## isCompatibleWithSplicing() utility function: isCompatibleWithSplicing(ovenc) } \keyword{methods} \keyword{classes} GenomicAlignments/man/cigar-utils.Rd0000644000175200017520000004420314516004601020464 0ustar00biocbuildbiocbuild\name{cigar-utils} \alias{cigar-utils} \alias{validCigar} \alias{CIGAR_OPS} \alias{explodeCigarOps} \alias{explodeCigarOpLengths} \alias{cigarToRleList} \alias{cigarOpTable} \alias{cigarRangesAlongReferenceSpace} \alias{cigarRangesAlongQuerySpace} \alias{cigarRangesAlongPairwiseSpace} \alias{extractAlignmentRangesOnReference} \alias{cigarWidthAlongReferenceSpace} \alias{cigarWidthAlongQuerySpace} \alias{cigarWidthAlongPairwiseSpace} \alias{cigarNarrow} \alias{cigarQNarrow} \alias{queryLoc2refLoc} \alias{queryLocs2refLocs} \title{ CIGAR utility functions } \description{ Utility functions for low-level CIGAR manipulation. } \usage{ ## -=-= Supported CIGAR operations =-=- CIGAR_OPS ## -=-= Transform CIGARs into other useful representations =-=- explodeCigarOps(cigar, ops=CIGAR_OPS) explodeCigarOpLengths(cigar, ops=CIGAR_OPS) cigarToRleList(cigar) ## -=-= Summarize CIGARs =-=- cigarOpTable(cigar) ## -=-= From CIGARs to ranges =-=- cigarRangesAlongReferenceSpace(cigar, flag=NULL, N.regions.removed=FALSE, pos=1L, f=NULL, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) cigarRangesAlongQuerySpace(cigar, flag=NULL, before.hard.clipping=FALSE, after.soft.clipping=FALSE, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) cigarRangesAlongPairwiseSpace(cigar, flag=NULL, N.regions.removed=FALSE, dense=FALSE, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) extractAlignmentRangesOnReference(cigar, pos=1L, drop.D.ranges=FALSE, f=NULL) ## -=-= From CIGARs to sequence lengths =-=- cigarWidthAlongReferenceSpace(cigar, flag=NULL, N.regions.removed=FALSE) cigarWidthAlongQuerySpace(cigar, flag=NULL, before.hard.clipping=FALSE, after.soft.clipping=FALSE) cigarWidthAlongPairwiseSpace(cigar, flag=NULL, N.regions.removed=FALSE, dense=FALSE) ## -=-= Narrow CIGARs =-=- cigarNarrow(cigar, start=NA, end=NA, width=NA) cigarQNarrow(cigar, start=NA, end=NA, width=NA) ## -=-= Translate coordinates between query and reference spaces =-=- queryLoc2refLoc(qloc, cigar, pos=1L) queryLocs2refLocs(qlocs, cigar, pos=1L, flag=NULL) } \arguments{ \item{cigar}{ A character vector or factor containing the extended CIGAR strings. It can be of arbitrary length except for \code{queryLoc2refLoc} which only accepts a single CIGAR (as a character vector or factor of length 1). } \item{ops}{ Character vector containing the extended CIGAR operations to actually consider. Zero-length operations or operations not listed \code{ops} are ignored. } \item{flag}{ \code{NULL} or an integer vector containing the SAM flag for each read. According to the SAM Spec v1.4, flag bit 0x4 is the only reliable place to tell whether a segment (or read) is mapped (bit is 0) or not (bit is 1). If \code{flag} is supplied, then \code{cigarRangesAlongReferenceSpace}, \code{cigarRangesAlongQuerySpace}, \code{cigarRangesAlongPairwiseSpace}, and \code{extractAlignmentRangesOnReference} don't produce any range for unmapped reads i.e. they treat them as if their CIGAR was empty (independently of what their CIGAR is). If \code{flag} is supplied, then \code{cigarWidthAlongReferenceSpace}, \code{cigarWidthAlongQuerySpace}, and \code{cigarWidthAlongPairwiseSpace} return \code{NA}s for unmapped reads. } \item{N.regions.removed}{ \code{TRUE} or \code{FALSE}. If \code{TRUE}, then \code{cigarRangesAlongReferenceSpace} and \code{cigarWidthAlongReferenceSpace} report ranges/widths with respect to the "reference" space from which the N regions have been removed, and \code{cigarRangesAlongPairwiseSpace} and \code{cigarWidthAlongPairwiseSpace} report them with respect to the "pairwise" space from which the N regions have been removed. } \item{pos}{ An integer vector containing the 1-based leftmost position/coordinate for each (eventually clipped) read sequence. Must have length 1 (in which case it's recycled to the length of \code{cigar}), or the same length as \code{cigar}. } \item{f}{ \code{NULL} or a factor of length \code{cigar}. If \code{NULL}, then the ranges are grouped by alignment i.e. the returned \link[IRanges]{IRangesList} object has 1 list element per element in \code{cigar}. Otherwise they are grouped by factor level i.e. the returned \link[IRanges]{IRangesList} object has 1 list element per level in \code{f} and is named with those levels. For example, if \code{f} is a factor containing the chromosome for each read, then the returned \link[IRanges]{IRangesList} object will have 1 list element per chromosome and each list element will contain all the ranges on that chromosome. } \item{drop.empty.ranges}{ Should empty ranges be dropped? } \item{reduce.ranges}{ Should adjacent ranges coming from the same cigar be merged or not? Using \code{TRUE} can significantly reduce the size of the returned object. } \item{with.ops}{ \code{TRUE} or \code{FALSE} indicating whether the returned ranges should be named with their corresponding CIGAR operation. } \item{before.hard.clipping}{ \code{TRUE} or \code{FALSE}. If \code{TRUE}, then \code{cigarRangesAlongQuerySpace} and \code{cigarWidthAlongQuerySpace} report ranges/widths with respect to the "query" space to which the H regions have been added. \code{before.hard.clipping} and \code{after.soft.clipping} cannot both be \code{TRUE}. } \item{after.soft.clipping}{ \code{TRUE} or \code{FALSE}. If \code{TRUE}, then \code{cigarRangesAlongQuerySpace} and \code{cigarWidthAlongQuerySpace} report ranges/widths with respect to the "query" space from which the S regions have been removed. \code{before.hard.clipping} and \code{after.soft.clipping} cannot both be \code{TRUE}. } \item{dense}{ \code{TRUE} or \code{FALSE}. If \code{TRUE}, then \code{cigarRangesAlongPairwiseSpace} and \code{cigarWidthAlongPairwiseSpace} report ranges/widths with respect to the "pairwise" space from which the I, D, and N regions have been removed. \code{N.regions.removed} and \code{dense} cannot both be \code{TRUE}. } \item{drop.D.ranges}{ Should the ranges corresponding to a deletion from the reference (encoded with a D in the CIGAR) be dropped? By default we keep them to be consistent with the pileup tool from SAMtools. Note that, when \code{drop.D.ranges} is \code{TRUE}, then Ds and Ns in the CIGAR are equivalent. } \item{start,end,width}{ Vectors of integers. NAs and negative values are accepted and "solved" according to the rules of the SEW (Start/End/Width) interface (see \code{?\link[IRanges]{solveUserSEW}} for the details). } \item{qloc}{ An integer vector containing "query-based locations" i.e. 1-based locations relative to the query sequence stored in the SAM/BAM file. } \item{qlocs}{ A list of the same length as \code{cigar} where each element is an integer vector containing "query-based locations" i.e. 1-based locations relative to the corresponding query sequence stored in the SAM/BAM file. } } \value{ \code{CIGAR_OPS} is a predefined character vector containing the supported extended CIGAR operations: M, I, D, N, S, H, P, =, X. See p. 4 of the SAM Spec v1.4 at \url{http://samtools.sourceforge.net/} for the list of extended CIGAR operations and their meanings. For \code{explodeCigarOps} and \code{explodeCigarOpLengths}: Both functions return a list of the same length as \code{cigar} where each list element is a character vector (for \code{explodeCigarOps}) or an integer vector (for \code{explodeCigarOpLengths}). The 2 lists have the same shape, that is, same \code{length()} and same \code{elementNROWS()}. The i-th character vector in the list returned by \code{explodeCigarOps} contains one single-letter string per CIGAR operation in \code{cigar[i]}. The i-th integer vector in the list returned by \code{explodeCigarOpLengths} contains the corresponding CIGAR operation lengths. Zero-length operations or operations not listed in \code{ops} are ignored. For \code{cigarToRleList}: A \link[IRanges]{CompressedRleList} object. For \code{cigarOpTable}: An integer matrix with number of rows equal to the length of \code{cigar} and nine columns, one for each extended CIGAR operation. For \code{cigarRangesAlongReferenceSpace}, \code{cigarRangesAlongQuerySpace}, \code{cigarRangesAlongPairwiseSpace}, and \code{extractAlignmentRangesOnReference}: An \link[IRanges]{IRangesList} object (more precisely a \link[IRanges]{CompressedIRangesList} object) with 1 list element per element in \code{cigar}. However, if \code{f} is a factor, then the returned \link[IRanges]{IRangesList} object can be a \link[IRanges]{SimpleIRangesList} object (instead of \link[IRanges]{CompressedIRangesList}), and in that case, has 1 list element per level in \code{f} and is named with those levels. For \code{cigarWidthAlongReferenceSpace} and \code{cigarWidthAlongPairwiseSpace}: An integer vector of the same length as \code{cigar} where each element is the width of the alignment with respect to the "reference" and "pairwise" space, respectively. More precisely, for \code{cigarWidthAlongReferenceSpace}, the returned widths are the lengths of the alignments on the reference, N gaps included (except if \code{N.regions.removed} is \code{TRUE}). NAs or \code{"*"} in \code{cigar} will produce NAs in the returned vector. For \code{cigarWidthAlongQuerySpace}: An integer vector of the same length as \code{cigar} where each element is the length of the corresponding query sequence as inferred from the CIGAR string. Note that, by default (i.e. if \code{before.hard.clipping} and \code{after.soft.clipping} are \code{FALSE}), this is the length of the query sequence stored in the SAM/BAM file. If \code{before.hard.clipping} or \code{after.soft.clipping} is \code{TRUE}, the returned widths are the lengths of the query sequences before hard clipping or after soft clipping. NAs or \code{"*"} in \code{cigar} will produce NAs in the returned vector. For \code{cigarNarrow} and \code{cigarQNarrow}: A character vector of the same length as \code{cigar} containing the narrowed cigars. In addition the vector has an "rshift" attribute which is an integer vector of the same length as \code{cigar}. It contains the values that would need to be added to the POS field of a SAM/BAM file as a consequence of this cigar narrowing. For \code{queryLoc2refLoc}: An integer vector of the same length as \code{qloc} containing the "reference-based locations" (i.e. the 1-based locations relative to the reference sequence) corresponding to the "query-based locations" passed in \code{qloc}. For \code{queryLocs2refLocs}: A list of the same length as \code{qlocs} where each element is an integer vector containing the "reference-based locations" corresponding to the "query-based locations" passed in the corresponding element in \code{qlocs}. } \references{ \url{http://samtools.sourceforge.net/} } \author{Hervé Pagès & P. Aboyoun} \seealso{ \itemize{ \item The \link[GenomicAlignments]{sequenceLayer} function in the \pkg{GenomicAlignments} package for laying the query sequences alongside the "reference" or "pairwise" spaces. \item The \link{GAlignments} container for storing a set of genomic alignments. \item The \link[IRanges]{IRanges}, \link[IRanges]{IRangesList}, and \link[IRanges]{RleList} classes in the \pkg{IRanges} package. \item The \code{\link[IRanges]{coverage}} generic and methods for computing the coverage across a set of ranges or genomic ranges. } } \examples{ ## --------------------------------------------------------------------- ## A. CIGAR_OPS, explodeCigarOps(), explodeCigarOpLengths(), ## cigarToRleList(), and cigarOpTable() ## --------------------------------------------------------------------- ## Supported CIGAR operations: CIGAR_OPS ## Transform CIGARs into other useful representations: cigar1 <- "3H15M55N4M2I6M2D5M6S" cigar2 <- c("40M2I9M", cigar1, "2S10M2000N15M", "3H33M5H") explodeCigarOps(cigar2) explodeCigarOpLengths(cigar2) explodeCigarOpLengths(cigar2, ops=c("I", "S")) cigarToRleList(cigar2) ## Summarize CIGARs: cigarOpTable(cigar2) ## --------------------------------------------------------------------- ## B. From CIGARs to ranges and to sequence lengths ## --------------------------------------------------------------------- ## CIGAR ranges along the "reference" space: cigarRangesAlongReferenceSpace(cigar1, with.ops=TRUE)[[1]] cigarRangesAlongReferenceSpace(cigar1, reduce.ranges=TRUE, with.ops=TRUE)[[1]] ops <- setdiff(CIGAR_OPS, "N") cigarRangesAlongReferenceSpace(cigar1, ops=ops, with.ops=TRUE)[[1]] cigarRangesAlongReferenceSpace(cigar1, ops=ops, reduce.ranges=TRUE, with.ops=TRUE)[[1]] ops <- setdiff(CIGAR_OPS, c("D", "N")) cigarRangesAlongReferenceSpace(cigar1, ops=ops, with.ops=TRUE)[[1]] cigarWidthAlongReferenceSpace(cigar1) pos2 <- c(1, 1001, 1, 351) cigarRangesAlongReferenceSpace(cigar2, pos=pos2, with.ops=TRUE) res1a <- extractAlignmentRangesOnReference(cigar2, pos=pos2) res1b <- cigarRangesAlongReferenceSpace(cigar2, pos=pos2, ops=setdiff(CIGAR_OPS, "N"), reduce.ranges=TRUE) stopifnot(identical(res1a, res1b)) res2a <- extractAlignmentRangesOnReference(cigar2, pos=pos2, drop.D.ranges=TRUE) res2b <- cigarRangesAlongReferenceSpace(cigar2, pos=pos2, ops=setdiff(CIGAR_OPS, c("D", "N")), reduce.ranges=TRUE) stopifnot(identical(res2a, res2b)) seqnames <- factor(c("chr6", "chr6", "chr2", "chr6"), levels=c("chr2", "chr6")) extractAlignmentRangesOnReference(cigar2, pos=pos2, f=seqnames) ## CIGAR ranges along the "query" space: cigarRangesAlongQuerySpace(cigar2, with.ops=TRUE) cigarWidthAlongQuerySpace(cigar1) cigarWidthAlongQuerySpace(cigar1, before.hard.clipping=TRUE) ## CIGAR ranges along the "pairwise" space: cigarRangesAlongPairwiseSpace(cigar2, with.ops=TRUE) cigarRangesAlongPairwiseSpace(cigar2, dense=TRUE, with.ops=TRUE) ## --------------------------------------------------------------------- ## C. COMPUTE THE COVERAGE OF THE READS STORED IN A BAM FILE ## --------------------------------------------------------------------- ## The information stored in a BAM file can be used to compute the ## "coverage" of the mapped reads i.e. the number of reads that hit any ## given position in the reference genome. ## The following function takes the path to a BAM file and returns an ## object representing the coverage of the mapped reads that are stored ## in the file. The returned object is an RleList object named with the ## names of the reference sequences that actually receive some coverage. flag0 <- scanBamFlag(isUnmappedQuery=FALSE, isDuplicate=FALSE) extractCoverageFromBAM <- function(bamfile) { stopifnot(is(bamfile, "BamFile")) ## This ScanBamParam object allows us to load only the necessary ## information from the file. param <- ScanBamParam(flag=flag0, what=c("rname", "pos", "cigar")) bam <- scanBam(bamfile, param=param)[[1]] ## Note that unmapped reads and reads that are PCR/optical duplicates ## have already been filtered out by using the ScanBamParam object ## above. f <- factor(bam$rname, levels=seqlevels(bamfile)) irl <- extractAlignmentRangesOnReference(bam$cigar, pos=bam$pos, f=f) coverage(irl, width=seqlengths(bamfile)) } library(Rsamtools) f1 <- system.file("extdata", "ex1.bam", package="Rsamtools") cvg <- extractCoverageFromBAM(BamFile(f1)) ## extractCoverageFromBAM() is equivalent but slightly more efficient ## than loading a GAlignments object and computing its coverage: cvg2 <- coverage(readGAlignments(f1, param=ScanBamParam(flag=flag0))) stopifnot(identical(cvg, cvg2)) ## --------------------------------------------------------------------- ## D. cigarNarrow() and cigarQNarrow() ## --------------------------------------------------------------------- ## cigarNarrow(): cigarNarrow(cigar1) # only drops the soft/hard clipping cigarNarrow(cigar1, start=10) cigarNarrow(cigar1, start=15) cigarNarrow(cigar1, start=15, width=57) cigarNarrow(cigar1, start=16) #cigarNarrow(cigar1, start=16, width=55) # ERROR! (empty cigar) cigarNarrow(cigar1, start=71) cigarNarrow(cigar1, start=72) cigarNarrow(cigar1, start=75) ## cigarQNarrow(): cigarQNarrow(cigar1, start=4, end=-3) cigarQNarrow(cigar1, start=10) cigarQNarrow(cigar1, start=19) cigarQNarrow(cigar1, start=24) ## --------------------------------------------------------------------- ## E. PERFORMANCE ## --------------------------------------------------------------------- if (interactive()) { ## We simulate 20 millions aligned reads, all 40-mers. 95% of them ## align with no indels. 5% align with a big deletion in the ## reference. In the context of an RNAseq experiment, those 5% would ## be suspected to be "junction reads". set.seed(123) nreads <- 20000000L njunctionreads <- nreads * 5L / 100L cigar3 <- character(nreads) cigar3[] <- "40M" junctioncigars <- paste( paste(10:30, "M", sep=""), paste(sample(80:8000, njunctionreads, replace=TRUE), "N", sep=""), paste(30:10, "M", sep=""), sep="") cigar3[sample(nreads, njunctionreads)] <- junctioncigars some_fake_rnames <- paste("chr", c(1:6, "X"), sep="") rname <- factor(sample(some_fake_rnames, nreads, replace=TRUE), levels=some_fake_rnames) pos <- sample(80000000L, nreads, replace=TRUE) ## The following takes < 3 sec. to complete: system.time(irl1 <- extractAlignmentRangesOnReference(cigar3, pos=pos)) ## The following takes < 4 sec. to complete: system.time(irl2 <- extractAlignmentRangesOnReference(cigar3, pos=pos, f=rname)) ## The sizes of the resulting objects are about 240M and 160M, ## respectively: object.size(irl1) object.size(irl2) } } \keyword{manip} GenomicAlignments/man/coordinate-mapping-methods.Rd0000644000175200017520000002707314516004601023470 0ustar00biocbuildbiocbuild\name{mapToAlignments} \alias{coordinate-mapping-methods} \alias{mapToAlignments} \alias{mapToAlignments,IntegerRanges,GAlignments-method} \alias{mapToAlignments,GenomicRanges,GAlignments-method} \alias{pmapToAlignments} \alias{pmapToAlignments,IntegerRanges,GAlignments-method} \alias{pmapToAlignments,GenomicRanges,GAlignments-method} \alias{mapFromAlignments} \alias{mapFromAlignments,IntegerRanges,GAlignments-method} \alias{mapFromAlignments,GenomicRanges,GAlignments-method} \alias{pmapFromAlignments} \alias{pmapFromAlignments,IntegerRanges,GAlignments-method} \alias{pmapFromAlignments,GenomicRanges,GAlignments-method} \title{Map range coordinates between reads and genome space using CIGAR alignments} \description{ Map range coordinates between reads (local) and genome (reference) space using the CIGAR in a \code{GAlignments} object. See \code{?\link[GenomicFeatures]{mapToTranscripts}} in the \pkg{GenomicRanges} package for mapping coordinates between features in the transcriptome and genome space. } \usage{ \S4method{mapToAlignments}{GenomicRanges,GAlignments}(x, alignments, ...) \S4method{pmapToAlignments}{GenomicRanges,GAlignments}(x, alignments, ...) \S4method{mapFromAlignments}{GenomicRanges,GAlignments}(x, alignments, ...) \S4method{pmapFromAlignments}{GenomicRanges,GAlignments}(x, alignments, ...) } \arguments{ \item{x}{ \code{\linkS4class{GenomicRanges}} object of positions to be mapped. \code{x} must have names when mapping to the genome. } \item{alignments}{ A \code{\linkS4class{GAlignments}} object that represents the alignment of \code{x} to the genome. The \code{aligments} object must have names. When mapping to the genome names are used to determine mapping pairs and in the reverse direction they are used as the seqlevels of the output object. } \item{\dots}{ Arguments passed to other methods. } } \details{ These methods use a \code{GAlignments} object to represent the alignment between the ranges in \code{x} and the output. The following CIGAR operations in the "Extended CIGAR format" are used in the mapping algorithm: \itemize{ \item{M, X, =} Sequence match or mismatch \item{I} Insertion to the reference \item{D} Deletion from the reference \item{N} Skipped region from the reference \item{S} Soft clip on the read \item{H} Hard clip on the read \item{P} Silent deletion from the padded reference } \itemize{ \item{\code{mapToAlignments}, \code{pmapToAlignments}}{ The CIGAR is used to map the genomic (reference) position \code{x} to local coordinates. The mapped position starts at \preformatted{ start(x) - start(alignments) + 1 } and is incremented or decremented as the algorithm walks the length of the CIGAR. A successful mapping in this direction requires that \code{x} fall within \code{alignments}. The seqlevels of the return object are taken from the \code{alignments} object and will be a name descriptive of the read or aligned region. In this direction, mapping is attempted between all elements of \code{x} and all elements of \code{alignments}. } \item{\code{mapFromAlignments}, \code{pmapFromAlignments}}{ The CIGAR is used to map the local position \code{x} to genomic (reference) coordinates. The mapped position starts at \preformatted{ start(x) + start(alignments) - 1 } and is incremented or decremented as the algorithm walks the length of the CIGAR. A successful mapping in this direction requires that the width of \code{alignments} is <= the width of \code{x}. When mapping to the genome, name matching is used to determine the mapping pairs (vs attempting to match all possible pairs). Ranges in \code{x} are only mapped to ranges in \code{alignments} with the same name. Name matching is motivated by use cases such as differentially expressed regions where the expressed regions in \code{x} would only be related to a subset of regions in \code{alignments}, which may contains gene or transcript ranges. } \item{element-wise versions}{ \code{pmapToAlignments} and \code{pmapFromAlignments} are element-wise (aka `parallel`) versions of \code{mapToAlignments} and \code{mapFromAlignments}. The i-th range in \code{x} is mapped to the i-th range in \code{alignments}; \code{x} and \code{alignments} must have the same length. Ranges in \code{x} that do not map (out of bounds) are returned as zero-width ranges starting at 0. These ranges are given the special seqname of "UNMAPPED". Note the non-parallel methods do not return unmapped ranges so the "UNMAPPED" seqname is unique to \code{pmapToAlignments} and \code{pmapFromAlignments}. } \item{strand}{ By SAM convention, the CIGAR string is reported for mapped reads on the forward genomic strand. There is no need to consider strand in these methods. The output of these methods will always be unstranded (i.e., "*"). } } } \value{ An object the same class as \code{x}. Parallel methods return an object the same shape as \code{x}. Ranges that cannot be mapped (out of bounds) are returned as zero-width ranges starting at 0 with a seqname of "UNMAPPED". Non-parallel methods return an object that varies in length similar to a Hits object. The result only contains mapped records, out of bound ranges are not returned. \code{xHits} and \code{alignmentsHits} metadata columns indicate the elements of \code{x} and \code{alignments} used in the mapping. When present, names from \code{x} are propagated to the output. When mapping locally, the seqlevels of the output are the names on the \code{alignment} object. When mapping globally, the output seqlevels are the seqlevels of \code{alignment} which are usually chromosome names. } \seealso{ \itemize{ \item \code{?\link[GenomicFeatures]{mapToTranscripts}} in the in the \pkg{GenomicFeatures} package for methods mapping between transcriptome and genome space. \item \url{http://samtools.sourceforge.net/} for a description of the Extended CIGAR format. } } \author{V. Obenchain, M. Lawrence and H. Pagès} \examples{ ## --------------------------------------------------------------------- ## A. Basic use ## --------------------------------------------------------------------- ## 1. Map to local space with mapToAlignments() ## --------------------------------------------------------------------- ## Mapping to local coordinates requires 'x' to be within 'alignments'. ## In this 'x', the second range is too long and can't be mapped. alignments <- GAlignments("chr1", 10L, "11M", strand("*"), names="read_A") x <- GRanges("chr1", IRanges(c(12, 12), width=c(6, 20))) mapToAlignments(x, alignments) ## The element-wise version of the function returns unmapped ranges ## as zero-width ranges with a seqlevel of "UNMAPPED": pmapToAlignments(x, c(alignments, alignments)) ## Mapping the same range through different alignments demonstrates ## how the CIGAR operations affect the outcome. ops <- c("no-op", "junction", "insertion", "deletion") x <- GRanges(rep("chr1", 4), IRanges(rep(12, 4), width=rep(6, 4), names=ops)) alignments <- GAlignments(rep("chr1", 4), rep(10L, 4), cigar = c("11M", "5M2N4M", "5M2I4M", "5M2D4M"), strand = strand(rep("*", 4)), names = paste0("region_", 1:4)) pmapToAlignments(x, alignments) ## 2. Map to genome space with mapFromAlignments() ## --------------------------------------------------------------------- ## One of the criteria when mapping to genomic coordinates is that the ## shifted 'x' range falls within 'alignments'. Here the first 'x' ## range has a shifted start value of 14 (5 + 10 - 1 = 14) with a width of ## 2 and so is successfully mapped. The second has a shifted start of 29 ## (20 + 10 - 1 = 29) which is outside the range of 'alignments'. x <- GRanges("chr1", IRanges(c(5, 20), width=2, names=rep("region_A", 2))) alignments <- GAlignments("chr1", 10L, "11M", strand("*"), names="region_A") mapFromAlignments(x, alignments) ## Another characteristic of mapping this direction is the name matching ## used to determine pairs. Mapping is only attempted between ranges in 'x' ## and 'alignments' with the same name. If we change the name of the first 'x' ## range, only the second will be mapped to 'alignment'. We know the second ## range fails to map so we get an empty result. names(x) <- c("region_B", "region_A") mapFromAlignments(x, alignments) ## CIGAR operations: insertions reduce the width of the output while ## junctions and deletions increase it. ops <- c("no-op", "junction", "insertion", "deletion") x <- GRanges(rep("chr1", 4), IRanges(rep(3, 4), width=rep(5, 4), names=ops)) alignments <- GAlignments(rep("chr1", 4), rep(10L, 4), cigar = c("11M", "5M2N4M", "5M2I4M", "5M2D4M"), strand = strand(rep("*", 4))) pmapFromAlignments(x, alignments) ## --------------------------------------------------------------------- ## B. TATA box motif: mapping from read -> genome -> transcript ## --------------------------------------------------------------------- ## The TATA box motif is a conserved DNA sequence in the core promoter ## region. Many eukaryotic genes have a TATA box located approximately ## 25-35 base pairs upstream of the transcription start site. The motif is ## the binding site of general transcription factors or histones and ## plays a key role in transcription. ## In this example, the position of the TATA box motif (if present) is ## located in the DNA sequence corresponding to read ranges. The local ## motif positions are mapped to genome coordinates and then mapped ## to gene features such as promoters regions. ## Load reads from chromosome 4 of D. melanogaster (dm3): library(pasillaBamSubset) fl <- untreated1_chr4() gal <- readGAlignments(fl) ## Extract DNA sequences corresponding to the read ranges: library(GenomicFeatures) library(BSgenome.Dmelanogaster.UCSC.dm3) dna <- extractTranscriptSeqs(BSgenome.Dmelanogaster.UCSC.dm3, grglist(gal)) ## Search for the consensus motif TATAAA in the sequences: box <- vmatchPattern("TATAAA", dna) ## Some sequences had more than one match: table(elementNROWS(box)) ## The element-wise function we'll use for mapping to genome coordinates ## requires the two input argument to have the same length. We need to ## replicate the read ranges to match the number of motifs found. ## Expand the read ranges to match motifs found: motif <- elementNROWS(box) != 0 alignments <- rep(gal[motif], elementNROWS(box)[motif]) ## We make the IRanges into a GRanges object so the seqlevels can ## propagate to the output. Seqlevels are needed in the last mapping step. readCoords <- GRanges(seqnames(alignments), unlist(box, use.names=FALSE)) ## Map the local position of the motif to genome coordinates: genomeCoords <- pmapFromAlignments(readCoords, alignments) genomeCoords ## We are interested in the location of the TATA box motifs in the ## promoter regions. To perform the mapping we need the promoter ranges ## as a GRanges or GRangesList. ## Extract promoter regions 50 bp upstream from the transcription start site: library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene promoters <- promoters(txdb, upstream=50, downstream=0) ## Map the genome coordinates to the promoters: names(promoters) <- mcols(promoters)$tx_name ## must be named mapToTranscripts(genomeCoords, promoters) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/coverage-methods.Rd0000644000175200017520000001277514516004601021506 0ustar00biocbuildbiocbuild\name{coverage-methods} \alias{coverage-methods} \alias{coverage} \alias{coverage,GAlignments-method} \alias{coverage,GAlignmentPairs-method} \alias{coverage,GAlignmentsList-method} \alias{coverage,BamFile-method} \alias{coverage,character-method} \title{Coverage of a GAlignments, GAlignmentPairs, or GAlignmentsList object} \description{ \code{\link[IRanges]{coverage}} methods for \link{GAlignments}, \link{GAlignmentPairs}, \link{GAlignmentsList}, and \link[Rsamtools]{BamFile} objects. NOTE: The \code{\link[IRanges]{coverage}} generic function and methods for \link[IRanges]{IntegerRanges} and \link[IRanges]{IntegerRangesList} objects are defined and documented in the \pkg{IRanges} package. Methods for \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} objects are defined and documented in the \pkg{GenomicRanges} package. } \usage{ \S4method{coverage}{GAlignments}(x, shift=0L, width=NULL, weight=1L, method=c("auto", "sort", "hash", "naive"), drop.D.ranges=FALSE) \S4method{coverage}{GAlignmentPairs}(x, shift=0L, width=NULL, weight=1L, method=c("auto", "sort", "hash", "naive"), drop.D.ranges=FALSE) \S4method{coverage}{GAlignmentsList}(x, shift=0L, width=NULL, weight=1L, ...) \S4method{coverage}{BamFile}(x, shift=0L, width=NULL, weight=1L, ..., param=ScanBamParam()) \S4method{coverage}{character}(x, shift=0L, width=NULL, weight=1L, ..., yieldSize=2500000L) } \arguments{ \item{x}{ A \link{GAlignments}, \link{GAlignmentPairs}, \link{GAlignmentsList}, or \link[Rsamtools]{BamFile} object, or the path to a BAM file. } \item{shift, width, weight}{ See \code{coverage} method for \link[GenomicRanges]{GRanges} objects in the \pkg{GenomicRanges} package. } \item{method}{ See \code{?\link[IRanges]{coverage}} in the \pkg{IRanges} package for a description of this argument. } \item{drop.D.ranges}{ Whether the coverage calculation should ignore ranges corresponding to D (deletion) in the CIGAR string. } \item{...}{ Additional arguments passed to the \code{coverage} method for \link{GAlignments} objects. } \item{param}{ An optional \link[Rsamtools]{ScanBamParam} object passed to \code{\link{readGAlignments}}. } \item{yieldSize}{ An optional argument controlling how many records are input when iterating through a \link[Rsamtools]{BamFile}. } } \details{ The methods for \link{GAlignments} and \link{GAlignmentPairs} objects do: \preformatted{ coverage(grglist(x, drop.D.ranges=drop.D.ranges), ...) } The method for \link{GAlignmentsList} objects does: \preformatted{ coverage(unlist(x), ...) } The method for \link[Rsamtools]{BamFile} objects iterates through a BAM file, reading \code{yieldSize(x)} records (or all records, if \code{is.na(yieldSize(x))}) and calculating: \preformatted{ gal <- readGAlignments(x, param=param) coverage(gal, shift=shift, width=width, weight=weight, ...) } The method for \code{character} vectors of length 1 creates a \link[Rsamtools]{BamFile} object from \code{x} and performs the calculation for \code{coverage,BamFile-method}. } \value{ A named \link[IRanges]{RleList} object with one coverage vector per seqlevel in \code{x}. } \seealso{ \itemize{ \item \code{\link[IRanges]{coverage}} in the \pkg{IRanges} package. \item \link[GenomicRanges]{coverage-methods} in the \pkg{GenomicRanges} package. \item \link[IRanges]{RleList} objects in the \pkg{IRanges} package. \item \link{GAlignments} and \link{GAlignmentPairs} objects. \item \code{\link{readGAlignments}}. \item \link[Rsamtools]{BamFile} objects in the \pkg{Rsamtools} package. } } \examples{ ## --------------------------------------------------------------------- ## A. EXAMPLE WITH TOY DATA ## --------------------------------------------------------------------- ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") ## Coverage of a GAlignments object: gal <- readGAlignments(ex1_file) cvg1 <- coverage(gal) cvg1 ## Coverage of a GAlignmentPairs object: galp <- readGAlignmentPairs(ex1_file) cvg2 <- coverage(galp) cvg2 ## Coverage of a GAlignmentsList object: galist <- readGAlignmentsList(ex1_file) cvg3 <- coverage(galist) cvg3 table(mcols(galist)$mate_status) mated_idx <- which(mcols(galist)$mate_status == "mated") mated_galist <- galist[mated_idx] mated_cvg3 <- coverage(mated_galist) mated_cvg3 ## Sanity checks: stopifnot(identical(cvg1, cvg3)) stopifnot(identical( cvg2, mated_cvg3)) ## --------------------------------------------------------------------- ## B. EXAMPLE WITH REAL DATA ## --------------------------------------------------------------------- library(pasillaBamSubset) ## See '?pasillaBamSubset' for more information about the 2 BAM files ## included in this package. reads <- readGAlignments(untreated3_chr4()) table(njunc(reads)) # data contains junction reads ## Junctions do NOT contribute to the coverage: read1 <- reads[which(njunc(reads) != 0L)[1]] # 1st read with a junction read1 # cigar shows a "skipped region" of length 15306 grglist(read1)[[1]] # the junction is between pos 4500 and 19807 coverage(read1)$chr4 # junction is not covered ## Sanity checks: cvg <- coverage(reads) read_chunks <- unlist(grglist(reads), use.names=FALSE) read_chunks_per_chrom <- split(read_chunks, seqnames(read_chunks)) stopifnot(identical(sum(cvg), sum(width(read_chunks_per_chrom)))) galist <- readGAlignmentsList(untreated3_chr4()) stopifnot(identical(cvg, coverage(galist))) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/encodeOverlaps-methods.Rd0000644000175200017520000002135414516004601022655 0ustar00biocbuildbiocbuild\name{encodeOverlaps-methods} \alias{encodeOverlaps-methods} \alias{encodeOverlaps} \alias{encodeOverlaps,IntegerRangesList,IntegerRangesList-method} \alias{encodeOverlaps,IntegerRangesList,IntegerRanges-method} \alias{encodeOverlaps,IntegerRanges,IntegerRangesList-method} \alias{encodeOverlaps1} \alias{flipQuery} \alias{encodeOverlaps,GRangesList,GRangesList-method} \alias{selectEncodingWithCompatibleStrand} \alias{isCompatibleWithSkippedExons} \alias{isCompatibleWithSkippedExons,character-method} \alias{isCompatibleWithSkippedExons,factor-method} \alias{isCompatibleWithSkippedExons,OverlapEncodings-method} \alias{extractSteppedExonRanks} \alias{extractSteppedExonRanks,character-method} \alias{extractSteppedExonRanks,factor-method} \alias{extractSteppedExonRanks,OverlapEncodings-method} \alias{extractSpannedExonRanks} \alias{extractSpannedExonRanks,character-method} \alias{extractSpannedExonRanks,factor-method} \alias{extractSpannedExonRanks,OverlapEncodings-method} \alias{extractSkippedExonRanks} \alias{extractSkippedExonRanks,character-method} \alias{extractSkippedExonRanks,factor-method} \alias{extractSkippedExonRanks,OverlapEncodings-method} \alias{extractQueryStartInTranscript} \title{Encode the overlaps between RNA-seq reads and the transcripts of a gene model} \description{ In the context of an RNA-seq experiment, encoding the overlaps between the aligned reads and the transcripts of a given gene model can be used for detecting those overlaps that are \emph{compatible} with the splicing of the transcript. The central tool for this is the \code{encodeOverlaps} method for \link[GenomicRanges]{GRangesList} objects, which computes the "overlap encodings" between a \code{query} and a \code{subject}, both list-like objects with list elements containing multiple ranges. Other related utilities are also documented in this man page. } \usage{ encodeOverlaps(query, subject, hits=NULL, ...) \S4method{encodeOverlaps}{GRangesList,GRangesList}(query, subject, hits=NULL, flip.query.if.wrong.strand=FALSE) ## Related utilities: flipQuery(x, i) selectEncodingWithCompatibleStrand(ovencA, ovencB, query.strand, subject.strand, hits=NULL) isCompatibleWithSkippedExons(x, max.skipped.exons=NA) extractSteppedExonRanks(x, for.query.right.end=FALSE) extractSpannedExonRanks(x, for.query.right.end=FALSE) extractSkippedExonRanks(x, for.query.right.end=FALSE) extractQueryStartInTranscript(query, subject, hits=NULL, ovenc=NULL, flip.query.if.wrong.strand=FALSE, for.query.right.end=FALSE) } \arguments{ \item{query, subject}{ Typically \link[GenomicRanges]{GRangesList} objects representing the the aligned reads and the transcripts of a given gene model, respectively. If the 2 objects don't have the same length, and if the \code{hits} argument is not supplied, then the shortest is recycled to the length of the longest (the standard recycling rules apply). More generally speaking, \code{query} and \code{subject} must be list-like objects with list elements containing multiple ranges e.g. \link[IRanges]{IntegerRangesList} or \link[GenomicRanges]{GRangesList} objects. } \item{hits}{ An optional \link[S4Vectors]{Hits} object typically obtained from a previous call to \code{\link[IRanges]{findOverlaps}(query, subject)}. Strictly speaking, \code{hits} only needs to be compatible with \code{query} and \code{subject}, that is, \code{\link[S4Vectors]{queryLength}(hits)} and \code{\link[S4Vectors]{subjectLength}(hits)} must be equal to \code{length(query)} and \code{length(subject)}, respectively. Supplying \code{hits} is a convenient way to do \code{encodeOverlaps(query[queryHits(hits)], subject[subjectHits(hits)])}, that is, calling \code{encodeOverlaps(query, subject, hits)} is equivalent to the above, but is much more efficient, especially when \code{query} and/or \code{subject} are big. Of course, when \code{hits} is supplied, \code{query} and \code{subject} are not expected to have the same length anymore. } \item{...}{ Additional arguments for methods. } \item{flip.query.if.wrong.strand}{ See the "OverlapEncodings" vignette located in this package (\pkg{GenomicAlignments}). } \item{x}{ For \code{flipQuery}: a \link[GenomicRanges]{GRangesList} object. For \code{isCompatibleWithSkippedExons}, \code{extractSteppedExonRanks}, \code{extractSpannedExonRanks}, and \code{extractSkippedExonRanks}: an \link{OverlapEncodings} object, a factor, or a character vector. } \item{i}{ Subscript specifying the elements in \code{x} to flip. If missing, all the elements are flipped. } \item{ovencA, ovencB, ovenc}{ \link{OverlapEncodings} objects. } \item{query.strand, subject.strand}{ Vector-like objects containing the strand of the query and subject, respectively. } \item{max.skipped.exons}{ Not supported yet. If \code{NA} (the default), the number of skipped exons must be 1 or more (there is no max). } \item{for.query.right.end}{ If \code{TRUE}, then the information reported in the output is for the right ends of the paired-end reads. Using \code{for.query.right.end=TRUE} with single-end reads is an error. } } \details{ See \code{?OverlapEncodings} for a short introduction to "overlap encodings". The topic of working with overlap encodings is covered in details in the "OverlapEncodings" vignette located this package (\pkg{GenomicAlignments}) and accessible with \code{vignette("OverlapEncodings")}. } \value{ For \code{encodeOverlaps}: An \link{OverlapEncodings} object. If \code{hits} is not supplied, this object is \emph{parallel} to the longest of \code{query} and \code{subject}, that is, it has the length of the longest and the i-th encoding in it corresponds to the i-th element in the longest. If \code{hits} is supplied, then the returned object is \emph{parallel} to it, that is, it has one encoding per hit. For \code{flipQuery}: TODO For \code{selectEncodingWithCompatibleStrand}: TODO For \code{isCompatibleWithSkippedExons}: A logical vector \emph{parallel} to \code{x}. For \code{extractSteppedExonRanks}, \code{extractSpannedExonRanks}, and \code{extractSkippedExonRanks}: TODO For \code{extractQueryStartInTranscript}: TODO } \author{Hervé Pagès} \seealso{ \itemize{ \item The \link{OverlapEncodings} class for a brief introduction to "overlap encodings". \item The \link[S4Vectors]{Hits} class defined and documented in the \pkg{S4Vectors} package. \item The "OverlapEncodings" vignette in this package. \item \code{\link{findCompatibleOverlaps}} for a specialized version of \code{\link[IRanges]{findOverlaps}} that uses \code{encodeOverlaps} internally to keep only the hits where the junctions in the aligned read are \emph{compatible} with the splicing of the annotated transcript. \item The \link[GenomicRanges]{GRangesList} class defined and documented in the \pkg{GenomicRanges} package. \item The \code{\link[IRanges]{findOverlaps}} generic function defined in the \pkg{IRanges} package. } } \examples{ ## --------------------------------------------------------------------- ## A. BETWEEN 2 IntegerRangesList OBJECTS ## --------------------------------------------------------------------- ## In the context of an RNA-seq experiment, encoding the overlaps ## between 2 GRangesList objects, one containing the reads (the query), ## and one containing the transcripts (the subject), can be used for ## detecting hits between reads and transcripts that are "compatible" ## with the splicing of the transcript. Here we illustrate this with 2 ## IntegerRangesList objects, in order to keep things simple: ## 4 aligned reads in the query: read1 <- IRanges(c(7, 15, 22), c(9, 19, 23)) # 2 junctions read2 <- IRanges(c(5, 15), c(9, 17)) # 1 junction read3 <- IRanges(c(16, 22), c(19, 24)) # 1 junction read4 <- IRanges(c(16, 23), c(19, 24)) # 1 junction query <- IRangesList(read1, read2, read3, read4) ## 1 transcript in the subject: tx <- IRanges(c(1, 4, 15, 22, 38), c(2, 9, 19, 25, 47)) # 5 exons subject <- IRangesList(tx) ## Encode the overlaps: ovenc <- encodeOverlaps(query, subject) ovenc encoding(ovenc) ## --------------------------------------------------------------------- ## B. BETWEEN 2 GRangesList OBJECTS ## --------------------------------------------------------------------- ## With real RNA-seq data, the reads and transcripts will typically be ## stored in GRangesList objects. Please refer to the "OverlapEncodings" ## vignette in this package for realistic examples. } \keyword{methods} \keyword{utilities} GenomicAlignments/man/findCompatibleOverlaps-methods.Rd0000644000175200017520000000756514516004601024350 0ustar00biocbuildbiocbuild\name{findCompatibleOverlaps-methods} \alias{findCompatibleOverlaps-methods} \alias{findCompatibleOverlaps} \alias{findCompatibleOverlaps,GAlignments,GRangesList-method} \alias{findCompatibleOverlaps,GAlignmentPairs,GRangesList-method} \alias{countCompatibleOverlaps} \title{Finding hits between reads and transcripts that are \emph{compatible} with the splicing of the transcript} \description{ In the context of an RNA-seq experiment, \code{findCompatibleOverlaps} (or \code{countCompatibleOverlaps}) can be used for finding (or counting) hits between reads and transcripts that are \emph{compatible} with the splicing of the transcript. } \usage{ findCompatibleOverlaps(query, subject) countCompatibleOverlaps(query, subject) } \arguments{ \item{query}{ A \link{GAlignments} or \link{GAlignmentPairs} object representing the aligned reads. } \item{subject}{ A \link{GRangesList} object representing the transcripts. } } \details{ \code{findCompatibleOverlaps} is a specialized version of \code{\link[IRanges]{findOverlaps}} that uses \code{\link{encodeOverlaps}} internally to keep only the hits where the junctions in the aligned read are \emph{compatible} with the splicing of the annotated transcript. The topic of working with overlap encodings is covered in details in the "OverlapEncodings" vignette located this package (\pkg{GenomicAlignments}) and accessible with \code{vignette("OverlapEncodings")}. } \value{ A \link[S4Vectors]{Hits} object for \code{findCompatibleOverlaps}. An integer vector \emph{parallel} to (i.e. same length as) \code{query} for \code{countCompatibleOverlaps}. } \author{Hervé Pagès} \seealso{ \itemize{ \item The \code{\link[IRanges]{findOverlaps}} generic function defined in the \pkg{IRanges} package. \item The \code{\link{encodeOverlaps}} generic function and \link{OverlapEncodings} class. \item The "OverlapEncodings" vignette in this package. \item \link{GAlignments} and \link{GAlignmentPairs} objects. \item \link[GenomicRanges]{GRangesList} objects in the \pkg{GenomicRanges} package. } } \examples{ ## Here we only show a simple example illustrating the use of ## countCompatibleOverlaps() on a very small data set. Please ## refer to the "OverlapEncodings" vignette in the GenomicAlignments ## package for a comprehensive presentation of "overlap ## encodings" and related tools/concepts (e.g. "compatible" ## overlaps, "almost compatible" overlaps etc...), and for more ## examples. ## sm_treated1.bam contains a small subset of treated1.bam, a BAM ## file containing single-end reads from the "Pasilla" experiment ## (RNA-seq, Fly, see the pasilla data package for the details) ## and aligned to reference genome BDGP Release 5 (aka dm3 genome on ## the UCSC Genome Browser): sm_treated1 <- system.file("extdata", "sm_treated1.bam", package="GenomicAlignments", mustWork=TRUE) ## Load the alignments: flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) gal <- readGAlignments(sm_treated1, use.names=TRUE, param=param0) ## Load the transcripts (IMPORTANT: Like always, the reference genome ## of the transcripts must be *exactly* the same as the reference ## genome used to align the reads): library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene exbytx <- exonsBy(txdb, by="tx", use.names=TRUE) ## Number of "compatible" transcripts per alignment in 'gal': gal_ncomptx <- countCompatibleOverlaps(gal, exbytx) mcols(gal)$ncomptx <- gal_ncomptx table(gal_ncomptx) mean(gal_ncomptx >= 1) ## --> 33% of the alignments in 'gal' are "compatible" with at least ## 1 transcript in 'exbytx'. ## Keep only alignments compatible with at least 1 transcript in ## 'exbytx': compgal <- gal[gal_ncomptx >= 1] head(compgal) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/findMateAlignment.Rd0000644000175200017520000002615314516004601021633 0ustar00biocbuildbiocbuild\name{findMateAlignment} \alias{findMateAlignment} \alias{makeGAlignmentPairs} \alias{getDumpedAlignments} \alias{countDumpedAlignments} \alias{flushDumpedAlignments} \title{Pairing the elements of a GAlignments object} \description{ Utilities for pairing the elements of a \link{GAlignments} object. NOTE: Until BioC 2.13, \code{findMateAlignment} was the power horse used by \code{\link{readGAlignmentPairs}} for pairing the records loaded from a BAM file containing aligned paired-end reads. Starting with BioC 2.14, \code{\link{readGAlignmentPairs}} relies on \code{\link[Rsamtools]{scanBam}(BamFile(asMates=TRUE), ...)} for the pairing. } \usage{ findMateAlignment(x) makeGAlignmentPairs(x, use.names=FALSE, use.mcols=FALSE, strandMode=1) ## Related low-level utilities: getDumpedAlignments() countDumpedAlignments() flushDumpedAlignments() } \arguments{ \item{x}{ A named \link{GAlignments} object with metadata columns \code{flag}, \code{mrnm}, and \code{mpos}. Typically obtained by loading aligned paired-end reads from a BAM file with: \preformatted{ param <- ScanBamParam(what=c("flag", "mrnm", "mpos")) x <- readGAlignments(..., use.names=TRUE, param=param) } } \item{use.names}{ Whether the names on the input object should be propagated to the returned object or not. } \item{use.mcols}{ Names of the metadata columns to propagate to the returned \link{GAlignmentPairs} object. } \item{strandMode}{ Strand mode to set on the returned \link{GAlignmentPairs} object. See \code{?\link{strandMode}} for more information. } } \details{ \subsection{Pairing algorithm used by findMateAlignment}{ \code{findMateAlignment} is the power horse used by \code{makeGAlignmentPairs} for pairing the records loaded from a BAM file containing aligned paired-end reads. It implements the following pairing algorithm: \itemize{ \item First, only records with flag bit 0x1 (multiple segments) set to 1, flag bit 0x4 (segment unmapped) set to 0, and flag bit 0x8 (next segment in the template unmapped) set to 0, are candidates for pairing (see the SAM Spec for a description of flag bits and fields). \code{findMateAlignment} will ignore any other record. That is, records that correspond to single-end reads, or records that correspond to paired-end reads where one or both ends are unmapped, are discarded. \item Then the algorithm looks at the following fields and flag bits: \itemize{ \item (A) QNAME \item (B) RNAME, RNEXT \item (C) POS, PNEXT \item (D) Flag bits Ox10 (segment aligned to minus strand) and 0x20 (next segment aligned to minus strand) \item (E) Flag bits 0x40 (first segment in template) and 0x80 (last segment in template) \item (F) Flag bit 0x2 (proper pair) \item (G) Flag bit 0x100 (secondary alignment) } 2 records rec1 and rec2 are considered mates iff all the following conditions are satisfied: \itemize{ \item (A) QNAME(rec1) == QNAME(rec2) \item (B) RNEXT(rec1) == RNAME(rec2) and RNEXT(rec2) == RNAME(rec1) \item (C) PNEXT(rec1) == POS(rec2) and PNEXT(rec2) == POS(rec1) \item (D) Flag bit 0x20 of rec1 == Flag bit 0x10 of rec2 and Flag bit 0x20 of rec2 == Flag bit 0x10 of rec1 \item (E) rec1 corresponds to the first segment in the template and rec2 corresponds to the last segment in the template, OR, rec2 corresponds to the first segment in the template and rec1 corresponds to the last segment in the template \item (F) rec1 and rec2 have same flag bit 0x2 \item (G) rec1 and rec2 have same flag bit 0x100 } } } \subsection{Timing and memory requirement of the pairing algorithm}{ The estimated timings and memory requirements on a modern Linux system are (those numbers may vary depending on your hardware and OS): \preformatted{ nb of alignments | time | required memory -----------------+--------------+---------------- 8 millions | 28 sec | 1.4 GB 16 millions | 58 sec | 2.8 GB 32 millions | 2 min | 5.6 GB 64 millions | 4 min 30 sec | 11.2 GB } This is for a \link{GAlignments} object coming from a file with an "average nb of records per unique QNAME" of 2.04. A value of 2 (which means the file contains only primary reads) is optimal for the pairing algorithm. A greater value, say > 3, will significantly degrade its performance. An easy way to avoid this degradation is to load only primary alignments by setting the \code{isSecondaryAlignment} flag to \code{FALSE} in ScanBamParam(). See examples in \code{?\link{readGAlignmentPairs}} for how to do this. } \subsection{Ambiguous pairing}{ The above algorithm will find almost all pairs unambiguously, even when the same pair of reads maps to several places in the genome. Note that, when a given pair maps to a single place in the genome, looking at (A) is enough to pair the 2 corresponding records. The additional conditions (B), (C), (D), (E), (F), and (G), are only here to help in the situation where more than 2 records share the same QNAME. And that works most of the times. Unfortunately there are still situations where this is not enough to solve the pairing problem unambiguously. For example, here are 4 records (loaded in a GAlignments object) that cannot be paired with the above algorithm: Showing the 4 records as a GAlignments object of length 4: \preformatted{ GAlignments with 4 alignments and 2 metadata columns: seqnames strand cigar qwidth start end SRR031714.2658602 chr2R + 21M384N16M 37 6983850 6984270 SRR031714.2658602 chr2R + 21M384N16M 37 6983850 6984270 SRR031714.2658602 chr2R - 13M372N24M 37 6983858 6984266 SRR031714.2658602 chr2R - 13M378N24M 37 6983858 6984272 width njunc | mrnm mpos | SRR031714.2658602 421 1 | chr2R 6983858 SRR031714.2658602 421 1 | chr2R 6983858 SRR031714.2658602 409 1 | chr2R 6983850 SRR031714.2658602 415 1 | chr2R 6983850 } Note that the BAM fields show up in the following columns: \itemize{ \item QNAME: the names of the GAlignments object (unnamed col) \item RNAME: the seqnames col \item POS: the start col \item RNEXT: the mrnm col \item PNEXT: the mpos col } As you can see, the aligner has aligned the same pair to the same location twice! The only difference between the 2 aligned pairs is in the CIGAR i.e. one end of the pair is aligned twice to the same location with exactly the same CIGAR while the other end of the pair is aligned twice to the same location but with slightly different CIGARs. Now showing the corresponding flag bits: \preformatted{ isPaired isProperPair isUnmappedQuery hasUnmappedMate isMinusStrand [1,] 1 1 0 0 0 [2,] 1 1 0 0 0 [3,] 1 1 0 0 1 [4,] 1 1 0 0 1 isMateMinusStrand isFirstMateRead isSecondMateRead isSecondaryAlignment [1,] 1 0 1 0 [2,] 1 0 1 0 [3,] 0 1 0 0 [4,] 0 1 0 0 isNotPassingQualityControls isDuplicate [1,] 0 0 [2,] 0 0 [3,] 0 0 [4,] 0 0 } As you can see, rec(1) and rec(2) are second mates, rec(3) and rec(4) are both first mates. But looking at (A), (B), (C), (D), (E), (F), and (G), the pairs could be rec(1) <-> rec(3) and rec(2) <-> rec(4), or they could be rec(1) <-> rec(4) and rec(2) <-> rec(3). There is no way to disambiguate! So \code{findMateAlignment} is just ignoring (with a warning) those alignments with ambiguous pairing, and dumping them in a place from which they can be retrieved later (i.e. after \code{findMateAlignment} has returned) for further examination (see "Dumped alignments" subsection below for the details). In other words, alignments that cannot be paired unambiguously are not paired at all. Concretely, this means that \code{\link{readGAlignmentPairs}} is guaranteed to return a \link{GAlignmentPairs} object where every pair was formed in an non-ambiguous way. Note that, in practice, this approach doesn't seem to leave aside a lot of records because ambiguous pairing events seem pretty rare. } \subsection{Dumped alignments}{ Alignments with ambiguous pairing are dumped in a place ("the dump environment") from which they can be retrieved with \code{getDumpedAlignments()} after \code{findMateAlignment} has returned. Two additional utilities are provided for manipulation of the dumped alignments: \code{countDumpedAlignments} for counting them (a fast equivalent to \code{length(getDumpedAlignments())}), and \code{flushDumpedAlignments} to flush "the dump environment". Note that "the dump environment" is automatically flushed at the beginning of a call to \code{findMateAlignment}. } } \value{ For \code{findMateAlignment}: An integer vector of the same length as \code{x}, containing only positive or NA values, where the i-th element is interpreted as follow: \itemize{ \item An NA value means that no mate or more than 1 mate was found for \code{x[i]}. \item A non-NA value j gives the index in \code{x} of \code{x[i]}'s mate. } For \code{makeGAlignmentPairs}: A \link{GAlignmentPairs} object where the pairs are formed internally by calling \code{findMateAlignment} on \code{x}. For \code{getDumpedAlignments}: \code{NULL} or a \link{GAlignments} object containing the dumped alignments. See "Dumped alignments" subsection in the "Details" section above for the details. For \code{countDumpedAlignments}: The number of dumped alignments. Nothing for \code{flushDumpedAlignments}. } \author{Hervé Pagès} \seealso{ \itemize{ \item \link{GAlignments} and \link{GAlignmentPairs} objects. \item \code{\link{readGAlignments}} and \code{\link{readGAlignmentPairs}}. } } \examples{ bamfile <- system.file("extdata", "ex1.bam", package="Rsamtools", mustWork=TRUE) param <- ScanBamParam(what=c("flag", "mrnm", "mpos")) x <- readGAlignments(bamfile, use.names=TRUE, param=param) mate <- findMateAlignment(x) head(mate) table(is.na(mate)) galp0 <- makeGAlignmentPairs(x) galp <- makeGAlignmentPairs(x, use.name=TRUE, use.mcols="flag") galp colnames(mcols(galp)) colnames(mcols(first(galp))) colnames(mcols(last(galp))) } \keyword{manip} GenomicAlignments/man/findOverlaps-methods.Rd0000644000175200017520000001021114516004601022326 0ustar00biocbuildbiocbuild\name{findOverlaps-methods} \alias{findOverlaps-methods} \alias{findOverlaps} \alias{findOverlaps,GAlignments,Vector-method} \alias{findOverlaps,Vector,GAlignments-method} \alias{findOverlaps,GAlignments,GAlignments-method} \alias{findOverlaps,GAlignmentPairs,Vector-method} \alias{findOverlaps,Vector,GAlignmentPairs-method} \alias{findOverlaps,GAlignmentPairs,GAlignmentPairs-method} \alias{findOverlaps,GAlignmentsList,Vector-method} \alias{findOverlaps,Vector,GAlignmentsList-method} \alias{findOverlaps,GAlignmentsList,GAlignmentsList-method} \title{Finding overlapping genomic alignments} \description{ Finds range overlaps between a \link{GAlignments}, \link{GAlignmentPairs}, or \link{GAlignmentsList} object, and another range-based object. NOTE: The \code{\link[IRanges]{findOverlaps}} generic function and methods for \link[IRanges]{IntegerRanges} and \link[IRanges]{IntegerRangesList} objects are defined and documented in the \pkg{IRanges} package. The methods for \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} objects are defined and documented in the \pkg{GenomicRanges} package. \link{GAlignments}, \link{GAlignmentPairs}, and \link{GAlignmentsList} objects also support \code{countOverlaps}, \code{overlapsAny}, and \code{subsetByOverlaps} thanks to the default methods defined in the \pkg{IRanges} package and to the \code{findOverlaps} method defined in this package and documented below. } \usage{ \S4method{findOverlaps}{GAlignments,GAlignments}(query, subject, maxgap=-1L, minoverlap=0L, type=c("any", "start", "end", "within"), select=c("all", "first", "last", "arbitrary"), ignore.strand=FALSE) } \arguments{ \item{query, subject}{ A \link{GAlignments}, \link{GAlignmentPairs}, or \link{GAlignmentsList} object for either \code{query} or \code{subject}. A vector-like object containing ranges for the other one. } \item{maxgap, minoverlap, type, select}{ See \code{?\link[IRanges]{findOverlaps}} in the \pkg{IRanges} package for a description of these arguments. } \item{ignore.strand}{ When set to \code{TRUE}, the strand information is ignored in the overlap calculations. } } \details{ When the query or the subject (or both) is a \link{GAlignments} object, it is first turned into a \link{GRangesList} object (with \code{as( , "GRangesList")}) and then the rules described previously apply. \link{GAlignmentsList} objects are coerced to \link{GAlignments} then to a \link{GRangesList}. Feature indices are mapped back to the original \link{GAlignmentsList} list elements. When the query is a \link{GAlignmentPairs} object, it is first turned into a \link{GRangesList} object (with \code{as( , "GRangesList")}) and then the rules described previously apply. } \value{ A \link[S4Vectors]{Hits} object when \code{select="all"} or an integer vector otherwise. } \seealso{ \itemize{ \item \code{\link[IRanges]{findOverlaps}}. \item \link[S4Vectors]{Hits-class}. \item \link{GRanges-class}. \item \link{GRangesList-class}. \item \link{GAlignments-class}. \item \link{GAlignmentPairs-class}. \item \link{GAlignmentsList-class}. } } \examples{ ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") galn <- readGAlignments(ex1_file) subject <- granges(galn)[1] ## Note the absence of query no. 9 (i.e. 'galn[9]') in this result: as.matrix(findOverlaps(galn, subject)) ## This is because, by default, findOverlaps()/countOverlaps() are ## strand specific: galn[8:10] countOverlaps(galn[8:10], subject) countOverlaps(galn[8:10], subject, ignore.strand=TRUE) ## Count alignments in 'galn' that DO overlap with 'subject' vs those ## that do NOT: table(overlapsAny(galn, subject)) ## Extract those that DO: subsetByOverlaps(galn, subject) ## GAlignmentsList galist <- GAlignmentsList(galn[8:10], galn[3000:3002]) gr <- GRanges(c("seq1", "seq1", "seq2"), IRanges(c(15, 18, 1233), width=1), strand=c("-", "+", "+")) countOverlaps(galist, gr) countOverlaps(galist, gr, ignore.strand=TRUE) findOverlaps(galist, gr) findOverlaps(galist, gr, ignore.strand=TRUE) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/findSpliceOverlaps-methods.Rd0000644000175200017520000001523014516004601023474 0ustar00biocbuildbiocbuild\name{findSpliceOverlaps-methods} \alias{findSpliceOverlaps-methods} \alias{findSpliceOverlaps} \alias{findSpliceOverlaps,GRangesList,GRangesList-method} \alias{findSpliceOverlaps,GAlignments,GRangesList-method} \alias{findSpliceOverlaps,GAlignmentPairs,GRangesList-method} \alias{findSpliceOverlaps,character,ANY-method} \alias{findSpliceOverlaps,BamFile,ANY-method} \title{Classify ranges (reads) as compatible with existing genomic annotations or as having novel splice events} \description{ The \code{findSpliceOverlaps} function identifies ranges (reads) that are compatible with a specific transcript isoform. The non-compatible ranges are analyzed for the presence of novel splice events. } \usage{ findSpliceOverlaps(query, subject, ignore.strand=FALSE, ...) \S4method{findSpliceOverlaps}{GRangesList,GRangesList}(query, subject, ignore.strand=FALSE, ..., cds=NULL) \S4method{findSpliceOverlaps}{GAlignments,GRangesList}(query, subject, ignore.strand=FALSE, ..., cds=NULL) \S4method{findSpliceOverlaps}{GAlignmentPairs,GRangesList}(query, subject, ignore.strand=FALSE, ..., cds=NULL) \S4method{findSpliceOverlaps}{BamFile,ANY}(query, subject, ignore.strand=FALSE, ..., param=ScanBamParam(), singleEnd=TRUE) } \arguments{ \item{query}{ A \link[GenomicRanges]{GRangesList}, \link{GAlignments}, \link{GAlignmentPairs}, or \link[Rsamtools]{BamFile} object containing the reads. Can also be a single string containing the path to a BAM file. Single or paired-end reads are specified with the \code{singleEnd} argument (default FALSE). Paired-end reads can be supplied in a BAM file or \link{GAlignmentPairs} object. Single-end are expected to be in a BAM file, \link{GAlignments} or \link[GenomicRanges]{GRanges} object. } \item{subject}{ A \link[GenomicRanges]{GRangesList} containing the annotations. This list is expected to contain exons grouped by transcripts. } \item{ignore.strand}{ When set to \code{TRUE}, strand information is ignored in the overlap calculations. } \item{...}{ Additional arguments such as \code{param} and \code{singleEnd} used in the method for \link[Rsamtools]{BamFile} objects. See below. } \item{cds}{ Optional \link[GenomicRanges]{GRangesList} of coding regions for each transcript in the \code{subject}. If provided, the "coding" output column will be a \code{logical} vector indicating if the read falls in a coding region. When not provided, the "coding" output is \code{NA}. } \item{param}{ An optional \code{\link[Rsamtools]{ScanBamParam}} instance to further influence scanning, counting, or filtering. } \item{singleEnd}{ A logical value indicating if reads are single or paired-end. See \code{\link{summarizeOverlaps}} for more information. } } \details{ When a read maps compatibly and uniquely to a transcript isoform we can quantify the expression and look for shifts in the balance of isoform expression. If a read does not map in compatible way, novel splice events such as splice junctions, novel exons or retentions can be quantified and compared across samples. \code{findSpliceOverlaps} detects which reads (query) match to transcripts (subject) in a compatible fashion. Compatibility is based on both the transcript bounds and splicing pattern. Assessing the splicing pattern involves comparision of the read splices (i.e., the N operations in the CIGAR) with the transcript introns. For paired-end reads, the inter-read gap is not considered a splice junction. The analysis of non-compatible reads for novel splice events is under construction. } \value{ The output is a \link[S4Vectors]{Hits} object with the metadata columns defined below. Each column is a \code{logical} indicating if the read (query) met the criteria. \itemize{ \item{compatible: }{Every splice (N) in a read alignment matches an intron in an annotated transcript. The read does not extend into an intron or outside the transcript bounds. } \item{unique: }{The read is compatible with only one annotated transcript. } \item{strandSpecific: }{The query (read) was stranded. } } } \note{ WARNING: The current implementation of \code{findSpliceOverlaps} doesn't work properly on paired-end reads where the 2 ends overlap! } \author{Michael Lawrence and Valerie Obenchain} \seealso{ \itemize{ \item \link[GenomicRanges]{GRangesList} objects in the \pkg{GenomicRanges} package. \item \link{GAlignments} and \link{GAlignmentPairs} objects. \item \link[Rsamtools]{BamFile} objects in the \pkg{Rsamtools} package. } } \examples{ ## ----------------------------------------------------------------------- ## Isoform expression : ## ----------------------------------------------------------------------- ## findSpliceOverlaps() can assist in quantifying isoform expression ## by identifying reads that map compatibly and uniquely to a ## transcript isoform. library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) library(pasillaBamSubset) se <- untreated1_chr4() ## single-end reads txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene exbytx <- exonsBy(txdb, "tx") cdsbytx <- cdsBy(txdb, "tx") param <- ScanBamParam(which=GRanges("chr4", IRanges(1e5,3e5))) sehits <- findSpliceOverlaps(se, exbytx, cds=cdsbytx, param=param) ## Tally the reads by category to get an idea of read distribution. lst <- lapply(mcols(sehits), table) nms <- names(lst) %in% c("compatible", "unique") tbl <- do.call(rbind, lst[nms]) tbl ## Reads compatible with one or more transcript isoforms. rnms <- rownames(tbl) tbl[rnms == "compatible","TRUE"]/sum(tbl[rnms == "compatible",]) ## Reads compatible with a single isoform. tbl[rnms == "unique","TRUE"]/sum(tbl[rnms == "unique",]) ## All reads fall in a coding region as defined by ## the txdb annotation. lst[["coding"]] ## Check : Total number of reads should be the same across categories. lapply(lst, sum) ## ----------------------------------------------------------------------- ## Paired-end reads : ## ----------------------------------------------------------------------- ## 'singleEnd' is set to FALSE for a BAM file with paired-end reads. pe <- untreated3_chr4() hits2 <- findSpliceOverlaps(pe, exbytx, singleEnd=FALSE, param=param) ## In addition to BAM files, paired-end reads can be supplied in a ## GAlignmentPairs object. genes <- GRangesList( GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+"), GRanges("chr1", IRanges(c(5, 22), c(15, 25)), "+")) galp <- GAlignmentPairs( GAlignments("chr1", 5L, "11M4N6M", strand("+")), GAlignments("chr1", 50L, "6M", strand("-"))) findSpliceOverlaps(galp, genes) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/intra-range-methods.Rd0000644000175200017520000001053514516004601022112 0ustar00biocbuildbiocbuild\name{intra-range-methods} \alias{intra-range-methods} \alias{windows,GAlignments-method} \alias{narrow,GappedReads-method} \alias{qnarrow} \alias{qnarrow,GAlignments-method} \alias{qnarrow,GAlignmentsList-method} \alias{qnarrow,GappedReads-method} \title{Intra range transformations of a GAlignments or GAlignmentsList object} \description{ This man page documents intra range transformations of a \link{GAlignments} or \link{GAlignmentsList} object. See \code{?`\link[IRanges]{intra-range-methods}`} and \code{?`\link[IRanges]{inter-range-methods}`} in the \pkg{IRanges} package for a quick introduction to intra range and inter range transformations. Intra range methods for \link{GRanges} and \link{GRangesList} objects are defined and documented in the \pkg{GenomicRanges} package. } \usage{ \S4method{qnarrow}{GAlignments}(x, start=NA, end=NA, width=NA) \S4method{qnarrow}{GAlignmentsList}(x, start=NA, end=NA, width=NA) } \arguments{ \item{x}{ A \link{GAlignments} or \link{GAlignmentsList} object. } \item{start, end, width}{ Vectors of integers. NAs and negative values are accepted and "solved" according to the rules of the SEW (Start/End/Width) interface (see \code{?\link[IRanges]{solveUserSEW}} for more information about the SEW interface). See \code{?`\link[IRanges]{intra-range-methods}`} for more information about the \code{start}, \code{end}, and \code{width} arguments. } } \details{ \itemize{ \item(){ \code{qnarrow} on a \link{GAlignments} object behaves like \code{narrow} except that the \code{start}/\code{end}/\code{width} arguments here specify the narrowing with respect to the query sequences instead of the reference sequences. \code{qnarrow} on a \link{GAlignmentsList} object returns a \link{GAlignmentsList} object. } } } \value{ An object of the same class as -- and \emph{parallel} to (i.e. same length and names as) -- the original object \code{x}. } \note{ There is no difference between \code{narrow} and \code{qnarrow} when all the alignments have a simple CIGAR (i.e. no indels or junctions). } \author{Hervé Pagès and Valerie Obenchain} \seealso{ \itemize{ \item \link{GAlignments} and \link{GAlignmentsList} objects. \item The \link[IRanges]{intra-range-methods} man page in the \pkg{IRanges} package. \item The \link[GenomicRanges]{intra-range-methods} man page in the \pkg{GenomicRanges} package. } } \examples{ ## --------------------------------------------------------------------- ## A. ON A GAlignments OBJECT ## --------------------------------------------------------------------- ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") param <- ScanBamParam(what=c("seq", "qual")) gal <- readGAlignments(ex1_file, param=param) gal ## This trims 3 nucleotides on the left and 5 nucleotides on the right ## of each alignment: gal2 <- qnarrow(gal, start=4, end=-6) gal2 ## Note that the 'start' and 'end' values are relative to the query ## sequences and specify the query substring that must be kept for each ## alignment. Negative values are relative to the right end of the query ## sequence. ## Also note that the metadata columns on 'gal' are propagated as-is so ## the "seq" and "qual" matadata columns must be adjusted "by hand" with ## narrow(); mcols(gal2)$seq <- narrow(mcols(gal)$seq, start=4, end=-6) mcols(gal2)$qual <- narrow(mcols(gal)$qual, start=4, end=-6) gal2 ## Sanity checks: stopifnot(identical(qwidth(gal2), width(mcols(gal2)$seq))) stopifnot(identical(qwidth(gal2), width(mcols(gal2)$qual))) ## --------------------------------------------------------------------- ## B. ON A GAlignmentsList OBJECT ## --------------------------------------------------------------------- gal1 <- GAlignments( seqnames=Rle(factor(c("chr1", "chr2", "chr1", "chr3")), c(1, 3, 2, 4)), pos=1:10, cigar=paste0(10:1, "M"), strand=Rle(strand(c("-", "+", "*", "+", "-")), c(1, 2, 2, 3, 2)), names=head(letters, 10), score=1:10) gal2 <- GAlignments( seqnames=Rle(factor(c("chr2", "chr4")), c(3, 4)), pos=1:7, cigar=c("5M", "3M2N3M2N3M", "5M", "10M", "5M1N4M", "8M2N1M", "5M"), strand=Rle(strand(c("-", "+")), c(4, 3)), names=tail(letters, 7), score=1:7) galist <- GAlignmentsList(noGaps=gal1, Gaps=gal2) galist qnarrow(galist) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/junctions-methods.Rd0000644000175200017520000004245714516004601021727 0ustar00biocbuildbiocbuild\name{junctions-methods} \alias{junctions-methods} \alias{junctions} \alias{junctions,GAlignments-method} \alias{junctions,GAlignmentPairs-method} \alias{junctions,GAlignmentsList-method} \alias{NATURAL_INTRON_MOTIFS} \alias{summarizeJunctions} \alias{readTopHatJunctions} \alias{readSTARJunctions} \title{Extract junctions from genomic alignments} \description{ Given an object \code{x} containing genomic alignments (e.g. a \link{GAlignments}, \link{GAlignmentPairs}, or \link{GAlignmentsList} object), \code{junctions(x)} extracts the junctions from it and \code{summarizeJunctions(x)} extracts and summarizes them. \code{readTopHatJunctions} and \code{readSTARJunctions} are utilities for importing the junction file generated by the TopHat and STAR aligners, respectively. } \usage{ ## junctions() generic and methods ## ------------------------------- junctions(x, use.mcols=FALSE, ...) \S4method{junctions}{GAlignments}(x, use.mcols=FALSE) \S4method{junctions}{GAlignmentPairs}(x, use.mcols=FALSE) \S4method{junctions}{GAlignmentsList}(x, use.mcols=FALSE, ignore.strand=FALSE) ## summarizeJunctions() and NATURAL_INTRON_MOTIFS ## ---------------------------------------------- summarizeJunctions(x, with.revmap=FALSE, genome=NULL) NATURAL_INTRON_MOTIFS ## Utilities for importing the junction file generated by some aligners ## -------------------------------------------------------------------- readTopHatJunctions(file, file.is.raw.juncs=FALSE) readSTARJunctions(file) } \arguments{ \item{x}{ A \link{GAlignments}, \link{GAlignmentPairs}, or \link{GAlignmentsList} object. } \item{use.mcols}{ \code{TRUE} or \code{FALSE} (the default). Whether the metadata columns on \code{x} (accessible with \code{mcols(x)}) should be propagated to the returned object or not. } \item{...}{ Additional arguments, for use in specific methods. } \item{ignore.strand}{ \code{TRUE} or \code{FALSE} (the default). If set to \code{TRUE}, then the strand of \code{x} is set to \code{"*"} prior to any computation. } \item{with.revmap}{ \code{TRUE} or \code{FALSE} (the default). If set to \code{TRUE}, then a \code{revmap} metadata column is added to the output of \code{summarizeJunctions}. This metadata column is an \link[IRanges]{IntegerList} object representing the mapping from each element in the ouput (i.e. each junction) to the corresponding elements in the input \code{x}. } \item{genome}{ \code{NULL} (the default), or a \link[BSgenome]{BSgenome} object containing the sequences of the reference genome that was used to align the reads, or the name of this reference genome specified in a way that is accepted by the \code{\link[BSgenome]{getBSgenome}} function defined in the \pkg{BSgenome} software package. In that case the corresponding BSgenome data package needs to be already installed (see \code{?\link[BSgenome]{getBSgenome}} in the \pkg{BSgenome} package for the details). If \code{genome} is supplied, then the \code{intron_motif} and \code{intron_strand} metadata columns are computed (based on the dinucleotides found at the intron boundaries) and added to the output of \code{summarizeJunctions}. See the Value section below for a description of these metadata columns. } \item{file}{ The path (or a connection) to the junction file generated by the aligner. This file should be the \emph{junctions.bed} or \emph{new_list.juncs} file for \code{readTopHatJunctions}, and the \emph{SJ.out.tab} file for \code{readSTARJunctions}. } \item{file.is.raw.juncs}{ \code{TRUE} or \code{FALSE} (the default). If set to \code{TRUE}, then the input file is assumed to be a TopHat \emph{.juncs} file instead of the \emph{junctions.bed} file generated by TopHat. A TopHat \emph{.juncs} file can be obtained by passing the \emph{junctions.bed} file thru TopHat's \emph{bed_to_juncs} script. See the TopHat manual at \url{http://tophat.cbcb.umd.edu/manual.shtml} for more information. } } \details{ An N operation in the CIGAR of a genomic alignment is interpreted as a junction. \code{junctions(x)} will return the genomic ranges of all junctions found in \code{x}. More precisely, on a \link{GAlignments} object \code{x}, \code{junctions(x)} is equivalent to: \preformatted{ psetdiff(granges(x), grglist(x, order.as.in.query=TRUE)) } On a \link{GAlignmentPairs} object \code{x}, it's equivalent to (but faster than): \preformatted{ mendoapply(c, junctions(first(x, real.strand=TRUE)), junctions(last(x, real.strand=TRUE))) } Note that starting with BioC 3.2, the behavior of \code{junctions} on a \link{GAlignmentPairs} object has been slightly modified so that the returned ranges now have the \emph{real strand} set on them. See the documentation of the \code{real.strand} argument in the man page of \link{GAlignmentPairs} objects for more information. \code{NATURAL_INTRON_MOTIFS} is a predefined character vector containing the 5 natural intron motifs described at \url{http://www.ncbi.nlm.nih.gov/pmc/articles/PMC84117/}. } \value{ \code{junctions(x)} returns the genomic ranges of the junctions in a \link[GenomicRanges]{GRangesList} object \emph{parallel} to \code{x} (i.e. with 1 list element per element in \code{x}). If \code{x} has names on it, they're propagated to the returned object. If \code{use.mcols} is TRUE and \code{x} has metadata columns on it (accessible with \code{mcols(x)}), they're propagated to the returned object. \code{summarizeJunctions} returns the genomic ranges of the unique junctions in \code{x} in an unstranded \link[GenomicRanges]{GRanges} object with the following metadata columns: \itemize{ \item \code{score}: The total number of alignments crossing each junction, i.e. that have the junction encoded in their CIGAR. \item \code{plus_score} and \code{minus_score}: The strand-specific number of alignments crossing each junction. \item \code{revmap}: [Only if \code{with.revmap} was set to \code{TRUE}.] An \link[IRanges]{IntegerList} object representing the mapping from each element in the ouput (i.e. each junction) to the corresponding elements in input \code{x}. \item \code{intron_motif} and \code{intron_strand}: [Only if \code{genome} was supplied.] The intron motif and strand for each junction, based on the dinucleotides found in the genome sequences at the intron boundaries. The \code{intron_motif} metadata column is a factor whose levels are the 5 natural intron motifs stored in predefined character vector \code{NATURAL_INTRON_MOTIFS}. If the dinucleotides found at the intron boundaries don't match any of these natural intron motifs, then \code{intron_motif} and \code{intron_strand} are set to \code{NA} and \code{*}, respectively. } \code{readTopHatJunctions} and \code{readSTARJunctions} return the junctions reported in the input file in a stranded \link[GenomicRanges]{GRanges} object. With the following metadata columns for \code{readTopHatJunctions} (when reading in the \emph{junctions.bed} file): \itemize{ \item \code{name}: An id assigned by TopHat to each junction. This id is of the form JUNC00000017 and is unique within the \emph{junctions.bed} file. \item \code{score}: The total number of alignments crossing each junction. } With the following metadata columns for \code{readSTARJunctions}: \itemize{ \item \code{intron_motif} and \code{intron_strand}: The intron motif and strand for each junction, based on the code found in the input file (0: non-canonical, 1: GT/AG, 2: CT/AC, 3: GC/AG, 4: CT/GC, 5: AT/AC, 6: GT/AT). Note that of the 5 natural intron motifs stored in predefined character vector \code{NATURAL_INTRON_MOTIFS}, only the first 3 are assigned codes by the STAR software (2 codes per motif, one if the intron is on the plus strand and one if it's on the minus strand). Thus the \code{intron_motif} metadata column is a factor with only 3 levels. If code is 0, then \code{intron_motif} and \code{intron_strand} are set to \code{NA} and \code{*}, respectively. \item \code{um_reads}: The number of uniquely mapping reads crossing the junction (a pair where the 2 alignments cross the same junction is counted only once). \item \code{mm_reads}: The number of multi-mapping reads crossing the junction (a pair where the 2 alignments cross the same junction is counted only once). } See STAR manual at \url{https://code.google.com/p/rna-star/} for more information. } \author{Hervé Pagès} \references{ \url{http://www.ncbi.nlm.nih.gov/pmc/articles/PMC84117/} for the 5 natural intron motifs stored in predefined character vector \code{NATURAL_INTRON_MOTIFS}. TopHat2: accurate alignment of transcriptomes in the presence of insertions, deletions and gene fusions \itemize{ \item TopHat2 paper: \url{http://genomebiology.com/2013/14/4/r36} \item TopHat2 software and manual: \url{http://tophat.cbcb.umd.edu/} } STAR: ultrafast universal RNA-seq aligner \itemize{ \item STAR paper: \url{http://bioinformatics.oxfordjournals.org/content/early/2012/10/25/bioinformatics.bts635} \item STAR software and manual: \url{https://code.google.com/p/rna-star/} } } \seealso{ \itemize{ \item The \code{\link{readGAlignments}} and \code{\link{readGAlignmentPairs}} functions for reading genomic alignments from a BAM file. \item \link{GAlignments}, \link{GAlignmentPairs}, and \link{GAlignmentsList} objects. \item \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} objects implemented and documented in the \pkg{GenomicRanges} package. \item \link[IRanges]{IntegerList} objects implemented and documented in the \pkg{IRanges} package. \item The \code{\link[BSgenome]{getBSgenome}} function in the \pkg{BSgenome} package, for searching the installed BSgenome data packages for the specified genome and returning it as a \link[BSgenome]{BSgenome} object. \item The \code{\link[IRanges]{extractList}} function in the \pkg{IRanges} package, for extracting groups of elements from a vector-like object and returning them into a \link[S4Vectors]{List} object. } } \examples{ library(RNAseqData.HNRNPC.bam.chr14) bamfile <- RNAseqData.HNRNPC.bam.chr14_BAMFILES[1] ## --------------------------------------------------------------------- ## A. junctions() ## --------------------------------------------------------------------- gal <- readGAlignments(bamfile) table(njunc(gal)) # some alignments have 3 junctions! juncs <- junctions(gal) juncs stopifnot(identical(unname(elementNROWS(juncs)), njunc(gal))) galp <- readGAlignmentPairs(bamfile) juncs <- junctions(galp) juncs stopifnot(identical(unname(elementNROWS(juncs)), njunc(galp))) ## --------------------------------------------------------------------- ## B. summarizeJunctions() ## --------------------------------------------------------------------- ## By default, only the "score", "plus_score", and "minus_score" ## metadata columns are returned: junc_summary <- summarizeJunctions(gal) junc_summary ## The "score" metadata column reports the total number of alignments ## crossing each junction, i.e., that have the junction encoded in their ## CIGAR: median(mcols(junc_summary)$score) ## The "plus_score" and "minus_score" metadata columns report the ## strand-specific number of alignments crossing each junction: stopifnot(identical(mcols(junc_summary)$score, mcols(junc_summary)$plus_score + mcols(junc_summary)$minus_score)) ## If 'with.revmap' is TRUE, the "revmap" metadata column is added to ## the output. This metadata column is an IntegerList object represen- ## ting the mapping from each element in the ouput (i.e. a junction) to ## the corresponding elements in the input 'x'. Here we're going to use ## this to compute a 'score2' for each junction. We obtain this score ## by summing the mapping qualities of the alignments crossing the ## junction: gal <- readGAlignments(bamfile, param=ScanBamParam(what="mapq")) junc_summary <- summarizeJunctions(gal, with.revmap=TRUE) junc_score2 <- sum(extractList(mcols(gal)$mapq, mcols(junc_summary)$revmap)) mcols(junc_summary)$score2 <- junc_score2 ## If the name of the reference genome is specified thru the 'genome' ## argument (in which case the corresponding BSgenome data package needs ## to be installed), then summarizeJunctions() returns the intron motif ## and strand for each junction. ## Since the reads in RNAseqData.HNRNPC.bam.chr14 were aligned to ## the hg19 genome, the following requires that you have ## BSgenome.Hsapiens.UCSC.hg19 installed: junc_summary <- summarizeJunctions(gal, with.revmap=TRUE, genome="hg19") mcols(junc_summary)$score2 <- junc_score2 # putting 'score2' back ## The "intron_motif" metadata column is a factor whose levels are the ## 5 natural intron motifs stored in predefined character vector ## 'NATURAL_INTRON_MOTIFS': table(mcols(junc_summary)$intron_motif) ## --------------------------------------------------------------------- ## C. STRANDED RNA-seq PROTOCOL ## --------------------------------------------------------------------- ## Here is a simple test for checking whether the RNA-seq protocol was ## stranded or not: strandedTest <- function(plus_score, minus_score) (sum(plus_score ^ 2) + sum(minus_score ^ 2)) / sum((plus_score + minus_score) ^ 2) ## The result of this test is guaranteed to be >= 0.5 and <= 1. ## If, for each junction, the strand of the crossing alignments looks ## random (i.e. "plus_score" and "minus_score" are close), then ## strandedTest() will return a value close to 0.5. If it doesn't look ## random (i.e. for each junction, one of "plus_score" and "minus_score" ## is much bigger than the other), then strandedTest() will return a ## value close to 1. ## If the reads are single-end, the test is meaningful when applied ## directly on 'junc_summary'. However, for the test to be meaningful ## on paired-end reads, it needs to be applied on the first and last ## alignments separately: junc_summary1 <- summarizeJunctions(first(galp)) junc_summary2 <- summarizeJunctions(last(galp)) strandedTest(mcols(junc_summary1)$plus_score, mcols(junc_summary1)$minus_score) strandedTest(mcols(junc_summary2)$plus_score, mcols(junc_summary2)$minus_score) ## Both values are close to 0.5 which suggests that the RNA-seq protocol ## used for this experiment was not stranded. ## --------------------------------------------------------------------- ## D. UTILITIES FOR IMPORTING THE JUNCTION FILE GENERATED BY SOME ## ALIGNERS ## --------------------------------------------------------------------- ## The TopHat aligner generates a junctions.bed file where it reports ## all the junctions satisfying some "quality" criteria (see the TopHat ## manual at http://tophat.cbcb.umd.edu/manual.shtml for more ## information). This file can be loaded with readTopHatJunctions(): runname <- names(RNAseqData.HNRNPC.bam.chr14_BAMFILES)[1] junctions_file <- system.file("extdata", "tophat2_out", runname, "junctions.bed", package="RNAseqData.HNRNPC.bam.chr14") th_junctions <- readTopHatJunctions(junctions_file) ## Comparing the "TopHat junctions" with the result of ## summarizeJunctions(): th_junctions14 <- th_junctions seqlevels(th_junctions14, pruning.mode="coarse") <- "chr14" mcols(th_junctions14)$intron_strand <- strand(th_junctions14) strand(th_junctions14) <- "*" ## All the "TopHat junctions" are in 'junc_summary': stopifnot(all(th_junctions14 \%in\% junc_summary)) ## But not all the junctions in 'junc_summary' are reported by TopHat ## (that's because TopHat reports only junctions that satisfy some ## "quality" criteria): is_in_th_junctions14 <- junc_summary \%in\% th_junctions14 table(is_in_th_junctions14) # 32 junctions are not in TopHat's # junctions.bed file junc_summary2 <- junc_summary[is_in_th_junctions14] ## 'junc_summary2' and 'th_junctions14' contain the same junctions in ## the same order: stopifnot(all(junc_summary2 == th_junctions14)) ## Let's merge their metadata columns. We use our own version of ## merge() for this, which is stricter (it checks that the common ## columns are the same in the 2 data frames to merge) and also ## simpler: merge2 <- function(df1, df2) { common_colnames <- intersect(colnames(df1), colnames(df2)) lapply(common_colnames, function(colname) stopifnot(all(df1[ , colname] == df2[ , colname]))) extra_mcolnames <- setdiff(colnames(df2), colnames(df1)) cbind(df1, df2[ , extra_mcolnames, drop=FALSE]) } mcols(th_junctions14) <- merge2(mcols(th_junctions14), mcols(junc_summary2)) ## Here is a peculiar junction reported by TopHat: idx0 <- which(mcols(th_junctions14)$score2 == 0L) th_junctions14[idx0] gal[mcols(th_junctions14)$revmap[[idx0]]] ## The junction is crossed by 5 alignments (score is 5), all of which ## have a mapping quality of 0! } \keyword{methods} \keyword{manip} GenomicAlignments/man/pileLettersAt.Rd0000644000175200017520000001312114516004601021015 0ustar00biocbuildbiocbuild\name{pileLettersAt} \alias{pileLettersAt} \title{Pile the letters of a set of aligned reads on top of a set of genomic positions} \description{ \code{pileLettersAt} extracts the letters/nucleotides of a set of reads that align to a set of genomic positions of interest. The extracted letters are returned as "piles of letters" (one per genomic position of interest) stored in an \link[Biostrings]{XStringSet} (typically \link[Biostrings]{DNAStringSet}) object. } \usage{ pileLettersAt(x, seqnames, pos, cigar, at) } \arguments{ \item{x}{ An \link[Biostrings]{XStringSet} (typically \link[Biostrings]{DNAStringSet}) object containing N \emph{unaligned} read sequences (a.k.a. the query sequences) reported with respect to the + strand. } \item{seqnames}{ A factor-\link[S4Vectors]{Rle} \emph{parallel} to \code{x}. For each \code{i}, \code{seqnames[i]} must be the name of the reference sequence of the i-th alignment. } \item{pos}{ An integer vector \emph{parallel} to \code{x}. For each \code{i}, \code{pos[i]} must be the 1-based position on the reference sequence of the first aligned letter in \code{x[[i]]}. } \item{cigar}{ A character vector \emph{parallel} to \code{x}. Contains the extended CIGAR strings of the alignments. } \item{at}{ A \link[GenomicRanges]{GPos} object containing the genomic positions of interest. \code{seqlevels(at)} must be identical to \code{levels(seqnames)}. If \code{at} is not a \link[GenomicRanges]{GPos} object, \code{pileLettersAt} will first try to turn it into one by calling the \code{\link[GenomicRanges]{GPos}()} constructor function on it. So for example \code{at} can be a \link[GenomicRanges]{GRanges} object (or any other \link[GenomicRanges]{GenomicRanges} derivative), and, in that case, each range in it will be interpreted as a run of adjacent genomic positions. See \code{?\link[GenomicRanges]{GPos}} in the \pkg{GenomicRanges} package for more information. } } \details{ \code{x}, \code{seqnames}, \code{pos}, \code{cigar} must be 4 \emph{parallel} vectors describing N aligned reads. } \value{ An \link[Biostrings]{XStringSet} (typically \link[Biostrings]{DNAStringSet}) object \emph{parallel} to \code{at} (i.e. with 1 string per genomic position). } \author{Hervé Pagès} \seealso{ \itemize{ \item The \code{pileup} and \code{applyPileups} functions defined in the \pkg{Rsamtools} package, as well as the SAMtools mpileup command (available at \url{http://samtools.sourceforge.net/} as part of the SAMtools project), for more powerful flexible alternatives. \item The \code{\link{stackStringsFromGAlignments}} function for stacking the read sequences (or their quality strings) stored in a \link{GAlignments} object or a BAM file. \item \link[Biostrings]{DNAStringSet} objects in the \pkg{Biostrings} package. \item \link[GenomicRanges]{GPos} objects in the \pkg{GenomicRanges} package. \item \link{GAlignments} objects. \item \link{cigar-utils} for the CIGAR utility functions used internally by \code{pileLettersAt}. } } \examples{ ## Input ## - A BAM file: bamfile <- BamFile(system.file("extdata", "ex1.bam", package="Rsamtools")) seqinfo(bamfile) # to see the seqlevels and seqlengths stackStringsFromBam(bamfile, param="seq1:1-21") # a quick look at # the reads ## - A GPos object containing Genomic Positions Of Interest: my_GPOI <- GPos(c("seq1:1-5", "seq1:21-21", "seq1:1575-1575", "seq2:1513-1514")) ## Some preliminary massage on 'my_GPOI' seqinfo(my_GPOI) <- merge(seqinfo(my_GPOI), seqinfo(bamfile)) seqlevels(my_GPOI) <- seqlevelsInUse(my_GPOI) ## Load the BAM file in a GAlignments object. Note that we load only ## the reads aligned to the sequences in 'seqlevels(my_GPOI)'. Also, ## in order to be consistent with applyPileups() and SAMtools (m)pileup, ## we filter out the following BAM records: ## - secondary alignments (flag bit 0x100); ## - reads not passing quality controls (flag bit 0x200); ## - PCR or optical duplicates (flag bit 0x400). ## See ?ScanBamParam and the SAM Spec for more information. which <- as(seqinfo(my_GPOI), "GRanges") flag <- scanBamFlag(isSecondaryAlignment=FALSE, isNotPassingQualityControls=FALSE, isDuplicate=FALSE) what <- c("seq", "qual") param <- ScanBamParam(flag=flag, what=c("seq", "qual"), which=which) gal <- readGAlignments(bamfile, param=param) seqlevels(gal) <- seqlevels(my_GPOI) ## Extract the read sequences (a.k.a. query sequences) and quality ## strings. Both are reported with respect to the + strand. qseq <- mcols(gal)$seq qual <- mcols(gal)$qual nucl_piles <- pileLettersAt(qseq, seqnames(gal), start(gal), cigar(gal), my_GPOI) qual_piles <- pileLettersAt(qual, seqnames(gal), start(gal), cigar(gal), my_GPOI) mcols(my_GPOI)$nucl_piles <- nucl_piles mcols(my_GPOI)$qual_piles <- qual_piles my_GPOI ## Finally, to summarize A/C/G/T frequencies at each position: alphabetFrequency(nucl_piles, baseOnly=TRUE) ## Note that the pileup() function defined in the Rsamtools package ## can be used to obtain a similar result: scanbam_param <- ScanBamParam(flag=flag, which=my_GPOI) pileup_param <- PileupParam(max_depth=5000, min_base_quality=0, distinguish_strands=FALSE) pileup(bamfile, scanBamParam=scanbam_param, pileupParam=pileup_param) } \keyword{methods} \keyword{manip} GenomicAlignments/man/readGAlignments.Rd0000644000175200017520000005065614516004601021316 0ustar00biocbuildbiocbuild\name{readGAlignments} \alias{readGAlignments} \alias{readGAlignments,BamFile-method} \alias{readGAlignments,character-method} \alias{readGAlignments,BamViews-method} \alias{readGAlignmentPairs} \alias{readGAlignmentPairs,BamFile-method} \alias{readGAlignmentPairs,character-method} \alias{readGAlignmentsList} \alias{readGAlignmentsList,BamFile-method} \alias{readGAlignmentsList,character-method} \alias{readGappedReads} \alias{readGappedReads,BamFile-method} \alias{readGappedReads,character-method} \title{Reading genomic alignments from a file} \description{ Read genomic alignments from a file (typically a BAM file) into a \link{GAlignments}, \link{GAlignmentPairs}, \link{GAlignmentsList}, or \link{GappedReads} object. } \usage{ readGAlignments(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) readGAlignmentPairs(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE, strandMode=1) readGAlignmentsList(file, index=file, use.names=FALSE, param=ScanBamParam(), with.which_label=FALSE, strandMode=NA) readGappedReads(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) } \arguments{ \item{file}{ The path to the file to read or a \link[Rsamtools]{BamFile} object. Can also be a \link[Rsamtools]{BamViews} object for \code{readGAlignments}. } \item{index}{ The path to the index file of the BAM file to read. Must be given \emph{without} the '.bai' extension. See \code{\link[Rsamtools]{scanBam}} in the \pkg{Rsamtools} packages for more information. } \item{use.names}{ \code{TRUE} or \code{FALSE}. By default (i.e. \code{use.names=FALSE}), the resulting object has no names. If \code{use.names} is \code{TRUE}, then the names are constructed from the query template names (QNAME field in a SAM/BAM file). Note that the 2 records in a pair (when using \code{readGAlignmentPairs} or the records in a group (when using \code{readGAlignmentsList}) have the same QNAME. } \item{param}{\code{NULL} or a \link[Rsamtools]{ScanBamParam} object. Like for \code{\link[Rsamtools]{scanBam}}, this influences what fields and which records are imported. However, note that the fields specified thru this \link[Rsamtools]{ScanBamParam} object will be loaded \emph{in addition} to any field required for generating the returned object (\link{GAlignments}, \link{GAlignmentPairs}, or \link{GappedReads} object), but only the fields requested by the user will actually be kept as metadata columns of the object. By default (i.e. \code{param=NULL} or \code{param=ScanBamParam()}), no additional field is loaded. The flag used is \code{scanBamFlag(isUnmappedQuery=FALSE)} for \code{readGAlignments}, \code{readGAlignmentsList}, and \code{readGappedReads}. (i.e. only records corresponding to mapped reads are loaded), and \code{scanBamFlag(isUnmappedQuery=FALSE, isPaired=TRUE, hasUnmappedMate=FALSE)} for \code{readGAlignmentPairs} (i.e. only records corresponding to paired-end reads with both ends mapped are loaded). } \item{with.which_label}{\code{TRUE} or \code{FALSE} (the default). If \code{TRUE} and if \code{param} has a \code{which} component, a \code{"which_label"} metadata column is added to the returned \link{GAlignments} or \link{GappedReads} object, or to the \code{\link{first}} and \code{\link{last}} components of the returned \link{GAlignmentPairs} object. In the case of \code{readGAlignmentsList}, it's added as an \emph{inner} metadata column, that is, the metadata column is placed on the \link{GAlignments} object obtained by unlisting the returned \link{GAlignmentsList} object. The purpose of this metadata column is to unambiguously identify the range in \code{which} where each element in the returned object originates from. The labels used to identify the ranges are normally of the form \code{"seq1:12250-246500"}, that is, they're the same as the names found on the outer list that \code{\link{scanBam}} would return if called with the same \code{param} argument. If some ranges are duplicated, then the labels are made unique by appending a unique suffix to all of them. The \code{"which_label"} metadata column is represented as a factor-\link[S4Vectors]{Rle}. } \item{strandMode}{ Strand mode to set on the returned \link{GAlignmentPairs} or \link{GAlignmentsList} object. Note that the default value for this parameter is different for \code{readGAlignmentPairs()} and \code{readGAlignmentsList()}. See details below on \code{readGAlignmentsList()} and \code{?\link{strandMode}} for more information. } } \details{ \itemize{ \item \code{readGAlignments} reads a file containing aligned reads as a \link{GAlignments} object. See \code{?\link{GAlignments}} for a description of \link{GAlignments} objects. When \code{file} is a \link[Rsamtools]{BamViews} object, \code{readGAlignments} visits each path in \code{bamPaths(file)}, returning the result of \code{readGAlignments} applied to the specified path. When \code{index} is missing, it is set equal to \code{bamIndicies(file)}. Only reads in \code{bamRanges(file)} are returned (if \code{param} is supplied, \code{bamRanges(file)} takes precedence over \code{bamWhich(param)}). The return value is a \link[S4Vectors]{SimpleList} object, with elements of the list corresponding to each path. \code{bamSamples(file)} is available as metadata columns (accessed with \code{mcols}) of the returned \link[S4Vectors]{SimpleList} object. \item \code{readGAlignmentPairs} reads a file containing aligned paired-end reads as a \link{GAlignmentPairs} object. See \code{?\link{GAlignmentPairs}} for a description of \link{GAlignmentPairs} objects. \item \code{readGAlignmentsList} reads a file containing aligned reads as a \link{GAlignmentsList} object. See \code{?\link{GAlignmentsList}} for a description of \link{GAlignmentsList} objects. \code{readGAlignmentsList} pairs records into mates according to the pairing criteria described below. The 1st mate will always be 1st in the \link{GAlignmentsList} list elements that have mate_status set to \code{"mated"}, and the 2nd mate will always be 2nd. A \code{GAlignmentsList} is returned with a \sQuote{mate_status} metadata column on the outer list elements. \code{mate_status} is a factor with 3 levels indicating mate status, \sQuote{mated}, \sQuote{ambiguous} or \sQuote{unmated}: \itemize{ \item{mated:} primary or non-primary pairs \item{ambiguous:} multiple segments matching to the same location (indistinguishable) \item{unmated:} mate does not exist or is unmapped } When the \sQuote{file} argument is a BamFile, \sQuote{asMates=TRUE} must be set, otherwise the data are treated as single-end reads. See the \sQuote{asMates} section of \code{?\link[Rsamtools]{BamFile}} in the \pkg{Rsamtools} package for details. Note that, by default, \code{strandMode=NA}, which is different to the default value in \code{readGAlignmentPairs()} and which implies that, by default, the strand values in the returned \code{GAlignmentsList} object correspond to the original strand of the reads. \item \code{readGappedReads} reads a file containing aligned reads as a \link{GappedReads} object. See \code{?\link{GappedReads}} for a description of \link{GappedReads} objects. } For all these functions, flags, tags and ranges may be specified in the supplied \link[Rsamtools]{ScanBamParam} object for fine tuning of results. } \section{Pairing criteria}{ This section describes the pairing criteria used by \code{readGAlignmentsList} and \code{readGAlignmentPairs}. \itemize{ \item First, only records with flag bit 0x1 (multiple segments) set to 1, flag bit 0x4 (segment unmapped) set to 0, and flag bit 0x8 (next segment in the template unmapped) set to 0, are candidates for pairing (see the SAM Spec for a description of flag bits and fields). Records that correspond to single-end reads, or records that correspond to paired-end reads where one or both ends are unmapped, will remain unmated. \item Then the following fields and flag bits are considered: \itemize{ \item (A) QNAME \item (B) RNAME, RNEXT \item (C) POS, PNEXT \item (D) Flag bits Ox10 (segment aligned to minus strand) and 0x20 (next segment aligned to minus strand) \item (E) Flag bits 0x40 (first segment in template) and 0x80 (last segment in template) \item (F) Flag bit 0x2 (proper pair) \item (G) Flag bit 0x100 (secondary alignment) } 2 records rec1 and rec2 are considered mates iff all the following conditions are satisfied: \itemize{ \item (A) QNAME(rec1) == QNAME(rec2) \item (B) RNEXT(rec1) == RNAME(rec2) and RNEXT(rec2) == RNAME(rec1) \item (C) PNEXT(rec1) == POS(rec2) and PNEXT(rec2) == POS(rec1) \item (D) Flag bit 0x20 of rec1 == Flag bit 0x10 of rec2 and Flag bit 0x20 of rec2 == Flag bit 0x10 of rec1 \item (E) rec1 corresponds to the first segment in the template and rec2 corresponds to the last segment in the template, OR, rec2 corresponds to the first segment in the template and rec1 corresponds to the last segment in the template \item (F) rec1 and rec2 have same flag bit 0x2 \item (G) rec1 and rec2 have same flag bit 0x100 } } Note that this is actually the pairing criteria used by \code{\link[Rsamtools]{scanBam}} (when the \link[Rsamtools]{BamFile} passed to it has the \code{asMates} toggle set to \code{TRUE}), which \code{readGAlignmentsList} and \code{readGAlignmentPairs} call behind the scene. It is also the pairing criteria used by \code{\link{findMateAlignment}}. } \value{ A \link{GAlignments} object for \code{readGAlignments}. A \link{GAlignmentPairs} object for \code{readGAlignmentPairs}. Note that a BAM (or SAM) file can in theory contain a mix of single-end and paired-end reads, but in practise it seems that single-end and paired-end are not mixed. In other words, the value of flag bit 0x1 (\code{isPaired}) is the same for all the records in a file. So if \code{readGAlignmentPairs} returns a \link{GAlignmentPairs} object of length zero, this almost always means that the BAM (or SAM) file contains alignments for single-end reads (although it could also mean that the user-supplied \code{\linkS4class{ScanBamParam}} is filtering out everything, or that the file is empty, or that all the records in the file correspond to unmapped reads). A \link{GAlignmentsList} object for \code{readGAlignmentsList}. When the list contains paired-end reads a metadata data column of \code{mate_status} is added to the object. See details in the `Bam specific back-ends' section on this man page. A \link{GappedReads} object for \code{readGappedReads}. } \note{ BAM records corresponding to unmapped reads are always ignored. Starting with Rsamtools 1.7.1 (BioC 2.10), PCR or optical duplicates are loaded by default (use \code{scanBamFlag(isDuplicate=FALSE)} to drop them). } \author{Hervé Pagès and Valerie Obenchain} \seealso{ \itemize{ \item \code{\link[Rsamtools]{scanBam}} and \code{\link[Rsamtools]{ScanBamParam}} in the \pkg{Rsamtools} package. \item \link{GAlignments}, \link{GAlignmentPairs}, \link{GAlignmentsList}, and \link{GappedReads} objects. \item \link[IRanges]{IRangesList} objects (used in the examples below to specify the \code{which} regions) in the \pkg{IRanges} package. } } \examples{ ## --------------------------------------------------------------------- ## A. readGAlignments() ## --------------------------------------------------------------------- ## Simple use: bamfile <- system.file("extdata", "ex1.bam", package="Rsamtools", mustWork=TRUE) gal1 <- readGAlignments(bamfile) gal1 names(gal1) ## Using the 'use.names' arg: gal2 <- readGAlignments(bamfile, use.names=TRUE) gal2 head(names(gal2)) ## Using the 'param' arg to drop PCR or optical duplicates as well as ## secondary alignments, and to load additional BAM fields: param <- ScanBamParam(flag=scanBamFlag(isDuplicate=FALSE, isSecondaryAlignment=FALSE), what=c("qual", "flag")) gal3 <- readGAlignments(bamfile, param=param) gal3 mcols(gal3) ## Using the 'param' arg to load alignments from particular regions. which <- IRangesList(seq1=IRanges(1000, 1100), seq2=IRanges(c(1546, 1555, 1567), width=10)) param <- ScanBamParam(which=which) gal4 <- readGAlignments(bamfile, use.names=TRUE, param=param) gal4 ## IMPORTANT NOTE: A given record is loaded one time for each region ## it overlaps with. We call this "duplicated record selection" (this ## is a scanBam() feature, readGAlignments() is based on scanBam()): which <- IRangesList(seq2=IRanges(c(1555, 1567), width=10)) param <- ScanBamParam(which=which) gal5 <- readGAlignments(bamfile, use.names=TRUE, param=param) gal5 # record EAS114_26:7:37:79:581 was loaded twice ## This becomes clearer if we use 'with.which_label=TRUE' to identify ## the region in 'which' where each element in 'gal5' originates from. gal5 <- readGAlignments(bamfile, use.names=TRUE, param=param, with.which_label=TRUE) gal5 ## Not surprisingly, we also get "duplicated record selection" when ## 'which' contains repeated or overlapping regions. Using the same ## regions as we did for 'gal4' above, except that now we're ## repeating the region on seq1: which <- IRangesList(seq1=rep(IRanges(1000, 1100), 2), seq2=IRanges(c(1546, 1555, 1567), width=10)) param <- ScanBamParam(which=which) gal4b <- readGAlignments(bamfile, use.names=TRUE, param=param) length(gal4b) # > length(gal4), because all the records overlapping # with bases 1000 to 1100 on seq1 are now duplicated ## The "duplicated record selection" will artificially increase the ## coverage or affect other downstream results. It can be mitigated ## (but not completely eliminated) by first "reducing" the set of ## regions: which <- reduce(which) which param <- ScanBamParam(which=which) gal4c <- readGAlignments(bamfile, use.names=TRUE, param=param) length(gal4c) # < length(gal4), because the 2 first original regions # on seq2 were merged into a single one ## Note that reducing the set of regions didn't completely eliminate ## "duplicated record selection". Records that overlap the 2 reduced ## regions on seq2 (which$seq2) are loaded twice (like for 'gal5' ## above). See example D. below for how to completely eliminate ## "duplicated record selection". ## Using the 'param' arg to load tags. Except for MF and Aq, the tags ## specified below are predefined tags (see the SAM Spec for the list ## of predefined tags and their meaning). param <- ScanBamParam(tag=c("MF", "Aq", "NM", "UQ", "H0", "H1"), what="isize") gal6 <- readGAlignments(bamfile, param=param) mcols(gal6) # "tag" cols always after "what" cols ## With a BamViews object: fls <- system.file("extdata", "ex1.bam", package="Rsamtools", mustWork=TRUE) bv <- BamViews(fls, bamSamples=DataFrame(info="test", row.names="ex1"), auto.range=TRUE) ## Note that the "readGAlignments" method for BamViews objects ## requires the ShortRead package to be installed. aln <- readGAlignments(bv) aln aln[[1]] aln[colnames(bv)] mcols(aln) ## --------------------------------------------------------------------- ## B. readGAlignmentPairs() ## --------------------------------------------------------------------- galp1 <- readGAlignmentPairs(bamfile) head(galp1) names(galp1) ## Here we use the 'param' arg to filter by proper pair, drop PCR / ## optical duplicates, and drop secondary alignments. Filtering by ## proper pair and dropping secondary alignments can help make the ## pairing algorithm run significantly faster: param <- ScanBamParam(flag=scanBamFlag(isProperPair=TRUE, isDuplicate=FALSE, isSecondaryAlignment=FALSE)) galp2 <- readGAlignmentPairs(bamfile, use.names=TRUE, param=param) galp2 head(galp2) head(names(galp2)) ## --------------------------------------------------------------------- ## C. readGAlignmentsList() ## --------------------------------------------------------------------- library(pasillaBamSubset) ## 'file' as character. bam <- untreated3_chr4() galist1 <- readGAlignmentsList(bam) galist1[1:3] length(galist1) table(elementNROWS(galist1)) ## When 'file' is a BamFile, 'asMates' must be TRUE. If FALSE, ## the data are treated as single-end and each list element of the ## GAlignmentsList will be of length 1. For single-end data ## use readGAlignments(). bamfile <- BamFile(bam, yieldSize=3, asMates=TRUE) readGAlignmentsList(bamfile) ## Use a 'param' to fine tune the results. param <- ScanBamParam(flag=scanBamFlag(isProperPair=TRUE)) galist2 <- readGAlignmentsList(bam, param=param) galist2[1:3] length(galist2) table(elementNROWS(galist2)) ## For paired-end data, we can set the 'strandMode' parameter to ## infer the strand of a pair from the strand of the first and ## last alignments in the pair galist3 <- readGAlignmentsList(bam, param=param, strandMode=0) galist3[1:3] galist4 <- readGAlignmentsList(bam, param=param, strandMode=1) galist4[1:3] galist5 <- readGAlignmentsList(bam, param=param, strandMode=2) galist5[1:3] ## --------------------------------------------------------------------- ## D. COMPARING 4 STRATEGIES FOR LOADING THE ALIGNMENTS THAT OVERLAP ## WITH THE EXONIC REGIONS ON FLY CHROMMOSOME 4 ## --------------------------------------------------------------------- library(pasillaBamSubset) bam <- untreated1_chr4() library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene ex <- exons(txdb) seqlevels(ex, pruning.mode="coarse") <- "chr4" length(ex) ## Some of the exons overlap with each other: isDisjoint(ex) # FALSE exonic_regions <- reduce(ex) isDisjoint(exonic_regions) # no more overlaps length(exonic_regions) ## Strategy #1: slow and loads a lot of records more than once (see ## "duplicated record selection" in example A. above). param1 <- ScanBamParam(which=ex) gal1 <- readGAlignments(bam, param=param1) length(gal1) # many "duplicated records" ## Strategy #2: faster and generates less duplicated records but ## doesn't eliminate them. param2 <- ScanBamParam(which=exonic_regions) gal2 <- readGAlignments(bam, param=param2) length(gal2) # less "duplicated records" ## Strategy #3: fast and completely eliminates duplicated records. gal0 <- readGAlignments(bam) gal3 <- subsetByOverlaps(gal0, exonic_regions, ignore.strand=TRUE) length(gal3) # no "duplicated records" ## Note that, in this case using 'exonic_regions' or 'ex' makes no ## difference: gal3b <- subsetByOverlaps(gal0, ex, ignore.strand=TRUE) stopifnot(identical(gal3, gal3b)) ## Strategy #4: strategy #3 however can require a lot of memory if the ## file is big because we load all the alignments into memory before we ## select those that overlap with the exonic regions. Strategy #4 ## addresses this by loading the file by chunks. bamfile <- BamFile(bam, yieldSize=50000) open(bamfile) while (length(chunk0 <- readGAlignments(bamfile))) { chunk <- subsetByOverlaps(chunk0, ex, ignore.strand=TRUE) cat("chunk0:", length(chunk0), "- chunk:", length(chunk), "\n") ## ... do something with 'chunk' ... } close(bamfile) ## --------------------------------------------------------------------- ## E. readGappedReads() ## --------------------------------------------------------------------- greads1 <- readGappedReads(bamfile) greads1 names(greads1) qseq(greads1) greads2 <- readGappedReads(bamfile, use.names=TRUE) head(greads2) head(names(greads2)) } \keyword{manip} GenomicAlignments/man/sequenceLayer.Rd0000644000175200017520000003312714516004601021051 0ustar00biocbuildbiocbuild\name{sequenceLayer} \alias{sequenceLayer} \title{Lay read sequences alongside the reference space, using their CIGARs} \description{ \code{sequenceLayer} can lay strings that belong to a given space (e.g. the \code{"query"} space) alongside another space (e.g. the \code{"reference"} space) by removing/injecting substrings from/into them, using the supplied CIGARs. Its primary use case is to lay the read sequences stored in a BAM file (which are considered to belong to the \code{"query"} space) alongside the \code{"reference"} space. It can also be used to remove the parts of the read sequences that correspond to soft-clipping. More generally it can lay strings that belong to any supported space alongside any other supported space. See the Details section below for the list of supported spaces. } \usage{ sequenceLayer(x, cigar, from="query", to="reference", D.letter="-", N.letter=".", I.letter="-", S.letter="+", H.letter="+") } \arguments{ \item{x}{ An \link{XStringSet} object containing strings that belong to a given space. } \item{cigar}{ A character vector or factor of the same length as \code{x} containing the extended CIGAR strings (one per element in \code{x}). } \item{from, to}{ A single string specifying one of the 8 supported spaces listed in the Details section below. \code{from} must be the current space (i.e. the space the strings in \code{x} belong to) and \code{to} is the space alonside which to lay the strings in \code{x}. } \item{D.letter, N.letter, I.letter, S.letter, H.letter}{ A single letter used as a filler for injections. More on this in the Details section below. } } \details{ The 8 supported spaces are: \code{"reference"}, \code{"reference-N-regions-removed"}, \code{"query"}, \code{"query-before-hard-clipping"}, \code{"query-after-soft-clipping"}, \code{"pairwise"}, \code{"pairwise-N-regions-removed"}, and \code{"pairwise-dense"}. Each space can be characterized by the extended CIGAR operations that are \emph{visible} in it. A CIGAR operation is said to be \emph{visible} in a given space if it "runs along it", that is, if it's associated with a block of contiguous positions in that space (the size of the block being the length of the operation). For example, the M/=/X operations are \emph{visible} in all spaces, the D/N operations are \emph{visible} in the \code{"reference"} space but not in the \code{"query"} space, the S operation is \emph{visible} in the \code{"query"} space but not in the \code{"reference"} or in the \code{"query-after-soft-clipping"} space, etc... Here are the extended CIGAR operations that are \emph{visible} in each space: \enumerate{ \item reference: M, D, N, =, X \item reference-N-regions-removed: M, D, =, X \item query: M, I, S, =, X \item query-before-hard-clipping: M, I, S, H, =, X \item query-after-soft-clipping: M, I, =, X \item pairwise: M, I, D, N, =, X \item pairwise-N-regions-removed: M, I, D, =, X \item pairwise-dense: M, =, X } \code{sequenceLayer} lays a string that belongs to one space alongside another by (1) removing the substrings associated with operations that are not \emph{visible} anymore in the new space, and (2) injecting substrings associated with operations that become \emph{visible} in the new space. Each injected substring has the length of the operation associated with it, and its content is controlled via the corresponding \code{*.letter} argument. For example, when going from the \code{"query"} space to the \code{"reference"} space (the default), the I- and S-substrings (i.e. the substrings associated with I/S operations) are removed, and substrings associated with D/N operations are injected. More precisely, the D-substrings are filled with the letter specified in \code{D.letter}, and the N-substrings with the letter specified in \code{N.letter}. The other \code{*.letter} arguments are ignored in that case. } \value{ An \link{XStringSet} object of the same class and length as \code{x}. } \author{Hervé Pagès} \seealso{ \itemize{ \item The \code{\link{stackStringsFromBam}} function for stacking the read sequences (or their quality strings) stored in a BAM file on a region of interest. \item The \code{\link{readGAlignments}} function for loading read sequences from a BAM file (via a \link{GAlignments} object). \item The \code{\link[Biostrings]{extractAt}} and \code{\link[Biostrings]{replaceAt}} functions in the \pkg{Biostrings} package for extracting/replacing arbitrary substrings from/in a string or set of strings. \item \link{cigar-utils} for the CIGAR utility functions used internally by \code{sequenceLayer}. } } \examples{ ## --------------------------------------------------------------------- ## A. FROM "query" TO "reference" SPACE ## --------------------------------------------------------------------- ## Load read sequences from a BAM file (they will be returned in a ## GAlignments object): bamfile <- system.file("extdata", "ex1.bam", package="Rsamtools") param <- ScanBamParam(what="seq") gal <- readGAlignments(bamfile, param=param) qseq <- mcols(gal)$seq # the read sequences (aka query sequences) ## Lay the query sequences alongside the reference space. This will ## remove the substrings associated with insertions to the reference ## (I operations) and soft clipping (S operations), and will inject new ## substrings (filled with "-") where deletions from the reference (D ## operations) and skipped regions from the reference (N operations) ## occurred during the alignment process: qseq_on_ref <- sequenceLayer(qseq, cigar(gal)) ## A typical use case for doing the above is to compute 1 consensus ## sequence per chromosome. The code below shows how this can be done ## in 2 extra steps. ## Step 1: Compute one consensus matrix per chromosome. qseq_on_ref_by_chrom <- splitAsList(qseq_on_ref, seqnames(gal)) pos_by_chrom <- splitAsList(start(gal), seqnames(gal)) cm_by_chrom <- lapply(names(pos_by_chrom), function(seqname) consensusMatrix(qseq_on_ref_by_chrom[[seqname]], as.prob=TRUE, shift=pos_by_chrom[[seqname]]-1, width=seqlengths(gal)[[seqname]])) names(cm_by_chrom) <- names(pos_by_chrom) ## 'cm_by_chrom' is a list of consensus matrices. Each matrix has 17 ## rows (1 per letter in the DNA alphabet) and 1 column per chromosome ## position. ## Step 2: Compute the consensus string from each consensus matrix. ## We'll put "+" in the strings wherever there is no coverage for that ## position, and "N" where there is coverage but no consensus. cs_by_chrom <- lapply(cm_by_chrom, function(cm) { ## Because consensusString() doesn't like consensus matrices ## with columns that contain only zeroes (and you will have ## columns like that for chromosome positions that don't ## receive any coverage), we need to "fix" 'cm' first. idx <- colSums(cm) == 0 cm["+", idx] <- 1 DNAString(consensusString(cm, ambiguityMap="N")) }) ## consensusString() provides some flexibility to let you extract ## the consensus in different ways. See '?consensusString' in the ## Biostrings package for the details. ## Finally, note that the read quality strings can also be used as ## input for sequenceLayer(): param <- ScanBamParam(what="qual") gal <- readGAlignments(bamfile, param=param) qual <- mcols(gal)$qual # the read quality strings qual_on_ref <- sequenceLayer(qual, cigar(gal)) ## Note that since the "-" letter is a valid quality code, there is ## no way to distinguish it from the "-" letters inserted by ## sequenceLayer(). ## --------------------------------------------------------------------- ## B. FROM "query" TO "query-after-soft-clipping" SPACE ## --------------------------------------------------------------------- ## Going from "query" to "query-after-soft-clipping" simply removes ## the substrings associated with soft clipping (S operations): qseq <- DNAStringSet(c("AAAGTTCGAA", "TTACGATTAN", "GGATAATTTT")) cigar <- c("3H10M", "2S7M1S2H", "2M1I1M3D2M4S") clipped_qseq <- sequenceLayer(qseq, cigar, from="query", to="query-after-soft-clipping") sequenceLayer(clipped_qseq, cigar, from="query-after-soft-clipping", to="query") sequenceLayer(clipped_qseq, cigar, from="query-after-soft-clipping", to="query", S.letter="-") ## --------------------------------------------------------------------- ## C. BRING QUERY AND REFERENCE SEQUENCES TO THE "pairwise" or ## "pairwise-dense" SPACE ## --------------------------------------------------------------------- ## Load read sequences from a BAM file: library(RNAseqData.HNRNPC.bam.chr14) bamfile <- RNAseqData.HNRNPC.bam.chr14_BAMFILES[1] param <- ScanBamParam(what="seq", which=GRanges("chr14", IRanges(1, 25000000))) gal <- readGAlignments(bamfile, param=param) qseq <- mcols(gal)$seq # the read sequences (aka query sequences) ## Load the corresponding reference sequences from the appropriate ## BSgenome package (the reads in RNAseqData.HNRNPC.bam.chr14 were ## aligned to hg19): library(BSgenome.Hsapiens.UCSC.hg19) rseq <- getSeq(Hsapiens, as(gal, "GRanges")) # the reference sequences ## Bring 'qseq' and 'rseq' to the "pairwise" space. ## For 'qseq', this will remove the substrings associated with soft ## clipping (S operations) and inject substrings (filled with "-") ## associated with deletions from the reference (D operations) and ## skipped regions from the reference (N operations). For 'rseq', this ## will inject substrings (filled with "-") associated with insertions ## to the reference (I operations). qseq2 <- sequenceLayer(qseq, cigar(gal), from="query", to="pairwise") rseq2 <- sequenceLayer(rseq, cigar(gal), from="reference", to="pairwise") ## Sanity check: 'qseq2' and 'rseq2' should have the same shape. stopifnot(identical(elementNROWS(qseq2), elementNROWS(rseq2))) ## A closer look at reads with insertions and deletions: cigar_op_table <- cigarOpTable(cigar(gal)) head(cigar_op_table) I_idx <- which(cigar_op_table[ , "I"] >= 2) # at least 2 insertions qseq2[I_idx] rseq2[I_idx] D_idx <- which(cigar_op_table[ , "D"] >= 2) # at least 2 deletions qseq2[D_idx] rseq2[D_idx] ## A closer look at reads with skipped regions: N_idx <- which(cigar_op_table[ , "N"] != 0) qseq2[N_idx] rseq2[N_idx] ## A variant of the "pairwise" space is the "pairwise-dense" space. ## In that space, all indels and skipped regions are removed from 'qseq' ## and 'rseq'. qseq3 <- sequenceLayer(qseq, cigar(gal), from="query", to="pairwise-dense") rseq3 <- sequenceLayer(rseq, cigar(gal), from="reference", to="pairwise-dense") ## Sanity check: 'qseq3' and 'rseq3' should have the same shape. stopifnot(identical(elementNROWS(qseq3), elementNROWS(rseq3))) ## Insertions were removed: qseq3[I_idx] rseq3[I_idx] ## Deletions were removed: qseq3[D_idx] rseq3[D_idx] ## Skipped regions were removed: qseq3[N_idx] rseq3[N_idx] ## --------------------------------------------------------------------- ## D. SANITY CHECKS ## --------------------------------------------------------------------- SPACES <- c("reference", "reference-N-regions-removed", "query", "query-before-hard-clipping", "query-after-soft-clipping", "pairwise", "pairwise-N-regions-removed", "pairwise-dense") cigarWidth <- list( function(cigar) cigarWidthAlongReferenceSpace(cigar), function(cigar) cigarWidthAlongReferenceSpace(cigar, N.regions.removed=TRUE), function(cigar) cigarWidthAlongQuerySpace(cigar), function(cigar) cigarWidthAlongQuerySpace(cigar, before.hard.clipping=TRUE), function(cigar) cigarWidthAlongQuerySpace(cigar, after.soft.clipping=TRUE), function(cigar) cigarWidthAlongPairwiseSpace(cigar), function(cigar) cigarWidthAlongPairwiseSpace(cigar, N.regions.removed=TRUE), function(cigar) cigarWidthAlongPairwiseSpace(cigar, dense=TRUE) ) cigar <- c("3H2S4M1D2M2I1M5N3M6H", "5M1I3M2D4M2S") seq <- list( BStringSet(c(A="AAAA-BBC.....DDD", B="AAAAABBB--CCCC")), BStringSet(c(A="AAAA-BBCDDD", B="AAAAABBB--CCCC")), BStringSet(c(A="++AAAABBiiCDDD", B="AAAAAiBBBCCCC++")), BStringSet(c(A="+++++AAAABBiiCDDD++++++", B="AAAAAiBBBCCCC++")), BStringSet(c(A="AAAABBiiCDDD", B="AAAAAiBBBCCCC")), BStringSet(c(A="AAAA-BBiiC.....DDD", B="AAAAAiBBB--CCCC")), BStringSet(c(A="AAAA-BBiiCDDD", B="AAAAAiBBB--CCCC")), BStringSet(c(A="AAAABBCDDD", B="AAAAABBBCCCC")) ) stopifnot(all(sapply(1:8, function(i) identical(width(seq[[i]]), cigarWidth[[i]](cigar)) ))) sequenceLayer2 <- function(x, cigar, from, to) sequenceLayer(x, cigar, from=from, to=to, I.letter="i") identical_XStringSet <- function(target, current) { ok1 <- identical(class(target), class(current)) ok2 <- identical(names(target), names(current)) ok3 <- all(target == current) ok1 && ok2 && ok3 } res <- sapply(1:8, function(i) { sapply(1:8, function(j) { target <- seq[[j]] current <- sequenceLayer2(seq[[i]], cigar, from=SPACES[i], to=SPACES[j]) identical_XStringSet(target, current) }) }) stopifnot(all(res)) } \keyword{methods} \keyword{manip} GenomicAlignments/man/setops-methods.Rd0000644000175200017520000000273614516004601021224 0ustar00biocbuildbiocbuild\name{setops-methods} \alias{setops-methods} \alias{pintersect} \alias{pintersect,GAlignments,GRanges-method} \alias{pintersect,GRanges,GAlignments-method} \title{Set operations on GAlignments objects} \description{ Performs set operations on \link{GAlignments} objects. NOTE: The \code{\link[IRanges]{pintersect}} generic function and method for \link[IRanges]{IntegerRanges} objects is defined and documented in the \pkg{IRanges} package. Methods for \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} objects are defined and documented in the \pkg{GenomicRanges} package. } \usage{ \S4method{pintersect}{GAlignments,GRanges}(x, y, ...) \S4method{pintersect}{GRanges,GAlignments}(x, y, ...) } \arguments{ \item{x, y}{ A \link{GAlignments} object and a \link[GenomicRanges]{GRanges} object. They must have the same length. } \item{...}{ Further arguments to be passed to or from other methods. } } \value{ A \link{GAlignments} object \emph{parallel} to (i.e. same length as) \code{x} and \code{y}. } \seealso{ \itemize{ \item The \link{GAlignments} class. \item The \link[GenomicRanges]{setops-methods} man page in the \pkg{GenomicRanges} package. } } \examples{ ## Parallel intersection of a GAlignments and a GRanges object: bamfile <- system.file("extdata", "ex1.bam", package="Rsamtools") gal <- readGAlignments(bamfile) pintersect(gal, shift(as(gal, "GRanges"), 6L)) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/stackStringsFromGAlignments.Rd0000644000175200017520000002473214516004601023702 0ustar00biocbuildbiocbuild\name{stackStringsFromBam} \alias{stackStringsFromGAlignments} \alias{stackStringsFromBam} \alias{alphabetFrequencyFromBam} \title{Stack the read sequences stored in a GAlignments object or a BAM file} \description{ \code{stackStringsFromGAlignments} stacks the read sequences (or their quality strings) stored in a \link{GAlignments} object over a user-specified region. \code{stackStringsFromBam} stacks the read sequences (or their quality strings) stored in a BAM file over a user-specified region. \code{alphabetFrequencyFromBam} computes the alphabet frequency of the reads over a user-specified region. All these functions take into account the CIGAR of each read to \emph{lay} the read sequence (or its quality string) alongside the reference space. This step ensures that each nucleotide in a read is associated with the correct position on the reference sequence. } \usage{ stackStringsFromGAlignments(x, region, what="seq", D.letter="-", N.letter=".", Lpadding.letter="+", Rpadding.letter="+") stackStringsFromBam(file, index=file, param, what="seq", use.names=FALSE, D.letter="-", N.letter=".", Lpadding.letter="+", Rpadding.letter="+") alphabetFrequencyFromBam(file, index=file, param, what="seq", ...) } \arguments{ \item{x}{ A \link{GAlignments} object with the read sequences in the \code{"seq"} metadata column (if \code{what} is set to \code{"seq"}), or with the the read quality strings in the \code{"qual"} metadata column (if \code{what} is set to \code{"qual"}). Such an object is typically obtained by specifying \code{param=\link[Rsamtools]{ScanBamParam}(what=c("seq", "qual"))} when reading a BAM file with calling \code{\link{readGAlignments}()}. } \item{region}{ A \link[GenomicRanges]{GRanges} object with exactly 1 genomic range. The read sequences (or read quality strings) will be stacked over that region. } \item{what}{ A single string. Either \code{"seq"} or \code{"qual"}. If \code{"seq"} (the default), the read sequences will be stacked. If \code{"qual"}, the read quality strings will be stacked. } \item{D.letter, N.letter}{ A single letter used as a filler for injections. The 2 arguments are passed down to the \code{\link{sequenceLayer}} function. See \code{?\link{sequenceLayer}} for more details. } \item{Lpadding.letter, Rpadding.letter}{ A single letter to use for padding the sequences on the left, and another one to use for padding on the right. The 2 arguments are passed down to the \code{\link[Biostrings]{stackStrings}} function defined in the \pkg{Biostrings} package. See \code{?\link[Biostrings]{stackStrings}} in the \pkg{Biostrings} package for more details. } \item{file, index}{ The path to the BAM file containing the reads, and to its index file, respectively. The latter is given \emph{without} the '.bai' extension. See \code{\link{scanBam}} for more information. } \item{param}{ A \link{ScanBamParam} object containing exactly 1 genomic region (i.e. \code{unlist(bamWhich(param))} must have length 1). Alternatively, \code{param} can be a \link[GenomicRanges]{GRanges} or \link[IRanges]{IntegerRangesList} object containing exactly 1 genomic region (the strand will be ignored in case of a \link[GenomicRanges]{GRanges} object), or a character string specifying a single genomic region (in the \code{"chr14:5201-5300"} format). } \item{use.names}{ Use the query template names (QNAME field) as the names of the returned object? If not (the default), then the returned object has no names. } \item{...}{ Further arguments to be passed to \link[Biostrings]{alphabetFrequency}. } } \details{ \code{stackStringsFromGAlignments} performs the 3 following steps: \enumerate{ \item Subset \link{GAlignments} object \code{x} to keep only the alignments that overlap with the specified region. \item Lay the sequences in \code{x} alongside the reference space, using their CIGARs. This is done with the \code{\link{sequenceLayer}} function. \item Stack them on the specified region. This is done with the \code{\link[Biostrings]{stackStrings}} function defined in the \pkg{Biostrings} package. } \code{stackStringsFromBam} performs the 3 following steps: \enumerate{ \item Load the read sequences (or their quality strings) from the BAM file. Only the read sequences that overlap with the specified region are loaded. This is done with the \code{\link{readGAlignments}} function. Note that if the file contains paired-end reads, the pairing is ignored. \item Same as \code{stackStringsFromGAlignments}. \item Same as \code{stackStringsFromGAlignments}. } \code{alphabetFrequencyFromBam} also performs steps 1. and 2. but, instead of stacking the sequences at step 3., it computes the nucleotide frequencies for each genomic position in the specified region. } \value{ For \code{stackStringsFromBam}: A rectangular (i.e. constant-width) \link[Biostrings]{DNAStringSet} object (if \code{what} is \code{"seq"}) or \link[Biostrings]{BStringSet} object (if \code{what} is \code{"qual"}). For \code{alphabetFrequencyFromBam}: By default a matrix like one returned by \code{\link[Biostrings]{alphabetFrequency}}. The matrix has 1 row per nucleotide position in the specified region. } \note{ TWO IMPORTANT CAVEATS ABOUT \code{stackStringsFromGAlignments} AND \code{stackStringsFromBam}: Specifying a big genomic region, say >= 100000 bp, can require a lot of memory (especially with high coverage reads) so is not recommended. See the \code{\link{pileLettersAt}} function for piling the read letters on top of a set of genomic positions, which is more flexible and more memory efficient. Paired-end reads are treated as single-end reads (i.e. they're not paired). } \author{Hervé Pagès} \seealso{ \itemize{ \item The \code{\link{pileLettersAt}} function for piling the letters of a set of aligned reads on top of a set of genomic positions. \item The \code{\link{readGAlignments}} function for loading read sequences (or their quality strings) from a BAM file (via a \link{GAlignments} object). \item The \code{\link{sequenceLayer}} function for laying read sequences alongside the reference space, using their CIGARs. \item The \code{\link[Biostrings]{stackStrings}} function in the \pkg{Biostrings} package for stacking an arbitrary \link[Biostrings]{XStringSet} object. \item The \code{\link[Biostrings]{alphabetFrequency}} function in the \pkg{Biostrings} package. \item The SAMtools mpileup command available at \url{http://samtools.sourceforge.net/} as part of the SAMtools project. } } \examples{ ## --------------------------------------------------------------------- ## A. EXAMPLE WITH TOY DATA ## --------------------------------------------------------------------- bamfile1 <- BamFile(system.file("extdata", "ex1.bam", package="Rsamtools")) region1 <- GRanges("seq1", IRanges(1, 60)) # region of interest ## Stack the read sequences directly from the BAM file: stackStringsFromBam(bamfile1, param=region1, use.names=TRUE) ## or, alternatively, from a GAlignments object: gal1 <- readGAlignments(bamfile1, param=ScanBamParam(what="seq"), use.names=TRUE) stackStringsFromGAlignments(gal1, region1) ## Compute the "consensus matrix" (1 column per nucleotide position ## in the region of interest): af <- alphabetFrequencyFromBam(bamfile1, param=region1, baseOnly=TRUE) cm1a <- t(af[ , DNA_BASES]) cm1a ## Stack their quality strings: stackStringsFromBam(bamfile1, param=region1, what="qual") ## Control the number of reads to display: options(showHeadLines=18) options(showTailLines=6) stackStringsFromBam(bamfile1, param=GRanges("seq1", IRanges(61, 120))) stacked_qseq <- stackStringsFromBam(bamfile1, param="seq2:1509-1519") stacked_qseq # deletion in read 13 af <- alphabetFrequencyFromBam(bamfile1, param="seq2:1509-1519", baseOnly=TRUE) cm1b <- t(af[ , DNA_BASES]) # consensus matrix cm1b ## Sanity check: stopifnot(identical(consensusMatrix(stacked_qseq)[DNA_BASES, ], cm1b)) stackStringsFromBam(bamfile1, param="seq2:1509-1519", what="qual") ## --------------------------------------------------------------------- ## B. EXAMPLE WITH REAL DATA ## --------------------------------------------------------------------- library(RNAseqData.HNRNPC.bam.chr14) bamfile2 <- BamFile(RNAseqData.HNRNPC.bam.chr14_BAMFILES[1]) ## Region of interest: region2 <- GRanges("chr14", IRanges(19650095, 19650159)) ## Stack the read sequences directly from the BAM file: stackStringsFromBam(bamfile2, param=region2) ## or, alternatively, from a GAlignments object: gal2 <- readGAlignments(bamfile2, param=ScanBamParam(what="seq")) stackStringsFromGAlignments(gal2, region2) af <- alphabetFrequencyFromBam(bamfile2, param=region2, baseOnly=TRUE) cm2 <- t(af[ , DNA_BASES]) # consensus matrix cm2 ## --------------------------------------------------------------------- ## C. COMPUTE READ CONSENSUS SEQUENCE FOR REGION OF INTEREST ## --------------------------------------------------------------------- ## Let's write our own little naive function to go from consensus matrix ## to consensus sequence. For each nucleotide position in the region of ## interest (i.e. each column in the matrix), we select the letter with ## highest frequency. We also use special letter "*" at positions where ## there is a tie, and special letter "." at positions where all the ## frequencies are 0 (a particular type of tie): cm_to_cs <- function(cm) { stopifnot(is.matrix(cm)) nr <- nrow(cm) rnames <- rownames(cm) stopifnot(!is.null(rnames) && all(nchar(rnames) == 1L)) selection <- apply(cm, 2, function(x) { i <- which.max(x) if (x[i] == 0L) return(nr + 1L) if (sum(x == x[i]) != 1L) return(nr + 2L) i }) paste0(c(rnames, ".", "*")[selection], collapse="") } cm_to_cs(cm1a) cm_to_cs(cm1b) cm_to_cs(cm2) ## Note that the consensus sequences we obtain are relative to the ## plus strand of the reference sequence. } \keyword{methods} \keyword{manip} GenomicAlignments/man/summarizeOverlaps-methods.Rd0000644000175200017520000006031714547043765023460 0ustar00biocbuildbiocbuild\name{summarizeOverlaps-methods} \alias{summarizeOverlaps-methods} \alias{summarizeOverlaps} \alias{summarizeOverlaps,GRanges,GAlignments-method} \alias{summarizeOverlaps,GRangesList,GAlignments-method} \alias{summarizeOverlaps,GRanges,GAlignmentsList-method} \alias{summarizeOverlaps,GRangesList,GAlignmentsList-method} \alias{summarizeOverlaps,GRanges,GAlignmentPairs-method} \alias{summarizeOverlaps,GRangesList,GAlignmentPairs-method} \alias{summarizeOverlaps,GRanges,GRanges-method} \alias{summarizeOverlaps,GRangesList,GRanges-method} \alias{summarizeOverlaps,GRanges,GRangesList-method} \alias{summarizeOverlaps,GRangesList,GRangesList-method} \alias{Union} \alias{IntersectionStrict} \alias{IntersectionNotEmpty} \alias{summarizeOverlaps,GRanges,BamFile-method} \alias{summarizeOverlaps,GRangesList,BamFile-method} \alias{summarizeOverlaps,GRanges,character-method} \alias{summarizeOverlaps,GRangesList,character-method} \alias{summarizeOverlaps,GRanges,BamFileList-method} \alias{summarizeOverlaps,GRangesList,BamFileList-method} \alias{summarizeOverlaps,BamViews,missing-method} \title{Perform overlap queries between reads and genomic features} \description{ \code{summarizeOverlaps} extends \code{findOverlaps} by providing options to resolve reads that overlap multiple features. } \usage{ \S4method{summarizeOverlaps}{GRanges,GAlignments}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{GRangesList,GAlignments}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{GRanges,GRanges}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{GRangesList,GRanges}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{GRanges,GAlignmentPairs}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{GRangesList,GAlignmentPairs}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) ## mode funtions Union(features, reads, ignore.strand=FALSE, inter.feature=TRUE) IntersectionStrict(features, reads, ignore.strand=FALSE, inter.feature=TRUE) IntersectionNotEmpty(features, reads, ignore.strand=FALSE, inter.feature=TRUE) \S4method{summarizeOverlaps}{GRanges,BamFile}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{BamViews,missing}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) } \arguments{ \item{features}{ A \link[GenomicRanges]{GRanges} or a \link[GenomicRanges]{GRangesList} object of genomic regions of interest. When a \link[GenomicRanges]{GRanges} is supplied, each row is considered a feature. When a \link[GenomicRanges]{GRangesList} is supplied, each higher list-level is considered a feature. This distinction is important when defining overlaps. When \code{features} is a \link[Rsamtools]{BamViews} the \code{reads} argument is missing. Features are extracted from the \code{bamRanges} and the \code{reads} from \code{bamPaths}. Metadata from \code{bamPaths} and \code{bamSamples} are stored in the \code{colData} of the resulting \link[SummarizedExperiment]{RangedSummarizedExperiment} object. \code{bamExperiment} metadata are stored in the \code{metadata} slot. } \item{reads}{ A \link[GenomicRanges]{GRanges}, \link[GenomicRanges]{GRangesList} \link{GAlignments}, \link{GAlignmentsList}, \link{GAlignmentPairs}, \link[Rsamtools]{BamViews} or \link[Rsamtools]{BamFileList} object that represents the data to be counted by \code{summarizeOverlaps}. \code{reads} is missing when a \link[Rsamtools]{BamViews} object is the only argument supplied to \code{summarizeOverlaps}. \code{reads} are the files specified in \code{bamPaths} of the \link[Rsamtools]{BamViews} object. } \item{mode}{ \code{mode} can be one of the pre-defined count methods such as "Union", "IntersectionStrict", or "IntersectionNotEmpty" or it a user supplied count function. For a custom count function, the input arguments must match those of the pre-defined options and the function must return a vector of counts the same length as the annotation ('features' argument). See examples for details. The pre-defined options are designed after the counting modes available in the HTSeq package by Simon Anders (see references). \itemize{ \item "Union" : (Default) Reads that overlap any portion of exactly one feature are counted. Reads that overlap multiple features are discarded. This is the most conservative of the 3 modes. \item "IntersectionStrict" : A read must fall completely "within" the feature to be counted. If a read overlaps multiple features but falls "within" only one, the read is counted for that feature. If the read is "within" multiple features, the read is discarded. \item "IntersectionNotEmpty" : A read must fall in a unique disjoint region of a feature to be counted. When a read overlaps multiple features, the features are partitioned into disjoint intervals. Regions that are shared between the features are discarded leaving only the unique disjoint regions. If the read overlaps one of these remaining regions, it is assigned to the feature the unique disjoint region came from. \item user supplied function : A function can be supplied as the \code{mode} argument. It must (1) have arguments that correspond to \code{features}, \code{reads}, \code{ignore.strand} and \code{inter.feature} arguments (as in the defined mode functions) and (2) return a vector of counts the same length as \code{features}. } } \item{ignore.strand}{ A logical indicating if strand should be considered when matching. } \item{inter.feature}{ (Default TRUE) A logical indicating if the counting \code{mode} should be aware of overlapping features. When TRUE (default), reads mapping to multiple features are dropped (i.e., not counted). When FALSE, these reads are retained and a count is assigned to each feature they map to. There are 6 possible combinations of the \code{mode} and \code{inter.feature} arguments. When \code{inter.feature=FALSE} the behavior of modes \sQuote{Union} and \sQuote{IntersectionStrict} are essentially \sQuote{countOverlaps} with \sQuote{type=any} and \code{type=within}, respectively. \sQuote{IntersectionNotEmpty} does not reduce to a simple countOverlaps because common (shared) regions of the annotation are removed before counting. } \item{preprocess.reads}{ A function applied to the reads before counting. The first argument should be \code{reads} and the return value should be an object compatible with the \code{reads} argument to the counting modes, Union, IntersectionStrict and IntersectionNotEmpty. The distinction between a user-defined 'mode' and user-defined 'preprocess.reads' function is that in the first case the user defines how to count; in the second case the reads are preprocessed before counting with a pre-defined mode. See examples. } \item{...}{ Additional arguments passed to functions or methods called from within \code{summarizeOverlaps}. For BAM file methods arguments may include \code{singleEnd}, \code{fragments} or \code{param} which apply to reading records from a file (see below). Providing \code{count.mapped.reads=TRUE} include additional passes through the BAM file to collect statistics similar to those from \code{countBam}. A \code{BPPARAM} argument can be passed down to the \code{bplapply} called by \code{summarizeOverlaps}. The argument can be MulticoreParam(), SnowParam(), BatchJobsParam() or DoparParam(). See the BiocParallel package for details in specifying the params. } \item{singleEnd}{ (Default TRUE) A logical indicating if reads are single or paired-end. In Bioconductor > 2.12 it is not necessary to sort paired-end BAM files by \code{qname}. When counting with \code{summarizeOverlaps}, setting \code{singleEnd=FALSE} will trigger paired-end reading and counting. It is fine to also set \code{asMates=TRUE} in the \code{BamFile} but is not necessary when \code{singleEnd=FALSE}. } \item{fragments}{ (Default FALSE) A logical; applied to paired-end data only. \code{fragments} controls which function is used to read the data which subsequently affects which records are included in counting. When \code{fragments=FALSE}, data are read with \code{\link{readGAlignmentPairs}} and returned in a \code{GAlignmentPairs} class. In this case, singletons, reads with unmapped pairs, and other fragments, are dropped. When \code{fragments=TRUE}, data are read with \code{\link{readGAlignmentsList}} and returned in a \code{GAlignmentsList} class. This class holds \sQuote{mated pairs} as well as same-strand pairs, singletons, reads with unmapped pairs and other fragments. Because more records are kept, generally counts will be higher when \code{fragments=TRUE}. The term \sQuote{mated pairs} refers to records paired with the algorithm described on the \code{?\link{readGAlignmentsList}} man page. } \item{param}{An optional \code{\link[Rsamtools]{ScanBamParam}} instance to further influence scanning, counting, or filtering. See \code{?\link{BamFile}} for details of how records are returned when both \code{yieldSize} is specified in a \code{\link{BamFile}} and \code{which} is defined in a \code{\link{ScanBamParam}}. } } \details{ \describe{ \item{\code{summarizeOverlaps}:}{ offers counting modes to resolve reads that overlap multiple features. The \code{mode} argument defines a set of rules to resolve the read to a single feature such that each read is counted a maximum of once. New to GenomicRanges >= 1.13.9 is the \code{inter.feature} argument which allows reads to be counted for each feature they overlap. When \code{inter.feature=TRUE} the counting modes are aware of feature overlap; reads that overlap multiple features are dropped and not counted. When \code{inter.feature=FALSE} multiple feature overlap is ignored and reads are counted once for each feature they map to. This essentially reduces modes \sQuote{Union} and \sQuote{IntersectionStrict} to \code{countOverlaps} with \code{type="any"}, and \code{type="within"}, respectively. \sQuote{IntersectionNotEmpty} is not reduced to a derivative of \code{countOverlaps} because the shared regions are removed before counting. The \code{BamViews}, \code{BamFile} and \code{BamFileList} methods summarize overlaps across one or several files. The latter uses \code{bplapply}; control parallel evaluation using the \code{\link{register}} interface in the \pkg{BiocParallel} package. } \item{features :}{ A \sQuote{feature} can be any portion of a genomic region such as a gene, transcript, exon etc. When the \code{features} argument is a \link[GenomicRanges]{GRanges} the rows define the features. The result will be the same length as the \link[GenomicRanges]{GRanges}. When \code{features} is a \link[GenomicRanges]{GRangesList} the highest list-level defines the features and the result will be the same length as the \link[GenomicRanges]{GRangesList}. When \code{inter.feature=TRUE}, each count \code{mode} attempts to assign a read that overlaps multiple features to a single feature. If there are ranges that should be considered together (e.g., exons by transcript or cds regions by gene) the \link[GenomicRanges]{GRangesList} would be appropriate. If there is no grouping in the data then a \link[GenomicRanges]{GRanges} would be appropriate. } \item{paired-end reads :}{ Paired-end reads are counted as a single hit if one or both parts of the pair are overlapped. Paired-end records can be counted in a \link{GAlignmentPairs} container or BAM file. Counting pairs in BAM files: \itemize{ \item{The \code{singleEnd} argument should be FALSE.} \item{When \code{reads} are supplied as a BamFile or BamFileList, the \code{asMates} argument to the BamFile should be TRUE.} \item{When \code{fragments} is FALSE, a \code{GAlignmentPairs} object is used in counting (pairs only).} \item{When \code{fragments} is TRUE, a \code{GAlignmentsList} object is used in counting (pairs, singletons, unmapped mates, etc.)} } } } } \value{ A \link[SummarizedExperiment]{RangedSummarizedExperiment} object. The \code{assays} slot holds the counts, \code{rowRanges} holds the annotation from \code{features}. When \code{reads} is a \code{BamFile} or \code{BamFileList} \code{colData} is an empty DataFrame with a single row named \sQuote{counts}. If \code{count.mapped.reads=TRUE}, \code{colData} holds the output of \code{countBam} in 3 columns named \sQuote{records} (total records), \sQuote{nucleotides} and \sQuote{mapped} (mapped records). When \code{features} is a \code{BamViews} \code{colData} includes 2 columns named \code{bamSamples} and \code{bamIndices}. In all other cases, \code{colData} has columns of \sQuote{object} (class of reads) and \sQuote{records} (length of \code{reads}). } \references{ HTSeq : \url{http://www-huber.embl.de/users/anders/HTSeq/doc/overview.html} htseq-count : \url{http://www-huber.embl.de/users/anders/HTSeq/doc/count.html} } \author{Valerie Obenchain} \seealso{ \itemize{ \item The \pkg{DESeq2}, \pkg{DEXSeq} and \pkg{edgeR} packages. \item The \link[SummarizedExperiment]{RangedSummarizedExperiment} class defined in the \pkg{SummarizedExperiment} package. \item The \link{GAlignments} and \link{GAlignmentPairs} classes. \item The \link[Rsamtools]{BamFileList} and \link[Rsamtools]{BamViews} classes in the \pkg{Rsamtools} package. \item The \link{readGAlignments} and \link{readGAlignmentPairs} functions. } } \examples{ reads <- GAlignments( names = c("a","b","c","d","e","f","g"), seqnames = Rle(c(rep(c("chr1", "chr2"), 3), "chr1")), pos = as.integer(c(1400, 2700, 3400, 7100, 4000, 3100, 5200)), cigar = c("500M", "100M", "300M", "500M", "300M", "50M200N50M", "50M150N50M"), strand = strand(rep("+", 7))) gr <- GRanges( seqnames = c(rep("chr1", 7), rep("chr2", 4)), strand = "+", ranges = IRanges(c(1000, 3000, 3600, 4000, 4000, 5000, 5400, 2000, 3000, 7000, 7500), width = c(500, 500, 300, 500, 900, 500, 500, 900, 500, 600, 300), names=c("A", "B", "C1", "C2", "D1", "D2", "E", "F", "G", "H1", "H2"))) groups <- factor(c(1,2,3,3,4,4,5,6,7,8,8)) grl <- splitAsList(gr, groups) names(grl) <- LETTERS[seq_along(grl)] ## --------------------------------------------------------------------- ## Counting modes. ## --------------------------------------------------------------------- ## First count with a GRanges as the 'features'. 'Union' is the ## most conservative counting mode followed by 'IntersectionStrict' ## then 'IntersectionNotEmpty'. counts1 <- data.frame(union=assays(summarizeOverlaps(gr, reads))$counts, intStrict=assays(summarizeOverlaps(gr, reads, mode="IntersectionStrict"))$counts, intNotEmpty=assays(summarizeOverlaps(gr, reads, mode="IntersectionNotEmpty"))$counts) colSums(counts1) ## Split the 'features' into a GRangesList and count again. counts2 <- data.frame(union=assays(summarizeOverlaps(grl, reads))$counts, intStrict=assays(summarizeOverlaps(grl, reads, mode="IntersectionStrict"))$counts, intNotEmpty=assays(summarizeOverlaps(grl, reads, mode="IntersectionNotEmpty"))$counts) colSums(counts2) ## The GRangesList ('grl' object) has 8 features whereas the GRanges ## ('gr' object) has 11. The affect on counting can be seen by looking ## at feature 'H' with mode 'Union'. In the GRanges this feature is ## represented by ranges 'H1' and 'H2', gr[c("H1", "H2")] ## and by list element 'H' in the GRangesList, grl["H"] ## Read "d" hits both 'H1' and 'H2'. This is considered a multi-hit when ## using a GRanges (each range is a separate feature) so the read was ## dropped and not counted. counts1[c("H1", "H2"), ] ## When using a GRangesList, each list element is considered a feature. ## The read hits multiple ranges within list element 'H' but only one ## list element. This is not considered a multi-hit so the read is counted. counts2["H", ] ## --------------------------------------------------------------------- ## Counting multi-hit reads. ## --------------------------------------------------------------------- ## The goal of the counting modes is to provide a set of rules that ## resolve reads hitting multiple features so each read is counted ## a maximum of once. However, sometimes it may be desirable to count ## a read for each feature it overlaps. This can be accomplished by ## setting 'inter.feature' to FALSE. ## When 'inter.feature=FALSE', modes 'Union' and 'IntersectionStrict' ## essentially reduce to countOverlaps() with type="any" and ## type="within", respectively. ## When 'inter.feature=TRUE' only features "A", "F" and "G" have counts. se1 <- summarizeOverlaps(gr, reads, mode="Union", inter.feature=TRUE) assays(se1)$counts ## When 'inter.feature=FALSE' all 11 features have a count. There are ## 7 total reads so one or more reads were counted more than once. se2 <- summarizeOverlaps(gr, reads, mode="Union", inter.feature=FALSE) assays(se2)$counts ## --------------------------------------------------------------------- ## Counting BAM files. ## --------------------------------------------------------------------- library(pasillaBamSubset) library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) exbygene <- exonsBy(TxDb.Dmelanogaster.UCSC.dm3.ensGene, "gene") ## (i) Single-end : ## Large files can be iterated over in chunks by setting a ## 'yieldSize' on the BamFile. bf_s <- BamFile(untreated1_chr4(), yieldSize=50000) se_s <- summarizeOverlaps(exbygene, bf_s, singleEnd=TRUE) table(assays(se_s)$counts > 0) ## When a character (file name) is provided as 'reads' instead ## of a BamFile object summarizeOverlaps() will create a BamFile ## and set a reasonable default 'yieldSize'. ## (ii) Paired-end : ## A paired-end file may contain singletons, reads with unmapped ## pairs or reads with more than two fragments. When 'fragments=FALSE' ## only reads paired by the algorithm are included in the counting. nofrag <- summarizeOverlaps(exbygene, untreated3_chr4(), singleEnd=FALSE, fragments=FALSE) table(assays(nofrag)$counts > 0) ## When 'fragments=TRUE' all singletons, reads with unmapped pairs ## and other fragments will be included in the counting. bf <- BamFile(untreated3_chr4(), asMates=TRUE) frag <- summarizeOverlaps(exbygene, bf, singleEnd=FALSE, fragments=TRUE) table(assays(frag)$counts > 0) ## As expected, using 'fragments=TRUE' results in a larger number ## of total counts because singletons, unmapped pairs etc. are ## included in the counting. ## Total reads in the file: countBam(untreated3_chr4()) ## Reads counted with 'fragments=FALSE': sum(assays(nofrag)$counts) ## Reads counted with 'fragments=TRUE': sum(assays(frag)$counts) ## --------------------------------------------------------------------- ## Use ouput of summarizeOverlaps() for differential expression analysis ## with DESeq2 or edgeR. ## --------------------------------------------------------------------- fls <- list.files(system.file("extdata", package="GenomicAlignments"), recursive=TRUE, pattern="*bam$", full=TRUE) names(fls) <- basename(fls) bf <- BamFileList(fls, index=character(), yieldSize=1000) genes <- GRanges( seqnames = c(rep("chr2L", 4), rep("chr2R", 5), rep("chr3L", 2)), ranges = IRanges(c(1000, 3000, 4000, 7000, 2000, 3000, 3600, 4000, 7500, 5000, 5400), width=c(rep(500, 3), 600, 900, 500, 300, 900, 300, 500, 500))) se <- summarizeOverlaps(genes, bf) ## When the reads are BAM files, the 'colData' contains summary ## information from a call to countBam(). colData(se) ## Start differential expression analysis with the DESeq2 or edgeR ## package: library(DESeq2) deseq <- DESeqDataSet(se, design= ~ 1) library(edgeR) edger <- DGEList(assays(se)$counts, group=rownames(colData(se))) ## --------------------------------------------------------------------- ## Filter records by map quality before counting. ## (user-supplied 'mode' function) ## --------------------------------------------------------------------- ## The 'mode' argument can take a custom count function whose ## arguments are the same as those in the current counting modes ## (i.e., Union, IntersectionNotEmpty, IntersectionStrict). ## In this example records are filtered by map quality before counting. mapq_filter <- function(features, reads, ignore.strand, inter.feature) { require(GenomicAlignments) # needed for parallel evaluation Union(features, reads[mcols(reads)$mapq >= 20], ignore.strand, inter.feature) } genes <- GRanges("seq1", IRanges(seq(1, 1500, by=200), width=100)) param <- ScanBamParam(what="mapq") fl <- system.file("extdata", "ex1.bam", package="Rsamtools") se <- summarizeOverlaps(genes, fl, mode=mapq_filter, param=param) assays(se)$counts ## The count function can be completely custom (i.e., not use the ## pre-defined count functions at all). Requirements are that ## the input arguments match the pre-defined modes and the output ## is a vector of counts the same length as 'features'. my_count <- function(features, reads, ignore.strand, inter.feature) { ## perform filtering, or subsetting etc. require(GenomicAlignments) # needed for parallel evaluation countOverlaps(features, reads) } ## --------------------------------------------------------------------- ## Preprocessing reads before counting with a standard count mode. ## (user-supplied 'preprocess.reads' function) ## --------------------------------------------------------------------- ## The 'preprocess.reads' argument takes a function that is ## applied to the reads before counting with a pre-defined mode. ResizeReads <- function(reads, width=1, fix="start", ...) { reads <- as(reads, "GRanges") stopifnot(all(strand(reads) != "*")) resize(reads, width=width, fix=fix, ...) } ## By default ResizeReads() counts reads that overlap on the 5' end: summarizeOverlaps(grl, reads, mode=Union, preprocess.reads=ResizeReads) ## Count reads that overlap on the 3' end by passing new values ## for 'width' and 'fix': summarizeOverlaps(grl, reads, mode=Union, preprocess.reads=ResizeReads, width=1, fix="end") ## --------------------------------------------------------------------- ## summarizeOverlaps() with BamViews. ## --------------------------------------------------------------------- ## bamSamples and bamPaths metadata are included in the colData. ## bamExperiment metadata is put into the metadata slot. fl <- system.file("extdata", "ex1.bam", package="Rsamtools", mustWork=TRUE) rngs <- GRanges(c("seq1", "seq2"), IRanges(1, c(1575, 1584))) samp <- DataFrame(info="test", row.names="ex1") view <- BamViews(fl, bamSamples=samp, bamRanges=rngs) se <- summarizeOverlaps(view, mode=Union, ignore.strand=TRUE) colData(se) metadata(se) } \keyword{methods} \keyword{utilities} GenomicAlignments/src/0000755000175200017520000000000014551577536016010 5ustar00biocbuildbiocbuildGenomicAlignments/src/GenomicAlignments.h0000644000175200017520000000335514516004601021545 0ustar00biocbuildbiocbuild#include /* cigar_utils.c */ const char *_get_cigar_parsing_error(); int _next_cigar_OP( const char *cigar_string, int offset, char *OP, int *OPL ); SEXP valid_cigar( SEXP cigar, SEXP ans_type ); SEXP explode_cigar_ops( SEXP cigar, SEXP ops ); SEXP explode_cigar_op_lengths( SEXP cigar, SEXP ops ); SEXP cigar_op_table(SEXP cigar); SEXP cigar_ranges( SEXP cigar, SEXP flag, SEXP space, SEXP pos, SEXP f, SEXP ops, SEXP drop_empty_ranges, SEXP reduce_ranges, SEXP with_ops ); SEXP cigar_width( SEXP cigar, SEXP flag, SEXP space ); SEXP cigar_narrow( SEXP cigar, SEXP left_width, SEXP right_width ); SEXP cigar_qnarrow( SEXP cigar, SEXP left_qwidth, SEXP right_qwidth ); /* coordinate_mapping_methods.c */ SEXP map_query_locs_to_ref_locs( SEXP start, SEXP end, SEXP cigar, SEXP pos ); SEXP map_ref_locs_to_query_locs( SEXP start, SEXP end, SEXP cigar, SEXP pos ); SEXP ref_locs_to_query_locs( SEXP ref_locs, SEXP cigar, SEXP pos, SEXP narrow_left ); SEXP query_locs_to_ref_locs( SEXP query_locs, SEXP cigar, SEXP pos, SEXP narrow_left ); /* encodeOverlaps_methods.c */ SEXP encode_overlaps1( SEXP query_start, SEXP query_width, SEXP query_space, SEXP query_break, SEXP flip_query, SEXP subject_start, SEXP subject_width, SEXP subject_space, SEXP as_matrix, SEXP as_raw ); SEXP RangesList_encode_overlaps( SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces ); SEXP Hits_encode_overlaps( SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces, SEXP query_hits, SEXP subject_hits, SEXP flip_query ); GenomicAlignments/src/IRanges_stubs.c0000644000175200017520000000003414516004601020674 0ustar00biocbuildbiocbuild#include "_IRanges_stubs.c" GenomicAlignments/src/R_init_GenomicAlignments.c0000644000175200017520000000221414516004601023035 0ustar00biocbuildbiocbuild#include "GenomicAlignments.h" #include #define CALLMETHOD_DEF(fun, numArgs) {#fun, (DL_FUNC) &fun, numArgs} #define REGISTER_CCALLABLE(fun) \ R_RegisterCCallable("GenomicAlignments", #fun, (DL_FUNC) &fun) static const R_CallMethodDef callMethods[] = { /* cigar_utils.c */ CALLMETHOD_DEF(valid_cigar, 2), CALLMETHOD_DEF(explode_cigar_ops, 2), CALLMETHOD_DEF(explode_cigar_op_lengths, 2), CALLMETHOD_DEF(cigar_op_table, 1), CALLMETHOD_DEF(cigar_ranges, 9), CALLMETHOD_DEF(cigar_width, 3), CALLMETHOD_DEF(cigar_narrow, 3), CALLMETHOD_DEF(cigar_qnarrow, 3), /* mapping_methods.c */ CALLMETHOD_DEF(map_query_locs_to_ref_locs, 4), CALLMETHOD_DEF(map_ref_locs_to_query_locs, 4), CALLMETHOD_DEF(ref_locs_to_query_locs, 4), CALLMETHOD_DEF(query_locs_to_ref_locs, 4), /* encodeOverlaps_methods.c */ CALLMETHOD_DEF(encode_overlaps1, 10), CALLMETHOD_DEF(RangesList_encode_overlaps, 7), CALLMETHOD_DEF(Hits_encode_overlaps, 10), {NULL, NULL, 0} }; void R_init_GenomicAlignments(DllInfo *info) { R_registerRoutines(info, NULL, callMethods, NULL, NULL); /* cigar_utils.c */ REGISTER_CCALLABLE(_next_cigar_OP); return; } GenomicAlignments/src/S4Vectors_stubs.c0000644000175200017520000000003614516004601021202 0ustar00biocbuildbiocbuild#include "_S4Vectors_stubs.c" GenomicAlignments/src/cigar_utils.c0000644000175200017520000007564614516004601020456 0ustar00biocbuildbiocbuild#include "GenomicAlignments.h" #include "IRanges_interface.h" #include "S4Vectors_interface.h" #include /* for isdigit() */ /* The 8 supported spaces. */ #define REFERENCE 1 #define REFERENCE_N_REGIONS_REMOVED 2 #define QUERY 3 #define QUERY_BEFORE_HARD_CLIPPING 4 #define QUERY_AFTER_SOFT_CLIPPING 5 #define PAIRWISE 6 #define PAIRWISE_N_REGIONS_REMOVED 7 #define PAIRWISE_DENSE 8 static char errmsg_buf[200]; const char *_get_cigar_parsing_error() { return errmsg_buf; } /* Return the number of chars that was read, or 0 if there is no more char to read (i.e. cigar_string[offset] is '\0'), or -1 in case of a parse error (in which case _get_cigar_parsing_error() can be used to get a pointer to the error message). Zero-length operations are ignored. */ int _next_cigar_OP(const char *cigar_string, int offset, char *OP, int *OPL) { char c; int offset0, opl; if (!cigar_string[offset]) return 0; offset0 = offset; do { /* Extract *OPL */ opl = 0; while (isdigit(c = cigar_string[offset])) { offset++; opl *= 10; opl += c - '0'; } /* Extract *OP */ if (!(*OP = cigar_string[offset])) { snprintf(errmsg_buf, sizeof(errmsg_buf), "unexpected CIGAR end after char %d", offset); return -1; } offset++; } while (opl == 0); *OPL = opl; return offset - offset0; } /* Return the number of chars that was read, or 0 if there is no more char to read (i.e. offset is 0), or -1 in case of a parse error. Zero-length operations are ignored. */ static int prev_cigar_OP(const char *cigar_string, int offset, char *OP, int *OPL) { char c; int offset0, opl, powof10; if (offset == 0) return 0; offset0 = offset; do { /* Extract *OP */ offset--; *OP = cigar_string[offset]; /* Extract *OPL */ if (offset == 0) { snprintf(errmsg_buf, sizeof(errmsg_buf), "no CIGAR operation length before char %d", offset + 1); return -1; } offset--; opl = 0; powof10 = 1; while (offset >= 0 && isdigit(c = cigar_string[offset])) { opl += (c - '0') * powof10; powof10 *= 10; offset--; } offset++; } while (opl == 0); *OPL = opl; return offset0 - offset; } static int ops_lkup_table[256]; static void init_ops_lkup_table(SEXP ops) { int ops_len, i; SEXP ops_elt; char OP; if (ops == R_NilValue) { for (i = 0; i < 256; i++) ops_lkup_table[i] = 1; return; } for (i = 0; i < 256; i++) ops_lkup_table[i] = 0; ops_len = LENGTH(ops); for (i = 0; i < ops_len; i++) { ops_elt = STRING_ELT(ops, i); if (ops_elt == NA_STRING || LENGTH(ops_elt) == 0) error("'ops' contains NAs and/or empty strings"); OP = CHAR(ops_elt)[0]; ops_lkup_table[(unsigned char) OP] = 1; } return; } static int is_in_ops(char OP) { return ops_lkup_table[(unsigned char) OP]; } static int is_visible_in_space(char OP, int space) { if (OP == 'M') return 1; switch (space) { case QUERY_BEFORE_HARD_CLIPPING: if (OP == 'H') return 1; /* fall through */ case QUERY: if (OP == 'S') return 1; /* fall through */ case QUERY_AFTER_SOFT_CLIPPING: if (OP == 'I') return 1; break; case PAIRWISE: if (OP == 'I') return 1; /* fall through */ case REFERENCE: if (OP == 'D' || OP == 'N') return 1; break; case PAIRWISE_N_REGIONS_REMOVED: if (OP == 'I') return 1; /* fall through */ case REFERENCE_N_REGIONS_REMOVED: if (OP == 'D') return 1; } if (OP == '=' || OP == 'X') return 1; return 0; } static void drop_or_append_or_merge_range(int start, int width, int drop_empty_range, int merge_range, int nelt0, IntPairAE *range_buf, const char *OP, CharAEAE *OP_buf) { int buf_nelt, buf_nelt_minus_1, prev_end_plus_1; CharAE *OP_buf_new_elt, *OP_buf_prev_elt; if (drop_empty_range && width == 0) /* Drop. */ return; buf_nelt = IntPairAE_get_nelt(range_buf); if (merge_range && buf_nelt > nelt0) { /* The incoming range should never overlap with the previous incoming range i.e. 'start' should always be > the end of the previous incoming range. */ buf_nelt_minus_1 = buf_nelt - 1; prev_end_plus_1 = range_buf->a->elts[buf_nelt_minus_1] + range_buf->b->elts[buf_nelt_minus_1]; if (start == prev_end_plus_1) { /* Merge. */ range_buf->b->elts[buf_nelt_minus_1] += width; if (OP_buf != NULL) { OP_buf_prev_elt = OP_buf->elts[buf_nelt_minus_1]; CharAE_insert_at(OP_buf_prev_elt, CharAE_get_nelt(OP_buf_prev_elt), *OP); } return; } } /* Append. */ IntPairAE_insert_at(range_buf, buf_nelt, start, width); if (OP_buf != NULL) { OP_buf_new_elt = new_CharAE(1); CharAE_insert_at(OP_buf_new_elt, 0, *OP); CharAEAE_insert_at(OP_buf, buf_nelt, OP_buf_new_elt); } return; } /* Make sure init_ops_lkup_table() is called before parse_cigar_ranges(). */ static const char *parse_cigar_ranges(const char *cigar_string, int space, int pos, int drop_empty_ranges, int reduce_ranges, IntPairAE *range_buf, CharAEAE *OP_buf) { int buf_nelt0, cigar_offset, n, OPL /* Operation Length */, start, width; char OP /* Operation */; buf_nelt0 = IntPairAE_get_nelt(range_buf); cigar_offset = 0; start = pos; while ((n = _next_cigar_OP(cigar_string, cigar_offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); width = is_visible_in_space(OP, space) ? OPL : 0; if (is_in_ops(OP)) drop_or_append_or_merge_range(start, width, drop_empty_ranges, reduce_ranges, buf_nelt0, range_buf, &OP, OP_buf); start += width; cigar_offset += n; } return NULL; } static const char *parse_cigar_width(const char *cigar_string, int space, int *width) { int cigar_offset, n, OPL /* Operation Length */; char OP /* Operation */; *width = cigar_offset = 0; while ((n = _next_cigar_OP(cigar_string, cigar_offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); if (is_visible_in_space(OP, space)) *width += OPL; cigar_offset += n; } return NULL; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * cigar: character vector containing the extended CIGAR string for each * read; * ans_type: a single integer specifying the type of answer to return: * 0: 'ans' is a string describing the first validity failure or NULL; * 1: 'ans' is logical vector with TRUE values for valid elements * in 'cigar'. */ SEXP valid_cigar(SEXP cigar, SEXP ans_type) { SEXP ans, cigar_elt; int cigar_len, ans_type0, i, width; const char *cigar_string, *errmsg; char string_buf[200]; cigar_len = LENGTH(cigar); ans_type0 = INTEGER(ans_type)[0]; if (ans_type0 == 1) PROTECT(ans = NEW_LOGICAL(cigar_len)); else ans = R_NilValue; for (i = 0; i < cigar_len; i++) { cigar_elt = STRING_ELT(cigar, i); if (cigar_elt == NA_STRING) { if (ans_type0 == 1) LOGICAL(ans)[i] = 1; continue; } cigar_string = CHAR(cigar_elt); if (strcmp(cigar_string, "*") == 0) { if (ans_type0 == 1) LOGICAL(ans)[i] = 1; continue; } /* We use parse_cigar_width() here just for its ability to parse and detect ill-formed CIGAR strings */ errmsg = parse_cigar_width(cigar_string, 0L, &width); if (ans_type0 == 1) { LOGICAL(ans)[i] = errmsg == NULL; continue; } if (errmsg != NULL) { snprintf(string_buf, sizeof(string_buf), "element %d is invalid (%s)", i + 1, errmsg); return mkString(string_buf); } } if (ans_type0 == 1) UNPROTECT(1); return ans; } /**************************************************************************** * explode_cigar_ops() and explode_cigar_op_lengths() */ /* Make sure init_ops_lkup_table() is called before split_cigar_string(). */ static const char *split_cigar_string(const char *cigar_string, CharAE *OPbuf, IntAE *OPLbuf) { int offset, n, OPL /* Operation Length */; char OP /* Operation */; offset = 0; while ((n = _next_cigar_OP(cigar_string, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); if (is_in_ops(OP)) { if (OPbuf != NULL) CharAE_insert_at(OPbuf, CharAE_get_nelt(OPbuf), OP); if (OPLbuf != NULL) IntAE_insert_at(OPLbuf, IntAE_get_nelt(OPLbuf), OPL); } offset += n; } return NULL; } /* --- .Call ENTRY POINTS --- * - explode_cigar_ops() * - explode_cigar_op_lengths() * Args: * cigar: character vector containing the extended CIGAR strings to * explode. * ops: NULL or a character vector containing the CIGAR operations to * actually consider. If NULL, then all CIGAR operations are * considered. * Both functions return a list of the same length as 'cigar' where each * list element is a character vector (for explode_cigar_ops()) or an integer * vector (for explode_cigar_op_lengths()). The 2 lists have the same shape, * that is, same length() and same elementNROWS(). The i-th character vector * in the list returned by explode_cigar_ops() contains one single-letter * string per CIGAR operation in 'cigar[i]'. The i-th integer vector in the * list returned by explode_cigar_op_lengths() contains the corresponding * CIGAR operation lengths. Zero-length operations or operations not listed * in 'ops' are ignored. */ SEXP explode_cigar_ops(SEXP cigar, SEXP ops) { SEXP ans, cigar_elt, ans_elt, ans_elt_elt; int cigar_len, ans_elt_len, i, j; CharAE *OPbuf; const char *cigar_string, *errmsg; cigar_len = LENGTH(cigar); init_ops_lkup_table(ops); PROTECT(ans = NEW_LIST(cigar_len)); OPbuf = new_CharAE(0); for (i = 0; i < cigar_len; i++) { cigar_elt = STRING_ELT(cigar, i); if (cigar_elt == NA_STRING) { UNPROTECT(1); error("'cigar[%d]' is NA", i + 1); } cigar_string = CHAR(cigar_elt); if (strcmp(cigar_string, "*") == 0) { UNPROTECT(1); error("'cigar[%d]' is \"*\"", i + 1); } CharAE_set_nelt(OPbuf, 0); errmsg = split_cigar_string(cigar_string, OPbuf, NULL); if (errmsg != NULL) { UNPROTECT(1); error("in 'cigar[%d]': %s", i + 1, errmsg); } ans_elt_len = CharAE_get_nelt(OPbuf); PROTECT(ans_elt = NEW_CHARACTER(ans_elt_len)); for (j = 0; j < ans_elt_len; j++) { PROTECT(ans_elt_elt = mkCharLen(OPbuf->elts + j, 1)); SET_STRING_ELT(ans_elt, j, ans_elt_elt); UNPROTECT(1); } SET_VECTOR_ELT(ans, i, ans_elt); UNPROTECT(1); } UNPROTECT(1); return ans; } SEXP explode_cigar_op_lengths(SEXP cigar, SEXP ops) { SEXP ans, cigar_elt, ans_elt; int cigar_len, i; IntAE *OPLbuf; const char *cigar_string, *errmsg; cigar_len = LENGTH(cigar); init_ops_lkup_table(ops); PROTECT(ans = NEW_LIST(cigar_len)); OPLbuf = new_IntAE(0, 0, 0); for (i = 0; i < cigar_len; i++) { cigar_elt = STRING_ELT(cigar, i); if (cigar_elt == NA_STRING) { UNPROTECT(1); error("'cigar[%d]' is NA", i + 1); } cigar_string = CHAR(cigar_elt); if (strcmp(cigar_string, "*") == 0) { UNPROTECT(1); error("'cigar[%d]' is \"*\"", i + 1); } IntAE_set_nelt(OPLbuf, 0); errmsg = split_cigar_string(cigar_string, NULL, OPLbuf); if (errmsg != NULL) { UNPROTECT(1); error("in 'cigar[%d]': %s", i + 1, errmsg); } PROTECT(ans_elt = new_INTEGER_from_IntAE(OPLbuf)); SET_VECTOR_ELT(ans, i, ans_elt); UNPROTECT(1); } UNPROTECT(1); return ans; } /**************************************************************************** * cigar_op_table() */ static const char *cigar_string_op_table(SEXP cigar_string, const char *allOPs, int *table_row, int table_nrow) { const char *cig0, *tmp; int offset, n, OPL /* Operation Length */; char OP /* Operation */; if (cigar_string == NA_STRING) return "CIGAR string is NA"; if (LENGTH(cigar_string) == 0) return "CIGAR string is empty"; cig0 = CHAR(cigar_string); offset = 0; while ((n = _next_cigar_OP(cig0, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); tmp = strchr(allOPs, (int) OP); if (tmp == NULL) { snprintf(errmsg_buf, sizeof(errmsg_buf), "unknown CIGAR operation '%c' at char %d", OP, offset + 1); return errmsg_buf; } *(table_row + (tmp - allOPs) * table_nrow) += OPL; offset += n; } return NULL; } /* --- .Call ENTRY POINT --- * Args: * cigar: character vector containing the extended CIGAR string for each * read; * Return an integer matrix with the number of rows equal to the length of * 'cigar' and 9 columns, one for each extended CIGAR operation containing * a frequency count for the operations for each element of 'cigar'. */ SEXP cigar_op_table(SEXP cigar) { SEXP cigar_string, ans, ans_dimnames, ans_colnames; int cigar_len, allOPs_len, i, j, *ans_row; const char *allOPs = "MIDNSHP=X", *errmsg; char OPstrbuf[2]; cigar_len = LENGTH(cigar); allOPs_len = strlen(allOPs); PROTECT(ans = allocMatrix(INTSXP, cigar_len, allOPs_len)); memset(INTEGER(ans), 0, LENGTH(ans) * sizeof(int)); ans_row = INTEGER(ans); for (i = 0, ans_row = INTEGER(ans); i < cigar_len; i++, ans_row++) { cigar_string = STRING_ELT(cigar, i); if (cigar_string == NA_STRING) { INTEGER(ans)[i] = NA_INTEGER; continue; } errmsg = cigar_string_op_table(cigar_string, allOPs, ans_row, cigar_len); if (errmsg != NULL) { UNPROTECT(1); error("in 'cigar[%d]': %s", i + 1, errmsg); } } PROTECT(ans_colnames = NEW_CHARACTER(allOPs_len)); OPstrbuf[1] = '\0'; for (j = 0; j < allOPs_len; j++) { OPstrbuf[0] = allOPs[j]; SET_STRING_ELT(ans_colnames, j, mkChar(OPstrbuf)); } PROTECT(ans_dimnames = NEW_LIST(2)); SET_ELEMENT(ans_dimnames, 0, R_NilValue); SET_ELEMENT(ans_dimnames, 1, ans_colnames); SET_DIMNAMES(ans, ans_dimnames); UNPROTECT(3); return ans; } /**************************************************************************** * cigar_ranges() */ static SEXP make_list_of_IRanges(const IntPairAEAE *range_buf, SEXP names) { SEXP ans, ans_names; PROTECT(ans = new_list_of_IRanges_from_IntPairAEAE("IRanges", range_buf)); PROTECT(ans_names = duplicate(names)); SET_NAMES(ans, ans_names); UNPROTECT(2); return ans; } static SEXP make_CompressedIRangesList(const IntPairAE *range_buf, const CharAEAE *OP_buf, SEXP breakpoints) { SEXP ans, ans_unlistData, ans_unlistData_names, ans_partitioning; PROTECT(ans_unlistData = new_IRanges_from_IntPairAE("IRanges", range_buf)); if (OP_buf != NULL) { PROTECT(ans_unlistData_names = new_CHARACTER_from_CharAEAE(OP_buf)); set_IRanges_names(ans_unlistData, ans_unlistData_names); UNPROTECT(1); } PROTECT(ans_partitioning = new_PartitioningByEnd("PartitioningByEnd", breakpoints, NULL)); PROTECT(ans = new_CompressedList( "CompressedIRangesList", ans_unlistData, ans_partitioning)); UNPROTECT(3); return ans; } /* --- .Call ENTRY POINT --- * Args: * cigar: character vector containing extended CIGAR strings. * flag: NULL or an integer vector of the same length as 'cigar' * containing the SAM flag for each read. Serves only as a way to * indicate whether a read is mapped or not. According to the SAM * Spec v1.4, flag bit 0x4 is the only reliable place to tell * whether a segment (or read) is mapped (bit is 0) or not (bit is 1). * space: single integer indicating one of the 8 supported spaces (defined * at the top of this file). * pos: integer vector of the same length as 'cigar' (or of length 1) * containing the 1-based leftmost position/coordinate of the * clipped read sequences. * f: NULL or a factor of length 'cigar'. If NULL, then the ranges are * grouped by alignment and stored in a CompressedIRangesList object * with 1 list element per element in 'cigar'. If a factor, then they * are grouped by factor level and stored in an ordinary list of * IRanges objects with 1 list element per level in 'f' and named * with those levels. * ops: NULL or a character vector containing the CIGAR operations to * translate to ranges. If NULL, then all CIGAR operations are * translated. * drop_empty_ranges: TRUE or FALSE. * reduce_ranges: TRUE or FALSE. * with_ops: TRUE or FALSE indicating whether the returned ranges should be * named with their corresponding CIGAR operation. * * Returns either a CompressedIRangesList object of the same length as 'cigar' * (if 'f' is NULL) or an ordinary list of IRanges objects with 1 list element * per level in 'f' (if 'f' is a factor). This list is then turned into a * SimpleIRangesList object in R. */ SEXP cigar_ranges(SEXP cigar, SEXP flag, SEXP space, SEXP pos, SEXP f, SEXP ops, SEXP drop_empty_ranges, SEXP reduce_ranges, SEXP with_ops) { SEXP ans, ans_breakpoints, f_levels, cigar_elt; int cigar_len, space0, pos_len, f_is_NULL, ans_len, *breakpoint, drop_empty_ranges0, reduce_ranges0, with_ops0, i; IntPairAE *range_buf1; IntPairAEAE *range_buf2; CharAEAE *OP_buf; const int *flag_elt, *pos_elt, *f_elt; const char *cigar_string, *errmsg; cigar_len = LENGTH(cigar); if (flag != R_NilValue) flag_elt = INTEGER(flag); init_ops_lkup_table(ops); space0 = INTEGER(space)[0]; pos_len = LENGTH(pos); pos_elt = INTEGER(pos); f_is_NULL = f == R_NilValue; if (f_is_NULL) { ans_len = cigar_len; /* We will typically generate at least 'cigar_len' ranges. */ range_buf1 = new_IntPairAE(ans_len, 0); PROTECT(ans_breakpoints = NEW_INTEGER(ans_len)); breakpoint = INTEGER(ans_breakpoints); } else { f_levels = GET_LEVELS(f); ans_len = LENGTH(f_levels); range_buf2 = new_IntPairAEAE(ans_len, ans_len); f_elt = INTEGER(f); } drop_empty_ranges0 = LOGICAL(drop_empty_ranges)[0]; reduce_ranges0 = LOGICAL(reduce_ranges)[0]; with_ops0 = LOGICAL(with_ops)[0]; if (with_ops0 && f_is_NULL) { OP_buf = new_CharAEAE(cigar_len, 0); } else { OP_buf = NULL; } for (i = 0; i < cigar_len; i++) { if (flag != R_NilValue) { if (*flag_elt == NA_INTEGER) { if (f_is_NULL) UNPROTECT(1); error("'flag' contains NAs"); } if (*flag_elt & 0x004) { /* The CIGAR of an unmapped read doesn't produce any range i.e. it's treated as an empty CIGAR. */ goto for_tail; } } cigar_elt = STRING_ELT(cigar, i); if (cigar_elt == NA_STRING) { if (f_is_NULL) UNPROTECT(1); error("'cigar[%d]' is NA", i + 1); } cigar_string = CHAR(cigar_elt); if (strcmp(cigar_string, "*") == 0) { if (f_is_NULL) UNPROTECT(1); error("'cigar[%d]' is \"*\"", i + 1); } if (*pos_elt == NA_INTEGER || *pos_elt == 0) { if (f_is_NULL) UNPROTECT(1); error("'pos[%d]' is NA or 0", i + 1); } if (!f_is_NULL) { if (*f_elt == NA_INTEGER) error("'f[%d]' is NA", i + 1); range_buf1 = range_buf2->elts[*f_elt - 1]; } errmsg = parse_cigar_ranges(cigar_string, space0, *pos_elt, drop_empty_ranges0, reduce_ranges0, range_buf1, OP_buf); if (errmsg != NULL) { if (f_is_NULL) UNPROTECT(1); error("in 'cigar[%d]': %s", i + 1, errmsg); } for_tail: if (flag != R_NilValue) flag_elt++; if (pos_len != 1) pos_elt++; if (f_is_NULL) *(breakpoint++) = IntPairAE_get_nelt(range_buf1); else f_elt++; } if (!f_is_NULL) return make_list_of_IRanges(range_buf2, f_levels); PROTECT(ans = make_CompressedIRangesList(range_buf1, OP_buf, ans_breakpoints)); UNPROTECT(2); return ans; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * cigar, flag, space: see cigar_ranges() function above. * Return an integer vector of the same length as 'cigar' containing the * widths of the alignments as inferred from the cigar information. */ SEXP cigar_width(SEXP cigar, SEXP flag, SEXP space) { SEXP ans, cigar_elt; int cigar_len, space0, i, *ans_elt; const int *flag_elt; const char *cigar_string, *errmsg; cigar_len = LENGTH(cigar); if (flag != R_NilValue) flag_elt = INTEGER(flag); space0 = INTEGER(space)[0]; PROTECT(ans = NEW_INTEGER(cigar_len)); for (i = 0, ans_elt = INTEGER(ans); i < cigar_len; i++, ans_elt++) { if (flag != R_NilValue) { if (*flag_elt == NA_INTEGER) { UNPROTECT(1); error("'flag' contains NAs"); } if (*flag_elt & 0x004) { *ans_elt = NA_INTEGER; goto for_tail; } } cigar_elt = STRING_ELT(cigar, i); if (cigar_elt == NA_STRING) { *ans_elt = NA_INTEGER; goto for_tail; } cigar_string = CHAR(cigar_elt); if (strcmp(cigar_string, "*") == 0) { *ans_elt = NA_INTEGER; goto for_tail; } errmsg = parse_cigar_width(cigar_string, space0, ans_elt); if (errmsg != NULL) { UNPROTECT(1); error("in 'cigar[%d]': %s", i + 1, errmsg); } for_tail: if (flag != R_NilValue) flag_elt++; } UNPROTECT(1); return ans; } /**************************************************************************** * cigar_narrow() */ static const char *Lnarrow_cigar_string(SEXP cigar_string, int *Lwidth, int *Loffset, int *rshift) { const char *cig0; int offset, n, OPL /* Operation Length */; char OP /* Operation */; if (cigar_string == NA_STRING) return "CIGAR string is NA"; if (LENGTH(cigar_string) == 0) return "CIGAR string is empty"; cig0 = CHAR(cigar_string); *rshift = offset = 0; while ((n = _next_cigar_OP(cig0, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); switch (OP) { /* Alignment match (can be a sequence match or mismatch) */ case 'M': case '=': case 'X': if (*Lwidth < OPL) { *Loffset = offset; *rshift += *Lwidth; return NULL; } *Lwidth -= OPL; *rshift += OPL; break; /* Insertion to the reference or soft/hard clip on the read */ case 'I': case 'S': case 'H': break; /* Deletion (or skipped region) from the reference */ case 'D': case 'N': if (*Lwidth < OPL) *Lwidth = 0; else *Lwidth -= OPL; *rshift += OPL; break; /* Silent deletion from the padded reference */ case 'P': break; default: snprintf(errmsg_buf, sizeof(errmsg_buf), "unknown CIGAR operation '%c' at char %d", OP, offset + 1); return errmsg_buf; } offset += n; } snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after narrowing"); return errmsg_buf; } static const char *Rnarrow_cigar_string(SEXP cigar_string, int *Rwidth, int *Roffset) { const char *cig0; int offset, n, OPL /* Operation Length */; char OP /* Operation */; if (cigar_string == NA_STRING) return "CIGAR string is NA"; if (LENGTH(cigar_string) == 0) return "CIGAR string is empty"; cig0 = CHAR(cigar_string); offset = LENGTH(cigar_string); while ((n = prev_cigar_OP(cig0, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); offset -= n; switch (OP) { /* Alignment match (can be a sequence match or mismatch) */ case 'M': case '=': case 'X': if (*Rwidth < OPL) { *Roffset = offset; return NULL; } *Rwidth -= OPL; break; /* Insertion to the reference or soft/hard clip on the read */ case 'I': case 'S': case 'H': break; /* Deletion (or skipped region) from the reference */ case 'D': case 'N': if (*Rwidth < OPL) *Rwidth = 0; else *Rwidth -= OPL; break; /* Silent deletion from the padded reference */ case 'P': break; default: snprintf(errmsg_buf, sizeof(errmsg_buf), "unknown CIGAR operation '%c' at char %d", OP, offset + 1); return errmsg_buf; } } snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after narrowing"); return errmsg_buf; } #define CIGAR_BUF_LENGTH 250000 /* FIXME: 'cigar_buf' is under the risk of a buffer overflow! */ static const char *narrow_cigar_string(SEXP cigar_string, int Lwidth, int Rwidth, char *cigar_buf, int *rshift) { int Loffset, Roffset, buf_offset; const char *cig0; int offset, n, OPL /* Operation Length */, ret; char OP /* Operation */; const char *errmsg; size_t size; //Rprintf("narrow_cigar_string():\n"); errmsg = Lnarrow_cigar_string(cigar_string, &Lwidth, &Loffset, rshift); if (errmsg != NULL) return errmsg; //Rprintf(" Lwidth=%d Loffset=%d *rshift=%d\n", // Lwidth, Loffset, *rshift); errmsg = Rnarrow_cigar_string(cigar_string, &Rwidth, &Roffset); if (errmsg != NULL) return errmsg; //Rprintf(" Rwidth=%d Roffset=%d\n", Rwidth, Roffset); if (Roffset < Loffset) { snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after narrowing"); return errmsg_buf; } buf_offset = 0; cig0 = CHAR(cigar_string); for (offset = Loffset; offset <= Roffset; offset += n) { n = _next_cigar_OP(cig0, offset, &OP, &OPL); if (offset == Loffset) OPL -= Lwidth; if (offset == Roffset) OPL -= Rwidth; if (OPL <= 0) { snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after narrowing"); return errmsg_buf; } size = CIGAR_BUF_LENGTH - buf_offset; ret = snprintf(cigar_buf + buf_offset, size, "%d%c", OPL, OP); if (ret >= size) { snprintf(errmsg_buf, sizeof(errmsg_buf), "'cigar_buf' overflow"); return errmsg_buf; } buf_offset += ret; } return NULL; } /* --- .Call ENTRY POINT --- */ SEXP cigar_narrow(SEXP cigar, SEXP left_width, SEXP right_width) { SEXP ans, ans_cigar, ans_cigar_string, ans_rshift, cigar_string; int cigar_len, i; static char cigar_buf[CIGAR_BUF_LENGTH]; const char *errmsg; cigar_len = LENGTH(cigar); PROTECT(ans_cigar = NEW_CHARACTER(cigar_len)); PROTECT(ans_rshift = NEW_INTEGER(cigar_len)); for (i = 0; i < cigar_len; i++) { cigar_string = STRING_ELT(cigar, i); if (cigar_string == NA_STRING) { SET_STRING_ELT(ans_cigar, i, NA_STRING); INTEGER(ans_rshift)[i] = NA_INTEGER; continue; } errmsg = narrow_cigar_string(cigar_string, INTEGER(left_width)[i], INTEGER(right_width)[i], cigar_buf, INTEGER(ans_rshift) + i); if (errmsg != NULL) { UNPROTECT(2); error("in 'cigar[%d]': %s", i + 1, errmsg); } PROTECT(ans_cigar_string = mkChar(cigar_buf)); SET_STRING_ELT(ans_cigar, i, ans_cigar_string); UNPROTECT(1); } PROTECT(ans = NEW_LIST(2)); SET_VECTOR_ELT(ans, 0, ans_cigar); SET_VECTOR_ELT(ans, 1, ans_rshift); UNPROTECT(3); return ans; } /**************************************************************************** * cigar_qnarrow() */ static const char *Lqnarrow_cigar_string(SEXP cigar_string, int *Lqwidth, int *Loffset, int *rshift) { const char *cig0; int offset, n, OPL /* Operation Length */; char OP /* Operation */; if (cigar_string == NA_STRING) return "CIGAR string is NA"; if (LENGTH(cigar_string) == 0) return "CIGAR string is empty"; cig0 = CHAR(cigar_string); *rshift = offset = 0; while ((n = _next_cigar_OP(cig0, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); switch (OP) { /* Alignment match (can be a sequence match or mismatch) */ case 'M': case '=': case 'X': if (*Lqwidth < OPL) { *Loffset = offset; *rshift += *Lqwidth; return NULL; } *Lqwidth -= OPL; *rshift += OPL; break; /* Insertion to the reference or soft/hard clip on the read */ case 'I': case 'S': case 'H': if (*Lqwidth < OPL) { *Loffset = offset; return NULL; } *Lqwidth -= OPL; break; /* Deletion (or skipped region) from the reference */ case 'D': case 'N': *rshift += OPL; break; /* Silent deletion from the padded reference */ case 'P': break; default: snprintf(errmsg_buf, sizeof(errmsg_buf), "unknown CIGAR operation '%c' at char %d", OP, offset + 1); return errmsg_buf; } offset += n; } snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after qnarrowing"); return errmsg_buf; } static const char *Rqnarrow_cigar_string(SEXP cigar_string, int *Rqwidth, int *Roffset) { const char *cig0; int offset, n, OPL /* Operation Length */; char OP /* Operation */; if (cigar_string == NA_STRING) return "CIGAR string is NA"; if (LENGTH(cigar_string) == 0) return "CIGAR string is empty"; cig0 = CHAR(cigar_string); offset = LENGTH(cigar_string); while ((n = prev_cigar_OP(cig0, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); offset -= n; switch (OP) { /* M, =, X, I, S, H */ case 'M': case '=': case 'X': case 'I': case 'S': case 'H': if (*Rqwidth < OPL) { *Roffset = offset; return NULL; } *Rqwidth -= OPL; break; /* Deletion (or skipped region) from the reference, or silent deletion from the padded reference */ case 'D': case 'N': case 'P': break; default: snprintf(errmsg_buf, sizeof(errmsg_buf), "unknown CIGAR operation '%c' at char %d", OP, offset + 1); return errmsg_buf; } } snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after qnarrowing"); return errmsg_buf; } /* FIXME: 'cigar_buf' is under the risk of a buffer overflow! */ static const char *qnarrow_cigar_string(SEXP cigar_string, int Lqwidth, int Rqwidth, char *cigar_buf, int *rshift) { int Loffset, Roffset, buf_offset; const char *cig0; int offset, n, OPL /* Operation Length */, ret; char OP /* Operation */; const char *errmsg; size_t size; //Rprintf("qnarrow_cigar_string():\n"); errmsg = Lqnarrow_cigar_string(cigar_string, &Lqwidth, &Loffset, rshift); if (errmsg != NULL) return errmsg; //Rprintf(" Lqwidth=%d Loffset=%d *rshift=%d\n", // Lqwidth, Loffset, *rshift); errmsg = Rqnarrow_cigar_string(cigar_string, &Rqwidth, &Roffset); if (errmsg != NULL) return errmsg; //Rprintf(" Rqwidth=%d Roffset=%d\n", Rqwidth, Roffset); if (Roffset < Loffset) { snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after qnarrowing"); return errmsg_buf; } buf_offset = 0; cig0 = CHAR(cigar_string); for (offset = Loffset; offset <= Roffset; offset += n) { n = _next_cigar_OP(cig0, offset, &OP, &OPL); if (offset == Loffset) OPL -= Lqwidth; if (offset == Roffset) OPL -= Rqwidth; if (OPL <= 0) { snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after qnarrowing"); return errmsg_buf; } size = CIGAR_BUF_LENGTH - buf_offset; ret = snprintf(cigar_buf + buf_offset, size, "%d%c", OPL, OP); if (ret >= size) { snprintf(errmsg_buf, sizeof(errmsg_buf), "'cigar_buf' overflow"); return errmsg_buf; } buf_offset += ret; } return NULL; } /* --- .Call ENTRY POINT --- * Return a list of 2 elements: 1st elt is the narrowed cigar vector, 2nd elt * is the 'rshift' vector i.e. the integer vector of the same length as 'cigar' * that would need to be added to the 'pos' field of a SAM/BAM file as a * consequence of this narrowing. */ SEXP cigar_qnarrow(SEXP cigar, SEXP left_qwidth, SEXP right_qwidth) { SEXP ans, ans_cigar, ans_cigar_string, ans_rshift, cigar_string; int cigar_len, i; static char cigar_buf[CIGAR_BUF_LENGTH]; const char *errmsg; cigar_len = LENGTH(cigar); PROTECT(ans_cigar = NEW_CHARACTER(cigar_len)); PROTECT(ans_rshift = NEW_INTEGER(cigar_len)); for (i = 0; i < cigar_len; i++) { cigar_string = STRING_ELT(cigar, i); if (cigar_string == NA_STRING) { SET_STRING_ELT(ans_cigar, i, NA_STRING); INTEGER(ans_rshift)[i] = NA_INTEGER; continue; } errmsg = qnarrow_cigar_string(cigar_string, INTEGER(left_qwidth)[i], INTEGER(right_qwidth)[i], cigar_buf, INTEGER(ans_rshift) + i); if (errmsg != NULL) { UNPROTECT(2); error("in 'cigar[%d]': %s", i + 1, errmsg); } PROTECT(ans_cigar_string = mkChar(cigar_buf)); SET_STRING_ELT(ans_cigar, i, ans_cigar_string); UNPROTECT(1); } PROTECT(ans = NEW_LIST(2)); SET_VECTOR_ELT(ans, 0, ans_cigar); SET_VECTOR_ELT(ans, 1, ans_rshift); UNPROTECT(3); return ans; } GenomicAlignments/src/coordinate_mapping_methods.c0000644000175200017520000002537014547043765023545 0ustar00biocbuildbiocbuild#include "GenomicAlignments.h" #include "IRanges_interface.h" #include "S4Vectors_interface.h" /**************************************************************************** * Mapping from genome (reference) to local space. */ /* Returns integer position of 'ref_loc' mapped to local space. * If 'ref_loc' cannot be mapped NA is returned. */ int to_query(int ref_loc, const char *cig0, int pos, Rboolean narrow_left) { int query_loc = ref_loc - pos + 1; int n, offset = 0, OPL, query_consumed = 0; char OP; while (query_consumed < query_loc && (n = _next_cigar_OP(cig0, offset, &OP, &OPL))) { switch (OP) { /* Alignment match (can be a sequence match or mismatch) */ case 'M': case '=': case 'X': query_consumed += OPL; break; /* Insertion to the reference */ case 'I': /* Soft clip on the read */ case 'S': query_loc += OPL; query_consumed += OPL; break; /* Deletion from the reference */ case 'D': /* Skipped region from reference; narrow to query */ case 'N': { Rboolean query_loc_past_gap = query_loc - query_consumed > OPL; if (query_loc_past_gap) { query_loc -= OPL; } else { if (narrow_left) { query_loc = query_consumed; } else { query_loc = query_consumed + 1; } } } break; /* Hard clip on the read */ case 'H': break; /* Silent deletion from the padded reference */ case 'P': break; default: break; } offset += n; } if (query_loc <= 0 || n == 0) query_loc = NA_INTEGER; return query_loc; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * ref_locs : global positions in the reference to map * cigar : character string containing the extended CIGAR; * pos : reference position at which the query alignment begins * (after clip) * narrow_left: whether to narrow to the left (or right) side of a gap * * Returns an integer vector of local query positions. This assumes the * reference positions actually occur in the read alignment region, * outside of any deletions or insertions. */ SEXP ref_locs_to_query_locs(SEXP ref_locs, SEXP cigar, SEXP pos, SEXP narrow_left) { int nlocs, i; SEXP query_locs; nlocs = LENGTH(ref_locs); PROTECT(query_locs = allocVector(INTSXP, nlocs)); for (i = 0; i < nlocs; i++) { const char *cig_i = CHAR(STRING_ELT(cigar, i)); INTEGER(query_locs)[i] = to_query(INTEGER(ref_locs)[i], cig_i, INTEGER(pos)[i], asLogical(narrow_left)); } UNPROTECT(1); return query_locs; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * ref_locs : global positions in the reference to map * cigar : character string containing the extended CIGAR; * pos : reference position at which the query alignment begins * (after clip) * narrow_left: whether to narrow to the left (or right) side of a gap * * Returns a list of length 4: * - start of local query position * - end of local query position * - index of 'start' used in match ('from_hits') * - index of 'pos' used in match ('to_hits') * All list elements are integer vectors. This assumes that the reference * positions actually occur in the read alignment region, outside of * any deletions or insertions. */ SEXP map_ref_locs_to_query_locs(SEXP start, SEXP end, SEXP cigar, SEXP pos) { SEXP ans, ans_start, ans_end, ans_qhits, ans_shits; IntAE *sbuf, *ebuf, *qhbuf, *shbuf; int i, j, s, e; int nlocs = LENGTH(start); int ncigar = LENGTH(cigar); sbuf = new_IntAE(0, 0, 0); ebuf = new_IntAE(0, 0, 0); qhbuf = new_IntAE(0, 0, 0); shbuf = new_IntAE(0, 0, 0); for (i = 0; i < nlocs; i++) { for (j = 0; j < ncigar; j++) { const char *cig_j = CHAR(STRING_ELT(cigar, j)); int pos_j = INTEGER(pos)[j]; s = to_query(INTEGER(start)[i], cig_j, pos_j, FALSE); if (s == NA_INTEGER) continue; e = to_query(INTEGER(end)[i], cig_j, pos_j, TRUE); if (e == NA_INTEGER) continue; IntAE_insert_at(sbuf, IntAE_get_nelt(sbuf), s); IntAE_insert_at(ebuf, IntAE_get_nelt(ebuf), e); IntAE_insert_at(qhbuf, IntAE_get_nelt(qhbuf), i + 1); IntAE_insert_at(shbuf, IntAE_get_nelt(shbuf), j + 1); } } PROTECT(ans = NEW_LIST(4)); PROTECT(ans_start = new_INTEGER_from_IntAE(sbuf)); PROTECT(ans_end = new_INTEGER_from_IntAE(ebuf)); PROTECT(ans_qhits = new_INTEGER_from_IntAE(qhbuf)); PROTECT(ans_shits = new_INTEGER_from_IntAE(shbuf)); SET_VECTOR_ELT(ans, 0, ans_start); SET_VECTOR_ELT(ans, 1, ans_end); SET_VECTOR_ELT(ans, 2, ans_qhits); SET_VECTOR_ELT(ans, 3, ans_shits); UNPROTECT(5); return ans; } /**************************************************************************** * Mapping from local to genome (reference) space. */ /* Returns integer position of 'query_loc' mapped to genome-based space. * If 'query_loc' cannot be mapped NA is returned. */ int to_ref(int query_loc, const char *cig0, int pos, Rboolean narrow_left) { int ref_loc = query_loc + pos - 1; int n, offset = 0, OPL, query_consumed = 0; char OP; while (query_consumed < query_loc && (n = _next_cigar_OP(cig0, offset, &OP, &OPL))) { switch (OP) { /* Alignment match (can be a sequence match or mismatch) */ case 'M': case '=': case 'X': query_consumed += OPL; break; /* Insertion to the reference */ case 'I': { int width_from_insertion_start = query_loc - query_consumed; Rboolean query_loc_past_insertion = width_from_insertion_start > OPL; if (query_loc_past_insertion) { ref_loc -= OPL; } else { ref_loc -= width_from_insertion_start; if (!narrow_left) { ref_loc += 1; } } query_consumed += OPL; break; } /* Soft clip on the read */ case 'S': query_consumed += OPL; break; /* Deletion from the reference */ case 'D': case 'N': /* Skipped region from reference; narrow to query */ ref_loc += OPL; break; /* Hard clip on the read */ case 'H': break; /* Silent deletion from the padded reference */ case 'P': break; default: break; } offset += n; } if (n == 0) ref_loc = NA_INTEGER; return ref_loc; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * query_locs: local positions in the read that we will map * cigar: character string containing the extended CIGAR; * pos: reference position at which the query alignment begins * (after clip) * narrow_left: whether to narrow to the left (or right) side of a gap * Returns an integer vector of local query positions. This assumes * that the reference positions actually occur in the read alignment region, * outside of any deletions or insertions. */ SEXP query_locs_to_ref_locs(SEXP query_locs, SEXP cigar, SEXP pos, SEXP narrow_left) { int nlocs, i; SEXP ref_locs; nlocs = LENGTH(query_locs); PROTECT(ref_locs = allocVector(INTSXP, nlocs)); for (i = 0; i < nlocs; i++) { const char *cig_i = CHAR(STRING_ELT(cigar, i)); INTEGER(ref_locs)[i] = to_ref(INTEGER(query_locs)[i], cig_i, INTEGER(pos)[i], asLogical(narrow_left)); } UNPROTECT(1); return ref_locs; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * query_locs: local positions in the read that we will map * cigar: character string containing the extended CIGAR; * pos: reference position at which the query alignment begins * (after clip) * narrow_left: whether to narrow to the left (or right) side of a gap * Returns a list of length 4: * - start of local query position * - end of local query position * - index of 'start' used in match ('from_hits') * - index of 'pos' used in match ('to_hits') * All list elements are integer vectors. This assumes that the reference * positions actually occur in the read alignment region, outside of * any deletions or insertions. */ SEXP map_query_locs_to_ref_locs(SEXP start, SEXP end, SEXP cigar, SEXP pos) { SEXP ans, ans_start, ans_end, ans_qhits, ans_shits; IntAE *sbuf, *ebuf, *qhbuf, *shbuf; int i, j, s, e, nlocs, ncigar; nlocs = LENGTH(start); ncigar = LENGTH(cigar); sbuf = new_IntAE(0, 0, 0); ebuf = new_IntAE(0, 0, 0); qhbuf = new_IntAE(0, 0, 0); shbuf = new_IntAE(0, 0, 0); for (i = 0; i < nlocs; i++) { for (j = 0; j < ncigar; j++) { const char *cig_j = CHAR(STRING_ELT(cigar, j)); int pos_j = INTEGER(pos)[j]; s = to_ref(INTEGER(start)[i], cig_j, pos_j, FALSE); if (s == NA_INTEGER) break; e = to_ref(INTEGER(end)[i], cig_j, pos_j, TRUE); if (e == NA_INTEGER) break; IntAE_insert_at(sbuf, IntAE_get_nelt(sbuf), s); IntAE_insert_at(ebuf, IntAE_get_nelt(ebuf), e); IntAE_insert_at(qhbuf, IntAE_get_nelt(qhbuf), i + 1); IntAE_insert_at(shbuf, IntAE_get_nelt(shbuf), j + 1); } } PROTECT(ans = NEW_LIST(4)); PROTECT(ans_start = new_INTEGER_from_IntAE(sbuf)); PROTECT(ans_end = new_INTEGER_from_IntAE(ebuf)); PROTECT(ans_qhits = new_INTEGER_from_IntAE(qhbuf)); PROTECT(ans_shits = new_INTEGER_from_IntAE(shbuf)); SET_VECTOR_ELT(ans, 0, ans_start); SET_VECTOR_ELT(ans, 1, ans_end); SET_VECTOR_ELT(ans, 2, ans_qhits); SET_VECTOR_ELT(ans, 3, ans_shits); UNPROTECT(5); return ans; } GenomicAlignments/src/encodeOverlaps_methods.c0000644000175200017520000003701014516004601022624 0ustar00biocbuildbiocbuild/**************************************************************************** * Encode overlaps * * Author: Herve Pages * ****************************************************************************/ #include "GenomicAlignments.h" #include "IRanges_interface.h" #include "S4Vectors_interface.h" /* * A low-level helper for "superficial" checking of the 'space' vector * associated with an IntegerRanges object. */ static const int *check_ranges_space(SEXP space, int len, const char *what) { if (space == R_NilValue) return NULL; if (!IS_INTEGER(space)) error("'%s_space' must be an integer vector or NULL", what); if (LENGTH(space) != len) error("when not NULL, '%s_space' must have " "the same length as 'start(%s)'", what, what); return INTEGER(space); } static void CharAE_append_char(CharAE *char_ae, char c, int times) { int i; for (i = 0; i < times; i++) CharAE_insert_at(char_ae, CharAE_get_nelt(char_ae), c); return; } static void CharAE_append_int(CharAE *char_ae, int d) { static char buf[12]; /* should be enough for 32-bit ints */ int ret; ret = snprintf(buf, sizeof(buf), "%d", d); if (ret < 0) /* should never happen */ error("GenomicAlignments internal error " "in CharAE_append_int(): " "snprintf() returned value < 0"); if (ret >= sizeof(buf)) /* could happen with ints > 32-bit */ error("GenomicAlignments internal error " "in CharAE_append_int(): " "output of snprintf() was truncated"); CharAE_append_string(char_ae, buf); return; } /* * A special 1-letter code 'X' is used for ranges that are not on the same * space. */ static char overlap_letter(int x_start, int x_width, int x_space, int y_start, int y_width, int y_space) { int code; if (x_space != y_space) return 'X'; code = overlap_code(x_start, x_width, y_start, y_width); if (x_space < 0) code = invert_overlap_code(code); return 'g' + code; } /* * q_start, q_width: int arrays of length q_len. No NAs. * q_space: NULL or an int array of length q_len. No NAs. * q_len: nb of ranges in the query. * q_break: 0 if all the ranges in the query are coming from the same * segment (single-end read), or, an int >= 1 and < q_len specifying * the position of the break between the ranges coming from one * segment and the ranges coming from the other if the query is a * paired-end read. * flip_query: if non-zero, then the query is "flipped" before the encoding is * computed. * s_start, s_width: int arrays of length s_len. No NAs. * s_space: NULL or an int array of length s_len. No NAs. * s_len: nb of ranges in the subject. * as_matrix, Loffset, Roffset: if as_matrix, then the full matrix of codes * is returned and the returned values for Loffset and Roffset are * undefined. Otherwise, the matrix is trimmed and the returned values * for Loffset and Roffset are the number of cols removed on the left * and right sides of the matrix, respectively. * out: character array containing the matrix of codes (possibly trimmed) */ static void unsafe_overlap_encoding( const int *q_start, const int *q_width, const int *q_space, int q_len, int q_break, int flip_query, const int *s_start, const int *s_width, const int *s_space, int s_len, int as_matrix, int *Loffset, int *Roffset, CharAE *out) { int out_nelt0, i, starti, widthi, spacei, j, startj, widthj, spacej, j1, j2, nrow; char letter; if (!as_matrix) { if (q_break != 0) { if (flip_query) { CharAE_append_int(out, q_len - q_break); CharAE_append_char(out, '-', 2); CharAE_append_int(out, q_break); } else { CharAE_append_int(out, q_break); CharAE_append_char(out, '-', 2); CharAE_append_int(out, q_len - q_break); } } else { CharAE_append_int(out, q_len); } CharAE_append_char(out, ':', 1); out_nelt0 = CharAE_get_nelt(out); } /* j1: 0-based index of first (i.e. leftmost) col with a non-"m", or 's_len' if there is no such col. j2: 0-based index of last (i.e. rightmost) col with a non-"a", or -1 if there is no such col. */ j1 = s_len; j2 = -1; /* Walk col by col. */ for (j = 0; j < s_len; j++) { startj = s_start[j]; widthj = s_width[j]; spacej = s_space == NULL ? 0 : s_space[j]; if (flip_query) { for (i = q_len - 1; i >= 0; i--) { starti = q_start[i]; widthi = q_width[i]; spacei = q_space == NULL ? 0 : - q_space[i]; letter = overlap_letter(starti, widthi, spacei, startj, widthj, spacej); CharAE_append_char(out, letter, 1); if (j1 == s_len && letter != 'm') j1 = j; if (letter != 'a') j2 = j; if (q_break != 0 && i == q_break) CharAE_append_char(out, '-', 2); } } else { for (i = 0; i < q_len; i++) { if (q_break != 0 && i == q_break) CharAE_append_char(out, '-', 2); starti = q_start[i]; widthi = q_width[i]; spacei = q_space == NULL ? 0 : q_space[i]; letter = overlap_letter(starti, widthi, spacei, startj, widthj, spacej); CharAE_append_char(out, letter, 1); if (j1 == s_len && letter != 'm') j1 = j; if (letter != 'a') j2 = j; } } } if (as_matrix) return; /* By making 'j2' a 1-based index we will then have 0 <= j1 <= j2 <= s_len, which will simplify further arithmetic/logic. */ if (q_len == 0) { /* A 0-row matrix needs special treatment. */ j2 = s_len; } else { j2++; } *Loffset = j1; *Roffset = s_len - j2; nrow = q_len; if (q_break != 0) nrow += 2; /* Remove "a"-cols on the right. */ CharAE_set_nelt(out, out_nelt0 + j2 * nrow); /* Remove "m"-cols on the left. */ CharAE_delete_at(out, out_nelt0, j1 * nrow); /* Insert ":" at the end of each remaining col. */ for (j = j2 - j1; j >= 1; j--) CharAE_insert_at(out, out_nelt0 + j * nrow, ':'); return; } static void overlap_encoding( SEXP query_start, SEXP query_width, SEXP query_space, int query_break, int flip_query, SEXP subject_start, SEXP subject_width, SEXP subject_space, int as_matrix, int *Loffset, int *Roffset, CharAE *out) { int q_len, s_len; const int *q_start, *q_width, *q_space, *s_start, *s_width, *s_space; q_len = check_integer_pairs(query_start, query_width, &q_start, &q_width, "start(query)", "width(query)"); if (query_break != 0 && (query_break < 1 || query_break >= q_len)) error("the position of the break in the query " "must be >= 1 and < length(query)"); q_space = check_ranges_space(query_space, q_len, "query"); s_len = check_integer_pairs(subject_start, subject_width, &s_start, &s_width, "start(subject)", "width(subject)"); s_space = check_ranges_space(subject_space, s_len, "subject"); unsafe_overlap_encoding(q_start, q_width, q_space, q_len, query_break, flip_query, s_start, s_width, s_space, s_len, as_matrix, Loffset, Roffset, out); return; } /* type: 0=CHARSXP, 1=STRSXP, 2=RAWSXP as_matrix: 0 or 1, ignored when type is 0 q_len, q_break, s_len: ignored when type is 0 */ static SEXP make_encoding_from_CharAE(const CharAE *buf, int type, int as_matrix, int q_len, int q_break, int s_len) { SEXP ans, ans_elt, ans_dim; int buf_nelt, i, nrow; buf_nelt = CharAE_get_nelt(buf); if (type == 0 || (type == 1 && !as_matrix)) { PROTECT(ans = mkCharLen(buf->elts, buf_nelt)); if (type == 1) { PROTECT(ans = ScalarString(ans)); UNPROTECT(1); } UNPROTECT(1); return ans; } if (type == 1) { PROTECT(ans = NEW_CHARACTER(buf_nelt)); for (i = 0; i < buf_nelt; i++) { PROTECT(ans_elt = mkCharLen(buf->elts + i, 1)); SET_STRING_ELT(ans, i, ans_elt); UNPROTECT(1); } } else { PROTECT(ans = new_RAW_from_CharAE(buf)); } if (as_matrix) { nrow = q_len; if (q_break != 0) nrow += 2; PROTECT(ans_dim = NEW_INTEGER(2)); INTEGER(ans_dim)[0] = nrow; INTEGER(ans_dim)[1] = s_len; SET_DIM(ans, ans_dim); UNPROTECT(1); } UNPROTECT(1); return ans; } static SEXP make_LIST_from_ovenc_parts(SEXP Loffset, SEXP Roffset, SEXP encoding) { SEXP ans, ans_names, ans_names_elt; PROTECT(ans = NEW_LIST(3)); PROTECT(ans_names = NEW_CHARACTER(3)); PROTECT(ans_names_elt = mkChar("Loffset")); SET_STRING_ELT(ans_names, 0, ans_names_elt); UNPROTECT(1); PROTECT(ans_names_elt = mkChar("Roffset")); SET_STRING_ELT(ans_names, 1, ans_names_elt); UNPROTECT(1); PROTECT(ans_names_elt = mkChar("encoding")); SET_STRING_ELT(ans_names, 2, ans_names_elt); UNPROTECT(1); SET_NAMES(ans, ans_names); UNPROTECT(1); SET_VECTOR_ELT(ans, 0, Loffset); SET_VECTOR_ELT(ans, 1, Roffset); SET_VECTOR_ELT(ans, 2, encoding); UNPROTECT(1); return ans; } /* --- .Call ENTRY POINT --- * 'query_start', 'query_width', 'query_space': integer vectors of the same * length M (or NULL for 'query_space'). * 'query_break': single integer. * 'subject_start', 'subject_width', 'subject_space': integer vectors of the * same length N (or NULL for 'subject_space'). * Integer vectors 'query_start', 'query_width', 'subject_start' and * 'subject_width' are assumed to be NA free. 'query_width' and 'subject_width' * are assumed to contain non-negative values. For efficiency reasons, those * assumptions are not checked. * Return the matrix of 1-letter codes (if 'as_matrix' is TRUE), otherwise a * named list with the 3 following components: * 1. Loffset: single integer; * 2. Roffset: single integer; * 3. encoding: the compact encoding as a single string (if 'as_raw' is * FALSE) or a raw vector (if 'as_raw' is TRUE). */ SEXP encode_overlaps1(SEXP query_start, SEXP query_width, SEXP query_space, SEXP query_break, SEXP flip_query, SEXP subject_start, SEXP subject_width, SEXP subject_space, SEXP as_matrix, SEXP as_raw) { int query_break0, flip_query0, as_matrix0, as_raw0, Loffset, Roffset; CharAE *buf; SEXP encoding, ans_Loffset, ans_Roffset, ans; query_break0 = INTEGER(query_break)[0]; flip_query0 = LOGICAL(flip_query)[0]; as_matrix0 = as_matrix != R_NilValue && LOGICAL(as_matrix)[0]; as_raw0 = as_raw != R_NilValue && LOGICAL(as_raw)[0]; buf = new_CharAE(0); overlap_encoding( query_start, query_width, query_space, query_break0, flip_query0, subject_start, subject_width, subject_space, as_matrix0, &Loffset, &Roffset, buf); PROTECT(encoding = make_encoding_from_CharAE(buf, as_raw0 ? 2 : 1, as_matrix0, LENGTH(query_start), query_break0, LENGTH(subject_start))); if (as_matrix0) { UNPROTECT(1); return encoding; } PROTECT(ans_Loffset = ScalarInteger(Loffset)); PROTECT(ans_Roffset = ScalarInteger(Roffset)); PROTECT(ans = make_LIST_from_ovenc_parts(ans_Loffset, ans_Roffset, encoding)); UNPROTECT(4); return ans; } static SEXP RangesList_encode_overlaps_ij( SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces, int i, int j, int flip_query, int *Loffset, int *Roffset, CharAE *buf) { SEXP query_start, query_width, query_space, subject_start, subject_width, subject_space; int query_break; query_start = VECTOR_ELT(query_starts, i); query_width = VECTOR_ELT(query_widths, i); if (query_spaces == R_NilValue) query_space = R_NilValue; else query_space = VECTOR_ELT(query_spaces, i); if (query_breaks == R_NilValue) query_break = 0; else query_break = INTEGER(query_breaks)[i]; subject_start = VECTOR_ELT(subject_starts, j); subject_width = VECTOR_ELT(subject_widths, j); if (subject_spaces == R_NilValue) subject_space = R_NilValue; else subject_space = VECTOR_ELT(subject_spaces, j); overlap_encoding( query_start, query_width, query_space, query_break, flip_query, subject_start, subject_width, subject_space, 0, Loffset, Roffset, buf); return make_encoding_from_CharAE(buf, 0, 0, 0, 0, 0); } /* --- .Call ENTRY POINT ---/ * 'query_starts', 'query_widths', 'query_spaces': lists of integer vectors. * The 3 lists are assumed to have the same length (M) and shape. * 'query_breaks': NULL or integer vector of length M. * 'subject_starts', 'subject_widths', 'subject_spaces': lists of integer * vectors. The 3 lists are assumed to have the same length (N) and shape. * Return a named list with the 3 following components (all of the same * length): * 1. Loffset: integer vector; * 2. Roffset: integer vector; * 3. encoding: character vector containing the compact encodings (type * II). */ SEXP RangesList_encode_overlaps(SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces) { int q_len, s_len, ans_len, i, j, k; SEXP ans_Loffset, ans_Roffset, ans_encoding, ans_encoding_elt, ans; CharAE *buf; /* TODO: Add some basic checking of the input values. */ q_len = LENGTH(query_starts); s_len = LENGTH(subject_starts); if (q_len == 0 || s_len == 0) ans_len = 0; else ans_len = q_len >= s_len ? q_len : s_len; PROTECT(ans_Loffset = NEW_INTEGER(ans_len)); PROTECT(ans_Roffset = NEW_INTEGER(ans_len)); PROTECT(ans_encoding = NEW_CHARACTER(ans_len)); buf = new_CharAE(0); for (i = j = k = 0; k < ans_len; i++, j++, k++) { if (i >= q_len) i = 0; /* recycle i */ if (j >= s_len) j = 0; /* recycle j */ PROTECT(ans_encoding_elt = RangesList_encode_overlaps_ij( query_starts, query_widths, query_spaces, query_breaks, subject_starts, subject_widths, subject_spaces, i, j, 0, INTEGER(ans_Loffset) + k, INTEGER(ans_Roffset) + k, buf)); SET_STRING_ELT(ans_encoding, k, ans_encoding_elt); UNPROTECT(1); CharAE_set_nelt(buf, 0); } if (ans_len != 0 && (i != q_len || j != s_len)) warning("longer object length is not a multiple " "of shorter object length"); PROTECT(ans = make_LIST_from_ovenc_parts(ans_Loffset, ans_Roffset, ans_encoding)); UNPROTECT(4); return ans; } /* --- .Call ENTRY POINT ---/ * Same arguments as RangesList_encode_overlaps() plus: * 'query_hits', 'subject_hits': integer vectors of the same length. * 'flip_query': logical vector of the same length as 'query_hits'. */ SEXP Hits_encode_overlaps(SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces, SEXP query_hits, SEXP subject_hits, SEXP flip_query) { int q_len, s_len, ans_len, i, j, k; const int *q_hits, *s_hits; SEXP ans_Loffset, ans_Roffset, ans_encoding, ans_encoding_elt, ans; CharAE *buf; /* TODO: Add some basic checking of the input values. */ q_len = LENGTH(query_starts); s_len = LENGTH(subject_starts); ans_len = check_integer_pairs(query_hits, subject_hits, &q_hits, &s_hits, "queryHits(hits)", "subjectHits(hits)"); PROTECT(ans_Loffset = NEW_INTEGER(ans_len)); PROTECT(ans_Roffset = NEW_INTEGER(ans_len)); PROTECT(ans_encoding = NEW_CHARACTER(ans_len)); buf = new_CharAE(0); for (k = 0; k < ans_len; k++) { i = q_hits[k]; j = s_hits[k]; if (i == NA_INTEGER || i < 1 || i > q_len || j == NA_INTEGER || j < 1 || j > s_len) { UNPROTECT(3); error("'queryHits(hits)' or 'subjectHits(hits)' " "contain invalid indices"); } i--; j--; PROTECT(ans_encoding_elt = RangesList_encode_overlaps_ij( query_starts, query_widths, query_spaces, query_breaks, subject_starts, subject_widths, subject_spaces, i, j, LOGICAL(flip_query)[k], INTEGER(ans_Loffset) + k, INTEGER(ans_Roffset) + k, buf)); SET_STRING_ELT(ans_encoding, k, ans_encoding_elt); UNPROTECT(1); CharAE_set_nelt(buf, 0); } PROTECT(ans = make_LIST_from_ovenc_parts(ans_Loffset, ans_Roffset, ans_encoding)); UNPROTECT(4); return ans; } GenomicAlignments/tests/0000755000175200017520000000000014516004601016336 5ustar00biocbuildbiocbuildGenomicAlignments/tests/run_unitTests.R0000644000175200017520000000015114516004601021344 0ustar00biocbuildbiocbuildrequire("GenomicAlignments") || stop("unable to load GenomicRanges package") GenomicAlignments:::.test() GenomicAlignments/vignettes/0000755000175200017520000000000014551577536017231 5ustar00biocbuildbiocbuildGenomicAlignments/vignettes/GenomicAlignmentsIntroduction.Rnw0000644000175200017520000001302614516004601025703 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{An Introduction to the GenomicAlignments Package} %\VignetteDepends{Rsamtools} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass[10pt]{article} \usepackage{times} \usepackage{hyperref} \textwidth=6.5in \textheight=8.5in %\parskip=.3cm \oddsidemargin=-.1in \evensidemargin=-.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\software}[1]{\textsf{#1}} \newcommand{\R}{\software{R}} \newcommand{\Bioconductor}{\software{Bioconductor}} \newcommand{\GenomicRanges}{\Rpackage{GenomicRanges}} \title{An Introduction to the GenomicAlignments Package} \author{Herv\'{e} Pag\`{e}s} \date{\today} \begin{document} \maketitle <>= options(width=72) @ \tableofcontents \section{Introduction} The \Rpackage{GenomicAlignments} package serves as the foundation for representing genomic alignments within the \software{Bioconductor} project. In the \software{Bioconductor} package hierarchy, it builds upon the \Rpackage{GenomicRanges} (infrastructure) package and provides support for many \software{Bioconductor} packages. This package defines three classes: \Rclass{GAlignments}, \Rclass{GAlignmentPairs}, and \Rclass{GAlignmentsList}), which are used to represent genomic alignments, pairs of genomic alignments, and groups of genomic alignments. The \Rpackage{GenomicAlignments} package is available at bioconductor.org and can be downloaded via \Rfunction{BiocManager::install}: <>= if (!require("BiocManager")) install.packages("BiocManager") BiocManager::install("GenomicAlignments") @ <>= library(GenomicAlignments) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignments}: Genomic Alignments} The \Rclass{GAlignments} class which is a container for storing a set of genomic alignments. The class is intended to support alignments in general, not only those coming from a 'Binary Alignment Map' or 'BAM' files. Also alignments with gaps in the reference sequence (a.k.a. \emph{gapped alignments}) are supported which, for example, makes the class suited for storing junction reads from an RNA-seq experiment. More precisely, a \Rclass{GAlignments} object is a vector-like object where each element describes an \emph{alignment}, that is, how a given sequence (called \emph{query} or \emph{read}, typically short) aligns to a reference sequence (typically long). As shown later in this document, a \Rclass{GAlignments} object can be created from a 'BAM' file. In that case, each element in the resulting object will correspond to a record in the file. One important thing to note though is that not all the information present in the BAM/SAM records is stored in the object. In particular, for now, we discard the query sequences (SEQ field), the query ids (QNAME field), the query qualities (QUAL), the mapping qualities (MAPQ) and any other information that is not needed in order to support the basic set of operations described in this document. This also means that multi-reads (i.e. reads with multiple hits in the reference) don't receive any special treatment i.e. the various SAM/BAM records corresponding to a multi-read will show up in the \Rclass{GAlignments} object as if they were coming from different/unrelated queries. Also paired-end reads will be treated as single-end reads and the pairing information will be lost. This might change in the future. \subsection{Load a `BAM' file into a \Rclass{GAlignments} object} First we use the \Rfunction{readGAlignments} function from the \Rpackage{GenomicAlignments} package to load a toy `BAM' file into a \Rclass{GAlignments} object: <>= library(GenomicAlignments) aln1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") aln1 <- readGAlignments(aln1_file) aln1 length(aln1) @ 3271 `BAM' records were loaded into the object. Note that \Rfunction{readGAlignments} would have discarded any `BAM' record describing an unaligned query (see description of the field in the SAM Format Specification \footnote{\url{http://samtools.sourceforge.net/SAM1.pdf}} for more information). The reader interested in tracking down these events can always use the \Rfunction{scanBam} function but this goes beyond the scope of this document. \subsection{Simple accessor methods} There is one accessor per field displayed by the \Rmethod{show} method and it has the same name as the field. All of them return a vector or factor of the same length as the object: <>= head(seqnames(aln1)) seqlevels(aln1) head(strand(aln1)) head(cigar(aln1)) head(qwidth(aln1)) head(start(aln1)) head(end(aln1)) head(width(aln1)) head(njunc(aln1)) @ \subsection{More accessor methods} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignmentPairs}: Pairs of Genomic Alignments} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignmentsList}: Groups of Genomic Alignments} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Session Information} All of the output in this vignette was produced under the following conditions: \begin{small} <>= sessionInfo() @ \end{small} \end{document} GenomicAlignments/vignettes/OverlapEncodings.Rnw0000644000175200017520000016240314516004601023144 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Overlap encodings} %\VignetteDepends{pasillaBamSubset, GenomicAlignments, GenomicFeatures, BSgenome.Dmelanogaster.UCSC.dm3, TxDb.Dmelanogaster.UCSC.dm3.ensGene} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Overlap encodings} \author{Herv\'e Pag\`es} \date{Last modified: December 2016; Compiled: \today} \begin{document} \maketitle <>= options(width=100) .precomputed_results_dir <- "precomputed_results" .loadPrecomputed <- function(objname) { filename <- paste0(objname, ".rda") path <- file.path(.precomputed_results_dir, filename) tempenv <- new.env(parent=emptyenv()) load(path, envir=tempenv) updateObject(get(objname, envir=tempenv)) } .checkIdenticalToPrecomputed <- function(obj, objname, ignore.metadata=FALSE) { precomputed_obj <- .loadPrecomputed(objname) if (ignore.metadata) metadata(obj) <- metadata(precomputed_obj) <- list() ## Replace NAs with FALSE in circularity flag (because having the flag set ## to NA instead of FALSE (or vice-versa) is not considered a significant ## difference between the 2 objects). isCircular(obj) <- isCircular(obj) %in% TRUE isCircular(precomputed_obj) <- isCircular(precomputed_obj) %in% TRUE if (!identical(obj, precomputed_obj)) stop("'", objname, "' is not identical to precomputed version") } @ \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In the context of an RNA-seq experiment, encoding the overlaps between the aligned reads and the transcripts can be used for detecting those overlaps that are ``splice compatible'', that is, compatible with the splicing of the transcript. Various tools are provided in the \Rpackage{GenomicAlignments} package for working with {\it overlap encodings}. In this vignette, we illustrate the use of these tools on the single-end and paired-end reads of an RNA-seq experiment. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Load reads from a BAM file} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load single-end reads from a BAM file} BAM file {\tt untreated1\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains single-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated1\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads): <>= library(pasillaBamSubset) untreated1_chr4() @ We use the \Rfunction{readGAlignments} function defined in the \Rpackage{GenomicAlignments} package to load the reads into a \Rclass{GAlignments} object. It's probably a good idea to get rid of the PCR or optical duplicates (flag bit 0x400 in the SAM format, see the SAM Spec \footnote{\url{http://samtools.sourceforge.net/}} for the details), as well as reads not passing quality controls (flag bit 0x200 in the SAM format). We do this by creating a \Rclass{ScanBamParam} object that we pass to \Rcode{readGAlignments} (see \Rcode{?ScanBamParam} in the \Rpackage{Rsamtools} package for the details). Note that we also use \Rcode{use.names=TRUE} in order to load the {\it query names} (aka {\it query template names}, see QNAME field in the SAM Spec) from the BAM file (\Rcode{readGAlignments} will use them to set the names of the returned object): <>= library(GenomicAlignments) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U1.GAL <- readGAlignments(untreated1_chr4(), use.names=TRUE, param=param0) head(U1.GAL) @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query} (i.e. per read stored in the input file, typically a FASTQ file), we shouldn't expect the names of \Rcode{U1.GAL} to be unique: <>= U1.GAL_names_is_dup <- duplicated(names(U1.GAL)) table(U1.GAL_names_is_dup) @ Storing the {\it query names} in a factor will be useful as we will see later in this document: <>= U1.uqnames <- unique(names(U1.GAL)) U1.GAL_qnames <- factor(names(U1.GAL), levels=U1.uqnames) @ Note that we explicitely provide the levels of the factor to enforce their order. Otherwise \Rcode{factor()} would put them in lexicographic order which is not advisable because it depends on the locale in use. Another object that will be useful to keep near at hand is the mapping between each {\it query name} and its first occurence in \Rcode{U1.GAL\_qnames}: <>= U1.GAL_dup2unq <- match(U1.GAL_qnames, U1.GAL_qnames) @ Our reads can have up to 2 {\it skipped regions} (a {\it skipped region} corresponds to an N operation in the CIGAR): <>= head(unique(cigar(U1.GAL))) table(njunc(U1.GAL)) @ Also, the following table indicates that indels were not allowed/supported during the alignment process (no I or D CIGAR operations): <>= colSums(cigarOpTable(cigar(U1.GAL))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load paired-end reads from a BAM file} BAM file {\tt untreated3\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains paired-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated3\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads). We use the \Rfunction{readGAlignmentPairs} function to load them into a \Rclass{GAlignmentPairs} object: <>= U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) @ The \Rcode{show} method for \Rclass{GAlignmentPairs} objects displays two {\tt ranges} columns, one for the {\it first} alignment in the pair (the left column), and one for the {\it last} alignment in the pair (the right column). The {\tt strand} column corresponds to the strand of the {\it first} alignment. <>= head(first(U3.galp)) head(last(U3.galp)) @ According to the SAM format specifications, the aligner is expected to mark each alignment pair as {\it proper} or not (flag bit 0x2 in the SAM format). The SAM Spec only says that a pair is {\it proper} if the {\it first} and {\it last} alignments in the pair are ``properly aligned according to the aligner''. So the exact criteria used for setting this flag is left to the aligner. We use \Rcode{isProperPair} to extract this flag from the \Rclass{GAlignmentPairs} object: <>= table(isProperPair(U3.galp)) @ Even though we could do {\it overlap encodings} with the full object, we keep only the {\it proper} pairs for our downstream analysis: <>= U3.GALP <- U3.galp[isProperPair(U3.galp)] @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query template} (i.e. per pair of sequences stored in the input files, typically 1 FASTQ file for the {\it first} ends and 1 FASTQ file for the {\it last} ends), we shouldn't expect the names of \Rcode{U3.GALP} to be unique: <>= U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) @ Storing the {\it query template names} in a factor will be useful: <>= U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) @ as well as having the mapping between each {\it query template name} and its first occurence in \Rcode{U3.GALP\_qnames}: <>= U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) @ Our reads can have up to 1 {\it skipped region} per end: <>= head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) @ Like for our single-end reads, the following tables indicate that indels were not allowed/supported during the alignment process: <>= colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Find all the overlaps between the reads and transcripts} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load the transcripts from a \Rclass{TxDb} object} In order to compute overlaps between reads and transcripts, we need access to the genomic positions of a set of known transcripts and their exons. It is essential that the reference genome of this set of transcripts and exons be {\bf exactly} the same as the reference genome used to align the reads. We could use the \Rfunction{makeTxDbFromUCSC} function defined in the \Rpackage{GenomicFeatures} package to make a \Rclass{TxDb} object containing the dm3 transcripts and their exons retrieved from the UCSC Genome Browser\footnote{\url{http://genome.ucsc.edu/cgi-bin/hgGateway}}. The Bioconductor project however provides a few annotation packages containing \Rclass{TxDb} objects for the most commonly studied organisms (those data packages are sometimes called the {\it TxDb} packages). One of them is the \Rpackage{TxDb.Dmelanogaster.\-UCSC.\-dm3.ensGene} package. It contains a \Rclass{TxDb} object that was made by pointing the \Rfunction{makeTxDbFromUCSC} function to the dm3 genome and {\it Ensembl Genes} track \footnote{See \url{http://genome.ucsc.edu/cgi-bin/hgTrackUi?hgsid=276880911&g=ensGene} for a description of this track.}. We can use it here: <>= library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) TxDb.Dmelanogaster.UCSC.dm3.ensGene txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene @ We extract the exons grouped by transcript in a \Rclass{GRangesList} object: <>= exbytx <- exonsBy(txdb, by="tx", use.names=TRUE) length(exbytx) # nb of transcripts @ <>= .checkIdenticalToPrecomputed(exbytx, "exbytx", ignore.metadata=TRUE) @ We check that all the exons in any given transcript belong to the same chromosome and strand. Knowing that our set of transcripts is free of this sort of trans-splicing events typically allows some significant simplifications during the downstream analysis \footnote{Dealing with trans-splicing events is not covered in this document.}. A quick and easy way to check this is to take advantage of the fact that \Rcode{seqnames} and \Rcode{strand} return \Rclass{RleList} objects. So we can extract the number of Rle runs for each transcript and make sure it's always 1: <>= table(elementNROWS(runLength(seqnames(exbytx)))) table(elementNROWS(runLength(strand(exbytx)))) @ Therefore the strand of any given transcript is unambiguously defined and can be extracted with: <>= exbytx_strand <- unlist(runValue(strand(exbytx)), use.names=FALSE) @ We will also need the mapping between the transcripts and their gene. We start by using \Rfunction{transcripts} to extract this information from our \Rclass{TxDb} object \Rcode{txdb}, and then we construct a named factor that represents the mapping: <>= tx <- transcripts(txdb, columns=c("tx_name", "gene_id")) head(tx) df <- mcols(tx) exbytx2gene <- as.character(df$gene_id) exbytx2gene <- factor(exbytx2gene, levels=unique(exbytx2gene)) names(exbytx2gene) <- df$tx_name exbytx2gene <- exbytx2gene[names(exbytx)] head(exbytx2gene) nlevels(exbytx2gene) # nb of genes @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Single-end overlaps} \subsubsection{Find the single-end overlaps} We are ready to compute the overlaps with the \Rfunction{findOverlaps} function. Note that the strand of the queries produced by the RNA-seq experiment is typically unknown so we use \Rcode{ignore.strand=TRUE}: <>= U1.OV00 <- findOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) @ \Rcode{U1.OV00} is a \Rclass{Hits} object that contains 1 element per overlap. Its length gives the number of overlaps: <>= length(U1.OV00) @ \subsubsection{Tabulate the single-end overlaps} We will repeatedly use the 2 following little helper functions to ``tabulate'' the overlaps in a given \Rclass{Hits} object (e.g. \Rcode{U1.OV00}), i.e. to count the number of overlaps for each element in the query or for each element in the subject: Number of transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_ntx <- countQueryHits(U1.OV00) mcols(U1.GAL)$ntx <- U1.GAL_ntx head(U1.GAL) table(U1.GAL_ntx) mean(U1.GAL_ntx >= 1) @ 76\% of the alignments in \Rcode{U1.GAL} have an overlap with at least 1 transcript in \Rcode{exbytx}. Note that \Rfunction{countOverlaps} can be used directly on \Rcode{U1.GAL} and \Rcode{exbytx} for computing \Rcode{U1.GAL\_ntx}: <>= U1.GAL_ntx_again <- countOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) stopifnot(identical(unname(U1.GAL_ntx_again), U1.GAL_ntx)) @ Because \Rcode{U1.GAL} can (and actually does) contain more than 1 alignment per {\it original query} (aka read), we also count the number of transcripts for each read: <>= U1.OV10 <- remapHits(U1.OV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ntx <- countQueryHits(U1.OV10) names(U1.uqnames_ntx) <- U1.uqnames table(U1.uqnames_ntx) mean(U1.uqnames_ntx >= 1) @ 78.4\% of the reads have an overlap with at least 1 transcript in \Rcode{exbytx}. Number of reads for each transcript: <>= U1.exbytx_nOV10 <- countSubjectHits(U1.OV10) names(U1.exbytx_nOV10) <- names(exbytx) mean(U1.exbytx_nOV10 >= 50) @ Only 0.869\% of the transcripts in \Rcode{exbytx} have an overlap with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_nOV10, decreasing=TRUE), n=10) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Paired-end overlaps} \subsubsection{Find the paired-end overlaps} Like with our single-end overlaps, we call \Rfunction{findOverlaps} with \Rcode{ignore.strand=TRUE}: <>= U3.OV00 <- findOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) @ Like \Rcode{U1.OV00}, \Rcode{U3.OV00} is a \Rclass{Hits} object. Its length gives the number of paired-end overlaps: <>= length(U3.OV00) @ \subsubsection{Tabulate the paired-end overlaps} Number of transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_ntx <- countQueryHits(U3.OV00) mcols(U3.GALP)$ntx <- U3.GALP_ntx head(U3.GALP) table(U3.GALP_ntx) mean(U3.GALP_ntx >= 1) @ 71\% of the alignment pairs in \Rcode{U3.GALP} have an overlap with at least 1 transcript in \Rcode{exbytx}. Note that \Rfunction{countOverlaps} can be used directly on \Rcode{U3.GALP} and \Rcode{exbytx} for computing \Rcode{U3.GALP\_ntx}: <>= U3.GALP_ntx_again <- countOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) stopifnot(identical(unname(U3.GALP_ntx_again), U3.GALP_ntx)) @ Because \Rcode{U3.GALP} can (and actually does) contain more than 1 alignment pair per {\it original query template}, we also count the number of transcripts for each template: <>= U3.OV10 <- remapHits(U3.OV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ntx <- countQueryHits(U3.OV10) names(U3.uqnames_ntx) <- U3.uqnames table(U3.uqnames_ntx) mean(U3.uqnames_ntx >= 1) @ 72.3\% of the templates have an overlap with at least 1 transcript in \Rcode{exbytx}. Number of templates for each transcript: <>= U3.exbytx_nOV10 <- countSubjectHits(U3.OV10) names(U3.exbytx_nOV10) <- names(exbytx) mean(U3.exbytx_nOV10 >= 50) @ Only 0.756\% of the transcripts in \Rcode{exbytx} have an overlap with at least 50 templates. Top 10 transcripts: <>= head(sort(U3.exbytx_nOV10, decreasing=TRUE), n=10) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Encode the overlaps between the reads and transcripts} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Single-end encodings} The {\it overlap encodings} are strand sensitive so we will compute them twice, once for the ``original alignments'' (i.e. the alignments of the {\it original queries}), and once again for the ``flipped alignments'' (i.e. the alignments of the ``flipped {\it original queries}''). We extract the ranges of the ``original'' and ``flipped'' alignments in 2 \Rclass{GRangesList} objects with: <>= U1.grl <- grglist(U1.GAL, order.as.in.query=TRUE) U1.grlf <- flipQuery(U1.grl) # flipped @ and encode their overlaps with the transcripts: <>= U1.ovencA <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00) U1.ovencB <- encodeOverlaps(U1.grlf, exbytx, hits=U1.OV00) @ \Rcode{U1.ovencA} and \Rcode{U1.ovencB} are 2 \Rclass{OverlapsEncodings} objects of the same length as \Rclass{Hits} object \Rcode{U1.OV00}. For each hit in \Rcode{U1.OV00}, we have 2 corresponding encodings, one in \Rcode{U1.ovencA} and one in \Rcode{U1.ovencB}, but only one of them encodes a hit between alignment ranges and exon ranges that are on the same strand. We use the \Rfunction{selectEncodingWithCompatibleStrand} function to merge them into a single \Rclass{OverlapsEncodings} of the same length. For each hit in \Rcode{U1.OV00}, this selects the encoding corresponding to alignment ranges and exon ranges with compatible strand: <>= U1.grl_strand <- unlist(runValue(strand(U1.grl)), use.names=FALSE) U1.ovenc <- selectEncodingWithCompatibleStrand(U1.ovencA, U1.ovencB, U1.grl_strand, exbytx_strand, hits=U1.OV00) U1.ovenc @ As a convenience, the 2 above calls to \Rfunction{encodeOverlaps} + merging step can be replaced by a single call to \Rfunction{encodeOverlaps} on \Rcode{U1.grl} (or \Rcode{U1.grlf}) with \Rcode{flip.query.if.wrong.strand=TRUE}: <>= U1.ovenc_again <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00, flip.query.if.wrong.strand=TRUE) stopifnot(identical(U1.ovenc_again, U1.ovenc)) @ Unique encodings in \Rcode{U1.ovenc}: <>= U1.unique_encodings <- levels(U1.ovenc) length(U1.unique_encodings) head(U1.unique_encodings) U1.ovenc_table <- table(encoding(U1.ovenc)) tail(sort(U1.ovenc_table)) @ Encodings are sort of cryptic but utilities are provided to extract specific meaning from them. Use of these utilities is covered later in this document. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Paired-end encodings} Let's encode the overlaps in \Rcode{U3.OV00}: <>= U3.grl <- grglist(U3.GALP) U3.ovenc <- encodeOverlaps(U3.grl, exbytx, hits=U3.OV00, flip.query.if.wrong.strand=TRUE) U3.ovenc @ Unique encodings in \Rcode{U3.ovenc}: <>= U3.unique_encodings <- levels(U3.ovenc) length(U3.unique_encodings) head(U3.unique_encodings) U3.ovenc_table <- table(encoding(U3.ovenc)) tail(sort(U3.ovenc_table)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect ``splice compatible'' overlaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% We are interested in a particular type of overlap where the read overlaps the transcript in a ``splice compatible'' way, that is, in a way that is compatible with the splicing of the transcript. The \Rfunction{isCompatibleWithSplicing} function can be used on an \Rclass{OverlapEncodings} object to detect this type of overlap. Note that \Rfunction{isCompatibleWithSplicing} can also be used on a character vector or factor. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``splice compatible'' single-end overlaps} \subsubsection{``Splice compatible'' single-end encodings} \Rcode{U1.ovenc} contains 7 unique encodings compatible with the splicing of the transcript: <>= sort(U1.ovenc_table[isCompatibleWithSplicing(U1.unique_encodings)]) @ Encodings \Rcode{"1:i:"} (455176 occurences in \Rcode{U1.ovenc}), \Rcode{"2:jm:af:"} (72929 occurences in \Rcode{U1.ovenc}), and \Rcode{"3:jmm:agm:aaf:"} (488 occurences in \Rcode{U1.ovenc}), correspond to the following overlaps: \begin{itemize} \item \Rcode{"1:i:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"2:jm:af:"} \begin{verbatim} - read (1 skipped region): ooooo---ooo - transcript: ... >>>>>>>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"3:jmm:agm:aaf:"} \begin{verbatim} - read (2 skipped regions): oo---ooooo---o - transcript: ... >>>>>>>> >>>>> >>>>>>> ... \end{verbatim} \end{itemize} For clarity, only the exons involved in the overlap are represented. The transcript can of course have more upstream and downstream exons, which is denoted by the ... on the left side (5' end) and right side (3' end) of each drawing. Note that the exons represented in the 2nd and 3rd drawings are consecutive and adjacent in the processed transcript. Encodings \Rcode{"1:f:"} and \Rcode{"1:j:"} are variations of the situation described by encoding \Rcode{"1:i:"}. For \Rcode{"1:f:"}, the first aligned base of the read (or ``flipped'' read) is aligned with the first base of the exon. For \Rcode{"1:j:"}, the last aligned base of the read (or ``flipped'' read) is aligned with the last base of the exon: \begin{itemize} \item \Rcode{"1:f:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"1:j:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \end{itemize} <>= U1.OV00_is_comp <- isCompatibleWithSplicing(U1.ovenc) table(U1.OV00_is_comp) # 531797 "splice compatible" overlaps @ Finally, let's extract the ``splice compatible'' overlaps from \Rcode{U1.OV00}: <>= U1.compOV00 <- U1.OV00[U1.OV00_is_comp] @ Note that high-level convenience wrapper \Rfunction{findCompatibleOverlaps} can be used for computing the ``splice compatible'' overlaps directly between a \Rclass{GAlignments} object (containing reads) and a \Rclass{GRangesList} object (containing transcripts): <>= U1.compOV00_again <- findCompatibleOverlaps(U1.GAL, exbytx) stopifnot(identical(U1.compOV00_again, U1.compOV00)) @ \subsubsection{Tabulate the ``splice compatible'' single-end overlaps} Number of ``splice compatible'' transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_ncomptx <- countQueryHits(U1.compOV00) mcols(U1.GAL)$ncomptx <- U1.GAL_ncomptx head(U1.GAL) table(U1.GAL_ncomptx) mean(U1.GAL_ncomptx >= 1) @ 75\% of the alignments in \Rcode{U1.GAL} are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Note that high-level convenience wrapper \Rfunction{countCompatibleOverlaps} can be used directly on \Rcode{U1.GAL} and \Rcode{exbytx} for computing \Rcode{U1.GAL\_ncomptx}: <>= U1.GAL_ncomptx_again <- countCompatibleOverlaps(U1.GAL, exbytx) stopifnot(identical(U1.GAL_ncomptx_again, U1.GAL_ncomptx)) @ Number of ``splice compatible'' transcripts for each read: <>= U1.compOV10 <- remapHits(U1.compOV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ncomptx <- countQueryHits(U1.compOV10) names(U1.uqnames_ncomptx) <- U1.uqnames table(U1.uqnames_ncomptx) mean(U1.uqnames_ncomptx >= 1) @ 77.5\% of the reads are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``splice compatible'' reads for each transcript: <>= U1.exbytx_ncompOV10 <- countSubjectHits(U1.compOV10) names(U1.exbytx_ncompOV10) <- names(exbytx) mean(U1.exbytx_ncompOV10 >= 50) @ Only 0.87\% of the transcripts in \Rcode{exbytx} are ``splice compatible'' with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_ncompOV10, decreasing=TRUE), n=10) @ Note that this ``top 10'' is slightly different from the ``top 10'' we obtained earlier when we counted {\bf all} the overlaps. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``splice compatible'' paired-end overlaps} \subsubsection{``Splice compatible'' paired-end encodings} WARNING: For paired-end encodings, \Rcode{isCompatibleWithSplicing} considers that the encoding is ``splice compatible'' if its 2 halves are ``splice compatible''. This can produce false positives if for example the right end of the alignment is located upstream of the left end in transcript space. The paired-end read could not come from this transcript. To eliminate these false positives, one would need to look at the position of the left and right ends in transcript space. This can be done with \Rcode{extractQueryStartInTranscript}. \Rcode{U3.ovenc} contains 13 unique paired-end encodings compatible with the splicing of the transcript: <>= sort(U3.ovenc_table[isCompatibleWithSplicing(U3.unique_encodings)]) @ Paired-end encodings \Rcode{"1{-}{-}1:i{-}{-}i:"} (100084 occurences in \Rcode{U3.ovenc}), \Rcode{"2{-}{-}1:jm{-}{-}m:af{-}{-}i:"} (2700 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}af:"} (2480 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}1:i{-}{-}m:a{-}{-}i:"} (287 occurences in \Rcode{U3.ovenc}), and \Rcode{"2{-}{-}2:jm{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} (153 occurences in \Rcode{U3.ovenc}), correspond to the following paired-end overlaps: \begin{itemize} \item \Rcode{"1{-}{-}1:i{-}{-}i:"} \begin{verbatim} - paired-end read (no skipped region on the first end, no skipped region on the last end): oooo oooo - transcript: ... >>>>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}1:jm{-}{-}m:af{-}{-}i:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, no skipped region on the last end): ooo---o oooo - transcript: ... >>>>>>>> >>>>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}af:"} \begin{verbatim} - paired-end read (no skipped region on the first end, 1 skipped region on the last end): oooo oo---oo - transcript: ... >>>>>>>>>>>>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}1:i{-}{-}m:a{-}{-}i:"} \begin{verbatim} - paired-end read (no skipped region on the first end, no skipped region on the last end): oooo oooo - transcript: ... >>>>>>>>> >>>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}2:jm{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, 1 skipped region on the last end): ooo---o oo---oo - transcript: ... >>>>>> >>>>>>> >>>>> ... \end{verbatim} \end{itemize} Note: switch use of ``first'' and ``last'' above if the read was ``flipped''. <>= U3.OV00_is_comp <- isCompatibleWithSplicing(U3.ovenc) table(U3.OV00_is_comp) # 106835 "splice compatible" paired-end overlaps @ Finally, let's extract the ``splice compatible'' paired-end overlaps from \Rcode{U3.OV00}: <>= U3.compOV00 <- U3.OV00[U3.OV00_is_comp] @ Note that, like with our single-end reads, high-level convenience wrapper \Rfunction{findCompatibleOverlaps} can be used for computing the ``splice compatible'' paired-end overlaps directly between a \Rclass{GAlignmentPairs} object (containing paired-end reads) and a \Rclass{GRangesList} object (containing transcripts): <>= U3.compOV00_again <- findCompatibleOverlaps(U3.GALP, exbytx) stopifnot(identical(U3.compOV00_again, U3.compOV00)) @ \subsubsection{Tabulate the ``splice compatible'' paired-end overlaps} Number of ``splice compatible'' transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_ncomptx <- countQueryHits(U3.compOV00) mcols(U3.GALP)$ncomptx <- U3.GALP_ncomptx head(U3.GALP) table(U3.GALP_ncomptx) mean(U3.GALP_ncomptx >= 1) @ 69.7\% of the alignment pairs in \Rcode{U3.GALP} are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Note that high-level convenience wrapper \Rfunction{countCompatibleOverlaps} can be used directly on \Rcode{U3.GALP} and \Rcode{exbytx} for computing \Rcode{U3.GALP\_ncomptx}: <>= U3.GALP_ncomptx_again <- countCompatibleOverlaps(U3.GALP, exbytx) stopifnot(identical(U3.GALP_ncomptx_again, U3.GALP_ncomptx)) @ Number of ``splice compatible'' transcripts for each template: <>= U3.compOV10 <- remapHits(U3.compOV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ncomptx <- countQueryHits(U3.compOV10) names(U3.uqnames_ncomptx) <- U3.uqnames table(U3.uqnames_ncomptx) mean(U3.uqnames_ncomptx >= 1) @ 70.7\% of the templates are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``splice compatible'' templates for each transcript: <>= U3.exbytx_ncompOV10 <- countSubjectHits(U3.compOV10) names(U3.exbytx_ncompOV10) <- names(exbytx) mean(U3.exbytx_ncompOV10 >= 50) @ Only 0.7\% of the transcripts in \Rcode{exbytx} are ``splice compatible'' with at least 50 templates. Top 10 transcripts: <>= head(sort(U3.exbytx_ncompOV10, decreasing=TRUE), n=10) @ Note that this ``top 10'' is slightly different from the ``top 10'' we obtained earlier when we counted {\bf all} the paired-end overlaps. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Compute the {\it reference query sequences} and project them on the transcriptome} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Compute the {\it reference query sequences}} The {\it reference query sequences} are the query sequences {\bf after} alignment, by opposition to the {\it original query sequences} (aka ``true'' or ``real'' query sequences) which are the query sequences {\bf before} alignment. The {\it reference query sequences} can easily be computed by extracting the nucleotides mapped to each read from the reference genome. This of course requires that we have access to the reference genome used by the aligner. In Bioconductor, the full genome sequence for the dm3 assembly is stored in the \Rpackage{BSgenome.Dmelanogaster.UCSC.dm3} data package \footnote{See \url{http://bioconductor.org/packages/release/data/annotation/} for the full list of annotation packages available in the current release of Bioconductor.}: <>= library(BSgenome.Dmelanogaster.UCSC.dm3) Dmelanogaster @ To extract the portions of the reference genome corresponding to the ranges in \Rcode{U1.grl}, we can use the \Rfunction{extractTranscriptSeqs} function defined in the \Rpackage{GenomicFeatures} package: <>= library(GenomicFeatures) U1.GAL_rqseq <- extractTranscriptSeqs(Dmelanogaster, U1.grl) head(U1.GAL_rqseq) @ When reads are paired-end, we need to extract separately the ranges corresponding to their {\it first} ends (aka {\it first} segments in BAM jargon) and those corresponding to their {\it last} ends (aka {\it last} segments in BAM jargon): <>= U3.grl_first <- grglist(first(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) U3.grl_last <- grglist(last(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) @ Then we extract the portions of the reference genome corresponding to the ranges in \Rclass{GRangesList} objects \Rcode{U3.grl\_first} and \Rcode{U3.grl\_last}: <>= U3.GALP_rqseq1 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_first) U3.GALP_rqseq2 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_last) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Project the single-end alignments on the transcriptome} The \Rfunction{extractQueryStartInTranscript} function computes for each overlap the position of the {\it query start} in the transcript: <>= U1.OV00_qstart <- extractQueryStartInTranscript(U1.grl, exbytx, hits=U1.OV00, ovenc=U1.ovenc) head(subset(U1.OV00_qstart, U1.OV00_is_comp)) @ \Rcode{U1.OV00\_qstart} is a data frame with 1 row per overlap and 3 columns: \begin{enumerate} \item \Rcode{startInTranscript}: the 1-based start position of the read with respect to the transcript. Position 1 always corresponds to the first base on the 5' end of the transcript sequence. \item \Rcode{firstSpannedExonRank}: the rank of the first exon spanned by the read, that is, the rank of the exon found at position \Rcode{startInTranscript} in the transcript. \item \Rcode{startInFirstSpannedExon}: the 1-based start position of the read with respect to the first exon spanned by the read. \end{enumerate} Having this information allows us for example to compare the read and transcript nucleotide sequences for each ``splice compatible'' overlap. If we use the {\it reference query sequence} instead of the {\it original query sequence} for this comparison, then it should match {\bf exactly} the sequence found at the {\it query start} in the transcript. Let's start by using \Rfunction{extractTranscriptSeqs} again to extract the transcript sequences (aka transcriptome) from the dm3 reference genome: <>= txseq <- extractTranscriptSeqs(Dmelanogaster, exbytx) @ For each ``splice compatible'' overlap, the read sequence in \Rcode{U1.GAL\_rqseq} must be an {\it exact} substring of the transcript sequence in \Rcode{exbytx\_seq}: <>= U1.OV00_rqseq <- U1.GAL_rqseq[queryHits(U1.OV00)] U1.OV00_rqseq[flippedQuery(U1.ovenc)] <- reverseComplement(U1.OV00_rqseq[flippedQuery(U1.ovenc)]) U1.OV00_txseq <- txseq[subjectHits(U1.OV00)] stopifnot(all( U1.OV00_rqseq[U1.OV00_is_comp] == narrow(U1.OV00_txseq[U1.OV00_is_comp], start=U1.OV00_qstart$startInTranscript[U1.OV00_is_comp], width=width(U1.OV00_rqseq)[U1.OV00_is_comp]) )) @ Because of this relationship between the {\it reference query sequence} and the transcript sequence of a ``splice compatible'' overlap, and because of the relationship between the {\it original query sequences} and the {\it reference query sequences}, then the edit distance reported in the NM tag is actually the edit distance between the {\it original query} and the transcript of a ``splice compatible'' overlap. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Project the paired-end alignments on the transcriptome} For a paired-end read, the {\it query start} is the start of its ``left end''. <>= U3.OV00_Lqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc) head(subset(U3.OV00_Lqstart, U3.OV00_is_comp)) @ Note that \Rfunction{extractQueryStartInTranscript} can be called with \Rcode{for.query.right.end=TRUE} if we want this information for the ``right ends'' of the reads: <>= U3.OV00_Rqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc, for.query.right.end=TRUE) head(subset(U3.OV00_Rqstart, U3.OV00_is_comp)) @ Like with single-end reads, having this information allows us for example to compare the read and transcript nucleotide sequences for each ``splice compatible'' overlap. If we use the {\it reference query sequence} instead of the {\it original query sequence} for this comparison, then it should match {\bf exactly} the sequences of the ``left'' and ``right'' ends of the read in the transcript. Let's assign the ``left and right reference query sequences'' to each overlap: <>= U3.OV00_Lrqseq <- U3.GALP_rqseq1[queryHits(U3.OV00)] U3.OV00_Rrqseq <- U3.GALP_rqseq2[queryHits(U3.OV00)] @ For the single-end reads, the sequence associated with a ``flipped query'' just needed to be ``reverse complemented''. For paired-end reads, we also need to swap the 2 sequences in the pair: <>= flip_idx <- which(flippedQuery(U3.ovenc)) tmp <- U3.OV00_Lrqseq[flip_idx] U3.OV00_Lrqseq[flip_idx] <- reverseComplement(U3.OV00_Rrqseq[flip_idx]) U3.OV00_Rrqseq[flip_idx] <- reverseComplement(tmp) @ Let's assign the transcript sequence to each overlap: <>= U3.OV00_txseq <- txseq[subjectHits(U3.OV00)] @ For each ``splice compatible'' overlap, we expect the ``left and right reference query sequences'' of the read to be {\it exact} substrings of the transcript sequence. Let's check the ``left reference query sequences'': <>= stopifnot(all( U3.OV00_Lrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Lqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Lrqseq)[U3.OV00_is_comp]) )) @ and the ``right reference query sequences'': <>= stopifnot(all( U3.OV00_Rrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Rqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Rrqseq)[U3.OV00_is_comp]) )) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Align the reads to the transcriptome} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Aligning the reads to the reference genome is not the most efficient nor accurate way to count the number of ``splice compatible'' overlaps per {\it original query}. Supporting junction reads (i.e. reads that align with at least 1 skipped region in their CIGAR) introduces a significant computational cost during the alignment process. Then, as we've seen in the previous sections, each alignment produced by the aligner needs to be broken into a set of ranges (based on its CIGAR) and those ranges compared to the ranges of the exons grouped by transcript. A more straightforward and accurate approach is to align the reads directly to the transcriptome, and without allowing the typical skipped region that the aligner needs to introduce when aligning a junction read to the reference genome. With this approach, a ``hit'' between a read and a transcript is necessarily compatible with the splicing of the transcript. In case of a ``hit'', we'll say that the read and the transcript are ``string-based compatible'' (to differentiate from our previous notion of ``splice compatible'' overlaps that we will call ``encoding-based compatible'' in this section). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Align the single-end reads to the transcriptome} \subsubsection{Find the ``hits''} The single-end reads are in \Rcode{U1.oqseq}, the transcriptome is in \Rcode{exbytx\_seq}. Since indels were not allowed/supported during the alignment of the reads to the reference genome, we don't need to allow/support them either for aligning the reads to the transcriptome. Also since our goal is to find (and count) ``splice compatible'' overlaps between reads and transcripts, we don't need to keep track of the details of the alignments between the reads and the transcripts. Finally, since BAM file {\tt untreated1\_chr4.bam} is not the full output of the aligner but the subset obtained by keeping only the alignments located on chr4, we don't need to align \Rcode{U1.oqseq} to the full transcriptome, but only to the subset of \Rcode{exbytx\_seq} made of the transcripts located on chr4. With those simplifications in mind, we write the following function that we will use to find the ``hits'' between the reads and the transcriptome: <>= ### A wrapper to vwhichPDict() that supports IUPAC ambiguity codes in 'qseq' ### and 'txseq', and treats them as such. findSequenceHits <- function(qseq, txseq, which.txseq=NULL, max.mismatch=0) { .asHits <- function(x, pattern_length) { query_hits <- unlist(x) if (is.null(query_hits)) query_hits <- integer(0) subject_hits <- rep.int(seq_len(length(x)), elementNROWS(x)) Hits(query_hits, subject_hits, pattern_length, length(x), sort.by.query=TRUE) } .isHitInTranscriptBounds <- function(hits, qseq, txseq) { sapply(seq_len(length(hits)), function(i) { pattern <- qseq[[queryHits(hits)[i]]] subject <- txseq[[subjectHits(hits)[i]]] v <- matchPattern(pattern, subject, max.mismatch=max.mismatch, fixed=FALSE) any(1L <= start(v) & end(v) <= length(subject)) }) } if (!is.null(which.txseq)) { txseq0 <- txseq txseq <- txseq[which.txseq] } names(qseq) <- NULL other <- alphabetFrequency(qseq, baseOnly=TRUE)[ , "other"] is_clean <- other == 0L # "clean" means "no IUPAC ambiguity code" ## Find hits for "clean" original queries. qseq0 <- qseq[is_clean] pdict0 <- PDict(qseq0, max.mismatch=max.mismatch) m0 <- vwhichPDict(pdict0, txseq, max.mismatch=max.mismatch, fixed="pattern") hits0 <- .asHits(m0, length(qseq0)) hits0@nLnode <- length(qseq) hits0@from <- which(is_clean)[hits0@from] ## Find hits for non "clean" original queries. qseq1 <- qseq[!is_clean] m1 <- vwhichPDict(qseq1, txseq, max.mismatch=max.mismatch, fixed=FALSE) hits1 <- .asHits(m1, length(qseq1)) hits1@nLnode <- length(qseq) hits1@from <- which(!is_clean)[hits1@from] ## Combine the hits. query_hits <- c(queryHits(hits0), queryHits(hits1)) subject_hits <- c(subjectHits(hits0), subjectHits(hits1)) if (!is.null(which.txseq)) { ## Remap the hits. txseq <- txseq0 subject_hits <- which.txseq[subject_hits] hits0@nRnode <- length(txseq) } ## Order the hits. oo <- orderIntegerPairs(query_hits, subject_hits) hits0@from <- query_hits[oo] hits0@to <- subject_hits[oo] if (max.mismatch != 0L) { ## Keep only "in bounds" hits. is_in_bounds <- .isHitInTranscriptBounds(hits0, qseq, txseq) hits0 <- hits0[is_in_bounds] } hits0 } @ Let's compute the index of the transcripts in \Rcode{exbytx\_seq} located on chr4 (\Rfunction{findSequenceHits} will restrict the search to those transcripts): <>= chr4tx <- transcripts(txdb, vals=list(tx_chrom="chr4")) chr4txnames <- mcols(chr4tx)$tx_name which.txseq <- match(chr4txnames, names(txseq)) @ We know that the aligner tolerated up to 6 mismatches per read. The 3 following commands find the ``hits'' for each {\it original query}, then find the ``hits'' for each ``flipped {\it original query}'', and finally merge all the ``hits'' (note that the 3 commands take about 1 hour to complete on a modern laptop): <>= U1.sbcompHITSa <- findSequenceHits(U1.oqseq, txseq, which.txseq=which.txseq, max.mismatch=6) U1.sbcompHITSb <- findSequenceHits(reverseComplement(U1.oqseq), txseq, which.txseq=which.txseq, max.mismatch=6) U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) @ <>= U1.sbcompHITSa <- .loadPrecomputed("U1.sbcompHITSa") U1.sbcompHITSb <- .loadPrecomputed("U1.sbcompHITSb") U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) @ \subsubsection{Tabulate the ``hits''} Number of ``string-based compatible'' transcripts for each read: <>= U1.uqnames_nsbcomptx <- countQueryHits(U1.sbcompHITS) names(U1.uqnames_nsbcomptx) <- U1.uqnames table(U1.uqnames_nsbcomptx) mean(U1.uqnames_nsbcomptx >= 1) @ 77.7\% of the reads are ``string-based compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``string-based compatible'' reads for each transcript: <>= U1.exbytx_nsbcompHITS <- countSubjectHits(U1.sbcompHITS) names(U1.exbytx_nsbcompHITS) <- names(exbytx) mean(U1.exbytx_nsbcompHITS >= 50) @ Only 0.865\% of the transcripts in \Rcode{exbytx} are ``string-based compatible'' with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_nsbcompHITS, decreasing=TRUE), n=10) @ \subsubsection{A closer look at the ``hits''} [WORK IN PROGRESS, might be removed or replaced soon...] Any ``encoding-based compatible'' overlap is of course ``string-based compatible'': <>= stopifnot(length(setdiff(U1.compOV10, U1.sbcompHITS)) == 0) @ but the reverse is not true: <>= length(setdiff(U1.sbcompHITS, U1.compOV10)) @ %To understand why the {\it overlap encodings} approach doesn't find all %the ``string-based compatible'' hits, let's look at the second hit in %\Rcode{setdiff(U1.sbcompHITS, U1.compOV10)}. This is a perfect hit between %read SRR031728.4692406 and transcript 18924: % %<<>>= %matchPattern(U1.oqseq[[6306]], txseq[[18924]]) %U1.GAL_idx <- which(U1.GAL_qnames == "SRR031728.4692406") %U1.GAL[U1.GAL_idx] %U1.GAL_idx %in% queryHits(U1.OV00) %U1.GAL[12636] %which(queryHits(U1.OV00) == 12636) %U1.OV00[305] %as.character(encoding(U1.ovenc)[305]) %@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Align the paired-end reads to the transcriptome} [COMING SOON...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect ``almost splice compatible'' overlaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In many aspects, ``splice compatible'' overlaps can be seen as perfect. We are now insterested in a less perfect type of overlap where the read overlaps the transcript in a way that {\it would} be ``splice compatible'' if 1 or more exons were removed from the transcript. In that case we say that the overlap is ``almost splice compatible'' with the transcript. The \Rfunction{isCompatibleWithSkippedExons} function can be used on an \Rclass{OverlapEncodings} object to detect this type of overlap. Note that \Rfunction{isCompatibleWithSkippedExons} can also be used on a character vector of factor. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``almost splice compatible'' single-end overlaps} \subsubsection{``Almost splice compatible'' single-end encodings} \Rcode{U1.ovenc} contains 7 unique encodings ``almost splice compatible'' with the splicing of the transcript: <>= sort(U1.ovenc_table[isCompatibleWithSkippedExons(U1.unique_encodings)]) @ Encodings \Rcode{"2:jm:am:af:"} (1015 occurences in \Rcode{U1.ovenc}), \Rcode{"2:jm:am:am:af:"} (144 occurences in \Rcode{U1.ovenc}), and \Rcode{"3:jmm:agm:aam:aaf:"} (21 occurences in \Rcode{U1.ovenc}), correspond to the following overlaps: \begin{itemize} \item \Rcode{"2:jm:am:af:"} \begin{verbatim} - read (1 skipped region): ooooo----------ooo - transcript: ... >>>>>>> >>>> >>>>>>>> ... \end{verbatim} \item \Rcode{"2:jm:am:am:af:"} \begin{verbatim} - read (1 skipped region): ooooo------------------ooo - transcript: ... >>>>>>> >>>> >>>>> >>>>>>>> ... \end{verbatim} \item \Rcode{"3:jmm:agm:aam:aaf:"} \begin{verbatim} - read (2 skipped regions): oo---oooo-----------oo - transcript: ... >>>>>>> >>>> >>>>> >>>>>>>> ... \end{verbatim} \end{itemize} <>= U1.OV00_is_acomp <- isCompatibleWithSkippedExons(U1.ovenc) table(U1.OV00_is_acomp) # 1202 "almost splice compatible" overlaps @ Finally, let's extract the ``almost splice compatible'' overlaps from \Rcode{U1.OV00}: <>= U1.acompOV00 <- U1.OV00[U1.OV00_is_acomp] @ \subsubsection{Tabulate the ``almost splice compatible'' single-end overlaps} Number of ``almost splice compatible'' transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_nacomptx <- countQueryHits(U1.acompOV00) mcols(U1.GAL)$nacomptx <- U1.GAL_nacomptx head(U1.GAL) table(U1.GAL_nacomptx) mean(U1.GAL_nacomptx >= 1) @ Only 0.27\% of the alignments in \Rcode{U1.GAL} are ``almost splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``almost splice compatible'' alignments for each transcript: <>= U1.exbytx_nacompOV00 <- countSubjectHits(U1.acompOV00) names(U1.exbytx_nacompOV00) <- names(exbytx) table(U1.exbytx_nacompOV00) mean(U1.exbytx_nacompOV00 >= 50) @ Only 0.017\% of the transcripts in \Rcode{exbytx} are ``almost splice compatible'' with at least 50 alignments in \Rcode{U1.GAL}. Finally note that the ``query start in transcript'' values returned by \Rfunction{extractQueryStartInTranscript} are also defined for ``almost splice compatible'' overlaps: <>= head(subset(U1.OV00_qstart, U1.OV00_is_acomp)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``almost splice compatible'' paired-end overlaps} \subsubsection{``Almost splice compatible'' paired-end encodings} \Rcode{U3.ovenc} contains 5 unique paired-end encodings ``almost splice compatible'' with the splicing of the transcript: <>= sort(U3.ovenc_table[isCompatibleWithSkippedExons(U3.unique_encodings)]) @ Paired-end encodings \Rcode{"2{-}{-}1:jm{-}{-}m:am{-}{-}m:af{-}{-}i:"} (73 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}am:a{-}{-}af:"} (53 occurences in \Rcode{U3.ovenc}), and \Rcode{"2{-}{-}2:jm{-}{-}mm:am{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} (9 occurences in \Rcode{U3.ovenc}), correspond to the following paired-end overlaps: \begin{itemize} \item \Rcode{"2{-}{-}1:jm{-}{-}m:am{-}{-}m:af{-}{-}i:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, no skipped region on the last end): ooo----------o oooo - transcript: ... >>>>> >>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}am:a{-}{-}af:"} \begin{verbatim} - paired-end read (no skipped region on the first end, 1 skipped region on the last end): oooo oo---------oo - transcript: ... >>>>>>>>>>> >>> >>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}2:jm{-}{-}mm:am{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, 1 skipped region on the last end): o----------ooo oo---oo - transcript: ... >>>>> >>>> >>>>>>>> >>>>>> ... \end{verbatim} \end{itemize} Note: switch use of ``first'' and ``last'' above if the read was ``flipped''. <>= U3.OV00_is_acomp <- isCompatibleWithSkippedExons(U3.ovenc) table(U3.OV00_is_acomp) # 141 "almost splice compatible" paired-end overlaps @ Finally, let's extract the ``almost splice compatible'' paired-end overlaps from \Rcode{U3.OV00}: <>= U3.acompOV00 <- U3.OV00[U3.OV00_is_acomp] @ \subsubsection{Tabulate the ``almost splice compatible'' paired-end overlaps} Number of ``almost splice compatible'' transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_nacomptx <- countQueryHits(U3.acompOV00) mcols(U3.GALP)$nacomptx <- U3.GALP_nacomptx head(U3.GALP) table(U3.GALP_nacomptx) mean(U3.GALP_nacomptx >= 1) @ Only 0.2\% of the alignment pairs in \Rcode{U3.GALP} are ``almost splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``almost splice compatible'' alignment pairs for each transcript: <>= U3.exbytx_nacompOV00 <- countSubjectHits(U3.acompOV00) names(U3.exbytx_nacompOV00) <- names(exbytx) table(U3.exbytx_nacompOV00) mean(U3.exbytx_nacompOV00 >= 50) @ Only 0.0034\% of the transcripts in \Rcode{exbytx} are ``almost splice compatible'' with at least 50 alignment pairs in \Rcode{U3.GALP}. Finally note that the ``query start in transcript'' values returned by \Rfunction{extractQueryStartInTranscript} are also defined for ``almost splice compatible'' paired-end overlaps: <>= head(subset(U3.OV00_Lqstart, U3.OV00_is_acomp)) head(subset(U3.OV00_Rqstart, U3.OV00_is_acomp)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect novel splice junctions} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{By looking at single-end overlaps} An alignment in \Rcode{U1.GAL} with ``almost splice compatible'' overlaps but no ``splice compatible'' overlaps suggests the presence of one or more transcripts that are not in our annotations. First we extract the index of those alignments ({\it nsj} here stands for ``{\bf n}ovel {\bf s}plice {\bf j}unction''): <>= U1.GAL_is_nsj <- U1.GAL_nacomptx != 0L & U1.GAL_ncomptx == 0L head(which(U1.GAL_is_nsj)) @ We make this an index into \Rcode{U1.OV00}: <>= U1.OV00_is_nsj <- queryHits(U1.OV00) %in% which(U1.GAL_is_nsj) @ We intersect with \Rcode{U1.OV00\_is\_acomp} and then subset \Rcode{U1.OV00} to keep only the overlaps that suggest novel splicing: <>= U1.OV00_is_nsj <- U1.OV00_is_nsj & U1.OV00_is_acomp U1.nsjOV00 <- U1.OV00[U1.OV00_is_nsj] @ For each overlap in \Rcode{U1.nsjOV00}, we extract the ranks of the skipped exons (we use a list for this as there might be more than 1 skipped exon per overlap): <>= U1.nsjOV00_skippedex <- extractSkippedExonRanks(U1.ovenc)[U1.OV00_is_nsj] names(U1.nsjOV00_skippedex) <- queryHits(U1.nsjOV00) table(elementNROWS(U1.nsjOV00_skippedex)) @ Finally, we split \Rcode{U1.nsjOV00\_skippedex} by transcript names: <>= f <- factor(names(exbytx)[subjectHits(U1.nsjOV00)], levels=names(exbytx)) U1.exbytx_skippedex <- split(U1.nsjOV00_skippedex, f) @ \Rcode{U1.exbytx\_skippedex} is a named list of named lists of integer vectors. The first level of names (outer names) are transcript names and the second level of names (inner names) are alignment indices into \Rcode{U1.GAL}: <>= head(names(U1.exbytx_skippedex)) # transcript names @ Transcript FBtr0089124 receives 7 hits. All of them skip exons 9 and 10: <>= U1.exbytx_skippedex$FBtr0089124 @ Transcript FBtr0089147 receives 4 hits. Two of them skip exon 2, one of them skips exons 2 to 6, and one of them skips exon 10: <>= U1.exbytx_skippedex$FBtr0089147 @ A few words about the interpretation of \Rcode{U1.exbytx\_skippedex}: Because of how we've conducted this analysis, the aligments reported in \Rcode{U1.exbytx\_skippedex} are guaranteed to not have any ``splice compatible'' overlaps with other known transcripts. All we can say, for example in the case of transcript FBtr0089124, is that the 7 reported hits that skip exons 9 and 10 show evidence of one or more unknown transcripts with a splice junction that corresponds to the gap between exons 8 and 11. But without further analysis, we can't make any assumption about the exons structure of those unknown transcripts. In particular, we cannot assume the existence of an unknown transcript made of the same exons as transcript FBtr0089124 minus exons 9 and 10! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{By looking at paired-end overlaps} [COMING SOON...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rcode{sessionInfo()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= sessionInfo() @ \end{document} GenomicAlignments/vignettes/WorkingWithAlignedNucleotides.Rnw0000644000175200017520000003411614516004601025640 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Working with aligned nucleotides} %\VignetteDepends{GenomicAlignments, RNAseqData.HNRNPC.bam.chr14, pasillaBamSubset, BSgenome.Hsapiens.UCSC.hg19, BSgenome.Dmelanogaster.UCSC.dm3, GenomicFeatures, TxDb.Hsapiens.UCSC.hg19.knownGene, TxDb.Dmelanogaster.UCSC.dm3.ensGene} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Working with aligned nucleotides (WORK-IN-PROGRESS!)} \author{Herv\'e Pag\`es} \date{Last modified: January 2014; Compiled: \today} \begin{document} \maketitle \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% This vignette belongs to the \Rpackage{GenomicAlignments} package. It illustrates how to use the package for working with the nucleotide content of aligned reads. After the reads generated by a high-throughput sequencing experiment have been aligned to a reference genome, the questions that are being asked about these alignments typically fall in two broad categories: {\bf positional only} and {\bf nucleotide-related}. {\bf Positional only} questions are about the position of the alignments with respect to the reference genome. Note that the position of an alignment is actually better described in terms of genomic ranges (1 range for an alignment with no gaps, 2 or more ranges for an alignment with gaps). Knowing the ranges of the alignments is sufficient to perform common tasks like {\it read counting} or for {\it computing the coverage}. {\it Read counting} is the process of counting the number of aligned reads per gene or exon and is typically performed in the context of a differential analysis. This task can be accomplished with the \Rfunction{summarizeOverlaps} function provided in the \Rpackage{GenomicAlignments} package and is explained in details in the ``Counting reads with summarizeOverlaps'' vignette (also located in this package). {\it Computing the coverage} is often the preliminary step to peak detection (ChIP-seq analysis) or to a copy number analysis. It can be accomplished with the \Rfunction{coverage} function. See \Rcode{?\`{}coverage-methods\`{}} for more information. {\bf Nucleotide-related} questions are about the nucleotide content of the alignments. In particular how this content compares to the corresponding nucleotides in the reference genome. These questions typically arise in the context of small genetic variation detection between one or more samples and a reference genome. The \Rpackage{GenomicAlignments} package provides a suite of low- to mid-level tools for dealing with {\bf nucleotide-related} questions about the alignments. In this vignette we illustrate their use on the single-end and paired-end reads of an RNA-seq experiment. Note that these tools do NOT constitute a complete variant toolbox. If this is what you're looking for, other \Bioconductor{} packages might be more appropriate. See the GeneticVariability and SNP views at this URL \url{http://bioconductor.org/packages/release/BiocViews.html#___AssayDomains} for a complete list of packages that deal with small genetic variations. Most of them provide tools of higher level than the tools described in this vignette. See for example the \Rpackage{VariantTools} and \Rpackage{VariantAnnotation} packages for a complete variant toolbox (including variant calling capabilities). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Load the aligned reads and their sequences from a BAM file} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In this section, we illustrate how aligned reads and their sequences can be loaded from a BAM file. The reads we're going to use for this are paired-end reads from a published study by Zarnack et al., 2012. A subset of these reads are stored in the BAM files located in the \Rpackage{RNAseqData.HNRNPC.bam.chr14} data package. The package contains 8 BAM files, 1 per sequencing run: <>= library(RNAseqData.HNRNPC.bam.chr14) bamfiles <- RNAseqData.HNRNPC.bam.chr14_BAMFILES names(bamfiles) # the names of the runs @ Each BAM file was obtained by (1) aligning the reads (paired-end) to the full hg19 genome with TopHat2, and then (2) subsetting to keep only alignments on chr14. See \Rcode{?RNAseqData.HNRNPC.bam.chr14} for more information about this data set. As a preliminary step, we check whether the BAM files contain single- or paired-end alignments. This can be done with the \Rfunction{quickBamFlagSummary} utility from the \Rpackage{Rsamtools} package: <>= library(Rsamtools) quickBamFlagSummary(bamfiles[1], main.groups.only=TRUE) @ This confirms that all the alignments in the 1st BAM file (run ERR127306) are paired-end. This means that we should preferably load them with the \Rfunction{readGAlignmentPairs} function from the \Rpackage{GenomicAlignments} package. However for the purpose of keeping things simple, we will ignore the pairing for now and load only the alignments corresponding to the first segment of the pairs. We will use the \Rfunction{readGAlignments} function from the \Rpackage{GenomicAlignments} package for this, together with a \Rclass{ScanBamParam} object for the filtering. See \Rcode{?ScanBamParam} in the \Rpackage{Rsamtools} package for the details. Furthermore, while preparing the \Rclass{ScanBamParam} object to perform the filtering, we'll also get rid of the PCR or optical duplicates (flag bit 0x400 in the SAM format, see the SAM Spec \footnote{\url{http://samtools.sourceforge.net/}} for the details), as well as reads not passing quality controls (flag bit 0x200 in the SAM format). Finally we also request the read sequences (a.k.a. the {\it segment sequences} in the SAM Spec, stored in the SEQ field) via the \Rclass{ScanBamParam} object: <>= flag1 <- scanBamFlag(isFirstMateRead=TRUE, isSecondMateRead=FALSE, isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param1 <- ScanBamParam(flag=flag1, what="seq") @ We're now ready to load the alignments and their sequences. Note that we use \Rcode{use.names=TRUE} in order to also load the {\it query names} (a.k.a. the {\it query template names} in the SAM Spec, stored in the QNAME field) from the BAM file. \Rfunction{readGAlignments} will use them to set the names of the returned object: <>= library(GenomicAlignments) gal1 <- readGAlignments(bamfiles[1], use.names=TRUE, param=param1) @ This returns a \Rclass{GAlignments} object. The read sequences are stored in the \Rcode{seq} metadata column of the object: <>= mcols(gal1)$seq @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Compute the {\it original query sequences}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Because the BAM format imposes that the read sequence is ``reverse complemented'' when a read aligns to the minus strand, we need to ``reverse complement'' it again to restore the {\it original query sequences} (i.e. the sequences before alignment, that is, as they can be seen in the FASTQ file assuming that the aligner didn't perform any hard-clipping on them): <>= oqseq1 <- mcols(gal1)$seq is_on_minus <- as.logical(strand(gal1) == "-") oqseq1[is_on_minus] <- reverseComplement(oqseq1[is_on_minus]) @ Because the aligner used to align the reads can report more than 1 alignment per read (i.e. per sequence stored in the FASTQ file), we shouldn't expect the names of \Rcode{gal1} to be unique: <>= is_dup <- duplicated(names(gal1)) table(is_dup) @ However, sequences with the same {\it query name} should correspond to the same {\it original query} and therefore should be the same. Let's do a quick sanity check: <>= dup2unq <- match(names(gal1), names(gal1)) stopifnot(all(oqseq1 == oqseq1[dup2unq])) @ Finally, let's reduce \Rcode{oqseq1} to one {\it original query sequence} per unique {\it query name} (like in the FASTQ file containing the 1st end of the unaligned reads): <>= oqseq1 <- oqseq1[!is_dup] @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Mismatches, indels, and gaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Because the aligner possibly tolerated a small number of mismatches, indels, and/or gaps during the alignment process, the sequences in \Rcode{mcols(gal1)\$seq} gnerally don't match exactly the reference genome. The information of where indels and/or gaps occur in the alignments is represented in the CIGAR strings. Let's have a look at these string. First the most frequent cigars: <>= head(sort(table(cigar(gal1)), decreasing=TRUE)) @ Then a summary of the total number of insertions (I), deletions (D), and gaps (N): <>= colSums(cigarOpTable(cigar(gal1))) @ This tells us that the aligner that was used supports indels (I/D) and junction reads (N). Finally we count and summarize the number of gaps per alignment: <>= table(njunc(gal1)) @ Some reads contain up to 3 gaps (i.e. span 3 splice junctions). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Put the read sequences and reference sequences ``side by side''} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TODO (with \Rfunction{sequenceLayer}) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{OLD STUFF (needs to be recycled/updated)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load paired-end reads from a BAM file} BAM file {\tt untreated3\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains paired-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated3\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads). We use the \Rfunction{readGAlignmentPairs} function to load them into a \Rclass{GAlignmentPairs} object: <>= library(pasillaBamSubset) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) @ The \Rcode{show} method for \Rclass{GAlignmentPairs} objects displays two {\tt ranges} columns, one for the {\it first} alignment in the pair (the left column), and one for the {\it last} alignment in the pair (the right column). The {\tt strand} column corresponds to the strand of the {\it first} alignment. <>= head(first(U3.galp)) head(last(U3.galp)) @ According to the SAM format specifications, the aligner is expected to mark each alignment pair as {\it proper} or not (flag bit 0x2 in the SAM format). The SAM Spec only says that a pair is {\it proper} if the {\it first} and {\it last} alignments in the pair are ``properly aligned according to the aligner''. So the exact criteria used for setting this flag is left to the aligner. We use \Rcode{isProperPair} to extract this flag from the \Rclass{GAlignmentPairs} object: <>= table(isProperPair(U3.galp)) @ Even though we could do {\it overlap encodings} with the full object, we keep only the {\it proper} pairs for our downstream analysis: <>= U3.GALP <- U3.galp[isProperPair(U3.galp)] @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query template} (i.e. per pair of sequences stored in the input files, typically 1 FASTQ file for the {\it first} ends and 1 FASTQ file for the {\it last} ends), we shouldn't expect the names of \Rcode{U3.GALP} to be unique: <>= U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) @ Storing the {\it query template names} in a factor will be useful: <>= U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) @ as well as having the mapping between each {\it query template name} and its first occurence in \Rcode{U3.GALP\_qnames}: <>= U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) @ Our reads can have up to 1 gap per end: <>= head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) @ Like for our single-end reads, the following tables indicate that indels were not allowed/supported during the alignment process: <>= colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rcode{sessionInfo()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= sessionInfo() @ \end{document} GenomicAlignments/vignettes/precomputed_results/0000755000175200017520000000000014516004601023314 5ustar00biocbuildbiocbuildGenomicAlignments/vignettes/precomputed_results/U1.sbcompHITSa.rda0000644000175200017520000044215714516004601026421 0ustar00biocbuildbiocbuildee?nP$SDTKiDQ ))AC nx;5q}8={fykߪU~фO+3ĎbOI)ةEOwTN#VE6~>g]t?i::t?t3J(7J(bF!fbN!XbY!VXbM!b!8p#!8D!x6v!ⅈ"A!x>D/H"U!҄HB%DBd3DyC Q K!x9ī!J(ox3DBQ)DBCQ3DC Q/DMC4"DB&D0G!ڇ8D]B|߆{!zO!!D?)CC 1<B1&B1!BSBL 1-3BG! 0ĢC, "B&B!C3ĮC 7ľCq0đBq&8bC\ q=č7C q/ăB<{B DB$$DB bt!҇"cL!^ Q"D(|wB nB40DC4 ,D-C &DB|߅[!zC 1$İC12ĨCL s_B{y!Xbqe!VXbuM!6b[!vbo}!8h!N8bC\ q3ĭC q7ĽC<0ģ +D C$4!x!DC >DB 7DC Q8DECXCJBQ:[!*R!Z!jv:!ꆨC4 (DMB ~v!>qOBt iN!> y/Bt%ķ! 5DC|G^!z?bT!sC, $kB 1Ħ[Bl W!8p!8D!N8Bq!Ŀ!z!a!x[!b"iB<"y!^ .DBd )DYBd -DB'DB Q$D/x9Dx5k!Q9DohmC I/Bte!z_A!bha!bdQ!Fblq!&bRCLk!fbv9!=ļC C, 8ĒKC,"Bl1;Bbg]!vb_!8p#!8T!΅C\ q=ĭC B<$2 +DqB DB$ 4DC *DiBd)DYBd =D9C ;DB Q8+!^ Q"DBCL!*J!x;;!jN!hY!Zh0'!:]B|kn!>DC 7D?B 14Ĉ#C 16ĸCL11!bz!X C,`qK"XVD*`}"vE;@#8.Ep9+\z7"nGp7{܏AocG'ď A"x.#x1d k#ArG7|`E"(K^D%#(A*DP1JTj"x'Zԍ^F,V>}G1O#g|tDU_GMF-|AD7#D04`tc"&EsD09_#G0#̍`~Dg #XD4e`e"@#8Fp,d"8Gp!\j"Dp/D/H"u4!҆x1DCd9DYCd jɚ3JԞ5jɚ'J(Q{L֨%kEB(%BTQ%D-B *DmB AC|}C|COCt YC|߆!bha!Fbt1!ƆbRCbr_CL 1-3B 1'b~?B, ,Cl W!vbo!8tLl|Bb jgz%(Q{G֨!k~-*g%^Q2zQEI%I|-*g{.JTΖ2JT6oEelQ94[(Del٣DlQ.[y#Q? G(E(/GTjQ?ǻ4?GhU#h|'tc",#tk"D00 `d"&G05iL`FE03Y,`Y#XG!Ḿ-;NNNN.Gp%܌vw"F=nā$d)YY99y%%((x;NFfV@{FƁ&fv> tt|:5-=3'7/0 080,0<0"0#07{`^`A_;{GG''gg. \ \\ \ \ \ <<< < <_Q%bbbb^ d      x#ft@@;wMM--:> |2U7o  =0/0?G`A52W@@@@@@@󁴁t􁌁Ĺ,lB"WJJ** T hhhhhhhhhhhh0Q'O]_ |!?c/Ɂ_SS3fff~ XXXXXXXXXX+=#w`g`W`w`O`o`_pXxdTtL\|BbJFfn^~AaQ+F v n ^ ~ A k [ { G g W`PphXx@@@@@@@@@@@@@> t |"ekgwOOAQс1Yف9+[vvNN \\ \ \\ \ \ \ < <_Q $ $ $HHHHHH((((x)J@7o* 4 4 4  |,E7]~ %09k`J`j`Z`zy? KK+kk[[;{{pqpwqϢ剁8xDHHHHY 9 PQEP$Ju2(r( ʨZhh&hhht9: 7=z/?~@ P(xLDLdLTLtLl\,B,R,r*ZD͉<[vva/a?$,*:n6.Q1 q<@JBjC&@NB>FCqWJ (jxQ}01C1 1a&faccvE+_3~@011C1 1#1 c-XX5X^ڄ-X$s S 70˟s|^>xx,A\C|$@"$F$E27}??~O1q I`2~o٘X%XXXXX؀؄؆;7vbvcNN y\EK+k[;{xGxx-jE؈HHHH<@*FŋHȀȄȂȆȅȃȇ(((x 2P%Q x eQQQ QUQ oTG D-FE=x M - m>|cVc-vo.>y\Ŀ˸븁[xGx'x-l@LBlA\C$sHi"!2"2# !;r 'r!!? 0eWQ%Q oM[(r( J*jx5P QuQ1Z }Ç.]?`c!cIR}01qqQ%PD]ûx !>FG|N]57*Zzl&ll6؁{ppGpp'ppgp._\e\5\ Atg_37] =z'z?~OQ1 xt)7QQU6Au@MBmA]4GKBkA[eX8s+k[;{ѢZR!5 -ң^(W*^C FE3 ` Lb bcfbfc.a>XXXXXXX؀؄؊m ۱c'va7`/a? 0(8N$N4,9ǿ˸븁;{xGxx-j,F؈HHHHHȈLȌȁȃ|(((x 5@Ixʠ,ʡ* :j&j6.]{hhhhVh6hc|O>]5=}??~OAQ Ib*a:f7,\X?˰+  [a;v`bN4,9\Ŀ+k۸{xxx-jDX<#R"R# ^D:GdDdE6dGNBnA^C~@!FKxU@Ixo ʢʣ** ;_0a&fa6`.~<X?K˰+kcN>!1 )?8󸀋pWpp7ppOϢEh1q /  -!=2 #2!3 +!r"r#" J (򨀊*jj]{hhhhhVh6hC|:Stg_3D| CWtCw|^>~#~  0 (8L$_0b bc~Ll\y?b!a1`)a9V`%Va5`-a=6`#6a3`+/l]؍=؋}؏8C8#8c88S838pq/.2*:n&n6.>!1)Eb &b!6 .!> !!1 )9C4D#4F4E34G D+Fh:Stg_ ߡ+;GD/F_bcbcFbFc bc&gS003fa6`.~<X?K˰+k[cNn^~AaQqIiYs8 q qWq q7qwpO,ZT<1  IGrHTH4H Y ّ_?c&cfwRJFl\Ǎh%+tG0 (XxL$_0b*a:f7l\:lfl6lǞhG AF@NBnE~@A›(PeQQQUQ oTG D-FE=x M-m>1>Atħ:KtW[|=}GA!aQ1q1b bc~Ll\y?b!a1`)a9V`%Va5`-a=6`#6a3`+/l؅؃؇8888888pp. nnG<0S1 3fb`.~<XXXeXXXuX،-؊;7va/ 0N4\Ŀ˸k;{xGx'ѢwX8xHDH$H<@JBjAZCzd@FdBfdGD.FE>@ABaAQb(P%Q [(r( ʨjjE}hFh&hfhhVhx>Gh :#:3|/_ ;tCw@OFE??abcbF`$Fc bc"&gS003fbvN^A1 iYs8 qWpp7ppwppOϢEh1q Iy@JBjAZB9T@ETFD]Fh&h6hvh.[tEw|^>~#` a0`(a8F`$Fa4`,a<&`"&g_1S1 1a&fa6`.~<X?K˰+k[a;vo.>!QqIiYs8 Kk۸xxxx-j1 qR %R!5 -^D:GdD&dFdE6dGBnA>GD!FK(QU(RxoM[((򨀊ʨjjE}hFh&hfhhVh6hC|:Stg_3D| wn= 1C00#1c01 &WLTLtoY91O,",,2, n>AaQqIiYs8 q qWq q7q qwqO,ZԨ1 q I y$ HHHxYِ9yPPEP/^FqWJ$Ju7Qo ʢʣ** ;Z:zx!1)9Z%Z5ڠ-G;|c|>/_k|o{@OBo` a0`(a8Fa4a<&`"&LƯi0 s0c,XEX%XeXXUXX؀؄؂؆;7vb`/a? 0(8N$N4,<."%\U\Mm]}GD!FK(QJ^xʠ,ʡ<*"*2*mꨁڨx M-m>1>Atħ9@g|. _|ߣzz?~O1q I`2~L4L ٘0`B,b,R,rJjZzlFll6؁{ppGpp'ppgp._\e\U\uMm]}GBaAQbx ^k(xoM[((򨀊ʨjjE}hFh&hfhhVh6hC|:Stg_3D| wn= }??~O񘀉 &c bcfbfcw| K ˱+ k [ a;vo.>!1 )?8󸀋pWpp7ppwppOϢEŃh1q IGrHTH4H Y ّ9 yQQQEe+xJ^xʠ,ʡ<*"*2*mꨁڨwQ ZZ }=>'耎>/_k|ozz~@00C01S1 30sb!`)cVbb6a+cNn^~AaQqIiYs8 q qWq 7ppwppOϢEh1q IGrHTH4H Y ّ yQQEP/^FqWJ$Ju7Qo ʢʣ** ;Z:wQ ZZ }=>'耎>/_k|o{@OBoA_` a0`(a8F`$Fa4`,a<&`"&a2~L4٘0`!a1`)a9V``-a=6`#6acvbvcbNN y\E\e\U\ -=<#GDaAQbxU([((ʨjx:jjE}hFh&hfhhVh6h#>%+|o{@OBoA_` a0`cFbFc b<&`"&gS1 1a&O,b,R,rJzl&lVl.~!qIiYs8 qWq q7qwqOϢՎ8xHDHx#R"R# !2"+#r!7 ? 0(e+xJux PPPj6.]GC4Bc4A3D+tAw@E?011 01b:f`&fa~<,B,,2jf; {qgpq:n&nY:1qI ) i"!=2 #2# "#r"7!? e@)(r(Q5P P1Z%ڠ-G;|ctħ {BE?  0 HXxL$ɘ阅٘?K ˱[.>1YsqWpqq8ZHDH/ %^DzdD&dF6C4DsÇhiY?˱O4ZUDHHx) pq ڻIP M - t;t^ˎ\ȍ(Ҩ!aX?˰kv`70\Ŀ븁۸{xGx'xgѢux eQQ5M - >@w/X%XeXXUXX؀؄؂؁{ppppO,ZqY9 yQPEe+xJ^xʠ,ʡ<*"*2*mꨁڨwQ ZZ }=>'耎>/_k|o{@OBoA_` a0`(a8F`$Fa4`,a<&`"&gS003fbfcw| K ˱+ k [ a;vo.>!1 )?8󸀋˸븁۸xxxx-j4G؈HHHH/ R"5 -^D:GdDfdAVdCv@NBnA^GBaAQbx %P:(PeQQQ QUQ oTG D-FE=x M-m>1>Atħ9@g|. _|}G!aQ1qI0300s0c,XEX%XeXXUX5XuX ؈M،-؊m ۱c'va7`/a? 0(8N$N4,9\Ŀ˸븁۸xxxx-jE؈HHHH<@JBjAZtH ȈLȌ,ȊlȎȉ\ȍ<ȋ|ȏ(B("(P /8^x %P:(PeQPPUP6Au@MFE=x M-m>1>Atħ9@g|. _|= ` a0`(aFbFc bc&gS0a&fa6w|?K˰+k[cv(8NN y\EK븁۸xxxx-jD؈HHHH<@JBjAZtH ȈLȌ,Ȋȁȅȋ|ȏ(B("(P /8^x %P:(PPPPUP6Au@MBmA]û M - m>|#>E'|:KtW[|=}GA!aQ1q I`2~L4LoY9y?b!c bcVbVc bc6b6c bv؉]؍=؋}؏8C8#8c88S838pq/.2*:n&n Y-b"""# "H) i"!=2 2# "#r"r#" 0%x5xo4BE9GTD%TFTE5wP5PPuP.=4@C4Bc4AS4Cs@KBkA[v#>%;tE7t聞胾?' @ ` P p8LDL+bc~Ll\y?b!a1`)a9V`%Va5`-a=6`#6a3`+v؉]؍3ppqO4ZHHHHx Y ّyPPEP/^FqWJ$Ju7Qo ʢʣ** ;ZwQ ZZ }=>'耎>/_k|ߣzz~@ ` 0 H8L$_0b bcb>88[;{xGxx-]D؈HHHH2!'r!?  %Cq(RxoM[((J*jj>C4D#4F4E34G D+Fh!>B{|O>%+|o-CWtCw|^>~#~  0 (L$)i٘X%XXX5X؀،-؊؁{ppGpp'ppgp._\e\5\ -=Gh :#>E'|:KtW[|=}GA!aQ1q I`2~L4L ٘0`B,b,R,rJl&l_؎; {qqqGq q'q qg._\e\U\uMm=<#<<5@LBlA\C|$@B$Bb$AR$sxR %R!5 -^D:GdD&dFdE6dGD.FE>GDE ›(PeQQ5QuP.=4@C4Bc4AS4C D+FE;|#>E'|: 7ߡ+;GDoA_` a0`(a8F`$Fa4`,a<&`"&LƯ 31 1s;a>XXXXXXX؀؄؂؆;7vbvcbNN y\EK+k[;{xGx'xgѢF[X8LȌȁ<ȋ|ȏ((P`XXXXUX5Xu؀8˸u"$F$E2<) Y ّ9 yQQQEe+xJ^xʠ,ʡ<*"*2*mꨁڨwQ ZZ }=>'耎>/_k|ozz~@011C1 1#1 1c111 ?LƯ阁00s0c,XEX%XXXXX؀؄؂؆;7vbvcbNN y\EK+k[;{xGx'xgѢbX8xdH) /"2 #2! !;r "  (^B1+xJ^GYCyTBeTAUTCMBmE=hhhhhVh6hE9Z|]11C1 1c001 ?LƯ阁00s0cXXXUX5Xu؀،-؊m ۱c'va7`08N$N ÅhOXc88+]:R(hX ؍=؋888c8S838pqWp pwO}?HHȀLȌlȎ<ȋ|(((JMFYCyT@T;ڨhhVhh!>'. ߡ+z/~@001 `2~LtoY91O,",,2, *:l&ll6؁{ppGpp'ppgp._\e\U\uM<#<<ųhQ-1Z D,FE?' @ ` P hXxLDL+`*c~Ll\y?b`)a9V`%Va5`-a=6`#6a bv>aQ iYs8 q qWq7ppwqO,1 q I )i/"#2! "r 'r!7 /!? 0%(W*^C D)7Po ʢ<*"*.)Z->@{|/5;GDoA_Ǐ 0C00#0 1c111 ?LƯi 31 1s;a>XXeXXUX5XuX ؈M،-؊m؎;{ppGpp'pqg._\e\U\u-=<#<<ųhQ+mX8xHDH$Hdx#9^@ DjAZtH ȄȂȆȉ\ȍȇ(((QU(RxoMCTD%TFTxQ5Q QuQ b4b&g)\[{xCLBlC|$B2CC4Bc4E3@KB=>'9:KtW;tE7t聞胾#~  0 (L$S01Gp'q p)Z("(W:>Cwa1q I`2~L4L ٘ 'bc bcVbVc bc6b6c bv؉]؍=؋}؏8C8#8c888pp. :n&n6.> Y-b"b#!> !# "Hi/"#2"2# r" 08^kx ePo#G|C1 #003~LX?+ ;wϻ[tEw  (8LDL/)5X ؈-؊m ۱c'va7`/D/R!56a 2F)QU(hFh&hfhhVh ;tE7t聞~#~  (8L$S003fbfcw| K ˱+ k [ a;von^~A1 )?8󸀋pWpp7ppwppOϢEh1q PeQQQQ5Q Q.=4D#4F4E34G D+F1>AGt%+|o-CWtCw|^>~#~  0 HhXxLDL+V`5a=6b`v`vN>1D"##2!#'r#Z5ڢ=>_?~ 8L,B*flAa1IiYs8pWq q7q qwqO,W1 I #9^@ D*FŋHȀȄȊlȎȉ\ȍ<ȋ|(((x 2]4@#4As@h>'O +t^荾#~P (xLD)i0 s0,b,R,J%aa6a3`+v<. &n61D6.!#)9|:Stg_3W;tE7t聞胾?' @ ` P (8L$_0b bcfbfcw| ˰+k[۰c'va7b 0! Yv- #!!1y$ HHH ȄȂlȎȉȃ(("(*JDE9GTFTۨzx #/_+|o-CWtGD/FE?0C0 #0 1 &c*7l\XEXXXXXX؀M،-؊m؎; {ppGpp'pg._\5\ -=<#<<^DlA\C|$@B$Bb$AR$sxR"R# ECzdD&dCDnA^GD!FE1x%P ((J*jj=4@C4Bc4A34GKFht@G|NA!aX%XXUXX؄-؆؋C8883qu{/ %r#/ (,ʡ"*2:j6> %Z5ڠ-G;|-Cw@OFE? 00C10c003~d) 0s1O,R,rJl&l6؁{qGq qpEŋȍ|(PqGqqEhɑِyQQEP5D)򨀊ʨQqpq._\u܈3" @-4ASo?a0`Fc&`2a&fa6b!bVa=6ab?4y\U]%+|o-CWt聞>~#~  0 (8L$_1S1 1O,, *:l&l! iYE\e\U\ -=<#<<ųhQe-b"b#"#"# "H) i"!2"2# "#r"r#"  %(W*^C D)7&J-AYCyT@ETBeTE5wP5PPuP>C4Dc4ASD+F)>%/~OI+`*afbfcw|,XXXX5XuX؄؊m؁ {pGq'ppgpe\U\u-}XXXX5XuX ؈88p. nnF7c103~d)i 31 1s1 K ˱+ k [ a;vo.>qI?8q Wp qwqO,Z81q I y$ HHHHȀȄȂȆȁȅȃȏ(B("(P /8^x %P:J ʢʣ** ;Z:zx!1)9Z%Z5ڢ>Gh :#>E'|: ߡ+;GD/A_111C1 1#1 103~d)i 31 1s;a>O,",,2, *:l&lVl_؎; pGpp'ppgpp.*:n.>)EjSb  .!2"3"r"6]4N肯 'ppqw @JFtH ȈLȌ,Ȋȁ\ȍȇ(((x 2(7Qo ʢʣ2*mꨉZwQ %Z5}Gh>_ ]ߣz/?~  0 (8LDL103fa6wßXEX%XeXXUX5XuX ؈M،-؊m ۱c'va7`/a? 0(8N$N4,9\%\\5\ -]}%+|o-CWtCw|^>~#~  0 hxLDL6n^ai+g@,$@b$A2D*d@fdGA>@1GIT@%TE ûhS030 K+a7 (N,<%\\5\ m]}7]ߣz~@011C1 1#1 1c111 ?cNN >aq GrHHx ّ@g|. _[|= }??~O񘀉 &WLTLto٘0`B,b,R,rJjZzlFlflVl_؎; {qqqGq q'q q._\e\U\uMm]}XXXXXXX؀؄؂؆;7vbvcbN4,9\Ŀ˸븁۸xxxx-E؈HHHH<@JBjAZtH ȈLȌ,ȊlȎȉ\ȍ<ȋ|ȏ(B("(P /8^x %P:(PeQQQ QUQ oTG D-FE=x M-m>1>Atħ9@g|. _|ߣzzǏ 00C00#00c0003~d)i 31 1s;a>XXXXXXX؀؄+[;xGxgѢb &b!6 .!> !!1 )9Ftħ:KtW[|=}00C0#00c13~d)阁00s0c,XEX%XeXXUX5XuX ؈M،-؊m ۱c'va7`/a? 0(8N$N4"%\\5\ -]}<#<<j@LBEX%XeXXUX5X ؈-؊m ۱cvc/8N$N4,E\\5-=C|>?' 0 h8L$_0s;XXXXXXX؀؄؂؆[{xFD$Bb$E2<R"R# "#2" +!r"r#" 0(8^((7&BEyT@ETBeTAUTxQQ>>E'|. _| = #~  p(L$_pqqp'pgpq/.2nn>! EDKȄ,Ȋ|ȏ(x PU@I((JxQuQ>C4Dc4Evt@Gtg_3+|= GAQI٘K+k۰;)B(x:ʢ<*2@!1q I`2~L4L , 'b`)a9V`%Va5`-a=6`#6a3`+a;vo.>!1 )?8󸀋pWpp7ppwppOϢEh1q I y$ HHHxYِ9yPPEP/^FqWJ$Ju7Qo ʢʣ** ;Z:zx!1)9Z%Z5ڠ-G;|c|O s|]7ߡ+;GD/FE??abcbcFbFc ba5`-a=6`3؉؇88 q)ڸm؎8[m|\d@oXL/阁0 1s1`B,,2*Zll_؎;{pqGp'ppgpp/.2*:n&n!1)E?8xHDH$Hdx#9^@ BjŋH ȄȂȆȁȅȃ|ȏ jx:j&j6]{hFh&hh6x>aQ1XXXC8888s[;{xGx'xg&b &b!6 .!> !2# #' ?57PPUPj]GC4AS4Cs@KF): 7ߡ+z/abcb4`<&b~/_103fb6`.~|,XEX%XXXXX ؈M،-؊m ۱cvc/a? 0(8N$N4,9\%\\uMm]<#<<ųhQ%-b#"#!!1 ) HHȀȄȂȆȁȅ<ȋ|((((Q$^xʠ,ʡ<*"*2*mꨁ:zxM - m>C|:Stg_3D| wn= }??~O񘂩00s;a>O,",,2,*:lFlVlv؅؃؇8888888pp. nn Yc &b!6 .!> !!1 )9/_k|o{@OBoA_` a0`(a8F`$Fa4`,a<&`"&gLƯY91`B,R,rJZl&ll6؉؋}؏8888S8qp7ppwpOϢ?؈HH$Hdx#R"R# "=2 #2!3"#r"r#  %x5@IBi2(rJ*j&j6]{hFh&hf^荾 ،-؇8C8#8c8S838pϢM8xHxɑ) i"!=2 #2!3 +!;r 'r#"  %(ʺ&-XyKkQ*$ĐGJIbI"I%|/$A~IJ6!9%RP Ia)"ERRZ~2RVIy T*RUIu)ԑROKi(4LK i)Hki#oVK(tn]zHO%}d 2IT&e̔Y2G/#rTq9!'\rCn--+~/(A,!XHRI&%%4VKA2J&"Y%dKrK+$BRXHQ)&ť򣔑򳔓RA*J%,UTRCjJ--uԓ@J#i,Mt.MzI_/e Q2Z8/d&e̒2G|Y e,L Y)dN9+\+rUu!7ܖ;rWy(G_KB_ I,I$$JRKI+$䐜KrK+$"R\JHI)%G)#eg)'奂TJRYJ5.5L@"Y,Kd,BV*Y-kdQ6f"[e?YB%LT_V"K*$ĔX[wOKI$>' $"I$$BRJjI#i% dLYJ6.9$ܒGJ>/RDI ))?ORFJ9)/TREIui$4fBZJ;i/tĒRHv5dgZIJz(%dl]rK'bR\JHI)%GIRNK(TRMK )ԑROHCi$4f\ZHKi%Hki#oVI{ t.UIw)O(d 2L)dq2^~ 2Q&d"SeL2Sfl#se̗PbY*dJVY+dlI6*d쐝[^'CrXQ9&\rI.*ܐrKn+/RLJHI)-?ORF~rR^*HE$TRSH=/ 4&TI i)>OjY#ke쑽rBe+O兄J|YFbJl'%$ I,I$$BTZHZI'% %d,UIv!9%/rLI9-g䬜 rQ.;[>H6ǒZH',]2H%dL2[\'dlm[N).O乄kKt!I|I >($dl[JiYI%i.KeME~9 #rJNY \+rM y <'TKy%oOK^>? ,!XHRI.)$|/$A~I2K)$䑼OK)(RBJIiIHY)'奺ԐRKjK+4&LKKi%e !2Tp!cdL2SfBY"+elrHQ9%gܐQ>Iؿ*W$FEJ4.1$ĒGJ$|  B 1$ C RAjHi! dL@V!\@^BPB1(%$#3P*B% U*TPjB- u.ԃB#h M)4ZB+ZC~C3t C }A0PaQ08&Da:̀0 f `>,RXaUZXalMVa]^CpQ8SpY8\KpU܄[p]<'sx ;H | ! Dh bC A< ԐB: Y +drB ?BPAq(%'(eg(6ԃCh ͠9 6+m:Ag]tzAo}0`Ca 0FhcaaLI0Tâ0X`1, X `5`3l  cpNI8 sp.e :܀p n ><x 9?7 ||P/_H | ! Dhb@L!ą ćBbHI!9=Ԑ2 2C ;䀜 rC ?P C( Š83P*B% U*TPjB- u.4F@Sh͡V 6+m:Ag]tzAo}0`Ca 0FhcaaLI0TāY0\a,ERXaUZXalMVa]^CpQ8SpY8\KpU܄[p] p18'$p98"\p57&܂p=!<3x/x 5'ox#3B|H | ! Dhb@L!ą ćCBC$$ArH){H! t22AfY!drAny!P Aa(EPJAi~2P~rP*@E TjPj@MԅzP@Ch 4fZ@Kh@khoA{t.Aw=>Aa !0p#a10x&Da Li0fLa̅y0BXa ,eVJXa u6Fa lmvNa}A8cpNI8 sp.E \kpnM܅{pCx G>g0W"C :Ā bC A< !$? H I )$R RCH =d #d̐B69 'ܐB> PB1(%$#e, 4Ch ͠9 ~~ߠ-:Bg]tzAo}0`Ca 0FhcaaLI0TāY0\a,ERXaUZXalMVa]^ p18'$p98"\p57&܂p=!<3x/x 5'ox#3B||~ o!2D C 6āăB"_@`ĐB2H) %| 5C2B& Y +drB. y /P B!( E(PJB)( ?OPPC2TP C 6ԁPCh14 C h h mW B;h#tB7='B?` 00#`$08`2L0 `6́0X`1, X `5`3l  `7쁽80p 8 4p2\p 6܁px1< ^+x o- ;' _2*|BdQ!DbAlq;!$D! $dR@JRAjHi! dL@V!\@^BP@Q(šRP~, 4Ch ͠9 ~~ߠ-:B' ]+tzB/ }/0  C`( 0F( c`,;L0 & `̄Y0\a,E2X+`%հ:X`#lͰ6;`'ݰ> p18'$p98"\p57&܂p=!<3x/x 5'ox#3B|H | ! Dhb@L!ą $|!!!CH 9=ԐB:H 3d C 7䁼C(0P C ( 4?A( ?C9("TPB55&ԂPB= !4B3h-%_5_7h =t :C ݠ; zC ? 0 `80 F `<`"L043`&̂0< `!,Ű2X+`%հ:X`#lͰ6;`'ݰ> p18'$p98"\p57&܂p=!<3x/x 5'=|| a+S˯"7-D(At1!Ć8x@BH> ~A !@RH!!4Az?@F! dlr@N!| @A(bPJ@I(G @YAyT*PAu5Ԇ:PA}h 4&Ash- A[htN@Wݡ^@_a A0PaQ0XwaL)0t3ă90|X a,%rX+a5zal-v;a=~8#pq8'3py\+pu7܆;p}x<'sxKx ?/x{!W_Eo[ Q *DbB, q .| >$|  B 1$ C H C*H i -~ 2C ;䀜 rC ?P C( Š8P JÏ3P*B% U*TPjB-uԇAchM4Z/~ߠ-:B' ]+tzB/ }/0  C`( 0F( c`,;L0 & `:̀0 f `>,X `9 VX `=l 6 `;쀝 v `?p8 8p N8 <\p . :܀p n ><x 9?%Ÿ=|| a+Sů"7-D(At1!Ć8x@BH> ~A !@RH!!4Az?@F! dlr@N!| @A(bPJ@I(G @YAyT*PAu5Ԇ:PA}h 4&Ash- A[htN@Wݡ^@_a A0PaQ0XwaL)0t3ă90|X a,%rX+a5zal-v;a=~8#pq8g p.eW\p n >yp܃= nzp˃<Oz=Py0܃=D&y0ك)L`=\y0߃,`=XRy܃`kaSϘ3^G>gB$B4 ą ? H I )$RAjHi! dL@V!\@^BPB1('(eg(TJP@5 4&Ash- A;h#tB7=0`Ca2L0f\a,68 KpU܄p}x<g/_H | Q!DbAlq;H !!1$ RCH 3dr@A(EP@Y("TPB55Ԇ:PA#h M4ZA{t.Aw/100&a, V*X alMp98"\pnmw܇cxO<W=|| a+W"C1 &Ă/CBC$$ArH){H! t2@F! dlPB9("TPjAmu4F@ShmB7 C`(043á0BXa u 6 `;쀝 v  p 8 4p.E \kpnM܅{pCxO)< Ÿ|hbw ) RC.ԃAch͡ @ #`$10&$ alMVa p.eW\>BWW@T!ĄX@\A|H !/?@ CrH){Hi! @V9!<A~("PC UTP jC >4Ch ͠9 ~~C3tnz@O}/A00caaLI0 `6́0X `=lM6;`'ݰ> p 8<܀[p^x ;>篮~Q :ĀX@BH! $ RCH =d 2C!P B!( E(PJB)( ?OP*A ՠ:ԀP jCO0  `4q0&$ S`*L0|XK`U[a;쀝 v8#p. w܇x /x - *D( C 6āăCBC$$ArHCjHi!!d,Av ?PJAi@y U*ԂzP@Ch 4fZC[ht.Aw 700#a10La̅y0v;a솽pQ8$\+p#x O)<{@(bB,A|H !/?@:PJ@I(G @YAyաԂZB+:@'a !0FX`2L0 `6́0"XKa% Va=~8W:܀[p]<'B  bC\? H I )$R RCH =d < @A(bPJ@I(g(TJP C ԅZ@`0 0F `<`"L0t sa>,X `9 VX `=l-v `7p.5w.܃x 9?%?||Pfd!Ć8CHA ?@F!P JÏP*B% U*TZB+A{3t z@O0 `8Q00&$ a),VjXka 6f[alvn{ap8'܆;p}x<'sx 5+UT!ĄX@\B" H I 9=ԐB:H #d̐ r@.PB1( ?OPPC5&ԂPB= !4B3hmW B;h#tB7 a A00&$ S`*L0f, s`.̃"X K`)56Fa=~8#pq8 <\p5 <Ÿ|0_E( C 6ą ć@bHI!$4@V /䇂PAy U*TPjB- u.ԃfZ/~:B' ]+tzAo}0`a 0&$ S`>,Z`3lmpQ8p&܂;p}x/5WH CL!ą $! $R RCH =d drBn PJB92TP C 6ԁPCh14f~zB/` 00 `40$3`̃f `;쀽N ܇ ^_BC !.| !$@`ĐB2H 3d C !PB1(43P*B% UT:P@Ch:Ag=70`#`$)0 `>U6Fa l>p \p n > P C (TjPj@MԅZB+ZoAW=>Aa !0p#a100&$ S`ٰ̄6Va]> #pq8 "\p]<' ^w7!Ā A|H !@ AbH =d #d̐B(0P C (?Ce )4ZAkh~@C` 0F `<`"L043`&̂0< `!,Ű2X+`%հ:X`#lp18'$p98"\p57&܂pSxՃ H | 5tB6 y8P@5 u.4V@[h3tzAocaaLI0TāY0RXaUZXa l v^p98"\pn]<^kxoO >? >C(}0|Q!Dw! $dR@JRAjHi!d,Av9!P C ( 44 C h 0 `80 F `Li0|X a,V*X `lvn `?p1W\pnm ><x 9?%OB! |e,_Eo[ :Ā ~A !@rH){Hi =d #d̐B69 'ܐ Ba(ԇAchMt.` `80 F `,e VX `+}18'sp.% W*\pn- w.< ŸOq!ć/BC$ԐB:H #dlr@N!| @A(EPJAi~2PC )4 ~:Ag]t^Paq0~ 0t3ă90BX a  `7쁽80pNi8g p57&܆;p}x1< w7_ٯ"7@T!ĄX@\!$D! $dR@JRCH =dLAv9!?PAq(?A( ?C9(TPC#hM4 ~:a2̀0 bXka=l 6 `;쀝 v  pN8  \sxKx ?||i$At1!6ć!!CH){H! d rB. y!P Aa( 4?C9ԀPB= !4Z/v:@G tzBo}0 `$08`2̄Y0|XKa9 pNI8,p.eW:܆;p}x1,Ű fys.c0s>?mq9,.Y\bqu7-nyEp]8-X$Hy+^7Ef1;EN-bRByT*PjAm#u4f\ZHKi%Hki#oVI{ tn]zIo+d 2RF]&d-sd̗P(dlMv!9*䤜rF99/ܔrG=y y''/+D[J|I W%P$DKI*$|/%t^~,]rJ.Np S0d89rTEe*U-[ԴmQ?C?4C?Z6h:.zaFQa`쐝OA9/\+pu 6܁{.w ]xc܅.w ]DžO^υH.Dq! 1\Blׅ.B A.Bbԅd.p! i\HB:һ 9\Bυ.p \(BQP܅.r ? e\(By*PŅ.p ]B]ą.4s =\B/0ԅa. wa #]hƺ0Dž.sa \XJVƅ.sa \!pԅc.w ']8κpޅ .\t ]UpDž.w O]xK^څ\?.|r ̿H.Du! ]r!؅ą.$s! i\HB:2݅.v! ](BA P̅.Tr U]BujPӅZ.v ]hBC؅.Bkڸ m]hB{:х..t }]B0ą.qa \ȅ.ra {]np˅.q ]xcԅ?\x+޺ ΅\B a.|qu! Q\B4Å.r! q\B\r!ą.$q! \HB R ]HB:Յl.dw! 9]Bnυ.t ](B1*Pͅ.p u]B}ЅF.4q ]hB+~q m\ͅ.tp \BW݅.t ]B_߅Q.va \.Lpa \0ͅ.pa ]\滰.,ra K\X2….wa ]^߅.t ']8iθp΅.\p 7]ԅ.pq ]u!̅/υH.|·.Dv! Q]BtbӅ8.s! \s!.t! ]HBZҹޅ .du! ]BNrP.r e\(BejP߅.4t M\h/.v m]hBG:م..tu ]B0ȅ. uw&0хI.Lva S]tf0Ӆ9.sa ]Xbԅe.,wa +]Xֺ΅.lpa \ͅ.pa {\>pC.s ']89.pɅ.\q \ npۅ.}-Y`1b`#-FYc1bx-&XLd1bTs,Z,Xlb ,XXgbFM-XlfbN]-Xܵo ,XxgGa_"[Dn"E"  _d-RXHm"EVly- [(jQ̢EIR-~ɢEY-YdQ٢EUj-jXԴeQۢE]-X4heůYhgޢEGN-ZtaӢEo>-Y b1bHQc,Zn1b$S,ZLk1b ,V[lb>,Z8mqe+W-Y\a{X|ljfo-"[İi"E"  _@ I,Z`"EVl-rXe"E^|- Y(eQG?[(oQE%U,ZTnQâE-u,ZԳoТE3-,ZZŢůYj͢E,z[kϢ,Z a1b,&[̶c1bK-X\lqCϑ,j"Ellޥlޝ ?vܻaϧ wlNooPCj(ݡwjPs2o 5Lh|#0wBhz? f6̛jP77PC-h72Q0`yB5;=PC 56ak٧M /C~ 5á6|džP0)PgB5sj.6j=B"ta25"|3BMnj#j Bgsy|^4LCM^&Psׇ;>N556v#0}f.a4^_C jnPs<57v}JJJIIIIIIIIXBܹa 6B s%3) ӕ0ӕ00ӑ0ӑ0ӑ0ӑ0ӑFaf0sd1f0s焙;&-aN 3wICf0󾇙.56-3] 3] 3okyK;0ocy LLLLLLL{fzfzfޯ0^),,,,,t,t,t,цZZZZZaoaoafW0}fLLn38ްٷaaa fN3ak&caDaa fEaaaa 0000000000000000ϰ;]444444444azfzfz0 3ߡaaaabz/f}1bt/_L7n~1wFG,&_?Q$DXWI|I %KJ$dRRKZI/%dCrJn/"RL~RA*Je*5Ԓ:ROHCi$MJ~6򫴗NCzJ/#d 2Dh#ceL27yp.u><sxKx|Я"E(bB, q .ă=Ԑ2 Av9!7P B!( Š8P JCY*Be ՠ:ԀZPB= 4&v:@G 0  `40BX `9Vap 8 g,Kp5-wܓCH<5 C^[y/|P /2$ȷYHT ! $ dL#egUV+:B' ]+tzB/ }` Q00&*e̒2G|Y e,%TrY!+e5Vz el-U `7쁽80p É5;[O5ط"E R~rPAY?;(砢J*;⠚j88h䠱&:hᠵ6~uAw=tA} p0 v0x;`I9`V;X`68`m;`883:8;9wvSĢvA\9 :s A`$qA2pR9H ~pA&dsA9rAysArPA1?:h.:栻z:`a;`QF;`q;`f9`8X`V8X`8X` 69`v9`88N:8ଃs;n:ඃ8xo|tEHq9 8;$pׁ$vAR$wAJ;H 4:duA9rAAuPAIvPAYTtPAeUtPAmuuPA} 4tAcM4uAK⠵6:8蠋9z99`9`8`):`;X`V:X` 69`}N8888ࢃ8n8ஃ{;xv|X9: b9 sA| $tȁ?t8AFYdsA9sArPAEsPA %rP~rPAY?;(*;⠚j8頖8렞8h蠑8hꠙZ8h頕~sAg]tsA=rA}s r08;`I&;`f:`9`9X`V8X`8X` 6:`m:;8ःS88.9ઃn888xృ':xใ^9xSĢGsA $rׁ9vA duAnyuA~vPA %r2:A9TpPA%TqPA55tPAusPAto:젯~;`9`F9`q~w0DLv0T3t0\wK,s +rkslrNv~tpapp)qpu7qpupq'sp\rp\wpM:':X8ǁ?8H ;H L2; <:(䠘J8(場䠌~vPAETqPA5pPA- 4wA:A[w!"%]#-## XXXuXMmC8#8c838xxxwŊ(."? "0I#&i#>"C2F S2G KF [G GrF WrG OF _G@ FP GHFXGDJFt~O(9"P>"P1"P%#P#5#P+#P'u#P/#  #(#$"<-"2"KZGM~ohvh.n^> IX%XeXXUXpօ>lgG81߱1ױwt# X81ƱNf\*vp̷Gl; ~A ΋mm澉RQ*I -AHo#}2HP&e2I&)d̑y2_6F$elݲG>/䰜r^.E,7ܖ;rWsy!Ky%卼?|8J,-q;'%$ @ I,I$$BRFJ: $dMKN%RF~rRYH5.5ԒRWI}i&ͥ"t.UI_'e A2X0.#e2N2A&!d̗PY*eAV&e}_A9$cr\N)9-g䬜rA.%,W\rSnm#wܗPcy*奼^>GG>g /UbHL%%ē+$%$JIz ?H6.%R^*Je.5Ԗ:RWJi*ͤtSzIo#}2Ph#ce 2Q&d"SeL2ObY"dղF:$[erP9.'䤜rA.%"W\rOy(<RA>',&_ݷYJ4.1$|'$$#' $XIrI!)%d,UIv%$RH K)*ť$奚ԐROHCi,M4BZ/YJ7.=2PH%cd 2Q&*d̐Y2[\'d,eR:Y/dlCv.+G帜SrF9(\[rO#y,O乼J^xHd"1%Ė@KbI"I%$J2I-y$䓂RH K)*,奂TRMKCi&ͥ_7i+t.]zH_ e 2JF+dL2]f,-sd,F6F,[dݲG9(rF9,W\rCn=/1߮>fc|7c>|o(|̷=>f=S0 c1>f/=c̹k3>fn}LT7ju 3{> mc̓3/>- 3#>>> s>mtttt>C IA91s^~3~7& sNL7L|fBcanI}]c1an/sW;q0o|=sϸo<0ƟO|&17Of|_$_sWy+}kD_dk5߽5oV_kr5oG_dk5|Mnf|Mv5 }Mn kr5|Mnm |M>&_kv%&_k5l|M6f}L||M>{wa5||M>&_Vco_3&+_F]b5|7|Mv; syk[̑d{0y5LǍIkni_an\_dknT_07G܍&[_܂~f^"jD73s0wi~>agz03gn?3~~~v33gfگa̴鄟g? ? ? ?3~̮O?3~f>[g|L~&c?=?dgfgr397٩~&/?&3߁~&7?}g73~3LN~&?gY7ar3'~&+?3~f.Lf~&#E?3~O 3~ό32^&G?W?3~&O?'ar3o7yG3L&SM&Wdo27Y,]offMfM7{sqsg4LYF6#ao f/NN>_07tttttMfoftti.F7tt ͮ77ofg3+++fM_͜97soo:o:ofhof̺fO=o:o:ooof̾w##3fMMMW 3floooooooooozo:af=ӍӍ3fLGLGL7L\Y0[)`0}`07<&}}y-`?0oBy{`:```````BCyL'L'̾0yLf?7LfL&#Lf7L&q8d09L&s&u:d`r0L&qf`Ffop00#;000`24Yy4hmy[df6l>dd2܃LA& u:d22\ 29dvvA& i4dn Y,dd6d6mAfg,pAfod9ȼAfo92sd 3A 2d3d 2\LAfdvnٹAfLAfLA& Nw:dr29LA& s9n w;l6yM&`w;l6yMfƃ͌>>>>66<~`lzlzl{JJV 6>t&`ͮ6o|PGf]lς>6666666666lzlzlzl>t#a`3f}lllllllllv@f>`slzlv@OOOJI+> 6o@yml` `ӡ`6;#`ӧ`]|0o{U%[f=l}%kfw>--`M[lzllzlIUUTTTTTQNHHHEyBbӑӑӑ.nnn^^^^NCL!&?B1{#7B1{#VC̛b2 1y:p؁#u8:p΁\p n:pˁq9؁vox{>8сO|q_:́pe@D"9ف(Du @|8ЁD$s H@:2:Ɂp _qo;PJthahaaaaa0\x;v`u4;0ہs` X":܁q`XF69@!lq`^9pƁ\vm8pׁ{wx+^;Ɓw:Ձo|w?o/cd8Ձhp q@<;āq H@2:́p %(@i8Pցrw@:Ṕph@C;Vvmh@{:8сNtv@z;ǁ w`#倇x9rہq8뀟d80Á9,t`[~8pԁK< _(LT&e1LB&1I$c3LL&7)a2ŘLi,STa2ՙL[h;` x0|!&vA)iw4.Nn07[m.s<`2)yμ`^2-y|`a>2_+ O?#@T q .ăAbH IsL&;)a1%L)4S)˔c3L%2STc35L-6Sc3 Lc ӌiʹa1NLg ӕ`z2L/ӏ `2f(3Ό`<͸/24f:3bf3s|fY¬d2AL0la2ۘ.f/s9a2Ǚis\d.1+Usdn1;=>y0/7fOLD&2f0 L&)IǤgb0yLAS)cJ1L56S4b3ML3%ӊiʹa2L7ӛe1@f3 e1#Ɠb\/3Lgf03Ylf3,`3K2f9YŬf63[vff0{}as9g1}yy$*C 5&ԂP@Sh͡V@[h#t C 7`0 0Fh ^opX> ~a L0f, s`.̃"X K`),V*X k`-6& A !6;`'ݰ> p18'$p98"\pu7܆;p}x|  DC 6āCH 1$ C H 5C 3d C / BP@Q(š2PAyա%v:@G];0a x'x `L0flsȧX `lݰ> pNi8w.܃#x O<^kxo|Ow??"B$ Q *DbB, q .ăB"H I )$@ZH!dL@V!\<ߐ B!( E(PJAi(eT*P jBmuԇAh͡V@[htN@Wݡ^BC`( 0ƀ0ƁCxaL)0 s`>,A8 '܇x 9[x|/o|!D(Alq!ćAbHI!9TA Y +drB. AC~("PAq(%2PAyT*P C 6ԁPCh14 C h + zC ? 0 `80 Fx0| `2L0 `6́0X`1, VJXa 6CCl  `p18'$p98"\pM> ~aLI0TāY0\a,ERXaUZXalM B` lmvNa}A8cpNI8 sp.E \kpnM܅{pCx ^x|//|o~OGhb@L!ąx@bHI!$RAjHi! 2C ;䀜 rC>C(0P C ( 4PC TjP@Ch 4fZ@Kh v:@G]+tzB/ }/0  C`( 0F( ^opX> ~aL043`&̂0<K`),V*X k`-6& A !6;`'ݰ> p 8 4p . 6܁3x|//|o~O D(At1!Ć RCH =dBP@I( e,P*B%5&ԂPBh14 C h 5C3t C }/0  C`(Q0ƀCxaL)0t3a,eVJX k`l `7쁽88p N8 <\p . :܀p n}x<'sx/7{G ;O C 6āx@BH! $dR@JH! t2@& Y ;䆿!?"PJ@I( rP*@E5&ԂPB= !4C h 5C3tnz@O}/ 0 ( c8_@`"L043`&̂0< `!,Ű2X+`%հ:!a+lv. {`/p!8 G(Sp98\p#x O)<^+x o- ~/ S(D bB, q .ăB"H I )$RB*H i -2B& Y +drB. A o PB1(%$PAy2TP C 6ԁPCh)4ZB+h m-:B' ]+tzB/ }/0  C`( 0F( c< \ n |!a' __ ; ~ß!D(At1!Ć8A|H! Az!d,rBny!P Aa(EPJAi(e P*A ՠ:ԀP jC >4Ch ͠9 ZCh =t :C ݠ; zC ? 0 `80< \ aLI04Xa),V*X k`-6AVap 8 sp.E \kpnM܅{pCx ?>gW_?E"@D! Dhb@L!ąx@BH! $dR@JH! t2@F! dlr@Ny /䃿!?PB1(%$PB9("TPB55&ԂPB}hM)4ZAkhm:Ag ݠ; zC a A0p> ~aLI0Ta&̂0X` ,e,\+p- w.܃#x OW[>'?E#@D!=d 2C \B>C( ŠTjPj@khmt.Aw` 00#`$0<ca?@ 0&dSaL0fla,ERXa5zalvn{apa8 KpUw܇3x ?S,DH@  1$B Y "PJBiUTPjAmuԇAch͡=tN C 7`Ca 0Fh7q~`:̀y0"X a5F8 '\px5>' __ ; ~ß! ĀXCH T@ZH!d,C 7P*@EU*ԂB3h-=t :C ݠ; zC ?  &T3`&̂0< `!,%V~8#pq8',\Kp#x 5>gW7ObCRH =d@N!|7:i?| p,p, plGH8ck8vcW8`8Nt8΄l8.b8.r8j8F8nv8a8i8׊w_?@H:]ԁntt;hWw=! CL vqhv(@ Bq:]ӡ)Cʒrnttՠ&Ԇ ZC[h#tB7=7 Ca4q0& a9ff0{}~s9˜c3+}yL_3Ό`F11b71,f.3Y,a1˙JfYìe1 Ff bf lgv0=18s9ɜe1 Es\c1'Sy|`>2_+`~2̟Db"3QL &&g0 L&)Iͤa2L&#da2٘L&S)c3%Li S)ǔg*0JLe STgj05ZLmӘiɴf0L+Ӎdz1ƃd73e&0Idf*3f3 "f)Yɬf0kuzflf`&lc3;nfg0$s9Üe2yüe1?g':Geb2qLB&I$e1əLJ&Iäe2ՠAw= z6cנA  6b0`p# F6c26p5gh0`$ f4e0`\y ,2Xl`2+ V2Xm`z  6l6261b`v; 08dp13g 2mp= <1x\(Q 4e Ab$) R1Hg A| T6bPߠACM 43hn A z2mǠA?  1f0`hO/`8_  &L1j0`  f1k0` ,1Xj`  V1``f  68bpi7 n2x` ^4xe[w >c_ 0iF0h A 0i AB 5(nP A95 j1oРASfm t0d٠AWn z2m0``T ,6Xb`&A![ 0i`> 28lp1' N68cp-w 7x`{ k/?uk A"I 2Hc ALY d3i _0(hPȠA  7`PѠA5 j6cPנA} 45hfܠA+m 7`ѠAg.] t7aӠAo>}  2l0` F1042px515h0`< ,6Xb`JUk 7``AAA 48dp1' N68cpEK \5fS/ ^2dwG4l A41 b6c AB$ R6Hc A|4(dPؠAQb% JT2lPݠAMZ 5gPߠACF 45hiʠA[v 0i۠A_~  4d0`0# F2m0em6kg0`$s ,6Xb`Z B 4e`^} 68cpy  .\6fp|3\ 7Hh A 4Hc Az  2d6bAAB J4(ePڠA9 *T6bPՠAu 5gPߠACF 47hiʠA{ z 4d0`O/`8@ &L2l0`4 0Xk` 6l3n`> 58np)g 7`pUkw 3o#O <3xnk7o |07? At b1k A"  2d1j An 5(aPʠA9 *T2lPŠA-u 40hlĠA3- Z2hmΠAgn z4cנ`a F4em0`AAx  &L1j0`  f1k`FM 0i`~ 48epYs \7ip <1xfk7o >|3is"D2f ALX 3H` Ab$) R2Hg An|7(`PРA% J6(kPѠA]z 44hdؠA 6m 7iˠA?!C  7a0``d)S L7a0`l%K ,7Xa`j5 0i` 08hp 08ipEK \7apm;w 7x`Sg ^2xm{|4\(Q 6c Ab$I $7Ha Aj4i 7` Af,Y d7i _ 1(jP̠A  J5(gPޠAEJ T3nPàA#M 43hn A+m 3d٠A?  5f0`m0`43 f3o`Rk 7``f `-[ 78`pa' 7`pu <3xa{|2 ~qOQ 0H` Ab$I $7Ha Aj 2d2l Av9 6(`PРAa% J2(mPƠA9 *T1jPˠA 44hdؠAs- Z6hc֠Ag.] 2kϠ  7a0`h1^.oXq>~ &L4d0`Ti f,6Xb` 78hp 08ipY .\1jpM;w <0xaF6b A  b1k A"I $3Hn A*i 3Ho A&9 r6c E 3(ePڠAYr *T4dP٠Auj8TӡqCMjPKZ9ڡ6upCP:ϡ phC:4̡r!Or9ۡMrhCSl9 ,4Xn`:  6l1j`} 48dpQc N48ep%+W \7ap] <5xf; A2) R2Hm A^|E J1`PѠAUj j4kPϠA# t0hɠA 0iˠA 6p5gcko`h0`DI L5a0`l9 ,4Xd`Re V2Xm`z  6l1j`~ \0jp] <3xn? >|6fO A$Q D3n A,8q 7H` A2) R6Hc Af,Y d7a An 7(`PРAa"E 7(aPҠAEJ j4eРASf Z2hmƠA7>}  4bieckgo`h0`$ f6c0`  V1Xk`AAA6; v2gp!G 78gp%W \7apm; <7xak7o 17? ~2܀ D5f A,q $1h AVl r4oPAae *T2lPŠA55 j42hlĠA'] t3nàAo>}  4l0`Hc < < \n | aaaaaaaaXaXaXaXaXaXaaa CpB°% [ð- ð# ;ð+ ð' {ð/ p #pq8'sp.EW܆;p"WUM]CSK[AMSK[O_@PHXTLBRJZFNIEUM]C𷠀```````Cx ܂qO/ &  ff f f   V V 66   . n    ~_b b    RR 22   J J ** * j j     ZZ :   F F <`G+($,*&.)%#+/X(X$X,X*X&X.X)X%X-X+lll\\\\\\\\<<<||GDDD$$$$$$dddTTTTTTT444tt e(nPƄ+PƇ2!L er(SBP   V !SGǂw!Q1I))iYY99  JJ  ** j j  ZZ : : : z    FF </K-p |?``````````````````````````G'go_hDĂ$䂔TԂ4t l<Rʂ*jZڂF&fV>aQ/K-p |SS  K+k[;;GG''7wO/oo_E %z(1BJPb $ %Y(CIJPR:4 %](BJP2% %o(B;`(B)JPR,⡔d(B)JP j j Z Z  zz z z   F \q_ LLL,,,,,,lll !-݂=CÂ#cSӂ3[ǂ'gׂwOς/_?QQ1qq  YyyEU5M-==}CcOK-p |? @(/ $,"*!)X$X,X"X*X&X.X!X)X%X-X#X+X'X/(*&!)%-+/8 8(8&8.8!8)8/ ("!)%-#+'/x x$x,x&x.x!x#x+x' GCSKQIYUM]CSK_DTBRJZFQEU]S hKx |Iɂ)iYy M͂`A```````52 oAAA!AaAAQAqA AIA)AyAAEAMA-AA#AcASA3AsA AKA+A{AwAAOA/AoAA_P0H(hS%p  I)iył%Ղ5 A````G'_?רHȂD$Ԃ4 l\܂yyee55uu M]]=}Cc/`O/ && &   VV V V 6 6 6 !-mK˂+ۂ;Gǂ'gWׂOhX؂8xԂ Fg'yEEeA &diMڐn?<1xBSt2ߚGed9c YKh_{.A;cKڕ=#(o~ㄾ=hGzwiBHAwAsAf }Sy7oBM}yF!I3I3I3噘$'3#D2,/^Ey{i/xNpQwQ.Eٻ(ke]])I*B+ }ᢼ]vQ֮/B(ke*Hh_h_h_h_h_h_h_.ꁋ]>=rQ\θhꄋvᢝᢝoW }+.ꊋ⢮hhw/.tQg\{ErQ\!uErpѾpѾpQ\% EEE]rQ\#uEk..ꏋEqQw\7\uErpQ\#uE]qQW\􆸨'.ꉋ⢾/.ꋋEq;⢎Nu]]ࢾ/.ꋋ⢾/..ꌋ:㢾/.zGi'xS7twyS7޴ owZP'^›:MMMNxSo7zM:MLh/xSxSiGxS o7u𦼽)ooۛ7eM›M72)co؛7 ޔ7 oۛOhxS޴;)oo޴3ݛnoޔ7M{S޴;iwxS6xSޔ7 oziGxS޴#i/x^r̽)ooۛr27noz];v7M,.xSx{M7Pޔ7M9i/)k77n){7e尿 uM)777e;Mo77uMpSn nꀛwNpNpS7uMpSnnꀛ:=ঌt۹)g7͹Ms9wSnz4nMy)o7v]vmwSnMsM)7tpӝݔfM3lݔuSnMٺ}p|iݔE7͸fMYi4nq7͸fM)w7u7]:n4n7uM.i7ͽ. ny7ݍnꃛw컩n}7ͽz঻MwS'ܴܴ 7uMpp~_?KKoXz;1ގvތތތslΌΌΌΌMɤbR3i%cs@N/y! PAq(% jP3ZN(uCJP0F4 i(BiJPZ:6tc(]BJP/ ep(CBʰPW(~$d4t Ll,VJ!%'8(8"8'"!-x.x!x-x#x+$,".!"*'/H H(H,H.H!H)H%H+H'($,"*&.)%-'[P@P\PVPCP[TL\VNM]CSK[GWO_0@0P0H0D0T0L0\0B0R0J0Z0F%p n_ LLLL,,<<<<<<<|#("WCK($"*.Ƈ[|NoWM|G|z}mק o3o.Ƅ|o"z|L;ǧ+7ˇ>-C{ԇ!|hо3a>|hyY{ۇg1g)YFQUd YK֑dByD.}c.GhV|>]gC]P|g}o|)+ȄF$IB_|K7ojPj/S9KtR&y;K7/}/}%Kwo)R}['HERT&oUBMK7/}/}R/} KžeKtҷo'BRtҍK7/t3ҍK7/ _z}қKo/ɾ qzK/}WR?|^N$R7|Ww#D6`B[ w;1_n>Kڗ:{PO|#s}iN=Kh'EBR|C_/uR|?[}iRg|iҾKҷ/ ס?"QG~#?_,BG3G3G3GQo/= QW+~nf?uƯQGÏGNQ'~ ?zG{u¯^Q/~?uveGQ~tC}Gďn?׏Lo*{?GnGh'N]GNQ'zGp?Տ2L(G?͏r(7?͏rhћG~hQ~(O?zc(S?ԏ2Y?z']GQ~ONLi>KhGnOSi?S)_>OUi7S?ןv?eOr/AJ?O{?ڟr|)_[Ɵ2)[w)c֟Y;ݟڟvOS4444?Oy;O?ݎeO;Oy;OOߟv?}?eOS4444444 ͼarOsOsO9F}^SkB])ߟfڟzi(z]hhh=r(<92 2  (<2(zhhh(?hh4ԃz mYYhN@lP@NP}y{e@s@Pye@YМ@w|{{e@{zz@@yЮ(;l(N3v@(( h'>]@ :@7Au :@@P44}{`BR#CPƅ_(eB(CʔP= H] ROi7R?= . ~R?w^vQRWiR_^^ n H7H u7n@U@p u8:HgρByʋP^*|c(B1%Q=1+'q? ‘T" Ð&Ñ)Y‘59‘3‘7w8 X8D8Jl8ʇB8*Z8jV8ꆣ^8q8Y8E8ڄ]8ڇC8:S8:K8G8zW8zO8cX8cD8Fct8< w8 81!19S15313171? ±8K±,+±2±&kñ. Ff b0*s67xOV{j<}3L }M }?Lo 0n 1  2Af ;y"P*B% U*T@W=~0#`x/?xa2L0\ `lMB` ]>8pu7܆pCx 5o~O&FA >$CH 94Bv /PBy5&ԁzP@Ch)4ZAkhmB7=~0p/p7a,_`&̆90|X a ,eVJX `=v;a=A8<\pnm <^;>g _?"B$Q!D @\ !$ĐArH)!t2BfY!?P C ( 4PC%5&ԂPB= !4Z@Khm;@?a a0ƀ|`&̂0< `!,`3Alv. cpN)8 W\[p]W;x'b@L >$DR@ZH #d̐@A( E$2PAyԅAch-%:@W70   ^0`2Li0fLs`.̃bXKa,Vja3A0 #pq8 sp.E:܀[p=!<3x3 _;?SB41 Ć8AH 9t @.y0bPBEUTPZBh =t@W~@ `80 FopX_@`"L)0t K`),Uz!!V;aCp18'3peW:܀p nx1< x 5>'/ 35DB41 &ĂB|H!B:H #d CN!|7P C1(%$ P @=h͡C /0 `80 F3ă90X`1, vn `?p8 3p W܅{px o-OOi 2D AH 92@F!\$CH 9Ԑ@V 7yo(PAyԆPCh ͡V@[ht C/}? 0Pa0 0& āY0"X `-   #pN)8&܂p#x O9>? >fE B41 &Ć8A|H !$$ArH =dL@V A>C(E8P @yUԀP jC >4&ZB+h =tzA_a fL s`.̇ JXa 6f`mv. {`p98"\p- w.܃^+x o-|O  7 "Ct $d@z +d rC>C((P@Y(TPjAmu>4@Sh͡V@[htNB7= Ca0 FOo0&d `56& A !6aCpQ8\px1<  |C3?94s轟C=zs94s2%2LY&Si4gZ06L[=Ӂtgz0=L_ӟ a2Øf x1.ƛq3cq/0Df23c3 "f1Y,c3+*f5Yˬc62L̄0f/s9e1ǙI4s\c37]y̏ 2DhAbHi d̐B69 '䁼 Aa(Š$PC TjPCh14fZC[htNB7=7`0 0<0ƁL043`&̂0X`1,ev #pq8'p.e=|?Y"B, q .ăCH =d @v9BPA ( 4ԀP jC]h14 C h 5C3t zB/C|!a,X `9 VX `=l 6CCl  `7쁽80cqs9 _Jwph/}2}*\pn- wnΥނ,7`)_J~-CwRKi/, Dgb01XL&.I$d1$LR&IdR3陬L6&b 3EbL $S)͔a2Le Sa2 &LsӚiôe1.LWӝdz3}L??3 f0CƋq1ތˌc&0Lf3,`2%2f9Yìe1 Ff lg2s9Μ`N2,s9\d.1W5s<`2/;=|f0?/,Dd"1(LT&db18L\&I$a3iL:&=dgb0yL S)cJ3 L5Si4b3͙Lk ӎit`3=L/ӏ d1!Pf3dF11x3nf,33f>Y,b3K2f9Yɬa2f#a2!s9d3# yƼ`^2|g~2gEd&I$d2)4LV&;br31yLS)ɔb0erLy"STa15L=>Ӑiôe3L+Ӎf1 f83Ɍb0b73a|?f3bf3sy|f1Y,gV0+Ujf YǬg60Lb0{}~s9c3,s\d.1W5:s&?S)b 3EL18S)Ta25ZL=>Ӏi4a2͘L %ӊiʹa:3=Lo/ӏ f0Ù(f x2^fXƗg&0S f&3,f0KerfYŬa2f# bf+`v2f/d2'S,s\f0Wkusf0w{}y00_̟YDgb0LJ&-Id`0YLn(S)Tb*3ULu&Sa1LCӘi4e3L-ӎit`:2Lӝe1@f3 e1ÙHf30~L 3Lf0:f `v2>f?s9b3G1s9Mnt뮦jiWvjڍi'5r[B{o5մVmnմVKo;Ehϭ5݊khn5tC$ n jkh?&#D2Mkh'F>[CךPJA9TP jBch͡VBՠ:ԀP@Sh͡V:B']ta/[k-}ïW(SS33ss+k{GGgWW77ww/ByPo(_CP~3_ߺ(D %z(1BJP,䡤 %U(iiY9)*)+ * ) +)+J(J*J)(**(***)*+(*j+(()**)+:(:*:)z+(*+*)+*\Gw:=nu+:~YQIYV((*(*)++).()+n(n)n+(*+(*)+*)+(Q|SHHHHHHHHȠȨȤKGQ@QXQDQTQLQ\QBQFQVQNQ^QAQQQIQYQCQSQGQOQ_@BJZAIYUM]CSK[GW_1P1H1L1\1ZTx)\ o[1VXXXXXXXXجQlQlUlWTRQUSVQUSWPRVQ\V\WTRQUS(>)>+(U|U|S|WPTmHHHHHHHHHȤȬȪȮȡȩȯ((((((((((hhhp+|~ Ebbbbbbbbbbbbbbbbbbb"HE]CK[GWO_q@qPqXqDqTqRqSq[qOPHX\^_woHȊ(X؊8xDT4t L̂\<`H(BIfل Mܼ۵ީ!ށʹ{7Ӟ|''ͧir%yr\#k7"C7? 37~Lpwfځ{~K&6ӷfSilܠJ~mhc^SIPbwVP BsD}~',$o ^Qr_P^7E}KA+DCA!81iBf9iEjO(󠎤L( 7n FD ( GF12 $^ %n 1hH& id:A( >y D`!h ;/n ǂ {*:DwR&B] DFAtDo}!Bo{u)D= QGA&2 ԟ OAw]B] OޒwɠŠO7,::+BzLoO03Q +ԣ`Q0`o`ڡԕ`I0`Jp>B}]L߭I!Bߪԑ2,~S?[/:\]0}W'i%ԗ`K0%ܖP/ԋ`E0u"f<{:L 7S0}ӷP0u%x(^7od!ԕ`J0u%L] SOI0"zL^S/ ԅ`^ӽL]SiWSm`QC)`y0eLL;#D(`<2iWӮL;" L;"vD0LS/sKB(=rC=E!3B(!@A !eBهP!B)M!yeBP!yByP!s]Ҏ>C(:C(9d lChP!4!oBP!m}kP!2C(8f> lC(6 ~A!aQ1q I)iY9yE%e5u]=}#S3s K+k[;{'ſo_߲mQqqII))iiY)( * )(*))+j(j*)()+Z*Z))+:(:):+z*z)z++(*)*F()(f))+*)(**)+6)6+VvN.n>~AaQ1q I)iY9E%U5u M-m]=}C#cS3k[{GOȊhX؊8DĊ$4t|B"Rrʊڊ:.n! [VU(ss  KK+A`6.^A!1q I)iYeU5u -m]}C#cW7wَh$dTԊ4L̊,l\܊yyE%e5u--mm}##c O¥Vc ?"P1^1A1Q1I1Y1E1U1M1]1C1S1K1[1G1W1O1_@PHTL\BRJZN^AQIV()+v*v)*++n(n*n)n+(*)+(*)+(*)+^(^*^)^+(*)+*)+~*~)~vFPDTDRDQDUDSPTRVQUWTRVQUWdPdTdRdVdQdUdSdWPTVȫ(((hhhhhhhhhhhhhhhR> _bbbbbbbbbbbbbbbb"HQTVQUSWPTRVQUSWPTRVQU\U\S\WP%gvw_ co} D"(n=t[~{V_@PHXDLZFVN^A"bbbbbbbbbbbbbbbbbbbbbbbbbbbbb"Xآخءةإحا8888888xxxxxxxxxxxxx#MSK[GWO_@PHXDTL\BRJFVN^A]CSK[""oE~EEqE EIEYEmEE=EECEsEkEEGE'EgEEWE7EwEEOE/EopH(h¥Q)iيEŊUՊu튽Ê#3{GNJ'Oϊ/o߲}11 II))iiY99)*)VWPRUWPTRVTRTVTQTSRW4P4S4WPTRVQUSWtPtTtRtVtQtUtSRVQUSW P T R V Q U S WTRVQx*.­Q*@$4L,\E9EEEEuEMEE'EgEEOE/EoE`bbbbbbbbbbbbbbbbbbbbbbPETELEZE:EzEEVE6EvEE.EnE^E>ߊBRҊ2 jZڊ:zFƊ&fVΊ^ފQ OP*+&(&*&)&+f)f+)+(+V(V+(*)+6(6*6)6+!-m]݊=}CÊ#Sӊ3sK[{'g犗Wϊo_߲  )iy++)+J(J*J)J+(*)+***)*+(*)+j(j*j+(*)+)Z+)+:(:*:+()+z(z*z)(*+*F((< /K1NU)+(*)+f(f*f)f+(*)+(*)+(*)+V(()()v(v*+++N(N*N)N+(*)+)+(+^(^*^)*)+>(>)>ˎDRDVDSTW$PdWPTVȣȫȧ[_QPQHQDQTQLQBQRQJQZQFQVQNQ^QAQQQIQYQEQUQMQ]QCQSQKQ[QGQWQOQ_@PHXDTL\BRJZVN^AQYEUM]CK[GO1P1X1D1T1L1\1B1J1ZXXXXؠV(*)*)+(*)+(*++.(.+())+(+^(^*(*+~ɎRVUS$R$V$WQTRWQTPTRTQTUTSTWPRQUSW4P4T4R4V4Q4U4S4WPRVQUSWtVtStWTVSW Q U S WTx( bbWW*+&*&)&+(*)f(f*f)f+(*)+((*)+V(teqR:QNIIQDC@;=rYkε=x,XcJU=xXcFMxlOmylcn={=AC=x8q9<.{\q-<^xx[=a={D#G,8=x$H#G*t=2xd#GV9j{x#G,q< z(QģG9<>G55<z8q S=xq+5!o  M?{yu7܆;p}x O@t 6ā@BH! $dR@*H !dL@V9!<A~(!BP*@%*C _WPj@Ms; ^>iq9:]N7r;?: g3q;g3͙v:ErgYs;&gu;'s޹\t.9+MyϡpND'ʼnv8DNz!d,A 8 P *C _AMԅB3h 5 o tnz@O}/?` 0F( cx `&̂0X"rXk`# /a}pq8 2 7܃#x O);?9B8 D(At!$dBFY!ܐB( B0bPJAeA ԃB3h |B ݠ;|~# ` 0FhXa Li08 roNW8Av9Gm~8A~d Y|q: \ \kpnMw.܇SxWOއÈi1ɌTFj#Hod02,FV#i2ryFAj5ōgFYQި`T4*__ՍFMQǨk7FKhg7:]nFwe6}~Fc1l 1?#QƯ8c1ŘjL3K2chal64;>q8j33?e_qψo$4$FR#Ha4R4FZ#jd39F~#5 EF1Q(gT4*U/jFuQ˨m7F hg|ct1݌Fm1Əc1l4F8c1dL63y|cXb,5Mf/cg7Caq8f7N E_q͸n0n#xj<3/+ƈbD31xF"#He1FV#m1 %F)Q(k7*/F5Qèi6 Fhm1:o.FWk`7~4c1n2~1~5)TcXl,1ˌ c`l1ۍNck7q8n0N3Yqٸa4nxm1„1HF#Ljk$6)Fz#(h1ōόRFiQΨ`|nT6_UjFuhi2mvFf|o10c1ml1c1ݘa4f9\c1Xh,1ˌ cXm76یgq:!s9tN98g EsŹt9ϝ[ u";QhN@@@@aL,<.dn gf d d 42MF ht21}c1g7fsfca6Aq8k3W-.ӈm$4F:#hd5ٍFN#o6EJFhk3F'e6~6cq$c1՘fL7f3Ylc1טg7K2cXm1Fcbe0G qɸf5Cxb<5ύKxc5QF4#Èi2bqF<#Hh$2IdF #Hc5FV#a6!FQ(j3JFYQި`T4**ƗF5QǨk3 F#hn0ZFGbt5ݍFOk 0c1n0Fc1͘n4f#(n1_U/F-Qh`45-F+a 4Opc1k3$c1ŘjL33,c1ǘk3 o"wcXi2Vk:chl206;Caq8f7N'Siq8g7.Ke_qոf\7n7[mxe1+R#ΈfD7b1XF#ψo$4$FR#Ha4R4FZ#`d42,FV#m1F!#(b3F5Qèe6uzF}hd46MfFkhg7:oo.FWa437z}Əc1bd0F㍉c1͘n0ߍcXn0Vc`l46[qq8o\0.Mq۸c<0S9ވbD5b1F#Hb$5)TF:#bd5ٍFN#c5FAb6EbFqQ(e6erFyQܨlT10__Fhb4ZmvF{bt3z>Xc1ޘdL6S c1ۘc5B7wcXc76?co0Gc q8cc7.Ke_q͸e6wCxf0^_QFD#وbD5эFL#ۈc5F#Hc5 F&#jd3r9\Fn#b"FQQ(m1__ՍFMQǨk3 FFche6mFg` 1#Wc1oL0&c1͘n0f9\c1Xl,1VJXk`l>#vn U76܅'3yq:'j8'щDq9ѝN'ω$p.WԠ=5覨)AE 'j7QJԌ?5腨AD >jQwo5xF 2=jQu 52j#2PCE*C—T@Sh-%Fc3~4 `$a ̀0|X+ p 8 g p+pu><x/5hQ 6ăBH =d 2C^ ( %4PCs _P j@MԅzP@Ch 4ZB+h mB7='7G`0 3_`,0 &Lsȧ~E;,%rX `lA8G3sp.EW:܀p =x1< |=D bC|H 1$ RCH! PB2P%TPjAmuԇ@Sh͡3ٙLqf83wp9՝NMSǩw8MN3iv:N'||v8}~Opg3v88cqxg3љw~w;K*gYs;8-VO/gu9!s9wN8gsys׹\u;7-sǹs;#yqOND'ىDu;1N'Iq9YlN')tBPS)q:UNi4r;͝N|q:Ώg3t:$g3řpf:g3Y,t~s~w9˝*glwv9{~s9pN:g5s˹ON'׉w8 DNb'I$wR8)N'Idr8Y\NnSʩTwj85ZNmSi4sZ8-Nitr8]nNow~t:!O0g3֙Lt&9)lgY,sV8+UjgYw698-Vgv8!s9s;'Sis9\p.:sǹs;yr^OND'ىDs;1XNl'׉$p9$NR'ItR;iN:'dr2;YN'S qBNS)s;_9_;՜NMis;N'pz:;>N_g3 wF:_Dg3řLs;3Nq^dJ O'ȇ8A6!Nq u'ȁ8A =Nq^q|ގ|`'8 ;Nqv`;' {'8> v9~p'nv3~΍y? :hNL'I$q:ɝN'dwr8y|N~S)p>sJ92NYSکTwj8:N]i4uZ8mNtwz:9;}Ώ g3v88:cqxg3љLu;3lgYtV95Zglsrv:{>gs9v8ǝ)s9\p.:+Usݹtn9{}y U/BuPS%uzB}Ph$4MfB Jh- BI,tz=^wBoOQ  !Pa0J-~~ a0Y"f sapB8) Ke_pC) '3 BD!Y"D хB,!G'$R)TBZ!A(d yB~PP($BaPT(!|&J 2BYP^ T u·BW]!z }~Ba0N Lf aTX&,V+uzaQ$!l ;.ap^# 3% #" (BT!]!b qBb!\H!d لB![# BA" "BQPBL() BEPURJZ/4ͅ·B7C#~~CHa0C)f sB_0P" F#Qhga0V L& ita0S% oaZX'6 [?aK' pL8..K¿p]!w{}Px$< # BD!S%qB"!DH*$ )B*!VH/d 9\Bn!W' !T(,J BeP]% MBGYFV) O0a0J-~& )ta0S%sy|7aBX) &aE*l ApJ8- W5pC- Lx.^ o+e!N$D фB,!G' DBb!TH&$R)B:!A(d لB^!P@((BPPZ(+j5ZBmPO/4 ͅBkNh/ Da0Y.˄JaFX'6 ?OaG+ pZ8## EpYW*\nw=@x(< O3Bx)^ o;A_apBx!Q$DQhB ![#$ B*!U& ńgBIPM.j B3Rh% 턎BoW' ~ !O0a0B)F ? ㄉ$aPX$, +6/aK-  CapB8). ׅ{Xx"< /+Fx+ :A(D" B|!PH"$ )BF!Y"d مBN!W'BPPD(*J BUKkPC)j uB=Rh%t: 7wBGa0H,  #(a0V'&)4a0C)f sEbaBX)FaY&v {}~pP8$ DžIpV8'\Wkup[# 'SJx-  DQhBt!K+ B"!LH)r9BPX("J %RBiP^ T* *BUK+kFh/t]nBwS%|'|/~ ? A`a0T)F ? c_a0K/,KJaZX# &aE*)l ap@8$GipV8'.KepU&n ;=@x-WڰB8!A(D" QhB ![#$ )TBj!VH'2B!S%BgBIPZ(# _ ՅB-Ph$4MfBsY"tz=^wBa0P$  Ä8a0Y*L 3Yla0W',KeraVX'6MfaUSK8  DžIpFG8+ 5pC+ /+҅ B!I"D B\!_H,$ ɅBJ!ZH# BF!C)r EB13PF(/T* B5Ph"4 ͅB{YFV"t ݅BO[# ? c__a0I,L ӄa0OX'6Mfa[+ EpG'< O# B$!M.b B*!FH+2 B!O(  %2BPS%BLh.Z BY"t ݅BOA/  C0a0R%~a0I* +*aFX+6a]!v {}pH8, DŽ pJ8- =Xx!^ ow{2 B!I,D хBL![# BR!\H%lBn!_BbNqS)q;Sͩpj:Pϩ4q:͜N Jh- BU)|'|/}~a0XI& F Da0Y"L 3y|aXX", aNX/l6 ۄaK-  !pD8*#n ;=Tx)^ oe # BD!Y"D 1B,!_H($ IB !JH- B!I YN6'rr;yN>'S)rB"Np#f Ìe*waNCi4u9͝NKN t@a0L# %2a]%IpV(\. W5pC) Hx*LaB8!A$DQhBt!W'R)TBj!NH/bBqPR(%T* *B PK- FBcTh&Z NBwS# ??  a0L- Da0Y*Lf3Yla0W' k:aC){Ap\8!n }Px$<υKFx'>+s!N/D" (BT!_H($4BZ!^ d2 YlBv!S%y|BPHEbgByPQ$T_UjBPOh,4 ̈́B+Fh+: ]B7a0H,  Äa0ZY#"*&)Ta0['߅aBX-l[?m_vapP8$GSipV8' Lx.^ w{e '"(B4!C) BB!DH&$R 4BZ!Y*drW0B8!Q$D qB~A00cW `O򅁰"@D! DXA|H TBF! P A(P J@I(,~eva/pQ8'$3p.%  ܅x -$x!D(bAl $ RCZHY!dB~(! 2P*PPTP@] !4fA ]t~!0~0a&̆90bX+`%5zaa l?a샃p 8 4sp.% !<3x !DH@H 1$B6yP gPB9s UK PCh)4 @[h#to t=~0O0FHg0dSaL,UͰŸ ]a8Gp98*\pnmw<'sx?)C !1$2B&9 'ܐB>! P>P@Y(| _CMh 4V@{|B ݠ;~~0 ?p#a1 ca0 s`.̇~E;p)8Y W\p n > !$x[VHW!AORHG!;;A'A|sH-!AoCN 9$֐C. :$$C?$萐{C HH!Bo %$os z $x o $耐 Cyxn C| r>4N n ^ 6 n >4Фd >4e U M m ] } C. >4{ C 2:4C , 6T . 04}C7j 0^ eC54 C4E ȵoh94د:p,dv ]8A&~p;p/fZځ:.~ 7to( p-ǟdX!D(AfY!TPjBh@ ݠ; 70 F0~_a 0&d`:̀0< wX K`),56;a쁽7p)&܂GR <ă C H ! P@Y("T/+ 6ԁPCh14fZ@KhB7='|a(`8Q08` [`+ ;`'pq8'3p.E ܄[p}x9W;x'cC 1$ @V!\B> PB1( rP*@ECe—4 ZAkhmtN z@/>~0P p#a `L)0t3ă90X `5l?CpNU6܁^Kx?)Ax :Ā@\H! $dR@J(%TJ9T/*| _C55&ԂPB= !4B3h-6A{to[ ݡ^|~a A0P p`)B8 "DB41 &ĂB< !$ĐB2H) %ԐB:H #dPB1(%3( ,P*B%*CPjA}h-:7-tzB/#`$̆90|Xa ,v. {`/ `?p8 8p ?peU 'AL!ąx@BH 9 @ZH!dlB  C( Š8Ϡ$PAy| ԁB#h M)@7}?` ` 0 F0~_a"L043ă0X"Z G(p N9 W\pnmw܇cxa!"Ad!ąx@BH!)$RB*H i -̐Av 7䁒9|_P C 6ԁP@ChM4 ZCh tN@Wݡ>`C'a3_W ` PB1(%,PԇAch5v:B' w`a_`,L043`&̆90|a셿ap18'3^[x>B 6āCH %ԐB:H #d̐B69 '<A~(EP JCY("Tϡ2T/*| _P CMh m{ }/?`0  1 ca"L0X `5z[OA8cpNI8 sp.EU>ԃB#hm :7-t C ?@@aQ08 `,`a ,Uz[/;`7p 98:܀;p3x/O>a!"AdQ!D bC >$D@RH!ԐB:H!d,r@nTԄZP@]>` ?0#`$3_W `P B9(|+A- u.4Ch ͠9 ZCh 3|B ݠ;|}/Ga !0~0&$ S`̀0 f `>,,a1, X `5f[O;a솃p8SpY8\Kpn- w.<x 9W[x'UB8 "DAt1!Ć8B2H !dL@V9!/PB9("Tϡ2T/*| _P C 6ԁPAchM4ZAkhm-tzB/ }Ga a0FHgXaLI0Tâ0~E2Xkal ^~80p. 6|E 2D bB< $ C H t2@F! dlrB. ybPjPACh 4fZ@Kh v:@G@W ;aL0~ŰV*X k`- mlvn{oCp.5 w.܃Sx%;x'U@X!DH@T!ĄX@\!$ĐB2H) %ԐB: 3d C 7䁼C(! bPJgPJAi(e P*PP:ԀP jC 4F@Sh͡B;h3|];@?Ï0~i0X acpNI8Y8\Kp+pMw.܃3x/%>~e ! Dhb@Lq!ćCa( %3( rP*@EC ՠ:ԀP @=h 4fZBh to[]tz@_?@a#8a,a1, JXa 6&6_vNa셿apa8G8SpY8"\/\p n ><x 9 ^O .ăAv!䅂P C(%TP5TPjB- u.ԃB#h M)4@[3A0P g`~u!DB4 q .ă2@F! dlr@N!/P B(P C JB)( es PjB- u.ԃB#hM9 ZCB ݠ;~0`C'aQ0~1RXaU6V_vNa셿ap18'$pp܆;cxOW[x|Z!DH@T >$CH 9 RCH =d 2C ;䀜PB  C(š$PB9("TP%|_C55&4. P#`,L0f, s`.̃,a1,eV*Xal-mlvn _ 6܁px1~R= p"@lq!$ĐAj ;\@A(! TJTZPA}h M)4ZB+htNo ^=@C`(`80 F0~0B ~5 v. {`/p18'$pp2 W*\pn- w.܃^Kx w>OjC 2DbB, q .ăB"H I )$RB*Y +<A~(@("PAq(AI( 4F@Sh͡C3|B  0 ?0?aL)0t `6́X `=l>(sp . :܆;pcxO<^x '5@X!ĀXB"H) % 2C Ba( rP*@ECe_@UTPjAmuԇAchM%C[]~A00#`$30`2L0 a̅y0B RXaUzaa]^88g<\p .w<;?"Bd1!dLB69 'ܐA~(bPJgPJC( UKM6A]tzw=>0P p#aȧ;,% JXa-6f[Ov;a=}A8cpNY8"\p x O)<Oj BH! $RB*H i -2B& Y +dP ABa(%2PAy| |_C55.ԃ&o tnz@OB?a 0F( ?~Y0\au_}A8cpNI88 <\Kp'sx5  2D C ąx@BHI!$RAjHi! 2AfY!䀜@~PJgPJAi(ՠ:ԀP@=M4 ZC?~0`Ca$3_W `Š|%2P*C—5TPjB- u.ԃAchMVB;h#t | ]+tzB/}? C` 0dSa:̀0RX+`%u6& pq8'3py7'C :ĀB2H 52@F! dlr@Ny PBq(AI( rP*@EF6 \px1<^+x o->~R? DHgPJAY(s _Au5Ԇ:PA}h14:B7='{ }Ga 0 F0~_a,0lsȧ~E VJXa u6 `'ݰ> #p 8 4,p.%U܆;px|AD Q *DB< !$ĐB2H) %ԐB:H #d,rA> PB9 U _WPjAmuԇAchM4ZAh =t7~# 0 ?0#`$3_W `0O0  `4 `L04`6́0X"XKaհ:X/;`'ݰa8Gp xI@T!ĄXB"Ϡ$PB9("Tϡ2T/Kh ͠96A{g8SaL0f< `!`),Vj [`+ݰA8Spy2 W*\pnm >~2 p"@D! Dhb@L!ąx@BH! $dR@JH! t2B& Y!ܐA~(@(P C JB5&ԁ Z@Kh  @WAo}Ga `0fL sa VX `=l8cpNI8 \/\p !< a!B"H ) %rC B ~a3_W `"LErX+a5zal'l`;쀝q\ \kpnM܅{pCxO<^kxouX!DHB H!=d 2C !| ABa(E5TPjB}h 14F0~_a,0&d āY0$C2H) %ԐB:H 3䁼PBϠ$rP*@ECe_| ՠ:ԀP jC >4Ch ͠9 ZCht0`a1 ca 0 f, `! X `5 [`+ /;a=p!8 G(pN)8 g8 <\p . :܀p Cx oOpNx'ʼnq:ɜN];LN'tr9Av2}\ld` >ȨAִAr}os`>}kW`>>{n`7mau !DH@4H ԐB:H #drAn(bP*PPCMԅ@Sh͡B;h#t | ]+tz@_a80 a*L0 *X k`-6&6 6  `7쁽7p!8 G(pNi8"\pn ><'Kx w>~1 p"@D! DhbB\!$DC H!d,Av9!<A~(@("PAq JB)(e P*Ae_@UjPjBmu>4CSh͡v8}~Ng3 wF91/Xg3Lq:Ӝ gV`6́|g,`@{Ǡ; 6V_vNa셿ap.:)N!/P AB1aL0LKa,`^:s):3)NLt {i+ /;`'=pn]!< [x'B8 DB$CjHi! d<C( BP>P JC( %ԀPB#h M97``a 0& `:̀0 f|X wX K`),VjXka 6f _v18g pn ><x 9 [x|G!ĂC"H I )$RA:!d,r@NvTz#P9"gYu9M~s9qq: οus˹q:yѝ8N\'I$r;IN2'Idp2:N'S)8EbN S)Tp*:ϝ*NU+Sݩtj9:Ni4wZ8-VNkiw:8:]N7rswz; Fgw82\q:ל`{w{ k{3֞A WWp rW@p ^A. W0˽9p`n{3+E ^-+{ ȝ^A W3L|J`{+U{gO fW0'Gz`>zwa`>zw``>z55z{1cx)S=yL1c [<~<{ X(BT!]!b xB|!XH)R B.!G' B1PBL()J eBPI\,T ՅBMPG+4 &BSI,|#t @a0X" ~ ÅHa0A(LSia0OX ,~ ˄*aFX'6 -Va]!v {pD8&N'SipV8'.Ke_pU&\n7[mpO/< Lx.^ Nx/|>W0BX!^ D" hB !K- B!HH,$R iB:!Q$dBaPL(.J erBEPUZ&Tj FBcTh+:  ]B7S%|'|/}A8a0Y&LfaDX#6 ?Ÿ6a[#GcpI+ +Fx+>W0B$!U! B"!DH*$ )B*!VH'2LBf!S' !BPT(+ U/—WB5PC- FB\h!:a0H, ~ #(a0]!f oba\X!V 5Fa]!v =^oa_8( GIpFG8+.+UpC)n w{}Px$< Nx/|>aBD!E*D 1Bl!O/$ $BR!\H!R iB!I,d لB!PP($B1PB()J eB9 PM!moB7C%|'|/ !P'a0R% Da0C) BwaA,l  ;CapR8- e_pU&\n7;]p_x < υ"B!M.b B!OH($ IB2!RH%iB!M.r B*EbB)PN(/T* U:B]P_h 4 &BSVh't BO/(  ? ÅHa0FEU+ ,a0W/,~ 5ZaA(l6 [Ÿ6aC# ApX8&N'SipI,\ ׅMpG+ s~ # BD!E* B"!DH.itBz!Q$d مBN![# BBPDL(# BePUR) MfBsRh% B/;{G+ apa0R%~~ a@X(&,~ KjaNX/l6 ?maG+- !pD8* 'pI,+\ ׄ pK-<Og ^ |B$!W'$RB:!Q$dr9\Bn!O/ "BQP\(!|&Jvrm?%(H"tw]30 ((34- 4X >{}s|dfZyQQ"{(QʣG%*={4hأǓm={tͣG}=y 1)y,w#]=x'=xs/<8I=i<~7GR)=Hqǵ=x\qM7{qmwyqGvyG!Ecx8qq_y[SW$<{#E{\qx\#u<2zd=zqǽ9}#E10"&".bDȈg"16b\ #&ELx%bJԈ7"ތx+bvD̉1/bAˆMDl0b[G{"F|?@C#ND|q*twG5 yD ".4⊈TWE\:⚈4i#H>"GDΈ";"OD"x8@##(Q8HDшbE<Q2TD2#*DTQ=fD":Gt#OD"F 1"bdSF<1*bLc#E11bRĴ#fĎx#͈w"D^DBļ "F,X4e+"6E|9bKֈ#Eq'#D8q8HgG|eĉS#>k`҈d#RD0⢈#.4Ⲉ#RE."CDƈL7Dq[wD;"ODG(hDE"F(Q>BDňJ#jDԎQ7^D"D<dD#D9KD׈"F 1"bdSOG<lsGbK"EL19╈)S#^1=ⵈ#fFf[E̍H baĢk#GlC t cSܜx|bkQ={]q1aL>ƺF{nt#=7bs#=αuo{|ccocVź{VOź==qu{{cXwu{c9sPĺKĺ9M<>ĺ-w]rV;k1CpQ8S/|'ᛳ%r4Lp=7p ]!!x #PJ@i(e P*AM u.4& ZBh =t @ ba 0 Hx gYx^Q00&D4x f0BXa ,aհFV`7}1|Cp18 N B2H)B.KRRu2B& Yzn[VnAvr@. y /< x Aa(E<Cq(% rP*Be աԅzPAch-5t :C7!ba 8 0 F8`2̄7`̆!`,%rX+a6VvGv'A8 K8p Nw=?Og% C .b.rRՐk!q3s{s1q%νĹג8wqKH{sq3H{͈sE{squ!νĹׁ8ws8Y;}s=ܽ?ܽ>8#}s8"ܽ;ݳܽ:ݣܽ9ݓܽ8݃ܽ7}&s-ܽ7sAyT*PAu5Ԇ:PCh14'Ih ͠9 ZCh =t :C ݠ; zC ? 0C 0  O < /( ce `p!8 GQs7YBs\b.5&\e65ZƤ5יt&`2L&b77MVsbn5Nsc^4M.1yM><`4M)h5LaS5cqSܔ0%M)Sڔ1eM9ST0M%ST1UM5S05M-S1uM=S40 M#41O'MS47-{/7imژio:lnzmok& 1C03܌0#Siy7_/ 9i6ߘo)s|g7?O54Ij&4s\n0̕*sIm1ך4&Τ3Md2Mshsn0wd7&or&kA~0G < 0P ǡ8P JC( p!8 G()|%$| 鳆]i:H!dLnb8ZAkhmt C 7( s`., [`+|`;쀏`'ݰa8GO3o{~B2H)H Ep1\ep9\J p \ i -\!dLpY&n[6;.l!<A~xa(@A(ǡ8Z@Khݡ~@X!Pów= `!,eVjapa8G< (B!( 64V@[ t`</0^0&D |X a`9 VX `=l >->mvG^'A8cp>SY#@J. HWUp5kZHi:H!dLp p @vrCC0Pǡ8P AEՠ&Ԃ:PAChOXCa|;a= pQ8z* $dR.b. HWUp5k t!<A~xa(@Ax Aa(E<Cq( 4PC2TjPj@M.ԃ C h v:@G tnz@O? 0C 0  O < /( a"Lu `>lv ?t n;N { d{! <A~xa(@Ax AQ(PJ@I(TJP@UաԄZP@]5v:B' ]+tzB/ }/0B  q00#`$<O3,<K0 Fx8`LW` LWaLu3 xށ 0X`1,>,V*X k`-6&6 6;# n{a| ~8#p g9|eN7[s|g7?OLR\h.2k͍&c^4M.1yM><`4M)h5LaS5cqSܔ0%M)Sڔ1eM9ST0M%ST1UM5S05M-S1uMst2ԼofYiVfYk֙fh6fl5fm}f9h9jS9aNSlrƤ39MQS v>p8ӳ^H uC 3dMp3mp;w]p7!~y /AxG < 0P jB- 4F$4fZ@Kh#tB7='B?` @, C`( < 0&dxTxk:̀`6̅xHE&6 6;# `}1p8_ | z1)$ Rk!d̐n;N { d|P C1( rP*@E TjPj@MԅzP@#h O@kh'~@X!Paixya I0^)0^i0^ā7M o;̅xHy0BX k`- 6VvNa}1||_R7p pwp @6B rC ?<C0G < 0P ǡ8P JC( p8 8| _I8;~C .b. HWUp5kZHi!LF 7p+wݐrB ?<CP@I( rP@sh-t. C 71 `0 `8)0^i0^ā7Mx flx̅X 2X+a vN #t$ArH@J.rRp\ @ZAz!d!!<Cx £PPC% U*TPjB- >t.Awo[0 f0ޅ`pN?5& \p%\WCj4t2@F! \7n[!?<C0G < 0P ǡ8RP@ TjPj@MԅzP@Ch <OBSh͡V@[htN@Wݡ^@_a A0` a0FHx gYxEx Fh/XaLW` LWaL-mx0"X`9 VX `=l >Ͱ‡ v. {`/샏 p18| 'z9)$. Rp\ i -\ =d 2Cp'd{!~!|<Q(b<šRP@ U:ԀP jC >4:Cw=>0C 0  O3Mx flxB̃Ű X k`-6&6 6;# `7쁽>O`?p±Ʀ 2Af\PB M h-60C 0xx^Q00x` LWa3`&o[0 f́w= `>,X 2X+`%հ:X`#l`3l!l>ݰ>>p!8 G()|%5|)8 ?5. $.p!\%p)\C*Z! \7n;.xG"PJ@IաԄZP@]4F$t.C}a2̀ o, `1,>,V*X k`-6&6 v8#g p ( 4fZCh +t` 0&+:́`.|XkalmvGv c8cp>po[8;~᧳&$ C R…p\W@*!5\-p+p'w= ýr}p?䆼P CQ(PJB)( e,P*B% U*TPjB- u.4&4ZB+h m-:B' ='B?` @, 8Caa,0&$ x ^YX 2X+a56Ff.~8#pq> NWpSp᧳&k  2Afpw@N@A( Š8P JCMԅzP@Ch'0B  q00#`$`2S`* `: ô6s]HŰVjXka 6fv. 'A8cp>/K8'[8;~᧳&% C R…p \J kZHi:H!dLpdfn;N C( Eq("TPB55&ԂPB= !4')4ZB+h m-z@O~@A0`( 0FS/K0 Fx8`"L L*L0ހ7- : 0sYArH@J.k!#d̐Mp3mp;9~ !4')4@[htN@7!p#)xg9x^%a ca 0&dxTxk:̀ o, o;0ޅ`.C̃RXz%\)B.K2Tk!  nAvr@N\@^x<Q(b<šRP@Y(TJPAu54V@[htN@7=>A!ba 8Ca 0xEx Fh/X`lMA8ϚC*!5\BH =d 2Cn^9>rAny!AxG(q(%$P*@ u4A ha`/K8_Io{~ΚB2H)H Ep1\ep9\J p \ i -\ =d 2CMp3mp;wpdp/䀜p 7䁼 <0< rP*@E TPjAmu xB;h#tB7  A0 O( ce `$p!\%p)\ j@ZAz!d,p=7BV n[V n;n9>(PJ@I( rP*@E TjPj@Mu4Cx C{t.zAoxa4a,0&+*L0f&`6 xރ 0X`1,>|[ᇳ] ,p=7BV n[V n;N {^9~y /!(š2P*@eUԇZAkhm:Ag]tzAo}a 0FS4<`40TuHy0"X ka#솽p-{~Κ~lA~xa(@Ax Aa(E1(%P“ ZCh ' `"L L*L3`&̆a,VjXka=l >Ͱ‡ v. {`/샏 #p|_p5| 4?ZH 9 %\p \ !52B& Yznp'd<A~x Aa(E<Cq(%2PAyTjPj@M>4fCg]1 `0 `8< </0 `!,Űz [`+쀝>O3 N | Y'rBny!GjPB= !4C+h#tAw=~b A 0&$a!,a,VjXka 6f 8Y3ArH@J.. H@ZAz 3\7n[6;.l!AxPAq(TP C]4F$4fZ@Kh-:B' ]+tb`0Pai/XaLI0^)0^i0^ā7Mx fxރxH X `=lV {c8 3Nf&p ".K2HWՐAFnAvrBny!Q((q(%$PB9("TPB55&ԂPB}h  tzB/ }/0  q0px Q08`"L L*L̀mxC̃"X K`)`9 VX apo{~:$.+ \ WՐk!  2Af p#7-p+p'w= ýrB. y /P JB)( eTJPB55&ԂPB= !4')4ZB+h m-:B' ]+tzB/ }/0B  q00#)xg9` LWaLuo,xB<$< `!,ŰއeV%7@*! 2Af p#dfnv!7< %6ԁPCh14AG`:o[0 f;C̃2?:Dz/)!%ҢDZHKiY"-O:$DZHiS"mI=v$G3v%DړH$ęui+ )P@5m -P@y=@z8P@T$P@% T.P@UT%P@UT#P@T'P@58P@M5 :P@= +P@} /P@ hHhd=@/z1KF@c 4!+@M4#@oz+Ь@aN"%B|"O('’DX'²DXka]"O 16%DؖQvhO>I:p#:@_! ]sHizn4Y#nۜ۝;";:܁*yTsj85sssH8VZhmuh{ +@{}h:p#:x}@' Mo t:we tuԁJ@e )P@Y(ketor/r`B *hJ*| *jjjV:jI'5 ,P@ 6P@u5P@= ;P@48P\!hD t r &@hf7hv @-$к@[m#@'о@GE t2ׁ ]ü2E. ti](U+]@ >P@Y]@w'P@(W܁*Hz,J*T2ZځAjI'5 -@'ǁ> t(@G t,@,灾t"WN:t}@?$P@J@$R2ՁR&P@e9P@1P@79-ntDn)`5㦔)mʘ)Tp:՝NMS۩u9N#iv8mvN'tz9>N_3Љu9ÜH)i9Eg3ڙLrtf9sL6}>yYpg9a0ǽޯlr>p9=y{/<ǽ޳|t{9|{7i. pq"]HW&5tm"It]"K)2'RD># pw{d =r wx4@ P4c(\*jjfZj^hYZhcO `PH' 46'ҤDz%$DHif"Hiv"MDJH %DXa}"lLas"lI-`g= p(G p<]RH$e* cLn 5M -@ g'@<(p"(LrbJq&h}:Kzob`D t#^x1⥈1?1gƄ1gza9sq3suo;^$`QX`eU`K; ;{Y|_&!77Y  pa\&2 s,pCd pS= pW [{p_ ; PKx"IrPi-U"N)&BDO"O0('B\" K02NgDx.Oş(3Ƽ5 _0LNWiqsg۹s\r~>uesg:i3}NO$uN }vw {x<޽ߎO\\v8i{/ދƻ}[{?gŻON{CĻ5?>^s:7޽ƻN>ǽŻ׮ΣN^+kA|ISqNySũTs;NcqxwowvN{?8ݜ7u91?qW&^Ļ}{ƻd{ŻZ{ŻX{ŻH{Ļ8~3͙rf;8: |gY,u9Վ{.ot6989!_:'ws$$s"=Hp =s j=9Ml>3$ Op}{?x';= qNpu;Mp9 88NpuB!= Nxqy{c^^cZN= qNh4t8O8O:M'>= m{]Mp{Bgǽ6&>= 50%װ= qOpx'{F{:NpqL= o;Ms&5aۄ5Opm{l>tcۄ}`/8 I% RRAj42@F Y +w]p7 ; 9 'C. y /<Š$2PC%>4ZB+h m-t0]L7ݸ{#)xeSU5xf›0ކw!|X a,% {O3/o{!\)rHWՐk!-\ #d +mp wpd\B>C(0P *B%UTP jCh <OB+3tnz@O }0b `!0 s"`4a,0&dxTxtx ^0ހ`C̃"Xa uVNa}1| p1o[I )$pp-pL@V n;nA. @x CQ(PJ@y TjAchOZB+h+t zC?0C 0  O</0^0`2S`* `:Lx flxށ9.s!"X K`)`9z[Ca|;a=80| _pNOg-LI! 5p p; 7!x B!( ErP*@E5ԇF$4fZC;+tzB/ }/`9x^%a ca 0&dx0 k0f&̂`9U [`+|`;쀽8G(|;~᧳%R…p\WAjAz \7n!|jPj@M4F$0b)xx^Q00xS`* `:o[0 f́wa.C̃EއeVjXka 6vn )|'k8g-N 9 %\WUp5\ i -dVl~<Q((q(%$PB9(5&ԅfZ@+h m-@Wݡ7 POq0^0ކw= `>,X a u‡ v. {`/쇃pN$9 %\p \  !5\ =dpwpdp/!!(0RP@Y 1<MV@[htNB ~@X!PaxxFh/XaLW` LWaLu3 x ކ 0X`1, VJXa=lͰ {a| 8|_?4 $d.p!\ʸצ5ZƤ55jid2Mshsn0wd7&or&ky3_I_˒d&4+U&Ik3Md2Msm19}&c2ST0LeS40M 1Cp3/|'kSY/ @Z p#p @6}p?!(E1xC (e,P*B% 5ԇFC hm=tnz@O?@, C)xyxF `<`4#y2MIST4MS5L}47-LKt1]M70L 0P3 7#Hy1s6GQs7/̗9i6ߛ̏Z$5MJ>ovWKl|&k\y6ELQSg9eF1fg&)ff^3fyüi2ly׼gx`fYffYeV5fYg6Mfn>2;.1{'f9h9j7KnR LJs\nRd4Lshsc^4Cy6ELQ)aJR)kʙ򦢩ljajoƦyflP3܌0fk,2KRYffYeV5fYo6fl6[Vqu~ ֹ:wX~׹ua_~׹ :{޽rCsx Cs(rEϡ92n3s6Gq|aN)_&Ф2WLsh[m&er<&g̃y7_+s|m1ߚS`~)%RsIm1ך4&l Fsi2w{L609}S2ELQSܔ5LST2MST35M-S7 LC46OinZ֦l>ok& 5#̳9yѼdFX3L0zǽotFڻ}^~g7׍o8oE̊vĜw#ދX0bQĒG,X*buĚ#6EFwK=i1z| _{|q?MI=y$Hqǥy\#G=n[=n^<{<#=(Q£G) =*{TQ3VDh <OB-#ZEh!cD=#zE1#c`#[8?a2H) !5d 2Cnn^ rC ?<C(EPJAy*TPBChOBSh-5t`0xFh`pGÿ/츏5ه:׹us\:׹us\:׹us\:׹us\:׹us\:׹us\:׹us\:׹us\:׹us\:׹uŹzիW^zիW^zիW^zիW^zՇޓuw:?\:׹u~N?_>K?{T^_~FSSSSSSSSSSSSSSSSSSRVVVVv+~ϕw)e 8x55ɿ>eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeD{RVyο{?Io|^?ӿjߓ;{ GYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY ;EN1?+<{)~[q(%Q;v]jWծv]jWծv]jWծv]%MѾ}k/hG;?t׼&j/{?jWծv]jWծv]jWծv]jWծv]jWծv]jWծvv=iO{Ӟ={kwcgyS)uʩN}4vErb555n.zU^Wp*:ѳ{:g\_y:5++++++++++++++#qfZ]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv=iO{f|x Ӯv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWvu3LgFprZ㺝:uԩSN:uԩSN:uԩSYϧ:uԩSN:uԩSN:uԩ;]t}>SN:uԩSN:uԩS-6N:uԩSN:uԩSN:uԩS;S3ֹIw2?=3gf:>91("""""?:9tbL׿v:ѿG׺-΁|wSN:uԩS#%BL"""""NN7oz}%bZgqwn8ot:797\W/^zիW^zիW^zիW^z?so_zիW^zիW^zgoBwyj<<+&r{lpr:9;ԫW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^z'^{^zcBs#__o-)g^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^z֞V9ok<༨'e|g45y>~(+++++++r !5m|y̕ϕ_9?Zwctk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Qjv8y|ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺_\of\G?R8gLt&<'45555555555555555555mijjjjsTv 88GBԩSNݿt>ԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԝ|8~ԩSN:uVw&Y rss՘_5 C?pu9SN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN晿@>/uԩSNsWggz|<455w5ʿ?WǝN eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee?5'wƿ;\]sy|}VVVVVVVVVV?mՏyk,xՙL8Og>3=-rJ;etk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺z:eeeeeeeeeeeeeeߐ}ӕڹ\)W9;3"\sy㬚*8JNիW^zիW^zիW^z:uvP^SN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:u~]WZ׺ֵuk]Z׺ֵuk]Z׺ֵugg|E#"Twj(++++++++++++myƛY||k/_gw55ϧߡcy>?}whjjj?5ZNmSשw8 FӞ5vh_׾}k_׾n_;{}kٯ;jZ\|m;i`RB5?迡3UӾ}k_׾}k_׾}k_׾}k_׾}k_׾}k_׾}k_ڸ>)W IipZ:N?tW{ ;ծv]jWrUwiW]jWծv]jW'qW\?x[;~jWծv]jW/}̝vΜ9g[Y;?qs^~{ $rl7o;8swN;:8σ|y>|osݹfl֘Y,t)+++Cgi3@NNgMMMMMMMMM͟5[.NWMMMMMMMMMj,w8Ke֭P߷WMwިɒ$I4I$E-4t&;6$OF6R5lְyJ6lWAvuXDI?oVm$I]-۴kؠ`\vm#Vu7?)԰~m~=;j!GenomicAlignments/vignettes/precomputed_results/U1.sbcompHITSb.rda0000644000175200017520000043236014516004601026415 0ustar00biocbuildbiocbuildUW6tw PTEJ NPT wϼkf_k}p}?M.u'Nh;G_I[)4S}ԮӼYŊ_۠}'_ܬtݢ  2_˄f9a?,Ò?,Ê?>ĆBbs-!3ĮobO!x'{!q($ħ!8x!N8t3!Ά8|B\ q5ĵ߅>?1č7C S!~q'5o!~q/B< GBQ!ߢg-v8!H"I! *DYBd -DBQ(Dυ(h!J(l*!fZ!ꄨyV!Zhmv!! !z!bX!Fb|I!b~!^8ĺCl 5ĶCF!v4Bq"C\ q9W!M!1č?wB q?ă+ģC q,ĉ'C q:C\ q9ė!&ĵ߆>?1č/wxqo"V!x*!H"IgB$ :DB!DYCd =D9C ;Dφ(p!ʅ(B!*Z!jhaF!ڄhcBS![!b@!FbL)!fbv!慘bACbaE!XbY!VXbU!քXb]!6bsCl -;B +ě!vbo}!NwC0ġC|Hc!N8L!΅8"_6w!n)wCB<0ğ!e_8!ↈC$0DC$ L!RH"M!҅"w! (C Q.DBT Q9DUCT Q=D5C Q;DC4 (DMB4 ,D-B *DmB .!ڇcBs.!W!_!bp!!bT!Ƅb\ !&br)!bV!愘b^!VXbcM!^ %Ķ{BB q(8hc!8|K!:7! }!~ q#O!xa?o"VC8DC *DBd )D9B ?DT!(X!J(L !fZ!hY!ZhM!څhCN![!_!bT!Ƅbr)!愘b~B, (B .Bl %Bl#!vbw" "8|Ep<T#8\r_Ep%#z?Dc7"Fp?";=[bG'#HAG$ e"HAF.d S#ArF;|pEP2R|"A*GP%TN "hAD,Mm#hC#x1Nt[#AzG?`|#fF0+̍`^#XVF*l`K[#vF+=G`"8|x'"8Dp6s>.G]Gp=[~~ADEO+ĉ n"x*$ I#A2E9,d ["AT"(A G\E"(AFP. TJ"AFP/eG>#AD-#"&F0)L`j"Djk#vEf#ލ>`"8|Gp*l#*+|7\GC"9;܍~"x_GL-A #HAF. d S#AGP0Bh"(AJFP*JTJ"AD0F4I"hAZE:vts]"AzD3^O"D04`|"&G0%L`Fs"DR/GJ #XF,`m"X^ 9Ė[Cl =ĎobW7C 7{!ac!N8t!> y/B\q1ĥC|WB|jooُ8D!N8L!EYC|b|EmE}#!܊~ND[Gp/p=C?Fp#܊FKF{#3G<\ +DqB /!RR22rJJJJjZZ:zzFF&&ff^XXXXXXXXx5&6.>!1)Z`s`K`k`[`{`Gہw  aǁO.n~ = W/wS$g)iYY99yQB%%e5uu MM-mm/zzzF&f^ x%0(84,<"2*:j`M`m`]`}`C}>|8888888888,yBw[  <HHHHHHHHx6/?((((((((((hhhhhhhhXXXx5&6f`o>  |2U[ww~ < <HHHHHx&,<"2*:&6.>!1)9%5-=l _  *P P0P$P,P"P:P&P6P.P>P!P1P)P9P%P5P-P+P;P'P/P? 0(8,<2*:&.|}Cc@@@@@@ˁŁ%7{{ox7AcӁ3+n~ x#g?߳q  IYY99y%%e55u  MM--m/:zzzFFF&&&ffV^8$p$p"p:p&p6k|ouq7q 3WĈbE$Db$Cr@JF:dD&dAVBnGFQCq@)AYTD%TFmE=4@C4B34G D+FGGN胁q)阅9x K ˱k; ob7m|8Op4pGD!FQC EyT@TE5@MBmA]Cۛ?G_Gook荖?zfwYAѢwX72+EŁ-7;ox/~`PhXxDdTJ~}qORRR2222rrrr D          TT T D;*:QwPTz>Zt7CTm @TuTt;:*ZmuW݉Q]>ZtFm)k6G 5ڶhۣGEbTtƣ{0*yT}GEg<*:QَuTtF}-GE;*8Z=LGE9*:QѷET=yQu1ڥheGE Q=OQѽAQ9QwE_EwMԽh= D_ :s_ :^ :\ :s\ :wt4Ѣs\ :sZ :{sW :ksV :ST :;sS :3R :+sQ :P : J ʢʣ** j6.>!1)9Z%Z5ڠ-yGt x]=}00C00#00c0000S00300s00 ^+XEX%XeXXUXWk a3^l6x6>G88SQqIiYy|.".2W w#n&n'ϸ7{x?'xObDOqF|$@B$B$3HHHHtH ȈLȌ,ȊlȎȉ\ȍ<ȋg(B(PEQ Q%Q QeQQQ QUQ Q5Q QuQ M - mϣ=:#^肮聞胾񘀉ɘ阁٘X2^B,b,R,rJjX؀؄װc bcvbn^}؏w.#Aa|O)(8N$N4,<>pp_+\Wq ;|?n~m;_+~︇x/Gx$FT qOiG$D"$F$3HHHHHȀȄȂȆȁȅȃxQ((xEPP%PPePPPPUPP5PPuPP M-m^D'tFWtCw@OBoA_C @ ` P pHhXxLDLdLTLtLl\|,Kx`!a1`)a9V`%Va5^:l&x[۰;vbn^}x{xC|8C8 >1 )9g_..K|+*[|q?GMOqw ~opOĈg1b!6 .)888888 \E\e|p_\5|=[ 3;>! <=bBlA\Sx I !9R %R!5 -!=2 #2!3 +!;r 'r!7 /E>G 0CE1G D)FE9GTD%TCuD-FE=4@C4Bc4AS4Cs@KBkA[h":3+;z'z/?`8F`$Fa bc&a2`*f`&fa6`.a>`)a9V`%Va5^:l&x۱o`'vc/>x=!>!|OqGq q'q qps| K/k|ouq7q ?6~/w} !!1 )A2$G D*FE:GdD&dFdE6dGD.FųȇBD!s((((((򨀊ʨZ:zhFh&hfhhVh6hvx:3+;z'z7/?` a0`(F`$Fa4`,a<&`"&a2`*aaVbVUZzlFlk،ױ[ ۱o`'vM[؇]>G88SQqIiYy|.".2W w~ -wpWq_IY#b#"ӈHDH$Hg ɑ) i Y ّ9 y,!?PQ(8J$J4ʠ,ʡ<*"*2*:jj ZZ ڢG{t@G ] = 00C00#00c0000S00300s00 ^+XEX%XeXXUXWk a3^l6l؅7{oa~!>!NN 3|/pp_+\Wq ;|?n~m;_+~︇x/Gx$Fd qOiG$D"$F$3HHHHHȀȄȂȆȁȅȃxQ((xEPP%PPePPPPUPP5PPuPP M-m<ڣ:N.n^>~A!aQ1q I)iY9yx /,",,2, *ƫXX؀؄װc bcN›؍=؋oc?x|pq1> )9g_..K|+*[|q?GMOqw ~opOĈX1b!6 .)!1)9Z%Z5ڠ-yGt x]=}00C00#01c111 1S1 131 1s1/eXXXXXxka3^l6l؅7{oa~>>pp|#8c88S838s89\%\Ɨ W5U\÷:~p?qxObDϧqF|$@B$Bb$AR>pp|#8c88S838s89\%\Ɨ W5U\÷:~p?;>! Ii#b#."9R %R!5 -!=2 #2!3 +!;r 'r!7 /E>G 9Eq@)AyT@ETFTCE}4FS4Cs@KFC{t@G ] = }10C00#00c0000S0300s00 ^+XEX%XeXXUXWk a3^l6l؅7{oa~wc|OqGq q'q qgq>_ 7k{\7png]_~=<o !!1 )A2$G D*FE:GdD&dFdE6dGD.FųȇBD!s((((((򨀊ʨꨁڨhhhhhhhh/EtBgtAWtCw@OBoA_C @ ` P pHhXxLDLdLTLtLl\|,Kx`!a1`)a9V`%Va5^:l&x[۰;vbn^}x{xC|8C8 >1 )9|.".2W w~ -ϸ7{x?'xObDϧq ɑ) i Y ّ9 Q(8J$J4ʠ,ʡ<*"*2*:j&j6.>!1)9Z%Z5ڠ-yGt x]=}00C00#00c0000S00300s00 ^+XEX%XeXXUXWk a3^l6l؅7{oa;x}| 0>'Gpp'ppgq_..K|+*[|q?G-wpWq_I #b#"ӈHDH$Hg ɑ) i Y ّ9 y,!?PQ(8J$J4ʠ,ʡ<*"*2*:j&j6.>!1)9Z%Z5ڠ-yGt x]=}111C1 1#1 110S0Ӱ  a3^V.؃x .>xljBTEG  0 (8L$LL4L ,< bc bcVbVUZzlFlk،ױ[ ۱o`'n^}x{xC!N.K|+*[|q?~]{xbDH$Hg"? $ʠ! Z-ڡ+zcbcbF`Fc b&b&c bcfcbc^x K ˱+ *`-a=6`#65l؂؆؁7{]>G88SQqIiYy|.".2W w~ -wpWq_IC,FE<< I #R"R# "#2"2# "#r"r#YC~D  9AQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Cs@KBkA[h":3+;z'z7/?` a0`(a8F`$Fa4`,a<&`"&a2`*afbfcbc^x K ˱+ b b6`#65l؂m؎x; ob7`/>;x}| 0>'Gpp'ppgpps| K/q_\5|=[ 3.~  <=cbBlA<%WK˰+b bc6b^f-؊m؎x&vc-؏w 0>'Gpp'ppgq\e|p_*;|q7q ?6~/w}AiYx` VUZzlFlk،ױ[ ۱o`'vM[؇]>G88SQqIiYy|.".2W w~Mm;_+~}x|pq1>888888 \E\e|p_*;|7p ! %Z5ڠ-yGtċ肮聞胾񘀉ɘ阁٘x K˰+b=`v(n&Qɐ)i 9y,J4*j=:3zc0caa|Oq'p qgqs| K/k|ouq7q ?6~/w}^x ˰+ *`-a=6`#6c;b?>|Oqgp.K\ww~?xnRd@v@N@ BiTB5BW xLT,R6l؉]x{m;x}| 0>'Gppq.2A DdD&dFdE6dGD.FųȇBD!s(((((( J*jڨhhhfhhhv": z7cabcFa&`.8.~~$D"$F$3HH<ȏ阁٘XXXc|OqGq q'q qg.h030˱k c+:n.~Ѱ4ʠfbHFP%FIXXXXXXX ؈؂m؎؉]xo]|8GpqhyP-c|#8c8Ӹ_(FӄHȉ(rh^W ۱o`'vM[ 8N4>E\MqcDOq R"=2 "#' ?P QUQ uP m":+;z'z7/?` a0`(a8F`Fc bc&a bfc^+XXeXxk a ؋}xCA(8N>/k\5|q7p?./Gx#q4#"#)!9R %R#-#+" CCqD)FCETBTEMBmA]C}4D4Cs@+E;<x]110#1 10S0 0s1/a1b9^ZlFױ[o`'va7-~p >q)y|/pq %7o~MoG 0CE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G D+FE;<耎x/: zzcbcbcFbFc bc&b&c bcfbfcbc^x K ˱+ *`-a=6`#65l؂؆؁7&vc-؏w.#Aa|OpGq q'q qgq>_ 7k:~p?7{o臁!)阁٘X2^B,b,R,rJj5XuX ؈Mx :`+a;v .؃x 6>>pp|#8c88S838s89\%\Ɨ W5U\÷:~p?;>! <]U1b!6 .)'Gpp'ppgpps| K/k|ouq7q ?6~/w}!1)9Z%Z5ڠ-yt@G ] = }10C00#00c0000S00300s00 c)a9V`%Va5^:l&x[۰; c|Oqp'qgp9\%|p_\5|#~xm,FE<< I #R"R# "#2"2# "#r"r#YC~D  9AQCq@IBiAYGTD%TFUTG BmE=G4D4E34G D+FC{胾I)阁٘X2^B,b,R,rJj5X؀؄؂؆؁7&vc-88%|op-png]_qOcHDH$Hg ɑ) i Y 9PV# " P%Q 10*b=6`#6aK5c1131 1^i9g_.K\r"?u>}pp_+\Wq {q7q ?~oO'1^b!i$B2$G DE:dDn4X888888 \E\e|+k{\[ 3.~/&G BjAZCzd@FdBfdA6dGD.ƳȇBA@)A-G @J:flN[x#§8btb!##%2 #r 'CQ4ćpp~}sa1 )9g_..K|+w~ /p'xObD?1b!6 .)%WK˰+b bc6b^f-؊m؎x; ob7`/>x=!>!NN 3|/pq %|op-#n&n'ϸ7{x?'xObt؈4#"# $Cr@JBjAZCzd@FdBfdAVdCv@NBnA^<|ȏ(@ABa<"(b((R(2(r( J*jZ:zhFh&hfhhVh6hvx:3zz` a0bF`$Fa4b&`"&a2`*a:f`&fa6`.cc b5`?8O.K\5p?;>! <ň؈4#"# $Cr@JBjAZCzd@FdBfdAVdCv@NBnA^<|ȏ(@ABa<"(b((R(2(r( J*jZ:zhFh&hfhhVh6hvx^D'tFtE7tGD/FE?  0 (8L$LL4L ,< bc bcVbVUZzlFx[۰;vM[؇]>G8C8 >1 )9g_..K| u[ qw ~op_Iz qOiG$D"$F$3HHHHHȀLȌ,ȊlȎȉ\ȍ<ȋg(B(PEQ Q%QePPQ UPP5PPuPP M- <ڣ:N.n^>~񘀉ɘ阁٘X2^B,,2, *ƫXX؀؄װc bcNn^}x.#Aa|OqGq q'q qg97qp1 qOiG$D"$F$3HHTH4HtȀ,Ȏȍ<ȋgQPPPPPUPPuP m/EtBW@_@ ` P phXLDLdLTLLx K ˱+ p0FHH4HtH ȈLȌ,ȊlȎȉ\ȍ<ȋg(B(PEQ Q%Q QeQPPUPP5PPuPP M-m<ڣ:N.n^~A!Qɘ9y˰k :`;v-;x(NN,>\%|k-O<8HHHȆȉ\ȋ(DaEiE%TFTG}4@#4F4E34G D+FE;<耎x/: zzcbcbcFb`,a<&`"&a bf`&fa6`.a>^B,2,j:l؁]x$N >\|oqw ~}x=! 0>'Gpp'ppgpps| K/k|{\7ng]pxObDAX Iɑ iِ9 y,!?PQ(8J$J4ʠ,ʡ<*"*2*:j&j6.>!1)Z%Z5ڠ-G{t .n莞>A!Q1񘀉Y9WK˰+k [o`'vM[؇>Ƨ88s8qp_MOqw ~opOĈ>cBSHHHHHȀLȆ\ȃxQ((xEPP%PPePPPPUPP5PPuPP M-m<ڣ:N.n^>~A!aQ1q I)iY9yx /,",,2, *ƫXX؀؄װc bcN›؍=؋oc?x|pq1>888838s \E\e|p_\5|=MwpWq_I躉 4 # $Cr@JBjA:d@&D^DJ ʡ<***&1Zڢ^DWD/ @ 0LJjk؂؆؁7&vc-؏w.#Aa|O)(8N$N4,<>pp_ Ʒ:~ -ϸ7{x?'xObDB1b!6 .)!1)9Z%Z5ڠ-yGN.胾AaQ1q ɘ阉٘X a)v1_ 7k{\7png]_~=<o !!1 )A2$G D*FE:GdD&dFdE6dGD.FųȇBD!s((((((򨀊ʨꨁڨhhhhhhhh/EtBgtAWtCw@OBoA_C @ ` P p(LdLTLtLl\XXUX x :`+a;v .؃x 6>>pU\÷:~p?;>! <Ĉ؈4#"# $Cr@JBjCzd@FdBfdAVdCv@NBnA^<|ȏ(@ABa<"(b((R(2(r( J*jZ:zhFh&hfhhVh6hvx^D'tFtE7tGD/FE?  0 (8L$LL4L ,< bc bcVbVUZzlFlk،ױ[ ۱o`'vM[؇]>G888N$N4,3|/pq %|op-#n&n'7{x?'xObDDX8xx I !9R %R! "#2"2# "#r"r#YC~D  9AQCq@yT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Cs@KBE7tGD/FE pht,"\1"!!1 )A2$G D*FE:GdD&dFdE6dGD.FųȇBD!s((((((򨀊ʨڨzhhA؈Mx :`+a;v .؃x 6>8c88389E\Wq;\7pp?;O$Ftňxx O#!!1 )A2$G D*FCzdDfdCv@nE~D  9AQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Cs@KBkA[h":3zz?` ca8Fb`,a<&`"&a2`*a:f`&fa.a>%EXXXxk6ulVl؉]x6> 0>'p'ppgpps| _~ƈxx ɐP QeQQQ QUQ Q5Q QuQ M -m/3+z/`(a8F`$Fc bc"`:fcc^XXXX ،؎]x{o] 0>'Gpp'ppgpps| K/k|ouq7q ?6~/w}a|888s89\%\Ɨ W5U\÷:~ -ƯĈ~bBlA\C|$@B$AdD6@NB!E1G DiCTC]BWHBl~'8S8 W5U\÷:~p?;>!;ƸXx  R!52  " PQ%Q ePPQPM /3;z'z?bcb$&`b>,,Jj؀x c+vb`/縆o~m;xc|,A*dF6dGB^DJ ʡ jZ#: z`(a8F`$Fa4`,a<&`"&a2`*a:f`&fabcc bcVbVUZzlFlk،ױ[ ۱o`'vM>w>>!|#88S88_.27q?GMqw ~️x?'xObD?;1b!6 .)%WK˰+b bc6b^f-؊m؎x; ob7`/>x=!>!NN 3|/pq %|op-#n&n'ϸ7{x?'xObD?1b!6 .)888S838s89\%\Wq ;\7p ?6~]_~=< <19b#"ӈHDH$Hg ɑiYِy,! J,** >!1)9Z%Z5ڠ-yGt x]=}00C00#00c0000S00300s00 b1`c%Va5^:l&x[۰;vbn^}x{xC|8C8 >1 )Yy| /qW-?~m; 71ZX8xx O#>!1"#R"R# "#2"2# "#r"r#YC~D  9AQCq@IBiAYCyT@ETBeTAUTCu@-FE}4@#4A34G D+FE;񘀉ɘ阉٘UXW.>883pq7~=C'1 b$@b$AJCzdA^CFDyT@5TGC}4@C4E+F[GtD'tFw@/F  0 (8L$LL4L ,< bc bcVbVUZzl&llv؉7{omwSQqIiYy|.".2W*[|q?GMOp_I I !9R %R!5 -!=2 3#r"Y(|>1 )9g_.2|o-?71#b#"ӈHDH$Hg ɑ) i Y ّ9 y,!?PQ(8J$J4ʠ,ʡ<*"*2*:j&j6.>!1)9Z%Z5ڠ-yGt x]=}00C00#00c0000S00300s00 ^+XEX%XeX؍K/&nb̊Ȁ(TD%TA7@oL\*8Kq?7ßxcvlE|$D"$F$3HHHHHȀȄȊȅx(B(PEQ Q%Q QeQQQ QUQ Q5Q QuQ M-m<ڣ:tBgtAWtCwD/FE?@  0 8$LTLtLl\|,Kx`!a1`)a9V`%Va5^:l&x[۰;vbn^}x{xC|8SQqIiYy|.".2Wq-u[ qw~=C?#5>BěI" )IZd'IaRT'5HMR!HSҒ%Hwқ'#(2% 2, ",!K2 +*!k:l &l![6 ;.!{> !r!G1r ')r!g9r "D.+*F&En;.G!yD')yF%yMޒw=@>_Wh"Hn%H~R$%IYRT%I R' HC҈4&MHSҌ$Hk҆%H{ҁt$Hg҅t%Hw҃$2 #b,%r$j%zl$fl%v$n%~r$ar%qr$ir%y@.Lk:AyI^ yKޑH> J_$`H4x$&II !iI:d I&d!YI6 9I.!yI> I!R!EI1R %I)R!eI9RT I%RT!UI5R 5I-R!uI=Ҁ4$Hc҄4%Hs҂$Hk҆%IG҉t&]HW҇ I_"8ď&I;Ҟt I'ҙt!]I7ҝ =I/қ!}I?ҟ  2 !C02 #(2!c82L $2L!S42 l2%|,$b,%+j%zl$l#N&{>$ar#Ir'H.k:In;>y@')yF%yE^yO>O3BoII_C$ K“$"L$&Eґ$H2$ J$Ir$K)H ¤)J)IJҤ )KʑDMꐺOƤ iF%iEZ6iO:LnEz>dE&_SF$9EN3,9GΓr\$er\%ur$mr%}<$c<%s$k'G|'$IiR$IW2&cX2L&S,2%r;A~_$KW('HDD&HlI!IV%HRT"UI5R"IR#IҐ4"IҔ4#I Ғ"IҖ#Iґt%Hwҟ "#H2L&l2,&KR,'+J&kZ'Fl&[Vl';N&{^'Ar&GQr"gYr'H. JnyB7+E&aHX'HDD&QHTD'1HL&qH\E%.&O$ IJ$IIRt$H$K򓂤8)IʐrD**GiL9iEڒvAOdNFId E摅dYLdYNVdYM6Md3Bmd;Av=9Bc9EΐD:An[6C{>y@G1yBg9yA^W5yCޒw=@>O3Bo;A~_$`/B$ K‘$H"$ J$Ib$K7!EC?G$!ID$$)IF$%IER4$-H2,$+F$M)H "8)AJ2,)O*LNjMꐺOiLiNZiMڐiO:LNzMOdBadIƐd<@&d JdYEv3͎Lyd>Y@Ed1YBed9YAVUd5YC֒ud=@6Md3Bmd;Av]dK9NNS49KΑ LEn;.G!yDg5yCޒw=@>O3Bo;A~_$`9#Hh%HxD$HdD%Ht$Hl%^ě_"n!~ğ#I$"I$#I "I#Id"Id#I"I#IR"IR#I R"IR#IRT"IRT#I R"IR#IҐ4"IҔ4#I Ғ"IҖ#Iґt"Iҕt#Iғ"Iҗ#2 "2 #2"2#2L"2L# 2"2#,",# "#l"l#"#r"r# r"g9r "D.+NnM{>y@G1yBg9yA^W5yCޒw=@>/+F'EI &W(!aI8D$HdD%Ht$Hl%^ě_"n!~$O$IL$INR$IMҐ$IO2$L$Nr$M$O )L)NJ)Mʐ)O*LNjMꐺOiLiNZiMڐiO:LNzMOdLd8AFQd4Cƒqd<@&Id2BidIf9d.G擅d1YBV dN} 9L4@Kg3׼ċ?"iI:d I&d!YI6 9I.!yI> I!R!EI R"IUR"I#҄4%IҖ'HG҉t&]HWҍt'=HOҋ&}H_ҏ'@2 &CP2 '#H2&cX2'D2&s\2' B,&KR,'+J&kZ'Fl&[Vl';.!!r!G1r ')r!g9r "D.+*FO'yI^7-yG5? J$Ib$K7!EC?GD$1IJ$IMҒt$=@2$ J$Er<$?)@ B)NJ,D***FjZK%iEZ6-@:.+Fz^dHdEF1d,Bid:Af9dYF֐d3Mr$o&aH$"7!E$IC2$'EJIjڤKVdOdYLdYO6d9BN 9.dYNVdDd?9Hs<@.yD')yA^7-F~(4 C$qIHRT$ K()NJ FjiLiNZiMڐiO:LNzMOdBdCƒqd<@&Id2Bid:AfYd6Cyd>Y@Ed1YBed9YAVUd5YC֒ud=@6Md3Bmd;Av]d7C}d?9@C09B9Mΐ9Or\"ur#O3$k%{|$g|%w$H "ɸ&aHDD!Ht$qHr$MHK%6"7C<%_KAF!TP@ ~@a a0FHc` 0&dSaL0flsa>,ERX+`쇋? AR( 5.4ZA`2L0 `6̃ VZ{apa8GpNi8g\+pu7܆;p}x< x 53| ~O#0"C1!Ć8|\CH d,rBn PZAG` A0Pa$0`2L02XkalͰ6;`pnM|CH 1$ C H 5C 3d C 7䁼C(0P C ( 4PC2TP C 6ԁP@Ch M)4ZBh];HSā6G<2\p M!g_"Dh@RH #dlC!(š,TPA}h :Bg]a 0`2L0 `6́E2X`-pcTB>(4ZAkhm:Ag ݠAa( 0FS`*L0BX[`+lv. {`/p!8 G(pN)8 g,p.xB?B8 "DB41 &Ć?B*H i -2B& P @- u.ԃB#h M)4ZB+h m-:B' ]+tzB/ }/0  C`( 0F( c`,0&$ S`*L0f,sȧ {`/p!8 G(pN)8 g,"\p57&܂p=!<'3|   ~ BC 7x!ćAbHI!$RAjHi! 2AfY!drAny!P Aa(EPJAi(e P*AeUTPjAmuԇAchM4ZAkhm:Ag]tzAo ? 00#`$08`"L043`&̂0< `!,Ű2X+`%հ:X`#lͰ6;`'ݰ> p18'$p98p.% W*\pn- w.܃#x O)<^+x o->' _+|~/ H5! p"@D! Dhb@L!/~ >$CH 9 RCH =d 2C ;䀜 rC ?P C( Š8P JC( 4Ch ͠9 ZCh =t :C ݠ; zC ? 0 `80 F `,X `9 VX `=l 6 `;쀝 v `?p8 8p N8 < \kpn- w.܃#x O)<^kxo| > ; !R?BAha!"AdQ!DbAlq |nC< !$ĐB2H) %ԐB:H #d̐B69 'ܐB> PB1(%PCU*TPjB- uԇCh ͠9V@[htN@W='a a0Xa"L0t`6̅y0BX K`),VXalMVa'=80p 8 4pC\p . :܀p n ><x 9W7ǺH 7ă 2B!(šPjB- u.ԃBsh v:@W='B?` 00#`$08`"L043`&̂0< `!,Ű2X+`%հ:X`#lͰ6;`'ݰ> p18'$p98p.% W*\pn- w.܃#x O)<^+x o->' _+|~/ H! p"@D! Dhb@L!/~!$DB2H) %ԐB:H dr@N!| @A(bPJ@I( rP*@E TjPj@MԅzP@Ch 4fZ@Kh v:@G tnz@O~@a a0FHa q0&Da Li0fLa̅y0BXa ,eVJXa u6Fa lmvNa}A8cpNI8 sp\KpU܄[p] .pA|H !$$ArH)!4Az!d,Av9!<A~("PAq(%2PAyT*PAu5Ԇ:PA}h 4&Ash-6A{t.Aw=>Aa !0p`40`2L0 `6́0X`1, X `5a lmvNa}A8cpNI8 sp\p57&܂p=!<3x/7{|/w?B?Z0Ax!D(At1!Ć8|\?ăB"H I )$RAH !+d @^4ԇ0V>8 <)<>CB<CH!+dB(š TP jC]h ͡C3t C 70PaQ0XaLI0TāY0\a,ERXaUZX`3l  a}a8GpNi8 < \pn- w.܃cxO< [x|OW_PB8 "D( C I܅{pCx G |o~O?BAha!"AdQ!DbAlq |nC< !$$CJH i L@V9 '䆼C(P JC( ' _+|~/`DG( a ,"C :Ą8|!$D@RH)!C dlrB. y /P Ba(EP JC("T*PAu5Ԇ:PA}h 4&A h 5C3t C 7`0 0  `40`2L0 `6́0X`1, X k`-6&[a;]^p N8 p. w܇Kx o=| ! BC H)!d̐B~(Š$ P*AeUԃB h m:Ag]tzAo}0`c`,0 &TāY0X`1,eV*X k`=l 6 `;쀝 ^Cp 8 \+p ܅{p#x O)<^+x o->' _+|!~+!-d̐C(0P C ( 4PC2TP C 6ԁPC#h M)4ZAkhm. C`V:̐@a(Š%~$/Y#! "IB R/GdG&d&E'yMސyO>O+F'EI KV_I$!^ě_"n!~ğ#I$"I&iHZ'I IRT"IRT#I R"uH]Ґ4"\,"~r$ar#%r\'oC|$Hj'%HIR' ۿ+ _GKd_bIN%y@'_Z(ڄ]ڇsz+(*)*)+*)F)F+(*)+&(&`rdM.;%o):%7):%7)^:?p?Gp?uW5n:pˁqxK^9ځO|uO~;?B9ځ8u@;ā$s iH@:;сLdv (@A6;Łt8Q9p܁tpW5;pÁrxk8ց|p~;ցpw @T9ǁx;@"R8ʁq @&2;Łds (@Q9P܁t(@Y;PсTs@}9؁&4uh@:сNts='84ءQMphC,f;4ǡ-qhCZ :ޡmrhC;ia[8kᜅ,\p W-\p- -ܱp -9p؁#u'8:pށ.8pсrOx;;|r_wr a@db8~;ρ$p IH@2;r iH@:28сLdv Y@r:ˁq (@!9P܁s@U9P݁rh@C8ځ6u@G:9فp;0́t`d80Ձe,w`f8Ձmt'8i8pցswUn:pہsxs^:ʁqG>9ف|s?@'^h8ށDu @Lb9ہx9퀏;ρ$r IH@rR:ʁdp Y@vr8Ӂ\v y@! ;Pҁu-5RKM-5R+K-R;K-uR'K],uROK,R_K- 4 KC, 4K#-4XK,4$K-M44K-Ͱ4lK-Kk-FK,mVK,m.K-~K,taKG,t K,Xb麥nZm鑥'Yzm靥>Zd鳥/Zn釥~Y d)o;2vBY m)"Zd)hbXi)ؖXcג˒ےǒ%K,ŷRBK,%RRK,%BUdEQ@DaQDDqQREQNT5E#D4-E+VtDwCDoGD1P CP1LM0A7v|7o|ȷjL!ߢ0G !v Z HSwA!|rȍ srM jIqJ  GqQ\qWX%H~R$HaR%HqR$HiR%HyRT$HeRT%HuR$HmR% HCҘ4!MI3Ҋ&mH[Ҟt Igҕt#Iғ"}H_ҟ '#H2&c82L$d2L%3L2','+J&k:l 6$n#r"r# r&gYr\$er 7-r!}<$3%{|$g|%w$!aI8D I$$ďx$ILd$9IIr)H ")NJ)Mʐ)O*LMꐺiD&)iFV5iCړ#LOdLdNFQd4Cƒd FdYHdYNVdYM֐d#Ld/G 9D#(9F$9EN3,9G.K2JMyN^L' $A$K"I#ID"ID#I "Ix_"n!~$>ID$$)IF $L$Ir<$/Gʐr"LIꐺOiLiNZ5iCڑLC~?Hd,GƓyd!YD%dBdM9O!yD')yF^7-D$K"$*M␸$IJ )AJIjڤK@~?HdMƐdO&dLdAfd>Y@ed9YIV5d-YG֓dLdNvdK9H9J9Eΐ$\ %r\!w$k|"|#"] K‘$K$!ID$5ICҒt$=L$Ir$K8)AJR,)GjiH֤ iKڑH?D!d(Fd$EF1d,G&dIf9d.GEd1YBed9YM֐ d#Dd'Ev=d/G 9D#(9F$9EN9O5r$m| ɧ'H "Ixd!YI6 9I.!yI>$HaR%HqR$HiRT"IRT'H}Ҍ -I+Қ!mI;Ҟt%Hwҋ&}H_ҏ'@2 &CP2"2#2L&ST2!b"#Fl![!r$E&o[| _W|'?/L~%+P$4 C’p$I@D$1IBd$9IAR$ IKґ$H2$ J$Ir)L "LIꐺOiLiNڐiO:BEz>/OdLdCƒqdO3Bo;A~_$K> M’p$<@"H$AbX$6C/K\ďt$=@2L$3Bl$)IJҤ L&G!iDf9iIZ֤ iGړ#DIzޤ/Gd$CƒdGdJd9F$9EN3,@.K2BEn;yLH>N~%_Hh#Id 1I\E%$O$IL$INR$IMҐ $#D2l$;Ar\$7C|$?)@ B0)BʐNjMz>i@Ƥ iJiCڒv=@:^?@1d<@&d&E搹dOdYLdYNV59IN9Or\"r\# r"!g|%w$H &&aHX$HlE%.$$iIFd!H"IR#IERT&UHUR -I+Қ!Hoҗ#2 #2"2#D&kZl$v$!I@.*OyLg9yAޑ/+F'E!aIx7?O$IMҐ$IO2$+Fr$7K)L)NJ)MʐH*iHƤ iJ iG:ΤNFd KƑ d2IfdKdYH%d)YFd%YK֑dLd7C}d?9@C09B,9GΓNn[6G')yF^yCޒwLo;A~_$`I#I$%^ě_#HFd'9I'HaR'%HIR&eHYRT MH Ғ"IҖ'HG҉t&]HWҍt'=HOҏ  2&2L'3,2%|,& "#l"l#;^'!r%qr$ir%H@.K2Bk:An[.y@ yJyMސw=@>OI~@L~%B$ K‘$ FbXě$&IHR$')HJ!iI:d'I IR$HUR$HmR#MHSҌ4'-HKҊ&mH[Ҏ'Hw҃$H_2 "C2"x2L$d2L%t2#,!K2 +*!l"n#r#'Ir%H@M')yF/+N~`/y EB$2J$Ib$K|/G$ Bl$;A B)IJҤ )Kʑ"D**OiLiKڑN3Bn;E d&EfydYHd YJdYIVd YK֑dH6d Nv9CΒs< er\# r&w /+$H "_GB$ G“$*FċxK?I@D$1IBd$9IARL$3Bl$;Ar$)Fʐr<@*J JIjڤOiL5iGړ#D:.+NzMFFd;AvdK9H9J!yD')yFyCޒw=@>O3Bo;A~_$`/ EB0$, G“$"D"($*F$&Eb8$."ć$ID$ IKґ$H$;Ar$K)H ¤8)AJR4)Cʒr<@*J*NjG꓆iLiNZ5iGړ JOdLdNFdMƐdOdYBed9Bmd;Ev9Lc89ANS49Kk&M>yDgyI^7<!aI8D!IL&qH\M|Hj%I$Hn%H~R$HiR%HyRT$HeRT%HuR$HmR%H}Ҁ4"IҚ!mI;Ҟt Iҕt#Iғ"Iҗ#2 "D2L&S 2!s<2, r"Fl%v$r$r#I@.K2B>@4 O"($*Fb$M␸ċ$ Ir"Hn%IAR!EI1R$HiR%HyRT$HeRT%HuR$HmR%I Ғ"IҖ#Iґt"]HWҍ$Ho҇%H2 $`2 'd2L%t2$l2#,",# !kfl%v"#r# r!IDG1yBgyI^7-yO> "_'&aHX'HDD&QHT ^ćO$IFҒ $#D,)Gʓ "D***FjڤK!iD&9iAڑH:Τ M~?D!d(F1d,G&dNfd YFd%YEV5dD6-d+F$9EΐN'yMސyO>3N~_$`aH %Hd'9HN&yI>R#I RT$I5R 5I-R!uIҐ4&-H[Ҏ'HG҉t&Hw҃$Ho҇%H2 $P2 #(2!c82L $2L!S42$l2, ",! "#&r& r"g9r\"Ur$mr%}<$c<%g|%H &p$ F$&K7!OD$1IIR$ IKґ$B )D "()EJ2ė$&II d&YHVd'9HN&yH^ IR$HiR'HERT&UHUR#Ic҄%HG҉ !C02!c82L \2' ",!K2 +*!k:l ;N#r#'ir\"Ur 7-r!w=r< #<#/K&o'|!_ɷ^&aHE\ď' H6,!K{%+y^J]J-7uȻ:"Gp)< ?""""""""?B:H @^%HqR$HiR#UI5R$!4&Aw }? 00#`L0 43ă90"X+`%հ:X`#lͰ> pq8 \p .<'sx/G| ~&4CD Q Ā\! $4C!+\(((((hZvaa&a[I78p N8 <W6yn᥅7Zxgὅ>Zd᳅/Zd!o-Bx ,DBL ,ıׂo >YHb!dXHg! 2Zd!,YnX(kJ*[f[h`F[haVZ[hcv[`N:[bn[a^YoaYla[oaI&[bai[aaYf[cay[XjaVXXiaYjavXea=ZgaZ8dᰅ#Z8nἅnYmᎅYxlቅYxeᵅ7>Yb᫅o[]h a,BD ,DB4 -İB, -ıׂo >|-,-$BR ,$BZ ,BF ,dBv 9-PBA ,PBq %,PBi e,PBy ,TPB] ,4Bs -,B{ ]-tBO ,B? C, 0 #-0X ,L0d S-L0, -̱0< -," -,J ,Z ,lf [,lv ;,촰n {,쵰~ ,pQ ,pI ,pY ,`ႅ.Yb᪅k[aᦅ[n[x`ቅ^Zxeᵅ>Xjᛅ~X4Y( -İӂ_ . n ~YHa!4ZHg! rYk"Z(fJZ(e2Z(g *ZljZeZhi:Yna!ZfaFZea1&Xgau[`aMXjavYmaYoᘅNZ8eᴅ3.Xb᪅k[aᦅ[ZgᾅYxjᙅ^Zxkᝅ>XhᓅXjᛅ~}b!bXc!/ |--x,YB| ,$BR i-B -䰐B. -PBA ,PB1 -PB) e-PB -TPBU ,TPB- -ԱPB= -4Bs --Bg -B? , 0p #-0 c-0 -L0| -,^ -p '-pB .YlᮅZxd᱅g^Zxeᵅ7ZxgᣅYnᇅ ~} g!bZkecςx[Hh!$ZHf!tXj!r[(`X(nRY(oJ*[bj[azƊ&V֊6vNΊ.n^ފ>-m݊Ccӊs K{G'gW׊Oo_@E"X? Rx+| ­( )iYY99yyE%eeU55uu MM--mm]=}}C#cc  K+k[;{WOO//oo??QQ1qq^ £WSW$P$T$R$V$Q$U$S$WPTVUSdRdQdUdSSWPRUWPTRQUSWTPTTTRTVTQTUTSTWPTRVQUSW4P4T4S4WPTVUWtPtTtRtQtURV V UVULVTRVQS,P,T,R,U,STRVQUSlPlTlRlVUSPTRVQSWPW\P\R\V\Q\S\WPTRVQWE~EEAE!EaEEQE1EqE EIE)EiEEEE%E-EmEEcE3EKE+EkEE[E;E{EEGE'EgEEWEo pH(X84t L,l\|B*jV6vN~!a9yE%B)(*b+(* ­(T4t􊌊L̊,l\܊|BŠ"bRҊ2r Jʊ*jZڊ:&f6Ί.n^ފ>~A!aъ1 IɊ)i銙ي9yEu ݊}CÊc3Kˊ[ۊ;{GNJg׊׷)B)B+(*"*")"+(+b(b+(* OᯈHHHHHHHHHHHHȨȮȡȩȥȭȣȫȧȯ((((((((((((((hhhhXXXXXXXتئة88P\P\Q\WPTRVQEEAE!EaEEQE1EqE EiEEUE5EuE E-EmE]E=E}ECE#E3EsE EKE+EE[EOEE_pH(,\<|B"b*jz~A!aQ1q I)iY9yE"JZFNAIYEUM]CSKUnGWSW$P$Q$UTRVUSWdPdTdQdUdSdWPTVQUSWUTPTTS4P4T4R4U4SPTQUtWT P T R VPRSLTLRVQUSW,P,V,U,S,WPTRVlTlRlVlQlUlSPTRVSWPTSWPTRVQS(.(.*.)((*)+(*)+(*)+^(^*^)^+(*)+>(>*>)>+(~_r_Q11q> __@PHXDTL\BZVNAWOQ@QPQHQXQTQLQJQZ@XDTVAQYEUM]1L1\1R1N1^1A1Q1I1Y1C1S1K1[1G1W1OXL\BJZFVN^AQIYEUM]CSK[GWO_qPqHqXqDqTqLq\qBqRqJqZqFqVqNq^xxxxxxxxxxxxxT)/_aaQ11qq^ oW!hܟro}XDM(7d`qQBr?ʽXFDyQATDeQETDuQCDmQGD}!f`CHȝ(weܑDsBDkFMNrKIȽ(a܃rʽCDoGD1@ `1D rr1V(w^ur(wZ1ULӅir(wWTrC BH D,r;ʭ(QBrʭ(M2r](wHrg](wD r'](w@~{x@{(o(]oNʻ(P;ʻ(HU!oG6[xGȮ(X 3X <%l"!$`2X ],{0XvY`(XX`aÂe ,9K.Kd,#X>X~` ^)76X~`w 2X6X~`evevev    ["Xf(X~``{ Y \A~(RP@9 ԂPB#h M)4 A]tzAoa a0x`*L0"X Ka,ZXalv^0p }x)<{3|!  "CT1AH!)$ @ZH 3d rC>(E(PJAi( $ar% r"r#I@.K*F&M{>y@'@>O3Bo;A~`/9 EB0$<@"$M/M|/q7?O$IH$ IIR$@2L$;Er )IJҤ)O*J Iꐆ)iFZiMڐ'Ez>/Gd Dad8A&Id2Bid:AfdKdYHdYNV5d-YG֓ dBmdK9L9AΒsLk^w>g ?#@$ Q 6C/C\M<ď$IL$INR$IM2$L$Nr$M$O )L)NJҤ)O*LIjڤKiH&)iNZ֤ iKړdHdNFdMƐqd 2(lPĠA1% T0jPӠAz 47hiʠA{ :t6bՠAw  7a0`h1c L4n0`l9s 7X`` V2Xm`6} 28lpIS 58gpe+ n4mpc'O 0xi |0hAAAA(a 3o A$Q xx6hɠA!"E 7(aPʠA{ :t1fנA  6b0`d f4m0`b+ V6l`n= 18jps .\1fpm <1xj  ^1xk >|7ehd;d7d A?T d0h A.y 0(hPؠAIRe 7jP͠A - 7`ѠAWn# F2m0` &L1j0`| ,5Xf`JU l0h`.{ 3opa#G 78api .\5cp/ ^2xm; >|2l/@ Eo Ado A| $6Hf Aj4 2d4n A.r 6hkΠA'] t7f0`HQ 5g0`  V2h`n={ 78`pQc N7`pMo 7`g/_ 0ihdl;dg A D6b At b17g A"$I $7Ha A d0h AVy 2(lPĠA) 42hlĠAs 5hgѠAg.] 0iˠA  6b0`$Y 7Xj`v; v18`pIS .\2lpu7 n5gs7 >|4dw? ~,R(a "D1j A  b1kemk63o Ab$I $7Ha Aj4i 7h A r1k AAE J1(gPѠA 0iPˠAf Z4hmƠA; :6cנA F6c0`DS L3a0`+ Vl5f`~#G 78apy 7 7x`c 0xiC B1k A D5n Al8q | I 0Hi A 2d6b Ay 3(`PРA1r *6cPנA} 41hj̠AKV [`H`DF`TF`lƅ`|&`b&`Zf`Vf`^`A`i`EV`UV`M6`K`Gv`O`Ht΄l·B.rznN~aqi^e^Mކc>s{~g~ 0A!!!!!h!x'!pOBx!!H!H!H!H!!!!!Q!1!!!!!!!!XE!Xe!X!m88*nՋEQQL.ZB2TP CMu.ԇAh ͠9V@[ht.A 70Xa"L0La,%rX+a5zal ^G(p N8 p.U7&܂cxOW?'?BAh 8 79 |?BAha!Db@, q |@H !t2@FY!d rC>"PAq(%2PAU*TPChV@[htN@W='a0FHa 0< `1,: [`+l^ pN)8!.5 w܇ +x=|O7GA( Dh?ćArH)!CV9 'PJC( TJP@U5Ԇ:PA+hm:Ag];~` `Q0$ `.,%VjX`=lmvn#pq8,Kp ܃cx/ |OW?'@`GA(!DH b@Lq \CH !T@ZH d,Avy0P JB)( eTJPj@MԅzP@#h M)@' ݠ>A`( 0FdSa:̀Y0"X K`), VZXa#lͰ v. { p N8 \+p=W[x |@GP@X 6x7 <@RH)! 2C!'| Aa(Š8PAy2ԀCSh-:B' ]/0P `40a.̇rX` u80cpN8 p.ex O  ~;p"@D!D 1$42@F ;\@> PB( TP@#h ͡nzC a !0pc` 0&d`6,EւPlycm[޿Ŗm[޿rCp12K彋-7xl[(Plyb˷s6yb?đǑƑ;3NRQQQUQQQuQ BRJZFVN^AM!qdLǴǜǼ,Ǣ,NJlRUTQSWPTRVQU\V\Q\U\S\WPVQ #~w!7dܟBƸr'ƕ0n["- '[Kn;/Ǽ)b8"K-/|K]~_EPȝX$IE2\iU^r+y}%7A^rxerxD^Orx%7WU!WM!W=!^{ɻ%ﳗ|o{%WGU[%o^1N7!^x=%{K|z}%K*ZȞ%{K)/K^dx%KfKf밐9yyYN{I^Q/餗tK:%NyI~ /oBcK%xIw'^/鉗KzEDr{Kowl!].xK o遷t[:-̽%so[%ooN#${o[hoo逷t[:-s(,$o߻(!ʉ򢢐x]-]ѻ>xKn*Z 鄷t[4o"^xK/ry =ZH'f{x-xKޒd-{[-{KNxt[:_Hޒ-zKޒd-zK޲ eo[%ko[2-{[o ޒ-9#3#i>d#YLH>#3###H>2>dBH>#H>d#H>d#ȷ̷̷d#4>2>|H>#3SMw̺d#H>̼>2>2>dL4->d#H> >|${Gr}GnVb$dWȮ*FQBnSB B#wtGvL1K#G|S>)|dH|C>[$>%钏tG##>G|O>DŽy}d#oGz#' >tGtG#]WzF;+]+;WvWz+=nJ־+J2̮|+ʬJ̫o%QYT+Jƾ2Ǿ+9Jξ2˾d+YJ־+J+J̸̸̵+J̶++Jn+}+Jf+9[+o_y|]+YʞW||%_W+~|e}e+WWvr_w_WWy }e~%7%3<]]]]]KvKuɎwɎwNpNpI...̿K%wɼd..Kf%$n̶KfURH\t%]pI\t%]KvI..%$SdL]2.S̩K%dN]K2vI.t7kuI.%9$g쒜]Krvl$g̦Kf%]K2wI.%Y$k}.Y풼]KvI.G.%l]Kf%3t  .......%ٻdϻ$]KwI.%$-s}-yv$ n[:λet-pywK2ny%ݲݲݲt-]pwww~pwK?eWeOeO pK7st-p˞p˞p^w̻nnnnny}-}pKܒ[rwKn-ݲݒ[[-ٻ%{|n-%ݒ[f-pKet-]pKnܲݲݲݲܲݲݲݲ#Bv[v[:Cn[:4----;-r˞pˎpK)t-rK)t-w[z>;n[n##].H<#}H<###;#}^^H/< t#}H<t#H<ᑻ#{#{SZHy/<#< y <x-;>xH'<x ȮȮHO<{d_xd_xx=Hw<t###ȾHo<GxH<^xHG<t#H7< t#H7< #H'<{G:NxFȍnxG:NxG.xG=_< +G)yS<#={⑮xdy/Gz~xdxdI~d'I~I~2~2~$?~d'I.~'I&~d''~'w~{o'Oc?M?M?M?M?M?K?dOOfO~W?]wOO~C? yOO~??wO^?7O~?}dd7's~+~dddwOv`enyM]////_v̕geeee˷̔̔̔/;_f_f_f_f_f_f_/;_rw_a_1_1_r%gy}{__rw_r..Ke& 2eeee]w_//}YYKG(6+()()+(+NZ:oB.ZFnVnnZzL[zi镥ז?2Z>(]Jww)H"HtwI.CnPT {My|}kU#{ģ=G(G`=ၯ#= ăPy0ރi`<y؃ ҃u`=Vy݃`=^zpȃ<8 Nzp6r7tku!,m!o,"oʬID2"9HI"R> d@? P @(?D=!јhB4%'~$~"z}~gb1J 'F>?H?`<&z0ك)L`3<,xȃe,`k= ƒ l`[=Nv{σ<8nxp˃;=xs^.[B>Sxԃd3x΃ d Y=ANryۃ<=ƒ/=AE*yPك*Ter@9R(GS9rA\R~WPn);]PyR>Q>U)IJ2%JIS+J&s%]ɡTr)Q>U)dJr%JI|Q+LJf%UɦdWr(9|J~RH)Q*ŔJIRZ)U)/ JE@i4R(͔J VtQ*+= e2\((#QJ+c8e2CV(sy|ePY,V(KereRYU• FeE٪lS+;.eG٫S+ar\9TN)39rA\R.+W5wrCCRn+w}HyR>V*(*J%LIPR+)iJ:%AɨdR>W2+YJ6%CɩRr+yJ>%R@)R +EJ1RB)RJ+eJ9RATR*+UJ5RCU)J JiQRQ+J'EtSz(+?(?*?)>J?2@P(%P R%TLT(S,e2G,P**ereRYQ*:eA٨lR6+[eOٯP*irI\U+7?;]@yR>V*ɕJ&%R@)R +EbJqRR)U*(JJeRSV)JKZi||U)(JGYtUz(+=Pe2\((J*ahe2VW( _e\YTV)VrZ9\P.*rM]Pn*;]r_y̐B69 'ܐB>"PAq(%2PAy P*AeUTPBchM4:CW  ! a 0M w.܃#x O)<^+xp RgAzCfY!dA~( E(PJB)5Ԇ:BchM4ZAk :B' ]+to'G zC ܆?@\!T Aa(5.ԃBchM 0<{a?pN8 <\:76܅cxOS"ąxB2H)  t2@v 7䁼C(0P C ( e/ԄZP@h `_0 !a:̀0 f\a,V*X k z`쁽\p ;)B< )dܐA~(0PJB)( &ԂPB+h }/0_UBD~803py\+;\W[w)CH@e-L0f6JTB:s y /BP jP>#aBCBL043`&̂0X  Ѱ 6 `;쀝 v8S RP@3h--t0 `8? ` ̀0X `9 VX Q `=l 6 `;쀝 v > pq8' pn O)<[x #')$ĐB2H) %Cs Y /BPJAi( *@E TPjAm !4B3h-%-NB7 ~! fLXK!"  z #pq8' p.e7܅{p#x O)<^+x o- ;)| SH! $dRBH dLBv!/P B!( E(PJB)( ĐBj @:H9 'BP@Q(šRP@Y(TJP@MuԇCh ͠9:B?@`Ca ? 08`̃_a, X `5 Q `=l 6 `;pq8 sp.E \kpn- w.܃'s"ć| AH 9 RgAz!|9 7䁼 A ( 4P%TP *C ՠ:ԀP jC >44;I_wӤXLŔXLŴXLŌX̊X̏łXEX%XeXXUXED,"c>b1[b-c#;c;{b7b_,`,X,\,.J,Z,~;xD<%^7⭭:;B,7Pg:Yrt{:˝Ynrtۥ-MYrt{*~@9> "O1rtZgm:]Ynrt[-k@M.ԃCh ͠9 -z@/ ``0 ~0!!B! F8`"L0 fLa̅y0BRX˕RY5V %RV) NeWM٧W(CarR9V*rI\Q*ה[mrWW(GcTyJ__Y QF(>He(ahe2VW&(Ide2UPf+ser@9S+')rF9S+%rE\S~W+;]@yT^+oʟ_;_tU)JB%XI$S+Y>|:r A;`V:`9`;8ࠃC;8N9898ppmwup}9 $tO$rA2)wA&qA>pPA!qPAq%qPA9TrPA= r;ࠣ9[9{=G?9~v0/9`a;`i;`Yf;`8XWK,urQs[ls{spigwpE\vpS/ro:x]ϸ9 | R;AisAdr8 |;(ࠐ8(ꠘJ;(㠜tPA%qPA=M4uA tpA]tw^~pA_w𳃁9`8`8`8XW,qr+tjQw[ls^9`;888k~wp sOsAYduAvqPATrPAtPAmu4tAcM4uAKuAGtvAW|렇tz;㠿:  q00pAF9` &;`8`8XWtjkD;X`9`:8ః#:8~wp 88x^:xൃ O$qAr)tAisAdr8  8(蠐8(ꠘ8(렜tPAETqPA54tAcM4uAsq𵃶9A{ttAg]tA tA:t!0|8 4p.57 6܁p?>2$4|bHbHj̐ΐِՐ͐ݐӐPPPPPPPPPKCCECeCCUC5CuC CMCmCC]C=C}CCCC#CCSC CKCkCWN.^ } }   C >_X$l\BïEņ%5pC!mXgXo`naimkͰϰpppppppppppppppppp-m]=}C#S3s K+k[ß 51537|dؐSCRC*CCZC:CFC&熬܆<|B†"b҆2r/ _*jj:5|gaGC?Cφ!_0l1 c  S s + k k Caaaaaaaaaa7~AaU5? 7 O O / o o 23 ckȐАȐĐʐƐՐ͐ːېǐאPPPPPPPPPKC%CeCUCuCCC#CcCCSC3CsC CW m ::::30|oie'CoCC_C?C|b?FQ1000000װaaaaaaaaaaa!a67l0l4l2l6l1l5l3l7042615304615370261537\0\4\2\6\1\3261<0<4<2<6615i縆O I I ) ) i i    J**jjjjZZ17t4t2t6t742`mck`h000j3657L4L2L6L30421jXlXcXk7D" Qh:FV6vN.nQ1q I)Y9yEeU5-]CS3k[߆ q rrr   JJ***jZZ17t4t5t3t7|k'CoCC?Cφ!aH(C!b5F&fff~5,2,60615" (Caaaaaaaawu[;׆7? /qbCQ ǐ$1$!y bHg1d!O ycC P0B1Tr UbCjjjjZZZZ2|m'CC_C?Cφ_ C # >_!dckgolnakXhXbXjXfXiXkXo`dlnae8h8j8f8n8a8i8e8m8c8glbfnapppÿנ8 RR>31537d0d4d2|nlbfniego(`(d(f(i(e(k(o𥡢k7NΆ.no ?z~6 2 6 1&&ffffV HC!ڰհݰ۰ǰO_8Ć$dTԆt̆,l<|B†"Rr Jʆ*Zچ:Ff6vo   ] ] z7 70FF CaaaaaaaaaaaW"bR2r JCaaaaaaaaaw ۆ;{dž'7א8x RR>3537d0d426153704261703T4T2T6T104261534446414543472|cho`hlbjfn𝡷aa`e4B 񆉆Ɇ)i9y_ K + k (CaaaaaaaO_q >1|jHdHlHbHfHnHaHmHcHkHgHo`hbnaiek(j(f(n(a(i(c(k(g(o𥡂kC[C;7N ?z~6blb1 h8$dT4t L,l\<ïEՆHfV6vn^o}CÆ#csKkGdž'gW׆7? 6cߐ!!!3CZC:CCF̆,\܆| Q(L%ʼnDI4QHT"(C!0&(Ide2FȽ:"NMt r{nP1L #mmH!c`#BEk!;Bm|Fߕg4#6!=F BX,KJJ0bX+EaDX/6Fȝ0b]>Bvم#d8%dg5BvA#~7-q[PȮ!e;F^!32Gȼ!G梏AyG>} y;lY#sG>2|#GfO&!G扏 ^)"||||W|n}F}* I.]SSȻ˧h"Z y7|%#u#u#u#u#uw#| y'ȻG2}$s'DH>d#5#yH>Ro>rH>ܬ>rH>d#ȝ#w#YH>#yȝ#wq>Z>r[-#7I!rH>EqEH>>rSH>d#YH>/d#Gl}dȾ+J W<}%O_W2 }%C_W2+9fy+yL}%;RB暯}=+w_g2|%W_W<}%K_W拯[O~m(fBɾ-DK!YJ־m+oc_ܷ}%w_WwC}{ y{['!uGWjWWf_ 2|+sW悯/_ _Y2 |6|eJ-J-J-J-J JJJ J JJJJRR ;RRr;ʭ+wd+J羗+J澒!}{_HrJ-JJJ~~~'IoIoIII IOIOIOI~d';Ovk????g?g?c?OOO2#$[?֯h*$[?O$??OOf$/?OO$+?O2>'YIV~~k?a?a?~d''}'YɌLHV~2$/?a?o>$G?yI~$O?aB,$K?O^^L$W?g?Ofd'I~'yI~j?emef˭/ܢd/Kd\Hd/KKKKd/w/wd/d/s_涿/KKKoKoKd/K/K/KmE;h/eKOKMKK=K=,?XȎ~/dK=KKK2oe_K /ҿ2e_˾^Z]//s___溿o2eK}KKmK]K=K=K=K=KKKK=K-K-KZ/o92}/u/u 5 5 5 5 5  u ?@$9@r#$9@z;@vu YȌd<$;@<@^ <@ry :@j @j @j @j @j @x Hy s<@@́}d Y w ;<@vx̀2dȼ9 ,Y HrKL  3!@f@̀?@r9 wY 9Hq{d 3;@ud Hk} = Hk } }^|$7@   oI!HS2+YJ6%CɩR&FJ=,C (  TjPj@jAm bhC:1N1t[ ] +b)>1ap Cbð0"cad b!415L4L304̃~U)JD  [ [ ; ; { NNNN..~7\70aiemcox`xbxjxaxcxk_kTC\C315d2|njfg(b(m(c(k(goh`hdhlhbhjhfhnhahihe[aa!lko`hfkoX`XhհȰذ԰̰ܰ°Ұʰڰưn0D цu M͆-]݆=Æ#Sӆ3s Kˆ+k;{'W? 6>6|bԐȐؐ SJEF!7RDArf1rʝ(wI`yRTE%QYTUE5Q]5EmQG2r6r}(HmWBn@e> d7.!zď+@$ ٭Bd`=&F1Bv`8!{/P\)b}8]?P@2e^|y(7Pm@2eʌ (BƁ2eVl Y(@y2eʜ <&d, ((}(@yo*PNwKGiB2Ra @yJI}%RCAr%E RrIIR+AR+A9DN[AEOJJH@@@܋Ar=ZHAyPG!ZfArO}'$B "$ $ ?/d$yIAc4ILg$yIAg4KHAsOd,{)Xr \3,Bz8Xr %$B_C&BWCWC&B&Bdl~ ~ z) !2Cj !R!!2CdHMHMHMHMH_H_"u"";DM!!R!R!R!R!R!R!R!R!R!2C"2LHH!!R!R!"""T?T?,äd/Iaayd&&&Ia2$0aud&YIIIaaarÅ$00¤$0?L2|ä$00a1'b! Bca| R'a/&Y&s"L%L0a2¤^¤&¶R aRadNI=|vB9RN+g9rA\R.+W5Ej5r#?bín0G1'HHԱHK#2"K,"{,r"O,Ƣ`, Ţp,ǢB,*ƢR,Ģz,jƢV,jǢn,Ǣa,Ţi,Ţy,ZŢm,Xtwb;}b7c1 ?b`,bx,|bX"4c16b19c1#sc1/ c(bY9PN)s-hFM7Zr{mYF˛e}!hF]6Znn-7Bnro7Bެ2Z.c:Fn1BbHI!$RAj @ZHs Y +d A~(bPJBi( <|_B2TPCh14 C h 5kh h#tB~/0aCQa0&$`:̂0X"X K`),V*HXalvn{7pNi8g\.܃Sx?c@80p N)8 g,ppnm!< x o/xqq >|!9|s9 | @A(bPB9(ՠ:ԄPBkh_7:B' ]+t-|'} !0 !B! F `P C (e/"ԀP jC]4FB+h _A{ tnz~7~0pQA !a q0X+`% `=l 6;a7Cp9W.܃#x O<w&āCCJH AH #d!+drC ?BPAq(%/KTP j@M !4Ash-6|  AzB`043ă90|X+` 6 `=p 8 \k;܀WŸĸ RB* @: '|PC( T*PCM u.ԃB#h M4ZCh@{ tnzC_0 B `40`2̄+,Ű X `5Q `=l ~88Spy\܄p=)<^kx;Ϥǐ>ĐBrH)!2r@N ybPJ@)(e/4CSh͡kh 3tG z@`Ca8/?H 10& `:̀0 <x 9Wgr\ǐCH 9d,Av9!P B!( E(P@ ՠԆ:PA}h V5tz#a C`(  ~0 ! F `L)0t3ã+, X k`-DBDF{cpNi8g p. u7܆;p#x/%Ÿ3H!Ԑ2@FCf( E(PJB)( e,PC ͡V:Ag[zz~ 0 `DCF2C !<A( š$rP P*C56ԁPC#h-%6AwzP> ~#aB0Bq0&t `̅~E2X`5Q `3l v ~8 Gp N8 <\p-!<'^x _ϴAzs !|P Ba(%rP*C5&ԆZ@Kh m+h+t-|='?Bo? _` 0 _0 B`40`2LY0|X a1, `l]oA83p.E7&܂p=x3=$c>D@rH)!t2@F Y \A!( ET*P CM ~  !&Da Li0f, s`.̃"X K`%56fapa8G8p98"\p- w><sxof|& S3fH/͐9Cv 33r "JQR\)TJ)2J9RATQ*ՔJ RKQ*J#Di4S+-JkVFtQ*ݔʷJ/GO Q*%P QF+cqe2ILQ*ӕ*eS+&eC٥V(#Qr\9T(gKerSLyy> P }@(>P~ JP|@?P@hM?ZC?`}@QA0VW&)Site2SV(sy|eDY,S++Uje-CDBD:X`#lͰ6;`'ݰo80p 8 4p2\p ~pn- w.܃cxO<^kxoO  3+ąxG1$OSH! $dR@JH3Hi! 2r@N yPJAi(e<| "TPjA}h 4Z@Khkh0 |!F( 03`5"! alM6;`'=pNi8g\k܄[pCx9WŸgvH AbHI!$B:H #d̐Av(šPPC]4ZWA{=  C`(CCB0flXa ,eVJXa pHhXa3l NGp98\+ppnpnm ><xW[9 >$cHRBH =d >@(0P Ci( T*PAu5Ԇ:PAh ͠|?>A  C`( 0|!FD `,_a,%rX`=l 6 `;ݰop.?s@\!|'CH)! t2@FCfY!dB> PB1(%$JPAu6ԁPCh14 Z@+h m+h' _` !0_0 !!Ba q0 & `:̀0 f `! `;p}xO)<^xyq ć| 9 RCZH!#d!3d C !PJB 6ԁPCh14 C h 5-o=tN@W[zzB  C`( 0|`$@P08` Li0fL`,Vn A8pN)8 g,pn- w.܃^x __xq .ă>!!|B"H 9dlr@NPJAi(ԁP@Ch 4fZ@Kh |_C[h#tAw }/0~A00#FA A0@(hcāY0ïZ( 6f;`=~}A8p N9\+pu7|CBAbH) % Av9!< B!(šPP*B%աABon 5XIdT>W2+YlJv%SɥU+JRL)PJ*eJ5RCS+ JLiTZ+mJ;EtSz)}_A`e2T W|@%H VBP%LS+$e2]R+ %ReV W"H%J٨lR6+[.eGM9V+rCCR(w{XyP(o?gQr%ZIU+J&%]ɡRr+JRT)Q*// J%RUPj*J]@i4R+MfJ+FZitP(]nJw[;GQQJ*ahe2VW&(Ide2MR*˔JD*QzeQ٤lV(ەerH9Q*ǔ rJ9Q* ErU\Wn(7cTyP^*,U) ʧJ"%DIR>S)J&%EɪdS+9J.%RX)TJ+eJ9RQV*JCLiTZ)6WJ[QtUWz*>ge2LQBP%LQ*Ide2UQ*%\P)땍eG٫P*ǔrY\U~W+7?;]r_y/H|,d.9\re.22˝\y̱2\Y^%TJPBM 4Bsh=tN?+jCh 4ZB+|' }/0`@ӊb.1X@,$+5Z"Dl&[.bq8H"ljSi(1Q(L#JeDE QC%Dc єhN$ZmD;=ѝA|O$z b0!oY)oX)b#Ll!v^7b?q8H"G18q8E&g5qO< 'SxI"^o_;omU".HB$%ɉDJ"HGd$2YD."7K#D(Q(N$J_D-6QK4 D %ъhM!"DGхN&`b1N" "!B8b<1BL#3Ylb1O,"Ke b5XKDzb#A$vQq8A$Ng9qN$n;]>xJ<#/+5xKE#K|D|B|J$"ID2"M%BDaQ(F"JJDe QA"jDC9тhI#:D7;-уI@HD#~&Ca/O#Qhb,1OL &S4b1M, +Ujb $b+N vb/8G'.*qAA$#9xI"^o?wĿ{ۚ8DBS"HCd >'YlD"K# (bJYR^BTR(ՔJ R_i4T)MJ3+эN|G z@b1J#QD D!b,1OL$ӈ,b61OJ,"ˉUjb '"bO$'9qL\%׉-6qx@<$s/޶6HH$!4Dz"Ld%ى\DQ(D&EbDIQLT%5D]>рhH4"MD39ђhE&_D'3хJt#=>D??31B %ÉKHbHc8b1DL&Sitb&1C%+D$E#>b?q8D&Gcqq8E&gsyqB\%~'qx@<$'3%xKIMC! 2rr  P$1D %c(CėD"QLT!ՉDMQC54046474261|e{COC/ ?z0 1 aH Cc.py ˻'\8 Kx!B,abwJI>^{#\7C{=|<|;|U,T,*Zrwˍ-v;9|(6,b!v]Bn=Bnp ;/\np& , *\np7;"!x!V=}!9"H dFȎH(>DrRN}Q\d9DN!;-BN얈BvH"dG!s8Bfn2#dE|Y!s+BTD=P42"dDHGHOGHFHF|'"g"G"##n#N#.#!!5!u!! ^"^"^"V"N""$7BrX!$4BQ!yFHg6!F&B򦈐C"]!FH~_!m )䦍5BnՈBnC#挐2B#^ ""$1RnH.Rr"" #STBH"Ή&2<#%BnH4R2L#.;$R{#R,,䶈=);=R2#e/GJΑs)Fg"%&=){!R@H7R9)Gʜ#eFvi)%R2E 2;"%Ho̅BBd)FJGJGJGJG[?RۑΎގގ#=)GJ"BHһҳwlllk^7k)G;/R7R#)5)=)yMHFJ=DJ{)))))yGw%%yGIQd%GIQo%FIQmT!FeһQs%7jd%9GIQsd%GIQq܈QQQed%9GIGIQU?QQwnd%GIQydL}d%GIQ{%}YN%Gɞ%%%u%%u%}%u%u%u%u%u%u%}%}%Gɜ̣ Q}||%3=Jz?J J Jfyd%Jj!JxE w7HyQ*)HI$Q*ђqd-GKђqܮ2efGK2efGK2%h%h%hh:Z%hhh=ZrܣV죿2eGK DKђ́h)eDK DK DK DK DK2eD}-s Zj!Zf~he&D=-@R#R#R#R#r DKD fBWb XF,'VD@l$6-VbA$v=^7b8@$#Qq8A$N3Yq@\$.+U;qAA$n;]qx@<$'SxA$^7[O/_m]".O|L|B$"ID2"HE&>#9|DA8Q(I"JDe QN jD.QO4 D)ьhN ZD+k-юhOt :D+эN|K|G '~ ~$~"z}A`b1F 'F>/G#QDJL fsXL,%ˉj"XG'6"qL\!739xE%' DJ"H r"?Q(H!ňD 4Q@T$**DUQA$jDCјhB4%͉Dkk=сBt'%#z??/ b1F 'F>/GH"""#Fc8b<1DL&S b&1OJ,"K2b9XC'ۈn8q8M%xI"o?w?Ŀ{ۆ8D\"HJ$#)D"-HOd$2YlDv"E&y|D~Q(D&ňDi%QDT&ՈD-Qh@4&MfDsђhE&_mv7D{ёDt&]nD{'ыM%@b1F 'F>/1$`"M!b"1LL!ӈį"b1XF,'V+UDM#6-Vb;I!Lj $qH\!;]qx@<$'SxA$^7;o_ƸD<">HH|B|J$"ID2"HMd&YlDQQ(I"Je/JDUQA$j:D]>рhH4"MfDsњhCt%݉oDOчK'~&QD J'ˉD8M#6[vb'M! q8L!Lj $q8M!gsxE&MD2"HE&>#itDz" Q(L%ʼnDIQ(C%// D%*QN jD=>рhH4"m.DW#чG ~&a‡#DJ1Xb<1I"fs_Ebb XF,'V+Ujb M#fq8A$N3EqB\%7?.qO< O;揉$DN"(H" ňD $Q(M#__D%2QJT#5DmшhL4!͈D %ъhM!"&oD#щLt!݈ķwD{'ыM!_A`b1F 'F>/GD1DL&Sitb&1M,"KZbJl#;o>b?q8L!lj)4qƶ%!!!!!!!!!!!!!!1фhJ4'Z-vD{љBt%݉oD/їG'_/GD(F& Db1BL%Ӊ,b61K,!kDQhN߲˰ϰ tAQI-g%qY\[⎸kgox$4exg['ָDĆ$d4D:"=Hd'r9\Dn"G' "DQQ(A$JeD9<%QBT%jD#%цhK#݈ķwD{'ыM &#—#b$1$`"%ˆb1HL"&S4b:1K' _"XG'ۈNb/O"Lj#1xF<'^mqxD|"Dd'r9\Dn"Q(I"JeD9QDT!ՈD &QM!D1єhA$Z6D[ў@t$:??>D_џ@L $~!F?@"Pb41G'&4b1C, rbXC%‰""uzb#Ll!ۉNb7O Qq8A$N3YqL\!#1xN!"mqxD|"1HL$!ɉD6"(H&J2D9QBT%ՉD]QhH4"MD %ъhM 'zD(1C%db 1A&ˉZ" "b#8B%kM6qK#'SxA$^7_;oێOOD2"9HI|F%D&s"3A$ryDAQ(B%ʼnDI4Q(K#UD-рhK#!DWѝA"~"z}!0b81!| ?Ÿ Fdb 1C'6Mfb Fl'v{oAq8M!;qA"39xIMCKC% ODD"HA">#itDzs"3Jd#9\Dn"G' ED)4Q(K'$*JDe QC% FDc єhF4'ZD+#щJ"~ ~$z}~Db31E!D1K#$b21K# b)XN V5Z""uzbBl%;.b7KF#!0q8J#% qF$w'SxA$v}Fd"Y|DQ(B#%D)4Q(K#__D%2QA$j:D=ѐhL4!͈D %ъhM!"&oD#щLt!=DџHB "CapbKD1EAD0BaXb1HL&BWbXB,%ˉJb-NDDLl!ۈb8K#.5qC%CxA$^7_?Ŀ{8D\"HH|B$"ID2"9HI"RiD:"=Hd">'ىDN"?Q(L&D*QA$j7D{ёLt%?>D_?1D &ȇ%b$1$ Db1BL%f39\b1XHJ,!>b?q8H N3YqB\%n7{CxJ<#/k xGI@|D$$>!>%IgD"-@d$2Y\Dn"G' DQQ(E&ejDќhA$ZD;=сJ|K@&@b1J #b$Bab,1O,!ˈ*b5XKD$E#6-VbI"v{߈} $q8M!"qL\!7?-6qxH<"/-'xoK$ >"D")HI"RiD:"=Hd">'2YD6";I"ryD 4QhOt%z?}Db1AO#QD D!D(1JL#fy|bXD,&Kerb%XKD4Hl"6[>q8D&GcIq8G'.Ke qN nwCxB<%ωKxGMKK# 'ħD"9HI|F! DF"Bd%ىDN"C%BDaQ(F JD,Q(O|A|IT **DU:QO4$.DW;-=ыK#Pb1!@"CL&b)XA N3YqJ\'nw{}xD<&O 7m_"HL$!)TDZ"Hd"وDQ(A"$*UD5:QI%-D+5цhK|C'>D_џ@L $~!!Pb1AD1M!Idb 1FL'f3Ylb1G'Vk"&v9">&IdD "Hd">'وD"'O "DQKQLT!ՈD QO4 MDKњLt'%#z}ApbK#`b1@L$&)tb1E&ˉJbXG'6-VbC%~#I qNA$n;]qx@<$ωKP".H@|B|J$%)TDj3"-C%D!0Q(N J//D5>рhH4"͈D[ѕM! b01J # "!*"JD EmrKb%8$>Xy#0e2^LT&)e2O,P(KereRYV(k%RYlP6*۔eWM٧W(1rR\WP(SRyV(*)H%@HXTI$QR+lJv%RP)Q+_*JJeRUTj)uJSh/:C ݠ;| ='GIA  `8Qa p18'4 ppnm 8WŸ?A|H) %dlJv%RX)S(JJeRCRj+uJXiQV+Jw[[ Te)e2ALR*ӔLe2GY,T)K2eRYU•%JYlQ*۔NeOٯP?1Hyxl۶I8;m۶mUz>5<8p N8 "\pu ><Kx o;e9o;[\w+vs.vy9/yx.xg;;Gp! p"@D#Ոn0bF#Hh$2)F&#e5"FQQ(k3JFQӨc3Fhk3FOc12#Xc1lL1ӌc1Ϙo,0cXa1&cjl7v}~q8l1')qѸd\67[mHa4RitFf#n0rn0~F(#kD0"QFL#ۈk$4IdFr#Hk*FUQ˨a2juFcha2Fge1c1l 1Ì@#n0Fc1oL632cXm1&cm1Aq8b5qɸn0xgk|0>_7i_FL#Hh$2IFF#i2ryBFaQ(a4J2FYQި`T25FhmmvFGbt5ݍe6ch#QcXb,3`gl>!<^Kx t~N('މDq:^ކ25|?|6kB (e TԄZP@]4>Fc1p`"L)0f, `!,%*Xka=lM 8 g<\;pxG _;-B0! $Bx!D( C !$DB2H =d 2C A~(@A( E(P *C5ZAh t@C!`8Q0$ āY0|X `#lͰv`}p!8 G(pY2\;pCxKx=|w?oAp!!0Ax :ĀX@"H !%ԐC 3d C ~C Ba( O( 4PCeՠ4fZBk6A{t.AwzAo sg3s;$g3řpf:s9w.:ל]yu;'?C8!PNh' Dp":N4'Év9NB'I$s;)NF'q:ŜN S)w*:NS۩4p:͝Nktv8ݜN?3 r;C0'w:ӜLg3ۙu9BgY,sV;k:gu8#1sֹ\v8ם[m|t>;_D wB8N$'Չpb:N<'I$r8ɝN*'Is2:,NV'w 88BNS)v8erNySɩTq:՜N S۩4rv;͜N r;#Qhg3w&:,gYtV9 Fgpv:^s9wN:sٹ\s;7-sǹs;'3y|t>9/WD wB8N'މDt"9(N4'Iu28LNfSީTt*9UZNSi4t9MNtt:ݜN t8ÜHg3u9I g3˙q:BgY,u;+5Vgs:Gcqsѹ\w9Gcyq:Wt~hN'Ήtb;IN'dwr89\NS)u9ŝ?RNiS)w*8JN5Sөv:Ni4q9͝NK8=N?3 q:Ü@g3s&8Tg3י,p{Ѽ{Ѽ{wѼ67Gywh4oFfh4Ffe4oNFFL{1{{1Ccz;hLo齇l|u9?_'V0' q:ND'͉pb:N'I$u;)N*'dv8YN.'9?"N S)u9 N%Séw8 NivN8N?3 ug3ƙLsf:sBgY,u;gtv9s9s;+5syv::gp~:O`Np' s"8N4'ۉs9INj'dsr9ywb{Y^_z"^?W^c{9^n}۫sl/kc{u6j۫gl&woۻ3b{7Fl7q: .BW]z=^BoW'A`a0T& F#Qha0N Lf3Yla0WX$, ˄FaY"l ۅNapX8" DžIpZ8# KepU.n @x&^ ow¿{Q$|_o¯L!B aB8!U%$R)TBj!VH/d2 B6!S% "BY64xM\oϊUq=*7^yzK\oW&q#Sv7.q]!7z<7xf]@x$< τ? Vx'+>W`Bp!R- HBd!M! $BJ!V*EbBqPR(%erB%PE*4:NBgS# B0\!3,a0WX,, ˄ aFX+6aK- IpZ8# epU&\n CLx.^ ¿I*| ?¯L,Db B!OH $ ɄB!NH/d2 YBPF(+ B%PE*Tj5BPO/4 BLh.Z BNh/t: =^Boa0P$ CaB$ Fa0N/L& S4a0C) EbaLX.V FaK- pB8)N g9pA(\. W5pC%w{}Px$<OgKZx#>OgM.~ +A!J-D 1Bl!O/$IdBr!RH- BAP\(! BUP]K!j :B}P[h,4 ͅBKZ BY.=B/_$ C a0Z# Da0Y"L ӅLa\$l[mvaG+ !pL8.N 5pC)n w=@x(< τ+N(|_ow !B(!F'"HBd!])b B"!DH*$ LBV!]! *BULh.Z B[^(ta0X" Da0]! eraJX- 넍&a]!v {}apT8&. pM. '3^ |> 7% # BD!S%$RBZ!^(dr B!PD(.)J 2BYPA"T  BPO/4 MB3Bh)Z B'E*tz ~Ba0P$ CHa0^ L& ) aXX",V+UjaA(l6 ;=>ap@8( GpN8/\. Mp[# OsZx#|߄B pBD!]H"$ itB&!E*dr BPH(" %RBiPV('*BPM%B3Jh# BGY"t ݅BO[# @a0X"  B0\!F 1a0]!f saHX,, ˄ aJX+6 [>ap@8( DŽ)pV8'. 쿒D" хBL!O/$ B2!BH)R iBF!Y"d مBN![#|B!P\S(!J 2BYP^(T* UB-PG+ B#RBI,t ݄BC)  Ä8a0A$L ӅLa0[# "aTX.V aI,l ۄNa[# DžIpN8/\ ׅMp[# cTx&<^ o4B) B$!U&qBb!LH.R ,BV!K- BqOPR(%eBePW'BBh)Z BGY"t ݅K- 0!P# )Ta0_X(, K*aF l ;]naO/ G9pU&n ;cBx- §JL.B aB$!M+ $BR!BH)R iB:!A(d مBN![# ŅBYPM.%j BPO/4 BLh.Z B;Q% @!H. $a0E*f 9ap@8(DŽ pZ8+ %pE*\ 7;=@x(<Og?KVx/|> M.B8!M.b 8B\!_H $ B*!S+ BPH(,  %BiP^ T* *BUP])j uB+/ Bw!@!z !P!&ӄLa0[# "aDX*, +*aE& # pM!n w=@x(< O?KZx'+>*K# Br!RH% BF!Y"d B!_( bΟN S)딃NS٩rj;NNh/t: .BW 0a0J- $a0[+ RaFX+ ۅ]napB8%.KepU!n ;]p_x < '?KZx# 7 D 1XB!ͬ޼J墳yڛUxڛE9SթTwrj85ZNmSitZ9B;A(t: ]B7 z >B?0D* a0J- a0I,L ӄ a0K- "aDX*,V k:aA(l6 [6aC)v {ApD8&N9pA(\ 7-\x+ 'E*| ?_&I,D B!O/$ ɅTBj!VH'2B!M.r BO/ Ņ?BIPQ$TUjB-PWh"Z ւFh+:NBg z Pa( F#Q8a0]), ˄ aJX- Va]!v =^apX8.N gypE*<^ /·JV D" QB4!C% B"!TH+r ~B>PH(" Ņ?BYPY"T  5B]P_h 4 B[^*t BK- @!P%L& SiLa0G+KjaNX/l6 -VaC) p\8! %pK- Xx"< /+Q*|~W`Bp!V/D х8B|!TH)R itBf!K BAPR(%erByPQ. M!z }B?a0P$ F 1Xa0^(L& SiLa0G'2aBX)V kuaI,l qpJ8-.KepU&n w{}Px$<^ow¿{Y&|~?_>\%apBx!Q$DbB"!BH- B!U.r ?!_( !EbŸB)PN T* ՄBmZ$t]nBC)}@a0D* Å1Xa0^,L ӄaHX"V faU&l #QpB8) Kep]! GcZx#|_+Cp!V D" (BT![+ $BR!\H!R iB:!Y.r yBPX T* UB PG+  ̈́B Jh- mBGY"tz }~Ba0P$ F1Da0U% BaXX",VkuzaQ$lv pP8$ DžIpF"< ;Q_9tg3Y2B8Q .ćTAz! BC\h%mBG]!z `a0V' %2aRX%kfa]!v {}~pX8! EpY. CXx"< /7¿{U_ !B!I,qxB!HH,$ )B!Q$dYlB^PD(*'2P*Cm > 48a0A. 2aBX) FaY"l =^#pN)r;g?KpB:pNx'ʼnDs;8N\'I$u9ɝ4N:'du9ٝNN'w :NqS)u*:NSͩ4p:&NKs::=N/s8A`g3 rF8#Qg3љLv8Ӝ8(p NY82\pxxo-¯߲F "C !ā@"H !%ԐB:H d, Ba(E8 %Ԇ:PChov:@G+t='B?`B 0\a,EVZXa lmvNapa8Gp.576܃cxo_;eQ *DbB, q T2B& ;䀜 rC ~C B!( E(?RPAՠ:5&ԂPB= !4&Ash :B' a @#a10& `,V*X ka >8G sp.Ex |/ ~O[AQ *ąx@RH! @^|P C( Š8 %$PB9(2TԄZP@]  4 Z?70!Fa L0flsa>,Ű2X+`5zal ~8cpNI8 \kpn >{y9|w#9w3\>}W\pnmw܇cxO9/%;3|  ~+ B@( 2D C 6āCH 1$ C H 5 2C ;䀜 rC ~C B!( E('P JC( ,& [Sp98"\pu7܆;p}x W;۟i! 2AfY!drA ~Aq TPjAm4F74&C h t.Aa !0 !Fhca 0&dSaL0flsa ,eVjX `=l 6 `;쀝 v ܄[pCx)/%;3|  ~+ C 4CDq .ă@ZH 3d C 7P*B% U*TԀPBch͡hm:Ag ݠ;@ ? 0&$ a>UZXalͰ6;`'ݰ> pq8'3p.M  ?+"@D! ă RCH!;䀜 rC ~C B!( E?RP@9(ԅBktAa Q0frX+av;a=~8#pNI8 sp.E <;3| !*DbC >$BPB1(4PCUTԄZPB3h :Ag]t 0  `$0Da ̅Ű2X+`%հ:X`#lͰ6;a7쁽A8 g,\pnmw܇cxO<; _+|_!!0Ax!6ąxB"!? PC 6ԁPChoh M)4 Z?C3t CA0 `40 & a̅y0BXa ,eVX `+lv~8#pq8'܅cx95w/| > ;2! $B8 "DBt1!Ć8A|H !$$ArH)!4Az d\@^| P Aa(E?RP@Y(TJP@U/!414 Z@Kh zB/ }/ !0 !XaL)0t3ă90|Xa u 66;`'=!8GpNi8"\p5܅{px x 5>W[C*H 3dlr@.yA~(@A(bPPJC( TJPAu !414 C h 5Ch =t :C ݠ; @Ca Li0fa}p 8 p57&܂p=!< ?[x{|/w?oAp!! "CT 6āCH 1$dRAjH!dL@V!\@^@1(A X a,%VZXal-v.{apa8'<\p . :܀p =!< ^x oB@H!"D(At q!)drB. y /A>(0bPPJAi(e P*Ae/5ԅzB7 ~@ C`( @0Fhca 0& `:̀0< `!,Ű2X `5Ͱ  sp.E \kpn- w܇x U)!JPBsh #t.='0 aQ08`"L043`́0BXa ,eVJXa u6fa]^CpQ8SpYW!0`2L0 `6́0X`1, `3lmp N ><^KxoUC 2D @V!\ @!( eԄZP@] !414 C h 5Ch =tB7zB/ }/0  C Ha q0&$ S`*L0bXkalM88p N8 <\p U7&܂pCx_[B8 "DbB, !$ĐArH)!4C&9 '| P Aa(E?rP*@EUTԆzP@ h 3t z@oa 0&$ S`*L0f, s`.̇ X `5`;p 8 7 <$dR@JH!-d@VJ@I( rP*@E TjPPjAmu4@Wݡ^@?`8Q0x`2̆RXa5za;ݰ> p18 p.eW\p n=x O)W?~+4C!DbA\!$dR@JH !3d C 7䁼 P Aa( 4B ݠ; zCa @a.lͰvNapNi8g\KpU<3x/73|! $0CQ *DbBlq!ćAbHI!$RA:yA~( %$PB92TPPjAmuԇAch͡C[ht~`ca 0&dSaL0flsȧ2Xka#lp . ܅{pSxx/7 > fp 4p"B$ Q *DbAlH 3d C  P PjA]414 C h 5Ch AC`( @aL)0t3ă9X `9 VzalmvNa쇃p8 W܇cxO<W[; ! $@\Y ;\@^(BI( rP*@E ԀPCh)V v:@G tn^@ #`6́%rXa u6f`;p 8܇x 9|~V;BAha!C 3d rAnyA~(RP@Y u 4zB/ `0 @a q0&$ S`*̄90BXa ,56& ;`'ݰ> p18܂p=!< ?^+x o->' _+|~¯BC 2D b@L!ąRBV9!/A>@( ,X aUZXalMV{`/p!8 G(pNi8<\p . :܀p n ><s^{[BB( "DB41 &ĂB< !$ĐArH)!4Az!d,Av9!< BP C)( e P @UCchM4V-0 #a2Li0fL s`.,Va=8g܅'^x _x#|7[`B@Ha 2D @z!3dl@^| @A(P JC( U*T@[htNB7"X K`),հFa]^ #p.e7܆;p}x<'sx/7>G[PB8! DCRH! ܐ P C( Š8P *C- u.ԃZAwzAo}0PaQ0XaLI0T `6, X a 쀝 v0pY\+pu7܃?^+x o- 8 BC $CR!'ܐPP C(%$P*@E TjPj@M4BKh#t CB?` 08`L0 X k`=lmvNap N)8 2\p 6܁pxO<W[x3|  ~k C DbB, >$CH 9 RCH =d@V!'ܐ P@U/5Ԇ:PA}h 4fA{3t C^B?` 0A p#a,I04`>,V:`3l {a쇃pq8' p5g_|~w0! $Ax1!Ć@H 9 RCH =d 2C 9A!( EPJAi(e4B;ݠ/0  0F(ca 0&dSaL0fla,Vj[alvn{ap8 4p2<8B41!Ć8A|H 5t2BfY!< ??$2PB5A u14 C h 5Ch =t :C ݠ;@ 7`( @0F( c`,0& `6́%18 \+pu ><x |OߚDdR@JH i!d,rA>$PB9 TjPPjAmu4B3h-%m-:Ag =>A`0&d `6́0X`1,{pNI8g,p.M܇GSx/%;W[` bC >$CH 9 RC"PAqJ@I( rP*@EU*TԀP@]  v:@W10&d `'삃pf dLA~( Š8 %$PB9T*Pj@M u.ԃB#hB{+t=a 0 F `,X aa8GSpY8"\p57&~""C :Ā bC< !$ĐB2H)  @. bPPJAi(e P*Ae5Ԇ:Ch͡V v:@G tn^@_a A0PaQ0L`1, X `56V;`/CpQ8Sp98"\+p ܅{pcx9/%;_;_ !$0C 2DB"H I )$ Aa(šRP@Y(TJP@U/5Ԇ:PAhtNC zC ` A0A 0X K`lv18\kp ^kx#|V!D(Alq!>$ĐRPJ@I(,TJP v:B ݠ;@ 0 `80 F`.̃RXaݰ~8g2\p ܃GSx/|OW?oC@H! A|H i  2AfY!\B>(bP*B+hm:Ag!z@/ ? aA0FSaL0 f< `!,VjX8܃g[x|OOwB9Nx'щDv81N,'ljs; N'̓Iu29^&qNIS)s;N%SթTwrǿS˩s:fNsiv/:NxW'rz;}@g3q9 Dă90sMlxw{{{{>{oǻ[xǻ]/ySo{Qo|M0!"DB41 &Ă@BHI t2A69 '? PB1(%$2P *C աԅAw? 0Pa 0&$ a̅y0"X`5.U܃#x >F(A< 1$ C HPj@h-%v pz:_mj6floez4 rA>`*̀Y0(8RP*B% UT6ԅBch-h=t :CCa 0a*Ly0X `%- `?cpY8\pn- w><sx 5>G;k0 DCH 1$RAjHi!=dL@V P*C ՠԄPB=h9V v:@G tn000F8`"LRXa삽pa8GpNi8g\Kp5w.܃#x O)|[p 4p"B$ Q!ĂDArnގۍyˉn{6řLs;3Ylg3ϙ,p:RgYu9 Fgtv9=^g9t9#Qs9rN;gEsٹtn;w}yv8owο{|w~8?_{0' rB;aN8'Dv8QN"'I$sR8N&'ds;9N.w :"N1S)Tp*9UNSi4v:Ntv9=~s9u9ǝgs^v,D?^xH^nxj=o o_ |h탿m|hC;>t]|C7Czׇ~>a}d0Շi>a|B؇%>,a}XJVڇu>a}fՇ>a}>pЇC>G}8qNp҇S>|epՇ>}}ć></}xkևw>|_}w~j=B҇P>!Q|C"ԇT>!|Cf݇>CiPއ >T}CUP݇|CmPχ>4-|hC+ZƇ>}C7Czˇ>|80>La}\0߇>,a}X6ɇm>|81p҇>|%.pŇ>\7|-npLJ>|x#ԇg>o|gUՇh>D!1}HCB؇$>$!}C͇>!y|C~JPʇ>|(C*Pɇ>T}>4|hC7|COzۇ>>}@0؇!> a}HF0ڇ1>a}40ˇ>,a|X6ɇ->la;|χ>}81p‡>}5pۇ;>}ẋ>o}x{>ه¯L.B 0B!M.b xB!BH)R iBnO' BPL(+T|CPχ>4|hCKZ>t=|C}a#|(F0Ƈ>a|T0݇>a}XbVƇu>a}C) ApJ8-.Up]!n ;Rx->߄L.B BX!]- BB!LH.R B!^ d2 م\B^O'JB%PG+4 MB3Rh%6B[I*t =B/G+Qha0V'& i,a0G+ K aVX'l ۄ=>pT8&N gsN/D B"!DH)2LBf!U&dr9\Bn!W(  ńBIPF(+* BMP[# &BS\h!6B[M+  a0T& Apa0R%cqxa0Y"L 39\a@X(, +UjaVX'6-Va['1pB8)N %pE*\ 7]p_x < 'S\x# GC_} !B(!V DQB !TH'2,BV!]- ?B!PD(* BPNK!j B3Bh%B;A(t: ]B7 z Ba$cqxa0Q$LS a0O/, e*aI,l ;]naW' ep[#< oB!B!GH*$RYB6!C) BaPJ(- B%PM!j :B]P_h 4 MB3Bh%6B[^ t B?a0P$ Apa0^ L ӅLa0W/, ˄JaZX# FaE&lv{}~pH8, DžIpN8/\. 5pGx*< GY.~W`Bp!F) )B*!F*d 9B.!PP($Ņ?BYPA(T* UB5PC)4MfBs/ BGY"t a0TF cTa0])f sBaBX)V k:aE' 9pM.n {}Jx# 'E&|~?k@X!Q$DфBl!@H$$ Bv!' BBPL(-**BUP]!j zB}Ph$Z B[^ t: .BWO/  0a0F,L ӄLa0[# BaZX# Na[' KepU&\nυKZx+|> /7 &B!B8!A(DQhBL![# Bb!LH% B6!WJBPI,T ՅBmPO/4 Bs/ BI"=B/_( CaB$ F#Qha0A(L& S4a0C)f s|aPX$, ˅JaVX/l6 }~pH8, +uTx&<^/WB% B!I,D хB!O/$ $B !^ d مBn!W BPL(. 儊B%PMh(4 MB3Bh):]nBw!@! Äa0I,Lf aZX+ &aE. GIpK#υ+Fx+> ߄ (BT!]! B!ZH#2LBf!U& ~B>!P@C(( EB1PR(- *BUP]K!j fBsRh%6B;U&  B0\!F 8a0A$L ӄa0OX,, ˄ aJX-6 [`+쀝 > #p E*\pnmxd<6OWkl|1ߌOgD3b8F\#Hn0RiF:#hd22YFN#o00 FQ(i1*FUQ˨a4juF=hhm4ZvF{dt7Fod 7Fc1hL1ӌ c1ۘc,7V+Ujchl3{q8l1nj q8m1%qݸa2nwCxi2^o;h|2~F#g7"hFl#Hl$1ɌF #Hm1F#ld1ٌF>#Q(g7UFMQǨg40Fhn0Zֆhgt0:Fn6c1fAc1ʘhL2ӌ cXb,5ˍ*cdl6v;Qq8i2Ng9qݸa4nw=xe7>Og f6ьF #ˈm5 $FR#Hi2iF&#jd3F#Q(d5erFyQѨdT65ZFmQh`41ZFlt1Fo` 4C0#2#Qhc1˘m1Ecll1ی=q8l1ǍIq8g\4.{;y#x"z{3л19͟@ozs&Л-< fH`7;y͉@ @oFzs!Л}̀@/@/\n@~ n@/,9@/ xR<^x`}^zZwzyeRCޭO9.޽eNwzHwzm[ofw轕1 o zo$#1puo 2pg}o z2@~ z,c &@,k۞_=>,ޞDA^Oy7ȫoW A^]y5 j4ȫc7:yu  oVy j1ȫc7TSͿ oy fQ7y{x5 j3ǫiwy 0ȫaW A^ ys#țA|nA<f@A}=^~y7UW /K 22ȫuW /yy5 A^݃yun n n z /y Z/ȻY#냠p.% W*\pn- w.܇k |o~OBB( a ,"BT!&Ă@BHI )2@F Y +d?RP@Y("ԄZP@] 14 C+h A=>A`0 0 3`.̃ŰrX a- 6 `;쀝 v^8Gp.e :܄[pW; _|!!4D C ! A 7BP *B%5ԁB#h ͠%m=tN@W /0  Ca0xa2L0flsa,%rX+a56 `;=~8 4sp.e܅{pSx%{Atq!xH/F6mPgԀZP@Ch͠9 Z?C7aB 0Fhca 0&dSa,V*X k`-6& [`+l v `?p18'$p% W*\pn-x |~¯BB( a ,"B$ Q *DbAlI!$ RCH =d 2C ;䀜 rC ~C B!( E('P @9("TPAu j@MԅzP@Ch 4fZ@Kh@[h]tC`B 0Fhca 0&dSaL0 f `>,RXaUZXalM6;a=~8#pN)8g܇cxo |ml|( TJP@U/5Ԇ:PA}h  4fZ@Kh@3tn^Aa,0&$ S`*L0f, s`.̃"X K`),V*X k`- 6NapQ84p.% W*\pn- w.܃^+x o-=|OW_ !B8!D(At1!Ć CJH!- 2A ;\@^( 4PC2TP _PjB- u.ԃB3h-hm.Aw? 0 `808`"L02X+`%հ:X`l-v;Cp nx o- >Wm|p!!CDH)!42BV9 '< @A( O( 4]! & !J R3H0b*yyo??:kz{빞{``-֬{SAu ԅ %heh-6A{t.Aw=>^~*a A: !0ހa0ބ0ނQ0XaLI0Ta3ă90ޅy0ރa,CXa ,`,Vj0Xkaa|Sa lm>]^pNi8g p.eW\pnms @: dL@V!\@^!(ax*C]h/Ah͡%t~*0 a̅wȧXa |`9 VC(XcF6f[ala/`? | w=p18'~p N8 <\p . :܀p vDbAlq!ćAbHI!$RAj@ZH!2AfY!;\PP C M)42 ZCh =t0&,X K`)|+`%4\1!&ib&oD&Ibd&IaR>Ƥ5Lzo0&j&er<&gL43˦iiZ֦io:laz^cWL?y7@3ȼn!fy 3͛fi2hcƚqf`&Ifbifa13,31sͻfo3f|hfYj>2r¬4jj֬34ߘas3g9s\4s\77Ms6wclf&m☸&o&Il&InR&Ϥ1Lzo0&l&nr&m&o2LA)d "Qy,|`1,P`3l  _÷#p ~$p1 &ĂB< !$ĐB2H) %pC!#d̐r@. ?P*B%u9W Aaa 7` 7a` L0ށ0 f\x|xއ>a1,6;3 {a| Wp0p ~$p98"\+pu7܆;whb@L!ąx@BH! $dR@JH>Hi! p?<!d C 7䁼PC ( 4, P*AeUyh mt CW Q0ކ10\x|xއ>a,`,P5ǰ6g>]^_~8| sp.E \kpnM]B :Ā bC >$CH 9 < O@ Tg TjPj@MBmu9x^zAch#tq0&Da Li0f;0ރŰ X ` u6'>MVa|`7| G('4p.E܄[p51CL q .ăAH!p!#d̐ C < @!( EQx ')( Š8P JCY("T 4%B;h3t COW5`"Li0fLK`)1lO`#| `3l >p~'8 4sp.% W*\pn- w :Ā bC >$CH 9 R}B:!#dZ:Ag]tzAo} Aaa `a q0&$ S`*L0f < `!|"X K`)|`9 VC(X `=| & [`+l>9=}%_A8G3p W*ܹkrDؐ@z@vy /䇇 < 0G8PPC2ԄZ,Ԇ:Pԇ4F^&Ash-:B' ]+t^0 F08`"L043 `6́ B! ǰ6 v^ | !8 G(p~'8 4p2\p Íąx @V!\@^!(<OAQ(i(T TP C-x@ChM4V@[htN@7=k@`C M#-mca 0&dSaL̄Y0\x|xއ>a,Uka=| & [`+l>]^@8|k{8cpN#SpY8\KpU7 C 6āBbHY!\@^!(ax Aa(c8<:Ԁ,̀>a,U azS8\+pu7܆;wM AH 92CV!\A~xbPj@MxjC]x@3h-6A{t.Aw 7 08aL)0 xf, s`. `>"XaPX `=| & `;3py\+pu7܆;wMhb@L!ąx@BH! $dR@JH>HiA 3d C 7䁼PG0< < OAQ(šRPPAyTg TPjPԃ"4KB3h-6 :C ݠ; zC @?x^00Pos`. k.5#$R}B:H drA!(ax Aa(rP*@EUTPjPs<B;h#tB7x^00PxpxFHx FhxXaLI0Ta3ă.̃ `!,V*X k`-p5|w=pOpNi8g p.eW\pnms;! C 6āCH 1$ C H 5i -!#d̐B69 0<0< < OAQ(šPPC2<U*TPjP@]xԇ!4 4fZ@Khm-Aw=W00Pxބ0ނ60`2L0 x0{>,CXa ,`,k`=| & [`+l>] pyx̸CH AH =dx2B& Y +d"bPJ@I(,T4fZBk 77`Q0ކ10xaL)0{>|"X K#XaUB! ZXa |;K8[#pMu׬!ĂB< !$ĐB2H) dL@Vy /0P xP C ( e, PAu5< ԅyxZB+h m-:B' ]+tzB/ }/W5mca 0 & `:̀w`&̂UBa u>O`#| `3lp+CpE WAH dA~x #P Cxǡ(PJB)( e P*PAu5+tzB/ C`8 c`,a, X `5Bǰ> 6 `;sa/`| Wpo;a8G$pU7܆;w hA|H !1$ C H >Hi! 2Cn ?< < < < OAQ(šRPPAyTg TjPj@MBmu9x^zP^Ach W5` a0 0ބa-lOSa lmvg9=}%_Ao;a8G?I8 sp.E \kpnM]sC ĀB2Hx2B& Y +drB. u9h 4 4f^ZAh q0ށY0»0!,ŰG X `5Bǰ>)lͰ6;3 . K 5|p8 G N)8 g,p.% W*\pn- wz7D bC >$C Y +drAny!䇇,TPPԇ446C tzB/ }/Ux u C`(`8 #`$60DS`*L0f, s`. XG X `5Bǰ> 6 `]2B& š$PB9(Tg <1M)426A{` 7a c`,0&$ȧO`#l[a8G"\pnmshb@L!<C(@a(c8<OSPAq(%24rKA{t+00PxpxFHx Fhxx`2̆9.̃6f[ala=p+8_7-|!8 G(p~'8 4p2\p ]@41 &ĂB< !$ C H t2<< OSPJ@I(i(  !4 ZB+h m- 00ބ0xaL̄Y0|XX 2X+`% & [`+lv ^@8|kCpQ8?I8 sp.ez?At1!6āCH 1$ C H 5C!#d̐B69 'ܐB> < @!( EQx CE U:ԀZP@]x^zP^Acx @Sheh5@Wݡ^@_k@`C M#-mca 0&dSa:3a,%rX+aP5z6'v 8W܄[w-H I!%p C 7| @AxBPPAq(%4F@Sheh- v:@G]t>^~L0fls]=xB>ERrX+aP5)lͰ6;3 `7쁽@8o[a8 8G N)8 <\pnms 6āCH 1$ C H 5i -A 3d C 7䁼CP P Cx B1(%$24rP*@EUTZ,Ԇ:Pԇ ZC[ht^`o `4 c`,0&$ S`*L0ށ0<!,Ű2X+`% a:F K -|!8 G(p~'8 sp.E W*\p nÝ>hArB6#P<šPAUTP @=/Bh/Ux @ a q0&Da ,eVX'>Mv Wpo{8G8p \pnmsׇ! C"H %ptA 3dr@Nya(<Š8P BchM4V@[h#tBwa0 7-c`,0&$a!,v. {`/|KCpQ8?OpNi8gpnߵ(:Ā bC !$D Aax Bq(%2P*@E:ԀPނ0&$ S`*L0flsCXK#XavNvn{ _~8#pq8?SpY*\pnmshb@L!ąx@BH!T4CP P xP J@I( < e P*3PB55&Ԃg6ԁ</@=/B h 5:B']; zC_x00PxpxFHx FhxXaLI0Ta3ă90ޅy0B>eVjX `lOa3l  v v _> | |0p ~$py\+pu6ܹkIDbB, q .ăB"H I )$RB*H AH =dx2B& Y +drB. y /0<0G1x')( Š8P JCxB9("T TP C Y u.< PËAcx @Sheh-6A{t. C 7 W5` a0  &60`2L0 ;4EHZI+#iu$u>6Fҧ5E瑴+F?Dt(G1O==餧SN{:鬧s{颧K.{骧k{馧[n{gih{)Xb{)x{J)$zJ)RzJ)4zJ) S&O=eS6OO=TÞTSaOE<= OOz*ᩤҞy*既*y⩪jTKzj橅xj멝:z䩳.z橇zy!zz0Ooyi&{z,O=BO<-<VGBX$u9DH EH"EH8餧3z:邧.y銧y醧n{Oo2#<,a=ÚHimvyiӗ{!O=tEO,K)$yJ)y)l{)\r{)|{zSOyzӓTS1O=TSiO=UTS%OUfO[zzS?OzzSO< a4HOoymOc<4dOSs\g3yyq'W+܊E{ϵ#gYvB0g7pV||lv{ˊÿy8ᄇ<''=pg=p=\pU<\p-=܉!{!XzI")I$%.z!rz1<PCIzU< 0PoxaFzal~_0%̉`nF0/%=zx&=lgvzaCC{8ᨇNxÏ~p)=p%W=\pÝ[!bz!xH!RxH>i< xxc'=PC)=𴇲y #H #f$tN9DBH =#w$W#$ A0<ތ0:ލ9l̴s}Y}qV|{c{ڽ^vkWs{ڽ'\뭾[o9Th,'{BI帟mgVh }dr89E X! >M  v v _>  | !8 G('\pnֆ@4q .ăBbH!-!\P (<EP*B% @ ՠ:ԀP @}h%hM6A3t Am ā,V*X & [aݰ@8SpY\kpn- wZ@\!$D@RH!%2B& Y!dB(#P c8<OBQ(š2P*PAu/Ah t :CW='A: a L0>E` u Na/0#'p ]c@lq!ćAbHI!$ d̐B69 '<A~x @AxB<OSPJ@i("T TP jC P^Ch m @7=a ! &0X a ,Vj0Xkaa|a ls8_7-|$py\+pqDXCH $ R}rB !(ax Aa(SP C)( ei( ^~*a !0ހa0ބ0ނQ6Y0\X VZXa|a 삽%p 7#p N)8g pu]B .ăB"H I 4AzÃ2AfY!;\A~xqx(PjP@]xEh 1M)42 Ag=/`0 7`$` q0&$ S`*L0 f <>ERX+Sa lm9ݰp8?I8 pn- w$AtH %p p?<!dlrB. ax Ax8RPB9("TPjB-xjC PËB#h /Ah /CKh'>F$xfbX rX+al]>A#pq8 g<\p Uܼkc  !$dyżfflF1fg&Ifcw<3߼g>0EfYb2ܬ0+*ڄ0`>1ͧfb9a~4Es\6W5s04Id&Ieқ̃&d&nr&gLSy3CPfFm3֌3d3L5t33{fYl֛Mfbmfa>3;fc/n5ߙasĜ0?Ys\0s\3Ms?6&k&Id$&IaRT&h2&j&irgfy 6CPfFQfyی13L23L3 iffk5|y,0 C,1efq=6u9uu{ɽSlr'6Muu{M^O7Mut{ ^?7Musɽnnr7~\pnÝ6@41 Ć8A|HI )$RAyaxc8<OAq( 4g*ԁ<Eh14Z@KhtB7=Ux xބ0ނQ0&$ `&̂0ޅy>,|fz}>Cmv6װ5l{^6׭uk{^6׬j{ٽmv7\p\55l{ŽNme⛄&Ibd&ImҘ&`7MFd1L!S4b|dfYiVPƬ5gƽ}俇BPbPJC{x*ރ{y{q-=v`:Nbnaz^cWL?y-@3 0(fb703ܼiFhcƚqf`&Ifbifa13,Yh>4b,5+Jʬ5zl6[Vl7;^9`;s7?9o.K抹jabX&k&Ih&IfR&Im3iM:d0LV0Ln5L~S4GL!S3M)j榅iiZ6lefb(3֌3T3L73;fe昹]37fYbr„0Ƭ3f|j6-ffn|a/~sc9a~4')s4cwf&e☄&Ibd&Ϥ1iM:d0YLVd79LNS6Ẹ1y@UT P=@5\4F^:tS#AzE;C 0<# 0:`B&`J`NX`a%(k!l%le_86 p4' p:gp!\ p#F71LL'@I$ *@idpd )@9 ;@h<E P1@4 <ZhUh]`p#`T `z`A>aX,"lI> ) y]v`o}8 @Vht -@= ?C`XFx+`L`B&`Fw 0+s`^ ~ X`I> , ,ki`{> 3v`o/ eUMo|p$~ p*\ p)W\ p3[/D71MlO$tRBjAY!ܐ #P Cx')( šRPB9("T TPjP"4FBsh-6A =aC`(`8 #`$`4 c`L)0fls]BXKa,Vj)lv~|G$3py \kp ne41 1$ RB*H AH !d,rC>AA( $bPJBxB9(2Tj,Ԇ:P !44A tB?x^0 xa$`4q0&D3a̅% X `3l  ._>o;a8G8<\p .~!ąx@"H I T4A& Y( Š$P PB556ԁPËKZCht. C 7^נ? !0 Û0F[6 0t=xJXa u> 6 ;3+8_÷|(,p.% 7&܂w q $RA:Hx2AV!ySNP6@ E6O=^׫# 0:0! nyx/ |ϑ2a>Cquss,ܽw3‹;a{T{}D{~3_{/CNSq%{p!ܽgrgp^!ܽGqgp>!ܽ?w s.}N wp> o4sp wϹN+wϷp,=ۇČ-$fH<7wnD!1R 09Η;.u{gwu{^׽u{^׽u{^׽u{^׽u{^u{^׽u{^׽u{^׽u{^׽u{^׽u{qիW^zիW^zիW^zիW^zfWϕ^}Wov~u{^׽u_zٹWo#>ԫW^<>o<||k3*|ksHNIM(4}4JsHYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYg;eeeeeߚv:NSOSwJr[c]&~H_~Uծv]jWծv]jWծv]}w1_}k߹_V;юvSN:uȟ_Eyi4:fN?k>o{kO{Ӟ{wvhG;_kfA5羙t5~ܽ ʹhG;юvh'{W?紣hG;юvhG;юvhG;юvhG;юusw_eO?-v;!!9ѝNL'B}_?Nv~hqZ!ٳg׉WVVVVVVVVVVVVVVVVVVVVFG:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩS9S;9iN:'-3mDDDDDz]n䈿O;1͈{:s]Gy[:uԩSN:u_3yȯqMΑ׾7gydN'-_w׽u{Ͻ;{g]fVYYYO^s;8A뺋wJ~wS?~.'aa2UVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVh8yYޛg3^z~Q՞իQ{T^zիW^zիW^zիW^[ߘc^zիW^zիW^fv9*>OԫSu9@|"""zcq;9x.(vq 9"իW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^}Ejz}p _W~?_W^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիWg?G~5w&8!O0q{Π_45W[UVVVVVVV3~yRs=wSuYguYguYguYguYguYguYgFɚTQ1q uYguYguYguYguYguYguYguYguYguYguYguYguYguYgsdiϚ(4g3y8rf;3\I)MMMMMMMMMMͨ<=/fߠ?|NIS)N:uԩSs)*թSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSw";C:uԩCW]7,w*SN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSNMW?:`jԩSN|w~󯫩O׿eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\7O~цRgpWSɩ?aVv~~W* Q7ڬ_ކ;9r})+6xꨱ%L2V*Pq}Y$}%7ŗ>^Fo#ÓG&|;@o,k1N??Z?*ZZh{;?5X~ҵ~{}Y}Vr|Y5|1?5tdps cGFF n&9 ckA;P? Zɋ))l^ a_މCx:9ߐQmNA|ޫ ?}dLj  E w8>[ذWKvHT'j{)~{0zo7ѧ06L_5f{| hyg;ŗ/_$Lƍo}%$ Y  ~t}VF~0>:~& 350M$ie}y"B11+mw gAXvWDD~%ò;ޖKϥj\dAK;d Q 2ȜL@MYdS%@Aйk6l)9 FWӾrY^Ot\qMGiV0|3LĚ̈/` <пac}~3#~ȿ<Lh|Ljaf`I`:M׺@n`f`I?KK7mz94[OU'U]]_'3]#Uy/;+yK%`g F%",&`QK%XƍKj Xt˼U`Y, U̹ |ɋWҬVQEJUz XeU~`Sq>4]6omDآN { Iem$ضX؎܎]o-؞rۛ[`5=4} >dutnҟ^e^feM v`tZ:>x |{W3yhǪOWݢv{}Gϻ I}K8Ӊ`/+@sնĀ.phCX[4ǬG .pW?k3f'kAp- ŊZf 2:u?wJbp]uzx \/T)r2\O}7{;Ơ1w&00#goBp{2;tOu 3]H7f:oK%s~Y <,aS,6p9GH/lx߁ ǻiPx7xgȁwJ_8d!ߘK 87Mq_cMn):.|Mײ|FX} wo~c_&^ ]NDǯD7<;>ۯ?9fVv>?Q26{Q4%]u7G%#?^'i5j!@!`ZB=uz~ǟ3>'Z'P  Y 2Y Dwbpu\C ! ,{WC!px#A}cƾ\of|`V A0'-\ 2nz}# dAqB &H-ZC(nS@Zfz)Ej9>W֣VjA_k`FOBDFȨcIHb*D&F@$9"BdZ#DW3G>ߚw8{\ U!9 bhDBY\3-G{zu'˙bc-K1#NX/3σA,|8Fo-7X+X8XC@bBlxi~_*q7VG?6/cOD? E> z~v\5n/h[c = uI" 3!1g$@b $9A"oH'(=t' C4sҫY˷;~hތ_HJBRFfHUA$M!i66g  d~HΔw\7 ,:bfH>ސ|n|CF^HpwiaɊUk_z)eHIOLd# 0R*R(Kך5]OH^12CȨM@ʷR PHWB*rAHBzgHgX8 JH}>!}Y W.CN 雏\2!Q aE\4r22 s@4dyy W!zdrvw[!"@q3!˖cNV3 kfeѷ}!;gd籷29 BNo$)CΠr6\^M'm= A FG 8 rϖAY'w -!/gu.ٖP@ތ֛ >7ܖ[,h= yQF9 |mO _O k B~_+7C@)ڳů=/ yj?SM?-T<{-OleĥS)`8.!w k^Pn PHP @:>C1C8) QPL CPLˇmqcx'XV ţm9P@j7NC:zR/ox{8ث޲< PlҹuP: ctQrm܏s[~}J.BHA9<̻ct-ʒPeEPY eP6q@z(m(١|זAg\G:rJ*. */#.=Tn@eTCe\/, zbogm9TVJ~TCeTfA:7ꜯ\P* qPy2*OתPPj*6K66.{Q~hQPc 5u+P,W/=@Uc3ٍ=ᄚX GigBM jz5hiRuӎʯcqF5>ڰwP5jjˡyjYPP+N9PjjIQ)?k_۾x#>pCԉ*{sS<@#ԅ.м-uPJQPW@UPU\3`mB -\b^[s!JgD@}fǵ屑P= cf@}BOY۠ C}>Ar`z|֠|dE ,] ПaT Sh/lhX{h  OZ{187@uhĆCct5ƠQ, zXФ4B3} 4BsAh.\)EUa̰fHhMМ9=4Ӥ9E ܲO@s%hHy(4ћ< {hVf 4OCt:4/f:4/zAR?h^.թЬ;zε[м͛м=K^ fECk$CkSh]mЖMg^ .:{Fh"VGAʼn3Юt='hߧ{-w $Mhvk tH4t迡ڟux |IΚf謳NFuwBg$ΞX@ۍй]ݾ+]mB]/8dCt f@+Nq.w~;Z'ޅ~B;ПhH>?=i_ M ]]_^ tvE+7Cj8:B*{ݻgᆴK1+j^, ,Z`  4?@;0 ~, ``4{~ x  A Bt`Z0 QGaItO3`<`J* R|(LPwg[[{g})f}z)`0{i v`_Ԇ ~'&G? *`p 7japE4oA >;04=/S=9J1O `,ܾy1eZ niq)حfHJabCk0u` C0 95_1E^¸xKgXʧa<})gDU&abVYa&6ELMrɝ 07& `&OU a6m0̦oYXB}B&*0KX؞],O- Ok)J`s#"v,u`4{m`q^ {0MxaѺNdm%w-,y,ò/'E,e(Ò~mϟP0b9,Z4.`YÒ~vYn,eK`YˊsaYcDqv|V<~ba%AqVJ`SGQ+Y:6ش;3YM ۱a;lgf6(la aR ;]v &{ݰW {W/Z2~>\`~C_8K{뻺ol}IZ 8098ʁT8(nC>CÏ^pgBf^0 Viwv!{r6C β ћƘ,8,㨷p}qtqJ8NXcv"X Ikoq> )6cz8nupܵ{zñ8^}p<|G]XDAkTxa<8s,ĽNIb D©38II i2=8)b~RFsgt=?kFc8SҲz#-p:EqN'T spՇz^sNAs[wSK$>ӳN3#841桝pڭCw;Y\e,ƜQ,<gw58{΁}͍:lv~5;vyQhS9hE+'9: s+)ù*r;)g 39cH92`>(Mp Q!,1$C.ǐ72'Cb:)z!ŬpQ eaF؝ \<_%.au.1apqMe]Z\O;y7oՓuu|!ֲhߞߣ%;~cp1i=3\%.c q21.nej \e\3e\ri_"䏆K!TW-pԧW^pKw5?\aBqp]%vppnr79psX7ԟ}mУp\nYp۸nᶇAwnaQx pۅp\:smܖ~T!잴>W-{3YP9: C04r@c(ra&/[~crbx#4c5ɏ$l-A5_˷9 _{9|Ck_Ot'9!p Xжz5oQ0a 7ưH 2ax ݂a*Av2aخb +ac!^L khK f oV_A!H ; 5_i"(. AI4N Ǿm)zAi4!ӽU"MY4퍠NLZ5s#AJ<F6݆`3V+kҋ!\=!"$M !36 d/BfGg镝!YiG( B^#GbByPCh?nJtI {P%w tN.=0AP=DdyvaY@ aovne^pM?pp cbOREOinN1g^8l-EVi︋#?e'~yr%կ1"u"fAD)"3y?'^ "bDl AĶPDl{=hㆈ(/A F]'(Ȱو wDdt"c (N 24d<xȣk( Do@T D7u cD@&QE '?/l,Վ;{~BS3*bFA̪HdDLڮD=Ĥvmk-o_/Km_oF^Wvmuι*EU\YQ 1*;r@QQy0*uS=ދ bK7 P?qtJFvz!Fg'|8ESB\P->F\=f#n.x"nyĭ B\{ ⇍4nk1դ֓;|W ~ W_Հÿgtb }cy0FZ[Ř>) aN$NX =|)>`,GX ;0 cMXmMؖ$j!Qk͑8xc\t$C[$ h@ G_g\g6H ӡx9}t0)!q5WDb 9$fFbv2sLG{Eb~>Z q+T)E.Bv;$w2#qxފ"I7$Iב4"1IIHhIHJ$? $Mpn FҲ)HZI٢HmAҞwHڗ)H:$H:>I Hn8HNdcc0xƙ8V؂qF;r1n`\ S8wĸ@=:R7ƥlƸ=Ovw7˸aa p1cBFLDŽ+~w[O乄{h0q.Lז胉3ǷŹab3Lc5 '^#7O~߱wRx,&ģ1!&֤b ~>$k4Zиv I{Z }-e3htk0)sק'5aR $3i Y2i ! ##"ytD`$O2Gr<7"y(^ZgBH^tɻ{!D|>PCvH>^O\ H>%ӖH>+\G{C|}9oAmS$}GUH~2OLɯؑ oYu0ӳG'l{r?#%& 9arP4a+&^d,Rҙ7 1&Y`9/&;.dHLv<=i>K}c #`||&` L.2S4bNkL٣)%}(1e_;0”^R)1F?L-) rS/mHBJ_p4R! RSTo##R—"eR %I ) %)t^K F:gCJq3R6CʖHjIH٣ݵ~)w@}nH9)G"X:RR~ )v*JRs ) R.6!<(#8XH舔OZ ~W{KOgNk=6~TJ!URnjYHTHGMFU!uDXUÑ_ّ[-'v.n_*`X+REjOm1Z *TmqBL T?Sgaј}:.9;1cpzbMѣ;`I.昍s~̱`qaΐ939sP.%sƜ53cI|ԩ17yd1w1F803t0{P< 3y1o[(]yŘWUy0$̫jv;?g Ó1=?;-/{x \ü10߷9߲?b4aG<pb5,*,rt|Y/7no} 46cY/,H^eX`unZg)سi\葊s}B߽XȅA.X c̰0y'NLq Saᴉpz™tƬ~߼+}駱{aan,ܨm="RELXʏEƓȖ ٭"t,:*Kj]9wy]EXt=EObQK/,z>aQ+b"_xPsS(j3G!}&5Ր%OQt}hFn"t~H7SA,-Funcv&Hw;3#}V|IJ|,g_\3/˭˽y)`ЙSXނQ\4WX Xq;+,Ê V4`]X +zbSkxf3?VZ`c"V:=!˰=+}2w5VJayX9+beW:,+#(cr+'ЙԱ24X9˃+ bm^:V6cF|QV6Oa/SN=y0V9U"D-Jw:sXҀUX5:c=*ކṴj)ڞU;.c$ջOm2V㴯%Vjn̿h".E 2#C*UP[ o"## c,ǭ@@dLHd,\EdcGL2U!sdh#2 G"ۓuZȌCMȜȬGcȼ-|Ҍg1|3OSJ| $zB.j곣 V_xյc1nRVO̒݌,lF0BSdYl@muez# Yы)1Y +"kpd%!k\<BV1rwYkQoFZaZY뽐Uȍ .ȢYDʹVGkPdxlhdLD}d)";6#Ӑ=MӅ=2gF8Lɟj:dEv7Z"{d};$"E~b*OS=TFv3bdg~Ӈ}"Q;3d_x'Ⱦ8#w^KȮoEȾ.t7"3ooG!r8}.= 92ȑ-kC(!GY9*s3!r|gqhP|@ΰbxJvyt"'"91aޱً\}FN<+$G-mq̕ת"h(r6ҹ"rx"g+M9;o"gqA]읂nk_;so>Q4OCN E99bs>9K/s Q&:sPDK|䆔!7< #FEnE)s 7Fs~>r"w%M9tf^.ruevAYrӻ{q /Cjr_B}d홯KiM(}X $r?"3r[Uyґk>/ ^0s5&ft0I AȏE~4?c& n@O(@X'G~ fpV9_؂m'_ȯN@?sAǡ`(+ ]_;[;8pF$0#vpxDQ)ӢQ8? Qxt7Ӭs~Π]i?rEJ([Pb wp AFAai( Ggm_yƛ]uWJ>g{q/kPj(+S ?wQ[Bkyp6*cx6H`Cmlx P2ESBk,Qd"'(IsP4 EӟhVoMW(ZGEYQtEvPtEGQt-D(SgPtEg2ծ^աF=rVE԰q {C`3x)'Dq=Eqe$#=pB Ru{-o(nD{el"ϰw6&~clM'Ih*6 xMܷIFc]kSc#lٍMty3lűIu6cz]G잁ͣ+936ψ<6}h'Զa駶h9 [<:w3FL݋۰u[l-'d)N`k/td[(ckS5a[/~lc}3}[H`ǎ)eJ~ةIe6cQyG;|Dq;RҎ7~W!vǮ صi'k9僱 vUǮsfv]+ZuuvQβg܍$)=J#i=o=۱G{Ncb=\l4{`O칾{S}f3aO,=L3{B"<^+V%k&w\coL޼ػF{NkZ {?h˛X(vb0%}Q2%s)dJ j}|C J2PZ%(YSm(٩J%:}ÿ}]l(Z}d <>Tŋ}lا+Bcx3}vm Y}]o[|V¾طޖ5Vb_1)m~}n߳ұ/M[ܭ}{Ncߡw-8Kp6@.8BLWTG'w> ~eʻ~tc_{{ɼm8ݢcOrL܃6y8_ \ pJlP*Qڽ'3m_ϊصGs_W{nV}?/;$qKox/\Rc(Ռ@FꆣTo>JNsQG ,BfXt3J?`4J%>J RU(=3(= k'j^C[6Y&P/iz q^*p882^GRpd@| GlW_pt8Nop4L[=nmWݟqt)=<GZ辴z6|F^Go8&Xc;qL&b31PTc&8XcÎXP%K={t/~a'~߁yu5û>GgG;{&;=={۝Uk Gc8{'zF. zS4Le§:w2Q=(2Ii(vF=䞡L~l:ʔ)vL9 e*[P6Њ&CtD)JP2=/M_mPeFn(3@tˠ̢eV(2[N;(+@Y=}6zͯQ>(gGy/ Ƚ}sb~x.$~OPFyK{qu0* #`A@ThԠbP8GThR?֨0F}TTfJ\Pqw T<B%o$%TލJ~TF TJT*@R*U:UWPUU.I G[s {<\T;\Sf8U|éFajǩʽSQ2# Eu'jBT+Ө6Zͨ~j}H|' j;fT;y>ݎڳQpcw:3p:to31283gFLRI383LÙIqfLT^3l8S3kvg=>-6Mv85swq0q9>sƹ>gZ?[H=Z8¹tw[[Vԑ[5s.3s~uS|)]skp^e/Ϋ/q~U5jd\PC(FqjRQlQsC j 2jlC5+QUz>E_jB:j_ 2_o\z]$ E]mAݶ鏺]mDqu%&:ܠ3n6 *[E=) ^Q/0#'(ӾE}0-mPNk .T#kY3'z!čcp=n|Mfd{&ǒoO:%5v1LJhiӷVn][p"n5y p-yp-w&Q4u{0VYmk{-> FR4TA` g` O`w @'$)n{9|r[al0 q0f0 3^a3RpR 5YE4^n}tGçO>/Wp_⾁^Vpz5 }oOsGw*!ŸCWřߛWf,ٸ͎yF{pvv_ ǃ xq*'QCx{Lp"<g{XAcgP4#x!VEzk:' 0`Y/ Exc}e^^U3xuO|[|W]\_kTz^/.jq7}^7xcj7oRB&7FV7i=fě9fYUoTOۢx[,)zUn[9x oVV[)Vhm%ޞ,y&m-'^8u4酷 {aZ{\]Tw+eШh'X U+xO,;&x/FghRkF=o4fFb4> P\Ekw4kMAcS߷-MGofǪ?ݙhox'ϣ'xMØMasѴI MtlS~k*wDSl4UCSU~{z . (]4 B;4 Ux}fh?=y‡Up F/#c]2}]Ӯ㎏1 ɬI|Vg4|H >8p'-< A9-\\Ɓ|Jϸ35y&>Ϣ9ҸjB=Gt䪬(\ZB›b?;|>M8=|hVi&*fZr hքF&uSNvE딃hM}ݱK@?]o}Zu#A7zkZ2`8F;MgF%x O"#yG6̜簬h?Gjs~u^=OWs>j}ΟsoVs0fܿՓߜh{$Y]nYR/ӳY}~̝yO?FG`@+CMnjZ=gʀN!<x%of#f!X qY[IEZ 6.$8hA񄠔<{.L8o"+G(L8Zu.FM=OܷC>o F$k‘lӱCӗg}Fgٻ[WǎpyNtI&nP#J8]U׫g(̭!zSlU Fy&<7pJ8/R%\<Åw,p}KD%%#Ld L¥4p).|¥Dt.=5x7c&\ќp<"\^W$?pmAGn|:­\CUwX.) TDJ?EUÈ` "%FהZ">$ f"eܶ6'uD "x"c`|HG)W:"t6!"M'Bs=Њ5D(3elf-D(Ǐ͒ٽ*f'¬qDJ"n۱"\Dۍ|DāIӔI%KI_)elWq<;P^dM"2ӑ֑K&"s*.N/(@w]!{>7x`Q<8(^ \DvQD{D;o-^ 1%OVO㰝D)Qt J1~:QJ%JcӉRRQ?R+~1G~O+!J3s%DQև(P!Jw{tOFNjғyD+I>}}IY27QE9P$ʼk2 M,4(>>DYQVHU Q(Ze#kז!DQJw<(GZt`ΟTK"ʉ &&SVDyjQIg) Dy&>(!'DRQ?Lo:b8NT$*G$N P4 DvZ^+'mjQNx/í̶Y1GEU~N^Y%;;wtosL?&j5D-E"7nN4: Q7' DAV$+j"LjFDC$hL@4Q.Mh$[>Qs\ ^.Zl[2pE o{si 0 d5=_yoݎ}Dc]d|F[έ֣"y׉ƚD#(@4ҽ霯s&!_L. cf"É&l)џhJ 2nDSh/!K%~_Ӱ i4"D6cHhNZB4xhf Ds-3Ո^Wh!f,6څf)ݘKJ&-DNۧk'At]/FttG &1).]]'$'nR o3..~ݰ_Qw=!Gt3on6勝D ՟vsxҵ'.>'z+ns*E!CrE˵&zT)X.@-x@e)EQBVR"zYˉ^6&znD1)r\ۉ>_8pZCuvDQbpt"Tf2xA6\_J_#)P!_-!_oDacĐ="|(>CAo5PkCZC!b(RC Ŕ UbiE Xb3CIgp\bBM?N ӚTb8~C{~4bHBpab4"EQOMo4v<Վrʕ(Jמ/QbT܇FCӉB1!F:rOb1{@^%ƚsNb+LXb\nE8Ut7ΰ#w o/;ܾ_'W$1q "&RDj31=MLcWbbBLl͉31q$&2myabFL"ǷϣVb21s$Vm]x)ꉩ1 o17"LPs-?M̳GZ h%{ļo3Op 4V[@b!XJ,z]&wN0J,,9I,l ;/bN,N “%EFb!O,~ޏz6>{{{rw߼~7&cfN)&k)h_-'A, 'G#>'KX&{%ӎ 3X'Zry3\)D,WR"{e b;X˂VbXnbY+O,/!E彙I1|E,+^&b%Aw+1jkb忈X {=&X #VҎb(M2{*LJX!Vkaj|bo$?7so;O7z陯޺K2J1XxNg #nyjk%z !/'S91Vu*^}Xg] #nNiaGo ͈֯ʕoUG^2zEu|'~4?S9gCNY3;:=G]ىW+$@5S':$ x "H@ID#M xwȱ@ FJQԓaɰ#'` Q'> 3K_Λq Y΢>=v *'5ex ܹ dVf3iOO8c`퍢cB tp=I{O=]W˾zrwG>1LjV ٯ@h\$S dȱu A.rbȹ g|AN6fx{;3o Ω$ 4r{{APU r]_OտCu&9w0\0I5Ib3-LJ`R0J!`^&1`HdLZfx>)FH0o0KRJ:C, f'0;\{0 `a%(6/ s<#isI<^ V7fp͘:9]͘{̻)F%890_`OX| \SzYX `1I q`I{U, `I џ7ůQ8,-b`Xg , R }ʜ%`ie+1` ֑X#Mr4$ݧ#"`>2>A`OSt\̈_P8V}a`?j&W&8xwc1`H81qy_e.dGFp|(ǻx|@qW=qB\G .DpYUS>;.pyoZ[ܭ*{ W IwSp >pO2p'1pâ.wt}{N2 ApXʁGsx4gq(Gq4xd~ɑym/𘛃'uxR^gJ4x&{g:LXq -O>x"s4?-C1. {hީ{ z'@I-};=zW{ ܻWņo^>bT/~Y{{1ο߹`: [E[p|3/0<]rװ|.]+Wt_~󰀟CLg~ݣ9[U/ꝿs/P??z hd_rm/%ұ>ёr _3g:wh~ 7 Xz^0BChnMK<C( C(o26Pn'6PQ"[:B!t(B( tйc]BBdz(!tl$ޘ a7;2m l aû6PJ!C!am>wk8\f3{-߽ҟ-EA/@_FU"k!~"!"o!s"˅eEի/b"[O > &1Aao{ q'CL8>AL7d.BLbRWv>s~ 1 _1 ӥk 7miGMb! 6% bnAut:}+Ccb5 6Jbvmy$B bDU; tC q_V@|8A7D!~8įC{_} o$5mE5/ f_%x&<`F774CA=A_H,)9y ;AbeHpBT([gCR/lTIMt}ILH:5B0$Iґφd($3 Θ sArHN^ ɜ'҇$~FH1(҃&A3BjNA*i%_C*: =C{Az6H ; BjAz+=tn*8 R{7H>i~p2zjvt˘as' ILcȌyII hy>˸-d Bfn ;Ȭ+L+ȬaL=dvBfgdvQBf{> ۇ)A˷\ȃғPz (5[u_q4K<կBYMFeP6e3)Sa`],T{qA ԭ\鄁hmwl ؽR mϾ-bjfGoh;h蔷LЈ0ahDσЈ)yihY :ƖTcQX K1ФWL0; (MduU_h̓2h_P/4G]l'-b&43Cӵ.t~K! Mд9\wkSHA342Kgd ZϹo ONA4jBch޹ RG%>Z{Z{5$Zve Z#z ZǙ3{Mzҳ7͗ ZJК7'" iWq::h=X:j]th| f:&h^? Ruh~'hv.h^ 5s}оk:qhZ+)A h?\+> 3u t?إ xWjBgtFN0D͂Nm7Q@K:!c[gt'yڝw3B9̳N^>tʡi UYgS E9fWsM:_G \NM=tW?l@ гDB3zvn0QX^TA~M/գK׿߭'kW3WCoi_{YW@|S@/ki^3>@}O<'GB+~ЧwhʈaZA~p #A?"~ЏтП_L~[=(䠟U_sl4$C?}׽LL Xo0X  o@3 5p %P, "`ؗ^0t C+u0۵+0 GL>`ظoaXN`Txx3ʷ06t"LtQ 770m5qÌ}XW̘*)`%aj8L_L3_{[&?{x(k |~3VLe=$f)R0K sGU;p,h#F|hŭӰxQ g3aܒK P%;,{Y!,K4XjMGnX2o15`Y[#`y#Wa",qi/, e1X~m팚m'XaŜ +;5}2V\(`qV"ҰY"6JVN*R y+kgٽϵW|.{3Ϧw`}>KG: a=ShtB `m'k XkUZ֊Vky:Gv1eBa- k#5xa-kΥ5CX5S:Z>ѽ| }z ְOhXRDk*p`ouªNVWJauV`u7`u:VJZ J9XauLVG {[X `#Vnx6`?`K`V`6VSOj2&owzr7l;ɞu׾/z9}[?}v.߽WMOߩ߽gKe}u/]hN De.ְ=3';Z9X~(`g;T[ޘ %\ۖ%~z`'~"3}Ew~|g? sؗqC}ï)8dLɭ/k?wg`_=tF#ؿtr )?s``zfu<{}Ywa6מ3RpL0=1h]EQ8zQ8\.Zohkh=]hFi8ëpx6O8R~8FWc[8*ox7.p2N%ptGd8Zehp+1pO|8>ovqq)W)͆i.8VM8}IUps㥕43⽕mqp|'R f86iNh>({N:rpQp F{N3 N;r4tt :I[yvU4-ӮpZz" N)N)-pr Ni_{ ?^(zO/,nk9.Ùm 8 A\:Y[w<0 ΦO\b =\p|up Rp Qy׾3~7-߅8 ;qy*n{6x(FíC~\!<nNp?'k 73[ב##7]n26#E. w 5&cgx+]ޙEزc)x*Qh OBxgl !x.ܕS#Ӭ9e!<ϓ!Q&ëO m7^LSM<_ރm : o"Q}h_;l~ϿkAgޫ=bRxl xOiC ޓU~ˆ:>gf ޓᒄ|8">;给2MLYl|fR}bF^ rYo No *?V}Xň |O ['9~b&43aP-Ȉ  <[w%΁ߣDBJFm?7 #=KQ _SKo*V˭٠~[-ߛmu'= 7S7F(?-#snfGPkÿ`\꤮RAtYwW{6fioꙧij/Bp !@W+O#z>E~|7!M *CȰE9 /BBmO $d"d'Bˊ]-ɕDȲyYZt+, ;"d33B69*Cyٹ!'srfBS ܢ{! D!3'B9aPm +PAUSfs#42B/GV=\,q~B{&:a\Kqaa w 00"y=B'w3A٭EA9_#)! aͧ) "\~-¥7#\L j;qQpwo@Kg"v"f \gǖww5nu5xu1Cjz씮{ǎw ϧg唧O!|37‹!p #/]?0%"?Ճ^u ~,¯k ~v [E͌tN3[S %o#azD,/|4ŸGopY}_KR{"W("Ո>A" "{a01h "44!槾\;"k׸މ1"P}Zldhd:ߵ}hf%x "=GB-h@Ĭ|D,{ֹ6gUZW3sHDǙ툨2GSGD:3R:QUI*̻ﯛ?ߓ"~|D4BD/A4eDsBDK Z? zDDmt[Zhgnў{эn~g٣( !zv*qo5Y1zwkŨ!F,1}#:#8їG3h!/Esbl#f#:ow#8bJ7 1g' tbNHc)1 Eܜ12?F&ckNHOU7jTQ`TbZQ1&ڛ>:ι`ԙ :}0C;p#I dF}Q?aԋCU^ֹjvZGd\Xu6Ī#vB#bzֈ,BEـXgG[՗FR/zۙϜ>W^J__ց̹swr˳2V/+uTl`םmPg-$ ۜsGwC۟a{Nl;|%a{n(gL؞>c{hG?ϟÜ9"Ŝ;ůLzls%/s1[{=agчgq.wl.9[Ï][k53Qf: lwL*Zv=خioڻo_ܻo7+s(6{?l3Ma`{i`[T`{qls`[ 7)&¶`8l[¶ lca{2(l+b-ml݁ݯ`{`{s/lo۷./y/l]>m0ejv`7t0L_؍mN؉<`NvqU 6],MawvUK`w*4^F=]3aפ FzCaߏs/#`ϝIᰟ 1=k[[~݅[e򨝰kt|KT`_(<S`-{40AD yp -pp0pXdp_]O8j&`LWaa5v\kgr5̺͟ui+v(bǣ6xWuP}_q)8##bǗZ8l^#p)#w5Ljzq:/ (-Gɷ#(G28 5n j GptptoAej1ӂxNB$8NSNBpN_C=;8>x(3pd NZ$NsI&NI ND^8=scQT©1Nt;b L8oeY0 μYp^g ={ozd^9Py-UgpW>ܺ s`ncd#DVƀ5`gpnW/pn{5]f>0D!"E`>C#`CK Mic^C^Lпy+ǀaS^0,o>2kwg ??0|س]!`xc; I0i `ۂa - {.Ng_=Wwǯoǯ(XF.^ͥ?#rL/w zƳ3`.K~m&g~sp9.IR4.p9Owpyu.-yR@.Ts._ke \Zנp Coz ~pC5pL[9\],҇Zר0F̯Jõ \a>h 61WnpBlۀV160k&<$&>3_E>z}7f5i[`[@ž[Np{n(nN,^?ۋPO֙s警*[Q Bx{4« jum q*ë׭2^4ރ~Ǫ{6 ǎ{?Şm'{`q܀=fsu޿sχ=sr!`ּ$I=\Z{&`[iVŞ)aϽ]G~]2=NރtM zw [h'\]{c]5TnxM 6xs)Yu{Wg} | (%|G>E3e+|^g4{k|o÷E{w `I+{w簷mb1ڃ}oZ;>>5>C7>-;QطV ,Ua=Ïq? =`?W5w8pw"\9q.\ŁT[8| -y3Dpp.73mtA 8xڧЛ<%?r5G:cEr/( ;A=K coM'kZ_"u+~Gqg| "PrGk0p$B@qGp"\L9 BDjW@t `ɾwz `C=;_p7Dx6m8c,8jtNzDD~YγՁ]{{Wf?ow=vwg~vVwsOp }~̊8<?O)8ܚipj<]WnE$ZDs PA [8_#/!D טfI9̾)Á@NFL=J P /h0!кV~4 #p)D#F qA``2y#0/DGL@`"0ӅLqE`2=RXrUx{=oGSI 2DЀb!z۽/調gy V7led /!EޡA1_W3!AGt A0ChEp=F"!3PLBp* CpT;!(@K9@Sklm OAhȁC=,ݗн#z tG:B莛uP;y2j g)#tB-讕]Pt3B"4j1=BwBYC^:"/Ҿ)BZz 6'! y‹ǡmvC#z&zE>Іh˯b^a#lH#l+*"lDaJ6>a6J a\huabtv"0E?„{E!lj@^+:!La[~gsk!b7V!lDq.Y_/ԳǠ"l0_1D "lvGVy׷}~C>+q`Яl1D?k+4[F3Ta%v޹DXA:O !fsx~}~-lDصrvz W)gy |kFd}IE?f&5x>~^FQ#|.A8¹7"k9#|%9.b>5Y_ޟe!|"g}dV\WD" rUB~/prk"|>7A*E -G3E?/ţu3Qގöb­3cjϾ˪nEG"]}5aD^Dd4"#~D Eɍ_laE&~Įص]f>nAwX RkgX[1nۅX4:nXu1Aη{x+z!v_Bgg>b=^y(,'#6 qS#n-Z#n +Cv/m@VGmFaͩ*Am@xk_G\ĥ#".|5B!.qc#! S"~QR:Q~H7_utz2ko#f⫷ R<Ӽx{c}΅ci8r,qL86| X{H|}T7v<]-| ݳHl BHz$=[*Ha`H:$j zUdgc?Ęw8'F?Ɖ8Q'ऻN $"y$$o-lH2ErB$Ar/!,$GH̐\U| \_f$?_sK" }.@JR.wbL~;O+qJSB~8ـS8u ũGpT5NTIYg^̲*Yz gcpfy3O)r goęN@Tsrz#u|2RG#upC`~ٞZy/˅eHU5E RD:t>RWT h=Rh^K;38R=vf^E3^~;>NCZ^w)3HuyB: @jR.lU55(d.o }Hyc޵;8{"I2{E;҇l@z/OHA:[y&nw~HO GSgBzj=O #={~ҫ!M_"%ҟF`?Dz.қ#ٿ3Fo@RI W<2#c42ƛ!cl&2# ܾ{B 3%d##&n"Cyn72 ^d^`Afd q'~X#G9*g(roFWYn9r(w3kG=A瓊9Iɠ8ӟsczrιv"s9Zsnrny 'rꃑs}N/F!9/elruq?brC*##l?O¥Ogq+ߛٮ%DE%sޡdv=JP2}S^y%7J%kdPCIF롄Sz %g$Z"JrPR%/P6o T>Ly:th|(82RB&m8h5ȢD ʅ֣\,ʧq|`BJEʮl\\7^VW2yGWW B6TA *raT򦢒g.U)T>tD&l|)*D*KΠ<W*Y\- ()P*MO1U6:uQ?)y9Z߲=m <;> @nxyEY7ɸ* wL(Wؤ!7Op!7Bp#`%n|>mp7Mqe#n-oSJ[pkn֧=AqV*WY<vgܦoW. wܾq؜Yx߳r{sgnݳsq8ޛKN*)2we {㞵8H~c;qpǽCָW<p0 Eܷ}(9=q?oq'p0?A_>SV߶[t5=B# 4UC$64qRx5_ q-Bc!ИZƔ*4_(Ơ1dD#n@w#NAp<(yA<{xǃzߛxfAhMudM)h[͑hBӅh:MYh:Άh:bPo4AS%4E_ϗ_EGZbMAIG0w>^ŋ-x㌗Ax9/]iËk^T\+o񢜁wE,^\xQ/x,><W73=]~{ֹ^nX.^fnCZ ZfF ?'ZG#^~>Ԇ~cf7w3O=[׍Tbx-z[]8I-sвM-[.ź -i~w>-ӛ"Yrжs-B -ahIgg%-' jYYxc*8):x!תyx.ڹ NRkgJxm[כ:^u ^G;`=5uu>eM=zog)P[ x+O}/ %E[d|Ԍov |x\uC$'_Gv#Z_UwT}刏kt>c0OG=』Ƕc|?1w)>V}W wv >Zh㟣upޏc }RIv={\^6rZDT[w@Z Zg &hPBn)Z:j{;ѺbZMC|F#ąUbL[?V?7|j'R|OJBQ6hs~վh3ٌh[:mKЦmYѦi6]J|Ç<>q3.%Pgt|ޭ^jw_j,uP|]2_ _j7_u9u[|]RWͼ=fQ3_Fz G6|mfGhW\vhpB!h[v}g?.!DŽR#ڵЮEо :hC%CR7B.3+&ڳg=k&3ў* 'x)+Nk.$'0LX 0AR3Rn$$$NPVDW\BFF2x7!nү.!%YC+۾)لpg!d#! #OvB4 Q# B7%$"!!rw ! Y{RҽМGNH{7Y# H10b50|7d?|,2pA2P)B O#iA˥ȠE w B!C*Ɠ!edd(2ݗ b :. %5={#n0cedh\24( =LZz#zqZdABѳy }vG;t$,# e2 aNXL˴Մe?P^KXeTaQ0yFʺ?{ַ\w&",˭ t² ̸ KJBXS Gb[EXmAeC@ᄉ޿G͇ Kh’<7$,Iʄ%Q$Xs’C-k=a9;sX;EUx",-RK35S˵x"{݇ C xak7akȰ0}dK2̶ ۤGyRC q q "[w<ȈcȈ5 ɈUd'aLr2B1w;1ǕGX] a;zPYBX9 =j%FaU+}aqϻZvwwoNG ld=^~^~>~Wïwzs_~pQj ɨAddx2h7gDFjd{dd2+HFn%#7QdTّ%h 2z]2zRf񀰭ZI_PL"lf͸-{J6mQayCش-u6G64&񎰉`!l36kAظn6̈́mKVJخSH+;Rd,k9;,= Fِ{|/26k<{z1H&GNZOVIdl6sO?n7B/No&qq7qld\%2.)L2.d QFƉqdܤdC3ɓ$Fd%8)Ȅ)/&2L0H&$d*E&N'u̺aw|XGuAw7{6a?"컕`9K_ ao>H&R cd4G}CVgᘳpȨلCLpm$cj!p_ K~1KIJCG)xA8O&O G!xПpܞA8zkQ}p\˧M88 ՁҎp8:=+IZ.+Ȥɤ{ȤdR7TL!*ȤsȤ/kȤϮd+2] d'CT g A8CwΐM3p&;.YpA82jOSjx,l!Bp{IXU Ek55Apz. K&pIe k}'\[!i \kpyV L> ܡ-Kل2mFֱ&o#· ᳐&|[$ fSgE 6(K> wz;AgM'|ovש'{y= |m={x~kXIJ'%#S0?} 6!Bc /0OR?X=?/w$ )y/~;z5с_3z_B+ 7:%ُLId!S5)g^)2i2%=LI{3+$SrSɔV2%C>sTLLciɴdfA?D`\*ZE ;r^|"pK=DT$UnGfֻoNo$3M0DpH"3",D<"7ݽ.@3ՉV"HS.d"x܏֨*'"XKm`"";i;g"Ȝ-&B:(D6?Rw^BVg!"j,ZH6)-3J#B~*c'B%FD$"t].[D(eݙP'J?GfP'BiӉCfϟ; е *^@^)Dl$BADzVAUչW@a^"?Go'L~١џԿP}.D81 "1޳0!epqaZr+C+$"_GD'SQDjCͽ{Sfo3%Dt"#K*kFDDɅ:dCk^"w1D9"9܇'DK1< D2-%9L;/׵g՛1b1Hf $3{1A ;AdBK2c|2PKf䒙{^G̝GLwZkGn21Y'b AC"v``>P!bєGj"w4"bI,T2Kxk~Dr:"V>"N'~&l(|:?BqD\18q+c "󁈯EWqUuS1ZvDw ?`C9x0 "4WM& sH>A$?'R7ou"u:;*=H!n41.DF+D~"֏HG[.d[2{+=o-!w^ 82HA?Qd-?̐5DfI"3`!;H?"#Md>:,hKDfM'2NDv>" sMd?#rABD :E98"'K䦾"r~Dn"KcG7IܢF"0ȩ?$rs9 ",Ev{%r1IM"pȅy'D~+KY6w-WJ9GyD~׌"j6[&KvyDހQ#"FT^"ƁȟEO )`*N\Q' rVDaN=>Q:C?' ^re_ Q# a>D!t$Q!D!D!(s' AD?Q8u(m(<$ ͉£pФG/' ,D+QJť(؈QL"FD*Q(3%~'QDbFϹݚJ DkۮsV|d,}g}ϲ?]N_»3;OW}(I"JDIB(-'J .Q?~QZ\Bӈ軲O6͘ J&D8(3 JsDiԟ\y?UYډ̽Es#s_%J˙tl1(%˖DY7Ǚg.2=W̻zb weWKF#jCyxzqgu }Kӯ+/<_OD}{>:j~u Qe!ǕD#'QRH4]#/јrh&&ÈF!aSE4ωaq hjXhd"D,hT"wCWv/$I4MDsR;ќG4gM)chj$KI!8h$M7DsgwhxD3eLCv-w)hn%Z+EDKRYԍ?zOޖDf"Ѻ3hZLn7U+M}$ZWۉ֕ uw\~^:;_@ugdZ2?掰# 2"BOݳ?LZY=狲-_nOW'lrg2%uʹgD~A6Kwvhf v~>HK-[s{|$:NKDGf!:U:fd!WY֑,\,\},\N&6xҚLt(lDw 5l#DIJwߋzPbEtOJ=sDOe[0p=m\ыCNaSD_M}Z}D_͹Bߏ!ok#bKS&ç~@-1Xv,@ T눁EZ)&P#db$Cvg[&YɲAQd@ l@YwYjVI"Kn%{ɲ]2ydr|NiG}N'./$&SDbzƋb1ݷ&nvt bjn@LW ؈iW2?͘-H 3)q@s&E+ 1{?1[A0(j 8bНdѥl7=`+; }Vxx C:zʇn1>C3&`hi VP<Z녡u4}^C3keXZ>cx$XEa&Xoւ+F<;Na۹_௒#c3FHf=?#˳0N_e._ vTDveC8]su"(hf%x*9p(ö ~8pA918bx)bҌ4LZIWNKN x]pҤ wa|E V[\Gk5p \]>"Re\C\2(Uາ\u]^qp#ݴxEZoaȚg(ǁG<[c4<Aٔm^m/xRsAH5BCB!eN B2zzŠV4V:*k&CXG X !l.zOo0pd] | \oA 6@n?OjtmL;1}Lt=L7t~g0aL;LNV#3H AMzi!D&5A"ov7VZ _Vv"vBԛt+Df@DiDTd!W K,YMAg{Qmͭx-! 1qn@ė> >'̓6Df@!HqB$DM=NS!r"i 5 "Q|O]zϋ_!r6D.HiD@-ܦw "wC^BZD= "O4!, ʚG : j I媆(3 [!ڸ a/D[ y)CgRb⛘a혩뀙ie֡ҽ3.00f\Či3ڏwy3 bBL7bz31f- .m ;8#;zbm̪/iȇUWZ=>VOY/ ɀgqZ9 ]{C,`_C/C2 k\5!!ll85D $2!Ul H䞆DZH\58f?Wuxg͐(D9W~no;!$ڭ! HHӄ0-$3yHM}?5HA2  d($Sdx2$# Fq69C2o*$A2 @d/gUɫ#!Y׶Cz $kk!Y? [7 K!P N@(+5Rls 5 &\gm܃c&As!#)ޣ){"ԹLHA*R!U%k)!& RoZl[Aڍl<_mW.v.kZ吺(ҳ=?ǟ~k~{_T?G =j G4$@z< !=1 ͤx钐i1yHVHKBZed!=ge!-^v_C8 Y!]K.|H?PCH?f6~ O6~ HhR'Fs'bΕ̹+ ;%ٱŐeGz%AV&s2 +Yi. d.캁4| Y[wsCqdFAv?d4 {L =C &>ѴY妸BNr_!':r3&S6Usz1fBnֿFKg 6W@n䶝vaX97ܵD]kGȕ}ܿJ*7ȯօZi[CF!e4*haȻB]fw?9\oy9w*_i~j3@>ak ~ Q?b8c!'X!<p@>U묥_|GHȗC2Uk _k  ȿ҆8;$N@A x^OPX| FPXz ׌ݠpnj(B-nAS(W@^8CYPxt O@_u6ZBqz"RKB;uP CЗP ňP{+&PLb?C#ݘۡزS$%) (ͩXt{Xս_,Ou(/=e&P^.'ansYeP冽P~)BE( * ""PQ́ʼPѣ9C3P1&Tʪ3kBe}T6lEWmc4TlCe+\xCŷ*anb^:` yga\[jyƬgB(a9ü K¼6voƼ̉b^~* /:Wjyew̯͠zFS׻fu7)7a-+{( 59IYCmgٰBm3'ԶDBq-\&C-j1C GvμZ}Z3Ԝ~-2{9XҷL_$=w绢~{ xsfͥ/^A:3C(C}O uI[@, 뚡>ꖙP_) uߛP/Kz:<]ˀzc63;?Ϝ~{S-524܊F@~h4ƃqxZg)p^Bh C- 9H#١) 0z~'>?ͭtWhEBs#h5p 4CáuGRs L҄L/̙ܝм4ۡY>{Y)ͪм6oghpֺY]xVޡwf(߽_JǾ}&#?s34_O[-hm9bͯ FA&{Țw-Eehaoh(AkhAk hI RAK4YVZAkhZ #h́jhyHvnhyCg.|CKh}u@Z6BuZuЪތvh5ޅ۱zGw|??~?Pc(@H.!s^eE.Юv6h_ |=B6u} ڷCnh['44/PvK_Bg M:uú:#l32?LrReԿ3n7tCg(pBg pCtCotpAg`\(; @ R _S-SP" %oc-,.ٛP& \BXXt ΦY>,TytV 5bf4jQTb,ԙ °R ho۝̝8~ݽs;}v꿹RCs-'+)>`r a 0䀁H# ,VJ6R0߻[BaئMڿ)xTjʬn0*S;Nf=П0A. u; .A4WP>< jeaPG E npcXC]Hr=..d2? M#hWVCچy3pFDFc^h &hi#I_͖da$g#@)$HIFco΍0ʢz#r( ǒX2p= u_%X>,cU,Y-A%a|,ُ%d7ع`=8ÒK$;ܧb֒YXrK>ŒMXyGqOgX*̎wژ[&&H ,x-(ʱT%?RaX:w}FͿ՚k_?KM_ 2F`/ej dFPcٜ,eeX T2#Sn65܇HߥSޞ||:uyYټhҡ)V~`2p#LdL,P70 /`2b$L]ԃ]a-SM6t_5L`8Lww~FiP0=rG]a3aza `ZrT+υi{^0}lӧ=`ڴsԹoi;0} M03ْ?`lm3g3\`f 30<f:Q0[fz)`¯Yw3?ɛ K?fչ[vg~9=~7?K3Yd&Gǝ3gc2wS6&v] Es2̒cavf`&0Zl/ +=ɮ݀ j8"+LbIl P\c#uRq̆#00 [`on89>|G$3C;ac}x 03 w:#=gZ{3W]>&={%=Q={׏w>SX)t +cMaz "&yԄsb.K};<=U<={1 ƳP mOX 3PEXJ6o$X,Kũ XށE,2"[ SWqX3rDՒ={Pg `XNska8)oֳ^E[3@ kFvG^m56bTyj5ϦcsyAX;k%8V.J/ZXL{X6fR`rmZuE֮Sx<bf^WXΏ2X'ކunE=ic|e3z̺DcݲuXg\My)3(l:֙cJ%ºǰn'Y*bX3nkY/33ñ ֹS<:Bƺ(;BKu.nr:_6F@lEqDiElƦY)I 6I `#dPMbJl&3OY,_n6XӁU X t bb+W&`eVPw3a V`l.X;\v: ʼٻ XaU #a=l:E G5G/::g;xiLa]WYm8 `56F{6%ض0 wc 763ضj-/ Eض۬&:v;-S4a[0=#2-NMĶױ} Ov~lŽSCj Ž!1;&<v鮽Jǎ5ء3;f~vG Gptmp-CypLcu8])np<sxUxc2N4N4Ȼs΂IN J8c8ɨIu4m灉pr ,:ԑGp̈́Z8+Rv^Kyu8/ 8qyL@ꤳci p7e(虍3z.8x^v0?.>z`c`k#>0!`x2F_ Ru0LL0wc7X >dynoQp `qK/\)}2>r(?F"0*5*I F40jN[% z` ͓`ܶ wܽq`4>S*0kQ4ƋQ`OQ +v0ZHr060 .&Q\ːpp2b2\F Qpa{W.pt.p< ."^ pQ*Z\4L9{M .zbv .+(k"p5pZ?ve/ӡpχK0Kf E@wN pI[ pBR kpp:s_GV.7m.ڏ5\7j(Β(2\e*ro{N5-uςN٥׽x )Apӡxׂip0" Ip-׋}_i\yv. 4vM2/7f5 nu'vh)nS nֲn;rw{ϝ[sWy{o>5jWpwp}B4'^;s%g=y(}| SIω, Z?ə-gqp?~܋܋~>%_6{If.]k\YI~'s;X1ɮp qpǀypoOM'ٳh2ܟTi&ܟ pIlI`g?+쯈wa sc瘑9V;#.bl a> S;*c\\NZ;?{ߤ ;W (N0\-ksbgbsY};ku5WCUa&Lr Ü #<.̄%Z/G~G\x<ΆScxGGxhx|vWxo ?Nsw>!I<>^Ҳx) xuΜWLxe\9Sx]pץLxw𪢵DV&Za"a]#k0Z|Lk0vo;]Nvb7vzάqu|E=v8]'bי=`Wz: a'Zݻ{t7 bw_QQnuo >x; oWx] w`x{rk8wwL%*_$ixτŇ]u Y 3/ψ~u>3F>3Gl.%6HsMɚG>JyQM炏OH1c }wnOqgHqy_Z|g>V̈́/9 _?;’>|GFw|L)^w||i>3OMwW |5IWw|W=d?k{x|# Y ߣUo,E.զu~ݾ?fYC YeU{M{Wbo}%}XwĖo.IlII?l%oeɷO[~9siN!y:z *@"x4A=>.}g`Qg KL}]`0*þ.;†%m5}ձ(ISc?0p」18∃noq$l<Ч8VNqCS|ќ1?N|gu==/ I_-Z?m{9C{_C9om =L{+7 H'?c/"Spx{E jqXM%qL㯞kXw YqxɠpmQ8|d R\e#hRG`nw/vEC)S"Hi!Hmw| &֢|1Dq"آk"x(o9&w ~(OgV7v`97NA{Wν= PC!A@ ܂OLDgLm3^޲~[vϾ=?Yfvz]uH^sYMq!"!KV#d_zG!ޔG9Br#BN!$ !QxrBR9("$!"t! ,!_r% !R!3Rv F(#_B!t@B !B t\_PqM@$BP;]|C&kGP4!t]!B7"t,Z|osos=/nE3gKӾg^CI;^37zGw iIC؜JɍG+N}ν6w5T"LaZ16HR|E&-Y"ls ¶cv!m¶O03 CB_9F"iœSX0:jLю0MJQ0σ0e0~?SBsp# }DX29"aYOMawVs&ܫ 4~{@>B Vʈ*m/+pyADE," """"iFnrSM>?gpxXȅi:d>ȧ|Q5|7!J. x6Lez QfZ(ZQ#b)V+#j D]>G4N(XJ3n+iȬ̡$4D~rJD Q6|#chǑqpd#pG8?Q}VѹPwQ8 GYG⨉*nM8uGcQ_f~g|h݈Ff7Gt@,GugшaAX+b$ fb#fCĨ>G5b#fe + ܒ6'+X툝 =Sj؃{6 b4{%Vu3q'b[ַ\G܉ۈKYSz;fĝUG\z.2uqw7ES4ñA8>mUҽNiw%3wlbS3hv.*ckXq:~@Wmss[/ɏX-ֻ D$> AvYIԮl>$C‚Hz͔ۙ!> ;Ց 'o|H$H؈A8tYd81G!^ıHσDAH2F"7y."fDq$FeHR|擆!iF]Fd3eF,;$HR$qHL@4ŐI h]8I;&!4$ِH:Bx]$;MH:I-HzC>EҧHjW^{sߚ?>Wq8{={f?p<Cqe>NLSqb y1>N*N(~;׏{VxXFwas'8Q'pN̤ĉ8$j+qR*N.pI=~NNw/9pr,NnɍJ8i 'Lq2t0y')R @JE$Rݑrb2RN*S!%RNB4=H@J7W$!%#RV .R.H!P)EgpJ6tBJTScp*uN3qLEш3SC=k8#3f*aznE4 u%R|U3o6g#M)ԃa4MqH[Ga4HTCy_1^Hd -jҎDZ&ճv"{I;iH+Xk:H^He(DHip8!,8;4gYqvr)c8;gq,W ]EgSf'@:;(j> ToBH0xzN޷,IO휞>ʾ#:3g"}fŨ/9!}]q!]~E DC4=G:ҵD} k!}Z=CHwpD#ﴫoFΙ}9Fߏ{wg#}WFA:? 4';|O\g(;jU+#{21"! 3"c&?2 8ػ/$Y w? bd, ={ âs-X=_'sv##o*2 qq=2lq3 N>26 0d B&lIN#j;2m̑e2j#sLdnKx *d&Й<g!3] Yӑ,lAfy.2+g! vu{Dg%%0)8)^ KY"Ț5Y⧑%,IsdIEd-B֢Z,܄{wt_YDVed}B Ⱥ]_웧#[s-9ZVȮ*@vm@vqdߠGdߏ@v~d?qEsvdٖd wo@dǹipN(Dpnswqγ9s8s8w U5%s%)q.=ǹF' E*䬫@>lއ3c5ȱ7G 8g!r\ֈڎ ߟU/Y ݎM9~ȩAN8 ؀s!rn"YܭBνf[~zV݉\VGE\:;лr{{1ry\ȝ\] g"wQ&ru۳pgoq;r  []Ƚc@ w aާh.ĔgO=բ>gD,73y'%';yFSHD/3w'=2'+ȋHeqEQ!޲"/? 3?a'F>0)sD>W2򹫿~%%(?oKy!> _ KFȷ|k=o^\߾ggr׽u=tI~9o aGFA? چ1(4 f(0߃R(X3QEQ`gQTF& \LP઎7+(p߉4;پd~eYk}9P?z$ b8Q'? KQpf. ](:lgTf nE(ۄ{ٸ~ &S׸ ޸ .[i\puÅ]p!(GB+B~ .6\(Ņ"NF\pc̞u_{zu:. Ys6wu .\ p\xBqSfm@aʿj1 Q8Qq8E( +Qh[RG>BD'Qxr) ס0:jIBa m@WN(lڣ^DfE}(bYQ(W"(Dє(x"(GќxA>y)Q8E(R;")(bG(uB7z=| nx"㱴&Pd"3hU$VCam{7@f%>D]. Q9E^3C}k(/U#PL?,VF"W(GyOQLX}9eгPGw]Etf Q$Wmhv흎p6G,A0'mg58 s߾8)bb"\ .9Kd=.G2<d./K> Q;ϰ.?_"d;cm>W]t={{#͸$;q(E.qZ:(Rޅ(<?ƲaG C @sC*sZptgG!3OA+( O:J?qKPU eÍP)Q(eӎLeB۩go!LD%fC;ILwL(7kG({+u[̚-PPOQfM];upk6̣ e^lw\zhW͏el8ʪעf)jPv=e'0({xeO2܄({튲;Q~0>;lD'z^||A(DyhZr K \J'PAޞ=;(WZr5G( ֣F(7@Wx܂j:W(_ ( 5-DzV{SYQ֎6_Ay;_G?Ǣ$+ԻR+Jr3Wn]$DXnTmB*bRTLwCH4*&CP5*xz,ҳ c0|NT&8*EHT,Ar&:0GTNzt~0s:JtP̲:2ݑOw;:/BEvT$=U94WOε**8Qq*ݮ%g􊌺3Q23*^Bśݨ0PJ?OQіϦ*,E$Trxr3TrM@%%*y̯K=iTF}TjdRk<*@~2T.BeL"*c2^fTfT2=*sOG, Ge"FTVDbT6E*RZθ=W \]5WWભҿîyf^Ulo3uWp;_~>x3ypuf\=mZq~\=-Ŭq<C- 'F5 YފY95BDI.jFMVA큨s5wu0j(K_;L Q;QKQSZ֪ڨ]q &U>*5ZS]RաvmFɴ_{gD剧QT(.&^H7+2FeU\:]!٨Cyԭދ5}uGos@è۰uC)BPgu])n ݻۮA\PhB#='QOrA{/G}:/AiOhB=Z_K(q꟤0?Ga^Dp944@p4p@W0&OGB4̲G)Aq'ΣAC :wѳ'eԳ.ҽg$J4 W" tY^[q{Qk=c"}'}C6 6h64㉉hH3А,!'#{+7Dd/GvH;dNEma=y73װ@vt.#;V ^!dgY";g rw oo 쌜AW 9U3f, L\"G#9as3gF,nxUGq}9G#Xrbg 'rU]OusM`r9!p/Sx*R|vrxOi4}-Ş[y7[ n ynyns#/>.#Guam1c/w|EikmA#{#;0ة1|^_Ӌ ?L3Qyuq}N;dzuxrŸ%<ϊC"UoFɣZlD ,ߠ &v5(o眃PsP) B` v+2T`8C:mAA 7r7֎|KPz"ffb|J* X3  2C(7Y(x:kQmQoz/wu}k߿n߿YCBNxy (…(\4CPe% 2Fa\nQ罛5[ƒ2(Z (Px %Px%Ơ0/F(fy nEG]7C7k7 EPSQdE'P4jT56CU(@ɷ(kG7,Ġm7>B{EC(hbwOQmu'1i''|g7(PgcQ̾o?Bq[d>o8Q 7Pn+Z'?јM^,A c(8𘡄 J4(i냒3Q"83( FH$D;JA ! (锊ޥ(񽏒E7P%.$jJ3%DEĔ(Jb^wa*JP|%PJ lg;(ag ES祣y`؁v(yr~(y펒7(yQ*(:,ҡ(v(usB+(w GtJ爢Kobf߿!J05C Ai(5bxQ׼.no;1RU~O~<(=cPzXS2JEiyJ_y<ߪ7^g2G8VEx8/x;C? WL(ʺHe }ޣ:e^lmMyiPQ[ј$ؘ+GYFnuAyR\H!펠\<6Qn'g[N+7 [ֻx㍬/ިLśx7w4̻d6g]U?Ļx+THڃշT*G*B`*ڢ*$ P!wP0 ùQ1Bw}(ˣnuxT̑ggY^Tϛ mXpbi:*V\DgXu @@Ma1⃕>yC > VćQCatܘ06 ‡0~S )|d:0g>xך#w>(#qS>qi~|Z-ħGi|ZǏOzq)>mOSiӆ*OVSv|گG>݊O'<_Tyf`J8sVrC;T-E،#Q< 5TC @ղs fx}Q>۫35}ZL.? 'P=U9ʝzp U-_6tc(CuV^jIT뻡@ Qm4սPmսP5LAT{ˣڗ!Ջ&kWDʓ^uQ,?m P]fg$æ2su|> Ebr_LgJ)D\FMk&*9]V25W Qf:ݧ jEd&[5y; r Gi3/˫ A ]ZAx|PE_y<;:DC F*MI~hRєTDom!K&DtQ:"Dg3$P'sײe;(w(Q^w|uP5BV+&*^LTLΖWN=Cp>qUFg6+ږۜok=[{iKs[{֜5~vwM]C ֿ>nCqgmp86,$MOc%aF;Ǯı{7qG!qd%G=q!I;8y#sl5gx|ѧc}$)HrSS^8 V{4ͪsK\;8 w T'N_;OiW8]&Gqq>DYięOy2uk>+aĥ|,oⲳ$.^H_0~q :Xݴz~#fל5͝܆Ɯ{f #.߻ĵx+q-M!lkbk-q'H G\Ǔ+nqūW&q`H&3vC2"qe42˛4n/_i][/&2Q$}sq߫"]\~{Vt˚fCA1x)]jZnƣpxjmx|]sxg`83}JyxNMe['dkoL[0|b-[ZW7~mʳj?gj5w- H*+_c4k?߅\8MڇCDAc+w1$l8F$`4Lni> t"^$`lבpT$juF.CH`h1 L/׭oH t DL$ëIC M"?RMIH8e-O]o[=2 <'$[{(KU]HH+y*H Y"C4 vJJӛI"A)&Hs( <%A$h\H칧aъCWoxsR]X`4H(7 r8U|9 hMB:j2 Vf(#1$4֘> s! gIh Mmr& N # 6͘<Ih~g-' -6c`%$t oCBu^Q[˩ jYڝ]Dݫ$,:uvRՄ3ծHس爐$uIx~% /'a^$H«%Ix]7K$նp5 3}[|MjFݨ z':O,"#K"jHD3D;y{Qokh/W&Hd.gk=Hd99|D b0M"ǭH$6D/ J"wȳ$RPJ"EWHMՄ= Is f}s2n|Ć$~=ċx!DoEi:sٓs'Ic'WIJ𸐄E$ID!CI(C\o8$/ąPL׎D4(B%H8I-'r&IqTaq.IvH]jW u1L׭6CH I:cxOIrD2I%1IrbINZ@HrNjIzS$B 3$I$ْIɎ#)EoRfi7O!$[l-I&I9)0<"CHjyޓf' $=8'IzejO2 y$ÛJ2m"I/d$IFʛdO ".V7_D2 d mHƸ/K19C2ڥ.|'ǰ$+ת$-,_>35If ɬ_]9Odd8HKVY,,JkWn$Ys$+td'!$+rdE4L=C<$LX>vN+IVUd'Y$CڻI6-NǘYcNn!S${d9=FI(Ma4d5s>dl QDo~md${I6s>#ه3I }NOl$͵&٧3Hn1-$SIn;ɅcEEI~4/!y$l<ɯt& {H~# S߲eH~_sC;L߱(|sw/#ClG|?H>Q|IdO?f_G6.~xY|ۍ+ޒ|U(I$դJ fг+)!+R#B ֫H֐쯒@Rp %A0` ) B ά\N .3Ha )H%Ru}oQ+s9o)'RkS׃6)d3W"#I_˓BnRL" o#7 ׻m,)3[e7I!Rw1DBaw) ³.PC %RV%RLHQҀz¸Z)Nxï?rHQ%qMI'M{ݐ8GZ)rq_cI:)[Hqj@lR>mVi:-ԡx?:)F)ɚ|))Ԑd[R]i&%Sd0IɸL7 RKJ4C@c~n.v,&%R:\XVO#YlE͸q t:#Eq6F:O0ܢぁ1jukghumߧ1p17NG]'RGH I$IC84RSHj2$5URjDjM[ԫ񐚫] 9vp0dڒt2eR[ gf '{^}_?gy7'Z_o?GYr~ט6ML^lTTG+= p}R4eHj"I&c( C,/h.%դvb%1Zd/oh=%'֤ܓع7:|RuT{R"ulFKH}7D#I}=_\}?MHUR9@'n ixOYI#i"'R4^3&4%ϑ%iv%MͤG%94>'Hs0 y@fDKHs{ۦi%<4Hi^bHty i>FOffiEe2YPEEi~DGr4kHLXA"i"-0RMZ>VӤ4:*1'N%mEn[[=֮un#*ٛ n*2fn[R u;-yuKoCvnE(CuGr[un;g$vq-z q6Iڦ+IL!אv^ IՁ)i[:v i;&vMO.HU'mͤ=a?i&K5̧"mO^Ns,IilKګDI;io$ME y:>X0mĐEa H{O{KڑJ},X_U>;i lMݘSI;78Gڷߝy}׆{jд*k&2TY_J:HĝtLI an~t1ΦtrHghqzXWkATt&3#gٓt-'#H'6tn7䞩N8)#SjE:IĐ.mK/IWJ\']@ҕOTIWɅt;n盤骆55$~NkcB]IN״*zZߒ~=ueC/`u_V_H D;$n;0i~|]t}9Iw0.}F~HwE %5IO=tIosR%Io# fxHzv:X<2&l 9Ho % 绬y~&youn$GI/ך^n|_%FiË啤V^/M }}a70'>ihːN&c20@zY2ع 6\x2__@;EN@w02|8 Αa12,J"V'#0aN2<0: m6 r}^Toң[|{4ujrˆy-Fu1{v?~WovSOy FȈ/א`&#Q2xDFH4)tS$#%dtg^0!#CQ2.ːAFF/ȸL7@22Wf"ɨ*@F Ȫ3ç_Л~3db--d|m' F2ںB$h&= vѡd􄌒m |,#K;L2:f#T92J+%[dt[%NTg2KFSظ?A8:o{M!dD#ƽaܨ\PEѳx'2}[ 7P!d)!wVdRL) YA|/T" "S d*Leբ{22LGydBw +2՛L7yf?2ݲL4|52`d5}>H/GG>2̴4iʹl[2;=w]gYNe%zdV6^2&WKo[V| o'sQE2Q!s@2&s#d[/!sdnV*2w cy-Id>#@Fģd>̧4wdy<'s/o<'?0/ߜ}yz֯qwyj3\ͳ_=Dז(|g? %d^I/mɜ}3ח?:ye2W&۩Pԣw #L=P5Z Cc%ЎzlG,C=UPOpK=2u7~̿k~3*OSc>YX d D#喚d].G r I[G͠.%| tTz?7 ty p{oe n :.j S)4 N}#r<]GU |  q7FY!%Ѧr'|6ڼBh6O6Hyh9y/n=Ž7GĽI7~`~;g[kGo)1?NnonDۀchf_|} ^?vn3joE 5|2-_/C&h̃vڛ\_5yI ޗ' I!a&G%BU.gzˎ_zǷ[EMz+)>Q6S`Q!A4ɉA\%C#ʲ .ĮVB,F6!n qP7 q&y ܐ Hy77'\ iUqn!9$k@rHe^0)HӐtEm( $KU YbAHfԖknA.Bi*4vo z}dHw iאət =c8!=J#CzD_H/8:BV[Z5'X-qO grfE39s k!7t1@nP^~') r45J!! ?$Av6@{ !w# ?*G2hA~xN፹ \8v=c3 g@Aj $5 V!>(Bk=l]ѯ{ @(zLLy`-_Ӳ(TGiRa αP$) 7ab` bB(^FA1Ű[P9.oA: A:-G/;с8Yc :`U4˖CL(2( ]oRtq*AY/e2LEٜ? q %20xBy]w˞# ]BK7TE1Tz>:*7C *S*K$(* zA%aVӵg4P9*B%7T.< jP** T9@PP4 *gC>T@%*9A *6B>:A-P>ҳݾǓm^3g+9YNƯ_aנ:aT]5<7TWAY TKC_Bu ꊵP U٩ ̂W1TFBuYf|c{=|[=͠z]Ufk<]bеk)@ׅu]6t]/P 5 PYU t}g 5yj $BK:Z# PS+ 5P5P3l0_Wok O-W{_[ߏy}o {/B̈́j;wA};vB8.* u^Pu!:WjV#}{jrdVҡy&}k}{IokVۚ}9ٿrf_{ƯiO}v>ط޸g uH@ݨ ?@Vzc#sc 9ꉚPO`Wa axn=c6^6_2M hHh|FShTAS)4޺B*hv&4y TMMKhj\hAk)8BKZZ-ACh 0Z"+ uq>e&&sCkUhyG%t3’mu9tһ[6rh*жȁv< =:@'/tN(}茔U(BGN:2#:#:Pgw ڟ]UN/77wWkJ99=]oy{ 7aBK[l7[savߏow7SquC&yUuv~/=/s??Kw']w:X?R'??+߱h_6r??ws?_?'?_/WrwWk9/V˷+߿߮ ;?e ;ϟksf??w|z}~oݿ?ܩC?_W#s_w<>Y3Z;ϟ'o~'x}WMw~6w?+R_=~s=@9>0zГ =iiBOiXcN4@O-z] =гak?1M g =~zfәn?H/5_:^Z _k}nߏ;}k{WЛYЛz#2cclXCn^譪iθ U[Wo(V]cCw/܄w;`}۠@eAn3厂^q=|[+[+bs?΁^{zv~1w\K̃ҽX{l]l6o߷}ArGoNq?vVa c k_v`v :ÀaIVc`л7 zm4 4`1*02 ӌauӭbZ5l C$ 9K` k`h~ahs:p ]a8b6 gkpZ *p 'W 0? ПyaP0\ ~ǏЗ͚?szΌownpGxEF՛{f6 rg0fORa ^޻`û+`x0.0L{ a۽Uw{3 .SНo ~.z!-4yRнo~tƇZ计jz8ǃ\Cw'ct_VBWf>F{gHFbb 䃑}&(9Խ01FGay F{(NFv0:,.n'ѹY0:SlN rMc`u7X}`,b/a,c^0 cN#FC`TQ w0zFoWѽ ݽ 4Uܿ9Z1kg.4k ^1pGgay<1<s< ˨ϰ<8L`_` L=,0`yNwGGz_+~2aeVzI +k V +9[XI/d $~j.|wYVjX8æV9z7`7>>R}G =aIJ JVx kRXnnXZ. XkrXMj ]az ~49΅^֋zXnXw[XmiP7iCsN+B "lF86aRNf ]^XDtؘuts#`3l.l\4a36f،aȱq6n``lNlf/?l"&mO&:lvf lvf{olMP\M0؜3as6wasix:Eu`JNkض[厁-glmg]v䀭7l;8Vq lZcخS [.[o. #j?$_߄m\Q^>\7 ;`{l3v6v+mmC;66cc͏uv5gri}]kؙ cT;];ivCΉvUs`Yye`d^L#av{,y. G1}~4i~W߆M_>Ұ;zs׾% _ԫh{Yxf50ا܃H؟w9Q8ɂoO8p|a0uxa_Y[o#ӲFk ~b)p |^ArR8 Gp}p% Cf6p0I8 zppPCW8LCpP Nϩ!prsSag_^npsjk9vu voU0mr*ApGp n\r{Mokfa/8t%qn=x#cX>Wqst47/OZܯ)]s{ +~ٔ}vkz~pLj=4u2ViC 67?U,O!& /?s?BZ/5@+ 7DNo9voOh+Y0&dZUﺁ*+c"욂;Ob 8p c@4pVbmG 8Na@1 8zb7/h'af© /xnKNNfdNp2 'po|mjn7_c}7 ki-`yлv-/wbuy+G.]yow8[Ns8ww?יj_:_gpg<΋sVryE뚴|L1C|13Lo+s Fp^d= Χ |i3/*5# ,N],Š p \A Eb6aw`v,<gank ޥAY-`^VC:1$OC1Ļ;L),!g0 3C*W`ȧ.NukappA.npQXp RN \  6.pQցKNJkb mքEv.2\eFLo*\˲pYr.3%r/\" 3.L1. k?s3t53{\O|ҺZ}cr1\R2juN|D#P %LgU9\>JT\˛ ^*a{0T,CE_2Pa ѲuNSC0'P~C-0t| ubEjMɃ141ކۇ`h 5C,]1LCC&5lG7Hޒ?jz6Mj<_Bq{YkfX~S {a-4I\0b؝v 0,]TKgZJ:nG :h;\:"Z ky[obf> pvS}Iz1>l*\wsp= DG!ĕkb> kVõBo9\cx;Æc" ۍNJ1b3a6|j7l12#adr$FMQ;άϛ/x5.tye3sha?ϜW+oQz=F1޷ajyzkfoq(֐u1F 1ZlFKb&h U{^l]bpva1oF/ыWՋoaiv0xN<'0::FǯXv\0Nks0ݻ{}w^ߧ=f,HƘ1F0=Ř6ûc8ga bt͛5<j:=͏TFcQXS9 c>b̻B כh1m16zsi`IMK1fއkkT۸t87w iĘcQkO7ǧiD|sظc1$60.9E`܁ "S1.c;-/p|5c|uoZ#&be„0aLoLp-UUL蒍 19&Sh>Q;L 1}j&z`j#L_5 afM1}C{LUFbz>L?l͒GW0hLgϾ/asmL/e|ZrcA3Ōv0K"WNZu38_cf/f`?f<nj1cfbưN+1nf#0cӁ:~ 005ߧԘ;>:L,̒4h{v OxJsSj<:`} CG*V4اGseE˽_=fUws³}1<zsE oR@<_φK x³i_0sR)< ny6_sMxV?UN0 9=+*cH`=0{r^}bQ}&o4/kF+ s 00̽0sOL܏["^x9&JxmYpx-т&x gxx !sut \~\Gxek+K^auy/R皦W7jE<߀W d.e';q:~^ n# o:BxFxMn[ R'ޚVjU=o#{cwxo q6ާ;qUN)fЃ}ɾ>Q483߻ 0*+`>;Un1:!cOyŧbX,X˱}^p@ ‹bA}j۷! dfbcXp{ڀ7b VK‚G .Ă iXp ;1+1d| l-^xcAi*cAbu[+O,x'Ё>G0|Tc>cFM>3 >ϔ wuLzkI}r3q1|61m`|]H<\x,o\U ,r-,|.%ٚ/"|wK,~وWcap,:]]mU</ lśbyể7,oT+PjSlo-ꢂE3hd,Ν¢XEGbѵ#Xt]Ә$EOgaQbQ(3,zEUIXTEaX̹1ǞE׭-xv,e 3!X|] T,eXzK$;`31,Q%IX"wKd:5 &cn>hÒnOD5Vb,Q=Մ懺H,%=,0K*6b@Ycs,허cyG,5نFXKTKcikX񮿦Pwz6;}i_z&VmOKwO͔ƺf~:߷RLZRo79\-f. M_)'1#5m<~k?jJo/Wowvu_H&D*E77s"n `:>kO2L/m.KKf;~gYdLc͏b?~{^<9=R?_g,/eXv!W˲c9Xp/=ŲYFQX#wˊ/2tƲ U,{Vo'[;ac}D8VXoF`E{XauV ;bpŠ'b(a>I|܆+ GbGϹ;XqV ŠCϰ"1+N0.^+5OmXqV\j)#~JWfՍV$bXi*VnʀXVϱ2 N1wP +/Tbi?<)'26+o=V6?wjkUOJ5cHvշ`u3V꽱Xy#3a2m3%z- ĚbXa>šm&'bͫjy!5&XSpkIŚ~g^?|ŚXS=k`M7|b]Gyt|w .% ϸ&MpMmPц皆y ;gIXԶ6xV]S9MZ;'_?1.b'Y~[ F&Ӈ  uO?*0P~_Zm` 5QoB+ÿf?߂a 6KVn>ʺa .Xk9kMC=zLکX;]x^'9[Nk[:fX{m0^alMREOʋu]jN"Eep 9Ӱ#zݎ`9X*~8ևX ?SXJKt2#RE"@0 <9 rXQ_Az4d*?~Wݪ:zh{;vhwk5?"vEϯZu~rgh~4E42!&j!`|F"`47"`,k10͚Y}^Oe-}9iF 56n|՝P쀀M@@V!Kt5Cy U"P~(*} m? TC^d_߱ϩrs}xh@];@7>>}ϬD`~F=E:M@=\-85~r}3jB"]ff|F܆yyro#8Xү+'`C s>߆B6(Ɔ?6 fep v?W ذt46Zc¾}kׯ`Celx0oĆP艍qWIKҰy$iG?:}F|LBP 9#\YvZ p-@O!hs @PXdDPGEPIa ~&[ Xe"zAfzy*FPEGP!fOCP^<!(sEPYl[-^2>Lw=6[Fmo!vߝz{?yw_w;}_Sl٥-Y ʬr3򞪾-37kvSϨ?=ڙ}o??9`-5V\\-J!=#!m;z ~xl-_ [sc*lM55}=B$0!D=BCg k>Bp"B:5_kr5}_m*B"d8 d67,E_*BVh5]@H(JMFȧyP|!T.[j᥂9:;P &Pqe?;\g{ ;Bߥ4_FǷ }l9a- Ccv_ǎF1;V3+_נ*vرyvl͠[#;svv8^9~vbתص|Y.0?un{ [c?v;;b@CǏݡӱ{`Js=DX}qC|F'vZ˰#LA a!kq.i017^" & I!LՔ8aSfr60L)BXNj5kC2aTWaE+CسCW{bOqžRq7(aOأ{z[ )kn4 ލ*ڍ9uEplpwrG\<!|ugkƓi>7 ទ0[W^E2#{h_8NM; S숈j;DT1O*HT2CdeD*"R"E3G^D! ^ʺ﬈H/[!DE%DNIA<}w"# 2asy\1 ºzBǖOn~aOk[yuO#Vi^^ZzlbcWd cܒn޵:we|{b聽pu׼9iOǝ}#jc.9}b -Y}W}*$ 3p%\@&`K8(%qPw:tAm.$qP3ਛ86 _!88 w]Sqp+j]p0q؜p0ƶ8x*ߌ[XQ 婏Yc5sEԔQ; jED5(#j u:(O3Q!Q2vDrDuߌ(nG^!Js(SթQ/3OVϙe׹:YoF!jO4![uQq5 *DU\N pHQ RR%R8|I=mcCw{wpI = ġgMšW8r8u{px+#82 GܦȰ(# p$d#k7"sDkBV݈h D˦"ZFR-y"h3hz 7i}w;~x zDEr; gC􅭈>gY ODt6D,"Z#xD_oXKظ`B=CUB b#21#Gb8,q}f[ČeNa~ -~rO=??]7Vn!7b3̻X,vFLPwĬ E6lewE17g'bvy ܘ_fk=͝8 /8W|8vC ǮDZ+*8"くp|'wq1 o8=<}V+h}ouf;]/{wk}u{}ݼ?3}p<GchaU8q<4 nm;m.!?ͅrln'Dlo~Z!bb{%"\ƻ۽}Zhnr}ءuZo} GlqNFl)n{ U,CzV_β b,3Bbvcs7 D6~:?=Sش}3qV#C)g8׈ZxAsݎ9 sň;q; n&.Po>u17 W#?sƺi}Spv=N n2v!n{y!.'!.O4?&#⎲}@ܡ?k ^U#^e7╇##2扸kcK./B9ĝnSs=׿)Ϳ:T޽]wo 5= \VJ@O2@wcڡwA/ߧ ^sW͒}_ ">p?R'7O߀4v _+_9>"%rV!!!p!a [!!)A¹-H8 gđp ':#!6 ґcC>HbڃkvƒZl $vCBq |p]NM ^N=8sNr1'=É/!8Q(2HdGbvH6Db{HDH8D~-$ D"w93#3'j>!x chXH0 @|$z qVoF($#6W!qU6bC>Xi~{־+Bֶ~hvi^~_ `wrz1GgHΗʸH$HApt푤$AHR@B䭑$튤HI}ܛLD)HrII_#i8g^™8StJmYM8+sa\uWz#qֵg2}uى7pv|*Ύc{; gwvO]p gᜠ?Pk3縤pSgpNaL˚}qnNXsqnsnO.|S\|fM%&86c-ֈODU>^"_$\'ΝĹq.Qֵgv4G}+q};#y/s> !/lCrT$A{HYL=$]Gϑl5| 3y%y8\/^s7#U3RpRU6"Vq"U2Ru+}v!2 :WK Փͼ8R"uDH]rAHݾHM@u ^Z4s 3i\HLdDv"m}gDQHQ3vC;%?a0BZ%00{iG/"m,B^nE -i["mE˞|a:GoOz}sIZyݯֳ5~cS^}akOӿ[Wp2i*Hwjtl}g>zc:fҗdF2n/AoW/8HzdҷAH3G;voo]mOң=~d=үE"=U 9pc 7x/!S ҋT^ϊ8[:\ܰfp)7lp#X7Lč 7qc+n2ǍbY(ōg h?7jpfܨOpUnJ!Ct`5 Mמ?@F8dtG~"2!CKȰ $dEFȰ~ǐ162<81Ż%A8(EF<2EX..AFY[dlb½j{ZWTDFdjP-l}iÍ̾ ȴ*oO!wk0w!09Ȝ6 Sݑb2 %2v2v@3 :gd!2 fwd^< ?σddۊ̳y y<5@08lKk<虎&w0 ၾh].W-~zu:5ii?q|ƒU){̿.q} wлfOW#$?.NBrڌCr!>CGpvh}4r#?rz#l%r*!"9K"g4,<?,HA|9s5_N\ M^+uZQ|g효,r.d4Xs.F. @n;džyȕD2rE W}hcV =SkCK;/ w6rj9ߍG|rEnގEnFroC5+Mr X8rcD{i^A Y~}*Ƚ+C-b: k+䖱~Fn VAnEq]Bx*8O۰Xv.C%#/~?@ޙB䝶F *ydZtG0WBҕk֚\S3'F~{<,3a<=Bס@+ O@@R^A\ϟk:\ӫ zE  A> _ -Z H5q( EQĽE\QE P4 ǡhv-}"~(ZE=QT$gkP Eyy(ʉF~u|Sw9߸QWbas]G1 }JFzE(9E(@35Xj(dYWox3&}%;8uoC5Q_%_>┧(jm~J>D5A%msĐ{$ %Q2s2JwCTL P2~=JƱq(Dqmϴng~mɤ_SkWX5W]M?RC{ O*Dg(%w((Aɍ(I BI-Q\k(ꍒ+GQr(9O(IvC{73;E;SdwQiR%(|B'k׭"(2A1(tQkPʾF^Bi-J>2t&t}&%4s qiPL2^yY{<oQ5 xn#"\<ҳi&jxX׼_loUsUc<_أZ37nzoҵoyXOs4ygk^̦~5ۣryMwspQ8x#QӜ7tL(0,0dA ac(-ˠWP6Bel= mP6e(KF д}QՂ?]PfP>JW|Lǹ|OAIOf~Sv|xCtFT9P֠|>| SV3Ρb**Vbc*tA<QX3Teh֓.-: V"/*};|`KA> |Pks].CǓ+1߉qÝʞ}Qˇʽ< Q7Py:{~Pyu>*o2c#*13>e*LDX_sQYsQ8PE1rTD-J Um1衊'i^jC"T 0UC6jh0zUKUùQ5q٬mP5r1wBUZCWT%*NU*:UGuQ5/QUȉjmD5vTsLE{\'PA gP- jڋQmWaDKTOq932 BtyTϳAu+7ލP uZ^ˇQ4{:Lzgc{۩ak?y b|W3؇r|/ w˒ QQ.w|/"P#HԌSAX%ԌϨ5SQ3.j&F D%"L#HDu)b (A[aM$֋H %"J"|N"W@ԷQڀh"[D^Ds]f"ZN俊hMj3"ZvAhEyD>clLUhtM[6FmKt' t9'; zOt)X8GHqlL.GT6qM{G" q̘8 &qR'Qq8.1Lj5l78US`qgaO*Rĩ8|348%MJ9a~?8_$xij-xڧ퉧ʁx>/r%/jx;o_)5]N]T=EF3wdH목~D>?A|WCOH/4]31|O!g:v$>' !mE|<.va0"CoE="ėa6e$s'ėAt//e@|EW03t%W' Éʂ-ߴ/{#WQ8 hS+ Hn%1G6#sI@ ('iC:ڐ0=p '}v*8'AYH$=Z$K`WET!Am9|EFI# 85;œ`b;7~jHpH :txu8 ɒ$ F%'r"$t$tʂؐP+zGmG Rjk6ښR[sj;a{N}WQۙ8tj@mשQ۰bjT)PO4!Ԯ3{K޽voI\E$FA.v 1E#1s$&Ĥ6eFbY]'1˳$֟5$fHb6<$w YO&aIl GbHI&$ $6n-%17sMbӺ6_lM)g_k}+H<Ƽ.>n}x@a$IvP'N $ѡ$IB~I@NHb؄_1!I´GI1$}d}@{ſqdO'NlB&'3I}_'+f>I@-dK͗!9$ч: #9Q$'ۉ䤥IN&ɉ'9;6oe?C4Rgޘ=2kK@r+HnMr.InHHrf@r=iW4_PwO?&y>$oOFlջM=67z{{H'I$[E ۙx6kRɠL IU$_suIܤ0.#R J 3vG.)L4KFxRu Ƥގޱ${,H?)XS,gP'En^q>|#S؍ZIQ)v-$EmƜ^Z-?; ڨ^RQ!dB%QYe'{gBdIff!tݯu]|C#HK4ڝ䕽qѤ1:i8{xEeQai|BbHӬ3i:f.@*yi^-$ͳH= $Hԗ I "iQOVp LZaHkJEZbHk~ҚLZH<:|N$H+מ mCmvM66fQ ?i2-6C2tIz^ZAڋPKw~Kp4i燓5#;@ڹ]HiN&SH5>l%m>7K-_bhB-_lor^n^-?qF:H'|鄾#=t!O35t&ŒII:/fՔt>LGmV«GIW՘t9{HaN!I76tc,H7"!ݵIwA~y9H@7tw]/}kKoZkO}G_0ؐO'y?'u+O{ IOV#=oiƤAzߐQ>w}Mz#It%陸3Lz"wt s#=u~O.P\H/鵕$= Nz؝ܢ2[Ȟaқ<&d^\U=([ׁN&+HocqUΞ " };#A:?|.'+I!A2"2ฒ2"d01]IުdЦ&dq 5 9D&4 D "d0< bLQ24 wd1Ȉ-M``2 %n0tb%+ymj7֬8E=73XanAg .%^pH9F#Á0 F"Fd81њkqgsS7{~NC|ߜ}LK&Y(2I#!dD& 82I[J&[dU2Yٕyݕ/drj!hɉKdr|%iӇd*}L%id*BndjL5ג12msLٿ;nd<2mLFi|#Νɴ 2ЂLCUuԭP 0٫m׏=[X2vLc4F2-SL/%5dm=nL8˝p%[6dziWJ 2-V ‡d&Ad&vm%3Q֋ɬW+Df];YskÏֽ{&fyݙa#Ό;3L2lr#2K&MdLa2[SO%ch 9Gfu,!'ɬ2+%od4qFG!8mE- &q-gKFq|YDCM %Nw;00q#N` <$YYG+LIe3"ę#IˈrKVęڕ837q,08g qGgXIG,Caĉ:@;8y}q6%NFsuaw&qv1"c vn}@\֟iIS3C39A?Hyɞq-Tn=mT K\Q9~W7quqtkN\%.&q9V5=G܀emOm{F &w6qc'n Z&g`zj/[=w"w#gB1߈;j qG$`{_9q;={/o q&C. A|b'nĽۑ->^|Ko`sMy2M-\U{^g&d:CNy2傦y`ύB1S<:#ےyNd>Π6i3|C2OaI2j#Ud%evݯoF-BM,ؓŢd1#,<}gUt4YBmeD},SjZ@֝ȺPDN[F~d=?z9Y9@ֳd=Y'*uB$YOB֣nu>M֋uܬly* ˏ>>!]zYo&vd1WC.I/nd=S=E'u0Վo'd}E/t#d}ɇ/]6d]l d#A6s&l ل1(Mfl c7VD6_#K*"6d+wl[<%[dҒl;"ݐl]O㪚ưdiB6%lW2 ]:li_]=n'2ڐ]*60W_3IvdgP@v:MNi1kcΫm{-)"Elnh>ꎍdmBv.ٝJ#Vdwrs]}yEvw){Nv7W +);}rO-&y~y/}O}B_q7&}fgܓd/O5&dFr~j5޸T=Z^aճ)VJTlȡq?rhԈDCrJ trϭ)NCH 9腓n<94+^("G'rTȯfh< Vp>7q rl@ȱGrӞktrNJΫfs9c 9?W}YԼWyn9oI&'Z%s)r/s~{>kCwbV69?g:䢓K.ZOEU\}tM.} ɥ 0ȒK2|~^Ho&ȟ\%r'A.Yn`r\Y=r_x\<"еfҦ~?s5Oss_~Ϻ,6k&^& uX*vJ]VkXr-V'Gȵ\ ׻yze~^vg3p=7OF8|}v*:@36OcsZ*BsԜIN(Rj h)е) E _>r@-@ju<5oa.z@7ӆFt!& i4z]i_~ &VU7BrɆW2܇Ky굂Ng|+dH߭ZWW -K!t-NQϪ% W8 NC腥_BX&ͮ@XʽeyBXzvyaH{6%&ʽ C;Np\XEֻx'CɌ{d!1!y>,c G@88OosA>opCawyטUJ?UD-D$|K(C DT !Ҽ~Zp̄>pWC|'Dt\3>ZUCqIkD| 1DzL! !".@dA,f2%r,_ۼNGM3o O_Q׷}3/ JuT(:DC@4܄D{AWk}' 1Cx{\E1-.IrsF5xm$Ě\NBb^KOĂCl^PsbYaۿb'@,{NAd[_/w& vC\: 2!v@\gB\a'ĕC\"ӛͿم?" 6ğC+ċ[ _TNCB$BBt$ AB-$@b*9+$GφHV1G1:RoC#ԱpH~3 u3ߵ#!usnmHq])Hۿ?ROB(R zR%!r1^ H2A>'C|MT; b!mρK?H݄t+oH{i@iUϣk!l n9wAz۹p</t~k-HodCz[#Ho靯!{%9o!]`鷋!2!s*dnW@d9A42ed?=:dʹ d}`Bfk5VA4=ԵGf&|9?QV]ka$k}}D<4Ud?6 =.g41~&&4 MVə3hr6M C@ZH-z߆C|=dKAv0dYdOJ3lfȞld[F9 K {!d/A8^1ː͏ Mޖ==v}. ׇ '9)@NRWO&i샜A -OkMrv\$E\G}HoŻ K~kCy*骙MBT2NO\./ܕëVB0 r0=\ Ƚ w WreN+WܗUX+!/C / !/ yWiyU|CN̷yǍwyg]ȻZ@ۛ^5{6r5{v5{m@o+;v;~5!6B?{>{"W0mfAL5\ 6L7M4؄]yd4r@nJ;ԇxZ~fU)PcuD"4&tRB&3& Aisxٍ{wAi-=S=/s%fҁP:8J}I@WAu uBp* l/0^PvLObF ǠV.CYwp݉e:C?hwmnN g]!wz1\mvqi?)Sf0{^v́Iо2 RqX5}@2Z-A˭G` v̿:ȿvm͞㭚=5{#a_``( uA#3k,xl uA/,Z` q6 VAz V̚׃GèK+됇0Q,Fq0FEu&&0R,7I`|a*`2a)ӦƼ<WU~UH_ub~Vm{W.-|Z޳)72 [aj Sq0n 6;`jSUse.i?tgLwQ<;I3^UutY0 YpWu0qRgw 3n<;i !`64̢aδUj[a61fa6+l~lq ̖ ټUseavg̊سTX#} Y1pQ0Gਪ3\G-upZtG?s2г*2W { ;<G4Agp}jX0,pٻr5M |d?p8l m\6Y]=&yHհK}^p"uWpsA!n{INe~J pS; 4yp9;T=2cR X]BpXi/j+Urfi5p,w-p7w_2͚cgt|Qp{o4ܯWaSso̭+ =ü̽oںl:2F05 泋`vK`G,`~7ovOQk{jl}1? 2g*PX趀~, Vh,8 `aufRvV.,=` FE`1iI`1q,"YӒ`1}+ϋ\GKMxP`` ,b0,6 x=,NP~ ,.l),J.²iX.I ,M=`i6 \iX{ҹCXze e>f›>7>㾖-B7`96atrJ^9aVZX]y qV; wWoT_=W^Vê8VO3a4XJo=~ '5'WP[66rY6Gras567 l( ؼ[d3ow%k#$بެ^ԟe?dw]3JoVX-4a5:ְՍ^55 [{5 ۠Ѱ]ZU;aV[*`{0 S0 fރüp?|Šz̨Ϩ9jSu{ah68SCaKї7 8#` N:[^p i [I4I# md|Nd٬EN ഢ%rt5WuV ge8a|·u3=b \si8¹.9fMslsz8x瑇<* cL.ov-?{:[1~ZșZd|><&tGb[x$c(<&3܂ǔZ 5]kcxlpǦg`xfwizOk[x:<^ ٯe^w/r/w5~q'~2?yO.Z1׭q{^G^Bh-v/ &g듫yj˝/ۯIzZ/Kh]6f mi4C=7wK"tQlM-6'RxϞ0s{WhM5_!|צk7NLw _u_ _ _m ߎ`N ߠB4p6~}o7f|&wl|wKN|Io;|owZ0|xwn .̅bK.qRiUkỦ;|ײ\6|70=[wG<#k~} {4'w7%Im.m=m ?|Y2|#紐/˂_ ΃_Sb~7Ezo{ a}TgK߈~^pNӀ@n 贫':6F=kO1B烻9'|~:_7:|O#ۆeoXVG?)8p7(Z,C2(]B!e(]"%:]b:%9x YJ@AM_/:PEʎ@iU5ӵD!mn s@`(gAis8Y/+Rf#FAEP_? r@P I1|CPA _C4( (ޣ:|za»=Bmjx_|'˴1q5CwO;73?}GdA!h?s Aْ:SL;A0qgDO3JX0#&WCef25yn~~my }vno. R G_I% W&*/B_qv}[G_M}*E?'瞌~eg~j@v *`\ zwL0pW!^KL+,11Yoޥzx zwvWoC ؁A ~$^U q$oA͹Zya yaPW? B`l# Z2c2} v *{eD8E"" nqGDF>KA9ƴѝ1="=Ck?^w"nE(*HԚH}3D[w xK9u6"S<9"g$U͎=r"n "73] r<=yuCD/C>l7D^Fֈ̟țyy//U]<[~-z`+}C u126Cd`Hҷ/),?5CC4e(Ѕ#1t+ ]1t "~`A7ް ћMeF zvDh }1 ї!fD_}mo RDߌ[Ӯk" 3?J0 FC1Z3116: ocw1\LGLC$E툙r1)G31t3W bWϝ :p=&a}?a+{.b!mĤ7s"-^{S01#P 1!udf3צ]uwV}s^W=ϮL|14uLðQv zǰG1g#<ðe]0l& [a"vl=°g:-kxƻ딎XՈ_[H%=ب+^X/ xmdz=Ό؎t 8Z}DgOy5e8?T̚%÷O𝆈SSv76:a #.0qAq #>L%铄]*02hFDbdX:FT1rSF~KȊe1)FM4I)h}G1RVưƌс3cfĘ9;1&3.e Se>O?zg%ǘUުǘLc2cM^g|Lfp˜s c`̉Ecr1l,Ɯ+Ę1+c˜WzƼ ƘN˜2m1V<*>X5ifC{^Wzc{kY~ey݉5];c -0}恱0.}-~[Ÿ&V 00ƹ~8w's˫g0. b܈)7ƍjF'`8g}¸[0$q^bQdxo<bf/-xm3Gq[E z ?",z!ޥ9UĻ?ty;_䟿egƴ4/1D_; _BwL/lTW1xc!-G`C.mx~o1c[{M6 }a|w;.-1sUZvVu?oUoO1yzL b$&ȏԚiUs9[o+Lp n0}>&(0Äv1ϒ5&xc°F0r&NDŽ1+_Ąg  3 v ;6 b4 A -#AGa#t_!A?fֳ4svWϭ ?}yn5wk*+z"3 x r%p*olFHYW̃7H(ꃄ' /< N#t$ʪ#Q#QfzX@fD6H4lT֦ Hr-RiO8=338S Rg6A$nG⮗HۿsԽo|ЙY_ss ;Lw녑m5~$FH> +X$6H$UfV|e?Zv4d{kwav}Ҩ%iGR˗HuB0tf Io_yIzH GRH v=j܄k{;F $EERE$ qHWHZI'#i)K"i'w>SӛdZ2yu~Oc|{ݫjw&<ˑIeHIEJ[b o0x>?c LU¤F0q*&V$#7cRs3LRiΐIVWI3>c)&-كIcқa %*5¤27Lz?>b綘,4Earc/L dݘ45A {2ce?ofmGF=cG]wY&[odLd LvUe8ɭT0&,& L^0S`ʸ& %2 SVc䮘2eLZј2^ĔdL)K11Ly8SuTɘRjjS0oßy/M05yN9p.m˴0uo+ԬxLݟYGj8S>l=L=SOV`Kz:Ͻ1SL5 Sb[`j$BrHn Hdɗ5VHCm فe#-ok~6;uGrg$z\xEJH.;۫jo %.RGJMDJxRz!wRN볇#e+,ކ%HY~)+"eMͳI2i&R&CsH9_.g~Pͻf5g a7Rvô/0{/y^iӺ´1xL_>axir0-br~fk;suK`L-_0}5L]gb !q3 1Cz"f4Zw3 1ä f,vm0ft1c1#yf܅`̿c7fafHf13<7}_:,T&\uǧ~cgc.9ڵkI9QDP[ƘG̍({ffΖT;̜[+1sܹ3w-0si3#fw09fdgꄙwSO=f>gM/1eY0KͧatꗌY0+fMXY e jSz-0f>YVu b2a[կ[_avΘ-q^lKf+aHU:gEfk lMbMk̶VL1$fXvj Ƙ/8]^O؏ٓ7`& %cNsaN}ɔE*BRwHTC5F R=W/׾7R5sjr]7 5T *:TQHFjl H9E:6"/"uE`C:+?f{׍GzOf4Bhna;3"BH=sv)RG#>dn=k|jdR? \r\n s kks[1w.+?c#sܣqi+U@>5f4\y#g:@Z-Wuy 굠kO-6# iEHy-.bzļF B1ϸYL<ˉgyjLһRtOLߛ펿Oxks}235<<ܚgjaޠt̛&uǼ0oz, nyCaޚޘweϳܣ潐ü5M{x/Sg_f luwݯeu}wVf~Y? ?*<Ĩ}OSr>Y̏с?G>1W0\*OOOc\ުR߯ȝi+0"Sn)w0l濟U}2Ϣ{_ka5X 3  2u`0b|`=[ Q\1,sǂrXmǂx[}C" Eba>X, ecxgmϩ7'^`at,jE;H:Tuj]z[ޢR,>cɯXrz;Std,8Bv3ex2v mc?+f`EVX8+p)VZ*cewVʯ{OHX{v :;vW|}󪛯<[\}Ot HATwK!]m'/#E$u7zH7ԯٜ~~"iL׻LE[ WW א>w(X~ _|K^"}h/[\ }U? C;%BGY,BWvox9RM"i5-PM݌ٺX{"kOamn֞e͓ڋX{Ik/ڴmXܣQX[ƯX[2:X 42ºXWK!2 Ck-2ґ2::mP bdNa(D72Րaf`߽2/GƊd@jedfxjl6"[dcUKȸkȸ(~]d>[Rũ[>y`_P[`/V\lm;j?!['E3֙R4/|vbj3غ3uR60 -?Tʫm1l;n-ǶWEvm[ ۥ[b{k <nn׺Wbɪz׼&M}b(Oe؞bk׫ ء'a;Lbu6vu+\$̸ٶn*v2>;bG1s롷q$;=N ^aYqwv[q,vƎx(OA촚 ks3v.e{s!wcQY6`gr,8 7[]槰]j]ljiJcWqֿmbȪ,a{.6nK71n[ۭa=r.v "~??/}_ۆ=sGs>X+qRe`ZӞ!T!W2m'5)سI3l.Þ-}ܳ(l_ܞ9=g'{c%7sy\IĞؓ/ɰ{naM?}{1sJ^TU4^Aث掽j;co3,{3޵+7c8n`_ } }ܗ{b߅Mw4]-ݱ+=}%€ۑ(pYJbO!K" f0~]N,iVgvodumn AVXdh깂[|]dC}:uY_!6d]WD֍Ⱥmrd=˯Olā pi50Z>4TgxK.Q!8$p␌([aB~6pnpUvOؚ!#\qxXë_Uq8C3!ȷKpv?Ïpq?gpyi%Ϫ^`G$q4f~s8Go2a;6o.}#۷/*#4#ϳÚz1Av(2<dG#;t8j.wΨ1==z{Bv%cw~`?l '}cr ٳ9s㐝y>^ 7#{% {dM)FVw7C~Id`D٥.wWeW+q[8Y8-eSqwpܟ!p<{MqSV)ۡ;lh@v}l{5H#)q|ѓ2ϼܜ|Oύ]wW8uW y8! k6/K?h1N 8!}R'x=81N߇iϪE|pb"A-rBJxuGNLV|7$#'I93rf e1rV9/sr 1r#b\Bձȹ99we}rD9Ϟ!E"U՞vg\ 9"=FkyVK)dr؈"t8ݭ%N?opfL0Ό݈3oLr9 gfG̑8Sa3@nAG&"r 7sQȽ3 w[#`ζi8;ߞa4.؇qv*]3gglDٍb8\ 8'ydxKSs*? 8Փ9s/Y:spn`[f-ٻ[soخ7q Εz*O6Ck5<I!T5qSi\}I,MGnD}՟ײ4C,&!=1E@u89y1 PfX.Ӑ^q~1;m;uEb -.|o`/ş]-mבW>'Cw9K*J"k%|#%Ӯ;hJ 8>>+y%^ Ѹ"WJKG~53_O¹+q"W,qW9b#P+peb3qWa1=+~opJ\ a{BJgS;g=\ٯ+{SF#ㆫ^\]aq]\}W?x/+p}\ckrŸ&׮i㚖 nzpMvƵ.6Dע,q-6Fŵqm(kږ.uĵuu{ [#_d E}/|ʯIA~s}+E<򵤐o|:3燐 WUkCvȏăȟx f"zg@ϛ[N5-ugRs, GrE_wq5T^'_"<>?ksSCqc^LuB٨c qS1njM8r]e<Zí5sAڭi2;+陸~M^Tݍhrpwwwk2=jYJbSj{]pTa Gk{_EW!k˳ D. (11^(Ȝ P :HGsq ~Q8SpI?e!(8 Xc /~3 mq:}_jO<еC{x`j?LNă)Zx0 :xx,}T`rOXa$+cx,fֆxlk-OiP+xOC4 O#0<x:&ӑtT)3̤ѕ2kDQg}7 S>/<(ex"/zƋ>!/boŴNx1^dn5Jx`$^,z 3S  %گQb8 %Pb% P6%4JPkV؊_Pkz˫}xOS^AIL0JFHdToFIJd"ۙ%Q2KaٹnssPz:JAɖtlGvc`+@G;2)c;rǻqxl}zPCJ@(A(&>`$Oi(tn&JVtJf|܃(*(|_ؾ(C -F+IC;TJQzePʬQf2}^Nv{kTNwy&N55Yi~TwiЎo5y,;齐[ϳ%Wϼ!~2tqrsmGY"uEYgE٠^(2e1P6,e}P69FrQ6z ưg; ^,ۧ~)6 PB(͞yACY85BbYAqo|27wٹ(j ][Pvg!rTu]d?=Rܣ(+6Cc3-)MiC^d7{xl?ޫ7q{_ CS97u ?4=Au,C>%n>DvLJ)lG!>t‡aJ|H;ͯ v" $Vmaۛ6]Gp|RG(sGhrM㣥2>Z)|jLwW u>م{Ms\f0XX||.}^\zeQެP.q+&\9*(אfCu;Gyo(=N(wAy=(ޢ<:@(h97|oE֙(6 /[_D'CvD'P/Z|OA[>§])4kzEŋ<=|RƧQki|d!|^++yug3yC >ol/S[Kly/۔k|sB\zcu5yO 4.— |y_/t*|>OY| WeZI1jp_V+猠#]}) _]SՍyM vnb~T|o[<ķ8·Rw|{߾DYTHġBz)*dªfX{q3wW}2w3+3ƒ9Ը3j쾈r.Kb_ؖ}$5Ķ'Il,[j$vڏtbKg3%ލ_m$^:?$$wWP]ūĀ$1ILO I"ɝ$&*Ĥ ҇$F%_#`F3:GX|$,a I#HRš$u&Iy)l.p$eꗹI:yYB}NdR IN >$9݂$g#Yv$9?$©$I.VfxCKHr9~{xd꿸+$~;xGȏ[w/W #ɘ%3{_];ʐv$uSn%N$u6I=BRT#zDR$4I=#}lJ*MxNB=IZ8E;w_ i$rS~$1IO _H2:HN"%f$3؉d."KHf+Y(pdl"BydfXF2D0< %gmHy!D2/hj5)g<6{FMPSԡ15u n"NLo5z:Sky=t@5dFM_i _OM׳32nOjo75MYjz\z/5JM 3ܣ0fzpj65;l()3$93Nf5l\.]/'y&yDwA7H<ɷ>KړwT9G@m?- $X䏯#+mH?|%L櫸 /H'NRJ2ԁ葲#,"UROo+RMMٛIZR=لTs ^Mg>j&R=TH8@+H~}"bvR}ւxv}&5פd$Τ2_掤EԶ mIm˺3{Mwu[[p0NjInR+ B6SDjkYR{ϴkKz? -H}sR_I1 OeIFsWwSr4 40'm{I1i{hU"cGIgq i?ƥ#q:i\I`_C2H#icg ބ1U EG0Wٕd('JjJ dGtf2>Dw0.WȰCFEFBjd$63"#eodMF-{b);o##ud@Fd44!$wdt+!dtF0<'w_2x>֫2Lk/ȸ92u&c9i[dp ,=6d콂L? zdYLI't !WCt`odL߿!O!dEL&鷘5{/j\cxIf̄D I\2n̚ 3o['X>YPW' Lm ZRdr7\%3R23p%3ad6: a,Πàtvb2^&;l2 dwK9|;l$'dl>~UՎ&7IP;j7=Ge+qtJJrq̣cq8Vcw8cԛ8Aq#[Ϻg's6"v ήKg|#4<~H*yQMWg+rӈ+\yHܶ;y$q:yӍ;SU5qWwM8q3O)q7O%Ve~w樂oeL{;";q?"n'2G\9a2o4Y\@ܯ'~͛&\1̕[B;>W;H-ޑy[Ey {2K["B ȼ=2kA杬ɼ.(ydBd>x=]FQXw|Ul:Y_b\$k̻>jMx,Y?e(9H֯VgdvO{fYUp?6&r"Od ٴc8L6~}ȦuC;-@6}Uf` d3d eٗ:SY9}@c'?jz#grnߜ9QUDo9)9Ǖ<2P^d!r>Lgs.˜0mrL א=_:gQcvSbܮ:ۓsֵ*^|o%Jy/Kyάڿ]MzJ -r)@aIܨ $7fyl{۱ r;1N>%=]%!c|=Ίܛn^wP#w?.S=tl^+NRVUljm IJ>Лd3^bL$J1"<G+<fJ^צ yye83W;6zS=Zj}\/ɯ2ûL_QTjʌZaڇe/F+ڴlEmtlmj4?tþJ yGm^&QOk!"oDB-DjG[yk-"B<^qqju ;Oގۋimrۧy0 Kа|M}^w{="y$V=~ yOJމ'R\DS6js3z1d ɻ~/yH#]/E>!h;4K>GR!|JiE>M-ɧY0Ȏ%#/f_6+__P|fR.3TrQmC>lV)S^H>+O0K>䳹lTcwkڱT?>$ Ss|U?`𢡄a;yK>;{fʴuU4_2mlFb+W6kBϒ|WSHo 6%{|G-#1#w71f/)|]'߅t|w1Gے&v6j0̡kQo3ˡvr>jڙQ;nc[jw1;]>?ijǾ+|JΥvElOkj%{ڽӮ?Tk^3xBeRuAOeܨg|֐2{kL~햒_Ϲ7@~^]C?41[ޣ5'gĻk\5SWWrȲ77Q["iuGgSk\oތ_;%et! qړ7$3w $8xPPwf~_I7.\?fyrL3uϸ 0{V5=M+FR< 3 m})`p M{(Ƞ3(-9T6w'{)uBݢPaRQI _HOmCu0֡noSw[[dVvSAWЃ(X^/g|~M/P:;Ppl Mq[*CbôzB&Spƛl~lAm >OSɉeAOL) J_]YQFM{LKrOs>RwӒ>&}FUm=AVUmyo J!)dV[ Y؆B 9)é" 97B._> yF!Y=OB(T8BIŴ(M|ޓB;P[^BS~: <׏ƎՇLF(Lq6^^O2Sg(2x'8B;RV& C&ҀQ40Ln?g~mفn4 ~ij, r\LZ ;@t=<6EKB'IY4$e( ˡ!kcy|;_+3>ԙhh:fi0Hw =j+3oX&4,b7 zbR}2: 8.yگ8?w7^ (.7.G\@*" |MV߃Ɨƅ@ȿ9:;Bڶ'֬ MbrЮbm;q~SUmo?Am41W KCXlE?BXA8BE W =!mar7GA>¶!l9Fgh aR4W껤@.v Bvp<p_v^pO{WLɎNQp2AxVg >K!7Ax4,.Hbsr`^ ?d3\vǟsK%gw}&]w~/A| 'gqkpSM 57.B7_ix v|B1 {M s"G&CWQl`m# U"[f@dfde7Y@pw7>gJM!D^f@=D*f}h|-ȗ+9e/j3s(FoD !*%QISJAT|!D jd QM{πxD-MjUg~Uu8^Uzi@Գ5D=C>D9u3\:w=SsGX&;iᷫi=;Btkf܂] M_U]p\}2uzѰϛ!Zou5kG% oY6hAQ]4*EyhFT[4CF(3Cho _9=rG=gZ'ow;zSxļ- b_VCb5 Vq7>T@m ] Xc ,ǶH;`f?WCt)(@HD =KW>$j֏A"b$CbTC#HĔ!$}H$LĜj7cH U VAjy+H- Ԯa|RCjC{^Tih3g6aXHeBj#nlN8Bt,^c.!-iq%H7Ntu iאM<1E4q Ah✁&b&EINjhabh&uѤ߆JhdCUd幆8#wmd(d]hrMG(Y<4{j1ؠYj5Y5,#d9s kfYSQ;gC6d{lˍ |mޟ99H@ad%BUGi4/GGh^x щP cPR !PoqPU0 ;g WA t~P85 9p2 'Bh3cP" g$ pg77BQ(ޯN.[oyg?ӽR(FCt"޾«OP lا{b\(bhBh(͂bPl;.Pl EPdou EV&{@1#u8o^bXwޟT.VCeUe:KNB.O(Rd>yj -MtràtbnҗP* Pz!J@t(}s^w_W|ex]ͳc|eD(}2}U(7eAe AP(~P o$宻ePnʭA=Ώ%kֶ۰|( B9JCCy=(׬Nb@R(<`PFmPqAʓBy<{?݌k rv^-{w*GCAUT,%b P1V52 *;뛭.'ݪtyw ϡ2*#*}DBe3@%ձ8caP9$3 T1*P)=wPy;rTjePm*&C*UWjPm NmʩieA簷vgWj`}|75z-oKq5jp~կP}JvU5PS 5E|\jʡ* jB\B-j7Fj+gBm - QPK +9P_{滿"vBmD:vZù3F־_l9] åP+ 7d3ԞAiB]g:'Uz8ԧ~aP:ޭ>"ԓB={B}im\o m PzF+]Pg iPٽ {PPPsP?9VP?a^hMh15hq--QJ1PThf+?hj@"4&BS 4>A'n4x?B"hZ };ۊ5[ 1#xg4S {_hXKAaCwhy ~G^pϤg6;{Tͫk ͵r4[hαh& f&h]Cف}u;ּOl1oWcjSm;{~>SCvOK94?@v=|~ϥ@KDSbw-SRU~[h6VhdAZѮɯ?JvThjWA;{5vЎQVg=W =g!Sԡ3@;= :FіU8 ޭĿ5vtF̀N\茺_kuOlnF^l󣡛7{!>@O'z-M9握gx^~+wyBo-&^duׄ^7{-^`^@#ur^lZAM9Cc.Nn>ߝ?sy4yGJh XQwI.'CP}}-Sx}o =h"EA_" GB;T]=qΞ;gfϞS[ )/n͡o lN60 Nb0c=a`e}_d C< 10(08 Ӈ`} 6Af> f̬u0ڱa;6mpz OpU zpV\ ų{d<ƟaV`FaFc4:¸mmR-10Z(0~0>}Ɖ۹lMwZ~v˚hvI0)-0}b0iSqo>7 S053 }h>L`f3]sT-٨0 a`v22f2(lmO U:AX88f1wGpF\'58IJ' 8>wgpF-j,k ,Yb]T ,`̽ lUp&]hmd?Kn;O6|.  9̹u.}=s(kasRݙMu5\6!An 3pͯ:$m7G+KnwC6CWp׭w}0pO&g׃{avGp/\-**0W &0^ s@1^T憣anX5M8o,^%^mlY0?O `>NTa*qxo>}Mk`J `,e"[/ (ŽhXܮţ%x1a9b,_XkV[&,mv,_p`Ք9x7~hQ4DEÖM!l(IQYi 4 'J4Ju"|88\W7GB<f8T c6j|PSm9Ցii_a?\k2^AޚCgiB@}^@PԷAhnhwv as>aX8h]h:1l a.{ӓ[`Vqj>qj]ަ緔9g|){wB[S=>:^a91+aL4NtC'*t:ҡЙ0_:1~t-Wv#Ϗwc>s{#':Ny+gש+CcCfva'k1t{2HBw^3n/]еH6cGGjJ莝9>b-јe_&g yWAo| ?yfMxVCo*弃%MysZ#U5~΅~G9/m^?`wC@_wվA_y$xpѻZΌK%󠟶 /2,y31D~|}m5{g۵|Yw5g;@dzn0MAPtX!O~m'װՇ}?3_i6rMc???C[{3۠dz?>_ܫU+ag : b a0q" `\צv3G̅b,Bq,0 s-a3uWE?}`w l0`sg͞QVH4O/N\ʪPb& P `hx04aZ`9 a3r`>xϝ߷t^ZË3`xa 9 w ~Qޗc0a kaAQ Y~Å16Nm'}X. 0q5' 1-Gh lR`c 6f G86ޒYXY>諰6TwAo[<`lOJ-lk l~dygʏ ؏QտyMgI+~ɫ]͌rjs|->-ȃ]f ]<-ݲMjk.w$G0)ݾ;߀I;3 m?`;]`WgZ7p(ÉR8ԯC{pxof5 ݀ýh8Uk>Kh.%vQ +8v:ǎpj8':]E8w#weUp8Yvp1̛ w8Spg>p?5Iwh)ך2??5ۋ j%o? ũ8\콗MApǻxpr g5eW28ɔNzpѩp 'P8tE8;iFi8ͣaeF{ai Fx`n1+s%4s \1aϬbZ1Y08<玆p<.,rªp4 p6bp8 g[pъpvxg8qn/<sL g3 ΑGD춯uqpκLK{y8oF 81p^Cws y \>[TO@QK+S*\+W1pXWu%] Wpe׉Apߏҋu6Fu\5=ypNk~?ݯpc}Ё-}B[=k3=uoF>stǤc%хIǔ;^ic1xl Rͩ%q^3e / xi3]^Z5t|Vk\Wd'/ i䓔4g|lp3ع06:b+.gDd'}|GgQ|V'|' >q;3 |欂O5|ݫv|k:1ըʿg~-yg!LdGMODZiL춇O~0y&k ?x)f6j>MI2 ï:}nST4~ =ৣa~)3=?ՇM6sg ?oSqG_"?}; MU/K2?d R }WX<>G@)!RXȟ@*GꅀxOEQJ"0:#"04 S"p|'lAFI(}h$@KA0!j!Pj?ySKvwSeS5[tB9b_ A՝!^!Q2# .j#<;?))O`*LYS4VkL)Ĕ ;1\6ٺ3\Ĕژr]#o)Z*S,03z'z"W"f!XfoEp`b+ Xq1 X&rt9 xM>p6l} cs2k8 Cp3'Fe|ytl _gMCP/1!d8OEBTɘ:#/TØj}SGQ0?S_`aZi6UV"t KbFhT{F@hLn n. t|јp5'/D7L_1=r2ϊ0}*lqC0}^ Ҹ_ݞnWk|W՞Nwxscsz ]'8%~vz=d9'az{us'֮7N?״㝙/54ag#0ݟ| 3:V#S*rF!l-:T֗X`/3as=`3̰>ȭKm51Ϗۛ 3zS? |E#|0G>CxIQh}.`tu/oޕlK( cg)2JCx @:O"ߙ3~EٖV3oj3ܿ=fy˳3gogsm$fbfzf.yi" =1393Փ..f]Yg,1d̺>?0¬J3f}Y5WADD[D MDE'"sP/ua2_#b-D]y;w,Cg w""CS%D[HH{ۈHz`DԄ7HTHD*!R"f!r"Z my a!O rቈ dl(cn. ˀȌ[L%aL]-WA!r""dhȢom[?'yBD>dD߫~ ?n£ Ja>35xl#j[cއg8NuG'sqNˆBYY>A "N?1{Na&7Y}=x;O@@G@qī ^U-x7*EB$@^]ZHع ; "a a ֏EB^2@UHq@Š]'{h=#Dߟ';{ wp{?nD•$Tz *Lp gJ"ԩƙ;en̝6yDHa]~YMu-F/C!1$1si9漡M3^ĄnM0mu47=Ǖ y+F<$+Dbn-C[$"/Ab2$@ڳH|!/ ϑĚ$?$iخf|D8:/CH^$:Ir4([SZo_j#<#=I_9H턤 I~70"Fۻ7=E9U1ra5޻ w |E?%[GaO-Ym{f{+Hg;cZuǛld}H1 W]\MH%䭺H?;HNur7tsow<@Gw%/E, > g }s7hK/, `Qz,bMeaђ*L,7 /<'`}Xt$_=Ea]/,zŢ[k7,?c{,Vb,]Rcx ]Mx-,-NSQmͲoݼ|sgl^ou6_xF=a|`#ȳ|,^+'aP,^z3/k5iۯs ˚ecq+,^bũgzROcQX|*_5X\~'^Hr&HCB39zϰ cX}2l:%5dCt~Ksz7ŒXTŒxj=U."㑮 tUgN HG o~w>i4mG@sǮDeHLFz.ϨBz@"Ssy[΍N=* s_dJH&s܅kH߭պ|_rp?o!2\ ď e [>dX `p˾}HdLA4OdDEFd~SȨ/f背:dԌAƇdd|DBƷ4Df dvG22QSMȞ62ikX'wBu1@ثL1%M loI1dXCYLdm׌>\y37F!id޹zvd>AӮ|2UM7yY  jsP,x K.eWb"=Ųq,e/`*,OiXVlXbd߱FnȾ ٧F")d} eO^X,r~=,_d3`y ,塷|},?{Z՟+`1,ۚX~˯{ ˟ri+lbHP eE9XP+`ECUG#}-@Nr,r"+95kcXMk"l)CG?6@-  ;ӺGntASAnBJfp@nUpDPm䪺#Wr"W>Cܸ=̦擖Uʪi"r ٹ),% U:y]F#Ox$z/F^ĺ'=~>nzߎ~Hb.+qk?sol [!Ԡ X#yG!G\DTE件oOkދ,1Ƿo^wA瑿ێ2E~lD.6Ǿykgo!͝a3wG!V8 # :Ģ?yW@V?#- JQ0$CO@I@u Fr ,sa.AM Q0؝BW9 &f{(CL N]6(yKQ0w& D  b  [>d3 3+? [>}! MPض *QhB1(G(,C.(LDa#X~&gEaH[14[q* 﨣u^IFa /TDq}yZ}(| U(|a.(|:aXltFylG bӰIؤXM4.7l -cqEco 9[.aClr [.`Ur:[cckn-غ9 [7ck4lw=u5FzZ[OֲkL"+Iri[w_Fn>j;7DQ%$Q95}~$(E(ZE&h]?UFbmCF]mGQ,Ia[`lkY6 E71}&t^ձmx"Ķa3Mԏ449=[Y2,Lݱ-KR#mQ<-Ŷtl[V,ölY~{[.¶7oml+VZn)+ݴۍ7rKlS0}il-]԰} >V65Ֆgg7}y5vLn ۿl ] {7oaGO_#-vLƎJ Zر0;a)}uavlOǎر;6 bGa/wĎ ؑ9;2bG3X|??sՔ_<)q9vg7uv$c90;>N$#ݰgv/.DZSv NcG'u:;; avOӢ7g-j;4yp4#_j=M; ;`Z ; M;Cx{Y}"MsC|;ν]m` vB v,nIM[a&Cv[:c>veu[V5!=͇b =1vOHnݱl߲|ݏnba!gbwuv?ݏcO{Yݵ9kݐ=WcO왜=RIM=?[qc[;:W{{[W|-.Cvtf|=>U޻!t:'n}*יYzc_Y'1}ا}* OyxJKbqYw^`qp ܶ>8I7zs\׬]qfßu{w/oUP,b("(Q BQNmP̟b>g Bq(SPܣu(Cn[@b7e\+oP{,D Es%<UQ3Q&⩳K AIC(鑌(9yrP2%΢Į %V Pb0 ?Ý(1`( 3DD@vhA}(5B:VWšd%Jr,$(Y=%[J{d7{I(S( WBɩ(9邒C~?yeM5(t%wTHm_zqv@]3GTJT2}6JUQQ*֢toJW1͓Pj3F QzP:,e(u3:,?>N8^L}(ʔ,Pe~P6y&vGلU(󙇲lzHo}l,@l!E{|NڠʎDFx-DxWeE (;7= 7đv28VGx2?7Pk55[G&ő5l*OY!#,-#%_]qG8#5^s/3GQ NC&ᨬ4pބ/6"QKc{ plO<_{D~g8K-gxO xfO~?k^̿7쿻W ';dv^'VIxb O̷㉝9XɔxON“xOrvWsfڦ)xrPOp7<܍'_<~yOޓקG>ʣx}[.x3t(B Mx33l7VRG*pkSY8SC9:jeMT+GըoTQ46C/q֗fkg5P=51ϸN^PpT'T{lɚLiT/ͭɸ2]-w*kc޵wV[/E;-T?F޽;wo_ݛxU2xT 8Ňj6CN7|زSK4"EN_!U?z⣫>:U7άN,G1:V X |q>^+Wz K|e q3>5~yiem(ǯ) ?S$XOC)q>\§U2?#> gKs|hG%9}&|NŻ#|o<ִ-GMkԈj$P#5Q3b3j,ft8C5.X{oB81L1FM$̴@MA$&iQ~=j9j#<7GQ mvVH|QQ |?Ҩ=T{V5Vχ:ᨃZc~0uRf;uO_Q_j[ԿDPԿB>0wP+Qy-/@Ņ`lOuB?"j<]_Yr4_ K:g}rғ~/wbrm\زкe6֫+ ÷~or&{ߞǷ^# AЃ Kw$ r -&?A*g0?C]B2BX6ͻY^L;v_?+;yB) o6٘Gj_u!>%a'%g;ldli'I<]ì~/p_׬/DvI1N̉4MמLgj35e0c&3BqW?#G2-+C 5ĿZW'Ŀ)!7p/=DgFJo!ܘu#:f ;[o "MgZJ5_Mjct\#`5c[H*m#}nMmR;͹VͶ [+wF |~BmkR8j['P;DTP A$h]@#oW $C$<å[Et!H0r. &/"$GsHpa\TJB$$RG|I֌kH:v Hi%("ӊ=Hqz$$sP@wkNB^ $4z E_iNBIM}1+:*OBe$t- _$OIAgPvKB秓Mv$tm! ]ܔ?T{ޡv0 UR~w_گ:K`uy:xPa 5`;:'RCaWꐿ:ćQS\p:/;xG ruxv:\XͯQOclB?SR/uIki"u6YG{SԹP:HR/|J:)m/Q_yFa$*CSp@'j$of8N("a$fF $Đp Q&UIx ^6[pa p&Ї׺-W$|pz>$L%$\<+$\Mg܉Z>K5}I•IH Y`^B"HkW]yGjLw]HH`8!5)$ZD#kIt O"XO$Ilp-u$׷A$Z5Dk?KbHLCԋHL2M|Jbޒآ:K"8>0[Lb B$V.ػ$b%{\W'ާyjn u+2HQwik.uauA`E{%w?εp|ʟ$7DX2$I"őWv .$3II=5H$n$+y&W:NR=gZ:^םzXPOy}9zwe?RoԻM/-0z+j(w"}zQ }(} z_ɴRZ&G[cZu>(#>C?Q͕gj<3PϧԧI&IqG".}HRIvЖ$iy~.$YVC{_6׷.TOMHB,IV%3c{:O}5S_Uuτ}b{+\O}>WQ˃#ISI ")~͈֙QԷƘ~ ~7HB궆?N :I 0JHҶ$)G1܎S mCRI* &"$f#"ؽخLJ7a~U5I-ecHjiVI_ SHF*YIR{X.DRKI7( $WNW8cũ9WN=l!S5LMWttE"ZI?$;5.~ód_fƺ;~Yo#N~wtEM"[6iv7 #P 7?:c6?NC֎gRch4X 9}q'5^f(Jn|D~.6z?3sI&(9u|) Qߒ̩X9qd&6bԻF^ڏd2c$s)d.X>$soɼZJHVÑd >b$kû8d7w$,oDFn7yo ?A[g|nmE zKӹН$;NgbAC >OQ{$;oνMsp{l>M:=UdiӠ4pG͈I +hC40*tc{@]|B%7@4dCРU}i"F4('?yOEѠhk,JhpS,D{b~NC{x`<5 6$Hr$'e_ ͑!(|&#HnKDr\[\ vrN>gK~a'[s͙nA$EI>kS~dhRL $ĄcP'{I}oN"wH;"CH4Rxy$RPzNU@ Uඎ\2Rp'1Ha)8fC)¨ۤ`{L帞so=֑@RRfI HQԷKw")j)&E)h4 ~)n%ELRG+IѢ)ޤh4h7~uo2؍㦒 RSDQM})%H!)u hu %QZR$%JJ慤djKJ7pkfI洭ɤfR R[T|!QR:pE0}ROJ7dIjR]S$I~)'eKTЍ0Rvv"ў`LngH9RzCʞzǢ_N쳖AuHylR. RKN=NCʕd)?.#GŤМ_")2ofrq1gRG*]IEd,dSZM&U2?$H%lL?O*Hej̹L*H%f̾K*{j%I5PT&ʧ_"^2T#Ռ=LGjR=T3IuyR=O'37gRm%ڳ9ba4T8P+4b՛NSАU4t4 FC&I4t3 uEjlDCq|2s>ߝ٭|VkgdI[NnGj Τ6d OjIMYSUF pEWR :FjSH-,ipwAjIm*RPPGjɤ':v Zg%.x6 6_ZBS?3ғI]JoI}t:۬!央;5I]&j$˛^-ϕ'lR_IK7zZRds^P@yH}}R_WL"]^C I4RkIާOI~{ҀcZ RDcs|DoI54Ic:XoBݝ4ّFFmpn=ߢy i'ƙqSޤqҗ4N!c;Hh/(H!+$bv*kxG/IxJ]GY؅W MɎGL_4Vf̺IiIs>#i\#UQ87E47j\+A$Is{ig{fd<۔Yg%Ҭ~zz-m~;i Ր"ini kg!!?w^.š&-]m9\_S 5i͊"鬮r柖V4ieM iUNjMڇhCIImIַ4~% E:аNhX˼4 !IäI;iG%m#V\C:HtrH@:o3 wii|xxI:() ͒'s[AgƓEҽƩ[eEz"3I0C3&:uw#=c'ZIz]HoHWNzRHWnSnAzCHO+4{)M^Bzq?#uV SԅUS{ҏː#{0޽ww(/iOq/H_YHﳎ{~OuBI3u6W)"AzHn:}jݾ:Fed7 +H")?2XXB32p&2 ?92Afd/ JWAI'N-/$ $2($adp, | 29BnJcB]{2sA n>%+ȠR .Ydvn`J.42x\JCS2x`A%Ud(FA1d pb +K2咡[dM=lFϋ #|dT35?ؓ OdxՓ_@Ëz$1pǧ4<"|;2r# dId1ǓьdVGF2 yNF(4Q 2C&dh2Y+M&k.&ZQC_dr&LN%dr3Lj^ ɤZLjGqz1S7UF?)d4͇L% d: &!yd:ƞ&>2L-gEiiVG2P 'Idz?Y2Jfo9W2'2=2;Of_[W=ϠNB,!b&|PA_O~x2YL+%Yd7FPB5,NǓ8LGbLQL b9YZ5ȋ \vջi.jkk?˟N[8Ǵx܃,ECfp%{Iw羙edYJeY!˽rYnJ۪n2Y^"+edY9,/dy1,O˷[IV,&Ŷy.]HVWUA4Y_AVkzժdUvzԀXGpjU8Y=i,!r4b];F_8W-,FF#\h4bƺqA#ޞlqPFH#҈7i_|7|q,<(A#?OȚƾ!F֧@ȓsSrB.쳂K.rII.,S<Տr\!W:\eACk&hk:rIsӗ\#+5o/JS}^N /4w^ r- '׍yB9#^2#׳z< &ׇCer}trCngdInk[XkiϺ=\/v֛;WKY}]$M GȽr!_>GQ $F_@FpkWO$> v Az*Nc}k֧A]^fw.H;ȸ-E/;{/E:Oj7 ͑kAO[^XVi6z;#Zݼ#:ry?5VMn[:/hݬز}4f}3Oۙ\gP:_t)1|={-d %>)3e5>+9e ್3T | X 6{`>{|OGkU{Kt(9=Le]мקyO1o}^ykr_]<%u4mNc;f0ԃ?*s?;؎/n[7G\JK _C1:3\\<<C`/_BHޅ1O5m"~TYmg6SmAڇh[ݲp"ǿr\~oNƘq]Nuک@;tӔ G;%hg:89c󼞢n>qYݒvukk=fC)KgA !ATwWs<癖y&ON!R!:dk t:NT> qk sh>+: Y\s:BX²S!4‚~EŸA YqIMt6m D-^r"k!Z 07LD^Klz 3!"k'j;KtQ.*U ]Dv*]tU/t5M୙EWyj]&? "?4Ʊ=+XZrQv\뵪KQ!$W0d@L=|7'CZ Do蝎 !pDB D_Ce{:  b T1Uu Q bR 9+ئcĶ_؎ fb%;-3m@|-@Wժ]]!=!E- {5qsqqLۦ(Ooq/ qf~!|C|b<'h̟濟s>tb`ZUsg~O|ɝ/'p~wA~$?N'{ouM4 EЭ:v$ 췣[Ct;O FW9Zlogmy>GKmQt[ݶtGCmJtΞcO*cn͖3Ht{#no[u wق:讫/}O=0݃E}Btlؼw. A~u<_9=fG)w葑K/G㟴~]4/rc<(ǖ4zH@QX=ϓ$]&\\S l UqH 53HCBVm!:n2 /oHwHDB"z$bdn>A<5$Ģ XUsћݥ)}gρS,E=xrId$dp$紃1<[ !y$dB"va$/?s[ &}ѷSoMB^r+ZTT|ws//Fi;{Y }+ }OXE}#b缶KU )2)CuH AʶRv )! |H͚'HSTHegx %݋ UzRG!U Rg!uu?v-T}Ck.Qҝ!-:bu }B >BZ;5 m摐v0 HIa~hS߮ey- ^V ِ^= ]x[6Az*w̄Ő.bt"H9tel.O跙~]O4ⶢ_'-|~)/9~vlݺs*3Ԡߕsw=nxErN?zD׵.3l;Ψy7bÀ} ɐ\2B!adf:B&Bd·:Ȭ<dy)mLF oȜ,̩f|J,g6ofy[q:dly !;c A!ݑ!ci{`voN-݀$1p9˿j1Hl!u ` p& ,|r/&CȽ Ww2{ 6!vӏ-~AW*26=!K<"4* j,3;od y+G[T+ ?v-|pO= H 1Phs CDOCAl_c߽z8@g8zCA }@A ~/BA=;AAB` 63`qPpB@(A!Aa9K@Jo(\c컬APxg,\k9S3ضPʂb{wP1,;uٮC(|'\yŞ=PjnV5$EePTZzP خsxp-;BPPŋRP|x 0_9e4t1j4l.@t="Xct4=w>'1cPˡ"a8UBy!T\B2*4WPIJRTG@ePPY*@%*Pt*:@7v\B_P^ S0t= T|1tBNPE+O>ZOnPuPס PߨPy/1[3;Ac#h[Thr6(輴vGTj45CS o94M) (oVqX)hƵf(4WDC34^ {@Kh$:΃V/h-飭w:38c/gZ Zr/ MZGC2l+7ON@Ɨթa0Lt AWư*W=}s7}зK#?Z1;w n_ _@"] Я /0`G Y0z])XvH#X߁`C0pg0X9af `fN׿ofr0>77(or:y02#0#0r,S#Ns#g3ƋhU܀% w0tFa^k`;OUYJ_0{U[Lla2+L}a2G?ϝ,$dAL$uLdL֯`}]csc_0&`s Lv ɾa0 Ӿ`:\߫LMr9;l:: wYʩa-v2}r_i=Ti >3zH &tT.Ȱ>0M3vvFgft)t-LO9g<;c`zw#Oͬ&IL:fLa:a00[Gaf86ބ0foC5;TY7jhafv f_Ҷǿy0,։"(, `ٿ);a,}JX b]lX&ᗥn3:.u$Xzdؔa~s)˄͑9z6 /Mm=nVl*5ծ?4kbK*1LѰ[aiv-Q`+` [彰Uɂ*ۭ~[nlvm;7l+x^+_}mؾˀm!l(~j?cԤcTp2Fh[wcP{_{MҾgGn^oMJ)w9؍݌] ݜU}e\]얞ݲ `v"֍]? ə\ƹ֜+3;3t}ǰ.}@Y{IOK큽+^%S:qz=돂`o `oQcykvL }nj>i)},ا-vf:E~[y8HZ¡0 op{8hFbzCh8>CR* nZ_án fM#_(m( Ǟ#K CpLh86v%O5֏Xw_1NK$ N"%N]IiS'd+Iq9pR 'pNXV{-2N#Ysd7ĝwy 'OqNa#N쌨[p4o = pJFpZc\c8i 8Y 8LSh8*硣p*#t\N'V n_ӝ-d0~C1n8{; ZN,-_{c sy?{Nucp, EpY\kpI= 2,SbpY{ .Ს-\ p5 ..T=W\r3\a \.oD>¥.(+zW"p0C!\1t wpݱ &-w=tMnbZp7!p3$nVpn֣vv9ܮ7ׇۣp{wʁ;_ஸjk>zqZ fpn9m>:Op_)pOׇ{ܷT}Os{_}tS}0cp?#~%ܟ+yx8]ǘp xx <1!.3<>c{x)~c-"^Ą7,W%9;XӪ Z5pfP!N| ߄[]8}c&NäNq F1K0 4Ǥ0)U aҖ,L*Ioc=~L{c<%͕_*_J8Ro&_nlw9~WU/W3a۪C1]yVyއgٙiO:__[_ר'4X3_+D=/߾/zG?Q w_f+Rk~W)p"DR>"/#fIy#HuCG_Z6Wyk?'Өu@иIP ꃠi8bh eGв0ރuo"tDڡOǓ+APq(<tv*T)):ݙSOǔR)cʭr ,h˗#a#7 ^; |:"#aCHc!ٍB Q|BV"dMBrYP%B6Eٲ![-B^C)RQr@aC銩O0GQ~0WL턩CD1:NX~:pSajnLԄET'`Cp{`ڐxLӿiby1Y]Ǵ1Ͷn`LWi՘~fe:BlDBx J+܂7m^4 רmX [1=i3/x鋺`bLO驷0=g9+UcA L?PV_70f"l-D؆  a!lK0Št>"l3c8a/a&#}.GX=Sq3aF̘K1#ݒ9fQ`xbƋ"pt "C_zwrcxg..I5Ř-3{tL e9gncY>=0+h fxcV`*r¬Řuf Lb {>a%ψr#XdDK!bǨFoǬ9Zitȧq|vQ|wQ3Q)錨!Qe(ӈ2(ˏ#ʖ:_BkC6p- ʡ+D9ChZna`#9m回RQku>6FԦLDQ몸D`R|QGu Ng9_c8K\IJ[U۶zQ&!j莨o="_M-B^ѝѢZhDK!Zu5،¦ BMSMHSM. JmbhEDEHV!$FPM[HV߄dHYdHdAHd {- ɶHd0:V>H ewԙ :,R#"5[{#Fri=iZbH6 iLWC*"T i73\gɼ5~wGꬿMF?zi6 i,Yq{}iW6q&_D-"-Diӎ#mV"!-Ziv#-f#]86l&_$rDnm??k?Iyƚ),g@H[~#-w94hZnFX>Xy }"2X#C#!c}2!cdK!c-^ϐL̉ב0S6#3x2F!s<2C"_ՐF`BYd#K^YgȖAּ?٬ȲwGFj kzd\USU~ Yg}U!zȺ Y73ɶX*2<.Xv^oFAv=dGv/l;7fOk*JbU (dUV"G rF# @r_"9c#99.]67獘Ҽ7K9l6RJ g*c 9;7 gw r#;zvfxpɎ_E>cB 5Ұ-}S[5f^EOmճZ~#a܈V(,/ٌm5b̻-B(Ta6 \bP}< {sjb(TBe(yB(^G; mpTo#(;B> P8:O0<֢0QF(Q;&Da  Qx CU!$IIJђRRRI !*R!!$;{dgfR*+dܟ!~?㺮suݼ}l&lI&1/lMRC)al&S?ˑrV_dN߶NSyM|^,ڷޝ=sg:6^ lM1a4ó)t+6U`S'l gyhl^+?`slΉxl^;a~.l}hb-Z[+csl6'ClnaضKcl8 ۊ98C_mg!lpi_mo.wĶӰi;GaKWlO8J=i$'Oȧx]"3" <-7 f8ȷ؈'oNS2 ZOGיV<iGN`;2.iY?{L+Ct)z"/$ND~u_GUY^gl쳭jﴐ; ;8-:C%vtŎ.#-vtߌ|C";zvÎR \챓';='&9D;fbvNai;GwN,k3.aLo}@;Ì?GOcdbtևtms}/]e߉эYyNpl Nnj=D!;*P+cW*dHŮSKTTKuvbX'욱|+v `W. _\j;;޲ؕ];gav*l2 ߢk6 R'5 z AAO6K@@C F E+(0tB5Xԡ` l _` vyfyz׆s#Qp) ޞA'W|-nB9(t~߿j?Umoq{sS?;w_Zg{?ba?_;#ڝ]# (t,@UNHFĕ(tOBᔭ(~B(ZB( 0EanQU+P; 'EPxJ= vEW :tbU(ꢆ"E6w8|߸(nQěP$E}ޣHEbMAy(tEф( f@Ѥ(Eތ@i(憢L-v(d u[vDif_u9C,wc?ltfxB^?ߕOethmoƏ-_ȑ4矼3J80/,Xp 1|c8pwj话Ɓpave=ӥ``G,R+Tm'8>%WA3A1w^CqP|>*X`5An~-j;;vw|:{{ndovPSppx~a}qco{Jq~:!tj?ggd>#ދpdj&ҴۍAa Qfx /HC(N3FqgV7xe>yֿComP}7A(>^(>ŧ7-kDe_Gs([_Q|{ ?NEqi}ڋ8&qL|=I=*ı^8&Ë79&ycj86@ԟ6^8fc3pu#?cp |"q,8opı# 뱭kإ8v9 Ǯ"8co6Ժ+pp q|? NA~? ǏS8~A/+e8YǿL8v xqJ,g8~3%kmp+p\dը8oq~5P pr2\Ù^8g: OtA8#3+pF#gpfz3p&g"epfGfxoweq3>o_ٷq ~4k>9x6s98缱iNǹSQ8wΝe\Ε p νsu=q}kgY 8/0FL:+>8hJ8?q~Λ yS7cy/8^4_N8<O0q/ ]miϙVO81k~P"]{(Z|qG;(;%PO%E+Qr" %Pr=JU4%7>d8ہ()B]c뉒&(y0%gh(ye(8qi\>QRef܅ҁpnlÅ ~ͣy.,E){\ ] 7UXuߥ N*2q\،Ÿ WpEP Wĝqr\ڊ+qEWD[֊ϼ^o*=k7 '[ݲמq-nnʘx&̧=ŵtZvߞ\+9k7-9\{`P:Zi(ba@R(QR(ANGD_tJgjWPz{0rAal.aivGٵ(=;QzW?: \Eg ľ Sn^qp#nDÍ19n;X7nō[p=nYfHM)UkpLƩ6p=4{54;5r) oك;p{n)n&v>q4oܻ{\k|;4w8q;%Cpzܹ*;eqG<w$~P1 e( AXIFY<<2(CYt)1OhGq(ӭn5CQ6eQfe(sGل{(؈2/Mb٧9dC%yV.G v2]+VS{]]yeu],ܝw'r@ܝٔݷ 7 N q8 z/sʸ_P.<хacs}|n(s+gj"od47Ɠxq OI l',Em(0E; I6QmFy8ˊ>'-DPT(lA\R \S_*f@EtGT,.AE)*RP *uQ"(*61!8Yxv^E,C*\A[_<߮Gq^*סj7=>FD5g֡|Gyſurhyy*[TJAJOTzr`Tz@ T؅J?,T/G6#PY}P9њroBe+*EeEeR*~E\q+P1*+ Py*PY%*L*)TIECTEUTFU_. H)TY2\A7ԡu|0@oLP_q !TGM{ʶp3Ë] p^\.Ƌ+>^;mGGy4hO g'r^j_ʨAӝ~Tw9|ٳ|N$7ƠZ 叠[T@aTšzM=P=r7C"P-593gk05꒨h°5QܺGs~@}Y|P35>Q;5[Q5YP;5yը5Yv&jvCٗF_[Ps}jf)<ʳyq5չ=3ߦ{ jV8}P+z_P;$ Y5a8ZãƋZHעv/^ P2^Kx{^eWd˝]r<#~>6r;&7kAHxy/KF.^ {xy?^_ˊxY/_wx^~/ xxۀ%^ɦ(_W nU$RTd8WJ5x{Tj ^)3ᕺC^i@54_ᕶ%^/p12"^+:ĐoEFv8]Ûax7;f *>m9`7'Y)ěwy]="v{{a oNx)7Vsx[o?\ۯҨϠs&E]7N֣k7gxN;w5wX:sE8[ԹnԹGuM9t>Oxz7+}‹\hbYP7{G2\@ݦG۩]<u{Ϣ"귢c_͉4*|ȍ‡/k]S97뻈P8K_o8}z3%ԛG+> C#Գ)h.bc;P|Ort &+EsWF6 /}>?p|!uFQm C >8/Q6>݄Fhrz |5wǽ|Ud؃OcӮ{>YO{uP SBZ[;/>3]NX}k|zO_ǧg,> S}WaO'9ڗ^'m]?wu#>'sns󭛆rd` n7Bw2?HﲠhdwӛiMK2|t_:[KS$/js_\eXW|1>/kdZkV/v7!__dC| ܆/A%8[ n|a__Ώa`Kb r!UH_EU-WC'|5&nj8h]|fq=mG|W:}ꁯ5k }RM}1}M<ڑ3n~-5}wYeVW  k̗kՓyv^l5!י|?f[*{/yZ܏}*%|i88,: h-ѱZθܜܥ-swdo'|u8Cf q")FucJ q ! 1m qHaK#8fmi}W7 }GKc-^ǎkı3qa͹M}Qԧq8yS(!J q\DNW5o;* ;qO8n7<┼M38C:8#=3 w}&q ^)B ~oG^wv=✵}驶훵Gd KVs29kOY}| |ӌ갚:t6 .⒐#.asqIqtq!~ĥ|ԯV)q'. mk,o q2"@\ +$V\qk6玕םu7?C=ԁ_ u0ҡ#Q>~I1ҍ:QG}h4io]@mYoWEǼ)ezO }sؙn۩cLu\ؗ:.֢6Sxw>u|LSǩcӛoSǺ̠QWӍ,_LCR qc44;qqoD{3ĽoqM$"}0Y}駟{Zקu'uy:w"ÛA<݃9\$o\m~x{QB<*ģx"A3#3?$cכxйe.$N!aN<ij,7"pRtRNnoܩۧ=v\N]o7;H{2r5bWtCK%^!c7L#^)['^gs-%^r,W ޔk6{5*rīLZ&;҅x->M2"ޣ# u^o`Dݫu{MuA|թ{vq|:7fߐDsA|̉5MS!>[7ո"k/!_>|%ةk'x[Ǹ7[> Yx}ۦ#m"+vz_g/!'K ~;Qoo@)ۉP_э'{#F|~# ?C 8@y+SK #$N Щ$dLB#H)0n{ yG$+DB)$tBH(7KyI`Dz$8„7O3'87HB^ВpZ*CB˝HhdJ!H(Μ@BgP g<30;@¼$]I_]IxKv;O֑4އqۚsH83I8ą#I8rlܒo9C! /"E[W46$[Vvկ{p> FG&~$|\O.'ӏI9>K4KcH2;j76KY;D2E? j JpF~-tj20$4鷂D,#"D4ID:, 01E"kHb=!.$b۹eL-#YM";?(''HC^ͽ 91 $*$*D94CTn:չO$jхDtHtc/%QgDtfP'lGM5$Dc0[DO%Y$z7&׶t_{.uĂI,H,Ԅ55;;XQ./ b;;Į˓؝ $v7Īx>XR{Kr>@WL'qTAZ|$}uH\w$ q=wtcwt3#q+yw'qWN{$Cw$I|˙ħYt)F3H#1)$17 pXBNn$<$ƅ5F+^3yړVD $H"~ I,\A$.9L IduUI@kD~bȼNDK(C.~W80$?IJ'^ $)s${GK6Lw`8EncH2)I$ˢ{{ݓzDP1|m?h~g5s7{iоƨ~ $b!Iֲ%Mi=GRSw7z=BRH*ޝ eIJg5Kּ'\kYBRbgH I^sHBIZpI)t$=IaCҡ$#IH>^6ތڰzmI,esxy@}6ڑGvEP=ǩo#Gm^Q{l:qzCNP$I2IF,deIFd$_Lϻ$#J2$#׿>yM+HfT<7"͟F2w6{wk:D[B$۳dHW:hlo=M1dǒ.Ivn9a!&zbvVR .$٥_H6uf [$$RHnmqv\r_Erv$Fՙ }ٓzG>I+ªavRbW*"\}EuH1nb)f<%uWb$R\KyIqTRLARDIqO)DHR<<oԒڅ}%%N)Ca()uPCJSH3RKJbܤ$>$ǒROwR^AJ26dIJniNJֶ̍7oι6bIi=46#ŤTvrҺq-ksIp4)u#t%)'ڬW%;”בR)JJ6ZĖH>~V9ogp9;R?o0sE|r_ ~< o_ȱ_MIoWUi8r_RV eU/פ<`-)kȓ@RCʚCIYK;ݠ~nPL㍩k:].<拝A2Ϋp/N(1ܢj>S7,K$"T$J65i#RӋTxRTT:HEÅT"m3~uuww{q+Cef5۵d}٤2T.%iIeDR9?TjPC^Jh"fJsR ^zU'USʥNsHU !Uͤ{V/'UlR"Qrj {I:]~:=z\ZRB3I/Tj ۤҝ )$5U_RS[PD[RsR$5>R"5N潓|H- >'ˤ6g(C='y )RH-u *2ZR7#͉VNjޑڡvdkvK$H6})!4k FdWϢs64` pM/n i@DJрYz4`^M'q cgR@]Hw!u;N]jK$ukRJjIGRWf@I]3ԵI6[wlMq>H\AۆРZѡAiЇ84UiPwܕ4'g(#M9E4Is&Ҝ^GOI_4.f, nǤґ4ru<4W\# 5&\b( z3iM5HifVҬ$͏,g" i>޷-{?Hn i)-U>.#Z94YrΏ|IJ*)Gڽms3rH{=JAI;d4i%pڜ Ҝ@1GڋϒvR$i'K'=c3i/e.$lq^EEY]KyHRi_!훻ItIG tHGD:{tYtF$3ұ%KAұ3$L3^D5PSjz_!ߞv+>ֲ#;i37~74}oV_濐zy6z?gϲ샥}Ht!/>iZeIDҗ$}E~/ÐN$}? ;OXLG0\$}E>#~?Y]?/c_5p?I$O$߫t#A74 ]+I $}DEؽ$bh !#ʤw2OYդؓ~Y1e@܆vrm鿸C<@+ {Lƹd`F#;WܜqqZ'K2X? 6xXj'B}dp`,$inΝ#3-a\JJ!\$kdP: wd`w9߹S: ]^HC7k4զ! -6WhǷ4s 2~I\;PГ Pxԑ2d8A ɰ7J[2#^Pf-v"C9}d`A}:a_A2Tt C%%C/?) '"Coi2 }'*2w%d C9aId 3<#B2\T/ 2\ Q;dG;_x "ÃSt:^&Adxy6]v{5d@ #ç.ϧa}UDC}Ӈ /%#d$jaCp#HڃdHNbHq*CF**d~B)H2k5MNFޛhgc32z2+g<2z޿%dq:}Jøi~'fOV2P`XNi Iû7hB4 KÕp`n2p4< {$:LxN& RdrTYI͈F%5oK9$'eMMf^dv)%-jdՙLͯ;ފ'~3D3ɴƜL_k駹d}U4cgA#Dq!FC#dN4$fFV̩onh޲xgN4R D PZ/i Y]h4HyʄF>K洜;l$ȼw27@DdnMVG|tDf}W-i]Zϵw$s|2wAlvi^t}Oy ޏkC|"2SH1#|'L# 2OZ@Id70}Sof2ߚGۍ|'Բ%#|ÇcxKd~†O!S.d~Fvi=H2/aq\J旙ѳq ?ߡd~d^8o&qdK6g&DlMqNFdrl]/4'kLIdl d{l$ d}LeK۾J'7d['2a,$ԏ캀x&]dǫ̰&;cKvAdOO%;5 pdCZm[nkdxT~N:o$m&d} 3d^K`*{edޯ#da?h93f?ϭ*eVh߻8UJkc:Ҙ4G+Wwo;+UҘAO }>=yw?y>w3И(~5 ٻ24s*9oOcyn4ee99pSa.9N&B9"G$#Փ#g^39YLxK5pmVN4ȍ']ɤ;98HN^i 9  rINLu喒S9A^yWrv/"<ӟ}MG_~A &^ғ9ړsIr5g_!4Ǟu[Dxи}qo`I;484@B9и{ȥo;r'C.L0\3TKOA.#D %Ye.\bD.{e/ #e$%r.F.7dok+GrkqŻ,\:1\'W3ru!W*I=zkr'^*\m5w"ِ)\7?k߲umer\w&=W\ %]ϛg z$S*zKgWZr\/.fxMW0l!kOɵ4ߑi}?p1A44r~HnuMu*"у~{ď$7N"Gnэܢ -ڀ5fg[Mn;>.{r+p%=iB|p&&w %l Ն4IpF;+rw"w}g~$܏fǐU%\#7ɳnyS#ϼv{PG^W'%iEZ樺9ϱ972yy&)5M;1#7(y!ARJ^+&y߁^bkv>O^1+vyaxC^ +y-O^)2'WoyȺ?;3?zxn?|?8lW!#Ku}L^z>b̐MGN$,FD$4I MEz_l%bkEhZC.&m]G)j4e8M)iyk鐷YA޺{{1yXGא[ yOxLO:N9M{;b9y~E{L zhhzeak_{ μMޫ { C] |KLY-}ҁǓw4y?4$ן->bC_||8ȇ˟|[BS"h4Bz^NS/;4uSmTmfM;s9h H!E33? %ow~e4.7t`xN3u_i&{EfL3F4dgk4Jy:Q/.h[oI{L3Y#[7$ L~G_65Wu/NLٓɿ4ﺐyȟoבP$ ?#]/D=_679Wf9*"^D4kג/@F?#lt$o#C!?V'EΜ2?BJl'Tw@TX)`OJ(A (c׿[i?3oP[Q 8(PGG)\!t+v8LRI.0ܤ(Hx֗oS EAI , O$ϠNA}9(V px[e;7Hа}>* RYIA)H%UP6YP ܷPSPS D FAWPV)(%((È2)(L/IA)8mg ;)M*_ߦwS)?/(K=L ~Nmd36Ckm(0,¾?C($p$'BBk 9P\L!M)-B!\pG;4߻I!)svC>\P  ]BSoSq&ȰBW.( ]eFf ;:csw֨;j5)QE7f&wPw}~y'>BjR?.OkQh.{/yc)t}"nЍZ>C(E:>+QadxOcr)|l>Z /i]K) ʴ~fFܻAWQj(`x{k3h͗8B%hT)͗N{? ci~<7 |@g/js)9Y4?j`l?OC͙o/_skm -=@ vBP -챔'h'Zc~/츂 (3%ZL g8(@p %\N W>QRJ4IDJJO(ʓ'0ܣLss(Aqc}dEOS3E+X+Pb^JyF)e7J|Ej2-:Dhq|ZwJRN~uq )JCW0j>_ˢ{|}%m{U{):k\(i(7{7QD}(-؛u%В_Zra-oOK}m]zɧ?пi}o[ߝ,MKfJjY>ϏۅY2[N]h]`PT'(E D))H SpKJ1B)#SJO)s)žR,(ŪRF3:Jɦib7Ru(eJqiM>便hi)-S Z4MZIˎdӲ{hكh9PvŴ}:-'|A9-_&ϯ0ooگi961ZfHs-?#G{(UPRRHJL)R(HJ=N zv";L%uI+^ʶ@p+:n[70l{('8Ci(Έiz1TRGO(s0}9L+ϰVvjh⥴R+fYt52.=BF[)1;SCu{ESwQ(J l=J_cCkQ:J_'q[r)}J)|U&GirLK*7YZ5VyU.jr FUӽh ~2v9*CVNNUiij.n]mP=Kj1 2)CWc5ҡ a:2FPȑaLo52Fo 1f1e2SƄO~2<R4ʘ))G2Plʌ9Lۥ(3,eѢ̽e.I'(;ʼAW)eʼNzKq_(,~ _)DLRֈeķ2STʚg56eM>GY(ke3.#e-)[ ({h76zK6P eNmM#Sg%e{:0ebBZ UkM3iujZ}CV "h$ZV?կ} ᳠#nN9#)YWӥu-xH9(G3r)Gw.prPf)C9)*rF1TSMSC9c)ǡ?8)g%ɻO9c(gS9l姜mCrvΡ]SУ%țrRΡYsXr(d-圽K9(:|)5nff󚅂&$)КkiͲxZrIg}N=Ik6LkݳVa3jکch׈I4_Z}?s|7}Mh[.iLZQDkڵoimܭF.ä?vZ͑5idZ{=Jk76l2vG)Jf\G+;rZUSnv\y՟@&k~r-Q`xF6Δkۉa;ڏ1)rՄyθ߳Kwb9,|gFaS(w.Ӕpr3Pn Et7rKQ^׭R%Jyc>_ZO=8n[ {1avHz  y/ NkGV{7Tg;s pz3s^pHT1p47ˀsDpnoj0:wGyto:uVg_En7}p&{bp/Jp[Ǧelp~dtv3>p#Am_ۺ7}_/_;^ߢw ޣQ<6;v͞p_=+L?3y^:k@灶lΣl9:/dQs9<}ԋwOσ~Zt}9<Nmj]gV<㯀g\x ]YfFvGs9ݟnw%o{=ti;֢{o-A-}=PݧD^twCw>ݭƣ(nt7@wÉ>3c}5Orug)k{?%PO5ς'q|ª4|3VoՂoWo7燇own |~Y~3ONMߙ ;5|{3W֌_pq w?~7Q~#`~)K~(cV6[Gv4?r[Wg?߷=_7~^FzQ^x[ւbo~} ^ޟk~?WgKw{f?|_g}Y/W38  nmKoh.U hMMH=@@'&-L pcNkŞkkx ۢ?q#l!}%!سUMPTM ՛!b?7h:ot.|ǐ ,.`5mgE!P !MY!%ӆB?BF[&jeMw4V^nyДwg;=!%lNmo!T+zA`ǀCݷ=sWBwjEӝ?@-޹ς0oWw.~M%ۤZ%!| G~iK~q_{zow`X8[)pa(!| /@]ײCBOoAC>*~ҫ"R<"C!"!ѕ ܷ:"" 冈kL 6zqglmqЁHԦqܸ9c>,NȺL ,Cdgș9"' r"(K]"D9CC-DTB4WB4*a!ziD/x|3 Z%J>ѻ b=NBLzAĔB5omɌX wA b!bBlv3oT >^U}huov_eiomZB˞_障?4笀X62o٦y+X]c .3RK ޣ .@\A<(W?4]OZS {|g]Y.$3!+ WCB$zm$5 a4$)߭ v+!~8ďufH%A C@2l $! 9K, !=$+} \d$?4h5jYigJ5%ٹSm);WhnDShUyztX Gz1G]J?͑M]гK =ѳA셞!zGOm)gb_osq-z>ס=AjaH)HAzHkAzP6CA^O+% >LoOHO'd!3d܂!s2zf\4dBB],˴iֿeOY?E X  321Fo^߿Y"'>|2';mmܬS9Yy DB~X ׃ 7"3?^C>6; W+@_m;B׽#zOC߳O7*Ӧ@%C_2Ce*BTnp@ T*R>*Ϭz%Covy3NUi1TJC+TҠ:2TG1TBuXꪎP]*%^P{^sjL s j31jġu6_gUv7Ӡn]1n;ánɓP0m:7&@} .TmZP_ߵ{>z vP{ LhHBC`)4C.4xm5OAC [X[B|4Fn)4 _5/@~#4육a@ÍK c sQ" CX61꼃F}!4&@u4^F4 = wi\[M/ghzނb[5Asa4߀f\h> ͇1|şՄVjhqhAKZ -ٮВa~5aݔZJeR<-В-s=>kWhfA:ڣE=-B{hHh cu}~wi.?{g9ͅCGh?оǞe;V~~Ÿ]k~aqЮ %Юg~jN#UHB{!tAG :NБNߩ͹sۡSv7@hg@L}܏nM=l^ oӰSMket;7[\](]KЕ׀t=B~0inE%݈ n\6rѧ;';Ϩ} &8B7:tq-|ݽ:'f%4O]iy';7_2eǡg z3gzsL]7z1/C:cHkЫлzCo'֍^æ?xLw̖2w>qsXcȗ苌p/ C'sﴪN> IП} O?m몡ЯЯbxס_φC)BN7霛3Η0 P9;3Y t @o 0EaK: 7+aPN0xR +ap+ 0 C!14CNao"d4mP uP rk&Yh gcz/?0(¨EH5A F3]ajaT 0z cn0X+IkX.Da. c5[P o5`lƣ o. o`T<-EI(Laj[a:O:L;TrL%T%La* /u0niimIggkGS3~ gf)0K,~coo>E0]y~/Ch[kq6#cYQfay\`0f1`=fsafa& f9y0˶Y%Glq) Fj.J`vq#uֵ[ҭkw$>r0{f/4Ok=#'H9"#'i6^ו}12MY1rQ,S֊%> kbcno0TO`'b1z/_jOo'Z ڦxÜ kKXOgXふSp#e۰ֳ:*֑a?}a].#nÆat ް/{.sv]<};k4/^}D l`ӧ6`3 63a62g?6`c=iĞC0lƬD9L(͸9n:?i](l|a3# 6>_xa㵨 y鰙m= )j`V[Y[pְlM`;z [kYZ,h:[mhl+2HOT`XYֽe]`{ ؞sY ؞ȅ=E`o4l `c l7vc0lLmN-CwfomlWom*;s}.풄.z.7wv}aW;ށy `e* Du`' ;;#;uc] iMWm_4.:K:|سZn؍ aK`gv 2`vzzީ ^+ѯг |a7mT9I!eٷwvn3nU w.m5Vn."[n a2|ݑB>C,dPֵ}rK:sƕς3t1E{ݽŰnN4nρݵl[w{x}uݧGؽ {w>#췿aЃ簿% b׾} Wzƈ#e10FNcdabY11F{h`̽6 c'66+kxpUWlPJ 8 G8셣G8*88TQzcg8vpx/PA 5psp_,3M|̅8+ChѾ#CKVߥ?{{~Z CqY2rK61 ;qk 0T8S pZ8N4=?f/Ӭ>pI8̧pJEpJ[TSo/rr_pW8up: KtNNGe^n2n KS֧{q3ΙCӼoZcKfp)MMgf Ύolζpx8u<8O48Oԁ_ڄɊw|G9s 9> <69>u_L_q0cuq\iG=1z 8ƍ8x7Ψ¥}%k8\Ve_.K2J<fphPu濔Lp9Cr.sr,.7rt/\ˡ@={\vnvl,{]FIߡ=_|p]zKf5,נ p \guHN/ Ÿ0^E1^p,.0~0Wxuo +2O /񽙿< 0aSLb 7vC nmim^N(:^aJLzawma紵3Zu ^`sN~lY`wpz A{>5Vݴ 1pc} Y=ܷ{£2<Ɯx |/~Z׿icVxxd2pڂNsOXox+#h0<M?731iжw^J-/<.xxZ 3WG;xY)gOA O "\O ox  x JS`>q ?~ Y>ao3 >[|6ނϚyцϦ+){| >gdz+wsq | mvM[+WsS;;VHL51u/` flm3j1}{`eLgN1=&3>Ͼ˹0}/2,DF~}sm?L/\gWa:L?6i&^f7} bUy?,hQ~z{s*Mʞ&ѽ{axƾƾcc]:fڊc'9ufLM"A,(}pJ ?2?q׿/9w_e4 $4>&6ݱ5Ӑ"@v8 %\qO9 @ › 0-u0Aj G^h.G .ע%D[4ODHlG88tFY C]6lgg yۿ ~s@wZg12Ohd!`]F@uhZA6 lJENÜ>pr^!`@C92WMGLݍ\ƅ:V#p;4,XVGP6)#[V8 <Dp"t!y^=ci#w8 Az6zA6r@w8`|`!Xw-Cpg]s XřO,`i^~]w/ Da" W`~tv*,w- #~+O{go̊ _`P'Cp0/Gp^yCCpnפ!E?~B"! qYqASGȲYz!)IIY $n=Bb!$!V"d C,]DBHD&BG"$,!7ZѶNEȦڳ+DP@+6by??\г+ ًjBBdZ'szV\"2U! [>aG PŠ"lvFYC1VkV:aw"dC+Q}F'-}4BXI{auޑD8g 9n *p5<5 ∰##P"E@Do?^4DDĕՈ`/".r#L6"Nn{H[DvȎ4HnTHtHoH툜2?3uC>"#2t4"d@19*CJBsLȤ̿ȽY~+"AɈ5GT'ADuEDDԴGԤDGK jf#* Q ~Qa! 5BTH湌ȁY`V1?fYNFeYv5rf Ƭ!жMO3֯,c:s*Ĭ{՘uWcuV1kQ[fi]ٯfcs\su _91术ǜs0l99'y921^)9׊02Wsq̩9M6D!z 5:!ZU#V"yѓe·"h6Z"!8D_ň>;scN{sOccEü0!B1/Xb&t^kt*C,O0bD,TELb+;X՗Fb;&C'jy@ b6#Vg{”ďE<]x_ϩl7bClĮCl~J{/1B=88u{8ᮈ=9qg1q1q6ӚszWBdMDܴ : `A0߼n6gaA),xdSwCPlFg'~BD[#ެ:מ><~~4o9͠s"?g{)r-B3X] {XX h,'ba=nԠ2 =A7 j`ܛ:$5C=$XCB+"wf0LBDE$LB${jFyZ# K_ a$$>G†H@B҇byǶs!-@1V:#6.#˹kH∄Hw 7kH=P+ʡHYH4E? !qh> n"Q8W"Q@˾x~jgpBo\O"q]3/!5$(fbс X >âUX xڄo}DKI᷑БH D҄Hr>ٺ6nG˚{nA=u[^IHFHR͓I `5"i $h:T>i HzΉ M$B3U$=WtOIO -/BrHMDp$  ݓsɝg!vm=dHR L|IH"$GFHF.$ǍEr̖_sɜHN䄛H^Ln,9)2rR2I)7R"rCʗT"B,SòBXyc|,7x̩72Xf7",b,4BT,˂XeԗlblgJw,mOF,ǠAXx$TDžH SÑ:$R3!HtCOp@jæ}NR*Zt&!uR׻!5,Rs7 RfTZԳn+kԮ# 1^FjVŊӰb@)V +Ց6 i\uV*-@|ΐ||+| ~ AN4Ҵnif< ifn4cG-YDH4.M.B]Hߏۑi6^Gچ/H{|4i,vv*iz Ҫ i4/JgRimV9^4z~ݒ.+sbeV{aX+W<mkٟ[ןʇVX +/64DzzD3{gc1MgEHO[4܃UdeAzu_lCz?ۇazXuEbzau1TRJ7Vj{?OWd0dDFaOd.Eƾ`62!HdDhd"W#7Qzq52LCƅ(IBq? ̐ | Cf|d.{ %L@7Us2w"s dn GӻU>+9|u5s8r#kRd2u~_ 3qY #k ┑ Ys"+r+XZs#uYU-"#Cݩh<& M.e#wEֵK!"y";ٙ鋑ӊ|Vꎣ.#BdNX-h֜o92S*&X{VKjXg2ow '`դ~V4j/}NG΢aȉBμ8>Y/~~ D #o\IB^ޅT3cu&up8IXx)X2뜺atܴN͹ݚsUXWuSuuY=u5[/lsC팶ړۖ:5r`íܿhR45*(M+iXM IVTZFHvȈd%^ef%~r]Iu}x>xzg<u};]t5HW7CzHWyΠtEOw:ta*2tet^["ݪOރeEא>U#}Q0 =t Fz&]z`lw|aMK2R00gؾ#%}{lO}q;vs;x;;81;Pʱz%4lr?y1_8c?vcQeYV5D YcY3Y.Q,eY"kV(?A֤U~]胬e|1Ȋb1ȊAVX9吵^Y봑Y!kd-ERVݝ-Sv=P {_ž3 {,|+`{2{c2y6 {ŞoX{>ܻy{Cu޲:J֖FvWgdk"[C]^#[aU-l\dK![bB!"?Fvd {Rd{ "ەَvl;'dgΏG> ?z]9QA Ϗ~-j^u^U^Ջ+WJirGbdsa ~b~-Y__s5xc!㘈}(ޚ-- {?aq&)}b߂AQQen G!r GNR:3y r&!g3r&@8>xX!'r.@m,<BȉTFNhrVuhY?93/r rNAN \܆9ǰarsuy|~YcQߩbtaa?<8yD!+q `$a0Łp`F)88G gqp:냎77ͯ~Iq0q3.Y;VWP#2Cr8wކCp2 !!8m8eptNazLq8]C;Phzue6JQ`gâ=p|g`98,};tSp8%Oaۮ8?p4֝ÚY]یg ȕGn(v?nT\ @:'rU!Wy2r\|ۼ?|=ݐ[ܑ5iX-G!wM7䦈!w.OdE2gΰGe,^ G5W!}F8u W#b-rd!QO>`g~GȽ3{S GUP#SqDtz&#O7z]O#os䙏Cu /0VE^C\y 3$y>#b +###b ]G^ }~a*ޝQ8jsG [:]GgC8:%G'wQ_NcFXYрu/}]Ak}HñwCp@ǮHEe{Oz˪xGwWpB/Nxm_su^kM'qW'΅e'UpBOMi q泭'"z#PWQp2}NnɍprU8æ1wAy*4uIh^ ?5SN <{!ǮD-tE#?=t\*iː)   c}Y). d \EAij UV"qIu3.i%]i\2Jds F޸|.K}q^¥#pYt.y2L\P\F>.|eqN/y} 5Mg:5Ïnװ.qYu2qGW\z鵸4.G޸<.{ e{g\f.ځ#^-py .[-^og3'-P8)(7}Y5CvϹpv0t CQAPpA#Q8; WAaCsYR(<4+':߱a, KfW(|nBL}Q? +/ ,Qe>k-h03P$EQW"I(E7Bfx38KmPuŋ4Q9N( MQ<,Q<&Fg>(AK'K'wG6eXr+xK/l}vigY?s.^_.{_?u\=ۜpuB]/^8~wp}\z7\\<jq=OC6~0 w}~~S*~!piC\kQf1íQU[Sq[xhӼܖIm]m0 {eٿۖRy]aVnZIܹ8Sgo^MLR]_ڴnw9pBišoCvOڜ}f[ڝ6x[nnpoj-IdW<{pg q+ niMojX x{p/o4{+po3J8p>ق{q {diit0F;e0B2JBk(*Bl=Gɢ/(?%(g(6%"(" CJ.d JdQj ^QP>6k#tx_.EiT,Jt6J#7L Q2CP:~P:C ӒP:E .{7 *(cҕPJP7JEti6Jp_(m>nmx6⾽ 5|P7<60? /rC ǃxlJx>5tꎇeK|}}#0<|vaE~OhR\@k(@ ,e+QV6ePVb{cPv{nEYQ]bW 2(;S (WAIvǣ>y7doz~OeQxճ^$Uwk2ܘ3Oo.ExIx|zu &ᘈdF*o$,F3To;x㡋7WsN7QZ IDŰlAvSش楃I"?i]M\eP**bRT,XN~{If}XyŨ 8~G^T|r\lUd9*uQ٭G=Wr!*ڨPiJcTZGU,*dQ9 Sv<޲`1PŴEJ3ع%o3z~?ޞ#6/9omY>yxvVmE ޾x7%;k*92{QW\{ W G;_>!=">i'L|§@I|jqx/| 72 yi> g˝lgWI>UKbF}՞?}ζlW;W+UQrU괠nVuli +Pe9UfQ՟棪!5oG&sT= F-:QU9KQmyu1=-.-oQ=GzzUr/>45gWQʽ_fO|x_-ux(ڧs|uνq!NK_:l|8%N y_#kK6?k8Dz/_o1p zE+T+vB(徢RTfZiRݲjHT9jWBjQa"P=Z#zDQ=2E|TO}P=e'|ajc<;}jvT6gFᨎ lݗP}0yiF|~o]M#kf-o-.ջVt·ۇ7]AEF:5F<5b@ j@ej,Qc25o.|j^nd肚:y5Π,5O֣qjBMJԔDTT]UP!5o2\kPP'1 jEQ+|7jQ΋P+-Z)WԊd5vCmg@m1ԆIv~jW?gAQ do_GGmlԦ'vjƠvsGnrGF7n85߇# 'w!>~-g'&j 'rB&"i~"q"4"O"x1\툜?9e9dJ 9F4`$<}"#'{ o1&D;㻝#Ju*w RZB؛h&4A)Ysf2o0Ӄ|E $B4 rDYvQ[UDV'ZhQf֟'ljm۷;Hm<Rnwfb3ыrF7Cڋ8:$!A»C q$G< AoOC rqX(C^iCEs8՛8 #ıʚ8VNJXj5qqA9qݫ? qj#N9C'$9'qZd4Y~ .%.B\bj%҃K6q0 $AsR,ˆl/ixD|Cq?"[}{WqLY)Ľqg&wFqWĽ5̈{, ЩD%~g?*L/@ s/Eo4D1r/1G3 8~, m/E<$`ִoY/ϠBw5c#o$. ^MlNj^$w r2M$x_ I" Vw%$XӉ)W/ !LBH(A lO $KB%$ud#. KmJDBɵ$C6P7)O/,֕QJBW%I ':$t^YP~ 7I\ kOPpŒ:jSޥA uW!q uX:$KoRUaaꐲ[j+ux:<ˢe~$QL!5 IRʹH-IȠNFY$=E'w1Iu!mI[t8Im"鐃$}y6IFW֐tQꒌb"o#Y:L !$B2s4eEO,|zE2IT #Y$+GIVɊ_!NHV/vII(dL#YU Uf>huA#Hv,fP&Y(un^Af|Bd{l>]td˸H@}d_| oH$tɾ NGSQq48":C3SG+'긤+u }JzSs1}1$ Inw Q7#l_Ir6M$wƉ Nܩ$AN<'c:uNŐ\!{;*H{2kE+U&^$wkmCo[}-.s'y~}K yn['/e'?릐|$}+w #2$ߟq^AI~L);O!y$L򣟐WMSH~w}2Sk$N䷽#.$s"Á$/N w>I?=O|IG/OvjCGP.PR80r摢fWRTt%Ei(JB%EN"PSM UI_!)h7k)H¦HqyRLz@yHNR<CI1M'GH}1HR|Aob,RCJ|AkAJܬr'% $zRIl_c] )Iiy>)uzBJHI?)zL>)I/h^uLJHI%Ѥd̪HDK1)13XRD)_GJHi4)a%ISHiW)nwL) }dFʂ#IY`)s-'eNRDJߝHY{)k#en3uUHy+RZ@I9ӆ34R޴$T/nr$F-R^eZERbϱ݈d򾛤xTJ^MﺰמU]%n]΃yHeFRq%뵨$R?I*~-#uդB ^vx۳>e:-k/m[I5<$R)RG*WR)$ kHR97TΞ&3 'Ua!R/#ӑT1&U8RHQ*S{޴MHUˇT5 IU݉T4HuERyTGRCnƤB1Hu0zmnM-{nlųT׳EH5c8nJyI56؎rEЈ.|zԅ+K]fQI쎢.Q%?O]ά!57&UDjSHMlwRAj|Iw5wq&5PR%5_"뒤WAj|I}!RתgV;BҤܺnP" yKҐ[C3r?/HC[O"iT A٤1@4f0a^3mzSڤ1i̜Ffՠ1w4z04."il"MDi$~!>'HsTz4,HsH4iMBHs ҴC.Iii:ʐˌ QR94x.@^<9viz"MQ64X94f;#p'iιF]Io!u ZL]{SQh ig{IA,^O'2@iWHsc\CqH3v2iFgW|[r yauM3u1^KcJzv.u-D]mnP'uoD]Kҩk>u}~ͧO|LȐHK:i2 $-է27]gvLLHxig95iM]HZ',~u`$i!ui/!s6uvi"k<-H.Һn1)OPJ֐3=$2UCb_H[xiw#mxnvRҖ#m1݁$z:%cI}^KIH;QJH{=^QY}uGCIA}y$u_VKݗKD{ummw;ubvhPLECOmÀ_猩5~7aA=luǰch;zx|cRy[17a+B=wm]oo6eHXN= Pc3Oa*#]j'qPz۪Wr)T(:}/,"Q7˾n1J"IGo'nc1׿1gؘ3nY Igzv%ENX%鄤68z]їuecUtHW&]nQ ]IIws8tOyҽIr-5}t ݷIV-'OI0}tr=rA=Xھ)Miң=븖dHO*I"=^7ސX k #=jKz&7M@z$ қIz泏$;ILһ@zMzKBGK\U?GޣO״okYq&5vZ/.@=c6tF=VRϭSg`W9;z_~L9*zN>@=}PIөa F=eH==QϠ1Oc27|K=Q/$QZ]aN9hpwz)ZKb>0P(׺S+CW`UI.WSMy?|^H2UOGRRYgՆ߸~]<> 2@ϑa'u2p aX2> >%IsЧ/zyv2 M%C2fNC?72rp'2 -Ԃ C`Ν0d6&+Rw6 ̠~:ԏ}_(DVSo~ ]C$_A()~7~_;;ԑ~%=lBw-]u~W=n8{?:##ٗd$2L #ud$>rHi0u"#OdZ`OFHc9k 2r odD.!dCF+10lް3+'YdHFk(JF (]EFXJɨD2:דу{~iX-s%c82KF#kUu#Sȸj˺C_2CüڑA!_7/% zd܋2Ksw顇R%Jd>?Le x<ݼvwMzL洟Y 2Q'!d2h8 !D21?D&fU ^d_LVIId@&ck!Qd%2J&w=$2Nb d2F&kבi329LoNu}oa>\K& 2yALɣD2Ktj6N L$2.#qBd:<^>2u;Bcui0="p2 `{t)2g&Y#tf2bDdL֒ikM龇dl.2ӯI=&˝N'3OV= Afgٛ\2+Hft^6ݾBfzdvy1]:Ef?d.bC悻|L2Gfdg+/!nd@#<̃obN2" ӛ*(! 5d^},xYE?0L#b XBf9Y& G)d1z0Y\I#bn1Y# Sd7vgż!ed,OEXt,N%U b%۝I˙A,>#T#HFŖ|H@"ۂ,v+NݑLy{b7Ycϋs.gMergy.#dQGEdQDd%Y#G;ZI AH$K^4['ඍh54DF&d', ed>YUWu.s۾oo[}Y4~dy0VMG-7vrh& Wo؛N@K4Pg <*'h;hPQaD-i]49 *C.Ax׻ѠkhI4Ul;9J?hlMipG 4تeLwJG`;=Mw^i0? >A!&4 ^4DS4_GUWb0n!iH bDCz{9Kq'Ӑ#iH+KCVѐsiI4dn! LCfn൒%+a_muo#o*g۽;'+>d۞tOU 겄T}JnYu\@V-T4껵&+Rm;WxK/'ϒ|*Rޑպ?eڴN? du1npsJՓad=YUF՛4t )DCBhbz* =F}ޑ4J֪d-՘;4D֫0L!+za=j"Y'kh<jIOOuYY?"GQd]RFþ Ұ/ɦ 2&;5q:D6/M㮭"J) 9ds'טL6O>ͣ dSldS@6ް^k>|!ۨd;/l*h]BC֑\59Aɶ zɼ7Zs݋D{CvO{ 'ɮ*pd1?x :6=wrùsοclhU*㤑:hdO4RE#}.Ej4 4jD>FٯQv94j "CEӨ[i3m^êe^y_!^ò0rHVWWJ8͕{;srԘL*@JvrxIkc(r,Hkr<~|9D qSr̩aJ;r$BFS$NN|+FN29}ON5{鿐~_r9\ΓC.rB..0ȒȔt!9\|9?NΏW=_Ǽ~Ow:eK?rX^;&rrK.We'x8u.Mmɷ܏/N')e_br|`v'$REuarݨBKVkr$Es5ѧ!FKh抑kΜzp+pC/N\?+4eN4FvPMc$91(1Jhg~81>h7Yޟ,1ɏhLb&YgLcRhQΥ1;"B3">9f0z'7ݑֽGޡy%m, Fnvoӝ܆qې[uV~8H5%ƾ-Gn4w[>$dgr;1^ؑ#r{xL&V2j6[.}BnGsr{܅;N6sjg-{GgU<߻=y'7ngy^`yC<4sB[Dcﯫ-ڑG^>kUrw"17q%y &!5e_X4XVɝxcο!X翸ˇÈƽqoghܧ42'J>Eއ!7"g/yC;mP߽wlO7J0yJb~?[ ˼^E%4֧uVav^^vV=ڭ{;a[h]4Nk4>lM3GGi4~R5ELTEZG$|lO(8L>:|:?$5nJ:h WH>}=ǍkUqfP$+s7Ϗ"3'ӣ;ay,F>ϒqA My4o3MY%>I$q4q}8$M&4>O&E9n&xФShҪ4)y0I 8JƓfR _G3gbM $ߘLQ3=NwoBݷ|xD7z5{WMhlI>=I=S}3|y4YS&d4",y& {d!w M_nG14}vs$@3thƢ4cvE3Bi2͘L3,vl_4yfiF+j^:ټG3_h)dwފ2/=҈6-'$'KD~Ql^ԍ"3.ٲ?a3-fxc3!X OmýP򻻎n+w5'w4NEYiz I'i'f;NA4;p-) 9wRilsqi͹P^ ȧ9WМZe5HkR9XFOSI(lO) v+@P *@~6,h^1GQ} P`-nIk*(p=. L4b/R>cXF$(uVsO{v4412Ph ʾMA{^1]S&RPf(wCsOyh/477Osb47 'HsngxB}R VVNl#J(xۉP=Ǎ`Oc .`w|؟BD!)$.P'YH!)dklM!k5_H!(Lw )8I!/P(_4OPO9(TMBSY%*Shx ]؏BLj?-NBWRL,0+KQ4Q Daf6|v5'EGaAW)lN&O9MϱHS>B;RX 5mARXӖ;QXJY3k]9m$mBᎷ)|~ DG(<·̦L t7nue{6_iUI)”%a3"LpExMva`psN~(bMq"\swn:EL|yF" <(E^QȢu&EVO!<8O JiW ɃLMiԖL硅8J ϢThAM-fH 972\mPTB}eZVh Z8D]=C C-7fa`LONקؽ~_SZDQP\zp3ez)NQe;}U.OQoRT8EshzOѐ)Ǝyv56 W@g_3Ptrڞ{+GPkvVuG1kN13)F5Ű)W@1*bB$)fbD)݌b\P 3|4b>w(L1'6+RLYG1_K)|1Xރ}bU7PJ,*S}2hR<#} y?Ov*M}_|Xԍba=Z,w}K;hfZ,q慴ج -6Iņ3k}hq~ ohQ-66}0\ţzb8YNw=xhq>JݥEiyv;#Zr%yP6K4~ 9Z~_/N_ۿpgi%e]Ҕs%lD qJ P֮piy)H_J8A (`4%oZաkJȷ.'}Pƒ p %sp?%T<'Ŕ %[ݘMkUiyZ%D8J'-ޝ]DHrfL*A8j{Gv]`ڧk 2_ğmο->|{v%PbvJORKJ|I(%Rⓙ3%~H)%Vf1Ċ:L#JZKI;{SR6Rn=JڙII7OPҕ=:M+D mbC [C+fìUbNJ+=ִRc Tz5+d8%%JHcQ>ћCQrMJ@5wi~v.%͢؇%oղIKc(yIJgXѼv0%`%iR|mcn:Z5FVJUhZ>R8+T)ÀRh,'1d1S%Prp+hS_JMJeK({A)wSG ](<ЉRn*;JyHkDiͰӴfhZp)9 Gk\5ҚiM6_Nmkfsx#nè@0bmD<*i?jO\|i&mI~SɴIU6uM MFiW]ne| 4yЦPS4-6m/npѦ *MMi?06g=i. ڼ#mQCi*,KiK)m1?t˔v 8GiQlJҊ(.^`ܴ:?+IӶO۞sWGf|r6Kv-QJuy'?o[u״={X&ah{#7L.UTZj(i~,kk53sޮL{lx_]{-v??+'vڞF9GgfSmj]Ց2V uuُpM"qkA-AZ~w@5-yx3|MM; JbNL=}03٧}vmg\]iߜ'gj?skq1ZN`1U߇* Y\{èm޶x;8BZ-ޏg׆c=86wG?8jscp.Z(1pɂ3^ Ki-V-i6u)8/J8p}5ଘa.筤:/o{~ӹ8w]wߔwlqo/8Lյ} q_.6bzk?l.['p٩ߺgAp9d`0Dmnp ؃['7uN!];~/owqgp߼3 ]OGpjܵ;XfdrL,2v^UQb^|5Lo z=UޖTjۮY;T_w^`kpN\9>䁯2 L=G|]co ͊_,Ëvf^/ژ!ܤSr|two&J30^3fӂ8?ĕq sͅx+~ q˥msضeyvOX;2?Fmx'6z?4wߚTHd~Ď = M w o6xڲgrc=}Z7"!q?e !Ib} IIASHARt8$dNCR|$ )I=2:H,HCweWwڷﻋohǬLu`UWؘl]BksP9BH'>p(ј+: :r/:< T6w4?:4#@v :na?=p˃#8-ptyP'8dzD۽Cp {xS ;*m8Gp\a8NLzp, pǑA8=u?NQ` N8p 'n665N=}p-p8gSJirFipm޶x]ii58Twpup6F?8s]y&8fgˎpn_-sikWpRp+5Z( .9 \wS5\3k}poX&9\ =?5 {)4YeYIiϚ}SzpvwǏA}NG;w p ݃KYy3[r ܛ;$="q~sjb߻xoew.$iQ_~0s2|w\+7ŕu?+ +<sݏA[9 !E < a3j b =m~ᕫy{@eFA`q b_ 0e<׸}F !m>/örިBL]!p ^5+s?2 B#!d B dy Bz!$/BCTB( B ^d7 <=gf2A]vB~(l6BlXĬgAbS{N,'ܶ&L[m(61ݻ{nSMeSɦ#?澆X.ч?جgLXXP?N_|lĮHXĎ߁u:ja$=61t";d0ir׶G ~N/aІY?YU&$ a #eH= 7_ ǡk,  qQaXI|滮 k3 QKՐ8+Hq浓 jaupS@ズay@d j3 l[8{_ yP7Lq ?{e:C 8zK }18au~ ̪àuժC 8l68c!Ffc֏ ki=' 8tGpv8{- 8I7m g18gp 7Eί ӆ?չЪF{_N3x.y\= V~Yz[޻9:?uGp1}kR7s},(6 'Gx#2a*xǃG:x:}iUQ~x#)l[V%x|g-h sqs'x**+E+!Wʌ!;>W཯ 0޲>- MN[g{RW eV|O >%S_*i  3?|೼u}|?ʁoB~U]-a /_1q7}1kiu%w0}&k31=GUk `31W!6i9 y B {(^h4 ҄`F+RjeSeHePcX 5O>Z/ J[=O!m83=]gՌz ã |uoCNDCV"Cd^?DF탈*D@SD:DT@D}6DL(43uYa{4qzP8SW@}7] 1sG}&՗u[b 6y|='}e\KaSAl7nb9z( ͷ"! ~+H,Sa1!z4$R.Ab# |e $Di<$o L\yA*)8 !9DI; p#M x N`g$ǝKz:n\ṡ!\y$!};$w26ԳؾG R&!eRf eR!ַpE]*~7T@_f/ԙ:R@.Ni+ T=C)B]H]ek9~R7rܻk^PgB^?C8f@! :E} -W8CY22n9[ZH߷ko7JCr7VA-߱%ZawӲ' x.%-2fA,\ ˩62!s@Id5evAV< >gɊ5fBV-.pTd@7AY8e㦣c|:.SղjCA qe:&;:{n=V?"k ^'X>9y=}踧>rF.=}u2#6wNC;ȕ߭rC9'^@C򂀼D9B %}B1 jO({M`ޘR?v' _3?FyiwCtgk&m6/4ј YN;IW&uE8at3. S":=EITaNݛ]>vx۳o?ޤl(:m~hME.1DgQtAgdt:Y{:wDY: zḞﶬC97EBA } :CA ~Pz aPfP)mi9l^(PHPH d-PX )/?9*-GQ( EC(qb󒕍jzjP PYlϬ7 ub4;#&㡘 硸'7f(n6g|PKP\ JP˚נ[j{xXS}vjJwP ;)P+h?Zzs>ZE?nw\W]3 נ>7g19C=XNP?7|wB}Æ-{dh(BCi:40@C]ڪ ug[N;@}秶 m2˧~,E[wiGadϒW׹-t8~T3O}vci\kWC4d4>_cZh܀ƄИSCc%X Z m̟> +ٹy8v߳и3Qtqи1V֌i ?]xKx_SQ3CԠ5 <Д MДf=Zbyݤt'Pޏ E4Фl_&]- (ҭU Ъ:u } fmЖmy }_ږo=0C{yhݮB 1$鹻gj/l{(7@[=zJ6=]@V?mk(zΓ"Jhj륧m>-wp*zKszӰAhyY +i.zCYfL>>i^kS 94ϽUg+YA'ALMiȽޗVb`u' ra ,`LX߇09->0pU!0$Z0` o*]K0`aR_܊>e/m-mzsl>jN裵Қ0TX:ð+ `5-;ֲ'вt <>F{};iI7İu03kk },ahþ904^ĸV0:Cеn0$N iZ0Xh.<øQ0yo'諙]Y.8w;3|aQ :eq|_qyUiG}^ot .n|&;s@߭k~~n@o<[Vex~떣0e Aj OoW e/kFKj7۲I8k8K ;a9H.qvSm%0>uヨY_v\WG OBXuAο/Pp0`؋U;ͪ  G{$iԶiL޾>17yO B Kar&'|[0)ӓarL9~ 0&0):S={(I΍邝0f0s pau0+aVrf`v60+`V~fߛg=;㟟}Xɵ0<sa \uT׫#a~u,buX Saqiae{3E tˈ!\4 1\% \<Y=a ,r$mX [ aY7gaP6g~R.@h t0@b t0pη8_Nc=ЧRA]0HcuAnM;0HcCG }Ad<1(X_c<揘A 1hS( 3C0LCvJ|;$J)V2U?3`eVa5t*wS e Ɯ VS`5[VsX6-թdX=Hz* 絰*[aeOf;mUV5Sݼ֓:C`}xFykN9_ݼ˷1-Ä<ԦV8`(mʳ:l/!lϯmU &5 Zt*lmSak7a`\ې Ӂmx4lv9?|a`ӫ l"`[?=cfϱ{EvVsagmƼ&؍\ٜ ́A[ m |;vG09;v'mar}^p+}a' {G/L}TW??,.q ؟Xv?aVH+ɇ~vY?^+}vN_}f3rNs /p%n WQ.0\;k)7-np{f`x4,1s9FtVĈn1z5F$bDbHzG1 > `iQE0zg0>Ĩw}0F-ť1Z %1Z*;aqѝUݛݟh{D0zTѾ0z>s0: 2O0 ~ؽhAZpJpPծpbڲyZzp `z}ptO8dD!{ !38`48\ȂÇp(G8ÑWZEpd'΃t98μY跍yMpLԃ>NrpRTp_`>"lpH]qnº~,nWn6E nS6=n3}6'+mܼ۟Yn pKzYp[-4wn7vOyn]0BS>Z^p La>g%C p_)pOɑp:W0{|W4WWP|uQF3aeIQzvBxDG2x}REx$IcEDζ2<+1c^K^/YR/(x|W_xݾ<|52"O6x孃׉m54x=wx=g{ٶrmߜW~f?{f{Eu0*6gU׿g88qa8|CWa|}1_|L&t|oǒ>j3 >V3t|l=cW gsezrN ?P2۟$|?>ޏI >sv'`&|->'7|g~g,`ELVO|'>Xv/sS|>ׇ.]O;`꥘2 ! 0#o#fecƵqC!fLQBm'4~7xloZf:171-lo Q eu-g_s^ͬn͒k8߉+1[r fw09'6?_tٟ`u]s3p)bP̉911's\= 1g_8߃9` ups>ݘ @LRp#S& @y>TTuah%@8$~ohfD#Be4F@a~hVk>sݙqi +x/ h1 Eͻ~34CA~4AU/9|s;a  07fܜZ=dG bg{E`ӑ}!xh{!8a7DpEpi .B"p!yюX4Cn۞Ӗ]>'ߡh*Ӛ=@pS;^ M=|3c=D?B1!=b!]c_N!㌐wYu}b˞ r-6a<s0wMEظi_>a?n!2*a_}a5<V}S꽭kùx8 n!\i9es [&"<63??2᧘@M^R_o!3W`^?e믂ygau4H131(]aGGL|q?^'Xa O]k]{єf׊y}F:g_p*1?c?'`~5U*kyۖ=a.[(Y|oQww~ҺܷtDԊ"{,"i"!8"G!r9D=C%DzC6"gAqE Xd mȮ'xJD}E7nDs( y#8u-4ƈE+;H#Zz>eٞwxҿb+,Z.e:XGwi7|S_Ϗ=QsfawCtD#{iMÇ5S9{ۯvDWEm m^F@&b#Ftbĝ#12#?1 Űb!y.b\^# b&!f"f22F_4b3Օ3c,USqEXY揾XY+6~"cN."YxES;) ɝ? Ya7W!K$kk_i< 3R>i$Fru5/:"0$ڃ XLcЕXesVcug,jd4n^ӏjXm̏Uð~-V#75auV H!uH):H1 FJl;'QHqW#"R&h"e!R|2Rz#e= Aby6yXy\S6=Ay_5`'mT2!OR-g>Yԕza R/Aj!/R#^_ZGX=kuDnŷ[uuϰa11:ëX/ӱ΄s9*2ͺX?[ӯ b13!J1MwGaclhcEx#6s{LlX~Rgj~ɕ4mHԱQF9gMcatlѴܾLlʹMWa$l:9\lslx?t!6yW}l~/ð6揬~EY3"Mic&iL;߼fl_fzi9v2ƿރ>i; uF"1[$mE[Ef(bLlr[-e8vÖ ز9[Ŗ;֣4ⶾ؆ア.V}֯_r?=L͔2ے`۪l[mW߯)Ŷض.O -3m1aWsj{>`[1w%ۮnǶ;Ev/iO C'vɖyZ- =bAzT/o}^]3ҳ"}/v"=gKY+2a\Sۍb{i>.`iI%(!#{޲ hgEMKB x+&^nn9~suqZ9r>n>{}s(|Ε'ͺ>OL >/'_>+÷ӔZv#|B|9kk5Pߡ.>;=|gli?s3y_T;s Ӎ<Osw_/|KWa zOs{/خ_Ʀ;~43|WCKߘ |8|[UŋZָm^Ş1h pe.&c|.:5FT\<4qGi^[q6.b{L%7g/\KF{20 \J\KI긔KTXK%kQ*X2 u_Nu\ڪ~ [q'6!boï=̀_Gsu ? ;u7d¯gP ~gB~Cgg ~o!ٞߨfLx!s(ߢ[foZa\ߩ;+ ?]s?5'߃(}ߜgop?cpe^Kg? *Wz? O{g:_5;g6gq 2d3o禽~xnf!K!nկ\ @ץS9Q[ 9{ #`G8n!*CPE`?ceFPȳQ8!p| 'vl\l\@qCqm:"0.I| GUdn#0CZ=cӞ ԃ H` !s$ra&tFrVs;z"h,<!(Z Aw  y*6AOb:^&Av0AyA]T䍐ò9Z99!4^!G2.p[{=?!c4 ![RUE( >A^X+Rslr N#tF6B%ze݃Vw,4R]_VLe U}=W\pe5(jHW\M/jV*Lj5\kfpm\Qqm6\[ W:=Juߟ~9h~_:kNc3jf߱y]_kaJ}i0C6a*6-SMَ8 a#lZmo{7<0]fѴoN6vF؁hr%pa~s",4 v !JO",7]npn|d|7nv!7@IXp@xHC~9ח>hs;w*1~/#){!QoB%/܏/; ye>YF-"8"6Dt} C=ahÈwaz!b "taA\_DOGĂ]XɐEod;[z~[gvK;GU!™y9+TUOug-{ↈljBnzn no'jk-)UzVmke"ܱ;@ܙr wbYc;y;pb,{zbɻH%sDvDdG#D-F!" rH"j#rDF4D('Qbl=g#ʙnUBT1G}}DFT*D%#D=;t * QlN@,y&h-CDwYݽ׈#1D{B>;} Wf! #b"F`0bJ#61C#Wbj!^8A bv#f0T#/bj|˻ d!PU {7Bp7<wbv#Vcjc0Ī"V]O;7#vTUax8?3n"hĆ{v&b/h0wq38"!nn OA܈37O؅8pM=i5[tqwC:kQqq;)l=ɸٿn$qUp'W3Doܟ<㾓KCߌR_~2g+9^_B ޸5Bш.wAauğAO:3 >"ֳßU_ H{V鈯Q'HNa(Ft4"AS Zk|Y^Cw#!$n!!Bͼ )Hxޝט=qm8v57%$]EB xPudDH9D^oĶ(8͏Hla!{"q$!hO!t$2Cg$N=ǹ}y敶l粵-hϛ9sBO/$^ -I, :IBZ6n@|W,!JIS4<!i$Ed$9/Gk&B,I+"i"mAz$maVn$mAy4ᄆ*k}tXخz~L-^~Ial~k$UD  fi g6ynl֓9іDNWU_Al:[x GͬiO\Yȱ,D@n 9/ɏIDΤqAdw8.B46sL̛[0y}s̸ܴgRqM;9 W,rU{#WM6u W_;Փ1T"w)1 嬧GR}n:{x0r=6! r s[mSs글g ܢ^- D yx}+E x_D`|Ј[|M‡^g$|ܳ`UmgZ|YO1y\CǣB^9<َDޘg{yjțVeț<''rF<ֿTy[65{Q˹/C9k]B^ !/ BܑD]=ff%֓S/A^9*1P|>A0x"4GgQȗ|ŝW|qW@-z!j.G^A9CQrA ;"<7/Kˆ#KwlB~G=S^ a?:i*ω Rnsȿx]_,-W߯H˽ryN_\zވ,NGo QoYZY DYIMtDՒEA(БAA>(YϠ( SN`0 fg'X :}޿|Co`BdQGPp??\sPlo*;LEA >+b< y]Qȷ jP(ljXorz ,L??og4᳗߈7ʿ7¿sfg.ԴEve n*d0¾@anZFpP8doFmw2@B݂qQh/\wBGANBtcC4>9WQx"9ŠO(RDYD"C4cQ)uQ5 G 8ٻQ4ΫDт(>4ε>6EkGNd' E^PtE篢B]܎(zP-> 'KI|ƧQ4=Oħ%.J6Ӗ,ǧi?ӽt:> 1<§ex>CCxs;Q|a2/G(߈∋(DK?UC(~5q.?~i^t\7+ yQ/ %\(.g|bW ?JDP"%(b(exU((QCI>(EI!A̟gP%:(~%#gzJFUdLWFɸ2LF(qNDRu!JVT1O>;܇Qr%(9 SZDӂh}{`}3JP%PJQʳ]J[ a`9JTlJϢTFs?]ؼ PJ6\(߁ &j*J:tXґ*(f>w~cƪl?<SsXON՜܌Y(]['=َ$FEi;}{PPXPz=yOd.}F;ӛ(M\[Bnk +Gx;I렬D)+4i'8=G]dgHGE)T TJsMԟhNt^JTrKƍ*v\]JHT^C"TfAe,Tf-:FH;T GmUc]Q5n![5D8޽e7Uj!T9jSTm}*:<3Qui#^*{Q U6Tu@ճJT=_mP| WvCev7F>:էo ΎA! sGQշ6: q~ T4TDj GTwD,(pjfZeU}U<-~YSJOT!:vZ9漯jnu}AfAn5a !`)!RM"$ $x5XJMDOĉ: U"mDå;҂/"q\6S ~B{P'|!n͜qulIk;ďÆ ⾙H1YĝI܏/wBB߽xW1K<vOb V"se*# koOa)@<%G*NbmkmJīUCK΄x!޸ěFcC2YsZ}kG|²{72kozGi-?#s˽ |5s/o-G|s[Vw"/8Z=V9[ջ/ߧ"AW#' BQmH  d=#!$Ίnm\HDH o |$/KH @# T!R$}y65˼'6=^9N$8WM$ q$IP,.&Rn," ON摰( {"mH؏|I84 kl%a/ ??F/ Hu;Ϭ/~p)ˑE"$b{D!qr$2 _"gYD\H,Ʃ7MiW_߭NnV&5sIdm 7#cHdMD\9|SoJ;eJuusޟS$rfeN$3Do [yD$$$CbHl"ߗ3%$h<-a8DbK|Iق\Hl1^!;HJVIbaI,|'E'۟I,2Ģ;ay}>W?:LR!i!iQ+( *@ ꑤՆ.0DR5F%1Ia )eN)[IacRعD㤰axBB=Re=I!I!'񡞦۟mUR#%?RrFJ[ VNR\=:l !/Ri?THEՅT:2欵lHEt=L*z;H[*R7TG'#T\" 'H%MTcJ&7%U^gRI琪xRUUHuvR~T=HuDsIu^ _O s_:/Q&'Nj6K*P'M}Զ%NuΊyGRCjI-ɎԒ< IemLzY^1߷pR{pVWfGc'óƽ4y?x,ũPB kyߒ}6~(sROD2Å kH= V1$Ɠ WI=? zIwμ݇4 DIGiI +4z_#>i1*488}1,iLXH;Hc'i80}kҘcGs?S]>G6nLHfNg} ix ӻIB.iYח m FG4FwRi$/!rsOHShiq#MaoIb 5oDiIfiJLhACۤ'i.Z™/#MYE4ڑzi].OHuyпj3#HҲLZHi٩2|$QIkt2iKZiM"IQ5y6i-BZKn2ڨBZ!݁v֮uixꢟ iL!@! CZW5C 'X>.u='H+͖f bR^A[gmKH{D;Gm3햐w=y7iO+%j}C̻ioF۹HÖt iK:2 [Ҽ|(oXK=]D<]SN\HwM$V A+F"SԼưYnu5$RWԕ-u3]+35$P u}6>Sf-dIOɩ3S+%=XӜGzZҎ2I/KMׅ" lN-/'ʉG&hM݄H8u@4ը{wWꮿuQ`ORIʔGt!I }W%_6 &%=H4?:O," /H6g}q"9M H}Oտ'E)#H$N~/@e]Ȁ1.">t#}KdПC`> Iے8g20 &'Qdp\zŽ,_WMcS%2O=Pncvp|7!ppG2 pS]_as2|hwu3zŶ'QǨ#d:W &d'o!Mԧ)2z 7] L㸝k{Lgr[2Q jQdC&]{62YC&S"XN&'drZLlu_Lk׿j٭ȴ2"S`2UHdکIʹ Z S[d:خ6'7yni2]LW$UdڜL(Z R2ԑL7c2zLwse ox}}FS9[oýL2&2{GfG2{՟Y32˚Df9~d>>s02W!A" |p)4e&YO|b2_C| ?ϲБdB76M 2OHޒdV!d3TN=)y+!Os#RP?DkN)y4̵⬥pֲuyԏ}gփ~ԏgu A~#HK^+uAmvK?'RΗCwrgw-j_TiMg=dۇ{D+r%9!d5W!%EOjLr mndu3Y]|CV3*Y! 'ޓN7[[ѸvoY%G<*Ȫ Z.϶>_iRuCy[JCP4Ti U>@CUЎ<4T b\4Dnį~<4WjYHChXz4;g& =z'~ l\uoi8.&syɺ2'Md]X@Ɇ˾q>}4@6UȮUٵVcSm<l݀jя_՗ckʠ ~kް"z:Rd~K5\|+pobڷ N: ypW_tyϏ=M7F_4~›zPMy{έ`7W\\u5snWappe.o Y ֵ6末KY睜7-B[yh=mq5NL3l\x z38|BjHx΀quHĕW@gHĵސ_{!x5#oG!QmvKr0 G;]SCNhr5Ѯ5)D;vh'gv"^hCeA-MvA!-S3{s6-c)5|; N 2Uv5K=Ҟ@*2ҺO y&eNBZ:Ғ ݮҢ -" 6IfBZClyCG38o6>#w/9piyZ:O|u)1_Eh4/Z@ڐ}EV^*CAv^ @֢hϛŸ ?qo^uCޯ{Q?͠K9.ڐցLdo1CŸH~`񐹓27ןad8A&q=dL!sok}>ޯKdb{|V,o9dy>AVddTBVԵ.7K! YMkJ~hp@v3}2Ͱ mi_I87MSVY?Ԟ?ε.d ٥{! sPdLȮY^N0@6dBd?C [=dy] I' !?B#!?#߂`S[Z@~]N8eNW߀}c_8ܳiQ/ !?ZgFȯgP߾6@ȟ!1{7Y5>wF8@>I OȄ|dNJA.{b!~OŐRbMȿ,R +Q5].ѩyrNP A?(AA3oTCP뻠p! ~m]R+KB(fx B«Emg(jl(dyo(fb(B[(Z7UAq(dh=K ,w˃A?)tTm,` bs(Q @(VbG(@IJ$jP2E zPҝ%P:];hAiSB@u( (] t.2||A(Ee` Pu (9A);JYIPx*HJFP*}b( y,t@ =.AdmԳDttHKӞXt(QC/_./VW;WV NCByY{Bʚg-*Ce T쁊gٱuTesCPH.T^*A%&*5 6]n~hqP !n`nɄP]k"+z@uY{ :oP]: PyӜxgBu2TmNBuT.T-j}j"UUPU;UD*CU!5T%бg):Ojf ?T3r T%_?̯[7??qLs>6ݳGٳ)}ouCߡFƖo9۟-93/ -y_m z% +mt ߊ7q?t|xFA\:Nҩ$b$ȇNz'褽4IIo6:b`k6gtjCZAԆrgCmvm ۠9 j,j9{~lv*jmY@ͷjq{ԁPP{s$bPehEJk0+A]Q c.uƵK=@4܄Bk{Boڸ4z&着2bs_4U边OХx >9@3 =uq߼zĕu=By.m{KbC7XtxC[Q,f8ƷE O]GUm -nSmn:'ﺠt{n:v#n:զ{'stW Aw^.5yx^ݧyO&G[>gER螳ݳ֣{Fw+Yԫ o1=S`PU`P6zHm?5pIa60t8 0WCHV⬧w|`!0U#10j`Xu`a s`4 i0c==%=0 0F wsot`8at F`ts*"&ta>F9azKVC} C n'I \`Ɗa,on`[`y0-l9}߅qt.0^y`i>{L`"gͷ0Q|x)Ļ7L[&5[`e `L>LMa; =Ym (Lt~L)3´}af(G_V \D_A)+}; ntG?l^$ZY0ss0?~>8>Qa~mim!D!?~*_ЯjXU+~5ѯ* Rjh ,)Xâ\XE/X;_m=|uObhX8F¾, nXRS/W]|K<~Fv~*`xgכ0c 0ß h%<0Bd'Wuq9z>:C8%F0DX)y1Au##FlZM!i6a#6җ`#Uv sEa Ξaߍk f>lvnYY6cf$،~Q`c76)l '4үᾑu^f?l&rφMN ϟĹXP7oyTԄ1l.Ev7_<&niڣ RIP?D&lޅeM+l.SMq lVȸqk8lu`ayyUρm'=v[Ѕm/{ʰ-zV ƝX}ma! \ۀe86ۉv?Utvǿ~_kCkuN8nh EFsv ?"m1g=7v!v `d C۵vv[zcFٿǨvr1FŨ**h0mu1ZEal>Rac:c̤qco1Wc~b1~1d%cBƊlc׉#1NH1g,q `W':8/0/㤯a0Әqa / p8sP8g_;/?`3>_(j\/b|`%qC1n{q"0.yEƸ@'qb/{Nb=ۿvXgϿz?1Y%ł^(r5_,?cB`Fa]6&aB#&_oL8 Rpf &Vi 0bɘp" k;`BLHODŽ71ey(wXwpݵka{C&쇕~}4~!؏ `?3ԏ~m׼0Ld&Z~r c,/מĕL Oc(L<,' ~' ¤Vd{ #t`#S0b D3Nm7q>TA ;kP0Y& ?6B V5 K\ Srbʻ,LɎT L~ŘW]b\L@ Z(` yz L]Swuu{[cjZL-ԏ(ٍ4Uhǁ'A}~pG [86kc*ofLj+p u;8^6c&Cx1M<xf‘nv,^Rp" 8歀c8fy1?EƘvwrj?醘aF }3CI71#Q3X|֦> fjϱk/N j31mkj0.3ͬTbfuqfw̱99Ǧaޮ f:Sl ]13H3t0RgbV5Ʌf8Ni \8ٶ'o3frP}x.g0op糙pθ`(SkV1pe[[8 Km=/<6pqp{ާ pPs^ k#.p& b[  2h]~p9.{Weut KD<\>K(\#\>K`d˛gpy ./\R[iқ#{,zm=ӦNOpmfcpun'lW|R[}e*X/enaYkXr˔RL1JL-9Դ.|a]>Y!t\e.XnZcx,a,3[|TX,?+`0萍™XSObUX3<2+Mr[+D~% `C6EO'ek-#eG]n-6`Y-{9CB[JoW JblV\-P}ϕUv$vgakتǏaW]O<6 [#%J60^'l} wymK]r܅,B w}p7b{p7wp=>b:܇Mp7g*jVpw p]w;.[<〷>gqkniq0  q0kf`Kk,Ͽ Rp̀_{!-5RhC pHV dw!lg!)\m8Oá~ⅇj}_ݿSu~ϯ5GzFH8bGNLl\0_h#9~]+DFZ&fiX*#U}p7r;nbq]xG|Aw7 Ggѽpt7.=3G|pR*>P+]q4m>vuy( 8"ǖDZE8xǦDZ^qlw:±8VJLqxw]ZOp\!5q8s ǻ煾35̛q8>[8t/Ɖaq²-Ex=q|,߮V[TI}MzvNdMĉ{qn3ޚ{[rKZ6g_s3['-'Gœp Nr ĉ;LIթ8)⤆b]-3'ə+qr!N:ᤙNnI}lWΧ, t9F_ι>N8%<zsyJpz\)N+i-8׺jk[_v8cNXspz6gഽ Nl\L;O㴗.N3K;̊83OLC )ř83p9}<gL2dD̝8v/l 7ݺޭʵ-oݳom9xo1hx/|xy ! = vm#q$'»9i ӜspΙ¹*87|y}nF,z܍sSpnB ΍sbpn;M826_X¢Cm[̰??Ι7w*y98wB9p.. o?Ty9eq~oOZ:%?q!Οt+pzBZ2.DB:.>(W§K||3i-|&^}|F_(GW{f}Z>ڹ?|y ) >qsw+|Yn[ M9e|׍nm߃z= }[0ՖdoV|3K:A6Цf0/.ID\JK_ p.x-`?9I-\yWo,m ෮~ko+-Sn'Ӝ،;. })Pod@UV%PYq^EgJuy0G׹sP=k'/0p;鬒["`ژoT(CG  kM;grEy#z]E1[zE7A\K I>62uB˗Cb7-Alַ"c! yw":AA7?Δ `s (xnӞ;+ZkNgvEJڹvovTN`32B#w`QVބ~ඓldΝw9!Dmq_@ph;"x{6W#x{^ nwrmxځvAq 9L9!kHg?}/O?_}sOmGۻuA2!vփG7:!2BF'!!2+wEȂ̏Eȼ"-CȜf:;\;qj2B"=!^{x?BFMw|hy!^ $ BJ8P^171tA1M2Eho-.e3W⪘5zOc\dqa\NO mpN1ߎBl-BvUmM!aknƍ7DpcQ4n8J+ܘ).MESGx8Ҵw#-AxɵyZg}<—e!|CaW(# 'c| j}NnV!|·=[V#|S“Sy^t7O['p2nnMIG1?eބʖy?nEʸ9`[R:%[mQ0ϵí&| Lĭ\5z#n -V wxv'Ezsύ[Gg֡rrM{v.i٬_v?;:c;N˸E`]>8Xĝɸ3zHnl# l5|>aA$"RIi`Uwc9#rlD&k 2"":-7 b }h=ns\ht@T5DC+-7ƼMk z M#ڸ?{I#ڀ鎂!Bg"OX!: b$1Zd3Y13 1 f ] bO c1!h?b o2FLnĜ3li9ĄAp1%g"IOs bn%!f b"#Z%?z$Z_'= wu4pW!]Q^1]Nj*㸱y:ߟxFg-]-+Jk#&-Q݌{j3,wn܍{ѸW#_mT{~y;߯};M?z~؃X{5>ج@ľClD]7'C.wwtv,{6!GܙWW4pA qN' ^kq/,J ^o":kP Xv31> >%A#>){θw hu3~}S:iѮh>Mi*emB;W$H ) A 2HXs!$tEBH0 CBx$X-H讅cHcۑ2 QQHH\PD hhĮcky k7!z$Bbr$~Ab!UHCbC&"_Ap$~AbT=U~Y=-ٞtCE$W!II3X$H2ng$k믞t7HtI!| Wty.g"~JJ؉l$Brg7$kG1$,ճ<'F$!$OGH0NV+7A' PՐ<gOCfZMf!yf2E4)<ۭ(2֪"c52N!c 2MDƂ!Ș?s!|2-Y!ȜO̱u$zdnm|ܐy%YYϐY=YS59Y^u#kdm4@d-;,כr2Ț]iNMض/I35==ٞO}*'YGJd߃H!d x;m;:+tbfx39K/3"g4݈5Y%wr '5r.CUGrN+"$_y@o4x dTN:X.w*sGݤR8x7fލwxg=F,ûx7ޙ;uxgbgͧ9si߸#9"W +;g W<>nK/ߙk̅\eVWC:"R} 8uG'Nz\]83?1K:re]7kFW^wx/2/WhJ}GLh\%O'>@W |hm_> a| >pNtÇa >,e3|WnQ |S3>.X|Kc|#6|<_c |,+AOcE5Ck|,y^Up>{ so4&uȟ2g#/YS-Y/yȟWD^{kz9WME ֻ!A_-39U LVAEWBڹ&9MhT0(@y= :Q zĠ@O._V[`0c3u@Asbf4qsrQ0##P0P0B]{$ WQ0- / ¯=Gq\MBA.@ .-B<&p {[XKӞMuئ=7[Jqs) N2 +QX+bY쮟({QW091&(doP"yo(}PȈjxǿZ|ͿvQԗ.Qdvqh)@Ѩ%(EѴi(һMq1Z/S;ʅe(ڷE{2h(m-P"6dV{Em/|OiX O߸uk9g|nwf*/S'|*rF|澂I7̷;K'F];|'wn?p1'5>]7x@7F_Gq~@Eqn3D# (>,3-~؅E(}1(Aj^;3J(%\lZ޴nQҽ%C62J,jPo4J̖̘r9[j,츂Q%PO%G˾(n 9@IMdܫ\o҉sP:Jt(J'Nh9cr;J G`tD,^t@Y^PC9#9R(=qA( TnӿyOA'e~[Ҝ(}'Da?kL[Ҹ̬g2%L&zW.GM9F@.((QEjD(7By("(remwP@WߺkgO/xoW|>G˿w}WwN#~/?^/}NϨsw^= };z{5?> ktP~ 7Q#_@ ?eSY3kO(/ٍOgP~sPu|A?N-v=_}(y Xj cP!  T(B[8*:bb&XI*x -^P;P)P)J٨ Ge#F *;B`sTʁ~٬5Q"]Py*Σ2 a{Py *22/cPsoo2B}ͯ.Ae#TGJq;srJWs5uXU];ʨU2;*vCQ5jT-FռUUgPUQ~U 1N=N9'Q=gGjT[ Eu;T+o@sZxX3t烿w}n<5٨> ՗_:T՗>Ⱥ:`o(rQ¨Ç3 t^5mԨ }j﹆JmZ)'Q0 5>A5fNxl=P$# QT]5!q?ꉚ*{ A5u/BqZʍJ~Cx<麄6DVÈ&2Lc~K"1"mGΧ:e))w Ѧ|Y,B!L䰈h!a+[W""qq|gé`1q%Wm@\\ĕ̉+ӛA2FWz(q~F\(q=!gK '{-aOܢw[xq"nnWZJS./L$ĝC9;c0qk /w qjW< i,GИxx#:zwYw.I>wzw;!xh/p2'ãfnQF-?3"ğA[ZӰ^ /0Jzަy{Ȇ=$x ,C H`$? #939֍*4ø$ l!͡$ lp!WI`" Uns|a| Hp Z#AuHg|ۑ#$8' |ESHЍ0,%Ю$gNB$xn- z&CHL, z!%wN+I w3}R ]{;7Tg=w &R=5I[JB!$'DBr$$ٗ{`[ !$dGB=O"UHh=Z_N:(NB{=Hx* "a9E£r@vI6m>9-,%a=^KgOp-E7tH8-giѰvZL &#AN:KuIu+~q'u$ O"CV8.%J&$"lG"1$\C"MF2ω$r,D&DԅDHtGJCw$:4/"Hb L$O[e2Y'1-)ⳉj b{ K9b^}~iXM%}>q>ߨo #2K-HmTou5;x$>8&~$n @&H|JD,{w%H[=iN;f(w?M⛼I|† 컽x\?B$~y|ۓ pϦs꡺uBN!M?Yolg4 O4뻧yHPeR[V*S[ :V5m+Fm mEj]lwjZoLmz_}|B<$$fl" $11$[$a֦qmAHb95I$֕$.DuITyv¨g.h~N vOdݣԮw-4$Ǒd;DԮI|U'S%x3L<-v$̥$F$_w $Z3(oI[yGR=Id$ei},?5Q9@R!GHI+JJRz$-AR/&s/zHRkIHZI %Y\$=}IO;@ғ_2Ȑ$GV3Y}+FKLIzq^t%Hz۷ւWd^$;>.?@Q$I"[$}$" j_j_d̔X0dƇ8!d\#+$sʝd.3&#$sdlH&Rdn"u}os-_lD2,H$S:dE- VSIo&r!Yqk$d;l&Y=KIvݝF4s;HN"ɻl7~T Hq]Cr#;$7W{?$wm]"fyɕ'$/zG`Oo=搼F-Ukԛ?GJRh6ʴ#Х5)!o9R#SI9u:\K] IW)M%eVləO4#n%7)@ʫHy'}"PWROʇ?47rOΤ@a>Swj7nr?)$֤3T`@*Ieb,2"bN*|j1SHeN:,d!52ulH!3HeiRYHb!䇒J\ *TE=IU`>BfƤjTIՐŞ9#T˒j;T;"Վ'Iu:^ UVjT uHu|}Bm C;vVR2T7m~AKz|0,ˏ$ͤGojv4uHmQx"u1quܢH7[PMƩq3^:̡ӕ83SG[8ܬޯ}_{ky\$Cv m."Rvl:_#{KjOj/I&Ru6ckއ7H)/=MjiĨ!^n?zt R?;OHۤ%7#EKH}!ؒSzg: #_.3^CU4doFͤ!YJHC7i%֩ ʤMDHo8i 4,iC9{;.}4#.NviqV`Eƀa4"~Iܒ4^0! E9%Qr4œIFt+҈r%>q4iD!p Ƈ4%Ǐ%q/4b=IF{CckZGeoI Y4>n"H#i3'H#=7΅4ռIT^ClҜE,C39uыy$il4{yv i@H3i#{Iv|@H)xiLHX_XFZI9i$-/%8>4lkҒ>EZ'ΜIᝤ-oOZu԰>p5溒[`@Z#sT9:#:W^uu~qv6]NKH[p]]5Hja^yB ^Aڳ|Z7=&21H:K:sm H"HSyA: SH1o#[H@ŭ't#ϒmҽDI4 &]WNƑnR-]0mX Yߘ.3kԕ/kS :!ZqPMuysPm^[KzKIңŤ'x͵:%=e}uQ&=]ӹ@z9ng9LV#_Y=HoH܎ڐ޴ jgEz?9!7CW3rYDzsHokۨHz^Gz?vKQ;{N?$DvQwߍ\I/+ݔ"Lz~O|;g]ϟMiw MֶN +ՌnJFM?uk@ݤ%X>n{a+D"{I_skx2pv׿A]o*7.' 0HWϼ$}Oq*?_6%E?ߨd`1l0_77q"wd0 d Vl g =`~2p. `8L*ZֻC=]]QC{0L$Ss9z+POWz.!^d,^Y~Y]Y_YoYo娍9ѬdtzQL2L#x#2;@^p5Ďz %S/ԋˌz5=P&[͈^k=.GP/ԫ3euzCZcsj7呟LSEwX2^$O3xaemZ/\gٓ'my|YOBO}^PXXH&IT2'/ɤ;2M&&dbt33XI1db~Ld2KLr)o9r%d7hEbd;Li 2t=dyL{Pdvk K}*f׈NUy^qֈ{2W'sd.KɜY2$R]2+Of_ɬh}$vjy GY 2WQ\Oz̪33?Ar d>L-9]k7!^ndnOȼF#2ZBl2P ;'x'e42v\@d~0^Lv "m|02׼f4޻zýgu/"{FFVd~M6~ŨSoE6hR#=bq,O% >d!|,0O=e5,G kv|tnfWyU?"Y{4<,Oe\P8dy5,CבMd,$˔d Rd?,Ӭs[2݊,m# dnYfe0Heb}‘,5h 1m*i/DjꟵzg{D˨hYY9~ Ed*V #jqY5v5n"dKV陸UևmP.:+:=h}4l]~ӑ OhhFzHdi8 KI5iؾn4 [zF$dYw kdYr_k<6 YC/0YM笟f6'ZAY]I U$[H=E @;dʼn}d$@Y70 \=3inZ*DwUX+ą!.f qq2/{lLOYh?f`uHdxh%Y7n&/= 3!,SkWeq)(KthzhA:@gE}o='={$g}՟=]Ag Xb XJ x pF6 `#3&^08kzC31#fnPY&Y=|w3\. /Ap)7p [6]}U;aͮXs=kJUvӸ 1e?6`vl2æ@l*東s-v .5(v\1kbO2Y?{?;^îw,9KZ HNK9I^Q"I$9IFdɂ$  QD=;?]N\ gs޺'{{f>wZ8$i~{|pާφ+\pN9\pž? % 9a);LyӟÔ?x0Ly!a6S ”/v@n0ۇ]_]Ie=kogkKz`Zҳ0wZ$,m\a K==]Xqao +pNXgÊߘ#a] O_ O#laa˅_+7G,9aϥ {i E Z-?~pث‘SƿQ8~c D8_. 3:îጷ gv0a„z9/νpތ$?Ⴙ !]U~00lh#a ˚bU~TC: a aVm!̟VqGkoBҿdaZVV+=ʮBXj= ]ص]φl?pB6k1+^{IC^Br!9kLFCZ=ktC:#!=m0_Ho<".Ҟzݖ-]"#g 3),Si_^ YFKuE($~X(zM(cx(Pl>{߾]vDy䯡3BmˆWC Fjae*vf0Kì>#6aٮ ,ԶyPu]am w_?}bX/k#^k0zϵGFw\JAaEG\⪰’!<Z8guCxҘBKmt^iy&ѡH)Lqa, oaب;CWICa!K(npf]w COivCf0L}Za >VZE6kO3Vaasn 3l }3t霏L'f0Ӝ!44a7wXk]70_w>9u0UØlda6g1 c|<㄰ueCz\oBj~0-].{sH7!{қlݽ|WH\1fwʞ/ʳʪۇjꋅjJf ^vQz;MwBC|ީmۤ+AqT_N/.?­i+zǞzW۞|t;!G-il~#/ y?s9gsœ0.ׇ9w} œsN!}aw s_xu|{y\s_N~0sux[GPuaԽQ?ۧcUmn˯]\۽g /oG ]7 UZ8L9aʩ ="0r?F~s0rWLvn0rrHa <4SڵD;˅iY*L ow/c .}}u6h@ߘqMÌKf0W3~]G9Rcצv] SM]ìc2af{j|Rkqubסakns\@ׯZj07. (Z|0jè 6x!0j¨M1Xiu0è_$z0%¨^25oy`t,uY'EhSW2w/_~w:啾ySN쬹CzCe WX g]"Lao So>&L>aF[\F^at:T%+Œ-f|0:<}<%0KMϛ6_3Of~03ߴfYllp.a{QY0ϒw}eC1^1!=CC]& LUY'֏ ak5v~%MK=a|s.![1⼏ ok_҈Bi4^4͸P6isB ‡?b(-R(-PZPZjPw.]]j,^Tg]z7C_k8CioRPJln9gZ癲}_k|n !x7!Tl>=WkkCXdɱ6oX!C~!`2pɷuOk|46&s&x  מ 7n rHf=2$s]Fdٕz#$+>d5Br)!9 ɟ?t_GS K̏B6ȐD)d K<ߊ<t]m׳a~//ϙ-&8jy6PL_aSZsiWyֲ7~ء0Aև}O֟óMK֟ .knoLHnk?Nk^)%o' o7k+s5keەoiƼ;Wա)^}ػ-ps|0=m޽=ڸ;oms=컥r֟KsJc ~nw[Wet+RC"!,b.eh[zaˁz7zm+۳^qloP/FMɗज़TYt:{6'Cg$Ğߴ ۺ>ʞ,Mkv&mew#%Á _YÃ!a5Ts!Kux͉=:ލYF c@JuF7D mƢ xƐ - {?f0P21m7w W7w#٭?Ѕܓ٘t#{Ϯ3}K>6K7Nv4eGbelּ>., <ٵOxa//~:a tߤ}~69?D)MrrN4hHNZʝ&~rCqzv1oL~9 K'Y~쁿]&OJS[SZ EbpܳkiO\w[ l8d4Y^GLMzښ.:lt(-KD5>0%|`4%9*Umfߨ>Z/ϒc7u F;J>zqnS7COv]fu/MrDO06-$sڵAAexIz31V|RװFpMʗ6so{vQkάqNR~zt L8k^k=?S:G:73ץߌpl8 .ލ*JMy>Ξ{fއC&\UY&h'CZFdx7y=W֯Ge2 -hv8}?`25*n ©&|rڿVrrt^_~ڃJ KQ0)9&8ߵ 7y^εZ]}Л2qws_{6I\nF\`s"Y>C).sj<;3x,ht:[\W;]gp`Y:;VSFtA7kBӿq}p<<p\3&W;m mgVo;Wz:lHq:6:x.Ү}zsAp䣒i\Yd"Er&Krѐ܄v _Gy 4am-Eeз#z|a^Ou[CGLe;(4t('1wqx+m _T̸H_W^p=SaJ3+;V.v̛5/=78/GCar|tsm_ѝ.?a hMmddִ잂4t=vO+v{brPb뫄8d S#K;;oy[tϸlzgk =4|錑Lf*fp2_Ezp9Y(~RL OYן{pK߬ٸI꺮{j@LD`|Kc<0x(0Jkyk1 "эZˬ0E92Y=5lkNtY'5~;A7qUԃؽd6~מ톿v?&lIg4K|K K&vG$MɼݖݰNכ4㺵u]疴dsQ~2gdkˬed9|.Jf歿CokFJ_3 }Aή?c# |/.h̟x<~Kenk {\E Zd2 ֪FwJ7cIOd.&g Zҟƴ#ۤ׵<5<ʇ^>y3H?)xpeóc6>4],xzM~ *q%_|UxKo׋}axzrD?utمndƉN In. SɈDjp ov$Y=`B)HHpaMSit)5Ɉ;n^m3ǵgUtgNcOp\_Iu㲃1gs৑>؆X/#\e^6<&\};T-~hUߡK'8"=}䣻ェzMAVndM6B| g6OqS]/}!_s )RlXmmh0^6]9Gkiodk%E[ⳏ`4yWԿPu̘ GЏ 37OJ}æ+4k|NsA|觍/[vFuQ~:[|1΍^ ts䏃 6wO kfxv{ ߹P%dv?>b}Flc<}z}Ö@[λ&M&o=,a<6D|p}CΛ~tWz~76Vc_CZ ՛ށg$}R =lϸVbM)&dPvymk58/`49 ='}o^Vgq{?p Q]s¿ï׳l|Pe l9w|ʟeBe.}5?lSi,q<̢>a3ұg2W.-h8#WyX_ӉAe6[_t_d[\l%uCmv8ç O>=gmwN'a34O|ܩ |t;^cFq:>QK.S1).Kb+AQp My;o=|ȐYrD'ki0u3û=ۘ,\bIt_x>#^ [H,̽Ke<|=O DA7tحMhѕyXpHjX} _Rqמv\,_ְ?rS ~F2>_Ϸ: {Mz ۙC[&%;dGm\:왺簨g 'k3E6~ b2\~ eҹ;)ٺ"ދҒ+=Mz+= p Yڸ)NT\Dx˕/ʫ}c@y|6e,N2a wp|T ϋf} .<ئe=ߦui-+~xc;|YTxvLoLC>JYc+C~C1dŏwI:,bRKy}x>xx ]%kZrjN[dws?Akc^j/V .b<>gs{X>{#T jrA>.U:/$1+W`+;BeY?iJ3YR>M} 26 9y͗gGWte-ӾtcQoy2>Mᭅ'_v|>s(}5h#}yϦxѶMyS+lKjs\y2[ +?KmSoW|b|dm)d\˫c|%Wu<;:x}Ϳ^dwK쁓OCʆS ?!°_j\I YݓǑ6/{,]n45ep8{>>#ߣKp\kpxvCÁW_ھ5[Gy7ljջ5r}a3OOi'xM6mmOsTtx>9\w#e>e%MA{,x;o;N:Czkz@kRr+h/]/pGѶO/JӐKLtxmmKalZLlbiqs%%Y-=܌\@tx ]&+{ѻHl=e`b0VaO;rU/fI/ifechkN ꮑfzi_?I؝!5/񧕞={C8&狮uȯ7M]|sҾ7O1mw|AU5yjkj^vwlvxxkdRZ%M|c8;[Ӯ{?Mt*C~NGY'Ob_7|ǝS~4?"i[>~[i Se:l} 58H7ۧg n@C=ۖt5q|"et7(cu7uYǃwQP?==ƟU7S> ?y \Myb21Vu֑)zl֎d_MR[?+sa,? 8&(Ṙ4e?ߔ.uԛ37I90WeXK-6vN; u\ߜދeD@A1i$۽={Mf Jsڐ|="3@y]89Uq>5K;tMp&~' zegB?ja!yN{!ȩ;܊~z sg0!ۄA?q<vo|W/oг֥Ͽ?f[Ȉ'mJb,9;˟`,AosS3.ak]^0{;;䵫wfzߓ>qa,`"#ڗ?Sí]:G1~o'Z8ܳ A~fTRB> .CI n 䖒Ѿ 8Ό5-ٿݰGle3wԽC|6'?q}'`O{<r.Un_%ȖOvh]Ws+o\nYKs4pSq*D+ ;DzE΅/W^ZfE/;Zݷ?8]ohM}LRtD  ߇ c _޿n<$>q6Ek4yỼYSC~%_|lk:QlNחmDvf{M&5z >3|O - _uӾ݊4!Y]uhzG j͗7Z\7UO,Z6 :g^xa7CF'|]xN̗Η67W,@]}K0/؄CƓ'XQqENo}G Hdx)EϞ}&w 'I2}{{.VqnF: 'F6E17qo,Sf.[_d&'ԟW|ؠs_~S'.C']%?ZZ{51_bH>@5tSP{r}ad0_g }>{danIso<R=!z.\z "[gSZF1GC'ir]の .7\1:MگCފn.o$6w-#~ooV[ z7x=vze<qih.]tVν[OaƦh g\0d~ߎ מ7[5Xc'ڕYi)fxtHw&#큤̗VfsU >;{Υ2?ŀʥӦ/+vM| ۜ=l짭 vODpGp9pxp]-wByGm#U nvnvW8uj2JsGκJqaj1ڒ=KqsF7S'):ݶ@[o5k:KWZ|db^4>+ӊz<:/|؏8t7.<`>%]Ym#/+>:v/6 7M}I熾=oͥt+-֚&^bv%◳~D }|q\Zڰ[ػ)*?vY|g of?dϱq"ƚMA_ Əß;}mdg4c7h3ԟ{|K5SV h%o 7Z"9>T}4t&˃L8.Žc㤸C6 h'O͗ۜc]&&;q}eIJ7@ӻ4sʖ3M9Ӿ"Oxf`7_/yobG439}:; 'gmv[}Q3Ey[uvzwҠg4;G+8Xγ6VN6L/lY&Lth[PfzuxYٸw[}ϵ!&o "gQAbӥ%vv[3/ohۭ=h,J3xnVC_h [re4, _ƌ \]8 ybs+o8+>iD>þ"1Yl9i$8:)oR~x}[>#נ#C|ϓ# .GGl+|l "sj4Mgqe6:whStM+5! j`?>Rp%6eo~:'Ms潯sudM6!GrlY#?˥}qnwz<}b>?yZyl T<'҅,L+Άw}wɏm2Mm| ƃdjgRxzh;&LB&C~]HM1}M?2Nڜ@K <idww '+.&1ڿjhac"BUbNei&O!O*[A:ofp3Xdbb*>le9O(NLwz z1#OrDxNL'ʞqţg'9(9~).GSz9k@KȻ e}3j~[beϿ߳g3[83x?ZO+}|8262ɪ.hOkYKW,L߸1]rF6.Phluax1(ޙͫXOTWU7̫]jeog7/;d?n)ۡEmwo0(=.C{sSwWG hGZ?Nt46et&;ICgkxV{ywL^BG&oUV "P~gj?tu|3 i t?;'npp<`/hp z , ۖ*6d'[ ^1ATKuQfզ27A'z]q~fö̟e\=DCt^E[|m._Omnjz8ޡ7gxym$/e= Wk|p.ǐ=bnmz4y1}s~O>pd._k>G,gWe<<8ϼ_5KC {i_u|/]SCksLAW B #7Cg3ot9ooWн#>h]8⛧𵚡=?1tAy/M:诱 $WC&+5 .q)K彿ӬV8ǃ8%@ _;e 9kTzVp:* Y}q7t){C覴йC?8&x<÷iMغ6ǜ}OZj V 7BY8wsKy+f|[wudlHı:P:Ypa؋1ޢ}A F܃. o^Bɞ2s]ceUҩí#mg 7fh_m]O(oDz!A>w3vYk7{snʈk m[ӵ)צ\g~p]6m}ZO/^6ů3? zyAQkF|,MkvCOs{\->bsjSO6Bztome?l}9k#xpnlԇ&F__{fwy]g߿);߻՟9;D|Sk/4q=, zs`wpgNsud΋Ƴhh:>)_yO ['+'Y17>A9Y8]~1v-6w1tQg|1ƞ״%a@LY7yӨM~eWT\6_na\-}E}o|2,|_/\o$ԟ fVc%t2t u]QdMI.C?u/nC-G' ϔ\TN;Y4-R\c벯]8V~b2RASDOzag G+ÇgAGDȧz?˾t.¶mFڜ,\[ ݛiC{ :w_wJpyxI[忰>#FwMr|~C >b=lF~;p>z/4NF}>jh1qUyIOk!a`7ZlfTjm保c __$o^|?t|\sk/0usY'zbr@P }}y$A67ni[⾬qAtqQڕMimMCgKF._il,9m:, e WuךS9obMΉ" 1#湞}Kl)bt?w]fi˦wUP|G vqut::[k&}|#9Ja-؟"S ',Y17O{Ax`jp9Ʈww塻kWx`A|ilf|#ܞܚm<ïpRڗnpFve'\i][}=wkQ\|&N$V=#/X(<2ȡFOٯmY|ʈ2d)p{yRɢSVb4T{5xٸTy(c伋b D+VMft>. ~5:q+μk,vNg@wrz!Wi<-x&HW88Xɟk6E:SM>T|SlL#Mv_ˮ_mv!lYǠ]JKx=ڎ~rUq]~zRt|mmt=C/4[<}Ӧ.~39ރo#?^ mw֥rw\v4+^o8w(JKBNgOL7lDp`3^WIgwx ZtǶGmO~7If?}6uD:,O}n[XSYtL drγ=?cǖS >tbOpO:Kpc蔑iu*Z<>>|ۡ*U}+'w,;,x\}l_}4?kU:7|ʗc'0=b:pd6}ow Ƌ⏚< ^?etړfR;#B"9Ŵ֞tm5{p_,l0Y{c{nW| 3x>+aqb%K?`|n^6dL}4b88Û!~<1zUDx^gn:;돵s7gG`#`[//c1an.;cOÈb=>S; YVelKa~*^]ɇZ|unW|O Ѓmgo}Orcsf :yR=vv t&^%|?,z?}cx0Ave6YMtDGP{pg!+?wٯPL= :Lg= iFFЙ.!\b9uvi{M(H3(nM[6{G/Ͱ9LmmKq}:qDE ;k{;#[8uC#.t>`2+*N/+Wj2{Ys5|،W7z:#Ky'6WI}w%_w ϲxń~hGʌ—!S ?rmGG/jҐն?~hTk~?w[WgkU17rx >t~& _h}mz U7{aF4l')ޏkh[񁰵6hbwkk ?)~igֶdiӞbZM;gq_$A_RF>be/ ̗Cv/̸Z[Ōv_vW0H\U}/|85v_b}쫭Kܔv?wuFt7}9z7t=s:^þ(h MuiVmc47Rd}Nج M~GwA)e^MPc:tŤΣ'{uA˞Eah׏l#Kt㥎oPrGnVnG_c>&N\:cE!ʼz>9^,;2>wIrֽM2^j>^.Ӧf1t~O5k=㋅8]c=4zZOKoR>Cͮ}(/Tg kex83ves:wx6>#{qǑulVO\zfԚ DGќ֮͢t7|zM2.94/;09v6M=A<+F\TA6Y;Cּ7ܑ|$dzoMgD :a[1w>l]O~G}yCd J7MW8#8^Ӏ'=w|m6[ v{'o{s&G[۞Ѧ,x 7ۓi7*Cƻe(ݿˎ-.PC{]{.WWO{!LWo2DuzVƒ1a=mI۬]f}C>LOyf~t$#~ezY{18=-: Zuhʯ4f 9 9O?sD>H?ǔ؉}ӶX }yq;z;.EZ2f֑T/'7tcozdwyk8Gܐ-/Aow.o-!<ֆq-9+)g1A# 7Lb} ț&OBvojҷIh_O6 y49Ð)r8K&>Bə=ޑ657홺s8l<vl16op@CڦiC"8ćgZKG.5\~dgƒNmWǧMe/ ۪ȉ>uoQ~_r~!c ]}:Ԝ^ƻ=ﳹAdP\gE[RybWOc~*2y!?%ɿC:M]ѷ};=kfP '{ώt=Ogg6~RVy3|wON.mٯo;5ϷIiMyuHFC;u!rgvTxݙh -p4<AW @b\ ]zfrg?~򥷋ح_]r@𓬮28 YL_ۜbϫ:F쫭ikw*E9b/~|edv>ٹ~wEN03;WxVb(M|\3ߡ mH{xSnc3_vD1ެϫ?@ gebۃ1\RO] U󶂴yZ듞~@w< [Te9;ufQXBgd1pb81gxsQ:6!k}2YoYNڇ]T-fF7u%WA;_4Di^Wg,Q5Liy) |p|NS5Q;/픱DkMgZL;1M>fS9ĽT "wɝi6~Zz1Ti /T.?KUzU܏t\8F2xa6vrZŁͬ;,l k~]١:/\Z#5g>!:GoLKWcy/6`Bqe nb'g3[Ķ딏Z]gW7ƴ;xb.]<.wSkJ<5,cw_rMog!@\/s.*^%;%w};oґGb\`|c?Eӵ/M~=ɎFuaAq8'cX|~7>ʽU+}dZ>vb:}.CypU6M:Nsߥ#<2GJϋ"#3>z)ctap?>{Na\CGNBt;%mHq }qWGߜ}Mi%ς3-m.\>{Cgpm|{ ^ _>W3()Og|awNhszcw~{_}wbK(xnŠlmk*86-X M T+|?s_sI,C6se{/(ۦwt^ijb٨˒# mFGxUo8S]g- fx[8×5=2_ɆZ7\Z0=˥g4sݔL}XAehs/o= G}z*7=,=cHtH/<իK^&^ 45MkmIasDneKçyķ\V2x wnux4O7 C%A ίLJ`eHEٕ=_{Ie;i9ͩ:^f`o@N:* ( mZ3t#5`0TZp } '[<6_>18;>)2{gFCMMLɌP\عl  ³_e-kSoeiQӂ2ʡ8a6 iߋ-rx)+8ZsP[}!%sIwssi?\%"߾GNuL_5Ȗ=g1z,b ?+N>kB{{ #wo|ضȵ6-k] ~7{ u'EE0va>0a|l&S Qf&v^Tc%yYƻL..QEg\dqm@?΋1$|ъ7 XOw˘]>_qʗ^sS]:oƸoCtwQ]ُo ίH =aDqMΐ?Ь~ϔ>4NaG*nhX~"Lͱc p=}a! aKgwdO\WUñ)_|6)SےY>5ϽS; ueU8)mөA^N~^U܊ f^xlW> nTP~G OĖ?q7>wᶞL&Y!>0de_:lp+>\(ۊA{^u )ߔL{?ޱ*is901Eq`$w+ƴcHMMX7|ڷ_Fҡzl.E{r_N<Jp8zJ͑f:237e u7]Fۈ;GďkT;:HXvG)sǤ~,[t[> nC6/-->W߃ zs.{='O񎦴ξHSum ]bU.SP[:Mg;E(SNe؆tz6V):ڻӽi{;o9Vw"L^w% ܜY,\)-ۦ}9uf+]}ueo辬 oR!o+"RAgn>FlMf K=Ol?i ~<.{9^T5WtX`| v?y{5WsӖkߗޔ=S)-sҨlSo 0f{cY2^ ϰq4c85?Tw"=#OP{)G{9y5­,yX` ?/7~?rxR][q:5IE|Km~3pS{}w1z[Ϥl>˛ᠳږk;¼\=洹|ߪW:=K="?TkK`x.YLoď+s%>[ FOϹoZ0U?ypOo gj&451#'>luW%u|{@1Kken|/Aq˳՟x ?*WƼb]g8C6_t&W+3K=fwQ|l/!oGCV/ct@kU..n/<| t}l|8~ -1\MD6& owLnѾG~/ך: xx1<bsEȬ?=FhgX;*pD\Oub&g?%G}L]`? /"m)S>ͮO)gg?϶Ft>72~9-Sg=SE =o1msk={sd$_F79/*q/L_a6ٱfmjj2bGD=nxPFD?e-I5 tt!q| %2EhIg.glg8<՞ٯ/8[@Wu\~ek>i ɂy%EӒai5703ƋD`&{_a}_XXP/y+Ro9ma*jm fc0]+ŵ$?g#q[7〗>龐=*NO#,~}\F'>4z]׹surQv}K:V:gZ2vS C'jģb4Mno|YDiYgR1-_vVSck燤蹖Ͽq|( }^V_xLvW!yDPA2dJoJ/. )L T[|X־%×oػ!Ǔ92 o1|ǰ? 埶萷o<} U95mxESw~6276Igr:zMo>pAc'2v3>Ƣ/E툿,('_}r1"].úuFLM~U.+*8)Z ܲvxǵ~6ﻼ|i]lЗ,ׅHbg8-C sϗ֟ˣ'_tEc\'FAwt/8P1kWhoeyv385wv5&Ʊ O, ?bUhwfkJc-[Ič=OYg_L<7v<:"/9,W:S~)U:kuێQS?${_Y0]Cۺ&z&tGHQ:~Ϲ&Ǻy '~'|d d#ΕAx t2/7AOVeogG-x;6ebPv.^}>s{c]|,c'bM11qa,#=|qpn={mEu6.v_C0$9}^F8oqxG@Lq 5YZkK.kIGM}6)LH0>ӦN3psuE"-<58΄c{F':*0&訷h$7'Cݶ|~sfam} r :ph2/i9LR+P&VkO}oK׏ (=b`u Np. kjaGϾsl<|k:i:3BS[a﮳"]zI&= ٿ#>IߏϯZ;Hrޛ5e 2zZl1'՝bCg4:WO{҃f||Ͼ6'~WfҜ}v^iS>hߘIPF~K/.k]f|Ag31 a~ =ٯ~ov߉ wsN27AHzuoƷ_(ݰ{dy<%;kV\ |#>Jϴ|l5tWd%ϺY.mly]Iɢ/!ؚH ֐פf]#l [eC̿3;>bރ>j&;ɎUjccHN>|?,ZA^N0.ԟ+4a7zMCcl|*?i}Ey6F:Oч"[^د2X|*rյgp:m8;|?+:vۂ?"^6O 5Cs ."t+s}xEU֞+`a zf 2+_&ٟhFY ybtҐm*768/(b4JTڏjptվ3t-y >۸k/<}GgsS]zFon\g@lW6yblʠaJ>EZf3aw@g%b ?|N}?uq\^W >}imΑ[8HglI= gt5axhz4mWn{_Q=ś` [ϵcG{gx7`X/\-oN8^EXZ&n|4Ns:p 4Eb{tQM{u^w2EP>;M{3d{?O;wN}VY^?B᱐{ƾa6}$ݔFq:˾p=]*/L? Czv,ry[?ڻ1~Wbʟ|k)E?/gkzg]m]k|AX{^^{ww@SW_:8=,<#z~35ʌS3ʭyz_`w'*:[v:Nx#p(Q.Z֦Ɯq6Jž0+<]{J{hoPb ߐ޴;\z+k$ ӁrotP:G5>k`Q"o2M:X>u 4ʿWz7hO I^X_evF,E|Aei.ˮ2ˢwCgcRo!8Hg@Vh8]ښxTvߢ dK/ d6y%|\p>w1oÛu_.:|,zr8P|c:脖۹K5#]xzVB$9W, 1 /ہЍu3JoqB?9/Wy|w/۶mbA< yh]F E'o4AS&2Fws-0T k? !+&WBoH>ʽCkz7FL'|i\{^qos#ET}qϘxhK"(i֎u E~o[ҳ@;l*/;Y:pVB7w_{Π9Y1O&$5e|?Ց?Jx֙!<]^2_=Oͧ[ɽM)kx|ҝ5hk-ff*M\K|k?o^YhK&93ЄM8'ŘZmkJtڕԅqL[׆xng3ثIhW>^K1VxoBK i }\;2k3+W>*沱\K{/޶M[mʵ2ఙa.]&Iq|\~ e[ھ}m_g&I'ܡ@g=Av 0]®z7Zlfm"&Sd6Ed2-7).WQ6J7n|饌e+G{||f=^:kB/;|&o7;ڟLEľt<6gwhh<~'I?sڥӧ)O5Gl?:σGMAgFW+ΰҾ ;z Y)ZkѝyW欥4h kcZx˃b  >qi{OW;|% a>ƒǤC"o<+=}(6i:7d43-;۹Bg헗ʎAt6|ajϜQt_ kڵ&4x3vU-b`'c{ۚݥs`Q_{aJʆd7x:LOp^@2Uzb;rK5]߾EPbvpĘl͓;፽X۹#]!w7]Y `f㤘unK߃ycd|s41=gS2;xj~ciAE1?fg_֮FFjy}7>uџ6>St~6+Cgϕ~dj*ù1҈I $sYU:{VQa2{\y΀w5g>.<ԁWk@bc;R,_? ^.|}dZ00-pK`ܝ5VVssz Azì66GrOߝL:g67엮=w >ؤbKk0Z}Z;}Ƴ`a>/'!/wWVmn]YtYV~}wfbBM&"W3Cc[ĞT5Z#_ tȥh*mlOTÜ6^f~,ŅyKܳ?oؿ A8)~r?eUrnv;!?>[cĂcd؂w >DZ|7;A^|-}&60?O:1WÎDsy7/zS֍5ieKgD8!H3;q t>qsN"]pPMA"8-hσ\CSjU|]wWb݆tQ/X#!3zed:Q~E>B M&,&M6/ٱݗ/-_ Zhx:A2MorU;tfo3?ÞrZDq=LU\抏hɚЪ ۓ tB_F{ƿQv2T:C;_Y3Iߥ3v:|-D{"nCg\.N;Oݦ-C&IPCmA7wNMS}/Sr? ymw/۸C^A=bLr&|LG__}]{Jymq(EYafgl7g骹O@{V;$?=_٥>ϠAĺFIh#E{U[fo:|qf p#Z\o: o;Jc2qA3)3ct]b//Vg`A9>"3G[63xa~-=5}AvE|K Ey堈oG乴  i3G/IgM~> h54ãcp[1AFY1,HCVgN'6OA>o蟑ku*Mf }ue 9l&p.v m/~h{"~>FtĘy;LgWV .?@k?, .ce[m7 gpT;p\]#2Xt:(8 bDb%5܌^kAAj:9g;b->aS#fÛ.m{CK׎>u_sCqq. Y*8hSO jѷ\ <:e@. pgX6r!\w̿B6q>VIdb UAM9vYѽrl]ȗ_Xz}CV ;:9n&XgAGػUI"O!6ؑ`>ײ_2_{ʢoObiee{ mrb[hLcC2>zʛ#w} [V\Wc)wA}Ef0J9-["| wҾLjxaQ~8CqCۛ [A?,v[6i ߑx: hq!b߿s>uZKzet4I6j=ך/ۄ+ 13b^Ðףr_E>"mwe/||76.I;?)6w9YO׳]7[>v#-2^AZЋoZ[n1,//W/S6"=Q6K>} kj=o3|;g# :KYw:sֿ.F_w[CӇ:Cl'ܲ#_6 ~w\|^a[1鵴 &S.ߦѭ433AzyS&>ޅgIGo:6']]2ӭNe_2vʟ?>g //*y簂4tg=)Pg5=D3\6 ) Д홟D:\=kWqlX]fWs S6`жZr|dGi3fKEx.p~Ii8]~eIoC{YK~z{˴owTriהeXkoD~m{y}\ک{_Zi7wM M~/~/|s3Fy{g_q^@g#KyS^ڔ~xkڵ\w moM_ aʖ3h+Ծ#a?wںEc|XhF/{vyx&6{ezVɣQg2>|`iM"|/TGVaX1DDkƋ۝z`/TQ:6vHL_=#~; _|$6OoON^emP|yť?>8Z{MoYwcF$bG!O5 ic6*,4hj$9.;:|s}});ыN|_X׃"._%?jw&?hڇG;.tx;:I?"SYIF8}69k'TIn͌,omMr!K\rvc_f+#[Ӓ;/pÃbAgӾ)8r#f5y[/e1&@ta |]/ eklFr?|댌z=L{r'u6#6B N';ArA8ׇ$;aKL3Lebk6S"읾nWE]1 `Dm '鷭:4sW* -CGj35e)4n']э_ɷ8o)?Uy/?v),z㾶_)+ӥGiR+_2# ֟閑W0_yzR46M)5p31:dmA[KFmF!oiu֌~'yקes0X}?H_ {0.Cٸ֑>XS9ޫ7'in)9N@+.@x7>Mv[~@WVGO&Jv~?@bZ0B.#yoޔ?;)92}:BS>ŕ'-azGw<$W:m%SwߜݔWǏqP }r)8l9N;䛜I,鎮\Vg?4E'Զ+/IlmY2d9`b_W%&x@dѱl C\N?(۶?3ez{ |ЮYП{!~\ `ASM/ xi_n=*d [p,Imƣ& x>1վ+?x-<_n0<)컉 ZowviHr7](gҧgŭ\i|f]ڹ];YlJeŏAcxlK19C7O,{)1^pq]۾2 tWn`Zӟ+7V fp.@7=o->QmK -/\=奟G8.ahÙs8Sryi26=COwf=M1mݥsԟլycÍwlJCG\:bo-5g̼DŽbt5,%T:; >'ImS_k%7!ڂKm#to=ܚ\2h- hb&?zS|lF`{CksMϱ0y:^ar1P0-Hpgt-e~xkc+Qx^b,р\2Έe:7L m*Kב/VZ6]ʂ8nJ'i|pgiwJU5CecmGny#c߁{-u)xP~:;y=ɴ6R3Nm$~vq`h+3s7?/3@^oZ2<_:י|n56}GÔy2|b7aLrbl8ᶥi:l߈{o:“/fLNFsaоEXO!K}M ʎ6Eeu&Htr6|]wvAwm>9Ec9AݗgδdS:\v/0+u._2y},Gp r;FMt!D:P.wx gu/8 ƽ0σw֒rSL?"|;}Ͽc) \ s=;ߥg3&ߕ7/2`Igdot &_ٗ7wqlCmOxv^w\/66MCK9DM\^A,Fϫ1\a>oiz{6 ?^tz>^fp-]͏lo $_UJ3Hg-B>iO5zaן:͖ܹb+MKACE>kM+.^#(HGFײN/CC<iW]/ kWmF\x]Őd9I=Ⱥ]kt\Կ9u_3%-p7.e4X{ e/Y5}14h|ǽ q~Ƌ 9m 2C_%o4/m8 yo缃srJثu^3_ $lF}!qѩ)Nњd _R}S@2ߝ-OmMnkLv6}PG8VT7[\o謤 +6?VO&o}^J8ߣs;NlyXr٩2o_C}:HhS.EH:Ec_o|4Mͩv~/HIu.K&d1hA7Ĥ}˰߭Sc:љJO8>4t芑fr";yz# mWܮ&v8ظr)l|?ZTeeG%)/[~8#z0F[zl숩.~}%ΈX>9*Om&A3o]TS+3_|˟o})~ǷK|u~> Y 14ҞƵ#Q$޵S~2oL'^b<ySA2X t cT!? :X>*\ȧ,ۂsI;d!*v>DYSC/~SPǝ_OգOm~<ө *֢^{fE7P,|o[?gS+֓lkQv.#gvhzq'iIfw> 䃦gsK/]'8}s|[9kd˶8O6=_{粭G`53g8_'{Agm,w /Xw<\߀^i:}WI;&4t5 1Yhusn4yF4GF]߼g׋9A 2C2|A:灳6ltw1#֬h*J_ 4V4E?RhOg #7|豑oa/65|Ifu3C qUM?+_6jg}@+&m s ⷰW?0Z;}z妼kf< ԩ/d?鐷z@onm/c#ȯAv|:|Spk}tGϛ.C/Ox=&Qzxyf۵tkζ8/Vt [.i<M.<84~Odt=8 vb,AGG~~L8__ww.m\UAgGӹwߡؕ7p^g}Ysy/=HƠ^=GNb~d Oo|,rO*Lq˯編m r.9_aa\'Igpfo󘱟m":/NܒdVa,e ,UL_*,{i[3#+_;si9-K!Y֏^[_im?Ews|frH ;y/{_:Y6v'~3=4ǂ|']7%:G ڃ&&_nu]Kbso׸nQ{f eW81^Qz./)Zڨ2c?8?Nu/1Vl;^NQ8_y胟j_!P{! n7qt*sblvcqzy6HY{noy/2􉏴IuAϭAlN{3o7^FJ~ϐs|gYAs>Cs Q{BoaÖc\zƀ}KFo!EܐoJ_}:'|Bs{m-jH|>pH+Fî22(>t6w | MC-33}o59mݟw{1Y3ng׹6.=B/pDm W/`GC~`+]$`a|6+g~n :;Xg=wG&5YB:|.7tE:;g?xbS;:\)2#+Ⱦ>.;gOwyhe^2m Dɘ,m<e߇ן;gO1 m_SO]&'5ck:0.?[{`/w욆WAOd ̮/;Z>ݶ lt](^:lYWsδ@ϗ12e#B/|6ː.tt٠ZWХMZD?si؟9 ^~zf2R2EaZ~6=%g\ڟZDco :S}K6U$xc;M #'#Q2slmMOcєΥRhwsGLֈ^asU5|H*ėR2:02+(~.ZzyY%e|HWY=>ONP1L^L 'S7>)`qj=xZy$oyrĥdH^2أtDw3|Ǹy3 ML6ň&nsyku41 ~~J%(n?͟(J[OE;{5A@߶5mjx>t>9Б`7X'/=\Fe2y?g3β;eaRFΕ?K/cug|KGjDJt63PY2_5eޠX-x,Ǿ9׌e?ښ>5ls_O׏ X/VO6S/,?a?3` =o ~+ogpy޶~#=%ݖ/{46!t,7yczZ2k<26~I7lgGsc>G/ģ-)A'| ܛS/b?d9} $x3zd# Bu:S.]<ݾN_mK;gk6x*ㅾ|p46ngWEx0*spFfcs)Yavfpm4<^NI/gwM=ZI\r.۽I fCmZ͆~;c]bvNǺr*?{w/k2+oxthA\9+sթ̔;QL^{thgӈ{]ݡ>0ϫೀWcܾthYm]M m.\2].|\q/E[G>y},r>_֟G#1-ϸD<$r&ew7>26i5$9>יcZP,abź$kn{:g_s> 2UiC>N{;b>;,vkJ˶; {<%pcO ]eM4&}%\ɷ.<7!hQඖڤ+oyLXtKyyɷ~l&]E;\6։~}!~ywz$϶8)?MgԳύ#/.}:M =jۆ{?`ҹQ鯴IӥBcx-Cd<]lC"=%_UG SSo \81Lw͈k\6دh0x[Y5|t{_u4%tzFxaڷcc[2MOnN}?+ָ$WH_|btb-OMttaك#_ıW6۸%;Ll{$-y;gF|W<ߥsr\rжC# 3|U~NLOO՟EjvD@7o|Og:W u`|V\?t֟x+wfi/kI]pd+g[/Ì>vySqq +ކ9,廎.}%8ʿ#..ܔ{>" ĮxØC;msE:˷+]XSչv׮j2l/+.]cQFb2?8/psKK~Y}yzN 펽^VXC!`5^_'[r;$].G߼1/u%)x~-茆7B58׹E{b>8צ3e7N.7-~woZoؗFH}÷Eb]%wSl#&o <2:VR['Ab<YiLR\-egC=8ܘzLCK);k:=E(E^9w;ĩoȬq u7 .;<Cb,;`s W809wxGbrKaw-#0lrAkk|9ٳozqN.!Cot7cZ6·tXaS_iPt#cs9+(H/-NY1Ze orb؞x&{V-n,|?kMz\kztł[Mѹz# 16ӔWK봧x悴9]_qeiiuoC받O. ̽S3s'l7YstT8@wPf\qZ(":et?ƷFn;oXWK&'U7ŰUt#i2IC*-.{Ti:,ƦÌYywo&_\_׉NdS.7^y\?ґs$~?r3z)oc4>&n]A<ńjjGgo4X֮oUe!FK,Ul-chL/Cme;?~Ag&;mg.jy ?}U|0cmˏ4ˁm@7b'37'q}d [3r.|>6owtB}Flk= ;'%txK8!'; ִQiI1yP,@?b3ڗ!;.yA+0#fзCɿlY?{Ɔ߿!%h׍A<ȚK~>J|En.~Z7qt'D8^j||vִ23isqxc٧7c}39[ 6^3;վnc+qo,9+_}VD:!),˘gr` ɫvCjmUqȬm i>\mH< Nx}% 3ge"lؤ]7Q1}Ȩ؍{Rǫ<}~9_|o-y=tx2|y-h,Lp>k3ϣβ"kj!qȂ%qZcH5n*σOa:~bsVB & נc-}~%úF9An߲τDЃ΃bK9!^~ӱ_K1U6Yy3^* <u ߈z)=ς_6u>xJ=G8z$gW>gL tl˷EM|Wp.^]bj[u^;UeIwx<%‹8rUxkYL7٭oa/}3~ȾЬ zq3Y{[s׎K:S/Il\H|_÷ ;ab1ݕMy,uۇMV;;N05zseզњ }1x$~Ibk't7 4 /nȃļ7ZAl23U9=_y <֮D>ᝳt^wO>~3?8|$#tjO/kG{m wF5 <:yxxM){re^,[w&y+38kά 7 9~дK#L!v)~ìoyO[bv6vfX]-_u|] _Mڇ\Fe)gNe*n}/:Xa7ASLV 5[c~pQnkV6 O+~9:Mg.l#> Zͣ8FؕA g| ГTX9F>Cۜ>+nR|ۺV\Jm{^a0=rsM4vAgȖxj|7~o>||Y>5>*[ɯ4Ok:B|t-&1 U{ڂGM ~my[w5/f(o Yoڻ|-h POz'VC.?SVn +kް[M_ fb}]z8AoD \|6Tb-+}sxv[|J9Oq_ËT;|hh-Q֊OݭlilX??x౿Vk^F+cTfL} _dºFv.o :8#>&h'%h2?'5˿n8A?'-i]LksʽW2y/:lhsbb[83*#}ލv/#vn!K#}3z| 7YYjaZ>v=X/{49>䇎Gy2J_ҹ+[=98Dzɿj+uʯ~A/q}AOo!֊MaȨ/f[>.:}4uxOm|*9|J˘d[:'=/~]ᔃVop{e\3tt qҾc:o<64x|[U)ޫ|tS$6rP|ӈ5%hmbt9-ߢGkoY5V)S<&oywHߣM_7ڋO˧%mo穘Xkż\;]?-}&WFwaQJpOxFDNjeiv)QG`VYk^֣th31/X /̷ [Sәp6Gؓ!">Po?3 Lܾ}lvu5f@yS,;[PW|ݢ# -tyH٠A 콇 y=ӿ'"l滇>|({wY~G'Cn`5OH?S\ %:?fEcg<\p|#}3sZ\ :(6 ~ >w(B^G">wlZҞO;C>ܚ<ݒfԱ=bX4HM“1.Р:L *9qlqάu Xg6ƞNudžbm}hvRSzLSJ|p|Q`Mp{tQ]Ph |YΤW Wh(oAs6zCO > zp34v78 =q]ԗ.~K&{ߦLbކxI{סºc_0]yRCɮsUcxL3WGfG[F4:" >Rz:Decݡ?uw\؀87=G9?9ix]S}ICU+?<{ۑW˻1l }1 ׃CgLCeSp)hz A>m,,+tjpX7倝)-tm51r@U(Y_lo N :An|# |{S,E^Ƨqܥ.SqxM.%|.^D_z#Nl堸{K0̤aiNc.M{?go[WxpZ ~Uwy{zS ~#g ǒ_8&?'`cx}w_w @FKYdk% P/N:}H57wp=r!nޟ [|ɽ'd𤸸;+0s_֚ܿm'6?Cc"vë$ay.raYteO-茑k8ã)ƞ;+}7бy't|#'c[\$djO鬕=m;7_:ǁ4d#5L\ڟ:> GHkx=X?CŻ,׮C̕񝵇2}D>o/ 6x`J%O9=d}pƏWV<@[ }ߚ ʮof WWYoЏܮHւ :@V~> oG vr[5exJƖ}z~y;\e/9;"} qnkme;5@ ލx >K]4Y ?\7-ƌ/_U}LKEO~8EulS9ݢo?xp]fty?#3'ax% m|W8§2S|xI__OpU# (97<@?ejJ#[KiiߓfÙ!HэG,_%;0P>5-9M1i@_oZF lإS2Vd%/#yC[D0^l'Z׮^8%מ՟U'] M5,eeQoL=l_Si78w?۽||c V\uұMɷR̖1A{dyݗk0t>~n'Z?(У ˧ļwp64 )pd֟y>{`hBvuY^4=cRu8."y˴N˘cvIoc_fϗu^yMub</̥_K}i>y߉y!xvPW>:JNpN_GSO,.|V#Am=7,]ϊw38 6=wkĠp%"e# #Co{^)YC/|%czn~m7vm&)nMbיQ tӶdOǑf,o6_<+)C蠕Nޏځu9 aFW>dϗ.hdq,%Dn| [Ds.Z ݮ&YƺhPVơgqAl'Ji*\? >Dxu^仡,v3qٽu|!m&̥/q>oc^kũΑ=]LkB=;so&e?3x \řMeAk SEw!Xh6O_ϱ[>9/d)1 ?'b7ku2t^>t&Ú@kz.ʉLzy]׀|m}<4OuqF{[8][iY_ȬeH 3Þ9Wo'Tu_ds;|%xo˚! Vx⇭LdCqX}Zk nܮvmj./s.]k4J; 0yI>myve6LlG:Ã=<.6I`}PwWǙˊ> |gAwvT)Oѯ錾v#e!.Z胿f;|Vk{t-{O,~ Awob<`5 8#.7 * >S#<ń  8#LANmImEޖ yebu|̈ߒonDŽc$;uW?L@wސܖe|C=_|xm[33冭ij'}cpZa0ZVE2|Ǧ& Y"%ư;4ѾoyKi5p3&ӅH4_S4I;&$&kJn|ݔb\3Y|(.qlh~fCtb/]}Oyo,}$m*>i.O|km.x[ē@֚\1Ԣ2.*^}K3&0c D;нr_ٍnh3y|WyYfC<ڥK/J_Mel߬]C-tٵt ^r?Kb%ΏXo~{=#OfxNrAd͟ƶh.7ߦ[袐팷ǃlC=+ESZqϰZ8fH7z`]:%xe ҁE5&r&TyAj|pwrxķt{.wSNg|ߐl,pӕ y'zXߘZӐ-4N5Nk\q䧗}=C CYبFxΒMJæU +\+&[%_gh dQLi+/<{Ctցt`|Vcnwۗskhyso:)|I W$z:ViÌf`-|dkz8sA^s?k]k7]9(z"|Be^>!GcݕO_оK[bBG8>8F_z_2;5Q@xFKC1{֋uk5[@Od~&pZb0l^΀KO^HL‹7eZ2c8b=U:x}e8>ʶftXˤO)Kc r~ɏS ݙjwKOm`MR9>Nqfzzʂk(_)uW^l?_Gr$x2l|//khLZuv ~2yF3G̾vi$Am,}/ڵUk'ގWu MbKvMW.o +os1K>vm ;!dᱱ>$ 6"s]A|e?f{j}(x; >rՑMw' ' TCt ׄ>^$ZÝM|3߹NYȠ~'M(/mS![ű9/ RȚsx]3Z* 6k{?#s/?W=>_N;u' _Ƨ?W4>'XKd|??H_?U"ȟ/o߯u&|0_~\Lkw |W/E*"[ȟ'#s~ _(σ|z< _mBG/99 ʿq]pL j}lP>}QiS|ƇD16h/{zkF ֟UO{3$ԞZ޷pܚ%iJc~ii7<>Źw۝npQ~ݶEm߳m/C6Xoށ}OA|@7.#>V Cjصgx2|>nK:1i-s[OWᮽ2wNQx3h)_? v}xT~!{Y{伯tOjm(α]vK3_ 'AP7xW?.7xƿnQ 7;{yzq_0.,ܷy` ?yj?t7򫫲6%+[>&?qq>B'%Fz=LfF/SKl m3йW>W.7i۷b2e5Ծ{lw|iK15}78Wy/IQ.,Yl@E@dɈd(d Ò3,Q%GAY$APTwޟSs{fE>󚮪SNS 8*l|\RXaJp?)|57RY|1tv?}0ch:ԱLVv7w Xx6C28;5Aw(6]c!.5bm <G:Sj]C3 ( Ÿ1 ς6d OϣlYTl d6/#::J4AOOp?_񵤻nIVd,ڙN8S+et <ۺߍw?xLuoNof麍v=$tiR'y8TӒ<;ndߗ>%c _ >xgkf4$}{9ms}BeGdcyꝊUOqf\Y?uHKaY>aKZ]zPxOݕ`kl|T25\2?R'ֱ]txK<YmLUl$#l< c(ѽ\.ov\wپיaƣ՟ F@Y9+xͪ@eaģgbW gW-ХzzW7၉y4y"?wC7Azvjxs9gؾVpsTqWc?uF>'8 Il( o|NShվu{g.7]b.1^") 7εmbRAߓ'|=FfwӊgJǎoFn7^390I>s.Gɞ;xa=]G]8ȶ;.Qp&byAcauO}׃+x 9z8[׽cż|/~+}8^ɗ!uok|i;/C<צ]ʷ-|xU}.tVla[>mV;A7OAXFR  {^v Oٛawpŵ\ޝ_]ŵ{5 S~xdaӌnٚK>[ JAmlbcU+,G!Hi[J^0Ч$(ne0{FFt^ȉKe\VFgvgo8_w3,xa1낼7Z12eTga+3W:}F r z!d͓=yOfpZ;`09/luuh۔2SS\!?c[q]\ܞޅw@n$|yp@6_϶N}ΔFY?k՗n6 /1h:Xg][sfK7WwƗ̊^{0Z[_hj[`.- `{)ql8'1:a dt<9Jy5f6Ch-v&rQݩlx޽V>lӃ\g滾umR[w҃=txXއ^WW.hRwmk?B_6ģSW7ȾпAqC_{Ƨ+;O KK\Nahc>llqK=e,8Mq\]P>%0+`#L]S5 [tBwe76CZ_\Z) oWדRM9XL>7| ?Bw?Yy[NE>?\Vgw(6-O߻"KguI;o Y_R֭Ύ2/'/1Tv)ɨC@d8.5ٯF:!o6eV>>;?rxJWLloC[sitx3t -<|U _uiRg{~˯֊:(O}ޡ3ߊ@gm''zf-BkzJV:=1ȏ5^};tT[Rgϥ3sU{Y[tБ [e[SZUsyt5# Jamؼ<:|SY_'sKcJg j qB_$7FFY}d`c#as"ō-dKKv|Qw},:ƷXg8TQQQn0w[[ ߢ/-Ï (߃;Y>R񿙧}uϝ|SMo# _t^铂a?C>)t7p}淞7'CSg?g^h wq~{rOJb}BGѕcG>}O;2op9=vlewu W73t.=[lwϠ2;'+k4X'=d7YپBAk.V>gFsiʥys2bH׋:}bpe7zϛ>ېNTF~G݈mH6Νwtp˝|?}#p<8drpۯ%l<9'=415Jg6ƹ2om"3q]{3|m~csbf r\6FtOVkCnP~Ԡsc5V{o)iSu]й_o6)?UJI ʅI\[C{>|tyc8C"TݍX;yd_7ګQ/ƾ%C|xq σOg&MͿuB5> 4yngs |MJ_Λ+v6n==潷~{^!=@5e֠G1F mc7#Ө38- 0>o>'ߺ{¬XKP]b"}TgNL&2>Ƽi<4<`ft6גM`@sm`LkuPVf[>=`_r~jV5[6s~ƽd])2%ygәѩ ȍx@ |D3?3]q^Aug5٨=Q()ܯ9G-}-zlp9 ?%%vً;לN2cr#B~LrZ'L<4l/ٚ,Q3~Gjt]z>Y3-,ߡ<_wLO?V[ 9Bt2*YJAВw/U%uryɋ9|ً|9pY&_,i 0tS_[:a|!u1([}Ěf}-*+FUȃGz2+Z#J-t_\Og};I=sܡUvcQՇ|Έ˷+ViHNNKQ繼:`|]bt4eM גr[7{,TÆ3jօvbͥ:ίs}=nzCGV{aͿ='[jZޯ{Um,aceㆎ˱G;ػ'[{GSdSd_&wrIޏKt1kk K×*T[RL/%uX1 uOJu'bE~Uf{C?liOfΘ~<ܔn8#!'A.=1h“s_-1t{S:a֏ r/W+AɀɆOA#OR뗵g݄>a86~3 ;-ѡ}.4vk} 9]ř.K MLB'C>T[z>ut`ҜO=uOBHE5[cE"}Y%%mNr6ha~ 3:al > l ח|2i=$?x8ٱs9EqZ!_ ~ib%_ү^7]>]t8a#d+m}œ{f[f} w 6}Rs^6Ѽ1oߖfM-|eS.Q3kvkǺg/Ct81OvՃS],:py/v/ OpQlᧁp)}6~4Y3x{6ϕm찍+C.K 0['|+L!"c=unnqE8΍me{/'%G&ldӗ ~,9Wg aaשG&M|kNSUVVu+mEy5\nYYҺͲق7s e元ϗ36`)'l?{F̝=ҙ@>6G~ |^} u4zK@+>Ȱ+GwIܣ7{1^$V\>{Ĺ Ӄ*3S3YMPxwuRȟ^QsK|c4|,߯}pO|32tm% ~f+Apvza[E&;;ȯOgӽ Kǁa<cغ o'y)p0~ЊS+[祘?n3=pgZa_=5󵗠ZDD̗}.ǮqfoX_Ga!kOlmL3z!w`oa-m౵ ~w{;Exk`OnLSfO1[{(/S<^{ɓ3bW u 6ϙufcߑ\<^ {WWO<9'b]9䛉_ vpje#7(ʟhװK}'Gxςǭz{qK kk@> 3:Vwky(}I|%} ϥ#Ż &n5Lֈuk>R>/K`R.Z!=j޹R18 WX.zSV`}G[1oUASOS>49ssZ\Skr=Y3 .ömf/c[<]p:WOiqw>t}Cv2b߷KQwa->>FO>4~G~ w?=>XAyLz|m|hލo;8o;toC>G8*<>u幋QeD3ǾLug!WW[cL/Qbgi>Iܯ;FZ+;>} ,kg }hGCmp jc.oO$"?|qĽMӾXy9qK l/yb9|8 >o7aLUFSr,\ῃk.߽NQ؇boM8g{a{Sr.ñbHMS'ֆ~Kmvx̧%g3z<w9xId}+h%<3Yw>1~Q֧cc{XjFu}U뢣{]D^4ְcL ~?'br%>o?;'#4>6 /w/[ ]縩N=:ira"b/L :k>=/g^{՚ 6Ƿg+^hso|NveFgOLrt+|B6>OmsVl$ /o:gp5m1OKӺB%p>7kk1$ 9utw|w9+{9N&<* ئ񻌏y_YA7ז.R3+G;F'1̳zizG ?y+?"_K1Y[O~^ i-^s~HOc1'Qs5ȓqpp\+CvCm۔w?jϊr]^ JT7{ݪz;zCzis^Sg} 3< wɶӂil|oIbx_sK_its]XSnlk,t_KI2z~ynG3ދ4's.[q|Xle?/h/HTIWR/'#/bk;[ݳɤq ayujRFrwt {XdJ,0ܛ.οڞKlR2kx_#&+)3ŝ`om8,JnvR\_[owĚd.bڭ i}wZ .&B^ΰQp<^Q^?8>9 3r&A$sO &&O.[pՁ&qM ]b-g=*څ>Q>ʱyU⚈il{3 b]qE3[g^k2+謥x}2g7f6zB{׌^ ީ ,yG,K73_>< R Nڄ &N@ s;l϶wE۹~(SI;Q@*|`8ZTϟmz5.=rx-ŊVsRd0Bqgp/^V/?lK? /Aw>˳} Vcx^&|*lLܞVL(>(~[ z8=9hRO`/*yh{wY/ŧjq_!wjNm/FwEW=JfDb?Z2|.jXވVt2}˚b[ vC~ֽXXuo):ZWfO^V۸I_<ކc ޕH;H{p6>:pX1RbyGీD_o#_Eד?xT:Jᇮ cb˿)39E>/}qwIa\ w) 6ϻ\+8"~E2.:N1al8n;\}Ί6_6Gbn7ȵյ^ڠ_/6{gf[#}\mh>֯uW[u9}mMǶS7vtsS Hg˦?KAGO ~T,C]Ӹ8 ~|\k7miQ}R i}QȻ&o14::p5wC f0,\ρ)sv~?_v 7/6:XVK˲隥ㆷ2ZYF|zA_㺷=wd[iosxgA&K.v4aA -wO%N SszrН6[Nd o&;W>s`#,tط}F>ck zl{_LH/2S{KQ;hŸms_-|i0DJ[.7p^l鎉U:ϙ ĸl2A=|o{GzVc1Р:Als̷FS?^ԹR֬\;!7|2nwK--7 z>W&/ޮ^E!=| ^f/=gm ^ўW5}+7hpZ a):e|ok5amjξ)̅cUõu5mgxs43_}s7j7<:0-[ls).-L#sȆ?煽ht^;x֫bX<>?Gޮ%pGD' [8w;e@S'٩{u>`r==+} ~cj0:cxוt/F |tw垯h=sS>p<ϜG <wA{rvjU<b!Cw OnQM wSc?"^+댔=y0x,-?sx\yu1={ϕ@w _{ndv_[``V =t"ȾV2+USב<+蜬'x}~[m<ηRp(߰Ky,Ͼ6o2cߒ?=VZӍg?/O?u oўonx*?/w_rX?CikV|?8B%x5 m`(4dl=?$$t9{W8<'#>[G:ﹱMtjytq_3a5oG䙈'\캴 ,Ac¿8I >`k]v,2+]ѳ٥m\+ŽܼZ;yvdLXgO}z!_2_ׄQ l̓:PɸtQdq_] ם.{KʐǤ`~΍V\;,{kׁ<6z/93f} /$|łDz^U1]3Q.U|Wb[Kbm~=]`+ʖ̗!@ | mx5q|m>G;^k]@&9x@3͟ףp.N:<1:Mu>ٔ9- _=) NiN͏`˔",{smXh9/EXwnmpeL|WnR{+Ʊ v.woXR Mr9Q<9ʿc*eU+j|jAo\'n2b47k4xvybܭC ӽ7yVsf[b|\m0όO{ 7<.CG`'1}{XZ瑖=;w(`;ZwLCwa{^8; =`_WJ1_xjϋ5r/r}UipE\6EnkI%-F{3#~Fg_pZ D1o[hL^0VX=,{h/W^r?/}: t=~]۷'?qoMYy|~%/gd0t};e߰O:Nt|?~P;۞Mwѽ6veֽ+D|`k?6鑷lW)k{syYk;=mWڏx*{6NA ~\Y_- Y7cާ?Bk]9xQ_YȽNy𧾎}a-<О.%S7|kBC.gcD BiA6duɧ[=lɅy0:P\U߂ױM@ 'wXtVzZH|L3GJ}:GʎS>yƧfۑ&`K<8kx+ 1rf 俰x_A>jJy3lPhM1׫;xF.c~t9Nе_zw_z?i[}?0\ٳ_41utG>#x_םo?eʆK*k-c2;'>^rR\|(+4pY~p0K]e7_G] =GށR}ZA~}v$ a{.E.u -'fgFr0>Ӭ1֗Ѧ| nN[7A/oXeGS= +Ƽ C;^Q^2e_枟ϵg6#_٦s'=3mh^A_ uQN 3z "ェOTcF=sOFYD?%Y>:~_kV~қ"!>s|FGMfkC4|/lCu⻒|뮃\&ɧS!kɊ_ xAʠ[b0 ,V]w?7>׬ĮW Q :U3-+oQ졦kS۩Ņs٣=#>a|}Ibkx.[Owc!LF"^q~s7z+<ފjrix/A~~Qׄ HL9+M٭μ.ƌU )?K(f!Nь'mڋZb^-t3"ϝ ] sowk.R|*&Y=/{Ne<`4Y%':lh^>7:=avC=+u^q6+6m̦G0 &49>S#%eʕ5RG'1Z} N xI1wn4z ˵ZT!>cǮ۷e +}AwftoM d6V:5s&y)dGȖ k/^?~<9q~WKyIyBlý-$|հa=yFҶ2GA$x$ d7GGMoF"lX6(JF?_r{t:Ή>Ǻx6xfGw ' lzF?88>F(W5 -dLty Ǡ}>KОnwď\M>LJ]y;mdo'EG ޯpuF8be˻R1v;YpG3>{g)GpW8d(c[2x8d)z7z"{ |҆N+u#yr&JZc)8 _.$8 zWDz_ou_M[ؾ#&wy>_IEvƆ0=o{0nb9ϟu^yy݀ܙbۆes5ڬ uWP|k[3a7?lY蘙GZ{l|6HП.65| XՏuwnfsmd>pz |qڒ1=-jpu ]t|O_ξd::. j-?"\3VgؔLYle|=zb&"G?Aq7c(Vx{KOjK:ϗkM>DB_=4I 4VGG>`ʽa;OB?5OKo]g}7K6߀F~<-h|$_v.Sl6y7ó7>r :?Y[]nkww³KE+3φ8wޮt%lүW|Ǥ8هo`];VR;.1/?xJ\z/:!L}FI?鸦~zӄ]}–q l$5t`S$W>imxVgtsM^FB79HMă#)[tavvg 'Y ];@@gs۰lguA>%C]>ltdzљufl ec:7x53`[SI<}QW9#h4{'sƿ%?v}𘵌1Os;b<۱lnut/v4?_gw]I--XlP,KxGh>B ٚm *~YsW_׺ΠCK?Owgt%>n:ߍ{l`û2J,>D_c#:ts|On=| U[Υ{55\=_3$KC{bf Qi|G'^pgf :j89ӟ7ɏZg ?Z a^юʪmץxV" Oϧ޶&3@\w:.]o=cl>6z:>Pϴa=SQ GIМwگ*Tk rɵgm{3xݟ^g&a3k1x der#>\+vɛs/χwķ ' {e(=T/ڝeu_*W,%cJ{W1C6=; >X+Mbrb щL Ύm. ?|Y_:mA*B'3YqżQwr}}-'67|=>̄2!3];Ǟ{OKqF,<]ܞh8g VϹO;;\_L{&|΁u .E _f*O Ϛ?^}j¹Ay[w承x.8+ݪS+y[Ïio;x#e-(qt'\&eUeju ˈO;xk}>Z^G>4e:%𬳗xp}kgs U1l>FNOk/ߢw=4m4u:kaAqe{Lx34W%c &ȯ;::A4\nW?9GC9T]l C˱GB_ ~9Vi ]'ٻ+R_ zen'ch dɸjFb?{5Ya\@iKhw)n_ l-IwбAw3oc o[87^O[7܄3}Wyk}מN|b~LCru~Y~Xc\.ښc-KE= uotim<{T?XlhcmG.ճ}󨬯G"E;!HO'~|_(2l+?u. x$&?*|vtR {ѓIa޶ϱ:k`|,4 e6ߦJNz5~+O?_g%_7gQ_O/6Nۯy޴`'\}8o=?2`tVO;lEvt<4~`u!wU4a+ϩ| }~e8ؑ߬6{d3` k>#gu)[K.e6# |ǡ<ғJ7'dmC9/ZC?J:?Ue~9_cx|ݯW~11kt絧Nh4:mZyLN?gݩ"^i2SQ43+oܞg'n99@6G*v.uVWs,_#ݓy IO ?,p }&'~W=ѕnҥ.0].6&y^3]wpe=+)kqcn}[7~ځ6Qz?G4{تOKZ,8ari (~z7x{O ~'A˹r0n=sD~X{{xx<\괥)7 :J.|R?_}>sl.dce8n4ڿ|S|F3tRȕKNO }&ǎA\ӆI:z(pV)< 3*E^^kw,ԙ'x3XqL1F//exL}]IgNz ;+v I}}d}Nf?ekL ٫d`fr0F;Agu:MPF{V sD{Co(+ѥnk0(~qx|VD! [9Wޣ.ev)[K|kL~} 3_.2:?#Wh#r\؇ꌅ,?~A03&et'W\8 miBlլ)xZd윃Ft> @?sl]ף-n+%; mR^KH`*ڬOqZwK`8_bOž_5co7^mܗ[5jdst&JFCn^m!_ܟ8C >ҙR3^Y~w(9AD>OMo_n$Boe?l8{O|=Nxso'z\֪3w)X^=~0w ~]1)Mw fܿ86Qx󿏲Ou{de`螤׃?^v#l8&_:sv=3_߰@/{T u[ϲ6Mҽs芌?V̛ylNs~`1<}6vz]+f2s[ x5d?=Aww=̜nM^ތNP4B_ltW?^שhƊGl؞xO0@gmyK7˷sjNdRН?pe?]=b%| rN[M{G?6Uh62Ϥr|m1g+w{T~N!݃t[>FsgitC-txy1| JۺGL_2g'X;z۱mWGgn73%/sSaZu6/vW?T\Zp :r,/^+MH%74:]vg޹.)'g- #忀pP^3|,>n}gJ+c)-WF"luOXq37㐕?yM/ʓM} ;dZζcӹ']ę?etGr7ޒB/ 2ȧ>N  sgaƿZK}듺/г;z}6T>_nl2OLɌKMot187 `z | aŏ.zֹ^dǧ'Pp E1} j+$`%J>UȃOzV ?d{_sRmŇw41 1Y8a_^H[Kc^sS"]2z],IC/Mo8;dyl`lgQԅ} .\u]QW}L!9i0}8C-=_)vB/q{><uòc./G Od aP/CG85(>`}D'+<?SZyyCѷczm@vlאt3[ˣx;K3:C霹Es;f8֮ J&g&ϷwX#Vt{g=i4;3\Uypؠq~|Cl>XɎ'j uH}H%O >58{2}׹K0tF3p_)_ ˵ןSF8;q:aHzљjА*_Unҿ= =+ѵ+׀_(ূ>loCC,e&ޅ}1Co dM#x4x%|(Au6tG} /(^fq]{67ا>dA>jĄN0Ά B3K9l|cr@{z7+lCgcءo56nFcgsZ7|N3<'-99I^+ ~ |d4޸2|y|J!49_q~חZbH,9'}z6:Yt߁ᑝoAngX/v)/w\rTdIYx~68r#{ e;(/SCZ jYd5x싅 !N=JQr۳[5k3+gǽv3{u v|F xs{_xT̩h LvC.yLʼJclOgC?ND=A>*qʗlmٞY{)8,x܀7_hYȖwCg%5M/x\8)8_~θ߃9, -!q~v{=kuǝݭw}Ljlkaj½;-NB||+Y?A:t1{N/b 2R S9ߊ cKgݼTd _42%o J+:kV|Ŵ ^=y-,}'uv!u>zF 8yv6#ä9 38GIopQ7ہ1zG|R:?},1}T{9҄!ֳW|zjq|c&Use_()3)2[:O1X|6oO˧4.K.;(eZyhЗfrE;eu>myڑ_Uኔ5LkLQں׻X_wtp`?񱕏MφLLYlEM/[?8F&m\{}7g$s#:o\_ Wx:_OpWnH?o,ߢ;nt6t N_g~Z>'3M,CIc9wn ][kVwMKa/>*:Ǐ=:3%8-0^m{k&>LJV~4+c=}l d ԝRMަS} zC[{9>)&$]+m^<_}ts{KWa?V/| 6E읶W>Δc:ֵQ:c_)|Q_8#{qН`э.35Ekg :A}pіjD^%W^{3? 1{|$yBth'3x{Xt7FC[6;=M|TȊߌc_|}ZFz:O9A%ة7Lgs/6kSүoyGffȊ6wA@Î;^՗ /]SYLY>GWRF,2@P̣BdS pmy}Tc>1b]O9? 5ڣڨڙG[f0~y\/3:al5Tͺ;{Hxo]il{s}}WE{-\~kO͟q!I txIYm.uUcՠkV=}Glt0]^sګ;Xl`՝3Xı?ӫh1:[sgh{=jtHrVh$>e݂O{G7Wo+ ş\^]_%~C3og%^8>l/|Q5&gv//S,{WdMx<et؄άU,[`N\|—seoQ^1]>qǙl0HLn _E ?)x@4:$lo&;dv)M2&ՌǐgGg#ҲiǯTgF_lnO`ߡ&ʖ.K6cSK?tFR7sIκ$?1YwM d#esLi9^Ff}sh#.@ y'W6ㆱ&`@B*˿וu#{}5﫝r|%svE~Um}қS Ѕ=ƛOb# Von)/Ҹo}zo\E[v]g0M f59]?Ejc.S}/q62ߟX}N h{iC>W _ g=;)syXNsmWzoY}w[]#y[ 0߉Kánklk]ٓ' ygb|k6Fg9 ߑv .HYv ڟS{?g}6̌_VlluVpN=O-˫>\ic\6Hç~Nk/W^.-gu3e>ߑwH]˺}Ìg}^NAWikvM<*y/_7 C˖ } lx 5>ÁqL&ǵ'7c}emlnelE>6?ÃksSp| Ns%;LoТ>wz_=u罰)yZ?$4WRAgt;b3dj?َ'h@gݘ˻\uc~YEYdٸW?6m*qy64܁>{I%coJwǻ(qxtTb:},w}~s1E:Uc:e}_~oa{7/ǜy32%SΕ[RLo|\&~z5h-[Gyź(V*]l|syC<ɏHsm4rvh=l{~3Q c.^`u+E>r3Sz*}IuZm3l9vZp Ornuh龣ܳ~n7V'_F3`I'n3p ql(6\3X gݷ%gl\LImmˇ ={6k/eeFW!<%f{=_AK`C;k2{σ'Ig 5;5~E~,Ύvw7\qu_ɗlb*<>swAxu-/2:mI/W En- Η"P]&:c~gsi6'VqzNto`sXXQ/%3|!\bܯTNo8My19]Ht&U{}Cݨzdt8 x퇫1tpiSVG!b:7$_},Wgֈ߀xybi4nw= rQV]rUTpvݥ[nkQ7U18psi8IDOwIeޞX%|y\7ߡ/ZK/U[dAϮ蔢ЀT!mkU_Ljuy^|o17Ƨ,_w-icM ?|u=4u=; ~q+y{ ~T\sz詎~l{G>=,<+u֦b{QWmdW[ hG6bVZgǦ{8oYSʛmY3yR{mr'e-^w.с+&gigp6Y"wfOF> ej5$_.b7S>Al'7wƫ+l3 >Nґk{wn8q5mOz]a7;ǜRGqsTkxGd$OS>$xHזq&րdCdLqN$_z֢s)TkHkmȯ_âȫ^H..e/?-?G'`~eSn&E|rNxeiAӲA}k>] uE,  ʞq!K}_g{~wg< ͞0:{ vkl;f.Uei<}kgOO4~!A_xYϬo!sѷo%[ozMm'Z^ YCѸ#7dFj]ܳ{-s31%| ?VOd &75 8gK'"EU'|ޤg1< QdM_ڌ_VgcwudйKzM+ioKxOp=r5Ȅ7j>s2j芟Q>0_5>8=rgxft ;s[uo͗aBfZ,xr vBQmO>sm~#reDlO.d/\qԔF-6`2۩%|kk5xq=|OK.Y#߾Hyq'`{5#;@6gQe)w?X==3x^uWz+\AT۟2v9$,^h&xoLK%0Y+h-2zol򺛐ko<iy'Ag-,m@;jK'CK`G^[zզFuhb;QI%#uWS?RQguLm:O)j̵j[Jv*ϓ`Mu):9M§ ygxb¯|$OYm_(,=Ö<>'!?LdLUÛÉ{]WJKW; y1#RmtVmv~r2gWN}eiEbs 3c=rzZ| |>諱CSLkغOg1P,Ptн+mmhrLl7FFbM '<=u{wvV_u݌{YF91X>'~O-&}@۞zWMl=ˮ0mQ&y/ 0\5d>x<빂Ⳮ7yj8{ \:!~=:|oJŦnB=3&cXt`U1=Ǵ$Ț7Fo:&cVpWl^unLk4~7u%{: .z_aks}G'_`v)Z ÚzGU#lMmYq/.!O*Ζ05As ?γ#]36;=l;kLTH*jOsn&g(tZY k9K- m_(ZQlk7韃Ӌ,wgE~uh/62JLix~au4>k\[2#:ҞΠ)?/1u~Tke겲!C2xt%uKȳYʦ M ub>G:_?q|]SUu;vs^[;ձ-`5; /;.s̗?K ?WBo `OۮbO:ȿt kk 收w3EV.6eWLٻKAo[SUOV}U>5njH;q{cxn>Vۜ(ڪѴ52VWnKBZ(S=)/<5S|#0x|NRpxڔhI= P Z9n߽!;nQfyYԅgkT=*Rvb3}~v\ CG[ uVۛÜqL{lu2G[bCV{t>(g.=mc%uHOz^|06~أ:j{A59_k= |XFgA3%~g߶s]xǁW|d:ѳ=g;o=ÿ\>c~ ׷%K5mέ]:9w ^3o}x m"=M-2ٍT3vE?q"wp4G#{?d+$" N{[[)i@7at7ftZ]W_,M/ɻF>OU,z vLfOX=<*xorR؊E;Q(o(oL|Q~f0?rڏ} |ku/?w[Ƴ^Wp>[/ùq:y3 fs;Obຟ oTw;9ҝF˱(z#0 >O]##,ij1<=Xokc= qL wg^[3kg:o}bVߣzOfHg_l=HYS;_&?=N eQg:ndacwFeG2͗o/\x+|q6 nw/ ;ngs5dt}S WqlVm^Az)3tkxjuKyQ&7O :+,Lg/z^/L-4__wYeu5VeV1nGxmrOљl)~! )qξԖwq~H笰ߞ7o≾_~>=/=}7?qv| AeSL,G݃1%95|,_"}YwAjjľ+1>ې-b>4~3 93?Y(+޽{x,+sCmoXcbQ֯&;k[^.[vMK:<^J\w?΋`0^)ስyap-۷dƣ7Kώx ֲ>cqBǐuu'=*NdG~ֳ a㭌q~ysᬮ1Xw9${8}y;É:8Ck⻕:M?)6l}Ս_w6% |%I=O!8GA\T^=O4ueNǼs|/)V “b @>>~q'<אt H{zL}>&9c:5^M1*mYti%[|A>XaYv_tFcjgi& وas2FW򣻗~֥]kX )-Wew?=_g(|Rgtn q@3=w!ˉo=;Ͳ3tKTûYz)tq369s&Wkp`\B ܑJz/O#󏊸={]cdwYRO1aF_RmoYQ zy|7uxc>SFg(Fx9~\ةǔW^c}dB&9>ެ6%7.t^f<9iHzwW䋞N_ 8?Ex8{SYgH2 Cۯ[ՎGCxN_mĜ:]hx.|4xlbp;|r1vOQ:.Һu[ҲMZZpm7޼-wA˙|:1+w+O4~X%Fd-y]y:gl.cXDo1Mؿg:K?,~?kvF@Y6ke`zpTI~e ymtKL~NewkS:N~z]%%F\Ix_?wpv*@C ~ {rZgr슫w/Wn^Ιʺv_/2 ooO73$ -2Ѿi(Zdftg(xdW7~u: > [[0&I|ym|\2N宪w~u=!Ue'WY>:nhj^_?t8p2ޱ#Vv޵fE;`lpvQ#sh|Ι _~S>eWc\c;ڰC.=r#|>IߒUns^ZL'y MZGeϥO7> *:rlIb9ߠkAW͔}㾎?<38E*Ɣ1hNq[=N`@߃?izV_[Ftaߜ]7m|1_W|_s&#ܙG,b^}rNW9Ցrhco8G^=#Y=ycؑK_ffO3Lz;|_:o=p"zl d 9/}ϸ3Lbk+}epgvL6}}{93ٷ嶞yʑZZ~5>Ӑн!"w03Np N| pOVn ^ɐAW֔P(c}nvgg|i!G!7o&{oRz _忱Z=ۑ<+P]]?@ϲb|cR: /m?WElo<`Ҕu4 x8Mn '<=̗?z۵77%+3c=o>r F_b{i%{*u&lOJ٬n>hsh IΫF׷/mOӰ#韷c+̧u(E >.[=;W, xQdl>s.Ϗ=.9 E t9ɮج;/ƾ>U?mVsu?s;% ixz+O7{;劧mW![{}gcߥ~Rf+љ2{Y>9<i,k}|jj;~,O[5A {PConOD~$蜯sz~Kom㫞a?oAsJ\Sx3c<36 nc2l+JsE˛reuB y. ,wkgN0ٔ|r/8|p)^.{[ [/tiSN"\tQ[ VC/`u[l펌M߫qW_7Yg\NY}ZQ/F2)ؕF_N N#oWïE~y,={!|4 V_v8tۗ1=b1'^wQ/:il?Ac},q1V^M;>AX2 g,h^8Nf N ?جI6f#eD?pvpѩͯ|-xb ГSpOaFyy<]3&B L;juoIЗY SCU;E8J[ڀO_<_FgO4r=c⺽ez= [70_;t H"+fTu!{͊mw; 3:tZi?h=6v:h}im^3M ,qVYv{ۗʹ2yox/QNH+t!gggw-e#5?R޵<W)Ojy\Ż o-~%>3Fnq=e{/nRe_6^ޞ}oMxU,{ޙAM?f.{ vZpq_&693>~.ߦ}W<]=5S9go/чmoxhAep fc[2H@ Q\WEre7z?O<5Lx !%_?a.߷˻Uq|яe|,Qc ؅\V޾GA(k'6&^z}A4>wɮ~^eyyGt_#'yһxwTyWw>rʐYes^:>71hS6~ .ؿdzڔ=lMVį󓹹&W_?b'8.Ì&is^:USy3͟1P|ߒ41˜!=0wQYu"WN<5t_p~Nqs 6Gқ^{෌W@"<65it|&ɬ7~ ׸~տULMV/?RO|lueH=>9cH3_ʉms {ObJuQ=v;;-߿_/{h'7~9~JwiO#F+ QAۇ[MV6+߅co OܒQձ5d))q/<ua _(:uDv*T>}=gbxc'_"\sWˏoϗ皝-+dj7y,O~8.l}ҊuOϵbР"=vfφW[%\Hvի]ߢAѷæaQlgRtF+횠i\I}Nv껝NmF&߈@,so DF{9(wwh6)ƔP:ky>7M\,hp>od ƒ:w#l^Ơ6<3ok,vb4\t̥ÇdrpK]Į%{lc}ֱ} ۜXVq] lo$j^o5C7-P|By&|ru \7M rׅ>Aw)'qN^Ֆ4ZjkXuzfY 7u!C6vy߃Sq}-{095${5j4g">c xT:it7߭.Kvk0MsE|ŏ-yq/Imle_KЯk8G/x_ y{Op}rOqśrIyiq}+βeJ ;?RhY֪bhaS#8 k|[ I9yXտOWľqo/n[̈́u|3džІьxT}H޹|h\W/g-q{s)ީ"&?B[ÎaC ,rq=ύlz,3>q$g|2ư~d#eS>M6HїsW8 KX\1Wx&E=&:ʞ7|_ښߝ=ZRPI6oM!`et.L絠7Į&٢͢&Kߣ}A<{To.YOK f8qFbk{en2[M- fvoylgwm>VP*ɥ 0IYrs?όf9LixFg5m} #||+|`>Gglw.ii]`TNY&(>8㷹vy6gw}̧2~Xۀ5yZ3Sfxy{e>f]ׅ`M=0ʾfOݝ>*Iӣ?;fy[[:?A:rzORC)%OۼD9J s'-,ܖI[g\7Gt ر'gsf /1gRVH,jkf9x>$;}eߣgVgFGүxBS󿶷9,ۇۘ%F/kϵ 6xq[ ~drؤyy3֙KxmNu;ڐ~vFMnޣO]33~Fi~Өc:܊|} A뷽npx ^#BDqK>~=ٯ3?.}&w#WLewf|4>irp@/]:zg=zYt 8o TEܢ @|<𰯡|tw~t6>syrQV]*8o3a xL+źf:7Of~c]wo{t4,Cmwa^@omYh;陱`6ئjgJvvi3bWef>F}:RCfNηɷQ5>A5AK6@W%7n ~4L {H3M w-{{"y8 /vXiѵ1+ :|̻D475fVCL_kS'_ XVnxxv]aon3ǖng ~#eLj|7bTM^O-W܇uᇀysV5U(}YI~8ʌj?i:iS3ۛ_XVG1ޠ%'cӲ3,-ǯm<'].͘N~kSm-$PErϫC|@k ݋ɽ<-^鑹O|/LL[?Q#ag;x#{} !ts|ű@]a8œX݆`.L xݚí5#͂dhf[>κo3-<+~|3}?{eaxb Zyb' U׭(|->UCmW;wet&_&N q{,G? ?p9z!xgw)6fj/̿WWgn_YStSk_ޙV|e 8ǖzrΉ"xxӂxG3h[g ㌧#Oϗs״@KyKW3諭bi֟\+vܲqὍI?j8S/'}:x W"1&Qkbg{޽\?:?+,P8N!t/vl~X90`\gŜ>T垑7|3{o:Zd#x+T GxѦQmm]JNuW`uQS6lύ}Cvu1OwXwǙ %Jӭ|$W~||F(x1X(. _K?C{yYX*In/kxGЫ9~7*f t)JO1ܥ?&쀙dÙG#"gF8ֶnQL;2w$^"$d݂˞og}<~ẑ摊z~ #buygU~[|wYT~[Uy(? @gyֳ|<%|ɟɚ/|WNۆe>7h.q{X2%p[ǷlϝvgtǭdC>H_a$GOe;98#>flkY芮 ]Dwt?]a()ϽL>c^;|M.ƭAqJЙ=#~Vz }\L;x{ =?kxC`{ߡsJpTS,˻ःCVBc̀gnDfR,&>ص md؉6+6˾ 6pUmkknOΧ-0:a;Ss݋|_1 _Q9|;wsRUV7Z;x??<K%ͫ|oYcVl#N:M;.ύ~yy]" ?׉BGNm&+>{ctx5{[5n,_o搸^u3go\Y>N`]x׎ O ~IY 8Љ5Y6;yI2?#ѹ ^Hlmfty`GѰE|V;1=c'3+|׎:;ZQ oِc@Ӧjͽ[ɫMջW?2عT߇{2VGp)xPqϏilFZ0rJ< l|,d3\5(;|sl{︧,qNv϶f;c]ou~z(!u@F: _ <6stS؋ωaܳ{g__J!fCαq_|{ߤ-<`gaUqvНՙ?>1:X{c5`gfJˆBKc3f7gXk{ޏ5lh߈Gy,Vp;"㺏+M܍GY ۰b0f`hb\\:~* cTg?u\y ;2<;۶il=MNh{hⷪćn QCsgΖw]ܟ|gx41:45C0D+Uo˴;n-g";nZ~Ykw5hMtz=]C7~}Äb!,ϛ^_L}ry|opvnVp֖bpyi;=yr췻Mŏ)gi8M=O+kOD ؋Ɵzyg^CksJ}pI`e̷~M*ss{`gWZsڬ~̮WC~ h2 gNg0mRpu=ȌߎEbޙZ;N2@z]l@OFQ]]7:HL6 6bqd3=ls74Y.=T?٘@O _otF YP)%(׹>ڂbLeSCֆD_0~-[eo?l`.eg|&눎;;V3kvQoUi%&xd1KVۺ\7y6woOj|?s}>C;X/<L!YDz\3 76orJ 1'5@}\wͺGFQ;ƭyf7Վ33ѧ_>#̤yjk4jSwό6眹mj?~ֻn}Fqgs0,#O1m W_h":9~ 7`4^r:Q#%=4 ]D'(+z`ó⴪=?C;Lۋbٹ%eS;>^WFG_tb[>JtnI^'̩JL-?]5x'k303ۭrx5tQ=򐅍=vZw/ksucx'1AFc7wZwFǜm}G -I7:LAlw~= 7Zb{#jw^̄^kFQc3Zy>L~}A+:ˈcaf#(і:c^>_Rf΃j\VvY"T{NJ^O ~}UK?kBמ|<4YMЯ3Vuc$6-_L,`ٓcToJKM~p ͼN$wY9k芃Nk u;EӺgA&V.r˅ݩ,5-VY1_=>*|* S._Ӆ6? k2{ ]jW=O8`Z|>5O-oPIAw<=16l/5x1st\xG3 t]'Lfz vNX}ks0hߑٞ15}^Qo{~M3%9kطGtW<&__~_z߭7G^ǻ]sguC.n ԫ]Ъuل߭+\>az>:mg4bζlem.p*tN}C 6w\ϟkNЀ-/`n~2(~c|)_|D ΃c^id/+oe2 %/A1\:d'Y?Itw^lf^L~jЀMl|^plt@Ō&>Y zyog}riA&[p|ے_;OBs gV|Zi zk+ʶ.ӹQxʐmpӀكqq~qwbk?7{3ý}1 =G7p-iu~5jt-;|u=(#+ݢ'+z952'+.LI?VǮ1?+y;}1&zQ6tF㥏e7)D=K#1xeso0J~`Xp~0_>d$c n3fGG.[6ktzh ٬;gޅxwͤO~[ټG;Go7nm?B_u?^wt)VoBŹbWWά?8;$grO>KG߉bzB#4=lF/B.tY3p{=g_ ݸ`N1݂%{Y^n`H5t͸I(\U/>j|د̓G5džyX5[:_DwfyūZdr)vYrpGuoYmZGb^q; Gy[,eї! 1}.  HRU~Kb}}?gt#_'a5unQP^_yj Fс]hy31^~ǫϷ[:g2+g)^ym(8qm{F>we&&*23c}8>ֿsG˓)2":aAfxyBYG>L; ?n\t`Qi<9v~tFwKX æO3B-TA6Y{Z %.Eʆ~x]#6Z5׺3lo[Ͷ'FS@sxd_Й e>)%y7|OG=/.c}/71Y,xg=zTAv óKh|_B}.}j dysc@}W[/;%E}O1eKZ<Á0BqӔ@.~>ϲ|?k>{ zg <،Kx:cBZ?}29Lcz㵂9n|udexnm3gE< aθyo۸y9xzΥ)ѥ VK'CΘl[&J|NBH_ҲK+Y;G G&i2f↤uUm?գrumӋ]R^YoK} ux1y1Ig}sμֳdCA|غ=7g3J O~>ޔj\YD{\x*hx'Ziكy{PlXl$kC:bfc+^.pE0gh0֦lp=S|@禶[L!Zs+ݏ`0J w7?\YSGGiӗ7Bq23Yz&}[?:&O+& /xxKd': ~ 6: zp([m~[u~G4gEriUԧ|[WG^{iν()@9ܙo3*$]cE飼A¿ ٮ-V)ox@dbB[JhdGbHawwb gۘ׌&&pse5`lг25_zRy/2܄^M;9?* Yh}>Qy4~Cga{ i)pC ^=$5]9g㸿#5'>s88}ӜV 4>49;|unOF eqV/E=-8hO A =/ ~':V|(z; |00\<:M|-ݥ:z.Vq!/*رu{n֫%LY6#`#>X%:G&MFe H'îAߍחgb#Dݶo賍ufX93ocF`Ç)ў)ug0o2`y|RVQ]v*k9?6jdu/,=~~xrbDw+U6`r"\T3oWbW:8'?z?'I z<5&_e.9_;Lo4u|J䟹O!&CW`*{z2d30 \*6㍏Т}|I瘷ەDwL~McYW"iwoW<[keGZZᩒ2[.G;T=kph.0 OKR^Wq_۰g^q-_m= Yb}llW>$=3B6Y[}Mߧ:lߏEGx}ÂkDV.J}կH_ h+h11 M6: AwР;jݔt;Ag?ebCSVN\]UGjB.w@Cc).f+G>szϓ9Mp(V9ր{ "+0}PgXp?>gELI!p|Tu{%~G,J#.[ўRlk118دG7Oj/缐"0ƌ;Ğ q?rcVwHZ{K3_ ?71\( bٸǫ3ndy54~wpt  -߮\^N~ƳC"]f!,7I?l=?[[8[WN.=_Qiw So=4]tl5tW9\eqե'xZn_UϾ'q_#b8Qtu?w2K~`tdm g-b໑WzȀwZZwhc6%o>_K;]ڇٜG5YF^f_&>qHK|[~kzEhdn nsI=35d뎪;X/Y?K=e[|e>Ÿ25b>İpҭtםix|KgrSxB:e3}}hla[G=.—lŖn{5>=lؽ#;VweHOͯ ~ z?K]/%0z~!A7{{]q XG9Oi&Ԡaag]n}z5:8)dSE=خ/;żsA*W#y܉wlI H埾cW;VwG C߂\ްZ;e.o.yUɋpuG>H?!`p;ktv:gPj_/ٿ7}gly$||)o0⛄r8^ۆuotĞ?u{Q;IY{Wi([1f}RL5q\oas~Eي^&s)gr9CA'2_*zQ9J)tol='4QCr SVzՆc͞ٽ8e\!~2+u{ouYe{WV #zjk %}pL{L짯G| #=>3TBFgb%}Mݾw]ʭǻ]p=4|;!(#dkzd|Zͼkc^lV;.?zS|}o$PW}wE(Jʁ#\Fg24wrw|˞u^LV|["Il\sQRKlr&ڬMvz3 ;%Fkt{f.k7,"YxgXp[5St>*_Üf>oAw_ac`?9_y/ٞp߉n˶}(WrUrtS/xn3ާW_K!tf|@Kƭ",[YmN8wRX ւ2ϐc{ kߢylIOӖx剱 +=r 2Z=c7mD`Z=Z!}[GػDKG9n`\w)V'\?m[^:<³]Mӽ@6N+*ku5>:k;OQ_ѹ1'AzpYwǞĦWh 8# w-ŮXb ٞMӍ/l>%9}z{Z1MHJ3י:+x}}S_OWg6u6/WswO5:+ߙ8[ ϾFzb0Ȥ/F-~>W sγ35Г[^.=`(4/x_/MO59Gw(bI}Rͯz[#3nZ)}5\аu=84h8sw|n;Y~8xG=t?t.4i?ߟ[]񬹼peyYt>{}lt]2+sik>ơcO ?ߑ\t?mz[!fJKc]]%NGޤ SHGy/zj=kcZⴤ>,^W2b21 % Kzx\슯Dz[tv([-o8-}0|.8|!9&Aύ!p!PlktqZ08|'zUɾʷÏ+n0Y xS.19Rx;:^̃:k钼4gERd0lxWZ7öt46^G}mȷ1d N#o+%>n 4-/S|$FA1"u^im?|\s-NF3&6[ao+\0ҝ:OE !-C[Kp< X*9<׽\񎺔_pcN7iu2|*t0_2ɸK}n0sȧ:Fz~|u:ඣB9Xkŵ7ZoY߻$u/۱ɅrehOڬ6>mƚ<'cB7}xӤ38L8}J3-2NŶeiqޛS܎?ņ=f˃O^B~2|uϡ'_եKWUI}ΏdB2~Y:Ǭ".Ӟ`1FqRlo\հʃNqW̳P̛ʛ~LTy;Пl2Y?2v9e|&_ϒ=׎[<ƅEqϼԿ{m׸% nz3f}W>~&i{xUl?x~诀NXOGwuNijcS^ÇykdF?kOdx~3n{3\F߄V~C8.ֿ:M6y|<(C~R"˚Ö)~1OGwMȁ]v<ɟY|[}Q\4!C31^|4ew!םFtJU=OK17 kqjpBbPǻ#DR|Lwa._SJ!{,t.:Z\wmgmmy'K7_µ~},O%ieuq~:޸<}*Z~]Fl:Oی7 ~$6)~禁`_Zl}ݩKT7lmy֝ }.2/W_؁[aݴ w3ȣ|賽~ۂ?au<+10& ~0rYm31/ +b<̿ټK[JSGIlvZwe瞟5ge_C_^ 6iXW}.FyNkg ׽Ub{ɾf9{#yuW;|ǔ1Fb~P_pRuN(uridewr] {Ѭq,ZCmtNz.S/r˺ 0x^5.,'}Lh.pg16Ft2COȚ=DR;8ND'8X^.V?0X_^ƮkO.vʞn?@|~+Ww!=Myl.S3ZW2'{oO&+.ƣ%/7d~V-_#?_^_|>N ee'8ɸo?%{Z_rV);}G5[wmgd6bLƑ:g.VOX|ö^{`ЅcLF78&nA&k~tC1㍈(]Ael3^ş|u6{MKw^_*(3{tʪϨ߽{߁} ^owXH/iu ǥ_t&pswލmxvk^F|q$o|ㅆ(i?s >WWe39@W͆7zYw^2_|3iY^===޻QI%yQ|?ڟ1ޤ$|o<-~oбv!o<#kc ObMc˟ #qBgqzU_p\}4+œ4I)?t+'^jeq<1:@w=o0ܯi>~qMeLȍ}vqjǺ#5Z#fM\_cYV tzjɕ_RTWIO8Bȕ˾ 髺lX>Ɨ"]=KKqpE^.&>tK7AD1}G+-g~:cbw \lO;gM/iE]cadqv+ϗkZEx03Y6^ңM ~f2IU!HT?RmೂxA-7EL_$vB5,9_^$?3 G/y!9q]2&`?M_7^^.ұL+Co=g>̾֙xVDut|X&vh<ɅGmVPf|xņ@b2qmUHg؋q6&W;ܩ_<hbn[n[^B=}-ɧ ~_` Q S],;9-y>_Sy9cC1/Cf6jVt\OfL3\6>g2-2\y7!7AUIAk^1Qñe}r.Z}oN~ޙ/vn#ȿySWUԡk|Ag7俸ZYb˼3tGm2>_>ZgǍjmyyc~ΊNlŰbFx!ddAO[ٖqa8[:ꗼ|9-^yzؿeZ#{S>Oubq}[paˣ3Z?+F{]at59:tX{bBc> h8۫ٚÿ^<%]Kb~\9 eR֬yIH[|؝0FvH?&5i6z7;.5\yU'K&g=|N1oK9gy~ lYO9dƿO;O96O K^%(]X-)ɏec_2g(|Җg{:== ܙG,|ߦ4j\!#m/FL(=g~ݾg6ok8GWu7p>@{Zg 7GnY㴮߇t65HfQxo@Ogn۱+օЀ=6NؿUuvbC&697"_`E/?p87w_0w-=;KZ Sħc+U?s}K]ֆ ~^W1E.w >4yTOk$ <:{y/}:6lr]ȏ6˱߯D'CDt6ٯ}wݚc6zӿc?3ٴ=`/Az* ^G7M6:8@u]c?y9H,_hckϯ/a3׶t>vY1{ãםޣw8:؆7yA֙'y]Ლ8\[s|OWÉ3>Xh}m,!sn=sCgm6#w *7Et#В5$v0Y΋{xh[.wld)s>G) aݣ 5/gyF ?Qçoox}3zz)񝊱 埴t.F;+{X6wcy b.'3u&c\-~aBG 1ECV@}6{ {V2%A2g,{!}N2'uJ4]k8Β >fN;h|ך[( \(3%{Ei0'rޮw;#pxWIyG`ތz˧5!)iiY d+nb{ćr!w:<+Px/w_.g?<,wk^~ż^+гA6jÛC]抁ؓ=ՙ= yOp 3-u;hO-W|x`6 οl eGSqdp=W۶u>0912 qv4sc6;ΧX^ZL aO/VޣkyBQV,Mee%OkG/o[eU~ ЇߔRK oDxpg,?׹:qحr^/Py;CV\%JkYsU7%i-Jݟxpsx~8 2ؗW>PF'Sxы5l #Hwgbs 8 0:٥\.pjgRw3{~g Zi/q }KL(N;ݝ"<>9Zz5p+k4j\ZkeC~dX_o3va#{+Ӕ6Yo7o=K>~ _ۙ']q{| |2c:`{MEt|0{V[w?߈b|b ld 4p>D6q|C\;orţkMsb5p̪ctjb̬:&4veY9?-!ǬˌM@܂E[zB]ź3}ld3XqJ[iOAudt8^ӊkfqtCc&s">B2Xk/*yIaFcH;F1=f^]Q2z@_ZOE%y+Eʐόg0Y"%d{Wq? #. Ks|3M9Gw*0T F~BoW y&LnM~f}z;|_}cK_o_ o5>/6x.#t^?}:0HC>( ;9}Zw?j,'#f>!Okf>x>7jxBLQWĮ _o1v*CB?QCtU<lK?|-T\ I <#!_/}?-E3yK1w_sߺ̾K]|/ <>7F I~}/oXn8uy>_0)^]f2>z>+lHs}<8(Osx"\cc%)t̽wwY"%g\ $g  D ,A%"$=שӷ{cUuud 4wđ6 {664'ƽFaaķ@xKfk,Po>;CKMнk]:U Z&q=-w)v>v{[?{!έ/GHKee}tҮĭ߄.S]߅/ϕq_۾G_L_pkycu9>m<[\&KN^ν\FVX-/xy% BxC}!s[1oǿ>[;yxdL_4z3wN았O.oCOs_cYe/{3;96 +6Z&{ΊhT9mlN #gq)}Y۵α#O]\<9iP8ʿCgU}X7VwjANtabq~(ŧ4>Z\ye+C?^hq7d.#P4D|7x^~g1ֽj1}[Њ#y%ix縛^~v Ր>.3w9~kɒ.-NNk {ٚ ;Pk}.Fn?gymz迌ן]v}ÝĎz:ٻџB*8cw-}>׺  4l -xѭ:'֜B3٭ oG7Nj%Otk6_WU5E# S ro=޿>f*&q݀)8(K%(_ח|c'=ut x+tp-xt K}H~aE6_lfY/'rz!~'gݰa;o"ܰ`+=e}@Eik_ٗ򵧘n0Oo~_~ӂ|u }1]aϏQYA+䨼sygŦѥ/d/@A&3a7I\/ǕihHٔsseYs9;G`}mm\q!65>7{9Y{7~0FJSۛe3O|U&oMμeӍYc^达}q(:a)h~W np0CF9{Ŭpfˊڗ,|p\>4~J_~ђ-ig. u'YpyS=!{-A==H\M.'ѓm]]ѐ+6JXD'MVXd5a1zOemսHw%ώ.tԓpG{"Nxxrt}\tfb`NiuVlב2w=:9Z^CYԷyg~Km?b$FuNֺ1>W`hb>ϐSH'[ <?6}K&~ze3y^ ?g+TXtvw\5PtxR{m6q ~Zyxş;!7, kxuތGIs6`krGc8eEHO@wFYV=D>uhmqZJ&F}_ZQ8!">q_71–=ù<꟞y]\ƻx[?)~ԯozό|u'yoẏSċH{aɰ_qWd1_gdzց wϹt+ίO1YL~o϶U+c:UwDI_p ]&/|rYay3)8{ 3~dtb >{C Bfa-tAyydmlWGЀ=ݷ\{[coIs.xEX݉S?Y>뤿,uZp|-[e[٪]Sg1PqVt3{]Vįydz|^Ɵe}Zqd^ڗ}nٷ V?~_k1B. >@7h{G6/8O-t"A#?טlZp:?Az{*±W =33%,׻]Ux?p<;ߋkv~?WgJx:劑ӥ\td?%oaZ9v}Zy[33*λ3/u>Cwg`[]IŻ3 1B_!Xifs)q<ϩd؇_8P.B^gπ++z bKmF_ڑ-3mQO]UM~8qQ=LZwuO?ul~}>Lƿqfnx!EU;o֝i`vZ8'Yݳb_? cAg#;j^qO1PMD&ssf<ωKktOYe|b@ut̏|i tз-y?g^t= qwLc}Ggf*9ܻs+v`̑0v݅BL~&8H;s '7}Dn郭ྼV.sAqk}܏>]k֩iBFނ>nQG&0yv[̇w3~Q{<3NبC7s!c]SHg/&d xa֚٩_*alFۤOsp{[`85}{?k8fžCGކ΅:x?d_A5 ⵱KQ"pگg`Ko|Ʋu;rX+;7~[8 ~>v>[#I˒!O?:kPБ2'qTudݵ~|?17k2+2l9.e]ɯ\bs >[q6d˺UqI8}]T_mA#zn(?`=@ G 勧@o  츿}~?p5B;Q_b2y]}}g6d`3:~eaJT^GZoܥZ]U]ݠowWS0ڭxhzg\e9}*DhM}i}HN{.8dVp"j%t!{ 2N+~Nc@n,OΈΖc×[?7:w|$kUXc#'U- ~m,{鎱yk;ˡymG5Als軡_zV%JW劂s ^L!s 5:}˟ cA&;ʹ|t= 9'ZukF+Hcgx>]JdGc%ebWONǮ}h2t`ߖTnnߌsYן֑LnA_8|yb]RߺV;uosl;r[-5+#&:7{w).f<t汉;8_q*qF>|+V#OdԿzG|Mg֣|lC7NŔ`}Sqbxy?=۠+>%[>g߱:2pF̻3;':񇆫tvø?69Ƿ@ak:?O)| .Aj=ʋM %6>yLZw6>2^;uq}lƉYddZS|Yo]}<766A,ƝgQ_{v3+7gs4?u>bV`Pmfw 'B{55Xh֧MXᗐ;gGVjo8@"/w‚_ҏGJ_x[P*U~þ~"xOAmgk%)[xzy[3p#MsC-i x}Mό[yY~YOhoٶo|}ŕ޺GϕL gcKcCGm@vk-1ƻ짳Wl_w?׹뎈4ںv.=9n/ ?f͢C795oy3?Z|>ú,9=-Uz7չzr sMu͸f?#U.vgZYZe|ٜy9>c4Xt`|=O'_OpGOt_52dQeZaOMk7񾉿{tG:_Nls?X^~ə7+V<sYxk}73/ SyQWt}&:/|m7(+RC`Ot^!3 ~7,7 aW<@s=JZitz#ϛgd}ʮ #|C6uXWE|n90;*mg^IzcuuO >5 {G\eK ?7:o||[)ۥ&nߑ 3#a#o:l\.?:6hܡȟ#5l:0_R8xjď~: f3>uCb7kl$_/:sQ'S!Lח}Gu-S>f3Ѿ٪w[%lF \+ù@kq)BV?$GRm H<r0QXwV"-{gcrG7i|H~7 ~?7~/E_CW;jL n< Sv|5a N_]N#SXEu_=:wy]թV #j[@KnMmEn UAr`N6.dˋ"|A)W4!8yo~$ b2]x?v?:gܮ??6:298ʹH fZqkou N:+6;7 020K7|ipOmk .oG`Yg'v{oc|W2LF~P;ѿ_'>₼S6>AUlbs ricanay7Q8{ƧH\ѣnp}X6McpjZϲ]26w=q,}f"~ǍJGu?:W3sd?ܺ Jߵkw-'Ω0.%u,ȷwHmFMgؾL#][?C`׽xQTcxqr46gEINk{t^m\tq@n717+nzt2u>EmOc3Ř} 8m%7|Ӏ q+lyKoL ^jGtbnt0[98EguQ2'_}*[x3?Gz\E/E{ao*|7+h=z[/S; ļ}=c ?*yݦ/ 226s|q3yО]o#| t>G ]ГNlt'~",?yWvG6O##GwcZ+db̒>iK/ǞBIJs._mM{{͏zwLܛ'ƽq[ctu 1|{o^k p|4ؚQ\N \F Gb};ҿO/_n(Vd>'͉i,c^UBLBU>=ls:<#iCr],wӊQ^39\ϑ֓=LJgA{ 1.zF[u]#Fs~).Oy^%8p[ϒ77<ظg@3qDK.( _Slb-4_x1:ѯ|*=}K=as#<÷c؅~x|;4޾E2?{ΡZF7`r 6t0rVo$Y:K%d۟RܕW!cǃ3D8t|Qt=k6*Ap qޙښ?Le|~L4ٴb {6Y_=chw_)T/ի_'z5%}r=7;m̛m?K6y2x)(*#4{q[l;4t־vb4s6;wc;SF4Z[z6[q=RVJ)$䖒~Q2o\cSFvQ9)@^zk|26~փf[clv#,+ 8wHs ۜ`?I3͞R9qͼ n+;Y uʒ1LmYpK Kw8gi7u-Yj&O ~h&-}Z+ rjYg7ނ 'ңޭ3@w?6z c[ - ڼq\mx)K}pZ]4nDT?`,7=W^",kTqOy_s lgs팗"v!zJBL4M0>|`ql*v4<%*:Wf&<  x)D3tȈ͂oAtL~6oKtmZ' ހG漵ޛ+ϗ}8_z?`o{]^k-jd#x>lznzQY](z Ry3zƶY{& Joz8W4v^|N˾=U_ŠIo 5d;Fft켹8z:wi{RE|r gmsY<~B}Y{!M3i1akN z;'Go7m莩VKdڹ=9Rx㻮 ֌t/{7^IC3yؖN/}Ւ:_h';ۓo#n=76x1|쬣ePOtb= ?k5a%߄R>i+_c£&_ھR$lT i*[[N4* OaS<<}w&pkH|>53c̘ olxC.G(>~5AB6% 2t{ }=7&l-~ؗmgLLV{kIwZPO@ m2 ;27䑉w-ٿ y,_6?6s}epzgA&6({ht瞚tڶo9>Cg[@_ y\vq ;0W `_] !L>K+ޱV{zz 5q˻6.v\ Torlފv7/g|lpo|+ wҴ QS?\HP75nF'=;>c]E_3}d2t&X?i89 ]by ~v_d:go}SɶȔOE)}80ɤW}<|_t 'mj4a6ʋ;*.ACśF7syl>+nIga'ШA4_::$~K~-Gc)Q_n{UR cOg['lL}?ȇHl\,~~I(gyN5?bgZ2/Oj,x^4dϟ Ø~m6n3T=KDgL~zA=nwyc6hm4 wa}68_K^qIW;>- @u~P|~G8{ 81b7G/1DySV,)9zt|,I?:]`?A}Z(^[" MxF=O-./+*iWql/>aLk>2?}9 n8OGg7ϒSCx2ڟp 3AyDg޳#~p࣌Wß|5do爍>k3l Ggfg?9u1mcKzq;6[J ,{`_άnNbWvf|xmrp mv2gp%u= nz:ucP[cUu8ΘZgd fm /Y:T}쑣9ϯ؟TYxo3@lrBO\'ƧgTgRGs|ݷQߺK<Eэ-o{=_tU_): =:oDl"*}S# cí=jG??@{o<<@Ćb|x/?D߂| SWX.]>-Gωvr]a/OƦv,;9^;o^j%sgYY>_g6bL:AVg=&+>`߱(.km7m_8ːGϊrGW=tx[#;T+{gkqo׃l`MtSY0\X3=S,ϵ?G,}Tg'DltA*e,M!>~2[jNmZUΓ2~ ozuܻ7齳inБS!c0_byaSpỂ،Z,8wlFooX>uoUgK>wwHwln^x>:utG7d<{pN_`ws .)ΧF!lPЍ Gc^3ww2&zx gx>v_áMxѝ<-y>]nmqJ | 4{_;Ȟ[ ]y,kWxk[:pr))ި {$+~iE b b]Ȕk-_':{̾9*]'t/9_iO^߅]Bw |ɿ?.1}T"O{bBq1KFNEˮWЎYog3z$y#f<4k\;;$oh~yֳ'o}־cpߝ2 Q zOclO' x`l:uv06G6KؕβrlEu/:^02aø+dO?~>7[Cc*ԙ{tAAd-g}v .߂Ñ>纯ihr_w!]۷Crut'[:[}/ы}7 'N8zKN^ j582جV?d\QЛ#D^E_ ^3zAܛ<wmg!4uݪ// ѽ7Q>V6> @ L0^b=/aBG0WrK_󲏩t|9m0r3s\od?k׶e;ΔItϙ|j3ҽQT>nYoTS19_– ;G!q9@/-[.}Zey6Yu[_)Ogmz.NΛoypQ 鐝y\b΍ >gӻM6{ :V`l3=U47Fxtw;N!7n߃ߢlƛ o<qTT}G~jGlCM XC"ju?kpx;5M3hV:[eKЋ2HVuIK.郋^ex1t)\-t7?}Qt ;)A.@>6FtB=.㘳)~N[? @vDy 7vMŜ>9ꋾWwy͂bpyx3|fu/ɝy+N_u rt`W S:Ow;>9joxE7d2l2s}).m@L|aeIY;yo\ t&l Cɿ+CjwiFd3Cp3k}!dsL1N^}"segZV3K6iq_0~d`>YWsq[șIm8Dִ׭3G&Z%]*41ri}V,:_+:[x%/zuF&]0kk8mwDy_>.6g5pq[x3_a4$9-!,e_Q K?46_C."| ޾*}΋t.-1p21ނޑGOY ,F#W5m\vR3Un2KDnN13|]ʱ&gkKgӭ|Rq9eޮ=ݥ*K][:[V~cqbrW?۟+{eesq7Qjko ձ +Zצ==O~2Wĵ-;ˆ֐ُItGK[R}u/l/=tUIN N'՘Od kE9xI~O@ϫ3:ώ48ryH_ʹ|kq'ײ_ /e!ORſ} 7].c<ˇ#aΡW҇M|$WG୐/ZNu+wjG^$F.:3ƒ4Ug&y~ $HC/rZq㡡M/6s }S^Vmriwx_1ǷL"FB>%sy~잭֑xmKO唘6_Olƚ}*f]*:e>)4kaA[[F vZ|^םwly֮)we3"p9m3fF ;|tZ~>X7Q KiO ];YK~dom5G ]uڣ˝ nm ='ꞟ|uL  {l/ mtw|3X*9x^^//(Η [_ݺgdޘ,=(kwutY1g=8%ȷz;]u,fO˟RMCfڐd#D<>I&Yj-r{xs6y/E>g:ۃ|Jaٳ׎V,=P;Ogc#TL=tMeo?2aޙ&8v7퐗>quǵ5w(f2y{|o-G~}CתC!]e8x׼ylZt+N~j߫8N.ka3b)S\kxZo<<3άiKmyuҝuOh+m4?G5j{@66/ݗ8ȗ6浣}=Zs_V8^ ?_>Ώt+g.˭nb2*(WpzćI0\b;&iVWa2~aG6/C['rD/^=t׷؋ulP'>٥\uo#>4ym^ 6Chuz^qHq}|bk$%z#.%W$ `׀?=Z_)xkFsbo-L~U˄BʹZ|Շ{,Jug]ʗ^.Տnp{ҩ6,᪴[Tjm"qx.AsU4c }ҵệl4i!=ƞmޤ+@&| .Lm vk\>H1z?𵵫7>}f2oӃ3ș˼-t R_ڂ3O%_\z}sÙ:WHߧzN d>dq[^1YjV>cs~gQ\g:yYW jKn=oD{?7/[x9bP'n 7kٴ&K4&%>h4hd=iߩg}W~w=o\i{& -2:UfP "_^քbw< 8iv/d?O3q<Ίoo*ssݵ.8vs6wAO"@琟Ճ}v]? >rfylhY |}M_ɧ2ϓr3ݷ?boC}Egu3 YRr.|M<(179۴ޅC.RBVO?+.Ӟe-?ӥ!{tF'?1xi]ñƫk}].#%?A1g^G|R+ajMe_:WTNv~zǟsD[:ۊ~Vn hVb>w+gc77_g"m1?mOR;mr4t#@.J.==8?aךdsq`c# 2ય\mm(M hR/i"FVJދ>ңqC+?9]&v:ĶJ a>:ޢv}ȟ 6|svt_oAhwbx]<׉~ Qnu~_ 7:&s>ִR >TG_1ѽ ^40 x/5Ãu[s_p>{ɹry/9n8wv~Rb;/E_߂}7{ ưa]Fns<lgSdta@pF{Ϯj*m^6F9B <;ŘF`LO|8y{#'VfLqE0`@O#81S>>mm/n.eC2}8Tכ@r0FY}d$ëɤrmKqYGpœb$_GzF>K[~Sx$ﴟK1N6h/+/ʋo6F)Oe琉u7m8}4ZRvM^&[7,9Yg/Et.FhZ{@9/Lb]m džu7%Bt蚖 qEG;U|jtɯv' ulB=S Σq4 cy{j<"~F 4\4!Io˃c.e6d9Fcǯ5cYg}|9۪x;Ft~노orX遌nJ/=4>;L^k}欉ƅubf9|m%&.nλu0:/1<)[ɡҙ~G4yD׹ q*Կzt 'ݭc(^q^gpw"#g}>e5?\ 6~@ȪOy'S[Sdq,596Z^nNxp1FͫOiξ>;,([$>o9>{*F黂)wkhrҌw<ѺoOEτnyEq>~ zqi2Z/Cl|Y+nkk>_c' vz?t6̤OB4-8γI5 0hciwƴl+u6Ʋ\Q9 7}\Iڌgc/뢡IȊ:OxE]*ȱcslz:UzԻ& [w\[_ߝZO򵂏UbHcM"Iܳun}bg/5COS8Ȼ_ן3g>|O:E-\_vKsC1; Ӽ' (a"{t*{]9g!;fq=m{O/%M0>tG$lM o3\O]f|nĝSk3==-㌶^eMwϴ7Ұcjyril Xߕ|] K\ckfY'~Q/[]ߪ0Y8rͷ~s@b3Meŷ=~>7,kAq%zqvY;:E)lћe|iutնkF?;%dB`=x{u[p 4 Zxf:s_ew);KI]ʖ*/4?Ƹf8q5y$GG3K os`-Wt}!o0~&&tW7xaai;q^DzeKuCV_tMX2e̒^4g+7\qO Hlb9%~t.pIhg>Larp; ~-q=yɊ7#La+F3W73?ѽq=IGt]9вgOpXop,2DC(7:կGgocâuYW88>3.N+};6{߹8h -߆KUx{yGk~I5L.OmҊ;ʔ9&ޮhΤ ~5n`ku}t)OE=q^>XwAV geR./s3}r[g#ry#!|/#}_}^w7&.V_.Fb(VCjߐ"s\ Lwܣ?7WwOvm|l,; o}OWgS\oD Op;=~8OKÚOS[#C[W,眮5V #?hn!_.zki꾩Eh<y<,Ƈ4Y g @wgVOe1 =L m\.p sLAF=98%?$|6ȿpts];-LX_in~A0g/WV.*^#c'm~ U6Ƣxw`¿E'eufq=r3z.lRÄ'L<ۗ < di*k oF=T%xOwC61hs{!T,"oѸ(;4Fּ|<'6wz*;7G\q.M?_t)~]YgIqy: {< l}?G3\%}?O xE>vةkKvICck6]Y:o c}Y{o5|;L&Mh]E|MY3Ϭ_&@3% `g9{7y+eWr: vuN ?x/Jewyq^ݠxG12\,G}稣vKϒ{,/vq-ãZ]>i=`?ǽ`MumЫ/wBjFSoo8HZ3gl͜ Η*+z陲eoȳ1=iu^LG:q{N\ACcc3*G>NF9"<%".vv"1w^g;] ﴂWG;p \?c΃})'= ϿʔgoMЗl7j?+~40k1YϜx#nljp֡iVxmHstM$4Tb{fٻ x˜~3:9m뼨#_D'oZ+` >'?X}=x{tmg0wQ,*m\ku3 w|5XTg[A#/jt[JO>NsN1t ^Ty[kJMEPmc [e,|Ō7̍j}T趮lowo@7M*|9_'ﴘU;_[WvlۃܫG_hw) `=?c0Eǂk~q_A +]ζ{oR~°6FVþ:|?eJmsw$5iAa]_>ߡ7gHǛ]CS Aqt^A|>:h5 —hpV/{UI]24;p⩑ۣ iҦ<] b?4J1˥ʤ54kѸaS^׹/W\}/{y"`7˹[kY$9lbh =6xhzt< >::?9')qeOgѯ,{D~uZ>`qNML=קOgDLnDއ1>u҇!k$fc wю:''}iAfu5xMzôWyi[SXnƾ ++Nu&/g=:3;X8^eo;}6]OBq+ pߖl|I0l[˸ζ L*0|3+:D,{ɞbO_|b"ǩY~<:Q_iDQYMI}sYD 8AL9n 풍1e-ݢ+f-x;{δtg Fěљ aӇ}:]qIl}_W=:zq|^!FS_/b>9xM+4HMvu^ny&( kd6ڵXuģ=S&H7^`rMcF%o{~]7? ~=C}~!o^.>=`>)tAVle#-y|֜ |C483ت+w>x x)u;e$wz5p&.3e&ߌNfٴrxg By1#%ۇ}WQSY ks"Nބ6v+g@=_fhՎ [p놻ƁRS"-9ϰy{(ӥkY=^{Kϫ}{89x v/L7𱓬A!ŏ<2bx'iqLfMpW|l7Hu%O"@>ڱQVèf84dnHזg&=$w։kq^/L'hl}obTNнR|:5w|>%/ l6)[W%_7afqg7@lܛ/㻻F#7=Ȟ˽+v:y6gͅ7`Cg׀N KA5}|\W17O:?t۸ʿqfy{}Ì :hܿT|q,&GM(.Or%sR^e~unA(=a ?r۪W" Bw^ ~ڲwXH6|]7=_908Jǂ k}kFZZO !/.<wN4ppc^G1ɠ9pa>U \.e5˱k`6֫n7S2s/^_$;]=͑{+ŠWcؾQ ;sIToAJO/b~Mea'%l 5 O4yœq.OK^Cq@p4ŝ7ztᒍm"`Лkl6w]жSsy?k5 w4э#'$7 N_oAv>}I;[ǡa2p#wbKdg;G9<@ k Z^wѧMB>y/h6qþ;ǣVk }U k]/y>a/cF[sܫS:ң/7X& j`d1~y_tG|,u^8{Ǿ9=vyؙP}jۊ͸'lH'Úb7gL'pM>&]{ck[oBgyG=߹gĩPu-v-}_s>^vڳ5H,T7=Xׯ06ۛHLMH^k]ϋ:Ko/҃Y7/Ns\L}KՃeܙ̣q^m|6Xڎ㕸6 7x:xߊ/~A/._әZ_Qwÿ!HW?cF㯰5&M|xYj^8ϷqlW9 P<="};ɱlkF/S'8۸gto0{X?+6d_>qx} NyY^rb.; ţ6YDσYom,ji-W f|:¾3b-@oاuW>%S?OŬQvpP?Ľn{δ*_G>Ч< 6+2GV|1qGOX?]ԙ'}.|Ye?Q$?\ݫܛ.{,RҎa{ߥwH&/eL67,[~X9ǎyk},KC`]~uf(ҚGlz\S6Gd`lN/ww9VNi^QyJ+mC k|悳ї./O=?$&y?kFoC[gl[k-Xҩyl=⧅]X z?ʕo{&7:. {־3Mgސ*?dvB2#,׃M}XXktYe_euw)[cm_. cw}%๿1.l=M|'.a?}P^\}x{x FgȤomqWo?`/ضmi}#o3I^=6-8Ι?c{3] iO9 $x xN5^ҝXgod`|Bl~SqX١wtH_ٳ/CG2EO烫}t`HbP+YF/tٱʐ!X{Q(/t>=(wE~ǗC%u/_$Cv"7<: }r!x41=o}Կe?3.bV.Ieg@z)x"Mw,Snl/B~I/es0<=xڐ쬶H $? _ҽnprzf_;'薐ͱO 6w=>suvK;=x|`sv#9 ]/EmmqA_ۮH]yg}oˎ [_z[g_;s-=u_~=pvox۟.~o_q|ѵo&m63?>q^\6Uٿw}|s\li[ncy1Zxdz_g8 ~}Fs=ht}ZrviDyυȧup?up{0 7hr8o cn[eLFIZ:?!Y}8WvOur:μqۗ0/6S317jAZ/>16+'"K_W+]Kfj|pF/n aa㋿]+myC|KAyTf :{ԗ|XPR^&_Yٺe*/{S:@AV7:G> 3Em/h>{هS \Nþ7j}x1d'YYgi XAI_ByGl`l7ҁ>mQ^?M֙2/XMM{W_.2+qn O1#|k|R@V[Z#m0/_3}m΋rJϊ~ظ6i/sKg̕}?H]8_ccO֡qtiPЧw̭zYSp>:G0Ugn)ǞbrK[w<۶y)p_sn~Em/)V:"αH/|gʚ[i>mƆW7Tf 0 c&emUG5]u跄A˱;fY_^^ >WK>~)Cl}J`Lloo],Y2ipWM)曼"Mt \Nɛutpxq_O3|l'hq9%Yq$Os&qڙBOoOx89D~C}>?\֚}N1l{POO[⹯oov3f7$ GӆCgD~tSr?lO9/mO y]?Z9`F.uQU`a\$ߏ,uagV QD+d {ΨP].^FtKg9 ~~MٴѱÏʟz>׺Ú|iK޾}QO(18h Hq\oCzFۭb@m|Fx:ic\\ֹn3wF=T&SV?G謕=^ ^h*=D|J7ƿ+wmdtU!C~j4ZCkoPkeq@pLWDd%lPFk vwg;X́|uAԹzg|G>V1-.ぼz\|8O3̺AL#>c5W,bKURoUzK7oIp1>ӜOj1^yOmrO'|~)Zy!~)8;B}"|ʸ+>ܐl47 #}({3( ד:c[ݏ5-88$b!c@WgSQn4+9ZdVX)'5zCqN[dx[5lZ^ugySa`L}_k?+\wm:%r,.3$s[x=3~ߘGgΟJ$658g=]{Y-] $G>wTc n٠80Pʷm' NMkq8 P1,:zo|?L t% ttV֚lMv ;ڍ,{=k[1S6Yžk,/}?K߂ٕ?7l7;bsn՞9~w+Vl 7B?{; 8MK3)4DoWEAԘG*4̨CV d cry[0֞߈v8, S^ݙZ3b,~3g!cy;ڝu)f.(/ ehSٲ>GNkb/x>}+|mI7X/ԭ4udMM$5JxZ C:Y:s/^ﰼm=ݸ<]~rV[2$#x&s71wRp7{}:=-y,fv6,1FnY+Yp{i7=d|kS_l6v=+N4 _;ɝ?uŝV.SKxA-:8(]5!‘rl[{~,CC`B]$n ZVvz[#-ǎ}x9#8ɸ/ "ՙ'\jHgeK>_r:&^8rͲ zϋbiS3މw6A} 't>{mh O.RV6t[ҙ}nDw Xo:vAi:/?sRrzbL\lxe՟Ruv}/T_ɿE}JX;ȻOq+ 7*D?uVnfς^..3/R[פj}_JC =.6nm+྇e0ƛ7mL,czbIc{JqEBʕLm9mEmA;w^cx&gȦ?3j^!3QgKooeu,^v\Ht>_߿o^E`qٻ;re_~wֿm`m[cKwC|A>^w/>¼a<Cϝ{ۃǯ8Eƌe|.xl{(YMG8|SݿhXJ==zYq$fFc܆`qw9. w?K^_#uV,藍OR #|XM֑IxcZ+g|XŒoqjo} 1w]BrE*D"I&/1^j"ʮ`4;kOuGE"&3 a71cF{xֽko 㿸"59l<mں-CG ޙtU}/zsV9Sn0,Q,im*0R\˒v/W fi'n|m!r+9Mg={}`mbzӎ3_DoU,*{f1oO2nVh0.Gε1c O> %'G>W: y^8gkc$_܇bۯU2'_˥ҵ[eĺ#=Ѧƞ}17q4]~ t컓>> =L}#_1o9e+1ZN$~ytSzVwuճ>{zFu7]W\|>PY H?el/ſlǝW\MmΛ*#|ᎃO^wF=24WpXL7>V{_ܽ\)(D qQ)Boo,]g>q <4kd4#Sl}+<0w!C3aw0p68;2~̮vm<4mwgFvXp vyyu?*}:ۅ"װv|26)'?[G7==çJaB6lpt [nܫ'fΠ(ҁL׵94@O Аd>Ỿ4%]?YNO j|b9Koؙ2q7K~E߂xCŕH_cI^w~4;bwob}tAgÇncmPw_y=duʗ \xc|lG`Ui{T>4~i?[&8^yVgg;ު{Z%/6'"C}?؇u"? h/puOx]gvsA^nZC37sr avc\GXxK wmC*{7Vvv' 1ϴoukZPYd6g8RT/К5لwyEN@IsFۃC;k\U/S.<hvǺODgxm-S9|~Ud|lzsL/ȥ}5;Ĥ336>'^sȃG;8Ϡ{vz\M%^<ƧFlU/]Nt=+v2ũ~Ggzi-)yFg:~u#焱Y"oѽJثJ>:oڷ5:dx[sU vUck>t^Z3[~ȸuFc 8hp~QO>nh%ƣ> ~&&7l"'b:?\oXpYh0Qzǎ aoCf?{p16igv$;__u9=o,m=$wH?k|Oc/OgQ>u?P@ ||oQ~3ܹRe^P&;e mm?l z#u?;<>4|D<QO+#or _ Σ<&y\f8+[7>}~hNߐ }_uEVriy̝auńBfG4]Pey#mX_ {&Lmp8*֛t(G?1Tydh|r^/X mnݯ;(qs}b =#:' Ck_K>dޝ1t6m;o?Ch,߯DWzˤYkK;{ {C pb]}#N"ׂ7#E4#(tWlNFD=5;bm+%:t9/Hz6أ^0{c{5]2ȟW} n'`-ڐk_36K*F)j^h.q8_7ƗC7^mg'{;32Sw1` >Ƀ?<O>Ӱ+;F'=@nj7K~!3I+? zSbO2zE+BG>iwO;vmm|yL2uj}G̓/1Z2hxK,$(P RvmyYs(NX؜Gy}PlQy漳9{dsA(|u%!13UsOlox[s%cWvѥ4du&:{&t+|{{}UWā\|-=ຌg)2Gw`#w()u2&~ω̊}u-Rدݺ49\ix>AײahN5\>Z3."g?\/CޓD5A>_ukqmܛ͋gٚ@^lr9 pܪd}j%! ᓒΌFc[IMkǵcwrh)%eǺ%e5M̐NԸ6 c(9N" $1|KǂχFiV xfӺ}UG}}h(s<^NU|:o,[Șu9hпt#aRp|k׭PTvqq=3NbxP~޿697MGc|bu~oV|*U{_ =T=#^;Q?OIb%oQ/ߤ"XݢQ!/@cX؛"q'< ;`3)6go^Gtx;Ze_ANwt;+k\>2j/jSPl g{ n2ZrJST~3>vlաlߌ(㙱li|x F'>;ݑ?,e$f.Ș^N3g̳i^5G{C+#~3m8—KEγKj=L!_NxyN;@Kl/'=;etWo-C \-ֈ1Ǘ'cen&넹f] _C7hCzwOǃ-Ex…|},>S&Z7|㬹c!o|\Soj!=٘>)ٻ[1}}.\.wnc9ؓe/2y&3 >kx_'^nG"Wʘ%n{&Kj&cJvo;uDvU{t3>]);1' 1!1v#X8'#C-w ?*)Ů#_j ywhዧ~8eʾ2Itګ;dtomnx;akibQε?:Ӹl"qGgˠvxEύUl\z}IYQ3 ,v ƺЦuϱs3vZ| ~<|`_)?{O]ȎC3gFgkx-9O~z>,btZpǤ":~;>3--,m)s|f!c[DvEWg<ڗwh{$"'UP|]GEK'ΓՍfmW^olp}q>6zP}?_3_ahΣ;1hq;Fמ .3%<:"A‡}o7[ 8Ņ~NI9pR.2+#guux=ݵlEn:/G\ `>wϗ}:*c\0gDmrƏ4VOo :^%F;B?Yotɼ߂77>bJN|g,XOw(VSV|o+WYr.E;9տ3U@Ίb{,S+?swi1%u/ϼ~e}~w~?o;t}[13w} ޥk{U+Z}cToނV+_1v}?}d&;,?Eh:vbh ~VgZG@/a_<-{j={N:{ޡzG4;WiK_3|w5ηu 󼤿sX5tfްUiMvF^>.ꏼ=?1?KY.86D6. zOϕ2-ݛr~s;<?Y۶7#g!SVt&Kn_"؎>^S7l7x|ĺ9G^;3SMs<2U|O%3<߽D^0>Y:{I}5XOƼqN:kq?w?q0O>J7 _G1:gGz){eqс gO޽ވ(QW/s|xt$ϊOIi&o[_֓bL a$:!q64ݯGzCsOX||hy ޡg f ,,Y l#]Ղy}+`?M$GVr\3=Q`;F 7o{pcN礮1œi3xׁt{_zKJ:-]';4/{CvWpmLJEy-Xwtb㐁 ~oC?X yts:8&}ojrÃE|i\OGT( m5_kGc3x۔+VFtkwWtNy, }>zgгVG~ks}~ }/|I. ~,qt0wak1Eb _?}ӹ< zG0M$8_)Ƈ:k}deaht"85 ݸղ=۫jb~`w^9:w~g׌kδlOJ3*w^eOI}SN}zC1zL@_O ˞I;l*% ffvfVpmO[М'Ń =| *~ 4c ?\,K ߍ]$paѹx)h*2W0*?|C+lQf.0}"RˊaXdžW>y^'lxH1X?s$Wq֢^ir syY7YlGϮhc]̎66ߘgYoc+y|o3dOw#Ipֿwr?Ujł76fmZ9AesܰB@s0lC>5:TYovY7;D.hqdelȗs׏!!W /wt_~iAmaURl!5Z(I5xX#S.O?~:r>68+}3huC\vhG{c;%e+ll^ULC$ }!L\ pvOu%~qrw8a}++ީ֊q#.op r?pIkRz<Ю+[{I{fEO]XR{_Pvus$k5G&/(俜n*^ x'b%/.hLn6}w}cm*||.e]b8ዧyo? ]86t!7^Gw*צ T0C39Lz? -xzI/L:?l?ոNY-+AlmsY=ՠu^u9~ +lvƏ$Q{|Nx,D3S'Py ;u[e $ s9 mX9b8| Z0e9_+E쓗7WWj6 ՘k5x[:FǓoO%OѾ6ٴ'~IH/KύGnsCwg|b~rS[2Zysa$6O ~σxhÇ:(ΑAzhgZnCu/O CX{|^Q۽`F?;v]:= t%rɚq/,)cc79F>:HûfmDGŊG*? #q5Ybz/};UnӋrgŠ0~;90)xi|ujdʑ Ս6𬅺;bC h{1x|[gxV1б+gt̪4}GgGw7#8_ojו~Ⰽ݊6ƺ?{,mj {/qzyƧ4,@s '%sְwk.U,"[Yc?gdt,!!]z_Dц [cUQccٙ?#:MZ>|^?dְbYXXFtNqOI/eg?"I#z6w36'n(g RR?Wϗ|Dl.7|4z|߱}wWY+kG%Uդ{3wc嵃tGt16|VC:㳯 {~~mndA_yg*mM ɳ`܏4%2OtsΤϥ]^)bĻڼ;IQI)`LC^cyͤ(S2wc}>נK3qĕ~\:KBF?SkaYoln{{' ܾ7{:v޲rr[9vǮv/oϹ{GkDw@b,v|ů/k?cg:ɶ9gtl?͗>~=KÕ4}3YTMaheۖ~^~2xkޮ/o־z=j%8h8x,dy|gR[1G{$o'~Fk=+i|&~Hobҵʞi[x3%\27%- gswS&?G\.4""fw!=<^t)=9d뚏|V[e_{ >{Om ;I֌>3ϟC=~ۨ˗ç>b+% .9|2} 7Kʗ7N,o{Ϟ d IX>8Fa#p߱tg_|~i< 1G :Jt7%m}U^ v"]$%psX;#Q}l2OZ_l|em=Bѽ>n=oP?3ҽ)tN趍'n>" vwpns<,ydRsFLuhcmΈ ;A&>o~3qF'92bh8(v5s=M <]pdet'#Go8Xɏ:af tzr3tU}tuG`.cu'}j׌FsT̈eVVO~=6cm"]<@s7p:_=KZ|V;qt ½^pY}m*#m"x\*KV|1ᮎp̽[-N1U{eqnlu^7>:'nDfOnTl"*tɠ75p3|y;ƹ.ewu7/N ]g}0>Cr 3S]'3Mȸ׷:7 %Av' 8G6- F2ކf1!{1R5=tKf{N +~q+|7S5VO^2@3a)[ Q=XOF+,Y]CoZ_c˻Rf.d+JoyH]E}Nz ǪUcku9ت\EvP ~8^-vƒ~?+:sW5/Y!X/y`ݙ/_gJH;G|mN#ykugg.5?U{?a3V;3/v#7\+v+_{yGyys.FpU~h˾bg[q1#Lay6Fu]aOKY~zr8bw1]_.nc3 *XF׸W~Vtxhu)ɷ[A gjE~| *A ?ؙ>2W_<ƯrmL|4>ju伪T1_Hc33#4oAp읝٠=ez,7\ҞёFl(}G֭[ ߞ74o~`)>s"ͥ룕N>wzbl:. ز7 'v/~BqS}/at+WALNM6 nMmP =qB3Nc#|˶C|d3yEںS< 7\Fp+F;җ¬y1םA}51 ?}%/(fZrxͮgh%oQ~^xtc&m>tf7 N4m0hl'_tOFb!A9LsJ|W!? :f7#\V xAt&pOћ<ɽo=B$kTl-{;>[ܹvű_:lvp~AC? ęatnL7_ eًh\ݙ7a cDE# χ;=sj3p'4؞{ >:mj{ֿW0[SKM"m|_w'l<>9/9kt>8G!fbpDr6Z!z_6A5&Y>l̳}OSpAݚgpկPV^)gr{k\58w>ޓ3T`|(woy1yQq_hlBPi1ls>pP|ɑy~,Lf oF~)& :ۣ;<8/.;Qg]gc"kT? O|=%w n*/=c|GO1>'58km4 VY='n~9nPxMrsCyHlΉd7!G s7^!|8M>yoW~{jGf[[GՌ'jOƆsuV(H|Wt楆uKBGds0V&o O}hټH}eȹu {(ٛige\k6sӟMz(6Cs _²ofʷa{;[m|Y8CNLe2:BO'?^0ӫ?gUy:?-= ҉ ҹ=GZ:#|]Ox;OMmo۾wGրр՗ɣ6us֫7}][(KI~s7_yƷUծO>9>z|ɻ4>?ofs }Z缺b5u)}]ʹ.a{KL+B3ʟk_OKǡ=}1\??kDFy=H:vs[%vo(iyAvw̃_Db̛+~lW2|sev$a>g M1KqV1ڀAweGn{mL SYxL> ^c9_Eeu<)c sCNn%(tz ].Cύζcc뮱?g_Nе߿n2$zܑg;xwȺ&3́^Oqk'~p$_c~uk=m_S/:X./t/)ѮɍVwhsY;aA4X%3mA挵u'Fuvq@ק{y_B20ƹF~F@_F/fguug ?357: k=<450a#/>|aEn>֐*\ۣa.4~X?<ӳ>XKqU}[Ά8VNeߥu-.S̘:E=t ?/IwOt }79i14Z8ΰ!}b @K1}n4C6GkI dKf8.8\?6utś27JP5uoSGƟ X/SΨTik}5EuzӾoџ݂<ݳB;zK^=tCӾLɤl+oiϬ?d~u_'t쯮O_/5ܜiq*xfGc3x( 2#pneM7?/WnSFF҅s0&akFgq&{LWawk'O=:gӡ Eѷ"~%Z'};zS4y [V|v9 fx 讈6^&ݭ{yc_hKnG.LbiV at}6&CY_t7ݝ<΃ktOw’;so<v(}+`:ڊ0mgv-?i|I{c3fmnu o'UG"~z6-_? k?q,yHF~/zʾ䡆dܓ)yW݉R'`OԙPs&qFg : X˺lRgdA C284%p S;6֜~ Ed{wrfs-{c~8 ڊuԟP/]@ItYפ+e13h늳ӂ~L7K[^8W>Ԍ|ShVhcO qm@w6_\6Ep07 s+nu+[oqcZfL{Y-Oawbуw(x˹U>7 ϑ->6L 8Aq,o:n!5{m=Uw?llkkyg>}at~wq>v&?"G<3:rCo"hݶq=)>e3*n=\co/0o[|Co8lUF'`jwVh=B|_:'ҹq&m{,=28n\y%{(0Dj?װoP,h 1GsAs)gVеB_5}W~ϴ[[Įh:Lkh2WsCn6f˒m5uҪ7oC^k5[out8szйQG4c*=L{J# >Ue6I҇u3`Lde*_L){Rً*f\lo+.k<=.rc}H+ضuvΖAlw v絠 -z ' 辉x [xQП ENQ{̫'Y0H|zG{[:> o߸៼A8/k^_u|ٳleo(b+N`l׍"~8|^L>?7oN>ƌ/?}U4#i`3[z. ]=ʩCyx2|EГ7Gnc4Uw fJgZw>Hk>}8WT'\CG/q }$|;:gϿ[ౌY%:ƴg|Ӻyg;s#\[Tw~7^?U??ul\0F[Ǻ:US4oUr|,c[j/|w }}?[dG)<#Q`T3=>!p>C_zNMIq:V-xx9x;tzDp#^.վX&] yqo_~w9g#~&gex^qJU>͙"ǼO~ə.8g>K6o{uG_sst+&oƭnϝ539bνաU|$^%_c.Zu}d^|5[}V|tm470HrAܿ尊؂=;lGyZ!bTeҊ*}JsGHXEǷl, rTmN9o#[NVm6VC4~2: '= <qOW\F ƪHIreӥ.ekee&Z'ϡ̿۽|:g2V2ff_ڐߤYws*C'Û5Bo.=xٺH52u?W[1=8x7[{ҕںDO٧6ì/tYg2xYyTzclF# ȗ箘  [(z7<Z'^&~lLq)gL3x̻N&Lm}' |1.2>^:CC^.3.ҳFcogV1RǬACUXK;_M,;kṈcϡ>?=og8;hzSLOg+x߬/:o?} yao#Ye924KnLl؉6ˤOhwgzV&-:!3tc?Npnd) Cz2 {myĿr݂^lUV{]I ;S}ve8=|~ _>w#BClj6'Mjƻ's]d\;E{ıΕacC™cb/{̷C܋^a|qhGC6~M_!6Cd2HZAJmt91@iuMS@sA]]#2^.$=pIك>ek LRb6 AqsĆ|p=z;a8V}W,$x<=tk픸?rzYqMxl-~^>/T<2{A/_,=7LsXv4^,TǮ/{س#iA[yӹC#: \w P Etjt 'B. K 8d- W#@ ߟ.A g ).G}l]m }=bq^=BN W) pڇU~vd g gfXggEw_ED _͹a}>k= 2&N#hI|}W.K"= u+F]Y16~C*l'w_Cs&hzzIƯ1Oq\lo7l^q}Lg_c῁dh6tqۋɆq>΍_, [vi{G+ökuX݇V amcoUq5l,+>˜fi|5ǫ1&GH:rk[?gD̬OJ8"=[OoJ}+{^ $d2y= snT{||zͶY1[zCwf߇e ̲eOKzԽK{ԣ;Qw4~+흚K# 9nM@_C5%)v .uCB OA驪g lͣljxwo-dѠ{)|\TU&;='5CgZg$|l/S "Lm6G-$ :7cE0SgM4%Ǚq 1lh/5|HloKgA[Gδ'^MѿJ͆E'ٵwm m+%ֲ)Z9!ϱJp3s^ݣ,5EM#Y'[[wy蠠oU6#dPtHqn%8!V='DOTkX`tLJf `F={d˻Og &=l"Y3̿b*弿yq.#󹃢#Zчw'1\^:sg>/Olհ0n _{ 6辊czWn|!:W|EFo`#9Ah/1S~">XtěI|F ^53YnjsA[_$x |cyv5ZO n0-8Coɤx[.%ߴц&|3ޝ8cn@kx8!{{X#o_uTZݓs.oH\5[^#|^hqǎӹV|{'"}HGuy'7q\زYz㢻ωc܀ۘo6pcÿK[Owa&fn!'x /ӹd [xE}R恽l᭒]}5&Wȃ`O>e}43@pr&x ;( 6y ;r\ ]~fӃt`ޞq4THaa|l9g>:Op~¼|GnzIl'Sc/->3Ӄc?Cϛf} 3qq;y&o_b޲y"=Ag U\S#g~Uut)brY}^C緾bo#NK1o?L0hƷWO=KNq~H#EAϔX>z6݁psmIV&,*U7 yשs>mڱ[3|F6ѝd>m:& 1Dyay ι6dCdXs0]q~1]g|eIy=eeo@KzN\߃-i$1T[8pCΰCS/ʷX?Q܏%]g;y;L~Z,vT_t^Ow_M>ox䘏͍16u?@Mܴ"RwKV: UfeutL>"&8Lvf+_;zƶ~f#Rd8q.s^>U:UkjؗVϭNa&y0o&D6 ͦc\gLDǺ7zH,:Gϲ #]XKtǕ):q|%}{ :Sd?ӱ Ly dk]ip`4|~܇h>CG:cE i z,Nq,,/z/}px:caB7^cpǸY;)8dtd/.7iil2φWjFeg]<|[g2:x-ʻɿ'W{c ͕e};=_5fFzaz[CMdΛF@wAlIGZ3'= \rb#\ |u~7</kr3<&|3} ֍>O\ ûO67zp!:2DgxKG\ޣĽXxre>o_KGtI9gmU,Х5Bqx8#K]`x!O74e, :Ќz6x+oʟ7ǚl>7:<.M>z;_3սG~Vg^>7BQolr':SʔSܓ}hO ݓۀ ݴ=_y|?r2xֵJU7 e7}sTwN};K}Fj2Ne#1әYVl#̞ahq|9F0c:G; KGh>>K!;OdU }-_µ|p[9;CG:{~Y܃C`‡V1.m~ cKo~\ .ꌘtf 9"n/ eW]9olBxc+g|Md5Xݿd\B6{kFmL}s2EfRk=?^eΔ ;W}|c/ވ 3܈S>SjviOUݯ\Y{ xx*<|vEci%-xp"]<&;}D6c͈m>1 21qwOg:sP9,a& ^ѩ?dFxuh2OۧKAeqkY;=i0UolFqKZﲹgۅ'oC.I\cN1 oӟiƢ|FĿ,gңF@x# :|-$as~[{yebzg\cDoilo:r>Qs]EsFqJ~&Hay*n3y@ 휎olMAd> i2=wmlwޭ&K7ۏNosU캺sn3xXz=Isog=7^E,Hl6 to^O/_A4c7^ P_Y~83I EV{ǁuܕ,e݃iNӥF{wb<~Hw[ +.fGAaIGĮ(sLqkd^{Zq^t((d Rkя} >'&l݆ jBz />&~1 O1rXcчJ@LJnq*&.t?+ u#[?vh@ FU>ܕy<%{-KȎV x6cɤ Çvm|eYl#}K#[u' >61Xd[NG-q5\Zӿ]ϷGz9<UGct~Y.{>QX/uĂ5RG ~2p] -9ߙƹ4{흞'[ytjZ:>?k$VZ,KҊC hUeg.) v KCbV&ۈg 0<;XkN׭xۜgȜKV]uwX 9q# ۏK࠳;0Sn6m7IQ>v[:>q/800]Rf -pu/Y~4 pޥsq[]|0n灗igRE7^DnD5Ώ`9oWߤ=}/| ΑV׮tUWvc].̽0JI> ^hsro٣"o796gAB7~vwӱ$ypKb_PE'g[q~-%e9ϦA~'O|?GlGHVsZ8kו tG^*nŠI5ڥ7?i|8S5pI8)/l$5̕.2ڛ>nLg:a-5\>n-Η^AquoeQ |kp]~$;2Ft7F|vzhiNLv:6}“ߍ挑 E 'WQyqRv{|t&hWxxtU`+]| /|T5x|k$Q_S/Ӿc~|n;?Fhee5{m}r>nhDDk>=hKgt^w L՟u^z#l o1Vntt4Snjp܁&=YEJpf DFnט܁;otpqeM,`w0!}+nR6m}L7ݿ'";lۘ>ѫYҳ?,Kaoź+m^"z}aY|?w; ?x>N `3Swʹƣ-_d;y> m mt[$#).!tp7|V-;y{& m=><>9W^;Qc~'K4~Oi7]ʞLgtsryOqAO[;sV~C1suV+mmWҊcݐֽȪ_ͤї Δ꾆\6Fc`0X}!8|>&`mj9liU{B{KWW{]ؐu׍x54h|VsyK4w yO9Njr[ױpYikw5[gdWyFpA̻އ|[쫦&ݏ|<Ϊ5뮗$J>Ov\pdMz$;S KAg9ȴZZϒsls|sjx~9إѩc}-ύڸp>ko}n}6tS&ON/}*Ηi3<KC =vA4y> o"O]he/c /ߝy^eN('AGEkU_-tYǷe+U30:=T1?q[3o/ fͥMVNR#c5{oh+=i nvgOvmcCxc?w?|Y+֟f5MF%e/c5W*WwOdث{ m14@C nSdxJ8~ ߯fel svM8^}<'t~ -ٕƥէw%E{N9{rPT0  (IW] kD FL#JD̂i.W׀װ9=oUݙ>o8]UNya9]Rn%-FK}C;R}ո"^\GuR~nQ II9>r }Ci8xAC[i8ζF>%2mi[ȜW?y|uHIj{X>@y~ =Hep{ϰ3~ojd7#]N g)>rKR}J=Y_?w8~7GB=^f_Ǽc>Хqޗm|ܣ7"Ky~i:#Mi_3M^iפ'D^kYL~@SO烺NP䃖cYUI}jeT=b֒e7qDzW6cs]˱{ڦf)פ[b\ya[u>Ps{.{0cc^j8}%v-˩gd߬wNb=,5ٲr~Ƃ|5YDuj^Ɯ~y7O0(=q憐z`0BK=[u0C̷J\IdOA{zÖ3SdҧiA.Gk]E9޹snq$s(fIGNׁlg]7=o5.r wci\v~gowZjǕ縊%#꜑z]\e>65=p)Ga}j;9I98e<'ϗu, ny8|A[yu?s^[|1 G8柼gygPڗ]f©(t-5=-5i4=δga>g7_H 8I9=7ƪje8z9jlo9ލoem*=ȸ-=s-_^9lyy_ZNoL܃}ZRFqq#3'-;M7Us; .xS--%T_oH gc>jr_I4Y@N=R3r.o>K —T W2'[~y6=nqXnྜոlDfRx}\~}G.ٯ{kgսNz65"qU~2‘8BMPs2~z@b n|'>}Kū:]U=HJ]X_m}\}Xr2K]: .j|2{6߰Mq_Wq]OO-nK'1@וksS!˘2w5-w|}gW@I?>ov}-?,72^=5=Ia՘l3W<>Gm;Hnc/>\^5 ע{#tl#힖~'?m~ǫq R:j ~g_Pʅag՘v] TqY=0K{8+jywuHk=iiݜ6 jI~c,_Ei:I>bq^ Qmsr^I{[+vﻤF}MryJ7@7p>gOV"m.ۖe?{w~_c9=9V?/v/C~=r|aqHjmӇڦ_`ΑoX=UF_kDXq _W9іJ%^.l:R,>75Fw.Xvr.:((cSmu{[R1KS̱sMҗ؞{tiPۏQΥ?1(?ҎL {n5V+oSm?oM 4mv˲|igI\vi}.Y:6?x#$F~Wqv/Y0?K[׮tSPE+u i[-Ն^K<ADW=t@bHVdtywANcZ9n,mw2іxn7ɽ3v'j:ҞkKr2n~O9=8$yPqĤo9Om^ Cnջ(C9SzvW,˿Ŋ;,>k:?X7ۺc ˹BD:ijc[?UGkT9I:ި[{s%+EC=$m\c>iӓ{^Ri38yiG#H[K&Z}nI}^ڵG6x]U}J~5V[ُȷ,s-j\?[:yZ^9g:@ "߇[ ?Wׂjy?Jz=QϾ9uhkIS{ϫ{r^Rz/{scdڗ\#uhonxrꇞKz: rjd[S}]1GҿW˫"/^z?WHlZ\3|nMux)߳\ҎuI{RO8FlG/ҿEY6/rԔ#_\IOsUkJ}D]׿t@Og[mrX7=K&OH{{ɳVj*iGT5sU_%>NeʻxICLۺxk]s-_вG;Ǿ#|/%kIKb1_OR?}snN_e>KOK;^zXN/k˻T/1^!|%v%Fvr1 f,\jL`'`JI[mi*ߤ5f>}ԹLֱ m\sy2/2U~ű#wٜ_W${e|(lsOÉ_O D'٦_#Qq7eގ uy>6}a0]J]@I&8Hk_>U?PL=g%R!E\GY} ջR6,cs~,Zԗ:$I;\'Z9Mr{>w=-u'0yf^sS? Af^Foɨ'yn k;t݂z_p!yǥyͲ6oa?W..Ǿ=/6׌Ӗw?-HK7S ?%>DLp$^й>)9}Tr3ۗԇ9?=ԅai>L>ii:pQ38ю&cp=_gc=_-sx/Gzs)~ryGkc'C޹G?[VF{{ҧo[ 'R[?YϹC+ S*T)kJۖOj"9GEwuGƶSnRW^ܱe%fScZ?Ʊ_[#Lj-^`k+(S66א̫qu#)gX%\f"kvW47&q[yx&mIm튪~-1lKvKWX8+Kڟ8o5 U]Խ qS -NW9ҥ"qP}%H|ԏU=׎[R:IEjϏ[ړ;1nݜjLOA]c2||fA~<_0y;-[nAW9&roJqw/:N_g\jymncԱNҮ'[|`>8O%OS+.X%y[|Χ<8|˵ $NJ/O.}"ĠDʲҞ$ ې1/7G҆$׋ϾD`yv'.qLcųႴ}76I"-bKɑ'tտ%]ڭR%dL1P r?ߧ5/N=E)#cM;;gKU=h8j=}=q eeҟΪ9˭Zc8 m澭P7#Ejw뺮<'Ԥ>CJϫw]9~->1:~K<M.#炳7o ʽdd|-==W=[|y8Tߓ|Aa ׎niy祐KNWLڝޛt{3]ދ$EVlj흦i|45 ױ~W#RG4{,##uaxZFjLIMϧc?׳jzKimq꧜m)\kJ#yROx7tSW;Q.,vqe4=+v[TR~N朕m_c{Jqۂޖc"As8\0}<=ԉ|roIx{}9(Hr4yO3Mi|ӼT'Za?Xk˱rZjW+1`.u{tpY?O' ۔ޠf|.1l,ȻrwzK򩣄v,{:Ojyy7tPTVF ќ UZVF>f('~ξ=Qۜc_>rsU!W-4kL?[uϗ5p>O9z|1}M v D޻=?[/˭s;fz$?#וϯ׀5UqqB} {@|~KېT[P$O_VFVfU.;2>f}WkG\_ Ÿ;${ΫyLG% ^9ܮyrԻڿwZ%fwig.ߞzD彵r{-g"igA"6炙V,ڜ61rϘ؋} K> Ok58j8嗘YL_W$Lyo ?KX^RF+4_(5;ku}`6(#NY5ަ7k7#?o1O=&i/ܽL+Dí:ٖn .{|9Ww_HzWBoHA*qmϩgI[!}o\C̜\rS,kY)U㹿0>ޱ훻o_,Kݟ]pϷ۾~ʶ_]w☑yK޸GK=`z~ӞvK{4շ/[?A[G;]v}@iu0qqyVK=f~cKKOԏg}.NT:9'&agyIeRaz~D[Eq/~/>%?']ee:+}LzwZHiåL r/$(/0i濍?͌r/=W'c]>AJ?S[ngmH9{沛i^qWñJX#uzLw"=eӖjCԍn<}.'}٘e?c+d%X;8{rݾP49.3k>>~#M-rrv&.<\_?zZQGL[k+傿7c%O]V3HmNX~izO=#׹J;obI9};Ѭoi{!=1;1Cݿ{n/ѱAPqG6פzf<e 9k#xKx<\^ijkL>?T}og~K[!|tvRdKCe7?g۾9Uߎ9x9?Ը3-}D#ȽV%ې;F'G~,ۣ[F=WdI>3u%m~gvEe{χMWSx{Q+OCG $sA_{ݩub[NX\mu-nz6{ޱUknOGi[ 8c%I3wז6=k;(>!'.ұ`s^Ƴɍt? iS{qx#X9rZw1nK ǤX/D8 -#iw~<zn˪m6VnUuֱlk=a'zYvrkxr ȽoR[ 5{Crj_ċ4pN@[WS^aiCL꼕FZa$sݫYye]tv-`|pe~NIDBj\^}}/=/e7*ƈ/az-<ޮy+dKIbǵӪgoRj&1;6yҏڝ3%DZ՗?ilOkeY _r2'85uS^cm\+_G=P2Rc=+9?;NެK^7I6ޭqY^˗w{w1LjYz_(/tGo0+K?K߃?o|Sgٯ[Ry~枫4eOW?W1W{k9$Hl|k27Ws^O:ܟ> K]Cr/SaqVd99Rx`Zx9W Hu]ť qCư#=󤿝77[Sum9/X,_^ U5 WQ&Ћ8?0Ã̵~#So1?V(V9RISJz^])rP(,X<ケmՖ߲/>Z>oss?ޯ۞&}iy8 ۓJ=>vP땺f/Jdn,5vj [b 'yyg{>7،rO"og5J>đx3MWڰa_xr窴irKsnUF؎3߹\Jުl'9'f9]i=];MvևI!_^1u49F+O{ysJS|W.*Q[i~f&m?_ cI39.Ѣ/͌KT,U`7e8uub {]li;yd[YV}]T؀ƣOL{a&c]G߯i ϴv[yIq,5OS]G73ۻx$~?/rEQ\Kۀ<}eneO喗pooq{.h8Ŗt(2nҤrׯq̿1cnmA{K=Bꧪ.r+3u(R?M}NCEڃK^$K~$K,u(VcH? bzyj&dGUL\vڞijzwMP UܝFK]#Ky闙sK`lⶊ 7߿ް͉f_m;HV!Qޢ*6w7)uZzKzm\ʹUqzs־-llw2}w'Իk4@Ici?7JH{Ӯ/)5-fzK5~,Ҷ}G{Ty:TmL{k1BTfS3KWmQOnkPcI{~ ulctl.xu_|xC[#)%r'[V\/Fʽ+pWUiӸfY7,ɻf;Dloem)|q]?uvy-:ms>tkGwsJՈC>riǕw7*e!ۓ_=oY溔ܧy#MyW}-bq<_޲$_!3<>'wq܎1*(! Kj\kS753-  5Πl/ZVO=MݛrK#u>/TI=\kS}oYeleT,}T?ZRx{ӭXNoƑE/,ɻ:սTyrA$r~rI]?5Uy_US5ogꞺKe%nڜROz9w/=AߖԸ5žc Fv海j۾߶_߻~m_W{_oEovvsv]ѱ>=laۏ^; ߂[<'^\_8oju?msKqvK>^K[Qr._x;qx_bvΛ`;?'oGpz~Xˊ.uhKҥ_-a?PϤ||3_+c*'wH$9aK1/e=ʍ]{gX.}R]roO枾|=M)j -.97ϰ_NzIxLJxq >{[)WYVKL[WyF)=i[zL[}d?T'}sW=;u"KKsN=(NviI,: <\YcEƧ1T{ec 徾^9,}W9~>UVYE;uX2kNޫq}ޡ322VnZeXvۍ`go\c}e w6(FsN؞_\:.:sWUp[v2vS}oc ^~Vβ}6n~?'} =̏9/'hI@#%h$&yHWF-AkxwaWK K=/WϵJ|bYzL.V& ެGQb.~C\T}gz!$ߚu %q;sIK5׼{.HxatAb곊39.vrwb۲qY/&Gϖ:8؄„Y^F8+.('U=bA NwOz ۑw|-X{N9fK~Nߪ…[ƮY.%ν^;cJdwrzsͼۊOfbfy,?==A $= tM KC׉_ȱz'uWϨឧ\Ϲ'gZW[UFƳw(nL{dӨ\Ow =E[Ҿ cm^RQ홿G׊jWu䩱ۈꙟw]=w´ޅ..%E-,5.&ߜIi/9+\"i3ԯ]~8!ϖJTs=Ru'e}\zW6sYgz^;OƚSy2RnQ ,=ƭxҪ}VcX iea$tɳ@V(Slw"1y/,+c٨wIy#z='5xvjV˴U{Ҙs2~])6C{4+KƠq<0Yޫ**NAHi6zi_z7.z\-.rO™'(>7ۙ..-zL^ T^i\X꛴.m*CQXڇohH8-uc⚼g'5z!W]z-i u`YO5zz& yo_Ѽ^~&R'TmO~p]:KC.c)zgN=N}v{̵-8}x{yV.!$u/ܑ#l{jiUg 8qGi?kYX]'l?RGae{:^5N7c̱!9$}btIScw^^3qIk*K=\`]͵ۦ-,ߣǞS3yS\O! u ޢWyi1?jbm^1r$݁u#S⇺yxr{K+ʹ;]#+Es^6;tGN3u-T$ mV.k{p VmfZ}QoIwH-:\LKz&i2_~5VƂy9_iK; lݲ] iV.>󁦝H۷Tmĕl&=LlPd!?]JqL"đ|WX{:*b^{>po}>}:o.! }RӨM{%9{qH%މyS>HQsw}9'k%=RV'RmcoavշVF]T3#}R;5p 2毴z*{Zk,]Q2/G!vi:zyRd{^ 8?7d^ &\&/5iڔt{Q]ﲜŎȿ`w~y<6}4m])ZƬ{WbEkj隿lݷXXRk.z4 ==.]O#珌_&|S+HҞ!\Q^O*m7uױC{LOw:Q]5y?H?ɖVKYOc֨`V5XV+˩wrm՘?\oGF#G{vr_AKa;ѻ::]w[q|cCOp ͟cwױ_zmR"^9o._ ^VbLAת(rsn|?N:-OkrYZ+Qx8nRS}3/ジa҇JQ>kuFee!w4Ֆ'[Zkwj/=u_ݐ}91wMV"uyyHک{MkzB p}^ZQ=Lwcw9Uɦ}'ܮ1SP|m|QNGBZ+;N;T_UVmZFQU`wOw$r?T.OޥXG+ >-\c6?pJ3iSTqmZu\g=K_딓6u~=-c~>Ѯ29-UϢ`9+'zyPO2o=/N;SM܂}E-lDΕ:_Kup7 $frGlc?gYM5.~#ϾҦI%.O[okҿI=VK/Pc+ p{~qJ la,iu# E3T#qV{],*$VYz>WS\,xǻ=4suwkwma`= >ēw#ȔUt =!='>Jew*je~Q чYh~ir9Ҥq)v)+GW3g2ъm.Ki}rI(mݲt 9-Dw咐eSfEmZNA2 PTXN-年y){%L?p2μnd.ɻђl&.颭Y]ѶcʹiZS_RjT`tG3}'lYH[Ѷlӛۓ(Rm%M|)M'X*.V+][tGS[\FǏr^ K[X YK;^vپg(eEDEE7jt˴=iF(h>*n;HVFtO0}o>Қ)f QgZ[:ۚ2ӢR9Mv/tUGn b|! E.tE mgYfc執}8?~,.:γCGTW:_cGLHAT.!M$r㭖Tyj UV(UHsT-&AUUpK4M!KWQ/tJ&D )On'%O>$sYguKMT狖-MgRwK(( jՖ@򿺢Vǒ|i|iƗfvFRfTSKw?ޜ X1dQ_ئ7|䖠r *Mh.DJuehWpK=HS^ ݖ-Hi.[t#iiI9*)Bus#eU궮sTV~zז&Uc^RՄ&]4c,=B5HB ج f/: [ěr;6.6o<ؼ-ͨT=#U;i*1#GJ%MԸjqx],7k FO+Mx)i&4X)ͨWK՝IN'[>Tit' @'I;TgX/U# 3 0BS.24aζ4ui"m$Uݔn<,G*T]nJO}k, e#MF-4]ޥ̅di@oTӮ<'ʰ; mKaKܤ#z,DH\=J +TLf+2tP]< _n545ƨG`zʁ1j$"CǕ+7ͷTk1_\z~q_u۽;;1U4%ǚ҅C=-q0 M\WVWa啓-daYtTVfOn#z<0Cʫ.pA % ܾW/)Kz¤3gHufm&y`&y T^_.]<ȫU8$ÕJw-G2Ĥ43y!C!#{% <C%1]өit|c/=䦉☯:k.xakx<;d?/;n/;ԣ8 (wo@=Unئq/N!y/,VC\b/,=dI>Ly[*{atuG ?dWu! -zo0Nmv-A+Wn3>^6햿9w4,By$ A* <+6ʐ^腍^腍(6>^(Cx>J6/\$*/ya448S^+a !I^#CGaxe#&yya&IK/ R_hZ0K,5$(/R'/\^$+뽰Eɒ!ӤKȣs,Ue/]g`z/\eEkn7º/Yxcyt s ;Qk>j;a<.}׊20^pf#}{-{lG~v._=֍xq*N)WHxa<#CX^ҿhҿ$O?벮e/w ]Ӹ<:+Czqh  z ?P~^\3~\׏Bv,H1>;H?>;<}}e8BJ߭uiy}pP.>x胇>x[2x^Gtulj`p>Xu>w>q2 F=ۤ[` kc(>'3H6\S=6 |pK-ym ["nnɐx>n>x#R>x#~>bzy#ˣ>b#k,()í.b-KCg}YqGk}ZGk}ZyGG.O\}e1G<O}RqVK}RGGe?qG\.>G.ܚ":X׮[yp v`^ɐixy0Y.na?M1GpGpCIKnP~釥~/Ga_U7\UyU<2懏~臏~X뇵~X讞~8뇳~8+C y|a᪼WpWpO~x*fIX?ar-ɶ]vytKH~B^+di?>#d2%y=dL=+~|ŏ~ď?nE]q?nMy~GK>~|ɐ1~Ǐ?0 ?~Ǐ?#'FG֏q?{Ql?=~CY{c~Ha/84ďq ?1d8u?18$~<+pR=/,H~XeNN0+kf<䇍~臍~X>.m. ex*?lk? Ioge8Cy  {ꇃ~8臃~8(CGkuL ĀW+d xgxgxwymjz8l l \ L mp-p-0-0-p~X ^Ko}~=oX8%`UV`UV`U^Qn l a v&fZ`jc6bn& % j(w6t  N+09eqox>hK{I{# 'y;e|w&e(e$0=e.|cgٶ{]msS?:9s?l xIn8Ǒow[-c\X 7c5<6cxkoylw 6pa8'ʐ2` 4pNIj/ 4p4x_ |6aKWo\0Hy` 0^ xa/W.`{[\XW'o{t3_kS_~1=y536HFw F|6MA6 cxl$ A\8 S.e U' l :q2O^^ -ohe'.ini#8&3{q A7ԏ#q =e0ycw A1;q cw`x"2 ^c? uA+ %C@ ĵY [A|+o3M7ĝ68T7 3A%Ot1A<&# _xM jA&Oq4A|)q >gN 4A&q Y8K -AAxAXA\"%)c_  N"C*a =A=A1A#C24`$aM~a@ြ* Hƒk\`DFq ˆ eA:}I”]ze޺ ]%yQ(6/0*)xŊ2ﳕcA8&²7,!pL^cA8K\`].i.HAϛo8AA#-+& ajvaffafenaffOOOF ¨ | § | 10+k2+++p+M0Y!Y!xO!xaT!8S!X5!X:cyXY!?!3-Nr d\2+ׯuöl | u0jmו`KQZ.Mh_ 7!x4oB&tm,sm.B0-B,B,B,B]Bp.Bp.Bp.BpN^q!!}!Xu!Xu!Xs!x;fɲp3/C02#C01C01C/ɻ\k+C5_C5_C5OC04SC05cCpUg < < }6d߷dE| l       }% kjj^`k臎y!!!!!z    _6aa䯷 <^f8 c05 3q36 311wlq3/p6tl09 g03 kp3 #z0 pEB8 _p2 'M0 0l 0l 0l 0l ì0 ì0 ì0 è0 ç0| ßmtnfium.wc4enbKYy1 ð1 ð0 ð0|K:| m]wα;ajƆa_n(3+wuIa2v>gFadޅ]ޅ[D[ __a`______\a]օ\΅\΅\΅\aX~W~Wqk,°0 °. 0. - u̟e~#aa_ꘇa8{a{a{ 0, _"NadF/60 0 0 00 pN^;s7<~ےE˽ernۃ7/ɇax7a9a9+W#Jq^ȇaxᏛoaaa8a8a8a8aXaa{a{o0, By{`.:ܖ]Kð4 Kð4 Kð4 Kð4 Kð4 Kð4 ðQ^yaa 0\ E5$\ňG3"e`lF`bE]E(qX;``F8麤̉ M%vF.R~",#,#0-"2 #p/"+")rK33cVyY[I#4 NET>ES>E`OxG=M]e<ե\vYE]E]E]E`^E]E]EYEYERa+ \K%딼=b6O2ۄݑ\l_s6G`s6G`sGsG`tFG`tFG`rNGoFoG`g-#:#:#0;#7{#7{#:{#W^M8wxxwxyyw^ەm^oힿ1[ooqcFp.g"8Oo-%D>`a"KP&D["8Lw,%)'mӸL||3|&D>gՊ|&DpA"8H[4缽 _"xI_&$D~O"I?&$4S"xJO)<%DS"x oS"xHψg#|DэQ#wD(, |Ċz/q% Dq(a8L4撆D(^kxM4ђixL0Q\%DqhÖ޳o.,/%U_W]\gזWYڎmG>ŭxTRQ,Eq(Nũ8UTQ\*KE-iUU;ҥMlRߊXQ|*Ewm֎){.ZexL_X~s[)j-EߵâW׊^Q,q<Ź8W\8?R/eQ,E(^ˢ8Woئq(8X`Q,Eq(8X|_Q+E(ſWi<,E(âxXaQ<,E( hÙb8U _Y1<)'ȌJ1( Ýb)SgW.(Vfs;Z] v1\.pnëb[ A1<' plquil᝱6Q-le٭lwsqb^llڦqlA-ӸersS103p1cd w1/bx_ ~1/W[-P[(3cxf 1|3on7cf nj1sp5cfx\p.Cch 713{p>?cf ό13H#lixg w1<17bxb 71 `z {6=,?zobxM 21+p{ub/t?wIYdz(WŞ$1|-[pßbS wN1<*;p1KãbMS1\*Kp؛mxU 1 63pb8B ?ۑ7.w)G=bD w1|"Cp^#bxD 1\!+pbxB _ 1\!+pN bB G1 pn bA 71 pN b8A '1#nmO 1t8LÛ8Û1Là8|á8á `S6aS6aHaCFo-me`H~Gvokoõ+q+q+q+q+q+q+qX%qX%qXqqXqXqXqXqXqXqXqxqxq q qbkk#@X'ljqbqX'ljqbqX'ljqpx~&6ljqbg'~ƟF܌83N;81:N?83N?f| l扳ql'Ɖqbk'Ɖqbj'ƉqjX'Ɖqgx'Ɖqbj8'FƉqd8'NƉqcI‘:扩qbj'Ɖqix'Ɖqix'?88N88N,88N,6 3O\819=G1:~Ւeqbx'ljqv'nljqviu'fe&vljqv'nljߺ_+;ANH˒< b}X 'Byb؟ ' }$ b|"m y"g書 ' bx ~' bwX 6' bs؜ 6' q &'`Cֳ(u,:&}XG{?cs?k%uT1-؏ ސA7H 0?#$nfa'~'~'{'{'{'{'be뿃Kön\#k$p5FH <#g$3 H #$?GH #Oy\$$p.ExFH <#g$3xF.ixGH \#k$3xFH% $qe OI' $$.EHI<ߥܳYJWI* \%$p;8Mk[W28LI1 \'$p.eLI\b>go08MI2 \&$pěCGH! #$7FH |#;$pĵ "?$HI!3$q$1[ZȑvI"FDHI|"K$f>k/oxAI Gp IO‚$r .r .r .`p `p r `p ֦`j XkS/Yp `x n ֦`o ަo m ަm ަ`m ֦lsy؛)؛)77{S7-3 S7oS6SWqf~h))x)x)8)8)Xe~e~ee~cm,Ge~mdp:;,+vwwޭvYy xdLi\2G4#xdL\98gLiNi3sq4Ι58gLi|3kq458fLi2=BK~Xg#Gk֏G4ƣxtNi<:G4ƟsNi8q4Μ>đ7ov3e4nƱuNi:_4NƣxtNi<:G4ƣxtNi<:G4ƣxt'Ni8q4q8lMi\7˦4{xoMi7ۦO]H[>}ӸoMi1Dӗ=ޖX4x`Lxi/q4`Ki\3q4n'aLmi,4~oxPJAi%q4UҸJ7I&i$Se V^\׻ ^ew^bmuؽQgLi|1/48_K|i/.y`WLi|04>`Li04>`Li0E4>c.i_2ixbOLi1q4xb?Li04n ?4xao֥a]H4N1i$ˤac65.ixH6mzh4,mV6f`c6f`i>fc6f`c.fafa2030 30e[X.[,_0 wxw5]b }cA: L|XxxxxxxxxؘK M, L 13737373737smgpgpghfhfafaFg`tFg`pg`pgbٓ  ͼȑvIXřs9301sm>f`Qve`\FdRd`EFd^kF[4    ;,-ֲ`RXeXfXe>ekiiQKK;79+lcXEX[8ؘzj668888,z7<,®,®ߑ3G_YsY8ŝtv 2 06 0* 0* / . *5-f>±`Imٍ%4xoYY7\,\, °, °,\±,,,²,,²,,²,,²,,°,<±,±,¯,<°, °, ¬,¬, cyY{Y{Y{YuYX{YXuYXu9`[ea[ea[~K^eZeZeaZeaWeW~eW~eW~eW[\ǓX[XngOu,,,?/H{#L4YYYYYY8YXY؜YxYxYxW;qgqgqgargaqgpmf.garga]Nf]eiXe^e^=y8Y8Y8YYxYYxYYYgYXmeaT&ea]ea]>eT؟o٦aOdAdaAdÇmi! W! ! ! ! ![4X% ~dG~dGVXC0$ Cr0!rp!rp rBhr0%Sr>۷ 7r!r!/r! r!r!r5˥|||<s"Gq>Gsq>G|s1>Gs1>Gls=Glsq=G\sq=G\s19wiwo;rq?Xq?y,F܇}?'c}<׸$'sbW9\1+psb-+s8e92Sp;+p~/s8cg91SޕrW^9+{pýrW^91{`rxXa9*ONér8UP9*[pñr8VT9|*OK\qïrxVQW li;\ta9<,mV[9,.uj9\-pr8Z7f9<,kpórU &%8]o9<.p,Grx]t9.pNr[p9.pr[m9-p8\_p-%y]y?\^ sxa/v90pnr8]gky.qϪxm=wZv~{bus>u%W^.q~n7k^sΩkmmK~crt<<<Xzlm>Hnnnnn^o隙~~o٦<^ǯey2[q|gr5,q<.el:E,;pɲpy<8]uy\9+hq<ޜIogeDy|:493q<ΜǙ8sgy93q<ΜǗr_y9#q<Ǒ8rk8ux{󘬻Qȣ^^^^^^^^>nNNNNNNNNNNNNNN.Nn. ~yy\?O#5R'SSS'y?_dWmab~:Xvrs,Œ}Ķ2/YuZe:g:g:f:f:fgeeeyyyyoyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyytynynynynymytoyryryry0sAmy+/qSa 8L`oloo{{ᾶi8_X\X\86 p p pw pg { { pw pw pw pw pw pw OY09 0 0 l\\\\[STbX ~u|g&nfY xY nfYxK%.iqI#lfMKo @,. @. @. q@. q@. q@. q@. q@. q5 q@. q]M.| @"1H ."PM."H-H?٤'9Nb+G."H."H."H|."1H."qHL."qH\."H\."qH\.l"qH."qH .^$"e6#EbuX]$VEbu[$6Ebr]$Ep8\$Ep\$Emx[$Emx[$El8[$nEfY$fe[vC-ƒ{Vc.̒wZ,XG]/ule_㊰pӊ0ӊ0ӊM ϊ0p{0o`L Ɣ1}Xa\q?ZoE3>P6Q6~Q=6G)&Ee$ڽKxG (%5JA%{Q;JxG (%\.RCJH(%sNRAJD (#kKYJ-e& ')$%4u$%|>REJ8I )"%\tm/)"%\pQ:%& Y.ϔ>SeJ8L )1%XK` ,%WJg:Ҟixd ,=|%<|%N )}aIY+A%<S}JxO )}% O*}|TsJWo|QJx@釶i]%xZߘki_.eKڢu1KC w(%ܡ;~I|@؏׀^ M2/Gl p 0 ۴e_e_ev ˰ 0 p p ˰ ˣ52L/2\/2\/2L/2\/2,/2|.2.2,.2,.2 .2(Î2(Í2)ÎQ[X߭ϾNyʮ{?׷o^ۻy}Gue\G2U'ʸD(|eW2^Pc֗a}֗a}֗a}֗a}( e_e^e^e^~,/2/2/2Q#xD(e<ꒆ2QO\OXq2NP~c( e2Px@7e̲S[ܷ VrxO)@e\2R1cUy|˔2R~I{tI{-퍶i\2S}xQ*@eq2TƁ8P*:e\2S18F(etSʸRc 9%ۑ2YN*TC>TC>TE^T`EVTs۾ \I.i ܬ ܬ ܬ l ̫ |  َ LkZ|yiRQPb~KaAo4˖Ke`NTޱb]RU.\nyZym8e[o7LwK{7Xmp'+p~ /+++p*p[: |Б*0**E^1gYӕO-Yܬ 74ʗM: |L , <|| < ,lpS+K+pk[:|A3'kGy:~cҜ8_^^n*l*lpyƺH#U|T*>RGHרUT*^ROxJ5eʔ(Tk+0e*+@jul:knw: nW^~U|Uq*nV窸]ǫ{UVq*NXXfbıۺeo෬:.rpPW*>\ŋqOU^˫:p*n]PQnPϫxvf2osUSWq*>^ϫy=fO62Wq*.^|UWq*\ō8tOU'Wq*]ő9G]řrկU\;Wq*N]ű8wիUcWq*ZūuϮ՟đW %_oSWqo4>Yq702xgU<߬5Uçjd 5^5\kpk0vV+5ܣ>U j8A &CixB O 5C`p `^ `^ "ݞv# ^i([:P%jpjjgz {A}ܬLḼܭ\\,=yͲp-5X[5bv]#f׈5xZ{# ֈ5~ Ո5b Ո58R{)(@ J J D+aO ~`G v7:EU48R58R-5S/5P5P 5R/7C^f:bDNDnaIaILCN`aJԋڒaEVaHaH>C>C.i#03ꟳ#ԿbaLnԿj'uxR5ibw]!uR!uR֒V:\É:Í:ܨÐ:,Ô:Ø:7Î:,Ì:NÇ:<Áp>4  7 @ytXҀ b߀ xр#̂K:|igQ_^\Ԁ? ӨئJҀS ր%#=5pSo0q#4iiliiHm.ljljj|jj,jljj i㘆/ Ҁ= Ӏ; ӀGti jk?Ӕ ؀ ؀ ԀM XՀ_ ׀} ـ ـ ՀO xրa`>5`VF5`Vf5Q5`L&5`T~5`Sr4ՀQ ՀQ Հ= րa ԀK ԀY8?l?m5T5O5WSϘyXՀU XQ xрG ԀI ԀU 8K,k6`S65`S65`S65`M5Q5S>5`UK%f-ȃe րs րa րi fLkLkLk  5V>5S>5Mn5tЌ,ȃMьc8L(ۚ^,Lj¼&l4k&i±&j6l Ϛ&,j§&lj”&i&i£&,j¤&jª&jª&j²&i¡&j¦&lj‘tքM҄+M8ӄ?MӼ#45釯fM\j¥&\j¥&k±&k±&iš&\j¥&jª&j$5Q5aQ~5aZ5aXv5V+}WWMքiMքuMׄuM؄KMԄo͓\ʮ[ξSP5)p2d+O cy#Q& 6oaq6ap6o4U5jf6aq7rY+aZN6a`5a[5a[f7y5_5a[&6_nad5X6Z5aNF5aT^5W~5aZ5\>6c5c>6c>6a[5/.ر,ؾ۲nwn{+ݖݪ]r`+g4&3xHi!M<4q&'EhM[4q&-ChM74q&\o&ЄM|O4& _s=^X/c:^oXh~wI>ъ28Ik&^ćPi?M4&^{xNi=M4`&{:xN p{Z8A ?h-^'ZD h-pn{ZE hZB wh-?؉Ђ-3N)ZA 7h ɒ銼eWZ?Y25,]Z8J i"-p:pEr7XQƦ±ZP jB-p:|3-kZM i<-[[xN i=-i ^m]F׮WrQ"޶-bqX"6-buX"v-byX"-Ђ!-Ђ7-ЂK- A ^p ֵ`b n`[ c Ƶh J J Gi-,l~CZxH /i%-<kZxM i5-״p}ZP OjI-<'£ZxT k-ܫzq㵵ߵϭcXsl<{;fS'ϫs7ecˎ߾E5pl9M?S[=>:^|lY;X||<||||||||b||"||B|2|R||Ҷ2<,": *>.6vlŧggF|f||&||3wݒ܌M&|n >9̥|n(wC(㶽ee5[8o玎#fX>G9ϝc3wq?}^|܃܍]wr`۔;nI9auޟωk>` ea|!|A|I Os2GyG9|||q| |Nd>O4>Os~:g9?y6gy&yy9Ϲ|^|^l>s]q]^f3ۓ]vW8_d:b>yؼA\ .o76^|^5ʼe2pbNl ذn.pØ8ʿ16 xmyX6`ƇmӰp&n #7`݀0vn c7|),YGؽ7`߀0~o 7p `' 6p ag6p1SxE!L.yeq6.=8Joe3xPq6 o6n6n6omq:xq6m6k6k6 l6 l6 l6 l6,n6lü6kmqC}#ahaa.adVdhh6e1k'oچm8نmنmچmx>%ζ ];?gA|n6m6|nî6\kí6jí6jø6m6\kk_ƶafvakazb 0 گ3߰ o00 ۰ Cڰ op [ ڗo~?mXц!m҆/aN#Ucy8mvHaHS48KsYIK\jå6 kú6k%>S>aSXXk2W/)sK: lú6jî6k|ô6|hÎ6|ië6hûOly?wÜ6i×6jÛ6iÓm혇=mxvC:ҁ)ҁ!8Ӂ?}x߁/Ёс1ҁ~t`AVt`@'HЁXсЩ:a@Ntfe,<1C΁f>t!wLtI&t`B!w`A^tt!FwЁЁ Ёby8߁ !w}x!VwbuX!wb}e[ 17:p7:pst{x!w`Gvt`G @6tb+byXށmsmt`@>tItDtF!wAtbq!Fwbtxy#Y.iS:1C,;1C;1C ;C|;,1C;Cl;qC ;1C<;qC;C\A|:n˿e;!e޻`%(/Xoɶ%>t`FtNntFtHf#f!w;J.t`KX!wxс#tсbm!^wbxށXЁxЁ~!w]m,c|a]|u.}SwS]|Ou.ŽWf]ܬuq)X[\޹.:/vn. x`O]ܰv.^ 8^fE8_lbs7^ xa']v.#xd^l-,sroro2>E8e]{#]#{gf=ܬp^z8\7q=oM/9xK,}y<_tI28P0} q>~o4}q>.Ǔ8OsxN9}<>oN/}\#GH}|;ps???C0{pm,{G>>><W>Ol[p0/p0>1OÓ>>O?rIK`NaA&{އ}bz'}ix'}bw'}xK]>O>O >qOs>|Ol>Ol/]w-x'&}b'.}bb'&}bb8'}b|'/؏wmا޾ֳ/j=Yegyntm}q>ѿ6q>.%xD}<>CxHбgans,u/*7~ŠʺmO>RN>~8^w}q>~dew(#ۻzrcQhdx}>sxn}ܷ>{xo7.钆{>w1~;u|x;8gu:mඃ.{ؒ1'78byw#\m3u|1bI)x7X5a6c86!w#0r#_ڏ= ~lb8? 9o4\<L,CS  ~ ` pdGpd ,!?ۦ> aF aF aF aYLt25x48ewfoqaQf > a a fa aN  aҰc{f. ٱ!l£!l¤!|š!Ÿ!¤!L¤!¬!,(Ӭcې2lˆpnφl j׆jjdžpljˆikkφ0ijgiw˖φpj0lx_3-iplH!1~spipmgg3˝X$-V9er^s?Wmks[_s[n!!!L!!\!>% &afaaFmʽlr0{^Fs\\v6e܎ ^3#8CqGlAG]?$}z$/Cb? `)x C|`+ !13cw~۶ 1AY qw4n0xC&c?&c0 cx2Uc2mc2csڟ7ߵ/Op~<&^+}O1>1!ƟrI38/1c`1~1܊4\a'1.0mg ca+m_dca71^1%xo c`Kq1.0ư ǰ710xo>.0?c|ae6 0&8#-蒆 Lp .0&!G>0&8b40&xo0&8'|`+L/X?8<x=x=>>x?`'W`Lp .1%&\}Y/1&xbWLOO 0)&8pY.٥}}ep ^1y| .Yvs}Pg.Xעr~[Y.6&L`L`FjM n4&JY/q , , | X?X9::&pvg'pvg'pq&pp'q'q'0rC'~/L>f9;89x8;clӟ < <|L ,||| \e>q3'0s3'0q'r/'rG'pt7'r/'0q'0r#'ps7'psK't NND%μkݗ]^cy.y} 0߰s Gpt Spv gpv g0x 0x pyLaVOmSX>Ǚo8?SX<'.H{gMn4s #h 0h 0h q=1Ϧ/vð)) ),´){d Og S)Ÿ)l™)6 Od Kd.[ޥfM2<<6~ӖMafNMMai4MS5wSx7cS7eSX3SS85[S5ASX4MS84C/ئaM6MaM6g i [L¤) ) ¤)L§)£)<¦)®)¡)l¦)ˆ)X0Vצ̟V)Sx4+3X;313xBsσK35#Έ3;ڦόeyugL>g\L= ̈3x>31#ψ3b ^̈3>#ψ3ڌX?#ψ3?#ψ3b?#ψ3x>#ψ/I?ԑf1{F̞g1{f0bFܟ٥L>l g1}Fg1{f0`FLg1}v->4b>3>#ψ3b8?#ψ3bX?#ψ38;#Έ3x?#ψ3btSr`ÌX>#ψ3=#ψ3x0#ψ3b;#ψ3bx=#ψ3b?#ψ3=#ψ38<#ψ3b8;#Έ3b ]3bM|gk4qF\+gqF gef<{훘;#6ψ3b;#Έ3b8=#ψ3:#Έ3 ҉3b죶i;#Έ3;#Έ3b;#Έ3;#Έ3bX;#Έ3bX9#Έ3:#Έ3b;#Έ3b;#s3;#Έ3b엶ib<#Έ3x;#Έsv&<#~ωs:'Ήs:'Ήsb윸9YVYlb e>99|N91|NܞcN|91zNl91|Nl9zN 9q{Nܞ9̜='vωsb='vωsb='nωs;'Ήsbx<'6ωsSvUn![zsb̉sX0#7,Go1'ax?s80s?sx0'ωsb.̉s?'ωs>'ωsb?sk=ؑG0b'9Ɯ>'ωsb44x0+s1s80s2'vωsb?'ωsb?'ωsb?'ωs2!s2!s2-s?sX0 s0sX1?oE+_=aa/2egpeWpfgb+c;pece[g{gS[(2phKgh~c_mj~c.aaa6aͿ \á9Lâ9è9ܚí9\Ó9<ÓU 9,àl|{YO?-ξoX(?^QF~' 3ukv0x0yz5\˂kM0o' v7\ wʝr' ?w0w' Swʝr' 'wɝps'l vp' wpp' /wѝpt' Gw؝u' wNlee`6`~h~ wp~'ڻכ:ЙcɖmYb*,Y-E%K!! - Ц @hg轗[L!}utd{a]%-f?ffѵϡ`˜-MXNX gb{p}3ܞa g?ϰ&?q`fk 3aFKG>k0f4Ō3aF?}1+fvGČ3:cFSh11f3c3:`F70fÌ3`Fh=0f?m0 f63u90f g~33z`F1!f4Č~3a'f#5a?gt/z3aF̼(x3Z`F h=0ft g?f4 g8= ft gzdM~3 g7N87w~3a33\aN3aFh}9-0f/x fŒ>`3 3:`F]0Nvΰs33:bFG޿r{u+̟a3dF1 fme. g?>y3| gSC!bSSgMXg_q!nxbU]!bK-!}RpY!΅bT?!^8M?!UK/OB_x/Z\]!vbZO!fbTQ!xYwbB_;žNo8b\q!8^W!^xUW!慘[#i!a!8bi!68bfG9F~"xeg!X@!~zϏcX5!e!G#!xK%!I+! 볰> Ȱ Ȱ ?:7e/<=,z5:29Ú39:4CZ0Z1z0:1Z0Z0#:2z/ú1?2fM 5bXCucXÅ5\XaX߅_X5^Xu_X߅5`X5^Xu_X߅u^Xۅ]X5]X]X7X{Ț ku"lsd/|,Gf92˝Y̲d3e,Sfy2˒>5c1,gf`dڏY[ ߓGe,f96˥ٟYgOX ܚ,fy6˸Ym)-{^uyFξ=?Ş?y>YͲo}_YkǬ{OG֙>Y~βvdzQoK^;[c_X89αpso8asGX;9^αus c0Ƨ9k_s79ps,79Nx'?s->{>?9i9M0 #kc֖F>90>斃ׯ517ŜΘ s`NCi9 1!4\9x ^5\)x_ k9 16 s`N;銹s͑sbk7.:szdNi92]˜v.seNi92Y/Ŝ2se賾szcNo9173=s̹=szis3s >к. szfsz`Ni9]1M͜V sZbN904V s/g0œNsaN/99 04WLX90ÜaN?90tÜn sbNW9M1 ^œvs=>90#vslcX=9v9ϱs c6ǻ91nms3;9ϱzs̝cܚcx6GC89ͽ6x}̜ܵggF1o}_"܋0.³"|p.µ"<){6·"l0-´" /ƈ1#sDSƬs&bG1#f~<<>CqC",p$‚1#}ļp "ΙD1#{|s:b^G1#ftČs?bG1#fz쎔})t?3>bG"Ls?€1S#fnĜ8?L39bG1#fo썘7bG݈1w#ftLi0b^Fۈ1#p }gM#{y߻so0pN̿I5¼f:`^̿g-1¼~zbbz`^ky05ü^N[iW`?pg__̿?a?O!~)y7 u߼ky75߼yzn^y7u߼^l^kym6ܼ^ׁm^y]6uڼ^el^y}6ؼ&il^kyM65ڼkl,xglg25uhy2]Dy2‚XxU,ÂvX ZcA,ͰtÂnX ZbAc,CmnSaÂX;r^,,W݃Y`{qgA,0iA,-g.pw_ ^ 3g.0tY Z>1^-jW ZxbҔ{SM'>X.v ]`kׅ{.pw ]B#xoZ{.pw~.w ]B;x&/9.w ]w.םbN.r l]`Kv/0v \`GOs ϟpWs.piO 3cνsv9/|^-0le / ^ٶ-j3 YW,pgQ <[`}tQ YW`M />kǬ}Y{y [`~-pli l[`x-lk <[x.pmg [`x>-pjc Z`XF-jY Z`~-j] Z`s-ط-oG \Zc9-0n/-0ϨȱE-kcZ|qmq[d"{9ȤE6-o_<\"ȦEV-kUY"ȧE>-riYlZd"{ٳȢE,f?{9f-h=Y͢_t',X4Ef-L/4ž{f37>-rhq%xϟE,g=Ydb9^-o.u9-2ng3Ck[d"YȹE-mi|["̲ŽsCyȽE.roigkgha[g"ȱE-rlYE.2oy[d"ȼE-rkcjWZ"yȫE^-nwl[d"9șE,e1lY1_xsrO<?빷ȼE-2ow["x39ȿE-2nGY"ůpCZ"_:lZd"ٴȥE.-riF>sjSYd"YȪEV-jSZZsZ"ٵȮEv-k]Zd"ٵȮ_Z`ٶȲE-rlcZ"yE..jk+9ȺW "9ȸE-ls<["yȳE-2miL[d"fދr+ʭ(܊r+ʭ(ע슲+ʮ(r*ʩ(*ʪ(*ʪ(*ʪ(r*ʩ(OƮ(슲+ʨ(r*ʩ(r*ʕ(3cxIQDYeAQD, ʂeAQ3=jvG5ӣsl&r.3aQ=jG5ãfx Q99aQDYeAQD'7||Q.D5ߣz,Q;jG5v}~;׬~pQs|kAz~H%f/1{+ؽ%v/q{Kz%v/q}K^b>:8`K,_b˗X%/q|K,_b F>O%/}K]zaK7t3%.q|K ^b%/qxK ^bKY^:K|^ؼ%./}s%./qyK\^1k/%v/{K^b8%.qtK]G%~.^%.1tK ]bC%-1r{K[=ĵ#|Gv~烈;\S1ߡђ>ZGKhI-% E[غ%.]#k^{<܋q3ƽb|-Ʒb쎱>b0ƻbݘ5_1c_}1_1_}1_1_1_1c`1_1Ÿ^xp}_ScL15ScL15ScL15?c<14;c쌱3gcloc16cclq6cc+gc5'cq4{č133č2;cq2c12c|10bYce1vxcb1.xe1Fc1>a1Xc_1{aY#k܋0ƻb1.Ʒb-p<#c|q0 c,d;h7g/~ڸk_<`x1ǘx18x1~Ǹcq1co1Ƙ)Xw})|=>a}-S|iii3cz$-b<>ƫc̊1+Ƭb7Ưb*ƸΈq+ƭk;Ş߹ecwFcd1Fcd1FXc1xa1"^qYGg&ܗqglqgiq9kqYhqghq~ƹfq)mFOw^Ow^7|z;=QO}ǻ#nwwc7SG&n5Y5Y5Y5Yz5Wz5Wz58aox^m׶q]׷xq7q7q7q7q7_5_5_5_5_5_5_5_5_5]5c5_5]:5S6]5Yݑ󧷜9y7y7y7wz7`CFo\Ƶn\Ƶn\o\?<8[O^/r\/r\/r\/ur\35s\/r\/r\+ur\5r\ 5f\Ƶt\G5t\+ǵr\'5k\up\Ƶh\uf\/ui\35c\3e\7ug+^5d\C5d\kud\Gud\Gc\?c\?c[o8-[|-Z,[ooF I|-_m׎qZ27z377~kѸոkиииииииkϸkѸkȸFȸތkŸNĸNF>ƸnƸƋkƋkƋkƋku鼸΋뼸΋뼸΋u;<^B%t^B%X`O ͗`Bw .$r3#|H0([ِ{^$fhOp#3|Jp#H#c2^$`M5 $X`M5 v$ؑ̒K,I'6?f; J0({Ip'wIp'wI0'oI&#ܫ0~KS/;ϖxL?]3\Np9\Np9\N09LNcl '`l &`l &x`lCFs=O{Qyȟoa~g}<|c>auz++)))))z)z)z)sϹJhJX`Y,~˼_2cȲXZcYk,!׾!#^s_uwnڟzOM+wk'\q[͡Q(?7{ {O'ل?u.^]%ݽmW6^+o:a߻W4^+yE;hW6^+xEhWt.^+xEhMWt^y`NiS :e}:~EhݽWt^+ypÞt|[·n89ce~yѭD&+KcYbEϯMW4_+~EϯW4_+:}}}u͡~0{X޲3{n瘕Ƅs[ݺ|{{Ye3ʊg(+QV<\Nsˊ;+'7leExX+}EݾW< h+5ac& ןqjW4_+Z|&?g̚熕Oc4_ Wt_+~Eӯ^u^+Z}E{hWt{EW^+{EhWt^+{oY7ܰUhͽW^6^ӯhMW_+Z|Eh-W_1kn_+}EWt6_+z|E_ps:}嗃W}9W׊\m+ZjEìh}V̊Y3+zfEӮݱiV4NJX +:eEOhGs i'dAOFԽ2SO)?e\w.ō7RHq#ō7RHq#ō7RHq#c>s$Ő?RH1%.C9I%)XbI)VXzH1#Ō3Ri=?RH#ŏ?R~O{8@jq=RHq!ŅR\Hq!ŅRe֧vo8Ǘ/Rٛ {xM7)ޤxbH )3?eY2SfyO)?e2SzN)9e>甙2SvSS1Sf}ʬO)>eާY2Sf}lO)=eٞ2S{!ؑfGco>V9Di>yfEOC I3$͐4C I3$͐4C I3$͐4C I3$͎47Hs#͍47lI xM7i֤YfM5o:cs(͡4Js(͡4Js(͟4wI3)Ck SMi6?xeTQiFS7iޤj>nV[inV[inV[in K3,Ͱ4LJ3)ͬ4\Js,ͦ4lJ)ͦ4lJ(ͣ4eXaJ>cg913f~cٞa@#{?fzd>1,Ì 2Ȱ!Î 2|!YCYDNd^8fdaFfdaFfdaF dؑ13_9f'`^dxA&dxAW.dXaAd8DosVdaBdXaB &dXB3bI#l3CVʐU2d! Ye*CVʐU2d\X*Vy^#}{ g*+V}~LY}LYe*;VٱʍU *;VʊU&b Ye*cVʐU^bX6Xe*+VYʄU Xe*VٰʁU~ռ_ gªٿʃ՝z8٬_m|l֯fٿjfپjy1\pz:w}i|n o_ W9ʻUޭlSZs\[e*VYʲUle,[e*VٵʲU~lYZe*VʭUnrk[Z*VʭUnrhCZ*VʯUhG_e*W*WŪX蹷4Xk`Mqk|_5}F>~k_5Ư1~k,_cwwx{+x;xӵz5}|k]G85qtk]G85qtk]G8ѵ/5ukl]cSט51uK'لu1xkYccxƈ53 _35s|l^3ƒoo skL_3}cub¹|ܰ{F=XgXƢƧ5gfebY.fecY6f٘ecYe^Yeٗe_}Yeٗe_oYe[oYe[oYe[oYei[wcX}ݘ#kݘ}^:ηumg<[g:o;^f3so7L?uS~u_g:9u3}7Xg:?u.3d! YgzhLi#{n;?\g:Οuώ|:֙ΤuM֙Χu>iO|Z:?u>3i9Yg:ֹΝun8Ϥ-7n9ϴulg<[:ַo8ǹun|f:֏&?zϼuޭnw[g:θumm\[:֙δu~?3X1\[g:yηumo|[:ηumqz}~pnu[g:Yκu֭nu[g:Yκu֭nu[g_~Iʾusog<[W }3θuƭ3nq|[:εusnml[g:ٶζz3ud:Yuw]:uw]:uw]:oyuޮv]:oyuޮ3{p/?䵿2tݴhum u&X`]kuM 5_MO!3ߥIƺX8! ]poǟ17ws17ss17ܓn8f7cuNS8cv9Fct9Xcq9aʽν~'Ὰ!r!s<s,ϽОIwx}9瘟c|9c|9c|9{.[sq??slׯ1:sis_+=Ĺ-?s!r! ^BN'tBN4BN+tBNt@Nt@Nt@Nt@Nt@Nc9؟|9{gL.{WWS!9 9 9 9 9 9 9ݑ!99ݑ9ݑ9ݑ9ݑ9ݑ9ݑ9ݑ9ݑ99] 9͐9ݐ 9ݐv9^\Ew&\eS^p>z}鬜ܗOyFi6锜N锜FiF铜^i>i镜^镜^镜^镜^镜^镜^O%Yr%Yr%Yr% ֵLNtENWtIN'4BN[tBN'tBN'tBN#4BN#4BN#4BN#Xl9Xcm9{c>i_ 99'y(yyyݐ yݐ1kZ"%:"6kkVȳ:9 gsy.繜r^_; <( s/3`^0 fs\.3kG?䵓aA;GDwg|Myw}s&>Ǹ l+ +|v`339{W`XaW`YoxVYgf8USe~8UTVTUM6T`SM6T`SE>xTQE8TPW9a}x? *p *p ? * *1^V[FU`W]vV`VW^XVϯzϲµc<3YVdVYEfUdVYEfTdSME6TdSMEPdKQE>SdD3ENYSdE7E^SdF;EnSdG?E~TdHCE9RdH!E9RH#u4poXpgE~CRdK-̄K '/׌~G*87|gq3L,2"L,2ĢCXdc{FYdd-YgE~YdgEvYdgEvYdg-{ZdkŋEZdjEZdjEZdUUESdN E.PB E.P4f/E_C_EhP4f{/Eh"/zϿ(rȌ"3~EnQFEVQdDEFPC)ERI'EfQdFEfQdFEVYQ4f/rh_ޡ4o~V_~ySO?EySM?ESdLE~QJ=:p9bde_~*rȭ+3Ȱ"+rȩ"*rȩ"<*ȣ",*Ƞ" *eps<:fƬȳ"+rW#9W\sEM6 mmml6?7 y1pp `;7Nw ^y n0t `C7 n0t `C7 npr0`m,Ć ll `37BSeޙ1{Y˲ nw#2w,`-}i,`6okI6x mh\ڄG-pmv~G~1cׯ?¿kG.׎׿@hCmh 6҆B:hCmh -џ j 64ԆPjCCmh 6ӆnLi㦸C~C\g~C^?Z6ކ{ZoG^߆hmCm 6>knxmF ݷ6t߆tnCm =6trZnCmh ݷ6t߆}oCmhՍqC7n 6݆ЏnCm 64܆p;>с:pCnh 74ЀpCmh^6ۆvznCmh ݷ6^y_Wm 6ކzZoCmh 6ކkzm㷦ا 7ۆv:nϦIj ͷ64߆xoCm 6tކlὒ+i+i+i~+鱒+i&+iv+i*i*髒*i*i*rݻ\>uOu=>]Wuzʄ-:{K{KڶwK:i=7ǥ'On[Ә&-п& 뿟-ےv-iג-ג>-Ӓ>-iؒF-iԒ-ԒN-iْV-iߒ^-f.韒)邒.(騒6(i6(CIAIAItII_AIXmYoi(邒.(邒.(邒.(邒.(邒(i6(i6(]J-+gK>=xm%Pb~%ޗ[zK\.qK\.qK.qK,.gK-qkK .1kK-‘ϟ7%X[bm s{K-q'K,q'K,qSK,+K,1cXXb]u%֕ad7ް%xXbfW9wLXgi%FYc釃?8%^xYe%Xb`%Xe%8X`WzZbh7x\bq鷆wK-{K-{K/K-K-K-w.nS=|v2ˬ/2ˬ/7eTSOeΕTT1e>YU6f/efǬ1̒2L(3̯2'|-̖2[ʬ(̦23(327(s̍27(s̍27(s̍27(s̍27(s̍27(s̍r~=l)s\^STO?eSO5eySfK-eRfN-eƔRK/eRK/eRK/eRK-eRJ+e9RH#eQαa1α̞2{)̞2{)̞2k)̛2kʬ)̙2_L)s߆~~ ]NwozN;O;~'?n#}-}?{uNYuNY۔NYߔMYߔMYߔMYߔMYߔuMYÔ5LYJY|9R(寸WMX Z5νdº>*륲F*kN*[^5OY5OY5OY s9-TBeSBeS?eS? ^uBYwuBY'uBY'uBYAYAYOY5D'埻Z]Qe=Qe-Q1k9fƬi)k)k)k)k)k)k)k(냲>(냲6(끲ؼO?~}ߍ_=f7bSWlMM)65ǦbS[luMn٣?6uǦcSwljͷpNljMm2^ljMU6uʦN):eأe6u̦|)w۞mcݶg~mSmjM65ڦFhy}-r>ty7nunSmЦ~nwث65ݦty܌\C75ԢZtSnjMMA7ԡ:tSnjM975禾ԗrS_nM}/7妾ԗrS_nM}/7妾ԗrSCnjMM 75ԃ:rSnjM] 7?qS3nM7u'{C^p9?u¹gM=6Ǧ|5Mu6֦6%mdV*ZeSljMU6ʦV*ZeSljMI6Wa:cSOljͯzbSljM/6Ŧ1cSol GC/ZU{l~Ы':dSljMC6uȦcS{ljM=6f>ͲMͱI6u˦c#uȦաcSolM56{cS{ljM=6ǦcS{ljM=6Ǧc~m 6uShؽF舊Fј{vϛ~G+ڥ]*_*_*_*_*S*zA*A*O*c鐊kG*Z*Lp +p +p +, S+l¼ *CXXb9TXSY̠Jl3*<£ *L¥J~=*0¨ *0ª + *̪p9=sgY1kL+*\pš k*š k*š k*\› o*p C*|}uT^+c*|[ʒ C*<’ C* 0 C*ppfTQaFfTQaFfTQaF^T~q쨰Ž #*0 '*p† +*\0† *lsbVՊZ1W+j\sb~WҊZ1+flŌbV֊Z߫U3jVתZ5Sfoݪ[}`[5sfṋU3jVت[5cfl9[5gklkլUjVڪY[5gl}ޛU3jVܪ[5sfṋUsjVتZ5[fm|UjVѪ9Z5GlUsjVѪ9Z5;fg쬚Uj~V7V:sjVݪ[R5Wj\UjV֪Z5[fkܬUjUͽW=^ʪYY5+feլUsj.VŪX5fbLyUsڝr_o=W֪Z5SfjLU3jVGr73qoy[ zבwǷؽ-vo{oq|[Ƿ8-oq|[Ƿ8-oq|[Ƿx-o1y[Lb-oy+͡|ؼ2z[b-Fo1z[b:GC-oy[bc-nqv[G8-fn1u[7-nnqs[7-~ns[7-nnqs[7-nnqs[+->n`K&/c־lX-ox[,شŦ-6miM[4fܲc[bń-&l1a [LbxŢ-lq`[L|/n}c+}c߷=ĭo}^o~cw={鶭x\7mo8Җ^K[ziK/mgtٖ.D[gKlz䳮[:eKl-=1cKl-3Ζ%[cKsl>x7gm{5]Q5]Q5]Q5]Qnr}5R(5R"5MR#5=R#5=R#5=R#5=R#5Q5 R&5Q5Q"5Q5Q5Q5Q5Q5QOco鐚鐚鐚鐚鐚鐚鐚鐚鐚鐚鐚ig=R#5Q5R5Q55Q5Q5Q5Q5Qt{jcۏ~{#O5=UX5UQ5UQ5UQ5]TP5 UP5 UP5TO {>l=s9}ZM4ZM4ZMY#n8jjjjjju]Mt]Mt]Mt]Mt]Mt]Mմ\Mt]Mt]Mt]MtYMմ\MWM{{jjjjjjjjjZU^ 5&׸Yc]O54IS5NոZcM5XQ3k}#\˚kjƚgj#u@-5R1ks#{SeA5TcN95Tݑ 9TP=?zϡj ƛojƛojƛoj>fA5ԸSN95:'N=Ώ:?Ύ:;?i3K,sΑ:G}pǬ՘̩3Μ:sꬩΚ:2Ɵ:Ο:Ο:꼩Μ:cꌩ3Θ:cꌩ>;a9uYSgL/rΟmtho憽#F&YZghuv֙Ygcu.9VXuV'3ΐ:C 3ΐ:C3ΐ:CΏ:?Ζ:sΑ:C 3ΐzw:[}d9^YPg@uP WyRDuNRgH!gΐ:?΍:C 3Έ:/ꜨsΉ:#ꌨ?uf?3xώ:;ܨs΍:|·:|eSaN?uԹSP=uԹRJ+uԹRJ+uԹRJ%uYR\zϚ:wꜩ{Կ}{&տe wu{}#'|? q}WCs54WC_5U)C\ ] a ^ ]M L M [ [ [ [ U ]U ]U ]U MxKF>Uڪz//^uTCG5tTCG5tTCG5tTC?5tTCO5QC#5RC35SCC5TCS5UCc5?{>M. 9 T @ -D mH L P GV5PC54KC44MC44NC4MC4OC5PC5QC'5RC75SCG5TCW5UC51Qxxች֞t[snk7zG㶖֘s[n?)X o=fm&m9v6֡:s[snk'߿sG>?eSsv=޿W^nmm3֠ۚt[nkmY붆ֲۚv[nkmͻ}5{Ҳۺv;2MֳZv[nmi^Iֵ:w[nkmۺr[_nmIcֹmnw~v0a}kCͺmm3v\֏:dsۼ69Δm.nkmFnr~ ؼm~nst]?vL8=9m mnsvf6mnow3YS)}۬f6Ymos~Lf6Ymfo}ۼWYʑ5omo3~랝Y{IF1}Ø^:y_3rgv֎;L;aGgh#vtĎNB;hGhvt؎>?2tW:?׏~۔C^7w}G7G=^C7tw>}\3Ckwt펾ѹ;zwG w;ywϿ7YhMw4;xGhQwb䳮ѵ;vG\wѼ;xGK&I_7ƽevMkOv[zAk4Yש}y_רu}z_ר5}z_ק}=z_נ}z o7q|}y_wםu}z_׬5}z_׫}m{_|y/y5tp2t-__|C/=ƿσ7}.y} C>ƿσ~rO=1;Co<ƿσ)C<Ɵ|9c?;x {xσϷ'0gqx>?3t?M?r}'ȡ<{bσ?'ICߺw׃_ ? 8qoz?xԡ'|zpmw۽ڇO䶿]>tywW1}o/=|~><0Dpoϸ_{ߏ1<}SŇ{bAv|0?χ8g|ɽ'f>?'O{Ol3|~<}n?}/q|Ŏv|+_rt _K6Ƿ:M9O8 oop;.v|o 8}vG?ڃ? Ǐ;~su?e/:~W:~id75ǯ:~'?r;^xw)?{?o:?mut? ;~_M}5 _okpw{C7h̵o8w֞xǛoxSǿw-oxK;9wmox;;x?8ww㩎v=q<~x0\5w]sqL53wݹf/w]sw,]l6F猃=n G79qvϋ)VܧqvSu}ǎ@-G]6jCGϡvunq@:bx#pg]+qИ7ܷ?ot>}>cNq:r]zay]IOt|ssgv\O?iO}k_бv?סvu}gLX Ovή;jW_~k<~-|ޘk4ѮNi+WݴvҮ6FzjW+j][vuˮ.R/cϮNIzhWSj]ݳvuw|=ZhW Qv5ʮF(eW]=gv̮A:hWj]v5Ү~OkWs~p?w3[{\ߓL.eZ`C wݮ~ZbWj]ݴ.nAvuϮ] ݿ &hꁦij>hjnhjhꀦhꀦnh[׿upN4uBS'4CS?4CS[4ES[45GSs45GS4DGõZ}ugZWzaqZeA6M>M}4M}L雦iꛦiꇦhꊦhꊦhjf~̺ijij:9EZCzc:yϦh2&C mj&zci[ AMf7y$M^75Mߛo~{MM7dfMf6duMn7CS4uCا1ϻ}'CO;??O嶟skj~jӃW5M M y¡Ϻ:_is:sZ]zgڦgڥ]i:C:gO:aڥU:SUzWQQ]Zڢ&#lH&km&m&k?7n2{k4GS4GK?CK[9IKg?Ni鋖h遖^hih鏖hih醖h錖h+Zm1[nq[nq[m[n1i_[|mw[3cֆq_[RG gt o-3e2[lk-3eֳ}sf|-3eX2[iŴgLoe3Zh}^>nmt/Zhqō7ZhņZh1ŐCZ i}ј=bH!-L#-8bM-VbH%-L?-=SeI%-NF#-bL1-6){gh/wZi1ŢZj\cf¹p?1δ[|lźZkqŹZ|k-sen햹2[fu?snɄYI^7ydSM-6bV-n3Zi1umȵ3j];Wyִ^e={cصǬ7s_pùp o894Ǟ*{ZdO=mUtʞ`zbOK=#tĞN){:eO}se7)wӾ{=tҞNA{1ywuʞn {aO7=}o͞7{fOi=C4ʞf9{eOsi=ͱK4tƞ{ZdOi=-?ؽ=;c>3|{:dOi= 4l=7GG]nc=]#tĞ{bO#I{M}]}s>Y}Vz_ k}Ͱ7c>1x}Fa_;k}+užZc_ k}}=Gν-k`&|N>4r3S^NX+f_쇃} Ckf_g"Zd_k}-E>wϰ}}lck~6}3mq\ۯLy-Oy}f}MX>Ͼ}o?}VоȞ`߇Fythapϫ{~Ao]h=>}3} g>}f|>r} }-4ľn`L>Y >eܧ:cZa_K}lg lg>}{,g>9}fzg>/}t<>Y}p<>YϿ}vst,g>9S܃7~ y~1^>1cC?ÿ{}5ӾVJ:j_k}ѾfLi_3ߺe)u}khߛbLG}uھN^:m_gݶcd{_n_o_}mw4ԁ:W@_}u4؁;f:@hw܁;sZ@+h}x u@cDwE]o:}O}@/D_;tAMr~?t#=OOCI?x}?~@3ÁgF!<x8rw<x9в:@|E Zs3& 5a'{8y81>n5;fss&Y' 4?yIϟ 2aS'{:xs3؁g~4>Lp>ǁ>6?@hm~@{h=}g zA~id]ʄsZn8q|ǯOOx>8Z3W|^=^gh}4>2Yh||̚>@?]}xݙ:ຣ!9|C2PgrPkAOpPjCp5[К8PSjCMq)5;ܲ'~91%5š8zPOCq'ġn8 PjC-{e5ágC~yPCmq1uš8x{^CmrMǡ6;"PC]rCFCq?ȡV9),?ܺa929PjCmp .868М>4yph19!uȽC=d!tg w8!YxCr򐅇,s򐅇,G|ȢC2'9d!tȨC^ra;!ywȻCS2>Ǥyyg\{5t_} sz`MrLJ<=!gd!Szxm*{{pmζyfjmfj6+o}>.=|n{1 my m~ڡ6|o6oԡϬo6یo36ۜo6sm36ns6ns6ns6n6۬n6۬n6 o3]eϸ{p9Ʒf|mƷfn[uB1kǬm}n}m mnYf}mַ{m~m^fzmַ5@mfVYm^U:=shjͭ6,kͻ6ڼkͻ6,kg@umֵf_gm9]ڋF־pdmYfWomy]}mfamncm_cmεf]C}=lk3ͺ6lkͿ6lks͝6wLk͵6ks6wLjͳk?9ƾ6fs3mnf3fx۬n_ 3m6~یomsͳ6Li3̀6W\isݲ0tOfSσ9rtmsi3͜?Y1kkGf_#ȼ>2#1=GћY7pĔ#nnjqGedC{G11?ǏX#1G>Ǐ8c|yvqG|?|#6G|>ӏ~#}͘}?zȚ&88~?Ϗ~#}{qGZ;sG=###t|G?~kHOi#Mq‘V8G??Y3Țn8Hi#=q~}hMK}7f߫&^{C_=:pt‘N8G:HKi#-q tdc4ѵ!đ8GZH ?=|?m^cp5ı68?1 n8 ǺX7cX7cp 1Y8:?pcp58ǺXskcmq-ű8;^7±F8X/YK#k1k1kcִDZ9^yA3CYzcszx}d_9qƘk4qizq}z?XKcmpx=>1ߏuñ>9\?p?>-r/ű85>8X7cq?}ckc3X/?k&8 XOX?3Ǽ=1oy{C1ۏ~cnj=1g9{c{?1Ǐyc3_|?f1ӏ|c.s\>f1׏9~c=1y|cF|;)4y5?xOw?|{Ow*?tn)/o)~=X7kct{б>:PzGGuб6:A?3OwWNϸ?1to7n9w8w1㟜p&~j9=z+u۱;ւXOcwݎ۱v;n=͎5۱;fǯYZ`FOZu߱;uǺ柮ߍswN4߉F<ъ'DChmyVS>:'ש':DhmzMO~=yw#5<Ѱ')C5ɻ|~1Y}zUOn<ї'D_}y-OpiS>cO鉮='D7mz%O4.=р'Dx2Yu'zDhw5Ot<я'DxNt቞;s'Dhs}Nω9R'ZDKh=uNtى1]vN4.;e'D+}tN4ԉ:['>ܻ55ɇQGw'ijg~LwM7Ϳwo3s{܌zw~c]'9> u|4 [?sϞpݧ8/tc> G}й/q|K_JW8?e8^)Nkf79^F9mcν!}[־rǷ;~p| :ݎr|?3'O~cu ]s?}ǝ[}pe/9~+W:~krrwW;~'99/3ǟ:ǎ?rf:޽SOq?8zYy[οx+[:7s<wmov N';TSwqx/t㽃9sSO\ԳSO=۟z?0sgS觞O=z?~YgT3gS駞O=ןz?\sgS觞O=z?cWGw&\;a9f}S֜jSS:)N9u?SVh̞s;ݩgSz?O?S^r=)7Ozӏz)OO5)O?v̚9)OySp)c֞7;e)#O?m 9Sf2w;}{2y;e)O?:cOtdE:NuʯS=WNrʙSE,:e)OyxS~ӄ_)OfrpoVrs;e)NwʸSb9f򔕧7'<:e)#OYyS=9e)oNtS杲8)cNsʙSΜG:e/ްW׃uc:)N9vʚS֜59)Ny{uvᣱwþYbM'јuua`fvf^vxan7aso[Lq?ǻc1;놿 οՄosg~[S]*}'/)y^蔎薎n蕎6h6h6hnh>hV蔎N茎蓎>蕎Fh>蓎>h6Oe:ڠq::;:ڡ+:;:c:z'::;\p; ;p: :::/:/:}'-6g}Lq~|촟8 ~7юю фф ч{~-y}р рmъ р nw-u]y z]rh}wbo-iH2]???FO]yip>9t|=~{<[u[Gu]Gu\GutZGut\Gut]Gut_GouVGou]Gu]gG::ڭ::z::::z:::9:K::t5џa)r4?>=эmџсn{vδ;VgLg3t#uٛ<w3ms3=r3pδי8Ag?3Lig0=t|S-w|믯}#!aV>wN}wwg7gZL?i3-}ϴ>gL[i3m}ϴ>glyh-6n>gLi3 ~4Y[o94n?gLלi3msδۙv;ngLi3-ϴ?gZLǟ3:C|]>>{n񉸧=g0<Ӿg)δ=ӾgLr^oi3}Ϟ9Y'3|YL}O>葵z̘}A?gzL3~4f?[|{>w=<y8{5?gs3g<#yF8p̳Ù3g-{{;vsܹsy#={V8z\{f9ץ\{;Lw3ݹs{<׵O ks zsy?繮=\s zAϟ6>;a]p]/p>\ks{>\ks|SuN=ש:\k {׹95\ӞksM{Ϲ9?\kstεԹ:RZ\Kks-|ֹuҹ96\ۜs{!Թ:BZ\ ks=q3uʹ:?\k7s~;Osvҹ^:_|:scl;g9v9vε9?w3Yy?}5,=g9 Ϲ|s>3a ;g9vΰ/<yxsFx3ο6x99xssO|:9ιxsg<;9ιwΪsN3a ;g9vevηsC :O??fg>ml;g9ιwkcs?7sq;9x=ڟs3o;g9ws3i~/q ]G<.Xt ]C.v ]0ӽkywwF򻞨yD~ϛ;=Hk] t.υ?B+]h =q'.{mq.4Dž!:B\ qI.t9t13uzB\ rY.4˅f*B\ rA.4ȅ(B\h:B\h ]rE.*C{mrQ>oG> ra.˅/B\ r rA.4˅f,zB\ 0B\ sa\w}5OsM:-vO.tɅ&$ZC5^\| tI.4Ʌ* ^5˅6)zB\ -q[.>u'>kƬK\| ??X:{˵/څAB ]h =t1:B\ s.*X=_}Ⱦ/i9.tх^HZB] ]t.Ѕ6FB+]h Mt.х^A:B]h mt.҅?B\ s{.tӅ.EB\h tq.4ͅ޹AB\h r_./.6B ]h mr7.ƅ޸BW\ ]q#.tɅB_\h pq ZBK\h mq5.ą蚳]-Hkw5ۻ]kw95ӻfzLrkwg'=܋7ot=n7s|[~y?>wSo[w{NsN3&w1j9=o~_ꪮȹw#_?{ڨg3{=sgsz{zǨzL1ǐzqǑGzZǒ/{<ǓOz =sDžz,qnj3z1ǔ_zsb?z4ž4{O ޏl7rόqǹz걫ǮzK+z ǮzǛoz\1ǤzL1/x`=JQ=XcQE=XcQU=x]=6cc=&X+{wd=o=r2{,{\qG;=&u=^x{vpo{{{q{\}>4C#ks{1{l 3Eyp=z=ru^^|u|O7~=z=18{,ﱼ{ﱼ{ls1{:{{1==~q}0ms3zzAzZ9zi}= = ?Y= =mˑz z:+zp׻n qK=p.5&R+\K]q+.{5&zRO\jKp.ĥZRk\jKqC3R'\jK^_ߗd%/~KN_r޳˗\&'ܾ%/?=) ߇%/K_2 d%/y}..M'?_zR\jK~]V& wY{K^r|%_/{K^\d%/K^rR\j˳qk^`%/}Kn_rܾۗ%/y|K^ۗ:?K/YzK_r×%/9|a//YyKv_G>=Ld%.9wɢK]𒗗Ld% /YxKV_~Npm{_4w_~͔\w;{/~uC{Ͻd̺7R\K}rO.ɥ~6R\K}sm.ϥC~?w,?ϭ.5ߥƻས}?jKw.5ޥ?R]Ku.ߥHKw.5ҥ^~ZRk\^3ZR+]K}t.5ߎ=ܟN=G} o=5ugK=~eȽ^~辞꾾k美.k辆k辆k뾶?e=::ڼZUy_3s_Cv_Ouu__uv_ouw_Ouu__5u_[5u_[n_o_p_q_'uw_Wus_h_i_j_5s_5n_p_5k_5l_k_j_k_l_uk_k_gi_sg_uh}mט}ל}נ}-פ}mר}ד}]ח}ע}מ}=ׅ}}׉}׍}ב}=ו}-ט}׃}]ׇ}ד}׆}o}X}}mQ}M!}m/ ^uD}]} }]5YSuR_[5D}9gl}yg^}}ya}^ye}}gj}ge}Fg_}}d}NxOѡ?3K\s>S<鳦Ϧ>W|o͕7;N߼=}o̾97q}oyus>[lYY7Ya70_sl` hhgsm` ̶20|-kfM ޿ȚY50Y3k`f ̩y50Wj`^ ̫y50U3j`V ̩950Ssj`N ̩40fAh`. ̧950c{̰Y60f,ig3k`v ̰Y60fu3o` C\osn` ̵60f e3m` ̸Y7010qU\|<{o`Á80f,p`980sq`ā70\sp`Ł980fp`.ǁ7>{80p`.d90\q` ̽70fr`^Wްwx80s`NɁ990Gsr`ρ80fp`Ё970so`FЁ970y3o` 80f}o` ̾|6f3q`&Y80 wsp` ̻y70fnʽoq?3ʌ2S+,s|~h=ľ=Y~e_W|e._Wy}e^W|e&_W4aL2+sܾ2+3o87ׯ+ʬ2ǯ+s|2Xpe_Wfy~e_W~e_Wf~e>_Wf|e_Wc+s\2ï+&\Wy|e_W9~e_Wf~e_WfY}ef_W~n~_mO8ژ#fk܏CW\bpń`Õ8rŅ+f\}gN\qW#qň+.\W̓+>\W'8qŏ+.\W̸bqŎ+v\qc9pŁOzϔ+V\Wl[qň+\qW/}__q@EDt("(p;SǤm&iڤcI:m6qpq"΀"q3,4ߍzGZib>afafaVUOVws#w8r-wrw13[[WpWP+wr)w8s)w~,8faaaaaaaaanaaaa1{Y|,Ø;f3}̾cf1w;ay~<~{̽cᘙ3scfťk5s;f嘹3cfk< >Y3cq<18f~cc4ܬ1s4fԘ3co}=1⾻{xó>=73^~>~}l)ƥb=%tΩb̊*ƣb<(ưb)ƦbL}NQ1xcW]1VXcUO1cTY1CE1CS1F3cL1$Ɛcbq!׾f5XcIC|~ch1^1&ƔSb< Ɗ+b"Ə[bl1'Ɯsb[K/{{Ug1cSM16Ÿ+ X]S1nc[{1~VW1ŸcT[1nŸcZi1^;p+1cN91f8Pi1c]y1X;T[n=~wc^y1ž3rb.cj5>x^1xb1fƸca1.X`1cc1&Ƙcf16b1&xb1.8`1c1^8ǬYgW4ce1^Xca1Xca1cmߟf?{G8Gs48[l28348c㌍q^8̌3387㏽~=}`=A}}}@}{YqqřgZqƙqLJ>?17>q^gjqƟY֞q58W78O,s68g㜍8g{=s88[s88|9{XО ~w܍=8W|;8㌎ϵ78㌎:8㼎30nqVǹODָ_qyOGB> 58g㼍38K㬌28+㬌s48+㬌28C|s38܌s38<08'̌338⼋s'λ8<(Φ8܊s(ή8슳+η8|3+ά8⌊3$Ζ8'Ο8l3(Π8<,>nyXcq~_:gYcqvřYgqYXcq9[oqZkqygXiqvZiq9YOq^yWmqyE[Cnj3&Θ8c⌉3&θ8l)Φ8l)ѳ {s$`QEw)an'xxpl&90{frLN 35a&9x M'a'0{|O 7a&҄0Kg kfq,N 8ȹ0fxœM s5a&لٜ0folM 6a&DŽ0fi,M 4a&ӄy0OiLs s.a%քٚ0f`\M s7?"L s5a&ڄ03k|M s4gB3б0[sY0Wj\M s5a&fr¼M 7:^ 8a'0flM 8a'90pL 6a&ڄY0kfmN 39aF'=>>{OĽؒ`K- $0Op!Hp#?ZcI f$xM f$F F$`F $C >$`F .$x`E $>~-;!ro o3ٔ`UA >%8`VO >%P[ n%`UC %XSO >%X`QE %z1,Oz?I%ٓQYI%f<_Aɇޗ`[=\y{1žaI&YdeIN&9I&oI6&yeI^&YdiI&YdcI%9dcI&Yhco$&9fI&nfhoㆽ#sp9$,Jr(ɿ$?,K2)yE{YWI%ٗdYI%_I%XcI%[}I%ٗV[In%ٖd[mI%ٖd^ cI^&>k\Lr1$3L\ }9jI&-r>gqqI%b{I^&Y߉\aI&9bI&ٗdaI&8'{-eVg@7{N1.ɿ$璜Kr.ɹd9n&9djʜO}{}ucS,Nq?S L10RJ1+űRlK-ŶR,L/ž S,M17{)Φ kSMq6cSLq6wSLq3OS`)NNO^lv"8fk)8`)xi)Fn?)~g)z)Φ8bf)bp)6n)~>`)^s6/SLrRL13S\L27S,M11#SL1T=Fxbc|L%tsؐIgR=7bػ:SRLI1%}`޿򜿍ǰR Kc5n=$ Ǹ6ƴ1ƍ=487Ƙ1ƌ1c=c{4Ʀ11g9c :uqk[c:X4Ƨ1^j;c<c5ƨ1~k\{bpk|cƘ4Ƥ1Fk_cƸ7ƽ1}ϱϺ!?|׽|ϧ~Λs.cbLwi1 04c_0!=w煮k11Gƴ؋"/r]i1-2SƴɘN#czdL"*ccLi1}2O^Z%cdL1=3rM閱=:fLӌi1kLӌ13gt͘3czgLKi1]1Ƹ>\w냱uX51Vg]{鞱Țۈ9$ccLi1}2C4Ș; 퉮i>ɘN-ca9 >/CX'i10!t쳦54Øvczb;}{޽wεʘn0ceL钱12_t̘*cdLiWGε͘(cdL鐱D/ZfLr~Sӌ12e:7c:2c::c:?c:gLߌ13k3g4Θ7ccL{5t.SCsA;iw}4q}1kY{Ȁ}_;QƵʸv-:e\q2Euȸ.*Zb\WkqM1zd<}kgjqm4ak\>z~}5Ayk볦O4uԸ\\g8cY;q3xe'O+?y=eq0#5Ÿ%)tq5Ǹfb\Oq~g85,8y>E# _<3ø^a\+kqm0Ƶ./rM#kq0ƹ>q֏3#r)Ƶø6y\ kЧ&8?q8Y=q^ϻkLg89Ǝgpz8{9;qƎswGCg8s:qst{~}|8Oǹ:W7qn3z #Ə3ߊ߳ N7}yni#}Ӄ{۟ߥ u߸zZo\kq7u޸wo kq7ݸwmBq=7܄>]zlB{Mh^;:C6c 6&tքNZZkBkMh 5&քGhBL|@c&ʄ.9:K:>(r]L m6&GE5#kzhBLh'E5ф~&cBwL莉>Ʉ6&dBLh 3SLh 2K&tʄ6&dBL ]2E&gX)eB{Lh M1)&4ńzbBOL艉/޻~ހ_ٯk&4ʄF"ZdBLh!׾j5}3o&ׇEzgBL 3u&΄֙:Zg":<gBL }3&Ø=ZgBLh 3u&΄֙:ZgBLh ]3q&̈́:eBL 2_&V\L =3O&Ʉ>"dBLh 2Qc&\k ߺ8~4`s҄CzhB+Mh M4&΄֙:ZgBLhmwj 4&~ 8Dο7rȹ_kBM 5c^zeBL 1 Lk57\īܫ&7&4įkwuįkg{ܛބ`&'8~3{7G|}wQ>}0F`B#LEhOCZa/?zaBL ]0&6 ]\/Lz_Bǽ>`RLc<bR7LI}0# ?,BZbRCLjGG?8dd}#obR7L ?.3` dRLI15&ƤΘ ac"O Ĥ?)r޻1&5ƤƘ":cRgL>#r;&5Ǥ|vi|jI1;&ǤƘbR_LI 0I&su-1&ĤF:aR#LjI0)&5¤FaIOr~/sUs0&u$'?I-0IO~$'Y?IO2~$'>IO2$'9?IO2~񓌟d$'ٯ&d$'?IOR?L>Ť $'Y>IO|<<3vd$c'0:SbJGL)0 ?)O=*3pM?lȵrCiGeJL)194ǔz̀쳮Q4ԇGGeJLi)m2[ɔ^(SdJL)]2KȔ#ScJ{L=5 SdJLi)179V\Li)2C4ǔ֘S:cJ[Li)}1-9/$SϞg}ѐ}EsX>g_<5ܔflSmJM)M6ɦtԋ#ۀ=mJMi)6SM)6SMi)6٦4ܔ~nSmJMioq7GN)iJM鿩>k}tߔ}SoJM)7#koJN-ww]3N#┖oSmJMi)6զڔVjSZmJMi)6ϦJ[SsZ{WYjE6qm}[=~-޷qmwoIn3yg2e;˔w),SYLy2}cʻCw2eʻԷG>x>ރMy3f;͔w xĔS+L)]=Syu7S:]f֮ӺuZNki-:E ?v{촞ְvCvZNki:_~֯uZN?q'puֶiݚ֭iݚ֭iݚ֧i=֣i=֣އYӹi=ֳi=ֳG5hZ{uiZgZiZ?kcnأiӚ6iӚ6iӺ2]4/:2z1z1Z13z1Is֏i֍i͘օi͘~f1)8910m'o&o&o&o&o&&,s:'!4PZ5PZ5PF4QZ5QZ5OZuQZuMZ5NZߤ_뚴I뚴I똴>I듴>IkFIk4!4lL3,Ͱ4#ӼI&ͦ4slIs'͝JygGw|iNYtiytkN:4ӼN:4ӼN:4ӬN3;4ӼNOnfvi>si>fti&fr&fRIi&YRKi.RKi.9|I%͗Ts=WYZGifPAiٓN9i9~}AiCifQ=iy~c5&1eS=~dDVdXK^dXaE3la f0Ä`1g80Ä1g1g7,sڿ[ os?Y>>1s{͡2?cIϽן6u!)?w3nF6f4ی83`N3iF3{ftόyZdS颙O :~jp}r~]5f4Ռ=3i"g > ?s}:h3kF|Nftǟ:r3:nF6f4c6e3sftΌΙ93mFh6fیvn3/rMhM7f+CnFh=7fXz7Eִ̝>qF78gtnnF78gtnэ3qF78:ֈ3qF#h8g4р3pf;t:օ3qF]8 gt.т3oF7s٣gN9s9 ї3rFShM9)g4LwzϺѠ3tF93gtΜў39Ѡ3?|m9-g匶і3rFG-9%g䌖ј3zrFO=9'g/Osh97g~%ԝ3sFsh8g>ђ3qF#Aoا#g~c}.ѥ3tF35fƌ֘3pFh19f4nj3cFs\Fe,f6˰Y2hc,f96˱YNβle,e,fY6˲YͲ}e\μY1˰YͲkG<,fy4=5`f?< 7C}Hg^g,KgY:Y>),g7ˤ٧7ɑOsjc,f5˳YnlW,f5˥YN2kB猚e_,f95˩YN2jQ|e,f3Ցk-tI_ڋkyWy^7˵Yos/ >Y7˸Y2nS,f4ˢYgG e,f3˟Y2˜Y2g9e,[f93˗Y̲e-\,Of1ԬQ|Y-5fuԬQjVCjٟG{Ud ثf5٬6eZkVsY5f֬ޚZ >٬\ZkVJpfu׬NT:hVjY-4f|jY=4fYHxTjV?Y4f"8[po YX{jY5fu׬]CdsmNi9M6t֜ΚYs:kn>< aӂs:oN974w;7ђsZrNKi99#t7pzsZoNik98ߜӕspNi9 8ts:pNi9 84zsoN974ߜӈs4d=7=gwQ~~ӯsuNg9}9 ✆ӌs:qnWνagjܹ7Fw]Gߥ4r5;y֝szw_k9}<&Y͛չYmճY=YMY]յY-՜Y=ՓY͙զY]ՕY]ՕY]ՕYՑYՑYՎYՎY͘yxjˬ~hdC">ѻ_fhVf5hVf5iVfhVf|jҬ&jҬFjĬ6ĬNjĬFjĬFjĬjj꼬꼬꼬꼬꼬꼬꼬꼬꼬jjjjjjj;7n }~޿{׮YݚlY-e9iYjY-RY-RY- 뮬jꙬ Y]5Y]5Y4YM8Y6Y]5Y]5Y]5Y]$Ҁ%;#9ȹꏬv\YYݑivgq}z$5#7z#Oz#7z#7z#C#9#9gMd5GVd5GVodFVodFVodFVkdFVkd5FVcd5FV_d>;[|B-7|O;|W5g~s֑Y\Y}]Yݕ]Yݕ]Yݕ]pׇܣz-ײ,*z'i(k&7`]eNVdN-}OVeQVd5NVd5MVdNVdNVe5pC:h^Ϳ{{{GA_ky:Eןs^wОDžD]{!׵4]{䀟}o~{޿Ϛ|^Ky]=uz^Wkֻ磇\뷮uN:}^y}>6z|^ƀ=7]{Gx~=îtC׽s?#tSEA{>yg{>3켞б׶vC:w^ky;q5sky;}׾w^ky;{5֝׺z{^{ߙ׼^y;u֝׹vEYz|%9~~|ϑ =~<㦟e߇wy={{3g޻ϼwy>}!=g޻ϼy;w{3f<>ޟ{3gѼwyHy{N3f;|uȵ!׼#{G3f޻ͼwy6y{~3f,a lX4E|<_4>Ãy ons{hpϣ=~~#{^pc\3 ?5âfX ZaQ+,jE !u"E.2v^>ן }jO J'?3tI{lkxýîߧ )C?O >3"OO:jQG-EuҢNZgӢ~Z|^s=ᵻ4עZT5֢ZXkQg-ϚZ^/pӻעZ_kQ-EעZ_ZkQk-jE֢ZL{ϊi/?[{nQ-f㻟ӡtu8ԃoQ-jE8`].\V\ԇzqQ#.jE 5\}ZpQ-jEݷޢ[|oQ-Eݷuޢv[nmQ-jE}٢6[fϽ}3tݢ\ԚxzMC|{Q|{]F ߧun^͋yQ3/j u⏄hE-*t5^ԋzzQK/j+8ՋzQW/_ E-^ˋzQ//EV^ʋZyQ#/ƃ>{~^_z}Q/E5^{Q/jE 5_jŷO/j >{።r>s=s=s1s3s:r/sZ+r:6rz+Gs+r+r+rz+s+1s+r<ڇ r,r->:.r,Yr:F9 V99 9͐ 9m69ݐ$9 {ƀu]9ݐ9999999>k! r r:!sL1=>q=r_u_}\q9s\q9sL195}8t9Nc~ѹd7 X ] 9؞u9V縝x9渚i9F174ZqȵBp}nsC oеaw9}9}9}9}9m9uBN#AN'4BN#4B9sLʱ7ǥr<)ǧr|)ǧr\7Ǧup-:rq=3s1,ǰr9VW9^cYa9V~Ztrζys 10Ǿrq/ǽr˱.Ǻ/^{9帗^{9ؗLwCk9W9XcUi7\ʱ+ǦrdTQ9F>k1&ǣgrq&Ǚgrq&Ǚrq)Ǚorɱ&ϙCUy乓N;y䙓gNcO?y乓ٔQGy?0dR-yK-yN?yows'ϙ䙐gB y&䙐gBP 7fzLϛ yC~ϛys?oy7!zvȵn}krk~u}w+l3*Ϭ9dc.Xb&Xx ן1K L- \,p |+|qhgbgbog[>{3Ϫ .p .0 .(—^x}X]tӅpZɀֵBA4AC냂>(h6(|SxX7tCA7tCA74CA;tCA7tCa&8 Z c PC k/p -iIK3}8ĩ%Ĩ%.-qiiqzoq~痆|GZr;ع%~.sK\bCX%F.1s gϞ,&/qxK^bx%/wK,^b{:c/}s%/qxK ^bO%^.rK?#{{߭%ҫ]~m-ҏyFȀ{߽G,x{tʒNY)KdI,%UtʒNY)K:e~Y3KfI,%-ct#ko˒~Y/KeI,%ݲ?%]k̒Y4K:dI,% 1?6_Y0KeI,%{s?FX+j(j(j(nz /2"Ë."'z#wcF{Q EP LJ?*8E}QEQ EP EP EP>뺡}ֵEQO9_|E=Qd}O(ꀢ(ꀢ(ꀢ(ꀢ(ꀢ(ꀢ("/"/#2^QEmQE}QE}QE Qůk(ꇢf(~]MdM{HQwuGQwuGQwuGQwuGQ[5E1k(ꉢ~(ꇢ(j(C=11/"Ӌ.rrE_dyE9^xl=梅EPwE^|E9^lDִBE^d{E^zE^dzE^yE6XdsE_|_hϷ Ccе}-2"O,r"+2ȼ"<,Ⱦ"+ȼ" ,v1+21㊯J<|u_s"L,2"'\," ,,{Cy:;,2"L- "l,",2"={x`L\f2e&.g>g2'9eV.? pQC[3e.s\1G9e.3s ]27'eV.sq\\2e.o[2̿e-3r \sFe..sq\\2̦e6-iMpY˼Z2y̶e.i:ǖ9̰e-3laϖY_|Z2ǖ9̩eF-2d21t̬ef-jOn-sk[ˬZf2o82̰e-k]Zf2ٵ̮ev-k]LYɲ0kA}Ne7knQ~ 7|g o~gD˚hktҲY7:eY,e=Wʲ^Y+ZfY,keͲ#5˺f;G|Y?gY,eϲY?gY,ke}o5ɲY%:gY,zo=g6&_sG{7 ὃ˖Vі5ڲF[hm!ٖ5ݲ>[g˺lY-?Q\-eͶϖ5ܲ^[qZmY-eײZ_kY-e>XyShV4׊Z\+fE߬}VՊZ@+iEhͳyV4ϊY9+:gEhuVΊY:+ZgEh}oVΊY8+gEhqVSO ΊY:+ZgEhuVʧΟZ8+gEsVtΊY9+:gEˬh-eV̊Y3+ZgEϬh [V4̊vY}ɀkgEhqV4ΊYyŀk/rCdȵ}jEWMVtԊZT+ZjEKVtԊZI+:iE'V4ҊFZ|*8\kmVtՊZU+sVt֊Zbe)rV V VX©u6h0m+\[9]p{+[ V½lc+[؊~Z V8-}n FQ5ʞL_a WX'W8px+^ W~8t y+\^ʏ"tVz姃Onh+LZ V~V«^jW+Z Vش¡iK+:s;J;J(i( %Q%Q%-QZaV)i(i(i(i(i(i~(1#K,'K>KZy'^ƀϧJ{y^ZJZJZJ:J:JJZ#{ZIϕ4ZItZI4YI4YItYIXIw~6tJ:J:J:J:J:JZJJZJZJJJJ:JJJJmJ:Jok6*б)陒)i)ҿE/uHY5HY5HY\{Hk\{tKY_uCY9_fwe&\fwe.\re&?$X{\de^y]qeZfoe~Ygev9'S2[l-Cnj-32cˌ-32cˌ-2O<-2O<-2O<-2O<-2KL-2O<-2S,2;,s2?,2?,2?,s27,2\,s2˱CI y[oeZfmeƖ[ke~YfdeO^fheZgesl˲W6f\ٌ+qe3ln9Q6\eBfil.ViIJyX6a2tl6ƲX6c٬+uel֕͹w]ټ+meslͽW6fe+we3cW6f_+}elޕͻyW6f`+b+}el;W6^ ,{el;W~c YX6 fa,,el²9X6o $f6X6e3}el6ƲX6a|,e3VͷՇܪj֭ufݪYjFwݪYj֭>"tl{fުGY\\5WUsq\5WU3pByjyjyjέqf9jέf#ߪj>=8~jh \5WU3p \5WU3p \5WU3p \5WU3p \5WU3p[5VͽUso[5V<7\!׾`uul]5SWUt]5CWU3t ]5kW_4 nXȺyjëׄUsy\^5WUsy\^5'WTp߽nBUu|]5_WUzՌ]5cWUu|] 몙jޞ|=}"kK}Σ#fjfjYj7[}{9ǪU>jO|Z= >9ʧUN2j:*VʧU>iO|ZYc*VʬU^jWZ*VyʫU^jWZe*V9y?z&VٷʾUo}[ekC[e*Vy:3W_l\*W-8f*Wۡc6q\\*WU.rq\*W9U2oy[e*V>?L2t ]e*CWU2tg'C/;׸5nLjK{x5֮was1w}OtQ'W׸5sk]{l䜹k qvk]kغֵ>"ػ5wk]g׸5qukl]{-yF5Vzk^5F1z\cs|k]>/5q|k,^X5yK3xk^c[غ5uK"k]cSט5fq-vuή} ׿_sr7;gk_k_״x&Xk`Mil\i5}k_c׸5Nqzakư=S=[=|]ظ56q:+vܷ;侽!j5f1{k^cX5qxk\U=9=|sh85q|k _cW Xgט5~k_ؾ5f1{k^c5~.X5vjk ]cG8"k_cg1xk ^c51xO1~k_cט5quk\]W׸L]YuƮ[]Cǽ3w]:kٻG]g:kYu?*uήw]g?hzo^:Cٸ'Y{J5n|?~Za}9r+uźXбX `}'d:us|'u5v2ZskuN|^g:Yu3{^g:yu6]C׿o=k_g:uίs}_Yu3_gk볮ֵBz`]]ku Yֹu)X轿9:a]'u}>X{)5ź^X za/#oyE":~K^UֵʺVY*Ze]ϺO ͲS6CBǺeCl<4tS6tʆN(dClh =S64Ɇ&$:eClh }%6Ćzb`7{opG 6j - vo{9g7X o| ]5'OO'pZbCKlh -cCcl }/6gE4džzcCglh 56t#zbC;l ݰ6tÆn _:䚦bCKlh 6K"/k m-6ņZbCCl0zCSlh fozCKl0{lHǃOo0{7ؽ nop{#:_ γufo|+ȵy1 o`7 no\8w+w'x6V<}~a{zϪ =z{C{n{=wnF}{/:hClh k6t͆5fCl蚍kzgCl蝍o k ݳ{6tφV*ZeClh }W6̆f,eCl }K6Ȇn$ =U6ʆ+zeCl Q6^wfCl =5d㷃 k O6Ɇ>dBǚcCslh ͱ96Ȇ`v cCwlh^-6Æ~aC#lh 6{} =aS3lMݰ65æf|=}twMn9ž09}zhSSljMMI6Y:dSlMC6uȦ!hSlj͏ ?:8$dSlMC6uƦ &75&7Mor}뛟ZgEukMod煎u:`Sl258~\'l>/Mor:`d&7ٿMor| |qhk_Zid_}^Y{Y5ݰ65æfwO6æf ZaS#laS7ljM65æF`3:|f.t'7əMldžf%8_3iLڬYɲMNm2|&6ٵɮMvmk]&6ɦM6mrkOLd&69gۿytI-rg;+w56Ʀa"?:}M}/6ŦbS_lM6¦^ zaS/lM6¦F `7}]Ͼnn]6u˦f*:f4̦/zdSlM=G6Ȧр1{uΦ9o kMͳw6˦v.>>Z^%md=4{=t[eK_li-w]([zdK{li-?ǖ[cKsl=.![:dKli- 9tȖ![cKwl-5tǖ![?Ϻ#[ZbKSl鑭OΟJp>kψ=;rMȖ6ZdKl-U4˖v0[22[fKl霭ZgKl-ݲ_t̖5[Ϗ\>5͖zApXsli-gtϖ3[:dKlmɖ6$[dKl-'tŖ[cKli-[˖ي Glo/wߕr-ƻionğp{L -4ؖ.j[Ֆnk[mKm-Rjoq6?MeKl閭z\li-=a̖q[hKli-a̖f5[fKlioq6[kg-|nY[ziW" E }϶4ԖQ[jKom-}~=wg-ѶEuՖVL[iKOmi-m֖Fsӳ{ؖ&f[38hCUtRE/UtSE?UtTEWUWEgUVEU\EU^EUz ^z{\;V:}}w ?VE'TtBE'Tt]EUtkEUtDQQ:QQ#MSپa蘊x蔊6hN4nQ~GV Qй>4#כwkƩhƩhed*X4MSGVHTbS?S=TQ S'}R'}R'R7Q!=R%}RR uAO}P]QPQ9+z'+s +:*Z*< +,e=}w钊ި0 S+L0 +p +=zp3 f6W9́m_ W+->Mq5ζ6h[mkmݳmmo}|&b{'Lf6÷_Ƕcg݌uos=]q~-?Ƕc[lm}5gwZe[lkm[/oϚn/Zf[lkmuζ/e[l:t-:f[lkmu>ru7\{#wk=i[/mkZi[lmccu̶62ۿ9s=f[_maXmkm_5ضd|mk^hmʹ5Ӷf^ UPIUTIU]!{~3>3tJo!WUoURUU5\UkU5^UUUU3U5Po\r*\ꨪf2*۫2G[*߫|j.ꂪ.j6ꉪjfjfjf9cPUPUMPU=PUW_UVUYQeE)UTRU+UTReQEUFVYeU~VYZehUV[erU?TEU>W\sU>WuFUMPtUmP)UmR.ǟ~|Q~(?׿v~ho?Q{ǿ3aUUUU'U&U&U&U.U.U.U9U9U4U6U:UBUBgйwȪƪwªwªĪĪĪO#  ?|5coUoUtUsUxUx_pݭݮ]]꽬=ݮбwFos=]}}]==]꽰=]G}?> aɃyt|ߙ;WwxWλw;;޵w'x>=y{@/-5s59zλ yߧ7<?ۃg܇G?]9g =y?BGx>ʟ#0>ԟ烃}3'#|q<ٟOI|Bpsl>ӟ >ݟOSy?<ݟT>ş<}' ?__񎳣w4ј;sGcCaGWT}pG?h1wtѝ;ZtGhmwfp{({}z}GSwt;:xGhݻw}Zy`,-#7<'n~wyo;~' ^;~GhwtN;:~GhmwίF~-X;{G;:xG裝? hvԎS;zjGh]Ý^Si s]=rȹz;oGh]]6gYIv6=} ?2tYv5®~Ua?:89kwY] v]2w˻wZ`.w9ˡ]2oye.w?!{>1!yR𜧏Y#.Owy]rvӻe.wٹύ3se./vy˭]nrf<.w]~ـL}k}}ɐ/axG[|}Wl.w]~zѻe.w9]Fr{Żl.wyݙѻ1w]>Njq!Xg.w]F2zk}ؾ5M5wY]r~׀.w9]r{W]2oy=sole.'w;ZC{{e.w.wwYm}ֿw˥].riK9.v0.w]6Аurmke.v9˶]nu?\ .wy]6t C1r7G9\}Sdo xwoϬvٽ]Qû.Ow]2~e.wx=Ih>?o=\w>=s^]מ&`F^u;Ktמh{lOi= >{gf{zmOi=Mܞg{lOi=MuݶtڞFf{zmO=՞v={gO=-C㧆ўT{:oOi=>mrM7==֞^{kO=m_O͵ 4&R{:aOSi=m՞I{a+_:{:aO7i=-%Ş{:eO+} {&~-2x> 9>W ݹg~yQ"ܛ.M{_g.{oO= #kӑ}qO'i=]fOݸt&ӈ{Zo|=tݞx{pO;i=]4vy{:oOi=WpM5ܰ/g/ޱNӉ{rO_=}tFӎ{rOci=͸!➞m{zoO=ݷ 5w -sA냾w{Gx/5 Ҟ.ӎ{sO=}>Ӈ{uOi=ͺmힶ{g|'?NY>?r={{O{n4{)4U{mO[i=՞V{jOo?p{=ثwk~Y`=O'=^|'{ÿǰߡWWtxMtxM׾pYn5]^5 ^5}^/ Vi.iߚiN6iiiiiiˆs5=Wy5MXӑ5=[Ӓ5\Ӄ5XйFi^鸚iƫiš.iZ_r=3k}{y=~Q;l̐ ~`OSִoMtn͠iКfi֚iϚViךFiӚ6 ]׷5][ӭ5Zӭ5-[Ӳ5ZӮ5ZӸ5Vӡ5ZӶ5WӤ5Ww5}Ww5}WӅ5Wӏ5v]v5R?5mUӇ5=T54G5_cM Դ@5P5P 5P'5=Q5=QMtFM^99k邚.邚.邚foO_ԘTcRI5nոUVy5v:jƻjk<ƯZ-ՙ? {~,c[EuUgYeuVgVYw:^{uvWgYi β: sζ:<ζ:,ί:ꬫ3δ:unRgR}unV7fx u:\u_X3OyXCON]7xݬu6y\7q=XRK N58`VI N5`To0a78`KE v4`G v4`FnCŐ0 h0hpgi_|i[liƋ36xKF|f3|f3W9o̗>gowߧg}}x栿Qakhk訆jhj,5WCs54WC75tS:e ]U ^ \ 6#뽽[5mV ]e ]e ]e P5tYC5tYcr l =dV\5[C5Y: Yn Mj \c54VC5\C5wk~k跆j讆khNkh>k賆>kh? ?9׉ Ј y u>k轆kƯG5[C5`C5~38t Ђ7ZC5[C5t\Ck5t]C#54SC_5tSC75TC#54QCS5QC'5RC754M4ڪq{:44Ѿv+:j_k}MIu˾ :b_Gk}/ǾFc_k} az{ݯggϹ?#wqгn{{̇g3½0=ޚ};{/b߻žw} A{'=b{ľ};{WjpY}{neɾ}'cnu7#{W=f̾Y/w}8_=d˃kz׾џ <㹑gDy ||;Ͼ}Wޯ6לž٫9n~Ã;:x__k}i5״v_k}k}]M7;=~gz@=s/ǁf9':о/GG|{w>^=u]4Ɂ8`s{0!}~?{`f>03>0,?0&t|:tn,8`3l?0`)tn~`3?0,?0>0>`?'z/xq~p88p 8`3L>0s88pp;F{˅.<~S8rp]:`v!C:^;W~נ{~:rϯx{y[у7~_ =?9h0>`Qs{e3}<^>ߧ}٫1Á~08@CpC#kPjC?N8|tu]po޳4\P;㇜?!?"C\й~8OsPjCpC2O |2i1wCC2PC~a=y΀gϼ1PoCjC=p8ZP~ɐ}/~y7;jZPjC}wk:ڷ}C]ӖP[jC-tuСkPC-sIuơ879oY5ҡ:9P?s\/jCq#u¡8?yCMp8 GZP j^ Cpe_xy#1GϚ>GH7# }{F>zvpiO#zutn=ҤG:H#z[k#mxܑ;{^|y#EFyztW_զGH#=| #_!#{>GH#={{QϚv=ҮGZH#]{66`M#{ >ꑞ=ҳGHiڣZn \GZH i#-|Tt呮<ҕGZHomo4>>GHsYӥG>Hգȹ9҆Gg=҇GH7#xt呮<ҕGH#x;t><ҐGHC#]y147\>?|M#zW<ҟGZH#zc} Fk#={stn=ҲG 18׾GC{zkH#}z_~=үGH#z;|j#mzGt=ңGZHqpgsmzSt=ҩG:H#y^j#zUV=ҩG:Hc\Cc3>~9}cV>1~9yε±N9 ZXKc{8f1Cz=zC=f1ߏ?.tcV=f1k{ɑu?}g XO׸~c\?1C9tcsq[:fsOs;1wxxǚu,<1׎_%'Ywcu;f1 w̵css|;q1gyc&<^ {;19ycV=FDG;w ~ذ;f1o|c6Ǽ=n>1|c>3=f1|cVsnjf1y~̾l<1xcsǯ >w̾clnp'ksa[g O8|p'L> _Ox{ؓDŽYz0'= /O{ܓ >2t䉡 3ꄭ'L=aE>!Xc N{¸<-ƽgY{zgY KO{f0'<< Oz|= 7Ozfg'<; NXx'<< Oxxn%݇!{(sy|p'>a N8s£֜5'<: O|np'? Ox|vp$9gInZ&> |x!+'\9 Ox.l7Nu¹T#l;a sNs£Q':1Nu¯֝pA'L:i: N8t¡0a' ; wNu¡=',: NrŸ|p}~$ƪ9'<:a Nxu¥\sC>nxOqh&ڠ&ߛloꅦhgsǟ~>}FhjiꞦijjjjꦦnjꦦnjjhjhjhjhjhjFi B皥K߻GzS:Z\s45GSs45GS4nijniꖦniꖦi&kiꌦhꑦFij6jj6jꚦhjhj\d}>^0`hꔦij&ijis )M*M]'M="M-%MM-!M](ZAkڤi7JS4uIS4GS4uKS45JS45JS45JS4IS4uJS45FSw4uFS[4FSk45FSo4KS45KS4s{_u:Z ZW:i>뚢끦hꁦh&;:#:#C댦NhꄦhjCkZM=M= M MM]M]!e)kOY{Ss ?5Opj~JiΟfʀS|8e)OqʐS2Ԝ?Ӽ?5OYpʂS)7NqʍSnrf)Npj柚ߧY~j #Y~j'~>5OSs<>5OSԼ>5Oo ]^ci2X7OCD띛9jΟ8)NS|=5WOS3 >5OS>5OSt>ri9qWe)O9SƟ2:Tywޏ;a?TߜS}soNͩ:ipMCȐkSzTOjSuV:A:T3SuN5өf:>7ݯNuة:Xotө>;`TjS vyNթ:Bw 8ctNթ:WzTcjSuNui4٩:Xcӿ?S}t#uO7\{ȐkZLWiw֙:QgLWi3u{Gi3u4ؙ:^gzLi3uδهOuי:_gL=q5vi'Ξ4`]ǝ}kLӝ=yȞGiij;~gZLógXV^ӖgZL73my)tn<Ӓgkɳ5-y)噾<ӚgLO3my~<ӏg:L_}yk_5ڽе+ X޺=>g/szk賦4f>gLi3{=gzL'3}{o=ӿgL޻fOm|w<Ӳg:L{3rtәF9Ӿg:Li3-veδv:4gLӜp]ۜi3msδՙF:Hg錝g!Й:CgOϸz3ƞL7qg>c8}3Ξqg|;Ͼ=sg\=3ѽuo8pϽs ;=gL@gj3=ryϙ9(gZLϜ3rkyx9ȾkLǜjpXϜi3-scΙ9>ZLi>̙v9$gL˜i3 t]δ˙v9.gL3}sot˙9X˜zL鎳#r/s=Z\Dε˹^9z\sk\srUεʹ9Ț.9*z\ksrCεɹ&9'|r?88-=!Yεɹ8z?Jε¹8zskss?g9Ϲs,?9Y~s>gs/=;9ιyo+u3L<9y7Yzs>oYzsSp;9xs'#k>{x{s3ݟϘ ݸŽ~A7\7s rA5ƹ8\sr_˹~9vz\לssuuϹyuywtλsޝwZ\s\g9ϙ|_ >__ >Y|_ s|L>g99|sVs=g9{ϙ|}ɀ?2L?9Ϲs֟s=9s}9=5=psXYZLoq[{p[oq[ o'[|o[loq[o[\o11[oq[\o[o1[loq[n1ӂcbz-vXby-x-?Ga|-:CcַX~-8z~K"纠[o1[/[o1KCk5}־[o|oh鄖6hq[oCkc!k{웊-fVKOxYa-b]u-VxXc-8b]u-ֵXb] >[2[hŕ3Zh1Ō-fbK]-vbW]-vbW}-~W_>-lŻ{ZiqřgZij:SZ;r١{٫.4х6M:B/] -sw.υ.BZrK\^BO] su.tӅnxA~tWFͅf8BS] s.хf=zBo\h q7.tȅ@B]h t.=4B7]hX\ rW.4ͅ3ZB\ ]re.Ʌ>;E憽}5{w-lwa.˅vvzk s.4υCzB] t.҅^Rg֚5\h v.م6fz:.܅VBC]h u.ׅ u.ՅOzBw] u}Y:B] u.؅hB]h v.4مbZ}5oF~Ϛ><:B\ ]rQ.4ʅn B\ =sI.4ȅ :2Bs\菋 6tkk^#A\#tQښ)ښ)ot__hik6ikViW5])Ǐ Z k{>m|6ln66m3ڏ?&t6O }|Bns6s|ms6,o6\l6+۬l36'ۜls6OLks͹6ڜk3|l36G۬l6ڬkͶ6lks͵6\k6|kͶ6lk͠6ڼk3ͨ6ڌj3ƴ6|k3ͮY6j3ͮ6kYfGommv6ftnmsmy657Ӯ[F:;{fDmnHo3͐6#\h͏6;t{,Π6?ڬi͞6oli3͑6G@7fI3z>kd%;.KY~ɇ?,8DL4/ypɈK3Ҍ4/Kd%#.?duv\|>6\̸dGg|4/YpɇK~\2G#ILd%.Y%k.9səK]2K\%W.rnwDqK\d%.vɬKf]2ad%.vɧK>]/ss%._:f˂O]q\d%.uɭKn]u%.YvɲK]I\ >O]2a%.9uɨKF]2cbpΠbɹK\K|%.sɦK\Y賯/YvɦK^Ul|d%.uy8`aYv]'/YvɼK]B9/9rɑK]G;ܹd%.uɥK.]|5csҜ4/uɪ_\%._YgEvɵ_3aYg%.7ΟK\)ΦK]2͑kGt:.wɛKV]29eϝYld%.{m~%8vŴ+]qBky>^1Wlb17Woxsš+]q늁Wzj˕e_WŇ+&]1IWXpń+\q3WXv}tř+\-WLbSqŚ+\}ŀuf\q+W\9pŒ+\)W|w^C/W btŠ:Xsŝ+]KW|7\p}j5^1YWldm.rkWLbtş+.]1sW {8xޞ{wź+^W jYw/Ʒ+&^1WL:Y?ន}wy^c +f^19gozŞ+6]犝Wlbxy+^Wܽb{}+N_}|ӳX~8~+^_qWbW:J\h|y}z/ߧ+]q;•бWJ?\+p 4vWኹW̿xWor]o\uȵAОgWJ;\ii+-Y=pkqO}H]"k:#::):Z5:λsޚ莎ÃGtKGtHGt4BG7ttBG;tHGt3Zo]tEG{tFGtCGWtMGWttEGWtDGOtDGOttGGOtCG?tC#k:::z!: >DSO -'9 =-Ț胎<5m mmwMya5 Wڡ.hh6h6h6谻>Cvwawg"r;Z:p;;l:찷N1 龙w}|Qk{Ig=(]>j5:ڣ|꒎F;ڤs|C1;Lp:::=:%::9o~ {OC?è:?U;CkGttAGt'd]qu4AGttEGWttEGWttEG+tabfvafvkvaywtFv8fvacvvaivRKvFd5uŴ ;0[;\p;\_u:=8_w]uSO]ueXK݇Ǽ격˦#"r˩.,벬˧. ˧.|~HO]>u12ˬ}l5uyeYǟƭ.Ӻk\첲.2˷Yg_{]&vby]ue^]vyYs]u}AƿWE_2`]&v`]ve_]Fvyb]v9e^y]ued}]ud].sskNw5ûfz7|]t K<2k~wY5߻{|]3kwͬ5fbL욉]3k&vĮY5ϻy]3kw9B ݽ7خ]nt5j׌횭]^t鮹5h ]skv 욭]3k6wܮ5?\7WaOgG8{k^sf5y|k^nd f5WY{k__gu:Y}k&_3׌WYc#|f5ǯ|k_3\w 1}k^sל59}k_s:vTf5篳c_׋1ϯ9~k_3Lf5˯Y6ӯ~:5?ȹf5w{]{k&_f5ϯ[`Ztyh$X׼6x Ⱥ:Z\kpY5?9]Upk^Z+\D?:Oܾf5o;>u?u-{{.qvq=Ik;qwkKEB@H !@-;v\Σ{Ƽ@h||xǀ9ڿ;e~2YF?g,z{.0q |\»[`~-ki L[`XЅ~.s |\§qs \XF.pe Z`8..0spq&`?~.pt \8V.0p l\`xv.0t <\8-0m <\3طC}صi?e'GgS~w܅ >Y.9{.px ,\X-ص_ گ<7u.?;cOk]`8`(.0w ^`Oؼ&/pvaud RSckݯMXOOX ^`/d&秬Mv.s \؟Ӆ k]6.q ]tF.0r ]W.w L^`g8N.r 3t \]3mdKE>.rr\"{3a=3qu&/rx]d"E.2u]"k_m=]"kYȼE-2ro\ͱMxάglu~/2~_"E~/r{ߋ^d"ٽE6.2q[">#>jq͸s^']^<Ṝ^|Ќk8ڇ̸s^ wO ?vo&ا?n=zhQ-E?'8s]yuɢ>Y)zeQ,jE=k͢Y.eQ,/sߓ}LʹѢNZLiOҢNZHiMY`;5]GEݲk5̢Y3zh?θ3}߄u ܢZNiQ-EuТ&ZS#-|ѢNZ:cQ,EGuNY3hQ,jEgu͢~Y/e:fQ,EW5¢VX S,EguɢX[4XθsSOy&Y zaQ,kE5ȹ&YaQC,jEM-5ƢXc>vK5ĢXbQK,jE;/sˢY5fQ,?}{9;zߟ<9M5ݢ[unQ-jſ9_[c{t}i3WzfI-%Ötؒ[`K4r n[dKlI-%]ŔkzlI-i%-4ؒ6ZeKlI#-i%tϒY=KgI,%utΒZAKo;ϒY=KgI,iw{zh=sq̒.YKcI,i% 9>b%.xK]ҧ}J>%.}5&/1yK<^K_qKO.1uK\b+jWOXcO%.1uK\]Oع%.}kp%..qqKl\8Ļ%-1omKl[bۖضĽ%-mmKl[k?2v%.1pK[ľ%-qo{K[bĸ%-Ɯ9%^.rK\'~w9%~.sKu.tKL]bS%.m?KL\b#yL^b%.eٻ%.ű9%/qxK^%.wK,YbXĂ%,1k1KWތ6q} יĜ%,1g9KYwĝ%,UOß%,g?K\Zb̞e,g=ˬYf50T_c2Y̤e&-3iILZfkkOlZ2`df{^{½=;}k|\2e>.q|\29q|\2qFΙ.:3y k䜟\2?ٹe~.3s/e>.q>vc9ve.t\f2;ye~.ql\2K?k97eV.s˼\2'e.3p \fNX2~ʵL5:G9e.st,]f2;ٹo0re._e.v˼]f2Sye.st[%Xc2 Ye.p,\f2 Ye.p,\f2 Ye.oy[f2󖙷̸e-m9/n1ˌYf2c̘e,3fy˜Yf2c̘e,3e)˼Xޜp=\ߛr}hQˌZf2̥e.-siK\Z2Y̥e-hG-kE,ZzC9Ae[2ǖR9a愹=;rK{ayYeayfYea9Xc;Zkaia~f\maXca9YoafZiafZiafZiaVYZWa^yUkaffVYa9lN6sa:l·yfEMߛ:c{|a=6{|a=l6{8ykl!̆0l!̆0l!̆0l!̆0L!̅0\s!̅0\s!̅0\s!̄p#83"̇0­aNfC a6)׮&s&̘0c\ s%̕k4aO&5.RGayKIaƄfL1ɟ0&˜c"0&˜c"0&˜c"|#–C"Fp̓O"<$“O"و1_#_1r1w#flČ|׍s7bFۈw߈1#o̍38bGwƞsxΓ}wM>Op"‰'"p"‰'"p"‰'"p"‰'"!†/"?Lɋ/"0#‹/"p"bGX DxaAD8 kl!†"l!bG C3>bG1#1#f~̏3?bG1#f~̏3?bG1#f~̏3?bG1#|Čs=bGH'֘r>e܏3;bFؚy鍭^Dn鈹aBd89 nDCOO.D8@Ĝs>bG91W3~ŌO+fb+bرbƯ+fپb+yb^+[g]{?y5^wk'}=&=3˵5aV8¹0no+Z Vx°fjS+Za V¨F|{!]O?; W0t+ ]a CW>*+,]a KWn|҄5t+,]a KWXt+,]a KWXpt勃O0u+,]'GWf0s+_=0t+\aʷs{+LZa V¥.piK+\Za V§6Q+|Z V¦&0iI+,Za V¯x`Ϗ?pg+<[ Vx³lg+ [ V~;8_9c{ǜ[ V8¹ƭ0nw+[1$WΙºmm+l[a Vض¶mm+l[a Vض¶mm+l[a Vض¶pm2r̸&l[+35f\ȵv9\ 7WN0p+\[a V³ƭ0nk+<[a Vx¸r+<] W»ޭnw+[ s=e\qQEe\ǎy]wQEe\qQEe\qQE9}QD_'8I Q3=jG95ǣxQ=jGy5ϣyjG5ۣQs=jG?d}">s<QFDeC Q6DeCQD( 2 ʀ5ϛӞ{eK>yg~F?y8dQFFedQ.Febߎ31(r1(~sp ckl2(|1]w2(+22~kr4(?3(C r2(r0(r0/31(<0k3q1( 20(;|NSkoO(gr6(S5(W {bsNس<;(쎲;(r;h&8fxQ~GwQ~GwQ>FcQFFewQFyeѣ|<>d/磜=d~QGy}QGoOGF>QGQGQGQGgb?c̏1?ciN鄘N鄘N鄘N鄘.i6酘>郘>郘>郘>i.{c썱7&y{)뜎q:cq:ػ:wc=n#l1=c܍q7wc܍q7wc|}p!'cq8c 18Ǎk&ƛob&ƛb̉1'ƛobq&ƙcb9r_/x:b_4rg|i X[g1XcZg1xY_1~W_1~WO1~ŘTa1nxRK1fRO>cSM16 k*ƫb*ƫb*ƫbq&ƙcb)Ư/s'Ƭ{b|$ƚ;b"Ɗ+b"Ɗ+bf| 1s_f33}=nָ7[fklq5n.׸7_6rlٸ97glܜqs6nٸ97glܜq4nvθ77l쌿}o1cϛ>,s8n7_iu7n3q3;ny7frLq39n&丙7q,q8nظ7_fsldpԄ}7fslq9n67cfl܌q2n/>۸7#fd܌q5n.ָ`KmpU#W0p q38nǿeLq8nY7pq37c7ft܌q3:nF7ft܌q3:nF7ft܌q8n/MX k2aW'q=n7|lq=n7z\)}ܼq>ny7}ܼq>ny7}ܼq>ny7}ܼq>ny7v܌q;nNn8 |/Fj؜YṕKGȱY7s~{glH =a'ٞ0f{lO =a'y0fzLO 3=a'􄙞0fzLO 3=a'Y0fq,N 8a'Y0o7ی\3wnM s7aV'݄0{nM s7~#yxylO?}0v߼q^$8H V$XAcs"'2aSyM7 $xM7 $xM7 $xM7 $`L- $>wl7 $8K f$X`E# ^$ؒ`FM n$F n$F N$8DO|`I F$C >$C >$C >$C >$`D F$`D F$`D &$0-X5>a'y0f|O 3?a'y0zO s=a'0z"4ePI s>a'􄙞0 H0 a'ք=))ؑ`G v$ؑ`G v$ؑ`G v$ؑF cN$8D N$8D =a'9owF'0,H s>a'=ϸ79Y*'VʈUF2bX}`=#X*3Vckbl+rՂcf3Y*_VʌUf̈́=o4筧p'|=g3~?|xūZ;o?αշ]))eesu:WYU֮v]e*kW{}\^*WUs\e*;WYUx]*?WٹUvs\*7W?侧g>%sSg|>닞⻾ O~#>4ǪXbU_U}/VŪXbUOUVªVX ZaU+jUV)y=d[⻾)/qS jU-V5ЪZ@?fZLiU/UVҪ^ZKziU/UmV5Ӫ6ZS7UVuҪNZI:iU'UVѪ6Z@hUUV5*4W5#.٫VժVZMkUVҪ.ZEhUU]VuѪ.ZEhUU]VuѪZ>gUOX;V;kUMVԪZmiU7jUVӪvZNiU;UwVqpVh&ZB|EVѪ6ZFhUȱFZH?3kgM#i5 4КZ@khM5ݳitΚY2kgM۬^skL^cxؼכrMˬ4̚Zc[U_ט5qsk<]cx5>qk|\#Ǭ\c+ظ5.}5V}̔ufvk\5r}G?~OgriKk\ZckXƚ5f7kYKטƜ51g9kZLX֘Ƥ5&hEk,ZcXƪr;kYcšfƯk=Xc3֘ƌ5V„S_''â ƥ5qiGkcZ'wZmsv0Ny}I8Vy:v~6r|>kƮ1|k^3|k2v?ӱ_c:8nkgOr?$Or?$Or?$Or?$瓜O=Z#: $˓np$Ǔ O2<$Ó O2>$Nr;$N2:$lNr9$,N8?sk³8|s7Yo/i;ywͺ1];?I:I@Yб=Z(z-Z*ђ)(((((((:(((4QR/%RR%QGPR%PFuQR%uQR%uQR%uQR%uQR%uQR%uQR%uQR%uQR%uQR%HR$HR$HR$HR$GRc$5CR$5@R$BR$ّ=Z!؞ro?<&OMsOsgOk%VR_%VRc%5VRc%5VRc%uURc%UR[%URS%URW%5URS%OmVI=VI=RISIݔMIݔFRK%SR7%SR;%SR;%5SR?%uSR7%uSR7%DI'QI8I-RI'Y&I^'qI&oR%l9eIj$㓍Y}f|:smFWgh.Ij]A#3"'z"'$1"'z"!?ߌ]{_:>i=GȺY#=_fʺ~Y.e]ȹY1:f]Ǭu_ֵ˺^Y+e]uWʺ^Y+ze]gSsg_9̺Y3^g:׹ٽ͸6>muͰumuku 5X:`]s~l_g:پu؄_>p!3Xb]SkuM)IZc]gku;5ǺXb]Gu}55ƺXzb]Ou}#uĺvX `]kum u&X99wW})xOgKiNNiԫ.L”.LkMX{ k=v'Sz4)So4r-S2-S2-S4/S2/S2S1%SoŔ^LŔ^LŔ^LŔ^LŔ^LŔ^LŔ^LŔ^LŔ^LiŔK”vK鿔~Kx5mu)]ҕ)m~)}p)}9hKiKiԧǚ/R:/R/Rz/Rz/R:/R:/R:/R_\׿`5|)M)[)%HivHiI頔HiH鈔H鈔JiJ鉔HiHiH銔H銔H銔HiH鉔HԏLY9HJHJHgOM$)M$)M)m)M!)})=))))m)}))]JpH鎔HuHJcO4IJǎIJIJ8L3)Τ8L3)ΤZql=)ؓbOJؙbPA)v8)XbQE)XN;)ؓbO=)ؓbO5)֤XbO7?=p}5V8Yg)^s6eަ۔y2oS֜̆an zananfYanfx x<07 w07ߍ5e&9aNo[Ncofaofa~oedߋ|6x l`faofa~ofƿs^};ޏ~};oe6>p0y}Ty?9#~.opy\7 &o0yL`MY7>d17 o0x `7x nul>p}2{;z36dʺ&$ןuʆN):eCl S6tʆN):eCl I64ɆzcCol 76Ɔ:cύع"ZdClȧ&$dCl葍 +8&dClh mM6Ɇ6&zdCl G6ȆbCClh m56ScccC6rq68#zdCl =6qydMl菍R~|Gu}O6Ɇ#zdCl =G6tˆf8 >5̆F(eClh Q64ʆ!zbCol ]cC{lh 364Ɔ:cCglՄ5=6G9GZwuGZwuGZ/uGZ/k?|p]SDZODZODZOD5֟iHkHkHkH뉴vHkvHk~H내.Hk&H'o1r1:!4O?4Os?4Os<4KӌLs$͇>OϚwyg*eidifd yfeiF&)7coioifmi֦iilijid:ҼJ3)͝4wJ3&͟43H3#͌43H3#͌43Js1͎$͒4K,I$͒4K,I$͒4K,I$͒4K,Ixɔ4OmƧ6ӆizo[f ~?r;㿳Hמwtkν']%]z%W%Wz%Wz%Wu--iݒ-iݒ-iݒ?g6˦6&dSljMO6ɦ(eSljM-Q6Ȧ!dcMI65ɦ&$dSljM=K65ɦcSljM76u&7Mn|L|znؾwM6oryǛ<|9;ݛ8v;==}ϋ's~5bSSljM]+6uƦ.`SlMͰ 66`SljMm 6ug9s<~bScljMm-6uĦbS[lM#6uĦ`߿GglM}/6ŦbSOl~Gg`7맸MnruSl2|l&W7Mvnrud&77?x=k=) yipMgg.3[bؿ-o~yݰ2s`>wb+=9eUG&[gKli-}ϖ>[gKli-}ϖ>[gKl9󷘿x#G[hKmEOؖNI[:iK'm--ؖVJ[ZiK+mi-#-M4ՖT[gKSm霭ڔu}ϖ:[ZgK'm-ͳu4Ζ`pƾ9 ן>՘7 ~CӞ7wۖ[[r뾹4}S^}7?gm=?g{7]#|w}{/cϱSLX׻zw[ omݻuuFtۚn[mkmM5ݶmݹ5Nրۚn[nkmM{u϶ k:h[mty5϶<ۚh[lb𩥶)8A:h[lm5om5ж^{l҄{'Gim-ԶS:j[Gmm 5عTۚj[Sma['mmuҶNI:i['mmҶNCzh[mm=ж.nι-[y ۚe[klm#uĶvMzb{8>tƶ|Zc[mm-پym&o3y۬| klf6-1vXN0{;awXv絃W[{Ցsp|;aw&0yMkkw^s{-8VSfd-&mp};|wp~;aw~{; }50~;\w|t6y;aw>~:wÿ^r;Xy\>;_4>ne;v8Ü0f1;acvpf3;gv8|&vصç>0hA; avÚf5;gv/9<##<;`G]}ca;Law^z;aw8s7;<wwxp};\w"Xp};\IMp';|;8;`G-9;`G~;gw8|owxv;igw;awzcs>y;|w>y;|wX❿>p{;at晑cVgXatFyau6rvg؝aw.gXax>gsFgsg 30<̛s9 30: 3p8 3z5Fg4gazgmGy}gXaygygxygxygavng)~SwꃌN9 3|9 3:!20? 30; 30; 30; 3\4 O3<4 O3\|]G9|V[neL3daMgeXaYe9ZkVfؖa[meؖa[Weazvf3L̰.ç 3ʰ+#'ÞLblMȵ\Wfiz4c+ kO3fyvʞk?v-\ce6fXa`e8^ƀp/û 22ú^ɻ 2 0/ü 20/ü 20/ú 2.û 2+ï92 ̰.õ 2,+ï 2+ï 2+ï 2+ï 2)ç 2k}|0,_s-ò =eUUYVe_feG}ceZOY>eSOW|:+˯k,˳,ϲ<˲,˲,˲l2,˰,ϲr,˱,ò,r&˙,c/ >YeM5YeeR;YdYK7YdeL1Ξ,wr'˝,wr'ˀ, 2 ˀ,r ˁ,r ˁ,r$ˑ,< ˃,< ˃,< ˃,< ˃,< ˃, 2 kgWLX k_=vng5slΚorY5y<ϚYkg#8#pּ͚Y5kfϬ5_f{.=pθ7Yd,[qּϚYVd5slΚY9kfWᬙ5fvv{΄53=kgٝ5fwθfgy5ϳy,ϚY3Y`9&xc^y96渗^{9帗^{9Xc]u9X\w9Xc]u9Xc]u9Xc]u9X\s98\s98\s98Yg9xYg9嘖cZi9嘖cZi9嘖cZi9嘖cZc[o9[o9[o9嘖cZG?sO嘗c^y9x]w9嘖c]c9n帕V[9ncTg|3h9_69_sc9>f9Fcd9Nؘcc}9\& k<̱0#0Sq/ǽr.ǻr.ǻr}5r|˱1s12#s12#s12#sḻ1sL11#sḻ0s<0ǹr˱0Ǿrٱ}ac\\%gٞ3sf{93sf|y9x3sՑcs?grfϙ9?g3sf{ ϙ9s<ǂ\ous?gY3s||ϙ9=g93s|Ι9?=>_z?ƿg{f;ͮw]5_}h{Ю]A kevzn}f̮ݝ)svf\+wz{-]={vGc``zy>>N.^>>nΓΓΓ.ޓޓޓޓsa\@QyTMy6Y`sG'9TSyN9 ks'ϝ3.ϸ<3.ϸ<ʳ*Ϫ<ʳ*Ϲ|v8|2.ϱW_yْX%y^Y!ygH-y9H#y9H#y9H#y9gDyF9D%yVYgE%y^yEy^YgFy6ِgC y^Cha {l3W6impcef|o^~lc1g7{{;{c_زǖ=uN k?au}-}}M~>y}~>9}k0>}s|>~}~|>}3_?|.9.>tʳ?vƳʾ#߳~gS[~|>_kz~<;w5=zx5y?} '{On=a}{/^`&_;vsM {_>a;þ}{7n7X{r}νO}}>}bľ}'O{b߻þw}{>}`WSSsc{Ǿ};w{z_[k}muzyOuz_'ĄĦܣy_}/ux_k}-?נtxš&פt_g}]Ku.ץt_k}-Euk}MI5&ןzs_o}7םs_s}ݹ?rMk}=g K\/ւ.-҂.-҂.-Ђ-Ђ-Ђ,hς,hт,ς,ς,h돬Ț-т,΂,h΂,ho2N-ԂN-ԂN-hԂ-ع,(8~uMZФMZФ K o-`k5\0 fsA\0 sA+|ع]0 v.sS z fx /賂)y^FL/3`^0 /`bl͜/0ֿj L(0 L( L(0^0 f}/3`_0 f|/3`߂[9;#ɟ?;O?{Y{컟OOg~}mZ`jZ`jZ`jXZO8[`knYfa!Xgnw'\cjZ`_sX]W`^yW`^yW`[}W^.0 zng\dNY`e2a}S <-O <-O <-? ,S -pC ,; ,pXYpxO -p; L-⽝9{OXV^:{OE\dpE\dpE\doE[doF_e5F]dwEN9]tEx5V\drE&\drE&\dmE[dsE[nE[nEZkEZdoE[dlE[dlEZjEZjE?1@Q@Q@E^`3&ڄ/'=gNy)ꑢ)ꌢ(ꌢ(ꉢ(j(ꅢ>(ꃢ>(ꃢ(jF(rȍ"7(rȌ"(rȎ"k2~ӔN-s~?l-Ⱥ"c+Ȼ"+Ȼ"+Ȼ"cڢȽ(Ⱦ"+Ⱦ"+Ⱦ"+ȹ"+rȰ"Ê*κy Wdjg~#Ϲb}銗ߚsn+궢n+궢n+궢n+궢n+껢v+j*jF+ꯢ*ꯢ*j}/i?S`% V`% V`% V`Wwl_IVIVI4[IwtWIwtWIwtWIwtWI[UI[4UIotUIWtUIb=\W\?%S>렒*[y uRI'tRI'QIQ]Gev*馒n*馒n*iV*iN*҇OثJ/~?d{&=#&}γ~7ϻwڿ^ZҮ%ZҮ%ZҮ%ZtmIϖlG?iXϖ4gI>c¹,iΒ,iΒ,iӒ6-}֔uMZҭ%[Һ%ZҨ%ZҨ%ZҨ%Zҧ%ZҨo .8֫%Zҫ%}YҌ%Xҁ%Xo9֞%=Y҉%X҉%X҉6i,ɒ,ɒ,ɒ,ɒ,Ȓ,iȒ,ǒv,iǒv,iǒv,iƒ,Scgг%[ tnI4nImI4dIcthItcI1e]hI4iInIhIthiuʺ,%\ӑ% YZWsB+<7Ғ&-iҒ&-ђ-iђ-iђ-iRf5Zҁ%X`ISֵQI딴NItUI#4GI4MI{tMI[t@It@I;@I @I @I @I QI+@InO]P%]P%]P%]P%]P%]P%]P%]P%MP%֗X-pk?x ޯ_qޗ+tŁ8@W]q+tŁ8x9qkp4Áf8%@'pt8z@=p/|9x͸Ο0G_sK|<`x>pC:`<{yu^0ufM\:s|ȞO V?0f8orۏ!;3?g?ٻ:c8uNpE,:9ҁa|1udW:`XuVU:`Awg<;pvml;`vml;`&dv_39!kYsȚC.M9d!s#sJE :d᫏5'NpZ'uȦC6Ml:d!tȦC2A :d[NY)o3eES\;d!vȶC퐍;d!vȸCrS:d!tȦC6~lp{:cvȲCvvȰC2=>cϧtȧC>c:d!wȳCrм?4CV~ی<8֑};3M~Kg%d!|CrLJl>d!|C&2ɇL>d!|C&2LJ\>d!|C&2ɇ>!cگǬ>!9|Cr쏝sӇ>!9}CVrӇ>!9}C>Շ>d!}hUϔ]fte6Y[fmeZfkeZfj?b/l.2L.3k;2˯7aeY^fydue6y[meޖy[meޖy[fje[ne[neޖy[meޖyZie?l-2w-s2;,2s,2c -32C -ҜX[fme֖Y[f`seVUZOe>VfQ9efyPAelƗ_6f|ae9R6}ټ/elޗY_6f}٬/el֗{=<(́2(sG̒2K,)̒2K,)s̓2K,)̒2K,)s̍27ʼ(̋2?(3̌2|(ś^fAyqlϤL(eslY_6|)slY_NN87f/el_6˹vF̆2fyټ/5?a„}kK/eRfK/勑} xQEe^yQDe6;cݱsYRfI%eYRfI̖2O<)̓2O<)̓2O<)5 Gyxs^>x֟>goΟ=Ϻϟ3lL=bSz#1G,=Wy#.G,:+GH{Hi#}rt:c]#qKƑ9GH'#p%ő8G:b=){1GHki#qAzo2=pF~Ǭ}n-v׎^:gؾ?s<ϛg?|}h# se4͑9.cxeڱ69+zXkcMsm5α9Mǯ0}ϼ)ǯ;ox9;bǺXkcuѱN:GǺX9~QpV#X'ctGб>:LXCkct3kXOcmuԱ:SzXgkcmt5ձ^:KXc]skα9@:X7ctԱ:Y:x:Rǟ:>9>OcvÎuر:\_|c]vˎuٱ.;bZXWcuױ:X_ ZXsko9`Xcuر; kXKkcp5ѱv:SǺX7kcMuŎLx;iOGν{9s}бcH׼{9nsػع?Ǻ{˱c}|f>XSkc>r}Xg㿞o߉;y'D_}}O}{XkxON<щ'DhMz3Ot6=њ'ZDo=נ' F=ѡ':G$8ה'DhyEO4><ў'w|{4>Ѥ'DhMz[O=ѯ'DwO4&=ѧ'ZDǞ|kzD۝?3?p]C|{f~O>'Dsz[O4=Ѹ'Dh{ic?{u{O=ѻ'_|{UO4ꉶ=Ѷ'D{O6>Ѱ'Gy|>'DS~c,8a NpoO>'Zu=|O> wNuOXrc'N8s™ΜW'DpDxOO9aՉ= N SOz³qcN4ljk/?Gfߘߙ\ OOt8 ':$1r N4^8 O|pf0'L?a O~'L?9;?;?;?; oO|v'l> Oxޟ'hϨMx8''?a8'>Z ON~{~d/N}7cYiv4_vdKg<篦s/Giӗ >ͩ9aF)OY~Sv2&Tp N5)O|S֟jSmqON5ȩ82z3swOsC4ȩ9)9\~ؚ.9e)Oȩ69,ZTjSƟ2TSS=pNu©N8 TϜSޟS]pN5>8)O?e8 ? ?)O~S?cyTWjSMq)N5ũv8O}q+#Wel唽<,=e)OwSr񔋧\<]9f)#OxS..OXNX~&8eiflM&T;jSpShjS]pN)O#OS]pӋcv\? :Tjƌ=T;67ڏIn}&{w{Dɔ}1ISgjSt8f8:TS]rNn\{TtCEW} *: *Z*Z*ڡ*<+hvhv<ګtDEGT4FEcTCEKTtEEWT4CEGTEEWTtDִDEWTFEkTtEEWTtFET4@ETCEkTa樼GTDE?TIEKT4FETEEKTtEEWT>0P=Q Q P-QanVD?i^Wx[ay}P䑵O εFvW8]t.W\r.W]arvW^t畯\as^W:X{+ +< +|9+1 +L0 3+̬0 + 0 +ǧG'T]a|ᕟ9fpFW\aq>W~!kV[avVx[apVx[m7[nV8\qAvU8\aR;&UTaQEU8TPCUV֒֘VaD>TPCUxTQYUUa\]vUWqބwoO`{4=tl?+lp· +0 o*» s*̩ *0 ++,Aɢ *\¸ *ck<¬ *kϱ=ΫZgUVy[ej/>y[emUVYhUfV9ZlUVY[eqo~{yW^evU~Wy]}UW^eyU.W^mUV[erUNW9]tGF9^nU.W\rU~VYemUVY[emU&W\erUvW]w?UPeUW_e~UW@U T_}U-PU P~UWu@UWQekUWY_e}UTRKKUUw&ʢ*;UVUYU= >YVeSMU6U Ӫ2ʢ*lʪ*ʯ*rʦ*]UnU9Vlrʸ*ʪ*ʦ_1{5y?9TNιƧg,}ʡ*Xsƙ317gl8c/8sƙ3Μ1앟\9{^e|3qgL=Xy31g<uƪ3~]g<;θwƽ3q{&}ϴ{n{i;{\?c<E8 g:g\ę8gL33pδÙV8 gL/i3p>8gL3mp δ68 gf\׾dƵ/qf\cϸ~ΘU#?tv8g6r tř9g|~KδÙ8gzL'i3-q3=p^8 gCs{wµ}ߔk]SOq9Kg?맳 fF9(gLi3mrK~v_r9=gL3=s~+6gLۜ馳[QgL鞳|y\3t}δϙ:8gLi3ti3mtљ9?gL3st͙9;g4c9Cg=Oy_)+θOם3w&r4Y-8ugLӝ5c=wδܙ;sgZL3=wδۙ;tg:GzLo3uv[LÝi3}wߙ;#Ͻ4g4~ȹFiĚ雚ړs T@5S<5TH5T{sTR5XS5XT5SE5MTF5TJ5U}5 V{`=اjV[o|j.ik\iktB5=P{]cPcz5_,5S9ȹިk[jĄuP 55j!j!jjjzjzjz'jzk}9k,5>TW58P@5xXk5׸[cp5\cu5׸_cz58_5}P 5-Q!5R1/|~.־E{Ծ=V16qڏϸkqklkedϴ뼮#|WxO=bVki&iN邚V鈚{GMsB~^}Q5-Q5-R"5-R(5Rj5֘\yMk[cl5[clMtIM4KM4KM[o5~]&^u 85NxZcl5[s5>\s5vx^ys_Y}58_c{5h58Zh5x[l{ڽ|= k/7aMX9{Y|s3 >g9g9{9{s3>g9ysn3_;?N<\ sq?ǹ&9$\sr[uϹ9a\kssyι9KZ^~Ƿ;_Ϝ%so s ys幾<ח\_s w5ܹ=7?5cctONX/~fyk?:O;5Mw5ώ\p #z\s}v5ڹ>9'\kss}uϹ9=\ssy5Ϲn:\ksvεڹV;jZ\/sx?0cwП}?z\s=|uV>Z\K޿| rν/}xg>zz뚼뺼z뺻zz::ڻڻzOwh>{f:Oy߬]=SS{LHHݻI{J{J{K;I;I;I{HݻG{H{HG{IݻH;G]uP]uP;H;I;II\R[uUsuU[u=WZuU {tY]?td멺ުk뮺vkwުkkk6VpmuMW)Ϻ/ >$vuWqumWvumTQu]WuuR5u]SAu]R,uSDuS9uU:uS:uS:u-UGuS렺Ψkk닺ϏqLuR;uS$u}R'uRS5L]5L]kԵF}1%u S&umR&umR&ikVkvkV뙺~뗺n떺Nkn:7:Α:GlΗ:_Ο9rWu^yUUcu֙Vg\quՙW`]YXga5vY7Llaɩ:'Μ:GΒ:c/Muvq F\0~3u9S̅Yx \-|d=8v0G/ x͑cܼ`х9|a_fY|a^؞o7p};7y`ϛM3z-g\3/pa_ŋFnmF~Fp ^\xu&\p=r^#Ǭx/X{<.8r9C.r >\1 ֟}󏞲#5.]pK\`.u)cxrO9f.q ~\9lw.s/`.{_53z=.8x v]0c4r1.w ]}`.y f^0`.xw ]ps`.v ]k\.~fƨ ]p[Κ ]Y,`qb9#=X_ OXg2w'ބg'-LX[s/y ^̽`s/{܋޵z ^0/x|9owf_肱`c/{ _0\/}#oGz=~"Bw\ qW.nFM[G\ rM.ncr#C;4Ϝy}=y֬{h͹g?ko_7X ~7v >78`{3n0|oq4n2& n2&Ǜsws~~MM M M35B5\טruf\MmM|ÑsM|\45ESs45GSc4FSO4DSk4FSk4FS4B MͷAiɕ&iMkɝ&Z&c8rciɗ&_iɠ&hɏ&,jɎ&;hrɕ'̸ƣ4;fglM5?oʺ94{fonM3iF74_5eg\3~mMsi^7ݦ4whr5cq>3ms> oGg hɋw~{FyEM4ydEMV4YdEM4dDMn4Jg&KM4yI_[cE1M4dL1M4dJO8N)M4dQ3M4dH!M4dNIM&5I3:^4O5M5yM7M4ydL9M4JM>4YdO=lp!{6dbMN69ټ;ñs>6eMf6bMV6YdhM69ټw-vbW]-bLcͿo=ϚgbW-z`k-68gu-fg-XbZs-vxUW-bbm\{)Ypo3c?[/[^񒏗<%/9y?Gd/yvɬK^]꒣ltƞ|繳:Wc_Cgto_cim.rm~uBmη9~Gm my~5cf~m^yemfjmֶYmm9pm6}m~yf\qmƵfemVYfemVYfemVYfemN9tmfxmfem~9fam~YԱO6G|l6 l3玭Ϳ6_0v6'ۜls6 l36 lK6'ۜl36\lsͷ6llw6+۬l6+۬ls͵6\k#'ls͵6lkͶ6?;eöXmfbmyfAmεyEMmv[3͚6si3͢6Oum.RUmV'3cFw1;f{l >혫cv܎Y1w;ng\ູ1s;fp혯3c.wY1k;fp scvՎ1W;j\혫scv1;;dǜ옭cv܎9Ȏ1?;g옱3cv؎1{;?oYcC?θz?ItaC 6taGntK>taGvtct8aJ ߘSaH/taLtxE^taL5t91;sscw6OcwaC 6taH!9K:\pSA>tX9֎8D2ř/:}ǬFtaGNt΃=\Oy:鰥Ùg:0×_:|×_:|鰩3s>uxԹ/>H#t8H#tYL7]teT]vteJ%]tM7]teF]t9H/]tY}]uYeQE]^tyL3]t9L]teL1ݷ ~:srˊ.;˓.w,w?sˁ5<ˋeA G? Y5络ː.[~Lp1_\2ˆ.?2ː.C 9ck\鲢ːgMs΋./r˗.__\H'\Mkfu\gYi]uͮy5߻{]u_2vλ7OXwSm3}k2kwY5뻬]3L΃.3rkwyI']te@]ˀ.L2ˋ./<負kwD]3kfwB׬]kw.?}׼]kwY5~]skwWMY7f~׬˃Yݚ9e}|\]&teB].tE]twy~g=nyr˳.ߺ|˞.2ˠ.l격ˎ.;2˸.ú  în}cYe]u5vYeam]ue[m]uֽWbv;_Lg\c Xxž+]Wߺ} hWi\y6Wg\y_ν]{>s˵k5~3Wk\{_s#e\{ǹ^r}5F>_=s=˵wk*]\{?rǵw7 \qpZ^{g~ػیu3o=g|ɾ Zk_kk}k}ůu.ZZ_kk|uuξލ>Z_k}~ϯ=p~|=u7\{or{õk3\{_q={]k#O\{q%ck_:ek_׎{rZ_kk'O\{7~pڻƵw]ǵwk|;\{wqpl;r;ȵy׺Z_kk~ݯuuu-ӯay?g\q3Ҍk<ڬ?usֽc]_ Z_k}dű듞}{ĵwk3\{w~pk\{Wp]ڻĵwk ;\GּG\{Wp]ڻĵk'\{gqk-|͹k^̾M\͸k-zk^s\5Wzk^kmsk__5XK\kVW̵Vȱ銞酞i^ii>S;tAO+4EO?tDO3^{NX=m=m=m===@== 7m= zzzzzNStBO;COGAOAOG>`\[4BO74Cqc{{9a=cu=]=>fʞO٣Sz ﱼdz {,챰'{qS{Lq{{L1{L1 zڠ z<}}MoA=w=)1e]3x}=FcD=FcH=n===m=M =8cN=^}=Yg=&~cƵߜq=8cL;=NX]W=&V[=n#yo)=]w=x\k=xc]okls zO.a=b{=.c_d{l걩ǥz\qz)\q^ɆzL1DŽzןsϟͱA?ɽAyǷz1ǼO}3=~cYޯ{_sϵ>/7ɰ?Ym}~YUO9SO}>g]]}vyg[I}N9TS}gYc}gSM}.sN9sϡ>sϢ>,ϫ> 3|3K}TM}O#O^9gT)}gM5}?98fS}so~y7wo7x}sϩ>\s<1b@9O癏}?{k>,su9_?>,>wLXgx}gp}yg}p=׿wy~뉾kkI߯땾^kk\?z뇾돾>k賹>3cl녾sf賿59|} } >3kk&k&賷>s>.낾.> 3>ͱ5}>gc}Fok\v}A}=}v w}~ݿ}~yu8;쀹&<`N=`~3}X<`^>`&<`X>`6<~=x㑵7><`al&=`{<F=`>?>=>`&}\||0}`9=0|0y䁙=0 L0aL0aL0aL}`y?0|`907ss`΁90;lwG| G97?9em> 80À. ?0s|c;`# X10sz u 1€ . >`<`k~W 0`'pb'W\bL0a3|̓sz`.y=0f&Xu 9=0sL3}`>0f pcޘ7|s?^fNX{ kg_~5ܼ„u6ݼ҄1aC72aU'ڄW^sn^kLX{ k7a7 a oxíf0G"8f nvû.0y7,a ospk7 nx.p7\ oxśy~|#𧸇7l go{ߛO'\ op7a koX{7< oX}v߰7| ozp7< o8}}pn|=a ouú>c놙7 oXxp7 n~9/}{YyVް7aώ=ooxпIG=q+nƍF7F3h q)n4ōF7Fk膛ߛ#nÍ~7arp  n4&7FhphMp nRSֵ o8 n4&7FܰFhF767cתf7zF/hp n.cp n4 o@F'脛^p}ֵYpn os 7ZF+hp%ntč7?oVC?Cy;dCVY=C;␗C7dߐC.Y6dܐmC 97ݐmC 6dאkC 6dy6ِgC 97ސeC Y6dِ}C y6ِgC6 0dÐ C6 4dɐ%C Y2Ȑ3rspgwCn 1Ȑ'C~ 4d͐EC y3͐OC y2ɐ'C y2dΐ9C y5Ր)C Y3KQpΛᗍs rlGΙ6dȐ-C 2%#׾68gҐIC& y3d̐1C 94АcC 96hhv ͰY64ӆfCsth ͿC#~`ƾ#{wלC. 9dӐMC >4߇|Cxh<4kf\CszhNܡY<4|Csx|Cswhy;4f C3wh&<4kf|Cvhݡ<4WЌCvhf֡:4[fCyh>9:g>~>a}\e-;oy[v޲󖝷e-;oy[yo9z[߲񖱷_\S𖝷e-{ox[f2󖙷,-oyuv޲;7{Y|fa-o9z[F2ŷ,e- oy[F5rf-{o{񏍬3ܼ-[oz[޲Le-o|[re-ko{;#e-WoY{l[޲ckܽL[2<-o|ד1߷ܾem&d-o9{|le-o|[6߲ͷ-o9|[߲|-_oy|[Ƿ- oYx [F2ѷe-oy[r<vǷ;펅-o=d-Coz[21Gfwc{X};qw6>w|c};v߱wl}7[{`wlc{;1w0;ޙw{;Fߙw5:s|;Fq wLw>xlw̽cKvǴ;l3tǰ;qw=L3;nqwܸ7qs90wc8wǙ;ܙwf|g>ߙwoxsǛ;ܙw0>ǯ;ܱCwܸ3;ܙwfY~NJ;F}WwgϬg}Gf1Y5~Z[|tJ4i:i&i6̈, < ""L* ʠ( "2 8!(N$Mtskoe{~/k^+~{9]tOtWt]sSYtE_48gev]fev]fev]~uD;c ̵̬̺\̹,2.s2.2.94δˬ̵\̵̟̻̬2.3Ϲgvswux9yywOϙúLe忼ee_x{ӑ9ˌˌ.ceӗ?cGuƾY_e_Y~~DY\gp.urVpyyy;~2g-s`_u2\.,32ˌ,32|-2[l-<~g<>K#D/oy^GuGYw5FYc5FYcGYW5FYcK.(낲.(낲.(낲(k(k(k(k.(낲.(낲.(k(7I[ܿ9r;m[ZKʺKʺa::::ڢ-ڢ-ڢyʚizk|w_uzOUCQYuTY5ZY㕵SY;WYWuUYWuUYoYYǕu\Y{IY{GY_UYo17e}S?qߥ_eU:[ciISz__zkY:_QQe?z铪^iꘪfj~ꙪꙪΩꘪvETL.knUʶ1:f{(2oʶ^;ۚf;0e[lφ;\lkm]˶v6f[lkm sλNM5ZZCmmuҶnM7u-B:׷\_5-C:4ֹMk͵Ͷ׶Zۺl[mm͵}SwmmǶ׶!:d[lmȶ/ۚkνۙk5Ͷ:ۚg[lm Q5ʶF;g[lm̶"Zd[lmݲa5̶4:g[lm]cu̶f,ۚe[lkm-%Ob[Sl3|`[l[?lkm=5Ķ)Zf[lkm=/ gC/:f[lmm\lkmͲmMI5ȶ~Uq㯎{ox^mso km}5ŶF~[1}͗mle[klD6u6ٴyȽöͶm^mqwیfǻqlg,6Ƕy͵mmlgոUX5֘Wc^y5՘WsG2 k|jlƶj\1j|}jy3Oyޜ`k<k1k1k,Ok1 qƺj<1ZϽJ'}/k<3ks=I.cPhuZfuVZyZ]s:K,::?321.yYgiuF]gtuF]gt3: 3:{3:뼮:[뼭:s̭3:wܭs:ꜭs:[{s:묬:?뜬s:cjuYZku9XgeuZgm\1{>̪sα:F0s;a;w#|a3wr; aCw~pq;a/wþo};avصîvpo;Laηיpu;acvâge;aC\3n];lyPp99vé^j;\SO>tCǶnChY;aCv|vOv;k ;akv;k~;k5tc 鬡m=i\`ـZ8o*#DLi2ɢfǕ3&M4dF#M4K!M4dH!M4YdMZߴ7Mk}Zߴ7/7Mn4FMk|MN4dB M&4MdC M64{7qM4ydA[wK'M4yKM49H M4dC M64.sG ܻKwz{{n&lm&SLm2&Clr&gl&/ mr57l&;l2&7lr&7lr&;lɻ&k&/l&|lɿ&ǚkrɱ&2η&3 l2&ۚlk&Klr_M5|udM6d`M5dcM&6dbMN6Yd]qM5ZuM5:gcCkr&Kk2ɿ&k&ll&lɻǃO3F5SOM5YmM5]}M5?{qt_9xUMV59TSM59ՄOӚn&ӛqٽkxqM]2vsTz:r}]<.w]VvŻ.w9]rw.w9]rzӻ,e.w]v׆{.cl.[w]rxϻ_c,e.wy{˻.vٲˈ]vޣ87veN=sen]ƙˮ]>rj.vˠ]&2iO,e.vˠ]~kK|e.kvy˧]&2iI<}9˨]~kQ.v˪]frl?,e.v>le.v˴]2lY]Y =cϻ]nwe.vy˻]le.v_eu,e.vˮ]rmie.w]rjIp>{}O;|WS~4\{]ͽw56Ȼϻ:zWw]=+w՛sWj]][ =[w?.=0wh]ݽM ~GUs7|- ߻]}w&<{0{F]>e*__kك{ٯoٗo_gMGK36r/]4{6{8{,{1{3{5{7{-{/{2{'{{!{Kܕ{L=?{?{]ucϼ;swtMyf{K#{={==={={={ۜsq̱ܳܳܳܳܳܳܳ`W }kpnoggϹg_gg?g_ggOg?gg?g/gϷwxۯ3 Wݻo~ﲗݳݳݳݳ7ݳGݳWݳgݳݳ̱޳W9eϼ=COW_go3;COW=#=~"x]޳w޳޳޳޳޳޳`s{yQ0 |/sc΋ϙ`γ|ו9{/waog.c/=.{{ZyO3jy{tϾbϾyc~x>zxϞaOi=? o{W{9}ƞl~]onٗ_}ag/g͞ɞ}Gϙgy0{2{0{0{0{6veng̾fϞf>`>g== gt{xOipΙs=]t=ƞ{uO=aӫ{sOWi=]+t垮t&r_[k}m-徶זo__}m5vׁ=~֞}^ OL?o2[}ݽuZr_k}_25׀щ|_+S3k}ݸK5߾{zo] уzp_Wk}-o:׈o_k}|p_k}ҾKzi_/k{_`Evޭ33W1{yg+7߭Qȵ׫s_} u߾ׇo_} >yF/?*Әs_?}!5來om_k}ݷ5ܾ^f0}B0.0wj' ~22O}ݹ+޾חzn_Rd/tW"syG;tvהq_Wk}͸5^ׂZp_}u;zg__k}ͳ>佯w/o׻~5;s#~9k1m2WN׫ֱs_}].cu_ck}}Suv`c=}MS'1ͺK?k}+שv_}!??\]Ӿ>Azh_k}ӾRj__+~ߍ\}͵?2ׁ;dhVlm_}vp s}9s'~?9<zGtF=Ыst0_4聎<Г@[hy9~=бz@hx1t<РZ@4V:@o}zA&=Я_c"st=Т@hzY47ӹ>̹sg>`ݮü+=h y't=B:g@hv܁;v@hw9t<Сuޣu:>]w<:]s=qVW%yq{m`/p`q`or`r`r`r`r`s~*=<{'Χ\p [IaOSeSW[_<Сz>>^%WKxyWLo|vW^s v`re^c}==ȁzܳO8g8798g8xSd@=}}}=o_qkx>@;####?w|ϼ? ٣|lyp^wy[}o#cg.4f_t`r`r`r`r`r`r114@;سدkثثثثثثث4s9>s9ZPjC]h?qhphs-5Ʒ%Ɂ?KQL&{C}?v ߥۻK211TTTTTTTTTTTTs Wk QPPjzkk{{7?gF^gmoo:O;9;99999]yw̳:ewكymkڃړ{~g[V=ԪZPjCzU>=Թ~a>.v.>>O=s<{|{=ЫodO7&7>oph/uhqhqhshqhyhssrO9O =~.LG{tpi}ооо^^~^О~~о~~>/0oxhqhsh_thshshshshshshrsoڧڧ={C{C{C{C{CCCCC78оо~-}Ǹȡ=ɡɡ}ʡ}ˡˡ}̡ơV?>PÏ^s\{C{C{CCC{CC{CC~{  c?gW+7CKS3;v:K?:ƝԃPKڃ?6{155<ԠzHz4r}s"=z=׿GCqm|4?GHCOx\W#y7t<ҡGzH#zU4ߑ;ڊ\k#}xמs_i# |tCѱn>oΕ3f|~=ҲG:Hۣ[4v=ҒGZH#-yt^=ҙGH#}ghE^y7u]A-nGw}=`V>GHCi{u͑;HG\?~@~F9+GHi#Mt45Б:|#1G?b}#mq#q#^=5iO?'Gz#G=b|#>1G/g%3}U>kNq?tȑ9zEp8G|j#qAȑV9 GH;i#-q)ő8%Gw#:H鄣zH;i#q#q#GL?׏G?|~$GHi#p#G >#1G>lg5ߞsz s8b‘8GZ?OMp468GHi# p48x#G?:f3>r&=]pc3l? '8㏹~<|\?1~cl?f1ۏ~3Vι}c.5B׼ef}=1s̝c3)Ƿ`םsanjsv>yws?:7s_yc79O 'DhsN4ω94''Dhg:DRd#|>aɋ#/ '>'?a sO{GN^zΟ' >3Nt O:g O4 O:g Ox~f',> O{F'>sY}'l=~jOυ!x;3ݾ__=uN4Չ:T'ϹN4׉:'D[hmq-N4ԉ8 ':DpN7N;賓S-t;Nuǩ8T_jSpNĩ8 zT S};)N9vʱәsYz|曺&9$TS]rKNȩ8'4EZpaNȩ8TS]rANũ8T;[Tf{Cs=5éf8 TS=pNc9ZT+jSpN5©F8)OSƟǧ>e)O<{|g}S-tNu.ww{`蹫y"7>Ӈ [<z!|w|?m5ǜs_ߞjε=çZOTlpO\Sm{O󃱟1s=Ɵ`L?>'2O5.>SS{wO=ɧ/iS |O5>ʧ:TS{AS]|O6>TS]{gOo;s?w}M}O;|{sw}ZTjSw;O۩gN;}9@Tߟj!ON9iS jOtsKS]zKOu?Dz_O=ܧ:TϞSzWO^=իZTjS-zEO5=հTÞjZ0wy^ߞ6#cTjS-{*RO5u&gLߞ3}{o홾=ӷgLߞ3}{o홾=ӟgLi3MyrOw#=7c\3y9=ӥgL|3={V`ng怿\}|>>gLi[EBךk|4>g:Li3{c4왆=Ӱgܿ9;"Ͼso1~w1~.Ii3{=g:L3vۙ:@go 3rt˙n9-gL3}sG}3q+δ{Brk3q3~gϺIZyhg?Ι8cx3L}j93sw7GG3q#4ę8gL?gL[3-q1ęv8gL?3p4Ùf8 gL/qg?c}ܤ[os/0wV'/8.6oZiZz5/}AX2t_Z[ZzZzZzZZZ:3Z Z Z ZZo.hZoq/ߪ'[)[|#:-mZZZe\74RKOKOKcNKNK4OK tOKtOK4OK:?-?-;-8-9-zꡖji&ipYz`CB?<g;{uP{B =g{yFWt]Kϵ\Kϵ\]~ؓiliϖllllli.lkijijij鳖j鯖>kik(tZZڬZZZZ:Z:Z:Z:ZZZګZګZڪZo`CXKXKtZKXK4W}}i6k鰖.k鮖j}8tZZZzZZZzZzZZZZZzZzZzZZZZuZe\WKtPKtPKRK+PK P|VO=G-MD-=C-=C-=z{UZzZ']4FKcEKcߤ113:3ں%Zښ:ں7,mͷ6|k6[lms6,j6fSMm6fSMm6o6NfXWm^Yվc{g\cmf[kmZkmZna_>罃smzGmkuۚضƷmbۺضmkc~|Zڶnm~Gƶm^y׶FHۺ۶ζmh:ڶ|ZKҶm-m[KҶm-m[KҶm-m[KҶm-mbgumm[_ }^{~im[{ݶйumm[wݶ5mm[oۿgMn2t?lmn[mn[mn[5m n[o\[ⶵm=n[u.sm-o[g}gu͜{<kC9ksͱ6ksslͿ6k;'#,ls6k3ͼ6,lsfm>cm&_Jq>9x%imfffz19ffmf>7ut|dk|Ӵ9ܤ3};tc1H8iG1 L3g9G cɑwCYGα; cͱުǺcQr|k7sq -rq[9nz7x3Î8񧎏:1_;>TpȜ+>zӎ?yo{?8>Ggs㟃;Wǿ9߃ ㋑9/;ʎr#ێh8vMǮcϱ8p:ώ[_;C?CC,bˆX6ĩ! jiCbs3Ĝ! 1g9C\w2ě! 1f/CZ >y2ē! d3C,bK0dYGC_sZ1|k5w:;dYgC[w>ܪǽ[y8'C!k~Z?dY뇬C!k~Z?dY뇬C!k~Z?dY|ZC!~z?d6YC!uzȚwk! 04zsDuN C:aH# Qp^zO4Ðf CaH3 iaH7 qH q|C bÇ>!{`6C`Gt9;?~}2CǐFCcH 9t}M2sᆴsw?9Zl =hϟkHC !4ifdevj5P-23VvnCzmH !6׆ڰ^ 2'+s۽s?'䰞֒ZrXKka-9%䰖֒ZrXKkK>}f^֫Ùȵf֯zuXb0^2'eLkaM:I5&ְútXa]:Ku.ֆúqXoka8"cq]a9#u䰎֑rXa}8 օÚpXkaM8 5ᰞ~U'oCa;|-Ú{Xska=z{Xoa;gV֪ZtXOúwza;cu찎:tXaM8uݰ.17ް{ÚqXa9quvúmX ׂC a}65ڰFhmX kV0vqIpF4҈FI#:iD'3[F4̈IDcε5#fDӌ=3_FLnBgDh3mF̈2#Zfdq9zgD3wFΈ;#zgDh3uF̓qFtЈ8#gv13rе-4F#>tOh1h;Ι>.6y#b#3{ 8#-0Fo|+뾑tʈV;#oDh 2)F4Lj#bDS<=17Fƈ#zcDCp\O1)F4ň#bDW]1Sk11F4ƈ#:cD[hm1F7¯phW?G?0t#?G9ґ獱t#<țBlaG8>0t]Ƙ9^;~Wst#,a3G9^o#a+G7½| ̟O}2,7GX=Vz#aG8Ǒχc{2=ގv#gG:r9D<ߡ1&0y#LGx<x#,a{G;ڑ=qx#e(GYs[0g?߅7vۑ9 l їzg^߈/3|O7~yF1{U/7E~4F[CZiTQ3yF5ѨN.cyziTQ4F|jϨn3zfTόQM4F5Ѩ&DhTOjQ]4F?I:iT'Q5eF̨2ZfTˌjѿssLg\GjQ}4FѨ>;zgT#Qm4}FϨ>gTzpkQ-3FuШ8gTjZQ=4yF5Ϙޏ~=}8 tΘf:czoLis4csY}h;hLwi19^ecZcL1tc Rc9gOx:9[: t_.8goX;1vc,Ox:1tc,;Ǹ9ͱ:_蜭clc[:1uclcOx:1qnic Xgcc{;1}&1rc|uB91~sBccKX:1vqrc\816Ƹb1.ƸX cs;;c=;=k:wWl1l1j1j1j1}g1}g1}g1}g1}{5<cz0vy:0b+b(b(eLWŴQLŴQLtULŴQLS4YL+Ŵ_L+n:F1mJ1=91/1m/ c9:'qb'ob&v >b_wt%b)b)b(b(b(b'b ]k願iiiiii靘މiF鍘vi=*ݏx#\w#yMxL4dL;4g'#z9\fi˜3C]k˜Ύ˜.˜iØ6ØiȘJZ'^։1Ӊ1Ӊ1mӆ1mӆ1=y1y1yW^[Cv!r_~{_㝝{c\~˽˸FiӘ6iӘ6iӘ6iӘ6iӘ6iӘΘΘViԘFiԘ6iӘ6iӘ6iӘ6iӘ͘ތ͘iژiԘiϘ6ϘϘfiΘΌΘ֌i͘͘i˘ތ˘˘i̘ƌi̘F骘鈘>雘6^p yc}1Xc}A{ ]?~Sq0ǸZ`|x<89?qns{2>c\~8y?q֏~kx8Ǚ?q}g8y>U=~|Ͻ>nW3Ÿ`89?q]0qΏs~\Kkq0~ȸf:`\q0ug8??΢qk8ƭqk}>n}?4Ə[ǭqnsi?nƏ?a9O qz<y0w xAr03|"fd0f\q2Y5̸n-d\q}2[[W5]W츞QjBCMh 4&ӄVEƴӄvNib>Bib&8Hhb6HhB'Mh 4&ЄFCzhBM =4&4фCeBL4AdBLh m2M&Ʉ6JdBL|}dLL 2U&ʄV):es2Y&4ʄn):eBL 2S&tʄN):eBL 2Q&㞆/~xPzgBL|~_0/e~ZkBkMh 5&tք>iBLh 3_&˄F0fB+Mh'cx^ M 3&τ&@:gBLh m3&̈́GhBM 3e&4Ƅ~aB;LJhF =3E&tƄf#zcBoL =17&^|v=| 2A&4ȄΘ`'E&^W<>E[7׿y k4G&Ȅ#ZdBoLh 1A&Ƅޘ@g* >s~?zhO;>=oN;qnBM =7.oBM|3Wi 7&t߄ȵZeBN }4+&tȄbB[Lh }1/&ńЅbB#Mh ]2&= nOp{ܞ'=q|w]'-xxW5Aw=ޣs7|}:jRMjI=6&ԤOiR?MɩSiRcMjI-59I 5&Ӥ~OiR?MɵɅߧ&}~oRMI7&5Ϲ 'uz9zqr32#'uNԉ:qR'N.4~ȸԊ:qR'NI8'5 s}9zv]9xVNI;'uԁ ;zpR?NIM8 '5ԉ2~ȵ~ԱrRwNI9#'|jI 8"םI8'uNԃzp1=u䤎ԑ:rRGNI8'~ԏqR#NjI8''䤎ԔrRONI8'VԆzqR/NjI8'5FԈqR#NjI8'5ԅpRNjI}5&5ԤXiRKM>2FM:iR'MjI}5&=I 0,4IOIOr}`퓜$'9=IOz񓼞$'Oyϓ|$'O~y>IO|ܘ$&y0ILeϓL^`/0IMnwe>'7Y`>&9Ypn Av"o{{^sϛ N|iGq]EqM ]h0Z(Z(Z((:((&I:"눸Z$1"sso94k#9Z!7 ) _c|Ǹ딸?8㌎3:898,w>{.s[]}v[_ln6o{ u_#>߹i\Ƶi\5i\5i\5h\suh\wug9תqרqעqׯtװqmצqmצqmסqסqןqןqןqקq}סqZGZ4EZ4EZ4E3=3=?e]~62Y2c:6c:6c:6c:6c:6c:6c:6c:6c:6c:6c:6c:6Y5Y5e5[5[5[5[5W5Y5Y5Y5Y5Yz5M4I4]:l\ul#23˘kkkk۸kڸkڸkڸkڸkڸkڸϸ^[^k|^Gǵo\5T\ŵj\m\R\5^\5L\ě]ƴO9q׃q};et̔2S@q35i>N;ȽN3oQS:jJGM)5tԔQS:jJGM)=4ҔZeUSjJ7M)4Ҕ֙:SZgJLi)3uʔnuy6q _5+9>5|5|"_)O}Sc#c\k) 0S4˧X>u92GGL}{y:`SN_d]:W2;ʔScJcLi?`pdJLi)M2I4ɔ&"SZd ƞ=.2Wʔ^+SzeJL)2StʔNSs9?y3w͔F(SeJL)}2sO2Y4˔fza0SfꥑkM3g̔3SzfJL)=3gt̔1SfJL闩7u04z͋`SlJ[Mi)m5ՔVSjJ[Mi)m5ՔQSiJMi)3ДQSiJMi) 4]4є&DShJMi)M44є%SbJSLi)=1')r#sy~/SeJL)2e5tc4̔1S:fJL)3aʔ>'Sdc\L)=3]˔F"Sb${ΜNt:$}Z%=#=#W$A$?#=u"tK$GZ#5Z#5z$7O:1;༹e=|KLJ}&tD &X`a &X`a =mp K0Kp,Jp,|J|c0x;" :=w\ w2O9ݑ{F:t N'8l &8`mιr &؛`os 'n &`o &`jetɑO|w8vN:Op<N;Np;|N7{_c\$4@B$4@B$4@ &xi &`s &| &e '8p &͉w`r &':gs 6'؜`s 'q &~YnA$4@B$ &'`r3mz߄ϛ    z   z    O?lO?|O=lOp=܃'@R $@R $@R $@R $@R $I'~I'yuI^'yuI>'\F''N8$Nr8!r$Nr:$Nr:$N9$N9$sLL21ɺ_>J*ɥ$Jr(ɠϩ$#w:gη|N.ɺ$ߒLKr,ɵ$˒,K,ɲ$ǒJ(ɜ$S];c L@09g^B="㝱_μ3~畱9_|M/ɴ$ӒLK2-$ג\Kr-SBK>5tK2ɿ$K/ɿ$K.ɻ$u>ٙdg{I%dV%]ӒL02_ ]s/ɽ$Kr/ɽ$Kr/ɽ$Kr/ɽ$Kr/ɸBK.ɻ$뒜Kr,ɷ$lK2/`Ι$#\Lr1$lL1$ےLJ-ɥ䟝"0.ɲ$˒,K,ɲ$˒,J2$ɣxd.olJ2)ɝ$oI&ɛ$o,JCq%9dPAI%fRII&%dRO6%RKI&%dRII&%wydPAI%dPAI%dPAIMg?ƓyoMlf44ͦU4Ϧy6ͳiMlg<4˦Y6ͲKkMmm\4Ϧ6ʹiM3mcf4KsM3la f4æ6}9ϦY6ͲiMslQ495ͩGso3^4ߦ8ͯi~Mk_w1~e>1Nsp,f4 Y8iNp,f4y1͋iL3b >;sX9ͫi^MspΜs\_50M?"#1>MsiG<4s3͜86ͪiNM3j'i3'~ss~o~S#e4kY;i&Nr,f439i^Nr0ww4 Y8iNsqo{ܛf47ͼiMU1fNp,f47iMso{ܛl蜁̛f4f48ͽiM_o?B:`.7ͿiMo|f48iN3p f4Y71u)֥Xb]u)f>ٕbW])W])v9R K1,ŰRJq+ŭRJq+ŭRJ*ūRJ1*ŨRJ-p.R,K+ůWRJq#ō7R[J[w>n^{o[_})ƥxUg)VΙüS L10S L10S L10RK1.ŸRJ=(@2#SK11ŷ[SK1.RK=*rͽCRH łR\?.4)N8bH)VCe)FD)N8D)N8D)N8D)N8bD)FfF)f8C)FbD)FbD)FbD)FbD)FB7DYbD ) Ňd~}/0]w܋w އ3cFkhm1'fČ3bFg]1+fČ3bF?0fGꎙܧ 0)?v?~N3iF7hm4fЌy~d\+褙_~A9/=f~)[3zkFkh5f֌֚X3k _=nF}7гVс3oFh]7f4݌NyKBuzq村֎3:qF'8 g>c\7h8g4fщ3zqF;}8g*8xZ7|"tgtΛ{3:pFCM9-g4̧ΙwrFo8!gt㌎ш3ZqF?g\ƙ/nFCh5ftیr3zosyv]<_;k#>WGx-;egu䬦գrVXq:;g'xpYgL\Y}93gթzuVY;qgաztV{jBp[guƜՠZtVjY:;guZsVsY9{̓ΧޛաztV.t{:vV#~CdՅqV+jY8!g欞ՕpV7erV'jYm8guB ;t'fu¬O ƾC׺cVWάbVKjY0!fuŬ=bV[jYM1-fwRd~|w|._ߤmf,gY0YYjY{,aV+jY1Yrz<,gy>Y~rӳl,g>wYV}/O2x,g<swީ9?9-09nq{s`N?is_?i9i9 091ws c=9Fs`s szb!=~}q s-; Z]=]4]{7x{.ݯu>ӏs>;qNOi98%6ӑs:rNk=12-܏tRq:G4{j\i9 :y4ޜȵ?sZiN{9443}M74ӛszjLsiN95t՜ΚYsnQsjN_95~ǸޚYs:kNg95ޛ/x3>ϼ=74ߜ{{p\98ܜ֛{wZ9-7؇k7>xsoNi?2 4.RsZjNi9]1՜s:lN96μOO}ۀk^oۄ j9M<=74ݜ֛R4ΛӃsueL#5kt`> 9t\uΜәs:uNN9]9^׋r^ck|2 %Bt\Gym93Ɯטq^Oky91痻y-9!伦_2ټאzs^kym6ټtۼvrVs6mCm^ky65ܼ^qL[m^y7y1}3γsy~{ >>y6wl<=_Ŝw>2>s<(#p<0cq+_r/uf,0c |XOι5Kx,pd# ?e# X`ł~z`=_ X` ?mO[tgoucFڟXp΅4mO[4'Sskr= =˛4K( ޿y<ǯt){xEi.DifY{|H!}g#i9D!iM7iޤ?I$͕4_ҜI&͝4,Js%͕4gҼI#͖4[lI'͌3$͕4lI&͟gL5i2y?iS;i>SQF~tKi.YKi.~Bp}QiFV[i&9SIiޤfT?i9fRIi9fPE_fB1i.fSSinfG5iSI3#͌4O|Is(k}_cCifOAi>P=iV9J1~ikqZViwizfCiAi&fE?i.Y=ム[>t /ӼL*ͫ4M0ͱ4lK-Ͷ4/LL3-ʹ4ҌJ3)͟4I'ͯ4K3/ͼ4K3/ͼ4-riZ>s>0^ =ѫ?7uՋ\d_=s? ]=o }{o>ϕ{?{yV,jOtyV-E={uϢY=gQ#-jE]EuբYuѢfZFZgQ,jE5UFdƻ[BZhQ-jE͔B-BI:)2:(2(2'y2Z(2Z(2(2(2'{2%[2'2'2'}2SdFFdtKFdMFd"'271U]uSFdtLfh蠌蠌hEtLFd4MFd4LFd4Mkm}dCcg^tN)2(2z)2z)2(2(2}j^褌FhO Ly@p2'2's2z'{2)Ș&hFhh&行h<>8vJaz"c>2: 2: ^h&hvh3.0鑹"2Z! 2Z"='c~ng ]ݑ`.3\WI7{ 7|C)nȼ{{72%W2%i2&E2:%S2:%S2:%S2#S2 >|9 3Z!;2z%e2%Y2|dy2k}Cd2Ί K2Ͱ%Þ C2-6220* G3%Ï {2s!Í 72ɰ#Ò 2ɰ'Ss_{Ȝ\>=<ʰ*î s2t,UWev3(s|v,SO>-1lAK Zb8ĩ 2pjMK\ZĢ%.-1jWK3Tz.rͰ%-1l]KZJ9Ķ%-e;KZbӖxĸ%-hCKy)8xIJ%-f5KlZbī7̹9snwoK<\bXķ%-jeKҝO-k]K<[=2]]ƾז8Ļ%-qpsK|[ۖķ%-1l遡G_![ļ\xĺGc ?68|d98%.sOK<\+į%~-dGij%-o}K[O`N c/w{7k\x]~KsϹ gt;Ͼs/sWx%/1oyK:e7s/zK\_bXҥ׆_%%.{Kl]b[غ%.quK]s%.qviK[ז%N.tK|\{.|,̟pyϮD|3l_b'B_tҧ#׺`K`3'8%=.X|s/xKl^%6/~Ky%8gؼ%/51~K쥎_ӗewYvgٝe؝euYge}Y~gyexYVgٜesY&gٜetYfymY&g9t6_gyYgeyYg7C̲3,;|3,r8,24,G̲5,o{̽3?[tBYgsYVg~Y=zYg Yg9e|Ygw9ewY6gٜrYfYeiYfٛsYgoYvgyyYfepYf}r 9˃,lr1ˊ,+<̲.˺,+bd칑kdeVyYePYd_>4_,keͱAuDzX'b=}mq/ߢϽqoޭܻMw޲=M=O;uDzXZeY{,keOɲX+bYW,eA5=BzdYg,eݲ=˲vY.eY,ke?Dz>YcY,eMWe\,?#zeSuʲY2eY,kem?Dz>Y>?{\0s_,esv~~Z~Zyzmx_tyoo^\и\w˺ngOۖܲ[t˺eY,ke}Z,e]˲YiiY,(.s4Kyc+Bi˚iYO,e='5̲Y˚cY,eȵ.YcY,keaܻ2m/4^t\,keMq?2.cgY,e=}ϲY'#ךfY,eMؕk.ןie_˲&ZM'l0u#ZjYc,{g:˸[.k ]B|O/v_uвZ_ZnYS-e]uղ[;˺gY3-ke\ke|\N骜雜iFuI7b}韜颜.餜飜q9s\α<s)s 霜isq9c_}9xi9>Xck9瘟9縙c9v8ce9Xce9>%2v.cwݾ{sq5[sͱ4w98ch9ؚOWs g98l9.渘cd>9>c"Cgmaw9XcC 9~8EA9>XcD59XMg3%p޳ǥ mO$96|22Ǥrq.s13s1,ǺrLq.r˱.Ǧr ˱,ǹrq..s_{1'=u{:Y\9{{䚗9.渘b9V؛Z98V[9nx]w9FXcg/ΙȜNؚ`O昘cl9fX`9cC[/F;?\+ǔ?,}6tOy_m>mY_2֙1{_ ۗؗؗؗسسǭǭǭ؛*ZZ?[?[ZZZ7[ZZ'['[ZysڞkjkŞl~k>k}؊=׊׊=׊֊׊Ί}Պ=؊=Ҋ=Њ=Њъъъъъ}ӊ=ڊЊ}Њ}ъ}GCc #؃o////G|1+-+F+x\{/ן5ZYYYYYYRdrڞie;FVVVVVV{V{VvC@+E+Ey{=N~'o/V:{#{`Oޞ(?rܩ~= ;><=Z>|?]y}W>"?_;by{G#o_2f۷9yZ(o/o3'?.2Ͼ+o/c1y-B:y{}S޾)oOq8y{O'o+k>y{}J^'oߒoe2y{wD_/y䭭ykkښu}"oߓF2ZwtKyk~ޚy{< $yN9DyvgJ)yyx~,ϦN)ϧ<%Ϩ<3*Ϩ^s*ϩ<<ɳ"φ<_ȳ"o][<L"υ<3lȳ!ϑ#_tϼ"ψ"4йFe!;]k<"s?uCs^Ygy^也yy@^CYR{##w;z'<9=nΛוuzkwZKPA4TAC4T^C5T^C5T^Ct^Ak4TAOtZAtZA7tSA7tSAOl{ڪ ZM _ _ [ z z z =)FɆLzoӂUYU\VS-UWU[}Ue]_kUYV` V_ۇ5YAZAtWAXAk-U^Ud=VcGh\'4UAK4TAc4YA4YA]1O9{9CӑXЌ=YyWuXЊXГY.eAkfA'|f-ς-҂.-҂^-Ղ^-؂-؂-hт-hт-hт+h+h‚&,h‚V,hłV,h,hȂ>,Â,h*h+h+h+贂+hn+豂+h*hBׯk(聂V+h~(臂v(hv(h["sEA;CA;HA[HAHA4IACEA34CA{GAGtEAoCAGtBA7>\k(h(胂>(胂f(艂n(  ڠ 1 aDFQ`D=fXS]Q`g9 R`Yy>V889љs4s0G#Z`b&X`bE^Zgq,\3ȇ"l(Ȇ"S+r"|,"l-r;'z /oW|<PE9^,Dn2k( l/"|.2"Ӌ/" ^mp".r"|/".r",.2"\-2"\.ȟ⽺cT}ȳ"ϊ(rȑ"+,)ȓ"O*2ȸ"㊌+,-"ϋ, .rȻ" *B'׌*2Ȭ"*ȩ"*ȥ"?:gWIE&TdUUEVVWk_8gs.07)jf)jf)Ꙣ)jb9fESNES2E-S촌*j)"]UVΪY+hUvUwjxU&2zѫ^g\_e*W*WeZcu=ί2~뫚b_e*WUޯ~U~7 >Uޯr桱[EU-U~}dLUU~KV*WyU^zUjUM V5ª^X a~W^3:e^W7*6fUjU-EVuʪFY,εͪY5fU׬GD~tQk-VԪZ}|ZU}V5ت.Z}rqV5Ѫ&ZDziU/>Ͻg}=ϽsOjU V5٪6ZQ:vpVԪZSZjE]^]jUSjW5K_|jU͵VϪZSzjUgUVת[clUj7_sotǪXo )VɪY'dUw*+WYUVjU^r\Xe*3Wk|kU}k_XXZbUK~9>st?W:3l_ejvUͰV5êfXzcU_jU1V5ƪY,eUjUnr#}ϕ︱͵ֆP|ǿqw|FoCjUM'嚾\ӗkе\ӘksM554\ӗk {н>xnMxn.rOi5-KtF^ӵk:yM۵s|^[`^ӳkxM5}s׾tk7qO5=^иn^k!46wt5״.\ӄkzBwr״嚮\{~g=_~]kZx힡cW״]ӵkzvMi5 sf]ӲkZvMi5-w״]ӭkp\ӭkZvM=&2etߚf]ӳkuM5]tSs5MCt\ktMi5Ct\ӦkqMO5)\{Ap\ki5ݸ't~\{yWt{e1M?\ykfWG~+r'䚞\ӓkzrMi5ݹY\ӟkzqMCϜ?`YӚkrMCi5#t{`.]P{?=tܚ[qk:nM5ִ8Ʊ5qlck_ט5f1sMìqsk;;=tۚ[mkmMuM׭5 At#{F~߭g>;we/\}b{̗onou}}%^k~coԪ/RkW[z-\uؗ?w#|N~9ױ/G]w_?wJWjJou=Y t_uj+y5ZXfϫ͍=wr֟-]NJ|oЫzoc1ZwsߟǞcq8q;7a1q 9nb8s>GǺ<pL:ǔc֑pIǜcڑq,:ҎKB0 eǒ#Xq_[ ǺǚcQt掛9qkrqǭ_︝u|Nou|wtMor{wu|.;;qw;G2]oݳ˼{;帯>;x{xぎs|QG:xa:~p<`ǓOr㉎'8~x;x1G;r?vG㩎tiqt<#~g#?xw<:~Xy8~RK/vE:~Ͻ8~ xrzd7uzo;~B׿x㍎uf[osǎ?rw:;`g?q|aLJt|~?p_8:cr-7Xo`}~n 70k 7Xo. nz/\OE \7p{wo` n}o` e7td =ta{za\g OY}o` 2k׹u{L^:uޮw<^:Wyuv]g:cٺunvL]g:Sיu֮su ^g:Oyu>y72~.c^g:w׹[cul^g:sיu.x\\g:Y;G=u>g9]g:k9u&y^w޷31n3{^g:יu?9:`c:[ٺ5gٻu&3yL^a\\:?׹uޮ3x]:9u֯?~sϹ3ygyߩ5ͺY-c]uM+uʺNY)e]wuQ_e5ȺNYйfY:e]u;5ȺY$d]E漩3uƺX":d]uSuX`]u-ֵúX1eiL[:Yεuuݱ>?:;j9Ze]g:;6s ]g:oyunkufzs ܿu{_}wzuCnh 6VЪZu㛂{wrOn|cg5ܸKuCn C7ЏtCnɍ{5㆖КqCGn< t64߆|ozk 7nТzpCnh -74Ѓ:qC'nh M4ƓϹa6~lyO`ys톆P?| ͵6݆\Zm{cmCmh ͵6؆cn#4 ӮlCmh m6نpnCmh 64چFh 64׆fZlCm 6tچNIlCm 6نTjC/mh 6t׆^нk 64ֆ@gC/mh 6>JZiC+m }6tX\`^+zeClv `_758g6ط mh - >npv:fFɽ`Cl 6Ybg%vعoK\-qĹCK,q’ăJ,q JR.8[ZĿR8WJL)ġkJ\-ēOJ,)YK(YK(mc_eܚ^bJɺ^%zz^bBɺ_J%kl^N%k}[%km\%kpɚ]%v_v%o[N%krɚ[斬ץdm-YwK5еd-YoK55d-Y{KޒdM.YKd=+YJֳdm*YJ֥ud*YJֶ5d,YcKƒd.YKOOto+u󞵖%ezZ^%r\f%koZ&%gY~%gY斬_p ےd-YKגd}-YoK2f].Y{KՒ5d-YwKݒd=.YKd-YwKݒu.1o=Gュ\kjzZ%ksz]%kvɚ^%k氤sۻ<gTN; )1Đ[J)ğJ*ēOJfQ9%8S._sĝsJ)1ħJL*g{|)ģJ*}.`Q%^UbV_%xVb\w%ΕX_gXcld&6yɵDcd&69c6ɫMlg= &69ɱMnkS<|&6yɩM6mEXɡMmrha7l?dW>Yɯ͛׌ڼE86ɬMfmmm &6\>4εMVmrla ]CLۼ{#&6YɺMVn#wwGo&6YMmod&6ɼMmpqd&/6d&6ɻM>nqO{t{ =kNSιϩMfm2k_d&6ɧM^nt Ο\qq&6~NpMmnS&6Y56ɺMm2nׂ1n,&6YɺMvm2miLd&6ɬMmlgx#wvom?`;7yMnE/k>ntd&G79Mnu&?7Mvnqdsp&6whg<&6yɳMmlc&7YY9.qt:=7-nu_y-nnr[|݊E'k8߭|R䚽[u:r1r\3{[b->nq[boX-o}[L2V[tr_Cl}Mp۽xZ{}wg[ZcK7li-=us–F[b.[ZaKl[Z`[g= Y{>Χ6ϧVΧΧ~ΧͧͧͧΧΧ6Χ.ΧVΧ6Χ~\k{3s>ut>5s>5t>5t>u>ut_h }^>|||5t>ux>ux>v>uv>5x>v>w_kG-OMQSSSSCm󩏍5AΧޟwov7 jqڠ6 g:ݠ6)?`?AkPA]mPk6 eڠ>6~v6g _٠n6 UҠ4) jJҠ5+ OԠv5A \c}\ڶנ~5 tXՠ67S jzՠ~5] jTԠ>5] jWՠ5iW!1{QA]lP+AkPAMlPuA mP3ԿuAkPAkP 5AlxȲ^6 jdZ٠n6 jX8m]RgGkPԷuAlP S5A]lPԛuAjPԢ5AmjPԪ5Ajh{Mj|~6y eՠ5 a۠.5O Tzՠn5_ Xz֠5o \zנ5 VZ֠5Y jW֠5C jMѠ>4 jLZԠf4 jH֠4w jKՠ4 HzҠ4/ jHZҠ4+ KzҠ4 jAР64 DzѠn4 jHРN4 B@hx-o DР4@y=o Gc_)؏7:ߠ4 jAo 7u7ZxԂ}hnn 47&:Dhx-nM6&:DhnnM46&D_hnmM46&ZDShl}mM46&ZDChiMmM46&D_j}lM6&DKk-mMN6&D#elMtf6ѧ&:DVjcM5ѿ&DXjcMt5Ѱ&DÚhX kaM45Ѱ&DÚhXicMt5ѱ&DhUmj~T@ׇ|X4Ѡ&ZDhTj3M44ѝ&D_KНiE=8k~Rr :<Zp :D\ksMt5ѹ&DYj=k,yksMt5ѷ&Dߚ[}k}͟JCh_k{Mt5ѽ&D^p&6&D b]l~?#~F#hdl>tN6&:DGelM^6&:D/fl`?zD7g_,9_D{hpmM6&DkhnmM&7&Dhv mM7݇JdǣMt6&D˛qj&Dhq-nM47&Dwn=n@g&Dq]nͿ84w<Ǣ-tFB[OC[u n-tFֳc֘G[| o-tƷB[hy -o-bKfu\kEךVr}ԡ5E jo3E}jQZԧE}jQZuEkQZԸֶԼEkQZ{ާ=㨓}n<<<~צƶ-joß-wܢ涨-jr٢Ƶ-]آ-q:ݢNo-jb٢-ja:ܢ.-d듇R[_Cl}p$u!Hjڢ-jhڢh-jڢ-jgڢ~-g٢~-g٢~-jdz٢F{-czآT1cQqx}pP[c:Z@En-wݢhQ[=@ޢ-wݢ-sܢ6-js S[V9Go%#ZEТv᭿gj{ߢ-~ߢÇη-jxZޢ-jxݢ~yA_@ТOhQ[p}`_ Z-}Eޡwv{ g Q{%zzz^j~/5K>g8:;%mΡg襦R{߽ YFR{fs ^n^zak^^^j/}@/KR{^j~/5KR{^z/KR{߽^x/u:KR{Ի^]/KFRz{^je/zKR{yԾ^j`/5K RzqԸ^j`/5K Rkz^O/uQ=O\ }((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((s=O\ =я I؞fR^)\&l؞epb9g2,ﷲ}Ya9/4f,?yΈ1L/C4&VK~HQl0(-֘ĄEb%VCckDu{5bo־ oOk_]1H_}׺khyU{̽(s\O=ʡ&5ZRñ6)8pm1TG?Zq̚156c㶪/GyՍc}q]fc <)sԹi= =ԡ~ZߪOQi)=i\} _Q 㼐cs`9sV_Z^5m+wHjǐc]쳏ޅW }U3=~Qpie9BU׎L7u !i޾{YUbZz ͵E:SJZ_[}QK[oyfcڥuԏN='y._7-~W:=\|㯲͢I^ŢUw:FXg' k9S^XX^YE̚ӇU> α ѐMОԗgw0iF:]1X箥)*Whܘ>w[ìKzvDIl٦=٦={~o1iwͩt_ v,5!vԫ~%uLQe.q_l_TvW̶|>r\rTYmJԵD9Tr=u/KRC皻XcrPa}ܜZYTb'Uh^+T-6ΔK9}WU]zsGu|_).ԥܚ\4ZEAHKm%R]use׋S과3/9g{kM}ռյg+έ 9&Dbjb9"~WQ\}o)61ݤjؾoJaz>ߞrߺiۆkK¾ز:6k:=fEK\r:ꋊ˽R|q~et\ا>[hBzbتVk*+Ӄc6~Tw@BZ1>NON@~]/{!1zO{SG,~oZо,T]=K598՟Pm ]u3u}o Ӳ ܺ۹zϲl-d8NZ׃4f1}ER41%Sb/ߜ52뱾zXLJKh}jvd!˱s;)}JjU6ПC*3iKho5bp=c,mPNZJKy>kNW}*фNtU_wB\~ȺBQCsz VOS>,FY!:}E c}Y\!)uTOu/_k:un]ikOY{Xjr[ɵt^1iL\^|뺮~_\=k+4x//C_}v1s9㫊K:.[jU/|ZG=&W[kM[cU~L] :˳/OţZlZnn;cb5 %oC+Ԟ/?KL=~N^W_s=X糠X/ctN-ъR35%Jw|J}sZb+' knTLzR뵊4g/U_hԢP-ek[(N=7Ծ99>/Zgs yCzNR}6suLoo\e׷ծ\Xv*t(-e!м=.klԠ9jhXrh9{N-~2}wijN+!fS?eEk Q_!e?jЍԐ*e9ZWUh4ʐԕ릐,R,}Ps\9gxs`L} }>ZSjSlej솮S:ǺJQZ:$7B5+/+ns}]q!kݵ葥}?G^qH.AJcL?!- ynw+vB׀YVS{5Śo9rgWZmˏuo^z{:g)Xے#1qeͧ~ XGiLגX"&BR_R؞aU\who]w`^[$eL\pK?ڳV`Q7-ݼƍn*ky[~|BRf=rL) }kwʾgy]FYkJԄԿ1Y|Y{uCcϪ)}HX#ԢNUw}Bjoz2o'zc:U^#VbZߋµY5uԘwKyG YsRRlmEvͿ:V8u\sʥV=-a׽Bu95cgum/&R ߧnN![]9zUh|^Eu:cboKwwy֠,~BWϑ_~J?@,U׻\֪y7:}é}QQ})ZOW.MYt’Ce wvU#cb5u־a(,=˯sb۪s\i}_C4-f>?Eвjx5rilk?ƪ UUQ%WZbjHmթ:U~Fn!UjH?5Rl,}gS{*QǾ:zoK =gm-,Ds-k'?Wd{ĸ16yilӻUIUǦk]>c=}dT{]RR{)ziR^[kG1;j= պ}eZtϷw5ʮ#FtDseh/rN]}vB"qr}c9v#%~|Gں|<鏯za=r*QUmk{ {=MvfnUо1Ul[zKCuJ̚M|BzN;nukAKWV{ѮXέ͜5ǖ:15-sjߺֈXccUr4NE6 sS|kW-1__R_|ƚ9Ԟ֧cuahZr1_hT|˩M9!X sE7jkݨbjy}P3Zw<{]'.Rl5dN}pk^*U;Y'\ߺ)Q>P'}J.j}:'TS{A߱sۗ{!$s){T;eu54uklޛm>E׉^׵'1.V˝!Muȕ?8j!ޅhؘXwFie}\B]3h~Ek9e5~BJ|j~XYcgDQm*=&ƜR?BFlslYg,[kHHўx_V<[YsiWl֕9C[ڟ.vnE}h\Cam]5/X-gJҚ9T-R[roY|kj CBjPn ~lYkl_:;{~٪o=.ǘĿo&k'>9!X+t!&%B{s}Aʚ wrg]GqN>Xz^=6]}u)5S;Dž54ϮhoZeyXMYUK)ڐz|$׊z)+/бc c nSS=g.|2}H]W/`=Kޘ-=pV-;֧5_k5ϘRnԦ:̡c;^לrU#~חvs/]ԺA%[j_lͶ\xWmɩ2RKBrʾ:T1Jy k::NW1U׺bQ=6G/Py^Z#ɪzmk\t"N]q5`~kW!F3}U~SOs<ĩ瓥X8?ڴzo9R:ٟLLR*{{oey1;5_u=G1yٮѡT\ȱlIpŠe)5;6C3i]b~e>ib19ݧetz`Ƀ}e|脥4\kV5S/CW9|ш>2DBqQ"]WUlV;fzeO\SX|H,B붥uSO94/W\YC=G;91t~ߩ81v CIknNMVtӱySrnDe杪բ5X념V46\}tt=>|eː]~!:^3pwkn+WOTUfgBӗc1P+!\4ZSwO[;c5~/uc-78,:U/!O\PֿnRY{#:={1yX=N˝my?Ğӑm '[z{;*o{> \=MeωRzߕ6m*ݯ9X{VW<[?4]i%i%k_QWMy.b3WSWBk\}|Z_!%'B_U%rX)zzu ō&O7&o]qjš;uwFust[׋ɃcC_hYCڻrl5W2^XsO=C:#V,=CO,:ϘJ3bUxTOuyq^ vC,꽬VE j u|?^'KNCL_eY\]c rLLr٬,Ns5O9nKRb*1R>[3}>;ze1\FSzNX4lK\:zߒ)JȞ>M/-(E_BU@'e6v)F}E'g2[Y"g_ә:\V=u{>J|R:>>ge=7WE]Y#~(u_]α[f>EtώM1σB]L /U}eyXsJ<䌥?ЙԹwE[7Sh?e=&G-Cм>{ 1Wg~wW:m:/w79Ɠ * `{s< 99ӱ؉;Y:m_}t5Mrhkw^2"7u}]_u}]_u}]_u}]_u}]_u}]_u}]?)z?_O9oOplsNu*nK]9KCVJlؐ|5S~Vuki{v=-IַԚQZ[b%ƌ-圐,WBgѝX]ʝ1ԉclR~BQZ5FcN+$NC|oOʣnhOs6~Z ke9;d/]/-X ڴnՓrCrKkoZs\ҫŜFjjgebO8wLFVc:DߪЩndžNrjM{O9H9U?9޳O:וUg}S:[1cVej[l/kޝ!RCs8zc[2vh\-Cr}^C5O7]'CYusݨ>&d]frb='a =s~Wsk e=fX˽y*ɵݿԵhes+әx*қظח#T,bϥr~>/ n]LTu|:_?B\G}(?Bj\P{遯 r׾[5 粿ok{Y߭hOCB:|x\aŹ*:4C,^~Y_z]kokasR4΢K15;f~z_o}qX낥6[Lƒe !n l[Θ+wLDCc!%FrTkn@?vr 1=#Bcq䯵Z}U~Ӌ\U_E1o]VD5 bW\%۷}Kӌ\U޴kVH}I츻r<29szLQqu9uĔ~qZ8o1}uroVRceS_uN}V9%r֏n8o]|v Tl3sӽ@Or׭sŏ+g}=MY] UciNQsp|H u_Bl y~H^Q}qϐ(CJ/[qe뜲z;.$o\>L+v;uzhMZk}Ss胥~~qz*К;&6֮e<&O\vmRO^SycUneY[kھ{Z߳uS!総jSN^H}nZ\e2<ɝU\ȷ>ZC{iN?Jw|=]]veyu+O|19:z_m^/EW= \׹.cEs)Arkzkv~fU]5s][c/os3՜ӹ\tCj1O9)뙬>WO> W|_伥nH爋掯yw~VwRb}\f"s1αU:vRq9l߽Ժ5V_S[twL;kRU^LRG,B]S|ǖŭu:U'(W}Ll^9KU6؜ZTgNL/zΣrUSks;ԓ{GL]{@.TNwYn#-Ϡ֔e=,kv-S]葉?-een5vQ{lj߽RWrkLh.o"XsP 99B2_XbcܚuA<֗i~ݧ!z} Sq}/T NnH/sYiCW\j\'de-k޹[YrbԾl<}VTյ&nOնi\Z5467V'?I]Pt(ڡY}\'cKWM ,5wRSNo{,uWa}J]}O19궥^ѧQ>}kt(wժuUEwP ԩ}?qbz[Xs<.fVŔIѾPmu&氭|s\/&~(t=ʁCjYbWSsB誫t#E'9]-yZ66Er_3^dec6mn=ctݠPHYչ&OU\u&Xת8}EiRZ::Sc-5v,fc3sczN_*Nyn r<]CSz;K=uZX_XY{>ļb ܽN߫&c*L46Tʞ3TʞW7}=M 9&qKmnKVtگ})ufTw{9 kNW_-eW?ۉoL.uñzh3rkkg- ];z߫*s??[{>W-Sń!3_Ɯ)s/|P?vKҩq^'&,u;&}Ytjޮ=.氋/ryZkݢ/7C}OXf'82u}\ho-.˩gN2Nk} %ǭ?{U~6;ZI]=k#Vs?/ymO+U>Kbs5ԧ!u*dVgK˵VH驋b1U.?sDs'-&ko1Uʞڿue+c4l&6;ٟ>Upc\cz Kӟܐ\36czߘ\S\,,S/[h qݞ:(ê9bwo,ze>9t!F,6镪!6SkLhg>W~徯u\e=XUc.!}[κgk5Zll -b{m1l<29nۇdٽB.-UCg):3:nC}:mXu'kRWgܩs}=tcbfrڷf!.K<&G=.oe~ˡ{<^ugSȾXy/9zR6זĢkek]t:böw'e~cr毜sM-rÒ!c ~!UW]XKo]t.{~گ쏩r9zn:&uţ^u΋Wd8ΡUxt8e뜟mϺW}r'M޹|[׏gz?_ڭ=AU1ֺWbz(>EJW5빚eEtO[r-.Y~NyFk9Y{\en;Wsǔ Kt9@[;udNSp)먜z^!Caћ\~:nbޏfk~ky^Fc,Q1e[c{:K:瘋|Ru] }O׸aɫqQk[ctug ՙ(%T|qi9>5^|:8 !'rgјjA-~̭^ѕ߾եs^uUþkvn<7ʵI9[3,={z1VV](Ծ&ux;^[ujU֨"]ǖ'5*- !5:t.>XɲhduƐVar..Me=GLO.q>)qW,c1O1^g\v y훏g|=4&$+,VT(G^ZtY`)@J޺evh5oS4?(ߔêPus蹱٥9gasUڱy7_rU2uT^!Ε-kߺמ)7^?^E-ϝۡVg9#CessGVݱjgv{:Or>g&Qg]zn{ixߘcBrk*Qv{͔s|=߶py)κ˭[^ tUh}Ms\riB1Eu3ERuENOUR{9ų+-ʃ55ZP|Jb wHhrZbb1$'}貃'ER Rst zLUsv16y8YgM9Ϊ{plޣ~U[ mEԪh>۵ כ~_fUYϙRQV]gUjEÐEX~ʘr}qx69Ў|Q[/eE+m)Z>h_)1yNkxkLb5䵥=݉uEC5؟juJ- ^ڿ[rWT-gOLX߮9Y̶!s BtCۇ?4\|߮r=bu0;gmao^ 7]3ۘr-k}yyz1xRݕ*m؉k?mZ/ۗZr:JlvhWtLu9^lrm^1~;47Y/?>&W= !DH&2׹֋P<:a|ȑ!9˯m7&W潯q\sK74, ɧ:z WJCS_}/]c}c~ñ*٢;VmzF&:~n)kÚALK'UOݿRg>es\>;p!yi㪊P߅<9Xlͷ꣫[蘘W#6Gb_{-,ZړeC=kO{~SٞSBsZCbzO'g>jKj:KXc.{GDLRbjy'c}ќ]ע8y.yYS7>k4ՋYS{߭5ws}9CMMs35r[bkis}lq~zy׹>4{\6)[;\ eņ~Ypc\߾ĐK?,9m7ByR:z{/;S~^L_R_=s@>Ͳ%$W\ת>OɻM}POE^tOL왣/|!ޡLYtwLr?Nwk19~BLc6l/b6m.[Y1kR\֏ε&]y@ws6w>yTmdnDžևnA]σrLnyZӿl]P*:Y;qܜZp\˱}XblWk|kpiEg,>h\|tb/&bk/OsxտP5]1:Η\ ˢ<^Ƚ=7 b39?OуnqmU]=b㳊͆~գjFU93Am?[_EBLj|ޫ*ǫԎUm7k]J<['e rL~7kf+,:TO/:}n'z֔B~K>5u-CZ^crM!@YgU 4-=Q6tR,PhlWZXR}ϐ9~g#x)ڕ{=XRsеuL2ZSBl&5YHH}Hyf *rhJ~+U<^Y,:fQsipJXEGbz\ø{>z1_ݱҩ{n)}OzTW=+KغarU={c}-*ֹ!tC9AsVm"~}֐h'wa}֕U rhJT9ꑫn-=y1\iw]փE=F٘ST>KYgVcUbUjf7U9WrNZ V=|hLCj9o 11YqA~nlyη(/\/G\Yům(z?d.9Qߣ}Tw-uc:n9圢{XEˬΥ!ts7y's!q賓fWN=aUˤfUuʹO{b0U[VӭV-?#$~|1y֡>>Z;b)b_mﺌtwlf˳An.%_}^!UU[l̇Eػ/YTqNê5:G EYƘY"ߩYlԕ[)=X۔xYܥhY,YcS} b>61EoSt9ζ!NBh[|5΢֚'9OW/gBn\'9,S|_COVh\a Y3X+c拥:}W1uߙ-똭u,>-[BּLWlZ,/?녲Z{c{\V8C{<1VUml Յ|IYl,|h,11~J-n:?c~?'/ߊU5\crBj{n}ϩB&LlRG,}Wlӓīo_BQ>HіN;{Ck[Z:}lhjѐhYj}H bX?G ws y,6+:.pqn:7g7,uLw)Ee{ _Vm#6K?QkTd?3NKLČ7=,Y]}B\,qN)-Rz:W_Ph9k]ςBӵY{{>}>(Ww@Br]g_QeU|ɫ\㳉j92Z_Y -]菥FdN}+6-kR-[\:15(1ye/]5:d}VE Zb'W̄CSjP]^Rka_.F)-5W`|55XыhzvVֺ_Ghl0u!˒@x&s )C{+ckUs=+N]\6\G~>3=}nhOookkZTVQGs>T 'kL!yCGS }8kn >GZ:5ֲ+3Be̳թKe=/7,=MhJ~ەîiՇ:馱tiyLn]Rr#l1.Mo:Q:RϷlߝﺟӸ3ȹ&C:RWO^5/!/>XU1:c:Pi*1;uϧ٩:+Ps̷^UzˎwN-*Z/[r2ϚZlϱňeZ}5ҷKynUc]͕K>!&7r狹kN[|FKCrU?Wsx=rөs/|f΄֡nHSL㻯F+eRbwrR,q;?%V#]Ԙ{ŬSS{ _RTR{bZ/ctsz>Ƙ?| )RwO>ۆ*˝gKNZbLsy[R#r3~%:G^s:k1jzvݺrgb4}}^Z׏cz*֝uN;?47|C#e^w8wU !:b1!~:-Us|'5u,Vu|s=BիZ WTQ]lU۾ݦE%bThOګ%\cXW/kUnK9rŎsBV^Jmwk E}EC?U^Uŏ)~^Y5ǣmnϑ;÷f ]K._{=sծMuLs:dJ ^:czJKꛜ_;FZb5Ӫ! +>iw-dc9'5n(4o~9ϯWS>W.\}Y\K1kk:ΥU֚ŵZ]ڴ]Rt,71kz3^K-L>͉N~UTg-~ }^[t\5,51?Vu\a?{!1ަh@&h_W]c^x}1,&:uh)?$,=ZʾS.v긲\Se/lKS㡪ܫTq2[ľ+~w>cr_U9UdZ,dBRM纽7L~?~ʢ97ekܽtiu5sh['8 $ؐq!)T:Wx }FkmOZ\RkHE=hh_w#%'bbĥ{^\Nhwlޤ?.[k޹_wj-d+Ob|S'+_*zϪ1>7Vql״W\=VX9Ab^o=/9u VEcH=ab⠊꭫ GG{9$$6sOc46FV[YŇ%:wk,ʗwMh& G]5s+^rlgͪ{}ce[~Rb5:V9z2vڳ]ro;|6Ť/qR,cK9ޗDKw1&E[1JH++8|Ϫ)?֬ v7LߵCjXSjuer@t·/YVhvc#ب?-cṵXIW܄Č+R|!v9'-cq)G_-=(RT{z?lu.}q-K["$~,s=Z!R!?sʁL5J93p1\zRRƖ^ Y:Yz7ޯkkL]I9u.c+^^'~hޠsczϢXB"+_9bk3{T]1WeM|+\ GN 9cWdס69RL/}rZ,ȩz5Es]ybuеEY iCѱUӔXK}kn_֧sPi/-c(ح3cuһ+GL|:mѭh+sy]|7+ߏgjRꖍ3FcՊy7n˱!$7^׋X.}c_UkPm[C/S&Xb^NϱX z<|\\&!Xh/\S䟘|,riJR؞!Dr㳓/R))Pmlպڗ)iR諸NUϥk8 Ѻȵ?;MkR{ИUH~o6'V[\5<ėkK,[>+d|mY|$2T-='vTyg9ykTT[b1U9vLԑJC&tV7Ɗ+n~m7IC:r~{su^#&cjuC@~:"t,>*>.Uܣl}aE^꺾oL!k"k?\ĺClo!ck+cOks*5;U_{UϏu)q[{U_빹{"Zc"N[-߈} j=_L~e5 fՔ\:V,/=Cӗgе7!QsYPƬr蚹bz~|ѸCb[VuV|sJQ·V>1GYަ_-D}SJ7U}Q]1ԏ! {|sŢ\koinݷssyԎO+}5!u]#UuV'1TwO BHޅsC=uNءyz;׽/7tKuzcRt5}M[ZkbzبA%[C1s*jkM,aB)}M=}AQ-ʩ)aq!c{~͢ZaBϱ +b0ֶWz`ѣCiej+r13*>u?Iu~lXgW>B!c{{ vwmf!qE꺑\C2kiNn.Q~T ּjT}y/Am[&eU:Z6njU>Z{~Wp]ݠ]+&5WCNnYMCzy =ɱ赏=xoUDUװhَZ/b'YI9u>})Ϲ؞/w9M=;7,ϣs՛o5LcbjlX'UKc?⹐-9Xk\Q[Y/SߋcbGu6~К#1:gMS%i3B굫+޹֬ekːqxޤqH]BKS>w w=dLi{Kc5nA]F(zV-r!%*-s\+U.flX5κUGmﺟU-f蘭53u S'NXfх)q:޵֞Ӛr\w=֊~%ErgaKu=SǕk!z'^[ʑg.(aW)Ϳv ,/vGn\kÊ5w\z-,aZESk1Wbk@:p~w/4b{v9Щ]}ujMЭ?\9]FRjߺ{\6tNwbY@bUOs^칂y1)R4ụZQ'YUdLOd{ml9lsgk 16Zll q+rBPEV@}[sNժޢ;c;殳:^u= ȽVѯH_TsCkT1^Cc7og~뱺U+.˴#ES.Z4nM7ͫkt";jPyu+wosVUϻ??urVԃt[VE^?.Csإ:;GHYֽyA' XWFMNV'rU?yߏ]Uz=Guj{UT8Zc!uk>e-.{oPZwY~oذg=R.FU@x[gby?wYrJۄ:=c z؟S\EC_9TV7j#7CU_!=Cy!ј\m_,ZZ[jgUTWYU=;1ܾ KHVfF[kt:VWK,"V9|Q ww҆n9sYȺX\7s~ULѺb9(;#Y*vUNQ_>>rMK\y W?e RZ:;}^5n{~缫ܵj K.W/K}sLgaDž螸8ץuUyP!u5u{nުzsrsvHcBs,UR{X;oedʮ[T}3)\93~sR~cپؚ;yǧĮKshdJT%M\s>)t{dU}g5y~LRlꭺ@L-9wxw{\HΣp~Usk>}y5uX2jSsn>}|E?񹞁?*җ2'fccmoٟl?w)؞,W [QSjVǗMYe?$8PzLݪ>ė!v.ҷ*׮._ֺsrˏ銷+xs< MBz_5~jBS<mNYL1XSU]}|lNĂOCԋZrFS>7 M>ۤ_]:Sٖ8Y+ Ք\{?۶~[êzc꽋jtµ{[w[1k>Kj/_i>-y54V_쑪z#ѵF@~.:^kFCi=~9枩~.ӯ:zXih}u5$(fLz-KN<͟NX"_ ~}.Wu̹Y#UO.=6[ŪUq:9Xjm G[-BRK?Ve+Q߽BRtzheg_xu~h}Ռ55O|jU1שsCӟUzb0%Gck@sĜ=]>N]/6V-T:~1^ ܥ)=ٍe+[XꇯL!žV7bz|X;ul;kwp@fH!!Kc{_mN;sy{'T|>/v`گg1Rc%!][B.As/1룜_bM>hmW]ԵBǙCB5m Y2媈źeC-kXK'߳閞>u/b8SqYz/5.,5nG'wj+Sv8[ ͹{-ɡAMS^wnչMc1:Vd)lS{kjxDUr= 9suѪVmwo./W-Y+Uӭh[UuUs[T/s^hXznI.}g::/!}>7Էu^/^*RVM,Жܱ{LݲRfZᯐ^#TB:US8&{5޶߾58 YZ!1F, yk_1Uh_lle.HBa~SZ/ct[_>/t_m: r >c䥵fw|= cBjwݹ9Zn(t+2]mhֱ}N;'6^C?!=u_h_9c]BgоԚo-cjUl,סl_loQ:L\IzeKh5ޫ{α?is5Ԓ<К[!?g#UcO1cm7kd}B*wjro\dD_EzO) 7.m*^lwHQ=g#}KhlZu)EC#eSCs5sHjǢ5y7rh⓪rulbU]S]ѳ{qlWa 96s+F:Y7C%n>Us|+2\PMv)}?ru~Q-3}1=k׽C)> P݉yZr>e[E5ĪM~k&z|ߗ{.1sXkkν̜u ÐYU.1yd}k}?bcε*ϭXtcs|q Z,:ݎ>j-IsŇ~cЇkZ1[5;M?\gs/:y/{Uŕ?u%ct՞y/Ƈ>T]cQr~nөz-]~?Rgcǚk1Fϊbq[QDk11V9D]qI> L]!Sh?_UmNݷ_~T~Uw[HvP8\ cRu9c%}q13/eH޺5ҳ[iWhߟ+/Z:7XbF5Nk~'Y][[51gu)Z~RcrեE& _Zo|׷ܣb+!}\סyZzĐHRNWE,uc/S{:ꜟt֯ǔiꅫ/赲HB|덫cPٱX+;r^YM|yHg.l s!Z9?I=Rbr9?~8qKs~T~<+??}\{{miUsst>nQ}~}g͓\yu=,U] _l_C;7A,dUK\1RCW\7&-՞Ò 1a=v U1im?u빡u#V:c|/t sWvKJp7Yj]j_ԩuߔxNz-1Z0PKջQgl/%Uhoc5UDN;UczNБQw׎=?b:l^9uhb>̥1OHM|_#W#s?(}ԵNpgX|Z}ݛܯeyR,2_߳טkU޷Ϫ)eKSw~h^kT!:rcCzvfrnĮrS,Ĕ%-aѩ=E.է\?z_S=.k=M} ^5T=rQkULa Xc=X֘NӪ<.4V]҅XYgLUN\RKzSTcnr,9JZhISyeX?EKF_\:><ϵ\?ԗ\.+>|ߪx,Ӊ:X1]+zS3MhZsgf%co@rjWHʭZvn6n܊|UۘZKOrlzol! (rW8,TsqYm )t.EkX}ÿ19kW^hXuG9>{H׬);i\BL&W?Rv**QEƧ[W~jM_sܯQCr ]sxmss@:~e5/yԩ'?<gO;vgЎsNr'~O9h7w35^O{w^;N>mَ}r_CxةN <#疼;^,_y~?{lïC^>~ɹm?ԑO#{/ ?}Ч?O'ԠsZ=l￱?W{,3=sP{O|?sL՟=v~ߡc]>o?t|x!o >|riXC=(f#~do~ ΁SGlᥟK;AmR&̘~:{n{e߸C7^{`>9ɱӧ:fFÿL@0~G^`d[2V.FٶǶ# 7lwl#?gg'Wlel )6F1A{|BllWkl6ۗlyП`Sl$ b<Ϡ=۟elۿolu˞O$OLd6m~ˆ`O0'^a[ɶm5b-~-6" l~6$ r q6J'β'>a)o>g*۷l?q1zb'4vxϳ96>y9?WC?ܟ[l($c4iL1l&`|7?{٘`782f^`59 &3e=l?{lm0q8`:f`6_e{loF &.I$ ֓IrIlᓋؘϓI$9ll?a''.{=Wl %uOE=zyj=1lذSSGFl/SS_a˧cÞOaǧ{ [=E>/وȓ4{y<ϰ'Ooșȗ/l'O1ק 6ls}<䧱ӨϳMg6m:4:46~?džN=M<ܟqeF/Cϡc(~z MʜC7C/cCסWnCPrjOlP|6y%߇ⷡm(;E׆CP|7ϰῡc(03 E⿡m(;gX=aNϠϼueCk0g1gȥgХgl3r cyX!!wAwЄgȝgСggȝgșglK:XF C 0bf;?F6  fƆOSțaa`ueF&F cð0> -1a0ss ~ÈaҰ8y l0bj>xSÈah0b Cg/kg׳Y,;%ƞ%e>2gϳij׳YzgϢϢ2g'R/=Æ==K9||=C;qЏЏs999s9F0l>f`# #4b:/#?XG0{sG;#ϑH4~$)lHÑ#Hl1:6xID+G#HhHu$38I>]IDG=#ݑhHtg$sIl$nFߑt$6ɜG2k$s|FRG2s$;9ğ#%(h3 qE^"F(u{91"F#ZdžGţ(6z6yb^(5\Eo7\FQasElb(8oQesBG=(2Qd4Z:;9F3G3h09fãcen&Fsh?\M܍fhzho4>M~F?G3h:Mɫ ь{4q5K`fac11<_A/ǰClw`1k C_4a^cc cPƠIcФ1h;ލacj ~n!AƠcȳ1rj süP01Ԉ16yacrf,n,u`,6ecѮXbh,14'cX4c,?KΌE+E_Ǣc#Ƣ cɏX|3^a,Xrd,1ecXp,8ƢcX01%?RXbl,y21qf|Qg88#ƱGCqjz0ycmˎqh93=Gތ'?qCqosG܍#ax5Ɠ{I~<Ǔx}<挧O0}sxx;'>cv<OގǦ㉋xba<>Ǯxxruq>O@;'`  l6zL~ &+ j8Ob6@nO f&0 bg6 &0 ?O` s'r}f@.M݉a"뚉D3qy8`"ki"c>Nd\Drr">HH-X'⯉w">HO&ωb"k uDjDD>~sqaDtr"vH;ObI$|08DO'gМI$1z6؝D-D^NBc&1If$8 ze1ؘ'wIh$$bw9XDDL"'_Nd4q2L1M&&9`2y69Ma>S)4<œONanS4B5œ S详SВ)d q7\_N!ΦS)i BOaS警PS)h0N!P禐S|7M!ަ0)y ?yOA?wSn 9政ˣʩTm*s^N%ƦT;?Ne0NeSTzTbn*>M%?M%2k*JLeNSɓT60Ne~S˩m*}T49MŷSϩv*5|*M%N\33hhy<<<<|<=G+'v/Ss'fdžcylaigFLO豧Q+Ө4bav1NVӰ4dӈi{71O#{Ӱ4l59L<ȋiii4j4r|1 ;NÎӈiry2m4;|1i4bf13u44j4rg4\>M'NCѠԅtb:NO'Ƨәt}:G٘t0NnOl~:N0t}:q>z6Lg.Ct?Ntrzf3 bw:1Π Wg3 eA@fPfPf3a>AΠf _g0h z~hsgPg {lԬ |8Ϡ~3 8y`3f |8 foA3f`q= ~g`g3 |9_V3P3=3Ѐh :{-x|]z~m{~}{_Wz j lֻ/`  j !/c/Df$g3wf˙hL 3L8s㚉ğ3%3ѤLti&㛉_gw3L:į3Gf39f3˙b&I̤$fbLEӋ EbE"|~EEEE"~|ɋErErEbE|""ڋE|"6z,b|ujq>k":4; VYX_͢Eb,8 }faY,zY=gϳ,q㟅f,Ycy9k󙅖f,btE|"6gYkq89͢E "wgW"galbp6&ghllzo60MϦ͚d6󙍯gólx6>M\&ggScglu6q:FOg3l:&g3ljl5y&fm6qC_1AcϡClansbvtsAwP+PK#sXAGks4tq<!Ws8Ci.Z2XWs\j.:1͜K?ys\f.K=9es\e.3C1W91yԔyԿyh ychMoz7'vS?S[A|6u\k0n#&o0q N̹7~o7so0z G̷4oVo tA6s97#̻A4 РhG4w7A_ V ئmX k`}R@S~A^7Ь@ب6Gm2&i2&m&hr&Zd&"Zq ma=R8oQZE~ЫjY-o[{ =nQ-rNS9Цb-r[ԕshO?8Z}/K,K2^Kn`#F{W/KL/K^2^݋z^j]/:KŞ*~ԯ^z^jeZZ@l- P% bkZ0Ƶq-`\ qc[@L- `oZ@<- b~\xP  zg |{/`͵ڰ. |Z^f^@_as_@=_@n- hh=4w-Z.DR⣅hB֣ ѥBh!9 Z8 ;-N B쳐^,$ ɿu!\H-v Bl\bl!6[H.oYH-,N.N B첐[,$  Bro!9ZH>-XH<.$bB촐^`!vZ-Dң.l BBԧhB{![v/^"l,BUE"i5iutq}Z&/6EԥEf5iY}QnYDl-FE"b|ZvvYD߿mZ}K"bi6Z.-F"zE"bf ZD.B{NjМEJEE"l[,73K%sy} FDZ%b%%%jKo/ᣗ/u/თK'/}Zv} D,>-&QUlbbưbbl.&cbtc16\ cbl1:XL-f̋r1v\cŬӯ,&~]brf1u|1M,KOKȇ%%o ƸZ]YB,,A[fX¸wKЙ%t{ ,amY,A˗PKaKȡ%콄YܖP'Kȥ%s Z.!0%j滄YœK%k 5lxZ?KП%j֌Kȫ% ;KaKЛ%e 1ZB^-!SKȩ%bh YݖЃ.,!%,~KјR|_/KR-nKR-Kќi)^J-%1KRl,%RKKťe)sXʘXJL/%ǗKv)}R4q)8\{|Mn=2Ƴ -c ˸2XF-e~ڹ .#/aes9Xv-./?Z/cLe2tkv^F<]ae2l .CӗUeu ZFl.c>˰2rjZƼ1ee~[-cвesXF-.c2rp/O=}>>|G}>>-×}جç}}p#Wȕ>|G+}ض\#WyG>r}JqG>4x#wC}hAņ>RG#H>1>r]f;}^#>r?>b}Tԇ>> #ȅ>|ևO7}>҇_G}3̞~9v^]cp9[͖c{9s[ؗ3r4`9uu9c9.Y-'FѾ qˉrrԍԍ嬵˩ɥ_f#g-Ѐrz{9q\o˙e2~;}_&_ƾ/ӗ_&^gz6L]{Z2c/3/z_^s?;`WWW+4 z{]^^`W+`W++ Z +ԶW+ԍW+خ W+8s1[A@V0eھ]_V+ zh e[~`+VPwW t|vZW+N+ПԷ+  浂^y\V3'XMW+w]W0z\A?@Vlh th1 ZAl+ zڲ W+ъh%$W+וJ$'W+g%񱒚۬$W+Jp%s_Wd+hJ]V+J浒J泒^y%YV+Jt%~\V+*p [VwкUe\ŜV߫вU*o ]ZEb>*UUUyYW1UU* _ZW1Uh*渊**ܫ׫*ru b׫*Uss^E̮Ÿ*v"vWaUhWëWU*l: _—ӳ|[M^&FVSѩb5vX&Va5\\W׫jrc5߮\M^FVjl;Ȇ V߫ѭj|jF'Vj.Ѳf5ZYk?XM\լV᫉c5XW؈jm51_M>k55b XvakIkЂ5ԝ5hbb 1_C_X>!F`5k57k kXg!^+k5hlX}`5ewl55 3kz5+'VkX#Y54a 1MXúa ۭ!;kl_C'XKV%֒kZ`-9|_-bb-XK].]=ba-6XKk}-돵{-񰖼XK^֭%72׵u-Yl,sZekv-~]<֒kkUWWWWWK^%_ş"/NJ ^%_e|JξUU?Ƹ^2WW-bWWUl*~[J޾Jчhzjz֟zz4`=9oY|3s=\y=1gzzbb=:<_ϸףo& 7o~q#Ac;wa~\]_:Q^oטk51Z55k5545r5רkakkhk5s} M{z5k5|c߀om/7c 8myeZ70 ƿomW|@]@]<6[K70 cڵ|;m W6VڀM7+|n .7P6{z n~ۀ6 m9mdNhFi#񷑵Fj#zn7و?7K6ҷn$7oYo$&7oFjF湑9nOFlۈo$>7cnHmD6R6ɽFMHndw#1\7KFv#s:q#ވmD6=&M61M&t&渉<Ěi:¾ -DMڄo7%гMt܄/7Mqyn—Mw܄/7M&4f>݄ 6aM& ބ.n&{lԩM&r~DMDnY7ᛨ盰&zM~ lB6aM`9XD?xބ7Q6f|o6ffle3u{3Loٌom&7cl35l3L،6S6ffl~o31ٌ-7#fa3ی6fl-LoWL\l&733afy31lmF6cuhfr|3[l&63יujuYNN N~nNNN::kיuja7ï3׉uu:x^=o+X@ .oxo07 b b 4 l~A޼.op77  z7| M؂m!F[Xn![j|u =lڴv ~ނmA0-z k-hn[ȍ-{ =ƽk xP_0-Ԧ-p Bloo[n!׷`- 1&&qI,I&z&1&}&6}󏰽Ɇ?ߤV/$ߤI,$/$/$'$&ߤwy\|z~X|X|\|-~&5Mz7o27Ѩ7-oR""ޢz y|yz`x {-"BKbLoa[oQ o[o߷oa[--åzbl+}V-Jn%?[ɭc+>J}ڊrVڴmErV찕xJnnEs[Vz+qmڊ={[韷bc+؊=sln%/me[V4k+ZneZmmbm|6|mzǷmtm深mm66}||۾|&&F&fooom6v~MCξMpww;;;`_ww;;P۸6淍mCQۈmlymCO6 ?mچ~nnmԏm MFl_ۨ6|FMFO.'wFAS{NS3ǟɻɯ5ONƴھ?$w3;NM݉FDwv$.w2Νh'qI\$v;;ɵq;N4h'>'9I;Nƻ1DKvbhNƾ-ى>d;Nk'Ķ;Nd'>߉;N?1|za?~@~>@K?|.|@~akoP?@>/Y终]s=wa].t|6w].g5kq8E¾.l.bb.qEmE".wf".wџ"w"6w뻨û].tk}?džfλ.lx͸wIn`7|͘vnzݬgw7l7yz&/v7nrz79qfݶݍw3n|f<vSCvۍwnԒn&{{{4kCL{`=uz݃N{=ms!C.{X!{`z!? {`=`udڶZ|C<{в=A{|a{Ќ=ue1!0=}y!{=K>{5{^n/>KE۽^{Ɂ^5^a/^Kً%j/ڋ}b{ {^lK>%>{^lzv/kf/5h/zߋ{#{Ѳ^`/6K%{{ɽh޿-f }>z}>첏x񽏞{؇M>tx񱏾buxvG]G`GnC{}ia}e1'G؇7}cp؇#ga}>eyCC}ivGه~^}ivڇS}>bi#Oȧ}oهC}>G;ɝ~챟ϼ~rg?؏>цaGla?v؏'c?~i?m?~g?ڱ9g~滟:~t?s|'>3~y?9OG's~M8&@ P0>?@.`X`x<8H>>0h߲?x>9@rq `A}u<AjAq<>H$n2Ab yz1Ar =HpDkwNd惌 =AzۃA |DR'KѦhAl};$bAb yxx:H$SCs;|1C558D<68DqbCȷC!b>9C!btBC}9"QÇ!֡ȕC!sG!r9s8:Dm9|1B0rOa$0:{9̼30s:Fk3000t:\:LfNə0zz?fёa09s?L9%ɣԟ0Zr 9L.fs|:L>falp8cԜaaja!s~ȚCbC!9}V~F|>D+?$.?$>?}:CrCCC!!~CbCC!!!11GԦpG#G#n}>lhG#b#~Z=##jGGG#QR>?8G}aG| 9B 9F=?^>|QӏQˏ1c1|v ?Fw M9FL#1c:r ?\ok1cv{ cNc1v#ƎcFCOljq|w:NG3q48x9θq8}qq8ZM8o qqtuq48:\;ъ8:N_q|u${;$>O'_'II4$~}?Iu~$?I-;]O2Ilz9="6O1SE<"OS| Μ"OaS:NM)S){ m:Es:M&GOi44yi4sߧi4>?MޜFNi4>?O4ysq&wNS?N; 1{^ yt=Cü033b q!03 =PϠg3dgu8>ÜΠggȽ3 s:C=<ΞA03ԑ3ԑ3Yvv'=˜2,z8K^e>gg˳Y|y-=K?2,?g۳,:K,%{gY,yze~g,1xyŧg+ggʳ,xyůg˳,zx#1syzy#>1sy<Ρ5 lh91y9|X+Ç9vZy>qy<&V'S+37y} 積yr<;?{'V33yrP'>w0O]O'`0OOOOOЂOаO?a y @l\.`   ԟ E. ~/Э z~_ o/[ tp@l_ .` 4@L_3lhOЫ N {.` 9}`nl)=ɧSS)))}SSSSSOOODR>bOOOOS))~;J.~>elۋhEtE"{O/wEփ͋E|q"㹈/.潈^ўE|qrH^dE|r_v\D.2E|r H _D{.9Ev\D_/қ_Er"/bߋ3 ~F}F}F}|Ƙ?}^|N|?c;1gg3 8zq9c}F|Ƹ>C>#6>#~|-q[[[toߢ%/%^~~[z+%N.w_K%j%r:p5sD\\"..e7K5py]B/ ЋKļ.1K%|p9q _\%u _B/ȁK%uغ%bsD<]s|9c99c~s[WW3Y}N9919y9|\>O8No9c}<}}/_k_Pg[}s_0/ȥ///q_]=}AA 4 // r  /e ~_`/2>/che2LvX.eer2xLN^ƆыezL]^\_L]&.32sZ21} V_Ɩѿher21p^&.S3.c2~K֌_#_////ӗԈ/˗o$'_R$?1I I I^~I I~__҃}N|I]|'_/חԱ/h×hW+r+r+ȧ;¾_aۯȥW+lX=W+qįФWW+z"FFϿ_sk555k̯_G_3߯hk5~MM{~M}\&ξ_S_3߯rj777ԓo7bJߐ_0o77ߠuߠ ߐWߐ~C6|C? }7q0o7 68|~_!Vߐ0V=WЍ+ B\&]!~PP+t 6B_W+ vB\WWtœ`+$Wм+ pB>\av B|]WB¼`+h 6Bou=>^A Wj}^!0+ By=P`+z+ s{zWWɡWɟWUr*9~{]ƜN^]şWUr*Zy_%2׫WUr*sܮ2*:pXJ?tbWU4*<ƹ]%2ǫ*sJ^e>WUjf﹆&\.^#/kh5|zZvF\Cۮkh5{v|o54v __C+Q#ak5| -ak5zkԎk5j55j5pؾܯk5q}5=5|x8|5j5k5}8N]gт:zw\'n3:3hu:1|_?͆/S3hu|z:>׉:kԯ:1z-S:יujut~:>*=7Yo7x~ &o1yy7 AtػoC`7Ԝ cn0h br^n0 bZw[=7Mzi6lI{Z&9t/nRn2Mb&ZrXI'7Anⓛ&nRnC7ɩMt&ɼn7M&k"7Y[$n7ш5&t}Ip^D/n7Myyd7sngЈ[-z>nQn[]X"n1[[-}-uqy\ElŸȷ[dЛ[ԋ[-yv Bon-5N"nȣ[o[- o[󿅆ܢgE=E,"nS-j-}-t5[4[4lbo2oݷ[- .ecߢ32oJ2o˷ٷ[r[4[[|-9-1->[-koɧoow؈^aȑwhww9ߡKߑߑ+ߡ16jwwhwwX}###wWKGam6qsXn#nŷhmrM>&oWی6q6yr&>nəm6Mƞm6s:6M>fYF'nim6vFnܷm|rܦ]n6>MzFGncMǷяmlqxMmMm<|O|O|z{{ߣ??c{=Ѿ{4{=~{{b{4{{=9=5{|s/w;w;|tw%wb|~z|_wgwb;v0;wз;cw;~\w;rZ~w;|r\Cܡf??Pg~  > 6??``?S?P ~@w~`?0ș?з`|?~`,?л8~@{~@o@\_wC+w]4.r:rMx◻].q%.Cw]]t:6z8K%_⧻]|u%G⛻]r.9r%Eww.tyE2]z]t.ztyޥewс.6KHGGl#]$~$~d?C?????2~$^~d,??7?+?2y???2G#~HMGtG|#9#uGzs?#'Q=l8GN=j=r~a{=qö=z9Ck=xZu:1{GC;=}qߣGw^q{dö?7??Q[~B'| Dw5OO4X?c?[? ???aǟ1?;DnD N}/DLb?1OhO՟O'ccZ>Gc{Y'ާO,Ǟњ}z}>qO ߧ?O'6h}>3ьh}>5>5>s3>}b>{'nSO3>}l}OOpgNk LL~&n~&f~f?'??L&&w?7??;=\*S"}t)Bʩ"sB'6N,ls>lfc6;1;J]x\~;ޟq.̵\|Υ9?v sik.,\~ iܹ2s\x]sio;q.4SnAj_ xpȭ^ ydE[0@u޿Zpo=Py -ʍ@N qH:ЍH߁4ЃW @+Vǁ1eI @z ~k|@(ׁ<@xa@Xȿ0ASӓh`^'<;͓dO=p=9<'v}sh|˞fwiOyf\t4>a2_O̧ wA:A zڳ{Nx:7V _A$to d d e, p 2G\ Av rCɥ ;] `˟`̧|l` Ip`,ec< `,ui0lecL`G!:> 6W(^?y)(جp c[8uX0_T0OS0/I3!Ch/Dw !::Ğ!26DƆb5Bb<"ķDCS]#!n~ !!k!:BdS< qw'D9'!w!! {=C;, W 찀ȅ@?,0/Ѓ ̾.\@K ZZ _=- xl=aXaLd{, 7 `Gw q}rc[Hc yu!/ ẐBP7-  Ṑ pYNgtNg'\M> w!\V?wnp;7mnp\5\6pã<~ p<9\;Vy;^.ppUop&\~˳p؄&\^˄E "h4BE"B6Ds#dY,"cnc#C|sF98o}#+NvZ7jE'|'/pH/`e"}/o/"X/S"YE]E4d"Z\$E]?t"Y;̺Hn-r,"/E0^E]$"/"|bZLq1=.#bbb,8XOZ,;˼'ir1\nŴ6eeb,b}Xo,bX,bZL+ͺϗ%~w ,wyȣ%%]{;K`gyv .ߟK$K`Kxw|ZX".%tK`D.-qw,.]|p\BKᷔfn,Z˖!R:YʓKͼKeR/u.ՕKeR~[j֥f]*[Iꪥ[JKeR[j֥wYRs.LǖRR3/2hYef\fe]s_2.s,s,s,ss/22\.2yw2\.'֗2|,et |.2,32 L/evXfe_` ΑnHt)+#i#R>DHHHsoHH;Eh-^iΞHEʑHyiH~)tE9RD""=#=nH p#HG$G]#+o#qHiHڞѺ7ڮvhDI>oK4N-;-7#ë*_eU==^ţwyVɥU|&VU_UnU4VU*ޫ` հ\͋yqzo2;a5==&VYVuVVːn:k5US|o112;FfYoX]kXgb}X>X5,]q,ceM,c0WbKz%pXs-VX X X]kXkX\8CbbaKxuX;m*87M=ɶ8w]4Nވӫq2=ήq8;GW?qtgWq|KkNqqvq8k[%8'q?oe؊U~l5Vsox+ʔ2x *oʌʙ~.jUFlu l [ͽƷV3oVjޭp+^{+mV=Ul6ݴͭ͝\Hfxئ6zfmmf&˶ml?n̶t/n36]Ml36mr;|ٮu{ur`c^FNvwv>.2b0NaඝvNevݰevvn8nnvc=ܣk##=GV졛=2mk{:zL+{/uguG^ګ3^k2d/x+OcL+^Kc{^ʽۋޫyh/}{We^]{'{q{7^]~{u^:D-'d>>G;e}rq_>}G̸>ۇ}|.Ex7>>:g}g}rss?>}hyAp.첏kx/i)^S?^ƛ=8{HEC 'dU=tBH r4@[ 4TMQ=%7n$Is`$%!ғ IIt xKAK pH# %,=]4.~~&~2|?\yl? ~_~].yhˆxۏ~ߛ:;~7~ %񗈻D9͗/Jt{&+Q%ʱD<%q]9 ]p^u^ps; Ȉx:g0003$JId$9DGI8J$&^HsI4!I6$SlH$|%$JIK]%u$3p#I/ɼI|DI=3&$:JId$DCI4ld%x)vy=9,~?&f:fuE2$I9y9ogztMdzHdݐLfKn$͙i?Y&|2-$6Y&~2y6.AӃ?HW ꒃqgAY|7A8qNAxʞ:Yσ0;o!Z:LJC{8 [0,r9lv=,a{a9La;a[ %Eȝ;w~OQLO Sh$Stz ~R|ȜYB)ir0Mǐ-t1;fcf>fc} FuLctv1]~̭=vxGɅc~[}]q\V%8=[}iḌ?<{8>nr\?>;ˑr8ΏmUOw[v?p w9Cgw?`??hXA't~N'`t'<m|}pteiܟ6iix3 θ_ϸO3x;#34xF34x=Cgtw9yFv:30<6;=ϸo;CgxFϝ3;9c3vFǜ?g|Wg:[g`u+^2$Npʠ 9A#r#f2`a !3x/CdM 2잡2tP fȕ ʠ Zɰke:Cg;3СWvϰ{>͠ N2x#V2h"~r$Wv -g6gy,MɳƳ8=KguY;gy,ʾgiʆ;8+ʼnɳ{-yYv-rƾ%<4)#2eD\Ȅ2y3Sg< Lg7G3v&fS&of8Sef[*nLgL} L)3v^ɔitiLtg!G3퐩2y5W34Lwe&e`,;e'.Y4e,{d?Y]#7rxN͡÷9q|[>s GZѽ949(G3slʑC9Wy*<;||I>=_U/O|>|p>׹>aK|7M> |:ȗ˗n||)m|ʇa> |ٙ/"+i |MM G t dIQȓ>,*pȘ +[,R  J\)\ `P,4W?BYB+_!OPOUWnB7]!¦P§6>x+BʞB*G!BXʠBڹ [H Z 鱐 鱐 ip(t&z2 eR! eR/-|*//lH{uE_t^! (?.}/ʑuѮEhϋnڋxߋhnӋ4{ѷE^nxvhv#..[颞H|ɽsI^r\Kv$O/K8$3.Kv޸$.[̿Dod%s]r\`I~][h]r^%9.ܺ$.9覈ߋxH^"^*[E|]$|{"wL*EtT"Z*m\览ϋh6W>)EtPǣ"U3]۫f4q*~Ukx}_35=zO_k:?_kvӮ5\k{ OF5<]5u^d5V&O5uMO\k|5}q5>fV,k&Ӯ5\sG\kvѓ]{u^{]]|]/^4yOu{_:_׉]/^w+]!{}c\uߙv]\w]7u:n4xutݝqݼqwouuwovoҟO3GOynӌ?iOştLßO?O'4<'kޟO۟'_Oџ?uǟ,S_/}> /}пh/7_vrS%Cr;Ͽ/ݿ/Eɟ4}7xA7 ?7wCn7pxo߽޹on߾ހ np!/ooA7F;<| \ߐ17vn7v7p}C݀ ~A7`v߲o72oFߺo77n˿7[v͏멿'ro^[/Mo[& fV˿?n?4?>ѝ\x?;U?f?n`1?zn&䑛0I 7ছ,oM qoʫp)n&oιiz&7MMwMziI7rSfMyӝuӬ7zӬ7q~oHh6Nn>Wɫ=5Zz=yýpo[m]oyg<л]{rn?]޽yn5ϭ湵g[zS3ދޫޛ9o>zyC={:Myxvu7߳߭NwKN{^wλ]u_oǻy˭gxyzyO_SϬ1Fy1${^c,"o?]s+r7 Ionpt[unn{k5h6ﶗ=ѳmvogps7 z}om=7 z=ݶ[m1=o۶y;O'Sգpq.ɛ>y}tއt}> 3uvx<_6O˅y~~p&:~sOf,~?uh9|m=3=`;z@??`~z`{= Y@G]y@f?h ykU HCA<ޣ˃nxzf/A9 ,׃ LۃpyP>?(҃̓y |̓|6A{ʈyA|P>(s!:Ȝs>!2CtYCm?$C8x!,|鳇.?鲇h!{C|La{<awfzX&< 0?LCa=LGaZfˉ0v= ~v__y0|X< LJ0/~hf趨Ha^Q7WsE>ޯ(w+"W7x*]+⡢.]QTxHݐi=WJv[n˕\dP%TQ%TJ<].``_ S+٧}*k%TO%XNtk%ڭ+٫ WKx-Wc%>ndJ8dJzUk%wr%z$+Jv$*ٷDx+t%]XuqeXϕq\y2~+är-.2l*leTaT=QN;T+reY]YVvU2=T^eZ Q5XTA5}[tC5UjNΗeSu;Ww'UwsTouYU\Oۥ:UgX]VfSVluEu]Q]VUeTuTy:Uqy:ZuZ8֮._:㷺OjjءkjkkԠ5ikkQM\ԴG-^jM-yVKՒaP?jG-Z\#WKג[-rZ2բZ4WKբZZղ{-ղ{-גu_KW-ֲo-yRKrSrSZjZ %kZ%Gjٽ CpX dH-ג!Gmin 8 ڸ-/j㳶ۥ6bG~D.=7ѧG#8?|W#-=#nG#~y<GG`9ȿ#sXցeX֑u,#uZOkۡ]]:4Wu]Y8Wuh+/ʊvS׍XWWw&+⼮̨kxgzS^}=3k=ڮG]=}R꙯'M]QLhlgz|pQ.z:.᠞ztM=W١ףz2 ׳G=Wvɾz~.أ:QX?J'Q=;Guۣ~Q?#qGޣGՏGuzO;ɣGugyu^}wJ=Oi>L~}9[uv}Zi>}ԗ+i>MZ4ReK}龾\qP62>A}ח1Y_ԗ^Ri>Է}s}ח|}QPRo}Q_A}ASO}9R߷F}9܀'GL9@~4Wmw G@f4O |s4 pڀi5zm7Q6p7c^kk =4n@o74ҀXX6 hklvll؎scw`c6UqX5[c]c~j,Sc5Mc~iƼX78jLWaИ㨱o,Ƹj:1ˠƲ6aX5X5ac՘â1àj,sá,nX7ˍ1<ຉ,nb&&2m"G 6&vn"?عnnBMpބFؿm&tD6&n&M 5& 5Gm"+\h&4Mh -4Mh{z 4Mh 7&lb&{ݚqS9T>4oS69MqTF4oS6oS6qg<<7}sS;6KSSS7uS4١,OF4vh)Κ⪩lkJMԼMuCS\5٦nJMLMT4MS7MufSהVsiq;=|?yq߻q=f~nrq}nבe2qY8->ΓxLt8=̼|諙kff8hngpwb373[3L4hnmW^3:jfLiff pЌɘf2ᤙlF[~ӌϚX3j&wY3:kffvk[ oU ׌ᯙ5fW34f) |=AOȗ'ݟvB?'zp='ޞ' ^|6O't4_>' }vO Z}O 1OS/`yJ`Sfj!'Z` 7c kA?-hۯmlk!Zxlk1lfj![b YBp0_ >larZๅll! q --~[B-[)Z|BN-鸥o)/[ʖ%MwKXKjۖxmZⶥnI-x4ҭ--q-RF4'-ߒ[phI-|K-SKxGKxGKx%Z귖r۲^o[uKnixliv|nO˕\yZ|GO4=2i^{7O˾VJVfmExliZr[adJ+rrSMZkEx\iV0n%KZ٣o%[VhEgLhy[l[or3٭m%[V0nE[13fgd32 =gϸg3gzg?gghKKYY'k˳<{gq,g_?'3sn`>z}N^=x9s9x oOx~^n?ϛy=[˰־[Zǭ<ӚwZÿ5ߴkw@kk aZεk^jM?e^kv[kڍ.|k{Z޵s5 )`Zεkmr5ZdkҚ[㣵[wkҚ[gk8vcOkXֲxਵ|iCmk҆?6Fm-mh;hc6vmc6Fϵ6kc64mF|60hlc6tmܚm,oÃmhncm6حi#6Gmܐmh Osm^p _1/ yn/~/{^ xz'/_^/ 0}o O^{/ضwm(mH[h7ۺE~[m-me@[h+F[mmw[km-Y[խm݇mamy-N[呶z-oe[9ؖk[o ik޶і^W/Ey_ۋxQ^;/EY|g"^,{/E߷/ϋ_}y_t /EH/>xQxޣїK{ g/%Ļ/ݗ` _/%3Ŀ/K|l^q/%G/ܚ/K%:{ɽ?Dk/K<{^J/K{l/K_^/K?_tK2?,k^˸٬/eY2l^˾3^2e=2_q2_/븗|V/˽2^_6f~^6y_vGe\L/e7q;o{;|w;3_NvzɄv8ogvN]+nvj'?};dE;v4]N6_;Wh d};V; N.dF;v^v2nnnW;p;-p֎w۹YD;VyEW` Wd+ _ȎWpxW_+r䕮_+}_%|ŭ{E"_+9=^+r9 ݽ'k^+|m ^W݅쫲Us+UWUy_5:U>yW_5Wޫ{{ϫ{U/GUy*M~w8{_/^<*ݽ kl{MϿo5x#^k_  5^_k25k`{5k5>x7_^x ϯ;NxMNu^}ݬuY: _::vx].^E}ݍ:/W^u:_u:u~_ͯ:o zCN!C߿ASozC7`~}C濁7h MASon7|l{C7h X7`7děpy4Ǜӎo˛ޤ7&=7Λ8zϛ~M=&ޤ7n7~Wo7֛v,orM|oL&lfkOq՞/ۻW˪iiOxxhOS{ޝ^OS{o{]{mϳ؞|{=۞fnO3ݞ˨2jir=_Qyjn2=MY{M{wvohhrSEoɦd[0x o[zNd[-Eo[0xߢǷ-8œo鞷d[v޲[vo-z}o+˷| o4m~2|Yvmq6 6߆t{-|oe۰~[ my>x[& 6|6l߆t6l߆0}ߦm6om]~;~wt;~-#ߡw|#1;f};xߑe×y>1;f~Ǽ; ;w>xߡw;]zxW^Kwa=ޥw]xW+wz].?2]ϻ]&yO]xW6yWkwx}Oɩ`zpyOƿx={x}=ܾ'ޣzOd{8|Od{n ; :v^ :DZ ;D~xx[];xcЁ':ء< :N`A&v0{:젧:Kv` ف;اMvT|wpvptYxC':z#;½=;}G;vcGhώ4ܑ:|ߑ;#=wŎq֑;# :A;c:tGzh玾_;Ꙏn8눫4e]Gw俎z#:ڿ4aݮihxH-wɞ踓];IuNDÝhv_'wf'w%߉: w+ItNN7>]o;}soeޗ\xGއ~}O}Oˀ>,ʻr+W]Е> z+we]a֕{WzJ]e[WUw5_WJ]+ª+MtSWJ]+]w宾oW3w5sWZW9wJWdW9]wKWjn/]tm7ZǺUX7;vnFdA7ws7;ws7 P7ZٿlfnMv|uy~Ɍntͷ[7Moustn[MuF797x7tc7vnp֍V|?x}@} >M}@ȖX@#ȏ`;070;\õ;upppNJ=]tYw}]tYw]t[;vןݐpz;mu;munn;Ot;u{wuFwtAwtC;up.Cnî=pî=ÍCv|Î=~=׃6z>^A#=þ=^遯tу{zozسCv{zW5=dRLJCP/|ȃe4aGw~C}H{C]!Hx9z>{a/߽k/ŏKV^2^E^/\mp lKvc/ p~^Eh^{ٻ[~{n{k/Q/7n/Q/ pˍKrm/xo/_"=} `؋{^_{i/^x%z{ɵ^ՏN_>ny{Hofmtݛ.{õ~mgzl-'{^o-'z%zHo^|o ޾z÷7M>y]z1z27{ۥ7]޾z|om>4чأC[}}Ї>>xg}dgyGq/}h| ]c>>:S}>r\#ȓ>ևwNx>}QQI7isyGG4}hnා{|\}dR؇wʢ|6}K}}qWՋ}ߗ6f_kz0 r/,X_W^}~}WF屾:=q_=ЗB_++ڹ+ڳ⿯\K}W6tЗB_ϷF?ڏt?:~GB?'OY?]OFpOa?{~x'ᯟ٫~~ᱟy?;~vf~^co\?~~~~nɝ~ۻ??[o88Oi?\/}y/uJ=_>y?n˭?Mo|ޟ?㺿v2?˫OpN'M| _bO>O'D;ZD~">'x' >?'nODw}">1't ~>O ~>'~,էpT~|N>OS)>u#~~֧t)}JCSfO2S:F>5ç4)|jOe)>OS)*#Cnnr`xp<'d< Ȃ0_~xLm] Uhc[r,r`o 5}j]~`\ ko>;i{@x4@4e@(} =fnu ^e M @?P @o (@ @Y6@He@>H;>/A:lmA=/oxa 2 4ɥtg:3fvɕtg~3~ etg~3~&?>3~&;>3߃Ɏ|&;>gLG| grlt4`8o0`ZӃ`w`ze0M `^`ln|1خa:XO֑ݝig\ ݗ`mz0q !||9?|L9}[u~9y a7 m ;L ac'a46w0w0ZO0afa0&fa|4L0709LF p; c8} upXppw.Kn1ܬppN#;<\O7pY77˂nzs8N437yc8_ p..Н_ }!+2 ;~[ /h B?~a/p>BF/H__/{ !þp~a/ __t0_myGGc/G5­7 ;#hkF46GjFȳ|Bg#ܶ#:W#4Bv4BƏc#`0BU#p7m?B_##p#uHH?0.#H66#yo 7F#eH FHH|tHY1~GHHn#uH>#;#}H=R_HziǑvivQv9GɄQnQ2lF(g6 w(p8.Gs[~ߍˣd(4 huGɎQQFg}FgY;J(܎({Q8 ;J6ݣ(Eӣxrc٣t(<5ZόpMhwh7-1ehhѾG`Ghhãhy>GGh3ZѴ;Z֌7oiu}Fnot:iu4?x}<8F31ƽ11|9F1icwnc1vc1x1vCkc9F;{19FwY:Ƞ1g 43i ƸY:Fc<12u ×cq L18n˃c^cXz+`,X"cc>cq>&ca2XTcX^ˇcq>c2Xͱrk,X}8VXFKcy,=X=3ca4cq?w,=X˿cia,ώuo!c>,hbM`1a=Gx|{e]8>qh8x8gq41w=8/=>gqnqvgq'8;8ǿxwώ8܏Uh~]895ξd88.9Ξi=vox&oasIL$L$;MM?3$\L$11:&If[u?M$Iu/MIv[f?MrLIzq>&Id,dIxD=$dIv6$W&$$kl2Mɲuc&ddɲd2<& t8YNvdd솘ɴ8&d~v |8dn,[&d9:d{Oe~l:e]'v,W&yort}'dޚK'w윢Cw}u[n MѭShw{{n =L:EN)pBSd:&SdژBS`3.LXL)‡S`1-1ŷ8L)pSdBSxL)d>BSxr L):w LS`3EN2gL"4=<^cȟ/a%O/R|R} /K|i/%/|i/iKZR}/eϗrK~ח/iK˗__K|~+4뗾闹~FRWLשnjީff:UMuMASeT|L=Sis*oʛʫSyuܙ*wTOuMT8UOש8ʫST\LSugon :aT*{WJ|e+zJ|%;2WtO}ׯ2W[+y򕹾2W+3}%'W0J^wrk~ `ܦ48M4קq'o잦Sy0M~Omd4&ǧ4w4wi:v,44 c~F#d4:c47ML4t7ާ˂鰟NGih ;b:O=t4>]Och:la:Nyn<=eo~:OwSLq?G`ݧtNCihcn<<ݮet{Mt6]0 =C͠a4wgڞf A_3d 3hmjggqg}gu.a0313>gȡt?C͠2yн3|32= ڟn32í;>35^ۯykyZFmٿ645}S׾Qiks} ǯ_˙kz5-}7v#|m֯k:Zo~MG_礣yk= =}co 7fF|oxFq|C'ߘV+7r=FFcoh1797Ͽᷰnߺqgߚ[V+ÿo̷-5׷V}Kߚ[Nr[=-O~koy[-~ˇ2[}o-wz;|g;;־3w0w2;N|g򝹾wl;}dw^N'wh;}'46߻oqlNߛ{{3~eߛ{=}}O(3yy&t̔3i9fL6V3k&?3yz&̈́L\Lzɷ3L8ΔK3ywo73LtO3n&gx&gafa&gL̄LwL=gLϔ3ݧ3:}23n&ffL96^ga,)fL6SN̤ɋ3pf4fL yo͢YbϢYzE7˷,7,8΂,}7fnVO&΂,\ҷpgY,7m?f fgnfjf[g`΂,=6_gyffY<1Kvw͖oq;[6vGul7l3̖!ֳels̖ɳW;m=dz}Melsl81=p2ǝ=Gϱ=<̡99[svȁ9rs-ѵs?``N9n9n9ru ㎛~9t>s{]ϑsd|͑!sp6vAnܘ9l^?{`h>>?z~h?p=x\v?Ț]~p s~p?~vAW?ˏGQGGXH?#G~Ǐ#(/ˏ4Ifߟ`$~OO<NO'tOI.W?' _?ɟh'?'s^|?'\o~?YNlq~ig ~g3ϲgwY. ?ןn43L?ˡ_EBȠ_/0,/Ȝ_ܗ/t ,~_x:1/{f/rzŷ//t _h;N/_eU _zW=+~5ϯ:WXk_ͯ+_Ǟn=x~ۯt+MJʛ_uU _ef=+\ k fK7s\;s5Lsy\~ nԹo.6Wͅ\8ͥ떙v zk.\5\\7׍:WW7^Y)ft Y`ߕs53|[`x8f|<`O; W> p+PVʊ@HHt(so@llK< Kq@~@{@K p nh@wT Hˁ k 7G|h@<wo@ @ Lq t.Ўny8O3<>G|Σy2q'{sq<:gy2O3<:Õ<3<~Kɣy暧K̷|]9Wu||?^nnih{>ẇ|w|sϗAtd >2ك]Af  A4$x;~D7A%fx97A2k 2g9"V_> <MEނt{SIނpd 7h'DCA /Av %A>ȍwA.ȭgei'Xˇ`R"uP\ vR0i2x _0n`] `> `> ! `X?X=X6G0mˁ`{ `;d=i2&ݡueB}l?!4> 3P< <5C'\!n<+Du< WONBx)C)3x a!B!2,! qӄ^C!<GB6 W_,=*>fL[&[@ ,7w>Z<aa Qap soFaF a!~ar'&N2&p:p7G8np;o8p\f8oˍp{p|#i;p.3u]{8Nr%}׆1\pߒ p7T 1 p˚pk*\mopX x#[xpDȤS"_|#aFD?DsmF5BFuL"ipE9G"x$VnGXE)0pEȫ9ᶍGFGG"x&0wG4BD".EZdE_dEH."Z\Nj"\at.\$["<-rk/Ahm`/"md"/">ZDk̴L\i\,b/|X-6b~Z,Oźl,XLbݾX-XW, im1bs-K쿄Go /K첄ƖtlX%%v lKľK%<Kd{/[BkKl];n -KdR\,Z\jϥ\Kij)=-w=>[JOK}-R,u_-_*gf)-工nvZRǖ꼥tw)loꏥ:oig2c)R-vXjåb\&ϗe|=2Xܑxhe< L,Ӂxf,2}q;b p^淗ɫe4 ̰ݽLf-x2+7g$l#y9 4 Hm4iH8G9R.GHiHXG9piˑ$RvE4R~E#eW̊kHF#͹zu9a{l9.rr3,8_NLers-7rܝ_rٱ\-rݰ|eXtu9}.  Z\oVn_Qa+ \+ G+t Z7o67o r|-noj6ȹ r{7 n ݀ 7S6͍W6Fma7ڨ7Fm4ƶ7n[a#6n#6FmMѼ2FY^t<&6ʄ(6F;lFQmݍ.(6ʈ66sM:il߄Mrc$7MnM7ɎM$7&Im&ٱ&|m:MIn}hhOlMo3lYmf9Wq36l^l͸۬_7ٌٌvڌtg i}7;6f;l6ffYlAqgfl2p=6aٷjB[̽[do--<3o1^-n-rz"Z[dYŌ[`-4E?n-f OlEl[dv¯[9Em-fߢ{ mI[E&mC1|1WbP Nbx)bcPlKډ{w L[ bNormkܰ r|L ߝ2a[w'S;a^;k'LwN;ͻ_v<;ͼvw'䝝SOQ;ε{mywN4N>;fv%wc'줙fifi]tK]]]v.9 /ƻw춫E̹ ̹wsrLͰvn[7nw-w w˿8[f7|vr7|vnwwzm-wx7-nݲfv˚ݺa7/ aۜn ܻb7]nn{`Gfqq {̳}o=fك=٣k{{x{}^^ ^> p }{^}W.函ʽW^]^^ k߽|>g}l`O~+VOF>^'}^>Or*72 ^?r8e@;(^?/e@e܏O}#~_f~Y_Vw׳~~37CfK{"|euNqHsMo"O'A͓s|(ݠ(u"͔͕D}hDww"%K"921v3H#qvp;L8#:8p:`09p8 :?zh<[<9x]yh?p;@p{@np}8I&ɯ$'=I'<ɍd$X'$x'%$7s̓d\|%ɶ$'w;87pIO$ZNMIyx=ܙI$$zNAO$\$GOGݓs/'$Y$;'' ?LIC2vqldw%d2&˭dld8KdJd3ɲ;_HW2>ld,wy37)Yn%#ɾےݑɼLS28Y%K]񖌳dH[,:ă8;hv:hrA;quO=AA}wxoyAiz ̓NOŃv9xw MɃ:(k؃v;v;({!yz!{!;!7!!sHCv8_;Cx:c!;!?Dt!C8;Dx=dCxH.C4y{9gCuCz9=/0Ovoa{avR[*NR*SA*~ReB*]ʹT7oS횪gRZ*VS*S&~GxWGd}~Gs?GxL8b#2#ȷ#;b#|sx^G<G{##;9+Gy}D6#z8s(ՙG~ԭqT5Q::(^(GqrG}Gy⨹QuGuQuYQeGqpGaGy䨎=cأ?Gov8f:v9Vc8FGpr1:&{9cr=1Yp-pLsc:F_xq>n||\?N?;NGq>GS݊{ܽx\q=ry8=U}Wq~|8Qeqq9.?|kAfx!KЯn?p'h:a '|BpK Z?N=O͟='uO ߿'d {r:i|R֞=ix8 >i2$O4rR>'SOI:9I'I|O$]I;n“<{~Oꈓ>NOSN9ŏO|rCS4}ʼtJ^ ptNSsN)tJrd))ysʌpyJS9O));eS88O?eS?OS2O+N>NpOO:%]^:%ݺOtzNtytNtYNOtJNt;twl:m=ntx1]&3]ޟ?c34f1313388#ș32 F_qӝSgx q;gxo34a ?&F2 Π ] 3h=3b=v74!2a :ʠ ʀo<3̟ACz6;2 d%2`A:']A΀c,5Ysv֬gY9ּg{ּguY~,=5Yz8K g,=KgV~5YYy֌gq{gy?ȦlyFʦl{f1ʶO6>)=--lzl='M|y?[f|O^e?S99z,9ir9^1S<\9΁w1Wsx<'o||o|ͧ|ȇq>\6eOyai5ΗA|3漜?<9?z^Vq^Vy߬y8O<uy}zyq^f4z^^2Hq.墼h4}"\4Ey"/^(/fHGzio֋f(G.E\\wnr'>.K}.%\'v ?d%F#/\C%]y/%{_Kr[.%7%Yy/K2/%]K|~IO]S.ɦKnK8KKty ^d%8]h]Kn"";٭HVPۿNE|T$|kGVgEv*co٫H٫&U.SSd"UDEVnEH'٩ߊRoEXd"{V*k,+"*"L^W$NJpZ˺)bB1J-;C[J%4S;.%n{)%nؖO O:x0.c%2%-S-%%nz(YiJ^KB<(/x| }ȩQ%ĝ_ۥ(Rz/uʧRwn)mJ_J]_JzK^KJ^ KeXKT|)}ʵRR:/o.ߥt_jRʻR{ʶR|-ۥRx*Op[ 'e]f2>.2^._>Xf2;pAxpR&t|hXf2+22Rf2>.2pehL e2 weW&xL2/2Z,2c,2^[W]]]s ]y׳~b+vb+t+濢]ёW.WqWܽ+: ޮ[Wx ;^]WxW ]^GW|\ћWo+vn,[|(gor;Z(wÖ˰r9]r+MZ{0(u].Pr+wF--z\˺r\rèFr|Yr^Nx.rRnr,w۽\r\b}Xnr\.Z.[[}=U7U>JWU:jƫ*7~j2*=^ǫvc?l~s#!Qh(9}OAwT(BwHhn !}Iq8͉'Nql9=84qӋ8 0|> yxwWkM5{5vkkk5t55kxkt׬kd_ïï3__×_C__cs|~5u5kk555go KA}~}}þ| 7 ; szz5|M~|Z߾a=߰oأo77777a kA|>} ]~-{-[[oٷoooٿoߢ}=-2[d޷oo/߲o9|~[[[߲߂o[p-{p{p{hȵcz={{d={{p{طg~={;tw ߱+G?!3CV~Ǽca||>}|;;|}|,6Y{x{=:{t{p=x|y{{C߳ݿg][{{߃? _~7@gy:d???? ~@o|֏>?ѿ?"~d??dD;GGGp#|#xG#t?o|[GtOO''''p2'l%?XO聟8.n Yt|:' ?xe?xa!?yg?go῏<?#;yX?zo#G?z Gs<ya[[.Ϸ\</݃AaA^Mރ^z~{~tx{{<w{/r^{Qe˃޽]u/u/r^r/k ee-{{ҽ^d׽^p/u/sy ^7Ev Mދ p/|q/p/|p/2>p{>wxpsy7C~ty4yzZyu4x27y؋}}>>zs||.}{<~4q>zpsy|t//u_d%K/__bKl_~Kt/_do ?KK~Ȋ۝蘝a'< d;ᷝNj'kov{;@;wo;/0Nho'ۉ DĆvbd^;N?';;Nxv'g1v;;ϝk'p'Nxi'2q'ۉ, _D.DFw[; wvA]]w:`kB&Fw!voX.yv..zbX.ht.i=oavϻ؇]uzk`kkw]ova#vkSX.h y ;a }^5gOCC#g#>ڼ9ϞϞ|V]t?r~x?󻟹y3~ondnlv7r`7t vWv7͜v#Cwc#ww'i7ۍ~܍. v3mhc7YYY }Fn_`oFfnWֲ FGك ك=Ȑ={ytֹ݃ۃݲYك<كO{{{=={ط=gۃ]y9Y}{= @{{=l^ =ȝ=lX`_lȑ@+`@o0 ̃A ~sЃ5;rx{y | x6Cχ!coK†|=!!CCCȊ{A#V>Oc=<?cW=<7#0gŇٳw#&F=y>ada00aap0ᧇ?{ٻ^g/t˜bE.e?2^s/ڋ|˜2y/ye{^6ڋn~K{^~/ B{^h/tZ"bO"b{Y^w/؋ً _EF/{^l#GGX#aO>>aMwFa-@#G a-@+G##@ /A^>\a0G#Af>=<AN>|~{y9s~y~9c!o}>d>d>z{샮AWX>m>Q؟}}a6>l}K>h|߇,c}}}>t>>d`c=X>`r~^CgCca>ly(룬QQQQhQhQ(t((6⣬QhQQxQQtϣݣأGGe /B;B'GGǣccc|1dcȴcc8;?~NC>~C<??`=ƹ11pz1cȾǘc1x1ccc1cǠXc1218qq88xzxx:=M8rqhqq88s9?}xqЏ3ǡǡǙǡǙȥǑK#G^?E.=`O /@=???gB>>>B>^Ny <{2)pr))))px~ z|>^>盧OOGO!wbOa{=z~ y y } ))2)h)h)l8<<>ڞ)Oc?4|9?ii웧ٻfF<~< <,}iixixihii4s|}yilfOO34px@V ббu8 :@xs=={9\:N0h||uXp\`8S Xtu|@@ϰggπgg@πggX33Kπgg=V7ϰ3πg33gX33㙿?aϠϞA~=>AV==?9YYp,t,8Y,s|9>.z;YdYYp,4,,,,6YYxYYY vA 4w"'2Ȯȋ<ȚbgѥYAAΨYAx:8?=w[ gG?y:|?x9<]<籧}^{zz~=NgG>>޾^{タ>~=^`__~_`/_^@Z_`_@ֿ޾_.~ f/</^d/r6yu{ElYEtԋ݋ڋE""":E"z],x~zxa_D늳 й++xi}+t XV <+d \W zX V ܬ [j|ZA+hvԊZ+Ζ+hfͬWV Z]AZ+ bMa;vR>;wӱ\vC_tN:ޱ6d^;a{uvvw2x4߱۱с=͎uu۬':x>;2c-x{΂=2g=o ȷc_̿^{g=39ԣ{g~=<٣GzgOzC=tكeϼzEϜzxG'̭GȎۣg={c=C}>= x Y= R4Ӂ qoL L8@;snd̀A 43@/kdb 5>X52o }X35omfkxcZ5{?Y>\'k5֬u}Z3ktݿF߯ k kpF%kּfkdY#75^Z#׬m 9;؁ki~l 6@Oֵ6m]mX߆umXذ z}_lX{=Al k۠g7~7 :woػ B#radG숑~Fp3]3k#9g7##nqFwDވ=7m/#xY89Z>d#px~9Ǐ8#ѫmBL Xӄ6뚐kXĚ&4!g&Ě&xBN:p'45MȘuMȗuMkBO ޝ 6!s&xxF Č>6C3?3>3x Ϝofl=?÷3xYgs36̚gd Oάuff{F&ͬqgp3{6#Ggdٳ5gl5ޜ-Y ga0\G | hj zu W 09,Yqd߂\o.ȗK%h%pz%p|8y x}} <^v9z^y Zx KKKM^W/K—//A /1חKu_b/A/A//e//χU!aׇ!s?Bb C!:{|y=:^bCi!C!lCCuC45bA ؇C4v?ZˇX!z9~FACC/C/^Fz5 ze2rexe2edˬeheelI/w^F.y92|2:e/×Yح/g/O/O/3痡痙/O_f/\5/Ë/G`MM___a^^A&,z^|9 2d+++ k}Z|5}=zZ|=y{ͽ?l}[xd+UU~UdUxUګUtګUhU*t*x{Zx*{UWWի*"_FyZx^^|x}*t*t*{*ɫVB篲B"^ebO{Ud0[00x= Fg_aYaa~Z> 3ah0<|9f-YapFvcwFCׇaah0tq8̚c/^<̚ÿ#C+Ya0k; ? n^f^C&^^ y |kk׎ׯۯ!^a^{ ~ ;55t5lXkkװ9^c^c=!G_x 9z ?nc~?o '֟?7W~ zݿB Ww~*~]玀##q~Gh2;;ގ`OGpsZ9V@+Gtq;A0#~^<9<</8?##:#G#:GG#pyG#GСG#88w3Ql£Qpps^9 GQpZ9 EߏQz8?m~5NGYQx(8:Ȟ(|rEEvGi"3G?GYQtQx((4r; == "sBGȉQh(8 >ߏ&AǐccɎcǠccc4r | 9==}CNCN!';!A1lc111;ގc4q ;my1x <CFC_1r31x1pq 8yp <C^C^C.1d1xy8/gYq8Ȑqw=pr_G޿}>ON`';}^8>:wO' l 'N'Np>;z~>8Lv\O@'اttu`N=ZO' ('ؓ x=9N;~@`o`^o@soSo߀ހ`@G}9m|7 `?ހ~ހW@~~|y9xx9~x=y=y9ϼ~xYk8,=ɾDdN"/N''Or:ɺNB{'ك$I~z|~:D'd'с''5''᳓IIIdI${; D/'%''I$w; O')'Óȑ$˓IIdIdIpqDFdS))h=ޝV=NAWX)cX))d)k=8žbOS2k8NasB~B~BoB_q <^B~B~.OS)t)t <|<89;/bOASS){| p ;p}>ͺONckfi4t{]y3ipp:N4{}|itiilȢi4gӬ4>͞fͧٳii4;NӬ4}=y}py^<9 OcfO?ȝȖ77obC~{52&{&kx}&xZ}=&y^}3՛ oo·o"_Aƾɾ }~|y&vMMxMMM&|MxM&&t&:-[[[ǷooaۼžŚ¶{uźނ.b_ނނ} :-t[--r-d[[--p-d[-t[ැ-oAgo!B|o!KނBƿ oͼ߆ކfoC[ooCWoCSo3׷᝷ᛷȇmdm6mm6kx685|yzzf o3foCo3׷ቷE`#~߁ށN`/\F;;`#{rt;;xhd;;;;H0www_@ށށxw[@@@www;xpt>Ϡ΀3 |5ag~}yagIg87AN΀3Ȯ3h 6}^e΢{rN9 βYYtvoβȮY,4w=<:Ϣc"BgYY,|suEEVeggѝgٯY,<<<^eβYY쉳藳џ;y)|B,Sş__3_3_ 585|_CӿF5W99~ru~<aρszy:A9~uAs9sagyzk|ϾǞLY={{={pz}~}}s~Z~Z~}y|cAa7yǞ<}lȊ}>}lȐCs}>sx>z}>}>t>}}}px}0pF{y>D|Ⱦ|>=!2CC!x5}?>D'~?Ďss?dNB32??>D.|yxz9|L4vG#h##쾏ˏ؏ɏ/1׏؏>b>F>bt8^]4k:#G#??f3#>FO N n?>F|lu|>f#?>>>?O?>>ƾ1gn1c17o. o 7|7op r77a/ouoo_/،E"".»YE"6Ex5^/BKE"r=̼/#ٗ"qy\G."._Epp="gEEEx"|q>z."/[.".gNjEEx"xڼr-{[oe-zؐE=[~|-[۟?7ƺ54gϰ s?Gn9ٟ94ڿ ~/' /ĶKh/_ŸKx/>%+lBs+_ 诘_1 5rS kۿZkt} y~ -r ľ_B_^b KȍK%pt9]/!/%%%8K%hk\b/.闐X%lK%x = Yyy^/K% gO'lOX''''x'OOX''O??a @ o>A~>A|}^}]F^.3e2z2r2y>Ev~Af| | ?E}[SdȂOOg338 >  3~3~3V<3h3dgVw!'>C|-4z3h h }N~@Wh >^awWЍW+pw]a gWd |-r\]a+ ut g++px\xW+v[?ɃμO o+ W)WWȱUlUh*t~5_e/BW髬*vUpp\WUp o^Ŏ]E]WUpp \Ŗp=t\E]BWUU***>>v~_OWUΐWȜ٫=þ~>o?>5|?g??g??Gvμ?gc}}99ss9r[sh󿇇}>G6~}Ξ}~}9|9999ٯϙ1w{v ڼ:gدk5d5~]~~]c]ثkYGX5h<~ _cנk5t5lkkȟk{]&]!sװ󮱇װk5d5k5pu ޼%נk5lkȈkk5t5ht~ ھ^oנkנk5pw ]C~_|~~~&n[ kZ|Z``=_ [`_.>9 {ys:~\@|\@|9 6uu:x~ξ]g_ױa[ٳuutudu:::::wYu:vuv޻ڮuΩבבKu:t~sz#c]gu~::ȡ7=7 d pps|7o o7 d 6 d } oػ7ؑ7o~>,߀nwn o@7;[ȧ-e[v4-xz ¶Bn-pN-4.-u b߷-h{ |lA[J[d߂nqG[؁[ BoA[k = ܂[;t[<>-pl[ؐ[w Zڂ-|η[0[--d>BFl[{Bo'؟-d{bЛ[b߶8l![[g-d:d 9]oA[g-x :⌽-oA[{b/[|o!÷A[綐[\[j+Focl#m66tFo##mlmm6gmfچn!6 lu6 omCSmj{uچm6gmxoFmCsز6t߆?mhqm>F^m#mhs~Fnmclsm64F.o6h;j oo#׶#md6NF_msvچ޷m6 FlCۜuMۜsmh}߆mu܆mnZۆƶmhgن>6m6gmlm|Fm6nZfo7ٷM&t= o& n&8 n& .n&&ko7YMdMMx&z ?ބnk7ᩛMx&|q5ބoB779/DDd7YM&& ?܄nrzor޻ ߄oMh&4%4%t%%%t%4%k}ɞddDn}zD&},9%Ku_"d]_"dD|}%{%%k^K%{%%~ _~\b_!wb____1داXWWWޯй_7_A{_aC| =}~| +r+WȰ؟U_?_sB.}+dW+;;XCf;;C&u~?~vO?ϰgw_j Vf]F-sWF1h44MħߚZbWFX:t\?Mw`Pj,k\ZWKQlb7>2ȟzm >{cb6h Af4t>_6-A_ +Ms]#auDWmꇺC7xTcAy5>oUPT7 P kn̢:WkqтVU١_1ʿe/UN(/{ӘyVcț[;TȘdoU Ԃcu4G=DaP%~($(:^귦e ȿ(=I̵jM[yVvM'jLt5LVId7c5/8[2 ;3vuk\/.ݺ(UWQW_,~]=-U#Ȇԩ Pm@U+q-^co, o~1x H"͇2@ _ZOMjcg+ֹ:oe5k,r|r`Qڴ6Ӵղ -{e5YOC(Rc=6M6z[cuYT\{&dcz(sT5(Ʒ>NSm&줃&԰V1MoO4.)g-iSaYǷ:-@WN`ur(l%qݍ\ Vy@fkIgd,zVT |T$ɧ6x;&m-7+,/ȱŸ9?6^;YoOۣqh){lV( OU0zZ rƢC5XlVQJьU_T@h,[ʰ/nƷL;NL_E;d0J<4jڔkQl'';-m猶t v ܘ,j8jAͤo&n܁xQẫ6fxjlU=]H*oN=LeոTWtT/ς iqȰ[Yv=+$+hhsE!/Sk;>w}Xk5Ԁɐ1n&0 z_WVWsaE 92, }{zaceB|4ߵL41a][)aыg|4^U|:wӲ5jFfjlQtQ_$8hqPe/C*Zj`>.UN$Hi,w@k}t2ĭ!NCiHR[QO} & w^F=$wՍJg^ DpԠou(_VW\U%@e UQ$ ;[QrF,tSKttbE bHd^r-*>AKga*USЈ# Y UN()z坠2c=F6 kCknEX2@Q[[3PVAړ$:)gjrrb"',5)'A(a8eH*@j&/:@6UHA~ĵa@|]Xu2iR+tQ<@R:]0JtX\T55)'@Lf eW'/Zi,1rm7@qu;7hpn5f_PEӗ :NJgu~dTd5gI5DG=\GLcS bKm6k~{ַ,U?9I:9$t|Jhb*z;pȝNCWsVM|K%9융ZD}=?Hkϫ&tQDk8{TE9jC,L z?v2(_Tuh}CD_5*A޶oT^ jnh`ֹ";yfzϗ cuf5DlnyшFFCA{}oi—3F/d崖^ƕ-fSӊv K5:AQSd!K&ZVMro/En[u ZyU(kjZ/Z9aQC<{udYSNFwo놜Y eKtcHâH!Cl=:6jQlTԌ1o;rm/jAdڕtiq[[*?y=Ƿytי6gzpvɋ1Tx~Kå^6&HJqRR?-Μ]6 yj化dcѱQE#\ѣa y$c]?o2T bȱKŋ!_Rm%UT}gݮ[ׂE4Q $Fã[C"-iG[JXmVCc0.z4$C',N Y\{,Y+8WdY MM RQbTcƗ"N2dr$}Xsuz+15y3`ie$uΨ%jPWZb:s9;TF 6-WknsK߷uh10!?*Ej|B1^EF\ۼL}'j/NG'R&~r"&/z6N'(0 .^5L2M(}٦O-BQʸ\;ɵZ!A4'Vc+FYwLనC GnpmE"٫K#-. /5E9mŖZ!%S=&\+8^lH9s~)gIA>5MQ#tA \T|YZY1JT8;<5fm<eʇݑNrTcḓu6VV]hƒT%yTy|\Q֖Hq/JPZ\IEd%jI 7~Rt\sgo:H-Z(AבZTCht 2 f;fٞjpIl4Q( *>ne| YÏ:Uz|ITйBRKf(W, ص[TC7RrLDm-EjXX[3LDzA y_6&1 kq@ KZYйL< boT ɵo[5+A ϓGǭǭǭYǭEr1PKVNl(j`^x\) íq V`T oŹ&2 ʌ*r+N4F_1J~(]+4FpP5V*YJUjbE]@2 #@^j]5WB5)U1JucTeUbTTS)YUd*'whWRƂ$Gdrv'YTV"zO0z"ĽU1LS5{U uY9o5@FNNw5$n* 9Qr:bg؎kUZAD q ^yuϋ ;\-z٘R$N092\lS2o{Qg7oo)>䭭Qbrze5Nc1{65f>?CF5t/n$U9A ju"U٫&H!J lp*\ n#0D:\0DMLCM>QՇ Z U7Th՚c9 c_$jNf6Psc#*CVZ%2D.jޠ c.Y5y{NnmbU_L&"Yj(?yC!SjԽSJ-*5?>_RQMQR喾+vZCVWR:PV. /^X(' ߒ4+N PN:-@:+þ?dkx^),@^ca,yَVW5بٙJjMC c(ze<{I]TuE4oJ gSy5m9 b7+!jƋ5Q+*H%:[7*K Ek g+I%WoUog D맨cUA WbW22>n 5*@QFѕQ2Q3 U^rjŞEnՊP떓dsp q0v-v-uW51 <+kZ8ANͯ^E""ˇ~U˖J+T.A.?87+^mWi7vܡǹev|[F2gWs bf&ȓX7yL hRarNK5Q[E\ނy\uďnQYd-0xeh%j2Xׄ:j*VύC㐡j#RB=(}Kedó.EGXc[,7QISoٟ#\+U3@ Uq26>,n\k԰M cN85 ZQZw:kuԠc߱7W3eRejVC[mer!:|1^tMO`Υܒh#}mB + ]+)b#Aj#F/i$U^l k{4QM$)rpixNGp{jQN-E^v4թAfHuk>Lr7 7GSߒ kZˬ> 21Y*q2~kWgeyY:vA Of. D nժUu 7rHuq7רXÜ-PѨ ʇQ/ȅdv*zyw< XM !99kγ$1/96k"`Z%.WQ={Wwի^Nj՛e)Kl&'x4ΫSm7^N& S[(16PCQ4j[5+iO h&vdWL,f,R2rUCYQ9;dLYl)-@1^ZĶyi/A QC(ҸSNY\bAiŃJŋMMF 1FC¼g rڵ׭^3 ߕ+++-a(_=]yiKke-H/NփI,d_]b sm9H[A.Έ Cm [Iȱ56@Z;#jy kIt,m/v(.@ cXߪ8dxU .SK:T\KMgAK#k7EbcqTŗ{RNy:MJK{9f/=G evYQ'Vkk] i CZ,t r(%2RCm}<-Ŗҝ#Aԉi2J&]^'FWM^SGx5^l̾l ;#ԫ!@:ָy7qkЄU^DU)@>]vVGm-wH_Cv(2]sTO^??qF;δ1T#eRa ;)ӜoVeαQJrur9_4&.Ʒ j dGK )C&*jm&OqV!F9*j)~jHGվYJ]6 J_"D Q,ة# E;ɷ"' TX{ķtjnMd9iSt`j*7k-PYp RU9%8sl2rVWMFY9usvWT3.;eNu`)ji $%dPvΉԟ/@F5%} {9uS=Y-0?@^Ӯ&&봃TF;:X)1G_`K&ul erqjRU#Ż^Yc&F/OM]e(voagIjMLl{b{lɕFO1QNmUdLXrZvjg o]EdLI­Fclm] ]v70u4^lX^L7.9iͮf6f(BPIѪ0WozʄqUU9U 1Al1IvTMK|Y(X#7Zً{-( eUmE]IXEQh#]-N}Vȴ܇8FINS!č'_tYs(d(Q4jނg{׫,O^_\ |Y.Q#$8fN lJP]P+}A 7}ՏpwsUj%rqVG}SٽfDn2U|UiT8d 2Ӽ=@qOkؾDTN[IՍi`gĠN2U4pXs<*j7T7;8̨e[Id`;5p6tq٩HL]k&5|Vpl%Ș0?݆C]bryX!cQx9&;fEag+^ю{i#PlTWS" tAN sTQI^hjfZ&!~ ~9=]UN߮ W|C]x/t9S E]vfuYj\y"Wm%',5)'A:;'tv53ABFA/}o -jqb3 j F2CXoa6Eڨ ĖNqRvpߪ舴tjqW{n$HǵFj$ 'j*)";@obQ^1$e|V QE:(/B/H}%ȿհ+F5@^vC(vO,oE /^Rŷ<]]O-ϾzE1򲫋zQ>_2TiL VGv*[I 龱i ķ۾Q}L&ˮQ-cFˮ_|˓qLNf "t׺+_Cĥfq|QԛEwoy(Fn$:"{Sï3ߒySCZsڦ6]&*W8epAכ]uk B* _nV;r rОpp8@r&CGYvyA(QcLEdUJyu]Hmhgլ*1lT91hHbdTQ1ʛ,7ZPTUkoX)+E+lĥXY zf/6@ND9gHD>a׵:qΫ Ӫ ReB%v؅(BwW-5Đ)ZzWىr_QU:+8@DvVs5d:xz ɿ[5e7F5jYnԺ9J$.!EWjQ/6 ZjCϨ)lxrjE|RrP=T׵R4~QN]8i TQRU(K}皔jt Joic_tecWj(յuܑU4}*WnԳe.SK vR `@ګ|Kkj\* Fy9զp)zFQVj^fLTNE$&uZ P%aMN񥞳;N P[a&GYt-Q}=TKfnU(xr'&jj~mI9$'+T TV ,΄z3@!I̩FF$G$SchVlk;dTu>gqG^@\Q>8%HT/#/5/hLQ:o+ghbs7UF6ڴ#v)%Pď)7YjLm,`E\_:N ="pRAu[V:J2)o9\ЃkUodS'gBnxlӽU4\4FL"Ekz%ɨQŶ"Idib85.T8VԠ ۘկr2覬5IJ7CIVKP=&o짆cs)`UrdjZRă.jh甹̪fG_JgTHU%tzs"x T.Q!dsmo~|M;TcDo3y>+ԫhPţ/T[j`MԺ1J1ɛ>پWqhe(y匘. cΈ1{& _Gj+yI&y-hPkiP.tP_nzUiF38E))!G ȘTј!a K'ÆcbIPc.b\ȤeLs 5mjF\Gmj&~QJZfTMt2_!@BWouchql̾UԲ.9)e+kq9EWhk~mb:Qc\)1 mGÊåܣ7^Tlb׀J1J,*j /Ȗ.JKPERj9x1 9T.&aڧ*]z0{+֚8 hu#rPH]/^hdU\jGjxN䌪eK-z4DL"\FUaQQO9JA/ OYaShjئ{mWp<{\kBzLj84?5+>F U$Fg d E/6e[!   s˟S5 *wͭp%am{fȞ-5 i:o^byZۡ2Y R2[2QƗ. iBK2Je/jdj5bܼ %\[2q1:z1J(\UPNP+i%`qhch—K"IkcJ1J/7&tDYY*bxQ&:>2ebTnF憷vRLݝ S#\G,5%Aٛ,R Ղ r&'dBQ`0khrZzHA^H.TjL$}ʹp̠ŁvSwzf# ֌6us HԎa4KKdh @ JZ1̪ՓC­fpQhőϋ#U Y;[ R,M ܤtjpo&:_&/^ML v1A*I,Qlq1Q!j# _5(ʙoO.*UrM+ /ws~}ď\iRo!CCWwkv/6GFTtнP;gܐ΢E9;WW \)TMM=Hz NJQ{&|4bw׵G(oԪ}j WahʱVd8?:sڥͅfGcMb&|OZ,X,12 lA>x\'HVG-Utg/8߸i4ƒʌy}-1J]ׄ|Qł`Wm:v6 PAbF -^Qtp5EVdQd&H ZeCZa2ؼ$6=5v˸P$ ^a¯)fw,sjٿ(jڙ/z4!ᾪ5\rT%MH/*=~J\Uo'Mt^ՂqgLEw5-մAݦ%尬kVV߲IzMcJ2 z^v5WFfK9  l6J9'C#CKԪ/btoBզNm$;>H lx7 @e:@'2h־V%ZGŚRRT,`f^G#eMnU15_ 5WjPd"yTR{jL՘ /^@Ϻ1Hg߸o̫XZ݉]i VɝN]͉zOJr%V/6E^?uFMTYT |# VY2}Uϊ3n1JVF QXaIԓNlv݉43u^9 :ȬU7=])Xb0}u4V`b29 S$SQbSi|4YQu uN| Pj[2Պ%\~ zrTT$@/w:kykU7|R.95֮ ҼԮ:YTͮb gjP=]s[ͨN®.;GU zjW0j6U($4dΠX)n'6^Tgw]IFwzʢ rC\[c1/ɉU qݵbVd R Um/6F(=T9J5=A&_fuZ ;Ќ~*9QLkKRQzuUውk˳xQUVJ &Ѱjn`Z6(-WkEf:0f,OE9ѻ@HSY>I7\<ջl t5+G5JkX 顚Ta2&ј1aoڦ.h P $nL'aצ[H1yTm)-@ƄR/cרNk:֞ĺ kMkw|c' U czɖNK}gXd:QX<{uku,`jSiA5 R$Gڎ(dhY/bҪzD2By`:=r\df`d;^1o7x5&@JR!}^l5^4[ܬ TVJec\)kgVk(AQ0{ԟ+0_-0 m3qY9NFmJ/rGW Y׺-6$q(v+UVT!7.ab4hϧCQ[Y$VpE m%sK2Q UMJbtR{deh bS2[/))Qqi.l\F֘RREjN0ZVSe y=ڮN7cg@;]6E|ҩsKշ&|ˬ& 1 V^pKҝiZ+ 0jHBѓy`51^cC b($5F&|;k@5)'@^wJX<5ӦPN^}WkGPlUŋQ^yn\I[Vm|<[{qKTUҰ6CNPUK5_* &Um; WkbKoȎuk !|ĴحܰlABCX$ S/_jec'i;#VE$ 7>}YL.SuEaK ڈ y'yāh鎚eքLNB_KIk~r¯T)SB[7E勍Q6uMW߲P*PK-ƨ7WosTcfwپ(c6`_)v%A2<5 21eٍF9/!;gĹrv[U$jFՕ"S{u cٲV*tJqay;T2`gѩa겧Z+A$::5u5$[ѺD-Fy?-@ThjP˾0]jtw%NdD9sqq-Z Ab+TçhŨHhrO@W[&5(kQQζ7茵B-cbJU,o7:iNMcOc; "A:8ەQ^⬺q *U/6:(IOŅf;I'[$5 ^05nrGY8YB Ըv4Ӊ␣N*ї*Z%+9nPf /HnNd|ǧ8bk.;g:"͝(ֈxE۪ꔢ)En K]f-D:|rcQJ.IX3,-Z+_]9ʸ/7:/;jP D|uj0 7/kCa3%H$GUG2eG5WVz &k>+xZ5^hַLvrKH2jTD-VJe#\_ke/oDިcN o[z(I.@o ]f|Pu]MbF^--qHƔPa*XբG }B䢓Yi1J4UV$w&hc-k&Ue RngcT#ƃ_;~Su)@f/@qRŨjYur Gj93!9kTD}ugjj\wQU!l:͍2%rDmbTSfu< J턢}59ůk5ٞM!;U ׵XK$%T qt;D dž {jLjV e^Z8AWUQGEisYAa05&A6qo&9G_7] jϋk{ E0! i]9!kQNM!6'PRA"AQ;Y.tbYD9brUQ[:5ifK ;WG { Q1nN(5;os:UEQ"Q&h$;WvNK\,2MT78P})#4'XK$H(TGN0by2եTibM W:G9FZ05V Ͼ{4{UfjU9@}` ;eNg_9-@}eyUbȳGyNdy.RlgFF}i.Hwc*ѸSX}gkT˅ʡDCrVMkyGՆ6@받aTrvt*mrlX'ȳwK/Lm񫣋.x{v;/.<8zƼ>R>5 Pڥ'H\v#.L WwfТgj|(^*$%TK4L^}<T˱rvq^Ry羒5R{,qjn:tG:١sD<\OsC%ub|:W{5UL6a-A_QKs,'۳ͺP%Y"VC$\3tL,7idӢ*3zʵq~X{UL_Wᴬ]QxV5ah.Q^rcA.9WK&Zl[ʸ.B4j6qyw'l(?zK,0׮u;:%[%-a|/ܰsjݴ\YnYi'KzR[kޮWbc1U"Q >5M>5M>5M>5MεjrFvIֹYIٮ-'\D`QvwϮ=\kwHpi$) {]K'HڽfYϓ]|ve@Fehb# +ygAy;A\5F< >3ZPjI(9텝SR(&Q 9֋Tkr. su ӧ.gC?zvl,̺mho ݆Ce jCu>&"ueKtc|B]5yQFkgwT5Mh婪L&Cn ^i-omcAJmUdjhe5/cBU`U ~2MRX8A*T%-;ѵFm9!B.l'^;aݤn0;xvieC Đ@8lult( hޱ- \gxuC#ײ Ru\]FiAkk[%ҺaͿfw [l-*ֵ*%b-$!m;z) k"`4?IX#WJ̵n j܊_F|-k_m79kwE]/}K̳̉ӝgIΓ=ג %B09RBC4_495=No8n9{` @dǬZ[-۶W.t0%."#@~QZk5v/Zl[w \bU/&\ݭ}ZT?q9[(3o,şM:+" IVcي` ೻H[hq*/ Ibq|π|ܪ RlAuQgL=HC`uWƙ]gvIUIf\o?L$rYֹci!9,v|vZq,A^USo%#ec6N{wͻZ hEp+5'5^4 kUK\KQV.Q5;QU̪٪%e\[kGM.;]CeZnꞳogU9[=-_5n(eRD:-@jװXϝ|iQ؈m!jZz>}+|DK/vW Qa3%ȈۯaՔհ}-117]skf1F5~Q${W(1LQyl$_58A/̮?+1$@7Ugꏪy5%lMlF9~Gˇ&;dh2}pSmޖn5][s͆zћzXU|T?9wk[ ^arX_g#6b/ZͩzP|Pv+GN>9wkrvnOPZr&'L5)gV˪븴^e.[Swtk+'L5'NMNqQ9?SI(D*cUC*uV\NUg/dT kǜN51Gyt:]1ʛ&umN-Z~9~r^K3MW MlEa~VӦޟ U.|rHN@*I18 ȳ Իzl}޼m)79ȘP|WUy-99>H. >^4&'j_G`IF:oPn&'k[<{[ij-14{6֢5 s),vN7gǩS& Wj|˷/'LN(mrT{#FQҷ;Fg>onr<S'ϰ7,ZCLm8zIjep +{"L5\=?/}C9]5d|77f휍휍̂jɣVBN-/"NET)GEȤKŨBr9Xqt[ƽj456=tGW#0A<?վ" dmKEtǯN2n-MwCc:&N}o(cB]=(EFŪG`$D>̳)9f&;ԃg(Fdب>. SgP-=aD/ʍL;5VZ-+XԪ1VV|-}kryč$'WLܔlr[ɍĦH,A_}!Qv5z4n{`rTya?v>?v}mS~(GNw3JL5kiLhuRVc|"9J_[Pv U 'H^lQʲpr U.'WMKARVm8kr)XSͷJWM*U5~ѕKհ!˾,>V}dXӲp uaq@&&W3Ֆ NܿcrȤ,rERVRRn"@nj/Mҧ5n(FFQ6Z̏ KyNn1c!SmÑOoZ*sV>IS=ϛڸyTKI%y֏x{BL w 6~'y݌olKM$Dɺ.-⶗F@etXB㢤}e9rQ+r8wNp/g qۍoyuX 2"ڙ#AWK/9FVJHkH 1ֆ^r3>kynTȁ0:dtQՒzen(o;9~t-cFW%wLP5{3_>Ì:&E9WԚ :Q͈<j /H_2J&ո(Aur+=uX- M gWϘG׸b蔏EFwvM}yϗ`pQ7>) .J˽;AkFI*VOB6$݀FwQ2XG$ {:1dKltbĐM}F;#Ћ2^Gst_ftuLX%H{:$lOa!a Y HV]Z(J7nW_shաD&5j3A"Zo;;TڕYf$$RC7 g~tIp42cCw8l0yѽoFÌNB;>&,D2 G]0kWdjNF-nxACP%z;,' dW5ֆt=GiхGg͌rXfe;et:caLhF{ 2:etX_58?Z6\*@2Nr jèx^PXe!& NXQӬ7ȷH߰:XgG+ #=C:kTk)PCQAn5XAłb|Ji$娒cu'Ȅ5H9J$k6O\y₰y%W?f)˨ˉoe%(ᆀQgdyɁP-Y2@:/;F;jA 55^*w6.JPM ãq8꺗ڢ^f9lgZ)ʬU1yIbZDGm\ o5_mISu?A[*Dљcl p "0̒l|1/{z^ky|" 2&NjHiЄIM I7}bg嘭Qgy0(6UdԬ}6:{stQa:G'tI.T b]ojٟnC*U*[UY~{Ir]eёRcɿOA ;TH}=Hto}W5%5 U6FIzCEj$ơ6Qz@;|sD Y L2 uoCt{շD $j|v0k.R\+Uӓ5)?/?@s Ո%1}V /\巔.X"9JS &ȟ/$qٸu s ryCs[&{1d*#mN|Tui ?Io'Xd'Zȳ}_]b 41o%Hߚ-fK VAIU㣃dsڊ>%Dv3OF Tɱ5#R['5IbN,Gi.q/:F%㳻&A]6t%^.ƗCuYDm& ȻmId*H[jxM?gQw|K[ZgBc^vum %f m ѹ1UKZ$/ի?rT[TmFɱ2rV-三H; i;(U7nofeqmcdŬrF}G(6}L&1UcFaZ5#$VP.dg+5Fɖ6Aڋ-nꤾCx> G2vNhcǧy\]]$ǹCO{{4jbZpp_҂j.x/C06C|Wcj&BLPc ZAe1+U)!Wb})n;)^Tr͐Bv6Jo3ZOb\=@JMY1r|aN PO#TiW]T44&Ș+ Z_ȳKe3s /H,+[\H$ SͨI{o۫dqGu^|y2; (Zn 'i5X"@赋G &,N^E5J*UANVZo3ە0$UTu4TN8UGU[S'5z!tbk%y^5s6@^c!kZ1A!kΚkq5ȳT#@TjlDyd=T0mpZj.*   uƂ\jq#0m4T̤Nr j̫1Ʒ >[ \Ոڢz0$FߨRB+B|WTM6y{{ovUs=4VI.$j2GRѩNB COR|[mkX05<oʑf1UIL(-NKk!$HBQnWkw8Td81UŮ8>('ilG6dH.ʈ *H03@lR0N>Q ݊j 5ĵNJ![CNx^nko ժeL8kV P A ceYuTY Rs-ҙFF\UHU]2u끹ZG7%1ۡ`Օ3m I-IJcԺ0o~4Uu &Nr#Nrq#:+o.z>xwpҁ n q5,b Cky[8)/I&%BW'\)vtDudR'CۇE_IrAiRT@]9Iz#XC R(AysGרʭ[ԫQ)R((7c˟>X'ނn;]ЍFw(`tmFW^Ыa`B!@FO[Ւs rhݵum`<]A˝yjJ=sֹy]֥Q w$ok8_T7G5^^B"'êɼ-u4/yo'4ʥ={ѽB/VNKRR%%VVz֐skdT֏+`*;KZ钪ۨed@oUpwX jp cb 䞍lKPi\ڭ Y˔䋦T)p?xgֵj;Ԣ4xepzQ#x_k'Hez^43K֠y\z(da:"o$jݒs^lm7l- Z=1ʓPlbTE L_lm/*)@[ͨZ 2|¯$'Hn[`wuzyUJg%ȳ%ȳWҮ%ȳWͮIR A)Q ՒP հy*yUH9-1AEuv̞Gm~=:{tD4ߣGF5(LػIg/g/#g/źĺkҸO勚B[l,vUB5C~TvKB~TI CDvmjvވVJ1qM[qn Hw몊87f|9R\+D0n8+&jn9fWߑ!{9w&fNeQrj"5ruIgə2Mȋ 塜ؘk_VenⶖtE#Zm|]Һ5(!6~!:ts͛K%_\)70@ª e/7׊P.s2KU*j)|˖`Vg@l1k,'ٮ j>N($?&5Z#74LC5Z gx2a ?+9@.W*o /*E iGF3;>[)R)FE1U^s-א 9bTMwb JZ@)v|VBvL P]9('P &1JQ!1BHV5): P+NJ sm5/ ]ZaBNQªsE1C7ŵKU P .iX%sɩQePQ5VSkJ7wws'Tf sfS`ՉjcX- @ޕ} yM]mZe ҂j ԋ{7z͵^ƷD&pv^I b^&̲ikkࡂg.Ƒ mR/b^5'эG6l&7#,8h)u$h0P; (fT\[HA#e [_yϫyj7Vn6Vo4-T ,r5 e'IUsa[lltjSpszoy[][ՉT,_TCKPcf+[*ݜ}=JZ[%'_5>UX\D1F "gfVkW9֦)Of⊜Ye;MjPCK<EJz5Dqi v*Vq0jg:6̺.Xۭ=n7& !z⥺dSujsk׮\Rk(&˜ek_Զq Ty ɟVQX(֖_5Y(jAEE&1%RzyӪB%j[T_e z ߨ+ys䩶fUEY>;ֶ ɤCRcz.EF4Vk |4bW)'\=1Wi>P gaz(oKVs<$pUntP*?@"v5&%yhȯ*Z'wu sUwsC*K PM+IJAǼ.M~)AQCqmkj $t%ȟ5J u:AM j(yn1X2Z84^T|mBk|QbpZM,҄QIOΑ\eshíu63EF{Iws1 FU,pդN\59jR[}rUM++{Y kUGL2jR$W +Du{ 3֫%aׁŗLTh-:Jenjelxc&c&@h:ݹ"Fʏ1j0HYlѬ1{)k`t;֩qmEj_Tʯ\.&v| cFBg/]u ˚OHZV0u5^4I2#2ڻ2ڕR Cezs gIVW]|^n$kkQgSJ7H)Y/JCZYHbٕ;nw9*65@&v];d)~9*:NE<լ?䄚GdZQQ[[um2?Y"-  VQ}@XU9CڨB'|UF{ɰ:\QHQʚ˞Mo2b&kU P[ƪM~E3]o}>RgW'ȳ q^ܱ͉*ci59smϻұB-_ڠ1G]{ۼ8{Y¥]\\OyqӮc{xFWZgZuTkZ&߲P͡_+ hV_tkWDl;֖9":V>/KuUQ̥<2onjݻ+eiTStL4nx^4j(>9tR)'jHVKժWj̫AnxGCquihtTJ5in?G=  9\ 5q2A 21+To`eoƋU FPo|-[ ˠ9gkfW٬V0YQͦV):e5H"fs%aL%NRG͊:rҁ{ #S' 0Q-BVpN\pݥ2\% gKMLxE= J =')DF&MN f;dϖŦf͢3&gMή]( 69 ]537Q!^t4(MR+IV+VG"@Ut5b6v5߫+HVNTR Ȭ`d=?oqqjc'Ʒdd VsƂ0=6džgrK۩1e䈳I|YVt$ʨs'VmW[ ]dr7rZ`0T[C`]~ Iw ߽5eMFgVwޕ^Z($I0'%aFLMU܍V]-kL rtDb>D:J~D_SD1ANPÃEj),jƤ1jUAss-`vr٩/W T hv >T]!y7f N5q2[>7bjzeunvLSUyĵ* O"nٹBJ kk"`89"z+jB'X[U(>,IGV jO\(AuT@mv75-Vu6*m9J2FuCw rFud~\MdkMƚ xMJgoFی.<& 5u'A 5 PMIgJgoghgچԵy8YhYF ݝ?4i5%A|m^]SC9gtXq{Z'ȳs~F'DNF>Z _8X[ &ȳW&[s5McM\{eIg#F_RN+ctr䪱:GJ[:jtԬ-ϵz%HU= {t%}Oyiuv7 o՜SwFN(/eyV'kNި kN45]u <פ%ʩ.h% ʎ5*%!䄫%/g!aqqAjlɝkmh:aEX]I뚝 MRtt_׬8?+ q|$H7.08U7C<ZL0_"GܲoT˾0ASfRi$@UQtS cǚYaQ;u50AʯUG(&: j~Qr^5dU)-cx{:YNI1/kRӂtjy}RFfWj1AQ^K/ݡۚIDNp[ծ^R1БMs#][Z)!Au^}WVkDlȪUUjcƽ#/F;iFb4FIlm^O/@'Ƌ kWeNT3o`B!aK=$ ccq!1m),jK5 nTԺft 4F0mbv +k?r#ݵ|KMTݫ9 e,Wiݫ9y*&ډFk]4j]3m̻Sf]H vf/2@Ɨ2ۼ_ܕozj|ۚ/%H7'AmV2] c&o{%]VZ_۽( %n$GcՐ<{_Z?A vmw5IyUfЪW3ݮbT0C- Lྱ2jjuGśȼ'zŖƼ,lm96M# r{Nid+kԍTI(U8fc[^i2+;V  wcӫ{XmGuwYuWS-d/b)ASӸqEP}rUo隺iE9@s]vQ׈LzIPZ:AV#$IR9/IjlPM5-GYjf$HQ<5);x-';O11ƂiK$ b}M3K;zrİ(OG~쯆WCOه\FZ5Ao5y߉wH&FW (]-$REъb"{kc֢F*AZZ>Ӑ֋z5,?jf2oOQFܠD%¬ wQ>jpc_cUb.NbZ#4~\V^64V=/dc~pUx(P혛 )ڂ.GH(egJ^,j3y0]dX. 'u+'D-}dXԺR_8RшZ]l5Njn2!#po+;TThձ W^j\uZ_7bC5n;we^Fl5WdƦT^$Gc5asTc&93˶UOV]ն* R&5,G5^j*@aC̽_ 'ZBʕ"k;AԫpVZܡӕ8dtqc#+-%Lj8MVN>jVojuf-kTH~P(sGCP1GdB3_Ir7b;6 ;6j-Qp5Đ<Ǩ]ĥXI_$GpP[(vF w$TT믆5T[$UdeR4iAUN*(9i'j'ѩip)n%bUmQ}68`pNl/5 7AFP~8ѕlߡ&(VYa#20BZ yھ R}KvՔUjL rl|^||zKP[ե֞UpJ=A50є֐j5L7ݨgS-[DC51$Z Bی,3 NUՔAPl| R:(qmPU& jQ߮wgqo92Ll]r|-VQzXA y]7Zj!eZmOiN:C='H D,ڞy{U BaRdk44lc̏1>Լ+>||SiOݚjV*jvhyW$P-yAj399f˶:9V'u$-yWưeNMQ_.pUitwRskb\q +27.:Z ruO9_mjoUgDY@JPcȯu-AyL*YUitb  3.ju\͡tg<_ŧ%M P= Abű qڠ {e,%sn ҍGOVj%{,/6^;4T$TY!y^2$i1J۱nOj|05fgj jlgi+ouԊv*~OBo$" fEUZ1$]y㖣CS-: Tbho*rf uL3/ 뚝 %,Aj%naD&zFt0)HhPTfQwa9纶 ȩMy2'%;"t4իI?N:aW 1 )TK1U_1jY ut}GW#1??[Xiu;F_ᎾPa<t%KP@zћ|:"|Sn`0{d"yWz0*j\)7PɊ:wrvJ20!xQXCP."lt,GcGx1 U'kt,Qі&cg|;Ilb1JʘpKF&)< 5#A*[[my jR1N )GhHLIOU͔% { Gk01dg_,͢ G:ucrQaVe=JF'/ճƋ 9kUrTܟ,w甍2ftH]#;zt^o}m(}m.UJ#&IDZ6B\k}.9bĢz,ahRy;6"9j#wbBcԋZ;Fk2Z8o1A*Wc1L(K7*@Z7ݧLTL ”x,:p&%L|Z6}J?V*/fѵBK .RQѮ]KEju ]f&$g〣JQn@fk']k&hSu"f>5d'G5^TQw)ZkTAqvLUW@\y6sG'ʏn0 HwDQp"G$U}=:Q~q;s睕N8sTP 9͉>n<ֆ Y郱K_C( MMJ#e"Fqړ: NQ qQye*|%cW 錒rޘ;6J;f&Z}tOwO} ghLQ}E"йX3" ]MxFo)] ij ZtF@5T}[BZW @/E*M &)4@_Ti5b6A_M.u65%T.ˊbS]PSc}.<֢ yW$i%hTBAF%KP=HJ7G+\)r0G5@u9ϋkx1e.見5ABO51A:RBRޗv1GgI 1aʄ Zkn`4DyrX+l9\E_@\(ӗլ+W!ɽiC.5z8 "W$@Yjww ѬucnC;鸈$ۤnGH9Q_)~pU_{';` Ш("+ lQZk]rtZ'ig54RA1r%vepF?*mX\ )S"GDF0t5V)tv N>n$Ɇr#r"ei?nq]XuH_͋]b{jU-֮-q܍S"F3rMQKOӜ9:%r) ]I93AuV`~(Do6qcҾ %H"Hw E #,`jRLէQ#oӼTZ,goj@`$΍7ή{nQ^lr#7/qM퉐h*Scroj(k1IO7MǍ{"l!9_c}6MBG9-U7>/CMk 8NdLEW.gt>fSi8'A2D4DձSn׆7$2jBT 7-U%JP6Sm՘}c$+6껵|qvƙ' ojpʼŽn\Ry(}wPV|eNڸK]"75*_/90q/ɍ{IM4ɩj$5~Xu0{F2mcF,,֘_в$a߈'M2¯Qa}d]7q=C}9jx6ypB}:Y2##bH IJXXd{"GBZ8$jE•y^j ,JU3ɱZnheq⾛+ֺ %E )zer]t[/WRBMEtJ ^N! v쇷pN`6 ﭘf|~KC {p g ,\^Im(%\D륱wjޓT<zt"t)GXw+e]t⎊<:L NWȘ:]<@9 K7{%'/L{K[bL6u 6jp4Mtl BtC8m_wfv+RQ:t .q)TPm.5+2Dva逗YzT9"^R,e\%S\X_$tP;1Ӟo =ɝ73ZC x]0ay|+6E.dojbȒRa)zxF+E28f=y@_iS hl%ljEj?Dt=u7IUXC9E^Cb_Ò6<6iSnT+ 98:N=H5NM=,i}}OrUjd/J 1*퉆03ߐ(,[>#j#'sy%!+iyevI;@O:2!MH~R!u nv`u;sqN~aA|ʊ?3QUe3*W;)u$PHX } :7Ԑ99H oҷ'6D2֐ڑOfO!KCѻ $CPw{U++INH&J]0'-/D2SBW,ѷ?gG[.T }C.)PkTIKJíZY4y}.N;dǂ8"%+gtfc:a' (aLR!ԯwd7=,0V|C<"7d4fB=d@ V.t46m_؈|iC2aVEi˪L}NRtC9K>J>_/lGɅjWܞݽ },H>s*H=.#njaxxT:U3 ,Co'HV䅼)c|e)|CX / YӐ7޻2ZIiK9o+td| č|eFPCjVn:J~VVYV奲r]Ijhhq,WfphRy|I:>rC,Uyd)B8/_;hMTண>yeޥVvRs>A*wY3bHO_磻&Rq MUρ33v 8i {\HS?*V,q Vi^~0V>؎d[t+pP"TVdrVohY si3ݙM ?wK[ی;] ~9qXKoxݘd۝޻8L=;AG(_NWC<3WƷ[);J|"emS: #t{ъ^ 9YѷB~B~SȯD~N5#n^9q`*Dgx93Vd[qA2`lU§pg9ި;Ip{56yYң%u3a #[RPo:R,LxaIHkU[f*H(M!wNTi}-+|g2B4\u!v|pC>aG>Ǵ=(ǥ\G>-^*r~Qw/|̬4)&LV[\ KMԿg儆{j:+򂆑`Q7uԘZ 71w |Z'{O@5YeO[N݂콟^\ ^8Z3bsjoE_ȑPΈ(z/[@AvAUUqvV +Nm҆|Cć^ޓܐgd) 2e[@8ܑ{ , d˄\^ \ ezC kY[9Kꋞ231V 1 qԫ>hF='yzV7uBEM[΃gi &!<Zr[xz;9U.Ɛ_%UC=ھ)OZ[`{-ъ=OTB,tor7=[ZFYU2MWVd{Jo_2Sz"Kİj*.a%nd%H /` \MEKW^-3V|K+MXgR{i=>;[@ARXJF'l:HEzM:Kkxlߣ>+V,+qn?**(Bý| [wk-k"͝`xվ[QS]e jţ\݊=uug>:n: V$N8'bX$nρu(8uf:^]ax,Lhy@Cy9xk(wuiI5L'Jye93֩o$K/ "Z3VњgHwѕ.ckA~*R;_Gw\sʿP54`>)2\uKVB%OP,'\g݊ "*f!8 N~iTl%m&gxr$~Y}/O #Y5ΜZ3G7;&Ip_+iy eJv]Cý\V:o3<ͬ? WHUŐ$D i]Swљ^Ox^"A BImH #~Cֹ|y*{X)LMph3VƼ~ O΃S M!cD RIHLLC WԐxK P67sqZPV6h@'YbF炆 )ҽg~OOάRԻ;8#v ND:{&9X0ߞ ,CW7@,:H) ^SDVIɸ{A7 [MɹB)SWyC8SѮ[9Юk*4ϝm咆LuPqc`_uyľڧ$fU~ȷ79'/"<"Ʃ+_ȉA%4{eBiӾyNk(_sw8B[D2[ !z(XҾՐψyċ|iwTDo;ȻN/j᥁S)Y6@~:,Ʃ+!9y)"ήBZkymZ i4Nln{bw!kjkC{ / E<++k UBXԾo5xm_ 7\ @V~2UvU'h^H~2?TLxip] h3YJQ ]+fCGWߏ>Td%XҌ~T`c~J\pBNrhE&e!;9,I6 9ge0R'؆ y]s5= A[jۿh'TJB3Foj-I}N=\ԇTۓ 98ez{f>:}n,#`4 !S>dRC>J{ЕzGb'%%`YkcO]iv7Ɏl$gc+WW/B5f#i!B $nC폂J&9 v옏4}%mO$KҐ-0&gIc,26_}[)]u-_I P}!.| :I>ҭxF>0>) Zz02?|,IUXAp ;橼!a '[ S˗v.~j_$1BG\ԟ/ҞXtO`__Ri_ȑE0 ,$֭_l.vT=g01Rc!<7Q|FApw7Lae4%pIq[Qk{a>bpBZAbX96\=HI+.+ 'i}MVR~\cЭ~lO#5NN>:̗n>|B>6>T; }ԍ65:=13>) o`Dv]I4dbdUCic^VN;?+ 0P1K}CÅL,ҕb[RNrɺSPUAAN~T9yCUTW.R!>67 dtG4`7ԐsbEW  mJe|x(Q'5b%G. %FҬBlfl|HuHhXjg~N,Rr V}VXiD;+<;XEUdbN,7=crkZO}COcOuP {98}k3zyocCٓѭ r(Ӝ5x8U8dnx)_4Jrȶu]cQx`R6,5>>#GdN`F nq^m:"H[rI p藆ήJiH#8퓄΂\Ӑ d=m#+`Ock®4ɞLr__mAoTOr7DM!`>}܇U[?j|d5|EgtC䖡XUnrNM^@CEO^{љ̺PWY!eA`v~ӣ^C+,ܭ9b|QcU +˃t+:qj]8ܞk>+f.|u 7GfWA:($!&=KzTU:a؅Q*I\}ݐ8'+vBjkis!KAýNS: 'ƃՕs!dwVd\O钶,0)zrպ*iI->>˨Ϸm5Аj G(KlHgɢ xkg;? B74I tϐ<讜5 aBRv*&yvw#R2⊫;`YY4) IɸhĢQw~V|4f-}佗]}_n 嚆ٞo g>٨T+H'Qyv6)$7'VxaOCNC2? ?|(\jR3dv+7kșWCY~*ucž Iج;ѠL;#UYpLGBJՅjĻP4J ?JEG"MPzҋ!cz6~2HՐ~ܚJH{!JǾBdQJ 2IHe /v2g4q!-dYdIm7:ANij 5ǝ9QR5$򓳰[gܔ Ɗcߧfx+I m %JrW u|CדkǑ *̷҄B2_Y~ u'rȊ>__x/Mjؖ&W5]=mWyCl'WR[ij} nen58|~*#+ymupڟ ve $5xȾZ1_E///*$Lˋ"H[&H ae0Ze|sLALJ@L72O5B5& eXʐwCޥ M:;1tehCD/^,אEny Ifވ>TB~R.!ن@2!H,+4/b~S M̍418d =-zZ&yI iAz6N@Y6­ ŅW35~v"JeiߚfjEG¨řve]͵q>b3Ⱦ}ِF Qאr$t_9A#PYZ?ZxmC,0Z{B}CGn7K/ٷS ^GWr) "5{z%O/WLW-^>mW9;r )\,&Vb[+Ic!|Caܭrm(]<,MR|]='WT*2ľ^&ɐ4k\| rb/9w_{Y`eW-t5Gѐ^/:s»7W`˃j<ֆ| IZ-Fʕ酆{ ]_1]Hs`0lC`>2\3jvEtv:SXS8ݺiC;0J#$&7Ju HϷɴmp2^c%LB)dwk(xC>|C[.i7{uFdpԉ֜-j0N|Czvfz|%k2S[BFTنI=/K{R{[@yVV0wk8-}2Q_C6o{29DXCqKF%x iyl(lLnhhźjMWiVEBސ~x@E)VP>+Il}|:#6'!$ŕ> و#/h 8$rU^Wun,j}巤eK"{&cR,rzI>:Ihe8^m.bmU,!WqHL̚Ck6%҅<'z_tߣnE6J>ڦ2aA )~ 9H$F n`vF{tݭ{esC8@!4 `Y}*hPf~C:m'^kNRӜo4kx9+ugk-V{ec Ǎ;qjjWrI,w[ sqw_$B /. ߮\qYJg]pR+2Sw[:XW6s³{Z9C).hB~sb% $lq+Pr3[I@┴$k-hg}dɅnҔ\4ljuYXF Tr(0eeô9 OOo+ұHfqaZjb9f=)ҳխjl)T[0Wqm{.5{*eH #f=U%01Dc0zx 78/Ұ:V ,+`DK,I&iI d!|Ҫk-c5n9:6,,Ȼ,Ȼ[Cn54N[),<# 1M,Tw$7!HYwǦ{mH5LD_HT䦟8_)aQ= :>(ej~AH/gqcmWZboA/N;#4tFlO"MCCY屾Y5Yܤt b[͙\/OɄ&sBBZޕ/~qE} ߯Jk4 s0tVC'"' uQ8E%% sAF>ˣWY =f/G˩Y UuVt"sҒLoh@{oLo(h/wcso+^2$ڏa]fН1zۤK2Vz41N]犐ޅc:1k(%!N \o+Gb EL] Z9c?XOk0 "ՏGݏY9U='SA$9f}o>Ҋ4Vj)Y^҃B߾-}-eo9R7Lws'"R)4hjb7kA' i#4.ȏOi6/2VñF =!FI.R'd, Bo|aT-hUNBuwfeOY );˽_lГtwXI@CCn6s)}1nLQnɔC)Yސ&I Yw8vJXAT̠|C=@0vvfZDJc}!d\m׽|ܭ h6' "kS Dsp;2tT("qFVNGvhPVPLn?9}ld9nKØ/c{Cu!3c {6SA>P.y/$`A!(C4{ ՞V z_*^S{JXA}pօԸ~}2) ? muE vb$.#yRCT˭&!]T9Du7r$Xsogd,hqƻ?U9i$;v"XXWC*i-w BJ _fF43#eA.|{.| i٪ -ڬȧ0EZGlZ|<,c_8$(gWKD-뻗D|<[&ȗS&(cr ZOT[,ݭ~m@Z>OMneΖ;·p}XO8Tq6khP2.ؐr]QA>#VA/*?'JzoB~V×FiYsQEIUЁ!BD_G}/CzYAZ~LcZOnR_nPK[K["O4t.2P/ޓDKɫj<" *;ՊQE- ސ"{%kKkirڄ֐d^GJv _'Rx+%ځ-wJVjֶ(5NӖ4cح ɄG|  )4\跍rH9 B2E[,j# aPﻧvwC^?@ޥj3hp{m4o6+EQ4 Ʉ-ifbbWXZ9^z;I9|@aad!gbCvuMyjne/5R'jᑉj5ӐLA,Cf^7/ 18Gx`/Faj @!>daaaa{ҵ63]<霙fp{EbIaMuܩ$W>d Y|!ɴO_CC':Lz>я69t炼P!4Ya#hEtӷO u:voPwv|Sۢ!mI+hBE#am22#=n" ѣj5\Ȝft2zZzٖjC*ʇՊ[8C܇ ǐ} {|u=}]͵>2!KZ&i4tH`, {4512+!Y[:zSK!:qP "HזUCPں1.xu! HAQ]WotabYΉLkp/{:ͶZU'Bd[ȗ+%kf>y_8´.-3#ACKk۬#c7"pV,ځ]؜%y+cI:k5=|i(\oЉm2Zn5 KΜxl byt|]C|hY#?f ?moԫ^ו'#u+Ps:~x~1pPd/7&C(/:^. GȻ4>׉˂pW"Y#ea.+3']rWȯ!EDƺ= .6*'ii2~:ItGnjy!Ȋ>%1=mhű]B3N t\ؘU+GhUI}|0ĮT{s|fsvQҍHyrA{*HRK)qA~\WgEȉ4:G8ߙoWvbe}rp?M>3!3^ Lݻ;^lN:j\IYPɌXCC\bi~!~ABݢ+&m!+v@KVɲ硷pH___0|>Bj^@P0 aߐ;~gGgċ@/5Ab]Ikp3S;Y]͑h?a1gJ ,LІR^ב2M8VX+g^aoY>d& 9>ѽexLiw$c<ˆ|ۜkߵǾ8&{[)w{/ >pVvʵy98{$ ru6V>vCۖ٤ q(KH6^OS_hB<3+Uk}8DD8v:oHS.m&˿p~҄=м(p/8PP"yR!t!HE' rfl3 :r) 'y*QNg˽n:ϬM]~L(Vm{Lpag݊#: ڎ[|8Q* ?wqz i}o?@k\3G!GB\1d !u/י^ڞ͆?͆Dk' ŝ5[~z\}S !1U*&^;N͈|Fӥ&LVngmmr_ :)N 9g:˕i_8ˑ@ԕr*{vs.Ok c1]I݂rTw]TUeƻBk6h-]U͇VC3,[g8f.$ԐH) }J8|Ih3HHQ+8o+Ґx=ngF w9@k*B'q*V:%V:?PII c24x,Itf!K)RQ 넴3i-M&UK@gH=uenߐdHZO:\ۻ<~ɓu2!\,jg{bdݲ~mu$ t"ѭ֟su@o"u9=mITLl{U^ 9v~.xtJk9R9(q2]d44\U"D^xKӗV2VP 1^ՐϨ k~ ]4^vʻX4OP]wK&iSt1(+2)ԫ0snH_=>;T ;nqc0Ams9H!I6whAhmcVgTF Y Gт V jd򾖕DSrtۖ yk轋hX^]RÖ԰ulyF$b93q:\BC Ǽ{LlE|hz 1®C"gғc?>ISrkZk 1uH /mx07.R46&JvCНWV~鹿%'U:ýgtpՕ%= Ͱ+,+DJ~d9DV&ǩ TjxlSp,i# eU(Etm^Ok4F͒=rb\,!LwyBX m BE 2̛'e2NCddM pֈ!wxɑZh%J'v݅oDXS#?/bp$t+|CIdV?>Kgnjd[{!t+bt+;A~(D %l)[pN7O6AX󽗓J7qcdxu%k25! ͣ~eEx,yEEn5<uYbDLBpki8Tȝ\OCDkߴ\խHNnMC1̏q>Z8e d <[@]vh%C¹QdI3[̖vĤeaYG}[4] lWq^[֛N8x}d%l%!G"sD΢ 9^Ԉ;R!tOt4tt5NEHVXs jK3*nj@3TZe˦^2`*H-SWZ2'_3\ł/sW m˭9n 9⎬>SW K@Uإ:mo iA,P W[S]yGŇw 1OV^8"ue :x *JCC;UQCѧ 라^hԒ6$I/$h(M~jL^{[99|ey3F8rw'ڐɗaW/V/Pc%W!4R2}<5\b~/i@ ԰\BK8_CNGt,?EzIOZIOj҅ؑҺLVlWRzh^Q%IU6/% +XfR5{%NJKCF|p /qzaFݙ{"զv_Ȝ^_Ly&ӕktrpH0]YtɪKΒ,\gF]~/I9KR @J/Ky[~Jk! ᇌ&\b2Y酤C9-IBOBO+ =_IrKvӹ-ys+ys7!f,| "g8HC@Ώ.iu漽 Ӕ?o.O"#(pJt]B\n|K"%撔seWS5Z շ!%^y/~U̜bsV-L/׹cf>_ jȗʴWK= B2R"4˱HiѨ=%5@W:V|2Z$)B#LmȮlC?Koԕ䪂4aUC}!5o4DNZqW֤j̬4*R@mZ =ZꒂuI\urUC>6+iS]uߣ; ;kzZ RFLŴM .d]c%@ދſʩL:WhZ-U̐Jgdeu+ߛ7`J__iאBEY~S_8@mTh-4fJ8]Jw(rn#J\Iiou%ϰ!&:WZE>HG9S_x%gB^ fccSJbA..u+u.. wTk!yr%xr.9xK%J^דZؚz*ooUBe*X峮+}4xFifW&LV32ǰHFHL;W!P7 $w/t$ܭueh/0,K%v ᜖&WN$+5R2U rp!c~rC29?QUd]Q=CUt%2,@VPL ᬷLeK&e BԻ$"ײ.O=pXU74d dnP(Z JvIbzK{_7B:-gOPLXGCY,K]&_Ysze!5EϏI*o_.+}];ND%-)X5O5R VYN'AΗŬrTuY $c*&ՕiYs hH]j5"Ӑt2W{񉦇!$JnMCC'|l[_ڝwE$[{<6DNsO@ĭ|ӉKؑz^M9;MB{pk܆fR#=1M5N]pWhPިjOuΘaZm@n`^r3,ȑHωdf4 ZB \dImHb*3m!$0e>SKZ.0jBCu;?(Յ/?HyV+'@.9RգHܨ)҉;xd;4O*u+0C1k*a}!(׽]0оA~ g_L|C_(LoPZ_@hSާߤLke6{ B~|)Ӑ|F Gzխ h\ {a:r<ﱙl:Y/tp)E}ǚ:๤/ȼm43ZطfWقԡ8f| ;#ZabHAD 5 :"{>W{*w RP  ֔n7 | 0]h;,#dhh=Gh}t E rӉ:'w),Xt[0vB4pC{.[$9OeQpIB¶ϘbU$iW9>7ٛOz1RG2<rf+&[ߕd}2ѭ׿sab~e"TA.왠Uq&j&f &jG)v:{98!vt+ٚ#1/l) H_\xΈm҆v3Yu7t71BaZL/{VֶسNF9/V+=$-"kvnW̮d NDoOPۊ,=j&[e7]}']leW!nU8 :!ѐDkWj=K;3ܾi(ί]Ďmߒ 5ýǬ]A}tIF*l҆Oy )k0uCÅY|JCw y,a/ q3d5@Ymf츂 2y!nrK_F(5iBF ʗvi}E02wdJN;iAb9j&bCm#77i ھv+^c{f5 "= X9n[/=)t+VI)@Utq$[5ɽ 3#Z|{/$GУ֣\3-iN b;1JYS)oq+4uyY /4#9 ,QtKN>BM&Rގ5  {9XiGJ7pֿž}XH X$t3m ~R [ ]I~!"BP*i7-Es""3|oN`5[1TGH|B,Y/$ ¡nԡ6 &݆!Ăy-H[ݓd4ǭZtp;召fY#t%.DT{iq; ^ J9;& o- 4F. ÇHyJz}!oYA2$O9U/KkE'gC1O~$+"Ck5%  DJk渕rV*_xiC+"Gf7:=?Tu$~&{ϑRM0ރמ !UHgA>%̕96 e檷^]/DʼnWv{tLOCN&e044|C92F{|ns߃]6f$$d!J @;,ZpdтS{mTKv,;\MΈٹX:^d0lE煰s)܃1M^_,ѷG]c뱆אX}d]68+:Gތ>dY^A~ 7ӭ6!_^C)#5lT}YwwJϗ[, k;W[Zi~rpZ[/]x:A*P;1) (̌x/̃rイ*]85}vC޽gxF˨Q bK;8Epy|/_vI V+FsfT+i<p tA8P1?L?AC.|ۙ-Ӑ/msH:??R!kQl 9x}6_Y_)!D;n i=Aa/\a5D憘&IQ>[9V<'t9RTNwwCTjpC&ՑLe3UgZ?w><PH=ц_m v+ʑYRCdcW}dս -*p4[ mD[0L:2 Ia%olH~Xίaå[mS1n%[0_Dn慠V)BӸdX@H "xjSՄ|tZ_(p!r bX:Tؔ;QR\b_IkٚvN |l r_EZ95&8!H[ün͑b_ʑʳK+zez^seqb.I4#5ႜ`2:|$˨!qH=Hz!^̠fо #eqfuUBGJŖސԅVǧ15H?;Rx Ԋ/Rwd F }<%A2M n ij鍪]8 WQh ܡ lG5E:3W7+t6ا|]CAV]A| ;xWkDuda KfD!IvH;TW?]W0\7w-$W7FBzVqQ2ώu=V䧽LҊZ| I ltַ e"A4T4/䗃blgw7E7+p YBRct6+yKB '3MؒAȯ!12qϞa*:!bU*(R U*"Vس0Й ‚a|sF>غw!81LfP?5]1}vC$igI ^x Aդ2uxL_Zh<Һlu@VI*vJ:"ٚ|Ɔv/wA-{ڎIJٷ ;qM1HwR'3:K?q&!_TS)L[+KGvC`>R_РU4mZ庝2d݆EĶLZ&h-9+3S{{>QԎL奆 \)̠SfЙ̠Pw4 nDNԐxW_x/{R>?%A+hh$ۢ!3i噅׊dm5\ȜI^v(r2!#wSw{/>d*Ӛ9 !3cկ=i/#@h誐.3=_K;R S' G咇Ԙ3U!KjE'CAy#X!iG iu Co˳hL%_N/ Zty_Z`EQv)f#ftٔva:y<Н]庽Cp|m)8ݷO4ėv՞NӜT mzI͂N8W͓i A6sz9Hu/TʡVzt"]Y2JʁV#c ),@ Vm0V x8sQȢ+ 9:6 =[[i7K4.״P EKs-S_GrEj]MqC !E ©4̜dT,a~(9GΤJ 䒖{Zy{W ~g3&ݐ2Ԑ r>Y~2}ECىeYdeOn3fVEDEDVigTs\XXF y'eiBz%[ 9쾲u^ ip05 .A6:p9mC*LA>)u*?}xC+, *-3SWm3w䝬TE(X'@\ݯtreΒ1 y宫Yk[|N[Ru#žrh֭iȱ,Rf:/+ +UNջ 8JGeUۺQ^yֲ,>S` I!ub%[ҐkH.S,%iYc3ut%M!BL_27 %}) ]C"]EJ'VjZ6dWO,í)| 9NJi~q`ޭ$4\S %e%g_5Dd֚+-j+ۤe%fIYIi 3*^)T.}6ֽyܪPgj[mtPΒSS9UYb Ʃ?+Kg8-aϴ٭ȎNW$d4)kH =Dd?T)6a#Ⱦ!ε8 җ6xr74Ad"lCC>MR!߶y d/ =A;x=RyC]y[Nd-Ⱦ6Q5#!}IWB?deRB) 9MeU{.xtYez:e,I!4vc+[ Y>7wq|sX Wi!D4e!kBaQ * !uiF]i54tbIjhCr =rt{  ZIng!bnH,mz/,4N.5LV~iuk^ymk:9ίnĸBgB-@+5r2qM]Ź,NCmiSz_)a[nu/o/䅎g=w.udB۶gحTm^+Jl|VOrea1Y| ,h54+[yp_, t~n:+j^YO!T-/š/':T>=+dbsH@!%ϪoόN9d+JҞ WaHr̴lu¤K+w*m@F㥖%R"ʢ ),sNTRCvB{BEzjt"R!*tE\d?u+&@ ]r)a'e[K4$\ ;]."xW:<+1|0r:}jUֹiX:P0$:t| ߐS58d2/wI\W/g匾LC(N^]nnEvL=Y}y 0u1 7YBk3I1i4+iJGQ{fÅֶmqYⲐe+k[4ħ%*.KT\x!˸,.I&˪W@P~+r%W/7,Qѐm,@2%ŕ4ji%|Kozg I$~7c40:LJ0u@-)D9„Зyz5x!BˍUn޹eܸw&$[aߧ/uN,lhfĐKbȕĐ:֤RmL]V>aIr~ꗝ0EDj!5I,ҐT\RQ5}K$6ɴe#͂+/ Dq (8HL%Lz2p%Yc.V # mSX0Wև _LmYy_ZTk,2RfK]n+2TYb-sY,eY+k4dWۮT S֐Ϩ'J%d] 2 4Bekn=`\p!E^/@멁lխ{{5SaDO:=n^mnȁ6^k , )0حB} ڐ}-C=wCt~HyĆOsJi^ǣ8Ǔzȥ$EUm'eJB-LdP"`E+F^-"PkUqڵ'1rcxP.eXc낸PI 1ytۧVݓGҁhl=iu'|iCKf6# ^u =+i m2$ԟ4N+*)iadn4d'^龬OyPEIn{y[f:1-VRwKe.Fa/ <ސ/>'viW[H&Q 6Cb jnE7_G?6HC2a! ]Kr?Yi[iF餖w‚1۾P1ъdcWgIFC~|8_Y)J&s%4vIVJAӪ1Xۚ钾a|C't;us*;YI{f#IY_ BwtN/ȏl'9eBkIkiGZv,-s1ٕZoeB~*"O.d AH)tw ܤp!r N]VNr=A,b9Na|JM+mC'xI{| JȦ~\?ɦ.s aXɽL6 †حĜ!VKKUmG>{~afA=YG0*y0A  Y|44<69H:ş` ᳲ N  *ʙ/< R$!zB<`=~|>rOnXǿIOR[Kz#ew'Ii Ulբ<b޿_Lj*obQ}i^ TrG>@v\BD,Aån^ӭ$띙p Q&:Rg~}Ძ)4\HɝZ:+Mj5@s~m9G<4dX5Oa0OZeMA3@v!s.UꗆSAK"g;΀ 9^z}yC>5j‡SM6 Dj"U&{:S":ėX NغмmLYݹtaE|Cy]^tS{ZɳCAi>aKTߋc MM447/MX l%᝺&hԊeK??w\!/2^ÇLcbܠjAvե6K6Ċ9RW԰̆ԄWNW~2ZC,i9(>ѐBb&vbT^r`H42}`ohmxlW ֓F%ݳ/t@ռW| X {kCu@ V0*Ԕ[Ӯ@rI>aSg5[_+ו<4Dbkb$v*vNdbb+bT:ۣjARk [nʝ߳pw *ƴSKZj-ھ;'3IN}*SdT,{N8^:6ikK݊ X:"ԦyJ[1:PrtRUCBjȏ5Zb {mrd ^iw6:2H΋=Db3DPnϨ_(itF{!> 2oL-w=}L9]Wo26t]Ny*/,|LSխ1ႊW҂|ơ&9B)~@nEl%Ъ(_njY ߣNo2@^H9#n5@[nkuPU:UB'Ʉ72O*]Cý$a6HPҵةV|iY!W@'[! 3[ hul<0L=>$/!GdkqC̻jE:er$4lhE#c}+eUE9eYtj ? cmjHN6/-V}p/_G9C=cCt{|*N/tȿO5Z)0%"xڐY|{ְo(?ӹjFOD%4Co+ڭWRZط8 mc]%w%UN/JU%="+NY|l/sx\v*W4r]seWTL5:ޙj'4[әxA~DKr$3!k|id+yRĭ ;W aqkbyؐ]\D´cyHydq~<=0']#f蓧֒:Mt555H?(S{ߋirB~J>]ԈVr^3)=^޹+yM<"g. 23 CX၆{5`r_BRO'5:˳u+mlv7Dgیtbl㤜9ɑVýH[s*q*q*_w7tfDA_ngA4$[,Ar&wː\mnV)s?:^2hgαj3dT/]&Z!ehs֔,E {rF!C嗿kSy;[L }CR>ֹ "g hnT.EAiݏ|;!Eߙ|$SOy+"ʟ lsxqAxaYB3Hk74LYNeNpc6VPzvt1zrʕvѪU[>՗GZC U7XC jcQ.L!'FS)}>]v(̀WC>UWps{V#/h_i闑H^yCRU>,0 Q$BFub%AܪQh*K j@fe\'p4VBwe]N'BvѵAy!߶3Y`( 7d"5Oèe&龉̩eU_򘺰ΉMؗUMH?Ưkr%$w5p5p5p*,p*,R[U$6xeBbʥXy Ç/5I)á,y &qTd/mwd7D.Jj~Gn &dDsåX ,ȓm"NB8冟t|έtR!jvPbRA#t7WoO4WN&3i 9 ]Nߐoe;S4r1rcze͠>0'Dc.2O(2 Q$O b$!oOJr*JBzkްgBF28dw+lk,i+i}!'œھƄ s!d7 5hcq~C,2@^X "`2_\h!v6 㕫; J}5w~ogR2`mx1AJpZ wHY×$JGq'cV9UvZȗ$$0(n{{/LtXC!]aTjzbӽ|FB +mSId];_ }*~uI[Y{YY{YF{YFY 94,v]` 5eeee%|YxYx)!ft^UF"+44"-{q<&>j6ʊ]Gj|^(~(0ByVH-(e q|{,1͕5xܻ[uĮkhEg-4k9q~%fRY ) }{K94WX)QήipBR=jk0 /<*jdᏆ2c˒k1#/*jm(yĜWAIqCt΢f2m^5dW]1ӑƒ=}! !X~%ߪ!HK<9+lcrTO70eY { KVa faa+WL#nI[+Twpa:a!MCjV!d2ƗLeڕ~ eՊVsc_{\T9loԆRj- G16,#<C Vztv$h3 Z}/L*J!w0/4",BvB6SnH_ցK$mCؒM,:y%$U Bw! j"nh-∔^݊O܂7w?(:^z_rݾU\{I[yJ]ک$L+mwͽÅ ~LM~G_9+\9͒ܥpeّpPJW %l|CȖ+b A1UY4yIzY)c6fɗ}{nVJʥ)}/>kmnpF|M>~TVd .)PG*˄GN  Ga642!DCխDaаދ8.oh6@I~ȝ~M:1\rsY('9!ڶtYSn3}3}EfjAI9IC-4~qXC._v+̕TADo!nH3(*_Y Ǟ`v&u+HI8C>&-!u`@vSj7k !Trz qbؒxTx[e\tbl6c';r TZPY,ȮZvNd0k˭!ܤw\U[fCfNnU1{ s +&n+t+KАEX_K$M8jҦb%w!~1I_NjnEY2,Yr>^`md. (OM2&jKٛ|FqQK^GmeJ 2+EcU;TDg~<~ *B4mt >9\ )@UB]W[jeH5||jJn=Mv6D3ʻvOj5,Td$T~;1u+Ub)(=u3:>p%[J#u5l)CYJfMM͒W×6yr5gtli3U =|r&g"]R){lQҗXm- P=_C>yApԇJTZ߶Y'괭YpaXG<_jo(eO~u>oYe$W,{&.V* ̷uu3jQjMҋ1Wx-2Xnog4K|Iz6DJ)9{;5g5e,Y,/Vm/kR!܂3o4Dr=Tw<ýYu |A EMp/&C5eqmH$3 S1b y=3^h dX![cj ڷuH&K4DS4eAZCzlE;4mnsCtF[|lLKGJ#E4|) AِT1R ?j̞Y{n![a9"YH&. ^ϸ[fG9;Rø(' 1Y<(S4 2/^ (Imݓgє,Vvm ;R{ޝ%}C9g)S2W#ӯTd{[J_j{!MjIgY) x mRYԾx#X~||?C߳R[C+2ͤv4b {[9X/ -@.OgOLC+85<)yRUdLfcCi)T*J]Xoo+R7tU1 eRnڜLm$Ĵ˞a:1Å"m Cm,KN:_E4}{K@:3b G[dڧ{Zi˿[iϢQ 98Y.Ҋ!E7d8@nȮre2vg{E{c͗v+JVv5$5dt~'ɞLcH\U+/aA8߷ZRv^v`T nIl+ȓΠy#uOYCC+A:-w=#RJ2nnh k]Z>Sb[VCC",[>b_u2aɒ @Po'eȗAyԩWN\j >ode5;U{eRo/hHv2F'W!_rgS(隘ruы,e$s$]n:ޙU+ &w8> J-0L=IzNؾ;'wepP݄=D">ZUjة0i~ Ÿu/l{kuYܓb_Bݙ)޹&!I:^E7%n I'd3lhhdQY_s1Tb* Q_cְ堶,d*8mE lngc&nϩnUݺn{fcKOʔnŜX:$tl̏./.|;:5[ŽMC,MRhݞe;D)guZ/tc=en[emԐ BCLUK}iIo(3+4ܞ{>@C&쩡{J?vD{fmœs O&gV08iv6dٷ_ȁƟ!/8-3hw=tC63] Ţp#o&ӜBk 3*NFSrz\fn>B_!Ay=-ͻwg"d=̂ .  Ydz!>>ڧdS)Y}>afo7_4^d@AZHf}<4d C5pΔhO Vg͐X@U!@ 17i[T|--3Y 98C)Gja sjt۽+J)(_.sA=+ۣVEz3AH9<53v"ʂ''o6c8*1MCwu]LEse<=: ~W32U݊nV^]䄆lRBʇ q*qZ04sTbTbT)ᴶ뙲]D%mO",G6f)WwIeם.XS8חx  밀/f uܬBR=UNOhhߐό?<98&AmnY95ٷߓKۖEj'=7dzӊ@"O"sChWL VFJڌ͝,PJZ^b;e inp@P 48GV~ V>8EN+n]kLH;Z|Z͚s+p>@UͰ! 1ozM$iFf7Ƿ(pʩn0& ܶG,;&^L@x9{Cý/KzX"L_CQ]i64OȀ~ҼkTҮ[=dzUI{%rmMzS$TTjզ##ls2HQ7%bISCPo;W̆<K㕋{C|rǵx~1|$U!t=QznIsދɔ !Bb9 ҋQp)אդџ)׷'.:xmQ pf!4NNNeiJu1,ؐ'T~:[.jhEQLf5D6ijh#AX1eq^( 2ɑˈ.zi4kh9xhC]Ɋ/|"Z28v^ // ld2 ޿h.&ƕ) y{ ;2gy!&k?Q6|7c.a##?}JV|z[!ǒV>ɂHE\:z/}0*q|!UNOհx} gwaoe;٨LzOn{cMs;-+'JI[ 9%)̧IJ0R3bY}8^o&T]53u}= Zj-5>Yռ[9޹w+KX 9Y+5*sPaͯ>+K㭡00*.daKG]Jߙ@S2}QR4%{"rQkx1 q/wLJ1 Adx}Vm[ԬP<:jc rNLA,05]3sx1u+jeINC>' y_|VeTw/]bАkrߏMHr[s#\qY1$7kAHԩi iQڀi2I|O''־^E4ª-jd_˄5g.THfIH_җB2C)od-.-F:sҍ~umUFbBH sC(|u{.̰kmqZwp\ I/ Q߃}j4cbˊ4˚˒1/Um B28cZ& /t&NL9ʽfZ+PCWC/+?K Vސu1tF`CW4ri_ 4tmSEAUWusD>O;IRD^k///E`W 1ԌXCϰCC>eXސϨ\RazHm2]JQL4.Ka3{YG}Ym}YZ}QZ,@@RHݕ20}H }hHޯ |qlwoTFkՃ}6beBMHpn,®KV|k *,JJJCCu t3 f5ɤ>HsCÅ!V fgkx RY6Qy/䳺IsVrjX=wumfx{i/M"l|XWSdHJ?Ή; Q8tn%S٤xצd~_ m\܌oY!_Dď[KEjITP[2JkKW Z0OBC-a\ [@W+pH]!?*XKAKw$TxlHо-`˗.ꑓKddUlł|^7˩4/bmP4VA 2q{0Q s7B+_tmBE mnEqo&5xQզ(1=z+9J~9Ca%~ ZC!¯U־o~Sv _]/ _ AQm49,u_iI_ !vJFsAG/aphE0;}V :,C49݈\E|CInj5r|s7%<ىo+jfc]x9 Gx!W߬SOF xƾVS!8_(%!ME>M2&vK2mC p\ݹbB&.{~SlZ&H")i_SG`j.OtBGPڡU4)p/$,qXU*7e]={V'u eÒ 肈6*ӎ%kH*"T=m(| ZY/B$'mE y`!\$8]̀DC>#MăJy Vګ @Y :͕vtC9^+WfɽPx{hظeoUuɹd-7Y5v h,Cүtu+BqxCV8SŐ r۷wT=5jLҺ_ZJUpÚR:UpxC C{I`nD_CW钆^JP [N& ^LeȆWksOj/~|ˠHfXMr U9~9W :gD*YW_R1{X`Ǚro([) \~3_]E@|!U+ ȼIR! N7KZ\GzIaW9(suX1#pd Iػr5t.-;M`?e彆8id'r+/~RTt;т}%;s+{+u ?3:9DC^֬|ܐfAA#RSvM5:r93ũ?tօwQ~aM8o]B6x/N%O[/߬/=yb%_̨| ?fSDSѼgPC/_SKľ{9~/in#}(y Eĺۯ;:s4RC$rZㅆV~urbS.$!8LniW{NTiȥ*bz!}A2s{ חf 1^~CRδrr nH SJU2y b逫[(3 74hv:$9:Y[H p2M" Y< lP=@{lhh$?T&lAȇdP!{<r@aGo떙 _~_; FOkl1M&BC(|1=gqC ^on BөA*G' wUP\<:#QXMH^/MoՐ1{Q3񥷳t5Xۺ0a3?x(UΉR˝oK?4?ww/~W՟~5{y_~?w~ .{?o~_o?W?/)g@?O_~g{?oW?_?o~?v?/8oV No?zw sgg?_S>slG\T??W_7?ٯfubr ?~7)>g?ՏW;~?oo~_goowkgO~?O/?o~?ۿ?_/~o_?ӯ6Gߗ/~{ y~|j?o?j_'/}0W/~o~wX2v7?nMowo*?_]ɿEGenomicAlignments/vignettes/summarizeOverlaps-modes.pdf0000644000175200017520000014172014516004601024541 0ustar00biocbuildbiocbuild%PDF-1.4 %äüöß 2 0 obj <> stream xZK7 W9z, ؛]&-u撿_>4<?"%lÏͿAaLfuۇ៍&Sa;!Aq0_o6ƺO~kgTřm,8!VA 5O*XbfA <04bh> ^[bz$l=@jNgaTԢǍkXP ح9VMǓH3K S(xI*6FUx2;='9ÎM; U DE)bYeKM(J/KJqC1YP -.󞙟R]7[j2OOux^iev^Y`lt٤"Ǹ*D`OÐvwcr;Iv,’~$G>]Z1Jln ,Ch ԐujzQut@ .9p.QWځ=L>R.;A윃Ʈ䜨έcPvиNv+.цW.q]~g&cCT3eޤk9VTFѯS :a.ܣ:S,PDhX]gzUt|r@`}5(QDcDZ%- tHUjpunu aXSQxWS bR\ @CR^8a7YeL P,vtK endstream endobj 3 0 obj 1902 endobj 5 0 obj <> stream xy\8|<3><0+;CHx0;H!a 14Xh ֵ5uKCQ*ZXf~*moU;!j#Os9 gFz" ݻҏ~(Ba}a>[w}+>DCmOW!wv\_P#Tb'AA yߎ]W|Qz䓐3GI/uEe"!]z?= #I _;H}:ӛ{p{0<bgXN$HerRhuzCdXmvGŻD7CX\ȎP= v"3?m(s*CV#5ڇ_Acb2d"t'z]2 &kqQP*6MSJӸC W0Qd?Ⱦ/b_ZyGe?L}h+z_Fnԉnʸٝh:~jFDoN~UlSٷG0ꅑ>n'gEh1ZMlŬ ff_VxDJԁ>j΢/Gy IքFЕ {=Ÿ13f;OӸ ){(9[-fQ E/q ܰdjXa:^<~ t3́C.RBU =h/ pE->#r]):h@Khƾ4&yV< kv|߆'MF̸A8 KB$VH&yh PXCel,b**k:3̾=$ eˁ#aŸ p/|yUZ˖uz.C.=\R%zD5{lSZD (*C ?@v~ix2*t5:nyCG/_w>}Hufxď7oa< g1ۙ๕9ͼuv{'79q\VT эůHB0=S46Y4km/>1;Aa'w@wW`H{AZ_x6-tx<(,_?H;`m'y? O[w 1Â4 `Rzf9¬g;3O0{C2'Ygcl;~} O\6r۹kW׸7E.QhыbLA|qHĒVVUHR?h`ݧ.Ry xHT]¦EY7?mXf؝ٯ˘x#<.Q5 ݄7yg!IfgT3r׈3TS̷kkϡj=-=k0Ls#̕G}@z/anEO{oY/ *\Ƥ#qgMA_D~ O"bī%pkQJ0}?`'q1V}V|-ďЕIYvLtZ#hdA??,آ7D7FZD+oٌG%iP]=A2h_X {ab< ;`h&'󰳦P#57q:AOjܗ-SlFg)% l6TmArQ<=4 \^ 8/}ʭ{[rXaب`_F}Q=nm써#{oR>wOvU6f(•} /W>c #<_Aޔ)2=<@`EϢ]O@*]Ü.c`Bd̺}/EN .Y\:UUYQ^VZRLcHQ8 }^w9 vb6:FR*2D,XhwY'?+b$킂<-8Ir-XנXo?hx%\p3(|eG?;e{vnlN(^y,N*7{'y cn> yǭ8oodscnEq}w8.DhTO׏K4|Y ?:|Ӥm({=]ng0nBo>n${A~%ֺIc3e7 0s]q|Lȓu5Vm$%2R×wcl} Mx*{7{vo[WD:vI[/EOhu9PkR蝯mNt#JqL6{aMU$Ba5wVC^{~⒮|د}HɼA<G%4_dƽi- mڪ@|Im%symO !ig:I\q9~F?dhQ=M7Wߴtɖ|6X\Nx#N|0Qx S p"i-щPb;JO#߉86}},-JHHGE##RD.+b$nr.)tn0$,.u7 ɥJN0ثT1 6Ą& `0`$( cNp:̅bH,ħ9R{Ļ-Ϸfjk9 ];SO%:} aN3siq ֕TTqMfSi]^ZfPW ^o@WE`cUr>,y:>`Q]${yi`evvUo+b)I5LMKFcL<MNOpӏJUJeYY3x;!?LTN!?sc3L=#pƕ2NӞHKuc㨄J9 nU~71LytHYQ[;h3g۵Ӄ rPѥک %s d~|+2TVUT1bT.enat4.{D)LwhX큨Z\ "@"EEEW_}5ofZ=:nωŰd̄&OS<,lZ%I E+@c)RM*C$C*T,uE~6P^VYQQY^*J#)ꠏXE*w|~Mj&'Ə^fC/7kJcMz[q5=Ұjt^^_pFߡmO:^R8v-\75 $kԊrS SýןB:ew0Lm᝺;7MZ`-ćlE٢Pv޳%haMFb؏a֘&]p`6 FQ,F5 ӫld#$~WJ' B8sWj Zøapp 6t:9D|b ~}Z; 6s,#,֙S>3v!v*R@r8RQWziȽD67}r(fs/xۖC[K;nSߊ@/P6ފB9v⃝tp<ȕ)*] ^dZ 8 _(čA~".r\pdEGÓs_oVØhy }/ۉ5!}B!BȎK7~/Nkwht́:MsYN("oI;OHn gsUc`Q׵Fv5r;ҶFu%v쟹{b5#YS*pB &KTKFyrxR?a}4XXlv^]+>ء:@+i-ʭ.]Oegˮw{.;v{e.`I-V,-|C:%=-e]|=>fVwrv3]Z%9=][CXq2i4RMw*+fdi,^I/ mamA|Xh:#3BK db*;,#1xτs<k+y!2Ҭ% ZwDTZ@^#o!SB5)=SYV}עw-tJk|J 3`ߵ!pd:2'6j`N')`;4)Fk`MlBb;J*H1nZ9,֍ ؋ D8.v[Fg큖l(gZxQ"$z/3>xn.od)T7 Q#~eٷ ߔF&u&!͛vK()q \xTG_sO7ΉwT ʣJF9(0i ؒod];Mul.NSJm<6H2<fYE- PܦAL٘˱F*:ƐwZctŘq8Ǵ|L.E9͛ża,9DRp,$L#jH5 b 72bMB<ٺ5iA-O KBu5$/_eL-^-h\6cBg^ٸRg7 h.K:.|>j#+lZovT l+ pF<u̇;}iߘOZ}@"Q+%%e4Υd.i*ĭ2aGvOAkt7(JBĠ̒]}9IMm9STYU>IYѦl̂[-ӒYYYD W]$2MrҜ%C8, b D ]QyB-**Ykql}}.8mn&5EEf3PVw}1[sHXB`tX8d,t=bu܇ J}%UPc1X$*=W zAyRs@394VӌE9#3}V3' 8nuaKeë܆Kg*\r/L+_Z;]die +k_TSm'=U7eJ"uڶ(P^YtP,-ڣ4v;YCV`q]wXns|[p_W_>ŕ.[V"A_Y˹*(US3$ݡ?W'Wjnu. 陙3p/nѫ$M8犗+ K=kK˚5ŜΕK‹/i;qhQt$a{EM.ŜUƆ~$vo%s u&ڴ4,DBx`iI0֤;zej،=VtXUB\zQ)D|2lv\Jǿ<{: /?Am<HSEd|K/A;?.z({sߛ7B[]vۃ]v۫qٍn/*EZoz%ƢJzdڒ6l+T)Ԗ8qh|*~:ƣأQO':4^y_vsKv`t}MDs (6JQZTvo)ʛX8\!'8E/Bnޅ0oG;}J%CNM`W^9e3ϔn؃ͥ/Oh-ԕ-qkח2uE*0O+8^.;&e%/ɍ?z/PQ ydVm1znhxd}C]G4Fݏۿ 3"Y%^7Z68:NKqXaL7fy/$/Yߖu?-bf~F׍W3ʞ@1%n ' n)11-θϹUmoi%_&)$hA$B>UX*w)q8d -J"u4Ch A2RlؘV>jöI N91Fb'łX$?|>=3egPG;#Az;K.U`Irܦ' )VĜi% m*ADs u\aW߸K_/.r^ŗ{h2|ob[o`@"`rz}sv4:R>#_D8Ү~J{H]ŋ^<:$ݧVzm?eͥmee'l(7az(n :QX.mb # E]R쒏əN3r%aV`)3Ƅ9ܝ/6CEyjjm '%*, $'T*x\ͻς}a zUf,Pr}ic%9adW`[`×ސ~xUEĜj孕AQuZL޵g% ʼڟL};}Y&Eq-iQ}x[yͶ~4Ƣ'!{u?<-_^ si$^֙JtMOL%$Bb4 ]M"Y!|R\Q~`ѱd*q.<5"{Fh[m~J(:?,yJ"E@j*NC0hs8 \ME{ѨU­KzcitĺLc&NUL߹Hrq}>w#L\$4lbpҠ? х($H(U"RF9s|7.]p3y~tmg}-b.q1칸;Sھl6^?P/7ҩψݕP Kn4` uuJ]Ncң{c2X+a::"C~)ŃwJ&Y::w2NoƑV-&zX*k>מ<ñIo(2*zN{F}2VW\+`rԘPSj}˘{C NyzwgstMLvFjO䍣,0ƀr`rr[ ,4vdyK/ۋRl48LKɺ_CKO m.sKW\x]='2[VHCYe0o} !qt& 8$lbG۰-cmpfd>xSv (< !"F$z[v.@Xl[ W6 pH$7Ij"T)WHĜH|Yqb6N8͏ lrASG|UJd*IySojWsk33<̠fm3 zTܹmr Isqc")l.Y;TK7Z- ۣnz\فs6cO/?3,!T]vqnOw{]%nC.r1e_^f b]7x`ޓ=<=g;\w.hF8NPoanq;;҄Ct!v &]\v+xjIfJ0p fu^õCLIc6"NT#,Ȑ(0W;. 7eex;6xfJcݫ ( 럷Z3/;ѯvVIZ+??w)ՆKBo؉MU(GQHÅPXi-LW= +*ltX;lvH%RjnX1VѤiW:N^8:Vs0PV*U K 88ɻX֤3J-._ZQ^QI11R.^*W\Zzi٥VlT Eؠ zQ8Yg |wHHܙ|(1z;skUv4؏W1`C*a/pٝΧ IIHF.P*e h"b*1b)I :-uuoX$sIףΈVeh?s< Lay2,$=x8˰%oO#irg8I%"f5f6~,Hi>?Mv8w KJ "*+Ea 9 $!+)KBp,ըE~=M q)׉Awy 3n6vmwko#9#h0wTX4).IB]׷?z"KƍM~vQ6km>տc6\s6re.YRڴۮ[/-֙kl:9|[~\nu%Si)]5[b*,|ꆕ׽ T_MТKo\67_oX*%wٳ[QGm)ky?;}tmۡRrvW;TZ.W@4 l0?h~`@W*-h5n.- 67HFoߥ4?}Tw 3t:B" Ye!q\׵J6Zֆ)ho!07]o>`U6WWdRpf~90N5Zv(u"\ԸNk2{Ii(Of L l!0)H2b5^Db-X  (~xtaHVr !E Fb3rGR , MOOްwK`OZ1+~-+kŗ$cɹB,?( JA`!0`@l0!}a: ģs):&wakԆOO%ڦg΂NM[Pm9k֞'a:ٴ%w}GsZ(pAZ"R怹H1Ki grt*-P&NBj  0$1 cj]m$/ǂ%"/rwwU.tsËs?ʍ޿Q[EjlJ}_)/1{/hu5{KVa&4˒>?gO,ScŬLˢ(E*R,m-Dr<$wKGKŚI ^Q-ϼތw }m=;?zaQۨ}q(v$")yRk*;Lְ=zN_)U(*RQzEꇼKΡ K9t.wlG&sIltE9a16Ri}D*=zϫRp MDN'/>cZȕp)_uuO"fLj&q` ڬqKG|C5d`2<*otF_ΐnޖJNb=Ouo.pW$RT9w-篵g.6G(:ĥ8,u ^t IHs&b{_7t76 ֣(s=K5fwzn)[9r,(ބݾ6B5% YSXײ6bFT4RJS_ID=Ekʗ؛KC*j1a =LOEy=sNh&jU0 pNЫ``/39^/`9|&3tFq+ύw*qM]tEsNWgWŪB)7|IԦ;xٳxG dFKOI U+ƬǬX@)F0lx~dA?ˆAitcr$_y8hn)Iq0cX b bc $T [0,K~oB&K($ɦcV>c^&fm{ 1 pd`K%V(z̸23X+hcBV >1|A B-dv`'x0huh}|;}w @/m# bQ. 2|Tv\ȮS^WPѿl(!P:VB .hFFtc)93kH*Ta󄪧ՌsӜ6ACUy}΄T0)qw*119H9aZ1BM+ NH/;>m-[>[[][Hu߯XUH.`ӏ4`Jؿ(\(*cO<]>V.qX(˙r Slvjr҄N*4Tܧ4%[hr'q)HңW|Jc\p'8t,T,}N?[[YmhPԃ9 oi /л7{KS?oR+.2ry\6,+ָ_U6+M ޻𳳅BϷ%"kekV)E߯Ws*qu$ OmD7<vpC~IfcF*L0*-5BPA} |y2e h"N!% -QRyy-D= mx1GZfK؟p;EWD_k%zɟ:dɟSܯ[Q7kJ/?iYY^jlkϯЃ6#3LՁC)]nAr+0FNci/5vaEyїYyXz%ߏu5“Eq es~PJS yȓ6Q7ztCreiw9)C=Ahϝy?c-ysr>9Ipnܜt,20w-+T[4羋9#Qi!|ϛ;!94T*s y=B?n_~#TFKkv*/Gy\/x)]NRsoȜM^tOӄ]4l_^'<8Ƿ/J=ŶsBtuf^K=N0ޜw+yZ@ۜ=B)N1^ {W^KU|\Цп[XIQœg7`59KMC<|F&\Oޖ#wB ޼=.΍Q>樕[pޖ>Xׇh T ymk>޼%379?GN*!8 NUP$d0~@)W~ũT2QIm1<įY߷w_ӻ_;k#] ?T7fȤ%>ם6PhЊu?!~}wWWf'?߮n}aha5|˶mqkw?Իw4Ϗ؞Jطot۽fu]{Q~c_@_ݕ= d--Yop!(wmx/34wӽ]yIsek\=VwP+ݛ`;w}ޮ!woޞ8ϯw@֡{`W/?Gw 3F{SL/FmV?b ̇2ݔ[}&và پ^1ܻ{oO/,ptf $3пpbHzgȂv ptKd|%<8PrtC!ҳ7颲ߵ{ܗ#3H>~ѕ邾0p_u$ǟ4qxN{Ewo?Yp?־}0Ho\v7#Grru``EhW+v" ;`29 -4z]r={z3}dDb޽]yBAt;w'v 51LX!;2N*Î{{$.kZ֯\nʖ5|2~5k׬WUrw7 wP)@?fUZD {*ȉ,.wm6趣 5u ( ܻ{D r/ޜ& g@D`h@3;p)% pᅽؑSͭ֔ׄ ]PD+灊DƷӾ]==}dP%J[K>T߮vd_ t20(D>|8 4I5Z00 <& c㇥(wwn k4ذJ2WWŒeɤL eeWVJ/vݿ݌$ȣG!1 !qVq9 oSen'wqŞ`c4'/V>yɋO^O^|b+X'/V>yɋO^|b+X䋕n?.]C}z/y?f?ysMrn1ĩf :_{r߁,Ze#8>e0>xO>e8aZ> ;I>^<&VdF 4R_r'BG!%w ;Pn6i/{o8c&.myI,@t+V`1{ Og:i r)kKyZr HH((E_6WثU*hsP%|CW B!@!U!h?IA8Fr^c:^>rm?JjavIkaɑ 9"|!m{imIRhNvOC`P>e pl/z]vIv`".ـϳ%U@$l @WvҲQLD˺[˶"Vrqub\18ħgĢkwQXFөH+FV+ AѪ$XuV k!!APγAnt).r1i@*iJ5PִB脐׊kH Ԫ*ȩ Zf> Z! NbZH_+8ϒ0jjJDzu xo%r?W׆jބ?JϹ.+亟;WX=j.D$YBS&JMb8,ނ" .  1(} JC-: cD@ב򣴎@?:Q]RnXQAi8ghyK1ZNZ #Jp Uw[`nA: !Ы&b48v oopME'P|t\'ЖOGP >Zs g hx#TEV(V8rPzjqA@|"b ?{ ]"L G3tG4ۍ=cwQ勱@qgg,gl9%]g˨cw9{nK#-ب#iӞ]T4(S )i^@Ϧ"LcM@ 5 h8P&qA=F6L 62LTcHJE,"%*!)N)_f1=U" TJpN> ;wiƟ k[ePHAl,nnvfkw MMH˛VjVt^S{r=Uj+q tw1\su+]K9TN\IB;0sjrLY[@RTENt֮}`z> endobj 8 0 obj <> stream x]n0 em˺w)BZ[Fm ,rei!\;X*]hDIX'1r,#4B)&aV) \|d f|@.)LҹyB.c/??z%?9#J)c):HOS+?xS;͟eAm2'jl8}֍ v7;8a=꒸ endstream endobj 9 0 obj <> endobj 10 0 obj <> stream x} x[Ź9Z-Z,YeIG:lKE^ǎ+8$'8,NXKh-R(r 嶽 -iP(z9v }}C'3?o3sd;(Ң݈EBX C!l4/*$B*Ͻg![O rk#`4z=B@b.RBm{/ f7 E?\.ҿ=rXœlu_C쮱X M!HDtS>"d|0<PA ++*uFKoKȎPeH :A6_:fb>ZE[aQ3.B]H 1a"9NCGmYX:nA{p.Z<eEtLzF߇VKh-L=s }ݎӑ z0z( Q+BЭ@C#G%Y _A ݊BSxN&OrM`%թPԓw7%&Ы2o@e8 (at:FXۣr|MOD}hė9-?!; `}at/=Zv|}Uf] !q6q{`h2TF!| >:c?U@ ]Z{!:^g9>NUL#qso r(_xn_*P'>ZR%t& {`\/F:rj+A*f} gnVvx: ^WjcwNA[^<\VZR* y\/qs.#Ǟm˲fZ&Aj*B.c ^.M||kk4D4&8hj9'R4\L0>)"&6p6X5\gM<77M|78Mv 藺`pYM\r͉{{!MZ#M Ci5%!l`5Sl9a 69ҟ\dw oI ~EB(NP4&tn*YKla M SYg@u^;9k#ս{ov-uhX&wo L9bzfcJ`JJ\_o&-r 5{i/&{or'#(ۻw'|w)]75c8۹=C(Cz > Qt[,& \t*E޾*@O7Q~PBػPCmæ{kwo ϵMs~8k]lћ쉖u"qM=,˔ha?Pβ*!eO(M){#J!a6(+`xLm3`nc.d; G@lfS'ݭ]YzJϧ?Ojck1f:sz$'_Ots&wyә2s`9<?W@sX=|ՊR`]x+b\W ŝc*ҥdu~2|GVSn8Czŵ5OIqqi>_nz&WBy::OBzd={Pb4gfVTþ<_N]=y>)k*ÿ̩^mտ\la|u&~f}=\ܡqϜyɐ['=N3(Ȏ EՇ4jΦ愪 \kW/Y\°/>.6Wm?w2/Fr4+s.),|y7i9+SgCƬrҖ !ߜ️%M35aZJh)ްVرZg< ! }z ZNjX\5:G4Ȭ ZFjtlzz='KD=4L8.9Z-Jj>ޣ<%?z/3ʭS {yylƼ:S+mwy\*sm}@}f \0c4EDa BsZ7µ=e4 9 eo.#,+(~`s1\> amdLS @+RԌZ` ZΥct,D5夘0-3BpŠY1rd\^g) 9st*s!jO-Q;{=xNS➒bp+2>"Q_æaӦ5+a /;c䀹yx]:>CnAz:i"UOSU vZj @X/òl+Ţ3äg/<'zĘ!.-4)֦56}8j<+`{:YFaמA L99Ò(>{Nv-Uuƫ*ÔV>Nl m?frM+tc}ݺ}Y*@cJPS6YI6[IPw|{tϝzX*k(ә}WO<+_m=+/yoϼIfB-Tԧq&N3^9dd]v^I#JjO4!m,m.M2&ƹIt1)v Tt[# rh3(z)VϼyfYp7;]Xd~D`XkId W $kRen[B>>-C3f fr X#hẌ́:aY.8䚇v,!%gL˔ٜ!hd'ʘ8fز;.w X ^i3zywjX82 /ĕVyx>CCsݗv]uh}g_re-܂w?9EK pХ0{̣AK4kʬM6YYҦ-#`G=;i5^T&V28sdv_R>3Z:B):;w]2u(;)yBƧ֘1?]I;*USlh)3ÆE?hl:cX@NTrdZsI.S.ݺxg-98 NG=7#~qI%ŏ T`G1{%`6eu CPA+5g5y\+ש ,ڕ6BZTBw0. S؉s) _Y.vWv6q@ٟg6ݑWI (MNIc]F0Ybr >,<^J0ׄ7GaEؤWTJ"._p|Ots2M\' YaJ0U\MsJ,x=)30p>h 4h dH\>E)@@9F vҭ2End"өwΦ~71A$SDwo\NP o6~42 CB>$ZA̹A` XR0Ԟx;ESdq-û/zz!2xrqxIp" \E]̗4Ԙ91Ɲ6x_o)^^;x[pW>zhb0/ VzoqK_S;veU$~u|G^5V#~Qp!7_PouPHp~5;12v>y,׈%9Iس㓘a3X;ÒezۈiVF6B 8#G7}+)UJx|ΑǕX`JW?=H΄X~j jcux5&k5ݞ{&s~ʥI ?=zr_|jYZa= *Ju~/Ҧꦎzk,PDNdNmEuVE;ݬ"ʀ8Ko C1 E`k7 gT;&A*6+\L%spq.ŗ -M(ېdo)U>Fe;; KI"Pxyy ˗[kf<>,!fAH7e/421@aWIfWr&1Oϩ*b Yp0)f=Km^|,f(q}yEdj \;B~~*Ll,veטrs ű=rEo>.t=۩o}A>T098xf{ :ʮś6\>e6pˉ_'M&VUBة6 9^WPѓajJoy1J;8ېcza3u=VJT"ƚҫ1:Ǽӎ}NWzE=}[4!-"{,MՐݐ^Av 9zP{7GJr7+7vn<'ßɌr(2L2 fl0rD 89&qҠ2!)3|Tӛ?!Q/1&.c85I' 0|/s=lͻƺu<¬ars5|U6ݓrsa1ooFA%C8)ll}[`U=\Qt#%ƴ[[nޗliiL(,wZjr(90BG@ 7(XJ,%3`dV5sTU_ڬ&KPkL=dǔ/)z娒Q <`Bh`:/pg@Ɛ9?pLԹ9[K z^"d6sFbN=FjPd{HB5kk;x|-<1eV%W>Pg)|>m@$#\/]a(OVe>Po3'ƙ+.\ /97v@RL.t 6\BR@ŕӢ6 {^W>uוBx]ỷGxa,^W += ˜2@Z[ilRdg ֹVY՚׻ޟm;mێX^s{EA ҮcAV 2אUTW4p/m8hH45!Ȏ7 7y+8{{!\M9ɻXN `Aw pyC%vF'Wr|%"'V(l'BR'kkUS93ORV)1}KleZ6ZQuhZU ,ZiA=c+ Bπ;ҤBY,:JZkĺ^7H$C5r솉4W lgV,T|3tl3 ;&s  9yA9dwʡ)|Cㆍ:oe~pX<{&w}|Z4;K/M ^m>^qP_  6SHW %2Pu) R^GVTkJIa2*r}.nt@gJ")f-R(ΰ;K0%BIgXDu&AS;=km9Nu2pVrLAkEQDB-YJ$zZ|SJL^Af9m×[U}Nt_6PՅtPBt),L@~fJ悛V{PK͜mtYp }tcw(ۖ"%/ry~bH[rڗΜ.``Ŭ`pyἦ<6wɏf?P 9e8C#_`- ={f(UQ ~I8OeQYļgiE2Ԫjɝ'zGUL_fdk*1/Ek_75?ؾW4Ϳ-i\uet9*>˞_czk:ܓuYn!zivƚBOqoAKo7~ܞY_ʦ?7u+-gjE1)\st=ߌ.ZD܏QQsObY j!t@~PvΥoDjT-Tv|by.h=$وVB#P5{!nBfc't H0X~ ,<+ TKH _H]ϼ/in ֠ կ$XԭSVW%-26|_1K0d̢ cːxˑx+P^ Va$X2LFe/2La%ы.l? ڵ$X mRXM`Я%@Ǿ\Af C ZA?K07!ߜ@~wI07 C I0 ӈ/I0h7,C d- R8X~`PqN (cLL " (l&K0SNa /` seR'$?KaOI0Ź+%l Or ~{(ߖ`/Kl  Ha?OQ|DI$(j`_"ʏhZI;OTI3z)yShBc(PAɡ!m@nGhR\P#&&yڇ(-0&R -rơ3&qbF~nUUSTJ[`0`V!NGz1H穣Bi:IqF-Wy?{yq#kF:[lqu*9t` 4 >1Fxqٱ 5m8\ߥ#>6AWZ!5N@A%pLsGk| =@K8$@5Fy} O-¼1XQjo'jCM)2%aP-?N9I5[-D,H9P"wg1Aѵȇ@}/hJ24#]ɀ> 8mPZ&Q3(P]$an E)_#R9"vRms9*IP3%REaLmA"ֶR9EstsQShJ-Jm!Oѷ#Pm'|TK%,hDtdDI8)zDeFvPC2VF>Ad=!=m6a|L\ j9]./ڥ()+qE랤)MҵsvRZb#KJ'5BI:H.BgO)ODi\/HqO.D={&#ar4F%;$EOsNŅ8uɼ$vSIO,/.bO,۳-a5>[/cΞ bYQOГTzDZv)JjL\W+:k?P<ŖFiVG>,eQzro( qhQi?=w_\Q=WE>$gaY@O Hý0*nA^ ܖÐyCt!j0z\ wJ:Í$BwƅЇnD܆(>:2&qtblt"ƆH&bq.26H<tRe 5Dw"cщBnf987 Ź mqܪ87--$0 &0e뛈Rƀauh$2q;AXvP79򀡡hUĖ>ahhbtr 腋^ĆvDaQU&F ;&&'`Y6"}1nE$%Aغ8HqOi2FFvF'ƢH|<$,r;b)Pm`d"cZ|/m鏌Qn+YG0Y0薡L<96 H;QLetp}P9deh{dkdH4&ZD< QBG&%plƆ#SbcD|h0 vY]dNh0}8=NMh{lsqxdwF%!k6jYذa՚nM zUcsfa 4]E! PH c\j "75:IF@4YBzXazdD4JVuð(ktK< i;q@AI |[.%'D4)y/Y`#܎$ )X,_:</>/>/>/>/>/>/>/ {5Җ舕4;r\oCנow_#ZQ>gGlƉX4*?\N$0IOb=Tk_92NL(UrY|ɘO,f'F$K|g1ۤ3O %؈~s1x4/7 1#9;\*B(e2v$sJmprANfiJX!U"0Ԑ&C-H 0h:j&ǡyǘ0{fFQ*4ؿNH J$iH LKDR࿅8HY1 Ǵ.@"oddLtKJ;og؟#Ai(P>=3zCnMv 6-v*>*dhN:/mHc^AQb8<.vݖ,uqG{S}cF!4XJc_c!3`,K;BJfgԺ Zv9 bqIsy|Q&c W'-({ wwRUF]z\z_@3*E >sB}W/o&MP͛774"c_@! HN%AG(/=^^0ahjFN8"iʠhWhKcGk 1kVQ t)gd/j-rQ0pcnj*=TC#={ KA: >H!Ih` fH,wΤKGMtdz1J՚x(+gX{m#Yv$]$ &3U5G6 $բ4ΤtM1Twl-u1%_c,nh!/1Rv)tR Y 襠Rt XSJAbAmH zH =$$9m@{1 ~H P AnH Azc0bwCJ@z%;47XQ!BmB FxfeiôQ% dUԻlZPwYS375eWXMߴ~;kܯدd5haCx [Xt fA=VR[ujgҋo |+ ʅ"skl3;NX ` ^͘f%S4ٯ9Ih45bNq\qRBީU)v++(.eHY@ O@bnS@{ ?Ni1Z y1 @7:$Bm B+x2ȋޓ^&2s 5 tSy<z!y'xȋ <+ 6;!E!!Қr$r}&t,s{ X8"3 zv {;cnK6ےŢ쥆j. ;;)B)~$ ?8n3 xs;<gvA.AàLMFiy49dr2(f"I ZN\/hxyݏxݷy]CsB4 ^ݫ^S^7ޣ_#%Znʇq9}^t?t?twqnNW: l:5叄u=ʀlI=Re|1ұiIkUӂq'sI7@aO";>EFfWCp2q1ڤtkB y_I??(O8x/9]R| 0@99 _G,#1B9lGaTs9N|({W,+9P77C)(nOz|JVe,nd;0lA1l/b[gP %N[! ֍rI{O/Ad;I !ҠBp#9"$ŀVX.J69*2ƕo* ~!'+9P39 2YM2eL !\4@)!aY1z_UoPtݗ?`}``VU,K|]r]Sϸ.'Y]CuAXVovS?k}9]C]Ѫ::@G=]ТDF(g~溰{ x7 H* wJҩ4L**]UT*JbTH3;f e60w b(1mW$*mԺDU-켸_m>ԶKik7% 0 +9|v ]8EF\g'quwwY:cuKdRtsj-m8H98 367adבv< h(cj'1:,AÇP]"H4k(&q){nHM~&Hha-Ҁ*!_)^{;_7H,g}"Gg1o 3wtWoBMܴc0+{ !#-}D;hSbo-.ҽo:7tMf>=ӱjn\jCU:?{tw\dնnn:B+_k Io鵻Wd,sg]eT}HNh $l6.piҕN+en>F~g55|Ic1QYbG> endobj 13 0 obj <> stream x]Mo0 9v@HH 4B~m:smO$F9;aiƕ_eI6aM?KCnn᫣:x`ɫSԄY#+Ku[Ҏk]~Y˟X)=EN fJpBQr,]/?[i ە3%8%"xG>l#Hu<o"ID"&{&:ҟ#WTGNq ;]˛sa|0[6S;3* endstream endobj 14 0 obj <> endobj 15 0 obj <> stream x|{|Tյy&ɐ9a!dBy"` π%$H2̄Z+>ZE:mJm*Xڪh᪽,Vܵ9y z{~s^{zBB~ap{=3MQq2nIw!s{;/(7h]7ttPiye\ @r1;Ǿ}mAcz.gNl4ED R[^Wn6qv@NS6{8x:x> j:~4 yRE'3l#Y=|YMģ*'<9~ P ] p`wIjd/ÃK+H{9\  D>Mxgm̄JX ~\x=ed(#rWGc/:r ^|^Eo?q7 π !! "tDd B=BQ.G$\-T*G‘Hef{)&Khf}> $!-=0;$Zs&H\XW!auchP#~9 k5`-J(wz->[bA|Y~ +'+::Bq>mC{W>M OkgĠG!PSɷ[䏴n? WB7O?HY@VoNr5|C^!Ǵ6M) ?F knܪxqkcDnUסw~8 o>|H4$# |k!ZF3L|4@w}(>gB0Sp B$Q;yF@Gڹ@CSKym[zпrν7c7чVQz>;0➆I4Jr"rZfH ^c.S9iDm\G )r5 NvE}z!w{2M-=̡m_vI?"ͳ0,@Eț٘aVNAKCP8 *hNX宬tW,|aY邒‚ysrfgrfe:ffH4kjJrRbB|c2:F(GmvEc9`gJGKX®4aI)H%JB鞠$fJ5)JC%WjDjG>zq8AI鬖¤E nivGUqN.6F!X8ѻ$/"5e)M(Tꨮ :a!^:-#iNnTyap,Ǻ8 Tq6amUXH> *=4|ۨZ[\m6ưib<,.[NDdjih0\Xsx&)Ʃlj5p.ͪmEַHȍnkj mRb0dG i( Ŏ-pVfX`4Gڶ;WIuKG6[UhTD'gX &cDXJ(IuZ y { ~ G|aCU˰aM! 0<ǣh85.W8' }2.9GkBJ,͟|ZZը%hMw)L[ȡĵldh|dbz#y/&ΉXsR|MgY$}Ͱ׭qԭQnQm[0/Sp|UFU |r1k4F,n1*yj斥Jd'FΰY.sMo/֞&^!XpqpZaCCcT3g4rhMV0.90MśâsNn-&ZT;2 :$cx?}>?[28kokB[u9@ |jo:XZ(Fx@^9AP7/R\ʗ?-?Wb K% Gp >I<ޮvY  Pj:Ӂ SPwD(JQA"h6.\B>͌rPŕ7BKFb]»_s+5+{\;^ ""umضh$gSVkJN^Ԓԛ$$b4?`ff3`>6mbTۄrfMdckO鎢vbO*4gܙ9Ev]nNХ(ZϝXnsOAũs'*NqK\ii\鼹I_$k`1CaXtIIIs1S+\y /?;M&^8{۹wn1.Nf7Yz@'ƪGj%mhl(!3wLT5g)'4?$,gYN9gɗ2wt{~`}̔HR>z4f뫓=ٞ)*KsKs\zksM/Efe))!9?( #!ell:ۖS=fgL$F31BLMHf6OJ;fA,cM1{ +#s~m)9:vjJJ49+ef~AQ-k+T;oF[ߩOO\gO}Z~I@  sBߩ>fb~p͟_Ÿ"ݬE ) > IPDKH$sKK7A kn:8#s얛_i6$|Ζzؿskkض 1&kfg%M})}ֹ=m9Kwm-Xqh|FD,QP*m2WQF5τM":}E׫ݩA'ЅuttZR,54}z|%3!jH_bre%39-BK0aI`J[roa3Ļi^$?D]N}# w?VT)=;.O2I$>)J F IY)Edr($/2g5lXEktL"10HcѰطYK*Z`|\stKd)$n=z'"1VCDSrȅ Fkܦ" a"iI:@6` ϫd\M Ef-|{o.Ԓ#XX{- !o0Rєe*2U4 Ŷiqu[moB ͛咽?p:?RO8nؓv9}V+K6ݲ膘Mm1W]Ksq''XF4mt3w=tYY1[6@jLQ=+,2JR1'h }>%4L~c̍AaXw V*4d[yc?*7z_k07`ɝgb\1ט+JpM7|QE Mzӻ#.}֧?deеOo}Gӓ?=[vE ק[C3Noqx»-[U/_zנ.K B¥2>2̗0zI"9K%抯``|XFzkn3KKb-ϊ!zJ"IH5x\Zߡ:8L~zpN70CōBGAv}{x ]7a#*N@ct*.@K5mSq-_:h5ߠz7DzHţ`^Ή(?&Ac /%!"zt0$Z(u#. >JyMG)WqQ'*>J]U*>J8(u@Gօ*>zT}dGٟTq#_GfsQLYx41W43]fx5 sUhǹ. 2XKBtrЃR$~ J8=]8?j?\)B2 HOo yP\bgtat !>k5Df,ې*d#ȣ [-B)} 0 `){M=zqԏ~rfOYfNRԣ&[Oq2{niCIB\"f ی& J>_'W mAz6OULZdRGL^J*RuLQ;H'J;!{xKA&*.I[ynEB*J$xdXἦƋW]ec3LNWT/q=W2¤pyQޫzP SGs8R{نڝSZ ~!"^5RхpM[ŇWf5~cܢ]|>[5oVTMVB;]j]}u&>N[^ (]8&sjpB6כ\M^$u۬||;Ucď%ћUk++LfyWǽizST4ݾb;n. RNׄݼ5/D/UyۦŦ }?n~oؖx l MLveԬ즠eSU|"5[G'#Mƭw{xdnʃ!Ŋ!>\{y u9.[?B8Vgi>˞ߟc_y0+{)K*|˛'U{B(-&w+-;Oj_wJjo:9d H>ofsWM6IZ `HmG !5JOHrJ Ҋ<&]Ay&VB}Oo.Yx|=lM;GZoť.O0y}i u@3-(n&[`P zЂh$_&}=b/Ry|8RgŗNjj`  >4y/*({`ЏB\)ԥ=4 ur3tml6Q EBrO'#`-,ee˪*X..[VU|MTduMM}dlD[E Bܢb\LAifzY>R(_{:"1Oji +F834M,dt,!s;qR.BI'k0z[C45EYq0'L11Ei1BΓuR3G ^&5Њ=<\O[Feg\KBu}L!dMA%Hyyw[XG.%%XNrW{;I<(_=Bd |*+$iv,V l@؎AXa+A3|-$UV^U7\ޤzBV+R+\*bTp2IHc^, = !@d: vD 9$H#4āRF=1iXV D8p4}|ޣ!ջPa'A:.fdxLjXbwPGJJ sĕ",INSQۑfGH.sF \ V" "h{ `NZy Ax-FXF(=:\lL_A2k^L_o/yX/ۡ2 瘱6c=qHDرG@Xa;3GqȳpDH9xHv cLbİ)tRs=dccck3bpmD+6 İ4sd&"UZi4"`|&2~0횝c:@#CCdH&CגP9 Ȑ !7z,@S iRw :B$CA2$CYd( I=J3FW{*پE(cZ4:A,"DxˍDL853T(RN| ^0zaeC"Zoe,"FrqN#P">W^Z|_ɠfe^*lt"=NK 82JLaPiw0qZol}|2|E:R Nv1.}:;̵ 1l>gOlяm'd&<Kzy9J: q'ppgƶľde ܱ+Kqj[5+lWb6g}.Rv3uזNwnQB7_We4]>NoF^Ջz}hsE*JfJJ.pPG,&uC^kg8Fqac1 A]Wݨ.:\ V~q7!w4ao> endobj 18 0 obj <> stream x]j >aqB`ٲCд`t 1}uܶЃgᛱtѡxV訍KLڐSeExY8RDm-ΌiHsKݝ/^fK~u f02ҶT< ,f(PTL}s@9e" ^ HXK%`Կ\ɲd𱴌Uu#će T%>fƚ:3O|B,=jd1gt*Wظh7M .|_ endstream endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <> endobj 22 0 obj <> endobj 23 0 obj < /Creator /Producer /CreationDate(D:20110919112357-07'00')>> endobj xref 0 24 0000000000 65535 f 0000048860 00000 n 0000000019 00000 n 0000001992 00000 n 0000049003 00000 n 0000002013 00000 n 0000021369 00000 n 0000021391 00000 n 0000021590 00000 n 0000022028 00000 n 0000022322 00000 n 0000037600 00000 n 0000037623 00000 n 0000037829 00000 n 0000038194 00000 n 0000038428 00000 n 0000048006 00000 n 0000048028 00000 n 0000048219 00000 n 0000048558 00000 n 0000048753 00000 n 0000048805 00000 n 0000049102 00000 n 0000049187 00000 n trailer < <46F4C118FD5695FACD59C6662AF33DF1> ] /DocChecksum /EB3DB5A503E55D6801D44D88907DE7A5 >> startxref 49444 %%EOF GenomicAlignments/vignettes/summarizeOverlaps.Rnw0000644000175200017520000003243314516004601023431 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Counting reads with summarizeOverlaps} %\VignetteDepends{GenomicAlignments, DESeq2, edgeR, rtracklayer} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Counting reads with \Rfunction{summarizeOverlaps}} \author{Valerie Obenchain} \date{Edited: April 2016; Compiled: \today} \begin{document} \maketitle \tableofcontents <>= options(width=72) options("showHeadLines" = 3) options("showTailLines" = 3) @ \section{Introduction} This vignette illustrates how reads mapped to a genome can be counted with \Rfunction{summarizeOverlaps}. Different "modes" of counting are provided to resolve reads that overlap multiple features. The built-in count modes are fashioned after the "Union", "IntersectionStrict", and "IntersectionNotEmpty" methods found in the HTSeq package by Simon Anders (see references). \section{A First Example} In this example reads are counted from a list of BAM files and returned in a \Robject{matrix} for use in further analysis such as those offered in \Biocpkg{DESeq2} and \Biocpkg{edgeR}. <>= library(GenomicAlignments) library(DESeq2) library(edgeR) fls <- list.files(system.file("extdata", package="GenomicAlignments"), recursive=TRUE, pattern="*bam$", full=TRUE) features <- GRanges( seqnames = c(rep("chr2L", 4), rep("chr2R", 5), rep("chr3L", 2)), ranges = IRanges(c(1000, 3000, 4000, 7000, 2000, 3000, 3600, 4000, 7500, 5000, 5400), width=c(rep(500, 3), 600, 900, 500, 300, 900, 300, 500, 500)), "-", group_id=c(rep("A", 4), rep("B", 5), rep("C", 2))) olap <- summarizeOverlaps(features, fls) deseq <- DESeqDataSet(olap, design= ~ 1) edger <- DGEList(assay(olap), group=rownames(colData(olap))) @ %% By default, the \Rfunction{summarizeOverlaps} function iterates through files in `chunks' and with files processed in parallel. For finer-grain control over memory consumption, use the \Rfunction{BamFileList} function and specify the \Rcode{yieldSize} argument (e.g., \Rcode{yieldSize=1000000}) to determine the size of each `chunk' (smaller chunks consume less memory, but are a little less efficient to process). For controlling the number of processors in use, use \Rfunction{BiocParallel::register} to use an appropriate back-end, e.g., in linux or Mac to process on 6 cores of a single machine use \Rcode{register(MulticoreParam(workers=6))}; see the \Biocpkg{BiocParallel} vignette for further details. \section{Counting Modes} The modes of "Union", "IntersectionStrict" and "IntersectionNotEmpty" provide different approaches to resolving reads that overlap multiple features. Figure~\ref{fig-summarizeOverlaps-modes} illustrates how both simple and gapped reads are handled by the modes. Note that a read is counted a maximum of once; there is no double counting. For additional detail on the counting modes see the \Rfunction{summarizeOverlaps} man page. \begin{figure}[!h] \begin{center} \includegraphics{summarizeOverlaps-modes.pdf} \caption{Counting Modes} \label{fig-summarizeOverlaps-modes} \end{center} \end{figure} \newpage \section{Counting Features} Features can be exons, transcripts, genes or any region of interest. The number of ranges that define a single feature is specified in the \Rcode{features} argument. When annotation regions of interest are defined by a single range a \Rclass{GRanges} should be used as the \Rcode{features} argument. With a \Rclass{GRanges} it is assumed that each row (i.e., each range) represents a distinct feature. If \Rcode{features} was a \Rclass{GRanges} of exons, the result would be counts per exon. When the region of interest is defined by one or more ranges the \Rcode{features} argument should be a \Rclass{GRangesList}. In practice this could be a list of exons by gene or transcripts by gene or other similar relationships. The count result will be the same length as the \Rclass{GRangesList}. For a list of exons by genes, the result would be counts per gene. The combination of defining the features as either\Rclass{GRanges} or \Rclass{GRangesList} and choosing a counting mode controls how \Rfunction{summarizeOverlaps} assigns hits. Regardless of the mode chosen, each read is assigned to at most a single feature. These options are intended to provide flexibility in defining different biological problems. This next example demonstrates how the same read can be counted differently depending on how the \Rcode{features} argument is specified. We use a single read that overlaps two ranges, gr1 and gr2. <>= rd <- GAlignments("a", seqnames = Rle("chr1"), pos = as.integer(100), cigar = "300M", strand = strand("+")) gr1 <- GRanges("chr1", IRanges(start=50, width=150), strand="+") gr2 <- GRanges("chr1", IRanges(start=350, width=150), strand="+") @ \noindent When provided as a \Rclass{GRanges} both gr1 and gr2 are considered distinct features. In this case none of the modes count the read as a hit. Mode \Rcode{Union} discards the read becasue more than 1 feature is overlapped. \Rcode{IntersectionStrict} requires the read to fall completely within a feature which is not the case for either gr1 or gr2. \Rcode{IntersetctionNotEmpty} requires the read to overlap a single unique disjoint region of the \Rcode{features}. In this case gr1 and gr2 do not overlap so each range is considered a unique disjoint region. However, the read overlaps both gr1 and gr2 so a decision cannot be made and the read is discarded. <>= gr <- c(gr1, gr2) data.frame(union = assay(summarizeOverlaps(gr, rd)), intStrict = assay(summarizeOverlaps(gr, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(gr, rd, mode="IntersectionNotEmpty"))) @ \noindent Next we count with \Rcode{features} as a \Rclass{GRangesList}; this is list of length 1 with 2 elements. Modes \Rcode{Union} and \Rcode{IntersectionNotEmpty} both count the read for the single feature. <>= grl <- GRangesList(c(gr1, gr2)) data.frame(union = assay(summarizeOverlaps(grl, rd)), intStrict = assay(summarizeOverlaps(grl, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(grl, rd, mode="IntersectionNotEmpty"))) @ In this more complicated example we have 7 reads, 5 are simple and 2 have gaps in the CIGAR. There are 12 ranges that will serve as the \Robject{features}. <>= group_id <- c("A", "B", "C", "C", "D", "D", "E", "F", "G", "G", "H", "H") features <- GRanges( seqnames = Rle(c("chr1", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1")), strand = strand(rep("+", length(group_id))), ranges = IRanges( start=c(1000, 2000, 3000, 3600, 7000, 7500, 4000, 4000, 3000, 3350, 5000, 5400), width=c(500, 900, 500, 300, 600, 300, 500, 900, 150, 200, 500, 500)), DataFrame(group_id) ) reads <- GAlignments( names = c("a","b","c","d","e","f","g"), seqnames = Rle(c(rep(c("chr1", "chr2"), 3), "chr1")), pos = as.integer(c(1400, 2700, 3400, 7100, 4000, 3100, 5200)), cigar = c("500M", "100M", "300M", "500M", "300M", "50M200N50M", "50M150N50M"), strand = strand(rep.int("+", 7L))) @ \noindent Using a \Rclass{GRanges} as the \Rcode{features} all 12 ranges are considered to be different features and counts are produced for each row, <>= data.frame(union = assay(summarizeOverlaps(features, reads)), intStrict = assay(summarizeOverlaps(features, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(features, reads, mode="IntersectionNotEmpty"))) @ \noindent When the data are split by group to create a \Rclass{GRangesList} the highest list-levels are treated as different features and the multiple list elements are considered part of the same features. Counts are returned for each group. <>= lst <- split(features, mcols(features)[["group_id"]]) length(lst) @ <>= data.frame(union = assay(summarizeOverlaps(lst, reads)), intStrict = assay(summarizeOverlaps(lst, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(lst, reads, mode="IntersectionNotEmpty"))) @ If desired, users can supply their own counting function as the \Rcode{mode} argument and take advantage of the infrastructure for counting over multiple BAM files and parsing the results into a \Rclass{RangedSummarizedExperiment} object. See \Rcode{?'BamViews-class'} or \Rcode{?'BamFile-class'} in the \Biocpkg{Rsamtools} package. \section{\Rcode{pasilla} Data} In this excercise we count the \Biocpkg{pasilla} data by gene and by transcript then create a \Rclass{DESeqDataSet}. This object can be used in differential expression methods offered in the \Biocpkg{DESeq2} package. \subsection{source files} Files are available through NCBI Gene Expression Omnibus (GEO), accession number GSE18508. \url{http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?acc=GSE18508}. SAM files can be converted to BAM with the \Rfunction{asBam} function in the \Biocpkg{Rsamtools} package. Of the seven files available, 3 are single-reads and 4 are paired-end. Smaller versions of untreated1 (single-end) and untreated2 (paired-end) have been made available in the \Biocpkg{pasillaBamSubset} package. This subset includes chromosome 4 only. \Rfunction{summarizeOverlaps} is capable of counting paired-end reads in both a \Rcode{BamFile}-method (set argument \Rcode{singleEnd=TRUE}) or a \Rcode{GAlignmentPairs}-method. For this example, we use the 3 single-end read files, \begin{itemize} \item treated1.bam \item untreated1.bam \item untreated2.bam \end{itemize} Annotations are retrieved as a GTF file from the ENSEMBL web site. We download the file our local disk, then use \Biocpkg{Rtracklayer}'s \Rfunction{import} function to parse the file to a \Rclass{GRanges} instance. <>= library(rtracklayer) fl <- paste0("ftp://ftp.ensembl.org/pub/release-62/", "gtf/drosophila_melanogaster/", "Drosophila_melanogaster.BDGP5.25.62.gtf.gz") gffFile <- file.path(tempdir(), basename(fl)) download.file(fl, gffFile) gff0 <- import(gffFile) @ Subset on the protein-coding, exon regions of chromosome 4 and split by gene id. <>= idx <- mcols(gff0)$source == "protein_coding" & mcols(gff0)$type == "exon" & seqnames(gff0) == "4" gff <- gff0[idx] ## adjust seqnames to match Bam files seqlevels(gff) <- paste("chr", seqlevels(gff), sep="") chr4genes <- split(gff, mcols(gff)$gene_id) @ \subsection{counting} The \Rcode{param} argument can be used to subset the reads in the bam file on characteristics such as position, unmapped or paired-end reads. Quality scores or the "NH" tag, which identifies reads with multiple mappings, can be included as metadata columns for further subsetting. See \Rcode{?ScanBamParam} for details about specifying the \Rcode{param} argument. <>= param <- ScanBamParam( what='qual', which=GRanges("chr4", IRanges(1, 1e6)), flag=scanBamFlag(isUnmappedQuery=FALSE, isPaired=NA), tag="NH") @ We use \Rfunction{summarizeOverlaps} to count with the default mode of "Union". If a \Rcode{param} argument is not included all reads from the BAM file are counted. <>= fls <- c("treated1.bam", "untreated1.bam", "untreated2.bam") path <- "pathToBAMFiles" bamlst <- BamFileList(fls) genehits <- summarizeOverlaps(chr4genes, bamlst, mode="Union") @ \noindent A \Rcode{CountDataSet} is constructed from the counts and experiment data in \Rclass{pasilla}. <>= expdata <- MIAME( name="pasilla knockdown", lab="Genetics and Developmental Biology, University of Connecticut Health Center", contact="Dr. Brenton Graveley", title="modENCODE Drosophila pasilla RNA Binding Protein RNAi knockdown RNA-Seq Studies", pubMedIds="20921232", url="http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?acc=GSE18508", abstract="RNA-seq of 3 biological replicates of from the Drosophila melanogaster S2-DRSC cells that have been RNAi depleted of mRNAs encoding pasilla, a mRNA binding protein and 4 biological replicates of the the untreated cell line.") design <- data.frame( condition=c("treated", "untreated", "untreated"), replicate=c(1,1,2), type=rep("single-read", 3), countfiles=path(colData(genehits)[,1]), stringsAsFactors=TRUE) geneCDS <- DESeqDataSet(genehits, design=design, metadata=list(expdata=expdata)) @ If the primary interest is to count by transcript instead of by gene, the annotation file can be split on transcript id. <>= chr4tx <- split(gff, mcols(gff)$transcript_id) txhits <- summarizeOverlaps(chr4tx, bamlst) txCDS <- DESeqDataSet(txhits, design=design, metadata=list(expdata=expdata)) @ \section{References} \url{http://www-huber.embl.de/users/anders/HTSeq/doc/overview.html} \noindent\url{http://www-huber.embl.de/users/anders/HTSeq/doc/count.html} \end{document}