
Prepare Data for Correcting VSIC Code
Dưới đây là toàn bộ R codes phiên bản rút gọn (không giải thích dài
dòng) của post
trước.
# Clear R environment:
rm(list = ls())
# Load some R packages:
library(readxl)
library(dplyr)
library(tidyr)
library(stringr)
# Load data (download from https://dangkykinhdoanh.gov.vn/vn/Pages/NganhNghe.aspx):
read_xls("Bảng chuyển đổi VSIC 2018 - VSIC 2007.xls") -> vsic_converted
vsic_converted %>% slice(-c(1:4)) -> vsic_converted
names(vsic_converted) <- c("vsic_new_c3", "vsic_new_c4", "sector_name_new",
"vsic_old_c3", "vsic_old_c4", "sector_name_old")
# Prepare data for correcting:
vsic_converted %>%
filter(vsic_new_c3 != vsic_old_c3) %>%
select(vsic_new_c3, vsic_old_c3, sector_name_new, sector_name_old) -> vsic_diff_c3
vsic_converted %>%
filter(vsic_new_c4 != vsic_old_c4) -> vsic_diff_c4
vsic_diff_c4 %>%
filter(!duplicated(vsic_old_c4)) %>%
select(vsic_new_c4, code_l4 = vsic_old_c4) -> convert_table_c4
read_excel("df_sector_code.xlsx") -> df_sector_code
# Prepare data for correcting:
df_sector_code %>%
mutate(code_level1 = case_when(str_count(code_level1) == 0 ~ NA_character_, TRUE ~ code_level1)) %>%
fill(code_level1, .direction = "down") %>%
filter(str_detect(sector_name_latin, "[a-z]")) %>%
mutate(code_level2 = case_when(str_count(code_level2) == 0 ~ NA_character_, TRUE ~ code_level2)) %>%
fill(code_level2, .direction = "down") -> df_sector_code_filled
df_sector_code %>%
select(code_level1, sector_name_latin) %>%
filter(str_count(code_level1) != 0) -> df_sector_l1
full_join(df_sector_l1,
df_sector_code_filled %>% select(code_level1, code_level2)) -> df_sector_l1
df_sector_l1 %>%
rename(code_l2 = code_level2) %>%
filter(!duplicated(code_l2)) -> df_sector_l1
Functions for Cleaning VES Data
# Function for processing/cleaning data:
cleaning_data_tax_vsic_code <- function(your_ves_data) {
# Convert to text and extract sector codes at all levels:
your_ves_data %>%
mutate(nganh_kd = as.character(nganh_kd)) %>%
mutate(code_l2 = str_sub(nganh_kd, start = 1, end = 2),
code_l3 = str_sub(nganh_kd, start = 1, end = 3),
code_l4 = str_sub(nganh_kd, start = 1, end = 4),
code_5_end = str_sub(nganh_kd, start = 5, end = 5)) -> ves_data
# Remove missing at nganh_kd:
ves_data %>% filter(!is.na(nganh_kd)) -> ves_data
# Remove missing at ma_thue:
ves_data %>% filter(!is.na(ma_thue)) -> ves_data
#---------------
# VSIC 5 digits
#---------------
ves_data %>%
mutate(nganh_kd = case_when(str_count(nganh_kd) == 4 ~ str_c("0", nganh_kd), TRUE ~ nganh_kd)) %>%
filter(str_count(nganh_kd) == 5) -> ves_data
#----------------------
# Tax code processing
#----------------------
# Remove missing:
ves_data %>% filter(!is.na(ma_thue)) -> ves_data
# Remove duplications:
ves_data %>% filter(!duplicated(ma_thue)) -> ves_data
# Remove cases != 10 digits:
ves_data %>% filter(str_count(ma_thue) == 10) -> ves_data
return(ves_data)
}
# Function corrects VSIC Level 3:
process_vsic3 <- function(your_df) {
full_join(your_df,
vsic_diff_c3 %>% select(vsic_new_c3, code_l3 = vsic_old_c3),
by = c("code_l3")) -> your_df
your_df %>%
mutate(code_l3_adj = case_when(is.na(vsic_new_c3) ~ code_l3, TRUE ~ vsic_new_c3)) -> final_df
return(final_df)
}
# Function corrects VSIC Level 4:
process_vsic4 <- function(your_df) {
full_join(your_df, convert_table_c4, by = "code_l4") -> your_df
your_df %>%
mutate(code_l4_adj = case_when(is.na(vsic_new_c4) ~ code_l4, TRUE ~ vsic_new_c4)) %>%
mutate(nganh_kd_adj = str_c(code_l4_adj, code_5_end)) %>%
mutate(code_l2_adj = str_sub(nganh_kd_adj, start = 1, end = 2)) -> final_df
return(final_df)
}
# Funtions join sector name:
add_sector_name_at_level_1 <- function(your_df) {
inner_join(your_df,
df_sector_l1,
by = c("code_l2_adj" = "code_l2")) -> final_df
return(final_df)
}
Use The Functions
library(haven) # For importing data from Stata files:
read_dta("F:\\VES_from_MaiVu_FTU\\Stata_2015\\dn2015.dta") %>%
cleaning_data_tax_vsic_code() %>%
process_vsic3() %>%
process_vsic4() %>%
add_sector_name_at_level_1() -> dn2015_after_processing
For Reporting
library(knitr)
dn2015_after_processing %>%
filter(!is.na(kqkd1)) %>%
group_by(sector_name_latin) %>%
summarise(Min = min(kqkd1),
Max = max(kqkd1),
SD = sd(kqkd1),
Median = median(kqkd1),
N_obs = n()) %>%
arrange(-N_obs) %>%
mutate(sector_name_short = str_sub(sector_name_latin, 1, 20)) %>%
select(-sector_name_latin) %>%
select(sector_name_short, everything()) %>%
kable()
BAN BUON VA BAN LE; |
0 |
105559749 |
395966.60 |
2102.0 |
169612 |
CONG NGHIEP CHE BIEN |
0 |
375812792 |
2059143.28 |
2529.0 |
72810 |
XAY DUNG |
-26 |
11966123 |
133276.12 |
1717.0 |
58651 |
HOAT DONG CHUYEN MON |
-95 |
3404914 |
43026.90 |
437.0 |
36985 |
VAN TAI KHO BAI |
0 |
12235791 |
177607.50 |
2182.0 |
26511 |
HOAT DONG HANH CHINH |
0 |
4815353 |
68250.97 |
672.0 |
17313 |
DICH VU LUU TRU VA A |
0 |
4694252 |
62100.38 |
586.0 |
16056 |
THONG TIN VA TRUYEN |
0 |
57474075 |
803345.92 |
232.0 |
9458 |
HOAT DONG KINH DOANH |
0 |
7292986 |
169680.21 |
290.5 |
8624 |
GIAO DUC VA DAO TAO |
0 |
1136408 |
35180.19 |
106.0 |
5283 |
HOAT DONG TAI CHINH, |
-292 |
22942233 |
785044.73 |
1699.0 |
3175 |
HOAT DONG DICH VU KH |
0 |
366965 |
13330.10 |
165.0 |
3155 |
NGHE THUAT, VUI CHOI |
0 |
38174412 |
843315.37 |
153.0 |
2417 |
CUNG CAP NUOC; HOAT |
0 |
2826496 |
118502.49 |
1002.0 |
1702 |
SAN XUAT VA PHAN PHO |
0 |
77951360 |
3103259.73 |
2445.0 |
1495 |
Y TE VA HOAT DONG TR |
0 |
969653 |
59694.20 |
753.9 |
1420 |
HOAT DONG CUA CAC TO |
0 |
455638 |
55533.97 |
1050.0 |
74 |
LS0tDQp0aXRsZTogIkRhdGEgUHJlLXByb2Nlc3Npbmc6IFZpZXRuYW0gRW50ZXJwcmlzZSBTdXJ2ZXkgKFZFUykgRGF0YSAtIENvbmRlbnNlZCBWZXJzaW9uIg0KYXV0aG9yOiAnQXV0aG9yOiBOZ3V5ZW4gQ2hpIER1bmcnDQpzdWJ0aXRsZTogRGF0YSBQcmUtcHJvY2Vzc2luZyBTZXJpZXMsIEZUVSBTaG9ydCBDb3Vyc2UNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUUpDQoNCmBgYA0KDQoNCiFbXShDOlxcVXNlcnNcXEFkbWluXFxEb2N1bWVudHNcXHZlcy5wbmcpDQoNCiMgUHJlcGFyZSBEYXRhIGZvciBDb3JyZWN0aW5nIFZTSUMgQ29kZQ0KDQpExrDhu5tpIMSRw6J5IGzDoCB0b8OgbiBi4buZIFIgY29kZXMgcGhpw6puIGLhuqNuIHLDunQgZ+G7jW4gKGtow7RuZyBnaeG6o2kgdGjDrWNoIGTDoGkgZMOybmcpIGPhu6dhIFtwb3N0IHRyxrDhu5tjXShodHRwczovL3JwdWJzLmNvbS9jaGlkdW5na3QvMTAxMjMwNSkuIA0KDQpgYGB7cn0NCiMgQ2xlYXIgUiBlbnZpcm9ubWVudDogDQoNCnJtKGxpc3QgPSBscygpKQ0KDQojIExvYWQgc29tZSBSIHBhY2thZ2VzOiANCg0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBMb2FkIGRhdGEgKGRvd25sb2FkIGZyb20gaHR0cHM6Ly9kYW5na3lraW5oZG9hbmguZ292LnZuL3ZuL1BhZ2VzL05nYW5oTmdoZS5hc3B4KTogDQoNCnJlYWRfeGxzKCJC4bqjbmcgY2h1eeG7g24gxJHhu5VpIFZTSUMgMjAxOCAtIFZTSUMgMjAwNy54bHMiKSAtPiB2c2ljX2NvbnZlcnRlZA0KDQp2c2ljX2NvbnZlcnRlZCAlPiUgc2xpY2UoLWMoMTo0KSkgLT4gdnNpY19jb252ZXJ0ZWQNCg0KbmFtZXModnNpY19jb252ZXJ0ZWQpIDwtIGMoInZzaWNfbmV3X2MzIiwgInZzaWNfbmV3X2M0IiwgInNlY3Rvcl9uYW1lX25ldyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInZzaWNfb2xkX2MzIiwgInZzaWNfb2xkX2M0IiwgInNlY3Rvcl9uYW1lX29sZCIpDQoNCiMgUHJlcGFyZSBkYXRhIGZvciBjb3JyZWN0aW5nOiANCg0KdnNpY19jb252ZXJ0ZWQgJT4lIA0KICBmaWx0ZXIodnNpY19uZXdfYzMgIT0gdnNpY19vbGRfYzMpICU+JSANCiAgc2VsZWN0KHZzaWNfbmV3X2MzLCB2c2ljX29sZF9jMywgc2VjdG9yX25hbWVfbmV3LCBzZWN0b3JfbmFtZV9vbGQpIC0+IHZzaWNfZGlmZl9jMw0KDQp2c2ljX2NvbnZlcnRlZCAlPiUgDQogIGZpbHRlcih2c2ljX25ld19jNCAhPSB2c2ljX29sZF9jNCkgLT4gdnNpY19kaWZmX2M0DQoNCnZzaWNfZGlmZl9jNCAlPiUgDQogIGZpbHRlcighZHVwbGljYXRlZCh2c2ljX29sZF9jNCkpICU+JSANCiAgc2VsZWN0KHZzaWNfbmV3X2M0LCBjb2RlX2w0ID0gdnNpY19vbGRfYzQpIC0+IGNvbnZlcnRfdGFibGVfYzQNCg0KcmVhZF9leGNlbCgiZGZfc2VjdG9yX2NvZGUueGxzeCIpIC0+IGRmX3NlY3Rvcl9jb2RlDQoNCiMgUHJlcGFyZSBkYXRhIGZvciBjb3JyZWN0aW5nOiANCg0KZGZfc2VjdG9yX2NvZGUgJT4lIA0KICBtdXRhdGUoY29kZV9sZXZlbDEgPSBjYXNlX3doZW4oc3RyX2NvdW50KGNvZGVfbGV2ZWwxKSA9PSAwIH4gTkFfY2hhcmFjdGVyXywgVFJVRSB+IGNvZGVfbGV2ZWwxKSkgJT4lIA0KICBmaWxsKGNvZGVfbGV2ZWwxLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHNlY3Rvcl9uYW1lX2xhdGluLCAiW2Etel0iKSkgJT4lIA0KICBtdXRhdGUoY29kZV9sZXZlbDIgPSBjYXNlX3doZW4oc3RyX2NvdW50KGNvZGVfbGV2ZWwyKSA9PSAwIH4gTkFfY2hhcmFjdGVyXywgVFJVRSB+IGNvZGVfbGV2ZWwyKSkgJT4lIA0KICBmaWxsKGNvZGVfbGV2ZWwyLCAuZGlyZWN0aW9uID0gImRvd24iKSAtPiBkZl9zZWN0b3JfY29kZV9maWxsZWQNCg0KZGZfc2VjdG9yX2NvZGUgJT4lIA0KICBzZWxlY3QoY29kZV9sZXZlbDEsIHNlY3Rvcl9uYW1lX2xhdGluKSAlPiUgDQogIGZpbHRlcihzdHJfY291bnQoY29kZV9sZXZlbDEpICE9IDApIC0+IGRmX3NlY3Rvcl9sMQ0KDQpmdWxsX2pvaW4oZGZfc2VjdG9yX2wxLCANCiAgICAgICAgICBkZl9zZWN0b3JfY29kZV9maWxsZWQgJT4lIHNlbGVjdChjb2RlX2xldmVsMSwgY29kZV9sZXZlbDIpKSAtPiBkZl9zZWN0b3JfbDENCg0KZGZfc2VjdG9yX2wxICU+JSANCiAgcmVuYW1lKGNvZGVfbDIgPSBjb2RlX2xldmVsMikgJT4lIA0KICBmaWx0ZXIoIWR1cGxpY2F0ZWQoY29kZV9sMikpIC0+IGRmX3NlY3Rvcl9sMQ0KDQoNCmBgYA0KDQojIEZ1bmN0aW9ucyBmb3IgQ2xlYW5pbmcgVkVTIERhdGENCg0KYGBge3J9DQojIEZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nL2NsZWFuaW5nIGRhdGE6IA0KDQpjbGVhbmluZ19kYXRhX3RheF92c2ljX2NvZGUgPC0gZnVuY3Rpb24oeW91cl92ZXNfZGF0YSkgew0KICANCiAgIyBDb252ZXJ0IHRvIHRleHQgYW5kIGV4dHJhY3Qgc2VjdG9yIGNvZGVzIGF0IGFsbCBsZXZlbHM6IA0KICANCiAgeW91cl92ZXNfZGF0YSAlPiUgDQogICAgbXV0YXRlKG5nYW5oX2tkID0gYXMuY2hhcmFjdGVyKG5nYW5oX2tkKSkgJT4lIA0KICAgIG11dGF0ZShjb2RlX2wyID0gc3RyX3N1YihuZ2FuaF9rZCwgc3RhcnQgPSAxLCBlbmQgPSAyKSwgDQogICAgICAgICAgIGNvZGVfbDMgPSBzdHJfc3ViKG5nYW5oX2tkLCBzdGFydCA9IDEsIGVuZCA9IDMpLCANCiAgICAgICAgICAgY29kZV9sNCA9IHN0cl9zdWIobmdhbmhfa2QsIHN0YXJ0ID0gMSwgZW5kID0gNCksIA0KICAgICAgICAgICBjb2RlXzVfZW5kID0gc3RyX3N1YihuZ2FuaF9rZCwgc3RhcnQgPSA1LCBlbmQgPSA1KSkgLT4gdmVzX2RhdGENCiAgDQogICMgUmVtb3ZlIG1pc3NpbmcgYXQgbmdhbmhfa2Q6IA0KICANCiAgdmVzX2RhdGEgJT4lIGZpbHRlcighaXMubmEobmdhbmhfa2QpKSAtPiB2ZXNfZGF0YQ0KICANCiAgIyBSZW1vdmUgbWlzc2luZyBhdCBtYV90aHVlOiANCiAgDQogIHZlc19kYXRhICU+JSBmaWx0ZXIoIWlzLm5hKG1hX3RodWUpKSAtPiB2ZXNfZGF0YQ0KICANCiAgIy0tLS0tLS0tLS0tLS0tLQ0KICAjIFZTSUMgNSBkaWdpdHMNCiAgIy0tLS0tLS0tLS0tLS0tLQ0KICANCiAgdmVzX2RhdGEgJT4lIA0KICAgIG11dGF0ZShuZ2FuaF9rZCA9IGNhc2Vfd2hlbihzdHJfY291bnQobmdhbmhfa2QpID09IDQgfiBzdHJfYygiMCIsIG5nYW5oX2tkKSwgVFJVRSB+IG5nYW5oX2tkKSkgJT4lIA0KICAgIGZpbHRlcihzdHJfY291bnQobmdhbmhfa2QpID09IDUpIC0+IHZlc19kYXRhDQogIA0KICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAjIFRheCBjb2RlIHByb2Nlc3NpbmcNCiAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgDQogICMgUmVtb3ZlIG1pc3Npbmc6IA0KICANCiAgdmVzX2RhdGEgJT4lIGZpbHRlcighaXMubmEobWFfdGh1ZSkpIC0+IHZlc19kYXRhDQogIA0KICAjIFJlbW92ZSBkdXBsaWNhdGlvbnM6IA0KICANCiAgdmVzX2RhdGEgJT4lIGZpbHRlcighZHVwbGljYXRlZChtYV90aHVlKSkgLT4gdmVzX2RhdGENCiAgDQogICMgUmVtb3ZlIGNhc2VzICE9IDEwIGRpZ2l0czogDQogIA0KICB2ZXNfZGF0YSAlPiUgZmlsdGVyKHN0cl9jb3VudChtYV90aHVlKSA9PSAxMCkgLT4gdmVzX2RhdGENCg0KICByZXR1cm4odmVzX2RhdGEpDQogIA0KfQ0KDQoNCg0KIyBGdW5jdGlvbiBjb3JyZWN0cyBWU0lDIExldmVsIDM6IA0KDQpwcm9jZXNzX3ZzaWMzIDwtIGZ1bmN0aW9uKHlvdXJfZGYpIHsNCg0KICBmdWxsX2pvaW4oeW91cl9kZiwgDQogICAgICAgICAgICB2c2ljX2RpZmZfYzMgJT4lIHNlbGVjdCh2c2ljX25ld19jMywgY29kZV9sMyA9IHZzaWNfb2xkX2MzKSwNCiAgICAgICAgICAgIGJ5ID0gYygiY29kZV9sMyIpKSAtPiB5b3VyX2RmDQogIA0KICB5b3VyX2RmICU+JSANCiAgICBtdXRhdGUoY29kZV9sM19hZGogPSBjYXNlX3doZW4oaXMubmEodnNpY19uZXdfYzMpIH4gY29kZV9sMywgVFJVRSB+IHZzaWNfbmV3X2MzKSkgLT4gZmluYWxfZGYNCiAgDQogIHJldHVybihmaW5hbF9kZikNCn0NCg0KIyBGdW5jdGlvbiBjb3JyZWN0cyBWU0lDIExldmVsIDQ6DQoNCg0KcHJvY2Vzc192c2ljNCA8LSBmdW5jdGlvbih5b3VyX2RmKSB7DQogIA0KICBmdWxsX2pvaW4oeW91cl9kZiwgY29udmVydF90YWJsZV9jNCwgYnkgPSAiY29kZV9sNCIpIC0+IHlvdXJfZGYNCiAgDQogIHlvdXJfZGYgJT4lIA0KICAgIG11dGF0ZShjb2RlX2w0X2FkaiA9IGNhc2Vfd2hlbihpcy5uYSh2c2ljX25ld19jNCkgfiBjb2RlX2w0LCBUUlVFIH4gdnNpY19uZXdfYzQpKSAlPiUgDQogICAgbXV0YXRlKG5nYW5oX2tkX2FkaiA9IHN0cl9jKGNvZGVfbDRfYWRqLCBjb2RlXzVfZW5kKSkgJT4lIA0KICAgIG11dGF0ZShjb2RlX2wyX2FkaiA9IHN0cl9zdWIobmdhbmhfa2RfYWRqLCBzdGFydCA9IDEsIGVuZCA9IDIpKSAtPiBmaW5hbF9kZg0KICANCiAgcmV0dXJuKGZpbmFsX2RmKQ0KICANCn0NCg0KDQojIEZ1bnRpb25zIGpvaW4gc2VjdG9yIG5hbWU6IA0KDQphZGRfc2VjdG9yX25hbWVfYXRfbGV2ZWxfMSA8LSBmdW5jdGlvbih5b3VyX2RmKSB7DQogIA0KICBpbm5lcl9qb2luKHlvdXJfZGYsIA0KICAgICAgICAgICAgIGRmX3NlY3Rvcl9sMSwgDQogICAgICAgICAgICAgYnkgPSBjKCJjb2RlX2wyX2FkaiIgPSAiY29kZV9sMiIpKSAtPiBmaW5hbF9kZg0KICANCiAgcmV0dXJuKGZpbmFsX2RmKQ0KICANCn0NCg0KYGBgDQoNCiMgVXNlIFRoZSBGdW5jdGlvbnMNCg0KYGBge3J9DQpsaWJyYXJ5KGhhdmVuKSAjIEZvciBpbXBvcnRpbmcgZGF0YSBmcm9tIFN0YXRhIGZpbGVzOiANCg0KcmVhZF9kdGEoIkY6XFxWRVNfZnJvbV9NYWlWdV9GVFVcXFN0YXRhXzIwMTVcXGRuMjAxNS5kdGEiKSAlPiUgDQogIGNsZWFuaW5nX2RhdGFfdGF4X3ZzaWNfY29kZSgpICU+JSANCiAgcHJvY2Vzc192c2ljMygpICU+JSANCiAgcHJvY2Vzc192c2ljNCgpICU+JSANCiAgYWRkX3NlY3Rvcl9uYW1lX2F0X2xldmVsXzEoKSAtPiBkbjIwMTVfYWZ0ZXJfcHJvY2Vzc2luZw0KYGBgDQoNCiMgRm9yIFJlcG9ydGluZw0KDQpgYGB7cn0NCmxpYnJhcnkoa25pdHIpDQoNCmRuMjAxNV9hZnRlcl9wcm9jZXNzaW5nICU+JSANCiAgZmlsdGVyKCFpcy5uYShrcWtkMSkpICU+JSANCiAgZ3JvdXBfYnkoc2VjdG9yX25hbWVfbGF0aW4pICU+JSANCiAgc3VtbWFyaXNlKE1pbiA9IG1pbihrcWtkMSksIA0KICAgICAgICAgICAgTWF4ID0gbWF4KGtxa2QxKSwgDQogICAgICAgICAgICBTRCA9IHNkKGtxa2QxKSwgDQogICAgICAgICAgICBNZWRpYW4gPSBtZWRpYW4oa3FrZDEpLCANCiAgICAgICAgICAgIE5fb2JzID0gbigpKSAlPiUgDQogIGFycmFuZ2UoLU5fb2JzKSAlPiUgDQogIG11dGF0ZShzZWN0b3JfbmFtZV9zaG9ydCA9IHN0cl9zdWIoc2VjdG9yX25hbWVfbGF0aW4sIDEsIDIwKSkgJT4lIA0KICBzZWxlY3QoLXNlY3Rvcl9uYW1lX2xhdGluKSAlPiUgDQogIHNlbGVjdChzZWN0b3JfbmFtZV9zaG9ydCwgZXZlcnl0aGluZygpKSAlPiUgDQogIGthYmxlKCkNCmBgYA0KDQoNCg0K