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