Limpieza, Transformación y Organización de Bases de Datos

## Descargar librerías
library(foreign)
library(dplyr)        # data manipulation 
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(forcats)      # to work with categorical variables
library(ggplot2)      # data visualization
library(readr)        # read specific csv files
library(janitor)      # data exploration and cleaning 
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(Hmisc)        # several useful functions for data analysis 
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
## 
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(psych)        # functions for multivariate analysis 
## 
## Attaching package: 'psych'
## The following object is masked from 'package:Hmisc':
## 
##     describe
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(naniar)       # summaries and visualization of missing values NAs
library(dlookr)       # summaries and visualization of missing values NAs
## 
## Attaching package: 'dlookr'
## The following object is masked from 'package:psych':
## 
##     describe
## The following object is masked from 'package:Hmisc':
## 
##     describe
## The following object is masked from 'package:base':
## 
##     transform
library(corrplot)     # correlation plots
## corrplot 0.92 loaded
library(jtools)       # presentation of regression analysis 
## 
## Attaching package: 'jtools'
## The following object is masked from 'package:Hmisc':
## 
##     %nin%
library(lmtest)       # diagnostic checks - linear regression analysis 
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(car)          # diagnostic checks - linear regression analysis
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:psych':
## 
##     logit
## The following object is masked from 'package:dplyr':
## 
##     recode
library(olsrr)        # diagnostic checks - linear regression analysis 
## 
## Attaching package: 'olsrr'
## The following object is masked from 'package:datasets':
## 
##     rivers
library(kableExtra)   # HTML table attributes
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(gmodels)
library(openxlsx)
library(crosstable)

*Nota: Como parte de la limpieza de datos de ambos documentos, se realizaron los promedios de los valores faltantes de forma manual en Excel.

A partir de esta parte del documento, el análisis estará dividido en dos partes. En la primera se analizará la base de datos con la información de los colaboradores actuales de la empresa, mientras que en la segunda se analizarán los datos de aquellos empleados que ya fueron bajas por motivos de despido, renuncia voluntaria, entre otros.

BASE DE DATOS: COLABORADORES DE RECURSOS HUMANOS

## 1. Número de registros y variables

### Importar base de datos
df1 <-read.csv(file.choose())
summary(df1)
##  No..De.Empleado   APELLIDOS            NOMBRE          FECHA.DE.NACIMIENTO
##  Min.   :  1.00   Length:113         Length:113         Length:113         
##  1st Qu.: 31.00   Class :character   Class :character   Class :character   
##  Median : 63.00   Mode  :character   Mode  :character   Mode  :character   
##  Mean   : 75.86                                                            
##  3rd Qu.:127.00                                                            
##  Max.   :169.00                                                            
##       EDAD          GENERO              RFC            FECHA.DE.ALTA     
##  Min.   : 0.00   Length:113         Length:113         Length:113        
##  1st Qu.:25.00   Class :character   Class :character   Class :character  
##  Median :33.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :35.74                                                           
##  3rd Qu.:45.00                                                           
##  Max.   :73.00                                                           
##   PRIMER.MES         CUARTO.MES             BAJA           PUESTO         
##  Length:113         Length:113         Min.   :0.0000   Length:113        
##  Class :character   Class :character   1st Qu.:0.0000   Class :character  
##  Mode  :character   Mode  :character   Median :0.0000   Mode  :character  
##                                        Mean   :0.3451                     
##                                        3rd Qu.:0.0000                     
##                                        Max.   :3.0000                     
##  DEPARTAMENTO       SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:113         Min.   :144.4       Min.   :     0       
##  Class :character   1st Qu.:176.7       1st Qu.:     0       
##  Mode  :character   Median :180.7       Median :     0       
##                     Mean   :181.2       Mean   :  2244       
##                     3rd Qu.:180.7       3rd Qu.:     0       
##                     Max.   :441.4       Max.   :182096       
##  N..CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP              CALLE          
##  Min.   :0.000e+00    Length:113          Length:113         Length:113        
##  1st Qu.:0.000e+00    Class :character    Class :character   Class :character  
##  Median :0.000e+00    Mode  :character    Mode  :character   Mode  :character  
##  Mean   :6.770e+07                                                             
##  3rd Qu.:0.000e+00                                                             
##  Max.   :1.922e+09                                                             
##  NUMERO.INTERNO       COLONIA           MUNICIPIO            ESTADO         
##  Length:113         Length:113         Length:113         Length:113        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  CODIGO.POSTAL   ESTADO.CIVIL       TARJETA.CUENTA        X          
##  Min.   :25016   Length:113         Length:113         Mode:logical  
##  1st Qu.:66640   Class :character   Class :character   NA's:113      
##  Median :66646   Mode  :character   Mode  :character                 
##  Mean   :63365                                                       
##  3rd Qu.:66649                                                       
##  Max.   :67493                                                       
##    X.1         
##  Mode:logical  
##  NA's:113      
##                
##                
##                
## 
describe(df1)
## # A tibble: 7 × 26
##   described_v…¹     n    na    mean      sd se_mean   IQR skewn…² kurto…³    p00
##   <chr>         <int> <int>   <dbl>   <dbl>   <dbl> <dbl>   <dbl>   <dbl>  <dbl>
## 1 No..De.Emple…   113     0 7.59e+1 5.39e+1 5.07e+0 96      0.400  -1.24      1 
## 2 EDAD            113     0 3.57e+1 1.33e+1 1.25e+0 20      0.398  -0.310     0 
## 3 BAJA            113     0 3.45e-1 9.61e-1 9.04e-2  0      2.45    4.05      0 
## 4 SALARIO.DIAR…   113     0 1.81e+2 3.47e+1 3.27e+0  3.96   4.93   31.6     144.
## 5 FACTOR.CRED.…   113     0 2.24e+3 1.79e+4 1.68e+3  0      9.45   93.5       0 
## 6 N..CREDITO.I…   113     0 6.77e+7 3.55e+8 3.34e+7  0      5.10   24.4       0 
## 7 CODIGO.POSTAL   113     0 6.34e+4 1.12e+4 1.05e+3  9     -3.14    8.01  25016 
## # … with 16 more variables: p01 <dbl>, p05 <dbl>, p10 <dbl>, p20 <dbl>,
## #   p25 <dbl>, p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>,
## #   p75 <dbl>, p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>, and
## #   abbreviated variable names ¹​described_variables, ²​skewness, ³​kurtosis

2. Clasificación de variables

variable<-c("No..De.Empleado","APELLIDOS","NOMBRE","FECHA.DE.NACIMIENTO","EDAD","GENERO","RFC","FECHA.DE.ALTA","PRIMER.MES","CUARTO.MES","BAJA","PUESTO","DEPARTAMENTO","SALARIO.DIARIO.IMSS","FACTOR.CRED.INFONAVIT","N..CREDITO.INFONAVIT","LUGAR.DE.NACIMIENTO","CURP","CALLE","NUMERO.INTERNO","COLONIA","MUNICIPIO","ESTADO","CODIGO.POSTAL","ESTADO.CIVIL","TARJETA.CUENTA")
Type<-c(
        "quantitative (continous)",
        "qualitative (discrete)",
        "qualitative (discrete)",
        "qualitative (discrete)",
        "quantitative (continous)",
        "qualitative (discrete)",
        "qualitative (discrete)",
        "quantitative (continous)",
        "quantitative (continous)",
        "quantitative (continous)",
        "quantitative (continous)",
        "qualitative (discrete)",
        "qualitative (discrete)",
        "quantitative (continous)",
        "quantitative (continous)",
        "qualitative (discrete)",
        "qualitative (discrete)",
        "qualitative (discrete)",
        "qualitative (discrete)",
        "quantitative (continous)",
        "qualitative (discrete)",
        "qualitative (discrete)",
        "qualitative (discrete)",
        "quanitative (continous)",
        "qualitative (discrete)",
        "qualitative (discrete)"
        )

table<-data.frame(variable,Type)
knitr::kable(table)
variable Type
No..De.Empleado quantitative (continous)
APELLIDOS qualitative (discrete)
NOMBRE qualitative (discrete)
FECHA.DE.NACIMIENTO qualitative (discrete)
EDAD quantitative (continous)
GENERO qualitative (discrete)
RFC qualitative (discrete)
FECHA.DE.ALTA quantitative (continous)
PRIMER.MES quantitative (continous)
CUARTO.MES quantitative (continous)
BAJA quantitative (continous)
PUESTO qualitative (discrete)
DEPARTAMENTO qualitative (discrete)
SALARIO.DIARIO.IMSS quantitative (continous)
FACTOR.CRED.INFONAVIT quantitative (continous)
N..CREDITO.INFONAVIT qualitative (discrete)
LUGAR.DE.NACIMIENTO qualitative (discrete)
CURP qualitative (discrete)
CALLE qualitative (discrete)
NUMERO.INTERNO quantitative (continous)
COLONIA qualitative (discrete)
MUNICIPIO qualitative (discrete)
ESTADO qualitative (discrete)
CODIGO.POSTAL quanitative (continous)
ESTADO.CIVIL qualitative (discrete)
TARJETA.CUENTA qualitative (discrete)

3. Escalas de medición

variables <- c(
  "No..De.Empleado",
  "APELLIDOS",
  "NOMBRE",
  "FECHA.DE.NACIMIENTO",
  "EDAD",
  "GENERO",
  "RFC",
  "FECHA.DE.ALTA",
  "PRIMER.MES",
  "CUARTO.MES",
  "BAJA",
  "PUESTO",
  "DEPARTAMENTO",
  "SALARIO.DIARIO.IMSS",
  "FACTOR.CRED.INFONAVIT",
  "N..CREDITO.INFONAVIT",
  "LUGAR.DE.NACIMIENTO",
  "CURP",
  "CALLE",
  "NUMERO.INTERNO",
  "COLONIA",
  "MUNICIPIO",
  "ESTADO",
  "CODIGO.POSTAL",
  "ESTADO.CIVIL",
  "TARJETA.CUENTA"
  )

tipos <- c(
              "Cuantitativo",
              "Cualitativo",
              "Cualitativo",
              "Cualitativo",
              "Cuantitativo",
              "Cualitativo",
              "Cualitativo",
              "Cuantitativo",
              "Cuantitativo",
              "Cuantitativo",
              "Cuantitativo",
              "Cualitativo",
              "Cualitativo",
              "Cuantitativo",
              "Cuantitativo",
              "Cualitativo",
              "Cualitativo",
              "Cualitativo",
              "Cualitativo",
              "Cuantitativo",
              "Cualitativo",
              "Cualitativo",
              "Cualitativo",
              "Cuantitativo",
              "Cualitativo",
              "Cualitativo"
              )

escalas <- c(
            "Intervalo",
             "Nominal",
             "Nominal",
             "Intervalo",
            "Intervalo",
             "Nominal",
            "Nominal",
            "Razón",
            "Razón",
            "Razón",
            "Razón",
            "Ordinal",
            "Nominal",
            "Razón",
            "Razón",
            "Nominal",
            "Nominal",
            "Nominal",
            "Nominal",
            "Razón",
            "Nominal",
            "Nominal",
            "Nominal",
            "Ordinal",
            "Nominal",
            "Nominal"
            )

table1 <- data.frame (variables, tipos, escalas)
knitr::kable(table1)
variables tipos escalas
No..De.Empleado Cuantitativo Intervalo
APELLIDOS Cualitativo Nominal
NOMBRE Cualitativo Nominal
FECHA.DE.NACIMIENTO Cualitativo Intervalo
EDAD Cuantitativo Intervalo
GENERO Cualitativo Nominal
RFC Cualitativo Nominal
FECHA.DE.ALTA Cuantitativo Razón
PRIMER.MES Cuantitativo Razón
CUARTO.MES Cuantitativo Razón
BAJA Cuantitativo Razón
PUESTO Cualitativo Ordinal
DEPARTAMENTO Cualitativo Nominal
SALARIO.DIARIO.IMSS Cuantitativo Razón
FACTOR.CRED.INFONAVIT Cuantitativo Razón
N..CREDITO.INFONAVIT Cualitativo Nominal
LUGAR.DE.NACIMIENTO Cualitativo Nominal
CURP Cualitativo Nominal
CALLE Cualitativo Nominal
NUMERO.INTERNO Cuantitativo Razón
COLONIA Cualitativo Nominal
MUNICIPIO Cualitativo Nominal
ESTADO Cualitativo Nominal
CODIGO.POSTAL Cuantitativo Ordinal
ESTADO.CIVIL Cualitativo Nominal
TARJETA.CUENTA Cualitativo Nominal
#Las escalas de medición permiten organizar datos en orden jerárquico. Éstas pueden ser clasificadas de acuerdo a una degradación de las características de distintas variables. Entre las variables usadas están nominal (aquellas que son mutuamente excluyentes y no asignan un orden o jerarquía), ordinal (establecen un orden, puede ser creciente o decreciente), intervalo (establecen un orden determinado por un intervalo numérico) y razón (existe un intervalo numérico; el cero representa la ausencia de valor; es un cero absoluto).

4. Limpieza de datos

Remover valores irrelevantes (eliminar renglones duplicados) y conversión de datos son técnicas elegidas para realizar la limpieza de datos debido a las necesidades de la base de datos y el beneficio que generó para el análisis descriptivo, obteniendo información más clara y concisa.

### Eliminar renglones duplicados
df2<-df1
df2<-distinct(df2)

### ¿Cuántos NA's tengo en la base de datos? Primera limpieza
sum(is.na(df2))
## [1] 226
### Eliminar columnas
df3<-df2
df3 <- subset(df3, select =-c (X))
df3 <- subset(df3, select =-c (X.1))
df3 <- subset(df3, select =-c (NOMBRE))
df3 <- subset(df3, select =-c (APELLIDOS))
df3 <- subset(df3, select =-c (RFC))
df3 <- subset(df3, select =-c (CUARTO.MES))
df3 <- subset(df3, select =-c (FACTOR.CRED.INFONAVIT))
df3 <- subset(df3, select =-c (CURP))
df3 <- subset(df3, select =-c (CALLE))
df3 <- subset(df3, select =-c (NUMERO.INTERNO))
df3 <- subset(df3, select =-c (TARJETA.CUENTA))

### ¿Cuántos NA's tengo en la base de datos? Segunda limpieza
sum(is.na(df3))
## [1] 0

5. Análisis Exploratorio de las Bases de Datos

describe(df3)
## # A tibble: 6 × 26
##   described_v…¹     n    na    mean      sd se_mean   IQR skewn…² kurto…³    p00
##   <chr>         <int> <int>   <dbl>   <dbl>   <dbl> <dbl>   <dbl>   <dbl>  <dbl>
## 1 No..De.Emple…   113     0 7.59e+1 5.39e+1 5.07e+0 96      0.400  -1.24      1 
## 2 EDAD            113     0 3.57e+1 1.33e+1 1.25e+0 20      0.398  -0.310     0 
## 3 BAJA            113     0 3.45e-1 9.61e-1 9.04e-2  0      2.45    4.05      0 
## 4 SALARIO.DIAR…   113     0 1.81e+2 3.47e+1 3.27e+0  3.96   4.93   31.6     144.
## 5 N..CREDITO.I…   113     0 6.77e+7 3.55e+8 3.34e+7  0      5.10   24.4       0 
## 6 CODIGO.POSTAL   113     0 6.34e+4 1.12e+4 1.05e+3  9     -3.14    8.01  25016 
## # … with 16 more variables: p01 <dbl>, p05 <dbl>, p10 <dbl>, p20 <dbl>,
## #   p25 <dbl>, p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>,
## #   p75 <dbl>, p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>, and
## #   abbreviated variable names ¹​described_variables, ²​skewness, ³​kurtosis
count(df3, GENERO, sort = TRUE)
##      GENERO  n
## 1  FEMENINO 61
## 2 MASCULINO 52
count(df3, PUESTO, sort = TRUE)
##                       PUESTO  n
## 1           AYUDANTE GENERAL 67
## 2                COSTURERO/A 10
## 3                     CHOFER  5
## 4                   SOLDADOR  5
## 5                  RESIDENTE  4
## 6               SUPERVISOR/A  4
## 7                    EXTERNO  2
## 8     INSPECTOR/A DE CALIDAD  2
## 9                   OPERADOR  2
## 10 AYUDANTE DE MANTENIMIENTO  1
## 11               ENFERMERO/A  1
## 12                    GESTOR  1
## 13      GUARDIA DE SEGURIDAD  1
## 14                     LIDER  1
## 15                  LIMPIEZA  1
## 16             MANTENIMIENTO  1
## 17            MONTACARGUISTA  1
## 18                      MOZO  1
## 19                    PINTOR  1
## 20                    RECIBO  1
## 21       SERVICIO AL CLIENTE  1
count(df3, DEPARTAMENTO, sort = TRUE)
##             DEPARTAMENTO  n
## 1                 VARIOS 40
## 2      PRODUCCION RETORN 10
## 3                COSTURA  9
## 4                  CEDIS  8
## 5  PRODUCCION CARTON MDL  7
## 6               STABILUS  7
## 7   PRODUCCION CARTON MC  5
## 8              EMBARQUES  4
## 9               PAILERIA  4
## 10               TROQUEL  4
## 11                CELDAS  3
## 12                   EHS  3
## 13               CALIDAD  2
## 14               EXTERNO  2
## 15              AY FLEXO  1
## 16            CORTADORAS  1
## 17              LIMPIEZA  1
## 18            MATERIALES  1
## 19              ROTATIVA  1
count(df3, SALARIO.DIARIO.IMSS, sort = TRUE)
##    SALARIO.DIARIO.IMSS  n
## 1               180.68 59
## 2               176.72 23
## 3               151.61 11
## 4               151.67  5
## 5               144.45  3
## 6               152.86  1
## 7               175.79  1
## 8               181.68  1
## 9               184.68  1
## 10              185.68  1
## 11              208.65  1
## 12              240.71  1
## 13              240.75  1
## 14              260.01  1
## 15              279.61  1
## 16              337.05  1
## 17              441.37  1
count(df3, LUGAR.DE.NACIMIENTO, sort = TRUE)
##    LUGAR.DE.NACIMIENTO  n
## 1           NUEVO LEON 79
## 2             VERACRUZ 12
## 3             COAHUILA  5
## 4      SAN LUIS POTOSI  3
## 5           TAMAULIPAS  3
## 6              CHIAPAS  2
## 7     CIUDAD DE MEXICO  2
## 8              DURANGO  2
## 9           GUANAJUATO  1
## 10            HONDURAS  1
## 11        QUINTANA ROO  1
## 12             TABASCO  1
## 13           ZACATECAS  1
tibble(df3)
## # A tibble: 113 × 17
##    No..De.Em…¹ FECHA…²  EDAD GENERO FECHA…³ PRIME…⁴  BAJA PUESTO DEPAR…⁵ SALAR…⁶
##          <int> <chr>   <int> <chr>  <chr>   <chr>   <int> <chr>  <chr>     <dbl>
##  1           1 10/09/…    67 MASCU… 01/07/… 31/07/…     0 SUPER… PRODUC…    177.
##  2           2 14/05/…    43 FEMEN… 01/07/… 31/07/…     0 SUPER… PRODUC…    177.
##  3           3 21/11/…    73 MASCU… 22/11/… 22/12/…     0 EXTER… EXTERNO    177.
##  4           4 01/05/…    32 FEMEN… 30/01/… 01/03/…     0 SUPER… PRODUC…    337.
##  5           5 06/09/…    57 FEMEN… 05/05/… 04/06/…     0 SUPER… COSTURA    441.
##  6           6 22/06/…    38 MASCU… 03/07/… 02/08/…     0 SERVI… CEDIS      177.
##  7           7 01/07/…    55 FEMEN… 06/08/… 05/09/…     0 COSTU… COSTURA    260.
##  8           8 10/12/…    26 MASCU… 23/08/… 22/09/…     0 AYUDA… PRODUC…    241.
##  9           9 03/11/…    27 MASCU… 11/01/… 10/02/…     0 AYUDA… CEDIS      177.
## 10          10 18/08/…    37 FEMEN… 20/02/… 22/03/…     0 COSTU… COSTURA    153.
## # … with 103 more rows, 7 more variables: N..CREDITO.INFONAVIT <int>,
## #   LUGAR.DE.NACIMIENTO <chr>, COLONIA <chr>, MUNICIPIO <chr>, ESTADO <chr>,
## #   CODIGO.POSTAL <int>, ESTADO.CIVIL <chr>, and abbreviated variable names
## #   ¹​No..De.Empleado, ²​FECHA.DE.NACIMIENTO, ³​FECHA.DE.ALTA, ⁴​PRIMER.MES,
## #   ⁵​DEPARTAMENTO, ⁶​SALARIO.DIARIO.IMSS

En esta primera parte del análisis estadístico descriptivo, vemos que el conteo total de empleados actuales es de 113 y hay un mayor número de mujeres (54%) contra empleados que son hombres (46%).

En cuanto a los puestos, vemos que existe una gran cantidad de ayudantes generales, pues es el puesto que ocupa mayor capital humano, contra aquellos que ocupan menos que van desde servicio al cliente hasta operadores.

Entre los departamentos con mayor cantidad de empleados, vemos que está varios y producción retorn. El departamento de “Varios” fue creado para catalogar a aquellos empleados que en la base de datos no tenían definida un área en concreto.

Vemos que la mayoría de los empleados ganan $180.68 pesos de salario diario por el IMSS y de todos los empleados, se calcula que tienen un promedio de salario diario de $236.62 pesos.

En cuanto al lugar de origen, vemos que la mayoría de los empleados provienen del Estado de Nuevo León (70%) y Veracruz (11%), viendo que el 19% restante de los empleados son provenientes de Zona Centro o estados colidantes de Nuevo León.

5.1 Tabla de frecuencia (1)

Las tablas de frecuencia son una ordenación en forma de tabla de los datos estadísticos, asignando a cada dato su frecuencia correspondiente, es decir, el número de veces que aparece un determinado valor en un estudio estadístico.

### Tabla de frecuencia: Salario diario de acuerdo al género
proportion <- prop.table(table(df3$GENERO,df3$SALARIO.DIARIO.IMSS))
proportion %>%
  kbl() %>%
  kable_styling()
144.45 151.61 151.67 152.86 175.79 176.72 180.68 181.68 184.68 185.68 208.65 240.71 240.75 260.01 279.61 337.05 441.37
FEMENINO 0.0265487 0.0619469 0.0088496 0.0088496 0.0000000 0.0619469 0.3008850 0.0088496 0.0088496 0.0088496 0.0088496 0.0088496 0.0000000 0.0088496 0.0000000 0.0088496 0.0088496
MASCULINO 0.0000000 0.0353982 0.0353982 0.0000000 0.0088496 0.1415929 0.2212389 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0088496 0.0000000 0.0000000

Esta tabla de frecuencia representa el valor decimal del salario diario de acuerdo al género, es decir, la cantidad de empleados en valor decimal que reciben cierto salario diario de acuerdo a su género.

BASE DE DATOS: BAJAS DE RECURSOS HUMANOS

A partir de la siguiente base de datos, se analizará específicamente la información de aquellas personas que se dieron de baja en años anteriores con el objetivo de entender las principales razones de la alta rotación en la empresa.

### Importar base de datos
df4 <-read.csv(file.choose())
summary(df4)
##   NO.DE.BAJAS      APELLIDOS            NOMBRE          FECHA.DE.NACIMIENTO
##  Min.   :  1.00   Length:238         Length:238         Length:238         
##  1st Qu.: 60.25   Class :character   Class :character   Class :character   
##  Median :119.50   Mode  :character   Mode  :character   Mode  :character   
##  Mean   :119.50                                                            
##  3rd Qu.:178.75                                                            
##  Max.   :238.00                                                            
##                                                                            
##       EDAD          GENERO          FECHA.DE.ALTA      MOTIVO.DE.BAJA    
##  Min.   : 0.00   Length:238         Length:238         Length:238        
##  1st Qu.:22.25   Class :character   Class :character   Class :character  
##  Median :30.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :30.50                                                           
##  3rd Qu.:36.00                                                           
##  Max.   :52.00                                                           
##  NA's   :160                                                             
##  DIAS.TRABAJADOS       BAJA              PUESTO          DEPARTAMENTO      
##  Min.   :   0.00   Length:238         Length:238         Length:238        
##  1st Qu.:   9.00   Class :character   Class :character   Class :character  
##  Median :  22.50   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :  87.30                                                           
##  3rd Qu.:  60.75                                                           
##  Max.   :1966.00                                                           
##                                                                            
##  NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:238         Min.   :144.4       Min.   :     0       
##  Class :character   1st Qu.:180.7       1st Qu.:     0       
##  Mode  :character   Median :180.7       Median :     0       
##                     Mean   :178.0       Mean   :  3112       
##                     3rd Qu.:180.7       3rd Qu.:     0       
##                     Max.   :500.0       Max.   :305820       
##                                                              
##  NO.CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP              CALLE          
##  Min.   :0.000e+00    Length:238          Length:238         Length:238        
##  1st Qu.:0.000e+00    Class :character    Class :character   Class :character  
##  Median :0.000e+00    Mode  :character    Mode  :character   Mode  :character  
##  Mean   :1.582e+08                                                             
##  3rd Qu.:0.000e+00                                                             
##  Max.   :6.919e+09                                                             
##                                                                                
##  NUMERO.INTERNO       COLONIA          CODIGO.POSTAL    MUNICIPIO        
##  Length:238         Length:238         Min.   :25019   Length:238        
##  Class :character   Class :character   1st Qu.:33604   Class :character  
##  Mode  :character   Mode  :character   Median :33604   Mode  :character  
##                                        Mean   :44462                     
##                                        3rd Qu.:66056                     
##                                        Max.   :67450                     
##                                                                          
##     ESTADO          ESTADO.CIVIL       TARJETA.CUENTA    
##  Length:238         Length:238         Length:238        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
### ¿Cuántos NA's tengo en la base de datos?
sum(is.na(df4))
## [1] 160
### Borrar todos los registros NA's de una tabla
df5<-df4
df5<-na.omit(df5)
summary(df5)
##   NO.DE.BAJAS      APELLIDOS            NOMBRE          FECHA.DE.NACIMIENTO
##  Min.   :  5.00   Length:78          Length:78          Length:78          
##  1st Qu.: 49.75   Class :character   Class :character   Class :character   
##  Median :167.50   Mode  :character   Mode  :character   Mode  :character   
##  Mean   :139.60                                                            
##  3rd Qu.:212.75                                                            
##  Max.   :238.00                                                            
##       EDAD          GENERO          FECHA.DE.ALTA      MOTIVO.DE.BAJA    
##  Min.   : 0.00   Length:78          Length:78          Length:78         
##  1st Qu.:22.25   Class :character   Class :character   Class :character  
##  Median :30.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :30.50                                                           
##  3rd Qu.:36.00                                                           
##  Max.   :52.00                                                           
##  DIAS.TRABAJADOS      BAJA              PUESTO          DEPARTAMENTO      
##  Min.   :  0.00   Length:78          Length:78          Length:78         
##  1st Qu.:  9.00   Class :character   Class :character   Class :character  
##  Median : 19.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 45.10                                                           
##  3rd Qu.: 39.75                                                           
##  Max.   :730.00                                                           
##  NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:78          Min.   :151.6       Min.   :   0.0       
##  Class :character   1st Qu.:180.7       1st Qu.:   0.0       
##  Mode  :character   Median :180.7       Median :   0.0       
##                     Mean   :174.3       Mean   : 130.4       
##                     3rd Qu.:180.7       3rd Qu.:   0.0       
##                     Max.   :183.7       Max.   :2795.0       
##  NO.CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP              CALLE          
##  Min.   :0.000e+00    Length:78           Length:78          Length:78         
##  1st Qu.:0.000e+00    Class :character    Class :character   Class :character  
##  Median :0.000e+00    Mode  :character    Mode  :character   Mode  :character  
##  Mean   :1.871e+08                                                             
##  3rd Qu.:0.000e+00                                                             
##  Max.   :6.919e+09                                                             
##  NUMERO.INTERNO       COLONIA          CODIGO.POSTAL    MUNICIPIO        
##  Length:78          Length:78          Min.   :25019   Length:78         
##  Class :character   Class :character   1st Qu.:33604   Class :character  
##  Mode  :character   Mode  :character   Median :33604   Mode  :character  
##                                        Mean   :46508                     
##                                        3rd Qu.:66645                     
##                                        Max.   :67450                     
##     ESTADO          ESTADO.CIVIL       TARJETA.CUENTA    
##  Length:78          Length:78          Length:78         
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
## 
### Eliminar columnas
df3<-df2
df3 <- subset(df3, select =-c (APELLIDOS))
df3 <- subset(df3, select =-c (NOMBRE))
df3 <- subset(df3, select =-c (FACTOR.CRED.INFONAVIT))
df3 <- subset(df3, select =-c (CURP))
df3 <- subset(df3, select =-c (CALLE))
df3 <- subset(df3, select =-c (NUMERO.INTERNO))
df3 <- subset(df3, select =-c (TARJETA.CUENTA))


### ¿Cuántos NA's tengo en la base de datos?
sum(is.na(df5))
## [1] 0
# Con los datos presentados anteriormente, vemos que la edad promedio de los colaboradores es de 35 años, además de que ganan un promedio de $180 pesos.

5.2.1 Tabla cruzada (1)

table(df5$PUESTO, df5$MOTIVO.DE.BAJA)
##                              
##                               BAJA POR FALTAS RENUNCIA VOLUNTARIA
##   AYUDANTE DE EMBARQUES                     0                   0
##   AYUDANTE GENERAL                         50                  18
##   COSTURERO/A                               1                   0
##   GUARDIA DE SEGURIDAD                      0                   1
##   INSPECTOR DE CALIDAD                      1                   0
##   JEFE DE SEGURIDAD E HIGIENE               0                   1
##   MONTACARGUISTA                            1                   1
##   RESIDENTE                                 1                   0
##   SOLDADOR                                  1                   0
##                              
##                               TERMINO DE CONTRATO
##   AYUDANTE DE EMBARQUES                         1
##   AYUDANTE GENERAL                              1
##   COSTURERO/A                                   0
##   GUARDIA DE SEGURIDAD                          0
##   INSPECTOR DE CALIDAD                          0
##   JEFE DE SEGURIDAD E HIGIENE                   0
##   MONTACARGUISTA                                0
##   RESIDENTE                                     0
##   SOLDADOR                                      0

En la tabla vemos que se destacan tres razones principales de bajas de empleados, las cuales son: bajas por faltas, renuncia voluntaria o término de contrato. En su mayoría, hubo una baja por faltas del puesto de ayudante general y renuncia voluntaria para el mismo puesto. Al igual que en la base de datos anterior, vemos que el puesto con mayor rotación a nivel histórico es de ayudante general. Esto sugiere que existe un alto número de contrataciones para el puesto debido a una mala gestión administrativa o bajo rendimiento de los empleados.

5.2.2 Tabla cruzada (2)

table(df5$GENERO, df5$MOTIVO.DE.BAJA)
##            
##             BAJA POR FALTAS RENUNCIA VOLUNTARIA TERMINO DE CONTRATO
##   FEMENINO               40                  12                   1
##   MASCULINO              15                   9                   1

La tabla cruzada anterior nos muestra la relación entre los motivos de baja contra el género, es decir, las principales razones de baja de acuerdo al género de cada empleado. Vemos que hubo un total de 53 bajas del género femenino, destacando las bajas por faltas (representa un 75% de las bajas femeninas). Para el género masculino, hubo un total de 25 faltas, destacando principalmente las bajas por faltas (representa un 60% de las bajas masculinas).

5.3 Gráficos de datos cuantitativos y cualitativos (2)

## 5.3.1 Pie chart

### Pie chart: Representación de bajas acorde al estado de residencia
pie(table(df5$ESTADO), col=c("orange","coral1"),
    main="Representación de bajas acorde al estado de residencia")

La gráfica anterior nos muestra que hay un mayor número de ex-empleados que viven en el Estado de Nuevo León. Sin embargo, hay un porcentaje que reside en Coahuila. Esto se puede interpretar con que hay un alto nivel de rotación existente debido a la lejanía de residencia de los empleados.

Pie chart: Representación de bajas acorde al género

pie(table(df5$GENERO), col=c("orange","coral1"),
    main="Representación de bajas acorde al género")

La anterior gráfica de pastel reafirma lo que mencionamos anteriormente. De acuerdo a las bajas realizadas, la mayoría de los ex-empleados son del género femenino.

5.4 Gráficos de dispersión (2)

### Gráfica de dispersión: Número de bajas VS. Días trabajados
plot(x= df5$NO.DE.BAJAS,
     y=df5$DIAS.TRABAJADOS)

La gráfica de dispersión nos muestra la intensidad de relación entre la variable de días trabajados y número de bajas. Esto nos dice que hubo un alto número de bajas de empleados que trabajaron menos de 200 días, es decir, la mayoría de los ex-empleados estuvieron en FORM menos de 1 año.

### Boxplot: Correlación en bajas acorde a variables de género y edad
ggplot(df5, aes(GENERO,SALARIO.DIARIO.IMSS,fill=GENERO)) +
geom_bar(stat = "identity") +
  scale_fill_brewer(palette = "Set2") + ggtitle("Salario diario por género")

La gráfica anterior nos muestra la correlación entre el género y el salario diario de los empleados. En este, entendemos que el género femenino tiene un salario diario total más alto que los de género masculino.

6. Referencias

Ana Karen García. (2022, September 8). Industria automotriz anota un buen agosto: crecen producción, exportaciones y ventas internas. El Economista; El Economista. https://www.eleconomista.com.mx/empresas/Industria-automotriz-anota-un-buen-agosto-crecen-produccion-exportaciones-y-ventas-internas-20220907-0031.html

Hernández, F., & Usuga, O. (2022). 9 Tablas de frecuencia | Manual de R. Retrieved 24 September 2022, from https://fhernanb.github.io/Manual-de-R/tablas.html#ejemplo-tabla-de-frecuencia-relativa-de-una-v%C3%ADa

9 Estilos y formatos de tabla | Tablas y graficos con R y R Studio. (2022). Retrieved 24 September 2022, from https://tables.investigaonline.com/tse-formateo.html

LS0tDQp0aXRsZTogJ0VudHJlZ2FibGUgUjYgfCBBbsOhbGlzaXMgZGUgYmFzZSBkZSBkYXRvcyBGT1JNOiBSZWN1cnNvcyBIdW1hbm9zJw0KYXV0aG9yOiAiSmltZW5hIE1pZ3VlbCBBMDEzNjU4MTkiDQpkYXRlOiAiMjAyMi0wOS0yOSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KIyMgTGltcGllemEsIFRyYW5zZm9ybWFjacOzbiB5IE9yZ2FuaXphY2nDs24gZGUgQmFzZXMgZGUgRGF0b3MNCg0KYGBge3J9DQojIyBEZXNjYXJnYXIgbGlicmVyw61hcw0KbGlicmFyeShmb3JlaWduKQ0KbGlicmFyeShkcGx5cikgICAgICAgICMgZGF0YSBtYW5pcHVsYXRpb24gDQpsaWJyYXJ5KGZvcmNhdHMpICAgICAgIyB0byB3b3JrIHdpdGggY2F0ZWdvcmljYWwgdmFyaWFibGVzDQpsaWJyYXJ5KGdncGxvdDIpICAgICAgIyBkYXRhIHZpc3VhbGl6YXRpb24NCmxpYnJhcnkocmVhZHIpICAgICAgICAjIHJlYWQgc3BlY2lmaWMgY3N2IGZpbGVzDQpsaWJyYXJ5KGphbml0b3IpICAgICAgIyBkYXRhIGV4cGxvcmF0aW9uIGFuZCBjbGVhbmluZyANCmxpYnJhcnkoSG1pc2MpICAgICAgICAjIHNldmVyYWwgdXNlZnVsIGZ1bmN0aW9ucyBmb3IgZGF0YSBhbmFseXNpcyANCmxpYnJhcnkocHN5Y2gpICAgICAgICAjIGZ1bmN0aW9ucyBmb3IgbXVsdGl2YXJpYXRlIGFuYWx5c2lzIA0KbGlicmFyeShuYW5pYXIpICAgICAgICMgc3VtbWFyaWVzIGFuZCB2aXN1YWxpemF0aW9uIG9mIG1pc3NpbmcgdmFsdWVzIE5Bcw0KbGlicmFyeShkbG9va3IpICAgICAgICMgc3VtbWFyaWVzIGFuZCB2aXN1YWxpemF0aW9uIG9mIG1pc3NpbmcgdmFsdWVzIE5Bcw0KbGlicmFyeShjb3JycGxvdCkgICAgICMgY29ycmVsYXRpb24gcGxvdHMNCmxpYnJhcnkoanRvb2xzKSAgICAgICAjIHByZXNlbnRhdGlvbiBvZiByZWdyZXNzaW9uIGFuYWx5c2lzIA0KbGlicmFyeShsbXRlc3QpICAgICAgICMgZGlhZ25vc3RpYyBjaGVja3MgLSBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcyANCmxpYnJhcnkoY2FyKSAgICAgICAgICAjIGRpYWdub3N0aWMgY2hlY2tzIC0gbGluZWFyIHJlZ3Jlc3Npb24gYW5hbHlzaXMNCmxpYnJhcnkob2xzcnIpICAgICAgICAjIGRpYWdub3N0aWMgY2hlY2tzIC0gbGluZWFyIHJlZ3Jlc3Npb24gYW5hbHlzaXMgDQpsaWJyYXJ5KGthYmxlRXh0cmEpICAgIyBIVE1MIHRhYmxlIGF0dHJpYnV0ZXMNCmxpYnJhcnkoZ21vZGVscykNCmxpYnJhcnkob3Blbnhsc3gpDQpsaWJyYXJ5KGNyb3NzdGFibGUpDQpgYGANCg0KKk5vdGE6IENvbW8gcGFydGUgZGUgbGEgbGltcGllemEgZGUgZGF0b3MgZGUgYW1ib3MgZG9jdW1lbnRvcywgc2UgcmVhbGl6YXJvbiBsb3MgcHJvbWVkaW9zIGRlIGxvcyB2YWxvcmVzIGZhbHRhbnRlcyBkZSBmb3JtYSBtYW51YWwgZW4gRXhjZWwuDQoNCl9fQSBwYXJ0aXIgZGUgZXN0YSBwYXJ0ZSBkZWwgZG9jdW1lbnRvLCBlbCBhbsOhbGlzaXMgZXN0YXLDoSBkaXZpZGlkbyBlbiBkb3MgcGFydGVzLiBFbiBsYSBwcmltZXJhIHNlIGFuYWxpemFyw6EgbGEgYmFzZSBkZSBkYXRvcyBjb24gbGEgaW5mb3JtYWNpw7NuIGRlIGxvcyBjb2xhYm9yYWRvcmVzIGFjdHVhbGVzIGRlIGxhIGVtcHJlc2EsIG1pZW50cmFzIHF1ZSBlbiBsYSBzZWd1bmRhIHNlIGFuYWxpemFyw6FuIGxvcyBkYXRvcyBkZSBhcXVlbGxvcyBlbXBsZWFkb3MgcXVlIHlhIGZ1ZXJvbiBiYWphcyBwb3IgbW90aXZvcyBkZSBkZXNwaWRvLCByZW51bmNpYSB2b2x1bnRhcmlhLCBlbnRyZSBvdHJvcy5fXw0KDQojIyMgQkFTRSBERSBEQVRPUzogQ09MQUJPUkFET1JFUyBERSBSRUNVUlNPUyBIVU1BTk9TDQpgYGB7cn0NCiMjIDEuIE7Dum1lcm8gZGUgcmVnaXN0cm9zIHkgdmFyaWFibGVzDQoNCiMjIyBJbXBvcnRhciBiYXNlIGRlIGRhdG9zDQpkZjEgPC1yZWFkLmNzdihmaWxlLmNob29zZSgpKQ0Kc3VtbWFyeShkZjEpDQpkZXNjcmliZShkZjEpDQpgYGANCg0KDQojIyAyLiBDbGFzaWZpY2FjacOzbiBkZSB2YXJpYWJsZXMNCmBgYHtyfQ0KDQp2YXJpYWJsZTwtYygiTm8uLkRlLkVtcGxlYWRvIiwiQVBFTExJRE9TIiwiTk9NQlJFIiwiRkVDSEEuREUuTkFDSU1JRU5UTyIsIkVEQUQiLCJHRU5FUk8iLCJSRkMiLCJGRUNIQS5ERS5BTFRBIiwiUFJJTUVSLk1FUyIsIkNVQVJUTy5NRVMiLCJCQUpBIiwiUFVFU1RPIiwiREVQQVJUQU1FTlRPIiwiU0FMQVJJTy5ESUFSSU8uSU1TUyIsIkZBQ1RPUi5DUkVELklORk9OQVZJVCIsIk4uLkNSRURJVE8uSU5GT05BVklUIiwiTFVHQVIuREUuTkFDSU1JRU5UTyIsIkNVUlAiLCJDQUxMRSIsIk5VTUVSTy5JTlRFUk5PIiwiQ09MT05JQSIsIk1VTklDSVBJTyIsIkVTVEFETyIsIkNPRElHTy5QT1NUQUwiLCJFU1RBRE8uQ0lWSUwiLCJUQVJKRVRBLkNVRU5UQSIpDQpUeXBlPC1jKA0KICAgICAgICAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwNCiAgICAgICAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAgICAgICAicXVhbGl0YXRpdmUgKGRpc2NyZXRlKSIsDQogICAgICAgICJxdWFsaXRhdGl2ZSAoZGlzY3JldGUpIiwNCiAgICAgICAgInF1YW50aXRhdGl2ZSAoY29udGlub3VzKSIsDQogICAgICAgICJxdWFsaXRhdGl2ZSAoZGlzY3JldGUpIiwNCiAgICAgICAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAgICAgICAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwNCiAgICAgICAgInF1YW50aXRhdGl2ZSAoY29udGlub3VzKSIsDQogICAgICAgICJxdWFudGl0YXRpdmUgKGNvbnRpbm91cykiLA0KICAgICAgICAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwNCiAgICAgICAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAgICAgICAicXVhbGl0YXRpdmUgKGRpc2NyZXRlKSIsDQogICAgICAgICJxdWFudGl0YXRpdmUgKGNvbnRpbm91cykiLA0KICAgICAgICAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwNCiAgICAgICAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAgICAgICAicXVhbGl0YXRpdmUgKGRpc2NyZXRlKSIsDQogICAgICAgICJxdWFsaXRhdGl2ZSAoZGlzY3JldGUpIiwNCiAgICAgICAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAgICAgICAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwNCiAgICAgICAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAgICAgICAicXVhbGl0YXRpdmUgKGRpc2NyZXRlKSIsDQogICAgICAgICJxdWFsaXRhdGl2ZSAoZGlzY3JldGUpIiwNCiAgICAgICAgInF1YW5pdGF0aXZlIChjb250aW5vdXMpIiwNCiAgICAgICAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAgICAgICAicXVhbGl0YXRpdmUgKGRpc2NyZXRlKSINCiAgICAgICAgKQ0KDQp0YWJsZTwtZGF0YS5mcmFtZSh2YXJpYWJsZSxUeXBlKQ0Ka25pdHI6OmthYmxlKHRhYmxlKQ0KDQpgYGANCg0KDQojIyAzLiBFc2NhbGFzIGRlIG1lZGljacOzbg0KYGBge3J9DQoNCnZhcmlhYmxlcyA8LSBjKA0KICAiTm8uLkRlLkVtcGxlYWRvIiwNCiAgIkFQRUxMSURPUyIsDQogICJOT01CUkUiLA0KICAiRkVDSEEuREUuTkFDSU1JRU5UTyIsDQogICJFREFEIiwNCiAgIkdFTkVSTyIsDQogICJSRkMiLA0KICAiRkVDSEEuREUuQUxUQSIsDQogICJQUklNRVIuTUVTIiwNCiAgIkNVQVJUTy5NRVMiLA0KICAiQkFKQSIsDQogICJQVUVTVE8iLA0KICAiREVQQVJUQU1FTlRPIiwNCiAgIlNBTEFSSU8uRElBUklPLklNU1MiLA0KICAiRkFDVE9SLkNSRUQuSU5GT05BVklUIiwNCiAgIk4uLkNSRURJVE8uSU5GT05BVklUIiwNCiAgIkxVR0FSLkRFLk5BQ0lNSUVOVE8iLA0KICAiQ1VSUCIsDQogICJDQUxMRSIsDQogICJOVU1FUk8uSU5URVJOTyIsDQogICJDT0xPTklBIiwNCiAgIk1VTklDSVBJTyIsDQogICJFU1RBRE8iLA0KICAiQ09ESUdPLlBPU1RBTCIsDQogICJFU1RBRE8uQ0lWSUwiLA0KICAiVEFSSkVUQS5DVUVOVEEiDQogICkNCg0KdGlwb3MgPC0gYygNCiAgICAgICAgICAgICAgIkN1YW50aXRhdGl2byIsDQogICAgICAgICAgICAgICJDdWFsaXRhdGl2byIsDQogICAgICAgICAgICAgICJDdWFsaXRhdGl2byIsDQogICAgICAgICAgICAgICJDdWFsaXRhdGl2byIsDQogICAgICAgICAgICAgICJDdWFudGl0YXRpdm8iLA0KICAgICAgICAgICAgICAiQ3VhbGl0YXRpdm8iLA0KICAgICAgICAgICAgICAiQ3VhbGl0YXRpdm8iLA0KICAgICAgICAgICAgICAiQ3VhbnRpdGF0aXZvIiwNCiAgICAgICAgICAgICAgIkN1YW50aXRhdGl2byIsDQogICAgICAgICAgICAgICJDdWFudGl0YXRpdm8iLA0KICAgICAgICAgICAgICAiQ3VhbnRpdGF0aXZvIiwNCiAgICAgICAgICAgICAgIkN1YWxpdGF0aXZvIiwNCiAgICAgICAgICAgICAgIkN1YWxpdGF0aXZvIiwNCiAgICAgICAgICAgICAgIkN1YW50aXRhdGl2byIsDQogICAgICAgICAgICAgICJDdWFudGl0YXRpdm8iLA0KICAgICAgICAgICAgICAiQ3VhbGl0YXRpdm8iLA0KICAgICAgICAgICAgICAiQ3VhbGl0YXRpdm8iLA0KICAgICAgICAgICAgICAiQ3VhbGl0YXRpdm8iLA0KICAgICAgICAgICAgICAiQ3VhbGl0YXRpdm8iLA0KICAgICAgICAgICAgICAiQ3VhbnRpdGF0aXZvIiwNCiAgICAgICAgICAgICAgIkN1YWxpdGF0aXZvIiwNCiAgICAgICAgICAgICAgIkN1YWxpdGF0aXZvIiwNCiAgICAgICAgICAgICAgIkN1YWxpdGF0aXZvIiwNCiAgICAgICAgICAgICAgIkN1YW50aXRhdGl2byIsDQogICAgICAgICAgICAgICJDdWFsaXRhdGl2byIsDQogICAgICAgICAgICAgICJDdWFsaXRhdGl2byINCiAgICAgICAgICAgICAgKQ0KDQplc2NhbGFzIDwtIGMoDQogICAgICAgICAgICAiSW50ZXJ2YWxvIiwNCiAgICAgICAgICAgICAiTm9taW5hbCIsDQogICAgICAgICAgICAgIk5vbWluYWwiLA0KICAgICAgICAgICAgICJJbnRlcnZhbG8iLA0KICAgICAgICAgICAgIkludGVydmFsbyIsDQogICAgICAgICAgICAgIk5vbWluYWwiLA0KICAgICAgICAgICAgIk5vbWluYWwiLA0KICAgICAgICAgICAgIlJhesOzbiIsDQogICAgICAgICAgICAiUmF6w7NuIiwNCiAgICAgICAgICAgICJSYXrDs24iLA0KICAgICAgICAgICAgIlJhesOzbiIsDQogICAgICAgICAgICAiT3JkaW5hbCIsDQogICAgICAgICAgICAiTm9taW5hbCIsDQogICAgICAgICAgICAiUmF6w7NuIiwNCiAgICAgICAgICAgICJSYXrDs24iLA0KICAgICAgICAgICAgIk5vbWluYWwiLA0KICAgICAgICAgICAgIk5vbWluYWwiLA0KICAgICAgICAgICAgIk5vbWluYWwiLA0KICAgICAgICAgICAgIk5vbWluYWwiLA0KICAgICAgICAgICAgIlJhesOzbiIsDQogICAgICAgICAgICAiTm9taW5hbCIsDQogICAgICAgICAgICAiTm9taW5hbCIsDQogICAgICAgICAgICAiTm9taW5hbCIsDQogICAgICAgICAgICAiT3JkaW5hbCIsDQogICAgICAgICAgICAiTm9taW5hbCIsDQogICAgICAgICAgICAiTm9taW5hbCINCiAgICAgICAgICAgICkNCg0KdGFibGUxIDwtIGRhdGEuZnJhbWUgKHZhcmlhYmxlcywgdGlwb3MsIGVzY2FsYXMpDQprbml0cjo6a2FibGUodGFibGUxKQ0KDQpgYGANCg0KYGBge3J9DQojTGFzIGVzY2FsYXMgZGUgbWVkaWNpw7NuIHBlcm1pdGVuIG9yZ2FuaXphciBkYXRvcyBlbiBvcmRlbiBqZXLDoXJxdWljby4gw4lzdGFzIHB1ZWRlbiBzZXIgY2xhc2lmaWNhZGFzIGRlIGFjdWVyZG8gYSB1bmEgZGVncmFkYWNpw7NuIGRlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGRpc3RpbnRhcyB2YXJpYWJsZXMuIEVudHJlIGxhcyB2YXJpYWJsZXMgdXNhZGFzIGVzdMOhbiBub21pbmFsIChhcXVlbGxhcyBxdWUgc29uIG11dHVhbWVudGUgZXhjbHV5ZW50ZXMgeSBubyBhc2lnbmFuIHVuIG9yZGVuIG8gamVyYXJxdcOtYSksIG9yZGluYWwgKGVzdGFibGVjZW4gdW4gb3JkZW4sIHB1ZWRlIHNlciBjcmVjaWVudGUgbyBkZWNyZWNpZW50ZSksIGludGVydmFsbyAoZXN0YWJsZWNlbiB1biBvcmRlbiBkZXRlcm1pbmFkbyBwb3IgdW4gaW50ZXJ2YWxvIG51bcOpcmljbykgeSByYXrDs24gKGV4aXN0ZSB1biBpbnRlcnZhbG8gbnVtw6lyaWNvOyBlbCBjZXJvIHJlcHJlc2VudGEgbGEgYXVzZW5jaWEgZGUgdmFsb3I7IGVzIHVuIGNlcm8gYWJzb2x1dG8pLg0KYGBgDQoNCiMjIDQuIExpbXBpZXphIGRlIGRhdG9zDQoNClJlbW92ZXIgdmFsb3JlcyBpcnJlbGV2YW50ZXMgKGVsaW1pbmFyIHJlbmdsb25lcyBkdXBsaWNhZG9zKSB5IGNvbnZlcnNpw7NuIGRlIGRhdG9zIHNvbiB0w6ljbmljYXMgZWxlZ2lkYXMgcGFyYSByZWFsaXphciBsYSBsaW1waWV6YSBkZSBkYXRvcyBkZWJpZG8gYSBsYXMgbmVjZXNpZGFkZXMgZGUgbGEgYmFzZSBkZSBkYXRvcyB5IGVsIGJlbmVmaWNpbyBxdWUgZ2VuZXLDsyBwYXJhIGVsIGFuw6FsaXNpcyBkZXNjcmlwdGl2bywgb2J0ZW5pZW5kbyBpbmZvcm1hY2nDs24gbcOhcyBjbGFyYSB5IGNvbmNpc2EuDQoNCmBgYHtyfQ0KDQojIyMgRWxpbWluYXIgcmVuZ2xvbmVzIGR1cGxpY2Fkb3MNCmRmMjwtZGYxDQpkZjI8LWRpc3RpbmN0KGRmMikNCg0KIyMjIMK/Q3XDoW50b3MgTkEncyB0ZW5nbyBlbiBsYSBiYXNlIGRlIGRhdG9zPyBQcmltZXJhIGxpbXBpZXphDQpzdW0oaXMubmEoZGYyKSkNCg0KIyMjIEVsaW1pbmFyIGNvbHVtbmFzDQpkZjM8LWRmMg0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKFgpKQ0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKFguMSkpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoTk9NQlJFKSkNCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChBUEVMTElET1MpKQ0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKFJGQykpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoQ1VBUlRPLk1FUykpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoRkFDVE9SLkNSRUQuSU5GT05BVklUKSkNCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChDVVJQKSkNCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChDQUxMRSkpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoTlVNRVJPLklOVEVSTk8pKQ0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKFRBUkpFVEEuQ1VFTlRBKSkNCg0KIyMjIMK/Q3XDoW50b3MgTkEncyB0ZW5nbyBlbiBsYSBiYXNlIGRlIGRhdG9zPyBTZWd1bmRhIGxpbXBpZXphDQpzdW0oaXMubmEoZGYzKSkNCg0KYGBgDQoNCg0KDQojIyA1LiBBbsOhbGlzaXMgRXhwbG9yYXRvcmlvIGRlIGxhcyBCYXNlcyBkZSBEYXRvcw0KYGBge3J9DQoNCmRlc2NyaWJlKGRmMykNCg0KY291bnQoZGYzLCBHRU5FUk8sIHNvcnQgPSBUUlVFKQ0KY291bnQoZGYzLCBQVUVTVE8sIHNvcnQgPSBUUlVFKQ0KY291bnQoZGYzLCBERVBBUlRBTUVOVE8sIHNvcnQgPSBUUlVFKQ0KY291bnQoZGYzLCBTQUxBUklPLkRJQVJJTy5JTVNTLCBzb3J0ID0gVFJVRSkNCmNvdW50KGRmMywgTFVHQVIuREUuTkFDSU1JRU5UTywgc29ydCA9IFRSVUUpDQoNCnRpYmJsZShkZjMpDQpgYGANCg0KRW4gZXN0YSBwcmltZXJhIHBhcnRlIGRlbCBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlc2NyaXB0aXZvLCB2ZW1vcyBxdWUgZWwgY29udGVvIHRvdGFsIGRlIGVtcGxlYWRvcyBhY3R1YWxlcyBlcyBkZSAxMTMgeSBoYXkgdW4gbWF5b3IgbsO6bWVybyBkZSBtdWplcmVzICg1NCUpIGNvbnRyYSBlbXBsZWFkb3MgcXVlIHNvbiBob21icmVzICg0NiUpLg0KDQpFbiBjdWFudG8gYSBsb3MgcHVlc3RvcywgdmVtb3MgcXVlIGV4aXN0ZSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBheXVkYW50ZXMgZ2VuZXJhbGVzLCBwdWVzIGVzIGVsIHB1ZXN0byBxdWUgb2N1cGEgbWF5b3IgY2FwaXRhbCBodW1hbm8sIGNvbnRyYSBhcXVlbGxvcyBxdWUgb2N1cGFuIG1lbm9zIHF1ZSB2YW4gZGVzZGUgc2VydmljaW8gYWwgY2xpZW50ZSBoYXN0YSBvcGVyYWRvcmVzLg0KDQpFbnRyZSBsb3MgZGVwYXJ0YW1lbnRvcyBjb24gbWF5b3IgY2FudGlkYWQgZGUgZW1wbGVhZG9zLCB2ZW1vcyBxdWUgZXN0w6EgdmFyaW9zIHkgcHJvZHVjY2nDs24gcmV0b3JuLiBFbCBkZXBhcnRhbWVudG8gZGUgIlZhcmlvcyIgZnVlIGNyZWFkbyBwYXJhIGNhdGFsb2dhciBhIGFxdWVsbG9zIGVtcGxlYWRvcyBxdWUgZW4gbGEgYmFzZSBkZSBkYXRvcyBubyB0ZW7DrWFuIGRlZmluaWRhIHVuIMOhcmVhIGVuIGNvbmNyZXRvLg0KDQpWZW1vcyBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIGVtcGxlYWRvcyBnYW5hbiAkMTgwLjY4IHBlc29zIGRlIHNhbGFyaW8gZGlhcmlvIHBvciBlbCBJTVNTIHkgZGUgdG9kb3MgbG9zIGVtcGxlYWRvcywgc2UgY2FsY3VsYSBxdWUgdGllbmVuIHVuIHByb21lZGlvIGRlIHNhbGFyaW8gZGlhcmlvIGRlICQyMzYuNjIgcGVzb3MuDQoNCkVuIGN1YW50byBhbCBsdWdhciBkZSBvcmlnZW4sIHZlbW9zIHF1ZSBsYSBtYXlvcsOtYSBkZSBsb3MgZW1wbGVhZG9zIHByb3ZpZW5lbiBkZWwgRXN0YWRvIGRlIE51ZXZvIExlw7NuICg3MCUpIHkgVmVyYWNydXogKDExJSksIHZpZW5kbyBxdWUgZWwgMTklIHJlc3RhbnRlIGRlIGxvcyBlbXBsZWFkb3Mgc29uIHByb3ZlbmllbnRlcyBkZSBab25hIENlbnRybyBvIGVzdGFkb3MgY29saWRhbnRlcyBkZSBOdWV2byBMZcOzbi4NCg0KDQoNCiMjIDUuMSBUYWJsYSBkZSBmcmVjdWVuY2lhICgxKQ0KDQpMYXMgdGFibGFzIGRlIGZyZWN1ZW5jaWEgc29uIHVuYSBvcmRlbmFjacOzbiBlbiBmb3JtYSBkZSB0YWJsYSBkZSBsb3MgZGF0b3MgZXN0YWTDrXN0aWNvcywgYXNpZ25hbmRvIGEgY2FkYSBkYXRvIHN1IGZyZWN1ZW5jaWEgY29ycmVzcG9uZGllbnRlLCBlcyBkZWNpciwgZWwgbsO6bWVybyBkZSB2ZWNlcyBxdWUgYXBhcmVjZSB1biBkZXRlcm1pbmFkbyB2YWxvciBlbiB1biBlc3R1ZGlvIGVzdGFkw61zdGljby4NCg0KYGBge3J9DQoNCiMjIyBUYWJsYSBkZSBmcmVjdWVuY2lhOiBTYWxhcmlvIGRpYXJpbyBkZSBhY3VlcmRvIGFsIGfDqW5lcm8NCnByb3BvcnRpb24gPC0gcHJvcC50YWJsZSh0YWJsZShkZjMkR0VORVJPLGRmMyRTQUxBUklPLkRJQVJJTy5JTVNTKSkNCnByb3BvcnRpb24gJT4lDQogIGtibCgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKCkNCmBgYA0KDQpFc3RhIHRhYmxhIGRlIGZyZWN1ZW5jaWEgcmVwcmVzZW50YSBlbCB2YWxvciBkZWNpbWFsIGRlbCBzYWxhcmlvIGRpYXJpbyBkZSBhY3VlcmRvIGFsIGfDqW5lcm8sIGVzIGRlY2lyLCBsYSBjYW50aWRhZCBkZSBlbXBsZWFkb3MgZW4gdmFsb3IgZGVjaW1hbCBxdWUgcmVjaWJlbiBjaWVydG8gc2FsYXJpbyBkaWFyaW8gZGUgYWN1ZXJkbyBhIHN1IGfDqW5lcm8uDQoNCg0KIyMjIEJBU0UgREUgREFUT1M6IEJBSkFTIERFIFJFQ1VSU09TIEhVTUFOT1MNCg0KX19BIHBhcnRpciBkZSBsYSBzaWd1aWVudGUgYmFzZSBkZSBkYXRvcywgc2UgYW5hbGl6YXLDoSBlc3BlY8OtZmljYW1lbnRlIGxhIGluZm9ybWFjacOzbiBkZSBhcXVlbGxhcyBwZXJzb25hcyBxdWUgc2UgZGllcm9uIGRlIGJhamEgZW4gYcOxb3MgYW50ZXJpb3JlcyBjb24gZWwgb2JqZXRpdm8gZGUgZW50ZW5kZXIgbGFzIHByaW5jaXBhbGVzIHJhem9uZXMgZGUgbGEgYWx0YSByb3RhY2nDs24gZW4gbGEgZW1wcmVzYS5fXw0KDQoNCmBgYHtyfQ0KDQojIyMgSW1wb3J0YXIgYmFzZSBkZSBkYXRvcw0KZGY0IDwtcmVhZC5jc3YoZmlsZS5jaG9vc2UoKSkNCnN1bW1hcnkoZGY0KQ0KDQojIyMgwr9DdcOhbnRvcyBOQSdzIHRlbmdvIGVuIGxhIGJhc2UgZGUgZGF0b3M/DQpzdW0oaXMubmEoZGY0KSkNCg0KIyMjIEJvcnJhciB0b2RvcyBsb3MgcmVnaXN0cm9zIE5BJ3MgZGUgdW5hIHRhYmxhDQpkZjU8LWRmNA0KZGY1PC1uYS5vbWl0KGRmNSkNCnN1bW1hcnkoZGY1KQ0KDQojIyMgRWxpbWluYXIgY29sdW1uYXMNCmRmMzwtZGYyDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoQVBFTExJRE9TKSkNCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChOT01CUkUpKQ0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKEZBQ1RPUi5DUkVELklORk9OQVZJVCkpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoQ1VSUCkpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoQ0FMTEUpKQ0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKE5VTUVSTy5JTlRFUk5PKSkNCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChUQVJKRVRBLkNVRU5UQSkpDQoNCg0KIyMjIMK/Q3XDoW50b3MgTkEncyB0ZW5nbyBlbiBsYSBiYXNlIGRlIGRhdG9zPw0Kc3VtKGlzLm5hKGRmNSkpDQoNCiMgQ29uIGxvcyBkYXRvcyBwcmVzZW50YWRvcyBhbnRlcmlvcm1lbnRlLCB2ZW1vcyBxdWUgbGEgZWRhZCBwcm9tZWRpbyBkZSBsb3MgY29sYWJvcmFkb3JlcyBlcyBkZSAzNSBhw7FvcywgYWRlbcOhcyBkZSBxdWUgZ2FuYW4gdW4gcHJvbWVkaW8gZGUgJDE4MCBwZXNvcy4NCg0KYGBgDQoNCiMjIDUuMi4xIFRhYmxhIGNydXphZGEgKDEpDQpgYGB7cn0NCg0KdGFibGUoZGY1JFBVRVNUTywgZGY1JE1PVElWTy5ERS5CQUpBKQ0KYGBgDQoNCkVuIGxhIHRhYmxhIHZlbW9zIHF1ZSBzZSBkZXN0YWNhbiB0cmVzIHJhem9uZXMgcHJpbmNpcGFsZXMgZGUgYmFqYXMgZGUgZW1wbGVhZG9zLCBsYXMgY3VhbGVzIHNvbjogYmFqYXMgcG9yIGZhbHRhcywgcmVudW5jaWEgdm9sdW50YXJpYSBvIHTDqXJtaW5vIGRlIGNvbnRyYXRvLiBFbiBzdSBtYXlvcsOtYSwgaHVibyB1bmEgYmFqYSBwb3IgZmFsdGFzIGRlbCBwdWVzdG8gZGUgYXl1ZGFudGUgZ2VuZXJhbCB5IHJlbnVuY2lhIHZvbHVudGFyaWEgcGFyYSBlbCBtaXNtbyBwdWVzdG8uIEFsIGlndWFsIHF1ZSBlbiBsYSBiYXNlIGRlIGRhdG9zIGFudGVyaW9yLCB2ZW1vcyBxdWUgZWwgcHVlc3RvIGNvbiBtYXlvciByb3RhY2nDs24gYSBuaXZlbCBoaXN0w7NyaWNvIGVzIGRlIGF5dWRhbnRlIGdlbmVyYWwuIEVzdG8gc3VnaWVyZSBxdWUgZXhpc3RlIHVuIGFsdG8gbsO6bWVybyBkZSBjb250cmF0YWNpb25lcyBwYXJhIGVsIHB1ZXN0byBkZWJpZG8gYSB1bmEgbWFsYSBnZXN0acOzbiBhZG1pbmlzdHJhdGl2YSBvIGJham8gcmVuZGltaWVudG8gZGUgbG9zIGVtcGxlYWRvcy4NCg0KIyMgNS4yLjIgVGFibGEgY3J1emFkYSAoMikNCmBgYHtyfQ0KDQp0YWJsZShkZjUkR0VORVJPLCBkZjUkTU9USVZPLkRFLkJBSkEpDQpgYGANCg0KTGEgdGFibGEgY3J1emFkYSBhbnRlcmlvciBub3MgbXVlc3RyYSBsYSByZWxhY2nDs24gZW50cmUgbG9zIG1vdGl2b3MgZGUgYmFqYSBjb250cmEgZWwgZ8OpbmVybywgZXMgZGVjaXIsIGxhcyBwcmluY2lwYWxlcyByYXpvbmVzIGRlIGJhamEgZGUgYWN1ZXJkbyBhbCBnw6luZXJvIGRlIGNhZGEgZW1wbGVhZG8uIFZlbW9zIHF1ZSBodWJvIHVuIHRvdGFsIGRlIDUzIGJhamFzIGRlbCBnw6luZXJvIGZlbWVuaW5vLCBkZXN0YWNhbmRvIGxhcyBiYWphcyBwb3IgZmFsdGFzIChyZXByZXNlbnRhIHVuIDc1JSBkZSBsYXMgYmFqYXMgZmVtZW5pbmFzKS4gUGFyYSBlbCBnw6luZXJvIG1hc2N1bGlubywgaHVibyB1biB0b3RhbCBkZSAyNSBmYWx0YXMsIGRlc3RhY2FuZG8gcHJpbmNpcGFsbWVudGUgbGFzIGJhamFzIHBvciBmYWx0YXMgKHJlcHJlc2VudGEgdW4gNjAlIGRlIGxhcyBiYWphcyBtYXNjdWxpbmFzKS4NCg0KIyMgNS4zIEdyw6FmaWNvcyBkZSBkYXRvcyBjdWFudGl0YXRpdm9zIHkgY3VhbGl0YXRpdm9zICgyKQ0KYGBge3J9DQoNCiMjIDUuMy4xIFBpZSBjaGFydA0KDQojIyMgUGllIGNoYXJ0OiBSZXByZXNlbnRhY2nDs24gZGUgYmFqYXMgYWNvcmRlIGFsIGVzdGFkbyBkZSByZXNpZGVuY2lhDQpwaWUodGFibGUoZGY1JEVTVEFETyksIGNvbD1jKCJvcmFuZ2UiLCJjb3JhbDEiKSwNCiAgICBtYWluPSJSZXByZXNlbnRhY2nDs24gZGUgYmFqYXMgYWNvcmRlIGFsIGVzdGFkbyBkZSByZXNpZGVuY2lhIikNCmBgYA0KDQpMYSBncsOhZmljYSBhbnRlcmlvciBub3MgbXVlc3RyYSBxdWUgaGF5IHVuIG1heW9yIG7Dum1lcm8gZGUgZXgtZW1wbGVhZG9zIHF1ZSB2aXZlbiBlbiBlbCBFc3RhZG8gZGUgTnVldm8gTGXDs24uIFNpbiBlbWJhcmdvLCBoYXkgdW4gcG9yY2VudGFqZSBxdWUgcmVzaWRlIGVuIENvYWh1aWxhLiBFc3RvIHNlIHB1ZWRlIGludGVycHJldGFyIGNvbiBxdWUgaGF5IHVuIGFsdG8gbml2ZWwgZGUgcm90YWNpw7NuIGV4aXN0ZW50ZSBkZWJpZG8gYSBsYSBsZWphbsOtYSBkZSByZXNpZGVuY2lhIGRlIGxvcyBlbXBsZWFkb3MuDQoNCg0KIyMjIFBpZSBjaGFydDogUmVwcmVzZW50YWNpw7NuIGRlIGJhamFzIGFjb3JkZSBhbCBnw6luZXJvDQpgYGB7cn0NCg0KcGllKHRhYmxlKGRmNSRHRU5FUk8pLCBjb2w9Yygib3JhbmdlIiwiY29yYWwxIiksDQogICAgbWFpbj0iUmVwcmVzZW50YWNpw7NuIGRlIGJhamFzIGFjb3JkZSBhbCBnw6luZXJvIikNCg0KYGBgDQoNCkxhIGFudGVyaW9yIGdyw6FmaWNhIGRlIHBhc3RlbCByZWFmaXJtYSBsbyBxdWUgbWVuY2lvbmFtb3MgYW50ZXJpb3JtZW50ZS4gRGUgYWN1ZXJkbyBhIGxhcyBiYWphcyByZWFsaXphZGFzLCBsYSBtYXlvcsOtYSBkZSBsb3MgZXgtZW1wbGVhZG9zIHNvbiBkZWwgZ8OpbmVybyBmZW1lbmluby4NCg0KDQojIyA1LjQgR3LDoWZpY29zIGRlIGRpc3BlcnNpw7NuICgyKQ0KYGBge3J9DQoNCiMjIyBHcsOhZmljYSBkZSBkaXNwZXJzacOzbjogTsO6bWVybyBkZSBiYWphcyBWUy4gRMOtYXMgdHJhYmFqYWRvcw0KcGxvdCh4PSBkZjUkTk8uREUuQkFKQVMsDQogICAgIHk9ZGY1JERJQVMuVFJBQkFKQURPUykNCg0KYGBgDQoNCkxhIGdyw6FmaWNhIGRlIGRpc3BlcnNpw7NuIG5vcyBtdWVzdHJhIGxhIGludGVuc2lkYWQgZGUgcmVsYWNpw7NuIGVudHJlIGxhIHZhcmlhYmxlIGRlIGTDrWFzIHRyYWJhamFkb3MgeSBuw7ptZXJvIGRlIGJhamFzLiBFc3RvIG5vcyBkaWNlIHF1ZSBodWJvIHVuIGFsdG8gbsO6bWVybyBkZSBiYWphcyBkZSBlbXBsZWFkb3MgcXVlIHRyYWJhamFyb24gbWVub3MgZGUgMjAwIGTDrWFzLCBlcyBkZWNpciwgbGEgbWF5b3LDrWEgZGUgbG9zIGV4LWVtcGxlYWRvcyBlc3R1dmllcm9uIGVuIEZPUk0gbWVub3MgZGUgMSBhw7FvLg0KDQpgYGB7cn0NCiMjIyBCb3hwbG90OiBDb3JyZWxhY2nDs24gZW4gYmFqYXMgYWNvcmRlIGEgdmFyaWFibGVzIGRlIGfDqW5lcm8geSBlZGFkDQpnZ3Bsb3QoZGY1LCBhZXMoR0VORVJPLFNBTEFSSU8uRElBUklPLklNU1MsZmlsbD1HRU5FUk8pKSArDQpnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArIGdndGl0bGUoIlNhbGFyaW8gZGlhcmlvIHBvciBnw6luZXJvIikNCmBgYA0KDQpMYSBncsOhZmljYSBhbnRlcmlvciBub3MgbXVlc3RyYSBsYSBjb3JyZWxhY2nDs24gZW50cmUgZWwgZ8OpbmVybyB5IGVsIHNhbGFyaW8gZGlhcmlvIGRlIGxvcyBlbXBsZWFkb3MuIEVuIGVzdGUsIGVudGVuZGVtb3MgcXVlIGVsIGfDqW5lcm8gZmVtZW5pbm8gdGllbmUgdW4gc2FsYXJpbyBkaWFyaW8gdG90YWwgbcOhcyBhbHRvIHF1ZSBsb3MgZGUgZ8OpbmVybyBtYXNjdWxpbm8uDQoNCiMjIDYuIFJlZmVyZW5jaWFzDQogIEFuYSBLYXJlbiBHYXJjw61hLiAoMjAyMiwgU2VwdGVtYmVyIDgpLiBJbmR1c3RyaWEgYXV0b21vdHJpeiBhbm90YSB1biBidWVuIGFnb3N0bzogY3JlY2VuIHByb2R1Y2Npw7NuLCBleHBvcnRhY2lvbmVzIHkgdmVudGFzIGludGVybmFzLiBFbCBFY29ub21pc3RhOyBFbCBFY29ub21pc3RhLiBodHRwczovL3d3dy5lbGVjb25vbWlzdGEuY29tLm14L2VtcHJlc2FzL0luZHVzdHJpYS1hdXRvbW90cml6LWFub3RhLXVuLWJ1ZW4tYWdvc3RvLWNyZWNlbi1wcm9kdWNjaW9uLWV4cG9ydGFjaW9uZXMteS12ZW50YXMtaW50ZXJuYXMtMjAyMjA5MDctMDAzMS5odG1sDQogIA0KICBIZXJuw6FuZGV6LCBGLiwgJiBVc3VnYSwgTy4gKDIwMjIpLiA5IFRhYmxhcyBkZSBmcmVjdWVuY2lhIHwgTWFudWFsIGRlIFIuIFJldHJpZXZlZCAyNCBTZXB0ZW1iZXIgMjAyMiwgZnJvbSBodHRwczovL2ZoZXJuYW5iLmdpdGh1Yi5pby9NYW51YWwtZGUtUi90YWJsYXMuaHRtbCNlamVtcGxvLXRhYmxhLWRlLWZyZWN1ZW5jaWEtcmVsYXRpdmEtZGUtdW5hLXYlQzMlQURhDQoNCiAgOSBFc3RpbG9zIHkgZm9ybWF0b3MgZGUgdGFibGEgfCBUYWJsYXMgeSBncmFmaWNvcyBjb24gUiB5IFIgU3R1ZGlvLiAoMjAyMikuIFJldHJpZXZlZCAyNCBTZXB0ZW1iZXIgMjAyMiwgZnJvbSBodHRwczovL3RhYmxlcy5pbnZlc3RpZ2FvbmxpbmUuY29tL3RzZS1mb3JtYXRlby5odG1sDQo=