Common Household Codes from 2016 to 2012

Nếu sử dụng Panel Data thì việc xác định mỗi một cá thể (hộ gia đình hay doanh nghiệp) từ năm này qua năm khác là quan trọng. Điều này đã được giải thích với R Codes tại đây.

Nhắc lại rằng mỗi một hộ gia đình có ID được hình thành từ mã của 5 cột biến: tỉnh, huyện, xã, địa bàn, hộ số. Vấn đề đầu tiên là chúng ta cần chuẩn hóa các mã này một cách thống nhất cho những mục đích sử dụng xa hơn sau này. Chẳng hạn, tỉnh có mã là 1 thì cần phải chuẩn hóa về 01 (tương ứng với Hà Nội). Mã tỉnh code chuẩn sử dụng 2 chữ số và do vậy với các tỉnh là số tự nhiên bé hơn 9 thì chúng ta phải thêm 1 số 0 đằng trước. Tương tự là Huyện sử dụng 3 chữ số đễ mã hóa. Do vậy với huyện mà chỉ sử dụng 1 chữ số thì chúng ta chuẩn hóa bằng cách thêm 2 chữ số 0 đằng trước, với huyện có mã là 2 chữ số thì thêm 1 chữ số 0 đằng trước. Cách thức chuẩn hóa này áp dụng tương tự cho các biến còn lại là xã, địa bàn và hộ số.

Chúng ta viết hàm có tên add_zero() để chuẩn hóa mã hành chính:

# Clear R environment: 

rm(list = ls())

# Function creates full code by adding zeros: 

add_zero <- function(x) {
  
  tibble(x_text = as.character(x)) %>% 
    mutate(n_digits = str_count(x_text),
           n_max = max(n_digits, na.rm = TRUE), 
           delta = n_max - n_digits, 
           pre = strrep("0", times = delta), 
           full_code = str_c(pre, x_text)) %>% 
    pull(full_code) %>% 
    return()
}

Hàm trên được sử dụng để xác định common codes của các hộ gia đình cho giai đoạn 2012 - 2014 - 2016 với chi tiết được trình bày ngay sau đây với lưu ý rằng: để biết một hộ gia đình vào năm 2016 có được khảo sát ở kì khảo sát hai năm trước đó (năm 2014) hay không thì chúng ta cần sử dụng HO1.dta. Ở bộ dữ liệu này thì các cột tinh14, huyen14, xa14, diaban14, hoso14 sẽ cho biết hộ có được khảo sát ở năm 2014 hay không và sẽ tương ứng với giá trị 1, ngược lại là 0. Trước hết load một số gói, đọc bộ dữ liệu này và sử dụng hàm đã có để tạo ra cột biến h_code16, h_code14 với hàm ý là mã hộ gia đình tương ứng với 2016 và 2014:

# Load some R packages: 
library(dplyr)
library(tidyr)
library(stringr)
library(stringi)
library(haven)

#=====================================
#  Stage 1: Common Household Codes
#=====================================

#----------------------------
# Household codes 2016-2014
#----------------------------

# Import data: 
read_dta("D:/VHLSS2016/HO1.dta") -> ho1_2016

# Create household code columns: 

ho1_2016 %>% 
  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_code16 = str_c(tinh_n,
                          huyen_n,
                          xa_n, 
                          diaban_n,
                          hoso_n)) %>% 
  mutate(h_code14 = str_c(add_zero(tinh14), 
                          add_zero(huyen14), 
                          add_zero(xa14), 
                          add_zero(diaban14), 
                          add_zero(hoso14))) -> ho1_2016

Như vậy những hộ mà được khảo sát cả ở hai năm 2016 - 2014 sẽ là những hộ mà h_code16 == h_code14:

# Common codes 2016-2014: 

ho1_2016 %>% 
  filter(h_code16 == h_code14) %>% 
  pull(h_code16) %>% 
  unique() -> h_code_16_14

Tương tự là common codes cho giai đoạn 2014 - 2012:

#----------------------------
# Household codes 2014-2012
#----------------------------

# Import data: 
read_dta("D:/VHLSS2014_Households/Ho1.dta") -> ho1_2014

# Create household code columns: 

ho1_2014 %>% 
  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_code14 = str_c(tinh_n,
                          huyen_n,
                          xa_n, 
                          diaban_n,
                          hoso_n)) %>% 
  mutate(h_code12 = str_c(add_zero(tinh12), 
                          add_zero(huyen12), 
                          add_zero(xa12), 
                          add_zero(diaban12), 
                          add_zero(hoso12))) -> ho1_2014

# Common codes 2014-2012: 

ho1_2014 %>% 
  filter(h_code14 == h_code12) %>% 
  pull(h_code14) %>% 
  unique() -> h_code_14_12

Common codes cho toàn bộ giai đoạn 2016 - 2014 - 2012:

#----------------------------------
#  Household codes 2016-2014-2012
#----------------------------------

base::intersect(h_code_16_14, h_code_14_12) -> h_code_common

Theo lí thuyết thì nếu tracking hộ gia đình trong giai đoạn 2016 - 2014 - 2012 theo h_code_common như ở trên thì bất kể chọn tiêu chí gì ta cũng sẽ có Balanced Panel Data. Tuy nhiên kì vọng này có thể không được thỏa mãn.

Prepare Alcohol Consumption

Số liệu về tiêu dùng bia + rượu được phỏng vấn hộ gia đình qua câu hỏi "Trong 30 ngày vừa qua đã tiêu dùng những mặt hàng nào? được mã hóa ở cột m5a2ma thuộc Muc5a2.dta và giá trị quy đổi về tiền tương ứng với cột m5a2c2b. Chú ý rằng bia + rượu được mã hóa bằng 144 và 145. Từ đó tính được tổng tiêu dùng hai mặt hàng này cho hộ gia đình ở các năm 2016 - 2014 - 2012 như sau:

#=================================
#  Stage 2: Alcohol Consumption
#=================================

#--------------------------------
# Alcohld consumption 2012-2016
#--------------------------------

# For 2016: 

read_dta("D:\\VHLSS2016\\Muc5a2.dta") -> alcohol_16

alcohol_16 %>% 
  filter(m5a2ma %in% c(144, 145)) %>% 
  mutate(h_code = str_c(add_zero(tinh), 
                        add_zero(huyen), 
                        add_zero(xa), 
                        add_zero(diaban), 
                        add_zero(hoso))) %>% 
  filter(h_code %in% h_code_common) %>% 
  select(tinh, h_code, alcohol_code = m5a2ma, alcohol_con = m5a2c2b) %>% 
  group_by(h_code, tinh) %>% 
  summarise(total_alcohol_con = sum(alcohol_con)) %>% 
  ungroup() %>% 
  mutate(year = 2016) -> alcohol_year16


# For 2014: 

read_dta("D:\\VHLSS2014_Households\\Muc5a2.dta") -> alcohol_14


alcohol_14 %>% 
  filter(m5a2ma %in% c(144, 145)) %>% 
  mutate(h_code = str_c(add_zero(tinh), 
                        add_zero(huyen), 
                        add_zero(xa), 
                        add_zero(diaban), 
                        add_zero(hoso))) %>% 
  filter(h_code %in% h_code_common) %>% 
  select(tinh, h_code, alcohol_code = m5a2ma, alcohol_con = m5a2c2b) %>% 
  group_by(h_code, tinh) %>% 
  summarise(total_alcohol_con = sum(alcohol_con)) %>% 
  ungroup() %>% 
  mutate(year = 2014) -> alcohol_year14


# For 2012: 

read_dta("D:\\VHLSS2012\\Muc5a2.dta") -> alcohol_12


alcohol_12 %>% 
  filter(m5a2ma %in% c(144, 145)) %>% 
  mutate(h_code = str_c(add_zero(tinh), 
                        add_zero(huyen), 
                        add_zero(xa), 
                        add_zero(diaban), 
                        add_zero(hoso))) %>% 
  filter(h_code %in% h_code_common) %>% 
  select(tinh, h_code, alcohol_code = m5a2ma, alcohol_con = m5a2c2b) %>% 
  group_by(h_code, tinh) %>% 
  summarise(total_alcohol_con = sum(alcohol_con)) %>% 
  ungroup() %>% 
  mutate(year = 2012) -> alcohol_year12

Đến đây chúng ta có thể tạo ra Panel Data cho tổng tiêu dùng rượu bia giai đoạn 2016 - 2012 như sau:

alcohol_year16 %>% 
  bind_rows(alcohol_year14) %>% 
  bind_rows(alcohol_year12) %>% 
  arrange(h_code) -> data_alcohol_consumption

Chúng ta có thể xem một số quan sát:

data_alcohol_consumption %>% 
  select(-tinh) %>% 
  head()
## # A tibble: 6 x 3
##   h_code          total_alcohol_con  year
##   <chr>                       <dbl> <dbl>
## 1 010010000400815                30  2016
## 2 010010000400815               120  2012
## 3 010010002802514               144  2012
## 4 010020006701613               240  2016
## 5 010020006701613                15  2014
## 6 010020006701613               160  2012

Như vậy hộ có h_code = 010020006701613 có đủ dữ liệu trong ba năm liên tiếp còn hộ có h_code = 010010000400815 chỉ có mặt trong hai năm. Có thể nói bộ dữ liệu là Unbalanced Panel Data. Muốn có Balanced Panel Data chúng ta chỉ cần thực hiện một bước chuẩn bị nữa như sau:

# Households from 2016-2-14-2012: 
data_alcohol_consumption %>% 
  group_by(h_code) %>% 
  count() %>% 
  ungroup() %>% 
  filter(n == 3) %>% 
  pull(h_code) -> full_16_14_12

# Balanced Panel Data: 
data_alcohol_consumption %>% 
  filter(h_code %in% full_16_14_12) -> alcohol_consumption_balanced

Lúc này chỉ còn 520 hộ gia đình có đầy đủ dữ liệu về tổng tiêu dùng bia + rượu trong ba năm liên tiếp.

Final Notes

Các biến số khác sẽ được chuẩn bị và tính toán theo logic đã trình bày ở trên.

LS0tDQp0aXRsZTogJ0FsY29ob2wgUHJvamVjdDogVkhMU1MgRGF0YSBmcm9tIEdTTycNCmF1dGhvcjogJ0F1dGhvcjogSEMgVmFuIGFuZCBOZ3V5ZW4gQ2hpIER1bmcnDQpzdWJ0aXRsZTogIlIgRWNvbm9tZXRyaWNzIFNlcmllcyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICMgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgIyBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiAiZmxhdGx5Ig0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUUpDQoNCmBgYA0KDQojIENvbW1vbiBIb3VzZWhvbGQgQ29kZXMgZnJvbSAyMDE2IHRvIDIwMTINCg0KTuG6v3Ugc+G7rSBk4bulbmcgUGFuZWwgRGF0YSB0aMOsIHZp4buHYyB4w6FjIMSR4buLbmggbeG7l2kgbeG7mXQgY8OhIHRo4buDICho4buZIGdpYSDEkcOsbmggaGF5IGRvYW5oIG5naGnhu4dwKSB04burIG7Eg20gbsOgeSBxdWEgbsSDbSBraMOhYyBsw6AgcXVhbiB0cuG7jW5nLiDEkGnhu4F1IG7DoHkgxJHDoyDEkcaw4bujYyBnaeG6o2kgdGjDrWNoIHbhu5tpIFIgQ29kZXMgW3ThuqFpIMSRw6J5XShodHRwczovL3JwdWJzLmNvbS9jaGlkdW5na3QvNzkwMzkyKS4gDQoNCk5o4bqvYyBs4bqhaSBy4bqxbmcgbeG7l2kgbeG7mXQgaOG7mSBnaWEgxJHDrG5oIGPDsyBJRCDEkcaw4bujYyBow6xuaCB0aMOgbmggdOG7qyBtw6MgY+G7p2EgNSBj4buZdCBiaeG6v246IHThu4luaCwgaHV54buHbiwgeMOjLCDEkeG7i2EgYsOgbiwgaOG7mSBz4buRLiBW4bqlbiDEkeG7gSDEkeG6p3UgdGnDqm4gbMOgIGNow7puZyB0YSBj4bqnbiBjaHXhuqluIGjDs2EgY8OhYyBtw6MgbsOgeSBt4buZdCBjw6FjaCB0aOG7kW5nIG5o4bqldCBjaG8gbmjhu69uZyBt4bulYyDEkcOtY2ggc+G7rSBk4bulbmcgeGEgaMahbiBzYXUgbsOgeS4gQ2jhurNuZyBo4bqhbiwgdOG7iW5oIGPDsyBtw6MgbMOgIDEgdGjDrCBj4bqnbiBwaOG6o2kgY2h14bqpbiBow7NhIHbhu4EgMDEgKHTGsMahbmcg4bupbmcgduG7m2kgSMOgIE7hu5lpKS4gTcOjIHThu4luaCBjb2RlIGNodeG6qW4gc+G7rSBk4bulbmcgMiBjaOG7ryBz4buRIHbDoCBkbyB24bqteSB24bubaSBjw6FjIHThu4luaCBsw6Agc+G7kSB04buxIG5oacOqbiBiw6kgaMahbiA5IHRow6wgY2jDum5nIHRhIHBo4bqjaSB0aMOqbSAxIHPhu5EgMCDEkeG6sW5nIHRyxrDhu5tjLiBUxrDGoW5nIHThu7EgbMOgIEh1eeG7h24gc+G7rSBk4bulbmcgMyBjaOG7ryBz4buRIMSR4buFIG3DoyBow7NhLiBEbyB24bqteSB24bubaSBodXnhu4duIG3DoCBjaOG7iSBz4butIGThu6VuZyAxIGNo4buvIHPhu5EgdGjDrCBjaMO6bmcgdGEgY2h14bqpbiBow7NhIGLhurFuZyBjw6FjaCB0aMOqbSAyIGNo4buvIHPhu5EgMCDEkeG6sW5nIHRyxrDhu5tjLCB24bubaSBodXnhu4duIGPDsyBtw6MgbMOgIDIgY2jhu68gc+G7kSB0aMOsIHRow6ptIDEgY2jhu68gc+G7kSAwIMSR4bqxbmcgdHLGsOG7m2MuIEPDoWNoIHRo4bupYyBjaHXhuqluIGjDs2EgbsOgeSDDoXAgZOG7pW5nIHTGsMahbmcgdOG7sSBjaG8gY8OhYyBiaeG6v24gY8OybiBs4bqhaSBsw6AgeMOjLCDEkeG7i2EgYsOgbiB2w6AgaOG7mSBz4buRLg0KDQpDaMO6bmcgdGEgdmnhur90IGjDoG0gY8OzIHTDqm4gKiphZGRfemVybygpKiogxJHhu4MgY2h14bqpbiBow7NhIG3DoyBow6BuaCBjaMOtbmg6DQoNCg0KYGBge3J9DQojIENsZWFyIFIgZW52aXJvbm1lbnQ6IA0KDQpybShsaXN0ID0gbHMoKSkNCg0KIyBGdW5jdGlvbiBjcmVhdGVzIGZ1bGwgY29kZSBieSBhZGRpbmcgemVyb3M6IA0KDQphZGRfemVybyA8LSBmdW5jdGlvbih4KSB7DQogIA0KICB0aWJibGUoeF90ZXh0ID0gYXMuY2hhcmFjdGVyKHgpKSAlPiUgDQogICAgbXV0YXRlKG5fZGlnaXRzID0gc3RyX2NvdW50KHhfdGV4dCksDQogICAgICAgICAgIG5fbWF4ID0gbWF4KG5fZGlnaXRzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgZGVsdGEgPSBuX21heCAtIG5fZGlnaXRzLCANCiAgICAgICAgICAgcHJlID0gc3RycmVwKCIwIiwgdGltZXMgPSBkZWx0YSksIA0KICAgICAgICAgICBmdWxsX2NvZGUgPSBzdHJfYyhwcmUsIHhfdGV4dCkpICU+JSANCiAgICBwdWxsKGZ1bGxfY29kZSkgJT4lIA0KICAgIHJldHVybigpDQp9DQpgYGANCg0KSMOgbSB0csOqbiDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB4w6FjIMSR4buLbmggY29tbW9uIGNvZGVzIGPhu6dhIGPDoWMgaOG7mSBnaWEgxJHDrG5oIGNobyBnaWFpIMSRb+G6oW4gMjAxMiAtIDIwMTQgLSAyMDE2IHbhu5tpIGNoaSB0aeG6v3QgxJHGsOG7o2MgdHLDrG5oIGLDoHkgbmdheSBzYXUgxJHDonkgduG7m2kgbMawdSDDvSBy4bqxbmc6IMSR4buDIGJp4bq/dCBt4buZdCBo4buZIGdpYSDEkcOsbmggdsOgbyBuxINtIDIwMTYgY8OzIMSRxrDhu6NjIGto4bqjbyBzw6F0IOG7nyBrw6wga2jhuqNvIHPDoXQgaGFpIG7Eg20gdHLGsOG7m2MgxJHDsyAobsSDbSAyMDE0KSBoYXkga2jDtG5nIHRow6wgY2jDum5nIHRhIGPhuqduIHPhu60gZOG7pW5nICpITzEuZHRhKi4g4bueIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSB0aMOsIGPDoWMgY+G7mXQgdGluaDE0LCBodXllbjE0LCB4YTE0LCBkaWFiYW4xNCwgaG9zbzE0IHPhur0gY2hvIGJp4bq/dCBo4buZIGPDsyDEkcaw4bujYyBraOG6o28gc8OhdCDhu58gbsSDbSAyMDE0IGhheSBraMO0bmcgdsOgIHPhur0gdMawxqFuZyDhu6luZyB24bubaSBnacOhIHRy4buLIDEsIG5nxrDhu6NjIGzhuqFpIGzDoCAwLiBUcsaw4bubYyBo4bq/dCBsb2FkIG3hu5l0IHPhu5EgZ8OzaSwgxJHhu41jIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSB2w6Agc+G7rSBk4bulbmcgaMOgbSDEkcOjIGPDsyDEkeG7gyB04bqhbyByYSBj4buZdCBiaeG6v24gaF9jb2RlMTYsIGhfY29kZTE0IHbhu5tpIGjDoG0gw70gbMOgIG3DoyBo4buZIGdpYSDEkcOsbmggdMawxqFuZyDhu6luZyB24bubaSAyMDE2IHbDoCAyMDE0OiANCg0KDQpgYGB7cn0NCiMgTG9hZCBzb21lIFIgcGFja2FnZXM6IA0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KGhhdmVuKQ0KDQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAgU3RhZ2UgMTogQ29tbW9uIEhvdXNlaG9sZCBDb2Rlcw0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgSG91c2Vob2xkIGNvZGVzIDIwMTYtMjAxNA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBJbXBvcnQgZGF0YTogDQpyZWFkX2R0YSgiRDovVkhMU1MyMDE2L0hPMS5kdGEiKSAtPiBobzFfMjAxNg0KDQojIENyZWF0ZSBob3VzZWhvbGQgY29kZSBjb2x1bW5zOiANCg0KaG8xXzIwMTYgJT4lIA0KICBtdXRhdGUodGluaF9uID0gYWRkX3plcm8odGluaCksIA0KICAgICAgICAgaHV5ZW5fbiA9IGFkZF96ZXJvKGh1eWVuKSwgDQogICAgICAgICB4YV9uID0gYWRkX3plcm8oeGEpLCANCiAgICAgICAgIGRpYWJhbl9uID0gYWRkX3plcm8oZGlhYmFuKSwgDQogICAgICAgICBob3NvX24gPSBhZGRfemVybyhob3NvKSkgJT4lIA0KICBtdXRhdGUoaF9jb2RlMTYgPSBzdHJfYyh0aW5oX24sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGh1eWVuX24sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHhhX24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFiYW5fbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zb19uKSkgJT4lIA0KICBtdXRhdGUoaF9jb2RlMTQgPSBzdHJfYyhhZGRfemVybyh0aW5oMTQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3plcm8oaHV5ZW4xNCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfemVybyh4YTE0KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF96ZXJvKGRpYWJhbjE0KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF96ZXJvKGhvc28xNCkpKSAtPiBobzFfMjAxNg0KYGBgDQoNCk5oxrAgduG6rXkgbmjhu69uZyBo4buZIG3DoCDEkcaw4bujYyBraOG6o28gc8OhdCBj4bqjIOG7nyBoYWkgbsSDbSAyMDE2IC0gMjAxNCBz4bq9IGzDoCBuaOG7r25nIGjhu5kgbcOgIGhfY29kZTE2ID09IGhfY29kZTE0OiANCg0KYGBge3J9DQojIENvbW1vbiBjb2RlcyAyMDE2LTIwMTQ6IA0KDQpobzFfMjAxNiAlPiUgDQogIGZpbHRlcihoX2NvZGUxNiA9PSBoX2NvZGUxNCkgJT4lIA0KICBwdWxsKGhfY29kZTE2KSAlPiUgDQogIHVuaXF1ZSgpIC0+IGhfY29kZV8xNl8xNA0KYGBgDQoNClTGsMahbmcgdOG7sSBsw6AgY29tbW9uIGNvZGVzIGNobyBnaWFpIMSRb+G6oW4gMjAxNCAtIDIwMTI6IA0KDQpgYGB7cn0NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIEhvdXNlaG9sZCBjb2RlcyAyMDE0LTIwMTINCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgSW1wb3J0IGRhdGE6IA0KcmVhZF9kdGEoIkQ6L1ZITFNTMjAxNF9Ib3VzZWhvbGRzL0hvMS5kdGEiKSAtPiBobzFfMjAxNA0KDQojIENyZWF0ZSBob3VzZWhvbGQgY29kZSBjb2x1bW5zOiANCg0KaG8xXzIwMTQgJT4lIA0KICBtdXRhdGUodGluaF9uID0gYWRkX3plcm8odGluaCksIA0KICAgICAgICAgaHV5ZW5fbiA9IGFkZF96ZXJvKGh1eWVuKSwgDQogICAgICAgICB4YV9uID0gYWRkX3plcm8oeGEpLCANCiAgICAgICAgIGRpYWJhbl9uID0gYWRkX3plcm8oZGlhYmFuKSwgDQogICAgICAgICBob3NvX24gPSBhZGRfemVybyhob3NvKSkgJT4lIA0KICBtdXRhdGUoaF9jb2RlMTQgPSBzdHJfYyh0aW5oX24sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGh1eWVuX24sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHhhX24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFiYW5fbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zb19uKSkgJT4lIA0KICBtdXRhdGUoaF9jb2RlMTIgPSBzdHJfYyhhZGRfemVybyh0aW5oMTIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3plcm8oaHV5ZW4xMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfemVybyh4YTEyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF96ZXJvKGRpYWJhbjEyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF96ZXJvKGhvc28xMikpKSAtPiBobzFfMjAxNA0KDQojIENvbW1vbiBjb2RlcyAyMDE0LTIwMTI6IA0KDQpobzFfMjAxNCAlPiUgDQogIGZpbHRlcihoX2NvZGUxNCA9PSBoX2NvZGUxMikgJT4lIA0KICBwdWxsKGhfY29kZTE0KSAlPiUgDQogIHVuaXF1ZSgpIC0+IGhfY29kZV8xNF8xMg0KYGBgDQoNCkNvbW1vbiBjb2RlcyBjaG8gdG/DoG4gYuG7mSBnaWFpIMSRb+G6oW4gIDIwMTYgLSAyMDE0IC0gMjAxMjogDQoNCmBgYHtyfQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIEhvdXNlaG9sZCBjb2RlcyAyMDE2LTIwMTQtMjAxMg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KYmFzZTo6aW50ZXJzZWN0KGhfY29kZV8xNl8xNCwgaF9jb2RlXzE0XzEyKSAtPiBoX2NvZGVfY29tbW9uDQpgYGANCg0KVGhlbyBsw60gdGh1eeG6v3QgdGjDrCBu4bq/dSB0cmFja2luZyBo4buZIGdpYSDEkcOsbmggdHJvbmcgZ2lhaSDEkW/huqFuIDIwMTYgLSAyMDE0IC0gMjAxMiB0aGVvIGhfY29kZV9jb21tb24gbmjGsCDhu58gdHLDqm4gdGjDrCBi4bqldCBr4buDIGNo4buNbiB0acOqdSBjaMOtIGfDrCB0YSBjxaluZyBz4bq9IGPDsyBCYWxhbmNlZCBQYW5lbCBEYXRhLiBUdXkgbmhpw6puIGvDrCB24buNbmcgbsOgeSBjw7MgdGjhu4Mga2jDtG5nIMSRxrDhu6NjIHRo4buPYSBtw6NuLiANCg0KDQojIFByZXBhcmUgQWxjb2hvbCBDb25zdW1wdGlvbg0KDQpT4buRIGxp4buHdSB24buBIHRpw6p1IGTDuW5nIGJpYSArIHLGsOG7o3UgxJHGsOG7o2MgcGjhu49uZyB24bqlbiBo4buZIGdpYSDEkcOsbmggcXVhIGPDonUgaOG7j2kgKiJUcm9uZyAzMCBuZ8OgeSB24burYSBxdWEgxJHDoyB0acOqdSBkw7luZyBuaOG7r25nIG3hurd0IGjDoG5nIG7DoG8/KiDEkcaw4bujYyBtw6MgaMOzYSDhu58gY+G7mXQgbTVhMm1hIHRodeG7mWMgKipNdWM1YTIuZHRhKiogdsOgIGdpw6EgdHLhu4sgcXV5IMSR4buVaSB24buBIHRp4buBbiB0xrDGoW5nIOG7qW5nIHbhu5tpIGPhu5l0IG01YTJjMmIuIENow7ogw70gcuG6sW5nIGJpYSArIHLGsOG7o3UgxJHGsOG7o2MgbcOjIGjDs2EgYuG6sW5nIDE0NCB2w6AgMTQ1LiBU4burIMSRw7MgdMOtbmggxJHGsOG7o2MgdOG7lW5nIHRpw6p1IGTDuW5nIGhhaSBt4bq3dCBow6BuZyBuw6B5IGNobyBo4buZIGdpYSDEkcOsbmgg4bufIGPDoWMgbsSDbSAyMDE2IC0gMjAxNCAtIDIwMTIgbmjGsCBzYXU6IA0KDQpgYGB7cn0NCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgIFN0YWdlIDI6IEFsY29ob2wgQ29uc3VtcHRpb24NCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIEFsY29obGQgY29uc3VtcHRpb24gMjAxMi0yMDE2DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBGb3IgMjAxNjogDQoNCnJlYWRfZHRhKCJEOlxcVkhMU1MyMDE2XFxNdWM1YTIuZHRhIikgLT4gYWxjb2hvbF8xNg0KDQphbGNvaG9sXzE2ICU+JSANCiAgZmlsdGVyKG01YTJtYSAlaW4lIGMoMTQ0LCAxNDUpKSAlPiUgDQogIG11dGF0ZShoX2NvZGUgPSBzdHJfYyhhZGRfemVybyh0aW5oKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBhZGRfemVybyhodXllbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3plcm8oeGEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZF96ZXJvKGRpYWJhbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3plcm8oaG9zbykpKSAlPiUgDQogIGZpbHRlcihoX2NvZGUgJWluJSBoX2NvZGVfY29tbW9uKSAlPiUgDQogIHNlbGVjdCh0aW5oLCBoX2NvZGUsIGFsY29ob2xfY29kZSA9IG01YTJtYSwgYWxjb2hvbF9jb24gPSBtNWEyYzJiKSAlPiUgDQogIGdyb3VwX2J5KGhfY29kZSwgdGluaCkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfYWxjb2hvbF9jb24gPSBzdW0oYWxjb2hvbF9jb24pKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh5ZWFyID0gMjAxNikgLT4gYWxjb2hvbF95ZWFyMTYNCg0KDQojIEZvciAyMDE0OiANCg0KcmVhZF9kdGEoIkQ6XFxWSExTUzIwMTRfSG91c2Vob2xkc1xcTXVjNWEyLmR0YSIpIC0+IGFsY29ob2xfMTQNCg0KDQphbGNvaG9sXzE0ICU+JSANCiAgZmlsdGVyKG01YTJtYSAlaW4lIGMoMTQ0LCAxNDUpKSAlPiUgDQogIG11dGF0ZShoX2NvZGUgPSBzdHJfYyhhZGRfemVybyh0aW5oKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBhZGRfemVybyhodXllbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3plcm8oeGEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZF96ZXJvKGRpYWJhbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3plcm8oaG9zbykpKSAlPiUgDQogIGZpbHRlcihoX2NvZGUgJWluJSBoX2NvZGVfY29tbW9uKSAlPiUgDQogIHNlbGVjdCh0aW5oLCBoX2NvZGUsIGFsY29ob2xfY29kZSA9IG01YTJtYSwgYWxjb2hvbF9jb24gPSBtNWEyYzJiKSAlPiUgDQogIGdyb3VwX2J5KGhfY29kZSwgdGluaCkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfYWxjb2hvbF9jb24gPSBzdW0oYWxjb2hvbF9jb24pKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh5ZWFyID0gMjAxNCkgLT4gYWxjb2hvbF95ZWFyMTQNCg0KDQojIEZvciAyMDEyOiANCg0KcmVhZF9kdGEoIkQ6XFxWSExTUzIwMTJcXE11YzVhMi5kdGEiKSAtPiBhbGNvaG9sXzEyDQoNCg0KYWxjb2hvbF8xMiAlPiUgDQogIGZpbHRlcihtNWEybWEgJWluJSBjKDE0NCwgMTQ1KSkgJT4lIA0KICBtdXRhdGUoaF9jb2RlID0gc3RyX2MoYWRkX3plcm8odGluaCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3plcm8oaHV5ZW4pLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZF96ZXJvKHhhKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBhZGRfemVybyhkaWFiYW4pLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZF96ZXJvKGhvc28pKSkgJT4lIA0KICBmaWx0ZXIoaF9jb2RlICVpbiUgaF9jb2RlX2NvbW1vbikgJT4lIA0KICBzZWxlY3QodGluaCwgaF9jb2RlLCBhbGNvaG9sX2NvZGUgPSBtNWEybWEsIGFsY29ob2xfY29uID0gbTVhMmMyYikgJT4lIA0KICBncm91cF9ieShoX2NvZGUsIHRpbmgpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX2FsY29ob2xfY29uID0gc3VtKGFsY29ob2xfY29uKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoeWVhciA9IDIwMTIpIC0+IGFsY29ob2xfeWVhcjEyDQpgYGANCg0KxJDhur9uIMSRw6J5IGNow7puZyB0YSBjw7MgdGjhu4MgdOG6oW8gcmEgUGFuZWwgRGF0YSBjaG8gdOG7lW5nIHRpw6p1IGTDuW5nIHLGsOG7o3UgYmlhIGdpYWkgxJFv4bqhbiAyMDE2IC0gMjAxMiBuaMawIHNhdTogDQoNCg0KYGBge3J9DQphbGNvaG9sX3llYXIxNiAlPiUgDQogIGJpbmRfcm93cyhhbGNvaG9sX3llYXIxNCkgJT4lIA0KICBiaW5kX3Jvd3MoYWxjb2hvbF95ZWFyMTIpICU+JSANCiAgYXJyYW5nZShoX2NvZGUpIC0+IGRhdGFfYWxjb2hvbF9jb25zdW1wdGlvbg0KYGBgDQoNCkNow7puZyB0YSBjw7MgdGjhu4MgeGVtIG3hu5l0IHPhu5EgcXVhbiBzw6F0OiANCg0KYGBge3J9DQpkYXRhX2FsY29ob2xfY29uc3VtcHRpb24gJT4lIA0KICBzZWxlY3QoLXRpbmgpICU+JSANCiAgaGVhZCgpDQpgYGANCg0KTmjGsCB24bqteSBo4buZIGPDsyBoX2NvZGUgPSAwMTAwMjAwMDY3MDE2MTMgY8OzIMSR4bunIGThu68gbGnhu4d1IHRyb25nIGJhIG7Eg20gbGnDqm4gdGnhur9wIGPDsm4gaOG7mSBjw7MgaF9jb2RlID0gMDEwMDEwMDAwNDAwODE1IGNo4buJIGPDsyBt4bq3dCB0cm9uZyBoYWkgbsSDbS4gQ8OzIHRo4buDIG7Ds2kgYuG7mSBk4buvIGxp4buHdSBsw6AgVW5iYWxhbmNlZCBQYW5lbCBEYXRhLiBNdeG7kW4gY8OzIEJhbGFuY2VkIFBhbmVsIERhdGEgY2jDum5nIHRhIGNo4buJIGPhuqduIHRo4buxYyBoaeG7h24gbeG7mXQgYsaw4bubYyBjaHXhuqluIGLhu4sgbuG7r2EgbmjGsCBzYXU6IA0KDQpgYGB7cn0NCiMgSG91c2Vob2xkcyBmcm9tIDIwMTYtMi0xNC0yMDEyOiANCmRhdGFfYWxjb2hvbF9jb25zdW1wdGlvbiAlPiUgDQogIGdyb3VwX2J5KGhfY29kZSkgJT4lIA0KICBjb3VudCgpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKG4gPT0gMykgJT4lIA0KICBwdWxsKGhfY29kZSkgLT4gZnVsbF8xNl8xNF8xMg0KDQojIEJhbGFuY2VkIFBhbmVsIERhdGE6IA0KZGF0YV9hbGNvaG9sX2NvbnN1bXB0aW9uICU+JSANCiAgZmlsdGVyKGhfY29kZSAlaW4lIGZ1bGxfMTZfMTRfMTIpIC0+IGFsY29ob2xfY29uc3VtcHRpb25fYmFsYW5jZWQNCg0KYGBgDQoNCkzDumMgbsOgeSBjaOG7iSBjw7JuIDUyMCBo4buZIGdpYSDEkcOsbmggY8OzIMSR4bqneSDEkeG7pyBk4buvIGxp4buHdSB24buBIHThu5VuZyB0acOqdSBkw7luZyBiaWEgKyByxrDhu6N1IHRyb25nIGJhIG7Eg20gbGnDqm4gdGnhur9wLiANCg0KIyBGaW5hbCBOb3Rlcw0KDQpDw6FjIGJp4bq/biBz4buRIGtow6FjIHPhur0gxJHGsOG7o2MgY2h14bqpbiBi4buLIHbDoCB0w61uaCB0b8OhbiB0aGVvIGxvZ2ljIMSRw6MgdHLDrG5oIGLDoHkg4bufIHRyw6puLiANCg==