Data pre-processing and Visualization

# Clear R environment: 
rm(list = ls())

# Load some R packages (download from https://www.mediafire.com/file/ojayuymg68eraei/HO1_remove_some_columns.dta/file): 
library(dplyr)
library(stringr)
library(haven)

#==========================================
#  Data set: HO1_remove_some_columns.dta 
#==========================================

# Load data: 

read_dta("F:/HO1_remove_some_columns.dta") -> ho1

#------------------------
#  Create Household ID
#------------------------

# Function adds zero: 

add_zero <- function(x) {
  
  y <- case_when(x < 10 ~ str_c("0", x), TRUE ~ as.character(x))
  
  return(y)
}

# Some columns for creating household ID: 

code_components <- c("tinh", "huyen", "xa", "diaban", "hoso")

# Use the function: 

ho1 %>% 
  mutate(tinh_n = add_zero(tinh), 
         huyen_n = add_zero(huyen), 
         xa_n = add_zero(xa), 
         diaban_n = add_zero(diaban), 
         hoso_n = add_zero(hoso)) %>% 
  mutate(h_code = str_c(tinh_n, huyen_n, xa_n, diaban_n, hoso_n)) -> ho1

# Remove duplications: 

ho1 %>% filter(!duplicated(h_code)) -> ho1_nonDup

#--------------------------
#  Extract province names
#--------------------------

# Extract province info:
library(stringi)

ho1_nonDup$tinh %>% 
  attributes() %>% 
  .$labels %>% data.frame() -> df_province

# Rename for DF: 
names(df_province) <- "province_code"

# Create some columns and relabel for provinces: 

df_province %>% 
  mutate(province_vie = row.names(df_province)) %>% 
  mutate(province_eng = stri_trans_general(province_vie, "Latin-ASCII")) %>% 
  mutate(province_eng = str_replace_all(province_eng, "Tinh |Thanh pho ", "")) %>% 
  mutate(province_code = add_zero(province_code)) -> df_province

# Join the two data sets: 

full_join(ho1_nonDup, 
          df_province %>% select(province_code, province_eng), 
          by = c("tinh_n" = "province_code")) -> ho1_nonDup

# Relabel for region: 

ho1_nonDup %>% mutate(ttnt = case_when(ttnt == 1 ~ "Urban", TRUE ~ "Rural")) -> ho1_nonDup

# Calculate mean of financial aid and expenditure for health care (rural vs urban): 

ho1_nonDup %>% 
  group_by(ttnt, province_eng) %>% 
  summarise(avg_medical_aid = mean(m3c15, na.rm = TRUE)) %>% 
  ungroup() %>% 
  arrange(province_eng) -> medical_aid

ho1_nonDup %>% 
  group_by(ttnt, province_eng) %>% 
  summarise(avg_medical_exp = mean(m3ct, na.rm = TRUE)) %>% 
  ungroup() %>% 
  arrange(province_eng) -> medical_exp

# Calculate averall means: 

ho1_nonDup %>% 
  group_by(province_eng) %>% 
  summarise(Overall = mean(m3c15, na.rm = TRUE)) %>% 
  ungroup() %>% 
  arrange(province_eng) -> medical_overall_aid

ho1_nonDup %>% 
  group_by(province_eng) %>% 
  summarise(Overall = mean(m3ct, na.rm = TRUE)) %>% 
  ungroup() %>% 
  arrange(province_eng) -> medical_overall_exp

# Convert to wide form and add overall health expenditure: 

library(tidyr)

medical_aid %>% 
  spread(key = "ttnt", value = "avg_medical_aid") %>% 
  full_join(medical_overall_aid) -> medical_aid_wide

medical_exp %>% 
  spread(key = "ttnt", value = "avg_medical_exp") %>% 
  full_join(medical_overall_exp) -> medical_exp_wide

# Rearrange by overall expenditure: 

medical_aid_wide %>% 
  arrange(Overall) %>% 
  mutate(province_eng = factor(province_eng, province_eng)) -> medical_aid_wide

medical_exp_wide %>% 
  arrange(Overall) %>% 
  mutate(province_eng = factor(province_eng, province_eng)) -> medical_exp_wide

#=======================
#  Data Visualization
#=======================

# Load some R packages: 

library(ggeconodist) # install.packages("ggeconodist", repos = "https://cinc.rud.is")
library(ggplot2)
library(showtext)

# Select Ubuntu Condensed font: 
showtext.auto()
font_add_google(name = "Ubuntu Condensed", family = "ubu")
my_font <- "ubu"

# Figure 1: 

medical_aid_wide %>% 
  ggplot(aes(x = province_eng)) + 
  geom_econodist(aes(ymin = Rural, median = Overall, ymax = Urban), 
                 median_col = "firebrick", 
                 stat = "identity", 
                 median_point_size = 1.5, 
                 show.legend = TRUE) + 
  coord_flip() +
  theme_econodist() + 
  scale_y_continuous(expand = c(0, 0), limits = range(0, 6000), position = "right") + 
  labs(title = "Figure 1: The urban-rual gap in financial aid for health care by household, 2018", 
       caption = "Data Source: VHLSS 2018, GSO") +  
  theme(axis.title.y = element_blank()) + 
  theme(axis.text.y = element_text(family = my_font, size = 10)) + 
  theme(axis.text.x = element_text(family = my_font)) + 
  theme(plot.caption = element_text(family = my_font, size = 8, face = "italic")) + 
  theme(plot.title = element_text(family = my_font, size = 16)) -> g1 
  
grid.newpage()

g1 %>% 
  left_align(c("title", "caption")) %>% 
  add_econodist_legend(
    econodist_legend_grob(
      tenth_lab = "Rural", 
      ninetieth_lab = "Urban", 
      med_lab = "Overall", 
      med_col = "firebrick", 
      family = my_font, 
      label_size = 12,
    ), 
    below = "title"
  ) %>% 
  grid.draw()

# Figure 2: 

medical_exp_wide %>% 
  ggplot(aes(x = province_eng)) + 
  geom_econodist(aes(ymin = Rural, median = Overall, ymax = Urban), 
                 median_col = "firebrick", stat = "identity", median_point_size = 1.5, show.legend = TRUE) + 
  coord_flip() +
  theme_econodist() + 
  scale_y_continuous(expand = c(0, 0), limits = range(0, 12000), position = "right") + 
  labs(title = "Figure 2: The urban-rual gap in expenditure for health care by household, 2018", 
       caption = "Data Source: VHLSS 2018, GSO") +  
  theme(axis.title.y = element_blank()) + 
  theme(axis.text.y = element_text(family = my_font, size = 10)) + 
  theme(axis.text.x = element_text(family = my_font)) + 
  theme(plot.caption = element_text(family = my_font, size = 8, face = "italic")) + 
  theme(plot.title = element_text(family = my_font, size = 16)) -> g2 

grid.newpage()

g2 %>% 
  left_align(c("title", "caption")) %>% 
  add_econodist_legend(
    econodist_legend_grob(
      tenth_lab = "Rural", 
      ninetieth_lab = "Urban", 
      med_lab = "Overall", 
      med_col = "firebrick", 
      family = my_font, 
      label_size = 12,
    ), 
    below = "title"
  ) %>% 
  grid.draw()
LS0tDQp0aXRsZTogJ1RoZSB1cmJhbi1ydWFsIGdhcCBpbiBleHBlbmRpdHVyZSBmb3IgaGVhbHRoIGNhcmUgYnkgaG91c2Vob2xkLCBWSExTUyAyMDE4Jw0KYXV0aG9yOiAnQXV0aG9yOiBOZ3V5ZW4gQ2hpIER1bmcnDQpzdWJ0aXRsZTogIkRhaWx5IEdyYXBoIFNlcmllcyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICMgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgIyBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiAiZmxhdGx5Ig0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUUpDQoNCmBgYA0KDQohW10oQzovVXNlcnMvQURNSU4vRG9jdW1lbnRzL2gxLmpwZykNCg0KDQohW10oQzovVXNlcnMvQURNSU4vRG9jdW1lbnRzL2gyLmpwZykNCg0KDQojIERhdGEgcHJlLXByb2Nlc3NpbmcgYW5kIFZpc3VhbGl6YXRpb24NCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojIENsZWFyIFIgZW52aXJvbm1lbnQ6IA0Kcm0obGlzdCA9IGxzKCkpDQoNCiMgTG9hZCBzb21lIFIgcGFja2FnZXMgKGRvd25sb2FkIGZyb20gaHR0cHM6Ly93d3cubWVkaWFmaXJlLmNvbS9maWxlL29qYXl1eW1nNjhlcmFlaS9ITzFfcmVtb3ZlX3NvbWVfY29sdW1ucy5kdGEvZmlsZSk6IA0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoaGF2ZW4pDQoNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgIERhdGEgc2V0OiBITzFfcmVtb3ZlX3NvbWVfY29sdW1ucy5kdGEgDQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCiMgTG9hZCBkYXRhOiANCg0KcmVhZF9kdGEoIkY6L0hPMV9yZW1vdmVfc29tZV9jb2x1bW5zLmR0YSIpIC0+IGhvMQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICBDcmVhdGUgSG91c2Vob2xkIElEDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgRnVuY3Rpb24gYWRkcyB6ZXJvOiANCg0KYWRkX3plcm8gPC0gZnVuY3Rpb24oeCkgew0KICANCiAgeSA8LSBjYXNlX3doZW4oeCA8IDEwIH4gc3RyX2MoIjAiLCB4KSwgVFJVRSB+IGFzLmNoYXJhY3Rlcih4KSkNCiAgDQogIHJldHVybih5KQ0KfQ0KDQojIFNvbWUgY29sdW1ucyBmb3IgY3JlYXRpbmcgaG91c2Vob2xkIElEOiANCg0KY29kZV9jb21wb25lbnRzIDwtIGMoInRpbmgiLCAiaHV5ZW4iLCAieGEiLCAiZGlhYmFuIiwgImhvc28iKQ0KDQojIFVzZSB0aGUgZnVuY3Rpb246IA0KDQpobzEgJT4lIA0KICBtdXRhdGUodGluaF9uID0gYWRkX3plcm8odGluaCksIA0KICAgICAgICAgaHV5ZW5fbiA9IGFkZF96ZXJvKGh1eWVuKSwgDQogICAgICAgICB4YV9uID0gYWRkX3plcm8oeGEpLCANCiAgICAgICAgIGRpYWJhbl9uID0gYWRkX3plcm8oZGlhYmFuKSwgDQogICAgICAgICBob3NvX24gPSBhZGRfemVybyhob3NvKSkgJT4lIA0KICBtdXRhdGUoaF9jb2RlID0gc3RyX2ModGluaF9uLCBodXllbl9uLCB4YV9uLCBkaWFiYW5fbiwgaG9zb19uKSkgLT4gaG8xDQoNCiMgUmVtb3ZlIGR1cGxpY2F0aW9uczogDQoNCmhvMSAlPiUgZmlsdGVyKCFkdXBsaWNhdGVkKGhfY29kZSkpIC0+IGhvMV9ub25EdXANCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICBFeHRyYWN0IHByb3ZpbmNlIG5hbWVzDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBFeHRyYWN0IHByb3ZpbmNlIGluZm86DQpsaWJyYXJ5KHN0cmluZ2kpDQoNCmhvMV9ub25EdXAkdGluaCAlPiUgDQogIGF0dHJpYnV0ZXMoKSAlPiUgDQogIC4kbGFiZWxzICU+JSBkYXRhLmZyYW1lKCkgLT4gZGZfcHJvdmluY2UNCg0KIyBSZW5hbWUgZm9yIERGOiANCm5hbWVzKGRmX3Byb3ZpbmNlKSA8LSAicHJvdmluY2VfY29kZSINCg0KIyBDcmVhdGUgc29tZSBjb2x1bW5zIGFuZCByZWxhYmVsIGZvciBwcm92aW5jZXM6IA0KDQpkZl9wcm92aW5jZSAlPiUgDQogIG11dGF0ZShwcm92aW5jZV92aWUgPSByb3cubmFtZXMoZGZfcHJvdmluY2UpKSAlPiUgDQogIG11dGF0ZShwcm92aW5jZV9lbmcgPSBzdHJpX3RyYW5zX2dlbmVyYWwocHJvdmluY2VfdmllLCAiTGF0aW4tQVNDSUkiKSkgJT4lIA0KICBtdXRhdGUocHJvdmluY2VfZW5nID0gc3RyX3JlcGxhY2VfYWxsKHByb3ZpbmNlX2VuZywgIlRpbmggfFRoYW5oIHBobyAiLCAiIikpICU+JSANCiAgbXV0YXRlKHByb3ZpbmNlX2NvZGUgPSBhZGRfemVybyhwcm92aW5jZV9jb2RlKSkgLT4gZGZfcHJvdmluY2UNCg0KIyBKb2luIHRoZSB0d28gZGF0YSBzZXRzOiANCg0KZnVsbF9qb2luKGhvMV9ub25EdXAsIA0KICAgICAgICAgIGRmX3Byb3ZpbmNlICU+JSBzZWxlY3QocHJvdmluY2VfY29kZSwgcHJvdmluY2VfZW5nKSwgDQogICAgICAgICAgYnkgPSBjKCJ0aW5oX24iID0gInByb3ZpbmNlX2NvZGUiKSkgLT4gaG8xX25vbkR1cA0KDQojIFJlbGFiZWwgZm9yIHJlZ2lvbjogDQoNCmhvMV9ub25EdXAgJT4lIG11dGF0ZSh0dG50ID0gY2FzZV93aGVuKHR0bnQgPT0gMSB+ICJVcmJhbiIsIFRSVUUgfiAiUnVyYWwiKSkgLT4gaG8xX25vbkR1cA0KDQojIENhbGN1bGF0ZSBtZWFuIG9mIGZpbmFuY2lhbCBhaWQgYW5kIGV4cGVuZGl0dXJlIGZvciBoZWFsdGggY2FyZSAocnVyYWwgdnMgdXJiYW4pOiANCg0KaG8xX25vbkR1cCAlPiUgDQogIGdyb3VwX2J5KHR0bnQsIHByb3ZpbmNlX2VuZykgJT4lIA0KICBzdW1tYXJpc2UoYXZnX21lZGljYWxfYWlkID0gbWVhbihtM2MxNSwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBhcnJhbmdlKHByb3ZpbmNlX2VuZykgLT4gbWVkaWNhbF9haWQNCg0KaG8xX25vbkR1cCAlPiUgDQogIGdyb3VwX2J5KHR0bnQsIHByb3ZpbmNlX2VuZykgJT4lIA0KICBzdW1tYXJpc2UoYXZnX21lZGljYWxfZXhwID0gbWVhbihtM2N0LCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGFycmFuZ2UocHJvdmluY2VfZW5nKSAtPiBtZWRpY2FsX2V4cA0KDQojIENhbGN1bGF0ZSBhdmVyYWxsIG1lYW5zOiANCg0KaG8xX25vbkR1cCAlPiUgDQogIGdyb3VwX2J5KHByb3ZpbmNlX2VuZykgJT4lIA0KICBzdW1tYXJpc2UoT3ZlcmFsbCA9IG1lYW4obTNjMTUsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgYXJyYW5nZShwcm92aW5jZV9lbmcpIC0+IG1lZGljYWxfb3ZlcmFsbF9haWQNCg0KaG8xX25vbkR1cCAlPiUgDQogIGdyb3VwX2J5KHByb3ZpbmNlX2VuZykgJT4lIA0KICBzdW1tYXJpc2UoT3ZlcmFsbCA9IG1lYW4obTNjdCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBhcnJhbmdlKHByb3ZpbmNlX2VuZykgLT4gbWVkaWNhbF9vdmVyYWxsX2V4cA0KDQojIENvbnZlcnQgdG8gd2lkZSBmb3JtIGFuZCBhZGQgb3ZlcmFsbCBoZWFsdGggZXhwZW5kaXR1cmU6IA0KDQpsaWJyYXJ5KHRpZHlyKQ0KDQptZWRpY2FsX2FpZCAlPiUgDQogIHNwcmVhZChrZXkgPSAidHRudCIsIHZhbHVlID0gImF2Z19tZWRpY2FsX2FpZCIpICU+JSANCiAgZnVsbF9qb2luKG1lZGljYWxfb3ZlcmFsbF9haWQpIC0+IG1lZGljYWxfYWlkX3dpZGUNCg0KbWVkaWNhbF9leHAgJT4lIA0KICBzcHJlYWQoa2V5ID0gInR0bnQiLCB2YWx1ZSA9ICJhdmdfbWVkaWNhbF9leHAiKSAlPiUgDQogIGZ1bGxfam9pbihtZWRpY2FsX292ZXJhbGxfZXhwKSAtPiBtZWRpY2FsX2V4cF93aWRlDQoNCiMgUmVhcnJhbmdlIGJ5IG92ZXJhbGwgZXhwZW5kaXR1cmU6IA0KDQptZWRpY2FsX2FpZF93aWRlICU+JSANCiAgYXJyYW5nZShPdmVyYWxsKSAlPiUgDQogIG11dGF0ZShwcm92aW5jZV9lbmcgPSBmYWN0b3IocHJvdmluY2VfZW5nLCBwcm92aW5jZV9lbmcpKSAtPiBtZWRpY2FsX2FpZF93aWRlDQoNCm1lZGljYWxfZXhwX3dpZGUgJT4lIA0KICBhcnJhbmdlKE92ZXJhbGwpICU+JSANCiAgbXV0YXRlKHByb3ZpbmNlX2VuZyA9IGZhY3Rvcihwcm92aW5jZV9lbmcsIHByb3ZpbmNlX2VuZykpIC0+IG1lZGljYWxfZXhwX3dpZGUNCg0KIz09PT09PT09PT09PT09PT09PT09PT09DQojICBEYXRhIFZpc3VhbGl6YXRpb24NCiM9PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIExvYWQgc29tZSBSIHBhY2thZ2VzOiANCg0KbGlicmFyeShnZ2Vjb25vZGlzdCkgIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ2Vjb25vZGlzdCIsIHJlcG9zID0gImh0dHBzOi8vY2luYy5ydWQuaXMiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzaG93dGV4dCkNCg0KIyBTZWxlY3QgVWJ1bnR1IENvbmRlbnNlZCBmb250OiANCnNob3d0ZXh0LmF1dG8oKQ0KZm9udF9hZGRfZ29vZ2xlKG5hbWUgPSAiVWJ1bnR1IENvbmRlbnNlZCIsIGZhbWlseSA9ICJ1YnUiKQ0KbXlfZm9udCA8LSAidWJ1Ig0KDQojIEZpZ3VyZSAxOiANCg0KbWVkaWNhbF9haWRfd2lkZSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHByb3ZpbmNlX2VuZykpICsgDQogIGdlb21fZWNvbm9kaXN0KGFlcyh5bWluID0gUnVyYWwsIG1lZGlhbiA9IE92ZXJhbGwsIHltYXggPSBVcmJhbiksIA0KICAgICAgICAgICAgICAgICBtZWRpYW5fY29sID0gImZpcmVicmljayIsIA0KICAgICAgICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwgDQogICAgICAgICAgICAgICAgIG1lZGlhbl9wb2ludF9zaXplID0gMS41LCANCiAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUUlVFKSArIA0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9lY29ub2Rpc3QoKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gcmFuZ2UoMCwgNjAwMCksIHBvc2l0aW9uID0gInJpZ2h0IikgKyANCiAgbGFicyh0aXRsZSA9ICJGaWd1cmUgMTogVGhlIHVyYmFuLXJ1YWwgZ2FwIGluIGZpbmFuY2lhbCBhaWQgZm9yIGhlYWx0aCBjYXJlIGJ5IGhvdXNlaG9sZCwgMjAxOCIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBTb3VyY2U6IFZITFNTIDIwMTgsIEdTTyIpICsgIA0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsgDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAxMCkpICsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQpKSArIA0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDgsIGZhY2UgPSAiaXRhbGljIikpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDE2KSkgLT4gZzEgDQogIA0KZ3JpZC5uZXdwYWdlKCkNCg0KZzEgJT4lIA0KICBsZWZ0X2FsaWduKGMoInRpdGxlIiwgImNhcHRpb24iKSkgJT4lIA0KICBhZGRfZWNvbm9kaXN0X2xlZ2VuZCgNCiAgICBlY29ub2Rpc3RfbGVnZW5kX2dyb2IoDQogICAgICB0ZW50aF9sYWIgPSAiUnVyYWwiLCANCiAgICAgIG5pbmV0aWV0aF9sYWIgPSAiVXJiYW4iLCANCiAgICAgIG1lZF9sYWIgPSAiT3ZlcmFsbCIsIA0KICAgICAgbWVkX2NvbCA9ICJmaXJlYnJpY2siLCANCiAgICAgIGZhbWlseSA9IG15X2ZvbnQsIA0KICAgICAgbGFiZWxfc2l6ZSA9IDEyLA0KICAgICksIA0KICAgIGJlbG93ID0gInRpdGxlIg0KICApICU+JSANCiAgZ3JpZC5kcmF3KCkNCg0KIyBGaWd1cmUgMjogDQoNCm1lZGljYWxfZXhwX3dpZGUgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwcm92aW5jZV9lbmcpKSArIA0KICBnZW9tX2Vjb25vZGlzdChhZXMoeW1pbiA9IFJ1cmFsLCBtZWRpYW4gPSBPdmVyYWxsLCB5bWF4ID0gVXJiYW4pLCANCiAgICAgICAgICAgICAgICAgbWVkaWFuX2NvbCA9ICJmaXJlYnJpY2siLCBzdGF0ID0gImlkZW50aXR5IiwgbWVkaWFuX3BvaW50X3NpemUgPSAxLjUsIHNob3cubGVnZW5kID0gVFJVRSkgKyANCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfZWNvbm9kaXN0KCkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIGxpbWl0cyA9IHJhbmdlKDAsIDEyMDAwKSwgcG9zaXRpb24gPSAicmlnaHQiKSArIA0KICBsYWJzKHRpdGxlID0gIkZpZ3VyZSAyOiBUaGUgdXJiYW4tcnVhbCBnYXAgaW4gZXhwZW5kaXR1cmUgZm9yIGhlYWx0aCBjYXJlIGJ5IGhvdXNlaG9sZCwgMjAxOCIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBTb3VyY2U6IFZITFNTIDIwMTgsIEdTTyIpICsgIA0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsgDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAxMCkpICsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQpKSArIA0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDgsIGZhY2UgPSAiaXRhbGljIikpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDE2KSkgLT4gZzIgDQoNCmdyaWQubmV3cGFnZSgpDQoNCmcyICU+JSANCiAgbGVmdF9hbGlnbihjKCJ0aXRsZSIsICJjYXB0aW9uIikpICU+JSANCiAgYWRkX2Vjb25vZGlzdF9sZWdlbmQoDQogICAgZWNvbm9kaXN0X2xlZ2VuZF9ncm9iKA0KICAgICAgdGVudGhfbGFiID0gIlJ1cmFsIiwgDQogICAgICBuaW5ldGlldGhfbGFiID0gIlVyYmFuIiwgDQogICAgICBtZWRfbGFiID0gIk92ZXJhbGwiLCANCiAgICAgIG1lZF9jb2wgPSAiZmlyZWJyaWNrIiwgDQogICAgICBmYW1pbHkgPSBteV9mb250LCANCiAgICAgIGxhYmVsX3NpemUgPSAxMiwNCiAgICApLCANCiAgICBiZWxvdyA9ICJ0aXRsZSINCiAgKSAlPiUgDQogIGdyaWQuZHJhdygpDQpgYGANCg0K