Introduction and
Background:
I am analyzing a data set compiled in 2020 during the height of
COVID-19. This dataset focused on the relationship between dietary
decisions, population counts, obesity rates and cases of COVID. It
surveyed 170 different countries.
library(tidyverse)
Protein_Data = read_csv(file = "Protein_And_Quantity_Data.csv")
Variable Selection
For my analysis I will be working with the variable “Meat”. By just
quickly glancing at the data set, I can see there are noticable
differences between the amount of meat different countries consume. This
can be due to differences in countries’ climates, geographic conditions,
cultures and religions.
Traditional Confidence
Interval Creation
Since we are not provided the standard deviation of meat consumption
for each of these countries’ populations, I used a simple t test with a
95% confidence interval to calculate that the average meat consumption
across the 170 countries is somewhere between 9.19 and 10.61.
Meat = Protein_Data$Meat
invisible(glimpse(Meat))
num [1:170] 3.13 7.66 3.51 7.62 16.07 ...
Traditional_CI = t.test(Meat, conf.level = 0.95)
Traditional_CI
One Sample t-test
data: Meat
t = 27.536, df = 169, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
9.193009 10.612918
sample estimates:
mean of x
9.902964
Bootstrap Sampling
Confidence Interval Creation
On top of creating a standard confidence interval, I also created one
using the bootstrap sampling method. That is, I ran a programming loop
to take 1,000 samples of the different amounts of meat the countries in
the dataset consumed, using a sample size of 55 each time. I then
constructed a 95% confidence interval, using the sample means found by
that process. Per the bootstrap sampling method; we can infer that the
average meat consumption across the 170 countries is somewhere between
8.29 and 8.69.
invisible(sum(is.na(Meat))) #Shows we have no missing values
invisible(sum(is.nan(Meat))) #Shows we have no invalid values (NaN = not a number)
#Sampling process taken from class notes:
Original.Sample = sample(Meat,
55, #Sample size = 55 values in the sample
replace = FALSE #Sample without replacement
)
Bootstrap_Sample_Vector = NULL # Empty vector will hold samples
for(i in 1:1000){
ith.Bootstrap.Sample = sample(x = Original.Sample,
size = 55, #Sample size must remain the same for every sample
replace = TRUE #Again, sample with replacement
)
Bootstrap_Sample_Vector[i] = mean(ith.Bootstrap.Sample) }
Boot_CI = quantile(Bootstrap_Sample_Vector, c(.025, .0975))
Boot_CI
2.5% 9.75%
9.260504 9.589189
Plot of the Bootstrap
Sampling Distribution
Below is a histogram depicting the distribution of the bootstrap
sampling means of meat consumed amongst the countries in the dataset. By
looking at the visual, it appears that the distribution of meat
consumption is relatively normal, and representative of the quantitative
figure that was found via the bootstrap confidence interval
calculation.
rng <- range(Bootstrap_Sample_Vector, na.rm = TRUE)
Command_Breaks <- seq(rng[1], rng[2], length.out = 15)
##These lines of code will ensure the same number of breaks in histogram every time the file is ran or knitted.
hist(Bootstrap_Sample_Vector,
breaks = Command_Breaks,
xlab = "Sample Means of Meat Consumed",
main="Sampling Distribution of \n Bootstrap Sample Means \n of Global Meat Consumed")

Traditional Method vs
Bootstrap Method
Traditional = [9.19, 10.61] Bootstrap = [8.29, 8.69]
Looking at our two confidence intervals, the first thing we notice is
that the bootstrap interval is far tighter, only having a difference of
0.4 between its lower and upper bound, as opposed to the difference of
1.42 for the t-test interval. This is expected though, as any
distribution of sample means has less variance than a distribution of
single data points. Along with that, the confidence interval coming from
the bootstrap method also provides a lower estimation for the true mean
consumption of meat across the surveyed countries than the confidence
interval which comes from the traditional method.
Given that we cannot confirm normality for the distribution of meat
consumption across these countries, the bootstrap method should be taken
as a more reliable measure of the true average of meat consumption.
LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgRXN0aW1hdGVkIE1lYXQgSW50YWtlIEJ5IENvdW50cnkgaW4gMjAyMCIKYXV0aG9yOiAiQ2hyaXMgQmFobSIKZGF0ZTogIjIwMjUtMDktMDYiCm91dHB1dDogIAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIHRvY19kZXB0aDogNAogICAgZmlnX3dpZHRoOiA2CiAgICBmaWdfaGVpZ2h0OiA0CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRoZW1lOiBsdW1lbgogICAgaGlnaGxpZ2h0OiB0YW5nbwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiA0Ci0tLQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9CmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47CiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOwp9CgpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLwogIGZvbnQtc2l6ZTogMjRweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrUmVkOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIuIjsKfQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLgoKaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7ICAgICAgICAgICAgICAgICAgICAgICMgdXNlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0byBkZXRlY3QKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbgogICBsaWJyYXJ5KGtuaXRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3VyIG1hY2hpbmUuIElmIG5vdCwgaW5zdGFsbCBpdCBhbmQKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbG9hZCBpdCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkuCiMKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgICAgICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiAKICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICAgICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICAgICAgICAjIHN1cHByZXNzIG1lc3NhZ2VzIAogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BICAgICAgICAgICAgIyByZW1vdmUgdGhlIGRlZmF1bHQgbGVhZGluZyBoYXNoIHRhZ3MgaW4gdGhlIG91dHB1dAogICAgICAgICAgICAgICAgICAgICAgKSAgIApgYGAKCiMjIEludHJvZHVjdGlvbiBhbmQgQmFja2dyb3VuZDoKSSBhbSBhbmFseXppbmcgYSBkYXRhIHNldCBjb21waWxlZCBpbiAyMDIwIGR1cmluZyB0aGUgaGVpZ2h0IG9mIENPVklELTE5LiBUaGlzIGRhdGFzZXQgZm9jdXNlZCBvbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZGlldGFyeSBkZWNpc2lvbnMsIHBvcHVsYXRpb24gY291bnRzLCBvYmVzaXR5IHJhdGVzIGFuZCBjYXNlcyBvZiBDT1ZJRC4gSXQgc3VydmV5ZWQgMTcwIGRpZmZlcmVudCBjb3VudHJpZXMuIAoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpQcm90ZWluX0RhdGEgPSByZWFkX2NzdihmaWxlID0gIlByb3RlaW5fQW5kX1F1YW50aXR5X0RhdGEuY3N2IikKYGBgCgojIyBWYXJpYWJsZSBTZWxlY3Rpb24KRm9yIG15IGFuYWx5c2lzIEkgd2lsbCBiZSB3b3JraW5nIHdpdGggdGhlIHZhcmlhYmxlICJNZWF0Ii4gQnkganVzdCBxdWlja2x5IGdsYW5jaW5nIGF0IHRoZSBkYXRhIHNldCwgSSBjYW4gc2VlIHRoZXJlIGFyZSBub3RpY2FibGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgYW1vdW50IG9mIG1lYXQgZGlmZmVyZW50IGNvdW50cmllcyBjb25zdW1lLiBUaGlzIGNhbiBiZSBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gY291bnRyaWVzJyBjbGltYXRlcywgZ2VvZ3JhcGhpYyBjb25kaXRpb25zLCBjdWx0dXJlcyBhbmQgcmVsaWdpb25zLgoKIyMgVHJhZGl0aW9uYWwgQ29uZmlkZW5jZSBJbnRlcnZhbCBDcmVhdGlvbgpTaW5jZSB3ZSBhcmUgbm90IHByb3ZpZGVkIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgbWVhdCBjb25zdW1wdGlvbiBmb3IgZWFjaCBvZiB0aGVzZSBjb3VudHJpZXMnIHBvcHVsYXRpb25zLCBJIHVzZWQgYSBzaW1wbGUgdCB0ZXN0IHdpdGggYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCB0byBjYWxjdWxhdGUgdGhhdCB0aGUgYXZlcmFnZSBtZWF0IGNvbnN1bXB0aW9uIGFjcm9zcyB0aGUgMTcwIGNvdW50cmllcyBpcyBzb21ld2hlcmUgYmV0d2VlbiA5LjE5IGFuZCAxMC42MS4KYGBge3J9Ck1lYXQgPSBQcm90ZWluX0RhdGEkTWVhdAppbnZpc2libGUoZ2xpbXBzZShNZWF0KSkKClRyYWRpdGlvbmFsX0NJID0gdC50ZXN0KE1lYXQsIGNvbmYubGV2ZWwgPSAwLjk1KQpUcmFkaXRpb25hbF9DSQpgYGAKCiMjIEJvb3RzdHJhcCBTYW1wbGluZyBDb25maWRlbmNlIEludGVydmFsIENyZWF0aW9uCk9uIHRvcCBvZiBjcmVhdGluZyBhIHN0YW5kYXJkIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIEkgYWxzbyBjcmVhdGVkIG9uZSB1c2luZyB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIG1ldGhvZC4gVGhhdCBpcywgSSByYW4gYSBwcm9ncmFtbWluZyBsb29wIHRvIHRha2UgMSwwMDAgc2FtcGxlcyBvZiB0aGUgZGlmZmVyZW50IGFtb3VudHMgb2YgbWVhdCB0aGUgY291bnRyaWVzIGluIHRoZSBkYXRhc2V0IGNvbnN1bWVkLCB1c2luZyBhIHNhbXBsZSBzaXplIG9mIDU1IGVhY2ggdGltZS4gSSB0aGVuIGNvbnN0cnVjdGVkIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIHVzaW5nIHRoZSBzYW1wbGUgbWVhbnMgZm91bmQgYnkgdGhhdCBwcm9jZXNzLgpQZXIgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBtZXRob2Q7IHdlIGNhbiBpbmZlciB0aGF0IHRoZSBhdmVyYWdlIG1lYXQgY29uc3VtcHRpb24gYWNyb3NzIHRoZSAxNzAgY291bnRyaWVzIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDguMjkgYW5kIDguNjkuCmBgYHtyfQppbnZpc2libGUoc3VtKGlzLm5hKE1lYXQpKSkgI1Nob3dzIHdlIGhhdmUgbm8gbWlzc2luZyB2YWx1ZXMKaW52aXNpYmxlKHN1bShpcy5uYW4oTWVhdCkpKSAjU2hvd3Mgd2UgaGF2ZSBubyBpbnZhbGlkIHZhbHVlcyAoTmFOID0gbm90IGEgbnVtYmVyKQoKI1NhbXBsaW5nIHByb2Nlc3MgdGFrZW4gZnJvbSBjbGFzcyBub3RlczoKT3JpZ2luYWwuU2FtcGxlID0gc2FtcGxlKE1lYXQsIAogICAgICAgICAgICAgICAgICAgICAgIDU1LCAgICNTYW1wbGUgc2l6ZSA9IDU1IHZhbHVlcyBpbiB0aGUgc2FtcGxlCiAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSA9IEZBTFNFICAjU2FtcGxlIHdpdGhvdXQgcmVwbGFjZW1lbnQKICAgICAgICAgICAgICAgICApIAoKICAgIEJvb3RzdHJhcF9TYW1wbGVfVmVjdG9yID0gTlVMTCAjIEVtcHR5IHZlY3RvciB3aWxsIGhvbGQgc2FtcGxlcwogICAgCiAgICBmb3IoaSBpbiAxOjEwMDApeyAKICAgICAgaXRoLkJvb3RzdHJhcC5TYW1wbGUgPSBzYW1wbGUoeCA9IE9yaWdpbmFsLlNhbXBsZSwgCiAgICAgICAgICAgIHNpemUgPSA1NSwgI1NhbXBsZSBzaXplIG11c3QgcmVtYWluIHRoZSBzYW1lIGZvciBldmVyeSBzYW1wbGUKICAgICAgICAgICAgcmVwbGFjZSA9IFRSVUUgICNBZ2Fpbiwgc2FtcGxlIHdpdGggcmVwbGFjZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgCiAgICAgIEJvb3RzdHJhcF9TYW1wbGVfVmVjdG9yW2ldID0gbWVhbihpdGguQm9vdHN0cmFwLlNhbXBsZSkgfQoKQm9vdF9DSSA9IHF1YW50aWxlKEJvb3RzdHJhcF9TYW1wbGVfVmVjdG9yLCBjKC4wMjUsIC4wOTc1KSkKQm9vdF9DSQpgYGAKCiMjIFBsb3Qgb2YgdGhlIEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24KQmVsb3cgaXMgYSBoaXN0b2dyYW0gZGVwaWN0aW5nIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBtZWFucyBvZiBtZWF0IGNvbnN1bWVkIGFtb25nc3QgdGhlIGNvdW50cmllcyBpbiB0aGUgZGF0YXNldC4gQnkgbG9va2luZyBhdCB0aGUgdmlzdWFsLCBpdCBhcHBlYXJzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtZWF0IGNvbnN1bXB0aW9uIGlzIHJlbGF0aXZlbHkgbm9ybWFsLCBhbmQgcmVwcmVzZW50YXRpdmUgb2YgdGhlIHF1YW50aXRhdGl2ZSBmaWd1cmUgdGhhdCB3YXMgZm91bmQgdmlhIHRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCBjYWxjdWxhdGlvbi4KCmBgYHtyfQpybmcgPC0gcmFuZ2UoQm9vdHN0cmFwX1NhbXBsZV9WZWN0b3IsIG5hLnJtID0gVFJVRSkKQ29tbWFuZF9CcmVha3MgPC0gc2VxKHJuZ1sxXSwgcm5nWzJdLCBsZW5ndGgub3V0ID0gMTUpCiMjVGhlc2UgbGluZXMgb2YgY29kZSB3aWxsIGVuc3VyZSB0aGUgc2FtZSBudW1iZXIgb2YgYnJlYWtzIGluIGhpc3RvZ3JhbSBldmVyeSB0aW1lIHRoZSBmaWxlIGlzIHJhbiBvciBrbml0dGVkLgoKaGlzdChCb290c3RyYXBfU2FtcGxlX1ZlY3RvciwgCiAgICAgYnJlYWtzID0gQ29tbWFuZF9CcmVha3MsIAogICAgICAgeGxhYiA9ICJTYW1wbGUgTWVhbnMgb2YgTWVhdCBDb25zdW1lZCIsCgogICAgICAgIG1haW49IlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBcbiBCb290c3RyYXAgU2FtcGxlIE1lYW5zIFxuIG9mIEdsb2JhbCBNZWF0IENvbnN1bWVkIikgIApgYGAKCiMjIFRyYWRpdGlvbmFsIE1ldGhvZCB2cyBCb290c3RyYXAgTWV0aG9kClRyYWRpdGlvbmFsID0gWzkuMTksIDEwLjYxXQpCb290c3RyYXAgPSBbOC4yOSwgOC42OV0KCkxvb2tpbmcgYXQgb3VyIHR3byBjb25maWRlbmNlIGludGVydmFscywgdGhlIGZpcnN0IHRoaW5nIHdlIG5vdGljZSBpcyB0aGF0IHRoZSBib290c3RyYXAgaW50ZXJ2YWwgaXMgZmFyIHRpZ2h0ZXIsIG9ubHkgaGF2aW5nIGEgZGlmZmVyZW5jZSBvZiAwLjQgYmV0d2VlbiBpdHMgbG93ZXIgYW5kIHVwcGVyIGJvdW5kLCBhcyBvcHBvc2VkIHRvIHRoZSBkaWZmZXJlbmNlIG9mIDEuNDIgZm9yIHRoZSB0LXRlc3QgaW50ZXJ2YWwuIFRoaXMgaXMgZXhwZWN0ZWQgdGhvdWdoLCBhcyBhbnkgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZSBtZWFucyBoYXMgbGVzcyB2YXJpYW5jZSB0aGFuIGEgZGlzdHJpYnV0aW9uIG9mIHNpbmdsZSBkYXRhIHBvaW50cy4gQWxvbmcgd2l0aCB0aGF0LCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBjb21pbmcgZnJvbSB0aGUgYm9vdHN0cmFwIG1ldGhvZCBhbHNvIHByb3ZpZGVzIGEgbG93ZXIgZXN0aW1hdGlvbiBmb3IgdGhlIHRydWUgbWVhbiBjb25zdW1wdGlvbiBvZiBtZWF0IGFjcm9zcyB0aGUgc3VydmV5ZWQgY291bnRyaWVzIHRoYW4gdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgd2hpY2ggY29tZXMgZnJvbSB0aGUgdHJhZGl0aW9uYWwgbWV0aG9kLgoKR2l2ZW4gdGhhdCB3ZSBjYW5ub3QgY29uZmlybSBub3JtYWxpdHkgZm9yIHRoZSBkaXN0cmlidXRpb24gb2YgbWVhdCBjb25zdW1wdGlvbiBhY3Jvc3MgdGhlc2UgY291bnRyaWVzLCB0aGUgYm9vdHN0cmFwIG1ldGhvZCBzaG91bGQgYmUgdGFrZW4gYXMgYSBtb3JlIHJlbGlhYmxlIG1lYXN1cmUgb2YgdGhlIHRydWUgYXZlcmFnZSBvZiBtZWF0IGNvbnN1bXB0aW9uLg==