Introducción

En los últimos años, la salud mental ha cobrado una relevancia creciente, especialmente dentro del ámbito educativo. Estudiantes de todos los niveles enfrentan presiones académicas, sociales y personales que pueden afectar significativamente su bienestar emocional. En este contexto, entender los factores que influyen en la salud mental de los estudiantes universitarios es fundamental para desarrollar estrategias de apoyo más efectivas.

Este proyecto presenta un análisis exploratorio de datos (EDA) enfocado en un conjunto de información recopilada mediante encuestas a estudiantes universitarios sobre su salud mental. A través de una serie de visualizaciones interactivas, se busca identificar patrones, relaciones y posibles factores de riesgo o protección que inciden en el bienestar psicológico de esta población.

Para hacer una apropiada síntesis de estos datos vemos preciso utilizar las herramientas de visualizacion grafica que el lenguaje R es capaz de facilitar, ya que más que sólo mostrar datos, pretendemos apuntar a las causas, los patrones y los factores que influyen negativamente sobre la salud mental de los estudiantes, para de esta manera, tanto los estudiantes como las instituciones puedan valorar qué se puede mejorar para una mantener una buena salud mental.

Descripción del problema

La etapa universitaria representa un periodo de profundos cambios y exigencias para los jóvenes. Factores como la carga académica, la adaptación social, la presión por el rendimiento, la incertidumbre sobre el futuro y la falta de redes de apoyo pueden desencadenar altos niveles de estrés, ansiedad y otros problemas de salud mental.

A pesar del creciente reconocimiento de este fenómeno, muchas universidades aún carecen de mecanismos adecuados para detectar y atender oportunamente estos problemas. A menudo, los estudiantes no buscan ayuda profesional por desconocimiento, estigmatización o falta de recursos accesibles.

Este proyecto parte de una pregunta central: ¿Qué patrones o factores pueden estar asociados con la salud mental de los estudiantes universitarios, según los datos autodeclarados en una encuesta?

Entre las preguntas específicas que guiarán este análisis se encuentran:

¿Qué tan frecuente es el estrés entre los estudiantes encuestados?

¿Existen diferencias entre géneros o cursos en cuanto a la búsqueda de ayuda profesional?

¿Qué relación existe entre la edad, el tipo de institución y la presencia de problemas mentales?

El objetivo de este análisis es proporcionar una visión basada en datos que permita comprender mejor la situación actual de los estudiantes y, eventualmente, ofrecer información útil para la toma de decisiones institucionales.

Definición de fuentes de datos

Para este análisis se utiliza un conjunto de datos denominado “Student Mental Health”, que recopila respuestas de estudiantes universitarios a una encuesta enfocada en su estado emocional, hábitos y acceso a servicios de salud mental.

Características principales del conjunto de datos:

Cantidad de observaciones: 101 estudiantes

Variables a usar:

timestamp: Fecha y hora de la respuesta.

gender: Género del estudiante.

age: Edad del estudiante.

course: Carrera o área de estudio.

year of study: Año actual de carrera.

cgpa: Promedio de calificaciones.

marital status: Estado marital del estudiante.

stress: Indica si el estudiante reporta sentirse estresado.

depression: Presencia de síntomas depresivos.

anxiety: Presencia de ansiedad.

panick attack: Indica si se han presentado ataques de ansiedad.

seek treatment: Indica si el estudiante ha buscado ayuda profesional.

library(readxl)
library(ggplot2)
library(plotly)

Adjuntando el paquete: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
library(dplyr)

Adjuntando el paquete: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(tidyr)
datos <- read_excel("C:/Users/jsuec/Downloads/Student_Mental_Health_Cleaned.xlsx")

grafico <- ggplot(data = datos, aes(x = factor(gender), fill = factor(gender))) +
  geom_bar(alpha = 0.8) +
  labs(title = "Genero de encuestados", x = "Genero", y = "Cantidad", fill = "Genero")
ggplotly(grafico)

La distribución por género permite conocer la representatividad de los estudiantes encuestados. En muchos estudios sobre salud mental, se observan diferencias notables entre géneros tanto en la prevalencia de síntomas como en la búsqueda de ayuda.

tabla_ansiedad <- table(datos$anxiety)

grafico_pastel <- plot_ly(labels = names(tabla_ansiedad), 
                          values = tabla_ansiedad, 
                          type = "pie", 
                          textinfo = "percent+label",  
                          marker = list(colors = c("lightblue", "salmon"))) %>%
  layout(title = "Distribución de estudiantes con ansiedad")


grafico_pastel
NA

La ansiedad es una de las condiciones más frecuentes entre estudiantes universitarios. Esta gráfica busca cuantificar cuántos estudiantes reconocen sentirse con ansiedad. En la misma, podemos ver que una buena parte de los estudiantes encuestados no se sienten con ansiedad.

plot_ly(datos, x=~cgpa, type='histogram')%>%
  layout(
    title = "Histograma de rendimiento",
    yaxis = list(title = "Cantidad de estudiantes")
  )

El rendimiento académico puede relacionarse con la salud mental, tanto como causa como consecuencia. Observar su distribución puede revelar si hay un sesgo hacia cierto tipo de estudiante.Si observamos, en la gráfica se ve que una gran mayoría tiene un rendimiento por arriba de 3 y unos pocos por debajo de este.

grafico <- ggplot(data = datos, aes(x = factor(seek_treatment), fill = factor(seek_treatment))) +
  geom_bar(alpha = 0.8) +
  labs(title = "Cantidad de encuestados que buscan ayuda profesional",x="Respuesta",y = "Cantidad", fill = "Cantidad")
ggplotly(grafico)

Si analizamos el grafico, podemos darnos cuenta que la gran parte de los encuestados no han buscado orientación profesional o bien desconocen de la existencia de estos recursos en su institucion.

#bivariable

datos <- datos %>%
  mutate(Area = case_when(
    course %in% c("Laws", "Law", "Psychology", "Human Resources", "Irkhs", "Kirkhs", "KIRKHS", "Usuluddin",
                  "Fiqh", "Fiqh fatwa", "Pendidikan Islam", "Islamic Education", "Communication", "Malcom", "Human Sciences") ~ "Ciencias Sociales y Humanidades",
    
    course %in% c("Biomedical science", "Biomedical Science", "Nursing", "Diploma Nursing", "Radiography", "Biotechnology", "MHSC") ~ "Ciencias de la Salud",
    
    course %in% c("Mathematics", "Mathemathics", "Marine science", "Econs", "Economics") ~ "Ciencias Exactas y Naturales",
    
    course %in% c("Accounting", "Banking Studies", "Business Administration", "KENMS", "Kop") ~ "Negocios y Economía",
    
    course %in% c("BIT", "BCS", "CTS", "IT", "Engineering", "Engine", "engin", "KOE", "ENM", "KOA", "BENL") ~ "Tecnología e Ingeniería",
    
    course %in% c("DIPLOMA TESL", "Pendidikan Islam", "Islamic Education") ~ "Educación y Formación Docente",
    
    TRUE ~ "Otros"
  ))


df_summary <- datos %>%
  filter(!is.na(depression)) %>%
  group_by(Area,depression) %>%
  summarise(count = n(), .groups = "drop")


plot_ly(df_summary,
        x = ~Area,
        y = ~count,
        color = ~depression,
        colors = c("#66c2a5", "#fc8d62"),
        type = "bar") %>%
  layout(title = "Distribución de depresion por área académica",
         xaxis = list(title = "Área Académica", tickangle = -30),
         yaxis = list(title = "Cantidad de estudiantes"),
         barmode = "group")
NA

En el grafico visto, podemos notar una alta densidad de estudiantes en las carreras de tecnología y en ciencias sociales. A su vez, estas parecen tener la mayor incidencia en padecimientos de despresión. Tambien es importante notar que en aquellas otras carreras que no se pudieron catalogar se ve que un mayor porcentaje de estudiantes presenta sintomas de depresion que los que no.


datos_contados <- datos %>%
  group_by(depression, seek_treatment) %>%
  summarise(count = n(), .groups = 'drop')


plot_ly(
  datos_contados,
  x = ~depression,
  y = ~count,
  color = ~seek_treatment,
  colors = c("steelblue", "firebrick"),
  type = "bar"
) %>%
  layout(
    title = "Estudiantes con depresión que buscan ayuda profesional",
    xaxis = list(title = "¿Depresión?"),
    yaxis = list(title = "Cantidad de estudiantes"),
    barmode = "group"  
  )

Revisando la grafica, podemos notar varias cosas, ninguno de los estudiantes que dijeron no tener depresión acude a un profesional. Mientras tanto, observamos que los estudiantes que dicen tener depresion son una minoría los que acuden recurren a tratamiento.


df <- datos %>%
  mutate(
    año = case_when(
      year_of_study == "foundation" ~ 0,
      year_of_study == "year 1" ~ 1,
      year_of_study == "year 2" ~ 2,
      year_of_study == "year 3" ~ 3,
      year_of_study == "year 4" ~ 4
    ),
    cgpa = case_when(
      cgpa == "0 - 1.99" ~ 1.0,
      cgpa == "2.00 - 2.49" ~ 2.25,
      cgpa == "2.50 - 2.99" ~ 2.75,
      cgpa == "3.00 - 3.49" ~ 3.25,
      cgpa == "3.50 - 4.00" ~ 3.75
    ),
    mental_health_score = (depression == "Yes") + 
                          (anxiety == "Yes") + 
                          (panic_attack == "Yes")
  )

fig <- plot_ly(
  data = df,
  x = ~age,
  y = ~cgpa,
  z = ~año,
  color = ~seek_treatment,
  size = ~mental_health_score,
  symbol = ~gender,
  text = ~paste("Course:", course,
                "<br>Depression:", depression,
                "<br>Anxiety:", anxiety,
                "<br>Panic Attack:", panic_attack),
  type = "scatter3d",
  mode = "markers"
)

fig <- fig %>% layout(title = "Relación entre Edad, CGPA y Año de Estudio con Salud Mental")
fig
Aviso: Ignoring 1 observationsAviso: `line.width` does not currently support multiple values.Aviso: `line.width` does not currently support multiple values.Aviso: `line.width` does not currently support multiple values.Aviso: minimal value for n is 3, returning requested palette with 3 different levels
Aviso: minimal value for n is 3, returning requested palette with 3 different levels
Aviso: Ignoring 1 observationsAviso: `line.width` does not currently support multiple values.Aviso: `line.width` does not currently support multiple values.Aviso: `line.width` does not currently support multiple values.Aviso: minimal value for n is 3, returning requested palette with 3 different levels
Aviso: minimal value for n is 3, returning requested palette with 3 different levels

Para dar algo de contexto sobre este grafico 3D podemos empezar diciendo que el tamaño de las burbujas crece segun que tantos padecimientos tenga la persona encuestada, y que segun el color de la burbuja representa si buscó ayuda profesional, con esto en mente podemos observar distintos patrones curiosos, como por ejemplo que las personas que presentan padecimientos de salud mental no siempre buscan tratamiento, y esto es mas notable en los primeros años de estudio y a edades mas tempranas, y tambien podemos observar que las personas con un rendimiento academico mas bajo tienden a presentar mas condiciones de salud mental


graficoFaceta <- ggplot(df, aes(x = gender, fill = seek_treatment)) +
  geom_bar(position = "fill") +
  facet_grid(depression ~ year_of_study) +
  labs(
    y = "Proporción",
    title = "Búsqueda de tratamiento por género, año y presencia de depresión",
    fill = "Busca tratamiento"
  ) +
  theme_minimal()
ggplotly(graficoFaceta)

En este grafico podemos observar varios comportamientos interesantes, en primer lugar podemos ver que las personas que presentan depresion son los unicos que se plantean el buscar tratamiento profesional, luego podemos observar como las mujeres son mas propensas a buscar ayuda profesional, mas que los hombres.

grafico1 <- plot_ly(data = datos, x = ~gender, color = ~depression, type = "histogram") %>%
  layout(title = list(text = "Depresión por género", y = 0.98),  
         xaxis = list(title = "Género"), 
         yaxis = list(title = "Cantidad"))

grafico2 <- plot_ly(data = datos, x = ~year_of_study, color = ~anxiety, type = "histogram") %>%
  layout(title = list(text = "Ansiedad por año de estudio", y = 0.98),
         xaxis = list(title = "Año de estudio"), 
         yaxis = list(title = "Cantidad"))

grafico3 <- plot_ly(data = datos, x = ~cgpa, color = ~seek_treatment, type = "histogram") %>%
  layout(title = list(text = "Búsqueda de tratamiento por CGPA", y = 0.98),
         xaxis = list(title = "CGPA"), 
         yaxis = list(title = "Cantidad"))


grafico_compuesto <- subplot(
  grafico1, grafico2, grafico3,
  nrows = 2, 
  margin = 0.1,  
  titleY = TRUE,  
  titleX = TRUE,  
  heights = c(0.5, 0.5)  
) %>% 
  layout(
    title = list(text = "Análisis compuesto de salud mental en estudiantes", 
                 x = 0.5, y = 0.98, xanchor = "center"),  
    showlegend = TRUE,
    annotations = list(
      list(x = 0.2, y = 1.0, text = "Depresión por género", showarrow = FALSE, xref = "paper", yref = "paper"),
      list(x = 1, y = 1.0, text = "Ansiedad por año de estudio", showarrow = FALSE, xref = "paper", yref = "paper"),
      list(x = 0.10, y = 0.40, text = "Búsqueda de tratamiento por CGPA", showarrow = FALSE, xref = "paper", yref = "paper")
    )
  )
Aviso: minimal value for n is 3, returning requested palette with 3 different levels
Aviso: minimal value for n is 3, returning requested palette with 3 different levels
Aviso: minimal value for n is 3, returning requested palette with 3 different levels
Aviso: minimal value for n is 3, returning requested palette with 3 different levels
Aviso: minimal value for n is 3, returning requested palette with 3 different levels
Aviso: minimal value for n is 3, returning requested palette with 3 different levels
grafico_compuesto

Los gráficos muestran patrones importantes sobre la salud mental de los estudiantes universitarios. Por ejemplo, se observa que las mujeres tienden a presentar más síntomas de depresión. También se nota que quienes están en los primeros años de carrera suelen sentir más ansiedad, posiblemente por el reto de adaptarse al nuevo ambiente académico y social. Además, los estudiantes con promedios más bajos (menos de 3.0) son menos propensos a buscar ayuda profesional, incluso si experimentan ansiedad o depresión. Esto podría deberse al estigma o a la falta de recursos accesibles. En general, los datos muestran la necesidad de ofrecer apoyo psicológico adaptado al género, al año de estudios y al rendimiento académico, y de promover campañas que ayuden a normalizar el cuidado de la salud mental en las universidades.

A partir de lo anteriormente expuesto, tenemos varias conclusiones que podemos hacer respecto a los estudiantes entrevistados, que si bien los graficos pueden variar dependiendo del lugar y la universidad, mucho de lo que se puede apreciar en estos datos se pueden extrapolar a otros lugares.

-Tan solo una minoría busca asesoramiento profesional ante la depresión y la ansiedad

-Se pudo observar que estudiantes de menor edad y en sus primeros años de estudio tienden a presentar más sintomas de depresion y ansiedad

-Los estudiantes con menor rendimiento academico se ven mayormente afectados tanto por depresion o por ansiedad

-Según la muestra de datos, los estudiantes del area de tecnologia y de ciencias sociales y humanidades, aparte de ser un sector mas denso, son los que tienden a ser más afectados por depresion o ansiedad.

-Vemos que a pesar de las pocas instancias, dentro de estas las mujeres fueron las que mas buscaron ayuda profesional.

Siendo esta la situación hay puntos que pueden ser algo alarmantes, por ejemplo:

La baja búsqueda de ayuda profesional sugiere que muchos estudiantes pueden estar enfrentando trastornos emocionales sin el acompañamiento adecuado, lo que podría estar manifestando un deterioro progresivo de su salud mental, ademas de esto, la baja búsqueda de ayuda profesional sugiere que muchos estudiantes pueden estar enfrentando trastornos emocionales sin el acompañamiento adecuado, lo que podría derivar en un deterioro progresivo de su bienestar psicológico.

A su vez, los estudiantes más jóvenes y de primeros años, al ser más afectados podrían tener mayores dificultades de adaptación al entorno universitario, afectando de mala manera su permanencia y el desarrollo académico.

De la misma forma, aunque las mujeres buscan más ayuda, sigue siendo preocupante que los hombres, posiblemente por estigmas de género, no accedan a apoyo profesional, reprimiendo así sus aflicciones.

Siendo así, sería útil implementar acciones que propicien la buena salud mental , quizas fortaleciendo los servicios de salud mental en universidades, haciendo campañas de concientización y desestigmatización o fomentar aún más el equilibrio entre vida académica y personal

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBzb2JyZSBsYSBzYWx1ZCBtZW50YWwgZW4gZXN0dWRpYW50ZXMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCg0KPGgyIHN0eWxlPSJjb2xvcjpkYXJrYmx1ZTsiPg0KDQpJbnRyb2R1Y2Npw7NuDQoNCjwvaDI+DQoNCjxwPg0KRW4gbG9zIMO6bHRpbW9zIGHDsW9zLCBsYSBzYWx1ZCBtZW50YWwgaGEgY29icmFkbyB1bmEgcmVsZXZhbmNpYSBjcmVjaWVudGUsIGVzcGVjaWFsbWVudGUgZGVudHJvIGRlbCDDoW1iaXRvIGVkdWNhdGl2by4gRXN0dWRpYW50ZXMgZGUgdG9kb3MgbG9zIG5pdmVsZXMgZW5mcmVudGFuIHByZXNpb25lcyBhY2Fkw6ltaWNhcywgc29jaWFsZXMgeSBwZXJzb25hbGVzIHF1ZSBwdWVkZW4gYWZlY3RhciBzaWduaWZpY2F0aXZhbWVudGUgc3UgYmllbmVzdGFyIGVtb2Npb25hbC4gRW4gZXN0ZSBjb250ZXh0bywgZW50ZW5kZXIgbG9zIGZhY3RvcmVzIHF1ZSBpbmZsdXllbiBlbiBsYSBzYWx1ZCBtZW50YWwgZGUgbG9zIGVzdHVkaWFudGVzIHVuaXZlcnNpdGFyaW9zIGVzIGZ1bmRhbWVudGFsIHBhcmEgZGVzYXJyb2xsYXIgZXN0cmF0ZWdpYXMgZGUgYXBveW8gbcOhcyBlZmVjdGl2YXMuDQo8L3A+DQoNCjxwPg0KRXN0ZSBwcm95ZWN0byBwcmVzZW50YSB1biBhbsOhbGlzaXMgZXhwbG9yYXRvcmlvIGRlIGRhdG9zIChFREEpIGVuZm9jYWRvIGVuIHVuIGNvbmp1bnRvIGRlIGluZm9ybWFjacOzbiByZWNvcGlsYWRhIG1lZGlhbnRlIGVuY3Vlc3RhcyBhIGVzdHVkaWFudGVzIHVuaXZlcnNpdGFyaW9zIHNvYnJlIHN1IHNhbHVkIG1lbnRhbC4gQSB0cmF2w6lzIGRlIHVuYSBzZXJpZSBkZSB2aXN1YWxpemFjaW9uZXMgaW50ZXJhY3RpdmFzLCBzZSBidXNjYSBpZGVudGlmaWNhciBwYXRyb25lcywgcmVsYWNpb25lcyB5IHBvc2libGVzIGZhY3RvcmVzIGRlIHJpZXNnbyBvIHByb3RlY2Npw7NuIHF1ZSBpbmNpZGVuIGVuIGVsIGJpZW5lc3RhciBwc2ljb2zDs2dpY28gZGUgZXN0YSBwb2JsYWNpw7NuLg0KPC9wPg0KDQo8cD4NClBhcmEgaGFjZXIgdW5hIGFwcm9waWFkYSBzw61udGVzaXMgZGUgZXN0b3MgZGF0b3MgdmVtb3MgcHJlY2lzbyB1dGlsaXphciBsYXMgaGVycmFtaWVudGFzIGRlIHZpc3VhbGl6YWNpb24gZ3JhZmljYSBxdWUgZWwgbGVuZ3VhamUgUiBlcyBjYXBheiBkZSBmYWNpbGl0YXIsIHlhIHF1ZSBtw6FzIHF1ZSBzw7NsbyBtb3N0cmFyIGRhdG9zLCBwcmV0ZW5kZW1vcyBhcHVudGFyIGEgbGFzIGNhdXNhcywgbG9zIHBhdHJvbmVzIHkgbG9zIGZhY3RvcmVzIHF1ZSBpbmZsdXllbiBuZWdhdGl2YW1lbnRlIHNvYnJlIGxhIHNhbHVkIG1lbnRhbCBkZSBsb3MgZXN0dWRpYW50ZXMsIHBhcmEgZGUgZXN0YSBtYW5lcmEsIHRhbnRvIGxvcyBlc3R1ZGlhbnRlcyBjb21vIGxhcyBpbnN0aXR1Y2lvbmVzIHB1ZWRhbiB2YWxvcmFyIHF1w6kgc2UgcHVlZGUgbWVqb3JhciBwYXJhIHVuYSBtYW50ZW5lciB1bmEgYnVlbmEgc2FsdWQgbWVudGFsLg0KPC9wPg0KDQo8aDIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KRGVzY3JpcGNpw7NuIGRlbCBwcm9ibGVtYQ0KPGgyLz4NCg0KPHA+DQpMYSBldGFwYSB1bml2ZXJzaXRhcmlhIHJlcHJlc2VudGEgdW4gcGVyaW9kbyBkZSBwcm9mdW5kb3MgY2FtYmlvcyB5IGV4aWdlbmNpYXMgcGFyYSBsb3MgasOzdmVuZXMuIEZhY3RvcmVzIGNvbW8gbGEgY2FyZ2EgYWNhZMOpbWljYSwgbGEgYWRhcHRhY2nDs24gc29jaWFsLCBsYSBwcmVzacOzbiBwb3IgZWwgcmVuZGltaWVudG8sIGxhIGluY2VydGlkdW1icmUgc29icmUgZWwgZnV0dXJvIHkgbGEgZmFsdGEgZGUgcmVkZXMgZGUgYXBveW8gcHVlZGVuIGRlc2VuY2FkZW5hciBhbHRvcyBuaXZlbGVzIGRlIGVzdHLDqXMsIGFuc2llZGFkIHkgb3Ryb3MgcHJvYmxlbWFzIGRlIHNhbHVkIG1lbnRhbC4NCg0KQSBwZXNhciBkZWwgY3JlY2llbnRlIHJlY29ub2NpbWllbnRvIGRlIGVzdGUgZmVuw7NtZW5vLCBtdWNoYXMgdW5pdmVyc2lkYWRlcyBhw7puIGNhcmVjZW4gZGUgbWVjYW5pc21vcyBhZGVjdWFkb3MgcGFyYSBkZXRlY3RhciB5IGF0ZW5kZXIgb3BvcnR1bmFtZW50ZSBlc3RvcyBwcm9ibGVtYXMuIEEgbWVudWRvLCBsb3MgZXN0dWRpYW50ZXMgbm8gYnVzY2FuIGF5dWRhIHByb2Zlc2lvbmFsIHBvciBkZXNjb25vY2ltaWVudG8sIGVzdGlnbWF0aXphY2nDs24gbyBmYWx0YSBkZSByZWN1cnNvcyBhY2Nlc2libGVzLg0KDQpFc3RlIHByb3llY3RvIHBhcnRlIGRlIHVuYSBwcmVndW50YSBjZW50cmFsOg0Kwr9RdcOpIHBhdHJvbmVzIG8gZmFjdG9yZXMgcHVlZGVuIGVzdGFyIGFzb2NpYWRvcyBjb24gbGEgc2FsdWQgbWVudGFsIGRlIGxvcyBlc3R1ZGlhbnRlcyB1bml2ZXJzaXRhcmlvcywgc2Vnw7puIGxvcyBkYXRvcyBhdXRvZGVjbGFyYWRvcyBlbiB1bmEgZW5jdWVzdGE/DQoNCkVudHJlIGxhcyBwcmVndW50YXMgZXNwZWPDrWZpY2FzIHF1ZSBndWlhcsOhbiBlc3RlIGFuw6FsaXNpcyBzZSBlbmN1ZW50cmFuOg0KDQrCv1F1w6kgdGFuIGZyZWN1ZW50ZSBlcyBlbCBlc3Ryw6lzIGVudHJlIGxvcyBlc3R1ZGlhbnRlcyBlbmN1ZXN0YWRvcz8NCg0Kwr9FeGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIGfDqW5lcm9zIG8gY3Vyc29zIGVuIGN1YW50byBhIGxhIGLDunNxdWVkYSBkZSBheXVkYSBwcm9mZXNpb25hbD8NCg0Kwr9RdcOpIHJlbGFjacOzbiBleGlzdGUgZW50cmUgbGEgZWRhZCwgZWwgdGlwbyBkZSBpbnN0aXR1Y2nDs24geSBsYSBwcmVzZW5jaWEgZGUgcHJvYmxlbWFzIG1lbnRhbGVzPw0KDQpFbCBvYmpldGl2byBkZSBlc3RlIGFuw6FsaXNpcyBlcyBwcm9wb3JjaW9uYXIgdW5hIHZpc2nDs24gYmFzYWRhIGVuIGRhdG9zIHF1ZSBwZXJtaXRhIGNvbXByZW5kZXIgbWVqb3IgbGEgc2l0dWFjacOzbiBhY3R1YWwgZGUgbG9zIGVzdHVkaWFudGVzIHksIGV2ZW50dWFsbWVudGUsIG9mcmVjZXIgaW5mb3JtYWNpw7NuIMO6dGlsIHBhcmEgbGEgdG9tYSBkZSBkZWNpc2lvbmVzIGluc3RpdHVjaW9uYWxlcy4NCjxwLz4NCg0KPGgyIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCkRlZmluaWNpw7NuIGRlIGZ1ZW50ZXMgZGUgZGF0b3MNCjxoMi8+DQo8cD4NClBhcmEgZXN0ZSBhbsOhbGlzaXMgc2UgdXRpbGl6YSB1biBjb25qdW50byBkZSBkYXRvcyBkZW5vbWluYWRvICJTdHVkZW50IE1lbnRhbCBIZWFsdGgiLCBxdWUgcmVjb3BpbGEgcmVzcHVlc3RhcyBkZSBlc3R1ZGlhbnRlcyB1bml2ZXJzaXRhcmlvcyBhIHVuYSBlbmN1ZXN0YSBlbmZvY2FkYSBlbiBzdSBlc3RhZG8gZW1vY2lvbmFsLCBow6FiaXRvcyB5IGFjY2VzbyBhIHNlcnZpY2lvcyBkZSBzYWx1ZCBtZW50YWwuDQoNCkNhcmFjdGVyw61zdGljYXMgcHJpbmNpcGFsZXMgZGVsIGNvbmp1bnRvIGRlIGRhdG9zOg0KDQpDYW50aWRhZCBkZSBvYnNlcnZhY2lvbmVzOiAxMDEgZXN0dWRpYW50ZXMNCg0KVmFyaWFibGVzIGEgdXNhcjoNCg0KdGltZXN0YW1wOiBGZWNoYSB5IGhvcmEgZGUgbGEgcmVzcHVlc3RhLg0KDQpnZW5kZXI6IEfDqW5lcm8gZGVsIGVzdHVkaWFudGUuDQoNCmFnZTogRWRhZCBkZWwgZXN0dWRpYW50ZS4NCg0KY291cnNlOiBDYXJyZXJhIG8gw6FyZWEgZGUgZXN0dWRpby4NCg0KeWVhciBvZiBzdHVkeTogQcOxbyBhY3R1YWwgZGUgY2FycmVyYS4NCg0KY2dwYTogUHJvbWVkaW8gZGUgY2FsaWZpY2FjaW9uZXMuDQoNCm1hcml0YWwgc3RhdHVzOiBFc3RhZG8gbWFyaXRhbCBkZWwgZXN0dWRpYW50ZS4NCg0Kc3RyZXNzOiBJbmRpY2Egc2kgZWwgZXN0dWRpYW50ZSByZXBvcnRhIHNlbnRpcnNlIGVzdHJlc2Fkby4NCg0KZGVwcmVzc2lvbjogUHJlc2VuY2lhIGRlIHPDrW50b21hcyBkZXByZXNpdm9zLg0KDQphbnhpZXR5OiBQcmVzZW5jaWEgZGUgYW5zaWVkYWQuDQoNCnBhbmljayBhdHRhY2s6IEluZGljYSBzaSBzZSBoYW4gcHJlc2VudGFkbyBhdGFxdWVzIGRlIGFuc2llZGFkLg0KDQpzZWVrIHRyZWF0bWVudDogSW5kaWNhIHNpIGVsIGVzdHVkaWFudGUgaGEgYnVzY2FkbyBheXVkYSBwcm9mZXNpb25hbC4NCjxwLz4NCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpkYXRvcyA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9qc3VlYy9Eb3dubG9hZHMvU3R1ZGVudF9NZW50YWxfSGVhbHRoX0NsZWFuZWQueGxzeCIpDQoNCmdyYWZpY28gPC0gZ2dwbG90KGRhdGEgPSBkYXRvcywgYWVzKHggPSBmYWN0b3IoZ2VuZGVyKSwgZmlsbCA9IGZhY3RvcihnZW5kZXIpKSkgKw0KICBnZW9tX2JhcihhbHBoYSA9IDAuOCkgKw0KICBsYWJzKHRpdGxlID0gIkdlbmVybyBkZSBlbmN1ZXN0YWRvcyIsIHggPSAiR2VuZXJvIiwgeSA9ICJDYW50aWRhZCIsIGZpbGwgPSAiR2VuZXJvIikNCmdncGxvdGx5KGdyYWZpY28pDQpgYGANCjxwPg0KTGEgZGlzdHJpYnVjacOzbiBwb3IgZ8OpbmVybyBwZXJtaXRlIGNvbm9jZXIgbGEgcmVwcmVzZW50YXRpdmlkYWQgZGUgbG9zIGVzdHVkaWFudGVzIGVuY3Vlc3RhZG9zLiBFbiBtdWNob3MgZXN0dWRpb3Mgc29icmUgc2FsdWQgbWVudGFsLCBzZSBvYnNlcnZhbiBkaWZlcmVuY2lhcyBub3RhYmxlcyBlbnRyZSBnw6luZXJvcyB0YW50byBlbiBsYSBwcmV2YWxlbmNpYSBkZSBzw61udG9tYXMgY29tbyBlbiBsYSBiw7pzcXVlZGEgZGUgYXl1ZGEuDQoNCjxwLz4NCg0KYGBge3J9DQp0YWJsYV9hbnNpZWRhZCA8LSB0YWJsZShkYXRvcyRhbnhpZXR5KQ0KDQpncmFmaWNvX3Bhc3RlbCA8LSBwbG90X2x5KGxhYmVscyA9IG5hbWVzKHRhYmxhX2Fuc2llZGFkKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRhYmxhX2Fuc2llZGFkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJwaWUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGluZm8gPSAicGVyY2VudCtsYWJlbCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gbGlzdChjb2xvcnMgPSBjKCJsaWdodGJsdWUiLCAic2FsbW9uIikpKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgZXN0dWRpYW50ZXMgY29uIGFuc2llZGFkIikNCg0KDQpncmFmaWNvX3Bhc3RlbA0KDQpgYGANCg0KPHA+DQpMYSBhbnNpZWRhZCBlcyB1bmEgZGUgbGFzIGNvbmRpY2lvbmVzIG3DoXMgZnJlY3VlbnRlcyBlbnRyZSBlc3R1ZGlhbnRlcyB1bml2ZXJzaXRhcmlvcy4gRXN0YSBncsOhZmljYSBidXNjYSBjdWFudGlmaWNhciBjdcOhbnRvcyBlc3R1ZGlhbnRlcyByZWNvbm9jZW4gc2VudGlyc2UgY29uIGFuc2llZGFkLiBFbiBsYSBtaXNtYSwgcG9kZW1vcyB2ZXIgcXVlIHVuYSBidWVuYSBwYXJ0ZSBkZSBsb3MgZXN0dWRpYW50ZXMgZW5jdWVzdGFkb3Mgbm8gc2Ugc2llbnRlbiBjb24gYW5zaWVkYWQuDQo8cC8+DQoNCg0KYGBge3J9DQpwbG90X2x5KGRhdG9zLCB4PX5jZ3BhLCB0eXBlPSdoaXN0b2dyYW0nKSU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiSGlzdG9ncmFtYSBkZSByZW5kaW1pZW50byIsDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNhbnRpZGFkIGRlIGVzdHVkaWFudGVzIikNCiAgKQ0KYGBgDQo8cD4NCkVsIHJlbmRpbWllbnRvIGFjYWTDqW1pY28gcHVlZGUgcmVsYWNpb25hcnNlIGNvbiBsYSBzYWx1ZCBtZW50YWwsIHRhbnRvIGNvbW8gY2F1c2EgY29tbyBjb25zZWN1ZW5jaWEuIE9ic2VydmFyIHN1IGRpc3RyaWJ1Y2nDs24gcHVlZGUgcmV2ZWxhciBzaSBoYXkgdW4gc2VzZ28gaGFjaWEgY2llcnRvIHRpcG8gZGUgZXN0dWRpYW50ZS5TaSBvYnNlcnZhbW9zLCBlbiBsYSBncsOhZmljYSBzZSB2ZSBxdWUgdW5hIGdyYW4gbWF5b3LDrWEgdGllbmUgdW4gcmVuZGltaWVudG8gcG9yIGFycmliYSBkZSAzIHkgdW5vcyBwb2NvcyBwb3IgZGViYWpvIGRlIGVzdGUuDQo8cC8+DQoNCmBgYHtyfQ0KZ3JhZmljbyA8LSBnZ3Bsb3QoZGF0YSA9IGRhdG9zLCBhZXMoeCA9IGZhY3RvcihzZWVrX3RyZWF0bWVudCksIGZpbGwgPSBmYWN0b3Ioc2Vla190cmVhdG1lbnQpKSkgKw0KICBnZW9tX2JhcihhbHBoYSA9IDAuOCkgKw0KICBsYWJzKHRpdGxlID0gIkNhbnRpZGFkIGRlIGVuY3Vlc3RhZG9zIHF1ZSBidXNjYW4gYXl1ZGEgcHJvZmVzaW9uYWwiLHg9IlJlc3B1ZXN0YSIseSA9ICJDYW50aWRhZCIsIGZpbGwgPSAiQ2FudGlkYWQiKQ0KZ2dwbG90bHkoZ3JhZmljbykNCmBgYA0KPHA+DQpTaSBhbmFsaXphbW9zIGVsIGdyYWZpY28sIHBvZGVtb3MgZGFybm9zIGN1ZW50YSBxdWUgbGEgZ3JhbiBwYXJ0ZSBkZSBsb3MgZW5jdWVzdGFkb3Mgbm8gaGFuIGJ1c2NhZG8gb3JpZW50YWNpw7NuIHByb2Zlc2lvbmFsIG8gYmllbiBkZXNjb25vY2VuIGRlIGxhIGV4aXN0ZW5jaWEgZGUgZXN0b3MgcmVjdXJzb3MgZW4gc3UgaW5zdGl0dWNpb24uIA0KPHAvPg0KDQoNCiNiaXZhcmlhYmxlDQoNCmBgYHtyfQ0KZGF0b3MgPC0gZGF0b3MgJT4lDQogIG11dGF0ZShBcmVhID0gY2FzZV93aGVuKA0KICAgIGNvdXJzZSAlaW4lIGMoIkxhd3MiLCAiTGF3IiwgIlBzeWNob2xvZ3kiLCAiSHVtYW4gUmVzb3VyY2VzIiwgIklya2hzIiwgIktpcmtocyIsICJLSVJLSFMiLCAiVXN1bHVkZGluIiwNCiAgICAgICAgICAgICAgICAgICJGaXFoIiwgIkZpcWggZmF0d2EiLCAiUGVuZGlkaWthbiBJc2xhbSIsICJJc2xhbWljIEVkdWNhdGlvbiIsICJDb21tdW5pY2F0aW9uIiwgIk1hbGNvbSIsICJIdW1hbiBTY2llbmNlcyIpIH4gIkNpZW5jaWFzIFNvY2lhbGVzIHkgSHVtYW5pZGFkZXMiLA0KICAgIA0KICAgIGNvdXJzZSAlaW4lIGMoIkJpb21lZGljYWwgc2NpZW5jZSIsICJCaW9tZWRpY2FsIFNjaWVuY2UiLCAiTnVyc2luZyIsICJEaXBsb21hIE51cnNpbmciLCAiUmFkaW9ncmFwaHkiLCAiQmlvdGVjaG5vbG9neSIsICJNSFNDIikgfiAiQ2llbmNpYXMgZGUgbGEgU2FsdWQiLA0KICAgIA0KICAgIGNvdXJzZSAlaW4lIGMoIk1hdGhlbWF0aWNzIiwgIk1hdGhlbWF0aGljcyIsICJNYXJpbmUgc2NpZW5jZSIsICJFY29ucyIsICJFY29ub21pY3MiKSB+ICJDaWVuY2lhcyBFeGFjdGFzIHkgTmF0dXJhbGVzIiwNCiAgICANCiAgICBjb3Vyc2UgJWluJSBjKCJBY2NvdW50aW5nIiwgIkJhbmtpbmcgU3R1ZGllcyIsICJCdXNpbmVzcyBBZG1pbmlzdHJhdGlvbiIsICJLRU5NUyIsICJLb3AiKSB+ICJOZWdvY2lvcyB5IEVjb25vbcOtYSIsDQogICAgDQogICAgY291cnNlICVpbiUgYygiQklUIiwgIkJDUyIsICJDVFMiLCAiSVQiLCAiRW5naW5lZXJpbmciLCAiRW5naW5lIiwgImVuZ2luIiwgIktPRSIsICJFTk0iLCAiS09BIiwgIkJFTkwiKSB+ICJUZWNub2xvZ8OtYSBlIEluZ2VuaWVyw61hIiwNCiAgICANCiAgICBjb3Vyc2UgJWluJSBjKCJESVBMT01BIFRFU0wiLCAiUGVuZGlkaWthbiBJc2xhbSIsICJJc2xhbWljIEVkdWNhdGlvbiIpIH4gIkVkdWNhY2nDs24geSBGb3JtYWNpw7NuIERvY2VudGUiLA0KICAgIA0KICAgIFRSVUUgfiAiT3Ryb3MiDQogICkpDQoNCg0KZGZfc3VtbWFyeSA8LSBkYXRvcyAlPiUNCiAgZmlsdGVyKCFpcy5uYShkZXByZXNzaW9uKSkgJT4lDQogIGdyb3VwX2J5KEFyZWEsZGVwcmVzc2lvbikgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikNCg0KDQpwbG90X2x5KGRmX3N1bW1hcnksDQogICAgICAgIHggPSB+QXJlYSwNCiAgICAgICAgeSA9IH5jb3VudCwNCiAgICAgICAgY29sb3IgPSB+ZGVwcmVzc2lvbiwNCiAgICAgICAgY29sb3JzID0gYygiIzY2YzJhNSIsICIjZmM4ZDYyIiksDQogICAgICAgIHR5cGUgPSAiYmFyIikgJT4lDQogIGxheW91dCh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIGRlIGRlcHJlc2lvbiBwb3Igw6FyZWEgYWNhZMOpbWljYSIsDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiw4FyZWEgQWNhZMOpbWljYSIsIHRpY2thbmdsZSA9IC0zMCksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ2FudGlkYWQgZGUgZXN0dWRpYW50ZXMiKSwNCiAgICAgICAgIGJhcm1vZGUgPSAiZ3JvdXAiKQ0KDQpgYGANCg0KPHA+DQpFbiBlbCBncmFmaWNvIHZpc3RvLCBwb2RlbW9zIG5vdGFyIHVuYSBhbHRhIGRlbnNpZGFkIGRlIGVzdHVkaWFudGVzIGVuIGxhcyBjYXJyZXJhcyBkZSB0ZWNub2xvZ8OtYSB5IGVuIGNpZW5jaWFzIHNvY2lhbGVzLiBBIHN1IHZleiwgZXN0YXMgcGFyZWNlbiB0ZW5lciBsYSBtYXlvciBpbmNpZGVuY2lhIGVuIHBhZGVjaW1pZW50b3MgZGUgZGVzcHJlc2nDs24uIFRhbWJpZW4gZXMgaW1wb3J0YW50ZSBub3RhciBxdWUgZW4gYXF1ZWxsYXMgb3RyYXMgY2FycmVyYXMgcXVlIG5vIHNlIHB1ZGllcm9uIGNhdGFsb2dhciBzZSB2ZSBxdWUgdW4gbWF5b3IgcG9yY2VudGFqZSBkZSBlc3R1ZGlhbnRlcyBwcmVzZW50YSBzaW50b21hcyBkZSBkZXByZXNpb24gcXVlIGxvcyBxdWUgbm8uIA0KPC9wPg0KDQpgYGB7cn0NCg0KZGF0b3NfY29udGFkb3MgPC0gZGF0b3MgJT4lDQogIGdyb3VwX2J5KGRlcHJlc3Npb24sIHNlZWtfdHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQoNCnBsb3RfbHkoDQogIGRhdG9zX2NvbnRhZG9zLA0KICB4ID0gfmRlcHJlc3Npb24sDQogIHkgPSB+Y291bnQsDQogIGNvbG9yID0gfnNlZWtfdHJlYXRtZW50LA0KICBjb2xvcnMgPSBjKCJzdGVlbGJsdWUiLCAiZmlyZWJyaWNrIiksDQogIHR5cGUgPSAiYmFyIg0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkVzdHVkaWFudGVzIGNvbiBkZXByZXNpw7NuIHF1ZSBidXNjYW4gYXl1ZGEgcHJvZmVzaW9uYWwiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICLCv0RlcHJlc2nDs24/IiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNhbnRpZGFkIGRlIGVzdHVkaWFudGVzIiksDQogICAgYmFybW9kZSA9ICJncm91cCIgIA0KICApDQpgYGANCjxwPg0KUmV2aXNhbmRvIGxhIGdyYWZpY2EsIHBvZGVtb3Mgbm90YXIgdmFyaWFzIGNvc2FzLCBuaW5ndW5vIGRlIGxvcyBlc3R1ZGlhbnRlcyBxdWUgZGlqZXJvbiBubyB0ZW5lciBkZXByZXNpw7NuIGFjdWRlIGEgdW4gcHJvZmVzaW9uYWwuIE1pZW50cmFzIHRhbnRvLCBvYnNlcnZhbW9zIHF1ZSBsb3MgZXN0dWRpYW50ZXMgcXVlIGRpY2VuIHRlbmVyIGRlcHJlc2lvbiBzb24gdW5hIG1pbm9yw61hIGxvcyBxdWUgYWN1ZGVuIHJlY3VycmVuIGEgdHJhdGFtaWVudG8uDQo8cC8+DQoNCmBgYHtyfQ0KDQpkZiA8LSBkYXRvcyAlPiUNCiAgbXV0YXRlKA0KICAgIGHDsW8gPSBjYXNlX3doZW4oDQogICAgICB5ZWFyX29mX3N0dWR5ID09ICJmb3VuZGF0aW9uIiB+IDAsDQogICAgICB5ZWFyX29mX3N0dWR5ID09ICJ5ZWFyIDEiIH4gMSwNCiAgICAgIHllYXJfb2Zfc3R1ZHkgPT0gInllYXIgMiIgfiAyLA0KICAgICAgeWVhcl9vZl9zdHVkeSA9PSAieWVhciAzIiB+IDMsDQogICAgICB5ZWFyX29mX3N0dWR5ID09ICJ5ZWFyIDQiIH4gNA0KICAgICksDQogICAgY2dwYSA9IGNhc2Vfd2hlbigNCiAgICAgIGNncGEgPT0gIjAgLSAxLjk5IiB+IDEuMCwNCiAgICAgIGNncGEgPT0gIjIuMDAgLSAyLjQ5IiB+IDIuMjUsDQogICAgICBjZ3BhID09ICIyLjUwIC0gMi45OSIgfiAyLjc1LA0KICAgICAgY2dwYSA9PSAiMy4wMCAtIDMuNDkiIH4gMy4yNSwNCiAgICAgIGNncGEgPT0gIjMuNTAgLSA0LjAwIiB+IDMuNzUNCiAgICApLA0KICAgIG1lbnRhbF9oZWFsdGhfc2NvcmUgPSAoZGVwcmVzc2lvbiA9PSAiWWVzIikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGFueGlldHkgPT0gIlllcyIpICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgIChwYW5pY19hdHRhY2sgPT0gIlllcyIpDQogICkNCg0KZmlnIDwtIHBsb3RfbHkoDQogIGRhdGEgPSBkZiwNCiAgeCA9IH5hZ2UsDQogIHkgPSB+Y2dwYSwNCiAgeiA9IH5hw7FvLA0KICBjb2xvciA9IH5zZWVrX3RyZWF0bWVudCwNCiAgc2l6ZSA9IH5tZW50YWxfaGVhbHRoX3Njb3JlLA0KICBzeW1ib2wgPSB+Z2VuZGVyLA0KICB0ZXh0ID0gfnBhc3RlKCJDb3Vyc2U6IiwgY291cnNlLA0KICAgICAgICAgICAgICAgICI8YnI+RGVwcmVzc2lvbjoiLCBkZXByZXNzaW9uLA0KICAgICAgICAgICAgICAgICI8YnI+QW54aWV0eToiLCBhbnhpZXR5LA0KICAgICAgICAgICAgICAgICI8YnI+UGFuaWMgQXR0YWNrOiIsIHBhbmljX2F0dGFjayksDQogIHR5cGUgPSAic2NhdHRlcjNkIiwNCiAgbW9kZSA9ICJtYXJrZXJzIg0KKQ0KDQpmaWcgPC0gZmlnICU+JSBsYXlvdXQodGl0bGUgPSAiUmVsYWNpw7NuIGVudHJlIEVkYWQsIENHUEEgeSBBw7FvIGRlIEVzdHVkaW8gY29uIFNhbHVkIE1lbnRhbCIpDQpmaWcNCmBgYA0KPHA+DQpQYXJhIGRhciBhbGdvIGRlIGNvbnRleHRvIHNvYnJlIGVzdGUgZ3JhZmljbyAzRCBwb2RlbW9zIGVtcGV6YXIgZGljaWVuZG8gcXVlIGVsIHRhbWHDsW8gZGUgbGFzIGJ1cmJ1amFzIGNyZWNlIHNlZ3VuIHF1ZSB0YW50b3MgcGFkZWNpbWllbnRvcyB0ZW5nYSBsYSBwZXJzb25hIGVuY3Vlc3RhZGEsIHkgcXVlIHNlZ3VuIGVsIGNvbG9yIGRlIGxhIGJ1cmJ1amEgcmVwcmVzZW50YSBzaSBidXNjw7MgYXl1ZGEgcHJvZmVzaW9uYWwsIGNvbiBlc3RvIGVuIG1lbnRlIHBvZGVtb3Mgb2JzZXJ2YXIgZGlzdGludG9zIHBhdHJvbmVzIGN1cmlvc29zLCBjb21vIHBvciBlamVtcGxvIHF1ZSBsYXMgcGVyc29uYXMgcXVlIHByZXNlbnRhbiBwYWRlY2ltaWVudG9zIGRlIHNhbHVkIG1lbnRhbCBubyBzaWVtcHJlIGJ1c2NhbiB0cmF0YW1pZW50bywgeSBlc3RvIGVzIG1hcyBub3RhYmxlIGVuIGxvcyBwcmltZXJvcyBhw7FvcyBkZSBlc3R1ZGlvIHkgYSBlZGFkZXMgbWFzIHRlbXByYW5hcywgeSB0YW1iaWVuIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGxhcyBwZXJzb25hcyBjb24gdW4gcmVuZGltaWVudG8gYWNhZGVtaWNvIG1hcyBiYWpvIHRpZW5kZW4gYSBwcmVzZW50YXIgbWFzIGNvbmRpY2lvbmVzIGRlIHNhbHVkIG1lbnRhbA0KPHAvPg0KYGBge3J9DQoNCmdyYWZpY29GYWNldGEgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IGdlbmRlciwgZmlsbCA9IHNlZWtfdHJlYXRtZW50KSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKw0KICBmYWNldF9ncmlkKGRlcHJlc3Npb24gfiB5ZWFyX29mX3N0dWR5KSArDQogIGxhYnMoDQogICAgeSA9ICJQcm9wb3JjacOzbiIsDQogICAgdGl0bGUgPSAiQsO6c3F1ZWRhIGRlIHRyYXRhbWllbnRvIHBvciBnw6luZXJvLCBhw7FvIHkgcHJlc2VuY2lhIGRlIGRlcHJlc2nDs24iLA0KICAgIGZpbGwgPSAiQnVzY2EgdHJhdGFtaWVudG8iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmdncGxvdGx5KGdyYWZpY29GYWNldGEpDQpgYGANCjxwPg0KRW4gZXN0ZSBncmFmaWNvIHBvZGVtb3Mgb2JzZXJ2YXIgdmFyaW9zIGNvbXBvcnRhbWllbnRvcyBpbnRlcmVzYW50ZXMsIGVuIHByaW1lciBsdWdhciBwb2RlbW9zIHZlciBxdWUgbGFzIHBlcnNvbmFzIHF1ZSBwcmVzZW50YW4gZGVwcmVzaW9uIHNvbiBsb3MgdW5pY29zIHF1ZSBzZSBwbGFudGVhbiBlbCBidXNjYXIgdHJhdGFtaWVudG8gcHJvZmVzaW9uYWwsIGx1ZWdvIHBvZGVtb3Mgb2JzZXJ2YXIgY29tbyBsYXMgbXVqZXJlcyBzb24gbWFzIHByb3BlbnNhcyBhIGJ1c2NhciBheXVkYSBwcm9mZXNpb25hbCwgbWFzIHF1ZSBsb3MgaG9tYnJlcy4NCjxwLz4NCmBgYHtyfQ0KZ3JhZmljbzEgPC0gcGxvdF9seShkYXRhID0gZGF0b3MsIHggPSB+Z2VuZGVyLCBjb2xvciA9IH5kZXByZXNzaW9uLCB0eXBlID0gImhpc3RvZ3JhbSIpICU+JQ0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSAiRGVwcmVzacOzbiBwb3IgZ8OpbmVybyIsIHkgPSAwLjk4KSwgIA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkfDqW5lcm8iKSwgDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ2FudGlkYWQiKSkNCg0KZ3JhZmljbzIgPC0gcGxvdF9seShkYXRhID0gZGF0b3MsIHggPSB+eWVhcl9vZl9zdHVkeSwgY29sb3IgPSB+YW54aWV0eSwgdHlwZSA9ICJoaXN0b2dyYW0iKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIkFuc2llZGFkIHBvciBhw7FvIGRlIGVzdHVkaW8iLCB5ID0gMC45OCksDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQcOxbyBkZSBlc3R1ZGlvIiksIA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNhbnRpZGFkIikpDQoNCmdyYWZpY28zIDwtIHBsb3RfbHkoZGF0YSA9IGRhdG9zLCB4ID0gfmNncGEsIGNvbG9yID0gfnNlZWtfdHJlYXRtZW50LCB0eXBlID0gImhpc3RvZ3JhbSIpICU+JQ0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSAiQsO6c3F1ZWRhIGRlIHRyYXRhbWllbnRvIHBvciBDR1BBIiwgeSA9IDAuOTgpLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkNHUEEiKSwgDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ2FudGlkYWQiKSkNCg0KDQpncmFmaWNvX2NvbXB1ZXN0byA8LSBzdWJwbG90KA0KICBncmFmaWNvMSwgZ3JhZmljbzIsIGdyYWZpY28zLA0KICBucm93cyA9IDIsIA0KICBtYXJnaW4gPSAwLjEsICANCiAgdGl0bGVZID0gVFJVRSwgIA0KICB0aXRsZVggPSBUUlVFLCAgDQogIGhlaWdodHMgPSBjKDAuNSwgMC41KSAgDQopICU+JSANCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIkFuw6FsaXNpcyBjb21wdWVzdG8gZGUgc2FsdWQgbWVudGFsIGVuIGVzdHVkaWFudGVzIiwgDQogICAgICAgICAgICAgICAgIHggPSAwLjUsIHkgPSAwLjk4LCB4YW5jaG9yID0gImNlbnRlciIpLCAgDQogICAgc2hvd2xlZ2VuZCA9IFRSVUUsDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCh4ID0gMC4yLCB5ID0gMS4wLCB0ZXh0ID0gIkRlcHJlc2nDs24gcG9yIGfDqW5lcm8iLCBzaG93YXJyb3cgPSBGQUxTRSwgeHJlZiA9ICJwYXBlciIsIHlyZWYgPSAicGFwZXIiKSwNCiAgICAgIGxpc3QoeCA9IDEsIHkgPSAxLjAsIHRleHQgPSAiQW5zaWVkYWQgcG9yIGHDsW8gZGUgZXN0dWRpbyIsIHNob3dhcnJvdyA9IEZBTFNFLCB4cmVmID0gInBhcGVyIiwgeXJlZiA9ICJwYXBlciIpLA0KICAgICAgbGlzdCh4ID0gMC4xMCwgeSA9IDAuNDAsIHRleHQgPSAiQsO6c3F1ZWRhIGRlIHRyYXRhbWllbnRvIHBvciBDR1BBIiwgc2hvd2Fycm93ID0gRkFMU0UsIHhyZWYgPSAicGFwZXIiLCB5cmVmID0gInBhcGVyIikNCiAgICApDQogICkNCg0KDQpncmFmaWNvX2NvbXB1ZXN0bw0KYGBgDQoNCjxwPg0KTG9zIGdyw6FmaWNvcyBtdWVzdHJhbiBwYXRyb25lcyBpbXBvcnRhbnRlcyBzb2JyZSBsYSBzYWx1ZCBtZW50YWwgZGUgbG9zIGVzdHVkaWFudGVzIHVuaXZlcnNpdGFyaW9zLiBQb3IgZWplbXBsbywgc2Ugb2JzZXJ2YSBxdWUgbGFzIG11amVyZXMgdGllbmRlbiBhIHByZXNlbnRhciBtw6FzIHPDrW50b21hcyBkZSBkZXByZXNpw7NuLiBUYW1iacOpbiBzZSBub3RhIHF1ZSBxdWllbmVzIGVzdMOhbiBlbiBsb3MgcHJpbWVyb3MgYcOxb3MgZGUgY2FycmVyYSBzdWVsZW4gc2VudGlyIG3DoXMgYW5zaWVkYWQsIHBvc2libGVtZW50ZSBwb3IgZWwgcmV0byBkZSBhZGFwdGFyc2UgYWwgbnVldm8gYW1iaWVudGUgYWNhZMOpbWljbyB5IHNvY2lhbC4gQWRlbcOhcywgbG9zIGVzdHVkaWFudGVzIGNvbiBwcm9tZWRpb3MgbcOhcyBiYWpvcyAobWVub3MgZGUgMy4wKSBzb24gbWVub3MgcHJvcGVuc29zIGEgYnVzY2FyIGF5dWRhIHByb2Zlc2lvbmFsLCBpbmNsdXNvIHNpIGV4cGVyaW1lbnRhbiBhbnNpZWRhZCBvIGRlcHJlc2nDs24uIEVzdG8gcG9kcsOtYSBkZWJlcnNlIGFsIGVzdGlnbWEgbyBhIGxhIGZhbHRhIGRlIHJlY3Vyc29zIGFjY2VzaWJsZXMuIEVuIGdlbmVyYWwsIGxvcyBkYXRvcyBtdWVzdHJhbiBsYSBuZWNlc2lkYWQgZGUgb2ZyZWNlciBhcG95byBwc2ljb2zDs2dpY28gYWRhcHRhZG8gYWwgZ8OpbmVybywgYWwgYcOxbyBkZSBlc3R1ZGlvcyB5IGFsIHJlbmRpbWllbnRvIGFjYWTDqW1pY28sIHkgZGUgcHJvbW92ZXIgY2FtcGHDsWFzIHF1ZSBheXVkZW4gYSBub3JtYWxpemFyIGVsIGN1aWRhZG8gZGUgbGEgc2FsdWQgbWVudGFsIGVuIGxhcyB1bml2ZXJzaWRhZGVzLg0KPHAvPg0KDQo8cD4NCkEgcGFydGlyIGRlIGxvIGFudGVyaW9ybWVudGUgZXhwdWVzdG8sIHRlbmVtb3MgdmFyaWFzIGNvbmNsdXNpb25lcyBxdWUgcG9kZW1vcyBoYWNlciByZXNwZWN0byBhIGxvcyBlc3R1ZGlhbnRlcyBlbnRyZXZpc3RhZG9zLCBxdWUgc2kgYmllbiBsb3MgZ3JhZmljb3MgcHVlZGVuIHZhcmlhciBkZXBlbmRpZW5kbyBkZWwgbHVnYXIgeSBsYSB1bml2ZXJzaWRhZCwgbXVjaG8gZGUgbG8gcXVlIHNlIHB1ZWRlIGFwcmVjaWFyIGVuIGVzdG9zIGRhdG9zIHNlIHB1ZWRlbiBleHRyYXBvbGFyIGEgb3Ryb3MgbHVnYXJlcy4NCg0KLVRhbiBzb2xvIHVuYSBtaW5vcsOtYSBidXNjYSBhc2Vzb3JhbWllbnRvIHByb2Zlc2lvbmFsIGFudGUgbGEgZGVwcmVzacOzbiB5IGxhIGFuc2llZGFkDQoNCi1TZSBwdWRvIG9ic2VydmFyIHF1ZSBlc3R1ZGlhbnRlcyBkZSBtZW5vciBlZGFkIHkgZW4gc3VzIHByaW1lcm9zIGHDsW9zIGRlIGVzdHVkaW8gdGllbmRlbiBhIHByZXNlbnRhciBtw6FzIHNpbnRvbWFzIGRlIGRlcHJlc2lvbiB5IGFuc2llZGFkDQoNCi1Mb3MgZXN0dWRpYW50ZXMgY29uIG1lbm9yIHJlbmRpbWllbnRvIGFjYWRlbWljbyBzZSB2ZW4gbWF5b3JtZW50ZSBhZmVjdGFkb3MgdGFudG8gcG9yIGRlcHJlc2lvbiBvIHBvciBhbnNpZWRhZA0KDQotU2Vnw7puIGxhIG11ZXN0cmEgZGUgZGF0b3MsIGxvcyBlc3R1ZGlhbnRlcyBkZWwgYXJlYSBkZSB0ZWNub2xvZ2lhIHkgZGUgY2llbmNpYXMgc29jaWFsZXMgeSBodW1hbmlkYWRlcywgYXBhcnRlIGRlIHNlciB1biBzZWN0b3IgbWFzIGRlbnNvLCBzb24gbG9zIHF1ZSB0aWVuZGVuIGEgc2VyIG3DoXMgYWZlY3RhZG9zIHBvciBkZXByZXNpb24gbyBhbnNpZWRhZC4NCg0KLVZlbW9zIHF1ZSBhIHBlc2FyIGRlIGxhcyBwb2NhcyBpbnN0YW5jaWFzLCBkZW50cm8gZGUgZXN0YXMgbGFzIG11amVyZXMgZnVlcm9uIGxhcyBxdWUgbWFzIGJ1c2Nhcm9uIGF5dWRhIHByb2Zlc2lvbmFsLg0KDQpTaWVuZG8gZXN0YSBsYSBzaXR1YWNpw7NuIGhheSBwdW50b3MgcXVlIHB1ZWRlbiBzZXIgYWxnbyBhbGFybWFudGVzLCBwb3IgZWplbXBsbzoNCg0KTGEgYmFqYSBiw7pzcXVlZGEgZGUgYXl1ZGEgcHJvZmVzaW9uYWwgc3VnaWVyZSBxdWUgbXVjaG9zIGVzdHVkaWFudGVzIHB1ZWRlbiBlc3RhciBlbmZyZW50YW5kbyB0cmFzdG9ybm9zIGVtb2Npb25hbGVzIHNpbiBlbCBhY29tcGHDsWFtaWVudG8gYWRlY3VhZG8sIGxvIHF1ZSBwb2Ryw61hIGVzdGFyIG1hbmlmZXN0YW5kbyB1biBkZXRlcmlvcm8gcHJvZ3Jlc2l2byBkZSBzdSBzYWx1ZCBtZW50YWwsIGFkZW1hcyBkZSBlc3RvLCBsYSBiYWphIGLDunNxdWVkYSBkZSBheXVkYSBwcm9mZXNpb25hbCBzdWdpZXJlIHF1ZSBtdWNob3MgZXN0dWRpYW50ZXMgcHVlZGVuIGVzdGFyIGVuZnJlbnRhbmRvIHRyYXN0b3Jub3MgZW1vY2lvbmFsZXMgc2luIGVsIGFjb21wYcOxYW1pZW50byBhZGVjdWFkbywgbG8gcXVlIHBvZHLDrWEgZGVyaXZhciBlbiB1biBkZXRlcmlvcm8gcHJvZ3Jlc2l2byBkZSBzdSBiaWVuZXN0YXIgcHNpY29sw7NnaWNvLg0KDQpBIHN1IHZleiwgbG9zIGVzdHVkaWFudGVzIG3DoXMgasOzdmVuZXMgeSBkZSBwcmltZXJvcyBhw7FvcywgYWwgc2VyIG3DoXMgYWZlY3RhZG9zIHBvZHLDrWFuIHRlbmVyIG1heW9yZXMgZGlmaWN1bHRhZGVzIGRlIGFkYXB0YWNpw7NuIGFsIGVudG9ybm8gdW5pdmVyc2l0YXJpbywgYWZlY3RhbmRvIGRlIG1hbGEgbWFuZXJhIHN1IHBlcm1hbmVuY2lhIHkgZWwgZGVzYXJyb2xsbyBhY2Fkw6ltaWNvLg0KDQpEZSBsYSBtaXNtYSBmb3JtYSwgYXVucXVlIGxhcyBtdWplcmVzIGJ1c2NhbiBtw6FzIGF5dWRhLCBzaWd1ZSBzaWVuZG8gcHJlb2N1cGFudGUgcXVlIGxvcyBob21icmVzLCBwb3NpYmxlbWVudGUgcG9yIGVzdGlnbWFzIGRlIGfDqW5lcm8sIG5vIGFjY2VkYW4gYSBhcG95byBwcm9mZXNpb25hbCwgcmVwcmltaWVuZG8gYXPDrSBzdXMgYWZsaWNjaW9uZXMuDQoNClNpZW5kbyBhc8OtLCBzZXLDrWEgw7p0aWwgaW1wbGVtZW50YXIgYWNjaW9uZXMgcXVlIHByb3BpY2llbiBsYSBidWVuYSBzYWx1ZCBtZW50YWwgLCBxdWl6YXMgZm9ydGFsZWNpZW5kbyBsb3Mgc2VydmljaW9zIGRlIHNhbHVkIG1lbnRhbCBlbiB1bml2ZXJzaWRhZGVzLCBoYWNpZW5kbyBjYW1wYcOxYXMgZGUgY29uY2llbnRpemFjacOzbiB5IGRlc2VzdGlnbWF0aXphY2nDs24gbyBmb21lbnRhciBhw7puIG3DoXMgZWwgZXF1aWxpYnJpbyBlbnRyZSB2aWRhIGFjYWTDqW1pY2EgeSBwZXJzb25hbA0KPHAvPg==