Stroke happens when a blockage or bleed of the blood vessels either interrupts or reduces the supply of blood to the brain.
Stroke is a leading cause of disability and death in the United States.
Objective: This analysis study aims to understand the nature of Stroke relative to the criteria included in the data. We hope to bring awareness to the reader, through this analysis, to reflect on one’s current health and lifestyle status and how close or preventive one is for a stroke incidence.
Data Retrieval and Structure
Path: https://www.kaggle.com/fedesoriano/stroke-prediction-dataset
stroke <- read.csv("stroke.csv")
str(stroke)
'data.frame': 5110 obs. of 12 variables:
$ id : int 9046 51676 31112 60182 1665 56669 53882 10434 27419 60491 ...
$ gender : chr "Male" "Female" "Male" "Female" ...
$ age : num 67 61 80 49 79 81 74 69 59 78 ...
$ hypertension : int 0 0 0 0 1 0 1 0 0 0 ...
$ heart_disease : int 1 0 1 0 0 0 1 0 0 0 ...
$ ever_married : chr "Yes" "Yes" "Yes" "Yes" ...
$ work_type : chr "Private" "Self-employed" "Private" "Private" ...
$ Residence_type : chr "Urban" "Rural" "Rural" "Urban" ...
$ avg_glucose_level: num 229 202 106 171 174 ...
$ bmi : chr "36.6" "N/A" "32.5" "34.4" ...
$ smoking_status : chr "formerly smoked" "never smoked" "never smoked" "smokes" ...
$ stroke : int 1 1 1 1 1 1 1 1 1 1 ...
‘data.frame’: 5110 obs. of 12 variables:
PARTICIPANTS: We have a total of 5110 Participants with 10 Criteria
Criteria Definition
- id: unique identifier
- gender: “Male”, “Female” or “Other”
- age: age of the patient
- hypertension: 0 if the patient doesn’t have hypertension, 1 if the patient has hypertension
- heart_disease: 0 if the patient doesn’t have any heart diseases, 1 if the patient has a heart disease
- ever_married: “No” or “Yes”
- work_type: “children”, “Govt_jov”, “Never_worked”, “Private” or “Self-employed”
- Residence_type: “Rural” or “Urban”
- avg_glucose_level: average glucose level in blood
- bmi: body mass index
- smoking_status: “formerly smoked”, “never smoked”, “smokes” or “Unknown”*
- stroke: 1 if the patient had a stroke or 0 if not
*Note: “Unknown” in smoking_status means that the information is unavailable for this patient
PARTICIPANTS BY GENDER
table(stroke$gender)
Female Male Other
2994 2115 1
There are more female participants over men or 58.59% and 41.39% respectively
Participant Demographic with Stroke
withstroke <- stroke %>% filter(stroke==1)
wostroke <- stroke %>% filter(stroke==0)
stat <- ifelse(stroke$stroke==1,"stroke","no stroke")
sum(stroke$stroke)
[1] 249
table(stroke$gender,stat)
stat
no stroke stroke
Female 2853 141
Male 2007 108
Other 1 0
Of all Participants, 249 are diagnosed with stroke or 4.9% of total participants.
Between gender, 141 for females and 108 on males have stroke or 4.9% and 5.4% respectively
Conclusion: By Gender - we have seen more stroke in men over women at 5.4% and 4.9% respectively. However it isn’t much of a difference to conclude that gender would be a huge factor in developing a stroke.
We will observe more on this analysis to which criteria, wether male or female, could potentially trigger a development of stroke.
Participant by Age
hist(stroke$age)

The distribution of our participants by Age is wide (0-80yo) which is quite a good criteria for the measure of common-ness of stroke incidence in age. Also, having sufficient freqeuncy (average of 200 participants) in each age range allow us to have a good sampling measure.
mean(stroke$age)
[1] 43.22661
Overall we have an average of 43.22yo amongst participants
Stroke Incidence by Age
withstroke %>% ggplot(aes(age, fill=gender)) + geom_density(alpha=0.2) + ggtitle("Stroke by Age in Male and Female")

In Conclusion, looking at the chart, Age plays a vital factor in the incidence of stroke. As age of the participants progresses so is the prevalence of stroke. Women tend to be prone at an earlier age while more men develop the illness over time.
Average Stroke Incidence by Age
mean(withstroke$age)
[1] 67.72819
STROKE AND HYPERTENSION
Hypertension also known as high or raised blood pressure, is a condition in which the blood vessels have persistently raised pressure. Hypertension could lead to stroke.
stat <- ifelse(stroke$stroke==1,"stroke","no stroke")
highblood <- ifelse(stroke$hypertension==1,"with hypertension","without hypertension")
table(highblood, stat)
stat
highblood no stroke stroke
with hypertension 432 66
without hypertension 4429 183
We have a total of 498 participants that are hypertensive or 9.8%.
And 66 of hypertensive participants developed stroke or 13.25%
On the other hand, we have 4612 participants without hypertension and 183 of them had a stroke or 3.97%
In conclusion, with hypertension, you get 3 times as much chance of developing stroke.
STROKE AND HEART DISEASE
stat <- ifelse(stroke$stroke==1,"stroke","no stroke")
heart.disease <- ifelse(stroke$heart_disease==1,"with heart disease","without heart disease")
table(heart.disease, stat)
stat
heart.disease no stroke stroke
with heart disease 229 47
without heart disease 4632 202
We have a total of 276 participants that have heart disease or 5.4% of overall participants,
47 of those or 17% have developed stroke.
While 4834 OF participants do not have heart disease yet 202 have developed stroke or 4.2%
In conclusion, with heart disease, you get 4 times as much chance of developing stroke.
WHAT IF: you have Hypertension and Heart disease at the same time?
sum(stroke$hypertension==1 & stroke$heart_disease==1)
[1] 64
Of all applicants, 64 have both hypertension and heart disease
sum(stroke$hypertension==1 & stroke$heart_disease==1 & stroke$stroke==1)
[1] 13
and 13 of those developed stroke or 20.31%
Overall, the risk of stroke is 6 times as high if you have both hypertension and heart disease.
Keep Track of your heart health to prevent stroke.
GLUCOSE LEVEL OF PARTICIPANTS
hist(stroke$avg_glucose_level)

mean(stroke$avg_glucose_level)
[1] 106.1477
The participants are normally distributed within the lower range or with a mean of 106.15 of glucose level
STROKE AND GLUCOSE LEVEL
withstroke %>% ggplot(aes(avg_glucose_level, fill=gender)) + geom_density(alpha=0.2) + ggtitle("Stroke and Glucose Level by Gender")

withstroke %>% ggplot(aes(age, avg_glucose_level, color=gender)) + geom_point() + ggtitle("Stroke and Glucose Level over Time")

More participants with lower glucose level developed stroke and mostly were women while the opposite spectrum of elevated glucose levels that developed the illness were men.
In conclusion, keeping one’s glucose level at normal level will decrease the chance of developing the illness over time.
BMI
bmi_ <- ifelse(stroke$bmi=="N/A",0,stroke$bmi)
bmi_ <- as.numeric(bmi_)
hist(bmi_)

mean(bmi_)
[1] 27.75673
The normal distribution of BMI from the participants are between 20-40 with a mean of 27.76.
The normal BMI is 24.
BMI AND STROKE
bmi_withstroke <- ifelse(withstroke$bmi=="N/A",0,withstroke$bmi)
bmi_withstroke <- as.numeric(bmi_withstroke)
hist(bmi_withstroke)

mean(bmi_withstroke)
[1] 25.57631
From the participants with stroke (249), the normal distribution of BMI is 25.57 concluding that even having close to a normal range of BMI, stroke can potentially develop.
Now, let’s Analyze the Lifestyle criteria and observe if these triggered a development of stroke to our participants
MARRIAGE
stroke %>% ggplot(aes(ever_married)) + geom_bar(width=0.2) + ggtitle("Marriage status All Participants")

Most of the participants are married.
MARRIAGE AND STROKE
ever.married <- stroke$ever_married
table(ever.married,stat)
stat
ever.married no stroke stroke
No 1728 29
Yes 3133 220
For the non-married only 29 participants developed stroke and 220 for the married.
The probability, for the non-married the development of the condition is 1.7% and for the married at 6.6%.
In summary for married individuals, one can get 4 times as much chance of developing stroke. Therefore, make your wife happy and everything will be alright. :)
RESIDENCE: Can your place or residence have a factor in developing stroke?
stroke %>% ggplot(aes(Residence_type)) + geom_bar(width=0.2) + ggtitle("Place of Residence All Participants")

Our participants have about the same number in place of residence, either rural or urban
RESIDENCE AND STROKE
reside <- stroke$Residence_type
table(reside, stat)
stat
reside no stroke stroke
Rural 2400 114
Urban 2461 135
Rural 4.53% Urban 5.20%
In conclusion, based on our sample, there is not much extreme difference in place of residence that would trigger a development of stroke. Whatever or wherever place you may be living, the potential exists almost as much.
WORK Most of the people have jobs. It is needed for survival. Can the same reason to survive lead us to develop a severe condition such as stroke? if so, which work type could it be? let’s find out.
stroke %>% ggplot(aes(work_type)) + geom_bar(width=0.2) + ggtitle("Work Type All Participants")

Majority of the participants are in the Private Sector.
WORK TYPE AND STROKE
work <- stroke$work_type
table( work, stat)
stat
work no stroke stroke
children 685 2
Govt_job 624 33
Never_worked 22 0
Private 2776 149
Self-employed 754 65
Statistically, the probability of developing a stroke by work:
Children 0.29% Gov_job 5.02% Never_worked 0% Private 5.09% Self-employed 7.94%
Based on participants data, those that never worked had 0 probability of developing stroke, whereas children had small a one. Both Government and Private work sectors have the same probability and the Self-employed have the highest probability.
What work type have you?
SMOKING
stroke %>% ggplot(aes(smoking_status)) + geom_bar(width=0.2) + ggtitle("Smoking All Participants")

Most of the total participants never smoked. Although there is a a lot of “unknown” data, the three statuses should be enough to determine individual probabilities.
smoke <- stroke$smoking_status
table( smoke, stat)
stat
smoke no stroke stroke
formerly smoked 815 70
never smoked 1802 90
smokes 747 42
Unknown 1497 47
Statistically, the probability of developing a stroke by Smoking:
formerly 7.91% never smoked 4.76% smokes 5.32% Unknown 3.04%%
Smoking, even if you have stopped already, increases the risk of stroke as the data tells us.
Overall Takeaway:
NOw that you have an overview analysis of the stroke indicators through this data, you can answer for yourself how close or preventive you are to developing stroke. We all want to prevent this event from developing as we progress through age, ang age is a huge factor in developing stroke as data suggests. If we remain in our current health and lifestyle conditions knowing it increases the risk, then at one point in time it may happen.
To keep the probability low, including other criteria in this analysis, one should make sure to minimize what could potentially increase the risk as one or more of these criteria combined (example hypertension + heart disease) the risk increases even higher.
One thing that we cannot control is Age. Everybody ages, but the rest of criteria in this data, we can. A better heart health, Not Smoking, Manage Stress, normalize BMI and the works will surely lower the risk of stroke in our lives.
May this analysis give you a data-driven decision to decide the health and lifestyle choices to consider towards the goal of stroke prevention.
Thank you.
#computing probabilities
percent <- function(){
a <- readline(prompt = "a: ")
b <- readline(prompt = "b: ")
a <- as.numeric(a)
b <- as.numeric(b)
c = (a/(a+b))*100
print(c)
}
LS0tDQp0aXRsZTogIlN0cm9rZSBBbmFseXNpcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClN0cm9rZSBoYXBwZW5zIHdoZW4gYSBibG9ja2FnZSBvciBibGVlZCBvZiB0aGUgYmxvb2QgdmVzc2VscyBlaXRoZXIgaW50ZXJydXB0cyBvciByZWR1Y2VzIHRoZSBzdXBwbHkgb2YgYmxvb2QgdG8gdGhlIGJyYWluLiANCiANClN0cm9rZSBpcyBhIGxlYWRpbmcgY2F1c2Ugb2YgZGlzYWJpbGl0eSBhbmQgZGVhdGggaW4gdGhlIFVuaXRlZCBTdGF0ZXMuDQogDQogDQogT2JqZWN0aXZlOiBUaGlzIGFuYWx5c2lzIHN0dWR5IGFpbXMgdG8gdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIFN0cm9rZSByZWxhdGl2ZSB0byB0aGUgY3JpdGVyaWEgaW5jbHVkZWQgaW4gdGhlIGRhdGEuIFdlIGhvcGUgdG8gYnJpbmcgYXdhcmVuZXNzIHRvIHRoZSByZWFkZXIsIHRocm91Z2ggdGhpcyBhbmFseXNpcywgdG8gcmVmbGVjdCBvbiBvbmUncyBjdXJyZW50IGhlYWx0aCBhbmQgbGlmZXN0eWxlIHN0YXR1cyBhbmQgaG93IGNsb3NlIG9yIHByZXZlbnRpdmUgb25lIGlzIGZvciBhIHN0cm9rZSBpbmNpZGVuY2UuIA0KDQpEYXRhIFJldHJpZXZhbCBhbmQgU3RydWN0dXJlDQoNCg0KUGF0aDogaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9mZWRlc29yaWFuby9zdHJva2UtcHJlZGljdGlvbi1kYXRhc2V0DQpgYGB7cn0NCnN0cm9rZSA8LSByZWFkLmNzdigic3Ryb2tlLmNzdiIpDQpzdHIoc3Ryb2tlKQ0KYGBgDQoNCidkYXRhLmZyYW1lJzoJNTExMCBvYnMuIG9mICAxMiB2YXJpYWJsZXM6DQoNClBBUlRJQ0lQQU5UUzogV2UgaGF2ZSBhIHRvdGFsIG9mIDUxMTAgUGFydGljaXBhbnRzIHdpdGggMTAgQ3JpdGVyaWENCg0KDQpDcml0ZXJpYSBEZWZpbml0aW9uDQoNCjEpIGlkOiB1bmlxdWUgaWRlbnRpZmllcg0KMikgZ2VuZGVyOiAiTWFsZSIsICJGZW1hbGUiIG9yICJPdGhlciINCjMpIGFnZTogYWdlIG9mIHRoZSBwYXRpZW50DQo0KSBoeXBlcnRlbnNpb246IDAgaWYgdGhlIHBhdGllbnQgZG9lc24ndCBoYXZlIGh5cGVydGVuc2lvbiwgMSBpZiB0aGUgcGF0aWVudCBoYXMgaHlwZXJ0ZW5zaW9uDQo1KSBoZWFydF9kaXNlYXNlOiAwIGlmIHRoZSBwYXRpZW50IGRvZXNuJ3QgaGF2ZSBhbnkgaGVhcnQgZGlzZWFzZXMsIDEgaWYgdGhlIHBhdGllbnQgaGFzIGEgaGVhcnQgZGlzZWFzZQ0KNikgZXZlcl9tYXJyaWVkOiAiTm8iIG9yICJZZXMiDQo3KSB3b3JrX3R5cGU6ICJjaGlsZHJlbiIsICJHb3Z0X2pvdiIsICJOZXZlcl93b3JrZWQiLCAiUHJpdmF0ZSIgb3IgIlNlbGYtZW1wbG95ZWQiDQo4KSBSZXNpZGVuY2VfdHlwZTogIlJ1cmFsIiBvciAiVXJiYW4iDQo5KSBhdmdfZ2x1Y29zZV9sZXZlbDogYXZlcmFnZSBnbHVjb3NlIGxldmVsIGluIGJsb29kDQoxMCkgYm1pOiBib2R5IG1hc3MgaW5kZXgNCjExKSBzbW9raW5nX3N0YXR1czogImZvcm1lcmx5IHNtb2tlZCIsICJuZXZlciBzbW9rZWQiLCAic21va2VzIiBvciAiVW5rbm93biIqDQoxMikgc3Ryb2tlOiAxIGlmIHRoZSBwYXRpZW50IGhhZCBhIHN0cm9rZSBvciAwIGlmIG5vdA0KDQoqTm90ZTogIlVua25vd24iIGluIHNtb2tpbmdfc3RhdHVzIG1lYW5zIHRoYXQgdGhlIGluZm9ybWF0aW9uIGlzIHVuYXZhaWxhYmxlIGZvciB0aGlzIHBhdGllbnQNCg0KDQoNClBBUlRJQ0lQQU5UUyBCWSBHRU5ERVINCmBgYHtyfQ0KdGFibGUoc3Ryb2tlJGdlbmRlcikNCmBgYA0KVGhlcmUgYXJlIG1vcmUgZmVtYWxlIHBhcnRpY2lwYW50cyBvdmVyIG1lbiBvciA1OC41OSUgYW5kIDQxLjM5JSByZXNwZWN0aXZlbHkNCg0KDQoNClBhcnRpY2lwYW50IERlbW9ncmFwaGljIHdpdGggU3Ryb2tlDQpgYGB7cn0NCndpdGhzdHJva2UgPC0gc3Ryb2tlICU+JSBmaWx0ZXIoc3Ryb2tlPT0xKQ0Kd29zdHJva2UgPC0gIHN0cm9rZSAlPiUgZmlsdGVyKHN0cm9rZT09MCkNCnN0YXQgPC0gaWZlbHNlKHN0cm9rZSRzdHJva2U9PTEsInN0cm9rZSIsIm5vIHN0cm9rZSIpDQpzdW0oc3Ryb2tlJHN0cm9rZSkNCnRhYmxlKHN0cm9rZSRnZW5kZXIsc3RhdCkNCmBgYA0KDQpPZiBhbGwgUGFydGljaXBhbnRzLCAyNDkgYXJlIGRpYWdub3NlZCB3aXRoIHN0cm9rZSBvciA0LjklIG9mIHRvdGFsIHBhcnRpY2lwYW50cy4NCg0KQmV0d2VlbiBnZW5kZXIsIDE0MSBmb3IgZmVtYWxlcyBhbmQgMTA4IG9uIG1hbGVzIGhhdmUgc3Ryb2tlIG9yIDQuOSUgYW5kIDUuNCUgcmVzcGVjdGl2ZWx5DQoNCkNvbmNsdXNpb246IEJ5IEdlbmRlciAtIHdlIGhhdmUgc2VlbiBtb3JlIHN0cm9rZSBpbiBtZW4gb3ZlciB3b21lbiBhdCA1LjQlIGFuZCA0LjklIHJlc3BlY3RpdmVseS4gSG93ZXZlciBpdCBpc24ndCBtdWNoIG9mIGEgZGlmZmVyZW5jZSB0byBjb25jbHVkZSB0aGF0IGdlbmRlciB3b3VsZCBiZSBhIGh1Z2UgZmFjdG9yIGluIGRldmVsb3BpbmcgYSBzdHJva2UuIA0KDQpXZSB3aWxsIG9ic2VydmUgbW9yZSBvbiB0aGlzIGFuYWx5c2lzIHRvIHdoaWNoIGNyaXRlcmlhLCB3ZXRoZXIgbWFsZSBvciBmZW1hbGUsIGNvdWxkIHBvdGVudGlhbGx5IHRyaWdnZXIgYSBkZXZlbG9wbWVudCBvZiBzdHJva2UuDQoNClBhcnRpY2lwYW50IGJ5IEFnZQ0KDQpgYGB7cn0NCmhpc3Qoc3Ryb2tlJGFnZSkNCmBgYA0KVGhlIGRpc3RyaWJ1dGlvbiBvZiBvdXIgcGFydGljaXBhbnRzIGJ5IEFnZSBpcyB3aWRlICgwLTgweW8pIHdoaWNoIGlzIHF1aXRlIGEgZ29vZCBjcml0ZXJpYSBmb3IgdGhlIG1lYXN1cmUgb2YgY29tbW9uLW5lc3Mgb2Ygc3Ryb2tlIGluY2lkZW5jZSBpbiBhZ2UuIEFsc28sIGhhdmluZyBzdWZmaWNpZW50IGZyZXFldW5jeSAoYXZlcmFnZSBvZiAyMDAgcGFydGljaXBhbnRzKSBpbiBlYWNoIGFnZSByYW5nZSBhbGxvdyB1cyB0byBoYXZlIGEgZ29vZCBzYW1wbGluZyBtZWFzdXJlLiANCg0KYGBge3J9DQptZWFuKHN0cm9rZSRhZ2UpDQpgYGANCk92ZXJhbGwgd2UgaGF2ZSBhbiBhdmVyYWdlIG9mIDQzLjIyeW8gYW1vbmdzdCBwYXJ0aWNpcGFudHMNCg0KDQpTdHJva2UgSW5jaWRlbmNlIGJ5IEFnZQ0KYGBge3J9DQp3aXRoc3Ryb2tlICU+JSBnZ3Bsb3QoYWVzKGFnZSwgZmlsbD1nZW5kZXIpKSArIGdlb21fZGVuc2l0eShhbHBoYT0wLjIpICsgZ2d0aXRsZSgiU3Ryb2tlIGJ5IEFnZSBpbiBNYWxlIGFuZCBGZW1hbGUiKQ0KDQpgYGANCkluIENvbmNsdXNpb24sIGxvb2tpbmcgYXQgdGhlIGNoYXJ0LCBBZ2UgcGxheXMgYSB2aXRhbCBmYWN0b3IgaW4gdGhlIGluY2lkZW5jZSBvZiBzdHJva2UuIEFzIGFnZSBvZiB0aGUgcGFydGljaXBhbnRzIHByb2dyZXNzZXMgc28gaXMgdGhlIHByZXZhbGVuY2Ugb2Ygc3Ryb2tlLiBXb21lbiB0ZW5kIHRvIGJlIHByb25lIGF0IGFuIGVhcmxpZXIgYWdlIHdoaWxlIG1vcmUgbWVuIGRldmVsb3AgdGhlIGlsbG5lc3Mgb3ZlciB0aW1lLg0KDQoNCkF2ZXJhZ2UgU3Ryb2tlIEluY2lkZW5jZSBieSBBZ2UNCmBgYHtyfQ0KbWVhbih3aXRoc3Ryb2tlJGFnZSkNCmBgYA0KDQoNCg0KU1RST0tFIEFORCBIWVBFUlRFTlNJT04NCg0KSHlwZXJ0ZW5zaW9uDQphbHNvIGtub3duIGFzIGhpZ2ggb3IgcmFpc2VkIGJsb29kIHByZXNzdXJlLCBpcyBhIGNvbmRpdGlvbiBpbiB3aGljaCB0aGUgYmxvb2QgdmVzc2VscyBoYXZlIHBlcnNpc3RlbnRseSByYWlzZWQgcHJlc3N1cmUuIEh5cGVydGVuc2lvbiBjb3VsZCBsZWFkIHRvIHN0cm9rZS4NCmBgYHtyfQ0Kc3RhdCA8LSBpZmVsc2Uoc3Ryb2tlJHN0cm9rZT09MSwic3Ryb2tlIiwibm8gc3Ryb2tlIikNCmhpZ2hibG9vZCA8LSBpZmVsc2Uoc3Ryb2tlJGh5cGVydGVuc2lvbj09MSwid2l0aCBoeXBlcnRlbnNpb24iLCJ3aXRob3V0IGh5cGVydGVuc2lvbiIpDQp0YWJsZShoaWdoYmxvb2QsIHN0YXQpDQpgYGANCldlIGhhdmUgYSB0b3RhbCBvZiA0OTggcGFydGljaXBhbnRzIHRoYXQgYXJlIGh5cGVydGVuc2l2ZSBvciA5LjglLg0KDQogQW5kIDY2IG9mIGh5cGVydGVuc2l2ZSBwYXJ0aWNpcGFudHMgZGV2ZWxvcGVkIHN0cm9rZSBvciAxMy4yNSUgDQoNCk9uIHRoZSBvdGhlciBoYW5kLCB3ZSBoYXZlIDQ2MTIgcGFydGljaXBhbnRzIHdpdGhvdXQgaHlwZXJ0ZW5zaW9uIGFuZCAxODMgb2YgdGhlbSBoYWQgYSBzdHJva2Ugb3IgMy45NyUNCg0KSW4gY29uY2x1c2lvbiwgd2l0aCBoeXBlcnRlbnNpb24sIHlvdSBnZXQgMyB0aW1lcyBhcyBtdWNoIGNoYW5jZSBvZiBkZXZlbG9waW5nIHN0cm9rZS4gDQoNCg0KDQpTVFJPS0UgQU5EIEhFQVJUIERJU0VBU0UNCmBgYHtyfQ0Kc3RhdCA8LSBpZmVsc2Uoc3Ryb2tlJHN0cm9rZT09MSwic3Ryb2tlIiwibm8gc3Ryb2tlIikNCmhlYXJ0LmRpc2Vhc2UgPC0gaWZlbHNlKHN0cm9rZSRoZWFydF9kaXNlYXNlPT0xLCJ3aXRoIGhlYXJ0IGRpc2Vhc2UiLCJ3aXRob3V0IGhlYXJ0IGRpc2Vhc2UiKQ0KdGFibGUoaGVhcnQuZGlzZWFzZSwgc3RhdCkNCmBgYA0KV2UgaGF2ZSBhIHRvdGFsIG9mIDI3NiBwYXJ0aWNpcGFudHMgdGhhdCBoYXZlIGhlYXJ0IGRpc2Vhc2Ugb3IgNS40JSBvZiBvdmVyYWxsIHBhcnRpY2lwYW50cywgDQoNCjQ3IG9mIHRob3NlIG9yIDE3JSBoYXZlIGRldmVsb3BlZCBzdHJva2UuDQoNCldoaWxlIDQ4MzQgT0YgcGFydGljaXBhbnRzIGRvIG5vdCBoYXZlIGhlYXJ0IGRpc2Vhc2UgeWV0IDIwMiBoYXZlIGRldmVsb3BlZCBzdHJva2Ugb3IgNC4yJQ0KDQpJbiBjb25jbHVzaW9uLCB3aXRoIGhlYXJ0IGRpc2Vhc2UsIHlvdSBnZXQgNCB0aW1lcyBhcyBtdWNoIGNoYW5jZSBvZiBkZXZlbG9waW5nIHN0cm9rZS4NCg0KDQpXSEFUIElGOiB5b3UgaGF2ZSBIeXBlcnRlbnNpb24gYW5kIEhlYXJ0IGRpc2Vhc2UgYXQgdGhlIHNhbWUgdGltZT8NCmBgYHtyfQ0Kc3VtKHN0cm9rZSRoeXBlcnRlbnNpb249PTEgJiBzdHJva2UkaGVhcnRfZGlzZWFzZT09MSkNCmBgYA0KT2YgYWxsIGFwcGxpY2FudHMsIDY0IGhhdmUgYm90aCBoeXBlcnRlbnNpb24gYW5kIGhlYXJ0IGRpc2Vhc2UNCmBgYHtyfQ0Kc3VtKHN0cm9rZSRoeXBlcnRlbnNpb249PTEgJiBzdHJva2UkaGVhcnRfZGlzZWFzZT09MSAmIHN0cm9rZSRzdHJva2U9PTEpDQpgYGANCmFuZCAxMyBvZiB0aG9zZSBkZXZlbG9wZWQgc3Ryb2tlIG9yIDIwLjMxJQ0KDQpPdmVyYWxsLCB0aGUgcmlzayBvZiBzdHJva2UgaXMgNiB0aW1lcyBhcyBoaWdoIGlmIHlvdSBoYXZlIGJvdGggaHlwZXJ0ZW5zaW9uIGFuZCBoZWFydCBkaXNlYXNlLg0KDQpLZWVwIFRyYWNrIG9mIHlvdXIgaGVhcnQgaGVhbHRoIHRvIHByZXZlbnQgc3Ryb2tlLg0KDQoNCkdMVUNPU0UgTEVWRUwgT0YgUEFSVElDSVBBTlRTDQpgYGB7cn0NCmhpc3Qoc3Ryb2tlJGF2Z19nbHVjb3NlX2xldmVsKQ0KYGBgDQpgYGB7cn0NCm1lYW4oc3Ryb2tlJGF2Z19nbHVjb3NlX2xldmVsKQ0KYGBgDQpUaGUgcGFydGljaXBhbnRzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCB3aXRoaW4gdGhlIGxvd2VyIHJhbmdlIG9yIHdpdGggYSBtZWFuIG9mIDEwNi4xNSBvZiBnbHVjb3NlIGxldmVsDQoNCg0KU1RST0tFIEFORCBHTFVDT1NFIExFVkVMDQpgYGB7cn0NCndpdGhzdHJva2UgJT4lIGdncGxvdChhZXMoYXZnX2dsdWNvc2VfbGV2ZWwsIGZpbGw9Z2VuZGVyKSkgKyBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArIGdndGl0bGUoIlN0cm9rZSBhbmQgR2x1Y29zZSBMZXZlbCBieSBHZW5kZXIiKQ0KDQp3aXRoc3Ryb2tlICU+JSBnZ3Bsb3QoYWVzKGFnZSwgYXZnX2dsdWNvc2VfbGV2ZWwsIGNvbG9yPWdlbmRlcikpICsgZ2VvbV9wb2ludCgpICsgZ2d0aXRsZSgiU3Ryb2tlIGFuZCBHbHVjb3NlIExldmVsIG92ZXIgVGltZSIpDQoNCmBgYA0KTW9yZSBwYXJ0aWNpcGFudHMgd2l0aCBsb3dlciBnbHVjb3NlIGxldmVsIGRldmVsb3BlZCBzdHJva2UgYW5kIG1vc3RseSB3ZXJlIHdvbWVuIHdoaWxlIHRoZSBvcHBvc2l0ZSBzcGVjdHJ1bSBvZiBlbGV2YXRlZCBnbHVjb3NlIGxldmVscyB0aGF0IGRldmVsb3BlZCB0aGUgaWxsbmVzcyB3ZXJlIG1lbi4NCg0KSW4gY29uY2x1c2lvbiwga2VlcGluZyBvbmUncyBnbHVjb3NlIGxldmVsIGF0IG5vcm1hbCBsZXZlbCB3aWxsIGRlY3JlYXNlIHRoZSBjaGFuY2Ugb2YgZGV2ZWxvcGluZyB0aGUgaWxsbmVzcyBvdmVyIHRpbWUuDQoNCg0KQk1JDQpgYGB7cn0NCmJtaV8gPC0gaWZlbHNlKHN0cm9rZSRibWk9PSJOL0EiLDAsc3Ryb2tlJGJtaSkNCmJtaV8gPC0gYXMubnVtZXJpYyhibWlfKQ0KaGlzdChibWlfKQ0KYGBgDQpgYGB7cn0NCm1lYW4oYm1pXykNCmBgYA0KVGhlIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgQk1JIGZyb20gdGhlIHBhcnRpY2lwYW50cyBhcmUgYmV0d2VlbiAyMC00MCB3aXRoIGEgbWVhbiBvZiAyNy43Ni4NCg0KVGhlIG5vcm1hbCBCTUkgaXMgMjQuDQoNCg0KQk1JIEFORCBTVFJPS0UNCmBgYHtyfQ0KYm1pX3dpdGhzdHJva2UgPC0gaWZlbHNlKHdpdGhzdHJva2UkYm1pPT0iTi9BIiwwLHdpdGhzdHJva2UkYm1pKQ0KYm1pX3dpdGhzdHJva2UgPC0gYXMubnVtZXJpYyhibWlfd2l0aHN0cm9rZSkNCmhpc3QoYm1pX3dpdGhzdHJva2UpDQpgYGANCmBgYHtyfQ0KbWVhbihibWlfd2l0aHN0cm9rZSkNCmBgYA0KRnJvbSB0aGUgcGFydGljaXBhbnRzIHdpdGggc3Ryb2tlICgyNDkpLCB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiBCTUkgaXMgMjUuNTcgY29uY2x1ZGluZyB0aGF0IGV2ZW4gaGF2aW5nIGNsb3NlIHRvIGEgbm9ybWFsIHJhbmdlIG9mIEJNSSwgc3Ryb2tlIGNhbiBwb3RlbnRpYWxseSBkZXZlbG9wLg0KDQoNCk5vdywgbGV0J3MgQW5hbHl6ZSB0aGUgTGlmZXN0eWxlIGNyaXRlcmlhIGFuZCBvYnNlcnZlIGlmIHRoZXNlICB0cmlnZ2VyZWQgYSBkZXZlbG9wbWVudCBvZiBzdHJva2UgdG8gb3VyIHBhcnRpY2lwYW50cw0KDQpNQVJSSUFHRQ0KYGBge3J9DQpzdHJva2UgJT4lIGdncGxvdChhZXMoZXZlcl9tYXJyaWVkKSkgKyBnZW9tX2Jhcih3aWR0aD0wLjIpICsgZ2d0aXRsZSgiTWFycmlhZ2Ugc3RhdHVzIEFsbCBQYXJ0aWNpcGFudHMiKQ0KYGBgDQpNb3N0IG9mIHRoZSBwYXJ0aWNpcGFudHMgYXJlIG1hcnJpZWQuDQoNCg0KTUFSUklBR0UgQU5EIFNUUk9LRQ0KYGBge3J9DQpldmVyLm1hcnJpZWQgPC0gc3Ryb2tlJGV2ZXJfbWFycmllZA0KdGFibGUoZXZlci5tYXJyaWVkLHN0YXQpDQpgYGANCkZvciB0aGUgbm9uLW1hcnJpZWQgb25seSAyOSBwYXJ0aWNpcGFudHMgZGV2ZWxvcGVkIHN0cm9rZSBhbmQgMjIwIGZvciB0aGUgbWFycmllZC4gDQoNClRoZSBwcm9iYWJpbGl0eSwgZm9yIHRoZSBub24tbWFycmllZCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIGNvbmRpdGlvbiBpcyAxLjclIGFuZCBmb3IgdGhlIG1hcnJpZWQgYXQgNi42JS4NCg0KSW4gc3VtbWFyeSBmb3IgbWFycmllZCBpbmRpdmlkdWFscywgb25lIGNhbiBnZXQgNCB0aW1lcyBhcyBtdWNoIGNoYW5jZSBvZiBkZXZlbG9waW5nIHN0cm9rZS4gVGhlcmVmb3JlLCBtYWtlIHlvdXIgd2lmZSBoYXBweSBhbmQgZXZlcnl0aGluZyB3aWxsIGJlIGFscmlnaHQuIDopDQoNCg0KUkVTSURFTkNFOiBDYW4geW91ciBwbGFjZSBvciByZXNpZGVuY2UgaGF2ZSBhIGZhY3RvciBpbiBkZXZlbG9waW5nIHN0cm9rZT8NCmBgYHtyfQ0Kc3Ryb2tlICU+JSBnZ3Bsb3QoYWVzKFJlc2lkZW5jZV90eXBlKSkgKyBnZW9tX2Jhcih3aWR0aD0wLjIpICsgZ2d0aXRsZSgiUGxhY2Ugb2YgUmVzaWRlbmNlIEFsbCBQYXJ0aWNpcGFudHMiKQ0KYGBgDQpPdXIgcGFydGljaXBhbnRzIGhhdmUgYWJvdXQgdGhlIHNhbWUgbnVtYmVyIGluIHBsYWNlIG9mIHJlc2lkZW5jZSwgZWl0aGVyIHJ1cmFsIG9yIHVyYmFuDQoNClJFU0lERU5DRSBBTkQgU1RST0tFDQpgYGB7cn0NCnJlc2lkZSA8LSBzdHJva2UkUmVzaWRlbmNlX3R5cGUNCnRhYmxlKHJlc2lkZSwgc3RhdCkNCmBgYA0KDQpSdXJhbCAgIDQuNTMlDQpVcmJhbiAgIDUuMjAlDQoNCkluIGNvbmNsdXNpb24sIGJhc2VkIG9uIG91ciBzYW1wbGUsIHRoZXJlIGlzIG5vdCBtdWNoIGV4dHJlbWUgZGlmZmVyZW5jZSBpbiBwbGFjZSBvZiByZXNpZGVuY2UgdGhhdCB3b3VsZCB0cmlnZ2VyIGEgZGV2ZWxvcG1lbnQgb2Ygc3Ryb2tlLiBXaGF0ZXZlciBvciB3aGVyZXZlciBwbGFjZSB5b3UgbWF5IGJlIGxpdmluZywgdGhlIHBvdGVudGlhbCBleGlzdHMgYWxtb3N0IGFzIG11Y2guDQoNCg0KV09SSw0KTW9zdCBvZiB0aGUgcGVvcGxlIGhhdmUgam9icy4gSXQgaXMgbmVlZGVkIGZvciBzdXJ2aXZhbC4gQ2FuIHRoZSBzYW1lIHJlYXNvbiB0byBzdXJ2aXZlIGxlYWQgdXMgdG8gZGV2ZWxvcCBhIHNldmVyZSBjb25kaXRpb24gc3VjaCBhcyBzdHJva2U/IGlmIHNvLCB3aGljaCB3b3JrIHR5cGUgY291bGQgaXQgYmU/IGxldCdzIGZpbmQgb3V0LiANCmBgYHtyfQ0Kc3Ryb2tlICU+JSBnZ3Bsb3QoYWVzKHdvcmtfdHlwZSkpICsgZ2VvbV9iYXIod2lkdGg9MC4yKSArIGdndGl0bGUoIldvcmsgVHlwZSBBbGwgUGFydGljaXBhbnRzIikNCmBgYA0KTWFqb3JpdHkgb2YgdGhlIHBhcnRpY2lwYW50cyBhcmUgaW4gdGhlIFByaXZhdGUgU2VjdG9yLiANCg0KDQpXT1JLIFRZUEUgQU5EIFNUUk9LRQ0KYGBge3J9DQp3b3JrIDwtIHN0cm9rZSR3b3JrX3R5cGUNCnRhYmxlKCB3b3JrLCBzdGF0KQ0KYGBgDQpTdGF0aXN0aWNhbGx5LCB0aGUgcHJvYmFiaWxpdHkgb2YgZGV2ZWxvcGluZyBhIHN0cm9rZSBieSB3b3JrOg0KDQpDaGlsZHJlbiAgICAgICAgMC4yOSUNCkdvdl9qb2IgICAgICAgICA1LjAyJQ0KTmV2ZXJfd29ya2VkICAgIDAlDQpQcml2YXRlICAgICAgICAgNS4wOSUNClNlbGYtZW1wbG95ZWQgICA3Ljk0JQ0KDQpCYXNlZCBvbiBwYXJ0aWNpcGFudHMgZGF0YSwgdGhvc2UgdGhhdCBuZXZlciB3b3JrZWQgaGFkIDAgcHJvYmFiaWxpdHkgb2YgZGV2ZWxvcGluZyBzdHJva2UsIHdoZXJlYXMgY2hpbGRyZW4gaGFkIHNtYWxsIGEgb25lLiBCb3RoIEdvdmVybm1lbnQgYW5kIFByaXZhdGUgd29yayBzZWN0b3JzIGhhdmUgdGhlIHNhbWUgcHJvYmFiaWxpdHkgYW5kIHRoZSBTZWxmLWVtcGxveWVkIGhhdmUgdGhlIGhpZ2hlc3QgcHJvYmFiaWxpdHkuDQoNCldoYXQgd29yayB0eXBlIGhhdmUgeW91PyANCg0KU01PS0lORw0KYGBge3J9DQpzdHJva2UgJT4lIGdncGxvdChhZXMoc21va2luZ19zdGF0dXMpKSArIGdlb21fYmFyKHdpZHRoPTAuMikgKyBnZ3RpdGxlKCJTbW9raW5nIEFsbCBQYXJ0aWNpcGFudHMiKQ0KYGBgDQpNb3N0IG9mIHRoZSB0b3RhbCBwYXJ0aWNpcGFudHMgbmV2ZXIgc21va2VkLiBBbHRob3VnaCB0aGVyZSBpcyBhIGEgbG90IG9mICJ1bmtub3duIiBkYXRhLCB0aGUgdGhyZWUgc3RhdHVzZXMgc2hvdWxkIGJlIGVub3VnaCB0byAgZGV0ZXJtaW5lIGluZGl2aWR1YWwgcHJvYmFiaWxpdGllcy4NCmBgYHtyfQ0Kc21va2UgPC0gc3Ryb2tlJHNtb2tpbmdfc3RhdHVzDQp0YWJsZSggc21va2UsIHN0YXQpDQpgYGANClN0YXRpc3RpY2FsbHksIHRoZSBwcm9iYWJpbGl0eSBvZiBkZXZlbG9waW5nIGEgc3Ryb2tlIGJ5IFNtb2tpbmc6DQoNCmZvcm1lcmx5ICAgICAgICA3LjkxJQ0KbmV2ZXIgc21va2VkICAgIDQuNzYlDQpzbW9rZXMgICAgICAgICAgNS4zMiUNClVua25vd24gICAgICAgICAzLjA0JSUNCg0KU21va2luZywgZXZlbiBpZiB5b3UgaGF2ZSBzdG9wcGVkIGFscmVhZHksIGluY3JlYXNlcyB0aGUgcmlzayBvZiBzdHJva2UgYXMgdGhlIGRhdGEgdGVsbHMgdXMuIA0KDQoNCg0KT3ZlcmFsbCBUYWtlYXdheTogDQoNCk5PdyB0aGF0IHlvdSBoYXZlIGFuIG92ZXJ2aWV3IGFuYWx5c2lzIG9mIHRoZSBzdHJva2UgaW5kaWNhdG9ycyB0aHJvdWdoIHRoaXMgZGF0YSwgeW91IGNhbiBhbnN3ZXIgZm9yIHlvdXJzZWxmIGhvdyBjbG9zZSBvciBwcmV2ZW50aXZlIHlvdSBhcmUgdG8gZGV2ZWxvcGluZyBzdHJva2UuIFdlIGFsbCB3YW50IHRvIHByZXZlbnQgdGhpcyBldmVudCBmcm9tIGRldmVsb3BpbmcgYXMgd2UgcHJvZ3Jlc3MgdGhyb3VnaCBhZ2UsIGFuZyBhZ2UgaXMgYSBodWdlIGZhY3RvciBpbiBkZXZlbG9waW5nIHN0cm9rZSBhcyBkYXRhIHN1Z2dlc3RzLiBJZiB3ZSByZW1haW4gaW4gb3VyIGN1cnJlbnQgaGVhbHRoIGFuZCBsaWZlc3R5bGUgY29uZGl0aW9ucyBrbm93aW5nIGl0IGluY3JlYXNlcyB0aGUgcmlzaywgdGhlbiBhdCBvbmUgcG9pbnQgaW4gdGltZSBpdCBtYXkgaGFwcGVuLiAgDQoNClRvIGtlZXAgdGhlIHByb2JhYmlsaXR5IGxvdywgaW5jbHVkaW5nIG90aGVyIGNyaXRlcmlhIGluIHRoaXMgYW5hbHlzaXMsIG9uZSBzaG91bGQgbWFrZSBzdXJlIHRvIG1pbmltaXplIHdoYXQgY291bGQgcG90ZW50aWFsbHkgaW5jcmVhc2UgdGhlIHJpc2sgYXMgb25lIG9yIG1vcmUgb2YgdGhlc2UgY3JpdGVyaWEgY29tYmluZWQgKGV4YW1wbGUgaHlwZXJ0ZW5zaW9uICsgaGVhcnQgZGlzZWFzZSkgdGhlIHJpc2sgaW5jcmVhc2VzIGV2ZW4gaGlnaGVyLg0KDQpPbmUgdGhpbmcgdGhhdCB3ZSBjYW5ub3QgY29udHJvbCBpcyBBZ2UuIEV2ZXJ5Ym9keSBhZ2VzLCBidXQgdGhlIHJlc3Qgb2YgY3JpdGVyaWEgaW4gdGhpcyBkYXRhLCB3ZSBjYW4uIEEgYmV0dGVyIGhlYXJ0IGhlYWx0aCwgTm90IFNtb2tpbmcsIE1hbmFnZSBTdHJlc3MsIG5vcm1hbGl6ZSBCTUkgYW5kIHRoZSB3b3JrcyB3aWxsIHN1cmVseSBsb3dlciB0aGUgcmlzayBvZiBzdHJva2UgaW4gb3VyIGxpdmVzLg0KDQoNCk1heSB0aGlzIGFuYWx5c2lzIGdpdmUgeW91IGEgZGF0YS1kcml2ZW4gZGVjaXNpb24gdG8gZGVjaWRlIHRoZSBoZWFsdGggYW5kIGxpZmVzdHlsZSBjaG9pY2VzIHRvIGNvbnNpZGVyIHRvd2FyZHMgdGhlIGdvYWwgb2Ygc3Ryb2tlIHByZXZlbnRpb24uIA0KDQpUaGFuayB5b3UuDQoNCg0KDQojY29tcHV0aW5nIHByb2JhYmlsaXRpZXMNCmBgYHtyfQ0KcGVyY2VudCA8LSBmdW5jdGlvbigpew0KICBhIDwtIHJlYWRsaW5lKHByb21wdCA9ICJhOiAiKQ0KICBiIDwtIHJlYWRsaW5lKHByb21wdCA9ICJiOiAiKQ0KICBhIDwtIGFzLm51bWVyaWMoYSkNCiAgYiA8LSBhcy5udW1lcmljKGIpDQogIGMgPSAoYS8oYStiKSkqMTAwDQogIHByaW50KGMpDQp9DQpgYGANCg0KDQoNCg0K