Teoría

El Market Basket Analysis es una técnica en el ámbito de análisis y mineria de datos en el campo del comercio. Su objetivo inicial es descubrir patrones de asociación entre productos que suelen ser comprados juntos por los clientes.

Las 3 métricas princiaples para evaluar reglas de asociación son:

  • Confidence (Confianza): Probabilidad de comprar B sabiendo que se compró A. Ej. Pan –> Mantequilla = 0.8. De cada 100 clientes que compraron pan, 80 compraron Mantequilla también.
  • Lift (Elevación): Cuánto más probable es comprar B cuando se compra A en comparación de la probabilidad de comprar B sin saber si se compró A. Ej. Lift > 1 Compra A impulsa B. Lift = 1 No tienen relación de compra. Lift < 1 A reduce la compra de B.
  • Support(Soporte): Popularidad del producto dentro de las transacciones. Ej. Pan y Mantequilla 0.05 El 5% de todas las transacciones compraron estos dos productos juntos.

Contexto

Una cadena de tiendas de conveniencia tiene 5 tiendas ubicadas en distintas ciudades de México. La Base de Datos “Abarrotes” contiene un mes de transacciones, pero presenta errores de calidad que impiden realizar análisis confiables. El objetivo es limpiar la base de datos de forma estrategica y posteriormente aplicar MBA para descubrir patrones de compra y diseñar promociones que aumenten las ventas.

Instalar paquetes y llamar librerías

#install.packages("tidyverse") #Paquete global para manipulación y análisis de datos
library(tidyverse)
#install.packages("janitor") # Examinar y limpiar bases de datos sucias
library(janitor)
#install.packages("Matrix") # Para trabajar con matrices
library(Matrix)
#install.packages("arules") #Genera reglas de asociacion 
library(arules)
#install.packages("arulesViz") # Visualizar reglas de asociacion
library(arulesViz)
#install.packages("dplyr")  # ejecutar solo una vez
library(dplyr)
# install.packages("plyr")  # solo la primera vez
library(plyr)

Importar la base de datos

# file.choose()
df <- read.csv( "C:\\Users\\LuisG\\Downloads\\abarrotes.csv")

Entender la base de datos

summary(df)
##     ClaveTienda          DescGiro      Codigo.Barras            PLU        
##  Length   :200625   Length   :200625   Min.   :8.347e+05   Min.   : 1.000  
##  N.unique :     5   N.unique :     3   1st Qu.:7.501e+12   1st Qu.: 1.000  
##  N.blank  :     0   N.blank  :     0   Median :7.501e+12   Median : 1.000  
##  Min.nchar:     5   Min.nchar:     8   Mean   :5.950e+12   Mean   : 2.112  
##  Max.nchar:     5   Max.nchar:    10   3rd Qu.:7.501e+12   3rd Qu.: 1.000  
##                                        Max.   :1.750e+13   Max.   :30.000  
##                                                            NAs    :199188  
##        Fecha               Hora              Marca            Fabricante    
##  Length   :200625   Length   :200625   Length   :200625   Length   :200625  
##  N.unique :   195   N.unique : 52145   N.unique :   540   N.unique :   241  
##  N.blank  :     0   N.blank  :     0   N.blank  :     0   N.blank  :     0  
##  Min.nchar:    10   Min.nchar:     8   Min.nchar:     3   Min.nchar:     3  
##  Max.nchar:    10   Max.nchar:     8   Max.nchar:    30   Max.nchar:    40  
##                                                                             
##                                                                             
##       Producto          Precio          Ult.Costo         Unidades     
##  Length   :200625   Min.   :-147.00   Min.   :  0.38   Min.   : 0.200  
##  N.unique :  3406   1st Qu.:  11.00   1st Qu.:  8.46   1st Qu.: 1.000  
##  N.blank  :     0   Median :  16.00   Median : 12.31   Median : 1.000  
##  Min.nchar:     4   Mean   :  19.42   Mean   : 15.31   Mean   : 1.262  
##  Max.nchar:    40   3rd Qu.:  25.00   3rd Qu.: 19.23   3rd Qu.: 1.000  
##                     Max.   :1000.00   Max.   :769.23   Max.   :96.000  
##                                                                        
##     F.Ticket      NombreDepartamento   NombreFamilia     NombreCategoria  
##  Min.   :     1   Length   :200625   Length   :200625   Length   :200625  
##  1st Qu.: 33964   N.unique :     9   N.unique :    51   N.unique :   174  
##  Median :105993   N.blank  :     0   N.blank  :     0   N.blank  :     0  
##  Mean   :193990   Min.nchar:     6   Min.nchar:     3   Min.nchar:     2  
##  3rd Qu.:383005   Max.nchar:    20   Max.nchar:    25   Max.nchar:    37  
##  Max.   :450040                                                           
##                                                                           
##        Estado           Mts.2        Tipo.ubicación          Giro       
##  Length   :200625   Min.   :47.0   Length   :200625   Length   :200625  
##  N.unique :     5   1st Qu.:53.0   N.unique :     3   N.unique :     2  
##  N.blank  :     0   Median :60.0   N.blank  :     0   N.blank  :     0  
##  Min.nchar:     7   Mean   :56.6   Min.nchar:     7   Min.nchar:     9  
##  Max.nchar:    12   3rd Qu.:60.0   Max.nchar:    12   Max.nchar:    10  
##                     Max.   :62.0                                        
##                                                                         
##     Hora.inicio        Hora.cierre    
##  Length   :200625   Length   :200625  
##  N.unique :     3   N.unique :     3  
##  N.blank  :     0   N.blank  :     0  
##  Min.nchar:     5   Min.nchar:     5  
##  Max.nchar:     5   Max.nchar:     5  
##                                       
## 
str(df)
## 'data.frame':    200625 obs. of  22 variables:
##  $ ClaveTienda       : chr  "MX001" "MX001" "MX001" "MX001" ...
##  $ DescGiro          : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Codigo.Barras     : num  7.5e+12 7.5e+12 7.5e+12 7.5e+12 7.5e+12 ...
##  $ PLU               : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Fecha             : chr  "19/06/2020" "19/06/2020" "19/06/2020" "19/06/2020" ...
##  $ Hora              : chr  "08:16:21" "08:23:33" "08:24:33" "08:24:33" ...
##  $ Marca             : chr  "NUTRI LECHE" "DAN UP" "BIMBO" "PEPSI" ...
##  $ Fabricante        : chr  "MEXILAC" "DANONE DE MEXICO" "GRUPO BIMBO" "PEPSI-COLA MEXICANA" ...
##  $ Producto          : chr  "Nutri Leche 1 Litro" "DANUP STRAWBERRY P/BEBER 350GR NAL" "Rebanadas Bimbo 2Pz" "Pepsi N.R. 400Ml" ...
##  $ Precio            : num  16 14 5 8 19.5 16 14 5 8 19.5 ...
##  $ Ult.Costo         : num  12.3 14 5 8 15 ...
##  $ Unidades          : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ F.Ticket          : int  1 2 3 3 4 1 2 3 3 4 ...
##  $ NombreDepartamento: chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ NombreFamilia     : chr  "Lacteos y Refrigerados" "Lacteos y Refrigerados" "Pan y Tortilla" "Bebidas" ...
##  $ NombreCategoria   : chr  "Leche" "Yogurt" "Pan Dulce Empaquetado" "Refrescos Plástico (N.R.)" ...
##  $ Estado            : chr  "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ Mts.2             : int  60 60 60 60 60 60 60 60 60 60 ...
##  $ Tipo.ubicación    : chr  "Esquina" "Esquina" "Esquina" "Esquina" ...
##  $ Giro              : chr  "Abarrotes" "Abarrotes" "Abarrotes" "Abarrotes" ...
##  $ Hora.inicio       : chr  "08:00" "08:00" "08:00" "08:00" ...
##  $ Hora.cierre       : chr  "22:00" "22:00" "22:00" "22:00" ...
#count(df, ClaveTienda, sort = TRUE)
#count(df, DescGiro, sort = TRUE)
#count(df, Codigo.Barras, sort = TRUE)
#count(df, PLU, sort = TRUE)
#count(df, Fecha, sort = TRUE)
#count(df, Hora, sort = TRUE)
#count(df, Marca, sort = TRUE)
#count(df, Fabricante, sort = TRUE)
#count(df, Producto, sort = TRUE)
#count(df, NombreDepartamento, sort = TRUE)
#count(df, NombreFamilia, sort = TRUE)
#count(df, NombreCategoria, sort = TRUE)
#count(df, Estado, sort = TRUE)
#count(df, Tipo.ubicación, sort = TRUE)
#count(df, Giro, sort = TRUE)
#count(df, Hora.inicio, sort = TRUE)
#count(df, Hora.cierre, sort = TRUE)
head(df,10)
##    ClaveTienda  DescGiro Codigo.Barras PLU      Fecha     Hora
## 1        MX001 Abarrotes  7.501021e+12  NA 19/06/2020 08:16:21
## 2        MX001 Abarrotes  7.501032e+12  NA 19/06/2020 08:23:33
## 3        MX001 Abarrotes  7.501000e+12  NA 19/06/2020 08:24:33
## 4        MX001 Abarrotes  7.501031e+12  NA 19/06/2020 08:24:33
## 5        MX001 Abarrotes  7.501026e+12  NA 19/06/2020 08:26:28
## 6        MX001 Abarrotes  7.501021e+12  NA 19/06/2020 08:16:21
## 7        MX001 Abarrotes  7.501032e+12  NA 19/06/2020 08:23:33
## 8        MX001 Abarrotes  7.501000e+12  NA 19/06/2020 08:24:33
## 9        MX001 Abarrotes  7.501031e+12  NA 19/06/2020 08:24:33
## 10       MX001 Abarrotes  7.501026e+12  NA 19/06/2020 08:26:28
##                         Marca                 Fabricante
## 1                 NUTRI LECHE                    MEXILAC
## 2                      DAN UP           DANONE DE MEXICO
## 3                       BIMBO                GRUPO BIMBO
## 4                       PEPSI        PEPSI-COLA MEXICANA
## 5  BLANCA NIEVES (DETERGENTE) FABRICA DE JABON LA CORONA
## 6                 NUTRI LECHE                    MEXILAC
## 7                      DAN UP           DANONE DE MEXICO
## 8                       BIMBO                GRUPO BIMBO
## 9                       PEPSI        PEPSI-COLA MEXICANA
## 10 BLANCA NIEVES (DETERGENTE) FABRICA DE JABON LA CORONA
##                              Producto Precio Ult.Costo Unidades F.Ticket
## 1                 Nutri Leche 1 Litro   16.0     12.31        1        1
## 2  DANUP STRAWBERRY P/BEBER 350GR NAL   14.0     14.00        1        2
## 3                 Rebanadas Bimbo 2Pz    5.0      5.00        1        3
## 4                    Pepsi N.R. 400Ml    8.0      8.00        1        3
## 5       Detergente Blanca Nieves 500G   19.5     15.00        1        4
## 6                 Nutri Leche 1 Litro   16.0     12.31        1        1
## 7  DANUP STRAWBERRY P/BEBER 350GR NAL   14.0     14.00        1        2
## 8                 Rebanadas Bimbo 2Pz    5.0      5.00        1        3
## 9                    Pepsi N.R. 400Ml    8.0      8.00        1        3
## 10      Detergente Blanca Nieves 500G   19.5     15.00        1        4
##    NombreDepartamento          NombreFamilia           NombreCategoria
## 1           Abarrotes Lacteos y Refrigerados                     Leche
## 2           Abarrotes Lacteos y Refrigerados                    Yogurt
## 3           Abarrotes         Pan y Tortilla     Pan Dulce Empaquetado
## 4           Abarrotes                Bebidas Refrescos Plástico (N.R.)
## 5           Abarrotes     Limpieza del Hogar                Lavandería
## 6           Abarrotes Lacteos y Refrigerados                     Leche
## 7           Abarrotes Lacteos y Refrigerados                    Yogurt
## 8           Abarrotes         Pan y Tortilla     Pan Dulce Empaquetado
## 9           Abarrotes                Bebidas Refrescos Plástico (N.R.)
## 10          Abarrotes     Limpieza del Hogar                Lavandería
##        Estado Mts.2 Tipo.ubicación      Giro Hora.inicio Hora.cierre
## 1  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 2  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 3  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 4  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 5  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 6  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 7  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 8  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 9  Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 10 Nuevo León    60        Esquina Abarrotes       08:00       22:00
tail(df,10)
##        ClaveTienda DescGiro Codigo.Barras PLU      Fecha     Hora
## 200616       MX005 Depósito   7.62221e+12  NA 07/08/2020 19:30:13
## 200617       MX005 Depósito   7.62221e+12  NA 25/07/2020 18:42:24
## 200618       MX005 Depósito   7.62221e+12  NA 18/07/2020 22:45:58
## 200619       MX005 Depósito   7.62221e+12  NA 12/07/2020 00:36:34
## 200620       MX005 Depósito   7.62221e+12  NA 12/07/2020 01:08:25
## 200621       MX005 Depósito   7.62221e+12  NA 23/10/2020 22:17:37
## 200622       MX005 Depósito   7.62221e+12  NA 10/10/2020 20:30:20
## 200623       MX005 Depósito   7.62221e+12  NA 10/10/2020 22:40:43
## 200624       MX005 Depósito   7.62221e+12  NA 27/06/2020 22:30:19
## 200625       MX005 Depósito   7.62221e+12  NA 26/06/2020 23:43:34
##                    Marca    Fabricante                          Producto Precio
## 200616 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200617 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200618 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200619 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200620 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200621 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200622 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200623 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200624 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
## 200625 TRIDENT XTRA CARE CADBURY ADAMS Trident Xtracare Freshmint 16.32G      9
##        Ult.Costo Unidades F.Ticket NombreDepartamento NombreFamilia
## 200616      6.92        1   106411          Abarrotes      Dulcería
## 200617      6.92        1   104693          Abarrotes      Dulcería
## 200618      6.92        1   103856          Abarrotes      Dulcería
## 200619      6.92        1   103087          Abarrotes      Dulcería
## 200620      6.92        1   103100          Abarrotes      Dulcería
## 200621      6.92        1   116598          Abarrotes      Dulcería
## 200622      6.92        1   114886          Abarrotes      Dulcería
## 200623      6.92        1   114955          Abarrotes      Dulcería
## 200624      6.92        1   101121          Abarrotes      Dulcería
## 200625      6.92        1   100879          Abarrotes      Dulcería
##        NombreCategoria       Estado Mts.2 Tipo.ubicación       Giro Hora.inicio
## 200616 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200617 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200618 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200619 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200620 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200621 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200622 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200623 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200624 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
## 200625 Gomas de Mazcar Quintana Roo    58        Esquina Mini súper       08:00
##        Hora.cierre
## 200616       21:00
## 200617       21:00
## 200618       21:00
## 200619       21:00
## 200620       21:00
## 200621       21:00
## 200622       21:00
## 200623       21:00
## 200624       21:00
## 200625       21:00
# Tabla Tienda y Departamento
tabyl(df,ClaveTienda,NombreDepartamento)
##  ClaveTienda Abarrotes Bebes e Infantiles Carnes Farmacia Ferretería Mercería
##        MX001     95415                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
# Tabla de Estado y Hora de Inicio
tabyl(df,Estado,Hora.inicio)
##        Estado 07:00 08:00 09:00
##       Chiapas  4051     0     0
##       Jalisco     0     0  6629
##    Nuevo León     0 96469     0
##  Quintana Roo     0 10021     0
##       Sinaloa 83455     0     0

Limpieza de la base de datos

Técnica 1. Eliminar valores irrelevantes

# Eliminar columnas
df <- subset(df,select =-c(PLU))

# Eliminar renglones
df <- df[df$Precio>0, ]

Técnica 2. Eliminar valores repetidos

df <- distinct(df)

Técnica 3. Corregir errores tipograficos y similares

df$Unidades <- ceiling(df$Unidades)

Técnica 4. Convertir tipos de datos

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

Técnica 5. Tratar Valores Faltantes

# Borrar todos los NA's
# df <- na.omit(df)

# Reemplazar los NA's con CEROS
# df[is.na(df)] <- 0

# Reemplazar los NA's con el PROMEDIO
# df$altura[is.na(df$altura)] <- mean(df$altura, na.rn=TRUE)

Técnica 6. Herramientas Estadísticas

boxplot(df$Precio,horizontal = TRUE)

boxplot(df$Unidades,horizontal = TRUE)

Generar Modelo

# Ordenar de menor a mayor la columna Ticket
df <- df[order(df$F.Ticket), ]

# Generar Basket
basket <- ddply(df,c("F.Ticket"),function(df)paste(df$Marca,collapse = ","))

#Eliminar número de Ticket
basket$F.Ticket <- NULL

#Cambiar el titulo de la columna V1 por Marca
colnames(basket) <- c("Marca")

# Exportar Basket
write.csv(basket,"basket.csv",quote = FALSE ,row.names = FALSE)

Market Basket Analysis

#file.choose()
tr <- read.transactions("C:\\Users\\LuisG\\OneDrive\\Documents\\TecMty\\Semestre 7\\Modulo 2\\basket.csv",format = "basket",sep = ",")
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in scan(text = l, what = "character", sep = sep, quote = quote, : EOF
## within quoted string
## Warning in asMethod(object): removing duplicated items in transactions
reglas.asosiacion <- apriori(tr,parameter = list(supp= 0.001,conf=0.2,maxlen = 10))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.2    0.1    1 none FALSE            TRUE       5   0.001      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 115 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[604 item(s), 115031 transaction(s)] done [0.05s].
## sorting and recoding items ... [207 item(s)] done [0.00s].
## creating transaction tree ... done [0.06s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [11 rule(s)] done [0.00s].
## creating S4 object  ... done [0.01s].
# summary(reglas.asosiacion)
# inspect(reglas.asosiacion)

reglas.asosiacion <- sort(reglas.asosiacion,by = "confidence",decreasing = TRUE)
# summary(reglas.asosiacion)
# inspect((reglas.asosiacion))

top10reglas <- head(reglas.asosiacion, n = 10, by = "confidence")
plot(top10reglas,method="graph",engine = "htmlwidget")
LS0tDQp0aXRsZTogIkJhc2tldCBNYXJrZXQgQW5hbHlzaXMgLSBBYmFycm90ZXMiDQphdXRob3I6ICJMdWlzIEdhbGxhcmRvIEEwMDgzODkzNCINCmRhdGU6ICIyMDI2LTA4LTE4Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IGNvc21vDQotLS0NCg0KIVtdKGh0dHBzOi8vbWVkaWEyLmdpcGh5LmNvbS9tZWRpYS92MS5ZMmxrUFRjNU1HSTNOakV4TmpnM1pIVmxielpyYVhrNGJIQnNhV05rTmpFNFkyRTNkWEpsYTJnM05UTnFhSEV6ZWpCellpWmxjRDEyTVY5cGJuUmxjbTVoYkY5bmFXWmZZbmxmYVdRbVkzUTlady9ac0kzU01pTG96TmpuNXJER3YvZ2lwaHkuZ2lmKSAgDQoNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+IFRlb3LDrWEgPC9zcGFuPg0KRWwgKipNYXJrZXQgQmFza2V0IEFuYWx5c2lzKiogZXMgdW5hIHTDqWNuaWNhIGVuIGVsIMOhbWJpdG8gZGUgYW7DoWxpc2lzIHkgbWluZXJpYSBkZSBkYXRvcyBlbiBlbCBjYW1wbyBkZWwgY29tZXJjaW8uIFN1IG9iamV0aXZvIGluaWNpYWwgZXMgZGVzY3VicmlyIHBhdHJvbmVzIGRlIGFzb2NpYWNpw7NuIGVudHJlIHByb2R1Y3RvcyBxdWUgc3VlbGVuIHNlciBjb21wcmFkb3MganVudG9zIHBvciBsb3MgY2xpZW50ZXMuICANCg0KTGFzIDMgbcOpdHJpY2FzIHByaW5jaWFwbGVzIHBhcmEgZXZhbHVhciByZWdsYXMgZGUgYXNvY2lhY2nDs24gc29uOiAgDQoNCiogKkNvbmZpZGVuY2UqIChDb25maWFuemEpOiBQcm9iYWJpbGlkYWQgZGUgY29tcHJhciBCIHNhYmllbmRvIHF1ZSBzZSBjb21wcsOzIEEuIEVqLiBQYW4gLS0+IE1hbnRlcXVpbGxhID0gMC44LiBEZSBjYWRhIDEwMCBjbGllbnRlcyBxdWUgY29tcHJhcm9uIHBhbiwgODAgY29tcHJhcm9uIE1hbnRlcXVpbGxhIHRhbWJpw6luLiAgDQoqICpMaWZ0KiAoRWxldmFjacOzbik6IEN1w6FudG8gbcOhcyBwcm9iYWJsZSBlcyBjb21wcmFyIEIgY3VhbmRvIHNlIGNvbXByYSBBIGVuIGNvbXBhcmFjacOzbiBkZSBsYSBwcm9iYWJpbGlkYWQgZGUgY29tcHJhciBCIHNpbiBzYWJlciBzaSBzZSBjb21wcsOzIEEuIEVqLiBMaWZ0ID4gMSBDb21wcmEgQSBpbXB1bHNhIEIuIExpZnQgPSAxIE5vIHRpZW5lbiByZWxhY2nDs24gZGUgY29tcHJhLiBMaWZ0IDwgMSBBIHJlZHVjZSBsYSBjb21wcmEgZGUgQi4gIA0KKiAqU3VwcG9ydCooU29wb3J0ZSk6IFBvcHVsYXJpZGFkIGRlbCBwcm9kdWN0byBkZW50cm8gZGUgbGFzIHRyYW5zYWNjaW9uZXMuIEVqLiBQYW4geSBNYW50ZXF1aWxsYSAwLjA1IEVsIDUlIGRlIHRvZGFzIGxhcyB0cmFuc2FjY2lvbmVzIGNvbXByYXJvbiBlc3RvcyBkb3MgcHJvZHVjdG9zIGp1bnRvcy4NCg0KIVtdKGh0dHBzOi8vbWlyby5tZWRpdW0uY29tL3YyL3Jlc2l6ZTpmaXQ6NDgwMC9mb3JtYXQ6d2VicC8xKlV4RUFGSGVsVG9xWi1FZVdzLUlLemcucG5nKSAgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBDb250ZXh0byA8L3NwYW4+ICANClVuYSBjYWRlbmEgZGUgdGllbmRhcyBkZSBjb252ZW5pZW5jaWEgdGllbmUgNSB0aWVuZGFzIHViaWNhZGFzIGVuIGRpc3RpbnRhcyBjaXVkYWRlcyBkZSBNw6l4aWNvLiBMYSBCYXNlIGRlIERhdG9zICJBYmFycm90ZXMiIGNvbnRpZW5lIHVuIG1lcyBkZSB0cmFuc2FjY2lvbmVzLCBwZXJvIHByZXNlbnRhIGVycm9yZXMgZGUgY2FsaWRhZCBxdWUgaW1waWRlbiByZWFsaXphciBhbsOhbGlzaXMgY29uZmlhYmxlcy4gRWwgb2JqZXRpdm8gZXMgbGltcGlhciBsYSBiYXNlIGRlIGRhdG9zIGRlIGZvcm1hIGVzdHJhdGVnaWNhIHkgcG9zdGVyaW9ybWVudGUgYXBsaWNhciBNQkEgcGFyYSBkZXNjdWJyaXIgcGF0cm9uZXMgZGUgY29tcHJhIHkgZGlzZcOxYXIgcHJvbW9jaW9uZXMgcXVlIGF1bWVudGVuIGxhcyB2ZW50YXMuICANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+IEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMgPC9zcGFuPiAgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpICNQYXF1ZXRlIGdsb2JhbCBwYXJhIG1hbmlwdWxhY2nDs24geSBhbsOhbGlzaXMgZGUgZGF0b3MNCmxpYnJhcnkodGlkeXZlcnNlKQ0KI2luc3RhbGwucGFja2FnZXMoImphbml0b3IiKSAjIEV4YW1pbmFyIHkgbGltcGlhciBiYXNlcyBkZSBkYXRvcyBzdWNpYXMNCmxpYnJhcnkoamFuaXRvcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJNYXRyaXgiKSAjIFBhcmEgdHJhYmFqYXIgY29uIG1hdHJpY2VzDQpsaWJyYXJ5KE1hdHJpeCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJhcnVsZXMiKSAjR2VuZXJhIHJlZ2xhcyBkZSBhc29jaWFjaW9uIA0KbGlicmFyeShhcnVsZXMpDQojaW5zdGFsbC5wYWNrYWdlcygiYXJ1bGVzVml6IikgIyBWaXN1YWxpemFyIHJlZ2xhcyBkZSBhc29jaWFjaW9uDQpsaWJyYXJ5KGFydWxlc1ZpeikNCiNpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpICAjIGVqZWN1dGFyIHNvbG8gdW5hIHZleg0KbGlicmFyeShkcGx5cikNCiMgaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpICAjIHNvbG8gbGEgcHJpbWVyYSB2ZXoNCmxpYnJhcnkocGx5cikNCmBgYA0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+IEltcG9ydGFyIGxhIGJhc2UgZGUgZGF0b3MgPC9zcGFuPiAgDQpgYGB7cn0NCiMgZmlsZS5jaG9vc2UoKQ0KZGYgPC0gcmVhZC5jc3YoICJDOlxcVXNlcnNcXEx1aXNHXFxEb3dubG9hZHNcXGFiYXJyb3Rlcy5jc3YiKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBFbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0Kc3VtbWFyeShkZikNCnN0cihkZikNCiNjb3VudChkZiwgQ2xhdmVUaWVuZGEsIHNvcnQgPSBUUlVFKQ0KI2NvdW50KGRmLCBEZXNjR2lybywgc29ydCA9IFRSVUUpDQojY291bnQoZGYsIENvZGlnby5CYXJyYXMsIHNvcnQgPSBUUlVFKQ0KI2NvdW50KGRmLCBQTFUsIHNvcnQgPSBUUlVFKQ0KI2NvdW50KGRmLCBGZWNoYSwgc29ydCA9IFRSVUUpDQojY291bnQoZGYsIEhvcmEsIHNvcnQgPSBUUlVFKQ0KI2NvdW50KGRmLCBNYXJjYSwgc29ydCA9IFRSVUUpDQojY291bnQoZGYsIEZhYnJpY2FudGUsIHNvcnQgPSBUUlVFKQ0KI2NvdW50KGRmLCBQcm9kdWN0bywgc29ydCA9IFRSVUUpDQojY291bnQoZGYsIE5vbWJyZURlcGFydGFtZW50bywgc29ydCA9IFRSVUUpDQojY291bnQoZGYsIE5vbWJyZUZhbWlsaWEsIHNvcnQgPSBUUlVFKQ0KI2NvdW50KGRmLCBOb21icmVDYXRlZ29yaWEsIHNvcnQgPSBUUlVFKQ0KI2NvdW50KGRmLCBFc3RhZG8sIHNvcnQgPSBUUlVFKQ0KI2NvdW50KGRmLCBUaXBvLnViaWNhY2nDs24sIHNvcnQgPSBUUlVFKQ0KI2NvdW50KGRmLCBHaXJvLCBzb3J0ID0gVFJVRSkNCiNjb3VudChkZiwgSG9yYS5pbmljaW8sIHNvcnQgPSBUUlVFKQ0KI2NvdW50KGRmLCBIb3JhLmNpZXJyZSwgc29ydCA9IFRSVUUpDQpoZWFkKGRmLDEwKQ0KdGFpbChkZiwxMCkNCg0KIyBUYWJsYSBUaWVuZGEgeSBEZXBhcnRhbWVudG8NCnRhYnlsKGRmLENsYXZlVGllbmRhLE5vbWJyZURlcGFydGFtZW50bykNCg0KIyBUYWJsYSBkZSBFc3RhZG8geSBIb3JhIGRlIEluaWNpbw0KdGFieWwoZGYsRXN0YWRvLEhvcmEuaW5pY2lvKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBMaW1waWV6YSBkZSBsYSBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4NCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBUw6ljbmljYSAxLiBFbGltaW5hciB2YWxvcmVzIGlycmVsZXZhbnRlcyA8L3NwYW4+DQpgYGB7cn0NCiMgRWxpbWluYXIgY29sdW1uYXMNCmRmIDwtIHN1YnNldChkZixzZWxlY3QgPS1jKFBMVSkpDQoNCiMgRWxpbWluYXIgcmVuZ2xvbmVzDQpkZiA8LSBkZltkZiRQcmVjaW8+MCwgXQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj4gVMOpY25pY2EgMi4gRWxpbWluYXIgdmFsb3JlcyByZXBldGlkb3MgPC9zcGFuPg0KYGBge3J9DQpkZiA8LSBkaXN0aW5jdChkZikNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+IFTDqWNuaWNhIDMuIENvcnJlZ2lyIGVycm9yZXMgdGlwb2dyYWZpY29zIHkgc2ltaWxhcmVzIDwvc3Bhbj4NCmBgYHtyfQ0KZGYkVW5pZGFkZXMgPC0gY2VpbGluZyhkZiRVbmlkYWRlcykNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+IFTDqWNuaWNhIDQuIENvbnZlcnRpciB0aXBvcyBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCmRmJEZlY2hhIDwtIGFzLkRhdGUoZGYkRmVjaGEsIGZvcm1hdCA9ICIlZC8lbS8lWSIpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBUw6ljbmljYSA1LiBUcmF0YXIgVmFsb3JlcyBGYWx0YW50ZXMgPC9zcGFuPg0KYGBge3J9DQojIEJvcnJhciB0b2RvcyBsb3MgTkEncw0KIyBkZiA8LSBuYS5vbWl0KGRmKQ0KDQojIFJlZW1wbGF6YXIgbG9zIE5BJ3MgY29uIENFUk9TDQojIGRmW2lzLm5hKGRmKV0gPC0gMA0KDQojIFJlZW1wbGF6YXIgbG9zIE5BJ3MgY29uIGVsIFBST01FRElPDQojIGRmJGFsdHVyYVtpcy5uYShkZiRhbHR1cmEpXSA8LSBtZWFuKGRmJGFsdHVyYSwgbmEucm49VFJVRSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+IFTDqWNuaWNhIDYuIEhlcnJhbWllbnRhcyBFc3RhZMOtc3RpY2FzIDwvc3Bhbj4NCmBgYHtyfQ0KYm94cGxvdChkZiRQcmVjaW8saG9yaXpvbnRhbCA9IFRSVUUpDQpib3hwbG90KGRmJFVuaWRhZGVzLGhvcml6b250YWwgPSBUUlVFKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPiBHZW5lcmFyIE1vZGVsbyA8L3NwYW4+DQpgYGB7cn0NCiMgT3JkZW5hciBkZSBtZW5vciBhIG1heW9yIGxhIGNvbHVtbmEgVGlja2V0DQpkZiA8LSBkZltvcmRlcihkZiRGLlRpY2tldCksIF0NCg0KIyBHZW5lcmFyIEJhc2tldA0KYmFza2V0IDwtIGRkcGx5KGRmLGMoIkYuVGlja2V0IiksZnVuY3Rpb24oZGYpcGFzdGUoZGYkTWFyY2EsY29sbGFwc2UgPSAiLCIpKQ0KDQojRWxpbWluYXIgbsO6bWVybyBkZSBUaWNrZXQNCmJhc2tldCRGLlRpY2tldCA8LSBOVUxMDQoNCiNDYW1iaWFyIGVsIHRpdHVsbyBkZSBsYSBjb2x1bW5hIFYxIHBvciBNYXJjYQ0KY29sbmFtZXMoYmFza2V0KSA8LSBjKCJNYXJjYSIpDQoNCiMgRXhwb3J0YXIgQmFza2V0DQp3cml0ZS5jc3YoYmFza2V0LCJiYXNrZXQuY3N2IixxdW90ZSA9IEZBTFNFICxyb3cubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj4gTWFya2V0IEJhc2tldCBBbmFseXNpcyA8L3NwYW4+DQpgYGB7cn0NCiNmaWxlLmNob29zZSgpDQp0ciA8LSByZWFkLnRyYW5zYWN0aW9ucygiQzpcXFVzZXJzXFxMdWlzR1xcT25lRHJpdmVcXERvY3VtZW50c1xcVGVjTXR5XFxTZW1lc3RyZSA3XFxNb2R1bG8gMlxcYmFza2V0LmNzdiIsZm9ybWF0ID0gImJhc2tldCIsc2VwID0gIiwiKQ0KDQpyZWdsYXMuYXNvc2lhY2lvbiA8LSBhcHJpb3JpKHRyLHBhcmFtZXRlciA9IGxpc3Qoc3VwcD0gMC4wMDEsY29uZj0wLjIsbWF4bGVuID0gMTApKQ0KIyBzdW1tYXJ5KHJlZ2xhcy5hc29zaWFjaW9uKQ0KIyBpbnNwZWN0KHJlZ2xhcy5hc29zaWFjaW9uKQ0KDQpyZWdsYXMuYXNvc2lhY2lvbiA8LSBzb3J0KHJlZ2xhcy5hc29zaWFjaW9uLGJ5ID0gImNvbmZpZGVuY2UiLGRlY3JlYXNpbmcgPSBUUlVFKQ0KIyBzdW1tYXJ5KHJlZ2xhcy5hc29zaWFjaW9uKQ0KIyBpbnNwZWN0KChyZWdsYXMuYXNvc2lhY2lvbikpDQoNCnRvcDEwcmVnbGFzIDwtIGhlYWQocmVnbGFzLmFzb3NpYWNpb24sIG4gPSAxMCwgYnkgPSAiY29uZmlkZW5jZSIpDQpwbG90KHRvcDEwcmVnbGFzLG1ldGhvZD0iZ3JhcGgiLGVuZ2luZSA9ICJodG1sd2lkZ2V0IikNCmBgYA0KDQo=