Практическая работа №3

Проверка гипотез однородности

Глушков Егор Александрович, гр. 20.М04-мм


Данные (addicts.xls). Варианты метрической переменной (variable), категориальной с двумя градациями (factor.2), категориальной с четырьмя градациями (factor.4) представлены в Таблице 2.

Анализ независимых выборок

Переменные (вариант 12):

Исследуем переменные на наличие пропусков. Выделим нужные переменные

data <- na.omit(addicts[ , c("bdi", "se", "educat")])
summary(data)
      bdi              se             educat     
 Min.   : 2.00   Min.   :0.0000   Min.   :1.000  
 1st Qu.:15.00   1st Qu.:0.0000   1st Qu.:2.000  
 Median :20.00   Median :0.0000   Median :2.000  
 Mean   :21.02   Mean   :0.2355   Mean   :2.087  
 3rd Qu.:27.00   3rd Qu.:0.0000   3rd Qu.:2.000  
 Max.   :48.00   Max.   :1.0000   Max.   :4.000  
summary(as.factor(data$se))
  0   1 
211  65 
summary(as.factor(data$educat))
  1   2   3   4 
 21 219  27   9 
library('lawstat')

DescriptiveStat <- function(X, group)
{
  mm. <- tapply(X, group, function(x) mean(x, na.rm=TRUE)); mm.
  sd. <- tapply(X, group, function(x) sd(x, na.rm=TRUE)); sd.
  nn. <- tapply(X, group, function(x) length(na.omit(x))); nn.
  err. <- sd./sqrt(nn.); err.
  list(mm=mm., sd=sd., nn=nn., err=err.)
}

Fig <- function(x)
{
  hist(x, freq=FALSE)
  f1 <- function(x) dnorm(x, mean(x, na.rm=TRUE), sd(x, na.rm=TRUE))
  curve(f1, min(x), max(x), col=2, add=TRUE)
  title(sub=paste("p.Shapiro", format(shapiro.test(x)$p.value, 4, 2), sep="="))
}

Sentence <- function(mm, err, nn, p.T)
{
  A1 <- paste(paste(format(mm, digits=3, nsmall=2), format(err, digits=2, nsmall=2), sep="±"), nn, sep="/")
  A1. <- paste("The means of two groups are", paste(A1, collapse=", "))
  A2. <- ifelse(p.T>0.05, "difference is insignificant", "difference is significant" )
  A3. <- paste("p", format(p.T,3,3),sep="=")
  paste(c(A1., A2., A3.), collapse=", ")
}

Фактор с двумя градациями

Переменная se – группирующая, имеет 2 градации, в роли метрической переменной – bdi

table(data$se) # 2 градации, группирующая переменная

  0   1 
211  65 
df <- data.frame(group=data$se, X=data$bdi)
p.Sh <- with(df, tapply(X, group, function(x)shapiro.test(x)$p.value)); p.Sh
        0         1 
0.5125098 0.4573447 

Согласие с нормальным распределением для обеих групп (градаций) не отвергается в соответствии с критерием Шапиро-Уилка с \(p.value\) 0.51 и 0.457 для обеих групп.

boxplot(X~group, df)

p.F <- var.test(X~group, df)$p.value; p.F
[1] 0.7522756

В соответствии с критерием Фишера гипотеза о равенстве дисперсий в двух групп не отвергается (\(p.value = 0.75\)), значит, можно использовать критерий Стьюдента (с параметром о равенстве дисперсий).

p.T <- t.test(X~group, df, var.equal=TRUE)$p.value; p.T
[1] 0.2282577

По критерию Стьюдента гипотеза о равенстве средних также не отвергается (\(p.value = 0.228\)).

op <- par(mfrow=c(1,2))
Fig(df$X[df$group==0])
Fig(df$X[df$group==1])

par(op)
df.2 <- df

L <- DescriptiveStat(df$X, df$group)
Sentence(L$mm, L$err, L$nn, p.T)
[1] "The means of two groups are 21.37±0.60/211, 19.88±1.11/65, difference is insignificant, p=0.228"

Фактор с четырьмя градациями

Переменная educat – группирующая, имеет 4 градации, в роли метрической переменной – bdi

df <- data.frame(group=as.factor(data$educat), X=as.numeric(data$bdi))
table(df$group)

  1   2   3   4 
 21 219  27   9 
name.gr <- "educat"
name.x <- "bdi"

bartlett.test(X~group, df)

    Bartlett test of homogeneity of variances

data:  X by group
Bartlett's K-squared = 3.7037, df = 3, p-value = 0.2953

Критерий Барлетта показывает, что гипотеза о равенстве дисперсий всех выборок не отвергается с \(p.value = 0.2953\).

with(df,levene.test(X, group))

    Modified robust Brown-Forsythe Levene-type test based on the absolute deviations from
    the median

data:  X
Test Statistic = 1.4306, p-value = 0.2341

Аналогично критерий Левена показывает, что гипотеза о равенстве дисперсий всех выборок не отвергается с p_value = 0.2341.


Однофакторный дисперсионный анализ

ao <- aov(X~group, df)
summary(ao)
             Df Sum Sq Mean Sq F value Pr(>F)
group         3    457  152.31   2.012  0.113
Residuals   272  20593   75.71               
boxplot(X~group, xlab=name.gr, ylab=name.x, data=df)

L <- DescriptiveStat(df$X, df$group); L
$mm
       1        2        3        4 
22.00000 21.37900 17.14815 21.66667 

$sd
        1         2         3         4 
 9.137833  8.497583  8.401940 12.971122 

$nn
  1   2   3   4 
 21 219  27   9 

$err
        1         2         3         4 
1.9940387 0.5742134 1.6169541 4.3237073 

Заметим, что средние в каждой из групп примерно равны, критерии выше лишь не опровергают это. При этом различия могут быть объяснены случайностью или малым числом наблюдений в некоторых группах (о чем свидетельствуют параметры nn, sd, err, например, для группы “4”).


Множественные сравнения

library(agricolae)
library(multcomp)

ao <- aov(X~group, df)
out <- LSD.test(ao,"group", p.adj="none", group=FALSE); out
$statistics
   MSerror  Df     Mean       CV
  75.70938 272 21.02174 41.39103

$parameters
        test p.ajusted name.t ntr alpha
  Fisher-LSD      none  group   4  0.05

$means
         X       std   r      LCL      UCL Min Max  Q25 Q50  Q75
1 22.00000  9.137833  21 18.26191 25.73809   4  43 18.0  21 25.0
2 21.37900  8.497583 219 20.22145 22.53654   2  48 16.0  21 27.0
3 17.14815  8.401940  27 13.85146 20.44484   4  32  9.5  15 23.5
4 21.66667 12.971122   9 15.95664 27.37670   2  39 13.0  20 31.0

$comparison
      difference pvalue signif.         LCL      UCL
1 - 2  0.6210046 0.7550          -3.2922091 4.534218
1 - 3  4.8518519 0.0564       .  -0.1322709 9.835975
1 - 4  0.3333333 0.9235          -6.4914578 7.158124
2 - 3  4.2308473 0.0178       *   0.7368444 7.724850
2 - 4 -0.2876712 0.9226          -6.1138493 5.538507
3 - 4 -4.5185185 0.1784         -11.1118932 2.074856

$groups
NULL

attr(,"class")
[1] "group"

Заметим, что p.value позволяет говорить о значимых различиях между группами 2 и 3, с осторожностью – между 1 и 3. Заметим, что с очень высокой уверенностью можно говорить, что различия между соответственно 1 и 2, 1 и 4, 2 и 4 незначимы. Таким образом, люди с неполным высшим образованием (группа “3”) отличаются от группы людей с образованием 8 классов (“1”) или полной средней школы (“2”); группа “4” (люди с высшим образованием) схожа с группами “1” и “2” (неполное и полное среднее образование) и в меньшей степени с группой “3” (неполное высшее) в контексте оценки депресии (bdi).

Для подтверждения этого составим “контрасты” для общей линейной гипотезы и множественных сравнений (glht).

contr <- rbind(
  "1 - 234" = c(-1, 1/3, 1/3, 1/3),
  "2 - 134" = c(1/3, -1, 1/3, 1/3),
  "3 - 124" = c(1/3, 1/3, -1, 1/3),
  "4 - 123" = c(1/3, 1/3, 1/3, -1)
)

GL <- glht(ao, linfct = mcp(group=contr))
summary(GL)

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: User-defined Contrasts


Fit: aov(formula = X ~ group, data = df)

Linear Hypotheses:
             Estimate Std. Error t value Pr(>|t|)  
1 - 234 == 0   -1.935      2.211  -0.875   0.7799  
2 - 134 == 0   -1.107      1.412  -0.785   0.8308  
3 - 124 == 0    4.534      2.044   2.218   0.0932 .
4 - 123 == 0   -1.491      3.027  -0.493   0.9504  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- single-step method)

Заметно, как среди прочих сравнений “отличаются” группы “3” и “124”, однако о различии можно говорить лишь с уровнем значимости в 0.1.

Используем разные поправки для множественных сравнений [которые в итоге дадут схожие между собой результаты, подтверждающие выводы выше].

out1 <- LSD.test(ao, "group", p.adj = "bonferroni", group=FALSE)
out2 <- LSD.test(ao, "group", p.adj = "hochberg", group=FALSE)
out3 <- LSD.test(ao, "group", p.adj = "holm", group=FALSE)
out4 <- LSD.test(ao, "group", p.adj = "BH", group=FALSE)
out5 <- LSD.test(ao, "group", p.adj = "fdr", group=FALSE)
out1
$statistics
   MSerror  Df     Mean       CV
  75.70938 272 21.02174 41.39103

$parameters
        test  p.ajusted name.t ntr alpha
  Fisher-LSD bonferroni  group   4  0.05

$means
         X       std   r      LCL      UCL Min Max  Q25 Q50  Q75
1 22.00000  9.137833  21 18.26191 25.73809   4  43 18.0  21 25.0
2 21.37900  8.497583 219 20.22145 22.53654   2  48 16.0  21 27.0
3 17.14815  8.401940  27 13.85146 20.44484   4  32  9.5  15 23.5
4 21.66667 12.971122   9 15.95664 27.37670   2  39 13.0  20 31.0

$comparison
      difference pvalue signif.         LCL       UCL
1 - 2  0.6210046 1.0000          -4.6616672  5.903676
1 - 3  4.8518519 0.3381          -1.8765016 11.580205
1 - 4  0.3333333 1.0000          -8.8798441  9.546511
2 - 3  4.2308473 0.1069          -0.4859078  8.947602
2 - 4 -0.2876712 1.0000          -8.1527635  7.577421
3 - 4 -4.5185185 1.0000         -13.4192935  4.382257

$groups
NULL

attr(,"class")
[1] "group"
pairwise.t.test(data$bdi, data$educat, p.adj = "fdr")

    Pairwise comparisons using t tests with pooled SD 

data:  data$bdi and data$educat 

  1    2    3   
2 0.92 -    -   
3 0.17 0.11 -   
4 0.92 0.92 0.36

P value adjustment method: fdr 

Tukey используется для групп равного объема, поэтому применение здесь некорректно, но ради интереса используем этот метод множественных сравнений средних.

TukeyHSD(ao, "group", ordered=TRUE)
  Tukey multiple comparisons of means
    95% family-wise confidence level
    factor levels have been ordered

Fit: aov(formula = X ~ group, data = df)

$group
         diff        lwr       upr     p adj
2-3 4.2308473 -0.3568649  8.818560 0.0825987
4-3 4.5185185 -4.1387456 13.175783 0.5324422
1-3 4.8518519 -1.6924247 11.396128 0.2235125
4-2 0.2876712 -7.3622447  7.937587 0.9996704
1-2 0.6210046 -4.5171418  5.759151 0.9894140
1-4 0.3333333 -8.6277864  9.294453 0.9996809

Непараметрические критерии однородности для независимых выборок

Критерий Манна-Уитни-Вилкоксона (exact=FALSE при объемах выборки больше 30-50)

wilcox.test(X~group, df.2, exact=FALSE, correct=FALSE)

    Wilcoxon rank sum test

data:  X by group
W = 7572, p-value = 0.2038
alternative hypothesis: true location shift is not equal to 0

Критерий Манна-Уитни с поправкой на непрерывность

wilcox.test(X~group, df.2, exact=FALSE, correct=TRUE)

    Wilcoxon rank sum test with continuity correction

data:  X by group
W = 7572, p-value = 0.2041
alternative hypothesis: true location shift is not equal to 0

На основании данного критерия можно сделать вывод, что для данных независимых выборок гипотеза об однородности не отвергается при \(p.value = 0.204\).

Критерий Краскала-Уоллеса для >2 независимых выборок

kruskal.test(X~group, df)

    Kruskal-Wallis rank sum test

data:  X by group
Kruskal-Wallis chi-squared = 5.3869, df = 3, p-value = 0.1456

Данный критерий не отвергает гипотезу об однородности независимых выборок с \(p.value = 0.1456\).

Критерий Краскала с множественными сравнениями и поправкой Бонферрони [результаты позволяют сделать выводы, аналогичные параметрическим методам множественных сравнений].

library(agricolae)
comparison <- with(df, kruskal(X, group, p.adj="bonferroni", group=FALSE, main="HR")); comparison
$statistics
     Chisq Df   p.chisq
  5.386861  3 0.1455644

$parameters
            test  p.ajusted name.t ntr alpha
  Kruskal-Wallis bonferroni  group   4  0.05

$means
         X     rank       std   r Min Max  Q25 Q50  Q75
1 22.00000 144.9286  9.137833  21   4  43 18.0  21 25.0
2 21.37900 141.9658  8.497583 219   2  48 16.0  21 27.0
3 17.14815 104.7593  8.401940  27   4  32  9.5  15 23.5
4 21.66667 140.3889 12.971122   9   2  39 13.0  20 31.0

$comparison
      Difference pvalue Signif.         LCL       UCL
1 - 2   2.962818 1.0000          -45.247856  51.17349
1 - 3  40.169312 0.4994          -21.234930 101.57355
1 - 4   4.539683 1.0000          -79.541538  88.62090
2 - 3  37.206494 0.1342           -5.839515  80.25250
2 - 4   1.576865 1.0000          -70.201473  73.35520
3 - 4 -35.629630 1.0000         -116.859806  45.60055

$groups
NULL

attr(,"class")
[1] "group"

Медианный тест

Median.test(df$X, df$group, correct=TRUE, group=TRUE, console=FALSE)$statistics

Анализ зависимых выборок

Данные – dataNF, переменные “BDI.1”, “BDI.2”, “BDI.3” – индекс депрессии в разные моменты времени.

data_dep <- na.omit(dataNF[ , c("BDI.1", "BDI.2", "BDI.3")])

Критерий Стьюдента для зависимых выборок

(paired=TRUE)

t.test(data_dep$BDI.1, data_dep$BDI.2, paired = TRUE)

    Paired t-test

data:  data_dep$BDI.1 and data_dep$BDI.2
t = 11.971, df = 180, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 5.864646 8.179553
sample estimates:
mean of the differences 
               7.022099 
c(t.test(data_dep$BDI.1, data_dep$BDI.2, paired = TRUE)$p.value, t.test(data_dep$BDI.2, data_dep$BDI.3, paired = TRUE)$p.value)
[1] 1.137555e-24 4.269685e-11

По результатам критерия Стьюдента для зависимых выборок гипотеза об однородности изменений во времени отвергается с уровнями значисмости 1.137555e-24 и 4.269685e-11 при сравнении моментов времени 1 и 2; 2 и 3 соответственно (т.е. истинная разность средних не равна 0).


Критерий Вилкоксона для зависимых выборок

c(wilcox.test(data_dep$BDI.1, data_dep$BDI.2, paired=TRUE, exact = FALSE)$p.value, wilcox.test(data_dep$BDI.2, data_dep$BDI.3, paired=TRUE, exact = FALSE)$p.value)
[1] 4.195681e-21 1.693720e-11

Аналогично критерию Стьюдента, критерий Вилкоксона отвергает гипотезу об однородности изменений во времени с \(p.value = 4.195681e-21; 1.693720e-11\) при сравненении моментов времени 1 и 2, 2 и 3.


Критерий \(\chi^2\)-Фридмана для нескольких выборок

friedman.test(as.matrix(data_dep))

    Friedman rank sum test

data:  as.matrix(data_dep)
Friedman chi-squared = 173.4, df = 2, p-value < 2.2e-16

Непараметрический критерий Фридмана также отвергает гипотезу об однородности “BDI.1”, “BDI.2”, “BDI.3”


ANOVA Repeated Measures

Используем модель двухфакторного дисперсионного анализа с повторениями – ANOVA Repeated Measures. В качестве группирующих переменных – “PRCOD.1” и “SEX.1”

dat.AR <- na.omit(dataNF[ , c("PRCOD.1", "SEX.1", "BDI.1", "BDI.3", "BDI.4", "BDI.6")])

k <- 2
m <- ncol(dat.AR)-k; m
[1] 4
dat.AR.T <- data.frame(
    stack(dat.AR[,-seq(k)]),
    sub=as.factor(rep(seq(nrow(dat.AR)), m)),
    gr1=as.factor(rep(dat.AR$PRCOD.1, m)),
    gr2=as.factor(rep(dat.AR$SEX.1, m))
  )

# anova_rm <- aov(values ~ (gr1 + gr2) * ind + Error(sub), dat.AR.T)
anova_rm <- aov(values ~ gr1*gr2 + gr1 + gr2, dat.AR.T)
sarm <- summary(anova_rm); sarm
             Df Sum Sq Mean Sq F value Pr(>F)  
gr1           3    742  247.49   3.545 0.0148 *
gr2           1    108  108.17   1.549 0.2140  
gr1:gr2       3     22    7.33   0.105 0.9571  
Residuals   372  25972   69.82                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Исследуем значимость факторов и эффектов взаимодействия

Df <- sarm[[1]][, 1]
MS <- sarm[[1]][, 3]

p.gr1 <- 1 - pf(MS[1] / MS[4], Df[1], Df[4])
p.gr2 <- 1 - pf(MS[2] / MS[4], Df[2], Df[4])
p.gr12 <- 1 - pf(MS[3] / MS[4], Df[3], Df[4])
c(p.gr1, p.gr2, p.gr12)
[1] 0.01476623 0.21402599 0.95712580
c(sarm[[1]][, 5][1:3])
[1] 0.01476623 0.21402599 0.95712580

\(p > 0.05\), то соответствующий эффект отсутствует.

model.tables(anova_rm, 'mean')
Tables of means
Grand mean
         
11.83421 

 gr1 
    NLTX+Framex NLTX+Placebo Placebo+Framex Placebo+Placebo
          13.89        10.57          11.25            11.4
rep      116.00       136.00          68.00            60.0

 gr2 
    female   male
     12.67  11.52
rep 104.00 276.00

 gr1:gr2 
                 gr2
gr1               female male  
  NLTX+Framex      14.28  13.71
  rep              36.00  80.00
  NLTX+Placebo     12.17  10.22
  rep              24.00 112.00
  Placebo+Framex   12.25  11.04
  rep              12.00  56.00
  Placebo+Placebo  12.09  10.61
  rep              32.00  28.00
Names <- names(table(dat.AR[,1]))
K <- length(Names)

interaction.plot(x.factor=dat.AR.T$ind,
  trace.factor=dat.AR.T$gr1,
  response=dat.AR.T$values,
  fun = mean,
  type = "b", legend = FALSE,
  trace.label ="group",
  xlab = "",
  ylab = 'PRCOD.1',
  lty = seq(K), col = seq(K), pch = 20, lwd = 2
)
legend('topright', Names, lty=seq(K), col=seq(K), cex=0.7, pch=20)

Names <- names(table(dat.AR[,2]))

interaction.plot(x.factor=dat.AR.T$ind,
  trace.factor=dat.AR.T$gr2,
  response=dat.AR.T$values,
  fun = mean,
  type = "b", legend = FALSE,
  trace.label ="group",
  xlab = "",
  ylab = 'SEX.1',
  lty = seq(K), col = seq(K), pch = 20, lwd = 2
)
legend('topright', Names, lty=seq(K), col=seq(K), cex=0.7, pch=20)

LS0tDQp0aXRsZTogIiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyMg0J/RgNCw0LrRgtC40YfQtdGB0LrQsNGPINGA0LDQsdC+0YLQsCDihJYzDQojIyMg0J/RgNC+0LLQtdGA0LrQsCDQs9C40L/QvtGC0LXQtyDQvtC00L3QvtGA0L7QtNC90L7RgdGC0LgNCg0KPiDQk9C70YPRiNC60L7QsiDQldCz0L7RgCDQkNC70LXQutGB0LDQvdC00YDQvtCy0LjRhywg0LPRgC4gMjAu0JwwNC3QvNC8DQoNCi0tLQ0KDQrQlNCw0L3QvdGL0LUgKCphZGRpY3RzLnhscyopLiDQktCw0YDQuNCw0L3RgtGLINC80LXRgtGA0LjRh9C10YHQutC+0Lkg0L/QtdGA0LXQvNC10L3QvdC+0LkgKCp2YXJpYWJsZSopLCDQutCw0YLQtdCz0L7RgNC40LDQu9GM0L3QvtC5INGBINC00LLRg9C80Y8g0LPRgNCw0LTQsNGG0LjRj9C80LggKCpmYWN0b3IuMiopLCDQutCw0YLQtdCz0L7RgNC40LDQu9GM0L3QvtC5INGBINGH0LXRgtGL0YDRjNC80Y8g0LPRgNCw0LTQsNGG0LjRj9C80LggKCpmYWN0b3IuNCopINC/0YDQtdC00YHRgtCw0LLQu9C10L3RiyDQsiDQotCw0LHQu9C40YbQtSAyLg0KDQoqINCf0YDQvtCy0LXRgNC40YLRjCDQs9C40L/QvtGC0LXQt9GDINC+INGA0LDQstC10L3RgdGC0LLQtSDQtNC40YHQv9C10YDRgdC40Lkg0LTQstGD0YUg0LLRi9Cx0L7RgNC+0Log0Lgg0LIg0YHQvtC+0YLQstC10YLRgdGC0LLQuNC4INGBINCy0YvQstC+0LTQvtC8INC/0YDQuNC80LXQvdC40YLRjCDQutGA0LjRgtC10YDQuNC5INCh0YLRjNGO0LTQtdC90YLQsCDQtNC70Y8g0L/RgNC+0LLQtdGA0LrQuCDRgNCw0LLQtdC90YHRgtCy0LAg0YHRgNC10LTQvdC40YUuINCY0YHQv9C+0LvRjNC30L7QstCw0YLRjCDQstCw0YDQuNCw0L3RgiDQs9GA0YPQv9C/0LjRgNGD0Y7RidC10Lkg0L/QtdGA0LXQvNC10L3QvdC+0LkgKmZhY3Rvci4yKiAo0KLQsNCx0LsuIDIpLg0KDQoqINCf0YDQuNC80LXQvdC40YLRjCDQvtC00L3QvtGE0LDQutGC0L7RgNC90YvQuSDQtNC40YHQv9C10YDRgdC40L7QvdC90YvQuSDQsNC90LDQu9C40Lcg0LIg0YHQu9GD0YfQsNC1INGE0LDQutGC0L7RgNCwINGBINGH0LXRgtGL0YDRjNC80Y8g0LPRgNCw0LTQsNGG0LjRj9C80Lgg0Lgg0LzQvdC+0LbQtdGB0YLQstC10L3QvdGL0LUg0YHRgNCw0LLQvdC10L3QuNGPINGBINGA0LDQt9C90YvQvNC4INC/0L7Qv9GA0LDQstC60LDQvNC4LiDQn9GA0L7QstC10YDQuNGC0Ywg0LPQuNC/0L7RgtC10LfRgyDQviDRgNCw0LLQtdC90YHRgtCy0LUg0LTQuNGB0L/QtdGA0YHQuNC5Lg0KDQoqINCf0L7QstGC0L7RgNC40YLRjCDQvtCx0YDQsNCx0L7RgtC60Lgg0YEg0L/RgNC40LzQtdC90LXQvdC40LXQvCDQvdC10L/QsNGA0LDQvNC10YLRgNC40YfQtdGB0LrQuNGFINCw0L3QsNC70L7Qs9C+0LIuDQoNCiog0JTQu9GPINC/0LXRgNCy0YvRhSDQtNCy0YPRhSDQt9Cw0LLQuNGB0LjQvNGL0YUg0L/QtdGA0LXQvNC10L3QvdGL0YUgKNCi0LDQsdC7LiAzLCDQtNCw0L3QvdGL0LUgKmRhdGFORi54bHMqKSDQv9GA0L7QstC10YDQuNGC0Ywg0L7QtNC90L7RgNC+0LTQvdC+0YHRgtGMINC40LfQvNC10L3QtdC90LjQuSDQstC+INCy0YDQtdC80LXQvdC4INC/0L4g0LrRgNC40YLQtdGA0LjRjiDQodGC0YzRjtC00LXQvdGC0LAg0LTQu9GPINC30LDQstC40YHQuNC80YvRhSDQstGL0LHQvtGA0L7QuiDQuCDQv9C+INGA0LDQvdCz0L7QstC+0LzRgyDQutGA0LjRgtC10YDQuNGOINCS0LjQu9C60L7QutGB0L7QvdCwLg0KDQoqINCU0LvRjyDQt9Cw0LLQuNGB0LjQvNGL0YUg0L/QtdGA0LXQvNC10L3QvdGL0YUgKNCi0LDQsdC7LiAzLCDQtNCw0L3QvdGL0LUgKmRhdGFORi54bHMqKSDRgSDRhNCw0LrRgtC+0YDQsNC80LggIlBSQ09ELjEiINC4ICJTRVguMSIg0LLRi9C/0L7Qu9C90LjRgtGMIEFOT1ZBIFJlcGVhdGVkIE1lYXN1cmVzLiDQn9GA0L7QstC10YDQuNGC0Ywg0LfQvdCw0YfQuNC80L7RgdGC0Ywg0YTQsNC60YLQvtGA0L7QsiAiUFJDT0QuMSIg0LggIlNFWC4xIiDQstGA0LXQvNC10L3QuCDQuCDRjdGE0YTQtdC60YLQvtCyINCy0LfQsNC40LzQvtC00LXQudGB0YLQstC40Y8uDQoNCiMjIyDQkNC90LDQu9C40Lcg0L3QtdC30LDQstC40YHQuNC80YvRhSDQstGL0LHQvtGA0L7Qug0KDQrQn9C10YDQtdC80LXQvdC90YvQtSAo0LLQsNGA0LjQsNC90YIgMTIpOiAgDQoNCisgKmJkaSogLS0gKnZhcmlhYmxlKiAtLSDQvtGG0LXQvdC60LAg0LTQtdC/0YDQtdGB0YHQuNC4DQorICpzZSogLS0gKmZhY3Rvci4yKiAtLSDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjQtSDRg9GB0L/QvtC60L7QuNGC0LXQu9GM0L3Ri9GFDQorICplZHVjYXQqIC0tICpmYWN0b3IuNCogLS0g0L7QsdGA0LDQt9C+0LLQsNC90LjQtQ0KDQoNCtCY0YHRgdC70LXQtNGD0LXQvCDQv9C10YDQtdC80LXQvdC90YvQtSDQvdCwINC90LDQu9C40YfQuNC1INC/0YDQvtC/0YPRgdC60L7Qsi4g0JLRi9C00LXQu9C40Lwg0L3Rg9C20L3Ri9C1INC/0LXRgNC10LzQtdC90L3Ri9C1IA0KYGBge3J9DQpkYXRhIDwtIG5hLm9taXQoYWRkaWN0c1sgLCBjKCJiZGkiLCAic2UiLCAiZWR1Y2F0IildKQ0Kc3VtbWFyeShkYXRhKQ0Kc3VtbWFyeShhcy5mYWN0b3IoZGF0YSRzZSkpDQpzdW1tYXJ5KGFzLmZhY3RvcihkYXRhJGVkdWNhdCkpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KCdsYXdzdGF0JykNCg0KRGVzY3JpcHRpdmVTdGF0IDwtIGZ1bmN0aW9uKFgsIGdyb3VwKQ0Kew0KICBtbS4gPC0gdGFwcGx5KFgsIGdyb3VwLCBmdW5jdGlvbih4KSBtZWFuKHgsIG5hLnJtPVRSVUUpKTsgbW0uDQogIHNkLiA8LSB0YXBwbHkoWCwgZ3JvdXAsIGZ1bmN0aW9uKHgpIHNkKHgsIG5hLnJtPVRSVUUpKTsgc2QuDQogIG5uLiA8LSB0YXBwbHkoWCwgZ3JvdXAsIGZ1bmN0aW9uKHgpIGxlbmd0aChuYS5vbWl0KHgpKSk7IG5uLg0KICBlcnIuIDwtIHNkLi9zcXJ0KG5uLik7IGVyci4NCiAgbGlzdChtbT1tbS4sIHNkPXNkLiwgbm49bm4uLCBlcnI9ZXJyLikNCn0NCg0KRmlnIDwtIGZ1bmN0aW9uKHgpDQp7DQogIGhpc3QoeCwgZnJlcT1GQUxTRSkNCiAgZjEgPC0gZnVuY3Rpb24oeCkgZG5vcm0oeCwgbWVhbih4LCBuYS5ybT1UUlVFKSwgc2QoeCwgbmEucm09VFJVRSkpDQogIGN1cnZlKGYxLCBtaW4oeCksIG1heCh4KSwgY29sPTIsIGFkZD1UUlVFKQ0KICB0aXRsZShzdWI9cGFzdGUoInAuU2hhcGlybyIsIGZvcm1hdChzaGFwaXJvLnRlc3QoeCkkcC52YWx1ZSwgNCwgMiksIHNlcD0iPSIpKQ0KfQ0KDQpTZW50ZW5jZSA8LSBmdW5jdGlvbihtbSwgZXJyLCBubiwgcC5UKQ0Kew0KICBBMSA8LSBwYXN0ZShwYXN0ZShmb3JtYXQobW0sIGRpZ2l0cz0zLCBuc21hbGw9MiksIGZvcm1hdChlcnIsIGRpZ2l0cz0yLCBuc21hbGw9MiksIHNlcD0iwrEiKSwgbm4sIHNlcD0iLyIpDQogIEExLiA8LSBwYXN0ZSgiVGhlIG1lYW5zIG9mIHR3byBncm91cHMgYXJlIiwgcGFzdGUoQTEsIGNvbGxhcHNlPSIsICIpKQ0KICBBMi4gPC0gaWZlbHNlKHAuVD4wLjA1LCAiZGlmZmVyZW5jZSBpcyBpbnNpZ25pZmljYW50IiwgImRpZmZlcmVuY2UgaXMgc2lnbmlmaWNhbnQiICkNCiAgQTMuIDwtIHBhc3RlKCJwIiwgZm9ybWF0KHAuVCwzLDMpLHNlcD0iPSIpDQogIHBhc3RlKGMoQTEuLCBBMi4sIEEzLiksIGNvbGxhcHNlPSIsICIpDQp9DQpgYGANCg0KPiDQpNCw0LrRgtC+0YAg0YEg0LTQstGD0LzRjyDQs9GA0LDQtNCw0YbQuNGP0LzQuA0KDQrQn9C10YDQtdC80LXQvdC90LDRjyAqc2UqIC0tINCz0YDRg9C/0L/QuNGA0YPRjtGJ0LDRjywg0LjQvNC10LXRgiAyINCz0YDQsNC00LDRhtC40LgsINCyINGA0L7Qu9C4INC80LXRgtGA0LjRh9C10YHQutC+0Lkg0L/QtdGA0LXQvNC10L3QvdC+0LkgLS0gKmJkaSoNCmBgYHtyfQ0KdGFibGUoZGF0YSRzZSkgIyAyINCz0YDQsNC00LDRhtC40LgsINCz0YDRg9C/0L/QuNGA0YPRjtGJ0LDRjyDQv9C10YDQtdC80LXQvdC90LDRjw0KZGYgPC0gZGF0YS5mcmFtZShncm91cD1kYXRhJHNlLCBYPWRhdGEkYmRpKQ0KYGBgDQoNCmBgYHtyfQ0KcC5TaCA8LSB3aXRoKGRmLCB0YXBwbHkoWCwgZ3JvdXAsIGZ1bmN0aW9uKHgpc2hhcGlyby50ZXN0KHgpJHAudmFsdWUpKTsgcC5TaA0KYGBgDQrQodC+0LPQu9Cw0YHQuNC1INGBINC90L7RgNC80LDQu9GM0L3Ri9C8INGA0LDRgdC/0YDQtdC00LXQu9C10L3QuNC10Lwg0LTQu9GPINC+0LHQtdC40YUg0LPRgNGD0L/QvyAo0LPRgNCw0LTQsNGG0LjQuSkg0L3QtSDQvtGC0LLQtdGA0LPQsNC10YLRgdGPINCyINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjQuCDRgSDQutGA0LjRgtC10YDQuNC10Lwg0KjQsNC/0LjRgNC+LdCj0LjQu9C60LAg0YEgJHAudmFsdWUkIDAuNTEg0LggMC40NTcg0LTQu9GPINC+0LHQtdC40YUg0LPRgNGD0L/Qvy4NCg0KYGBge3J9DQpib3hwbG90KFh+Z3JvdXAsIGRmKQ0KYGBgDQoNCmBgYHtyfQ0KcC5GIDwtIHZhci50ZXN0KFh+Z3JvdXAsIGRmKSRwLnZhbHVlOyBwLkYNCmBgYA0KDQrQkiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Lgg0YEg0LrRgNC40YLQtdGA0LjQtdC8INCk0LjRiNC10YDQsCDQs9C40L/QvtGC0LXQt9CwINC+INGA0LDQstC10L3RgdGC0LLQtSDQtNC40YHQv9C10YDRgdC40Lkg0LIg0LTQstGD0YUg0LPRgNGD0L/QvyDQvdC1INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8gKCRwLnZhbHVlID0gMC43NSQpLCDQt9C90LDRh9C40YIsINC80L7QttC90L4g0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINC60YDQuNGC0LXRgNC40Lkg0KHRgtGM0Y7QtNC10L3RgtCwICjRgSDQv9Cw0YDQsNC80LXRgtGA0L7QvCDQviDRgNCw0LLQtdC90YHRgtCy0LUg0LTQuNGB0L/QtdGA0YHQuNC5KS4NCmBgYHtyfQ0KcC5UIDwtIHQudGVzdChYfmdyb3VwLCBkZiwgdmFyLmVxdWFsPVRSVUUpJHAudmFsdWU7IHAuVA0KYGBgDQrQn9C+INC60YDQuNGC0LXRgNC40Y4g0KHRgtGM0Y7QtNC10L3RgtCwINCz0LjQv9C+0YLQtdC30LAg0L4g0YDQsNCy0LXQvdGB0YLQstC1INGB0YDQtdC00L3QuNGFINGC0LDQutC20LUg0L3QtSDQvtGC0LLQtdGA0LPQsNC10YLRgdGPICgkcC52YWx1ZSA9IDAuMjI4JCkuDQoNCmBgYHtyfQ0Kb3AgPC0gcGFyKG1mcm93PWMoMSwyKSkNCkZpZyhkZiRYW2RmJGdyb3VwPT0wXSkNCkZpZyhkZiRYW2RmJGdyb3VwPT0xXSkNCmBgYA0KDQpgYGB7cn0NCnBhcihvcCkNCmRmLjIgPC0gZGYNCg0KTCA8LSBEZXNjcmlwdGl2ZVN0YXQoZGYkWCwgZGYkZ3JvdXApDQpTZW50ZW5jZShMJG1tLCBMJGVyciwgTCRubiwgcC5UKQ0KYGBgDQoNCj4g0KTQsNC60YLQvtGAINGBINGH0LXRgtGL0YDRjNC80Y8g0LPRgNCw0LTQsNGG0LjRj9C80LgNCg0K0J/QtdGA0LXQvNC10L3QvdCw0Y8gKmVkdWNhdCogLS0g0LPRgNGD0L/Qv9C40YDRg9GO0YnQsNGPLCDQuNC80LXQtdGCIDQg0LPRgNCw0LTQsNGG0LjQuCwg0LIg0YDQvtC70Lgg0LzQtdGC0YDQuNGH0LXRgdC60L7QuSDQv9C10YDQtdC80LXQvdC90L7QuSAtLSAqYmRpKg0KYGBge3J9DQpkZiA8LSBkYXRhLmZyYW1lKGdyb3VwPWFzLmZhY3RvcihkYXRhJGVkdWNhdCksIFg9YXMubnVtZXJpYyhkYXRhJGJkaSkpDQp0YWJsZShkZiRncm91cCkNCmBgYA0KDQpgYGB7cn0NCm5hbWUuZ3IgPC0gImVkdWNhdCINCm5hbWUueCA8LSAiYmRpIg0KDQpiYXJ0bGV0dC50ZXN0KFh+Z3JvdXAsIGRmKQ0KYGBgDQoNCtCa0YDQuNGC0LXRgNC40Lkg0JHQsNGA0LvQtdGC0YLQsCDQv9C+0LrQsNC30YvQstCw0LXRgiwg0YfRgtC+INCz0LjQv9C+0YLQtdC30LAg0L4g0YDQsNCy0LXQvdGB0YLQstC1INC00LjRgdC/0LXRgNGB0LjQuSDQstGB0LXRhSDQstGL0LHQvtGA0L7QuiDQvdC1INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8g0YEgJHAudmFsdWUgPSAwLjI5NTMkLg0KDQpgYGB7cn0NCndpdGgoZGYsbGV2ZW5lLnRlc3QoWCwgZ3JvdXApKQ0KYGBgDQrQkNC90LDQu9C+0LPQuNGH0L3QviDQutGA0LjRgtC10YDQuNC5INCb0LXQstC10L3QsCDQv9C+0LrQsNC30YvQstCw0LXRgiwg0YfRgtC+INCz0LjQv9C+0YLQtdC30LAg0L4g0YDQsNCy0LXQvdGB0YLQstC1INC00LjRgdC/0LXRgNGB0LjQuSDQstGB0LXRhSDQstGL0LHQvtGA0L7QuiDQvdC1INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8g0YEgcF92YWx1ZSA9IDAuMjM0MS4NCg0KLS0tDQoNCiMjIyMg0J7QtNC90L7RhNCw0LrRgtC+0YDQvdGL0Lkg0LTQuNGB0L/QtdGA0YHQuNC+0L3QvdGL0Lkg0LDQvdCw0LvQuNC3DQoNCmBgYHtyfQ0KYW8gPC0gYW92KFh+Z3JvdXAsIGRmKQ0Kc3VtbWFyeShhbykNCmBgYA0KDQpgYGB7cn0NCmJveHBsb3QoWH5ncm91cCwgeGxhYj1uYW1lLmdyLCB5bGFiPW5hbWUueCwgZGF0YT1kZikNCmBgYA0KDQpgYGB7cn0NCkwgPC0gRGVzY3JpcHRpdmVTdGF0KGRmJFgsIGRmJGdyb3VwKTsgTA0KYGBgDQrQl9Cw0LzQtdGC0LjQvCwg0YfRgtC+INGB0YDQtdC00L3QuNC1INCyINC60LDQttC00L7QuSDQuNC3INCz0YDRg9C/0L8g0L/RgNC40LzQtdGA0L3QviDRgNCw0LLQvdGLLCDQutGA0LjRgtC10YDQuNC4INCy0YvRiNC1INC70LjRiNGMINC90LUg0L7Qv9GA0L7QstC10YDQs9Cw0Y7RgiDRjdGC0L4uINCf0YDQuCDRjdGC0L7QvCDRgNCw0LfQu9C40YfQuNGPINC80L7Qs9GD0YIg0LHRi9GC0Ywg0L7QsdGK0Y/RgdC90LXQvdGLINGB0LvRg9GH0LDQudC90L7RgdGC0YzRjiDQuNC70Lgg0LzQsNC70YvQvCDRh9C40YHQu9C+0Lwg0L3QsNCx0LvRjtC00LXQvdC40Lkg0LIg0L3QtdC60L7RgtC+0YDRi9GFINCz0YDRg9C/0L/QsNGFICjQviDRh9C10Lwg0YHQstC40LTQtdGC0LXQu9GM0YHRgtCy0YPRjtGCINC/0LDRgNCw0LzQtdGC0YDRiyBubiwgc2QsIGVyciwg0L3QsNC/0YDQuNC80LXRgCwg0LTQu9GPINCz0YDRg9C/0L/RiyAiNCIpLg0KDQotLS0NCg0KIyMjIyDQnNC90L7QttC10YHRgtCy0LXQvdC90YvQtSDRgdGA0LDQstC90LXQvdC40Y8NCg0KYGBge3J9DQpsaWJyYXJ5KGFncmljb2xhZSkNCmxpYnJhcnkobXVsdGNvbXApDQoNCmFvIDwtIGFvdihYfmdyb3VwLCBkZikNCm91dCA8LSBMU0QudGVzdChhbywiZ3JvdXAiLCBwLmFkaj0ibm9uZSIsIGdyb3VwPUZBTFNFKTsgb3V0DQpgYGANCg0K0JfQsNC80LXRgtC40LwsINGH0YLQviBwLnZhbHVlINC/0L7Qt9Cy0L7Qu9GP0LXRgiDQs9C+0LLQvtGA0LjRgtGMINC+INC30L3QsNGH0LjQvNGL0YUg0YDQsNC30LvQuNGH0LjRj9GFINC80LXQttC00YMg0LPRgNGD0L/Qv9Cw0LzQuCAyINC4IDMsINGBINC+0YHRgtC+0YDQvtC20L3QvtGB0YLRjNGOIC0tINC80LXQttC00YMgMSDQuCAzLiDQl9Cw0LzQtdGC0LjQvCwg0YfRgtC+INGBINC+0YfQtdC90Ywg0LLRi9GB0L7QutC+0Lkg0YPQstC10YDQtdC90L3QvtGB0YLRjNGOINC80L7QttC90L4g0LPQvtCy0L7RgNC40YLRjCwg0YfRgtC+INGA0LDQt9C70LjRh9C40Y8g0LzQtdC20LTRgyDRgdC+0L7RgtCy0LXRgtGB0YLQstC10L3QvdC+IDEg0LggMiwgMSDQuCA0LCAyINC4IDQg0L3QtdC30L3QsNGH0LjQvNGLLiDQotCw0LrQuNC8INC+0LHRgNCw0LfQvtC8LCDQu9GO0LTQuCDRgSDQvdC10L/QvtC70L3Ri9C8INCy0YvRgdGI0LjQvCDQvtCx0YDQsNC30L7QstCw0L3QuNC10LwgKNCz0YDRg9C/0L/QsCAiMyIpINC+0YLQu9C40YfQsNGO0YLRgdGPINC+0YIg0LPRgNGD0L/Qv9GLINC70Y7QtNC10Lkg0YEg0L7QsdGA0LDQt9C+0LLQsNC90LjQtdC8IDgg0LrQu9Cw0YHRgdC+0LIgKCIxIikg0LjQu9C4INC/0L7Qu9C90L7QuSDRgdGA0LXQtNC90LXQuSDRiNC60L7Qu9GLICgiMiIpOyDQs9GA0YPQv9C/0LAgIjQiICjQu9GO0LTQuCDRgSDQstGL0YHRiNC40Lwg0L7QsdGA0LDQt9C+0LLQsNC90LjQtdC8KSDRgdGF0L7QttCwINGBINCz0YDRg9C/0L/QsNC80LggIjEiINC4ICIyIiAo0L3QtdC/0L7Qu9C90L7QtSDQuCDQv9C+0LvQvdC+0LUg0YHRgNC10LTQvdC10LUg0L7QsdGA0LDQt9C+0LLQsNC90LjQtSkg0Lgg0LIg0LzQtdC90YzRiNC10Lkg0YHRgtC10L/QtdC90Lgg0YEg0LPRgNGD0L/Qv9C+0LkgIjMiICjQvdC10L/QvtC70L3QvtC1INCy0YvRgdGI0LXQtSkg0LIg0LrQvtC90YLQtdC60YHRgtC1INC+0YbQtdC90LrQuCDQtNC10L/RgNC10YHQuNC4ICgqYmRpKikuDQoNCtCU0LvRjyDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjyDRjdGC0L7Qs9C+INGB0L7RgdGC0LDQstC40LwgItC60L7QvdGC0YDQsNGB0YLRiyIg0LTQu9GPINC+0LHRidC10Lkg0LvQuNC90LXQudC90L7QuSDQs9C40L/QvtGC0LXQt9GLINC4INC80L3QvtC20LXRgdGC0LLQtdC90L3Ri9GFINGB0YDQsNCy0L3QtdC90LjQuSAoKmdsaHQqKS4NCmBgYHtyfQ0KY29udHIgPC0gcmJpbmQoDQogICIxIC0gMjM0IiA9IGMoLTEsIDEvMywgMS8zLCAxLzMpLA0KICAiMiAtIDEzNCIgPSBjKDEvMywgLTEsIDEvMywgMS8zKSwNCiAgIjMgLSAxMjQiID0gYygxLzMsIDEvMywgLTEsIDEvMyksDQogICI0IC0gMTIzIiA9IGMoMS8zLCAxLzMsIDEvMywgLTEpDQopDQoNCkdMIDwtIGdsaHQoYW8sIGxpbmZjdCA9IG1jcChncm91cD1jb250cikpDQpzdW1tYXJ5KEdMKQ0KYGBgDQrQl9Cw0LzQtdGC0L3Qviwg0LrQsNC6INGB0YDQtdC00Lgg0L/RgNC+0YfQuNGFINGB0YDQsNCy0L3QtdC90LjQuSAi0L7RgtC70LjRh9Cw0Y7RgtGB0Y8iINCz0YDRg9C/0L/RiyAiMyIg0LggIjEyNCIsINC+0LTQvdCw0LrQviDQviDRgNCw0LfQu9C40YfQuNC4INC80L7QttC90L4g0LPQvtCy0L7RgNC40YLRjCDQu9C40YjRjCDRgSDRg9GA0L7QstC90LXQvCDQt9C90LDRh9C40LzQvtGB0YLQuCDQsiAwLjEuDQoNCtCY0YHQv9C+0LvRjNC30YPQtdC8INGA0LDQt9C90YvQtSDQv9C+0L/RgNCw0LLQutC4INC00LvRjyDQvNC90L7QttC10YHRgtCy0LXQvdC90YvRhSDRgdGA0LDQstC90LXQvdC40LkgW9C60L7RgtC+0YDRi9C1INCyINC40YLQvtCz0LUg0LTQsNC00YPRgiDRgdGF0L7QttC40LUg0LzQtdC20LTRgyDRgdC+0LHQvtC5INGA0LXQt9GD0LvRjNGC0LDRgtGLLCDQv9C+0LTRgtCy0LXRgNC20LTQsNGO0YnQuNC1INCy0YvQstC+0LTRiyDQstGL0YjQtV0uDQpgYGB7cn0NCm91dDEgPC0gTFNELnRlc3QoYW8sICJncm91cCIsIHAuYWRqID0gImJvbmZlcnJvbmkiLCBncm91cD1GQUxTRSkNCm91dDIgPC0gTFNELnRlc3QoYW8sICJncm91cCIsIHAuYWRqID0gImhvY2hiZXJnIiwgZ3JvdXA9RkFMU0UpDQpvdXQzIDwtIExTRC50ZXN0KGFvLCAiZ3JvdXAiLCBwLmFkaiA9ICJob2xtIiwgZ3JvdXA9RkFMU0UpDQpvdXQ0IDwtIExTRC50ZXN0KGFvLCAiZ3JvdXAiLCBwLmFkaiA9ICJCSCIsIGdyb3VwPUZBTFNFKQ0Kb3V0NSA8LSBMU0QudGVzdChhbywgImdyb3VwIiwgcC5hZGogPSAiZmRyIiwgZ3JvdXA9RkFMU0UpDQpgYGANCg0KYGBge3J9DQpvdXQxDQpgYGANCg0KYGBge3J9DQpwYWlyd2lzZS50LnRlc3QoZGF0YSRiZGksIGRhdGEkZWR1Y2F0LCBwLmFkaiA9ICJmZHIiKQ0KYGBgDQoNClR1a2V5INC40YHQv9C+0LvRjNC30YPQtdGC0YHRjyDQtNC70Y8g0LPRgNGD0L/QvyDRgNCw0LLQvdC+0LPQviDQvtCx0YrQtdC80LAsINC/0L7RjdGC0L7QvNGDINC/0YDQuNC80LXQvdC10L3QuNC1INC30LTQtdGB0Ywg0L3QtdC60L7RgNGA0LXQutGC0L3Qviwg0L3QviDRgNCw0LTQuCDQuNC90YLQtdGA0LXRgdCwINC40YHQv9C+0LvRjNC30YPQtdC8INGN0YLQvtGCINC80LXRgtC+0LQg0LzQvdC+0LbQtdGB0YLQstC10L3QvdGL0YUg0YHRgNCw0LLQvdC10L3QuNC5INGB0YDQtdC00L3QuNGFLg0KYGBge3J9DQpUdWtleUhTRChhbywgImdyb3VwIiwgb3JkZXJlZD1UUlVFKQ0KYGBgDQoNCi0tLQ0KDQojIyMjINCd0LXQv9Cw0YDQsNC80LXRgtGA0LjRh9C10YHQutC40LUg0LrRgNC40YLQtdGA0LjQuCDQvtC00L3QvtGA0L7QtNC90L7RgdGC0Lgg0LTQu9GPINC90LXQt9Cw0LLQuNGB0LjQvNGL0YUg0LLRi9Cx0L7RgNC+0LoNCg0K0JrRgNC40YLQtdGA0LjQuSDQnNCw0L3QvdCwLdCj0LjRgtC90Lgt0JLQuNC70LrQvtC60YHQvtC90LAgKCpleGFjdD1GQUxTRSog0L/RgNC4INC+0LHRitC10LzQsNGFINCy0YvQsdC+0YDQutC4INCx0L7Qu9GM0YjQtSAzMC01MCkNCmBgYHtyfQ0Kd2lsY294LnRlc3QoWH5ncm91cCwgZGYuMiwgZXhhY3Q9RkFMU0UsIGNvcnJlY3Q9RkFMU0UpDQpgYGANCtCa0YDQuNGC0LXRgNC40Lkg0JzQsNC90L3QsC3Qo9C40YLQvdC4INGBINC/0L7Qv9GA0LDQstC60L7QuSDQvdCwINC90LXQv9GA0LXRgNGL0LLQvdC+0YHRgtGMDQpgYGB7cn0NCndpbGNveC50ZXN0KFh+Z3JvdXAsIGRmLjIsIGV4YWN0PUZBTFNFLCBjb3JyZWN0PVRSVUUpDQpgYGANCtCd0LAg0L7RgdC90L7QstCw0L3QuNC4INC00LDQvdC90L7Qs9C+INC60YDQuNGC0LXRgNC40Y8g0LzQvtC20L3QviDRgdC00LXQu9Cw0YLRjCDQstGL0LLQvtC0LCDRh9GC0L4g0LTQu9GPINC00LDQvdC90YvRhSDQvdC10LfQsNCy0LjRgdC40LzRi9GFINCy0YvQsdC+0YDQvtC6INCz0LjQv9C+0YLQtdC30LAg0L7QsSDQvtC00L3QvtGA0L7QtNC90L7RgdGC0Lgg0L3QtSDQvtGC0LLQtdGA0LPQsNC10YLRgdGPINC/0YDQuCAkcC52YWx1ZSA9IDAuMjA0JC4NCg0KDQrQmtGA0LjRgtC10YDQuNC5INCa0YDQsNGB0LrQsNC70LAt0KPQvtC70LvQtdGB0LAg0LTQu9GPID4yINC90LXQt9Cw0LLQuNGB0LjQvNGL0YUg0LLRi9Cx0L7RgNC+0LoNCmBgYHtyfQ0Ka3J1c2thbC50ZXN0KFh+Z3JvdXAsIGRmKQ0KYGBgDQrQlNCw0L3QvdGL0Lkg0LrRgNC40YLQtdGA0LjQuSDQvdC1INC+0YLQstC10YDQs9Cw0LXRgiDQs9C40L/QvtGC0LXQt9GDINC+0LEg0L7QtNC90L7RgNC+0LTQvdC+0YHRgtC4INC90LXQt9Cw0LLQuNGB0LjQvNGL0YUg0LLRi9Cx0L7RgNC+0Log0YEgJHAudmFsdWUgPSAwLjE0NTYkLg0KDQrQmtGA0LjRgtC10YDQuNC5INCa0YDQsNGB0LrQsNC70LAg0YEg0LzQvdC+0LbQtdGB0YLQstC10L3QvdGL0LzQuCDRgdGA0LDQstC90LXQvdC40Y/QvNC4INC4INC/0L7Qv9GA0LDQstC60L7QuSDQkdC+0L3RhNC10YDRgNC+0L3QuCAqW9GA0LXQt9GD0LvRjNGC0LDRgtGLINC/0L7Qt9Cy0L7Qu9GP0Y7RgiDRgdC00LXQu9Cw0YLRjCDQstGL0LLQvtC00YssINCw0L3QsNC70L7Qs9C40YfQvdGL0LUg0L/QsNGA0LDQvNC10YLRgNC40YfQtdGB0LrQuNC8INC80LXRgtC+0LTQsNC8INC80L3QvtC20LXRgdGC0LLQtdC90L3Ri9GFINGB0YDQsNCy0L3QtdC90LjQuV0qLg0KYGBge3J9DQpsaWJyYXJ5KGFncmljb2xhZSkNCmNvbXBhcmlzb24gPC0gd2l0aChkZiwga3J1c2thbChYLCBncm91cCwgcC5hZGo9ImJvbmZlcnJvbmkiLCBncm91cD1GQUxTRSwgbWFpbj0iSFIiKSk7IGNvbXBhcmlzb24NCmBgYA0K0JzQtdC00LjQsNC90L3Ri9C5INGC0LXRgdGCDQpgYGB7cn0NCk1lZGlhbi50ZXN0KGRmJFgsIGRmJGdyb3VwLCBjb3JyZWN0PVRSVUUsIGdyb3VwPVRSVUUsIGNvbnNvbGU9RkFMU0UpJHN0YXRpc3RpY3MNCmBgYA0KDQotLS0NCg0KIyMjINCQ0L3QsNC70LjQtyDQt9Cw0LLQuNGB0LjQvNGL0YUg0LLRi9Cx0L7RgNC+0LoNCg0K0JTQsNC90L3Ri9C1IC0tICpkYXRhTkYqLCDQv9C10YDQtdC80LXQvdC90YvQtSAiQkRJLjEiLCAiQkRJLjIiLCAiQkRJLjMiIC0tINC40L3QtNC10LrRgSDQtNC10L/RgNC10YHRgdC40Lgg0LIg0YDQsNC30L3Ri9C1INC80L7QvNC10L3RgtGLINCy0YDQtdC80LXQvdC4Lg0KDQpgYGB7cn0NCmRhdGFfZGVwIDwtIG5hLm9taXQoZGF0YU5GWyAsIGMoIkJESS4xIiwgIkJESS4yIiwgIkJESS4zIildKQ0KYGBgDQoNCj4g0JrRgNC40YLQtdGA0LjQuSDQodGC0YzRjtC00LXQvdGC0LAg0LTQu9GPINC30LDQstC40YHQuNC80YvRhSDQstGL0LHQvtGA0L7QuiAgDQoNCioocGFpcmVkPVRSVUUpKg0KDQpgYGB7cn0NCnQudGVzdChkYXRhX2RlcCRCREkuMSwgZGF0YV9kZXAkQkRJLjIsIHBhaXJlZCA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQpjKHQudGVzdChkYXRhX2RlcCRCREkuMSwgZGF0YV9kZXAkQkRJLjIsIHBhaXJlZCA9IFRSVUUpJHAudmFsdWUsIHQudGVzdChkYXRhX2RlcCRCREkuMiwgZGF0YV9kZXAkQkRJLjMsIHBhaXJlZCA9IFRSVUUpJHAudmFsdWUpDQpgYGANCtCf0L4g0YDQtdC30YPQu9GM0YLQsNGC0LDQvCDQutGA0LjRgtC10YDQuNGPINCh0YLRjNGO0LTQtdC90YLQsCDQtNC70Y8g0LfQsNCy0LjRgdC40LzRi9GFINCy0YvQsdC+0YDQvtC6INCz0LjQv9C+0YLQtdC30LAg0L7QsSDQvtC00L3QvtGA0L7QtNC90L7RgdGC0Lgg0LjQt9C80LXQvdC10L3QuNC5INCy0L4g0LLRgNC10LzQtdC90Lgg0L7RgtCy0LXRgNCz0LDQtdGC0YHRjyDRgSDRg9GA0L7QstC90Y/QvNC4INC30L3QsNGH0LjRgdC80L7RgdGC0LggMS4xMzc1NTVlLTI0INC4IDQuMjY5Njg1ZS0xMSDQv9GA0Lgg0YHRgNCw0LLQvdC10L3QuNC4INC80L7QvNC10L3RgtC+0LIg0LLRgNC10LzQtdC90LggMSDQuCAyOyAyINC4IDMg0YHQvtC+0YLQstC10YLRgdGC0LLQtdC90L3QviAo0YIu0LUuINC40YHRgtC40L3QvdCw0Y8g0YDQsNC30L3QvtGB0YLRjCDRgdGA0LXQtNC90LjRhSDQvdC1INGA0LDQstC90LAgMCkuDQoNCi0tLQ0KDQo+INCa0YDQuNGC0LXRgNC40Lkg0JLQuNC70LrQvtC60YHQvtC90LAg0LTQu9GPINC30LDQstC40YHQuNC80YvRhSDQstGL0LHQvtGA0L7Qug0KDQpgYGB7cn0NCmMod2lsY294LnRlc3QoZGF0YV9kZXAkQkRJLjEsIGRhdGFfZGVwJEJESS4yLCBwYWlyZWQ9VFJVRSwgZXhhY3QgPSBGQUxTRSkkcC52YWx1ZSwgd2lsY294LnRlc3QoZGF0YV9kZXAkQkRJLjIsIGRhdGFfZGVwJEJESS4zLCBwYWlyZWQ9VFJVRSwgZXhhY3QgPSBGQUxTRSkkcC52YWx1ZSkNCmBgYA0K0JDQvdCw0LvQvtCz0LjRh9C90L4g0LrRgNC40YLQtdGA0LjRjiDQodGC0YzRjtC00LXQvdGC0LAsINC60YDQuNGC0LXRgNC40Lkg0JLQuNC70LrQvtC60YHQvtC90LAg0L7RgtCy0LXRgNCz0LDQtdGCINCz0LjQv9C+0YLQtdC30YMg0L7QsSDQvtC00L3QvtGA0L7QtNC90L7RgdGC0Lgg0LjQt9C80LXQvdC10L3QuNC5INCy0L4g0LLRgNC10LzQtdC90Lgg0YEgJHAudmFsdWUgPSA0LjE5NTY4MWUtMjE7IDEuNjkzNzIwZS0xMSQg0L/RgNC4INGB0YDQsNCy0L3QtdC90LXQvdC40Lgg0LzQvtC80LXQvdGC0L7QsiDQstGA0LXQvNC10L3QuCAxINC4IDIsIDIg0LggMy4NCg0KLS0tDQoNCj4g0JrRgNC40YLQtdGA0LjQuSAkXGNoaV4yJC3QpNGA0LjQtNC80LDQvdCwINC00LvRjyDQvdC10YHQutC+0LvRjNC60LjRhSDQstGL0LHQvtGA0L7Qug0KDQpgYGB7cn0NCmZyaWVkbWFuLnRlc3QoYXMubWF0cml4KGRhdGFfZGVwKSkNCmBgYA0K0J3QtdC/0LDRgNCw0LzQtdGC0YDQuNGH0LXRgdC60LjQuSDQutGA0LjRgtC10YDQuNC5INCk0YDQuNC00LzQsNC90LAg0YLQsNC60LbQtSDQvtGC0LLQtdGA0LPQsNC10YIg0LPQuNC/0L7RgtC10LfRgyDQvtCxINC+0LTQvdC+0YDQvtC00L3QvtGB0YLQuCAiQkRJLjEiLCAiQkRJLjIiLCAiQkRJLjMiDQoNCi0tLQ0KDQo+IEFOT1ZBIFJlcGVhdGVkIE1lYXN1cmVzDQoNCtCY0YHQv9C+0LvRjNC30YPQtdC8INC80L7QtNC10LvRjCDQtNCy0YPRhdGE0LDQutGC0L7RgNC90L7Qs9C+INC00LjRgdC/0LXRgNGB0LjQvtC90L3QvtCz0L4g0LDQvdCw0LvQuNC30LAg0YEg0L/QvtCy0YLQvtGA0LXQvdC40Y/QvNC4IC0tIEFOT1ZBIFJlcGVhdGVkIE1lYXN1cmVzLg0K0JIg0LrQsNGH0LXRgdGC0LLQtSDQs9GA0YPQv9C/0LjRgNGD0Y7RidC40YUg0L/QtdGA0LXQvNC10L3QvdGL0YUgLS0gIlBSQ09ELjEiINC4ICJTRVguMSINCg0KYGBge3J9DQpkYXQuQVIgPC0gbmEub21pdChkYXRhTkZbICwgYygiUFJDT0QuMSIsICJTRVguMSIsICJCREkuMSIsICJCREkuMyIsICJCREkuNCIsICJCREkuNiIpXSkNCg0KayA8LSAyDQptIDwtIG5jb2woZGF0LkFSKS1rOyBtDQpkYXQuQVIuVCA8LSBkYXRhLmZyYW1lKA0KICAgIHN0YWNrKGRhdC5BUlssLXNlcShrKV0pLA0KICAgIHN1Yj1hcy5mYWN0b3IocmVwKHNlcShucm93KGRhdC5BUikpLCBtKSksDQogICAgZ3IxPWFzLmZhY3RvcihyZXAoZGF0LkFSJFBSQ09ELjEsIG0pKSwNCiAgICBncjI9YXMuZmFjdG9yKHJlcChkYXQuQVIkU0VYLjEsIG0pKQ0KICApDQoNCiMgYW5vdmFfcm0gPC0gYW92KHZhbHVlcyB+IChncjEgKyBncjIpICogaW5kICsgRXJyb3Ioc3ViKSwgZGF0LkFSLlQpDQphbm92YV9ybSA8LSBhb3YodmFsdWVzIH4gZ3IxKmdyMiArIGdyMSArIGdyMiwgZGF0LkFSLlQpDQpzYXJtIDwtIHN1bW1hcnkoYW5vdmFfcm0pOyBzYXJtDQpgYGANCg0K0JjRgdGB0LvQtdC00YPQtdC8INC30L3QsNGH0LjQvNC+0YHRgtGMINGE0LDQutGC0L7RgNC+0LIg0Lgg0Y3RhNGE0LXQutGC0L7QsiDQstC30LDQuNC80L7QtNC10LnRgdGC0LLQuNGPDQpgYGB7cn0NCkRmIDwtIHNhcm1bWzFdXVssIDFdDQpNUyA8LSBzYXJtW1sxXV1bLCAzXQ0KDQpwLmdyMSA8LSAxIC0gcGYoTVNbMV0gLyBNU1s0XSwgRGZbMV0sIERmWzRdKQ0KcC5ncjIgPC0gMSAtIHBmKE1TWzJdIC8gTVNbNF0sIERmWzJdLCBEZls0XSkNCnAuZ3IxMiA8LSAxIC0gcGYoTVNbM10gLyBNU1s0XSwgRGZbM10sIERmWzRdKQ0KYyhwLmdyMSwgcC5ncjIsIHAuZ3IxMikNCmMoc2FybVtbMV1dWywgNV1bMTozXSkNCg0KYGBgDQokcCA+IDAuMDUkLCDRgtC+INGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0LjQuSDRjdGE0YTQtdC60YIg0L7RgtGB0YPRgtGB0YLQstGD0LXRgi4NCg0KKiDQpNCw0LrRgtC+0YAg0LLQt9Cw0LjQvNC+0LTQtdC50YHRgtCy0LjRjyDQvdC1INC30L3QsNGH0LjQvCAo0L/RgNC4INC90YPQu9C10LLQvtC5INCz0LjQv9C+0YLQtdC30LUg0L7QsSDQvtGC0YHRg9GC0YHRgtCy0LjQuCDRjdGE0YTQtdC60YLQsCDRhNCw0LrRgtC+0YDQsCDQstC30LDQuNC80L7QtNC10LnRgdGC0LLQuNGPINC90LAg0LjQvdC00LXQutGBINC00LXQv9GA0LXRgdGB0LjQuCBCREkgJHAudmFsdWVfe2dyMTpncjJ9ID0gMC45NTckLCDQt9C90LDRh9C40YIsINC+0YLRgdGD0YLRgdGC0LLQuNC1INGN0YTRhNC10LrRgtCwINC90LUg0L7RgtCy0LXRgNCz0LDQtdGC0YHRjywg0YTQsNC60YLQvtGAINCy0LfQsNC40LzQvtC00LXQudGB0YLQstC40Y8g0L3QtSDQt9C90LDRh9C40LwpLg0KDQoqINCQ0L3QsNC70L7Qs9C40YfQvdC+INC+0YLRgdGD0YLRgdGC0LLRg9C10YIg0Y3RhNGE0LXQutGCINGE0LDQutGC0L7RgNCwINC/0L7Qu9CwIC0tICpTRVguMSogLS0g0L3QsCDQuNC90LTQtdC60YEg0LTQtdC/0YDQtdGB0YHQuNC4INGBICRwLnZhbHVlX3tzZXguMX09IDAuMjEkLCDRhNCw0LrRgtC+0YAg0L3QtSDQt9C90LDRh9C40LwuDQoNCiogJHAudmFsdWVfe3ByY29kLjF9PSAwLjAxNDckLCDRgtC+INCy0LvQuNGP0L3QuNC1INGE0LDQutGC0L7RgNCwICpQUkNPRC4xKiDQt9C90LDRh9C40LzQviDQtNC70Y8g0LjQvdC00LXQutGB0LAg0LTQtdC/0YDQtdGB0YHQuNC4LCDRgdGA0LXQtNC90LjQtSDQsiDQs9GA0YPQv9C/0LDRhSDQv9C+INC00LDQvdC90L7QvNGDINGE0LDQutGC0L7RgNGDINC30L3QsNGH0LjQvNC+INGA0LDQt9C70LjRh9Cw0Y7RgtGB0Y8gKNGC0LDQuiDQutCw0Log0L3Rg9C70LXQstCw0Y8g0LPQuNC/0L7RgtC10LfQsCDQs9C70LDRgdC40YIg0L7QsSDQvtGC0YHRg9GC0YHRgtCy0LjQuCDQstC70LjRj9C90LjRjykuDQoNCmBgYHtyfQ0KbW9kZWwudGFibGVzKGFub3ZhX3JtLCAnbWVhbicpDQpgYGANCg0KYGBge3J9DQpOYW1lcyA8LSBuYW1lcyh0YWJsZShkYXQuQVJbLDFdKSkNCksgPC0gbGVuZ3RoKE5hbWVzKQ0KDQppbnRlcmFjdGlvbi5wbG90KHguZmFjdG9yPWRhdC5BUi5UJGluZCwNCiAgdHJhY2UuZmFjdG9yPWRhdC5BUi5UJGdyMSwNCiAgcmVzcG9uc2U9ZGF0LkFSLlQkdmFsdWVzLA0KICBmdW4gPSBtZWFuLA0KICB0eXBlID0gImIiLCBsZWdlbmQgPSBGQUxTRSwNCiAgdHJhY2UubGFiZWwgPSJncm91cCIsDQogIHhsYWIgPSAiIiwNCiAgeWxhYiA9ICdQUkNPRC4xJywNCiAgbHR5ID0gc2VxKEspLCBjb2wgPSBzZXEoSyksIHBjaCA9IDIwLCBsd2QgPSAyDQopDQpsZWdlbmQoJ3RvcHJpZ2h0JywgTmFtZXMsIGx0eT1zZXEoSyksIGNvbD1zZXEoSyksIGNleD0wLjcsIHBjaD0yMCkNCmBgYA0KDQpgYGB7cn0NCk5hbWVzIDwtIG5hbWVzKHRhYmxlKGRhdC5BUlssMl0pKQ0KDQppbnRlcmFjdGlvbi5wbG90KHguZmFjdG9yPWRhdC5BUi5UJGluZCwNCiAgdHJhY2UuZmFjdG9yPWRhdC5BUi5UJGdyMiwNCiAgcmVzcG9uc2U9ZGF0LkFSLlQkdmFsdWVzLA0KICBmdW4gPSBtZWFuLA0KICB0eXBlID0gImIiLCBsZWdlbmQgPSBGQUxTRSwNCiAgdHJhY2UubGFiZWwgPSJncm91cCIsDQogIHhsYWIgPSAiIiwNCiAgeWxhYiA9ICdTRVguMScsDQogIGx0eSA9IHNlcShLKSwgY29sID0gc2VxKEspLCBwY2ggPSAyMCwgbHdkID0gMg0KKQ0KbGVnZW5kKCd0b3ByaWdodCcsIE5hbWVzLCBsdHk9c2VxKEspLCBjb2w9c2VxKEspLCBjZXg9MC43LCBwY2g9MjApDQpgYGANCg0K