Задача 2

Податоците од задачате се:

raw_data = c(
  1, 1, 65, 317, 2, 20,
  1, 2, 65, 476, 5, 33,
  1, 3, 52, 486, 4, 40,
  1, 4, 310, 3259, 36, 316,
  2, 1, 98, 486, 7, 31,
  2, 2, 159, 1004, 10, 81,
  2, 3, 175, 1355, 22, 122,
  2, 4, 877, 7660, 102, 724,
  3, 1, 41, 223, 5, 18,
  3, 2, 117, 539, 7, 39,
  3, 3, 137, 697, 16, 68,
  3, 4, 477, 3442, 63, 344,
  4, 1, 11, 40, 0, 3,
  4, 2, 35, 148, 6, 16,
  4, 3, 39, 214, 8, 25,
  4, 4, 167, 1019, 33, 114
)

car = as.factor(rep(raw_data[seq(1, length(raw_data), 6)], 2))
age = as.factor(rep(raw_data[seq(2, length(raw_data), 6)], 2))
dist = as.factor(c(rep(0, length(raw_data) / 6), rep(1, length(raw_data) / 6)))
y = c(
  raw_data[seq(3, length(raw_data), 6)], 
  raw_data[seq(5, length(raw_data), 6)]
)
n = c(
  raw_data[seq(4, length(raw_data), 6)], 
  raw_data[seq(6, length(raw_data), 6)]
)

claims_df = data.frame(car, age, dist, y, n)
claims_df

(a)

Како што може да се забележи од графиците, дистриктот и колата влијаат позитивно на соодносот y/n, додека староста влијае негативно.

by_car = aggregate(cbind(y, n) ~ car, data=claims_df, sum)
with(by_car, plot(car, y / n))


by_age = aggregate(cbind(y, n) ~ age, data=claims_df, sum)
with(by_age, plot(age, y / n))


by_dist = aggregate(cbind(y, n) ~ dist, data=claims_df, sum)
with(by_dist, plot(dist, y / n))

(b)

Најзначајни си самиот offset и староста. Има одредена значајност и во интеракцијата помеѓу староста и колата, но не е голема.

summary(
  glm(
    y ~ offset(log(y + n)) + car * age * dist, 
    family=poisson, 
    data=claims_df
  )
)

Call:
glm(formula = y ~ offset(log(y + n)) + car * age * dist, family = poisson, 
    data = claims_df)

Deviance Residuals: 
 [1]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
[25]  0  0  0  0  0  0  0  0

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)     -1.771e+00  1.240e-01 -14.279  < 2e-16 ***
car2            -1.390e-02  1.600e-01  -0.087  0.93075    
car3            -9.134e-02  1.994e-01  -0.458  0.64695    
car4             2.371e-01  3.260e-01   0.727  0.46707    
age2            -3.480e-01  1.754e-01  -1.984  0.04727 *  
age3            -5.656e-01  1.860e-01  -3.040  0.00237 ** 
age4            -6.724e-01  1.364e-01  -4.929 8.26e-07 ***
dist1           -6.269e-01  7.179e-01  -0.873  0.38256    
car2:age2        1.431e-01  2.174e-01   0.658  0.51045    
car3:age2        4.864e-01  2.524e-01   1.927  0.05397 .  
car4:age2        2.278e-01  3.876e-01   0.588  0.55676    
car2:age3        1.823e-01  2.248e-01   0.811  0.41745    
car3:age3        6.217e-01  2.575e-01   2.414  0.01576 *  
car4:age3        2.297e-01  3.888e-01   0.591  0.55469    
car2:age4        1.817e-01  1.731e-01   1.050  0.29376    
car3:age4        4.287e-01  2.124e-01   2.019  0.04350 *  
car4:age4        2.460e-01  3.399e-01   0.724  0.46914    
car2:dist1       7.201e-01  8.176e-01   0.881  0.37843    
car3:dist1       9.632e-01  8.601e-01   1.120  0.26278    
car4:dist1      -2.124e+01  4.225e+04  -0.001  0.99960    
age2:dist1       7.177e-01  8.548e-01   0.840  0.40112    
age3:dist1       5.656e-01  8.858e-01   0.639  0.52314    
age4:dist1       7.902e-01  7.392e-01   1.069  0.28505    
car2:age2:dist1 -1.029e+00  9.950e-01  -1.035  0.30088    
car3:age2:dist1 -1.213e+00  1.052e+00  -1.153  0.24894    
car4:age2:dist1  2.150e+01  4.225e+04   0.001  0.99959    
car2:age3:dist1 -3.694e-01  9.944e-01  -0.371  0.71030    
car3:age3:dist1 -7.539e-01  1.039e+00  -0.726  0.46795    
car4:age3:dist1  2.175e+01  4.225e+04   0.001  0.99959    
car2:age4:dist1 -6.994e-01  8.428e-01  -0.830  0.40662    
car3:age4:dist1 -8.861e-01  8.881e-01  -0.998  0.31839    
car4:age4:dist1  2.154e+01  4.225e+04   0.001  0.99959    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 1.5791e+02  on 31  degrees of freedom
Residual deviance: 4.1223e-10  on  0  degrees of freedom
AIC: 232.36

Number of Fisher Scoring iterations: 20

(c)

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

summary(
  glm(
    y ~ offset(log(y + n)) + as.double(car) + as.double(age), 
    family=poisson, 
    data=claims_df
  )
)

Call:
glm(formula = y ~ offset(log(y + n)) + as.double(car) + as.double(age), 
    family = poisson, data = claims_df)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.5881  -0.5929  -0.1024   0.8757   2.2134  

Coefficients:
               Estimate Std. Error z value Pr(>|z|)    
(Intercept)    -1.99485    0.07978 -25.004   <2e-16 ***
as.double(car)  0.17418    0.02078   8.383   <2e-16 ***
as.double(age) -0.15188    0.01848  -8.219   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 157.912  on 31  degrees of freedom
Residual deviance:  27.709  on 29  degrees of freedom
AIC: 202.07

Number of Fisher Scoring iterations: 4

Задача 3

Податоците од задачата се:

raw_data = c(25, 8, 5, 6, 18, 11)
small = raw_data[seq(1, length(raw_data), 3)]
moderate = raw_data[seq(2, length(raw_data), 3)]
large = raw_data[seq(3, length(raw_data), 3)]
total = small + moderate + large
vaccine = as.factor(c("placebo", "vaccine"))

flu_df = data.frame(vaccine, small, moderate, large, total)
flu_df

(a)

p-вредноста на хи-квадрат тестот е доволно ниска за да се заклучи дека има значајна разлика во двете групи.

chisq.test(matrix(c(small, moderate, large), ncol=3))

    Pearson's Chi-squared test

data:  matrix(c(small, moderate, large), ncol = 3)
X-squared = 17.648, df = 2, p-value = 0.0001472

За да направиме лог-линеарен модел, ги реструктурираме податоците. Моделот одлично ги учи податоците и има значајна интеракција помеѓу вакцинацијата и response, што не води до истиот заклучок како и хи-квадрат тестот, а тоа е дека има значајна разлика помеѓу плацебо и вакцината.

cnt = raw_data
response = as.factor(rep(c("small", "moderate", "large"), 2))
vaccine = as.factor(c(rep("placebo", 3), rep("vaccine", 3)))

new_flu_df = data.frame(vaccine, response, cnt)
new_flu_df

log_linear_lm = glm(cnt ~ response * vaccine, family=poisson, data=new_flu_df)
summary(log_linear_lm)

Call:
glm(formula = cnt ~ response * vaccine, family = poisson, data = new_flu_df)

Deviance Residuals: 
[1]  0  0  0  0  0  0

Coefficients:
                                Estimate Std. Error z value Pr(>|z|)    
(Intercept)                      1.60944    0.44721   3.599  0.00032 ***
responsemoderate                 0.47000    0.57009   0.824  0.40969    
responsesmall                    1.60944    0.48990   3.285  0.00102 ** 
vaccinevaccine                   0.78846    0.53936   1.462  0.14379    
responsemoderate:vaccinevaccine  0.02247    0.68663   0.033  0.97389    
responsesmall:vaccinevaccine    -2.21557    0.70539  -3.141  0.00168 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance:  2.3807e+01  on 5  degrees of freedom
Residual deviance: -6.6613e-16  on 0  degrees of freedom
AIC: 37.128

Number of Fisher Scoring iterations: 3

(b)

Моделот на хомогеност треба да не содржи интеракции (значи + наместо *).

Откако го пресметуваме хи-квадратот преку пирсоновите резидуали, јасно е дека оние пирсонови резидуали кои се најголеми по апсолутна вредност допринесуваат најмногу. Тоа се редиците 1 и 4 (имаат вредноста над 2, па речиси половина од хи-квадратот е поради нив), кои соодветствуваа на small response.

На сличен начин заклучуваме дека истите тие две редици најмногу допринесуваат и до D.

log_linear_lm = glm(cnt ~ response + vaccine, family=poisson, data=new_flu_df)

fitted_values = fitted(log_linear_lm)
pearson_resid = (new_flu_df$cnt - fitted_values) / sqrt(fitted_values)
print(pearson_resid)
        1         2         3         4         5         6 
 2.206329 -1.504324 -1.153435 -2.298942  1.567470  1.201852 
chi_sq = sum(pearson_resid * pearson_resid)
print(chi_sq)
[1] 17.64783
dev_res = sign(new_flu_df$cnt - fitted_values) * (sqrt(
  2 * (
    new_flu_df$cnt * log(new_flu_df$cnt / fitted_values) - 
      (new_flu_df$cnt - fitted_values)
    )
))
print(dev_res)
        1         2         3         4         5         6 
 2.040115 -1.629720 -1.246900 -2.615460  1.468817  1.127679 
deviance = sum(dev_res * dev_res)
print(deviance)
[1] 18.64253

(c)

Ординалниот модел ни посочува дека кај плацебо групата, пресечните точки се 0.08011702 (large), 0.28226302 (moderate) и 0.63761996 (small), додека кај вакцинираната група, пресечните точки се 0.3535527 (large), 0.4275750 (moderate) и 0.2188723 (small).

library(MASS)

vaccine = c()
response = c()

for (idx in 1:nrow(new_flu_df)) {
  row = new_flu_df[idx, ]
  vaccine = append(vaccine, rep(as.character(row$vaccine), row$cnt))
  response = append(response, rep(as.character(row$response), row$cnt))
}

ordinal_model = polr(
  factor(response, ordered=TRUE) ~ as.factor(vaccine), 
  Hess=TRUE
)
summary(ordinal_model)
Call:
polr(formula = factor(response, ordered = TRUE) ~ as.factor(vaccine), 
    Hess = TRUE)

Coefficients:
                           Value Std. Error t value
as.factor(vaccine)vaccine -1.837     0.4882  -3.764

Intercepts:
               Value   Std. Error t value
large|moderate -2.4408  0.4525    -5.3939
moderate|small -0.5650  0.3434    -1.6456

Residual Deviance: 139.6736 
AIC: 145.6736 
fitted_values = fitted(ordinal_model)
print(fitted_values[1,])
     large   moderate      small 
0.08011702 0.28226302 0.63761996 
print(fitted_values[50,])
    large  moderate     small 
0.3535527 0.4275750 0.2188723 

Задача 5

Податоците од задачата се:

satisfaction = c(
  65, 34, 54, 47, 100, 100,
  130, 141, 76, 116, 111, 191,
  67, 130, 48, 105, 62, 104
)
level = as.factor(rep(c(rep("low", 2), rep("medium", 2), rep("high", 2)), 3))
housing = as.factor(c(rep("tower", 6), rep("apartment", 6), rep("house", 6)))
contact = as.factor(rep(c("low", "high"), 9))

sat_df = data.frame(housing, contact, level, satisfaction)
sat_df

(a)

За tower, постои значајна интеракција помеѓу задоволството и контактот.

tower_log_linear_lm = glm(
  satisfaction ~ contact * level, 
  family=poisson, 
  data=sat_df[sat_df$housing == "tower", ]
)
summary(tower_log_linear_lm)

Call:
glm(formula = satisfaction ~ contact * level, family = poisson, 
    data = sat_df[sat_df$housing == "tower", ])

Deviance Residuals: 
[1]  0  0  0  0  0  0

Coefficients:
                         Estimate Std. Error z value Pr(>|z|)    
(Intercept)             4.605e+00  1.000e-01  46.052  < 2e-16 ***
contactlow             -1.338e-16  1.414e-01   0.000   1.0000    
levellow               -1.079e+00  1.985e-01  -5.434 5.51e-08 ***
levelmedium            -7.550e-01  1.769e-01  -4.269 1.96e-05 ***
contactlow:levellow     6.480e-01  2.546e-01   2.546   0.0109 *  
contactlow:levelmedium  1.388e-01  2.445e-01   0.568   0.5702    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 5.7491e+01  on 5  degrees of freedom
Residual deviance: 2.3537e-14  on 0  degrees of freedom
AIC: 47.795

Number of Fisher Scoring iterations: 3

За apartment, постои значајна интеракција помеѓу задоволството и контактот (дури и повисока отколку за tower).

apartment_log_linear_lm = glm(
  satisfaction ~ contact * level, 
  family=poisson, 
  data=sat_df[sat_df$housing == "apartment", ]
)
summary(apartment_log_linear_lm)

Call:
glm(formula = satisfaction ~ contact * level, family = poisson, 
    data = sat_df[sat_df$housing == "apartment", ])

Deviance Residuals: 
[1]  0  0  0  0  0  0

Coefficients:
                       Estimate Std. Error z value Pr(>|z|)    
(Intercept)             5.25227    0.07236  72.588  < 2e-16 ***
contactlow             -0.54274    0.11935  -4.547 5.43e-06 ***
levellow               -0.30351    0.11103  -2.734  0.00626 ** 
levelmedium            -0.49868    0.11771  -4.236 2.27e-05 ***
contactlow:levellow     0.46152    0.17038   2.709  0.00675 ** 
contactlow:levelmedium  0.11989    0.18980   0.632  0.52761    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 5.6480e+01  on 5  degrees of freedom
Residual deviance: 2.4869e-14  on 0  degrees of freedom
AIC: 51.898

Number of Fisher Scoring iterations: 2

За house, не постои значајна интеракција помеѓу задоволството и контактот.

house_log_linear_lm = glm(
  satisfaction ~ contact * level, 
  family=poisson, 
  data=sat_df[sat_df$housing == "house", ]
)
summary(house_log_linear_lm)

Call:
glm(formula = satisfaction ~ contact * level, family = poisson, 
    data = sat_df[sat_df$housing == "house", ])

Deviance Residuals: 
[1]  0  0  0  0  0  0

Coefficients:
                        Estimate Std. Error z value Pr(>|z|)    
(Intercept)             4.644391   0.098058  47.364  < 2e-16 ***
contactlow             -0.517257   0.160451  -3.224  0.00127 ** 
levellow                0.223144   0.131559   1.696  0.08986 .  
levelmedium             0.009569   0.138344   0.069  0.94485    
contactlow:levellow    -0.145585   0.219914  -0.662  0.50796    
contactlow:levelmedium -0.265503   0.236858  -1.121  0.26231    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance:  5.8866e+01  on 5  degrees of freedom
Residual deviance: -1.1546e-14  on 0  degrees of freedom
AIC: 49.409

Number of Fisher Scoring iterations: 2

(b)

Значајноста на интеракцијата е значително помала кога симултано се креира моделот.

complete_log_linear_lm = glm(
  satisfaction ~ housing * contact * level, 
  family=poisson, 
  data=sat_df
)
summary(complete_log_linear_lm)

Call:
glm(formula = satisfaction ~ housing * contact * level, family = poisson, 
    data = sat_df)

Deviance Residuals: 
 [1]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

Coefficients:
                                    Estimate Std. Error z value Pr(>|z|)
(Intercept)                          5.25227    0.07236  72.588  < 2e-16
housinghouse                        -0.60788    0.12186  -4.988 6.10e-07
housingtower                        -0.64710    0.12343  -5.243 1.58e-07
contactlow                          -0.54274    0.11935  -4.547 5.43e-06
levellow                            -0.30351    0.11103  -2.734 0.006265
levelmedium                         -0.49868    0.11771  -4.236 2.27e-05
housinghouse:contactlow              0.02549    0.19997   0.127 0.898583
housingtower:contactlow              0.54274    0.18505   2.933 0.003358
housinghouse:levellow                0.52666    0.17215   3.059 0.002219
housingtower:levellow               -0.77530    0.22746  -3.408 0.000653
housinghouse:levelmedium             0.50825    0.18165   2.798 0.005142
housingtower:levelmedium            -0.25634    0.21245  -1.207 0.227580
contactlow:levellow                  0.46152    0.17038   2.709 0.006753
contactlow:levelmedium               0.11989    0.18980   0.632 0.527614
housinghouse:contactlow:levellow    -0.60710    0.27819  -2.182 0.029087
housingtower:contactlow:levellow     0.18651    0.30631   0.609 0.542597
housinghouse:contactlow:levelmedium -0.38539    0.30352  -1.270 0.204181
housingtower:contactlow:levelmedium  0.01895    0.30955   0.061 0.951185
                                       
(Intercept)                         ***
housinghouse                        ***
housingtower                        ***
contactlow                          ***
levellow                            ** 
levelmedium                         ***
housinghouse:contactlow                
housingtower:contactlow             ** 
housinghouse:levellow               ** 
housingtower:levellow               ***
housinghouse:levelmedium            ** 
housingtower:levelmedium               
contactlow:levellow                 ** 
contactlow:levelmedium                 
housinghouse:contactlow:levellow    *  
housingtower:contactlow:levellow       
housinghouse:contactlow:levelmedium    
housingtower:contactlow:levelmedium    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance:  2.9448e+02  on 17  degrees of freedom
Residual deviance: -2.2649e-14  on  0  degrees of freedom
AIC: 149.1

Number of Fisher Scoring iterations: 3

(c)

Резултатот е речиси ист како и кај номиналниот модел од претходната глава.

LS0tDQp0aXRsZTogItCT0LvQsNCy0LAgOTog0J/QvtCw0YHQvtC90L7QstCwINGA0LXQs9GA0LXRgdC40ZjQsCDQuCDQu9C+0LMt0LvQuNC90LXQsNGA0L3QuCDQvNC+0LTQtdC70LgiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojINCX0LDQtNCw0YfQsCAyDQoNCtCf0L7QtNCw0YLQvtGG0LjRgtC1INC+0LQg0LfQsNC00LDRh9Cw0YLQtSDRgdC1Og0KDQpgYGB7cn0NCnJhd19kYXRhID0gYygNCiAgMSwgMSwgNjUsIDMxNywgMiwgMjAsDQogIDEsIDIsIDY1LCA0NzYsIDUsIDMzLA0KICAxLCAzLCA1MiwgNDg2LCA0LCA0MCwNCiAgMSwgNCwgMzEwLCAzMjU5LCAzNiwgMzE2LA0KICAyLCAxLCA5OCwgNDg2LCA3LCAzMSwNCiAgMiwgMiwgMTU5LCAxMDA0LCAxMCwgODEsDQogIDIsIDMsIDE3NSwgMTM1NSwgMjIsIDEyMiwNCiAgMiwgNCwgODc3LCA3NjYwLCAxMDIsIDcyNCwNCiAgMywgMSwgNDEsIDIyMywgNSwgMTgsDQogIDMsIDIsIDExNywgNTM5LCA3LCAzOSwNCiAgMywgMywgMTM3LCA2OTcsIDE2LCA2OCwNCiAgMywgNCwgNDc3LCAzNDQyLCA2MywgMzQ0LA0KICA0LCAxLCAxMSwgNDAsIDAsIDMsDQogIDQsIDIsIDM1LCAxNDgsIDYsIDE2LA0KICA0LCAzLCAzOSwgMjE0LCA4LCAyNSwNCiAgNCwgNCwgMTY3LCAxMDE5LCAzMywgMTE0DQopDQoNCmNhciA9IGFzLmZhY3RvcihyZXAocmF3X2RhdGFbc2VxKDEsIGxlbmd0aChyYXdfZGF0YSksIDYpXSwgMikpDQphZ2UgPSBhcy5mYWN0b3IocmVwKHJhd19kYXRhW3NlcSgyLCBsZW5ndGgocmF3X2RhdGEpLCA2KV0sIDIpKQ0KZGlzdCA9IGFzLmZhY3RvcihjKHJlcCgwLCBsZW5ndGgocmF3X2RhdGEpIC8gNiksIHJlcCgxLCBsZW5ndGgocmF3X2RhdGEpIC8gNikpKQ0KeSA9IGMoDQogIHJhd19kYXRhW3NlcSgzLCBsZW5ndGgocmF3X2RhdGEpLCA2KV0sIA0KICByYXdfZGF0YVtzZXEoNSwgbGVuZ3RoKHJhd19kYXRhKSwgNildDQopDQpuID0gYygNCiAgcmF3X2RhdGFbc2VxKDQsIGxlbmd0aChyYXdfZGF0YSksIDYpXSwgDQogIHJhd19kYXRhW3NlcSg2LCBsZW5ndGgocmF3X2RhdGEpLCA2KV0NCikNCg0KY2xhaW1zX2RmID0gZGF0YS5mcmFtZShjYXIsIGFnZSwgZGlzdCwgeSwgbikNCmNsYWltc19kZg0KYGBgDQoNCiMjIyAoYSkNCg0K0JrQsNC60L4g0YjRgtC+INC80L7QttC1INC00LAg0YHQtSDQt9Cw0LHQtdC70LXQttC4INC+0LQg0LPRgNCw0YTQuNGG0LjRgtC1LCDQtNC40YHRgtGA0LjQutGC0L7RgiDQuCDQutC+0LvQsNGC0LAg0LLQu9C40ZjQsNCw0YIg0L/QvtC30LjRgtC40LLQvdC+INC90LAg0YHQvtC+0LTQvdC+0YHQvtGCIHkvbiwg0LTQvtC00LXQutCwINGB0YLQsNGA0L7RgdGC0LAg0LLQu9C40ZjQsNC1INC90LXQs9Cw0YLQuNCy0L3Qvi4NCg0KYGBge3J9DQpieV9jYXIgPSBhZ2dyZWdhdGUoY2JpbmQoeSwgbikgfiBjYXIsIGRhdGE9Y2xhaW1zX2RmLCBzdW0pDQp3aXRoKGJ5X2NhciwgcGxvdChjYXIsIHkgLyBuKSkNCg0KYnlfYWdlID0gYWdncmVnYXRlKGNiaW5kKHksIG4pIH4gYWdlLCBkYXRhPWNsYWltc19kZiwgc3VtKQ0Kd2l0aChieV9hZ2UsIHBsb3QoYWdlLCB5IC8gbikpDQoNCmJ5X2Rpc3QgPSBhZ2dyZWdhdGUoY2JpbmQoeSwgbikgfiBkaXN0LCBkYXRhPWNsYWltc19kZiwgc3VtKQ0Kd2l0aChieV9kaXN0LCBwbG90KGRpc3QsIHkgLyBuKSkNCmBgYA0KDQojIyMgKGIpDQoNCtCd0LDRmNC30L3QsNGH0LDRmNC90Lgg0YHQuCDRgdCw0LzQuNC+0YIgb2Zmc2V0INC4INGB0YLQsNGA0L7RgdGC0LAuINCY0LzQsCDQvtC00YDQtdC00LXQvdCwINC30L3QsNGH0LDRmNC90L7RgdGCINC4INCy0L4g0LjQvdGC0LXRgNCw0LrRhtC40ZjQsNGC0LAg0L/QvtC80LXRk9GDINGB0YLQsNGA0L7RgdGC0LAg0Lgg0LrQvtC70LDRgtCwLCDQvdC+INC90LUg0LUg0LPQvtC70LXQvNCwLg0KDQpgYGB7cn0NCnN1bW1hcnkoDQogIGdsbSgNCiAgICB5IH4gb2Zmc2V0KGxvZyh5ICsgbikpICsgY2FyICogYWdlICogZGlzdCwgDQogICAgZmFtaWx5PXBvaXNzb24sIA0KICAgIGRhdGE9Y2xhaW1zX2RmDQogICkNCikNCmBgYA0KDQojIyMgKGMpDQoNCtCe0LLQvtGYINC80L7QtNC10Lsg0LUg0L3QtdGI0YLQviDQv9C+0LvQvtGIINC+0LQg0YLQvtGYINCy0L4g0LEgKNC40LzQsCDQv9C+0LLQuNGB0L7QutC4INGA0LXQt9C40LTRg9Cw0LvQuCksINC90L4g0L/QvtCy0YLQvtGA0L3QviDQtNC+0LHRgNC+INCz0Lgg0LzQvtC00LXQu9C40YDQsCDQv9C+0LTQsNGC0L7RhtC40YLQtS4NCg0KYGBge3J9DQpzdW1tYXJ5KA0KICBnbG0oDQogICAgeSB+IG9mZnNldChsb2coeSArIG4pKSArIGFzLmRvdWJsZShjYXIpICsgYXMuZG91YmxlKGFnZSksIA0KICAgIGZhbWlseT1wb2lzc29uLCANCiAgICBkYXRhPWNsYWltc19kZg0KICApDQopDQpgYGANCg0KIyDQl9Cw0LTQsNGH0LAgMw0KDQrQn9C+0LTQsNGC0L7RhtC40YLQtSDQvtC0INC30LDQtNCw0YfQsNGC0LAg0YHQtToNCg0KYGBge3J9DQpyYXdfZGF0YSA9IGMoMjUsIDgsIDUsIDYsIDE4LCAxMSkNCnNtYWxsID0gcmF3X2RhdGFbc2VxKDEsIGxlbmd0aChyYXdfZGF0YSksIDMpXQ0KbW9kZXJhdGUgPSByYXdfZGF0YVtzZXEoMiwgbGVuZ3RoKHJhd19kYXRhKSwgMyldDQpsYXJnZSA9IHJhd19kYXRhW3NlcSgzLCBsZW5ndGgocmF3X2RhdGEpLCAzKV0NCnRvdGFsID0gc21hbGwgKyBtb2RlcmF0ZSArIGxhcmdlDQp2YWNjaW5lID0gYXMuZmFjdG9yKGMoInBsYWNlYm8iLCAidmFjY2luZSIpKQ0KDQpmbHVfZGYgPSBkYXRhLmZyYW1lKHZhY2NpbmUsIHNtYWxsLCBtb2RlcmF0ZSwgbGFyZ2UsIHRvdGFsKQ0KZmx1X2RmDQpgYGANCg0KIyMjIChhKQ0KDQpwLdCy0YDQtdC00L3QvtGB0YLQsCDQvdCwINGF0Lgt0LrQstCw0LTRgNCw0YIg0YLQtdGB0YLQvtGCINC1INC00L7QstC+0LvQvdC+INC90LjRgdC60LAg0LfQsCDQtNCwINGB0LUg0LfQsNC60LvRg9GH0Lgg0LTQtdC60LAg0LjQvNCwINC30L3QsNGH0LDRmNC90LAg0YDQsNC30LvQuNC60LAg0LLQviDQtNCy0LXRgtC1INCz0YDRg9C/0LguDQoNCmBgYHtyfQ0KY2hpc3EudGVzdChtYXRyaXgoYyhzbWFsbCwgbW9kZXJhdGUsIGxhcmdlKSwgbmNvbD0zKSkNCmBgYA0KDQrQl9CwINC00LAg0L3QsNC/0YDQsNCy0LjQvNC1INC70L7Qsy3Qu9C40L3QtdCw0YDQtdC9INC80L7QtNC10LssINCz0Lgg0YDQtdGB0YLRgNGD0LrRgtGD0YDQuNGA0LDQvNC1INC/0L7QtNCw0YLQvtGG0LjRgtC1LiDQnNC+0LTQtdC70L7RgiDQvtC00LvQuNGH0L3QviDQs9C4INGD0YfQuCDQv9C+0LTQsNGC0L7RhtC40YLQtSDQuCDQuNC80LAg0LfQvdCw0YfQsNGY0L3QsCDQuNC90YLQtdGA0LDQutGG0LjRmNCwINC/0L7QvNC10ZPRgyDQstCw0LrRhtC40L3QsNGG0LjRmNCw0YLQsCDQuCByZXNwb25zZSwg0YjRgtC+INC90LUg0LLQvtC00Lgg0LTQviDQuNGB0YLQuNC+0YIg0LfQsNC60LvRg9GH0L7QuiDQutCw0LrQviDQuCDRhdC4LdC60LLQsNC00YDQsNGCINGC0LXRgdGC0L7Rgiwg0LAg0YLQvtCwINC1INC00LXQutCwINC40LzQsCDQt9C90LDRh9Cw0ZjQvdCwINGA0LDQt9C70LjQutCwINC/0L7QvNC10ZPRgyDQv9C70LDRhtC10LHQviDQuCDQstCw0LrRhtC40L3QsNGC0LAuDQoNCmBgYHtyfQ0KY250ID0gcmF3X2RhdGENCnJlc3BvbnNlID0gYXMuZmFjdG9yKHJlcChjKCJzbWFsbCIsICJtb2RlcmF0ZSIsICJsYXJnZSIpLCAyKSkNCnZhY2NpbmUgPSBhcy5mYWN0b3IoYyhyZXAoInBsYWNlYm8iLCAzKSwgcmVwKCJ2YWNjaW5lIiwgMykpKQ0KDQpuZXdfZmx1X2RmID0gZGF0YS5mcmFtZSh2YWNjaW5lLCByZXNwb25zZSwgY250KQ0KbmV3X2ZsdV9kZg0KDQpsb2dfbGluZWFyX2xtID0gZ2xtKGNudCB+IHJlc3BvbnNlICogdmFjY2luZSwgZmFtaWx5PXBvaXNzb24sIGRhdGE9bmV3X2ZsdV9kZikNCnN1bW1hcnkobG9nX2xpbmVhcl9sbSkNCmBgYA0KDQojIyMgKGIpDQoNCtCc0L7QtNC10LvQvtGCINC90LAg0YXQvtC80L7Qs9C10L3QvtGB0YIg0YLRgNC10LHQsCDQtNCwINC90LUg0YHQvtC00YDQttC4INC40L3RgtC10YDQsNC60YbQuNC4ICjQt9C90LDRh9C4ICsg0L3QsNC80LXRgdGC0L4gKikuIA0KDQrQntGC0LrQsNC60L4g0LPQviDQv9GA0LXRgdC80LXRgtGD0LLQsNC80LUg0YXQuC3QutCy0LDQtNGA0LDRgtC+0YIg0L/RgNC10LrRgyDQv9C40YDRgdC+0L3QvtCy0LjRgtC1INGA0LXQt9C40LTRg9Cw0LvQuCwg0ZjQsNGB0L3QviDQtSDQtNC10LrQsCDQvtC90LjQtSDQv9C40YDRgdC+0L3QvtCy0Lgg0YDQtdC30LjQtNGD0LDQu9C4INC60L7QuCDRgdC1INC90LDRmNCz0L7Qu9C10LzQuCDQv9C+INCw0L/RgdC+0LvRg9GC0L3QsCDQstGA0LXQtNC90L7RgdGCINC00L7Qv9GA0LjQvdC10YHRg9Cy0LDQsNGCINC90LDRmNC80L3QvtCz0YMuINCi0L7QsCDRgdC1INGA0LXQtNC40YbQuNGC0LUgMSDQuCA0ICjQuNC80LDQsNGCINCy0YDQtdC00L3QvtGB0YLQsCDQvdCw0LQgMiwg0L/QsCDRgNC10YfQuNGB0Lgg0L/QvtC70L7QstC40L3QsCDQvtC0INGF0Lgt0LrQstCw0LTRgNCw0YLQvtGCINC1INC/0L7RgNCw0LTQuCDQvdC40LIpLCDQutC+0Lgg0YHQvtC+0LTQstC10YLRgdGC0LLRg9Cy0LDQsCDQvdCwIHNtYWxsIHJlc3BvbnNlLg0KDQrQndCwINGB0LvQuNGH0LXQvSDQvdCw0YfQuNC9INC30LDQutC70YPRh9GD0LLQsNC80LUg0LTQtdC60LAg0LjRgdGC0LjRgtC1INGC0LjQtSDQtNCy0LUg0YDQtdC00LjRhtC4INC90LDRmNC80L3QvtCz0YMg0LTQvtC/0YDQuNC90LXRgdGD0LLQsNCw0YIg0Lgg0LTQviBELg0KDQpgYGB7cn0NCmxvZ19saW5lYXJfbG0gPSBnbG0oY250IH4gcmVzcG9uc2UgKyB2YWNjaW5lLCBmYW1pbHk9cG9pc3NvbiwgZGF0YT1uZXdfZmx1X2RmKQ0KDQpmaXR0ZWRfdmFsdWVzID0gZml0dGVkKGxvZ19saW5lYXJfbG0pDQpwZWFyc29uX3Jlc2lkID0gKG5ld19mbHVfZGYkY250IC0gZml0dGVkX3ZhbHVlcykgLyBzcXJ0KGZpdHRlZF92YWx1ZXMpDQpwcmludChwZWFyc29uX3Jlc2lkKQ0KY2hpX3NxID0gc3VtKHBlYXJzb25fcmVzaWQgKiBwZWFyc29uX3Jlc2lkKQ0KcHJpbnQoY2hpX3NxKQ0KZGV2X3JlcyA9IHNpZ24obmV3X2ZsdV9kZiRjbnQgLSBmaXR0ZWRfdmFsdWVzKSAqIChzcXJ0KA0KICAyICogKA0KICAgIG5ld19mbHVfZGYkY250ICogbG9nKG5ld19mbHVfZGYkY250IC8gZml0dGVkX3ZhbHVlcykgLSANCiAgICAgIChuZXdfZmx1X2RmJGNudCAtIGZpdHRlZF92YWx1ZXMpDQogICAgKQ0KKSkNCnByaW50KGRldl9yZXMpDQpkZXZpYW5jZSA9IHN1bShkZXZfcmVzICogZGV2X3JlcykNCnByaW50KGRldmlhbmNlKQ0KYGBgDQoNCiMjIyAoYykNCg0K0J7RgNC00LjQvdCw0LvQvdC40L7RgiDQvNC+0LTQtdC7INC90Lgg0L/QvtGB0L7Rh9GD0LLQsCDQtNC10LrQsCDQutCw0Zgg0L/Qu9Cw0YbQtdCx0L4g0LPRgNGD0L/QsNGC0LAsINC/0YDQtdGB0LXRh9C90LjRgtC1INGC0L7Rh9C60Lgg0YHQtSAwLjA4MDExNzAyIChsYXJnZSksIDAuMjgyMjYzMDIgKG1vZGVyYXRlKSDQuCAwLjYzNzYxOTk2IChzbWFsbCksINC00L7QtNC10LrQsCDQutCw0Zgg0LLQsNC60YbQuNC90LjRgNCw0L3QsNGC0LAg0LPRgNGD0L/QsCwg0L/RgNC10YHQtdGH0L3QuNGC0LUg0YLQvtGH0LrQuCDRgdC1IDAuMzUzNTUyNyAobGFyZ2UpLCAwLjQyNzU3NTAgKG1vZGVyYXRlKSDQuCAwLjIxODg3MjMgKHNtYWxsKS4NCg0KYGBge3J9DQpsaWJyYXJ5KE1BU1MpDQoNCnZhY2NpbmUgPSBjKCkNCnJlc3BvbnNlID0gYygpDQoNCmZvciAoaWR4IGluIDE6bnJvdyhuZXdfZmx1X2RmKSkgew0KICByb3cgPSBuZXdfZmx1X2RmW2lkeCwgXQ0KICB2YWNjaW5lID0gYXBwZW5kKHZhY2NpbmUsIHJlcChhcy5jaGFyYWN0ZXIocm93JHZhY2NpbmUpLCByb3ckY250KSkNCiAgcmVzcG9uc2UgPSBhcHBlbmQocmVzcG9uc2UsIHJlcChhcy5jaGFyYWN0ZXIocm93JHJlc3BvbnNlKSwgcm93JGNudCkpDQp9DQoNCm9yZGluYWxfbW9kZWwgPSBwb2xyKA0KICBmYWN0b3IocmVzcG9uc2UsIG9yZGVyZWQ9VFJVRSkgfiBhcy5mYWN0b3IodmFjY2luZSksIA0KICBIZXNzPVRSVUUNCikNCnN1bW1hcnkob3JkaW5hbF9tb2RlbCkNCg0KZml0dGVkX3ZhbHVlcyA9IGZpdHRlZChvcmRpbmFsX21vZGVsKQ0KcHJpbnQoZml0dGVkX3ZhbHVlc1sxLF0pDQpwcmludChmaXR0ZWRfdmFsdWVzWzUwLF0pDQpgYGANCg0KIyDQl9Cw0LTQsNGH0LAgNQ0KDQrQn9C+0LTQsNGC0L7RhtC40YLQtSDQvtC0INC30LDQtNCw0YfQsNGC0LAg0YHQtToNCg0KYGBge3J9DQpzYXRpc2ZhY3Rpb24gPSBjKA0KICA2NSwgMzQsIDU0LCA0NywgMTAwLCAxMDAsDQogIDEzMCwgMTQxLCA3NiwgMTE2LCAxMTEsIDE5MSwNCiAgNjcsIDEzMCwgNDgsIDEwNSwgNjIsIDEwNA0KKQ0KbGV2ZWwgPSBhcy5mYWN0b3IocmVwKGMocmVwKCJsb3ciLCAyKSwgcmVwKCJtZWRpdW0iLCAyKSwgcmVwKCJoaWdoIiwgMikpLCAzKSkNCmhvdXNpbmcgPSBhcy5mYWN0b3IoYyhyZXAoInRvd2VyIiwgNiksIHJlcCgiYXBhcnRtZW50IiwgNiksIHJlcCgiaG91c2UiLCA2KSkpDQpjb250YWN0ID0gYXMuZmFjdG9yKHJlcChjKCJsb3ciLCAiaGlnaCIpLCA5KSkNCg0Kc2F0X2RmID0gZGF0YS5mcmFtZShob3VzaW5nLCBjb250YWN0LCBsZXZlbCwgc2F0aXNmYWN0aW9uKQ0Kc2F0X2RmDQpgYGANCg0KIyMjIChhKQ0KDQrQl9CwIHRvd2VyLCDQv9C+0YHRgtC+0Lgg0LfQvdCw0YfQsNGY0L3QsCDQuNC90YLQtdGA0LDQutGG0LjRmNCwINC/0L7QvNC10ZPRgyDQt9Cw0LTQvtCy0L7Qu9GB0YLQstC+0YLQviDQuCDQutC+0L3RgtCw0LrRgtC+0YIuDQoNCmBgYHtyfQ0KdG93ZXJfbG9nX2xpbmVhcl9sbSA9IGdsbSgNCiAgc2F0aXNmYWN0aW9uIH4gY29udGFjdCAqIGxldmVsLCANCiAgZmFtaWx5PXBvaXNzb24sIA0KICBkYXRhPXNhdF9kZltzYXRfZGYkaG91c2luZyA9PSAidG93ZXIiLCBdDQopDQpzdW1tYXJ5KHRvd2VyX2xvZ19saW5lYXJfbG0pDQpgYGANCg0K0JfQsCBhcGFydG1lbnQsINC/0L7RgdGC0L7QuCDQt9C90LDRh9Cw0ZjQvdCwINC40L3RgtC10YDQsNC60YbQuNGY0LAg0L/QvtC80LXRk9GDINC30LDQtNC+0LLQvtC70YHRgtCy0L7RgtC+INC4INC60L7QvdGC0LDQutGC0L7RgiAo0LTRg9GA0Lgg0Lgg0L/QvtCy0LjRgdC+0LrQsCDQvtGC0LrQvtC70LrRgyDQt9CwIHRvd2VyKS4NCg0KYGBge3J9DQphcGFydG1lbnRfbG9nX2xpbmVhcl9sbSA9IGdsbSgNCiAgc2F0aXNmYWN0aW9uIH4gY29udGFjdCAqIGxldmVsLCANCiAgZmFtaWx5PXBvaXNzb24sIA0KICBkYXRhPXNhdF9kZltzYXRfZGYkaG91c2luZyA9PSAiYXBhcnRtZW50IiwgXQ0KKQ0Kc3VtbWFyeShhcGFydG1lbnRfbG9nX2xpbmVhcl9sbSkNCmBgYA0KDQrQl9CwIGhvdXNlLCDQvdC1INC/0L7RgdGC0L7QuCDQt9C90LDRh9Cw0ZjQvdCwINC40L3RgtC10YDQsNC60YbQuNGY0LAg0L/QvtC80LXRk9GDINC30LDQtNC+0LLQvtC70YHRgtCy0L7RgtC+INC4INC60L7QvdGC0LDQutGC0L7Rgi4NCg0KYGBge3J9DQpob3VzZV9sb2dfbGluZWFyX2xtID0gZ2xtKA0KICBzYXRpc2ZhY3Rpb24gfiBjb250YWN0ICogbGV2ZWwsIA0KICBmYW1pbHk9cG9pc3NvbiwgDQogIGRhdGE9c2F0X2RmW3NhdF9kZiRob3VzaW5nID09ICJob3VzZSIsIF0NCikNCnN1bW1hcnkoaG91c2VfbG9nX2xpbmVhcl9sbSkNCmBgYA0KDQojIyMgKGIpDQoNCtCX0L3QsNGH0LDRmNC90L7RgdGC0LAg0L3QsCDQuNC90YLQtdGA0LDQutGG0LjRmNCw0YLQsCDQtSDQt9C90LDRh9C40YLQtdC70L3QviDQv9C+0LzQsNC70LAg0LrQvtCz0LAg0YHQuNC80YPQu9GC0LDQvdC+INGB0LUg0LrRgNC10LjRgNCwINC80L7QtNC10LvQvtGCLg0KDQpgYGB7cn0NCmNvbXBsZXRlX2xvZ19saW5lYXJfbG0gPSBnbG0oDQogIHNhdGlzZmFjdGlvbiB+IGhvdXNpbmcgKiBjb250YWN0ICogbGV2ZWwsIA0KICBmYW1pbHk9cG9pc3NvbiwgDQogIGRhdGE9c2F0X2RmDQopDQpzdW1tYXJ5KGNvbXBsZXRlX2xvZ19saW5lYXJfbG0pDQpgYGANCg0KIyMjIChjKQ0KDQrQoNC10LfRg9C70YLQsNGC0L7RgiDQtSDRgNC10YfQuNGB0Lgg0LjRgdGCINC60LDQutC+INC4INC60LDRmCDQvdC+0LzQuNC90LDQu9C90LjQvtGCINC80L7QtNC10Lsg0L7QtCDQv9GA0LXRgtGF0L7QtNC90LDRgtCwINCz0LvQsNCy0LAuDQoNCg==