Hypothesis testing

1. Comparing the means

data <- read.csv("./data/Student.csv")
head(data)

aggregate(x = data$GPA,
          by = list(data$Seat), 
          FUN = mean)

2. Checking the distributions

GPA_Back <- data[data$Seat == "Back", ]$GPA
GPA_Front <- data[data$Seat == "Front", ]$GPA

hist(GPA_Front)

boxplot(GPA_Front, GPA_Back, names = c('Front','Back'))

3. t-test and inference

t.test(GPA_Back, GPA_Front) # two tailed test

    Welch Two Sample t-test

data:  GPA_Back and GPA_Front
t = -3.1562, df = 273.52, p-value = 0.001777
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.28296881 -0.06556891
sample estimates:
mean of x mean of y 
 3.077015  3.251284 
t.test(GPA_Back, GPA_Front, alternative="less") # one tailed test

    Welch Two Sample t-test

data:  GPA_Back and GPA_Front
t = -3.1562, df = 273.52, p-value = 0.0008885
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
        -Inf -0.08313998
sample estimates:
mean of x mean of y 
 3.077015  3.251284 
t.test(GPA_Front, alternative="greater", mu = 3.2) # one tailed test

    One Sample t-test

data:  GPA_Front
t = 1.3874, df = 147, p-value = 0.08371
alternative hypothesis: true mean is greater than 3.2
95 percent confidence interval:
 3.190099      Inf
sample estimates:
mean of x 
 3.251284 

Probability distributions

1. Binominal distribution

例題:某網購公司規定消費者在一週內(7 days)對於購買商品可全額退款。 根據過去記錄,平均每週會有2件退貨商品。 請繪製該公司在1個月內(30 days)退貨商品數量的機率分布圖(probability distribution function, PDF)。估計一個月的退貨商品數超過10件的機率。

random number generation


p = 2/7
n = 30

GenNumbers <- function(){
  x <- sample(1:7, 1, replace=T)
  if (x <= 2) L = 1 else L = 0 

  for (i in 1:29) {
    x <- sample(1:7, 1, replace=T)
    if (x <= 2) event = 1 else event = 0 
    L = c(L, event)
    sum_L = sum(L)
  }
  
  return(sum_L)
}

generating distributions

vector_a <- vector()

for (i in 1:1000){
  a <- GenNumbers()
  vector_a <- c(vector_a, a)
}

hist(vector_a, freq = F)

calculating probability

count_GT10 <- length(vector_a[vector_a>10])
Prob_GT10 <- count_GT10 / 1000

using built-in functions

dbinom(x, size, prob): prob density of x

pbinom(x, size, prob): p(<= x)

qbinom(p, size, prob): quantile function

rbinom(n, size, prob): generates random deviates

# 一個月的退貨商品數超過10件的機率
p = pbinom(10, size=30, prob= 2/7) # prob(X <=10)
(pGT10 <- 1 - p)
[1] 0.2146092
# 1個月內(30 days)退貨商品數量的機率分布圖(PDF)
xlab <- vector()
prob <- vector()
for (i in 1:20){
  xlab[i] <- toString(i)
  prob[i] <- dbinom(i, size=30, prob= 2/7)
}

barplot(prob, names.arg = xlab, xlab="退貨商品數", ylab="機率" )

2. Normal distribution

dnorm(35, mean=30, sd=5) # DF, P(x=35)
pnorm(35, mean=30, sd=5) # CDF, P(x<=35)
qnorm(0.05, mean=100, sd=15) # given prob. --> x
rnorm(10, mean=100, sd=15)   # generates random deviates x

Charts and graphics

library(ggplot2)

housing <- read.csv("./data/landdata.csv")
head(housing)
NA

1. Histogram

hist(housing$Home.Value)

ggplot(housing) + aes(x = Home.Value) + geom_histogram()

2. Scatterplot

hp2001Q1 <- subset(housing, Date == 2001.25) 
ggplot(hp2001Q1) + aes(y = Structure.Cost, x = Land.Value) + geom_point()

ggplot(hp2001Q1) + aes(y = Structure.Cost, x = log(Land.Value)) + geom_point()


# more complex
seldata <-subset(hp2001Q1, region %in% c("South", "West"))
# seldata2 <-subset(housing, Date == 2001.25 & region %in% c("South", "West"))
ggplot(seldata) + aes(x=Structure.Cost, y=Land.Value, color=region) + geom_point()

p1 <- ggplot(hp2001Q1) + aes(x = log(Land.Value), y = Structure.Cost)

p1 + geom_point()


p2 <- p1 + geom_point(aes(color = Home.Value)) # setting dot color or size 
p2


p2 + geom_smooth()

3. Bar chart

ggplot(housing) + aes(x=region) + geom_bar()


# Stacked Bar Chart
ggplot(housing) + aes(x=region, fill= as.factor(Qrtr)) + geom_bar() + 
  labs(title = "Stacked Bar Chart", x = "REGION", y = "Counts")

# ?aggregate
# aggregate(x, by, FUN...)
housing.sum <- aggregate(housing["Home.Value"], housing["State"], FUN=mean)
head(housing.sum)

# ggplot(housing.sum) + aes(x=State, y=Home.Value) + geom_bar() # WRONG
ggplot(housing.sum) + aes(x=State, y=Home.Value) + geom_bar(stat='identity')

4. Pie chart

housing2.sum <- aggregate(housing["Home.Value"], housing["region"], FUN=length) 
ggplot(housing2.sum) + aes(x=region, y=Home.Value) + geom_bar(stat='identity') + labs(y="Counts")

ggplot(housing2.sum) + aes(x="", y=Home.Value, fill = factor(region)) + 
  geom_bar(stat='identity',width=1) + coord_polar(theta = "y", start=0)

5. Box plot

ggplot(housing) + aes(x = region, y= Home.Value) + geom_boxplot(fill = "green")+ 
  scale_y_continuous("hoem value", breaks= seq(0,800000, by=100000))

6. Heat map


ggplot(housing) + aes(x= Year, y= Qrtr) + geom_raster(aes(fill = Home.Value)) + 
  scale_fill_continuous(name="Value", breaks = c(200000, 500000, 800000), 
                        labels = c("200", "500", "800"), low='white', high='red')

7. Combined plots

## Combine Scatter plot + marginal histogram/box plot
## install.packages("ggExtra") 
library(ggExtra)
p1 <- ggplot(hp2001Q1) + aes(x = log(Land.Value), y = Structure.Cost)
p1 + geom_point(size = 2, color="red")

px<- p1 + geom_point(size = 2, color="red")
ggMarginal(px, type = "histogram", fill="red")

ggMarginal(px, type = "boxplot", fill="gray")


Assignments

1.機率分布

(a).某一都市有10萬人口,假設流行一種新興疾病,每人每年被感染機率 p = 0.01, 沒有免疫與任何預防措施。請繪製該市的每年感染人數頻率分布圖。

(b).該市衛生當局定義若某年的感染人數超過960人,該年則視為疫情爆發。 市長的任期是4年,若任期內爆發疫情事件,就必須辭職下台。 請評估市長在任期四年內,因疫情爆發而辭職的機率?

2. 繪製統計圖表與統計檢定(Student.csv)

(a). 比較不同性別(Gender),其讀書時間(StudyHrs)是否有顯著差異?

(b). 比較不同性別(Gender),對於虔誠信仰宗教的比例(ReligImp)是否有顯著差異?

LS0tDQp0aXRsZTogIlNwYXRpYWwgQW5hbHlzaXM6IDAxIg0KYXV0aG9yOiAiVHphaS1IdW5nIFdlbiINCmRhdGU6ICcyMDI1LTAyLTI0Jw0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNg0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KLS0tDQoNCiMgSHlwb3RoZXNpcyB0ZXN0aW5nDQoNCiMjIDEuIENvbXBhcmluZyB0aGUgbWVhbnMNCg0KYGBge3J9DQpkYXRhIDwtIHJlYWQuY3N2KCIuL2RhdGEvU3R1ZGVudC5jc3YiKQ0KaGVhZChkYXRhKQ0KDQphZ2dyZWdhdGUoeCA9IGRhdGEkR1BBLA0KICAgICAgICAgIGJ5ID0gbGlzdChkYXRhJFNlYXQpLCANCiAgICAgICAgICBGVU4gPSBtZWFuKQ0KYGBgDQoNCiMjIDIuIENoZWNraW5nIHRoZSBkaXN0cmlidXRpb25zDQoNCmBgYHtyfQ0KR1BBX0JhY2sgPC0gZGF0YVtkYXRhJFNlYXQgPT0gIkJhY2siLCBdJEdQQQ0KR1BBX0Zyb250IDwtIGRhdGFbZGF0YSRTZWF0ID09ICJGcm9udCIsIF0kR1BBDQoNCmhpc3QoR1BBX0Zyb250KQ0KYm94cGxvdChHUEFfRnJvbnQsIEdQQV9CYWNrLCBuYW1lcyA9IGMoJ0Zyb250JywnQmFjaycpKQ0KDQpgYGANCg0KIyMgMy4gdC10ZXN0IGFuZCBpbmZlcmVuY2UNCg0KYGBge3J9DQp0LnRlc3QoR1BBX0JhY2ssIEdQQV9Gcm9udCkgIyB0d28gdGFpbGVkIHRlc3QNCmBgYA0KDQpgYGB7cn0NCnQudGVzdChHUEFfQmFjaywgR1BBX0Zyb250LCBhbHRlcm5hdGl2ZT0ibGVzcyIpICMgb25lIHRhaWxlZCB0ZXN0DQpgYGANCg0KYGBge3J9DQp0LnRlc3QoR1BBX0Zyb250LCBhbHRlcm5hdGl2ZT0iZ3JlYXRlciIsIG11ID0gMy4yKSAjIG9uZSB0YWlsZWQgdGVzdA0KYGBgDQoNCjxocj4NCg0KIyBQcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zDQoNCiMjIDEuIEJpbm9taW5hbCBkaXN0cmlidXRpb24NCg0K5L6L6aGM77ya5p+Q57ay6LO85YWs5Y+46KaP5a6a5raI6LK76ICF5Zyo5LiA6YCx5YWnKDcgZGF5cynlsI3mlrzos7zosrfllYblk4Hlj6/lhajpoY3pgIDmrL7jgIIg5qC55pOa6YGO5Y676KiY6YyE77yM5bmz5Z2H5q+P6YCx5pyD5pyJMuS7tumAgOiyqOWVhuWTgeOAgiDoq4vnuaroo73oqbLlhazlj7jlnKgx5YCL5pyI5YWnKDMwIGRheXMp6YCA6LKo5ZWG5ZOB5pW46YeP55qE5qmf546H5YiG5biD5ZyWKHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiwgUERGKeOAguS8sOioiOS4gOWAi+aciOeahOmAgOiyqOWVhuWTgeaVuOi2hemBjjEw5Lu255qE5qmf546H44CCDQoNCiMjIyByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24NCg0KYGBge3J9DQoNCnAgPSAyLzcNCm4gPSAzMA0KDQpHZW5OdW1iZXJzIDwtIGZ1bmN0aW9uKCl7DQogIHggPC0gc2FtcGxlKDE6NywgMSwgcmVwbGFjZT1UKQ0KICBpZiAoeCA8PSAyKSBMID0gMSBlbHNlIEwgPSAwIA0KDQogIGZvciAoaSBpbiAxOjI5KSB7DQogICAgeCA8LSBzYW1wbGUoMTo3LCAxLCByZXBsYWNlPVQpDQogICAgaWYgKHggPD0gMikgZXZlbnQgPSAxIGVsc2UgZXZlbnQgPSAwIA0KICAgIEwgPSBjKEwsIGV2ZW50KQ0KICAgIHN1bV9MID0gc3VtKEwpDQogIH0NCiAgDQogIHJldHVybihzdW1fTCkNCn0NCg0KYGBgDQoNCiMjIyBnZW5lcmF0aW5nIGRpc3RyaWJ1dGlvbnMNCg0KYGBge3J9DQp2ZWN0b3JfYSA8LSB2ZWN0b3IoKQ0KDQpmb3IgKGkgaW4gMToxMDAwKXsNCiAgYSA8LSBHZW5OdW1iZXJzKCkNCiAgdmVjdG9yX2EgPC0gYyh2ZWN0b3JfYSwgYSkNCn0NCg0KaGlzdCh2ZWN0b3JfYSwgZnJlcSA9IEYpDQoNCmBgYA0KDQojIyMgY2FsY3VsYXRpbmcgcHJvYmFiaWxpdHkNCg0KYGBge3J9DQpjb3VudF9HVDEwIDwtIGxlbmd0aCh2ZWN0b3JfYVt2ZWN0b3JfYT4xMF0pDQpQcm9iX0dUMTAgPC0gY291bnRfR1QxMCAvIDEwMDANCmBgYA0KDQojIyMgdXNpbmcgYnVpbHQtaW4gZnVuY3Rpb25zDQoNCmRiaW5vbSh4LCBzaXplLCBwcm9iKTogcHJvYiBkZW5zaXR5IG9mIHgNCg0KcGJpbm9tKHgsIHNpemUsIHByb2IpOiBwKFw8PSB4KQ0KDQpxYmlub20ocCwgc2l6ZSwgcHJvYik6IHF1YW50aWxlIGZ1bmN0aW9uDQoNCnJiaW5vbShuLCBzaXplLCBwcm9iKTogZ2VuZXJhdGVzIHJhbmRvbSBkZXZpYXRlcw0KDQpgYGB7cn0NCiMg5LiA5YCL5pyI55qE6YCA6LKo5ZWG5ZOB5pW46LaF6YGOMTDku7bnmoTmqZ/njocNCnAgPSBwYmlub20oMTAsIHNpemU9MzAsIHByb2I9IDIvNykgIyBwcm9iKFggPD0xMCkNCihwR1QxMCA8LSAxIC0gcCkNCg0KIyAx5YCL5pyI5YWnKDMwIGRheXMp6YCA6LKo5ZWG5ZOB5pW46YeP55qE5qmf546H5YiG5biD5ZyWKFBERikNCnhsYWIgPC0gdmVjdG9yKCkNCnByb2IgPC0gdmVjdG9yKCkNCmZvciAoaSBpbiAxOjIwKXsNCiAgeGxhYltpXSA8LSB0b1N0cmluZyhpKQ0KICBwcm9iW2ldIDwtIGRiaW5vbShpLCBzaXplPTMwLCBwcm9iPSAyLzcpDQp9DQoNCmJhcnBsb3QocHJvYiwgbmFtZXMuYXJnID0geGxhYiwgeGxhYj0i6YCA6LKo5ZWG5ZOB5pW4IiwgeWxhYj0i5qmf546HIiApDQoNCmBgYA0KDQojIyAyLiBOb3JtYWwgZGlzdHJpYnV0aW9uDQoNCmBgYHtyfQ0KZG5vcm0oMzUsIG1lYW49MzAsIHNkPTUpICMgREYsIFAoeD0zNSkNCnBub3JtKDM1LCBtZWFuPTMwLCBzZD01KSAjIENERiwgUCh4PD0zNSkNCnFub3JtKDAuMDUsIG1lYW49MTAwLCBzZD0xNSkgIyBnaXZlbiBwcm9iLiAtLT4geA0Kcm5vcm0oMTAsIG1lYW49MTAwLCBzZD0xNSkgICAjIGdlbmVyYXRlcyByYW5kb20gZGV2aWF0ZXMgeA0KDQpgYGANCg0KPGhyPg0KDQojIENoYXJ0cyBhbmQgZ3JhcGhpY3MNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmhvdXNpbmcgPC0gcmVhZC5jc3YoIi4vZGF0YS9sYW5kZGF0YS5jc3YiKQ0KaGVhZChob3VzaW5nKQ0KDQpgYGANCg0KIyMgMS4gSGlzdG9ncmFtDQoNCmBgYHtyfQ0KaGlzdChob3VzaW5nJEhvbWUuVmFsdWUpDQpnZ3Bsb3QoaG91c2luZykgKyBhZXMoeCA9IEhvbWUuVmFsdWUpICsgZ2VvbV9oaXN0b2dyYW0oKQ0KDQpgYGANCg0KIyMgMi4gU2NhdHRlcnBsb3QNCg0KYGBge3J9DQpocDIwMDFRMSA8LSBzdWJzZXQoaG91c2luZywgRGF0ZSA9PSAyMDAxLjI1KSANCmdncGxvdChocDIwMDFRMSkgKyBhZXMoeSA9IFN0cnVjdHVyZS5Db3N0LCB4ID0gTGFuZC5WYWx1ZSkgKyBnZW9tX3BvaW50KCkNCmdncGxvdChocDIwMDFRMSkgKyBhZXMoeSA9IFN0cnVjdHVyZS5Db3N0LCB4ID0gbG9nKExhbmQuVmFsdWUpKSArIGdlb21fcG9pbnQoKQ0KDQojIG1vcmUgY29tcGxleA0Kc2VsZGF0YSA8LXN1YnNldChocDIwMDFRMSwgcmVnaW9uICVpbiUgYygiU291dGgiLCAiV2VzdCIpKQ0KIyBzZWxkYXRhMiA8LXN1YnNldChob3VzaW5nLCBEYXRlID09IDIwMDEuMjUgJiByZWdpb24gJWluJSBjKCJTb3V0aCIsICJXZXN0IikpDQpnZ3Bsb3Qoc2VsZGF0YSkgKyBhZXMoeD1TdHJ1Y3R1cmUuQ29zdCwgeT1MYW5kLlZhbHVlLCBjb2xvcj1yZWdpb24pICsgZ2VvbV9wb2ludCgpDQpgYGANCg0KYGBge3J9DQpwMSA8LSBnZ3Bsb3QoaHAyMDAxUTEpICsgYWVzKHggPSBsb2coTGFuZC5WYWx1ZSksIHkgPSBTdHJ1Y3R1cmUuQ29zdCkNCg0KcDEgKyBnZW9tX3BvaW50KCkNCg0KcDIgPC0gcDEgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IEhvbWUuVmFsdWUpKSAjIHNldHRpbmcgZG90IGNvbG9yIG9yIHNpemUgDQpwMg0KDQpwMiArIGdlb21fc21vb3RoKCkNCg0KYGBgDQoNCiMjIDMuIEJhciBjaGFydA0KDQpgYGB7cn0NCmdncGxvdChob3VzaW5nKSArIGFlcyh4PXJlZ2lvbikgKyBnZW9tX2JhcigpDQoNCiMgU3RhY2tlZCBCYXIgQ2hhcnQNCmdncGxvdChob3VzaW5nKSArIGFlcyh4PXJlZ2lvbiwgZmlsbD0gYXMuZmFjdG9yKFFydHIpKSArIGdlb21fYmFyKCkgKyANCiAgbGFicyh0aXRsZSA9ICJTdGFja2VkIEJhciBDaGFydCIsIHggPSAiUkVHSU9OIiwgeSA9ICJDb3VudHMiKQ0KDQpgYGANCg0KYGBge3J9DQojID9hZ2dyZWdhdGUNCiMgYWdncmVnYXRlKHgsIGJ5LCBGVU4uLi4pDQpob3VzaW5nLnN1bSA8LSBhZ2dyZWdhdGUoaG91c2luZ1siSG9tZS5WYWx1ZSJdLCBob3VzaW5nWyJTdGF0ZSJdLCBGVU49bWVhbikNCmhlYWQoaG91c2luZy5zdW0pDQoNCiMgZ2dwbG90KGhvdXNpbmcuc3VtKSArIGFlcyh4PVN0YXRlLCB5PUhvbWUuVmFsdWUpICsgZ2VvbV9iYXIoKSAjIFdST05HDQpnZ3Bsb3QoaG91c2luZy5zdW0pICsgYWVzKHg9U3RhdGUsIHk9SG9tZS5WYWx1ZSkgKyBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpDQpgYGANCg0KIyMgNC4gUGllIGNoYXJ0DQoNCmBgYHtyfQ0KaG91c2luZzIuc3VtIDwtIGFnZ3JlZ2F0ZShob3VzaW5nWyJIb21lLlZhbHVlIl0sIGhvdXNpbmdbInJlZ2lvbiJdLCBGVU49bGVuZ3RoKSANCmdncGxvdChob3VzaW5nMi5zdW0pICsgYWVzKHg9cmVnaW9uLCB5PUhvbWUuVmFsdWUpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0iQ291bnRzIikNCmdncGxvdChob3VzaW5nMi5zdW0pICsgYWVzKHg9IiIsIHk9SG9tZS5WYWx1ZSwgZmlsbCA9IGZhY3RvcihyZWdpb24pKSArIA0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsd2lkdGg9MSkgKyBjb29yZF9wb2xhcih0aGV0YSA9ICJ5Iiwgc3RhcnQ9MCkNCg0KYGBgDQoNCiMjIDUuIEJveCBwbG90DQoNCmBgYHtyfQ0KZ2dwbG90KGhvdXNpbmcpICsgYWVzKHggPSByZWdpb24sIHk9IEhvbWUuVmFsdWUpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAiZ3JlZW4iKSsgDQogIHNjYWxlX3lfY29udGludW91cygiaG9lbSB2YWx1ZSIsIGJyZWFrcz0gc2VxKDAsODAwMDAwLCBieT0xMDAwMDApKQ0KDQpgYGANCg0KIyMgNi4gSGVhdCBtYXANCg0KYGBge3J9DQoNCmdncGxvdChob3VzaW5nKSArIGFlcyh4PSBZZWFyLCB5PSBRcnRyKSArIGdlb21fcmFzdGVyKGFlcyhmaWxsID0gSG9tZS5WYWx1ZSkpICsgDQogIHNjYWxlX2ZpbGxfY29udGludW91cyhuYW1lPSJWYWx1ZSIsIGJyZWFrcyA9IGMoMjAwMDAwLCA1MDAwMDAsIDgwMDAwMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMjAwIiwgIjUwMCIsICI4MDAiKSwgbG93PSd3aGl0ZScsIGhpZ2g9J3JlZCcpDQoNCmBgYA0KDQojIyA3LiBDb21iaW5lZCBwbG90cw0KDQpgYGB7cn0NCiMjIENvbWJpbmUgU2NhdHRlciBwbG90ICsgbWFyZ2luYWwgaGlzdG9ncmFtL2JveCBwbG90DQojIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ0V4dHJhIikgDQpsaWJyYXJ5KGdnRXh0cmEpDQpwMSA8LSBnZ3Bsb3QoaHAyMDAxUTEpICsgYWVzKHggPSBsb2coTGFuZC5WYWx1ZSksIHkgPSBTdHJ1Y3R1cmUuQ29zdCkNCnAxICsgZ2VvbV9wb2ludChzaXplID0gMiwgY29sb3I9InJlZCIpDQpweDwtIHAxICsgZ2VvbV9wb2ludChzaXplID0gMiwgY29sb3I9InJlZCIpDQpnZ01hcmdpbmFsKHB4LCB0eXBlID0gImhpc3RvZ3JhbSIsIGZpbGw9InJlZCIpDQpnZ01hcmdpbmFsKHB4LCB0eXBlID0gImJveHBsb3QiLCBmaWxsPSJncmF5IikNCmBgYA0KDQo8aHI+DQoNCiMgQXNzaWdubWVudHMNCg0KIyMgMS7mqZ/njofliIbluIMNCg0KKGEpLuafkOS4gOmDveW4guaciTEw6JCs5Lq65Y+j77yM5YGH6Kit5rWB6KGM5LiA56iu5paw6IiI55a+55eF77yM5q+P5Lq65q+P5bm06KKr5oSf5p+T5qmf546HIHAgPSAwLjAx77yMIOaykuacieWFjeeWq+iIh+S7u+S9lemgkOmYsuaOquaWveOAguiri+e5quijveipsuW4gueahOavj+W5tOaEn+afk+S6uuaVuOmgu+eOh+WIhuW4g+WcluOAgg0KDQooYiku6Kmy5biC6KGb55Sf55W25bGA5a6a576p6Iul5p+Q5bm055qE5oSf5p+T5Lq65pW46LaF6YGOOTYw5Lq677yM6Kmy5bm05YmH6KaW54K655ar5oOF54iG55m844CCIOW4gumVt+eahOS7u+acn+aYrzTlubTvvIzoi6Xku7vmnJ/lhafniIbnmbznlqvmg4Xkuovku7bvvIzlsLHlv4XpoIjovq3ogbfkuIvlj7DjgIIg6KuL6KmV5Lyw5biC6ZW35Zyo5Lu75pyf5Zub5bm05YWn77yM5Zug55ar5oOF54iG55m86ICM6L6t6IG355qE5qmf546HPw0KDQojIyAyLiDnuaroo73ntbHoqIjlnJbooajoiIfntbHoqIjmqqLlrpooU3R1ZGVudC5jc3YpDQoNCihhKS4g5q+U6LyD5LiN5ZCM5oCn5YilKEdlbmRlcinvvIzlhbboroDmm7jmmYLplpMoU3R1ZHlIcnMp5piv5ZCm5pyJ6aGv6JGX5beu55Ww77yfDQoNCihiKS4g5q+U6LyD5LiN5ZCM5oCn5YilKEdlbmRlcinvvIzlsI3mlrzomZToqqDkv6Hku7DlrpfmlZnnmoTmr5TkvosoUmVsaWdJbXAp5piv5ZCm5pyJ6aGv6JGX5beu55Ww77yfDQo=