7. Statistical foundations
7.1 Samples and populations
Example: Sampling from the population
당신은 샌프란시스코(공항코드 SFO)에서 비즈니스 미팅이 있는 여행객을 시간
t에 늦지않게 만나도록 비행계획을 짜야 한다.R의 nycflights13 패키지를
사용한다.
library(tidyverse)
library(mosaic)
library(nycflights13)
SF <- nycflights13::flights %>%
filter(dest == "SFO", !is.na(arr_delay))
set.seed(101)
Sample25 <- SF %>%
sample_n(size = 25)
favstats(~arr_delay, data = Sample25)
단순하게는 가장 많이 지연된 경우인 max의 103분을 참고하여 계획
작성하기를 고려할 수 있다. 하지만 이는 25개 샘플의 결과이기 때문에,
다음의 전체 결과를 보고 비교할 수 있다.
favstats(~arr_delay, data = SF)
전체 데이터(모집단, population)의 경우 최대 지연시간은 1007분인 것을
확인할 수 있다. 이 경우 미팅을 놓치지 않기 위해선 적어도 하루 전, 약
17시간 전으로 비행 계획을 작성할 필요가 있어보인다. 더욱 안전하기 위해선
다음 경우도 고려할 필요가 있다.
- 추가 여행일은 여행자 입장에서 비용이 많이 든다.
- 1,007분 보다 더 비행이 지연될 가능성이 없지 않다.
비용과 지각 가능성을 고려한 현명한 계획을 짜기 위해 2%의 지각
가능성을 두고 98%는 정시에 도착한다고 가정해보자.
qdata(~arr_delay, p = 0.98, data = Sample25)
98%
67.48
98% 백분위 수에 해당하는 지연 시간이 약 67분으로 나타났다. 사실
98분위가 몇 분인지는 중요한 것이 아니다. 2%의 지각 가능성을 열어둔
결과가 과연 효과적인 계획이었는지가 중요하다. 모집단 데이터가
주어져있다면 이를 확인하는 것이 가능하다.
tally(~arr_delay < 68, data = SF, format = "proportion")
arr_delay < 68
TRUE FALSE
0.9297047 0.0702953
지연 확률이 2%를 넘은 7%로 나타났다. 처음 계획이 잘못 계산된 것이다.
모집단 데이터로 다시 계산해본다.
qdata(~arr_delay, p = 0.98, data = SF)
98%
153
모집단을 통해 계산한 결과, 98%의 도착률을 맞추기 위해서는 68분이
아니라 153분의 여유를 두어서 계획해야 함을 알 수 있다.
하지만 본 예시가 아니라 현실에서는 전체 데이터를 접하기 어렵고 샘플
데이터를 가지고 있을 확률이 높다. 이후로는 샘플 데이터를 가지고 높은
효과를 볼 수 있는 방법에 대해 알아볼 예정이다.
7.2 Sample statistics
표본 집단의 통계가 모집단을 얼마나 잘 반영하는지 알아내는 확립된
기술이 있다.
The sampling distribution
표본 추출을 여러 번 실행하여 각 시도에서 표본 통계를 계산하는 방법.
n <- 25
mean(~arr_delay, data = sample_n(SF, size = n, replace = FALSE))
[1] -5.92
아마 이보다도 더 많은 실행을 해보는 것이 좋을 것이다.
trials <- do(500) *
mean(~arr_delay, data = sample_n(SF, size = n, replace = FALSE))
head(trials)
500번 표본 통계를 반복 추출하여 평균 도착 지연시간을 계산해보았다.
결과가 얼마나 분산되어 있는지 보자.
favstats(~mean, data = trials)
500번이나 반복하였으니 표본의 크기는 중요하지 않다. 평균이 중앙값의
약 두 배 가량인 것을 보아 분포가 약간 오른쪽으로 치우쳐져있음을 알 수
있다.
mean(~mean, data = trials) + 2*sd(~mean, data = trials) * c(-1, 1)
[1] -17.23359 23.41647
평균과 표준편차의 계산을 통해 95% 신뢰구간을 보는 것 역시 판단에
참고할 수 있다.
기존의 n=25였던 표본보다 더 큰 n=100인 표본을 사용한다면 어떤 결과를
보일까?
trials_100 <- do(500) *
mean(~arr_delay, data = SF %>% sample_n(size = 100, replace = FALSE))
rbind(trials %>% mutate(n = 25),
trials_100 %>% mutate(n = 100)) %>%
ggplot(aes(x = mean)) +
geom_histogram(bins = 30) +
facet_grid(~n) +
xlab("Sample mean")

(좌) n=25인 표본 분포, (우) n=100인 표본 분포
위 분포도를 통해 알 수 있는 것:
1. 두 표본 분포는 같은 값에서 중앙값을 가진다.
2. 표본의 크기가 큰 분포가 더 작은 표준오차를 가진다. 즉, 더 신뢰도가
높다.
3. 표본의 크기가 큰 경우 종모양 분포를 갖게 되고, 이를 정규분포라고
한다.
7.3 The bootstrap
’bootstrap’이란 모집단에 접근할 수 없는 없는 경우에도 표본 분포를
통해 근사화할 수 있게 하는 통계학적 방법이다. 가지고 있는 표본에서
표본을 추출할 것이며, 이를 ’resampling’이라고 한다. 설명을 위해 flights
데이터를 사용하였다.
small <- sample_n(SF, size = 3, replace = FALSE)
small
위 과정을 중복을 허용하여 resampling한 결과는 다음과 같다.
small %>% sample_n(size = 3, replace = TRUE)
보다시피 부트스트래핑은 데이터를 수집하여 새로운 데이터를 분석하는
것이 아니다. 전에 하던 비행 계획 문제로 돌아가서, 부트스트래핑을
사용하여 크기가 200인 표본에서 계산된 평균 도착 시간의 신뢰도를
추정해보자.
n <- 200
orig_sample <- SF %>% sample_n(size = n, replace = FALSE)
mean(~arr_delay, data = sample_n(orig_sample, size = n, replace = TRUE))
[1] -0.88
위 과정을 반복 resampling하여 평균 도착 지연시간을 계산해보자.
bootstrap_trials <- do(500) * mean(~arr_delay, data = sample_n(orig_sample, size = n, replace = TRUE))
favstats(~mean, data = bootstrap_trials)
부트스트랩을 사용하여 계산한 표준 오차가 모집단에서 반복 샘플을
취하여 계산한 샘플링 분포의 표준 오차에 대한 합리적인 근사치라는 것을
확인할 수 있다.(모집단의 평균이 2.67분이었으므로 1.4분이라는 조금의
차이만 난다.)
회의 시간의 98%를 제 시간에 도착하기로 설정한 항공편 계획 문제로
돌아가보자. 문제에 부트스트래핑을 적용하여 n=200인 표본의 통계 신뢰도를
파악할 수 있다.
qdata(~arr_delay, p = 0.98, data = orig_sample)
98%
195.26
표본은 195분 먼저 도착하도록 비행기를 예약할 것을 제안한다. 본 결과의
신뢰도를 부트스트래핑을 사용하여 확인해보자.
n <- nrow(orig_sample)
num_trials <- 500
sf_200_bs <- 1:num_trials %>%
map_dfr(
~orig_sample %>%
slice_sample(n = n, replace = TRUE) %>%
summarize(q98 = quantile(arr_delay, p = 0.98))
)
sf_200_bs %>%
skim(q98)
결과에 따르면 부트스트랩 표준 오류는 약 182분이고, 95% 신뢰 구간은
182 ± (66*2)분이다. 역시 앞에서 본 195분과 약 13분 정도의 차이가 나는
것을 볼 수 있다.
문제를 해결하는 한 가지 방법은 98번째 백분위수에 대한 보다 신뢰할 수
있는 추정치를 얻기 위해 더 많은 데이터를 수집하는 것이다. n=10,000인
케이스의 표본을 생성하는 작업을 수행해보자.
n_large <- 10000
sf_10000_bs <- SF %>%
slice_sample(n = n_large, replace = FALSE)
sf_200_bs <- 1:num_trials %>%
map_dfr(~sf_10000_bs %>%
slice_sample(n = n_large, replace = TRUE) %>%
summarize(q98 = quantile(arr_delay, p = 0.98))
)
sf_200_bs %>%
skim(q98)
신뢰구간이 153 ± 9분으로 훨씬 작아졌다. 더 많은 데이터가 있으면 특히
꼬리 부분에서 더 쉽게 추정치를 세분화할 수 있다.
7.4 Outliers
데이터는 비정상적이거나 극단적인 이벤트를 식별할 때에도 도움이 된다.
7시간 이상 지연된 비행을 극단적인 상황으로 간주한다고 가정할 때, 420분의
수치는 심각하게 지연된 항공편의 지표로 유용할 수 있다.
SF %>%
filter(arr_delay >= 420) %>%
select(month, day, dep_delay, arr_delay, carrier)
비행 지연의 대부분이 7월, VX항공에서 발생했다. 이 사실은 항공 계획을
짤 때 7월에는 더 시간을 앞당겨서 계획하고, 되도록 VX항공편을 피하라고
조언할 수 있다.
하지만 이상치 자체에 오해가 있을 수도 있다. 해당 특이점은 2013년
뉴욕에서 샌프란시스코로 향하는 항공편의 2%라는 극히 일부를 차지한다.
분포의 주요 부분을 더 잘 이해하기 위해 이러한 점을 제거할 수 있다.
대부분의 항공편은 60분 미만의 지연 없이 도착한다. 더 긴 지연이 발생할
가능성이 있을 때 전조가 될 수 있는 패턴을 식별할 수 있을까? 특이값은
month 또는 carrier가 긴 지연과 연결될 수 있음을 시사했다. 대다수의
데이터에서 이것이 어떻게 작동하는지 보자.
SF %>%
mutate(long_delay = arr_delay > 60) %>%
tally(~long_delay | month, data = .)
month
long_delay 1 2 3 4 5 6 7 8 9 10 11 12
TRUE 29 21 61 112 65 209 226 96 65 36 51 66
FALSE 856 741 812 993 1128 980 966 1159 1124 1177 1107 1093
위 결과에서 60분 이상 지연되는 경우가 6~7월에 가장 많기 때문에, 6월과
7월이 문제의 달임을 알 수 있다.
SF %>% filter(arr_delay < 420) %>%
ggplot(aes(arr_delay)) +
geom_histogram(binwidth = 15)

2013년 NYC공항에서 샌프란시스코행 항공편이 7시간 미만 지연된 항공편의
도착 지연 분포다. 이 분포는 이상값을 제거한 후에도 긴 오른쪽 꼬리를
특징으로 보인다.
SF %>%
mutate(long_delay = arr_delay > 60) %>%
tally(~long_delay | carrier, data = .)
carrier
long_delay AA B6 DL UA VX
TRUE 148 86 91 492 220
FALSE 1250 934 1757 6236 1959
델타 항공(DL)은 합리적인 성능을 제공한다. 이 두 가지 간단한 분석을
통해 여행자에게 6월과 7월에 더 일찍 도착할 계획을 세우고 델타항공을 SFO
여행 항공사로 고려하도록 조언할 수 있다.
7.5 Statistical models: Explaining variation
지금까지 비행 지연의 가능성을 낮추기 위해 month와 carrier를 이용했다.
이처럼 변수를 서로 관련시켜 시스템을 이해하도록 하는 것을 통계
모델링이라고 한다. 다른 예를 들면, 일반적으로 사람들은 비행 지연이 하루
종일 연속되는 경향이 있기 때문에 이른 시간대의 비행이 지연될 가능성이
적다고 생각한다. 모델링을 설명하기 위해 출발 시간이 항공편 지연에 어떤
영향을 미치는지 알아보기로 했다.
tally(~hour, data = SF)
hour
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
55 663 1696 987 429 1744 413 504 476 528 946 897 1491 1091 731 465 57
결과를 통해 항공편이 이른 아침부터 정오까지, 그리고 늦은 오후부터
이른 저녁까지 예정되어 있음을 알 수 있다. 또한 새벽 5시 전이나 밤 9시
이후에는 항공편이 없다는 것을 알 수 있다.
도착 지연이 시간에 따라 어떻게 달라지는지 살펴보기 위해 두 가지
방법을 사용한다.
- 도착 지연의 분포를 보여주기 위해 표준 box-and-whisker 그래프를
사용한다.
- 하루 동안의 평균 도착 지연을 추적할 수 있는 선형 모델이라는 일종의
통계 모델을 사용한다.
SF %>%
ggplot(aes(x = hour, y = arr_delay)) +
geom_boxplot(alpha = 0.1, aes(group = hour)) +
geom_smooth(method = "lm") +
xlab("Scheduled hour of departure") +
ylab("Arrival delay (minutes)")+
coord_cartesian(ylim = c(-30, 120))

그림을 통해 볼 때, 평균 도착 지연시간은 하루동안 증가한다. 추세선은
회귀 모델을 통해 생성된다.
mod1 <- lm(arr_delay ~ hour, data = SF)
msummary(mod1)
Estimate Std. Error t value Pr(>|t|)
(Intercept) -22.93267 1.23275 -18.60 <2e-16 ***
hour 2.01487 0.09154 22.01 <2e-16 ***
Residual standard error: 46.82 on 13171 degrees of freedom
Multiple R-squared: 0.03548, Adjusted R-squared: 0.03541
F-statistic: 484.5 on 1 and 13171 DF, p-value: < 2.2e-16
Estimate 아래의 숫자는 도착 지연이 시간 당 2분 더 높을 것으로
예상됨을 나타낸다. 가장 오른쪽의 p값은 매우 작은 2e-16이며 이는 비행
출발시간과 비행 지연 사이에 연관성이 없다면 극단적인 결과를 볼 가능성이
매우 낮다는 것을 의미한다.
비행 지연을 설명하는 데 더 도움이 될 수 있는 추가 요소는 무엇일까?
데이터 랭글링을 통해 연도, 월, 일에서 요일(dow)을 추출할 수 있다. 또한
6, 7월처럼 지연이 긴 달을 season 변수로 만들 수 있다. 이들은 응답 변수인
도착 지연을 설명하기 위한 설명 변수로 사용될 것이다.
library(lubridate)
SF <- SF %>%
mutate(day = ymd(paste0(year, "-", month, "-", day)),
dow = as.character(wday(day, label = TRUE)),
season = ifelse(month %in% 6:7, "summer", "other month"))
mod2 <- lm(arr_delay ~ hour + origin + carrier + season + dow, data = SF)
msummary(mod2)
Estimate Std. Error t value Pr(>|t|)
(Intercept) -24.54081 2.17451 -11.286 < 2e-16 ***
hour 2.06423 0.08981 22.985 < 2e-16 ***
originJFK 4.19889 1.00442 4.180 2.93e-05 ***
carrierB6 -10.33223 1.87970 -5.497 3.94e-08 ***
carrierDL -18.40107 1.61464 -11.396 < 2e-16 ***
carrierUA -4.78247 1.48083 -3.230 0.001243 **
carrierVX -5.03651 1.59792 -3.152 0.001626 **
seasonsummer 25.32723 1.03068 24.573 < 2e-16 ***
dow목 3.33587 1.44610 2.307 0.021082 *
dow수 -0.50140 1.44913 -0.346 0.729347
dow월 1.44377 1.44444 1.000 0.317553
dow일 5.53721 1.47092 3.764 0.000168 ***
dow토 -5.94596 1.56172 -3.807 0.000141 ***
dow화 -1.84872 1.45023 -1.275 0.202412
Residual standard error: 45.44 on 13159 degrees of freedom
Multiple R-squared: 0.09218, Adjusted R-squared: 0.09129
F-statistic: 102.8 on 13 and 13159 DF, p-value: < 2.2e-16
Estimate 열의 숫자는 JFK공항에서 출발할 경우 평균 지연 시간에 4.1분이
더 소요될 것을 의미한다. 델타항공(DL)은 다른 항공사에 비해 평균 지연이
더 좋다(-18). 비행 지연 시간은 평균적으로 ’summer’인 6월과 7월에 길고,
요일 중에선 일요일에 가장 길다. 이 예제에서는 lm()을 사용하여 선형
모델을 구성했다.
7.6 Confounding and accounting for other factors
통계를 공부하며 상관관계가 인과관계를 암시할 때가 많지만, 두 경우가
서로 다르다는 것을 이해해야 한다. 예를 들어, 평균 교사 급여(2010년)와
미국 50개 주 각각의 평균 총 SAT 점수에 대한 관찰 데이터를 사용하여
상관관계와 인과관계가 혼란스러운 경우의 예시를 보자. SAT는 대학 입학에
사용되는 고난도 시험이다. 더 높은 교사 급여가 더 나은 시험 결과와 관련이
있을까? 그렇다면 시험 성적 향상을 위해 급여를 조정해야 하는가?
증명해보았다.
library(mdsr)
SAT_2010 <- SAT_2010 %>%
mutate(Salary = salary/1000)
SAT_plot <- ggplot(data = SAT_2010, aes(x = Salary, y = total)) +
geom_point() +
geom_smooth(method = "lm") +
ylab("Average total score on the SAT") +
xlab("Average teacher salary (thousands of USD)")
SAT_plot

Figure 9.4: 2010년 미국 50개 지역의 평균 SAT 점수 대 평균 교사
급여(단위: 천 달러)의 산점도.
install.packages(“remotes”)
remotes::install_github(“mdsr-book/mdsr”)
mdsr패키지가 현재 R버전에서 단종되었기에 위 과정을 통해 패키지를
다운로드받아야 한다.
SAT_mod1 <- lm(total ~ Salary, data = SAT_2010)
msummary(SAT_mod1)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1871.104 113.141 16.538 <2e-16 ***
Salary -5.019 2.048 -2.451 0.0179 *
Residual standard error: 111.2 on 48 degrees of freedom
Multiple R-squared: 0.1113, Adjusted R-squared: 0.09273
F-statistic: 6.008 on 1 and 48 DF, p-value: 0.01793
위와 같은 분석이 가능하지만, 각 주에서 SAT를 보는 학생들의 비율이
매우 차이난다는 점을 간과할 수 없다. 따라서 SAT_grp변수를 만들어 분석에
포함시킨다.
SAT_2010 <- SAT_2010 %>%
mutate(SAT_grp = ifelse(sat_pct <= 27, "Low", "High"))
tally(~SAT_grp, data = SAT_2010)
SAT_grp
High Low
25 25
SAT_plot %+% SAT_2010 + aes(color = SAT_grp)

2010년 미국 50개 주에서 평균 SAT 점수 대 평균 교사 급여의
산포도(단위: 천달러)
각 주에서 SAT를 치른 학생의 백분율로 계층화됨
coef(lm(total ~ Salary, data = filter(SAT_2010, SAT_grp == "Low")))
(Intercept) Salary
1583.265572 2.223863
coef(lm(total ~ Salary, data = filter(SAT_2010, SAT_grp == "High")))
(Intercept) Salary
1428.375819 1.159223
각 그룹에서 평균 교사 연봉은 SAT점수와 양의 관계에 있다. 정리하면
다음과 같다.
SAT 응시율이 낮은 주에서는 교사 급여와 SAT 점수가 긍정적으로
연관되어 있다.
SAT 응시율이 높은 주에서는 교사 급여와 SAT 점수가 긍정적으로
연관되어 있다.
모든 주에서 급여와 SAT 점수는 음의 상관 관계가
있다.
앞서서 SAT_grp를 고려하지 않았을 때는 음의 상관관계를 보였기
때문이다. 이처럼 혼란변수를 측정하면 문제를 해결하는 것이 간단해진다.
예측 변수로 sat_pct 변수를 회귀 모델에 추가해보자.
SAT_mod2 <- lm(total ~ Salary + sat_pct, data = SAT_2010)
msummary(SAT_mod2)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1589.0065 58.4707 27.176 <2e-16 ***
Salary 2.6370 1.1488 2.295 0.0262 *
sat_pct -3.5526 0.2785 -12.756 <2e-16 ***
Residual standard error: 53.18 on 47 degrees of freedom
Multiple R-squared: 0.8008, Adjusted R-squared: 0.7924
F-statistic: 94.49 on 2 and 47 DF, p-value: < 2.2e-16
이제 Salary의 기울기가 양수이고 sat_pct를 제어할 때 통계적으로
유의함을 알 수 있다. 여전히 교사 급여가 SAT점수 향상에 영향을 준다고
결론을 내릴 수 없지만, 혼란 요인을 고려한 후 관찰한 연관성은 고려하기
전의 결과보다 더 신뢰할 수 있다.
LS0tDQp0aXRsZTogIk1vZGVybiBEYXRhIFNjaWVuY2Ugd2l0aCBSX0NwdDciDQphdXRob3I6IHNlb25nc3UsIGtpbQ0KZGF0ZTogMjAyMy0wMS0xNg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyA3LiBTdGF0aXN0aWNhbCBmb3VuZGF0aW9ucw0KDQojIyA3LjEgU2FtcGxlcyBhbmQgcG9wdWxhdGlvbnMNClwNCg0KRXhhbXBsZTogU2FtcGxpbmcgZnJvbSB0aGUgcG9wdWxhdGlvbg0KXA0K64u57Iug7J2AIOyDjO2UhOuegOyLnOyKpOy9lCjqs7Xtla3svZTrk5wgU0ZPKeyXkOyEnCDruYTspojri4jsiqQg66+47YyF7J20IOyeiOuKlCDsl6ztlonqsJ3snYQg7Iuc6rCEIHTsl5Ag64qm7KeA7JWK6rKMIOunjOuCmOuPhOuhnSDruYTtlonqs4Ttmo3snYQg7Kec7JW8IO2VnOuLpC5S7J2YIG55Y2ZsaWdodHMxMyDtjKjtgqTsp4Drpbwg7IKs7Jqp7ZWc64ukLg0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobW9zYWljKQ0KbGlicmFyeShueWNmbGlnaHRzMTMpDQoNClNGIDwtIG55Y2ZsaWdodHMxMzo6ZmxpZ2h0cyAlPiUgDQogIGZpbHRlcihkZXN0ID09ICJTRk8iLCAhaXMubmEoYXJyX2RlbGF5KSkNCg0Kc2V0LnNlZWQoMTAxKQ0KU2FtcGxlMjUgPC0gU0YgJT4lDQogIHNhbXBsZV9uKHNpemUgPSAyNSkNCg0KZmF2c3RhdHMofmFycl9kZWxheSwgZGF0YSA9IFNhbXBsZTI1KQ0KYGBgDQrri6jsiJztlZjqsozripQg6rCA7J6lIOunjuydtCDsp4Dsl7DrkJwg6rK97Jqw7J24IG1heOydmCAxMDPrtoTsnYQg7LC46rOg7ZWY7JesIOqzhO2ajSDsnpHshLHtlZjquLDrpbwg6rOg66Ck7ZWgIOyImCDsnojri6QuDQrtlZjsp4Drp4wg7J2064qUIDI16rCcIOyDmO2UjOydmCDqsrDqs7zsnbTquLAg65WM66y47JeQLCDri6TsnYzsnZgg7KCE7LK0IOqysOqzvOulvCDrs7Tqs6Ag67mE6rWQ7ZWgIOyImCDsnojri6QuDQpcDQpcDQoNCmBgYHtyfQ0KZmF2c3RhdHMofmFycl9kZWxheSwgZGF0YSA9IFNGKQ0KYGBgDQrsoITssrQg642w7J207YSwKOuqqOynkeuLqCwgcG9wdWxhdGlvbinsnZgg6rK97JqwIOy1nOuMgCDsp4Dsl7Dsi5zqsITsnYAgMTAwN+u2hOyduCDqsoPsnYQg7ZmV7J247ZWgIOyImCDsnojri6QuIOydtCDqsr3smrAg66+47YyF7J2EIOuGk+y5mOyngCDslYrquLAg7JyE7ZW07ISgIOyggeyWtOuPhCDtlZjro6gg7KCELCDslb0gMTfsi5zqsIQg7KCE7Jy866GcIOu5hO2WiSDqs4Ttmo3snYQg7J6R7ISx7ZWgIO2VhOyalOqwgCDsnojslrTrs7Tsnbjri6QuIOuNlOyasSDslYjsoITtlZjquLAg7JyE7ZW07ISgIOuLpOydjCDqsr3smrDrj4Qg6rOg66Ck7ZWgIO2VhOyalOqwgCDsnojri6QuDQpcDQpcDQoNCjEuIOy2lOqwgCDsl6ztlonsnbzsnYAg7Jes7ZaJ7J6QIOyeheyepeyXkOyEnCDruYTsmqnsnbQg66eO7J20IOuToOuLpC5cDQoyLiAxLDAwN+u2hCDrs7Tri6Qg642UIOu5hO2WieydtCDsp4Dsl7DrkKAg6rCA64ql7ISx7J20IOyXhuyngCDslYrri6QuXA0KXA0KDQrruYTsmqnqs7wg7KeA6rCBIOqwgOuKpeyEseydhCDqs6DroKTtlZwg7ZiE66qF7ZWcIOqzhO2ajeydhCDsp5zquLAg7JyE7ZW0IDIl7J2YIOyngOqwgSDqsIDriqXshLHsnYQg65GQ6rOgIDk4JeuKlCDsoJXsi5zsl5Ag64+E7LCp7ZWc64uk6rOgIOqwgOygle2VtOuztOyekC4NCmBgYHtyfQ0KcWRhdGEofmFycl9kZWxheSwgcCA9IDAuOTgsIGRhdGEgPSBTYW1wbGUyNSkNCmBgYA0KOTglIOuwseu2hOychCDsiJjsl5Ag7ZW064u57ZWY64qUIOyngOyXsCDsi5zqsITsnbQg7JW9IDY367aE7Jy866GcIOuCmO2DgOuCrOuLpC4g7IKs7IukIDk467aE7JyE6rCAIOuqhyDrtoTsnbjsp4DripQg7KSR7JqU7ZWcIOqyg+ydtCDslYTri4jri6QuIDIl7J2YIOyngOqwgSDqsIDriqXshLHsnYQg7Je07Ja065GUIOqysOqzvOqwgCDqs7zsl7Ag7Zqo6rO87KCB7J24IOqzhO2ajeydtOyXiOuKlOyngOqwgCDspJHsmpTtlZjri6QuIOuqqOynkeuLqCDrjbDsnbTthLDqsIAg7KO87Ja07KC47J6I64uk66m0IOydtOulvCDtmZXsnbjtlZjripQg6rKD7J20IOqwgOuKpe2VmOuLpC4NClwNClwNCg0KYGBge3J9DQp0YWxseSh+YXJyX2RlbGF5IDwgNjgsIGRhdGEgPSBTRiwgZm9ybWF0ID0gInByb3BvcnRpb24iKQ0KYGBgDQrsp4Dsl7Ag7ZmV66Wg7J20IDIl66W8IOuEmOydgCA3JeuhnCDrgpjtg4Drgqzri6QuIOyymOydjCDqs4Ttmo3snbQg7J6Y66q7IOqzhOyCsOuQnCDqsoPsnbTri6QuIOuqqOynkeuLqCDrjbDsnbTthLDroZwg64uk7IucIOqzhOyCsO2VtOuzuOuLpC4NClwNCg0KYGBge3J9DQpxZGF0YSh+YXJyX2RlbGF5LCBwID0gMC45OCwgZGF0YSA9IFNGKQ0KYGBgDQrrqqjsp5Hri6jsnYQg7Ya17ZW0IOqzhOyCsO2VnCDqsrDqs7wsIDk4JeydmCDrj4TssKnrpaDsnYQg66ee7LaU6riwIOychO2VtOyEnOuKlCA2OOu2hOydtCDslYTri4jrnbwgMTUz67aE7J2YIOyXrOycoOulvCDrkZDslrTshJwg6rOE7ZqN7ZW07JW8IO2VqOydhCDslYwg7IiYIOyeiOuLpC4NClwNClwNCg0K7ZWY7KeA66eMIOuzuCDsmIjsi5zqsIAg7JWE64uI6528IO2YhOyLpOyXkOyEnOuKlCDsoITssrQg642w7J207YSw66W8IOygke2VmOq4sCDslrTroLXqs6Ag7IOY7ZSMIOuNsOydtO2EsOulvCDqsIDsp4Dqs6Ag7J6I7J2EIO2ZleuloOydtCDrhpLri6QuIOydtO2bhOuhnOuKlCDsg5jtlIwg642w7J207YSw66W8IOqwgOyngOqzoCDrhpLsnYAg7Zqo6rO866W8IOuzvCDsiJgg7J6I64qUIOuwqeuyleyXkCDrjIDtlbQg7JWM7JWE67O8IOyYiOygleydtOuLpC4NClwNClwNClwNCg0KIyMgNy4yIFNhbXBsZSBzdGF0aXN0aWNzDQrtkZzrs7gg7KeR64uo7J2YIO2GteqzhOqwgCDrqqjsp5Hri6jsnYQg7Ja866eI64KYIOyemCDrsJjsmIHtlZjripTsp4Ag7JWM7JWE64K064qUIO2ZleumveuQnCDquLDsiKDsnbQg7J6I64ukLg0KXA0KXA0KDQoNCioqVGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbioqXA0K7ZGc67O4IOy2lOy2nOydhCDsl6zrn6wg67KIIOyLpO2Wie2VmOyXrCDqsIEg7Iuc64+E7JeQ7IScIO2RnOuzuCDthrXqs4Trpbwg6rOE7IKw7ZWY64qUIOuwqeuylS4NCmBgYHtyfQ0KbiA8LSAyNQ0KbWVhbih+YXJyX2RlbGF5LCBkYXRhID0gc2FtcGxlX24oU0YsIHNpemUgPSBuLCByZXBsYWNlID0gRkFMU0UpKQ0KYGBgDQrslYTrp4gg7J2067O064uk64+EIOuNlCDrp47snYAg7Iuk7ZaJ7J2EIO2VtOuztOuKlCDqsoPsnbQg7KKL7J2EIOqyg+ydtOuLpC4NClwNCg0KYGBge3J9DQp0cmlhbHMgPC0gZG8oNTAwKSAqDQogIG1lYW4ofmFycl9kZWxheSwgZGF0YSA9IHNhbXBsZV9uKFNGLCBzaXplID0gbiwgcmVwbGFjZSA9IEZBTFNFKSkNCmhlYWQodHJpYWxzKQ0KYGBgDQo1MDDrsogg7ZGc67O4IO2GteqzhOulvCDrsJjrs7Ug7LaU7Lac7ZWY7JesIO2Pieq3oCDrj4TssKkg7KeA7Jew7Iuc6rCE7J2EIOqzhOyCsO2VtOuztOyVmOuLpC4g6rKw6rO86rCAIOyWvOuniOuCmCDrtoTsgrDrkJjslrQg7J6I64qU7KeAIOuztOyekC4NClwNClwNCg0KYGBge3J9DQpmYXZzdGF0cyh+bWVhbiwgZGF0YSA9IHRyaWFscykNCmBgYA0KNTAw67KI7J2064KYIOuwmOuzte2VmOyYgOycvOuLiCDtkZzrs7jsnZgg7YGs6riw64qUIOykkeyalO2VmOyngCDslYrri6QuIO2Pieq3oOydtCDspJHslZnqsJLsnZgg7JW9IOuRkCDrsLAg6rCA65+J7J24IOqyg+ydhCDrs7TslYQg67aE7Y+s6rCAIOyVveqwhCDsmKTrpbjsqr3snLzroZwg7LmY7Jqw7LOQ7KC47J6I7J2M7J2EIOyVjCDsiJgg7J6I64ukLg0KXA0KXA0KDQpgYGB7cn0NCm1lYW4ofm1lYW4sIGRhdGEgPSB0cmlhbHMpICsgMipzZCh+bWVhbiwgZGF0YSA9IHRyaWFscykgKiBjKC0xLCAxKQ0KYGBgDQrtj4nqt6Dqs7wg7ZGc7KSA7Y647LCo7J2YIOqzhOyCsOydhCDthrXtlbQgOTUlIOyLoOuisOq1rOqwhOydhCDrs7TripQg6rKDIOyXreyLnCDtjJDri6jsl5Ag7LC46rOg7ZWgIOyImCDsnojri6QuDQpcDQpcDQoNCuq4sOyhtOydmCBuPTI17JiA642YIO2RnOuzuOuztOuLpCDrjZQg7YGwIG49MTAw7J24IO2RnOuzuOydhCDsgqzsmqntlZzri6TrqbQg7Ja065akIOqysOqzvOulvCDrs7TsnbzquYw/DQpgYGB7cn0NCnRyaWFsc18xMDAgPC0gZG8oNTAwKSAqDQogIG1lYW4ofmFycl9kZWxheSwgZGF0YSA9IFNGICU+JSBzYW1wbGVfbihzaXplID0gMTAwLCByZXBsYWNlID0gRkFMU0UpKQ0KDQpyYmluZCh0cmlhbHMgJT4lIG11dGF0ZShuID0gMjUpLA0KICAgICAgdHJpYWxzXzEwMCAlPiUgbXV0YXRlKG4gPSAxMDApKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1lYW4pKSArDQogICAgICAgICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkgKw0KICAgICAgICAgICBmYWNldF9ncmlkKH5uKSArDQogICAgICAgICAgIHhsYWIoIlNhbXBsZSBtZWFuIikNCmBgYA0KKioo7KKMKSBuPTI17J24IO2RnOuzuCDrtoTtj6wsICjsmrApIG49MTAw7J24IO2RnOuzuCDrtoTtj6wqKg0KXA0KXA0KDQrsnIQg67aE7Y+s64+E66W8IO2Gte2VtCDslYwg7IiYIOyeiOuKlCDqsoM6XA0KMS4g65GQIO2RnOuzuCDrtoTtj6zripQg6rCZ7J2AIOqwkuyXkOyEnCDspJHslZnqsJLsnYQg6rCA7KeE64ukLlwNCjIuIO2RnOuzuOydmCDtgazquLDqsIAg7YGwIOu2hO2PrOqwgCDrjZQg7J6R7J2AIO2RnOykgOyYpOywqOulvCDqsIDsp4Tri6QuIOymiSwg642UIOyLoOuisOuPhOqwgCDrhpLri6QuXA0KMy4g7ZGc67O47J2YIO2BrOq4sOqwgCDtgbAg6rK97JqwIOyiheuqqOyWkSDrtoTtj6zrpbwg6rCW6rKMIOuQmOqzoCwg7J2066W8IOygleq3nOu2hO2PrOudvOqzoCDtlZzri6QuXA0KXA0KXA0KXA0KDQojIyA3LjMgVGhlIGJvb3RzdHJhcA0KJ2Jvb3RzdHJhcCfsnbTrnoAg66qo7KeR64uo7JeQIOygkeq3vO2VoCDsiJgg7JeG64qUIOyXhuuKlCDqsr3smrDsl5Drj4Qg7ZGc67O4IOu2hO2PrOulvCDthrXtlbQg6re87IKs7ZmU7ZWgIOyImCDsnojqsowg7ZWY64qUIO2GteqzhO2VmeyggSDrsKnrspXsnbTri6QuIOqwgOyngOqzoCDsnojripQg7ZGc67O47JeQ7IScIO2RnOuzuOydhCDstpTstpztlaAg6rKD7J2066mwLCDsnbTrpbwgJ3Jlc2FtcGxpbmcn7J2065286rOgIO2VnOuLpC4g7ISk66qF7J2EIOychO2VtCBmbGlnaHRzIOuNsOydtO2EsOulvCDsgqzsmqntlZjsmIDri6QuDQpcDQoNCmBgYHtyfQ0Kc21hbGwgPC0gc2FtcGxlX24oU0YsIHNpemUgPSAzLCByZXBsYWNlID0gRkFMU0UpDQpzbWFsbA0KYGBgDQrsnIQg6rO87KCV7J2EIOykkeuzteydhCDtl4jsmqntlZjsl6wgcmVzYW1wbGluZ+2VnCDqsrDqs7zripQg64uk7J2M6rO8IOqwmeuLpC4NClwNCg0KDQpgYGB7cn0NCnNtYWxsICU+JSBzYW1wbGVfbihzaXplID0gMywgcmVwbGFjZSA9IFRSVUUpDQpgYGANCuuztOuLpOyLnO2UvCDrtoDtirjsiqTtirjrnpjtlZHsnYAg642w7J207YSw66W8IOyImOynke2VmOyXrCDsg4jroZzsmrQg642w7J207YSw66W8IOu2hOyEne2VmOuKlCDqsoPsnbQg7JWE64uI64ukLiDsoITsl5Ag7ZWY642YIOu5hO2WiSDqs4Ttmo0g66y47KCc66GcIOuPjOyVhOqwgOyEnCwg67aA7Yq47Iqk7Yq4656Y7ZWR7J2EIOyCrOyaqe2VmOyXrCDtgazquLDqsIAgMjAw7J24IO2RnOuzuOyXkOyEnCDqs4TsgrDrkJwg7Y+J6regIOuPhOywqSDsi5zqsITsnZgg7Iug66Kw64+E66W8IOy2lOygle2VtOuztOyekC4NClwNClwNCg0KYGBge3J9DQpuIDwtIDIwMA0Kb3JpZ19zYW1wbGUgPC0gU0YgJT4lIHNhbXBsZV9uKHNpemUgPSBuLCByZXBsYWNlID0gRkFMU0UpDQoNCm1lYW4ofmFycl9kZWxheSwgZGF0YSA9IHNhbXBsZV9uKG9yaWdfc2FtcGxlLCBzaXplID0gbiwgcmVwbGFjZSA9IFRSVUUpKQ0KYGBgDQrsnIQg6rO87KCV7J2EIOuwmOuztSByZXNhbXBsaW5n7ZWY7JesIO2Pieq3oCDrj4TssKkg7KeA7Jew7Iuc6rCE7J2EIOqzhOyCsO2VtOuztOyekC4NClwNCg0KYGBge3J9DQpib290c3RyYXBfdHJpYWxzIDwtIGRvKDUwMCkgKiBtZWFuKH5hcnJfZGVsYXksIGRhdGEgPSBzYW1wbGVfbihvcmlnX3NhbXBsZSwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBUUlVFKSkNCg0KZmF2c3RhdHMofm1lYW4sIGRhdGEgPSBib290c3RyYXBfdHJpYWxzKQ0KYGBgDQoNCuu2gO2KuOyKpO2KuOueqeydhCDsgqzsmqntlZjsl6wg6rOE7IKw7ZWcIO2RnOykgCDsmKTssKjqsIAg66qo7KeR64uo7JeQ7IScIOuwmOuztSDsg5jtlIzsnYQg7Leo7ZWY7JesIOqzhOyCsO2VnCDsg5jtlIzrp4Eg67aE7Y+s7J2YIO2RnOykgCDsmKTssKjsl5Ag64yA7ZWcIO2VqeumrOyggeyduCDqt7zsgqzsuZjrnbzripQg6rKD7J2EIO2ZleyduO2VoCDsiJgg7J6I64ukLijrqqjsp5Hri6jsnZgg7Y+J6reg7J20IDIuNjfrtoTsnbTsl4jsnLzrr4DroZwgMS4067aE7J20652864qUIOyhsOq4iOydmCDssKjsnbTrp4wg64Kc64ukLikNClwNClwNClwNCg0K7ZqM7J2YIOyLnOqwhOydmCA5OCXrpbwg7KCcIOyLnOqwhOyXkCDrj4TssKntlZjquLDroZwg7ISk7KCV7ZWcIO2Vreqzte2OuCDqs4Ttmo0g66y47KCc66GcIOuPjOyVhOqwgOuztOyekC4g66y47KCc7JeQIOu2gO2KuOyKpO2KuOuemO2VkeydhCDsoIHsmqntlZjsl6wgbj0yMDDsnbgg7ZGc67O47J2YIO2GteqzhCDsi6DrorDrj4Trpbwg7YyM7JWF7ZWgIOyImCDsnojri6QuDQpcDQoNCmBgYHtyfQ0KcWRhdGEofmFycl9kZWxheSwgcCA9IDAuOTgsIGRhdGEgPSBvcmlnX3NhbXBsZSkNCmBgYA0K7ZGc67O47J2AIDE5Neu2hCDrqLzsoIAg64+E7LCp7ZWY64+E66GdIOu5hO2Wieq4sOulvCDsmIjslb3tlaAg6rKD7J2EIOygnOyViO2VnOuLpC4g67O4IOqysOqzvOydmCDsi6DrorDrj4Trpbwg67aA7Yq47Iqk7Yq4656Y7ZWR7J2EIOyCrOyaqe2VmOyXrCDtmZXsnbjtlbTrs7TsnpAuDQpcDQoNCmBgYHtyfQ0KbiA8LSBucm93KG9yaWdfc2FtcGxlKQ0KbnVtX3RyaWFscyA8LSA1MDANCnNmXzIwMF9icyA8LSAxOm51bV90cmlhbHMgJT4lDQogIG1hcF9kZnIoDQogICAgfm9yaWdfc2FtcGxlICU+JQ0KICAgICAgc2xpY2Vfc2FtcGxlKG4gPSBuLCByZXBsYWNlID0gVFJVRSkgJT4lDQogICAgICBzdW1tYXJpemUocTk4ID0gcXVhbnRpbGUoYXJyX2RlbGF5LCBwID0gMC45OCkpDQogICkNCg0Kc2ZfMjAwX2JzICU+JQ0KICBza2ltKHE5OCkNCmBgYA0K6rKw6rO87JeQIOuUsOultOuptCDrtoDtirjsiqTtirjrnqkg7ZGc7KSAIOyYpOulmOuKlCDslb0gMTgy67aE7J206rOgLCA5NSUg7Iug66KwIOq1rOqwhOydgCAxODIgwrEgKDY2KjIp67aE7J2064ukLiDsl63si5wg7JWe7JeQ7IScIOuzuCAxOTXrtoTqs7wg7JW9IDEz67aEIOygleuPhOydmCDssKjsnbTqsIAg64KY64qUIOqyg+ydhCDrs7wg7IiYIOyeiOuLpC4NClwNClwNClwNCg0K66y47KCc66W8IO2VtOqysO2VmOuKlCDtlZwg6rCA7KeAIOuwqeuyleydgCA5OOuyiOynuCDrsLHrtoTsnITsiJjsl5Ag64yA7ZWcIOuztOuLpCDsi6DrorDtlaAg7IiYIOyeiOuKlCDstpTsoJXsuZjrpbwg7Ja76riwIOychO2VtCDrjZQg66eO7J2AIOuNsOydtO2EsOulvCDsiJjsp5HtlZjripQg6rKD7J2064ukLiBuPTEwLDAwMOyduCDsvIDsnbTsiqTsnZgg7ZGc67O47J2EIOyDneyEse2VmOuKlCDsnpHsl4XsnYQg7IiY7ZaJ7ZW067O07J6QLg0KXA0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpuX2xhcmdlIDwtIDEwMDAwDQpzZl8xMDAwMF9icyA8LSBTRiAlPiUgDQogIHNsaWNlX3NhbXBsZShuID0gbl9sYXJnZSwgcmVwbGFjZSA9IEZBTFNFKQ0KDQpzZl8yMDBfYnMgPC0gMTpudW1fdHJpYWxzICU+JQ0KICBtYXBfZGZyKH5zZl8xMDAwMF9icyAlPiUNCiAgICAgICAgc2xpY2Vfc2FtcGxlKG4gPSBuX2xhcmdlLCByZXBsYWNlID0gVFJVRSkgJT4lDQogICAgICAgIHN1bW1hcml6ZShxOTggPSBxdWFudGlsZShhcnJfZGVsYXksIHAgPSAwLjk4KSkNCiAgKQ0KDQpzZl8yMDBfYnMgJT4lDQogIHNraW0ocTk4KQ0KYGBgDQrsi6DrorDqtazqsITsnbQgMTUzIMKxIDnrtoTsnLzroZwg7Zuo7JSsIOyekeyVhOyhjOuLpC4g642UIOunjuydgCDrjbDsnbTthLDqsIAg7J6I7Jy866m0IO2Kue2eiCDqvKzrpqwg67aA67aE7JeQ7IScIOuNlCDsib3qsowg7LaU7KCV7LmY66W8IOyEuOu2hO2ZlO2VoCDsiJgg7J6I64ukLg0KXA0KXA0KXA0KXA0KDQojIyA3LjQgT3V0bGllcnMNCuuNsOydtO2EsOuKlCDruYTsoJXsg4HsoIHsnbTqsbDrgpgg6re564uo7KCB7J24IOydtOuypO2KuOulvCDsi53rs4TtlaAg65WM7JeQ64+EIOuPhOybgOydtCDrkJzri6QuIDfsi5zqsIQg7J207IOBIOyngOyXsOuQnCDruYTtlonsnYQg6re564uo7KCB7J24IOyDge2ZqeycvOuhnCDqsITso7ztlZzri6Tqs6Ag6rCA7KCV7ZWgIOuVjCwgNDIw67aE7J2YIOyImOy5mOuKlCDsi6zqsIHtlZjqsowg7KeA7Jew65CcIO2Vreqzte2OuOydmCDsp4DtkZzroZwg7Jyg7Jqp7ZWgIOyImCDsnojri6QuDQpcDQoNCmBgYHtyfQ0KU0YgJT4lIA0KICBmaWx0ZXIoYXJyX2RlbGF5ID49IDQyMCkgJT4lIA0KICBzZWxlY3QobW9udGgsIGRheSwgZGVwX2RlbGF5LCBhcnJfZGVsYXksIGNhcnJpZXIpDQpgYGANCuu5hO2WiSDsp4Dsl7DsnZgg64yA67aA67aE7J20IDfsm5QsIFZY7ZWt6rO17JeQ7IScIOuwnOyDne2WiOuLpC4g7J20IOyCrOyLpOydgCDtla3qs7Ug6rOE7ZqN7J2EIOynpCDrlYwgN+yblOyXkOuKlCDrjZQg7Iuc6rCE7J2EIOyVnuuLueqyqOyEnCDqs4Ttmo3tlZjqs6AsIOuQmOuPhOuhnSBWWO2Vreqzte2OuOydhCDtlLztlZjrnbzqs6Ag7KGw7Ja47ZWgIOyImCDsnojri6QuDQpcDQpcDQoNCu2VmOyngOunjCDsnbTsg4HsuZgg7J6Q7LK07JeQIOyYpO2VtOqwgCDsnojsnYQg7IiY64+EIOyeiOuLpC4g7ZW064u5IO2KueydtOygkOydgCAyMDEz64WEIOuJtOyaleyXkOyEnCDsg4ztlITrnoDsi5zsiqTsvZTroZwg7Zal7ZWY64qUIO2Vreqzte2OuOydmCAyJeudvOuKlCDqt7ntnogg7J2867aA66W8IOywqOyngO2VnOuLpC4g67aE7Y+s7J2YIOyjvOyalCDrtoDrtoTsnYQg642UIOyemCDsnbTtlbTtlZjquLAg7JyE7ZW0IOydtOufrO2VnCDsoJDsnYQg7KCc6rGw7ZWgIOyImCDsnojri6QuDQpcDQrrjIDrtoDrtoTsnZgg7ZWt6rO17Y647J2AIDYw67aEIOuvuOunjOydmCDsp4Dsl7Ag7JeG7J20IOuPhOywqe2VnOuLpC4g642UIOq4tCDsp4Dsl7DsnbQg67Cc7IOd7ZWgIOqwgOuKpeyEseydtCDsnojsnYQg65WMIOyghOyhsOqwgCDrkKAg7IiYIOyeiOuKlCDtjKjthLTsnYQg7Iud67OE7ZWgIOyImCDsnojsnYTquYw/IO2KueydtOqwkuydgCBtb250aCDrmJDripQgY2FycmllcuqwgCDquLQg7KeA7Jew6rO8IOyXsOqysOuQoCDsiJgg7J6I7J2M7J2EIOyLnOyCrO2WiOuLpC4g64yA64uk7IiY7J2YIOuNsOydtO2EsOyXkOyEnCDsnbTqsoPsnbQg7Ja065a76rKMIOyekeuPme2VmOuKlOyngCDrs7TsnpAuDQpgYGB7cn0NClNGICU+JSANCiAgbXV0YXRlKGxvbmdfZGVsYXkgPSBhcnJfZGVsYXkgPiA2MCkgJT4lIA0KICB0YWxseSh+bG9uZ19kZWxheSB8IG1vbnRoLCBkYXRhID0gLikNCmBgYA0K7JyEIOqysOqzvOyXkOyEnCA2MOu2hCDsnbTsg4Eg7KeA7Jew65CY64qUIOqyveyasOqwgCA2fjfsm5Tsl5Ag6rCA7J6lIOunjuq4sCDrlYzrrLjsl5AsIDbsm5Tqs7wgN+yblOydtCDrrLjsoJzsnZgg64us7J6E7J2EIOyVjCDsiJgg7J6I64ukLg0KXA0KXA0KDQpgYGB7cn0NClNGICU+JSBmaWx0ZXIoYXJyX2RlbGF5IDwgNDIwKSAlPiUgDQogIGdncGxvdChhZXMoYXJyX2RlbGF5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDE1KQ0KYGBgDQoyMDEz64WEIE5ZQ+qzte2VreyXkOyEnCDsg4ztlITrnoDsi5zsiqTsvZTtlokg7ZWt6rO17Y647J20IDfsi5zqsIQg66+466eMIOyngOyXsOuQnCDtla3qs7XtjrjsnZgg64+E7LCpIOyngOyXsCDrtoTtj6zri6QuIOydtCDrtoTtj6zripQg7J207IOB6rCS7J2EIOygnOqxsO2VnCDtm4Tsl5Drj4Qg6ri0IOyYpOuluOyqvSDqvKzrpqzrpbwg7Yq57KeV7Jy866GcIOuztOyduOuLpC4NClwNClwNCg0KYGBge3J9DQpTRiAlPiUgDQogIG11dGF0ZShsb25nX2RlbGF5ID0gYXJyX2RlbGF5ID4gNjApICU+JSANCiAgdGFsbHkofmxvbmdfZGVsYXkgfCBjYXJyaWVyLCBkYXRhID0gLikNCmBgYA0K64247YOAIO2VreqztShETCnsnYAg7ZWp66as7KCB7J24IOyEseuKpeydhCDsoJzqs7XtlZzri6QuIOydtCDrkZAg6rCA7KeAIOqwhOuLqO2VnCDrtoTshJ3snYQg7Ya17ZW0IOyXrO2WieyekOyXkOqyjCA27JuU6rO8IDfsm5Tsl5Ag642UIOydvOywjSDrj4TssKntlaAg6rOE7ZqN7J2EIOyEuOyasOqzoCDrjbjtg4Dtla3qs7XsnYQgU0ZPIOyXrO2WiSDtla3qs7XsgqzroZwg6rOg66Ck7ZWY64+E66GdIOyhsOyWuO2VoCDsiJgg7J6I64ukLg0KXA0KXA0KXA0KDQojIyA3LjUgU3RhdGlzdGljYWwgbW9kZWxzOiBFeHBsYWluaW5nIHZhcmlhdGlvbg0K7KeA6riI6rmM7KeAIOu5hO2WiSDsp4Dsl7DsnZgg6rCA64ql7ISx7J2EIOuCruy2lOq4sCDsnITtlbQgbW9udGjsmYAgY2FycmllcuulvCDsnbTsmqntlojri6QuIOydtOyymOufvCDrs4DsiJjrpbwg7ISc66GcIOq0gOugqOyLnOy8nCDsi5zsiqTthZzsnYQg7J207ZW07ZWY64+E66GdIO2VmOuKlCDqsoPsnYQg7Ya16rOEIOuqqOuNuOungeydtOudvOqzoCDtlZzri6QuIOuLpOuluCDsmIjrpbwg65Ok66m0LCDsnbzrsJjsoIHsnLzroZwg7IKs656M65Ok7J2AIOu5hO2WiSDsp4Dsl7DsnbQg7ZWY66OoIOyiheydvCDsl7Dsho3rkJjripQg6rK97Zal7J20IOyeiOq4sCDrlYzrrLjsl5Ag7J2066W4IOyLnOqwhOuMgOydmCDruYTtlonsnbQg7KeA7Jew65CgIOqwgOuKpeyEseydtCDsoIHri6Tqs6Ag7IOd6rCB7ZWc64ukLiDrqqjrjbjrp4HsnYQg7ISk66qF7ZWY6riwIOychO2VtCDstpzrsJwg7Iuc6rCE7J20IO2Vreqzte2OuCDsp4Dsl7Dsl5Ag7Ja065akIOyYge2WpeydhCDrr7jsuZjripTsp4Ag7JWM7JWE67O06riw66GcIO2WiOuLpC4NClwNCg0KYGBge3J9DQp0YWxseSh+aG91ciwgZGF0YSA9IFNGKQ0KYGBgDQrqsrDqs7zrpbwg7Ya17ZW0IO2Vreqzte2OuOydtCDsnbTrpbgg7JWE7Lmo67aA7YSwIOygleyYpOq5jOyngCwg6re466as6rOgIOuKpuydgCDsmKTtm4TrtoDthLAg7J2066W4IOyggOuFgeq5jOyngCDsmIjsoJXrkJjslrQg7J6I7J2M7J2EIOyVjCDsiJgg7J6I64ukLiDrmJDtlZwg7IOI67K9IDXsi5wg7KCE7J2064KYIOuwpCA57IucIOydtO2bhOyXkOuKlCDtla3qs7XtjrjsnbQg7JeG64uk64qUIOqyg+ydhCDslYwg7IiYIOyeiOuLpC4NClwNClwNCg0K64+E7LCpIOyngOyXsOydtCDsi5zqsITsl5Ag65Sw6528IOyWtOuWu+qyjCDri6zrnbzsp4DripTsp4Ag7IK07Y6067O06riwIOychO2VtCDrkZAg6rCA7KeAIOuwqeuyleydhCDsgqzsmqntlZzri6QuDQpcDQoNCjEuIOuPhOywqSDsp4Dsl7DsnZgg67aE7Y+s66W8IOuztOyXrOyjvOq4sCDsnITtlbQg7ZGc7KSAIGJveC1hbmQtd2hpc2tlciDqt7jrnpjtlITrpbwg7IKs7Jqp7ZWc64ukLlwNCjIuIO2VmOujqCDrj5nslYjsnZgg7Y+J6regIOuPhOywqSDsp4Dsl7DsnYQg7LaU7KCB7ZWgIOyImCDsnojripQg7ISg7ZiVIOuqqOuNuOydtOudvOuKlCDsnbzsooXsnZgg7Ya16rOEIOuqqOuNuOydhCDsgqzsmqntlZzri6QuXA0KXA0KDQpgYGB7cn0NClNGICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gaG91ciwgeSA9IGFycl9kZWxheSkpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMC4xLCBhZXMoZ3JvdXAgPSBob3VyKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIHhsYWIoIlNjaGVkdWxlZCBob3VyIG9mIGRlcGFydHVyZSIpICsNCiAgeWxhYigiQXJyaXZhbCBkZWxheSAobWludXRlcykiKSsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0zMCwgMTIwKSkNCmBgYA0K6re466a87J2EIO2Gte2VtCDrs7wg65WMLCDtj4nqt6Ag64+E7LCpIOyngOyXsOyLnOqwhOydgCDtlZjro6jrj5nslYgg7Kad6rCA7ZWc64ukLiDstpTshLjshKDsnYAg7ZqM6reAIOuqqOuNuOydhCDthrXtlbQg7IOd7ISx65Cc64ukLg0KXA0KXA0KDQpgYGB7cn0NCm1vZDEgPC0gbG0oYXJyX2RlbGF5IH4gaG91ciwgZGF0YSA9IFNGKQ0KbXN1bW1hcnkobW9kMSkNCmBgYA0KRXN0aW1hdGUg7JWE656Y7J2YIOyIq+yekOuKlCDrj4TssKkg7KeA7Jew7J20IOyLnOqwhCDri7kgMuu2hCDrjZQg64aS7J2EIOqyg+ycvOuhnCDsmIjsg4HrkKjsnYQg64KY7YOA64K464ukLiDqsIDsnqUg7Jik66W47Kq97J2YIHDqsJLsnYAg66ek7JqwIOyekeydgCAyZS0xNuydtOupsCDsnbTripQg67mE7ZaJIOy2nOuwnOyLnOqwhOqzvCDruYTtlokg7KeA7JewIOyCrOydtOyXkCDsl7DqtIDshLHsnbQg7JeG64uk66m0IOq3ueuLqOyggeyduCDqsrDqs7zrpbwg67O8IOqwgOuKpeyEseydtCDrp6TsmrAg64Ku64uk64qUIOqyg+ydhCDsnZjrr7jtlZzri6QuIA0KXA0KXA0KDQrruYTtlokg7KeA7Jew7J2EIOyEpOuqhe2VmOuKlCDrjbAg642UIOuPhOybgOydtCDrkKAg7IiYIOyeiOuKlCDstpTqsIAg7JqU7IaM64qUIOustOyXh+ydvOq5jD8g642w7J207YSwIOuereq4gOungeydhCDthrXtlbQg7Jew64+ELCDsm5QsIOydvOyXkOyEnCDsmpTsnbwoZG93KeydhCDstpTstpztlaAg7IiYIOyeiOuLpC4g65iQ7ZWcIDYsIDfsm5Tsspjrn7wg7KeA7Jew7J20IOq4tCDri6zsnYQgc2Vhc29uIOuzgOyImOuhnCDrp4zrk6Qg7IiYIOyeiOuLpC4g7J2065Ok7J2AIOydkeuLtSDrs4DsiJjsnbgg64+E7LCpIOyngOyXsOydhCDshKTrqoXtlZjquLAg7JyE7ZWcIOyEpOuqhSDrs4DsiJjroZwg7IKs7Jqp65CgIOqyg+ydtOuLpC4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGx1YnJpZGF0ZSkNClNGIDwtIFNGICU+JSANCiAgbXV0YXRlKGRheSA9IHltZChwYXN0ZTAoeWVhciwgIi0iLCBtb250aCwgIi0iLCBkYXkpKSwNCiAgICAgICAgIGRvdyA9IGFzLmNoYXJhY3Rlcih3ZGF5KGRheSwgbGFiZWwgPSBUUlVFKSksDQogICAgICAgICBzZWFzb24gPSBpZmVsc2UobW9udGggJWluJSA2OjcsICJzdW1tZXIiLCAib3RoZXIgbW9udGgiKSkNCg0KbW9kMiA8LSBsbShhcnJfZGVsYXkgfiBob3VyICsgb3JpZ2luICsgY2FycmllciArIHNlYXNvbiArIGRvdywgZGF0YSA9IFNGKQ0KbXN1bW1hcnkobW9kMikNCmBgYA0KRXN0aW1hdGUg7Je07J2YIOyIq+yekOuKlCBKRkvqs7Xtla3sl5DshJwg7Lac67Cc7ZWgIOqyveyasCDtj4nqt6Ag7KeA7JewIOyLnOqwhOyXkCA0LjHrtoTsnbQg642UIOyGjOyalOuQoCDqsoPsnYQg7J2Y66+47ZWc64ukLiDrjbjtg4Dtla3qs7UoREwp7J2AIOuLpOuluCDtla3qs7Xsgqzsl5Ag67mE7ZW0IO2Pieq3oCDsp4Dsl7DsnbQg642UIOyii+uLpCgtMTgpLiDruYTtlokg7KeA7JewIOyLnOqwhOydgCDtj4nqt6DsoIHsnLzroZwgJ3N1bW1lcifsnbggNuyblOqzvCA37JuU7JeQIOq4uOqzoCwg7JqU7J28IOykkeyXkOyEoCDsnbzsmpTsnbzsl5Ag6rCA7J6lIOq4uOuLpC4g7J20IOyYiOygnOyXkOyEnOuKlCBsbSgp7J2EIOyCrOyaqe2VmOyXrCDshKDtmJUg66qo64247J2EIOq1rOyEse2WiOuLpC4NClwNClwNClwNCg0KIyMgNy42IENvbmZvdW5kaW5nIGFuZCBhY2NvdW50aW5nIGZvciBvdGhlciBmYWN0b3JzDQrthrXqs4Trpbwg6rO167aA7ZWY66mwIOyDgeq0gOq0gOqzhOqwgCDsnbjqs7zqtIDqs4Trpbwg7JWU7Iuc7ZWgIOuVjOqwgCDrp47sp4Drp4wsIOuRkCDqsr3smrDqsIAg7ISc66GcIOuLpOultOuLpOuKlCDqsoPsnYQg7J207ZW07ZW07JW8IO2VnOuLpC4g7JiI66W8IOuTpOyWtCwg7Y+J6regIOq1kOyCrCDquInsl6woMjAxMOuFhCnsmYAg66+46rWtIDUw6rCcIOyjvCDqsIHqsIHsnZgg7Y+J6regIOy0nSBTQVQg7KCQ7IiY7JeQIOuMgO2VnCDqtIDssLAg642w7J207YSw66W8IOyCrOyaqe2VmOyXrCDsg4HqtIDqtIDqs4TsmYAg7J246rO86rSA6rOE6rCAIO2YvOuegOyKpOufrOyatCDqsr3smrDsnZgg7JiI7Iuc66W8IOuztOyekC4gU0FU64qUIOuMgO2VmSDsnoXtlZnsl5Ag7IKs7Jqp65CY64qUIOqzoOuCnOuPhCDsi5ztl5jsnbTri6QuIOuNlCDrhpLsnYAg6rWQ7IKsIOq4ieyXrOqwgCDrjZQg64KY7J2AIOyLnO2XmCDqsrDqs7zsmYAg6rSA66Co7J20IOyeiOydhOq5jD8g6re466CH64uk66m0IOyLnO2XmCDshLHsoIEg7Zal7IOB7J2EIOychO2VtCDquInsl6zrpbwg7KGw7KCV7ZW07JW8IO2VmOuKlOqwgD8g7Kad66qF7ZW067O07JWY64ukLg0KDQpgYGB7cn0NCmxpYnJhcnkobWRzcikNClNBVF8yMDEwIDwtIFNBVF8yMDEwICU+JQ0KICBtdXRhdGUoU2FsYXJ5ID0gc2FsYXJ5LzEwMDApDQpTQVRfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IFNBVF8yMDEwLCBhZXMoeCA9IFNhbGFyeSwgeSA9IHRvdGFsKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgDQogIHlsYWIoIkF2ZXJhZ2UgdG90YWwgc2NvcmUgb24gdGhlIFNBVCIpICsgDQogIHhsYWIoIkF2ZXJhZ2UgdGVhY2hlciBzYWxhcnkgKHRob3VzYW5kcyBvZiBVU0QpIikNClNBVF9wbG90DQpgYGANCg0KX0ZpZ3VyZSA5LjQ6IDIwMTDrhYQg66+46rWtIDUw6rCcIOyngOyXreydmCDtj4nqt6AgU0FUIOygkOyImCDrjIAg7Y+J6regIOq1kOyCrCDquInsl6wo64uo7JyEOiDsspwg64us65+sKeydmCDsgrDsoJDrj4QuXw0KDQpcDQpcDQppbnN0YWxsLnBhY2thZ2VzKCJyZW1vdGVzIilcDQpyZW1vdGVzOjppbnN0YWxsX2dpdGh1YigibWRzci1ib29rL21kc3IiKVwNCm1kc3LtjKjtgqTsp4DqsIAg7ZiE7J6sIFLrsoTsoITsl5DshJwg64uo7KKF65CY7JeI6riw7JeQIOychCDqs7zsoJXsnYQg7Ya17ZW0IO2MqO2CpOyngOulvCDri6TsmrTroZzrk5zrsJvslYTslbwg7ZWc64ukLg0KXA0KXA0KDQpgYGB7cn0NClNBVF9tb2QxIDwtIGxtKHRvdGFsIH4gU2FsYXJ5LCBkYXRhID0gU0FUXzIwMTApDQptc3VtbWFyeShTQVRfbW9kMSkNCmBgYA0K7JyE7JmAIOqwmeydgCDrtoTshJ3snbQg6rCA64ql7ZWY7KeA66eMLCDqsIEg7KO87JeQ7IScIFNBVOulvCDrs7TripQg7ZWZ7IOd65Ok7J2YIOu5hOycqOydtCDrp6TsmrAg7LCo7J2064Kc64uk64qUIOygkOydhCDqsITqs7ztlaAg7IiYIOyXhuuLpC4g65Sw65287IScIFNBVF9ncnDrs4DsiJjrpbwg66eM65Ok7Ja0IOu2hOyEneyXkCDtj6ztlajsi5ztgqjri6QuDQpcDQpcDQoNCmBgYHtyfQ0KU0FUXzIwMTAgPC0gU0FUXzIwMTAgJT4lIA0KICBtdXRhdGUoU0FUX2dycCA9IGlmZWxzZShzYXRfcGN0IDw9IDI3LCAiTG93IiwgIkhpZ2giKSkNCnRhbGx5KH5TQVRfZ3JwLCBkYXRhID0gU0FUXzIwMTApDQpgYGANClwNCg0KYGBge3J9DQpTQVRfcGxvdCAlKyUgU0FUXzIwMTAgKyBhZXMoY29sb3IgPSBTQVRfZ3JwKQ0KYGBgDQpfMjAxMOuFhCDrr7jqta0gNTDqsJwg7KO87JeQ7IScIO2Pieq3oCBTQVQg7KCQ7IiYIOuMgCDtj4nqt6Ag6rWQ7IKsIOq4ieyXrOydmCDsgrDtj6zrj4Qo64uo7JyEOiDsspzri6zrn6wpX1wNCl/qsIEg7KO87JeQ7IScIFNBVOulvCDsuZjrpbgg7ZWZ7IOd7J2YIOuwseu2hOycqOuhnCDqs4TsuLXtmZTrkKhfXA0KXA0KDQpgYGB7cn0NCmNvZWYobG0odG90YWwgfiBTYWxhcnksIGRhdGEgPSBmaWx0ZXIoU0FUXzIwMTAsIFNBVF9ncnAgPT0gIkxvdyIpKSkNCmBgYA0KYGBge3J9DQpjb2VmKGxtKHRvdGFsIH4gU2FsYXJ5LCBkYXRhID0gZmlsdGVyKFNBVF8yMDEwLCBTQVRfZ3JwID09ICJIaWdoIikpKQ0KYGBgDQrqsIEg6re466O57JeQ7IScIO2Pieq3oCDqtZDsgqwg7Jew67SJ7J2AIFNBVOygkOyImOyZgCDslpHsnZgg6rSA6rOE7JeQIOyeiOuLpC4g7KCV66as7ZWY66m0IOuLpOydjOqzvCDqsJnri6QuDQpcDQpcDQoNCioqU0FUIOydkeyLnOycqOydtCDrgq7snYAg7KO87JeQ7ISc64qUIOq1kOyCrCDquInsl6zsmYAgU0FUIOygkOyImOqwgCDquI3soJXsoIHsnLzroZwg7Jew6rSA65CY7Ja0IOyeiOuLpC4qKlwNCioqU0FUIOydkeyLnOycqOydtCDrhpLsnYAg7KO87JeQ7ISc64qUIOq1kOyCrCDquInsl6zsmYAgU0FUIOygkOyImOqwgCDquI3soJXsoIHsnLzroZwg7Jew6rSA65CY7Ja0IOyeiOuLpC4qKlwNCioq66qo65OgIOyjvOyXkOyEnCDquInsl6zsmYAgU0FUIOygkOyImOuKlCDsnYzsnZgg7IOB6rSAIOq0gOqzhOqwgCDsnojri6QuKipcDQpcDQoNCuyVnuyEnOyEnCBTQVRfZ3Jw66W8IOqzoOugpO2VmOyngCDslYrslZjsnYQg65WM64qUIOydjOydmCDsg4HqtIDqtIDqs4Trpbwg67O07JiA6riwIOuVjOusuOydtOuLpC4g7J207LKY65+8IO2YvOuegOuzgOyImOulvCDsuKHsoJXtlZjrqbQg66y47KCc66W8IO2VtOqysO2VmOuKlCDqsoPsnbQg6rCE64uo7ZW07KeE64ukLiDsmIjsuKEg67OA7IiY66GcIHNhdF9wY3Qg67OA7IiY66W8IO2ajOq3gCDrqqjrjbjsl5Ag7LaU6rCA7ZW067O07J6QLg0KXA0KDQpgYGB7cn0NClNBVF9tb2QyIDwtIGxtKHRvdGFsIH4gU2FsYXJ5ICsgc2F0X3BjdCwgZGF0YSA9IFNBVF8yMDEwKQ0KbXN1bW1hcnkoU0FUX21vZDIpDQpgYGANCuydtOygnCBTYWxhcnnsnZgg6riw7Jq46riw6rCAIOyWkeyImOydtOqzoCBzYXRfcGN066W8IOygnOyWtO2VoCDrlYwg7Ya16rOE7KCB7Jy866GcIOycoOydmO2VqOydhCDslYwg7IiYIOyeiOuLpC4g7Jes7KCE7Z6IIOq1kOyCrCDquInsl6zqsIAgU0FU7KCQ7IiYIO2WpeyDgeyXkCDsmIHtlqXsnYQg7KSA64uk6rOgIOqysOuhoOydhCDrgrTrprQg7IiYIOyXhuyngOunjCwg7Zi8656AIOyalOyduOydhCDqs6DroKTtlZwg7ZuEIOq0gOywsO2VnCDsl7DqtIDshLHsnYAg6rOg66Ck7ZWY6riwIOyghOydmCDqsrDqs7zrs7Tri6Qg642UIOyLoOuisO2VoCDsiJgg7J6I64ukLg0KDQpcDQpcDQpcDQpcDQpcDQo=