Contexto

Arca Continental implementó un nuevo modelo de negocio. Este consiste en apoyar a los abarroteros que durante muchos años fueron sus principales aliados comerciales, les ayudaron a diferenciarse de la competencia, a automatizar su negocio, entre muchas otras cosas.

Importar archivo

df <- read.csv("/Users/ivanbazaldua/Downloads/arca.csv")

Entender la base de datos

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.3     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(janitor) 
## 
## Attaching package: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(dplyr)

#count(df, Territorio, sort=TRUE)
#count(df, Sub.Territorio, sort=TRUE)
#count(df, CEDI, sort=TRUE)
#count(df, cliente, sort=TRUE)
#count(df, Nombre, sort=TRUE)
#count(df, Tamaño.Cte.Industria, sort=TRUE)
#count(df, Segmento.Det, sort=TRUE)
#count(df, Marca, sort=TRUE)
count(df, Presentacion, sort=TRUE)
##        Presentacion     n
## 1         600 ml NR 74008
## 2      1 Ltro. N.R. 36930
## 3         2 Lts. NR 36415
## 4        500 ml Ret 35165
## 5       1.5 Lts. NR 30637
## 6       Lata 235 ml 24551
## 7         400 ml NR 22877
## 8    250 ml. NR PET 21735
## 9  500 ml NR Vidrio 18758
## 10      2.5 Lts. NR 13235
## 11             Lata 11810
## 12     200 ml Tetra 11190
## 13    500 ml NR PET 11022
## 14    1 Ltro. Tetra 10580
## 15    235 ml NR Vid 10476
## 16    12 Oz. NR Pet  9906
## 17     1.5 Lts. Ret  8398
## 18    413 ml NR VId  8292
## 19      Lata 16 Oz.  7792
## 20       12 Oz. Ret  7373
## 21 2.5 Lts. Ret Pet  7161
## 22     250 ml Tetra  6121
## 23     1.250 Lts NR  4741
## 24   300 ML. NR PET  4356
## 25         8 Oz. NR  3876
## 26     1.750 Lts NR  3687
## 27    237 ml NR Pet  3611
## 28   250 ML. NR VID  3184
## 29  946 ml NR Tetra  3183
## 30       2 Lts. Ret  2501
## 31        5 Lts. NR  2253
## 32      1 Ltro Ret.  2111
## 33      Lata 450 ml  1505
## 34      Lata 453 ml  1269
## 35  125 ml NR Tetra  1093
## 36    355 Ml NR Pet   670
## 37      Lata 335 ml   586
## 38      6.5 Oz. Ret   573
## 39      Lata 340 ml   563
## 40      Lata 222 ml   499
## 41        473 ml NR   320
## 42  100 ml NR Tetra   285
## 43    237 ml NR Vid   238
## 44       Lata 8 OZ.   230
## 45 12 Oz. NR Vidrio   195
## 46        710 ml NR   172
## 47      LATA 680 ML   151
## 48        3 Lts. NR   145
## 49  750 ml NR Tetra    32
## 50    350 ML NR PET    16
## 51      Lata 237 ml    13
## 52       Bag In Box     6
## 53   Sobres 907 grs     6
## 54    251ml NR Alum     3
## 55        200 ml NR     2
## 56      Lata 310 ml     1
## 57     Presentacion     1
count(df, Tamaño, sort=TRUE)
##       Tamaño      n
## 1 Individual 328513
## 2   Familiar 137995
## 3     Tamaño      1
count(df, Retornable_NR, sort=TRUE)
##   Retornable_NR      n
## 1 No Retornable 403226
## 2    Retornable  63282
## 3 Retornable_NR      1
resumen <- summary(df)
resumen
##        ID              Año        Territorio        Sub.Territorio    
##  Min.   :     1   Min.   :2016   Length:466509      Length:466509     
##  1st Qu.:116628   1st Qu.:2017   Class :character   Class :character  
##  Median :233255   Median :2018   Mode  :character   Mode  :character  
##  Mean   :233255   Mean   :2018                                        
##  3rd Qu.:349882   3rd Qu.:2019                                        
##  Max.   :466509   Max.   :2019                                        
##      CEDI             Cliente             Nombre          Tamaño.Cte.Industria
##  Length:466509      Length:466509      Length:466509      Length:466509       
##  Class :character   Class :character   Class :character   Class :character    
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character    
##                                                                               
##                                                                               
##                                                                               
##  Segmento.Det          Marca           Presentacion          Tamaño         
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Retornable_NR         Enero             Febrero             Marzo          
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     Abril               Mayo              Junio              Julio          
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     Agosto           Septiembre          Octubre           Noviembre        
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##   Diciembre        
##  Length:466509     
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
str(df)
## 'data.frame':    466509 obs. of  25 variables:
##  $ ID                  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Año                 : int  2016 2016 2016 2016 2016 2016 2016 2016 2016 2016 ...
##  $ Territorio          : chr  "Guadalajara" "Guadalajara" "Guadalajara" "Guadalajara" ...
##  $ Sub.Territorio      : chr  "Belenes" "Belenes" "Belenes" "Belenes" ...
##  $ CEDI                : chr  "Suc. Belenes" "Suc. Belenes" "Suc. Belenes" "Suc. Belenes" ...
##  $ Cliente             : chr  "77737" "77737" "77737" "77737" ...
##  $ Nombre              : chr  "ABARR" "ABARR" "ABARR" "ABARR" ...
##  $ Tamaño.Cte.Industria: chr  "Extra Grande" "Extra Grande" "Extra Grande" "Extra Grande" ...
##  $ Segmento.Det        : chr  "Agua Mineral" "Agua Purificada" "Agua Purificada" "Agua Saborizada" ...
##  $ Marca               : chr  "Topo Chico A.M." "Ciel Agua Purificada" "Ciel Agua Purificada" "Ciel Exprim" ...
##  $ Presentacion        : chr  "600 ml NR" "1 Ltro. N.R." "1.5 Lts. NR" "600 ml NR" ...
##  $ Tamaño              : chr  "Individual" "Individual" "Individual" "Individual" ...
##  $ Retornable_NR       : chr  "No Retornable" "No Retornable" "No Retornable" "No Retornable" ...
##  $ Enero               : chr  "" "" "" "" ...
##  $ Febrero             : chr  "" "2" "" "" ...
##  $ Marzo               : chr  "" "8" "3" "" ...
##  $ Abril               : chr  "" "4" "6" "" ...
##  $ Mayo                : chr  "" "4" "3" "" ...
##  $ Junio               : chr  "" "2" "3" "" ...
##  $ Julio               : chr  "" "2" "3" "" ...
##  $ Agosto              : chr  "" "2" "3" "" ...
##  $ Septiembre          : chr  "" "2" "3" "" ...
##  $ Octubre             : chr  "" "2" "3" "" ...
##  $ Noviembre           : chr  "" "4" "3" "" ...
##  $ Diciembre           : chr  "1" "2" "3" "1" ...

Después de analizar la tabla de datos: 1. Las columnas de meses (Enero - Diciembre) tienen formato incorrecto. Debería estar en int (entero) 2. Quitar el renglón repetido 184065 que cuenta los subtítulos

#Limpieza de datos

##Eliminar renglón

df <- df[-184065,]

##Cambiar variables

#Hacer un ciclo For para no tener que copiar y pegar cada variable para cambiarla.

for (mes in c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")) {
  df[[mes]] <- as.integer(df[[mes]])
}
## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion

## Warning: NAs introduced by coercion
df$Año <- as.character(df$Año)

Reemplazar NA’s

# ¿Cuántos NA tengo en la base de datos?
sum(is.na(df))
## [1] 3149791
sapply(df, function(x) sum(is.na(x)))
##                   ID                  Año           Territorio 
##                    0                    0                    0 
##       Sub.Territorio                 CEDI              Cliente 
##                    0                    0                    0 
##               Nombre Tamaño.Cte.Industria         Segmento.Det 
##                    0                    0                    0 
##                Marca         Presentacion               Tamaño 
##                    0                    0                    0 
##        Retornable_NR                Enero              Febrero 
##                    0               233551               231285 
##                Marzo                Abril                 Mayo 
##               227506               224185               217072 
##                Junio                Julio               Agosto 
##               215907               223537               220366 
##           Septiembre              Octubre            Noviembre 
##               337401               338482               338545 
##            Diciembre 
##               341954
#Reemplazar NA con ceros
df[is.na(df)] <- 0

Agregar columna de ventas

df$Ventas <- df$Enero + df$Febrero + df$Marzo + df$Abril + df$Mayo + df$Junio + df$Julio + df$Agosto + df$Septiembre + df$Octubre + df$Noviembre + df$Diciembre

#Gráfica de caja y bigotes
boxplot(df$Enero, horizontal=TRUE)

summary(df)
##        ID             Año             Territorio        Sub.Territorio    
##  Min.   :     1   Length:466508      Length:466508      Length:466508     
##  1st Qu.:116628   Class :character   Class :character   Class :character  
##  Median :233256   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :233255                                                           
##  3rd Qu.:349882                                                           
##  Max.   :466509                                                           
##      CEDI             Cliente             Nombre          Tamaño.Cte.Industria
##  Length:466508      Length:466508      Length:466508      Length:466508       
##  Class :character   Class :character   Class :character   Class :character    
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character    
##                                                                               
##                                                                               
##                                                                               
##  Segmento.Det          Marca           Presentacion          Tamaño         
##  Length:466508      Length:466508      Length:466508      Length:466508     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Retornable_NR          Enero           Febrero            Marzo        
##  Length:466508      Min.   :-19.00   Min.   :-11.000   Min.   :-32.000  
##  Class :character   1st Qu.:  0.00   1st Qu.:  0.000   1st Qu.:  0.000  
##  Mode  :character   Median :  0.00   Median :  0.000   Median :  0.000  
##                     Mean   :  4.69   Mean   :  4.581   Mean   :  5.401  
##                     3rd Qu.:  2.00   3rd Qu.:  2.000   3rd Qu.:  3.000  
##                     Max.   :999.00   Max.   :986.000   Max.   :986.000  
##      Abril              Mayo              Junio            Julio        
##  Min.   :-70.000   Min.   :-106.000   Min.   :-211.0   Min.   :-60.000  
##  1st Qu.:  0.000   1st Qu.:   0.000   1st Qu.:   0.0   1st Qu.:  0.000  
##  Median :  0.000   Median :   0.000   Median :   0.0   Median :  0.000  
##  Mean   :  5.519   Mean   :   6.117   Mean   :   5.9   Mean   :  5.583  
##  3rd Qu.:  3.000   3rd Qu.:   3.000   3rd Qu.:   3.0   3rd Qu.:  3.000  
##  Max.   :993.000   Max.   : 991.000   Max.   : 998.0   Max.   :993.000  
##      Agosto           Septiembre          Octubre          Noviembre      
##  Min.   :-211.000   Min.   :-527.000   Min.   :-38.000   Min.   :-25.000  
##  1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:  0.000   1st Qu.:  0.000  
##  Median :   0.000   Median :   0.000   Median :  0.000   Median :  0.000  
##  Mean   :   5.777   Mean   :   3.311   Mean   :  3.327   Mean   :  3.248  
##  3rd Qu.:   3.000   3rd Qu.:   1.000   3rd Qu.:  1.000   3rd Qu.:  1.000  
##  Max.   : 999.000   Max.   : 993.000   Max.   :998.000   Max.   :991.000  
##    Diciembre           Ventas       
##  Min.   :-28.000   Min.   :-527.00  
##  1st Qu.:  0.000   1st Qu.:   2.00  
##  Median :  0.000   Median :   7.00  
##  Mean   :  3.477   Mean   :  56.93  
##  3rd Qu.:  0.000   3rd Qu.:  26.00  
##  Max.   :997.000   Max.   :9517.00

Preguntas

Pregunta 1

¿Puede observarse un crecimiento en las ventas de algunos de los segmentos de productos de la familia Coca Cola en las tiendas en las que se implementó el Proyecto Siglo XXI de Arca Continental? Respuesta: Se observa un incremento general de las ventas por año

library(ggplot2)
ggplot(df, aes(x=Año, y=Ventas)) + 
  geom_bar(stat="identity") +
  labs(
    title= "Ventas por año",
    subtitle= "Caso Arca Continental"
  )

valores_unicos <- unique(df$Marca)

# Contar cuántas marcas diferentes hay
length(valores_unicos)
## [1] 55

Pregunta 2

¿El incremento en las ventas es similar entre los diferentes tamaños de clientes? Respuesta: El incremento de ventas se debió a la incorporación de tamaño de cliente Grande y Pequeño, Extra Grande bajó sus ventas el último año, y Micro las subió.

ggplot(df, aes(x=Año, y=Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") + 
  labs(
    title= "Ventas por año",
    subtitle = "Caso Arca Continental"
  )

df2 <- df %>% filter(Tamaño.Cte.Industria=="Extra Grande")

ggplot(df2, aes(x=Año, y=Ventas, colour= Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") + 
  labs(
    title= "Ventas por año",
    subtitle  = "Caso Arca Continental"
    )

df3 <- df %>% filter(Tamaño.Cte.Industria=="Grande")

ggplot(df3, aes(x=Año, y=Ventas, colour= Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") + 
  labs(
    title= "Ventas por año",
    subtitle  = "Caso Arca Continental"
    )

df4 <- df %>% filter(Tamaño.Cte.Industria=="Micro")

ggplot(df4, aes(x=Año, y=Ventas, colour= Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") + 
  labs(
    title= "Ventas por año",
    subtitle  = "Caso Arca Continental"
    )

df5 <- df %>% filter(Tamaño.Cte.Industria=="Pequeño")

ggplot(df5, aes(x=Año, y=Ventas, colour= Tamaño.Cte.Industria)) +
  geom_bar(stat = "identity") + 
  labs(
    title= "Ventas por año",
    subtitle  = "Caso Arca Continental"
  )

Pregunta 3

¿Cuál es el comportamiento observado de las unidades vendidas por mes de cada una de las marcas, independientemente de sus respectivas presentaciones? Respuesta: El incremento de ventas se debió a la incorporación de tamaño de cliente Grande Y Pequeño.

df6 <- df %>% filter(Marca== "Coca-Cola")

ggplot(df6, aes(x=Año, y=Ventas, colour=Tamaño.Cte.Industria))+
  geom_bar(stat="identity")+
  labs(
    title= "Ventas por Año de Coca Cola",
    subtitle = "Caso Arca Continental"
  )

df6 <- df %>% filter(Marca== "Sprite")

ggplot(df6, aes(x=Año, y=Ventas, colour=Tamaño.Cte.Industria))+
  geom_bar(stat="identity")+
  labs(
    title= "Ventas por Año de Sprite",
    subtitle = "Caso Arca Continental"
  )

Pregunta 4

¿Se ha incrementado la venta de productos en envases retornables en los últimos dos años? Respuesta: El valor de compras de envases retornables se dúplico en el úitimo año

#Hay que corregir esto, contaste cuantas veces aparece la palabra retornable, no sus ventas. Update: Ya lo corregí.

Retornable <- df %>% filter(df$Retornable_NR == "Retornable")

ggplot(Retornable, aes(x=Año, y=Ventas)) +
  geom_bar(stat = "identity", fill="red") + 
  labs(
    title= "Compras de envases retornables por año",
    subtitle = "Caso Arca Continental"
  )

Pregunta 5

¿El comportamiento de la venta de agua ha incrementado en relación al de los refrescos o las bebidas isotónicas?

Respuesta: El consumo de refrescos se ha mantenido regular durante los años, en 2018 aumentó un porcentaje de sus ventas y el comportamiento fue seguido por las ventas de aguas. Sin emabrgo en 2019 las ventas tuvieron un retroceso, mientras que las isotónicas aumentaron.

#Que esta pasando aquí? Por qué las líneas me salen rectas? Tendré que hacer un cálculo manual?

dfagua <- df %>% filter(Segmento.Det %in% c("Agua Purificada", "Isotónicos Regular", "Colas Regular"))

ggplot(dfagua,aes(x=Año,y=Ventas,fill=Segmento.Det)) +
  geom_bar(position="dodge", stat="identity")+
  labs(
    title= "Ventas por año",
    subtitle = "Caso Arca Continental"
  )

Pregunta 6

¿Puede decirse que la venta mensual de agua está relacionada con la venta mensual de refrescos en los últimos 4 años?

Respuesta: La venta de agua y refresco no esta relacionada

dfcocas <- df %>% filter(Segmento.Det %in% c("Agua Purificada", "Colas Regular"))

ggplot(dfcocas,aes(x=Año,y=Ventas,fill=Segmento.Det)) +
  geom_bar(position="dodge", stat="identity")+
  labs(
    title= "Ventas por año",
    subtitle = "Caso Arca Continental"
  )

Pregunta 7

¿A cuánto ascienden las ventas esperadas para el 2020 en la Coca Cola de 500 ml NR Vidrio? Respuesta: Las ventas ascienden hasta $444,065, por lo que podemos concluir que la propuesta de arca va por muy buen camino

df11 <- df %>% filter(Marca=="Coca-Cola" & Presentacion=="500 ml NR Vidrio")

df12 <- aggregate(Ventas ~ Año, df11, sum)

df12$Año <- as.integer(df12$Año)
regresion <-lm(Ventas ~ Año, data=df12)
summary(regresion)
## 
## Call:
## lm(formula = Ventas ~ Año, data = df12)
## 
## Residuals:
##        1        2        3        4 
## -23838.5  35316.5    882.5 -12360.5 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)
## (Intercept) -54970594   28310425  -1.942    0.192
## Año             27433      14032   1.955    0.190
## 
## Residual standard error: 31380 on 2 degrees of freedom
## Multiple R-squared:  0.6565, Adjusted R-squared:  0.4847 
## F-statistic: 3.822 on 1 and 2 DF,  p-value: 0.1898
#Ecuación de la recta y=-54,970,595 + 27,433*Año
datos <- data.frame(Año=2020)
predict(regresion,datos)
##        1 
## 444065.5
LS0tCnRpdGxlOiAiUHJveWVjdG8gU2lnbG8gWFhJIEFyY2EgQ29udGluZW50YWwiCmF1dGhvcjogIkl2w6FuIEJhemFsZMO6YSBBMDA4MzcxMTUiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDogCiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgdG9jX2NvbGxhcHNpYmxlOiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogImx1bWVuIgogICAgaGlnaGxpZ2h0OiAibW9ub2Nocm9tZSIKZGF0ZTogIjIwMjMtMDktMTMiCi0tLQohW10oL1VzZXJzL2l2YW5iYXphbGR1YS9Eb3dubG9hZHMvd3VULmdpZikKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Db250ZXh0bzwvc3Bhbj4gCgpBcmNhIENvbnRpbmVudGFsIGltcGxlbWVudMOzIHVuIG51ZXZvIG1vZGVsbyBkZSBuZWdvY2lvLiBFc3RlIGNvbnNpc3RlIGVuIGFwb3lhciBhIGxvcyBhYmFycm90ZXJvcyBxdWUgZHVyYW50ZSBtdWNob3MgYcOxb3MgZnVlcm9uCnN1cyBwcmluY2lwYWxlcyBhbGlhZG9zIGNvbWVyY2lhbGVzLCBsZXMgYXl1ZGFyb24gYSBkaWZlcmVuY2lhcnNlIGRlIGxhIGNvbXBldGVuY2lhLCBhIGF1dG9tYXRpemFyIHN1IG5lZ29jaW8sIAplbnRyZSBtdWNoYXMgb3RyYXMgY29zYXMuCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SW1wb3J0YXIgYXJjaGl2bzwvc3Bhbj4gCmBgYHtyfQpkZiA8LSByZWFkLmNzdigiL1VzZXJzL2l2YW5iYXphbGR1YS9Eb3dubG9hZHMvYXJjYS5jc3YiKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5FbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zPC9zcGFuPiAgCmBgYHtyfQoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoamFuaXRvcikgCmxpYnJhcnkoZHBseXIpCgojY291bnQoZGYsIFRlcnJpdG9yaW8sIHNvcnQ9VFJVRSkKI2NvdW50KGRmLCBTdWIuVGVycml0b3Jpbywgc29ydD1UUlVFKQojY291bnQoZGYsIENFREksIHNvcnQ9VFJVRSkKI2NvdW50KGRmLCBjbGllbnRlLCBzb3J0PVRSVUUpCiNjb3VudChkZiwgTm9tYnJlLCBzb3J0PVRSVUUpCiNjb3VudChkZiwgVGFtYcOxby5DdGUuSW5kdXN0cmlhLCBzb3J0PVRSVUUpCiNjb3VudChkZiwgU2VnbWVudG8uRGV0LCBzb3J0PVRSVUUpCiNjb3VudChkZiwgTWFyY2EsIHNvcnQ9VFJVRSkKY291bnQoZGYsIFByZXNlbnRhY2lvbiwgc29ydD1UUlVFKQpjb3VudChkZiwgVGFtYcOxbywgc29ydD1UUlVFKQpjb3VudChkZiwgUmV0b3JuYWJsZV9OUiwgc29ydD1UUlVFKQoKcmVzdW1lbiA8LSBzdW1tYXJ5KGRmKQpyZXN1bWVuCgpzdHIoZGYpCgpgYGAKRGVzcHXDqXMgZGUgYW5hbGl6YXIgbGEgdGFibGEgZGUgZGF0b3M6CjEuIExhcyBjb2x1bW5hcyBkZSBtZXNlcyAoRW5lcm8gLSBEaWNpZW1icmUpIHRpZW5lbiBmb3JtYXRvIGluY29ycmVjdG8uIERlYmVyw61hIGVzdGFyIGVuIGludCAoZW50ZXJvKQoyLiBRdWl0YXIgZWwgcmVuZ2zDs24gcmVwZXRpZG8gMTg0MDY1IHF1ZSBjdWVudGEgbG9zIHN1YnTDrXR1bG9zCgojPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5MaW1waWV6YSBkZSBkYXRvczwvc3Bhbj4gCgojI0VsaW1pbmFyIHJlbmdsw7NuCmBgYHtyfQpkZiA8LSBkZlstMTg0MDY1LF0KYGBgCgoKIyNDYW1iaWFyIHZhcmlhYmxlcwoKYGBge3J9CgojSGFjZXIgdW4gY2ljbG8gRm9yIHBhcmEgbm8gdGVuZXIgcXVlIGNvcGlhciB5IHBlZ2FyIGNhZGEgdmFyaWFibGUgcGFyYSBjYW1iaWFybGEuCgpmb3IgKG1lcyBpbiBjKCJFbmVybyIsICJGZWJyZXJvIiwgIk1hcnpvIiwgIkFicmlsIiwgIk1heW8iLCAiSnVuaW8iLCAiSnVsaW8iLCAiQWdvc3RvIiwgIlNlcHRpZW1icmUiLCAiT2N0dWJyZSIsICJOb3ZpZW1icmUiLCAiRGljaWVtYnJlIikpIHsKICBkZltbbWVzXV0gPC0gYXMuaW50ZWdlcihkZltbbWVzXV0pCn0KCmRmJEHDsW8gPC0gYXMuY2hhcmFjdGVyKGRmJEHDsW8pCmBgYAojIyBSZWVtcGxhemFyIE5BJ3MKCmBgYHtyfQojIMK/Q3XDoW50b3MgTkEgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8Kc3VtKGlzLm5hKGRmKSkKCnNhcHBseShkZiwgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKCiNSZWVtcGxhemFyIE5BIGNvbiBjZXJvcwpkZltpcy5uYShkZildIDwtIDAKYGBgCiMjIEFncmVnYXIgY29sdW1uYSBkZSB2ZW50YXMKCmBgYHtyfQpkZiRWZW50YXMgPC0gZGYkRW5lcm8gKyBkZiRGZWJyZXJvICsgZGYkTWFyem8gKyBkZiRBYnJpbCArIGRmJE1heW8gKyBkZiRKdW5pbyArIGRmJEp1bGlvICsgZGYkQWdvc3RvICsgZGYkU2VwdGllbWJyZSArIGRmJE9jdHVicmUgKyBkZiROb3ZpZW1icmUgKyBkZiREaWNpZW1icmUKCiNHcsOhZmljYSBkZSBjYWphIHkgYmlnb3Rlcwpib3hwbG90KGRmJEVuZXJvLCBob3Jpem9udGFsPVRSVUUpCnN1bW1hcnkoZGYpCmBgYAoKCgoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlByZWd1bnRhczwvc3Bhbj4gCgojIyBQcmVndW50YSAxCsK/UHVlZGUgb2JzZXJ2YXJzZSB1biBjcmVjaW1pZW50byBlbiBsYXMgdmVudGFzIGRlIGFsZ3Vub3MgZGUgbG9zIHNlZ21lbnRvcyBkZSBwcm9kdWN0b3MgZGUgbGEgZmFtaWxpYSBDb2NhIENvbGEgZW4gbGFzIHRpZW5kYXMgZW4gbGFzIHF1ZSBzZSBpbXBsZW1lbnTDsyBlbCBQcm95ZWN0byBTaWdsbyBYWEkgZGUgQXJjYSBDb250aW5lbnRhbD8KKipSZXNwdWVzdGE6IFNlIG9ic2VydmEgdW4gaW5jcmVtZW50byBnZW5lcmFsIGRlIGxhcyB2ZW50YXMgcG9yIGHDsW8qKgoKYGBge3J9CgpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdChkZiwgYWVzKHg9QcOxbywgeT1WZW50YXMpKSArIAogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnMoCiAgICB0aXRsZT0gIlZlbnRhcyBwb3IgYcOxbyIsCiAgICBzdWJ0aXRsZT0gIkNhc28gQXJjYSBDb250aW5lbnRhbCIKICApCgpgYGAKCmBgYHtyfQoKdmFsb3Jlc191bmljb3MgPC0gdW5pcXVlKGRmJE1hcmNhKQoKIyBDb250YXIgY3XDoW50YXMgbWFyY2FzIGRpZmVyZW50ZXMgaGF5Cmxlbmd0aCh2YWxvcmVzX3VuaWNvcykKCmBgYAoKIyMgUHJlZ3VudGEgMiAKwr9FbCBpbmNyZW1lbnRvIGVuIGxhcyB2ZW50YXMgZXMgc2ltaWxhciBlbnRyZSBsb3MgZGlmZXJlbnRlcyB0YW1hw7FvcyBkZSBjbGllbnRlcz8KKipSZXNwdWVzdGE6IEVsIGluY3JlbWVudG8gZGUgdmVudGFzIHNlIGRlYmnDsyBhIGxhIGluY29ycG9yYWNpw7NuIGRlIHRhbWHDsW8gZGUgY2xpZW50ZSBHcmFuZGUgeSBQZXF1ZcOxbywgRXh0cmEgR3JhbmRlIGJhasOzIHN1cyB2ZW50YXMgZWwgw7psdGltbyBhw7FvLCB5IE1pY3JvIGxhcyBzdWJpw7MuKioKCmBgYHtyfQpnZ3Bsb3QoZGYsIGFlcyh4PUHDsW8sIHk9VmVudGFzLCBjb2xvdXI9VGFtYcOxby5DdGUuSW5kdXN0cmlhKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIAogIGxhYnMoCiAgICB0aXRsZT0gIlZlbnRhcyBwb3IgYcOxbyIsCiAgICBzdWJ0aXRsZSA9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCiAgKQoKZGYyIDwtIGRmICU+JSBmaWx0ZXIoVGFtYcOxby5DdGUuSW5kdXN0cmlhPT0iRXh0cmEgR3JhbmRlIikKCmdncGxvdChkZjIsIGFlcyh4PUHDsW8sIHk9VmVudGFzLCBjb2xvdXI9IFRhbWHDsW8uQ3RlLkluZHVzdHJpYSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyAKICBsYWJzKAogICAgdGl0bGU9ICJWZW50YXMgcG9yIGHDsW8iLAogICAgc3VidGl0bGUgID0gIkNhc28gQXJjYSBDb250aW5lbnRhbCIKICAgICkKCmRmMyA8LSBkZiAlPiUgZmlsdGVyKFRhbWHDsW8uQ3RlLkluZHVzdHJpYT09IkdyYW5kZSIpCgpnZ3Bsb3QoZGYzLCBhZXMoeD1Bw7FvLCB5PVZlbnRhcywgY29sb3VyPSBUYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgbGFicygKICAgIHRpdGxlPSAiVmVudGFzIHBvciBhw7FvIiwKICAgIHN1YnRpdGxlICA9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCiAgICApCgpkZjQgPC0gZGYgJT4lIGZpbHRlcihUYW1hw7FvLkN0ZS5JbmR1c3RyaWE9PSJNaWNybyIpCgpnZ3Bsb3QoZGY0LCBhZXMoeD1Bw7FvLCB5PVZlbnRhcywgY29sb3VyPSBUYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgbGFicygKICAgIHRpdGxlPSAiVmVudGFzIHBvciBhw7FvIiwKICAgIHN1YnRpdGxlICA9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCiAgICApCgpkZjUgPC0gZGYgJT4lIGZpbHRlcihUYW1hw7FvLkN0ZS5JbmR1c3RyaWE9PSJQZXF1ZcOxbyIpCgpnZ3Bsb3QoZGY1LCBhZXMoeD1Bw7FvLCB5PVZlbnRhcywgY29sb3VyPSBUYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgbGFicygKICAgIHRpdGxlPSAiVmVudGFzIHBvciBhw7FvIiwKICAgIHN1YnRpdGxlICA9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCiAgKQpgYGAKCgojIyBQcmVndW50YSAzIArCv0N1w6FsIGVzIGVsIGNvbXBvcnRhbWllbnRvIG9ic2VydmFkbyBkZSBsYXMgdW5pZGFkZXMgdmVuZGlkYXMgcG9yIG1lcyBkZSBjYWRhIHVuYSBkZSBsYXMgbWFyY2FzLCBpbmRlcGVuZGllbnRlbWVudGUgZGUgc3VzIHJlc3BlY3RpdmFzIHByZXNlbnRhY2lvbmVzPwoqKlJlc3B1ZXN0YTogRWwgaW5jcmVtZW50byBkZSB2ZW50YXMgc2UgZGViacOzIGEgbGEgaW5jb3Jwb3JhY2nDs24gZGUgdGFtYcOxbyBkZSBjbGllbnRlIEdyYW5kZSBZIFBlcXVlw7FvLioqIAoKYGBge3J9CmRmNiA8LSBkZiAlPiUgZmlsdGVyKE1hcmNhPT0gIkNvY2EtQ29sYSIpCgpnZ3Bsb3QoZGY2LCBhZXMoeD1Bw7FvLCB5PVZlbnRhcywgY29sb3VyPVRhbWHDsW8uQ3RlLkluZHVzdHJpYSkpKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrCiAgbGFicygKICAgIHRpdGxlPSAiVmVudGFzIHBvciBBw7FvIGRlIENvY2EgQ29sYSIsCiAgICBzdWJ0aXRsZSA9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCiAgKQoKZGY2IDwtIGRmICU+JSBmaWx0ZXIoTWFyY2E9PSAiU3ByaXRlIikKCmdncGxvdChkZjYsIGFlcyh4PUHDsW8sIHk9VmVudGFzLCBjb2xvdXI9VGFtYcOxby5DdGUuSW5kdXN0cmlhKSkrCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSsKICBsYWJzKAogICAgdGl0bGU9ICJWZW50YXMgcG9yIEHDsW8gZGUgU3ByaXRlIiwKICAgIHN1YnRpdGxlID0gIkNhc28gQXJjYSBDb250aW5lbnRhbCIKICApCmBgYAoKCiMjIFByZWd1bnRhIDQgCsK/U2UgaGEgaW5jcmVtZW50YWRvIGxhIHZlbnRhIGRlIHByb2R1Y3RvcyBlbiBlbnZhc2VzIHJldG9ybmFibGVzIGVuIGxvcyDDumx0aW1vcyBkb3MgYcOxb3M/CioqUmVzcHVlc3RhOiBFbCB2YWxvciBkZSBjb21wcmFzIGRlIGVudmFzZXMgcmV0b3JuYWJsZXMgc2UgZMO6cGxpY28gZW4gZWwgw7ppdGltbyBhw7FvKioKCgpgYGB7cn0KCiNIYXkgcXVlIGNvcnJlZ2lyIGVzdG8sIGNvbnRhc3RlIGN1YW50YXMgdmVjZXMgYXBhcmVjZSBsYSBwYWxhYnJhIHJldG9ybmFibGUsIG5vIHN1cyB2ZW50YXMuIFVwZGF0ZTogWWEgbG8gY29ycmVnw60uCgpSZXRvcm5hYmxlIDwtIGRmICU+JSBmaWx0ZXIoZGYkUmV0b3JuYWJsZV9OUiA9PSAiUmV0b3JuYWJsZSIpCgpnZ3Bsb3QoUmV0b3JuYWJsZSwgYWVzKHg9QcOxbywgeT1WZW50YXMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGw9InJlZCIpICsgCiAgbGFicygKICAgIHRpdGxlPSAiQ29tcHJhcyBkZSBlbnZhc2VzIHJldG9ybmFibGVzIHBvciBhw7FvIiwKICAgIHN1YnRpdGxlID0gIkNhc28gQXJjYSBDb250aW5lbnRhbCIKICApCmBgYAoKIyMgUHJlZ3VudGEgNSAKwr9FbCBjb21wb3J0YW1pZW50byBkZSBsYSB2ZW50YSBkZSBhZ3VhIGhhIGluY3JlbWVudGFkbyBlbiByZWxhY2nDs24gYWwgZGUgbG9zIHJlZnJlc2NvcyBvIGxhcyBiZWJpZGFzIGlzb3TDs25pY2FzPwoKKipSZXNwdWVzdGE6IEVsIGNvbnN1bW8gZGUgcmVmcmVzY29zIHNlIGhhIG1hbnRlbmlkbyByZWd1bGFyIGR1cmFudGUgbG9zIGHDsW9zLCBlbiAyMDE4IGF1bWVudMOzIHVuIHBvcmNlbnRhamUgZGUgc3VzIHZlbnRhcyB5IGVsIGNvbXBvcnRhbWllbnRvIGZ1ZSBzZWd1aWRvIHBvciBsYXMgdmVudGFzIGRlIGFndWFzLiBTaW4gZW1hYnJnbyBlbiAyMDE5IGxhcyB2ZW50YXMgdHV2aWVyb24gdW4gcmV0cm9jZXNvLCBtaWVudHJhcyBxdWUgbGFzIGlzb3TDs25pY2FzIGF1bWVudGFyb24uKioKCmBgYHtyfQojUXVlIGVzdGEgcGFzYW5kbyBhcXXDrT8gUG9yIHF1w6kgbGFzIGzDrW5lYXMgbWUgc2FsZW4gcmVjdGFzPyBUZW5kcsOpIHF1ZSBoYWNlciB1biBjw6FsY3VsbyBtYW51YWw/CgpkZmFndWEgPC0gZGYgJT4lIGZpbHRlcihTZWdtZW50by5EZXQgJWluJSBjKCJBZ3VhIFB1cmlmaWNhZGEiLCAiSXNvdMOzbmljb3MgUmVndWxhciIsICJDb2xhcyBSZWd1bGFyIikpCgpnZ3Bsb3QoZGZhZ3VhLGFlcyh4PUHDsW8seT1WZW50YXMsZmlsbD1TZWdtZW50by5EZXQpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSsKICBsYWJzKAogICAgdGl0bGU9ICJWZW50YXMgcG9yIGHDsW8iLAogICAgc3VidGl0bGUgPSAiQ2FzbyBBcmNhIENvbnRpbmVudGFsIgogICkKCmBgYAoKIyMgUHJlZ3VudGEgNiAKwr9QdWVkZSBkZWNpcnNlIHF1ZSBsYSB2ZW50YSBtZW5zdWFsIGRlIGFndWEgZXN0w6EgcmVsYWNpb25hZGEgY29uIGxhIHZlbnRhIG1lbnN1YWwgZGUgcmVmcmVzY29zIGVuIGxvcyDDumx0aW1vcyA0IGHDsW9zPwoKKipSZXNwdWVzdGE6IExhIHZlbnRhIGRlIGFndWEgeSByZWZyZXNjbyBubyBlc3RhIHJlbGFjaW9uYWRhKioKCmBgYHtyfQpkZmNvY2FzIDwtIGRmICU+JSBmaWx0ZXIoU2VnbWVudG8uRGV0ICVpbiUgYygiQWd1YSBQdXJpZmljYWRhIiwgIkNvbGFzIFJlZ3VsYXIiKSkKCmdncGxvdChkZmNvY2FzLGFlcyh4PUHDsW8seT1WZW50YXMsZmlsbD1TZWdtZW50by5EZXQpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSsKICBsYWJzKAogICAgdGl0bGU9ICJWZW50YXMgcG9yIGHDsW8iLAogICAgc3VidGl0bGUgPSAiQ2FzbyBBcmNhIENvbnRpbmVudGFsIgogICkKCmBgYAoKCgojIyBQcmVndW50YSA3IArCv0EgY3XDoW50byBhc2NpZW5kZW4gbGFzIHZlbnRhcyBlc3BlcmFkYXMgcGFyYSBlbCAyMDIwIGVuIGxhIENvY2EgQ29sYSBkZSA1MDAgbWwgTlIgVmlkcmlvPwoqKlJlc3B1ZXN0YTogTGFzIHZlbnRhcyBhc2NpZW5kZW4gaGFzdGEgJDQ0NCwwNjUsIHBvciBsbyBxdWUgcG9kZW1vcyBjb25jbHVpciBxdWUgbGEgcHJvcHVlc3RhIGRlIGFyY2EgdmEgcG9yIG11eSBidWVuIGNhbWlubyoqCgpgYGB7cn0KCmRmMTEgPC0gZGYgJT4lIGZpbHRlcihNYXJjYT09IkNvY2EtQ29sYSIgJiBQcmVzZW50YWNpb249PSI1MDAgbWwgTlIgVmlkcmlvIikKCmRmMTIgPC0gYWdncmVnYXRlKFZlbnRhcyB+IEHDsW8sIGRmMTEsIHN1bSkKCmRmMTIkQcOxbyA8LSBhcy5pbnRlZ2VyKGRmMTIkQcOxbykKcmVncmVzaW9uIDwtbG0oVmVudGFzIH4gQcOxbywgZGF0YT1kZjEyKQpzdW1tYXJ5KHJlZ3Jlc2lvbikKCiNFY3VhY2nDs24gZGUgbGEgcmVjdGEgeT0tNTQsOTcwLDU5NSArIDI3LDQzMypBw7FvCmRhdG9zIDwtIGRhdGEuZnJhbWUoQcOxbz0yMDIwKQpwcmVkaWN0KHJlZ3Jlc2lvbixkYXRvcykKCmBgYAoK