Usando los datos y el script como guía haga un breve análisis de los tiempos de reincidencia criminal. Replique los resultados adjuntos e interprete. Importamos librerias
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
-- Attaching packages ---------------------------------------------------- tidyverse 1.3.1 --
v ggplot2 3.3.5 v purrr 0.3.4
v tibble 3.1.4 v dplyr 1.0.7
v tidyr 1.1.4 v stringr 1.4.0
v readr 2.0.2 v forcats 0.5.1
-- Conflicts ------------------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
library(survival)
library(survminer)
Loading required package: ggpubr
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Attaching package: 㤼㸱survminer㤼㸲
The following object is masked from 㤼㸱package:survival㤼㸲:
myeloma
library(flexsurv)
library(dplyr)
library(ggplot2)
Evento ser rearestado despues de prision
El seguimiento duro tres años
Importamos datos
henning <- read.csv("C:/Users/doria/OneDrive/Escritorio/Cuestionario_2/PRACTICA DE SUPERVIVENCIA/data/Henning.txt", sep="")
Encabezados
head(henning)
id ientificacion del preso
months cuantos meses tarda la persona en ser rearrestada
censor indica si se censuro o no la persona ,1 obserbaste y no ocurrio el evento, 0 si ocurrio el evento
naturaleza del registro criminal
personal, 1 ,antecednetes criminales con respecto a personas
propeti, 1, antecednetes criminales con respecto hacia una propiedad
cage, edad centrada, diferencia entre edad y edad promedio
Explicar evento respecto a edad
Evento de interes ser arrestado
Creamos la variable event (evento)
henning <- henning %>%
mutate(event = case_when(
censor == 0 ~ 1,
TRUE ~ 0
))
Agrupamos
henning %>%
group_by(event) %>% # agrupamos por evento
summarise(avg_months = mean(months), # tiempo promedio de censura
avg_personal = mean(personal),# tiempo promedio incidente persona
avg_property = mean(property),# tiempo promedioincidente propiedad
avg_cage = mean(cage))# proemdio edad centrada
NA
Funcion intro_surv grafica si la variable es censurada o no
intro_surv
intro_surv<- function(data=NULL,n=NULL){
muestra=sample_n(data,n) # seleccionamos una muestra de n
muestra$id=seq(1,n)# renombramos los id
time=muestra$months
event=muestra$event
ggplot(muestra)+
geom_point(aes(x =id, y = time, shape= as.factor(event)))+
geom_linerange(aes(x =id, ymin = 0, ymax = time), linetype = "dotdash")+
theme_classic()+
labs(title ='Survival times plot',
shape = 'Event',
x = 'sample',
y='Times')+
coord_flip()
}
llamamos la funcion, n=10
intro_surv(data=henning,n=10)

Objeto de sobrevivencia
Regresion entre el logaritmo de la supervivencia y los tiempos
sfit <- survfit(Surv(months, event) ~ 1, data = henning)
Graficacion simple
plot(sfit)

Graficando con ggsurplot
Probabilidad sobrevivencia S(t)
ggsurvplot(sfit, data = henning)


Riesgo acumulada de hazard H(t)
ggsurvplot(sfit, data = henning, fun = "cumhaz")


Estimadores de la Función de Riesgo Acumulada
Regresion entre el logaritmo de la supervivencia y los tiempos
diagnos_surv <- function(times= NULL, surv=NULL) {
data.frame(times = times, surv = surv) %>%
ggplot()+
geom_point(aes(x = log(surv), y = times))+
geom_smooth(aes(x = log(surv), y = times), method = "lm")+
theme_classic()
}
llamamos la funcion
diagnos_surv(times=sfit$time,surv=sfit$surv)

Aproximacion con lineas exponencial Exponencial diagnostico
Seguimiento, relacionado con personas
0 Aquellos que no cometen crimenes en contra de personas 1 Aquellos que cometen crimenes en contra de personas
sfit_personal <- survfit(Surv(months, event) ~ personal, data = henning)
ggsurvplot(sfit_personal, data = henning)


Seguimiento, relacionado con propiedad
0 Aquellos que no cometen crimenes en contra de propiedades 1 Aquellos que cometen crimenes en contra de propiedades
sfit_property <- survfit(Surv(months, event) ~ property, data = henning)
ggsurvplot(sfit_property, data = henning)


Calculamos la distancia entre las curvas
Las curvas con discretas
max_distancia <- function(sfitp = NULL,p=NULL) {
# Strata primeros valores
f1 <- sfitp$strata[1]
# strata valor final
f2 <- length(sfitp$surv)
#obtenemos tiempo y supervivencia de los 2 conjuntos
t1<-sfitp$time[1:f1]# tiempo pesonal
s1<-sfitp$surv[1:f1]# sobrevivencia 1
t2<-sfitp$time[(f1+1):f2]# tiempo 2
s2<-sfitp$surv[(f1+1):f2]# sobrevivencia 2
#suavizamos ambas funciones de supervivencia y las evaluamos sobre el mismo conjunto
s1aprox <- approxfun(s1,t1)
s2aprox <- approxfun(s2,t2)
df1<-data.frame(s=s2,ta1=s1aprox(s2), ta2=s2aprox(s2))
# diferencia entre los tiempos para las funciones suavizadas
df1$distancia<-abs(df1$ta1-df1$ta2)
# Eliminamos NAs
df1 <- df1[!is.na(df1$distancia),]
# Conservamos las S(t)>p
df<-df1[df1$s>p,]
# Obtenemos la mayor de las distancias entre las gráficas
maxima<-max(df1$distancia)
# Seleccionamos el renglon que corresponda a la distancia maxima
d<-df1[df1$distancia==maxima,]
max<-as.character(round(maxima,6))
max
grafica<-ggplot()+
geom_step(aes(t1,s1, color="1"),size=0.5)+# personal=0
geom_step(aes(t2,s2, color="0"),size=0.5)+# persoaml=1
labs(title=paste("Máxima Distancia entre","personal=0","y","personal=1", sep = " "),
x="Tiempo", y="St")+
theme_classic()+ # graficamos puntos maximo
geom_hline(yintercept = d$s, linetype="dashed", color = "gray50", size=0.7)+
labs(color = "blue") +
geom_vline(xintercept = d$ta1, linetype="dashed", color = "gray50", size=0.7)+
geom_vline(xintercept = d$ta2, linetype="dashed", color = "gray50", size=0.7)+
annotate("text", x =min(d$ta1,d$ta2), y = d$s+0.02, label = paste("Distancia=",max,sep =""))
return(grafica)
}
Con respecto a personas
max_distancia(sfitp =sfit_personal,p=0.5)
collapsing to unique 'x' valuescollapsing to unique 'x' values

Con respecto a propiedad
max_distancia(sfitp =sfit_property,p=0)
collapsing to unique 'x' valuescollapsing to unique 'x' values

LS0tDQp0aXRsZTogIlBSQUNUSUNBIERFIFNVUEVSVklWRU5DSUEiDQphdXRob3I6ICJDcnV6IE1hdGVvIERhdmlkIg0KZGF0ZTogIiINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KLS0tDQpVc2FuZG8gbG9zIGRhdG9zIHkgZWwgc2NyaXB0IGNvbW8gZ3XDrWEgaGFnYSB1biBicmV2ZSBhbsOhbGlzaXMgZGUgbG9zIHRpZW1wb3MgZGUgcmVpbmNpZGVuY2lhIGNyaW1pbmFsLg0KUmVwbGlxdWUgbG9zIHJlc3VsdGFkb3MgYWRqdW50b3MgZSBpbnRlcnByZXRlLg0KSW1wb3J0YW1vcyBsaWJyZXJpYXMNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHN1cnZpdmFsKQ0KbGlicmFyeShzdXJ2bWluZXIpDQpsaWJyYXJ5KGZsZXhzdXJ2KQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCg0KYGBgDQoNCkV2ZW50byBzZXIgcmVhcmVzdGFkbyBkZXNwdWVzIGRlIHByaXNpb24NCg0KRWwgc2VndWltaWVudG8gZHVybyB0cmVzIGHDsW9zDQoNCiMgSW1wb3J0YW1vcyBkYXRvcw0KYGBge3J9DQpoZW5uaW5nIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9kb3JpYS9PbmVEcml2ZS9Fc2NyaXRvcmlvL0N1ZXN0aW9uYXJpb18yL1BSQUNUSUNBIERFIFNVUEVSVklWRU5DSUEvZGF0YS9IZW5uaW5nLnR4dCIsIHNlcD0iIikNCmBgYA0KDQojIyBFbmNhYmV6YWRvcw0KYGBge3J9DQpoZWFkKGhlbm5pbmcpDQpgYGANCg0KDQpfX2lkX18gIGllbnRpZmljYWNpb24gZGVsIHByZXNvDQoNCl9fbW9udGhzX18gY3VhbnRvcyBtZXNlcyB0YXJkYSBsYSBwZXJzb25hIGVuIHNlciByZWFycmVzdGFkYQ0KDQpfX2NlbnNvcl9fIGluZGljYSBzaSBzZSBjZW5zdXJvIG8gbm8gbGEgcGVyc29uYSAsMSBvYnNlcmJhc3RlIHkgbm8gb2N1cnJpbyBlbCBldmVudG8sIDAgc2kgb2N1cnJpbyBlbCBldmVudG8NCg0KbmF0dXJhbGV6YSBkZWwgcmVnaXN0cm8gY3JpbWluYWwNCg0KX19wZXJzb25hbF9fLCAxICxhbnRlY2VkbmV0ZXMgY3JpbWluYWxlcyBjb24gcmVzcGVjdG8gYSBwZXJzb25hcw0KDQpfX3Byb3BldGlfXywgMSwgYW50ZWNlZG5ldGVzIGNyaW1pbmFsZXMgY29uIHJlc3BlY3RvIGhhY2lhIHVuYSBwcm9waWVkYWQNCg0KX19jYWdlX18sIGVkYWQgY2VudHJhZGEsIGRpZmVyZW5jaWEgZW50cmUgZWRhZCB5IGVkYWQgcHJvbWVkaW8NCg0KRXhwbGljYXIgZXZlbnRvIHJlc3BlY3RvIGEgZWRhZA0KDQpFdmVudG8gZGUgaW50ZXJlcyBzZXIgYXJyZXN0YWRvDQoNCkNyZWFtb3MgbGEgdmFyaWFibGUgIGV2ZW50ICAoZXZlbnRvKQ0KYGBge3J9DQpoZW5uaW5nIDwtIGhlbm5pbmcgJT4lIA0KICBtdXRhdGUoZXZlbnQgPSBjYXNlX3doZW4oDQogICAgY2Vuc29yID09IDAgfiAxLA0KICAgIFRSVUUgfiAwDQogICkpDQpgYGANCg0KQWdydXBhbW9zDQpgYGB7cn0NCmhlbm5pbmcgJT4lIA0KICBncm91cF9ieShldmVudCkgJT4lICMgYWdydXBhbW9zIHBvciBldmVudG8NCiAgc3VtbWFyaXNlKGF2Z19tb250aHMgPSBtZWFuKG1vbnRocyksICMgdGllbXBvIHByb21lZGlvIGRlIGNlbnN1cmENCiAgICAgICAgICAgIGF2Z19wZXJzb25hbCA9IG1lYW4ocGVyc29uYWwpLCMgdGllbXBvIHByb21lZGlvIGluY2lkZW50ZSBwZXJzb25hDQogICAgICAgICAgICBhdmdfcHJvcGVydHkgPSBtZWFuKHByb3BlcnR5KSwjIHRpZW1wbyBwcm9tZWRpb2luY2lkZW50ZSBwcm9waWVkYWQNCiAgICAgICAgICAgIGF2Z19jYWdlID0gbWVhbihjYWdlKSkjIHByb2VtZGlvIGVkYWQgY2VudHJhZGENCg0KYGBgDQoNCg0KIyBGdW5jaW9uIGludHJvX3N1cnYgZ3JhZmljYSBzaSBsYSB2YXJpYWJsZSBlcyBjZW5zdXJhZGEgbyBubw0KIyMgaW50cm9fc3Vydg0KYGBge3J9DQppbnRyb19zdXJ2PC0gZnVuY3Rpb24oZGF0YT1OVUxMLG49TlVMTCl7DQogICAgbXVlc3RyYT1zYW1wbGVfbihkYXRhLG4pICMgc2VsZWNjaW9uYW1vcyB1bmEgbXVlc3RyYSBkZSBuDQogICAgbXVlc3RyYSRpZD1zZXEoMSxuKSMgcmVub21icmFtb3MgbG9zIGlkDQogICAgdGltZT1tdWVzdHJhJG1vbnRocw0KICAgIGV2ZW50PW11ZXN0cmEkZXZlbnQNCiAgICBnZ3Bsb3QobXVlc3RyYSkrDQogICAgZ2VvbV9wb2ludChhZXMoeCA9aWQsIHkgPSB0aW1lLCAgc2hhcGU9IGFzLmZhY3RvcihldmVudCkpKSsNCiAgICBnZW9tX2xpbmVyYW5nZShhZXMoeCA9aWQsIHltaW4gPSAwLCB5bWF4ID0gdGltZSksIGxpbmV0eXBlID0gImRvdGRhc2giKSsNCiAgICB0aGVtZV9jbGFzc2ljKCkrDQogICAgbGFicyh0aXRsZSA9J1N1cnZpdmFsIHRpbWVzIHBsb3QnLA0KICAgICAgICAgc2hhcGUgPSAnRXZlbnQnLA0KICAgICAgICAgeCA9ICdzYW1wbGUnLA0KICAgICAgICAgeT0nVGltZXMnKSsNCiAgICBjb29yZF9mbGlwKCkNCn0NCmBgYA0KDQojIyBsbGFtYW1vcyBsYSBmdW5jaW9uLCBuPTEwDQpgYGB7cn0NCmludHJvX3N1cnYoZGF0YT1oZW5uaW5nLG49MTApDQpgYGANCg0KIyBPYmpldG8gZGUgc29icmV2aXZlbmNpYQ0KDQojIyBSZWdyZXNpb24gZW50cmUgZWwgbG9nYXJpdG1vIGRlIGxhIHN1cGVydml2ZW5jaWEgeSBsb3MgdGllbXBvcw0KYGBge3J9DQpzZml0IDwtIHN1cnZmaXQoU3Vydihtb250aHMsIGV2ZW50KSB+IDEsIGRhdGEgPSBoZW5uaW5nKQ0KYGBgDQoNCiMjIEdyYWZpY2FjaW9uIHNpbXBsZQ0KYGBge3J9DQpwbG90KHNmaXQpDQpgYGANCg0KIyMgR3JhZmljYW5kbyBjb24gZ2dzdXJwbG90DQoNCiMjIyBQcm9iYWJpbGlkYWQgc29icmV2aXZlbmNpYSBTKHQpDQoNCmBgYHtyfQ0KZ2dzdXJ2cGxvdChzZml0LCBkYXRhID0gaGVubmluZykNCmBgYA0KDQojIyMgUmllc2dvIGFjdW11bGFkYSBkZSBoYXphcmQgSCh0KQ0KYGBge3J9DQpnZ3N1cnZwbG90KHNmaXQsIGRhdGEgPSBoZW5uaW5nLCBmdW4gPSAiY3VtaGF6IikNCmBgYA0KDQojIEVzdGltYWRvcmVzIGRlIGxhIEZ1bmNpw7NuIGRlIFJpZXNnbyBBY3VtdWxhZGENCg0KIyMgUmVncmVzaW9uIGVudHJlIGVsIGxvZ2FyaXRtbyBkZSBsYSBzdXBlcnZpdmVuY2lhIHkgbG9zIHRpZW1wb3MNCmBgYHtyfQ0KZGlhZ25vc19zdXJ2IDwtIGZ1bmN0aW9uKHRpbWVzPSBOVUxMLCBzdXJ2PU5VTEwpIHsNCiAgZGF0YS5mcmFtZSh0aW1lcyA9IHRpbWVzLCBzdXJ2ID0gc3VydikgJT4lIA0KICAgIGdncGxvdCgpKw0KICAgIGdlb21fcG9pbnQoYWVzKHggPSBsb2coc3VydiksIHkgPSB0aW1lcykpKw0KICAgIGdlb21fc21vb3RoKGFlcyh4ID0gbG9nKHN1cnYpLCB5ID0gdGltZXMpLCBtZXRob2QgPSAibG0iKSsNCiAgICB0aGVtZV9jbGFzc2ljKCkNCn0NCmBgYA0KDQojIyBsbGFtYW1vcyBsYSBmdW5jaW9uDQpgYGB7cn0NCmRpYWdub3Nfc3Vydih0aW1lcz1zZml0JHRpbWUsc3Vydj1zZml0JHN1cnYpDQpgYGANCkFwcm94aW1hY2lvbiBjb24gbGluZWFzIGV4cG9uZW5jaWFsIA0KRXhwb25lbmNpYWwgZGlhZ25vc3RpY28NCg0KIyMgU2VndWltaWVudG8sIHJlbGFjaW9uYWRvIGNvbiBwZXJzb25hcw0KIDAgQXF1ZWxsb3MgcXVlIG5vIGNvbWV0ZW4gY3JpbWVuZXMgZW4gY29udHJhIGRlIHBlcnNvbmFzIA0KIDEgQXF1ZWxsb3MgcXVlIGNvbWV0ZW4gY3JpbWVuZXMgZW4gY29udHJhIGRlIHBlcnNvbmFzIA0KYGBge3J9DQpzZml0X3BlcnNvbmFsIDwtIHN1cnZmaXQoU3Vydihtb250aHMsIGV2ZW50KSB+IHBlcnNvbmFsLCBkYXRhID0gaGVubmluZykNCmdnc3VydnBsb3Qoc2ZpdF9wZXJzb25hbCwgZGF0YSA9IGhlbm5pbmcpDQpgYGANCg0KIyMgU2VndWltaWVudG8sIHJlbGFjaW9uYWRvIGNvbiBwcm9waWVkYWQNCiAwIEFxdWVsbG9zIHF1ZSBubyBjb21ldGVuIGNyaW1lbmVzIGVuIGNvbnRyYSBkZSBwcm9waWVkYWRlcw0KIDEgQXF1ZWxsb3MgcXVlIGNvbWV0ZW4gY3JpbWVuZXMgZW4gY29udHJhIGRlICBwcm9waWVkYWRlcw0KYGBge3J9DQpzZml0X3Byb3BlcnR5IDwtIHN1cnZmaXQoU3Vydihtb250aHMsIGV2ZW50KSB+IHByb3BlcnR5LCBkYXRhID0gaGVubmluZykNCmdnc3VydnBsb3Qoc2ZpdF9wcm9wZXJ0eSwgZGF0YSA9IGhlbm5pbmcpDQpgYGANCiANCiMgQ2FsY3VsYW1vcyBsYSBkaXN0YW5jaWEgZW50cmUgbGFzIGN1cnZhcw0KIExhcyBjdXJ2YXMgY29uIGRpc2NyZXRhcw0KYGBge3J9DQptYXhfZGlzdGFuY2lhIDwtIGZ1bmN0aW9uKHNmaXRwID0gTlVMTCxwPU5VTEwpIHsNCiAgIyBTdHJhdGEgcHJpbWVyb3MgdmFsb3Jlcw0KICBmMSA8LSBzZml0cCRzdHJhdGFbMV0NCiAgIyBzdHJhdGEgdmFsb3IgZmluYWwNCiAgZjIgPC0gbGVuZ3RoKHNmaXRwJHN1cnYpDQogICNvYnRlbmVtb3MgdGllbXBvIHkgc3VwZXJ2aXZlbmNpYSBkZSBsb3MgMiBjb25qdW50b3MNCiAgdDE8LXNmaXRwJHRpbWVbMTpmMV0jIHRpZW1wbyBwZXNvbmFsDQogIHMxPC1zZml0cCRzdXJ2WzE6ZjFdIyBzb2JyZXZpdmVuY2lhIDENCiAgdDI8LXNmaXRwJHRpbWVbKGYxKzEpOmYyXSMgdGllbXBvIDINCiAgczI8LXNmaXRwJHN1cnZbKGYxKzEpOmYyXSMgc29icmV2aXZlbmNpYSAyDQogIA0KICAjc3Vhdml6YW1vcyBhbWJhcyBmdW5jaW9uZXMgZGUgc3VwZXJ2aXZlbmNpYSB5IGxhcyBldmFsdWFtb3Mgc29icmUgZWwgbWlzbW8gY29uanVudG8NCiAgczFhcHJveCA8LSBhcHByb3hmdW4oczEsdDEpDQogIHMyYXByb3ggPC0gYXBwcm94ZnVuKHMyLHQyKQ0KICBkZjE8LWRhdGEuZnJhbWUocz1zMix0YTE9czFhcHJveChzMiksIHRhMj1zMmFwcm94KHMyKSkNCiAgIyBkaWZlcmVuY2lhIGVudHJlIGxvcyB0aWVtcG9zIHBhcmEgbGFzIGZ1bmNpb25lcyBzdWF2aXphZGFzDQogIGRmMSRkaXN0YW5jaWE8LWFicyhkZjEkdGExLWRmMSR0YTIpDQogICMgRWxpbWluYW1vcyBOQXMgDQogIGRmMSA8LSBkZjFbIWlzLm5hKGRmMSRkaXN0YW5jaWEpLF0NCiAgIyBDb25zZXJ2YW1vcyBsYXMgUyh0KT5wDQogIGRmPC1kZjFbZGYxJHM+cCxdDQogICMgT2J0ZW5lbW9zIGxhIG1heW9yIGRlIGxhcyBkaXN0YW5jaWFzIGVudHJlIGxhcyBncsOhZmljYXMNCiAgbWF4aW1hPC1tYXgoZGYxJGRpc3RhbmNpYSkNCiAgIyBTZWxlY2Npb25hbW9zIGVsIHJlbmdsb24gcXVlIGNvcnJlc3BvbmRhIGEgbGEgZGlzdGFuY2lhIG1heGltYQ0KICBkPC1kZjFbZGYxJGRpc3RhbmNpYT09bWF4aW1hLF0NCiAgbWF4PC1hcy5jaGFyYWN0ZXIocm91bmQobWF4aW1hLDYpKQ0KICBtYXgNCiAgZ3JhZmljYTwtZ2dwbG90KCkrIA0KICAgIGdlb21fc3RlcChhZXModDEsczEsIGNvbG9yPSIxIiksc2l6ZT0wLjUpKyMgcGVyc29uYWw9MA0KICAgIGdlb21fc3RlcChhZXModDIsczIsIGNvbG9yPSIwIiksc2l6ZT0wLjUpKyMgcGVyc29hbWw9MQ0KICAgIGxhYnModGl0bGU9cGFzdGUoIk3DoXhpbWEgRGlzdGFuY2lhIGVudHJlIiwicGVyc29uYWw9MCIsInkiLCJwZXJzb25hbD0xIiwgc2VwID0gIiAiKSwgDQogICAgICAgICB4PSJUaWVtcG8iLCB5PSJTdCIpKw0KICAgIHRoZW1lX2NsYXNzaWMoKSsgIyBncmFmaWNhbW9zIHB1bnRvcyBtYXhpbW8NCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBkJHMsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvciA9ICJncmF5NTAiLCBzaXplPTAuNykrDQogICAgbGFicyhjb2xvciA9ICJibHVlIikgKw0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGQkdGExLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3IgPSAiZ3JheTUwIiwgc2l6ZT0wLjcpKw0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGQkdGEyLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3IgPSAiZ3JheTUwIiwgc2l6ZT0wLjcpKyANCiAgICBhbm5vdGF0ZSgidGV4dCIsIHggPW1pbihkJHRhMSxkJHRhMiksIHkgPSBkJHMrMC4wMiwgbGFiZWwgPSBwYXN0ZSgiRGlzdGFuY2lhPSIsbWF4LHNlcCA9IiIpKQ0KICByZXR1cm4oZ3JhZmljYSkNCn0NCg0KYGBgDQoNCiMjIyBDb24gcmVzcGVjdG8gYSBwZXJzb25hcw0KYGBge3J9DQptYXhfZGlzdGFuY2lhKHNmaXRwID1zZml0X3BlcnNvbmFsLHA9MC41KQ0KYGBgDQoNCiMjIyBDb24gcmVzcGVjdG8gYSBwcm9waWVkYWQNCmBgYHtyfQ0KbWF4X2Rpc3RhbmNpYShzZml0cCA9c2ZpdF9wcm9wZXJ0eSxwPTApDQpgYGANCg0K