Librerias

library(dplyr)
library(plyr)
library(ggplot2)
# install.packages("naniar")
library(naniar)
# install.packages("Hmisc")
library(Hmisc)  
# install.packages("psych")
library(psych)
library(tidyverse)
# install.packages("janitor")
library(janitor)
# install.packages("knitr")
library(knitr)
# install.packages("pollster")
library(pollster)

Importar Bases de datos

merma <- read.csv("/Users/anita3/Downloads/FORM - Merma.csv")
scrap <- read.csv("/Users/anita3/Downloads/FORM - Scrap.csv")
pcarton <- read.csv("/Users/anita3/Downloads/FORM - Produccion Carton Mes.csv")

Merma

1) ¿Cuántas variables y cuantos registros tiene la base de datos?

describe(merma)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
##        vars  n  mean    sd median trimmed   mad min  max range  skew kurtosis
## Fecha*    1 60 19.77 13.83   20.5   19.40 17.79   1   43    42  0.05    -1.34
## Mes*      2 60  6.25  4.56    5.0    5.60  4.45   1   19    18  1.05     0.44
## Kilos*    3 60 28.72 15.92   29.0   28.77 19.27   1   56    55 -0.03    -1.21
## X         4  0   NaN    NA     NA     NaN    NA Inf -Inf  -Inf    NA       NA
##          se
## Fecha* 1.79
## Mes*   0.59
## Kilos* 2.06
## X        NA
dim(merma)
## [1] 60  4

2) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

3) Elige la escala de medición de cada variable.

Variable Type
Fecha Cualitativa
Mes Cualitativa
Kilos Cuantitativa (discreta)

4) Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Eliminar renglones de Total por mes

merma <- merma[- grep("Total", merma$Mes),]

Eliminar columna vacia

merma <- select(merma, -X)

Cambiar tipo de datos
Cambiar variable kilos a numerico

merma$Kilos <- as.numeric(merma$Kilos)

Cambiar variable caracter a fecha

merma$Fecha <- as.Date(merma$Fecha, format = "%d/%m/%Y")

Agregar columna de Total por mes

merma_total <- aggregate(Kilos ~ Mes, data = merma, sum)

Scrap

1) ¿Cuántas variables y cuantos registros tiene la base de datos?

describe(scrap)
##                       vars   n   mean     sd median trimmed   mad min  max
## Referencia*              1 251 126.00  72.60    126  126.00 93.40   1  251
## Fecha*                   2 251  16.21   7.11     17   16.50  7.41   1   27
## Hora*                    3 251 126.00  72.60    126  126.00 93.40   1  251
## Producto*                4 251  45.20  24.83     46   44.94 26.69   1   96
## Cantidad                 5 251  13.34 105.90      2    3.95  1.48   0 1674
## Unidad.de.medida*        6 251   2.00   0.06      2    2.00  0.00   1    2
## Ubicación.de.origen*     7 251   3.47   0.86      4    3.60  0.00   1    4
## Ubicación.de.desecho*    8 251   2.00   0.06      2    2.00  0.00   1    2
## Estado*                  9 251   2.00   0.06      2    2.00  0.00   1    2
##                       range   skew kurtosis   se
## Referencia*             250   0.00    -1.21 4.58
## Fecha*                   26  -0.29    -0.99 0.45
## Hora*                   250   0.00    -1.21 4.58
## Producto*                95   0.01    -0.80 1.57
## Cantidad               1674  15.37   237.90 6.68
## Unidad.de.medida*         1 -15.65   244.02 0.00
## Ubicación.de.origen*      3  -1.11    -0.62 0.05
## Ubicación.de.desecho*     1 -15.65   244.02 0.00
## Estado*                   1 -15.65   244.02 0.00
dim(scrap)
## [1] 251   9

2) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

3) Elige la escala de medición de cada variable.

Variable Type
Referencia Cualitativa
Fecha Cualitativa
Hora Cuantitativa (continua)
Producto Cualitativa
Cantidad Cuantitativa (discreta)
Unidad de medidad Cualitativa
Ubicación de origen Cualitativa
Ubicacuón de desecho Cualitativa
Estado Cualitativa

4) Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Eliminar renglon de mes y total

scrap <- scrap[- grep("agosto", scrap$Referencia),]

Eliminar columnas

scrap <- select(scrap, -Unidad.de.medida)
scrap <- select(scrap, -Estado)

Cambiar tipo de dato
Cambiar variable caracter a fecha

merma$Fecha <- as.Date(merma$Fecha, format = "%d/%m/%Y")

Produccion de Carton

1) ¿Cuántas variables y cuantos registros tiene la base de datos?

describe(pcarton)
##                     vars  n  mean    sd median trimmed   mad min max range skew
## X*                     1 51 26.00 14.87     26   26.00 19.27   1  51    50 0.00
## X.1*                   2 51  5.24  2.16      5    5.15  2.97   1   9     8 0.34
## X.2*                   3 51 22.39 13.72     22   22.29 17.79   1  46    45 0.04
## X.3*                   4 51 26.00 14.87     26   26.00 19.27   1  51    50 0.00
## X.4*                   5 51 10.49  6.77      8   10.00  7.41   1  24    23 0.47
## X.5*                   6 51  3.53  2.59      2    3.17  1.48   1  11    10 0.93
## X.6*                   7 51 11.49  9.55     11   10.83 14.83   1  29    28 0.32
## X.7*                   8 51  7.63  4.60      8    7.56  7.41   1  14    13 0.08
## TIEMPO.DE.MAQUINAS*    9 51 10.04  8.53      9    9.17 10.38   1  28    27 0.58
## X.8*                  10 51  7.49  7.20      2    6.49  1.48   1  24    23 0.87
## X.9*                  11 51  7.88  7.94      2    6.73  1.48   1  26    25 0.94
## X.10*                 12 51 11.92 10.58      9   10.90 10.38   1  33    32 0.54
## X.11*                 13 51 11.92 10.58      9   10.90 10.38   1  33    32 0.54
## X.12*                 14 51  2.69  0.91      3    2.66  0.00   1   6     5 0.80
## X.13*                 15 51  1.16  0.42      1    1.05  0.00   1   3     2 2.60
##                     kurtosis   se
## X*                     -1.27 2.08
## X.1*                   -1.05 0.30
## X.2*                   -1.28 1.92
## X.3*                   -1.27 2.08
## X.4*                   -1.15 0.95
## X.5*                    0.16 0.36
## X.6*                   -1.39 1.34
## X.7*                   -1.61 0.64
## TIEMPO.DE.MAQUINAS*    -1.04 1.19
## X.8*                   -0.70 1.01
## X.9*                   -0.62 1.11
## X.10*                  -1.20 1.48
## X.11*                  -1.20 1.48
## X.12*                   2.58 0.13
## X.13*                   6.36 0.06
dim(pcarton)
## [1] 51 15

2) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

3) Elige la escala de medición de cada variable.

Variable Type
Cliente Cualitativa (nominal)
ID Form Cualitativa (nominal)
Producto Cualitativa (nominal)
Piezas programadas Cuantitativa (discreta)
Tiempo minutos Cuantitativa (discreta)
Hora fin Cuantitativa (continua)
Estacion arranque Cualitativa (nominal)
Laminas procesadas Cuantitativa
Inicio set up Cuantitativa (continua)
Fin inicio set up Cuantitativa (continua)
Inicio de proceso Cuantitativa (continua)
Fin de proceso Cuantitativa (continua)
Tiempo calidad Cuantitativa (discreta)

4) Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Elimina columnas

Eliminar columna No. de cliente

pcarton <- select(pcarton, -X)

Eliminar columna tipo de meteriales

pcarton <- select(pcarton, -X.13)

Pasae fila a nombres de columna

pcarton2 <- pcarton
colnames(pcarton2) <- pcarton[1,]
colnames(pcarton2)
##  [1] "CLIENTE"              "ID FORM"              "PRODUCTO"            
##  [4] "PIEZAS PROG."         "TMO: MIN."            "HR. FIN"             
##  [7] "ESTACION ARRANQUE"    "Laminas procesadas "  "INICIO SEP UP"       
## [10] "FIN INICIO DE SEP UP" "INICIO de PROCESO"    "FIN de PROCESO"      
## [13] "TIEMPO CALIDAD"

Eliminar primer fila

pcarton2 <- pcarton2[-1,]

Análisis estadístico descriptivo

Realizar un análisis estadístico descriptivo en el que logres destacar el conjunto de datos, que apoyan a la empresa a mejorar su operación. Incorpora al menos dos propuestas concretas, apoyadas de tu análisis en donde se incluye al menos: (1) Tabla de frecuencia, (opcional) Tablas cruzadas, (2-3) Gráficos de datos cualitativos y cuantitativos, así como (2-3) Gráficos de dispersión.

Tabla de frecuencia

La tabla de frecuencia muestra el numero de veces que se repite una variable

scrap

ubicacion <- scrap %>% group_by(Ubicación.de.origen) %>% tally()
ubicacion
## # A tibble: 3 × 2
##   Ubicación.de.origen           n
##   <chr>                     <int>
## 1 SAB/Calidad/Entrega de PT    58
## 2 SAB/Post-Production          13
## 3 SAB/Pre-Production          179

merma

mes <- merma %>% group_by(Mes) %>% tally()
mes
## # A tibble: 9 × 2
##   Mes            n
##   <chr>      <int>
## 1 ABRIL          5
## 2 AGOSTO        11
## 3 ENERO          4
## 4 FEBRERO        6
## 5 JULIO          5
## 6 JUNIO          4
## 7 MARZO          6
## 8 MAYO           5
## 9 SEPTIEMBRE     4

Graficas de datos cualitativos y cuentitativos

merma

ggplot(merma_total, aes(x=Mes, y=Kilos, fill=Kilos)) +
  geom_bar(stat="identity" )+ 
  labs(title = "Kilos por Mes", 
       x = "Mes", y = "Kilos")

En esta grafica podemos observar los kilos de merma producido por mes. El mes que genera mayor cantidad de merma es el mes de agosto con 30,000 kilos de merma, mientras que el mes de septiembre es el que menos genera merma con 15,000 kilos de merma.

srap

ggplot(scrap, aes(x=Ubicación.de.origen, y=Cantidad)) +
  geom_bar(stat="identity", fill="skyblue") + scale_fill_grey() + 
  labs(title = "Cantidad por Ubicacion", 
       x = "Cantidad", y = "Ubicación")

En esta grafica podemos observar la cantidad de productos y/o materiales que se requieren para cada estacion de trabajo. La estacion que requiere mayor uso de materiales es la Pre-produccion.

Graficos de dispercion

merma

ggplot(merma_total , aes(x=Mes, y=Kilos)) + 
    geom_point()+ 
  labs(title = "Kilos por Mes", 
       x = "Mes", y = "Kilos")

Observaciones:
- Agosto y Mayo son los meses que mas producen merma.
- Enero y Septiembre son los meses que producen menos merma.

Al visualizar estos datos podriamos inferir que en los meses donde hay mayor numero de merma son los meses con mayor produccion. Mientras que en los meses con menos numero de merma son los meses con menos produccion.

scrap

ggplot(scrap , aes(x=Cantidad, y=Ubicación.de.origen)) + 
    geom_boxplot()+ 
  labs(title = "Cantidad por Estación", 
       x = "Cantidad", y = "Ubicación")

En la grafica de dispercion de scrap podemos observar con mayor claridad la cantidad de productos y/o materiales que se necesitan para cada area de trabajo.
En su mayoria las tres areas de trabajo utilizan entre 0 y 25 productos y/o materiables, sin embargo, en ocaciones Pre-produccion ocupa mayor cantidad de productos y/o materiables.

produccion de carton

ggplot(pcarton2, aes(x=`PIEZAS PROG.`, y=CLIENTE)) + 
    geom_point() + 
  labs(title = "Piezas programadas por cliente", 
       x = "Piezas Programadas", y = "Cliente")

En la grafica de dispercion de produccion de carton podemos observar cuales son los clientes que piden mayor demanda de piezas, los cuales son:
- Meridian Lightweight
- Stabilus 1
- Stabilus 3
- Varroc
- Yanfeng

Reflexión de la actividad.

Realizando la preparación y análisis de datos se pudieron encontrar varios datos interesantes como:

  • Agosto y Mayo son los meses que la empresa produce mayor número de merma, por lo que se puede inferir que estos son los meses con mayor producción.
  • Enero y septiembre son los meses que la empresa produce menor número de merma, por lo que se puede inferir que estos son los meses con menor producción.
  • Pre-producción es el área de trabajo que requiere mayor cantidad de productos y materiales
  • Los clientes con mayor demanda son: Meridian Lightweight, Stabilus 1, Stabilus 3, Yanfeng y Varroc

Adicional a lo anterior, es importante mencionar que realizar la limpieza de datos es importante para generar un análisis correcto de la base de datos.

LS0tCnRpdGxlOiAiRU5UUkVHQUJMRSBSNSIKYXV0aG9yOiAiQW5hIFBhdHJpY2lhIEFwb250ZSAtIEEwMTI4MzkyOCIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCjxpbWcgc3JjPSAiL1VzZXJzL2FuaXRhMy9EZXNrdG9wL2NiIGltZyByLnBuZyI+CgojIyBMaWJyZXJpYXMgIAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeShwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCiMgaW5zdGFsbC5wYWNrYWdlcygibmFuaWFyIikKbGlicmFyeShuYW5pYXIpCiMgaW5zdGFsbC5wYWNrYWdlcygiSG1pc2MiKQpsaWJyYXJ5KEhtaXNjKSAgCiMgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJqYW5pdG9yIikKbGlicmFyeShqYW5pdG9yKQojIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikKbGlicmFyeShrbml0cikKIyBpbnN0YWxsLnBhY2thZ2VzKCJwb2xsc3RlciIpCmxpYnJhcnkocG9sbHN0ZXIpCmBgYAoKIyMgSW1wb3J0YXIgQmFzZXMgZGUgZGF0b3MKCmBgYHtyfQptZXJtYSA8LSByZWFkLmNzdigiL1VzZXJzL2FuaXRhMy9Eb3dubG9hZHMvRk9STSAtIE1lcm1hLmNzdiIpCnNjcmFwIDwtIHJlYWQuY3N2KCIvVXNlcnMvYW5pdGEzL0Rvd25sb2Fkcy9GT1JNIC0gU2NyYXAuY3N2IikKcGNhcnRvbiA8LSByZWFkLmNzdigiL1VzZXJzL2FuaXRhMy9Eb3dubG9hZHMvRk9STSAtIFByb2R1Y2Npb24gQ2FydG9uIE1lcy5jc3YiKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogIzNBNUZDRCI+ICoqTWVybWEqKiA8L3NwYW4+CgojIyMgMSkgwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdWFudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPwpgYGB7cn0KZGVzY3JpYmUobWVybWEpCmRpbShtZXJtYSkKYGBgCgojIyMgMikgQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YQojIyMgMykgRWxpZ2UgbGEgZXNjYWxhIGRlIG1lZGljacOzbiBkZSBjYWRhIHZhcmlhYmxlLgoKYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gVFJVRX0KVmFyaWFibGU8LWMoImBGZWNoYWAiLCJNZXMiLCAiYEtpbG9zYCIpClR5cGU8LWMoIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIikKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSkKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCiMjIyA0KSBBcGxpY2EgYWwgbWVub3MgMiB0w6ljbmljYXMgZGUgbGltcGllemEgZGUgYmFzZXMgZGUgZGF0b3MgeSBleHBsw61jYWxhcyBicmV2ZW1lbnRlLCDCv3BvciBxdcOpIHJlYWxpemFzdGUgZXNhcyB0w6ljbmljYXM/CgoqKkVsaW1pbmFyIHJlbmdsb25lcyBkZSBUb3RhbCBwb3IgbWVzKioKYGBge3J9Cm1lcm1hIDwtIG1lcm1hWy0gZ3JlcCgiVG90YWwiLCBtZXJtYSRNZXMpLF0KYGBgCgoqKkVsaW1pbmFyIGNvbHVtbmEgdmFjaWEqKgpgYGB7cn0KbWVybWEgPC0gc2VsZWN0KG1lcm1hLCAtWCkKYGBgCgoqKkNhbWJpYXIgdGlwbyBkZSBkYXRvcyoqICAKQ2FtYmlhciB2YXJpYWJsZSBraWxvcyBhIG51bWVyaWNvCmBgYHtyfQptZXJtYSRLaWxvcyA8LSBhcy5udW1lcmljKG1lcm1hJEtpbG9zKQpgYGAKCkNhbWJpYXIgdmFyaWFibGUgY2FyYWN0ZXIgYSBmZWNoYQpgYGB7cn0KbWVybWEkRmVjaGEgPC0gYXMuRGF0ZShtZXJtYSRGZWNoYSwgZm9ybWF0ID0gIiVkLyVtLyVZIikKYGBgCgoqKkFncmVnYXIgY29sdW1uYSBkZSBUb3RhbCBwb3IgbWVzKioKYGBge3J9Cm1lcm1hX3RvdGFsIDwtIGFnZ3JlZ2F0ZShLaWxvcyB+IE1lcywgZGF0YSA9IG1lcm1hLCBzdW0pCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjM0E1RkNEIj4gKipTY3JhcCoqIDwvc3Bhbj4KCiMjIyAxKSDCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1YW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3M/CmBgYHtyfQpkZXNjcmliZShzY3JhcCkKZGltKHNjcmFwKQpgYGAKCiMjIyAyKSBDbGFzaWZpY2EgY2FkYSB2YXJpYWJsZSBlbiBjdWFsaXRhdGl2YSwgY3VhbnRpdGF0aXZhIGRpc2NyZXRhIG8gY3VhbnRpdGF0aXZhIGNvbnRpbnVhCiMjIyAzKSBFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuCgpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSBUUlVFfQpWYXJpYWJsZTwtYygiYFJlZmVyZW5jaWFgIiwiYEZlY2hhYCIsICJgSG9yYWAiLCJgUHJvZHVjdG9gIiwgImBDYW50aWRhZGAiLCAiYFVuaWRhZCBkZSBtZWRpZGFkYCIsICJgVWJpY2FjacOzbiBkZSBvcmlnZW5gIiwgImBVYmljYWN1w7NuIGRlIGRlc2VjaG9gIiwgImBFc3RhZG9gIikKVHlwZTwtYygiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbGl0YXRpdmEiLCJDdWFudGl0YXRpdmEgKGRpc2NyZXRhKSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIgICkKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSkKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCiMjIyA0KSBBcGxpY2EgYWwgbWVub3MgMiB0w6ljbmljYXMgZGUgbGltcGllemEgZGUgYmFzZXMgZGUgZGF0b3MgeSBleHBsw61jYWxhcyBicmV2ZW1lbnRlLCDCv3BvciBxdcOpIHJlYWxpemFzdGUgZXNhcyB0w6ljbmljYXM/CgoqKkVsaW1pbmFyIHJlbmdsb24gZGUgbWVzIHkgdG90YWwqKgpgYGB7cn0Kc2NyYXAgPC0gc2NyYXBbLSBncmVwKCJhZ29zdG8iLCBzY3JhcCRSZWZlcmVuY2lhKSxdCmBgYAoKKipFbGltaW5hciBjb2x1bW5hcyoqCmBgYHtyfQpzY3JhcCA8LSBzZWxlY3Qoc2NyYXAsIC1VbmlkYWQuZGUubWVkaWRhKQpzY3JhcCA8LSBzZWxlY3Qoc2NyYXAsIC1Fc3RhZG8pCmBgYAoKKipDYW1iaWFyIHRpcG8gZGUgZGF0byoqICAKQ2FtYmlhciB2YXJpYWJsZSBjYXJhY3RlciBhIGZlY2hhCmBgYHtyfQptZXJtYSRGZWNoYSA8LSBhcy5EYXRlKG1lcm1hJEZlY2hhLCBmb3JtYXQgPSAiJWQvJW0vJVkiKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogIzNBNUZDRCI+ICoqUHJvZHVjY2lvbiBkZSBDYXJ0b24qKiA8L3NwYW4+CgojIyMgMSkgwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdWFudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPwpgYGB7cn0KZGVzY3JpYmUocGNhcnRvbikKZGltKHBjYXJ0b24pCmBgYAoKIyMjIDIpIENsYXNpZmljYSBjYWRhIHZhcmlhYmxlIGVuIGN1YWxpdGF0aXZhLCBjdWFudGl0YXRpdmEgZGlzY3JldGEgbyBjdWFudGl0YXRpdmEgY29udGludWEKIyMjIDMpIEVsaWdlIGxhIGVzY2FsYSBkZSBtZWRpY2nDs24gZGUgY2FkYSB2YXJpYWJsZS4KCmBgYHtyIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9IFRSVUV9ClZhcmlhYmxlPC1jKCJgQ2xpZW50ZWAiLCJgSUQgRm9ybWAiLCAiYFByb2R1Y3RvYCIsImBQaWV6YXMgcHJvZ3JhbWFkYXNgIiwgImBUaWVtcG8gbWludXRvc2AiLCAiYEhvcmEgZmluYCIsICJgRXN0YWNpb24gYXJyYW5xdWVgIiwgImBMYW1pbmFzIHByb2Nlc2FkYXNgIiwgImBJbmljaW8gc2V0IHVwYCIsICJgRmluIGluaWNpbyBzZXQgdXBgIiwgImBJbmljaW8gZGUgcHJvY2Vzb2AiLCAiYEZpbiBkZSBwcm9jZXNvYCIsICJgVGllbXBvIGNhbGlkYWRgIikKVHlwZTwtYygiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgIkN1YWxpdGF0aXZhIChub21pbmFsKSIsIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIiwgIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIiwgIkN1YW50aXRhdGl2YSAoY29udGludWEpIiwgIkN1YWxpdGF0aXZhIChub21pbmFsKSIsICJDdWFudGl0YXRpdmEiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiICkKCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFR5cGUpCmtuaXRyOjprYWJsZSh0YWJsZSkKYGBgCgojIyMgNCkgQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPwoKKipFbGltaW5hIGNvbHVtbmFzKiogIAoKRWxpbWluYXIgY29sdW1uYSBOby4gZGUgY2xpZW50ZQpgYGB7cn0KcGNhcnRvbiA8LSBzZWxlY3QocGNhcnRvbiwgLVgpCmBgYAoKRWxpbWluYXIgY29sdW1uYSB0aXBvIGRlIG1ldGVyaWFsZXMKYGBge3J9CnBjYXJ0b24gPC0gc2VsZWN0KHBjYXJ0b24sIC1YLjEzKQpgYGAKCioqUGFzYWUgZmlsYSBhIG5vbWJyZXMgZGUgY29sdW1uYSoqCmBgYHtyfQpwY2FydG9uMiA8LSBwY2FydG9uCmNvbG5hbWVzKHBjYXJ0b24yKSA8LSBwY2FydG9uWzEsXQpjb2xuYW1lcyhwY2FydG9uMikKYGBgCgoqKkVsaW1pbmFyIHByaW1lciBmaWxhKioKYGBge3J9CnBjYXJ0b24yIDwtIHBjYXJ0b24yWy0xLF0KYGBgCgoKIyMgQW7DoWxpc2lzIGVzdGFkw61zdGljbyBkZXNjcmlwdGl2bwpSZWFsaXphciB1biBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlc2NyaXB0aXZvIGVuIGVsIHF1ZSBsb2dyZXMgZGVzdGFjYXIgZWwgY29uanVudG8gZGUgZGF0b3MsIHF1ZSBhcG95YW4gYSBsYSBlbXByZXNhIGEgbWVqb3JhciBzdSBvcGVyYWNpw7NuLiAKKkluY29ycG9yYSBhbCBtZW5vcyBkb3MgcHJvcHVlc3RhcyBjb25jcmV0YXMsIGFwb3lhZGFzIGRlIHR1IGFuw6FsaXNpcyBlbiBkb25kZSBzZSBpbmNsdXllIGFsIG1lbm9zOiAoMSkgVGFibGEgZGUgZnJlY3VlbmNpYSwgKG9wY2lvbmFsKSBUYWJsYXMgY3J1emFkYXMsICgyLTMpIEdyw6FmaWNvcyBkZSBkYXRvcyBjdWFsaXRhdGl2b3MgeSBjdWFudGl0YXRpdm9zLCBhc8OtIGNvbW8gKDItMykgR3LDoWZpY29zIGRlIGRpc3BlcnNpw7NuLioKCiMjIyBUYWJsYSBkZSBmcmVjdWVuY2lhICAgCkxhICp0YWJsYSBkZSBmcmVjdWVuY2lhKiBtdWVzdHJhIGVsIG51bWVybyBkZSB2ZWNlcyBxdWUgc2UgcmVwaXRlIHVuYSB2YXJpYWJsZQoKKipzY3JhcCoqCmBgYHtyfQp1YmljYWNpb24gPC0gc2NyYXAgJT4lIGdyb3VwX2J5KFViaWNhY2nDs24uZGUub3JpZ2VuKSAlPiUgdGFsbHkoKQp1YmljYWNpb24KYGBgCgoqKm1lcm1hKioKYGBge3J9Cm1lcyA8LSBtZXJtYSAlPiUgZ3JvdXBfYnkoTWVzKSAlPiUgdGFsbHkoKQptZXMKYGBgCgojIyMgR3JhZmljYXMgZGUgZGF0b3MgY3VhbGl0YXRpdm9zIHkgY3VlbnRpdGF0aXZvcyAgCgoqKm1lcm1hKioKYGBge3J9CmdncGxvdChtZXJtYV90b3RhbCwgYWVzKHg9TWVzLCB5PUtpbG9zLCBmaWxsPUtpbG9zKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiApKyAKICBsYWJzKHRpdGxlID0gIktpbG9zIHBvciBNZXMiLCAKICAgICAgIHggPSAiTWVzIiwgeSA9ICJLaWxvcyIpCmBgYAoKRW4gZXN0YSBncmFmaWNhIHBvZGVtb3Mgb2JzZXJ2YXIgbG9zIGtpbG9zIGRlIG1lcm1hIHByb2R1Y2lkbyBwb3IgbWVzLiBFbCBtZXMgcXVlIGdlbmVyYSBtYXlvciBjYW50aWRhZCBkZSBtZXJtYSBlcyBlbCBtZXMgZGUgKiphZ29zdG8qKiBjb24gKiozMCwwMDAqKiBraWxvcyBkZSBtZXJtYSwgbWllbnRyYXMgcXVlIGVsIG1lcyBkZSAqKnNlcHRpZW1icmUqKiBlcyBlbCBxdWUgbWVub3MgZ2VuZXJhIG1lcm1hIGNvbiAqKjE1LDAwMCoqIGtpbG9zIGRlIG1lcm1hLgoKCioqc3JhcCoqCmBgYHtyfQpnZ3Bsb3Qoc2NyYXAsIGFlcyh4PVViaWNhY2nDs24uZGUub3JpZ2VuLCB5PUNhbnRpZGFkKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0ic2t5Ymx1ZSIpICsgc2NhbGVfZmlsbF9ncmV5KCkgKyAKICBsYWJzKHRpdGxlID0gIkNhbnRpZGFkIHBvciBVYmljYWNpb24iLCAKICAgICAgIHggPSAiQ2FudGlkYWQiLCB5ID0gIlViaWNhY2nDs24iKQpgYGAKCkVuIGVzdGEgZ3JhZmljYSBwb2RlbW9zIG9ic2VydmFyIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyB5L28gbWF0ZXJpYWxlcyBxdWUgc2UgcmVxdWllcmVuIHBhcmEgY2FkYSBlc3RhY2lvbiBkZSB0cmFiYWpvLiBMYSBlc3RhY2lvbiBxdWUgcmVxdWllcmUgbWF5b3IgdXNvIGRlIG1hdGVyaWFsZXMgZXMgbGEgKipQcmUtcHJvZHVjY2lvbioqLgoKIyMjIEdyYWZpY29zIGRlIGRpc3BlcmNpb24KCioqbWVybWEqKgpgYGB7cn0KZ2dwbG90KG1lcm1hX3RvdGFsICwgYWVzKHg9TWVzLCB5PUtpbG9zKSkgKyAKICAgIGdlb21fcG9pbnQoKSsgCiAgbGFicyh0aXRsZSA9ICJLaWxvcyBwb3IgTWVzIiwgCiAgICAgICB4ID0gIk1lcyIsIHkgPSAiS2lsb3MiKQpgYGAKKipPYnNlcnZhY2lvbmVzOioqICAKLSAqKkFnb3N0byB5IE1heW8qKiBzb24gbG9zIG1lc2VzIHF1ZSBtYXMgcHJvZHVjZW4gbWVybWEuICAKLSAqKkVuZXJvIHkgU2VwdGllbWJyZSoqIHNvbiBsb3MgbWVzZXMgcXVlIHByb2R1Y2VuIG1lbm9zIG1lcm1hLiAgCgpBbCB2aXN1YWxpemFyIGVzdG9zIGRhdG9zIHBvZHJpYW1vcyBpbmZlcmlyIHF1ZSBlbiBsb3MgbWVzZXMgZG9uZGUgaGF5IG1heW9yIG51bWVybyBkZSBtZXJtYSBzb24gbG9zIG1lc2VzIGNvbiBtYXlvciBwcm9kdWNjaW9uLiBNaWVudHJhcyBxdWUgZW4gbG9zIG1lc2VzIGNvbiBtZW5vcyBudW1lcm8gZGUgbWVybWEgc29uIGxvcyBtZXNlcyBjb24gbWVub3MgcHJvZHVjY2lvbi4KCioqc2NyYXAqKgpgYGB7cn0KZ2dwbG90KHNjcmFwICwgYWVzKHg9Q2FudGlkYWQsIHk9VWJpY2FjacOzbi5kZS5vcmlnZW4pKSArIAogICAgZ2VvbV9ib3hwbG90KCkrIAogIGxhYnModGl0bGUgPSAiQ2FudGlkYWQgcG9yIEVzdGFjacOzbiIsIAogICAgICAgeCA9ICJDYW50aWRhZCIsIHkgPSAiVWJpY2FjacOzbiIpCmBgYAoKRW4gbGEgZ3JhZmljYSBkZSBkaXNwZXJjaW9uIGRlIHNjcmFwIHBvZGVtb3Mgb2JzZXJ2YXIgY29uIG1heW9yIGNsYXJpZGFkIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyB5L28gbWF0ZXJpYWxlcyBxdWUgc2UgbmVjZXNpdGFuIHBhcmEgY2FkYSBhcmVhIGRlIHRyYWJham8uICAgCkVuIHN1IG1heW9yaWEgbGFzIHRyZXMgYXJlYXMgZGUgdHJhYmFqbyB1dGlsaXphbiBlbnRyZSAwIHkgMjUgcHJvZHVjdG9zIHkvbyBtYXRlcmlhYmxlcywgc2luIGVtYmFyZ28sIGVuIG9jYWNpb25lcyBQcmUtcHJvZHVjY2lvbiBvY3VwYSBtYXlvciBjYW50aWRhZCBkZSBwcm9kdWN0b3MgeS9vIG1hdGVyaWFibGVzLgoKKipwcm9kdWNjaW9uIGRlIGNhcnRvbioqCmBgYHtyfQpnZ3Bsb3QocGNhcnRvbjIsIGFlcyh4PWBQSUVaQVMgUFJPRy5gLCB5PUNMSUVOVEUpKSArIAogICAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyh0aXRsZSA9ICJQaWV6YXMgcHJvZ3JhbWFkYXMgcG9yIGNsaWVudGUiLCAKICAgICAgIHggPSAiUGllemFzIFByb2dyYW1hZGFzIiwgeSA9ICJDbGllbnRlIikKYGBgCgpFbiBsYSBncmFmaWNhIGRlIGRpc3BlcmNpb24gZGUgcHJvZHVjY2lvbiBkZSBjYXJ0b24gcG9kZW1vcyBvYnNlcnZhciBjdWFsZXMgc29uIGxvcyBjbGllbnRlcyBxdWUgcGlkZW4gbWF5b3IgZGVtYW5kYSBkZSBwaWV6YXMsIGxvcyBjdWFsZXMgc29uOiAgCi0gTWVyaWRpYW4gTGlnaHR3ZWlnaHQgIAotIFN0YWJpbHVzIDEgIAotIFN0YWJpbHVzIDMgIAotIFZhcnJvYyAgCi0gWWFuZmVuZyAgCgojIyBSZWZsZXhpw7NuIGRlIGxhIGFjdGl2aWRhZC4KClJlYWxpemFuZG8gbGEgcHJlcGFyYWNpw7NuIHkgYW7DoWxpc2lzIGRlIGRhdG9zIHNlIHB1ZGllcm9uIGVuY29udHJhciB2YXJpb3MgZGF0b3MgaW50ZXJlc2FudGVzIGNvbW86ICAKCi0gQWdvc3RvIHkgTWF5byBzb24gbG9zIG1lc2VzIHF1ZSBsYSBlbXByZXNhIHByb2R1Y2UgbWF5b3IgbsO6bWVybyBkZSBtZXJtYSwgcG9yIGxvIHF1ZSBzZSBwdWVkZSBpbmZlcmlyIHF1ZSBlc3RvcyBzb24gbG9zIG1lc2VzIGNvbiBtYXlvciBwcm9kdWNjacOzbi4KLSBFbmVybyB5IHNlcHRpZW1icmUgc29uIGxvcyBtZXNlcyBxdWUgbGEgZW1wcmVzYSBwcm9kdWNlIG1lbm9yIG7Dum1lcm8gZGUgbWVybWEsIHBvciBsbyBxdWUgc2UgcHVlZGUgaW5mZXJpciBxdWUgZXN0b3Mgc29uIGxvcyBtZXNlcyBjb24gbWVub3IgcHJvZHVjY2nDs24uCi0gUHJlLXByb2R1Y2Npw7NuIGVzIGVsIMOhcmVhIGRlIHRyYWJham8gcXVlIHJlcXVpZXJlIG1heW9yIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyB5IG1hdGVyaWFsZXMgCi0gTG9zIGNsaWVudGVzIGNvbiBtYXlvciBkZW1hbmRhIHNvbjogIE1lcmlkaWFuIExpZ2h0d2VpZ2h0LCBTdGFiaWx1cyAxLCBTdGFiaWx1cyAzLCAgWWFuZmVuZyAgeSBWYXJyb2MKCkFkaWNpb25hbCBhIGxvIGFudGVyaW9yLCBlcyBpbXBvcnRhbnRlIG1lbmNpb25hciBxdWUgcmVhbGl6YXIgbGEgbGltcGllemEgZGUgZGF0b3MgZXMgaW1wb3J0YW50ZSBwYXJhIGdlbmVyYXIgdW4gYW7DoWxpc2lzIGNvcnJlY3RvIGRlIGxhIGJhc2UgZGUgZGF0b3MuCgo=