BÀI THỰC HÀNH TUẦN 3

1 Giới thiệu bộ dữ liệu

Bộ dữ liệu có 675 quan sát và 12 biến gồm :

School: trình độ học của trẻ (“Hauptschule”, “Realschule” và “Gymnasium”, tương ứng với các ý nghĩa là trường cấp hai có chương trình học phổ thông đại trà, trường cấp hai có chương trình học phổ thông nâng cao và trường cấp hai dành cho học sinh khá, giỏi.)

Birthyear: năm sinh của trẻ

Gender: giới tính (Có 2 biểu hiện female: nữ, male: nam)

Kids: số con trong nhà

Parity: thứ tự sinh của người khảo sát

Income: thu nhập trong gia đình (Đơn vị EURO)

Size: qui mô gia đình (Số người trong gia đình)

State: tiểu bang sinh sống

Marital: tình trạng hôn nhân của mẹ người khảo sát (Có 5 biểu hiện gồm “maried”: đã kết hôn, “widowed”: góa, “divorced”: li dị, “separated”: li thân, “single”: độc thân)

Meducation: trình độ giáo dụng của người mẹ

Memployment: yếu tố quyết định mức độ việc làm của người mẹ (Có 3 biểu hiện gồm “fulltime”: toàn thời gian, “partime”: bán thời gian và “none”: không có việc làm)

Year: năm thực hiện khảo sát

library(magrittr)
## Warning: package 'magrittr' was built under R version 4.3.1
library(scales)
## Warning: package 'scales' was built under R version 4.3.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.1
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(forcats)
library(AER)
## Warning: package 'AER' was built under R version 4.3.3
## Loading required package: car
## Warning: package 'car' was built under R version 4.3.1
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## Loading required package: lmtest
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: sandwich
## Loading required package: survival
library(epitools)
## Warning: package 'epitools' was built under R version 4.3.1
## 
## Attaching package: 'epitools'
## The following object is masked from 'package:survival':
## 
##     ratetable

1.1 Thống kê mô tả

library(readxl)
## Warning: package 'readxl' was built under R version 4.3.3
data <- read_excel("C:/Users/Dell/Downloads/GSOEP9402.xlsx")
View(data)
str(data)
## tibble [675 × 13] (S3: tbl_df/tbl/data.frame)
##  $ rownames   : num [1:675] 1 2 3 4 5 6 7 8 9 10 ...
##  $ school     : chr [1:675] "Gymnasium" "Gymnasium" "Gymnasium" "Gymnasium" ...
##  $ birthyear  : num [1:675] 1981 1981 1980 1984 1982 ...
##  $ gender     : chr [1:675] "female" "female" "female" "female" ...
##  $ kids       : num [1:675] 2 2 3 1 4 3 3 1 4 2 ...
##  $ parity     : num [1:675] 2 2 3 1 4 1 3 1 4 2 ...
##  $ income     : num [1:675] 35160 65748 120962 60101 34829 ...
##  $ size       : num [1:675] 4 3 3 3 4 5 3 3 5 4 ...
##  $ state      : chr [1:675] "Berlin" "Berlin" "Berlin" "Berlin" ...
##  $ marital    : chr [1:675] "married" "married" "married" "married" ...
##  $ meducation : num [1:675] 14.5 10.5 12 10.5 10 15 15 13 15 9 ...
##  $ memployment: chr [1:675] "none" "parttime" "parttime" "parttime" ...
##  $ year       : num [1:675] 1995 1995 1994 1998 1996 ...
head(data)
## # A tibble: 6 × 13
##   rownames school     birthyear gender  kids parity  income  size state  marital
##      <dbl> <chr>          <dbl> <chr>  <dbl>  <dbl>   <dbl> <dbl> <chr>  <chr>  
## 1        1 Gymnasium       1981 female     2      2  35160.     4 Berlin married
## 2        2 Gymnasium       1981 female     2      2  65748.     3 Berlin married
## 3        3 Gymnasium       1980 female     3      3 120962.     3 Berlin married
## 4        4 Gymnasium       1984 female     1      1  60101.     3 Berlin married
## 5        5 Realschule      1982 male       4      4  34829.     4 Berlin divorc…
## 6        6 Realschule      1980 female     3      1  42584.     5 Berlin married
## # ℹ 3 more variables: meducation <dbl>, memployment <chr>, year <dbl>

1.2 Các dạng đồ thị

School là biến thể hiện loại trường trung học cơ sở, gồm 3 biểu hiện:

table(data$school)
## 
##   Gymnasium Hauptschule  Realschule 
##         277         199         199
round((table(data$school)/sum(table(data$school))*100),2)
## 
##   Gymnasium Hauptschule  Realschule 
##       41.04       29.48       29.48
  • Có 277 trường cấp 2 dành cho học sinh khá giỏi chiếm tỷ lệ 41.04%

  • Có 199 trường cấp 2 có chương trình học đại trà chiếm tỷ lệ 29.48%

  • Có 199 trường cấp 2 có chương trình học nâng cao chiếm tỷ lệ 29.48%

data %>% ggplot(map = aes(x=school, y= after_stat(count)))+geom_bar(fill = 'pink')+geom_text(aes(label=percent(after_stat(count/sum(count)),accuracy = .01)), stat = 'count', color = 'white',vjust = 4) + labs(tiltle = 'Độ thị thể hiện số lượng học sinh đang theo học tại từng loại trường THCS', x = 'Loại trường THCS', y = 'số lượng học sinh')

  • Như vậy, loại trường có số học sinh theo học nhiều nhất là trường trung học cơ sở dành cho học sinh khá giỏi, cùng nhiều hơn hai loại trường còn lại 78 học sinh (khoảng 11.56%). Loại trường trung học cơ sở có chương trình đại trà và loại trung học cơ sở chương trình nâng cao đều có cùng số người theo học là 199 người (chiếm 29.48% so với tổng thể).
table(data$gender)
## 
## female   male 
##    348    327
round((table(data$gender)/sum(table(data$gender))*100),2)
## 
## female   male 
##  51.56  48.44
data |>ggplot(aes(gender))+geom_bar()

Trong 675 học sinh trung học cở được khảo sát có:

  • 327 học sinh thuộc giới tính nam (48,44%)
  • 348 học sinh thuộc giới tính nữ ( chiếm 51,56%) Như vậy trong tổng số học sinh được khảo sát số học sinh có giới tính nữ nhiều hơn số học sinh có giới tính nam 21 người (khoảng 3,12% so với tổng số học sinh).
table(data$marital)
## 
##  divorced   married separated    single   widowed 
##        59       566        29        11        10
round((table(data$marital)/sum(table(data$marital))*100),2)
## 
##  divorced   married separated    single   widowed 
##      8.74     83.85      4.30      1.63      1.48
data %>% ggplot(map=aes(forcats::fct_infreq(marital))) + geom_bar(fill ='lightpink') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'darkblue', hjust = 0.5) + labs(title = 'Biểu đồ thể hiện tình trạng hôn nhân của mẹ người được khảo sát', y = 'Số lượng', x = 'Tình trạng hôn nhân') + coord_flip()

Tình trạng hôn nhân của mẹ các học sinh trung học cơ sở được khảo sát, chia thành 5 nhóm gồm:

  • Đã kết hôn có 566 người, chiếm 83,85%
  • Li hôn có 59 người, chiếm 8,74%
  • Ly thân có 29 người, chiếm 4,3%
  • Độc thân có 11 người, chiếm 1,63%
  • Góa chồng có 10 người, chiếm 1,48%
table(data$memployment)
## 
## fulltime     none parttime 
##       89      302      284
round(table(data$memployment)/sum(table(data$memployment))*100,2)
## 
## fulltime     none parttime 
##    13.19    44.74    42.07
data %>% ggplot(aes(x = memployment, y = after_stat(count))) + geom_bar(fill = 'salmon') + labs(title = 'Biểu đồ thể hiện tình trạng việc làm của mẹ người khảo sát')

d1 <- table(data$memployment)
d1 <- data |> group_by(memployment) |> summarise(freq = n()) |> mutate(d1, per = freq/sum(freq))
d1 %>% ggplot(aes(x = '', y = per, fill = memployment)) +
geom_bar(stat = 'identity') + 
coord_polar('y')+
geom_text(aes(label = paste0(round(per*100), "%")), position = position_stack(vjust = 0.5))

Tình trạng việc làm của người mẹ 675 học sinh được khảo sát được chia làm 3 nhóm gồm:

  • Làm việc toàn thời gian (fulltime): có 89 người, chiếm khoảng 13%.
  • Làm việc bán thời gian (parttime): 284 người, chiếm khoảng 42%.
  • Không có việc làm (none): 302 người, chiếm khoảng 45%

1.3 Bảng tần số - bảng tần suất

tmp <- table(data$gender,data$school)
prop.table(tmp)
##         
##          Gymnasium Hauptschule Realschule
##   female 0.2237037   0.1422222  0.1496296
##   male   0.1866667   0.1525926  0.1451852
addmargins(tmp)
##         
##          Gymnasium Hauptschule Realschule Sum
##   female       151          96        101 348
##   male         126         103         98 327
##   Sum          277         199        199 675
data %>% count(school,gender) %>% group_by(school) %>% mutate(psl=n/sum(n)) %>% ggplot(aes(x=school, y = n, fill = gender)) + geom_col()+geom_text(aes(label= percent(psl, accuracy = .01)), position = position_stack(vjust = 0.5), size = 3) + ylab('số học sinh') + xlab('loại trường THCS')

Kết quả trên cho chúng ta biết số lượng học sinh ở từ loại trường học theo giới tính, trong tổng số 675 học sinh được khảo sát

  • Loại trường trung học cơ sở chương trình đại trà có 103 học sinh nam (khoảng 15,26%), và 96 học sinh nữ (khoảng 14,22%).
  • Loại trường trung học cở sở chương trình nâng cao có 98 học sinh nam (khoảng 14,52%), và 101 học sinh nữ (14,97%)
  • Loại trường trung học cở sở dành cho học sinh khá giỏi có 126 học sinh nam (khoảng 18,67%), và 151 học sinh nữ (22,37%)

Như vậy trong loại trường trung cơ sở chương trình đại trà có tỉ lệ học sinh nam nhiều hơn học sinh nữ 7 học sinh. Ở loại trường trung học cơ sở chương trình nâng cao và loại trường trung học cơ sở dành cho học sinh khá giỏi thì tỉ lệ học sinh nữ nhiều hơn học sinh nam lần lượt là 3 học sinh và 25 học sinh.

Trong phần trăm giới tính học sinh ở từng loại trường của 675 người được khảo sát, tỉ lệ học sinh nữ ở trường trung học cơ sở dành cho học sinh khá giỏi chiếm nhiều nhất (151 học sinh, 22,37%), tỉ lệ học sinh nữ ở loại trường trung học cơ sở chương trình đại trà là thấp nhất (96 người, 14,22%).

1.4 Relative Risk/Risk Ratio

library(epiR)
## Warning: package 'epiR' was built under R version 4.3.3
## Package epiR 2.0.74 is loaded
## Type help(epi.about) for summary information
## Type browseVignettes(package = 'epiR') to learn how to use epiR for applied epidemiological analyses
## 
school2 <- forcats::fct_collapse(data$school, "trường khá"= c("Hauptschule","Realschule"), "trường giỏi"=c("Gymnasium"))
data<- mutate(data,school2)
tmp <- table(data$gender,data$school2)
addmargins(tmp)
##         
##          trường giỏi trường khá Sum
##   female         151        197 348
##   male           126        201 327
##   Sum            277        398 675
riskratio(tmp)
## $data
##         
##          trường giỏi trường khá Total
##   female         151        197   348
##   male           126        201   327
##   Total          277        398   675
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate     lower    upper
##   female 1.000000        NA       NA
##   male   1.085829 0.9574756 1.231388
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   female         NA           NA         NA
##   male     0.200976    0.2108657  0.1996713
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
epitab(tmp, method = 'riskratio',rev = 'c')
## $tab
##         
##          trường khá        p0 trường giỏi        p1 riskratio     lower
##   female        197 0.5660920         151 0.4339080 1.0000000        NA
##   male          201 0.6146789         126 0.3853211 0.8880248 0.7402228
##         
##             upper   p.value
##   female       NA        NA
##   male   1.065339 0.2108657
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

1.5 Tỷ lệ chênh (Odd Ratio)

oddsratio(tmp)
## $data
##         
##          trường giỏi trường khá Total
##   female         151        197   348
##   male           126        201   327
##   Total          277        398   675
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate     lower    upper
##   female 1.000000        NA       NA
##   male   1.222218 0.8986989 1.663859
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   female         NA           NA         NA
##   male     0.200976    0.2108657  0.1996713
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỉ lệ giữa xác suất học sinh trường khá và xác suất học sinh trường giỏi trong những học sinh giới tính nam so với Tỉ lệ giữa xác suất học sinh trường khá và xác suất học sinh trường giỏi trong những học sinh giới tính nữ là 1,22.

Con số này cho biết tỉ lệ khả năng học sinh nam học tại trường khá cao hơn 22% so với tỉ lệ học sinh nữ học tai loại trường này.

oddsratio(tmp,rev = 'c')
## $data
##         
##          trường khá trường giỏi Total
##   female        197         151   348
##   male          201         126   327
##   Total         398         277   675
## 
## $measure
##         odds ratio with 95% C.I.
##           estimate     lower   upper
##   female 1.0000000        NA      NA
##   male   0.8181854 0.6010126 1.11272
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   female         NA           NA         NA
##   male     0.200976    0.2108657  0.1996713
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỉ lệ giữa học sinh nam học tại trường giỏi và học sinh nam học tại trường khá so với tỉ lệ học sinh học nữ tại trường giỏi và học sinh học nữ tại trường khá là 0,81.

Con số này cho biết, tỉ lệ học sinh nam tại trường loại giỏi ít hơn 18% so tỉ lệ học sinh nữ

1.6 Khoảng ước lượng tỷ lệ

tmp <- data[data$size > 4,]


prop.test(length(data$size), length(data$size), p = 0.35)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(data$size) out of length(data$size), null probability 0.35
## X-squared = 1250.7, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.35
## 95 percent confidence interval:
##  0.9929454 1.0000000
## sample estimates:
## p 
## 1
LS0tDQp0aXRsZTogIlVudGl0bGVkIg0KYXV0aG9yOiAixJDhurZORyBUSEFOSCBUUsOaQyINCmRhdGU6ICIyMDI0LTA2LTA4Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIHRvY19kZXBodDogMw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoqKkLDgEkgVEjhu7BDIEjDgE5IIFRV4bqmTiAzKioNCg0KIyAqKkdp4bubaSB0aGnhu4d1IGLhu5kgZOG7ryBsaeG7h3UqKiANCg0KQuG7mSBk4buvIGxp4buHdSBjw7MgNjc1IHF1YW4gc8OhdCB2w6AgMTIgYmnhur9uIGfhu5NtIDogDQoNCioqU2Nob29sKio6IHRyw6xuaCDEkeG7mSBo4buNYyBj4bunYSB0cuG6uyAo4oCcSGF1cHRzY2h1bGXigJ0sIOKAnFJlYWxzY2h1bGXigJ0gdsOgIOKAnEd5bW5hc2l1beKAnSwgdMawxqFuZyDhu6luZyB24bubaSBjw6FjIMO9IG5naMSpYSBsw6AgdHLGsOG7nW5nIGPhuqVwIGhhaSBjw7MgY2jGsMahbmcgdHLDrG5oIGjhu41jIHBo4buVIHRow7RuZyDEkeG6oWkgdHLDoCwgdHLGsOG7nW5nIGPhuqVwIGhhaSBjw7MgY2jGsMahbmcgdHLDrG5oIGjhu41jIHBo4buVIHRow7RuZyBuw6JuZyBjYW8gdsOgIHRyxrDhu51uZyBj4bqlcCBoYWkgZMOgbmggY2hvIGjhu41jIHNpbmgga2jDoSwgZ2nhu49pLikNCg0KKipCaXJ0aHllYXIqKjogbsSDbSBzaW5oIGPhu6dhIHRy4bq7DQoNCioqR2VuZGVyKio6IGdp4bubaSB0w61uaCAoQ8OzIDIgYmnhu4N1IGhp4buHbiBmZW1hbGU6IG7hu68sIG1hbGU6IG5hbSkNCg0KKipLaWRzKio6IHPhu5EgY29uIHRyb25nIG5ow6ANCg0KKipQYXJpdHkqKjogdGjhu6kgdOG7sSBzaW5oIGPhu6dhIG5nxrDhu51pIGto4bqjbyBzw6F0DQoNCioqSW5jb21lKio6IHRodSBuaOG6rXAgdHJvbmcgZ2lhIMSRw6xuaCAoxJDGoW4gduG7iyBFVVJPKQ0KDQoqKlNpemUqKjogcXVpIG3DtCBnaWEgxJHDrG5oIChT4buRIG5nxrDhu51pIHRyb25nIGdpYSDEkcOsbmgpDQoNCioqU3RhdGUqKjogdGnhu4N1IGJhbmcgc2luaCBz4buRbmcNCg0KKipNYXJpdGFsKio6IHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBj4bunYSBt4bq5IG5nxrDhu51pIGto4bqjbyBzw6F0IChDw7MgNSBiaeG7g3UgaGnhu4duIGfhu5NtIOKAnG1hcmllZOKAnTogxJHDoyBr4bq/dCBow7RuLCDigJx3aWRvd2Vk4oCdOiBnw7NhLCDigJxkaXZvcmNlZOKAnTogbGkgZOG7iywg4oCcc2VwYXJhdGVk4oCdOiBsaSB0aMOibiwg4oCcc2luZ2xl4oCdOiDEkeG7mWMgdGjDom4pDQoNCioqTWVkdWNhdGlvbioqOiB0csOsbmggxJHhu5kgZ2nDoW8gZOG7pW5nIGPhu6dhIG5nxrDhu51pIG3hurkNCg0KKipNZW1wbG95bWVudCoqOiB54bq/dSB04buRIHF1eeG6v3QgxJHhu4tuaCBt4bupYyDEkeG7mSB2aeG7h2MgbMOgbSBj4bunYSBuZ8aw4budaSBt4bq5IChDw7MgMyBiaeG7g3UgaGnhu4duIGfhu5NtIOKAnGZ1bGx0aW1l4oCdOiB0b8OgbiB0aOG7nWkgZ2lhbiwg4oCccGFydGltZeKAnTogYsOhbiB0aOG7nWkgZ2lhbiB2w6Ag4oCcbm9uZeKAnToga2jDtG5nIGPDsyB2aeG7h2MgbMOgbSkNCg0KKipZZWFyKio6IG7Eg20gdGjhu7FjIGhp4buHbiBraOG6o28gc8OhdA0KDQoNCmBgYHtyfQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZm9yY2F0cykNCmxpYnJhcnkoQUVSKQ0KbGlicmFyeShlcGl0b29scykNCmBgYA0KDQojIyAqKlRo4buRbmcga8OqIG3DtCB04bqjKioNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmRhdGEgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvRGVsbC9Eb3dubG9hZHMvR1NPRVA5NDAyLnhsc3giKQ0KVmlldyhkYXRhKQ0Kc3RyKGRhdGEpDQpoZWFkKGRhdGEpDQpgYGANCiMjICoqQ8OhYyBk4bqhbmcgxJHhu5MgdGjhu4sqKiANCg0KU2Nob29sIGzDoCBiaeG6v24gdGjhu4MgaGnhu4duIGxv4bqhaSB0csaw4budbmcgdHJ1bmcgaOG7jWMgY8ahIHPhu58sIGfhu5NtIDMgYmnhu4N1IGhp4buHbjoNCg0KYGBge3J9DQp0YWJsZShkYXRhJHNjaG9vbCkNCnJvdW5kKCh0YWJsZShkYXRhJHNjaG9vbCkvc3VtKHRhYmxlKGRhdGEkc2Nob29sKSkqMTAwKSwyKQ0KYGBgDQogLSBDw7MgMjc3IHRyxrDhu51uZyBj4bqlcCAyIGTDoG5oIGNobyBo4buNYyBzaW5oIGtow6EgZ2nhu49pIGNoaeG6v20gdOG7tyBs4buHIDQxLjA0JQ0KIA0KIC0gQ8OzIDE5OSB0csaw4budbmcgY+G6pXAgMiBjw7MgY2jGsMahbmcgdHLDrG5oIGjhu41jIMSR4bqhaSB0csOgIGNoaeG6v20gdOG7tyBs4buHIDI5LjQ4JQ0KIA0KIC0gQ8OzIDE5OSB0csaw4budbmcgY+G6pXAgMiBjw7MgY2jGsMahbmcgdHLDrG5oIGjhu41jIG7Dom5nIGNhbyBjaGnhur9tIHThu7cgbOG7hyAyOS40OCUNCiANCg0KDQpgYGB7cn0NCmRhdGEgJT4lIGdncGxvdChtYXAgPSBhZXMoeD1zY2hvb2wsIHk9IGFmdGVyX3N0YXQoY291bnQpKSkrZ2VvbV9iYXIoZmlsbCA9ICdwaW5rJykrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksYWNjdXJhY3kgPSAuMDEpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yID0gJ3doaXRlJyx2anVzdCA9IDQpICsgbGFicyh0aWx0bGUgPSAnxJDhu5kgdGjhu4sgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgaOG7jWMgc2luaCDEkWFuZyB0aGVvIGjhu41jIHThuqFpIHThu6tuZyBsb+G6oWkgdHLGsOG7nW5nIFRIQ1MnLCB4ID0gJ0xv4bqhaSB0csaw4budbmcgVEhDUycsIHkgPSAnc+G7kSBsxrDhu6NuZyBo4buNYyBzaW5oJykNCg0KYGBgDQoNCi0gTmjGsCB24bqteSwgbG/huqFpIHRyxrDhu51uZyBjw7Mgc+G7kSBo4buNYyBzaW5oIHRoZW8gaOG7jWMgbmhp4buBdSBuaOG6pXQgbMOgIHRyxrDhu51uZyB0cnVuZyBo4buNYyBjxqEgc+G7nyBkw6BuaCBjaG8gaOG7jWMgc2luaCBraMOhIGdp4buPaSwgY8O5bmcgbmhp4buBdSBoxqFuIGhhaSBsb+G6oWkgdHLGsOG7nW5nIGPDsm4gbOG6oWkgNzggaOG7jWMgc2luaCAoa2hv4bqjbmcgMTEuNTYlKS4gTG/huqFpIHRyxrDhu51uZyB0cnVuZyBo4buNYyBjxqEgc+G7nyBjw7MgY2jGsMahbmcgdHLDrG5oIMSR4bqhaSB0csOgIHbDoCBsb+G6oWkgdHJ1bmcgaOG7jWMgY8ahIHPhu58gY2jGsMahbmcgdHLDrG5oIG7Dom5nIGNhbyDEkeG7gXUgY8OzIGPDuW5nIHPhu5EgbmfGsOG7nWkgdGhlbyBo4buNYyBsw6AgMTk5IG5nxrDhu51pIChjaGnhur9tIDI5LjQ4JSBzbyB24bubaSB04buVbmcgdGjhu4MpLg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkZ2VuZGVyKQ0Kcm91bmQoKHRhYmxlKGRhdGEkZ2VuZGVyKS9zdW0odGFibGUoZGF0YSRnZW5kZXIpKSoxMDApLDIpDQpkYXRhIHw+Z2dwbG90KGFlcyhnZW5kZXIpKStnZW9tX2JhcigpDQoNCmBgYA0KVHJvbmcgNjc1IGjhu41jIHNpbmggdHJ1bmcgaOG7jWMgY+G7nyDEkcaw4bujYyBraOG6o28gc8OhdCBjw7M6DQoNCi0gMzI3IGjhu41jIHNpbmggdGh14buZYyBnaeG7m2kgdMOtbmggbmFtICg0OCw0NCUpDQotIDM0OCBo4buNYyBzaW5oIHRodeG7mWMgZ2nhu5tpIHTDrW5oIG7hu68gKCBjaGnhur9tIDUxLDU2JSkNCk5oxrAgduG6rXkgdHJvbmcgdOG7lW5nIHPhu5EgaOG7jWMgc2luaCDEkcaw4bujYyBraOG6o28gc8OhdCBz4buRIGjhu41jIHNpbmggY8OzIGdp4bubaSB0w61uaCBu4buvIG5oaeG7gXUgaMahbiBz4buRIGjhu41jIHNpbmggY8OzIGdp4bubaSB0w61uaCBuYW0gMjEgbmfGsOG7nWkgKGtob+G6o25nIDMsMTIlIHNvIHbhu5tpIHThu5VuZyBz4buRIGjhu41jIHNpbmgpLg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkbWFyaXRhbCkNCnJvdW5kKCh0YWJsZShkYXRhJG1hcml0YWwpL3N1bSh0YWJsZShkYXRhJG1hcml0YWwpKSoxMDApLDIpDQpkYXRhICU+JSBnZ3Bsb3QobWFwPWFlcyhmb3JjYXRzOjpmY3RfaW5mcmVxKG1hcml0YWwpKSkgKyBnZW9tX2JhcihmaWxsID0nbGlnaHRwaW5rJykgKyBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpLCBhY2N1cmFjeT0gMC4wMSkpLCBzdGF0ID0gJ2NvdW50JywgY29sb3IgPSAnZGFya2JsdWUnLCBoanVzdCA9IDAuNSkgKyBsYWJzKHRpdGxlID0gJ0Jp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPhu6dhIG3hurkgbmfGsOG7nWkgxJHGsOG7o2Mga2jhuqNvIHPDoXQnLCB5ID0gJ1Phu5EgbMaw4bujbmcnLCB4ID0gJ1TDrG5oIHRy4bqhbmcgaMO0biBuaMOibicpICsgY29vcmRfZmxpcCgpDQpgYGANCg0KVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPhu6dhIG3hurkgY8OhYyBo4buNYyBzaW5oIHRydW5nIGjhu41jIGPGoSBz4bufIMSRxrDhu6NjIGto4bqjbyBzw6F0LCBjaGlhIHRow6BuaCA1IG5ow7NtIGfhu5NtOg0KDQotIMSQw6Mga+G6v3QgaMO0biBjw7MgNTY2IG5nxrDhu51pLCBjaGnhur9tIDgzLDg1JQ0KLSBMaSBow7RuIGPDsyA1OSBuZ8aw4budaSwgY2hp4bq/bSA4LDc0JQ0KLSBMeSB0aMOibiBjw7MgMjkgbmfGsOG7nWksIGNoaeG6v20gNCwzJQ0KLSDEkOG7mWMgdGjDom4gY8OzIDExIG5nxrDhu51pLCBjaGnhur9tIDEsNjMlDQotIEfDs2EgY2jhu5NuZyBjw7MgMTAgbmfGsOG7nWksIGNoaeG6v20gMSw0OCUNCg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkbWVtcGxveW1lbnQpDQpyb3VuZCh0YWJsZShkYXRhJG1lbXBsb3ltZW50KS9zdW0odGFibGUoZGF0YSRtZW1wbG95bWVudCkpKjEwMCwyKQ0KZGF0YSAlPiUgZ2dwbG90KGFlcyh4ID0gbWVtcGxveW1lbnQsIHkgPSBhZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbCA9ICdzYWxtb24nKSArIGxhYnModGl0bGUgPSAnQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB0w6xuaCB0cuG6oW5nIHZp4buHYyBsw6BtIGPhu6dhIG3hurkgbmfGsOG7nWkga2jhuqNvIHPDoXQnKQ0KZDEgPC0gdGFibGUoZGF0YSRtZW1wbG95bWVudCkNCmQxIDwtIGRhdGEgfD4gZ3JvdXBfYnkobWVtcGxveW1lbnQpIHw+IHN1bW1hcmlzZShmcmVxID0gbigpKSB8PiBtdXRhdGUoZDEsIHBlciA9IGZyZXEvc3VtKGZyZXEpKQ0KZDEgJT4lIGdncGxvdChhZXMoeCA9ICcnLCB5ID0gcGVyLCBmaWxsID0gbWVtcGxveW1lbnQpKSArDQpnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyANCmNvb3JkX3BvbGFyKCd5JykrDQpnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKHBlcioxMDApLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpDQoNCmBgYA0KDQpUw6xuaCB0cuG6oW5nIHZp4buHYyBsw6BtIGPhu6dhIG5nxrDhu51pIG3hurkgNjc1IGjhu41jIHNpbmggxJHGsOG7o2Mga2jhuqNvIHPDoXQgxJHGsOG7o2MgY2hpYSBsw6BtIDMgbmjDs20gZ+G7k206DQoNCi0gTMOgbSB2aeG7h2MgdG/DoG4gdGjhu51pIGdpYW4gKGZ1bGx0aW1lKTogY8OzIDg5IG5nxrDhu51pLCBjaGnhur9tIGtob+G6o25nIDEzJS4NCi0gTMOgbSB2aeG7h2MgYsOhbiB0aOG7nWkgZ2lhbiAocGFydHRpbWUpOiAyODQgbmfGsOG7nWksIGNoaeG6v20ga2hv4bqjbmcgNDIlLg0KLSBLaMO0bmcgY8OzIHZp4buHYyBsw6BtIChub25lKTogMzAyIG5nxrDhu51pLCBjaGnhur9tIGtob+G6o25nIDQ1JQ0KDQojIyAqKkLhuqNuZyB04bqnbiBz4buRIC0gYuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KdG1wIDwtIHRhYmxlKGRhdGEkZ2VuZGVyLGRhdGEkc2Nob29sKQ0KcHJvcC50YWJsZSh0bXApDQphZGRtYXJnaW5zKHRtcCkNCmRhdGEgJT4lIGNvdW50KHNjaG9vbCxnZW5kZXIpICU+JSBncm91cF9ieShzY2hvb2wpICU+JSBtdXRhdGUocHNsPW4vc3VtKG4pKSAlPiUgZ2dwbG90KGFlcyh4PXNjaG9vbCwgeSA9IG4sIGZpbGwgPSBnZW5kZXIpKSArIGdlb21fY29sKCkrZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcGVyY2VudChwc2wsIGFjY3VyYWN5ID0gLjAxKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBzaXplID0gMykgKyB5bGFiKCdz4buRIGjhu41jIHNpbmgnKSArIHhsYWIoJ2xv4bqhaSB0csaw4budbmcgVEhDUycpDQpgYGANCkvhur90IHF14bqjIHRyw6puIGNobyBjaMO6bmcgdGEgYmnhur90IHPhu5EgbMaw4bujbmcgaOG7jWMgc2luaCDhu58gdOG7qyBsb+G6oWkgdHLGsOG7nW5nIGjhu41jIHRoZW8gZ2nhu5tpIHTDrW5oLCB0cm9uZyB04buVbmcgc+G7kSA2NzUgaOG7jWMgc2luaCDEkcaw4bujYyBraOG6o28gc8OhdA0KDQotIExv4bqhaSB0csaw4budbmcgdHJ1bmcgaOG7jWMgY8ahIHPhu58gY2jGsMahbmcgdHLDrG5oIMSR4bqhaSB0csOgIGPDsyAxMDMgaOG7jWMgc2luaCBuYW0gKGtob+G6o25nIDE1LDI2JSksIHbDoCA5NiBo4buNYyBzaW5oIG7hu68gKGtob+G6o25nIDE0LDIyJSkuDQotIExv4bqhaSB0csaw4budbmcgdHJ1bmcgaOG7jWMgY+G7nyBz4bufIGNoxrDGoW5nIHRyw6xuaCBuw6JuZyBjYW8gY8OzIDk4IGjhu41jIHNpbmggbmFtIChraG/huqNuZyAxNCw1MiUpLCB2w6AgMTAxIGjhu41jIHNpbmggbuG7ryAoMTQsOTclKQ0KLSBMb+G6oWkgdHLGsOG7nW5nIHRydW5nIGjhu41jIGPhu58gc+G7nyBkw6BuaCBjaG8gaOG7jWMgc2luaCBraMOhIGdp4buPaSBjw7MgMTI2IGjhu41jIHNpbmggbmFtIChraG/huqNuZyAxOCw2NyUpLCB2w6AgMTUxIGjhu41jIHNpbmggbuG7ryAoMjIsMzclKQ0KDQpOaMawIHbhuq15IHRyb25nIGxv4bqhaSB0csaw4budbmcgdHJ1bmcgY8ahIHPhu58gY2jGsMahbmcgdHLDrG5oIMSR4bqhaSB0csOgIGPDsyB04buJIGzhu4cgaOG7jWMgc2luaCBuYW0gbmhp4buBdSBoxqFuIGjhu41jIHNpbmggbuG7ryA3IGjhu41jIHNpbmguIOG7niBsb+G6oWkgdHLGsOG7nW5nIHRydW5nIGjhu41jIGPGoSBz4bufIGNoxrDGoW5nIHRyw6xuaCBuw6JuZyBjYW8gdsOgIGxv4bqhaSB0csaw4budbmcgdHJ1bmcgaOG7jWMgY8ahIHPhu58gZMOgbmggY2hvIGjhu41jIHNpbmgga2jDoSBnaeG7j2kgdGjDrCB04buJIGzhu4cgaOG7jWMgc2luaCBu4buvIG5oaeG7gXUgaMahbiBo4buNYyBzaW5oIG5hbSBs4bqnbiBsxrDhu6N0IGzDoCAzIGjhu41jIHNpbmggdsOgIDI1IGjhu41jIHNpbmguDQoNClRyb25nIHBo4bqnbiB0csSDbSBnaeG7m2kgdMOtbmggaOG7jWMgc2luaCDhu58gdOG7q25nIGxv4bqhaSB0csaw4budbmcgY+G7p2EgNjc1IG5nxrDhu51pIMSRxrDhu6NjIGto4bqjbyBzw6F0LCB04buJIGzhu4cgaOG7jWMgc2luaCBu4buvIOG7nyB0csaw4budbmcgdHJ1bmcgaOG7jWMgY8ahIHPhu58gZMOgbmggY2hvIGjhu41jIHNpbmgga2jDoSBnaeG7j2kgY2hp4bq/bSBuaGnhu4F1IG5o4bqldCAoMTUxIGjhu41jIHNpbmgsIDIyLDM3JSksIHThu4kgbOG7hyBo4buNYyBzaW5oIG7hu68g4bufIGxv4bqhaSB0csaw4budbmcgdHJ1bmcgaOG7jWMgY8ahIHPhu58gY2jGsMahbmcgdHLDrG5oIMSR4bqhaSB0csOgIGzDoCB0aOG6pXAgbmjhuqV0ICg5NiBuZ8aw4budaSwgMTQsMjIlKS4NCg0KIyMgKipSZWxhdGl2ZSBSaXNrL1Jpc2sgUmF0aW8qKg0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpUikNCnNjaG9vbDIgPC0gZm9yY2F0czo6ZmN0X2NvbGxhcHNlKGRhdGEkc2Nob29sLCAidHLGsOG7nW5nIGtow6EiPSBjKCJIYXVwdHNjaHVsZSIsIlJlYWxzY2h1bGUiKSwgInRyxrDhu51uZyBnaeG7j2kiPWMoIkd5bW5hc2l1bSIpKQ0KZGF0YTwtIG11dGF0ZShkYXRhLHNjaG9vbDIpDQp0bXAgPC0gdGFibGUoZGF0YSRnZW5kZXIsZGF0YSRzY2hvb2wyKQ0KYWRkbWFyZ2lucyh0bXApDQpyaXNrcmF0aW8odG1wKQ0KZXBpdGFiKHRtcCwgbWV0aG9kID0gJ3Jpc2tyYXRpbycscmV2ID0gJ2MnKQ0KDQpgYGANCiMjICoqVOG7tyBs4buHIGNow6puaCAoT2RkIFJhdGlvKSoqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKHRtcCkNCmBgYA0KVOG7iSBs4buHIGdp4buvYSB4w6FjIHN14bqldCBo4buNYyBzaW5oIHRyxrDhu51uZyBraMOhIHbDoCB4w6FjIHN14bqldCBo4buNYyBzaW5oIHRyxrDhu51uZyBnaeG7j2kgdHJvbmcgbmjhu69uZyBo4buNYyBzaW5oIGdp4bubaSB0w61uaCBuYW0gc28gduG7m2kgVOG7iSBs4buHIGdp4buvYSB4w6FjIHN14bqldCBo4buNYyBzaW5oIHRyxrDhu51uZyBraMOhIHbDoCB4w6FjIHN14bqldCBo4buNYyBzaW5oIHRyxrDhu51uZyBnaeG7j2kgdHJvbmcgbmjhu69uZyBo4buNYyBzaW5oIGdp4bubaSB0w61uaCBu4buvIGzDoCAxLDIyLg0KDQpDb24gc+G7kSBuw6B5IGNobyBiaeG6v3QgdOG7iSBs4buHIGto4bqjIG7Eg25nIGjhu41jIHNpbmggbmFtIGjhu41jIHThuqFpIHRyxrDhu51uZyBraMOhIGNhbyBoxqFuIDIyJSBzbyB24bubaSB04buJIGzhu4cgaOG7jWMgc2luaCBu4buvIGjhu41jIHRhaSBsb+G6oWkgdHLGsOG7nW5nIG7DoHkuDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKHRtcCxyZXYgPSAnYycpDQpgYGANClThu4kgbOG7hyBnaeG7r2EgaOG7jWMgc2luaCBuYW0gaOG7jWMgdOG6oWkgdHLGsOG7nW5nIGdp4buPaSB2w6AgaOG7jWMgc2luaCBuYW0gaOG7jWMgdOG6oWkgdHLGsOG7nW5nIGtow6Egc28gduG7m2kgdOG7iSBs4buHIGjhu41jIHNpbmggaOG7jWMgbuG7ryB04bqhaSB0csaw4budbmcgZ2nhu49pIHbDoCBo4buNYyBzaW5oIGjhu41jIG7hu68gdOG6oWkgdHLGsOG7nW5nIGtow6EgbMOgIDAsODEuDQoNCkNvbiBz4buRIG7DoHkgY2hvIGJp4bq/dCwgdOG7iSBs4buHIGjhu41jIHNpbmggbmFtIHThuqFpIHRyxrDhu51uZyBsb+G6oWkgZ2nhu49pIMOtdCBoxqFuIDE4JSBzbyB04buJIGzhu4cgaOG7jWMgc2luaCBu4buvDQoNCiMjICoqS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hyoqDQoNCmBgYHtyfQ0KdG1wIDwtIGRhdGFbZGF0YSRzaXplID4gNCxdDQoNCg0KcHJvcC50ZXN0KGxlbmd0aChkYXRhJHNpemUpLCBsZW5ndGgoZGF0YSRzaXplKSwgcCA9IDAuMzUpDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQo=