演習の概要

注意事項

  • 慶應義塾大学SFCで開講している「統計解析」の授業履修者向けの演習用ページです。
  • 必ずしも全てのバージョンのRやOSで動作確認を行っていません。この演習用ページを作成している段階では、R3.6.0を使っています。
  • Rの更新などにより、Rコードなどを予告無しに変更する場合があります。

データ分析の準備

パッケージのインストール

  • 今回の演習では、以下のパッケージを使います。
install.packages("ggplot2")
install.packages("foreign")
install.packages("car")
install.packages("sandwich")
library(ggplot2)
library(foreign)
library(car)
library(sandwich)

データのダウンロード

  • Stata pressで公開されているデータを使用します。
  • プログラムはGermán Rodríguez氏やここのWebサイトを参考にしています。
  • 以下の要領でデータを読み込みます。
npub <- read.dta("http://www.stata-press.com/data/lf2/couart2.dta")
  • データの要約は以下の通り。
summary(npub)
      art            fem           mar           kid5             phd       
 Min.   : 0.000   Men  :494   Single :309   Min.   :0.0000   Min.   :0.755  
 1st Qu.: 0.000   Women:421   Married:606   1st Qu.:0.0000   1st Qu.:2.260  
 Median : 1.000                             Median :0.0000   Median :3.150  
 Mean   : 1.693                             Mean   :0.4951   Mean   :3.103  
 3rd Qu.: 2.000                             3rd Qu.:1.0000   3rd Qu.:3.920  
 Max.   :19.000                             Max.   :3.0000   Max.   :4.620  
      ment       
 Min.   : 0.000  
 1st Qu.: 3.000  
 Median : 6.000  
 Mean   : 8.767  
 3rd Qu.:12.000  
 Max.   :77.000  
  • 平均と分散を比較すると、過分散な状態であることがわかります。
c(mean=mean(npub$art), var=var(npub$art), ratio=var(npub$art)/mean(npub$art))
    mean      var    ratio 
1.692896 3.709742 2.191358 
  • ヒストグラムは以下のようになります。
ggplot(npub, aes(x=art)) + geom_histogram()

  • 変数mentartの散布図は以下のようになります。
ggplot(npub) + geom_point(aes(x = ment, y = art, col = 2)) + 
  guides(colour = "none")

モデル推定とモデル選択

ポアソン回帰モデルの推定

  • まず、全変数を投入したモデルnpub.poisson1を推定します。
npub.poisson1 <- glm(art~fem+mar+kid5+phd+ment, data=npub, 
                    family = poisson(link = "log"))
summary(npub.poisson1)

Call:
glm(formula = art ~ fem + mar + kid5 + phd + ment, family = poisson(link = "log"), 
    data = npub)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-3.5672  -1.5398  -0.3660   0.5722   5.4467  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.304617   0.102981   2.958   0.0031 ** 
femWomen    -0.224594   0.054613  -4.112 3.92e-05 ***
marMarried   0.155243   0.061374   2.529   0.0114 *  
kid5        -0.184883   0.040127  -4.607 4.08e-06 ***
phd          0.012823   0.026397   0.486   0.6271    
ment         0.025543   0.002006  12.733  < 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: 1817.4  on 914  degrees of freedom
Residual deviance: 1634.4  on 909  degrees of freedom
AIC: 3314.1

Number of Fisher Scoring iterations: 5
  • 変数mentartの散布図にモデル推定結果を重ねます。
ggplot(npub, aes(x = ment, y = art, col = 2)) + geom_point() + 
  geom_smooth(method = "glm", method.args = list(family = "poisson")) +
  guides(colour = "none")

推定結果の評価

  • 最大対数尤度
logLik(npub.poisson1)
'log Lik.' -1651.056 (df=6)
  • 自由度909での5%水準の\(\chi^2\)値は、以下のように得られます。
qchisq(0.95, df.residual(npub.poisson1))
[1] 980.2518
  • モデルがデータに当てはまるかどうかをみるために、devianceとPearson’s \(\chi^2\)値を計算します。
  • Deviance
npub.poisson1$deviance
[1] 1634.371
  • Pearson’s \(\chi^2\)
sum((residuals(npub.poisson1,"pearson"))^2)
[1] 1662.547
  • これらの結果から、モデルは当てはまりが良くないことがわかります。
  • 過分散とdispersion parameterを以下のように計算します。
  • 過分散
npub.poisson1$deviance/npub.poisson1$df.res
[1] 1.797988
  • dispersion parameter
sum(residuals(npub.poisson1, type="pearson")^2)/npub.poisson1$df.res
[1] 1.828984

モデル選択

  • まずANOVAを用いて、モデルnpub.poisson1の推定結果を評価します。
  • ANOVA(Type I)はanova()関数を用いて計算します。
anova(npub.poisson1, test="Chisq")
Analysis of Deviance Table

Model: poisson, link: log

Response: art

Terms added sequentially (first to last)

     Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
NULL                   914     1817.4              
fem   1   23.029       913     1794.4 1.596e-06 ***
mar   1    0.251       912     1794.1  0.616719    
kid5  1   17.388       911     1776.7 3.047e-05 ***
phd   1   10.499       910     1766.2  0.001194 ** 
ment  1  131.868       909     1634.4 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  • Type IのANOVAでは、変数marに効果がないと、誤って検出されてしまいます。
  • Type IIとType IIIのANOVAはcarパッケージのAnova()関数を用いて研鑽します。
  • ANOVA(TypeII)
car::Anova(npub.poisson1, type=c("II"))
Analysis of Deviance Table (Type II tests)

Response: art
     LR Chisq Df Pr(>Chisq)    
fem    17.075  1  3.593e-05 ***
mar     6.431  1    0.01121 *  
kid5   22.082  1  2.613e-06 ***
phd     0.236  1    0.62696    
ment  131.868  1  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  • ANOVA(Type III)
car::Anova(npub.poisson1, type=c("III"))
Analysis of Deviance Table (Type III tests)

Response: art
     LR Chisq Df Pr(>Chisq)    
fem    17.075  1  3.593e-05 ***
mar     6.431  1    0.01121 *  
kid5   22.082  1  2.613e-06 ***
phd     0.236  1    0.62696    
ment  131.868  1  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  • 次に、変数phdを減らしたモデルnpub.poisson2を推定します。
npub.poisson2 <- glm(art~fem+mar+kid5+ment, data=npub, 
                     family = poisson(link = "log"))
summary(npub.poisson2)

Call:
glm(formula = art ~ fem + mar + kid5 + ment, family = poisson(link = "log"), 
    data = npub)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-3.6436  -1.5408  -0.3583   0.5623   5.3986  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.34517    0.06012   5.741 9.41e-09 ***
femWomen    -0.22530    0.05461  -4.125 3.70e-05 ***
marMarried   0.15218    0.06107   2.492   0.0127 *  
kid5        -0.18499    0.04014  -4.609 4.05e-06 ***
ment         0.02576    0.00195  13.212  < 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: 1817.4  on 914  degrees of freedom
Residual deviance: 1634.6  on 910  degrees of freedom
AIC: 3312.3

Number of Fisher Scoring iterations: 5
  • npub.poisson1npub.poisson2のAICを比較します。
c(AIC.model1=AIC(npub.poisson1), AIC.model2=AIC(npub.poisson2))
AIC.model1 AIC.model2 
  3314.113   3312.349 
  • ANOVAによりnpub.poisson1npub.poisson2のAICを比較します。
anova(npub.poisson1, npub.poisson2, test="Chisq")
Analysis of Deviance Table

Model 1: art ~ fem + mar + kid5 + phd + ment
Model 2: art ~ fem + mar + kid5 + ment
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)
1       909     1634.4                     
2       910     1634.6 -1  -0.2362    0.627

参考:Robust SE

  • Robust SEは以下の方法で計算できます。
result <- npub.poisson2
cov.result <- vcovHC(result, type="HC0")
std.err <- sqrt(diag(cov.result))
r.est <- cbind(Estimate= coef(result), "Robust SE" = std.err,
               "Pr(>|z|)" = 2 * pnorm(abs(coef(result)/std.err), lower.tail=FALSE),
               LL = coef(result) - 1.96 * std.err,
               UL = coef(result) + 1.96 * std.err)
r.est
               Estimate   Robust SE     Pr(>|z|)          LL          UL
(Intercept)  0.34517404 0.082177620 2.665130e-05  0.18410591  0.50624218
femWomen    -0.22530260 0.071201599 1.554611e-03 -0.36485773 -0.08574746
marMarried   0.15217527 0.083642215 6.885659e-02 -0.01176348  0.31611401
kid5        -0.18499262 0.055799227 9.153637e-04 -0.29435910 -0.07562613
ment         0.02576117 0.003491732 1.609692e-13  0.01891738  0.03260497
LS0tCnRpdGxlOiAi57Wx6KiI6Kej5p6QUua8lOe/kjYiCiNhdXRob3I6ICJUb21veXVraSBGdXJ1dGFuaSIKI2RhdGU6ICIyMDE5LzgvOSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yID0gVFJVRSkKYGBgCgojIyDmvJTnv5Ljga7mpoLopoEKLSDkuIDoiKzljJbnt5rlvaLlm57luLDjg6Ljg4fjg6vjga7jg6Ljg4fjg6vpgbjmip4KCiMjIyDms6jmhI/kuovpoIUKLSDmhbbmh4nnvqnlob7lpKflraZTRkPjgafplovorJvjgZfjgabjgYTjgovjgIzntbHoqIjop6PmnpDjgI3jga7mjojmpa3lsaXkv67ogIXlkJHjgZHjga7mvJTnv5LnlKjjg5rjg7zjgrjjgafjgZnjgIIKLSDlv4XjgZrjgZfjgoLlhajjgabjga7jg5Djg7zjgrjjg6fjg7Pjga5S44KET1Pjgafli5XkvZznorroqo3jgpLooYzjgaPjgabjgYTjgb7jgZvjgpPjgILjgZPjga7mvJTnv5LnlKjjg5rjg7zjgrjjgpLkvZzmiJDjgZfjgabjgYTjgovmrrXpmo7jgafjga/jgIFSMy42LjDjgpLkvb/jgaPjgabjgYTjgb7jgZnjgIIKLSBS44Gu5pu05paw44Gq44Gp44Gr44KI44KK44CBUuOCs+ODvOODieOBquOBqeOCkuS6iOWRiueEoeOBl+OBq+WkieabtOOBmeOCi+WgtOWQiOOBjOOBguOCiuOBvuOBmeOAgiAKCiMjIOODh+ODvOOCv+WIhuaekOOBrua6luWCmQojIyMg44OR44OD44Kx44O844K444Gu44Kk44Oz44K544OI44O844OrCi0g5LuK5Zue44Gu5ryU57+S44Gn44Gv44CB5Lul5LiL44Gu44OR44OD44Kx44O844K444KS5L2/44GE44G+44GZ44CCCmBgYHtyIGluc3RhbGwucGFja2FnZXMsIGV2YWw9RkFMU0V9Cmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQppbnN0YWxsLnBhY2thZ2VzKCJmb3JlaWduIikKaW5zdGFsbC5wYWNrYWdlcygiY2FyIikKaW5zdGFsbC5wYWNrYWdlcygic2FuZHdpY2giKQpgYGAKCmBgYHtyIGxpYnJhcnksIGV2YWw9RkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShmb3JlaWduKQpsaWJyYXJ5KGNhcikKbGlicmFyeShzYW5kd2ljaCkKYGBgCgojIyMg44OH44O844K/44Gu44OA44Km44Oz44Ot44O844OJCi0gW1N0YXRhIHByZXNzXShodHRwczovL3d3dy5zdGF0YS1wcmVzcy5jb20vZGF0YS8p44Gn5YWs6ZaL44GV44KM44Gm44GE44KL44OH44O844K/44KS5L2/55So44GX44G+44GZ44CCCi0g44OX44Ot44Kw44Op44Og44GvW0dlcm3DoW4gUm9kcsOtZ3Vlel0oaHR0cHM6Ly9kYXRhLnByaW5jZXRvbi5lZHUvd3dzNTA5L3Ivb3ZlcmRpc3BlcnNpb24p5rCP44KEW+OBk+OBk10oaHR0cHM6Ly93d3cuanN0YWdlLmpzdC5nby5qcC9hcnRpY2xlL3dlZWQvNTUvNC81NV80XzI4Ny9fcGRmKeOBrldlYuOCteOCpOODiOOCkuWPguiAg+OBq+OBl+OBpuOBhOOBvuOBmeOAggotIOS7peS4i+OBruimgemgmOOBp+ODh+ODvOOCv+OCkuiqreOBv+i+vOOBv+OBvuOBmeOAggpgYGB7ciByZWFkLmR0YSwgZXZhbD1UUlVFfQpucHViIDwtIHJlYWQuZHRhKCJodHRwOi8vd3d3LnN0YXRhLXByZXNzLmNvbS9kYXRhL2xmMi9jb3VhcnQyLmR0YSIpCmBgYAotIOODh+ODvOOCv+OBruimgee0hOOBr+S7peS4i+OBrumAmuOCiuOAggpgYGB7ciBzdW1tYXJ5fQpzdW1tYXJ5KG5wdWIpCmBgYAotIOW5s+Wdh+OBqOWIhuaVo+OCkuavlOi8g+OBmeOCi+OBqOOAgemBjuWIhuaVo+OBqueKtuaFi+OBp+OBguOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAggpgYGB7ciBtZWFudmFyfQpjKG1lYW49bWVhbihucHViJGFydCksIHZhcj12YXIobnB1YiRhcnQpLCByYXRpbz12YXIobnB1YiRhcnQpL21lYW4obnB1YiRhcnQpKQpgYGAKLSDjg5Ljgrnjg4jjgrDjg6njg6Djga/ku6XkuIvjga7jgojjgYbjgavjgarjgorjgb7jgZnjgIIKYGBge3IgaGlzdDEsIGZpZy5oZWlnaHQ9MS41LCBmaWcud2lkdGg9MS41fQpnZ3Bsb3QobnB1YiwgYWVzKHg9YXJ0KSkgKyBnZW9tX2hpc3RvZ3JhbSgpCmBgYAotIOWkieaVsGBtZW50YOOBqGBhcnRg44Gu5pWj5biD5Zuz44Gv5Lul5LiL44Gu44KI44GG44Gr44Gq44KK44G+44GZ44CCCmBgYHtyIGhpc3QyLCBmaWcuaGVpZ2h0PTEuNSwgZmlnLndpZHRoPTEuNX0KZ2dwbG90KG5wdWIpICsgZ2VvbV9wb2ludChhZXMoeCA9IG1lbnQsIHkgPSBhcnQsIGNvbCA9IDIpKSArIAogIGd1aWRlcyhjb2xvdXIgPSAibm9uZSIpCmBgYAoKIyMg44Oi44OH44Or5o6o5a6a44Go44Oi44OH44Or6YG45oqeCiMjIyDjg53jgqLjgr3jg7Plm57luLDjg6Ljg4fjg6vjga7mjqjlrpoKLSDjgb7jgZrjgIHlhajlpInmlbDjgpLmipXlhaXjgZfjgZ/jg6Ljg4fjg6tgbnB1Yi5wb2lzc29uMWDjgpLmjqjlrprjgZfjgb7jgZnjgIIKYGBge3IgbnB1Yi5wb2lzc29uMX0KbnB1Yi5wb2lzc29uMSA8LSBnbG0oYXJ0fmZlbSttYXIra2lkNStwaGQrbWVudCwgZGF0YT1ucHViLCAKICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBwb2lzc29uKGxpbmsgPSAibG9nIikpCnN1bW1hcnkobnB1Yi5wb2lzc29uMSkKCmBgYAotIOWkieaVsGBtZW50YOOBqGBhcnRg44Gu5pWj5biD5Zuz44Gr44Oi44OH44Or5o6o5a6a57WQ5p6c44KS6YeN44Gt44G+44GZ44CCCmBgYHtyIGhpc3QzLCBmaWcuaGVpZ2h0PTEuNSwgZmlnLndpZHRoPTEuNSB9CmdncGxvdChucHViLCBhZXMoeCA9IG1lbnQsIHkgPSBhcnQsIGNvbCA9IDIpKSArIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLCBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gInBvaXNzb24iKSkgKwogIGd1aWRlcyhjb2xvdXIgPSAibm9uZSIpCmBgYAoKIyMjIOaOqOWumue1kOaenOOBruipleS+oQotIOacgOWkp+WvvuaVsOWwpOW6pgpgYGB7ciBsb2dsaWtlbGlob29kfQpsb2dMaWsobnB1Yi5wb2lzc29uMSkKYGBgCgotIOiHqueUseW6pjkwOeOBp+OBrjUl5rC05rqW44GuJFxjaGleMiTlgKTjga/jgIHku6XkuIvjga7jgojjgYbjgavlvpfjgonjgozjgb7jgZnjgIIKYGBge3Iga2hhaXNxfQpxY2hpc3EoMC45NSwgZGYucmVzaWR1YWwobnB1Yi5wb2lzc29uMSkpCmBgYAotIOODouODh+ODq+OBjOODh+ODvOOCv+OBq+W9k+OBpuOBr+OBvuOCi+OBi+OBqeOBhuOBi+OCkuOBv+OCi+OBn+OCgeOBq+OAgWRldmlhbmNl44GoUGVhcnNvbidzICRcY2hpXjIk5YCk44KS6KiI566X44GX44G+44GZ44CCCi0gRGV2aWFuY2UKYGBge3IgZGV2aWFuY2V9Cm5wdWIucG9pc3NvbjEkZGV2aWFuY2UKYGBgCi0gUGVhcnNvbidzICRcY2hpXjIk5YCkCmBgYHtyIHBlYXNvbmtoYWlzcX0Kc3VtKChyZXNpZHVhbHMobnB1Yi5wb2lzc29uMSwicGVhcnNvbiIpKV4yKQpgYGAKLSDjgZPjgozjgonjga7ntZDmnpzjgYvjgonjgIHjg6Ljg4fjg6vjga/lvZPjgabjga/jgb7jgorjgYzoia/jgY/jgarjgYTjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgIIKLSDpgY7liIbmlaPjgahkaXNwZXJzaW9uIHBhcmFtZXRlcuOCkuS7peS4i+OBruOCiOOBhuOBq+ioiOeul+OBl+OBvuOBmeOAggotIOmBjuWIhuaVowpgYGB7ciBvdmVyZGlzcGVyc2lvbn0KbnB1Yi5wb2lzc29uMSRkZXZpYW5jZS9ucHViLnBvaXNzb24xJGRmLnJlcwpgYGAKLSBkaXNwZXJzaW9uIHBhcmFtZXRlcgpgYGB7ciBkaXNwZXJzaW9ucGFyYW19CnN1bShyZXNpZHVhbHMobnB1Yi5wb2lzc29uMSwgdHlwZT0icGVhcnNvbiIpXjIpL25wdWIucG9pc3NvbjEkZGYucmVzCmBgYAoKIyMjIOODouODh+ODq+mBuOaKngotIOOBvuOBmkFOT1ZB44KS55So44GE44Gm44CB44Oi44OH44OrYG5wdWIucG9pc3NvbjFg44Gu5o6o5a6a57WQ5p6c44KS6KmV5L6h44GX44G+44GZ44CCCi0gQU5PVkEoVHlwZSBJKeOBr2Bhbm92YSgpYOmWouaVsOOCkueUqOOBhOOBpuioiOeul+OBl+OBvuOBmeOAggpgYGB7ciBhbm92YS5ucHViMS0xfQphbm92YShucHViLnBvaXNzb24xLCB0ZXN0PSJDaGlzcSIpCmBgYAotIFR5cGUgSeOBrkFOT1ZB44Gn44Gv44CB5aSJ5pWwYG1hcmDjgavlirnmnpzjgYzjgarjgYTjgajjgIHoqqTjgaPjgabmpJzlh7rjgZXjgozjgabjgZfjgb7jgYTjgb7jgZnjgIIKLSBUeXBlIElJ44GoVHlwZSBJSUnjga5BTk9WQeOBr2BjYXJg44OR44OD44Kx44O844K444GuYEFub3ZhKClg6Zai5pWw44KS55So44GE44Gm56CU6ZG944GX44G+44GZ44CCCi0gQU5PVkEoVHlwZUlJKQpgYGB7ciBhbm92YS5ucHViMS0yfQpjYXI6OkFub3ZhKG5wdWIucG9pc3NvbjEsIHR5cGU9YygiSUkiKSkKYGBgCi0gQU5PVkEoVHlwZSBJSUkpCmBgYHtyIGFub3ZhLm5wdWIxLTN9CmNhcjo6QW5vdmEobnB1Yi5wb2lzc29uMSwgdHlwZT1jKCJJSUkiKSkKYGBgCgotIOasoeOBq+OAgeWkieaVsGBwaGRg44KS5rib44KJ44GX44Gf44Oi44OH44OrYG5wdWIucG9pc3NvbjJg44KS5o6o5a6a44GX44G+44GZ44CCCmBgYHtyIH0KbnB1Yi5wb2lzc29uMiA8LSBnbG0oYXJ0fmZlbSttYXIra2lkNSttZW50LCBkYXRhPW5wdWIsIAogICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBwb2lzc29uKGxpbmsgPSAibG9nIikpCnN1bW1hcnkobnB1Yi5wb2lzc29uMikKYGBgCi0gYG5wdWIucG9pc3NvbjFg44GoYG5wdWIucG9pc3NvbjJg44GuQUlD44KS5q+U6LyD44GX44G+44GZ44CCCmBgYHtyIEFJQzJ9CmMoQUlDLm1vZGVsMT1BSUMobnB1Yi5wb2lzc29uMSksIEFJQy5tb2RlbDI9QUlDKG5wdWIucG9pc3NvbjIpKQpgYGAKLSBBTk9WQeOBq+OCiOOCimBucHViLnBvaXNzb24xYOOBqGBucHViLnBvaXNzb24yYOOBrkFJQ+OCkuavlOi8g+OBl+OBvuOBmeOAggpgYGB7ciB9CmFub3ZhKG5wdWIucG9pc3NvbjEsIG5wdWIucG9pc3NvbjIsIHRlc3Q9IkNoaXNxIikKYGBgCgojIyMg5Y+C6ICD77yaUm9idXN0IFNFCi0gUm9idXN0IFNF44Gv5Lul5LiL44Gu5pa55rOV44Gn6KiI566X44Gn44GN44G+44GZ44CCCmBgYHtyIHJvYnVzdFNFfQpyZXN1bHQgPC0gbnB1Yi5wb2lzc29uMgpjb3YucmVzdWx0IDwtIHZjb3ZIQyhyZXN1bHQsIHR5cGU9IkhDMCIpCnN0ZC5lcnIgPC0gc3FydChkaWFnKGNvdi5yZXN1bHQpKQpyLmVzdCA8LSBjYmluZChFc3RpbWF0ZT0gY29lZihyZXN1bHQpLCAiUm9idXN0IFNFIiA9IHN0ZC5lcnIsCiAgICAgICAgICAgICAgICJQcig+fHp8KSIgPSAyICogcG5vcm0oYWJzKGNvZWYocmVzdWx0KS9zdGQuZXJyKSwgbG93ZXIudGFpbD1GQUxTRSksCiAgICAgICAgICAgICAgIExMID0gY29lZihyZXN1bHQpIC0gMS45NiAqIHN0ZC5lcnIsCiAgICAgICAgICAgICAgIFVMID0gY29lZihyZXN1bHQpICsgMS45NiAqIHN0ZC5lcnIpCnIuZXN0CgpgYGAK