Directions: Complete two (2) of the 3 Tasks listed in the project.

  1. Complete either Task 1 or Task 2
  1. Complete Task 3

Note: If you Rmd file submission knits you will receive total of (5 points)

# load the packages needed
library(PASWR2)
library(ggplot2)
library(tidyverse)
library(lattice)

1. (5 points) How many packages were loaded?

ANSWER: 4 (Though 19 check marks appear under packages)

Task 1: This is problem 8 on page 196 in the text w/t added questions

Note: Problem 8/p. 196 is modified

Some claim that the final hours aboard the Titanic were marked by class warfare other claim it was characterized by male chivalry. The data frame TITANIC3 from the PASWR2 package contains information pertaining to class status pclass,survival of passengers survived, and gender sex, among others. Based on the information in the data frame:

Load and Access the Data from the package

A description of the variables can be found by running the code:

help("TITANIC3")
data("TITANIC3")

2. (5 points) How many observations and variables are in the TITANIC3 data?

Hint: Use the function dim(), glimpse() or str().

dim(TITANIC3)
[1] 1309   14

ANSWER: There are 1309 rows and 14 columns in TITANIC3.

3. (5 points) Write code to show the first (or last) 6 observation in the TITANIC3 data?

TITANIC3 %>% head
NA
NA
NA

4. (5 points) Using the survived variable in the TITANIC3 data, which is of type integer (0/1) mutate it to a factor variable by running the code below and create new data frame TITANIC.

What are the new levels of survived and its type?

TITANIC <- TITANIC3 %>% mutate(survived = factor(survived, levels = 0:1, labels = c("No", "Yes")))

ANSWER: Levels - Yes, No Type - Factor

5. (5 points) The code below produces summary for the TITANIC Data. Write code using the pipe %>% operator the produces the same result.

summary(TITANIC)
 pclass    survived                               name          sex           age         
 1st:323   No :809   Connolly, Miss. Kate           :   2   female:466   Min.   : 0.1667  
 2nd:277   Yes:500   Kelly, Mr. James               :   2   male  :843   1st Qu.:21.0000  
 3rd:709             Abbing, Mr. Anthony            :   1                Median :28.0000  
                     Abbott, Master. Eugene Joseph  :   1                Mean   :29.8811  
                     Abbott, Mr. Rossmore Edward    :   1                3rd Qu.:39.0000  
                     Abbott, Mrs. Stanton (Rosa Hunt:   1                Max.   :80.0000  
                     (Other)                        :1301                NA's   :263      
     sibsp            parch            ticket          fare                     cabin     
 Min.   :0.0000   Min.   :0.000   CA. 2343:  11   Min.   :  0.000                  :1014  
 1st Qu.:0.0000   1st Qu.:0.000   1601    :   8   1st Qu.:  7.896   B57 B59 B63 B66:   5  
 Median :0.0000   Median :0.000   CA 2144 :   8   Median : 14.454   C23 C25 C27    :   5  
 Mean   :0.4989   Mean   :0.385   3101295 :   7   Mean   : 33.295   G6             :   5  
 3rd Qu.:1.0000   3rd Qu.:0.000   347077  :   7   3rd Qu.: 31.275   B96 B98        :   4  
 Max.   :8.0000   Max.   :9.000   347082  :   7   Max.   :512.329   C22 C26        :   4  
                                  (Other) :1261   NA's   :1         (Other)        : 272  
        embarked        boat          body                      home.dest  
            :  2          :823   Min.   :  1.0                       :564  
 Cherbourg  :270   13     : 39   1st Qu.: 72.0   New York, NY        : 64  
 Queenstown :123   C      : 38   Median :155.0   London              : 14  
 Southampton:914   15     : 37   Mean   :160.8   Montreal, PQ        : 10  
                   14     : 33   3rd Qu.:256.0   Cornwall / Akron, OH:  9  
                   4      : 31   Max.   :328.0   Paris, France       :  9  
                   (Other):308   NA's   :1188    (Other)             :639  

YOUR CODE HERE:

TITANIC %>% summary()
 pclass    survived                               name          sex           age         
 1st:323   No :809   Connolly, Miss. Kate           :   2   female:466   Min.   : 0.1667  
 2nd:277   Yes:500   Kelly, Mr. James               :   2   male  :843   1st Qu.:21.0000  
 3rd:709             Abbing, Mr. Anthony            :   1                Median :28.0000  
                     Abbott, Master. Eugene Joseph  :   1                Mean   :29.8811  
                     Abbott, Mr. Rossmore Edward    :   1                3rd Qu.:39.0000  
                     Abbott, Mrs. Stanton (Rosa Hunt:   1                Max.   :80.0000  
                     (Other)                        :1301                NA's   :263      
     sibsp            parch            ticket          fare                     cabin     
 Min.   :0.0000   Min.   :0.000   CA. 2343:  11   Min.   :  0.000                  :1014  
 1st Qu.:0.0000   1st Qu.:0.000   1601    :   8   1st Qu.:  7.896   B57 B59 B63 B66:   5  
 Median :0.0000   Median :0.000   CA 2144 :   8   Median : 14.454   C23 C25 C27    :   5  
 Mean   :0.4989   Mean   :0.385   3101295 :   7   Mean   : 33.295   G6             :   5  
 3rd Qu.:1.0000   3rd Qu.:0.000   347077  :   7   3rd Qu.: 31.275   B96 B98        :   4  
 Max.   :8.0000   Max.   :9.000   347082  :   7   Max.   :512.329   C22 C26        :   4  
                                  (Other) :1261   NA's   :1         (Other)        : 272  
        embarked        boat          body                      home.dest  
            :  2          :823   Min.   :  1.0                       :564  
 Cherbourg  :270   13     : 39   1st Qu.: 72.0   New York, NY        : 64  
 Queenstown :123   C      : 38   Median :155.0   London              : 14  
 Southampton:914   15     : 37   Mean   :160.8   Montreal, PQ        : 10  
                   14     : 33   3rd Qu.:256.0   Cornwall / Akron, OH:  9  
                   4      : 31   Max.   :328.0   Paris, France       :  9  
                   (Other):308   NA's   :1188    (Other)             :639  

a) (5 points) Determine the fraction of survivors (survived) according to class (pclass).

Hint: Uncomment one of the first 3 lines n the code chunk below and then use the prop.table function.

T1 <- xtabs(~survived + pclass, data = TITANIC)

T1 <- table(TITANIC$survived,TITANIC$pclass)

T1 <- TITANIC %>% select(survived, pclass) %>% table()

T1
        pclass
survived 1st 2nd 3rd
     No  123 158 528
     Yes 200 119 181
prop.table(T1, margin = 2) # to produce the proportion per column (2), per row would be margin = 1
        pclass
survived       1st       2nd       3rd
     No  0.3808050 0.5703971 0.7447109
     Yes 0.6191950 0.4296029 0.2552891

ANSWER: In 1st class percent survived is 61.91950, 2nd class 42.96029, 3rd class 25.52

b) (10 points) Compute the fraction of survivors according to class and gender. Did men in the first class or women in the third class have a higher survival rate?

Hint: Use the code below that creates 3-way table and then use prop.table() similarly to part a).

T2 <- TITANIC %>% select(pclass, sex, survived) %>% table()

T2
, , survived = No

      sex
pclass female male
   1st      5  118
   2nd     12  146
   3rd    110  418

, , survived = Yes

      sex
pclass female male
   1st    139   61
   2nd     94   25
   3rd    106   75
prop.table(T2)
, , survived = No

      sex
pclass      female        male
   1st 0.003819710 0.090145149
   2nd 0.009167303 0.111535523
   3rd 0.084033613 0.319327731

, , survived = Yes

      sex
pclass      female        male
   1st 0.106187930 0.046600458
   2nd 0.071810542 0.019098549
   3rd 0.080977846 0.057295646

ANSWER: 8.1% of women in third class survived while 4.7 % of men in first class survived. Women had a higher rate.

c) (10 points) How would you characterize the distribution of age (e.g., is it symmetric, positively/negatively skewed, unimodal, multimodal)?

Hint: Run the code below that produces some summary statistics and the density distribution. The commented code is old style of R programming, it is shown as it may resemble the textbook examples.

# Finding summary statistics

median(TITANIC$age, na.rm = TRUE) # old style 
[1] 28
mean(TITANIC$age, na.rm = TRUE) # old style
[1] 29.88113
# dplyr style
TITANIC %>% summarise(mean = mean(age, na.rm = TRUE), meadian = median(age, na.rm = TRUE))

IQR(TITANIC$age, na.rm = TRUE) 
[1] 18
TITANIC %>% pull(age) %>% IQR(na.rm = TRUE) # pull() does extract the column from the data frame as vector object
[1] 18
# look at the density function to see if it is uni or bi-modal distribution
ggplot(data = TITANIC, aes(x = age)) +
geom_density(fill = "lightgreen") +
theme_bw()

ANSWER: Positively Skewed. there were a few older passengers

d) (5 points) Were the median and mean ages for females who survived higher or lower than for females who did not survive? Report the median and mean ages as well as an appropriate measure of spread for each statistic.

Hint: Using the dplyr package functions and the pipes operator %>% elegant code can produce summaries for each statistics - mean, median, sd, IRQ.

Without considering the pclass variable, namely regardless of passenger class:
Mean Summaries
# mean summaries
TITANIC %>% group_by(sex, survived) %>% summarise(avg = mean(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.
Standard deviation Summarries
# sd summaries
TITANIC %>% group_by(sex, survived) %>% summarise(stdev = sd(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.

Median Summarries

# median summaries
TITANIC %>% group_by(sex, survived) %>% summarise(med = median(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.

IQR Summarries

# IQR summaries
TITANIC %>% group_by(sex, survived) %>% summarise(IQR = IQR(age, na.rm = TRUE))
`summarise()` has grouped output by 'sex'. You can override using the `.groups` argument.

Based on the summaries, answer the question below:

d-1)

For those who survived, the mean age for females is 29.81535 or 30 and the mean age for males? 26.97778 or 27

d-2) For those who survived, the median age for females is 28.5 or 29 and the median age for males? 27

ANSWER: Women that survived were older than the one ones who did not.

6. (10 points) Now Consider the survived variable in the TITANIC data too, create similar summary statistics and answer the question below.

For those who survived, which class the mean age for females is less than the mean age for males? Third

For those who survived, which class the median age for females is greater than the median age for males? Second

Write your code in the chunk below:

# mean summaries
TITANIC %>% group_by(pclass, sex, survived) %>% summarise(avg = mean(age, na.rm = TRUE))
`summarise()` has grouped output by 'pclass', 'sex'. You can override using the `.groups` argument.
# median summaries

TITANIC %>% group_by(pclass, sex, survived) %>% summarise(med = median(age, na.rm = TRUE))
`summarise()` has grouped output by 'pclass', 'sex'. You can override using the `.groups` argument.

e) (5 points) Were the median and mean ages for males who survived higher or lower than for males who did not survive? Report the median and mean ages as well as an appropriate measure of spread for each statistic.

Hint: Read the output of the code in part d)

ANSWER: In the overall, males that were younger survived than not survive. The males that survived in the 1st and 2nd class were younger, but the third class was age 25 for both. For first class the mean was 36 and median 36. For second class the mean is 17 and median is 19. For third class the mean is 22 and median is 25

f) (5 points) What was the age of the youngest female in the first class who survived? 14

Hint: Complete the code below by specify which variable you want to be arranged.


TITANIC %>% filter (sex =="female" & survived =="Yes" & pclass == "1st") %>% arrange(age)
TITANIC %>% filter (sex =="female" & survived =="Yes" & pclass == "1st") %>% arrange(desc(age))

Arranging in descending order is achieved by specifying in the arrange() function desc(var_name).

7. (5 points) What was the age of the oldest female (male) in the first class who survived?

YOUR CODE HERE:

TITANIC %>% filter(sex =="female" & survived =="Yes" & pclass == "1st") %>% arrange(desc(age))

TITANIC %>% filter (sex =="male" & survived =="Yes" & pclass == "1st") %>% arrange(desc(age))

ANSWER:

Oldest female in 1st class survived was Cavendish, Mrs. Tyrell William, 76 years of age.

Oldest male in 1st class survived was Barkworth, Mr. Algernon Henry Wyears, 80 years of age.

g) (10 points) Do the data suggest that the final hours aboard the Titanic were characterized by class warfare, male chivalry, some combination of both, or neither? Justify your answer based on computations above, or based on other explorations of the data.

Hint: Review and explain the exploratory graphs created by the code chunk. How they support you justification?


TITANIC %>%  ggplot(aes(x = survived)) +
  geom_bar(aes(fill = sex), stat = "count", position = "stack" ) +
  theme_bw()


TITANIC %>%  ggplot(aes(x = survived)) +
  geom_bar(aes(fill = pclass), stat = "count", position = "stack" ) +
  theme_bw()

I would infer that the older male passengers did, in fact, try to protect the young and women. The graph shows more women survived than men. The second graph shows that a high amount of 3rd class male passengers died. That may be because of location of the cabins or maybe the higher class passengers just simply used status over male 3rd class.

Task 1 (Extra Credit, 10 pts): Produce CLEAN data from the TITANIC data by removing all observation with NA

Comment: In most of the code you used/wrote in Task 1, functions were called with argument na.rm = TRUE, instructing the NA values to be dropped for the computations.

part 1) (5 points) Use the function na.omit()(or the filter()) function from dplyr package to create a clean data set that removes subjects if any observations on the subject are unknown Store the modified data frame in a data frame named CLEAN. Run the function dim() on the data frame CLEAN to find the number of observations(rows) in the CLEAN data.

COMPLETE THE CODE HERE, uncomment necessary lines before running:

CLEAN <- na.omit(TITANIC)


#print the dimensions
dim(CLEAN)
[1] 119  14

part 2) (5 points) How many missing values in the data frame TITANIC are there? How many rows of TITANIC have no missing values, one missing value, two missing values, and three missing values, respectively? Note: the number of rows in CLEAN should agree with your answer for the number of rows in TITANIC that have no missing values. What are the cons of cleaning the data in the suggested way?

Use the code, explain what it does.

#get the number of missing values in columns
colNAs<- colSums(is.na(TITANIC))
(colNAs <- as.vector(colSums(is.na(TITANIC)))) # coerce to a vector 
 [1]    0    0    0    0  263    0    0    0    1    0    0    0 1188    0
rowNAs <- table(rowSums(is.na(TITANIC)))
(rowNAs <- as.vector(table(rowSums(is.na(TITANIC))))) # coerce to a vector
[1] 119 928 262

Comment: The missing values are for variables age, fare, and body.

Comment: There are 119 rows with no missing values, 928 rows with 1 missing value, and 262 rows with 2 missing values.

Comment how this align with the dimensions of your CLEAN data. > Your comment: The no missing values is the same and since there is at least one value in every column the 14 is the same amount of columns.

Good practice: Save your customized data frame CLEAN in your working directory as a *.csv file using the function write.csv() using the argument row.names = FALSE.

write.csv(CLEAN, file="TITANIC_CLEAN.csv", row.names=FALSE)

Task 2: This is problem 9 on page 197 in the text as is.

Note: This is not guided task, you have to write your own code from scratch!

Use the CARS2004 data frame from the PASWR2 package, which contains the numbers of cars per 1000 inhabitants (cars), the total number of known mortal accidents (deaths), and the country population/1000 (population) for the 25 member countries of the European Union for the year 2004.

a) (10 points)

YOUR CODE:

library()

ANSWER:

b) (10 points)

YOUR CODE:

ANSWER:

c) (10 points)

YOUR CODE:

ANSWER:

d) (10 points)

YOUR CODE:

ANSWER:

e) (10 points)

YOUR CODE:

ANSWER:

f) (10 points)

YOUR CODE:

ANSWER:

g) (10 points)

YOUR CODE:

ANSWER:

h) (10 points)

YOUR CODE:

ANSWER:

Task 3 (10 points) Create a map with leaflet package, by completing the code below, that displays 5 UNC system schools using their geographic locations. Draw circles with radius proportionate to the school size using the addCircles() function.

Try: E.g. addCircles(weight = 1, radius = sqrt(UNC_schools$size)*100)


set.seed(123)

library(leaflet)

# The code below will create list of 5 UNC university data points with lat & lng, name and school size
# Create data frame with column variables name (of UNC school), students (size), lat, lng)
UNC_schools <- data.frame(name = c("NC State", "UNC Chapel Hill", "FSU", "ECU", "UNC Charlotte", "UNC Greensboro", "UNC Wilmington"),
                        size = c(30130, 28136, 6000, 25990, 25990, 19653, 17843),
                        lat = c(36.0373638, 35.9050353, 35.0726, 35.6073769, 35.2036325, 36.0689, 34.2239),
                        lng = c(-79.0355663, -79.0477533, -78.8924739, -77.3671566, -80.8401145, -79.8102, -77.8696))


# Use the data frame to draw map and circles proportional to the school sizes of the cities
UNC_schools %>%
  leaflet() %>%
  addTiles() %>%
  addCircles(weight = 1, radius = sqrt(UNC_schools$size)*100) # try adjusting the radius by multiplying with 50 instead of 100. What do you notice?
# Circles are smaller

Task 3 (Extra Credit, 5 pts): Add at least two more UNC schools, using their location data and ##enrollment numbers. Modify the code above and update the map for all schools included.

LS0tCnRpdGxlOiAiU1RBVDI3MCAtIFByb2plY3QgMSIKYXV0aG9yOiBCcml0dGFueSBBbmRlcnNvbgpkYXRlOiAnYHIgU3lzLkRhdGUoKWAnCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyMjIERpcmVjdGlvbnM6IENvbXBsZXRlIHR3byAoMikgb2YgdGhlIDMgVGFza3MgbGlzdGVkIGluIHRoZSBwcm9qZWN0LgoKPiAxLiAgQ29tcGxldGUgZWl0aGVyIFRhc2sgMSBvciBUYXNrIDIKCj4gMi4gIENvbXBsZXRlIFRhc2sgMwoKKipOb3RlOioqIElmIHlvdSBgUm1kYCBmaWxlIHN1Ym1pc3Npb24ga25pdHMgeW91IHdpbGwgcmVjZWl2ZSB0b3RhbCBvZiAqKig1IHBvaW50cykqKgoKYGBge3IgcGFja2FnZXMsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBsb2FkIHRoZSBwYWNrYWdlcyBuZWVkZWQKbGlicmFyeShQQVNXUjIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobGF0dGljZSkKYGBgCgojIyMjICoqMS4gKDUgcG9pbnRzKSoqIEhvdyBtYW55IHBhY2thZ2VzIHdlcmUgbG9hZGVkPwoKKipBTlNXRVI6IDQgKFRob3VnaCAxOSBjaGVjayBtYXJrcyBhcHBlYXIgdW5kZXIgcGFja2FnZXMpKioKCiMjIFRhc2sgMTogKipUaGlzIGlzIHByb2JsZW0gOCBvbiBwYWdlIDE5NiBpbiB0aGUgdGV4dCoqIHcvdCBhZGRlZCBxdWVzdGlvbnMKCk5vdGU6ICoqUHJvYmxlbSA4L3AuIDE5NiBpcyBtb2RpZmllZCoqCgpTb21lIGNsYWltIHRoYXQgdGhlIGZpbmFsIGhvdXJzIGFib2FyZCB0aGUgVGl0YW5pYyB3ZXJlIG1hcmtlZCBieSBjbGFzcyB3YXJmYXJlIG90aGVyIGNsYWltIGl0IHdhcyBjaGFyYWN0ZXJpemVkIGJ5IG1hbGUgY2hpdmFscnkuIFRoZSBkYXRhIGZyYW1lIGBUSVRBTklDM2AgZnJvbSB0aGUgYFBBU1dSMmAgcGFja2FnZSBjb250YWlucyBpbmZvcm1hdGlvbiBwZXJ0YWluaW5nIHRvIGNsYXNzIHN0YXR1cyBgcGNsYXNzYCxzdXJ2aXZhbCBvZiBwYXNzZW5nZXJzIGBzdXJ2aXZlZGAsIGFuZCBnZW5kZXIgYHNleGAsIGFtb25nIG90aGVycy4gQmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhIGZyYW1lOgoKIyMjIExvYWQgYW5kIEFjY2VzcyB0aGUgRGF0YSBmcm9tIHRoZSBwYWNrYWdlCgpBIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpYWJsZXMgY2FuIGJlIGZvdW5kIGJ5IHJ1bm5pbmcgdGhlIGNvZGU6CgpgYGB7ciBkYXRhIGRlc2NyaXB0aW9ufQpoZWxwKCJUSVRBTklDMyIpCmRhdGEoIlRJVEFOSUMzIikKYGBgCgojIyMjICoqMi4gKDUgcG9pbnRzKSoqIEhvdyBtYW55IG9ic2VydmF0aW9ucyBhbmQgdmFyaWFibGVzIGFyZSBpbiB0aGUgYFRJVEFOSUMzYCBkYXRhPwoKSGludDogVXNlIHRoZSBmdW5jdGlvbiBgZGltKClgLCBgZ2xpbXBzZSgpYCBvciBgc3RyKClgLgoKYGBge3IgZGltZW50aW9uc30KZGltKFRJVEFOSUMzKQoKCmBgYAoKKipBTlNXRVI6KiogVGhlcmUgYXJlIDEzMDkgcm93cyBhbmQgMTQgY29sdW1ucyBpbiBgVElUQU5JQzNgLgoKIyMjIyAqKjMuICg1IHBvaW50cykqKiBXcml0ZSBjb2RlIHRvIHNob3cgdGhlIGZpcnN0IChvciBsYXN0KSA2IG9ic2VydmF0aW9uIGluIHRoZSBgVElUQU5JQzNgIGRhdGE/CgpgYGB7cn0KVElUQU5JQzMgJT4lIGhlYWQKCgoKYGBgCgojIyMjICoqNC4gKDUgcG9pbnRzKSoqIFVzaW5nIHRoZSBgc3Vydml2ZWRgIHZhcmlhYmxlIGluIHRoZSBgVElUQU5JQzNgIGRhdGEsIHdoaWNoIGlzIG9mIHR5cGUgaW50ZWdlciBgKDAvMSlgIG11dGF0ZSBpdCB0byBhIGZhY3RvciB2YXJpYWJsZSBieSBydW5uaW5nIHRoZSBjb2RlIGJlbG93IGFuZCBjcmVhdGUgKipuZXcqKiBkYXRhIGZyYW1lIGBUSVRBTklDYC4KCldoYXQgYXJlIHRoZSBuZXcgbGV2ZWxzIG9mIGBzdXJ2aXZlZGAgYW5kIGl0cyB0eXBlPwoKYGBge3J9ClRJVEFOSUMgPC0gVElUQU5JQzMgJT4lIG11dGF0ZShzdXJ2aXZlZCA9IGZhY3RvcihzdXJ2aXZlZCwgbGV2ZWxzID0gMDoxLCBsYWJlbHMgPSBjKCJObyIsICJZZXMiKSkpCgpgYGAKCioqQU5TV0VSOiBMZXZlbHMgLSBZZXMsIE5vIFR5cGUgLSBGYWN0b3IqKgoKIyMjIyAqKjUuICg1IHBvaW50cykqKiBUaGUgY29kZSBiZWxvdyBwcm9kdWNlcyBzdW1tYXJ5IGZvciB0aGUgYFRJVEFOSUNgIERhdGEuIFdyaXRlIGNvZGUgdXNpbmcgdGhlIHBpcGUgJVw+JSBvcGVyYXRvciB0aGUgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LgoKYGBge3J9CnN1bW1hcnkoVElUQU5JQykKCmBgYAoKWU9VUiBDT0RFIEhFUkU6CgpgYGB7cn0KVElUQU5JQyAlPiUgc3VtbWFyeSgpCgpgYGAKCiMjIyMgKiphKSAoNSBwb2ludHMpKiogRGV0ZXJtaW5lIHRoZSBmcmFjdGlvbiBvZiBzdXJ2aXZvcnMgKGBzdXJ2aXZlZGApIGFjY29yZGluZyB0byBjbGFzcyAoYHBjbGFzc2ApLgoKKipIaW50OioqIFVuY29tbWVudCBvbmUgb2YgdGhlIGZpcnN0IDMgbGluZXMgbiB0aGUgY29kZSBjaHVuayBiZWxvdyBhbmQgdGhlbiB1c2UgdGhlIGBwcm9wLnRhYmxlYCBmdW5jdGlvbi4KCmBgYHtyIHBhcnQtYX0KVDEgPC0geHRhYnMofnN1cnZpdmVkICsgcGNsYXNzLCBkYXRhID0gVElUQU5JQykKClQxIDwtIHRhYmxlKFRJVEFOSUMkc3Vydml2ZWQsVElUQU5JQyRwY2xhc3MpCgpUMSA8LSBUSVRBTklDICU+JSBzZWxlY3Qoc3Vydml2ZWQsIHBjbGFzcykgJT4lIHRhYmxlKCkKClQxCgpwcm9wLnRhYmxlKFQxLCBtYXJnaW4gPSAyKSAjIHRvIHByb2R1Y2UgdGhlIHByb3BvcnRpb24gcGVyIGNvbHVtbiAoMiksIHBlciByb3cgd291bGQgYmUgbWFyZ2luID0gMQpgYGAKCioqQU5TV0VSOioqIEluIDFzdCBjbGFzcyBwZXJjZW50IHN1cnZpdmVkIGlzIDYxLjkxOTUwLCAybmQgY2xhc3MgNDIuOTYwMjksIDNyZCBjbGFzcyAyNS41MgoKIyMjIyAqKmIpICgxMCBwb2ludHMpKiogQ29tcHV0ZSB0aGUgZnJhY3Rpb24gb2Ygc3Vydml2b3JzIGFjY29yZGluZyB0byBjbGFzcyBhbmQgZ2VuZGVyLiBEaWQgbWVuIGluIHRoZSBmaXJzdCBjbGFzcyBvciB3b21lbiBpbiB0aGUgdGhpcmQgY2xhc3MgaGF2ZSBhIGhpZ2hlciBzdXJ2aXZhbCByYXRlPwoKSGludDogVXNlIHRoZSBjb2RlIGJlbG93IHRoYXQgY3JlYXRlcyAzLXdheSB0YWJsZSBhbmQgdGhlbiB1c2UgYHByb3AudGFibGUoKWAgc2ltaWxhcmx5IHRvIHBhcnQgYSkuCgpgYGB7ciBwYXJ0LWJ9ClQyIDwtIFRJVEFOSUMgJT4lIHNlbGVjdChwY2xhc3MsIHNleCwgc3Vydml2ZWQpICU+JSB0YWJsZSgpCgpUMgoKcHJvcC50YWJsZShUMikKCmBgYAoKKipBTlNXRVI6KiogOC4xJSBvZiB3b21lbiBpbiB0aGlyZCBjbGFzcyBzdXJ2aXZlZCB3aGlsZSA0LjcgJSBvZiBtZW4gaW4gZmlyc3QgY2xhc3Mgc3Vydml2ZWQuIFdvbWVuIGhhZCBhIGhpZ2hlciByYXRlLgoKIyMjIyAqKmMpICgxMCBwb2ludHMpKiogSG93IHdvdWxkIHlvdSBjaGFyYWN0ZXJpemUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgKGUuZy4sIGlzIGl0IHN5bW1ldHJpYywgcG9zaXRpdmVseS9uZWdhdGl2ZWx5IHNrZXdlZCwgdW5pbW9kYWwsIG11bHRpbW9kYWwpPwoKSGludDogUnVuIHRoZSBjb2RlIGJlbG93IHRoYXQgcHJvZHVjZXMgc29tZSBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIHRoZSBkZW5zaXR5IGRpc3RyaWJ1dGlvbi4gVGhlIGNvbW1lbnRlZCBjb2RlIGlzIG9sZCBzdHlsZSBvZiBSIHByb2dyYW1taW5nLCBpdCBpcyBzaG93biBhcyBpdCBtYXkgcmVzZW1ibGUgdGhlIHRleHRib29rIGV4YW1wbGVzLgoKYGBge3IgcGFydC1jfQojIEZpbmRpbmcgc3VtbWFyeSBzdGF0aXN0aWNzCgptZWRpYW4oVElUQU5JQyRhZ2UsIG5hLnJtID0gVFJVRSkgIyBvbGQgc3R5bGUgCm1lYW4oVElUQU5JQyRhZ2UsIG5hLnJtID0gVFJVRSkgIyBvbGQgc3R5bGUKCiMgZHBseXIgc3R5bGUKVElUQU5JQyAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSwgbWVhZGlhbiA9IG1lZGlhbihhZ2UsIG5hLnJtID0gVFJVRSkpCgpJUVIoVElUQU5JQyRhZ2UsIG5hLnJtID0gVFJVRSkgCgpUSVRBTklDICU+JSBwdWxsKGFnZSkgJT4lIElRUihuYS5ybSA9IFRSVUUpICMgcHVsbCgpIGRvZXMgZXh0cmFjdCB0aGUgY29sdW1uIGZyb20gdGhlIGRhdGEgZnJhbWUgYXMgdmVjdG9yIG9iamVjdAoKIyBsb29rIGF0IHRoZSBkZW5zaXR5IGZ1bmN0aW9uIHRvIHNlZSBpZiBpdCBpcyB1bmkgb3IgYmktbW9kYWwgZGlzdHJpYnV0aW9uCmdncGxvdChkYXRhID0gVElUQU5JQywgYWVzKHggPSBhZ2UpKSArCmdlb21fZGVuc2l0eShmaWxsID0gImxpZ2h0Z3JlZW4iKSArCnRoZW1lX2J3KCkKCmBgYAoKKipBTlNXRVI6KiogUG9zaXRpdmVseSBTa2V3ZWQuIHRoZXJlIHdlcmUgYSBmZXcgb2xkZXIgcGFzc2VuZ2VycwoKIyMjIyAqKmQpICg1IHBvaW50cykqKiBXZXJlIHRoZSBtZWRpYW4gYW5kIG1lYW4gYWdlcyBmb3IgZmVtYWxlcyB3aG8gc3Vydml2ZWQgaGlnaGVyIG9yIGxvd2VyIHRoYW4gZm9yIGZlbWFsZXMgd2hvIGRpZCBub3Qgc3Vydml2ZT8gUmVwb3J0IHRoZSBtZWRpYW4gYW5kIG1lYW4gYWdlcyBhcyB3ZWxsIGFzIGFuIGFwcHJvcHJpYXRlIG1lYXN1cmUgb2Ygc3ByZWFkIGZvciBlYWNoIHN0YXRpc3RpYy4KCioqSGludDoqKiBVc2luZyB0aGUgYGRwbHlyYCBwYWNrYWdlIGZ1bmN0aW9ucyBhbmQgdGhlIHBpcGVzIG9wZXJhdG9yIGAlPiVgIGVsZWdhbnQgY29kZSBjYW4gcHJvZHVjZSBzdW1tYXJpZXMgZm9yIGVhY2ggc3RhdGlzdGljcyAtIG1lYW4sIG1lZGlhbiwgc2QsIElSUS4KCiMjIyMjIFdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIGBwY2xhc3NgIHZhcmlhYmxlLCBuYW1lbHkgcmVnYXJkbGVzcyBvZiBwYXNzZW5nZXIgY2xhc3M6CgojIyMjIyBNZWFuIFN1bW1hcmllcwoKYGBge3J9CiMgbWVhbiBzdW1tYXJpZXMKVElUQU5JQyAlPiUgZ3JvdXBfYnkoc2V4LCBzdXJ2aXZlZCkgJT4lIHN1bW1hcmlzZShhdmcgPSBtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSkKCmBgYAoKIyMjIyMgU3RhbmRhcmQgZGV2aWF0aW9uIFN1bW1hcnJpZXMKCmBgYHtyfQojIHNkIHN1bW1hcmllcwpUSVRBTklDICU+JSBncm91cF9ieShzZXgsIHN1cnZpdmVkKSAlPiUgc3VtbWFyaXNlKHN0ZGV2ID0gc2QoYWdlLCBuYS5ybSA9IFRSVUUpKQoKYGBgCgojIyMjIE1lZGlhbiBTdW1tYXJyaWVzCgpgYGB7cn0KIyBtZWRpYW4gc3VtbWFyaWVzClRJVEFOSUMgJT4lIGdyb3VwX2J5KHNleCwgc3Vydml2ZWQpICU+JSBzdW1tYXJpc2UobWVkID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUUlVFKSkKCmBgYAoKIyMjIyBJUVIgU3VtbWFycmllcwoKYGBge3J9CiMgSVFSIHN1bW1hcmllcwpUSVRBTklDICU+JSBncm91cF9ieShzZXgsIHN1cnZpdmVkKSAlPiUgc3VtbWFyaXNlKElRUiA9IElRUihhZ2UsIG5hLnJtID0gVFJVRSkpCgpgYGAKCkJhc2VkIG9uIHRoZSBzdW1tYXJpZXMsIGFuc3dlciB0aGUgcXVlc3Rpb24gYmVsb3c6CgoqKmQtMSkqKgoKRm9yIHRob3NlIHdobyBzdXJ2aXZlZCwgdGhlIG1lYW4gYWdlIGZvciBmZW1hbGVzIGlzIDI5LjgxNTM1IG9yIDMwIGFuZCB0aGUgbWVhbiBhZ2UgZm9yIG1hbGVzPyAyNi45Nzc3OCBvciAyNwoKKipkLTIpKiogRm9yIHRob3NlIHdobyBzdXJ2aXZlZCwgdGhlIG1lZGlhbiBhZ2UgZm9yIGZlbWFsZXMgaXMgMjguNSBvciAyOSBhbmQgdGhlIG1lZGlhbiBhZ2UgZm9yIG1hbGVzPyAyNwoKKipBTlNXRVI6KiogV29tZW4gdGhhdCBzdXJ2aXZlZCB3ZXJlIG9sZGVyIHRoYW4gdGhlIG9uZSBvbmVzIHdobyBkaWQgbm90LgoKKio2LiAoMTAgcG9pbnRzKSoqIE5vdyBDb25zaWRlciB0aGUgYHN1cnZpdmVkYCB2YXJpYWJsZSBpbiB0aGUgYFRJVEFOSUNgIGRhdGEgdG9vLCBjcmVhdGUgc2ltaWxhciBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIGFuc3dlciB0aGUgcXVlc3Rpb24gYmVsb3cuCgpGb3IgdGhvc2Ugd2hvIHN1cnZpdmVkLCB3aGljaCBjbGFzcyB0aGUgbWVhbiBhZ2UgZm9yIGZlbWFsZXMgaXMgKipsZXNzKiogdGhhbiB0aGUgbWVhbiBhZ2UgZm9yIG1hbGVzPyBUaGlyZAoKRm9yIHRob3NlIHdobyBzdXJ2aXZlZCwgd2hpY2ggY2xhc3MgdGhlIG1lZGlhbiBhZ2UgZm9yIGZlbWFsZXMgaXMgKipncmVhdGVyKiogdGhhbiB0aGUgbWVkaWFuIGFnZSBmb3IgbWFsZXM/IFNlY29uZAoKV3JpdGUgeW91ciBjb2RlIGluIHRoZSBjaHVuayBiZWxvdzoKCmBgYHtyfQojIG1lYW4gc3VtbWFyaWVzClRJVEFOSUMgJT4lIGdyb3VwX2J5KHBjbGFzcywgc2V4LCBzdXJ2aXZlZCkgJT4lIHN1bW1hcmlzZShhdmcgPSBtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSkKCgoKIyBtZWRpYW4gc3VtbWFyaWVzCgpUSVRBTklDICU+JSBncm91cF9ieShwY2xhc3MsIHNleCwgc3Vydml2ZWQpICU+JSBzdW1tYXJpc2UobWVkID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUUlVFKSkKCgoKYGBgCgojIyMjICoqZSkgKDUgcG9pbnRzKSoqIFdlcmUgdGhlIG1lZGlhbiBhbmQgbWVhbiBhZ2VzIGZvciBtYWxlcyB3aG8gc3Vydml2ZWQgaGlnaGVyIG9yIGxvd2VyIHRoYW4gZm9yIG1hbGVzIHdobyBkaWQgbm90IHN1cnZpdmU/IFJlcG9ydCB0aGUgbWVkaWFuIGFuZCBtZWFuIGFnZXMgYXMgd2VsbCBhcyBhbiBhcHByb3ByaWF0ZSBtZWFzdXJlIG9mIHNwcmVhZCBmb3IgZWFjaCBzdGF0aXN0aWMuCgoqKkhpbnQ6KiogUmVhZCB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlIGluIHBhcnQgZCkKCioqQU5TV0VSOioqIEluIHRoZSBvdmVyYWxsLCBtYWxlcyB0aGF0IHdlcmUgeW91bmdlciBzdXJ2aXZlZCB0aGFuIG5vdCBzdXJ2aXZlLiBUaGUgbWFsZXMgdGhhdCBzdXJ2aXZlZCBpbiB0aGUgMXN0IGFuZCAybmQgY2xhc3Mgd2VyZSB5b3VuZ2VyLCBidXQgdGhlIHRoaXJkIGNsYXNzIHdhcyBhZ2UgMjUgZm9yIGJvdGguIEZvciBmaXJzdCBjbGFzcyB0aGUgbWVhbiB3YXMgMzYgYW5kIG1lZGlhbiAzNi4gRm9yIHNlY29uZCBjbGFzcyB0aGUgbWVhbiBpcyAxNyBhbmQgbWVkaWFuIGlzIDE5LiBGb3IgdGhpcmQgY2xhc3MgdGhlIG1lYW4gaXMgMjIgYW5kIG1lZGlhbiBpcyAyNQoKIyMjIyAqKmYpICg1IHBvaW50cykqKiBXaGF0IHdhcyB0aGUgYWdlIG9mIHRoZSB5b3VuZ2VzdCBmZW1hbGUgaW4gdGhlIGZpcnN0IGNsYXNzIHdobyBzdXJ2aXZlZD8gMTQKCioqSGludDoqKiBDb21wbGV0ZSB0aGUgY29kZSBiZWxvdyBieSBzcGVjaWZ5IHdoaWNoIHZhcmlhYmxlIHlvdSB3YW50IHRvIGJlIGFycmFuZ2VkLgoKYGBge3J9CgpUSVRBTklDICU+JSBmaWx0ZXIgKHNleCA9PSJmZW1hbGUiICYgc3Vydml2ZWQgPT0iWWVzIiAmIHBjbGFzcyA9PSAiMXN0IikgJT4lIGFycmFuZ2UoYWdlKQoKYGBgCgpBcnJhbmdpbmcgaW4gZGVzY2VuZGluZyBvcmRlciBpcyBhY2hpZXZlZCBieSBzcGVjaWZ5aW5nIGluIHRoZSBgYXJyYW5nZSgpYCBmdW5jdGlvbiBgZGVzYyh2YXJfbmFtZSlgLgoKIyMjIyAqKjcuICg1IHBvaW50cykqKiBXaGF0IHdhcyB0aGUgYWdlIG9mIHRoZSBvbGRlc3QgZmVtYWxlIChtYWxlKSBpbiB0aGUgZmlyc3QgY2xhc3Mgd2hvIHN1cnZpdmVkPwoKWU9VUiBDT0RFIEhFUkU6CgpgYGB7cn0KVElUQU5JQyAlPiUgZmlsdGVyKHNleCA9PSJmZW1hbGUiICYgc3Vydml2ZWQgPT0iWWVzIiAmIHBjbGFzcyA9PSAiMXN0IikgJT4lIGFycmFuZ2UoZGVzYyhhZ2UpKQoKVElUQU5JQyAlPiUgZmlsdGVyIChzZXggPT0ibWFsZSIgJiBzdXJ2aXZlZCA9PSJZZXMiICYgcGNsYXNzID09ICIxc3QiKSAlPiUgYXJyYW5nZShkZXNjKGFnZSkpCmBgYAoKKipBTlNXRVI6KioKCk9sZGVzdCBmZW1hbGUgaW4gMXN0IGNsYXNzIHN1cnZpdmVkIHdhcyBDYXZlbmRpc2gsIE1ycy4gVHlyZWxsIFdpbGxpYW0sIDc2IHllYXJzIG9mIGFnZS4KCk9sZGVzdCBtYWxlIGluIDFzdCBjbGFzcyBzdXJ2aXZlZCB3YXMgQmFya3dvcnRoLCBNci4gQWxnZXJub24gSGVucnkgV3llYXJzLCA4MCB5ZWFycyBvZiBhZ2UuCgojIyMjICoqZykgKDEwIHBvaW50cykqKiBEbyB0aGUgZGF0YSBzdWdnZXN0IHRoYXQgdGhlIGZpbmFsIGhvdXJzIGFib2FyZCB0aGUgVGl0YW5pYyB3ZXJlIGNoYXJhY3Rlcml6ZWQgYnkgY2xhc3Mgd2FyZmFyZSwgbWFsZSBjaGl2YWxyeSwgc29tZSBjb21iaW5hdGlvbiBvZiBib3RoLCBvciBuZWl0aGVyPyBKdXN0aWZ5IHlvdXIgYW5zd2VyIGJhc2VkIG9uIGNvbXB1dGF0aW9ucyBhYm92ZSwgb3IgYmFzZWQgb24gb3RoZXIgZXhwbG9yYXRpb25zIG9mIHRoZSBkYXRhLgoKKipIaW50OioqIFJldmlldyBhbmQgZXhwbGFpbiB0aGUgZXhwbG9yYXRvcnkgZ3JhcGhzIGNyZWF0ZWQgYnkgdGhlIGNvZGUgY2h1bmsuIEhvdyB0aGV5IHN1cHBvcnQgeW91IGp1c3RpZmljYXRpb24/CgpgYGB7ciBwYXJ0IGV4dHJhfQoKVElUQU5JQyAlPiUgIGdncGxvdChhZXMoeCA9IHN1cnZpdmVkKSkgKwogIGdlb21fYmFyKGFlcyhmaWxsID0gc2V4KSwgc3RhdCA9ICJjb3VudCIsIHBvc2l0aW9uID0gInN0YWNrIiApICsKICB0aGVtZV9idygpCgpUSVRBTklDICU+JSAgZ2dwbG90KGFlcyh4ID0gc3Vydml2ZWQpKSArCiAgZ2VvbV9iYXIoYWVzKGZpbGwgPSBwY2xhc3MpLCBzdGF0ID0gImNvdW50IiwgcG9zaXRpb24gPSAic3RhY2siICkgKwogIHRoZW1lX2J3KCkKCmBgYAoKSSB3b3VsZCBpbmZlciB0aGF0IHRoZSBvbGRlciBtYWxlIHBhc3NlbmdlcnMgZGlkLCBpbiBmYWN0LCB0cnkgdG8gcHJvdGVjdCB0aGUgeW91bmcgYW5kIHdvbWVuLiBUaGUgZ3JhcGggc2hvd3MgbW9yZSB3b21lbiBzdXJ2aXZlZCB0aGFuIG1lbi4gVGhlIHNlY29uZCBncmFwaCBzaG93cyB0aGF0IGEgaGlnaCBhbW91bnQgb2YgM3JkIGNsYXNzIG1hbGUgcGFzc2VuZ2VycyBkaWVkLiBUaGF0IG1heSBiZSBiZWNhdXNlIG9mIGxvY2F0aW9uIG9mIHRoZSBjYWJpbnMgb3IgbWF5YmUgdGhlIGhpZ2hlciBjbGFzcyBwYXNzZW5nZXJzIGp1c3Qgc2ltcGx5IHVzZWQgc3RhdHVzIG92ZXIgbWFsZSAzcmQgY2xhc3MuCgojIyBUYXNrIDEgKEV4dHJhIENyZWRpdCwgMTAgcHRzKTogUHJvZHVjZSBDTEVBTiBkYXRhIGZyb20gdGhlIFRJVEFOSUMgZGF0YSBieSByZW1vdmluZyBhbGwgb2JzZXJ2YXRpb24gd2l0aCBgTkFgCgpDb21tZW50OiBJbiBtb3N0IG9mIHRoZSBjb2RlIHlvdSB1c2VkL3dyb3RlIGluICoqVGFzayAxKiosIGZ1bmN0aW9ucyB3ZXJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50IGBuYS5ybSA9IFRSVUVgLCBpbnN0cnVjdGluZyB0aGUgYE5BYCB2YWx1ZXMgdG8gYmUgZHJvcHBlZCBmb3IgdGhlIGNvbXB1dGF0aW9ucy4KCioqcGFydCAxKSAoNSBwb2ludHMpKiogVXNlIHRoZSBmdW5jdGlvbiBgbmEub21pdCgpYChvciB0aGUgYGZpbHRlcigpYCkgZnVuY3Rpb24gZnJvbSBgZHBseXJgIHBhY2thZ2UgdG8gY3JlYXRlIGEgKipjbGVhbioqIGRhdGEgc2V0IHRoYXQgcmVtb3ZlcyBzdWJqZWN0cyBpZiBhbnkgb2JzZXJ2YXRpb25zIG9uIHRoZSBzdWJqZWN0IGFyZSAqKnVua25vd24qKiBTdG9yZSB0aGUgbW9kaWZpZWQgZGF0YSBmcmFtZSBpbiBhIGRhdGEgZnJhbWUgbmFtZWQgYENMRUFOYC4gUnVuIHRoZSBmdW5jdGlvbiBgZGltKClgIG9uIHRoZSBkYXRhIGZyYW1lIGBDTEVBTmAgdG8gZmluZCB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyhyb3dzKSBpbiB0aGUgYENMRUFOYCBkYXRhLgoKQ09NUExFVEUgVEhFIENPREUgSEVSRSwgdW5jb21tZW50IG5lY2Vzc2FyeSBsaW5lcyBiZWZvcmUgcnVubmluZzoKCmBgYHtyIHBhcnQgMSBleHRyYV9jcmVkaXR9CkNMRUFOIDwtIG5hLm9taXQoVElUQU5JQykKCgojcHJpbnQgdGhlIGRpbWVuc2lvbnMKZGltKENMRUFOKQpgYGAKCioqcGFydCAyKSAoNSBwb2ludHMpKiogSG93IG1hbnkgbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGRhdGEgZnJhbWUgYFRJVEFOSUNgIGFyZSB0aGVyZT8gSG93IG1hbnkgcm93cyBvZiBgVElUQU5JQ2AgaGF2ZSBubyBtaXNzaW5nIHZhbHVlcywgb25lIG1pc3NpbmcgdmFsdWUsIHR3byBtaXNzaW5nIHZhbHVlcywgYW5kIHRocmVlIG1pc3NpbmcgdmFsdWVzLCByZXNwZWN0aXZlbHk/IE5vdGU6IHRoZSBudW1iZXIgb2Ygcm93cyBpbiBgQ0xFQU5gIHNob3VsZCBhZ3JlZSB3aXRoIHlvdXIgYW5zd2VyIGZvciB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gYFRJVEFOSUNgIHRoYXQgaGF2ZSBubyBtaXNzaW5nIHZhbHVlcy4gV2hhdCBhcmUgdGhlIGNvbnMgb2YgY2xlYW5pbmcgdGhlIGRhdGEgaW4gdGhlIHN1Z2dlc3RlZCB3YXk/CgpVc2UgdGhlIGNvZGUsIGV4cGxhaW4gd2hhdCBpdCBkb2VzLgoKYGBge3IgcGFydCAyIGV4dHJhX2NyZWRpdH0KI2dldCB0aGUgbnVtYmVyIG9mIG1pc3NpbmcgdmFsdWVzIGluIGNvbHVtbnMKY29sTkFzPC0gY29sU3Vtcyhpcy5uYShUSVRBTklDKSkKKGNvbE5BcyA8LSBhcy52ZWN0b3IoY29sU3Vtcyhpcy5uYShUSVRBTklDKSkpKSAjIGNvZXJjZSB0byBhIHZlY3RvciAKCnJvd05BcyA8LSB0YWJsZShyb3dTdW1zKGlzLm5hKFRJVEFOSUMpKSkKKHJvd05BcyA8LSBhcy52ZWN0b3IodGFibGUocm93U3Vtcyhpcy5uYShUSVRBTklDKSkpKSkgIyBjb2VyY2UgdG8gYSB2ZWN0b3IKYGBgCgoqKkNvbW1lbnQ6KiogVGhlIG1pc3NpbmcgdmFsdWVzIGFyZSBmb3IgdmFyaWFibGVzIGFnZSwgZmFyZSwgYW5kIGJvZHkuCgoqKkNvbW1lbnQ6KiogVGhlcmUgYXJlIDExOSByb3dzIHdpdGggbm8gbWlzc2luZyB2YWx1ZXMsIDkyOCByb3dzIHdpdGggMSBtaXNzaW5nIHZhbHVlLCBhbmQgMjYyIHJvd3Mgd2l0aCAyIG1pc3NpbmcgdmFsdWVzLgoKQ29tbWVudCBob3cgdGhpcyBhbGlnbiB3aXRoIHRoZSBkaW1lbnNpb25zIG9mIHlvdXIgYENMRUFOYCBkYXRhLiBcPiAqKllvdXIgY29tbWVudDogVGhlIG5vIG1pc3NpbmcgdmFsdWVzIGlzIHRoZSBzYW1lIGFuZCBzaW5jZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdmFsdWUgaW4gZXZlcnkgY29sdW1uIHRoZSAxNCBpcyB0aGUgc2FtZSBhbW91bnQgb2YgY29sdW1ucy4qKgoKKipHb29kIHByYWN0aWNlOioqIFNhdmUgeW91ciBjdXN0b21pemVkIGRhdGEgZnJhbWUgYENMRUFOYCBpbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGFzIGEgYCouY3N2YCBmaWxlIHVzaW5nIHRoZSBmdW5jdGlvbiBgd3JpdGUuY3N2KClgIHVzaW5nIHRoZSBhcmd1bWVudCBgcm93Lm5hbWVzID0gRkFMU0VgLgoKYGBge3Igc2F2ZX0Kd3JpdGUuY3N2KENMRUFOLCBmaWxlPSJUSVRBTklDX0NMRUFOLmNzdiIsIHJvdy5uYW1lcz1GQUxTRSkKYGBgCgojIyBUYXNrIDI6ICoqVGhpcyBpcyBwcm9ibGVtIDkgb24gcGFnZSAxOTcgaW4gdGhlIHRleHQqKiBhcyBpcy4KCioqTm90ZToqKiBUaGlzIGlzICoqbm90IGd1aWRlZCoqIHRhc2ssIHlvdSBoYXZlIHRvIHdyaXRlIHlvdXIgb3duIGNvZGUgZnJvbSBzY3JhdGNoIQoKVXNlIHRoZSBDQVJTMjAwNCBkYXRhIGZyYW1lIGZyb20gdGhlIGBQQVNXUjJgIHBhY2thZ2UsIHdoaWNoIGNvbnRhaW5zIHRoZSBudW1iZXJzIG9mIGNhcnMgcGVyIGAxMDAwYCBpbmhhYml0YW50cyAoYGNhcnNgKSwgdGhlIHRvdGFsIG51bWJlciBvZiBrbm93biBtb3J0YWwgYWNjaWRlbnRzIChgZGVhdGhzYCksIGFuZCB0aGUgY291bnRyeSBwb3B1bGF0aW9uLzEwMDAgKGBwb3B1bGF0aW9uYCkgZm9yIHRoZSAyNSBtZW1iZXIgY291bnRyaWVzIG9mIHRoZSBFdXJvcGVhbiBVbmlvbiBmb3IgdGhlIHllYXIgMjAwNC4KCiMjIyMgKiphKSAoMTAgcG9pbnRzKSoqCgpZT1VSIENPREU6CgpgYGB7cn0KbGlicmFyeSgpCmBgYAoKKipBTlNXRVI6KioKCiMjIyMgKipiKSAoMTAgcG9pbnRzKSoqCgpZT1VSIENPREU6CgpgYGB7cn0KCmBgYAoKKipBTlNXRVI6KioKCiMjIyMgKipjKSAoMTAgcG9pbnRzKSoqCgpZT1VSIENPREU6CgpgYGB7cn0KCmBgYAoKKipBTlNXRVI6KioKCiMjIyMgKipkKSAoMTAgcG9pbnRzKSoqCgpZT1VSIENPREU6CgpgYGB7cn0KCmBgYAoKKipBTlNXRVI6KioKCiMjIyMgKiplKSAoMTAgcG9pbnRzKSoqCgpZT1VSIENPREU6CgpgYGB7cn0KCmBgYAoKKipBTlNXRVI6KioKCiMjIyMgKipmKSAoMTAgcG9pbnRzKSoqCgpZT1VSIENPREU6CgpgYGB7cn0KCmBgYAoKKipBTlNXRVI6KioKCiMjIyMgKipnKSAoMTAgcG9pbnRzKSoqCgpZT1VSIENPREU6CgpgYGB7cn0KCmBgYAoKKipBTlNXRVI6KioKCiMjIyMgKipoKSAoMTAgcG9pbnRzKSoqCgpZT1VSIENPREU6CgpgYGB7cn0KCmBgYAoKKipBTlNXRVI6KioKCiMjIFRhc2sgMyAqKigxMCBwb2ludHMpKiogQ3JlYXRlIGEgbWFwIHdpdGggbGVhZmxldCBwYWNrYWdlLCBieSBjb21wbGV0aW5nIHRoZSBjb2RlIGJlbG93LCB0aGF0IGRpc3BsYXlzIDUgVU5DIHN5c3RlbSBzY2hvb2xzIHVzaW5nIHRoZWlyIGdlb2dyYXBoaWMgbG9jYXRpb25zLiBEcmF3IGNpcmNsZXMgd2l0aCByYWRpdXMgcHJvcG9ydGlvbmF0ZSB0byB0aGUgc2Nob29sIHNpemUgdXNpbmcgdGhlIGBhZGRDaXJjbGVzKClgIGZ1bmN0aW9uLgoKVHJ5OiBFLmcuIGBhZGRDaXJjbGVzKHdlaWdodCA9IDEsIHJhZGl1cyA9IHNxcnQoVU5DX3NjaG9vbHMkc2l6ZSkqMTAwKWAKCmBgYHtyLCB0YXNrIDN9CgpzZXQuc2VlZCgxMjMpCgpsaWJyYXJ5KGxlYWZsZXQpCgojIFRoZSBjb2RlIGJlbG93IHdpbGwgY3JlYXRlIGxpc3Qgb2YgNSBVTkMgdW5pdmVyc2l0eSBkYXRhIHBvaW50cyB3aXRoIGxhdCAmIGxuZywgbmFtZSBhbmQgc2Nob29sIHNpemUKIyBDcmVhdGUgZGF0YSBmcmFtZSB3aXRoIGNvbHVtbiB2YXJpYWJsZXMgbmFtZSAob2YgVU5DIHNjaG9vbCksIHN0dWRlbnRzIChzaXplKSwgbGF0LCBsbmcpClVOQ19zY2hvb2xzIDwtIGRhdGEuZnJhbWUobmFtZSA9IGMoIk5DIFN0YXRlIiwgIlVOQyBDaGFwZWwgSGlsbCIsICJGU1UiLCAiRUNVIiwgIlVOQyBDaGFybG90dGUiLCAiVU5DIEdyZWVuc2Jvcm8iLCAiVU5DIFdpbG1pbmd0b24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGMoMzAxMzAsIDI4MTM2LCA2MDAwLCAyNTk5MCwgMjU5OTAsIDE5NjUzLCAxNzg0MyksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IGMoMzYuMDM3MzYzOCwgMzUuOTA1MDM1MywgMzUuMDcyNiwgMzUuNjA3Mzc2OSwgMzUuMjAzNjMyNSwgMzYuMDY4OSwgMzQuMjIzOSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxuZyA9IGMoLTc5LjAzNTU2NjMsIC03OS4wNDc3NTMzLCAtNzguODkyNDczOSwgLTc3LjM2NzE1NjYsIC04MC44NDAxMTQ1LCAtNzkuODEwMiwgLTc3Ljg2OTYpKQoKCiMgVXNlIHRoZSBkYXRhIGZyYW1lIHRvIGRyYXcgbWFwIGFuZCBjaXJjbGVzIHByb3BvcnRpb25hbCB0byB0aGUgc2Nob29sIHNpemVzIG9mIHRoZSBjaXRpZXMKVU5DX3NjaG9vbHMgJT4lCiAgbGVhZmxldCgpICU+JQogIGFkZFRpbGVzKCkgJT4lCiAgYWRkQ2lyY2xlcyh3ZWlnaHQgPSAxLCByYWRpdXMgPSBzcXJ0KFVOQ19zY2hvb2xzJHNpemUpKjEwMCkgIyB0cnkgYWRqdXN0aW5nIHRoZSByYWRpdXMgYnkgbXVsdGlwbHlpbmcgd2l0aCA1MCBpbnN0ZWFkIG9mIDEwMC4gV2hhdCBkbyB5b3Ugbm90aWNlPwojIENpcmNsZXMgYXJlIHNtYWxsZXIKYGBgCgojIyBUYXNrIDMgKEV4dHJhIENyZWRpdCwgNSBwdHMpOiBBZGQgYXQgbGVhc3QgdHdvIG1vcmUgVU5DIHNjaG9vbHMsIHVzaW5nIHRoZWlyIGxvY2F0aW9uIGRhdGEgYW5kICMjZW5yb2xsbWVudCBudW1iZXJzLiBNb2RpZnkgdGhlIGNvZGUgYWJvdmUgYW5kIHVwZGF0ZSB0aGUgbWFwIGZvciBhbGwgc2Nob29scyBpbmNsdWRlZC4KCmBgYHtyLCB0YXNrIDMgZWMsIGVjaG89RkFMU0V9CiMjIERPIE5PVCBDSEFOR0UgQU5ZVEhJTkcgSU4gVEhJUyBDT0RFIENIVU5LIQpkYXRlKCkKc2Vzc2lvbkluZm8oKQpSLlZlcnNpb24oKQpgYGAK