From df3e4e1abd41c47ac95a0197b41761255d6fa8c4 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 11:22:35 -0400 Subject: [PATCH 01/20] First working code to use SamRecordFactory to produce objects of our own design in SAMFileReader --- .../gatk/datasources/reads/SAMDataSource.java | 4 + .../sting/utils/sam/GATKSamRecordFactory.java | 74 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java index 74d39ecb0..96d8d7e1a 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java @@ -43,6 +43,7 @@ import org.broadinstitute.sting.utils.baq.BAQ; import org.broadinstitute.sting.utils.baq.BAQSamIterator; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.sam.GATKSamRecordFactory; import java.io.File; import java.lang.reflect.InvocationTargetException; @@ -57,6 +58,8 @@ import java.util.*; * Converts shards to SAM iterators over the specified region */ public class SAMDataSource { + final private static GATKSamRecordFactory factory = new GATKSamRecordFactory(); + /** Backing support for reads. */ protected final ReadProperties readProperties; @@ -756,6 +759,7 @@ public class SAMDataSource { public SAMReaders(Collection readerIDs, SAMFileReader.ValidationStringency validationStringency) { for(SAMReaderID readerID: readerIDs) { SAMFileReader reader = new SAMFileReader(readerID.samFile); + reader.setSAMRecordFactory(factory); reader.enableFileSource(true); reader.enableIndexMemoryMapping(false); if(!enableLowMemorySharding) diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java new file mode 100644 index 000000000..7c98a68e6 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2011, The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.broadinstitute.sting.utils.sam; + +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMRecordFactory; +import net.sf.samtools.BAMRecord; +import org.broadinstitute.sting.utils.exceptions.UserException; + +/** + * Factory interface which allows plugging in of different classes for generating instances of + * SAMRecord and BAMRecord when reading from SAM/BAM files. + * + * @author Tim Fennell + */ +public class GATKSamRecordFactory implements SAMRecordFactory { + + /** Create a new SAMRecord to be filled in */ + public SAMRecord createSAMRecord(SAMFileHeader header) { + throw new UserException.BadInput("The GATK now longer supports input SAM files"); + } + + /** Create a new BAM Record. */ + public BAMRecord createBAMRecord(final SAMFileHeader header, + final int referenceSequenceIndex, + final int alignmentStart, + final short readNameLength, + final short mappingQuality, + final int indexingBin, + final int cigarLen, + final int flags, + final int readLen, + final int mateReferenceSequenceIndex, + final int mateAlignmentStart, + final int insertSize, + final byte[] variableLengthBlock) { + return new BAMRecord(header, + referenceSequenceIndex, + alignmentStart, + readNameLength, + mappingQuality, + indexingBin, + cigarLen, + flags, + readLen, + mateReferenceSequenceIndex, + mateAlignmentStart, + insertSize, + variableLengthBlock); + } +} From 7928b287fcb76d80bcc1e6889f0474f782d2fe08 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 13:15:27 -0400 Subject: [PATCH 02/20] GATKSamRecord now produced by SAMFileReaders by default -- Removed all of the unnecessary caching operations in GATKSAMRecord -- GATKSAMRecord renamed to GATKSamRecord for consistency --- .../gatk/datasources/reads/SAMDataSource.java | 4 +- .../iterators/ReadFormattingIterator.java | 26 +- ...elGenotypeLikelihoodsCalculationModel.java | 6 +- .../recalibration/CountCovariatesWalker.java | 6 +- .../recalibration/RecalDataManager.java | 8 +- .../TableRecalibrationWalker.java | 4 +- .../sting/utils/sam/GATKSAMRecord.java | 368 +----------------- .../sting/utils/sam/GATKSamRecordFactory.java | 26 +- .../sting/utils/sam/ReadUtils.java | 18 +- 9 files changed, 81 insertions(+), 385 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java index 96d8d7e1a..8452aadfd 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java @@ -647,7 +647,9 @@ public class SAMDataSource { BAQ.QualityMode qmode, IndexedFastaSequenceFile refReader, byte defaultBaseQualities) { - wrappedIterator = new ReadFormattingIterator(wrappedIterator, useOriginalBaseQualities, defaultBaseQualities); + if ( useOriginalBaseQualities || defaultBaseQualities >= 0 ) + // only wrap if we are replacing the original qualitiies or using a default base quality + wrappedIterator = new ReadFormattingIterator(wrappedIterator, useOriginalBaseQualities, defaultBaseQualities); // NOTE: this (and other filtering) should be done before on-the-fly sorting // as there is no reason to sort something that we will end of throwing away diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/ReadFormattingIterator.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/ReadFormattingIterator.java index 2f30d12a8..9a89d2086 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/ReadFormattingIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/ReadFormattingIterator.java @@ -2,7 +2,6 @@ package org.broadinstitute.sting.gatk.iterators; import net.sf.samtools.SAMRecord; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.sam.GATKSAMRecord; /** * An iterator which does post-processing of a read, including potentially wrapping @@ -78,7 +77,30 @@ public class ReadFormattingIterator implements StingSAMIterator { * no next exists. */ public SAMRecord next() { - return new GATKSAMRecord(wrappedIterator.next(), useOriginalBaseQualities, defaultBaseQualities); + SAMRecord rec = wrappedIterator.next(); + + // if we are using default quals, check if we need them, and add if necessary. + // 1. we need if reads are lacking or have incomplete quality scores + // 2. we add if defaultBaseQualities has a positive value + if (defaultBaseQualities >= 0) { + byte reads [] = rec.getReadBases(); + byte quals [] = rec.getBaseQualities(); + if (quals == null || quals.length < reads.length) { + byte new_quals [] = new byte [reads.length]; + for (int i=0; i attributes = record.getAttributes(); - for ( SAMTagAndValue attribute : attributes ) - setAttribute(attribute.tag, attribute.value); - - // if we are using default quals, check if we need them, and add if necessary. - // 1. we need if reads are lacking or have incomplete quality scores - // 2. we add if defaultBaseQualities has a positive value - if (defaultBaseQualities >= 0) { - byte reads [] = record.getReadBases(); - byte quals [] = record.getBaseQualities(); - if (quals == null || quals.length < reads.length) { - byte new_quals [] = new byte [reads.length]; - for (int i=0; i getAttributes() { return mRecord.getAttributes(); } - - public SAMFileHeader getHeader() { return mRecord.getHeader(); } - - public void setHeader(SAMFileHeader samFileHeader) { mRecord.setHeader(samFileHeader); } - - public byte[] getVariableBinaryRepresentation() { return mRecord.getVariableBinaryRepresentation(); } - - public int getAttributesBinarySize() { return mRecord.getAttributesBinarySize(); } - - public String format() { return mRecord.format(); } - - public List getAlignmentBlocks() { return mRecord.getAlignmentBlocks(); } - - public List validateCigar(long l) { return mRecord.validateCigar(l); } - @Override public boolean equals(Object o) { if (this == o) return true; // note -- this forbids a GATKSAMRecord being equal to its underlying SAMRecord - if (!(o instanceof GATKSAMRecord)) return false; + if (!(o instanceof GATKSamRecord)) return false; // note that we do not consider the GATKSAMRecord internal state at all - return mRecord.equals(((GATKSAMRecord)o).mRecord); - } - - public int hashCode() { return mRecord.hashCode(); } - - public List isValid() { return mRecord.isValid(); } - - public Object clone() throws CloneNotSupportedException { return mRecord.clone(); } - - public String toString() { return mRecord.toString(); } - - public SAMFileSource getFileSource() { return mRecord.getFileSource(); } - - /** - * Sets a marker providing the source reader for this file and the position in the file from which the read originated. - * @param fileSource source of the given file. - */ - @Override - protected void setFileSource(final SAMFileSource fileSource) { - try { - Method method = SAMRecord.class.getDeclaredMethod("setFileSource",SAMFileSource.class); - method.setAccessible(true); - method.invoke(mRecord,fileSource); - } - catch(Exception ex) { - throw new ReviewedStingException("Unable to invoke setFileSource method",ex); - } + return super.equals(o); } } diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java index 7c98a68e6..9076f06ae 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java @@ -57,18 +57,18 @@ public class GATKSamRecordFactory implements SAMRecordFactory { final int mateAlignmentStart, final int insertSize, final byte[] variableLengthBlock) { - return new BAMRecord(header, - referenceSequenceIndex, - alignmentStart, - readNameLength, - mappingQuality, - indexingBin, - cigarLen, - flags, - readLen, - mateReferenceSequenceIndex, - mateAlignmentStart, - insertSize, - variableLengthBlock); + return new GATKSamRecord(header, + referenceSequenceIndex, + alignmentStart, + readNameLength, + mappingQuality, + indexingBin, + cigarLen, + flags, + readLen, + mateReferenceSequenceIndex, + mateAlignmentStart, + insertSize, + variableLengthBlock); } } diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java index d1e9a236f..f91d77244 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -274,10 +274,10 @@ public class ReadUtils { * @param adaptorLength length of adaptor sequence * @return a new read with adaptor sequence hard-clipped out or null if read is fully clipped */ - public static GATKSAMRecord hardClipAdaptorSequence(final SAMRecord rec, int adaptorLength) { + public static GATKSamRecord hardClipAdaptorSequence(final SAMRecord rec, int adaptorLength) { Pair adaptorBoundaries = getAdaptorBoundaries(rec, adaptorLength); - GATKSAMRecord result = (GATKSAMRecord)rec; + GATKSamRecord result = (GATKSamRecord)rec; if ( adaptorBoundaries != null ) { if ( rec.getReadNegativeStrandFlag() && adaptorBoundaries.second >= rec.getAlignmentStart() && adaptorBoundaries.first < rec.getAlignmentEnd() ) @@ -290,7 +290,7 @@ public class ReadUtils { } // return true if the read needs to be completely clipped - private static GATKSAMRecord hardClipStartOfRead(SAMRecord oldRec, int stopPosition) { + private static GATKSamRecord hardClipStartOfRead(SAMRecord oldRec, int stopPosition) { if ( stopPosition >= oldRec.getAlignmentEnd() ) { // BAM representation issue -- we can't clip away all bases in a read, just leave it alone and let the filter deal with it @@ -298,9 +298,9 @@ public class ReadUtils { return null; } - GATKSAMRecord rec; + GATKSamRecord rec; try { - rec = (GATKSAMRecord)oldRec.clone(); + rec = (GATKSamRecord)oldRec.clone(); } catch (Exception e) { return null; } @@ -370,7 +370,7 @@ public class ReadUtils { return rec; } - private static GATKSAMRecord hardClipEndOfRead(SAMRecord oldRec, int startPosition) { + private static GATKSamRecord hardClipEndOfRead(SAMRecord oldRec, int startPosition) { if ( startPosition <= oldRec.getAlignmentStart() ) { // BAM representation issue -- we can't clip away all bases in a read, just leave it alone and let the filter deal with it @@ -378,9 +378,9 @@ public class ReadUtils { return null; } - GATKSAMRecord rec; + GATKSamRecord rec; try { - rec = (GATKSAMRecord)oldRec.clone(); + rec = (GATKSamRecord)oldRec.clone(); } catch (Exception e) { return null; } @@ -598,7 +598,7 @@ public class ReadUtils { * @param rec original SAM record * @return a new read with adaptor sequence hard-clipped out or null if read is fully clipped */ - public static GATKSAMRecord hardClipAdaptorSequence(final SAMRecord rec) { + public static GATKSamRecord hardClipAdaptorSequence(final SAMRecord rec) { return hardClipAdaptorSequence(rec, DEFAULT_ADAPTOR_SIZE); } From 1b38aa1a7e67deeb4f426b16cf7eaa8d6016e938 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 15:46:44 -0400 Subject: [PATCH 03/20] Cleaning up reduced read code accessors --- .../sting/utils/sam/ReadUtils.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java index f91d77244..9fa8fc544 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -55,6 +55,7 @@ public class ReadUtils { public static final String REDUCED_READ_CONSENSUS_COUNTS_TAG = "CC"; public final static byte[] getReducedReadQualityTagValue(final SAMRecord read) { + // TODO -- warning of performance problem. Should be cached in GATKSamRecord return read.getByteArrayAttribute(ReadUtils.REDUCED_READ_QUALITY_TAG); } @@ -70,21 +71,6 @@ public class ReadUtils { return getReducedReadQualityTagValue(read)[i]; } - public final static SAMRecord reducedReadWithReducedQuals(final SAMRecord read) { - if ( ! isReducedRead(read) ) throw new IllegalArgumentException("read must be a reduced read"); - return read; -// try { -// SAMRecord newRead = (SAMRecord)read.clone(); -// byte reducedQual = (byte)(int)getReducedReadQualityTagValue(read); -// byte[] newQuals = new byte[read.getBaseQualities().length]; -// Arrays.fill(newQuals, reducedQual); -// newRead.setBaseQualities(newQuals); -// return newRead; -// } catch ( CloneNotSupportedException e ) { -// throw new ReviewedStingException("SAMRecord no longer supports clone", e); -// } - } - // ---------------------------------------------------------------------------------------------------- // // General utilities From 52345f0aec828aca04af8e84259d68ad21ca69c9 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 15:47:36 -0400 Subject: [PATCH 04/20] Meaningful documentation string --- .../sting/utils/sam/GATKSamRecordFactory.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java index 9076f06ae..adde2e293 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java @@ -31,10 +31,10 @@ import net.sf.samtools.BAMRecord; import org.broadinstitute.sting.utils.exceptions.UserException; /** - * Factory interface which allows plugging in of different classes for generating instances of - * SAMRecord and BAMRecord when reading from SAM/BAM files. + * Factory interface implementation used to create GATKSamRecords + * from SAMFileReaders with SAM-JDK * - * @author Tim Fennell + * @author Mark DePristo */ public class GATKSamRecordFactory implements SAMRecordFactory { From bba69701b505dec882ff8eee978be0451ec5b335 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 17:49:17 -0400 Subject: [PATCH 05/20] Now creates GATKSamRecords now SamRecords --- .../org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java index 2dcdd5ce6..b6b671360 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java @@ -146,7 +146,7 @@ public class ArtificialSAMUtils { if( (refIndex == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart != SAMRecord.NO_ALIGNMENT_START) || (refIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart == SAMRecord.NO_ALIGNMENT_START) ) throw new ReviewedStingException("Invalid alignment start for artificial read, start = " + alignmentStart); - SAMRecord record = new SAMRecord(header); + SAMRecord record = new GATKSamRecord(header); record.setReadName(name); record.setReferenceIndex(refIndex); record.setAlignmentStart(alignmentStart); From 3227143a1c930db8a243f1be264840a7e76ea7fc Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 17:50:27 -0400 Subject: [PATCH 06/20] Systematic test code for FragmentPileup -- Creates all combinatinos of overlapping and non-overlapping read pair pileups in all orientations and first/second pairings to validate fragment detection. --- .../utils/pileup/FragmentPileupUnitTest.java | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java new file mode 100644 index 000000000..778259528 --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2011, The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.broadinstitute.sting.utils.pileup; + +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMReadGroupRecord; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.BaseTest; +import org.broadinstitute.sting.utils.collections.Pair; +import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; +import org.testng.Assert; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.*; + +/** + * Test routines for read-backed pileup. + */ +public class FragmentPileupUnitTest extends BaseTest { + private static SAMFileHeader header; + + private class FragmentPileupTest extends TestDataProvider { + List states = new ArrayList(); + + private FragmentPileupTest(String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { + super(FragmentPileupTest.class, String.format("%s-leftIsFirst:%b-leftIsNegative:%b", name, leftIsFirst, leftIsNegative)); + + for ( int pos = leftStart; pos < rightStart + readLen; pos++) { + SAMRecord left = ArtificialSAMUtils.createArtificialRead(header, "readpair", 0, leftStart, readLen); + SAMRecord right = ArtificialSAMUtils.createArtificialRead(header, "readpair", 0, rightStart, readLen); + + left.setProperPairFlag(true); + right.setProperPairFlag(true); + + left.setFirstOfPairFlag(leftIsFirst); + right.setFirstOfPairFlag(! leftIsFirst); + + left.setReadNegativeStrandFlag(leftIsNegative); + left.setMateNegativeStrandFlag(!leftIsNegative); + right.setReadNegativeStrandFlag(!leftIsNegative); + right.setMateNegativeStrandFlag(leftIsNegative); + + left.setMateAlignmentStart(right.getAlignmentStart()); + right.setMateAlignmentStart(left.getAlignmentStart()); + + left.setMateReferenceIndex(0); + right.setMateReferenceIndex(0); + + int isize = rightStart + readLen - leftStart; + left.setInferredInsertSize(isize); + right.setInferredInsertSize(-isize); + + boolean posCoveredByLeft = pos >= left.getAlignmentStart() && pos <= left.getAlignmentEnd(); + boolean posCoveredByRight = pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd(); + + if ( posCoveredByLeft || posCoveredByRight ) { + List reads = new ArrayList(); + List offsets = new ArrayList(); + + if ( posCoveredByLeft ) { + reads.add(left); + offsets.add(pos - left.getAlignmentStart()); + } + + if ( posCoveredByRight ) { + reads.add(right); + offsets.add(pos - right.getAlignmentStart()); + } + + boolean shouldBeFragment = posCoveredByLeft && posCoveredByRight; + ReadBackedPileup pileup = new ReadBackedPileupImpl(null, reads, offsets); + TestState testState = new TestState(shouldBeFragment, pileup); + states.add(testState); + } + } + } + } + + private class TestState { + boolean shouldBeFragment; + ReadBackedPileup pileup; + + private TestState(final boolean shouldBeFragment, final ReadBackedPileup pileup) { + this.shouldBeFragment = shouldBeFragment; + this.pileup = pileup; + } + } + + @DataProvider(name = "fragmentPileupTest") + public Object[][] createTests() { + for ( boolean leftIsFirst : Arrays.asList(true, false) ) { + for ( boolean leftIsNegative : Arrays.asList(true, false) ) { + // Overlapping pair + // ----> [first] + // <--- [second] + new FragmentPileupTest("overlapping-pair", 10, 1, 5, leftIsFirst, leftIsNegative); + + // Non-overlapping pair + // ----> + // <---- + new FragmentPileupTest("nonoverlapping-pair", 10, 1, 15, leftIsFirst, leftIsNegative); + } + } + + return FragmentPileupTest.getTests(FragmentPileupTest.class); + } + + @Test(enabled = true, dataProvider = "fragmentPileupTest") + public void testMe(FragmentPileupTest test) { + for ( TestState testState : test.states ) { + ReadBackedPileup rbp = testState.pileup; + FragmentPileup fp = new FragmentPileup(rbp); + Assert.assertEquals(fp.getTwoReadPileup().size(), testState.shouldBeFragment ? 1 : 0); + Assert.assertEquals(fp.getOneReadPileup().size(), testState.shouldBeFragment ? 0 : 1); + } + } + + + @BeforeTest + public void setup() { + header = ArtificialSAMUtils.createArtificialSamHeader(1,1,1000); + } +} From 999a8998ae4d007847f9c2fdd99b4ef3217cc9fe Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 17:51:48 -0400 Subject: [PATCH 07/20] Constructor for GATKSamRecord with header only, for unit testing --- .../sting/utils/sam/GATKSAMRecord.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java index 56e6e74be..7956ac388 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java @@ -36,6 +36,16 @@ public class GATKSamRecord extends BAMRecord { // These attributes exist in memory only, and are never written to disk. private Map temporaryAttributes; + /** + * HACK TO CREATE GATKSAMRECORD WITH ONLY A HEADER FOR TESTING PURPOSES ONLY + * @param header + */ + public GATKSamRecord(final SAMFileHeader header) { + super(header, SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, SAMRecord.NO_ALIGNMENT_START, + (short)0, (short)255, 0, 1, 0, 1, 0, 0, 0, null); + } + + public GATKSamRecord(final SAMFileHeader header, final int referenceSequenceIndex, final int alignmentStart, @@ -57,17 +67,20 @@ public class GATKSamRecord extends BAMRecord { // *** The following methods are overloaded to cache the appropriate data ***// /////////////////////////////////////////////////////////////////////////////// + @Override public String getReadString() { if ( mReadString == null ) mReadString = super.getReadString(); return mReadString; } + @Override public void setReadString(String s) { super.setReadString(s); mReadString = s; } + @Override public SAMReadGroupRecord getReadGroup() { if ( !retrievedReadGroup ) { SAMReadGroupRecord tempReadGroup = super.getReadGroup(); From 94e1898d8f48185593d5717395888ce08abe13f7 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 21 Oct 2011 09:37:45 -0400 Subject: [PATCH 08/20] A canonical set of NGS platforms as enums with convenient manipulation methods --- .../sting/utils/NGSPlatform.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 public/java/src/org/broadinstitute/sting/utils/NGSPlatform.java diff --git a/public/java/src/org/broadinstitute/sting/utils/NGSPlatform.java b/public/java/src/org/broadinstitute/sting/utils/NGSPlatform.java new file mode 100644 index 000000000..3ab9e1655 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/utils/NGSPlatform.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2011, The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.broadinstitute.sting.utils; + +import net.sf.samtools.SAMReadGroupRecord; +import net.sf.samtools.SAMRecord; + +/** + * A canonical, master list of the standard NGS platforms. These values + * can be obtained (efficiently) from a GATKSamRecord object with the + * getNGSPlatform method. + * + * @author Mark DePristo + * @since 2011 + */ +public enum NGSPlatform { + ILLUMINA("ILLUMINA", "SLX", "SOLEXA"), + SOLID("SOLID"), + LS454("454"), + COMPLETE_GENOMICS("COMPLETE"), + PACBIO("PACBIO"), + ION_TORRENT("IONTORRENT"), + UNKNOWN("UNKNOWN"); + + /** + * Array of the prefix names in a BAM file for each of the platforms. + */ + private final String[] BAM_PL_NAMES; + + NGSPlatform(final String... BAM_PL_NAMES) { + for ( int i = 0; i < BAM_PL_NAMES.length; i++ ) + BAM_PL_NAMES[i] = BAM_PL_NAMES[i].toUpperCase(); + this.BAM_PL_NAMES = BAM_PL_NAMES; + } + + /** + * Returns a representative PL string for this platform + * @return + */ + public final String getDefaultPlatform() { + return BAM_PL_NAMES[0]; + } + + /** + * Convenience constructor -- calculates the NGSPlatfrom from a SAMRecord. + * Note you should not use this function if you have a GATKSamRecord -- use the + * accessor method instead. + * + * @param read + * @return an NGSPlatform object matching the PL field of the header, of UNKNOWN if there was no match + */ + public static final NGSPlatform fromRead(SAMRecord read) { + return fromReadGroup(read.getReadGroup()); + } + + /** + * Returns the NGSPlatform corresponding to the PL tag in the read group + * @param rg + * @return an NGSPlatform object matching the PL field of the header, of UNKNOWN if there was no match + */ + public static final NGSPlatform fromReadGroup(SAMReadGroupRecord rg) { + return fromReadGroupPL(rg.getPlatform()); + } + + /** + * Returns the NGSPlatform corresponding to the PL tag in the read group + * @param plFromRG -- the PL field (or equivalent) in a ReadGroup object + * @return an NGSPlatform object matching the PL field of the header, of UNKNOWN if there was no match + */ + public static final NGSPlatform fromReadGroupPL(final String plFromRG) { + if ( plFromRG == null ) return UNKNOWN; + + // todo -- algorithm could be implemented more efficiently, as the list of all + // todo -- names is known upfront, so a decision tree could be used to identify + // todo -- a prefix common to PL + final String pl = plFromRG.toUpperCase(); + for ( final NGSPlatform ngsPlatform : NGSPlatform.values() ) { + for ( final String bamPLName : ngsPlatform.BAM_PL_NAMES ) { + if ( pl.contains(bamPLName) ) + return ngsPlatform; + } + } + + return UNKNOWN; + } +} From ed74ebcfa11ad90c85694dd6666c5d96af807393 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 21 Oct 2011 09:38:41 -0400 Subject: [PATCH 09/20] GATKSamRecords with efficiency NGSPlatform method --- .../utils/sam/GATKSAMReadGroupRecord.java | 23 +++++++++++++++++++ .../sting/utils/sam/GATKSAMRecord.java | 16 +++++++++---- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMReadGroupRecord.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMReadGroupRecord.java index c7ffcab0c..ff7d12f09 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMReadGroupRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMReadGroupRecord.java @@ -1,6 +1,7 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.SAMReadGroupRecord; +import org.broadinstitute.sting.utils.NGSPlatform; /** * @author ebanks @@ -15,16 +16,28 @@ public class GATKSAMReadGroupRecord extends SAMReadGroupRecord { // the SAMReadGroupRecord data we're caching private String mSample = null; private String mPlatform = null; + private NGSPlatform mNGSPlatform = null; // because some values can be null, we don't want to duplicate effort private boolean retrievedSample = false; private boolean retrievedPlatform = false; + private boolean retrievedNGSPlatform = false; + public GATKSAMReadGroupRecord(final String id) { + super(id); + } public GATKSAMReadGroupRecord(SAMReadGroupRecord record) { super(record.getReadGroupId(), record); } + public GATKSAMReadGroupRecord(SAMReadGroupRecord record, NGSPlatform pl) { + super(record.getReadGroupId(), record); + setPlatform(pl.getDefaultPlatform()); + mNGSPlatform = pl; + retrievedPlatform = retrievedNGSPlatform = true; + } + /////////////////////////////////////////////////////////////////////////////// // *** The following methods are overloaded to cache the appropriate data ***// /////////////////////////////////////////////////////////////////////////////// @@ -55,5 +68,15 @@ public class GATKSAMReadGroupRecord extends SAMReadGroupRecord { super.setPlatform(s); mPlatform = s; retrievedPlatform = true; + retrievedNGSPlatform = false; // recalculate the NGSPlatform + } + + public NGSPlatform getNGSPlatform() { + if ( ! retrievedNGSPlatform ) { + mNGSPlatform = NGSPlatform.fromReadGroupPL(getPlatform()); + retrievedNGSPlatform = true; + } + + return mNGSPlatform; } } \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java index 7956ac388..037545a78 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java @@ -1,6 +1,7 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.*; +import org.broadinstitute.sting.utils.NGSPlatform; import java.util.HashMap; import java.util.Map; @@ -25,7 +26,7 @@ import java.util.Map; public class GATKSamRecord extends BAMRecord { // the SAMRecord data we're caching private String mReadString = null; - private SAMReadGroupRecord mReadGroup = null; + private GATKSAMReadGroupRecord mReadGroup = null; // because some values can be null, we don't want to duplicate effort private boolean retrievedReadGroup = false; @@ -81,17 +82,22 @@ public class GATKSamRecord extends BAMRecord { } @Override - public SAMReadGroupRecord getReadGroup() { + public GATKSAMReadGroupRecord getReadGroup() { if ( !retrievedReadGroup ) { SAMReadGroupRecord tempReadGroup = super.getReadGroup(); - mReadGroup = (tempReadGroup == null ? tempReadGroup : new GATKSAMReadGroupRecord(tempReadGroup)); + mReadGroup = (tempReadGroup == null ? null : new GATKSAMReadGroupRecord(tempReadGroup)); retrievedReadGroup = true; } return mReadGroup; } - public void setReadGroup(SAMReadGroupRecord record) { - mReadGroup = record; + public NGSPlatform getNGSPlatform() { + return getReadGroup().getNGSPlatform(); + } + + public void setReadGroup( final GATKSAMReadGroupRecord readGroup ) { + mReadGroup = readGroup; + retrievedReadGroup = true; } /** From be797a8a1f4eb72fe5843864decc45d2e7d852e8 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 21 Oct 2011 09:39:21 -0400 Subject: [PATCH 10/20] Recalibrator now uses the much more efficient NGSPlatform in the cycle covariates system --- ivy.xml | 2 +- .../walkers/recalibration/CycleCovariate.java | 130 ++---------------- .../recalibration/RecalDataManager.java | 8 +- 3 files changed, 14 insertions(+), 126 deletions(-) diff --git a/ivy.xml b/ivy.xml index 96c1de844..0737b676d 100644 --- a/ivy.xml +++ b/ivy.xml @@ -10,7 +10,7 @@ - + diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CycleCovariate.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CycleCovariate.java index e117454f9..857f74155 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CycleCovariate.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CycleCovariate.java @@ -2,9 +2,12 @@ package org.broadinstitute.sting.gatk.walkers.recalibration; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.NGSPlatform; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.sam.GATKSamRecord; import java.util.Arrays; +import java.util.EnumSet; import java.util.List; /* @@ -46,6 +49,9 @@ import java.util.List; */ public class CycleCovariate implements StandardCovariate { + private final static EnumSet DISCRETE_CYCLE_PLATFORMS = EnumSet.of(NGSPlatform.ILLUMINA, NGSPlatform.SOLID, NGSPlatform.PACBIO, NGSPlatform.COMPLETE_GENOMICS); + private final static EnumSet FLOW_CYCLE_PLATFORMS = EnumSet.of(NGSPlatform.LS454, NGSPlatform.ION_TORRENT); + // Initialize any member variables using the command-line arguments passed to the walkers public void initialize( final RecalibrationArgumentCollection RAC ) { if( RAC.DEFAULT_PLATFORM != null ) { @@ -58,122 +64,6 @@ public class CycleCovariate implements StandardCovariate { } } - /* - // Used to pick out the covariate's value from attributes of the read - public final Comparable getValue( final SAMRecord read, final int offset ) { - - int cycle = 1; - - //----------------------------- - // ILLUMINA and SOLID - //----------------------------- - - if( read.getReadGroup().getPlatform().equalsIgnoreCase( "ILLUMINA" ) || read.getReadGroup().getPlatform().equalsIgnoreCase( "SLX" ) || // Some bams have "illumina" and others have "SLX" - read.getReadGroup().getPlatform().equalsIgnoreCase( "SOLID" ) || read.getReadGroup().getPlatform().equalsIgnoreCase( "ABI_SOLID" )) { // Some bams have "solid" and others have "ABI_SOLID" - cycle = offset + 1; - if( read.getReadNegativeStrandFlag() ) { - cycle = read.getReadLength() - offset; - } - } - - //----------------------------- - // 454 - //----------------------------- - - else if( read.getReadGroup().getPlatform().contains( "454" ) ) { // Some bams have "LS454" and others have just "454" - final byte[] bases = read.getReadBases(); - - // BUGBUG: Consider looking at degradation of base quality scores in homopolymer runs to detect when the cycle incremented even though the nucleotide didn't change - // For example, AAAAAAA was probably read in two flow cycles but here we count it as one - if( !read.getReadNegativeStrandFlag() ) { // Forward direction - int iii = 0; - while( iii <= offset ) - { - while( iii <= offset && bases[iii] == (byte)'T' ) { iii++; } - while( iii <= offset && bases[iii] == (byte)'A' ) { iii++; } - while( iii <= offset && bases[iii] == (byte)'C' ) { iii++; } - while( iii <= offset && bases[iii] == (byte)'G' ) { iii++; } - if( iii <= offset ) { cycle++; } - if( iii <= offset && !BaseUtils.isRegularBase(bases[iii]) ) { iii++; } - - } - } else { // Negative direction - int iii = bases.length-1; - while( iii >= offset ) - { - while( iii >= offset && bases[iii] == (byte)'T' ) { iii--; } - while( iii >= offset && bases[iii] == (byte)'A' ) { iii--; } - while( iii >= offset && bases[iii] == (byte)'C' ) { iii--; } - while( iii >= offset && bases[iii] == (byte)'G' ) { iii--; } - if( iii >= offset ) { cycle++; } - if( iii >= offset && !BaseUtils.isRegularBase(bases[iii]) ) { iii--; } - } - } - } - - //----------------------------- - // SOLID (unused), only to be used in conjunction with PrimerRoundCovariate - //----------------------------- - - //else if( read.getReadGroup().getPlatform().equalsIgnoreCase( "SOLID" ) ) { - // // The ligation cycle according to http://www3.appliedbiosystems.com/cms/groups/mcb_marketing/documents/generaldocuments/cms_057511.pdf - // int pos = offset + 1; - // if( read.getReadNegativeStrandFlag() ) { - // pos = read.getReadLength() - offset; - // } - // cycle = pos / 5; // integer division - //} - - //----------------------------- - // UNRECOGNIZED PLATFORM - //----------------------------- - - else { // Platform is unrecognized so revert to the default platform but warn the user first - if( defaultPlatform != null) { // The user set a default platform - if( !warnedUserBadPlatform ) { - Utils.warnUser( "Platform string (" + read.getReadGroup().getPlatform() + ") unrecognized in CycleCovariate. " + - "Defaulting to platform = " + defaultPlatform + "." ); - } - warnedUserBadPlatform = true; - - read.getReadGroup().setPlatform( defaultPlatform ); - return getValue( read, offset ); // A recursive call - } else { // The user did not set a default platform - throw new StingException( "Platform string (" + read.getReadGroup().getPlatform() + ") unrecognized in CycleCovariate. " + - "No default platform specified. Users must set the default platform using the --default_platform argument." ); - } - } - - // Differentiate between first and second of pair. - // The sequencing machine cycle keeps incrementing for the second read in a pair. So it is possible for a read group - // to have an error affecting quality at a particular cycle on the first of pair which carries over to the second of pair. - // Therefore the cycle covariate must differentiate between first and second of pair reads. - // This effect can not be corrected by pulling out the first of pair and second of pair flags into a separate covariate because - // the current sequential model would consider the effects independently instead of jointly. - if( read.getReadPairedFlag() && read.getSecondOfPairFlag() ) { - cycle *= -1; - } - - return cycle; - } - */ - - // todo -- this should be put into a common place in the code base - private static List ILLUMINA_NAMES = Arrays.asList("ILLUMINA", "SLX", "SOLEXA"); - private static List SOLID_NAMES = Arrays.asList("SOLID"); - private static List LS454_NAMES = Arrays.asList("454"); - private static List COMPLETE_GENOMICS_NAMES = Arrays.asList("COMPLETE"); - private static List PACBIO_NAMES = Arrays.asList("PACBIO"); - private static List ION_TORRENT_NAMES = Arrays.asList("IONTORRENT"); - - private static boolean isPlatform(SAMRecord read, List names) { - String pl = read.getReadGroup().getPlatform().toUpperCase(); - for ( String name : names ) - if ( pl.contains( name ) ) - return true; - return false; - } - // Used to pick out the covariate's value from attributes of the read public void getValues(SAMRecord read, Comparable[] comparable) { @@ -181,7 +71,8 @@ public class CycleCovariate implements StandardCovariate { // Illumina, Solid, PacBio, and Complete Genomics //----------------------------- - if( isPlatform(read, ILLUMINA_NAMES) || isPlatform(read, SOLID_NAMES) || isPlatform(read, PACBIO_NAMES) || isPlatform(read, COMPLETE_GENOMICS_NAMES) ) { + final NGSPlatform ngsPlatform = ((GATKSamRecord)read).getNGSPlatform(); + if( DISCRETE_CYCLE_PLATFORMS.contains(ngsPlatform) ) { final int init; final int increment; if( !read.getReadNegativeStrandFlag() ) { @@ -227,8 +118,7 @@ public class CycleCovariate implements StandardCovariate { //----------------------------- // 454 and Ion Torrent //----------------------------- - - else if ( isPlatform(read, LS454_NAMES) || isPlatform(read, ION_TORRENT_NAMES)) { // Some bams have "LS454" and others have just "454" + else if( FLOW_CYCLE_PLATFORMS.contains(ngsPlatform) ) { final int readLength = read.getReadLength(); final byte[] bases = read.getReadBases(); @@ -273,8 +163,6 @@ public class CycleCovariate implements StandardCovariate { else { throw new IllegalStateException("This method hasn't been implemented yet for " + read.getReadGroup().getPlatform()); } - - } // Used to get the covariate's value from input csv file in TableRecalibrationWalker diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDataManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDataManager.java index bd949aa81..a8a829801 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDataManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDataManager.java @@ -35,6 +35,7 @@ import org.broadinstitute.sting.utils.collections.NestedHashMap; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.sam.AlignmentUtils; +import org.broadinstitute.sting.utils.sam.GATKSAMReadGroupRecord; import org.broadinstitute.sting.utils.sam.GATKSamRecord; import java.util.ArrayList; @@ -228,8 +229,7 @@ public class RecalDataManager { * @param RAC The list of shared command line arguments */ public static void parseSAMRecord( final SAMRecord read, final RecalibrationArgumentCollection RAC ) { - - SAMReadGroupRecord readGroup = read.getReadGroup(); + GATKSAMReadGroupRecord readGroup = ((GATKSamRecord)read).getReadGroup(); // If there are no read groups we have to default to something, and that something could be specified by the user using command line arguments if( readGroup == null ) { @@ -241,7 +241,7 @@ public class RecalDataManager { warnUserNullReadGroup = true; } // There is no readGroup so defaulting to these values - readGroup = new SAMReadGroupRecord( RAC.DEFAULT_READ_GROUP ); + readGroup = new GATKSAMReadGroupRecord( RAC.DEFAULT_READ_GROUP ); readGroup.setPlatform( RAC.DEFAULT_PLATFORM ); ((GATKSamRecord)read).setReadGroup( readGroup ); } else { @@ -251,7 +251,7 @@ public class RecalDataManager { if( RAC.FORCE_READ_GROUP != null && !readGroup.getReadGroupId().equals(RAC.FORCE_READ_GROUP) ) { // Collapse all the read groups into a single common String provided by the user final String oldPlatform = readGroup.getPlatform(); - readGroup = new SAMReadGroupRecord( RAC.FORCE_READ_GROUP ); + readGroup = new GATKSAMReadGroupRecord( RAC.FORCE_READ_GROUP ); readGroup.setPlatform( oldPlatform ); ((GATKSamRecord)read).setReadGroup( readGroup ); } From 2403e9606201070f6c38039d6b5d2fcff1ea5e7c Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 21 Oct 2011 09:59:24 -0400 Subject: [PATCH 11/20] Renamed GATKSamRecord -> GATKSAMRecord for consistency. Better docs. --- ...elGenotypeLikelihoodsCalculationModel.java | 4 +- .../recalibration/CountCovariatesWalker.java | 6 +-- .../walkers/recalibration/CycleCovariate.java | 4 +- .../recalibration/RecalDataManager.java | 10 ++-- .../TableRecalibrationWalker.java | 4 +- .../sting/utils/NGSPlatform.java | 4 +- .../sting/utils/sam/ArtificialSAMUtils.java | 2 +- .../sting/utils/sam/GATKSAMRecord.java | 53 ++++++++++++++----- .../sting/utils/sam/GATKSamRecordFactory.java | 2 +- .../sting/utils/sam/ReadUtils.java | 20 +++---- 10 files changed, 67 insertions(+), 42 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java index 1eafcfb10..aea63b61d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java @@ -39,7 +39,7 @@ import org.broadinstitute.sting.utils.pileup.ExtendedEventPileupElement; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; -import org.broadinstitute.sting.utils.sam.GATKSamRecord; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.broadinstitute.sting.utils.sam.ReadUtils; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.VariantContext; @@ -125,7 +125,7 @@ public class IndelGenotypeLikelihoodsCalculationModel extends GenotypeLikelihood for ( ExtendedEventPileupElement p : indelPileup.toExtendedIterable() ) { //SAMRecord read = p.getRead(); - GATKSamRecord read = ReadUtils.hardClipAdaptorSequence(p.getRead()); + GATKSAMRecord read = ReadUtils.hardClipAdaptorSequence(p.getRead()); if (read == null) continue; if(ReadUtils.is454Read(read)) { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java index 424d4cdd6..1bdb70bdd 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java @@ -41,7 +41,7 @@ import org.broadinstitute.sting.utils.collections.NestedHashMap; import org.broadinstitute.sting.utils.exceptions.DynamicClassResolutionException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.pileup.PileupElement; -import org.broadinstitute.sting.utils.sam.GATKSamRecord; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import java.io.PrintStream; import java.util.ArrayList; @@ -352,7 +352,7 @@ public class CountCovariatesWalker extends LocusWalker adaptorBoundaries = getAdaptorBoundaries(rec, adaptorLength); - GATKSamRecord result = (GATKSamRecord)rec; + GATKSAMRecord result = (GATKSAMRecord)rec; if ( adaptorBoundaries != null ) { if ( rec.getReadNegativeStrandFlag() && adaptorBoundaries.second >= rec.getAlignmentStart() && adaptorBoundaries.first < rec.getAlignmentEnd() ) @@ -276,7 +276,7 @@ public class ReadUtils { } // return true if the read needs to be completely clipped - private static GATKSamRecord hardClipStartOfRead(SAMRecord oldRec, int stopPosition) { + private static GATKSAMRecord hardClipStartOfRead(SAMRecord oldRec, int stopPosition) { if ( stopPosition >= oldRec.getAlignmentEnd() ) { // BAM representation issue -- we can't clip away all bases in a read, just leave it alone and let the filter deal with it @@ -284,9 +284,9 @@ public class ReadUtils { return null; } - GATKSamRecord rec; + GATKSAMRecord rec; try { - rec = (GATKSamRecord)oldRec.clone(); + rec = (GATKSAMRecord)oldRec.clone(); } catch (Exception e) { return null; } @@ -356,7 +356,7 @@ public class ReadUtils { return rec; } - private static GATKSamRecord hardClipEndOfRead(SAMRecord oldRec, int startPosition) { + private static GATKSAMRecord hardClipEndOfRead(SAMRecord oldRec, int startPosition) { if ( startPosition <= oldRec.getAlignmentStart() ) { // BAM representation issue -- we can't clip away all bases in a read, just leave it alone and let the filter deal with it @@ -364,9 +364,9 @@ public class ReadUtils { return null; } - GATKSamRecord rec; + GATKSAMRecord rec; try { - rec = (GATKSamRecord)oldRec.clone(); + rec = (GATKSAMRecord)oldRec.clone(); } catch (Exception e) { return null; } @@ -584,7 +584,7 @@ public class ReadUtils { * @param rec original SAM record * @return a new read with adaptor sequence hard-clipped out or null if read is fully clipped */ - public static GATKSamRecord hardClipAdaptorSequence(final SAMRecord rec) { + public static GATKSAMRecord hardClipAdaptorSequence(final SAMRecord rec) { return hardClipAdaptorSequence(rec, DEFAULT_ADAPTOR_SIZE); } From b863390cb1a4c89d8a77cdc6a20c76aa5f810ac8 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 21 Oct 2011 13:28:05 -0400 Subject: [PATCH 13/20] Moving reduced read functionality into GATKSAMRecord -- More functions take / produce GATKSAMRecords instead of SAMRecord --- .../indels/PairHMMIndelErrorModel.java | 2 +- .../sting/utils/pileup/PileupElement.java | 7 +-- .../sting/utils/sam/ArtificialSAMUtils.java | 11 +++-- .../sting/utils/sam/GATKSAMRecord.java | 48 ++++++++++++++++++- .../sting/utils/sam/ReadUtils.java | 18 ------- .../sting/utils/ReadUtilsUnitTest.java | 12 ++--- .../utils/ReservoirDownsamplerUnitTest.java | 5 +- 7 files changed, 67 insertions(+), 36 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java index 9edf5b5d4..3a824cdfe 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java @@ -393,7 +393,7 @@ public class PairHMMIndelErrorModel { for (PileupElement p: pileup) { // > 1 when the read is a consensus read representing multiple independent observations - final boolean isReduced = ReadUtils.isReducedRead(p.getRead()); + final boolean isReduced = p.isReducedRead(); readCounts[readIdx] = isReduced ? p.getReducedCount() : 1; // check if we've already computed likelihoods for this pileup element (i.e. for this read at this location) diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java index f6ed792a5..e47b6ada7 100755 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java @@ -4,6 +4,7 @@ import com.google.java.contract.Ensures; import com.google.java.contract.Requires; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.broadinstitute.sting.utils.sam.ReadUtils; /** @@ -82,16 +83,16 @@ public class PileupElement { // -------------------------------------------------------------------------- public boolean isReducedRead() { - return ReadUtils.isReducedRead(getRead()); + return ((GATKSAMRecord)read).isReducedRead(); } public int getReducedCount() { if ( ! isReducedRead() ) throw new IllegalArgumentException("Cannot get reduced count for non-reduced read " + getRead().getReadName()); - return ReadUtils.getReducedCount(getRead(), offset); + return ((GATKSAMRecord)read).getReducedCount(offset); } public byte getReducedQual() { if ( ! isReducedRead() ) throw new IllegalArgumentException("Cannot get reduced qual for non-reduced read " + getRead().getReadName()); - return ReadUtils.getReducedQual(getRead(), offset); + return getQual(); } } \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java index 85011f2e0..4eba32383 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java @@ -134,6 +134,7 @@ public class ArtificialSAMUtils { /** * Create an artificial read based on the parameters. The cigar string will be *M, where * is the length of the read * + * * @param header the SAM header to associate the read with * @param name the name of the read * @param refIndex the reference index, i.e. what chromosome to associate it with @@ -142,11 +143,11 @@ public class ArtificialSAMUtils { * * @return the artificial read */ - public static SAMRecord createArtificialRead( SAMFileHeader header, String name, int refIndex, int alignmentStart, int length ) { + public static GATKSAMRecord createArtificialRead(SAMFileHeader header, String name, int refIndex, int alignmentStart, int length) { if( (refIndex == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart != SAMRecord.NO_ALIGNMENT_START) || (refIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart == SAMRecord.NO_ALIGNMENT_START) ) throw new ReviewedStingException("Invalid alignment start for artificial read, start = " + alignmentStart); - SAMRecord record = new GATKSAMRecord(header); + GATKSAMRecord record = new GATKSAMRecord(header); record.setReadName(name); record.setReferenceIndex(refIndex); record.setAlignmentStart(alignmentStart); @@ -166,6 +167,7 @@ public class ArtificialSAMUtils { if (refIndex == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) { record.setReadUnmappedFlag(true); } + return record; } @@ -181,16 +183,17 @@ public class ArtificialSAMUtils { * * @return the artificial read */ - public static SAMRecord createArtificialRead( SAMFileHeader header, String name, int refIndex, int alignmentStart, byte[] bases, byte[] qual ) { + public static GATKSAMRecord createArtificialRead( SAMFileHeader header, String name, int refIndex, int alignmentStart, byte[] bases, byte[] qual ) { if (bases.length != qual.length) { throw new ReviewedStingException("Passed in read string is different length then the quality array"); } - SAMRecord rec = createArtificialRead(header, name, refIndex, alignmentStart, bases.length); + GATKSAMRecord rec = createArtificialRead(header, name, refIndex, alignmentStart, bases.length); rec.setReadBases(bases); rec.setBaseQualities(qual); if (refIndex == -1) { rec.setReadUnmappedFlag(true); } + return rec; } diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java index c363f2072..d50f2ff03 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java @@ -45,9 +45,11 @@ public class GATKSAMRecord extends BAMRecord { // the SAMRecord data we're caching private String mReadString = null; private GATKSAMReadGroupRecord mReadGroup = null; + private byte[] reducedReadCounts = null; // because some values can be null, we don't want to duplicate effort private boolean retrievedReadGroup = false; + private boolean retrievedReduceReadCounts = false; // These temporary attributes were added here to make life easier for // certain algorithms by providing a way to label or attach arbitrary data to @@ -60,8 +62,27 @@ public class GATKSAMRecord extends BAMRecord { * @param header */ public GATKSAMRecord(final SAMFileHeader header) { - super(header, SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, SAMRecord.NO_ALIGNMENT_START, - (short)0, (short)255, 0, 1, 0, 1, 0, 0, 0, null); + this(new SAMRecord(header)); + } + + /** + * HACK TO CREATE GATKSAMRECORD BASED ONLY A SAMRECORD FOR TESTING PURPOSES ONLY + * @param read + */ + public GATKSAMRecord(final SAMRecord read) { + super(read.getHeader(), read.getMateReferenceIndex(), + read.getAlignmentStart(), + read.getReadName() != null ? (short)read.getReadNameLength() : 0, + (short)read.getMappingQuality(), + 0, + read.getCigarLength(), + read.getFlags(), + read.getReadLength(), + read.getMateReferenceIndex(), + read.getMateAlignmentStart(), + read.getInferredInsertSize(), + new byte[]{}); + super.clearAttributes(); } public GATKSAMRecord(final SAMFileHeader header, @@ -121,6 +142,29 @@ public class GATKSAMRecord extends BAMRecord { retrievedReadGroup = true; } + // + // + // Reduced read functions + // + // + + public byte[] getReducedReadCounts() { + if ( ! retrievedReduceReadCounts ) { + reducedReadCounts = getByteArrayAttribute(ReadUtils.REDUCED_READ_QUALITY_TAG); + retrievedReduceReadCounts = true; + } + + return reducedReadCounts; + } + + public boolean isReducedRead() { + return getReducedReadCounts() != null; + } + + public final byte getReducedCount(final int i) { + return getReducedReadCounts()[i]; + } + /** * Checks whether an attribute has been set for the given key. * diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java index 16abbe498..f8e4927ed 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -52,24 +52,6 @@ public class ReadUtils { // ---------------------------------------------------------------------------------------------------- public static final String REDUCED_READ_QUALITY_TAG = "RQ"; - public static final String REDUCED_READ_CONSENSUS_COUNTS_TAG = "CC"; - - public final static byte[] getReducedReadQualityTagValue(final SAMRecord read) { - // TODO -- warning of performance problem. Should be cached in GATKSAMRecord - return read.getByteArrayAttribute(ReadUtils.REDUCED_READ_QUALITY_TAG); - } - - public final static boolean isReducedRead(final SAMRecord read) { - return getReducedReadQualityTagValue(read) != null; - } - - public final static byte getReducedQual(final SAMRecord read, final int i) { - return read.getBaseQualities()[i]; - } - - public final static byte getReducedCount(final SAMRecord read, final int i) { - return getReducedReadQualityTagValue(read)[i]; - } // ---------------------------------------------------------------------------------------------------- // diff --git a/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java index cc0007439..59a6ecb8d 100755 --- a/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java @@ -5,6 +5,7 @@ import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.BaseTest; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.broadinstitute.sting.utils.sam.ReadUtils; import org.testng.Assert; import org.testng.annotations.BeforeTest; @@ -12,7 +13,7 @@ import org.testng.annotations.Test; public class ReadUtilsUnitTest extends BaseTest { - SAMRecord read, reducedRead; + GATKSAMRecord read, reducedRead; final static String BASES = "ACTG"; final static String QUALS = "!+5?"; final private static byte[] REDUCED_READ_COUNTS = new byte[]{10, 20, 30, 40}; @@ -47,13 +48,12 @@ public class ReadUtilsUnitTest extends BaseTest { @Test public void testReducedReads() { - Assert.assertFalse(ReadUtils.isReducedRead(read), "isReducedRead is false for normal read"); - Assert.assertEquals(ReadUtils.getReducedReadQualityTagValue(read), null, "No reduced read tag in normal read"); + Assert.assertFalse(read.isReducedRead(), "isReducedRead is false for normal read"); + Assert.assertEquals(read.getReducedReadCounts(), null, "No reduced read tag in normal read"); - Assert.assertTrue(ReadUtils.isReducedRead(reducedRead), "isReducedRead is true for reduced read"); + Assert.assertTrue(reducedRead.isReducedRead(), "isReducedRead is true for reduced read"); for ( int i = 0; i < reducedRead.getReadLength(); i++) { - Assert.assertEquals(ReadUtils.getReducedQual(reducedRead, i), read.getBaseQualities()[i], "Reduced read quality not set to the expected value at " + i); - Assert.assertEquals(ReadUtils.getReducedCount(reducedRead, i), REDUCED_READ_COUNTS[i], "Reduced read count not set to the expected value at " + i); + Assert.assertEquals(reducedRead.getReducedCount(i), REDUCED_READ_COUNTS[i], "Reduced read count not set to the expected value at " + i); } } diff --git a/public/java/test/org/broadinstitute/sting/utils/ReservoirDownsamplerUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/ReservoirDownsamplerUnitTest.java index 76dd5d341..0f19e2f90 100644 --- a/public/java/test/org/broadinstitute/sting/utils/ReservoirDownsamplerUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/ReservoirDownsamplerUnitTest.java @@ -1,5 +1,6 @@ package org.broadinstitute.sting.utils; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.testng.Assert; import org.testng.annotations.Test; import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; @@ -28,7 +29,7 @@ public class ReservoirDownsamplerUnitTest { @Test public void testOneElementWithPoolSizeOne() { - List reads = Collections.singletonList(ArtificialSAMUtils.createArtificialRead(header,"read1",0,1,76)); + List reads = Collections.singletonList(ArtificialSAMUtils.createArtificialRead(header,"read1",0,1,76)); ReservoirDownsampler downsampler = new ReservoirDownsampler(1); downsampler.addAll(reads); @@ -40,7 +41,7 @@ public class ReservoirDownsamplerUnitTest { @Test public void testOneElementWithPoolSizeGreaterThanOne() { - List reads = Collections.singletonList(ArtificialSAMUtils.createArtificialRead(header,"read1",0,1,76)); + List reads = Collections.singletonList(ArtificialSAMUtils.createArtificialRead(header,"read1",0,1,76)); ReservoirDownsampler downsampler = new ReservoirDownsampler(5); downsampler.addAll(reads); From 42bf9adede112282e8e8e45bf987ab01305b0a7e Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sat, 22 Oct 2011 21:36:37 -0400 Subject: [PATCH 14/20] Initial version of "fast" FragmentPileup code -- Uses mayOverlapRoutine in ReadUtils -- Attempts to be smart when doing overlap calculation, to avoid unnecessary allocations -- PileupElement now comparable (sorts on offset than on start) -- Caliper microbenchmark to assess performance --- .../sting/utils/pileup/FragmentPileup.java | 124 ++++++++++++++++-- .../sting/utils/pileup/PileupElement.java | 16 ++- .../sting/utils/sam/ReadUtils.java | 48 +++++++ .../UnifiedGenotyperIntegrationTest.java | 12 +- .../utils/pileup/FragmentPileupBenchmark.java | 108 +++++++++++++++ .../utils/pileup/FragmentPileupUnitTest.java | 60 +++++---- 6 files changed, 323 insertions(+), 45 deletions(-) create mode 100644 public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java index f7d237401..f9a94989b 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java @@ -1,9 +1,10 @@ package org.broadinstitute.sting.utils.pileup; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; +import org.broadinstitute.sting.utils.sam.ReadUtils; + +import java.util.*; /** * An easy to access fragment-based pileup, which contains two separate pileups. The first @@ -16,28 +17,46 @@ import java.util.Map; * TODO -- technically we could generalize this code to support a pseudo-duplicate marking * TODO -- algorithm that could collect all duplicates into a single super pileup element * + * Oct 21: note that the order of the oneReadPileup and twoReadPileups are not + * defined. The algorithms that produce these lists are in fact producing + * lists of Pileup elements *NOT* sorted by alignment start position of the underlying + * reads. + * * User: depristo * Date: 3/26/11 * Time: 10:09 PM */ public class FragmentPileup { - final Collection oneReadPile; - final Collection twoReadPile = new ArrayList(); + Collection oneReadPile = null; + Collection twoReadPile = null; /** * Create a new Fragment-based pileup from the standard read-based pileup * @param pileup */ public FragmentPileup(ReadBackedPileup pileup) { - Map nameMap = new HashMap(); + //oldSlowCalculation(pileup); + fastNewCalculation(pileup); + } + + protected FragmentPileup(ReadBackedPileup pileup, boolean useOldAlgorithm) { + if ( useOldAlgorithm ) + oldSlowCalculation(pileup); + else + fastNewCalculation(pileup); + } + + private final void oldSlowCalculation(final ReadBackedPileup pileup) { + final Map nameMap = new HashMap(); // build an initial map, grabbing all of the multi-read fragments - for ( PileupElement p : pileup ) { - String readName = p.getRead().getReadName(); + for ( final PileupElement p : pileup ) { + final String readName = p.getRead().getReadName(); - PileupElement pe1 = nameMap.get(readName); + final PileupElement pe1 = nameMap.get(readName); if ( pe1 != null ) { // assumes we have at most 2 reads per fragment + if ( twoReadPile == null ) twoReadPile = new ArrayList(); twoReadPile.add(new TwoReadPileupElement(pe1, p)); nameMap.remove(readName); } else { @@ -45,17 +64,96 @@ public class FragmentPileup { } } - // now set the one Read pile to the values in the nameMap with only a single read oneReadPile = nameMap.values(); } + /** + * @param pileup + */ + private final void fastNewCalculation(final ReadBackedPileup pileup) { + Map nameMap = null; // lazy initialization + + for ( final PileupElement p : pileup ) { + final SAMRecord read = p.getRead(); + + switch (ReadUtils.readMightOverlapMate(read) ) { + // we know for certain this read doesn't have an overlapping mate + case NO: { + addToOnePile(p); + break; + } + + // we know that we overlap our mate, so put the read in the nameMap in + // case our mate shows up + case LEFT_YES: { + nameMap = addToNameMap(nameMap, p); + break; + } + + // read starts at the same position, so we are looking at either the first or + // the second read. In the first, add it to the map, in the second grab it + // from the map and create a fragment + case SAME_START: { + final PileupElement pe1 = getFromNameMap(nameMap, p); + if ( pe1 != null ) { + addToTwoPile(pe1, p); + nameMap.remove(p.getRead().getReadName()); + } else { + nameMap = addToNameMap(nameMap, p); + } + break; + } + + + // in this case we need to see if our mate is already present, and if so + // grab the read from the list + case RIGHT_MAYBE: { + final PileupElement pe1 = getFromNameMap(nameMap, p); + if ( pe1 != null ) { + addToTwoPile(pe1, p); + nameMap.remove(p.getRead().getReadName()); + } else { + addToOnePile(p); + } + break; + } + } + } + + if ( nameMap != null && ! nameMap.isEmpty() ) // could be slightly more optimally + for ( final PileupElement p : nameMap.values() ) + addToOnePile(p); + } + + private final Map addToNameMap(Map map, final PileupElement p) { + if ( map == null ) map = new HashMap(); + map.put(p.getRead().getReadName(), p); + return map; + } + + private final PileupElement getFromNameMap(Map map, final PileupElement p) { + return map == null ? null : map.get(p.getRead().getReadName()); + } + + + private final void addToOnePile(final PileupElement p) { + if ( oneReadPile == null ) oneReadPile = new ArrayList(); + oneReadPile.add(p); + } + + private final void addToTwoPile(final PileupElement p1, final PileupElement p2) { + // assumes we have at most 2 reads per fragment + if ( twoReadPile == null ) twoReadPile = new ArrayList(); + twoReadPile.add(new TwoReadPileupElement(p1, p2)); + } + /** * Gets the pileup elements containing two reads, in no particular order * * @return */ public Collection getTwoReadPileup() { - return twoReadPile; + return twoReadPile == null ? Collections.emptyList() : twoReadPile; } /** @@ -64,7 +162,7 @@ public class FragmentPileup { * @return */ public Collection getOneReadPileup() { - return oneReadPile; + return oneReadPile == null ? Collections.emptyList() : oneReadPile; } /** diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java index e47b6ada7..3d6b6f4b9 100755 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java @@ -13,7 +13,7 @@ import org.broadinstitute.sting.utils.sam.ReadUtils; * Date: Apr 14, 2009 * Time: 8:54:05 AM */ -public class PileupElement { +public class PileupElement implements Comparable { public static final byte DELETION_BASE = BaseUtils.D; public static final byte DELETION_QUAL = (byte) 16; public static final byte A_FOLLOWED_BY_INSERTION_BASE = (byte) 87; @@ -76,6 +76,20 @@ public class PileupElement { return isDeletion() ? DELETION_QUAL : read.getBaseQualities()[offset]; } + @Override + public int compareTo(final PileupElement pileupElement) { + if ( offset < pileupElement.offset ) + return -1; + else if ( offset > pileupElement.offset ) + return 1; + else if ( read.getAlignmentStart() < pileupElement.read.getAlignmentStart() ) + return -1; + else if ( read.getAlignmentStart() > pileupElement.read.getAlignmentStart() ) + return 1; + else + return 0; + } + // -------------------------------------------------------------------------- // // Reduced read accessors diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java index f8e4927ed..f093e6539 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -214,6 +214,54 @@ public class ReadUtils { return state; } + /** + * s1 e1 + * |-----------------------> [record in hand] + * s2 + * <-----------------------| + * + * s1, e1, and s2 are all in the record. Assuming that s1 < s2 (we are the left most read), + * we can compute whether we overlap with our mate by seeing if s2 <= e1 or no. If e1 < + * s2 then we known that we cannot over. + * + * If we are looking at the right read + * + * s1 + * |-----------------------> + * s2 e2 + * <-----------------------| [record in hand] + * + * we know the position of s1 and s2, but we don't know e1, so we cannot tell if we + * overlap with our mate or not, so in this case we return MAYBE. + * + * Note that if rec has an unmapped mate or is unpaired we certainly know the answer + * + * @param rec + * @return + */ + public static ReadOverlapsMateType readMightOverlapMate(final SAMRecord rec) { + if ( ! rec.getReadPairedFlag() || rec.getMateUnmappedFlag() ) { + return ReadOverlapsMateType.NO; + } else { // read is actually paired + final int recStart = rec.getAlignmentStart(); + final int recEnd = rec.getAlignmentEnd(); + final int mateStart = rec.getMateAlignmentStart(); + + if ( recStart < mateStart ) { + // we are the left most read + return mateStart <= recEnd ? ReadOverlapsMateType.LEFT_YES: ReadOverlapsMateType.NO; + } else if ( recStart == mateStart ) { + // we are the left most read + return ReadOverlapsMateType.SAME_START; + } else { + // we are the right most read, so we cannot tell + return ReadOverlapsMateType.RIGHT_MAYBE; + } + } + } + + public enum ReadOverlapsMateType { LEFT_YES, NO, SAME_START, RIGHT_MAYBE } + private static Pair getAdaptorBoundaries(SAMRecord rec, int adaptorLength) { int isize = rec.getInferredInsertSize(); if ( isize == 0 ) diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperIntegrationTest.java index 6b6346447..7d6cfc7ad 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperIntegrationTest.java @@ -224,7 +224,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { " -o %s" + " -L 1:10,000,000-10,500,000", 1, - Arrays.asList("0bece77ce6bc447438ef9b2921b2dc41")); + Arrays.asList("eeba568272f9b42d5450da75c7cc6d2d")); executeTest(String.format("test indel caller in SLX"), spec); } @@ -252,7 +252,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { " -o %s" + " -L 1:10,000,000-10,500,000", 1, - Arrays.asList("790b1a1d6ab79eee8c24812bb8ca6fae")); + Arrays.asList("19ff9bd3139480bdf79dcbf117cf2b24")); executeTest(String.format("test indel calling, multiple technologies"), spec); } @@ -262,7 +262,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { WalkerTest.WalkerTestSpec spec1 = new WalkerTest.WalkerTestSpec( baseCommandIndels + " --genotyping_mode GENOTYPE_GIVEN_ALLELES -alleles " + validationDataLocation + "indelAllelesForUG.vcf -I " + validationDataLocation + "pilot2_daughters.chr20.10k-11k.bam -o %s -L 20:10,000,000-10,100,000", 1, - Arrays.asList("408d3aba4d094c067fc00a43992c2292")); + Arrays.asList("118918f2e9e56a3cfc5ccb2856d529c8")); executeTest("test MultiSample Pilot2 indels with alleles passed in", spec1); } @@ -272,7 +272,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { baseCommandIndels + " --output_mode EMIT_ALL_SITES --genotyping_mode GENOTYPE_GIVEN_ALLELES -alleles " + validationDataLocation + "indelAllelesForUG.vcf -I " + validationDataLocation + "pilot2_daughters.chr20.10k-11k.bam -o %s -L 20:10,000,000-10,100,000", 1, - Arrays.asList("5e4e09354410b76fc0d822050d84132a")); + Arrays.asList("a20799237accd52c1b8c2ac096309c8f")); executeTest("test MultiSample Pilot2 indels with alleles passed in and emitting all sites", spec2); } @@ -282,7 +282,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { WalkerTest.WalkerTestSpec spec3 = new WalkerTest.WalkerTestSpec( baseCommandIndels + " --genotyping_mode GENOTYPE_GIVEN_ALLELES -alleles " + validationDataLocation + "ALL.wgs.union_v2.20101123.indels.sites.vcf -I " + validationDataLocation + "pilot2_daughters.chr20.10k-11k.bam -o %s -L 20:10,000,000-10,080,000", 1, - Arrays.asList("c599eedbeb422713b8a28529e805e4ae")); + Arrays.asList("18ef8181157b4ac3eb8492f538467f92")); executeTest("test MultiSample Pilot2 indels with complicated records", spec3); } @@ -291,7 +291,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { WalkerTest.WalkerTestSpec spec4 = new WalkerTest.WalkerTestSpec( baseCommandIndelsb37 + " --genotyping_mode GENOTYPE_GIVEN_ALLELES -alleles " + validationDataLocation + "ALL.wgs.union_v2_chr20_100_110K.20101123.indels.sites.vcf -I " + validationDataLocation + "phase1_GBR_realigned.chr20.100K-110K.bam -o %s -L 20:100,000-110,000", 1, - Arrays.asList("37d908a682ac269f8f19dec939ff5b01")); + Arrays.asList("ad884e511a751b05e64db5314314365a")); executeTest("test MultiSample 1000G Phase1 indels with complicated records emitting all sites", spec4); } diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java new file mode 100644 index 000000000..fe1ca305f --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2011, The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.broadinstitute.sting.utils.pileup; + +import com.google.caliper.Param; +import com.google.caliper.SimpleBenchmark; +import com.google.caliper.runner.CaliperMain; +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; + +import java.util.*; + +/** + * Caliper microbenchmark of fragment pileup + */ +public class FragmentPileupBenchmark extends SimpleBenchmark { + final int N_PILEUPS_TO_GENERATE = 100; + List pileups = new ArrayList(N_PILEUPS_TO_GENERATE); + + @Param({"10", "100", "1000"}) // , "10000"}) + int pileupSize; // set automatically by framework + + @Param({"150", "400"}) + int insertSize; // set automatically by framework + + @Override protected void setUp() { + SAMFileHeader header = ArtificialSAMUtils.createArtificialSamHeader(1, 1, 1000); + GenomeLocParser genomeLocParser; + genomeLocParser = new GenomeLocParser(header.getSequenceDictionary()); + final int pos = 50; + GenomeLoc loc = genomeLocParser.createGenomeLoc("chr1", pos); + + final Random ran = new Random(); + final int readLen = 100; + final boolean leftIsFirst = true; + final boolean leftIsNegative = false; + final int insertSizeVariation = insertSize / 10; + + for ( int pileupN = 0; pileupN < N_PILEUPS_TO_GENERATE; pileupN++ ) { + List pileupElements = new ArrayList(); + for ( int i = 0; i < pileupSize / 2; i++ ) { + final String readName = "read" + i; + final int leftStart = new Random().nextInt(49) + 1; + final int fragmentSize = (int)(ran.nextGaussian() * insertSizeVariation + insertSize); + final int rightStart = leftStart + fragmentSize - readLen; + + if ( rightStart <= 0 ) continue; + + List pair = FragmentPileupUnitTest.createPair(header, readName, readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); + SAMRecord left = pair.get(0); + SAMRecord right = pair.get(1); + + pileupElements.add(new PileupElement(left, pos - leftStart)); + + if ( pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd() ) { + pileupElements.add(new PileupElement(right, pos - rightStart)); + } + } + + Collections.sort(pileupElements); + pileups.add(new ReadBackedPileupImpl(loc, pileupElements)); + } + } + + public void timeNaiveNameMatch(int rep) { + int nFrags = 0; + for ( int i = 0; i < rep; i++ ) { + for ( ReadBackedPileup rbp : pileups ) + nFrags += new FragmentPileup(rbp, true).getTwoReadPileup().size(); + } + } + + public void timeFastNameMatch(int rep) { + int nFrags = 0; + for ( int i = 0; i < rep; i++ ) + for ( ReadBackedPileup rbp : pileups ) + nFrags += new FragmentPileup(rbp, false).getTwoReadPileup().size(); + } + + public static void main(String[] args) { + CaliperMain.main(FragmentPileupBenchmark.class, args); + } +} diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java index 778259528..be4ecc0c6 100644 --- a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java @@ -43,37 +43,48 @@ import java.util.*; public class FragmentPileupUnitTest extends BaseTest { private static SAMFileHeader header; + public final static List createPair(SAMFileHeader header, String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { + SAMRecord left = ArtificialSAMUtils.createArtificialRead(header, name, 0, leftStart, readLen); + SAMRecord right = ArtificialSAMUtils.createArtificialRead(header, name, 0, rightStart, readLen); + + left.setReadPairedFlag(true); + right.setReadPairedFlag(true); + + left.setProperPairFlag(true); + right.setProperPairFlag(true); + + left.setFirstOfPairFlag(leftIsFirst); + right.setFirstOfPairFlag(! leftIsFirst); + + left.setReadNegativeStrandFlag(leftIsNegative); + left.setMateNegativeStrandFlag(!leftIsNegative); + right.setReadNegativeStrandFlag(!leftIsNegative); + right.setMateNegativeStrandFlag(leftIsNegative); + + left.setMateAlignmentStart(right.getAlignmentStart()); + right.setMateAlignmentStart(left.getAlignmentStart()); + + left.setMateReferenceIndex(0); + right.setMateReferenceIndex(0); + + int isize = rightStart + readLen - leftStart; + left.setInferredInsertSize(isize); + right.setInferredInsertSize(-isize); + + return Arrays.asList(left, right); + } + private class FragmentPileupTest extends TestDataProvider { List states = new ArrayList(); private FragmentPileupTest(String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { super(FragmentPileupTest.class, String.format("%s-leftIsFirst:%b-leftIsNegative:%b", name, leftIsFirst, leftIsNegative)); + List pair = createPair(header, "readpair", readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); + SAMRecord left = pair.get(0); + SAMRecord right = pair.get(1); + for ( int pos = leftStart; pos < rightStart + readLen; pos++) { - SAMRecord left = ArtificialSAMUtils.createArtificialRead(header, "readpair", 0, leftStart, readLen); - SAMRecord right = ArtificialSAMUtils.createArtificialRead(header, "readpair", 0, rightStart, readLen); - - left.setProperPairFlag(true); - right.setProperPairFlag(true); - - left.setFirstOfPairFlag(leftIsFirst); - right.setFirstOfPairFlag(! leftIsFirst); - - left.setReadNegativeStrandFlag(leftIsNegative); - left.setMateNegativeStrandFlag(!leftIsNegative); - right.setReadNegativeStrandFlag(!leftIsNegative); - right.setMateNegativeStrandFlag(leftIsNegative); - - left.setMateAlignmentStart(right.getAlignmentStart()); - right.setMateAlignmentStart(left.getAlignmentStart()); - - left.setMateReferenceIndex(0); - right.setMateReferenceIndex(0); - - int isize = rightStart + readLen - leftStart; - left.setInferredInsertSize(isize); - right.setInferredInsertSize(-isize); - boolean posCoveredByLeft = pos >= left.getAlignmentStart() && pos <= left.getAlignmentEnd(); boolean posCoveredByRight = pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd(); @@ -139,7 +150,6 @@ public class FragmentPileupUnitTest extends BaseTest { } } - @BeforeTest public void setup() { header = ArtificialSAMUtils.createArtificialSamHeader(1,1,1000); From 166174a551860fa18e8092f3dbe56e0ef28eb884 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 24 Oct 2011 14:04:53 -0400 Subject: [PATCH 15/20] Google caliper example execution script -- FragmentPileup with final performance testing --- .../sting/utils/pileup/FragmentPileup.java | 93 +++++++++++++++++-- .../utils/pileup/FragmentPileupBenchmark.java | 34 ++++--- 2 files changed, 105 insertions(+), 22 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java index f9a94989b..e811db355 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java @@ -30,6 +30,13 @@ public class FragmentPileup { Collection oneReadPile = null; Collection twoReadPile = null; + public enum FragmentMatchingAlgorithm { + ORIGINAL, + FAST_V1, + skipNonOverlapping, + skipNonOverlappingNotLazy + } + /** * Create a new Fragment-based pileup from the standard read-based pileup * @param pileup @@ -39,15 +46,17 @@ public class FragmentPileup { fastNewCalculation(pileup); } - protected FragmentPileup(ReadBackedPileup pileup, boolean useOldAlgorithm) { - if ( useOldAlgorithm ) - oldSlowCalculation(pileup); - else - fastNewCalculation(pileup); + protected FragmentPileup(ReadBackedPileup pileup, FragmentMatchingAlgorithm algorithm) { + switch ( algorithm ) { + case ORIGINAL: oldSlowCalculation(pileup); break; + case FAST_V1: fastNewCalculation(pileup); break; + case skipNonOverlapping: skipNonOverlapping(pileup); break; + case skipNonOverlappingNotLazy: skipNonOverlappingNotLazy(pileup); break; + } } private final void oldSlowCalculation(final ReadBackedPileup pileup) { - final Map nameMap = new HashMap(); + final Map nameMap = new HashMap(pileup.size()); // build an initial map, grabbing all of the multi-read fragments for ( final PileupElement p : pileup ) { @@ -104,7 +113,6 @@ public class FragmentPileup { break; } - // in this case we need to see if our mate is already present, and if so // grab the read from the list case RIGHT_MAYBE: { @@ -120,9 +128,74 @@ public class FragmentPileup { } } - if ( nameMap != null && ! nameMap.isEmpty() ) // could be slightly more optimally - for ( final PileupElement p : nameMap.values() ) - addToOnePile(p); + if ( nameMap != null && ! nameMap.isEmpty() ) { + if ( oneReadPile == null ) + oneReadPile = nameMap.values(); + else + oneReadPile.addAll(nameMap.values()); + } + } + + /** + * @param pileup + */ + private final void skipNonOverlappingNotLazy(final ReadBackedPileup pileup) { + oneReadPile = new ArrayList(pileup.size()); + twoReadPile = new ArrayList(); + final Map nameMap = new HashMap(pileup.size()); + + // build an initial map, grabbing all of the multi-read fragments + for ( final PileupElement p : pileup ) { + // if we know that this read won't overlap its mate, or doesn't have one, jump out early + final SAMRecord read = p.getRead(); + final int mateStart = read.getMateAlignmentStart(); + if ( mateStart == 0 || mateStart > read.getAlignmentEnd() ) { + oneReadPile.add(p); + } else { + final String readName = p.getRead().getReadName(); + final PileupElement pe1 = nameMap.get(readName); + if ( pe1 != null ) { + // assumes we have at most 2 reads per fragment + twoReadPile.add(new TwoReadPileupElement(pe1, p)); + nameMap.remove(readName); + } else { + nameMap.put(readName, p); + } + } + } + + oneReadPile.addAll(nameMap.values()); + } + + private final void skipNonOverlapping(final ReadBackedPileup pileup) { + Map nameMap = null; + + // build an initial map, grabbing all of the multi-read fragments + for ( final PileupElement p : pileup ) { + // if we know that this read won't overlap its mate, or doesn't have one, jump out early + final SAMRecord read = p.getRead(); + final int mateStart = read.getMateAlignmentStart(); + if ( mateStart == 0 || mateStart > read.getAlignmentEnd() ) { + if ( oneReadPile == null ) oneReadPile = new ArrayList(pileup.size()); + oneReadPile.add(p); + } else { + final String readName = p.getRead().getReadName(); + final PileupElement pe1 = nameMap == null ? null : nameMap.get(readName); + if ( pe1 != null ) { + // assumes we have at most 2 reads per fragment + if ( twoReadPile == null ) twoReadPile = new ArrayList(); + twoReadPile.add(new TwoReadPileupElement(pe1, p)); + nameMap.remove(readName); + } else { + nameMap = addToNameMap(nameMap, p); + } + } + } + + if ( oneReadPile == null ) + oneReadPile = nameMap == null ? Collections.emptyList() : nameMap.values(); + else if ( nameMap != null ) + oneReadPile.addAll(nameMap.values()); } private final Map addToNameMap(Map map, final PileupElement p) { diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java index fe1ca305f..6a5378d46 100644 --- a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java @@ -39,16 +39,17 @@ import java.util.*; * Caliper microbenchmark of fragment pileup */ public class FragmentPileupBenchmark extends SimpleBenchmark { - final int N_PILEUPS_TO_GENERATE = 100; - List pileups = new ArrayList(N_PILEUPS_TO_GENERATE); + List pileups; - @Param({"10", "100", "1000"}) // , "10000"}) + @Param({"0", "4", "30", "150", "1000"}) int pileupSize; // set automatically by framework - @Param({"150", "400"}) + @Param({"200", "400"}) int insertSize; // set automatically by framework @Override protected void setUp() { + final int nPileupsToGenerate = 100; + pileups = new ArrayList(nPileupsToGenerate); SAMFileHeader header = ArtificialSAMUtils.createArtificialSamHeader(1, 1, 1000); GenomeLocParser genomeLocParser; genomeLocParser = new GenomeLocParser(header.getSequenceDictionary()); @@ -61,7 +62,7 @@ public class FragmentPileupBenchmark extends SimpleBenchmark { final boolean leftIsNegative = false; final int insertSizeVariation = insertSize / 10; - for ( int pileupN = 0; pileupN < N_PILEUPS_TO_GENERATE; pileupN++ ) { + for ( int pileupN = 0; pileupN < nPileupsToGenerate; pileupN++ ) { List pileupElements = new ArrayList(); for ( int i = 0; i < pileupSize / 2; i++ ) { final String readName = "read" + i; @@ -87,19 +88,28 @@ public class FragmentPileupBenchmark extends SimpleBenchmark { } } - public void timeNaiveNameMatch(int rep) { + private void run(int rep, FragmentPileup.FragmentMatchingAlgorithm algorithm) { int nFrags = 0; for ( int i = 0; i < rep; i++ ) { for ( ReadBackedPileup rbp : pileups ) - nFrags += new FragmentPileup(rbp, true).getTwoReadPileup().size(); + nFrags += new FragmentPileup(rbp, algorithm).getTwoReadPileup().size(); } } - public void timeFastNameMatch(int rep) { - int nFrags = 0; - for ( int i = 0; i < rep; i++ ) - for ( ReadBackedPileup rbp : pileups ) - nFrags += new FragmentPileup(rbp, false).getTwoReadPileup().size(); + public void timeOriginal(int rep) { + run(rep, FragmentPileup.FragmentMatchingAlgorithm.ORIGINAL); + } + + public void timeFullOverlapPotential(int rep) { + run(rep, FragmentPileup.FragmentMatchingAlgorithm.FAST_V1); + } + + public void timeSkipNonOverlapping(int rep) { + run(rep, FragmentPileup.FragmentMatchingAlgorithm.skipNonOverlapping); + } + + public void timeSkipNonOverlappingNotLazy(int rep) { + run(rep, FragmentPileup.FragmentMatchingAlgorithm.skipNonOverlappingNotLazy); } public static void main(String[] args) { From 502592671d7bfdbb9cff0575e94ca3c0946d000d Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 24 Oct 2011 14:40:05 -0400 Subject: [PATCH 16/20] Cleanup FragmentPileup before main repo commit -- removed intermiate functions. Now only original version and best optimized new version remain -- Moved general artificial read backed pileup creation code into ArtificialSamUtils --- .../sting/utils/pileup/FragmentPileup.java | 163 +++--------------- .../sting/utils/sam/ArtificialSAMUtils.java | 91 +++++++++- .../sting/utils/sam/ReadUtils.java | 48 ------ .../utils/pileup/FragmentPileupBenchmark.java | 40 +---- .../utils/pileup/FragmentPileupUnitTest.java | 33 +--- 5 files changed, 116 insertions(+), 259 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java index e811db355..4eda7c7cd 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java @@ -14,9 +14,6 @@ import java.util.*; * * Based on the original code by E. Banks * - * TODO -- technically we could generalize this code to support a pseudo-duplicate marking - * TODO -- algorithm that could collect all duplicates into a single super pileup element - * * Oct 21: note that the order of the oneReadPileup and twoReadPileups are not * defined. The algorithms that produce these lists are in fact producing * lists of Pileup elements *NOT* sorted by alignment start position of the underlying @@ -30,11 +27,9 @@ public class FragmentPileup { Collection oneReadPile = null; Collection twoReadPile = null; - public enum FragmentMatchingAlgorithm { + protected enum FragmentMatchingAlgorithm { ORIGINAL, - FAST_V1, skipNonOverlapping, - skipNonOverlappingNotLazy } /** @@ -42,16 +37,14 @@ public class FragmentPileup { * @param pileup */ public FragmentPileup(ReadBackedPileup pileup) { - //oldSlowCalculation(pileup); - fastNewCalculation(pileup); + skipNonOverlapping(pileup); } + /** For performance testing only */ protected FragmentPileup(ReadBackedPileup pileup, FragmentMatchingAlgorithm algorithm) { switch ( algorithm ) { case ORIGINAL: oldSlowCalculation(pileup); break; - case FAST_V1: fastNewCalculation(pileup); break; case skipNonOverlapping: skipNonOverlapping(pileup); break; - case skipNonOverlappingNotLazy: skipNonOverlappingNotLazy(pileup); break; } } @@ -76,58 +69,36 @@ public class FragmentPileup { oneReadPile = nameMap.values(); } - /** - * @param pileup - */ - private final void fastNewCalculation(final ReadBackedPileup pileup) { - Map nameMap = null; // lazy initialization + private final void skipNonOverlapping(final ReadBackedPileup pileup) { + Map nameMap = null; + // build an initial map, grabbing all of the multi-read fragments for ( final PileupElement p : pileup ) { final SAMRecord read = p.getRead(); + final int mateStart = read.getMateAlignmentStart(); - switch (ReadUtils.readMightOverlapMate(read) ) { - // we know for certain this read doesn't have an overlapping mate - case NO: { - addToOnePile(p); - break; - } - - // we know that we overlap our mate, so put the read in the nameMap in - // case our mate shows up - case LEFT_YES: { - nameMap = addToNameMap(nameMap, p); - break; - } - - // read starts at the same position, so we are looking at either the first or - // the second read. In the first, add it to the map, in the second grab it - // from the map and create a fragment - case SAME_START: { - final PileupElement pe1 = getFromNameMap(nameMap, p); - if ( pe1 != null ) { - addToTwoPile(pe1, p); - nameMap.remove(p.getRead().getReadName()); - } else { - nameMap = addToNameMap(nameMap, p); - } - break; - } - - // in this case we need to see if our mate is already present, and if so - // grab the read from the list - case RIGHT_MAYBE: { - final PileupElement pe1 = getFromNameMap(nameMap, p); - if ( pe1 != null ) { - addToTwoPile(pe1, p); - nameMap.remove(p.getRead().getReadName()); - } else { - addToOnePile(p); - } - break; + if ( mateStart == 0 || mateStart > read.getAlignmentEnd() ) { + // if we know that this read won't overlap its mate, or doesn't have one, jump out early + if ( oneReadPile == null ) oneReadPile = new ArrayList(pileup.size()); // lazy init + oneReadPile.add(p); + } else { + // the read might overlap it's mate, or is the rightmost read of a pair + final String readName = p.getRead().getReadName(); + final PileupElement pe1 = nameMap == null ? null : nameMap.get(readName); + if ( pe1 != null ) { + // assumes we have at most 2 reads per fragment + if ( twoReadPile == null ) twoReadPile = new ArrayList(); // lazy init + twoReadPile.add(new TwoReadPileupElement(pe1, p)); + nameMap.remove(readName); + } else { + if ( nameMap == null ) nameMap = new HashMap(pileup.size()); // lazy init + nameMap.put(readName, p); } } } + // add all of the reads that are potentially overlapping but whose mate never showed + // up to the oneReadPile if ( nameMap != null && ! nameMap.isEmpty() ) { if ( oneReadPile == null ) oneReadPile = nameMap.values(); @@ -136,90 +107,6 @@ public class FragmentPileup { } } - /** - * @param pileup - */ - private final void skipNonOverlappingNotLazy(final ReadBackedPileup pileup) { - oneReadPile = new ArrayList(pileup.size()); - twoReadPile = new ArrayList(); - final Map nameMap = new HashMap(pileup.size()); - - // build an initial map, grabbing all of the multi-read fragments - for ( final PileupElement p : pileup ) { - // if we know that this read won't overlap its mate, or doesn't have one, jump out early - final SAMRecord read = p.getRead(); - final int mateStart = read.getMateAlignmentStart(); - if ( mateStart == 0 || mateStart > read.getAlignmentEnd() ) { - oneReadPile.add(p); - } else { - final String readName = p.getRead().getReadName(); - final PileupElement pe1 = nameMap.get(readName); - if ( pe1 != null ) { - // assumes we have at most 2 reads per fragment - twoReadPile.add(new TwoReadPileupElement(pe1, p)); - nameMap.remove(readName); - } else { - nameMap.put(readName, p); - } - } - } - - oneReadPile.addAll(nameMap.values()); - } - - private final void skipNonOverlapping(final ReadBackedPileup pileup) { - Map nameMap = null; - - // build an initial map, grabbing all of the multi-read fragments - for ( final PileupElement p : pileup ) { - // if we know that this read won't overlap its mate, or doesn't have one, jump out early - final SAMRecord read = p.getRead(); - final int mateStart = read.getMateAlignmentStart(); - if ( mateStart == 0 || mateStart > read.getAlignmentEnd() ) { - if ( oneReadPile == null ) oneReadPile = new ArrayList(pileup.size()); - oneReadPile.add(p); - } else { - final String readName = p.getRead().getReadName(); - final PileupElement pe1 = nameMap == null ? null : nameMap.get(readName); - if ( pe1 != null ) { - // assumes we have at most 2 reads per fragment - if ( twoReadPile == null ) twoReadPile = new ArrayList(); - twoReadPile.add(new TwoReadPileupElement(pe1, p)); - nameMap.remove(readName); - } else { - nameMap = addToNameMap(nameMap, p); - } - } - } - - if ( oneReadPile == null ) - oneReadPile = nameMap == null ? Collections.emptyList() : nameMap.values(); - else if ( nameMap != null ) - oneReadPile.addAll(nameMap.values()); - } - - private final Map addToNameMap(Map map, final PileupElement p) { - if ( map == null ) map = new HashMap(); - map.put(p.getRead().getReadName(), p); - return map; - } - - private final PileupElement getFromNameMap(Map map, final PileupElement p) { - return map == null ? null : map.get(p.getRead().getReadName()); - } - - - private final void addToOnePile(final PileupElement p) { - if ( oneReadPile == null ) oneReadPile = new ArrayList(); - oneReadPile.add(p); - } - - private final void addToTwoPile(final PileupElement p1, final PileupElement p2) { - // assumes we have at most 2 reads per fragment - if ( twoReadPile == null ) twoReadPile = new ArrayList(); - twoReadPile.add(new TwoReadPileupElement(p1, p2)); - } - /** * Gets the pileup elements containing two reads, in no particular order * diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java index 4eba32383..1b3641128 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java @@ -2,11 +2,15 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.*; import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileupImpl; import java.io.File; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @author aaron @@ -29,7 +33,7 @@ public class ArtificialSAMUtils { File outFile = new File(filename); SAMFileWriter out = new SAMFileWriterFactory().makeBAMWriter(header, true, outFile); - + for (int x = startingChromosome; x < startingChromosome + numberOfChromosomes; x++) { for (int readNumber = 1; readNumber < readsPerChomosome; readNumber++) { out.addAlignment(createArtificialRead(header, "Read_" + readNumber, x - startingChromosome, readNumber, DEFAULT_READ_LENGTH)); @@ -145,7 +149,7 @@ public class ArtificialSAMUtils { */ public static GATKSAMRecord createArtificialRead(SAMFileHeader header, String name, int refIndex, int alignmentStart, int length) { if( (refIndex == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart != SAMRecord.NO_ALIGNMENT_START) || - (refIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart == SAMRecord.NO_ALIGNMENT_START) ) + (refIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart == SAMRecord.NO_ALIGNMENT_START) ) throw new ReviewedStingException("Invalid alignment start for artificial read, start = " + alignmentStart); GATKSAMRecord record = new GATKSAMRecord(header); record.setReadName(name); @@ -197,6 +201,37 @@ public class ArtificialSAMUtils { return rec; } + public final static List createPair(SAMFileHeader header, String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { + SAMRecord left = ArtificialSAMUtils.createArtificialRead(header, name, 0, leftStart, readLen); + SAMRecord right = ArtificialSAMUtils.createArtificialRead(header, name, 0, rightStart, readLen); + + left.setReadPairedFlag(true); + right.setReadPairedFlag(true); + + left.setProperPairFlag(true); + right.setProperPairFlag(true); + + left.setFirstOfPairFlag(leftIsFirst); + right.setFirstOfPairFlag(! leftIsFirst); + + left.setReadNegativeStrandFlag(leftIsNegative); + left.setMateNegativeStrandFlag(!leftIsNegative); + right.setReadNegativeStrandFlag(!leftIsNegative); + right.setMateNegativeStrandFlag(leftIsNegative); + + left.setMateAlignmentStart(right.getAlignmentStart()); + right.setMateAlignmentStart(left.getAlignmentStart()); + + left.setMateReferenceIndex(0); + right.setMateReferenceIndex(0); + + int isize = rightStart + readLen - leftStart; + left.setInferredInsertSize(isize); + right.setInferredInsertSize(-isize); + + return Arrays.asList(left, right); + } + /** * create an iterator containing the specified read piles * @@ -258,4 +293,52 @@ public class ArtificialSAMUtils { return new ArtificialSAMQueryIterator(startingChr, endingChr, readCount, unmappedReadCount, header); } + + private final static int ranIntInclusive(Random ran, int start, int stop) { + final int range = stop - start; + return ran.nextInt(range) + start; + } + + /** + * Creates a read backed pileup containing up to pileupSize reads at refID 0 from header at loc with + * reads created that have readLen bases. Pairs are sampled from a gaussian distribution with mean insert + * size of insertSize and variation of insertSize / 10. The first read will be in the pileup, and the second + * may be, depending on where this sampled insertSize puts it. + * @param header + * @param loc + * @param readLen + * @param insertSize + * @param pileupSize + * @return + */ + public static ReadBackedPileup createReadBackedPileup(final SAMFileHeader header, final GenomeLoc loc, final int readLen, final int insertSize, final int pileupSize) { + final Random ran = new Random(); + final boolean leftIsFirst = true; + final boolean leftIsNegative = false; + final int insertSizeVariation = insertSize / 10; + final int pos = loc.getStart(); + + final List pileupElements = new ArrayList(); + for ( int i = 0; i < pileupSize / 2; i++ ) { + final String readName = "read" + i; + final int leftStart = ranIntInclusive(ran, 1, pos); + final int fragmentSize = (int)(ran.nextGaussian() * insertSizeVariation + insertSize); + final int rightStart = leftStart + fragmentSize - readLen; + + if ( rightStart <= 0 ) continue; + + List pair = createPair(header, readName, readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); + final SAMRecord left = pair.get(0); + final SAMRecord right = pair.get(1); + + pileupElements.add(new PileupElement(left, pos - leftStart)); + + if ( pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd() ) { + pileupElements.add(new PileupElement(right, pos - rightStart)); + } + } + + Collections.sort(pileupElements); + return new ReadBackedPileupImpl(loc, pileupElements); + } } diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java index f093e6539..f8e4927ed 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -214,54 +214,6 @@ public class ReadUtils { return state; } - /** - * s1 e1 - * |-----------------------> [record in hand] - * s2 - * <-----------------------| - * - * s1, e1, and s2 are all in the record. Assuming that s1 < s2 (we are the left most read), - * we can compute whether we overlap with our mate by seeing if s2 <= e1 or no. If e1 < - * s2 then we known that we cannot over. - * - * If we are looking at the right read - * - * s1 - * |-----------------------> - * s2 e2 - * <-----------------------| [record in hand] - * - * we know the position of s1 and s2, but we don't know e1, so we cannot tell if we - * overlap with our mate or not, so in this case we return MAYBE. - * - * Note that if rec has an unmapped mate or is unpaired we certainly know the answer - * - * @param rec - * @return - */ - public static ReadOverlapsMateType readMightOverlapMate(final SAMRecord rec) { - if ( ! rec.getReadPairedFlag() || rec.getMateUnmappedFlag() ) { - return ReadOverlapsMateType.NO; - } else { // read is actually paired - final int recStart = rec.getAlignmentStart(); - final int recEnd = rec.getAlignmentEnd(); - final int mateStart = rec.getMateAlignmentStart(); - - if ( recStart < mateStart ) { - // we are the left most read - return mateStart <= recEnd ? ReadOverlapsMateType.LEFT_YES: ReadOverlapsMateType.NO; - } else if ( recStart == mateStart ) { - // we are the left most read - return ReadOverlapsMateType.SAME_START; - } else { - // we are the right most read, so we cannot tell - return ReadOverlapsMateType.RIGHT_MAYBE; - } - } - } - - public enum ReadOverlapsMateType { LEFT_YES, NO, SAME_START, RIGHT_MAYBE } - private static Pair getAdaptorBoundaries(SAMRecord rec, int adaptorLength) { int isize = rec.getInferredInsertSize(); if ( isize == 0 ) diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java index 6a5378d46..8b797def4 100644 --- a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java @@ -53,38 +53,12 @@ public class FragmentPileupBenchmark extends SimpleBenchmark { SAMFileHeader header = ArtificialSAMUtils.createArtificialSamHeader(1, 1, 1000); GenomeLocParser genomeLocParser; genomeLocParser = new GenomeLocParser(header.getSequenceDictionary()); - final int pos = 50; - GenomeLoc loc = genomeLocParser.createGenomeLoc("chr1", pos); - - final Random ran = new Random(); + GenomeLoc loc = genomeLocParser.createGenomeLoc("chr1", 50); final int readLen = 100; - final boolean leftIsFirst = true; - final boolean leftIsNegative = false; - final int insertSizeVariation = insertSize / 10; for ( int pileupN = 0; pileupN < nPileupsToGenerate; pileupN++ ) { - List pileupElements = new ArrayList(); - for ( int i = 0; i < pileupSize / 2; i++ ) { - final String readName = "read" + i; - final int leftStart = new Random().nextInt(49) + 1; - final int fragmentSize = (int)(ran.nextGaussian() * insertSizeVariation + insertSize); - final int rightStart = leftStart + fragmentSize - readLen; - - if ( rightStart <= 0 ) continue; - - List pair = FragmentPileupUnitTest.createPair(header, readName, readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); - SAMRecord left = pair.get(0); - SAMRecord right = pair.get(1); - - pileupElements.add(new PileupElement(left, pos - leftStart)); - - if ( pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd() ) { - pileupElements.add(new PileupElement(right, pos - rightStart)); - } - } - - Collections.sort(pileupElements); - pileups.add(new ReadBackedPileupImpl(loc, pileupElements)); + ReadBackedPileup rbp = ArtificialSAMUtils.createReadBackedPileup(header, loc, readLen, insertSize, pileupSize); + pileups.add(rbp); } } @@ -100,18 +74,10 @@ public class FragmentPileupBenchmark extends SimpleBenchmark { run(rep, FragmentPileup.FragmentMatchingAlgorithm.ORIGINAL); } - public void timeFullOverlapPotential(int rep) { - run(rep, FragmentPileup.FragmentMatchingAlgorithm.FAST_V1); - } - public void timeSkipNonOverlapping(int rep) { run(rep, FragmentPileup.FragmentMatchingAlgorithm.skipNonOverlapping); } - public void timeSkipNonOverlappingNotLazy(int rep) { - run(rep, FragmentPileup.FragmentMatchingAlgorithm.skipNonOverlappingNotLazy); - } - public static void main(String[] args) { CaliperMain.main(FragmentPileupBenchmark.class, args); } diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java index be4ecc0c6..c42c01c65 100644 --- a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java @@ -43,44 +43,13 @@ import java.util.*; public class FragmentPileupUnitTest extends BaseTest { private static SAMFileHeader header; - public final static List createPair(SAMFileHeader header, String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { - SAMRecord left = ArtificialSAMUtils.createArtificialRead(header, name, 0, leftStart, readLen); - SAMRecord right = ArtificialSAMUtils.createArtificialRead(header, name, 0, rightStart, readLen); - - left.setReadPairedFlag(true); - right.setReadPairedFlag(true); - - left.setProperPairFlag(true); - right.setProperPairFlag(true); - - left.setFirstOfPairFlag(leftIsFirst); - right.setFirstOfPairFlag(! leftIsFirst); - - left.setReadNegativeStrandFlag(leftIsNegative); - left.setMateNegativeStrandFlag(!leftIsNegative); - right.setReadNegativeStrandFlag(!leftIsNegative); - right.setMateNegativeStrandFlag(leftIsNegative); - - left.setMateAlignmentStart(right.getAlignmentStart()); - right.setMateAlignmentStart(left.getAlignmentStart()); - - left.setMateReferenceIndex(0); - right.setMateReferenceIndex(0); - - int isize = rightStart + readLen - leftStart; - left.setInferredInsertSize(isize); - right.setInferredInsertSize(-isize); - - return Arrays.asList(left, right); - } - private class FragmentPileupTest extends TestDataProvider { List states = new ArrayList(); private FragmentPileupTest(String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { super(FragmentPileupTest.class, String.format("%s-leftIsFirst:%b-leftIsNegative:%b", name, leftIsFirst, leftIsNegative)); - List pair = createPair(header, "readpair", readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); + List pair = ArtificialSAMUtils.createPair(header, "readpair", readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); SAMRecord left = pair.get(0); SAMRecord right = pair.get(1); From 9eaa62f3f31b28d1278f9cb6860d1fc3ed237fa5 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 25 Oct 2011 15:15:52 -0400 Subject: [PATCH 17/20] Tmp. SAM-JDK rev. Better google caliper example --- settings/repository/net.sf/sam-1.52.944.jar | Bin 548617 -> 0 bytes settings/repository/net.sf/sam-1.52.944.xml | 3 --- 2 files changed, 3 deletions(-) delete mode 100644 settings/repository/net.sf/sam-1.52.944.jar delete mode 100644 settings/repository/net.sf/sam-1.52.944.xml diff --git a/settings/repository/net.sf/sam-1.52.944.jar b/settings/repository/net.sf/sam-1.52.944.jar deleted file mode 100644 index 7037c7a9603b83a0f1aaf2f2ba712b7211ca8f7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 548617 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�Hq@#HA482V!J zaXJ4T6=sW+;hdOu291+4JnZ#VdMF0_vLBTD;{VE!caaa0$V)pkjIJnojqJ@R{K z#`pmh;~G_!gaa_f56l=BuraRDM#*=8$M}IC;{rm)1&WMobWRcvSTcUV$+$q2aRDmh z0$0Wbw2TXM85aOEE-+?Xz|6QnnsEU(;{tES1>}qi)EO7RGp^A%Nj(5R;|Btb3lJI? zI5aMxXk4JtxB#Safl1>UEtBK}WEwxfXzCaS|3jE91(+S{ih%(%1xP-gQsM%!oSv++iN{4 zfE^S&*xSA2Vu^83rbr_y{Ia=~qb*RH^peT(Ws~bGey*aNQttU^@D*f1?aYWgMPtUx zuu;5X^0d?i&(Bk8EFD$k=l&V)^q)mc!Z!ONN|DZ(D7rL`8y%8JX$k4S5}7RzJTt;t zptB84QHTWrj^hiV>QD5G5{;5C+l&(>;9mKQ&oKCi6v&B+XH=!}3r;==cr1fEA<&Q$poB}vXP;9@OetA z#3Y?+eA7}%{k)r^XoHg~oSL3NRv<7UOG8p@9}( zoAIqnjW@pa#c~}jqhUP+mu3iEZ;6MzRjs~jPFw8+mf0b zH0m-FaCvG<5O9SF*qWMZ;%_s)uGBQ++irY2QqzrZr}1^CW*FZt|BV0($4d7h96ana7LiW69;fvhBNZ0 zT7fg_s9K3L`lwokQ+-se#;G}~*5ZsgsxHKVT-Aaz?xH5z4XkUOuvTnR--mVO*U+d>sBJLy?$D#ri82+U z(|NEVHK7Nk17(R_=s*!BYqoKHC)RWi!7F_j%H${2ZThp=h5i~c_1{zP(7!@f{g3MI z7$>vXICX!lPCXdAKs_8=qaKNERFB7YsV8EC>VvUc)l;!|sgK6qr#>D#qCOG(lsX>! zBHK)`^1ceIiR>6(go{7~e1*Z`%j$YIzK`O5EFZ^u^AmH&RiUp)e$z>C`V(<3dR1K^ zIy4#*@Yk5X5|F+t<uPtHG)@dC{fjFt=L>`7Vm|wx=7-*xT-Zt?>4(? zovYT%rwy)Z7q{6_9ggZmJxDYn&rw3=2<{-n88pbgv$>c#`;go*N-QGDFUD$w)n4ZH zqX?jXXTY^9GA+deeFyq?bn_Azv|N8iw|b+b_|EWtI#q4*;If_ULByHh zK`fc*2_?pZ>vh_x?whdSdhl`1_E?X$AjBnN4pT5h?pyeAV2Dt$`ZRrKTgm53MZ7X8 z+|6krJo4>~$Ymi(5zBxbp<{6fEc)5e0S&9ZOzZ%iboRvL*L_0^H8Mb8jD8Qy4U)r?=c9h>)H`2CVJ>lK9?{e z`*Ij}>;Yd?KUfaGZ?LR?g~RwaA>92lWX5k1{%y80D-^Dv2iC#IAb(>_m9%-2N(nh` zj3Mv|SKm~&K3fUlpAxnYE*ABiV%*x1ao@B?Oi8)+V)0|xXnw+``BPJt74I+4lvSQ7 zt6T+TmHTB$4$=w2rDYZONz;FfUutyFzZw{A^NCNG%fT^KwyCa?t3lZ&sqsbA8ZUon$@trn}_!iWDm_WVD<$no#6HU6jR0DB8M=y!k%BjFqf zugK((i(#ikR&4$lq3SN+@@G3b%VYlum9SJ@>0e6*{vVTVz+-R65KFa&F<<&CoVYkY z@oSNZ#mIeO$xeRaKSd@!pQBKa*k0li(!U>}Di$nEwSg`Hz5HrhwIEXMMf9%_ql;@N zOx4HYQE@DI2Tq{N1Z1&>(7_R1@dK)tA;0m%OyfqUMeBWTs2DE<*qU` z?-j197Jq{SBbbVJY}nesA;p$eKn#r#&&;bHCk4r)(K>9z;)8JJOPh!7e>Ngs)wKg# zx}?dX@z04s;}@2Z!QZ1w=Zq2zc{Iv0?JSHyhDV$a3o8?Sx;hh1ow|r3n?pNDwu{X1 z&K}sp>^nK;R&!&^2}l5jBS9cYWe!i-SUIS5%LwEPx@OpCBDjC@+h2fLFYgGV_?$jt z1u(~XFchvr3Pl&Hbj~F3VO-8Lt35WpH69z*7)Py@kY)+NSmkgv(qks^7%h)#`1uM^ z#i!x=DO9Ny)cN%?`#>U%8cZ3tkQ%N`=R-@(l`719v1~(?ECt1^88lW2p4XT%!llW^ zPpi%9LiZTFBYlitIP&FaK_BCrge!mC^K;mVCK6`%5y3l7Vga@Bhr~OE69`XEfOni? zR;-u|3kzPFFA*3*|4<@%*u%jL3a{l*QfK&k0u12{(;&%Pnp9+#*cfrJ&S?%Gl6!bt z^LM6f)n=LOg3ZNd=lW*|NqoD-0xFB2af?z|Hvk=%d`6WT?1~ppH3lIVLIHPHo=B|; zLWY@;RB@^^2&r&mVjOaJ$lDe$Q&6MUTa7)OFw}Zib%@(3kBzSA&ny!CnK5-q z@yjx#rV^XgrAdU%wit9NA6ewbN1EqU?3Z ztz(!dk7;QVE)h6PIv}PSO_K$BZ;IG-HdqD_6Hm?q%aPI(^)G%nN!hAWhLmp!+#PG1 zS9h9|L+FBSSF|A){^(WPF0o?@@5I6Sz-Bdi;OdSYU3?SXCIO^~RXw|Q zb@p{!&6QQOZBLE3i3hdw7tqB@d&bfsiJ`l8Z~{|zRc zOf0+GOhJ}<=0>m; zu&fph?%U7FVIT-MdUr}-Dn`3HwutF%H16mtk^B{HH9;nRC%V#J=~zHZx;j&SC~_t& z=VD&4y-kOU{x4P6Fg*(;1L?j4gXz9q>He;*^R;I-QW*Z`Qo&J zrOYRcns_Y5dmXjULt?AXLpbYdPxY$-4}qow9+wNuA)sT~7<=|OqBeMll`iq*goxzx zkgH3CQh_tr#+i$+Uo*g}p>NWhTe8Mrhd>++g<}b^2e+aq9%$Ozw|nj!fxA^Rn4JlP z$wifcc){%y?X#+UF1%2D4oE!$2y^ku#4%Mo^_X%hq0bdh z=LKbo?4&P^P^HtS_C2f0u0jHFgc|m&s(8!YR(eY6VYmO4+)YGyeT}J$-TqtH4dpT{ zg3I%Hi*cWk?uk{NL;b8My)C6&V^b2%jh2b#`MrX>h=i$;Gd>@B@0 zS&3$U$*O@3P_inkNflo=Cbj%oHR5Jd*Kl@Sq3p`YPLMVv;kIkDW7_!H%^@@C`r?|@ z@*4~CxiZx6#k67yF|GRYVBl=(5_HJdAOdIXy@e|>5XwM=+-(NTU%&YIe(@zpww}B( zRs6>Mj(KBb1}hl}TZ32VZQ1shBbC2%Nzu|V%f^m-Tum}!_@fraYsc1(L#%XEXYIJE zI5PSA_M(%APkyiV#l-&jqtIr@+K8P3bVX)7jMNoeC<*8y<#3*igz;nod?%Cf&xGsb zT$oOl!EPexCqWR6B-Se0CE&Llk($-G2}Wy;fp>?IT+3UGZd-`Z>;y^?5aAf}XH|kQ z_c@lG6!m`YSViu=|0lG2Q=CJrbe|kwcpbT z2>chBAs1E3^BW6UuMR%ec!R077hIu&sRQ0&(&aSkGTE~?46Hk??fBEDfj9{yBJg{{oTqe$@ z+atFz5iR9-n2`2MX6kw7e`jEm$2BsKUVTMr@!mYdsmd6$&+AAa^R18*13W}LZF|ub& zrwAk|NMM&=B!2UX;h4(Tm>Q9*rw7rI0&D38HIFzQ1Gu{pEYR2m8?Nmo5bFoR$O7nThomTthq|AZ1IP6hX-n zGf&wbmvXHdE}?rBRMJGukyFYrS$aEqc6aqR*;6t`&Z5)$-znylDgaGh;GLo~A+=Re zc{U`yiycuxRt!`b<(^T9v%*`4Z7<0JZJBcAbo)^I)HT@GAEhtOq*&)iprUexC=sJ+ z=ED%mAd{xOzS>T1A?7MfNlwqes-E3eIr>Vmu%vh7pxkoSvf;TS>91Z!_dW+a5BdKa z$e{LA1im+@H#+K|F_KPi39IN0!YX=eggrLX9Dg*0b@X=O8hw*6jH2HE4)s>y6}{6K z7(=ubol5x=-K00B(2#(ZEfJxHGtyW$y0vSsXe&n{oniS;4;WQ)aB}NS$U3RnxxxgVzI^#uiqJ znHTOO=;V>=sO)tjqzmorw1Ayj|Ci8@Te^F9%QeMbI5PLC(`Zf;!gT<}NH#>Q8>VqV z6af8fb%mY&1{Ogd&8XXo+})WVr`Ow7X5l5HB{%2T;;&{#eQQpGf)63ox(y15vw3R6 zg7_Rb3RHgO^c>Xx9RV4mv(E~gP7-x&`GA>|ivB)ldh==G7!-%mXf|<(l{{FDC8pTL z^H-oaB$1UIDJGdMx`;cY#naZv1Y*;!F*ingV-o8Cf?*BgRx@`;k*2hG;tA%a7~C6Y z8zN|lPsEhOAq%(0Y%TDVNh_4&dFE;=F~7v2LJm%%^SlTt{>u2%zA3d)x+hpFL_YOm4z&BB1pAs5nktxyY0XvTa+4-D~7O~$i zrj|>1TgpXZxoL%5Hs&C7E2P#qHLv4Bah^GCwQv&_I-%S`Ek(1EltP}2k%yeTijqbT z`cg+N6Dq1E%N4f&&>tbnWR!ZSGEPG(4hdGdlH2ld+GpI>ID-a3xZ=-hn4>UAb&;+=fsU2*|8S#<$>w7F81*Ce zm^%U%!kWiaInMa^D<_V9`JyA_VS&Jc>{e4pd%hi!sl^CdHkI6@#02Pt70eu(9!vsj zUJq1zCHhLzMe||#t(@q;F-nsd&vTwpF*&|l5Vt6ei2&OqKx#6f>-iQ_8*V!KcNuePo;)}2+Zph z?>t=+(I@ku;*;k})mbVpk{%iYbtp@zk0s8Hk?AJbje-~;lY7_M?rr?3#dt!(SSN*vg~zpsC=d#61(VDl-Xi`bCuhB%OAdq3hp2FpS~ zAeVD%UB8l$A0>%{s)XN&=eOedoxJ_tQGZB+Gx>J`3w0Ar&4#!6W;~8)NI*Hle@VRm z7CZ!5zd`+89{-b6uc<%6t*lNsq6p#7Nic{%D?#1c2@X6w*g#LXT9Z`AlA>}tsS~Keek}iBdxDs6Ei7R8xDdE~6E?+||QeosysmN35+Z(j(Bw08Kzw zxq76yqg*{&+-fPY2K5S#2E({Y{mjv0T|Lg#;~hOg?8p4f)oE8xlx!!t`W#nJmTafE zdaA3Zxq7-}GQ-s<25Q!IuC7l=$H-seW~nNFQo>Am%nEqHZw}gZlOJ+3+nV{iiFVCS z>N$F@tLM3TzN;6w`dmjZOu{&So}=M%>XkY!O6tXWi9D7PqL(>(xuaJk;j-gngR562 zF*Mrf=v9sety7LfyAiuLLi!yn%-qxq&96X)#y)!YUePZwk^3(|@SJ{|4X`=q zN33y$8$cn=j3v)O|BaxQX{yk$2D^4!F7?O*!YNV6v4QOz;6labU!o*)%XKZbFmh?y z%rkat_Ev-8wXt$;Z~pFi=?s$k?D>hV{{AjD$z;z!fD@+`TolWMq>EagUZ2UkB2+1> zp9g-NTm?!ngZp-1M&w6cQj4~Jy*dDqlRUp^4a0osE;Ms}<34PSKWAYQ*C4NOW_72jxoout2P0`V7 zAqV(JjJzY#S#6gLDCZWm8LjpwLyf&9r`PKZzP(OeFJH0i@d5ROr#m$4uOVcZg)>imUL&d$B~FnCf^1o4V2v$Rrehkg zP4DRH6pwwThA43 zuzL^ITV*SkUXmW1#yUOCL+ts*Gq|yE8@N^P_4Gas;YT;1uRyMH^H^<#NypT%0mQpk`gBcVHBL})Yy3+?Tq9S{(^2ZG1XErQyEkYn7Txd^D zp_X`>W_tHveajX|bzyHBmd$px3@b>ha5lU0vJo2BOe~k}=rJ~Z4J3%+-u-<&y@Q#2 z*Lr$TAJD2PoYmT#tY~u&J<@%hkK#{X+cUT)4Odrhn(btJcfWMsPN9#`A9|&yKBGR% zq{{)1K{{D_co9IqI9$}qoT7kyf0?x7v8!+I-o9&@72B`3hIqA_os(}~?EV1!D9#L( zOrUEt1i_ph&nt8=y|)`?voyz$pm# z1FWOp8kBCTlfeWHO{xe{hfZm*rhsa;5~jBP>lrA6fMm(wlpYLQC(|#lNdE{W=k(JP zY*J!_3fqZmyRWmmt1!wBVe;>6X*Q=PLUA|aSba*lJWD$WmiE|uKMWCdGt7M*}LndFjT=onE6)<>Ij)up32a}_hpUj~F zpy8_SURM36o5+^XvC;y}Vq;8hwWN53f}?7t}xpf7`qC=tR2o0 zld*k|%$Jdky0RMfu;>*aduZplZ`xv(TM4$uTc#S|B>v8xecjE*_^pV?j}9haUVLU@ z!c-H1^)OTiO}8DES-6Ql+>e$G6FO;aMB-3qckb!$yH->!8!cr8XkszBAXv*92x147 zhJYo$n?MV5W8l4%A9o7A+|HZO4Z-RmQ7X(|#pveA@MPUVFxWDlwO|S7z$Y0<)szVj z20jI!-w zFsQzZAu0hSd^al5iYW0rXhpl10lSay!&UL0REwkDql-q=o=_9xuR+?2QS<};s4XX= zjK%@lEJRo_jsU^(Ni|~ZA%%p|gw2(rG3KSzt|Rhc(vzwrwPV>~wOD-Th;IPjOz}+? zUk|a_uO44LK87CO zEPN24vtvJphS8#6=%p84C|#5&T3B3FT%CZwU}SZos<^JI_*pe~;!W#sFBXd`)d?ZZ zSg^1%?0pP41`&`6nT+w9c}R)0GQb<5`ENttz&_josQEHwE(3su)4ZqP;Vz<6g16b3 zw@VmA>8fIBU8bw9@qxqzSuX$)ql6iLE*r_`FuMK{86dH-9wnA^<7icULX89-%F0ft zn)sho(or8VCS4SIYW&p^eP`DC%_Z~)^K9OOqCqU%Q}b<4@g?XiS;Q6?EmN#-W?JalEVJ%GR_+@iQ{Bwq-(vbk)^Nr23c%x%%p!7$X?={CwV10q zLSIR{ij)>{_op*W=qE_BV2E=U_=2@CX6Cf5$lDo`cL0NTK^1&ws3PMt6&atY$oR}^ zR^_i|N`0KJijL8peVKIS+#KK*y2ajIpO8|JUYqr*7>~nE4M^1n%5>y zeBPqCxQTg-61COw>cnw%!J^{l)uPR{GldUjakd|=^)^^!=$#Zx#~dKzJYZuvaIl7j zc>^nez?^WHP^nCFE=TFxUCg6Wmht02T8vav)w6^Zk#;;wkJxHi13W*+TY`KC%>MEBUQ%eu2ME%osmCMZQc;ISz{1I8QM{cfM zAsbeG(J_Vi=t|-=nmD7LSF1JyR!vU>SHxN)vFa+<1|OT{GJ`S2e#u=#DIm#)A?wu^bYnlA#c7aRKR#{m-* z?xT}xg!%*wPoJdEj>8f2EU7<5>gU-+Utk+}kz8ITmsi*jKBIcjU)8T(CATl2Z1Rg7 zYyOt)@=E~E-Jc+Gc79i>WND4N!BMXy z&7)P`${83?L3UsgZ44v(e(d=K$EVi1`V`%@FcAz!yB&;qc7W31zUrW_>WlaifGQpt zwPp43d9q1#%69zXgZ`*)l#Iruc0H;V5&A-Lu#(1EN&hc(Zvt3nRp$SnbCvm{y*Py-uK@3-rTeW`TzgFUm@>(m$NU=^PFd$BuLtnYN(iZ)Ld}> zAv0uA;O2O<@;Jcy9RTYvbKydWo(mTS!^}ksE5XB;EU4mosi)1ZqU%ZicJMcWzaIWJ z^CwblNkbKT0R*rxeaLJbW-e11+ZI+HG8@7#GxTNUFtc4>y7cAr@XIWHnGUg~FZKEY z3@NObo%EmBUlrksQKoF=!k{s|uu}c3T9ivJsBVCYpr8BcV>Nxed|}NYGigz6yqsNO zIrTk-0d1^l4DNWJsp40DRfj=95-7wo^4p6wskJo&&pI5AFYy6XFc?A~a9+6s1`!AD%0 z@O!o9d5#s|0uTQaZ@&W(`(5bve`djakHPppmYhGJlpj&fzfjVT0qj44*8BmG^WT7& z{{f-&pU@aT1GT)!KBkhZJbRucTB%1Bm#2h;=G2fn&SY#(8Hrt7b%k8AZ6?SUkDmyLlR@;*J zfSsN=XlFTi@&lmuTSM3pFzqcNEwLBua0pnGw*632f;P2wkLfg@hYqQ+7ek$h=BQ3o zFnYSHNhHZ}H;}73u_XU)k$d+X@AiW%eY&fFfp@d;ss&ymNX4CS2dB-%Ve|Lk_k?Ln z^aK0uVEb-N>;eMb0(dcNHwE0A$&U}fs1m@F;9I#PH`7v4}f>@)r0|!j^gNKBH zZZQ*~V*>M)$uF7l(79iENeYi&wVQ!^Rm4*y(9ZfSWn@Z)DX= z`uc#y(cLpTa}1gIN0Xc4US=SSnubt>d-{6O(>Hh;p>H(edGk#VThTi4p%u@0!u0A` z+4tZY-5oVof#&;M^eedcC~q=f)3a-*nc`|x_`y0N58r4Qysr-Fh+keJuT%+OVD_rb2sq>oFV#V zVrg~vm*^mk%|ZtgFQr|t&u7dx_4}=iA!5$AGv+%={9P4C zkR0OUd_N0V`=KsB(&fjx{3N3|IRBb4|E6@(*$U9^F+YVr*Snz`DVMZ(DlnYidjOtY zjpyj}^v#y&7hX_eFS49aV9ne0{Rlt&w1}^?1CwuZ7y8Drs z(jXXTrAswhqp)aU(C&9!FIg#-G2PmAp!Z4*WzR%ddcJFpwH6C+U%5kx6set~aV$v~ zyFIyG#`FyX8`0BC!4la9sClRz(#$wfQ&FaX=^gbgMcJr3{1;^)&G1bq)q6QnkrTt5 znwfn)*E3?7J>B~|VN!M?I3F}OYP2p5*{XK;^mcdlhyEwV49L=6_)O}6p7!@B3LOeR zQgV{pijDg_B{it%-O3uh`Z!ulafKT7cc81LEJcl*%oapx5Q37qzaOwFh?Z4wn<-2=^SW>uCR_Z+V~h zps>H&yO>0brpb<2wN8#AKC~;it~ZuGOc}1KLPBj{w3(T!B4v+}Wp|L%fX;C&>dJA} zS)b#8h?d4Wvz{hI8$Jdbl=9a(sIU&qfTHh$Cw*cIj=s9ijjkZzGh49mYn<5u&3J%o4Uhdvi(i z90lQc5wKkJR?j_sJ9lCv;B!gFgI@HyB+66ePwiJ zBEYcOkvcRhzFUxSl~xs{58*@vc+1F>OH$f_x&l#(2q*#1TjC{6<8H4e&3;$au9dnG?$xuSSJN zsVJ?SLREtdF$=3V6csYOqQ|`jcw;1PELttX&49YK(D9C#LWFvJOI@io(|F$)<+iAXr=oQ{uFUYo63|mAdpLqc z+QN<+kpU_6h+5`8ge_|*=iQhB(mQt_*tg5qy{e~w-~M$D_W1(Z(U6Ls8z``KxAXE* zg#L%~eiP2WO22U4_qKm)IS39Dp60MMOh}vGdf{b$6T;;D2F8NHHgmm@r>~Pk4D}UG z^olQxglu$@Eu#lMk6@&bXDFXtM}AtDN)*cCV~UInmZWP4>EnD03*X zDsioo2+$<6#s3A;k`#B9h>U8GvJSd zK&u?LmK*NWE6(@asb2{=sp=zqfKzmc-Nre!Q-{^ z<{60~4vz7CJj`1nsl{H_+={)?C*2K!909q8oD!=`yrMN`G&uvE-l zcCqeGvG9o|EDD-}!)9Xrq=N(mw-fX*`8hK$Ud5EC3dD)kF10!_EnoPdV;^_f7G;_; zCzTb)RAIXg9qT=DO?0}tDf2kY4@4V&)@Fv!ce@BUw0V|Z%(iAxWmBc^r0LL|>*Sn8 z*?28;RbCb$7{B$BeCgrT+S;Q=BCh%c;hTlg8$X1Hj@@_Y&!24>Et$>fGzqy)Q^m8U zstLaFqUX$ncn$eUIg_%&W#-Z`+9Y4RAk!2))sWe?pt5YPCFE+TjQTn(xggt+CBsL| zxlKVsc6Q|*cbP@;jQI&d7E|4jrC?3a+3JVVA2mz!&A2rSANWyahRv^~pK_a(Nb}sc zv8=tha}A7_5zgfKd^4UccMf1=gAwT1%r@A9?Drzm$5!2IwwbHVcBH!9upf7tuOT7+ zj@f0?xZcZ{EA0@hkcOE(b}2ST%V8K@XRflZCzQvV&3^lFbHM(>TxWkxIFA=NV*S~? zHc@46PPCX?2-)%a#5{9r;tcbKM5}pYqTAe_*lXUDxZb=O!{XZ$N6cFjPr=g?;P?p4 z&X2QY@%ab8>|L~~hxS!c_YcjLNZ4V>*cQaJy@0<@(F%R7fJwQI9;_FTN<1Bb8t!lg z$RO`Bt)d=j?KO+djqX^~AgAl$Ek!PSbqwTWZ zWN7(K=4S3H%`LPOa1yrZb+kz!>@G9xMc8|@oc#9n%dPCWkHHJ90Hy`zRv_Bz`MXUp z?hS!?Bi|6vm3)I^=f07-J}|exXif>tn-;ui76s z38^YBh1d8o(OHHQ(m60$={R(~hjzA+XW@x^W_YlaN}pA_`cOp~TEC1{#>x+O=orLC zex1!aWUh>7KpH5q{EBFQxgE!gmC*~oW6ES%bz77q%CkEECfsJU)8iknyzm|-_)Zr0 zdoho^3rzDqmca)Jv-ilzTcOw*DPnnvqoJnPtGSYMH|FYZ? zI!XF5Vi9;xd1uF4Eim9l1`%fn2FiYJ%YQB)BX2bSG0^29c)Itw=6WO3v-8b8J8Z5+ z3iPh9AsfSnjEdKEE)@W>gt5zDya(axJ`}3}Pqs)n^=}j${dZHa)oCcKV1au!L^W_g z+b4BGPKp zQvR|)$o5LW4NN3oAdRs!MPBwmJ8uc=7NmboG}+x0xxkH3|*7eP^bW0 zbzN$%vEDb)&xq3PFp>VAaX!ZJ!D!jA*atVGklA zdkBVL9ep&ub$_dd1|E*@qHkI$2N~ZH$V|Eev%q<8&gOYmFjFrtVXD=}hB{=W5x%43 zw4XE0W>-#_DB^kz?0rtiD{@jBn7ug=6N5iEldQ&f!S_*0_WR6!U9dpG32vc(`h)_6 z^L}+5xY}f+NfFbh9)Gz-gNMb0Tx5aU7y`vty_rF9F0=dYdAt(zfaj<;0+b zaaUQ*rQCzkwOE#M;<<=}O*HGpomR`OzKBEV_%QiN8vMwfw?6gfNrg2Emy74uF`q`QAYPr${TUEd&fU!LhP z>9|8Nk)5>0xtt5~cO`O#N*CvR-P-moaJr5^uu*B+(yUr*R)rjw!Infm0}hA_MbnZ} z(1a{RkPn`&<5&RMBIm^36krrK7i|#-LA4bDwj`Wqh+!X|KOJ7ydwrBoYYbs!QE5ETF!65qEvkb z4Ucr?!ivg;nPH}KVRl?&_Nb{^m}{&UhaT~JA2zusOf_fpntJejZDR&~W5w>NZA6!c zAU{xM1R~6*A&yTiN5s1NMkV1~5+;!{?eNBoGL2YN(dByVrfyxSGb%QrH=6mU4+F@ z>GFpapd-gWoLHEP1GBW{PjE3>NvS|i%UDs%xlh35xPf0$NQ4=HvMh1xG4HJJBqmib zT>Q-@;h;cvLuYSS-=5YTvL=y4riAX244GG>vepEDi7BR`;v$KamkTneUs0xuVrLM$X@VR_DJ;O(OQZ;El1P*ishyXDt#BcxPA9#T%MuPTqp%qA&!e`sb+NaD zaq%Y9l?bZ$sILu#Ru5RvKY;;O2v-5;G6-%s zuRVfmhFRnd7-U=H{q|RKdK5oanZHCjpp{}6dk6Urt>Ggd26KCT@R`h-%4O4MBxitJ zGFuj;KWK8}8`8IRE<1GW=MS68h;<7-s>acrKgHI1?4dUJlfHb*`B(s>z#`MYBJ;SO z2L@5wq%b9yg=0u9-tp-`_h!1*1cV~F+)8E&qXIKEFw;_S zYA}!DtswSvV4&je_&y$`2K8}fQXE_CEG7~Fydkv>U+`U^)&=Q?^ao(Eib>m$-nJlh z=-BrfQr;n-I^os5Wmhr_e$i|iJ%`55rIGV##;H_#n(K&EibtTlHH${7OEXE^%&+d| zP>OYTbNQNZck{SYz_=FICHan$bSzP%@E@t^c*;k0J??njxo2Jf zvQFI92$>8}1grNd7EDMiRVK=*qj;I>RhIhZBGpyqOE^wyF9)Z=r6_YYQT76ZJ!z4) z%CM3#jpMKZ{%0AFLW6{`R-oB6NUME2R(0;cNyv3MMODa|)rzLpCO4bQb7J`9#P9)H zlqtfGyVH;%lvEBjIXW{Aw=I(b%>}}3pxFW9{Xv#W5ps!i2?pz5q)Jd$m|sphFL9*? zCQ^bc=k+)oJD-H;}JK$mfz`aD+7Nz7Q(p%Zaq&Y=aq+qmjl;oD9WK%kHB0N=h zS!?7)7_pXwRKm6(Ta1({9ydc0=FqX{n^KP>Ycb?S-YWv3fVdPfVLok;o8Z$q7MuZ% zx0sc`gcHnJuD!BTS_m~D3@rb*vmFK&3cDnv7<4CGEEIMLxL8=ZlC3lm)Rm;{R#4d# z`X;lmI$`DUpya@`1ZMi5z=z&NbHdCV9C?*vC_ANw;w=At`^}%2M$7a!naWC+uFKN8 zZ%0p$U%e$Liz89B+|Y7zt>h>;Q{q4awkgb}a9Fzymv9aV{MGa3N)g^Ypet5erh}&?cxr7L@|76-xKwGx2Utg9uy@gP012s!|n)NNpd> zA8UYC>7=sJz2mD&85IQOwz~s>YP5N-RTP)xR@SgC>}pE}5Jmuv2! zV~5mK52t5IV+HCag=N(+2%HHB^=Coj%*PGD>CiYUI30CB=4?SQehJV!IyDU=&neL0 zk^oC;6xgCShVz{=0dwp#Sz^)<=II*S7}(+Pu`Cgrufa_#MAt~&jlw%24#55EF?u6U zt${^3cYGG>C>*?=qTdO+Ow?r(@Y_xf>=c!Ozt(H)G+pr6dX2@g`1QUzyoz6Aanm}> z&Q_swbeXHidAgggyHf)TWS?Lg^ngd!YwSYZovsTflxy(H$_4j{i!*Y|I-SbwSat3g)meO3BBQ*uycfuC?m|yFOzPNY>a58M`rS zme{FUY5Ir1*p7_d6h6u=?gdJ>*}ae(+KlDMb&Z8Pc#XXXFLoJ=+;W|rnz5H=?PYdr z#%|MZXU1+1><-;_Wo);q-Kopv%C}3G9$l_bYp>L0w=R41u2*+`y6n~EDqZ?@*{92X zjlls;-6S&)pUIp9iP`^O^up!L&n~iu{UMxYcuxdjJ+kWugl7dRV7}m z<_7i+@UOySh?6EB2c_2dbRtxbmXP+ zNRk>BGCAD)mpgVv=^U!BZg1=8XkWQ?<=Pc(tsF)|`;sU#fjIryYwf1?_9z^a z0>W+zLp8w}EOy~bW8C+R=d9a+_I}1aw5{cKh;EfF#6%)4k}RGK61IuBdjdzJu}|Qh zeR2Z>`zTL$)EDRuNB6&i=x8s?ENBq2BnB@aOG2*cfP-!zLd4BX$r04Pj@=KGV9kX6 ziE{v5pPVGyua@J{T2btAj`Hz!BBI9=Nj1o$Tu_o|u7^14s33Ww`QAPxM(S1O)99-U z^onhdXetHd!jYuO=2JjLMZsXxT6;W)%s$!>Tg3(LC?i(oH2=LQIj~Dv9Im`J8KOkq zkG(n7ioOFZ0X1WVI%PR%`__3^Nh$PUdF`7MI{QjZ-RP2TjNXUtno?6&x%aEsxxV>* zeRvN+q_9L z!DQj`Fsgl1*bm>&O>R))4E;QX9zdMy=va<~%{eJM%FsSRZ9nN$)xLH8tGaPRm7gUj zxJ>lXEgELnJ5SDD+1qzbZ|nY*eF!mFO@b~;8I4YP)ov-0DRMAuD7xR#-H(4<>7r|Rw3c|qGIG84 ztB4m8wJ1+G_Pk;FxHsYI;SCF?%2gDt8}~h&L03aGb*^kbbJ3Y)O#Z;N@w(m}t2#jj zMRthEojR5kWJLmRaf%!?J{(-ddVLq~fU*CF{vb&z)Dp?A!sM~GI$akjx?ufxBFnY`+&y=& z+khpJ9JdufYgAhdo#c(&YBfd8a+kSNHn1|VdW-!lUEZ3rZ&P#cux}qAl)J-xnGfdO zIa_N!hM|@@BxRg8%G2+CK+K%|Yx|B+N9T4z*5QueT{)BmU!Svg$Pm50-F5y8l^XDSROWy1Qw6eAG3$h+$fx! z!%npJUw%L=yqKu4b}hZz--FX)=k~UFs;1;V_{r1oYs#2)p)l2)_tC7*s?)x^vjF4X zW$aXHo2Hbz(U0ra&Gv3LGMMtpGwK21W|B`hZlZm1mpMxf_&9>&<0i#iX;uys^2c&$ zWPg_k*k!p`;SycBZdI(u)$64wv;RPUcQYUG;~dSTCh0^I>1Lam`~+ThRWH_&Wb#wS z8`j+EQE>(Qb#jGbK^pNwgesj8WPHQgPpbGjSUx?wMVL;V7S(&deIRH4#eOPh2wjph zKQceg;U(dFIs0iI?H%^PoPCH3jzB({vkz;zKcWwh%B1iyEGX?^j9l#zj7{xP;Ea9T z{!L(?$l1@}=-P~m8dU~y8g^#U(sxFk5icwh!&dA;jq1#12!@>i1L@FB z29*FNS!H_DJXKc#eFrG=J)Jffmnyc`0{c|XK5c#&*v}TRy(1xmXIVwZi3m~0Mcpo( zL3y)38Mt|B_!TR${RIYqFU!&|BX`X5wJMA@sJ2%cBWzJ&Q4rN=T>LRBre~&==m!hr zmfqd7N3l$!m>e$5AdfqsV<{}}IoFlubU4VAbp9AdK*xJ(AgU@~>L47z3i5g4lbeWk z8UY2V%t_+Dn8fye}`XEIqRY-S@fNCEk)rmQeCmpHs1m>A1P=G9O zV+-2FP>=cT!^v3S7Y;PkhdU6Ch^qp|ur<>~M2NDWG`7{shY!x|=-k`6qelT$hZQfp zXeDI!5_8NO!>4xc?m_oaaoGGEa}&+6Hk+SFg<%V4OSj>aAlQTXhy#%7Q1KYE%z%Iv3iesF~9X9YWN+AZ>Kl8U$D9Rm3vZ)wTjX% z%irnimn95sWC~t$Gx*aa<4$@vu>TX!fJCUmG!ji&!#yy)< zcVVX@4$URbrxG{Z$&;j)rG1D#Cd@(JHcBUPiY$sgjF$_(4n@@dQArN(z~)7E9vEcM z0+m%mw;I%~Mr;p8p5F z{;V5YMr1^xWY4vK4fWr^2;AsO_p*R&zI25MyMeM)=ApsLY$`4DHp+YhWxjEcGPU}A znfHZdu6FH4(nvc;w$#>2kTHt;(S@QT50fbrH{}RHUM4jlUNl=5Hd&5MOABpisl}7< zn8%!L>ez>6soA`_P_Q3|chlbYz^j+H+^Eooe4&uyVM}+@H;w3&ht2rAO`|M-Fa|y4 z9z|E3z}lPmbc=sADTy`GWL4uAoUi5{nELm^djD8#Xr|#>gJZz5i_mOAwN=|LRt3H2#+3Q89o%NZFs)6;e3CP!c|GsJ;fVU z_kxyD?>KB)3WfT0_$bok$6|#A`N9G!QPZu6ey&>Et>IWzwoFe>e<~aeZ<^$bdy+Oj z6)UbXUtA?>#%~OZdn_#OA&L{{d@dbNI6sNgx71@cJ@aW^q^FNY;~DF>26+Ul-qKP( z=ZKlx#K`#FUxzenEOKx^8D5L+86+ov%Mg8@Z(rc+v+SW0+M(!#NR!%^z(3=51~X%FN%_7@M!txNk6j z&&S3nK7W4`4*3%(Wcwk%kPZr*NJhoF^osniyi`s9AV%2qPruvt)kRxt6zBTXI0;YOU&2vm5GSzO8IT_w-5 zn0zJIhr4QAd{#!?6&jBhZDGGY-4?b1GJp&=tCeP~&BiJlm!F(*OwQ}6=R5Vp5995(>SQG**?*Ps{xu~QkLX|a)s0}x-OHDAdu zsHZ}B)HUk;awNPYPcC4}T?ZsRyB^zZ*<~Cttxu1-ZJ1ex7tx}GE24xe3ki$n^sr%d zM&Q`brBgPwa~Qh0W}=;MX4+HD8oR)3vJ1^+_H?tuo)POoSANjCu!zuVJ;-2zb0$vZ z{%d(?^0ND~YS6x5FdKEcq%VM`Xs5;dvXs8G(wF7*Wd(h~+pk?sU(TT~ZG-kDLTpiA zzMcmsPqT0Yw7SPtVp&r(;F=i#OIv(q#tk#)mg|g5*IvFe9ympCHr|=_rox_YCfki> zmhC|A@B(vz-E6kn3vo%bCDxhl{KRxKF@ja$#7v&T{Wk_hdTUB>sO@IW?u->2U$f7L zNDodDg$jqFN#-=2=cDNy*KuAe9q0F(x+ly!aNT-v-4S#C)1kUED$yT4_I&B?y$Uh! zK2vY^vvUuaN%k6?JX}YJ?(1D+r0ZM{$^K1tuVBRde1GSIe}s$m?pqg%G8;IA_5$em$F&Wv~Df@tiYF`Ms#>VDMVmE*#@qsaAPCm?5Iose}{L_hh7xQ|YJ zoKD=2HpK&U;8XckJtNj!`2l!8O;vNzBCi|1)Gqangfkd6^360-5MYAn=}}L86eS#f z*Wi_96!r>4`~W(y;fk%hciOI_k#7V}U*HVZ*{9GSd4?77IoF653KYeyl`CvBA-@_X zxS2P@ZcDfrY>0my05r3ajXTWG?%XBA;a6tHqR_{$D`P9;OOFcy7W!lQ~VQ~_1hRh ze8-Hk|D5lZw5j}v>h3=r{#RHCZAj^fRk37lqU-8bP8%|Z@j(sVN%;!PHEi5ph0EgX zqI1mFLC!I2m=1aNfu!7e*ldfA9-ZzO<)NvcjUTd}e*`rBu{q8D#GGaSCBGyJ>sEII z&N;A(!PQh$X@ zY+q_&06@MaO})Hi0HE>Gi40z(D`QP93;-S*2NXJRRCj%7gg2}kiDX>fd!TPj5HyL{I>!UD&NhH_m`I_lW1yl4@` z#=z0ZiAgkfG6OrsG$y9TDjS=hvft-dSD}VzaH#>Bt*D0BGV?Xep@zBCFpnDMm#yIs z`9)EvAsT6FfRZYzA+|Vt4QEorVrp1I4QG|D0og`4moJ3SQc*6zO*#*!pE1e1oFZlV zu<6l@&zfXAB>okL&6R}T(FW$ro~4%qh|GIb8jlcvvMs)rc+W;4aK;Km0-A~tCR z?H5QZHL(hJJ8h;eajqGWIL|aE)|e@Y4W=cr)=W=yn9~v$n8k@L=Iq2~vovv`S(CWP z^+JGHE~)Rr8>Y&yQoMQkv6M1(veu?t8(S2kO~o;qpc71hi6r%e{lY(KrK8~t)2O- z89Jl>fJ-D@`^}8djQXqHGbe!pcy0lCnFP$j1kA$3Rx=^7jm~$PC5i2(HL=5-ljt(% zCw8KSSzs1QVKV~Nm(o+6fhuv{YOS~|OH8v(=0WvBb$m?7EF?}m>au}NtFxYe=w2mw z1tcG_oXd*_H=zH?7Gop^;w$=Ag0B)+#g;b8SRJK4Qi{Y_5C6j7xncvn84Ac*HC!sS6H39qQ4;&1y%g zfDNjbY8}WRHerVq6qk3RxP151t=}3~X^j5PAVGPd5TeE_mlGDVA2p!vF3DKdD@bs6 zzf|u_3`cfnsd`10)5S{M5n)pgZE99z%sKi++c#y-&6xA_i>`0dtjU&P@9yf5Wf4biogf59x_~tC`AJOlU ziVVi?r)u4*RU21!Y+cj3@jP<1u2`{Q<;IQSqio^poZ4vny5;9>4L>42(mS6KV&hft zaCF)r(zoLdG;%K7rtcv*B2wSL|Ms)1ge~zDRyKm><$4oh{L&n&65We2q#zm@}AO?gI-Owt1ZfbuYpNjQ|DYe>DpRhKyx5W42CY(!>+*eM^?`FO4q5e;t}vFmSSSeWs!1{0}$gCE+e5vhME7ogRB^(4$3Nv9qrqy(DYS zD5FXl_hmMy`{*+fL5~K=iqanmX)_iyG>#{cfg|}=c&_336wc_;_c}Nq6HA^a6{QbI zD+5JTtthd8r}GYhrt#V#c`B9vmQ%M*>yd=pSzbmXkD&3D{w(#iYBiVIoQ zTuCUYbV^Tzl;Y|ApvL=2<9<^jC6f3&2-y(OxC&I+NU0NH*33X2q*^_NBKFS&o~VOw z6BvNG+*g=Xrn)+yE%RWk`L^6jOK_}bCXPL75(`t!x>hu%8Y}QZTHTn+c5)YC*g^}u zXz_GPJcE7`yoM55T%RW9YgVgNa|OeADt9STj=)}P0&mnBaNJ8~Y$}yp3TVTIYoTuu zM62h`9vtmBv&k^jPP!he)c{^brXJs^_&3estoUg+a`0~psW5B}U>a1%Q;n{#xkp^y zLMnV4`LdAP=gS&q>O7aXkPe?pzO;C{+S=fTDgTq!s&OwWxNE|B)W)M`lqWq4b?k`MF~hXFI^+>a8*_Ov)%Eeu zfA@<0P&WEoNrICBwJ{yRi9)22(mOURB^1~hl?(>fUN9B|1=XC1t&zM<)R@^BGepD| zc3vqnH)DqCcV5N})9?JioQhJa5rxSqIM%8`J%GUOdbGB@4Z{64t)n2(`<*Jp-JK8Q-2?;dug4Xs;D>pK< z7rzR1RyciFI zKp0BT5)#a7w-qaa6213rJIgDFWxe<@;PM4Nb^HkZl#B|y>#)@8vvB<#iG%vR+ zXR#KFH08$)J`SPce1jHxV-CP8XJFQx{TFU2nNpuFQ|j^IWr(TIVHnDV=!-?>%IdSz zj_m7Ypo=X}LL6?*?3dXdYfg)=61UCD`Ee>4`!kmc5XvW9YH1U)f_h{4rP=P6mU9Lg z35&i_DFC3u!Bz4fB-cHlB>rU|HukVdz~vHrL+y^M!}s<<(tH05N`D$qO*yJCs%^n- z&}U7`1H^a+nJ0UgT?P1$Xq53}RS|PREJ=O?Y zTj+`YwaP(6eULn2GLOjL5)WCpojjmI#6vFa9;z#zhClXzRWo<2IE+hqB8gWO4Dh6 zpvw<+`H?O^*5xO<{EIIC8Yos;rBC|rdh;Jygc3g`Vwhn5fBA?|S(^TfEONYGD($bb zB>Qz%k%v?ZmrnCrU49ps-)EWhKj`v;E`QYJPg$6YFJ=`qD3J9nV=&&@tWDUYE-6Z~ zY4Y2Ozy?{y>HBC{@M|k|$?6S7{Ew~BrK-}x%~8G@DtAG7GPW*j=2Ifi^(tqmnnnGc zc9>jvQD3KwoE!B!96M+g+Z5Q5S+i8RI_)T3MhA9G#u9OFz8yz5ZL?mES2usB@_v^k z@MTpc()0;|otTl0^cp)^7uvoCQ)xTZPSa44{`e@rR(m)PEl5%16ep(hJ(+` z`vp0wW89eI7^x15lgnew{kvq$HMjg=yG|AO3^9yM!z=cMGg;1U(O?F=F%Ki0E<>m< z(6MPly9V}uszk?n+gH&NIy<)uK z1;w?=LG)sxp$fg@O8n4<^h9K7=*fW4;=|eIk~nWP>dhXBfmezUS)-_?GgOK_n8mWH zd;gxj>t!XE+P++dxv4IPMgwO)ww%QkIrSs?j=sIuMT>BtKb4xk{+`P*1Kk}ZN$q1} zsGH7uH;Gz0%UKLG&&G^ae*J;ofiGEtI~}dVpomjd#JZyI;)R8;-HPzl@HV^s^6Pg- zMOXFg!*Hs{aZF{X;jy(0!eaYdCa>N#W+1*xeVE4;8@af01FZRx@lsf!XTC+9Z4%qVLf?L1=RO~dawo0w zUfe7CJJrOv&2Fh5RBU!92KJ1=E($F3R?YJ6+ygpTc@->Irh;K{1IF^nMBf;sm~lL< zkK3i5nA*MpQ%&^uVHxfU`Gq-zn^)!(pd?2`66fc=7dybgDWE)F$f1D0FGn1O1Go^$ z*(JEi80crt%|`^-G$0<=<&c`(ig{DnYNF(R^qp~x7q4ByUX?j_KF;lba&_M9!t#4 zKD#$(uTn)X|EO75eFe1immi^{Rb31P!JBbgttgROQ60Pb`>ye9i{m>PtKHvMx~oqu z!1N;Inn$@&hWOXPAXEelJRlHmcla|6;m{3@64|>JT#&@X6ET58IY(x3i9i@np|Z2T zzw|X<8*V&8?m=4&Wk;`Edj=DEyfV>^d?h$cpQrx^6Vd$zLY^qNL5vYqkO7@k zyZxNtWDf+^yI&;T$~EgdwrpK}QQP{6UpTk`vwBZw|CJjL?A?nAx_tiNdA%Q^>jcuL zqFJE5`V- zN<|Acnt|>zE;i#4lYI=07Cz@>&`}-b@*K6-Qk>H?L(U89AMOttcgV(uA{`rn%xVn0 zs#8cY1=-X*0?{qRKJ#q;TVa->=@QA>R+?MT{?WgcXvSVnbJgryX{?(4041y0ZLhT1 zp|07Gu&>0&)5sQ@zUm~Kz8V45IsA8Stm$p}rng~+`vw{=qg(XAm~D09cCPA#jPTTn z^{>1WwTSWRq%>E5#0(v*FYPDUmo@Z)zy$nvGp+I>&-MAftjC1-&9q!ScuUxWkAb<`cQ7I4H*9mPO{CL5w2Z`@M}w~&CBv_UWR=~k886J%%@Q=*dn1?hdO!~%T!bE zjTt-P_HK_Ar$B^$C01e={nxHIsPS+m?&Vi}>FH=8rk^!K_>p7HH2x(6Mx{ab&q*5X zUg~R?7x=0|r)$kgW+(@l;q2?N?CfUt^UZwoeC+9AcVirL7e#k&fUH5>>59qp>fShdN^W;NWt)DI0Zx90pgDtQT#{m_H-AAzLq%=&pvk0`95UlE)~mWTbxijSysy^#vko2m(yeJi zk3OqX8d4v@q?*!IgnN-bjG}NuO7J;q75R_7MTriZu@aB?(R>4d$6(i+#-_It1E(rZ zLqpNo9gm60R4iLtIHAliPXMbG59mo`=TDiXSar2y#JLfxyG@)dE;OIRI{xpluKzqJ z>scZjKF4@{frb0`EZQ%Eg1!Xe`A62tm)Rp<;SBLLbQr&mE&KE4!{%Gq$^VlZcX_mK z2ll@Yq*Os|S7KAr%jli~+WP=^VuIfv&UG3!%6IS%GL^OWLCQ_g&YLOouj!e##5hy+ zqN%bCFJa7RU&2BH6N$05stOClaeqYpv1BnG4A;mXs3su$+A$bTeh}ox_{k3IZc~NH z)j@M=;{GuWX<`8{aC=#!jc?hCqo&y{*@g-&SzgGeY(*FI^d#A0``V+w|D=&WrJkRm zBK=>8ll~j@_Y3gv|A78}15*4guYf`8$D8PA@;RAx zjo(s#$`Lc+>2XKR#ARG2EpYLZ$D_0|j6?uBg(*!xwV>jVkuhv?JXYZ?{+&!pa*q?QK~oXsGM%F4MZ0lZeC}b%+dVkP2R-*qS_~cDt#;}&hvXsZW#(Oj{ zGY0+8m(Pt|S`4Y~ha&Ps#daoMO_)Mm5h4;Y23^y31I$~`csdX)1Gdr#plO@+WOCA+HpEiTYuCnTtcGLN7vRLG&K;NXGB)l1#IdK zuNJdbmataN#yWB-Yo!$n$z^65My@wgQ?swnk(3}Kp8Zam1pa-5c~7`qgL4sPo8UE% z+NJS<&Weo`c6=XcHPC0ZBi{Aw;VJrEfw>Fo9;5FwA5zj*Ru4R zT55CiYnL4~wJo*P^J|wE+t?IFY;|nJWIiIw-{bzoVw#c=Q_v5dy_!Xu;`8U2&eU_z zwQLN6Zr3Wi!+t zHaW#)Pd#-{@utO^cRD&_XNQ}XlsMLQdF#ixYR9-@mu{)2*jDFBBZbI)S-Ga*C?-?b z?=GmF-M}1fG(+qrR^kO_oV^euuQLtXs1gD(tA6|2J@K zd7L|sVCqc8kQYshxfzIJdH2%1Xfe(S(9x_ zJ;kuJj3FFh>X12QQThopKMw|1GNSms(1quWibhB;HmZ+T79iqZC?XSyn#SrH@f}{7PdgreFiiy zRJ$b)3%7vuJxeo)FMAh!IZX||qGSFJ|I0Z2E5*4vKh+p^2*rEY}!x|3A?WET7 zoJ>z3NNePUgia2#L?kH-2UwiMK#&4M5^P^i<(Ass4Qar22F2 z$@S+h`g1q^c_00GKmGXt{rM360ixLt57Hl<&R?beBp@uGW1Z`qrl11C4Gq&rJGeT1 zbZVQssm)w_a|umv?{#hSz`Y^AJR0&N+z^g%LTvc3f<0jcv&&U5eRMjkt@hfRr;n}( zA4UwU`V+CLXXmS)ov(U!SaqfI-{J6H;#8JG6@B{+DDAwZ<2*g^eiJ-w+8=zvtikSl z?GdwX?M(lr`>-i*5b>%>3N_dN6l2;L2F2O%AO?EVg|1C^Y`xfYP5Jru=8n zzI)Ov!)$ytw$^LyX90E3;KSl?Ap<{WdhOqtYwhRFjrLjdHv0wh4*L&?fWBxxZogz6 zvHxg3YrkwhPrfhNubQv%`)$(xzDaL}HFL-=vpc57EkelX=k$O}%6m1?C$7(wFFs z9pN6Iw|_J`zZ_$QBm?u!6e(mr`K=;2hF~UK#_yzR0hZ<{gx(0wg!892q(*O>{~<9R zIBXs|_MfRz2>V^O`9DKXe~+#HT?X`ruEScH3LB)(rBtfJy4sXkp%~hmQs3kPOc5)Wdzcd|a1L=<>GEmS@}S;5 zqW*evNPnYmPbk%A)TAf%_++IVHtF4Gb$Lbw{cRRB z_IH(RpJxN}T*iDsJ^cGDj8(eQZvG*w1*?=Ia^r4K&%5dbrXI zH_z+xO=bR;YWXK!zOBo5bos6>{~Va_W${VygTVX{VQ*LW&dvk7_b(6iTTlyc@4i|= z=cU<&eo0sN4$PhgQEDngCP9OsNU6h%&7gEIUWP~jRo6{1Z5c_tC4nhOW~1a8nj;ky z6nI8>Nr_uLXpGHX5q_bjhF+p2d3_w(8+}l7`*%opBUFgXXI;Kw`TTk08%&j|x{Lzb zkbOvNc6aB6^GGhrMt_j{(@4a7w4(ethC;xU0=S?a(~j;Ep6|DJ_lKHMWtGYDLsOWK zQjMyS$lV65)GJ}-6}1PG_=S4f^9Gq-Nz0>w?(T|jSq3xjf_)Gz@kk{tbS~~>T!Si% zmxj)8a>^+M*=$kWdD*N4^{(9GM-4;cEs`A{ryQzeXRs-NCIwk-B>RfOM-*w@6$H6C zsqx@K)%oZ~FUD!fwDop%U&}zT`ok5U4x@m1Ex1T0E(~8Wn7&w-U-+S9a7b8FG%x6x z6}FLA{;4Te7b1o8OTC(16c$o3wXMxrP1eSB5q$0>n}|ja;(Wf@l@L{4yeOPb{aqeix7p)DQ0fkqpxp*pdoG%Btq~WK zQUNK6PI&?L{-NL3JbZ{Ci1Pkhj>8o3n7wjCK8XV%IhhUT;GbTa!$s*5l-*e`C1%4*hvmUS2Zn{y!7?UBZZlXT}D%R0C8upo1AAb%d< znHz%Sm-6b4atEGDoRj;&{7(*sWJeB;o@Ir*I6p)L3HJ{np%!E2i?p zKRE0PY;6u!BP|-txAgyS#;ED3Z7zaKDL8a5j~8l3N*Jx%_x0^Qu)lkK=l)%21cQ@2 zw9^jo?#cf@)G>Kk5j0*k1&*S~KNUUu)b&Um_vPz1l~Dmbp*`FG8#PLuQ@K!1C+!v-IbA!a0f~eODhE?ep1nZ|?w6p+ z{3e8>+%ss({emytFF48lf`Ir<2nV@e(2#o%Cc;K*gfIxtbuj&QAltL<;C2N^Kpps6 zM!wHfj;yV8Twn{&GJ)tOSq~>7JrZ}`81rK3^z=xqpgbdYrz=^<$3?XGOis;9kRG4q z_(Wcw(So#3?G+~sCS7(U^-A5v*E`zP$`{0yI<{I)+mZCPl_&6an6j0_s-zDHdr6C4 ziW(qInn;+xgTs24tJv!^RC03dwI8CTyZ4LmDp$93WD{(!c7C>IU~(N8qK_4-reh zRvh-amU`qShV!f=!wC(~7);7ZlxsX%*7Uug>l##CI%WGI$ zH?Xp9jP-7NzIWT*TGaa59_!tKuy;~g5&I9<@H5=hjxV%Ar(J^t@$tf(!sZS$=ztp|c$1Y?9(-h2AZ}g%ebrgXb0xa$j zyw??ixw;aEjKRx8RFcvwAL=(5=6Cw$L&xq_NBqFgW6>Hk)<+`x9*gXE7V@7Z$a~L0 zhPwtS?gn!|(Bc6G?o;T}JqVlcA=hDX#bz-Tw=kRnYuDw6{W^Hn>bl;&&TUcMy*@we zRVIbhs14zJtyeFL#zzqv{J>vCb`>Dyj=B#b$MenpEsvpKywCyXV-A^9fBp zHQE6ls*Vhs6+%^@h9nhHjnMUBjR)O3SnRN$<;oQ{^X$WBj;~N&=tg?^KENHRZ0aGs zIcnxVY)-w`jDNzMmd5}KzySJ)2Wp1|PA5P^G}hiV`xmI{%QWOG7y*9`Uf0)A0DPWt z{#LBn8)MCe`#2c^RlMCdFeQGZ)`ZYrGdwyu>Kz@DIU*rDqp(z+2%W=4#{3xD)1Sna zYh8ZMBoSKAkjE=gfDDg(7Ep<%LwYvyVp@09Eb?;g0uuUZto6CD+=LEQz6|>yjA5;l z7nC1mA*cOSx0t79oL}pQzgjs%4c{#Z-wjpl;-OC+HfOmv2n6poD|prDvq_CBpN)4) zq<6*H_&_$aIFP@#B6XE4vFWf`t{?tf0V`TYt8=_wiL~)7w~>ar?mEw*ep|ZdgRDp) zl|#PKdRMDf){W|lw&kcUAssg8s4=&7f>p+NUbDt)J323h^H#u#vJx$q8U&>cxDGr8 z``&5z1%w}DR$7bhM#6022)KQncID8?TiyFiSZ*g;cCUVZda{KZ=u5abfgG2N=Dqo@&^f?yVAqr&8 zVKJP&Y0O;(t-h09j;m!4uGS55{ln%Q_bL;!C0bILWyYEoVA3X_v%sFufh$~*q{uzZ$!TSHod>q#8pUt>>!kv{>c z$V8MKuu`{^QI45{YmKQW$4o;i(qh)z=?v}+%!p^2E9_izwVg-Ezxn2`?5TvuJIxKC zKpb7pZ<0IRuxTUQiMEw!58b^3sxb+rHq#Adnr-$@po-r(OWd|Wsd1=j$IEZz-sTZA zS@!XTE$XrNY}!80VJ5@{av0||FA`Wg{fVl?t^Yhs?mw2w3~uRv?o;>ERQ;W-1Gy3v z{$jC#IXg?&7s(^ZnYt_v%#whiBgl($%7%ZC6@-;fRYj2XLx8>{BpwYf@<4S_qyE+xa-a#Sia%%7EE?Bui4NiWCiXmp=i1n_{D9TRo`>>0EcV>Mb0Y$%sJ;C6<0F&(mVhEj&+; zJinYOn@6B`F5X63+C}u#*f*2UVG)hF_1tJ#g>LvmgF;I7Dkz&mqj`l^Yhx# za=BSMu47B8_AMP-(zTh6Efqn>mLS=&CBt8Bg)Vxkb&r(^?y|KNT&wglSG$aBb?tJl zHEAwG^tQHk6xTZ4)+^~y-3`;FL6=5dhU+pymnL0C>M}~cKNAY+^lG>15t9^lU>S4u z*kL1R;Bwxa&YOfequA}q;TOL6!m>)>0e{m-FgPDKZ}eLN^52+cd9(*+jcQw4$+}+` znDxQ~?Rq$0mkn9YT^*G$RxZ#T{y#UG3j?zyV=hu~l#BIzi7uDwav1dxTMxHqhMFLtyXz?ry~k zRxD`}-(*_yVWVFs>IFk_iIBn>YL2F|xpNOOp2_ukiM%*KGwX=gn)meV!@=ba25`K? zXnEP&ih=WYT#It`;0=S>=oU{$8SEJida3>K|Dh&|NqE;z!~t0~n3z8nTGJ~A3>Jcu zvWjBN=Ob{I;j$Nm-$6LTaW;E7-a2&y8zOfm#irYc@d4K3f#+g8)NA!~R}Xrh>~IIG z-F?A%Eqn!hH}JF>46BpPcvvkK9$jJ!EIQ7(DeluSq$(mi27hRoK~m3nnMuZ3P&Tun zM&>{PL}+|GZ)fuq(EzHX;QSo3AgAFh9}>8E5S31U7JChFf0>$n5fK#1%Zlg zSdifW%Z->6sTsBP4V;I?0ZdI#HgJj_v7oY{vLO>y-=tFcnz_p{qc~oRCl>g$Vm$C> z^ulao_V$K+r_eVa^7J7yL{W#vq0e~4G`lFF#tz5)V=QYzgMK}C3RjXbOF4HghpspW z9`$*gYugdcuYtp~9$~-+;L%2)O9!Xh3$b9@f+5XCumvy1VBr$fvt;|U4Hi}>N^#p! zA=n9<;c{YL?1GWe1JmLPTa8DZ;pQr8?zN-MUe4nEZj!G@$em^piQ3C@?i&KVcRG`L zBNk?7ASFpt+bwX;7cu>xgvY;_yMS7|VNWii)nA9-einC?l$xaI9C#)$Mt|B2rI^D3;>Ztz^p`d`L{UPFU0TUdoFUD$MOk=5 z9Kwf1hwzLJ=Sxj%mSI^Y!fClauFz$r9#{FMX5oe6>HS=}c|TWf-qU7HVAckXs)GQM z6Qh`B7zzwgqkMxv>drNkSFiGC{On$wpmcYs)r06M<>{&jFqQgQ!Uq2p9VrL%%^5m3 zDGVg-PRMoGV1C?Ug8#S|3a2BL-R_F>)Y6IFXC?cEEkq>6Dl7Pop(Uk+&G~KyR`UVm zP*7fTC4}YkpLrUvsbkelb_UunQ2Huvvo0vx;Hy$zIY;LJ$I~L@UaI_3-nmccs-~?l zKq_-fV9u8&(7YTF1$Ql{5?g5y*FyulUY6h}A1k~tUPYNW|D%KhMOJp3wyoPlYy~9# z8#`Lpu4vr=D{9lKRj{kXi;8rMMB41w)!C28eD-qx3+~3jxK|UI6?Z1$tBZWFm&wVR znO9J-i%m`F>Y`j0`L!5U$P{j0x1gh4IDk9=0C>ke+^F%bEM)0cE{AFu2EdW|pC||U zCKZrlExBL$9`$GTg3I$Fd9yuYLc8^566&NUo16@kzt7{=$s{VnffJ;O z_mIBF1XPWiQ3#Qwxa^(+dBRj|nO+|pHAH%?L}V;)3!W5dCb1_)PN7edg0hmss{e+H)!=#J+ovQ~OMzf>&pMG?uH89zI0Wk-GbG%8 zw@-hNAVWhW!>&~*JgF^Dh2@hpYLT;r0efY^QFUOaMqu_>u+U^M&{XixG$h3u5;5r; z8K4$MR&L)D;oUU)A%E^_tNNq%3!gAAV_!5uU}hs$j7hqRbD3gCJY2+;fO~!tP?neTYuyd+a~sHeNT-IM_peh*)+gqYpUito)g zqc+wI@66xNMPL%}NO0tBAz?Ji3yW!ib$`A$3#(h~ZbxyI1v1M8?B#H&4Yk0|{eAr< zqyS#@Axo+PsHGCj5cde(y0~MJKdHOD9=a$xYv8NcaXzYWaYx6Q1Kd3~4s4e&Mi~!Z zj-nZmx(Lkr=0GzP&Z1G}u*N0l0NZID!cF(wRyp(6h!Q5){ZG&k zgrR7w)mg~pw!oYlnDbs8e$x2zisNo%T`xcm5ou6#I1MLTcp%xg{fc7JEc{qXi-5aB zl;NhYy=UKkr~IAl={pWRgPSumGPb7r(WdU+v48fO?)|&^x@cdF7;@_{&LhG-8l)L~ zm|ve z)Z+7_P__sSZ4n(dq%bR?^Z~3{X30bEh1%4kOf#);ipw-8uS8A3K9~tqM1Bv6#GK1dA+#sncTf9RU#11ULj-+kLHP-N4;V^}2^a+`vmg z(T#=nKv-g7fGDn#1b#(Zv$PEP7H_yKC?e=wDFgPzh{6;Ue*7S&d5%E@5-lA|do(P!c=(>mq@YG%8SzdnW*8+w`c?@lN*3_k* zgd3D>A>Ia_5>g_%k`RWWYX-;;!dHONPmL8h6naj~g>f#etp|Uy{%Iy<+tbM|X-;R$ zz}qD+*BydhoU$V9c=>pU%{7fVQSHfffV zsuhB3In?S32#S?FwV_ygF8SKcHts|S%Tio?EV0&-yvss8P2^7MqhhXUTvkz!9 z78E1JFPyPr%}7)L^e2X2`CZ)C*WV?lh$Upk0?9IQuwG$iWNFzfU1sZX4y~XGuMUoD z9t6iljS6?4cjO7W!?Z>Yu+z>22=u~z5(lM#1#wsRclNXA3nv-gt#lvzuI}#N-MJTR z5>NtVNaW+npdTp;;HUU(PKn*UJ4A|+DcgtUe}7nf#yz-lvpov861{g1{yi11^Ht_+ zq@@nfT(?77^A%Gs@;#~T0a9JwxxeRXxzFuXYbB4$iX9X6x>^s*a4;L%JQZP{n&r`0 zg@`9(Ds!A2Mg(TQj?cAu`_NTHcUVB)B-xls8SW^wcc`Nj1bP|nCvWy+aURE~?r;mTl~ZU>RF044 zp+UJGC?_~KarDR!o6P7@_n6^hbT@{(>d|9H67ZWyu0aZDl~gTBXa4TTY>unND{xKZ z{OEfRrx0DAoY7;rd){}P>_h^-7D=U*rH7=}(aC~==PVJ~wJ91-2eRPmI7sTqU z1%UfHYXN2&Y4QWCe4Vwx@~BQUm1?Vpo~#)=TkVAC>_YNV%62; zyI7O&Vokn_ilC{1O7T3yoM(UI&jb|WWq!Pb^y*xFLne)BFW)ZZc!l-*d!)-V`?6VyL3lm+Tdo(3*~ zxZ?#~n{*ke3&Arg%;><34Wx6FXQciGYB#hL9ZV|tc|DHwi!~B=raq+5nGk4ltdy<}a56AMb!iMtGpvMH zGOc*7EzO2_I6v!yk<*1X0anw@z5a>n(vep?Si&x?N0z2!avrP-usE)oJqOjZHU}~y z&?=xWUJm^V3n<9jU{ZyAxk3r;kY8(D2@!bpB?!C<!@GD$%$PgB$JCUb4>@(nDu|-XE#AU*v6yM1Xnz(6@CVEmg;YiU0&`x+o zDw1hnSG6f&82sQ@@4xH_)TjOiWf&Buq9D2uNB$MyJ$jQOM- z4cwnG4`j@zGV+q}F7seUJ`&z#9?qCYGNw0U9?h7?GIEe`uQ@`@@Qisp3)T5I8Tm(O zmw$wN=alsCba%INmXI;eW$^%mrv#iNWXu<{ z(7ktOF3$*Us<7RB zH*n4oIFXzb6nZt_-5?BBrBlF;FIR4ip_1+-(oY8wPl7L%qdCg54Ve4uL;^yczT82DYC zs6|B<`9772lF_4K(kIYnf=%Ftso=~y=f>85F5@c z9qD0s8PT?VeaciQ+OZ*AIq`FMK3~c=KhCcTE6s=C3EghQX2uJ#G!+WaFgOx@g;*KD zB(6qm_I>;D#_%2LRCF5gQR1wHXoZ8hQ=R>nGqXd>d_EyYT`xJ_56zF5r=0n*`N=Cr zrh^B3u3XcDJv%n@xDCKp0W*i|fPXVT%Au%$ic)id{ZxKuMnX?FuO(X&ifd-aqFK`~ zQepqj?kyCyy1)B!!Wwn7^8c4R}O0uY8+SKIF;Rg6wDC5V1C40U)tQW&xgtG zMY+tyOwJ*N*^$F2*Qt*E8qInbTC=~ktu=ghLRbAJ;|K8_b>0Vu3gb)Z25=KmB z5Mo9c*_G0xA~3xZ)UI092>DST|J;_V%#=5TvuPDr zDR9x6DRT;p*P<0GmNze4-n^(~_o5Z8ix;*oSvY^`vgU=0TNi>`0*%w>CEjUTxQG`J ze~X_n%=5P(QsD(tLuZk2oFfdX0@Re&mulvDX`rN>9oq}Z53HE^xkoaLpp=vES(Op8|js#Ixl z@*TYirJN8aXSw@Q$+H{c*0WLQf4BDacR4IUz>t|}bg3laX}5ZitZEp_%fgsoBcGzB zd7_G(a)~l|STS&H|3GLnK*I6OB^QPS3E=&bvbAdf%TAV*RM>cCZPbOiK|~Ytd1+JB zt~LS(pD^xNw5Yef)Y_F>OUUk3JUI(g(!OtUug3>jnEoVzk_(jhV%Un)lz8N$|=;Z#3KM)q87juT<`Wt?0MM z0dnob?uYEx<5$f~5)pO6aZ@($>86^AB*K2!O!lvg=SQz3J6Fvs8}d?paXIPOD>$-J zPJ@4?HY{h=yy{B-&Q#9W)1NS}I_rN%`JXEH0~~0wN`9a9-%lFuLz;#oC@lf<_U0OV z`{=fhdNA$@!Dzuma#Stmk`r`4{yLt2yuMrSwU*VD5%|6Q3DXdEx31GQWM@}bx0W40 z^}V{X1csJV^eR|tDW6weN7Dx0x5+?@Q)C-S5v>nRySh$OZ0qp}oib-Wy!vp1YZ2 z+ui)Ro*6Y@>Ils+nXvXVFn^zi7x-dU`DFw_SdNAJM!b!8nA@=lxr2H1Zf4Nk7+&1N z7x(hkeHen?&l?ZmgZdzDmhU6j{rk-)alHHtE|;Ij$?`cQ-QUA0<|Ur~F>d&O$tKcw zF&_OMf%Jb&2>pK{c>aIz)z9#3KV^tZRZmad7*j6 zE+hQqD)X#eXP!eZa>5=o&)YupC3}PUU3)7Llkdjc_FnU{eZagzVB0U-hs;;(!-UHG z4f6-~v*r)c(0qdsoZqzHz#I23%(v`!37`2R^QZP-%%9nxnLoF`G=C9Pn!gMtnC}GV zn7<2Vn(qel%=dyt=KH}4^MhcW`BAXd{C#kV`3czk$KZ1FPrDRTPbrXKYWBI|_wvl+Asb84#pkmaF*NCvk>?UK%G=XGk#-ts$Z(5KHK?$jZ|?Rjq!(@NV{R zP|qndmBE%@u+C+$ck!MO#3t=jX54Lzd$;siMd8=V^@TX;-_pc7*8GB*kLCS>t@E0o ze+!>8i!PlfIp>uzGPm47q3IVye= z^6K8K;%0TGCs!<_kNeM=rFnc`gtE|BG+MTj@YGrCPDkNyQ)QZ%YOS`~wAnF4p{+4{ z>{t>rkHaRsmeDZY+-4`>%svr+>pJr(JBcY-pIcs)o5QDe7=^{T@2^Qr^gD5Kk@KZb zA_VV%^|uew@%S@lSq;$_mNO#G+rmZEYb)q3(5WutY0(2lPAku9&ga1S1q2YNsTlU< zlZG(wVL=dBYPm41MHSSn&OPJ-rM3C`98@wrOEb&*0oM;0AFF%{rtech-8AUxbhFFO zFnxA5{{Az~fISy?^jYR1JI8$7&ds4_6ikFrV;RtznfG#LNC4u8w+2~-3I5acr_6oR z9j5N*1z}1FoHW!{+7|PqT@I~Z z0c~&1Ve-8p{zM*5gu^W$pMfyxc{pqvgt4hmAUH;_!mm%zVD+q`BB@&&6iC>_T=Wq<0lfxR7Yhs|i})Mu_({1R!2( zrbEP=?fMusna^_gKE4cC4t4whh6rBsorJq?FV=iN`t7}C0j#Y4hIL3-*VW^8rF#!W zW;KNxaG3&NtXshdo|!V|5{22!s+4(y4s&&AN||{nAdMUB#MOCGxrh^S`>VQ`sw#RV zvPaD6gbO6V=q+ci_ICOb48;Mk4r_Wgf0%8vA&87x6Xj8Ma$nR4|1gwgV@Cgl8en9t zv$Ak1n>`1UPJ~yIx?&1p&7KikhZgT-IcRf+X@y`H=>#VXMPRtw##XMvv{jyk@fzOl zSiyw81{f1%O(Roc7|(#A6`x7t5;X*Y)LSvgcB)1&@|$(jY7}e&3LiGH0(dV)ZSiIb z8RsBJa4@%@mVjl^j`86zq`2zy`F3?i=63(Wu?Xny^bXMjO} zGkBroblEgGcyterBLhV=^nDr7flt;1b5RCAyDe$?+F$H^vb6WV9ak9q;N)a~vDsA# z#otqDE-{x@qU6}CgX}gdkdm%S87!E`sHidKnzUT&$H7j3RnR4bmDgymfR6-$^ru)W@j$4|KKN z(9zu^mw^(+p!j@i+dTP=#uS`rp&><8u8Tv;KE*UuHLMa&zpa=qnk|Yi{|g|I5K~*^I#T>sRy#K zc(bw?nXXn{4-RLPm&0tyrOR)=3>oAF2+Uc=FbeYu_-Li0-dr2EcJ$z%cBHG5`ItjH zQ=#u@S8u+H=)Xu;J)~j=d=;8%`I<>v?X<^XZ2ogcq>QG33}Fv6hncU~sk-+&hS?Q5lh(dqvnbrY5fw_#W)la-$eVEcC7*fDB0H58uY{?mR!YByE6_%?hL^EG z&g7~>oE^O}BCTz`{UNPkln@rQoE`;v9r=S<{MUyL_%Sw-i=M=j*u`P^H_FX}DV#74@P3-=@gZ?Sn-a3uq8Z3)an%(8q*3O`eZ zX3H6LFO;_)QY5C-&S7uy>&{{qGw-4YOWyz-;8_OZT2PZZtlJAHSr%ef+O0y|)_ERr z^N^X#+6k~a2J3j?ZJx(l^V999dMj*ea_F!W`b@)Hj>f>vuiM zTK&c`H;uOxFzQ?|H;eb@L+utgj3}x^Gx%7@z4N)Zp5LAPYH-M=bq-h*=EO8#8DdUn zxV#HXD1(K=z~OL>aCmMWhv)~vAx7yD8j%y0I5c7qTJS86$yVU-m^@7V8iJ1&4MCJc z&r3paz6D$7JPb@C!ks;qh0jBbC%R4cDEX{AB!*qU)1nm8-t7u`MK9LP+|fL!lK z@TzbGA2&-lOm`rkIbU5D;nNyFEnE?AF_e3R=8Mci1(v=-tMO!(#Uf}^x+ zfgl>%kLHH=3=A9;-!s_P*E6udD>R&|e38KO znGD2qf65%FfHZVU6hkx_V-8lBLt&t=l-Zv)*UI(eIvsj+IO2j2R|S??{_>W+?HNw0T$B+?tVYUH9+M;oZ)o8^$nY?!tbev?IUl;mWtQ zufJxa48SjftAGo_U8L6sve&?6Buk)8?Y?vyZ|!ooZg;oR8#Z5}FWo)sUwb=*tjVPn zOg<(7%uMxQpWo5%>hv4+dC^4y8G4T%i#G5>u8F(R2l1ygeZXz>$M^pWUnmr$Fv96X z%Qe`g!~#e%HIX?P73h{z%-MrEkuACnXVKB$KLgG#v@eT2zyOd3PW~x7sA5y*!o1~& zlMfsti_GJSA4ann-Y$IqG)lbCf3)EJ&;c|8PX42J7wRk{pV8BQCRS=x_rT7sL&thL z`olaTA#WTNE;E%dk5*-G*NwZojvN&Rtyx!si5@D57UA)td`G)}U@UjjyGQXl?8bDp zq-a_`K*$q4O${D7x~{vQ{>);@=~66hAS4;{4o*EMB+xIIR8_;8ljcV$x^}y-xD~P6 zQPXJHF&rV#Gf;3!Lf3H7JuCf?4kb#0Mn%?l6jfrtW+6h;vhW7?W!WD_EC1ds%J>Hv zElw10o#MIKHOIPpT#TFXYx|D%`1oml+$jdSPu{bLQUwhQBZJQs8@yYIuo;;SE zj))OjN~pn@Cr&S7hCz^~H!akhZT^#(dD`171bO5Z%q?vBH z%sSFU?HQ0-XV+0D0eiEmssmVI4R+;e!d|U7On`9d;eZ|nV4xNsvL$%T8g#HEFt;CA}586&oxRx}i~ zg1ccOj-UFbT9Aa(j>7k>ho4qZoQ=SGk%PXGS|%|nyi}5+d)nYv)iJApbOXQQSUo?h zJDa!?y2(}VJgPV2IUP`z#?QsHK*oo@gQGozafs732+sVBEp)~dTz;_ZigoHZWQCPs zE#)Rrl~@hMM|My!cwy#iv`8MZt8A<6yK2klz4!!DWNrCkZ26{s_+ti(t$8mdJ3m4A zzb4&2X==Uo+W6z9;;wRf_K(O~ObH2x86QUIO0KTP3h^5HX&<6-6e;Iw#M*-nI(ep- zGk|ySh7<*>kX^LBth3#md7SN`cLR6t5@wG2@O+2cGKaM)lYHHjr^p{)U-Juk{4(Cu zG}ucEl`6?&PP^|aV@1t`lV;+@H3%USw=_jV6?sIs%(#(S|FFqQX2$uff!V_eduNmL zjq_2Pt^?p6x~!Ke+vggit+R55@s+L#GS0lpH9=j=2HorOkiVM$neo@;=KDFWjr3W~ zIl17;`94(8r+s`*4B|rRCiA)arW9jYe~OA(dKDh%JFjKoB3X3LSX3nBOqa|uDP`)@ zra>akWbNh1i8Eyyq3&Z!0!l7gJkOS8D%Htl74j*kJWu|87 z(u!!~z?HeH`^eFrt~{`C^EdOadF$5Z&dyo8XKmWldgMs!zyOXLY4L?PF0$uz=3ZpQ z%JYk{_Sj)kP{zO?X0f{j0uZ^!Gnmv8dQR?^C6=PRgZsG*{fLH@F~_U9@-E;0dT6p{U;N`z)hFGCuC%Ax#+8Sqf?p(A zT#WPSl$WK53~el&OdCEon7D&wO@HU|_)OhUG?m!UMDZsdNy1MMQC4x5h^{r-EXqI^ z(DE(STwA8w^R;;LFY#ktwWQ2)wY)WD5Z5kXJmXy!jW$2X3Fv@`PWAD-76gZk;6nAEhdfZ?? z!M=HWYv>$^TOe#~xSc%cd>5ocNgV0xEZ&11UI-jQ9>_S76|a(oO=-(A6xX;Y-fn`! zlw{#W*3-{!4i^z0C1Kl`g&9DbGa^dBa4sOQst$ET?WV9a}t zcyS;(`yy!;h9h3yYh)O5Uanog4%qz}p$L)h`A|TJNzWQvZ1HJ(51vfnI-~%bBm&DX zdlV3cac~L10-0cLac2v(O1we!T#NxN8x;!S2)is!PcGUKyW9-*nopSv97)k~FYB2} zY_RBGHQNJ|DN!YBRaeRKKG$2L=Cb86T(OIxxl161OJl{3$`v~bC8Tz-v=5+A6)N^T z3Kem!dPa);@|W>$#|qKYNP+7az~!zy&t@tZg}}r##0eiNWe_xo9@X)2#p)^JOy>GE zQ!73!wsOkUE?6P8KjGT%dG+&o{Q_{{dG?76agkPWyA%>uPzH7tQwZS^Ko{0D;o(>`650u^d?SJ65 z{$}!5au(#{sTR@jDjfe)+B`XP{MYoR+IiE zlTa&`HBcGo47AcVw8WvYycWcPWrG+VNU*TgKdO?ns+=qZZFFn6VPN-Q1&a^$QRXqhX8Bs2%T_c?Csk+1OJ;UhVfDGdqN^M$3k_F)GIUlwZKJ#NuY zG6*PDJh)qUwS9qY5b9V4H5Uc?+KQ=dTpUMvKJ zx*Dc{(gkmF$Sxx~LLdDag`xC|ez{BY3kMR~V#V~fmx2odD$tN49sSqsI(GDEU;m&y zoB2|@Z{6hw??(EdLJjKaJ|cxwlp`TIa9y|B%BlxXVS!S-MFq1yvVbax^m5Ly$PCrX zD-_C_NV$rV)smHl23WSP!(-*wrR;qq%L1}Ai&%LnYB0xKoUwx=amB5jVU+7!@3YKM zI!@c+uyC%{2T9q1ul5S_Xch&=rYycnAJZA(As;gz*V*_HaN(3foMwOU|(a$ zfdkB*M&=dSL^Nv}_jj?{cQp5coe&^)!V5vtVV($MQk|G*&Dwkyoz z5l;o5aCpI*ZU|QB6YezJE6fv4tDQ2R%HmbE2_|Xb8UBHRyrAU=Rj8QHn&aj(SyGLD zR%PyDT?SRLX)0ImjvhgKvxl=2`4EH1tTY;tL;8@x21#)Bg|pj_KsD`iIy{vnl_`y! zm4|6h??5yzx1j)qO!uJ`JLf-fi4}vqLU0m!|JTb!1X@4ZgW= z&(pwvGoNO$7^Yw5pWR{;uV2{Vr8Q>zRooR#|-BPugT)UkZ_X6PjZDJBdJ7d#}sHxl}V=Um1| zMnpW%8Jus}uu z5^%gS{}Cs(m?D>OZz-JZGGvMK;P_YY-b&s)A71wY-dN@ItTGpx1qUpxwYcLY@XBrc z>dXf`*O|Z%(Emyoj=v79vWxY*E+uU-0h?vj52589HE18d;`}Dcz8!t~1@*z>F12l{ z{)5k%s`{sR=Are<{WiG3HI%&8LFAn~`SEO^n-LAT!xaN)EXcIjAW>>S94<_X>FbQ4sHfpFqCKC)E z0}h6X#V|-et+w9-3=&n8Y&U3Xz(IRVOR_cz990eu@<;%cfZr~a_EmE!sf}v)D#U*Z zE1DB#LUlFicYM%)uuxas__�GieL2)gx3j)J#fL3vYVXiM#o8<{W>8Tj-SVGt}IG zjL-PEmmCBd^FHhI6+n9>BIs4fUsogjUc*w>fmZ!MZdA=jzT3lG5C*zp?EvUsnoBgE zSp33%ypJAGQnB^=8ECa;=^9%R6(-_?P6<9(GC)16Wl zVe5vJbyEzQsI2(xRqzI1mf+It^>9JnhLrWrVc=58hr$uh3LTcZIK-23LeY=&i?MZE z3_c}l(%6o}*X3|?uuv}D{=gIe@oDtK`ctIf5wHT=jt%AvhKdB!$E20LOxY;*>TtOZ zSEQBakx&=9Aiv{PW?#y5IBTv05==4nx=O}g^W=wel_bo0@tfRF=BqVAjUYkYI!=%SH`qXlpd zl}F$0E$is}h|S1Ja}qX(2%~rNnuJlflDHts<*!N*Ejvi`I`jqwV&jxTu`%B0P;OkN z1WQgdbQy+WJtDdBo-8iO*doDPX^Vg7f4$teEOcAR%7Rl)C7X4|;l1W!on3rJ;c?HK z7aqk+4tDiUEh#@PlO2}V$q$hqovqcfB3rAsC_g@AKAI))$HTJUYA1D)L|O^NE|7O) zUvJ~^{n|KqWA}lssV*UdSQ|d~PBu)=$m-1V(8CCn%cLw=CJ}zEc~FV6==lX_NogZw z6%mC0CSq5lgLzBh*RNXWLa~He>%WKSg~+88PG02lxv^_PAuJNX6x3fLm~59M#aKkJ zVv!3$E0~MJaYAy}*@;}|QP|mtT(Yo;L@pUCd67%zH~O~(ON{w|7ztki%vxOJx-jK3 z=SbvQBaur6=8`FuPr{2_HLy8O%97NRz*N1;Zw(2~NZ6`?c~?G4!QzFj8rVk%<%$J99EN7n79PI1?JL1#{Zd*{@a?l zY+UJY7B7@sj<%CzGV%&7V)Zets4(*s<)c}L`IQXc1v=nwg$)L|L9iBd{#Hv_6;Wc7 zX5(h_|WY;hcG$PB~A z1(|*3&qo*$q&VhB;a(7Y_Gz;m`Q)TgB#|X#nJh2s#h@Vk)eYj1RCihlPEVMWUlsFM z-x8}L9c!q^y6&iX2%QjokLfn9RAQN0;aP%wal2y0l?^FQcT}7ova>1BpUI(DgSx43 zx%u(eEAM)Pfv>;$yijspMLVL~Hsm(didG$GF*`xa%S0XObdW)9$~3$^2DEca)8rD6 zLD`2BSpNH^HJMnV0U?zP^P5y@DvZ%#90m&`?VdBJ514mnpRR%A{bXP#WE*m0#mOnRnGJ6b-@&^$ntZCfc2RhA~E<|2vk3TM(kKR;^GFPTO9YvzU1 zbydu>>sLLIhRMPnj>8yW|DT#i6NbWnnrSrB?B@UfEE4ncE1gAOyMFJxdsECF{uT{4 zi*_OY$jL5J@?nxfl=GsQ)Gpug3o2kRR_d@y2WdBy52sBRYZ4~)EoObSS*usq>9Af; zH|VfYmz#9RWe6U-ZvBR~JzI7crjVC{ywKSk&Gdd;a!E5tDjFW%*ss|AIT!DlrI)g( zQNA(EzA9fx{=?ANE~ed#*?I6m`Y4_l-r_|TRym9IIl~AvMKwADt~X`n-hBEN6?PMV zW)z#rx6|dmDM>1epwoUs&MX7jhXy7G7zf&{aOTtn7IRy;Evq9m{7#vuos7K2TrRnb z+rTKtehwQS!0L5A(>vXF#iClFy&t=994g@?1NR+z(juH=s6Pby+~23lSz3!AY2q zo0tKV)3}l+&valB9h~8y6SLpIIpMgtw;Bjo@$oNhs!5+P75RERKd}VPW2r0Gvpnfs zx#_T6dB>g`mbRF(RFn3SQ7L79i}L^xEE3?ByOJWo!9$4L3@@ZSxsnJyMyAdUtr-&N z?J9G)pi~U+%bzu=JeXcc_2%rO(9t%+!!=Tr2X|@?+^Mb$d~QYQZRheQ)wr*CI~5BJ zzX)-@eH$rvlZZK@=Ebhw$N(nl=0>O1w|vpaK=28f z8|j*{bg&Fy7IP+(C)X9P84O_J5HiC;2(xVOvXeT6Kd)&>Ei58h)YKm@=DEhV?lN&=CfpWC3-%^bqiaGI5`j+q~aN zHs8J@ZO#xkd?mMvmNM3RQ>*1L9QaVYXr;^v+=T7WnvRwCA(!*bt$^`msBpnbX$!e< zfh=MV!u2t~DwZ9SP*}F|mccInGR6Sg4z7{K_COAwSqNBDmeEgr zb7e2S&9p#CPrKmdhwMm~#>r75^l5wF;06JagJC#h-07i#Z8T8*_;kkU%ovpQ&cGxa zFB^7|K2R;&`$*{{Pf0~zY}-H3*F(%p#jb%M_$y5B4Q)8`H{$@ccrbU6+3JX@O zK@a`+s26%^)=hp)zF(DS5VJ2Ow5Uxc7>#Oc!lHBENy1= zm_)t}1Y80)b7n?!LXjZ>PoF%DID(kZBYbL;sc7_dpLG!iD zsN026CS2I?_(Dm4g$t#C_Xt%yyz^sSg>$|`XuLFLZdh7;8Kbn(-U=_@>8s9AlHa-a z!!f^rGaRe^f|xI9ZHbcn)^1?VD_ju&?i*ixSAVrJ`a9!-xM}z9?Ijn)Z)QL)eqxKw zUWH=LGNGi*tu94LN5$M;4=`!7b4OS2|>L z+0p*Kn}}}{`aO$W6ZGb$n^`M|tkinw!c`+W{#UHj`3|G@sUgjdD)lrw51-`MRQI7? z9D0ySN0MH3Yyn0*;V;}y4HpAc3@+*}(Q|i8E#ffznUwj>l=&>f;Iv#rjKL`87f#C{ zC~Oc5vl8RUbTQ^7nD;7CpOoe!yt7&+3?1xzbQ_^b7?J*_jb zfBEhnDf{PHw2&k)09^m(XhOjjbu_>8%9MQg$EabB1B}H8KSxCkiQ^dyLoS{$7Jxe+ zUNQu!R2VNm597>c1h~7mrLXr8Q^qCX^yeja+mKb_epOK*?f-T$=W^(dg}-BDyHMuJ zi&?U9kn)Do**smeLdezG#bJ-EGjk&&%CHc26Lce=62T85*B4vi>KWNCZFkx1i=2P$ z8B%!Gpy}L6u36km^TFaGqxN{G4;=xlQ(jA*Y{I6*4~bd}SRhZas`{B&HCj)U4)8gvy8OmU^QNUX{YE^l4&*uS6IM z=Av0l%pGTvNI|mXq=sk7IaX6~(q!73Uo|V{HlH+=JUnjZw+^xvgx>|AQ*wZ;6Ux1?CYZgjCUGLaLF_SWkO0yI(F^(*+e)fF4;F*R;&FIOGn#zXB`Yi86T z3e8m9!E;;7YEuZ5ZFOaclPSc>ROfSMR!gQf^O%`dn|j2|3R)`b%3d{TDJfa`X~~rQAoEmfx(+a!YKRrs{D`TnOTS{~KWui? zrXDksgO-YtUsXI6FWlMhFp;QaxYz5_FSTY%6;+pgiK)E9{G(lD=F+8;^y{u4mg0bG z{VuZG-R~iLoBMspKC0hv0{*F^Gpn>`$aqlNY2V=BIc)$6Nx+kFFnyYFBR`#q-S-!l#WkvIRhxr4;C4J!%f)L6- zFs<<(5e&|}JD~1e$rn&n&Sce#b+f$=cfD(v&KKFkMoxBRcwlsrsAxT;V2AC%W$qIC zK~t7gxYf;NryyWyM_W2A4M$En=#-jfD;KYs#^j>c%{*%>2>6KB;5CwkRh**AQlIeo zA>4FHm-?C+8)04gJ;7M!Jxa9Aqx6ExyFtZk1+LTx_#+!V*i{fnzXn1TzRrc}T9d5Aw6gE$?QX-N{RxB3f}7oYjJC#Kc| zv;MR>QIgq=6uBi87w1S5|F)Wejdbt4NKam<2#?9UDedEw5Oj%Yh*TR_ub-`uIJO8g zV*RspY}rU9Fs3<7LI;t9Ggn5o|59!!uMC{=f1zuj)EhCGZHoeIHV`|DkFI2|xW;pnVcJ)Dii2wMk7J)A7^-_NXZOoSSBTBsWd?HRH9PRY61Qy}LLYL*@?nDCgfZkXCdLg+m;4lxO}o~K6eM~i#*jBt?K@lv5i{yb&;<39O=ZdA zu!3^WU<~;#KDyNvmN$kJI3fwYFr8_BigyS3r9e!2emQRpc?TfAdl(S?TvudKtsN7g z7ZR}0)1aguRh+^0si&_z{(abg{SE8YQZQ%^^mGgieC>@dy-2Z(1FVYQWtV5{d6s?N zTWqV&&abo=*p(@}DrGMusHk0@wyX8qro)=FU7NP-2d6Ci!R2;?Uf!6pvgop#)0Xs& zW9-G1c8lFwY1{2K9k!?J&a@?M<3zhVW%s1*B|5z{Z7)mPy?Xz09j?&f%Cx;IW3RUO z&EI18>Cln3`!n`{?M&M)Rd_IE52Y;*^G%k$=v!=e#$Ic$OWU55J(9M)X^Xr3A|BbJ zmQZldq-}rNqT|2C4rc5zdxH))3g)dTOP-XK_GTS$iC<}@-?z8u1-#~OvA3q|ZE1VE zT6%|SJ1E?|TTkxPJ9p`Dcgo(Aw)dv(eHpVwmELdPld^<_+hHH5un$_I!R@f`)Y<#> zIuYS+u^-d{-Ty5X-Ty82!#aGV!aig_n&I&4dhg-1eMG;HrtM=DJpNe5e%wB;Vm^`K z@X3sQ!v2O1PZE^Qeo7elw9byF?PoIfH|=NB_H$|bRNDSl+WvOhem-rVPTMb}E!g;C z+WwA;epUrNry@_J?MapYe9C?)WnW<8N8_c`VlagM+73AXHN~cSS~d0HfKCo@a!4mA zxa^=#v>V>56Es1#O($)ftkua{PB!XfBPY9cvYV53owPFvj&!o+%J!yLqd1R~{;oq^ zH!a{cyR*t|`F5;9!+1JHm=XDW@j_5c?mZXN=6XP4umQh zqN9SUlEM1Q_IC^@kBqaY%eag6*B|RZBU?6m%^HP?OY|J(d7@v(!rclK#@z$$ee(N; zcbVp*)qf0%hB4jrKQi4YEwAVfHD zqa%bS+E{n}p$DM?G=D86R~ZQEXOF3Dz5fk2H{46?vCMF{LF@3jKB2G!i*V3aE|%25 z;_xgOSd`ni%GXFa1B*}NjTQ$nS9=(;`}7Js1@K-L8-Qx?1w+`7U2R($+V|*pB}0u7R*OcMP>_jWs6s!OiEN zuFbL6RO_q}zH1HmC}u6*Qtcj5g(e@-l_1kL+uOiI1_v30LkyvUgNs>65ls{*a&7k^ z6tT|GM2SJR_YDkmv#q$cr~Bwpj8CNW-Mo2oNn%mObUoB73d4?MKV&8&D_pgtzzHyUx#lQL3u>Gf<+*FlVF4-Tp_C`Etwp~JE3NFeSwqIl1PF@~Ub1kjG%gCT+F3c9E%4yEGYOQS7w zfaXRuj&^ofTe}BbV?|aQOAfVgw)(iBp$uDJYD|VN((O6?i=t96o7N@9aIWCZio-BE z_mSW3!}8_~UtO-xsH>xMO;6u}>%x&RHdjvkZcb1y+pl+N>kx?Aq9NtJgQjJU#Bk#x zj)u(%3ALk&Ik8ad-~MhQs~#kdX*BMbPM4=JOt8NPdj$h^CRD6-s0glDn=-Gl!VDZc zvV-M~0n;_G?O?pCDzxmm`x?EVAom_ir|VeaD6%?rxkZgGm^2ibZm^s$B&Nvlj06?$3I#n3JUkxVd>dD>g>7+^k2(d3fYnvipqpOurfB+W3FpM zf?q!Sa?edv^>!U1$mb0*AjM>pg(^3=z^EqP&WO@%=*OTl8bN26N|(FXky(ey5VN4I z_t+5#lTWr3^;&QQGMMrclkab6z64v)HpLxffZiALhDcvzXUTL2K?5Ydb zgVfZ(VTIVGGwCweoT=Tt2YQZm=G)|OLQVwNi&#&9u;2*wjy}?HlMj3p(UNrEu?XX3 z4%$*IsfSw-R1n6QDFXeZKLxI(!{$&TC|d&dJ(u*l!Y@$o^5*{;~a531vcT#rM-CYyZUlDJr$B z{kHwHl>PIp{R{h-@KRa(SN5;7_HXRprtEhjHC`b{NsSA#_V4W9GBfgqAbuU@*~+Z_ zuAZS-^eQ7F>kc+*t-1+ds~S7|dS?wbx=zNZ!~ReE2U+{SboieACZ9K^?Dw`$}yf7>5oqFKBg=17NIe6sdmgwcQ1;oms81c3J6)wAR6gs58!*B^MwTx+n!!NgkO zt@2A)4n1_*AKL$uwf~R(zghE!`AOFPhv528&5~*P0TH69t^d$5Ee*M{9edT$IiH>O z9MEp*oekeHr}2W7^g+md`GtHo6FO^ure-%3H+!uXlaK^v?a%EmnD$xwOFJWLU(?}r z`$pDU8)R)-hYZky&0l71l^vb3r?Lb_u-PDB_5=y@32Roa?da8<^NH~CkTf2IJU8YR zoBX(0*Era5Xr3E3jOHMzk$J&c7P5Bp#ht^kfd<#2z8;|uejXQdT3ceFd5SFlYojxy{M<8&9aVq=}ro&aH zN`}1L?2Cog0}Ub^F{_Wlk!qa9Ve>PT!pDVUsFAvkdVPeZOeQ}RS<*bDzCGDsth#cX z@KkGO5GC!(jk7Oooqff^<`q{p&ADav6>V#GZ*1>4FnFl4&M2j(rfVrl7=YxYMxk3rCW+S)O`@W!ho&V+`eo5&fS~0p)F3YTfb#}cp8-rfg7$A zz8+s(JTu2jWn1BGCJw3HKjy=vvKljRsK(Fd+{E&YP{;WpIfPb*n(Lh0!_-<5r*Vbm zdojIV0jULss$Cav-oAbPx@&f>-{{&u9{mX-br+eoLk=YxI|t$MSPT#K_Z?%(rJdC& z!*CcH#NaDex3-B^G8oa($2sZH2(^L~<{dX5=sU{XjVv$SSPn_m<`^xGZaLq089%yi zj3_sw99?_i}w-?D~GL-xIrjFV_#mt{>$3eX;BJbNzwX^#{5B zwb=ECxc+eL`XlW7!Bzp=G+;u~BmUG zE$f@d%_qVFFgv8V7{tsyX@V_eB1`a>^u{bI$s5YZMQJ|YEpVmzUDPV`Ns@TWO0Yt% zCzMkmE-+*eP9=|))=5rww3Z*IZOq^8R z{a~xX`bpJ?9yhgJ{b2t-$fm zKgO-ThD^>G|C+8wafKTj=Dshf{qFN8?EB_6kWe`=Bvfw7oe^gA5!+icwmtt4lg;N% zEtbb*kA7YWC>}QJbq3e`vYFUg7D9j#aYm-5SYAGFCg~XwSTi+Ppt?I)Gx<9J(tiBZ ziJGyk$#}J49cB93)v-}$VI5JjYMFh8m6Q*uggfy{T9e05JsZam5koUTQ&}S)$$0Y` zbyJYXZ(_YV^d{!38P`tiSu=6yb4A2&=8A~lR1vNjVTWj>z0oU5lyq~s)tM_?#Xz_Q z61IhMx>s&~f?=rcm9dF@7_XWq7^{C}lje6hOPa0rBhjd}KOm`vtQ;7E zn2x^4sC}6WjdEYZD~v{8?kkk5w|);Fndtp5hogLs$)wFMP1|e6l3Wna`QJ~Oul&MX z{JNPCop1fQ`J|FU{|~+muu!d#8%;QQui%adV{LvGJZENLsXpVRnJK*ax#{Wd{e1c! zj7i?>aN+50El~X-?J#H4YCga0r79EGx z@N9l+=H$=m#yY%@=el$>BJODsKi8E$%;1N(_YikK49WNi1p1>6G?~IHivT`9R7<5f zAeVfSfaAGx+KH-F4o!V!&>2{xt7w-h1dPt2cs*sWSG1G+<#R^gyKIr)UiBqw*a zB$Hg0O{(A5klgpA$?Bvt+1XN7kIQatS*KEn^D4doO)h~&^Go4eu1%ga^J!yk`AM@t z4PK~=GJlg6Yq|4n^xnK52g=83(I;rrCowj90?VE!>4r~Xar0?&E^sekky*x4a3LA8 zG)y;naLu9#Wk7cCv_(UTEIt3x;E|5RLQTf zl&USC{7EzW1+yqeWXZD*PDB}&aE48NrJKb|Uz%K7-q})7Ke33YO z=>op3@JHsK!jd*nlFW4|si9O! z|KLh$^zRHQNoD>sUC7#< zD_c`_sprfpO$?n}nCxs|i0gE9OD54$SzB3~d4kvgkC=1n%4*ZKmHU=7)mG@|q-lG^ z%)BdUj}xN%IkRTSy`T4M^jcFo#*#dM!yu(FDJT`yYT*e#nkC z57}z=5ym(~-i1}*CjJw%R!J#WnV)i&rmUTKMQFUPXBqw%&g46O(EO|UH^#*{bDLX6 zMeRRi{+*{u-h2=riYGz!uS5C1ZvG$cf%04zJsWnm?)fg#+5a{FK^bD3@k)3D5|%Rm z$r5=AP{?-sGp-of{$9%bT%(=bx%H>0B~|p;fQ>+Y1~^Lj?=(n%0o+DP{)y~E5WR~gX zywA?X$E3;il_=CkXqoy-aR*kqz9OGD=jy98Bc#doRRyg12G>{R2u0U~ERXUjM^kT* z-he3)F2dfx)4=s)f^vFXPbOWzw3)Iu%-C4JR66{=KBQZws#nSjAG%IqXuL5TrPy3V zDeTfSP>MH(qZC6*T0LS)!M2VcAVDKdz`4x)Fit5hYAt7+T-@**X2A<)OKzfW^%M1C zEs5=%JN`N+ZftugKenJIA&q%JXCaMo-dLhB6>`h+V=JT6)h(5YmTYadw(<#c88l`# zM5LlND;ks0j~iSoYLj*4{kG9Hf~KXo(;OClP55zCIT z+f2glFco&E8Etn1R~Ib8M?<|cckxy@c}?zh*Fi)NpB!gk;sf6#p09)^Ry z+I-jcnD5!%98q~U%bW&k7H6C5-9W7{H$gx&P&1H^YurGsgu8!-8>neG^AEX!Dqik~ zxqK7Sh$pV8*e8P!j+?ue*t7g1U32k(ErW-=jZ!QCiM zT10Vj)Mdd;jbq%Kir>hO<%pd8HRMF=%5yPta*#Hyg9 z=j2zB`17!vS!u*MNpJR;78QP%B`#o+ZFhXb)_LKKp2~@v&^y|Zj(0v|c757p>N(xL z?}Fo}z7yuW%xS9ZhrsfO%@icfCDw~Wk}0Ra!6#U*71VB)!-%-4Wwy);GdNn)ut;+< zN(_IN8(*2uipPXyv-eFwy65zeJ_@9d0qMu6{c+dFZy8eD2t!C0^Q+Y-4Ms0HX)Y~Z z27bd;=sC}bVN^?p`Tnxv?~j-KJ~P}hw72;C&%5u3Wmw^;hGAHTl=OltX#@-_WroWT zt%DgK_nRkVhxx!pz zvyL*03fD^4H$fxzHPe)`qhMS8$jwBY84^~)5rKAEe9~Ml_AKAtyz*^fPWiS&Snv~0 z?e(X$w-Q>X=B_$^>Kic<=NpSmgTkoE{v93z-!)t8_grHYU8~8Q;~HBAu*+RzHRIcJ zjcw17r1r3}c&xf6dhXRVu{Pesly4%Y7vYfqYB=N%PWl{0BV*d1gJAa4x+ri%;f4i#(pQ=9eRP}+Usym*l-u+bd#;2;+K2_cJ z)FcgPFD|$=Rrc>`?mr+J{FroV|7iBue=?WZe>PXxpO~xdPw}?+->mfi;?UtI-NBe% z8ONbtnk_;24|WcNv9M9EFjA#Bx^V7`$xbxP^{X22XP<_O`J}mmVcRfwvd(tTB~sdM z^nG_FP8~n>Kj*$!b~O13QUf>m7kB4%S;}Z^?Egi(_A}O@pR*4A0vhy7f|mV^QTjSG z5kUvyD3M)?r188phLuO%bz!J!CY*q+ar82UszfW2Y$h~RZ*-T_>Z{w_ zNnP@(hU&HMw5q;(cl2&-8)ce?Vu1H)P-`*)eq%wMX$&TrX~8*WX)wjK1k+p-JRLjF zPDF0gzw?+OcK{7%wvMyFEyjfB$V?zc22TC;9@O$Hm}JBgPRyK()B1Dfs^`qrTjzb% zOpS}a*LaS4A3sjF)clfTtS*uEz3A1BA+JiY?APWPeVi1hkCQzigfe`8^6#cwr4W0@ z>_@M8pf#0fNhew=pgOIsPDLG-R9RQ~yweT@J9Oq3dg2?f$FRF)lzw)$R@GHKV>&-= zX4F3%%uck7t{q)F>IpLzmaF`(a$DWL`>xUO+&?)URMu5JXSyD?U(-t!A2-wen+@Tc zb(z}qUHJU(zN_Mt`{cXsx&3wN9S*is*H%Alchse5=ApficqT02v-J;~>4GU}t*NU?s-U_WsKZIq z6Q1ou`8wLYo$TD_5%#!gi;sjObgw#eLrpJdwMbQ!HGQ1XS(%!nx;0w2uIDTqDe8nh zpE3*MrSwN%3~=I$qonAIgi!j3c9QbSm%-?ZW1KJ=G!$!Y@aH%36IOQojYG%H1?tY5 z9yUvJeLhz}-27>iu3m`#vbwpYI>cgab%;UNuYZ30_0NHcGWOyo)Rr?6iSUuAt4v7a z+*4QibX{3a$BguU5%Y4TsSIG!g9}Y_u*NJ1)|zF(I@21gHh z^I)*mJQTE>hlB0rv0#UJBG_rZ66`i#5B8Wp4K6c(6I^M&8(d|699(Vwo!?&uoi-61 zwBbs)BDM#s%L@ObPxdF)eV63xvELfii6y9OKeyriP5m z_h4eQ5R68QZFXm45pEaS$=s`90jxt8^CV{*?Rq;!I()kV^Z7=oT(vE?uh^;jHux#J z=DXONuMYm4EpAsHm_5%<BzRJYeT@FHMi%Zx?V@LBHQ=7xIPIGJn@hdCfGV8-AV8D=E9^HG>j|eW=D$sFNfj zQTp%ef%I)DyExMA7=*6Hrh51nVCHy#3H1LLW_*BvZD%M}(YP~z;cDc&#^C2HI*TgG zmjBXhUj)ze3$vV~D{E{U`tJ#+2atE`>F=dED~G9IQ~xSz-f_~r^NVJ`)@bWCrJOE0 zScF`&jC+A?K@TAdf&g^hf}?f?+b28BiSmlVfC$^4e)j&Kq7~BLEIuf<^6>_5z1X4N zyrr*$)O|%U51v%0*{d=fu2vwgypeA>f)BPc~{!pno`-pSiCO1hJKKZt`GU2W;SBa4JHQLFtlEVOTF2nA{w`};PXBi3MyYTb`DlCi zKVo3ztM}d%80?T=#Mi%kq$S2bbw!T$MYi40(cPmkowOU{#KXU1H!b8i)W&8%fm34%Dx7_H|)h(Cye6H-dS zZOl3QVn}9;c$kL1H@y2$Y^;T0Ls}G|eYshs!+9=~2?m6IJk9Uy9`F;X>>yra#FKh& z7W1|TQ|5hH^ZqbRc@|yohw;Ji6REL#0B0cgRcGT3-5res&M2^vsKQ4v!M}Na%6uft z2G~b&g=I3%_mgpcSf4K=)=e&RxivF}do_+9I=N_AMgAg%-H}BT_-HIbX}pY-c`R!_ zW>y#Y&9s-AGuAW~)iz|tWHF3r&a#HGTz?$bEc0vl&V^{|?CEJd2%W;OXRxoahqVUh z9YS|wC?CE7!DS}lmm@dr0ryH*=X_>!>F09(P%-YEm{F!Tuw*7=F>Cl_gb` z{8O-JjXj>ZzP}$IBRnGpJ8-YTHW<%`5}mc&JfVT{8$>@C{);%ibEIp&gS~&gr!bD> z4&%!Z8^Ite-v=eus*={JvLwz&<~%QMU<>i0VIz&%8Z+Ep)7RJ2)gf=h8#;Q9b!{Vc zQK^uhabgyJ0tLzL_g{x5?mp*H;o{&;Br=3@Q2gb(8jy~jgH&qwl@4YMZ$h)L|m&V>bS64PmBz;G&#Ka|{E zFW_2{`=jec?CvWZzZg^HuTg3w$SuDLAO^YRxPq$|$`YrWMxjDL)iA4LD|fs>uTSxM zKG%^J-RJdI8LNC5_TMQ}8w@XE5uBK7pT$;gt8K3-t3eXQ)`q>viiZs{ZKeiepX_nd zRx|3PscKEujMh(CT{8K5rh0E;Ec_$JlUwV`%EIfhyY?oZ!BLC5?Z-_9dqh)4@JxcU zPMF*LtWi#g39p*-_?h^sS#;9WJz^%HHmFopMC#1WO+0JrkDJ-iJ@!_!bCd4gxab}x zNdCPqfQi{`H(rD8R==Gn1(R$$8EmJN%2&oIG8sdPrsbo|YU~r*cym3LR2#sfqDOAx zyNfB|BGj!HvrXAf{OWDk?Cd}+*oDlu8w>0`STWbuyc)Z;eS~T?*h-`+ ztJy{FOH$&wl)oC>cJRyxd_CyS)&YrZm7+ZLF9L(CvMVu+-N5%s3;PA&QTB#Syr~Tr zU+!kke7P4D7_&4U7(xz=y#z|d%F%-} zHU#I~JUB`{RtQcnclt<2aWn@`Lkyf*IdEpti+l6n5SM-r{dak8X3cTn8{z`bicN$s zdYgGgA&#t?w25^ESAn^*P-1NBseknI;6Q(id7-q#h&wqe$J#zTY@H+YjJ188T?dMU zM}p%`Oqsfr%!)@7Cc1DTjHPpnKX8Ppinn825e_JM&M|i1y<1NB4=OM6;D~4>l0{s6 zE1ylCc!?Y3fa|_0bVE8xY^Qg4A@{rFwQ@Hy_71j`5tXVc{cEQg1wfal6V z0E;xTa?2588J75fG5X4qtcXl8s5{e-eMNqw?CKi4m0T-HFU@m|6N%H>sn?pCjqPcKe1#98O#40me zbhcH8c1W8tgKpQwjtsPiP;t}DZe8xt!J zkRj3)fF;!!N*FrYtQi`Us&xBi4E>mrhgDq+7a*#be7LTeU$X3CHN`4NZDox+jKI z0e>OYqVC7ms=P}q^CNcu{3t+L(QPUHM$TkL{HN0+6$;TgPO@}F2RA_becKD-9E1zi zoJ$Y|BoLq(fETC{`GD`J5s7fW5C)!|%XwgC@#jZoucUr7(Ow zn%(pE7tENw%_mHa^OzdT6u*c)oh0(Vp<1{l`#Y5L3_FF-Vsd=~!JB$+FLpJ3R0^ChrZ-W^3#5;$QdBfnb@uG>qqUv^-41;ePY@_d!L6IDrm zkjm96aW%3ryPTAKC%+ODC$Z5!mV^{9m~r@~)V`z&w+LfR+6VX5dHXHEuwON!?H}SO z@HIB;zV52`R(g}d>c`QIYtXp(nR)E=E|ui)C~;Cf0IG8CQJM*8!HAPCAeA zKs4bc_p&<4xB8D`txgYVweG00K@(Sov7?hTsdep=1`@0nE+_7cSrbCMk%QN7CsMA$$1ZOk{bo&B^aRy;#amuVBgHTFJ`6?fDghe(C{$Ul7;H|K< zO(UoHNXci%#D?r?buo5^NX;usvteh(^XWL%RU<6abE?HKhKs68(lA>Jf@03Jkc$O1 z1S*4V9Y%fNIn`n168g7LFENCt{Z;XD|WpV(vUVF49VBfsCbU~UZ z5ok-!vQ?ME0#rdF0S0;h-LUu3oRa5f(6YM_9y*lqC$+y{ zJ|;TC5Bp=cz>!=8N3s=(Y=^1izF+RAuoz6{N{m+i&J?Z~;z(k?QmqGCoLsz-gj2`+ zHFQs`D0VoDiqailloCq&qT~#(qQ;3o;1AxY?1=)tL_qt}FN>8vZb<36qtdmy!I#vm z)&i>JZ9Z>;Y_G(ZTnJy1c6><%TtG&A33a*@V2ii-i^_*xzOd-F-Q}`nCHD!ho_P^W zE_McnXDNFX%*!>V!R}+zwgZR1{SHpgq+A%n*+7eD!J+!p)cI$E*gq3c77jj#`xqOOr2(T};+=RG9E>3;Jp@U*qbd_&*~&AmIu-(iSPK?b7To$` zX5h{X7p`rd5;CT0H2X4W z?>j2l?l~ZbvMwD^kVtEnL9dB9)hH?Qu9X4Rb^5ADcaG?+H^cWlBk#j_Lpq6sH?zVV ztJ;t;!W&#w(&QuP6lA>x0E5_vAU+cB^O%%V+fm>@A-B8_-HMhRW@`px>ccg3x0rzWt>DrwM&3{{7D(I#+{tFa+maX~{THqOQ zGBFY#jb-{VWa>s2jdE*7JT{8Hq)dzDfH>LzO0DC{5e_XsM25mx$nUwC!*=A2ergV7 z4^PhyW)DiSo(mv&;Rs=yG0ezC<=L;jiSl*jTWX~Wxh-ojz|FGzO$rarKVUmR1#K(TgB2 z+(l}oVRrjUsB1?qD~zQJS&dwq2LeYfex z7rocsOY+tG978G}z)iGkAxh9PI8LcTmr~YjB<^J>L!}n&M-3{4-#N^~R*XY@@=tNr z{>zmP4|;1AZ(YdWG?NSsX;vf8qa0mh2(rTY+LT%MbCZ;BrxoSl*v$K~WU>4zc`)8u z;~puHOJwNf<&yV0n7z1E9YQ58Ie#aD0J)@UwF-r@QJE_FHot1lYUGkyCzp8bq_1=0 z%cgn@p~335a+vh68Liu#3eThYt$*1N>5eFI^Sodppq$qq4*V(m0R)o|VPoQ5)6caJ z5s~C!vkC`rasARW|G&*$31C#!xjuK6+{t8;41oaIV1NK22|FSpAR&N)1dxCTE-)km zL_>mE6m6@-YTcJwm*Or&QHx7)L$N@ub+6h@eJ<5jU#(SJtyXJQc;9!osBTd3VG1|j6FT)RV7&*4*ujvFH>0nipi62Gzi>Nm4v zxd|Tvda9|&6Mwm@S}Heml^BR#>}7_)KO>BHMw{f~eJtK1c&F;uhxZeccU`wW@%PLA zhCX7c#Z3paa3v{Xhi0SBGWu8y;HQDQ7^I8A2?6wg#Q%f9Ex(n1)pa+Ow0S#lDYKw6 zg*ChG6I^BagCvhy556-OVkyEV?KR5`v#ea2?KjE=%4I>OC}+PLnyvcQ&bEdaH?G*L zq{s$FJOSL1LeMD;34u@QI_B5`%3knzcbo!N453wWYNoV7XQeRAf`!wb ztT!wjvhV?)sM{kiQ#E>}OBNZ9x~ng5l6UpPHEN%5z%O8^PqdNpN@?7I%ZD1m$?Rn9 z$FCmu9IQDkb$Gy$mMMMdveQb4@=1*4h-^@*I*5KB8N}K@8i!?yF*%^w*lc`)2?sWx zY%xI>hakDHE)My1vq#!u2D@^P`59J{Za16gMbsoyXye2l)akr^ z(?pjGkH~b?WbBINjDS3-OC4`{;4EAnkO@~QoL2^o0ktj%i6Pq+BzA@0#hFqtUAJXQ z#t*fIXX|R>iXcryRDVK4sYmC5G8SQ%`2L0>J?`1cp0F z7l(zoNeDrtof-n`gvMc-h#csGL`WqEQ*V+Itz`zMC2glo&%O*-w1g?@U|Gq0>me1m z+IY1VtUo;FoJci$9T z`v>9v!MKWs!M1~lM|?)qP`HL;5qA;!69I`N%B`&0BlKz%SgKUUpJbY-%5vk#Hh4*XARk7m#vct*u1 zU6h98Z;O?!&1_O;EM6A@!@Iar^p|R7Bsn_(CAf-DwBln`&M9APzdV^1Bh}RUyJ__@ zV^YPA4VK6o< z*!Z0It#|ylKKRWH`k)=Yzfs@WMtyyujPfA!ly)CJz-^Cwbg5zcX8lTq@&!~(|AJ2M zD>xD`QTaDH9QU#fq{{F`p*KKUt34nPw@qA7 z{NR_lB4Bq`+jIH2pKbwvWueb!W?LIOQ_?E4AtLPJ%Wl5x;mgnY@;G09!Ivk3P-Fd) z`c-W@UU=zAzC6X3r}^@XE}o@(+b?zT93xTi{(M0Eii_0?0r4Vld5JH-4kFe4Z*|e2 zi{Ayr?-~Ar-(L>mr&j{v)g0u4e=Ue~-EZ*9o4WWz5W1wdvc=otj|BUt9EAJ5!A(4hW97oP^9+WH57{7e`B z(N54Yn}|uK)U92-EHWa z4+GfAHlAv6O>wN#kz*$wmZNv9TR*dj2gK(a9y~^%02pK5;<|+^>KE43&RQ{h(X3h6 z2h7C@XEMtP;@gctY`+Zkfd^2ATds1`8{Nuwzg<92X3I*6Gxs-`KhLUF0YU9^S{6mu zsm)G44%@X~4YoziEAS+DaCXAVaJ)2khMT0t7T%ZgoURxQ8%(eg#KEYsnns?6h$W|i zf$*`$CF{`>wDN-fVGEvyDJPP2DUkq#T`w1}K8-P?KtRqJoIS!+36Z_b7r8d3a;wg)IQU3cq&n$A3`ade>bxGpS~ z%WlaG$xP{C_SVM#P;X_52m0l%|4XW7il<30*8^!y-|U0pzAlxcCdB^-KI|qc`|Wt1 zP!t}xkB*7Ne>&pRtmi)$wprsm;?)edD#|Taq@0QM7 zLr7tBVn{^A$`C!F84`U#2!VjdhL~S61pj}$ti{PPLS=%IiVGRIpw6*&)^dTe4M@cZ zXjxtFQ~Q_JwhBb0Uy9=|#02A30VQ2GrG~UTq!!fjLt0qt zW#p6VZ`;gK?S}{6TD`5|xgJicxm)a#d z7;PMvP^Vb-Rt=s(1??&$K|?$x%_!{SMqw8KbTtIzkFz#CL6~$6=ePsWzHNvS=`b*J z9bJ;wVn~Z{q3ic$qCGb~=-9uHAVaXC$RY#zjrF{jiC-zsZB zA2Shvoou6x=7OhKf3T(kuw6$-VFPQu#KY3nI+qNCgpQ}2@~>|0Y)5(>(-YoJL!Ksm zz)Wk`q$cb$t|Vz$=BDgt_amGT4ajMXHOD%nXA`!+rZ15k3g%RozC>zR8fIB@a{|8F z-gGAR;@JDcx~_M$8l$YjDRgjzqlV350s z0hp_e);_u>YH&=Xr6C*NRnoNO^84}l4rv3wtM4b_J62}-8w3#f4jCl=dm~^#2$9zz zhsbw`B6u&L{1U(K6x;_72k(90HV?Lp>!(7MekRoYS-5&0(gOr4`-toZk!k@^ zj9Gk<*#L9-DX(&;$cN`>7%o=)&U_8M@Vx+u9149m@)(2O%L@81*+7vWNA4mQKMcO| zVqckopvccmg~;^aVY)(pWg&78_OGns*|0@>L^1v&@dJ&}J~$T(WDBHe;w*eS7KV*g zFsU@cDiMQO<78MRT45nR6+WZwAoJPqf!zr2+3$nM=OTmP`MC1}kl;cz_9CRLxfoY3 z!JPt52eP3|V}oyKGMvax2ch_hT|qO>d9o8|2|iDfpLXc;aLn3b*gnp{XJwf_4=~Qe zH~w}S&O9|?FrZSwI0-=xh5R$R%pb0cjT+*tVNc06db$gbpCeN@pg)k< z9)8MruZ0yocN0livaF!=VNu3l$&h(rfN>!U7yI8LbaWmw4(be+%v#Q9$*ijS1U02s zGBU#I$hp`HC*Ai)vf#nuYPbep15el=!xwv#q>wUK)y64Q3)-Cr^w{#mZ>r_|?Faac zt%Q$luW+8xp7U`L5(-|~o^2om$ukA$<(cS54D``J97B$gAX8#I0&id-f-7jmO-7@T zx5F|lWJ(WlD;lB>1@4bSfs1es{Qw*YT!{mLt8m87IB_q$)bEE^`UA32%41=Q(I_@0 zafMA`1G0p#m)?set_v|}6y`N}C+2>j<5R8x9GTKR0ta1lL@7Wx`dW^t1ZZ9%Xbq$9 z5(C^qbSpbHtFi>shkfIfBVFYd{RL?FgryI%;(d@Mr?2V*RUdyNbPuIx1s%u6DYwb1 zI0_ic%aP&VAqHb)44J3Z;hVNolr!pJ=yoyeAu*hnJUD8t0xs~==)0Y@S&ktOKI&!T z9uXsuWQ8BKdYrlmCvNz1R8~JJ`r*B5s|Zi_;fu~MMZVpNV<3tc$HZ5|_Zpd5=Is=t zSlwu3W}%nHNtlxYuyas;oI-tA;KJYr`-&>f0Zv)LbgD%1^>VX#Gx#-XE$Q9mgKM_w_h1)uz0Wd=jI8MxhIj#OMz zLFWYuE#Q_%+;ApaVooU6-7MI^b-3l5oO<=Jn85%gMPcN-ox03h+n7w?}y@j0p1V6`$D`QgZD+riC8bZ`O~L?8kcqm8tI)~=C#^#5s$UIyzmen z1ZF^MXH!oW8@qPIUGISvpu}TR2Ff(!}Fz` z$kdqN8}t#GPE4jrg?oDs8CD00!67VCD|Ex0po>P@5#SuZS|(O8><;j1mhSQgGq36? zOzt`er;fX5wTlx9K|_@tSNQX}7G!e?L1S=e2+}lyhBAn_KUEx-r0>NsTOlmAD%H!B z1DWTJYT+P4wvCaBP&L!DBF$hPD%|bH#%B^OnI5pp-s6 zJ&v)c&PH*&F`>0u7lr%9Y(wqlcDsqz;d4!08}9^$>tl^G&gh86Sx8a5b;&=XTcYg= zc0)azp|&Ha#1B9{A2h95)!y3N*%4b9?SMwn?v-q4yY};Vk2G3GWk$2(0emrI7sb{^ zn_8rAn-^I1l+M+zNh~lmfM_7Ok5nS=#}X$Z;P<6iof!775}|rz^Z}PRfeA7gOW+W! ztXR?ImHF6IX$-CKFxnrRU|$_J%KrJ4BXQ1PHjXl9bODY6L3&es$-!@-t)c|yL*y-k zw{Jdz8N<8rtza2G^~V00>cVjlOmJ*4-fOWl^UCPvi88d~Q`Gqxe)$~OeSy90zp!`y zH+)dPLc}=|`y>L! zxb$*ypN}2q7`*cnDWJ&+>VDL29U?p`wvg?gfFm*v;ffDNp@;&6mB1W;z#K#*zY=@P zagW^iYIG_#w|0SeHONJ2JkPT)fH$;*{nGNz0ejjXKik4A#;;G+(6spiX1-T{V0W;j#Ve6-bv5V=2M6v}I;C&3> zDrDaSe_aOnGq$4yyOUAaGSxz`h>D~$5SNG#i!Xwd#4;NX><33Q1N3aGXp;1U#GY`? z&xZ1J1YasC$5b(Vwn}G&XqNg7VWN2g0U>!}v@UQ~8K{Xb7qfn!nbw`Ep+SvP0UE^V3mZABMdOzWckD{%V51w z89tS~VuXTyTd}1tWAShV1w+JOK!?MBMvFVnt)W-|ai&}h#hll~^aCBej%)e>N(uYN z;d3xw$VqqtP%nHUukS72)fpX_rjYjgfmJY|YXN>IU(A=B9tIH)*}Yfsiz57>R9FLW zGDs<+GzNliL>S*?sL}Jm8_Mtv0AzLKKMc1}z?tGgaXj!Mm{F)7LlDR&O9~V(_9i9+ z9U=iM-7xt$0Y~Jo-d^761f*6d;!U#;uT+4U`enwGELd@L8W#|AB27J100-_?b!IE> z%DPm_#o^$t72vLwIK#UN@t4&iqRGHDP*1|O)DInCei%;a9KG^eH_z74=LLA?*k#AE#U37Z~t8M!J#VP+BW)pN9o9AKX3%@1-JW-{(Gh z+BcgjvHxYEa^XPdOTyPZiSLgkZy(CQf4uk@)mOnQBaqTkm%QJ?K-Dg1|2CAyE^eSB z`$}L1sm*>Q(YyoZjS1l7k_|F%EVkHg%=rBMS{)pllinFOBYsX(w701PdY6N;H~9!>tab z2|uL?B|{_wROWY+GBmjt3u<1ySllVBFsrlLt8hIk#`P?0?6@BJ@ZKBmWq41~zy9Xa zl|%1GxF^dPJec{|w68l_-yjs~H)KPzej{IQ;>*ptxP=BIdHGge*{q8#0nyDYG`I2l z?R?o9gqi71e!7b)la$rIEX%Lo>`*raEzdWdmhj`A|!$GX; zJNVcmy!>bmEc1`?wQHRuj=Bzg4k3d za`Z{@IWKAqm_OMHi@&LF?UCnVT<}997SHEJ;{1uBBZWE7S za|q{zgRiW3ObV@wcd%60 zBKiUtfK-dZn{a>Z9Kls_RVoyX2~BUZDwVQCbKG#_ZqM;Bey~` z+aFp8PBDGqVlJ zGZU*+8wTxK@pTAVbbQ(?b1;OEU%`tM2_YmpKuonB(gKX}4TiKFEfmsnwY(5?%(%Uc z7{pJBw@mB(2_#vog+p2|tw77b?xyt?pRr@ELX-pMZ|5;a*=uh>nokazs6 zTakMfR&A@%*g-BbEfQ&ry>=U|d$fm<5DP&qt*vdC!WA<|%*6g|F7}%OdW9k*%{4;OAy_fSfoKyP`nK3^GhBUr4I_3!u$~)lspfP z>@bFH5@YZoqKQ3X5DfBzX^A2$2)O)ytHAj)=%p*((c7#!-CZr%4Qni4EsI71o- z&P3OJ2daSYK?QTR7$G*oWZs2tI~S(n^U!q{Kp?&d{>v952;>rcx)jdim&1YeO87GW zNRoHv2Y(E7Z)155!FHS? zIp`rVesWe(7M#o{>qUAT-b3P$rMxfQvS%*_~Jw}8U8 zLKm|c4xd}#vCs_)--fAjJK)_3irxiicY>C8p)c-1AKVML4*>FZ!~on6%0DQnz6f)D z7`zfUqINH!jYO}VgNbn@xX<^|ds%>7jHl^oUV?krC*X{LeLnis16bKcI07}~Nc4-oLrhhQMY0yD9L3Q0!$~#>pYwdN8`t*8R-1N2#Xd9{C!u)Vg$DR(fQPxq zlX-occ*raR!KRTjgrAgW$}plFnF@k$o_1e!t4unC&WG1AJy!@R1xUAURZEG%cIJr*@AR z%EKLI*5GB9I^3ZQA2E&PArG@7%JfNc$rCh?-%UrzNxpak$o>J`_mAMve}b3GI|xyE z7t7I~F&zFPktYWp2R?l@!mD^_Zjrba!-ERmg_Z_|gfG9JJh$P;J}-varg%RNk@sS8 z>m!cbA?93mzsP0ZX>wUm(ISW8mg{iMgRxKNpkIgLeIeclq)Of-jY{o8!-mUr z08?eeMHgnaiBgS3iQ5BQgnEN-3LQUERMXuo4^C&ZtavKJNM1u{TN||z>ZfE)8n&PI z=jvk(PzBixP|>-9!yd74rK71Ly+fUVsDFYb8#o7i#}2Wg7Mx{ zi5DdTDVD?hw$dL0Qyj-#fYC(&aS*I7rp2cZ<`lE$(n@c_J;H#Siv`I~sN`n}fYKog zV;q@lf#z@vu-rH>kjp@F8SbM%Qv_Jk<&lyD$)sXYH%zO5X*Jq65*Uq=z?HmGWB~W! zS}~|XUQ`mVW|o0-K6p`=EEP#ODPQ6D*kL$1zv=j!E8j+)K=PESQLjaB{3cN<%h+XY)lNCYJjt>17bW5;0|KRpNNBMcxe)ofZ`}? zL~`)uaK2383rsABn8#T26e5w`u{Ngmt(dB*8&NPI%#Vds-_k}BgwiuMzjNIxI`79> zlP$X5*aUxT*RtVm%*sv@@GK2T1=>I$63W#xx3FTl;oWQ9qe~VCCM;W4(A3h<+}Rjg z9BYHBC5k`_HW$nnyZ;Rx^Hv*Yd?UL+qr5-aSa1Zm9=IIQFlhtk2y*r8oK~pFW$9{a z;zD2rV0h9mtuOL|3r}tk7zJ@=REV(~_zb=%ozQSx5|69H0embm0zRWewdmft6 z@N#68105etAZmNa96`ah*!t#ZL#&2ph)v2!TjJO`S0h^I#s6J#&UL zMKLl@;M;1j0*Wz=D%OaXjVlMhRdjo*WF0Hv}ASIBKo{ z(=@k$gSn#N8&A&~0Ir4p#Uc?g>Kua_$$pTK;9-${A3k}&cn!A!ux7$hGHaFrhrZc^ z)YDoe+Q#}j$TLykbsfA#=2ph%Fhy7o9I&UBdTtTJ_+=V>(0CIU9PDeo^5kJ&gUlGZ zPu@~mVtV4Ooan187NA+!))0$W-X||6NAwoTn9Sh)an3?a

*G#*3os|U}IFz!1JcMZce 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 YWP=KR2sey?+#&|SJ?J;XFd@YM0GGU0XaE2J diff --git a/settings/repository/net.sf/sam-1.52.944.xml b/settings/repository/net.sf/sam-1.52.944.xml deleted file mode 100644 index 2229395b2..000000000 --- a/settings/repository/net.sf/sam-1.52.944.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - From 0f44066640d75a05f456f0f5e7c4e5284076e368 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 25 Oct 2011 20:26:46 -0400 Subject: [PATCH 18/20] Ignore common files --- .gitignore | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..be613e7d6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +/*.bam +/*.bai +/*.bed +*.idx +*~ +/*.vcf +/*.txt +/*.csh +/.* +/*.pdf +/*.eval +*.ipr +*.iws +queueScatterGather +/foo* +/bar* +integrationtests/ From 221c944ee07e47688db54e36b7adc1cb488bb1c7 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 25 Oct 2011 20:29:17 -0400 Subject: [PATCH 19/20] Including private parts --- ivy.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ivy.xml b/ivy.xml index 0737b676d..96c1de844 100644 --- a/ivy.xml +++ b/ivy.xml @@ -10,7 +10,7 @@ - + From 05730884c637905680b04fadb06f1cdd037313b1 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 25 Oct 2011 20:29:35 -0400 Subject: [PATCH 20/20] More ignores --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index be613e7d6..744a93f45 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ queueScatterGather /foo* /bar* integrationtests/ +public/testdata/onTheFlyOutputTest.vcf \ No newline at end of file