Decision Tree

2.1 Decision Tree

  • 순수도를 더 이상 높일 수 없거나, 말단 노드에 포함된 개체의 수가 사전에 정한 최소값에 도달하였을 때, 노드의 깊이가 사전에 정해놓은 한계에 이를때 재귀적 분할 반복이 일어난다.

지니척도

  • 복원 추출했을때의 동일 범주가 개체가 선택될 확률
  • 지니계수가 크면, 순수도가 낮음 : 균등할수록 0.5 에 수렴
  • 순수도가 높은 변수로 가지치기
  • 순수도 = 1- 불순도

엔트로피

  • 무질서의 정도
  • 엔트로피가 클수록 순수도가 낮음
  • 엔트로피가 가장 작은 예측 변수와 이떄의 최적의 분리 규칙에 따라 자식 마디를 형성함

2.1.1 Binary Prediction

가지치기 기준 9~10개

  • 너무 많이 가지기를 하면 모델이 복잡해지기 때문에 9개로 지정

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 5415  253
##          1  260  600
##                                           
##                Accuracy : 0.9214          
##                  95% CI : (0.9146, 0.9278)
##     No Information Rate : 0.8693          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.6553          
##                                           
##  Mcnemar's Test P-Value : 0.7911          
##                                           
##             Sensitivity : 0.9542          
##             Specificity : 0.7034          
##          Pos Pred Value : 0.9554          
##          Neg Pred Value : 0.6977          
##              Prevalence : 0.8693          
##          Detection Rate : 0.8295          
##    Detection Prevalence : 0.8683          
##       Balanced Accuracy : 0.8288          
##                                           
##        'Positive' Class : 0               
## 
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 5585  706
##          1   90  147
##                                           
##                Accuracy : 0.8781          
##                  95% CI : (0.8699, 0.8859)
##     No Information Rate : 0.8693          
##     P-Value [Acc > NIR] : 0.0183          
##                                           
##                   Kappa : 0.2257          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.9841          
##             Specificity : 0.1723          
##          Pos Pred Value : 0.8878          
##          Neg Pred Value : 0.6203          
##              Prevalence : 0.8693          
##          Detection Rate : 0.8555          
##    Detection Prevalence : 0.9637          
##       Balanced Accuracy : 0.5782          
##                                           
##        'Positive' Class : 0               
## 
  • 9개가 더 높은 정확도를 보여준다.

예측하기

## [1] 0
## Levels: 0 1
## [1] 0
## Levels: 0 1

2.1.1 multile level Prediction

Target 을 1,2,3 으로 나눈다.

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    1    2    3
##          1  363  185    0
##          2  265 5351    6
##          3    4  141  213
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9079          
##                  95% CI : (0.9007, 0.9148)
##     No Information Rate : 0.8696          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.6181          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity           0.57437   0.9426  0.97260
## Specificity           0.96862   0.6816  0.97702
## Pos Pred Value        0.66241   0.9518  0.59497
## Neg Pred Value        0.95502   0.6402  0.99903
## Prevalence            0.09681   0.8696  0.03355
## Detection Rate        0.05561   0.8197  0.03263
## Detection Prevalence  0.08395   0.8612  0.05484
## Balanced Accuracy     0.77149   0.8121  0.97481

2.1.2 연속형 변수에 대한 Decision Tree

c_thinkess 의 수를 예측한다.

## [1] 24.1 23.1 20.5 34.3 36.7 33.8
## [1] 24.11343 24.11343

KNN

  • 새로운 점이 주어졌을 때, 그 점으로부터 가까운 점 K개를 이용
  • 오분류율이 낮은 K를 선정
  • 범주, 연속형 변수 사용이 가능하지만, X가 연속형인것들
## k-Nearest Neighbors 
## 
## 15229 samples
##     9 predictor
##     2 classes: '0', '1' 
## 
## Pre-processing: centered (9), scaled (9) 
## Resampling: Bootstrapped (25 reps) 
## Summary of sample sizes: 15229, 15229, 15229, 15229, 15229, 15229, ... 
## Resampling results across tuning parameters:
## 
##   k   Accuracy   Kappa    
##    1  0.8865206  0.4733409
##    2  0.8819025  0.4517897
##    3  0.8850261  0.4539919
##    4  0.8872547  0.4541364
##    5  0.8912186  0.4596264
##    6  0.8930416  0.4608583
##    7  0.8949264  0.4620850
##    8  0.8952960  0.4589429
##    9  0.8965841  0.4591509
##   10  0.8963488  0.4546513
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 9.

##   k
## 9 9
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 5574  471
##          1  108  375
##                                           
##                Accuracy : 0.9113          
##                  95% CI : (0.9041, 0.9181)
##     No Information Rate : 0.8704          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.519           
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
##                                           
##             Sensitivity : 0.9810          
##             Specificity : 0.4433          
##          Pos Pred Value : 0.9221          
##          Neg Pred Value : 0.7764          
##              Prevalence : 0.8704          
##          Detection Rate : 0.8539          
##    Detection Prevalence : 0.9260          
##       Balanced Accuracy : 0.7121          
##                                           
##        'Positive' Class : 0               
## 

i{r}

LS0tDQp0aXRsZTogIlN1cGVydmlzZWQgMiINCmF1dGhvcjogIkRPRVVOIg0KZGF0ZTogJzIwMjEgMyAyMiAnDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICAjIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogemVuYnVybg0KICAgICMgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogImZsYXRseSINCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCi0tLQ0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUUpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJ1c2VmdWwiKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShnbHVlKQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmxpYnJhcnkodXNlZnVsKQ0KbGlicmFyeShjbHVzdGVyKSAjay1tZWRvaWQg7ZWo7IiYIA0KbGlicmFyeShwUk9DKQ0KbGlicmFyeSh0cmVlKQ0KYGBgDQoNCg0KDQojIyMgRGVjaXNpb24gVHJlZSANCg0KMi4xIERlY2lzaW9uIFRyZWUgDQoNCisg7Iic7IiY64+E66W8IOuNlCDsnbTsg4Eg64aS7J28IOyImCDsl4bqsbDrgpgsIOunkOuLqCDrhbjrk5zsl5Ag7Y+s7ZWo65CcIOqwnOyytOydmCDsiJjqsIAg7IKs7KCE7JeQIOygle2VnCDstZzshozqsJLsl5Ag64+E64us7ZWY7JiA7J2EIOuVjCwg64W465Oc7J2YIOq5iuydtOqwgCDsgqzsoITsl5Ag7KCV7ZW064aT7J2AIO2VnOqzhOyXkCDsnbTrpbzrlYwg7J6s6reA7KCBIOu2hO2VoCDrsJjrs7XsnbQg7J287Ja064Kc64ukLiANCg0KKioq7KeA64uI7LKZ64+EKioqIA0KDQorIOuzteybkCDstpTstpztlojsnYTrlYzsnZgg64+Z7J28IOuylOyjvOqwgCDqsJzssrTqsIAg7ISg7YOd65CgIO2ZleuloCANCisg7KeA64uI6rOE7IiY6rCAIO2BrOuptCwg7Iic7IiY64+E6rCAIOuCruydjCA6IOq3oOuTse2VoOyImOuhnSAwLjUg7JeQIOyImOugtCANCisg7Iic7IiY64+E6rCAIOuGkuydgCDrs4DsiJjroZwg6rCA7KeA7LmY6riwIA0KKyDsiJzsiJjrj4QgPSAxLSDrtojsiJzrj4QgDQoNCioqKuyXlO2KuOuhnO2UvCoqKiANCg0KKyDrrLTsp4jshJzsnZgg7KCV64+EIA0KKyDsl5TtirjroZztlLzqsIAg7YG07IiY66GdIOyInOyImOuPhOqwgCDrgq7snYwgDQorIOyXlO2KuOuhnO2UvOqwgCDqsIDsnqUg7J6R7J2AIOyYiOy4oSDrs4DsiJjsmYAg7J2065aE7J2YIOy1nOyggeydmCDrtoTrpqwg6rec7LmZ7JeQIOuUsOudvCDsnpDsi50g66eI65SU66W8IO2YleyEse2VqCANCg0KMi4xLjEgQmluYXJ5IFByZWRpY3Rpb24gDQoNCmBgYHtyfQ0KDQpzZXR3ZCgiQzovVXNlcnMvQWRtaW5pc3RyYXRvci9EZXNrdG9wL1IgQW5hbHlzaXMiKQ0KDQpyZWFkLmNzdignYXV0b3BhcnRzLmNzdicpIC0+IGF1dG9wYXJ0DQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgICBTZWxlY3RpbmcgRmVhdHVyZXMgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQphdXRvcGFydCAlPiUgDQogIGZpbHRlcihwcm9kX25vID09ICI5MDc4NC03NjAwMSIpICU+JSANCiAgZmlsdGVyKGNfdGhpY2tuZXNzIDwgMTAwMCkgJT4lIA0KICBmaWx0ZXIoaGlnaHByZXNzdXJlX3RpbWUgPCAxMDAwKSAlPiUgIA0KICBtdXRhdGUodGFyZ2V0ID0gaWZlbHNlKGNfdGhpY2tuZXNzPDIwfCBjX3RoaWNrbmVzcz4zMiwxICwwKSAlPiUgDQogICAgICAgICAgIGFzLmZhY3RvcigpKSAlPiUgDQogIHNlbGVjdCgtcHJvZF9ubywgLWNfdGhpY2tuZXNzKSAtPiBkZg0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgICB0cmFpbi90ZXN0IA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0Kc2V0LnNlZWQoMjAyMikNCg0Kc29ydChzYW1wbGUobnJvdyhkZiksIG5yb3coZGYpKjAuNykpIC0+IGZsYWcNCg0KdHJhaW4gPC0gZGZbZmxhZyxdDQp0ZXN0IDwtIGRmWy1mbGFnLF0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgIHRyZWUoKQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQp0cmVlKHRhcmdldH4uLCBkYXRhPXRyYWluKSAtPiB0cmVlUmF3DQoNCnBsb3QodHJlZVJhdykNCnRleHQodHJlZVJhdykNCmBgYA0KDQrqsIDsp4DsuZjquLAg6riw7KSAIDl+MTDqsJwgDQoNCisg64SI66y0IOunjuydtCDqsIDsp4DquLDrpbwg7ZWY66m0IOuqqOuNuOydtCDrs7XsnqHtlbTsp4DquLAg65WM66y47JeQIDnqsJzroZwg7KeA7KCVIA0KDQpgYGB7cn0NCg0KY3YudHJlZSh0cmVlUmF3LCBGVU4gPSBwcnVuZS5taXNjbGFzcykgLT4gY3ZfdHJlZQ0KDQpwbG90KGN2X3RyZWUpDQpgYGANCg0KDQpgYGB7cn0NCg0KcHJ1bmUudHJlZSh0cmVlUmF3LCBiZXN0PTkpLT5wcnVuZV90cmVlX25pbmUNCg0KcGxvdChwcnVuZV90cmVlX25pbmUpDQp0ZXh0KHBydW5lX3RyZWVfbmluZSkNCmBgYA0KDQoNCmBgYHtyfQ0KcHJ1bmUudHJlZSh0cmVlUmF3LCBiZXN0PTMpLT5wcnVuZV90cmVlX3RocmVlDQoNCnBsb3QocHJ1bmVfdHJlZV90aHJlZSkNCnRleHQocHJ1bmVfdHJlZV90aHJlZSkNCmBgYA0KDQoNCmBgYHtyfQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgIOqwgOyngCA56rCcIA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnByZWRpY3QocHJ1bmVfdHJlZV9uaW5lLCB0ZXN0LCB0eXBlID0gJ2NsYXNzJykgLT4gcHJlZF90ZXN0X25pbmUNCmNvbmZ1c2lvbk1hdHJpeChwcmVkX3Rlc3RfbmluZSwgdGVzdCR0YXJnZXQpDQpgYGANCg0KDQpgYGB7cn0NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgICDqsIDsp4AgM+qwnCANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpwcmVkaWN0KHBydW5lX3RyZWVfdGhyZWUsIHRlc3QsIHR5cGUgPSAnY2xhc3MnKSAtPiBwcmVkX3Rlc3RfdGhyZWUNCmNvbmZ1c2lvbk1hdHJpeChwcmVkX3Rlc3RfdGhyZWUsIHRlc3QkdGFyZ2V0KQ0KYGBgDQoNCisgOeqwnOqwgCDrjZQg64aS7J2AIOygle2ZleuPhOulvCDrs7Tsl6zspIDri6QuIA0KDQpgYGB7cn0NCmxpYnJhcnkoRXBpKQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgIOqwgOyngCA56rCcIA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUk9DKHRlc3Q9cHJlZF90ZXN0X25pbmUsIHN0YXQ9dGVzdCR0YXJnZXQsIHBsb3Q9IlJPQyIsIEFVQz1UKQ0KDQoNCg0KYGBgDQoNCg0KYGBge3J9DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICAg6rCA7KeAIDPqsJwgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpST0ModGVzdD1wcmVkX3Rlc3RfdGhyZWUsIHN0YXQ9dGVzdCR0YXJnZXQsIHBsb3Q9IlJPQyIsIEFVQz1UKQ0KYGBgDQoNCg0K7JiI7Lih7ZWY6riwIA0KDQoNCmBgYHtyfQ0KbmV3LmRhdGE9ZGF0YS5mcmFtZShmaXhfdGltZT04NyxhX3NwZWVkPTAuNjA5LGJfc3BlZWQ9MS43MTUsc2VwYXJhdGlvbj0yNDIuNyxzX3NlcGFyYXRpb249NjU3LjUscmF0ZV90ZXJtcz05NSxtcGE9NzgsbG9hZF90aW1lPTE4LjEsaGlnaHByZXNzdXJlX3RpbWU9ODIpDQoNCg0KcHJlZGljdChwcnVuZV90cmVlX25pbmUsIG5ld2RhdGEgPSBuZXcuZGF0YSwgdHlwZT0iY2xhc3MiKQ0KDQpwcmVkaWN0KHBydW5lX3RyZWVfdGhyZWUsIG5ld2RhdGEgPSBuZXcuZGF0YSwgdHlwZT0iY2xhc3MiKQ0KYGBgDQoNCjIuMS4xIG11bHRpbGUgbGV2ZWwgUHJlZGljdGlvbiANCg0KVGFyZ2V0IOydhCAxLDIsMyDsnLzroZwg64KY64iI64ukLiANCg0KYGBge3J9DQoNCmF1dG9wYXJ0ICU+JSANCiAgZmlsdGVyKHByb2Rfbm8gPT0gIjkwNzg0LTc2MDAxIikgJT4lIA0KICBmaWx0ZXIoY190aGlja25lc3MgPCAxMDAwKSAlPiUgDQogIGZpbHRlcihoaWdocHJlc3N1cmVfdGltZSA8IDEwMDApICU+JSAgDQogIG11dGF0ZSh0YXJnZXQgPSBpZmVsc2UoY190aGlja25lc3MgPDIwLDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNfdGhpY2tuZXNzIDwgMzIsIDIsMykpICU+JSANCiAgICAgICAgICAgICBhcy5mYWN0b3IoKSkgJT4lIA0KICBzZWxlY3QoLXByb2Rfbm8sIC1jX3RoaWNrbmVzcykgLT4gZGYxDQoNCg0KDQpzb3J0KHNhbXBsZShucm93KGRmMSksIG5yb3coZGYxKSowLjcpKSAtPiBmbGENCg0KdHJhaW4gPC1kZjFbZmxhLF0NCnRlc3QgPC0gZGYxWy1mbGEsXQ0KDQoNCg0KdHJlZSh0YXJnZXR+LiwgZGF0YT10cmFpbikgLT4gcmF3X3RyZWUNCg0KcGxvdChyYXdfdHJlZSkNCnRleHQocmF3X3RyZWUpDQpgYGANCg0KDQpgYGB7cn0NCg0KIyDsmKTrtoTrpZgg6riw7KSAIOqwgOyngOy5mOq4sCDquLDspIAg7ISg7KCVIA0KDQpjdi50cmVlKHJhd190cmVlLCBGVU49cHJ1bmUubWlzY2xhc3MpIC0+Y3ZfdHJlZQ0KDQpwbG90KGN2X3RyZWUpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnBydW5lLm1pc2NsYXNzKHJhd190cmVlLCBiZXN0PTkpIC0+cHJ1bmVkX3RyZWUNCg0KcGxvdChwcnVuZWRfdHJlZSkNCnRleHQocHJ1bmVkX3RyZWUpDQpgYGANCg0KDQpgYGB7cn0NCg0KcHJlZGljdChwcnVuZWRfdHJlZSwgdGVzdCwgdHlwZT0nY2xhc3MnKSAtPiBwcmVkX3RyZWVfOQ0KDQpjb25mdXNpb25NYXRyaXgocHJlZF90cmVlXzksIHRlc3QkdGFyZ2V0KQ0KYGBgDQoNCg0KYGBge3J9DQoNClJPQyh0ZXN0PXByZWRfdHJlZV85LCBzdGF0PXRlc3QkdGFyZ2V0LCBwbG90PSJST0MiLCBBVUM9VCkNCmBgYA0KDQoyLjEuMiDsl7Dsho3tmJUg67OA7IiY7JeQIOuMgO2VnCBEZWNpc2lvbiBUcmVlIA0KDQpjX3RoaW5rZXNzIOydmCDsiJjrpbwg7JiI7Lih7ZWc64ukLiANCg0KYGBge3J9DQoNCmF1dG9wYXJ0ICU+JSANCiAgc2VsZWN0KC1wcm9kX25vKSAtPmRmMg0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgVHJhaW4vVGVzdCDqtazrtoQgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnNvcnQoc2FtcGxlKG5yb3coZGYyKSwgbnJvdyhkZjIpKjAuNykpIC0+IGZsDQoNCmRmMltmbCxdIC0+IHRyYWluDQpkZjJbLWZsLF0gLT4gdGVzdA0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIOuqqOuNuCDsg53shLEgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnRyZWUoY190aGlja25lc3N+Zml4X3RpbWUrYV9zcGVlZCtiX3NwZWVkK3NlcGFyYXRpb24rc19zZXBhcmF0aW9uK3JhdGVfdGVybXMrDQogICAgICAgICAgIG1wYStsb2FkX3RpbWUraGlnaHByZXNzdXJlX3RpbWUsZGF0YT10cmFpbikgLT4gZGYyX3RyZWUNCg0KcGxvdChkZjJfdHJlZSkNCnRleHQoZGYyX3RyZWUpDQoNCg0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIOyYiOy4oQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpwcmVkaWN0KGRmMl90cmVlLCB0ZXN0KSAtPiBwcmVkX2RmMg0KDQpoZWFkKHRlc3QkY190aGlja25lc3MpDQoNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICBQcmVkaWN0IA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpuZXcuZGF0YT1kYXRhLmZyYW1lKGZpeF90aW1lPWMoODcsODUuNiksYV9zcGVlZD1jKDAuNjA5LDAuNDcyKSxiX3NwZWVkPWMoMS43MTUsMS42ODUpLHNlcGFyYXRpb249YygyNDIuNywyNDMuNCksc19zZXBhcmF0aW9uPWMoNjU3LjUsNjU3LjkpLHJhdGVfdGVybXM9Yyg5NSw5NSksbXBhPWMoNzgsMjguOCksbG9hZF90aW1lPWMoMTguMSwxOC4yKSxoaWdocHJlc3N1cmVfdGltZT1jKDgyLDYwKSkNCg0KDQpwcmVkaWN0KGRmMl90cmVlLCBuZXdkYXRhPW5ldy5kYXRhKQ0KDQpgYGANCg0KIyMjIEtOTiANCg0KKyDsg4jroZzsmrQg7KCQ7J20IOyjvOyWtOyhjOydhCDrlYwsIOq3uCDsoJDsnLzroZzrtoDthLAg6rCA6rmM7Jq0IOygkCBL6rCc66W8IOydtOyaqSANCisg7Jik67aE66WY7Jyo7J20IOuCruydgCBL66W8IOyEoOyglQ0KKyDrspTso7wsIOyXsOyGje2YlSDrs4DsiJgg7IKs7Jqp7J20IOqwgOuKpe2VmOyngOunjCwgWOqwgCDsl7Dsho3tmJXsnbjqsoPrk6QgDQoNCg0KYGBge3J9DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgMS4gIERhdGEgcHJlcGFyYXRpb24gIA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCmF1dG9wYXJ0ICU+JSANCiAgZmlsdGVyKHByb2Rfbm8gPT0gIjkwNzg0LTc2MDAxIikgJT4lIA0KICBmaWx0ZXIoY190aGlja25lc3MgPCAxMDAwKSAlPiUgDQogIGZpbHRlcihoaWdocHJlc3N1cmVfdGltZSA8IDEwMDApICU+JSAgDQogIG11dGF0ZSh0YXJnZXQgPSBpZmVsc2UoY190aGlja25lc3M8MjB8IGNfdGhpY2tuZXNzPjMyLDEgLDApICU+JSANCiAgICAgICAgICAgYXMuZmFjdG9yKCkpICU+JSANCiAgc2VsZWN0KC1wcm9kX25vLCAtY190aGlja25lc3MpIC0+IGRmX2tubg0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIDIuIFRyYWluL1Rlc3Qgc3BlcmVyYXRpb24gDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnNvcnQoc2FtcGxlKG5yb3coZGZfa25uKSwgbnJvdyhkZl9rbm4pKjAuNykpIC0+IGZsDQoNCmRmX2tubltmbCxdIC0+IHRyYWluDQpkZl9rbm5bLWZsLF0gLT4gdGVzdA0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIDMuIE1vZGVsbGluZyANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY3RybCA8LSB0cmFpbkNvbnRyb2wobWV0aG9kID0gInJlcGVhdGVkY3YiLCByZXBlYXRzID0gNSkNCg0KY3VzdG9tR3JpZCA8LSBleHBhbmQuZ3JpZChrPTE6MTApDQoNCnRyYWluKHRhcmdldH4uLCANCiAgICAgIGRhdGE9dHJhaW4sIA0KICAgICAgbWV0aG9kID0ia25uIiwgDQogICAgICBwcmVQcm9jZXNzPSBjKCJjZW50ZXIiLCJzY2FsZSIpLCANCiAgICAgIHR1bmVHcmlkID0gY3VzdG9tR3JpZCwNCiAgICAgIG1ldHJpYyA9IkFjY3VyYWN5IikgLT4ga25uX2ZpdA0KDQoNCmtubl9maXQNCg0KcGxvdChrbm5fZml0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICAzLiBvcHRpbWFsIEsgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmtubl9maXQkYmVzdFR1bmUNCg0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIDQuIHByZWRpY3QgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnByZWRpY3Qoa25uX2ZpdCwgbmV3ZGF0YSA9IHRlc3QpIC0+IHByZWRfa25uDQoNCmNvbmZ1c2lvbk1hdHJpeChwcmVkX2tubiwgdGVzdCR0YXJnZXQpDQpgYGANCg0KDQpgYGB7cn0NCnZhckltcChrbm5fZml0LCBzY2FsZT1GQUxTRSkgLT5pbXBfa25uDQpwbG90KGltcF9rbm4pDQpgYGANCg0KDQpgYGB7cn0NClJPQyh0ZXN0PXByZWRfa25uLCBzdGF0PXRlc3QkdGFyZ2V0LCBwbG90PSJST0MiKQ0KYGBgDQoNCg0KYGBge3J9DQpgYGANCg0KDQppYGBge3J9DQpgYGANCg0K