Importar Paquetes

library(plyr)
library(tidyverse)
library(knitr)
library(foreign)
library(dplyr)        # data manipulation 
library(forcats)      # to work with categorical variables
library(ggplot2)      # data visualization 
library(janitor)      # data exploration and cleaning 
#install.packages("Hmisc")
library(Hmisc)        # several useful functions for data analysis 
#install.packages("psych")
library(psych)        # functions for multivariate analysis 
#install.packages("naniar")
library(naniar)       # summaries and visualization of missing values NAs
#install.packages("dlookr")
library(dlookr)  # summaries and visualization of missing values NAs
#install.packages("corrplot")
library(corrplot)     # correlation plots
#install.packages("jtools")
library(jtools)       # presentation of regression analysis 
#install.packages("lmtest")
library(lmtest)       # diagnostic checks - linear regression analysis 
#install.packages("car")
library(car)          # diagnostic checks - linear regression analysis
#install.packages("olsrr")
library(olsrr)        # diagnostic checks - linear regression analysis 
#install.packages("kableExtra")
library(kableExtra)   # HTML table attributes

#file.choose()
merma<- read.csv("/Users/emilioolvera/Downloads/FORM - Merma.csv")
scrap<- read.csv("/Users/emilioolvera/Downloads/Scrap.csv")
produccion<- read.csv("/Users/emilioolvera/Downloads/EMI_CARTON.csv")
performance <- read.csv("/Users/emilioolvera/Desktop/Portafolio del modulo/FORM - Delivery Performance.csv")
d_plan <- read.csv("/Users/emilioolvera/Downloads/Delivery Plan FINAL - EQUIPO 4 .csv")
bajas <- read.csv("/Users/emilioolvera/Downloads/FORM - Recursos Humanos - bajas.csv")
colaboradores <- read.csv("/Users/emilioolvera/Downloads/FORM - Recursos Humanos - colaboradores.csv")

Cambiar nombres de variables

Delivery Performance

performance<-clean_names(performance)
colnames(performance)
## [1] "target"         "cliente"        "vueltas"        "plan_arrival"  
## [5] "real_arrival"   "real_departure" "diference"      "date"

Delivery Plan

d_plan<-clean_names(d_plan)
d_plan<-d_plan %>% dplyr::rename(cliente=cliente_planta,
                                 jun_21=junio,
                                 jul_21=julio,
                                 ago_21=agosto,
                                 sep_21=septiembre,
                                 oct_21=octubre,
                                 nov_21=noviembre,
                                 dic_21=diciembre,
                                 oct_22=octubre_22)
colnames(d_plan)
##  [1] "cliente"     "proyecto"    "id_odoo"     "item"        "jun_21"     
##  [6] "jul_21"      "ago_21"      "sep_21"      "oct_21"      "nov_21"     
## [11] "dic_21"      "ene_22"      "feb_22"      "mar_22"      "abr_22"     
## [16] "may_22"      "jun_22"      "jul_22"      "ago_22"      "sep_22"     
## [21] "oct_22"      "nov_22"      "dic_22"      "ene_23"      "feb_23"     
## [26] "mar_23"      "total_meses"

Variables y Registros por base de datos

La base de datos Merma tiene 3 variables y 60 registros.

describe(merma)
## # A tibble: 0 × 9
## # … with 9 variables: described_variables <chr>, n <int>, na <int>, mean <dbl>,
## #   sd <dbl>, se_mean <dbl>, IQR <dbl>, skewness <dbl>, kurtosis <dbl>
dim(merma)
## [1] 60  3

La base de datos Scrap tiene 8 variables y 251 registros.

describe(scrap)
## # A tibble: 1 × 26
##   described_…¹     n    na  mean    sd se_mean   IQR skewn…² kurto…³   p00   p01
##   <chr>        <int> <int> <dbl> <dbl>   <dbl> <dbl>   <dbl>   <dbl> <dbl> <dbl>
## 1 Cantidad       251     0  13.3  106.    6.68     6    15.6    245.     0     1
## # … with 15 more variables: 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
dim(scrap)
## [1] 251   8

La base de datos Producción de Carton tiene 17 variables y 2469 registros.

describe(produccion)
## # A tibble: 2 × 26
##   describe…¹     n    na   mean     sd se_mean   IQR skewn…² kurto…³   p00   p01
##   <chr>      <int> <int>  <dbl>  <dbl>   <dbl> <dbl>   <dbl>   <dbl> <dbl> <dbl>
## 1 Laminas.p…  3988     0 102.   134.     2.13    184    2.71    13.1     0     0
## 2 TIEMPO.MA…   497  3491   3.19   7.57   0.340     1    3.71    17.4     0     0
## # … with 15 more variables: 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
dim(produccion)
## [1] 3988   15

La base de datos Delivery Performance tiene 5 variables y 325 registros.

describe(performance)
## # A tibble: 6 × 26
##   described_…¹     n    na  mean    sd se_mean   IQR skewn…² kurto…³   p00   p01
##   <chr>        <int> <int> <dbl> <dbl>   <dbl> <dbl>   <dbl>   <dbl> <dbl> <dbl>
## 1 target        1440     0 1     0      0       0    NaN     NaN       1       1
## 2 vueltas       1440     0 1.75  0.829  0.0219  1.25   0.494  -1.37    1       1
## 3 plan_arrival  1440     0 6.62  7.50   0.198  10.8    0.614  -1.12    0       0
## 4 real_arrival  1440     0 3.82  6.51   0.171   8      1.51    0.965   0       0
## 5 real_depart…  1440     0 4.14  6.95   0.183   9      1.44    0.706   0       0
## 6 diference     1440     0 0.316 0.922  0.0243  0.8    2.73  211.    -14.4     0
## # … with 15 more variables: 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
dim(performance)
## [1] 1440    8

La base de datos Delivery Plan tiene 27 variables y 231 registros.

describe(d_plan)
## # A tibble: 23 × 26
##    described…¹     n    na  mean    sd se_mean   IQR skewn…² kurto…³   p00   p01
##    <chr>       <int> <int> <dbl> <dbl>   <dbl> <dbl>   <dbl>   <dbl> <dbl> <dbl>
##  1 jun_21        231     0  29.1  123.    8.07   0      6.77    55.9     0     0
##  2 jul_21        231     0 136.   929.   61.1    0     12.4    169.      0     0
##  3 ago_21        231     0  77.4  340.   22.3    0      7.11    56.9     0     0
##  4 sep_21        231     0  81    316.   20.8    0      6.68    53.9     0     0
##  5 oct_21        231     0  62    274.   18.0   11.5    8.59    86.5     0     0
##  6 nov_21        231     0  89.7  465.   30.6    4     11.4    149.      0     0
##  7 dic_21        231     0 100.   516.   34.0    1.5    9.27   102.      0     0
##  8 ene_22        231     0  82.4  319.   21.0   26.5    6.76    53.4     0     0
##  9 feb_22        231     0 104.   684.   45.0    0     12.2    164.      0     0
## 10 mar_22        231     0 154.   768.   50.6   20      9.39   104.      0     0
## # … with 13 more rows, 15 more variables: 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
dim(d_plan)
## [1] 231  27

La base de datos Bajas tiene 10 variables y 238 registros.

describe(bajas)
## # A tibble: 4 × 26
##   descri…¹     n    na    mean     sd se_mean   IQR skewn…² kurto…³   p00    p01
##   <chr>    <int> <int>   <dbl>  <dbl>   <dbl> <dbl>   <dbl>   <dbl> <dbl>  <dbl>
## 1 no_empl…   238     0 120.    68.8    4.46    118.   0      -1.2      1    3.37
## 2 edad       238     0  31.1    9.57   0.620    14    0.811  -0.150   19   19   
## 3 antigüe…   238     0   0.605  0.819  0.0531    1    2.71   12.4      0    0   
## 4 salario…   238     0 178.    23.2    1.50      0   11.2   159.     144. 152.  
## # … with 15 more variables: 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
dim(bajas)
## [1] 238  10

La base de datos Colaboradores tiene 10 variables y 113 registros.

describe(colaboradores)
## # A tibble: 4 × 26
##   describe…¹     n    na   mean    sd se_mean   IQR skewn…² kurto…³   p00    p01
##   <chr>      <int> <int>  <dbl> <dbl>   <dbl> <dbl>   <dbl>   <dbl> <dbl>  <dbl>
## 1 no_emplea…   113     0  57    32.8    3.08  56      0      -1.2      1    2.12
## 2 edad         113     0  36.1  12.8    1.21  19      0.560  -0.537   18   19   
## 3 antigüedad   113     0   1.42  2.52   0.237  2      2.43    5.98     0    0   
## 4 salario_d…   111     2 179.   24.5    2.33   3.96   3.48   18.5    144. 144.  
## # … with 15 more variables: 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
dim(colaboradores)
## [1] 113  10

Merma

Variable<-c("Fecha","Mes","Kilos")

Tipo<-c("Qualitative (nominal)", "Qualitative (nominal)", "Quantitative (discrete)")

Escala <- c("Fecha (y/m/d)","N/A", "Kilogramos")

table<-data.frame(Variable,Tipo,Escala)
knitr::kable(table)
Variable Tipo Escala
Fecha Qualitative (nominal) Fecha (y/m/d)
Mes Qualitative (nominal) N/A
Kilos Quantitative (discrete) Kilogramos

Scrap

Variable2<-c("Referencia","Fecha","Producto","Cantidad", "Ubicación de origen")

Tipo2<-c("Qualitative (nominal)", "Qualitative (nominal)", "Qualitative (nominal)","Quantitative (discrete)", "Qualitative (nominal)")

Escala2 <- c("N/A","Fecha (y/m/d)", "N/A","Unidades","N/A")

table2<-data.frame(Variable2,Tipo2,Escala2)
knitr::kable(table2)
Variable2 Tipo2 Escala2
Referencia Qualitative (nominal) N/A
Fecha Qualitative (nominal) Fecha (y/m/d)
Producto Qualitative (nominal) N/A
Cantidad Quantitative (discrete) Unidades
Ubicación de origen Qualitative (nominal) N/A

Producción de Carton

Variable<-c("`Cliente`","`ID Form`", "`Producto`","`Piezas programadas`", "`Tiempo minutos`", "`Hora fin`", "`Estacion arranque`", "`Laminas procesadas`", "`Inicio set up`", "`Fin inicio set up`", "`Inicio de proceso`", "`Fin de proceso`", "`Tiempo calidad`")
Type<-c("Cualitativa","Cualitativa", "Cualitativa","Cuantitativa (discreta)", "Cuantitativa (discreta)", "Cuantitativa (continua)", "Cualitativa", "Cuantitativa (discreta)", "Cuantitativa (continua)", "Cuantitativa (continua)", "Cuantitativa (continua)", "Cuantitativa (continua)", "Cuantitativa (discreta)" )
Escalas<-c("Nominal", "Nominal","Nominal", "Intervalo", "Intervalo", "Intervalo", "Intervalo","Intervalo","Intervalo","Intervalo","Intervalo","Intervalo","Intervalo" ) 
table<-data.frame(Variable,Type,Escalas)
knitr::kable(table)
Variable Type Escalas
Cliente Cualitativa Nominal
ID Form Cualitativa Nominal
Producto Cualitativa Nominal
Piezas programadas Cuantitativa (discreta) Intervalo
Tiempo minutos Cuantitativa (discreta) Intervalo
Hora fin Cuantitativa (continua) Intervalo
Estacion arranque Cualitativa Intervalo
Laminas procesadas Cuantitativa (discreta) Intervalo
Inicio set up Cuantitativa (continua) Intervalo
Fin inicio set up Cuantitativa (continua) Intervalo
Inicio de proceso Cuantitativa (continua) Intervalo
Fin de proceso Cuantitativa (continua) Intervalo
Tiempo calidad Cuantitativa (discreta) Intervalo

Delivery Performance

Variable<-c("`Target`","`Cliente`","`Vueltas`","`Plan.arrival`","`Real.arrival`","`Real.departure`","`Diference`","`Date`")
Type<-c("quantiative (discrete)", "quantiative (continous)", "quantitative (continous)", "quantitative (continous)")
escalas <- c("intervalo", "nominal", "razon", "razon", "razon", "razon", "razon", "ordinal")
table <- data.frame (Variable, Type, escalas)
knitr::kable(table)
Variable Type escalas
Target quantiative (discrete) intervalo
Cliente quantiative (continous) nominal
Vueltas quantitative (continous) razon
Plan.arrival quantitative (continous) razon
Real.arrival quantiative (discrete) razon
Real.departure quantiative (continous) razon
Diference quantitative (continous) razon
Date quantitative (continous) ordinal

Delivery Plan

variable <-c("CLIENTE.PLANTA,", "PROYECTO", "ID.0D00", "ITEM", "ENE.22", "FEBRERO.22", "MARZO.22", "ABRIL.22", "MAYO.22", "JUNIO.22", "JULIO.22", "AGOSTO.22", "SEPTIEMBRE.22", "OCTUBRE.22", "NOVIEMBRE.22", "DICIEMBRE.22", "ENERO.23", "FEBRERO.23", "MARZO.23")
Measurment <-c("CUALITATIVE", "CUALITATIVE", "CUALITATIVE", "CUALITATIVE", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)")
Scale <-c("NOMINAL", "NOMINAL", "NOMINAL", "NOMINAL", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON")

clasificacion <- data.frame(variable, Measurment, Scale)
clasificacion
##           variable              Measurment   Scale
## 1  CLIENTE.PLANTA,             CUALITATIVE NOMINAL
## 2         PROYECTO             CUALITATIVE NOMINAL
## 3          ID.0D00             CUALITATIVE NOMINAL
## 4             ITEM             CUALITATIVE NOMINAL
## 5           ENE.22 CUANTITATIVE (DISCRETE)   RAZON
## 6       FEBRERO.22 CUANTITATIVE (DISCRETE)   RAZON
## 7         MARZO.22 CUANTITATIVE (DISCRETE)   RAZON
## 8         ABRIL.22 CUANTITATIVE (DISCRETE)   RAZON
## 9          MAYO.22 CUANTITATIVE (DISCRETE)   RAZON
## 10        JUNIO.22 CUANTITATIVE (DISCRETE)   RAZON
## 11        JULIO.22 CUANTITATIVE (DISCRETE)   RAZON
## 12       AGOSTO.22 CUANTITATIVE (DISCRETE)   RAZON
## 13   SEPTIEMBRE.22 CUANTITATIVE (DISCRETE)   RAZON
## 14      OCTUBRE.22 CUANTITATIVE (DISCRETE)   RAZON
## 15    NOVIEMBRE.22 CUANTITATIVE (DISCRETE)   RAZON
## 16    DICIEMBRE.22 CUANTITATIVE (DISCRETE)   RAZON
## 17        ENERO.23 CUANTITATIVE (DISCRETE)   RAZON
## 18      FEBRERO.23 CUANTITATIVE (DISCRETE)   RAZON
## 19        MARZO.23 CUANTITATIVE (DISCRETE)   RAZON

Bajas

Variable6<-c("Nombre Completo","Fecha Nacimiento", "Genero", "Fecha Alta","Motivo Renuncia","Permanencia","Fecha de Baja","Puesto","Departamento","Salario Diario IMSS","Colonia","CP","Municipio","Estado","Estado Civil")

Tipo6<-c("Cualitative (nominal)","Quantiative (discrete)", "Cualitative (nominal)", "Quantiative (discrete)","Cualitative (nominal)","Quantiative (discrete)","Quantiative (discrete)","Cualitative (nominal)","Cualitative (nominal)","Quantiative (continuous)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)")

Escala6<-c("N/A","Fecha (Y/M/D)", "N/A", "Fecha (Y/M/D)","N/A","Dias","Fecha (Y/M/D)","N/A","N/A","Pesos Mexicanos","N/A","N/A","N/A","N/A","N/A")

table6<-data.frame(Variable6,Tipo6,Escala6)
knitr::kable(table)
Variable Type escalas
Target quantiative (discrete) intervalo
Cliente quantiative (continous) nominal
Vueltas quantitative (continous) razon
Plan.arrival quantitative (continous) razon
Real.arrival quantiative (discrete) razon
Real.departure quantiative (continous) razon
Diference quantitative (continous) razon
Date quantitative (continous) ordinal

Colaboradores

Variable7<-c("Nombre Completo","Fecha Nacimiento", "Genero", "Fecha Alta","Puesto","Departamento","Salario Diario IMSS","Colonia","Municipio","Estado","CP","Estado Civil")

Tipo7<-c("Cualitative (nominal)","Quantiative (discrete)", "Cualitative (nominal)", "Quantiative (discrete)","Cualitative (nominal)","Cualitative (nominal)","Quantiative (continuous)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)")

Escala7<-c("N/A","Fecha (Y/M/D)", "N/A", "Fecha (Y/M/D)","N/A","N/A","Pesos Mexicanos","N/A","N/A","N/A","CP","N/A")

table7<-data.frame(Variable7,Tipo7,Escala7)
knitr::kable(table)
Variable Type escalas
Target quantiative (discrete) intervalo
Cliente quantiative (continous) nominal
Vueltas quantitative (continous) razon
Plan.arrival quantitative (continous) razon
Real.arrival quantiative (discrete) razon
Real.departure quantiative (continous) razon
Diference quantitative (continous) razon
Date quantitative (continous) ordinal

Paquetes

library(data.table)
library(dplyr)
library(plyr)
library(ggplot2)
library(naniar)
library(Hmisc)         
library(psych)
library(tidyverse)
library(knitr)
# install.packages("pollster")
library(pollster)
library(epiDisplay)
library(descr)
library(tidyr)
#install.packages("MASS")
library(MASS)

Merma

1: Eliminar totales

merma1<- merma[-c(5,12,19,25,31,36,42,54,59,60),]

2: Convertir caracter a entero.

merma1$Kilos <- as.integer(merma1$Kilos)
str(merma1)
## 'data.frame':    50 obs. of  3 variables:
##  $ Fecha: chr  "1/11/22" "1/11/22" "1/22/22" "1/22/22" ...
##  $ Mes  : chr  "ENERO" "ENERO" "ENERO" "ENERO" ...
##  $ Kilos: int  5080 3810 2990 2680 3650 4380 3870 3590 3410 3930 ...

3: La variable de Kilos estaba en formato de carácter y se paso a numérica.

str(merma)
## 'data.frame':    60 obs. of  3 variables:
##  $ Fecha: chr  "1/11/22" "1/11/22" "1/22/22" "1/22/22" ...
##  $ Mes  : chr  "ENERO" "ENERO" "ENERO" "ENERO" ...
##  $ Kilos: chr  "5080" "3810" "2990" "2680" ...
merma$Kilos <- as.numeric(merma$Kilos)
## Warning: NAs introduced by coercion

Análisis Exploratorio de las Bases de Datos - MERMA

Media

Las variables de fecha y el mes no puede tener media

media_kilos <- mean(merma1$Kilos)
media_kilos
## [1] 3708.52

Mediana

Las variables de fecha y el mes no puede tener mediana

mediana_kilos <- median(merma1$Kilos)
mediana_kilos
## [1] 3925

Moda

mode <- function (x) {
  ux <- unique(x)
  ux [which.max(tabulate(match(x,ux)))]
}

mode_fecha <- mode(merma1$Fecha)
mode_fecha
## [1] "2/18/22"
mode_mes <- mode(merma1$Mes)
mode_mes
## [1] "AGOSTO"
mode_kilos <- mode(merma1$Kilos)
mode_kilos
## [1] 3810

Podemos observar aqui que con esta funcion podemos ver que el mes con mayor merma fue agosto como lo indica la moda

Desviación Estándar

Las variables de fecha y el mes no puede tener desviacion estandar

varianza_kilos <- var(merma1$Kilos)
varianza_kilos 
## [1] 1048555
desviacionestandar_kilos <- sqrt(varianza_kilos)
desviacionestandar_kilos
## [1] 1023.99

Tabla

Variable<-c("Fecha", "Mes", "Kilos")
Media<-c("NA", "NA", media_kilos)
Mediana<-c("NA", "NA", mediana_kilos)
Moda<-c(mode_fecha, mode_mes, mode_kilos)
Desviacion_Estandar<-c("NA", "NA", desviacionestandar_kilos)
table<-data.frame(Variable,Media,Mediana,Moda,Desviacion_Estandar)
knitr::kable(table)
Variable Media Mediana Moda Desviacion_Estandar
Fecha NA NA 2/18/22 NA
Mes NA NA AGOSTO NA
Kilos 3708.52 3925 3810 1023.98960135026

Scrap

Eliminar renglón de Unidades totales de scrap

scrap1 <- scrap [- c(1),]

Borrar todos los registros NA de una tabla para tener una base de datos mas eficiente, se quiso hacer esto para no tomar en cuenta el dia que no hubo produccion

scrap2 <- scrap1
scrap2 <- na.omit(scrap2)    
str(scrap2)
## 'data.frame':    250 obs. of  8 variables:
##  $ Referencia          : chr  "SP/08731" "SP/08730" "SP/08729" "SP/08728" ...
##  $ Fecha               : chr  "2022-08-31 14:55:40" "2022-08-31 14:49:25" "2022-08-31 13:49:29" "2022-08-31 09:30:07" ...
##  $ Producto            : chr  "[BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado." "[N61506747 CAJA] N61506747. Kit. Caja." "[N61506729 SEPARADOR] N61506729. Kit. Separador." "[341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado." ...
##  $ Cantidad            : num  2 1 1 31 1 1 1 9 2 1 ...
##  $ Unidad.de.medida    : chr  "Unidad(es)" "Unidad(es)" "Unidad(es)" "Unidad(es)" ...
##  $ Ubicación.de.origen : chr  "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Pre-Production" ...
##  $ Ubicación.de.desecho: chr  "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" ...
##  $ Estado              : chr  "Hecho" "Hecho" "Hecho" "Hecho" ...

Análisis Exploratorio de las Bases de Datos - SCRAP

Media

Las variables de fecha y ubicación de origen no puede tener media

media_cantidad <- mean(scrap1$Cantidad)
media_cantidad
## [1] 6.696

Mediana

Las variables de fecha y ubicación de origen no puede tener mediana

mediana_cantidad <- median(scrap1$Cantidad)
mediana_cantidad
## [1] 2

Moda

mode <- function (x) {
  ux <- unique(x)
  ux [which.max(tabulate(match(x,ux)))]
}

mode_fecha1 <- mode(scrap1$Fecha)
mode_fecha1
## [1] "2022-08-31 14:55:40"
mode_cantidad <- mode(scrap1$Cantidad)
mode_cantidad
## [1] 1
mode_ubicacion <- mode(scrap1$Ubicación.de.origen)
mode_ubicacion
## [1] "SAB/Pre-Production"

Desviación Estándar

Las variables de fecha y ubicación de origen no puede tener desviacion estandar

varianza_cantidad <- var(scrap1$Cantidad)
varianza_cantidad
## [1] 140.3952
desviacionestandar_cantidad <- sqrt(varianza_cantidad)
desviacionestandar_cantidad
## [1] 11.84885

Tabla

Variable<-c("Fecha", "Cantidad", "Ubicación_de_origen")
Media<-c("NA", media_cantidad, "NA")
Mediana<-c("NA",mediana_cantidad, "NA")
Moda<-c(mode_fecha1, mode_cantidad, mode_ubicacion)
Desviacion_Estandar<-c("NA", desviacionestandar_cantidad, "NA")
table<-data.frame(Variable,Media,Mediana,Moda,Desviacion_Estandar)
knitr::kable(table)
Variable Media Mediana Moda Desviacion_Estandar
Fecha NA NA 2022-08-31 14:55:40 NA
Cantidad 6.696 2 1 11.8488465539324
Ubicación_de_origen NA NA SAB/Pre-Production NA

Delivery Performance

#file.choose()
bd2 <- read.csv("/Users/emilioolvera/Downloads/FORM - Delivery Performance BD BUENA.csv")
library(dplyr)
library(janitor)
performance <- clean_names(bd2)
summary(performance)
##     fecha              printel           mahle             magna   
##  Length:324         Min.   :0.0000   Min.   :-11.650   Min.   :0   
##  Class :character   1st Qu.:0.0000   1st Qu.:  1.800   1st Qu.:0   
##  Mode  :character   Median :0.0000   Median :  3.000   Median :0   
##                     Mean   :0.4418   Mean   :  2.364   Mean   :0   
##                     3rd Qu.:1.0000   3rd Qu.:  3.150   3rd Qu.:0   
##                     Max.   :4.4000   Max.   : 20.000   Max.   :0   
##                     NA's   :25       NA's   :25        NA's   :25  
##      varroc      x             x_1            x_2            x_3         
##  Min.   :0    Mode:logical   Mode:logical   Mode:logical   Mode:logical  
##  1st Qu.:0    NA's:324       NA's:324       NA's:324       NA's:324      
##  Median :0                                                               
##  Mean   :0                                                               
##  3rd Qu.:0                                                               
##  Max.   :0                                                               
##  NA's   :25

Técnica 1.Borrar columnas.

performance <- subset(performance, select = -c(x, x_1, x_2, x_3))
summary(performance)
##     fecha              printel           mahle             magna   
##  Length:324         Min.   :0.0000   Min.   :-11.650   Min.   :0   
##  Class :character   1st Qu.:0.0000   1st Qu.:  1.800   1st Qu.:0   
##  Mode  :character   Median :0.0000   Median :  3.000   Median :0   
##                     Mean   :0.4418   Mean   :  2.364   Mean   :0   
##                     3rd Qu.:1.0000   3rd Qu.:  3.150   3rd Qu.:0   
##                     Max.   :4.4000   Max.   : 20.000   Max.   :0   
##                     NA's   :25       NA's   :25        NA's   :25  
##      varroc  
##  Min.   :0   
##  1st Qu.:0   
##  Median :0   
##  Mean   :0   
##  3rd Qu.:0   
##  Max.   :0   
##  NA's   :25

Técnica 2.Convertir de caracter a fecha

performance$fecha <- as.Date(performance$fecha, format = "%d/%m/%Y")
tibble(performance)
## # A tibble: 324 × 5
##    fecha      printel mahle magna varroc
##    <date>       <dbl> <dbl> <dbl>  <dbl>
##  1 2021-07-22     0    2.65     0      0
##  2 2021-07-25     1.8  2.85     0      0
##  3 2021-07-26     1.1  2.5      0      0
##  4 2021-07-27     0.5  2.5      0      0
##  5 2021-07-28     0.5  2.55     0      0
##  6 2021-07-29     1    2.65     0      0
##  7 2021-08-01     1    2.51     0      0
##  8 2021-08-02     1    3        0      0
##  9 2021-08-03     0    3        0      0
## 10 2021-08-04     1.2  3.05     0      0
## # … with 314 more rows

Técnica 3.Convertir de caracter a entero

performance$printel <- substr(performance$printel, start = 1, stop = 2)
tibble(performance)
## # A tibble: 324 × 5
##    fecha      printel mahle magna varroc
##    <date>     <chr>   <dbl> <dbl>  <dbl>
##  1 2021-07-22 0        2.65     0      0
##  2 2021-07-25 1.       2.85     0      0
##  3 2021-07-26 1.       2.5      0      0
##  4 2021-07-27 0.       2.5      0      0
##  5 2021-07-28 0.       2.55     0      0
##  6 2021-07-29 1        2.65     0      0
##  7 2021-08-01 1        2.51     0      0
##  8 2021-08-02 1        3        0      0
##  9 2021-08-03 0        3        0      0
## 10 2021-08-04 1.       3.05     0      0
## # … with 314 more rows
performance$printel <- as.numeric(performance$printel)
str(performance)
## 'data.frame':    324 obs. of  5 variables:
##  $ fecha  : Date, format: "2021-07-22" "2021-07-25" ...
##  $ printel: num  0 1 1 0 0 1 1 1 0 1 ...
##  $ mahle  : num  2.65 2.85 2.5 2.5 2.55 2.65 2.51 3 3 3.05 ...
##  $ magna  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ varroc : num  0 0 0 0 0 0 0 0 0 0 ...
performance$mahle <- substr(performance$mahle, start = 1, stop = 2)
performance$mahle <- as.numeric(performance$mahle)

performance$magna <- substr(performance$magna, start = 1, stop = 2)
performance$magna <- as.numeric(performance$magna)
str(performance)
## 'data.frame':    324 obs. of  5 variables:
##  $ fecha  : Date, format: "2021-07-22" "2021-07-25" ...
##  $ printel: num  0 1 1 0 0 1 1 1 0 1 ...
##  $ mahle  : num  2 2 2 2 2 2 2 3 3 3 ...
##  $ magna  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ varroc : num  0 0 0 0 0 0 0 0 0 0 ...
performance$varroc <- substr(performance$varroc, start = 1, stop = 2)
performance$varroc <- as.numeric(performance$varroc)
str(performance)
## 'data.frame':    324 obs. of  5 variables:
##  $ fecha  : Date, format: "2021-07-22" "2021-07-25" ...
##  $ printel: num  0 1 1 0 0 1 1 1 0 1 ...
##  $ mahle  : num  2 2 2 2 2 2 2 3 3 3 ...
##  $ magna  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ varroc : num  0 0 0 0 0 0 0 0 0 0 ...

Técnica 4.Reemplazar NAs con la mediana de cada variable

sapply(performance, function(x) sum(is.na(x)))
##   fecha printel   mahle   magna  varroc 
##      25      25      25      25      25
performance$fecha[is.na(performance$fecha)]<-median(performance$fecha, na.rm = TRUE)
performance$printel[is.na(performance$printel)]<-median(performance$printel, na.rm = TRUE)
performance$mahle[is.na(performance$mahle)]<-median(performance$mahle, na.rm = TRUE)
performance$magna[is.na(performance$magna)]<-median(performance$magna, na.rm = TRUE)
performance$varroc[is.na(performance$varroc)]<-median(performance$varroc, na.rm = TRUE)
summary(performance)
##      fecha               printel           mahle           magna       varroc 
##  Min.   :2021-07-22   Min.   :0.0000   Min.   :-9.00   Min.   :0   Min.   :0  
##  1st Qu.:2021-10-20   1st Qu.:0.0000   1st Qu.: 2.00   1st Qu.:0   1st Qu.:0  
##  Median :2022-02-07   Median :0.0000   Median : 3.00   Median :0   Median :0  
##  Mean   :2022-01-30   Mean   :0.3395   Mean   : 2.21   Mean   :0   Mean   :0  
##  3rd Qu.:2022-04-27   3rd Qu.:0.2500   3rd Qu.: 3.00   3rd Qu.:0   3rd Qu.:0  
##  Max.   :2022-07-23   Max.   :4.0000   Max.   :20.00   Max.   :0   Max.   :0

Análisis Exploratorio de las Bases de Datos- Delivery Performance

Media

media_printel <- mean(performance$printel)
media_printel
## [1] 0.3395062
media_mahle <- mean(performance$mahle)
media_mahle
## [1] 2.209877
media_magna <- mean(performance$magna)
media_magna
## [1] 0
media_varroc <- mean(performance$varroc)
media_varroc
## [1] 0

Mediana

mediana_printel <- median(performance$printel)
mediana_printel
## [1] 0
mediana_mahle <- median(performance$mahle)
mediana_mahle
## [1] 3
mediana_magna <- median(performance$magna)
mediana_magna
## [1] 0
mediana_varroc <- median(performance$varroc)
mediana_varroc
## [1] 0

Moda

mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}
moda_printel <- mode(performance$printel)
moda_printel
## [1] 0
moda_mahle <- mode(performance$mahle)
moda_mahle
## [1] 3
moda_magna <- mode(performance$magna)
moda_magna
## [1] 0
moda_varroc <- mode(performance$varroc)
moda_varroc
## [1] 0

Varianza

varianza_printel <-var(performance$printel)
varianza_printel
## [1] 0.4416542
varianza_mahle <-var(performance$mahle)
varianza_mahle
## [1] 2.909376
varianza_magna <-var(performance$magna)
varianza_magna
## [1] 0
varianza_varroc <-var(performance$varroc)
varianza_varroc
## [1] 0

Desviación Estándar

desviacion_printel <- sqrt(varianza_printel)
desviacion_printel
## [1] 0.6645707
desviacion_mahle <- sqrt(varianza_mahle)
desviacion_mahle
## [1] 1.705689
desviacion_magna <- sqrt(varianza_magna)
desviacion_magna
## [1] 0
desviacion_varroc <- sqrt(varianza_varroc)
desviacion_varroc
## [1] 0

Tabla

Variable2 <-c("Printel","Mahle", "Magna", "Varroc")
Promedio2 <-c("0.339", "2.209","0", "0")
Moda2 <-c(" "," "," ", " ")
Mediana2 <-c("0","3","0", "0")
Varianza2 <-c("0.441","2.909","0", "0")
Desviación_Estándar2 <-c ("0.664","1.705","0", "0")
tabla2 <-data.frame(Variable2,Promedio2, Moda2, Mediana2, Varianza2, Desviación_Estándar2)
tabla2
##   Variable2 Promedio2 Moda2 Mediana2 Varianza2 Desviación_Estándar2
## 1   Printel     0.339              0     0.441                0.664
## 2     Mahle     2.209              3     2.909                1.705
## 3     Magna         0              0         0                    0
## 4    Varroc         0              0         0                    0
knitr::kable(tabla2)
Variable2 Promedio2 Moda2 Mediana2 Varianza2 Desviación_Estándar2
Printel 0.339 0 0.441 0.664
Mahle 2.209 3 2.909 1.705
Magna 0 0 0 0
Varroc 0 0 0 0

Delivery Plan

Importar las bases de datos

library(data.table)
library(dplyr)
library(plyr)
library(ggplot2)
library(naniar)
library(Hmisc)         
library(psych)
library(tidyverse)
library(janitor)
library(knitr)
library(pollster)
library(epiDisplay)
library(descr)
library(tidyr)
library(ggeasy)
library(stringr)
library(patchwork)

# file.choose()
bd <- read.csv("/Users/emilioolvera/Downloads/Delivery Plan FINAL - EQUIPO 4 .csv")

Técnica 1. Acondicionar nombres a formato óptimo para R

bd <- clean_names(bd)

Técnica 2.Unir los pedidos programados en una sola columna.

bd <- bd %>% dplyr::rename(cliente=cliente_planta,
                             A_jun_21=junio,
                             B_jul_21=julio,
                             C_ago_21=agosto,
                             D_sep_21=septiembre,
                             E_oct_21=octubre,
                             F_nov_21=noviembre,
                             G_dic_21=diciembre,
                             H_ene_22=ene_22,
                             I_feb_22=feb_22,
                            J_mar_22=mar_22,
                            K_abr_22=abr_22,
                            L_may_22=may_22,
                            M_jun_22=jun_22,
                            N_jul_22=jul_22,
                            O_ago_22=ago_22,
                            P_sep_22=sep_22,
                            Q_oct_22=octubre_22,
                            R_nov_22=nov_22,
                            S_dic_22=dic_22,
                            T_ene_23=ene_23,
                            U_feb_23=feb_23,
                            V_mar_23=feb_23
                          
                           )
colnames(bd)
##  [1] "cliente"     "proyecto"    "id_odoo"     "item"        "A_jun_21"   
##  [6] "B_jul_21"    "C_ago_21"    "D_sep_21"    "E_oct_21"    "F_nov_21"   
## [11] "G_dic_21"    "H_ene_22"    "I_feb_22"    "J_mar_22"    "K_abr_22"   
## [16] "L_may_22"    "M_jun_22"    "N_jul_22"    "O_ago_22"    "P_sep_22"   
## [21] "Q_oct_22"    "R_nov_22"    "S_dic_22"    "T_ene_23"    "V_mar_23"   
## [26] "mar_23"      "total_meses"
bd <- pivot_longer(bd, cols=5:14, names_to = "Mes", values_to = "Unidades")
str(bd)
## tibble [2,310 × 19] (S3: tbl_df/tbl/data.frame)
##  $ cliente    : chr [1:2310] "STB3" "STB3" "STB3" "STB3" ...
##  $ proyecto   : chr [1:2310] "CANASTILLA GRIS" "CANASTILLA GRIS" "CANASTILLA GRIS" "CANASTILLA GRIS" ...
##  $ id_odoo    : chr [1:2310] "15.785" "15.785" "15.785" "15.785" ...
##  $ item       : chr [1:2310] "CABLE SET CAJA BACK UP CANASTILLA" "CABLE SET CAJA BACK UP CANASTILLA" "CABLE SET CAJA BACK UP CANASTILLA" "CABLE SET CAJA BACK UP CANASTILLA" ...
##  $ K_abr_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ L_may_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ M_jun_22   : int [1:2310] 200 200 200 200 200 200 200 200 200 200 ...
##  $ N_jul_22   : int [1:2310] 900 900 900 900 900 900 900 900 900 900 ...
##  $ O_ago_22   : int [1:2310] 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 ...
##  $ P_sep_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ Q_oct_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ R_nov_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ S_dic_22   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ T_ene_23   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ V_mar_23   : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ mar_23     : int [1:2310] 0 0 0 0 0 0 0 0 0 0 ...
##  $ total_meses: int [1:2310] 3850 3850 3850 3850 3850 3850 3850 3850 3850 3850 ...
##  $ Mes        : chr [1:2310] "A_jun_21" "B_jul_21" "C_ago_21" "D_sep_21" ...
##  $ Unidades   : int [1:2310] 0 140 530 0 200 0 150 230 500 0 ...

Técnica 3.Eliminación de ceros en la base de datos para eliminar rengoles/clientes sin registros

bd1 <- filter(bd, Unidades>0)

Técnica 4.Eliminación de variables irrelevantes. En este caso, dado que previamente se unieron (merge) las variables de mes, solo se considera necesaria la variables de cliente, fecha y Unidades

bd2 <- bd1         
bd2 <- subset (bd1, select = -c (proyecto, id_odoo, item, K_abr_22, L_may_22, M_jun_22,N_jul_22,O_ago_22, P_sep_22, Q_oct_22, R_nov_22,  S_dic_22, T_ene_23, V_mar_23, mar_23, total_meses))
summary(bd2)
##    cliente              Mes               Unidades      
##  Length:590         Length:590         Min.   :    1.0  
##  Class :character   Class :character   1st Qu.:   30.0  
##  Mode  :character   Mode  :character   Median :   80.0  
##                                        Mean   :  358.4  
##                                        3rd Qu.:  300.0  
##                                        Max.   :13120.0

Análisis Exploratorio de las Bases de Datos - Delivery Plan

Media

Media <- mean(bd2$Unidades)
Media
## [1] 358.3729

Mediana

Mediana <- median(bd2$Unidades)
Mediana
## [1] 80

Moda

mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

Moda_clientes <- mode(bd2$cliente)  
Moda_clientes
## [1] "VARROC"
Moda_mes <- mode(bd2$Mes)  
Moda_mes
## [1] "H_ene_22"
Moda_unidades <- mode(bd2$Unidades)  
Moda_unidades
## [1] 60

Varianza

varianza_unidades_prog <- var(bd2$Unidades)
varianza_unidades_prog
## [1] 1005677

Desviación Estándar

desviacion_unidades_prog<- sqrt(varianza_unidades_prog)
desviacion_unidades_prog
## [1] 1002.834

Tabla

Variable<-c("Unidades", "Mes", "cliente")
Media<-c(Media, "NA", "NA")
Mediana<-c(Mediana, "NA", "NA")
Moda<-c(Moda_unidades, Moda_mes, Moda_clientes)
Desviacion_Estandar<-c("1002.834", "NA", "NA")
table1 <- data.frame(Variable, Media, Mediana, Moda, Desviacion_Estandar)
knitr::kable(table)
Variable Media Mediana Moda Desviacion_Estandar
Fecha NA NA 2022-08-31 14:55:40 NA
Cantidad 6.696 2 1 11.8488465539324
Ubicación_de_origen NA NA SAB/Pre-Production NA

Recursos Humanos Colaboradores

Importar las bases de datos

#file.choose()
bd <- read.csv("/Users/emilioolvera/Downloads/FORM - Recursos Humanos - colaboradores.csv")
# install.packages("dplyr")
library(dplyr)
# install.packages("janitor")
library(janitor)
colaboradores <- clean_names(bd)
summary(colaboradores)
##   no_empleado  nombre_completo         edad          genero         
##  Min.   :  1   Length:113         Min.   :18.00   Length:113        
##  1st Qu.: 29   Class :character   1st Qu.:26.00   Class :character  
##  Median : 57   Mode  :character   Median :34.00   Mode  :character  
##  Mean   : 57                      Mean   :36.06                     
##  3rd Qu.: 85                      3rd Qu.:45.00                     
##  Max.   :113                      Max.   :73.00                     
##                                                                     
##   fecha_alta          antiguedad        puesto          mano_de_obra      
##  Length:113         Min.   : 0.000   Length:113         Length:113        
##  Class :character   1st Qu.: 0.000   Class :character   Class :character  
##  Mode  :character   Median : 0.000   Mode  :character   Mode  :character  
##                     Mean   : 1.425                                        
##                     3rd Qu.: 2.000                                        
##                     Max.   :12.000                                        
##                                                                           
##  salario_diario  estado_civil      
##  Min.   :144.4   Length:113        
##  1st Qu.:176.7   Class :character  
##  Median :180.7   Mode  :character  
##  Mean   :179.1                     
##  3rd Qu.:180.7                     
##  Max.   :337.1                     
##  NA's   :2

Técnica 1. Borrar columnas.

colaboradores <- subset(colaboradores, select = -c(no_empleado, nombre_completo, fecha_alta, mano_de_obra))

Técnica 2. Reemplezar NAs con el promedio en la columna de “Salario Diario”

colaboradores$salario_diario[is.na(colaboradores$salario_diario)]<-mean(colaboradores$salario_diario, na.rm = TRUE)
summary (colaboradores)
##       edad          genero            antiguedad        puesto         
##  Min.   :18.00   Length:113         Min.   : 0.000   Length:113        
##  1st Qu.:26.00   Class :character   1st Qu.: 0.000   Class :character  
##  Median :34.00   Mode  :character   Median : 0.000   Mode  :character  
##  Mean   :36.06                      Mean   : 1.425                     
##  3rd Qu.:45.00                      3rd Qu.: 2.000                     
##  Max.   :73.00                      Max.   :12.000                     
##  salario_diario  estado_civil      
##  Min.   :144.4   Length:113        
##  1st Qu.:176.7   Class :character  
##  Median :180.7   Mode  :character  
##  Mean   :179.1                     
##  3rd Qu.:180.7                     
##  Max.   :337.1

Análisis Exploratorio de las Bases de Datos - Colaboradores

Media

media_edad <- mean(colaboradores$edad)
media_edad
## [1] 36.06195
media_antiguedad <- mean(colaboradores$antiguedad)
media_antiguedad
## [1] 1.424779
media_salario <- mean(colaboradores$salario_diario)
media_salario
## [1] 179.0981

Mediana

mediana_edad <- median(colaboradores$edad)
mediana_edad
## [1] 34
mediana_antiguedad <- median(colaboradores$antiguedad)
mediana_antiguedad
## [1] 0
mediana_salario <- median(colaboradores$salario_diario)
mediana_salario 
## [1] 180.68

Moda

mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}
moda_edad <- mode(colaboradores$edad)
moda_edad
## [1] 32
moda_antiguedad <- mode(colaboradores$antiguedad)
moda_antiguedad
## [1] 0
moda_salario <- mode(colaboradores$salario_diario)
moda_salario 
## [1] 180.68

Varianza

varianza_edad <-var(colaboradores$edad)
varianza_edad
## [1] 165.0051
varianza_antiguedad <-var(colaboradores$antiguedad)
varianza_antiguedad
## [1] 6.353666
varianza_salario <-var(colaboradores$salario_diario)
varianza_salario
## [1] 589.7227

Desviación Estándar

desviacion_edad <- sqrt(varianza_edad)
desviacion_edad
## [1] 12.84543
desviacion_antiguedad <- sqrt(varianza_antiguedad)
desviacion_antiguedad
## [1] 2.520648
desviacion_salario <- sqrt(varianza_salario)
desviacion_salario
## [1] 24.28421

Tabla

Variable <-c("Edad","Antiguedad","Salario Diario")
Promedio <-c("36", "1.42","179.098")
Moda <-c("32","0","180.68")
Mediana <-c("34","0","180.68")
Varianza <-c("165.005","6.353","589.722")
Desviación_Estándar <-c ("12.845","2.520","24.284")
tabla <-data.frame(Variable,Promedio, Moda, Mediana, Varianza, Desviación_Estándar)
tabla
##         Variable Promedio   Moda Mediana Varianza Desviación_Estándar
## 1           Edad       36     32      34  165.005              12.845
## 2     Antiguedad     1.42      0       0    6.353               2.520
## 3 Salario Diario  179.098 180.68  180.68  589.722              24.284
knitr::kable(tabla)
Variable Promedio Moda Mediana Varianza Desviación_Estándar
Edad 36 32 34 165.005 12.845
Antiguedad 1.42 0 0 6.353 2.520
Salario Diario 179.098 180.68 180.68 589.722 24.284

Recursos Humanos Bajas

Importar las bases de datos

#file.choose()
bd1<- read.csv("/Users/emilioolvera/Downloads/FORM - Recursos Humanos - bajas.csv")
bajas <- clean_names(bd1)
summary(bajas)
##   no_empleado     nombre_completo         edad          genero         
##  Min.   :  1.00   Length:238         Min.   :19.00   Length:238        
##  1st Qu.: 60.25   Class :character   1st Qu.:23.00   Class :character  
##  Median :119.50   Mode  :character   Median :29.00   Mode  :character  
##  Mean   :119.50                      Mean   :31.06                     
##  3rd Qu.:178.75                      3rd Qu.:37.00                     
##  Max.   :238.00                      Max.   :61.00                     
##   fecha_alta          antiguedad    motivo_baja            baja          
##  Length:238         Min.   :0.000   Length:238         Length:238        
##  Class :character   1st Qu.:0.000   Class :character   Class :character  
##  Mode  :character   Median :0.000   Mode  :character   Mode  :character  
##                     Mean   :0.605                                        
##                     3rd Qu.:1.000                                        
##                     Max.   :6.000                                        
##     puesto          salario_diario 
##  Length:238         Min.   :144.4  
##  Class :character   1st Qu.:180.7  
##  Mode  :character   Median :180.7  
##                     Mean   :178.0  
##                     3rd Qu.:180.7  
##                     Max.   :500.0

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

Reemplazar NA con CEROS en la columna de “Antigüedad” ya que es la Mediana y Moda.

bajas$antiguedad[is.na(bajas$antiguedad)]<-0

Reemplezar NAs con el promedio en la columna de “Edad” y “Salario Diario”

bajas$edad[is.na(bajas$edad)]<-mean(bajas$edad, na.rm = TRUE)
bajas$salario_diario[is.na(bajas$salario_diario)]<-mean(bajas$salario_diario, na.rm = TRUE)
summary (bajas)
##   no_empleado     nombre_completo         edad          genero         
##  Min.   :  1.00   Length:238         Min.   :19.00   Length:238        
##  1st Qu.: 60.25   Class :character   1st Qu.:23.00   Class :character  
##  Median :119.50   Mode  :character   Median :29.00   Mode  :character  
##  Mean   :119.50                      Mean   :31.06                     
##  3rd Qu.:178.75                      3rd Qu.:37.00                     
##  Max.   :238.00                      Max.   :61.00                     
##   fecha_alta          antiguedad    motivo_baja            baja          
##  Length:238         Min.   :0.000   Length:238         Length:238        
##  Class :character   1st Qu.:0.000   Class :character   Class :character  
##  Mode  :character   Median :0.000   Mode  :character   Mode  :character  
##                     Mean   :0.605                                        
##                     3rd Qu.:1.000                                        
##                     Max.   :6.000                                        
##     puesto          salario_diario 
##  Length:238         Min.   :144.4  
##  Class :character   1st Qu.:180.7  
##  Mode  :character   Median :180.7  
##                     Mean   :178.0  
##                     3rd Qu.:180.7  
##                     Max.   :500.0

Técnica 3.Convertir de caracter a fecha

bajas$baja <- as.Date(bajas$baja, format = "%d/%m/%Y")
tibble(bajas)
## # A tibble: 238 × 10
##    no_empleado nombre_c…¹  edad genero fecha…² antig…³ motiv…⁴ baja       puesto
##          <int> <chr>      <dbl> <chr>  <chr>     <dbl> <chr>   <date>     <chr> 
##  1           1 MARIO VAL…    32 MASCU… 09/03/…       3 RENUNC… 2021-11-27 DISEÑO
##  2           2 ISABEL BA…    36 FEMEN… 09/11/…       1 RENUNC… 2022-01-08 AYUDA…
##  3           3 MARIA ELI…    24 FEMEN… 10/11/…       1 RENUNC… 2022-01-08 AYUDA…
##  4           4 ALONDRA A…    21 FEMEN… 10/11/…       1 RENUNC… 2022-01-08 AYUDA…
##  5           5 ERIKA ROS…    30 FEMEN… 18/11/…       1 RENUNC… 2022-01-08 AYUDA…
##  6           6 GUADALUPE…    46 FEMEN… 02/12/…       1 BAJA P… 2022-01-08 AYUDA…
##  7           7 YOANA CRI…    29 FEMEN… 02/12/…       1 BAJA P… 2022-01-08 AYUDA…
##  8           8 CESAR ANT…    31 MASCU… 08/12/…       1 BAJA P… 2022-01-08 AYUDA…
##  9           9 ROBERTO S…    50 MASCU… 21/12/…       1 BAJA P… 2022-01-08 AYUDA…
## 10          10 JAIME DAN…    19 MASCU… 31/05/…       1 RENUNC… 2022-01-10 AYUDA…
## # … with 228 more rows, 1 more variable: salario_diario <dbl>, and abbreviated
## #   variable names ¹​nombre_completo, ²​fecha_alta, ³​antiguedad, ⁴​motivo_baja
bajas$baja[is.na(bajas$baja)]<-mean(bajas$baja, na.rm = TRUE)
summary (bajas)
##   no_empleado     nombre_completo         edad          genero         
##  Min.   :  1.00   Length:238         Min.   :19.00   Length:238        
##  1st Qu.: 60.25   Class :character   1st Qu.:23.00   Class :character  
##  Median :119.50   Mode  :character   Median :29.00   Mode  :character  
##  Mean   :119.50                      Mean   :31.06                     
##  3rd Qu.:178.75                      3rd Qu.:37.00                     
##  Max.   :238.00                      Max.   :61.00                     
##   fecha_alta          antiguedad    motivo_baja             baja           
##  Length:238         Min.   :0.000   Length:238         Min.   :2021-11-27  
##  Class :character   1st Qu.:0.000   Class :character   1st Qu.:2022-03-01  
##  Mode  :character   Median :0.000   Mode  :character   Median :2022-04-29  
##                     Mean   :0.605                      Mean   :2022-04-29  
##                     3rd Qu.:1.000                      3rd Qu.:2022-06-27  
##                     Max.   :6.000                      Max.   :2022-08-25  
##     puesto          salario_diario 
##  Length:238         Min.   :144.4  
##  Class :character   1st Qu.:180.7  
##  Mode  :character   Median :180.7  
##                     Mean   :178.0  
##                     3rd Qu.:180.7  
##                     Max.   :500.0

Análisis Exploratorio de las Bases de Datos- RH Bajas

Media

media_edad1 <- mean(bajas$edad)
media_edad1
## [1] 31.05882
media_antiguedad1 <- mean(bajas$antiguedad)
media_antiguedad1
## [1] 0.605042
media_salario1 <- mean(bajas$salario_diario)
media_salario1
## [1] 177.9855

Mediana

mediana_edad1 <- median(bajas$edad)
mediana_edad1
## [1] 29
mediana_antiguedad1 <- median(bajas$antiguedad)
mediana_antiguedad1
## [1] 0
mediana_salario1 <- median(bajas$salario_diario)
mediana_salario1
## [1] 180.68

Moda

mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}
moda_edad1 <- mode(bajas$edad)
moda_edad1
## [1] 22
moda_antiguedad1 <- mode(bajas$antiguedad)
moda_antiguedad1
## [1] 0
moda_salario1 <- mode(bajas$salario_diario)
moda_salario1 
## [1] 180.68

Varianza

varianza_edad1 <-var(bajas$edad)
varianza_edad1
## [1] 91.49863
varianza_antiguedad1 <-var(bajas$antiguedad)
varianza_antiguedad1
## [1] 0.6703542
varianza_salario1 <-var(bajas$salario_diario)
varianza_salario1
## [1] 536.4858

Desviación Estándar

desviacion_edad1 <- sqrt(varianza_edad1)
desviacion_edad1
## [1] 9.565492
desviacion_antiguedad1 <- sqrt(varianza_antiguedad1)
desviacion_antiguedad1
## [1] 0.8187516
desviacion_salario1 <- sqrt(varianza_salario1)
desviacion_salario1
## [1] 23.16216

Tabla

Variable1 <-c("Edad","Antiguedad","Salario Diario")
Promedio1 <-c("31.05","0.6","177.985")
Moda1 <-c("22","0","180.68")
Mediana1 <-c("29","0","180.68")
Varianza1 <-c("90.732","0.6677","531.996")
Desviación_Estándar1 <-c ("9.525","0.817","23.065")
tabla1 <-data.frame (Variable1,Promedio1, Moda1, Mediana1, Varianza1, Desviación_Estándar1)
tabla1
##        Variable1 Promedio1  Moda1 Mediana1 Varianza1 Desviación_Estándar1
## 1           Edad     31.05     22       29    90.732                9.525
## 2     Antiguedad       0.6      0        0    0.6677                0.817
## 3 Salario Diario   177.985 180.68   180.68   531.996               23.065
knitr::kable(tabla1)
Variable1 Promedio1 Moda1 Mediana1 Varianza1 Desviación_Estándar1
Edad 31.05 22 29 90.732 9.525
Antiguedad 0.6 0 0 0.6677 0.817
Salario Diario 177.985 180.68 180.68 531.996 23.065

Produccion de carton

Importar las bases de datos

#file.choose()
bd4 <- read.csv("/Users/emilioolvera/Downloads/EMI_CARTON.csv")
library(janitor)
produccion <- clean_names(bd4)
summary(produccion)
##     fecha             cliente            id_form            producto        
##  Length:3988        Length:3988        Length:3988        Length:3988       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  piezas_prog          tmo_min             hr_fin          estacion_arranque 
##  Length:3988        Length:3988        Length:3988        Length:3988       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  laminas_procesadas inicio_sep_up      fin_inicio_de_sep_up inicio_de_proceso 
##  Min.   :   0       Length:3988        Length:3988          Length:3988       
##  1st Qu.:   0       Class :character   Class :character     Class :character  
##  Median :  51       Mode  :character   Mode  :character     Mode  :character  
##  Mean   : 102                                                                 
##  3rd Qu.: 184                                                                 
##  Max.   :1263                                                                 
##                                                                               
##  fin_de_proceso     tiempo_calidad     tiempo_materiales
##  Length:3988        Length:3988        Min.   : 0.000   
##  Class :character   Class :character   1st Qu.: 0.000   
##  Mode  :character   Mode  :character   Median : 0.000   
##                                        Mean   : 3.187   
##                                        3rd Qu.: 1.000   
##                                        Max.   :60.000   
##                                        NA's   :3491
produccion <- subset(produccion,select = -c (id_form, producto, hr_fin, inicio_sep_up, fin_inicio_de_sep_up, inicio_de_proceso, fin_de_proceso, tiempo_materiales))
summary(produccion)
##     fecha             cliente          piezas_prog          tmo_min         
##  Length:3988        Length:3988        Length:3988        Length:3988       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  estacion_arranque  laminas_procesadas tiempo_calidad    
##  Length:3988        Min.   :   0       Length:3988       
##  Class :character   1st Qu.:   0       Class :character  
##  Mode  :character   Median :  51       Mode  :character  
##                     Mean   : 102                         
##                     3rd Qu.: 184                         
##                     Max.   :1263
library(data.table)
library(dplyr)
library(plyr)
library(ggplot2)
library(naniar)
library(Hmisc)         
library(psych)
library(tidyverse)
library(knitr)
# install.packages("pollster")
library(pollster)
library(epiDisplay)
library(descr)
library(tidyr)

Técnica 1.Convertir a caracter a numerico y de fecha

produccion$piezas_prog<-as.numeric(produccion$piezas_prog)                 
## Warning: NAs introduced by coercion
produccion$tmo_min<-as.numeric(produccion$tmo_min)                  
## Warning: NAs introduced by coercion
produccion$laminas_procesadas<-as.numeric(produccion$laminas_procesadas)   
produccion$tiempo_calidad<-as.numeric(produccion$tiempo_calidad) 
## Warning: NAs introduced by coercion
produccion$fecha <- as.Date(produccion$fecha, format = "%d/%m/%Y")
summary(produccion)
##      fecha              cliente           piezas_prog        tmo_min      
##  Min.   :2022-07-15   Length:3988        Min.   :   1.0   Min.   :  0.00  
##  1st Qu.:2022-08-03   Class :character   1st Qu.: 100.0   1st Qu.: 15.00  
##  Median :2022-08-20   Mode  :character   Median : 153.5   Median : 20.00  
##  Mean   :2022-08-19                      Mean   : 180.3   Mean   : 22.37  
##  3rd Qu.:2022-09-06                      3rd Qu.: 200.0   3rd Qu.: 25.00  
##  Max.   :2022-09-21                      Max.   :2000.0   Max.   :150.00  
##                                          NA's   :180      NA's   :824     
##  estacion_arranque  laminas_procesadas tiempo_calidad   
##  Length:3988        Min.   :   0       Min.   : 0.0000  
##  Class :character   1st Qu.:   0       1st Qu.: 0.0000  
##  Mode  :character   Median :  51       Median : 1.0000  
##                     Mean   : 102       Mean   : 0.8631  
##                     3rd Qu.: 184       3rd Qu.: 1.0000  
##                     Max.   :1263       Max.   :22.0000  
##                                        NA's   :346

Al aplicar esta tecnica se introducieron NAs a la base de datos las cuales luego borre

Técnica 2.Borrar las letras de algunos registros de “Pieza_Prog”.

produccion$piezas_prog <- str_replace(produccion$piezas_prog, "[aeiouLAM=NbBsS]", "")
produccion$piezas_prog <- as.integer(produccion$laminas_procesadas)

Técnica 3.Reemplazar por la mediana los NA´s de tmo_min y de tiempo_calidad

produccion$tmo_min[is.na(produccion$tmo_min)]<-median(produccion$tmo_min, na.rm = TRUE)
produccion$tiempo_calidad[is.na(produccion$tiempo_calidad)]<-median(produccion$tiempo_calidad, na.rm = TRUE)
summary(produccion)
##      fecha              cliente           piezas_prog      tmo_min      
##  Min.   :2022-07-15   Length:3988        Min.   :   0   Min.   :  0.00  
##  1st Qu.:2022-08-03   Class :character   1st Qu.:   0   1st Qu.: 15.00  
##  Median :2022-08-20   Mode  :character   Median :  51   Median : 20.00  
##  Mean   :2022-08-19                      Mean   : 102   Mean   : 21.88  
##  3rd Qu.:2022-09-06                      3rd Qu.: 184   3rd Qu.: 25.00  
##  Max.   :2022-09-21                      Max.   :1263   Max.   :150.00  
##  estacion_arranque  laminas_procesadas tiempo_calidad  
##  Length:3988        Min.   :   0       Min.   : 0.000  
##  Class :character   1st Qu.:   0       1st Qu.: 1.000  
##  Mode  :character   Median :  51       Median : 1.000  
##                     Mean   : 102       Mean   : 0.875  
##                     3rd Qu.: 184       3rd Qu.: 1.000  
##                     Max.   :1263       Max.   :22.000

Análisis Exploratorio de las Bases de Datos- Produccion de carton

Media

media_piezas_prog<- mean(produccion$piezas_prog)
media_piezas_prog
## [1] 102.0105
media_tmo_min<- mean(produccion$tmo_min)
media_tmo_min 
## [1] 21.88064
media_laminas_procesadas <- mean(produccion$laminas_procesadas)
media_laminas_procesadas
## [1] 102.0105
media_tiempo_calidad<- mean(produccion$tiempo_calidad)
media_tiempo_calidad
## [1] 0.8749749

Mediana

median_piezas_prog<- median(produccion$piezas_prog)
median_piezas_prog
## [1] 51
median_tmo_min<- median(produccion$tmo_min)
median_tmo_min 
## [1] 20
median_laminas_procesadas <- median(produccion$laminas_procesadas)
media_laminas_procesadas
## [1] 102.0105
median_tiempo_calidad<- median(produccion$tiempo_calidad)
median_tiempo_calidad
## [1] 1

Moda

mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}
moda_piezas_prog <- mode(produccion$piezas_prog)
moda_piezas_prog
## [1] 0
moda_tmo_min <- mode(produccion$tmo_min)
moda_tmo_min
## [1] 20
moda_laminas_procesadas<- mode(produccion$laminas_procesadas)
moda_laminas_procesadas
## [1] 0
moda_tiempo_calidad <- mode(produccion$tiempo_calidad)
moda_tiempo_calidad
## [1] 1

Varianza

varianza_piezas_prog <-var(produccion$piezas_prog)
varianza_piezas_prog
## [1] 18056.03
varianza_tmo_min <-var(produccion$tmo_min)
varianza_tmo_min
## [1] 143.2895
varianza_laminas_procesadas<-var(produccion$laminas_procesadas)
varianza_laminas_procesadas
## [1] 18056.03
varianza_tiempo_calidad <-var(produccion$tiempo_calidad)
varianza_tiempo_calidad
## [1] 0.9834017

Desviación Estándar

desviacion_piezas_prog<- sqrt(varianza_piezas_prog)
desviacion_piezas_prog
## [1] 134.3727
desviacion_tmo_min <- sqrt(varianza_tmo_min)
desviacion_tmo_min
## [1] 11.97036
desviacion_laminas_procesadas <- sqrt(varianza_laminas_procesadas)
desviacion_laminas_procesadas
## [1] 134.3727
desviacion_tiempo_calidad <- sqrt(varianza_tiempo_calidad)
desviacion_tiempo_calidad
## [1] 0.9916661

Tabla

Variable2 <-c("piezas_prog","tmo_min ", "laminas_procesadas", "tiempo_calidad")
Promedio2 <-c("102.01", "21.88","102.01", "0.8749")
Moda2 <-c("0", "20","0", "1")
Mediana2 <-c("51","20","102.0105", "1")
Varianza2 <-c("18056.03","143.2895","18056.03", "0.9834017")
Desviación_Estándar2 <-c ("134.3727","11.97036","134.3727", "0.9916661")
tabla2 <-data.frame(Variable2,Promedio2, Moda2, Mediana2, Varianza2, Desviación_Estándar2)
tabla2
##            Variable2 Promedio2 Moda2 Mediana2 Varianza2 Desviación_Estándar2
## 1        piezas_prog    102.01     0       51  18056.03             134.3727
## 2           tmo_min      21.88    20       20  143.2895             11.97036
## 3 laminas_procesadas    102.01     0 102.0105  18056.03             134.3727
## 4     tiempo_calidad    0.8749     1        1 0.9834017            0.9916661
knitr::kable(tabla2)
Variable2 Promedio2 Moda2 Mediana2 Varianza2 Desviación_Estándar2
piezas_prog 102.01 0 51 18056.03 134.3727
tmo_min 21.88 20 20 143.2895 11.97036
laminas_procesadas 102.01 0 102.0105 18056.03 134.3727
tiempo_calidad 0.8749 1 1 0.9834017 0.9916661

Tabla de frecuencia para merma - La tabla de frecuencia se hizo de los Kilos y esta me sirvio para ver que nunca tienen el mismo monto de merma

table(merma1$Mes, merma1$Kilos)
##             
##              790 810 1040 2130 2480 2680 2830 2950 2980 2990 3050 3140 3290
##   ABRIL        0   0    0    0    0    0    0    1    0    0    0    0    0
##   AGOSTO       1   1    1    0    1    0    0    0    0    0    0    2    0
##   ENERO        0   0    0    0    0    1    0    0    0    1    0    0    0
##   FEBRERO      0   0    0    0    0    0    0    0    0    0    0    0    0
##   JULIO        0   0    0    1    0    0    0    0    0    0    0    0    0
##   JUNIO        0   0    0    0    0    0    0    0    0    0    0    0    0
##   MARZO        0   0    0    0    0    0    0    0    1    0    0    0    1
##   MAYO         0   0    0    0    0    0    0    0    0    0    0    0    0
##   SEPTIEMBRE   0   0    0    0    0    0    1    0    0    0    1    0    0
##             
##              3410 3590 3650 3680 3690 3739 3780 3810 3870 3920 3930 3940 3960
##   ABRIL         0    0    0    0    1    0    0    0    0    0    0    1    0
##   AGOSTO        0    0    0    0    0    0    1    0    0    0    0    0    0
##   ENERO         0    0    0    0    0    0    0    1    0    0    0    0    0
##   FEBRERO       1    1    1    0    0    0    0    0    1    0    1    0    0
##   JULIO         0    0    0    0    0    0    0    0    0    1    0    0    1
##   JUNIO         0    0    0    0    0    0    0    0    0    0    0    0    0
##   MARZO         0    0    0    0    0    0    0    1    0    0    0    0    0
##   MAYO          0    0    0    1    0    0    0    0    0    0    0    0    0
##   SEPTIEMBRE    0    0    0    0    0    1    0    0    0    0    0    0    0
##             
##              3967 4000 4050 4130 4190 4200 4210 4240 4260 4270 4310 4330 4380
##   ABRIL         0    0    1    0    1    0    0    0    0    0    0    0    0
##   AGOSTO        0    0    0    0    0    1    1    1    0    1    0    0    0
##   ENERO         0    0    0    0    0    0    0    0    0    0    0    0    0
##   FEBRERO       0    0    0    0    0    0    0    0    0    0    0    0    1
##   JULIO         0    0    0    1    0    0    0    0    0    0    0    0    0
##   JUNIO         0    0    0    0    0    0    0    0    1    0    0    1    0
##   MARZO         0    1    0    0    1    1    0    0    0    0    0    0    0
##   MAYO          0    0    0    0    0    0    0    0    0    0    1    0    0
##   SEPTIEMBRE    1    0    0    0    0    0    0    0    0    0    0    0    0
##             
##              4510 4680 4770 5010 5080 5230 6140
##   ABRIL         0    0    0    0    0    0    0
##   AGOSTO        0    0    0    0    0    0    0
##   ENERO         0    0    0    0    1    0    0
##   FEBRERO       0    0    0    0    0    0    0
##   JULIO         0    0    0    0    0    1    0
##   JUNIO         0    1    0    1    0    0    0
##   MARZO         0    0    0    0    0    0    0
##   MAYO          1    0    1    0    0    0    1
##   SEPTIEMBRE    0    0    0    0    0    0    0
prop.table(table(merma1$Mes, merma1$Kilos))
##             
##               790  810 1040 2130 2480 2680 2830 2950 2980 2990 3050 3140 3290
##   ABRIL      0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00
##   AGOSTO     0.02 0.02 0.02 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.04 0.00
##   ENERO      0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.02 0.00 0.00 0.00
##   FEBRERO    0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   JULIO      0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   JUNIO      0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   MARZO      0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.02
##   MAYO       0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   SEPTIEMBRE 0.00 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.02 0.00 0.00
##             
##              3410 3590 3650 3680 3690 3739 3780 3810 3870 3920 3930 3940 3960
##   ABRIL      0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.02 0.00
##   AGOSTO     0.00 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0.00
##   ENERO      0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00
##   FEBRERO    0.02 0.02 0.02 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.02 0.00 0.00
##   JULIO      0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.02
##   JUNIO      0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   MARZO      0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00
##   MAYO       0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   SEPTIEMBRE 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##             
##              3967 4000 4050 4130 4190 4200 4210 4240 4260 4270 4310 4330 4380
##   ABRIL      0.00 0.00 0.02 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   AGOSTO     0.00 0.00 0.00 0.00 0.00 0.02 0.02 0.02 0.00 0.02 0.00 0.00 0.00
##   ENERO      0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   FEBRERO    0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.02
##   JULIO      0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   JUNIO      0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00 0.02 0.00
##   MARZO      0.00 0.02 0.00 0.00 0.02 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   MAYO       0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.02 0.00 0.00
##   SEPTIEMBRE 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
##             
##              4510 4680 4770 5010 5080 5230 6140
##   ABRIL      0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   AGOSTO     0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   ENERO      0.00 0.00 0.00 0.00 0.02 0.00 0.00
##   FEBRERO    0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   JULIO      0.00 0.00 0.00 0.00 0.00 0.02 0.00
##   JUNIO      0.00 0.02 0.00 0.02 0.00 0.00 0.00
##   MARZO      0.00 0.00 0.00 0.00 0.00 0.00 0.00
##   MAYO       0.02 0.00 0.02 0.00 0.00 0.00 0.02
##   SEPTIEMBRE 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Tabla de frecuencia de Scrap - La tabla de frecuencia de scrap se hizo de cantidad y esta me sirvio para ver como varia la cantidad de scrap la cual se ve reflejada yendo a varias ubicaciones la cual es 1

frec_scrap<-scrap1 %>% group_by(Cantidad) %>% tally()
frec_scrap
## # A tibble: 33 × 2
##    Cantidad     n
##       <dbl> <int>
##  1      0       1
##  2      1      76
##  3      2      59
##  4      2.5     2
##  5      3      14
##  6      4      18
##  7      5       4
##  8      6      11
##  9      7       4
## 10      8      10
## # … with 23 more rows

Tabla de frecuencia de Produccion - La tabla de frecuencia de produccion se hizo de piezas, esta me sirvio para ver como es que las piezas de produccion se van vendiendo

FREC_PROD<-bd4 %>% group_by(PIEZAS.PROG.) %>% tally()
FREC_PROD
## # A tibble: 301 × 2
##    PIEZAS.PROG.     n
##    <chr>        <int>
##  1 ""               1
##  2 "1"              6
##  3 "10"            57
##  4 "100"          670
##  5 "1000"          12
##  6 "100ca"         17
##  7 "100ce"          1
##  8 "100cel"         2
##  9 "100ra"          2
## 10 "100sie"         1
## # … with 291 more rows

Grafica de dispersion para merma - En esta grafica podemos apreciar los datos de lo que son los kilos que tienen de merma por mes en donde se puede ver que en agosto es cuando se tiene el mayor numero de merma

ggplot(data=merma1, mapping = aes(Mes, Kilos)) + geom_point(aes()) + theme_bw()

Gráfica de Dispersión para Scrap -En esta grafica de dispersion se puede apreciar visualmente la cantidad que se produce en cada ubicacion, tal fue de ayuda para ver que en SAB/Pre-Production es la que mas tiene Scrap.

ggplot(data=scrap1, mapping =
aes(Cantidad, Ubicación.de.origen)) +
  geom_point(aes()) + theme_bw()

Grafico de barras de los kilos de MERMA que se producen por mes- Visualmente podemos ver que Agosto tiene el mayor numero de merma a comparacion de los otros meses

ggplot(merma1, aes(x=Mes, y=Kilos)) +
  geom_bar(stat="identity", fill="yellow") + scale_fill_grey() + 
  labs(title = "Grafica de Barras de los kilos de merma que hay por mes.", 
       x = "Mes", y = "Kilos")

Grafico de barras de SCRAP de la cantidad de las piezas por la ubicación - En esta grafica de barras es visualmente claro que como se menciono anteriormente, el area de pre-production es la que mas scrap lleva.

ggplot(scrap2, aes(x=Ubicación.de.origen, y=Cantidad)) +
  geom_bar(stat="identity", fill="BLUE") + scale_fill_grey() + 
  labs(title = "Grafico de barras de las unidades de Scrap por ubicacion de origen", 
       x = "Unidades", y = "Ubicación")

Plot de dispersion - Produccion carton- Este gráfico muestra que FORM no experimenta retrasos de horas con sus clientes Magna y Varroc, pero Mahle e Printel han tenido retrasos significativos, principalmente en el primer trimestre de 2022.

ggplot(performance,aes(x=fecha))+
  geom_line(aes(y=printel),color="blue")+
  geom_line(aes(y=mahle),color="orange")+
  geom_line(aes(y=magna),color="green")+
  geom_line(aes(y=varroc),color="green")+
  labs(x="Fecha",y="Retraso en horas", color="Legend")+
  ggtitle("Retrasos de entrega por cliente")

Dispersion plot - Los números de unidades vendidas cada mes se muestran en un gráfico para los años 2021 y 2022. Se puede ver que aumentaron en junio de 2021, disminuyeron en los meses siguientes y luego aumentaron nuevamente en los meses de 2022. Esta información se puede utilizar para identificar patrones en los datos y determinar qué meses reciben la mayor demanda

ggplot(bd2, aes(x = bd2$Mes, y = bd2$Unidades)) + 
  geom_point(shape=19, size=3) + 
  labs(title = "Relación entre Unidades y Meses",caption ="FORM Merma",x="Mes", y="Unidades") + 
  theme_classic()

Histograma colaboradores - Con estas gràfica podemos observar que los colaboradores actuales en promedio tienen entre 20-40 años.

hist(colaboradores$edad, freq=TRUE, col="purple", main="Edad en años de los Colaboradores actuales")

Grafico cualitativo - Con esta gràfica podemos observar que el motivo màs comùn de baja de los colaboradores han sido por despidos por faltas con un 59% y por renuncia voluntaria por un 37%.

table(bajas$motivo_baja)
## 
##            ABANDONO     BAJA POR FALTAS          JUBILACION RENUNCIA VOLUNTARIA 
##                   1                 141                   1                  87 
## TERMINO DE CONTRATO 
##                   8
proporciones <- c(1, 141, 1, 87, 8)
etiquetas <- c("Abandono", "Baja por Faltas", "Jubilaciòn", "Renuncia Voluntaria", "Termino de Contrato")
pct <- round(proporciones/sum(proporciones)*100)
etiquetas <- paste(etiquetas, pct)
etiquetas <- paste(etiquetas,"%",sep="")
pie(proporciones,labels = etiquetas,
    col=rainbow(length(etiquetas)),
    main="Motivo de bajas de los Colaboradores")

Bar plot - Con este gràfico podemos observar que los que estan casados y solteros suelen ganar màs de los que estan divorciados y en uniòn libre. Ademàs, los hombres casados y las mujeres solteras son los que ganan màs.

ggplot(colaboradores, aes(x=genero, y=salario_diario, fill=genero)) + 
  geom_bar(stat="identity") + 
  facet_grid(~estado_civil) + scale_fill_brewer(palette = "Set2")

Pronóstico del Desempeño de la Industria Automotriz y la empresa FORM

Descripción de variables

Año - Año en el que se efectúo la exportación o venta.

Mes - Mes correspondiente al año en el que se efectúo la exportación o venta.

Venta (variable dependiente) - Venta en México de vehículos ligeros en unidades.

Exportación (variable dependiente) - Exportación en México de vehículos ligeros en unidades.

Tipo de cambio (variable independiente) - Registros historicos del dolar en México.

Inflación (variable independiente)- Inflación durante los años definidos.

porcentaje_ocu (variable independiente) - Porcentaje de la población ocupada.

porcentaje_desocu (variable independiente) - Porcentaje de la población desocupada.

conf_consumidor (variable independiente) - Confianza del consumidor en la industria automotriz en México.

Importar bases de datos

#file.choose
bd_prediccion <- read.csv("/Users/emilioolvera/Downloads/encoded-bd_prediccion.csv")
vehiculos_circulacion <-read.csv("/Users/emilioolvera/Downloads/encoded-vehiculos_en_circulacion (2).csv")
eua <- read.csv("/Users/emilioolvera/Downloads/car_production.csv")
produccion <- read.csv("/Users/emilioolvera/Downloads/bd_produccion_limpia.csv")

Instalar paquetes y llamar librerías

#install.packages("tseries")
library(tseries)
#install.packages("forecast")
library(forecast)
#install.packages("astsa")
library(astsa)
#install.packages("dplyr")
library(dplyr)
#install.packages("jtools")
library(jtools)
#install.packages("lmtest")
library(lmtest)
#install.packages("car")
library(car)
#install.packages("olsrr")
library(olsrr)
#install.packages("corrplot")
library(corrplot)
library(ggfortify)    # data visualization tools for statistical analysis results
library(ggalluvial)   # used to visualize frequency tables involving several categorical variables
library(forecast)
library(tseries)

str(eua)
## 'data.frame':    28 obs. of  5 variables:
##  $ year                 : int  1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 ...
##  $ us_car_production    : int  6601200 6326100 6035200 5878300 5492300 5577500 5471000 4808100 4957380 4453370 ...
##  $ people_unemployed    : int  8000000 7400000 7240000 6740000 6210000 5880000 5690000 6800000 8380000 8770000 ...
##  $ imports_value        : num  6.63e+14 7.44e+14 7.95e+14 8.70e+14 9.12e+14 ...
##  $ retail_price_gasoline: num  1.08 1.11 1.2 1.2 1.03 1.14 1.48 1.42 1.35 1.56 ...
corrplot(cor(eua),type='upper',order='hclust',addCoef.col='black') 

model1eua<-lm(us_car_production~people_unemployed+retail_price_gasoline+imports_value,data=eua)     
summary(model1eua)
## 
## Call:
## lm(formula = us_car_production ~ people_unemployed + retail_price_gasoline + 
##     imports_value, data = eua)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1359520  -352691  -111282   344515  1063427 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            8.275e+06  4.454e+05  18.580 9.46e-16 ***
## people_unemployed     -2.132e-01  5.306e-02  -4.018 0.000504 ***
## retail_price_gasoline  1.030e+06  3.207e+05   3.211 0.003741 ** 
## imports_value         -2.627e-09  3.765e-10  -6.978 3.24e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 595000 on 24 degrees of freedom
## Multiple R-squared:  0.827,  Adjusted R-squared:  0.8053 
## F-statistic: 38.23 on 3 and 24 DF,  p-value: 2.66e-09
summary(model1eua<-arma(eua$us_car_production,order=c(0,1)))
## Warning in arma(eua$us_car_production, order = c(0, 1)): Hessian negative-
## semidefinite
## Warning in sqrt(diag(object$vcov)): NaNs produced

## Warning in sqrt(diag(object$vcov)): NaNs produced
## 
## Call:
## arma(x = eua$us_car_production, order = c(0, 1))
## 
## Model:
## ARMA(0,1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1828929  -510897   -93835   407588  2190313 
## 
## Coefficient(s):
##            Estimate  Std. Error  t value Pr(>|t|)    
## ma1       6.699e-01   1.051e-01    6.373 1.85e-10 ***
## intercept 4.136e+06         NaN      NaN      NaN    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Fit:
## sigma^2 estimated as 8.49e+11,  Conditional Sum-of-Squares = 2.218446e+13,  AIC = 852.55
model1eua_forecast<-forecast(model1eua$fitted,h=3,level=c(95))
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
model1eua_forecast
##    Point Forecast   Lo 95   Hi 95
## 29        3446234 2727793 4164676
## 30        3393265 2685866 4100664
## 31        3340296 2643939 4036652

Automotive Industry Mexico and FORM Performance Forecast

Desempeño de la industria automotriz para los siguientes 3 periodos de tiempo

Vehículos de motor registrados en circulación

Entender la base de datos

summary(vehiculos_circulacion)
##      Año                Total           Automóviles      
##  Length:47          Min.   : 4010430   Min.   : 3950042  
##  Class :character   1st Qu.: 6748523   1st Qu.: 6654340  
##  Mode  :character   Median :11002046   Median :10764080  
##                     Mean   :14899354   Mean   :14673142  
##                     3rd Qu.:22392796   3rd Qu.:22068938  
##                     Max.   :35913468   Max.   :35460804  
##                     NA's   :5          NA's   :5         
##  Camiones.para.pasajeros Camiones.y.camionetas.para.carga  Motocicletas    
##  Min.   : 60388          Min.   : 1470816                 Min.   : 128960  
##  1st Qu.: 90931          1st Qu.: 3046906                 1st Qu.: 248248  
##  Median :233490          Median : 5166812                 Median : 295262  
##  Mean   :226212          Mean   : 5920971                 Mean   :1156467  
##  3rd Qu.:336420          3rd Qu.: 9199181                 3rd Qu.:1284405  
##  Max.   :461089          Max.   :11262666                 Max.   :5939262  
##  NA's   :5               NA's   :5                        NA's   :5        
##     X             X.1         
##  Mode:logical   Mode:logical  
##  NA's:47        NA's:47       
##                               
##                               
##                               
##                               
## 
str(vehiculos_circulacion)
## 'data.frame':    47 obs. of  8 variables:
##  $ Año                             : chr  "1980" "1981" "1982" "1983" ...
##  $ Total                           : int  4010430 4406336 4686130 4797562 5047043 5360870 5286295 5420592 5682964 6093682 ...
##  $ Automóviles                     : int  3950042 4341363 4616897 4726236 4970526 5281842 5202922 5336228 5597735 6003532 ...
##  $ Camiones.para.pasajeros         : int  60388 64973 69233 71326 76517 79028 83373 84364 85229 90150 ...
##  $ Camiones.y.camionetas.para.carga: int  1470816 1636899 1751799 1893206 2009875 2114395 2213025 2292078 2424025 2691551 ...
##  $ Motocicletas                    : int  277084 296601 257235 250484 248148 250358 232692 221059 217898 223815 ...
##  $ X                               : logi  NA NA NA NA NA NA ...
##  $ X.1                             : logi  NA NA NA NA NA NA ...

Limpieza de datos

Eliminar variables (Camiones.y.camionetas.para.carga, Motocicletas, X y X.1)

vehiculos_circulacion1 <- subset(vehiculos_circulacion, select = -c (Camiones.y.camionetas.para.carga, Motocicletas, X, X.1))
vehiculos_circulacion1
##                                                                              Año
## 1                                                                           1980
## 2                                                                           1981
## 3                                                                           1982
## 4                                                                           1983
## 5                                                                           1984
## 6                                                                           1985
## 7                                                                           1986
## 8                                                                           1987
## 9                                                                           1988
## 10                                                                          1989
## 11                                                                          1990
## 12                                                                          1991
## 13                                                                          1992
## 14                                                                          1993
## 15                                                                          1994
## 16                                                                          1995
## 17                                                                          1996
## 18                                                                          1997
## 19                                                                          1998
## 20                                                                          1999
## 21                                                                          2000
## 22                                                                          2001
## 23                                                                          2002
## 24                                                                          2003
## 25                                                                          2004
## 26                                                                          2005
## 27                                                                          2006
## 28                                                                          2007
## 29                                                                          2008
## 30                                                                          2009
## 31                                                                          2010
## 32                                                                          2011
## 33                                                                          2012
## 34                                                                          2013
## 35                                                                          2014
## 36                                                                          2015
## 37                                                                          2016
## 38                                                                          2017
## 39                                                                          2018
## 40                                                                          2019
## 41                                                                          2020
## 42                                                                          2021
## 43                                                                              
## 44                                                                              
## 45                                                                              
## 46 FUENTE: INEGI. Estadísticas de vehículos de motor registrados en circulación.
## 47                                                                              
##       Total Automóviles Camiones.para.pasajeros
## 1   4010430     3950042                   60388
## 2   4406336     4341363                   64973
## 3   4686130     4616897                   69233
## 4   4797562     4726236                   71326
## 5   5047043     4970526                   76517
## 6   5360870     5281842                   79028
## 7   5286295     5202922                   83373
## 8   5420592     5336228                   84364
## 9   5682964     5597735                   85229
## 10  6093682     6003532                   90150
## 11  6648825     6555550                   93275
## 12  7047618     6950708                   96910
## 13  7494357     7399178                   95179
## 14  7801892     7715951                   85941
## 15  7332309     7217732                  114577
## 16  7590001     7469504                  120497
## 17  7927797     7830864                   96933
## 18  8528440     8402995                  125445
## 19  9262652     9086209                  176443
## 20  9783153     9582796                  200357
## 21 10378575    10176179                  202396
## 22 11625518    11351982                  273536
## 23 12554275    12254910                  299365
## 24 13050150    12742049                  308101
## 25 13652596    13388011                  264585
## 26 14569197    14300380                  268817
## 27 16722002    16411813                  310189
## 28 18018701    17696623                  322078
## 29 19754229    19420942                  333287
## 30 20856689    20519224                  337465
## 31 21465511    21152773                  312738
## 32 22701891    22374326                  327565
## 33 23908143    23569623                  338520
## 34 25167066    24819922                  347144
## 35 25891628    25543908                  347720
## 36 27265446    26907994                  357452
## 37 29032067    28664295                  367772
## 38 31359162    30958042                  401120
## 39 32733646    32290067                  443579
## 40 34057197    33603591                  453606
## 41 34886784    34425695                  461089
## 42 35913468    35460804                  452664
## 43       NA          NA                      NA
## 44       NA          NA                      NA
## 45       NA          NA                      NA
## 46       NA          NA                      NA
## 47       NA          NA                      NA

Debido a que el mercado principal de FORM no son los camiones, camionetas de carga o motocicletas, así como a que los datos de estas variables no son significativos para el pronóstico debido a que sus valores son muy pequeños en comparación con las otras variables, su se eliminan los datos. De manera similar, las variables X y X.1 también se eliminan porque carecen de información pertinente.

Eliminar renglones irrelevantes

vehiculos_circulacion2 <- vehiculos_circulacion1[-c(43,44,45,46,47),]
vehiculos_circulacion2
##     Año    Total Automóviles Camiones.para.pasajeros
## 1  1980  4010430     3950042                   60388
## 2  1981  4406336     4341363                   64973
## 3  1982  4686130     4616897                   69233
## 4  1983  4797562     4726236                   71326
## 5  1984  5047043     4970526                   76517
## 6  1985  5360870     5281842                   79028
## 7  1986  5286295     5202922                   83373
## 8  1987  5420592     5336228                   84364
## 9  1988  5682964     5597735                   85229
## 10 1989  6093682     6003532                   90150
## 11 1990  6648825     6555550                   93275
## 12 1991  7047618     6950708                   96910
## 13 1992  7494357     7399178                   95179
## 14 1993  7801892     7715951                   85941
## 15 1994  7332309     7217732                  114577
## 16 1995  7590001     7469504                  120497
## 17 1996  7927797     7830864                   96933
## 18 1997  8528440     8402995                  125445
## 19 1998  9262652     9086209                  176443
## 20 1999  9783153     9582796                  200357
## 21 2000 10378575    10176179                  202396
## 22 2001 11625518    11351982                  273536
## 23 2002 12554275    12254910                  299365
## 24 2003 13050150    12742049                  308101
## 25 2004 13652596    13388011                  264585
## 26 2005 14569197    14300380                  268817
## 27 2006 16722002    16411813                  310189
## 28 2007 18018701    17696623                  322078
## 29 2008 19754229    19420942                  333287
## 30 2009 20856689    20519224                  337465
## 31 2010 21465511    21152773                  312738
## 32 2011 22701891    22374326                  327565
## 33 2012 23908143    23569623                  338520
## 34 2013 25167066    24819922                  347144
## 35 2014 25891628    25543908                  347720
## 36 2015 27265446    26907994                  357452
## 37 2016 29032067    28664295                  367772
## 38 2017 31359162    30958042                  401120
## 39 2018 32733646    32290067                  443579
## 40 2019 34057197    33603591                  453606
## 41 2020 34886784    34425695                  461089
## 42 2021 35913468    35460804                  452664
summary(vehiculos_circulacion2)
##      Año                Total           Automóviles      
##  Length:42          Min.   : 4010430   Min.   : 3950042  
##  Class :character   1st Qu.: 6748523   1st Qu.: 6654340  
##  Mode  :character   Median :11002046   Median :10764080  
##                     Mean   :14899354   Mean   :14673142  
##                     3rd Qu.:22392796   3rd Qu.:22068938  
##                     Max.   :35913468   Max.   :35460804  
##  Camiones.para.pasajeros
##  Min.   : 60388         
##  1st Qu.: 90931         
##  Median :233490         
##  Mean   :226212         
##  3rd Qu.:336420         
##  Max.   :461089

Se eliminan estos renglones, debido a que no tenían contenido, es decir, eran considerados NA´s.

Gráfica

plot(vehiculos_circulacion2$Año,vehiculos_circulacion2$Total, type="l",col="blue", lwd=1.5, xlab ="Año",ylab ="Unidades", main = "Vehiculos de motor en circulación registrados anualmente")
lines(vehiculos_circulacion2$Año,vehiculos_circulacion2$Automóviles,col="red",lty=3)
legend("topleft", legend=c("Total de vehiculos en circulación", "Automóviles en circulación"),
       col=c("blue", "red"), lty = 1:2, cex=0.8)

Con la ayuda de este gráfico, es fácil ver cómo se comportan las variables y comparar cuántos automóviles se han producido en general a lo largo de los años, Dado que ambas líneas son bastante similares entre sí y están ubicadas muy cerca una de la otra, se puede inferir que el porcentaje de automóviles en el total es el más grande. Por otro lado, el gráfico muestra una tendencia generalmente creciente y positiva, es decir, cada año se conducen más automóviles.

Forecasting usando el Modelo autoregresivo

autoregressive_model <- arma(vehiculos_circulacion2$Total, order = c(1,0))
## Warning in arma(vehiculos_circulacion2$Total, order = c(1, 0)): Hessian
## negative-semidefinite
summary(autoregressive_model <- arma(vehiculos_circulacion2$Total, order = c(1,0)))
## Warning in arma(vehiculos_circulacion2$Total, order = c(1, 0)): Hessian
## negative-semidefinite
## Warning in sqrt(diag(object$vcov)): NaNs produced

## Warning in sqrt(diag(object$vcov)): NaNs produced
## 
## Call:
## arma(x = vehiculos_circulacion2$Total, order = c(1, 0))
## 
## Model:
## ARMA(1,0)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -964598 -203485  -37324  133579 1366807 
## 
## Coefficient(s):
##            Estimate  Std. Error  t value Pr(>|t|)    
## ar1       1.043e+00   3.792e-03      275   <2e-16 ***
## intercept 1.595e+05         NaN      NaN      NaN    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Fit:
## sigma^2 estimated as 1.852e+11,  Conditional Sum-of-Squares = 7.406257e+12,  AIC = 1212.86
autoregressive_model_forecast<-forecast(autoregressive_model$fitted,h=5,level=c(95))
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
autoregressive_model_forecast
##    Point Forecast    Lo 95    Hi 95
## 43       37884281 35240406 40528155
## 44       39222087 34802632 43641541
## 45       40559893 34284299 46835486
## 46       41897698 33625820 50169577
## 47       43235504 32811356 53659653

Como se mencionó anteriormente, se observa una tendencia positiva en el modelo autoregresivo del número de vehículos automotores en uso y el pronóstico para los próximos años. Por ejemplo, un nivel de confianza del 95% predice que 37884281 vehículos estarán en uso el próximo año, con rangos entre 35240406 y 40528155. Se pronostican 39 222 087 automóviles para el próximo año y 40 559 893 vehículos para los siguientes tres años.

Gráfica

plot(autoregressive_model_forecast)

Se puede comprender en el plot que la línea negra representa los datos en la base de datos, mientras que la línea azul representa la salida de los datos obtenidos mediante el modelo autorregresivo. Está claro a partir de la línea azul que la tendencia esta ascendiendo. En donde los valores “bajo” y “alto” con un 95% de confianza se muestran sombreados en gris en la línea azul

Forecasting usando Moving Average Model

mam_circulacion <- arma(vehiculos_circulacion2$Total,order = c(1,1))
summary(mam_circulacion <- arma(vehiculos_circulacion2$Total,order = c(1,1)))
## 
## Call:
## arma(x = vehiculos_circulacion2$Total, order = c(1, 1))
## 
## Model:
## ARMA(1,1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -907766 -184323  -41323  113291 1305470 
## 
## Coefficient(s):
##            Estimate  Std. Error  t value Pr(>|t|)    
## ar1       1.042e+00   4.680e-03  222.585  < 2e-16 ***
## ma1       3.442e-01   1.237e-01    2.783  0.00539 ** 
## intercept 1.767e+05         NaN      NaN      NaN    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Fit:
## sigma^2 estimated as 1.598e+11,  Conditional Sum-of-Squares = 6.391897e+12,  AIC = 1208.67
mam_circulacion_forecast <- forecast(mam_circulacion$fitted,h=5,level=c(95))
mam_circulacion_forecast
##    Point Forecast    Lo 95    Hi 95
## 43       37635019 34318781 40951258
## 44       38948870 33832084 44065655
## 45       40262720 33315250 47210190
## 46       41576570 32704146 50448994
## 47       42890421 31977035 53803806

Podemos determinar que estamos buscando un modelo no estacionario, uno que siempre se está moviendo. Al igual que el modelo autorregresivo, tiene una tendencia positiva, tiene un 95% de confianza. Por otra parte, se pronostica que durante el primer período de tiempo habrá 37.635.019 automóviles en circulación, seguido de 38948870 y 40262720.

Gráfica

plot(mam_circulacion_forecast)

Aquí se puede interpretar gráficamente lo explicado en el punto anterior, y se obseva como la tendencia es positiva.

Desempeño de 1 de las áreas de la empresa FORM para los siguientes 3 periodos de tiempo

Producción FORM

Entender la base de datos

summary(produccion)
##     fecha             cliente           piezas_prog      tmo_min      
##  Length:3988        Length:3988        Min.   :   0   Min.   :  0.00  
##  Class :character   Class :character   1st Qu.:   0   1st Qu.: 15.00  
##  Mode  :character   Mode  :character   Median :  51   Median : 20.00  
##                                        Mean   : 102   Mean   : 21.88  
##                                        3rd Qu.: 184   3rd Qu.: 25.00  
##                                        Max.   :1263   Max.   :150.00  
##  estacion_arranque  laminas_procesadas tiempo_calidad  
##  Length:3988        Min.   :   0       Min.   : 0.000  
##  Class :character   1st Qu.:   0       1st Qu.: 1.000  
##  Mode  :character   Median :  51       Median : 1.000  
##                     Mean   : 102       Mean   : 0.875  
##                     3rd Qu.: 184       3rd Qu.: 1.000  
##                     Max.   :1263       Max.   :22.000
str(produccion)
## 'data.frame':    3988 obs. of  7 variables:
##  $ fecha             : chr  "2022-07-16" "2022-07-22" "2022-07-28" "2022-08-12" ...
##  $ cliente           : chr  "TRMX" "STABILUS 3" "STABILUS 3" "TRMX" ...
##  $ piezas_prog       : int  3 2 2 1 1 1 0 3 0 0 ...
##  $ tmo_min           : int  10 10 10 10 10 10 20 10 10 10 ...
##  $ estacion_arranque : chr  "C1Y2" "C1Y2" "C1Y2" "C1" ...
##  $ laminas_procesadas: int  3 2 2 1 1 1 0 3 0 0 ...
##  $ tiempo_calidad    : num  1 1 2 1 1 1 0 1 0 0 ...

Limpieza de datos

Eliminar NA´s

produccion$cliente <- as.factor(produccion$cliente)
str(produccion)
## 'data.frame':    3988 obs. of  7 variables:
##  $ fecha             : chr  "2022-07-16" "2022-07-22" "2022-07-28" "2022-08-12" ...
##  $ cliente           : Factor w/ 13 levels "","DENSO","HANON SYSTEMS",..: 9 7 7 9 9 2 2 4 4 4 ...
##  $ piezas_prog       : int  3 2 2 1 1 1 0 3 0 0 ...
##  $ tmo_min           : int  10 10 10 10 10 10 20 10 10 10 ...
##  $ estacion_arranque : chr  "C1Y2" "C1Y2" "C1Y2" "C1" ...
##  $ laminas_procesadas: int  3 2 2 1 1 1 0 3 0 0 ...
##  $ tiempo_calidad    : num  1 1 2 1 1 1 0 1 0 0 ...
summary(produccion)
##     fecha                 cliente      piezas_prog      tmo_min      
##  Length:3988        STABILUS 1:1343   Min.   :   0   Min.   :  0.00  
##  Class :character   TRMX      : 686   1st Qu.:   0   1st Qu.: 15.00  
##  Mode  :character   STABILUS 3: 599   Median :  51   Median : 20.00  
##                     YANFENG   : 431   Mean   : 102   Mean   : 21.88  
##                     DENSO     : 400   3rd Qu.: 184   3rd Qu.: 25.00  
##                     (Other)   : 528   Max.   :1263   Max.   :150.00  
##                     NA's      :   1                                  
##  estacion_arranque  laminas_procesadas tiempo_calidad  
##  Length:3988        Min.   :   0       Min.   : 0.000  
##  Class :character   1st Qu.:   0       1st Qu.: 1.000  
##  Mode  :character   Median :  51       Median : 1.000  
##                     Mean   : 102       Mean   : 0.875  
##                     3rd Qu.: 184       3rd Qu.: 1.000  
##                     Max.   :1263       Max.   :22.000  
## 
produccion1 <- produccion 
produccion1<-  produccion1[-c(624),] 
summary (produccion1)
##     fecha                 cliente      piezas_prog      tmo_min      
##  Length:3987        STABILUS 1:1342   Min.   :   0   Min.   :  0.00  
##  Class :character   TRMX      : 686   1st Qu.:   0   1st Qu.: 15.00  
##  Mode  :character   STABILUS 3: 599   Median :  51   Median : 20.00  
##                     YANFENG   : 431   Mean   : 102   Mean   : 21.88  
##                     DENSO     : 400   3rd Qu.: 184   3rd Qu.: 25.00  
##                     (Other)   : 528   Max.   :1263   Max.   :150.00  
##                     NA's      :   1                                  
##  estacion_arranque  laminas_procesadas tiempo_calidad   
##  Length:3987        Min.   :   0       Min.   : 0.0000  
##  Class :character   1st Qu.:   0       1st Qu.: 1.0000  
##  Mode  :character   Median :  51       Median : 1.0000  
##                     Mean   : 102       Mean   : 0.8749  
##                     3rd Qu.: 184       3rd Qu.: 1.0000  
##                     Max.   :1263       Max.   :22.0000  
## 

Dado que se consideró vital mantener estos datos para ilustrar mejor los datos, se eliminaron las NA que no son relevantes, mientras que otras de la base de datos con el término “sin registro” se sustituyeron.

Forecasting usando el Modelo autoregresivo

autoregressive_model_produccion <- arma(produccion1$piezas_prog, order = c(1,0))
summary(autoregressive_model_produccion <- arma(produccion1$piezas_prog, order = c(1,0)))
## 
## Call:
## arma(x = produccion1$piezas_prog, order = c(1, 0))
## 
## Model:
## ARMA(1,0)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -646.15  -52.78  -30.12   50.73 1191.22 
## 
## Coefficient(s):
##            Estimate  Std. Error  t value Pr(>|t|)    
## ar1         0.48281     0.01387    34.81   <2e-16 ***
## intercept  52.77607     2.34024    22.55   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Fit:
## sigma^2 estimated as 13852,  Conditional Sum-of-Squares = 55201381,  AIC = 49339.47
autoregressive_model_produccion_forecast<-forecast(autoregressive_model_produccion$fitted,h=5,level=c(95))
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
autoregressive_model_produccion_forecast
##      Point Forecast    Lo 95    Hi 95
## 3988        82.5431 3.177020 161.9092
## 3989        82.5431 3.134573 161.9516
## 3990        82.5431 3.092141 161.9941
## 3991        82.5431 3.049722 162.0365
## 3992        82.5431 3.007317 162.0789

Dado que ambos coeficientes en este modelo autorregresivo tienen tres asteriscos, son extremadamente importantes para la base de datos. Por otro lado, a la hora de hacer un pronóstico, es bien sabido que se supone que se mantiene igual, es decir, con las mismas piezas programadas, pero se puede observar como mientras “Bajo” disminuye, “Alto” aumenta.

Gráfica

plot(autoregressive_model_produccion_forecast)

Como se puede ver en el plot, no se espera una mejora para este modelo, y se pueden ver los forecast, el low y el high, con 95% de confianza.

Forecasting usando Moving Average Model

mam_produccion <- arma(produccion1$piezas_prog,order = c(1,1))
summary(mam_produccion <- arma(produccion1$piezas_prog,order = c(1,1)))
## 
## Call:
## arma(x = produccion1$piezas_prog, order = c(1, 1))
## 
## Model:
## ARMA(1,1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -792.01  -53.39  -22.47   37.71 1208.96 
## 
## Coefficient(s):
##            Estimate  Std. Error  t value Pr(>|t|)    
## ar1         0.83898     0.02365   35.476  < 2e-16 ***
## ma1        -0.51983     0.04199  -12.381  < 2e-16 ***
## intercept  16.45529     2.56687    6.411 1.45e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Fit:
## sigma^2 estimated as 13435,  Conditional Sum-of-Squares = 53537644,  AIC = 49219.45
mam_produccion_forecast <- forecast(mam_produccion$fitted,h=5,level=c(95))
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
mam_produccion_forecast
##      Point Forecast     Lo 95    Hi 95
## 3988       165.7197 90.126377 241.3129
## 3989       165.7197 59.559207 271.8801
## 3990       165.7197 36.005593 295.4337
## 3991       165.7197 16.115393 315.3239
## 3992       165.7197 -1.424392 332.8637

El comportamiento de este modelo predice que no habrá cambios en los próximos años con un nivel de confianza del 95%, pero si uno observa marcos de tiempo pequeños, el cambio de un período de tiempo a otro es dramático y está disminuyendo, mientras que en marcos de tiempo más altos, el comportamiento es variada porque a veces sube y otras baja sin tendencia a continuar.

Gráfica

plot(mam_produccion_forecast)

Se puede observar que no existe una tendencia específica.

Tendencia de rendimiento durante el transcurso del análisis y los 3 períodos de tiempo posteriores: El modelo de estimación de pronóstico sugiere que la tendencia es buena con respecto a los datos externos, a saber, la industria del automóvil, lo que indica que hay un 95% nivel de confianza en la predicción de que habrá más automóviles en las calles cada año. Los datos antes mencionados son ventajosos para FORM porque sugieren que si hay más automóviles en la carretera, habrá más producción, lo que generará más pedidos y clientes; sin embargo, en la base de datos obtenida directamente de FORM, se observa que en algunos casos, no hay tendencia, y se esperan las mismas partes programadas como pronóstico; por lo tanto, se debe implementar una estrategia para que más personas conozcan y participen en las actividades de la empresa.

Predicción del Desempeño de la Industria Automotriz

Exportación y ventas de vehículos ligeros

Entender la base de datos

summary(bd_prediccion)
##       Año            Mes            Venta          Producción    
##  Min.   :2006   Min.   : 1.00   Min.   : 34927   Min.   :  3722  
##  1st Qu.:2010   1st Qu.: 3.00   1st Qu.: 78543   1st Qu.:189031  
##  Median :2014   Median : 6.00   Median : 88580   Median :248433  
##  Mean   :2014   Mean   : 6.42   Mean   : 94178   Mean   :241511  
##  3rd Qu.:2018   3rd Qu.: 9.00   3rd Qu.:110134   3rd Qu.:292709  
##  Max.   :2022   Max.   :12.00   Max.   :192741   Max.   :382110  
##  NA's   :2      NA's   :2       NA's   :2        NA's   :2       
##   Exportación     Tipo.de.cambio    Inflación      porcentaje_ocu 
##  Min.   : 15139   Min.   :10.09   Min.   :-0.250   Min.   :93.58  
##  1st Qu.:153219   1st Qu.:12.66   1st Qu.: 0.815   1st Qu.:95.06  
##  Median :209160   Median :13.56   Median : 1.480   Median :95.88  
##  Mean   :201664   Mean   :15.48   Mean   : 1.951   Mean   :95.76  
##  3rd Qu.:243900   3rd Qu.:19.10   3rd Qu.: 2.895   3rd Qu.:96.47  
##  Max.   :327454   Max.   :24.24   Max.   : 7.360   Max.   :97.16  
##  NA's   :2        NA's   :2       NA's   :2        NA's   :2      
##  porcentaje_desocu conf_consumidor
##  Min.   :2.840     Min.   :28.67  
##  1st Qu.:3.527     1st Qu.:36.69  
##  Median :4.125     Median :38.47  
##  Mean   :4.244     Mean   :39.15  
##  3rd Qu.:4.940     3rd Qu.:42.59  
##  Max.   :6.420     Max.   :47.83  
##  NA's   :2         NA's   :2
str(bd_prediccion)
## 'data.frame':    202 obs. of  10 variables:
##  $ Año              : int  2006 2006 2006 2006 2006 2006 2006 2006 2006 2006 ...
##  $ Mes              : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Venta            : int  96227 89079 96871 77879 86462 87084 83069 90937 92083 97469 ...
##  $ Producción       : int  155291 166830 192643 132212 171557 194327 118602 179527 164577 179897 ...
##  $ Exportación      : int  112165 121001 153877 115798 131578 156008 85752 136114 125918 132470 ...
##  $ Tipo.de.cambio   : num  10.6 10.5 10.7 11 11.1 ...
##  $ Inflación        : num  0.59 0.74 0.87 1.01 0.56 0.65 0.93 1.44 2.47 2.91 ...
##  $ porcentaje_ocu   : num  96.5 96.2 96.7 96.8 97.2 ...
##  $ porcentaje_desocu: num  3.48 3.75 3.31 3.2 2.84 3.26 4.01 3.87 4 3.82 ...
##  $ conf_consumidor  : num  43.9 43.9 45.6 44.8 44.7 ...

Limpieza de datos

Eliminar columnas irrelevantes (Producción)

bd_prediccion1 <- subset(bd_prediccion, select = -c (Producción))
bd_prediccion1
##      Año Mes  Venta Exportación Tipo.de.cambio Inflación porcentaje_ocu
## 1   2006   1  96227      112165       10.56964      0.59          96.52
## 2   2006   2  89079      121001       10.48426      0.74          96.25
## 3   2006   3  96871      153877       10.69772      0.87          96.69
## 4   2006   4  77879      115798       11.02994      1.01          96.80
## 5   2006   5  86462      131578       11.07152      0.56          97.16
## 6   2006   6  87084      156008       11.38702      0.65          96.74
## 7   2006   7  83069       85752       11.03922      0.93          95.99
## 8   2006   8  90937      136114       10.87617      1.44          96.13
## 9   2006   9  92083      125918       10.97558      2.47          96.00
## 10  2006  10  97469      132470       10.91245      2.91          96.18
## 11  2006  11 102201      152396       10.87905      3.45          96.50
## 12  2006  12 140375      113718       10.87084      4.05          96.68
## 13  2007   1  97675       88915       10.93192      0.52          95.95
## 14  2007   2  86060      111084       10.98198      0.80          95.95
## 15  2007   3  96487      138877       11.12237      1.02          96.27
## 16  2007   4  75020      110462       10.99081      0.96          96.49
## 17  2007   5  84756      140387       10.83582      0.46          96.85
## 18  2007   6  80462      153243       10.83519      0.58          96.72
## 19  2007   7  83105      129581       10.79959      1.01          96.21
## 20  2007   8  88573      168210       11.04243      1.42          96.17
## 21  2007   9  86547      156237       11.03762      2.21          96.24
## 22  2007  10  97182      144970       10.84063      2.61          96.23
## 23  2007  11  97694      149964       10.85821      3.33          96.65
## 24  2007  12 126329      121383       10.85206      3.76          96.89
## 25  2008   1  96846      118416       10.91741      0.46          95.88
## 26  2008   2  86997      140501       10.78461      0.76          96.11
## 27  2008   3  80119      129405       10.73085      1.49          96.39
## 28  2008   4  83106      144234       10.52556      1.72          96.52
## 29  2008   5  85827      150514       10.45804      1.61          96.71
## 30  2008   6  81424      153345       10.32862      2.03          96.63
## 31  2008   7  85324      122144       10.23761      2.60          95.87
## 32  2008   8  86119      143464       10.09196      3.20          95.94
## 33  2008   9  76620      144454       10.60434      3.90          95.86
## 34  2008  10  83307      167497       12.48947      4.61          95.83
## 35  2008  11  78555      138439       13.09469      5.80          95.68
## 36  2008  12 101300      109206       13.37363      6.53          95.98
## 37  2009   1  69664       51061       13.86394      0.23          94.99
## 38  2009   2  61579       77833       14.50219      0.45          94.76
## 39  2009   3  64242      101830       14.72083      1.03          95.34
## 40  2009   4  51395       85121       13.47903      1.38          94.94
## 41  2009   5  53440       83910       13.25065      1.09          94.77
## 42  2009   6  55974       84934       13.34374      1.28          95.02
## 43  2009   7  56443       90872       13.36679      1.55          94.18
## 44  2009   8  58926      111273       13.01394      1.79          93.85
## 45  2009   9  58505      117433       13.40757      2.30          93.58
## 46  2009  10  67882      145761       13.25259      2.61          94.33
## 47  2009  11  64914      134873       13.13145      3.15          94.89
## 48  2009  12  91961      138432       12.85556      3.57          95.27
## 49  2010   1  64064      114193       12.83263      1.09          94.24
## 50  2010   2  59518      153148       12.96185      1.67          94.72
## 51  2010   3  65414      163641       12.60465      2.39          95.26
## 52  2010   4  60432      133406       12.26208      2.07          94.65
## 53  2010   5  61632      145909       12.68247      1.42          95.00
## 54  2010   6  59910      177575       12.71818      1.39          95.08
## 55  2010   7  61960      143521       12.83341      1.61          94.41
## 56  2010   8  66931      175904       12.72952      1.89          94.58
## 57  2010   9  65934      169507       12.86421      2.43          94.34
## 58  2010  10  74095      166931       12.45569      3.06          94.52
## 59  2010  11  75582      168226       12.31381      3.89          94.83
## 60  2010  12 104941      147551       12.40058      4.40          95.06
## 61  2011   1  68767      165045       12.15321      0.49          94.66
## 62  2011   2  66990      155808       12.07712      0.86          94.66
## 63  2011   3  75125      192783       12.01917      1.06          95.36
## 64  2011   4  65246      141334       11.75536      1.05          94.87
## 65  2011   5  68634      176951       11.65234      0.30          94.82
## 66  2011   6  68366      188223       11.80157      0.30          94.60
## 67  2011   7  68533      196835       11.67069      0.78          94.52
## 68  2011   8  75681      170086       12.20000      0.94          94.29
## 69  2011   9  73998      193590       13.08912      1.19          94.57
## 70  2011  10  75748      192244       13.46868      1.87          95.01
## 71  2011  11  83107      199665       13.63712      2.97          95.04
## 72  2011  12 115698      171319       13.74813      3.82          95.49
## 73  2012   1  75297      156417       13.48802      0.71          95.12
## 74  2012   2  74704      197600       12.80356      0.91          94.72
## 75  2012   3  83574      226555       12.75781      0.97          95.48
## 76  2012   4  69890      180545       13.02576      0.65          95.14
## 77  2012   5  80268      184302       13.53816      0.34          95.33
## 78  2012   6  78508      229089       13.97611      0.80          95.25
## 79  2012   7  76378      208151       13.39195      1.36          95.01
## 80  2012   8  83326      188392       13.18333      1.67          94.67
## 81  2012   9  79961      193350       13.00449      2.12          95.09
## 82  2012  10  83172      216576       12.86915      2.63          94.97
## 83  2012  11  91966      219864       12.86915      3.33          94.95
## 84  2012  12 110998      154724       12.87298      3.57          95.60
## 85  2013   1  84403      178562       12.71282      0.40          94.59
## 86  2013   2  80285      175338       12.71638      0.90          95.25
## 87  2013   3  82860      204475       12.40242      1.64          95.52
## 88  2013   4  83647      185548       12.21560      1.70          95.04
## 89  2013   5  87638      191205       12.23945      1.37          95.09
## 90  2013   6  83858      225753       12.95020      1.30          95.00
## 91  2013   7  86760      192940       12.76920      1.27          94.87
## 92  2013   8  88586      226893       12.88348      1.56          94.82
## 93  2013   9  78555      215962       13.08974      1.94          94.69
## 94  2013  10  88416      240316       13.02170      2.43          94.99
## 95  2013  11 100571      224873       13.06409      3.38          95.52
## 96  2013  12 119519      161208       13.00105      3.97          95.73
## 97  2014   1  85614      177928       13.20104      0.89          94.93
## 98  2014   2  80037      197504       13.29067      1.15          95.34
## 99  2014   3  85767      230772       13.21485      1.43          95.20
## 100 2014   4  76941      202328       13.07712      1.24          95.15
## 101 2014   5  88388      234629       12.95623      0.91          95.06
## 102 2014   6  84207      230410       12.97570      1.09          95.18
## 103 2014   7  96366      231934       12.97300      1.37          94.53
## 104 2014   8 103994      226757       13.15002      1.73          94.81
## 105 2014   9  89313      220239       13.21131      2.18          94.91
## 106 2014  10 101090      257382       13.47454      2.74          95.22
## 107 2014  11 111837      237923       13.59030      3.57          95.47
## 108 2014  12 133411      195091       14.45304      4.08          96.24
## 109 2015   1 103805      204907       14.67395     -0.09          95.49
## 110 2015   2  97659      222351       14.90437      0.10          95.67
## 111 2015   3 105034      261256       15.20997      0.51          96.14
## 112 2015   4  94953      233515       15.22746      0.25          95.69
## 113 2015   5 102156      240709       15.25361     -0.25          95.55
## 114 2015   6 107097      242720       15.45056     -0.09          95.59
## 115 2015   7 111863      226511       15.87623      0.06          95.28
## 116 2015   8 112307      234668       16.50888      0.27          95.32
## 117 2015   9 111705      216587       16.83229      0.65          95.50
## 118 2015  10 120214      245224       16.59932      1.16          95.45
## 119 2015  11 126750      223797       16.63219      1.72          96.04
## 120 2015  12 160901      206651       17.01278      2.13          96.04
## 121 2016   1 119833      213244       17.94565      0.38          95.74
## 122 2016   2 111126      219670       18.45920      0.82          95.86
## 123 2016   3 117252      224184       17.67208      0.97          96.25
## 124 2016   4 118754      197020       17.48096      0.65          96.20
## 125 2016   5 121879      226240       18.05380      0.20          95.99
## 126 2016   6 134913      247005       18.62127      0.31          96.08
## 127 2016   7 132109      225530       18.58811      0.57          96.00
## 128 2016   8 134388      262673       18.46011      0.86          96.02
## 129 2016   9 131888      235612       19.11921      1.47          95.88
## 130 2016  10 137503      255115       18.97319      2.09          96.33
## 131 2016  11 154779      245330       19.96946      2.89          96.50
## 132 2016  12 192741      216645       20.54282      3.36          96.62
## 133 2017   1 123447      219061       21.39550      1.70          96.40
## 134 2017   2 118193      248288       20.35246      2.29          96.66
## 135 2017   3 137245      305403       19.41648      2.92          96.81
## 136 2017   4 114938      240141       18.78122      3.04          96.53
## 137 2017   5 123429      269067       18.79971      2.92          96.45
## 138 2017   6 127752      287979       18.20815      3.18          96.71
## 139 2017   7 122678      258557       17.85459      3.57          96.58
## 140 2017   8 125985      276108       17.80650      4.08          96.48
## 141 2017   9 116716      286400       17.80554      4.41          96.41
## 142 2017  10 123602      303514       18.71362      5.06          96.49
## 143 2017  11 141724      290569       18.98973      6.15          96.59
## 144 2017  12 159234      268772       19.10129      6.77          96.85
## 145 2018   1 109445      231088       19.02896      0.53          96.64
## 146 2018   2 109846      271228       18.61594      0.91          96.83
## 147 2018   3 119127      317398       18.65489      1.24          97.06
## 148 2018   4 109748      271048       18.34659      0.90          96.61
## 149 2018   5 115155      288659       19.45515      0.73          96.78
## 150 2018   6 120298      315130       20.31281      1.12          96.63
## 151 2018   7 115047      247367       19.09664      1.66          96.53
## 152 2018   8 119487      322779       18.80423      2.26          96.54
## 153 2018   9 114888      306009       19.03592      2.69          96.42
## 154 2018  10 117602      313471       19.09212      3.22          96.73
## 155 2018  11 134143      291018       20.25495      4.10          96.75
## 156 2018  12 142300      275962       20.15294      4.83          96.64
## 157 2019   1 111514      243652       19.22744      0.09          96.44
## 158 2019   2 104009      273173       19.18334      0.06          96.71
## 159 2019   3 117529      325703       19.24878      0.44          96.78
## 160 2019   4  98366      288756       19.01630      0.50          96.50
## 161 2019   5 102422      309017       19.09191      0.21          96.50
## 162 2019   6 106782      327454       19.26678      0.27          96.43
## 163 2019   7 106104      276818       19.06189      0.65          96.26
## 164 2019   8 108074      286075       19.58659      0.63          96.29
## 165 2019   9 100757      286806       19.60990      0.89          96.22
## 166 2019  10 107110      259158       19.36886      1.44          96.31
## 167 2019  11 124804      274845       19.30748      2.26          96.58
## 168 2019  12 130460      236848       19.16932      2.83          97.09
## 169 2020   1 104852      238749       18.81445      0.48          96.22
## 170 2020   2 104338      273634       18.77705      0.90          96.47
## 171 2020   3  87541      295199       21.97384      0.85          97.09
## 172 2020   4  34927       31183       24.23988     -0.17          95.31
## 173 2020   5  42034       15139       23.58032      0.22          95.81
## 174 2020   6  62861      198084       22.26918      0.76          94.51
## 175 2020   7  72921      264520       22.48030      1.43          94.65
## 176 2020   8  77120      264478       22.23107      1.82          94.74
## 177 2020   9  77808      257562       21.60516      2.06          94.87
## 178 2020  10  84351      280474       21.38085      2.68          95.29
## 179 2020  11  95707      287703       20.53330      2.76          95.65
## 180 2020  12 105603      275081       19.97817      3.15          96.21
## 181 2021   1  81657      223533       19.90262      0.86          95.30
## 182 2021   2  82863      213987       20.29248      1.50          95.60
## 183 2021   3  96319      256119       20.76205      2.34          96.13
## 184 2021   4  84287      234584       20.10944      2.67          95.35
## 185 2021   5  86710      242020       20.05320      2.88          96.01
## 186 2021   6  88688      234394       20.04272      3.43          95.98
## 187 2021   7  82157      202021       19.98552      4.04          95.62
## 188 2021   8  78235      212687       20.05125      4.24          95.67
## 189 2021   9  76930      195294       19.99092      4.88          95.82
## 190 2021  10  76640      224535       20.47244      5.76          96.05
## 191 2021  11  82829      240341       20.78256      6.97          96.34
## 192 2021  12  97420      227465       20.98530      7.36          96.49
## 193 2022   1  78585      216630       20.48354      0.59          96.29
## 194 2022   2  79598      201868       20.48437      1.43          96.26
## 195 2022   3  95199      262494       20.60089      2.43          97.03
## 196 2022   4  83459      241286       20.04452      2.98          96.97
## 197 2022   5  91215      244643       20.11331      3.17          96.73
## 198 2022   6  90368      237674       19.96650      4.04          96.65
## 199 2022   7  83137      210170       20.53081      4.81          96.57
## 200 2022   8  91124      248704       20.12613      5.54          96.47
## 201   NA  NA     NA          NA             NA        NA             NA
## 202   NA  NA     NA          NA             NA        NA             NA
##     porcentaje_desocu conf_consumidor
## 1                3.48         43.9415
## 2                3.75         43.9100
## 3                3.31         45.6029
## 4                3.20         44.7854
## 5                2.84         44.6508
## 6                3.26         44.2339
## 7                4.01         44.8674
## 8                3.87         45.0383
## 9                4.00         45.0604
## 10               3.82         44.3016
## 11               3.50         43.1883
## 12               3.32         44.7871
## 13               4.05         42.7412
## 14               4.05         42.3778
## 15               3.73         43.5677
## 16               3.51         43.4415
## 17               3.15         43.7534
## 18               3.28         43.0694
## 19               3.79         42.9629
## 20               3.83         43.9863
## 21               3.76         43.0238
## 22               3.77         41.2666
## 23               3.35         40.8568
## 24               3.11         42.8202
## 25               4.12         42.1822
## 26               3.89         41.2208
## 27               3.61         41.8964
## 28               3.48         40.1531
## 29               3.29         38.9120
## 30               3.37         37.6903
## 31               4.13         36.7035
## 32               4.06         37.2616
## 33               4.14         36.6558
## 34               4.17         34.2078
## 35               4.32         34.9500
## 36               4.02         34.9987
## 37               5.01         34.4084
## 38               5.24         33.4023
## 39               4.66         33.4728
## 40               5.06         34.6003
## 41               5.23         33.1933
## 42               4.98         34.2256
## 43               5.82         36.0502
## 44               6.15         34.5306
## 45               6.42         34.4993
## 46               5.67         32.6096
## 47               5.11         33.1707
## 48               4.73         33.9865
## 49               5.76         34.8020
## 50               5.28         34.2586
## 51               4.74         34.6691
## 52               5.35         35.0361
## 53               5.00         35.5938
## 54               4.92         36.7799
## 55               5.59         36.9279
## 56               5.42         37.2006
## 57               5.66         38.3303
## 58               5.48         37.4086
## 59               5.17         37.1774
## 60               4.94         38.1767
## 61               5.34         38.4624
## 62               5.34         38.4413
## 63               4.64         38.3233
## 64               5.13         37.6265
## 65               5.18         37.3597
## 66               5.40         38.7674
## 67               5.48         39.7537
## 68               5.71         38.9023
## 69               5.43         38.4823
## 70               4.99         37.7094
## 71               4.96         37.4238
## 72               4.51         37.7149
## 73               4.88         39.3604
## 74               5.28         38.9804
## 75               4.52         38.8750
## 76               4.86         40.2245
## 77               4.67         39.7323
## 78               4.75         39.7133
## 79               4.99         41.1478
## 80               5.33         40.7832
## 81               4.91         39.3550
## 82               5.03         39.6293
## 83               5.05         39.1214
## 84               4.40         41.1395
## 85               5.41         41.6134
## 86               4.75         39.6882
## 87               4.48         39.9339
## 88               4.96         39.8361
## 89               4.91         39.4471
## 90               5.00         38.7706
## 91               5.13         40.6562
## 92               5.18         40.5308
## 93               5.31         39.1825
## 94               5.01         38.0775
## 95               4.48         36.9465
## 96               4.27         37.3707
## 97               5.07         35.5508
## 98               4.66         35.7346
## 99               4.80         37.1351
## 100              4.85         37.6101
## 101              4.94         37.7513
## 102              4.82         37.9049
## 103              5.47         37.5518
## 104              5.19         37.4502
## 105              5.09         38.2199
## 106              4.78         37.6935
## 107              4.53         38.4760
## 108              3.76         38.6914
## 109              4.51         38.0625
## 110              4.33         37.4911
## 111              3.86         38.5052
## 112              4.31         37.8429
## 113              4.45         38.0317
## 114              4.41         39.1119
## 115              4.72         38.1319
## 116              4.68         37.3836
## 117              4.50         37.4490
## 118              4.55         37.8131
## 119              3.96         38.1829
## 120              3.96         38.3685
## 121              4.26         38.1815
## 122              4.14         36.7321
## 123              3.75         36.8144
## 124              3.80         36.7139
## 125              4.01         37.4848
## 126              3.92         38.3491
## 127              4.00         36.5060
## 128              3.98         35.6554
## 129              4.12         34.7550
## 130              3.67         35.0319
## 131              3.50         34.8752
## 132              3.38         35.4784
## 133              3.60         28.6679
## 134              3.34         31.5156
## 135              3.19         33.7951
## 136              3.47         34.9345
## 137              3.55         35.8733
## 138              3.29         36.0104
## 139              3.42         36.4886
## 140              3.52         36.5055
## 141              3.59         36.7879
## 142              3.51         36.4370
## 143              3.41         36.7168
## 144              3.15         36.3155
## 145              3.36         34.8018
## 146              3.17         34.1893
## 147              2.94         34.3367
## 148              3.39         35.6116
## 149              3.22         36.6479
## 150              3.37         37.1483
## 151              3.47         43.3411
## 152              3.46         43.0057
## 153              3.58         42.1327
## 154              3.27         42.5330
## 155              3.25         41.6750
## 156              3.36         44.8654
## 157              3.56         45.9299
## 158              3.29         47.8261
## 159              3.22         46.3411
## 160              3.50         45.4850
## 161              3.50         44.3235
## 162              3.57         43.6658
## 163              3.74         43.3177
## 164              3.71         43.8192
## 165              3.78         45.2995
## 166              3.69         44.0597
## 167              3.42         43.8407
## 168              2.91         43.7574
## 169              3.78         44.1205
## 170              3.53         43.3299
## 171              2.91         42.0593
## 172              4.69         32.2235
## 173              4.19         31.0682
## 174              5.49         31.9572
## 175              5.35         34.4173
## 176              5.26         35.0648
## 177              5.13         36.2820
## 178              4.71         37.8912
## 179              4.35         37.0767
## 180              3.79         38.7487
## 181              4.70         39.2114
## 182              4.40         38.6401
## 183              3.87         40.5816
## 184              4.65         42.5091
## 185              3.99         42.4227
## 186              4.02         44.3477
## 187              4.38         44.2934
## 188              4.33         42.4746
## 189              4.18         43.3421
## 190              3.95         43.8431
## 191              3.66         45.9354
## 192              3.51         44.8964
## 193              3.71         43.5909
## 194              3.74         42.9401
## 195              2.97         43.5603
## 196              3.03         44.3017
## 197              3.27         43.7823
## 198              3.35         43.2086
## 199              3.43         41.2699
## 200              3.53         40.2979
## 201                NA              NA
## 202                NA              NA

Esta columna se eliminará ya que las variables dependientes serán únicamente Ventas y Exportaciones, mientras que las variables independientes serán la confianza del consumidor, el tipo de cambio, la inflación, la proporción de ocupados y el porcentaje de desocupados que no están trabajando.

Eliminar renglones irrelevantes

bd_prediccion2 <- bd_prediccion1[-c(201, 202),]
bd_prediccion2
##      Año Mes  Venta Exportación Tipo.de.cambio Inflación porcentaje_ocu
## 1   2006   1  96227      112165       10.56964      0.59          96.52
## 2   2006   2  89079      121001       10.48426      0.74          96.25
## 3   2006   3  96871      153877       10.69772      0.87          96.69
## 4   2006   4  77879      115798       11.02994      1.01          96.80
## 5   2006   5  86462      131578       11.07152      0.56          97.16
## 6   2006   6  87084      156008       11.38702      0.65          96.74
## 7   2006   7  83069       85752       11.03922      0.93          95.99
## 8   2006   8  90937      136114       10.87617      1.44          96.13
## 9   2006   9  92083      125918       10.97558      2.47          96.00
## 10  2006  10  97469      132470       10.91245      2.91          96.18
## 11  2006  11 102201      152396       10.87905      3.45          96.50
## 12  2006  12 140375      113718       10.87084      4.05          96.68
## 13  2007   1  97675       88915       10.93192      0.52          95.95
## 14  2007   2  86060      111084       10.98198      0.80          95.95
## 15  2007   3  96487      138877       11.12237      1.02          96.27
## 16  2007   4  75020      110462       10.99081      0.96          96.49
## 17  2007   5  84756      140387       10.83582      0.46          96.85
## 18  2007   6  80462      153243       10.83519      0.58          96.72
## 19  2007   7  83105      129581       10.79959      1.01          96.21
## 20  2007   8  88573      168210       11.04243      1.42          96.17
## 21  2007   9  86547      156237       11.03762      2.21          96.24
## 22  2007  10  97182      144970       10.84063      2.61          96.23
## 23  2007  11  97694      149964       10.85821      3.33          96.65
## 24  2007  12 126329      121383       10.85206      3.76          96.89
## 25  2008   1  96846      118416       10.91741      0.46          95.88
## 26  2008   2  86997      140501       10.78461      0.76          96.11
## 27  2008   3  80119      129405       10.73085      1.49          96.39
## 28  2008   4  83106      144234       10.52556      1.72          96.52
## 29  2008   5  85827      150514       10.45804      1.61          96.71
## 30  2008   6  81424      153345       10.32862      2.03          96.63
## 31  2008   7  85324      122144       10.23761      2.60          95.87
## 32  2008   8  86119      143464       10.09196      3.20          95.94
## 33  2008   9  76620      144454       10.60434      3.90          95.86
## 34  2008  10  83307      167497       12.48947      4.61          95.83
## 35  2008  11  78555      138439       13.09469      5.80          95.68
## 36  2008  12 101300      109206       13.37363      6.53          95.98
## 37  2009   1  69664       51061       13.86394      0.23          94.99
## 38  2009   2  61579       77833       14.50219      0.45          94.76
## 39  2009   3  64242      101830       14.72083      1.03          95.34
## 40  2009   4  51395       85121       13.47903      1.38          94.94
## 41  2009   5  53440       83910       13.25065      1.09          94.77
## 42  2009   6  55974       84934       13.34374      1.28          95.02
## 43  2009   7  56443       90872       13.36679      1.55          94.18
## 44  2009   8  58926      111273       13.01394      1.79          93.85
## 45  2009   9  58505      117433       13.40757      2.30          93.58
## 46  2009  10  67882      145761       13.25259      2.61          94.33
## 47  2009  11  64914      134873       13.13145      3.15          94.89
## 48  2009  12  91961      138432       12.85556      3.57          95.27
## 49  2010   1  64064      114193       12.83263      1.09          94.24
## 50  2010   2  59518      153148       12.96185      1.67          94.72
## 51  2010   3  65414      163641       12.60465      2.39          95.26
## 52  2010   4  60432      133406       12.26208      2.07          94.65
## 53  2010   5  61632      145909       12.68247      1.42          95.00
## 54  2010   6  59910      177575       12.71818      1.39          95.08
## 55  2010   7  61960      143521       12.83341      1.61          94.41
## 56  2010   8  66931      175904       12.72952      1.89          94.58
## 57  2010   9  65934      169507       12.86421      2.43          94.34
## 58  2010  10  74095      166931       12.45569      3.06          94.52
## 59  2010  11  75582      168226       12.31381      3.89          94.83
## 60  2010  12 104941      147551       12.40058      4.40          95.06
## 61  2011   1  68767      165045       12.15321      0.49          94.66
## 62  2011   2  66990      155808       12.07712      0.86          94.66
## 63  2011   3  75125      192783       12.01917      1.06          95.36
## 64  2011   4  65246      141334       11.75536      1.05          94.87
## 65  2011   5  68634      176951       11.65234      0.30          94.82
## 66  2011   6  68366      188223       11.80157      0.30          94.60
## 67  2011   7  68533      196835       11.67069      0.78          94.52
## 68  2011   8  75681      170086       12.20000      0.94          94.29
## 69  2011   9  73998      193590       13.08912      1.19          94.57
## 70  2011  10  75748      192244       13.46868      1.87          95.01
## 71  2011  11  83107      199665       13.63712      2.97          95.04
## 72  2011  12 115698      171319       13.74813      3.82          95.49
## 73  2012   1  75297      156417       13.48802      0.71          95.12
## 74  2012   2  74704      197600       12.80356      0.91          94.72
## 75  2012   3  83574      226555       12.75781      0.97          95.48
## 76  2012   4  69890      180545       13.02576      0.65          95.14
## 77  2012   5  80268      184302       13.53816      0.34          95.33
## 78  2012   6  78508      229089       13.97611      0.80          95.25
## 79  2012   7  76378      208151       13.39195      1.36          95.01
## 80  2012   8  83326      188392       13.18333      1.67          94.67
## 81  2012   9  79961      193350       13.00449      2.12          95.09
## 82  2012  10  83172      216576       12.86915      2.63          94.97
## 83  2012  11  91966      219864       12.86915      3.33          94.95
## 84  2012  12 110998      154724       12.87298      3.57          95.60
## 85  2013   1  84403      178562       12.71282      0.40          94.59
## 86  2013   2  80285      175338       12.71638      0.90          95.25
## 87  2013   3  82860      204475       12.40242      1.64          95.52
## 88  2013   4  83647      185548       12.21560      1.70          95.04
## 89  2013   5  87638      191205       12.23945      1.37          95.09
## 90  2013   6  83858      225753       12.95020      1.30          95.00
## 91  2013   7  86760      192940       12.76920      1.27          94.87
## 92  2013   8  88586      226893       12.88348      1.56          94.82
## 93  2013   9  78555      215962       13.08974      1.94          94.69
## 94  2013  10  88416      240316       13.02170      2.43          94.99
## 95  2013  11 100571      224873       13.06409      3.38          95.52
## 96  2013  12 119519      161208       13.00105      3.97          95.73
## 97  2014   1  85614      177928       13.20104      0.89          94.93
## 98  2014   2  80037      197504       13.29067      1.15          95.34
## 99  2014   3  85767      230772       13.21485      1.43          95.20
## 100 2014   4  76941      202328       13.07712      1.24          95.15
## 101 2014   5  88388      234629       12.95623      0.91          95.06
## 102 2014   6  84207      230410       12.97570      1.09          95.18
## 103 2014   7  96366      231934       12.97300      1.37          94.53
## 104 2014   8 103994      226757       13.15002      1.73          94.81
## 105 2014   9  89313      220239       13.21131      2.18          94.91
## 106 2014  10 101090      257382       13.47454      2.74          95.22
## 107 2014  11 111837      237923       13.59030      3.57          95.47
## 108 2014  12 133411      195091       14.45304      4.08          96.24
## 109 2015   1 103805      204907       14.67395     -0.09          95.49
## 110 2015   2  97659      222351       14.90437      0.10          95.67
## 111 2015   3 105034      261256       15.20997      0.51          96.14
## 112 2015   4  94953      233515       15.22746      0.25          95.69
## 113 2015   5 102156      240709       15.25361     -0.25          95.55
## 114 2015   6 107097      242720       15.45056     -0.09          95.59
## 115 2015   7 111863      226511       15.87623      0.06          95.28
## 116 2015   8 112307      234668       16.50888      0.27          95.32
## 117 2015   9 111705      216587       16.83229      0.65          95.50
## 118 2015  10 120214      245224       16.59932      1.16          95.45
## 119 2015  11 126750      223797       16.63219      1.72          96.04
## 120 2015  12 160901      206651       17.01278      2.13          96.04
## 121 2016   1 119833      213244       17.94565      0.38          95.74
## 122 2016   2 111126      219670       18.45920      0.82          95.86
## 123 2016   3 117252      224184       17.67208      0.97          96.25
## 124 2016   4 118754      197020       17.48096      0.65          96.20
## 125 2016   5 121879      226240       18.05380      0.20          95.99
## 126 2016   6 134913      247005       18.62127      0.31          96.08
## 127 2016   7 132109      225530       18.58811      0.57          96.00
## 128 2016   8 134388      262673       18.46011      0.86          96.02
## 129 2016   9 131888      235612       19.11921      1.47          95.88
## 130 2016  10 137503      255115       18.97319      2.09          96.33
## 131 2016  11 154779      245330       19.96946      2.89          96.50
## 132 2016  12 192741      216645       20.54282      3.36          96.62
## 133 2017   1 123447      219061       21.39550      1.70          96.40
## 134 2017   2 118193      248288       20.35246      2.29          96.66
## 135 2017   3 137245      305403       19.41648      2.92          96.81
## 136 2017   4 114938      240141       18.78122      3.04          96.53
## 137 2017   5 123429      269067       18.79971      2.92          96.45
## 138 2017   6 127752      287979       18.20815      3.18          96.71
## 139 2017   7 122678      258557       17.85459      3.57          96.58
## 140 2017   8 125985      276108       17.80650      4.08          96.48
## 141 2017   9 116716      286400       17.80554      4.41          96.41
## 142 2017  10 123602      303514       18.71362      5.06          96.49
## 143 2017  11 141724      290569       18.98973      6.15          96.59
## 144 2017  12 159234      268772       19.10129      6.77          96.85
## 145 2018   1 109445      231088       19.02896      0.53          96.64
## 146 2018   2 109846      271228       18.61594      0.91          96.83
## 147 2018   3 119127      317398       18.65489      1.24          97.06
## 148 2018   4 109748      271048       18.34659      0.90          96.61
## 149 2018   5 115155      288659       19.45515      0.73          96.78
## 150 2018   6 120298      315130       20.31281      1.12          96.63
## 151 2018   7 115047      247367       19.09664      1.66          96.53
## 152 2018   8 119487      322779       18.80423      2.26          96.54
## 153 2018   9 114888      306009       19.03592      2.69          96.42
## 154 2018  10 117602      313471       19.09212      3.22          96.73
## 155 2018  11 134143      291018       20.25495      4.10          96.75
## 156 2018  12 142300      275962       20.15294      4.83          96.64
## 157 2019   1 111514      243652       19.22744      0.09          96.44
## 158 2019   2 104009      273173       19.18334      0.06          96.71
## 159 2019   3 117529      325703       19.24878      0.44          96.78
## 160 2019   4  98366      288756       19.01630      0.50          96.50
## 161 2019   5 102422      309017       19.09191      0.21          96.50
## 162 2019   6 106782      327454       19.26678      0.27          96.43
## 163 2019   7 106104      276818       19.06189      0.65          96.26
## 164 2019   8 108074      286075       19.58659      0.63          96.29
## 165 2019   9 100757      286806       19.60990      0.89          96.22
## 166 2019  10 107110      259158       19.36886      1.44          96.31
## 167 2019  11 124804      274845       19.30748      2.26          96.58
## 168 2019  12 130460      236848       19.16932      2.83          97.09
## 169 2020   1 104852      238749       18.81445      0.48          96.22
## 170 2020   2 104338      273634       18.77705      0.90          96.47
## 171 2020   3  87541      295199       21.97384      0.85          97.09
## 172 2020   4  34927       31183       24.23988     -0.17          95.31
## 173 2020   5  42034       15139       23.58032      0.22          95.81
## 174 2020   6  62861      198084       22.26918      0.76          94.51
## 175 2020   7  72921      264520       22.48030      1.43          94.65
## 176 2020   8  77120      264478       22.23107      1.82          94.74
## 177 2020   9  77808      257562       21.60516      2.06          94.87
## 178 2020  10  84351      280474       21.38085      2.68          95.29
## 179 2020  11  95707      287703       20.53330      2.76          95.65
## 180 2020  12 105603      275081       19.97817      3.15          96.21
## 181 2021   1  81657      223533       19.90262      0.86          95.30
## 182 2021   2  82863      213987       20.29248      1.50          95.60
## 183 2021   3  96319      256119       20.76205      2.34          96.13
## 184 2021   4  84287      234584       20.10944      2.67          95.35
## 185 2021   5  86710      242020       20.05320      2.88          96.01
## 186 2021   6  88688      234394       20.04272      3.43          95.98
## 187 2021   7  82157      202021       19.98552      4.04          95.62
## 188 2021   8  78235      212687       20.05125      4.24          95.67
## 189 2021   9  76930      195294       19.99092      4.88          95.82
## 190 2021  10  76640      224535       20.47244      5.76          96.05
## 191 2021  11  82829      240341       20.78256      6.97          96.34
## 192 2021  12  97420      227465       20.98530      7.36          96.49
## 193 2022   1  78585      216630       20.48354      0.59          96.29
## 194 2022   2  79598      201868       20.48437      1.43          96.26
## 195 2022   3  95199      262494       20.60089      2.43          97.03
## 196 2022   4  83459      241286       20.04452      2.98          96.97
## 197 2022   5  91215      244643       20.11331      3.17          96.73
## 198 2022   6  90368      237674       19.96650      4.04          96.65
## 199 2022   7  83137      210170       20.53081      4.81          96.57
## 200 2022   8  91124      248704       20.12613      5.54          96.47
##     porcentaje_desocu conf_consumidor
## 1                3.48         43.9415
## 2                3.75         43.9100
## 3                3.31         45.6029
## 4                3.20         44.7854
## 5                2.84         44.6508
## 6                3.26         44.2339
## 7                4.01         44.8674
## 8                3.87         45.0383
## 9                4.00         45.0604
## 10               3.82         44.3016
## 11               3.50         43.1883
## 12               3.32         44.7871
## 13               4.05         42.7412
## 14               4.05         42.3778
## 15               3.73         43.5677
## 16               3.51         43.4415
## 17               3.15         43.7534
## 18               3.28         43.0694
## 19               3.79         42.9629
## 20               3.83         43.9863
## 21               3.76         43.0238
## 22               3.77         41.2666
## 23               3.35         40.8568
## 24               3.11         42.8202
## 25               4.12         42.1822
## 26               3.89         41.2208
## 27               3.61         41.8964
## 28               3.48         40.1531
## 29               3.29         38.9120
## 30               3.37         37.6903
## 31               4.13         36.7035
## 32               4.06         37.2616
## 33               4.14         36.6558
## 34               4.17         34.2078
## 35               4.32         34.9500
## 36               4.02         34.9987
## 37               5.01         34.4084
## 38               5.24         33.4023
## 39               4.66         33.4728
## 40               5.06         34.6003
## 41               5.23         33.1933
## 42               4.98         34.2256
## 43               5.82         36.0502
## 44               6.15         34.5306
## 45               6.42         34.4993
## 46               5.67         32.6096
## 47               5.11         33.1707
## 48               4.73         33.9865
## 49               5.76         34.8020
## 50               5.28         34.2586
## 51               4.74         34.6691
## 52               5.35         35.0361
## 53               5.00         35.5938
## 54               4.92         36.7799
## 55               5.59         36.9279
## 56               5.42         37.2006
## 57               5.66         38.3303
## 58               5.48         37.4086
## 59               5.17         37.1774
## 60               4.94         38.1767
## 61               5.34         38.4624
## 62               5.34         38.4413
## 63               4.64         38.3233
## 64               5.13         37.6265
## 65               5.18         37.3597
## 66               5.40         38.7674
## 67               5.48         39.7537
## 68               5.71         38.9023
## 69               5.43         38.4823
## 70               4.99         37.7094
## 71               4.96         37.4238
## 72               4.51         37.7149
## 73               4.88         39.3604
## 74               5.28         38.9804
## 75               4.52         38.8750
## 76               4.86         40.2245
## 77               4.67         39.7323
## 78               4.75         39.7133
## 79               4.99         41.1478
## 80               5.33         40.7832
## 81               4.91         39.3550
## 82               5.03         39.6293
## 83               5.05         39.1214
## 84               4.40         41.1395
## 85               5.41         41.6134
## 86               4.75         39.6882
## 87               4.48         39.9339
## 88               4.96         39.8361
## 89               4.91         39.4471
## 90               5.00         38.7706
## 91               5.13         40.6562
## 92               5.18         40.5308
## 93               5.31         39.1825
## 94               5.01         38.0775
## 95               4.48         36.9465
## 96               4.27         37.3707
## 97               5.07         35.5508
## 98               4.66         35.7346
## 99               4.80         37.1351
## 100              4.85         37.6101
## 101              4.94         37.7513
## 102              4.82         37.9049
## 103              5.47         37.5518
## 104              5.19         37.4502
## 105              5.09         38.2199
## 106              4.78         37.6935
## 107              4.53         38.4760
## 108              3.76         38.6914
## 109              4.51         38.0625
## 110              4.33         37.4911
## 111              3.86         38.5052
## 112              4.31         37.8429
## 113              4.45         38.0317
## 114              4.41         39.1119
## 115              4.72         38.1319
## 116              4.68         37.3836
## 117              4.50         37.4490
## 118              4.55         37.8131
## 119              3.96         38.1829
## 120              3.96         38.3685
## 121              4.26         38.1815
## 122              4.14         36.7321
## 123              3.75         36.8144
## 124              3.80         36.7139
## 125              4.01         37.4848
## 126              3.92         38.3491
## 127              4.00         36.5060
## 128              3.98         35.6554
## 129              4.12         34.7550
## 130              3.67         35.0319
## 131              3.50         34.8752
## 132              3.38         35.4784
## 133              3.60         28.6679
## 134              3.34         31.5156
## 135              3.19         33.7951
## 136              3.47         34.9345
## 137              3.55         35.8733
## 138              3.29         36.0104
## 139              3.42         36.4886
## 140              3.52         36.5055
## 141              3.59         36.7879
## 142              3.51         36.4370
## 143              3.41         36.7168
## 144              3.15         36.3155
## 145              3.36         34.8018
## 146              3.17         34.1893
## 147              2.94         34.3367
## 148              3.39         35.6116
## 149              3.22         36.6479
## 150              3.37         37.1483
## 151              3.47         43.3411
## 152              3.46         43.0057
## 153              3.58         42.1327
## 154              3.27         42.5330
## 155              3.25         41.6750
## 156              3.36         44.8654
## 157              3.56         45.9299
## 158              3.29         47.8261
## 159              3.22         46.3411
## 160              3.50         45.4850
## 161              3.50         44.3235
## 162              3.57         43.6658
## 163              3.74         43.3177
## 164              3.71         43.8192
## 165              3.78         45.2995
## 166              3.69         44.0597
## 167              3.42         43.8407
## 168              2.91         43.7574
## 169              3.78         44.1205
## 170              3.53         43.3299
## 171              2.91         42.0593
## 172              4.69         32.2235
## 173              4.19         31.0682
## 174              5.49         31.9572
## 175              5.35         34.4173
## 176              5.26         35.0648
## 177              5.13         36.2820
## 178              4.71         37.8912
## 179              4.35         37.0767
## 180              3.79         38.7487
## 181              4.70         39.2114
## 182              4.40         38.6401
## 183              3.87         40.5816
## 184              4.65         42.5091
## 185              3.99         42.4227
## 186              4.02         44.3477
## 187              4.38         44.2934
## 188              4.33         42.4746
## 189              4.18         43.3421
## 190              3.95         43.8431
## 191              3.66         45.9354
## 192              3.51         44.8964
## 193              3.71         43.5909
## 194              3.74         42.9401
## 195              2.97         43.5603
## 196              3.03         44.3017
## 197              3.27         43.7823
## 198              3.35         43.2086
## 199              3.43         41.2699
## 200              3.53         40.2979

Dentro de la base de datos había dos renglones sin contenido, por lo tanto, se decidió eliminarlo.

Dos modelos diferentes de regresión lineal múltiple para predecir el desempeño de la industria automotriz

Correlación

corrplot(cor(bd_prediccion2), type="upper",order="hclust",addcoef.col="black")

summary(bd_prediccion2)
##       Año            Mes            Venta         Exportación    
##  Min.   :2006   Min.   : 1.00   Min.   : 34927   Min.   : 15139  
##  1st Qu.:2010   1st Qu.: 3.00   1st Qu.: 78543   1st Qu.:153219  
##  Median :2014   Median : 6.00   Median : 88580   Median :209160  
##  Mean   :2014   Mean   : 6.42   Mean   : 94178   Mean   :201664  
##  3rd Qu.:2018   3rd Qu.: 9.00   3rd Qu.:110134   3rd Qu.:243900  
##  Max.   :2022   Max.   :12.00   Max.   :192741   Max.   :327454  
##  Tipo.de.cambio    Inflación      porcentaje_ocu  porcentaje_desocu
##  Min.   :10.09   Min.   :-0.250   Min.   :93.58   Min.   :2.840    
##  1st Qu.:12.66   1st Qu.: 0.815   1st Qu.:95.06   1st Qu.:3.527    
##  Median :13.56   Median : 1.480   Median :95.88   Median :4.125    
##  Mean   :15.48   Mean   : 1.951   Mean   :95.76   Mean   :4.244    
##  3rd Qu.:19.10   3rd Qu.: 2.895   3rd Qu.:96.47   3rd Qu.:4.940    
##  Max.   :24.24   Max.   : 7.360   Max.   :97.16   Max.   :6.420    
##  conf_consumidor
##  Min.   :28.67  
##  1st Qu.:36.69  
##  Median :38.47  
##  Mean   :39.15  
##  3rd Qu.:42.59  
##  Max.   :47.83

El primer paso fue crear una gráfica de similitudes para determinar si las variables podían estar relacionadas entre sí. Como se puede observar, todas las variables están 100% relacionadas. También es posible analizar qué año y tipo de cambio también son importantes, así como el mes y la inflación, las ventas y el porcentaje de ocupados, las exportaciones y el año, seguido del tipo de cambio y las exportaciones, entre otros.

Modelo de regresión 1

modelo_regresion1 <- lm(Exportación~Año+Mes+Tipo.de.cambio+Inflación+porcentaje_ocu+porcentaje_desocu+conf_consumidor,data=bd_prediccion2) 
summary(modelo_regresion1)
## 
## Call:
## lm(formula = Exportación ~ Año + Mes + Tipo.de.cambio + Inflación + 
##     porcentaje_ocu + porcentaje_desocu + conf_consumidor, data = bd_prediccion2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -223340  -17123    3169   21264   87133 
## 
## Coefficients: (1 not defined because of singularities)
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -3.913e+07  3.447e+06 -11.352  < 2e-16 ***
## Año                1.835e+04  1.645e+03  11.151  < 2e-16 ***
## Mes                6.334e+03  1.054e+03   6.007 9.25e-09 ***
## Tipo.de.cambio    -1.280e+04  2.212e+03  -5.785 2.89e-08 ***
## Inflación         -1.022e+04  2.390e+03  -4.275 3.01e-05 ***
## porcentaje_ocu     2.763e+04  4.394e+03   6.289 2.09e-09 ***
## porcentaje_desocu         NA         NA      NA       NA    
## conf_consumidor   -2.142e+03  8.735e+02  -2.452   0.0151 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 36390 on 193 degrees of freedom
## Multiple R-squared:  0.6723, Adjusted R-squared:  0.6621 
## F-statistic: 65.99 on 6 and 193 DF,  p-value: < 2.2e-16

Se encontró que el tipo de cambio tiene el mayor impacto en las exportaciones en este modelo cuando se ejecutó por primera vez sin las variables año y mes. Este hallazgo tiene sentido dado que México es un gran exportador y que el tipo de cambio afecta de la misma manera a México y al resto del mundo al devaluar el peso.Por otro lado, la mayoría de las variables, a excepción de la proporción de desempleados que tiene los 3 asteriscos, se consideran variables de impacto al sumar las variables año y mes.

Gráfica

effect_plot(modelo_regresion1,pred=Tipo.de.cambio,interval=TRUE)
## Warning in predict.lm(model, newdata = pm, se.fit = interval, interval =
## int.type[1], : prediction from a rank-deficient fit may be misleading

Como se observa en el gráfico, el patrón que sigue es negativo, ya que entre más cuesta un dólar en pesos mexicanos o menor es el tipo de cambio es menor las exportaciones.

Modelo de regresión 2

modelo_regresion2 <- lm(Venta~Año+Mes+Tipo.de.cambio+Inflación+porcentaje_ocu+porcentaje_desocu+conf_consumidor,data=bd_prediccion2)
summary(modelo_regresion2)
## 
## Call:
## lm(formula = Venta ~ Año + Mes + Tipo.de.cambio + Inflación + 
##     porcentaje_ocu + porcentaje_desocu + conf_consumidor, data = bd_prediccion2)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -66653  -9529   -696   9350  64461 
## 
## Coefficients: (1 not defined because of singularities)
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -7208005.1  1525100.0  -4.726 4.40e-06 ***
## Año                   2561.8      727.9   3.519 0.000539 ***
## Mes                   3468.4      466.5   7.434 3.34e-12 ***
## Tipo.de.cambio       -2373.5      978.9  -2.425 0.016241 *  
## Inflación            -3991.3     1057.4  -3.775 0.000213 ***
## porcentaje_ocu       23358.2     1943.9  12.016  < 2e-16 ***
## porcentaje_desocu         NA         NA      NA       NA    
## conf_consumidor      -1822.0      386.5  -4.714 4.63e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16100 on 193 degrees of freedom
## Multiple R-squared:  0.5586, Adjusted R-squared:  0.5449 
## F-statistic: 40.71 on 6 and 193 DF,  p-value: < 2.2e-16

En lugar de las exportaciones, en este modelo de regresión se tomaron en cuenta las ventas de vehículos. Se graficó dos veces, la primera vez sin año y mes, lo que nos dio el porcentaje de población ocupada como variable significativa, y la segunda vez con año y mes sumados. La mayoría de las variables tenían sentido con los tres asteriscos, a excepción del porcentaje de población desocupada y el tipo de cambio.

Gráfica

effect_plot(modelo_regresion2,pred=porcentaje_ocu,interval=TRUE)
## Warning in predict.lm(model, newdata = pm, se.fit = interval, interval =
## int.type[1], : prediction from a rank-deficient fit may be misleading

La tendencia del gráfico es positiva. Se graficaron las ventas y la variable importante, el porcentaje de empleo de la población. El gráfico puede interpretarse en general para sugerir que habrá más ventas cuanto mayor sea el porcentaje de la población que tiene empleo.

Interpretación de los modelos de regresión:

Después de examinar ambos modelos de regresión, se puede demostrar que el intercambio es la variable independiente que más influye en la variable dependiente de las exportaciones. Se ve que la Tasa de cambio tiene un efecto negativo que altera la tendencia, lo que deja en claro que cuando el valor del peso mexicano aumenta en relación con el dólar estadounidense, las exportaciones disminuyen. Sin embargo, el porcentaje de la población que está ocupada, o que tiene una vida laboral, es la variable independiente que más incide en la variable dependiente de las ventas. Esto tiene sentido ya que si hay dinero, hay mayor probabilidad de que haya más ventas.

Paso 1. Instalar librerías:

library(foreign)
library(dplyr)        
library(ggplot2)      
library(psych)         
library(corrplot)     
library(jtools)       
library(lmtest)       
library(car)          
library(factoextra) 
library(forecast)
#install.packages("ggfortify")
library(ggfortify)    
#install.packages("ggalluvial")
library(ggalluvial)
library(janitor)

tPaso 2. Importar y limpiar la base de datos:

bajas <- read.csv("/Users/emilioolvera/Downloads/FORM - Recursos Humanos - BAJAS evidencia).csv")
bajas <- clean_names(bajas)
summary(bajas)
##   apellidos            nombre          fecha_de_nacimiento      edad      
##  Length:237         Length:237         Length:237          Min.   :19.00  
##  Class :character   Class :character   Class :character    1st Qu.:23.00  
##  Mode  :character   Mode  :character   Mode  :character    Median :29.00  
##                                                            Mean   :31.09  
##                                                            3rd Qu.:37.00  
##                                                            Max.   :61.00  
##                                                            NA's   :3      
##     genero              rfc            fecha_de_alta      motivo_de_baja    
##  Length:237         Length:237         Length:237         Length:237        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##     no_dias            baja              puesto          departamento      
##  Min.   :   0.00   Length:237         Length:237         Length:237        
##  1st Qu.:   9.00   Class :character   Class :character   Class :character  
##  Median :  19.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :  79.47                                                           
##  3rd Qu.:  48.75                                                           
##  Max.   :1966.00                                                           
##  NA's   :23                                                                
##  no_seguro_social   salario_diario_imss factor_cred_infonavit
##  Length:237         Min.   :144.4       Length:237           
##  Class :character   1st Qu.:180.7       Class :character     
##  Mode  :character   Median :180.7       Mode  :character     
##                     Mean   :178.0                            
##                     3rd Qu.:180.7                            
##                     Max.   :500.0                            
##                     NA's   :1                                
##  n_credito_infonavit lugar_de_nacimiento     curp              calle          
##  Length:237          Length:237          Length:237         Length:237        
##  Class :character    Class :character    Class :character   Class :character  
##  Mode  :character    Mode  :character    Mode  :character   Mode  :character  
##                                                                               
##                                                                               
##                                                                               
##                                                                               
##  numero_interno       colonia          codigo_postal       municipio        
##  Length:237         Length:237         Length:237         Length:237        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##     estado          estado_civil       tarjeta_cuenta    
##  Length:237         Length:237         Length:237        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
#Técnica 1:
#Borrar columnas.
bajas <- subset(bajas, select = -c(apellidos, nombre, fecha_de_nacimiento,rfc, fecha_de_alta, baja, departamento, no_seguro_social, factor_cred_infonavit, n_credito_infonavit, lugar_de_nacimiento, curp, calle, numero_interno, colonia, codigo_postal, municipio, estado, tarjeta_cuenta))

#Técnica 2: 
#Reemplezar NAs con el promedio en la columna de "Edad", "Salario Diario" y "Número de días".
bajas$edad[is.na(bajas$edad)]<-mean(bajas$edad, na.rm = TRUE)
bajas$salario_diario_imss[is.na(bajas$salario_diario_imss)]<-mean(bajas$salario_diario_imss, na.rm = TRUE)
bajas$no_dias[is.na(bajas$no_dias)]<-mean(bajas$no_dias, na.rm = TRUE)
summary (bajas)
##       edad          genero          motivo_de_baja        no_dias       
##  Min.   :19.00   Length:237         Length:237         Min.   :   0.00  
##  1st Qu.:23.00   Class :character   Class :character   1st Qu.:   9.00  
##  Median :29.00   Mode  :character   Mode  :character   Median :  23.00  
##  Mean   :31.09                                         Mean   :  79.47  
##  3rd Qu.:37.00                                         3rd Qu.:  79.47  
##  Max.   :61.00                                         Max.   :1966.00  
##     puesto          salario_diario_imss estado_civil      
##  Length:237         Min.   :144.4       Length:237        
##  Class :character   1st Qu.:180.7       Class :character  
##  Mode  :character   Median :180.7       Mode  :character  
##                     Mean   :178.0                         
##                     3rd Qu.:180.7                         
##                     Max.   :500.0
#Técnica 3:
#Convertir las variables como factor o número
bajas$edad<-as.numeric(bajas$edad)
bajas$genero<-as.factor(bajas$genero)
bajas$motivo_de_baja<-as.factor(bajas$motivo_de_baja)
bajas$no_dias<-as.numeric(bajas$no_dias)
bajas$puesto<-as.factor(bajas$puesto)
bajas$salario_diario_imss<-as.numeric(bajas$salario_diario_imss)
bajas$estado_civil<-as.factor(bajas$estado_civil)
summary (bajas)
##       edad                 genero                motivo_de_baja
##  Min.   :19.00   CAPJ000926597:  1   ABANDONO           :  1   
##  1st Qu.:23.00   FEMENINO     :139   BAJA POR FALTAS    :141   
##  Median :29.00   MASCULINO    : 97   JUBILACION         :  1   
##  Mean   :31.09                       RENUNCIA VOLUNTARIA: 86   
##  3rd Qu.:37.00                       TERMINO DE CONTRATO:  8   
##  Max.   :61.00                                                 
##                                                                
##     no_dias                          puesto    salario_diario_imss
##  Min.   :   0.00   AYUDANTE GENERAL     :179   Min.   :144.4      
##  1st Qu.:   9.00   COSTURERA            : 11   1st Qu.:180.7      
##  Median :  23.00   SOLDADOR             : 11   Median :180.7      
##  Mean   :  79.47   AYUDANTE DE EMBARQUES:  7   Mean   :178.0      
##  3rd Qu.:  79.47   MONTACARGUISTA       :  5   3rd Qu.:180.7      
##  Max.   :1966.00   INSPECTOR CALIDAD    :  4   Max.   :500.0      
##                    (Other)              : 20                      
##       estado_civil
##             :  2  
##  CASADO     : 64  
##  DIVORCIADO :  3  
##  SOLTERO    :108  
##  UNION LIBRE: 60  
##                   
## 

Paso 3. Creación de Clústers:

Cluster 1: Relación de variables de Edad y Número de días.
edad <-bajas 
edad<- subset(bajas,select = -c(genero, motivo_de_baja, puesto, salario_diario_imss, estado_civil))

#Normalizar variables
edad_norm<-scale(edad[1:2]) 

#Función fviz para la visualización de un Elbow Plot y así determinar el número de clusters.
fviz_nbclust(edad_norm, kmeans, method="wss")+ 
  geom_vline(xintercept=4, linetype=2)+            
  labs(subtitle = "Elbow method")

Con esta gráfica podemos visualizar que el número óptimo de clústers son 4.

#Visualizar clusters
edad_cluster<-kmeans(edad_norm,4)
edad_cluster
## K-means clustering with 4 clusters of sizes 80, 4, 45, 108
## 
## Cluster means:
##         edad     no_dias
## 1  0.1895854 -0.06199477
## 2  1.0620936  6.70675123
## 3  1.6004444 -0.10126073
## 4 -0.8466223 -0.16028417
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   1   1   4   4   1   3   1   1   3   4   4   1   4   1   1   4   4   4   4   4 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   1   2   4   1   3   4   1   4   4   4   1   4   4   4   1   4   4   1   1   4 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   4   1   4   4   4   4   4   4   3   3   3   2   4   3   4   4   3   4   4   4 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   4   4   1   4   4   3   4   3   1   4   4   4   1   4   1   4   3   4   4   3 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   2   1   3   4   4   4   3   4   4   4   1   3   3   4   4   4   1   3   1   4 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   1   4   4   3   1   4   4   1   2   1   1   4   1   1   4   1   1   1   3   3 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   3   4   4   4   4   4   1   4   1   3   4   1   4   3   4   1   1   1   3   1 
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
##   3   1   1   3   3   3   4   1   1   1   1   4   4   4   1   3   3   4   1   4 
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
##   1   3   3   3   3   1   3   4   4   1   4   4   3   1   3   4   3   1   1   3 
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
##   1   1   4   4   4   1   3   1   1   4   4   1   1   1   1   1   1   1   4   1 
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
##   1   1   1   4   1   3   1   4   4   4   3   4   4   4   1   1   4   4   1   1 
## 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 
##   1   3   4   4   1   4   4   4   4   3   1   3   4   4   4   4   4 
## 
## Within cluster sum of squares by cluster:
## [1] 34.04210 16.13273 21.75900 16.53795
##  (between_SS / total_SS =  81.3 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
#Visualizar resultados:
fviz_cluster(edad_cluster,data=edad_norm)

Los más jóvenes son los que menos días de trabajo laboran. Donde los que más días laborales tienen son los adultos (27 años 61)

Cluster 2: Relación de variables de Edad y Salario Diario.
edad_salario <-bajas 
edad_salario<- subset(bajas,select = -c(genero,estado_civil,motivo_de_baja, puesto, no_dias))

#Normalizar variables
edad_salario_norm<-scale(edad_salario[1:2]) 

#Función fviz para la visualización de un Elbow Plot y así determinar el número de clusters.
fviz_nbclust(edad_salario_norm, kmeans, method="wss")+ 
  geom_vline(xintercept=4, linetype=2)+            
  labs(subtitle = "Elbow method") 

Con esta gráfica podemos visualizar que el número óptimo de clústers son 4.

#Visualizar clusters:
edad_salario_cluster<-kmeans(edad_salario_norm,4)
edad_salario_cluster
## K-means clustering with 4 clusters of sizes 76, 1, 45, 115
## 
## Cluster means:
##          edad salario_diario_imss
## 1  0.24407169         -0.03948540
## 2  0.09515287         13.87503094
## 3  1.67245680         -0.06024275
## 4 -0.81656658         -0.07098449
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   2   1   4   4   1   3   1   1   3   4   4   1   4   1   1   4   4   4   4   4 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   1   3   4   1   3   4   1   4   4   4   1   4   4   4   1   4   4   4   1   4 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   4   1   4   4   4   4   4   4   3   3   3   3   4   3   4   4   3   4   4   4 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   4   4   1   4   4   3   4   3   4   4   4   4   1   4   1   4   1   4   4   3 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   4   4   3   4   4   4   3   4   4   4   1   3   3   4   4   4   1   3   1   4 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   1   4   4   3   1   4   4   1   4   1   1   4   1   1   4   1   1   1   3   3 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   3   4   4   4   4   4   1   4   1   3   4   1   4   3   4   4   4   1   3   1 
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
##   3   1   1   1   3   3   4   1   1   1   1   4   4   4   1   3   3   4   1   4 
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
##   1   3   3   3   3   1   3   4   4   1   4   4   3   1   3   4   3   1   1   3 
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
##   1   1   4   4   4   1   3   1   1   4   4   1   1   1   1   1   1   1   4   1 
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
##   1   1   1   4   1   3   1   4   4   4   3   4   4   4   1   1   4   4   1   1 
## 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 
##   1   3   4   4   1   4   4   4   4   3   1   3   4   4   4   4   4 
## 
## Within cluster sum of squares by cluster:
## [1] 20.84343  0.00000 18.68350 32.00903
##  (between_SS / total_SS =  84.8 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
#Visualizar resultados:
fviz_cluster(edad_salario_cluster,data=edad_salario_norm)

Los trabajadores que renuncian tienen salarios bastante idénticos independientemente de su edad, por lo que claramente la edad tiene poca relación con el salario.

Cluster 3: Relación de variables de Salario Diario y Número de días.
dias_salario <-bajas 
dias_salario<- subset(bajas,select = -c(genero,estado_civil,motivo_de_baja, puesto, edad))

#Normalizar variables:
dias_salario_norm<-scale(dias_salario[1:2]) 

#Función fviz para la visualización de un Elbow Plot y así determinar el número de clusters.
fviz_nbclust(dias_salario_norm, kmeans, method="wss")+ 
  geom_vline(xintercept=4, linetype=2)+            
  labs(subtitle = "Elbow method") 

Con esta gráfica podemos visualizar que el número óptimo de clústers son 4.

#Visualizar clusters:
dias_salario_cluster<-kmeans(dias_salario_norm,4)
dias_salario_cluster
## K-means clustering with 4 clusters of sizes 159, 5, 43, 30
## 
## Cluster means:
##      no_dias salario_diario_imss
## 1 -0.2906680          0.11501794
## 2  5.8798242          2.45410205
## 3  0.2579630          0.08136604
## 4  0.1908225         -1.13523673
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   2   4   4   4   4   4   4   4   4   3   4   4   1   1   4   4   4   4   4   4 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   4   2   4   4   1   1   1   1   1   1   1   1   1   1   1   1   4   3   1   1 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   3   3   1   1   1   1   1   1   1   1   1   2   3   1   1   1   1   1   1   4 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   1   1   1   1   1   1   1   4   3   4   1   1   1   1   1   1   1   1   1   1 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   2   4   4   4   4   3   1   1   1   1   1   1   1   1   1   1   1   4   4   3 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   3   1   1   1   1   1   1   1   2   1   1   1   1   1   1   1   1   1   1   1 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   1   1   3   1   1   1   1   1   1   1   1   1   1   4   3   3   3   3   1   1 
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   3   1   1 
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
##   1   1   1   3   3   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
##   3   3   3   3   3   3   3   3   3   3   3   3   3   1   3   3   3   3   3   3 
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
##   3   3   3   3   1   1   1   1   3   1   1   1   1   1   1   1   1   1   1   1 
## 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 
##   1   3   3   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
## 
## Within cluster sum of squares by cluster:
## [1]   1.009803 184.768864  12.851574  11.956632
##  (between_SS / total_SS =  55.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
#Visualizar resultados:
fviz_cluster(dias_salario_cluster,data=dias_salario_norm)

promedio_dias <- mean(bajas$no_dias)
promedio_dias
## [1] 79.47196

Este cluster muestra que no hay posibilidad de desarrollo del empleo (desde un punto de vista económico) independientemente de cuánto tiempo o cuántos días haya trabajado en FORM ya que, como lo muestra el análisis de conglomerados, el número de días trabajados tiene poco efecto en el día a día. salario.

Paso 4. Creación de Segmentos apartir de los Clústers:

#Decidimos usar el Cluster 2 para generar la clasificación de variables y poder comparar con datos cualitativos.

#Añadir a la base de datos la columna de Clusters y su clasificación:
bajas1<-bajas
bajas1$Clusters<-edad_salario_cluster$cluster

library(dplyr)
library(factoextra) 

#Identificamos la clasificación de las distintas edades de los colaboradores.
bajas2<-bajas1 %>% group_by(Clusters) %>% dplyr::summarise(edad=max(edad)) %>% arrange(desc(edad))
bajas1$Cluster_Names<-factor(bajas1$Clusters,levels = c(1,2,3,4), 
                              labels=c("Outlier", "Joven", "Avanzada", "Adulta"))
bajas3 <- bajas1 %>% group_by(Cluster_Names) %>% dplyr::summarize(edad_años=max(edad), salario_imss=mean(salario_diario_imss),Count=n())
clusters<-as.data.frame(bajas3)
clusters
##   Cluster_Names edad_años salario_imss Count
## 1       Outlier        40     177.0462    76
## 2         Joven        32     500.0000     1
## 3      Avanzada        61     176.5644    45
## 4        Adulta        28     176.3151   115

Paso 5. Generación de gráficos:

Gráficos cuantitativos:
#Se realizó una gráfica para analizar el número de registros por cada segmento: 
ggplot(bajas3,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
  geom_bar(stat="identity")

Según el gráfico anterior, los jóvenes, seguidos de los adultos y finalmente los trabajadores de mayor edad, han sido los que más bajas han presentado.

#Visualizar la edad por cada segmento:
ggplot(bajas3, aes(x=Cluster_Names,y=edad_años,fill= Cluster_Names,label=round(edad_años,digits=2))) + 
  geom_col() + 
  geom_text()

Visualización del máximo de cada tramo. Joven (hasta 28), Avanzado (hasta 61), Adulto (hasta 40), y el Outlier de 32

Gráficas mixtas (Datos Cualitativos y Cuantitativos):
Gráfica de barras: (Clusters y Género)
ggplot(bajas1, aes(factor(Cluster_Names), fill = factor(genero))) +
  geom_bar(position = position_dodge2(preserve = "single")) 

Este gráfico nos dice que de cada segmento, hay más mujeres que se han dado de baja.

Gráfica de barras: (Clusters y Estado Civil)
ggplot(bajas1, aes(factor(Cluster_Names), fill = factor(estado_civil))) +
  geom_bar(position = position_dodge2(preserve = "single")) 

Podemos ver que la mayoría de los jóvenes eran solteros, se igualaba el número de adultos casados, solteros o en unión libre, y a medida que mejoraba la sociedad aumentaba el número de solteros y casados. Sin embargo, muy pocos trabajadores se han divorciado y dejado la empresa.

Gráfica de barras: (Clusters y Motivo de Baja)
ggplot(bajas1, aes(factor(Cluster_Names), fill = factor(motivo_de_baja))) +
  geom_bar(position = position_dodge2(preserve = "single")) 

Podemos ver que la mayoría del grupo de colaboradores jóvenes, adultos y adultos mayores han sido despedidos por ausentarse

Gráfica de pay: (Puesto)
table(bajas1$puesto)
## 
## ANALISTA DE NOMINAS /AUX DE R.H.            AYUDANTE DE EMBARQUES 
##                                1                                7 
##                 AYUDANTE DE MTTO             AYUDANTE DE SOLDADOR 
##                                1                                1 
##                 AYUDANTE GENERAL                           CHOFER 
##                              179                                1 
##                         CORTADOR                        COSTURERA 
##                                1                               11 
##                           DISEÑO             ENCARGADA DE CALIDAD 
##                                1                                1 
##                      FACTURACION             GUARDIA DE SEGURIDAD 
##                                1                                2 
##                INSPECTOR CALIDAD      JEFE DE SEGURIDAD E HIGIENE 
##                                4                                1 
##                         LIMPIEZA                        MARCADORA 
##                                1                                1 
##                     MATERIALISTA                   MONTACARGUISTA 
##                                2                                5 
##              PRACTICANTE DE MTTO                        RESIDENTE 
##                                1                                3 
##              SERVICIO AL CLIENTE                         SOLDADOR 
##                                1                               11
proporciones <- c(23, 179, 11, 11, 7, 5)
etiquetas <- c("Otros","Ayudante General", "Costurera", "Soldador", "Ayudante Embarques", "Montacarguista")
pct <- round(proporciones/sum(proporciones)*100)
etiquetas <- paste(etiquetas, pct)
etiquetas <- paste(etiquetas,"%",sep="")
pie(proporciones,labels = etiquetas,
    col=rainbow(length(etiquetas)),
    main="Puesto de los Ex-Colaboradores")

bajas4 <-bajas1 %>% filter(Clusters==1 | Clusters==3) %>% arrange(Clusters)
library(ggalluvial)

ggplot(as.data.frame(bajas4),
       aes(y=edad, axis1= genero, axis2=estado_civil)) +
  geom_alluvium(aes(fill=Cluster_Names), width = 1/12) +
  geom_stratum(width = 1/12, fill = "black", color = "grey") +
  geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
  scale_x_discrete(limits = c("Gender", "Marital Status"), expand = c(.05, .05)) +
  scale_fill_brewer(type = "qual", palette = "Set1") +
  ggtitle("FORM's Daily Wage by Sex and Marital Status")

Identificación de Resultados Relevantes y Sugerencias

A partir del análisis de las bases de datos de las diferentes áreas de la empresa FORM, identificar y describir los principales 6-8 hallazgos (meaningful insights).

1. El hallazgo que tuve en el area de merma fue que se ve que fue alta en los meses de de Agosto (370852 kilos de merma) y Septiembre donde se requiere determinar la causa del alto nivel de estos desechos, para asi poder prevenir futuros gastos extra y asi no volver a tener este problema.

2. El hallazgo que tuve en el area de Scrap fue que, en lo que es la Pre-production es donde mas scrap se ve reflejada en la cual yo considero que se implemente un plan para disminuir esto ya que se podria decir que se reflajan gastos extra que son innecesarios

3. El hallazgo que tuve en el area de los colaboradores es que los que estan casados y solteros suelen ganar màs de los que estan divorciados y en union libre

4. El hallazgo que tuve en el area de bajas fue que el motivo màs comùn de baja de los colaboradores han sido por despidos por faltas.

5. El hallazgo que tuve en cuanto a los pronosticos es que el tipo de cambio es un factor que influencia mucho en cuanto a las negociaciones de Mexico esto se debe dado que nuestro pais forma parte del mercado cambiario internacional, y la mayoría de las operaciones se realizan en el mercado peso-dólar, ya que la actividad en otros mercados de divisas es muy baja, asi que si este baja tambien afecta a Mexico.

6. El hallazgo que tuve en el area de colaboradores es que después de tomar en consideración las variables de edad y salario diario pude observar que los adultos entre 41 y 61 años, que se considera en lo que es la jubilación, sufren mayores bajas.

7. Otro hallazgo que tuve fue que los clientes más importantes para FORM son Yanfeng, Stabilus 1 y Varroc.

A partir del análisis de las bases de datos de las diferentes áreas de la empresa FORM, describir 3 sugerencias que le permitan al socio formador mejorar su proceso de captura, organización, y analítica de datos.

PROPUESTA PARA MERMA

Como propuesta para la merma, se tiene que implementar un plan que minimice la cantidad de merma generada, la cual se ve que fue alta en los meses de de Agosto y Septiembre donde se requiere determinar la causa del alto nivel de estos desechos, para asi poder prevenir futuros gastos extra y asi no volver a tener este problema.

PROPUESTA PARA SCRAP

Como propuesta para scrap, puedo decir que en el area de Pre-production siendo el area que mas scrap lleva se tiene que implementar un plan para disminuir esto ya que se podria decir que se reflajan gastos extra que son innecesarios.

PROPUESTA PARA PRODUCCION

Como propuesta para produccion puedo decir que se sigan adaptando a las necesidades de los cientes pero que tambien traten de implementar otras maneras ya que se quiere llegar a todos los clientes posibles y no estar segmentando, por lo cual es importante de tratar de abrirse mas hacia los clientes que no les llegan a pedir las mismas demandas.

PROPUESTA ANALISIS DE DATOS

Como propuesta para su analitica de datos es que para que FORM pueda seguir obteniendo buenos resultados a cuanto a sus datos es que constantemente busquen tener una limpia de estos, en donde me di cuenta que fue esencial al yo trabajar con estos, donde vi que habia muchas cosas que no tenian sentido, tales como errores de dedo, numeros extra, columnas repetidas, etc. El limpiar los datos ayudara a obtener resultados mejores, donde yo creo lo mas optimo para eso es que cierto departamento tenga la tarea de hacer esto ya sea el departamento de IT o tambien podrian tener alguna plataforma externa que les haga este trabajo.

Describir con tus propias palabras los términos Business Analytics y Business Intelligence. Así también, identificar y describir 3 principales diferencias entre Business Analytics y Business Intelligence.

Business Analytics es el proceso mediante el cual las organizaciones analizan datos históricos utilizando técnicas y tecnología estadísticas para aprender cosas nuevas y tomar mejores decisiones estratégicas.

Business Intelligence es un método impulsado por la tecnología para el análisis de datos y la entrega de información que ayuda a los ejecutivos, gerentes y empleados a tomar decisiones comerciales estratégicas.

1. Mientras que BA se utiliza para implementar cambios en las operaciones, BI se utiliza para administrar de manera eficiente el negocio actual.

2. La inteligencia comercial (Business Intelligence) prioriza el análisis descriptivo, que brinda una descripción general de los datos históricos y actuales para demostrar lo que ha ocurrido o está ocurriendo en este momento.

3. Finalmente, Business Analytics es apropiado cuando la expansión futura y la sustentabilidad se consideran el objetivo principal, mientras que Business Intelligence es importante cuando el enfoque de la organización está en operar el negocio existente.

Describir con tus propias palabras el concepto de Indicador Clave de Rendimiento / Key Performance Indicators (KPI).

Un indicador clave de rendimiento, o KPI, se describe como “un valor cuantitativo utilizado para evaluar la eficacia de una persona u organización para lograr un objetivo”. Los indicadores clave de rendimiento en las empresas pueden ser de alto nivel o profundizar en un departamento o persona en particular. Los KPI de alto nivel, como generar $ 1 millón en ingresos anuales recurrentes este año fiscal, a menudo evalúan el éxito de su empresa en general. Estos son KPI de bajo nivel cuando se sumerge en procesos que son exclusivos de divisiones, equipos o personas.

A partir del análisis de las bases de datos de las diferentes áreas de la empresa FORM, proponer y describir 3 posibles KPIs que permitan evaluar el desempeño de algunas de sus áreas.

1. Un indicador de rendimiento que podria ser de gran uso para el area de Merma que esta centrado en la gestión de existencias en el almacén, se denomina KPI de inventario. Las instalaciones que han descubierto estas métricas garantizan un control de inventario efectivo y flujos de entrada y salida fluidos de artículos.

2. Un indicador de rendimiento que podria ser de gran uso para el area de Recursos Humanos es el de “Nivel de satisfacción” el cual tendria que tener enfoque en los empleados, este lo considero importante ya que como su nombre lo dice se tomara como factor importante la satisfaccion que los colaboradores tienen dentro de la empresa, donde esta se podra medir con encuestas ya me sea mensuales, o como mas se acomode la empresa.

3. Un indicador de rendimiento que podria ser de gran uso para el area de ventas, es el de número de leads (Un lead es un potencial cliente interesado en los productos y/o servicios) puede desarrollar índices de indicación de ventas de KPI calculando su tasa de generación de prospectos. Esto es beneficioso tanto a nivel nacional como local. Puedes medir los diferentes niveles de influencia que tienes a nivel local de cada ciudad utilizando un KPI de este tipo en diferentes ciudades.

Referencias

- Klipfolio. (2022, October 19). What is a KPI? Definition, Best Practices, and Examples. Retrieved October 20, 2022, from https://www.klipfolio.com/resources/articles/what-is-a-key-performance-indicator

-Business intelligence vs. business analytics: What’s the difference? (n.d.). Tableau. Retrieved October 20, 2022, from https://www.tableau.com/learn/articles/business-intelligence/bi-business-analytics

- Costa, C., & Costa, C. (2020, December 15). Cuáles son los principales KPI de venta. CRO Creativo ®. Retrieved October 21, 2022, from https://crocreativo.com/blog/cuales-son-los-principales-kpi-de-venta/

LS0tCnRpdGxlOiAiRXZpZGVuY2lhIDIiCmF1dGhvcjogIkVtaWxpbyBPbHZlcmEiCmRhdGU6ICIyMDIyLTEwLTE5IgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCiMjIDxpbWcgc3JjPSIvVXNlcnMvZW1pbGlvb2x2ZXJhL0Rlc2t0b3AvU2NyZWVuIFNob3QgMjAyMi0xMC0yMSBhdCA0LjEyLjI1IFBNLnBuZyI+ICAKCiMjIyAqSW1wb3J0YXIgUGFxdWV0ZXMqCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KbGlicmFyeShwbHlyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShrbml0cikKbGlicmFyeShmb3JlaWduKQpsaWJyYXJ5KGRwbHlyKSAgICAgICAgIyBkYXRhIG1hbmlwdWxhdGlvbiAKbGlicmFyeShmb3JjYXRzKSAgICAgICMgdG8gd29yayB3aXRoIGNhdGVnb3JpY2FsIHZhcmlhYmxlcwpsaWJyYXJ5KGdncGxvdDIpICAgICAgIyBkYXRhIHZpc3VhbGl6YXRpb24gCmxpYnJhcnkoamFuaXRvcikgICAgICAjIGRhdGEgZXhwbG9yYXRpb24gYW5kIGNsZWFuaW5nIAojaW5zdGFsbC5wYWNrYWdlcygiSG1pc2MiKQpsaWJyYXJ5KEhtaXNjKSAgICAgICAgIyBzZXZlcmFsIHVzZWZ1bCBmdW5jdGlvbnMgZm9yIGRhdGEgYW5hbHlzaXMgCiNpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpCmxpYnJhcnkocHN5Y2gpICAgICAgICAjIGZ1bmN0aW9ucyBmb3IgbXVsdGl2YXJpYXRlIGFuYWx5c2lzIAojaW5zdGFsbC5wYWNrYWdlcygibmFuaWFyIikKbGlicmFyeShuYW5pYXIpICAgICAgICMgc3VtbWFyaWVzIGFuZCB2aXN1YWxpemF0aW9uIG9mIG1pc3NpbmcgdmFsdWVzIE5BcwojaW5zdGFsbC5wYWNrYWdlcygiZGxvb2tyIikKbGlicmFyeShkbG9va3IpICAjIHN1bW1hcmllcyBhbmQgdmlzdWFsaXphdGlvbiBvZiBtaXNzaW5nIHZhbHVlcyBOQXMKI2luc3RhbGwucGFja2FnZXMoImNvcnJwbG90IikKbGlicmFyeShjb3JycGxvdCkgICAgICMgY29ycmVsYXRpb24gcGxvdHMKI2luc3RhbGwucGFja2FnZXMoImp0b29scyIpCmxpYnJhcnkoanRvb2xzKSAgICAgICAjIHByZXNlbnRhdGlvbiBvZiByZWdyZXNzaW9uIGFuYWx5c2lzIAojaW5zdGFsbC5wYWNrYWdlcygibG10ZXN0IikKbGlicmFyeShsbXRlc3QpICAgICAgICMgZGlhZ25vc3RpYyBjaGVja3MgLSBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcyAKI2luc3RhbGwucGFja2FnZXMoImNhciIpCmxpYnJhcnkoY2FyKSAgICAgICAgICAjIGRpYWdub3N0aWMgY2hlY2tzIC0gbGluZWFyIHJlZ3Jlc3Npb24gYW5hbHlzaXMKI2luc3RhbGwucGFja2FnZXMoIm9sc3JyIikKbGlicmFyeShvbHNycikgICAgICAgICMgZGlhZ25vc3RpYyBjaGVja3MgLSBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcyAKI2luc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiKQpsaWJyYXJ5KGthYmxlRXh0cmEpICAgIyBIVE1MIHRhYmxlIGF0dHJpYnV0ZXMKCmBgYAoKIyMgPGltZyBzcmM9Ii9Vc2Vycy9lbWlsaW9vbHZlcmEvRGVza3RvcC9GT1RPU0VWSURFTkNJQS9iYXNlc2RlZGF0b3MucG5nIj4gIAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiNmaWxlLmNob29zZSgpCm1lcm1hPC0gcmVhZC5jc3YoIi9Vc2Vycy9lbWlsaW9vbHZlcmEvRG93bmxvYWRzL0ZPUk0gLSBNZXJtYS5jc3YiKQpzY3JhcDwtIHJlYWQuY3N2KCIvVXNlcnMvZW1pbGlvb2x2ZXJhL0Rvd25sb2Fkcy9TY3JhcC5jc3YiKQpwcm9kdWNjaW9uPC0gcmVhZC5jc3YoIi9Vc2Vycy9lbWlsaW9vbHZlcmEvRG93bmxvYWRzL0VNSV9DQVJUT04uY3N2IikKcGVyZm9ybWFuY2UgPC0gcmVhZC5jc3YoIi9Vc2Vycy9lbWlsaW9vbHZlcmEvRGVza3RvcC9Qb3J0YWZvbGlvIGRlbCBtb2R1bG8vRk9STSAtIERlbGl2ZXJ5IFBlcmZvcm1hbmNlLmNzdiIpCmRfcGxhbiA8LSByZWFkLmNzdigiL1VzZXJzL2VtaWxpb29sdmVyYS9Eb3dubG9hZHMvRGVsaXZlcnkgUGxhbiBGSU5BTCAtIEVRVUlQTyA0IC5jc3YiKQpiYWphcyA8LSByZWFkLmNzdigiL1VzZXJzL2VtaWxpb29sdmVyYS9Eb3dubG9hZHMvRk9STSAtIFJlY3Vyc29zIEh1bWFub3MgLSBiYWphcy5jc3YiKQpjb2xhYm9yYWRvcmVzIDwtIHJlYWQuY3N2KCIvVXNlcnMvZW1pbGlvb2x2ZXJhL0Rvd25sb2Fkcy9GT1JNIC0gUmVjdXJzb3MgSHVtYW5vcyAtIGNvbGFib3JhZG9yZXMuY3N2IikKYGBgCgojIyAgKkNhbWJpYXIgbm9tYnJlcyBkZSB2YXJpYWJsZXMqCgojIyMgKkRlbGl2ZXJ5IFBlcmZvcm1hbmNlKgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnBlcmZvcm1hbmNlPC1jbGVhbl9uYW1lcyhwZXJmb3JtYW5jZSkKY29sbmFtZXMocGVyZm9ybWFuY2UpCmBgYAoKIyMjICAqRGVsaXZlcnkgUGxhbioKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpkX3BsYW48LWNsZWFuX25hbWVzKGRfcGxhbikKZF9wbGFuPC1kX3BsYW4gJT4lIGRwbHlyOjpyZW5hbWUoY2xpZW50ZT1jbGllbnRlX3BsYW50YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuXzIxPWp1bmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdWxfMjE9anVsaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnb18yMT1hZ29zdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcF8yMT1zZXB0aWVtYnJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY3RfMjE9b2N0dWJyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm92XzIxPW5vdmllbWJyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljXzIxPWRpY2llbWJyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2N0XzIyPW9jdHVicmVfMjIpCmNvbG5hbWVzKGRfcGxhbikKCgpgYGAKCiMjICoqVmFyaWFibGVzIHkgUmVnaXN0cm9zIHBvciBiYXNlIGRlIGRhdG9zKioKCkxhIGJhc2UgZGUgZGF0b3MgKk1lcm1hKiB0aWVuZSAzIHZhcmlhYmxlcyB5IDYwIHJlZ2lzdHJvcy4KYGBge3J9CmRlc2NyaWJlKG1lcm1hKQpkaW0obWVybWEpCmBgYAoKTGEgYmFzZSBkZSBkYXRvcyAqU2NyYXAqIHRpZW5lIDggdmFyaWFibGVzIHkgMjUxIHJlZ2lzdHJvcy4KYGBge3J9CmRlc2NyaWJlKHNjcmFwKQpkaW0oc2NyYXApCmBgYAoKTGEgYmFzZSBkZSBkYXRvcyAqUHJvZHVjY2nDs24gZGUgQ2FydG9uKiB0aWVuZSAxNyB2YXJpYWJsZXMgeSAyNDY5IHJlZ2lzdHJvcy4KYGBge3J9CmRlc2NyaWJlKHByb2R1Y2Npb24pCmRpbShwcm9kdWNjaW9uKQpgYGAKCkxhIGJhc2UgZGUgZGF0b3MgKkRlbGl2ZXJ5IFBlcmZvcm1hbmNlKiB0aWVuZSA1IHZhcmlhYmxlcyB5IDMyNSByZWdpc3Ryb3MuCmBgYHtyfQpkZXNjcmliZShwZXJmb3JtYW5jZSkKZGltKHBlcmZvcm1hbmNlKQpgYGAKCkxhIGJhc2UgZGUgZGF0b3MgKkRlbGl2ZXJ5IFBsYW4qIHRpZW5lIDI3IHZhcmlhYmxlcyB5IDIzMSByZWdpc3Ryb3MuCmBgYHtyfQpkZXNjcmliZShkX3BsYW4pCmRpbShkX3BsYW4pCmBgYAoKTGEgYmFzZSBkZSBkYXRvcyAqQmFqYXMqIHRpZW5lIDEwIHZhcmlhYmxlcyB5IDIzOCByZWdpc3Ryb3MuCmBgYHtyfQpkZXNjcmliZShiYWphcykKZGltKGJhamFzKQpgYGAKCkxhIGJhc2UgZGUgZGF0b3MgKkNvbGFib3JhZG9yZXMqIHRpZW5lIDEwIHZhcmlhYmxlcyB5IDExMyByZWdpc3Ryb3MuCmBgYHtyfQpkZXNjcmliZShjb2xhYm9yYWRvcmVzKQpkaW0oY29sYWJvcmFkb3JlcykKYGBgCgojIyA8aW1nIHNyYz0gIi9Vc2Vycy9lbWlsaW9vbHZlcmEvRGVza3RvcC9GT1RPU0VWSURFTkNJQS9jbGFzaWZpY2FjaW9udmFyaWFibGVzLnBuZyI+CgoqTWVybWEqCgpgYGB7cn0KVmFyaWFibGU8LWMoIkZlY2hhIiwiTWVzIiwiS2lsb3MiKQoKVGlwbzwtYygiUXVhbGl0YXRpdmUgKG5vbWluYWwpIiwgIlF1YWxpdGF0aXZlIChub21pbmFsKSIsICJRdWFudGl0YXRpdmUgKGRpc2NyZXRlKSIpCgpFc2NhbGEgPC0gYygiRmVjaGEgKHkvbS9kKSIsIk4vQSIsICJLaWxvZ3JhbW9zIikKCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFRpcG8sRXNjYWxhKQprbml0cjo6a2FibGUodGFibGUpCgpgYGAKCipTY3JhcCoKCmBgYHtyfQpWYXJpYWJsZTI8LWMoIlJlZmVyZW5jaWEiLCJGZWNoYSIsIlByb2R1Y3RvIiwiQ2FudGlkYWQiLCAiVWJpY2FjacOzbiBkZSBvcmlnZW4iKQoKVGlwbzI8LWMoIlF1YWxpdGF0aXZlIChub21pbmFsKSIsICJRdWFsaXRhdGl2ZSAobm9taW5hbCkiLCAiUXVhbGl0YXRpdmUgKG5vbWluYWwpIiwiUXVhbnRpdGF0aXZlIChkaXNjcmV0ZSkiLCAiUXVhbGl0YXRpdmUgKG5vbWluYWwpIikKCkVzY2FsYTIgPC0gYygiTi9BIiwiRmVjaGEgKHkvbS9kKSIsICJOL0EiLCJVbmlkYWRlcyIsIk4vQSIpCgp0YWJsZTI8LWRhdGEuZnJhbWUoVmFyaWFibGUyLFRpcG8yLEVzY2FsYTIpCmtuaXRyOjprYWJsZSh0YWJsZTIpCgpgYGAKCipQcm9kdWNjacOzbiBkZSBDYXJ0b24qCgpgYGB7cn0KVmFyaWFibGU8LWMoImBDbGllbnRlYCIsImBJRCBGb3JtYCIsICJgUHJvZHVjdG9gIiwiYFBpZXphcyBwcm9ncmFtYWRhc2AiLCAiYFRpZW1wbyBtaW51dG9zYCIsICJgSG9yYSBmaW5gIiwgImBFc3RhY2lvbiBhcnJhbnF1ZWAiLCAiYExhbWluYXMgcHJvY2VzYWRhc2AiLCAiYEluaWNpbyBzZXQgdXBgIiwgImBGaW4gaW5pY2lvIHNldCB1cGAiLCAiYEluaWNpbyBkZSBwcm9jZXNvYCIsICJgRmluIGRlIHByb2Nlc29gIiwgImBUaWVtcG8gY2FsaWRhZGAiKQpUeXBlPC1jKCJDdWFsaXRhdGl2YSIsIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCAiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiICkKRXNjYWxhczwtYygiTm9taW5hbCIsICJOb21pbmFsIiwiTm9taW5hbCIsICJJbnRlcnZhbG8iLCAiSW50ZXJ2YWxvIiwgIkludGVydmFsbyIsICJJbnRlcnZhbG8iLCJJbnRlcnZhbG8iLCJJbnRlcnZhbG8iLCJJbnRlcnZhbG8iLCJJbnRlcnZhbG8iLCJJbnRlcnZhbG8iLCJJbnRlcnZhbG8iICkgCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFR5cGUsRXNjYWxhcykKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCipEZWxpdmVyeSBQZXJmb3JtYW5jZSoKCmBgYHtyfQpWYXJpYWJsZTwtYygiYFRhcmdldGAiLCJgQ2xpZW50ZWAiLCJgVnVlbHRhc2AiLCJgUGxhbi5hcnJpdmFsYCIsImBSZWFsLmFycml2YWxgIiwiYFJlYWwuZGVwYXJ0dXJlYCIsImBEaWZlcmVuY2VgIiwiYERhdGVgIikKVHlwZTwtYygicXVhbnRpYXRpdmUgKGRpc2NyZXRlKSIsICJxdWFudGlhdGl2ZSAoY29udGlub3VzKSIsICJxdWFudGl0YXRpdmUgKGNvbnRpbm91cykiLCAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIikKZXNjYWxhcyA8LSBjKCJpbnRlcnZhbG8iLCAibm9taW5hbCIsICJyYXpvbiIsICJyYXpvbiIsICJyYXpvbiIsICJyYXpvbiIsICJyYXpvbiIsICJvcmRpbmFsIikKdGFibGUgPC0gZGF0YS5mcmFtZSAoVmFyaWFibGUsIFR5cGUsIGVzY2FsYXMpCmtuaXRyOjprYWJsZSh0YWJsZSkKYGBgCgoqRGVsaXZlcnkgUGxhbioKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQp2YXJpYWJsZSA8LWMoIkNMSUVOVEUuUExBTlRBLCIsICJQUk9ZRUNUTyIsICJJRC4wRDAwIiwgIklURU0iLCAiRU5FLjIyIiwgIkZFQlJFUk8uMjIiLCAiTUFSWk8uMjIiLCAiQUJSSUwuMjIiLCAiTUFZTy4yMiIsICJKVU5JTy4yMiIsICJKVUxJTy4yMiIsICJBR09TVE8uMjIiLCAiU0VQVElFTUJSRS4yMiIsICJPQ1RVQlJFLjIyIiwgIk5PVklFTUJSRS4yMiIsICJESUNJRU1CUkUuMjIiLCAiRU5FUk8uMjMiLCAiRkVCUkVSTy4yMyIsICJNQVJaTy4yMyIpCk1lYXN1cm1lbnQgPC1jKCJDVUFMSVRBVElWRSIsICJDVUFMSVRBVElWRSIsICJDVUFMSVRBVElWRSIsICJDVUFMSVRBVElWRSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIsICJDVUFOVElUQVRJVkUgKERJU0NSRVRFKSIpClNjYWxlIDwtYygiTk9NSU5BTCIsICJOT01JTkFMIiwgIk5PTUlOQUwiLCAiTk9NSU5BTCIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIsICJSQVpPTiIpCgpjbGFzaWZpY2FjaW9uIDwtIGRhdGEuZnJhbWUodmFyaWFibGUsIE1lYXN1cm1lbnQsIFNjYWxlKQpjbGFzaWZpY2FjaW9uCmBgYAoKKkJhamFzKgoKYGBge3J9ClZhcmlhYmxlNjwtYygiTm9tYnJlIENvbXBsZXRvIiwiRmVjaGEgTmFjaW1pZW50byIsICJHZW5lcm8iLCAiRmVjaGEgQWx0YSIsIk1vdGl2byBSZW51bmNpYSIsIlBlcm1hbmVuY2lhIiwiRmVjaGEgZGUgQmFqYSIsIlB1ZXN0byIsIkRlcGFydGFtZW50byIsIlNhbGFyaW8gRGlhcmlvIElNU1MiLCJDb2xvbmlhIiwiQ1AiLCJNdW5pY2lwaW8iLCJFc3RhZG8iLCJFc3RhZG8gQ2l2aWwiKQoKVGlwbzY8LWMoIkN1YWxpdGF0aXZlIChub21pbmFsKSIsIlF1YW50aWF0aXZlIChkaXNjcmV0ZSkiLCAiQ3VhbGl0YXRpdmUgKG5vbWluYWwpIiwgIlF1YW50aWF0aXZlIChkaXNjcmV0ZSkiLCJDdWFsaXRhdGl2ZSAobm9taW5hbCkiLCJRdWFudGlhdGl2ZSAoZGlzY3JldGUpIiwiUXVhbnRpYXRpdmUgKGRpc2NyZXRlKSIsIkN1YWxpdGF0aXZlIChub21pbmFsKSIsIkN1YWxpdGF0aXZlIChub21pbmFsKSIsIlF1YW50aWF0aXZlIChjb250aW51b3VzKSIsIkN1YWxpdGF0aXZlIChub21pbmFsKSIsIkN1YWxpdGF0aXZlIChub21pbmFsKSIsIkN1YWxpdGF0aXZlIChub21pbmFsKSIsIkN1YWxpdGF0aXZlIChub21pbmFsKSIsIkN1YWxpdGF0aXZlIChub21pbmFsKSIpCgpFc2NhbGE2PC1jKCJOL0EiLCJGZWNoYSAoWS9NL0QpIiwgIk4vQSIsICJGZWNoYSAoWS9NL0QpIiwiTi9BIiwiRGlhcyIsIkZlY2hhIChZL00vRCkiLCJOL0EiLCJOL0EiLCJQZXNvcyBNZXhpY2Fub3MiLCJOL0EiLCJOL0EiLCJOL0EiLCJOL0EiLCJOL0EiKQoKdGFibGU2PC1kYXRhLmZyYW1lKFZhcmlhYmxlNixUaXBvNixFc2NhbGE2KQprbml0cjo6a2FibGUodGFibGUpCgpgYGAKCipDb2xhYm9yYWRvcmVzKgoKYGBge3J9ClZhcmlhYmxlNzwtYygiTm9tYnJlIENvbXBsZXRvIiwiRmVjaGEgTmFjaW1pZW50byIsICJHZW5lcm8iLCAiRmVjaGEgQWx0YSIsIlB1ZXN0byIsIkRlcGFydGFtZW50byIsIlNhbGFyaW8gRGlhcmlvIElNU1MiLCJDb2xvbmlhIiwiTXVuaWNpcGlvIiwiRXN0YWRvIiwiQ1AiLCJFc3RhZG8gQ2l2aWwiKQoKVGlwbzc8LWMoIkN1YWxpdGF0aXZlIChub21pbmFsKSIsIlF1YW50aWF0aXZlIChkaXNjcmV0ZSkiLCAiQ3VhbGl0YXRpdmUgKG5vbWluYWwpIiwgIlF1YW50aWF0aXZlIChkaXNjcmV0ZSkiLCJDdWFsaXRhdGl2ZSAobm9taW5hbCkiLCJDdWFsaXRhdGl2ZSAobm9taW5hbCkiLCJRdWFudGlhdGl2ZSAoY29udGludW91cykiLCJDdWFsaXRhdGl2ZSAobm9taW5hbCkiLCJDdWFsaXRhdGl2ZSAobm9taW5hbCkiLCJDdWFsaXRhdGl2ZSAobm9taW5hbCkiLCJDdWFsaXRhdGl2ZSAobm9taW5hbCkiLCJDdWFsaXRhdGl2ZSAobm9taW5hbCkiKQoKRXNjYWxhNzwtYygiTi9BIiwiRmVjaGEgKFkvTS9EKSIsICJOL0EiLCAiRmVjaGEgKFkvTS9EKSIsIk4vQSIsIk4vQSIsIlBlc29zIE1leGljYW5vcyIsIk4vQSIsIk4vQSIsIk4vQSIsIkNQIiwiTi9BIikKCnRhYmxlNzwtZGF0YS5mcmFtZShWYXJpYWJsZTcsVGlwbzcsRXNjYWxhNykKa25pdHI6OmthYmxlKHRhYmxlKQoKYGBgCgojIyA8aW1nIHNyYz0iL1VzZXJzL2VtaWxpb29sdmVyYS9EZXNrdG9wL0ZPVE9TRVZJREVOQ0lBL0xJTVBJRVpBREVEQVRPUy5wbmciPiAgCgojIyMgUGFxdWV0ZXMKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobmFuaWFyKQpsaWJyYXJ5KEhtaXNjKSAgICAgICAgIApsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShrbml0cikKIyBpbnN0YWxsLnBhY2thZ2VzKCJwb2xsc3RlciIpCmxpYnJhcnkocG9sbHN0ZXIpCmxpYnJhcnkoZXBpRGlzcGxheSkKbGlicmFyeShkZXNjcikKbGlicmFyeSh0aWR5cikKI2luc3RhbGwucGFja2FnZXMoIk1BU1MiKQpsaWJyYXJ5KE1BU1MpCgpgYGAKCiMjICoqTWVybWEqKgoKIyMjIDE6IEVsaW1pbmFyIHRvdGFsZXMKYGBge3J9Cm1lcm1hMTwtIG1lcm1hWy1jKDUsMTIsMTksMjUsMzEsMzYsNDIsNTQsNTksNjApLF0KYGBgCgojIyMgMjogQ29udmVydGlyIGNhcmFjdGVyIGEgZW50ZXJvLgpgYGB7cn0KbWVybWExJEtpbG9zIDwtIGFzLmludGVnZXIobWVybWExJEtpbG9zKQpzdHIobWVybWExKQpgYGAKCiMjIyAzOiBMYSB2YXJpYWJsZSBkZSBLaWxvcyBlc3RhYmEgZW4gZm9ybWF0byBkZSBjYXLDoWN0ZXIgeSBzZSBwYXNvIGEgbnVtw6lyaWNhLgoKYGBge3J9CnN0cihtZXJtYSkKbWVybWEkS2lsb3MgPC0gYXMubnVtZXJpYyhtZXJtYSRLaWxvcykKYGBgCgojIyAqKkFuw6FsaXNpcyBFeHBsb3JhdG9yaW8gZGUgbGFzIEJhc2VzIGRlIERhdG9zIC0gTUVSTUEqKgoKIyMjICpNZWRpYSoKCipMYXMgdmFyaWFibGVzIGRlIGZlY2hhIHkgZWwgbWVzIG5vIHB1ZWRlIHRlbmVyIG1lZGlhKgpgYGB7cn0KbWVkaWFfa2lsb3MgPC0gbWVhbihtZXJtYTEkS2lsb3MpCm1lZGlhX2tpbG9zCgpgYGAKCiMjIyAqTWVkaWFuYSoKCipMYXMgdmFyaWFibGVzIGRlIGZlY2hhIHkgZWwgbWVzIG5vIHB1ZWRlIHRlbmVyIG1lZGlhbmEqCmBgYHtyfQptZWRpYW5hX2tpbG9zIDwtIG1lZGlhbihtZXJtYTEkS2lsb3MpCm1lZGlhbmFfa2lsb3MKYGBgCgojIyMgKk1vZGEqCmBgYHtyfQptb2RlIDwtIGZ1bmN0aW9uICh4KSB7CiAgdXggPC0gdW5pcXVlKHgpCiAgdXggW3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LHV4KSkpXQp9Cgptb2RlX2ZlY2hhIDwtIG1vZGUobWVybWExJEZlY2hhKQptb2RlX2ZlY2hhCgptb2RlX21lcyA8LSBtb2RlKG1lcm1hMSRNZXMpCm1vZGVfbWVzCgptb2RlX2tpbG9zIDwtIG1vZGUobWVybWExJEtpbG9zKQptb2RlX2tpbG9zCmBgYAoqKlBvZGVtb3Mgb2JzZXJ2YXIgYXF1aSBxdWUgY29uIGVzdGEgZnVuY2lvbiBwb2RlbW9zIHZlciBxdWUgZWwgbWVzIGNvbiBtYXlvciBtZXJtYSBmdWUgYWdvc3RvIGNvbW8gbG8gaW5kaWNhIGxhIG1vZGEqKgoKIyMjICpEZXN2aWFjacOzbiBFc3TDoW5kYXIqCgoqTGFzIHZhcmlhYmxlcyBkZSBmZWNoYSB5IGVsIG1lcyBubyBwdWVkZSB0ZW5lciBkZXN2aWFjaW9uIGVzdGFuZGFyKgpgYGB7cn0KdmFyaWFuemFfa2lsb3MgPC0gdmFyKG1lcm1hMSRLaWxvcykKdmFyaWFuemFfa2lsb3MgCgpkZXN2aWFjaW9uZXN0YW5kYXJfa2lsb3MgPC0gc3FydCh2YXJpYW56YV9raWxvcykKZGVzdmlhY2lvbmVzdGFuZGFyX2tpbG9zCmBgYAoKIyMjICpUYWJsYSoKYGBge3J9CgpWYXJpYWJsZTwtYygiRmVjaGEiLCAiTWVzIiwgIktpbG9zIikKTWVkaWE8LWMoIk5BIiwgIk5BIiwgbWVkaWFfa2lsb3MpCk1lZGlhbmE8LWMoIk5BIiwgIk5BIiwgbWVkaWFuYV9raWxvcykKTW9kYTwtYyhtb2RlX2ZlY2hhLCBtb2RlX21lcywgbW9kZV9raWxvcykKRGVzdmlhY2lvbl9Fc3RhbmRhcjwtYygiTkEiLCAiTkEiLCBkZXN2aWFjaW9uZXN0YW5kYXJfa2lsb3MpCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLE1lZGlhLE1lZGlhbmEsTW9kYSxEZXN2aWFjaW9uX0VzdGFuZGFyKQprbml0cjo6a2FibGUodGFibGUpCmBgYAoKIyMgKipTY3JhcCoqCgojIyMgRWxpbWluYXIgcmVuZ2zDs24gZGUgVW5pZGFkZXMgdG90YWxlcyBkZSBzY3JhcApgYGB7cn0Kc2NyYXAxIDwtIHNjcmFwIFstIGMoMSksXQpgYGAKKipCb3JyYXIgdG9kb3MgbG9zIHJlZ2lzdHJvcyBOQSBkZSB1bmEgdGFibGEgcGFyYSB0ZW5lciB1bmEgYmFzZSBkZSBkYXRvcyBtYXMgZWZpY2llbnRlLCBzZSBxdWlzbyBoYWNlciBlc3RvIHBhcmEgbm8gdG9tYXIgZW4gY3VlbnRhIGVsIGRpYSBxdWUgbm8gaHVibyBwcm9kdWNjaW9uKioKYGBge3J9CnNjcmFwMiA8LSBzY3JhcDEKc2NyYXAyIDwtIG5hLm9taXQoc2NyYXAyKSAgICAKc3RyKHNjcmFwMikKYGBgCgojIyAqKkFuw6FsaXNpcyBFeHBsb3JhdG9yaW8gZGUgbGFzIEJhc2VzIGRlIERhdG9zIC0gU0NSQVAqKgoKIyMjICpNZWRpYSoKCipMYXMgdmFyaWFibGVzIGRlIGZlY2hhIHkgdWJpY2FjacOzbiBkZSBvcmlnZW4gbm8gcHVlZGUgdGVuZXIgbWVkaWEqCmBgYHtyfQptZWRpYV9jYW50aWRhZCA8LSBtZWFuKHNjcmFwMSRDYW50aWRhZCkKbWVkaWFfY2FudGlkYWQKYGBgCgojIyMgKk1lZGlhbmEqCgoqTGFzIHZhcmlhYmxlcyBkZSBmZWNoYSB5IHViaWNhY2nDs24gZGUgb3JpZ2VuIG5vIHB1ZWRlIHRlbmVyIG1lZGlhbmEqCmBgYHtyfQptZWRpYW5hX2NhbnRpZGFkIDwtIG1lZGlhbihzY3JhcDEkQ2FudGlkYWQpCm1lZGlhbmFfY2FudGlkYWQKYGBgCgojIyMgKk1vZGEqCmBgYHtyfQptb2RlIDwtIGZ1bmN0aW9uICh4KSB7CiAgdXggPC0gdW5pcXVlKHgpCiAgdXggW3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LHV4KSkpXQp9Cgptb2RlX2ZlY2hhMSA8LSBtb2RlKHNjcmFwMSRGZWNoYSkKbW9kZV9mZWNoYTEKCm1vZGVfY2FudGlkYWQgPC0gbW9kZShzY3JhcDEkQ2FudGlkYWQpCm1vZGVfY2FudGlkYWQKCm1vZGVfdWJpY2FjaW9uIDwtIG1vZGUoc2NyYXAxJFViaWNhY2nDs24uZGUub3JpZ2VuKQptb2RlX3ViaWNhY2lvbgpgYGAKCiMjIyAqRGVzdmlhY2nDs24gRXN0w6FuZGFyKgoKKkxhcyB2YXJpYWJsZXMgZGUgZmVjaGEgeSB1YmljYWNpw7NuIGRlIG9yaWdlbiBubyBwdWVkZSB0ZW5lciBkZXN2aWFjaW9uIGVzdGFuZGFyKgpgYGB7cn0KdmFyaWFuemFfY2FudGlkYWQgPC0gdmFyKHNjcmFwMSRDYW50aWRhZCkKdmFyaWFuemFfY2FudGlkYWQKCmRlc3ZpYWNpb25lc3RhbmRhcl9jYW50aWRhZCA8LSBzcXJ0KHZhcmlhbnphX2NhbnRpZGFkKQpkZXN2aWFjaW9uZXN0YW5kYXJfY2FudGlkYWQKYGBgCgojIyMgKlRhYmxhKgpgYGB7cn0KVmFyaWFibGU8LWMoIkZlY2hhIiwgIkNhbnRpZGFkIiwgIlViaWNhY2nDs25fZGVfb3JpZ2VuIikKTWVkaWE8LWMoIk5BIiwgbWVkaWFfY2FudGlkYWQsICJOQSIpCk1lZGlhbmE8LWMoIk5BIixtZWRpYW5hX2NhbnRpZGFkLCAiTkEiKQpNb2RhPC1jKG1vZGVfZmVjaGExLCBtb2RlX2NhbnRpZGFkLCBtb2RlX3ViaWNhY2lvbikKRGVzdmlhY2lvbl9Fc3RhbmRhcjwtYygiTkEiLCBkZXN2aWFjaW9uZXN0YW5kYXJfY2FudGlkYWQsICJOQSIpCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLE1lZGlhLE1lZGlhbmEsTW9kYSxEZXN2aWFjaW9uX0VzdGFuZGFyKQprbml0cjo6a2FibGUodGFibGUpCmBgYAoKIyMgKipEZWxpdmVyeSBQZXJmb3JtYW5jZSoqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQojZmlsZS5jaG9vc2UoKQpiZDIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9lbWlsaW9vbHZlcmEvRG93bmxvYWRzL0ZPUk0gLSBEZWxpdmVyeSBQZXJmb3JtYW5jZSBCRCBCVUVOQS5jc3YiKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGphbml0b3IpCnBlcmZvcm1hbmNlIDwtIGNsZWFuX25hbWVzKGJkMikKc3VtbWFyeShwZXJmb3JtYW5jZSkKYGBgCgojIyMgVMOpY25pY2EgMS5Cb3JyYXIgY29sdW1uYXMuCmBgYHtyfQpwZXJmb3JtYW5jZSA8LSBzdWJzZXQocGVyZm9ybWFuY2UsIHNlbGVjdCA9IC1jKHgsIHhfMSwgeF8yLCB4XzMpKQpzdW1tYXJ5KHBlcmZvcm1hbmNlKQpgYGAKCiMjIyBUw6ljbmljYSAyLkNvbnZlcnRpciBkZSBjYXJhY3RlciBhIGZlY2hhCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpwZXJmb3JtYW5jZSRmZWNoYSA8LSBhcy5EYXRlKHBlcmZvcm1hbmNlJGZlY2hhLCBmb3JtYXQgPSAiJWQvJW0vJVkiKQp0aWJibGUocGVyZm9ybWFuY2UpCgpgYGAKCiMjIyBUw6ljbmljYSAzLkNvbnZlcnRpciBkZSBjYXJhY3RlciBhIGVudGVybyAKYGBge3J9CnBlcmZvcm1hbmNlJHByaW50ZWwgPC0gc3Vic3RyKHBlcmZvcm1hbmNlJHByaW50ZWwsIHN0YXJ0ID0gMSwgc3RvcCA9IDIpCnRpYmJsZShwZXJmb3JtYW5jZSkKcGVyZm9ybWFuY2UkcHJpbnRlbCA8LSBhcy5udW1lcmljKHBlcmZvcm1hbmNlJHByaW50ZWwpCnN0cihwZXJmb3JtYW5jZSkKCnBlcmZvcm1hbmNlJG1haGxlIDwtIHN1YnN0cihwZXJmb3JtYW5jZSRtYWhsZSwgc3RhcnQgPSAxLCBzdG9wID0gMikKcGVyZm9ybWFuY2UkbWFobGUgPC0gYXMubnVtZXJpYyhwZXJmb3JtYW5jZSRtYWhsZSkKCnBlcmZvcm1hbmNlJG1hZ25hIDwtIHN1YnN0cihwZXJmb3JtYW5jZSRtYWduYSwgc3RhcnQgPSAxLCBzdG9wID0gMikKcGVyZm9ybWFuY2UkbWFnbmEgPC0gYXMubnVtZXJpYyhwZXJmb3JtYW5jZSRtYWduYSkKc3RyKHBlcmZvcm1hbmNlKQoKcGVyZm9ybWFuY2UkdmFycm9jIDwtIHN1YnN0cihwZXJmb3JtYW5jZSR2YXJyb2MsIHN0YXJ0ID0gMSwgc3RvcCA9IDIpCnBlcmZvcm1hbmNlJHZhcnJvYyA8LSBhcy5udW1lcmljKHBlcmZvcm1hbmNlJHZhcnJvYykKc3RyKHBlcmZvcm1hbmNlKQpgYGAKCiMjIyBUw6ljbmljYSA0LlJlZW1wbGF6YXIgTkFzIGNvbiBsYSBtZWRpYW5hIGRlIGNhZGEgdmFyaWFibGUKYGBge3J9CnNhcHBseShwZXJmb3JtYW5jZSwgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKCnBlcmZvcm1hbmNlJGZlY2hhW2lzLm5hKHBlcmZvcm1hbmNlJGZlY2hhKV08LW1lZGlhbihwZXJmb3JtYW5jZSRmZWNoYSwgbmEucm0gPSBUUlVFKQpwZXJmb3JtYW5jZSRwcmludGVsW2lzLm5hKHBlcmZvcm1hbmNlJHByaW50ZWwpXTwtbWVkaWFuKHBlcmZvcm1hbmNlJHByaW50ZWwsIG5hLnJtID0gVFJVRSkKcGVyZm9ybWFuY2UkbWFobGVbaXMubmEocGVyZm9ybWFuY2UkbWFobGUpXTwtbWVkaWFuKHBlcmZvcm1hbmNlJG1haGxlLCBuYS5ybSA9IFRSVUUpCnBlcmZvcm1hbmNlJG1hZ25hW2lzLm5hKHBlcmZvcm1hbmNlJG1hZ25hKV08LW1lZGlhbihwZXJmb3JtYW5jZSRtYWduYSwgbmEucm0gPSBUUlVFKQpwZXJmb3JtYW5jZSR2YXJyb2NbaXMubmEocGVyZm9ybWFuY2UkdmFycm9jKV08LW1lZGlhbihwZXJmb3JtYW5jZSR2YXJyb2MsIG5hLnJtID0gVFJVRSkKc3VtbWFyeShwZXJmb3JtYW5jZSkKYGBgCgojIyAqKkFuw6FsaXNpcyBFeHBsb3JhdG9yaW8gZGUgbGFzIEJhc2VzIGRlIERhdG9zLSBEZWxpdmVyeSBQZXJmb3JtYW5jZSoqCgojIyMgKk1lZGlhKgpgYGB7cn0KbWVkaWFfcHJpbnRlbCA8LSBtZWFuKHBlcmZvcm1hbmNlJHByaW50ZWwpCm1lZGlhX3ByaW50ZWwKCm1lZGlhX21haGxlIDwtIG1lYW4ocGVyZm9ybWFuY2UkbWFobGUpCm1lZGlhX21haGxlCgptZWRpYV9tYWduYSA8LSBtZWFuKHBlcmZvcm1hbmNlJG1hZ25hKQptZWRpYV9tYWduYQoKbWVkaWFfdmFycm9jIDwtIG1lYW4ocGVyZm9ybWFuY2UkdmFycm9jKQptZWRpYV92YXJyb2MKYGBgCgojIyMgKk1lZGlhbmEqCmBgYHtyfQptZWRpYW5hX3ByaW50ZWwgPC0gbWVkaWFuKHBlcmZvcm1hbmNlJHByaW50ZWwpCm1lZGlhbmFfcHJpbnRlbAoKbWVkaWFuYV9tYWhsZSA8LSBtZWRpYW4ocGVyZm9ybWFuY2UkbWFobGUpCm1lZGlhbmFfbWFobGUKCm1lZGlhbmFfbWFnbmEgPC0gbWVkaWFuKHBlcmZvcm1hbmNlJG1hZ25hKQptZWRpYW5hX21hZ25hCgptZWRpYW5hX3ZhcnJvYyA8LSBtZWRpYW4ocGVyZm9ybWFuY2UkdmFycm9jKQptZWRpYW5hX3ZhcnJvYwpgYGAKCiMjIyAqTW9kYSogCmBgYHtyfQptb2RlIDwtIGZ1bmN0aW9uKHgpIHsKICB1eCA8LSB1bmlxdWUoeCkKICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldCn0KbW9kYV9wcmludGVsIDwtIG1vZGUocGVyZm9ybWFuY2UkcHJpbnRlbCkKbW9kYV9wcmludGVsCgptb2RhX21haGxlIDwtIG1vZGUocGVyZm9ybWFuY2UkbWFobGUpCm1vZGFfbWFobGUKCm1vZGFfbWFnbmEgPC0gbW9kZShwZXJmb3JtYW5jZSRtYWduYSkKbW9kYV9tYWduYQoKbW9kYV92YXJyb2MgPC0gbW9kZShwZXJmb3JtYW5jZSR2YXJyb2MpCm1vZGFfdmFycm9jCmBgYAoKIyMjICpWYXJpYW56YSoKYGBge3J9CnZhcmlhbnphX3ByaW50ZWwgPC12YXIocGVyZm9ybWFuY2UkcHJpbnRlbCkKdmFyaWFuemFfcHJpbnRlbAoKdmFyaWFuemFfbWFobGUgPC12YXIocGVyZm9ybWFuY2UkbWFobGUpCnZhcmlhbnphX21haGxlCgp2YXJpYW56YV9tYWduYSA8LXZhcihwZXJmb3JtYW5jZSRtYWduYSkKdmFyaWFuemFfbWFnbmEKCnZhcmlhbnphX3ZhcnJvYyA8LXZhcihwZXJmb3JtYW5jZSR2YXJyb2MpCnZhcmlhbnphX3ZhcnJvYwpgYGAKCiMjIyAqRGVzdmlhY2nDs24gRXN0w6FuZGFyKgpgYGB7cn0KZGVzdmlhY2lvbl9wcmludGVsIDwtIHNxcnQodmFyaWFuemFfcHJpbnRlbCkKZGVzdmlhY2lvbl9wcmludGVsCgpkZXN2aWFjaW9uX21haGxlIDwtIHNxcnQodmFyaWFuemFfbWFobGUpCmRlc3ZpYWNpb25fbWFobGUKCmRlc3ZpYWNpb25fbWFnbmEgPC0gc3FydCh2YXJpYW56YV9tYWduYSkKZGVzdmlhY2lvbl9tYWduYQoKZGVzdmlhY2lvbl92YXJyb2MgPC0gc3FydCh2YXJpYW56YV92YXJyb2MpCmRlc3ZpYWNpb25fdmFycm9jCmBgYAoKIyMjICpUYWJsYSoKYGBge3J9ClZhcmlhYmxlMiA8LWMoIlByaW50ZWwiLCJNYWhsZSIsICJNYWduYSIsICJWYXJyb2MiKQpQcm9tZWRpbzIgPC1jKCIwLjMzOSIsICIyLjIwOSIsIjAiLCAiMCIpCk1vZGEyIDwtYygiICIsIiAiLCIgIiwgIiAiKQpNZWRpYW5hMiA8LWMoIjAiLCIzIiwiMCIsICIwIikKVmFyaWFuemEyIDwtYygiMC40NDEiLCIyLjkwOSIsIjAiLCAiMCIpCkRlc3ZpYWNpw7NuX0VzdMOhbmRhcjIgPC1jICgiMC42NjQiLCIxLjcwNSIsIjAiLCAiMCIpCnRhYmxhMiA8LWRhdGEuZnJhbWUoVmFyaWFibGUyLFByb21lZGlvMiwgTW9kYTIsIE1lZGlhbmEyLCBWYXJpYW56YTIsIERlc3ZpYWNpw7NuX0VzdMOhbmRhcjIpCnRhYmxhMgprbml0cjo6a2FibGUodGFibGEyKQpgYGAKCiMjICoqRGVsaXZlcnkgUGxhbioqCgojIyMjIEltcG9ydGFyIGxhcyBiYXNlcyBkZSBkYXRvcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShuYW5pYXIpCmxpYnJhcnkoSG1pc2MpICAgICAgICAgCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkocG9sbHN0ZXIpCmxpYnJhcnkoZXBpRGlzcGxheSkKbGlicmFyeShkZXNjcikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ2Vhc3kpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShwYXRjaHdvcmspCgojIGZpbGUuY2hvb3NlKCkKYmQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9lbWlsaW9vbHZlcmEvRG93bmxvYWRzL0RlbGl2ZXJ5IFBsYW4gRklOQUwgLSBFUVVJUE8gNCAuY3N2IikKYGBgCgojIyMgVMOpY25pY2EgMS4gQWNvbmRpY2lvbmFyIG5vbWJyZXMgYSBmb3JtYXRvIMOzcHRpbW8gcGFyYSBSCmBgYHtyfQpiZCA8LSBjbGVhbl9uYW1lcyhiZCkKYGBgCgojIyMgVMOpY25pY2EgMi5VbmlyIGxvcyBwZWRpZG9zIHByb2dyYW1hZG9zIGVuIHVuYSBzb2xhIGNvbHVtbmEuCmBgYHtyfQpiZCA8LSBiZCAlPiUgZHBseXI6OnJlbmFtZShjbGllbnRlPWNsaWVudGVfcGxhbnRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFfanVuXzIxPWp1bmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJfanVsXzIxPWp1bGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENfYWdvXzIxPWFnb3N0bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEX3NlcF8yMT1zZXB0aWVtYnJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVfb2N0XzIxPW9jdHVicmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRl9ub3ZfMjE9bm92aWVtYnJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfZGljXzIxPWRpY2llbWJyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIX2VuZV8yMj1lbmVfMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSV9mZWJfMjI9ZmViXzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSl9tYXJfMjI9bWFyXzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS19hYnJfMjI9YWJyXzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTF9tYXlfMjI9bWF5XzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTV9qdW5fMjI9anVuXzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTl9qdWxfMjI9anVsXzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT19hZ29fMjI9YWdvXzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9zZXBfMjI9c2VwXzIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUV9vY3RfMjI9b2N0dWJyZV8yMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJfbm92XzIyPW5vdl8yMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNfZGljXzIyPWRpY18yMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfZW5lXzIzPWVuZV8yMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVfZmViXzIzPWZlYl8yMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZfbWFyXzIzPWZlYl8yMwogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICApCmNvbG5hbWVzKGJkKQpiZCA8LSBwaXZvdF9sb25nZXIoYmQsIGNvbHM9NToxNCwgbmFtZXNfdG8gPSAiTWVzIiwgdmFsdWVzX3RvID0gIlVuaWRhZGVzIikKc3RyKGJkKQpgYGAKCiMjIyBUw6ljbmljYSAzLkVsaW1pbmFjacOzbiBkZSBjZXJvcyBlbiBsYSBiYXNlIGRlIGRhdG9zIHBhcmEgZWxpbWluYXIgcmVuZ29sZXMvY2xpZW50ZXMgc2luIHJlZ2lzdHJvcwpgYGB7cn0KYmQxIDwtIGZpbHRlcihiZCwgVW5pZGFkZXM+MCkKYGBgCgojIyMgVMOpY25pY2EgNC5FbGltaW5hY2nDs24gZGUgdmFyaWFibGVzIGlycmVsZXZhbnRlcy4gRW4gZXN0ZSBjYXNvLCBkYWRvIHF1ZSBwcmV2aWFtZW50ZSBzZSB1bmllcm9uIChtZXJnZSkgbGFzIHZhcmlhYmxlcyBkZSBtZXMsIHNvbG8gc2UgY29uc2lkZXJhIG5lY2VzYXJpYSBsYSB2YXJpYWJsZXMgZGUgY2xpZW50ZSwgZmVjaGEgeSBVbmlkYWRlcwpgYGB7cn0KYmQyIDwtIGJkMSAgICAgICAgIApiZDIgPC0gc3Vic2V0IChiZDEsIHNlbGVjdCA9IC1jIChwcm95ZWN0bywgaWRfb2RvbywgaXRlbSwgS19hYnJfMjIsIExfbWF5XzIyLCBNX2p1bl8yMixOX2p1bF8yMixPX2Fnb18yMiwgUF9zZXBfMjIsIFFfb2N0XzIyLCBSX25vdl8yMiwgIFNfZGljXzIyLCBUX2VuZV8yMywgVl9tYXJfMjMsIG1hcl8yMywgdG90YWxfbWVzZXMpKQpzdW1tYXJ5KGJkMikKYGBgCgojIyAqKkFuw6FsaXNpcyBFeHBsb3JhdG9yaW8gZGUgbGFzIEJhc2VzIGRlIERhdG9zIC0gRGVsaXZlcnkgUGxhbioqCgojIyMgKk1lZGlhKgpgYGB7cn0KTWVkaWEgPC0gbWVhbihiZDIkVW5pZGFkZXMpCk1lZGlhCmBgYAoKIyMjICpNZWRpYW5hKgpgYGB7cn0KTWVkaWFuYSA8LSBtZWRpYW4oYmQyJFVuaWRhZGVzKQpNZWRpYW5hCmBgYAoKIyMjICpNb2RhKgpgYGB7cn0KbW9kZSA8LSBmdW5jdGlvbih4KSB7CiAgdXggPC0gdW5pcXVlKHgpCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQp9CgpNb2RhX2NsaWVudGVzIDwtIG1vZGUoYmQyJGNsaWVudGUpICAKTW9kYV9jbGllbnRlcwoKTW9kYV9tZXMgPC0gbW9kZShiZDIkTWVzKSAgCk1vZGFfbWVzCgpNb2RhX3VuaWRhZGVzIDwtIG1vZGUoYmQyJFVuaWRhZGVzKSAgCk1vZGFfdW5pZGFkZXMKYGBgCgojIyMgKlZhcmlhbnphKgpgYGB7cn0KdmFyaWFuemFfdW5pZGFkZXNfcHJvZyA8LSB2YXIoYmQyJFVuaWRhZGVzKQp2YXJpYW56YV91bmlkYWRlc19wcm9nCmBgYAoKIyMjICpEZXN2aWFjacOzbiBFc3TDoW5kYXIqCmBgYHtyfQpkZXN2aWFjaW9uX3VuaWRhZGVzX3Byb2c8LSBzcXJ0KHZhcmlhbnphX3VuaWRhZGVzX3Byb2cpCmRlc3ZpYWNpb25fdW5pZGFkZXNfcHJvZwpgYGAKCiMjIyAqVGFibGEqCmBgYHtyfQpWYXJpYWJsZTwtYygiVW5pZGFkZXMiLCAiTWVzIiwgImNsaWVudGUiKQpNZWRpYTwtYyhNZWRpYSwgIk5BIiwgIk5BIikKTWVkaWFuYTwtYyhNZWRpYW5hLCAiTkEiLCAiTkEiKQpNb2RhPC1jKE1vZGFfdW5pZGFkZXMsIE1vZGFfbWVzLCBNb2RhX2NsaWVudGVzKQpEZXN2aWFjaW9uX0VzdGFuZGFyPC1jKCIxMDAyLjgzNCIsICJOQSIsICJOQSIpCnRhYmxlMSA8LSBkYXRhLmZyYW1lKFZhcmlhYmxlLCBNZWRpYSwgTWVkaWFuYSwgTW9kYSwgRGVzdmlhY2lvbl9Fc3RhbmRhcikKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCgojIyAqKlJlY3Vyc29zIEh1bWFub3MgQ29sYWJvcmFkb3JlcyoqCgojIyMjIEltcG9ydGFyIGxhcyBiYXNlcyBkZSBkYXRvcwpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKYmQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9lbWlsaW9vbHZlcmEvRG93bmxvYWRzL0ZPUk0gLSBSZWN1cnNvcyBIdW1hbm9zIC0gY29sYWJvcmFkb3Jlcy5jc3YiKQojIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikKbGlicmFyeShkcGx5cikKIyBpbnN0YWxsLnBhY2thZ2VzKCJqYW5pdG9yIikKbGlicmFyeShqYW5pdG9yKQpjb2xhYm9yYWRvcmVzIDwtIGNsZWFuX25hbWVzKGJkKQpzdW1tYXJ5KGNvbGFib3JhZG9yZXMpCmBgYAoKIyMjIFTDqWNuaWNhIDEuIEJvcnJhciBjb2x1bW5hcy4KYGBge3J9CmNvbGFib3JhZG9yZXMgPC0gc3Vic2V0KGNvbGFib3JhZG9yZXMsIHNlbGVjdCA9IC1jKG5vX2VtcGxlYWRvLCBub21icmVfY29tcGxldG8sIGZlY2hhX2FsdGEsIG1hbm9fZGVfb2JyYSkpCmBgYAoKIyMjIFTDqWNuaWNhIDIuIFJlZW1wbGV6YXIgTkFzIGNvbiBlbCBwcm9tZWRpbyBlbiBsYSBjb2x1bW5hIGRlICJTYWxhcmlvIERpYXJpbyIKYGBge3J9CmNvbGFib3JhZG9yZXMkc2FsYXJpb19kaWFyaW9baXMubmEoY29sYWJvcmFkb3JlcyRzYWxhcmlvX2RpYXJpbyldPC1tZWFuKGNvbGFib3JhZG9yZXMkc2FsYXJpb19kaWFyaW8sIG5hLnJtID0gVFJVRSkKc3VtbWFyeSAoY29sYWJvcmFkb3JlcykKYGBgCgojIyAqKkFuw6FsaXNpcyBFeHBsb3JhdG9yaW8gZGUgbGFzIEJhc2VzIGRlIERhdG9zIC0gQ29sYWJvcmFkb3JlcyoqCgojIyMgKk1lZGlhKgpgYGB7cn0KbWVkaWFfZWRhZCA8LSBtZWFuKGNvbGFib3JhZG9yZXMkZWRhZCkKbWVkaWFfZWRhZAoKbWVkaWFfYW50aWd1ZWRhZCA8LSBtZWFuKGNvbGFib3JhZG9yZXMkYW50aWd1ZWRhZCkKbWVkaWFfYW50aWd1ZWRhZAoKbWVkaWFfc2FsYXJpbyA8LSBtZWFuKGNvbGFib3JhZG9yZXMkc2FsYXJpb19kaWFyaW8pCm1lZGlhX3NhbGFyaW8KYGBgCgojIyMgKk1lZGlhbmEqCmBgYHtyfQptZWRpYW5hX2VkYWQgPC0gbWVkaWFuKGNvbGFib3JhZG9yZXMkZWRhZCkKbWVkaWFuYV9lZGFkCgptZWRpYW5hX2FudGlndWVkYWQgPC0gbWVkaWFuKGNvbGFib3JhZG9yZXMkYW50aWd1ZWRhZCkKbWVkaWFuYV9hbnRpZ3VlZGFkCgptZWRpYW5hX3NhbGFyaW8gPC0gbWVkaWFuKGNvbGFib3JhZG9yZXMkc2FsYXJpb19kaWFyaW8pCm1lZGlhbmFfc2FsYXJpbyAKYGBgCgojIyMgKk1vZGEqIApgYGB7cn0KbW9kZSA8LSBmdW5jdGlvbih4KSB7CiAgdXggPC0gdW5pcXVlKHgpCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQp9Cm1vZGFfZWRhZCA8LSBtb2RlKGNvbGFib3JhZG9yZXMkZWRhZCkKbW9kYV9lZGFkCgptb2RhX2FudGlndWVkYWQgPC0gbW9kZShjb2xhYm9yYWRvcmVzJGFudGlndWVkYWQpCm1vZGFfYW50aWd1ZWRhZAoKbW9kYV9zYWxhcmlvIDwtIG1vZGUoY29sYWJvcmFkb3JlcyRzYWxhcmlvX2RpYXJpbykKbW9kYV9zYWxhcmlvIApgYGAKCiMjIyAqVmFyaWFuemEqCmBgYHtyfQp2YXJpYW56YV9lZGFkIDwtdmFyKGNvbGFib3JhZG9yZXMkZWRhZCkKdmFyaWFuemFfZWRhZAoKdmFyaWFuemFfYW50aWd1ZWRhZCA8LXZhcihjb2xhYm9yYWRvcmVzJGFudGlndWVkYWQpCnZhcmlhbnphX2FudGlndWVkYWQKCnZhcmlhbnphX3NhbGFyaW8gPC12YXIoY29sYWJvcmFkb3JlcyRzYWxhcmlvX2RpYXJpbykKdmFyaWFuemFfc2FsYXJpbwpgYGAKCiMjIyAqRGVzdmlhY2nDs24gRXN0w6FuZGFyKgpgYGB7cn0KZGVzdmlhY2lvbl9lZGFkIDwtIHNxcnQodmFyaWFuemFfZWRhZCkKZGVzdmlhY2lvbl9lZGFkCgpkZXN2aWFjaW9uX2FudGlndWVkYWQgPC0gc3FydCh2YXJpYW56YV9hbnRpZ3VlZGFkKQpkZXN2aWFjaW9uX2FudGlndWVkYWQKCmRlc3ZpYWNpb25fc2FsYXJpbyA8LSBzcXJ0KHZhcmlhbnphX3NhbGFyaW8pCmRlc3ZpYWNpb25fc2FsYXJpbwoKYGBgCgojIyMgKlRhYmxhKgpgYGB7cn0KVmFyaWFibGUgPC1jKCJFZGFkIiwiQW50aWd1ZWRhZCIsIlNhbGFyaW8gRGlhcmlvIikKUHJvbWVkaW8gPC1jKCIzNiIsICIxLjQyIiwiMTc5LjA5OCIpCk1vZGEgPC1jKCIzMiIsIjAiLCIxODAuNjgiKQpNZWRpYW5hIDwtYygiMzQiLCIwIiwiMTgwLjY4IikKVmFyaWFuemEgPC1jKCIxNjUuMDA1IiwiNi4zNTMiLCI1ODkuNzIyIikKRGVzdmlhY2nDs25fRXN0w6FuZGFyIDwtYyAoIjEyLjg0NSIsIjIuNTIwIiwiMjQuMjg0IikKdGFibGEgPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFByb21lZGlvLCBNb2RhLCBNZWRpYW5hLCBWYXJpYW56YSwgRGVzdmlhY2nDs25fRXN0w6FuZGFyKQp0YWJsYQprbml0cjo6a2FibGUodGFibGEpCmBgYAoKCiMjICoqUmVjdXJzb3MgSHVtYW5vcyBCYWphcyoqCgojIyMjIEltcG9ydGFyIGxhcyBiYXNlcyBkZSBkYXRvcwpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKYmQxPC0gcmVhZC5jc3YoIi9Vc2Vycy9lbWlsaW9vbHZlcmEvRG93bmxvYWRzL0ZPUk0gLSBSZWN1cnNvcyBIdW1hbm9zIC0gYmFqYXMuY3N2IikKYmFqYXMgPC0gY2xlYW5fbmFtZXMoYmQxKQpzdW1tYXJ5KGJhamFzKQpgYGAKCiMjIExpbXBpZXphLCBUcmFuc2Zvcm1hY2nDs24sIHkgT3JnYW5pemFjacOzbiBkZSBCYXNlcyBkZSBEYXRvcwoKIyMjICBSZWVtcGxhemFyIE5BIGNvbiBDRVJPUyBlbiBsYSBjb2x1bW5hIGRlICJBbnRpZ8O8ZWRhZCIgeWEgcXVlIGVzIGxhIE1lZGlhbmEgeSBNb2RhLgpgYGB7cn0KYmFqYXMkYW50aWd1ZWRhZFtpcy5uYShiYWphcyRhbnRpZ3VlZGFkKV08LTAKYGBgCgojIyMgUmVlbXBsZXphciBOQXMgY29uIGVsIHByb21lZGlvIGVuIGxhIGNvbHVtbmEgZGUgIkVkYWQiIHkgIlNhbGFyaW8gRGlhcmlvIgpgYGB7cn0KYmFqYXMkZWRhZFtpcy5uYShiYWphcyRlZGFkKV08LW1lYW4oYmFqYXMkZWRhZCwgbmEucm0gPSBUUlVFKQpiYWphcyRzYWxhcmlvX2RpYXJpb1tpcy5uYShiYWphcyRzYWxhcmlvX2RpYXJpbyldPC1tZWFuKGJhamFzJHNhbGFyaW9fZGlhcmlvLCBuYS5ybSA9IFRSVUUpCnN1bW1hcnkgKGJhamFzKQpgYGAKCiMjIyBUw6ljbmljYSAzLkNvbnZlcnRpciBkZSBjYXJhY3RlciBhIGZlY2hhCmBgYHtyfQpiYWphcyRiYWphIDwtIGFzLkRhdGUoYmFqYXMkYmFqYSwgZm9ybWF0ID0gIiVkLyVtLyVZIikKdGliYmxlKGJhamFzKQpiYWphcyRiYWphW2lzLm5hKGJhamFzJGJhamEpXTwtbWVhbihiYWphcyRiYWphLCBuYS5ybSA9IFRSVUUpCnN1bW1hcnkgKGJhamFzKQpgYGAKCiMjICoqQW7DoWxpc2lzIEV4cGxvcmF0b3JpbyBkZSBsYXMgQmFzZXMgZGUgRGF0b3MtIFJIIEJhamFzKioKCiMjIyAqTWVkaWEqCmBgYHtyfQptZWRpYV9lZGFkMSA8LSBtZWFuKGJhamFzJGVkYWQpCm1lZGlhX2VkYWQxCgptZWRpYV9hbnRpZ3VlZGFkMSA8LSBtZWFuKGJhamFzJGFudGlndWVkYWQpCm1lZGlhX2FudGlndWVkYWQxCgptZWRpYV9zYWxhcmlvMSA8LSBtZWFuKGJhamFzJHNhbGFyaW9fZGlhcmlvKQptZWRpYV9zYWxhcmlvMQpgYGAKCiMjIyAqTWVkaWFuYSoKYGBge3J9Cm1lZGlhbmFfZWRhZDEgPC0gbWVkaWFuKGJhamFzJGVkYWQpCm1lZGlhbmFfZWRhZDEKCm1lZGlhbmFfYW50aWd1ZWRhZDEgPC0gbWVkaWFuKGJhamFzJGFudGlndWVkYWQpCm1lZGlhbmFfYW50aWd1ZWRhZDEKCm1lZGlhbmFfc2FsYXJpbzEgPC0gbWVkaWFuKGJhamFzJHNhbGFyaW9fZGlhcmlvKQptZWRpYW5hX3NhbGFyaW8xCmBgYAoKIyMjICpNb2RhKiAKYGBge3J9Cm1vZGUgPC0gZnVuY3Rpb24oeCkgewogIHV4IDwtIHVuaXF1ZSh4KQogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0KfQptb2RhX2VkYWQxIDwtIG1vZGUoYmFqYXMkZWRhZCkKbW9kYV9lZGFkMQoKbW9kYV9hbnRpZ3VlZGFkMSA8LSBtb2RlKGJhamFzJGFudGlndWVkYWQpCm1vZGFfYW50aWd1ZWRhZDEKCm1vZGFfc2FsYXJpbzEgPC0gbW9kZShiYWphcyRzYWxhcmlvX2RpYXJpbykKbW9kYV9zYWxhcmlvMSAKYGBgCgojIyMgKlZhcmlhbnphKgpgYGB7cn0KdmFyaWFuemFfZWRhZDEgPC12YXIoYmFqYXMkZWRhZCkKdmFyaWFuemFfZWRhZDEKCnZhcmlhbnphX2FudGlndWVkYWQxIDwtdmFyKGJhamFzJGFudGlndWVkYWQpCnZhcmlhbnphX2FudGlndWVkYWQxCgp2YXJpYW56YV9zYWxhcmlvMSA8LXZhcihiYWphcyRzYWxhcmlvX2RpYXJpbykKdmFyaWFuemFfc2FsYXJpbzEKYGBgCgojIyMgKkRlc3ZpYWNpw7NuIEVzdMOhbmRhcioKYGBge3J9CmRlc3ZpYWNpb25fZWRhZDEgPC0gc3FydCh2YXJpYW56YV9lZGFkMSkKZGVzdmlhY2lvbl9lZGFkMQoKZGVzdmlhY2lvbl9hbnRpZ3VlZGFkMSA8LSBzcXJ0KHZhcmlhbnphX2FudGlndWVkYWQxKQpkZXN2aWFjaW9uX2FudGlndWVkYWQxCgpkZXN2aWFjaW9uX3NhbGFyaW8xIDwtIHNxcnQodmFyaWFuemFfc2FsYXJpbzEpCmRlc3ZpYWNpb25fc2FsYXJpbzEKYGBgCgojIyMgKlRhYmxhKgpgYGB7cn0KVmFyaWFibGUxIDwtYygiRWRhZCIsIkFudGlndWVkYWQiLCJTYWxhcmlvIERpYXJpbyIpClByb21lZGlvMSA8LWMoIjMxLjA1IiwiMC42IiwiMTc3Ljk4NSIpCk1vZGExIDwtYygiMjIiLCIwIiwiMTgwLjY4IikKTWVkaWFuYTEgPC1jKCIyOSIsIjAiLCIxODAuNjgiKQpWYXJpYW56YTEgPC1jKCI5MC43MzIiLCIwLjY2NzciLCI1MzEuOTk2IikKRGVzdmlhY2nDs25fRXN0w6FuZGFyMSA8LWMgKCI5LjUyNSIsIjAuODE3IiwiMjMuMDY1IikKdGFibGExIDwtZGF0YS5mcmFtZSAoVmFyaWFibGUxLFByb21lZGlvMSwgTW9kYTEsIE1lZGlhbmExLCBWYXJpYW56YTEsIERlc3ZpYWNpw7NuX0VzdMOhbmRhcjEpCnRhYmxhMQprbml0cjo6a2FibGUodGFibGExKQpgYGAKCgojIyAqKlByb2R1Y2Npb24gZGUgY2FydG9uKioKCiMjIyMgSW1wb3J0YXIgbGFzIGJhc2VzIGRlIGRhdG9zCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQojZmlsZS5jaG9vc2UoKQpiZDQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9lbWlsaW9vbHZlcmEvRG93bmxvYWRzL0VNSV9DQVJUT04uY3N2IikKbGlicmFyeShqYW5pdG9yKQpwcm9kdWNjaW9uIDwtIGNsZWFuX25hbWVzKGJkNCkKc3VtbWFyeShwcm9kdWNjaW9uKQoKcHJvZHVjY2lvbiA8LSBzdWJzZXQocHJvZHVjY2lvbixzZWxlY3QgPSAtYyAoaWRfZm9ybSwgcHJvZHVjdG8sIGhyX2ZpbiwgaW5pY2lvX3NlcF91cCwgZmluX2luaWNpb19kZV9zZXBfdXAsIGluaWNpb19kZV9wcm9jZXNvLCBmaW5fZGVfcHJvY2VzbywgdGllbXBvX21hdGVyaWFsZXMpKQpzdW1tYXJ5KHByb2R1Y2Npb24pCgpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KG5hbmlhcikKbGlicmFyeShIbWlzYykgICAgICAgICAKbGlicmFyeShwc3ljaCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoa25pdHIpCiMgaW5zdGFsbC5wYWNrYWdlcygicG9sbHN0ZXIiKQpsaWJyYXJ5KHBvbGxzdGVyKQpsaWJyYXJ5KGVwaURpc3BsYXkpCmxpYnJhcnkoZGVzY3IpCmxpYnJhcnkodGlkeXIpCmBgYAoKIyMjIFTDqWNuaWNhIDEuQ29udmVydGlyIGEgY2FyYWN0ZXIgYSBudW1lcmljbyB5IGRlIGZlY2hhCmBgYHtyfQpwcm9kdWNjaW9uJHBpZXphc19wcm9nPC1hcy5udW1lcmljKHByb2R1Y2Npb24kcGllemFzX3Byb2cpICAgICAgICAgICAgICAgICAKcHJvZHVjY2lvbiR0bW9fbWluPC1hcy5udW1lcmljKHByb2R1Y2Npb24kdG1vX21pbikgICAgICAgICAgICAgICAgICAKcHJvZHVjY2lvbiRsYW1pbmFzX3Byb2Nlc2FkYXM8LWFzLm51bWVyaWMocHJvZHVjY2lvbiRsYW1pbmFzX3Byb2Nlc2FkYXMpICAgCnByb2R1Y2Npb24kdGllbXBvX2NhbGlkYWQ8LWFzLm51bWVyaWMocHJvZHVjY2lvbiR0aWVtcG9fY2FsaWRhZCkgCnByb2R1Y2Npb24kZmVjaGEgPC0gYXMuRGF0ZShwcm9kdWNjaW9uJGZlY2hhLCBmb3JtYXQgPSAiJWQvJW0vJVkiKQpzdW1tYXJ5KHByb2R1Y2Npb24pCmBgYAoKCipBbCBhcGxpY2FyIGVzdGEgdGVjbmljYSBzZSBpbnRyb2R1Y2llcm9uIE5BcyBhIGxhIGJhc2UgZGUgZGF0b3MgbGFzIGN1YWxlcyBsdWVnbyBib3JyZSoKCiMjIyBUw6ljbmljYSAyLkJvcnJhciBsYXMgbGV0cmFzIGRlIGFsZ3Vub3MgcmVnaXN0cm9zIGRlICJQaWV6YV9Qcm9nIi4KYGBge3Igd2FybmluZz1GQUxTRX0KcHJvZHVjY2lvbiRwaWV6YXNfcHJvZyA8LSBzdHJfcmVwbGFjZShwcm9kdWNjaW9uJHBpZXphc19wcm9nLCAiW2FlaW91TEFNPU5iQnNTXSIsICIiKQpwcm9kdWNjaW9uJHBpZXphc19wcm9nIDwtIGFzLmludGVnZXIocHJvZHVjY2lvbiRsYW1pbmFzX3Byb2Nlc2FkYXMpCmBgYAoKIyMjIFTDqWNuaWNhIDMuUmVlbXBsYXphciBwb3IgbGEgbWVkaWFuYSBsb3MgTkHCtHMgZGUgdG1vX21pbiB5IGRlIHRpZW1wb19jYWxpZGFkCmBgYHtyIHdhcm5pbmc9RkFMU0V9CnByb2R1Y2Npb24kdG1vX21pbltpcy5uYShwcm9kdWNjaW9uJHRtb19taW4pXTwtbWVkaWFuKHByb2R1Y2Npb24kdG1vX21pbiwgbmEucm0gPSBUUlVFKQpwcm9kdWNjaW9uJHRpZW1wb19jYWxpZGFkW2lzLm5hKHByb2R1Y2Npb24kdGllbXBvX2NhbGlkYWQpXTwtbWVkaWFuKHByb2R1Y2Npb24kdGllbXBvX2NhbGlkYWQsIG5hLnJtID0gVFJVRSkKc3VtbWFyeShwcm9kdWNjaW9uKQpgYGAKCiMjICoqQW7DoWxpc2lzIEV4cGxvcmF0b3JpbyBkZSBsYXMgQmFzZXMgZGUgRGF0b3MtIFByb2R1Y2Npb24gZGUgY2FydG9uKioKCiMjIyAqTWVkaWEqCmBgYHtyfQptZWRpYV9waWV6YXNfcHJvZzwtIG1lYW4ocHJvZHVjY2lvbiRwaWV6YXNfcHJvZykKbWVkaWFfcGllemFzX3Byb2cKCm1lZGlhX3Rtb19taW48LSBtZWFuKHByb2R1Y2Npb24kdG1vX21pbikKbWVkaWFfdG1vX21pbiAKCm1lZGlhX2xhbWluYXNfcHJvY2VzYWRhcyA8LSBtZWFuKHByb2R1Y2Npb24kbGFtaW5hc19wcm9jZXNhZGFzKQptZWRpYV9sYW1pbmFzX3Byb2Nlc2FkYXMKCm1lZGlhX3RpZW1wb19jYWxpZGFkPC0gbWVhbihwcm9kdWNjaW9uJHRpZW1wb19jYWxpZGFkKQptZWRpYV90aWVtcG9fY2FsaWRhZApgYGAKCiMjIyAqTWVkaWFuYSoKYGBge3J9Cm1lZGlhbl9waWV6YXNfcHJvZzwtIG1lZGlhbihwcm9kdWNjaW9uJHBpZXphc19wcm9nKQptZWRpYW5fcGllemFzX3Byb2cKCm1lZGlhbl90bW9fbWluPC0gbWVkaWFuKHByb2R1Y2Npb24kdG1vX21pbikKbWVkaWFuX3Rtb19taW4gCgptZWRpYW5fbGFtaW5hc19wcm9jZXNhZGFzIDwtIG1lZGlhbihwcm9kdWNjaW9uJGxhbWluYXNfcHJvY2VzYWRhcykKbWVkaWFfbGFtaW5hc19wcm9jZXNhZGFzCgptZWRpYW5fdGllbXBvX2NhbGlkYWQ8LSBtZWRpYW4ocHJvZHVjY2lvbiR0aWVtcG9fY2FsaWRhZCkKbWVkaWFuX3RpZW1wb19jYWxpZGFkCmBgYAoKIyMjICpNb2RhKiAKYGBge3J9Cm1vZGUgPC0gZnVuY3Rpb24oeCkgewogIHV4IDwtIHVuaXF1ZSh4KQogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0KfQptb2RhX3BpZXphc19wcm9nIDwtIG1vZGUocHJvZHVjY2lvbiRwaWV6YXNfcHJvZykKbW9kYV9waWV6YXNfcHJvZwoKbW9kYV90bW9fbWluIDwtIG1vZGUocHJvZHVjY2lvbiR0bW9fbWluKQptb2RhX3Rtb19taW4KCm1vZGFfbGFtaW5hc19wcm9jZXNhZGFzPC0gbW9kZShwcm9kdWNjaW9uJGxhbWluYXNfcHJvY2VzYWRhcykKbW9kYV9sYW1pbmFzX3Byb2Nlc2FkYXMKCm1vZGFfdGllbXBvX2NhbGlkYWQgPC0gbW9kZShwcm9kdWNjaW9uJHRpZW1wb19jYWxpZGFkKQptb2RhX3RpZW1wb19jYWxpZGFkCmBgYAoKIyMjICpWYXJpYW56YSoKYGBge3J9CnZhcmlhbnphX3BpZXphc19wcm9nIDwtdmFyKHByb2R1Y2Npb24kcGllemFzX3Byb2cpCnZhcmlhbnphX3BpZXphc19wcm9nCgp2YXJpYW56YV90bW9fbWluIDwtdmFyKHByb2R1Y2Npb24kdG1vX21pbikKdmFyaWFuemFfdG1vX21pbgoKdmFyaWFuemFfbGFtaW5hc19wcm9jZXNhZGFzPC12YXIocHJvZHVjY2lvbiRsYW1pbmFzX3Byb2Nlc2FkYXMpCnZhcmlhbnphX2xhbWluYXNfcHJvY2VzYWRhcwoKdmFyaWFuemFfdGllbXBvX2NhbGlkYWQgPC12YXIocHJvZHVjY2lvbiR0aWVtcG9fY2FsaWRhZCkKdmFyaWFuemFfdGllbXBvX2NhbGlkYWQKYGBgCgojIyMgKkRlc3ZpYWNpw7NuIEVzdMOhbmRhcioKYGBge3J9CmRlc3ZpYWNpb25fcGllemFzX3Byb2c8LSBzcXJ0KHZhcmlhbnphX3BpZXphc19wcm9nKQpkZXN2aWFjaW9uX3BpZXphc19wcm9nCgpkZXN2aWFjaW9uX3Rtb19taW4gPC0gc3FydCh2YXJpYW56YV90bW9fbWluKQpkZXN2aWFjaW9uX3Rtb19taW4KCmRlc3ZpYWNpb25fbGFtaW5hc19wcm9jZXNhZGFzIDwtIHNxcnQodmFyaWFuemFfbGFtaW5hc19wcm9jZXNhZGFzKQpkZXN2aWFjaW9uX2xhbWluYXNfcHJvY2VzYWRhcwoKZGVzdmlhY2lvbl90aWVtcG9fY2FsaWRhZCA8LSBzcXJ0KHZhcmlhbnphX3RpZW1wb19jYWxpZGFkKQpkZXN2aWFjaW9uX3RpZW1wb19jYWxpZGFkCmBgYAoKIyMjICpUYWJsYSoKYGBge3J9ClZhcmlhYmxlMiA8LWMoInBpZXphc19wcm9nIiwidG1vX21pbiAiLCAibGFtaW5hc19wcm9jZXNhZGFzIiwgInRpZW1wb19jYWxpZGFkIikKUHJvbWVkaW8yIDwtYygiMTAyLjAxIiwgIjIxLjg4IiwiMTAyLjAxIiwgIjAuODc0OSIpCk1vZGEyIDwtYygiMCIsICIyMCIsIjAiLCAiMSIpCk1lZGlhbmEyIDwtYygiNTEiLCIyMCIsIjEwMi4wMTA1IiwgIjEiKQpWYXJpYW56YTIgPC1jKCIxODA1Ni4wMyIsIjE0My4yODk1IiwiMTgwNTYuMDMiLCAiMC45ODM0MDE3IikKRGVzdmlhY2nDs25fRXN0w6FuZGFyMiA8LWMgKCIxMzQuMzcyNyIsIjExLjk3MDM2IiwiMTM0LjM3MjciLCAiMC45OTE2NjYxIikKdGFibGEyIDwtZGF0YS5mcmFtZShWYXJpYWJsZTIsUHJvbWVkaW8yLCBNb2RhMiwgTWVkaWFuYTIsIFZhcmlhbnphMiwgRGVzdmlhY2nDs25fRXN0w6FuZGFyMikKdGFibGEyCmtuaXRyOjprYWJsZSh0YWJsYTIpCmBgYAoKCiMjIDxpbWcgc3JjPSIvVXNlcnMvZW1pbGlvb2x2ZXJhL0Rlc2t0b3AvRk9UT1NFVklERU5DSUEvU2NyZWVuIFNob3QgMjAyMi0xMC0yMSBhdCAxLjU4LjE0IFBNLnBuZyI+ICAgCgoqVGFibGEgZGUgZnJlY3VlbmNpYSBwYXJhIG1lcm1hIC0gTGEgdGFibGEgZGUgZnJlY3VlbmNpYSBzZSBoaXpvIGRlIGxvcyBLaWxvcyB5IGVzdGEgbWUgc2lydmlvIHBhcmEgdmVyIHF1ZSBudW5jYSB0aWVuZW4gZWwgbWlzbW8gbW9udG8gZGUgbWVybWEgKgoKYGBge3J9CnRhYmxlKG1lcm1hMSRNZXMsIG1lcm1hMSRLaWxvcykKcHJvcC50YWJsZSh0YWJsZShtZXJtYTEkTWVzLCBtZXJtYTEkS2lsb3MpKQpgYGAKCipUYWJsYSBkZSBmcmVjdWVuY2lhIGRlIFNjcmFwIC0gTGEgdGFibGEgZGUgZnJlY3VlbmNpYSBkZSBzY3JhcCBzZSBoaXpvIGRlIGNhbnRpZGFkIHkgZXN0YSBtZSBzaXJ2aW8gcGFyYSB2ZXIgY29tbyB2YXJpYSBsYSBjYW50aWRhZCBkZSBzY3JhcCBsYSBjdWFsIHNlIHZlIHJlZmxlamFkYSB5ZW5kbyBhIHZhcmlhcyB1YmljYWNpb25lcyBsYSBjdWFsIGVzIDEqCmBgYHtyfQpmcmVjX3NjcmFwPC1zY3JhcDEgJT4lIGdyb3VwX2J5KENhbnRpZGFkKSAlPiUgdGFsbHkoKQpmcmVjX3NjcmFwCmBgYAoKCipUYWJsYSBkZSBmcmVjdWVuY2lhIGRlIFByb2R1Y2Npb24gLSBMYSB0YWJsYSBkZSBmcmVjdWVuY2lhIGRlIHByb2R1Y2Npb24gc2UgaGl6byBkZSBwaWV6YXMsIGVzdGEgbWUgc2lydmlvIHBhcmEgdmVyIGNvbW8gZXMgcXVlIGxhcyBwaWV6YXMgZGUgcHJvZHVjY2lvbiBzZSB2YW4gdmVuZGllbmRvKgpgYGB7cn0KRlJFQ19QUk9EPC1iZDQgJT4lIGdyb3VwX2J5KFBJRVpBUy5QUk9HLikgJT4lIHRhbGx5KCkKRlJFQ19QUk9ECmBgYAoKCgoqR3JhZmljYSBkZSBkaXNwZXJzaW9uIHBhcmEgbWVybWEgLSBFbiBlc3RhIGdyYWZpY2EgcG9kZW1vcyBhcHJlY2lhciBsb3MgZGF0b3MgZGUgbG8gcXVlIHNvbiBsb3Mga2lsb3MgcXVlIHRpZW5lbiBkZSBtZXJtYSBwb3IgbWVzIGVuIGRvbmRlIHNlIHB1ZWRlIHZlciBxdWUgZW4gYWdvc3RvIGVzIGN1YW5kbyBzZSB0aWVuZSBlbCBtYXlvciBudW1lcm8gZGUgbWVybWEqCgpgYGB7cn0KZ2dwbG90KGRhdGE9bWVybWExLCBtYXBwaW5nID0gYWVzKE1lcywgS2lsb3MpKSArIGdlb21fcG9pbnQoYWVzKCkpICsgdGhlbWVfYncoKQoKYGBgCgoKCgoqR3LDoWZpY2EgZGUgRGlzcGVyc2nDs24gcGFyYSBTY3JhcCAtRW4gZXN0YSBncmFmaWNhIGRlIGRpc3BlcnNpb24gc2UgcHVlZGUgYXByZWNpYXIgdmlzdWFsbWVudGUgbGEgY2FudGlkYWQgcXVlIHNlIHByb2R1Y2UgZW4gY2FkYSB1YmljYWNpb24sIHRhbCBmdWUgZGUgYXl1ZGEgcGFyYSB2ZXIgcXVlIGVuIFNBQi9QcmUtUHJvZHVjdGlvbiBlcyBsYSBxdWUgbWFzIHRpZW5lIFNjcmFwLioKYGBge3J9CmdncGxvdChkYXRhPXNjcmFwMSwgbWFwcGluZyA9CmFlcyhDYW50aWRhZCwgVWJpY2FjacOzbi5kZS5vcmlnZW4pKSArCiAgZ2VvbV9wb2ludChhZXMoKSkgKyB0aGVtZV9idygpCmBgYAoKCgoqR3JhZmljbyBkZSBiYXJyYXMgZGUgbG9zIGtpbG9zIGRlIE1FUk1BIHF1ZSBzZSBwcm9kdWNlbiBwb3IgbWVzLSBWaXN1YWxtZW50ZSBwb2RlbW9zIHZlciBxdWUgQWdvc3RvIHRpZW5lIGVsIG1heW9yIG51bWVybyBkZSBtZXJtYSBhIGNvbXBhcmFjaW9uIGRlIGxvcyBvdHJvcyBtZXNlcyoKYGBge3J9CmdncGxvdChtZXJtYTEsIGFlcyh4PU1lcywgeT1LaWxvcykpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9InllbGxvdyIpICsgc2NhbGVfZmlsbF9ncmV5KCkgKyAKICBsYWJzKHRpdGxlID0gIkdyYWZpY2EgZGUgQmFycmFzIGRlIGxvcyBraWxvcyBkZSBtZXJtYSBxdWUgaGF5IHBvciBtZXMuIiwgCiAgICAgICB4ID0gIk1lcyIsIHkgPSAiS2lsb3MiKQpgYGAKCgoKCipHcmFmaWNvIGRlIGJhcnJhcyBkZSBTQ1JBUCBkZSBsYSBjYW50aWRhZCBkZSBsYXMgcGllemFzIHBvciBsYSB1YmljYWNpw7NuIC0gRW4gZXN0YSBncmFmaWNhIGRlIGJhcnJhcyBlcyB2aXN1YWxtZW50ZSBjbGFybyBxdWUgY29tbyBzZSBtZW5jaW9ubyBhbnRlcmlvcm1lbnRlLCBlbCBhcmVhIGRlIHByZS1wcm9kdWN0aW9uIGVzIGxhIHF1ZSBtYXMgc2NyYXAgbGxldmEuKgpgYGB7cn0KZ2dwbG90KHNjcmFwMiwgYWVzKHg9VWJpY2FjacOzbi5kZS5vcmlnZW4sIHk9Q2FudGlkYWQpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJCTFVFIikgKyBzY2FsZV9maWxsX2dyZXkoKSArIAogIGxhYnModGl0bGUgPSAiR3JhZmljbyBkZSBiYXJyYXMgZGUgbGFzIHVuaWRhZGVzIGRlIFNjcmFwIHBvciB1YmljYWNpb24gZGUgb3JpZ2VuIiwgCiAgICAgICB4ID0gIlVuaWRhZGVzIiwgeSA9ICJVYmljYWNpw7NuIikKCmBgYAoKCipQbG90IGRlIGRpc3BlcnNpb24gLSBQcm9kdWNjaW9uIGNhcnRvbi0gRXN0ZSBncsOhZmljbyBtdWVzdHJhIHF1ZSBGT1JNIG5vIGV4cGVyaW1lbnRhIHJldHJhc29zIGRlIGhvcmFzIGNvbiBzdXMgY2xpZW50ZXMgTWFnbmEgeSBWYXJyb2MsIHBlcm8gTWFobGUgZSBQcmludGVsIGhhbiB0ZW5pZG8gcmV0cmFzb3Mgc2lnbmlmaWNhdGl2b3MsIHByaW5jaXBhbG1lbnRlIGVuIGVsIHByaW1lciB0cmltZXN0cmUgZGUgMjAyMi4gKgpgYGB7cn0KZ2dwbG90KHBlcmZvcm1hbmNlLGFlcyh4PWZlY2hhKSkrCiAgZ2VvbV9saW5lKGFlcyh5PXByaW50ZWwpLGNvbG9yPSJibHVlIikrCiAgZ2VvbV9saW5lKGFlcyh5PW1haGxlKSxjb2xvcj0ib3JhbmdlIikrCiAgZ2VvbV9saW5lKGFlcyh5PW1hZ25hKSxjb2xvcj0iZ3JlZW4iKSsKICBnZW9tX2xpbmUoYWVzKHk9dmFycm9jKSxjb2xvcj0iZ3JlZW4iKSsKICBsYWJzKHg9IkZlY2hhIix5PSJSZXRyYXNvIGVuIGhvcmFzIiwgY29sb3I9IkxlZ2VuZCIpKwogIGdndGl0bGUoIlJldHJhc29zIGRlIGVudHJlZ2EgcG9yIGNsaWVudGUiKQpgYGAKCgoqRGlzcGVyc2lvbiBwbG90IC0gTG9zIG7Dum1lcm9zIGRlIHVuaWRhZGVzIHZlbmRpZGFzIGNhZGEgbWVzIHNlIG11ZXN0cmFuIGVuIHVuIGdyw6FmaWNvIHBhcmEgbG9zIGHDsW9zIDIwMjEgeSAyMDIyLiBTZSBwdWVkZSB2ZXIgcXVlIGF1bWVudGFyb24gZW4ganVuaW8gZGUgMjAyMSwgZGlzbWludXllcm9uIGVuIGxvcyBtZXNlcyBzaWd1aWVudGVzIHkgbHVlZ28gYXVtZW50YXJvbiBudWV2YW1lbnRlIGVuIGxvcyBtZXNlcyBkZSAyMDIyLiBFc3RhIGluZm9ybWFjacOzbiBzZSBwdWVkZSB1dGlsaXphciBwYXJhIGlkZW50aWZpY2FyIHBhdHJvbmVzIGVuIGxvcyBkYXRvcyB5IGRldGVybWluYXIgcXXDqSBtZXNlcyByZWNpYmVuIGxhIG1heW9yIGRlbWFuZGEqCgoKYGBge3Igd2FybmluZz1GQUxTRX0KZ2dwbG90KGJkMiwgYWVzKHggPSBiZDIkTWVzLCB5ID0gYmQyJFVuaWRhZGVzKSkgKyAKICBnZW9tX3BvaW50KHNoYXBlPTE5LCBzaXplPTMpICsgCiAgbGFicyh0aXRsZSA9ICJSZWxhY2nDs24gZW50cmUgVW5pZGFkZXMgeSBNZXNlcyIsY2FwdGlvbiA9IkZPUk0gTWVybWEiLHg9Ik1lcyIsIHk9IlVuaWRhZGVzIikgKyAKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgoKKkhpc3RvZ3JhbWEgY29sYWJvcmFkb3JlcyAtIENvbiBlc3RhcyBncsOgZmljYSBwb2RlbW9zIG9ic2VydmFyIHF1ZSBsb3MgY29sYWJvcmFkb3JlcyBhY3R1YWxlcyBlbiBwcm9tZWRpbyB0aWVuZW4gZW50cmUgMjAtNDAgYcOxb3MuKgpgYGB7cn0KaGlzdChjb2xhYm9yYWRvcmVzJGVkYWQsIGZyZXE9VFJVRSwgY29sPSJwdXJwbGUiLCBtYWluPSJFZGFkIGVuIGHDsW9zIGRlIGxvcyBDb2xhYm9yYWRvcmVzIGFjdHVhbGVzIikKYGBgCgoKCgoqR3JhZmljbyBjdWFsaXRhdGl2byAtIENvbiBlc3RhIGdyw6BmaWNhIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGVsIG1vdGl2byBtw6BzIGNvbcO5biBkZSBiYWphIGRlIGxvcyBjb2xhYm9yYWRvcmVzIGhhbiBzaWRvIHBvciBkZXNwaWRvcyBwb3IgZmFsdGFzIGNvbiB1biA1OSUgeSBwb3IgcmVudW5jaWEgdm9sdW50YXJpYSBwb3IgdW4gMzclLioKCmBgYHtyfQp0YWJsZShiYWphcyRtb3Rpdm9fYmFqYSkKCnByb3BvcmNpb25lcyA8LSBjKDEsIDE0MSwgMSwgODcsIDgpCmV0aXF1ZXRhcyA8LSBjKCJBYmFuZG9ubyIsICJCYWphIHBvciBGYWx0YXMiLCAiSnViaWxhY2nDsm4iLCAiUmVudW5jaWEgVm9sdW50YXJpYSIsICJUZXJtaW5vIGRlIENvbnRyYXRvIikKcGN0IDwtIHJvdW5kKHByb3BvcmNpb25lcy9zdW0ocHJvcG9yY2lvbmVzKSoxMDApCmV0aXF1ZXRhcyA8LSBwYXN0ZShldGlxdWV0YXMsIHBjdCkKZXRpcXVldGFzIDwtIHBhc3RlKGV0aXF1ZXRhcywiJSIsc2VwPSIiKQpwaWUocHJvcG9yY2lvbmVzLGxhYmVscyA9IGV0aXF1ZXRhcywKICAgIGNvbD1yYWluYm93KGxlbmd0aChldGlxdWV0YXMpKSwKICAgIG1haW49Ik1vdGl2byBkZSBiYWphcyBkZSBsb3MgQ29sYWJvcmFkb3JlcyIpCmBgYAoKKkJhciBwbG90IC0gQ29uIGVzdGUgZ3LDoGZpY28gcG9kZW1vcyBvYnNlcnZhciBxdWUgbG9zIHF1ZSBlc3RhbiBjYXNhZG9zIHkgc29sdGVyb3Mgc3VlbGVuIGdhbmFyIG3DoHMgZGUgbG9zIHF1ZSBlc3RhbiBkaXZvcmNpYWRvcyB5IGVuIHVuacOybiBsaWJyZS4gQWRlbcOgcywgbG9zIGhvbWJyZXMgY2FzYWRvcyB5IGxhcyBtdWplcmVzIHNvbHRlcmFzIHNvbiBsb3MgcXVlIGdhbmFuIG3DoHMuKgpgYGB7cn0KZ2dwbG90KGNvbGFib3JhZG9yZXMsIGFlcyh4PWdlbmVybywgeT1zYWxhcmlvX2RpYXJpbywgZmlsbD1nZW5lcm8pKSArIAogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKyAKICBmYWNldF9ncmlkKH5lc3RhZG9fY2l2aWwpICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikKYGBgCgojIyA8aW1nIHNyYz0gIi9Vc2Vycy9lbWlsaW9vbHZlcmEvRGVza3RvcC9TY3JlZW4gU2hvdCAyMDIyLTEwLTIxIGF0IDEuNTkuMjYgUE0ucG5nIj4KCiMjIyBQcm9uw7NzdGljbyBkZWwgRGVzZW1wZcOxbyBkZSBsYSBJbmR1c3RyaWEgQXV0b21vdHJpeiB5IGxhIGVtcHJlc2EgRk9STQoKIyMjICpEZXNjcmlwY2nDs24gZGUgdmFyaWFibGVzKgojIyMjIEHDsW8gLSBBw7FvIGVuIGVsIHF1ZSBzZSBlZmVjdMO6byBsYSBleHBvcnRhY2nDs24gbyB2ZW50YS4KIyMjIyBNZXMgLSBNZXMgY29ycmVzcG9uZGllbnRlIGFsIGHDsW8gZW4gZWwgcXVlIHNlIGVmZWN0w7pvIGxhIGV4cG9ydGFjacOzbiBvIHZlbnRhLiAKIyMjIyBWZW50YSAodmFyaWFibGUgZGVwZW5kaWVudGUpIC0gVmVudGEgZW4gTcOpeGljbyBkZSB2ZWjDrWN1bG9zIGxpZ2Vyb3MgZW4gdW5pZGFkZXMuCiMjIyMgRXhwb3J0YWNpw7NuICh2YXJpYWJsZSBkZXBlbmRpZW50ZSkgLSBFeHBvcnRhY2nDs24gZW4gTcOpeGljbyBkZSB2ZWjDrWN1bG9zIGxpZ2Vyb3MgZW4gdW5pZGFkZXMuCiMjIyMgVGlwbyBkZSBjYW1iaW8gKHZhcmlhYmxlIGluZGVwZW5kaWVudGUpIC0gUmVnaXN0cm9zIGhpc3Rvcmljb3MgZGVsIGRvbGFyIGVuIE3DqXhpY28uCiMjIyMgSW5mbGFjacOzbiAodmFyaWFibGUgaW5kZXBlbmRpZW50ZSktIEluZmxhY2nDs24gZHVyYW50ZSBsb3MgYcOxb3MgZGVmaW5pZG9zLgojIyMjIHBvcmNlbnRhamVfb2N1ICh2YXJpYWJsZSBpbmRlcGVuZGllbnRlKSAtIFBvcmNlbnRhamUgZGUgbGEgcG9ibGFjacOzbiBvY3VwYWRhLgojIyMjIHBvcmNlbnRhamVfZGVzb2N1ICh2YXJpYWJsZSBpbmRlcGVuZGllbnRlKSAtIFBvcmNlbnRhamUgZGUgbGEgcG9ibGFjacOzbiBkZXNvY3VwYWRhLgojIyMjIGNvbmZfY29uc3VtaWRvciAodmFyaWFibGUgaW5kZXBlbmRpZW50ZSkgLSBDb25maWFuemEgZGVsIGNvbnN1bWlkb3IgZW4gbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXogZW4gTcOpeGljby4KCiMjIyMgSW1wb3J0YXIgYmFzZXMgZGUgZGF0b3MgCmBgYHtyfQojZmlsZS5jaG9vc2UKYmRfcHJlZGljY2lvbiA8LSByZWFkLmNzdigiL1VzZXJzL2VtaWxpb29sdmVyYS9Eb3dubG9hZHMvZW5jb2RlZC1iZF9wcmVkaWNjaW9uLmNzdiIpCnZlaGljdWxvc19jaXJjdWxhY2lvbiA8LXJlYWQuY3N2KCIvVXNlcnMvZW1pbGlvb2x2ZXJhL0Rvd25sb2Fkcy9lbmNvZGVkLXZlaGljdWxvc19lbl9jaXJjdWxhY2lvbiAoMikuY3N2IikKZXVhIDwtIHJlYWQuY3N2KCIvVXNlcnMvZW1pbGlvb2x2ZXJhL0Rvd25sb2Fkcy9jYXJfcHJvZHVjdGlvbi5jc3YiKQpwcm9kdWNjaW9uIDwtIHJlYWQuY3N2KCIvVXNlcnMvZW1pbGlvb2x2ZXJhL0Rvd25sb2Fkcy9iZF9wcm9kdWNjaW9uX2xpbXBpYS5jc3YiKQpgYGAKCiMjIyMgSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojaW5zdGFsbC5wYWNrYWdlcygidHNlcmllcyIpCmxpYnJhcnkodHNlcmllcykKI2luc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikKbGlicmFyeShmb3JlY2FzdCkKI2luc3RhbGwucGFja2FnZXMoImFzdHNhIikKbGlicmFyeShhc3RzYSkKI2luc3RhbGwucGFja2FnZXMoImRwbHlyIikKbGlicmFyeShkcGx5cikKI2luc3RhbGwucGFja2FnZXMoImp0b29scyIpCmxpYnJhcnkoanRvb2xzKQojaW5zdGFsbC5wYWNrYWdlcygibG10ZXN0IikKbGlicmFyeShsbXRlc3QpCiNpbnN0YWxsLnBhY2thZ2VzKCJjYXIiKQpsaWJyYXJ5KGNhcikKI2luc3RhbGwucGFja2FnZXMoIm9sc3JyIikKbGlicmFyeShvbHNycikKI2luc3RhbGwucGFja2FnZXMoImNvcnJwbG90IikKbGlicmFyeShjb3JycGxvdCkKbGlicmFyeShnZ2ZvcnRpZnkpICAgICMgZGF0YSB2aXN1YWxpemF0aW9uIHRvb2xzIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcyByZXN1bHRzCmxpYnJhcnkoZ2dhbGx1dmlhbCkgICAjIHVzZWQgdG8gdmlzdWFsaXplIGZyZXF1ZW5jeSB0YWJsZXMgaW52b2x2aW5nIHNldmVyYWwgY2F0ZWdvcmljYWwgdmFyaWFibGVzCmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkodHNlcmllcykKCmBgYAoKIyMgPGltZyBzcmM9Ii9Vc2Vycy9lbWlsaW9vbHZlcmEvRGVza3RvcC9GT1RPU0VWSURFTkNJQS9TY3JlZW4gU2hvdCAyMDIyLTEwLTIxIGF0IDEuNTEuMTUgUE0ucG5nIj4gCgpgYGB7cn0Kc3RyKGV1YSkKYGBgCgpgYGB7cn0KY29ycnBsb3QoY29yKGV1YSksdHlwZT0ndXBwZXInLG9yZGVyPSdoY2x1c3QnLGFkZENvZWYuY29sPSdibGFjaycpIApgYGAKCmBgYHtyfQptb2RlbDFldWE8LWxtKHVzX2Nhcl9wcm9kdWN0aW9ufnBlb3BsZV91bmVtcGxveWVkK3JldGFpbF9wcmljZV9nYXNvbGluZStpbXBvcnRzX3ZhbHVlLGRhdGE9ZXVhKSAgICAgCnN1bW1hcnkobW9kZWwxZXVhKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KG1vZGVsMWV1YTwtYXJtYShldWEkdXNfY2FyX3Byb2R1Y3Rpb24sb3JkZXI9YygwLDEpKSkKYGBgCgpgYGB7cn0KbW9kZWwxZXVhX2ZvcmVjYXN0PC1mb3JlY2FzdChtb2RlbDFldWEkZml0dGVkLGg9MyxsZXZlbD1jKDk1KSkKYGBgCgpgYGB7cn0KbW9kZWwxZXVhX2ZvcmVjYXN0CmBgYAoKIyMgPGltZyBzcmM9Ii9Vc2Vycy9lbWlsaW9vbHZlcmEvRGVza3RvcC9GT1RPU0VWSURFTkNJQS9TY3JlZW4gU2hvdCAyMDIyLTEwLTIxIGF0IDEuNTEuMzAgUE0ucG5nIj4gIAoKIyMgQXV0b21vdGl2ZSBJbmR1c3RyeSBNZXhpY28gYW5kIEZPUk0gUGVyZm9ybWFuY2UgRm9yZWNhc3QKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodHNlcmllcykgICAjIHRpbWUgc2VyaWVzIGFuYWx5c2lzIGFuZCBjb21wdXRhdGlvbmFsIGZpbmFuY2UgCmxpYnJhcnkoZm9yZWNhc3QpICAjIHByb3ZpZGVzIG1ldGhvZHMgYW5kIHRvb2xzIGZvciBkaXNwbGF5aW5nIGFuZCBhbmFseXppbmcgdW5pdmFyaWF0ZSB0aW1lIHNlcmllcyBmb3JlY2FzdApsaWJyYXJ5KGFzdHNhKSAgICAgIyBhcHBsaWVkIHN0YXRpc3RpY2FsIHRpbWUgc2VyaWVzIGFuYWx5c2lzIApgYGAKCgojIyMgKkRlc2VtcGXDsW8gZGUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXogcGFyYSBsb3Mgc2lndWllbnRlcyAzIHBlcmlvZG9zIGRlIHRpZW1wbyoKCiMjIyMgVmVow61jdWxvcyBkZSBtb3RvciByZWdpc3RyYWRvcyBlbiBjaXJjdWxhY2nDs24gCgojIyMjIEVudGVuZGVyIGxhIGJhc2UgZGUgZGF0b3MgCmBgYHtyfQpzdW1tYXJ5KHZlaGljdWxvc19jaXJjdWxhY2lvbikKc3RyKHZlaGljdWxvc19jaXJjdWxhY2lvbikKYGBgCgojIyAqTGltcGllemEgZGUgZGF0b3MqCgojIyMgRWxpbWluYXIgdmFyaWFibGVzIChDYW1pb25lcy55LmNhbWlvbmV0YXMucGFyYS5jYXJnYSwgTW90b2NpY2xldGFzLCBYIHkgWC4xKSAKYGBge3J9CnZlaGljdWxvc19jaXJjdWxhY2lvbjEgPC0gc3Vic2V0KHZlaGljdWxvc19jaXJjdWxhY2lvbiwgc2VsZWN0ID0gLWMgKENhbWlvbmVzLnkuY2FtaW9uZXRhcy5wYXJhLmNhcmdhLCBNb3RvY2ljbGV0YXMsIFgsIFguMSkpCnZlaGljdWxvc19jaXJjdWxhY2lvbjEKYGBgCgoqRGViaWRvIGEgcXVlIGVsIG1lcmNhZG8gcHJpbmNpcGFsIGRlIEZPUk0gbm8gc29uIGxvcyBjYW1pb25lcywgY2FtaW9uZXRhcyBkZSBjYXJnYSBvIG1vdG9jaWNsZXRhcywgYXPDrSBjb21vIGEgcXVlIGxvcyBkYXRvcyBkZSBlc3RhcyB2YXJpYWJsZXMgbm8gc29uIHNpZ25pZmljYXRpdm9zIHBhcmEgZWwgcHJvbsOzc3RpY28gZGViaWRvIGEgcXVlIHN1cyB2YWxvcmVzIHNvbiBtdXkgcGVxdWXDsW9zIGVuIGNvbXBhcmFjacOzbiBjb24gbGFzIG90cmFzIHZhcmlhYmxlcywgc3Ugc2UgZWxpbWluYW4gbG9zIGRhdG9zLiBEZSBtYW5lcmEgc2ltaWxhciwgbGFzIHZhcmlhYmxlcyBYIHkgWC4xIHRhbWJpw6luIHNlIGVsaW1pbmFuIHBvcnF1ZSBjYXJlY2VuIGRlIGluZm9ybWFjacOzbiBwZXJ0aW5lbnRlLiAqCgojIyMgRWxpbWluYXIgcmVuZ2xvbmVzIGlycmVsZXZhbnRlcwpgYGB7cn0KdmVoaWN1bG9zX2NpcmN1bGFjaW9uMiA8LSB2ZWhpY3Vsb3NfY2lyY3VsYWNpb24xWy1jKDQzLDQ0LDQ1LDQ2LDQ3KSxdCnZlaGljdWxvc19jaXJjdWxhY2lvbjIKc3VtbWFyeSh2ZWhpY3Vsb3NfY2lyY3VsYWNpb24yKQpgYGAKKlNlIGVsaW1pbmFuIGVzdG9zIHJlbmdsb25lcywgZGViaWRvIGEgcXVlIG5vIHRlbsOtYW4gY29udGVuaWRvLCBlcyBkZWNpciwgZXJhbiBjb25zaWRlcmFkb3MgTkHCtHMuKgoKIyMjIEdyw6FmaWNhCmBgYHtyIHdhcm5pbmc9RkFMU0V9CnBsb3QodmVoaWN1bG9zX2NpcmN1bGFjaW9uMiRBw7FvLHZlaGljdWxvc19jaXJjdWxhY2lvbjIkVG90YWwsIHR5cGU9ImwiLGNvbD0iYmx1ZSIsIGx3ZD0xLjUsIHhsYWIgPSJBw7FvIix5bGFiID0iVW5pZGFkZXMiLCBtYWluID0gIlZlaGljdWxvcyBkZSBtb3RvciBlbiBjaXJjdWxhY2nDs24gcmVnaXN0cmFkb3MgYW51YWxtZW50ZSIpCmxpbmVzKHZlaGljdWxvc19jaXJjdWxhY2lvbjIkQcOxbyx2ZWhpY3Vsb3NfY2lyY3VsYWNpb24yJEF1dG9tw7N2aWxlcyxjb2w9InJlZCIsbHR5PTMpCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZD1jKCJUb3RhbCBkZSB2ZWhpY3Vsb3MgZW4gY2lyY3VsYWNpw7NuIiwgIkF1dG9tw7N2aWxlcyBlbiBjaXJjdWxhY2nDs24iKSwKICAgICAgIGNvbD1jKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxOjIsIGNleD0wLjgpCmBgYAoKKkNvbiBsYSBheXVkYSBkZSBlc3RlIGdyw6FmaWNvLCBlcyBmw6FjaWwgdmVyIGPDs21vIHNlIGNvbXBvcnRhbiBsYXMgdmFyaWFibGVzIHkgY29tcGFyYXIgY3XDoW50b3MgYXV0b23Ds3ZpbGVzIHNlIGhhbiBwcm9kdWNpZG8gZW4gZ2VuZXJhbCBhIGxvIGxhcmdvIGRlIGxvcyBhw7FvcywgRGFkbyBxdWUgYW1iYXMgbMOtbmVhcyBzb24gYmFzdGFudGUgc2ltaWxhcmVzIGVudHJlIHPDrSB5IGVzdMOhbiB1YmljYWRhcyBtdXkgY2VyY2EgdW5hIGRlIGxhIG90cmEsIHNlIHB1ZWRlIGluZmVyaXIgcXVlIGVsIHBvcmNlbnRhamUgZGUgYXV0b23Ds3ZpbGVzIGVuIGVsIHRvdGFsIGVzIGVsIG3DoXMgZ3JhbmRlLiBQb3Igb3RybyBsYWRvLCBlbCBncsOhZmljbyBtdWVzdHJhIHVuYSB0ZW5kZW5jaWEgZ2VuZXJhbG1lbnRlIGNyZWNpZW50ZSB5IHBvc2l0aXZhLCBlcyBkZWNpciwgY2FkYSBhw7FvIHNlIGNvbmR1Y2VuIG3DoXMgYXV0b23Ds3ZpbGVzLioKCiMjIDxpbWcgc3JjPSIvVXNlcnMvZW1pbGlvb2x2ZXJhL0Rlc2t0b3AvU2NyZWVuIFNob3QgMjAyMi0xMC0yMSBhdCAyLjAzLjA5IFBNLnBuZyI+ICAKCiMjIEZvcmVjYXN0aW5nIHVzYW5kbyBlbCBNb2RlbG8gYXV0b3JlZ3Jlc2l2bwoKYGBge3J9CmF1dG9yZWdyZXNzaXZlX21vZGVsIDwtIGFybWEodmVoaWN1bG9zX2NpcmN1bGFjaW9uMiRUb3RhbCwgb3JkZXIgPSBjKDEsMCkpCnN1bW1hcnkoYXV0b3JlZ3Jlc3NpdmVfbW9kZWwgPC0gYXJtYSh2ZWhpY3Vsb3NfY2lyY3VsYWNpb24yJFRvdGFsLCBvcmRlciA9IGMoMSwwKSkpCgphdXRvcmVncmVzc2l2ZV9tb2RlbF9mb3JlY2FzdDwtZm9yZWNhc3QoYXV0b3JlZ3Jlc3NpdmVfbW9kZWwkZml0dGVkLGg9NSxsZXZlbD1jKDk1KSkKYXV0b3JlZ3Jlc3NpdmVfbW9kZWxfZm9yZWNhc3QKYGBgCgoqQ29tbyBzZSBtZW5jaW9uw7MgYW50ZXJpb3JtZW50ZSwgc2Ugb2JzZXJ2YSB1bmEgdGVuZGVuY2lhIHBvc2l0aXZhIGVuIGVsIG1vZGVsbyBhdXRvcmVncmVzaXZvIGRlbCBuw7ptZXJvIGRlIHZlaMOtY3Vsb3MgYXV0b21vdG9yZXMgZW4gdXNvIHkgZWwgcHJvbsOzc3RpY28gcGFyYSBsb3MgcHLDs3hpbW9zIGHDsW9zLiBQb3IgZWplbXBsbywgdW4gbml2ZWwgZGUgY29uZmlhbnphIGRlbCA5NSUgcHJlZGljZSBxdWUgMzc4ODQyODEgdmVow61jdWxvcyBlc3RhcsOhbiBlbiB1c28gZWwgcHLDs3hpbW8gYcOxbywgY29uIHJhbmdvcyBlbnRyZSAzNTI0MDQwNiB5IDQwNTI4MTU1LiBTZSBwcm9ub3N0aWNhbiAzOSAyMjIgMDg3IGF1dG9tw7N2aWxlcyBwYXJhIGVsIHByw7N4aW1vIGHDsW8geSA0MCA1NTkgODkzIHZlaMOtY3Vsb3MgcGFyYSBsb3Mgc2lndWllbnRlcyB0cmVzIGHDsW9zLioKCiMjIyBHcsOhZmljYQpgYGB7cn0KcGxvdChhdXRvcmVncmVzc2l2ZV9tb2RlbF9mb3JlY2FzdCkKYGBgCgogKlNlIHB1ZWRlIGNvbXByZW5kZXIgZW4gZWwgcGxvdCBxdWUgbGEgbMOtbmVhIG5lZ3JhIHJlcHJlc2VudGEgbG9zIGRhdG9zIGVuIGxhIGJhc2UgZGUgZGF0b3MsIG1pZW50cmFzIHF1ZSBsYSBsw61uZWEgYXp1bCByZXByZXNlbnRhIGxhIHNhbGlkYSBkZSBsb3MgZGF0b3Mgb2J0ZW5pZG9zIG1lZGlhbnRlIGVsIG1vZGVsbyBhdXRvcnJlZ3Jlc2l2by4gRXN0w6EgY2xhcm8gYSBwYXJ0aXIgZGUgbGEgbMOtbmVhIGF6dWwgcXVlIGxhIHRlbmRlbmNpYSBlc3RhIGFzY2VuZGllbmRvLiBFbiBkb25kZSBsb3MgdmFsb3JlcyAiYmFqbyIgeSAiYWx0byIgY29uIHVuIDk1JSBkZSBjb25maWFuemEgc2UgbXVlc3RyYW4gc29tYnJlYWRvcyBlbiBncmlzIGVuIGxhIGzDrW5lYSBhenVsKgoKIyMgRm9yZWNhc3RpbmcgdXNhbmRvIE1vdmluZyBBdmVyYWdlIE1vZGVsCmBgYHtyIHdhcm5pbmc9RkFMU0V9Cm1hbV9jaXJjdWxhY2lvbiA8LSBhcm1hKHZlaGljdWxvc19jaXJjdWxhY2lvbjIkVG90YWwsb3JkZXIgPSBjKDEsMSkpCnN1bW1hcnkobWFtX2NpcmN1bGFjaW9uIDwtIGFybWEodmVoaWN1bG9zX2NpcmN1bGFjaW9uMiRUb3RhbCxvcmRlciA9IGMoMSwxKSkpCgptYW1fY2lyY3VsYWNpb25fZm9yZWNhc3QgPC0gZm9yZWNhc3QobWFtX2NpcmN1bGFjaW9uJGZpdHRlZCxoPTUsbGV2ZWw9Yyg5NSkpCm1hbV9jaXJjdWxhY2lvbl9mb3JlY2FzdApgYGAKCipQb2RlbW9zIGRldGVybWluYXIgcXVlIGVzdGFtb3MgYnVzY2FuZG8gdW4gbW9kZWxvIG5vIGVzdGFjaW9uYXJpbywgdW5vIHF1ZSBzaWVtcHJlIHNlIGVzdMOhIG1vdmllbmRvLiBBbCBpZ3VhbCBxdWUgZWwgbW9kZWxvIGF1dG9ycmVncmVzaXZvLCB0aWVuZSB1bmEgdGVuZGVuY2lhIHBvc2l0aXZhLCB0aWVuZSB1biA5NSUgZGUgY29uZmlhbnphLiBQb3Igb3RyYSBwYXJ0ZSwgc2UgcHJvbm9zdGljYSBxdWUgZHVyYW50ZSBlbCBwcmltZXIgcGVyw61vZG8gZGUgdGllbXBvIGhhYnLDoSAzNy42MzUuMDE5IGF1dG9tw7N2aWxlcyBlbiBjaXJjdWxhY2nDs24sIHNlZ3VpZG8gZGUgMzg5NDg4NzAgeSA0MDI2MjcyMC4qCgojIyMgR3LDoWZpY2EKYGBge3Igd2FybmluZz1GQUxTRX0KcGxvdChtYW1fY2lyY3VsYWNpb25fZm9yZWNhc3QpCmBgYAoKICpBcXXDrSBzZSBwdWVkZSBpbnRlcnByZXRhciBncsOhZmljYW1lbnRlIGxvIGV4cGxpY2FkbyBlbiBlbCBwdW50byBhbnRlcmlvciwgeSBzZSBvYnNldmEgY29tbyBsYSB0ZW5kZW5jaWEgZXMgcG9zaXRpdmEuKgoKIyMjICoqRGVzZW1wZcOxbyBkZSAxIGRlIGxhcyDDoXJlYXMgZGUgbGEgZW1wcmVzYSBGT1JNIHBhcmEgbG9zIHNpZ3VpZW50ZXMgMyBwZXJpb2RvcyBkZSB0aWVtcG8qKgoKIyMjIyBQcm9kdWNjacOzbiBGT1JNCgojIyMgRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcyAKYGBge3Igd2FybmluZz1GQUxTRX0Kc3VtbWFyeShwcm9kdWNjaW9uKQpzdHIocHJvZHVjY2lvbikKYGBgCgojIyAqTGltcGllemEgZGUgZGF0b3MqIAoKIyMjIEVsaW1pbmFyIE5BwrRzCmBgYHtyfQpwcm9kdWNjaW9uJGNsaWVudGUgPC0gYXMuZmFjdG9yKHByb2R1Y2Npb24kY2xpZW50ZSkKc3RyKHByb2R1Y2Npb24pCnN1bW1hcnkocHJvZHVjY2lvbikKCnByb2R1Y2Npb24xIDwtIHByb2R1Y2Npb24gCnByb2R1Y2Npb24xPC0gIHByb2R1Y2Npb24xWy1jKDYyNCksXSAKc3VtbWFyeSAocHJvZHVjY2lvbjEpCmBgYAoKKkRhZG8gcXVlIHNlIGNvbnNpZGVyw7Mgdml0YWwgbWFudGVuZXIgZXN0b3MgZGF0b3MgcGFyYSBpbHVzdHJhciBtZWpvciBsb3MgZGF0b3MsIHNlIGVsaW1pbmFyb24gbGFzIE5BIHF1ZSBubyBzb24gcmVsZXZhbnRlcywgbWllbnRyYXMgcXVlIG90cmFzIGRlIGxhIGJhc2UgZGUgZGF0b3MgY29uIGVsIHTDqXJtaW5vICJzaW4gcmVnaXN0cm8iIHNlIHN1c3RpdHV5ZXJvbi4qCgojIyMgRm9yZWNhc3RpbmcgdXNhbmRvIGVsIE1vZGVsbyBhdXRvcmVncmVzaXZvCmBgYHtyfQphdXRvcmVncmVzc2l2ZV9tb2RlbF9wcm9kdWNjaW9uIDwtIGFybWEocHJvZHVjY2lvbjEkcGllemFzX3Byb2csIG9yZGVyID0gYygxLDApKQpzdW1tYXJ5KGF1dG9yZWdyZXNzaXZlX21vZGVsX3Byb2R1Y2Npb24gPC0gYXJtYShwcm9kdWNjaW9uMSRwaWV6YXNfcHJvZywgb3JkZXIgPSBjKDEsMCkpKQoKYXV0b3JlZ3Jlc3NpdmVfbW9kZWxfcHJvZHVjY2lvbl9mb3JlY2FzdDwtZm9yZWNhc3QoYXV0b3JlZ3Jlc3NpdmVfbW9kZWxfcHJvZHVjY2lvbiRmaXR0ZWQsaD01LGxldmVsPWMoOTUpKQphdXRvcmVncmVzc2l2ZV9tb2RlbF9wcm9kdWNjaW9uX2ZvcmVjYXN0CmBgYAoKKkRhZG8gcXVlIGFtYm9zIGNvZWZpY2llbnRlcyBlbiBlc3RlIG1vZGVsbyBhdXRvcnJlZ3Jlc2l2byB0aWVuZW4gdHJlcyBhc3RlcmlzY29zLCBzb24gZXh0cmVtYWRhbWVudGUgaW1wb3J0YW50ZXMgcGFyYSBsYSBiYXNlIGRlIGRhdG9zLiBQb3Igb3RybyBsYWRvLCBhIGxhIGhvcmEgZGUgaGFjZXIgdW4gcHJvbsOzc3RpY28sIGVzIGJpZW4gc2FiaWRvIHF1ZSBzZSBzdXBvbmUgcXVlIHNlIG1hbnRpZW5lIGlndWFsLCBlcyBkZWNpciwgY29uIGxhcyBtaXNtYXMgcGllemFzIHByb2dyYW1hZGFzLCBwZXJvIHNlIHB1ZWRlIG9ic2VydmFyIGNvbW8gbWllbnRyYXMg4oCcQmFqb+KAnSBkaXNtaW51eWUsIOKAnEFsdG/igJ0gYXVtZW50YS4qCgojIyMgR3LDoWZpY2EKYGBge3J9CnBsb3QoYXV0b3JlZ3Jlc3NpdmVfbW9kZWxfcHJvZHVjY2lvbl9mb3JlY2FzdCkKYGBgCgoqQ29tbyBzZSBwdWVkZSB2ZXIgZW4gZWwgcGxvdCwgbm8gc2UgZXNwZXJhIHVuYSBtZWpvcmEgcGFyYSBlc3RlIG1vZGVsbywgeSBzZSBwdWVkZW4gdmVyIGxvcyBmb3JlY2FzdCwgZWwgbG93IHkgZWwgaGlnaCwgY29uIDk1JSBkZSBjb25maWFuemEuKgoKIyMjIEZvcmVjYXN0aW5nIHVzYW5kbyBNb3ZpbmcgQXZlcmFnZSBNb2RlbApgYGB7cn0KbWFtX3Byb2R1Y2Npb24gPC0gYXJtYShwcm9kdWNjaW9uMSRwaWV6YXNfcHJvZyxvcmRlciA9IGMoMSwxKSkKc3VtbWFyeShtYW1fcHJvZHVjY2lvbiA8LSBhcm1hKHByb2R1Y2Npb24xJHBpZXphc19wcm9nLG9yZGVyID0gYygxLDEpKSkKCm1hbV9wcm9kdWNjaW9uX2ZvcmVjYXN0IDwtIGZvcmVjYXN0KG1hbV9wcm9kdWNjaW9uJGZpdHRlZCxoPTUsbGV2ZWw9Yyg5NSkpCm1hbV9wcm9kdWNjaW9uX2ZvcmVjYXN0CmBgYAoKKkVsIGNvbXBvcnRhbWllbnRvIGRlIGVzdGUgbW9kZWxvIHByZWRpY2UgcXVlIG5vIGhhYnLDoSBjYW1iaW9zIGVuIGxvcyBwcsOzeGltb3MgYcOxb3MgY29uIHVuIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlLCBwZXJvIHNpIHVubyBvYnNlcnZhIG1hcmNvcyBkZSB0aWVtcG8gcGVxdWXDsW9zLCBlbCBjYW1iaW8gZGUgdW4gcGVyw61vZG8gZGUgdGllbXBvIGEgb3RybyBlcyBkcmFtw6F0aWNvIHkgZXN0w6EgZGlzbWludXllbmRvLCBtaWVudHJhcyBxdWUgZW4gbWFyY29zIGRlIHRpZW1wbyBtw6FzIGFsdG9zLCBlbCBjb21wb3J0YW1pZW50byBlcyB2YXJpYWRhIHBvcnF1ZSBhIHZlY2VzIHN1YmUgeSBvdHJhcyBiYWphIHNpbiB0ZW5kZW5jaWEgYSBjb250aW51YXIuKgoKIyMjIEdyw6FmaWNhCmBgYHtyfQpwbG90KG1hbV9wcm9kdWNjaW9uX2ZvcmVjYXN0KQpgYGAKU2UgcHVlZGUgb2JzZXJ2YXIgcXVlIG5vIGV4aXN0ZSB1bmEgdGVuZGVuY2lhIGVzcGVjw61maWNhLgoKKlRlbmRlbmNpYSBkZSByZW5kaW1pZW50byBkdXJhbnRlIGVsIHRyYW5zY3Vyc28gZGVsIGFuw6FsaXNpcyB5IGxvcyAzIHBlcsOtb2RvcyBkZSB0aWVtcG8gcG9zdGVyaW9yZXM6IEVsIG1vZGVsbyBkZSBlc3RpbWFjacOzbiBkZSBwcm9uw7NzdGljbyBzdWdpZXJlIHF1ZSBsYSB0ZW5kZW5jaWEgZXMgYnVlbmEgY29uIHJlc3BlY3RvIGEgbG9zIGRhdG9zIGV4dGVybm9zLCBhIHNhYmVyLCBsYSBpbmR1c3RyaWEgZGVsIGF1dG9tw7N2aWwsIGxvIHF1ZSBpbmRpY2EgcXVlIGhheSB1biA5NSUgbml2ZWwgZGUgY29uZmlhbnphIGVuIGxhIHByZWRpY2Npw7NuIGRlIHF1ZSBoYWJyw6EgbcOhcyBhdXRvbcOzdmlsZXMgZW4gbGFzIGNhbGxlcyBjYWRhIGHDsW8uIExvcyBkYXRvcyBhbnRlcyBtZW5jaW9uYWRvcyBzb24gdmVudGFqb3NvcyBwYXJhIEZPUk0gcG9ycXVlIHN1Z2llcmVuIHF1ZSBzaSBoYXkgbcOhcyBhdXRvbcOzdmlsZXMgZW4gbGEgY2FycmV0ZXJhLCBoYWJyw6EgbcOhcyBwcm9kdWNjacOzbiwgbG8gcXVlIGdlbmVyYXLDoSBtw6FzIHBlZGlkb3MgeSBjbGllbnRlczsgc2luIGVtYmFyZ28sIGVuIGxhIGJhc2UgZGUgZGF0b3Mgb2J0ZW5pZGEgZGlyZWN0YW1lbnRlIGRlIEZPUk0sIHNlIG9ic2VydmEgcXVlIGVuIGFsZ3Vub3MgY2Fzb3MsIG5vIGhheSB0ZW5kZW5jaWEsIHkgc2UgZXNwZXJhbiBsYXMgbWlzbWFzIHBhcnRlcyBwcm9ncmFtYWRhcyBjb21vIHByb27Ds3N0aWNvOyBwb3IgbG8gdGFudG8sIHNlIGRlYmUgaW1wbGVtZW50YXIgdW5hIGVzdHJhdGVnaWEgcGFyYSBxdWUgbcOhcyBwZXJzb25hcyBjb25vemNhbiB5IHBhcnRpY2lwZW4gZW4gbGFzIGFjdGl2aWRhZGVzIGRlIGxhIGVtcHJlc2EuKgoKIyMgPGltZyBzcmM9Ii9Vc2Vycy9lbWlsaW9vbHZlcmEvRGVza3RvcC9TY3JlZW4gU2hvdCAyMDIyLTEwLTIxIGF0IDIuMDQuNTcgUE0ucG5nIj4KCiMjIFByZWRpY2Npw7NuIGRlbCBEZXNlbXBlw7FvIGRlIGxhIEluZHVzdHJpYSBBdXRvbW90cml6CgojIyMgRXhwb3J0YWNpw7NuIHkgdmVudGFzIGRlIHZlaMOtY3Vsb3MgbGlnZXJvcyAKCiMjIyBFbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zCmBgYHtyfQpzdW1tYXJ5KGJkX3ByZWRpY2Npb24pCnN0cihiZF9wcmVkaWNjaW9uKQpgYGAKCiMjICpMaW1waWV6YSBkZSBkYXRvcyogCgojIyMgRWxpbWluYXIgY29sdW1uYXMgaXJyZWxldmFudGVzIChQcm9kdWNjacOzbikKYGBge3J9CmJkX3ByZWRpY2Npb24xIDwtIHN1YnNldChiZF9wcmVkaWNjaW9uLCBzZWxlY3QgPSAtYyAoUHJvZHVjY2nDs24pKQpiZF9wcmVkaWNjaW9uMQpgYGAKCipFc3RhIGNvbHVtbmEgc2UgZWxpbWluYXLDoSB5YSBxdWUgbGFzIHZhcmlhYmxlcyBkZXBlbmRpZW50ZXMgc2Vyw6FuIMO6bmljYW1lbnRlIFZlbnRhcyB5IEV4cG9ydGFjaW9uZXMsIG1pZW50cmFzIHF1ZSBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIHNlcsOhbiBsYSBjb25maWFuemEgZGVsIGNvbnN1bWlkb3IsIGVsIHRpcG8gZGUgY2FtYmlvLCBsYSBpbmZsYWNpw7NuLCBsYSBwcm9wb3JjacOzbiBkZSBvY3VwYWRvcyB5IGVsIHBvcmNlbnRhamUgZGUgZGVzb2N1cGFkb3MgcXVlIG5vIGVzdMOhbiB0cmFiYWphbmRvLioKCiMjIyBFbGltaW5hciByZW5nbG9uZXMgaXJyZWxldmFudGVzCmBgYHtyfQpiZF9wcmVkaWNjaW9uMiA8LSBiZF9wcmVkaWNjaW9uMVstYygyMDEsIDIwMiksXQpiZF9wcmVkaWNjaW9uMgpgYGAKCipEZW50cm8gZGUgbGEgYmFzZSBkZSBkYXRvcyBoYWLDrWEgZG9zIHJlbmdsb25lcyBzaW4gY29udGVuaWRvLCBwb3IgbG8gdGFudG8sIHNlIGRlY2lkacOzIGVsaW1pbmFybG8uKgoKIyMgKipEb3MgbW9kZWxvcyBkaWZlcmVudGVzIGRlIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSBwYXJhIHByZWRlY2lyIGVsIGRlc2VtcGXDsW8gZGUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXoqKiAKCiMjIyBDb3JyZWxhY2nDs24KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmNvcnJwbG90KGNvcihiZF9wcmVkaWNjaW9uMiksIHR5cGU9InVwcGVyIixvcmRlcj0iaGNsdXN0IixhZGRjb2VmLmNvbD0iYmxhY2siKQpzdW1tYXJ5KGJkX3ByZWRpY2Npb24yKQpgYGAKCipFbCBwcmltZXIgcGFzbyBmdWUgY3JlYXIgdW5hIGdyw6FmaWNhIGRlIHNpbWlsaXR1ZGVzIHBhcmEgZGV0ZXJtaW5hciBzaSBsYXMgdmFyaWFibGVzIHBvZMOtYW4gZXN0YXIgcmVsYWNpb25hZGFzIGVudHJlIHPDrS4gQ29tbyBzZSBwdWVkZSBvYnNlcnZhciwgdG9kYXMgbGFzIHZhcmlhYmxlcyBlc3TDoW4gMTAwJSByZWxhY2lvbmFkYXMuIFRhbWJpw6luIGVzIHBvc2libGUgYW5hbGl6YXIgcXXDqSBhw7FvIHkgdGlwbyBkZSBjYW1iaW8gdGFtYmnDqW4gc29uIGltcG9ydGFudGVzLCBhc8OtIGNvbW8gZWwgbWVzIHkgbGEgaW5mbGFjacOzbiwgbGFzIHZlbnRhcyB5IGVsIHBvcmNlbnRhamUgZGUgb2N1cGFkb3MsIGxhcyBleHBvcnRhY2lvbmVzIHkgZWwgYcOxbywgc2VndWlkbyBkZWwgdGlwbyBkZSBjYW1iaW8geSBsYXMgZXhwb3J0YWNpb25lcywgZW50cmUgb3Ryb3MuKgoKIyMgKipNb2RlbG8gZGUgcmVncmVzacOzbiAxKioKYGBge3J9Cm1vZGVsb19yZWdyZXNpb24xIDwtIGxtKEV4cG9ydGFjacOzbn5Bw7FvK01lcytUaXBvLmRlLmNhbWJpbytJbmZsYWNpw7NuK3BvcmNlbnRhamVfb2N1K3BvcmNlbnRhamVfZGVzb2N1K2NvbmZfY29uc3VtaWRvcixkYXRhPWJkX3ByZWRpY2Npb24yKSAKc3VtbWFyeShtb2RlbG9fcmVncmVzaW9uMSkKYGBgCgoqU2UgZW5jb250csOzIHF1ZSBlbCB0aXBvIGRlIGNhbWJpbyB0aWVuZSBlbCBtYXlvciBpbXBhY3RvIGVuIGxhcyBleHBvcnRhY2lvbmVzIGVuIGVzdGUgbW9kZWxvIGN1YW5kbyBzZSBlamVjdXTDsyBwb3IgcHJpbWVyYSB2ZXogc2luIGxhcyB2YXJpYWJsZXMgYcOxbyB5IG1lcy4gRXN0ZSBoYWxsYXpnbyB0aWVuZSBzZW50aWRvIGRhZG8gcXVlIE3DqXhpY28gZXMgdW4gZ3JhbiBleHBvcnRhZG9yIHkgcXVlIGVsIHRpcG8gZGUgY2FtYmlvIGFmZWN0YSBkZSBsYSBtaXNtYSBtYW5lcmEgYSBNw6l4aWNvIHkgYWwgcmVzdG8gZGVsIG11bmRvIGFsIGRldmFsdWFyIGVsIHBlc28uUG9yIG90cm8gbGFkbywgbGEgbWF5b3LDrWEgZGUgbGFzIHZhcmlhYmxlcywgYSBleGNlcGNpw7NuIGRlIGxhIHByb3BvcmNpw7NuIGRlIGRlc2VtcGxlYWRvcyBxdWUgdGllbmUgbG9zIDMgYXN0ZXJpc2Nvcywgc2UgY29uc2lkZXJhbiB2YXJpYWJsZXMgZGUgaW1wYWN0byBhbCBzdW1hciBsYXMgdmFyaWFibGVzIGHDsW8geSBtZXMuKgoKIyMjIEdyw6FmaWNhCmBgYHtyfQplZmZlY3RfcGxvdChtb2RlbG9fcmVncmVzaW9uMSxwcmVkPVRpcG8uZGUuY2FtYmlvLGludGVydmFsPVRSVUUpCmBgYAoKICpDb21vIHNlIG9ic2VydmEgZW4gZWwgZ3LDoWZpY28sIGVsIHBhdHLDs24gcXVlIHNpZ3VlIGVzIG5lZ2F0aXZvLCB5YSBxdWUgZW50cmUgbcOhcyBjdWVzdGEgdW4gZMOzbGFyIGVuIHBlc29zIG1leGljYW5vcyBvIG1lbm9yIGVzIGVsIHRpcG8gZGUgY2FtYmlvIGVzIG1lbm9yIGxhcyBleHBvcnRhY2lvbmVzLioKCiMjICoqTW9kZWxvIGRlIHJlZ3Jlc2nDs24gMioqCmBgYHtyfQptb2RlbG9fcmVncmVzaW9uMiA8LSBsbShWZW50YX5Bw7FvK01lcytUaXBvLmRlLmNhbWJpbytJbmZsYWNpw7NuK3BvcmNlbnRhamVfb2N1K3BvcmNlbnRhamVfZGVzb2N1K2NvbmZfY29uc3VtaWRvcixkYXRhPWJkX3ByZWRpY2Npb24yKQpzdW1tYXJ5KG1vZGVsb19yZWdyZXNpb24yKQpgYGAKCipFbiBsdWdhciBkZSBsYXMgZXhwb3J0YWNpb25lcywgZW4gZXN0ZSBtb2RlbG8gZGUgcmVncmVzacOzbiBzZSB0b21hcm9uIGVuIGN1ZW50YSBsYXMgdmVudGFzIGRlIHZlaMOtY3Vsb3MuIFNlIGdyYWZpY8OzIGRvcyB2ZWNlcywgbGEgcHJpbWVyYSB2ZXogc2luIGHDsW8geSBtZXMsIGxvIHF1ZSBub3MgZGlvIGVsIHBvcmNlbnRhamUgZGUgcG9ibGFjacOzbiBvY3VwYWRhIGNvbW8gdmFyaWFibGUgc2lnbmlmaWNhdGl2YSwgeSBsYSBzZWd1bmRhIHZleiBjb24gYcOxbyB5IG1lcyBzdW1hZG9zLiBMYSBtYXlvcsOtYSBkZSBsYXMgdmFyaWFibGVzIHRlbsOtYW4gc2VudGlkbyBjb24gbG9zIHRyZXMgYXN0ZXJpc2NvcywgYSBleGNlcGNpw7NuIGRlbCBwb3JjZW50YWplIGRlIHBvYmxhY2nDs24gZGVzb2N1cGFkYSB5IGVsIHRpcG8gZGUgY2FtYmlvLioKCiMjIyBHcsOhZmljYQpgYGB7cn0KZWZmZWN0X3Bsb3QobW9kZWxvX3JlZ3Jlc2lvbjIscHJlZD1wb3JjZW50YWplX29jdSxpbnRlcnZhbD1UUlVFKQpgYGAKCipMYSB0ZW5kZW5jaWEgZGVsIGdyw6FmaWNvIGVzIHBvc2l0aXZhLiBTZSBncmFmaWNhcm9uIGxhcyB2ZW50YXMgeSBsYSB2YXJpYWJsZSBpbXBvcnRhbnRlLCBlbCBwb3JjZW50YWplIGRlIGVtcGxlbyBkZSBsYSBwb2JsYWNpw7NuLiBFbCBncsOhZmljbyBwdWVkZSBpbnRlcnByZXRhcnNlIGVuIGdlbmVyYWwgcGFyYSBzdWdlcmlyIHF1ZSBoYWJyw6EgbcOhcyB2ZW50YXMgY3VhbnRvIG1heW9yIHNlYSBlbCBwb3JjZW50YWplIGRlIGxhIHBvYmxhY2nDs24gcXVlIHRpZW5lIGVtcGxlby4gKgoKCiMjICpJbnRlcnByZXRhY2nDs24gZGUgbG9zIG1vZGVsb3MgZGUgcmVncmVzacOzbjoqCgojIyMjIERlc3B1w6lzIGRlIGV4YW1pbmFyIGFtYm9zIG1vZGVsb3MgZGUgcmVncmVzacOzbiwgc2UgcHVlZGUgZGVtb3N0cmFyIHF1ZSBlbCBpbnRlcmNhbWJpbyBlcyBsYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlIHF1ZSBtw6FzIGluZmx1eWUgZW4gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgZGUgbGFzIGV4cG9ydGFjaW9uZXMuIFNlIHZlIHF1ZSBsYSBUYXNhIGRlIGNhbWJpbyB0aWVuZSB1biBlZmVjdG8gbmVnYXRpdm8gcXVlIGFsdGVyYSBsYSB0ZW5kZW5jaWEsIGxvIHF1ZSBkZWphIGVuIGNsYXJvIHF1ZSBjdWFuZG8gZWwgdmFsb3IgZGVsIHBlc28gbWV4aWNhbm8gYXVtZW50YSBlbiByZWxhY2nDs24gY29uIGVsIGTDs2xhciBlc3RhZG91bmlkZW5zZSwgbGFzIGV4cG9ydGFjaW9uZXMgZGlzbWludXllbi4gU2luIGVtYmFyZ28sIGVsIHBvcmNlbnRhamUgZGUgbGEgcG9ibGFjacOzbiBxdWUgZXN0w6Egb2N1cGFkYSwgbyBxdWUgdGllbmUgdW5hIHZpZGEgbGFib3JhbCwgZXMgbGEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSBxdWUgbcOhcyBpbmNpZGUgZW4gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgZGUgbGFzIHZlbnRhcy4gRXN0byB0aWVuZSBzZW50aWRvIHlhIHF1ZSBzaSBoYXkgZGluZXJvLCBoYXkgbWF5b3IgcHJvYmFiaWxpZGFkIGRlIHF1ZSBoYXlhIG3DoXMgdmVudGFzLgoKCgojIyA8aW1nIHNyYz0iL1VzZXJzL2VtaWxpb29sdmVyYS9EZXNrdG9wL1NjcmVlbiBTaG90IDIwMjItMTAtMjEgYXQgMi4wNi4yNSBQTS5wbmciPiAKCiMjIyMgKlBhc28gMS4gSW5zdGFsYXIgbGlicmVyw61hczoqCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KGZvcmVpZ24pCmxpYnJhcnkoZHBseXIpICAgICAgICAKbGlicmFyeShnZ3Bsb3QyKSAgICAgIApsaWJyYXJ5KHBzeWNoKSAgICAgICAgIApsaWJyYXJ5KGNvcnJwbG90KSAgICAgCmxpYnJhcnkoanRvb2xzKSAgICAgICAKbGlicmFyeShsbXRlc3QpICAgICAgIApsaWJyYXJ5KGNhcikgICAgICAgICAgCmxpYnJhcnkoZmFjdG9leHRyYSkgCmxpYnJhcnkoZm9yZWNhc3QpCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ2ZvcnRpZnkiKQpsaWJyYXJ5KGdnZm9ydGlmeSkgICAgCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ2FsbHV2aWFsIikKbGlicmFyeShnZ2FsbHV2aWFsKQpsaWJyYXJ5KGphbml0b3IpCmBgYAoKIyMjIyAqKnRQYXNvIDIuIEltcG9ydGFyIHkgbGltcGlhciBsYSBiYXNlIGRlIGRhdG9zOioqCmBgYHtyfQpiYWphcyA8LSByZWFkLmNzdigiL1VzZXJzL2VtaWxpb29sdmVyYS9Eb3dubG9hZHMvRk9STSAtIFJlY3Vyc29zIEh1bWFub3MgLSBCQUpBUyBldmlkZW5jaWEpLmNzdiIpCmJhamFzIDwtIGNsZWFuX25hbWVzKGJhamFzKQpzdW1tYXJ5KGJhamFzKQoKI1TDqWNuaWNhIDE6CiNCb3JyYXIgY29sdW1uYXMuCmJhamFzIDwtIHN1YnNldChiYWphcywgc2VsZWN0ID0gLWMoYXBlbGxpZG9zLCBub21icmUsIGZlY2hhX2RlX25hY2ltaWVudG8scmZjLCBmZWNoYV9kZV9hbHRhLCBiYWphLCBkZXBhcnRhbWVudG8sIG5vX3NlZ3Vyb19zb2NpYWwsIGZhY3Rvcl9jcmVkX2luZm9uYXZpdCwgbl9jcmVkaXRvX2luZm9uYXZpdCwgbHVnYXJfZGVfbmFjaW1pZW50bywgY3VycCwgY2FsbGUsIG51bWVyb19pbnRlcm5vLCBjb2xvbmlhLCBjb2RpZ29fcG9zdGFsLCBtdW5pY2lwaW8sIGVzdGFkbywgdGFyamV0YV9jdWVudGEpKQoKI1TDqWNuaWNhIDI6IAojUmVlbXBsZXphciBOQXMgY29uIGVsIHByb21lZGlvIGVuIGxhIGNvbHVtbmEgZGUgIkVkYWQiLCAiU2FsYXJpbyBEaWFyaW8iIHkgIk7Dum1lcm8gZGUgZMOtYXMiLgpiYWphcyRlZGFkW2lzLm5hKGJhamFzJGVkYWQpXTwtbWVhbihiYWphcyRlZGFkLCBuYS5ybSA9IFRSVUUpCmJhamFzJHNhbGFyaW9fZGlhcmlvX2ltc3NbaXMubmEoYmFqYXMkc2FsYXJpb19kaWFyaW9faW1zcyldPC1tZWFuKGJhamFzJHNhbGFyaW9fZGlhcmlvX2ltc3MsIG5hLnJtID0gVFJVRSkKYmFqYXMkbm9fZGlhc1tpcy5uYShiYWphcyRub19kaWFzKV08LW1lYW4oYmFqYXMkbm9fZGlhcywgbmEucm0gPSBUUlVFKQpzdW1tYXJ5IChiYWphcykKCiNUw6ljbmljYSAzOgojQ29udmVydGlyIGxhcyB2YXJpYWJsZXMgY29tbyBmYWN0b3IgbyBuw7ptZXJvCmJhamFzJGVkYWQ8LWFzLm51bWVyaWMoYmFqYXMkZWRhZCkKYmFqYXMkZ2VuZXJvPC1hcy5mYWN0b3IoYmFqYXMkZ2VuZXJvKQpiYWphcyRtb3Rpdm9fZGVfYmFqYTwtYXMuZmFjdG9yKGJhamFzJG1vdGl2b19kZV9iYWphKQpiYWphcyRub19kaWFzPC1hcy5udW1lcmljKGJhamFzJG5vX2RpYXMpCmJhamFzJHB1ZXN0bzwtYXMuZmFjdG9yKGJhamFzJHB1ZXN0bykKYmFqYXMkc2FsYXJpb19kaWFyaW9faW1zczwtYXMubnVtZXJpYyhiYWphcyRzYWxhcmlvX2RpYXJpb19pbXNzKQpiYWphcyRlc3RhZG9fY2l2aWw8LWFzLmZhY3RvcihiYWphcyRlc3RhZG9fY2l2aWwpCnN1bW1hcnkgKGJhamFzKQoKYGBgCgojIyMjICoqUGFzbyAzLiBDcmVhY2nDs24gZGUgQ2zDunN0ZXJzOioqCiMjIyMjICpDbHVzdGVyIDE6IFJlbGFjacOzbiBkZSB2YXJpYWJsZXMgZGUgRWRhZCB5IE7Dum1lcm8gZGUgZMOtYXMuKgpgYGB7cn0KZWRhZCA8LWJhamFzIAplZGFkPC0gc3Vic2V0KGJhamFzLHNlbGVjdCA9IC1jKGdlbmVybywgbW90aXZvX2RlX2JhamEsIHB1ZXN0bywgc2FsYXJpb19kaWFyaW9faW1zcywgZXN0YWRvX2NpdmlsKSkKCiNOb3JtYWxpemFyIHZhcmlhYmxlcwplZGFkX25vcm08LXNjYWxlKGVkYWRbMToyXSkgCgojRnVuY2nDs24gZnZpeiBwYXJhIGxhIHZpc3VhbGl6YWNpw7NuIGRlIHVuIEVsYm93IFBsb3QgeSBhc8OtIGRldGVybWluYXIgZWwgbsO6bWVybyBkZSBjbHVzdGVycy4KZnZpel9uYmNsdXN0KGVkYWRfbm9ybSwga21lYW5zLCBtZXRob2Q9IndzcyIpKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NCwgbGluZXR5cGU9MikrICAgICAgICAgICAgCiAgbGFicyhzdWJ0aXRsZSA9ICJFbGJvdyBtZXRob2QiKQoKYGBgCgoqQ29uIGVzdGEgZ3LDoWZpY2EgcG9kZW1vcyB2aXN1YWxpemFyIHF1ZSBlbCBuw7ptZXJvIMOzcHRpbW8gZGUgY2zDunN0ZXJzIHNvbiA0LioKCmBgYHtyfQojVmlzdWFsaXphciBjbHVzdGVycwplZGFkX2NsdXN0ZXI8LWttZWFucyhlZGFkX25vcm0sNCkKZWRhZF9jbHVzdGVyCgojVmlzdWFsaXphciByZXN1bHRhZG9zOgpmdml6X2NsdXN0ZXIoZWRhZF9jbHVzdGVyLGRhdGE9ZWRhZF9ub3JtKQpgYGAKCipMb3MgbcOhcyBqw7N2ZW5lcyBzb24gbG9zIHF1ZSBtZW5vcyBkw61hcyBkZSB0cmFiYWpvIGxhYm9yYW4uIERvbmRlIGxvcyBxdWUgbcOhcyBkw61hcyBsYWJvcmFsZXMgdGllbmVuIHNvbiBsb3MgYWR1bHRvcyAoMjcgYcOxb3MgIDYxKSAqCgojIyMjIyAqQ2x1c3RlciAyOiBSZWxhY2nDs24gZGUgdmFyaWFibGVzIGRlIEVkYWQgeSBTYWxhcmlvIERpYXJpby4qCmBgYHtyfQplZGFkX3NhbGFyaW8gPC1iYWphcyAKZWRhZF9zYWxhcmlvPC0gc3Vic2V0KGJhamFzLHNlbGVjdCA9IC1jKGdlbmVybyxlc3RhZG9fY2l2aWwsbW90aXZvX2RlX2JhamEsIHB1ZXN0bywgbm9fZGlhcykpCgojTm9ybWFsaXphciB2YXJpYWJsZXMKZWRhZF9zYWxhcmlvX25vcm08LXNjYWxlKGVkYWRfc2FsYXJpb1sxOjJdKSAKCiNGdW5jacOzbiBmdml6IHBhcmEgbGEgdmlzdWFsaXphY2nDs24gZGUgdW4gRWxib3cgUGxvdCB5IGFzw60gZGV0ZXJtaW5hciBlbCBuw7ptZXJvIGRlIGNsdXN0ZXJzLgpmdml6X25iY2x1c3QoZWRhZF9zYWxhcmlvX25vcm0sIGttZWFucywgbWV0aG9kPSJ3c3MiKSsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTQsIGxpbmV0eXBlPTIpKyAgICAgICAgICAgIAogIGxhYnMoc3VidGl0bGUgPSAiRWxib3cgbWV0aG9kIikgCmBgYAoKKkNvbiBlc3RhIGdyw6FmaWNhIHBvZGVtb3MgdmlzdWFsaXphciBxdWUgZWwgbsO6bWVybyDDs3B0aW1vIGRlIGNsw7pzdGVycyBzb24gNC4qCgpgYGB7cn0KI1Zpc3VhbGl6YXIgY2x1c3RlcnM6CmVkYWRfc2FsYXJpb19jbHVzdGVyPC1rbWVhbnMoZWRhZF9zYWxhcmlvX25vcm0sNCkKZWRhZF9zYWxhcmlvX2NsdXN0ZXIKCiNWaXN1YWxpemFyIHJlc3VsdGFkb3M6CmZ2aXpfY2x1c3RlcihlZGFkX3NhbGFyaW9fY2x1c3RlcixkYXRhPWVkYWRfc2FsYXJpb19ub3JtKQpgYGAKCipMb3MgdHJhYmFqYWRvcmVzIHF1ZSByZW51bmNpYW4gdGllbmVuIHNhbGFyaW9zIGJhc3RhbnRlIGlkw6ludGljb3MgaW5kZXBlbmRpZW50ZW1lbnRlIGRlIHN1IGVkYWQsIHBvciBsbyBxdWUgY2xhcmFtZW50ZSBsYSBlZGFkIHRpZW5lIHBvY2EgcmVsYWNpw7NuIGNvbiBlbCBzYWxhcmlvLioKCiMjIyMjICpDbHVzdGVyIDM6IFJlbGFjacOzbiBkZSB2YXJpYWJsZXMgZGUgU2FsYXJpbyBEaWFyaW8geSBOw7ptZXJvIGRlIGTDrWFzLioKYGBge3J9CmRpYXNfc2FsYXJpbyA8LWJhamFzIApkaWFzX3NhbGFyaW88LSBzdWJzZXQoYmFqYXMsc2VsZWN0ID0gLWMoZ2VuZXJvLGVzdGFkb19jaXZpbCxtb3Rpdm9fZGVfYmFqYSwgcHVlc3RvLCBlZGFkKSkKCiNOb3JtYWxpemFyIHZhcmlhYmxlczoKZGlhc19zYWxhcmlvX25vcm08LXNjYWxlKGRpYXNfc2FsYXJpb1sxOjJdKSAKCiNGdW5jacOzbiBmdml6IHBhcmEgbGEgdmlzdWFsaXphY2nDs24gZGUgdW4gRWxib3cgUGxvdCB5IGFzw60gZGV0ZXJtaW5hciBlbCBuw7ptZXJvIGRlIGNsdXN0ZXJzLgpmdml6X25iY2x1c3QoZGlhc19zYWxhcmlvX25vcm0sIGttZWFucywgbWV0aG9kPSJ3c3MiKSsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTQsIGxpbmV0eXBlPTIpKyAgICAgICAgICAgIAogIGxhYnMoc3VidGl0bGUgPSAiRWxib3cgbWV0aG9kIikgCgpgYGAKCipDb24gZXN0YSBncsOhZmljYSBwb2RlbW9zIHZpc3VhbGl6YXIgcXVlIGVsIG7Dum1lcm8gw7NwdGltbyBkZSBjbMO6c3RlcnMgc29uIDQuKgoKYGBge3J9CiNWaXN1YWxpemFyIGNsdXN0ZXJzOgpkaWFzX3NhbGFyaW9fY2x1c3Rlcjwta21lYW5zKGRpYXNfc2FsYXJpb19ub3JtLDQpCmRpYXNfc2FsYXJpb19jbHVzdGVyCgojVmlzdWFsaXphciByZXN1bHRhZG9zOgpmdml6X2NsdXN0ZXIoZGlhc19zYWxhcmlvX2NsdXN0ZXIsZGF0YT1kaWFzX3NhbGFyaW9fbm9ybSkKCnByb21lZGlvX2RpYXMgPC0gbWVhbihiYWphcyRub19kaWFzKQpwcm9tZWRpb19kaWFzCmBgYAoKKkVzdGUgY2x1c3RlciBtdWVzdHJhIHF1ZSBubyBoYXkgcG9zaWJpbGlkYWQgZGUgZGVzYXJyb2xsbyBkZWwgZW1wbGVvIChkZXNkZSB1biBwdW50byBkZSB2aXN0YSBlY29uw7NtaWNvKSBpbmRlcGVuZGllbnRlbWVudGUgZGUgY3XDoW50byB0aWVtcG8gbyBjdcOhbnRvcyBkw61hcyBoYXlhIHRyYWJhamFkbyBlbiBGT1JNIHlhIHF1ZSwgY29tbyBsbyBtdWVzdHJhIGVsIGFuw6FsaXNpcyBkZSBjb25nbG9tZXJhZG9zLCBlbCBuw7ptZXJvIGRlIGTDrWFzIHRyYWJhamFkb3MgdGllbmUgcG9jbyBlZmVjdG8gZW4gZWwgZMOtYSBhIGTDrWEuIHNhbGFyaW8uKgoKIyMjIyAqKlBhc28gNC4gQ3JlYWNpw7NuIGRlIFNlZ21lbnRvcyBhcGFydGlyIGRlIGxvcyBDbMO6c3RlcnM6KioKYGBge3J9CiNEZWNpZGltb3MgdXNhciBlbCBDbHVzdGVyIDIgcGFyYSBnZW5lcmFyIGxhIGNsYXNpZmljYWNpw7NuIGRlIHZhcmlhYmxlcyB5IHBvZGVyIGNvbXBhcmFyIGNvbiBkYXRvcyBjdWFsaXRhdGl2b3MuCgojQcOxYWRpciBhIGxhIGJhc2UgZGUgZGF0b3MgbGEgY29sdW1uYSBkZSBDbHVzdGVycyB5IHN1IGNsYXNpZmljYWNpw7NuOgpiYWphczE8LWJhamFzCmJhamFzMSRDbHVzdGVyczwtZWRhZF9zYWxhcmlvX2NsdXN0ZXIkY2x1c3RlcgoKbGlicmFyeShkcGx5cikKbGlicmFyeShmYWN0b2V4dHJhKSAKCiNJZGVudGlmaWNhbW9zIGxhIGNsYXNpZmljYWNpw7NuIGRlIGxhcyBkaXN0aW50YXMgZWRhZGVzIGRlIGxvcyBjb2xhYm9yYWRvcmVzLgpiYWphczI8LWJhamFzMSAlPiUgZ3JvdXBfYnkoQ2x1c3RlcnMpICU+JSBkcGx5cjo6c3VtbWFyaXNlKGVkYWQ9bWF4KGVkYWQpKSAlPiUgYXJyYW5nZShkZXNjKGVkYWQpKQpiYWphczEkQ2x1c3Rlcl9OYW1lczwtZmFjdG9yKGJhamFzMSRDbHVzdGVycyxsZXZlbHMgPSBjKDEsMiwzLDQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk91dGxpZXIiLCAiSm92ZW4iLCAiQXZhbnphZGEiLCAiQWR1bHRhIikpCmJhamFzMyA8LSBiYWphczEgJT4lIGdyb3VwX2J5KENsdXN0ZXJfTmFtZXMpICU+JSBkcGx5cjo6c3VtbWFyaXplKGVkYWRfYcOxb3M9bWF4KGVkYWQpLCBzYWxhcmlvX2ltc3M9bWVhbihzYWxhcmlvX2RpYXJpb19pbXNzKSxDb3VudD1uKCkpCmNsdXN0ZXJzPC1hcy5kYXRhLmZyYW1lKGJhamFzMykKY2x1c3RlcnMKCmBgYAoKIyMjIyAqKlBhc28gNS4gR2VuZXJhY2nDs24gZGUgZ3LDoWZpY29zOioqCgojIyMjIyAqKkdyw6FmaWNvcyBjdWFudGl0YXRpdm9zOioqCmBgYHtyfQojU2UgcmVhbGl6w7MgdW5hIGdyw6FmaWNhIHBhcmEgYW5hbGl6YXIgZWwgbsO6bWVybyBkZSByZWdpc3Ryb3MgcG9yIGNhZGEgc2VnbWVudG86IApnZ3Bsb3QoYmFqYXMzLGFlcyh4PXJlb3JkZXIoQ2x1c3Rlcl9OYW1lcyxDb3VudCkseT1Db3VudCxmaWxsPUNsdXN0ZXJfTmFtZXMpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQoKYGBgCgoqU2Vnw7puIGVsIGdyw6FmaWNvIGFudGVyaW9yLCBsb3MgasOzdmVuZXMsIHNlZ3VpZG9zIGRlIGxvcyBhZHVsdG9zIHkgZmluYWxtZW50ZSBsb3MgdHJhYmFqYWRvcmVzIGRlIG1heW9yIGVkYWQsIGhhbiBzaWRvIGxvcyBxdWUgbcOhcyBiYWphcyBoYW4gcHJlc2VudGFkby4qCgpgYGB7cn0KI1Zpc3VhbGl6YXIgbGEgZWRhZCBwb3IgY2FkYSBzZWdtZW50bzoKZ2dwbG90KGJhamFzMywgYWVzKHg9Q2x1c3Rlcl9OYW1lcyx5PWVkYWRfYcOxb3MsZmlsbD0gQ2x1c3Rlcl9OYW1lcyxsYWJlbD1yb3VuZChlZGFkX2HDsW9zLGRpZ2l0cz0yKSkpICsgCiAgZ2VvbV9jb2woKSArIAogIGdlb21fdGV4dCgpCmBgYAoKKlZpc3VhbGl6YWNpw7NuIGRlbCBtw6F4aW1vIGRlIGNhZGEgdHJhbW8uIEpvdmVuIChoYXN0YSAyOCksIEF2YW56YWRvIChoYXN0YSA2MSksIEFkdWx0byAoaGFzdGEgNDApLCB5IGVsIE91dGxpZXIgZGUgMzIqCgojIyMjIyAqKkdyw6FmaWNhcyBtaXh0YXMgKERhdG9zIEN1YWxpdGF0aXZvcyB5IEN1YW50aXRhdGl2b3MpOioqCgojIyMjIyBHcsOhZmljYSBkZSBiYXJyYXM6IChDbHVzdGVycyB5IEfDqW5lcm8pCmBgYHtyfQpnZ3Bsb3QoYmFqYXMxLCBhZXMoZmFjdG9yKENsdXN0ZXJfTmFtZXMpLCBmaWxsID0gZmFjdG9yKGdlbmVybykpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIocHJlc2VydmUgPSAic2luZ2xlIikpIApgYGAKCipFc3RlIGdyw6FmaWNvIG5vcyBkaWNlIHF1ZSBkZSBjYWRhIHNlZ21lbnRvLCBoYXkgbcOhcyBtdWplcmVzIHF1ZSBzZSBoYW4gZGFkbyBkZSBiYWphLioKCiMjIyMjIEdyw6FmaWNhIGRlIGJhcnJhczogKENsdXN0ZXJzIHkgRXN0YWRvIENpdmlsKQpgYGB7cn0KZ2dwbG90KGJhamFzMSwgYWVzKGZhY3RvcihDbHVzdGVyX05hbWVzKSwgZmlsbCA9IGZhY3Rvcihlc3RhZG9fY2l2aWwpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHByZXNlcnZlID0gInNpbmdsZSIpKSAKYGBgCgoqUG9kZW1vcyB2ZXIgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBqw7N2ZW5lcyBlcmFuIHNvbHRlcm9zLCBzZSBpZ3VhbGFiYSBlbCBuw7ptZXJvIGRlIGFkdWx0b3MgY2FzYWRvcywgc29sdGVyb3MgbyBlbiB1bmnDs24gbGlicmUsIHkgYSBtZWRpZGEgcXVlIG1lam9yYWJhIGxhIHNvY2llZGFkIGF1bWVudGFiYSBlbCBuw7ptZXJvIGRlIHNvbHRlcm9zIHkgY2FzYWRvcy4gU2luIGVtYmFyZ28sIG11eSBwb2NvcyB0cmFiYWphZG9yZXMgc2UgaGFuIGRpdm9yY2lhZG8geSBkZWphZG8gbGEgZW1wcmVzYS4qCgojIyMjIyBHcsOhZmljYSBkZSBiYXJyYXM6IChDbHVzdGVycyB5IE1vdGl2byBkZSBCYWphKQpgYGB7cn0KZ2dwbG90KGJhamFzMSwgYWVzKGZhY3RvcihDbHVzdGVyX05hbWVzKSwgZmlsbCA9IGZhY3Rvcihtb3Rpdm9fZGVfYmFqYSkpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIocHJlc2VydmUgPSAic2luZ2xlIikpIApgYGAKCipQb2RlbW9zIHZlciBxdWUgbGEgbWF5b3LDrWEgZGVsIGdydXBvIGRlIGNvbGFib3JhZG9yZXMgasOzdmVuZXMsIGFkdWx0b3MgeSBhZHVsdG9zIG1heW9yZXMgaGFuIHNpZG8gZGVzcGVkaWRvcyBwb3IgYXVzZW50YXJzZSoKCiMjIyMjIEdyw6FmaWNhIGRlIHBheTogKFB1ZXN0bykKYGBge3J9CnRhYmxlKGJhamFzMSRwdWVzdG8pCnByb3BvcmNpb25lcyA8LSBjKDIzLCAxNzksIDExLCAxMSwgNywgNSkKZXRpcXVldGFzIDwtIGMoIk90cm9zIiwiQXl1ZGFudGUgR2VuZXJhbCIsICJDb3N0dXJlcmEiLCAiU29sZGFkb3IiLCAiQXl1ZGFudGUgRW1iYXJxdWVzIiwgIk1vbnRhY2FyZ3Vpc3RhIikKcGN0IDwtIHJvdW5kKHByb3BvcmNpb25lcy9zdW0ocHJvcG9yY2lvbmVzKSoxMDApCmV0aXF1ZXRhcyA8LSBwYXN0ZShldGlxdWV0YXMsIHBjdCkKZXRpcXVldGFzIDwtIHBhc3RlKGV0aXF1ZXRhcywiJSIsc2VwPSIiKQpwaWUocHJvcG9yY2lvbmVzLGxhYmVscyA9IGV0aXF1ZXRhcywKICAgIGNvbD1yYWluYm93KGxlbmd0aChldGlxdWV0YXMpKSwKICAgIG1haW49IlB1ZXN0byBkZSBsb3MgRXgtQ29sYWJvcmFkb3JlcyIpCgpgYGAKCmBgYHtyfQpiYWphczQgPC1iYWphczEgJT4lIGZpbHRlcihDbHVzdGVycz09MSB8IENsdXN0ZXJzPT0zKSAlPiUgYXJyYW5nZShDbHVzdGVycykKbGlicmFyeShnZ2FsbHV2aWFsKQoKZ2dwbG90KGFzLmRhdGEuZnJhbWUoYmFqYXM0KSwKICAgICAgIGFlcyh5PWVkYWQsIGF4aXMxPSBnZW5lcm8sIGF4aXMyPWVzdGFkb19jaXZpbCkpICsKICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsPUNsdXN0ZXJfTmFtZXMpLCB3aWR0aCA9IDEvMTIpICsKICBnZW9tX3N0cmF0dW0od2lkdGggPSAxLzEyLCBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiZ3JleSIpICsKICBnZW9tX2xhYmVsKHN0YXQgPSAic3RyYXR1bSIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoc3RyYXR1bSkpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJHZW5kZXIiLCAiTWFyaXRhbCBTdGF0dXMiKSwgZXhwYW5kID0gYyguMDUsIC4wNSkpICsKICBzY2FsZV9maWxsX2JyZXdlcih0eXBlID0gInF1YWwiLCBwYWxldHRlID0gIlNldDEiKSArCiAgZ2d0aXRsZSgiRk9STSdzIERhaWx5IFdhZ2UgYnkgU2V4IGFuZCBNYXJpdGFsIFN0YXR1cyIpCmBgYAoKIyMgPGltZyBzcmM9Ii9Vc2Vycy9lbWlsaW9vbHZlcmEvRGVza3RvcC9TY3JlZW4gU2hvdCAyMDIyLTEwLTIxIGF0IDIuMDguMTEgUE0ucG5nIj4gIAoKIyMjIElkZW50aWZpY2FjacOzbiBkZSBSZXN1bHRhZG9zIFJlbGV2YW50ZXMgeSBTdWdlcmVuY2lhcwoKIyMjIyBBIHBhcnRpciBkZWwgYW7DoWxpc2lzIGRlIGxhcyBiYXNlcyBkZSBkYXRvcyBkZSBsYXMgZGlmZXJlbnRlcyDDoXJlYXMgZGUgbGEgZW1wcmVzYSBGT1JNLCBpZGVudGlmaWNhciB5IGRlc2NyaWJpciBsb3MgcHJpbmNpcGFsZXMgNi04IGhhbGxhemdvcyAobWVhbmluZ2Z1bCBpbnNpZ2h0cykuCgoqKjEuKiogRWwgaGFsbGF6Z28gcXVlIHR1dmUgZW4gZWwgYXJlYSBkZSAgbWVybWEgZnVlIHF1ZSBzZSB2ZSBxdWUgZnVlIGFsdGEgZW4gbG9zIG1lc2VzIGRlIGRlIEFnb3N0byAoMzcwODUyIGtpbG9zIGRlIG1lcm1hKSB5IFNlcHRpZW1icmUgZG9uZGUgc2UgcmVxdWllcmUgZGV0ZXJtaW5hciBsYSBjYXVzYSBkZWwgYWx0byBuaXZlbCBkZSBlc3RvcyBkZXNlY2hvcywgcGFyYSBhc2kgcG9kZXIgcHJldmVuaXIgZnV0dXJvcyBnYXN0b3MgZXh0cmEgeSBhc2kgbm8gdm9sdmVyIGEgdGVuZXIgZXN0ZSBwcm9ibGVtYS4KCioqMi4qKiBFbCBoYWxsYXpnbyBxdWUgdHV2ZSBlbiBlbCBhcmVhIGRlIFNjcmFwIGZ1ZSBxdWUsIGVuIGxvIHF1ZSBlcyBsYSBQcmUtcHJvZHVjdGlvbiBlcyBkb25kZSBtYXMgc2NyYXAgc2UgdmUgcmVmbGVqYWRhIGVuIGxhIGN1YWwgeW8gY29uc2lkZXJvIHF1ZSBzZSBpbXBsZW1lbnRlIHVuIHBsYW4gcGFyYSBkaXNtaW51aXIgZXN0byB5YSBxdWUgc2UgcG9kcmlhIGRlY2lyIHF1ZSBzZSByZWZsYWphbiBnYXN0b3MgZXh0cmEgcXVlIHNvbiBpbm5lY2VzYXJpb3MKCioqMy4qKiBFbCBoYWxsYXpnbyBxdWUgdHV2ZSBlbiBlbCBhcmVhIGRlIGxvcyBjb2xhYm9yYWRvcmVzIGVzIHF1ZSBsb3MgcXVlIGVzdGFuIGNhc2Fkb3MgeSBzb2x0ZXJvcyBzdWVsZW4gZ2FuYXIgbcOgcyBkZSBsb3MgcXVlIGVzdGFuIGRpdm9yY2lhZG9zIHkgZW4gdW5pb24gbGlicmUKCioqNC4qKiAgRWwgaGFsbGF6Z28gcXVlIHR1dmUgZW4gZWwgYXJlYSBkZSBiYWphcyBmdWUgcXVlIGVsIG1vdGl2byBtw6BzIGNvbcO5biBkZSBiYWphIGRlIGxvcyBjb2xhYm9yYWRvcmVzIGhhbiBzaWRvIHBvciBkZXNwaWRvcyBwb3IgZmFsdGFzLgoKKio1LioqICBFbCBoYWxsYXpnbyBxdWUgdHV2ZSBlbiBjdWFudG8gYSBsb3MgcHJvbm9zdGljb3MgZXMgcXVlIGVsIHRpcG8gZGUgY2FtYmlvIGVzIHVuIGZhY3RvciBxdWUgaW5mbHVlbmNpYSBtdWNobyBlbiBjdWFudG8gYSBsYXMgbmVnb2NpYWNpb25lcyBkZSBNZXhpY28gZXN0byBzZSBkZWJlIGRhZG8gcXVlIG51ZXN0cm8gcGFpcyBmb3JtYSBwYXJ0ZSBkZWwgbWVyY2FkbyBjYW1iaWFyaW8gaW50ZXJuYWNpb25hbCwgeSBsYSBtYXlvcsOtYSBkZSBsYXMgb3BlcmFjaW9uZXMgc2UgcmVhbGl6YW4gZW4gZWwgbWVyY2FkbyBwZXNvLWTDs2xhciwgeWEgcXVlIGxhIGFjdGl2aWRhZCBlbiBvdHJvcyBtZXJjYWRvcyBkZSBkaXZpc2FzIGVzIG11eSBiYWphLCBhc2kgcXVlIHNpIGVzdGUgYmFqYSB0YW1iaWVuIGFmZWN0YSBhIE1leGljby4KCioqNi4qKiAgRWwgaGFsbGF6Z28gcXVlIHR1dmUgZW4gZWwgYXJlYSBkZSBjb2xhYm9yYWRvcmVzIGVzIHF1ZSBkZXNwdcOpcyBkZSB0b21hciBlbiBjb25zaWRlcmFjacOzbiBsYXMgdmFyaWFibGVzIGRlIGVkYWQgeSBzYWxhcmlvIGRpYXJpbyBwdWRlIG9ic2VydmFyIHF1ZSBsb3MgYWR1bHRvcyBlbnRyZSA0MSB5IDYxIGHDsW9zLCBxdWUgc2UgY29uc2lkZXJhIGVuIGxvIHF1ZSBlcyBsYSBqdWJpbGFjacOzbiwgc3VmcmVuIG1heW9yZXMgYmFqYXMuCgoqKjcuKiogT3RybyBoYWxsYXpnbyBxdWUgdHV2ZSBmdWUgcXVlIGxvcyBjbGllbnRlcyBtw6FzIGltcG9ydGFudGVzIHBhcmEgRk9STSBzb24gWWFuZmVuZywgU3RhYmlsdXMgMSB5IFZhcnJvYy4KCiMjIyMgQSBwYXJ0aXIgZGVsIGFuw6FsaXNpcyBkZSBsYXMgYmFzZXMgZGUgZGF0b3MgZGUgbGFzIGRpZmVyZW50ZXMgw6FyZWFzIGRlIGxhIGVtcHJlc2EgRk9STSwgZGVzY3JpYmlyIDMgc3VnZXJlbmNpYXMgcXVlIGxlIHBlcm1pdGFuIGFsIHNvY2lvIGZvcm1hZG9yIG1lam9yYXIgc3UgcHJvY2VzbyBkZSBjYXB0dXJhLCBvcmdhbml6YWNpw7NuLCB5IGFuYWzDrXRpY2EgZGUgZGF0b3MuCgoqKlBST1BVRVNUQSBQQVJBIE1FUk1BKioKCkNvbW8gcHJvcHVlc3RhIHBhcmEgbGEgbWVybWEsIHNlIHRpZW5lIHF1ZSBpbXBsZW1lbnRhciB1biBwbGFuIHF1ZSBtaW5pbWljZSBsYSBjYW50aWRhZCBkZSBtZXJtYSBnZW5lcmFkYSwgbGEgY3VhbCBzZSB2ZSBxdWUgZnVlIGFsdGEgZW4gbG9zIG1lc2VzIGRlIGRlIEFnb3N0byB5IFNlcHRpZW1icmUgZG9uZGUgc2UgcmVxdWllcmUgZGV0ZXJtaW5hciBsYSBjYXVzYSBkZWwgYWx0byBuaXZlbCBkZSBlc3RvcyBkZXNlY2hvcywgcGFyYSBhc2kgcG9kZXIgcHJldmVuaXIgZnV0dXJvcyBnYXN0b3MgZXh0cmEgeSBhc2kgbm8gdm9sdmVyIGEgdGVuZXIgZXN0ZSBwcm9ibGVtYS4KCioqUFJPUFVFU1RBIFBBUkEgU0NSQVAqKgoKQ29tbyBwcm9wdWVzdGEgcGFyYSBzY3JhcCwgcHVlZG8gZGVjaXIgcXVlIGVuIGVsIGFyZWEgZGUgUHJlLXByb2R1Y3Rpb24gc2llbmRvIGVsIGFyZWEgcXVlIG1hcyBzY3JhcCBsbGV2YSBzZSB0aWVuZSBxdWUgaW1wbGVtZW50YXIgdW4gcGxhbiBwYXJhIGRpc21pbnVpciBlc3RvIHlhIHF1ZSBzZSBwb2RyaWEgZGVjaXIgcXVlIHNlIHJlZmxhamFuIGdhc3RvcyBleHRyYSBxdWUgc29uIGlubmVjZXNhcmlvcy4KCioqUFJPUFVFU1RBIFBBUkEgUFJPRFVDQ0lPTioqCgpDb21vIHByb3B1ZXN0YSBwYXJhIHByb2R1Y2Npb24gcHVlZG8gZGVjaXIgcXVlIHNlIHNpZ2FuIGFkYXB0YW5kbyBhIGxhcyBuZWNlc2lkYWRlcyBkZSBsb3MgY2llbnRlcyBwZXJvIHF1ZSB0YW1iaWVuIHRyYXRlbiBkZSBpbXBsZW1lbnRhciBvdHJhcyBtYW5lcmFzIHlhIHF1ZSBzZSBxdWllcmUgbGxlZ2FyIGEgdG9kb3MgbG9zIGNsaWVudGVzIHBvc2libGVzIHkgbm8gZXN0YXIgc2VnbWVudGFuZG8sIHBvciBsbyBjdWFsIGVzIGltcG9ydGFudGUgZGUgdHJhdGFyIGRlIGFicmlyc2UgbWFzIGhhY2lhIGxvcyBjbGllbnRlcyBxdWUgbm8gbGVzIGxsZWdhbiBhIHBlZGlyIGxhcyBtaXNtYXMgZGVtYW5kYXMuCgoqKlBST1BVRVNUQSBBTkFMSVNJUyBERSBEQVRPUyoqCgpDb21vIHByb3B1ZXN0YSBwYXJhIHN1IGFuYWxpdGljYSBkZSBkYXRvcyBlcyBxdWUgcGFyYSBxdWUgRk9STSBwdWVkYSBzZWd1aXIgb2J0ZW5pZW5kbyBidWVub3MgcmVzdWx0YWRvcyBhIGN1YW50byBhIHN1cyBkYXRvcyBlcyBxdWUgY29uc3RhbnRlbWVudGUgYnVzcXVlbiB0ZW5lciB1bmEgbGltcGlhIGRlIGVzdG9zLCBlbiBkb25kZSBtZSBkaSBjdWVudGEgcXVlIGZ1ZSBlc2VuY2lhbCBhbCB5byB0cmFiYWphciBjb24gZXN0b3MsIGRvbmRlIHZpIHF1ZSBoYWJpYSBtdWNoYXMgY29zYXMgcXVlIG5vIHRlbmlhbiBzZW50aWRvLCB0YWxlcyBjb21vIGVycm9yZXMgZGUgZGVkbywgbnVtZXJvcyBleHRyYSwgY29sdW1uYXMgcmVwZXRpZGFzLCBldGMuIEVsIGxpbXBpYXIgbG9zIGRhdG9zIGF5dWRhcmEgYSBvYnRlbmVyIHJlc3VsdGFkb3MgbWVqb3JlcywgZG9uZGUgeW8gY3JlbyBsbyBtYXMgb3B0aW1vIHBhcmEgZXNvIGVzIHF1ZSBjaWVydG8gZGVwYXJ0YW1lbnRvIHRlbmdhIGxhIHRhcmVhIGRlIGhhY2VyIGVzdG8geWEgc2VhIGVsIGRlcGFydGFtZW50byBkZSBJVCBvIHRhbWJpZW4gcG9kcmlhbiB0ZW5lciBhbGd1bmEgcGxhdGFmb3JtYSBleHRlcm5hIHF1ZSBsZXMgaGFnYSBlc3RlIHRyYWJham8uCgoKIyMjIyBEZXNjcmliaXIgY29uIHR1cyBwcm9waWFzIHBhbGFicmFzIGxvcyB0w6lybWlub3MgQnVzaW5lc3MgQW5hbHl0aWNzIHkgQnVzaW5lc3MgSW50ZWxsaWdlbmNlLiBBc8OtIHRhbWJpw6luLCBpZGVudGlmaWNhciB5IGRlc2NyaWJpciAzIHByaW5jaXBhbGVzIGRpZmVyZW5jaWFzIGVudHJlIEJ1c2luZXNzIEFuYWx5dGljcyB5IEJ1c2luZXNzIEludGVsbGlnZW5jZS4KCioqQnVzaW5lc3MgQW5hbHl0aWNzKiogZXMgZWwgcHJvY2VzbyBtZWRpYW50ZSBlbCBjdWFsIGxhcyBvcmdhbml6YWNpb25lcyBhbmFsaXphbiBkYXRvcyBoaXN0w7NyaWNvcyB1dGlsaXphbmRvIHTDqWNuaWNhcyB5IHRlY25vbG9nw61hIGVzdGFkw61zdGljYXMgcGFyYSBhcHJlbmRlciBjb3NhcyBudWV2YXMgeSB0b21hciBtZWpvcmVzIGRlY2lzaW9uZXMgZXN0cmF0w6lnaWNhcy4KCioqQnVzaW5lc3MgSW50ZWxsaWdlbmNlKiogZXMgdW4gbcOpdG9kbyBpbXB1bHNhZG8gcG9yIGxhIHRlY25vbG9nw61hIHBhcmEgZWwgYW7DoWxpc2lzIGRlIGRhdG9zIHkgbGEgZW50cmVnYSBkZSBpbmZvcm1hY2nDs24gcXVlIGF5dWRhIGEgbG9zIGVqZWN1dGl2b3MsIGdlcmVudGVzIHkgZW1wbGVhZG9zIGEgdG9tYXIgZGVjaXNpb25lcyBjb21lcmNpYWxlcyBlc3RyYXTDqWdpY2FzLgoKKioxLioqIE1pZW50cmFzIHF1ZSBCQSBzZSB1dGlsaXphIHBhcmEgaW1wbGVtZW50YXIgY2FtYmlvcyBlbiBsYXMgb3BlcmFjaW9uZXMsIEJJIHNlIHV0aWxpemEgcGFyYSBhZG1pbmlzdHJhciBkZSBtYW5lcmEgZWZpY2llbnRlIGVsIG5lZ29jaW8gYWN0dWFsLgoKKioyLioqIExhIGludGVsaWdlbmNpYSBjb21lcmNpYWwgKEJ1c2luZXNzIEludGVsbGlnZW5jZSkgcHJpb3JpemEgZWwgYW7DoWxpc2lzIGRlc2NyaXB0aXZvLCBxdWUgYnJpbmRhIHVuYSBkZXNjcmlwY2nDs24gZ2VuZXJhbCBkZSBsb3MgZGF0b3MgaGlzdMOzcmljb3MgeSBhY3R1YWxlcyBwYXJhIGRlbW9zdHJhciBsbyBxdWUgaGEgb2N1cnJpZG8gbyBlc3TDoSBvY3VycmllbmRvIGVuIGVzdGUgbW9tZW50by4KCioqMy4qKiBGaW5hbG1lbnRlLCBCdXNpbmVzcyBBbmFseXRpY3MgZXMgYXByb3BpYWRvIGN1YW5kbyBsYSBleHBhbnNpw7NuIGZ1dHVyYSB5IGxhIHN1c3RlbnRhYmlsaWRhZCBzZSBjb25zaWRlcmFuIGVsIG9iamV0aXZvIHByaW5jaXBhbCwgbWllbnRyYXMgcXVlIEJ1c2luZXNzIEludGVsbGlnZW5jZSBlcyBpbXBvcnRhbnRlIGN1YW5kbyBlbCBlbmZvcXVlIGRlIGxhIG9yZ2FuaXphY2nDs24gZXN0w6EgZW4gb3BlcmFyIGVsIG5lZ29jaW8gZXhpc3RlbnRlLgoKCiMjIDxpbWcgc3JjPSAiL1VzZXJzL2VtaWxpb29sdmVyYS9EZXNrdG9wL1NjcmVlbiBTaG90IDIwMjItMTAtMjEgYXQgMi4xMC4wMiBQTS5wbmciPgoKIyMjIyBEZXNjcmliaXIgY29uIHR1cyBwcm9waWFzIHBhbGFicmFzIGVsIGNvbmNlcHRvIGRlIEluZGljYWRvciBDbGF2ZSBkZSBSZW5kaW1pZW50byAvIEtleSBQZXJmb3JtYW5jZSBJbmRpY2F0b3JzIChLUEkpLgoKVW4gaW5kaWNhZG9yIGNsYXZlIGRlIHJlbmRpbWllbnRvLCBvIEtQSSwgc2UgZGVzY3JpYmUgY29tbyAidW4gdmFsb3IgY3VhbnRpdGF0aXZvIHV0aWxpemFkbyBwYXJhIGV2YWx1YXIgbGEgZWZpY2FjaWEgZGUgdW5hIHBlcnNvbmEgdSBvcmdhbml6YWNpw7NuIHBhcmEgbG9ncmFyIHVuIG9iamV0aXZvIi4gTG9zIGluZGljYWRvcmVzIGNsYXZlIGRlIHJlbmRpbWllbnRvIGVuIGxhcyBlbXByZXNhcyBwdWVkZW4gc2VyIGRlIGFsdG8gbml2ZWwgbyBwcm9mdW5kaXphciBlbiB1biBkZXBhcnRhbWVudG8gbyBwZXJzb25hIGVuIHBhcnRpY3VsYXIuIExvcyBLUEkgZGUgYWx0byBuaXZlbCwgY29tbyBnZW5lcmFyICQgMSBtaWxsw7NuIGVuIGluZ3Jlc29zIGFudWFsZXMgcmVjdXJyZW50ZXMgZXN0ZSBhw7FvIGZpc2NhbCwgYSBtZW51ZG8gZXZhbMO6YW4gZWwgw6l4aXRvIGRlIHN1IGVtcHJlc2EgZW4gZ2VuZXJhbC4gRXN0b3Mgc29uIEtQSSBkZSBiYWpvIG5pdmVsIGN1YW5kbyBzZSBzdW1lcmdlIGVuIHByb2Nlc29zIHF1ZSBzb24gZXhjbHVzaXZvcyBkZSBkaXZpc2lvbmVzLCBlcXVpcG9zIG8gcGVyc29uYXMuIAoKIyMjIyBBIHBhcnRpciBkZWwgYW7DoWxpc2lzIGRlIGxhcyBiYXNlcyBkZSBkYXRvcyBkZSBsYXMgZGlmZXJlbnRlcyDDoXJlYXMgZGUgbGEgZW1wcmVzYSBGT1JNLCBwcm9wb25lciB5IGRlc2NyaWJpciAzIHBvc2libGVzIEtQSXMgcXVlIHBlcm1pdGFuIGV2YWx1YXIgZWwgZGVzZW1wZcOxbyBkZSBhbGd1bmFzIGRlIHN1cyDDoXJlYXMuCgoqKjEuKiogVW4gaW5kaWNhZG9yIGRlIHJlbmRpbWllbnRvIHF1ZSBwb2RyaWEgc2VyIGRlIGdyYW4gdXNvIHBhcmEgZWwgYXJlYSBkZSBNZXJtYSBxdWUgZXN0YSBjZW50cmFkbyBlbiBsYSBnZXN0acOzbiBkZSBleGlzdGVuY2lhcyBlbiBlbCBhbG1hY8Opbiwgc2UgZGVub21pbmEgS1BJIGRlIGludmVudGFyaW8uIExhcyBpbnN0YWxhY2lvbmVzIHF1ZSBoYW4gZGVzY3ViaWVydG8gZXN0YXMgbcOpdHJpY2FzIGdhcmFudGl6YW4gdW4gY29udHJvbCBkZSBpbnZlbnRhcmlvIGVmZWN0aXZvIHkgZmx1am9zIGRlIGVudHJhZGEgeSBzYWxpZGEgZmx1aWRvcyBkZSBhcnTDrWN1bG9zLgoKKioyLioqIFVuIGluZGljYWRvciBkZSByZW5kaW1pZW50byBxdWUgcG9kcmlhIHNlciBkZSBncmFuIHVzbyBwYXJhIGVsIGFyZWEgZGUgUmVjdXJzb3MgSHVtYW5vcyBlcyBlbCBkZSAiTml2ZWwgZGUgc2F0aXNmYWNjacOzbiIgZWwgY3VhbCB0ZW5kcmlhIHF1ZSB0ZW5lciBlbmZvcXVlIGVuIGxvcyBlbXBsZWFkb3MsIGVzdGUgbG8gY29uc2lkZXJvIGltcG9ydGFudGUgeWEgcXVlIGNvbW8gc3Ugbm9tYnJlIGxvIGRpY2Ugc2UgdG9tYXJhIGNvbW8gZmFjdG9yIGltcG9ydGFudGUgbGEgc2F0aXNmYWNjaW9uIHF1ZSBsb3MgY29sYWJvcmFkb3JlcyB0aWVuZW4gZGVudHJvIGRlIGxhIGVtcHJlc2EsIGRvbmRlIGVzdGEgc2UgcG9kcmEgbWVkaXIgY29uIGVuY3Vlc3RhcyB5YSBtZSBzZWEgbWVuc3VhbGVzLCBvIGNvbW8gbWFzIHNlIGFjb21vZGUgbGEgZW1wcmVzYS4KCioqMy4qKiBVbiBpbmRpY2Fkb3IgZGUgcmVuZGltaWVudG8gcXVlIHBvZHJpYSBzZXIgZGUgZ3JhbiB1c28gcGFyYSBlbCBhcmVhIGRlIHZlbnRhcywgZXMgZWwgZGUgbsO6bWVybyBkZSBsZWFkcyAoVW4gbGVhZCBlcyB1biBwb3RlbmNpYWwgY2xpZW50ZSBpbnRlcmVzYWRvIGVuIGxvcyBwcm9kdWN0b3MgeS9vIHNlcnZpY2lvcykgcHVlZGUgZGVzYXJyb2xsYXIgw61uZGljZXMgZGUgaW5kaWNhY2nDs24gZGUgdmVudGFzIGRlIEtQSSBjYWxjdWxhbmRvIHN1IHRhc2EgZGUgZ2VuZXJhY2nDs24gZGUgcHJvc3BlY3Rvcy4gRXN0byBlcyBiZW5lZmljaW9zbyB0YW50byBhIG5pdmVsIG5hY2lvbmFsIGNvbW8gbG9jYWwuIFB1ZWRlcyBtZWRpciBsb3MgZGlmZXJlbnRlcyBuaXZlbGVzIGRlIGluZmx1ZW5jaWEgcXVlIHRpZW5lcyBhIG5pdmVsIGxvY2FsIGRlIGNhZGEgY2l1ZGFkIHV0aWxpemFuZG8gdW4gS1BJIGRlIGVzdGUgdGlwbyBlbiBkaWZlcmVudGVzIGNpdWRhZGVzLiAKCiMjIFJlZmVyZW5jaWFzCgoqLSBLbGlwZm9saW8uICgyMDIyLCBPY3RvYmVyIDE5KS4gV2hhdCBpcyBhIEtQST8gRGVmaW5pdGlvbiwgQmVzdCBQcmFjdGljZXMsIGFuZCBFeGFtcGxlcy4gUmV0cmlldmVkIE9jdG9iZXIgMjAsIDIwMjIsIGZyb20gaHR0cHM6Ly93d3cua2xpcGZvbGlvLmNvbS9yZXNvdXJjZXMvYXJ0aWNsZXMvd2hhdC1pcy1hLWtleS1wZXJmb3JtYW5jZS1pbmRpY2F0b3IqCgoqLUJ1c2luZXNzIGludGVsbGlnZW5jZSB2cy4gYnVzaW5lc3MgYW5hbHl0aWNzOiBXaGF04oCZcyB0aGUgZGlmZmVyZW5jZT8gKG4uZC4pLiBUYWJsZWF1LiBSZXRyaWV2ZWQgT2N0b2JlciAyMCwgMjAyMiwgZnJvbSBodHRwczovL3d3dy50YWJsZWF1LmNvbS9sZWFybi9hcnRpY2xlcy9idXNpbmVzcy1pbnRlbGxpZ2VuY2UvYmktYnVzaW5lc3MtYW5hbHl0aWNzKgoKKi0gQ29zdGEsIEMuLCAmIENvc3RhLCBDLiAoMjAyMCwgRGVjZW1iZXIgMTUpLiBDdcOhbGVzIHNvbiBsb3MgcHJpbmNpcGFsZXMgS1BJIGRlIHZlbnRhLiBDUk8gQ3JlYXRpdm8gwq4uIFJldHJpZXZlZCBPY3RvYmVyIDIxLCAyMDIyLCBmcm9tIGh0dHBzOi8vY3JvY3JlYXRpdm8uY29tL2Jsb2cvY3VhbGVzLXNvbi1sb3MtcHJpbmNpcGFsZXMta3BpLWRlLXZlbnRhLyoKCgo=