#Contexto Análisis de recibos de Luz de una casa en California en 2006

Loading library

library(readr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(readxl)
library(ggplot2)

Loading data set

poblacion <- read_csv("poblacion.csv")

Creación de muestra

muestra <- filter(poblacion, Mes %in% c("Enero", "Marzo", "Mayo", "Septiembre", "Diciembre"))

Tamaño de la Población (N)

N <- length(poblacion$Pago)
N
## [1] 12
#Hay 12 observaciones en población

n <- length(muestra$Pago)
n
## [1] 5
#Hay 5 observaciones en población

Medias de tendencia central

Permiten conocer el valor al que tiende el conjunto de datos.

Media o Promedi

Valor que se obtiene al sumar todos los datos y dividirlos entre la cantidad total de datos

Media Poblacional (miu)

media_poblacional <- mean(poblacion$Pago)
media_poblacional
## [1] 245.0167

Media Muestral (x barra)

media_muestral <- mean(muestra$Pago)
media_muestral
## [1] 249.432

Mediana poblacional

Valor que ocupa el lugar central de todos los datos cuando estos estan ordenados de menor a mayor.

mediana_poblacional <- median(poblacion$Pago)
mediana_poblacional
## [1] 228.63

Mediana Muestral

mediana_muestral <- median(muestra$Pago)
mediana_muestral
## [1] 230.46

Resumen

summary(poblacion)
##      Mes                 Pago      
##  Length:12          Min.   :162.6  
##  Class :character   1st Qu.:203.5  
##  Mode  :character   Median :228.6  
##                     Mean   :245.0  
##                     3rd Qu.:293.5  
##                     Max.   :343.5
summary(muestra)
##      Mes                 Pago      
##  Length:5           Min.   :187.2  
##  Class :character   1st Qu.:219.4  
##  Mode  :character   Median :230.5  
##                     Mean   :249.4  
##                     3rd Qu.:266.6  
##                     Max.   :343.5

Moda

Valor que aparece con mayor frecuencia en un conjunto de moda

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

#Nota: si ninguno de los datos se repite, la funcion coloca el primer valor en lugar de marcar error

Moda poblacional

moda_poblacional <- moda(poblacion$Pago)
moda_poblacional
## [1] 266.63

Moda muestral

moda_muestral <- moda(muestra$Pago)
moda_muestral
## [1] 266.63

Relación entre media, mediana y moda

  • Si la media, mediana y moda son iguales, los datos tienen una distribución simétrica
  • Si la media < mediana < moda, los datos tienen sesgo negativo
  • Si la moda < mediana < media, los datos tienen sesgo negativo
mtc_poblacional <- c(media_poblacional, mediana_poblacional, moda_poblacional)
names(mtc_poblacional) <- c("media_poblacional", "mediana_poblacional", "moda_poblacional")
mtc_poblacional <- sort(mtc_poblacional)
mtc_poblacional
## mediana_poblacional   media_poblacional    moda_poblacional 
##            228.6300            245.0167            266.6300
hist(poblacion$Pago)

#La población tiene sesgo positivo

Medidas de Disperción

Miden que tan esparcidos se encuentran los datos

Rango

Intervalo o diferencia entre el valor maximo y el minimo de un conjunto de datos

Rango poblacional

rango_poblacional <- max(poblacion$Pago) - min(poblacion$Pago)
rango_poblacional
## [1] 180.86
#La función range devuelve el valor minimo y maximo, pero no su diferencia, para esto se tiene que hacer el claculo de arriba.

Rango Muestral

rango_muestral <- max(muestra$Pago) - min(muestra$Pago)
rango_muestral
## [1] 156.34

Varianza

Promedio elevado al cuadrado de las desviaciones individuales de cada observación con respecto a la media de una distribución, Si es población, se divide enre N; si es muestra, se divide entre n-1

Varianza poblacional (sigma ^2)

varianza_poblacional <- var(poblacion$Pago)*(N-1)/N
varianza_poblacional
## [1] 3614.659

Varianza muestral (s cuadrada)

varianza_muestral <- var(muestra$Pago)
varianza_muestral
## [1] 3570.905

Desviación Estandar

Raíz cuadrada de la varianza

Desviación Estandar poblacional (sigma)

desv.est_poblacional <- sqrt(varianza_poblacional)
desv.est_poblacional
## [1] 60.12203

Desviación Estandar muestral (s)

desv.est_muestral <- sqrt(varianza_muestral)
desv.est_muestral
## [1] 59.75705

Actividad 3.1

Contexto

Una empresa con 5 tiendas de abarrotes en distintas ciudades de México

#Importando base de datos

abarrotes <- read_xlsx("Abarrotes_Ventas.xlsx")

Entender la base de datos

summary(abarrotes)
##  vcClaveTienda        DescGiro         Codigo Barras         PLU         
##  Length:200620      Length:200620      Min.   :8.347e+05   Mode:logical  
##  Class :character   Class :character   1st Qu.:7.501e+12   TRUE:1437     
##  Mode  :character   Mode  :character   Median :7.501e+12   NA's:199183   
##                                        Mean   :5.950e+12                 
##                                        3rd Qu.:7.501e+12                 
##                                        Max.   :1.750e+13                 
##      Fecha                             Hora                       
##  Min.   :2020-05-01 00:00:31.08   Min.   :1899-12-31 00:00:00.00  
##  1st Qu.:2020-06-06 13:24:49.08   1st Qu.:1899-12-31 13:12:42.75  
##  Median :2020-07-11 14:10:21.46   Median :1899-12-31 17:35:59.00  
##  Mean   :2020-07-19 15:19:40.65   Mean   :1899-12-31 16:43:52.05  
##  3rd Qu.:2020-08-29 22:07:47.33   3rd Qu.:1899-12-31 20:47:06.00  
##  Max.   :2020-11-11 23:53:47.73   Max.   :1899-12-31 23:59:59.00  
##     Marca            Fabricante          Producto             Precio       
##  Length:200620      Length:200620      Length:200620      Min.   :-147.00  
##  Class :character   Class :character   Class :character   1st Qu.:  11.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :  16.00  
##                                                           Mean   :  19.42  
##                                                           3rd Qu.:  25.00  
##                                                           Max.   :1000.00  
##    Ult.Costo         Unidades         F.Ticket      NombreDepartamento
##  Min.   :  0.38   Min.   : 0.200   Min.   :     1   Length:200620     
##  1st Qu.:  8.46   1st Qu.: 1.000   1st Qu.: 33967   Class :character  
##  Median : 12.31   Median : 1.000   Median :105996   Mode  :character  
##  Mean   : 15.31   Mean   : 1.262   Mean   :193994                     
##  3rd Qu.: 19.23   3rd Qu.: 1.000   3rd Qu.:383008                     
##  Max.   :769.23   Max.   :96.000   Max.   :450040                     
##  NombreFamilia      NombreCategoria       Estado              Mts 2     
##  Length:200620      Length:200620      Length:200620      Min.   :47.0  
##  Class :character   Class :character   Class :character   1st Qu.:53.0  
##  Mode  :character   Mode  :character   Mode  :character   Median :60.0  
##                                                           Mean   :56.6  
##                                                           3rd Qu.:60.0  
##                                                           Max.   :62.0  
##  Tipo ubicación         Giro            Hora inicio                    
##  Length:200620      Length:200620      Min.   :1899-12-31 07:00:00.00  
##  Class :character   Class :character   1st Qu.:1899-12-31 07:00:00.00  
##  Mode  :character   Mode  :character   Median :1899-12-31 08:00:00.00  
##                                        Mean   :1899-12-31 07:35:49.71  
##                                        3rd Qu.:1899-12-31 08:00:00.00  
##                                        Max.   :1899-12-31 09:00:00.00  
##   Hora cierre                    
##  Min.   :1899-12-31 21:00:00.00  
##  1st Qu.:1899-12-31 22:00:00.00  
##  Median :1899-12-31 22:00:00.00  
##  Mean   :1899-12-31 22:23:11.42  
##  3rd Qu.:1899-12-31 23:00:00.00  
##  Max.   :1899-12-31 23:00:00.00
count(abarrotes, vcClaveTienda, sort= TRUE)
## # A tibble: 5 × 2
##   vcClaveTienda     n
##   <chr>         <int>
## 1 MX001         96464
## 2 MX004         83455
## 3 MX005         10021
## 4 MX002          6629
## 5 MX003          4051
count(abarrotes, DescGiro, sort= TRUE)
## # A tibble: 3 × 2
##   DescGiro        n
##   <chr>       <int>
## 1 Abarrotes  100515
## 2 Carnicería  83455
## 3 Depósito    16650
count(abarrotes, Marca, sort= TRUE)
## # A tibble: 540 × 2
##    Marca           n
##    <chr>       <int>
##  1 COCA COLA   18686
##  2 PEPSI       15966
##  3 TECATE      11674
##  4 BIMBO        8316
##  5 LALA         5866
##  6 MARINELA     3696
##  7 DORITOS      3142
##  8 CHEETOS      3130
##  9 NUTRI LECHE  3127
## 10 MARLBORO     2579
## # ℹ 530 more rows
count(abarrotes, Fabricante, sort= TRUE)
## # A tibble: 241 × 2
##    Fabricante                          n
##    <chr>                           <int>
##  1 COCA COLA                       27519
##  2 PEPSI-COLA MEXICANA             22415
##  3 SABRITAS                        14296
##  4 CERVECERIA CUAUHTEMOC MOCTEZUMA 13681
##  5 GRUPO BIMBO                     13077
##  6 SIGMA ALIMENTOS                  8014
##  7 GRUPO INDUSTRIAL LALA            5868
##  8 GRUPO GAMESA                     5527
##  9 NESTLE                           3698
## 10 JUGOS DEL VALLE S.A. DE C.V.     3581
## # ℹ 231 more rows
count(abarrotes, Producto, sort= TRUE)
## # A tibble: 3,404 × 2
##    Producto                        n
##    <chr>                       <int>
##  1 Pepsi N.R. 1.5L              5108
##  2 Coca Cola Retornable 2.5L    3771
##  3 Caguamon Tecate Light 1.2Lt  3471
##  4 Pepsi N. R. 2.5L             2899
##  5 Cerveza Tecate Light 340Ml   2619
##  6 Cerveza Tecate Light 16Oz    2315
##  7 Coca Cola Retornable 1.5L    2124
##  8 Pepsi N.R. 3L                1832
##  9 Coca Cola Retornable 500Ml   1659
## 10 PEPSI N.R. 1.5L              1631
## # ℹ 3,394 more rows
count(abarrotes, NombreDepartamento, sort= TRUE)
## # A tibble: 9 × 2
##   NombreDepartamento        n
##   <chr>                 <int>
## 1 Abarrotes            198274
## 2 Bebes e Infantiles     1483
## 3 Ferretería              377
## 4 Farmacia                255
## 5 Vinos y Licores         104
## 6 Papelería                74
## 7 Mercería                 44
## 8 Productos a Eliminar      8
## 9 Carnes                    1
count(abarrotes, NombreFamilia, sort= TRUE)
## # A tibble: 51 × 2
##    NombreFamilia              n
##    <chr>                  <int>
##  1 Bebidas                64917
##  2 Botanas                21583
##  3 Lacteos y Refrigerados 17657
##  4 Cerveza                14017
##  5 Pan y Tortilla         10501
##  6 Limpieza del Hogar      8723
##  7 Galletas                7487
##  8 Cigarros                6817
##  9 Cuidado Personal        5433
## 10 Salsas y Sazonadores    5320
## # ℹ 41 more rows
count(abarrotes, NombreCategoria, sort= TRUE)
## # A tibble: 174 × 2
##    NombreCategoria               n
##    <chr>                     <int>
##  1 Refrescos Plástico (N.R.) 32861
##  2 Refrescos Retornables     13880
##  3 Frituras                  11082
##  4 Lata                       8150
##  5 Leche                      7053
##  6 Cajetilla                  6329
##  7 Botella                    5867
##  8 Productos sin Categoria    5455
##  9 Papas Fritas               5344
## 10 Jugos y Néctares           5295
## # ℹ 164 more rows
count(abarrotes, Estado, sort= TRUE)
## # A tibble: 5 × 2
##   Estado           n
##   <chr>        <int>
## 1 Nuevo León   96464
## 2 Sinaloa      83455
## 3 Quintana Roo 10021
## 4 Jalisco       6629
## 5 Chiapas       4051
count(abarrotes, "Tipo ubicación", sort= TRUE)
## # A tibble: 1 × 2
##   `"Tipo ubicación"`      n
##   <chr>               <int>
## 1 Tipo ubicación     200620
count(abarrotes, Giro, sort= TRUE)
## # A tibble: 2 × 2
##   Giro            n
##   <chr>       <int>
## 1 Abarrotes  183970
## 2 Mini súper  16650
count(abarrotes, Fecha, sort= TRUE)
## # A tibble: 131,933 × 2
##    Fecha                   n
##    <dttm>              <int>
##  1 2020-05-26 21:52:47    23
##  2 2020-07-16 09:44:01    20
##  3 2020-06-02 19:26:22    19
##  4 2020-06-07 12:11:25    19
##  5 2020-06-20 22:00:56    18
##  6 2020-08-22 14:00:07    18
##  7 2020-05-19 14:55:37    17
##  8 2020-05-31 15:12:58    17
##  9 2020-06-20 16:21:08    17
## 10 2020-08-17 21:30:06    17
## # ℹ 131,923 more rows
count(abarrotes, Hora, sort= TRUE)
## # A tibble: 52,145 × 2
##    Hora                    n
##    <dttm>              <int>
##  1 1899-12-31 21:52:47    30
##  2 1899-12-31 20:59:07    29
##  3 1899-12-31 12:11:26    28
##  4 1899-12-31 12:47:09    26
##  5 1899-12-31 14:55:38    26
##  6 1899-12-31 21:26:54    26
##  7 1899-12-31 21:30:07    25
##  8 1899-12-31 22:03:53    24
##  9 1899-12-31 18:46:35    23
## 10 1899-12-31 19:28:26    23
## # ℹ 52,135 more rows
count(abarrotes, "Mts 2", sort= TRUE)
## # A tibble: 1 × 2
##   `"Mts 2"`      n
##   <chr>      <int>
## 1 Mts 2     200620

Tabla de frecuencias

table(abarrotes$NombreDepartamento)
## 
##            Abarrotes   Bebes e Infantiles               Carnes 
##               198274                 1483                    1 
##             Farmacia           Ferretería             Mercería 
##                  255                  377                   44 
##            Papelería Productos a Eliminar      Vinos y Licores 
##                   74                    8                  104

Tabla cruzada

tabla1<- tabyl(abarrotes, vcClaveTienda, NombreDepartamento)
tabla1
##  vcClaveTienda Abarrotes Bebes e Infantiles Carnes Farmacia Ferretería Mercería
##          MX001     95410                515      1      147        245       28
##          MX002      6590                 21      0        4         10        0
##          MX003      4026                 15      0        2          8        0
##          MX004     82234                932      0      102        114       16
##          MX005     10014                  0      0        0          0        0
##  Papelería Productos a Eliminar Vinos y Licores
##         35                    3              80
##          0                    0               4
##          0                    0               0
##         32                    5              20
##          7                    0               0

Graficos cualitativos

Grafico de barras

abarrotes$Subtotal <- abarrotes$Precio*abarrotes$Unidades
ggplot(abarrotes, aes(x= vcClaveTienda, y=Subtotal)) + geom_bar(stat="identity")

Diagrama de Pareto

library(qcc)
## Package 'qcc' version 2.7
## Type 'citation("qcc")' for citing this R package in publications.
tabla1 <- subset(tabla1, select= c(vcClaveTienda, Abarrotes))
pareto.chart(tabla1$Abarrotes)

##    
## Pareto chart analysis for tabla1$Abarrotes
##        Frequency    Cum.Freq.   Percentage Cum.Percent.
##   A 9.541000e+04 9.541000e+04 4.812028e+01 4.812028e+01
##   D 8.223400e+04 1.776440e+05 4.147493e+01 8.959521e+01
##   E 1.001400e+04 1.876580e+05 5.050587e+00 9.464579e+01
##   B 6.590000e+03 1.942480e+05 3.323683e+00 9.796948e+01
##   C 4.026000e+03 1.982740e+05 2.030523e+00 1.000000e+02

Gráficos de puntos

plot(abarrotes$Precio, abarrotes$Unidades, main="Relación entre precio y unidades", xlab="Precio", ylab="Unidades")

Gráfica de caja y bigotes

boxplot(abarrotes$Precio, horizontal= TRUE)

boxplot(abarrotes$Unidades, horizontal= TRUE)

Propuesta

  1. Realizar un benchmarking interno de la tienda Nuevo León y replicar mejores prácticas en las otras 4 tiendas
  2. Enfocar el giro del negocio hacia los abarrotes.
LS0tCnRpdGxlOiAiRXN0YWRpc3RpY2EgZGVzY3JpcHRpdmEtIEFjdGl2aWRhZCAzLjEiCmF1dGhvcjogIkZlcm5hbmRvIE1vcmFsZXMgRGlhcnRlIC0gQTAxNzQwNTY3IgpkYXRlOiAiMjAyMy0wOC0yNCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgIHRoZW1lOiAiY29zbW8iCi0tLQohW10oL1VzZXJzL3NwZWVkeW1kMjMvRGVza3RvcC9BbmFsaXNpcyBkZSBkYXRvcyAtIGNvbmNlbnRyYWNpb8yBbi9Nb2QgMy9Fc3REZXMuanBlZykKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojQ29udGV4dG8KQW7DoWxpc2lzIGRlIHJlY2lib3MgZGUgTHV6IGRlIHVuYSBjYXNhIGVuIENhbGlmb3JuaWEgZW4gMjAwNgoKIyMgTG9hZGluZyBsaWJyYXJ5CmBgYHtyfQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKIyMgTG9hZGluZyBkYXRhIHNldApgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwb2JsYWNpb24gPC0gcmVhZF9jc3YoInBvYmxhY2lvbi5jc3YiKQpgYGAKCiMjIENyZWFjacOzbiBkZSBtdWVzdHJhIApgYGB7cn0KbXVlc3RyYSA8LSBmaWx0ZXIocG9ibGFjaW9uLCBNZXMgJWluJSBjKCJFbmVybyIsICJNYXJ6byIsICJNYXlvIiwgIlNlcHRpZW1icmUiLCAiRGljaWVtYnJlIikpCgpgYGAKCiMjIFRhbWHDsW8gZGUgbGEgUG9ibGFjacOzbiAoTikKYGBge3J9Ck4gPC0gbGVuZ3RoKHBvYmxhY2lvbiRQYWdvKQpOCiNIYXkgMTIgb2JzZXJ2YWNpb25lcyBlbiBwb2JsYWNpw7NuCgpuIDwtIGxlbmd0aChtdWVzdHJhJFBhZ28pCm4KI0hheSA1IG9ic2VydmFjaW9uZXMgZW4gcG9ibGFjacOzbgpgYGAKIyMgTWVkaWFzIGRlIHRlbmRlbmNpYSBjZW50cmFsClBlcm1pdGVuIGNvbm9jZXIgZWwgdmFsb3IgYWwgcXVlIHRpZW5kZSBlbCBjb25qdW50byBkZSBkYXRvcy4KCiMjIE1lZGlhIG8gUHJvbWVkaQpWYWxvciBxdWUgc2Ugb2J0aWVuZSBhbCBzdW1hciB0b2RvcyBsb3MgZGF0b3MgeSBkaXZpZGlybG9zIGVudHJlIGxhIGNhbnRpZGFkIHRvdGFsIGRlIGRhdG9zCgojIyBNZWRpYSBQb2JsYWNpb25hbCAobWl1KQpgYGB7cn0KbWVkaWFfcG9ibGFjaW9uYWwgPC0gbWVhbihwb2JsYWNpb24kUGFnbykKbWVkaWFfcG9ibGFjaW9uYWwKYGBgCiMjIE1lZGlhIE11ZXN0cmFsICh4IGJhcnJhKQpgYGB7cn0KbWVkaWFfbXVlc3RyYWwgPC0gbWVhbihtdWVzdHJhJFBhZ28pCm1lZGlhX211ZXN0cmFsCmBgYAoKIyMgTWVkaWFuYSBwb2JsYWNpb25hbApWYWxvciBxdWUgb2N1cGEgZWwgbHVnYXIgY2VudHJhbCBkZSB0b2RvcyBsb3MgZGF0b3MgY3VhbmRvIGVzdG9zIGVzdGFuIG9yZGVuYWRvcyBkZSBtZW5vciBhIG1heW9yLgpgYGB7cn0KbWVkaWFuYV9wb2JsYWNpb25hbCA8LSBtZWRpYW4ocG9ibGFjaW9uJFBhZ28pCm1lZGlhbmFfcG9ibGFjaW9uYWwKYGBgCgojIyBNZWRpYW5hIE11ZXN0cmFsCmBgYHtyfQptZWRpYW5hX211ZXN0cmFsIDwtIG1lZGlhbihtdWVzdHJhJFBhZ28pCm1lZGlhbmFfbXVlc3RyYWwKYGBgCgojIyBSZXN1bWVuIApgYGB7cn0Kc3VtbWFyeShwb2JsYWNpb24pCnN1bW1hcnkobXVlc3RyYSkKYGBgCgojIyBNb2RhClZhbG9yIHF1ZSBhcGFyZWNlIGNvbiBtYXlvciBmcmVjdWVuY2lhIGVuIHVuIGNvbmp1bnRvIGRlIG1vZGEKYGBge3J9Cm1vZGEgPC0gZnVuY3Rpb24oeCl7CiAgdXggPC0gdW5pcXVlKHgpCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQp9CgojTm90YTogc2kgbmluZ3VubyBkZSBsb3MgZGF0b3Mgc2UgcmVwaXRlLCBsYSBmdW5jaW9uIGNvbG9jYSBlbCBwcmltZXIgdmFsb3IgZW4gbHVnYXIgZGUgbWFyY2FyIGVycm9yCmBgYAoKIyMgTW9kYSBwb2JsYWNpb25hbApgYGB7cn0KbW9kYV9wb2JsYWNpb25hbCA8LSBtb2RhKHBvYmxhY2lvbiRQYWdvKQptb2RhX3BvYmxhY2lvbmFsCgpgYGAKCiMjIE1vZGEgbXVlc3RyYWwKYGBge3J9Cm1vZGFfbXVlc3RyYWwgPC0gbW9kYShtdWVzdHJhJFBhZ28pCm1vZGFfbXVlc3RyYWwKYGBgCgojIyBSZWxhY2nDs24gZW50cmUgbWVkaWEsIG1lZGlhbmEgeSBtb2RhCisgU2kgbGEgbWVkaWEsIG1lZGlhbmEgeSBtb2RhIHNvbiBpZ3VhbGVzLCBsb3MgZGF0b3MgdGllbmVuIHVuYSBkaXN0cmlidWNpw7NuIHNpbcOpdHJpY2EKKyBTaSBsYSBtZWRpYSA8IG1lZGlhbmEgPCBtb2RhLCBsb3MgZGF0b3MgdGllbmVuIHNlc2dvIG5lZ2F0aXZvCisgU2kgbGEgbW9kYSA8IG1lZGlhbmEgPCBtZWRpYSwgbG9zIGRhdG9zIHRpZW5lbiBzZXNnbyBuZWdhdGl2bwpgYGB7cn0KbXRjX3BvYmxhY2lvbmFsIDwtIGMobWVkaWFfcG9ibGFjaW9uYWwsIG1lZGlhbmFfcG9ibGFjaW9uYWwsIG1vZGFfcG9ibGFjaW9uYWwpCm5hbWVzKG10Y19wb2JsYWNpb25hbCkgPC0gYygibWVkaWFfcG9ibGFjaW9uYWwiLCAibWVkaWFuYV9wb2JsYWNpb25hbCIsICJtb2RhX3BvYmxhY2lvbmFsIikKbXRjX3BvYmxhY2lvbmFsIDwtIHNvcnQobXRjX3BvYmxhY2lvbmFsKQptdGNfcG9ibGFjaW9uYWwKCmhpc3QocG9ibGFjaW9uJFBhZ28pCiNMYSBwb2JsYWNpw7NuIHRpZW5lIHNlc2dvIHBvc2l0aXZvCmBgYAoKIyMgTWVkaWRhcyBkZSBEaXNwZXJjacOzbgpNaWRlbiBxdWUgdGFuIGVzcGFyY2lkb3Mgc2UgZW5jdWVudHJhbiBsb3MgZGF0b3MKCiMjIFJhbmdvCkludGVydmFsbyBvIGRpZmVyZW5jaWEgZW50cmUgZWwgdmFsb3IgbWF4aW1vIHkgZWwgbWluaW1vIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zCgojIyBSYW5nbyBwb2JsYWNpb25hbApgYGB7cn0KcmFuZ29fcG9ibGFjaW9uYWwgPC0gbWF4KHBvYmxhY2lvbiRQYWdvKSAtIG1pbihwb2JsYWNpb24kUGFnbykKcmFuZ29fcG9ibGFjaW9uYWwKCiNMYSBmdW5jacOzbiByYW5nZSBkZXZ1ZWx2ZSBlbCB2YWxvciBtaW5pbW8geSBtYXhpbW8sIHBlcm8gbm8gc3UgZGlmZXJlbmNpYSwgcGFyYSBlc3RvIHNlIHRpZW5lIHF1ZSBoYWNlciBlbCBjbGFjdWxvIGRlIGFycmliYS4KYGBgCgojIyBSYW5nbyBNdWVzdHJhbApgYGB7cn0KcmFuZ29fbXVlc3RyYWwgPC0gbWF4KG11ZXN0cmEkUGFnbykgLSBtaW4obXVlc3RyYSRQYWdvKQpyYW5nb19tdWVzdHJhbApgYGAKCiMjIFZhcmlhbnphIApQcm9tZWRpbyBlbGV2YWRvIGFsIGN1YWRyYWRvIGRlIGxhcyBkZXN2aWFjaW9uZXMgaW5kaXZpZHVhbGVzIGRlIGNhZGEgb2JzZXJ2YWNpw7NuIGNvbiByZXNwZWN0byBhIGxhIG1lZGlhIGRlIHVuYSBkaXN0cmlidWNpw7NuLCBTaSBlcyBwb2JsYWNpw7NuLCBzZSBkaXZpZGUgZW5yZSBOOyBzaSBlcyBtdWVzdHJhLCBzZSBkaXZpZGUgZW50cmUgbi0xCgojIyBWYXJpYW56YSBwb2JsYWNpb25hbCAoc2lnbWEgXjIpCmBgYHtyfQp2YXJpYW56YV9wb2JsYWNpb25hbCA8LSB2YXIocG9ibGFjaW9uJFBhZ28pKihOLTEpL04KdmFyaWFuemFfcG9ibGFjaW9uYWwKYGBgCgojIyBWYXJpYW56YSBtdWVzdHJhbCAocyBjdWFkcmFkYSkKYGBge3J9CnZhcmlhbnphX211ZXN0cmFsIDwtIHZhcihtdWVzdHJhJFBhZ28pCnZhcmlhbnphX211ZXN0cmFsCmBgYAoKIyMgRGVzdmlhY2nDs24gRXN0YW5kYXIgClJhw616IGN1YWRyYWRhIGRlIGxhIHZhcmlhbnphCgojIyBEZXN2aWFjacOzbiBFc3RhbmRhciBwb2JsYWNpb25hbCAoc2lnbWEpCmBgYHtyfQpkZXN2LmVzdF9wb2JsYWNpb25hbCA8LSBzcXJ0KHZhcmlhbnphX3BvYmxhY2lvbmFsKQpkZXN2LmVzdF9wb2JsYWNpb25hbApgYGAKCiMjIERlc3ZpYWNpw7NuIEVzdGFuZGFyIG11ZXN0cmFsIChzKQpgYGB7cn0KZGVzdi5lc3RfbXVlc3RyYWwgPC0gc3FydCh2YXJpYW56YV9tdWVzdHJhbCkKZGVzdi5lc3RfbXVlc3RyYWwKYGBgCgojIEFjdGl2aWRhZCAzLjEKIyMgQ29udGV4dG8KVW5hIGVtcHJlc2EgY29uIDUgdGllbmRhcyBkZSBhYmFycm90ZXMgZW4gZGlzdGludGFzIGNpdWRhZGVzIGRlIE3DqXhpY28KCiNJbXBvcnRhbmRvIGJhc2UgZGUgZGF0b3MKYGBge3J9CmFiYXJyb3RlcyA8LSByZWFkX3hsc3goIkFiYXJyb3Rlc19WZW50YXMueGxzeCIpCmBgYAoKIyMgRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcwpgYGB7cn0Kc3VtbWFyeShhYmFycm90ZXMpCgpjb3VudChhYmFycm90ZXMsIHZjQ2xhdmVUaWVuZGEsIHNvcnQ9IFRSVUUpCmNvdW50KGFiYXJyb3RlcywgRGVzY0dpcm8sIHNvcnQ9IFRSVUUpCmNvdW50KGFiYXJyb3RlcywgTWFyY2EsIHNvcnQ9IFRSVUUpCmNvdW50KGFiYXJyb3RlcywgRmFicmljYW50ZSwgc29ydD0gVFJVRSkKY291bnQoYWJhcnJvdGVzLCBQcm9kdWN0bywgc29ydD0gVFJVRSkKY291bnQoYWJhcnJvdGVzLCBOb21icmVEZXBhcnRhbWVudG8sIHNvcnQ9IFRSVUUpCmNvdW50KGFiYXJyb3RlcywgTm9tYnJlRmFtaWxpYSwgc29ydD0gVFJVRSkKY291bnQoYWJhcnJvdGVzLCBOb21icmVDYXRlZ29yaWEsIHNvcnQ9IFRSVUUpCmNvdW50KGFiYXJyb3RlcywgRXN0YWRvLCBzb3J0PSBUUlVFKQpjb3VudChhYmFycm90ZXMsICJUaXBvIHViaWNhY2nDs24iLCBzb3J0PSBUUlVFKQpjb3VudChhYmFycm90ZXMsIEdpcm8sIHNvcnQ9IFRSVUUpCmNvdW50KGFiYXJyb3RlcywgRmVjaGEsIHNvcnQ9IFRSVUUpCmNvdW50KGFiYXJyb3RlcywgSG9yYSwgc29ydD0gVFJVRSkKY291bnQoYWJhcnJvdGVzLCAiTXRzIDIiLCBzb3J0PSBUUlVFKQpgYGAKCiMjIFRhYmxhIGRlIGZyZWN1ZW5jaWFzCmBgYHtyfQp0YWJsZShhYmFycm90ZXMkTm9tYnJlRGVwYXJ0YW1lbnRvKQpgYGAKCiMjIFRhYmxhIGNydXphZGEKYGBge3J9CnRhYmxhMTwtIHRhYnlsKGFiYXJyb3RlcywgdmNDbGF2ZVRpZW5kYSwgTm9tYnJlRGVwYXJ0YW1lbnRvKQp0YWJsYTEKYGBgCgojIyBHcmFmaWNvcyBjdWFsaXRhdGl2b3MKIyMjIEdyYWZpY28gZGUgYmFycmFzCmBgYHtyfQphYmFycm90ZXMkU3VidG90YWwgPC0gYWJhcnJvdGVzJFByZWNpbyphYmFycm90ZXMkVW5pZGFkZXMKZ2dwbG90KGFiYXJyb3RlcywgYWVzKHg9IHZjQ2xhdmVUaWVuZGEsIHk9U3VidG90YWwpKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikKYGBgCgojIyBEaWFncmFtYSBkZSBQYXJldG8KYGBge3J9CmxpYnJhcnkocWNjKQp0YWJsYTEgPC0gc3Vic2V0KHRhYmxhMSwgc2VsZWN0PSBjKHZjQ2xhdmVUaWVuZGEsIEFiYXJyb3RlcykpCnBhcmV0by5jaGFydCh0YWJsYTEkQWJhcnJvdGVzKQoKYGBgCgojIyBHcsOhZmljb3MgZGUgcHVudG9zIApgYGB7cn0KcGxvdChhYmFycm90ZXMkUHJlY2lvLCBhYmFycm90ZXMkVW5pZGFkZXMsIG1haW49IlJlbGFjacOzbiBlbnRyZSBwcmVjaW8geSB1bmlkYWRlcyIsIHhsYWI9IlByZWNpbyIsIHlsYWI9IlVuaWRhZGVzIikKYGBgCgojIyBHcsOhZmljYSBkZSBjYWphIHkgYmlnb3RlcwpgYGB7cn0KYm94cGxvdChhYmFycm90ZXMkUHJlY2lvLCBob3Jpem9udGFsPSBUUlVFKQpib3hwbG90KGFiYXJyb3RlcyRVbmlkYWRlcywgaG9yaXpvbnRhbD0gVFJVRSkKYGBgCgojIyBQcm9wdWVzdGEKMS4gUmVhbGl6YXIgdW4gYmVuY2htYXJraW5nIGludGVybm8gZGUgbGEgdGllbmRhIE51ZXZvIExlw7NuIHkgcmVwbGljYXIgbWVqb3JlcyBwcsOhY3RpY2FzIGVuIGxhcyBvdHJhcyA0IHRpZW5kYXMKMi4gRW5mb2NhciBlbCBnaXJvIGRlbCBuZWdvY2lvIGhhY2lhIGxvcyBhYmFycm90ZXMuCg==