setwd("C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1")
Warning: The working directory was changed to C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1 inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
female <- read.csv("female.csv")
# Determines if R considers female to be a data frame
is.data.frame(female)
[1] TRUE
# Can now use head to see what female looks like
head(female)
# Isolates 3 columns from the original data set
library(tidyverse)
female <- female %>%
filter(Country.Name == "Brazil" | Country.Name == "India" | Country.Name == "United States")
head(female)
#Eliminate unwanted columns
colnames(female)
[1] "Series.Name" "Series.Code" "Country.Name" "Country.Code" "X1990..YR1990." "X2000..YR2000." "X2012..YR2012." "X2013..YR2013."
[9] "X2014..YR2014." "X2015..YR2015." "X2016..YR2016." "X2017..YR2017." "X2018..YR2018." "X2019..YR2019." "X2020..YR2020." "X2021..YR2021."
rel_col <- which(colnames(female)== "Country.Name" | colnames(female)== "X2014..YR2014." | colnames(female)== "X2017..YR2017." | colnames(female)== "X2021..YR2021.")
rel_col
[1] 3 9 12 16
female <- female[rel_col] %>% rename("2014" = 2, "2017" = 3, "2021" = 4)
head(female)
#Flip rows and columns
transpose_f <- data.frame(t(female[-1]))
colnames(transpose_f) <- female[, 1]
head(transpose_f)
#tells us what type the data is being stored as. In this case they are characters meaning computations with them will fail
#So we must turn them into numeric values
print(sapply(transpose_f, class))
Brazil India United States
"character" "character" "character"
transpose_f$Brazil = as.numeric(transpose_f$Brazil)
transpose_f$India = as.numeric(transpose_f$India)
transpose_f$"United States" = as.numeric(transpose_f$"United States")
head(transpose_f)
#Can now be summarized (compute the mean)
#summarise_each(transpose_f, list(mean))
transpose_f %>% summarise(across(c(Brazil, India, "United States"), list(mean=mean, sd=sd)))
#Graph data
year <- c(2014, 2017, 2021)
ggplot(data=transpose_f, aes(x=year, y=India, group=1)) + geom_line() + geom_point()

################################ Condensed Version for Male Data ##################################################
setwd("C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1")
male <- read.csv("male.csv")
male <- male %>%
filter(Country.Name == "Brazil" | Country.Name == "India" | Country.Name == "United States")
male <- male[rel_col] %>%
rename("2014" = 2, "2017" = 3, "2021" = 4)
transpose_m <- data.frame(t(male[-1]))
colnames(transpose_m) <- male[, 1]
transpose_m$Brazil = as.numeric(as.character(transpose_m$Brazil))
transpose_m$India = as.numeric(as.character(transpose_m$India))
transpose_m$"United States" = as.numeric(as.character((transpose_m$"United States")))
head(transpose_m)
#Distinguish between male and female data
transpose_m <- rename(transpose_m, "Brazil_m" = 1, "India_m" = 2, "United_States_m" = 3)
head(transpose_m)
#Merge male and female data sets
transpose_m <- rownames_to_column(transpose_m, var="Year")
transpose_f <- rownames_to_column(transpose_f, var="Year")
acct_owner_by_gender <- merge(x = transpose_m, y = transpose_f, by = "Year", all.x = TRUE)
acct_owner_by_gender <- rename(acct_owner_by_gender, "United_States" = 7)
head(acct_owner_by_gender)
#Plot data
gfg_plot <- ggplot(acct_owner_by_gender, aes(x=year)) +
geom_line(aes(y = India), color = "black") +
geom_line(aes(y = India_m), color = "red") +
geom_line(aes(y = Brazil), color = "green") +
geom_line(aes(y = Brazil_m), color = "blue") +
geom_line(aes(y = United_States), color = "purple") +
geom_line(aes(y = United_States_m), color = "violet")
gfg_plot

###################### Project 1 ############################
# (1) Change y-axis from "India" to "Percentage Ownership"
gfg_plot + labs(y = "Percentage Ownership")

- Discuss percentage change over time
Of the 3 countries a higher account ownership among men more likely,
especially within Brazil and India. However, notably in the United
States, there is no clear higher ownership between the two genders as in
some years it is higher among females while in others it is equally
higher among males. Also, notably in India, as of the recent years this
gap in ownership between the two genders has slowly closed. Whereas in
Brazil it has stayed relatively the same over the years.
As for account ownership overall, many countries demonstrate a rise
in ownership especially among females. The only areas in contradiction
with this trend are the male populations of both India and the United
States, which have demonstrated a gradual decrease in account ownership.
However, even with this decline, account ownership percentages of 2021
remain across all countries, for the most part, higher than those of
2014.
- Is it possible to say that account percentages have been increasing
if you disregard a certain year? Does this change if you focus on a
particular particular country and gender combinations?
Across all countries, there is a noticeable sharp turning point
around 2017 where each country either spiked in account ownership or
declined heavily. In this case, disregarding years after 2017 could make
it seem as though account ownership in a country was more likely when in
reality it was less likely at a point in time and vice versus.
There are also many cases in each country where omitting certain
years could produce the idea of a more probable account ownership
percentage For example: In India, disregarding 2016 - 2018 In Brazil,
disregarding 2016 - 2018 In the United States 2015 - 2018 (Although this
would be more of a constant rate)
These results could also be replicated with different gender and
country combinations, for example only using the higher ownership
genders for each country: the females of the United States, females of
India (don’t have a sharp decline like the men do although their
percentage is lower across the years in comparison), and males of
Brazil. These combinations could create the allusions of a higher
likelihood of account ownership percentages among certain genders.
#################### Project 1 (Continued) #############################
# (4) Analysis of csv files
# Get and Plot primary or less percentage rates
setwd("C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1")
Warning: The working directory was changed to C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1 inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
primary <- read.csv("primary.csv")
library(tidyverse)
primary <- primary %>%
filter(Country.Name == "Albania" | Country.Name == "Australia" | Country.Name == "Armenia" | Country.Name == "Algeria" | Country.Name == "Argentina")
head(primary)
#Eliminate unwanted columns
rel_col <- which(colnames(primary)== "Country.Name" | colnames(primary)== "X2014..YR2014." | colnames(primary)== "X2017..YR2017." | colnames(primary)== "X2021..YR2021.")
primary <- primary[rel_col] %>%
rename("2014" = 2, "2017" = 3, "2021" = 4)
head (primary)
transpose_p <- data.frame(t(primary[-1]))
colnames(transpose_p) <- primary[, 1]
transpose_p$Albania = as.numeric(as.character(transpose_p$Albania))
transpose_p$Australia = as.numeric(as.character(transpose_p$Australia))
transpose_p$Armenia = as.numeric(as.character((transpose_p$Armenia)))
transpose_p$Algeria = as.numeric(as.character((transpose_p$Algeria)))
transpose_p$Argentina = as.numeric(as.character((transpose_p$Argentina)))
head(transpose_p)
year <- c(2014, 2017, 2021)
ggplot(data=transpose_p, aes(x=year, y=Albania, group=1)) + geom_line() + geom_point()

#Distinguish primary data
transpose_p <- rename(transpose_p, "Albania_p" = 1, "Australia_p" = 2, "Armenia_p" = 3, "Algeria_p" = 4, "Argentia_p" = 5)
head(transpose_p)
# Get and plot secondary or more data
setwd("C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1")
secondary <- read.csv("secondary.csv")
library(tidyverse)
secondary <- secondary %>%
filter(Country.Name == "Albania" | Country.Name == "Australia" | Country.Name == "Armenia" | Country.Name == "Algeria" | Country.Name == "Argentina")
head(secondary)
#Eliminate unwanted columns
rel_col <- which(colnames(secondary)== "Country.Name" | colnames(secondary)== "X2014..YR2014." | colnames(secondary)== "X2017..YR2017." | colnames(secondary)== "X2021..YR2021.")
secondary <- secondary[rel_col] %>%
rename("2014" = 2, "2017" = 3, "2021" = 4)
head (secondary)
transpose_s <- data.frame(t(secondary[-1]))
colnames(transpose_s) <- secondary[, 1]
transpose_s$Albania = as.numeric(as.character(transpose_s$Albania))
transpose_s$Australia = as.numeric(as.character(transpose_s$Australia))
transpose_s$Armenia = as.numeric(as.character((transpose_s$Armenia)))
transpose_s$Algeria = as.numeric(as.character((transpose_s$Algeria)))
transpose_s$Argentina = as.numeric(as.character((transpose_s$Argentina)))
head(transpose_s)
# Merge the data sets together
transpose_p <- rownames_to_column(transpose_p, var="Year")
transpose_s <- rownames_to_column(transpose_s, var="Year")
acct_owner_by_education <- merge(x = transpose_p, y = transpose_s, by = "Year", all.x = TRUE)
head(acct_owner_by_education)
#Plot data
gfg_plot <- ggplot(acct_owner_by_education, aes(x=year)) +
geom_line(aes(y = Albania_p), color = "black") +
geom_line(aes(y = Albania), color = "gray") +
geom_line(aes(y = Australia_p), color = "lightblue") +
geom_line(aes(y = Australia), color = "blue") +
geom_line(aes(y = Armenia_p), color = "purple") +
geom_line(aes(y = Armenia), color = "pink") +
geom_line(aes(y = Algeria), color = "orange") +
geom_line(aes(y = Algeria_p), color = "red") +
geom_line(aes(y = Argentina), color = "darkgreen") +
geom_line(aes(y = Argentia_p), color = "green")
gfg_plot

# Change y - axis
gfg_plot + labs(y = "Percentage Education")

NA
NA
Summary of Data:
The previous graph includes the data across five countries (Albania,
Australia, Armenia, Algeria, and Argentina) and their percentages in
account ownership of those having a primary education or less and those
having a secondary education or higher. At a glance, there doesn’t seem
to be as much direct correlation as seen with the previous graph,
however there are some notable observations.
Across most countries, while in previous years account ownership
within these two groups remained at distinctly differing percentages, in
the recent years it has equaled to around the same percentage in both
groups of education. For example, this is seen in Algeria, Argentina,
and Armenia. Having this in mind, we can see the two countries that fall
from this trend are Australia and Albania, both of which have a large
difference in ownership percentages between these two groups.
In both Albania and Australia, higher account ownership percentages
were present among those having secondary education or higher.
As mentioned previously, this data can also be cherry-picked in
various ways especially in disregarding certain years. Over time, each
educated group increased and decreased in some way in regards to their
account ownership levels, so omitting certain years could easily be done
to show the desired results.
For example, looking at Armenia’s primary education or less
population, should the graph only include years 2014 - 2017 it could be
said this group was less likely to have account ownership at a financial
Institution. However, if we looked at the year 2017 - 2021, it could be
said this group had a higher likelihood of having account ownership.
Another notable observation, is that there isn’t a large indication
of higher probability of one educational group having account ownership
over the other. In some countries, those having primary or less were
seen to have higher account owner and in others those of secondary or
higher were seen to have higher account ownership. Even across time,
both educational groups increased and decreased in percentages. There
would likely have to be more background information provided or gained
in order to make any real conclusions/reasoning behind the data.
LS0tDQp0aXRsZTogIlByb2plY3RfMSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0Kc2V0d2QoIkM6L1VzZXJzL0VsaWFubmEgTmFoYW5kYXN0L0Rlc2t0b3AvUiBQcm9qZWN0IERhdGEvUHJvamVjdF8xIikNCmZlbWFsZSA8LSByZWFkLmNzdigiZmVtYWxlLmNzdiIpDQoNCiMgRGV0ZXJtaW5lcyBpZiBSIGNvbnNpZGVycyBmZW1hbGUgdG8gYmUgYSBkYXRhIGZyYW1lDQppcy5kYXRhLmZyYW1lKGZlbWFsZSkNCg0KIyBDYW4gbm93IHVzZSBoZWFkIHRvIHNlZSB3aGF0IGZlbWFsZSBsb29rcyBsaWtlDQpoZWFkKGZlbWFsZSkNCg0KIyBJc29sYXRlcyAzIGNvbHVtbnMgZnJvbSB0aGUgb3JpZ2luYWwgZGF0YSBzZXQNCmxpYnJhcnkodGlkeXZlcnNlKQ0KZmVtYWxlIDwtIGZlbWFsZSAlPiUNCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikNCg0KaGVhZChmZW1hbGUpDQoNCiNFbGltaW5hdGUgdW53YW50ZWQgY29sdW1ucw0KY29sbmFtZXMoZmVtYWxlKQ0KcmVsX2NvbCA8LSB3aGljaChjb2xuYW1lcyhmZW1hbGUpPT0gIkNvdW50cnkuTmFtZSIgfCBjb2xuYW1lcyhmZW1hbGUpPT0gIlgyMDE0Li5ZUjIwMTQuIiB8IGNvbG5hbWVzKGZlbWFsZSk9PSAiWDIwMTcuLllSMjAxNy4iIHwgY29sbmFtZXMoZmVtYWxlKT09ICJYMjAyMS4uWVIyMDIxLiIpDQpyZWxfY29sDQoNCmZlbWFsZSA8LSBmZW1hbGVbcmVsX2NvbF0gJT4lIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQ0KaGVhZChmZW1hbGUpDQoNCiNGbGlwIHJvd3MgYW5kIGNvbHVtbnMNCnRyYW5zcG9zZV9mIDwtIGRhdGEuZnJhbWUodChmZW1hbGVbLTFdKSkNCmNvbG5hbWVzKHRyYW5zcG9zZV9mKSA8LSBmZW1hbGVbLCAxXQ0KaGVhZCh0cmFuc3Bvc2VfZikNCg0KI3RlbGxzIHVzIHdoYXQgdHlwZSB0aGUgZGF0YSBpcyBiZWluZyBzdG9yZWQgYXMuIEluIHRoaXMgY2FzZSB0aGV5IGFyZSBjaGFyYWN0ZXJzIG1lYW5pbmcgY29tcHV0YXRpb25zIHdpdGggdGhlbSB3aWxsIGZhaWwNCiNTbyB3ZSBtdXN0IHR1cm4gdGhlbSBpbnRvIG51bWVyaWMgdmFsdWVzDQpwcmludChzYXBwbHkodHJhbnNwb3NlX2YsIGNsYXNzKSkNCg0KdHJhbnNwb3NlX2YkQnJhemlsID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiRCcmF6aWwpDQp0cmFuc3Bvc2VfZiRJbmRpYSA9IGFzLm51bWVyaWModHJhbnNwb3NlX2YkSW5kaWEpDQp0cmFuc3Bvc2VfZiQiVW5pdGVkIFN0YXRlcyIgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9mJCJVbml0ZWQgU3RhdGVzIikNCmhlYWQodHJhbnNwb3NlX2YpDQoNCiNDYW4gbm93IGJlIHN1bW1hcml6ZWQgKGNvbXB1dGUgdGhlIG1lYW4pDQojc3VtbWFyaXNlX2VhY2godHJhbnNwb3NlX2YsIGxpc3QobWVhbikpDQoNCnRyYW5zcG9zZV9mICU+JSBzdW1tYXJpc2UoYWNyb3NzKGMoQnJhemlsLCBJbmRpYSwgIlVuaXRlZCBTdGF0ZXMiKSwgbGlzdChtZWFuPW1lYW4sIHNkPXNkKSkpDQoNCiNHcmFwaCBkYXRhDQp5ZWFyIDwtIGMoMjAxNCwgMjAxNywgMjAyMSkNCmdncGxvdChkYXRhPXRyYW5zcG9zZV9mLCBhZXMoeD15ZWFyLCB5PUluZGlhLCBncm91cD0xKSkgKyBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDb25kZW5zZWQgVmVyc2lvbiBmb3IgTWFsZSBEYXRhICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpzZXR3ZCgiQzovVXNlcnMvRWxpYW5uYSBOYWhhbmRhc3QvRGVza3RvcC9SIFByb2plY3QgRGF0YS9Qcm9qZWN0XzEiKQ0KbWFsZSA8LSByZWFkLmNzdigibWFsZS5jc3YiKQ0KbWFsZSA8LSBtYWxlICU+JSANCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikNCg0KbWFsZSA8LSBtYWxlW3JlbF9jb2xdICU+JSANCiAgcmVuYW1lKCIyMDE0IiA9IDIsICIyMDE3IiA9IDMsICIyMDIxIiA9IDQpDQoNCnRyYW5zcG9zZV9tIDwtIGRhdGEuZnJhbWUodChtYWxlWy0xXSkpDQpjb2xuYW1lcyh0cmFuc3Bvc2VfbSkgPC0gbWFsZVssIDFdDQoNCnRyYW5zcG9zZV9tJEJyYXppbCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9tJEJyYXppbCkpDQp0cmFuc3Bvc2VfbSRJbmRpYSA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9tJEluZGlhKSkNCnRyYW5zcG9zZV9tJCJVbml0ZWQgU3RhdGVzIiA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKCh0cmFuc3Bvc2VfbSQiVW5pdGVkIFN0YXRlcyIpKSkNCg0KaGVhZCh0cmFuc3Bvc2VfbSkNCg0KI0Rpc3Rpbmd1aXNoIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIGRhdGENCnRyYW5zcG9zZV9tIDwtIHJlbmFtZSh0cmFuc3Bvc2VfbSwgIkJyYXppbF9tIiA9IDEsICJJbmRpYV9tIiA9IDIsICJVbml0ZWRfU3RhdGVzX20iID0gMykNCg0KaGVhZCh0cmFuc3Bvc2VfbSkNCg0KI01lcmdlIG1hbGUgYW5kIGZlbWFsZSBkYXRhIHNldHMNCnRyYW5zcG9zZV9tIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfbSwgdmFyPSJZZWFyIikNCnRyYW5zcG9zZV9mIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfZiwgdmFyPSJZZWFyIikNCg0KYWNjdF9vd25lcl9ieV9nZW5kZXIgPC0gbWVyZ2UoeCA9IHRyYW5zcG9zZV9tLCB5ID0gdHJhbnNwb3NlX2YsIGJ5ID0gIlllYXIiLCBhbGwueCA9IFRSVUUpDQphY2N0X293bmVyX2J5X2dlbmRlciA8LSByZW5hbWUoYWNjdF9vd25lcl9ieV9nZW5kZXIsICJVbml0ZWRfU3RhdGVzIiA9IDcpDQoNCmhlYWQoYWNjdF9vd25lcl9ieV9nZW5kZXIpDQoNCiNQbG90IGRhdGENCmdmZ19wbG90IDwtIGdncGxvdChhY2N0X293bmVyX2J5X2dlbmRlciwgYWVzKHg9eWVhcikpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gSW5kaWEpLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gSW5kaWFfbSksIGNvbG9yID0gInJlZCIpICsgDQogIGdlb21fbGluZShhZXMoeSA9IEJyYXppbCksIGNvbG9yID0gImdyZWVuIikgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBCcmF6aWxfbSksIGNvbG9yID0gImJsdWUiKSArDQogIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9TdGF0ZXMpLCBjb2xvciA9ICJwdXJwbGUiKSArDQogIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9TdGF0ZXNfbSksIGNvbG9yID0gInZpb2xldCIpIA0KDQpnZmdfcGxvdA0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFByb2plY3QgMSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgKDEpIENoYW5nZSB5LWF4aXMgZnJvbSAiSW5kaWEiIHRvICJQZXJjZW50YWdlIE93bmVyc2hpcCINCmdmZ19wbG90ICsgbGFicyh5ID0gIlBlcmNlbnRhZ2UgT3duZXJzaGlwIikNCmBgYA0KICgyKSBEaXNjdXNzIHBlcmNlbnRhZ2UgY2hhbmdlIG92ZXIgdGltZQ0KIA0KT2YgdGhlIDMgY291bnRyaWVzIGEgaGlnaGVyIGFjY291bnQgb3duZXJzaGlwIGFtb25nIG1lbiBtb3JlIGxpa2VseSwgZXNwZWNpYWxseSB3aXRoaW4NCkJyYXppbCBhbmQgSW5kaWEuIEhvd2V2ZXIsIG5vdGFibHkgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIHRoZXJlIGlzIG5vIGNsZWFyIGhpZ2hlciANCm93bmVyc2hpcCBiZXR3ZWVuIHRoZSB0d28gZ2VuZGVycyBhcyBpbiBzb21lIHllYXJzIGl0IGlzIGhpZ2hlciBhbW9uZyBmZW1hbGVzIHdoaWxlIGluDQpvdGhlcnMgaXQgaXMgZXF1YWxseSBoaWdoZXIgYW1vbmcgbWFsZXMuIEFsc28sIG5vdGFibHkgaW4gSW5kaWEsIGFzIG9mIHRoZSByZWNlbnQNCnllYXJzIHRoaXMgZ2FwIGluIG93bmVyc2hpcCBiZXR3ZWVuIHRoZSB0d28gZ2VuZGVycyBoYXMgc2xvd2x5IGNsb3NlZC4gV2hlcmVhcyBpbiBCcmF6aWwNCml0IGhhcyBzdGF5ZWQgcmVsYXRpdmVseSB0aGUgc2FtZSBvdmVyIHRoZSB5ZWFycy4NCg0KQXMgZm9yIGFjY291bnQgb3duZXJzaGlwIG92ZXJhbGwsIG1hbnkgY291bnRyaWVzIGRlbW9uc3RyYXRlIGEgcmlzZSBpbiBvd25lcnNoaXAgZXNwZWNpYWxseQ0KYW1vbmcgZmVtYWxlcy4gVGhlIG9ubHkgYXJlYXMgaW4gY29udHJhZGljdGlvbiB3aXRoIHRoaXMgdHJlbmQgYXJlIHRoZSBtYWxlIA0KcG9wdWxhdGlvbnMgb2YgYm90aCBJbmRpYSBhbmQgdGhlIFVuaXRlZCBTdGF0ZXMsIHdoaWNoIGhhdmUgZGVtb25zdHJhdGVkIGEgZ3JhZHVhbA0KZGVjcmVhc2UgaW4gYWNjb3VudCBvd25lcnNoaXAuIEhvd2V2ZXIsIGV2ZW4gd2l0aCB0aGlzIGRlY2xpbmUsIGFjY291bnQgb3duZXJzaGlwIA0KcGVyY2VudGFnZXMgb2YgMjAyMSByZW1haW4gYWNyb3NzIGFsbCBjb3VudHJpZXMsIGZvciB0aGUgbW9zdCBwYXJ0LCBoaWdoZXIgdGhhbiB0aG9zZSBvZg0KMjAxNC4NCg0KICgzKSBJcyBpdCBwb3NzaWJsZSB0byBzYXkgdGhhdCBhY2NvdW50IHBlcmNlbnRhZ2VzIGhhdmUgYmVlbiBpbmNyZWFzaW5nIGlmIHlvdSBkaXNyZWdhcmQgDQogICAgIGEgY2VydGFpbiB5ZWFyPyBEb2VzIHRoaXMgY2hhbmdlIGlmIHlvdSBmb2N1cyBvbiBhIHBhcnRpY3VsYXINCiAgICAgcGFydGljdWxhciBjb3VudHJ5IGFuZCBnZW5kZXIgY29tYmluYXRpb25zPw0KDQpBY3Jvc3MgYWxsIGNvdW50cmllcywgdGhlcmUgaXMgYSBub3RpY2VhYmxlIHNoYXJwIHR1cm5pbmcgcG9pbnQgYXJvdW5kIDIwMTcgd2hlcmUNCmVhY2ggY291bnRyeSBlaXRoZXIgc3Bpa2VkIGluIGFjY291bnQgb3duZXJzaGlwIG9yIGRlY2xpbmVkIGhlYXZpbHkuIEluIHRoaXMgY2FzZSwgDQpkaXNyZWdhcmRpbmcgeWVhcnMgYWZ0ZXIgMjAxNyBjb3VsZCBtYWtlIGl0IHNlZW0gYXMgdGhvdWdoIGFjY291bnQgb3duZXJzaGlwIA0KaW4gYSBjb3VudHJ5IHdhcyBtb3JlIGxpa2VseSB3aGVuIGluIHJlYWxpdHkgaXQgd2FzIGxlc3MgbGlrZWx5IGF0IGEgcG9pbnQgaW4gdGltZQ0KYW5kIHZpY2UgdmVyc3VzLg0KDQpUaGVyZSBhcmUgYWxzbyBtYW55IGNhc2VzIGluIGVhY2ggY291bnRyeSB3aGVyZSBvbWl0dGluZyBjZXJ0YWluIHllYXJzIGNvdWxkIA0KcHJvZHVjZSB0aGUgaWRlYSBvZiBhIG1vcmUgcHJvYmFibGUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZQ0KRm9yIGV4YW1wbGU6DQpJbiBJbmRpYSwgZGlzcmVnYXJkaW5nIDIwMTYgLSAyMDE4DQpJbiBCcmF6aWwsIGRpc3JlZ2FyZGluZyAyMDE2IC0gMjAxOA0KSW4gdGhlIFVuaXRlZCBTdGF0ZXMgMjAxNSAtIDIwMTggKEFsdGhvdWdoIHRoaXMgd291bGQgYmUgbW9yZSBvZiBhIGNvbnN0YW50IHJhdGUpDQoNClRoZXNlIHJlc3VsdHMgY291bGQgYWxzbyBiZSByZXBsaWNhdGVkIHdpdGggZGlmZmVyZW50IGdlbmRlciBhbmQgY291bnRyeQ0KY29tYmluYXRpb25zLCBmb3IgZXhhbXBsZSBvbmx5IHVzaW5nIHRoZSBoaWdoZXIgb3duZXJzaGlwIGdlbmRlcnMgZm9yIGVhY2ggY291bnRyeToNCnRoZSBmZW1hbGVzIG9mIHRoZSBVbml0ZWQgU3RhdGVzLCBmZW1hbGVzIG9mIEluZGlhIChkb24ndCBoYXZlIGEgc2hhcnAgZGVjbGluZQ0KbGlrZSB0aGUgbWVuIGRvIGFsdGhvdWdoIHRoZWlyIHBlcmNlbnRhZ2UgaXMgbG93ZXIgYWNyb3NzIHRoZSB5ZWFycyBpbiBjb21wYXJpc29uKSwgDQphbmQgbWFsZXMgb2YgQnJhemlsLiBUaGVzZSBjb21iaW5hdGlvbnMgY291bGQgY3JlYXRlIHRoZSBhbGx1c2lvbnMgb2YgYSBoaWdoZXIgbGlrZWxpaG9vZCBvZg0KYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgYW1vbmcgY2VydGFpbiBnZW5kZXJzLg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIFByb2plY3QgMSAoQ29udGludWVkKSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyAoNCkgQW5hbHlzaXMgb2YgY3N2IGZpbGVzDQoNCiMgR2V0IGFuZCBQbG90IHByaW1hcnkgb3IgbGVzcyBwZXJjZW50YWdlIHJhdGVzDQpzZXR3ZCgiQzovVXNlcnMvRWxpYW5uYSBOYWhhbmRhc3QvRGVza3RvcC9SIFByb2plY3QgRGF0YS9Qcm9qZWN0XzEiKQ0KcHJpbWFyeSA8LSByZWFkLmNzdigicHJpbWFyeS5jc3YiKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCnByaW1hcnkgPC0gcHJpbWFyeSAlPiUgDQogIGZpbHRlcihDb3VudHJ5Lk5hbWUgPT0gIkFsYmFuaWEiIHwgQ291bnRyeS5OYW1lID09ICJBdXN0cmFsaWEiIHwgQ291bnRyeS5OYW1lID09ICJBcm1lbmlhIiB8IENvdW50cnkuTmFtZSA9PSAiQWxnZXJpYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkFyZ2VudGluYSIpDQoNCmhlYWQocHJpbWFyeSkNCg0KI0VsaW1pbmF0ZSB1bndhbnRlZCBjb2x1bW5zDQpyZWxfY29sIDwtIHdoaWNoKGNvbG5hbWVzKHByaW1hcnkpPT0gIkNvdW50cnkuTmFtZSIgfCBjb2xuYW1lcyhwcmltYXJ5KT09ICJYMjAxNC4uWVIyMDE0LiIgfCBjb2xuYW1lcyhwcmltYXJ5KT09ICJYMjAxNy4uWVIyMDE3LiIgfCBjb2xuYW1lcyhwcmltYXJ5KT09ICJYMjAyMS4uWVIyMDIxLiIpDQoNCnByaW1hcnkgPC0gcHJpbWFyeVtyZWxfY29sXSAlPiUgDQogIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQ0KDQpoZWFkIChwcmltYXJ5KQ0KdHJhbnNwb3NlX3AgPC0gZGF0YS5mcmFtZSh0KHByaW1hcnlbLTFdKSkNCmNvbG5hbWVzKHRyYW5zcG9zZV9wKSA8LSBwcmltYXJ5WywgMV0NCg0KdHJhbnNwb3NlX3AkQWxiYW5pYSA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9wJEFsYmFuaWEpKQ0KdHJhbnNwb3NlX3AkQXVzdHJhbGlhID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3AkQXVzdHJhbGlhKSkNCnRyYW5zcG9zZV9wJEFybWVuaWEgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX3AkQXJtZW5pYSkpKQ0KdHJhbnNwb3NlX3AkQWxnZXJpYSA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKCh0cmFuc3Bvc2VfcCRBbGdlcmlhKSkpDQp0cmFuc3Bvc2VfcCRBcmdlbnRpbmEgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX3AkQXJnZW50aW5hKSkpDQoNCmhlYWQodHJhbnNwb3NlX3ApDQoNCnllYXIgPC0gYygyMDE0LCAyMDE3LCAyMDIxKQ0KZ2dwbG90KGRhdGE9dHJhbnNwb3NlX3AsIGFlcyh4PXllYXIsIHk9QWxiYW5pYSwgZ3JvdXA9MSkpICsgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkNCg0KI0Rpc3Rpbmd1aXNoIHByaW1hcnkgZGF0YQ0KdHJhbnNwb3NlX3AgPC0gcmVuYW1lKHRyYW5zcG9zZV9wLCAiQWxiYW5pYV9wIiA9IDEsICJBdXN0cmFsaWFfcCIgPSAyLCAiQXJtZW5pYV9wIiA9IDMsICJBbGdlcmlhX3AiID0gNCwgIkFyZ2VudGlhX3AiID0gNSkNCmhlYWQodHJhbnNwb3NlX3ApDQoNCiMgR2V0IGFuZCBwbG90IHNlY29uZGFyeSBvciBtb3JlIGRhdGENCnNldHdkKCJDOi9Vc2Vycy9FbGlhbm5hIE5haGFuZGFzdC9EZXNrdG9wL1IgUHJvamVjdCBEYXRhL1Byb2plY3RfMSIpDQpzZWNvbmRhcnkgPC0gcmVhZC5jc3YoInNlY29uZGFyeS5jc3YiKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCnNlY29uZGFyeSA8LSBzZWNvbmRhcnkgJT4lIA0KICBmaWx0ZXIoQ291bnRyeS5OYW1lID09ICJBbGJhbmlhIiB8IENvdW50cnkuTmFtZSA9PSAiQXVzdHJhbGlhIiB8IENvdW50cnkuTmFtZSA9PSAiQXJtZW5pYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkFsZ2VyaWEiIHwgQ291bnRyeS5OYW1lID09ICJBcmdlbnRpbmEiKQ0KDQpoZWFkKHNlY29uZGFyeSkNCg0KI0VsaW1pbmF0ZSB1bndhbnRlZCBjb2x1bW5zDQpyZWxfY29sIDwtIHdoaWNoKGNvbG5hbWVzKHNlY29uZGFyeSk9PSAiQ291bnRyeS5OYW1lIiB8IGNvbG5hbWVzKHNlY29uZGFyeSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMoc2Vjb25kYXJ5KT09ICJYMjAxNy4uWVIyMDE3LiIgfCBjb2xuYW1lcyhzZWNvbmRhcnkpPT0gIlgyMDIxLi5ZUjIwMjEuIikNCg0Kc2Vjb25kYXJ5IDwtIHNlY29uZGFyeVtyZWxfY29sXSAlPiUgDQogIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQ0KDQpoZWFkIChzZWNvbmRhcnkpDQp0cmFuc3Bvc2VfcyA8LSBkYXRhLmZyYW1lKHQoc2Vjb25kYXJ5Wy0xXSkpDQpjb2xuYW1lcyh0cmFuc3Bvc2VfcykgPC0gc2Vjb25kYXJ5WywgMV0NCg0KdHJhbnNwb3NlX3MkQWxiYW5pYSA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zJEFsYmFuaWEpKQ0KdHJhbnNwb3NlX3MkQXVzdHJhbGlhID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3MkQXVzdHJhbGlhKSkNCnRyYW5zcG9zZV9zJEFybWVuaWEgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX3MkQXJtZW5pYSkpKQ0KdHJhbnNwb3NlX3MkQWxnZXJpYSA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKCh0cmFuc3Bvc2VfcyRBbGdlcmlhKSkpDQp0cmFuc3Bvc2VfcyRBcmdlbnRpbmEgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX3MkQXJnZW50aW5hKSkpDQoNCmhlYWQodHJhbnNwb3NlX3MpDQoNCiMgTWVyZ2UgdGhlIGRhdGEgc2V0cyB0b2dldGhlcg0KDQp0cmFuc3Bvc2VfcCA8LSByb3duYW1lc190b19jb2x1bW4odHJhbnNwb3NlX3AsIHZhcj0iWWVhciIpDQp0cmFuc3Bvc2VfcyA8LSByb3duYW1lc190b19jb2x1bW4odHJhbnNwb3NlX3MsIHZhcj0iWWVhciIpDQoNCmFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uIDwtIG1lcmdlKHggPSB0cmFuc3Bvc2VfcCwgeSA9IHRyYW5zcG9zZV9zLCBieSA9ICJZZWFyIiwgYWxsLnggPSBUUlVFKQ0KDQpoZWFkKGFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uKQ0KDQojUGxvdCBkYXRhDQoNCmdmZ19wbG90IDwtIGdncGxvdChhY2N0X293bmVyX2J5X2VkdWNhdGlvbiwgYWVzKHg9eWVhcikpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQWxiYW5pYV9wKSwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fbGluZShhZXMoeSA9IEFsYmFuaWEpLCBjb2xvciA9ICJncmF5IikgKyANCiAgZ2VvbV9saW5lKGFlcyh5ID0gQXVzdHJhbGlhX3ApLCBjb2xvciA9ICJsaWdodGJsdWUiKSArDQogIGdlb21fbGluZShhZXMoeSA9IEF1c3RyYWxpYSksIGNvbG9yID0gImJsdWUiKSArDQogIGdlb21fbGluZShhZXMoeSA9IEFybWVuaWFfcCksIGNvbG9yID0gInB1cnBsZSIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQXJtZW5pYSksIGNvbG9yID0gInBpbmsiKSArDQogIGdlb21fbGluZShhZXMoeSA9IEFsZ2VyaWEpLCBjb2xvciA9ICJvcmFuZ2UiKSArDQogIGdlb21fbGluZShhZXMoeSA9IEFsZ2VyaWFfcCksIGNvbG9yID0gInJlZCIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQXJnZW50aW5hKSwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBBcmdlbnRpYV9wKSwgY29sb3IgPSAiZ3JlZW4iKQ0KDQpnZmdfcGxvdA0KDQojIENoYW5nZSB5IC0gYXhpcw0KZ2ZnX3Bsb3QgKyBsYWJzKHkgPSAiUGVyY2VudGFnZSBFZHVjYXRpb24iKQ0KDQpgYGANCg0KU3VtbWFyeSBvZiBEYXRhOg0KDQpUaGUgcHJldmlvdXMgZ3JhcGggaW5jbHVkZXMgdGhlIGRhdGEgYWNyb3NzIGZpdmUgY291bnRyaWVzIChBbGJhbmlhLCBBdXN0cmFsaWEsIEFybWVuaWEsIA0KQWxnZXJpYSwgYW5kIEFyZ2VudGluYSkgYW5kIHRoZWlyIHBlcmNlbnRhZ2VzIGluIGFjY291bnQgb3duZXJzaGlwDQpvZiB0aG9zZSBoYXZpbmcgYSBwcmltYXJ5IGVkdWNhdGlvbiBvciBsZXNzIGFuZCB0aG9zZSBoYXZpbmcgYSBzZWNvbmRhcnkgDQplZHVjYXRpb24gb3IgaGlnaGVyLiBBdCBhIGdsYW5jZSwgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFzIG11Y2ggZGlyZWN0IGNvcnJlbGF0aW9uDQphcyBzZWVuIHdpdGggdGhlIHByZXZpb3VzIGdyYXBoLCBob3dldmVyIHRoZXJlIGFyZSBzb21lIG5vdGFibGUgb2JzZXJ2YXRpb25zLg0KDQpBY3Jvc3MgbW9zdCBjb3VudHJpZXMsIHdoaWxlIGluIHByZXZpb3VzIHllYXJzIGFjY291bnQgb3duZXJzaGlwIHdpdGhpbiB0aGVzZSB0d28NCmdyb3VwcyByZW1haW5lZCBhdCBkaXN0aW5jdGx5IGRpZmZlcmluZyBwZXJjZW50YWdlcywgaW4gdGhlIHJlY2VudCB5ZWFycyBpdCBoYXMgZXF1YWxlZCB0bw0KYXJvdW5kIHRoZSBzYW1lIHBlcmNlbnRhZ2UgaW4gYm90aCBncm91cHMgb2YgZWR1Y2F0aW9uLiBGb3IgZXhhbXBsZSwgdGhpcyBpcyBzZWVuIGluIEFsZ2VyaWEsIEFyZ2VudGluYSwgDQphbmQgQXJtZW5pYS4gSGF2aW5nIHRoaXMgaW4gbWluZCwgd2UgY2FuIHNlZSB0aGUgdHdvIGNvdW50cmllcyB0aGF0IGZhbGwgZnJvbSB0aGlzIHRyZW5kIGFyZSANCkF1c3RyYWxpYSBhbmQgQWxiYW5pYSwgYm90aCBvZiB3aGljaCBoYXZlIGEgbGFyZ2UgZGlmZmVyZW5jZSBpbiBvd25lcnNoaXAgcGVyY2VudGFnZXMgYmV0d2VlbiANCnRoZXNlIHR3byBncm91cHMuDQoNCkluIGJvdGggQWxiYW5pYSBhbmQgQXVzdHJhbGlhLCBoaWdoZXIgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgd2VyZSBwcmVzZW50IGFtb25nIHRob3NlIGhhdmluZw0Kc2Vjb25kYXJ5IGVkdWNhdGlvbiBvciBoaWdoZXIuDQoNCkFzIG1lbnRpb25lZCBwcmV2aW91c2x5LCB0aGlzIGRhdGEgY2FuIGFsc28gYmUgY2hlcnJ5LXBpY2tlZCBpbiB2YXJpb3VzIHdheXMgZXNwZWNpYWxseQ0KaW4gZGlzcmVnYXJkaW5nIGNlcnRhaW4geWVhcnMuIE92ZXIgdGltZSwgZWFjaCBlZHVjYXRlZCBncm91cCBpbmNyZWFzZWQgYW5kDQpkZWNyZWFzZWQgaW4gc29tZSB3YXkgaW4gcmVnYXJkcyB0byB0aGVpciBhY2NvdW50IG93bmVyc2hpcCBsZXZlbHMsIHNvIG9taXR0aW5nIGNlcnRhaW4geWVhcnMNCmNvdWxkIGVhc2lseSBiZSBkb25lIHRvIHNob3cgdGhlIGRlc2lyZWQgcmVzdWx0cy4NCg0KRm9yIGV4YW1wbGUsIGxvb2tpbmcgYXQgQXJtZW5pYSdzIHByaW1hcnkgZWR1Y2F0aW9uIG9yIGxlc3MgcG9wdWxhdGlvbiwgc2hvdWxkIHRoZSBncmFwaA0Kb25seSBpbmNsdWRlIHllYXJzIDIwMTQgLSAyMDE3IGl0IGNvdWxkIGJlIHNhaWQgdGhpcyBncm91cCB3YXMgbGVzcyBsaWtlbHkgdG8gaGF2ZSBhY2NvdW50IA0Kb3duZXJzaGlwIGF0IGEgZmluYW5jaWFsIEluc3RpdHV0aW9uLiBIb3dldmVyLCBpZiB3ZSBsb29rZWQgYXQgdGhlIHllYXIgMjAxNyAtIDIwMjEsIGl0IGNvdWxkIGJlIA0Kc2FpZCB0aGlzIGdyb3VwIGhhZCBhIGhpZ2hlciBsaWtlbGlob29kIG9mIGhhdmluZyBhY2NvdW50IG93bmVyc2hpcC4NCg0KQW5vdGhlciBub3RhYmxlIG9ic2VydmF0aW9uLCBpcyB0aGF0IHRoZXJlIGlzbid0IGEgbGFyZ2UgaW5kaWNhdGlvbiBvZiBoaWdoZXIgcHJvYmFiaWxpdHkNCm9mIG9uZSBlZHVjYXRpb25hbCBncm91cCBoYXZpbmcgYWNjb3VudCBvd25lcnNoaXAgb3ZlciB0aGUgb3RoZXIuIEluIHNvbWUgY291bnRyaWVzLCB0aG9zZSBoYXZpbmcgDQpwcmltYXJ5IG9yIGxlc3Mgd2VyZSBzZWVuIHRvIGhhdmUgaGlnaGVyIGFjY291bnQgb3duZXIgYW5kIGluIG90aGVycyB0aG9zZSBvZiBzZWNvbmRhcnkgb3INCmhpZ2hlciB3ZXJlIHNlZW4gdG8gaGF2ZSBoaWdoZXIgYWNjb3VudCBvd25lcnNoaXAuIEV2ZW4gYWNyb3NzIHRpbWUsIGJvdGggZWR1Y2F0aW9uYWwgZ3JvdXBzIGluY3JlYXNlZA0KYW5kIGRlY3JlYXNlZCBpbiBwZXJjZW50YWdlcy4gVGhlcmUgd291bGQgbGlrZWx5IGhhdmUgdG8gYmUgbW9yZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIHByb3ZpZGVkIG9yIA0KZ2FpbmVkIGluIG9yZGVyIHRvIG1ha2UgYW55IHJlYWwgY29uY2x1c2lvbnMvcmVhc29uaW5nIGJlaGluZCB0aGUgZGF0YS4NCg==