library(tidyverse)
library(reshape2)
library(janitor)
library(readxl)
library(countrycode)
library(scales)
library(hrbrthemes)
library(ggrepel)
library(ggpmisc)
I queried and downloaded data from WHO’s
Global Health Expenditure database and World
Bank International Comparison Project. The WHO provides current
health expenditure (HCE) estimates in local currency units and as a
share of GDP. I download them both as a cross-check just in case there
are any major discrepancies in currency units quoted by WHO versus the
local currency units provided by the ICP for AIC and GDP.
# from WHO, import SHA current health expenditures in millions of local currency units
# and as share of GDP. These can be used to cross-check the results just
# in case there's any issue with the currency the figures are denominated.
sha_health=read_xlsx(
"NHA indicators.xlsx",
skip=2,
col_names = c("country","indicator","units",sprintf("%d",2000:2019))
) %>%
mutate(
type=case_when(
str_detect(indicator,"as %") ~ 'pct_gdp',
str_detect(indicator,"^Gross Domestic Product") ~ 'gdp_lcu',
T ~ 'hce_lcu'
)
) %>%
select( -indicator,-units) %>%
melt(id.vars= c("country","type")) %>%
mutate(
year=as.integer(as.character(variable))
) %>%
dcast(country+year~type) %>%
mutate(
country_code=countrycode(country,'country.name','iso3c'),
country_code=coalesce(country_code,ifelse(country=='Türkiye','TUR',NA)), # fix turkey's country code
hce_lcu=hce_lcu/1000, # billions
gdp_lcu=gdp_lcu/1000 # billions
) %>%
rename( who_country = country )
# From WorldBank International Comparison Project
# Import AIC and GDP in PPP adjusted per capita and as aggregates of local currency units
icpraw=read_csv("icp_2011_through_2017.csv",show_col_types =F) %>%
clean_names() %>%
mutate(
wb_country=country_name,
country_code,
series=ifelse(str_detect(series_name,'ACTUAL INDIVIDUAL CONSUMPTION'),'AIC','GDP'),
variable=sprintf("%s_%s",series,classification_code),
year=as.integer(time)
) %>%
filter(
!is.na(value),
!is.na(country_code)
) %>%
dcast(country_code+wb_country+year~variable,value.var='value') %>%
clean_names()
icp_sha=merge(sha_health,icpraw,by=c('year','country_code'),all=T) %>%
mutate(
hce_share_aic=hce_lcu/aic_cn, # share of AIC (LCU over LCU)
hce_share_gdp=hce_lcu/gdp_cn, # share of GDP (LCU over LCU)
hce_pc=hce_share_aic*aic_pcap_pp, # per capita at PPPs for AIC
hce_lcu_alt=gdp_cn * ( pct_gdp / 100 ), # calculate from WHO's quoted HCE/GDP and WorldBank's GDP in LCU
hce_share_aic_alt = hce_lcu_alt / aic_cn, # share of AIC, alternate
hce_pc_alt = hce_share_aic_alt * aic_pcap_pp
)
icp_sha %>%
filter(
year==2017
) %>%
ggplot(aes(hce_share_aic,hce_share_aic_alt)) +
geom_abline(slope=1) +
geom_point(size=2,color='purple',alpha=0.6) +
theme_ipsum() +
geom_text_repel(aes(label=country_code)) +
labs(
title='Comparing two different methods of calculating SHA health spending',
y='Health share, numerator derived from WHO\'s estimated GDP share',
x='Health share, numerator derived from WHO\'s estimated expenditures in LCU'
) +
stat_poly_eq(size=6) +
scale_y_percent() +
scale_x_percent()

NA
myform <- y ~ poly(x, 2, raw = TRUE)
icp_sha %>%
filter(
year==2017,
aic_pcap_pp > 12000
) %>%
ggplot(aes(aic_pcap_pp,hce_share_aic)) +
geom_point(size=3,color='purple',alpha=0.6) +
theme_ipsum() +
theme(
panel.grid.minor = element_blank()
) +
geom_text_repel(aes(label=country_code),color='gray') +
scale_y_percent(breaks=seq(0,1,.02)) +
scale_x_continuous(breaks=seq(0,1e5,5000),label=scales::dollar_format()) +
geom_smooth(method=lm,formula='y~poly(x,2)',fullrange=F,se=T) +
stat_poly_eq(formula=myform,size=6) +
labs(
title='The health share of consumption rises rapidly with income',
x='2017 Actual Individual Consumption per capita',
y='2017 Current health expenditures as share of consumption (AIC)',
caption=paste(
'source: World Health Organization Global Health Expenditure database',
'and World Bank International Comparison Project',
sep='\n'
)
) +
coord_cartesian(expand=T)

NA
NA
icp_sha %>%
filter(
year==2017,
aic_pcap_pp > 15000
) %>%
ggplot(aes(aic_pcap_pp,hce_pc)) +
geom_point(size=2,color='purple',alpha=0.6) +
theme_ipsum() +
theme(
panel.grid.minor = element_blank()
) +
geom_text_repel(aes(label=country_code)) +
scale_x_log10(
label=scales::dollar_format(accuracy=1),
breaks=seq(0,50000,5000),
sec.axis=sec_axis(
~log(.),
breaks=seq(0,20,.1),
name='log AIC/person'
)
) +
scale_y_log10(
label=scales::dollar_format(accuracy=1),
breaks=seq(0,50000,1000),
sec.axis=sec_axis(
~log(.),
breaks=seq(0,20,.1),
name='log hce/person'
)
) +
geom_smooth(method=lm,formula=y~x) +
stat_poly_eq(aes(label = paste(stat(eq.label),
stat(rr.label), sep = "~~~~")),
formula = y ~ x, rr.digits = 2, coef.digits = 3,size=6,
parse = TRUE) +
labs(
title='The health share of consumption rises rapidly with income',
x='Actual Individual Consumption per capita',
y='Current health expenditures per capita at PPPs for AIC'
) +
coord_cartesian(expand=T)

icp_sha %>%
filter(
year==2017,
!country_code %in% c('MRT'), # Mauritania is probably an error and just clutters this
T
) %>%
ggplot(aes(log(aic_pcap_pp),log(hce_pc) )) +
geom_point(size=2,color='purple',alpha=0.6) +
theme_ipsum() +
theme(
) +
scale_x_continuous(breaks=seq(1,20,.5)) +
scale_y_continuous(breaks=seq(1,20,.5)) +
geom_smooth(method=lm,se=F,formula=y~x) +
geom_smooth(formula=y~poly(x,2),method=lm,color='black',se=T) +
stat_poly_eq(aes(label = paste(stat(eq.label),
stat(rr.label), sep = "~~~~")),
formula = y ~ x, rr.digits = 2, coef.digits = 3,size=6,
parse = TRUE) +
labs(
title='The slope is not quite linear even in log-log terms',
subtitle='(it increases at an increasing rate as income increases)',
x='log AIC per capita, PPP-adjusted',
y='log HCE per capita, PPP-adjusted'
) +
coord_cartesian(expand=T)

LS0tDQp0aXRsZTogIkFJQyBhbmQgU0hBIGhlYWx0aCBleHBlbmRpdHVyZSBjb21wYXJpc29uIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KLS0tDQoNCg0KDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoY291bnRyeWNvZGUpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoaHJicnRoZW1lcykNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoZ2dwbWlzYykNCg0KYGBgDQoNCg0KDQpJIHF1ZXJpZWQgYW5kIGRvd25sb2FkZWQgZGF0YSBmcm9tIFtXSE8ncyBHbG9iYWwgSGVhbHRoIEV4cGVuZGl0dXJlIGRhdGFiYXNlXShodHRwczovL2FwcHMud2hvLmludC9uaGEvZGF0YWJhc2UvU2VsZWN0L0luZGljYXRvcnMvZW4pIGFuZCBbV29ybGQgQmFuayBJbnRlcm5hdGlvbmFsIENvbXBhcmlzb24gUHJvamVjdF0oaHR0cHM6Ly9kYXRhYmFuay53b3JsZGJhbmsub3JnLzIwMTctQUlDLWFuZC1HRFAtYW5kLUxDVS1hbmQtcGVyLWNhcGl0YS1QUFBzL2lkL2VhMzFiMTU3KS4gIFRoZSBXSE8gcHJvdmlkZXMgY3VycmVudCBoZWFsdGggZXhwZW5kaXR1cmUgKEhDRSkgZXN0aW1hdGVzIGluIGxvY2FsIGN1cnJlbmN5IHVuaXRzIGFuZCBhcyBhIHNoYXJlIG9mIEdEUC4gIEkgZG93bmxvYWQgdGhlbSBib3RoIGFzIGEgY3Jvc3MtY2hlY2sganVzdCBpbiBjYXNlIHRoZXJlIGFyZSBhbnkgbWFqb3IgZGlzY3JlcGFuY2llcyBpbiBjdXJyZW5jeSB1bml0cyBxdW90ZWQgYnkgV0hPIHZlcnN1cyB0aGUgbG9jYWwgY3VycmVuY3kgdW5pdHMgcHJvdmlkZWQgYnkgdGhlIElDUCBmb3IgQUlDIGFuZCBHRFAuDQoNCg0KDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KDQoNCiMgZnJvbSBXSE8sIGltcG9ydCBTSEEgY3VycmVudCBoZWFsdGggZXhwZW5kaXR1cmVzIGluIG1pbGxpb25zIG9mIGxvY2FsIGN1cnJlbmN5IHVuaXRzDQojIGFuZCBhcyBzaGFyZSBvZiBHRFAuIFRoZXNlIGNhbiBiZSB1c2VkIHRvIGNyb3NzLWNoZWNrIHRoZSByZXN1bHRzIGp1c3QgDQojIGluIGNhc2UgdGhlcmUncyBhbnkgaXNzdWUgd2l0aCB0aGUgY3VycmVuY3kgdGhlIGZpZ3VyZXMgYXJlIGRlbm9taW5hdGVkLg0KDQpzaGFfaGVhbHRoPXJlYWRfeGxzeCgNCiAgICAiTkhBIGluZGljYXRvcnMueGxzeCIsDQogICAgc2tpcD0yLA0KICAgIGNvbF9uYW1lcyA9IGMoImNvdW50cnkiLCJpbmRpY2F0b3IiLCJ1bml0cyIsc3ByaW50ZigiJWQiLDIwMDA6MjAxOSkpDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICB0eXBlPWNhc2Vfd2hlbigNCiAgICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yLCJhcyAlIikgfiAncGN0X2dkcCcsDQogICAgICBzdHJfZGV0ZWN0KGluZGljYXRvciwiXkdyb3NzIERvbWVzdGljIFByb2R1Y3QiKSB+ICdnZHBfbGN1JywNCiAgICAgIFQgfiAnaGNlX2xjdScNCiAgICApDQogICkgJT4lDQogIHNlbGVjdCggLWluZGljYXRvciwtdW5pdHMpICU+JQ0KICBtZWx0KGlkLnZhcnM9IGMoImNvdW50cnkiLCJ0eXBlIikpICU+JQ0KICBtdXRhdGUoDQogICAgeWVhcj1hcy5pbnRlZ2VyKGFzLmNoYXJhY3Rlcih2YXJpYWJsZSkpDQogICkgJT4lDQogIGRjYXN0KGNvdW50cnkreWVhcn50eXBlKSAlPiUNCiAgbXV0YXRlKA0KICAgIGNvdW50cnlfY29kZT1jb3VudHJ5Y29kZShjb3VudHJ5LCdjb3VudHJ5Lm5hbWUnLCdpc28zYycpLA0KICAgIGNvdW50cnlfY29kZT1jb2FsZXNjZShjb3VudHJ5X2NvZGUsaWZlbHNlKGNvdW50cnk9PSdUw7xya2l5ZScsJ1RVUicsTkEpKSwgIyBmaXggdHVya2V5J3MgY291bnRyeSBjb2RlDQogICAgaGNlX2xjdT1oY2VfbGN1LzEwMDAsICMgYmlsbGlvbnMNCiAgICBnZHBfbGN1PWdkcF9sY3UvMTAwMCAgIyBiaWxsaW9ucw0KICApICU+JQ0KICByZW5hbWUoIHdob19jb3VudHJ5ID0gY291bnRyeSApDQoNCg0KIyBGcm9tIFdvcmxkQmFuayBJbnRlcm5hdGlvbmFsIENvbXBhcmlzb24gUHJvamVjdA0KIyAgSW1wb3J0IEFJQyBhbmQgR0RQIGluIFBQUCBhZGp1c3RlZCBwZXIgY2FwaXRhIGFuZCBhcyBhZ2dyZWdhdGVzIG9mIGxvY2FsIGN1cnJlbmN5IHVuaXRzDQoNCmljcHJhdz1yZWFkX2NzdigiaWNwXzIwMTFfdGhyb3VnaF8yMDE3LmNzdiIsc2hvd19jb2xfdHlwZXMgPUYpICU+JQ0KICBjbGVhbl9uYW1lcygpICU+JQ0KICBtdXRhdGUoDQogICAgd2JfY291bnRyeT1jb3VudHJ5X25hbWUsDQogICAgY291bnRyeV9jb2RlLA0KICAgIHNlcmllcz1pZmVsc2Uoc3RyX2RldGVjdChzZXJpZXNfbmFtZSwnQUNUVUFMIElORElWSURVQUwgQ09OU1VNUFRJT04nKSwnQUlDJywnR0RQJyksDQogICAgdmFyaWFibGU9c3ByaW50ZigiJXNfJXMiLHNlcmllcyxjbGFzc2lmaWNhdGlvbl9jb2RlKSwNCiAgICB5ZWFyPWFzLmludGVnZXIodGltZSkNCiAgKSAlPiUNCiAgZmlsdGVyKA0KICAgICFpcy5uYSh2YWx1ZSksDQogICAgIWlzLm5hKGNvdW50cnlfY29kZSkNCiAgKSAlPiUNCiAgZGNhc3QoY291bnRyeV9jb2RlK3diX2NvdW50cnkreWVhcn52YXJpYWJsZSx2YWx1ZS52YXI9J3ZhbHVlJykgJT4lDQogIGNsZWFuX25hbWVzKCkNCg0KDQoNCmljcF9zaGE9bWVyZ2Uoc2hhX2hlYWx0aCxpY3ByYXcsYnk9YygneWVhcicsJ2NvdW50cnlfY29kZScpLGFsbD1UKSAlPiUNCiAgbXV0YXRlKA0KICAgIGhjZV9zaGFyZV9haWM9aGNlX2xjdS9haWNfY24sICAgICAgICAgICAgICAgICMgc2hhcmUgb2YgQUlDIChMQ1Ugb3ZlciBMQ1UpDQogICAgaGNlX3NoYXJlX2dkcD1oY2VfbGN1L2dkcF9jbiwgICAgICAgICAgICAgICAgIyBzaGFyZSBvZiBHRFAgKExDVSBvdmVyIExDVSkNCiAgICBoY2VfcGM9aGNlX3NoYXJlX2FpYyphaWNfcGNhcF9wcCwgICAgICAgICAgICAjIHBlciBjYXBpdGEgYXQgUFBQcyBmb3IgQUlDDQogICAgaGNlX2xjdV9hbHQ9Z2RwX2NuICogKCBwY3RfZ2RwIC8gMTAwICksICAgICAgIyBjYWxjdWxhdGUgZnJvbSBXSE8ncyBxdW90ZWQgSENFL0dEUCBhbmQgV29ybGRCYW5rJ3MgR0RQIGluIExDVQ0KICAgIGhjZV9zaGFyZV9haWNfYWx0ID0gaGNlX2xjdV9hbHQgLyBhaWNfY24sICAgICMgc2hhcmUgb2YgQUlDLCBhbHRlcm5hdGUNCiAgICBoY2VfcGNfYWx0ID0gaGNlX3NoYXJlX2FpY19hbHQgKiBhaWNfcGNhcF9wcA0KICApDQoNCg0KDQpgYGANCg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KaWNwX3NoYSAlPiUNCiAgZmlsdGVyKA0KICAgIHllYXI9PTIwMTcNCiAgKSAlPiUNCiAgZ2dwbG90KGFlcyhoY2Vfc2hhcmVfYWljLGhjZV9zaGFyZV9haWNfYWx0KSkgKw0KICAgIGdlb21fYWJsaW5lKHNsb3BlPTEpICsNCiAgICBnZW9tX3BvaW50KHNpemU9Mixjb2xvcj0ncHVycGxlJyxhbHBoYT0wLjYpICsNCiAgICB0aGVtZV9pcHN1bSgpICsNCiAgICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPWNvdW50cnlfY29kZSkpICsNCiAgICBsYWJzKA0KICAgICAgdGl0bGU9J0NvbXBhcmluZyB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgY2FsY3VsYXRpbmcgU0hBIGhlYWx0aCBzcGVuZGluZycsDQogICAgICB5PSdIZWFsdGggc2hhcmUsIG51bWVyYXRvciBkZXJpdmVkIGZyb20gV0hPXCdzIGVzdGltYXRlZCBHRFAgc2hhcmUnLA0KICAgICAgeD0nSGVhbHRoIHNoYXJlLCBudW1lcmF0b3IgZGVyaXZlZCBmcm9tIFdIT1wncyBlc3RpbWF0ZWQgZXhwZW5kaXR1cmVzIGluIExDVScNCiAgICApICsNCiAgICBzdGF0X3BvbHlfZXEoc2l6ZT02KSArDQogICAgc2NhbGVfeV9wZXJjZW50KCkgKw0KICAgIHNjYWxlX3hfcGVyY2VudCgpDQogICAgDQpgYGANCg0KDQoNCg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQoNCm15Zm9ybSA8LSB5IH4gcG9seSh4LCAyLCByYXcgPSBUUlVFKQ0KDQoNCmljcF9zaGEgJT4lDQogIGZpbHRlcigNCiAgICB5ZWFyPT0yMDE3LA0KICAgIGFpY19wY2FwX3BwID4gMTIwMDANCiAgKSAlPiUNCiAgZ2dwbG90KGFlcyhhaWNfcGNhcF9wcCxoY2Vfc2hhcmVfYWljKSkgKw0KICAgIGdlb21fcG9pbnQoc2l6ZT0zLGNvbG9yPSdwdXJwbGUnLGFscGhhPTAuNikgKw0KICAgIHRoZW1lX2lwc3VtKCkgKw0KICAgIHRoZW1lKA0KICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICAgICkgKw0KICAgIGdlb21fdGV4dF9yZXBlbChhZXMobGFiZWw9Y291bnRyeV9jb2RlKSxjb2xvcj0nZ3JheScpICsNCiAgICBzY2FsZV95X3BlcmNlbnQoYnJlYWtzPXNlcSgwLDEsLjAyKSkgKw0KICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsMWU1LDUwMDApLGxhYmVsPXNjYWxlczo6ZG9sbGFyX2Zvcm1hdCgpKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLGZvcm11bGE9J3l+cG9seSh4LDIpJyxmdWxscmFuZ2U9RixzZT1UKSArDQogICAgc3RhdF9wb2x5X2VxKGZvcm11bGE9bXlmb3JtLHNpemU9NikgKw0KICAgIGxhYnMoDQogICAgICB0aXRsZT0nVGhlIGhlYWx0aCBzaGFyZSBvZiBjb25zdW1wdGlvbiByaXNlcyByYXBpZGx5IHdpdGggaW5jb21lJywNCiAgICAgIHg9JzIwMTcgQWN0dWFsIEluZGl2aWR1YWwgQ29uc3VtcHRpb24gcGVyIGNhcGl0YScsDQogICAgICB5PScyMDE3IEN1cnJlbnQgaGVhbHRoIGV4cGVuZGl0dXJlcyBhcyBzaGFyZSBvZiBjb25zdW1wdGlvbiAoQUlDKScsDQogICAgICBjYXB0aW9uPXBhc3RlKA0KICAgICAgICAnc291cmNlOiBXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uIEdsb2JhbCBIZWFsdGggRXhwZW5kaXR1cmUgZGF0YWJhc2UnLA0KICAgICAgICAnYW5kIFdvcmxkIEJhbmsgSW50ZXJuYXRpb25hbCBDb21wYXJpc29uIFByb2plY3QnLA0KICAgICAgICBzZXA9J1xuJw0KICAgICAgKQ0KICAgICkgKw0KICAgIGNvb3JkX2NhcnRlc2lhbihleHBhbmQ9VCkNCiAgICANCg0KYGBgDQoNCg0KDQoNCmBgYHtyIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KDQoNCmljcF9zaGEgJT4lDQogIGZpbHRlcigNCiAgICB5ZWFyPT0yMDE3LA0KICAgIGFpY19wY2FwX3BwID4gMTUwMDANCiAgKSAlPiUNCiAgZ2dwbG90KGFlcyhhaWNfcGNhcF9wcCxoY2VfcGMpKSArDQogICAgZ2VvbV9wb2ludChzaXplPTIsY29sb3I9J3B1cnBsZScsYWxwaGE9MC42KSArDQogICAgdGhlbWVfaXBzdW0oKSArDQogICAgdGhlbWUoDQogICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpDQogICAgKSArICANCiAgICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPWNvdW50cnlfY29kZSkpICsNCiAgICBzY2FsZV94X2xvZzEwKA0KICAgICAgbGFiZWw9c2NhbGVzOjpkb2xsYXJfZm9ybWF0KGFjY3VyYWN5PTEpLA0KICAgICAgYnJlYWtzPXNlcSgwLDUwMDAwLDUwMDApLCAgICAgIA0KICAgICAgc2VjLmF4aXM9c2VjX2F4aXMoDQogICAgICAgIH5sb2coLiksDQogICAgICAgIGJyZWFrcz1zZXEoMCwyMCwuMSksDQogICAgICAgIG5hbWU9J2xvZyBBSUMvcGVyc29uJw0KICAgICAgKQ0KICAgICkgKw0KICAgIHNjYWxlX3lfbG9nMTAoDQogICAgICBsYWJlbD1zY2FsZXM6OmRvbGxhcl9mb3JtYXQoYWNjdXJhY3k9MSksDQogICAgICBicmVha3M9c2VxKDAsNTAwMDAsMTAwMCksDQogICAgICBzZWMuYXhpcz1zZWNfYXhpcygNCiAgICAgICAgfmxvZyguKSwNCiAgICAgICAgYnJlYWtzPXNlcSgwLDIwLC4xKSwNCiAgICAgICAgbmFtZT0nbG9nIGhjZS9wZXJzb24nDQogICAgICApDQogICAgICANCiAgICApICsNCiAgICBnZW9tX3Ntb290aChtZXRob2Q9bG0sZm9ybXVsYT15fngpICsNCiAgICBzdGF0X3BvbHlfZXEoYWVzKGxhYmVsID0gIHBhc3RlKHN0YXQoZXEubGFiZWwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdChyci5sYWJlbCksIHNlcCA9ICJ+fn5+IikpLA0KICAgICAgICAgICAgICAgICBmb3JtdWxhID0geSB+IHgsIHJyLmRpZ2l0cyA9IDIsIGNvZWYuZGlnaXRzID0gMyxzaXplPTYsDQogICAgICAgICAgICAgICAgIHBhcnNlID0gVFJVRSkgKyAgDQogICAgbGFicygNCiAgICAgIHRpdGxlPSdUaGUgaGVhbHRoIHNoYXJlIG9mIGNvbnN1bXB0aW9uIHJpc2VzIHJhcGlkbHkgd2l0aCBpbmNvbWUnLA0KICAgICAgeD0nQWN0dWFsIEluZGl2aWR1YWwgQ29uc3VtcHRpb24gcGVyIGNhcGl0YScsDQogICAgICB5PSdDdXJyZW50IGhlYWx0aCBleHBlbmRpdHVyZXMgcGVyIGNhcGl0YSBhdCBQUFBzIGZvciBBSUMnDQogICAgKSArDQogICAgY29vcmRfY2FydGVzaWFuKGV4cGFuZD1UKQ0KDQpgYGANCg0KDQoNCg0KYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KaWNwX3NoYSAlPiUNCiAgZmlsdGVyKA0KICAgIHllYXI9PTIwMTcsDQogICAgIWNvdW50cnlfY29kZSAlaW4lIGMoJ01SVCcpLCAgIyBNYXVyaXRhbmlhIGlzIHByb2JhYmx5IGFuIGVycm9yIGFuZCBqdXN0IGNsdXR0ZXJzIHRoaXMNCiAgICBUDQogICkgJT4lDQogIGdncGxvdChhZXMobG9nKGFpY19wY2FwX3BwKSxsb2coaGNlX3BjKSApKSArDQogICAgZ2VvbV9wb2ludChzaXplPTIsY29sb3I9J3B1cnBsZScsYWxwaGE9MC42KSArDQogICAgdGhlbWVfaXBzdW0oKSArDQogICAgdGhlbWUoDQogICAgKSArICAgIA0KICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDEsMjAsLjUpKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoMSwyMCwuNSkpICsNCiAgDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLHNlPUYsZm9ybXVsYT15fngpICsNCiAgICBnZW9tX3Ntb290aChmb3JtdWxhPXl+cG9seSh4LDIpLG1ldGhvZD1sbSxjb2xvcj0nYmxhY2snLHNlPVQpICsNCiAgICBzdGF0X3BvbHlfZXEoYWVzKGxhYmVsID0gIHBhc3RlKHN0YXQoZXEubGFiZWwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdChyci5sYWJlbCksIHNlcCA9ICJ+fn5+IikpLA0KICAgICAgICAgICAgICAgICBmb3JtdWxhID0geSB+IHgsIHJyLmRpZ2l0cyA9IDIsIGNvZWYuZGlnaXRzID0gMyxzaXplPTYsDQogICAgICAgICAgICAgICAgIHBhcnNlID0gVFJVRSkgKyAgDQogICAgbGFicygNCiAgICAgIHRpdGxlPSdUaGUgc2xvcGUgaXMgbm90IHF1aXRlIGxpbmVhciBldmVuIGluIGxvZy1sb2cgdGVybXMnLA0KICAgICAgc3VidGl0bGU9JyhpdCBpbmNyZWFzZXMgYXQgYW4gaW5jcmVhc2luZyByYXRlIGFzIGluY29tZSBpbmNyZWFzZXMpJywNCiAgICAgIHg9J2xvZyBBSUMgcGVyIGNhcGl0YSwgUFBQLWFkanVzdGVkJywNCiAgICAgIHk9J2xvZyBIQ0UgcGVyIGNhcGl0YSwgUFBQLWFkanVzdGVkJw0KICAgICkgKw0KICAgIGNvb3JkX2NhcnRlc2lhbihleHBhbmQ9VCkNCmBgYA==