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==