Задача 1

Ова се податоците од задачата во R:

leukemia_deaths = c(13, 5, 5, 3, 4, 18)
other_deaths = c(378, 200, 151, 47, 31, 33)
deaths = c(leukemia_deaths, other_deaths)
radiation_dose = c(0, 1, 10, 50, 100, 200)
radiation = rep(radiation_dose, 2)
leukemia = c(rep(1, 6), rep(0, 6))

leukemia_df = data.frame(deaths, radiation, leukemia)
leukemia_df

Во R треба да се подготват податоците за да се креира binomial модел.

proportion = cbind(leukemia_deaths, other_deaths)
leukemia_proportion_df = data.frame(proportion, radiation_dose)
leukemia_proportion_df

(a)

proportion треба да е веројатност, па затоа користиме logit и probit link функции.

summary(glm(
  proportion~radiation_dose, 
  family=binomial(link=logit), 
  data=leukemia_proportion_df
))

Call:
glm(formula = proportion ~ radiation_dose, family = binomial(link = logit), 
    data = leukemia_proportion_df)

Deviance Residuals: 
       1         2         3         4         5         6  
 0.41428  -0.48994  -0.13991   0.02835   0.00048   0.00269  

Coefficients:
                Estimate Std. Error z value Pr(>|z|)    
(Intercept)    -3.488973   0.204062 -17.098  < 2e-16 ***
radiation_dose  0.014410   0.001817   7.932 2.15e-15 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 54.35089  on 5  degrees of freedom
Residual deviance:  0.43206  on 4  degrees of freedom
AIC: 26.097

Number of Fisher Scoring iterations: 4
summary(glm(
  proportion~radiation_dose, 
  family=binomial(link=probit), 
  data=leukemia_proportion_df
))

Call:
glm(formula = proportion ~ radiation_dose, family = binomial(link = probit), 
    data = leukemia_proportion_df)

Deviance Residuals: 
       1         2         3         4         5         6  
 0.49118  -0.44422  -0.15683  -0.12140  -0.21161   0.09856  

Coefficients:
                Estimate Std. Error z value Pr(>|z|)    
(Intercept)    -1.895922   0.088925 -21.321  < 2e-16 ***
radiation_dose  0.007504   0.001002   7.488 6.97e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 54.35089  on 5  degrees of freedom
Residual deviance:  0.53242  on 4  degrees of freedom
AIC: 26.197

Number of Fisher Scoring iterations: 3

(b)

Вредноста на AIC e пониска за logit линк функцијата. Доволно е ниска за да можеме да заклучиме дека моделот добро ги научил податоците.

Проблематична е поделбата на самите податоци во задачата. Пример, имаме податоци за смртноста од леукемија за дози на радијација од 1 до 9 (9 посебни дози) и имаме дози на радијација од 100 до 199 (100 посебни дози). Двете се претставени со една точка и тоа малку ја иместува правата на регресија, давајќи поголема значајност на точките што се подесно. Доколку податоците беа поделени на подеднаков број на дози на радијација (1-9, па 10-19, па 20-29, …, 190-199, 200+), регресијата ќе беше доста поточна.

(c)

Моделот ја крериа следнава функција за резултатите: \(logit(-3.48 + 0.014*radiation\_dose)\). Резултатите секогаш ќе бидат помеѓу 0 и 1, благодарение на логит функцијата.

Како што расте дозата на радијација, расте и пропорцијата на умрени од леукемија. За зголемување од една радијациска доза, порастот на смртност од леукемија е очекувано да биде отприлика \(logit(\frac{radiation\_dose + 1}{radiation\_dose})\).

Задача 3

Ова се податоците за мажите:

men_st = c(
  18, 22, 16, 30, 9, 14, 10, 16, 
  16, 23, 13, 22, 9, 12, 7, 11, 
  7, 17, 11, 25, 12, 19, 12, 15, 
  12, 25, 12, 14, 12, 15, 8, 9, 
  24, 50, 8, 12, 20, 28, 5, 7, 
  16, 21, 11, 20, 16, 21, 1, 2, 
  22, 32, 4, 10, 25, 31, 16, 22, 
  12, 14, 4, 12, 32, 38, 19, 25, 
  22, 34, 0, 0, 4, 5, 0, 0, 
  28, 37, 13, 23, 25, 31, 25, 35
)
men_survival = men_st[seq(1, length(men_st), 2)]
men_death = men_st[seq(2, length(men_st), 2)]
men_sd = cbind(men_survival, men_death)

men_year = c(
  as.vector(
    mapply(function (x) { 
      return(rep(x, 4)) 
    }, 
    seq(1938, 1947))
  )
)
men_faculty = factor(c(rep(c('M', 'A', 'S', 'E'), 10)))

men_df = data.frame(men_year, men_faculty, men_sd)
men_df

Ова се податоците за жените:

women_st = c(
  14, 19, 1, 1, 
  11, 16, 4, 4, 
  15, 18, 6, 7, 
  15, 21, 3, 3, 
  8, 9, 4, 4, 
  13, 13, 8, 9, 
  18, 22, 5, 5, 
  18, 22, 16, 17, 
  1, 1, 1, 1, 
  13, 16, 10, 10
)
women_survival = women_st[seq(1, length(women_st), 2)]
women_death = women_st[seq(2, length(women_st), 2)]
women_sd = cbind(women_survival, women_death)

women_year = as.vector(
  mapply(function (x) { 
    return(rep(x, 2)) 
  }, 
  seq(1938, 1947))
)
women_faculty = factor(rep(c('A', 'S'), 10))

women_df = data.frame(women_year, women_faculty, women_sd)
women_df

Вкупните податоци по година и факултет се:

total_survival = men_df$men_survival
total_death = men_df$men_death
total_sd = cbind(total_survival, total_death)
total_year = men_df$men_year
total_faculty = men_df$men_faculty
total_df = data.frame(total_year, total_faculty, total_sd)

for (faculty in c('A', 'S')) {
  total_df[total_df$total_faculty == faculty,]$total_survival = 
    total_df[total_df$total_faculty == faculty,]$total_survival + 
    women_df[women_df$women_faculty == faculty,]$women_survival
  
  total_df[total_df$total_faculty == faculty,]$total_death = 
    total_df[total_df$total_faculty == faculty,]$total_death + 
    women_df[women_df$women_faculty == faculty,]$women_death
}

total_df

Вкупните податоци по година се:

total_survival_year = rep(0, 10)
total_death_year = rep(0, 10)
for (faculty in c('S', 'M', 'A', 'E')) {
  total_survival_year = 
    total_survival_year + 
    total_df[total_df$total_faculty == faculty,]$total_survival
  
  total_death_year = 
    total_death_year + 
    total_df[total_df$total_faculty == faculty,]$total_death
}

total_year_year = as.vector(seq(1938, 1947))
total_year_sd = cbind(total_survival_year, total_death_year)

total_year_df = data.frame(total_year_year, total_year_sd)
total_year_df

Вкупните податоци по година за мажи се:

total_survival_men = rep(0, 10)
total_death_men = rep(0, 10)
for (faculty in c('S', 'M', 'A', 'E')) {
  total_survival_men = 
    total_survival_men + 
    men_df[men_df$men_faculty == faculty,]$men_survival
  
  total_death_men = 
    total_death_men + 
    men_df[men_df$men_faculty == faculty,]$men_death
}

total_men_year = as.vector(seq(1938, 1947))
total_men_sd = cbind(total_survival_men, total_death_men)

total_men_df = data.frame(total_men_year, total_men_sd)
total_men_df

Вкупните податоци по година за жени се:

total_survival_women = rep(0, 10)
total_death_women = rep(0, 10)
for (faculty in c('S', 'A')) {
  total_survival_women = 
    total_survival_women + 
    women_df[women_df$women_faculty == faculty,]$women_survival
  
  total_death_women = 
    total_death_women + 
    women_df[women_df$women_faculty == faculty,]$women_death
}

total_women_year = as.vector(seq(1938, 1947))
total_women_sd = cbind(total_survival_women, total_death_women)

total_women_df = data.frame(total_women_year, total_women_sd)
total_women_df

Конечно, податоците за стапката на смртност на мажи и жени за Arts и Sciences се:

as_year = c(
  men_df[men_df$men_faculty == 'A', ]$men_year,
  men_df[men_df$men_faculty == 'S', ]$men_year,
  women_df[women_df$women_faculty == 'A', ]$women_year,
  women_df[women_df$women_faculty == 'S', ]$women_year
)

as_survival = c(
  men_df[men_df$men_faculty == 'A', ]$men_survival,
  men_df[men_df$men_faculty == 'S', ]$men_survival,
  women_df[women_df$women_faculty == 'A', ]$women_survival,
  women_df[women_df$women_faculty == 'S', ]$women_survival
)

as_death = c(
  men_df[men_df$men_faculty == 'A', ]$men_death,
  men_df[men_df$men_faculty == 'S', ]$men_death,
  women_df[women_df$women_faculty == 'A', ]$women_death,
  women_df[women_df$women_faculty == 'S', ]$women_death
)

as_faculty = as.factor(c(
  rep('A', length(men_df[men_df$men_faculty == 'A', ]$men_faculty)),
  rep('S', length(men_df[men_df$men_faculty == 'S', ]$men_faculty)),
  rep('A', length(women_df[women_df$women_faculty == 'A', ]$women_faculty)),
  rep('S', length(women_df[women_df$women_faculty == 'S', ]$women_faculty))
))

as_proportion = cbind(as_survival, as_death)
as_df = data.frame(as_year, as_faculty, as_proportion)
as_df

(a)

Прво, ги плотираме пропроциите секоја година, за да видиме како се движи пропорцијата. Речиси е јасно дека нема никаква промена низ годините.

total_year_df["proportion"] = 
  total_year_df$total_survival_year / (
    total_year_df$total_survival_year + 
      total_year_df$total_death_year
    )

with(total_year_df, plot(total_year_year, proportion))

Моделот креиран за вкупните податоци по години добро ги предвидува податоците, Slope-от е доста низок, a и p-вредноста е многу голема, па не ја отфрламе хипотезата дека slope-от e нула т.е. дека низ годините е иста пропорцијата.

summary(glm(
  total_year_sd ~ total_year_year, 
  family=binomial(link="logit"), 
  data=total_year_df
))

Call:
glm(formula = total_year_sd ~ total_year_year, family = binomial(link = "logit"), 
    data = total_year_df)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.7031  -0.3309   0.1485   0.2171   0.5067  

Coefficients:
                 Estimate Std. Error z value Pr(>|z|)
(Intercept)     -35.55903   32.50748  -1.094    0.274
total_year_year   0.01813    0.01673   1.083    0.279

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2.5983  on 9  degrees of freedom
Residual deviance: 1.4238  on 8  degrees of freedom
AIC: 60.695

Number of Fisher Scoring iterations: 3

До истиот заклучок доаѓаме и со прост модел кој ја предвидува пропорцијата. Повторно не можеме да ја отфрлиме хипотезата дека slope-от е нула, т.е., дека низ годините нема промена на пропорцијата. Дополнително, и R2 е доста ниско.

summary(lm(
  proportion ~ total_year_year, 
  data=total_year_df
))

Call:
lm(formula = proportion ~ total_year_year, data = total_year_df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.024817 -0.014108  0.005449  0.008852  0.019581 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)  
(Intercept)     -6.823890   3.541230  -1.927   0.0901 .
total_year_year  0.003725   0.001823   2.043   0.0753 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01656 on 8 degrees of freedom
Multiple R-squared:  0.3429,    Adjusted R-squared:  0.2608 
F-statistic: 4.175 on 1 and 8 DF,  p-value: 0.07528

(b)

Прво, ги плотираме пропроциите секоја година, за да видиме како се движи пропорцијата. Од самата слика се забележува дека и да има некоја ситна позитивна промена, таа е премногу мала.

total_men_df["proportion"] = 
  total_men_df$total_survival_men / (
    total_men_df$total_survival_men + 
      total_men_df$total_death_men
    )

with(total_men_df, plot(total_men_year, proportion))

Моделот креиран за вкупните податоци по години добро ги предвидува податоците, Slope-от е доста низок, a и p-вредноста е многу голема, па не ја отфрламе хипотезата дека slope-от e нула т.е. дека низ годините е иста пропорцијата.

summary(glm(
  total_men_sd ~ total_men_year, 
  family=binomial(link="logit"), 
  data=total_men_df
))

Call:
glm(formula = total_men_sd ~ total_men_year, family = binomial(link = "logit"), 
    data = total_men_df)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.7412  -0.2076   0.1373   0.2980   0.4545  

Coefficients:
                Estimate Std. Error z value Pr(>|z|)
(Intercept)    -36.87246   36.84660  -1.001    0.317
total_men_year   0.01877    0.01897   0.990    0.322

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2.6682  on 9  degrees of freedom
Residual deviance: 1.6873  on 8  degrees of freedom
AIC: 58.303

Number of Fisher Scoring iterations: 3

До истиот заклучок доаѓаме и со прост модел кој ја предвидува пропорцијата. Повторно не можеме да ја отфрлиме хипотезата дека slope-от е нула, т.е., дека низ годините нема промена на пропорцијата. Дополнително, и R2 е доста ниско.

summary(lm(proportion ~ total_men_year, data=total_men_df))

Call:
lm(formula = proportion ~ total_men_year, data = total_men_df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.033779 -0.010077  0.006668  0.012150  0.019612 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)
(Intercept)    -7.433755   4.249935  -1.749    0.118
total_men_year  0.004033   0.002188   1.843    0.103

Residual standard error: 0.01987 on 8 degrees of freedom
Multiple R-squared:  0.2981,    Adjusted R-squared:  0.2103 
F-statistic: 3.397 on 1 and 8 DF,  p-value: 0.1025

(c)

Прво, ги плотираме пропроциите секоја година, за да видиме како се движи пропорцијата. Од самата слика се забележува дека е можно да има некаква позитивна промена, но дека не е многу силна.

total_women_df["proportion"] = 
  total_women_df$total_survival_women / (
    total_women_df$total_survival_women + 
      total_women_df$total_death_women
    )

with(total_women_df, plot(total_women_year, proportion))

Моделот креиран за вкупните податоци по години добро ги предвидува податоците, Slope-от е доста низок, a и p-вредноста е многу голема, па не ја отфрламе хипотезата дека slope-от e нула т.е. дека низ годините е иста пропорцијата. Сепак, доказите против хипотезата се посилни овде.

summary(glm(
  total_women_sd ~ total_women_year, 
  family=binomial(link="logit"), 
  data=total_women_df
))

Call:
glm(formula = total_women_sd ~ total_women_year, family = binomial(link = "logit"), 
    data = total_women_df)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.27766  -0.12300  -0.06279   0.14367   0.37813  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)
(Intercept)      -38.35152   69.62339  -0.551    0.582
total_women_year   0.01965    0.03584   0.548    0.583

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 0.67289  on 9  degrees of freedom
Residual deviance: 0.37190  on 8  degrees of freedom
AIC: 44.174

Number of Fisher Scoring iterations: 3

До истиот заклучок доаѓаме и со прост модел кој ја предвидува пропорцијата. Повторно не можеме да ја отфрлиме хипотезата дека slope-от е нула, т.е., дека низ годините нема промена на пропорцијата. Дополнително, и R2 е доста ниско. Сепак, доказите против хипотезата се посилни овде.

summary(lm(proportion ~ total_women_year, data=total_women_df))

Call:
lm(formula = proportion ~ total_women_year, data = total_women_df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.022766 -0.010391 -0.007051  0.016238  0.024718 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)  
(Intercept)      -11.502437   3.978943  -2.891   0.0202 *
total_women_year   0.006159   0.002048   3.007   0.0169 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01861 on 8 degrees of freedom
Multiple R-squared:  0.5305,    Adjusted R-squared:  0.4718 
F-statistic:  9.04 on 1 and 8 DF,  p-value: 0.0169

(d)

Од генералниот линеарен модел забележуваме дека коефициентот пред факторот факултет е повисок од 0. Заклучокот е дека најверојатно има разлика помеѓу факултетите, т.е., дека поголема е смртноста кај тие од Sciences.

summary(glm(
  as_proportion ~ as_year + as_faculty, 
  family=binomial(link="logit"), 
  data=as_df
))

Call:
glm(formula = as_proportion ~ as_year + as_faculty, family = binomial(link = "logit"), 
    data = as_df)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.3686  -0.2279   0.1518   0.3336   0.9718  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)
(Intercept) -31.74089   43.94010  -0.722    0.470
as_year       0.01614    0.02263   0.713    0.476
as_facultyS   0.16444    0.12905   1.274    0.203

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 12.5073  on 38  degrees of freedom
Residual deviance:  9.8258  on 36  degrees of freedom
AIC: 151.16

Number of Fisher Scoring iterations: 3
LS0tDQp0aXRsZTogItCT0LvQsNCy0LAgNzog0JHQuNC90LDRgNC90Lgg0L/RgNC+0LzQtdC90LvQuNCy0Lgg0Lgg0LvQvtCz0LjRgdGC0LjRh9C60LAg0YDQtdCz0YDQtdGB0LjRmNCwIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyDQl9Cw0LTQsNGH0LAgMQ0KDQrQntCy0LAg0YHQtSDQv9C+0LTQsNGC0L7RhtC40YLQtSDQvtC0INC30LDQtNCw0YfQsNGC0LAg0LLQviBSOg0KDQpgYGB7cn0NCmxldWtlbWlhX2RlYXRocyA9IGMoMTMsIDUsIDUsIDMsIDQsIDE4KQ0Kb3RoZXJfZGVhdGhzID0gYygzNzgsIDIwMCwgMTUxLCA0NywgMzEsIDMzKQ0KZGVhdGhzID0gYyhsZXVrZW1pYV9kZWF0aHMsIG90aGVyX2RlYXRocykNCnJhZGlhdGlvbl9kb3NlID0gYygwLCAxLCAxMCwgNTAsIDEwMCwgMjAwKQ0KcmFkaWF0aW9uID0gcmVwKHJhZGlhdGlvbl9kb3NlLCAyKQ0KbGV1a2VtaWEgPSBjKHJlcCgxLCA2KSwgcmVwKDAsIDYpKQ0KDQpsZXVrZW1pYV9kZiA9IGRhdGEuZnJhbWUoZGVhdGhzLCByYWRpYXRpb24sIGxldWtlbWlhKQ0KbGV1a2VtaWFfZGYNCmBgYA0KDQrQktC+IFIg0YLRgNC10LHQsCDQtNCwINGB0LUg0L/QvtC00LPQvtGC0LLQsNGCINC/0L7QtNCw0YLQvtGG0LjRgtC1INC30LAg0LTQsCDRgdC1INC60YDQtdC40YDQsCBiaW5vbWlhbCDQvNC+0LTQtdC7LiANCg0KYGBge3J9DQpwcm9wb3J0aW9uID0gY2JpbmQobGV1a2VtaWFfZGVhdGhzLCBvdGhlcl9kZWF0aHMpDQpsZXVrZW1pYV9wcm9wb3J0aW9uX2RmID0gZGF0YS5mcmFtZShwcm9wb3J0aW9uLCByYWRpYXRpb25fZG9zZSkNCmxldWtlbWlhX3Byb3BvcnRpb25fZGYNCmBgYA0KDQojIyMgKGEpDQoNCnByb3BvcnRpb24g0YLRgNC10LHQsCDQtNCwINC1INCy0LXRgNC+0ZjQsNGC0L3QvtGB0YIsINC/0LAg0LfQsNGC0L7QsCDQutC+0YDQuNGB0YLQuNC80LUgbG9naXQg0LggcHJvYml0IGxpbmsg0YTRg9C90LrRhtC40LguDQoNCmBgYHtyfQ0Kc3VtbWFyeShnbG0oDQogIHByb3BvcnRpb25+cmFkaWF0aW9uX2Rvc2UsIA0KICBmYW1pbHk9Ymlub21pYWwobGluaz1sb2dpdCksIA0KICBkYXRhPWxldWtlbWlhX3Byb3BvcnRpb25fZGYNCikpDQpzdW1tYXJ5KGdsbSgNCiAgcHJvcG9ydGlvbn5yYWRpYXRpb25fZG9zZSwgDQogIGZhbWlseT1iaW5vbWlhbChsaW5rPXByb2JpdCksIA0KICBkYXRhPWxldWtlbWlhX3Byb3BvcnRpb25fZGYNCikpDQpgYGANCg0KIyMjIChiKQ0KDQrQktGA0LXQtNC90L7RgdGC0LAg0L3QsCBBSUMgZSDQv9C+0L3QuNGB0LrQsCDQt9CwIGxvZ2l0INC70LjQvdC6INGE0YPQvdC60YbQuNGY0LDRgtCwLiDQlNC+0LLQvtC70L3QviDQtSDQvdC40YHQutCwINC30LAg0LTQsCDQvNC+0LbQtdC80LUg0LTQsCDQt9Cw0LrQu9GD0YfQuNC80LUg0LTQtdC60LAg0LzQvtC00LXQu9C+0YIg0LTQvtCx0YDQviDQs9C4INC90LDRg9GH0LjQuyDQv9C+0LTQsNGC0L7RhtC40YLQtS4NCg0K0J/RgNC+0LHQu9C10LzQsNGC0LjRh9C90LAg0LUg0L/QvtC00LXQu9Cx0LDRgtCwINC90LAg0YHQsNC80LjRgtC1INC/0L7QtNCw0YLQvtGG0Lgg0LLQviDQt9Cw0LTQsNGH0LDRgtCwLiDQn9GA0LjQvNC10YAsINC40LzQsNC80LUg0L/QvtC00LDRgtC+0YbQuCDQt9CwINGB0LzRgNGC0L3QvtGB0YLQsCDQvtC0INC70LXRg9C60LXQvNC40ZjQsCDQt9CwINC00L7Qt9C4INC90LAg0YDQsNC00LjRmNCw0YbQuNGY0LAg0L7QtCAxINC00L4gOSAoOSDQv9C+0YHQtdCx0L3QuCDQtNC+0LfQuCkg0Lgg0LjQvNCw0LzQtSDQtNC+0LfQuCDQvdCwINGA0LDQtNC40ZjQsNGG0LjRmNCwINC+0LQgMTAwINC00L4gMTk5ICgxMDAg0L/QvtGB0LXQsdC90Lgg0LTQvtC30LgpLiDQlNCy0LXRgtC1INGB0LUg0L/RgNC10YLRgdGC0LDQstC10L3QuCDRgdC+INC10LTQvdCwINGC0L7Rh9C60LAg0Lgg0YLQvtCwINC80LDQu9C60YMg0ZjQsCDQuNC80LXRgdGC0YPQstCwINC/0YDQsNCy0LDRgtCwINC90LAg0YDQtdCz0YDQtdGB0LjRmNCwLCDQtNCw0LLQsNGY0ZzQuCDQv9C+0LPQvtC70LXQvNCwINC30L3QsNGH0LDRmNC90L7RgdGCINC90LAg0YLQvtGH0LrQuNGC0LUg0YjRgtC+INGB0LUg0L/QvtC00LXRgdC90L4uINCU0L7QutC+0LvQutGDINC/0L7QtNCw0YLQvtGG0LjRgtC1INCx0LXQsCDQv9C+0LTQtdC70LXQvdC4INC90LAg0L/QvtC00LXQtNC90LDQutC+0LIg0LHRgNC+0Zgg0L3QsCDQtNC+0LfQuCDQvdCwINGA0LDQtNC40ZjQsNGG0LjRmNCwICgxLTksINC/0LAgMTAtMTksINC/0LAgMjAtMjksIC4uLiwgMTkwLTE5OSwgMjAwKyksINGA0LXQs9GA0LXRgdC40ZjQsNGC0LAg0ZzQtSDQsdC10YjQtSDQtNC+0YHRgtCwINC/0L7RgtC+0YfQvdCwLg0KDQojIyMgKGMpDQoNCtCc0L7QtNC10LvQvtGCINGY0LAg0LrRgNC10YDQuNCwINGB0LvQtdC00L3QsNCy0LAg0YTRg9C90LrRhtC40ZjQsCDQt9CwINGA0LXQt9GD0LvRgtCw0YLQuNGC0LU6ICRsb2dpdCgtMy40OCArIDAuMDE0KnJhZGlhdGlvblxfZG9zZSkkLiDQoNC10LfRg9C70YLQsNGC0LjRgtC1INGB0LXQutC+0LPQsNGIINGc0LUg0LHQuNC00LDRgiDQv9C+0LzQtdGT0YMgMCDQuCAxLCDQsdC70LDQs9C+0LTQsNGA0LXQvdC40LUg0L3QsCDQu9C+0LPQuNGCINGE0YPQvdC60YbQuNGY0LDRgtCwLg0KDQrQmtCw0LrQviDRiNGC0L4g0YDQsNGB0YLQtSDQtNC+0LfQsNGC0LAg0L3QsCDRgNCw0LTQuNGY0LDRhtC40ZjQsCwg0YDQsNGB0YLQtSDQuCDQv9GA0L7Qv9C+0YDRhtC40ZjQsNGC0LAg0L3QsCDRg9C80YDQtdC90Lgg0L7QtCDQu9C10YPQutC10LzQuNGY0LAuINCX0LAg0LfQs9C+0LvQtdC80YPQstCw0ZrQtSDQvtC0INC10LTQvdCwINGA0LDQtNC40ZjQsNGG0LjRgdC60LAg0LTQvtC30LAsINC/0L7RgNCw0YHRgtC+0YIg0L3QsCDRgdC80YDRgtC90L7RgdGCINC+0LQg0LvQtdGD0LrQtdC80LjRmNCwINC1INC+0YfQtdC60YPQstCw0L3QviDQtNCwINCx0LjQtNC1INC+0YLQv9GA0LjQu9C40LrQsCAkbG9naXQoXGZyYWN7cmFkaWF0aW9uXF9kb3NlICsgMX17cmFkaWF0aW9uXF9kb3NlfSkkLg0KDQojINCX0LDQtNCw0YfQsCAzDQoNCtCe0LLQsCDRgdC1INC/0L7QtNCw0YLQvtGG0LjRgtC1INC30LAg0LzQsNC20LjRgtC1Og0KDQpgYGB7cn0NCm1lbl9zdCA9IGMoDQogIDE4LCAyMiwgMTYsIDMwLCA5LCAxNCwgMTAsIDE2LCANCiAgMTYsIDIzLCAxMywgMjIsIDksIDEyLCA3LCAxMSwgDQogIDcsIDE3LCAxMSwgMjUsIDEyLCAxOSwgMTIsIDE1LCANCiAgMTIsIDI1LCAxMiwgMTQsIDEyLCAxNSwgOCwgOSwgDQogIDI0LCA1MCwgOCwgMTIsIDIwLCAyOCwgNSwgNywgDQogIDE2LCAyMSwgMTEsIDIwLCAxNiwgMjEsIDEsIDIsIA0KICAyMiwgMzIsIDQsIDEwLCAyNSwgMzEsIDE2LCAyMiwgDQogIDEyLCAxNCwgNCwgMTIsIDMyLCAzOCwgMTksIDI1LCANCiAgMjIsIDM0LCAwLCAwLCA0LCA1LCAwLCAwLCANCiAgMjgsIDM3LCAxMywgMjMsIDI1LCAzMSwgMjUsIDM1DQopDQptZW5fc3Vydml2YWwgPSBtZW5fc3Rbc2VxKDEsIGxlbmd0aChtZW5fc3QpLCAyKV0NCm1lbl9kZWF0aCA9IG1lbl9zdFtzZXEoMiwgbGVuZ3RoKG1lbl9zdCksIDIpXQ0KbWVuX3NkID0gY2JpbmQobWVuX3N1cnZpdmFsLCBtZW5fZGVhdGgpDQoNCm1lbl95ZWFyID0gYygNCiAgYXMudmVjdG9yKA0KICAgIG1hcHBseShmdW5jdGlvbiAoeCkgeyANCiAgICAgIHJldHVybihyZXAoeCwgNCkpIA0KICAgIH0sIA0KICAgIHNlcSgxOTM4LCAxOTQ3KSkNCiAgKQ0KKQ0KbWVuX2ZhY3VsdHkgPSBmYWN0b3IoYyhyZXAoYygnTScsICdBJywgJ1MnLCAnRScpLCAxMCkpKQ0KDQptZW5fZGYgPSBkYXRhLmZyYW1lKG1lbl95ZWFyLCBtZW5fZmFjdWx0eSwgbWVuX3NkKQ0KbWVuX2RmDQpgYGANCg0K0J7QstCwINGB0LUg0L/QvtC00LDRgtC+0YbQuNGC0LUg0LfQsCDQttC10L3QuNGC0LU6DQoNCmBgYHtyfQ0Kd29tZW5fc3QgPSBjKA0KICAxNCwgMTksIDEsIDEsIA0KICAxMSwgMTYsIDQsIDQsIA0KICAxNSwgMTgsIDYsIDcsIA0KICAxNSwgMjEsIDMsIDMsIA0KICA4LCA5LCA0LCA0LCANCiAgMTMsIDEzLCA4LCA5LCANCiAgMTgsIDIyLCA1LCA1LCANCiAgMTgsIDIyLCAxNiwgMTcsIA0KICAxLCAxLCAxLCAxLCANCiAgMTMsIDE2LCAxMCwgMTANCikNCndvbWVuX3N1cnZpdmFsID0gd29tZW5fc3Rbc2VxKDEsIGxlbmd0aCh3b21lbl9zdCksIDIpXQ0Kd29tZW5fZGVhdGggPSB3b21lbl9zdFtzZXEoMiwgbGVuZ3RoKHdvbWVuX3N0KSwgMildDQp3b21lbl9zZCA9IGNiaW5kKHdvbWVuX3N1cnZpdmFsLCB3b21lbl9kZWF0aCkNCg0Kd29tZW5feWVhciA9IGFzLnZlY3RvcigNCiAgbWFwcGx5KGZ1bmN0aW9uICh4KSB7IA0KICAgIHJldHVybihyZXAoeCwgMikpIA0KICB9LCANCiAgc2VxKDE5MzgsIDE5NDcpKQ0KKQ0Kd29tZW5fZmFjdWx0eSA9IGZhY3RvcihyZXAoYygnQScsICdTJyksIDEwKSkNCg0Kd29tZW5fZGYgPSBkYXRhLmZyYW1lKHdvbWVuX3llYXIsIHdvbWVuX2ZhY3VsdHksIHdvbWVuX3NkKQ0Kd29tZW5fZGYNCmBgYA0KDQrQktC60YPQv9C90LjRgtC1INC/0L7QtNCw0YLQvtGG0Lgg0L/QviDQs9C+0LTQuNC90LAg0Lgg0YTQsNC60YPQu9GC0LXRgiDRgdC1Og0KDQpgYGB7cn0NCnRvdGFsX3N1cnZpdmFsID0gbWVuX2RmJG1lbl9zdXJ2aXZhbA0KdG90YWxfZGVhdGggPSBtZW5fZGYkbWVuX2RlYXRoDQp0b3RhbF9zZCA9IGNiaW5kKHRvdGFsX3N1cnZpdmFsLCB0b3RhbF9kZWF0aCkNCnRvdGFsX3llYXIgPSBtZW5fZGYkbWVuX3llYXINCnRvdGFsX2ZhY3VsdHkgPSBtZW5fZGYkbWVuX2ZhY3VsdHkNCnRvdGFsX2RmID0gZGF0YS5mcmFtZSh0b3RhbF95ZWFyLCB0b3RhbF9mYWN1bHR5LCB0b3RhbF9zZCkNCg0KZm9yIChmYWN1bHR5IGluIGMoJ0EnLCAnUycpKSB7DQogIHRvdGFsX2RmW3RvdGFsX2RmJHRvdGFsX2ZhY3VsdHkgPT0gZmFjdWx0eSxdJHRvdGFsX3N1cnZpdmFsID0gDQogICAgdG90YWxfZGZbdG90YWxfZGYkdG90YWxfZmFjdWx0eSA9PSBmYWN1bHR5LF0kdG90YWxfc3Vydml2YWwgKyANCiAgICB3b21lbl9kZlt3b21lbl9kZiR3b21lbl9mYWN1bHR5ID09IGZhY3VsdHksXSR3b21lbl9zdXJ2aXZhbA0KICANCiAgdG90YWxfZGZbdG90YWxfZGYkdG90YWxfZmFjdWx0eSA9PSBmYWN1bHR5LF0kdG90YWxfZGVhdGggPSANCiAgICB0b3RhbF9kZlt0b3RhbF9kZiR0b3RhbF9mYWN1bHR5ID09IGZhY3VsdHksXSR0b3RhbF9kZWF0aCArIA0KICAgIHdvbWVuX2RmW3dvbWVuX2RmJHdvbWVuX2ZhY3VsdHkgPT0gZmFjdWx0eSxdJHdvbWVuX2RlYXRoDQp9DQoNCnRvdGFsX2RmDQpgYGANCg0K0JLQutGD0L/QvdC40YLQtSDQv9C+0LTQsNGC0L7RhtC4INC/0L4g0LPQvtC00LjQvdCwINGB0LU6DQoNCmBgYHtyfQ0KdG90YWxfc3Vydml2YWxfeWVhciA9IHJlcCgwLCAxMCkNCnRvdGFsX2RlYXRoX3llYXIgPSByZXAoMCwgMTApDQpmb3IgKGZhY3VsdHkgaW4gYygnUycsICdNJywgJ0EnLCAnRScpKSB7DQogIHRvdGFsX3N1cnZpdmFsX3llYXIgPSANCiAgICB0b3RhbF9zdXJ2aXZhbF95ZWFyICsgDQogICAgdG90YWxfZGZbdG90YWxfZGYkdG90YWxfZmFjdWx0eSA9PSBmYWN1bHR5LF0kdG90YWxfc3Vydml2YWwNCiAgDQogIHRvdGFsX2RlYXRoX3llYXIgPSANCiAgICB0b3RhbF9kZWF0aF95ZWFyICsgDQogICAgdG90YWxfZGZbdG90YWxfZGYkdG90YWxfZmFjdWx0eSA9PSBmYWN1bHR5LF0kdG90YWxfZGVhdGgNCn0NCg0KdG90YWxfeWVhcl95ZWFyID0gYXMudmVjdG9yKHNlcSgxOTM4LCAxOTQ3KSkNCnRvdGFsX3llYXJfc2QgPSBjYmluZCh0b3RhbF9zdXJ2aXZhbF95ZWFyLCB0b3RhbF9kZWF0aF95ZWFyKQ0KDQp0b3RhbF95ZWFyX2RmID0gZGF0YS5mcmFtZSh0b3RhbF95ZWFyX3llYXIsIHRvdGFsX3llYXJfc2QpDQp0b3RhbF95ZWFyX2RmDQpgYGANCg0K0JLQutGD0L/QvdC40YLQtSDQv9C+0LTQsNGC0L7RhtC4INC/0L4g0LPQvtC00LjQvdCwINC30LAg0LzQsNC20Lgg0YHQtToNCg0KYGBge3J9DQp0b3RhbF9zdXJ2aXZhbF9tZW4gPSByZXAoMCwgMTApDQp0b3RhbF9kZWF0aF9tZW4gPSByZXAoMCwgMTApDQpmb3IgKGZhY3VsdHkgaW4gYygnUycsICdNJywgJ0EnLCAnRScpKSB7DQogIHRvdGFsX3N1cnZpdmFsX21lbiA9IA0KICAgIHRvdGFsX3N1cnZpdmFsX21lbiArIA0KICAgIG1lbl9kZlttZW5fZGYkbWVuX2ZhY3VsdHkgPT0gZmFjdWx0eSxdJG1lbl9zdXJ2aXZhbA0KICANCiAgdG90YWxfZGVhdGhfbWVuID0gDQogICAgdG90YWxfZGVhdGhfbWVuICsgDQogICAgbWVuX2RmW21lbl9kZiRtZW5fZmFjdWx0eSA9PSBmYWN1bHR5LF0kbWVuX2RlYXRoDQp9DQoNCnRvdGFsX21lbl95ZWFyID0gYXMudmVjdG9yKHNlcSgxOTM4LCAxOTQ3KSkNCnRvdGFsX21lbl9zZCA9IGNiaW5kKHRvdGFsX3N1cnZpdmFsX21lbiwgdG90YWxfZGVhdGhfbWVuKQ0KDQp0b3RhbF9tZW5fZGYgPSBkYXRhLmZyYW1lKHRvdGFsX21lbl95ZWFyLCB0b3RhbF9tZW5fc2QpDQp0b3RhbF9tZW5fZGYNCmBgYA0KDQrQktC60YPQv9C90LjRgtC1INC/0L7QtNCw0YLQvtGG0Lgg0L/QviDQs9C+0LTQuNC90LAg0LfQsCDQttC10L3QuCDRgdC1Og0KDQpgYGB7cn0NCnRvdGFsX3N1cnZpdmFsX3dvbWVuID0gcmVwKDAsIDEwKQ0KdG90YWxfZGVhdGhfd29tZW4gPSByZXAoMCwgMTApDQpmb3IgKGZhY3VsdHkgaW4gYygnUycsICdBJykpIHsNCiAgdG90YWxfc3Vydml2YWxfd29tZW4gPSANCiAgICB0b3RhbF9zdXJ2aXZhbF93b21lbiArIA0KICAgIHdvbWVuX2RmW3dvbWVuX2RmJHdvbWVuX2ZhY3VsdHkgPT0gZmFjdWx0eSxdJHdvbWVuX3N1cnZpdmFsDQogIA0KICB0b3RhbF9kZWF0aF93b21lbiA9IA0KICAgIHRvdGFsX2RlYXRoX3dvbWVuICsgDQogICAgd29tZW5fZGZbd29tZW5fZGYkd29tZW5fZmFjdWx0eSA9PSBmYWN1bHR5LF0kd29tZW5fZGVhdGgNCn0NCg0KdG90YWxfd29tZW5feWVhciA9IGFzLnZlY3RvcihzZXEoMTkzOCwgMTk0NykpDQp0b3RhbF93b21lbl9zZCA9IGNiaW5kKHRvdGFsX3N1cnZpdmFsX3dvbWVuLCB0b3RhbF9kZWF0aF93b21lbikNCg0KdG90YWxfd29tZW5fZGYgPSBkYXRhLmZyYW1lKHRvdGFsX3dvbWVuX3llYXIsIHRvdGFsX3dvbWVuX3NkKQ0KdG90YWxfd29tZW5fZGYNCmBgYA0KDQrQmtC+0L3QtdGH0L3Qviwg0L/QvtC00LDRgtC+0YbQuNGC0LUg0LfQsCDRgdGC0LDQv9C60LDRgtCwINC90LAg0YHQvNGA0YLQvdC+0YHRgiDQvdCwINC80LDQttC4INC4INC20LXQvdC4INC30LAgQXJ0cyDQuCBTY2llbmNlcyDRgdC1Og0KDQpgYGB7cn0NCmFzX3llYXIgPSBjKA0KICBtZW5fZGZbbWVuX2RmJG1lbl9mYWN1bHR5ID09ICdBJywgXSRtZW5feWVhciwNCiAgbWVuX2RmW21lbl9kZiRtZW5fZmFjdWx0eSA9PSAnUycsIF0kbWVuX3llYXIsDQogIHdvbWVuX2RmW3dvbWVuX2RmJHdvbWVuX2ZhY3VsdHkgPT0gJ0EnLCBdJHdvbWVuX3llYXIsDQogIHdvbWVuX2RmW3dvbWVuX2RmJHdvbWVuX2ZhY3VsdHkgPT0gJ1MnLCBdJHdvbWVuX3llYXINCikNCg0KYXNfc3Vydml2YWwgPSBjKA0KICBtZW5fZGZbbWVuX2RmJG1lbl9mYWN1bHR5ID09ICdBJywgXSRtZW5fc3Vydml2YWwsDQogIG1lbl9kZlttZW5fZGYkbWVuX2ZhY3VsdHkgPT0gJ1MnLCBdJG1lbl9zdXJ2aXZhbCwNCiAgd29tZW5fZGZbd29tZW5fZGYkd29tZW5fZmFjdWx0eSA9PSAnQScsIF0kd29tZW5fc3Vydml2YWwsDQogIHdvbWVuX2RmW3dvbWVuX2RmJHdvbWVuX2ZhY3VsdHkgPT0gJ1MnLCBdJHdvbWVuX3N1cnZpdmFsDQopDQoNCmFzX2RlYXRoID0gYygNCiAgbWVuX2RmW21lbl9kZiRtZW5fZmFjdWx0eSA9PSAnQScsIF0kbWVuX2RlYXRoLA0KICBtZW5fZGZbbWVuX2RmJG1lbl9mYWN1bHR5ID09ICdTJywgXSRtZW5fZGVhdGgsDQogIHdvbWVuX2RmW3dvbWVuX2RmJHdvbWVuX2ZhY3VsdHkgPT0gJ0EnLCBdJHdvbWVuX2RlYXRoLA0KICB3b21lbl9kZlt3b21lbl9kZiR3b21lbl9mYWN1bHR5ID09ICdTJywgXSR3b21lbl9kZWF0aA0KKQ0KDQphc19mYWN1bHR5ID0gYXMuZmFjdG9yKGMoDQogIHJlcCgnQScsIGxlbmd0aChtZW5fZGZbbWVuX2RmJG1lbl9mYWN1bHR5ID09ICdBJywgXSRtZW5fZmFjdWx0eSkpLA0KICByZXAoJ1MnLCBsZW5ndGgobWVuX2RmW21lbl9kZiRtZW5fZmFjdWx0eSA9PSAnUycsIF0kbWVuX2ZhY3VsdHkpKSwNCiAgcmVwKCdBJywgbGVuZ3RoKHdvbWVuX2RmW3dvbWVuX2RmJHdvbWVuX2ZhY3VsdHkgPT0gJ0EnLCBdJHdvbWVuX2ZhY3VsdHkpKSwNCiAgcmVwKCdTJywgbGVuZ3RoKHdvbWVuX2RmW3dvbWVuX2RmJHdvbWVuX2ZhY3VsdHkgPT0gJ1MnLCBdJHdvbWVuX2ZhY3VsdHkpKQ0KKSkNCg0KYXNfcHJvcG9ydGlvbiA9IGNiaW5kKGFzX3N1cnZpdmFsLCBhc19kZWF0aCkNCmFzX2RmID0gZGF0YS5mcmFtZShhc195ZWFyLCBhc19mYWN1bHR5LCBhc19wcm9wb3J0aW9uKQ0KYXNfZGYNCmBgYA0KDQojIyMgKGEpDQoNCtCf0YDQstC+LCDQs9C4INC/0LvQvtGC0LjRgNCw0LzQtSDQv9GA0L7Qv9GA0L7RhtC40LjRgtC1INGB0LXQutC+0ZjQsCDQs9C+0LTQuNC90LAsINC30LAg0LTQsCDQstC40LTQuNC80LUg0LrQsNC60L4g0YHQtSDQtNCy0LjQttC4INC/0YDQvtC/0L7RgNGG0LjRmNCw0YLQsC4g0KDQtdGH0LjRgdC4INC1INGY0LDRgdC90L4g0LTQtdC60LAg0L3QtdC80LAg0L3QuNC60LDQutCy0LAg0L/RgNC+0LzQtdC90LAg0L3QuNC3INCz0L7QtNC40L3QuNGC0LUuDQoNCmBgYHtyfQ0KdG90YWxfeWVhcl9kZlsicHJvcG9ydGlvbiJdID0gDQogIHRvdGFsX3llYXJfZGYkdG90YWxfc3Vydml2YWxfeWVhciAvICgNCiAgICB0b3RhbF95ZWFyX2RmJHRvdGFsX3N1cnZpdmFsX3llYXIgKyANCiAgICAgIHRvdGFsX3llYXJfZGYkdG90YWxfZGVhdGhfeWVhcg0KICAgICkNCg0Kd2l0aCh0b3RhbF95ZWFyX2RmLCBwbG90KHRvdGFsX3llYXJfeWVhciwgcHJvcG9ydGlvbikpDQpgYGANCg0K0JzQvtC00LXQu9C+0YIg0LrRgNC10LjRgNCw0L0g0LfQsCDQstC60YPQv9C90LjRgtC1INC/0L7QtNCw0YLQvtGG0Lgg0L/QviDQs9C+0LTQuNC90Lgg0LTQvtCx0YDQviDQs9C4INC/0YDQtdC00LLQuNC00YPQstCwINC/0L7QtNCw0YLQvtGG0LjRgtC1LCBTbG9wZS3QvtGCINC1INC00L7RgdGC0LAg0L3QuNC30L7QuiwgYSDQuCBwLdCy0YDQtdC00L3QvtGB0YLQsCDQtSDQvNC90L7Qs9GDINCz0L7Qu9C10LzQsCwg0L/QsCDQvdC1INGY0LAg0L7RgtGE0YDQu9Cw0LzQtSDRhdC40L/QvtGC0LXQt9Cw0YLQsCDQtNC10LrQsCBzbG9wZS3QvtGCIGUg0L3Rg9C70LAg0YIu0LUuINC00LXQutCwINC90LjQtyDQs9C+0LTQuNC90LjRgtC1INC1INC40YHRgtCwINC/0YDQvtC/0L7RgNGG0LjRmNCw0YLQsC4NCg0KYGBge3J9DQpzdW1tYXJ5KGdsbSgNCiAgdG90YWxfeWVhcl9zZCB+IHRvdGFsX3llYXJfeWVhciwgDQogIGZhbWlseT1iaW5vbWlhbChsaW5rPSJsb2dpdCIpLCANCiAgZGF0YT10b3RhbF95ZWFyX2RmDQopKQ0KYGBgDQoNCtCU0L4g0LjRgdGC0LjQvtGCINC30LDQutC70YPRh9C+0Log0LTQvtCw0ZPQsNC80LUg0Lgg0YHQviDQv9GA0L7RgdGCINC80L7QtNC10Lsg0LrQvtGYINGY0LAg0L/RgNC10LTQstC40LTRg9Cy0LAg0L/RgNC+0L/QvtGA0YbQuNGY0LDRgtCwLiDQn9C+0LLRgtC+0YDQvdC+INC90LUg0LzQvtC20LXQvNC1INC00LAg0ZjQsCDQvtGC0YTRgNC70LjQvNC1INGF0LjQv9C+0YLQtdC30LDRgtCwINC00LXQutCwIHNsb3BlLdC+0YIg0LUg0L3Rg9C70LAsINGCLtC1Liwg0LTQtdC60LAg0L3QuNC3INCz0L7QtNC40L3QuNGC0LUg0L3QtdC80LAg0L/RgNC+0LzQtdC90LAg0L3QsCDQv9GA0L7Qv9C+0YDRhtC40ZjQsNGC0LAuINCU0L7Qv9C+0LvQvdC40YLQtdC70L3Qviwg0LggUjIg0LUg0LTQvtGB0YLQsCDQvdC40YHQutC+Lg0KDQpgYGB7cn0NCnN1bW1hcnkobG0ocHJvcG9ydGlvbiB+IHRvdGFsX3llYXJfeWVhciwgZGF0YT10b3RhbF95ZWFyX2RmKSkNCmBgYA0KDQojIyMgKGIpDQoNCtCf0YDQstC+LCDQs9C4INC/0LvQvtGC0LjRgNCw0LzQtSDQv9GA0L7Qv9GA0L7RhtC40LjRgtC1INGB0LXQutC+0ZjQsCDQs9C+0LTQuNC90LAsINC30LAg0LTQsCDQstC40LTQuNC80LUg0LrQsNC60L4g0YHQtSDQtNCy0LjQttC4INC/0YDQvtC/0L7RgNGG0LjRmNCw0YLQsC4g0J7QtCDRgdCw0LzQsNGC0LAg0YHQu9C40LrQsCDRgdC1INC30LDQsdC10LvQtdC20YPQstCwINC00LXQutCwINC4INC00LAg0LjQvNCwINC90LXQutC+0ZjQsCDRgdC40YLQvdCwINC/0L7Qt9C40YLQuNCy0L3QsCDQv9GA0L7QvNC10L3QsCwg0YLQsNCwINC1INC/0YDQtdC80L3QvtCz0YMg0LzQsNC70LAuDQoNCmBgYHtyfQ0KdG90YWxfbWVuX2RmWyJwcm9wb3J0aW9uIl0gPSANCiAgdG90YWxfbWVuX2RmJHRvdGFsX3N1cnZpdmFsX21lbiAvICgNCiAgICB0b3RhbF9tZW5fZGYkdG90YWxfc3Vydml2YWxfbWVuICsgDQogICAgICB0b3RhbF9tZW5fZGYkdG90YWxfZGVhdGhfbWVuDQogICAgKQ0KDQp3aXRoKHRvdGFsX21lbl9kZiwgcGxvdCh0b3RhbF9tZW5feWVhciwgcHJvcG9ydGlvbikpDQpgYGANCg0K0JzQvtC00LXQu9C+0YIg0LrRgNC10LjRgNCw0L0g0LfQsCDQstC60YPQv9C90LjRgtC1INC/0L7QtNCw0YLQvtGG0Lgg0L/QviDQs9C+0LTQuNC90Lgg0LTQvtCx0YDQviDQs9C4INC/0YDQtdC00LLQuNC00YPQstCwINC/0L7QtNCw0YLQvtGG0LjRgtC1LCBTbG9wZS3QvtGCINC1INC00L7RgdGC0LAg0L3QuNC30L7QuiwgYSDQuCBwLdCy0YDQtdC00L3QvtGB0YLQsCDQtSDQvNC90L7Qs9GDINCz0L7Qu9C10LzQsCwg0L/QsCDQvdC1INGY0LAg0L7RgtGE0YDQu9Cw0LzQtSDRhdC40L/QvtGC0LXQt9Cw0YLQsCDQtNC10LrQsCBzbG9wZS3QvtGCIGUg0L3Rg9C70LAg0YIu0LUuINC00LXQutCwINC90LjQtyDQs9C+0LTQuNC90LjRgtC1INC1INC40YHRgtCwINC/0YDQvtC/0L7RgNGG0LjRmNCw0YLQsC4NCg0KYGBge3J9DQpzdW1tYXJ5KGdsbSgNCiAgdG90YWxfbWVuX3NkIH4gdG90YWxfbWVuX3llYXIsIA0KICBmYW1pbHk9Ymlub21pYWwobGluaz0ibG9naXQiKSwgDQogIGRhdGE9dG90YWxfbWVuX2RmDQopKQ0KYGBgDQoNCtCU0L4g0LjRgdGC0LjQvtGCINC30LDQutC70YPRh9C+0Log0LTQvtCw0ZPQsNC80LUg0Lgg0YHQviDQv9GA0L7RgdGCINC80L7QtNC10Lsg0LrQvtGYINGY0LAg0L/RgNC10LTQstC40LTRg9Cy0LAg0L/RgNC+0L/QvtGA0YbQuNGY0LDRgtCwLiDQn9C+0LLRgtC+0YDQvdC+INC90LUg0LzQvtC20LXQvNC1INC00LAg0ZjQsCDQvtGC0YTRgNC70LjQvNC1INGF0LjQv9C+0YLQtdC30LDRgtCwINC00LXQutCwIHNsb3BlLdC+0YIg0LUg0L3Rg9C70LAsINGCLtC1Liwg0LTQtdC60LAg0L3QuNC3INCz0L7QtNC40L3QuNGC0LUg0L3QtdC80LAg0L/RgNC+0LzQtdC90LAg0L3QsCDQv9GA0L7Qv9C+0YDRhtC40ZjQsNGC0LAuINCU0L7Qv9C+0LvQvdC40YLQtdC70L3Qviwg0LggUjIg0LUg0LTQvtGB0YLQsCDQvdC40YHQutC+Lg0KDQpgYGB7cn0NCnN1bW1hcnkobG0ocHJvcG9ydGlvbiB+IHRvdGFsX21lbl95ZWFyLCBkYXRhPXRvdGFsX21lbl9kZikpDQpgYGANCg0KIyMjIChjKQ0KDQrQn9GA0LLQviwg0LPQuCDQv9C70L7RgtC40YDQsNC80LUg0L/RgNC+0L/RgNC+0YbQuNC40YLQtSDRgdC10LrQvtGY0LAg0LPQvtC00LjQvdCwLCDQt9CwINC00LAg0LLQuNC00LjQvNC1INC60LDQutC+INGB0LUg0LTQstC40LbQuCDQv9GA0L7Qv9C+0YDRhtC40ZjQsNGC0LAuINCe0LQg0YHQsNC80LDRgtCwINGB0LvQuNC60LAg0YHQtSDQt9Cw0LHQtdC70LXQttGD0LLQsCDQtNC10LrQsCDQtSDQvNC+0LbQvdC+INC00LAg0LjQvNCwINC90LXQutCw0LrQstCwINC/0L7Qt9C40YLQuNCy0L3QsCDQv9GA0L7QvNC10L3QsCwg0L3QviDQtNC10LrQsCDQvdC1INC1INC80L3QvtCz0YMg0YHQuNC70L3QsC4NCg0KYGBge3J9DQp0b3RhbF93b21lbl9kZlsicHJvcG9ydGlvbiJdID0gDQogIHRvdGFsX3dvbWVuX2RmJHRvdGFsX3N1cnZpdmFsX3dvbWVuIC8gKA0KICAgIHRvdGFsX3dvbWVuX2RmJHRvdGFsX3N1cnZpdmFsX3dvbWVuICsgDQogICAgICB0b3RhbF93b21lbl9kZiR0b3RhbF9kZWF0aF93b21lbg0KICAgICkNCg0Kd2l0aCh0b3RhbF93b21lbl9kZiwgcGxvdCh0b3RhbF93b21lbl95ZWFyLCBwcm9wb3J0aW9uKSkNCmBgYA0KDQrQnNC+0LTQtdC70L7RgiDQutGA0LXQuNGA0LDQvSDQt9CwINCy0LrRg9C/0L3QuNGC0LUg0L/QvtC00LDRgtC+0YbQuCDQv9C+INCz0L7QtNC40L3QuCDQtNC+0LHRgNC+INCz0Lgg0L/RgNC10LTQstC40LTRg9Cy0LAg0L/QvtC00LDRgtC+0YbQuNGC0LUsIFNsb3BlLdC+0YIg0LUg0LTQvtGB0YLQsCDQvdC40LfQvtC6LCBhINC4IHAt0LLRgNC10LTQvdC+0YHRgtCwINC1INC80L3QvtCz0YMg0LPQvtC70LXQvNCwLCDQv9CwINC90LUg0ZjQsCDQvtGC0YTRgNC70LDQvNC1INGF0LjQv9C+0YLQtdC30LDRgtCwINC00LXQutCwIHNsb3BlLdC+0YIgZSDQvdGD0LvQsCDRgi7QtS4g0LTQtdC60LAg0L3QuNC3INCz0L7QtNC40L3QuNGC0LUg0LUg0LjRgdGC0LAg0L/RgNC+0L/QvtGA0YbQuNGY0LDRgtCwLiDQodC10L/QsNC6LCDQtNC+0LrQsNC30LjRgtC1INC/0YDQvtGC0LjQsiDRhdC40L/QvtGC0LXQt9Cw0YLQsCDRgdC1INC/0L7RgdC40LvQvdC4INC+0LLQtNC1Lg0KDQpgYGB7cn0NCnN1bW1hcnkoZ2xtKA0KICB0b3RhbF93b21lbl9zZCB+IHRvdGFsX3dvbWVuX3llYXIsIA0KICBmYW1pbHk9Ymlub21pYWwobGluaz0ibG9naXQiKSwgDQogIGRhdGE9dG90YWxfd29tZW5fZGYNCikpDQpgYGANCg0K0JTQviDQuNGB0YLQuNC+0YIg0LfQsNC60LvRg9GH0L7QuiDQtNC+0LDRk9Cw0LzQtSDQuCDRgdC+INC/0YDQvtGB0YIg0LzQvtC00LXQuyDQutC+0Zgg0ZjQsCDQv9GA0LXQtNCy0LjQtNGD0LLQsCDQv9GA0L7Qv9C+0YDRhtC40ZjQsNGC0LAuINCf0L7QstGC0L7RgNC90L4g0L3QtSDQvNC+0LbQtdC80LUg0LTQsCDRmNCwINC+0YLRhNGA0LvQuNC80LUg0YXQuNC/0L7RgtC10LfQsNGC0LAg0LTQtdC60LAgc2xvcGUt0L7RgiDQtSDQvdGD0LvQsCwg0YIu0LUuLCDQtNC10LrQsCDQvdC40Lcg0LPQvtC00LjQvdC40YLQtSDQvdC10LzQsCDQv9GA0L7QvNC10L3QsCDQvdCwINC/0YDQvtC/0L7RgNGG0LjRmNCw0YLQsC4g0JTQvtC/0L7Qu9C90LjRgtC10LvQvdC+LCDQuCBSMiDQtSDQtNC+0YHRgtCwINC90LjRgdC60L4uINCh0LXQv9Cw0LosINC00L7QutCw0LfQuNGC0LUg0L/RgNC+0YLQuNCyINGF0LjQv9C+0YLQtdC30LDRgtCwINGB0LUg0L/QvtGB0LjQu9C90Lgg0L7QstC00LUuDQoNCmBgYHtyfQ0Kc3VtbWFyeShsbShwcm9wb3J0aW9uIH4gdG90YWxfd29tZW5feWVhciwgZGF0YT10b3RhbF93b21lbl9kZikpDQpgYGANCg0KIyMjIChkKQ0KDQrQntC0INCz0LXQvdC10YDQsNC70L3QuNC+0YIg0LvQuNC90LXQsNGA0LXQvSDQvNC+0LTQtdC7INC30LDQsdC10LvQtdC20YPQstCw0LzQtSDQtNC10LrQsCDQutC+0LXRhNC40YbQuNC10L3RgtC+0YIg0L/RgNC10LQg0YTQsNC60YLQvtGA0L7RgiDRhNCw0LrRg9C70YLQtdGCINC1INC/0L7QstC40YHQvtC6INC+0LQgMC4g0JfQsNC60LvRg9GH0L7QutC+0YIg0LUg0LTQtdC60LAg0L3QsNGY0LLQtdGA0L7RmNCw0YLQvdC+INC40LzQsCDRgNCw0LfQu9C40LrQsCDQv9C+0LzQtdGT0YMg0YTQsNC60YPQu9GC0LXRgtC40YLQtSwg0YIu0LUuLCDQtNC10LrQsCDQv9C+0LPQvtC70LXQvNCwINC1INGB0LzRgNGC0L3QvtGB0YLQsCDQutCw0Zgg0YLQuNC1INC+0LQgU2NpZW5jZXMuDQoNCmBgYHtyfQ0Kc3VtbWFyeShnbG0oDQogIGFzX3Byb3BvcnRpb24gfiBhc195ZWFyICsgYXNfZmFjdWx0eSwgDQogIGZhbWlseT1iaW5vbWlhbChsaW5rPSJsb2dpdCIpLCANCiAgZGF0YT1hc19kZg0KKSkNCmBgYA0KDQo=