OBJECTIVE This study aims to observe and understand the factors involving a household Income and Spending. Does education affect income?, if so, what education level has better income? Is it better to have higher education?
On spending, which marital status has more spending? what is the relationship of Income to spending? or to your marital status?
These are the questions we will attempt to understand and if these questions can relate to our ability to target which spending market.
We will utilize a data from a food/grocery company that serves across countries and see how their market base respond on spending.
This is a two part analysis, 1. Analyze Income vs Spending and 2. Spending habits (what they spend the most)
DATA STRUCTURE AND RETRIEVAL The data from this study came from kaggle - an online repository and site for data science enthusiast. https://www.kaggle.com/jackdaoud/marketing-data
household <- read.csv("household.csv")
head(household)
DEFINITION
ID : Customer id
Year_Birth: Customer birth year
Est Age : Estimated age by year Birth to 2021
Education : Educational attainment
Marital : Marital Status
Income : Annual Income
Kidhome : household with kids est. 12yo below
Teenhome : household with teen est. > 12yo and < 18yo
MntWines : Wine spending
MntFruits : Fruit spending
MntMeat.. : Meat spending
MntFish…: Fish Spending
MntSweet : Sweet or Snack spending
MntGold…: Non-essential spending
NumDeals : purchase count with discounts or promos
NumWeb : Online purchase count
NumStore : Physical store purchase count
NumVisit : Website visit count
TOTAL PARTICIPANTS
length(household$ID)
[1] 2240
We have a total of 2240 participants
AGE DISTRIBUTION
hist(household$Est_Age, main="Age distribution of Participants")

mean(household$Est_Age)
[1] 52.1942
The average age of the participants is 52yo
PARTICIPANTS BY COUNTRY
household %>% ggplot(aes(Country)) + geom_bar(fill="blue") + ggtitle("Household Participants by Country")

In this study, Spain has the largest participants with over 1000 and the rest averages 150 participants
PARTICIPANTS BY EDUCATION
household %>% ggplot(aes(Education)) + geom_bar(fill="blue") + ggtitle("Household Participants by Education")

Majority of the participants are at least graduate/college level with over 1000 while more than 300 have masters and more than 500 have Phd
INCOME DISTRIBUTION
household %>% filter(Est_Age<100) %>% ggplot(aes(x= Income, fill=Education)) + geom_density(alpha=0.2) + scale_x_continuous(trans = "log10", labels=scales::comma) + ggtitle("Income Density by Education")

household %>% filter(Est_Age<100) %>% ggplot(aes(Education, Income)) + geom_boxplot() + scale_y_continuous(trans = "log10", labels=scales::comma) + ylab("income in $") + ggtitle("Income by Education of Participants")

mean(household$Income)
[1] 51687.46
all_participants <- length(household$ID)
group_educ <- household %>% group_by(Education) %>% summarise(total_per_education=length(Education), percent = length(Education)/all_participants*100,avg_income=mean(Income))
group_educ
Majority of the participants are within 30,000 to 100,000 usd in Income range with an average of 51,687. It is surprising (at least for me) that the outlier of both highest and lowest in income levels are in the Graduation/college level category.
Average income for those in Graduation and Masteral level of Education has about the same Income and Phd is higher by 3000 usd. While Basic educ has the lowest of educ level having second level education proves to have competitive Income.
INCOME VS MARITAL STATUS
household %>% filter(Est_Age<100) %>% ggplot(aes(Marital_Status, Income)) + geom_boxplot() + scale_y_continuous(trans = "log10", labels=scales::comma) + ylab("income in $") + ggtitle("Income by Marital Status of Participants")

all_participants <- length(household$ID)
group_marital <- household %>% group_by(Marital_Status) %>% summarise(total_per_maritalstat=length(Marital_Status), percent_all = length(Marital_Status)/all_participants*100, avg_income=mean(Income))
group_marital
WHile there is nothing much of a difference in income regardless of Marital Status, as income is a result of education, skill or experience, we may see the impact of spending on the status especially to those having kids or teens to support - let’s find out how income affects marital status on spending
SPENDING
total_spend <- household %>% group_by(Marital_Status) %>% summarise(totalspend=MntWines+MntFruits+MntMeatProducts+MntFishProducts+MntSweetProducts+MntGoldProds)
`summarise()` has grouped output by 'Marital_Status'. You can override using the `.groups` argument.
total_spend_sum <- total_spend %>% group_by(Marital_Status) %>% summarise(total_per_mstat=length(Marital_Status), spending_per_mstat=sum(totalspend), percent_spend=formatC( total_per_mstat/spending_per_mstat*100))
total_spend_sum
total_spend_sum %>% filter(Marital_Status!="Alone" & Marital_Status!="YOLO") %>% ggplot(aes(Marital_Status,percent_spend, fill="red")) + geom_bar(stat = "identity") + ggtitle("Percent Spending by Marital Status")

Overall, the Married category has the most in spending which is not surprising followed by the Singles. While they may have different spending reasons as the Married may be focused on needs and singles on wants. Let’s find out as we break down the Essential and Non Essential spending.
ESSENTIAL VS NON-ESSENTIAL SPENDING
We have six major categories in spending: Wine, Sweets , Fruits, Meats, Fish and Gold
Fruit, Meats and Fish are considered ESSENTIALS and the rest would be NON_ESSENTIALS.
essential_comp <- household %>% group_by(Marital_Status) %>% summarise(Essentials= MntFruits+MntMeatProducts+MntFishProducts, Percent_Essential=as.numeric(formatC(length(Marital_Status)/Essentials*100)), Non_essential =MntWines+MntSweetProducts+MntGoldProds, Percent_NonEssential=as.numeric(formatC(length(Marital_Status)/Non_essential*100) ))
`summarise()` has grouped output by 'Marital_Status'. You can override using the `.groups` argument.
essential_comp_sum <- essential_comp %>% group_by(Marital_Status) %>% summarise(total_per_mstat=length(Marital_Status), sum_Essential=sum(Essentials), percent_Essential=total_per_mstat/sum_Essential*100, sum_NonEssential=sum(Non_essential), percent_NonEssential=total_per_mstat/sum_NonEssential*100)
essential_comp_sum
essential_comp_sum %>%filter(Marital_Status!="Alone" & Marital_Status!="YOLO") %>% ggplot(aes(Marital_Status,percent_Essential, fill="red")) + geom_bar(stat = "identity") + ggtitle("Percent Spending on Essential: Fruits, Fish, Meats") + ylim(0,0.5)

essential_comp_sum %>% filter(Marital_Status!="Alone" & Marital_Status!="YOLO") %>% ggplot(aes(Marital_Status,percent_NonEssential)) + geom_bar(stat = "identity") + ggtitle("Percent Spending on Non Essential: Wine, Sweets,Non-food") + ylim(0,0.5)

Overall the spending for essential items is greater compared to Non-essential as seen in the percent spending regardless of Marital Status. Divorced and Married is tops the spending for essential.
Non-essential spending is lower and single status tops the group but not by much.
INCOME vs SPENDING
In here we will look into the relationship of one’s income to its spending habit. We will use Correlation to evaluate how strong or weak the relationship between Income and spending.
THe Correlation coefficient is the measure of how strong or weak a relationship between two values (Income vs Spending) and it has a value between -1 to 1.
A coeff closer to 1 means a strong relationship between values and a coeff closer to 0 means a weak relationship
IncomexSpending <- household %>% summarise(house_income=Income, totalspend=MntWines+MntFruits+MntMeatProducts+MntFishProducts+MntSweetProducts+MntGoldProds)
head(IncomexSpending)
cor(IncomexSpending$house_income,IncomexSpending$totalspend)
[1] 0.6541537
IncomexSpending %>% filter(house_income<600000 & house_income>0) %>% ggplot(aes(house_income, totalspend)) +
geom_jitter() + scale_x_continuous(trans = "log2", labels=scales::comma) + geom_smooth(mathod="lm") + xlim(0,100000) + ggtitle("Overall Spending x Income Analysis")
Ignoring unknown parameters: mathodScale for 'x' is already present. Adding another scale for 'x', which
will replace the existing scale.

RIght off the bat we can see that there is lower spending on Income are below 50000 and more spending on higher income participants.
IncomexSpending %>% filter(house_income>0 & house_income<40000) %>% ggplot(aes(house_income, totalspend)) + geom_point() + scale_x_continuous(trans = "log2", labels=scales::comma) + geom_smooth(mathod="lm") + xlim(0,40000) + ylim(0,2500) + ggtitle("Spending x Income < 40,000")
Ignoring unknown parameters: mathodScale for 'x' is already present. Adding another scale for 'x', which
will replace the existing scale.

Zooming in, we see that for Income of less than 40000, there is way less spending and their distribution is compact ergo much more participants are spending less
IncomexSpending %>% filter(house_income>40001 & house_income<100000) %>% ggplot(aes(house_income, totalspend)) + geom_point() + geom_smooth(mathod="lm") + xlim(40000,100000)+ scale_x_continuous(trans = "log2", labels=scales::comma) + ggtitle("Spending x Income > 50,000")
Ignoring unknown parameters: mathodScale for 'x' is already present. Adding another scale for 'x', which
will replace the existing scale.

And for those Income greater than 40000, we can see a more upward spread. The greater the Income, the greater the spending
Incomeless50k <- IncomexSpending %>% filter(house_income>0 & house_income<40000)
cor(Incomeless50k$house_income, Incomeless50k$totalspend)
[1] 0.1387899
Incomegreat50k <- IncomexSpending %>% filter(house_income>40001 & house_income<100000)
cor(Incomegreat50k$house_income, Incomegreat50k$totalspend)
[1] 0.7838105
Computing for the Correlation Coefficients for both income<40000 and income>40000, we can see that there is a weak relationship for those below 40k Income, meaning there is not much of spending happening from them compared to those higher than 40k Income.
NEXT UP Now that we know who’s spending more, let’s find out which specific item category is being spent by our total participants to validate spending priorities, this will halp us focus our market targeting and advertising as a business entity.
STAY TUNED!
Prepared by Dodgecarl Incila
LS0tDQp0aXRsZTogIk1hcmtldCBBbmFseXNpczogSG91c2Vob2xkIEluY29tZSBhbmQgU3BlbmRpbmcgUDEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpPQkpFQ1RJVkUgDQpUaGlzIHN0dWR5IGFpbXMgdG8gb2JzZXJ2ZSBhbmQgdW5kZXJzdGFuZCB0aGUgZmFjdG9ycyBpbnZvbHZpbmcgYSBob3VzZWhvbGQgSW5jb21lIGFuZCAgU3BlbmRpbmcuIERvZXMgZWR1Y2F0aW9uIGFmZmVjdCBpbmNvbWU/LCBpZiBzbywgd2hhdCBlZHVjYXRpb24gbGV2ZWwgaGFzIGJldHRlciBpbmNvbWU/IElzIGl0IGJldHRlciB0byBoYXZlIGhpZ2hlciBlZHVjYXRpb24/DQoNCk9uIHNwZW5kaW5nLCB3aGljaCBtYXJpdGFsIHN0YXR1cyBoYXMgbW9yZSBzcGVuZGluZz8gd2hhdCBpcyB0aGUgcmVsYXRpb25zaGlwIG9mIEluY29tZSB0byBzcGVuZGluZz8gb3IgdG8geW91ciBtYXJpdGFsIHN0YXR1cz8NCg0KVGhlc2UgYXJlIHRoZSBxdWVzdGlvbnMgd2Ugd2lsbCBhdHRlbXB0IHRvIHVuZGVyc3RhbmQgYW5kIGlmIHRoZXNlIHF1ZXN0aW9ucyBjYW4gcmVsYXRlIHRvIG91ciBhYmlsaXR5IHRvIHRhcmdldCB3aGljaCBzcGVuZGluZyBtYXJrZXQuDQoNCldlIHdpbGwgdXRpbGl6ZSBhIGRhdGEgZnJvbSBhIGZvb2QvZ3JvY2VyeSBjb21wYW55IHRoYXQgc2VydmVzIGFjcm9zcyBjb3VudHJpZXMgYW5kIHNlZSBob3cgdGhlaXIgbWFya2V0IGJhc2UgcmVzcG9uZCBvbiBzcGVuZGluZy4NCg0KVGhpcyBpcyBhIHR3byBwYXJ0IGFuYWx5c2lzLCAxLiBBbmFseXplIEluY29tZSB2cyBTcGVuZGluZyBhbmQgMi4gU3BlbmRpbmcgaGFiaXRzICh3aGF0IHRoZXkgc3BlbmQgdGhlIG1vc3QpDQoNCkRBVEEgU1RSVUNUVVJFIEFORCBSRVRSSUVWQUwNClRoZSBkYXRhIGZyb20gdGhpcyBzdHVkeSBjYW1lIGZyb20ga2FnZ2xlIC0gYW4gb25saW5lIHJlcG9zaXRvcnkgYW5kIHNpdGUgZm9yIGRhdGEgc2NpZW5jZSBlbnRodXNpYXN0LiBodHRwczovL3d3dy5rYWdnbGUuY29tL2phY2tkYW91ZC9tYXJrZXRpbmctZGF0YQ0KDQpgYGB7cn0NCmhvdXNlaG9sZCA8LSByZWFkLmNzdigiaG91c2Vob2xkLmNzdiIpDQpoZWFkKGhvdXNlaG9sZCkNCmBgYA0KREVGSU5JVElPTg0KDQpJRCAgICAgICAgOiBDdXN0b21lciBpZA0KDQpZZWFyX0JpcnRoOiBDdXN0b21lciBiaXJ0aCB5ZWFyDQoNCkVzdCBBZ2UgICA6IEVzdGltYXRlZCBhZ2UgYnkgeWVhciBCaXJ0aCB0byAyMDIxDQoNCkVkdWNhdGlvbiA6IEVkdWNhdGlvbmFsIGF0dGFpbm1lbnQNCg0KTWFyaXRhbCAgIDogTWFyaXRhbCBTdGF0dXMNCg0KSW5jb21lICAgIDogQW5udWFsIEluY29tZQ0KDQpLaWRob21lICAgOiBob3VzZWhvbGQgd2l0aCBraWRzIGVzdC4gMTJ5byBiZWxvdw0KDQpUZWVuaG9tZSAgOiBob3VzZWhvbGQgd2l0aCB0ZWVuIGVzdC4gID4gMTJ5byBhbmQgPCAxOHlvDQoNCk1udFdpbmVzICA6IFdpbmUgc3BlbmRpbmcNCg0KTW50RnJ1aXRzIDogRnJ1aXQgc3BlbmRpbmcNCg0KTW50TWVhdC4uIDogTWVhdCBzcGVuZGluZw0KDQpNbnRGaXNoLi4uOiBGaXNoIFNwZW5kaW5nDQoNCk1udFN3ZWV0ICA6IFN3ZWV0IG9yIFNuYWNrIHNwZW5kaW5nDQoNCk1udEdvbGQuLi46IE5vbi1lc3NlbnRpYWwgc3BlbmRpbmcNCg0KTnVtRGVhbHMgIDogcHVyY2hhc2UgY291bnQgd2l0aCBkaXNjb3VudHMgb3IgcHJvbW9zDQoNCk51bVdlYiAgICA6IE9ubGluZSBwdXJjaGFzZSBjb3VudA0KDQpOdW1TdG9yZSAgOiBQaHlzaWNhbCBzdG9yZSBwdXJjaGFzZSBjb3VudA0KDQpOdW1WaXNpdCAgOiBXZWJzaXRlIHZpc2l0IGNvdW50DQoNCg0KDQpUT1RBTCBQQVJUSUNJUEFOVFMNCmBgYHtyfQ0KbGVuZ3RoKGhvdXNlaG9sZCRJRCkNCg0KYGBgDQpXZSBoYXZlIGEgdG90YWwgb2YgMjI0MCBwYXJ0aWNpcGFudHMNCg0KDQpBR0UgRElTVFJJQlVUSU9ODQpgYGB7cn0NCmhpc3QoaG91c2Vob2xkJEVzdF9BZ2UsIG1haW49IkFnZSBkaXN0cmlidXRpb24gb2YgUGFydGljaXBhbnRzIikNCm1lYW4oaG91c2Vob2xkJEVzdF9BZ2UpDQpgYGANClRoZSBhdmVyYWdlIGFnZSBvZiB0aGUgcGFydGljaXBhbnRzIGlzIDUyeW8NCg0KDQpQQVJUSUNJUEFOVFMgQlkgQ09VTlRSWQ0KYGBge3J9DQpob3VzZWhvbGQgJT4lIGdncGxvdChhZXMoQ291bnRyeSkpICsgZ2VvbV9iYXIoZmlsbD0iYmx1ZSIpICsgZ2d0aXRsZSgiSG91c2Vob2xkIFBhcnRpY2lwYW50cyBieSBDb3VudHJ5IikNCmBgYA0KSW4gdGhpcyBzdHVkeSwgU3BhaW4gaGFzIHRoZSBsYXJnZXN0IHBhcnRpY2lwYW50cyB3aXRoIG92ZXIgMTAwMCBhbmQgdGhlIHJlc3QgYXZlcmFnZXMgMTUwIHBhcnRpY2lwYW50cw0KDQoNClBBUlRJQ0lQQU5UUyBCWSBFRFVDQVRJT04NCmBgYHtyfQ0KaG91c2Vob2xkICU+JSBnZ3Bsb3QoYWVzKEVkdWNhdGlvbikpICsgZ2VvbV9iYXIoZmlsbD0iYmx1ZSIpICsgZ2d0aXRsZSgiSG91c2Vob2xkIFBhcnRpY2lwYW50cyBieSBFZHVjYXRpb24iKQ0KYGBgDQpNYWpvcml0eSBvZiB0aGUgcGFydGljaXBhbnRzIGFyZSBhdCBsZWFzdCBncmFkdWF0ZS9jb2xsZWdlIGxldmVsIHdpdGggb3ZlciAxMDAwIHdoaWxlIG1vcmUgdGhhbiAzMDAgaGF2ZSBtYXN0ZXJzIGFuZCBtb3JlIHRoYW4gNTAwIGhhdmUgUGhkIA0KDQoNCklOQ09NRSBESVNUUklCVVRJT04NCmBgYHtyfQ0KaG91c2Vob2xkICU+JSBmaWx0ZXIoRXN0X0FnZTwxMDApICU+JSBnZ3Bsb3QoYWVzKHg9IEluY29tZSwgZmlsbD1FZHVjYXRpb24pKSArIGdlb21fZGVuc2l0eShhbHBoYT0wLjIpICsgIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGxhYmVscz1zY2FsZXM6OmNvbW1hKSArIGdndGl0bGUoIkluY29tZSBEZW5zaXR5IGJ5IEVkdWNhdGlvbiIpDQpob3VzZWhvbGQgJT4lIGZpbHRlcihFc3RfQWdlPDEwMCkgJT4lICBnZ3Bsb3QoYWVzKEVkdWNhdGlvbiwgSW5jb21lKSkgKyBnZW9tX2JveHBsb3QoKSArIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGxhYmVscz1zY2FsZXM6OmNvbW1hKSArIHlsYWIoImluY29tZSBpbiAkIikgKyBnZ3RpdGxlKCJJbmNvbWUgYnkgRWR1Y2F0aW9uIG9mIFBhcnRpY2lwYW50cyIpDQptZWFuKGhvdXNlaG9sZCRJbmNvbWUpDQoNCmBgYA0KDQpgYGB7cn0NCmFsbF9wYXJ0aWNpcGFudHMgPC0gbGVuZ3RoKGhvdXNlaG9sZCRJRCkNCmdyb3VwX2VkdWMgPC0gaG91c2Vob2xkICU+JSBncm91cF9ieShFZHVjYXRpb24pICU+JSBzdW1tYXJpc2UodG90YWxfcGVyX2VkdWNhdGlvbj1sZW5ndGgoRWR1Y2F0aW9uKSwgcGVyY2VudCA9IGxlbmd0aChFZHVjYXRpb24pL2FsbF9wYXJ0aWNpcGFudHMqMTAwLGF2Z19pbmNvbWU9bWVhbihJbmNvbWUpKQ0KZ3JvdXBfZWR1Yw0KYGBgDQpNYWpvcml0eSBvZiB0aGUgcGFydGljaXBhbnRzIGFyZSB3aXRoaW4gMzAsMDAwIHRvIDEwMCwwMDAgdXNkIGluIEluY29tZSByYW5nZSB3aXRoIGFuIGF2ZXJhZ2Ugb2YgNTEsNjg3LiBJdCBpcyBzdXJwcmlzaW5nIChhdCBsZWFzdCBmb3IgbWUpIHRoYXQgdGhlIG91dGxpZXIgb2YgYm90aCBoaWdoZXN0IGFuZCBsb3dlc3QgaW4gaW5jb21lIGxldmVscyBhcmUgaW4gdGhlIEdyYWR1YXRpb24vY29sbGVnZSBsZXZlbCBjYXRlZ29yeS4gDQoNCkF2ZXJhZ2UgaW5jb21lIGZvciB0aG9zZSBpbiBHcmFkdWF0aW9uIGFuZCBNYXN0ZXJhbCBsZXZlbCBvZiBFZHVjYXRpb24gaGFzIGFib3V0IHRoZSBzYW1lIEluY29tZSBhbmQgUGhkIGlzIGhpZ2hlciBieSAzMDAwIHVzZC4gV2hpbGUgQmFzaWMgZWR1YyBoYXMgdGhlIGxvd2VzdCBvZiBlZHVjIGxldmVsIGhhdmluZyBzZWNvbmQgbGV2ZWwgZWR1Y2F0aW9uIHByb3ZlcyB0byBoYXZlIGNvbXBldGl0aXZlIEluY29tZS4gIA0KDQoNCg0KSU5DT01FIFZTIE1BUklUQUwgU1RBVFVTDQpgYGB7cn0NCmhvdXNlaG9sZCAlPiUgZmlsdGVyKEVzdF9BZ2U8MTAwKSAlPiUgIGdncGxvdChhZXMoTWFyaXRhbF9TdGF0dXMsIEluY29tZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHM9c2NhbGVzOjpjb21tYSkgKyB5bGFiKCJpbmNvbWUgaW4gJCIpICsgZ2d0aXRsZSgiSW5jb21lIGJ5IE1hcml0YWwgU3RhdHVzIG9mIFBhcnRpY2lwYW50cyIpDQpgYGANCg0KYGBge3J9DQphbGxfcGFydGljaXBhbnRzIDwtIGxlbmd0aChob3VzZWhvbGQkSUQpDQpncm91cF9tYXJpdGFsIDwtIGhvdXNlaG9sZCAlPiUgZ3JvdXBfYnkoTWFyaXRhbF9TdGF0dXMpICU+JSBzdW1tYXJpc2UodG90YWxfcGVyX21hcml0YWxzdGF0PWxlbmd0aChNYXJpdGFsX1N0YXR1cyksIHBlcmNlbnRfYWxsID0gbGVuZ3RoKE1hcml0YWxfU3RhdHVzKS9hbGxfcGFydGljaXBhbnRzKjEwMCwgYXZnX2luY29tZT1tZWFuKEluY29tZSkpDQpncm91cF9tYXJpdGFsDQpgYGANCldIaWxlIHRoZXJlIGlzIG5vdGhpbmcgbXVjaCBvZiBhIGRpZmZlcmVuY2UgaW4gaW5jb21lIHJlZ2FyZGxlc3Mgb2YgTWFyaXRhbCBTdGF0dXMsIGFzIGluY29tZSBpcyBhIHJlc3VsdCBvZiBlZHVjYXRpb24sIHNraWxsIG9yIGV4cGVyaWVuY2UsIHdlIG1heSBzZWUgdGhlIGltcGFjdCBvZiBzcGVuZGluZyBvbiB0aGUgc3RhdHVzIGVzcGVjaWFsbHkgdG8gdGhvc2UgaGF2aW5nIGtpZHMgb3IgdGVlbnMgdG8gc3VwcG9ydCAtIGxldCdzIGZpbmQgb3V0IGhvdyBpbmNvbWUgYWZmZWN0cyBtYXJpdGFsIHN0YXR1cyBvbiBzcGVuZGluZw0KDQoNCg0KDQpTUEVORElORw0KYGBge3J9DQp0b3RhbF9zcGVuZCA8LSBob3VzZWhvbGQgJT4lIGdyb3VwX2J5KE1hcml0YWxfU3RhdHVzKSAlPiUgc3VtbWFyaXNlKHRvdGFsc3BlbmQ9TW50V2luZXMrTW50RnJ1aXRzK01udE1lYXRQcm9kdWN0cytNbnRGaXNoUHJvZHVjdHMrTW50U3dlZXRQcm9kdWN0cytNbnRHb2xkUHJvZHMpDQp0b3RhbF9zcGVuZF9zdW0gPC0gdG90YWxfc3BlbmQgJT4lIGdyb3VwX2J5KE1hcml0YWxfU3RhdHVzKSAlPiUgc3VtbWFyaXNlKHRvdGFsX3Blcl9tc3RhdD1sZW5ndGgoTWFyaXRhbF9TdGF0dXMpLCBzcGVuZGluZ19wZXJfbXN0YXQ9c3VtKHRvdGFsc3BlbmQpLCBwZXJjZW50X3NwZW5kPWZvcm1hdEMoIHRvdGFsX3Blcl9tc3RhdC9zcGVuZGluZ19wZXJfbXN0YXQqMTAwKSkNCiAgdG90YWxfc3BlbmRfc3VtDQogIA0KICB0b3RhbF9zcGVuZF9zdW0gJT4lIGZpbHRlcihNYXJpdGFsX1N0YXR1cyE9IkFsb25lIiAmIE1hcml0YWxfU3RhdHVzIT0iWU9MTyIpICU+JSBnZ3Bsb3QoYWVzKE1hcml0YWxfU3RhdHVzLHBlcmNlbnRfc3BlbmQsIGZpbGw9InJlZCIpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdndGl0bGUoIlBlcmNlbnQgU3BlbmRpbmcgYnkgTWFyaXRhbCBTdGF0dXMiKQ0KYGBgDQpPdmVyYWxsLCB0aGUgTWFycmllZCBjYXRlZ29yeSBoYXMgdGhlIG1vc3QgaW4gc3BlbmRpbmcgd2hpY2ggaXMgbm90IHN1cnByaXNpbmcgZm9sbG93ZWQgYnkgdGhlIFNpbmdsZXMuIFdoaWxlIHRoZXkgbWF5IGhhdmUgZGlmZmVyZW50IHNwZW5kaW5nIHJlYXNvbnMgYXMgdGhlIE1hcnJpZWQgbWF5IGJlIGZvY3VzZWQgb24gbmVlZHMgYW5kIHNpbmdsZXMgb24gd2FudHMuIExldCdzIGZpbmQgb3V0IGFzIHdlIGJyZWFrIGRvd24gdGhlIEVzc2VudGlhbCBhbmQgTm9uIEVzc2VudGlhbCBzcGVuZGluZy4NCg0KDQoNCkVTU0VOVElBTCBWUyBOT04tRVNTRU5USUFMIFNQRU5ESU5HDQoNCldlIGhhdmUgc2l4IG1ham9yIGNhdGVnb3JpZXMgaW4gc3BlbmRpbmc6IFdpbmUsIFN3ZWV0cyAsIEZydWl0cywgTWVhdHMsIEZpc2ggYW5kIEdvbGQNCg0KRnJ1aXQsIE1lYXRzIGFuZCBGaXNoIGFyZSBjb25zaWRlcmVkIEVTU0VOVElBTFMgYW5kIHRoZSByZXN0IHdvdWxkIGJlIE5PTl9FU1NFTlRJQUxTLg0KYGBge3J9DQplc3NlbnRpYWxfY29tcCA8LSBob3VzZWhvbGQgJT4lIGdyb3VwX2J5KE1hcml0YWxfU3RhdHVzKSAlPiUgc3VtbWFyaXNlKEVzc2VudGlhbHM9IE1udEZydWl0cytNbnRNZWF0UHJvZHVjdHMrTW50RmlzaFByb2R1Y3RzLCBQZXJjZW50X0Vzc2VudGlhbD1hcy5udW1lcmljKGZvcm1hdEMobGVuZ3RoKE1hcml0YWxfU3RhdHVzKS9Fc3NlbnRpYWxzKjEwMCkpLCBOb25fZXNzZW50aWFsID1NbnRXaW5lcytNbnRTd2VldFByb2R1Y3RzK01udEdvbGRQcm9kcywgUGVyY2VudF9Ob25Fc3NlbnRpYWw9YXMubnVtZXJpYyhmb3JtYXRDKGxlbmd0aChNYXJpdGFsX1N0YXR1cykvTm9uX2Vzc2VudGlhbCoxMDApICkpDQoNCmVzc2VudGlhbF9jb21wX3N1bSA8LSBlc3NlbnRpYWxfY29tcCAlPiUgIGdyb3VwX2J5KE1hcml0YWxfU3RhdHVzKSAlPiUgIHN1bW1hcmlzZSh0b3RhbF9wZXJfbXN0YXQ9bGVuZ3RoKE1hcml0YWxfU3RhdHVzKSwgc3VtX0Vzc2VudGlhbD1zdW0oRXNzZW50aWFscyksIHBlcmNlbnRfRXNzZW50aWFsPXRvdGFsX3Blcl9tc3RhdC9zdW1fRXNzZW50aWFsKjEwMCwgc3VtX05vbkVzc2VudGlhbD1zdW0oTm9uX2Vzc2VudGlhbCksIHBlcmNlbnRfTm9uRXNzZW50aWFsPXRvdGFsX3Blcl9tc3RhdC9zdW1fTm9uRXNzZW50aWFsKjEwMCkNCmVzc2VudGlhbF9jb21wX3N1bQ0KYGBgDQoNCmBgYHtyfQ0KZXNzZW50aWFsX2NvbXBfc3VtICU+JWZpbHRlcihNYXJpdGFsX1N0YXR1cyE9IkFsb25lIiAmIE1hcml0YWxfU3RhdHVzIT0iWU9MTyIpICU+JSAgIGdncGxvdChhZXMoTWFyaXRhbF9TdGF0dXMscGVyY2VudF9Fc3NlbnRpYWwsIGZpbGw9InJlZCIpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdndGl0bGUoIlBlcmNlbnQgU3BlbmRpbmcgb24gRXNzZW50aWFsOiBGcnVpdHMsIEZpc2gsIE1lYXRzIikgKyB5bGltKDAsMC41KSANCg0KZXNzZW50aWFsX2NvbXBfc3VtICU+JSAgZmlsdGVyKE1hcml0YWxfU3RhdHVzIT0iQWxvbmUiICYgTWFyaXRhbF9TdGF0dXMhPSJZT0xPIikgJT4lIGdncGxvdChhZXMoTWFyaXRhbF9TdGF0dXMscGVyY2VudF9Ob25Fc3NlbnRpYWwpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdndGl0bGUoIlBlcmNlbnQgU3BlbmRpbmcgb24gTm9uIEVzc2VudGlhbDogV2luZSwgU3dlZXRzLE5vbi1mb29kIikgKyB5bGltKDAsMC41KQ0KYGBgDQpPdmVyYWxsIHRoZSBzcGVuZGluZyBmb3IgZXNzZW50aWFsIGl0ZW1zIGlzIGdyZWF0ZXIgY29tcGFyZWQgdG8gTm9uLWVzc2VudGlhbCBhcyBzZWVuIGluIHRoZSBwZXJjZW50IHNwZW5kaW5nIHJlZ2FyZGxlc3Mgb2YgTWFyaXRhbCBTdGF0dXMuIERpdm9yY2VkIGFuZCBNYXJyaWVkIGlzIHRvcHMgdGhlIHNwZW5kaW5nIGZvciBlc3NlbnRpYWwuDQoNCk5vbi1lc3NlbnRpYWwgc3BlbmRpbmcgaXMgbG93ZXIgYW5kIHNpbmdsZSBzdGF0dXMgdG9wcyB0aGUgZ3JvdXAgYnV0IG5vdCBieSBtdWNoLiANCg0KDQoNCklOQ09NRSB2cyBTUEVORElORw0KDQpJbiBoZXJlIHdlIHdpbGwgbG9vayBpbnRvIHRoZSByZWxhdGlvbnNoaXAgb2Ygb25lJ3MgaW5jb21lIHRvIGl0cyBzcGVuZGluZyBoYWJpdC4gV2Ugd2lsbCB1c2UgQ29ycmVsYXRpb24gdG8gZXZhbHVhdGUgaG93IHN0cm9uZyBvciB3ZWFrIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBJbmNvbWUgYW5kIHNwZW5kaW5nLg0KDQpUSGUgQ29ycmVsYXRpb24gY29lZmZpY2llbnQgaXMgdGhlIG1lYXN1cmUgb2YgaG93IHN0cm9uZyBvciB3ZWFrIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIHZhbHVlcyAoSW5jb21lIHZzIFNwZW5kaW5nKSBhbmQgaXQgaGFzIGEgdmFsdWUgYmV0d2VlbiAtMSB0byAxLg0KDQpBIGNvZWZmIGNsb3NlciB0byAxIG1lYW5zIGEgc3Ryb25nIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHZhbHVlcyBhbmQgYSBjb2VmZiBjbG9zZXIgdG8gMCBtZWFucyBhIHdlYWsgcmVsYXRpb25zaGlwDQoNCmBgYHtyfQ0KSW5jb21leFNwZW5kaW5nIDwtIGhvdXNlaG9sZCAlPiUgc3VtbWFyaXNlKGhvdXNlX2luY29tZT1JbmNvbWUsIHRvdGFsc3BlbmQ9TW50V2luZXMrTW50RnJ1aXRzK01udE1lYXRQcm9kdWN0cytNbnRGaXNoUHJvZHVjdHMrTW50U3dlZXRQcm9kdWN0cytNbnRHb2xkUHJvZHMpDQpoZWFkKEluY29tZXhTcGVuZGluZykNCg0KY29yKEluY29tZXhTcGVuZGluZyRob3VzZV9pbmNvbWUsSW5jb21leFNwZW5kaW5nJHRvdGFsc3BlbmQpDQoNCkluY29tZXhTcGVuZGluZyAlPiUgZmlsdGVyKGhvdXNlX2luY29tZTw2MDAwMDAgJiBob3VzZV9pbmNvbWU+MCkgJT4lICBnZ3Bsb3QoYWVzKGhvdXNlX2luY29tZSwgdG90YWxzcGVuZCkpICsNCmdlb21faml0dGVyKCkgKyBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMiIsIGxhYmVscz1zY2FsZXM6OmNvbW1hKSArIGdlb21fc21vb3RoKG1hdGhvZD0ibG0iKSArIHhsaW0oMCwxMDAwMDApICsgZ2d0aXRsZSgiT3ZlcmFsbCBTcGVuZGluZyB4IEluY29tZSBBbmFseXNpcyIpDQpgYGANClJJZ2h0IG9mZiB0aGUgYmF0IHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBpcyBsb3dlciBzcGVuZGluZyBvbiBJbmNvbWUgYXJlIGJlbG93IDUwMDAwIGFuZCBtb3JlIHNwZW5kaW5nIG9uIGhpZ2hlciBpbmNvbWUgcGFydGljaXBhbnRzLg0KDQoNCg0KYGBge3J9DQpJbmNvbWV4U3BlbmRpbmcgJT4lICBmaWx0ZXIoaG91c2VfaW5jb21lPjAgJiBob3VzZV9pbmNvbWU8NDAwMDApICU+JSAgZ2dwbG90KGFlcyhob3VzZV9pbmNvbWUsIHRvdGFsc3BlbmQpKSArIGdlb21fcG9pbnQoKSArIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cyIiwgbGFiZWxzPXNjYWxlczo6Y29tbWEpICsgZ2VvbV9zbW9vdGgobWF0aG9kPSJsbSIpICsgeGxpbSgwLDQwMDAwKSArIHlsaW0oMCwyNTAwKSArIGdndGl0bGUoIlNwZW5kaW5nIHggSW5jb21lIDwgNDAsMDAwIikNCmBgYA0KWm9vbWluZyBpbiwgd2Ugc2VlIHRoYXQgZm9yIEluY29tZSBvZiBsZXNzIHRoYW4gNDAwMDAsIHRoZXJlIGlzIHdheSBsZXNzIHNwZW5kaW5nIGFuZCB0aGVpciBkaXN0cmlidXRpb24gaXMgY29tcGFjdCBlcmdvIG11Y2ggbW9yZSBwYXJ0aWNpcGFudHMgYXJlIHNwZW5kaW5nIGxlc3MNCg0KYGBge3J9DQpJbmNvbWV4U3BlbmRpbmcgJT4lICBmaWx0ZXIoaG91c2VfaW5jb21lPjQwMDAxICYgaG91c2VfaW5jb21lPDEwMDAwMCkgJT4lICBnZ3Bsb3QoYWVzKGhvdXNlX2luY29tZSwgdG90YWxzcGVuZCkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWF0aG9kPSJsbSIpICArIHhsaW0oNDAwMDAsMTAwMDAwKSsgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzIiLCBsYWJlbHM9c2NhbGVzOjpjb21tYSkgKyBnZ3RpdGxlKCJTcGVuZGluZyB4IEluY29tZSA+IDUwLDAwMCIpDQpgYGANCkFuZCBmb3IgdGhvc2UgSW5jb21lIGdyZWF0ZXIgdGhhbiA0MDAwMCwgd2UgY2FuIHNlZSBhIG1vcmUgdXB3YXJkIHNwcmVhZC4gVGhlIGdyZWF0ZXIgdGhlIEluY29tZSwgdGhlIGdyZWF0ZXIgdGhlIHNwZW5kaW5nIA0KDQpgYGB7cn0NCkluY29tZWxlc3M1MGsgPC0gSW5jb21leFNwZW5kaW5nICU+JSAgZmlsdGVyKGhvdXNlX2luY29tZT4wICYgaG91c2VfaW5jb21lPDQwMDAwKSANCmNvcihJbmNvbWVsZXNzNTBrJGhvdXNlX2luY29tZSwgSW5jb21lbGVzczUwayR0b3RhbHNwZW5kKQ0KDQpJbmNvbWVncmVhdDUwayA8LSBJbmNvbWV4U3BlbmRpbmcgJT4lICBmaWx0ZXIoaG91c2VfaW5jb21lPjQwMDAxICYgaG91c2VfaW5jb21lPDEwMDAwMCkgDQpjb3IoSW5jb21lZ3JlYXQ1MGskaG91c2VfaW5jb21lLCBJbmNvbWVncmVhdDUwayR0b3RhbHNwZW5kKQ0KYGBgDQpDb21wdXRpbmcgZm9yIHRoZSBDb3JyZWxhdGlvbiBDb2VmZmljaWVudHMgZm9yIGJvdGggaW5jb21lPDQwMDAwIGFuZCBpbmNvbWU+NDAwMDAsIHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBpcyBhIHdlYWsgcmVsYXRpb25zaGlwIGZvciB0aG9zZSBiZWxvdyA0MGsgSW5jb21lLCBtZWFuaW5nIHRoZXJlIGlzIG5vdCBtdWNoIG9mIHNwZW5kaW5nIGhhcHBlbmluZyBmcm9tIHRoZW0gY29tcGFyZWQgdG8gdGhvc2UgaGlnaGVyIHRoYW4gNDBrIEluY29tZS4NCg0KTkVYVCBVUA0KTm93IHRoYXQgd2Uga25vdyB3aG8ncyBzcGVuZGluZyBtb3JlLCBsZXQncyBmaW5kIG91dCB3aGljaCBzcGVjaWZpYyBpdGVtIGNhdGVnb3J5IGlzIGJlaW5nIHNwZW50IGJ5IG91ciB0b3RhbCBwYXJ0aWNpcGFudHMgdG8gdmFsaWRhdGUgc3BlbmRpbmcgcHJpb3JpdGllcywgdGhpcyB3aWxsIGhhbHAgdXMgZm9jdXMgb3VyIG1hcmtldCB0YXJnZXRpbmcgYW5kIGFkdmVydGlzaW5nIGFzIGEgYnVzaW5lc3MgZW50aXR5LiANCg0KU1RBWSBUVU5FRCENCg0KDQpQcmVwYXJlZCBieSBEb2RnZWNhcmwgSW5jaWxhDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=