Question 1: Use the summary function to gain an overview of the data set. Then display the mean and median for at least two attributes of your data.

I will be using the nassCDS data frame in the DAAG library. The description of the data is: “Airbag and other influences on accident fatalities.” Below, I am displaying

library(DAAG)
data(nassCDS, package = 'DAAG')

#Display 4 rows of the nassCDS data to view the data.
head(nassCDS, n = 20)
NA

Below, I have used the summary function in the base R package to gain an overview of the data

# Generate an overview of the data
summary(nassCDS)
     dvcat           weight            dead          airbag        seatbelt        frontal       sex      
 1-9km/h:  686   Min.   :    0.00   alive:25037   none  :11798   none  : 7644   Min.   :0.0000   f:12248  
 10-24  :12848   1st Qu.:   32.47   dead : 1180   airbag:14419   belted:18573   1st Qu.:0.0000   m:13969  
 25-39  : 8214   Median :   86.99                                               Median :1.0000            
 40-54  : 2977   Mean   :  462.81                                               Mean   :0.6433            
 55+    : 1492   3rd Qu.:  364.72                                               3rd Qu.:1.0000            
                 Max.   :57871.59                                               Max.   :1.0000            
                                                                                                          
    ageOFocc        yearacc        yearVeh        abcat             occRole              deploy       injSeverity   
 Min.   :16.00   Min.   :1997   Min.   :1953   Length:26217       Length:26217       Min.   :0.000   Min.   :0.000  
 1st Qu.:22.00   1st Qu.:1998   1st Qu.:1989   Class :character   Class :character   1st Qu.:0.000   1st Qu.:1.000  
 Median :33.00   Median :2000   Median :1994   Mode  :character   Mode  :character   Median :0.000   Median :2.000  
 Mean   :37.21   Mean   :2000   Mean   :1993                                         Mean   :0.337   Mean   :1.716  
 3rd Qu.:48.00   3rd Qu.:2001   3rd Qu.:1997                                         3rd Qu.:1.000   3rd Qu.:3.000  
 Max.   :97.00   Max.   :2002   Max.   :2003                                         Max.   :1.000   Max.   :6.000  
                                NA's   :1                                                            NA's   :153    
    caseid         
 Length:26217      
 Class :character  
 Mode  :character  
                   
                   
                   
                   

Below, I have calculated the mean and median age of the occupant and injury severity. The summariZe function is used

summarize(nassCDS, 'Average Age' = mean(ageOFocc), 'Median Age' = median(ageOFocc), 'Average Severity' = mean(injSeverity, na.rm = TRUE), 'Median Severity' = median(injSeverity, na.rm = TRUE))

I have generated the same mean and median above using the pipe semantics

# Using the pipe semantics
nassCDS %>% summarize('Average Age' = mean(ageOFocc), 'Median Age' = median(ageOFocc), 'Average Severity' = mean(injSeverity, na.rm = TRUE), 'Median Severity' = median(injSeverity, na.rm = TRUE))

Below are the mean and median grouped by impact speed. The data shows that the average injury severity increases with impact speed.

#Mean and median grouped by sex (f = female, m = male). the pipe semantics is used
nassCDS %>% group_by(dvcat) %>% summarize('Average Age' = mean(ageOFocc), 'Median Age' = median(ageOFocc), 'Average Severity' = mean(injSeverity, na.rm = TRUE), 'Median Severity' = median(injSeverity, na.rm = TRUE) )
NA

Question 2: Create a new data frame with a subset of the columns AND rows. There are several ways to do this so feel free to try a couple if you want. Make sure to rename the new data set so it simply just doesn’t write it over.

The new data frame below is a subset of the data containing all occupants above the mean of the age of occupant (ageOFocc). I will be selecting Impact Speed (dvcat), Age of occupant (ageOFocc), and injury severity (injSeverity).

First, I will demonstrate the subset method.

# Create a new data frame from a subset of the data using the subset function. Columns not to be selected are preceded with a minu (-) sign 
nassCDS_Older_Adults_DF = nassCDS %>% subset(ageOFocc >= mean(ageOFocc), c(dvcat, ageOFocc, injSeverity))
head(nassCDS_Older_Adults_DF, n = 2500) %>% arrange(ageOFocc)
NA

Second, I will Select the same dataset above but this time as a data.table instead of a data.frame. Also, the select function is used.

library(dplyr)
library(magrittr)
library(data.table)
nassCDS_Older_Adults_DT <- nassCDS %>% data.table %>% select(dvcat, ageOFocc, injSeverity) %>% filter(ageOFocc >= mean(ageOFocc))
head(nassCDS_Older_Adults_DT, n = 2500) %>% arrange(ageOFocc)
NA

Third, I will select using the R parametric notation data.frame$ to select the columns .

library(dplyr)
# Select desired columns and all rows
nassCDS_Older_Adults_DF2 <- data.frame(nassCDS$dvcat, nassCDS$ageOFocc, nassCDS$injSeverity)

# Eliminate rows below mean age of occupant.
nassCDS_Older_Adults_DF2 <- nassCDS_Older_Adults_DF2 %>% filter(nassCDS$ageOFocc >= mean(nassCDS$ageOFocc))

# Display 2500 rows
head(nassCDS_Older_Adults_DF2, n = 2500)

Question 3: Create new column names for each column in the new data frame created in step 2.

#create a vector of the column names
colNames <- c('Impact Speed', 'Age', 'Injury Severity')

# Rename columns
names(nassCDS_Older_Adults_DF) <- colNames

# Display 5 rows
head(nassCDS_Older_Adults_DF, n = 5)

Use summary function to gain an overview of our new data frame

summary(nassCDS_Older_Adults_DF)
  Impact Speed       Age        Injury Severity
 1-9km/h: 276   Min.   :38.00   Min.   :0.000  
 10-24  :5540   1st Qu.:43.00   1st Qu.:1.000  
 25-39  :3382   Median :51.00   Median :2.000  
 40-54  :1155   Mean   :54.88   Mean   :1.817  
 55+    : 487   3rd Qu.:65.00   3rd Qu.:3.000  
                Max.   :97.00   Max.   :6.000  
                                NA's   :46     

Question 4: Use the summary function to create an overview of your new data frame created in step 2. The print the mean and median for the same two attributes. Please compare (i.e. tell me how the values changed and why).

Below is the mean and median of age of occupant and injury severity. As expected, the average and median age increased since all occupants below the average age are eliminated. The average severity increased for older adults but the median remained the same. The increase in average severity could imply that older people suffer more injury in accidents. This could be due to preexisting illness.The unchanged median means that half of the values in both data sets remain the same on both sides of the value 2. This may also mean a preponderance of 2 in the middle when sorted.

# Using the pipe semantics
nassCDS_Older_Adults_DF %>% summarize('Average Age' = mean(Age), 'Median Age' = median(Age), 'Average Severity' = mean(`Injury Severity`, na.rm = TRUE), 'Median Severity' = median(`Injury Severity`, na.rm = TRUE))

Question 5: For at least 3 different/distinct values in a column please rename so that every value in that column is renamed. For example, change the letter “e” to “excellent”, the letter “a” to “average’ and the word “bad” to “terrible”. Here I am replacing the injury severity with -> 0:none, 1:possible injury, 2:no incapacity, 3:incapacity, 4:killed; 5:unknown, 6:prior death

library(dplyr)

nassCDS_Older_Adults_DF$`Injury Severity`[nassCDS_Older_Adults_DF$`Injury Severity` == 0] <- "none"
nassCDS_Older_Adults_DF$`Injury Severity`[nassCDS_Older_Adults_DF$`Injury Severity` == 1] <- "possible injury"
nassCDS_Older_Adults_DF$`Injury Severity`[nassCDS_Older_Adults_DF$`Injury Severity` == 2] <- "no incapacity"
nassCDS_Older_Adults_DF$`Injury Severity`[nassCDS_Older_Adults_DF$`Injury Severity` == 3] <- "incapacity"
nassCDS_Older_Adults_DF$`Injury Severity`[nassCDS_Older_Adults_DF$`Injury Severity` == 4] <- "killed"
nassCDS_Older_Adults_DF$`Injury Severity`[nassCDS_Older_Adults_DF$`Injury Severity` == 5] <- "unknown"
nassCDS_Older_Adults_DF$`Injury Severity`[nassCDS_Older_Adults_DF$`Injury Severity` == 6] <- "prior death"

head(nassCDS_Older_Adults_DF, n = 2500)

Question 7: BONUS – place the original .csv in a github file and have R read from the link. This should be your own github – not the file source. This will be a very useful skill as you progress in your data science education and career.

gitURL = 'https://raw.githubusercontent.com/hawa1983/R_Bridge/main/nassCDS.csv'
accident.data <- read.csv(file = gitURL, header = TRUE, sep = ",")
head(accident.data, n = 10)
LS0tDQp0aXRsZTogIldlZWsgMiBIb21ld29yayAtIEZvbWJhIEthc3NvaCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClF1ZXN0aW9uIDE6IFVzZSB0aGUgc3VtbWFyeSBmdW5jdGlvbiB0byBnYWluIGFuIG92ZXJ2aWV3IG9mIHRoZSBkYXRhIHNldC4gIFRoZW4gZGlzcGxheSB0aGUgbWVhbiBhbmQgbWVkaWFuIGZvciBhdCBsZWFzdCB0d28gYXR0cmlidXRlcyBvZiB5b3VyIGRhdGEuDQoNCkkgd2lsbCBiZSB1c2luZyB0aGUgbmFzc0NEUyBkYXRhIGZyYW1lIGluIHRoZSBEQUFHIGxpYnJhcnkuIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YSBpczogDQoiQWlyYmFnIGFuZCBvdGhlciBpbmZsdWVuY2VzIG9uIGFjY2lkZW50IGZhdGFsaXRpZXMuIiBCZWxvdywgSSBhbSBkaXNwbGF5aW5nDQoNCmBgYHtyIERvd25sb2FkIHRoZSBkYXRhIGZyYW1lfQ0KIyBGaXJzdCwgSSBpbnN0YWxsZWQgdGhlIERBQUcgcGFja2FnZQ0KI0ltcG9ydCB0aGUgREFBRyBsaWJyYXJ5DQpsaWJyYXJ5KERBQUcpDQoNCiMgRG93bmxvYWQgdGhlIG5hc3NDRFMgZGF0YSBmcmFtZQ0KZGF0YShuYXNzQ0RTLCBwYWNrYWdlID0gJ0RBQUcnKQ0KDQojRGlzcGxheSAyMCByb3dzIG9mIHRoZSBuYXNzQ0RTIGRhdGEgdG8gdmlldyB0aGUgZGF0YS4NCmhlYWQobmFzc0NEUywgbiA9IDIwKQ0KDQpgYGANCg0KQmVsb3csIEkgaGF2ZSB1c2VkIHRoZSBzdW1tYXJ5IGZ1bmN0aW9uIGluIHRoZSBiYXNlIFIgcGFja2FnZSB0byBnYWluIGFuIG92ZXJ2aWV3IG9mIHRoZSBkYXRhDQoNCg0KYGBge3IgT3ZlcnZpZXcgb2YgdGhlIGRhdGF9DQojIEdlbmVyYXRlIGFuIG92ZXJ2aWV3IG9mIHRoZSBkYXRhDQpzdW1tYXJ5KG5hc3NDRFMpDQpgYGANCg0KQmVsb3csIEkgaGF2ZSBjYWxjdWxhdGVkIHRoZSBtZWFuIGFuZCBtZWRpYW4gYWdlIG9mIHRoZSBvY2N1cGFudCBhbmQgaW5qdXJ5IHNldmVyaXR5LiBUaGUgc3VtbWFyaVplIGZ1bmN0aW9uIGlzIHVzZWQNCg0KYGBge3IgTWVhbiBhbmQgTWVkaWFuIGFnZSBhbmQgc2V2ZXJpdHl9DQpzdW1tYXJpemUobmFzc0NEUywgJ0F2ZXJhZ2UgQWdlJyA9IG1lYW4oYWdlT0ZvY2MpLCAnTWVkaWFuIEFnZScgPSBtZWRpYW4oYWdlT0ZvY2MpLCAnQXZlcmFnZSBTZXZlcml0eScgPSBtZWFuKGlualNldmVyaXR5LCBuYS5ybSA9IFRSVUUpLCAnTWVkaWFuIFNldmVyaXR5JyA9IG1lZGlhbihpbmpTZXZlcml0eSwgbmEucm0gPSBUUlVFKSkNCmBgYA0KDQpJIGhhdmUgZ2VuZXJhdGVkIHRoZSBzYW1lIG1lYW4gYW5kIG1lZGlhbiBhYm92ZSB1c2luZyB0aGUgcGlwZSBzZW1hbnRpY3MNCmBgYHtyIHBpcGUgc2VtYW50aWNzIHRvIGdldCBtZWFuIGFuZCBtZWRpYW59DQojIFVzaW5nIHRoZSBwaXBlIHNlbWFudGljcw0KbmFzc0NEUyAlPiUgc3VtbWFyaXplKCdBdmVyYWdlIEFnZScgPSBtZWFuKGFnZU9Gb2NjKSwgJ01lZGlhbiBBZ2UnID0gbWVkaWFuKGFnZU9Gb2NjKSwgJ0F2ZXJhZ2UgU2V2ZXJpdHknID0gbWVhbihpbmpTZXZlcml0eSwgbmEucm0gPSBUUlVFKSwgJ01lZGlhbiBTZXZlcml0eScgPSBtZWRpYW4oaW5qU2V2ZXJpdHksIG5hLnJtID0gVFJVRSkpDQpgYGANCg0KQmVsb3cgYXJlIHRoZSBtZWFuIGFuZCBtZWRpYW4gZ3JvdXBlZCBieSBpbXBhY3Qgc3BlZWQuIFRoZSBkYXRhIHNob3dzIHRoYXQgdGhlIGF2ZXJhZ2UgaW5qdXJ5IHNldmVyaXR5IGluY3JlYXNlcyB3aXRoIGltcGFjdCBzcGVlZC4NCmBgYHtyIGRhdGEgZ3JvdXBlZCBieSBpbXBhY3Qgc3BlZWR9DQojTWVhbiBhbmQgbWVkaWFuIGdyb3VwZWQgYnkgc2V4IChmID0gZmVtYWxlLCBtID0gbWFsZSkuIHRoZSBwaXBlIHNlbWFudGljcyBpcyB1c2VkDQpuYXNzQ0RTICU+JSBncm91cF9ieShkdmNhdCkgJT4lIHN1bW1hcml6ZSgnQXZlcmFnZSBBZ2UnID0gbWVhbihhZ2VPRm9jYyksICdNZWRpYW4gQWdlJyA9IG1lZGlhbihhZ2VPRm9jYyksICdBdmVyYWdlIFNldmVyaXR5JyA9IG1lYW4oaW5qU2V2ZXJpdHksIG5hLnJtID0gVFJVRSksICdNZWRpYW4gU2V2ZXJpdHknID0gbWVkaWFuKGlualNldmVyaXR5LCBuYS5ybSA9IFRSVUUpICkNCg0KYGBgDQpRdWVzdGlvbiAyOiBDcmVhdGUgYSBuZXcgZGF0YSBmcmFtZSB3aXRoIGEgc3Vic2V0IG9mIHRoZSBjb2x1bW5zIEFORCByb3dzLiAgVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBkbyB0aGlzIHNvIGZlZWwgZnJlZSB0byB0cnkgYSBjb3VwbGUgaWYgeW91IHdhbnQuICBNYWtlIHN1cmUgdG8gcmVuYW1lIHRoZSBuZXcgZGF0YSBzZXQgc28gaXQgc2ltcGx5IGp1c3QgZG9lc27igJl0IHdyaXRlIGl0IG92ZXIuDQoNClRoZSBuZXcgZGF0YSBmcmFtZSBiZWxvdyBpcyBhIHN1YnNldCBvZiB0aGUgZGF0YSBjb250YWluaW5nIGFsbCBvY2N1cGFudHMgYWJvdmUgdGhlIG1lYW4gb2YgdGhlIGFnZSBvZiBvY2N1cGFudCAoYWdlT0ZvY2MpLiBJIHdpbGwgYmUgc2VsZWN0aW5nIEltcGFjdCBTcGVlZCAoZHZjYXQpLCBBZ2Ugb2Ygb2NjdXBhbnQgKGFnZU9Gb2NjKSwgYW5kIGluanVyeSBzZXZlcml0eSAoaW5qU2V2ZXJpdHkpLiANCg0KRmlyc3QsIEkgd2lsbCBkZW1vbnN0cmF0ZSB0aGUgc3Vic2V0IG1ldGhvZC4NCg0KYGBge3Igc3Vic2V0dGluZyByb3dzIGFuZCBjb2x1bW5zOiBzdWJzZXQgbWV0aG9kfQ0KIyBDcmVhdGUgYSBuZXcgZGF0YSBmcmFtZSBmcm9tIGEgc3Vic2V0IG9mIHRoZSBkYXRhIHVzaW5nIHRoZSBzdWJzZXQgZnVuY3Rpb24uIENvbHVtbnMgbm90IHRvIGJlIHNlbGVjdGVkIGFyZSBwcmVjZWRlZCB3aXRoIGEgbWludSAoLSkgc2lnbg0KbmFzc0NEU19PbGRlcl9BZHVsdHNfREYgPSBuYXNzQ0RTICU+JSBzdWJzZXQoYWdlT0ZvY2MgPj0gbWVhbihhZ2VPRm9jYyksIGMoZHZjYXQsIGFnZU9Gb2NjLCBpbmpTZXZlcml0eSkpDQoNCiMgU29ydCBieSBhZ2VPRm9jYyB0byBzaG93IHRoYXQgYWdlIDM3IGFuZCBiZWxvdyBpcyBlbGltaW5hdGVkDQpoZWFkKG5hc3NDRFNfT2xkZXJfQWR1bHRzX0RGLCBuID0gMjUwMCkgJT4lIGFycmFuZ2UoYWdlT0ZvY2MpDQoNCmBgYA0KDQpTZWNvbmQsIEkgd2lsbCBTZWxlY3QgdGhlIHNhbWUgZGF0YXNldCBhYm92ZSBidXQgdGhpcyB0aW1lIGFzIGEgZGF0YS50YWJsZSBpbnN0ZWFkIG9mIGEgZGF0YS5mcmFtZS4gQWxzbywgdGhlIHNlbGVjdCBmdW5jdGlvbiBpcyB1c2VkLg0KDQpgYGB7ciBzdWJzZXR0aW5nIHJvd3MgYW5kIGNvbHVtbjogc2VsZWN0IG1ldGhvZH0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbmFzc0NEU19PbGRlcl9BZHVsdHNfRFQgPC0gbmFzc0NEUyAlPiUgZGF0YS50YWJsZSAlPiUgc2VsZWN0KGR2Y2F0LCBhZ2VPRm9jYywgaW5qU2V2ZXJpdHkpICU+JSBmaWx0ZXIoYWdlT0ZvY2MgPj0gbWVhbihhZ2VPRm9jYykpDQpoZWFkKG5hc3NDRFNfT2xkZXJfQWR1bHRzX0RULCBuID0gMjUwMCkgJT4lIGFycmFuZ2UoYWdlT0ZvY2MpDQoNCmBgYA0KDQoNClRoaXJkLCBJIHdpbGwgc2VsZWN0IHVzaW5nIHRoZSBSIHBhcmFtZXRyaWMgbm90YXRpb24gZGF0YS5mcmFtZSQgdG8gc2VsZWN0IHRoZSBjb2x1bW5zDQouDQpgYGB7ciBzdWJzZXR0aW5nIHJvd3MgYW5kIGNvbHVtbjogcGFyYW1ldHJpYyBtZXRob2R9DQpsaWJyYXJ5KGRwbHlyKQ0KIyBTZWxlY3QgZGVzaXJlZCBjb2x1bW5zIGFuZCBhbGwgcm93cw0KbmFzc0NEU19PbGRlcl9BZHVsdHNfREYyIDwtIGRhdGEuZnJhbWUobmFzc0NEUyRkdmNhdCwgbmFzc0NEUyRhZ2VPRm9jYywgbmFzc0NEUyRpbmpTZXZlcml0eSkNCg0KIyBFbGltaW5hdGUgcm93cyBiZWxvdyBtZWFuIGFnZSBvZiBvY2N1cGFudC4NCm5hc3NDRFNfT2xkZXJfQWR1bHRzX0RGMiA8LSBuYXNzQ0RTX09sZGVyX0FkdWx0c19ERjIgJT4lIGZpbHRlcihuYXNzQ0RTJGFnZU9Gb2NjID49IG1lYW4obmFzc0NEUyRhZ2VPRm9jYykpDQoNCiMgRGlzcGxheSAyNTAwIHJvd3MNCmhlYWQobmFzc0NEU19PbGRlcl9BZHVsdHNfREYyLCBuID0gMjUwMCkNCmBgYA0KDQpRdWVzdGlvbiAzOiBDcmVhdGUgbmV3IGNvbHVtbiBuYW1lcyBmb3IgZWFjaCBjb2x1bW4gaW4gdGhlIG5ldyBkYXRhIGZyYW1lIGNyZWF0ZWQgaW4gc3RlcCAyLg0KIA0KYGBge3IgcmVuYW1pbmcgY29sdW1uc30NCiNjcmVhdGUgYSB2ZWN0b3Igb2YgdGhlIGNvbHVtbiBuYW1lcw0KY29sTmFtZXMgPC0gYygnSW1wYWN0IFNwZWVkJywgJ0FnZScsICdJbmp1cnkgU2V2ZXJpdHknKQ0KDQojIFJlbmFtZSBjb2x1bW5zDQpuYW1lcyhuYXNzQ0RTX09sZGVyX0FkdWx0c19ERikgPC0gY29sTmFtZXMNCg0KIyBEaXNwbGF5IDUgcm93cw0KaGVhZChuYXNzQ0RTX09sZGVyX0FkdWx0c19ERiwgbiA9IDUpDQpgYGANCg0KVXNlIHN1bW1hcnkgZnVuY3Rpb24gdG8gZ2FpbiBhbiBvdmVydmlldyBvZiBvdXIgbmV3IGRhdGEgZnJhbWUNCg0KYGBge3Igb3ZlcnZpZXcgb2Ygc3Vic2V0IG9mIGRhdGF9DQpzdW1tYXJ5KG5hc3NDRFNfT2xkZXJfQWR1bHRzX0RGKQ0KYGBgDQpRdWVzdGlvbiA0OiBVc2UgdGhlIHN1bW1hcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIG92ZXJ2aWV3IG9mIHlvdXIgbmV3IGRhdGEgZnJhbWUgY3JlYXRlZCBpbiBzdGVwIDIuICBUaGUgcHJpbnQgdGhlIG1lYW4gYW5kIG1lZGlhbiBmb3IgdGhlIHNhbWUgdHdvIGF0dHJpYnV0ZXMuICBQbGVhc2UgY29tcGFyZSAoaS5lLiB0ZWxsIG1lIGhvdyB0aGUgdmFsdWVzIGNoYW5nZWQgYW5kIHdoeSkuDQoNCg0KQmVsb3cgaXMgdGhlIG1lYW4gYW5kIG1lZGlhbiBvZiBhZ2Ugb2Ygb2NjdXBhbnQgYW5kIGluanVyeSBzZXZlcml0eS4gQXMgZXhwZWN0ZWQsIHRoZSBhdmVyYWdlIGFuZCBtZWRpYW4gYWdlIGluY3JlYXNlZCBzaW5jZSBhbGwgb2NjdXBhbnRzIGJlbG93IHRoZSBhdmVyYWdlIGFnZSBhcmUgZWxpbWluYXRlZC4gVGhlIGF2ZXJhZ2Ugc2V2ZXJpdHkgaW5jcmVhc2VkIGZvciBvbGRlciBhZHVsdHMgYnV0IHRoZSBtZWRpYW4gcmVtYWluZWQgdGhlIHNhbWUuIFRoZSBpbmNyZWFzZSBpbiBhdmVyYWdlIHNldmVyaXR5IGNvdWxkIGltcGx5IHRoYXQgb2xkZXIgcGVvcGxlIHN1ZmZlciBtb3JlIGluanVyeSBpbiBhY2NpZGVudHMuIFRoaXMgY291bGQgYmUgZHVlIHRvIHByZWV4aXN0aW5nIGlsbG5lc3MuVGhlIHVuY2hhbmdlZCBtZWRpYW4gbWVhbnMgdGhhdCBoYWxmIG9mIHRoZSB2YWx1ZXMgaW4gYm90aCBkYXRhIHNldHMgcmVtYWluIHRoZSBzYW1lIG9uIGJvdGggc2lkZXMgb2YgdGhlIHZhbHVlIDIuIFRoaXMgbWF5IGFsc28gbWVhbiBhIHByZXBvbmRlcmFuY2Ugb2YgMiBpbiB0aGUgbWlkZGxlIHdoZW4gc29ydGVkLg0KDQpgYGB7ciBtZWFuIGFuZCBtZWRpYW4gb2Ygc3Vic2V0IG9mIGRhdGF9DQojIFVzaW5nIHRoZSBwaXBlIHNlbWFudGljcw0KbmFzc0NEU19PbGRlcl9BZHVsdHNfREYgJT4lIHN1bW1hcml6ZSgnQXZlcmFnZSBBZ2UnID0gbWVhbihBZ2UpLCAnTWVkaWFuIEFnZScgPSBtZWRpYW4oQWdlKSwgJ0F2ZXJhZ2UgU2V2ZXJpdHknID0gbWVhbihgSW5qdXJ5IFNldmVyaXR5YCwgbmEucm0gPSBUUlVFKSwgJ01lZGlhbiBTZXZlcml0eScgPSBtZWRpYW4oYEluanVyeSBTZXZlcml0eWAsIG5hLnJtID0gVFJVRSkpDQpgYGANClF1ZXN0aW9uIDU6IEZvciBhdCBsZWFzdCAzIGRpZmZlcmVudC9kaXN0aW5jdCB2YWx1ZXMgaW4gYSBjb2x1bW4gcGxlYXNlIHJlbmFtZSBzbyB0aGF0IGV2ZXJ5IHZhbHVlIGluIHRoYXQgY29sdW1uIGlzIHJlbmFtZWQuICBGb3IgZXhhbXBsZSwgY2hhbmdlIHRoZSBsZXR0ZXIg4oCcZeKAnSB0byDigJxleGNlbGxlbnTigJ0sIHRoZSBsZXR0ZXIg4oCcYeKAnSB0byDigJxhdmVyYWdl4oCZIGFuZCB0aGUgd29yZCDigJxiYWTigJ0gdG8g4oCcdGVycmlibGXigJ0uIEhlcmUgSSBhbSByZXBsYWNpbmcgdGhlIGluanVyeSBzZXZlcml0eSB3aXRoIC0+IDA6bm9uZSwgMTpwb3NzaWJsZSBpbmp1cnksIDI6bm8gaW5jYXBhY2l0eSwgMzppbmNhcGFjaXR5LCA0OmtpbGxlZDsgNTp1bmtub3duLCA2OnByaW9yIGRlYXRoDQpgYGB7ciBzdWJzdGl0dXRpbmcgY29sdW1uIHZhbHVlc30NCmxpYnJhcnkoZHBseXIpDQoNCiMgQXNzaWduIG5ldyB2YWx1ZXMNCm5hc3NDRFNfT2xkZXJfQWR1bHRzX0RGJGBJbmp1cnkgU2V2ZXJpdHlgW25hc3NDRFNfT2xkZXJfQWR1bHRzX0RGJGBJbmp1cnkgU2V2ZXJpdHlgID09IDBdIDwtICJub25lIg0KbmFzc0NEU19PbGRlcl9BZHVsdHNfREYkYEluanVyeSBTZXZlcml0eWBbbmFzc0NEU19PbGRlcl9BZHVsdHNfREYkYEluanVyeSBTZXZlcml0eWAgPT0gMV0gPC0gInBvc3NpYmxlIGluanVyeSINCm5hc3NDRFNfT2xkZXJfQWR1bHRzX0RGJGBJbmp1cnkgU2V2ZXJpdHlgW25hc3NDRFNfT2xkZXJfQWR1bHRzX0RGJGBJbmp1cnkgU2V2ZXJpdHlgID09IDJdIDwtICJubyBpbmNhcGFjaXR5Ig0KbmFzc0NEU19PbGRlcl9BZHVsdHNfREYkYEluanVyeSBTZXZlcml0eWBbbmFzc0NEU19PbGRlcl9BZHVsdHNfREYkYEluanVyeSBTZXZlcml0eWAgPT0gM10gPC0gImluY2FwYWNpdHkiDQpuYXNzQ0RTX09sZGVyX0FkdWx0c19ERiRgSW5qdXJ5IFNldmVyaXR5YFtuYXNzQ0RTX09sZGVyX0FkdWx0c19ERiRgSW5qdXJ5IFNldmVyaXR5YCA9PSA0XSA8LSAia2lsbGVkIg0KbmFzc0NEU19PbGRlcl9BZHVsdHNfREYkYEluanVyeSBTZXZlcml0eWBbbmFzc0NEU19PbGRlcl9BZHVsdHNfREYkYEluanVyeSBTZXZlcml0eWAgPT0gNV0gPC0gInVua25vd24iDQpuYXNzQ0RTX09sZGVyX0FkdWx0c19ERiRgSW5qdXJ5IFNldmVyaXR5YFtuYXNzQ0RTX09sZGVyX0FkdWx0c19ERiRgSW5qdXJ5IFNldmVyaXR5YCA9PSA2XSA8LSAicHJpb3IgZGVhdGgiDQoNCiMgRGlzcGxheSAyNTAwIGNvbHVtbnMNCmhlYWQobmFzc0NEU19PbGRlcl9BZHVsdHNfREYsIG4gPSAyNTAwKQ0KYGBgDQoNClF1ZXN0aW9uIDc6IEJPTlVTIOKAkyBwbGFjZSB0aGUgb3JpZ2luYWwgLmNzdiBpbiBhIGdpdGh1YiBmaWxlIGFuZCBoYXZlIFIgcmVhZCBmcm9tIHRoZSBsaW5rLiAgVGhpcyBzaG91bGQgYmUgeW91ciBvd24gZ2l0aHViIOKAkyBub3QgdGhlIGZpbGUgc291cmNlLiAgVGhpcyB3aWxsIGJlIGEgdmVyeSB1c2VmdWwgc2tpbGwgYXMgeW91IHByb2dyZXNzIGluIHlvdXIgZGF0YSBzY2llbmNlIGVkdWNhdGlvbiBhbmQgY2FyZWVyLg0KDQpgYGB7ciB1cGxvYWQgYW5kIHJlYWQgZGF0YSBmcm9tIG15IGdpdGh1Yn0NCmdpdFVSTCA9ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaGF3YTE5ODMvUl9CcmlkZ2UvbWFpbi9uYXNzQ0RTLmNzdicNCmFjY2lkZW50LmRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9IGdpdFVSTCwgaGVhZGVyID0gVFJVRSwgc2VwID0gIiwiKQ0KDQojIERpc3BsYXkgMTAgcm93cw0KaGVhZChhY2NpZGVudC5kYXRhLCBuID0gMTApDQpgYGA=