library(readr)
mice_weights <- read_csv("mice_weights.csv")
## Rows: 780 Columns: 8
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): sex, diet
## dbl (6): rownames, body_weight, bone_density, percent_fat, gen, litter
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
data1 <-  mice_weights

Dữ liệu được cung cấp bởi Karen Svenson từ Phòng thí nghiệm Jackson. Nguồn tài trợ để tạo ra những dữ liệu này đến từ khoản trợ cấp P50 GM070683 của NIH được trao cho Gary Churchill.

dateset gồm 7 biến:

  • body_weight: Trọng lượng cơ thể tính bằng gam ở tuần thứ 19.

  • bone_density: Mật độ cơ thể.

  • percent_fat: Phần trăm chất béo.

  • sex: Giới tính của chuột.

  • diet: Chế độ ăn của chuột: chow hoặc nhiều chất béo.

  • gen. Đây là những con chuột outbread. Biến này biểu thị thế hệ.

  • liiter: Con nào trong hai lứa chuột thuộc về.

Lập bảng tần số và vẽ đồ thị

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ purrr     1.0.1
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library("scales")
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
d <- data_frame(data1)
df <- d %>%
  mutate(body_weight = case_when(
    body_weight <= 35 ~ "Underweight",
    body_weight <= 66 ~ "Overweight",
    TRUE ~ "Obese"
  ))

tt <- table(df$body_weight)
barplot(tt, type = "o", main = "Bảng tần số theo thể trạng", xlab = "Thể trạng", ylab = "Tần số", col = c("black","purple"))

Ở đây phân chia biến Body Weight (thể trạng) thành hai nhóm “underweight” (thiếu cân) và “overweight” (thừa cân) để biến định lượng thành biến định tính giúp dễ dàng phân tích và đưa ra các kết luận về tình trạng dinh dưỡng và sức khỏe của các quan sát trong mẫu nghiên cứu. Sau đó, ta tạo bảng tần số để thể hiện số lượng đối tượng trong mỗi nhóm. Mẫu nghiên cứu có 320 quan sát được xếp vào loại thiếu cân và có 460 quan sát được xếp vào loại thừa cân. Bảng tần số cung cấp một cái nhìn rõ ràng về sự phân bố của các nhóm này, giúp định hướng cho các biện pháp can thiệp y tế và dinh dưỡng phù hợp.

tu <- table(df$diet)
barplot(tu, 
        main = "Bảng tần số theo chế độ ăn", 
        xlab = "Chế độ ăn", 
        ylab = "Tần số",
        col = c("skyblue", "red"))

Bảng tần số cho biến diet cho thấy sự phân bố khá đều giữa hai nhóm “chow” và “hf”. Với số lượng gần như tương đương (394 và 386).

ti <- table(df$sex)
barplot(ti, 
        main = "Lập bảng tần số cho Giới tính", 
        xlab = "Giới tính", 
        ylab = "Tần số",
        col = c("blue", "pink"),
        legend.text = TRUE)

Biến này bao gồm 398 đối tượng nữ, 382 đối tượng nam, chỉ ít hơn một chút so với nhóm nữ. Số lượng nam gần tương đương với nữ cho thấy mẫu nghiên cứu khá cân đối về giới tính.

Lập bảng tần số cho 2 biến

df %>% group_by(body_weight,sex) %>% summarise(n=n()) %>%
  ggplot(aes(x=body_weight,y=n,fill= sex)) +
  geom_col(position = "dodge") + 
  theme_bw()+
  labs(x="Thể trạng",y="Số lượng",title = "Bảng tần số theo thể trạng và giới tính")

Lập bảng tần số cho 2 biến body_weight và sex (thể trạng và giới tính).Với những quan sát mang giới tính nữ thì có thể trạng thiếu cân nhiều hơn những quan sát mang giới tính nam và ngược lại với thể trạng thiếu cân.

df %>% group_by(body_weight,diet) %>% summarise(n=n()) %>%
  ggplot(aes(x=body_weight,y=n,fill= diet)) +
  geom_col(position = "dodge") + 
  theme_bw()+
  labs(x="Thể trạng",y="Số lượng",title = "Bảng tần số theo thể trạng và chế độ ăn")

Lập bảng tần số cho 2 biến body_weigbt và diet(thể trạng và chế độ ăn).Với chế độ ăn chow(tiêu chuẩn), số lượng mẫu quan sát có thể trạng thiếu cân nhiều hơn. Với chế độ ăn hf (nhiều chất béo) thì số lượng mãu quan sát có thể trạng thừa cân nhiều hơn.

Ước lượng tỷ lệ

Tỷ lệ thành công

d_bd <- table(df$body_weight,d$diet)
d_bd
##              
##               chow  hf
##   Overweight   106 214
##   Underweight  288 172
pi1 <- d_bd[1,1]/sum(d_bd[1,])
pi2 <- d_bd[2,1]/sum(d_bd[2,])
data.frame(pi1,pi2)

p1: tỷ lệ thành công của thừa cân khi ăn chế độ bình thường p2: tỷ lệ thành công của thiếu cân khi ăn chế độ nhiều chất béo

Tỷ lệ thất bại

pi3 <- (1-pi1)/(1-pi2)

Relative risk

library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.3
ii <- table(df$body_weight,df$diet)
addmargins(ii)
##              
##               chow  hf Sum
##   Overweight   106 214 320
##   Underweight  288 172 460
##   Sum          394 386 780
RelRisk(ii)
## [1] 0.5290799

Rủi ro tương đối giữa 2 biểu hiện khác nhau của biến phụ thuộc, cụ thể ở thiếu cân và thừa cân của biến thể trạng. RR < 1 giá trị rủi ro tương đối nhỏ hơn 1 (0.5290799).

** Khoảng ước lượng cho Relative Risk**

table(df$body_weight, df$sex)
##              
##                 F   M
##   Overweight   76 244
##   Underweight 322 138
m <- matrix(c(76,322,244,138),nrow = 2)
RelRisk(m, conf.level = .95)
## rel. risk    lwr.ci    upr.ci 
## 0.3392857 0.2751131 0.4142015

Ước lượng cho Tỷ lệ Rủi ro Tương đối giữa 2 biến là 0.3392857 Giá trị thực sự của Tỷ lệ Rủi ro Tương đối nằm trong khoảng từ 0.2751131 đến 0.4142015.

Odds ratio

pp <- table(df$body_weight,df$sex)
OddsRatio(pp)
## [1] 0.1334895

G iá trị Odds Ratio dưới 1 (trong trường hợp này là 0.1334895) cho biết một mối quan hệ nghịch giữa các biến.

LS0tDQp0aXRsZTogIkJUVk4gQlVPSSAzX05nb2NIYSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgZXh0cmFfZGVwZW5kZW5jaWVzOg0KICAgICAgdmlldG5hbTogdXRmOA0KICAgIHRvYzogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQpnZW9tZXRyeToNCiAgICAgIC0gaW5uZXI9M2NtDQogICAgICAtIG91dGVyPTRjbQ0KICAgICAgLSB0b3A9M2NtDQogICAgICAtIGJvdHRvbT00Y20NCiAgICAgIC0gaGVhZHNlcD0yMnB0DQogICAgICAtIGhlYWRoZWlnaHQ9MTFwdA0KICAgICAgLSBmb290c2tpcD0zM3B0DQogICAgICAtIGlnbm9yZWhlYWQNCiAgICAgIC0gaWdub3JlZm9vdA0KICAgICAgLSBoZWlnaHRyb3VuZGVkDQotLS0NCmBgYHtyfQ0KbGlicmFyeShyZWFkcikNCm1pY2Vfd2VpZ2h0cyA8LSByZWFkX2NzdigibWljZV93ZWlnaHRzLmNzdiIpDQpkYXRhMSA8LSAgbWljZV93ZWlnaHRzDQpgYGANCg0KROG7ryBsaeG7h3UgxJHGsOG7o2MgY3VuZyBj4bqlcCBi4bufaSBLYXJlbiBTdmVuc29uIHThu6sgUGjDsm5nIHRow60gbmdoaeG7h20gSmFja3Nvbi4gTmd14buTbiB0w6BpIHRy4bujIMSR4buDIHThuqFvIHJhIG5o4buvbmcgZOG7ryBsaeG7h3UgbsOgeSDEkeG6v24gdOG7qyBraG/huqNuIHRy4bujIGPhuqVwIFA1MCBHTTA3MDY4MyBj4bunYSBOSUggxJHGsOG7o2MgdHJhbyBjaG8gR2FyeSBDaHVyY2hpbGwuDQoNCmRhdGVzZXQgZ+G7k20gNyBiaeG6v246DQoNCi0gYm9keV93ZWlnaHQ6IFRy4buNbmcgbMaw4bujbmcgY8ahIHRo4buDIHTDrW5oIGLhurFuZyBnYW0g4bufIHR14bqnbiB0aOG7qSAxOS4NCg0KLSBib25lX2RlbnNpdHk6IE3huq10IMSR4buZIGPGoSB0aOG7gy4NCg0KLSBwZXJjZW50X2ZhdDogUGjhuqduIHRyxINtIGNo4bqldCBiw6lvLg0KDQotIHNleDogR2nhu5tpIHTDrW5oIGPhu6dhIGNodeG7mXQuDQoNCi0gZGlldDogQ2jhur8gxJHhu5kgxINuIGPhu6dhIGNodeG7mXQ6IGNob3cgaG/hurdjIG5oaeG7gXUgY2jhuqV0IGLDqW8uDQoNCi0gZ2VuLiDEkMOieSBsw6Agbmjhu69uZyBjb24gY2h14buZdCBvdXRicmVhZC4gQmnhur9uIG7DoHkgYmnhu4N1IHRo4buLIHRo4bq/IGjhu4cuDQoNCi0gbGlpdGVyOiAgQ29uIG7DoG8gdHJvbmcgaGFpIGzhu6lhIGNodeG7mXQgdGh14buZYyB24buBLg0KDQojICoqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHbhur0gxJHhu5MgdGjhu4sqKg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KCJzY2FsZXMiKQ0KDQpkIDwtIGRhdGFfZnJhbWUoZGF0YTEpDQpkZiA8LSBkICU+JQ0KICBtdXRhdGUoYm9keV93ZWlnaHQgPSBjYXNlX3doZW4oDQogICAgYm9keV93ZWlnaHQgPD0gMzUgfiAiVW5kZXJ3ZWlnaHQiLA0KICAgIGJvZHlfd2VpZ2h0IDw9IDY2IH4gIk92ZXJ3ZWlnaHQiLA0KICAgIFRSVUUgfiAiT2Jlc2UiDQogICkpDQoNCnR0IDwtIHRhYmxlKGRmJGJvZHlfd2VpZ2h0KQ0KYmFycGxvdCh0dCwgdHlwZSA9ICJvIiwgbWFpbiA9ICJC4bqjbmcgdOG6p24gc+G7kSB0aGVvIHRo4buDIHRy4bqhbmciLCB4bGFiID0gIlRo4buDIHRy4bqhbmciLCB5bGFiID0gIlThuqduIHPhu5EiLCBjb2wgPSBjKCJibGFjayIsInB1cnBsZSIpKQ0KDQpgYGANCiANCiDhu54gxJHDonkgcGjDom4gY2hpYSBiaeG6v24gX0JvZHkgV2VpZ2h0XyAodGjhu4MgdHLhuqFuZykgdGjDoG5oIGhhaSBuaMOzbSAidW5kZXJ3ZWlnaHQiICh0aGnhur91IGPDom4pIHbDoCAib3ZlcndlaWdodCIgKHRo4burYSBjw6JuKSDEkeG7gyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB0aMOgbmggYmnhur9uIMSR4buLbmggdMOtbmggZ2nDunAgZOG7hSBkw6BuZyBwaMOibiB0w61jaCB2w6AgxJHGsGEgcmEgY8OhYyBr4bq/dCBsdeG6rW4gduG7gSB0w6xuaCB0cuG6oW5nIGRpbmggZMaw4buhbmcgdsOgIHPhu6ljIGto4buPZSBj4bunYSBjw6FjIHF1YW4gc8OhdCB0cm9uZyBt4bqrdSBuZ2hpw6puIGPhu6l1LiBTYXUgxJHDsywgdGEgdOG6oW8gYuG6o25nIHThuqduIHPhu5EgxJHhu4MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgxJHhu5FpIHTGsOG7o25nIHRyb25nIG3hu5dpIG5ow7NtLiBN4bqrdSBuZ2hpw6puIGPhu6l1IGPDsyAzMjAgcXVhbiBzw6F0IMSRxrDhu6NjIHjhur9wIHbDoG8gbG/huqFpIHRoaeG6v3UgY8OibiB2w6AgY8OzIDQ2MCBxdWFuIHPDoXQgxJHGsOG7o2MgeOG6v3AgdsOgbyBsb+G6oWkgdGjhu6thIGPDom4uIELhuqNuZyB04bqnbiBz4buRIGN1bmcgY+G6pXAgbeG7mXQgY8OhaSBuaMOsbiByw7UgcsOgbmcgduG7gSBz4buxIHBow6JuIGLhu5EgY+G7p2EgY8OhYyBuaMOzbSBuw6B5LCBnacO6cCDEkeG7i25oIGjGsOG7m25nIGNobyBjw6FjIGJp4buHbiBwaMOhcCBjYW4gdGhp4buHcCB5IHThur8gdsOgIGRpbmggZMaw4buhbmcgcGjDuSBo4bujcC4NCiANCmBgYHtyfQ0KdHUgPC0gdGFibGUoZGYkZGlldCkNCmJhcnBsb3QodHUsIA0KICAgICAgICBtYWluID0gIkLhuqNuZyB04bqnbiBz4buRIHRoZW8gY2jhur8gxJHhu5kgxINuIiwgDQogICAgICAgIHhsYWIgPSAiQ2jhur8gxJHhu5kgxINuIiwgDQogICAgICAgIHlsYWIgPSAiVOG6p24gc+G7kSIsDQogICAgICAgIGNvbCA9IGMoInNreWJsdWUiLCAicmVkIikpDQpgYGANCg0KICBC4bqjbmcgdOG6p24gc+G7kSBjaG8gYmnhur9uIF9kaWV0XyBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBraMOhIMSR4buBdSBnaeG7r2EgaGFpIG5ow7NtICJjaG93IiB2w6AgImhmIi4gVuG7m2kgc+G7kSBsxrDhu6NuZyBn4bqnbiBuaMawIHTGsMahbmcgxJHGsMahbmcgKDM5NCB2w6AgMzg2KS4gDQpgYGB7cn0NCnRpIDwtIHRhYmxlKGRmJHNleCkNCmJhcnBsb3QodGksIA0KICAgICAgICBtYWluID0gIkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGNobyBHaeG7m2kgdMOtbmgiLCANCiAgICAgICAgeGxhYiA9ICJHaeG7m2kgdMOtbmgiLCANCiAgICAgICAgeWxhYiA9ICJU4bqnbiBz4buRIiwNCiAgICAgICAgY29sID0gYygiYmx1ZSIsICJwaW5rIiksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gVFJVRSkNCmBgYA0KICBCaeG6v24gbsOgeSBiYW8gZ+G7k20gMzk4IMSR4buRaSB0xrDhu6NuZyBu4buvLCAzODIgxJHhu5FpIHTGsOG7o25nIG5hbSwgY2jhu4kgw610IGjGoW4gbeG7mXQgY2jDunQgc28gduG7m2kgbmjDs20gbuG7ry4gU+G7kSBsxrDhu6NuZyBuYW0gZ+G6p24gdMawxqFuZyDEkcawxqFuZyB24bubaSBu4buvIGNobyB0aOG6pXkgbeG6q3UgbmdoacOqbiBj4bupdSBraMOhIGPDom4gxJHhu5FpIHbhu4EgZ2nhu5tpIHTDrW5oLiANCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaG8gMiBiaeG6v24qKiANCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQpkZiAlPiUgZ3JvdXBfYnkoYm9keV93ZWlnaHQsc2V4KSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4PWJvZHlfd2VpZ2h0LHk9bixmaWxsPSBzZXgpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgdGhlbWVfYncoKSsNCiAgbGFicyh4PSJUaOG7gyB0cuG6oW5nIix5PSJT4buRIGzGsOG7o25nIix0aXRsZSA9ICJC4bqjbmcgdOG6p24gc+G7kSB0aGVvIHRo4buDIHRy4bqhbmcgdsOgIGdp4bubaSB0w61uaCIpDQpgYGANCg0KICBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaG8gMiBiaeG6v24gYm9keV93ZWlnaHQgdsOgIHNleCAodGjhu4MgdHLhuqFuZyB2w6AgZ2nhu5tpIHTDrW5oKS5W4bubaSBuaOG7r25nIHF1YW4gc8OhdCBtYW5nIGdp4bubaSB0w61uaCBu4buvIHRow6wgY8OzIHRo4buDIHRy4bqhbmcgdGhp4bq/dSBjw6JuIG5oaeG7gXUgaMahbiBuaOG7r25nIHF1YW4gc8OhdCBtYW5nIGdp4bubaSB0w61uaCBuYW0gdsOgIG5nxrDhu6NjIGzhuqFpIHbhu5tpIHRo4buDIHRy4bqhbmcgdGhp4bq/dSBjw6JuLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGYgJT4lIGdyb3VwX2J5KGJvZHlfd2VpZ2h0LGRpZXQpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9Ym9keV93ZWlnaHQseT1uLGZpbGw9IGRpZXQpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgdGhlbWVfYncoKSsNCiAgbGFicyh4PSJUaOG7gyB0cuG6oW5nIix5PSJT4buRIGzGsOG7o25nIix0aXRsZSA9ICJC4bqjbmcgdOG6p24gc+G7kSB0aGVvIHRo4buDIHRy4bqhbmcgdsOgIGNo4bq/IMSR4buZIMSDbiIpDQogIA0KYGBgDQogDQogTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2hvIDIgYmnhur9uIGJvZHlfd2VpZ2J0IHbDoCBkaWV0KHRo4buDIHRy4bqhbmcgdsOgIGNo4bq/IMSR4buZIMSDbikuVuG7m2kgY2jhur8gxJHhu5kgxINuIGNob3codGnDqnUgY2h14bqpbiksIHPhu5EgbMaw4bujbmcgbeG6q3UgcXVhbiBzw6F0IGPDsyB0aOG7gyB0cuG6oW5nIHRoaeG6v3UgY8OibiBuaGnhu4F1IGjGoW4uIFbhu5tpIGNo4bq/IMSR4buZIMSDbiBoZiAobmhp4buBdSBjaOG6pXQgYsOpbykgdGjDrCBz4buRIGzGsOG7o25nIG3Do3UgcXVhbiBzw6F0IGPDsyB0aOG7gyB0cuG6oW5nIHRo4burYSBjw6JuIG5oaeG7gXUgaMahbi4NCg0KIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIA0KDQoqKlThu7cgbOG7hyB0aMOgbmggY8O0bmcqKg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KZF9iZCA8LSB0YWJsZShkZiRib2R5X3dlaWdodCxkJGRpZXQpDQpkX2JkDQpwaTEgPC0gZF9iZFsxLDFdL3N1bShkX2JkWzEsXSkNCnBpMiA8LSBkX2JkWzIsMV0vc3VtKGRfYmRbMixdKQ0KZGF0YS5mcmFtZShwaTEscGkyKQ0KYGBgDQoNCiAgcDE6IHThu7cgbOG7hyB0aMOgbmggY8O0bmcgY+G7p2EgdGjhu6thIGPDom4ga2hpIMSDbiBjaOG6vyDEkeG7mSBiw6xuaCB0aMaw4budbmcNCiAgcDI6IHThu7cgbOG7hyB0aMOgbmggY8O0bmcgY+G7p2EgdGhp4bq/dSBjw6JuIGtoaSDEg24gY2jhur8gxJHhu5kgbmhp4buBdSBjaOG6pXQgYsOpbw0KICANCg0KKipU4bu3IGzhu4cgdGjhuqV0IGLhuqFpKioNCg0KYGBge3J9DQpwaTMgPC0gKDEtcGkxKS8oMS1waTIpDQoNCmBgYA0KDQojIFJlbGF0aXZlIHJpc2sNCmBgYHtyfQ0KbGlicmFyeShEZXNjVG9vbHMpDQppaSA8LSB0YWJsZShkZiRib2R5X3dlaWdodCxkZiRkaWV0KQ0KYWRkbWFyZ2lucyhpaSkNClJlbFJpc2soaWkpDQpgYGANCg0KUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgZ2nhu69hIDIgYmnhu4N1IGhp4buHbiBraMOhYyBuaGF1IGPhu6dhIGJp4bq/biBwaOG7pSB0aHXhu5ljLCBj4bulIHRo4buDIOG7nyB0aGnhur91IGPDom4gdsOgIHRo4burYSBjw6JuIGPhu6dhIGJp4bq/biB0aOG7gyB0cuG6oW5nLg0KUlIgPCAxIGdpw6EgdHLhu4sgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgbmjhu48gaMahbiAxICgwLjUyOTA3OTkpLiANCg0KKiogS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIGNobyBSZWxhdGl2ZSBSaXNrKioNCg0KYGBge3J9DQp0YWJsZShkZiRib2R5X3dlaWdodCwgZGYkc2V4KQ0KbSA8LSBtYXRyaXgoYyg3NiwzMjIsMjQ0LDEzOCksbnJvdyA9IDIpDQpSZWxSaXNrKG0sIGNvbmYubGV2ZWwgPSAuOTUpDQpgYGANCiDGr+G7m2MgbMaw4bujbmcgY2hvIFThu7cgbOG7hyBS4bunaSBybyBUxrDGoW5nIMSR4buRaSBnaeG7r2EgMiBiaeG6v24gbMOgIDAuMzM5Mjg1Nw0KIEdpw6EgdHLhu4sgdGjhu7FjIHPhu7EgY+G7p2EgVOG7tyBs4buHIFLhu6dpIHJvIFTGsMahbmcgxJHhu5FpIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMC4yNzUxMTMxIMSR4bq/biAwLjQxNDIwMTUuIA0KDQojIE9kZHMgcmF0aW8NCg0KYGBge3J9DQpwcCA8LSB0YWJsZShkZiRib2R5X3dlaWdodCxkZiRzZXgpDQpPZGRzUmF0aW8ocHApDQpgYGANCg0KRyBpw6EgdHLhu4sgT2RkcyBSYXRpbyBkxrDhu5tpIDEgKHRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5IGzDoCAwLjEzMzQ4OTUpIGNobyBiaeG6v3QgbeG7mXQgbeG7kWkgcXVhbiBo4buHIG5naOG7i2NoIGdp4buvYSBjw6FjIGJp4bq/bi4g