이전 장에서 불러올 데이터

library("nnet")
data("BankWages", package = "AER")

BankWages$edcat <- factor(BankWages$education)
levels(BankWages$edcat)[3:10] <- rep(c("14-15", "16-18", "19-21"), c(2, 3, 3))

bw_tab <- xtabs(~ gender + minority + edcat + job, data = BankWages)

bwmale <- subset(BankWages, gender == "male")
bw_mnl <- multinom(job ~ education + minority,
                   data = bwmale, trace = FALSE)




6. Ordered Response Models

6.2. Standard Ordered Response Models

데이터 탐색을 위해 분할표를 만든다.

bw_tab <- xtabs(~minority + edcat + job, data = bwmale)
ftable(bw_tab, col.vars = "edcat")
                   edcat  8 12 14-15 16-18 19-21
minority job                                    
no       custodial        6  8     0     0     0
         admin            6 30    66     7     1
         manage           0  0     4    38    28
yes      custodial        7  5     1     0     0
         admin            4 18    18     7     0
         manage           0  1     0     2     1



모든 변수의 공동 분포를 사용하여 데이터를 시각화해본다.

par(mfrow = c(2,2))
mosaicplot(bw_tab, off = c(5, 0, 0),
           dir = c("v", "v", "h"), col = rev(gray.colors(3)), main = "")

mosaicplot(bw_tab[1,,], off = 0, col = rev(gray.colors(3)), main = "minority = no")
mosaicplot(bw_tab[2,,], off = 0, col = rev(gray.colors(3)), main = "minority = yes")



MASS 패키지의 polr() 함수는 logit 또는 probit link가 있는 모델을 제공한다. clm()은 동일한 모델뿐만 아니라 추가 링크 함수 및 구조화된 임계값과 같은 더 많은 유연성을 제공한다. 또한 clmm()을 사용하면 무작위 효과를 포함할 수 있다.

library(MASS)

bw_olm <- polr(job ~ education + minority, data = bwmale, Hess = TRUE)
summary(bw_olm)
Call:
polr(formula = job ~ education + minority, data = bwmale, Hess = TRUE)

Coefficients:
             Value Std. Error t value
education    0.870    0.09307   9.348
minorityyes -1.056    0.41199  -2.564

Intercepts:
                Value   Std. Error t value
custodial|admin  7.9514  1.0769     7.3833
admin|manage    14.1721  1.4744     9.6124

Residual Deviance: 260.6396 
AIC: 268.6396 

education 및 minority 변수로 설명되는 job category 모델

결과에는 절편이 없고 education과 minority의 계수만 포함되며, 반드시 순서가 지정된 custodial | admin 및 admin | management 사이의 임계값만 포함된다. job category의 잠재 척도에서 education이 긍정적, minority가 부정적 영향을 미친다는 것을 알 수 있다.



계수 테스트 및 우도비 테스트:

coefficients(bw_olm)
  education minorityyes 
  0.8699976  -1.0564379 
library(lmtest)
lrtest(bw_olm)
Likelihood ratio test

Model 1: job ~ education + minority
Model 2: job ~ 1
  #Df  LogLik Df  Chisq Pr(>Chisq)    
1   4 -130.32                         
2   2 -231.34 -2 202.05  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1




Ordered probit 모델은 다음 코드를 통해 생성할 수 있다.

bw_opm <- polr(job ~ education + minority, data = bwmale,
               Hess = TRUE, method = "probit")

# function() 함수를 사용하는 방법도 있다.
# bw_opm <- update(bw_old, method = "probit")




결과적으로 로짓과 프로빗 모델은 유사한 결과를 보이고 있다.

library(modelsummary)

modelsummary(list("Probit model" = bw_opm,
                  "Logit model" = bw_olm), fmt = 3)
Probit model Logit model
custodial|admin 4.443 7.951
(0.557) (1.077)
admin|manage 7.844 14.172
(0.744) (1.474)
education 0.479 0.870
(0.047) (0.093)
minorityyes -0.509 -1.056
(0.214) (0.412)
Num.Obs. 258 258
AIC 270.4 268.6
BIC 284.6 282.9
RMSE 1.97 1.97

modelsummary()를 통한 정리




모델의 적합도를 평가하기 위해 혼동 행렬을 계산해볼 수 있다.

table(true = bwmale$job, pred = predict(bw_olm, type = "class"))
           pred
true        custodial admin manage
  custodial        13    14      0
  admin            10   144      3
  manage            0    31     43


predict(bw_olm, newdata = bwmale[25, ], type = "probs")
 custodial      admin     manage 
0.01725637 0.88105484 0.10168879 
predict(bw_olm, newdata = bwmale[25, ], type = "class")
[1] admin
Levels: custodial admin manage




6.2.3. Parallel regression assumption

multinomial model과 ordered logit/probit models를 비교하기
data: bank wages(앞의 예시와 동일)

library(nnet)
bw_mnl <- multinom(job ~ education + minority, data = bwmale, trace = FALSE)
AIC(bw_mnl, bw_olm, bw_opm)



AIC(bw_mnl, bw_olm, bw_opm, k = log(nrow(bwmale)))

multinomial model의 AIC값이 가장 낮고, ordered logit/probit 모델들은 비슷하다.
또한 BIC를 계산하기 위해 로그에 대한 패널티를 증가시켜도 multinomial 모델이 가장 잘 수행된다.




library(effects)

eff_mnl <- allEffects(bw_mnl, xlevels = list(education = 50))
eff_olm <- allEffects(bw_olm, xlevels = list(education = 50))

plot(eff_olm, multiline = TRUE)

education 및 minority 효과 플롯 - Ordered Model


plot(eff_mnl, multiline =TRUE)

education 및 minority 효과 플롯 - Multinomial Model


두 모델 모두 admin과 management 사이의 전환이 날카롭다(기울기가 크다?).
즉, 일정 수준 이상의 교육을 거치면 management로 일하게 될 가능성이 급격히 높아진다. 이 두 범주 사이에는 상대적으로 명확한 education의 효과가 있지만, custodial과 admin 사이에는 동일하게 말할 수 없다. custodial 근로자는 더 많은 교육을 받은 후에 admin 범주로 승진하는 것이 아니라 단순히 다른 궤적일 뿐이다. 그러나 proportional odds model(전자) 에서는 custodial과 admin 두 곡선이 평행하고 서로 다른 임계값에서 서로 다른 효과를 가질 가능성이 없으므로 이 경우 multinomial model(후자)이 더 적합하다.




정확도를 평가하기 위한 분할표: multinomial 및 ordered model 예측

table(true = bwmale$job, pred = predict(bw_mnl, type = "class"))
           pred
true        custodial admin manage
  custodial        13    14      0
  admin            10   138      9
  manage            0     7     67
table(true = bwmale$job, pred = predict(bw_olm, type = "class"))
           pred
true        custodial admin manage
  custodial        13    14      0
  admin            10   144      3
  manage            0    31     43




m-1 = 2 인 binary logit model과 ordered model을 비교하기

m-1 = 2 이므로 하나의 임계값에 대해 하나씩 binary logit model을 두어 추정할 것이다.
각 범주에 대해 서로 다른 절편을 얻고 각 임계값에 대해 서로 다른 기울기 매개변수도 얻는다.
모델은 custodial vs “not custodial” 응답에 대한 하나의 이진 모델과, manage vs “not manage” 응답에 대한 하나의 이진 모델을 설정했다.

bw_logit1 <- glm(I(job != "custodial") ~ education + minority,
                 family = binomial, data = bwmale)
bw_logit2 <- glm(I(job == "manage") ~ education + minority,
                 family = binomial, data = bwmale)

modelsummary(list("Custodial/Not custodial" = bw_logit1, "Manage/Not manage"  = bw_logit2),
             fmt = 3, estimate = "{estimate}{stars}")
Custodial/Not custodial Manage/Not manage
(Intercept) -5.062*** -26.215***
(1.148) (4.312)
education 0.586*** 1.645***
(0.095) (0.277)
minorityyes -0.481 -2.120**
(0.509) (0.794)
Num.Obs. 258 258
AIC
BIC
Log.Lik.
F 20.052 18.155
RMSE 0.26 0.26

결론적으로, 이 경우 병렬 회귀 가정(Parallel regression assumption)이 위반된 것으로 보인다. 즉, POLR 및 ordered probit 모델이 이 데이터 세트에 적합하지 않다는 것이다. 앞서 설명한 바와 같이 “custodial” vs “admin”, “admin” vs “manage”를 각각 담당하는 잠재 프로세스가 상이하기 때문에 이러한 결과는 그럴듯하다.




6.3. Extensions

Ordered logit and probit 모델을 사용하는 데는 두 가지 문제가 있다.

  1. 단일 지수와 parellel regression을 가정함

  2. 역치값 매개변수 \(\alpha_j\)는 모든 individuals에 일정하다. 즉, 공변량에 무관하다.


따라서 이러한 문제를 극복하는 일반화가 고려되어야 한다.




6.3.1. Generalized Threshold Models

일반화된 임계값 모델에서 임계값 매개변수는 공변량의 선형함수이다.

\[\alpha_{ij} = \tilde{\alpha}_j + {x_i}^\tau r_j\]




확률 모델:


\(\pi_{ij} = H(\tilde{\alpha}_j + {x_i}^\tau \gamma_j - {x_i}^\tau \beta) - H(\tilde{\alpha}_{j-1} + {x_i}^\tau \gamma_{j-1} - {x_i}^\tau \beta)\)
\(= H(\tilde{\alpha}_j - {x_i}^\tau \beta_j) - H(\tilde{\alpha}_{j-1} - {x_i}^\tau \beta_{j-1})\)



위 식에서 \(\beta_j = \beta - \gamma_j\)\(\beta 와 \gamma_j\)로 따로 구분할 수 없다.


6.3.2. Sequential models

일부 순서 변수는 연속적으로만 도달할 수 있는 범주를 아우르기도 한다.
예를 들면, 대학 학위 데이터에서 학사는 석사 학위에 필요한 전제 조건이다.

그러면 전이확률 \(y_i = j\)는 적어도 이 범주가 \(y_i \le j\)에 도달했다는 점에서 모델링이 가능하다.



확률 모델:


\[P(y_i = j | y_i \ge j, x_i) = H(\alpha_j - {x_i}^\tau \beta)\]



다시, 범주별 매개변수 \(\beta_j\)를 사용하여 모델을 일반화할 수 있다.

★ There is a problem in that when the current code is compiled, the formula does not appear, and when the formula is compiled, the code does not appear. ★






Reference

https://discdown.org/microeconometrics/ordered-response-models.html

LS0tDQp0aXRsZTogIk9yZGVyZWQgUmVzcG9uc2UgTW9kZWxzIg0KYXV0aG9yOiBzZW9uZ3N1LCBLaW0NCmRhdGU6IDAxLzAyLzIwMjMNCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIOydtOyghCDsnqXsl5DshJwg67aI65+s7JisIOuNsOydtO2EsA0KYGBge3J9DQpsaWJyYXJ5KCJubmV0IikNCmRhdGEoIkJhbmtXYWdlcyIsIHBhY2thZ2UgPSAiQUVSIikNCg0KQmFua1dhZ2VzJGVkY2F0IDwtIGZhY3RvcihCYW5rV2FnZXMkZWR1Y2F0aW9uKQ0KbGV2ZWxzKEJhbmtXYWdlcyRlZGNhdClbMzoxMF0gPC0gcmVwKGMoIjE0LTE1IiwgIjE2LTE4IiwgIjE5LTIxIiksIGMoMiwgMywgMykpDQoNCmJ3X3RhYiA8LSB4dGFicyh+IGdlbmRlciArIG1pbm9yaXR5ICsgZWRjYXQgKyBqb2IsIGRhdGEgPSBCYW5rV2FnZXMpDQoNCmJ3bWFsZSA8LSBzdWJzZXQoQmFua1dhZ2VzLCBnZW5kZXIgPT0gIm1hbGUiKQ0KYndfbW5sIDwtIG11bHRpbm9tKGpvYiB+IGVkdWNhdGlvbiArIG1pbm9yaXR5LA0KICAgICAgICAgICAgICAgICAgIGRhdGEgPSBid21hbGUsIHRyYWNlID0gRkFMU0UpDQpgYGANCg0KXA0KXA0KXA0KDQojIDYuIE9yZGVyZWQgUmVzcG9uc2UgTW9kZWxzDQoNCiMjIDYuMi4gU3RhbmRhcmQgT3JkZXJlZCBSZXNwb25zZSBNb2RlbHMNCg0K642w7J207YSwIO2DkOyDieydhCDsnITtlbQg67aE7ZWg7ZGc66W8IOunjOuToOuLpC4NCmBgYHtyfQ0KYndfdGFiIDwtIHh0YWJzKH5taW5vcml0eSArIGVkY2F0ICsgam9iLCBkYXRhID0gYndtYWxlKQ0KZnRhYmxlKGJ3X3RhYiwgY29sLnZhcnMgPSAiZWRjYXQiKQ0KYGBgDQpcDQpcDQoNCuuqqOuToCDrs4DsiJjsnZgg6rO164+ZIOu2hO2PrOulvCDsgqzsmqntlZjsl6wg642w7J207YSw66W8IOyLnOqwge2ZlO2VtOuzuOuLpC4NCmBgYHtyfQ0KcGFyKG1mcm93ID0gYygyLDIpKQ0KbW9zYWljcGxvdChid190YWIsIG9mZiA9IGMoNSwgMCwgMCksDQogICAgICAgICAgIGRpciA9IGMoInYiLCAidiIsICJoIiksIGNvbCA9IHJldihncmF5LmNvbG9ycygzKSksIG1haW4gPSAiIikNCg0KbW9zYWljcGxvdChid190YWJbMSwsXSwgb2ZmID0gMCwgY29sID0gcmV2KGdyYXkuY29sb3JzKDMpKSwgbWFpbiA9ICJtaW5vcml0eSA9IG5vIikNCm1vc2FpY3Bsb3QoYndfdGFiWzIsLF0sIG9mZiA9IDAsIGNvbCA9IHJldihncmF5LmNvbG9ycygzKSksIG1haW4gPSAibWlub3JpdHkgPSB5ZXMiKQ0KYGBgDQoNClwNClwNCg0KTUFTUyDtjKjtgqTsp4DsnZggcG9scigpIO2VqOyImOuKlCBsb2dpdCDrmJDripQgcHJvYml0IGxpbmvqsIAg7J6I64qUIOuqqOuNuOydhCDsoJzqs7XtlZzri6QuIGNsbSgp7J2AIOuPmeydvO2VnCDrqqjrjbjrv5Drp4wg7JWE64uI6528IOy2lOqwgCDrp4Htgawg7ZWo7IiYIOuwjyDqtazsobDtmZTrkJwg7J6E6rOE6rCS6rO8IOqwmeydgCDrjZQg66eO7J2AIOycoOyXsOyEseydhCDsoJzqs7XtlZzri6QuIOuYkO2VnCBjbG1tKCnsnYQg7IKs7Jqp7ZWY66m0IOustOyekeychCDtmqjqs7zrpbwg7Y+s7ZWo7ZWgIOyImCDsnojri6QuDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShNQVNTKQ0KDQpid19vbG0gPC0gcG9scihqb2IgfiBlZHVjYXRpb24gKyBtaW5vcml0eSwgZGF0YSA9IGJ3bWFsZSwgSGVzcyA9IFRSVUUpDQpzdW1tYXJ5KGJ3X29sbSkNCmBgYA0KKiplZHVjYXRpb24g67CPIG1pbm9yaXR5IOuzgOyImOuhnCDshKTrqoXrkJjripQgam9iIGNhdGVnb3J5IOuqqOuNuCoqDQpcDQpcDQoNCuqysOqzvOyXkOuKlCDsoIjtjrjsnbQg7JeG6rOgIGVkdWNhdGlvbuqzvCBtaW5vcml0eeydmCDqs4TsiJjrp4wg7Y+s7ZWo65CY66mwLCDrsJjrk5zsi5wg7Iic7ISc6rCAIOyngOygleuQnCBjdXN0b2RpYWwgfCBhZG1pbiDrsI8gYWRtaW4gfCBtYW5hZ2VtZW50IOyCrOydtOydmCDsnoTqs4TqsJLrp4wg7Y+s7ZWo65Cc64ukLiBqb2IgY2F0ZWdvcnnsnZgg7J6g7J6sIOyymeuPhOyXkOyEnCBlZHVjYXRpb27snbQg6riN7KCV7KCBLCBtaW5vcml0eeqwgCDrtoDsoJXsoIEg7JiB7Zal7J2EIOuvuOy5nOuLpOuKlCDqsoPsnYQg7JWMIOyImCDsnojri6QuDQoNClwNClwNCg0K6rOE7IiYIO2FjOyKpO2KuCDrsI8g7Jqw64+E67mEIO2FjOyKpO2KuDoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjb2VmZmljaWVudHMoYndfb2xtKQ0KDQpsaWJyYXJ5KGxtdGVzdCkNCmxydGVzdChid19vbG0pDQpgYGANCg0KXA0KXA0KXA0KDQpPcmRlcmVkIHByb2JpdCDrqqjrjbjsnYAg64uk7J2MIOy9lOuTnOulvCDthrXtlbQg7IOd7ISx7ZWgIOyImCDsnojri6QuDQpgYGB7cn0NCmJ3X29wbSA8LSBwb2xyKGpvYiB+IGVkdWNhdGlvbiArIG1pbm9yaXR5LCBkYXRhID0gYndtYWxlLA0KICAgICAgICAgICAgICAgSGVzcyA9IFRSVUUsIG1ldGhvZCA9ICJwcm9iaXQiKQ0KDQojIGZ1bmN0aW9uKCkg7ZWo7IiY66W8IOyCrOyaqe2VmOuKlCDrsKnrspXrj4Qg7J6I64ukLg0KIyBid19vcG0gPC0gdXBkYXRlKGJ3X29sZCwgbWV0aG9kID0gInByb2JpdCIpDQpgYGANCg0KXA0KXA0KXA0KDQrqsrDqs7zsoIHsnLzroZwg66Gc7KeT6rO8IO2UhOuhnOu5lyDrqqjrjbjsnYAg7Jyg7IKs7ZWcIOqysOqzvOulvCDrs7TsnbTqs6Ag7J6I64ukLg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkobW9kZWxzdW1tYXJ5KQ0KDQptb2RlbHN1bW1hcnkobGlzdCgiUHJvYml0IG1vZGVsIiA9IGJ3X29wbSwNCiAgICAgICAgICAgICAgICAgICJMb2dpdCBtb2RlbCIgPSBid19vbG0pLCBmbXQgPSAzKQ0KYGBgDQoqKm1vZGVsc3VtbWFyeSgp66W8IO2Gte2VnCDsoJXrpqwqKg0KDQpcDQpcDQpcDQoNCuuqqOuNuOydmCDsoIHtlanrj4Trpbwg7Y+J6rCA7ZWY6riwIOychO2VtCDtmLzrj5kg7ZaJ66Cs7J2EIOqzhOyCsO2VtOuzvCDsiJgg7J6I64ukLg0KYGBge3J9DQp0YWJsZSh0cnVlID0gYndtYWxlJGpvYiwgcHJlZCA9IHByZWRpY3QoYndfb2xtLCB0eXBlID0gImNsYXNzIikpDQpgYGANClwNCmBgYHtyfQ0KcHJlZGljdChid19vbG0sIG5ld2RhdGEgPSBid21hbGVbMjUsIF0sIHR5cGUgPSAicHJvYnMiKQ0KDQpwcmVkaWN0KGJ3X29sbSwgbmV3ZGF0YSA9IGJ3bWFsZVsyNSwgXSwgdHlwZSA9ICJjbGFzcyIpDQpgYGANCg0KXA0KXA0KXA0KDQojIyA2LjIuMy4gUGFyYWxsZWwgcmVncmVzc2lvbiBhc3N1bXB0aW9uDQoNCm11bHRpbm9taWFsIG1vZGVs6rO8IG9yZGVyZWQgbG9naXQvcHJvYml0IG1vZGVsc+ulvCDruYTqtZDtlZjquLANClwNCioqZGF0YTogYmFuayB3YWdlcyjslZ7snZgg7JiI7Iuc7JmAIOuPmeydvCkqKg0KXA0KXA0KDQpgYGB7cn0NCmxpYnJhcnkobm5ldCkNCmJ3X21ubCA8LSBtdWx0aW5vbShqb2IgfiBlZHVjYXRpb24gKyBtaW5vcml0eSwgZGF0YSA9IGJ3bWFsZSwgdHJhY2UgPSBGQUxTRSkNCkFJQyhid19tbmwsIGJ3X29sbSwgYndfb3BtKQ0KYGBgDQoNClwNClwNCg0KYGBge3J9DQpBSUMoYndfbW5sLCBid19vbG0sIGJ3X29wbSwgayA9IGxvZyhucm93KGJ3bWFsZSkpKQ0KYGBgDQptdWx0aW5vbWlhbCBtb2RlbOydmCBBSUPqsJLsnbQg6rCA7J6lIOuCruqzoCwgb3JkZXJlZCBsb2dpdC9wcm9iaXQg66qo642465Ok7J2AIOu5hOyKt+2VmOuLpC4NClwNCuuYkO2VnCBCSUPrpbwg6rOE7IKw7ZWY6riwIOychO2VtCDroZzqt7jsl5Ag64yA7ZWcIO2MqOuEkO2LsOulvCDspp3qsIDsi5zsvJzrj4QgbXVsdGlub21pYWwg66qo64247J20IOqwgOyepSDsnpgg7IiY7ZaJ65Cc64ukLg0KDQpcDQpcDQpcDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGVmZmVjdHMpDQoNCmVmZl9tbmwgPC0gYWxsRWZmZWN0cyhid19tbmwsIHhsZXZlbHMgPSBsaXN0KGVkdWNhdGlvbiA9IDUwKSkNCmVmZl9vbG0gPC0gYWxsRWZmZWN0cyhid19vbG0sIHhsZXZlbHMgPSBsaXN0KGVkdWNhdGlvbiA9IDUwKSkNCg0KcGxvdChlZmZfb2xtLCBtdWx0aWxpbmUgPSBUUlVFKQ0KYGBgDQoqKmVkdWNhdGlvbiDrsI8gbWlub3JpdHkg7Zqo6rO8IO2UjOuhryAtIE9yZGVyZWQgTW9kZWwqKg0KDQpcDQoNCmBgYHtyfQ0KcGxvdChlZmZfbW5sLCBtdWx0aWxpbmUgPVRSVUUpDQpgYGANCioqZWR1Y2F0aW9uIOuwjyBtaW5vcml0eSDtmqjqs7wg7ZSM66GvIC0gTXVsdGlub21pYWwgTW9kZWwqKg0KDQpcDQrrkZAg66qo6424IOuqqOuRkCBhZG1pbuqzvCBtYW5hZ2VtZW50IOyCrOydtOydmCDsoITtmZjsnbQg64Kg7Lm066Gt64ukKOq4sOyauOq4sOqwgCDtgazri6Q/KS5cDQrspoksIOydvOyglSDsiJjspIAg7J207IOB7J2YIOq1kOycoeydhCDqsbDsuZjrqbQgbWFuYWdlbWVudOuhnCDsnbztlZjqsowg65CgIOqwgOuKpeyEseydtCDquInqsqntnogg64aS7JWE7KeE64ukLiDsnbQg65GQIOuylOyjvCDsgqzsnbTsl5DripQg7IOB64yA7KCB7Jy866GcIOuqhe2Zle2VnCBlZHVjYXRpb27snZgg7Zqo6rO86rCAIOyeiOyngOunjCwgY3VzdG9kaWFs6rO8IGFkbWluIOyCrOydtOyXkOuKlCDrj5nsnbztlZjqsowg66eQ7ZWgIOyImCDsl4bri6QuIGN1c3RvZGlhbCDqt7zroZzsnpDripQg642UIOunjuydgCDqtZDsnKHsnYQg67Cb7J2AIO2bhOyXkCBhZG1pbiDrspTso7zroZwg7Iq57KeE7ZWY64qUIOqyg+ydtCDslYTri4jrnbwg64uo7Iic7Z6IIOuLpOuluCDqtqTsoIHsnbwg67+Q7J2064ukLiDqt7jrn6zrgpggcHJvcG9ydGlvbmFsIG9kZHMgbW9kZWwo7KCE7J6QKSDsl5DshJzripQgY3VzdG9kaWFs6rO8IGFkbWluIOuRkCDqs6HshKDsnbQg7Y+J7ZaJ7ZWY6rOgIOyEnOuhnCDri6Trpbgg7J6E6rOE6rCS7JeQ7IScIOyEnOuhnCDri6Trpbgg7Zqo6rO866W8IOqwgOyniCDqsIDriqXshLHsnbQg7JeG7Jy866+A66GcIOydtCDqsr3smrAgbXVsdGlub21pYWwgbW9kZWwo7ZuE7J6QKeydtCDrjZQg7KCB7ZWp7ZWY64ukLg0KDQpcDQpcDQpcDQoNCuygle2ZleuPhOulvCDtj4nqsIDtlZjquLAg7JyE7ZWcIOu2hO2VoO2RnDogbXVsdGlub21pYWwg67CPIG9yZGVyZWQgbW9kZWwg7JiI7LihDQpgYGB7cn0NCnRhYmxlKHRydWUgPSBid21hbGUkam9iLCBwcmVkID0gcHJlZGljdChid19tbmwsIHR5cGUgPSAiY2xhc3MiKSkNCnRhYmxlKHRydWUgPSBid21hbGUkam9iLCBwcmVkID0gcHJlZGljdChid19vbG0sIHR5cGUgPSAiY2xhc3MiKSkNCmBgYA0KDQpcDQpcDQpcDQoNCiMjIyBtLTEgPSAyIOyduCBiaW5hcnkgbG9naXQgbW9kZWzqs7wgb3JkZXJlZCBtb2RlbOydhCDruYTqtZDtlZjquLANCg0KbS0xID0gMiDsnbTrr4DroZwg7ZWY64KY7J2YIOyehOqzhOqwkuyXkCDrjIDtlbQg7ZWY64KY7JSpIGJpbmFyeSBsb2dpdCBtb2RlbOydhCDrkZDslrQg7LaU7KCV7ZWgIOqyg+ydtOuLpC4NClwNCuqwgSDrspTso7zsl5Ag64yA7ZW0IOyEnOuhnCDri6Trpbgg7KCI7Y647J2EIOyWu+qzoCDqsIEg7J6E6rOE6rCS7JeQIOuMgO2VtCDshJzroZwg64uk66W4IOq4sOyauOq4sCDrp6TqsJzrs4DsiJjrj4Qg7Ja764qU64ukLg0KXA0K66qo64247J2AIGN1c3RvZGlhbCB2cyAibm90IGN1c3RvZGlhbCIg7J2R64u17JeQIOuMgO2VnCDtlZjrgpjsnZgg7J207KeEIOuqqOuNuOqzvCwgbWFuYWdlIHZzICJub3QgbWFuYWdlIiDsnZHri7Xsl5Ag64yA7ZWcIO2VmOuCmOydmCDsnbTsp4Qg66qo64247J2EIOyEpOygle2WiOuLpC4NCg0KYGBge3J9DQpid19sb2dpdDEgPC0gZ2xtKEkoam9iICE9ICJjdXN0b2RpYWwiKSB+IGVkdWNhdGlvbiArIG1pbm9yaXR5LA0KICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbCwgZGF0YSA9IGJ3bWFsZSkNCmJ3X2xvZ2l0MiA8LSBnbG0oSShqb2IgPT0gIm1hbmFnZSIpIH4gZWR1Y2F0aW9uICsgbWlub3JpdHksDQogICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsLCBkYXRhID0gYndtYWxlKQ0KDQptb2RlbHN1bW1hcnkobGlzdCgiQ3VzdG9kaWFsL05vdCBjdXN0b2RpYWwiID0gYndfbG9naXQxLCAiTWFuYWdlL05vdCBtYW5hZ2UiICA9IGJ3X2xvZ2l0MiksDQogICAgICAgICAgICAgZm10ID0gMywgZXN0aW1hdGUgPSAie2VzdGltYXRlfXtzdGFyc30iKQ0KYGBgDQoNCuqysOuhoOyggeycvOuhnCwg7J20IOqyveyasCDrs5HroKwg7ZqM6reAIOqwgOyglShQYXJhbGxlbCByZWdyZXNzaW9uIGFzc3VtcHRpb24p7J20IOychOuwmOuQnCDqsoPsnLzroZwg67O07J2464ukLiDspoksIFBPTFIg67CPIG9yZGVyZWQgcHJvYml0IOuqqOuNuOydtCDsnbQg642w7J207YSwIOyEuO2KuOyXkCDsoIHtlantlZjsp4Ag7JWK64uk64qUIOqyg+ydtOuLpC4g7JWe7IScIOyEpOuqhe2VnCDrsJTsmYAg6rCZ7J20ICJjdXN0b2RpYWwiIHZzICJhZG1pbiIsICJhZG1pbiIgdnMgIm1hbmFnZSLrpbwg6rCB6rCBIOuLtOuLue2VmOuKlCDsnqDsnqwg7ZSE66Gc7IS47Iqk6rCAIOyDgeydtO2VmOq4sCDrlYzrrLjsl5Ag7J2065+s7ZWcIOqysOqzvOuKlCDqt7jrn7Trk6/tlZjri6QuDQoNClwNClwNClwNCg0KIyMgNi4zLiBFeHRlbnNpb25zDQoNCk9yZGVyZWQgbG9naXQgYW5kIHByb2JpdCDrqqjrjbjsnYQg7IKs7Jqp7ZWY64qUIOuNsOuKlCDrkZAg6rCA7KeAIOusuOygnOqwgCDsnojri6QuDQpcDQpcDQoNCjEuIOuLqOydvCDsp4DsiJjsmYAgcGFyZWxsZWwgcmVncmVzc2lvbuydhCDqsIDsoJXtlahcDQoNCjIuIOyXrey5mOqwkiDrp6TqsJzrs4DsiJggJFxhbHBoYV9qJOuKlCDrqqjrk6AgaW5kaXZpZHVhbHPsl5Ag7J287KCV7ZWY64ukLiDspoksIOqzteuzgOufieyXkCDrrLTqtIDtlZjri6QuDQoNClwNCg0K65Sw65287IScIOydtOufrO2VnCDrrLjsoJzrpbwg6re567O17ZWY64qUIOydvOuwmO2ZlOqwgCDqs6DroKTrkJjslrTslbwg7ZWc64ukLg0KDQpcDQpcDQpcDQoNCiMjIyA2LjMuMS4gR2VuZXJhbGl6ZWQgVGhyZXNob2xkIE1vZGVscw0KDQrsnbzrsJjtmZTrkJwg7J6E6rOE6rCSIOuqqOuNuOyXkOyEnCDsnoTqs4TqsJIg66ek6rCc67OA7IiY64qUIOqzteuzgOufieydmCDshKDtmJXtlajsiJjsnbTri6QuDQpcDQpcDQoNCiQkXGFscGhhX3tpan0gPSBcdGlsZGV7XGFscGhhfV9qICsge3hfaX1eXHRhdSByX2okJA0KDQpcDQpcDQpcDQoNCu2ZleuloCDrqqjrjbg6DQoNClwNCiRccGlfe2lqfSA9IEgoXHRpbGRle1xhbHBoYX1faiArIHt4X2l9Xlx0YXUgXGdhbW1hX2ogLSB7eF9pfV5cdGF1IFxiZXRhKSAtIEgoXHRpbGRle1xhbHBoYX1fe2otMX0gKyB7eF9pfV5cdGF1IFxnYW1tYV97ai0xfSAtIHt4X2l9Xlx0YXUgXGJldGEpJA0KXA0KJD0gSChcdGlsZGV7XGFscGhhfV9qIC0ge3hfaX1eXHRhdSBcYmV0YV9qKSAtIEgoXHRpbGRle1xhbHBoYX1fe2otMX0gLSB7eF9pfV5cdGF1IFxiZXRhX3tqLTF9KSQNCg0KXA0KXA0K7JyEIOyLneyXkOyEnCAkXGJldGFfaiA9IFxiZXRhIC0gXGdhbW1hX2ok64qUICRcYmV0YSDsmYAgXGdhbW1hX2ok66GcIOuUsOuhnCDqtazrtoTtlaAg7IiYIOyXhuuLpC4NClwNClwNClwNCg0KIyMjIDYuMy4yLiBTZXF1ZW50aWFsIG1vZGVscw0KDQrsnbzrtoAg7Iic7IScIOuzgOyImOuKlCDsl7Dsho3soIHsnLzroZzrp4wg64+E64us7ZWgIOyImCDsnojripQg67KU7KO866W8IOyVhOyasOultOq4sOuPhCDtlZzri6QuXA0K7JiI66W8IOuTpOuptCwg64yA7ZWZIO2VmeychCDrjbDsnbTthLDsl5DshJwg7ZWZ7IKs64qUIOyEneyCrCDtlZnsnITsl5Ag7ZWE7JqU7ZWcIOyghOygnCDsobDqsbTsnbTri6QuXA0KXA0K6re465+s66m0IOyghOydtO2ZleuloCAkeV9pID0gaiTripQg7KCB7Ja064+EIOydtCDrspTso7zqsIAgJHlfaSBcbGUgaiTsl5Ag64+E64us7ZaI64uk64qUIOygkOyXkOyEnCDrqqjrjbjrp4HsnbQg6rCA64ql7ZWY64ukLg0KDQpcDQpcDQoNCu2ZleuloCDrqqjrjbg6DQoNClwNCiQkUCh5X2kgPSBqIHwgeV9pIFxnZSBqLCB4X2kpID0gSChcYWxwaGFfaiAtIHt4X2l9Xlx0YXUgXGJldGEpJCQNCg0KXA0KXA0K64uk7IucLCDrspTso7zrs4Qg66ek6rCc67OA7IiYICRcYmV0YV9qJOulvCDsgqzsmqntlZjsl6wg66qo64247J2EIOydvOuwmO2ZlO2VoCDsiJgg7J6I64ukLg0KXA0KXA0KDQoNCj4g4piFIFRoZXJlIGlzIGEgcHJvYmxlbSBpbiB0aGF0IHdoZW4gdGhlIGN1cnJlbnQgY29kZSBpcyBjb21waWxlZCwgdGhlIGZvcm11bGEgZG9lcyBub3QgYXBwZWFyLCBhbmQgd2hlbiB0aGUgZm9ybXVsYSBpcyBjb21waWxlZCwgdGhlIGNvZGUgZG9lcyBub3QgYXBwZWFyLiDimIUgDQoNClwNClwNClwNClwNClwNCg0KIyBSZWZlcmVuY2UNCj5odHRwczovL2Rpc2Nkb3duLm9yZy9taWNyb2Vjb25vbWV0cmljcy9vcmRlcmVkLXJlc3BvbnNlLW1vZGVscy5odG1sDQoNCg0KDQo=