About this notebook

This is R Markdown Notebook continue my studies of graphing trees using ggtree. I have been working with Variant Call Formats (VCFs, See SAM/BAM and related specifications). The data used is from ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/pilot_data/release/2010_07/exon/snps/ file CEU.exon.2010_03.genotypes.vcf.gz which is part of the 1000genomes project.

Samtools Bcftools or GATK HaplotypeCaller can be used for variant calling. These programs will generate vcf files that will need to be filtered for SNPs and other paramaters. For GATK see From FastQ Data to High-Confidence Variant Calls: The Genome Analysis Toolkit Best Practices Pipeline (https://doi.org/10.1002/0471250953.bi1110s43) by Van der Auwera et. al.

This document was written in RStudio using R Markdown and thus it may contains typos. I take no responsibility for any damage you may do based upon knowledge gained from this document. Please read all instructions before and when installing any computer program(s), application(s) and module(s) / package(s). Please read all instructions before using any program(s), application(s) and module(s) / package(s).

## Loading the following R libraries
library(gdsfmt)
library(SNPRelate) 
library(ggplot2)
library(ggtree)
library(ape)

SNPRelate Code

### Save the path to the GATK vcfs to  variables

exon2010_03genotypes <- "CEU.exon.2010_03.genotypes.vcf"
### turn the VCF file into a less data intensive form (GDS) for easier computing

snpgdsVCF2GDS(exon2010_03genotypes,"CEUexon2010_03genotype.gds",method ="biallelic.only")
### Preparing the data so it is formatted correctly to create a dissimilarity matrix.

genofileExon2010_03 <- snpgdsOpen("CEUexon2010_03genotype.gds")
set.seed(100) ## making the code reproducible

ibs_Exon2010_03 <- snpgdsHCluster(snpgdsIBS(genofileExon2010_03,num.thread=2, autosome.only=FALSE))
Identity-By-State (IBS) analysis on genotypes:
Excluding 49 SNPs (monomorphic: TRUE, MAF: NaN, missing rate: NaN)
Working space: 90 samples, 3,440 SNPs
    using 2 (CPU) cores
IBS:    the sum of all selected genotypes (0,1,2) = 488121
Sun Dec 15 16:24:52 2019    (internal increment: 65536)

[..................................................]  0%, ETC: ---        
[==================================================] 100%, completed, 0s
Sun Dec 15 16:24:52 2019    Done.
rvExon2010_03 <- snpgdsCutTree(ibs_Exon2010_03)
Determine groups by permutation (Z threshold: 15, outlier threshold: 5):
Create 1 groups.
### Saving the dendrograms to new Variables

treeExon2010_03 = rvExon2010_03$dendrogram
plot(rvExon2010_03$dendrogram,horiz=T, main ="CEU.exon.2010_03.genotypes.vcf SNP Tree" )

ggtree and ape Code

tree2 = ggtree(as.phylo(as.hclust(treeExon2010_03)), layout="circular",color='darkgreen', branch.length="branch.length")+ geom_tiplab(size=2.5, aes(angle=angle))+ ggtitle("CEU.exon.2010_03.genotypes.vcf SNP Tree")
tree2

### converting dendrograms to class hclust and to new variables

hcExon2010_03 = as.hclust(rvExon2010_03$dendrogram)
### Making the hclust object into a phylo object in ape

thisExon2010_03 <- as.phylo(hcExon2010_03) 
#### Writing to a newick tree file
write.tree(phy=thisExon2010_03 , file="CEUexon2010_03genotypes.newick") 

Newick Format of trees

The newick format of the saved file

(NA11930:0.06076188698,(NA12043:0.06033848847,(NA11994:0.05995671748,(NA07051:0.05928583721,(NA12776:0.05909499358,(NA12287:0.05893776241,(NA12546:0.05884010489,(NA12413:0.05845146464,(NA12154:0.05827547638,(NA11920:0.0581097818,(NA12045:0.05805355315,(NA06986:0.05780013849,(NA07347:0.05759102976,(NA11918:0.05737944516,(NA11992:0.05719160744,(NA12003:0.05692680589,(NA11831:0.05676047966,(NA12383:0.0566187369,(NA12829:0.05651646832,(NA07346:0.05637855456,(NA12234:0.05632008556,(NA11832:0.05614709088,((NA11830:0.05534591195,NA12144:0.05534591195):0.0005054755299,(NA12005:0.05573779242,((NA07000:0.05450844391,NA12828:0.05450844391):0.001120513186,(NA12762:0.05545329394,(NA12775:0.05532717655,((NA07037:0.05365178262,NA12750:0.05365178262):0.001607203476,(NA12814:0.05491784382,((NA07357:0.05336911151,NA12155:0.05336911151):0.0009418059885,(NA12340:0.05427117222,((NA12273:0.05218100847,(NA12891:0.04903433595,(NA12878:0.03687796209,NA12892:0.03687796209):0.01215637387):0.003146672515):0.001705880089,((NA12347:0.05210896309,NA12400:0.05210896309):0.001425151892,(NA12843:0.05336717085,(NA12890:0.05311198727,((NA10847:0.05055305911,NA12760:0.05055305911):0.00249025893,(NA12749:0.05289726265,(NA11829:0.05270030097,(NA11881:0.05259554217,(NA12283:0.05250511042,((NA12044:0.04792248603,NA12286:0.04792248603):0.004377337486,((NA11843:0.0506318306,NA12748:0.0506318306):0.001373398837,((NA12249:0.04870010985,NA12414:0.04870010985):0.003204675922,(NA12751:0.05170800322,(NA12716:0.05151973142,((NA11893:0.04950325454,NA12718:0.04950325454):0.001522371039,(NA12275:0.05080338904,(NA12348:0.0505532199,((NA12342:0.04755163225,NA12830:0.04755163225):0.00264395034,(NA12058:0.05005136838,((NA06985:0.04616372981,NA12006:0.04616372981):0.00364515562,(NA07048:0.04960065804,((NA12717:0.04779411765,NA12874:0.04779411765):0.001326106937,(NA06984:0.04858367492,(NA11995:0.04829443111,(NA11840:0.04805128445,((NA12272:0.04611194591,NA12815:0.04611194591):0.001379913366,((NA12812:0.04613970588,NA12872:0.04613970588):0.0007757612955,(NA12763:0.04662911816,(NA12341:0.04584688474,((NA10851:0.04375951294,NA12761:0.04375951294):0.001126877505,(NA12004:0.04473378893,((NA12489:0.0414746894,(NA12873:0.04057040186,(NA06989:0.03636363636,NA12156:0.03636363636):0.004206765499):0.0009042875394):0.002076120524,(NA06994:0.04250422171,(NA12282:0.03914448173,(NA11919:0.0382151604,(NA12842:0.03152866242,NA12889:0.03152866242):0.006686497981):0.0009293213316):0.003359739972):0.00104658822):0.001182979005):0.0001526015118):0.000960494293):0.0007822334215):0.0002863490207):0.0005763920931):0.0005594251839):0.0002431466516):0.0002892438108):0.0005365496666):0.0004804334596):0.0002082273857):0.0002424829515):0.0001442142043):0.0003576373128):0.0002501691423):0.000222236538):0.0004941058371):0.000188271806):0.0001967825513):0.0001004436655):0.0002945940816):0.000205286903):9.043174815e-05):0.0001047587986):0.0001969616809):0.0001460553881):6.866923629e-05):0.0002551835736):0.0001669441369):0.0003527735697):0.0003842836661):3.974527651e-05):0.0006069263235):0.0003411422794):6.819045188e-05):0.0001261173869):0.0001756631553):0.0001088353249):0.0001135950605):0.0002957034002):0.0001729946798):5.846899577e-05):0.0001379137604):0.0001022685835):0.0001417427572):0.0001663262341):0.0002648015536):0.0001878377111):0.0002115846046):0.0002091087326):0.0002534146622):5.622864423e-05):0.0001656945766):0.0001759882635):0.0003886402467):9.765752529e-05):0.000157231165):0.0001908436331):0.000670880274):0.0003817709915):0.000423398503);

The newick file format can be used with many programs / software that are capable of generating trees like the following:

  • ete3, ETE Toolkit (python module for phylogenetic analysis) : ETE 3: Reconstruction, analysis and visualization of phylogenomic data. Jaime Huerta-Cepas, Francois Serra and Peer Bork. Mol Biol Evol 2016; https://doi.org/10.1093/molbev/msw046
  • FigTree

References

Tutorials used:

R/Bioconductor Libraries for data analysis and visualization:

LS0tCnRpdGxlOiAiV29ya2luZyB3aXRoIFZDRiBmaWxlcyBhbmQgVHJlZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IGFkZWw5MjIKLS0tCgoKIyBBYm91dCB0aGlzIG5vdGVib29rCgoKVGhpcyBpcyBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2sgY29udGludWUgbXkgc3R1ZGllcyBvZiBncmFwaGluZyB0cmVlcyB1c2luZyBbZ2d0cmVlXSgJaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL2dndHJlZS8pLiBJIGhhdmUgYmVlbiB3b3JraW5nIHdpdGggIFZhcmlhbnQgQ2FsbCBGb3JtYXRzIChWQ0ZzLCBTZWUgW1NBTS9CQU0gYW5kIHJlbGF0ZWQgc3BlY2lmaWNhdGlvbnNdKGh0dHBzOi8vc2FtdG9vbHMuZ2l0aHViLmlvL2h0cy1zcGVjcy8pKS4gVGhlIGRhdGEgdXNlZCBpcyBmcm9tIFtmdHA6Ly9mdHAuMTAwMGdlbm9tZXMuZWJpLmFjLnVrL3ZvbDEvZnRwL3BpbG90X2RhdGEvcmVsZWFzZS8yMDEwXzA3L2V4b24vc25wcy9dKGZ0cDovL2Z0cC4xMDAwZ2Vub21lcy5lYmkuYWMudWsvdm9sMS9mdHAvcGlsb3RfZGF0YS9yZWxlYXNlLzIwMTBfMDcvZXhvbi9zbnBzLykgZmlsZSBDRVUuZXhvbi4yMDEwXzAzLmdlbm90eXBlcy52Y2YuZ3ogd2hpY2ggaXMgcGFydCBvZiB0aGUgMTAwMGdlbm9tZXMgcHJvamVjdC4KCgpbU2FtdG9vbHMgQmNmdG9vbHNdKGh0dHA6Ly9zYW10b29scy5naXRodWIuaW8vYmNmdG9vbHMvaG93dG9zL3ZhcmlhbnQtY2FsbGluZy5odG1sKSBvciBbR0FUSyBIYXBsb3R5cGVDYWxsZXJdKGh0dHBzOi8vc29mdHdhcmUuYnJvYWRpbnN0aXR1dGUub3JnL2dhdGsvZG9jdW1lbnRhdGlvbi90b29sZG9jcy8zLjgtMC9vcmdfYnJvYWRpbnN0aXR1dGVfZ2F0a190b29sc193YWxrZXJzX2hhcGxvdHlwZWNhbGxlcl9IYXBsb3R5cGVDYWxsZXIucGhwKSBjYW4gYmUgdXNlZCBmb3IgdmFyaWFudCBjYWxsaW5nLiBUaGVzZSBwcm9ncmFtcyB3aWxsIGdlbmVyYXRlIHZjZiBmaWxlcyB0aGF0IHdpbGwgbmVlZCB0byBiZSBmaWx0ZXJlZCBmb3IgU05QcyBhbmQgb3RoZXIgcGFyYW1hdGVycy4gRm9yIEdBVEsgc2VlICoqRnJvbSBGYXN0USBEYXRhIHRvIEhpZ2gtQ29uZmlkZW5jZSBWYXJpYW50IENhbGxzOiBUaGUgR2Vub21lIEFuYWx5c2lzIFRvb2xraXQgQmVzdCBQcmFjdGljZXMgUGlwZWxpbmUgKFtodHRwczovL2RvaS5vcmcvMTAuMTAwMi8wNDcxMjUwOTUzLmJpMTExMHM0M10oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDIvMDQ3MTI1MDk1My5iaTExMTBzNDMpKSoqIGJ5IFZhbiBkZXIgQXV3ZXJhIGV0LiBhbC4KCgoKIDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbjsnPioqVGhpcyBkb2N1bWVudCB3YXMgd3JpdHRlbiBpbiBbUlN0dWRpb10oaHR0cHM6Ly93d3cucnN0dWRpby5jb20pIHVzaW5nIFtSIE1hcmtkb3duXShodHRwczovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9sZXNzb24tMS5odG1sKSBhbmQgdGh1cyBpdCBtYXkgY29udGFpbnMgdHlwb3MuIEkgdGFrZSBubyByZXNwb25zaWJpbGl0eSBmb3IgYW55IGRhbWFnZSB5b3UgbWF5IGRvIGJhc2VkIHVwb24ga25vd2xlZGdlIGdhaW5lZCBmcm9tIHRoaXMgZG9jdW1lbnQuIFBsZWFzZSByZWFkIGFsbCBpbnN0cnVjdGlvbnMgYmVmb3JlIGFuZCB3aGVuIGluc3RhbGxpbmcgYW55IGNvbXB1dGVyIHByb2dyYW0ocyksIGFwcGxpY2F0aW9uKHMpIGFuZCBtb2R1bGUocykgLyBwYWNrYWdlKHMpLiBQbGVhc2UgcmVhZCBhbGwgaW5zdHJ1Y3Rpb25zIGJlZm9yZSB1c2luZyBhbnkgcHJvZ3JhbShzKSwgYXBwbGljYXRpb24ocykgYW5kIG1vZHVsZShzKSAvIHBhY2thZ2UocykuKio8L3NwYW4+CgpgYGB7cixtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyBMb2FkaW5nIHRoZSBmb2xsb3dpbmcgUiBsaWJyYXJpZXMKbGlicmFyeShnZHNmbXQpCmxpYnJhcnkoU05QUmVsYXRlKSAKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdndHJlZSkKbGlicmFyeShhcGUpCmBgYAoKCiMjIFNOUFJlbGF0ZSBDb2RlCgpgYGB7cn0KIyMjIFNhdmUgdGhlIHBhdGggdG8gdGhlIEdBVEsgdmNmcyB0byAgdmFyaWFibGVzCgpleG9uMjAxMF8wM2dlbm90eXBlcyA8LSAiQ0VVLmV4b24uMjAxMF8wMy5nZW5vdHlwZXMudmNmIgpgYGAKCgoKYGBge3IsZXZhbD1GQUxTRX0KIyMjIHR1cm4gdGhlIFZDRiBmaWxlIGludG8gYSBsZXNzIGRhdGEgaW50ZW5zaXZlIGZvcm0gKEdEUykgZm9yIGVhc2llciBjb21wdXRpbmcKCnNucGdkc1ZDRjJHRFMoZXhvbjIwMTBfMDNnZW5vdHlwZXMsIkNFVWV4b24yMDEwXzAzZ2Vub3R5cGUuZ2RzIixtZXRob2QgPSJiaWFsbGVsaWMub25seSIpCmBgYAoKCgoKYGBge3IsZXZhbD1GQUxTRX0KIyMjIFByZXBhcmluZyB0aGUgZGF0YSBzbyBpdCBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5IHRvIGNyZWF0ZSBhIGRpc3NpbWlsYXJpdHkgbWF0cml4LgoKZ2Vub2ZpbGVFeG9uMjAxMF8wMyA8LSBzbnBnZHNPcGVuKCJDRVVleG9uMjAxMF8wM2dlbm90eXBlLmdkcyIpCmBgYAoKCmBgYHtyfQpzZXQuc2VlZCgxMDApICMjIG1ha2luZyB0aGUgY29kZSByZXByb2R1Y2libGUKCmlic19FeG9uMjAxMF8wMyA8LSBzbnBnZHNIQ2x1c3RlcihzbnBnZHNJQlMoZ2Vub2ZpbGVFeG9uMjAxMF8wMyxudW0udGhyZWFkPTIsIGF1dG9zb21lLm9ubHk9RkFMU0UpKQoKYGBgCgoKCgpgYGB7cn0KcnZFeG9uMjAxMF8wMyA8LSBzbnBnZHNDdXRUcmVlKGlic19FeG9uMjAxMF8wMykKYGBgCgoKCmBgYHtyfQojIyMgU2F2aW5nIHRoZSBkZW5kcm9ncmFtcyB0byBuZXcgVmFyaWFibGVzCgp0cmVlRXhvbjIwMTBfMDMgPSBydkV4b24yMDEwXzAzJGRlbmRyb2dyYW0KYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0xNixmaWcud2lkdGg9OH0KcGxvdChydkV4b24yMDEwXzAzJGRlbmRyb2dyYW0saG9yaXo9VCwgbWFpbiA9IkNFVS5leG9uLjIwMTBfMDMuZ2Vub3R5cGVzLnZjZiBTTlAgVHJlZSIgKQpgYGAKCgojIyBnZ3RyZWUgYW5kIGFwZSBDb2RlCgpgYGB7ciwgZmlnLmhlaWdodD0xMixmaWcud2lkdGg9OH0KdHJlZTIgPSBnZ3RyZWUoYXMucGh5bG8oYXMuaGNsdXN0KHRyZWVFeG9uMjAxMF8wMykpLCBsYXlvdXQ9ImNpcmN1bGFyIixjb2xvcj0nZGFya2dyZWVuJywgYnJhbmNoLmxlbmd0aD0iYnJhbmNoLmxlbmd0aCIpKyBnZW9tX3RpcGxhYihzaXplPTIuNSwgYWVzKGFuZ2xlPWFuZ2xlKSkrIGdndGl0bGUoIkNFVS5leG9uLjIwMTBfMDMuZ2Vub3R5cGVzLnZjZiBTTlAgVHJlZSIpCnRyZWUyCmBgYAoKCmBgYHtyfQojIyMgY29udmVydGluZyBkZW5kcm9ncmFtcyB0byBjbGFzcyBoY2x1c3QgYW5kIHRvIG5ldyB2YXJpYWJsZXMKCmhjRXhvbjIwMTBfMDMgPSBhcy5oY2x1c3QocnZFeG9uMjAxMF8wMyRkZW5kcm9ncmFtKQpgYGAKCmBgYHtyfQojIyMgTWFraW5nIHRoZSBoY2x1c3Qgb2JqZWN0IGludG8gYSBwaHlsbyBvYmplY3QgaW4gYXBlCgp0aGlzRXhvbjIwMTBfMDMgPC0gYXMucGh5bG8oaGNFeG9uMjAxMF8wMykgCmBgYAoKCgpgYGB7cn0KIyMjIyBXcml0aW5nIHRvIGEgbmV3aWNrIHRyZWUgZmlsZQp3cml0ZS50cmVlKHBoeT10aGlzRXhvbjIwMTBfMDMgLCBmaWxlPSJDRVVleG9uMjAxMF8wM2dlbm90eXBlcy5uZXdpY2siKSAKYGBgCgoKIyMgTmV3aWNrIEZvcm1hdCBvZiB0cmVlcyAKCgpUaGUgbmV3aWNrIGZvcm1hdCBvZiB0aGUgc2F2ZWQgZmlsZQoKYGBge2Jhc2gsZXZhbD1GQUxTRX0KKE5BMTE5MzA6MC4wNjA3NjE4ODY5OCwoTkExMjA0MzowLjA2MDMzODQ4ODQ3LChOQTExOTk0OjAuMDU5OTU2NzE3NDgsKE5BMDcwNTE6MC4wNTkyODU4MzcyMSwoTkExMjc3NjowLjA1OTA5NDk5MzU4LChOQTEyMjg3OjAuMDU4OTM3NzYyNDEsKE5BMTI1NDY6MC4wNTg4NDAxMDQ4OSwoTkExMjQxMzowLjA1ODQ1MTQ2NDY0LChOQTEyMTU0OjAuMDU4Mjc1NDc2MzgsKE5BMTE5MjA6MC4wNTgxMDk3ODE4LChOQTEyMDQ1OjAuMDU4MDUzNTUzMTUsKE5BMDY5ODY6MC4wNTc4MDAxMzg0OSwoTkEwNzM0NzowLjA1NzU5MTAyOTc2LChOQTExOTE4OjAuMDU3Mzc5NDQ1MTYsKE5BMTE5OTI6MC4wNTcxOTE2MDc0NCwoTkExMjAwMzowLjA1NjkyNjgwNTg5LChOQTExODMxOjAuMDU2NzYwNDc5NjYsKE5BMTIzODM6MC4wNTY2MTg3MzY5LChOQTEyODI5OjAuMDU2NTE2NDY4MzIsKE5BMDczNDY6MC4wNTYzNzg1NTQ1NiwoTkExMjIzNDowLjA1NjMyMDA4NTU2LChOQTExODMyOjAuMDU2MTQ3MDkwODgsKChOQTExODMwOjAuMDU1MzQ1OTExOTUsTkExMjE0NDowLjA1NTM0NTkxMTk1KTowLjAwMDUwNTQ3NTUyOTksKE5BMTIwMDU6MC4wNTU3Mzc3OTI0MiwoKE5BMDcwMDA6MC4wNTQ1MDg0NDM5MSxOQTEyODI4OjAuMDU0NTA4NDQzOTEpOjAuMDAxMTIwNTEzMTg2LChOQTEyNzYyOjAuMDU1NDUzMjkzOTQsKE5BMTI3NzU6MC4wNTUzMjcxNzY1NSwoKE5BMDcwMzc6MC4wNTM2NTE3ODI2MixOQTEyNzUwOjAuMDUzNjUxNzgyNjIpOjAuMDAxNjA3MjAzNDc2LChOQTEyODE0OjAuMDU0OTE3ODQzODIsKChOQTA3MzU3OjAuMDUzMzY5MTExNTEsTkExMjE1NTowLjA1MzM2OTExMTUxKTowLjAwMDk0MTgwNTk4ODUsKE5BMTIzNDA6MC4wNTQyNzExNzIyMiwoKE5BMTIyNzM6MC4wNTIxODEwMDg0NywoTkExMjg5MTowLjA0OTAzNDMzNTk1LChOQTEyODc4OjAuMDM2ODc3OTYyMDksTkExMjg5MjowLjAzNjg3Nzk2MjA5KTowLjAxMjE1NjM3Mzg3KTowLjAwMzE0NjY3MjUxNSk6MC4wMDE3MDU4ODAwODksKChOQTEyMzQ3OjAuMDUyMTA4OTYzMDksTkExMjQwMDowLjA1MjEwODk2MzA5KTowLjAwMTQyNTE1MTg5MiwoTkExMjg0MzowLjA1MzM2NzE3MDg1LChOQTEyODkwOjAuMDUzMTExOTg3MjcsKChOQTEwODQ3OjAuMDUwNTUzMDU5MTEsTkExMjc2MDowLjA1MDU1MzA1OTExKTowLjAwMjQ5MDI1ODkzLChOQTEyNzQ5OjAuMDUyODk3MjYyNjUsKE5BMTE4Mjk6MC4wNTI3MDAzMDA5NywoTkExMTg4MTowLjA1MjU5NTU0MjE3LChOQTEyMjgzOjAuMDUyNTA1MTEwNDIsKChOQTEyMDQ0OjAuMDQ3OTIyNDg2MDMsTkExMjI4NjowLjA0NzkyMjQ4NjAzKTowLjAwNDM3NzMzNzQ4NiwoKE5BMTE4NDM6MC4wNTA2MzE4MzA2LE5BMTI3NDg6MC4wNTA2MzE4MzA2KTowLjAwMTM3MzM5ODgzNywoKE5BMTIyNDk6MC4wNDg3MDAxMDk4NSxOQTEyNDE0OjAuMDQ4NzAwMTA5ODUpOjAuMDAzMjA0Njc1OTIyLChOQTEyNzUxOjAuMDUxNzA4MDAzMjIsKE5BMTI3MTY6MC4wNTE1MTk3MzE0MiwoKE5BMTE4OTM6MC4wNDk1MDMyNTQ1NCxOQTEyNzE4OjAuMDQ5NTAzMjU0NTQpOjAuMDAxNTIyMzcxMDM5LChOQTEyMjc1OjAuMDUwODAzMzg5MDQsKE5BMTIzNDg6MC4wNTA1NTMyMTk5LCgoTkExMjM0MjowLjA0NzU1MTYzMjI1LE5BMTI4MzA6MC4wNDc1NTE2MzIyNSk6MC4wMDI2NDM5NTAzNCwoTkExMjA1ODowLjA1MDA1MTM2ODM4LCgoTkEwNjk4NTowLjA0NjE2MzcyOTgxLE5BMTIwMDY6MC4wNDYxNjM3Mjk4MSk6MC4wMDM2NDUxNTU2MiwoTkEwNzA0ODowLjA0OTYwMDY1ODA0LCgoTkExMjcxNzowLjA0Nzc5NDExNzY1LE5BMTI4NzQ6MC4wNDc3OTQxMTc2NSk6MC4wMDEzMjYxMDY5MzcsKE5BMDY5ODQ6MC4wNDg1ODM2NzQ5MiwoTkExMTk5NTowLjA0ODI5NDQzMTExLChOQTExODQwOjAuMDQ4MDUxMjg0NDUsKChOQTEyMjcyOjAuMDQ2MTExOTQ1OTEsTkExMjgxNTowLjA0NjExMTk0NTkxKTowLjAwMTM3OTkxMzM2NiwoKE5BMTI4MTI6MC4wNDYxMzk3MDU4OCxOQTEyODcyOjAuMDQ2MTM5NzA1ODgpOjAuMDAwNzc1NzYxMjk1NSwoTkExMjc2MzowLjA0NjYyOTExODE2LChOQTEyMzQxOjAuMDQ1ODQ2ODg0NzQsKChOQTEwODUxOjAuMDQzNzU5NTEyOTQsTkExMjc2MTowLjA0Mzc1OTUxMjk0KTowLjAwMTEyNjg3NzUwNSwoTkExMjAwNDowLjA0NDczMzc4ODkzLCgoTkExMjQ4OTowLjA0MTQ3NDY4OTQsKE5BMTI4NzM6MC4wNDA1NzA0MDE4NiwoTkEwNjk4OTowLjAzNjM2MzYzNjM2LE5BMTIxNTY6MC4wMzYzNjM2MzYzNik6MC4wMDQyMDY3NjU0OTkpOjAuMDAwOTA0Mjg3NTM5NCk6MC4wMDIwNzYxMjA1MjQsKE5BMDY5OTQ6MC4wNDI1MDQyMjE3MSwoTkExMjI4MjowLjAzOTE0NDQ4MTczLChOQTExOTE5OjAuMDM4MjE1MTYwNCwoTkExMjg0MjowLjAzMTUyODY2MjQyLE5BMTI4ODk6MC4wMzE1Mjg2NjI0Mik6MC4wMDY2ODY0OTc5ODEpOjAuMDAwOTI5MzIxMzMxNik6MC4wMDMzNTk3Mzk5NzIpOjAuMDAxMDQ2NTg4MjIpOjAuMDAxMTgyOTc5MDA1KTowLjAwMDE1MjYwMTUxMTgpOjAuMDAwOTYwNDk0MjkzKTowLjAwMDc4MjIzMzQyMTUpOjAuMDAwMjg2MzQ5MDIwNyk6MC4wMDA1NzYzOTIwOTMxKTowLjAwMDU1OTQyNTE4MzkpOjAuMDAwMjQzMTQ2NjUxNik6MC4wMDAyODkyNDM4MTA4KTowLjAwMDUzNjU0OTY2NjYpOjAuMDAwNDgwNDMzNDU5Nik6MC4wMDAyMDgyMjczODU3KTowLjAwMDI0MjQ4Mjk1MTUpOjAuMDAwMTQ0MjE0MjA0Myk6MC4wMDAzNTc2MzczMTI4KTowLjAwMDI1MDE2OTE0MjMpOjAuMDAwMjIyMjM2NTM4KTowLjAwMDQ5NDEwNTgzNzEpOjAuMDAwMTg4MjcxODA2KTowLjAwMDE5Njc4MjU1MTMpOjAuMDAwMTAwNDQzNjY1NSk6MC4wMDAyOTQ1OTQwODE2KTowLjAwMDIwNTI4NjkwMyk6OS4wNDMxNzQ4MTVlLTA1KTowLjAwMDEwNDc1ODc5ODYpOjAuMDAwMTk2OTYxNjgwOSk6MC4wMDAxNDYwNTUzODgxKTo2Ljg2NjkyMzYyOWUtMDUpOjAuMDAwMjU1MTgzNTczNik6MC4wMDAxNjY5NDQxMzY5KTowLjAwMDM1Mjc3MzU2OTcpOjAuMDAwMzg0MjgzNjY2MSk6My45NzQ1Mjc2NTFlLTA1KTowLjAwMDYwNjkyNjMyMzUpOjAuMDAwMzQxMTQyMjc5NCk6Ni44MTkwNDUxODhlLTA1KTowLjAwMDEyNjExNzM4NjkpOjAuMDAwMTc1NjYzMTU1Myk6MC4wMDAxMDg4MzUzMjQ5KTowLjAwMDExMzU5NTA2MDUpOjAuMDAwMjk1NzAzNDAwMik6MC4wMDAxNzI5OTQ2Nzk4KTo1Ljg0Njg5OTU3N2UtMDUpOjAuMDAwMTM3OTEzNzYwNCk6MC4wMDAxMDIyNjg1ODM1KTowLjAwMDE0MTc0Mjc1NzIpOjAuMDAwMTY2MzI2MjM0MSk6MC4wMDAyNjQ4MDE1NTM2KTowLjAwMDE4NzgzNzcxMTEpOjAuMDAwMjExNTg0NjA0Nik6MC4wMDAyMDkxMDg3MzI2KTowLjAwMDI1MzQxNDY2MjIpOjUuNjIyODY0NDIzZS0wNSk6MC4wMDAxNjU2OTQ1NzY2KTowLjAwMDE3NTk4ODI2MzUpOjAuMDAwMzg4NjQwMjQ2Nyk6OS43NjU3NTI1MjllLTA1KTowLjAwMDE1NzIzMTE2NSk6MC4wMDAxOTA4NDM2MzMxKTowLjAwMDY3MDg4MDI3NCk6MC4wMDAzODE3NzA5OTE1KTowLjAwMDQyMzM5ODUwMyk7CgpgYGAKCgpUaGUgbmV3aWNrIGZpbGUgZm9ybWF0IGNhbiBiZSB1c2VkIHdpdGggbWFueSBwcm9ncmFtcyAvIHNvZnR3YXJlIHRoYXQgYXJlIGNhcGFibGUgb2YgZ2VuZXJhdGluZyB0cmVlcyBsaWtlIHRoZSBmb2xsb3dpbmc6CgorIFtldGUzXShodHRwOi8vZXRldG9vbGtpdC5vcmcpLCBFVEUgVG9vbGtpdCAocHl0aG9uIG1vZHVsZSBmb3IgcGh5bG9nZW5ldGljIGFuYWx5c2lzKSA6IEVURSAzOiBSZWNvbnN0cnVjdGlvbiwgYW5hbHlzaXMgYW5kIHZpc3VhbGl6YXRpb24gb2YgcGh5bG9nZW5vbWljIGRhdGEuIEphaW1lIEh1ZXJ0YS1DZXBhcywgRnJhbmNvaXMgU2VycmEgYW5kIFBlZXIgQm9yay4gTW9sIEJpb2wgRXZvbCAyMDE2OyBbaHR0cHM6Ly9kb2kub3JnLzEwLjEwOTMvbW9sYmV2L21zdzA0Nl0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwOTMvbW9sYmV2L21zdzA0NikKKyBbRmlnVHJlZV0oaHR0cHM6Ly9naXRodWIuY29tL3JhbWJhdXQvZmlndHJlZSkKCiMgUmVmZXJlbmNlcyAKCgo8c3BhbiBzdHlsZT0nY29sb3I6ZmlyZWJyaWNrOyc+VHV0b3JpYWxzIHVzZWQ6PC9zcGFuPgoKCisgW1R1dG9yaWFscyBmb3IgdGhlIFIvQmlvY29uZHVjdG9yIFBhY2thZ2UgU05QUmVsYXRlXShodHRwczovL3d3dy5iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL3JlbGVhc2UvYmlvYy92aWduZXR0ZXMvU05QUmVsYXRlL2luc3QvZG9jL1NOUFJlbGF0ZS5odG1sI2luc3RhbGxhdGlvbi1vZi10aGUtcGFja2FnZS1zbnByZWxhdGUpIGJ5IFhpdXdlbiBaaGVuZwoKKyBbRGF0YSBJbnRlZ3JhdGlvbiwgTWFuaXB1bGF0aW9uIGFuZCBWaXN1YWxpemF0aW9uIG9mIFBoeWxvZ2VuZXRpYyBUcmVlc10oaHR0cHM6Ly95dWxhYi1zbXUuZ2l0aHViLmlvL3RyZWVkYXRhLWJvb2svaW5kZXguaHRtbCkgYnkgR3VhbmdjaHVhbmcgWXUKCjxzcGFuIHN0eWxlPSdjb2xvcjpmaXJlYnJpY2s7Jz5SL0Jpb2NvbmR1Y3RvciBMaWJyYXJpZXMgZm9yIGRhdGEgYW5hbHlzaXMgYW5kIHZpc3VhbGl6YXRpb246PC9zcGFuPgoKCisgW1JdKGh0dHBzOi8vd3d3LnItcHJvamVjdC5vcmcvKQorIFtSU3R1ZGlvXShodHRwczovL3d3dy5yc3R1ZGlvLmNvbS8pCisgW2dndHJlZV0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL2dndHJlZS8pCisgW2FwZV0oaHR0cDovL2FwZS1wYWNrYWdlLmlyZC5mci8pCisgW1NOUFJlbGF0ZV0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL1NOUFJlbGF0ZS8pCisgW1JTdHVkaW9dKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tLykKKyBbUiBNYXJrZG93bl0oaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vbGVzc29uLTEuaHRtbCkK