1 Cross reference some putative variants across multiple samples

A quick introduction. I received 5 samples of DNA sequencing data with a question: are there some shared/unique variants compared to the reference genome. As a reminder, these are orn deletion strains of pseudomonas.

I did the following:

  1. Trim the data aggressively to attempt to make sure there are as few sequencing mishaps as possible left in the data. This includes trimming off the first 10 nucleotides of every read.
  2. Pass the data to a mapper (bowtie2).
  3. Pass those results to my own samtools-based variant finder, which is quite conservative.
  4. Pass those results to the snippy software package.

The agreement is quite nice between the tools, which is encouraging. My tool is perhaps too conservative and suggests that more coverage is needed. Snippy suggests to me that the coverage is sufficient. I think I agree with snippy at this time.

There are a series of images in the igv/ directory which in theory back up these suppositions. I took one picture for each variant observed by snippy. Now I am going to read the results from it and look to see how many of these variants are shared among all samples vs.ย are unique.

Depending on what these results look like, I may do some venn or other shenanigans.

Note to self, I keep forgetting where orn lives: 5,827,671

Names of transposons and their locations: Samples 3, 7: yciB: 1,980,222 Samples 2, 6: yciI: 1,979,921 Samples 4, 8: fleQ: 4,460,872 Samples 5, 9: PA14_27420: 2,379,170 Sample 12: dnR: 595,954 Sample 13: potB: 1,514,941

## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 185 parsing failures.
## row col   expected    actual                                                                      file
##   1  -- 14 columns 6 columns 'preprocessing/201908/080519_76/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/201908/080519_76/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/201908/080519_76/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/201908/080519_76/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/201908/080519_76/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... .........................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 189 parsing failures.
## row col   expected    actual                                                                      file
##   1  -- 14 columns 6 columns 'preprocessing/201908/080519_77/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/201908/080519_77/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/201908/080519_77/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/201908/080519_77/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/201908/080519_77/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... .........................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 164 parsing failures.
## row col   expected    actual                                                                      file
##   1  -- 14 columns 6 columns 'preprocessing/201908/080519_78/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/201908/080519_78/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/201908/080519_78/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/201908/080519_78/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/201908/080519_78/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... .........................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 179 parsing failures.
## row col   expected    actual                                                                      file
##   1  -- 14 columns 6 columns 'preprocessing/201908/190808_01/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/201908/190808_01/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/201908/190808_01/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/201908/190808_01/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/201908/190808_01/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... .........................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 179 parsing failures.
## row col   expected    actual                                                                      file
##   1  -- 14 columns 6 columns 'preprocessing/201908/190808_02/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/201908/190808_02/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/201908/190808_02/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/201908/190808_02/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/201908/190808_02/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... .........................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 183 parsing failures.
## row col   expected    actual                                                                      file
##   1  -- 14 columns 6 columns 'preprocessing/201908/190808_03/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/201908/190808_03/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/201908/190808_03/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/201908/190808_03/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/201908/190808_03/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... .........................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 176 parsing failures.
## row col   expected    actual                                                                      file
##   1  -- 14 columns 6 columns 'preprocessing/201908/190808_04/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/201908/190808_04/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/201908/190808_04/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/201908/190808_04/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/201908/190808_04/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... .........................................................................
## See problems(...) for more details.
## Parsed with column specification:
## cols(
##   CHROM = col_character(),
##   POS = col_double(),
##   TYPE = col_character(),
##   REF = col_character(),
##   ALT = col_character(),
##   EVIDENCE = col_character(),
##   FTYPE = col_character(),
##   STRAND = col_character(),
##   NT_POS = col_character(),
##   AA_POS = col_character(),
##   EFFECT = col_character(),
##   LOCUS_TAG = col_character(),
##   GENE = col_character(),
##   PRODUCT = col_character()
## )
## Warning: 180 parsing failures.
## row col   expected    actual                                                                      file
##   1  -- 14 columns 6 columns 'preprocessing/201908/190808_05/outputs/snippy_paeruginosa_pa14/snps.csv'
##   2  -- 14 columns 6 columns 'preprocessing/201908/190808_05/outputs/snippy_paeruginosa_pa14/snps.csv'
##   3  -- 14 columns 6 columns 'preprocessing/201908/190808_05/outputs/snippy_paeruginosa_pa14/snps.csv'
##   4  -- 14 columns 6 columns 'preprocessing/201908/190808_05/outputs/snippy_paeruginosa_pa14/snps.csv'
##   5  -- 14 columns 6 columns 'preprocessing/201908/190808_05/outputs/snippy_paeruginosa_pa14/snps.csv'
## ... ... .......... ......... .........................................................................
## See problems(...) for more details.
## [1] 202   8
##    080519_76       080519_77     080519_78      190808_01       190808_02    
##  Min.   : 10.0   Min.   : 11   Min.   :10.0   Min.   : 10.0   Min.   : 10.0  
##  1st Qu.: 50.0   1st Qu.: 80   1st Qu.:19.0   1st Qu.: 44.0   1st Qu.: 41.0  
##  Median : 77.0   Median :109   Median :24.0   Median : 59.0   Median : 64.0  
##  Mean   : 82.8   Mean   :119   Mean   :28.1   Mean   : 63.5   Mean   : 69.1  
##  3rd Qu.:102.0   3rd Qu.:149   3rd Qu.:34.0   3rd Qu.: 81.0   3rd Qu.: 86.0  
##  Max.   :292.0   Max.   :485   Max.   :91.0   Max.   :220.0   Max.   :304.0  
##  NA's   :17      NA's   :13    NA's   :38     NA's   :23      NA's   :23     
##    190808_03       190808_04       190808_05    
##  Min.   : 11.0   Min.   : 10.0   Min.   : 10.0  
##  1st Qu.: 67.5   1st Qu.: 43.0   1st Qu.: 44.0  
##  Median : 93.0   Median : 62.5   Median : 65.0  
##  Mean   :105.7   Mean   : 71.6   Mean   : 72.7  
##  3rd Qu.:130.0   3rd Qu.: 87.0   3rd Qu.: 94.5  
##  Max.   :535.0   Max.   :308.0   Max.   :296.0  
##  NA's   :19      NA's   :26      NA's   :22

2 Get positions unique to each sample

Sample Order: Orn5,Orn6,Orn3,Orn2,Wt,Mona,Orn10,Orn11

ideally our intersection is therefore: 11110011: e.g the things shared among all the transposon mutants but not the wt nor mona mutant.

An important caveat:

Orn10 and Orn11 are not suppressors.

## NULL
## [1] "945882_del_CG_C" "945892_del_GC_G"
## [1] "2354158_del_CG_C"
## [1] "5358509_del_GT_G"
## [1] "1980865_snp_A_T"
## [1] "2354158_del_CG_C"
## [1] "4947631_complex_ATGCGCACTACACAGGACAACATTT_CTGGCGAACAGCCACGACGGCCTGG"
## [2] "5910265_snp_G_C"
## [1] "2033089_del_AT_A"
LS0tCnRpdGxlOiAiUC4gYWVydWdpbm9zYSAyMDE5MDcyMDogQ3Jvc3MgcmVmZXJlbmNlIHB1dGF0aXZlIFNOUHMgYWNyb3NzIHNhbXBsZXMuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiBmb250LXNpemU6IDE2cHgKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCIvZGF0YS9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldCh3aWR0aD0xMjAsCiAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0PSIlWSVtJWQiKQpwcmV2aW91c19maWxlIDwtICJpbmRleC5SbWQiCnZlciA8LSAiMjAxOTA3MjAiCgojI3RtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkKIyNybWRfZmlsZSA8LSAiMDNfZXhwcmVzc2lvbl9pbmZlY3Rpb25fMjAxODA4MjIuUm1kIgpgYGAKCiMgQ3Jvc3MgcmVmZXJlbmNlIHNvbWUgcHV0YXRpdmUgdmFyaWFudHMgYWNyb3NzIG11bHRpcGxlIHNhbXBsZXMKCkEgcXVpY2sgaW50cm9kdWN0aW9uLiAgSSByZWNlaXZlZCA1IHNhbXBsZXMgb2YgRE5BIHNlcXVlbmNpbmcgZGF0YSB3aXRoIGEKcXVlc3Rpb246IGFyZSB0aGVyZSBzb21lIHNoYXJlZC91bmlxdWUgdmFyaWFudHMgY29tcGFyZWQgdG8gdGhlIHJlZmVyZW5jZQpnZW5vbWUuICBBcyBhIHJlbWluZGVyLCB0aGVzZSBhcmUgb3JuIGRlbGV0aW9uIHN0cmFpbnMgb2YgcHNldWRvbW9uYXMuCgpJIGRpZCB0aGUgZm9sbG93aW5nOgoKMS4gIFRyaW0gdGhlIGRhdGEgX2FnZ3Jlc3NpdmVseV8gdG8gYXR0ZW1wdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIGFzIGZldwogICAgc2VxdWVuY2luZyBtaXNoYXBzIGFzIHBvc3NpYmxlIGxlZnQgaW4gdGhlIGRhdGEuICBUaGlzIGluY2x1ZGVzIHRyaW1taW5nIG9mZgogICAgdGhlIGZpcnN0IDEwIG51Y2xlb3RpZGVzIG9mIGV2ZXJ5IHJlYWQuCjIuICBQYXNzIHRoZSBkYXRhIHRvIGEgbWFwcGVyIChib3d0aWUyKS4KMy4gIFBhc3MgdGhvc2UgcmVzdWx0cyB0byBteSBvd24gc2FtdG9vbHMtYmFzZWQgdmFyaWFudCBmaW5kZXIsIHdoaWNoIGlzIHF1aXRlCiAgICBjb25zZXJ2YXRpdmUuCjQuICBQYXNzIHRob3NlIHJlc3VsdHMgdG8gdGhlIHNuaXBweSBzb2Z0d2FyZSBwYWNrYWdlLgoKVGhlIGFncmVlbWVudCBpcyBxdWl0ZSBuaWNlIGJldHdlZW4gdGhlIHRvb2xzLCB3aGljaCBpcyBlbmNvdXJhZ2luZy4gIE15IHRvb2wgaXMKcGVyaGFwcyB0b28gY29uc2VydmF0aXZlIGFuZCBzdWdnZXN0cyB0aGF0IG1vcmUgY292ZXJhZ2UgaXMgbmVlZGVkLiAgU25pcHB5CnN1Z2dlc3RzIHRvIG1lIHRoYXQgdGhlIGNvdmVyYWdlIGlzIHN1ZmZpY2llbnQuICBJIHRoaW5rIEkgYWdyZWUgd2l0aCBzbmlwcHkgYXQKdGhpcyB0aW1lLgoKVGhlcmUgYXJlIGEgc2VyaWVzIG9mIGltYWdlcyBpbiB0aGUgaWd2LyBkaXJlY3Rvcnkgd2hpY2ggaW4gdGhlb3J5IGJhY2sgdXAgdGhlc2UKc3VwcG9zaXRpb25zLiAgSSB0b29rIG9uZSBwaWN0dXJlIGZvciBlYWNoIHZhcmlhbnQgb2JzZXJ2ZWQgYnkgc25pcHB5LiAgTm93IEkgYW0KZ29pbmcgdG8gcmVhZCB0aGUgcmVzdWx0cyBmcm9tIGl0IGFuZCBsb29rIHRvIHNlZSBob3cgbWFueSBvZiB0aGVzZSB2YXJpYW50cyBhcmUKc2hhcmVkIGFtb25nIGFsbCBzYW1wbGVzIHZzLiBhcmUgdW5pcXVlLgoKRGVwZW5kaW5nIG9uIHdoYXQgdGhlc2UgcmVzdWx0cyBsb29rIGxpa2UsIEkgbWF5IGRvIHNvbWUgdmVubiBvciBvdGhlciBzaGVuYW5pZ2Fucy4KCk5vdGUgdG8gc2VsZiwgSSBrZWVwIGZvcmdldHRpbmcgd2hlcmUgb3JuIGxpdmVzOgo1LDgyNyw2NzEKCk5hbWVzIG9mIHRyYW5zcG9zb25zIGFuZCB0aGVpciBsb2NhdGlvbnM6ClNhbXBsZXMgMywgNzogeWNpQjogMSw5ODAsMjIyClNhbXBsZXMgMiwgNjogeWNpSTogMSw5NzksOTIxClNhbXBsZXMgNCwgODogZmxlUTogNCw0NjAsODcyClNhbXBsZXMgNSwgOTogUEExNF8yNzQyMDogMiwzNzksMTcwClNhbXBsZSAxMjogZG5SOiA1OTUsOTU0ClNhbXBsZSAxMzogcG90QjogMSw1MTQsOTQxCgpgYGB7ciByZWFkc19wZXJfc2FtcGxlfQpzYW1wbGVzIDwtIGMoIjA3MDkxOV8yMSIsICIwNzA5MTlfMzIiLCAiMDcwOTE5XzU0IiwKICAgICAgICAgICAgICIwNzA5MTlfNjUiLCAiMDcwOTE5Xzc2IikKY3N2X2ZpbGVzIDwtIHBhc3RlMCgicHJlcHJvY2Vzc2luZy8yMDE5MDcvIiwgc2FtcGxlcywgIi9vdXRwdXRzL3NuaXBweV9wYWVydWdpbm9zYV9wYTE0L3NucHMuY3N2IikKCiMjIFdlIGdvdCBzb21lIG5ldyBzYW1wbGVzISEKbmV3X3NhbXBsZXMgPC0gYygiMDgwNTE5Xzc2IiwgIjA4MDUxOV83NyIsICIwODA1MTlfNzgiLAogICAgICAgICAgICAgICAgICIxOTA4MDhfMDEiLCAiMTkwODA4XzAyIiwgIjE5MDgwOF8wMyIsCiAgICAgICAgICAgICAgICAgIjE5MDgwOF8wNCIsICIxOTA4MDhfMDUiKQpuZXdfY3N2X2ZpbGVzIDwtIHBhc3RlMCgicHJlcHJvY2Vzc2luZy8yMDE5MDgvIiwgbmV3X3NhbXBsZXMsICIvb3V0cHV0cy9zbmlwcHlfcGFlcnVnaW5vc2FfcGExNC9zbnBzLmNzdiIpCmNzdl9maWxlcyA8LSBjKGNzdl9maWxlcywgbmV3X2Nzdl9maWxlcykKc2FtcGxlcyA8LSBjKHNhbXBsZXMsIG5ld19zYW1wbGVzKQpgYGAKCmBgYHtyIHNlYXJjaF9zaGFyZWRfc25pcHB5fQpzbnBfZGYgPC0gZGF0YS5mcmFtZSgpCmZvciAoZiBpbiAxOmxlbmd0aChuZXdfY3N2X2ZpbGVzKSkgewogIG5hbWUgPC0gbmV3X3NhbXBsZXNbZl0KICBmaWxlIDwtIG5ld19jc3ZfZmlsZXNbZl0KICB0bXBkZiA8LSByZWFkcjo6cmVhZF9jc3YoZmlsZSkKICB0bXBkZltbImVuY29kZWQiXV0gPC0gZ2x1ZTo6Z2x1ZSgie3RtcGRmW1snUE9TJ11dfV97dG1wZGZbWydUWVBFJ11dfV97dG1wZGZbWydSRUYnXV19X3t0bXBkZltbJ0FMVCddXX0iKQogIHRtcGRmW1siY291bnQiXV0gPC0gYXMubnVtZXJpYyhnc3ViKHg9dG1wZGZbWyJFVklERU5DRSJdXSwgcGF0dGVybj0iXlxcdys6KFxcZCspIC4qJCIsIHJlcGxhY2VtZW50PSJcXDEiKSkKICB0bXBkZiA8LSB0bXBkZlssIGMoImVuY29kZWQiLCAiY291bnQiKV0KICBjb2xuYW1lcyh0bXBkZikgPC0gYygiZW5jb2RlZCIsIG5hbWUpCiAgaWYgKGYgPT0gMSkgewogICAgc25wX2RmIDwtIHRtcGRmCiAgfSBlbHNlIHsKICAgIHNucF9kZiA8LSBtZXJnZShzbnBfZGYsIHRtcGRmLCBieT0iZW5jb2RlZCIsIGFsbD1UUlVFKQogIH0KfQpyb3duYW1lcyhzbnBfZGYpIDwtIHNucF9kZltbImVuY29kZWQiXV0Kc25wX2RmW1siZW5jb2RlZCJdXSA8LSBOVUxMCmRpbShzbnBfZGYpCnN1bW1hcnkoc25wX2RmKQp3cml0ZS5jc3YoZmlsZT0ic25wX2RmLmNzdiIsIHg9c25wX2RmKQoKYmluYXJ5IDwtIHNucF9kZgppZHggPC0gYmluYXJ5ID4gMApiaW5hcnlbaWR4XSA8LSAxCmlkeCA8LSBpcy5uYShiaW5hcnkpCmJpbmFyeVtpZHhdIDwtIDAKCmJpbmFyeV9saXN0IDwtIGxpc3QoKQpmb3IgKGUgaW4gY29sbmFtZXMoYmluYXJ5KSkgewogIGlkeCA8LSBiaW5hcnlbLCBlXSA9PSAxCiAgcG9zaXRpb25zIDwtIHJvd25hbWVzKGJpbmFyeSlbaWR4XQogIGJpbmFyeV9saXN0W1tlXV0gPC0gcG9zaXRpb25zCn0KCmxpYnJhcnkoVmVubmVyYWJsZSkKdGVzdCA8LSBWZW5uZXJhYmxlOjpWZW5uKFNldHM9YmluYXJ5X2xpc3QpCiMjVmVubmVyYWJsZTo6cGxvdCh0ZXN0LCBkb1dlaWdodHM9RkFMU0UpCmBgYAoKIyBHZXQgcG9zaXRpb25zIHVuaXF1ZSB0byBlYWNoIHNhbXBsZQoKU2FtcGxlIE9yZGVyOgpPcm41LE9ybjYsT3JuMyxPcm4yLFd0LE1vbmEsT3JuMTAsT3JuMTEKCmlkZWFsbHkgb3VyIGludGVyc2VjdGlvbiBpcyB0aGVyZWZvcmU6CjExMTEwMDExOiBlLmcgdGhlIHRoaW5ncyBzaGFyZWQgYW1vbmcgYWxsIHRoZSB0cmFuc3Bvc29uIG11dGFudHMgYnV0IF9ub3RfIHRoZQp3dCBub3IgbW9uYSBtdXRhbnQuCgpBbiBpbXBvcnRhbnQgY2F2ZWF0OgoKT3JuMTAgYW5kIE9ybjExIGFyZSBfbm90XyBzdXBwcmVzc29ycy4KCgpgYGB7ciB1bmlxdWVfcG9zaXRpb25zfQojIyBJZGVhbCBhY2NvcmRpbmcgdG8gdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgYXJlIHN1cHByZXNzb3JzLgp0ZXN0QEludGVyc2VjdGlvblNldHNbWyIxMTExMDAxMSJdXQoKIyMgT3JuNSxPcm42LE9ybjMsT3JuMixXdCxNb25hLE9ybjEwLE9ybjExCnRlc3RASW50ZXJzZWN0aW9uU2V0c1tbIjExMDAxMDAwIl1dCiMjIEkgdGhpbmsgdGhleSBhcmUgbm90IHJlYWwuCgp0ZXN0QEludGVyc2VjdGlvblNldHNbWyIwMTExMDAwMCJdXQojIyBTYW1lIGFzIHRoZSBwcmV2aW91cy4KCnRlc3RASW50ZXJzZWN0aW9uU2V0c1tbIjAxMDEwMDAwIl1dCiMjIENhbGxlZCBhcyBtaXNzaW5nIGR1ZSB0byBsb3cgY292ZXJhZ2UgaW4gc29tZSBzYW1wbGVzLgoKdGVzdEBJbnRlcnNlY3Rpb25TZXRzW1siMTEwMDAwMDAiXV0KIyMgQ29uZmlybWVkIGluIHRoZSBmaXJzdCB0d28gc2FtcGxlcywgdGhlIHRoaXJkIHNhbXBsZSBpcyB2ZXJ5IGludGVyZXN0aW5nIGluIHRoaXMgcmVnaW9uIHRvby4KIyMgVGhpcyBpcyBqdXN0IGJlZm9yZSB0aGUgeWNpQiBsb2N1cy4KCnRlc3RASW50ZXJzZWN0aW9uU2V0c1tbIjAxMTEwMDAwIl1dCiMjIEZhbHNlIHBvc2l0aXZlIGR1ZSB0byBjb3ZlcmFnZS4KCnRlc3RASW50ZXJzZWN0aW9uU2V0c1tbIjAxMDAwMDAwIl1dCiMjIFNlZW1zIHVubGlrZWx5LCBidXQgaW50ZXJnZW5pYyB0byBhY2VGLgoKdGVzdEBJbnRlcnNlY3Rpb25TZXRzW1siMTAwMDAwMDAiXV0KIyMgU2VlbXMgcmVhbD8gUEExNF8yMzQwMCwgb25seSBpbiBzYW1wbGUgMS4KYGBgCgojIEdldCBzaGFyZWQgcG9zaXRpb25zIGJ5IGdlbmUKCmBgYHtyIHNoYXJlZF9ieV9nZW5lLCBldmFsPUZBTFNFfQpsaWJyYXJ5KEdlbm9taWNSYW5nZXMpCnNoYXJlZF9wb3NpdGlvbnMgPC0gdGVzdEBJbnRlcnNlY3Rpb25TZXRzW1siMTExMTEiXV0KcG9zaXRpb25zIDwtIGFzLm51bWVyaWMoZ3N1Yih4PXNoYXJlZF9wb3NpdGlvbnMsIHBhdHRlcm49Il4oXFxkKylfLiokIiwgcmVwbGFjZW1lbnQ9IlxcMSIpKQpwb3NfZ3JhbmdlcyA8LSBHUmFuZ2VzKHNlcW5hbWVzPSJVQ0JQUC1QQTE0IiwKICAgICAgICAgICAgICAgICAgICAgICByYW5nZXM9SVJhbmdlcyhzdGFydD1wb3NpdGlvbnMsIHdpZHRoPTEpKQoKYW5ub3RhdGlvbnMgPC0gaHBnbHRvb2xzOjpsb2FkX2dlbmJhbmtfYW5ub3RhdGlvbnMoIk5DXzAwODQ2MyIpCmNkcyA8LSBhbm5vdGF0aW9ucyRjZHMKY2RzCgpoaXRzIDwtIGZpbmRPdmVybGFwcyhjZHMsIHBvc19ncmFuZ2VzLCBpZ25vcmUuc3RyYW5kPVRSVUUpCmlkeCA8LSBhcy5kYXRhLmZyYW1lKGhpdHMpW1sicXVlcnlIaXRzIl1dCgp3YW50ZWRfY29sdW1ucyA8LSBjKCJzdGFydCIsICJlbmQiLCAid2lkdGgiLCAibG9jdXNfdGFnIiwgInByb3RlaW5faWQiLCAicHJvZHVjdCIpCmtlcHQgPC0gYXMuZGF0YS5mcmFtZShjZHNbaWR4LCBdKQprZXB0IDwtIGtlcHRbLCB3YW50ZWRfY29sdW1uc10Ka2VwdApgYGAKCgpgYGB7ciBzYXZlbWUsIGV2YWw9RkFMU0V9CnBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCm1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQp0aGlzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1ybWRfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKQptZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHRoaXNfc2F2ZSkpCnRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKSkKYGBgCg==