1 Preprocessing Saccharomyces cerevisiae samples

The preprocessing of data consists of a few steps, which I will outline below. Most(all) of these steps are handled by a shell script (bin/process_all.sh) which calls a perl script (bin/process.pl) which in turn uses a perl library (bin/lib/HPGL.pm). These scripts help make sure I don’t make any mistakes when processing the data directories. Without them, I would likely make some boneheaded type-o’s and/or reverse filenames/directories and not realize it for hours/days. It is worth noting that I play with these constantly, and the copies in bin/ are likely not going to stay current for very long. For example, I have plans to make a version which simultaneously aligns using sailfish, tophat, and bwa at the same time.

process.pl creates some directories to help make this process a bit more transparent. The scripts/ directory contains a copy of every script before it is submitted to the compute nodes. I will copy an example of each script run into bin/. The outputs/ directory contains all the output from each script. The sequences/ directory contains a compressed copy of the important intermediate sequence files.

1.1 Data storage

I like to put a copy of the raw reads in the umiacs object store called ‘ceph’. I do this with the script ‘ceph_upload’ which has been copied into bin/

1.2 Data trimming

The purpose of data trimming is to remove bases which have low sequence quality and the portions of any reads for which the library adapters were included.

This is handled in process.pl. The actual tool used is trimomatic. I am copying one of the trimomatic submission scripts to bin/. It will be something like bin/trim-hpgl0566.sh

1.3 Sequence quality graphs

There are some tools which will examine the quality scores of all the bases of all the reads. I use a mix of fastqc and biopieces to generate some graphs to show that (hopefully) the raw sequence quality is good.

This is handled in process.pl. A copy will reside in bin/fastqc-something.sh

1.4 Alignment against the yeast genome

There are quite a few tools to align against the reference genome. The reference genome I am using is the Ensembl R64-1-1 release. Given that yeast has very few introns, tophat may not be needed, but I will likely use that anyway just because I’ve used it recently a lot.

If there is a preference, process.pl can currently handle bowtie1, bowtie2, and bwa. I will copy a script it generated into bin/tophat-something.sh

1.5 Counting reads

Assuming I don’t use tophat, process.pl will invoke samtools to convert the text alignments into a compressed, sorted, indexed binary format. If I do use tophat, the accepted_hits.bam is already sorted, so I will merely call htseq-count. process.pl does this and I will therefore leave a copy of its scripts in bin/htseq-something.sh

Note to self: the correct htseq-count invocation looks like: My original invocation had -t gene -i ID which is incorrect for yeast. So if I am going to rerun these, make sure to set the htseq options in process.pl.

htseq-count -q -f bam -s no -t CDS -i transcript_name
bowtie_out/hpgl0564_forward-trimmed-v0M1.bam
/cbcbhomes/abelew/libraries/genome/scerevisiae.gtf 1>bowtie_out/hpgl0564_forward-trimmed-v0M1.count

1.6 Cleaning up

Once these tasks are complete, the working directories for bowtie/tophat/whatever are no longer needed and so deleted, the raw sequences are compressed, and the trimmed sequences are saved to sequences/. The count tables are left behind with names like: hpgl-0xxx.count.gz. I will then copy them into the working tree for this project in the preprocessing/ directory and they will be used for the analyses which follow.

2 Copy reads to the working tree

I prefer to concatenate the multiple sequence files into a single file for each the forward(R1) and reverse(R2) sequences. Interestingly, for this data I decided to handle all steps in one shot with a single script which is invoked with 1 argument for each sample. The text of that script ‘copy_process.sh’ follows:

cd preprocessing
for i in $(/bin/ls hpgl*); do
  ./copy_process.sh ${i}
done

## startdir=$(pwd)
## for i in "$@"; do
##   cd $startdir
##   cyoa --task rnaseq --method copyraw --raw_dir "/cbcb/lab/nelsayed/raw_data/dinman" --hpgl ${i}
##   cd $i
##   inputs="${i}_forward.fastq.gz"
##   trimmed="${i}_forward-trimmed.fastq.gz"
##   cyoa --task rnaseq --method fastqc --input ${inputs}
##   cyoa --task rnaseq --method trimomatic --input ${inputs}
##   trim_id=$(cat last_job.txt)
##   cyoa --task rnaseq --method tophat --input ${trimmed} -s scerevisiae --depends "${trim_id}"
##   cd $startdir
## done

This process is therefore done in 6 steps: 1. Copy the raw data from Najib’s raw_data directory 2. Perform fastqc on the raw reads 3. Perform trimomatic 4. Align with tophat against the L.panamensis genome 5. Align with tophat against the L.braziliensis genome 6. Align with tophat against the H.sapiens genome

One small caveat, these sequences were created in two separate groups, hpgl0241-hpgl0322 and hpgl0630-hpgl0663.

3 Fastqc

The cyoa tool writes out a script which looks like the following:

## This FastQC run is against rnaseq data and is used for
## an initial estimation of the overall sequencing quality.
mkdir -p outputs/fastqc && \
  fastqc --extract -o outputs/fastqc hpgl0241_forward-trimmed.fastq \
  2>outputs/fastqc.out 1>&2

4 Trimomatic

The trimomatic script looks like: It is worth noting that in some cases, the illumina adapter removal results in a java exception. If that happens, rather than lose the data I made my cyoa script re-invoke trimomatic without the illumina clipping. In addition, if things need to be redone, then the sequences may in fact have been moved into the sequences/ directory and compressed with xz -9e, thus the if [[]] at the beginning testing for those files.

## Trimomatic_Pairwise: In case a trimming needs to be redone...
if [[ ! -r "hpgl0663_forward.fastq.gz" ]]; then
  if [[ -r "sequences/hpgl0663_forward.fastq.xz" ]]; then
    mv sequences/hpgl0663_forward.fastq.xz . && pxz -d hpgl0663_forward.fastq.xz && pigz hpgl0663_forward.fastq && mv sequences/hpgl0663_reverse.fastq.xz . &&
 pxz -d hpgl0663_reverse.fastq.xz && pigz hpgl0663_reverse.fastq
  else
    echo "Missing files. Did not find hpgl0663_forward.fastq.gz nor sequences/hpgl0663_forward.fastq.xz"
    exit 1
  fi
fi
trimomatic PE -threads 1 -phred33 hpgl0663_forward.fastq.gz hpgl0663_reverse.fastq.gz hpgl0663_forward-trimmed_paired.fastq.gz hpgl0663_forward-trimmed_unpair
ed.fastq.gz hpgl0663_reverse-trimmed_paired.fastq.gz hpgl0663_reverse-trimmed_unpaired.fastq.gz ILLUMINACLIP:/cbcbhomes/abelew/libraries/adapters.fa:2:20:4 SL
IDINGWINDOW:4:25 1>outputs/hpgl0663-trimomatic.out 2>&1
excepted=$(grep "Exception" outputs/hpgl0663-trimomatic.out)
## The following is in case the illumina clipping fails, which it does if this has already been run I think.
if [[ "${excepted}" != "" ]]; then
  trimomatic PE -threads 1 -phred33 hpgl0663_forward.fastq.gz hpgl0663_reverse.fastq.gz hpgl0663_forward-trimmed_paired.fastq.gz hpgl0663_forward-trimmed_unpa
ired.fastq.gz hpgl0663_reverse-trimmed_paired.fastq.gz hpgl0663_reverse-trimmed_unpaired.fastq.gz SLIDINGWINDOW:4:25 1>>outputs/hpgl0663-trimomatic.out 2>&1
fi
sleep 10
mv hpgl0663_forward-trimmed_paired.fastq.gz hpgl0663_forward-trimmed.fastq.gz && mv hpgl0663_reverse-trimmed_paired.fastq.gz hpgl0663_reverse-trimmed.fastq.gz

The end result should be a set of files with trimmed, paired sequences separated from unpaired sequences.

5 Tophat

The tophat process is actually a couple of steps rolled into one, the trimmed/paired reads are fed to tophat, then the accepted_hits.bam is tested for properly paired reads and those reads are separated into accepted_paired.bam. These 2 bam files are sorted and indexed, and finally passed to htseq. Thus the tophat scripts look like:

These scripts however, do not include the additional processing step which split the accepted_hits.bam into accepted_paired.bam I am not sure why, but these scripts are missing the following step which was performed but not properly logged:

if [ -r "${tophat_dir}/accepted_hits.bam" ]; then
  samtools view -b -f 2 ${tophat_dir}/accepted_hits.bam > ${tophat_dir}/accepted_paired.bam && samtools index ${tophat_dir}/accepted_paired.bam
fi

I know this step was performed, because the files accepted_paired.bam exists for each directory, but the option -f 2 says that the ‘2’ flag must be set, which is the flag for an alignment which is paired.

mkdir -p outputs/tophat_scerevisiae && tophat  -g 1  \
  -G /cbcbhomes/abelew/libraries/genome/scerevisiae.gff \
  --b2-very-sensitive -p 4 -o outputs/tophat_scerevisiae \
/cbcbhomes/abelew/libraries/genome/indexes/scerevisiae \
  hpgl0663_forward-trimmed.fastq.gz hpgl0663_reverse-trimmed.fastq.gz && \
  samtools sort -l 9 -n outputs/tophat_scerevisiae/accepted_hits.bam outputs/tophat_scerevisiae/accepted_sorted && \
  mv outputs/tophat_scerevisiae/accepted_sorted.bam outputs/tophat_scerevisiae/accepted_hits.bam && \
  samtools index outputs/tophat_scerevisiae/accepted_hits.bam && \
  samtools sort -l 9 -n outputs/tophat_scerevisiae/unmapped.bam outputs/tophat_scerevisiae/unmapped_sorted && \
  mv outputs/tophat_scerevisiae/unmapped_sorted.bam outputs/tophat_scerevisiae/unmapped.bam && \
  samtools index outputs/tophat_scerevisiae/unmapped.bam

6 Run htseq

The above scripts create sorted accepted_hits.bam files, I think that I manually made the accepted_paired.bam files and added those steps to the cyoa script post-facto, but the end result is the same and so I needed to run htseq on both:

## scripts/th_scerevisiae-hpgl0241.sh
## Counting the number of hits in outputs/tophat_scerevisiae/accepted_hits.bam for each feature found in /cbcbhomes/abelew/libraries/genome/scerevisiae.gff
## Is this stranded? no.  The defaults of htseq are:
##  --order=name --idattr=gene_id --minaqual=10 --type=exon --stranded=yes --mode=union
htseq-count -q -f bam -s no  -i ID  \
  outputs/tophat_scerevisiae/accepted_hits.bam /cbcbhomes/abelew/libraries/genome/scerevisiae.gff \
  1>outputs/tophat_scerevisiae/accepted_hits.count 2>outputs/tophat_scerevisiae/accepted_hits.error && \
    xz -9e outputs/tophat_scerevisiae/accepted_hits.count
## I am not going to belabor the point and print the htseq commands for all species.
LS0tCnRpdGxlOiAiUy5jZXJldmlzaWFlIDIwMTU6IFByZXByb2Nlc3NpbmcgUk5Bc2VxIHNhbXBsZXMuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiBodG1sX2RvY3VtZW50OgogIGNvZGVfZG93bmxvYWQ6IHRydWUKICBjb2RlX2ZvbGRpbmc6IHNob3cKICBmaWdfY2FwdGlvbjogdHJ1ZQogIGZpZ19oZWlnaHQ6IDcKICBmaWdfd2lkdGg6IDcKICBoaWdobGlnaHQ6IGRlZmF1bHQKICBrZWVwX21kOiBmYWxzZQogIG1vZGU6IHNlbGZjb250YWluZWQKICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHRoZW1lOiByZWFkYWJsZQogIHRvYzogdHJ1ZQogIHRvY19mbG9hdDoKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4OwogIH0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIGxpYnJhcnkoaHBnbHRvb2xzKQogIHR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQogIGtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTkwLAogICAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKICBrbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQ9OCwKICAgICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQogIG9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCiAgZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCiAgdmVyIDwtICIyMDE1MTEwMiIKICBwcmV2aW91c19maWxlIDwtICJpbmRleC5SbWQiCgogIHRtcCA8LSB0cnkoc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpKQogIHJtZF9maWxlIDwtICJwcmVwcm9jZXNzaW5nLlJtZCIKfQpgYGAKClByZXByb2Nlc3NpbmcgU2FjY2hhcm9teWNlcyBjZXJldmlzaWFlIHNhbXBsZXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIHByZXByb2Nlc3Npbmcgb2YgZGF0YSBjb25zaXN0cyBvZiBhIGZldyBzdGVwcywgd2hpY2ggSSB3aWxsCm91dGxpbmUgYmVsb3cuICBNb3N0KGFsbCkgb2YgdGhlc2Ugc3RlcHMgYXJlIGhhbmRsZWQgYnkgYSBzaGVsbApzY3JpcHQgKGJpbi9wcm9jZXNzX2FsbC5zaCkgd2hpY2ggY2FsbHMgYSBwZXJsIHNjcmlwdCAoYmluL3Byb2Nlc3MucGwpIHdoaWNoCmluIHR1cm4gdXNlcyBhIHBlcmwgbGlicmFyeSAoYmluL2xpYi9IUEdMLnBtKS4gIFRoZXNlIHNjcmlwdHMgaGVscCBtYWtlIHN1cmUgSQpkb24ndCBtYWtlIGFueSBtaXN0YWtlcyB3aGVuIHByb2Nlc3NpbmcgdGhlIGRhdGEgZGlyZWN0b3JpZXMuICBXaXRob3V0CnRoZW0sIEkgd291bGQgbGlrZWx5IG1ha2Ugc29tZSBib25laGVhZGVkIHR5cGUtbydzIGFuZC9vciByZXZlcnNlCmZpbGVuYW1lcy9kaXJlY3RvcmllcyBhbmQgbm90IHJlYWxpemUgaXQgZm9yIGhvdXJzL2RheXMuICBJdCBpcyB3b3J0aApub3RpbmcgdGhhdCBJIHBsYXkgd2l0aCB0aGVzZSBjb25zdGFudGx5LCBhbmQgdGhlIGNvcGllcyBpbiBiaW4vIGFyZQpsaWtlbHkgbm90IGdvaW5nIHRvIHN0YXkgY3VycmVudCBmb3IgdmVyeSBsb25nLiAgRm9yIGV4YW1wbGUsIEkgaGF2ZQpwbGFucyB0byBtYWtlIGEgdmVyc2lvbiB3aGljaCBzaW11bHRhbmVvdXNseSBhbGlnbnMgdXNpbmcgc2FpbGZpc2gsCnRvcGhhdCwgYW5kIGJ3YSBhdCB0aGUgc2FtZSB0aW1lLgoKcHJvY2Vzcy5wbCBjcmVhdGVzIHNvbWUgZGlyZWN0b3JpZXMgdG8gaGVscCBtYWtlIHRoaXMgcHJvY2VzcyBhIGJpdAptb3JlIHRyYW5zcGFyZW50LiAgVGhlIHNjcmlwdHMvIGRpcmVjdG9yeSBjb250YWlucyBhIGNvcHkgb2YgZXZlcnkKc2NyaXB0IGJlZm9yZSBpdCBpcyBzdWJtaXR0ZWQgdG8gdGhlIGNvbXB1dGUgbm9kZXMuICBJIHdpbGwgY29weSBhbgpleGFtcGxlIG9mIGVhY2ggc2NyaXB0IHJ1biBpbnRvIGJpbi8uICBUaGUgb3V0cHV0cy8gZGlyZWN0b3J5IGNvbnRhaW5zCmFsbCB0aGUgb3V0cHV0IGZyb20gZWFjaCBzY3JpcHQuICBUaGUgc2VxdWVuY2VzLyBkaXJlY3RvcnkgY29udGFpbnMgYQpjb21wcmVzc2VkIGNvcHkgb2YgdGhlIGltcG9ydGFudCBpbnRlcm1lZGlhdGUgc2VxdWVuY2UgZmlsZXMuCgojIyBEYXRhIHN0b3JhZ2UKCkkgbGlrZSB0byBwdXQgYSBjb3B5IG9mIHRoZSByYXcgcmVhZHMgaW4gdGhlIHVtaWFjcyBvYmplY3Qgc3RvcmUKY2FsbGVkICdjZXBoJy4gIEkgZG8gdGhpcyB3aXRoIHRoZSBzY3JpcHQgJ2NlcGhfdXBsb2FkJyB3aGljaCBoYXMgYmVlbgpjb3BpZWQgaW50byBiaW4vCgojIyBEYXRhIHRyaW1taW5nCgpUaGUgcHVycG9zZSBvZiBkYXRhIHRyaW1taW5nIGlzIHRvIHJlbW92ZSBiYXNlcyB3aGljaCBoYXZlIGxvdwpzZXF1ZW5jZSBxdWFsaXR5IGFuZCB0aGUgcG9ydGlvbnMgb2YgYW55IHJlYWRzIGZvciB3aGljaCB0aGUgbGlicmFyeQphZGFwdGVycyB3ZXJlIGluY2x1ZGVkLgoKVGhpcyBpcyBoYW5kbGVkIGluIHByb2Nlc3MucGwuICBUaGUgYWN0dWFsIHRvb2wgdXNlZCBpcyB0cmltb21hdGljLgpJIGFtIGNvcHlpbmcgb25lIG9mIHRoZSB0cmltb21hdGljIHN1Ym1pc3Npb24gc2NyaXB0cyB0byBiaW4vLiAgSXQKd2lsbCBiZSBzb21ldGhpbmcgbGlrZSBiaW4vdHJpbS1ocGdsMDU2Ni5zaAoKIyMgU2VxdWVuY2UgcXVhbGl0eSBncmFwaHMKClRoZXJlIGFyZSBzb21lIHRvb2xzIHdoaWNoIHdpbGwgZXhhbWluZSB0aGUgcXVhbGl0eSBzY29yZXMgb2YgYWxsIHRoZQpiYXNlcyBvZiBhbGwgdGhlIHJlYWRzLiAgSSB1c2UgYSBtaXggb2YgZmFzdHFjIGFuZCBiaW9waWVjZXMgdG8KZ2VuZXJhdGUgc29tZSBncmFwaHMgdG8gc2hvdyB0aGF0IChob3BlZnVsbHkpIHRoZSByYXcgc2VxdWVuY2UgcXVhbGl0eQppcyBnb29kLgoKVGhpcyBpcyBoYW5kbGVkIGluIHByb2Nlc3MucGwuICBBIGNvcHkgd2lsbCByZXNpZGUgaW4KYmluL2Zhc3RxYy1zb21ldGhpbmcuc2gKCiMjIEFsaWdubWVudCBhZ2FpbnN0IHRoZSB5ZWFzdCBnZW5vbWUKClRoZXJlIGFyZSBxdWl0ZSBhIGZldyB0b29scyB0byBhbGlnbiBhZ2FpbnN0IHRoZSByZWZlcmVuY2UgZ2Vub21lLgpUaGUgcmVmZXJlbmNlIGdlbm9tZSBJIGFtIHVzaW5nIGlzIHRoZSBFbnNlbWJsIFI2NC0xLTEgcmVsZWFzZS4KR2l2ZW4gdGhhdCB5ZWFzdCBoYXMgdmVyeSBmZXcgaW50cm9ucywgdG9waGF0IG1heSBub3QgYmUgbmVlZGVkLCBidXQgSQp3aWxsIGxpa2VseSB1c2UgdGhhdCBhbnl3YXkganVzdCBiZWNhdXNlIEkndmUgdXNlZCBpdCByZWNlbnRseSBhIGxvdC4KCklmIHRoZXJlIGlzIGEgcHJlZmVyZW5jZSwgcHJvY2Vzcy5wbCBjYW4gY3VycmVudGx5IGhhbmRsZSBib3d0aWUxLApib3d0aWUyLCBhbmQgYndhLiAgSSB3aWxsIGNvcHkgYSBzY3JpcHQgaXQgZ2VuZXJhdGVkIGludG8KYmluL3RvcGhhdC1zb21ldGhpbmcuc2gKCiMjIENvdW50aW5nIHJlYWRzCgpBc3N1bWluZyBJIGRvbid0IHVzZSB0b3BoYXQsIHByb2Nlc3MucGwgd2lsbCBpbnZva2Ugc2FtdG9vbHMgdG8KY29udmVydCB0aGUgdGV4dCBhbGlnbm1lbnRzIGludG8gYSBjb21wcmVzc2VkLCBzb3J0ZWQsIGluZGV4ZWQgYmluYXJ5CmZvcm1hdC4gIElmIEkgZG8gdXNlIHRvcGhhdCwgdGhlIGFjY2VwdGVkX2hpdHMuYmFtIGlzIGFscmVhZHkgc29ydGVkLApzbyBJIHdpbGwgbWVyZWx5IGNhbGwgaHRzZXEtY291bnQuICBwcm9jZXNzLnBsIGRvZXMgdGhpcyBhbmQgSSB3aWxsCnRoZXJlZm9yZSBsZWF2ZSBhIGNvcHkgb2YgaXRzIHNjcmlwdHMgaW4gYmluL2h0c2VxLXNvbWV0aGluZy5zaAoKTm90ZSB0byBzZWxmOiAgdGhlIGNvcnJlY3QgaHRzZXEtY291bnQgaW52b2NhdGlvbiBsb29rcyBsaWtlOgpNeSBvcmlnaW5hbCBpbnZvY2F0aW9uIGhhZCAtdCBnZW5lIC1pIElEIHdoaWNoIGlzIGluY29ycmVjdCBmb3IgeWVhc3QuClNvIGlmIEkgYW0gZ29pbmcgdG8gcmVydW4gdGhlc2UsIG1ha2Ugc3VyZSB0byBzZXQgdGhlIGh0c2VxIG9wdGlvbnMgaW4gcHJvY2Vzcy5wbC4KCj4gaHRzZXEtY291bnQgLXEgLWYgYmFtIC1zIG5vIC10IENEUyAtaSB0cmFuc2NyaXB0X25hbWUgXAo+IGJvd3RpZV9vdXQvaHBnbDA1NjRfZm9yd2FyZC10cmltbWVkLXYwTTEuYmFtIFwKPiAvY2JjYmhvbWVzL2FiZWxldy9saWJyYXJpZXMvZ2Vub21lL3NjZXJldmlzaWFlLmd0ZiAxPmJvd3RpZV9vdXQvaHBnbDA1NjRfZm9yd2FyZC10cmltbWVkLXYwTTEuY291bnQKCgojIyBDbGVhbmluZyB1cAoKT25jZSB0aGVzZSB0YXNrcyBhcmUgY29tcGxldGUsIHRoZSB3b3JraW5nIGRpcmVjdG9yaWVzIGZvcgpib3d0aWUvdG9waGF0L3doYXRldmVyIGFyZSBubyBsb25nZXIgbmVlZGVkIGFuZCBzbyBkZWxldGVkLCB0aGUgcmF3CnNlcXVlbmNlcyBhcmUgY29tcHJlc3NlZCwgYW5kIHRoZSB0cmltbWVkIHNlcXVlbmNlcyBhcmUgc2F2ZWQgdG8Kc2VxdWVuY2VzLy4gIFRoZSBjb3VudCB0YWJsZXMgYXJlIGxlZnQgYmVoaW5kIHdpdGggbmFtZXMgbGlrZToKaHBnbC0weHh4LmNvdW50Lmd6LiAgSSB3aWxsIHRoZW4gY29weSB0aGVtIGludG8gdGhlIHdvcmtpbmcgdHJlZSBmb3IKdGhpcyBwcm9qZWN0IGluIHRoZSBwcmVwcm9jZXNzaW5nLyBkaXJlY3RvcnkgYW5kIHRoZXkgd2lsbCBiZSB1c2VkIGZvcgp0aGUgYW5hbHlzZXMgd2hpY2ggZm9sbG93LgoKCiMgQ29weSByZWFkcyB0byB0aGUgd29ya2luZyB0cmVlCgpJIHByZWZlciB0byBjb25jYXRlbmF0ZSB0aGUgbXVsdGlwbGUgc2VxdWVuY2UgZmlsZXMgaW50byBhIHNpbmdsZSBmaWxlIGZvciBlYWNoIHRoZSBmb3J3YXJkKFIxKSBhbmQKcmV2ZXJzZShSMikgc2VxdWVuY2VzLiAgSW50ZXJlc3RpbmdseSwgZm9yIHRoaXMgZGF0YSBJIGRlY2lkZWQgdG8gaGFuZGxlIGFsbCBzdGVwcyBpbiBvbmUgc2hvdCB3aXRoCmEgc2luZ2xlIHNjcmlwdCB3aGljaCBpcyBpbnZva2VkIHdpdGggMSBhcmd1bWVudCBmb3IgZWFjaCBzYW1wbGUuICBUaGUgdGV4dCBvZiB0aGF0IHNjcmlwdAonY29weV9wcm9jZXNzLnNoJyBmb2xsb3dzOgoKYGBge3IgbWtkaXJzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPUZBTFNFfQpjZCBwcmVwcm9jZXNzaW5nCmZvciBpIGluICQoL2Jpbi9scyBocGdsKik7IGRvCiAgLi9jb3B5X3Byb2Nlc3Muc2ggJHtpfQpkb25lCgojIyBzdGFydGRpcj0kKHB3ZCkKIyMgZm9yIGkgaW4gIiRAIjsgZG8KIyMgICBjZCAkc3RhcnRkaXIKIyMgICBjeW9hIC0tdGFzayBybmFzZXEgLS1tZXRob2QgY29weXJhdyAtLXJhd19kaXIgIi9jYmNiL2xhYi9uZWxzYXllZC9yYXdfZGF0YS9kaW5tYW4iIC0taHBnbCAke2l9CiMjICAgY2QgJGkKIyMgICBpbnB1dHM9IiR7aX1fZm9yd2FyZC5mYXN0cS5neiIKIyMgICB0cmltbWVkPSIke2l9X2ZvcndhcmQtdHJpbW1lZC5mYXN0cS5neiIKIyMgICBjeW9hIC0tdGFzayBybmFzZXEgLS1tZXRob2QgZmFzdHFjIC0taW5wdXQgJHtpbnB1dHN9CiMjICAgY3lvYSAtLXRhc2sgcm5hc2VxIC0tbWV0aG9kIHRyaW1vbWF0aWMgLS1pbnB1dCAke2lucHV0c30KIyMgICB0cmltX2lkPSQoY2F0IGxhc3Rfam9iLnR4dCkKIyMgICBjeW9hIC0tdGFzayBybmFzZXEgLS1tZXRob2QgdG9waGF0IC0taW5wdXQgJHt0cmltbWVkfSAtcyBzY2VyZXZpc2lhZSAtLWRlcGVuZHMgIiR7dHJpbV9pZH0iCiMjICAgY2QgJHN0YXJ0ZGlyCiMjIGRvbmUKYGBgCgpUaGlzIHByb2Nlc3MgaXMgdGhlcmVmb3JlIGRvbmUgaW4gNiBzdGVwczoKMS4gIENvcHkgdGhlIHJhdyBkYXRhIGZyb20gTmFqaWIncyByYXdfZGF0YSBkaXJlY3RvcnkKMi4gIFBlcmZvcm0gZmFzdHFjIG9uIHRoZSByYXcgcmVhZHMKMy4gIFBlcmZvcm0gdHJpbW9tYXRpYwo0LiAgQWxpZ24gd2l0aCB0b3BoYXQgYWdhaW5zdCB0aGUgTC5wYW5hbWVuc2lzIGdlbm9tZQo1LiAgQWxpZ24gd2l0aCB0b3BoYXQgYWdhaW5zdCB0aGUgTC5icmF6aWxpZW5zaXMgZ2Vub21lCjYuICBBbGlnbiB3aXRoIHRvcGhhdCBhZ2FpbnN0IHRoZSBILnNhcGllbnMgZ2Vub21lCgpPbmUgc21hbGwgY2F2ZWF0LCB0aGVzZSBzZXF1ZW5jZXMgd2VyZSBjcmVhdGVkIGluIHR3byBzZXBhcmF0ZSBncm91cHMsIGhwZ2wwMjQxLWhwZ2wwMzIyIGFuZApocGdsMDYzMC1ocGdsMDY2My4KCiMgRmFzdHFjCgpUaGUgY3lvYSB0b29sIHdyaXRlcyBvdXQgYSBzY3JpcHQgd2hpY2ggbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgoKYGBge3IgZmFzdHFjX3NjcmlwdCwgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgVGhpcyBGYXN0UUMgcnVuIGlzIGFnYWluc3Qgcm5hc2VxIGRhdGEgYW5kIGlzIHVzZWQgZm9yCiMjIGFuIGluaXRpYWwgZXN0aW1hdGlvbiBvZiB0aGUgb3ZlcmFsbCBzZXF1ZW5jaW5nIHF1YWxpdHkuCm1rZGlyIC1wIG91dHB1dHMvZmFzdHFjICYmIFwKICBmYXN0cWMgLS1leHRyYWN0IC1vIG91dHB1dHMvZmFzdHFjIGhwZ2wwMjQxX2ZvcndhcmQtdHJpbW1lZC5mYXN0cSBcCiAgMj5vdXRwdXRzL2Zhc3RxYy5vdXQgMT4mMgpgYGAKCiMgVHJpbW9tYXRpYwoKVGhlIHRyaW1vbWF0aWMgc2NyaXB0IGxvb2tzIGxpa2U6Ckl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IGluIHNvbWUgY2FzZXMsIHRoZSBpbGx1bWluYSBhZGFwdGVyIHJlbW92YWwgcmVzdWx0cyBpbiBhIGphdmEgZXhjZXB0aW9uLiAgSWYKdGhhdCBoYXBwZW5zLCByYXRoZXIgdGhhbiBsb3NlIHRoZSBkYXRhIEkgbWFkZSBteSBjeW9hIHNjcmlwdCByZS1pbnZva2UgdHJpbW9tYXRpYyB3aXRob3V0IHRoZQppbGx1bWluYSBjbGlwcGluZy4gIEluIGFkZGl0aW9uLCBpZiB0aGluZ3MgbmVlZCB0byBiZSByZWRvbmUsIHRoZW4gdGhlIHNlcXVlbmNlcyBtYXkgaW4gZmFjdCBoYXZlCmJlZW4gbW92ZWQgaW50byB0aGUgc2VxdWVuY2VzLyBkaXJlY3RvcnkgYW5kIGNvbXByZXNzZWQgd2l0aCB4eiAtOWUsIHRodXMgdGhlIGlmIFtbXV0gYXQgdGhlCmJlZ2lubmluZyB0ZXN0aW5nIGZvciB0aG9zZSBmaWxlcy4KCmBgYHtyIHRyaW1vbWF0aWNfc2NyaXB0LCBlbmdpbmU9J2Jhc2gnLCBldmFsPUZBTFNFfQojIyBUcmltb21hdGljX1BhaXJ3aXNlOiBJbiBjYXNlIGEgdHJpbW1pbmcgbmVlZHMgdG8gYmUgcmVkb25lLi4uCmlmIFtbICEgLXIgImhwZ2wwNjYzX2ZvcndhcmQuZmFzdHEuZ3oiIF1dOyB0aGVuCiAgaWYgW1sgLXIgInNlcXVlbmNlcy9ocGdsMDY2M19mb3J3YXJkLmZhc3RxLnh6IiBdXTsgdGhlbgogICAgbXYgc2VxdWVuY2VzL2hwZ2wwNjYzX2ZvcndhcmQuZmFzdHEueHogLiAmJiBweHogLWQgaHBnbDA2NjNfZm9yd2FyZC5mYXN0cS54eiAmJiBwaWd6IGhwZ2wwNjYzX2ZvcndhcmQuZmFzdHEgJiYgbXYgc2VxdWVuY2VzL2hwZ2wwNjYzX3JldmVyc2UuZmFzdHEueHogLiAmJgogcHh6IC1kIGhwZ2wwNjYzX3JldmVyc2UuZmFzdHEueHogJiYgcGlneiBocGdsMDY2M19yZXZlcnNlLmZhc3RxCiAgZWxzZQogICAgZWNobyAiTWlzc2luZyBmaWxlcy4gRGlkIG5vdCBmaW5kIGhwZ2wwNjYzX2ZvcndhcmQuZmFzdHEuZ3ogbm9yIHNlcXVlbmNlcy9ocGdsMDY2M19mb3J3YXJkLmZhc3RxLnh6IgogICAgZXhpdCAxCiAgZmkKZmkKdHJpbW9tYXRpYyBQRSAtdGhyZWFkcyAxIC1waHJlZDMzIGhwZ2wwNjYzX2ZvcndhcmQuZmFzdHEuZ3ogaHBnbDA2NjNfcmV2ZXJzZS5mYXN0cS5neiBocGdsMDY2M19mb3J3YXJkLXRyaW1tZWRfcGFpcmVkLmZhc3RxLmd6IGhwZ2wwNjYzX2ZvcndhcmQtdHJpbW1lZF91bnBhaXIKZWQuZmFzdHEuZ3ogaHBnbDA2NjNfcmV2ZXJzZS10cmltbWVkX3BhaXJlZC5mYXN0cS5neiBocGdsMDY2M19yZXZlcnNlLXRyaW1tZWRfdW5wYWlyZWQuZmFzdHEuZ3ogSUxMVU1JTkFDTElQOi9jYmNiaG9tZXMvYWJlbGV3L2xpYnJhcmllcy9hZGFwdGVycy5mYToyOjIwOjQgU0wKSURJTkdXSU5ET1c6NDoyNSAxPm91dHB1dHMvaHBnbDA2NjMtdHJpbW9tYXRpYy5vdXQgMj4mMQpleGNlcHRlZD0kKGdyZXAgIkV4Y2VwdGlvbiIgb3V0cHV0cy9ocGdsMDY2My10cmltb21hdGljLm91dCkKIyMgVGhlIGZvbGxvd2luZyBpcyBpbiBjYXNlIHRoZSBpbGx1bWluYSBjbGlwcGluZyBmYWlscywgd2hpY2ggaXQgZG9lcyBpZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gcnVuIEkgdGhpbmsuCmlmIFtbICIke2V4Y2VwdGVkfSIgIT0gIiIgXV07IHRoZW4KICB0cmltb21hdGljIFBFIC10aHJlYWRzIDEgLXBocmVkMzMgaHBnbDA2NjNfZm9yd2FyZC5mYXN0cS5neiBocGdsMDY2M19yZXZlcnNlLmZhc3RxLmd6IGhwZ2wwNjYzX2ZvcndhcmQtdHJpbW1lZF9wYWlyZWQuZmFzdHEuZ3ogaHBnbDA2NjNfZm9yd2FyZC10cmltbWVkX3VucGEKaXJlZC5mYXN0cS5neiBocGdsMDY2M19yZXZlcnNlLXRyaW1tZWRfcGFpcmVkLmZhc3RxLmd6IGhwZ2wwNjYzX3JldmVyc2UtdHJpbW1lZF91bnBhaXJlZC5mYXN0cS5neiBTTElESU5HV0lORE9XOjQ6MjUgMT4+b3V0cHV0cy9ocGdsMDY2My10cmltb21hdGljLm91dCAyPiYxCmZpCnNsZWVwIDEwCm12IGhwZ2wwNjYzX2ZvcndhcmQtdHJpbW1lZF9wYWlyZWQuZmFzdHEuZ3ogaHBnbDA2NjNfZm9yd2FyZC10cmltbWVkLmZhc3RxLmd6ICYmIG12IGhwZ2wwNjYzX3JldmVyc2UtdHJpbW1lZF9wYWlyZWQuZmFzdHEuZ3ogaHBnbDA2NjNfcmV2ZXJzZS10cmltbWVkLmZhc3RxLmd6CmBgYAoKVGhlIGVuZCByZXN1bHQgc2hvdWxkIGJlIGEgc2V0IG9mIGZpbGVzIHdpdGggdHJpbW1lZCwgcGFpcmVkIHNlcXVlbmNlcyBzZXBhcmF0ZWQgZnJvbSB1bnBhaXJlZApzZXF1ZW5jZXMuCgojIFRvcGhhdAoKVGhlIHRvcGhhdCBwcm9jZXNzIGlzIGFjdHVhbGx5IGEgY291cGxlIG9mIHN0ZXBzIHJvbGxlZCBpbnRvIG9uZSwgdGhlIHRyaW1tZWQvcGFpcmVkIHJlYWRzIGFyZSBmZWQKdG8gdG9waGF0LCB0aGVuIHRoZSBhY2NlcHRlZF9oaXRzLmJhbSBpcyB0ZXN0ZWQgZm9yIHByb3Blcmx5IHBhaXJlZCByZWFkcyBhbmQgdGhvc2UgcmVhZHMgYXJlCnNlcGFyYXRlZCBpbnRvIGFjY2VwdGVkX3BhaXJlZC5iYW0uICBUaGVzZSAyIGJhbSBmaWxlcyBhcmUgc29ydGVkIGFuZCBpbmRleGVkLCBhbmQgZmluYWxseSBwYXNzZWQgdG8KaHRzZXEuICBUaHVzIHRoZSB0b3BoYXQgc2NyaXB0cyBsb29rIGxpa2U6CgpUaGVzZSBzY3JpcHRzIGhvd2V2ZXIsIGRvIG5vdCBpbmNsdWRlIHRoZSBhZGRpdGlvbmFsIHByb2Nlc3Npbmcgc3RlcCB3aGljaCBzcGxpdCB0aGUKYWNjZXB0ZWRfaGl0cy5iYW0gaW50byBhY2NlcHRlZF9wYWlyZWQuYmFtICBJIGFtIG5vdCBzdXJlIHdoeSwgYnV0IHRoZXNlIHNjcmlwdHMgYXJlIG1pc3NpbmcgdGhlCmZvbGxvd2luZyBzdGVwIHdoaWNoIHdhcyBwZXJmb3JtZWQgYnV0IG5vdCBwcm9wZXJseSBsb2dnZWQ6CgpgYGB7ciBwYWlyZWRfaGl0cywgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KaWYgWyAtciAiJHt0b3BoYXRfZGlyfS9hY2NlcHRlZF9oaXRzLmJhbSIgXTsgdGhlbgogIHNhbXRvb2xzIHZpZXcgLWIgLWYgMiAke3RvcGhhdF9kaXJ9L2FjY2VwdGVkX2hpdHMuYmFtID4gJHt0b3BoYXRfZGlyfS9hY2NlcHRlZF9wYWlyZWQuYmFtICYmIHNhbXRvb2xzIGluZGV4ICR7dG9waGF0X2Rpcn0vYWNjZXB0ZWRfcGFpcmVkLmJhbQpmaQpgYGAKCkkga25vdyB0aGlzIHN0ZXAgd2FzIHBlcmZvcm1lZCwgYmVjYXVzZSB0aGUgZmlsZXMgYWNjZXB0ZWRfcGFpcmVkLmJhbSBleGlzdHMgZm9yIGVhY2ggZGlyZWN0b3J5LCBidXQKdGhlIG9wdGlvbiAtZiAyIHNheXMgdGhhdCB0aGUgJzInIGZsYWcgbXVzdCBiZSBzZXQsIHdoaWNoIGlzIHRoZSBmbGFnIGZvciBhbiBhbGlnbm1lbnQgd2hpY2ggaXMKcGFpcmVkLgoKYGBge3IgdG9waGF0X3J1bnMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9RkFMU0V9Cm1rZGlyIC1wIG91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlICYmIHRvcGhhdCAgLWcgMSAgXAogIC1HIC9jYmNiaG9tZXMvYWJlbGV3L2xpYnJhcmllcy9nZW5vbWUvc2NlcmV2aXNpYWUuZ2ZmIFwKICAtLWIyLXZlcnktc2Vuc2l0aXZlIC1wIDQgLW8gb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUgXAovY2JjYmhvbWVzL2FiZWxldy9saWJyYXJpZXMvZ2Vub21lL2luZGV4ZXMvc2NlcmV2aXNpYWUgXAogIGhwZ2wwNjYzX2ZvcndhcmQtdHJpbW1lZC5mYXN0cS5neiBocGdsMDY2M19yZXZlcnNlLXRyaW1tZWQuZmFzdHEuZ3ogJiYgXAogIHNhbXRvb2xzIHNvcnQgLWwgOSAtbiBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS9hY2NlcHRlZF9oaXRzLmJhbSBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS9hY2NlcHRlZF9zb3J0ZWQgJiYgXAogIG12IG91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlL2FjY2VwdGVkX3NvcnRlZC5iYW0gb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvYWNjZXB0ZWRfaGl0cy5iYW0gJiYgXAogIHNhbXRvb2xzIGluZGV4IG91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlL2FjY2VwdGVkX2hpdHMuYmFtICYmIFwKICBzYW10b29scyBzb3J0IC1sIDkgLW4gb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvdW5tYXBwZWQuYmFtIG91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlL3VubWFwcGVkX3NvcnRlZCAmJiBcCiAgbXYgb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvdW5tYXBwZWRfc29ydGVkLmJhbSBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS91bm1hcHBlZC5iYW0gJiYgXAogIHNhbXRvb2xzIGluZGV4IG91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlL3VubWFwcGVkLmJhbQpgYGAKCiMgUnVuIGh0c2VxCgpUaGUgYWJvdmUgc2NyaXB0cyBjcmVhdGUgc29ydGVkIGFjY2VwdGVkX2hpdHMuYmFtIGZpbGVzLCBJIHRoaW5rIHRoYXQgSSBtYW51YWxseSBtYWRlIHRoZQphY2NlcHRlZF9wYWlyZWQuYmFtIGZpbGVzIGFuZCBhZGRlZCB0aG9zZSBzdGVwcyB0byB0aGUgY3lvYSBzY3JpcHQgcG9zdC1mYWN0bywgYnV0IHRoZSBlbmQgcmVzdWx0IGlzCnRoZSBzYW1lIGFuZCBzbyBJIG5lZWRlZCB0byBydW4gaHRzZXEgb24gYm90aDoKCmBgYHtyIGh0c2VxX2ludm9jYXRpb25zLCBlbmdpbmU9J2Jhc2gnLCBldmFsPUZBTFNFfQojIyBzY3JpcHRzL3RoX3NjZXJldmlzaWFlLWhwZ2wwMjQxLnNoCiMjIENvdW50aW5nIHRoZSBudW1iZXIgb2YgaGl0cyBpbiBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS9hY2NlcHRlZF9oaXRzLmJhbSBmb3IgZWFjaCBmZWF0dXJlIGZvdW5kIGluIC9jYmNiaG9tZXMvYWJlbGV3L2xpYnJhcmllcy9nZW5vbWUvc2NlcmV2aXNpYWUuZ2ZmCiMjIElzIHRoaXMgc3RyYW5kZWQ/IG5vLiAgVGhlIGRlZmF1bHRzIG9mIGh0c2VxIGFyZToKIyMgIC0tb3JkZXI9bmFtZSAtLWlkYXR0cj1nZW5lX2lkIC0tbWluYXF1YWw9MTAgLS10eXBlPWV4b24gLS1zdHJhbmRlZD15ZXMgLS1tb2RlPXVuaW9uCmh0c2VxLWNvdW50IC1xIC1mIGJhbSAtcyBubyAgLWkgSUQgIFwKICBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS9hY2NlcHRlZF9oaXRzLmJhbSAvY2JjYmhvbWVzL2FiZWxldy9saWJyYXJpZXMvZ2Vub21lL3NjZXJldmlzaWFlLmdmZiBcCiAgMT5vdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS9hY2NlcHRlZF9oaXRzLmNvdW50IDI+b3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvYWNjZXB0ZWRfaGl0cy5lcnJvciAmJiBcCiAgICB4eiAtOWUgb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvYWNjZXB0ZWRfaGl0cy5jb3VudAojIyBJIGFtIG5vdCBnb2luZyB0byBiZWxhYm9yIHRoZSBwb2ludCBhbmQgcHJpbnQgdGhlIGh0c2VxIGNvbW1hbmRzIGZvciBhbGwgc3BlY2llcy4KYGBgCg==