Before you start

  1. Check the github page for this document.
  2. If you would like to follow this practical from your own machine, you may need to install some of the software tools (follow relevant links) or linux commands.
  3. If 2 is true, you may also need to set up your $PATH environment variable

Aims

  1. To prepare other classes ahead
  2. To gain confidence
  • of processing RNA-Seq data files
  • or linux (or unix) command lines

You will learn

  1. Various file formats
  1. Accessing public or published data
  1. And related linux commands and software tools

You will NOT learn (from me)

  1. Various RNA-Seq data processing and analysis, such as
  • Quality controls of sequenced reads
  • Adaptor (and/or poor quality read) trimming
  • Alignment (mapping) of reads
  • Quantification of transcript-level (or gene-level) abundance
  • Differentially expressed gene/transcript/exon analysis
  • Transcriptome reconstruction (or assembly)
  1. Detailed use of software tools related with above

File Formats

https://genome.ucsc.edu/FAQ/FAQformat

FASTA

wget ftp://ftp.ensembl.org/pub/release-95/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.22.fa.gz
zless Homo_sapiens.GRCh38.dna.chromosome.22.fa.gz | head -n5
>22 dna:chromosome chromosome:GRCh38:22:1:50818468:1 REF
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
zcat Homo_sapiens.GRCh38.dna.chromosome.22.fa.gz | awk '!/^>/{LEN+=length($0)}END{print LEN}' 
50818468
zcat Homo_sapiens.GRCh38.dna.chromosome.22.fa.gz | awk 'BEGIN{min=50818468;max=0;start=40000001;end=40000300}!/^>/{LEN+=length($0); if(LEN>=start && LEN-length($0)+1<=end){min=(min>LEN-length($0)+1)?LEN-length($0)+1:min; max=(max>LEN)?max:LEN; SEQ=SEQ$0; print LEN-length($0)+1,LEN,$0,length($0)} }END{print substr(SEQ,start-min+1,end-start+1)}'
39999961 40000020 TTGGGAGAGTGCATTTGACCCTCCTGGATTGGGAACTTTGGAAAAGAGAGACTGGCTTAC 60
40000021 40000080 TCTCTCAGTTTCCTTTCCGGTACCCGAACAGTGCTCTGACTGTCACAGGTGATCAATTAT 60
40000081 40000140 CTGTTTATAGAATTGAAAACTGTCTTCTATTGGCCGCCTGTCCCTCTGGGGAAGCAAGTG 60
40000141 40000200 TCTGGAGATGTCCCCATGGAATTGCACATTCCCTGGGGAACTCCTTTAATCTACATCGTA 60
40000201 40000260 ACAAGCTGGCTGGCAGCAGAGAGAAGAATGCTCTAAATTGGGGATATGGGGTGCAGGGAG 60
40000261 40000320 GGAGGTGCATCAGGGGATTTAGGGAAAGGCTCCAGAGCAGGAGGCATGGCTGGCTGAGGT 60
GAAAAGAGAGACTGGCTTACTCTCTCAGTTTCCTTTCCGGTACCCGAACAGTGCTCTGACTGTCACAGGTGATCAATTATCTGTTTATAGAATTGAAAACTGTCTTCTATTGGCCGCCTGTCCCTCTGGGGAAGCAAGTGTCTGGAGATGTCCCCATGGAATTGCACATTCCCTGGGGAACTCCTTTAATCTACATCGTAACAAGCTGGCTGGCAGCAGAGAGAAGAATGCTCTAAATTGGGGATATGGGGTGCAGGGAGGGAGGTGCATCAGGGGATTTAGGGAAAGGCTCCAGAGCAG
curl https://rest.ensembl.org/sequence/region/human/22:40000001..40000300:1?content-type=text/plain
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   300  100   300    0     0   2882      0 --:--:-- --:--:-- --:--:--  2912
GAAAAGAGAGACTGGCTTACTCTCTCAGTTTCCTTTCCGGTACCCGAACAGTGCTCTGACTGTCACAGGTGATCAATTATCTGTTTATAGAATTGAAAACTGTCTTCTATTGGCCGCCTGTCCCTCTGGGGAAGCAAGTGTCTGGAGATGTCCCCATGGAATTGCACATTCCCTGGGGAACTCCTTTAATCTACATCGTAACAAGCTGGCTGGCAGCAGAGAGAAGAATGCTCTAAATTGGGGATATGGGGTGCAGGGAGGGAGGTGCATCAGGGGATTTAGGGAAAGGCTCCAGAGCAG
  • Task 3: what is the sequence of 40000001 to 40000100 of chr21 (using both awk and curl)?
curl https://rest.ensembl.org/sequence/region/human/21:40000001..40000100:1?content-type=text/plain
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   100  100   100    0     0   1209      0 --:--:-- --:--:-- --:--:--  1219
GTCTTCCTGACTTCCAAGGTTGCCATGAATCCTTGGTGTTCCTTGGCTTGCAGATGCATTGCCATCTTCCCTGCTTGTCAGTCTGTGTTTCCTTCTTCTT

FASTQ

wget https://www.dropbox.com/s/h2lzzn94o9zpv26/SLX-9168.D701_D501_1K.C6H3UANXX.s_1.r_1.fq.gz
  • Question: how many entries (it’s abvious)
zcat  SLX-9168.D701_D501_1K.C6H3UANXX.s_1.r_1.fq.gz | echo $((`wc -l`/4))
1000
  • Let’s look at the first entry (i.e. the first 4 lines) and check the meta information
zcat SLX-9168.D701_D501_1K.C6H3UANXX.s_1.r_1.fq.gz | head -n4
@HISEQ:249:C6H3UANXX:1:1101:1452:2086 1:N:0:NTTACTCGNATAGCCT
NTTTCCAAAAAAATGAAACACACATTAGATATAAACCATCCAAAACTTTAACGATTGAAAACTGTATTCAAAATTAAATGACCCAGAGTAGGTCTCTTTCTGAAAAGTTCCCTTCATATCGGCAA
+
#==AAFGFFEGFDGFCF1<:CF>FGGCEGGGG>G>FBFGGEG@F@FGG1<1FEFGGGG1EGGGGGGGGGGGGCGGFDEGGEE>FD:0FFF::FFGGGGGGGEGGG0ECGGGGDGGG>FGF<8CAG
  • Question: sequencing length?
zless SLX-9168.D701_D501_1K.C6H3UANXX.s_1.r_1.fq.gz | head -n 4 | awk 'NR%4==2{print length($0)}'
125
  • Check the base quality of the read above from the samformat.info

  • Check the base quality using fastqc

fastqc SLX-9168.D701_D501_1K.C6H3UANXX.s_1.r_1.fq.gz
  • Downlaod the first 1K spots from the smallest RNA-Seq fastq files from SRR6481086 (you may need to install the sra toolkit)
fastq-dump -X 1000 --split-files --read-filter pass --outdir ./ --gzip SRR6481086 
zcat SRR6481086_pass_1.fastq.gz | echo $((`wc -l`/4))
zcat SRR6481086_pass_2.fastq.gz | echo $((`wc -l`/4))
1000
1000
  • Let’s look at the fist 8 lines
zcat SRR6481086_pass_1.fastq.gz | head -n8
@SRR6481086.1 1 length=75
GGCCATGCAAGATTCCCATTCTTGCGACCCGGGTTCGTTTCCCGGGCGGCGCACCAGATCGGAAGAGCACACGNC
+SRR6481086.1 1 length=75
AAAAAEEEA/EAEEEEE6EEEEEEEEAEEEEEEEEEEEEEEEEEEEEEEEEE/EEEE6EEEE6AE6EEEEEEE#E
@SRR6481086.2 2 length=75
GAAGAGCACACGTCTGAACTCCAGTCACTAATGCGCATCTCGTATGCCGTCTTCTGCTTGAAAAAAAAAAGGGNG
+SRR6481086.2 2 length=75
AAAA/EE/E6EEEEEE66EEEE/EEE/EEE6EEEAE/A6EEEE6EEEEEE6EEAEE/EEEEEE6EEEEE//AE#E
zcat SRR6481086_pass_2.fastq.gz | head -n8
@SRR6481086.1 1 length=75
GGTGCGCCGCCCNGGCCCCGCNNNCGNGTCGCCCGCCTNNNCNTCTTGCCTGNNCCGCTCGGCCGCGCGTCGTGT
+SRR6481086.1 1 length=75
AAAAAEEEEEEE#EEA//EEE###EE#EEEE/EEEE/E###/#EAEEE//EE##AAEAE/EEA/EEE/EE/E/EA
@SRR6481086.2 2 length=75
GGGGGGGGGGGGNGGGGGGGGNNNGGNGGGGGGGGGGGNNNGNGGGGGGGGGNNGGGGGGGGGGGGGGGGGGGGG
+SRR6481086.2 2 length=75
AAAAAEEEEEEE#EEEEEEEE###EE#EEEEEEEEEEE###E#EEAEAEEEE##EEEEEEEEEEEEEAAAEEAAE
fastqc SRR6481086_pass_1.fastq.gz SRR6481086_pass_2.fastq.gz

GTF (GFF)

wget ftp://ftp.ensembl.org/pub/release-95/gtf/homo_sapiens/Homo_sapiens.GRCh38.95.gtf.gz
  • How many genes and transcripts?
zcat Homo_sapiens.GRCh38.95.gtf.gz | awk '$3=="gene"{GENE++}$3=="transcript"{TRANS++}$3=="exon"{EXON++}END{print GENE,TRANS,EXON}'
58735 206601 1262162
  • What else in the file?
zcat Homo_sapiens.GRCh38.95.gtf.gz | awk '!/^#/{print $3}' | sort | uniq -c | sort -k1,1n
    120 Selenocysteine
  58735 gene
  78562 stop_codon
  86454 start_codon
 148491 three_prime_utr
 149930 five_prime_utr
 206601 transcript
 746504 CDS
1262162 exon
  • Read the first 10 lines (excluding comments (i.e. ‘#’)) using Bioconductor rtracklayer package
# start your R session using 'R' command from the terminal
rtracklayer::import(format="gtf", text=system("zcat Homo_sapiens.GRCh38.95.gtf.gz | grep -v ^# | head -n 10", intern=T))
Warning in readGFF(filepath, version = version, filter = filter): connection is not positioned at the start of the file, rewinding
  it
GRanges object with 10 ranges and 19 metadata columns:
       seqnames         ranges strand |   source       type     score
          <Rle>      <IRanges>  <Rle> | <factor>   <factor> <numeric>
   [1]        1 [11869, 14409]      + |   havana       gene      <NA>
   [2]        1 [11869, 14409]      + |   havana transcript      <NA>
   [3]        1 [11869, 12227]      + |   havana       exon      <NA>
   [4]        1 [12613, 12721]      + |   havana       exon      <NA>
   [5]        1 [13221, 14409]      + |   havana       exon      <NA>
   [6]        1 [12010, 13670]      + |   havana transcript      <NA>
   [7]        1 [12010, 12057]      + |   havana       exon      <NA>
   [8]        1 [12179, 12227]      + |   havana       exon      <NA>
   [9]        1 [12613, 12697]      + |   havana       exon      <NA>
  [10]        1 [12975, 13052]      + |   havana       exon      <NA>
           phase         gene_id gene_version   gene_name gene_source
       <integer>     <character>  <character> <character> <character>
   [1]      <NA> ENSG00000223972            5     DDX11L1      havana
   [2]      <NA> ENSG00000223972            5     DDX11L1      havana
   [3]      <NA> ENSG00000223972            5     DDX11L1      havana
   [4]      <NA> ENSG00000223972            5     DDX11L1      havana
   [5]      <NA> ENSG00000223972            5     DDX11L1      havana
   [6]      <NA> ENSG00000223972            5     DDX11L1      havana
   [7]      <NA> ENSG00000223972            5     DDX11L1      havana
   [8]      <NA> ENSG00000223972            5     DDX11L1      havana
   [9]      <NA> ENSG00000223972            5     DDX11L1      havana
  [10]      <NA> ENSG00000223972            5     DDX11L1      havana
                             gene_biotype   transcript_id
                              <character>     <character>
   [1] transcribed_unprocessed_pseudogene            <NA>
   [2] transcribed_unprocessed_pseudogene ENST00000456328
   [3] transcribed_unprocessed_pseudogene ENST00000456328
   [4] transcribed_unprocessed_pseudogene ENST00000456328
   [5] transcribed_unprocessed_pseudogene ENST00000456328
   [6] transcribed_unprocessed_pseudogene ENST00000450305
   [7] transcribed_unprocessed_pseudogene ENST00000450305
   [8] transcribed_unprocessed_pseudogene ENST00000450305
   [9] transcribed_unprocessed_pseudogene ENST00000450305
  [10] transcribed_unprocessed_pseudogene ENST00000450305
       transcript_version transcript_name transcript_source
              <character>     <character>       <character>
   [1]               <NA>            <NA>              <NA>
   [2]                  2     DDX11L1-202            havana
   [3]                  2     DDX11L1-202            havana
   [4]                  2     DDX11L1-202            havana
   [5]                  2     DDX11L1-202            havana
   [6]                  2     DDX11L1-201            havana
   [7]                  2     DDX11L1-201            havana
   [8]                  2     DDX11L1-201            havana
   [9]                  2     DDX11L1-201            havana
  [10]                  2     DDX11L1-201            havana
                       transcript_biotype         tag
                              <character> <character>
   [1]                               <NA>        <NA>
   [2]               processed_transcript       basic
   [3]               processed_transcript       basic
   [4]               processed_transcript       basic
   [5]               processed_transcript       basic
   [6] transcribed_unprocessed_pseudogene       basic
   [7] transcribed_unprocessed_pseudogene       basic
   [8] transcribed_unprocessed_pseudogene       basic
   [9] transcribed_unprocessed_pseudogene       basic
  [10] transcribed_unprocessed_pseudogene       basic
       transcript_support_level exon_number         exon_id exon_version
                    <character> <character>     <character>  <character>
   [1]                     <NA>        <NA>            <NA>         <NA>
   [2]                        1        <NA>            <NA>         <NA>
   [3]                        1           1 ENSE00002234944            1
   [4]                        1           2 ENSE00003582793            1
   [5]                        1           3 ENSE00002312635            1
   [6]                       NA        <NA>            <NA>         <NA>
   [7]                       NA           1 ENSE00001948541            1
   [8]                       NA           2 ENSE00001671638            2
   [9]                       NA           3 ENSE00001758273            2
  [10]                       NA           4 ENSE00001799933            2
  -------
  seqinfo: 1 sequence from an unspecified genome; no seqlengths
  • Another task: read the LEP (Leptin) transcript
# start your R session using 'R' command from the terminal
# 
rtracklayer::import(format="gtf", text=system("zcat Homo_sapiens.GRCh38.95.gtf.gz | grep -P 'gene_name \"LEP\"' ", intern=T))
Warning in readGFF(filepath, version = version, filter = filter): connection is not positioned at the start of the file, rewinding
  it
GRanges object with 12 ranges and 22 metadata columns:
       seqnames                 ranges strand |         source
          <Rle>              <IRanges>  <Rle> |       <factor>
   [1]        7 [128241284, 128257628]      + | ensembl_havana
   [2]        7 [128241284, 128257628]      + | ensembl_havana
   [3]        7 [128241284, 128241306]      + | ensembl_havana
   [4]        7 [128251991, 128252162]      + | ensembl_havana
   [5]        7 [128252019, 128252162]      + | ensembl_havana
   ...      ...                    ...    ... .            ...
   [8]        7 [128254404, 128254760]      + | ensembl_havana
   [9]        7 [128254761, 128254763]      + | ensembl_havana
  [10]        7 [128241284, 128241306]      + | ensembl_havana
  [11]        7 [128251991, 128252018]      + | ensembl_havana
  [12]        7 [128254764, 128257628]      + | ensembl_havana
                  type     score     phase         gene_id gene_version
              <factor> <numeric> <integer>     <character>  <character>
   [1]            gene      <NA>      <NA> ENSG00000174697            4
   [2]      transcript      <NA>      <NA> ENSG00000174697            4
   [3]            exon      <NA>      <NA> ENSG00000174697            4
   [4]            exon      <NA>      <NA> ENSG00000174697            4
   [5]             CDS      <NA>         0 ENSG00000174697            4
   ...             ...       ...       ...             ...          ...
   [8]             CDS      <NA>         0 ENSG00000174697            4
   [9]      stop_codon      <NA>         0 ENSG00000174697            4
  [10]  five_prime_utr      <NA>      <NA> ENSG00000174697            4
  [11]  five_prime_utr      <NA>      <NA> ENSG00000174697            4
  [12] three_prime_utr      <NA>      <NA> ENSG00000174697            4
         gene_name    gene_source   gene_biotype   transcript_id
       <character>    <character>    <character>     <character>
   [1]         LEP ensembl_havana protein_coding            <NA>
   [2]         LEP ensembl_havana protein_coding ENST00000308868
   [3]         LEP ensembl_havana protein_coding ENST00000308868
   [4]         LEP ensembl_havana protein_coding ENST00000308868
   [5]         LEP ensembl_havana protein_coding ENST00000308868
   ...         ...            ...            ...             ...
   [8]         LEP ensembl_havana protein_coding ENST00000308868
   [9]         LEP ensembl_havana protein_coding ENST00000308868
  [10]         LEP ensembl_havana protein_coding ENST00000308868
  [11]         LEP ensembl_havana protein_coding ENST00000308868
  [12]         LEP ensembl_havana protein_coding ENST00000308868
       transcript_version transcript_name transcript_source
              <character>     <character>       <character>
   [1]               <NA>            <NA>              <NA>
   [2]                  4         LEP-201    ensembl_havana
   [3]                  4         LEP-201    ensembl_havana
   [4]                  4         LEP-201    ensembl_havana
   [5]                  4         LEP-201    ensembl_havana
   ...                ...             ...               ...
   [8]                  4         LEP-201    ensembl_havana
   [9]                  4         LEP-201    ensembl_havana
  [10]                  4         LEP-201    ensembl_havana
  [11]                  4         LEP-201    ensembl_havana
  [12]                  4         LEP-201    ensembl_havana
       transcript_biotype         tag     ccds_id transcript_support_level
              <character> <character> <character>              <character>
   [1]               <NA>        <NA>        <NA>                     <NA>
   [2]     protein_coding       basic    CCDS5800                        1
   [3]     protein_coding       basic    CCDS5800                        1
   [4]     protein_coding       basic    CCDS5800                        1
   [5]     protein_coding       basic    CCDS5800                        1
   ...                ...         ...         ...                      ...
   [8]     protein_coding       basic    CCDS5800                        1
   [9]     protein_coding       basic    CCDS5800                        1
  [10]     protein_coding       basic    CCDS5800                        1
  [11]     protein_coding       basic    CCDS5800                        1
  [12]     protein_coding       basic    CCDS5800                        1
       exon_number         exon_id exon_version      protein_id
       <character>     <character>  <character>     <character>
   [1]        <NA>            <NA>         <NA>            <NA>
   [2]        <NA>            <NA>         <NA>            <NA>
   [3]           1 ENSE00001422382            2            <NA>
   [4]           2 ENSE00001303768            3            <NA>
   [5]           2            <NA>         <NA> ENSP00000312652
   ...         ...             ...          ...             ...
   [8]           3            <NA>         <NA> ENSP00000312652
   [9]           3            <NA>         <NA>            <NA>
  [10]        <NA>            <NA>         <NA>            <NA>
  [11]        <NA>            <NA>         <NA>            <NA>
  [12]        <NA>            <NA>         <NA>            <NA>
       protein_version
           <character>
   [1]            <NA>
   [2]            <NA>
   [3]            <NA>
   [4]            <NA>
   [5]               4
   ...             ...
   [8]               4
   [9]            <NA>
  [10]            <NA>
  [11]            <NA>
  [12]            <NA>
  -------
  seqinfo: 1 sequence from an unspecified genome; no seqlengths
  • You can, of course, read all of them them
# IT WILL TAKE LONG
foo<-rtracklayer::import("Homo_sapiens.GRCh38.95.gtf.gz")

SAM (BAM)

sam-dump SRR6481086 | head -n 10
1   77  *   0   0   *   *   0   0   GGCCATGCAAGATTCCCATTCTTGCGACCCGGGTTCGTTTCCCGGGCGGCGCACCAGATCGGAAGAGCACACGNC AAAAAEEEA/EAEEEEE6EEEEEEEEAEEEEEEEEEEEEEEEEEEEEEEEEE/EEEE6EEEE6AE6EEEEEEE#E RG:Z:TAATGCGC
1   141 *   0   0   *   *   0   0   GGTGCGCCGCCCNGGCCCCGCNNNCGNGTCGCCCGCCTNNNCNTCTTGCCTGNNCCGCTCGGCCGCGCGTCGTGT AAAAAEEEEEEE#EEA//EEE###EE#EEEE/EEEE/E###/#EAEEE//EE##AAEAE/EEA/EEE/EE/E/EA RG:Z:TAATGCGC
2   77  *   0   0   *   *   0   0   GAAGAGCACACGTCTGAACTCCAGTCACTAATGCGCATCTCGTATGCCGTCTTCTGCTTGAAAAAAAAAAGGGNG AAAA/EE/E6EEEEEE66EEEE/EEE/EEE6EEEAE/A6EEEE6EEEEEE6EEAEE/EEEEEE6EEEEE//AE#E RG:Z:TAATGCGC
2   141 *   0   0   *   *   0   0   GGGGGGGGGGGGNGGGGGGGGNNNGGNGGGGGGGGGGGNNNGNGGGGGGGGGNNGGGGGGGGGGGGGGGGGGGGG AAAAAEEEEEEE#EEEEEEEE###EE#EEEEEEEEEEE###E#EEAEAEEEE##EEEEEEEEEEEEEAAAEEAAE RG:Z:TAATGCGC
3   77  *   0   0   *   *   0   0   GAAGAGCACACGTCTGAACTCCAGTCACTAATGCGCATCTCGTATGCCGTCTTCTGCTTGAAAAAAAAAAGGGGG AAAA6EEAE6EEEEEE66EEEE/EEEEEE66EEEEE/EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE RG:Z:TAATGCGC
3   141 *   0   0   *   *   0   0   GGGGGGGGGGGGGGGGGGGGGNGNGGNGGGGGGGGGGGGGNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG AAAAAEEEEEEEEEEEEEEEE#E#EE#EEEEEEEEEEEEE#EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE RG:Z:TAATGCGC
4   77  *   0   0   *   *   0   0   GTAGAGCACACGTCTGAACTCCAGTCACTAATGCGCCTCTCGTATGCCGTCTTCTGCTTGAAAAAAAAAAGGGGG AAAA/AAEEEEEEEAE//EEAE/AEE6EEE/EEEEE/EEE/EE6EEEEEEEEEEAE/6EEEEE<EEEEE<6E6/E RG:Z:TAATGAGC
4   141 *   0   0   *   *   0   0   GGGGGGGGGGGGGGGGGGGGGGGNGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG AAAAAEEEEAEEEAEEEEEEEEE#EEEEEEEAEAAAEEEEEAAAAEEAAAAEAEAEAA//EAEAAE//AAEEEEA RG:Z:TAATGAGC
5   77  *   0   0   *   *   0   0   GAAGAGCACACGTCTGAACTCCAGTCACTAATGCGCATCTCGTATGCCGTCTTCTGCTTGAAAAAAAAAAGGGGG AAAA/EE/E6EEEEEE//EEEEAEEE6EEAAEEEEE6EEEEEEEEEEEEEEEEEEE6EEEEEEEEEEEE6EEEEE RG:Z:TAATGCGC
5   141 *   0   0   *   *   0   0   GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG AAAAAEEEEEEEEAAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE6EEEEEEEE RG:Z:TAATGCGC
  • However, they turned out to be unaligned
# DO NOT RUN (takes a while)
sam-dump SRR6481086 | awk '{print $3}' | sort | uniq -c
  • So, 1K reads of SRR6481086 were aligned to GRCh38 using HiSat2 (you are NOT expected to run this command)
# this is for your information only
# the path to the index should be changed (but I am not covering this)
hisat2 -x /home/ssg29/data/genome/Homo_sapiens/Ensembl/GRCh38/Sequence/HiSat2Index/genome --add-chrname --rg-id SRR6481086 --rg SRR6481086 -1 SRR6481086_pass_1.fastq.gz -2 SRR6481086_pass_2.fastq.gz | samtools view -bS - > SRR6481086.bam
  • The BAM file is avaiable:
wget https://www.dropbox.com/s/6ouvliibmwhnbet/SRR6481086.bam
  • Let’s see the header of the BAM file using samtools
# I assume samtools already installed 
# and the binary is avaialble from your $PATH environment
samtools view -H SRR6481086.bam
@HD VN:1.0  SO:unsorted
@SQ SN:chr1 LN:248956422
@SQ SN:chr2 LN:242193529
@SQ SN:chr3 LN:198295559
@SQ SN:chr4 LN:190214555
@SQ SN:chr5 LN:181538259
@SQ SN:chr6 LN:170805979
@SQ SN:chr7 LN:159345973
@SQ SN:chr8 LN:145138636
@SQ SN:chr9 LN:138394717
@SQ SN:chr10    LN:133797422
@SQ SN:chr11    LN:135086622
@SQ SN:chr12    LN:133275309
@SQ SN:chr13    LN:114364328
@SQ SN:chr14    LN:107043718
@SQ SN:chr15    LN:101991189
@SQ SN:chr16    LN:90338345
@SQ SN:chr17    LN:83257441
@SQ SN:chr18    LN:80373285
@SQ SN:chr19    LN:58617616
@SQ SN:chr20    LN:64444167
@SQ SN:chr21    LN:46709983
@SQ SN:chr22    LN:50818468
@SQ SN:chrX LN:156040895
@SQ SN:chrY LN:57227415
@SQ SN:chrMT    LN:16569
@RG ID:SRR6481086   SRR6481086
@PG ID:hisat2   PN:hisat2   VN:2.0.4    CL:"/usr/local/Cluster-Apps/hisat2/2.0.4/hisat2-align-s --wrapper basic-0 -x /home/ssg29/data/genome/Homo_sapiens/Ensembl/GRCh38/Sequence/HiSat2Index/genome --add-chrname --rg-id SRR6481086 --rg SRR6481086 -1 /tmp/89318.inpipe1 -2 /tmp/89318.inpipe2"
  • Run samtools with ‘flagstat’
samtools flagstat SRR6481086.bam
2243 + 0 in total (QC-passed reads + QC-failed reads)
0 + 0 duplicates
433 + 0 mapped (19.30%:-nan%)
2243 + 0 paired in sequencing
1242 + 0 read1
1001 + 0 read2
0 + 0 properly paired (0.00%:-nan%)
2 + 0 with itself and mate mapped
431 + 0 singletons (19.22%:-nan%)
0 + 0 with mate mapped to a different chr
0 + 0 with mate mapped to a different chr (mapQ>=5)
  • 2243 QC-passed reads?
samtools view -F 0x200 -c SRR6481086.bam
2243
  • 0 QC-failed reads?
samtools view -f 0x200 -c SRR6481086.bam
0
  • Why >1000*2 reads? (input was 2K)
  • Hint: secondary alignment
samtools view -f 256 -c SRR6481086.bam
243
  • For example:
samtools view SRR6481086.bam  | awk '$1=="SRR6481086.10"{print $0}'
SRR6481086.10   73  chr21   8259166 0   3S72M   =   8259166 0   GGCCTCCTCGTGGGGGGGCCGGGCCCCCCCTCCCCCGGCGCGACCGCTCTCCCACCCCTCCTCCCCGCGCCCCCG AAAAAEEEEEEEEE66//EEAE/EE6EEEE<EEE6E66EEE6/EE6E6E6EEE6EEEEAEEAEEEE/E6EEEEE/ AS:i:-11    ZS:i:-11    XN:i:0  XM:i:2  XO:i:0  XG:i:0  NM:i:2  MD:Z:22A8A40    YT:Z:UP RG:Z:SRR6481086 NH:i:3
SRR6481086.10   329 chr21   8442201 0   3S72M   =   8442201 0   GGCCTCCTCGTGGGGGGGCCGGGCCCCCCCTCCCCCGGCGCGACCGCTCTCCCACCCCTCCTCCCCGCGCCCCCG AAAAAEEEEEEEEE66//EEAE/EE6EEEE<EEE6E66EEE6/EE6E6E6EEE6EEEEAEEAEEEE/E6EEEEE/ AS:i:-11    ZS:i:-11    XN:i:0  XM:i:2  XO:i:0  XG:i:0  NM:i:2  MD:Z:22A8A40    YT:Z:UP RG:Z:SRR6481086 NH:i:3
SRR6481086.10   329 chr21   8214937 0   3S72M   =   8214937 0   GGCCTCCTCGTGGGGGGGCCGGGCCCCCCCTCCCCCGGCGCGACCGCTCTCCCACCCCTCCTCCCCGCGCCCCCG AAAAAEEEEEEEEE66//EEAE/EE6EEEE<EEE6E66EEE6/EE6E6E6EEE6EEEEAEEAEEEE/E6EEEEE/ AS:i:-11    ZS:i:-11    XN:i:0  XM:i:2  XO:i:0  XG:i:0  NM:i:2  MD:Z:22A8A40    YT:Z:UP RG:Z:SRR6481086 NH:i:3
SRR6481086.10   133 chr21   8259166 0   *   =   8259166 0   GGGGCGGGAGGGACGCCGCCGTCGCCGCCGCCCCCGAGCGCACGCTCCGCCGTCCCCCACAACGGGGGCCGCGCG AAA/AEEE/EAAA/EEEAEEAEEAEEEEAE/EEAAEAEEE///EAEAEAAEEAAAAAA/A//AA/A/AAAA/AEA YT:Z:UP RG:Z:SRR6481086
  • Non-secondary alignment
samtools view -F 256 -c SRR6481086.bam
2000
  • 443 mapped reads?
samtools view -f1 -F 0x4 -c SRR6481086.bam 
433
  • 1242 read1 (from the 2243 paired in sequencing)?
samtools view -f 0x41 -c SRR6481086.bam 
1242
  • 1001 read2 (from the 2243 paired in sequencing)?
samtools view -f 0x81 -c SRR6481086.bam 
1001
  • 0 properly paired?
  • Hint: both 0x1 and 0x2 bits set and 0x4 bit not set
samtools view -f 3 -F 0x4 -c SRR6481086.bam 
0
  • 2 with itself and mate mapped
  • Hint: exclude segment unmapped (0x4) AND next segment in the template unmapped (0x8)
samtools view -f 1 -F 12 -c SRR6481086.bam 
2

BED

# I assume bedtools is exported to your $PATH
bedtools bamtobed -i SRR6481086.bam | head
# this is equivalent with the follwoing command
bamToBed -i SRR6481086.bam | head
chr21   8259165 8259237 SRR6481086.10/1 0   +
chr21   8442200 8442272 SRR6481086.10/1 0   +
chr21   8214936 8215008 SRR6481086.10/1 0   +
chr11   61967559    61967631    SRR6481086.11/1 60  -
chr2    32916247    32916322    SRR6481086.18/2 60  +
chrMT   2824    2896    SRR6481086.24/1 60  +
chr21   8442555 8442623 SRR6481086.27/1 0   +
chr21   8215292 8215360 SRR6481086.27/1 0   +
chr21   8398326 8398394 SRR6481086.27/1 0   +
chr21   8259521 8259589 SRR6481086.27/1 0   +
chr21   8259165 8259237 SRR6481086.10/1 0   +
chr21   8442200 8442272 SRR6481086.10/1 0   +
chr21   8214936 8215008 SRR6481086.10/1 0   +
chr11   61967559    61967631    SRR6481086.11/1 60  -
chr2    32916247    32916322    SRR6481086.18/2 60  +
chrMT   2824    2896    SRR6481086.24/1 60  +
chr21   8442555 8442623 SRR6481086.27/1 0   +
chr21   8215292 8215360 SRR6481086.27/1 0   +
chr21   8398326 8398394 SRR6481086.27/1 0   +
chr21   8259521 8259589 SRR6481086.27/1 0   +
  • Count the mapped reads (in different ways)
bamToBed -i SRR6481086.bam | wc -l
samtools view -f 1 -F 4 SRR6481086.bam  | wc -l
433
433
  • Compare the 0-based (e.g. BED) and 1-based (e.g. SAM) coordiates
samtools view -f 1 -F 4 SRR6481086.bam  | head | cut -f1-4 
SRR6481086.10   73  chr21   8259166
SRR6481086.10   329 chr21   8442201
SRR6481086.10   329 chr21   8214937
SRR6481086.11   89  chr11   61967560
SRR6481086.18   137 chr2    32916248
SRR6481086.24   73  chrMT   2825
SRR6481086.27   73  chr21   8442556
SRR6481086.27   329 chr21   8215293
SRR6481086.27   329 chr21   8398327
SRR6481086.27   329 chr21   8259522
  • In theory, the aligned region can not go beyond > 75 for SRR6481086 (PE75), but there are:
bamToBed -i SRR6481086.bam | awk '$3-$2>75{print $0}'
chr7    32489330    32490374    SRR6481086.72/1 60  -
chr1    183627540   183630478   SRR6481086.78/1 60  -
chr19   49497979    49499519    SRR6481086.98/1 60  -
chr12   56713130    56713548    SRR6481086.173/1    60  -
chr20   3024592 3026730 SRR6481086.389/1    60  +
chr1    25229096    25232148    SRR6481086.493/1    60  -
chr16   81696643    81699732    SRR6481086.591/1    60  +
chr17   68524932    68525799    SRR6481086.846/1    60  +
chr22   39318550    39319623    SRR6481086.867/1    60  -
  • Let’ look at the BAM file for those cases above
samtools view -f 1 -F 4 SRR6481086.bam  | awk '$1=="SRR6481086.72" || $1=="SRR6481086.78" || $1=="SRR6481086.98"{print $0}'
SRR6481086.72   89  chr7    32489331    60  14M975N55M6S    =   32489331    0   TTTGTCCACAAGCTCTAAGGGCAGCAGCTGCGACGGGTTGGTAGTAGCGTTAGCCGCCATGGCTACGCCCTCCGC EEEEAEEEEEEEEAEEEEEEEEEEEEEE6EAEEEEEE/6EE6EE6EEEEE/AEEE6EAE/EEE/A<////6AAAA AS:i:-6 XN:i:0  XM:i:0  XO:i:0  XG:i:0  NM:i:0  MD:Z:69 YT:Z:UP RG:Z:SRR6481086 XS:A:-  NH:i:1
SRR6481086.78   89  chr1    183627541   60  54M2866N18M3S   =   183627541   0   TTTTCTTGCAGTCAAGACACGAACAATGGACCCTACTCCTCCAGCAGCAAGTGCCTTTTCATGCCATTGCAGGCC EEEE/EEA///E/E6A66E//666EEEA/E666E/6E66E666/66A666EE666EEEE666E//EEE//AAAAA AS:i:-3 XN:i:0  XM:i:0  XO:i:0  XG:i:0  NM:i:0  MD:Z:72 YT:Z:UP RG:Z:SRR6481086 XS:A:-  NH:i:1
SRR6481086.98   89  chr19   49497980    60  67M1465N8M  =   49497980    0   TCCGCAAGTACAACCGCTTCGAGAAGCGCCACAAGAACATGTCTGTACACCTGTCCCCCTGCTTCAGGGACGTCC EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE/E/EEEEEEEEE6EEEEEEEE66EEE6EEAAAAA AS:i:0  XN:i:0  XM:i:0  XO:i:0  XG:i:0  NM:i:0  MD:Z:75 YT:Z:UP RG:Z:SRR6481086 XS:A:+  NH:i:1
  • You may see ‘N’ in CIGAR line, which mean ‘skipped region from the reference’
  • This mean ‘intron-spanning’ reads in RNA-Seq (i.e. reads containing exon-intron junctions)
  • See the GATK best practice with regard to this issue
  • You can ‘split’ those N-containing CIGAR lines using bedtools
bamToBed -split -i SRR6481086.bam | awk '$3-$2>75{print $0}'

Concluding Remarks

LS0tCnRpdGxlOiAiUk5BLVNlcSBGaWxlIEZvcm1hdCBQcmFjdGljYWxzIgpzdWJ0aXRsZTogIkEgcHJpbWVyIHRvIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgUk5BLVNlcSBkYXRhIGZpbGVzIgphdXRob3I6IHwKICB8IFtTdW5nc2FtIEdvbmddKGh0dHBzOi8vd3d3Lm9iZ3luLmNhbS5hYy51ay9zdGFmZi9yZXNlYXJjaC1zdGFmZi9zdW5nLWdvbmcvKXt0YXJnZXQ9Il9ibGFuayJ9CiAgfCBTZW5pb3IgUmVzZWFyY2ggQXNzb2NpYXRlCiAgfCBEZXBhcnRtZW50IG9mIE9ic3RldHJpY3MgJiBHeW5hZWNvbG9neQogIHwgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UKZGF0ZTogIjI2IE1hcmNoIDIwMTkiCmluc3RpdHV0ZTogfAogIHwgU2VuaW9yIFJlc2VhcmNoIEFzc29jaWF0ZQogIHwgRGVwYXJ0bWVudCBvZiBPYnN0ZXRyaWNzICYgR3luYWVjb2xvZ3kKICB8IFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlCm91dHB1dDogCiAgI2h0bWxfZG9jdW1lbnQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGhpZ2hsaWdodDogcHlnbWVudHMKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDMKICAgICNudW1iZXJfc2VjdGlvbjogdHJ1ZQogICNwcmV0dHlkb2M6Omh0bWxfcHJldHR5OgogICAgI3RoZW1lOiBsZW9uaWRzCiAgICAjaGlnaGxpZ2h0OiBnaXRodWIKICAjdXNsaWRlczo6dXNsaWRlc19wZGY6CiAgI2JlYW1lcl9wcmVzZW50YXRpb246CiAgICAjc2xpZGVfbGV2ZWw6IDIKICAgICN0aGVtZTogIkFubkFyYm9yIgogICAgI3RoZW1lOiAiUGFsb0FsdG8iCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojIyBCZWZvcmUgeW91IHN0YXJ0CjEuIENoZWNrIHRoZSBbZ2l0aHViIHBhZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9zdW5nL1JOQS1TZXFfZmlsZV9mb3JtYXRfcHJhdGljYWxzXzIwMTkpIGZvciB0aGlzIGRvY3VtZW50LgoyLiBJZiB5b3Ugd291bGQgbGlrZSB0byBmb2xsb3cgdGhpcyBwcmFjdGljYWwgZnJvbSB5b3VyIG93biBtYWNoaW5lLCB5b3UgbWF5IG5lZWQgdG8gaW5zdGFsbCBzb21lIG9mIHRoZSBzb2Z0d2FyZSB0b29scyAoZm9sbG93IHJlbGV2YW50IGxpbmtzKSBvciBsaW51eCBjb21tYW5kcy4KMy4gSWYgMiBpcyB0cnVlLCB5b3UgbWF5IGFsc28gbmVlZCB0byBzZXQgdXAgeW91ciBbJFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGVdKGh0dHBzOi8vd3d3LmN5YmVyY2l0aS5iaXovZmFxL3VuaXgtbGludXgtYWRkaW5nLXBhdGgvKXt0YXJnZXQ9Il9ibGFuayJ9CgojIyBBaW1zCjEuIFRvIHByZXBhcmUgb3RoZXIgY2xhc3NlcyBhaGVhZAoyLiBUbyBnYWluIGNvbmZpZGVuY2UKIC0gb2YgcHJvY2Vzc2luZyBSTkEtU2VxIGRhdGEgZmlsZXMKIC0gb3IgbGludXggKG9yIHVuaXgpIGNvbW1hbmQgbGluZXMKCiMjIFlvdSB3aWxsIGxlYXJuCjEuIFZhcmlvdXMgZmlsZSBmb3JtYXRzCiAtIFtGQVNUQV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRkFTVEFfZm9ybWF0KXt0YXJnZXQ9Il9ibGFuayJ9IGFuZCBbRkFTVFFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZBU1RRX2Zvcm1hdCl7dGFyZ2V0PSJfYmxhbmsifQogLSBbR1RGXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HZW5lX3RyYW5zZmVyX2Zvcm1hdCl7dGFyZ2V0PSJfYmxhbmsifSBhbmQgb3IgW0dGRl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR2VuZXJhbF9mZWF0dXJlX2Zvcm1hdCl7dGFyZ2V0PSJfYmxhbmsifQogLSBbU0FNXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TQU1fKGZpbGVfZm9ybWF0KSl7dGFyZ2V0PSJfYmxhbmsifSBhbmQgW0JBTV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X0FsaWdubWVudF9NYXApe3RhcmdldD0iX2JsYW5rIn0KIC0gW0JFRF0oaHR0cHM6Ly9nZW5vbWUudWNzYy5lZHUvRkFRL0ZBUWZvcm1hdC5odG1sI2Zvcm1hdDEpe3RhcmdldD0iX2JsYW5rIn0KMi4gQWNjZXNzaW5nIHB1YmxpYyBvciBwdWJsaXNoZWQgZGF0YSAKIC0gW0Vuc2VtYmxdKGh0dHA6Ly93d3cuZW5zZW1ibC5vcmcpe3RhcmdldD0iX2JsYW5rIn0KIC0gW05DQkkgU1JBXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYSl7dGFyZ2V0PSJfYmxhbmsifQozLiBBbmQgcmVsYXRlZCBsaW51eCBjb21tYW5kcyBhbmQgc29mdHdhcmUgdG9vbHMKIC0gW2F3a10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQVdLKXt0YXJnZXQ9Il9ibGFuayJ9CiAtIFtzb3J0XShodHRwOi8vbWFuNy5vcmcvbGludXgvbWFuLXBhZ2VzL21hbjEvc29ydC4xLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0KIC0gW3pjYXRdKGh0dHBzOi8vbGludXguZGllLm5ldC9tYW4vMS96Y2F0KXt0YXJnZXQ9Il9ibGFuayJ9IG9yIFt6bGVzc10oaHR0cHM6Ly9saW51eC5kaWUubmV0L21hbi8xL3psZXNzKXt0YXJnZXQ9Il9ibGFuayJ9CiAtIFtzYW10b29sc10oaHR0cDovL3d3dy5odHNsaWIub3JnLyl7dGFyZ2V0PSJfYmxhbmsifQogLSBbYmVkdG9vbHNdKGh0dHBzOi8vYmVkdG9vbHMucmVhZHRoZWRvY3MuaW8vKXt0YXJnZXQ9Il9ibGFuayJ9CiAtIFtzcmEgdG9vbGtpdHNdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhL2RvY3MvdG9vbGtpdHNvZnQvKXt0YXJnZXQ9Il9ibGFuayJ9CgojIyBZb3Ugd2lsbCAqKk5PVCoqIGxlYXJuIChmcm9tIG1lKQoxLiBWYXJpb3VzIFJOQS1TZXEgZGF0YSBwcm9jZXNzaW5nIGFuZCBhbmFseXNpcywgc3VjaCBhcwogICsgUXVhbGl0eSBjb250cm9scyBvZiBzZXF1ZW5jZWQgcmVhZHMKICArIEFkYXB0b3IgKGFuZC9vciBwb29yIHF1YWxpdHkgcmVhZCkgdHJpbW1pbmcKICArIEFsaWdubWVudCAobWFwcGluZykgb2YgcmVhZHMKICArIFF1YW50aWZpY2F0aW9uIG9mIHRyYW5zY3JpcHQtbGV2ZWwgKG9yIGdlbmUtbGV2ZWwpIGFidW5kYW5jZQogICsgRGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmUvdHJhbnNjcmlwdC9leG9uIGFuYWx5c2lzCiAgKiBUcmFuc2NyaXB0b21lIHJlY29uc3RydWN0aW9uIChvciBhc3NlbWJseSkKCjIuIERldGFpbGVkIHVzZSBvZiBzb2Z0d2FyZSB0b29scyByZWxhdGVkIHdpdGggYWJvdmUKICogW2Zhc3RxY10oaHR0cHM6Ly93d3cuYmlvaW5mb3JtYXRpY3MuYmFicmFoYW0uYWMudWsvcHJvamVjdHMvZmFzdHFjLyl7dGFyZ2V0PSJfYmxhbmsifQogKiBbY3V0YWRhcHRdKGh0dHBzOi8vY3V0YWRhcHQucmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL2luZGV4Lmh0bWwpe3RhcmdldD0iX2JsYW5rIn0KICogW1RvcEhhdDJdKGh0dHBzOi8vY2NiLmpodS5lZHUvc29mdHdhcmUvdG9waGF0L2luZGV4LnNodG1sKXt0YXJnZXQ9Il9ibGFuayJ9IGFuZCBbSGlTYXQyXShodHRwczovL2NjYi5qaHUuZWR1L3NvZnR3YXJlL2hpc2F0Mi8pe3RhcmdldD0iX2JsYW5rIn0KICogW2ZlYXR1cmVDb3VudHNdKGh0dHA6Ly9zdWJyZWFkLnNvdXJjZWZvcmdlLm5ldC8pe3RhcmdldD0iX2JsYW5rIn0sIFtTYWxtb25dKGh0dHBzOi8vY29tYmluZS1sYWIuZ2l0aHViLmlvL3NhbG1vbi8pe3RhcmdldD0iX2JsYW5rIn0gW0thbGxpc3RvXShodHRwczovL3BhY2h0ZXJsYWIuZ2l0aHViLmlvL2thbGxpc3RvLyl7dGFyZ2V0PSJfYmxhbmsifQogKiBbREVTZXEyXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvREVTZXEyLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0sIFtERVhTZXFdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9ERVhTZXEuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSwgYW5kIFtlZGdlUl0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL3JlbGVhc2UvYmlvYy9odG1sL2VkZ2VSLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0KICogW1N0cmluZ1RpZV0oaHR0cHM6Ly9jY2Iuamh1LmVkdS9zb2Z0d2FyZS9zdHJpbmd0aWUvKXt0YXJnZXQ9Il9ibGFuayJ9IGFuZCBbVEFDT10oaHR0cHM6Ly90YWNvcm5hLmdpdGh1Yi5pby8pe3RhcmdldD0iX2JsYW5rIn0KCiMjIEZpbGUgRm9ybWF0cyB7LnRhYnNldH0KaHR0cHM6Ly9nZW5vbWUudWNzYy5lZHUvRkFRL0ZBUWZvcm1hdAoKIyMjIEZBU1RBCi0gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRkFTVEFfZm9ybWF0Ci0gVGhlIGxldHRlcnMgc2hvdWxkIGZvbGxvdyB0aGUgW0lVUEFDIGNvZGVzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GQVNUQV9mb3JtYXQjU2VxdWVuY2VfcmVwcmVzZW50YXRpb24pe3RhcmdldD0iX2JsYW5rIn0KCi0gVGFzayAxOiBkb3dubG9hZCB0aGUgRkFTVEEgZmlsZSBvZiBodW1hbiBjaHIyMiAoZnJvbSBbaGVyZV0oaHR0cHM6Ly93d3cuZW5zZW1ibC5vcmcvaW5mby9kYXRhL2Z0cC9pbmRleC5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9KSBhbmQgY2FsY3VsYXRlIHRoZSBzaXplIChpLmUuIGxlbmd0aCkgb2YgdGhlIGNocm9tb3NvbWUgIAoKYGBge3IsIGVjaG89Rn0Ka25pdHI6OmluY2x1ZGVfdXJsKCJodHRwczovL3d3dy5lbnNlbWJsLm9yZy9pbmZvL2RhdGEvZnRwL2luZGV4Lmh0bWwiKQpgYGAKCjwhLS1gYGB7ciwgZW5naW5lPSdiYXNoJywgcmVzdWx0cz1GfS0tPgpgYGB7ciwgZW5naW5lPSdiYXNoJywgZXZhbD1GfQp3Z2V0IGZ0cDovL2Z0cC5lbnNlbWJsLm9yZy9wdWIvcmVsZWFzZS05NS9mYXN0YS9ob21vX3NhcGllbnMvZG5hL0hvbW9fc2FwaWVucy5HUkNoMzguZG5hLmNocm9tb3NvbWUuMjIuZmEuZ3oKYGBgCgpgYGB7ciwgZW5naW5lPSdiYXNoJ30Kemxlc3MgSG9tb19zYXBpZW5zLkdSQ2gzOC5kbmEuY2hyb21vc29tZS4yMi5mYS5neiB8IGhlYWQgLW41CmBgYAoKYGBge3IsIGVuZ2luZT0nYmFzaCd9CnpjYXQgSG9tb19zYXBpZW5zLkdSQ2gzOC5kbmEuY2hyb21vc29tZS4yMi5mYS5neiB8IGF3ayAnIS9ePi97TEVOKz1sZW5ndGgoJDApfUVORHtwcmludCBMRU59JyAKYGBgCgotIFRhc2sgMjogZ2V0IHRoZSBzZXF1ZW5jZSBmcm9tIFs0MDAwMDAwMSB0byA0MDAwMDMwMCBvZiBjaHIyMl0oaHR0cDovL3d3dy5lbnNlbWJsLm9yZy9Ib21vX3NhcGllbnMvTG9jYXRpb24vVmlldz9yPTIyJTNBNDAwMDAwMDEtNDAwMDAzMDApe3RhcmdldD0iX2JsYW5rIn0KYGBge3IsIGVuZ2luZT0nYmFzaCd9CnpjYXQgSG9tb19zYXBpZW5zLkdSQ2gzOC5kbmEuY2hyb21vc29tZS4yMi5mYS5neiB8IGF3ayAnQkVHSU57bWluPTUwODE4NDY4O21heD0wO3N0YXJ0PTQwMDAwMDAxO2VuZD00MDAwMDMwMH0hL14+L3tMRU4rPWxlbmd0aCgkMCk7IGlmKExFTj49c3RhcnQgJiYgTEVOLWxlbmd0aCgkMCkrMTw9ZW5kKXttaW49KG1pbj5MRU4tbGVuZ3RoKCQwKSsxKT9MRU4tbGVuZ3RoKCQwKSsxOm1pbjsgbWF4PShtYXg+TEVOKT9tYXg6TEVOOyBTRVE9U0VRJDA7IHByaW50IExFTi1sZW5ndGgoJDApKzEsTEVOLCQwLGxlbmd0aCgkMCl9IH1FTkR7cHJpbnQgc3Vic3RyKFNFUSxzdGFydC1taW4rMSxlbmQtc3RhcnQrMSl9JwpgYGAKCi0gQ29tcGFyZSB0aGUgcmVzdWx0IGFib3ZlIGFuZCB0aGUgZm9sbG93aW5nIG1ldGhvZCAodXNpbmcgW3RoZSBlbnNlbWJsIHJlc3QgYXBpXShodHRwczovL3Jlc3QuZW5zZW1ibC5vcmcvZG9jdW1lbnRhdGlvbi9pbmZvL3NlcXVlbmNlX3JlZ2lvbil7dGFyZ2V0PSJfYmxhbmsifSkKYGBge3IsIGVuZ2luZT0nYmFzaCd9CmN1cmwgaHR0cHM6Ly9yZXN0LmVuc2VtYmwub3JnL3NlcXVlbmNlL3JlZ2lvbi9odW1hbi8yMjo0MDAwMDAwMS4uNDAwMDAzMDA6MT9jb250ZW50LXR5cGU9dGV4dC9wbGFpbgpgYGAKCi0gVGFzayAzOiB3aGF0IGlzIHRoZSBzZXF1ZW5jZSBvZiA0MDAwMDAwMSB0byA0MDAwMDEwMCBvZiAqKmNocjIxKiogKHVzaW5nIGJvdGggYXdrIGFuZCBjdXJsKT8KYGBge3IsIGVuZ2luZT0nYmFzaCd9CmN1cmwgaHR0cHM6Ly9yZXN0LmVuc2VtYmwub3JnL3NlcXVlbmNlL3JlZ2lvbi9odW1hbi8yMTo0MDAwMDAwMS4uNDAwMDAxMDA6MT9jb250ZW50LXR5cGU9dGV4dC9wbGFpbgpgYGAKCiMjIyBGQVNUUQotIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZBU1RRX2Zvcm1hdAoKLSBFeGFtcGxlcyBmcm9tIFtHb25nICpldCBhbC4qIEpDSS1JIDIwMThdKGh0dHBzOi8vaW5zaWdodC5qY2kub3JnL2FydGljbGVzL3ZpZXcvMTIwNzIzKXt0YXJnZXQ9Il9ibGFuayJ9Ci0gRG93bmxvYWQgb25lIG9mIGRvd24tc2FtcGxlZCAodG8gMUspIEZBU1RRIGF2YWlsYWJsZSBmcm9tIGJlbG93CmBgYHtyLCBlbmdpbmU9J2Jhc2gnLCBldmFsPUZ9CndnZXQgaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy9oMmx6em45NG85enB2MjYvU0xYLTkxNjguRDcwMV9ENTAxXzFLLkM2SDNVQU5YWC5zXzEucl8xLmZxLmd6CmBgYAotIFF1ZXN0aW9uOiBob3cgbWFueSBlbnRyaWVzIChpdCdzIGFidmlvdXMpCmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQp6Y2F0ICBTTFgtOTE2OC5ENzAxX0Q1MDFfMUsuQzZIM1VBTlhYLnNfMS5yXzEuZnEuZ3ogfCBlY2hvICQoKGB3YyAtbGAvNCkpCmBgYAoKLSBMZXQncyBsb29rIGF0IHRoZSBmaXJzdCBlbnRyeSAoaS5lLiB0aGUgZmlyc3QgNCBsaW5lcykgYW5kIGNoZWNrIHRoZSBtZXRhIGluZm9ybWF0aW9uCmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQp6Y2F0IFNMWC05MTY4LkQ3MDFfRDUwMV8xSy5DNkgzVUFOWFguc18xLnJfMS5mcS5neiB8IGhlYWQgLW40CmBgYAoKLSBRdWVzdGlvbjogc2VxdWVuY2luZyBsZW5ndGg/CmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQp6bGVzcyBTTFgtOTE2OC5ENzAxX0Q1MDFfMUsuQzZIM1VBTlhYLnNfMS5yXzEuZnEuZ3ogfCBoZWFkIC1uIDQgfCBhd2sgJ05SJTQ9PTJ7cHJpbnQgbGVuZ3RoKCQwKX0nCmBgYAogCi0gQ2hlY2sgdGhlIGJhc2UgcXVhbGl0eSBvZiB0aGUgcmVhZCBhYm92ZSBmcm9tIHRoZSBbc2FtZm9ybWF0LmluZm9dKGh0dHBzOi8vd3d3LnNhbWZvcm1hdC5pbmZvL2Jhc2UtcXVhbGl0aWVzKQoKLSBDaGVjayB0aGUgYmFzZSBxdWFsaXR5IHVzaW5nIFtmYXN0cWNdKGh0dHBzOi8vd3d3LmJpb2luZm9ybWF0aWNzLmJhYnJhaGFtLmFjLnVrL3Byb2plY3RzL2Zhc3RxYy8pe3RhcmdldD0iX2JsYW5rIn0KYGBge3IsIGVuZ2luZT0nYmFzaCcsIGV2YWw9Rn0KZmFzdHFjIFNMWC05MTY4LkQ3MDFfRDUwMV8xSy5DNkgzVUFOWFguc18xLnJfMS5mcS5negpgYGAKCmBgYHtyLCBlY2hvPUZ9CmtuaXRyOjppbmNsdWRlX3VybCgiLi9TTFgtOTE2OC5ENzAxX0Q1MDFfMUsuQzZIM1VBTlhYLnNfMS5yXzFfZmFzdHFjLmh0bWwiKQpgYGAKCgotIEFub3RoZXIgZXhhbXBsZSBbTmdvIF9ldCBhbC5fIFNjaWVuY2UgMjAxOF0oaHR0cDovL3NjaWVuY2Uuc2NpZW5jZW1hZy5vcmcvY29udGVudC8zNjAvNjM5My8xMTMzKXt0YXJnZXQ9Il9ibGFuayJ9IChbU1BSMTMwMTQ5XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlAxMzAxNDkpe3RhcmdldD0iX2JsYW5rIn0pCmBgYHtyLCBlY2hvPUZ9CmtuaXRyOjppbmNsdWRlX3VybCgiaHR0cDovL3NjaWVuY2Uuc2NpZW5jZW1hZy5vcmcvY29udGVudC8zNjAvNjM5My8xMTMzIikKYGBgCi0gRG93bmxhb2QgdGhlIGZpcnN0IDFLIHNwb3RzIGZyb20gdGhlIHNtYWxsZXN0IFJOQS1TZXEgZmFzdHEgZmlsZXMgZnJvbSBbU1JSNjQ4MTA4Nl0oaHR0cHM6Ly90cmFjZS5uY2JpLm5sbS5uaWguZ292L1RyYWNlcy9zcmEvP3J1bj1TUlI2NDgxMDg2KXt0YXJnZXQ9Il9ibGFuayJ9ICh5b3UgbWF5IG5lZWQgdG8gaW5zdGFsbCB0aGUgW3NyYSB0b29sa2l0XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS9kb2NzL3Rvb2xraXRzb2Z0Lyl7dGFyZ2V0PSJfYmxhbmsifSkKCmBgYHtyLCBlY2hvPUZ9CmtuaXRyOjppbmNsdWRlX3VybCgiaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JQMTMwMTQ5IikKYGBgCgpgYGB7ciwgZW5naW5lPSdiYXNoJywgZXZhbD1GfQpmYXN0cS1kdW1wIC1YIDEwMDAgLS1zcGxpdC1maWxlcyAtLXJlYWQtZmlsdGVyIHBhc3MgLS1vdXRkaXIgLi8gLS1nemlwIFNSUjY0ODEwODYgCmBgYApgYGB7ciwgZW5naW5lPSdiYXNoJ30KemNhdCBTUlI2NDgxMDg2X3Bhc3NfMS5mYXN0cS5neiB8IGVjaG8gJCgoYHdjIC1sYC80KSkKemNhdCBTUlI2NDgxMDg2X3Bhc3NfMi5mYXN0cS5neiB8IGVjaG8gJCgoYHdjIC1sYC80KSkKYGBgCgotIExldCdzIGxvb2sgYXQgdGhlIGZpc3QgOCBsaW5lcwpgYGB7ciwgZW5naW5lPSdiYXNoJ30KemNhdCBTUlI2NDgxMDg2X3Bhc3NfMS5mYXN0cS5neiB8IGhlYWQgLW44CmBgYApgYGB7ciwgZW5naW5lPSdiYXNoJ30KemNhdCBTUlI2NDgxMDg2X3Bhc3NfMi5mYXN0cS5neiB8IGhlYWQgLW44CmBgYAoKLSBDaGVjayB0aGUgYmFzZSBxdWFsaXR5IGZyb20gdGhlIFtzYW1mb3JtYXQuaW5mb10oaHR0cHM6Ly93d3cuc2FtZm9ybWF0LmluZm8vYmFzZS1xdWFsaXRpZXMpCgotIENoZWNrIHRoZSBiYXNlIHF1YWxpdHkgdXNpbmcgW2Zhc3RxY10oaHR0cHM6Ly93d3cuYmlvaW5mb3JtYXRpY3MuYmFicmFoYW0uYWMudWsvcHJvamVjdHMvZmFzdHFjLyl7dGFyZ2V0PSJfYmxhbmsifQpgYGB7ciwgZW5naW5lPSdiYXNoJywgZXZhbD1GfQpmYXN0cWMgU1JSNjQ4MTA4Nl9wYXNzXzEuZmFzdHEuZ3ogU1JSNjQ4MTA4Nl9wYXNzXzIuZmFzdHEuZ3oKYGBgCgpgYGB7ciwgZWNobz1GfQprbml0cjo6aW5jbHVkZV91cmwoIi4vU1JSNjQ4MTA4Nl9wYXNzXzFfZmFzdHFjLmh0bWwiLCBoZWlnaHQ9IjYwMHB4IikKYGBgCgpgYGB7ciwgZWNobz1GfQprbml0cjo6aW5jbHVkZV91cmwoIi4vU1JSNjQ4MTA4Nl9wYXNzXzJfZmFzdHFjLmh0bWwiLCBoZWlnaHQ9IjYwMHB4IikKYGBgCgojIyMgR1RGIChHRkYpCi0gaHR0cHM6Ly9nZW5vbWUudWNzYy5lZHUvRkFRL0ZBUWZvcm1hdCNmb3JtYXQzCi0gaHR0cHM6Ly93d3cuZW5zZW1ibC5vcmcvaW5mby93ZWJzaXRlL3VwbG9hZC9nZmYuaHRtbAoKLSBMZXQncyBkb3dubG9hZCB0aGUgRW5zZW1ibCB0cmFuc2NyaXB0IGFubm90YXRpb24gZmlsZQpgYGB7ciwgZW5naW5lPSdiYXNoJywgZXZhbD1GfQp3Z2V0IGZ0cDovL2Z0cC5lbnNlbWJsLm9yZy9wdWIvcmVsZWFzZS05NS9ndGYvaG9tb19zYXBpZW5zL0hvbW9fc2FwaWVucy5HUkNoMzguOTUuZ3RmLmd6CmBgYAoKLSBIb3cgbWFueSBnZW5lcyBhbmQgdHJhbnNjcmlwdHM/CmBgYHtiYXNofQp6Y2F0IEhvbW9fc2FwaWVucy5HUkNoMzguOTUuZ3RmLmd6IHwgYXdrICckMz09ImdlbmUie0dFTkUrK30kMz09InRyYW5zY3JpcHQie1RSQU5TKyt9JDM9PSJleG9uIntFWE9OKyt9RU5Ee3ByaW50IEdFTkUsVFJBTlMsRVhPTn0nCmBgYAotIFdoYXQgZWxzZSBpbiB0aGUgZmlsZT8KYGBge2Jhc2h9CnpjYXQgSG9tb19zYXBpZW5zLkdSQ2gzOC45NS5ndGYuZ3ogfCBhd2sgJyEvXiMve3ByaW50ICQzfScgfCBzb3J0IHwgdW5pcSAtYyB8IHNvcnQgLWsxLDFuCmBgYAoKLSBSZWFkIHRoZSBmaXJzdCAxMCBsaW5lcyAoZXhjbHVkaW5nIGNvbW1lbnRzIChpLmUuICcjJykpIHVzaW5nIEJpb2NvbmR1Y3RvciBbcnRyYWNrbGF5ZXIgcGFja2FnZV0oaHR0cDovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvcnRyYWNrbGF5ZXIuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifQpgYGB7cn0KIyBzdGFydCB5b3VyIFIgc2Vzc2lvbiB1c2luZyAnUicgY29tbWFuZCBmcm9tIHRoZSB0ZXJtaW5hbApydHJhY2tsYXllcjo6aW1wb3J0KGZvcm1hdD0iZ3RmIiwgdGV4dD1zeXN0ZW0oInpjYXQgSG9tb19zYXBpZW5zLkdSQ2gzOC45NS5ndGYuZ3ogfCBncmVwIC12IF4jIHwgaGVhZCAtbiAxMCIsIGludGVybj1UKSkKYGBgCgotIEFub3RoZXIgdGFzazogcmVhZCB0aGUgTEVQIChbTGVwdGluXShodHRwczovL3d3dy5lbnNlbWJsLm9yZy9Ib21vX3NhcGllbnMvR2VuZS9TdW1tYXJ5P2RiPWNvcmU7Zz1FTlNHMDAwMDAxNzQ2OTc7cj03OjEyODI0MTI4NC0xMjgyNTc2Mjg7dD1FTlNUMDAwMDAzMDg4Njgpe3RhcmdldD0iX2JsYW5rIn0pIHRyYW5zY3JpcHQKYGBge3J9CiMgc3RhcnQgeW91ciBSIHNlc3Npb24gdXNpbmcgJ1InIGNvbW1hbmQgZnJvbSB0aGUgdGVybWluYWwKIyAKcnRyYWNrbGF5ZXI6OmltcG9ydChmb3JtYXQ9Imd0ZiIsIHRleHQ9c3lzdGVtKCJ6Y2F0IEhvbW9fc2FwaWVucy5HUkNoMzguOTUuZ3RmLmd6IHwgZ3JlcCAtUCAnZ2VuZV9uYW1lIFwiTEVQXCInICIsIGludGVybj1UKSkKYGBgCgotIFlvdSBjYW4sIG9mIGNvdXJzZSwgcmVhZCBhbGwgb2YgdGhlbSB0aGVtCmBgYHtyLCBldmFsPUZ9CiMgSVQgV0lMTCBUQUtFIExPTkcKZm9vPC1ydHJhY2tsYXllcjo6aW1wb3J0KCJIb21vX3NhcGllbnMuR1JDaDM4Ljk1Lmd0Zi5neiIpCmBgYAoKIyMjIFNBTSAoQkFNKQotIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NBTV8oZmlsZV9mb3JtYXQpCi0gaHR0cDovL3NhbXRvb2xzLmdpdGh1Yi5pby9odHMtc3BlY3MvU0FNdjEucGRmIAoKLSBZb3UgY2FuIGNoZWNrIHlvdXIgYml0d2lzZSBGTEFHIGludGVyYWN0aXZlbHkgZnJvbSBbaGVyZV0oaHR0cHM6Ly9icm9hZGluc3RpdHV0ZS5naXRodWIuaW8vcGljYXJkL2V4cGxhaW4tZmxhZ3MuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSBvciBbaGVyZV0oaHR0cHM6Ly93d3cuc2FtZm9ybWF0LmluZm8vc2FtLWZvcm1hdC1mbGFnLXNpbmdsZSl7dGFyZ2V0PSJfYmxhbmsifQoKLSBMZXQncyBnZXQgdGhlIEJBTSBmaWxlIGZvciBbU1JSNjQ4MTA4Nl0oaHR0cHM6Ly90cmFjZS5uY2JpLm5sbS5uaWguZ292L1RyYWNlcy9zcmEvP3J1bj1TUlI2NDgxMDg2KXt0YXJnZXQ9Il9ibGFuayJ9ICh5b3UgbWF5IG5lZWQgdG8gaW5zdGFsbCB0aGUgW3NyYSB0b29sa2l0XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS9kb2NzL3Rvb2xraXRzb2Z0Lyl7dGFyZ2V0PSJfYmxhbmsifSkKYGBge3IsIGVuZ2luZT0nYmFzaCd9CnNhbS1kdW1wIFNSUjY0ODEwODYgfCBoZWFkIC1uIDEwCmBgYAoKLSBIb3dldmVyLCB0aGV5IHR1cm5lZCBvdXQgdG8gYmUgdW5hbGlnbmVkCmBgYHtyLCBlbmdpbmU9J2Jhc2gnLCBldmFsPUZ9CiMgRE8gTk9UIFJVTiAodGFrZXMgYSB3aGlsZSkKc2FtLWR1bXAgU1JSNjQ4MTA4NiB8IGF3ayAne3ByaW50ICQzfScgfCBzb3J0IHwgdW5pcSAtYwpgYGAKCi0gU28sIDFLIHJlYWRzIG9mIFNSUjY0ODEwODYgd2VyZSBhbGlnbmVkIHRvIEdSQ2gzOCB1c2luZyBbSGlTYXQyXShodHRwczovL2NjYi5qaHUuZWR1L3NvZnR3YXJlL2hpc2F0Mi8pe3RhcmdldD0iX2JsYW5rIn0gKHlvdSBhcmUgKipOT1QqKiBleHBlY3RlZCB0byBydW4gdGhpcyBjb21tYW5kKQoKYGBge3IsIGVuZ2luZT0nYmFzaCcsIGV2YWw9Rn0KIyB0aGlzIGlzIGZvciB5b3VyIGluZm9ybWF0aW9uIG9ubHkKIyB0aGUgcGF0aCB0byB0aGUgaW5kZXggc2hvdWxkIGJlIGNoYW5nZWQgKGJ1dCBJIGFtIG5vdCBjb3ZlcmluZyB0aGlzKQpoaXNhdDIgLXggL2hvbWUvc3NnMjkvZGF0YS9nZW5vbWUvSG9tb19zYXBpZW5zL0Vuc2VtYmwvR1JDaDM4L1NlcXVlbmNlL0hpU2F0MkluZGV4L2dlbm9tZSAtLWFkZC1jaHJuYW1lIC0tcmctaWQgU1JSNjQ4MTA4NiAtLXJnIFNSUjY0ODEwODYgLTEgU1JSNjQ4MTA4Nl9wYXNzXzEuZmFzdHEuZ3ogLTIgU1JSNjQ4MTA4Nl9wYXNzXzIuZmFzdHEuZ3ogfCBzYW10b29scyB2aWV3IC1iUyAtID4gU1JSNjQ4MTA4Ni5iYW0KYGBgCgotIFRoZSBCQU0gZmlsZSBpcyBhdmFpYWJsZToKYGBge3IsIGVuZ2luZT0nYmFzaCcsIGV2YWw9Rn0Kd2dldCBodHRwczovL3d3dy5kcm9wYm94LmNvbS9zLzZvdXZsaWlibXdobmJldC9TUlI2NDgxMDg2LmJhbQpgYGAKCi0gTGV0J3Mgc2VlIHRoZSBoZWFkZXIgb2YgdGhlIEJBTSBmaWxlIHVzaW5nIFtzYW10b29sc10oaHR0cDovL3d3dy5odHNsaWIub3JnLyl7dGFyZ2V0PSJfYmxhbmsifQpgYGB7ciwgZW5naW5lPSdiYXNoJ30KIyBJIGFzc3VtZSBzYW10b29scyBhbHJlYWR5IGluc3RhbGxlZCAKIyBhbmQgdGhlIGJpbmFyeSBpcyBhdmFpYWxibGUgZnJvbSB5b3VyICRQQVRIIGVudmlyb25tZW50CnNhbXRvb2xzIHZpZXcgLUggU1JSNjQ4MTA4Ni5iYW0KYGBgCgotIFJ1biBzYW10b29scyB3aXRoICdmbGFnc3RhdCcgCmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQpzYW10b29scyBmbGFnc3RhdCBTUlI2NDgxMDg2LmJhbQpgYGAKCi0gMjI0MyAqKlFDLXBhc3NlZCByZWFkcyoqPwpgYGB7ciwgZW5naW5lPSdiYXNoJ30Kc2FtdG9vbHMgdmlldyAtRiAweDIwMCAtYyBTUlI2NDgxMDg2LmJhbQpgYGAKLSAwICoqUUMtZmFpbGVkIHJlYWRzKio/CmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQpzYW10b29scyB2aWV3IC1mIDB4MjAwIC1jIFNSUjY0ODEwODYuYmFtCmBgYAotIFdoeSAqKj4xMDAwXCoyIHJlYWRzKio/IChpbnB1dCB3YXMgMkspCiAgKyBIaW50OiBzZWNvbmRhcnkgYWxpZ25tZW50CmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQpzYW10b29scyB2aWV3IC1mIDI1NiAtYyBTUlI2NDgxMDg2LmJhbQpgYGAKICArIEZvciBleGFtcGxlOgpgYGB7ciwgZW5naW5lPSdiYXNoJ30Kc2FtdG9vbHMgdmlldyBTUlI2NDgxMDg2LmJhbSAgfCBhd2sgJyQxPT0iU1JSNjQ4MTA4Ni4xMCJ7cHJpbnQgJDB9JwpgYGAKICArIE5vbi1zZWNvbmRhcnkgYWxpZ25tZW50CmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQpzYW10b29scyB2aWV3IC1GIDI1NiAtYyBTUlI2NDgxMDg2LmJhbQpgYGAKCi0gNDQzICoqbWFwcGVkIHJlYWRzKio/CmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQpzYW10b29scyB2aWV3IC1mMSAtRiAweDQgLWMgU1JSNjQ4MTA4Ni5iYW0gCmBgYAoKLSAxMjQyICoqcmVhZDEqKiAoZnJvbSB0aGUgMjI0MyBwYWlyZWQgaW4gc2VxdWVuY2luZyk/CmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQpzYW10b29scyB2aWV3IC1mIDB4NDEgLWMgU1JSNjQ4MTA4Ni5iYW0gCmBgYAotIDEwMDEgKipyZWFkMioqIChmcm9tIHRoZSAyMjQzIHBhaXJlZCBpbiBzZXF1ZW5jaW5nKT8KYGBge3IsIGVuZ2luZT0nYmFzaCd9CnNhbXRvb2xzIHZpZXcgLWYgMHg4MSAtYyBTUlI2NDgxMDg2LmJhbSAKYGBgCgotIDAgKipwcm9wZXJseSBwYWlyZWQqKj8KICArIEhpbnQ6IGJvdGggMHgxIGFuZCAweDIgYml0cyBzZXQgYW5kIDB4NCBiaXQgbm90IHNldApgYGB7ciwgZW5naW5lPSdiYXNoJ30Kc2FtdG9vbHMgdmlldyAtZiAzIC1GIDB4NCAtYyBTUlI2NDgxMDg2LmJhbSAKYGBgCgotIDIgKip3aXRoIGl0c2VsZiBhbmQgbWF0ZSBtYXBwZWQqKgogICsgSGludDogZXhjbHVkZSBzZWdtZW50IHVubWFwcGVkICgweDQpICoqQU5EKiogbmV4dCBzZWdtZW50IGluIHRoZSB0ZW1wbGF0ZSB1bm1hcHBlZCAoMHg4KQpgYGB7ciwgZW5naW5lPSdiYXNoJ30Kc2FtdG9vbHMgdmlldyAtZiAxIC1GIDEyIC1jIFNSUjY0ODEwODYuYmFtIApgYGAKCiMjIyBCRUQKLSBodHRwczovL2dlbm9tZS51Y3NjLmVkdS9GQVEvRkFRZm9ybWF0I2Zvcm1hdDEKCi0gTGV0J3MgY29udmVydCBCQU0gZm9ybWF0IHRvIEJFRCBmb3JtYXQgKHVzaW5nIFtiZWR0b29sc10oaHR0cHM6Ly9iZWR0b29scy5yZWFkdGhlZG9jcy5pby8pe3RhcmdldD0iX2JsYW5rIn0pCmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQojIEkgYXNzdW1lIGJlZHRvb2xzIGlzIGV4cG9ydGVkIHRvIHlvdXIgJFBBVEgKYmVkdG9vbHMgYmFtdG9iZWQgLWkgU1JSNjQ4MTA4Ni5iYW0gfCBoZWFkCiMgdGhpcyBpcyBlcXVpdmFsZW50IHdpdGggdGhlIGZvbGx3b2luZyBjb21tYW5kCmJhbVRvQmVkIC1pIFNSUjY0ODEwODYuYmFtIHwgaGVhZApgYGAKCi0gQ291bnQgdGhlIG1hcHBlZCByZWFkcyAoaW4gZGlmZmVyZW50IHdheXMpCmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQpiYW1Ub0JlZCAtaSBTUlI2NDgxMDg2LmJhbSB8IHdjIC1sCnNhbXRvb2xzIHZpZXcgLWYgMSAtRiA0IFNSUjY0ODEwODYuYmFtICB8IHdjIC1sCmBgYAoKLSBDb21wYXJlIHRoZSAwLWJhc2VkIChlLmcuIEJFRCkgYW5kIDEtYmFzZWQgKGUuZy4gU0FNKSBjb29yZGlhdGVzCmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQpzYW10b29scyB2aWV3IC1mIDEgLUYgNCBTUlI2NDgxMDg2LmJhbSAgfCBoZWFkIHwgY3V0IC1mMS00IApgYGAKCi0gSW4gdGhlb3J5LCB0aGUgYWxpZ25lZCByZWdpb24gY2FuIG5vdCBnbyBiZXlvbmQgPiA3NSBmb3IgU1JSNjQ4MTA4NiAoUEU3NSksIGJ1dCB0aGVyZSBhcmU6CmBgYHtyLCBlbmdpbmU9J2Jhc2gnfQpiYW1Ub0JlZCAtaSBTUlI2NDgxMDg2LmJhbSB8IGF3ayAnJDMtJDI+NzV7cHJpbnQgJDB9JwpgYGAKCi0gTGV0JyBsb29rIGF0IHRoZSBCQU0gZmlsZSBmb3IgdGhvc2UgY2FzZXMgYWJvdmUKYGBge3IsIGVuZ2luZT0nYmFzaCd9CnNhbXRvb2xzIHZpZXcgLWYgMSAtRiA0IFNSUjY0ODEwODYuYmFtICB8IGF3ayAnJDE9PSJTUlI2NDgxMDg2LjcyIiB8fCAkMT09IlNSUjY0ODEwODYuNzgiIHx8ICQxPT0iU1JSNjQ4MTA4Ni45OCJ7cHJpbnQgJDB9JwpgYGAKCi0gWW91IG1heSBzZWUgJ04nIGluIENJR0FSIGxpbmUsIHdoaWNoIG1lYW4gJ3NraXBwZWQgcmVnaW9uIGZyb20gdGhlIHJlZmVyZW5jZScKLSBUaGlzIG1lYW4gJ2ludHJvbi1zcGFubmluZycgcmVhZHMgaW4gUk5BLVNlcSAoaS5lLiByZWFkcyBjb250YWluaW5nIGV4b24taW50cm9uIGp1bmN0aW9ucykKLSBTZWUgW3RoZSBHQVRLIGJlc3QgcHJhY3RpY2VdKGh0dHBzOi8vZ2F0a2ZvcnVtcy5icm9hZGluc3RpdHV0ZS5vcmcvZ2F0ay9kaXNjdXNzaW9uLzM4OTIvdGhlLWdhdGstYmVzdC1wcmFjdGljZXMtZm9yLXZhcmlhbnQtY2FsbGluZy1vbi1ybmFzZXEtaW4tZnVsbC1kZXRhaWwpe3RhcmdldD0iX2JsYW5rIn0gd2l0aCByZWdhcmQgdG8gdGhpcyBpc3N1ZQotIFlvdSBjYW4gJ3NwbGl0JyB0aG9zZSBOLWNvbnRhaW5pbmcgQ0lHQVIgbGluZXMgdXNpbmcgYmVkdG9vbHMKYGBge3IsIGVuZ2luZT0nYmFzaCd9CmJhbVRvQmVkIC1zcGxpdCAtaSBTUlI2NDgxMDg2LmJhbSB8IGF3ayAnJDMtJDI+NzV7cHJpbnQgJDB9JwpgYGAKLSBDaGVjayBvdXQgaG93IHRoZSB1c2Ugb2YgJy1zcGxpdCcgb3B0aW9uIGFmZmVjdHMgcmVwb3J0aW5nIFtvdmVybGFwIHdpdGggdGhlIGdlbm9tZV0oaHR0cHM6Ly9iZWR0b29scy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvY29udGVudC90b29scy9pbnRlcnNlY3QuaHRtbCNzcGxpdC1yZXBvcnRpbmctb3ZlcmxhcHMtd2l0aC1zcGxpY2VkLWFsaWdubWVudHMtb3ItYmxvY2tlZC1iZWQtZmVhdHVyZXMpe3RhcmdldD0iX2JsYW5rIn0KCiMjIENvbmNsdWRpbmcgUmVtYXJrcwoqIFRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgd2F5IHRvIGRvIGl0LiAoW1RNVE9XVERJXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UaGVyZSUyN3NfbW9yZV90aGFuX29uZV93YXlfdG9fZG9faXQpKQoqIFlvdSBhcmUgbm90IGFsb25lLgogICAgKyBodHRwOi8vc2VxYW5zd2Vycy5jb20vCiAgICArIGh0dHBzOi8vd3d3LmJpb3N0YXJzLm9yZy8KKiBJdCB0YWtlcyB0aW1lLgoqIEdvb2QgbHVjayE=