Facebook metrics Data Set

Activando librerias

library(readxl)
library(dplyr)
library(carData)
library(car)
library(ggplot2)
library(GGally)

1. Importar la data: dataset_Facebook.xlsx

a. Desarrollar una prueba de hipótesis (One-Way Anova) que determine si el promedio de Likes es igual en los distintos Tipos de contenido o al menos existe una diferencia.

#Importando la data
library(readxl)
df_facebook = read_excel("dataset_Facebook.xlsx")
table(df_facebook$Type)

  Link  Photo Status  Video 
    22    426     45      7 

Luego de importar el archivo dataset_Facebook.xlsx se observa que la variable Type contiene 4 categorías y que le dataframe cargado con los datos de dataset_Facebook.xlsx tiene 500 filas.

Realizamos un breve análisis descriptivo para visualizar la distribución de los datos:

#Analisis descriptivo
library(dplyr)
summarise(group_by(df_facebook,Type), mean(like),sd(like),n())

Nota: En todas las pruebas de hipótesis consideraremos el nivel de significancia de alpha = 0.05.

La regla de decisión es la siguiente:

  • Si p-value < alpha, se rechaza ho ==> Aceptamos h1
  • Si p-value > alpha, no se rechaza ho ==> Aceptamos ho

A continuación realizamos el test de Levene para analizar la homogeneidad de varianzas. La prueba de hipótesis es la siguiente:

ho: var_link = var_photo = var_status = var_video

h1: Existe al menos una diferencia entre las varianzas

library(carData)
library(car)
leveneTest(like~Type, data= df_facebook)
group coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
       Df F value Pr(>F)
group   3   0.538 0.6565
      496               

El p-value = 0.6565 > 0.05 => Aceptamos ho, es decir, hay homogeneidad en las varianzas.

Luego, realizamos el test de One-Way. Las hipótesis son las siguientes:

ho: prom_link = prom_photo = prom_status = prom_video

h1: Existe al menos una diferencia entre los promedios

oneway.test( like~Type, data=df_facebook, var.equal = T)

    One-way analysis of means

data:  like and Type
F = 0.85624, num df = 3, denom df = 496, p-value = 0.4637

El p-value = 0.4637 > 0.05, Aceptamos ho, es decir, el promedio de los tipos de publicaciones son iguales.

b. Analizar las comparaciones múltiples e interpretar.

Test de Pairwise

ho: Al menos uno promedios son iguales dos a dos h1: Los promedios son diferentes dos a dos

pairwise.t.test(df_facebook$like, df_facebook$Type)

    Pairwise comparisons using t tests with pooled SD 

data:  df_facebook$like and df_facebook$Type 

       Link Photo Status
Photo  0.75 -     -     
Status 1.00 1.00  -     
Video  1.00 1.00  1.00  

P value adjustment method: holm 

Como p-value > 0.05 para todos los casos, aceptamos ho, es decir, al menos existe dos grupos cuyos promedios son iguales.

2. Obtener las cantidades de los Tipos de contenido (tabla y gráfico de barras)

Mostramos una tabla resumen

summarise(group_by(df_facebook,Type), n())

A continuación mostramos un gráfico de barras:

library(ggplot2)
ggplot(df_facebook, aes(x = Type,fill=Type )) + geom_bar()

3. Crear otra data con el nombre dataset_Facebook_2

que solamente tenga los registros del Tipo de contenido con mayor cantidad (analizado en el punto 2)

df_total = summarise(group_by(df_facebook,Type), total= n())
max_total = max(df_total$total)
df_facebook_2=filter(df_facebook, 
                      Type == filter(df_total, total == max_total)$Type)

Verificados la estructura de dataframe df_facebook_2

library(GGally)
colnames( df_facebook_2)
 [1] "Page total likes"                                                   
 [2] "Type"                                                               
 [3] "Category"                                                           
 [4] "Post Month"                                                         
 [5] "Post Weekday"                                                       
 [6] "Post Hour"                                                          
 [7] "Paid"                                                               
 [8] "Lifetime Post Total Reach"                                          
 [9] "Lifetime Post Total Impressions"                                    
[10] "Lifetime Engaged Users"                                             
[11] "Lifetime Post Consumers"                                            
[12] "Lifetime Post Consumptions"                                         
[13] "Lifetime Post Impressions by people who have liked your Page"       
[14] "Lifetime Post reach by people who like your Page"                   
[15] "Lifetime People who have liked your Page and engaged with your post"
[16] "comment"                                                            
[17] "like"                                                               
[18] "share"                                                              
[19] "Total Interactions"                                                 
head(df_facebook_2)

4.Modelo de Regresión Lineal

En esta nueva data: dataset_Facebook_2: Desarrollar un modelo de regresión lineal múltiple, considerar las siguientes variables como independientes (X) y dependiente (Y).

  • Y: Lifetime post total reach

  • X1: Lifetime post total impressions

  • X2: Lifetime engaged users

  • X3: Lifetime post consumers

  • X4: Comments

  • X5: Likes

  • X6: Shares

Eliminando variables y cambiando de nombre

df_facebook_2 = select(df_facebook_2,  "Lifetime Post Total Reach",
                                         "Lifetime Post Total Impressions",
                                         "Lifetime Engaged Users",
                                         "Lifetime Post Consumers",
                                         "comment",
                                         "like",
                                         "share")
names(df_facebook_2) = c("Y","X1","X2","X3","X4","X5","X6")
head(df_facebook_2)

Responder, asumiendo un error del 5% (alpha=0.05):

a. ¿Existe linealidad?

Determinamos el modelo de regresión lineal

mo_lineal_multipe = lm(Y~X1+X2+X3+X4+X5+X6,data = df_facebook_2)
summary(mo_lineal_multipe)

Call:
lm(formula = Y ~ X1 + X2 + X3 + X4 + X5 + X6, data = df_facebook_2)

Residuals:
    Min      1Q  Median      3Q     Max 
-117415   -3181   -1829      74   77751 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.004e+02  9.378e+02  -0.320    0.749    
X1           1.328e-01  8.476e-03  15.673  < 2e-16 ***
X2           1.238e+02  2.125e+01   5.827 1.13e-08 ***
X3          -1.125e+02  2.099e+01  -5.360 1.38e-07 ***
X4          -8.474e+01  6.522e+01  -1.299    0.195    
X5          -8.136e+01  2.035e+01  -3.999 7.54e-05 ***
X6           4.951e+01  4.190e+01   1.182    0.238    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12580 on 415 degrees of freedom
  (4 observations deleted due to missingness)
Multiple R-squared:  0.7041,    Adjusted R-squared:  0.6999 
F-statistic: 164.6 on 6 and 415 DF,  p-value: < 2.2e-16

Prueba de linealidad

ho: bo = b1 = b2 = b3 = b4 = b5 = b6 = 0

h1: Al menos un bi i:0 a 6, es diferente de cero

p-value: < 2.2e-16 < 0.05, entonces rechazamos ho y aceptams h1. Al menos uno de los bi es diferente de 0.

a. ¿Cuál es el porcentaje de explicación del modelo?

Adjusted R-squared: 0.6999

c. ¿Cuáles son los coeficientes de regresión significativos y no significativos?

          Estimate Std. Error t value Pr(>|t|)    

(Intercept) -3.004e+02 9.378e+02 -0.320 0.749

X1 1.328e-01 8.476e-03 15.673 < 2e-16 ***

X2 1.238e+02 2.125e+01 5.827 1.13e-08 ***

X3 -1.125e+02 2.099e+01 -5.360 1.38e-07 ***

X4 -8.474e+01 6.522e+01 -1.299 0.195

X5 -8.136e+01 2.035e+01 -3.999 7.54e-05 ***

X6 4.951e+01 4.190e+01 1.182 0.238

Coeficientes significatvios: b1, b2, b3 y b5 Coeficientes no significativo: b0, b4 y b6

d. Interpretar dos coeficientes de regresión (uno positivo y otro negativo)

Los coeficientes postivos indican una relación directa entre la variable independendiente e la dependiente. Por ejemplp

  • Y: Lifetime post total reach

  • X1: Lifetime post total impressions

library(ggplot2)
ggplot(df_facebook_2, aes(x=X1, y=Y))  + geom_point()

En cambio, los coeficientes negativos indican una relación inversa entre la variable independendiente e la dependiente. Por ejemplp

  • Y: Lifetime post total reach

  • X5: Likes

library(ggplot2)
ggplot(df_facebook_2, aes(x=X5, y=Y))  + geom_point()

Elaborado un módelo sólo con los coefcientes sigificativos:

mo_lineal_multipe = lm(Y~X1+X2+X3+X5 -1,data = df_facebook_2)
summary(mo_lineal_multipe)

Call:
lm(formula = Y ~ X1 + X2 + X3 + X5 - 1, data = df_facebook_2)

Residuals:
    Min      1Q  Median      3Q     Max 
-116291   -3056   -1672     377   77651 

Coefficients:
     Estimate Std. Error t value Pr(>|t|)    
X1  1.313e-01  8.347e-03  15.727  < 2e-16 ***
X2  1.239e+02  1.696e+01   7.306 1.38e-12 ***
X3 -1.125e+02  1.664e+01  -6.761 4.58e-11 ***
X5 -8.010e+01  1.376e+01  -5.819 1.17e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12510 on 422 degrees of freedom
Multiple R-squared:  0.777, Adjusted R-squared:  0.7748 
F-statistic: 367.5 on 4 and 422 DF,  p-value: < 2.2e-16

Adjusted R-squared: 0.7748 ha mejorado.

Esto debido a la correlación que se evidencias en las variables:

  • X4: Comments

  • X5: Likes

  • X6: Shares

LS0tDQp0aXRsZTogIlRyYWJham8gRmluYWwgZGUgUiBCYXNpY28iDQphdXRob3I6ICJBbGZyZWRvIFplYSBWYWxlbnp1ZWxhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiNGYWNlYm9vayBtZXRyaWNzIERhdGEgU2V0DQpBY3RpdmFuZG8gbGlicmVyaWFzDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoY2FyRGF0YSkNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShHR2FsbHkpDQpgYGANCg0KDQoNCiMjMS4JSW1wb3J0YXIgbGEgZGF0YTogIGRhdGFzZXRfRmFjZWJvb2sueGxzeA0KIyMjYS4gRGVzYXJyb2xsYXIgdW5hIHBydWViYSBkZSBoaXDzdGVzaXMgKE9uZS1XYXkgQW5vdmEpIHF1ZSBkZXRlcm1pbmUgc2kgZWwgcHJvbWVkaW8gZGUgTGlrZXMgZXMgaWd1YWwgZW4gbG9zIGRpc3RpbnRvcyBUaXBvcyBkZSBjb250ZW5pZG8gbyBhbCBtZW5vcyBleGlzdGUgdW5hIGRpZmVyZW5jaWEuDQoNCmBgYHtyfQ0KI0ltcG9ydGFuZG8gbGEgZGF0YQ0KZGZfZmFjZWJvb2sgPSByZWFkX2V4Y2VsKCJkYXRhc2V0X0ZhY2Vib29rLnhsc3giKQ0KdGFibGUoZGZfZmFjZWJvb2skVHlwZSkNCmBgYA0KDQpMdWVnbyBkZSBpbXBvcnRhciBlbCBhcmNoaXZvIGRhdGFzZXRfRmFjZWJvb2sueGxzeCBzZSBvYnNlcnZhIHF1ZSBsYSB2YXJpYWJsZSBUeXBlIGNvbnRpZW5lIDQgY2F0ZWdvcu1hcyB5IHF1ZSBsZSBkYXRhZnJhbWUgY2FyZ2FkbyBjb24gbG9zIGRhdG9zIGRlIGRhdGFzZXRfRmFjZWJvb2sueGxzeCB0aWVuZSA1MDAgZmlsYXMuDQogDQpSZWFsaXphbW9zIHVuIGJyZXZlIGFu4Wxpc2lzIGRlc2NyaXB0aXZvIHBhcmEgdmlzdWFsaXphciBsYSBkaXN0cmlidWNp824gZGUgbG9zIGRhdG9zOg0KDQpgYGB7cn0NCiNBbmFsaXNpcyBkZXNjcmlwdGl2bw0Kc3VtbWFyaXNlKGdyb3VwX2J5KGRmX2ZhY2Vib29rLFR5cGUpLCBtZWFuKGxpa2UpLHNkKGxpa2UpLG4oKSkNCmBgYA0KDQpOb3RhOiBFbiB0b2RhcyBsYXMgcHJ1ZWJhcyBkZSBoaXDzdGVzaXMgY29uc2lkZXJhcmVtb3MgZWwgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBkZSBhbHBoYSA9IDAuMDUuDQoNCkxhIHJlZ2xhIGRlIGRlY2lzafNuIGVzIGxhIHNpZ3VpZW50ZToNCg0KKiBTaSBwLXZhbHVlIDwgYWxwaGEsIHNlIHJlY2hhemEgaG8gICAgID09PiBBY2VwdGFtb3MgaDENCiogU2kgcC12YWx1ZSA+IGFscGhhLCBubyBzZSByZWNoYXphIGhvICA9PT4gQWNlcHRhbW9zIGhvDQoNCg0KQSBjb250aW51YWNp824gcmVhbGl6YW1vcyBlbCB0ZXN0IGRlIExldmVuZSBwYXJhIGFuYWxpemFyIGxhIGhvbW9nZW5laWRhZCBkZSB2YXJpYW56YXMuIExhIHBydWViYSBkZSBoaXDzdGVzaXMgZXMgbGEgc2lndWllbnRlOg0KDQpobzogdmFyX2xpbmsgPSB2YXJfcGhvdG8gPSB2YXJfc3RhdHVzID0gdmFyX3ZpZGVvDQoNCmgxOiBFeGlzdGUgYWwgbWVub3MgdW5hIGRpZmVyZW5jaWEgZW50cmUgbGFzIHZhcmlhbnphcw0KYGBge3J9DQpsZXZlbmVUZXN0KGxpa2V+VHlwZSwgZGF0YT0gZGZfZmFjZWJvb2spDQpgYGANCg0KRWwgcC12YWx1ZSA9IDAuNjU2NSA+IDAuMDUgPT4gQWNlcHRhbW9zIGhvLCBlcyBkZWNpciwgaGF5IGhvbW9nZW5laWRhZCBlbiBsYXMgdmFyaWFuemFzLg0KDQpMdWVnbywgcmVhbGl6YW1vcyBlbCB0ZXN0IGRlIE9uZS1XYXkuIExhcyBoaXDzdGVzaXMgc29uIGxhcyBzaWd1aWVudGVzOg0KDQpobzogcHJvbV9saW5rID0gcHJvbV9waG90byA9IHByb21fc3RhdHVzID0gcHJvbV92aWRlbw0KDQpoMTogRXhpc3RlIGFsIG1lbm9zIHVuYSBkaWZlcmVuY2lhIGVudHJlIGxvcyBwcm9tZWRpb3MNCmBgYHtyfQ0Kb25ld2F5LnRlc3QoIGxpa2V+VHlwZSwgZGF0YT1kZl9mYWNlYm9vaywgdmFyLmVxdWFsID0gVCkNCmBgYA0KDQpFbCBwLXZhbHVlID0gMC40NjM3ID4gMC4wNSwgQWNlcHRhbW9zIGhvLCBlcyBkZWNpciwgZWwgcHJvbWVkaW8gZGUgbG9zIHRpcG9zIGRlIHB1YmxpY2FjaW9uZXMgc29uIGlndWFsZXMuDQoNCiMjI2IuCUFuYWxpemFyIGxhcyBjb21wYXJhY2lvbmVzIG36bHRpcGxlcyBlIGludGVycHJldGFyLg0KVGVzdCBkZSBQYWlyd2lzZQ0KDQpobzogQWwgbWVub3MgdW5vIHByb21lZGlvcyBzb24gaWd1YWxlcyBkb3MgYSBkb3MNCmgxOiBMb3MgcHJvbWVkaW9zIHNvbiBkaWZlcmVudGVzIGRvcyBhIGRvcw0KDQpgYGB7cn0NCnBhaXJ3aXNlLnQudGVzdChkZl9mYWNlYm9vayRsaWtlLCBkZl9mYWNlYm9vayRUeXBlKQ0KYGBgDQoNCkNvbW8gcC12YWx1ZSA+IDAuMDUgcGFyYSB0b2RvcyBsb3MgY2Fzb3MsIGFjZXB0YW1vcyBobywgZXMgZGVjaXIsIGFsIG1lbm9zIGV4aXN0ZSBkb3MgZ3J1cG9zIGN1eW9zIHByb21lZGlvcyBzb24gaWd1YWxlcy4NCg0KIyMgMi4JT2J0ZW5lciBsYXMgY2FudGlkYWRlcyBkZSBsb3MgVGlwb3MgZGUgY29udGVuaWRvICh0YWJsYSB5IGdy4WZpY28gZGUgYmFycmFzKQ0KDQpNb3N0cmFtb3MgdW5hIHRhYmxhIHJlc3VtZW4NCmBgYHtyfQ0Kc3VtbWFyaXNlKGdyb3VwX2J5KGRmX2ZhY2Vib29rLFR5cGUpLCBuKCkpDQpgYGANCg0KQSBjb250aW51YWNp824gbW9zdHJhbW9zIHVuIGdy4WZpY28gZGUgYmFycmFzOg0KDQpgYGB7cn0NCmdncGxvdChkZl9mYWNlYm9vaywgYWVzKHggPSBUeXBlLGZpbGw9VHlwZSApKSArIGdlb21fYmFyKCkNCmBgYA0KDQojIzMuCUNyZWFyIG90cmEgZGF0YSBjb24gZWwgbm9tYnJlIGRhdGFzZXRfRmFjZWJvb2tfMg0KcXVlIHNvbGFtZW50ZSB0ZW5nYSBsb3MgcmVnaXN0cm9zIGRlbCBUaXBvIGRlIGNvbnRlbmlkbyBjb24gbWF5b3IgY2FudGlkYWQgKGFuYWxpemFkbyBlbiBlbCBwdW50byAyKQ0KYGBge3J9DQpkZl90b3RhbCA9IHN1bW1hcmlzZShncm91cF9ieShkZl9mYWNlYm9vayxUeXBlKSwgdG90YWw9IG4oKSkNCg0KbWF4X3RvdGFsID0gbWF4KGRmX3RvdGFsJHRvdGFsKQ0KDQpkZl9mYWNlYm9va18yPWZpbHRlcihkZl9mYWNlYm9vaywgDQogICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PSBmaWx0ZXIoZGZfdG90YWwsIHRvdGFsID09IG1heF90b3RhbCkkVHlwZSkNCmBgYA0KDQpWZXJpZmljYWRvcyBsYSBlc3RydWN0dXJhIGRlIGRhdGFmcmFtZSBkZl9mYWNlYm9va18yDQoNCmBgYHtyfQ0KY29sbmFtZXMoIGRmX2ZhY2Vib29rXzIpDQpgYGANCg0KYGBge3J9DQpoZWFkKGRmX2ZhY2Vib29rXzIpDQpgYGANCg0KIyM0Lk1vZGVsbyBkZSBSZWdyZXNp824gTGluZWFsDQpFbiBlc3RhIG51ZXZhIGRhdGE6IGRhdGFzZXRfRmFjZWJvb2tfMjogRGVzYXJyb2xsYXIgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nzbiBsaW5lYWwgbfpsdGlwbGUsIGNvbnNpZGVyYXIgbGFzIHNpZ3VpZW50ZXMgdmFyaWFibGVzIGNvbW8gaW5kZXBlbmRpZW50ZXMgKFgpIHkgZGVwZW5kaWVudGUgKFkpLiANCg0KKiBZOiBMaWZldGltZSBwb3N0IHRvdGFsIHJlYWNoDQoNCiogWDE6IExpZmV0aW1lIHBvc3QgdG90YWwgaW1wcmVzc2lvbnMNCg0KKiBYMjogTGlmZXRpbWUgZW5nYWdlZCB1c2Vycw0KDQoqIFgzOiBMaWZldGltZSBwb3N0IGNvbnN1bWVycw0KDQoqIFg0OiBDb21tZW50cw0KDQoqIFg1OiBMaWtlcw0KDQoqIFg2OiBTaGFyZXMNCg0KRWxpbWluYW5kbyB2YXJpYWJsZXMgeSBjYW1iaWFuZG8gZGUgbm9tYnJlDQoNCmBgYHtyfQ0KZGZfZmFjZWJvb2tfMiA9IHNlbGVjdChkZl9mYWNlYm9va18yLCAgIkxpZmV0aW1lIFBvc3QgVG90YWwgUmVhY2giLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGlmZXRpbWUgUG9zdCBUb3RhbCBJbXByZXNzaW9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaWZldGltZSBFbmdhZ2VkIFVzZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpZmV0aW1lIFBvc3QgQ29uc3VtZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1lbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlrZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaGFyZSIpDQoNCm5hbWVzKGRmX2ZhY2Vib29rXzIpID0gYygiWSIsIlgxIiwiWDIiLCJYMyIsIlg0IiwiWDUiLCJYNiIpDQoNCmhlYWQoZGZfZmFjZWJvb2tfMikNCmBgYA0KDQojIyNSZXNwb25kZXIsIGFzdW1pZW5kbyB1biBlcnJvciBkZWwgNSUgKGFscGhhPTAuMDUpOiANCiMjIyNhLgm/RXhpc3RlIGxpbmVhbGlkYWQ/DQpEZXRlcm1pbmFtb3MgZWwgbW9kZWxvIGRlIHJlZ3Jlc2nzbiBsaW5lYWwNCg0KYGBge3J9DQptb19saW5lYWxfbXVsdGlwZSA9IGxtKFl+WDErWDIrWDMrWDQrWDUrWDYsZGF0YSA9IGRmX2ZhY2Vib29rXzIpDQoNCnN1bW1hcnkobW9fbGluZWFsX211bHRpcGUpDQpgYGANClBydWViYSBkZSBsaW5lYWxpZGFkIA0KDQpobzogYm8gPSBiMSA9IGIyID0gYjMgPSBiNCA9IGI1ID0gYjYgPSAwDQoNCmgxOiBBbCBtZW5vcyB1biBiaSBpOjAgYSA2LCAgZXMgZGlmZXJlbnRlIGRlIGNlcm8NCg0KcC12YWx1ZTogPCAyLjJlLTE2IDwgMC4wNSwgZW50b25jZXMgcmVjaGF6YW1vcyBobyB5IGFjZXB0YW1zIGgxLiBBbCBtZW5vcyB1bm8gZGUgbG9zIGJpIGVzIGRpZmVyZW50ZSBkZSAwLg0KDQojIyMjYS4Jv0N14WwgZXMgZWwgcG9yY2VudGFqZSBkZSBleHBsaWNhY2nzbiBkZWwgbW9kZWxvPw0KDQpBZGp1c3RlZCBSLXNxdWFyZWQ6ICAwLjY5OTkgDQoNCiMjIyMgYy4Jv0N14WxlcyBzb24gbG9zIGNvZWZpY2llbnRlcyBkZSByZWdyZXNp824gc2lnbmlmaWNhdGl2b3MgeSBubyBzaWduaWZpY2F0aXZvcz8NCg0KICAgICAgICAgICAgICBFc3RpbWF0ZSBTdGQuIEVycm9yIHQgdmFsdWUgUHIoPnx0fCkgICAgDQooSW50ZXJjZXB0KSAtMy4wMDRlKzAyICA5LjM3OGUrMDIgIC0wLjMyMCAgICAwLjc0OSAgDQoNClgxICAgICAgICAgICAxLjMyOGUtMDEgIDguNDc2ZS0wMyAgMTUuNjczICA8IDJlLTE2ICoqKg0KDQpYMiAgICAgICAgICAgMS4yMzhlKzAyICAyLjEyNWUrMDEgICA1LjgyNyAxLjEzZS0wOCAqKioNCg0KWDMgICAgICAgICAgLTEuMTI1ZSswMiAgMi4wOTllKzAxICAtNS4zNjAgMS4zOGUtMDcgKioqDQoNClg0ICAgICAgICAgIC04LjQ3NGUrMDEgIDYuNTIyZSswMSAgLTEuMjk5ICAgIDAuMTk1ICAgIA0KDQpYNSAgICAgICAgICAtOC4xMzZlKzAxICAyLjAzNWUrMDEgIC0zLjk5OSA3LjU0ZS0wNSAqKioNCg0KWDYgICAgICAgICAgIDQuOTUxZSswMSAgNC4xOTBlKzAxICAgMS4xODIgICAgMC4yMzgNCg0KQ29lZmljaWVudGVzIHNpZ25pZmljYXR2aW9zOiBiMSwgYjIsIGIzIHkgYjUNCkNvZWZpY2llbnRlcyBubyBzaWduaWZpY2F0aXZvOiBiMCwgYjQgeSBiNg0KDQoNCg0KIyMjIyBkLglJbnRlcnByZXRhciBkb3MgY29lZmljaWVudGVzIGRlIHJlZ3Jlc2nzbiAodW5vIHBvc2l0aXZvIHkgb3RybyBuZWdhdGl2bykNCg0KTG9zIGNvZWZpY2llbnRlcyBwb3N0aXZvcyBpbmRpY2FuIHVuYSByZWxhY2nzbiBkaXJlY3RhIGVudHJlIGxhIHZhcmlhYmxlIGluZGVwZW5kZW5kaWVudGUgZSBsYSBkZXBlbmRpZW50ZS4gUG9yIGVqZW1wbHANCg0KKiBZOiBMaWZldGltZSBwb3N0IHRvdGFsIHJlYWNoDQoNCiogWDE6IExpZmV0aW1lIHBvc3QgdG90YWwgaW1wcmVzc2lvbnMNCg0KYGBge3J9DQpnZ3Bsb3QoZGZfZmFjZWJvb2tfMiwgYWVzKHg9WDEsIHk9WSkpICArIGdlb21fcG9pbnQoKQ0KYGBgDQoNCg0KRW4gY2FtYmlvLCBsb3MgY29lZmljaWVudGVzIG5lZ2F0aXZvcyBpbmRpY2FuIHVuYSByZWxhY2nzbiBpbnZlcnNhIGVudHJlIGxhIHZhcmlhYmxlIGluZGVwZW5kZW5kaWVudGUgZSBsYSBkZXBlbmRpZW50ZS4gUG9yIGVqZW1wbHANCg0KKiBZOiBMaWZldGltZSBwb3N0IHRvdGFsIHJlYWNoDQoNCiogWDU6IExpa2VzDQoNCmBgYHtyfQ0KZ2dwbG90KGRmX2ZhY2Vib29rXzIsIGFlcyh4PVg1LCB5PVkpKSAgKyBnZW9tX3BvaW50KCkNCmBgYA0KDQpFbGFib3JhZG8gdW4gbfNkZWxvIHPzbG8gY29uIGxvcyBjb2VmY2llbnRlcyBzaWdpZmljYXRpdm9zOg0KYGBge3J9DQptb19saW5lYWxfbXVsdGlwZSA9IGxtKFl+WDErWDIrWDMrWDUgLTEsZGF0YSA9IGRmX2ZhY2Vib29rXzIpDQoNCnN1bW1hcnkobW9fbGluZWFsX211bHRpcGUpDQpgYGANCg0KQWRqdXN0ZWQgUi1zcXVhcmVkOiAgMC43NzQ4IGhhIG1lam9yYWRvLg0KDQpFc3RvIGRlYmlkbyBhIGxhIGNvcnJlbGFjafNuIHF1ZSBzZSBldmlkZW5jaWFzIGVuIGxhcyB2YXJpYWJsZXM6DQoNCiogWDQ6IENvbW1lbnRzDQoNCiogWDU6IExpa2VzDQoNCiogWDY6IFNoYXJlcw0KDQoNCg==