NASAL
N_RETROPOSITION_MM
tree<-rpart::rpart(N_POSITION~N_RETROPOSITION_MM
,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 6 1 0
CP 4 46 0
S 0 0 6
Overall Statistics
Accuracy : 0.9206
95% CI : (0.8244, 0.9737)
No Information Rate : 0.746
P-Value [Acc > NIR] : 0.0004041
Kappa : 0.7918
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.60000 0.9787 1.00000
Specificity 0.98113 0.7500 1.00000
Pos Pred Value 0.85714 0.9200 1.00000
Neg Pred Value 0.92857 0.9231 1.00000
Prevalence 0.15873 0.7460 0.09524
Detection Rate 0.09524 0.7302 0.09524
Detection Prevalence 0.11111 0.7937 0.09524
Balanced Accuracy 0.79057 0.8644 1.00000
cbind(id=1:nrow(retropostion_data),retropostion_data,N_POSITION_PREDICTED=as.character(preds)) %>% as.data.frame() %>% filter(N_POSITION!=N_POSITION_PREDICTED) %>% select(NAME,N_POSITION,N_POSITION_PREDICTED)
NA
NA
N_RETROPOSITION_MM + N_RETROIRIDIAN SPACE [mm]
tree<-rpart::rpart(N_POSITION~N_RETROPOSITION_MM+`N_RETROIRIDIAN SPACE [mm]`,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 7 2 0
CP 3 45 0
S 0 0 6
Overall Statistics
Accuracy : 0.9206
95% CI : (0.8244, 0.9737)
No Information Rate : 0.746
P-Value [Acc > NIR] : 0.0004041
Kappa : 0.8015
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.7000 0.9574 1.00000
Specificity 0.9623 0.8125 1.00000
Pos Pred Value 0.7778 0.9375 1.00000
Neg Pred Value 0.9444 0.8667 1.00000
Prevalence 0.1587 0.7460 0.09524
Detection Rate 0.1111 0.7143 0.09524
Detection Prevalence 0.1429 0.7619 0.09524
Balanced Accuracy 0.8311 0.8850 1.00000
N_RETROPOSITION_MM + N_HEIGHT_IOL
tree<-rpart::rpart(N_POSITION~N_RETROPOSITION_MM+N_HEIGHT_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 8 2 0
CP 2 45 0
S 0 0 6
Overall Statistics
Accuracy : 0.9365
95% CI : (0.8453, 0.9824)
No Information Rate : 0.746
P-Value [Acc > NIR] : 9.454e-05
Kappa : 0.8448
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.8000 0.9574 1.00000
Specificity 0.9623 0.8750 1.00000
Pos Pred Value 0.8000 0.9574 1.00000
Neg Pred Value 0.9623 0.8750 1.00000
Prevalence 0.1587 0.7460 0.09524
Detection Rate 0.1270 0.7143 0.09524
Detection Prevalence 0.1587 0.7460 0.09524
Balanced Accuracy 0.8811 0.9162 1.00000
N_RETROPOSITION_MM + N_HEIGHT_IOL + N_RETROIRIDIAN SPACE [mm]
tree<-rpart::rpart(N_POSITION~N_RETROPOSITION_MM+N_HEIGHT_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)
rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
TEMPORAL
T_RETROPOSITION_MM
tree<-rpart::rpart(T_POSITION~T_RETROPOSITION_MM,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 2 1 0
CP 2 48 1
S 2 0 7
Overall Statistics
Accuracy : 0.9048
95% CI : (0.8041, 0.9642)
No Information Rate : 0.7778
P-Value [Acc > NIR] : 0.007371
Kappa : 0.7261
Mcnemar's Test P-Value : 0.343030
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.33333 0.9796 0.8750
Specificity 0.98246 0.7857 0.9636
Pos Pred Value 0.66667 0.9412 0.7778
Neg Pred Value 0.93333 0.9167 0.9815
Prevalence 0.09524 0.7778 0.1270
Detection Rate 0.03175 0.7619 0.1111
Detection Prevalence 0.04762 0.8095 0.1429
Balanced Accuracy 0.65789 0.8827 0.9193
cbind(id=1:nrow(retropostion_data),retropostion_data,T_POSITION_PREDICTED=as.character(preds)) %>% as.data.frame() %>% filter(T_POSITION!=T_POSITION_PREDICTED) %>% select(NAME,T_POSITION,T_POSITION_PREDICTED)
T_RETROPOSITION_MM + T_RETROIRIDIAN SPACE [mm]
tree<-rpart::rpart(T_POSITION~T_RETROPOSITION_MM +`T_RETROIRIDIAN SPACE [mm]`,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 2 1 0
CP 2 48 1
S 2 0 7
Overall Statistics
Accuracy : 0.9048
95% CI : (0.8041, 0.9642)
No Information Rate : 0.7778
P-Value [Acc > NIR] : 0.007371
Kappa : 0.7261
Mcnemar's Test P-Value : 0.343030
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.33333 0.9796 0.8750
Specificity 0.98246 0.7857 0.9636
Pos Pred Value 0.66667 0.9412 0.7778
Neg Pred Value 0.93333 0.9167 0.9815
Prevalence 0.09524 0.7778 0.1270
Detection Rate 0.03175 0.7619 0.1111
Detection Prevalence 0.04762 0.8095 0.1429
Balanced Accuracy 0.65789 0.8827 0.9193
T_RETROPOSITION_MM + T_HEIGHT_IOL
tree<-rpart::rpart(T_POSITION~T_RETROPOSITION_MM+T_HEIGHT_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 2 1 0
CP 2 48 1
S 2 0 7
Overall Statistics
Accuracy : 0.9048
95% CI : (0.8041, 0.9642)
No Information Rate : 0.7778
P-Value [Acc > NIR] : 0.007371
Kappa : 0.7261
Mcnemar's Test P-Value : 0.343030
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.33333 0.9796 0.8750
Specificity 0.98246 0.7857 0.9636
Pos Pred Value 0.66667 0.9412 0.7778
Neg Pred Value 0.93333 0.9167 0.9815
Prevalence 0.09524 0.7778 0.1270
Detection Rate 0.03175 0.7619 0.1111
Detection Prevalence 0.04762 0.8095 0.1429
Balanced Accuracy 0.65789 0.8827 0.9193
T_RETROPOSITION_MM + T_RETROIRIDIAN SPACE [mm] + T_HEIGHT_IOL
tree<-rpart::rpart(T_POSITION~T_RETROPOSITION_MM+`T_RETROIRIDIAN SPACE [mm]`+T_HEIGHT_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 2 1 0
CP 2 48 1
S 2 0 7
Overall Statistics
Accuracy : 0.9048
95% CI : (0.8041, 0.9642)
No Information Rate : 0.7778
P-Value [Acc > NIR] : 0.007371
Kappa : 0.7261
Mcnemar's Test P-Value : 0.343030
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.33333 0.9796 0.8750
Specificity 0.98246 0.7857 0.9636
Pos Pred Value 0.66667 0.9412 0.7778
Neg Pred Value 0.93333 0.9167 0.9815
Prevalence 0.09524 0.7778 0.1270
Detection Rate 0.03175 0.7619 0.1111
Detection Prevalence 0.04762 0.8095 0.1429
Balanced Accuracy 0.65789 0.8827 0.9193
LS0tCnRpdGxlOiAiSVogSUNMIFBPU0lUSU9OIEFOQUxZU0lTIE1VTFRJUExFIEZFQVRVUkVTIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KHNraW1yKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHRpYmJsZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFZJTSkKbGlicmFyeShyZWFkcikKbGlicmFyeShycGFydC5wbG90KQpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnBvc3RvcF9kYXRhPC1yZWFkcjo6cmVhZF9jc3YoZmlsZSA9ICJwb3N0b3BfZGF0YV9jbGVhbmVkX25vcm1hbGl6ZWQtdmVyc2lvbjUtcmV0ZXN0LmNzdiIpCnJldHJvcG9zdGlvbl9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgc2VsZWN0KE5BTUUsTk9STV9OX1JFVFJPUE9TSVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fVF9SRVRST1BPU0lUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1NJVElPTixOX1JFVFJPUE9TSVRJT05fTU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfUkVUUk9QT1NJVElPTl9NTSxSRVRFU1RfUE9TSVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fVF9SRVRST19IQUxGX0lPTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9OX1JFVFJPX0hBTEZfSU9MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX1RfUkVUUk9fSU9MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX05fUkVUUk9fSU9MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTl9SRVRST0lSSURJQU4gU1BBQ0UgW21tXWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUX1JFVFJPSVJJRElBTiBTUEFDRSAgW21tXWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfSEVJR0hUX0lPTCxOX0hFSUdIVF9JT0wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICU+JSBmaWx0ZXIoIWlzLm5hKFJFVEVTVF9QT1NJVElPTikpICU+JSBzZXBhcmF0ZShSRVRFU1RfUE9TSVRJT04saW50bz1jKCJOX1BPU0lUSU9OIiwiVF9QT1NJVElPTiIpLHNlcD0nLScpICU+JSBkcm9wX25hKFRfUE9TSVRJT04pICU+JSBkcm9wX25hKE5PUk1fVF9SRVRST1BPU0lUSU9OKQoKCnJldHJvcG9zdGlvbl9kYXRhPC1yZXRyb3Bvc3Rpb25fZGF0YSAlPiUgbXV0YXRlKFRfUE9TSVRJT049aWZlbHNlKFRfUE9TSVRJT049PSJDTSIsIkNBIixUX1BPU0lUSU9OKSxOX1BPU0lUSU9OPWlmZWxzZShOX1BPU0lUSU9OPT0iQ00iLCJDQSIsTl9QT1NJVElPTikpCnJldHJvcG9zdGlvbl9kYXRhCmBgYAoKIyBOQVNBTAojIyBOX1JFVFJPUE9TSVRJT05fTU0KCmBgYHtyfQp0cmVlPC1ycGFydDo6cnBhcnQoTl9QT1NJVElPTn5OX1JFVFJPUE9TSVRJT05fTU0KICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAsZGF0YT1yZXRyb3Bvc3Rpb25fZGF0YSxjb250cm9sID0gcnBhcnQuY29udHJvbChtaW5zcGxpdCA9IDEwKSkKcnBhcnQucGxvdCh0cmVlLHR5cGU9MSwKICAgICAgICAgICBleHRyYT0xMDEsIGJveC5wYWxldHRlPSJHbkJ1IiwKICAgICAgICAgICBicmFuY2gubHR5PTMsIHNoYWRvdy5jb2w9ImdyYXkiLCBubj1UUlVFCiAgICAgICAgKQpycGFydC5ydWxlcyh0cmVlKQpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSROX1BPU0lUSU9OKSkKY2JpbmQoaWQ9MTpucm93KHJldHJvcG9zdGlvbl9kYXRhKSxyZXRyb3Bvc3Rpb25fZGF0YSxOX1BPU0lUSU9OX1BSRURJQ1RFRD1hcy5jaGFyYWN0ZXIocHJlZHMpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBmaWx0ZXIoTl9QT1NJVElPTiE9Tl9QT1NJVElPTl9QUkVESUNURUQpICU+JSBzZWxlY3QoTkFNRSxOX1BPU0lUSU9OLE5fUE9TSVRJT05fUFJFRElDVEVEKQoKCmBgYAoKIyMgTl9SRVRST1BPU0lUSU9OX01NICsgTl9SRVRST0lSSURJQU4gU1BBQ0UgW21tXSAKYGBge3J9CnRyZWU8LXJwYXJ0OjpycGFydChOX1BPU0lUSU9Ofk5fUkVUUk9QT1NJVElPTl9NTStgTl9SRVRST0lSSURJQU4gU1BBQ0UgW21tXWAsZGF0YT1yZXRyb3Bvc3Rpb25fZGF0YSxjb250cm9sID0gcnBhcnQuY29udHJvbChtaW5zcGxpdCA9IDEwKSkKcnBhcnQucGxvdCh0cmVlLHR5cGU9MSwKICAgICAgICAgICBleHRyYT0xMDEsIGJveC5wYWxldHRlPSJHbkJ1IiwKICAgICAgICAgICBicmFuY2gubHR5PTMsIHNoYWRvdy5jb2w9ImdyYXkiLCBubj1UUlVFCiAgICAgICAgKQpycGFydC5ydWxlcyh0cmVlKQoKcHJlZHM8LXByZWRpY3QodHJlZSxyZXRyb3Bvc3Rpb25fZGF0YSx0eXBlID0gJ2NsYXNzJykKY2FyZXQ6OmNvbmZ1c2lvbk1hdHJpeChwcmVkcyxhcy5mYWN0b3IocmV0cm9wb3N0aW9uX2RhdGEkTl9QT1NJVElPTikpCmBgYAoKIyMgTl9SRVRST1BPU0lUSU9OX01NICsgTl9IRUlHSFRfSU9MIApgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KE5fUE9TSVRJT05+Tl9SRVRST1BPU0lUSU9OX01NK05fSEVJR0hUX0lPTCxkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMTApKQpycGFydC5wbG90KHRyZWUsdHlwZT0xLAogICAgICAgICAgIGV4dHJhPTEwMSwgYm94LnBhbGV0dGU9IkduQnUiLAogICAgICAgICAgIGJyYW5jaC5sdHk9Mywgc2hhZG93LmNvbD0iZ3JheSIsIG5uPVRSVUUKICAgICAgICApCnJwYXJ0LnJ1bGVzKHRyZWUpCgpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSROX1BPU0lUSU9OKSkKYGBgCgojIyBOX1JFVFJPUE9TSVRJT05fTU0gKyBOX0hFSUdIVF9JT0wgKyBOX1JFVFJPSVJJRElBTiBTUEFDRSBbbW1dIApgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KE5fUE9TSVRJT05+Tl9SRVRST1BPU0lUSU9OX01NK05fSEVJR0hUX0lPTCxkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMTApKQpycGFydC5wbG90KHRyZWUsdHlwZT0xLAogICAgICAgICAgIGV4dHJhPTEwMSwgYm94LnBhbGV0dGU9IkduQnUiLAogICAgICAgICAgIGJyYW5jaC5sdHk9Mywgc2hhZG93LmNvbD0iZ3JheSIsIG5uPVRSVUUKICAgICAgICApCnJwYXJ0LnJ1bGVzKHRyZWUpCgpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSROX1BPU0lUSU9OKSkKYGBgCgoKCiMgVEVNUE9SQUwKCiMjIFRfUkVUUk9QT1NJVElPTl9NTQoKYGBge3J9CnRyZWU8LXJwYXJ0OjpycGFydChUX1BPU0lUSU9OflRfUkVUUk9QT1NJVElPTl9NTSxkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMTApKQpycGFydC5wbG90KHRyZWUsdHlwZT0xLAogICAgICAgICAgIGV4dHJhPTEwMSwgYm94LnBhbGV0dGU9IkduQnUiLAogICAgICAgICAgIGJyYW5jaC5sdHk9Mywgc2hhZG93LmNvbD0iZ3JheSIsIG5uPVRSVUUKICAgICAgICApCnJwYXJ0LnJ1bGVzKHRyZWUpCgpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSRUX1BPU0lUSU9OKSkKY2JpbmQoaWQ9MTpucm93KHJldHJvcG9zdGlvbl9kYXRhKSxyZXRyb3Bvc3Rpb25fZGF0YSxUX1BPU0lUSU9OX1BSRURJQ1RFRD1hcy5jaGFyYWN0ZXIocHJlZHMpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBmaWx0ZXIoVF9QT1NJVElPTiE9VF9QT1NJVElPTl9QUkVESUNURUQpICU+JSBzZWxlY3QoTkFNRSxUX1BPU0lUSU9OLFRfUE9TSVRJT05fUFJFRElDVEVEKQpgYGAKCiMjIFRfUkVUUk9QT1NJVElPTl9NTSArIFRfUkVUUk9JUklESUFOIFNQQUNFIFttbV0gCgpgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KFRfUE9TSVRJT05+VF9SRVRST1BPU0lUSU9OX01NICtgVF9SRVRST0lSSURJQU4gU1BBQ0UgIFttbV1gLGRhdGE9cmV0cm9wb3N0aW9uX2RhdGEsY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMCkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKCnByZWRzPC1wcmVkaWN0KHRyZWUscmV0cm9wb3N0aW9uX2RhdGEsdHlwZSA9ICdjbGFzcycpCmNhcmV0Ojpjb25mdXNpb25NYXRyaXgocHJlZHMsYXMuZmFjdG9yKHJldHJvcG9zdGlvbl9kYXRhJFRfUE9TSVRJT04pKQpgYGAKCiMjIFRfUkVUUk9QT1NJVElPTl9NTSArICBUX0hFSUdIVF9JT0wKCmBgYHtyfQp0cmVlPC1ycGFydDo6cnBhcnQoVF9QT1NJVElPTn5UX1JFVFJPUE9TSVRJT05fTU0rVF9IRUlHSFRfSU9MLGRhdGE9cmV0cm9wb3N0aW9uX2RhdGEsY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMCkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKCnByZWRzPC1wcmVkaWN0KHRyZWUscmV0cm9wb3N0aW9uX2RhdGEsdHlwZSA9ICdjbGFzcycpCmNhcmV0Ojpjb25mdXNpb25NYXRyaXgocHJlZHMsYXMuZmFjdG9yKHJldHJvcG9zdGlvbl9kYXRhJFRfUE9TSVRJT04pKQpgYGAKCiMjIFRfUkVUUk9QT1NJVElPTl9NTSArIFRfUkVUUk9JUklESUFOIFNQQUNFIFttbV0gKyBUX0hFSUdIVF9JT0wKCmBgYHtyfQp0cmVlPC1ycGFydDo6cnBhcnQoVF9QT1NJVElPTn5UX1JFVFJPUE9TSVRJT05fTU0rYFRfUkVUUk9JUklESUFOIFNQQUNFICBbbW1dYCtUX0hFSUdIVF9JT0wsZGF0YT1yZXRyb3Bvc3Rpb25fZGF0YSxjb250cm9sID0gcnBhcnQuY29udHJvbChtaW5zcGxpdCA9IDEwKSkKcnBhcnQucGxvdCh0cmVlLHR5cGU9MSwKICAgICAgICAgICBleHRyYT0xMDEsIGJveC5wYWxldHRlPSJHbkJ1IiwKICAgICAgICAgICBicmFuY2gubHR5PTMsIHNoYWRvdy5jb2w9ImdyYXkiLCBubj1UUlVFCiAgICAgICAgKQpycGFydC5ydWxlcyh0cmVlKQoKcHJlZHM8LXByZWRpY3QodHJlZSxyZXRyb3Bvc3Rpb25fZGF0YSx0eXBlID0gJ2NsYXNzJykKY2FyZXQ6OmNvbmZ1c2lvbk1hdHJpeChwcmVkcyxhcy5mYWN0b3IocmV0cm9wb3N0aW9uX2RhdGEkVF9QT1NJVElPTikpCmBgYAoK