About
Qualitative Descriptive Analytics aims to gather an in-depth
understanding of the underlying reasons and motivations for an event or
observation. It is typically represented with visuals or charts.
Quantitative Descriptive Analytics focuses on investigating a
phenomenon via statistical, mathematical, and computational techniques.
It aims to quantify an event with metrics and numbers.
In this project, we will explore quantitative analytics using the
babies data set provided. This data is collected to understand different
factors effecting baby weights at birth. Below are the explanations of
the variables:
Bwt: Baby weights in ounces Gestation: Length of pregnancy in days
Height: Mother’s height in inches Smoke: =1 if mother is smoker, = 0
Nonsmoker Age: Mother’s age in years Weight: Mother’s pregnancy weight
Parity: = 0 if the baby is first born, =1 otherwise babies: number of
babies before this birth
Read this worksheet carefully and follow the instructions to complete
the tasks and answer any questions. Submit your work as an HTML or PDF
or Word document to Sakai. If you are submitting as a team project only
one submission from one of the team members will be sufficient but in
this case you need to input the names of the team members in the above
Title section.
Task 1: Testing for missing data (1 point)
babies_old data set will be used to check if it contains any missing
data. First read the babies_old file and make sure you correctly read
the file with the above mentioned variables.
#Read babies_old file and check the variables
library(readxl)
babies_old <- read_excel("C:/Users/jhyne/OneDrive/INFS 343/babies_old.xlsx")
View(babies_old)
Find NA’s in babies_old file
#Check your file for missing data
which(is.na(babies_old))
[1] 5872 5883 5923 5961 6106 6336 6419 6585 6741 6943
[11] 7025
Implement omission strategy to remove observations with missing
values. (0.5 point)
#implement omission strategy and check if all the observations with NA's were omitted.
dim(babies_old)
[1] 1174 8
omissionData <- na.omit(babies_old)
Implement mean imputation strategy (0.5 point)
#Implement imputation strategy
Weightmean = mean(babies_old$weight, na.rm = TRUE)
Weightmean
[1] 128.4996
round(Weightmean,0)
[1] 128
babies_old$weight[is.na(babies_old$weight)]= Weightmean
dim(babies_old)
[1] 1174 8
#View(mydata)
length(which(babies_old$weight == Weightmean))
[1] 11
Task 2: Testing for Outliers(1 point)
Read the babies.csv file and calculate the statistics required to
find out possible outliers for baby weights.
First, read the babies.csv file and calculate the mean, standard
deviation, maximum, and minimum for the bwt column using R.
#Read babies file
library(readxl)
babies <- read_excel("C:/Users/jhyne/OneDrive/INFS 343/babies.xlsx")
View(babies)
#Calculate and display the average, standard deviation, maximum and minimum babies weight.
meanweight = mean(babies$weight)
meanweight
[1] 128.4787
spreadweight=sd(babies$weight)
spreadweight
[1] 20.73428
MaxWeight = max(babies$weight)
MaxWeight
[1] 250
MinWeight = min(babies$weight)
MinWeight
[1] 87
Use the standard approach to find out possible outliers (0.5
points)
Use the formula from class to detect any outliers. An outlier is
value that “lies outside” most of the other values in a set of data.
#calculate the upper and lower thresholds
UpperThreshold = mean(babies$weight) + 3*sd(babies$weight)
UpperThreshold
[1] 190.6816
LowerThreshold = meanweight - 3*spreadweight
LowerThreshold
[1] 66.27586
Do you think there are possible outliers? Why? Yes I do think there
are possible outliers because some of the weights of the babies are way
above the mean and they could be more than 3*SD away from the mean If
you decided that you have possible outliers can you identify the
observations with possible outliers?
#Observations with possible outliers at the upper end
upoutlier = babies$weight > 190.6816
which(upoutlier == TRUE)
[1] 85 108 140 168 170 399 487 527 571 585 678 800 809 816 871 1091
#or
subset(babies, weight > 190.6816)
#observations with possible outliers at the lower end
subset(babies, weight < LowerThreshold)
What is the number of outliers at the lower end and upper end of the
data? Lower end - 0 Upper end - 16 #### Use the IQR approach to identify
outliers (0.5 point)
Another similar method to find the upper and lower thresholds
discussed in class involves finding the interquartile range. Find the
interquantile range using the following chunk.
#Find the inter quantile range
iqrange=IQR(babies$weight)
iqrange
[1] 24.75
The threshold is the boundaries that determine if a value is an
outlier. If the value falls above the upper threshold or below the lower
threshold, it is a possible outlier.
#calculate the upper threshold
subset(babies, weight>UpperThreshold)
#calculate the lower threshold
subset(babies, weight<LowerThreshold)
Do you think there are possible outliers and why? Yes because there
are a lot of ones outside the upperthreshold If you think there are
possible outliers can you identify them? If so how many? There are
16
subset(babies, weight>UpperThreshold)
subset(babies, weight<LowerThreshold)
It can also be useful to visualize the data using a box plot.
boxplot(babies$weight)

Can you identify the outliers from the boxplot? If so how many? It is
difficult to tell but there are at least 16
Task 3: Calculating Z-Value (0.25 points)
Given a birth weight of 182, calculate the corresponding z-value or
z-score.
# Calculate the z-value and display it
mean = mean(babies$weight)
mean
[1] 128.4787
std= sd(babies$weight)
std
[1] 20.73428
zscore=(182-mean)/std
zscore
[1] 2.581295
Based on the z-value, how would you evaluate the weight of this baby.
Explain your logic. The baby is a slight outlier because he is more than
2 zscores away from the mean
Task 4:Relationships with the variables (0.75 points)
How can you describe the relationship between baby weights and other
variables?
#correlation between baby weight and other variables
cat("The correlation coefficient for bwt and Weight is:", cor(babies$bwt,babies$weight), "\n")
The correlation coefficient for bwt and Weight is: 0.1559233
cat("The correlation coefficient for gestation and Weight is:", cor(babies$gestation,babies$weight), "\n")
The correlation coefficient for gestation and Weight is: 0.02365494
cat("The correlation coefficient for parity and Weight is:", cor(babies$parity,babies$weight), "\n")
The correlation coefficient for parity and Weight is: -0.09636209
cat("The corelation coefficient for height and Weight is:", cor(babies$height,babies$weight), "\n")
The corelation coefficient for height and Weight is: 0.4352874
cat("The corelation coefficient for smoke and Weight is:", cor(babies$smoke,babies$weight), "\n")
The corelation coefficient for smoke and Weight is: -0.0602814
cat("The corelation coefficient for age and Weight is:", cor(babies$age,babies$weight), "\n")
The corelation coefficient for age and Weight is: 0.1473221
Your comments on these relationships: A lot of these are really
correleatied. The only one I would say is somewhat correleation is
height and weight, but even that is loosely correleated at 0.435.
This is an R Markdown
Notebook. When you execute code within the notebook, the results appear
beneath the code.
Try executing this chunk by clicking the Run button within
the chunk or by placing your cursor inside it and pressing
Ctrl+Shift+Enter.
plot(cars)
Add a new chunk by clicking the Insert Chunk button on the
toolbar or by pressing Ctrl+Alt+I.
When you save the notebook, an HTML file containing the code and
output will be saved alongside it (click the Preview button or
press Ctrl+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the
editor. Consequently, unlike Knit, Preview does not
run any R code chunks. Instead, the output of the chunk when it was last
run in the editor is displayed.
LS0tDQp0aXRsZTogIklORlMgMzQzIEJ1c2luZXNzIEFuYWx5dGljcyINCmF1dGhvcjogIkpvaG4gSHluZXMiDQpkYXRlOiAiMDMvMDEvMjAyNCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQpzdWJ0aXRsZTogTGFiIEFzc2lnbm1lbnQgMDINCi0tLQ0KDQojIEFib3V0DQoNClF1YWxpdGF0aXZlIERlc2NyaXB0aXZlIEFuYWx5dGljcyBhaW1zIHRvIGdhdGhlciBhbiBpbi1kZXB0aCB1bmRlcnN0YW5kaW5nIG9mIHRoZSB1bmRlcmx5aW5nIHJlYXNvbnMgYW5kIG1vdGl2YXRpb25zIGZvciBhbiBldmVudCBvciBvYnNlcnZhdGlvbi4gSXQgaXMgdHlwaWNhbGx5IHJlcHJlc2VudGVkIHdpdGggdmlzdWFscyBvciBjaGFydHMuIA0KDQpRdWFudGl0YXRpdmUgRGVzY3JpcHRpdmUgQW5hbHl0aWNzIGZvY3VzZXMgb24gaW52ZXN0aWdhdGluZyBhIHBoZW5vbWVub24gdmlhIHN0YXRpc3RpY2FsLCBtYXRoZW1hdGljYWwsIGFuZCBjb21wdXRhdGlvbmFsIHRlY2huaXF1ZXMuIEl0IGFpbXMgdG8gcXVhbnRpZnkgYW4gZXZlbnQgd2l0aCBtZXRyaWNzIGFuZCBudW1iZXJzLiANCg0KSW4gdGhpcyBwcm9qZWN0LCB3ZSB3aWxsIGV4cGxvcmUgcXVhbnRpdGF0aXZlIGFuYWx5dGljcyB1c2luZyB0aGUgYmFiaWVzIGRhdGEgc2V0IHByb3ZpZGVkLiBUaGlzIGRhdGEgaXMgY29sbGVjdGVkIHRvIHVuZGVyc3RhbmQgZGlmZmVyZW50IGZhY3RvcnMgZWZmZWN0aW5nIGJhYnkgd2VpZ2h0cyBhdCBiaXJ0aC4gQmVsb3cgYXJlIHRoZSBleHBsYW5hdGlvbnMgb2YgdGhlIHZhcmlhYmxlczoNCg0KQnd0OiAgICAJICBCYWJ5IHdlaWdodHMgaW4gb3VuY2VzDQpHZXN0YXRpb246CUxlbmd0aCBvZiBwcmVnbmFuY3kgaW4gZGF5cw0KSGVpZ2h0OiAgIAlNb3RoZXIncyBoZWlnaHQgaW4gaW5jaGVzDQpTbW9rZTogICAgCT0xIGlmIG1vdGhlciBpcyBzbW9rZXIsID0gMCBOb25zbW9rZXINCkFnZTogICAgICAJTW90aGVyJ3MgYWdlIGluIHllYXJzDQpXZWlnaHQ6ICAgCU1vdGhlcidzIHByZWduYW5jeSB3ZWlnaHQNClBhcml0eTogICAJPSAwIGlmIHRoZSBiYWJ5IGlzIGZpcnN0IGJvcm4sID0xIG90aGVyd2lzZQ0KYmFiaWVzOiAgIAludW1iZXIgb2YgYmFiaWVzIGJlZm9yZSB0aGlzIGJpcnRoDQoNClJlYWQgdGhpcyB3b3Jrc2hlZXQgY2FyZWZ1bGx5IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBjb21wbGV0ZSB0aGUgdGFza3MgYW5kIGFuc3dlciBhbnkgcXVlc3Rpb25zLiBTdWJtaXQgeW91ciB3b3JrIGFzIGFuIEhUTUwgb3IgUERGIG9yIFdvcmQgZG9jdW1lbnQgdG8gU2FrYWkuIElmIHlvdSBhcmUgc3VibWl0dGluZyBhcyBhIHRlYW0gcHJvamVjdCBvbmx5IG9uZSBzdWJtaXNzaW9uIGZyb20gb25lIG9mIHRoZSB0ZWFtIG1lbWJlcnMgd2lsbCBiZSBzdWZmaWNpZW50IGJ1dCBpbiB0aGlzIGNhc2UgeW91IG5lZWQgdG8gaW5wdXQgdGhlIG5hbWVzIG9mIHRoZSB0ZWFtIG1lbWJlcnMgaW4gdGhlIGFib3ZlIFRpdGxlIHNlY3Rpb24uIA0KDQoNCiMgVGFzayAxOiBUZXN0aW5nIGZvciBtaXNzaW5nIGRhdGEgKDEgcG9pbnQpDQoNCmJhYmllc19vbGQgZGF0YSBzZXQgd2lsbCBiZSB1c2VkIHRvIGNoZWNrIGlmIGl0IGNvbnRhaW5zIGFueSBtaXNzaW5nIGRhdGEuIEZpcnN0IHJlYWQgdGhlIGJhYmllc19vbGQgZmlsZSBhbmQgbWFrZSBzdXJlIHlvdSBjb3JyZWN0bHkgcmVhZCB0aGUgZmlsZSB3aXRoIHRoZSBhYm92ZSBtZW50aW9uZWQgdmFyaWFibGVzLg0KDQpgYGB7cn0NCiNSZWFkIGJhYmllc19vbGQgZmlsZSBhbmQgY2hlY2sgdGhlIHZhcmlhYmxlcw0KbGlicmFyeShyZWFkeGwpDQpiYWJpZXNfb2xkIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL2poeW5lL09uZURyaXZlL0lORlMgMzQzL2JhYmllc19vbGQueGxzeCIpDQpWaWV3KGJhYmllc19vbGQpDQpgYGANCg0KDQojIyMjIEZpbmQgTkEncyBpbiBiYWJpZXNfb2xkIGZpbGUgDQoNCmBgYHtyfQ0KI0NoZWNrIHlvdXIgZmlsZSBmb3IgbWlzc2luZyBkYXRhDQp3aGljaChpcy5uYShiYWJpZXNfb2xkKSkNCmBgYA0KDQojIyMjIEltcGxlbWVudCBvbWlzc2lvbiBzdHJhdGVneSB0byByZW1vdmUgb2JzZXJ2YXRpb25zIHdpdGggbWlzc2luZyB2YWx1ZXMuICgwLjUgcG9pbnQpDQoNCmBgYHtyfQ0KI2ltcGxlbWVudCBvbWlzc2lvbiBzdHJhdGVneSBhbmQgY2hlY2sgaWYgYWxsIHRoZSBvYnNlcnZhdGlvbnMgd2l0aCBOQSdzIHdlcmUgb21pdHRlZC4NCmRpbShiYWJpZXNfb2xkKQ0Kb21pc3Npb25EYXRhIDwtIG5hLm9taXQoYmFiaWVzX29sZCkNCmBgYA0KDQojIyMjIEltcGxlbWVudCBtZWFuIGltcHV0YXRpb24gc3RyYXRlZ3kgKDAuNSBwb2ludCkNCg0KYGBge3J9DQojSW1wbGVtZW50IGltcHV0YXRpb24gc3RyYXRlZ3kNCldlaWdodG1lYW4gPSBtZWFuKGJhYmllc19vbGQkd2VpZ2h0LCBuYS5ybSA9IFRSVUUpDQpXZWlnaHRtZWFuDQpyb3VuZChXZWlnaHRtZWFuLDApDQpiYWJpZXNfb2xkJHdlaWdodFtpcy5uYShiYWJpZXNfb2xkJHdlaWdodCldPSBXZWlnaHRtZWFuDQpkaW0oYmFiaWVzX29sZCkNCiNWaWV3KG15ZGF0YSkNCmxlbmd0aCh3aGljaChiYWJpZXNfb2xkJHdlaWdodCA9PSBXZWlnaHRtZWFuKSkNCmBgYA0KDQojIFRhc2sgMjogVGVzdGluZyBmb3IgT3V0bGllcnMoMSBwb2ludCkNCg0KIyMjIyBSZWFkIHRoZSBiYWJpZXMuY3N2IGZpbGUgYW5kIGNhbGN1bGF0ZSB0aGUgc3RhdGlzdGljcyByZXF1aXJlZCB0byBmaW5kIG91dCBwb3NzaWJsZSBvdXRsaWVycyBmb3IgYmFieSB3ZWlnaHRzLg0KDQpGaXJzdCwgcmVhZCB0aGUgYmFiaWVzLmNzdiBmaWxlIGFuZCBjYWxjdWxhdGUgdGhlIG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbiwgbWF4aW11bSwgYW5kIG1pbmltdW0gZm9yIHRoZSBid3QgY29sdW1uIHVzaW5nIFIuDQoNCmBgYHtyfQ0KI1JlYWQgYmFiaWVzIGZpbGUNCmxpYnJhcnkocmVhZHhsKQ0KYmFiaWVzIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL2poeW5lL09uZURyaXZlL0lORlMgMzQzL2JhYmllcy54bHN4IikNClZpZXcoYmFiaWVzKQ0KYGBgDQoNCmBgYHtyfQ0KI0NhbGN1bGF0ZSBhbmQgZGlzcGxheSB0aGUgYXZlcmFnZSwgc3RhbmRhcmQgZGV2aWF0aW9uLCBtYXhpbXVtIGFuZCBtaW5pbXVtIGJhYmllcyB3ZWlnaHQuIA0KbWVhbndlaWdodCA9IG1lYW4oYmFiaWVzJHdlaWdodCkNCm1lYW53ZWlnaHQNCnNwcmVhZHdlaWdodD1zZChiYWJpZXMkd2VpZ2h0KQ0Kc3ByZWFkd2VpZ2h0DQpNYXhXZWlnaHQgPSBtYXgoYmFiaWVzJHdlaWdodCkNCk1heFdlaWdodA0KTWluV2VpZ2h0ID0gbWluKGJhYmllcyR3ZWlnaHQpDQpNaW5XZWlnaHQNCmBgYA0KDQojIyMjIFVzZSB0aGUgc3RhbmRhcmQgYXBwcm9hY2ggdG8gZmluZCBvdXQgcG9zc2libGUgb3V0bGllcnMgKDAuNSBwb2ludHMpDQoNCg0KVXNlIHRoZSBmb3JtdWxhIGZyb20gY2xhc3MgdG8gZGV0ZWN0IGFueSBvdXRsaWVycy4gQW4gb3V0bGllciBpcyB2YWx1ZSB0aGF0ICJsaWVzIG91dHNpZGUiIG1vc3Qgb2YgdGhlIG90aGVyIHZhbHVlcyBpbiBhIHNldCBvZiBkYXRhLiANCg0KYGBge3J9DQojY2FsY3VsYXRlIHRoZSB1cHBlciBhbmQgbG93ZXIgdGhyZXNob2xkcw0KVXBwZXJUaHJlc2hvbGQgPSBtZWFuKGJhYmllcyR3ZWlnaHQpICsgMypzZChiYWJpZXMkd2VpZ2h0KQ0KVXBwZXJUaHJlc2hvbGQNCkxvd2VyVGhyZXNob2xkID0gbWVhbndlaWdodCAtIDMqc3ByZWFkd2VpZ2h0DQpMb3dlclRocmVzaG9sZA0KYGBgDQoNCkRvIHlvdSB0aGluayB0aGVyZSBhcmUgcG9zc2libGUgb3V0bGllcnM/IFdoeT8gDQpZZXMgSSBkbyB0aGluayB0aGVyZSBhcmUgcG9zc2libGUgb3V0bGllcnMgYmVjYXVzZSBzb21lIG9mIHRoZSB3ZWlnaHRzIG9mIHRoZSBiYWJpZXMgYXJlIHdheSBhYm92ZSB0aGUgbWVhbiBhbmQgdGhleSBjb3VsZCBiZSBtb3JlIHRoYW4gMypTRCBhd2F5IGZyb20gdGhlIG1lYW4NCklmIHlvdSBkZWNpZGVkIHRoYXQgeW91IGhhdmUgcG9zc2libGUgb3V0bGllcnMgY2FuIHlvdSBpZGVudGlmeSB0aGUgb2JzZXJ2YXRpb25zIHdpdGggcG9zc2libGUgb3V0bGllcnM/IA0KDQpgYGB7cn0NCiNPYnNlcnZhdGlvbnMgd2l0aCBwb3NzaWJsZSBvdXRsaWVycyBhdCB0aGUgdXBwZXIgZW5kDQp1cG91dGxpZXIgPSBiYWJpZXMkd2VpZ2h0ID4gMTkwLjY4MTYNCndoaWNoKHVwb3V0bGllciA9PSBUUlVFKQ0KI29yDQpzdWJzZXQoYmFiaWVzLCB3ZWlnaHQgPiAxOTAuNjgxNikNCmBgYA0KDQoNCg0KYGBge3J9DQojb2JzZXJ2YXRpb25zIHdpdGggcG9zc2libGUgb3V0bGllcnMgYXQgdGhlIGxvd2VyIGVuZA0Kc3Vic2V0KGJhYmllcywgd2VpZ2h0IDwgTG93ZXJUaHJlc2hvbGQpDQpgYGANCg0KV2hhdCBpcyB0aGUgbnVtYmVyIG9mIG91dGxpZXJzIGF0IHRoZSBsb3dlciBlbmQgYW5kIHVwcGVyIGVuZCBvZiB0aGUgZGF0YT8NCkxvd2VyIGVuZCAtIDANClVwcGVyIGVuZCAtIDE2DQojIyMjIFVzZSB0aGUgSVFSIGFwcHJvYWNoIHRvIGlkZW50aWZ5IG91dGxpZXJzICgwLjUgcG9pbnQpDQoNCkFub3RoZXIgc2ltaWxhciBtZXRob2QgdG8gZmluZCB0aGUgdXBwZXIgYW5kIGxvd2VyIHRocmVzaG9sZHMgZGlzY3Vzc2VkIGluIGNsYXNzIGludm9sdmVzIGZpbmRpbmcgdGhlIGludGVycXVhcnRpbGUgcmFuZ2UuIEZpbmQgdGhlIGludGVycXVhbnRpbGUgcmFuZ2UgdXNpbmcgdGhlIGZvbGxvd2luZyBjaHVuay4gDQoNCmBgYHtyfSANCiNGaW5kIHRoZSBpbnRlciBxdWFudGlsZSByYW5nZSANCmlxcmFuZ2U9SVFSKGJhYmllcyR3ZWlnaHQpDQppcXJhbmdlDQpgYGANCg0KVGhlIHRocmVzaG9sZCBpcyB0aGUgYm91bmRhcmllcyB0aGF0IGRldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIG91dGxpZXIuIElmIHRoZSB2YWx1ZSBmYWxscyBhYm92ZSB0aGUgdXBwZXIgdGhyZXNob2xkIG9yIGJlbG93IHRoZSBsb3dlciB0aHJlc2hvbGQsIGl0IGlzIGEgcG9zc2libGUgb3V0bGllci4gDQoNCmBgYHtyfSANCiNjYWxjdWxhdGUgdGhlIHVwcGVyIHRocmVzaG9sZA0Kc3Vic2V0KGJhYmllcywgd2VpZ2h0PlVwcGVyVGhyZXNob2xkKQ0KYGBgDQoNCmBgYHtyfQ0KI2NhbGN1bGF0ZSB0aGUgbG93ZXIgdGhyZXNob2xkDQpzdWJzZXQoYmFiaWVzLCB3ZWlnaHQ8TG93ZXJUaHJlc2hvbGQpDQpgYGANCg0KRG8geW91IHRoaW5rIHRoZXJlIGFyZSBwb3NzaWJsZSBvdXRsaWVycyBhbmQgd2h5Pw0KWWVzIGJlY2F1c2UgdGhlcmUgYXJlIGEgbG90IG9mIG9uZXMgb3V0c2lkZSB0aGUgdXBwZXJ0aHJlc2hvbGQNCklmIHlvdSB0aGluayB0aGVyZSBhcmUgcG9zc2libGUgb3V0bGllcnMgY2FuIHlvdSBpZGVudGlmeSB0aGVtPyBJZiBzbyBob3cgbWFueT8NClRoZXJlIGFyZSAxNg0KDQpgYGB7cn0NCnN1YnNldChiYWJpZXMsIHdlaWdodD5VcHBlclRocmVzaG9sZCkNCnN1YnNldChiYWJpZXMsIHdlaWdodDxMb3dlclRocmVzaG9sZCkNCmBgYA0KDQoNCkl0IGNhbiBhbHNvIGJlIHVzZWZ1bCB0byB2aXN1YWxpemUgdGhlIGRhdGEgdXNpbmcgYSBib3ggcGxvdC4NCg0KYGBge3J9IA0KYm94cGxvdChiYWJpZXMkd2VpZ2h0KQ0KDQpgYGANCg0KQ2FuIHlvdSBpZGVudGlmeSB0aGUgb3V0bGllcnMgZnJvbSB0aGUgYm94cGxvdD8gSWYgc28gaG93IG1hbnk/DQpJdCBpcyBkaWZmaWN1bHQgdG8gdGVsbCBidXQgdGhlcmUgYXJlIGF0IGxlYXN0IDE2DQoNCiMgVGFzayAzOiBDYWxjdWxhdGluZyBaLVZhbHVlICgwLjI1IHBvaW50cykNCg0KR2l2ZW4gYSBiaXJ0aCB3ZWlnaHQgb2YgMTgyLCBjYWxjdWxhdGUgdGhlIGNvcnJlc3BvbmRpbmcgei12YWx1ZSBvciB6LXNjb3JlLiANCg0KYGBge3J9DQojICBDYWxjdWxhdGUgdGhlIHotdmFsdWUgYW5kIGRpc3BsYXkgaXQNCm1lYW4gPSBtZWFuKGJhYmllcyR3ZWlnaHQpDQptZWFuDQpzdGQ9IHNkKGJhYmllcyR3ZWlnaHQpDQpzdGQNCnpzY29yZT0oMTgyLW1lYW4pL3N0ZA0KenNjb3JlDQpgYGANCg0KQmFzZWQgb24gdGhlIHotdmFsdWUsIGhvdyB3b3VsZCB5b3UgZXZhbHVhdGUgdGhlIHdlaWdodCBvZiB0aGlzIGJhYnkuIEV4cGxhaW4geW91ciBsb2dpYy4gDQpUaGUgYmFieSBpcyBhIHNsaWdodCBvdXRsaWVyIGJlY2F1c2UgaGUgaXMgbW9yZSB0aGFuIDIgenNjb3JlcyBhd2F5IGZyb20gdGhlIG1lYW4NCg0KIyBUYXNrIDQ6UmVsYXRpb25zaGlwcyB3aXRoIHRoZSB2YXJpYWJsZXMgKDAuNzUgcG9pbnRzKQ0KDQpIb3cgY2FuIHlvdSBkZXNjcmliZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYmFieSB3ZWlnaHRzIGFuZCBvdGhlciB2YXJpYWJsZXM/IA0KYGBge3J9DQojY29ycmVsYXRpb24gYmV0d2VlbiBiYWJ5IHdlaWdodCBhbmQgb3RoZXIgdmFyaWFibGVzDQpjYXQoIlRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBmb3IgYnd0IGFuZCBXZWlnaHQgaXM6IiwgY29yKGJhYmllcyRid3QsYmFiaWVzJHdlaWdodCksICJcbiIpDQoNCmNhdCgiVGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGZvciBnZXN0YXRpb24gYW5kIFdlaWdodCBpczoiLCBjb3IoYmFiaWVzJGdlc3RhdGlvbixiYWJpZXMkd2VpZ2h0KSwgIlxuIikNCg0KY2F0KCJUaGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgZm9yIHBhcml0eSBhbmQgV2VpZ2h0IGlzOiIsIGNvcihiYWJpZXMkcGFyaXR5LGJhYmllcyR3ZWlnaHQpLCAiXG4iKQ0KDQpjYXQoIlRoZSBjb3JlbGF0aW9uIGNvZWZmaWNpZW50IGZvciBoZWlnaHQgYW5kIFdlaWdodCBpczoiLCBjb3IoYmFiaWVzJGhlaWdodCxiYWJpZXMkd2VpZ2h0KSwgIlxuIikNCg0KY2F0KCJUaGUgY29yZWxhdGlvbiBjb2VmZmljaWVudCBmb3Igc21va2UgYW5kIFdlaWdodCBpczoiLCBjb3IoYmFiaWVzJHNtb2tlLGJhYmllcyR3ZWlnaHQpLCAiXG4iKQ0KDQpjYXQoIlRoZSBjb3JlbGF0aW9uIGNvZWZmaWNpZW50IGZvciBhZ2UgYW5kIFdlaWdodCBpczoiLCBjb3IoYmFiaWVzJGFnZSxiYWJpZXMkd2VpZ2h0KSwgIlxuIikNCmBgYA0KDQpZb3VyIGNvbW1lbnRzIG9uIHRoZXNlIHJlbGF0aW9uc2hpcHM6DQpBIGxvdCBvZiB0aGVzZSBhcmUgcmVhbGx5IGNvcnJlbGVhdGllZC4gVGhlIG9ubHkgb25lIEkgd291bGQgc2F5IGlzIHNvbWV3aGF0IGNvcnJlbGVhdGlvbiBpcyBoZWlnaHQgYW5kIHdlaWdodCwgYnV0IGV2ZW4gdGhhdCBpcyBsb29zZWx5IGNvcnJlbGVhdGVkIGF0IDAuNDM1Lg0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gDQoNClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDdHJsK1NoaWZ0K0VudGVyKi4gDQoNCmBgYHtyfQ0KcGxvdChjYXJzKQ0KYGBgDQoNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg==