Just quickly exploring two questions: How much heterozygousity is there in the bean samples, and how much does heterozygousity vary by bean variety?

I used Tassel to obtain a summary table of heterozygousity for each “taxa” (i.e., individual) in the vcf file. This vcf file was filtered so that each SNP present was genotyped in >33% of individuals. It was also filtered so that SNPs had to have a MAF of at least 1%. I don’t think either of these filters should change the analysis significantly… though these filters do remove about 2.5 million SNPs from the analysis.

This analysis is genome-wide, on 639127 SNPs. Here’s a basic summary of the data file. The proportion of heterozygousity in each individual varies from almost nothing to about 22%:

      Taxa                Taxa.Name   Number.of.Sites  Gametes.Missing   Proportion.Missing Number.Heterozygous
 Min.   :  0.0   CDBN_001_1543 :  1   Min.   :639127   Min.   :  36766   Min.   :0.02876    Min.   :     4     
 1st Qu.:150.8   CDBN_002_2242 :  1   1st Qu.:639127   1st Qu.: 207874   1st Qu.:0.16262    1st Qu.: 17351     
 Median :301.5   CDBN_003_5229 :  1   Median :639127   Median : 308012   Median :0.24096    Median : 31787     
 Mean   :301.5   CDBN_004_5501 :  1   Mean   :639127   Mean   : 356238   Mean   :0.27869    Mean   : 38999     
 3rd Qu.:452.2   CDBN_005_54028:  1   3rd Qu.:639127   3rd Qu.: 426188   3rd Qu.:0.33341    3rd Qu.: 55641     
 Max.   :603.0   CDBN_006_55012:  1   Max.   :639127   Max.   :1267156   Max.   :0.99132    Max.   :134793     
                 (Other)       :598                                                                            
 Proportion.Heterozygous            Inbreeding.Coefficient Inbreeding.Coefficient.Scaled.by.Missing
 Min.   :0.0002762       Inbreeding Coefficient:604        ICSBM:604                               
 1st Qu.:0.0418125                                                                                 
 Median :0.0659900                                                                                 
 Mean   :0.0759546                                                                                 
 3rd Qu.:0.1030775                                                                                 
 Max.   :0.2262500                                                                                 
                                                                                                   

Here’s a sorted table for the proportion of heterozygous sites per taxa.

(SNPs.noncom <- SNPs.604 %>%
  filter(!grepl('combined', Taxa.Name)) %>% # Selects 523 rows that were not combined data.
   select(Taxa.Name, Proportion.Missing, Proportion.Heterozygous) %>% 
   arrange(desc(Proportion.Heterozygous))        # Arrange the table so that the greatest heterozygousity comes first.
 )

The immediate problem is that there is a negative relationship between the proportion of sites missing and the proportion of heterozygous sites.

  ggplot(SNPs.noncom, mapping = aes(x = Proportion.Heterozygous, y = Proportion.Missing)) + 
     geom_point() + geom_smooth()

If we get rid of taxa with different percentages of sites that are missing, it looks like heterozygousity is quite high in these varieties - at least 7% heterozygousity on average, but probably upwards of 10% if we account for missing data or low coverage in some taxa.

(Het.summary <- SNPs.604 %>%
  filter(!grepl('combined', Taxa.Name)) %>%           # Selects 523 rows that were not combined data.
   arrange(desc(Proportion.Heterozygous)) %>%        # Arrange the table so that the greatest heterozygousity comes first.
   summarise(het.75percent.missing = mean(Proportion.Heterozygous[Proportion.Missing <= 0.75]),
             het.50percent.missing = mean(Proportion.Heterozygous[Proportion.Missing <= 0.50]),
             het.25percent.missing = mean(Proportion.Heterozygous[Proportion.Missing <= 0.25]),
             het.12.5percent.missing = mean(Proportion.Heterozygous[Proportion.Missing <= 0.125]),
             het.6.25percent.missing = mean(Proportion.Heterozygous[Proportion.Missing <= 0.0625]),
             no.6.25percent.missing = sum(!is.na(Proportion.Missing[Proportion.Missing <= 0.0625])))
   )

Ok, what about across positions in the genome? Are there any blocks in the genome that (for all taxa) are particularly heterozygous?

SNPs.sites <- read.table("C:/Users/ahm543/OneDrive/NSF Common Bean/CDBN Genomics/CDBN SNPs/8_Tassel/604_individual_genoSummary3.txt", sep = "\t", header = TRUE)
summary(SNP.sites)
Error in summary(SNP.sites) : object 'SNP.sites' not found

Here’s a summary of the genotypic data, averaged by site. The only really helpful thing here is that the Proportion.Heterozygous has really quite a low third quartile (0.09), which probably indicates there aren’t a huge number of problematic SNPs.

summary(SNPs.sites)
  Site.Number            Site.Name        Chromosome  Physical.Position  Number.of.Taxa Ref        Alt       
 Min.   :     0   S01_10007272:     1   Min.   :1.0   Min.   :     195   Min.   :604    A:130491   A:192829  
 1st Qu.:159782   S01_10007276:     1   1st Qu.:2.0   1st Qu.:11273856   1st Qu.:604    C:189176   C:126833  
 Median :319563   S01_10007277:     1   Median :4.0   Median :19925246   Median :604    G:188870   G:127192  
 Mean   :319563   S01_10007281:     1   Mean   :3.5   Mean   :20747115   Mean   :604    T:130590   T:192273  
 3rd Qu.:479345   S01_10007282:     1   3rd Qu.:5.0   3rd Qu.:28786009   3rd Qu.:604                         
 Max.   :639126   S01_10007291:     1   Max.   :7.0   Max.   :53433183   Max.   :604                         
                  (Other)     :639121                                                                        
 Major.Allele Major.Allele.Gametes Major.Allele.Proportion Major.Allele.Frequency Minor.Allele Minor.Allele.Gametes
 A:126368     Min.   : 191.0       Min.   :0.1581          Min.   :0.3031         A:197006     Min.   :  4.0       
 C:193706     1st Qu.: 580.0       1st Qu.:0.4801          1st Qu.:0.7125         C:122293     1st Qu.: 42.0       
 G:193374     Median : 692.0       Median :0.5728          Median :0.8475         G:122669     Median :132.0       
 T:125679     Mean   : 711.3       Mean   :0.5889          Mean   :0.8190         T:197159     Mean   :158.8       
              3rd Qu.: 839.0       3rd Qu.:0.6945          3rd Qu.:0.9503                      3rd Qu.:254.0       
              Max.   :1190.0       Max.   :0.9851          Max.   :0.9900                      Max.   :602.0       
                                                                                                                   
 Minor.Allele.Proportion Minor.Allele.Frequency Allele.3      Allele.3.Gametes  Allele.3.Proportion
 Min.   :0.00331         Min.   :0.01000        A   :  6323   Min.   :  0.000   Min.   :0.000000   
 1st Qu.:0.03477         1st Qu.:0.04917        C   :  3620   1st Qu.:  0.000   1st Qu.:0.000000   
 Median :0.10927         Median :0.15116        G   :  3870   Median :  0.000   Median :0.000000   
 Mean   :0.13143         Mean   :0.17963        T   :  6435   Mean   :  1.216   Mean   :0.001007   
 3rd Qu.:0.21026         3rd Qu.:0.28615        NA's:618879   3rd Qu.:  0.000   3rd Qu.:0.000000   
 Max.   :0.49834         Max.   :0.50000                      Max.   :356.000   Max.   :0.294700   
                                                                                                   
 Allele.3.Frequency Allele.4      Allele.4.Gametes    Allele.4.Proportion Allele.4.Frequency  Allele.5      
 Min.   :0.000000   A   :   210   Min.   :  0.00000   Min.   :0.000e+00   Min.   :0.000e+00   Mode:logical  
 1st Qu.:0.000000   C   :   180   1st Qu.:  0.00000   1st Qu.:0.000e+00   1st Qu.:0.000e+00   NA's:639127   
 Median :0.000000   G   :   178   Median :  0.00000   Median :0.000e+00   Median :0.000e+00                 
 Mean   :0.001313   T   :   230   Mean   :  0.02111   Mean   :1.748e-05   Mean   :2.149e-05                 
 3rd Qu.:0.000000   NA's:638329   3rd Qu.:  0.00000   3rd Qu.:0.000e+00   3rd Qu.:0.000e+00                 
 Max.   :0.330860                 Max.   :161.00000   Max.   :1.333e-01   Max.   :1.952e-01                 
                                                                                                            
 Allele.5.Gametes Allele.5.Proportion Allele.5.Frequency Allele.6       Allele.6.Gametes Allele.6.Proportion
 Min.   :0        Min.   :0           Min.   :0          Mode:logical   Min.   :0        Min.   :0          
 1st Qu.:0        1st Qu.:0           1st Qu.:0          NA's:639127    1st Qu.:0        1st Qu.:0          
 Median :0        Median :0           Median :0                         Median :0        Median :0          
 Mean   :0        Mean   :0           Mean   :0                         Mean   :0        Mean   :0          
 3rd Qu.:0        3rd Qu.:0           3rd Qu.:0                         3rd Qu.:0        3rd Qu.:0          
 Max.   :0        Max.   :0           Max.   :0                         Max.   :0        Max.   :0          
                                                                                                            
 Allele.6.Frequency Gametes.Missing Proportion.Missing Number.Heterozygous Proportion.Heterozygous
 Min.   :0          Min.   :  0.0   Min.   :0.0000     Min.   :  0.00      Min.   :0.00000        
 1st Qu.:0          1st Qu.:210.0   1st Qu.:0.1738     1st Qu.:  1.00      1st Qu.:0.00271        
 Median :0          Median :318.0   Median :0.2632     Median : 11.00      Median :0.02734        
 Mean   :0          Mean   :336.7   Mean   :0.2787     Mean   : 36.86      Mean   :0.07548        
 3rd Qu.:0          3rd Qu.:458.0   3rd Qu.:0.3791     3rd Qu.: 45.00      3rd Qu.:0.09978        
 Max.   :0          Max.   :808.0   Max.   :0.6689     Max.   :586.00      Max.   :0.97830        
                                                                                                  
 Inbreeding.Coefficient Inbreeding.Coefficient.Scaled.by.Missing
 TBD:639127             TBD:639127                              
                                                                
                                                                
                                                                
                                                                
                                                                
                                                                

If you plot heterozygousity by chromosome, you see that my f***ing SNP calling did not actually finish the way I thought it did! It only got to chromosome 7! Ok, I may have to request a >>48hr job to finish calling these bastards.

If you just look at the SNPs I have, you see there are some spikes in heterozygousity in a few places that we should be concerned about (end of Chr1, 3, and 5 - I bet you anything these are R-gene clusters!).

ggplot(data = SNPs.sites, mapping = aes(x = Physical.Position, y = Proportion.Heterozygous)) + 
  geom_hex() + geom_smooth(color = "white") +
    facet_wrap( ~ Chromosome)

Let’s zoom in on different parts of Chromosome 1 to see if these are really hotspots. They are, pretty convincingly.

Chr1 <- filter(SNPs.sites, Chromosome == 1)
Chr1.pt1 <- filter(Chr1, Physical.Position < 2000000)
Chr1.pt2 <- filter(Chr1, Physical.Position %in% c(2000000:4000000))
Chr1.pt3 <- filter(Chr1, Physical.Position %in% c(4000000:5200000))
ggplot(data = Chr1.pt1, mapping = aes(x = Physical.Position, y = Proportion.Heterozygous)) + 
  geom_hex(bins = 200)

ggplot(data = Chr1.pt2, mapping = aes(x = Physical.Position, y = Proportion.Heterozygous)) + 
  geom_hex(bins = 200)

ggplot(data = Chr1.pt3, mapping = aes(x = Physical.Position, y = Proportion.Heterozygous)) + 
  geom_hex(bins = 120)

Do these ‘heterozygousity hotspots’ map to frequency of major or minor alleles, or the proportion of missing alleles? There seems to perhaps be a relationship with all three. This makes me wonder if this pattern isn’t a heterozygousity problem so much as it is a reduced representation problem. What do you think??

ggplot(data = Chr1.pt1, mapping = aes(x = Physical.Position, y = Proportion.Heterozygous)) + 
     geom_hex(mapping = aes(x = Physical.Position, y = Major.Allele.Frequency), bins = 120) + geom_line(color = "red")

ggplot(data = Chr1.pt1, mapping = aes(x = Physical.Position, y = Proportion.Heterozygous)) + 
     geom_hex(mapping = aes(x = Physical.Position, y = Minor.Allele.Frequency), bins = 120) + geom_line(color = "red")

ggplot(data = Chr1.pt1, mapping = aes(x = Physical.Position, y = Proportion.Heterozygous)) + 
     geom_hex(mapping = aes(x = Physical.Position, y = Proportion.Missing), bins = 120) + geom_line(color = "red")

LS0tDQp0aXRsZTogIkNEQk4gSW5kaXZpZHVhbCBIZXRlcm96eWdvdXNpdHkiDQphdXRob3I6ICJBbGljZSBNYWNRdWVlbiINCmRhdGU6ICcyMDE3LTEwLTA0Jw0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBlY2hvID0gVFJVRSwNCiAgY29tbWVudCA9ICIjPiIsDQogIGNvbGxhcHNlID0gVFJVRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShGYWN0b01pbmVSKQ0KbGlicmFyeShoZXhiaW4pDQoNCmBgYA0KDQpKdXN0IHF1aWNrbHkgZXhwbG9yaW5nIHR3byBxdWVzdGlvbnM6IEhvdyBtdWNoIGhldGVyb3p5Z291c2l0eSBpcyB0aGVyZSBpbiB0aGUgYmVhbiBzYW1wbGVzLCBhbmQgaG93IG11Y2ggZG9lcyBoZXRlcm96eWdvdXNpdHkgdmFyeSBieSBiZWFuIHZhcmlldHk/DQoNCkkgdXNlZCBUYXNzZWwgdG8gb2J0YWluIGEgc3VtbWFyeSB0YWJsZSBvZiBoZXRlcm96eWdvdXNpdHkgZm9yIGVhY2ggInRheGEiIChpLmUuLCBpbmRpdmlkdWFsKSBpbiB0aGUgdmNmIGZpbGUuIFRoaXMgdmNmIGZpbGUgd2FzIGZpbHRlcmVkIHNvIHRoYXQgZWFjaCBTTlAgcHJlc2VudCB3YXMgZ2Vub3R5cGVkIGluID4zMyUgb2YgaW5kaXZpZHVhbHMuIEl0IHdhcyBhbHNvIGZpbHRlcmVkIHNvIHRoYXQgU05QcyBoYWQgdG8gaGF2ZSBhIE1BRiBvZiBhdCBsZWFzdCAxJS4gSSBkb24ndCB0aGluayBlaXRoZXIgb2YgdGhlc2UgZmlsdGVycyBzaG91bGQgY2hhbmdlIHRoZSBhbmFseXNpcyBzaWduaWZpY2FudGx5Li4uIHRob3VnaCB0aGVzZSBmaWx0ZXJzIGRvIHJlbW92ZSBhYm91dCAyLjUgbWlsbGlvbiBTTlBzIGZyb20gdGhlIGFuYWx5c2lzLiANCg0KVGhpcyBhbmFseXNpcyBpcyBnZW5vbWUtd2lkZSwgb24gNjM5MTI3IFNOUHMuIEhlcmUncyBhIGJhc2ljIHN1bW1hcnkgb2YgdGhlIGRhdGEgZmlsZS4gVGhlIHByb3BvcnRpb24gb2YgaGV0ZXJvenlnb3VzaXR5IGluIGVhY2ggaW5kaXZpZHVhbCB2YXJpZXMgZnJvbSBhbG1vc3Qgbm90aGluZyB0byBhYm91dCAyMiU6DQoNCjwhLS0gUmVhZCBpbiB0aGUgZGF0YS4gXyhJIG1lYW4gdG8gZ2V0IHRoaXMgZGF0YSB0byByZWFkIGZyb20gYSBVUkwsIHVsdGltYXRlbHksIGJ1dCBmb3Igbm93IGV2ZXJ5b25lIHdpbGwganVzdCBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSBkaWZmZXJlbnQgZGlyZWN0b3JpZXMgZm9yIEJlYW5HZW5pZSB2cyBteSBsYWIgY29tcHV0ZXIsIGFuZCBvdGhlciB1c2VycyB3aWxsIG5lZWQgdG8gb2J0YWluIGFuZCByZWFkIGluIHRoZSBmaWxlIHRocm91Z2ggc29tZSBvdGhlciBtZWFucy4gU29ycnkgYWJvdXQgdGhhdC4pXyANCg0KYHNldHdkKCJDOi9Vc2Vycy9haG01NDMvT25lRHJpdmUvTlNGIENvbW1vbiBCZWFuL0NEQk4gR2Vub21pY3MvVW5pbXB1dGVkIERhdGEiKWAgICAgICMgTGFiIENvbXB1dGVyDQpgc2V0d2QoIkM6L1VzZXJzL0FsaWNlL09uZURyaXZlL05TRiBDb21tb24gQmVhbi9DREJOIEdlbm9taWNzL1VuaW1wdXRlZCBEYXRhIilgICAgICAgIyBCZWFuIEdlbmllIC0tPg0KDQpgYGB7ciBSZWFkIGluIERhdGEsIGVjaG8gPSBGQUxTRX0NClNOUHMuc2hvcnQgPC0gcmVhZC50YWJsZSgiQzovVXNlcnMvYWhtNTQzL09uZURyaXZlL05TRiBDb21tb24gQmVhbi9DREJOIEdlbm9taWNzL0NEQk4gU05Qcy84X1Rhc3NlbC9BbGxfNjEwXzE0a1NOUHNfZ2Vub1N1bW1hcnkudHh0Iiwgc2VwID0gIlx0IiwgaGVhZGVyID0gVFJVRSkNClNOUHMuNjA0IDwtIHJlYWQudGFibGUoIkM6L1VzZXJzL2FobTU0My9PbmVEcml2ZS9OU0YgQ29tbW9uIEJlYW4vQ0RCTiBHZW5vbWljcy9DREJOIFNOUHMvOF9UYXNzZWwvNjA0X2luZGl2aWR1YWxfZ2Vub1N1bW1hcnk0LnR4dCIsIHNlcCA9ICJcdCIsIGhlYWRlciA9IFRSVUUpDQoNCnN1bW1hcnkoU05Qcy42MDQpDQpgYGANCg0KSGVyZSdzIGEgc29ydGVkIHRhYmxlIGZvciB0aGUgcHJvcG9ydGlvbiBvZiBoZXRlcm96eWdvdXMgc2l0ZXMgcGVyIHRheGEuIA0KDQpgYGB7ciBTdW1tYXJ5IFRhYmxlIGZvciBOb24tY29tYmluZWQgSW5kaXZpZHVhbCBIZXRlcm96eWdvdXNpdGllc30NCihTTlBzLm5vbmNvbSA8LSBTTlBzLjYwNCAlPiUNCiAgZmlsdGVyKCFncmVwbCgnY29tYmluZWQnLCBUYXhhLk5hbWUpKSAlPiUgIyBTZWxlY3RzIDUyMyByb3dzIHRoYXQgd2VyZSBub3QgY29tYmluZWQgZGF0YS4NCiAgIHNlbGVjdChUYXhhLk5hbWUsIFByb3BvcnRpb24uTWlzc2luZywgUHJvcG9ydGlvbi5IZXRlcm96eWdvdXMpICU+JSANCiAgIGFycmFuZ2UoZGVzYyhQcm9wb3J0aW9uLkhldGVyb3p5Z291cykpICAgICAgICAjIEFycmFuZ2UgdGhlIHRhYmxlIHNvIHRoYXQgdGhlIGdyZWF0ZXN0IGhldGVyb3p5Z291c2l0eSBjb21lcyBmaXJzdC4NCiApDQpgYGANCg0KDQpUaGUgaW1tZWRpYXRlIHByb2JsZW0gaXMgdGhhdCB0aGVyZSBpcyBhIG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwcm9wb3J0aW9uIG9mIHNpdGVzIG1pc3NpbmcgYW5kIHRoZSBwcm9wb3J0aW9uIG9mIGhldGVyb3p5Z291cyBzaXRlcy4NCg0KYGBge3IgUGxvdHRpbmcgSGV0ZXJvenlnb3VzaXR5IHZzIE1pc3NpbmcgRGF0YX0NCiAgZ2dwbG90KFNOUHMubm9uY29tLCBtYXBwaW5nID0gYWVzKHggPSBQcm9wb3J0aW9uLkhldGVyb3p5Z291cywgeSA9IFByb3BvcnRpb24uTWlzc2luZykpICsgDQogICAgIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKCkNCmBgYA0KDQpJZiB3ZSBnZXQgcmlkIG9mIHRheGEgd2l0aCBkaWZmZXJlbnQgcGVyY2VudGFnZXMgb2Ygc2l0ZXMgdGhhdCBhcmUgbWlzc2luZywgaXQgbG9va3MgbGlrZSBoZXRlcm96eWdvdXNpdHkgaXMgcXVpdGUgaGlnaCBpbiB0aGVzZSB2YXJpZXRpZXMgLSAqKmF0IGxlYXN0IDclIGhldGVyb3p5Z291c2l0eSBvbiBhdmVyYWdlLCBidXQgcHJvYmFibHkgdXB3YXJkcyBvZiAxMCUgaWYgd2UgYWNjb3VudCBmb3IgbWlzc2luZyBkYXRhIG9yIGxvdyBjb3ZlcmFnZSBpbiBzb21lIHRheGEuKioNCg0KYGBge3J9DQooSGV0LnN1bW1hcnkgPC0gU05Qcy42MDQgJT4lDQogIGZpbHRlcighZ3JlcGwoJ2NvbWJpbmVkJywgVGF4YS5OYW1lKSkgJT4lICAgICAgICAgICAjIFNlbGVjdHMgNTIzIHJvd3MgdGhhdCB3ZXJlIG5vdCBjb21iaW5lZCBkYXRhLg0KICAgYXJyYW5nZShkZXNjKFByb3BvcnRpb24uSGV0ZXJvenlnb3VzKSkgJT4lICAgICAgICAjIEFycmFuZ2UgdGhlIHRhYmxlIHNvIHRoYXQgdGhlIGdyZWF0ZXN0IGhldGVyb3p5Z291c2l0eSBjb21lcyBmaXJzdC4NCiAgIHN1bW1hcmlzZShoZXQuNzVwZXJjZW50Lm1pc3NpbmcgPSBtZWFuKFByb3BvcnRpb24uSGV0ZXJvenlnb3VzW1Byb3BvcnRpb24uTWlzc2luZyA8PSAwLjc1XSksDQogICAgICAgICAgICAgaGV0LjUwcGVyY2VudC5taXNzaW5nID0gbWVhbihQcm9wb3J0aW9uLkhldGVyb3p5Z291c1tQcm9wb3J0aW9uLk1pc3NpbmcgPD0gMC41MF0pLA0KICAgICAgICAgICAgIGhldC4yNXBlcmNlbnQubWlzc2luZyA9IG1lYW4oUHJvcG9ydGlvbi5IZXRlcm96eWdvdXNbUHJvcG9ydGlvbi5NaXNzaW5nIDw9IDAuMjVdKSwNCiAgICAgICAgICAgICBoZXQuMTIuNXBlcmNlbnQubWlzc2luZyA9IG1lYW4oUHJvcG9ydGlvbi5IZXRlcm96eWdvdXNbUHJvcG9ydGlvbi5NaXNzaW5nIDw9IDAuMTI1XSksDQogICAgICAgICAgICAgaGV0LjYuMjVwZXJjZW50Lm1pc3NpbmcgPSBtZWFuKFByb3BvcnRpb24uSGV0ZXJvenlnb3VzW1Byb3BvcnRpb24uTWlzc2luZyA8PSAwLjA2MjVdKSwNCiAgICAgICAgICAgICBuby42LjI1cGVyY2VudC5taXNzaW5nID0gc3VtKCFpcy5uYShQcm9wb3J0aW9uLk1pc3NpbmdbUHJvcG9ydGlvbi5NaXNzaW5nIDw9IDAuMDYyNV0pKQ0KICAgICAgICAgICAgICkNCiAgICkNCmBgYA0KDQoNCg0KT2ssIHdoYXQgYWJvdXQgYWNyb3NzIHBvc2l0aW9ucyBpbiB0aGUgZ2Vub21lPyBBcmUgdGhlcmUgYW55IGJsb2NrcyBpbiB0aGUgZ2Vub21lIHRoYXQgKGZvciBhbGwgdGF4YSkgYXJlIHBhcnRpY3VsYXJseSBoZXRlcm96eWdvdXM/DQoNCmBgYHtyIFJlYWQgaW4gSGV0ZXJvenlnb3VzaXR5IGRhdGEgYnkgU2l0ZX0NClNOUHMuc2l0ZXMgPC0gcmVhZC50YWJsZSgiQzovVXNlcnMvYWhtNTQzL09uZURyaXZlL05TRiBDb21tb24gQmVhbi9DREJOIEdlbm9taWNzL0NEQk4gU05Qcy84X1Rhc3NlbC82MDRfaW5kaXZpZHVhbF9nZW5vU3VtbWFyeTMudHh0Iiwgc2VwID0gIlx0IiwgaGVhZGVyID0gVFJVRSkNCg0KYGBgDQpIZXJlJ3MgYSBzdW1tYXJ5IG9mIHRoZSBnZW5vdHlwaWMgZGF0YSwgYXZlcmFnZWQgYnkgc2l0ZS4gVGhlIG9ubHkgcmVhbGx5IGhlbHBmdWwgdGhpbmcgaGVyZSBpcyB0aGF0IHRoZSBQcm9wb3J0aW9uLkhldGVyb3p5Z291cyBoYXMgcmVhbGx5IHF1aXRlIGEgbG93IHRoaXJkIHF1YXJ0aWxlICgwLjA5KSwgd2hpY2ggcHJvYmFibHkgaW5kaWNhdGVzIHRoZXJlIGFyZW4ndCBhIGh1Z2UgbnVtYmVyIG9mIHByb2JsZW1hdGljIFNOUHMuDQoNCmBgYHtyIFNpdGUgVGFibGUgU3VtbWFyeX0NCg0Kc3VtbWFyeShTTlBzLnNpdGVzKQ0KYGBgDQoNCklmIHlvdSBwbG90IGhldGVyb3p5Z291c2l0eSBieSBjaHJvbW9zb21lLCB5b3Ugc2VlIHRoYXQgbXkgZioqKmluZyBTTlAgY2FsbGluZyBkaWQgbm90IGFjdHVhbGx5IGZpbmlzaCB0aGUgd2F5IEkgdGhvdWdodCBpdCBkaWQhIEl0IG9ubHkgZ290IHRvIGNocm9tb3NvbWUgNyEgT2ssIEkgbWF5IGhhdmUgdG8gcmVxdWVzdCBhID4+NDhociBqb2IgdG8gZmluaXNoIGNhbGxpbmcgdGhlc2UgYmFzdGFyZHMuDQoNCklmIHlvdSBqdXN0IGxvb2sgYXQgdGhlIFNOUHMgSSBoYXZlLCB5b3Ugc2VlIHRoZXJlIGFyZSBzb21lIHNwaWtlcyBpbiBoZXRlcm96eWdvdXNpdHkgaW4gYSBmZXcgcGxhY2VzIHRoYXQgd2Ugc2hvdWxkIGJlIGNvbmNlcm5lZCBhYm91dCAoZW5kIG9mIENocjEsIDMsIGFuZCA1IC0gSSBiZXQgeW91IGFueXRoaW5nIHRoZXNlIGFyZSBSLWdlbmUgY2x1c3RlcnMhKS4NCg0KYGBge3IgcGxvdCBoZXRlcm96eWdvdXNpdHkgYnkgY2hyb21vc29tZX0NCmdncGxvdChkYXRhID0gU05Qcy5zaXRlcywgbWFwcGluZyA9IGFlcyh4ID0gUGh5c2ljYWwuUG9zaXRpb24sIHkgPSBQcm9wb3J0aW9uLkhldGVyb3p5Z291cykpICsgDQogIGdlb21faGV4KCkgKyBnZW9tX3Ntb290aChjb2xvciA9ICJ3aGl0ZSIpICsNCiAgICBmYWNldF93cmFwKCB+IENocm9tb3NvbWUpDQoNCmBgYA0KDQpMZXQncyB6b29tIGluIG9uIGRpZmZlcmVudCBwYXJ0cyBvZiBDaHJvbW9zb21lIDEgdG8gc2VlIGlmIHRoZXNlIGFyZSByZWFsbHkgaG90c3BvdHMuIFRoZXkgYXJlLCBwcmV0dHkgY29udmluY2luZ2x5Lg0KDQpgYGB7ciBDaHJvbW9zb21lIDEgSGV0ZXJvenlnb3VzaXR5IGJ5IHBvc2l0aW9ufQ0KQ2hyMSA8LSBmaWx0ZXIoU05Qcy5zaXRlcywgQ2hyb21vc29tZSA9PSAxKQ0KQ2hyMS5wdDEgPC0gZmlsdGVyKENocjEsIFBoeXNpY2FsLlBvc2l0aW9uIDwgMjAwMDAwMCkNCkNocjEucHQyIDwtIGZpbHRlcihDaHIxLCBQaHlzaWNhbC5Qb3NpdGlvbiAlaW4lIGMoMjAwMDAwMDo0MDAwMDAwKSkNCkNocjEucHQzIDwtIGZpbHRlcihDaHIxLCBQaHlzaWNhbC5Qb3NpdGlvbiAlaW4lIGMoNDAwMDAwMDo1MjAwMDAwKSkNCmdncGxvdChkYXRhID0gQ2hyMS5wdDEsIG1hcHBpbmcgPSBhZXMoeCA9IFBoeXNpY2FsLlBvc2l0aW9uLCB5ID0gUHJvcG9ydGlvbi5IZXRlcm96eWdvdXMpKSArIA0KICBnZW9tX2hleChiaW5zID0gMjAwKQ0KZ2dwbG90KGRhdGEgPSBDaHIxLnB0MiwgbWFwcGluZyA9IGFlcyh4ID0gUGh5c2ljYWwuUG9zaXRpb24sIHkgPSBQcm9wb3J0aW9uLkhldGVyb3p5Z291cykpICsgDQogIGdlb21faGV4KGJpbnMgPSAyMDApDQpnZ3Bsb3QoZGF0YSA9IENocjEucHQzLCBtYXBwaW5nID0gYWVzKHggPSBQaHlzaWNhbC5Qb3NpdGlvbiwgeSA9IFByb3BvcnRpb24uSGV0ZXJvenlnb3VzKSkgKyANCiAgZ2VvbV9oZXgoYmlucyA9IDEyMCkNCg0KYGBgDQoNCg0KRG8gdGhlc2UgJ2hldGVyb3p5Z291c2l0eSBob3RzcG90cycgbWFwIHRvIGZyZXF1ZW5jeSBvZiBtYWpvciBvciBtaW5vciBhbGxlbGVzLCBvciB0aGUgcHJvcG9ydGlvbiBvZiBtaXNzaW5nIGFsbGVsZXM/IFRoZXJlIHNlZW1zIHRvIHBlcmhhcHMgYmUgYSByZWxhdGlvbnNoaXAgd2l0aCBhbGwgdGhyZWUuIFRoaXMgbWFrZXMgbWUgd29uZGVyIGlmIHRoaXMgcGF0dGVybiBpc24ndCBhIGhldGVyb3p5Z291c2l0eSBwcm9ibGVtIHNvIG11Y2ggYXMgaXQgaXMgYSByZWR1Y2VkIHJlcHJlc2VudGF0aW9uIHByb2JsZW0uIFdoYXQgZG8geW91IHRoaW5rPz8NCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IENocjEucHQxLCBtYXBwaW5nID0gYWVzKHggPSBQaHlzaWNhbC5Qb3NpdGlvbiwgeSA9IFByb3BvcnRpb24uSGV0ZXJvenlnb3VzKSkgKyANCiAgICAgZ2VvbV9oZXgobWFwcGluZyA9IGFlcyh4ID0gUGh5c2ljYWwuUG9zaXRpb24sIHkgPSBNYWpvci5BbGxlbGUuRnJlcXVlbmN5KSwgYmlucyA9IDEyMCkgKyBnZW9tX2xpbmUoY29sb3IgPSAicmVkIikNCg0KZ2dwbG90KGRhdGEgPSBDaHIxLnB0MSwgbWFwcGluZyA9IGFlcyh4ID0gUGh5c2ljYWwuUG9zaXRpb24sIHkgPSBQcm9wb3J0aW9uLkhldGVyb3p5Z291cykpICsgDQogICAgIGdlb21faGV4KG1hcHBpbmcgPSBhZXMoeCA9IFBoeXNpY2FsLlBvc2l0aW9uLCB5ID0gTWlub3IuQWxsZWxlLkZyZXF1ZW5jeSksIGJpbnMgPSAxMjApICsgZ2VvbV9saW5lKGNvbG9yID0gInJlZCIpDQoNCmdncGxvdChkYXRhID0gQ2hyMS5wdDEsIG1hcHBpbmcgPSBhZXMoeCA9IFBoeXNpY2FsLlBvc2l0aW9uLCB5ID0gUHJvcG9ydGlvbi5IZXRlcm96eWdvdXMpKSArIA0KICAgICBnZW9tX2hleChtYXBwaW5nID0gYWVzKHggPSBQaHlzaWNhbC5Qb3NpdGlvbiwgeSA9IFByb3BvcnRpb24uTWlzc2luZyksIGJpbnMgPSAxMjApICsgZ2VvbV9saW5lKGNvbG9yID0gInJlZCIpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K