library("tidyverse")
library("DT")
library("ggplot2")
library("scales")
library("rvest")
library("netstat")
library("stringr")
library("epitools")
library("caret")
library("DescTools")
Giới thiệu bộ dữ
liệu
Dataset: HousePrices - Package AER. Bộ dữ liệu
“HousePrices” được lấy từ gói AER. Trong bộ dữ trên liên quan đến giá
bán của 546 căn nhà ở thành phố Windsor, Canada trong tháng 7,8,9 của
năm 1987.
Dữ liệu trên bao gồm 12 biến: 6 biến định lượng và 6 biến định
tính.
- Price: Giá bán của ngôi nhà (nghìn đô)
- Lotsize: Diện tích của ngôi nhà là bao nhiêu mét vuông
- Bedrooms: Số phòng ngủ của ngôi nhà
- Bathrooms: Số phòng tắm của ngôi nhà
- Stories: Nhà có bao nhiêu tầng(không tính tầng hầm)
- Garage: Số gara trong nhà
- Driveway: Nhà có chỗ đậu xe riêng hay không?
- Recreation: Trong nhà có phòng giải trí không?
- Fullbase: Tầng hầm của ngôi nhà đã được hoàn thiện hay chưa?
- Gasheat: Nhà có sử dụng gas để đun nước nóng không?
- Aircon: Nhà có sử dụng máy điều hòa không?
- Prefer: Ngôi nhà có nằm trong trung tâm của thành phố hay
không?
nmk <- read.csv("C:/Users/VIP/Downloads/HousePrices.csv")
str(nmk)
## 'data.frame': 546 obs. of 13 variables:
## $ rownames : int 1 2 3 4 5 6 7 8 9 10 ...
## $ price : int 42000 38500 49500 60500 61000 66000 66000 69000 83800 88500 ...
## $ lotsize : int 5850 4000 3060 6650 6360 4160 3880 4160 4800 5500 ...
## $ bedrooms : int 3 2 3 3 2 3 3 3 3 3 ...
## $ bathrooms : int 1 1 1 1 1 1 2 1 1 2 ...
## $ stories : int 2 1 1 2 1 1 2 3 1 4 ...
## $ driveway : chr "yes" "yes" "yes" "yes" ...
## $ recreation: chr "no" "no" "no" "yes" ...
## $ fullbase : chr "yes" "no" "no" "no" ...
## $ gasheat : chr "no" "no" "no" "no" ...
## $ aircon : chr "no" "no" "no" "no" ...
## $ garage : int 1 0 0 0 0 0 2 0 0 1 ...
## $ prefer : chr "no" "no" "no" "no" ...
Lập bảng tần số
Bảng tần số
datatable(nmk)
Thống kê mô tả giữa
biến Fullbase và biến Driveway
- Giải thích: Lập bảng tần số giữa hai biến trên cho chúng ta biết mối
liên hệ giữa 2 biến trên là như thế nào?
mk <- table(nmk$fullbase, nmk$driveway)
addmargins(mk)
##
## no yes Sum
## no 54 301 355
## yes 23 168 191
## Sum 77 469 546
Nhận xét:
Có 54 người trong cuộc khảo sát nhà không có khu vực đậu xe riêng
và không có tầng hầm được trang bị hoàn thiện.
Có 301 người trong cuộc khảo sát nhà có khu vực đậu xe riêng
nhưng không có tầng hầm được trang bị hoàn thiện.
Có 34 người trong cuộc khảo sát nhà không có khu vực đậu xe riêng
nhưng có tầng hầm được trang bị hoàn thiện.
Có 168 người trong cuộc khảo sát nhà có khu vực đậu xe riêng và
có tầng hầm được trang bị hoàn thiện.
Thống kê mô tả giữa
biến fullbase và biến prefer
mk1 <- table(nmk$fullbase, nmk$prefer)
addmargins(mk1)
##
## no yes Sum
## no 297 58 355
## yes 121 70 191
## Sum 418 128 546
Nhận xét:
Có 297 người có nhà không nằm trong khu vực trung tâm thành phố
và không có tầng hầm được trang bị hoàn thiện.
Có 121 người có nhà không nằm trong khu vực trung tâm thành phố
nhưng có tầng hầm được trang bị hoàn thiện.
Có 58 người có nhà nằm trong khu vực trung tâm thành phố nhưng
không có tầng hầm được trang bị hoàn thiện.
Có 70 người có nhà nằm trong khu vực trung tâm thành phố và có
tầng hầm được trang bị hoàn thiện.
Vẽ đồ thị
Đồ thị giữa biến
Fullbase và biến Driveway
nmk |> count(fullbase, driveway) |>
group_by(fullbase) |>
mutate(pH = n/sum(n)) |>
ggplot(aes(x = fullbase, y = n, fill = driveway)) +
geom_col() +
geom_text(aes(label = percent(pH, accuracy = .01)), position = position_stack(vjust = 0.5), size = 4) +
ylab('driveway') +
xlab('fullbase')
Nhận xét:
- Trong số những ngôi nhà không có tầng hầm được trang bị hoàn thiện
thì có 84,79% là nhà có khu vực đậu xe riêng và 15,21% là nhà không có
khu vực đậu xe riêng.
-Trong số những ngôi nhà có tầng hầm được trang bị hoàn thiện thì có
87,96% là nhà có khu vực đậu xe riêng và 12,04% là nhà không có khu vực
đậu xe riêng.
Đồ thị giữa biến
Fullbase và biến Prerfer
nmk |> count(fullbase, prefer) |>
group_by(fullbase) |>
mutate(pH = n/sum(n)) |>
ggplot(aes(x = fullbase, y = n, fill = prefer)) +
geom_col() +
geom_text(aes(label = percent(pH, accuracy = .01)), position = position_stack(vjust = 0.5), size = 4) +
ylab('prefer') +
xlab('fullbase')
NHận xét:
Trong số những ngôi nhà không có tầng hầm được trang bị hoàn
thiện thì có 83,66% không nằm trong khu vực trung tâm thành phố và
16,34% nằm trong khu vực trung tâm thành phố.
Trong số những ngôi nhà có tầng hầm được trang bị hoàn thiện thì
có 63,35% không nằm trong khu vực trung tâm thành phố và 36,65% nằm
trong khu vực trung tâm thành phố.
ƯỚc lượng tỷ lệ
Ước lượng tỷ lệ biến
Fullbase
mkk <- nmk[nmk$fullbase == 'yes',]
prop.test( length(mkk$fullbase), length(nmk$fullbase))
##
## 1-sample proportions test with continuity correction
##
## data: length(mkk$fullbase) out of length(nmk$fullbase), null probability 0.5
## X-squared = 48.661, df = 1, p-value = 3.042e-12
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3101042 0.3916759
## sample estimates:
## p
## 0.3498168
Nhận xét: Với độ tin cậy 95% ta có tỷ lệ người bán nhà có tầng hầm
được trang bị hoàn thiện trong cuộc khảo sát nằm trong khoảng từ 31,01%
đến 39,2%.
Ước lượng tỷ lệ biến
Prerfer
mkkk <- nmk[nmk$prefer =='yes',]
prop.test( length(mkkk$prefer), length(nmk$prefer))
##
## 1-sample proportions test with continuity correction
##
## data: length(mkkk$prefer) out of length(nmk$prefer), null probability 0.5
## X-squared = 152.97, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1999671 0.2727033
## sample estimates:
## p
## 0.2344322
Nhận xét: Với độ tin cậy 95% ta có tỷ lệ những ngôi nhà đó nằm trong
khu vực trung tâm thành phố trong cuộc khảo sát nằm trong khoảng từ 20%
đến 27,27%.
Ước lượng Relative risk
và Odd risk
Fullbase và
Driveway
RelRisk(mk)
## [1] 1.263197
riskratio(mk)
## $data
##
## no yes Total
## no 54 301 355
## yes 23 168 191
## Total 77 469 546
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## no 1.00000 NA NA
## yes 1.03738 0.9686805 1.110951
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## no NA NA NA
## yes 0.3141123 0.367124 0.3102127
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhận xét:
Tỷ lệ người có nhà không có khu vực đậu xe riêng và không có tầng
hầm được trang bị hoàn thiện nhiều hơn 26% so với tỷ lệ người có nhà
không có khu vực đậu xe riêng nhưng có tầng hầm được trang bị hoàn
thiện.
Tỷ lệ người có nhà có khu vực đậu xe riêng và có tầng hầm được
trang bị hoàn thiện nhiều hơn 3,7% so với tỷ lệ người có nhà có khu vực
đậu xe riêng nhưng không có tầng hầm được trang bị hoàn thiện.
oddsratio(mk)
## $data
##
## no yes Total
## no 54 301 355
## yes 23 168 191
## Total 77 469 546
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## no 1.000000 NA NA
## yes 1.305199 0.7811282 2.24292
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## no NA NA NA
## yes 0.3141123 0.367124 0.3102127
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
NHận xét: Tỷ lệ những người có nhà có khu vực đậu xe riêng trên những
người có nhà không có khu vực đậu xe riêng trong số những người có nhà
không có tầng hầm được trang bị hoàn thiện nhiều hơn 30,5% so với tỷ lệ
những người có nhà có khu vực đậu xe riêng trên những người có nhà không
có khu vực đậu xe riêng trong số những người có nhà có tầng hầm được
trang bị hoàn thiện.
Fullbase và
Prefer
RelRisk(mk1)
## [1] 1.320615
riskratio(mk1)
## $data
##
## no yes Total
## no 297 58 355
## yes 121 70 191
## Total 418 128 546
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## no 1.000000 NA NA
## yes 2.243185 1.661303 3.028874
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## no NA NA NA
## yes 1.724756e-07 1.669965e-07 9.151904e-08
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhận xét:
Tỷ lệ những người nhà không có tầng hầm được trang bị hoàn thiện
không nằm trong khu vực trung thành phố nhiều hơn 32% so với tỷ lệ những
người nhà có tầng hầm được trang bị hoàn thiện không nằm trong khu vực
trung thành phố.
Tỷ lệ những người có nhà nằm trong khu vực trung tâm thành phố có
tầng hầm được trang bị hoàn thiện bằng 2,24 lần tỷ lệ những người có nhà
nằm trong khu vực trung tâm thành phố không có tầng được trang bị hoàn
thiện.
oddsratio(mk1)
## $data
##
## no yes Total
## no 297 58 355
## yes 121 70 191
## Total 418 128 546
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## no 1.00000 NA NA
## yes 2.95422 1.967706 4.455468
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## no NA NA NA
## yes 1.724756e-07 1.669965e-07 9.151904e-08
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Nhận xét: Tỷ lệ những người có nhà nằm trong khu vực trung tâm thành
phố trên những người không có nhà trong khu vực trung tâm thành phố của
những ngôi nhà không có tầng hầm được trang bị hoàn thiện bằng 2,95 lần
tỷ lệ những người có nhà nằm trong khu vực trung tâm thành phố trên
những người có nhà không nằm trong khu vực trung tâm thành phố của những
ngôi nhà có tầng hầm được trang bị hoàn thiện
LS0tDQp0aXRsZTogIkLDoGkgdOG6rXAgduG7gSBuaMOgIg0KYXV0aG9yOiAiTmd1eeG7hW4gTWluaCBLaGFuZyINCmRhdGU6ICIyMDI0LTA2LTAxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICANCg0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgICANCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQo8c3R5bGU+DQogIGJvZHkgew0KICAgIGZvbnQtc2l6ZTogMjJweDt9DQo8L3N0eWxlPg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSgidGlkeXZlcnNlIikNCmxpYnJhcnkoIkRUIikNCmxpYnJhcnkoImdncGxvdDIiKQ0KbGlicmFyeSgic2NhbGVzIikNCmxpYnJhcnkoInJ2ZXN0IikNCmxpYnJhcnkoIm5ldHN0YXQiKQ0KbGlicmFyeSgic3RyaW5nciIpDQpsaWJyYXJ5KCJlcGl0b29scyIpDQpsaWJyYXJ5KCJjYXJldCIpDQpsaWJyYXJ5KCJEZXNjVG9vbHMiKQ0KYGBgDQoNCiMgR2nhu5tpIHRoaeG7h3UgYuG7mSBk4buvIGxp4buHdQ0KDQoqKkRhdGFzZXQ6IEhvdXNlUHJpY2VzIC0gUGFja2FnZSBBRVIuKiogQuG7mSBk4buvIGxp4buHdSAiSG91c2VQcmljZXMiIMSRxrDhu6NjIGzhuqV5IHThu6sgZ8OzaSBBRVIuDQpUcm9uZyBi4buZIGThu68gdHLDqm4gbGnDqm4gcXVhbiDEkeG6v24gZ2nDoSBiw6FuIGPhu6dhIDU0NiBjxINuIG5ow6Ag4bufIHRow6BuaCBwaOG7kSBXaW5kc29yLCBDYW5hZGEgdHJvbmcgdGjDoW5nIDcsOCw5IGPhu6dhIG7Eg20gMTk4Ny4NCg0KROG7ryBsaeG7h3UgdHLDqm4gYmFvIGfhu5NtIDEyIGJp4bq/bjogNiBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB2w6AgNiBiaeG6v24gxJHhu4tuaCB0w61uaC4NCg0KLSAgIFByaWNlOiBHacOhIGLDoW4gY+G7p2EgbmfDtGkgbmjDoCAobmdow6xuIMSRw7QpDQotICAgTG90c2l6ZTogRGnhu4duIHTDrWNoIGPhu6dhIG5nw7RpIG5ow6AgbMOgIGJhbyBuaGnDqnUgbcOpdCB2dcO0bmcNCi0gICBCZWRyb29tczogU+G7kSBwaMOybmcgbmfhu6cgY+G7p2EgbmfDtGkgbmjDoA0KLSAgIEJhdGhyb29tczogU+G7kSBwaMOybmcgdOG6r20gY+G7p2EgbmfDtGkgbmjDoA0KLSAgIFN0b3JpZXM6IE5ow6AgY8OzIGJhbyBuaGnDqnUgdOG6p25nKGtow7RuZyB0w61uaCB04bqnbmcgaOG6p20pDQotICAgR2FyYWdlOiBT4buRIGdhcmEgdHJvbmcgbmjDoA0KLSAgIERyaXZld2F5OiBOaMOgIGPDsyBjaOG7lyDEkeG6rXUgeGUgcmnDqm5nIGhheSBraMO0bmc/DQotICAgUmVjcmVhdGlvbjogVHJvbmcgbmjDoCBjw7MgcGjDsm5nIGdp4bqjaSB0csOtIGtow7RuZz8NCi0gICBGdWxsYmFzZTogVOG6p25nIGjhuqdtIGPhu6dhIG5nw7RpIG5ow6AgxJHDoyDEkcaw4bujYyBob8OgbiB0aGnhu4duIGhheSBjaMawYT8NCi0gICBHYXNoZWF0OiBOaMOgIGPDsyBz4butIGThu6VuZyBnYXMgxJHhu4MgxJF1biBuxrDhu5tjIG7Ds25nIGtow7RuZz8NCi0gICBBaXJjb246IE5ow6AgY8OzIHPhu60gZOG7pW5nIG3DoXkgxJFp4buBdSBow7JhIGtow7RuZz8NCi0gICBQcmVmZXI6IE5nw7RpIG5ow6AgY8OzIG7hurFtIHRyb25nIHRydW5nIHTDom0gY+G7p2EgdGjDoG5oIHBo4buRIGhheSBraMO0bmc/DQoNCiANCmBgYHtyfQ0Kbm1rIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9WSVAvRG93bmxvYWRzL0hvdXNlUHJpY2VzLmNzdiIpDQpzdHIobm1rKQ0KYGBgDQoNCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5ENCg0KIyMgIELhuqNuZyB04bqnbiBz4buRIA0KDQoNCmBgYHtyfQ0KZGF0YXRhYmxlKG5taykNCmBgYA0KDQojIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBnaeG7r2EgYmnhur9uIEZ1bGxiYXNlIHbDoCBiaeG6v24gRHJpdmV3YXkNCg0KLSBHaeG6o2kgdGjDrWNoOiBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBnaeG7r2EgaGFpIGJp4bq/biB0csOqbiBjaG8gY2jDum5nIHRhIGJp4bq/dCBt4buRaSBsacOqbiBo4buHIGdp4buvYSAyIGJp4bq/biB0csOqbiBsw6AgbmjGsCB0aOG6vyBuw6BvPw0KDQpgYGB7cn0NCm1rIDwtIHRhYmxlKG5tayRmdWxsYmFzZSwgbm1rJGRyaXZld2F5KQ0KYWRkbWFyZ2lucyhtaykNCmBgYA0KDQpOaOG6rW4geMOpdDogDQoNCi0gQ8OzIDU0IG5nxrDhu51pIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBuaMOgIGtow7RuZyBjw7Mga2h1IHbhu7FjIMSR4bqtdSB4ZSByacOqbmcgdsOgIGtow7RuZyBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbi4NCg0KLSBDw7MgMzAxIG5nxrDhu51pIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBuaMOgIGPDsyBraHUgduG7sWMgxJHhuq11IHhlIHJpw6puZyBuaMawbmcga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duLg0KDQotIEPDsyAzNCBuZ8aw4budaSB0cm9uZyBjdeG7mWMga2jhuqNvIHPDoXQgbmjDoCBraMO0bmcgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIG5oxrBuZyBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbi4NCg0KLSBDw7MgMTY4IG5nxrDhu51pIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBuaMOgIGPDsyBraHUgduG7sWMgxJHhuq11IHhlIHJpw6puZyB2w6AgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24uDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIGdp4buvYSBiaeG6v24gZnVsbGJhc2UgdsOgIGJp4bq/biBwcmVmZXINCg0KYGBge3J9DQptazEgPC0gdGFibGUobm1rJGZ1bGxiYXNlLCBubWskcHJlZmVyKQ0KYWRkbWFyZ2lucyhtazEpDQpgYGANCg0KTmjhuq1uIHjDqXQ6IA0KDQotIEPDsyAyOTcgbmfGsOG7nWkgY8OzIG5ow6Aga2jDtG5nIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSB2w6Aga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duLg0KDQotIEPDsyAxMjEgbmfGsOG7nWkgY8OzIG5ow6Aga2jDtG5nIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBuaMawbmcgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24uDQoNCi0gQ8OzIDU4IG5nxrDhu51pIGPDsyBuaMOgIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBuaMawbmcga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duLg0KDQotIEPDsyA3MCBuZ8aw4budaSBjw7MgbmjDoCBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgdsOgIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duLg0KDQojIFbhur0gxJHhu5MgdGjhu4sgDQoNCiMjIMSQ4buTIHRo4buLIGdp4buvYSBiaeG6v24gKkZ1bGxiYXNlKiB2w6AgYmnhur9uICpEcml2ZXdheSoNCg0KYGBge3J9DQpubWsgfD4gY291bnQoZnVsbGJhc2UsIGRyaXZld2F5KSB8Pg0KICBncm91cF9ieShmdWxsYmFzZSkgfD4NCiAgbXV0YXRlKHBIID0gbi9zdW0obikpIHw+DQogIGdncGxvdChhZXMoeCA9IGZ1bGxiYXNlLCB5ID0gbiwgZmlsbCA9IGRyaXZld2F5KSkgKw0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocEgsIGFjY3VyYWN5ID0gLjAxKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBzaXplID0gNCkgKw0KICB5bGFiKCdkcml2ZXdheScpICsNCiAgeGxhYignZnVsbGJhc2UnKQ0KYGBgDQpOaOG6rW4geMOpdDogDQoNCi0gVHJvbmcgc+G7kSBuaOG7r25nIG5nw7RpIG5ow6Aga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duIHRow6wgY8OzIDg0LDc5JSBsw6AgbmjDoCBjw7Mga2h1IHbhu7FjIMSR4bqtdSB4ZSByacOqbmcgdsOgIDE1LDIxJSBsw6AgbmjDoCBraMO0bmcgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nLg0KDQotVHJvbmcgc+G7kSBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24gdGjDrCBjw7MgODcsOTYlIGzDoCBuaMOgIGPDsyBraHUgduG7sWMgxJHhuq11IHhlIHJpw6puZyB2w6AgMTIsMDQlIGzDoCBuaMOgIGtow7RuZyBjw7Mga2h1IHbhu7FjIMSR4bqtdSB4ZSByacOqbmcuDQoNCiMjIMSQ4buTIHRo4buLIGdp4buvYSBiaeG6v24gKkZ1bGxiYXNlKiB2w6AgYmnhur9uICpQcmVyZmVyKg0KDQpgYGB7cn0NCm5tayB8PiBjb3VudChmdWxsYmFzZSwgcHJlZmVyKSB8Pg0KICBncm91cF9ieShmdWxsYmFzZSkgfD4NCiAgbXV0YXRlKHBIID0gbi9zdW0obikpIHw+DQogIGdncGxvdChhZXMoeCA9IGZ1bGxiYXNlLCB5ID0gbiwgZmlsbCA9IHByZWZlcikpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KHBILCBhY2N1cmFjeSA9IC4wMSkpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgc2l6ZSA9IDQpICsNCiAgeWxhYigncHJlZmVyJykgKw0KICB4bGFiKCdmdWxsYmFzZScpDQpgYGANCk5I4bqtbiB4w6l0OiANCg0KLSBUcm9uZyBz4buRIG5o4buvbmcgbmfDtGkgbmjDoCBraMO0bmcgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24gdGjDrCBjw7MgODMsNjYlIGtow7RuZyBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgdsOgIDE2LDM0JSBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EuDQoNCi0gVHJvbmcgc+G7kSBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24gdGjDrCBjw7MgNjMsMzUlIGtow7RuZyBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgdsOgIDM2LDY1JSBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EuDQoNCg0KIyDGr+G7mmMgbMaw4bujbmcgdOG7tyBs4buHIA0KDQojIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGJp4bq/biAqRnVsbGJhc2UqDQoNCmBgYHtyfQ0KbWtrIDwtIG5ta1tubWskZnVsbGJhc2UgPT0gJ3llcycsXQ0KcHJvcC50ZXN0KCBsZW5ndGgobWtrJGZ1bGxiYXNlKSwgbGVuZ3RoKG5tayRmdWxsYmFzZSkpDQpgYGANCg0KTmjhuq1uIHjDqXQ6IFbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUgdGEgY8OzIHThu7cgbOG7hyBuZ8aw4budaSBiw6FuIG5ow6AgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24gdHJvbmcgY3Xhu5ljIGto4bqjbyBzw6F0IG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMzEsMDElIMSR4bq/biAzOSwyJS4NCg0KIyMgxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyBiaeG6v24gKlByZXJmZXIqDQoNCmBgYHtyfQ0KbWtrayA8LSBubWtbbm1rJHByZWZlciA9PSd5ZXMnLF0NCnByb3AudGVzdCggbGVuZ3RoKG1ra2skcHJlZmVyKSwgbGVuZ3RoKG5tayRwcmVmZXIpKQ0KYGBgDQoNCk5o4bqtbiB4w6l0OiBW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIHRhIGPDsyB04bu3IGzhu4cgbmjhu69uZyBuZ8O0aSBuaMOgIMSRw7MgbuG6sW0gdHJvbmcga2h1IHbhu7FjIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDIwJSDEkeG6v24gMjcsMjclLg0KDQoNCiMgxq/hu5tjIGzGsOG7o25nIFJlbGF0aXZlIHJpc2sgdsOgIE9kZCByaXNrDQoNCiMjIEZ1bGxiYXNlIHbDoCBEcml2ZXdheQ0KDQpgYGB7cn0NClJlbFJpc2sobWspDQpgYGANCmBgYHtyfQ0Kcmlza3JhdGlvKG1rKQ0KYGBgDQpOaOG6rW4geMOpdDogDQoNCi0gVOG7tyBs4buHIG5nxrDhu51pIGPDsyBuaMOgIGtow7RuZyBjw7Mga2h1IHbhu7FjIMSR4bqtdSB4ZSByacOqbmcgdsOgIGtow7RuZyBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbiBuaGnhu4F1IGjGoW4gMjYlIHNvIHbhu5tpIHThu7cgbOG7hyBuZ8aw4budaSBjw7MgbmjDoCBraMO0bmcgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIG5oxrBuZyBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbi4NCg0KLSBU4bu3IGzhu4cgbmfGsOG7nWkgY8OzIG5ow6AgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIHbDoCBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbiBuaGnhu4F1IGjGoW4gMyw3JSBzbyB24bubaSB04bu3IGzhu4cgbmfGsOG7nWkgY8OzIG5ow6AgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIG5oxrBuZyBraMO0bmcgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24uDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKG1rKQ0KYGBgDQpOSOG6rW4geMOpdDogVOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6AgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIHRyw6puIG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6Aga2jDtG5nIGPDsyBraHUgduG7sWMgxJHhuq11IHhlIHJpw6puZyB0cm9uZyBz4buRIG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6Aga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duIG5oaeG7gXUgaMahbiAzMCw1JSBzbyB24bubaSB04bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBjw7MgbmjDoCBjw7Mga2h1IHbhu7FjIMSR4bqtdSB4ZSByacOqbmcgdHLDqm4gbmjhu69uZyBuZ8aw4budaSBjw7MgbmjDoCBraMO0bmcgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgcmnDqm5nIHRyb25nIHPhu5Egbmjhu69uZyBuZ8aw4budaSBjw7MgbmjDoCBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbi4NCg0KIyMgRnVsbGJhc2UgdsOgIFByZWZlcg0KDQpgYGB7cn0NClJlbFJpc2sobWsxKQ0KYGBgDQpgYGB7cn0NCnJpc2tyYXRpbyhtazEpDQpgYGANCk5o4bqtbiB4w6l0OiANCg0KLSBU4bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBuaMOgIGtow7RuZyBjw7MgdOG6p25nIGjhuqdtIMSRxrDhu6NjIHRyYW5nIGLhu4sgaG/DoG4gdGhp4buHbiBraMO0bmcgbuG6sW0gdHJvbmcga2h1IHbhu7FjIHRydW5nIHRow6BuaCBwaOG7kSBuaGnhu4F1IGjGoW4gMzIlIHNvIHbhu5tpIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIG5ow6AgY8OzIHThuqduZyBo4bqnbSDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24ga2jDtG5nIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0aMOgbmggcGjhu5EuDQoNCi0gVOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6AgbuG6sW0gdHJvbmcga2h1IHbhu7FjIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duIGLhurFuZyAyLDI0IGzhuqduIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyBuaMOgIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBraMO0bmcgY8OzIHThuqduZyDEkcaw4bujYyB0cmFuZyBi4buLIGhvw6BuIHRoaeG7h24uDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKG1rMSkNCg0KYGBgDQpOaOG6rW4geMOpdDogVOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6AgbuG6sW0gdHJvbmcga2h1IHbhu7FjIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIHRyw6puIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPDsyBuaMOgIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBj4bunYSBuaOG7r25nIG5nw7RpIG5ow6Aga2jDtG5nIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duIGLhurFuZyAyLDk1IGzhuqduIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyBuaMOgIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSB0csOqbiBuaOG7r25nIG5nxrDhu51pIGPDsyBuaMOgIGtow7RuZyBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgY+G7p2Egbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyB04bqnbmcgaOG6p20gxJHGsOG7o2MgdHJhbmcgYuG7iyBob8OgbiB0aGnhu4duDQoNCg0KDQoNCg0KDQoNCg0KDQo=