Entregable 1

Antecedentes de la empresa

Visión: ā€œEn 2033 seremos una de las cinco mejores compaƱƭas de MĆ©xico que generan valor dentro de la cadena de suministro de las industrias que mĆ”s valoran la forma en la que se protegen y trasladan las cosas.ā€ (Form, 2023).

Misión: ā€œTransformar nuestro entorno y resolver retos industriales de nuestros clientes a travĆ©s de la colaboración, provocando nuevas oportunidades que potencian nuestro modelo de negocio, para alcanzar nuestros ideales.ā€ (Form, 2023).

Contexto de la industria:

La industria de empaque y embalaje representa una parte esencial del sector automotriz y de autopartes, ya que esta industria es pieza clave para garantizar la protección y entrega eficiente de los componentes automotrices en sus diferentes fases dentro de la cadena de suministro del sector automotriz.

En el 2022, la producción de automóviles en el mundo mantiene a Estados Unidos como el segundo mayor productor de automóviles abarcando el 13.4% de la industria y México como 7mo mayor productor con el 4.6%. (VDA,2023)

Tomando Ʃsto en cuenta sabemos que el rol de MƩxico en la industria automotriz es de suma relevancia para el mundo y por consiguiente para nuestro paƭs, representando el 2.77% del Producto Interno Bruto (PIB) de MƩxico en el 2022. (INEGI,2023)

La pandemia tuvo un impacto fuerte en la inversión extranjera directa de la industria automotriz con una reducción de 2.17 mil millones de dólares del 2020 al 2021 y naturalmente se vio afectada la producción de vehículos con una disminución de producción de 3.8 millones de unidades a 2.9 millones de unidades al año 2020. Sin embargo, se estima que la recuperación de la producción de la industria automotriz serÔ hasta el 2026 con 3.8 millones de unidades a producir, igualando la producción del 2019. (IHS Market, 2020)

Socio Formador Form

Introducción de la Empresa

FORM es una empresa con sede principal en Nuevo León, ésta se dedica al empaque y embalaje de autopartes específicamente de partes interiores y eléctricas de los vehículos, las cuales es de suma importancia que no reciban ningún tipo de daño estético en su proceso de transportación para su ensamblaje.

FORM se centra en abastecer las necesidades de los proveedores Tier 1 (planta automotriz) y Tier 2 (proveen partes a las plantas) de la industria automotriz, por lo que estos son sus principales clientes.

Productos/Servicios

La empresa no ofrece un portafolio de productos fijos o estandarizados para la industria automotriz. FORM busca generar soluciones a las necesidades y problemas de sus clientes dentro de la cadena de suministro, por medio de la innovación ingenieril en el empaque de las autopartes.

AdemÔs, FORM ofrece un servicio de acompañamiento el cual funciona como un soporte de comunicación en el que empleados de FORM, pueden asistir directamente en la planta de los clientes para la entrega de los empaques y ensamblaje hasta tener comunicación continua con la empresa en caso de cualquier situación.

Las cosas antes mencionadas forman parte de la propuesta de valor de la empresa, apalancando de la innovación y el servicio al cliente se busca asegurar la calidad la cual los clientes de FORM estÔn buscando debido a la importancia y delicadeza que toman las autopartes interiores y eléctricas dentro de la industria automotriz.

Aunque los productos que ofrece FORM dentro de la industria automotriz fungen parecido a un commodity, el empaque se llega a producir en grandes cantidades, estos no entran como tal en la definición de commodity ya que en el caso de FORM entra una parte clave la cual es la personalización.

Perspectivas Futuras

Actualmente FORM busca equipar con tecnología para automatizar y desarrollar todo un ambiente de datos el cual les pueda ayudar a agilizar procesos y dar certeza a la toma de decisiones en base a datos. Con esto buscan poder realizar pronósticos para anticipar la demanda de sus clientes y diversificar dentro de EUA, esto por mencionar alguno de los ejemplos. En cuanto a temas de cultura organizacional se busca medir sistemÔticamente diferentes KPI“s.

AdemÔs de esto, se busca crear un sentido de pertenencia y lealtad de los empleados hacia la empresa. Buscando continuar con la cultura organizacional actual, la cual estÔ enfocada en la horizontalidad, la construcción de equipos y divisiones autónomas a niveles inferiores dentro de la empresa. Esto, con el fin de permitir una comunicación mÔs efectiva y fluida entre departamentos.

Expansión

Actualmente FORM busca un crecimiento, desea continuar con la industria de autopartes, por lo que su principal enfoque se encuentra en crecer a lo largo de la línea de la industria automotriz que se encuentra ubicada en el territorio mexicano y estadounidense. Específicamente, busca crecer en el bajío mexicano y en San Antonio Texas en el extranjero. Por otra parte, busca explorar otras industrias las cuales se alineen a su misión, como lo puede ser la aeroespacial y de equipos médicos.

AdemÔs busca expandir sus inversiones en el extranjero tomando como opción principal a Estados Unidos. Buscando crecer a cualquier parte de Texas debido a el costo de oportunidad que se tiene, si se busca crecer mÔs allÔ de Texas aumenta los costos de fletes y el negocio no sale con buen margen. FORM no busca ser la empresa mas grande, se concentra en negocios de PYME con grandes margenes de ganancia

Cultura organizacional y RH

Hoy en día cuentan con 130 colaboradores dentro de la empresa, sin embargo existe un tema de rotación de personal por diversas razones, uno de sus enfoques es crear una cultura organizacional la cual retenga al capital humano.

Actualmente ofrecen diversas compensaciones y beneficios para incitar la activa participación de sus colaboradores. Se cuentan con bases de datos enfocadas al tema de capital humano con las cuales se buscan identificar las razones de la rotación, sin embargo aún no han logrado ver un decremento en los porcentajes anuales de rotación.

FORM cuenta con 6 pilares principales, dentro de la empresa se vive una actitud de honestidad y transparencia dentro de todos los procesos, se busca cuidar detalladamente los espacios de trabajo con planes para implementar nuevos baƱos en el piso.

AnƔlisis de las Ɣreas de la empresa

Carga de librerias

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## āœ” dplyr     1.1.2     āœ” readr     2.1.4
## āœ” forcats   1.0.0     āœ” stringr   1.5.0
## āœ” ggplot2   3.4.2     āœ” tibble    3.2.1
## āœ” lubridate 1.9.2     āœ” tidyr     1.3.0
## āœ” purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## āœ– dplyr::filter() masks stats::filter()
## āœ– dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(stringr)
library(readr)
library(dplyr)
library(tidyr)
library(grid)
library(psych)
## 
## Attaching package: 'psych'
## 
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(gplots)
## 
## Attaching package: 'gplots'
## 
## The following object is masked from 'package:stats':
## 
##     lowess
library(knitr)

Carga de datos

#file.choose()
Ventas_1 <- read.csv("/Users/davidcavazos/Desktop/Evidenica3/Ventas_1.csv")

#file.choose()
Bajas <-read.csv("/Users/davidcavazos/Desktop/Evidenica3/Bajas.csv")

#file.choose()
FDI_df <- read.csv("/Users/davidcavazos/Desktop/Evidenica3/FDI_Mexico.csv")

Bajas por Puesto y Genero (2021)

Los ayudantes generales son los que cuentan mayor baja por un margén altamente considerable, como se puede observar en la grafíca 1. AdemÔs de esto se puede observar que de igual forma la mayoría de personas de estÔ posición a las que se les da de baja son mujeres.

Por lo que se podría plantear una primer hipótesis la cual es que esto se puede deber a que la gran parte de personas que se contratan son para el puesto de ayudante general y de sexo femenino, sin embargo todavía no se ha realizado el anÔlisis para comprobar la hipótesis antes mencionada.

options(scipen = 999) 
Bajas$PUESTO <- as.factor(Bajas$PUESTO)

ggplot(Bajas, aes(PUESTO)) +
  geom_bar(aes(fill=GENERO)) +
  theme(axis.text.x = element_text(angle = 90)) +
  labs(x = "Puesto", y = "Cantidad", title = "Bajas por puesto ") +
  theme(panel.background = element_rect(fill = "gray98"))

Ventas por LĆ­nea de Negocio (2021)

Dentro de las ventas por linea de negocio, es decir retornable y cartón. Se puede observar como la linea de negocios que liderÔ es la del cartón, sin embargo se observa como las ventas de retornables y cartón en los primeros 2 quartiles del año son altamente superiores al resto del año.

GrƔfico 2

as.Date(Ventas_1$Mes)
##  [1] "0028-01-21" "0028-01-21" "0028-02-21" "0028-02-21" "0028-03-21"
##  [6] "0028-03-21" "0028-04-21" "0028-04-21" "0028-05-21" "0028-05-21"
## [11] "0028-06-21" "0028-06-21" "0028-07-21" "0028-07-21" "0028-08-21"
## [16] "0028-08-21" "0028-09-21" "0028-09-21" "0028-10-21" "0028-10-21"
## [21] "0028-11-21" "0028-11-21" "0028-12-21" "0028-12-21"
col_per <- c("coral", "orange")

ggplot(Ventas_1, aes(x = Mes, y = Venta, fill = Producto)) +
  geom_bar(stat = "identity") +
  labs(x = "Mes", y = "Venta", title = "Ventas Mensuales por Producto") +
  scale_fill_manual(values = col_per) + 
  theme(panel.background = element_rect(fill = "gray98") )+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Inversión Extranjera por Año

La Inversión Extranjera Directa en el mismo año (2021), tuvo fuertes afectaciones debido al COVID-19, por lo que podría ser una de las razones por las cuales en la Grafíca 2 las ventas de los ultímos 2 cuartiles del año hayan caído de manera considerable a comparación del inicio del año.

GrƔfico 3

df_FDI = FDI_df

#Separar Columnas
df_FDI <- separate(df_FDI, Quartil, into = c("Quartil", "AƱo"), sep = " ")

#FDI sumado por AƱo
aƱo_sum <- df_FDI %>% group_by(AƱo) %>% summarize(suma=sum(Mil.Millones.de.Dolares))

aƱo_sum$AƱo <- as.numeric(aƱo_sum$AƱo)

grafico_aƱo = ggplot(aƱo_sum, aes(x = AƱo, y = suma)) +
  geom_line( color = "#F46C22") +
  geom_point(color = "#F46C22") +
  geom_text(aes(label = suma), hjust = -0.2, vjust = 0.5, color = "#505050", size = 4) +  
  labs(title = "Inversión Extranjera Directa por Año",subtitle = "Mil Millones de Dólares", x = "Año", y = "Inversión", caption = "Fuente: INEGI") + 
  theme_minimal() + 
  theme(plot.title = element_text(hjust = 0.5, face = "bold", color = "#505050"), panel.grid.major =      element_blank(), plot.subtitle = element_text(hjust = .5, size = 7)) 

grafico_aƱo + scale_x_continuous(breaks = aƱo_sum$AƱo)

FODA Cruzado

El objetivo del anÔlisis FODA para FORM es evaluar de manera integral sus Fortalezas, Oportunidades, Debilidades y Amenazas con el fin de obtener una comprensión estratégica de su posición en el mercado y proporcionar una base sólida para la toma de decisiones que potencien su competitividad y crecimiento en la industria de empaques y embalajes.

PESTLE

El objetivo del anÔlisis PESTLE para FORM es examinar los factores que impactan su operación y entorno empresarial. Esto permitirÔ a la empresa comprender mejor el contexto en el que opera, anticipar posibles cambios y ajustar su estrategia para maximizar oportunidades y mitigar riesgos.

Entregable 2

Pregunta 1

¿CuÔl es el Estado Civil con Mayores Bajas?

Abrir base de datos
# file.choose()
BDD_FORM_BAJAS_2023 <- read_csv("/Users/davidcavazos/Desktop/Evidenica3/BDD_FORM_BAJAS_2023.csv")
## Rows: 279 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (24): Apellidos, Nombre, Fecha de Nacimiento, GƩnero, RFC, Fecha de Alta...
## dbl  (4): No., SD, CP, Número de Télefono
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
### Seleccionar las variables de Motivo de baja y Estado Civil en un nuevo data frame.

mbaja <- select(BDD_FORM_BAJAS_2023,`Motivo de Baja`,`Estado Civil`) %>% na.omit(mbaja)
Agrupar la categorĆ­a con diferentes nombres cambiando a el mismo nombre
mbaja$"Motivo de Baja"[mbaja$"Motivo de Baja" == "Inducida."] <- "Inducida"

mbaja$"Motivo de Baja"[mbaja$"Motivo de Baja" == "Inducida (Faltas)"] <- "Inducida por faltas"

mbaja$"Motivo de Baja"[mbaja$"Motivo de Baja" == "Inducida (Faltas no dio los tiempos)"] <- "Inducida"
Calcular los porcentajes por categorĆ­a y estado civil
porcentajes <- mbaja %>%
  group_by(`Estado Civil`, `Motivo de Baja`) %>%
  summarise(Frecuencia = n()) %>%
  group_by(`Estado Civil`) %>%
  mutate(Pct = scales::percent(Frecuencia / sum(Frecuencia)))
## `summarise()` has grouped output by 'Estado Civil'. You can override using the
## `.groups` argument.

Motivo de Baja y Estado Civil

plot <- ggplot(porcentajes, aes(x = `Estado Civil`, y = Frecuencia, fill = `Motivo de Baja`)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  theme(
    panel.grid.major = element_line(color = "grey", linewidth = 0.4, linetype = "dotted"),  # LĆ­neas verticales
    panel.grid.minor = element_line(color = "grey", linewidth = 0.4, linetype = "dotted")  # LĆ­neas horizontales
  )+
  ggtitle("Relación entre Motivo de Baja y Estado Civil")
Agregar etiquetas de porcentaje
plot + geom_text(aes(label = Pct), position = position_stack(vjust = 0.5),size=2)

Resultados

Por lo que podemos ver en la grÔfica, la gran mayoría de las bajas en todas las categorías son por separación voluntaria y realmente no se logra ver una correlación entre el estado civil de la persona y el motivo de baja, lo que podría indicar una alta rotación de empleados en los trabajos de maquila en general o podría ser un indicador de que hay varias Ôreas de oportunidad en cuestión de amenidades, salarios, bonos, oportunidades de crecimiento en la empresa, traslado o prestaciones que la empresa ofrece ademÔs de las bÔsicas dictadas por la ley.

Pregunta 2

¿CuÔl es la relación entre la edad y las bajas?

Carga de datos
#file.choose()
bajas<-read_csv("/Users/davidcavazos/Desktop/Evidenica3/form_bajas_22.csv")
## Rows: 238 Columns: 25
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (23): APELLIDOS, NOMBRE, FECHA DE NACIMIENTO, GENERO, RFC, FECHA DE ALTA...
## dbl  (2): DIAS LABORADOS, SALARIO DIARIO IMSS
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Modificación de base de datos
#Estoy creando un data frame nuevo con las columnas necesarias para hacer la grƔfica

bajas1 <- select(bajas,"NOMBRE","APELLIDOS","FECHA DE NACIMIENTO","DIAS LABORADOS","SALARIO DIARIO IMSS") %>% na.omit(bajas1)
#view(bajas1)

EstadĆ­siticos Descriptivos

Dias Laborados
summary(bajas1$`DIAS LABORADOS`)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    8.75   19.00   80.00   49.25 1966.00
Salario
summary(bajas1$`SALARIO DIARIO IMSS`)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   144.4   180.7   180.7   177.7   180.7   500.0
Edad de colaboradores
#AquĆ­ reviso que formato tienen las columnas 

str(bajas1)
## tibble [212 Ɨ 5] (S3: tbl_df/tbl/data.frame)
##  $ NOMBRE             : chr [1:212] "MARIA FERNANDA" "EMANUEL" "TRINIDAD" "WILMAR" ...
##  $ APELLIDOS          : chr [1:212] "JIMENEZ ALANIS" "JAUREGUI SANCHEZ" "GARCIA CAZARES" "LOPEZ ROMERO" ...
##  $ FECHA DE NACIMIENTO: chr [1:212] "7/10/1998" "10/3/1998" "5/25/1997" "9/4/2001" ...
##  $ DIAS LABORADOS     : num [1:212] 423 35 102 63 34 23 30 6 0 141 ...
##  $ SALARIO DIARIO IMSS: num [1:212] 177 181 181 177 181 ...
##  - attr(*, "na.action")= 'omit' Named int [1:26] 8 27 28 58 67 110 135 136 137 141 ...
##   ..- attr(*, "names")= chr [1:26] "8" "27" "28" "58" ...
#Aquí estoy haciendo una extracción del año de nacimiento excluyendo los días y meses. 

#DecidĆ­ hacer esto porque hay filas en las que estĆ” escrito M/D/A y otras D/M/A


bajas1$ANIO<-str_sub(bajas1$`FECHA DE NACIMIENTO`,-4,-1)

#Convirtiendo la columna de "ANIO" en integer

bajas1$ANIO <- as.integer(bajas1$ANIO)

str(bajas1)
## tibble [212 Ɨ 6] (S3: tbl_df/tbl/data.frame)
##  $ NOMBRE             : chr [1:212] "MARIA FERNANDA" "EMANUEL" "TRINIDAD" "WILMAR" ...
##  $ APELLIDOS          : chr [1:212] "JIMENEZ ALANIS" "JAUREGUI SANCHEZ" "GARCIA CAZARES" "LOPEZ ROMERO" ...
##  $ FECHA DE NACIMIENTO: chr [1:212] "7/10/1998" "10/3/1998" "5/25/1997" "9/4/2001" ...
##  $ DIAS LABORADOS     : num [1:212] 423 35 102 63 34 23 30 6 0 141 ...
##  $ SALARIO DIARIO IMSS: num [1:212] 177 181 181 177 181 ...
##  $ ANIO               : int [1:212] 1998 1998 1997 2001 2002 2000 2000 1999 2002 1994 ...
##  - attr(*, "na.action")= 'omit' Named int [1:26] 8 27 28 58 67 110 135 136 137 141 ...
##   ..- attr(*, "names")= chr [1:26] "8" "27" "28" "58" ...
#Aquí creó una nueva columna llamada "EDAD" restando el año actual con el de "ANIO

bajas1$EDAD <- 2023-bajas1$ANIO

#HabĆ­a un error en el cual existĆ­an tres filas que tenĆ­an edad de 1 por lo cual le pedĆ­ que solo mostrara los que son mayor a 18.

bajas1 <- bajas1[bajas1$EDAD >18,]

Bajas por Edad

hist(bajas1$EDAD,col = blues9,xlab = "Edad",ylab ="Frecuencia" ,main = "Bajas por Edad")

Resultados

Nos damos cuenta de que la rotación de personal se ve mÔs alta en los colaboradores mÔs jóvenes. Esto es información útil ya que nos permite tomar decisiones adecuadas para mejorar la satisfacción laboral en específico para estos rangos de edades. Con esta grÔfica podemos entrar mÔs a detalle en el Ôrea de oportunidad y así entender las razones de la alta rotación. Nos damos cuenta de que se tiene que hacer un esfuerzo por mejorar la relación con las nuevas generaciones o contratar a personas mayores.

Pregunta 3

ĀæDe que edad frecuentan ingresar los empleados a FORM?

Carga de datos
rh <- read.csv("/Users/davidcavazos/Desktop/Evidenica3/form_rh_datos.csv")

#View(rh)

edad <- select(rh,"FECHA.DE.ALTA", "FECHA.DE.NACIMIENTO") 

#str(rh)
Modificacion de Datos
rh$aƱo_alta <- str_sub(rh$FECHA.DE.ALTA, -4, -1) 
rh$aƱo_nac <- str_sub(rh$FECHA.DE.NACIMIENTO, -4, -1)
rh$aƱo_alta <- as.integer(rh$aƱo_alta)
rh$aƱo_nac <- as.integer(rh$aƱo_nac)

rh <- rh[rh$aƱo_alta > 2013,]
rh <- rh[-30,]
Calcular la edad de ingreso y Medidas de Dispersion
rh$edad_ingreso <- rh$aƱo_alta - rh$aƱo_nac
rh <- rh[rh$edad_ingreso > 18,]

edad_de_ingreso_max <- max(rh$edad_ingreso)
print(edad_de_ingreso_max)
## [1] 60
edad_de_ingreso_min <- min(rh$edad_ingreso)
print(edad_de_ingreso_min)
## [1] 19
edad_de_ingreso_mean <- mean(rh$edad_ingreso)
print(edad_de_ingreso_mean)
## [1] 34.92308

Altas por Edad

hist(rh$edad_ingreso,col = "#009E73" ,xlab = "Edad",main = "Alta por Edad")

Altas de Mujeres/Hombres

## Cantidad de Hombres o Mujeres dados de Alta
ggplot(rh, aes(edad_ingreso, fill = GENERO)) + 
  geom_histogram(bins=10) + 
  labs(y="") 

Resultados

Relación Edad y genero en las Bajas de Empleados

Podemos analizar en las graficas que la edad mƔs comun para ingresar a trabajar a FORM es entre los 25 - 30 lo que nos puede ayudar a crear campaƱas de reclutamiento enfocadas en el mercado de edad al que los empleados de FORM estan enfocados, FORM cuenta con un gran rango de edades comenzando desde los 19 y llegando hasta los 60. Este ultimo siendo el grupo mas pequeƱo dentro de la empresa mientras que los jovenes de 18 - 20 tienden a ser un porcentaje mƔs alto de hombres. Nos damos cuenta con la grafica que FORM le abre las puertas a muchas personas y ofrece oportunidades de trabajo para nuevas generaciones y personas con experiencia

Pregunta 4

ĀæExisten tendencias de bajas?

Importar datasets

bajas = read.csv("/Users/davidcavazos/Desktop/Evidenica3/form_bajas_22.csv")
dfbajas = bajas 

#Limpieza Dataset
bajas$ESTADO.CIVIL = gsub("MATRIOMONIO", "MATRIMONIO", bajas$ESTADO.CIVIL)

Frecuencia de DĆ­as Laborados

hist(bajas$DIAS.LABORADOS, col = blues9, xlab = "DIAS LABORADOS", ylab = "Frecuencia", main = "DĆ­as Laborados", xlim = c(0, 1000))

Separación de Fechas - Bajas

df_rotacion = bajas %>% select(GENERO, FECHA.DE.ALTA,BAJA, MOTIVO.DE.BAJA, DIAS.LABORADOS, PUESTO)
df_rotacion = df_rotacion %>% separate(BAJA, into = c("MONTH_BAJA", "DAY_BAJA", "YEAR_BAJA"), sep = "/")
## Warning: Expected 3 pieces. Missing pieces filled with `NA` in 15 rows [27, 28, 58, 135,
## 137, 141, 151, 178, 179, 198, 203, 205, 207, 212, 238].
Separación de Fechas - Altas
df_rotacion = df_rotacion %>% separate(FECHA.DE.ALTA, into = c("MONTH_ALTA", "DAY_ALTA", "YEAR_ALTA"), sep = "/")
## Warning: Expected 3 pieces. Missing pieces filled with `NA` in 1 rows [238].
Asignación Meses
df_months <- df_rotacion %>%
  mutate(NAME_MONTH = case_when(
    MONTH_BAJA == 1 ~ "Enero",
    MONTH_BAJA == 2 ~ "Febrero",
    MONTH_BAJA == 3 ~ "Marzo",
    MONTH_BAJA == 4 ~ "Abril",
    MONTH_BAJA == 5 ~ "Mayo",
    MONTH_BAJA == 6 ~ "Junio",
    MONTH_BAJA == 7 ~ "Julio",
    MONTH_BAJA == 8 ~ "Agosto",
    MONTH_BAJA == 9 ~ "Septiembre",
    MONTH_BAJA == 10 ~ "Octubre",
    MONTH_BAJA == 11 ~ "Noviembre",
    MONTH_BAJA == 12 ~ "Diciembre"
  )) %>%
  filter(NAME_MONTH %in% c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")) %>%
  select(GENERO, MONTH_BAJA, DAY_ALTA, YEAR_ALTA, MOTIVO.DE.BAJA, NAME_MONTH, PUESTO)

Cantidad de Bajas por Mes

barplot_subcategory <- ggplot(df_months, aes(x = NAME_MONTH)) +
  geom_bar(fill = "#F46C22", width = 0.5) +
  ggtitle("Bajas por Mes")

barplot_subcategory +
  labs(title = "Bajas por Mes") +
  theme(panel.grid = element_blank(),panel.background = element_blank(), plot.title = element_text(hjust = 0.5, face = "bold")) + xlab("Meses") +
  ylab("Cantidad de Bajas")

Cantidad de Bajas por Puesto

frequency_puesto = table(df_months$PUESTO)
df_frequency_puesto = as.data.frame(frequency_puesto)
colnames(df_frequency_puesto) <- c("Puesto", "Cantidad")

df_frequency_puesto <- df_frequency_puesto %>%
  arrange(desc(Cantidad))

kable(df_frequency_puesto, format = "html", escape = FALSE, 
      table.attr = 'style="font-family: Arial, sans-serif;"')
Puesto Cantidad
AYUDANTE GENERAL 170
SOLDADOR 12
COSTURA 10
AYUDANTE DE EMBARQUES 7
MONTACARGUISTA 5
INSPECTOR CALIDAD 3
RESIDENTE 3
MATERIALISTA 2
ANALISTA DE NOMINAS 1
CHOFER 1
CORTADOR 1
DISEƑO 1
FACTURACION 1
GUARDIA SEGURIDAD 1
JEFE DE SEGURIDAD E HIGIENE 1
LIMPIEZA 1
MANTENIMIENTO 1
MARCADORA 1
SERVICIO AL CLIENTE 1

Resultados

Tendencias de Baja de Empleados

Analizando directamente la cantidad de bajas por mes podemos ver que existe una alta inclinación de bajas de empleados en su en el mes de Enero y en su contraparte Noviembre es el mes con menor nĆŗmero de bajas, al excluir el mes de Diciembre que no cuenta con ninguna baja registrada. Por lo que se plantĆ©a la hipótesis la cual FORM menciono durante las sesiones de información general de la empresa, ā€œLos empleados se quedan para recibir su aguinaldo/bono y despĆŗes se vanā€, por lo que se puede mencionar una asociación de los datos pero todavĆ­a no una causalidad de los mismos.

Hallzagos y Sugerencias

Hallazgos principales

Puesto de Ayudante General

Desde el contexto nosotros conocemos que uno de los problemas principales de FORM es su alta rotación de empleados en específico los empleados operativos. Un hallazgo importante que entendimos a través de esta investigación de datos fue que el puesto de ayudante general es el que mÔs frecuentemente se da de baja. Este es un dato crítico ya que nos permite entrar mÔs a detalle la raíz del problema y así hacer modificaciones necesarias para mejorar.

Relación con Jovenes

Podemos concluir que hay una gran cantidad de jóvenes entre 18-30 años que constantemente son bajas en FORM.De todos los empleados esta es la categoría mÔs afectada. Es importante considerar esta información para el desarrollo de estrategias de satisfacción laboral. Es importante satisfacer las necesidades específicas de los jóvenes ya que estas pueden ser diferentes a las de los mayores.

Reclutamiento

Considerando que las edades mÔs frecuentes de sus altas son jóvenes de 18 - 30 años es importante considerar esto para sus estrategias de reclutamiento.

Alta rotacion de Mujeres

Vemos como hay una alta rotación específicamente en mujeres, esto probablemente debido a que contratan mÔs mujeres que hombres en ciertos puestos de trabajo específicos. Sin embargo considero que es un hallazgo importante ya que nos permite entender una Ôrea de oportunidad específica en la podemos diseñar una estrategia para mejorar la satisfacción laboral de las mujeres.

Satisfacción laboral

La mayor Ôrea de oportunidad que tiene FORM es mejorar su satisfacción laboral, desde los Ôngulos anteriores podemos interpretar que este es uno de los problemas que predominan en la empresa. El tener insatisfacción laboral baja la productividad, la eficiencia y sube la rotación aumentando los gastos de la empresa.

Necesidad de datos

A través de esta investigación podemos concluir que faltan mÔs datos para poder continuar con una propuesta. Por el momento solo conocemos que colaboradores son los que tienen mÔs frecuencia de bajas sin embargo para conocer el porqué necesitamos datos cualitativos de los empleados actuales.

Sugerencias de Profesionales

Fundamentación

Se busca siempre tener los fundamentos correctos al momento de analizar, es importante en todos los pasos desde la recopilación, hasta la visualización tener en mente que tu proyecto esté fundamentado, porque de esa manera es mÔs fÔcil justificar una propuesta o posible solución.

Visualización e Interpretación

Se busca que la visualización de datos siempre sea fÔcil de entender e interpretar, en un ambiente laboral mientras mÔs simples y directos sean los datos y sus diferentes tipos de grÔficos/tablas es mejor para la persona que tiene que tomar decisiones usando esa información.

LS0tCnRpdGxlOiAiRXZpZGVuY2lhIDEiCmF1dGhvcjogIkVxdWlwbyA0LSBNYXJpYW5hIE1hZ2HDsWEsIFJvZ2Vpcm8gUmFtaXJleiwgRGF2aWQgQ2F2YXpvcywgTHluZXR0ZSBTb2xpcywgUm9nZWxpbyBHb21leiAiCmRhdGU6ICIyMDIzLTA4LTI1IgpvdXRwdXQ6IAogaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogInlldGkiCi0tLQoKIVsgXSgvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvRXZpZGVuaWNhMy9TY3JlZW5zaG90IDIwMjMtMDktMTEgYXQgMTEuMTUuMjIgYS5tLi5wbmcpCgojIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqRW50cmVnYWJsZSAxKioKCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqQW50ZWNlZGVudGVzIGRlIGxhIGVtcHJlc2EqKgoKKipWaXNpw7NuOioqICDigJxFbiAyMDMzIHNlcmVtb3MgdW5hIGRlIGxhcyBjaW5jbyBtZWpvcmVzIGNvbXBhw7HDrWFzIGRlIE3DqXhpY28gcXVlIGdlbmVyYW4gdmFsb3IgZGVudHJvIGRlIGxhIGNhZGVuYSBkZSBzdW1pbmlzdHJvIGRlIGxhcyBpbmR1c3RyaWFzIHF1ZSBtw6FzIHZhbG9yYW4gbGEgZm9ybWEgZW4gbGEgcXVlIHNlIHByb3RlZ2VuIHkgdHJhc2xhZGFuIGxhcyBjb3Nhcy7igJ0gKEZvcm0sIDIwMjMpLgoKKipNaXNpw7NuOioqIOKAnFRyYW5zZm9ybWFyIG51ZXN0cm8gZW50b3JubyB5IHJlc29sdmVyIHJldG9zIGluZHVzdHJpYWxlcyBkZSBudWVzdHJvcyBjbGllbnRlcyBhIHRyYXbDqXMgZGUgbGEgY29sYWJvcmFjacOzbiwgcHJvdm9jYW5kbyBudWV2YXMgb3BvcnR1bmlkYWRlcyBxdWUgcG90ZW5jaWFuIG51ZXN0cm8gbW9kZWxvIGRlIG5lZ29jaW8sIHBhcmEgYWxjYW56YXIgbnVlc3Ryb3MgaWRlYWxlcy7igJ0gKEZvcm0sIDIwMjMpLiAKCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqQ29udGV4dG8gZGUgbGEgaW5kdXN0cmlhKio6CkxhIGluZHVzdHJpYSBkZSBlbXBhcXVlIHkgZW1iYWxhamUgcmVwcmVzZW50YSB1bmEgcGFydGUgZXNlbmNpYWwgZGVsIHNlY3RvciBhdXRvbW90cml6IHkgZGUgYXV0b3BhcnRlcywgeWEgcXVlIGVzdGEgaW5kdXN0cmlhIGVzIHBpZXphIGNsYXZlIHBhcmEgZ2FyYW50aXphciBsYSBwcm90ZWNjacOzbiB5IGVudHJlZ2EgZWZpY2llbnRlIGRlIGxvcyBjb21wb25lbnRlcyBhdXRvbW90cmljZXMgZW4gc3VzIGRpZmVyZW50ZXMgZmFzZXMgZGVudHJvIGRlIGxhIGNhZGVuYSBkZSBzdW1pbmlzdHJvIGRlbCBzZWN0b3IgYXV0b21vdHJpei4gCgpFbiBlbCAyMDIyLCBsYSBwcm9kdWNjacOzbiBkZSBhdXRvbcOzdmlsZXMgZW4gZWwgbXVuZG8gbWFudGllbmUgYSBFc3RhZG9zIFVuaWRvcyBjb21vIGVsIHNlZ3VuZG8gbWF5b3IgcHJvZHVjdG9yIGRlIGF1dG9tw7N2aWxlcyBhYmFyY2FuZG8gZWwgMTMuNCUgZGUgbGEgaW5kdXN0cmlhICB5IE3DqXhpY28gY29tbyA3bW8gbWF5b3IgcHJvZHVjdG9yIGNvbiBlbCA0LjYlLiAoVkRBLDIwMjMpIAoKVG9tYW5kbyDDqXN0byBlbiBjdWVudGEgc2FiZW1vcyBxdWUgZWwgcm9sIGRlIE3DqXhpY28gZW4gbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXogZXMgZGUgc3VtYSByZWxldmFuY2lhIHBhcmEgZWwgbXVuZG8geSBwb3IgY29uc2lndWllbnRlIHBhcmEgbnVlc3RybyBwYcOtcywgcmVwcmVzZW50YW5kbyBlbCAyLjc3JSBkZWwgUHJvZHVjdG8gSW50ZXJubyBCcnV0byAoUElCKSBkZSBNw6l4aWNvIGVuIGVsIDIwMjIuIChJTkVHSSwyMDIzKQoKTGEgcGFuZGVtaWEgdHV2byB1biBpbXBhY3RvIGZ1ZXJ0ZSBlbiBsYSBpbnZlcnNpw7NuIGV4dHJhbmplcmEgZGlyZWN0YSBkZSBsYSBpbmR1c3RyaWEgYXV0b21vdHJpeiBjb24gdW5hIHJlZHVjY2nDs24gZGUgMi4xNyBtaWwgbWlsbG9uZXMgZGUgZMOzbGFyZXMgZGVsIDIwMjAgYWwgMjAyMSB5IG5hdHVyYWxtZW50ZSBzZSB2aW8gYWZlY3RhZGEgbGEgcHJvZHVjY2nDs24gZGUgdmVow61jdWxvcyBjb24gdW5hIGRpc21pbnVjacOzbiBkZSBwcm9kdWNjacOzbiBkZSAgMy44IG1pbGxvbmVzIGRlIHVuaWRhZGVzIGEgMi45IG1pbGxvbmVzIGRlIHVuaWRhZGVzIGFsIGHDsW8gMjAyMC4gU2luIGVtYmFyZ28sIHNlIGVzdGltYSBxdWUgbGEgcmVjdXBlcmFjacOzbiBkZSBsYSBwcm9kdWNjacOzbiBkZSBsYSBpbmR1c3RyaWEgYXV0b21vdHJpeiBzZXLDoSBoYXN0YSBlbCAyMDI2IGNvbiAzLjggbWlsbG9uZXMgZGUgdW5pZGFkZXMgYSBwcm9kdWNpciwgaWd1YWxhbmRvIGxhIHByb2R1Y2Npw7NuIGRlbCAyMDE5LiAoSUhTIE1hcmtldCwgMjAyMCkgCgojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiAqKlNvY2lvIEZvcm1hZG9yIEZvcm0qKgoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEludHJvZHVjY2nDs24gZGUgbGEgRW1wcmVzYQoKRk9STSBlcyB1bmEgZW1wcmVzYSBjb24gc2VkZSBwcmluY2lwYWwgZW4gTnVldm8gTGXDs24sIMOpc3RhIHNlIGRlZGljYSBhbCBlbXBhcXVlIHkgZW1iYWxhamUgZGUgYXV0b3BhcnRlcyBlc3BlY8OtZmljYW1lbnRlIGRlIHBhcnRlcyBpbnRlcmlvcmVzIHkgZWzDqWN0cmljYXMgZGUgbG9zIHZlaMOtY3Vsb3MsIGxhcyBjdWFsZXMgZXMgZGUgc3VtYSBpbXBvcnRhbmNpYSBxdWUgbm8gcmVjaWJhbiBuaW5nw7puIHRpcG8gZGUgZGHDsW8gZXN0w6l0aWNvIGVuIHN1IHByb2Nlc28gZGUgdHJhbnNwb3J0YWNpw7NuIHBhcmEgc3UgZW5zYW1ibGFqZS4gCgpGT1JNIHNlIGNlbnRyYSBlbiBhYmFzdGVjZXIgbGFzIG5lY2VzaWRhZGVzIGRlIGxvcyBwcm92ZWVkb3JlcyBUaWVyIDEgKHBsYW50YSBhdXRvbW90cml6KSB5IFRpZXIgMiAocHJvdmVlbiBwYXJ0ZXMgYSBsYXMgcGxhbnRhcykgZGUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXosIHBvciBsbyBxdWUgZXN0b3Mgc29uIHN1cyBwcmluY2lwYWxlcyBjbGllbnRlcy4KCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBQcm9kdWN0b3MvU2VydmljaW9zCgpMYSBlbXByZXNhIG5vIG9mcmVjZSB1biBwb3J0YWZvbGlvIGRlIHByb2R1Y3RvcyBmaWpvcyBvIGVzdGFuZGFyaXphZG9zIHBhcmEgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXouIEZPUk0gYnVzY2EgZ2VuZXJhciBzb2x1Y2lvbmVzIGEgbGFzIG5lY2VzaWRhZGVzIHkgcHJvYmxlbWFzIGRlIHN1cyBjbGllbnRlcyBkZW50cm8gZGUgbGEgY2FkZW5hIGRlIHN1bWluaXN0cm8sIHBvciBtZWRpbyBkZSBsYSBpbm5vdmFjacOzbiBpbmdlbmllcmlsICBlbiBlbCBlbXBhcXVlIGRlIGxhcyBhdXRvcGFydGVzLiAKCkFkZW3DoXMsIEZPUk0gb2ZyZWNlIHVuIHNlcnZpY2lvIGRlIGFjb21wYcOxYW1pZW50byBlbCBjdWFsIGZ1bmNpb25hIGNvbW8gdW4gc29wb3J0ZSBkZSBjb211bmljYWNpw7NuIGVuIGVsIHF1ZSBlbXBsZWFkb3MgZGUgRk9STSwgIHB1ZWRlbiBhc2lzdGlyIGRpcmVjdGFtZW50ZSBlbiBsYSBwbGFudGEgZGUgbG9zIGNsaWVudGVzIHBhcmEgbGEgZW50cmVnYSBkZSBsb3MgZW1wYXF1ZXMgeSBlbnNhbWJsYWplIGhhc3RhIHRlbmVyIGNvbXVuaWNhY2nDs24gY29udGludWEgY29uIGxhIGVtcHJlc2EgZW4gY2FzbyBkZSBjdWFscXVpZXIgc2l0dWFjacOzbi4gCgpMYXMgY29zYXMgYW50ZXMgbWVuY2lvbmFkYXMgZm9ybWFuIHBhcnRlIGRlIGxhIHByb3B1ZXN0YSBkZSB2YWxvciBkZSBsYSBlbXByZXNhLCBhcGFsYW5jYW5kbyBkZSBsYSBpbm5vdmFjacOzbiB5IGVsIHNlcnZpY2lvIGFsIGNsaWVudGUgc2UgYnVzY2EgYXNlZ3VyYXIgbGEgY2FsaWRhZCBsYSBjdWFsIGxvcyBjbGllbnRlcyBkZSBGT1JNIGVzdMOhbiBidXNjYW5kbyBkZWJpZG8gYSBsYSBpbXBvcnRhbmNpYSB5IGRlbGljYWRlemEgcXVlIHRvbWFuIGxhcyBhdXRvcGFydGVzIGludGVyaW9yZXMgeSBlbMOpY3RyaWNhcyBkZW50cm8gZGUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXouCgpBdW5xdWUgbG9zIHByb2R1Y3RvcyBxdWUgb2ZyZWNlIEZPUk0gZGVudHJvIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IGZ1bmdlbiBwYXJlY2lkbyBhIHVuIGNvbW1vZGl0eSwgZWwgZW1wYXF1ZSBzZSBsbGVnYSBhIHByb2R1Y2lyIGVuIGdyYW5kZXMgY2FudGlkYWRlcywgZXN0b3Mgbm8gZW50cmFuIGNvbW8gdGFsIGVuIGxhIGRlZmluaWNpw7NuIGRlIGNvbW1vZGl0eSB5YSBxdWUgZW4gZWwgY2FzbyBkZSBGT1JNIGVudHJhIHVuYSBwYXJ0ZSBjbGF2ZSBsYSBjdWFsIGVzIGxhIHBlcnNvbmFsaXphY2nDs24uCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gUGVyc3BlY3RpdmFzIEZ1dHVyYXMKCkFjdHVhbG1lbnRlIEZPUk0gYnVzY2EgZXF1aXBhciBjb24gdGVjbm9sb2fDrWEgcGFyYSBhdXRvbWF0aXphciB5IGRlc2Fycm9sbGFyIHRvZG8gdW4gYW1iaWVudGUgZGUgZGF0b3MgZWwgY3VhbCBsZXMgcHVlZGEgYXl1ZGFyIGEgYWdpbGl6YXIgcHJvY2Vzb3MgeSBkYXIgY2VydGV6YSBhIGxhIHRvbWEgZGUgZGVjaXNpb25lcyBlbiBiYXNlIGEgZGF0b3MuIENvbiBlc3RvIGJ1c2NhbiBwb2RlciByZWFsaXphciBwcm9uw7NzdGljb3MgcGFyYSBhbnRpY2lwYXIgbGEgZGVtYW5kYSBkZSBzdXMgY2xpZW50ZXMgeSBkaXZlcnNpZmljYXIgZGVudHJvIGRlIEVVQSwgZXN0byBwb3IgbWVuY2lvbmFyIGFsZ3VubyBkZSBsb3MgZWplbXBsb3MuICBFbiBjdWFudG8gYSB0ZW1hcyBkZSBjdWx0dXJhIG9yZ2FuaXphY2lvbmFsIHNlIGJ1c2NhIG1lZGlyIHNpc3RlbcOhdGljYW1lbnRlIGRpZmVyZW50ZXMgS1BJwrRzLiAKCgpBZGVtw6FzIGRlIGVzdG8sIHNlIGJ1c2NhIGNyZWFyIHVuIHNlbnRpZG8gZGUgcGVydGVuZW5jaWEgeSBsZWFsdGFkIGRlIGxvcyBlbXBsZWFkb3MgaGFjaWEgbGEgZW1wcmVzYS4gQnVzY2FuZG8gY29udGludWFyIGNvbiBsYSBjdWx0dXJhIG9yZ2FuaXphY2lvbmFsIGFjdHVhbCwgbGEgY3VhbCBlc3TDoSBlbmZvY2FkYSBlbiBsYSBob3Jpem9udGFsaWRhZCwgbGEgY29uc3RydWNjacOzbiBkZSBlcXVpcG9zIHkgZGl2aXNpb25lcyBhdXTDs25vbWFzIGEgbml2ZWxlcyBpbmZlcmlvcmVzIGRlbnRybyBkZSBsYSBlbXByZXNhLiBFc3RvLCBjb24gZWwgZmluIGRlIHBlcm1pdGlyIHVuYSBjb211bmljYWNpw7NuIG3DoXMgZWZlY3RpdmEgeSBmbHVpZGEgZW50cmUgZGVwYXJ0YW1lbnRvcy4KIAojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gRXhwYW5zacOzbgoKQWN0dWFsbWVudGUgRk9STSBidXNjYSB1biBjcmVjaW1pZW50bywgZGVzZWEgY29udGludWFyIGNvbiBsYSBpbmR1c3RyaWEgZGUgYXV0b3BhcnRlcywgcG9yIGxvIHF1ZSBzdSBwcmluY2lwYWwgZW5mb3F1ZSBzZSBlbmN1ZW50cmEgZW4gY3JlY2VyIGEgbG8gbGFyZ28gZGUgbGEgbMOtbmVhIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IHF1ZSBzZSBlbmN1ZW50cmEgdWJpY2FkYSBlbiBlbCB0ZXJyaXRvcmlvIG1leGljYW5vIHkgZXN0YWRvdW5pZGVuc2UuIEVzcGVjw61maWNhbWVudGUsIGJ1c2NhIGNyZWNlciBlbiBlbCBiYWrDrW8gbWV4aWNhbm8geSBlbiBTYW4gQW50b25pbyBUZXhhcyBlbiBlbCBleHRyYW5qZXJvLiBQb3Igb3RyYSBwYXJ0ZSwgYnVzY2EgZXhwbG9yYXIgb3RyYXMgaW5kdXN0cmlhcyBsYXMgY3VhbGVzIHNlIGFsaW5lZW4gYSBzdSBtaXNpw7NuLCBjb21vIGxvIHB1ZWRlIHNlciAgbGEgYWVyb2VzcGFjaWFsIHkgZGUgZXF1aXBvcyBtw6lkaWNvcy4gCgpBZGVtw6FzIGJ1c2NhIGV4cGFuZGlyIHN1cyBpbnZlcnNpb25lcyBlbiBlbCBleHRyYW5qZXJvIHRvbWFuZG8gY29tbyBvcGNpw7NuIHByaW5jaXBhbCBhIEVzdGFkb3MgVW5pZG9zLiBCdXNjYW5kbyBjcmVjZXIgYSBjdWFscXVpZXIgcGFydGUgZGUgVGV4YXMgZGViaWRvIGEgZWwgY29zdG8gZGUgb3BvcnR1bmlkYWQgcXVlIHNlIHRpZW5lLCBzaSBzZSBidXNjYSBjcmVjZXIgbcOhcyBhbGzDoSBkZSBUZXhhcyBhdW1lbnRhIGxvcyBjb3N0b3MgZGUgZmxldGVzIHkgZWwgbmVnb2NpbyBubyBzYWxlIGNvbiBidWVuIG1hcmdlbi4gRk9STSBubyBidXNjYSBzZXIgbGEgZW1wcmVzYSBtYXMgZ3JhbmRlLCBzZSBjb25jZW50cmEgZW4gbmVnb2Npb3MgZGUgUFlNRSBjb24gZ3JhbmRlcyBtYXJnZW5lcyBkZSBnYW5hbmNpYQoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEN1bHR1cmEgb3JnYW5pemFjaW9uYWwgeSBSSAoKSG95IGVuIGTDrWEgY3VlbnRhbiBjb24gMTMwIGNvbGFib3JhZG9yZXMgZGVudHJvIGRlIGxhIGVtcHJlc2EsIHNpbiBlbWJhcmdvIGV4aXN0ZSB1biB0ZW1hIGRlIHJvdGFjacOzbiBkZSBwZXJzb25hbCBwb3IgZGl2ZXJzYXMgcmF6b25lcywgdW5vIGRlIHN1cyBlbmZvcXVlcyBlcyBjcmVhciB1bmEgY3VsdHVyYSBvcmdhbml6YWNpb25hbCBsYSBjdWFsIHJldGVuZ2EgYWwgY2FwaXRhbCBodW1hbm8uIAoKQWN0dWFsbWVudGUgb2ZyZWNlbiBkaXZlcnNhcyBjb21wZW5zYWNpb25lcyB5IGJlbmVmaWNpb3MgcGFyYSBpbmNpdGFyIGxhIGFjdGl2YSBwYXJ0aWNpcGFjacOzbiBkZSBzdXMgY29sYWJvcmFkb3Jlcy4gU2UgY3VlbnRhbiBjb24gYmFzZXMgZGUgZGF0b3MgZW5mb2NhZGFzIGFsIHRlbWEgZGUgY2FwaXRhbCBodW1hbm8gY29uIGxhcyBjdWFsZXMgc2UgYnVzY2FuIGlkZW50aWZpY2FyIGxhcyByYXpvbmVzIGRlIGxhIHJvdGFjacOzbiwgc2luIGVtYmFyZ28gYcO6biBubyBoYW4gbG9ncmFkbyB2ZXIgdW4gZGVjcmVtZW50byBlbiBsb3MgcG9yY2VudGFqZXMgYW51YWxlcyBkZSByb3RhY2nDs24uCgpGT1JNIGN1ZW50YSBjb24gNiBwaWxhcmVzIHByaW5jaXBhbGVzLCBkZW50cm8gZGUgbGEgZW1wcmVzYSBzZSB2aXZlIHVuYSBhY3RpdHVkIGRlIGhvbmVzdGlkYWQgeSB0cmFuc3BhcmVuY2lhIGRlbnRybyBkZSB0b2RvcyBsb3MgcHJvY2Vzb3MsIHNlIGJ1c2NhIGN1aWRhciBkZXRhbGxhZGFtZW50ZSBsb3MgZXNwYWNpb3MgZGUgdHJhYmFqbyBjb24gcGxhbmVzIHBhcmEgaW1wbGVtZW50YXIgbnVldm9zIGJhw7FvcyBlbiBlbCBwaXNvLgoKIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gKipBbsOhbGlzaXMgZGUgbGFzIMOhcmVhcyBkZSBsYSBlbXByZXNhKioKCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gQ2FyZ2EgZGUgbGlicmVyaWFzCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ3JpZCkKbGlicmFyeShwc3ljaCkKbGlicmFyeShncGxvdHMpCmxpYnJhcnkoa25pdHIpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IENhcmdhIGRlIGRhdG9zCmBgYHtyfQoKI2ZpbGUuY2hvb3NlKCkKVmVudGFzXzEgPC0gcmVhZC5jc3YoIi9Vc2Vycy9kYXZpZGNhdmF6b3MvRGVza3RvcC9FdmlkZW5pY2EzL1ZlbnRhc18xLmNzdiIpCgojZmlsZS5jaG9vc2UoKQpCYWphcyA8LXJlYWQuY3N2KCIvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvRXZpZGVuaWNhMy9CYWphcy5jc3YiKQoKI2ZpbGUuY2hvb3NlKCkKRkRJX2RmIDwtIHJlYWQuY3N2KCIvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvRXZpZGVuaWNhMy9GRElfTWV4aWNvLmNzdiIpCgpgYGAKCgoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEJhamFzIHBvciBQdWVzdG8geSBHZW5lcm8gKDIwMjEpCgpMb3MgYXl1ZGFudGVzIGdlbmVyYWxlcyBzb24gbG9zIHF1ZSBjdWVudGFuIG1heW9yIGJhamEgcG9yIHVuIG1hcmfDqW4gYWx0YW1lbnRlIGNvbnNpZGVyYWJsZSwgY29tbyBzZSBwdWVkZSBvYnNlcnZhciBlbiBsYSBncmFmw61jYSAxLiBBZGVtw6FzIGRlIGVzdG8gc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGRlIGlndWFsIGZvcm1hIGxhIG1heW9yw61hIGRlIHBlcnNvbmFzIGRlIGVzdMOhIHBvc2ljacOzbiBhIGxhcyBxdWUgc2UgbGVzIGRhIGRlIGJhamEgc29uIG11amVyZXMuIAoKUG9yIGxvIHF1ZSBzZSBwb2Ryw61hIHBsYW50ZWFyIHVuYSBwcmltZXIgaGlww7N0ZXNpcyBsYSBjdWFsIGVzIHF1ZSBlc3RvIHNlIHB1ZWRlIGRlYmVyIGEgcXVlIGxhIGdyYW4gcGFydGUgZGUgcGVyc29uYXMgcXVlIHNlIGNvbnRyYXRhbiBzb24gcGFyYSBlbCBwdWVzdG8gZGUgYXl1ZGFudGUgZ2VuZXJhbCB5IGRlIHNleG8gZmVtZW5pbm8sIHNpbiBlbWJhcmdvIHRvZGF2w61hIG5vIHNlIGhhIHJlYWxpemFkbyBlbCBhbsOhbGlzaXMgcGFyYSBjb21wcm9iYXIgbGEgaGlww7N0ZXNpcyBhbnRlcyBtZW5jaW9uYWRhLiAKCgoKYGBge3J9Cm9wdGlvbnMoc2NpcGVuID0gOTk5KSAKQmFqYXMkUFVFU1RPIDwtIGFzLmZhY3RvcihCYWphcyRQVUVTVE8pCgpnZ3Bsb3QoQmFqYXMsIGFlcyhQVUVTVE8pKSArCiAgZ2VvbV9iYXIoYWVzKGZpbGw9R0VORVJPKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgbGFicyh4ID0gIlB1ZXN0byIsIHkgPSAiQ2FudGlkYWQiLCB0aXRsZSA9ICJCYWphcyBwb3IgcHVlc3RvICIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTk4IikpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IFZlbnRhcyBwb3IgTMOtbmVhIGRlIE5lZ29jaW8gKDIwMjEpIApEZW50cm8gZGUgbGFzIHZlbnRhcyBwb3IgbGluZWEgZGUgbmVnb2NpbywgZXMgZGVjaXIgcmV0b3JuYWJsZSB5IGNhcnTDs24uIFNlIHB1ZWRlIG9ic2VydmFyIGNvbW8gbGEgbGluZWEgZGUgbmVnb2Npb3MgcXVlIGxpZGVyw6EgZXMgbGEgZGVsIGNhcnTDs24sIHNpbiBlbWJhcmdvIHNlIG9ic2VydmEgY29tbyBsYXMgdmVudGFzIGRlIHJldG9ybmFibGVzIHkgY2FydMOzbiBlbiBsb3MgcHJpbWVyb3MgMiBxdWFydGlsZXMgZGVsIGHDsW8gc29uIGFsdGFtZW50ZSBzdXBlcmlvcmVzIGFsIHJlc3RvIGRlbCBhw7FvLiAKCioqR3LDoWZpY28gMioqCgpgYGB7cn0KYXMuRGF0ZShWZW50YXNfMSRNZXMpCgpjb2xfcGVyIDwtIGMoImNvcmFsIiwgIm9yYW5nZSIpCgpnZ3Bsb3QoVmVudGFzXzEsIGFlcyh4ID0gTWVzLCB5ID0gVmVudGEsIGZpbGwgPSBQcm9kdWN0bykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGxhYnMoeCA9ICJNZXMiLCB5ID0gIlZlbnRhIiwgdGl0bGUgPSAiVmVudGFzIE1lbnN1YWxlcyBwb3IgUHJvZHVjdG8iKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sX3BlcikgKyAKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTk4IikgKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBJbnZlcnNpw7NuIEV4dHJhbmplcmEgcG9yIEHDsW8KCkxhIEludmVyc2nDs24gRXh0cmFuamVyYSAgRGlyZWN0YSBlbiBlbCBtaXNtbyBhw7FvICgyMDIxKSwgdHV2byBmdWVydGVzIGFmZWN0YWNpb25lcyBkZWJpZG8gYWwgQ09WSUQtMTksIHBvciBsbyBxdWUgcG9kcsOtYSBzZXIgdW5hIGRlIGxhcyByYXpvbmVzIHBvciBsYXMgY3VhbGVzIGVuIGxhIEdyYWbDrWNhIDIgbGFzIHZlbnRhcyBkZSBsb3MgdWx0w61tb3MgMiBjdWFydGlsZXMgZGVsIGHDsW8gaGF5YW4gY2HDrWRvIGRlIG1hbmVyYSBjb25zaWRlcmFibGUgYSBjb21wYXJhY2nDs24gZGVsIGluaWNpbyBkZWwgYcOxby4gCgoqKkdyw6FmaWNvIDMqKgoKYGBge3J9CmRmX0ZESSA9IEZESV9kZgoKI1NlcGFyYXIgQ29sdW1uYXMKZGZfRkRJIDwtIHNlcGFyYXRlKGRmX0ZESSwgUXVhcnRpbCwgaW50byA9IGMoIlF1YXJ0aWwiLCAiQcOxbyIpLCBzZXAgPSAiICIpCgojRkRJIHN1bWFkbyBwb3IgQcOxbwphw7FvX3N1bSA8LSBkZl9GREkgJT4lIGdyb3VwX2J5KEHDsW8pICU+JSBzdW1tYXJpemUoc3VtYT1zdW0oTWlsLk1pbGxvbmVzLmRlLkRvbGFyZXMpKQoKYcOxb19zdW0kQcOxbyA8LSBhcy5udW1lcmljKGHDsW9fc3VtJEHDsW8pCgpncmFmaWNvX2HDsW8gPSBnZ3Bsb3QoYcOxb19zdW0sIGFlcyh4ID0gQcOxbywgeSA9IHN1bWEpKSArCiAgZ2VvbV9saW5lKCBjb2xvciA9ICIjRjQ2QzIyIikgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiI0Y0NkMyMiIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3VtYSksIGhqdXN0ID0gLTAuMiwgdmp1c3QgPSAwLjUsIGNvbG9yID0gIiM1MDUwNTAiLCBzaXplID0gNCkgKyAgCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpw7NuIEV4dHJhbmplcmEgRGlyZWN0YSBwb3IgQcOxbyIsc3VidGl0bGUgPSAiTWlsIE1pbGxvbmVzIGRlIETDs2xhcmVzIiwgeCA9ICJBw7FvIiwgeSA9ICJJbnZlcnNpw7NuIiwgY2FwdGlvbiA9ICJGdWVudGU6IElORUdJIikgKyAKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjNTA1MDUwIiksIHBhbmVsLmdyaWQubWFqb3IgPSAgICAgIGVsZW1lbnRfYmxhbmsoKSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41LCBzaXplID0gNykpIAoKZ3JhZmljb19hw7FvICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGHDsW9fc3VtJEHDsW8pCmBgYAoKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBGT0RBIENydXphZG8KRWwgb2JqZXRpdm8gZGVsIGFuw6FsaXNpcyBGT0RBIHBhcmEgRk9STSBlcyBldmFsdWFyIGRlIG1hbmVyYSBpbnRlZ3JhbCBzdXMgRm9ydGFsZXphcywgT3BvcnR1bmlkYWRlcywgRGViaWxpZGFkZXMgeSBBbWVuYXphcyBjb24gZWwgZmluIGRlIG9idGVuZXIgdW5hIGNvbXByZW5zacOzbiBlc3RyYXTDqWdpY2EgZGUgc3UgcG9zaWNpw7NuIGVuIGVsIG1lcmNhZG8geSBwcm9wb3JjaW9uYXIgdW5hIGJhc2Ugc8OzbGlkYSBwYXJhIGxhIHRvbWEgZGUgZGVjaXNpb25lcyBxdWUgcG90ZW5jaWVuIHN1IGNvbXBldGl0aXZpZGFkIHkgY3JlY2ltaWVudG8gZW4gbGEgaW5kdXN0cmlhIGRlIGVtcGFxdWVzIHkgZW1iYWxhamVzLgoKIVtdKC9Vc2Vycy9kYXZpZGNhdmF6b3MvRGVza3RvcC9FdmlkZW5pY2EzL0ZPREEgQ3J1emFkbyBFMS5wbmcpCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gUEVTVExFCkVsIG9iamV0aXZvIGRlbCBhbsOhbGlzaXMgUEVTVExFIHBhcmEgRk9STSBlcyBleGFtaW5hciBsb3MgZmFjdG9yZXMgcXVlIGltcGFjdGFuIHN1IG9wZXJhY2nDs24geSBlbnRvcm5vIGVtcHJlc2FyaWFsLiBFc3RvIHBlcm1pdGlyw6EgYSBsYSBlbXByZXNhIGNvbXByZW5kZXIgbWVqb3IgZWwgY29udGV4dG8gZW4gZWwgcXVlIG9wZXJhLCBhbnRpY2lwYXIgcG9zaWJsZXMgY2FtYmlvcyB5IGFqdXN0YXIgc3UgZXN0cmF0ZWdpYSBwYXJhIG1heGltaXphciBvcG9ydHVuaWRhZGVzIHkgbWl0aWdhciByaWVzZ29zLgoKIVsgXSgvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvRXZpZGVuaWNhMy9QRVNURUwgRTEucG5nKQohWyBdKC9Vc2Vycy9kYXZpZGNhdmF6b3MvRGVza3RvcC9FdmlkZW5pY2EzL1BFU1RFTDIgRTEgLnBuZykKCgojIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqRW50cmVnYWJsZSAyKioKCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqUHJlZ3VudGEgMSoqCgoqKsK/Q3XDoWwgZXMgZWwgRXN0YWRvIENpdmlsIGNvbiBNYXlvcmVzIEJhamFzPyoqIAoKIyMjIyMgQWJyaXIgYmFzZSBkZSBkYXRvcwoKYGBge3J9CiMgZmlsZS5jaG9vc2UoKQpCRERfRk9STV9CQUpBU18yMDIzIDwtIHJlYWRfY3N2KCIvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvRXZpZGVuaWNhMy9CRERfRk9STV9CQUpBU18yMDIzLmNzdiIpCgojIyMgU2VsZWNjaW9uYXIgbGFzIHZhcmlhYmxlcyBkZSBNb3Rpdm8gZGUgYmFqYSB5IEVzdGFkbyBDaXZpbCBlbiB1biBudWV2byBkYXRhIGZyYW1lLgoKbWJhamEgPC0gc2VsZWN0KEJERF9GT1JNX0JBSkFTXzIwMjMsYE1vdGl2byBkZSBCYWphYCxgRXN0YWRvIENpdmlsYCkgJT4lIG5hLm9taXQobWJhamEpCmBgYAoKIyMjIyMgQWdydXBhciBsYSBjYXRlZ29yw61hIGNvbiBkaWZlcmVudGVzIG5vbWJyZXMgY2FtYmlhbmRvIGEgZWwgbWlzbW8gbm9tYnJlCmBgYHtyfQoKbWJhamEkIk1vdGl2byBkZSBCYWphIlttYmFqYSQiTW90aXZvIGRlIEJhamEiID09ICJJbmR1Y2lkYS4iXSA8LSAiSW5kdWNpZGEiCgptYmFqYSQiTW90aXZvIGRlIEJhamEiW21iYWphJCJNb3Rpdm8gZGUgQmFqYSIgPT0gIkluZHVjaWRhIChGYWx0YXMpIl0gPC0gIkluZHVjaWRhIHBvciBmYWx0YXMiCgptYmFqYSQiTW90aXZvIGRlIEJhamEiW21iYWphJCJNb3Rpdm8gZGUgQmFqYSIgPT0gIkluZHVjaWRhIChGYWx0YXMgbm8gZGlvIGxvcyB0aWVtcG9zKSJdIDwtICJJbmR1Y2lkYSIKYGBgCgojIyMjIyBDYWxjdWxhciBsb3MgcG9yY2VudGFqZXMgcG9yIGNhdGVnb3LDrWEgeSBlc3RhZG8gY2l2aWwKYGBge3J9CnBvcmNlbnRhamVzIDwtIG1iYWphICU+JQogIGdyb3VwX2J5KGBFc3RhZG8gQ2l2aWxgLCBgTW90aXZvIGRlIEJhamFgKSAlPiUKICBzdW1tYXJpc2UoRnJlY3VlbmNpYSA9IG4oKSkgJT4lCiAgZ3JvdXBfYnkoYEVzdGFkbyBDaXZpbGApICU+JQogIG11dGF0ZShQY3QgPSBzY2FsZXM6OnBlcmNlbnQoRnJlY3VlbmNpYSAvIHN1bShGcmVjdWVuY2lhKSkpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IE1vdGl2byBkZSBCYWphIHkgRXN0YWRvIENpdmlsCgpgYGB7cn0KcGxvdCA8LSBnZ3Bsb3QocG9yY2VudGFqZXMsIGFlcyh4ID0gYEVzdGFkbyBDaXZpbGAsIHkgPSBGcmVjdWVuY2lhLCBmaWxsID0gYE1vdGl2byBkZSBCYWphYCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjQsIGxpbmV0eXBlID0gImRvdHRlZCIpLCAgIyBMw61uZWFzIHZlcnRpY2FsZXMKICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleSIsIGxpbmV3aWR0aCA9IDAuNCwgbGluZXR5cGUgPSAiZG90dGVkIikgICMgTMOtbmVhcyBob3Jpem9udGFsZXMKICApKwogIGdndGl0bGUoIlJlbGFjacOzbiBlbnRyZSBNb3Rpdm8gZGUgQmFqYSB5IEVzdGFkbyBDaXZpbCIpCgpgYGAKCiMjIyMjIEFncmVnYXIgZXRpcXVldGFzIGRlIHBvcmNlbnRhamUKYGBge3J9CnBsb3QgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gUGN0KSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksc2l6ZT0yKQpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBSZXN1bHRhZG9zCgpQb3IgbG8gcXVlIHBvZGVtb3MgdmVyIGVuIGxhIGdyw6FmaWNhLCBsYSBncmFuIG1heW9yw61hIGRlIGxhcyBiYWphcyBlbiB0b2RhcyBsYXMgY2F0ZWdvcsOtYXMgc29uIHBvciBzZXBhcmFjacOzbiB2b2x1bnRhcmlhIHkgcmVhbG1lbnRlIG5vIHNlIGxvZ3JhIHZlciB1bmEgY29ycmVsYWNpw7NuIGVudHJlIGVsIGVzdGFkbyBjaXZpbCBkZSBsYSBwZXJzb25hIHkgZWwgbW90aXZvIGRlIGJhamEsIGxvIHF1ZSBwb2Ryw61hIGluZGljYXIgdW5hIGFsdGEgcm90YWNpw7NuIGRlIGVtcGxlYWRvcyBlbiBsb3MgdHJhYmFqb3MgZGUgbWFxdWlsYSBlbiBnZW5lcmFsIG8gcG9kcsOtYSBzZXIgdW4gaW5kaWNhZG9yIGRlIHF1ZSBoYXkgdmFyaWFzIMOhcmVhcyBkZSBvcG9ydHVuaWRhZCBlbiBjdWVzdGnDs24gZGUgYW1lbmlkYWRlcywgc2FsYXJpb3MsIGJvbm9zLCBvcG9ydHVuaWRhZGVzIGRlIGNyZWNpbWllbnRvIGVuIGxhIGVtcHJlc2EsIHRyYXNsYWRvIG8gcHJlc3RhY2lvbmVzIHF1ZSBsYSBlbXByZXNhIG9mcmVjZSBhZGVtw6FzIGRlIGxhcyBiw6FzaWNhcyBkaWN0YWRhcyBwb3IgbGEgbGV5LgoKIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gKipQcmVndW50YSAyKioKCioqwr9DdcOhbCBlcyBsYSByZWxhY2nDs24gZW50cmUgbGEgZWRhZCB5IGxhcyBiYWphcz8qKgoKCiMjIyMjIENhcmdhIGRlIGRhdG9zCgpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKYmFqYXM8LXJlYWRfY3N2KCIvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvRXZpZGVuaWNhMy9mb3JtX2JhamFzXzIyLmNzdiIpCmBgYAoKCiMjIyMjICoqTW9kaWZpY2FjacOzbiBkZSBiYXNlIGRlIGRhdG9zKiogICAgIAoKYGBge3J9CgojRXN0b3kgY3JlYW5kbyB1biBkYXRhIGZyYW1lIG51ZXZvIGNvbiBsYXMgY29sdW1uYXMgbmVjZXNhcmlhcyBwYXJhIGhhY2VyIGxhIGdyw6FmaWNhCgpiYWphczEgPC0gc2VsZWN0KGJhamFzLCJOT01CUkUiLCJBUEVMTElET1MiLCJGRUNIQSBERSBOQUNJTUlFTlRPIiwiRElBUyBMQUJPUkFET1MiLCJTQUxBUklPIERJQVJJTyBJTVNTIikgJT4lIG5hLm9taXQoYmFqYXMxKQojdmlldyhiYWphczEpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEVzdGFkw61zaXRpY29zIERlc2NyaXB0aXZvcwoKIyMjIyMgRGlhcyBMYWJvcmFkb3MKYGBge3J9CnN1bW1hcnkoYmFqYXMxJGBESUFTIExBQk9SQURPU2ApCmBgYAojIyMjIyBTYWxhcmlvCmBgYHtyfQpzdW1tYXJ5KGJhamFzMSRgU0FMQVJJTyBESUFSSU8gSU1TU2ApCmBgYAoKIyMjIyMgRWRhZCBkZSBjb2xhYm9yYWRvcmVzCgpgYGB7cn0KCiNBcXXDrSByZXZpc28gcXVlIGZvcm1hdG8gdGllbmVuIGxhcyBjb2x1bW5hcyAKCnN0cihiYWphczEpCmBgYApgYGB7cn0KCiNBcXXDrSBlc3RveSBoYWNpZW5kbyB1bmEgZXh0cmFjY2nDs24gZGVsIGHDsW8gZGUgbmFjaW1pZW50byBleGNsdXllbmRvIGxvcyBkw61hcyB5IG1lc2VzLiAKCiNEZWNpZMOtIGhhY2VyIGVzdG8gcG9ycXVlIGhheSBmaWxhcyBlbiBsYXMgcXVlIGVzdMOhIGVzY3JpdG8gTS9EL0EgeSBvdHJhcyBEL00vQQoKCmJhamFzMSRBTklPPC1zdHJfc3ViKGJhamFzMSRgRkVDSEEgREUgTkFDSU1JRU5UT2AsLTQsLTEpCgojQ29udmlydGllbmRvIGxhIGNvbHVtbmEgZGUgIkFOSU8iIGVuIGludGVnZXIKCmJhamFzMSRBTklPIDwtIGFzLmludGVnZXIoYmFqYXMxJEFOSU8pCgpzdHIoYmFqYXMxKQpgYGAKYGBge3J9CgoKI0FxdcOtIGNyZcOzIHVuYSBudWV2YSBjb2x1bW5hIGxsYW1hZGEgIkVEQUQiIHJlc3RhbmRvIGVsIGHDsW8gYWN0dWFsIGNvbiBlbCBkZSAiQU5JTwoKYmFqYXMxJEVEQUQgPC0gMjAyMy1iYWphczEkQU5JTwoKI0hhYsOtYSB1biBlcnJvciBlbiBlbCBjdWFsIGV4aXN0w61hbiB0cmVzIGZpbGFzIHF1ZSB0ZW7DrWFuIGVkYWQgZGUgMSBwb3IgbG8gY3VhbCBsZSBwZWTDrSBxdWUgc29sbyBtb3N0cmFyYSBsb3MgcXVlIHNvbiBtYXlvciBhIDE4LgoKYmFqYXMxIDwtIGJhamFzMVtiYWphczEkRURBRCA+MTgsXQpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBCYWphcyBwb3IgRWRhZAoKYGBge3J9Cmhpc3QoYmFqYXMxJEVEQUQsY29sID0gYmx1ZXM5LHhsYWIgPSAiRWRhZCIseWxhYiA9IkZyZWN1ZW5jaWEiICxtYWluID0gIkJhamFzIHBvciBFZGFkIikKYGBgCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gUmVzdWx0YWRvcwoKTm9zIGRhbW9zIGN1ZW50YSBkZSBxdWUgbGEgcm90YWNpw7NuIGRlIHBlcnNvbmFsIHNlIHZlIG3DoXMgYWx0YSBlbiBsb3MgY29sYWJvcmFkb3JlcyBtw6FzIGrDs3ZlbmVzLiBFc3RvIGVzIGluZm9ybWFjacOzbiDDunRpbCB5YSBxdWUgbm9zIHBlcm1pdGUgdG9tYXIgZGVjaXNpb25lcyBhZGVjdWFkYXMgcGFyYSBtZWpvcmFyIGxhIHNhdGlzZmFjY2nDs24gbGFib3JhbCBlbiBlc3BlY8OtZmljbyBwYXJhIGVzdG9zIHJhbmdvcyBkZSBlZGFkZXMuIENvbiBlc3RhIGdyw6FmaWNhIHBvZGVtb3MgZW50cmFyIG3DoXMgYSBkZXRhbGxlIGVuIGVsIMOhcmVhIGRlIG9wb3J0dW5pZGFkIHkgYXPDrSBlbnRlbmRlciBsYXMgcmF6b25lcyBkZSBsYSBhbHRhIHJvdGFjacOzbi4gTm9zIGRhbW9zIGN1ZW50YSBkZSBxdWUgc2UgdGllbmUgcXVlIGhhY2VyIHVuIGVzZnVlcnpvIHBvciBtZWpvcmFyIGxhIHJlbGFjacOzbiBjb24gbGFzIG51ZXZhcyBnZW5lcmFjaW9uZXMgbyBjb250cmF0YXIgYSBwZXJzb25hcyBtYXlvcmVzLiAKCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICoqUHJlZ3VudGEgMyoqCgoqKsK/RGUgcXVlIGVkYWQgZnJlY3VlbnRhbiBpbmdyZXNhciBsb3MgZW1wbGVhZG9zIGEgRk9STT8qKgoKCiMjIyMjIENhcmdhIGRlIGRhdG9zCmBgYHtyfQoKcmggPC0gcmVhZC5jc3YoIi9Vc2Vycy9kYXZpZGNhdmF6b3MvRGVza3RvcC9FdmlkZW5pY2EzL2Zvcm1fcmhfZGF0b3MuY3N2IikKCiNWaWV3KHJoKQoKZWRhZCA8LSBzZWxlY3QocmgsIkZFQ0hBLkRFLkFMVEEiLCAiRkVDSEEuREUuTkFDSU1JRU5UTyIpIAoKI3N0cihyaCkKYGBgCgojIyMjIyBNb2RpZmljYWNpb24gZGUgRGF0b3MKCmBgYHtyfQpyaCRhw7FvX2FsdGEgPC0gc3RyX3N1YihyaCRGRUNIQS5ERS5BTFRBLCAtNCwgLTEpIApyaCRhw7FvX25hYyA8LSBzdHJfc3ViKHJoJEZFQ0hBLkRFLk5BQ0lNSUVOVE8sIC00LCAtMSkKcmgkYcOxb19hbHRhIDwtIGFzLmludGVnZXIocmgkYcOxb19hbHRhKQpyaCRhw7FvX25hYyA8LSBhcy5pbnRlZ2VyKHJoJGHDsW9fbmFjKQoKcmggPC0gcmhbcmgkYcOxb19hbHRhID4gMjAxMyxdCnJoIDwtIHJoWy0zMCxdCgpgYGAKCiMjIyMjIENhbGN1bGFyIGxhIGVkYWQgZGUgaW5ncmVzbyB5IE1lZGlkYXMgZGUgRGlzcGVyc2lvbgoKYGBge3J9CnJoJGVkYWRfaW5ncmVzbyA8LSByaCRhw7FvX2FsdGEgLSByaCRhw7FvX25hYwpyaCA8LSByaFtyaCRlZGFkX2luZ3Jlc28gPiAxOCxdCgplZGFkX2RlX2luZ3Jlc29fbWF4IDwtIG1heChyaCRlZGFkX2luZ3Jlc28pCnByaW50KGVkYWRfZGVfaW5ncmVzb19tYXgpCgplZGFkX2RlX2luZ3Jlc29fbWluIDwtIG1pbihyaCRlZGFkX2luZ3Jlc28pCnByaW50KGVkYWRfZGVfaW5ncmVzb19taW4pCgplZGFkX2RlX2luZ3Jlc29fbWVhbiA8LSBtZWFuKHJoJGVkYWRfaW5ncmVzbykKcHJpbnQoZWRhZF9kZV9pbmdyZXNvX21lYW4pCgpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBBbHRhcyBwb3IgRWRhZApgYGB7cn0KaGlzdChyaCRlZGFkX2luZ3Jlc28sY29sID0gIiMwMDlFNzMiICx4bGFiID0gIkVkYWQiLG1haW4gPSAiQWx0YSBwb3IgRWRhZCIpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IEFsdGFzIGRlIE11amVyZXMvSG9tYnJlcwpgYGB7cn0KCiMjIENhbnRpZGFkIGRlIEhvbWJyZXMgbyBNdWplcmVzIGRhZG9zIGRlIEFsdGEKZ2dwbG90KHJoLCBhZXMoZWRhZF9pbmdyZXNvLCBmaWxsID0gR0VORVJPKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zPTEwKSArIAogIGxhYnMoeT0iIikgCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IFJlc3VsdGFkb3MgCgoqKlJlbGFjacOzbiBFZGFkIHkgZ2VuZXJvIGVuIGxhcyBCYWphcyBkZSBFbXBsZWFkb3MqKgoKUG9kZW1vcyBhbmFsaXphciBlbiBsYXMgZ3JhZmljYXMgcXVlIGxhIGVkYWQgbcOhcyBjb211biBwYXJhIGluZ3Jlc2FyIGEgdHJhYmFqYXIgYSBGT1JNIGVzIGVudHJlIGxvcyAyNSAtIDMwIGxvIHF1ZSBub3MgcHVlZGUgYXl1ZGFyIGEgY3JlYXIgY2FtcGHDsWFzIGRlIHJlY2x1dGFtaWVudG8gZW5mb2NhZGFzIGVuIGVsIG1lcmNhZG8gZGUgZWRhZCBhbCBxdWUgbG9zIGVtcGxlYWRvcyBkZSBGT1JNIGVzdGFuIGVuZm9jYWRvcywgRk9STSBjdWVudGEgY29uIHVuIGdyYW4gcmFuZ28gZGUgZWRhZGVzIGNvbWVuemFuZG8gZGVzZGUgbG9zIDE5IHkgbGxlZ2FuZG8gaGFzdGEgbG9zIDYwLiBFc3RlIHVsdGltbyBzaWVuZG8gZWwgZ3J1cG8gbWFzIHBlcXVlw7FvIGRlbnRybyBkZSBsYSBlbXByZXNhIG1pZW50cmFzIHF1ZSBsb3Mgam92ZW5lcyBkZSAxOCAtIDIwIHRpZW5kZW4gYSBzZXIgdW4gcG9yY2VudGFqZSBtw6FzIGFsdG8gZGUgaG9tYnJlcy4gTm9zIGRhbW9zIGN1ZW50YSBjb24gbGEgZ3JhZmljYSBxdWUgRk9STSBsZSBhYnJlIGxhcyBwdWVydGFzIGEgbXVjaGFzIHBlcnNvbmFzIHkgb2ZyZWNlIG9wb3J0dW5pZGFkZXMgZGUgdHJhYmFqbyBwYXJhIG51ZXZhcyBnZW5lcmFjaW9uZXMgeSBwZXJzb25hcyBjb24gZXhwZXJpZW5jaWEgIAoKIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gKipQcmVndW50YSA0KioKCioqwr9FeGlzdGVuIHRlbmRlbmNpYXMgZGUgYmFqYXM/KioKCgojIyMjIEltcG9ydGFyIGRhdGFzZXRzCmBgYHtyfQpiYWphcyA9IHJlYWQuY3N2KCIvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvRXZpZGVuaWNhMy9mb3JtX2JhamFzXzIyLmNzdiIpCmRmYmFqYXMgPSBiYWphcyAKCiNMaW1waWV6YSBEYXRhc2V0CmJhamFzJEVTVEFETy5DSVZJTCA9IGdzdWIoIk1BVFJJT01PTklPIiwgIk1BVFJJTU9OSU8iLCBiYWphcyRFU1RBRE8uQ0lWSUwpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+ICpGcmVjdWVuY2lhIGRlIETDrWFzIExhYm9yYWRvcyoKYGBge3J9Cmhpc3QoYmFqYXMkRElBUy5MQUJPUkFET1MsIGNvbCA9IGJsdWVzOSwgeGxhYiA9ICJESUFTIExBQk9SQURPUyIsIHlsYWIgPSAiRnJlY3VlbmNpYSIsIG1haW4gPSAiRMOtYXMgTGFib3JhZG9zIiwgeGxpbSA9IGMoMCwgMTAwMCkpCmBgYAoKIyMjIyBTZXBhcmFjacOzbiBkZSBGZWNoYXMgLSBCYWphcwpgYGB7cn0KZGZfcm90YWNpb24gPSBiYWphcyAlPiUgc2VsZWN0KEdFTkVSTywgRkVDSEEuREUuQUxUQSxCQUpBLCBNT1RJVk8uREUuQkFKQSwgRElBUy5MQUJPUkFET1MsIFBVRVNUTykKZGZfcm90YWNpb24gPSBkZl9yb3RhY2lvbiAlPiUgc2VwYXJhdGUoQkFKQSwgaW50byA9IGMoIk1PTlRIX0JBSkEiLCAiREFZX0JBSkEiLCAiWUVBUl9CQUpBIiksIHNlcCA9ICIvIikKYGBgCgojIyMjIyBTZXBhcmFjacOzbiBkZSBGZWNoYXMgLSBBbHRhcwpgYGB7cn0KZGZfcm90YWNpb24gPSBkZl9yb3RhY2lvbiAlPiUgc2VwYXJhdGUoRkVDSEEuREUuQUxUQSwgaW50byA9IGMoIk1PTlRIX0FMVEEiLCAiREFZX0FMVEEiLCAiWUVBUl9BTFRBIiksIHNlcCA9ICIvIikKYGBgCgojIyMjIyBBc2lnbmFjacOzbiBNZXNlcwpgYGB7cn0KZGZfbW9udGhzIDwtIGRmX3JvdGFjaW9uICU+JQogIG11dGF0ZShOQU1FX01PTlRIID0gY2FzZV93aGVuKAogICAgTU9OVEhfQkFKQSA9PSAxIH4gIkVuZXJvIiwKICAgIE1PTlRIX0JBSkEgPT0gMiB+ICJGZWJyZXJvIiwKICAgIE1PTlRIX0JBSkEgPT0gMyB+ICJNYXJ6byIsCiAgICBNT05USF9CQUpBID09IDQgfiAiQWJyaWwiLAogICAgTU9OVEhfQkFKQSA9PSA1IH4gIk1heW8iLAogICAgTU9OVEhfQkFKQSA9PSA2IH4gIkp1bmlvIiwKICAgIE1PTlRIX0JBSkEgPT0gNyB+ICJKdWxpbyIsCiAgICBNT05USF9CQUpBID09IDggfiAiQWdvc3RvIiwKICAgIE1PTlRIX0JBSkEgPT0gOSB+ICJTZXB0aWVtYnJlIiwKICAgIE1PTlRIX0JBSkEgPT0gMTAgfiAiT2N0dWJyZSIsCiAgICBNT05USF9CQUpBID09IDExIH4gIk5vdmllbWJyZSIsCiAgICBNT05USF9CQUpBID09IDEyIH4gIkRpY2llbWJyZSIKICApKSAlPiUKICBmaWx0ZXIoTkFNRV9NT05USCAlaW4lIGMoIkVuZXJvIiwgIkZlYnJlcm8iLCAiTWFyem8iLCAiQWJyaWwiLCAiTWF5byIsICJKdW5pbyIsICJKdWxpbyIsICJBZ29zdG8iLCAiU2VwdGllbWJyZSIsICJPY3R1YnJlIiwgIk5vdmllbWJyZSIsICJEaWNpZW1icmUiKSkgJT4lCiAgc2VsZWN0KEdFTkVSTywgTU9OVEhfQkFKQSwgREFZX0FMVEEsIFlFQVJfQUxUQSwgTU9USVZPLkRFLkJBSkEsIE5BTUVfTU9OVEgsIFBVRVNUTykKYGBgCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gQ2FudGlkYWQgZGUgQmFqYXMgcG9yIE1lcwpgYGB7cn0KYmFycGxvdF9zdWJjYXRlZ29yeSA8LSBnZ3Bsb3QoZGZfbW9udGhzLCBhZXMoeCA9IE5BTUVfTU9OVEgpKSArCiAgZ2VvbV9iYXIoZmlsbCA9ICIjRjQ2QzIyIiwgd2lkdGggPSAwLjUpICsKICBnZ3RpdGxlKCJCYWphcyBwb3IgTWVzIikKCmJhcnBsb3Rfc3ViY2F0ZWdvcnkgKwogIGxhYnModGl0bGUgPSAiQmFqYXMgcG9yIE1lcyIpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKSArIHhsYWIoIk1lc2VzIikgKwogIHlsYWIoIkNhbnRpZGFkIGRlIEJhamFzIikKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBDYW50aWRhZCBkZSBCYWphcyBwb3IgUHVlc3RvCmBgYHtyfQpmcmVxdWVuY3lfcHVlc3RvID0gdGFibGUoZGZfbW9udGhzJFBVRVNUTykKZGZfZnJlcXVlbmN5X3B1ZXN0byA9IGFzLmRhdGEuZnJhbWUoZnJlcXVlbmN5X3B1ZXN0bykKY29sbmFtZXMoZGZfZnJlcXVlbmN5X3B1ZXN0bykgPC0gYygiUHVlc3RvIiwgIkNhbnRpZGFkIikKCmRmX2ZyZXF1ZW5jeV9wdWVzdG8gPC0gZGZfZnJlcXVlbmN5X3B1ZXN0byAlPiUKICBhcnJhbmdlKGRlc2MoQ2FudGlkYWQpKQoKa2FibGUoZGZfZnJlcXVlbmN5X3B1ZXN0bywgZm9ybWF0ID0gImh0bWwiLCBlc2NhcGUgPSBGQUxTRSwgCiAgICAgIHRhYmxlLmF0dHIgPSAnc3R5bGU9ImZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsiJykKCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IFJlc3VsdGFkb3MKCiAqKlRlbmRlbmNpYXMgZGUgQmFqYSBkZSBFbXBsZWFkb3MqKgogCkFuYWxpemFuZG8gZGlyZWN0YW1lbnRlIGxhIGNhbnRpZGFkIGRlIGJhamFzIHBvciBtZXMgcG9kZW1vcyB2ZXIgcXVlIGV4aXN0ZSB1bmEgYWx0YSBpbmNsaW5hY2nDs24gZGUgYmFqYXMgZGUgZW1wbGVhZG9zIGVuIHN1IGVuIGVsIG1lcyBkZSBFbmVybyB5IGVuIHN1IGNvbnRyYXBhcnRlIE5vdmllbWJyZSBlcyBlbCBtZXMgY29uIG1lbm9yIG7Dum1lcm8gZGUgYmFqYXMsIGFsIGV4Y2x1aXIgZWwgbWVzIGRlIERpY2llbWJyZSBxdWUgbm8gY3VlbnRhIGNvbiBuaW5ndW5hIGJhamEgcmVnaXN0cmFkYS4gUG9yIGxvIHF1ZSBzZSBwbGFudMOpYSBsYSBoaXDDs3Rlc2lzIGxhIGN1YWwgRk9STSBtZW5jaW9ubyBkdXJhbnRlIGxhcyBzZXNpb25lcyBkZSBpbmZvcm1hY2nDs24gZ2VuZXJhbCBkZSBsYSBlbXByZXNhLCAiTG9zIGVtcGxlYWRvcyBzZSBxdWVkYW4gcGFyYSByZWNpYmlyIHN1IGFndWluYWxkby9ib25vIHkgZGVzcMO6ZXMgc2UgdmFuIiwgcG9yIGxvIHF1ZSBzZSBwdWVkZSBtZW5jaW9uYXIgdW5hIGFzb2NpYWNpw7NuIGRlIGxvcyBkYXRvcyBwZXJvIHRvZGF2w61hIG5vIHVuYSBjYXVzYWxpZGFkIGRlIGxvcyBtaXNtb3MuIAoKCiMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gKipIYWxsemFnb3MgeSBTdWdlcmVuY2lhcyoqCgojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiAqKkhhbGxhemdvcyBwcmluY2lwYWxlcyoqCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gUHVlc3RvIGRlIEF5dWRhbnRlIEdlbmVyYWwgCgogRGVzZGUgZWwgY29udGV4dG8gbm9zb3Ryb3MgY29ub2NlbW9zIHF1ZSB1bm8gZGUgbG9zIHByb2JsZW1hcyBwcmluY2lwYWxlcyBkZSBGT1JNIGVzIHN1IGFsdGEgcm90YWNpw7NuIGRlIGVtcGxlYWRvcyBlbiBlc3BlY8OtZmljbyBsb3MgZW1wbGVhZG9zIG9wZXJhdGl2b3MuIFVuIGhhbGxhemdvIGltcG9ydGFudGUgcXVlIGVudGVuZGltb3MgYSB0cmF2w6lzIGRlIGVzdGEgaW52ZXN0aWdhY2nDs24gZGUgZGF0b3MgZnVlIHF1ZSBlbCBwdWVzdG8gZGUgYXl1ZGFudGUgZ2VuZXJhbCBlcyBlbCBxdWUgbcOhcyBmcmVjdWVudGVtZW50ZSBzZSBkYSBkZSBiYWphLiBFc3RlIGVzIHVuIGRhdG8gY3LDrXRpY28geWEgcXVlIG5vcyBwZXJtaXRlIGVudHJhciBtw6FzIGEgZGV0YWxsZSBsYSByYcOteiBkZWwgcHJvYmxlbWEgeSBhc8OtIGhhY2VyIG1vZGlmaWNhY2lvbmVzIG5lY2VzYXJpYXMgcGFyYSBtZWpvcmFyLiAKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBSZWxhY2nDs24gY29uIEpvdmVuZXMKClBvZGVtb3MgY29uY2x1aXIgcXVlIGhheSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBqw7N2ZW5lcyBlbnRyZSAxOC0zMCBhw7FvcyBxdWUgY29uc3RhbnRlbWVudGUgc29uIGJhamFzIGVuIEZPUk0uRGUgdG9kb3MgbG9zIGVtcGxlYWRvcyBlc3RhIGVzIGxhIGNhdGVnb3LDrWEgbcOhcyBhZmVjdGFkYS4gIEVzIGltcG9ydGFudGUgY29uc2lkZXJhciBlc3RhIGluZm9ybWFjacOzbiBwYXJhIGVsIGRlc2Fycm9sbG8gZGUgZXN0cmF0ZWdpYXMgZGUgc2F0aXNmYWNjacOzbiBsYWJvcmFsLiBFcyBpbXBvcnRhbnRlIHNhdGlzZmFjZXIgbGFzIG5lY2VzaWRhZGVzIGVzcGVjw61maWNhcyBkZSBsb3MgasOzdmVuZXMgeWEgcXVlIGVzdGFzIHB1ZWRlbiBzZXIgZGlmZXJlbnRlcyBhIGxhcyBkZSBsb3MgbWF5b3Jlcy4gCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gUmVjbHV0YW1pZW50bwoKQ29uc2lkZXJhbmRvIHF1ZSBsYXMgZWRhZGVzIG3DoXMgZnJlY3VlbnRlcyBkZSBzdXMgYWx0YXMgc29uIGrDs3ZlbmVzIGRlIDE4IC0gMzAgYcOxb3MgZXMgaW1wb3J0YW50ZSBjb25zaWRlcmFyIGVzdG8gcGFyYSBzdXMgZXN0cmF0ZWdpYXMgZGUgcmVjbHV0YW1pZW50by4KCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBBbHRhIHJvdGFjaW9uIGRlIE11amVyZXMKClZlbW9zIGNvbW8gaGF5IHVuYSBhbHRhIHJvdGFjacOzbiBlc3BlY8OtZmljYW1lbnRlIGVuIG11amVyZXMsIGVzdG8gcHJvYmFibGVtZW50ZSBkZWJpZG8gYSBxdWUgY29udHJhdGFuIG3DoXMgbXVqZXJlcyBxdWUgaG9tYnJlcyBlbiBjaWVydG9zIHB1ZXN0b3MgZGUgdHJhYmFqbyBlc3BlY8OtZmljb3MuIFNpbiBlbWJhcmdvIGNvbnNpZGVybyBxdWUgZXMgdW4gaGFsbGF6Z28gaW1wb3J0YW50ZSB5YSBxdWUgbm9zIHBlcm1pdGUgZW50ZW5kZXIgdW5hIMOhcmVhIGRlIG9wb3J0dW5pZGFkIGVzcGVjw61maWNhIGVuIGxhIHBvZGVtb3MgZGlzZcOxYXIgdW5hIGVzdHJhdGVnaWEgcGFyYSBtZWpvcmFyIGxhIHNhdGlzZmFjY2nDs24gbGFib3JhbCBkZSBsYXMgbXVqZXJlcy4gCgojIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gU2F0aXNmYWNjacOzbiBsYWJvcmFsIAoKTGEgbWF5b3Igw6FyZWEgZGUgb3BvcnR1bmlkYWQgcXVlIHRpZW5lIEZPUk0gZXMgbWVqb3JhciBzdSBzYXRpc2ZhY2Npw7NuIGxhYm9yYWwsIGRlc2RlIGxvcyDDoW5ndWxvcyBhbnRlcmlvcmVzIHBvZGVtb3MgaW50ZXJwcmV0YXIgcXVlIGVzdGUgZXMgdW5vIGRlIGxvcyBwcm9ibGVtYXMgcXVlIHByZWRvbWluYW4gZW4gbGEgZW1wcmVzYS4gRWwgdGVuZXIgaW5zYXRpc2ZhY2Npw7NuIGxhYm9yYWwgYmFqYSBsYSBwcm9kdWN0aXZpZGFkLCBsYSBlZmljaWVuY2lhIHkgc3ViZSBsYSByb3RhY2nDs24gYXVtZW50YW5kbyBsb3MgZ2FzdG9zIGRlIGxhIGVtcHJlc2EuIAoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IE5lY2VzaWRhZCBkZSBkYXRvcwoKQSB0cmF2w6lzIGRlIGVzdGEgaW52ZXN0aWdhY2nDs24gcG9kZW1vcyBjb25jbHVpciBxdWUgZmFsdGFuIG3DoXMgZGF0b3MgcGFyYSBwb2RlciBjb250aW51YXIgY29uIHVuYSBwcm9wdWVzdGEuIFBvciBlbCBtb21lbnRvIHNvbG8gY29ub2NlbW9zIHF1ZSBjb2xhYm9yYWRvcmVzIHNvbiBsb3MgcXVlIHRpZW5lbiBtw6FzIGZyZWN1ZW5jaWEgZGUgYmFqYXMgc2luIGVtYmFyZ28gcGFyYSBjb25vY2VyIGVsIHBvcnF1w6kgbmVjZXNpdGFtb3MgZGF0b3MgY3VhbGl0YXRpdm9zIGRlIGxvcyBlbXBsZWFkb3MgYWN0dWFsZXMuIAoKIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpkYXJrb3JhbmdlIj4gKipTdWdlcmVuY2lhcyBkZSBQcm9mZXNpb25hbGVzKioKCiMjIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiBGdW5kYW1lbnRhY2nDs24gCgpTZSBidXNjYSBzaWVtcHJlIHRlbmVyIGxvcyBmdW5kYW1lbnRvcyBjb3JyZWN0b3MgYWwgbW9tZW50byBkZSBhbmFsaXphciwgZXMgaW1wb3J0YW50ZSBlbiB0b2RvcyBsb3MgcGFzb3MgZGVzZGUgbGEgcmVjb3BpbGFjacOzbiwgaGFzdGEgbGEgdmlzdWFsaXphY2nDs24gdGVuZXIgZW4gbWVudGUgcXVlIHR1IHByb3llY3RvIGVzdMOpIGZ1bmRhbWVudGFkbywgcG9ycXVlIGRlIGVzYSBtYW5lcmEgZXMgbcOhcyBmw6FjaWwganVzdGlmaWNhciB1bmEgcHJvcHVlc3RhIG8gcG9zaWJsZSBzb2x1Y2nDs24uIAoKIVsgXSgvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvRXZpZGVuaWNhMy9pbnYucG5nKQoKIyMjIDxzcGFuIHN0eWxlID0iY29sb3I6ZGFya29yYW5nZSI+IFZpc3VhbGl6YWNpw7NuIGUgSW50ZXJwcmV0YWNpw7NuCgpTZSBidXNjYSBxdWUgbGEgdmlzdWFsaXphY2nDs24gZGUgZGF0b3Mgc2llbXByZSBzZWEgZsOhY2lsIGRlIGVudGVuZGVyIGUgaW50ZXJwcmV0YXIsIGVuIHVuIGFtYmllbnRlIGxhYm9yYWwgbWllbnRyYXMgbcOhcyBzaW1wbGVzIHkgZGlyZWN0b3Mgc2VhbiBsb3MgZGF0b3MgeSBzdXMgZGlmZXJlbnRlcyB0aXBvcyBkZSBncsOhZmljb3MvdGFibGFzIGVzICBtZWpvciBwYXJhIGxhIHBlcnNvbmEgcXVlIHRpZW5lIHF1ZSB0b21hciBkZWNpc2lvbmVzIHVzYW5kbyBlc2EgaW5mb3JtYWNpw7NuLgoKIVsgXSgvVXNlcnMvZGF2aWRjYXZhem9zL0Rlc2t0b3AvRXZpZGVuaWNhMy92aXN1YWxpemFjaW9uLnBuZykKIAoKIyA8c3BhbiBzdHlsZSA9ImNvbG9yOmRhcmtvcmFuZ2UiPiAqKlJlZmVyZW5jaWFzKioKCi0gaHR0cHM6Ly93d3cuZWNvbm9taWEuZ29iLm14L2RhdGFtZXhpY28vZXMvcHJvZmlsZS9pbmR1c3RyeS9jb252ZXJ0ZWQtcGFwZXItcHJvZHVjdC1tYW51ZmFjdHVyaW5nCgotIGh0dHBzOi8vd3d3LmVsZWNvbm9taXN0YS5jb20ubXgvZXN0YWRvcy9JbmR1c3RyaWEtZGUtYXV0b3BhcnRlcy1wcmV2ZS1jcmVjaW1pZW50by1kZS1lbi0yMDIzLTIwMjMwNTMxLTAwODEuaHRtbCAKCi0gaHR0cHM6Ly8wLXd3dy1zdGF0aXN0YS1jb20uYmlibGlvdGVjYS1pbHMudGVjLm14L3N0YXRpc3RpY3MvMjc3MDU1L2dsb2JhbC1tYXJrZXQtc2hhcmVvZi1yZWdpb25zLW9uLWF1dG8tcHJvZHVjdGlvbi8KCi0gaHR0cHM6Ly93d3cuc3RhdGlzdGEuY29tL3N0YXRpc3RpY3MvODk4OTU1L21leGljby1tb3Rvci12ZWhpY2xlLXByb2R1Y3Rpb24tYnJhbmQvCgotIGh0dHBzOi8vd3d3LnZkYS5kZS9lbi9uZXdzL2ZhY3RzLWFuZC1maWd1cmVzL2FubnVhbC1maWd1cmVzL2F1dG9tb2JpbGUtcHJvZHVjdGlvbikKCi0gaHR0cHM6Ly93d3cuZWNvbm9taWEuZ29iLm14L2RhdGFtZXhpY28vZXMvcHJvZmlsZS9wcm9kdWN0L2JveGVzLWNvcnJ1Z2F0ZWQtcGFwZXJib2FyZAoKCgoKCg==