#install.packages("dplyr")
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
#install.packages("stringr")
library(stringr)

#install.packages("assertr")
library(assertr)

#install.packages("ggplot2")
library(ggplot2)

#install.packages("lubridate")
library(lubridate)
## 
## Adjuntando el paquete: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
#install.packages("readxl")
library(readxl)

#install.packages("forcats")
library(forcats)

#install.packages("visdat")
library(visdat)

#install.packages("stringdist")
library(stringdist)

#install.packages("fuzzyjoin")
library(fuzzyjoin)

#install.packages("gapminder")
library(gapminder)

#install.packages("e1071")
library(e1071)

#install.packages("datasets")
library(datasets)

1. The following table contains the ages of people who are frequent customers of a vegetarian restaurant. With this data, calculate::

  1. The mean
  2. The median
  3. The mode
  4. The frequency histogram
28 23 31 31 21
30 28 23 29 36
36 31 28 28 40
22 21 28 28 31
# Datos de la tabla de arriba
ages <- c(28, 23, 31, 31, 21, 30, 28, 23, 29, 36, 36, 31, 28, 28, 40, 22, 21, 28, 28, 31)

a) The mean

mean <- mean(ages)
print(mean)
## [1] 28.65

b) The median

median <- median(ages)
print(median)
## [1] 28

c) The mode

modo <- ages %>%
  table() %>%
  which.max() %>%
  names() %>%
  as.numeric()
print(modo)
## [1] 28

d) The frequency histogram

ggplot(data.frame(ages), aes(x = ages)) +
  geom_histogram(binwidth = 2, fill = "blue", color = "black", alpha = 0.7) +
  labs(title = "frequency histogram", x = "ages", y = "frequency") +
  theme_minimal()

2. With the data in the table above, determine the variance and standard deviation.

# variance
varianza <- var(ages)
print(varianza)
## [1] 25.71316
# standard deviation
desviacion_estandar <- sd(ages)
print(desviacion_estandar)
## [1] 5.070814

3. Using the mean and two standard deviation, determine the Chebyshev interval and interpret its meaning in the context of the problem.

k <- 2
limite_inferior <- median - k * desviacion_estandar
limite_superior <- median + k * desviacion_estandar
print(paste("El intervalo de Chebyshev para k=2 es:", limite_inferior, "a", limite_superior))
## [1] "El intervalo de Chebyshev para k=2 es: 17.858371354711 a 38.141628645289"

This means that, according to Chebyshev’s theorem, at least 75% of the age values will fall within this range of 13.03 to 43.27 years.

4. Explain what the Central Tendency measures indicate and what the dispersion measures indicate.

Measures of Central Tendency: Mean: It’s the average. It tells you the “typical” or most common value of the data.

Median: It’s the middle value when the data is sorted. It splits the data into two equal parts.

Mode: It’s the value that appears the most in the data.

What do they indicate?: These measures give you an idea of what the most typical or common value in the data set is.

Measures of Dispersion: Variance: It measures how spread out the data is. If it’s high, the data points are far apart.

Standard Deviation: It’s the square root of the variance and also measures how spread out the data is, but in the same units as the data.

What do they indicate?: These measures show you how “spread out” or “grouped together” the data is around the mean. If they’re low, the data is close to the mean; if they’re high, the data is more spread out.

5. Using the data from the database titled POP BEVERAGES CONSUMPTION SURVEY, use EXCEL to determine, for each age category of consumers, the following about the Glasses of soft drink per day:

ruta_archivo <- file.choose()
pop<- read_excel(ruta_archivo)
## New names:
## • `` -> `...2`
## • `` -> `...3`
## • `` -> `...4`
## • `` -> `...5`
## • `` -> `...6`
pop<- as.data.frame(pop)

youth_rural <- read_excel(ruta_archivo, sheet = "Youth Rural", skip = 2)
## New names:
## • `` -> `...5`
youth_urban <- read_excel(ruta_archivo, sheet = "Youth Urban", skip = 2)
## New names:
## • `` -> `...5`
adults_rural <- read_excel(ruta_archivo, sheet = "20-40 Rural", skip = 2)
## New names:
## • `` -> `...5`
adults_urban <- read_excel(ruta_archivo, sheet = "20-40 Urban", skip = 2)
## New names:
## • `` -> `...5`
seniors_rural <- read_excel(ruta_archivo, sheet = "40-60 Rural", skip = 2)
## New names:
## • `` -> `...5`
seniors_urban <- read_excel(ruta_archivo, sheet = "40-60 Urban", skip = 2)
## New names:
## • `` -> `...5`

a) The histogram frequency for each age category in rural area and the bias presented by the data from the graph comparing the mean to the median

plot_histogram <- function(df, title) {
  mean_value <- mean(df$`Glasses of soft drink a day`, na.rm = TRUE)
  median_value <- median(df$`Glasses of soft drink a day`, na.rm = TRUE)
  skewness <- mean_value - median_value
  
  p <- ggplot(df, aes(x = `Glasses of soft drink a day`)) +
    geom_histogram(binwidth = 1, fill = "blue", alpha = 0.7, color = "black") +
    geom_vline(aes(xintercept = mean_value), color = "red", linetype = "dashed", size = 1) +
    geom_vline(aes(xintercept = median_value), color = "green", linetype = "dashed", size = 1) +
    labs(title = title, x = "Soft drink glasses per day", y = "Frequency") +
    theme_minimal()
  
  return(list(plot = p, skewness = skewness))
}
hist_youth_rural <- plot_histogram(youth_rural, "Consumo de refresco - Jóvenes (Rural)")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
hist_adults_rural <- plot_histogram(adults_rural, "Consumo de refresco - Adultos (Rural)")
hist_seniors_rural <- plot_histogram(seniors_rural, "Consumo de refresco - Mayores (Rural)")

print(hist_youth_rural$plot)

print(hist_adults_rural$plot)

print(hist_seniors_rural$plot)

b) The histogram frequency for each age category in urban area and the bias presented by the data from the graph comparing the mean to the median

hist_youth_urban <- plot_histogram(youth_urban, "Soft Drink Consumption - Youth (Urban)")
hist_adults_urban <- plot_histogram(adults_urban, "Soft Drink Consumption - Adults (Urban)")
hist_seniors_urban <- plot_histogram(seniors_urban, "Soft Drink Consumption - Seniors (Urban)")
print(hist_youth_urban$plot)

print(hist_adults_urban$plot)

print(hist_seniors_urban$plot)

skewness_comparison <- data.frame(
  Category = c("Youth", "Youth", "Adults", "Adults", "Seniors", "Seniors"),
  Area = c("Rural", "Urban", "Rural", "Urban", "Rural", "Urban"),
  Skewness = c(hist_youth_rural$skewness, hist_youth_urban$skewness, 
               hist_adults_rural$skewness, hist_adults_urban$skewness, 
               hist_seniors_rural$skewness, hist_seniors_urban$skewness)
)

print(skewness_comparison)
##   Category  Area   Skewness
## 1    Youth Rural -0.1666667
## 2    Youth Urban  0.0000000
## 3   Adults Rural  0.4400000
## 4   Adults Urban  0.3400000
## 5  Seniors Rural  0.1000000
## 6  Seniors Urban  0.0000000
LS0tDQp0aXRsZTogIkJ1c2luZXNzX0FuYWx5dGljc19HcG9fMjAxX01UWV8yNTExLlJtZCINCmF1dGhvcjogIk1hcmlhbm8gQmF1dGlzdGEgQTAxNjU2OTA0Ig0KZGF0ZTogIjIwMjUtMDMtMjgiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQotLS0NCg0KDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygic3RyaW5nciIpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJhc3NlcnRyIikNCmxpYnJhcnkoYXNzZXJ0cikNCg0KI2luc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikNCmxpYnJhcnkobHVicmlkYXRlKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikNCmxpYnJhcnkocmVhZHhsKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygiZm9yY2F0cyIpDQpsaWJyYXJ5KGZvcmNhdHMpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJ2aXNkYXQiKQ0KbGlicmFyeSh2aXNkYXQpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJzdHJpbmdkaXN0IikNCmxpYnJhcnkoc3RyaW5nZGlzdCkNCg0KI2luc3RhbGwucGFja2FnZXMoImZ1enp5am9pbiIpDQpsaWJyYXJ5KGZ1enp5am9pbikNCg0KI2luc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQpsaWJyYXJ5KGdhcG1pbmRlcikNCg0KI2luc3RhbGwucGFja2FnZXMoImUxMDcxIikNCmxpYnJhcnkoZTEwNzEpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhc2V0cyIpDQpsaWJyYXJ5KGRhdGFzZXRzKQ0KDQpgYGANCg0KDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBEYXJrOyI+MS4JVGhlIGZvbGxvd2luZyB0YWJsZSBjb250YWlucyB0aGUgYWdlcyBvZiBwZW9wbGUgd2hvIGFyZSBmcmVxdWVudCBjdXN0b21lcnMgb2YgYSB2ZWdldGFyaWFuIHJlc3RhdXJhbnQuIFdpdGggdGhpcyBkYXRhLCBjYWxjdWxhdGU6Ojwvc3Bhbj4NCmEpCVRoZSBtZWFuDQpiKQlUaGUgbWVkaWFuDQpjKQlUaGUgbW9kZQ0KZCkJVGhlIGZyZXF1ZW5jeSBoaXN0b2dyYW0NCg0KDQp8IDI4IHwgMjMgfCAzMSB8IDMxIHwgMjEgfA0KfC0tLS18LS0tLXwtLS0tfC0tLS18LS0tLXwNCnwgMzAgfCAyOCB8IDIzIHwgMjkgfCAzNiB8DQp8IDM2IHwgMzEgfCAyOCB8IDI4IHwgNDAgfA0KfCAyMiB8IDIxIHwgMjggfCAyOCB8IDMxIHwNCg0KDQpgYGB7cn0NCiMgRGF0b3MgZGUgbGEgdGFibGEgZGUgYXJyaWJhDQphZ2VzIDwtIGMoMjgsIDIzLCAzMSwgMzEsIDIxLCAzMCwgMjgsIDIzLCAyOSwgMzYsIDM2LCAzMSwgMjgsIDI4LCA0MCwgMjIsIDIxLCAyOCwgMjgsIDMxKQ0KDQpgYGANCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGFyazsiPmEpCVRoZSBtZWFuPC9zcGFuPg0KYGBge3J9DQptZWFuIDwtIG1lYW4oYWdlcykNCnByaW50KG1lYW4pDQpgYGANCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZGFyazsiPmIpCVRoZSBtZWRpYW48L3NwYW4+DQpgYGB7cn0NCm1lZGlhbiA8LSBtZWRpYW4oYWdlcykNCnByaW50KG1lZGlhbikNCmBgYA0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkYXJrOyI+YykJVGhlIG1vZGU8L3NwYW4+DQpgYGB7cn0NCm1vZG8gPC0gYWdlcyAlPiUNCiAgdGFibGUoKSAlPiUNCiAgd2hpY2gubWF4KCkgJT4lDQogIG5hbWVzKCkgJT4lDQogIGFzLm51bWVyaWMoKQ0KcHJpbnQobW9kbykNCmBgYA0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkYXJrOyI+ZCkJVGhlIGZyZXF1ZW5jeSBoaXN0b2dyYW08L3NwYW4+IA0KDQpgYGB7cn0NCmdncGxvdChkYXRhLmZyYW1lKGFnZXMpLCBhZXMoeCA9IGFnZXMpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMiwgZmlsbCA9ICJibHVlIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKw0KICBsYWJzKHRpdGxlID0gImZyZXF1ZW5jeSBoaXN0b2dyYW0iLCB4ID0gImFnZXMiLCB5ID0gImZyZXF1ZW5jeSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IERhcms7Ij4yLglXaXRoIHRoZSBkYXRhIGluIHRoZSB0YWJsZSBhYm92ZSwgZGV0ZXJtaW5lIHRoZSB2YXJpYW5jZSBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLjwvc3Bhbj4NCg0KYGBge3J9DQojIHZhcmlhbmNlDQp2YXJpYW56YSA8LSB2YXIoYWdlcykNCnByaW50KHZhcmlhbnphKQ0KDQojIHN0YW5kYXJkIGRldmlhdGlvbg0KZGVzdmlhY2lvbl9lc3RhbmRhciA8LSBzZChhZ2VzKQ0KcHJpbnQoZGVzdmlhY2lvbl9lc3RhbmRhcikNCg0KYGBgDQoNCg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogRGFyazsiPjMuCVVzaW5nIHRoZSBtZWFuIGFuZCB0d28gc3RhbmRhcmQgZGV2aWF0aW9uLCBkZXRlcm1pbmUgdGhlIENoZWJ5c2hldiBpbnRlcnZhbCBhbmQgaW50ZXJwcmV0IGl0cyBtZWFuaW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9ibGVtLiA8L3NwYW4+DQoNCmBgYHtyfQ0KayA8LSAyDQpsaW1pdGVfaW5mZXJpb3IgPC0gbWVkaWFuIC0gayAqIGRlc3ZpYWNpb25fZXN0YW5kYXINCmxpbWl0ZV9zdXBlcmlvciA8LSBtZWRpYW4gKyBrICogZGVzdmlhY2lvbl9lc3RhbmRhcg0KcHJpbnQocGFzdGUoIkVsIGludGVydmFsbyBkZSBDaGVieXNoZXYgcGFyYSBrPTIgZXM6IiwgbGltaXRlX2luZmVyaW9yLCAiYSIsIGxpbWl0ZV9zdXBlcmlvcikpDQpgYGANClRoaXMgbWVhbnMgdGhhdCwgYWNjb3JkaW5nIHRvIENoZWJ5c2hldidzIHRoZW9yZW0sIGF0IGxlYXN0IDc1JSBvZiB0aGUgYWdlIHZhbHVlcyB3aWxsIGZhbGwgd2l0aGluIHRoaXMgcmFuZ2Ugb2YgMTMuMDMgdG8gNDMuMjcgeWVhcnMuDQoNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IERhcms7Ij40LglFeHBsYWluIHdoYXQgdGhlIENlbnRyYWwgVGVuZGVuY3kgbWVhc3VyZXMgaW5kaWNhdGUgYW5kIHdoYXQgdGhlIGRpc3BlcnNpb24gbWVhc3VyZXMgaW5kaWNhdGUuPC9zcGFuPg0KDQpNZWFzdXJlcyBvZiBDZW50cmFsIFRlbmRlbmN5Og0KTWVhbjogSXQncyB0aGUgYXZlcmFnZS4gSXQgdGVsbHMgeW91IHRoZSAidHlwaWNhbCIgb3IgbW9zdCBjb21tb24gdmFsdWUgb2YgdGhlIGRhdGEuDQoNCk1lZGlhbjogSXQncyB0aGUgbWlkZGxlIHZhbHVlIHdoZW4gdGhlIGRhdGEgaXMgc29ydGVkLiBJdCBzcGxpdHMgdGhlIGRhdGEgaW50byB0d28gZXF1YWwgcGFydHMuDQoNCk1vZGU6IEl0J3MgdGhlIHZhbHVlIHRoYXQgYXBwZWFycyB0aGUgbW9zdCBpbiB0aGUgZGF0YS4NCg0KV2hhdCBkbyB0aGV5IGluZGljYXRlPzogVGhlc2UgbWVhc3VyZXMgZ2l2ZSB5b3UgYW4gaWRlYSBvZiB3aGF0IHRoZSBtb3N0IHR5cGljYWwgb3IgY29tbW9uIHZhbHVlIGluIHRoZSBkYXRhIHNldCBpcy4NCg0KTWVhc3VyZXMgb2YgRGlzcGVyc2lvbjoNClZhcmlhbmNlOiBJdCBtZWFzdXJlcyBob3cgc3ByZWFkIG91dCB0aGUgZGF0YSBpcy4gSWYgaXTigJlzIGhpZ2gsIHRoZSBkYXRhIHBvaW50cyBhcmUgZmFyIGFwYXJ0Lg0KDQpTdGFuZGFyZCBEZXZpYXRpb246IEl04oCZcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHZhcmlhbmNlIGFuZCBhbHNvIG1lYXN1cmVzIGhvdyBzcHJlYWQgb3V0IHRoZSBkYXRhIGlzLCBidXQgaW4gdGhlIHNhbWUgdW5pdHMgYXMgdGhlIGRhdGEuDQoNCldoYXQgZG8gdGhleSBpbmRpY2F0ZT86IFRoZXNlIG1lYXN1cmVzIHNob3cgeW91IGhvdyAic3ByZWFkIG91dCIgb3IgImdyb3VwZWQgdG9nZXRoZXIiIHRoZSBkYXRhIGlzIGFyb3VuZCB0aGUgbWVhbi4gSWYgdGhleeKAmXJlIGxvdywgdGhlIGRhdGEgaXMgY2xvc2UgdG8gdGhlIG1lYW47IGlmIHRoZXnigJlyZSBoaWdoLCB0aGUgZGF0YSBpcyBtb3JlIHNwcmVhZCBvdXQuDQoNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IERhcms7Ij41LglVc2luZyB0aGUgZGF0YSBmcm9tIHRoZSBkYXRhYmFzZSB0aXRsZWQgUE9QIEJFVkVSQUdFUyBDT05TVU1QVElPTiBTVVJWRVksIHVzZSBFWENFTCB0byBkZXRlcm1pbmUsIGZvciBlYWNoIGFnZSBjYXRlZ29yeSBvZiBjb25zdW1lcnMsIHRoZSBmb2xsb3dpbmcgYWJvdXQgdGhlIEdsYXNzZXMgb2Ygc29mdCBkcmluayBwZXIgZGF5Ojwvc3Bhbj4NCg0KYGBge3J9DQpydXRhX2FyY2hpdm8gPC0gZmlsZS5jaG9vc2UoKQ0KcG9wPC0gcmVhZF9leGNlbChydXRhX2FyY2hpdm8pDQpwb3A8LSBhcy5kYXRhLmZyYW1lKHBvcCkNCg0KeW91dGhfcnVyYWwgPC0gcmVhZF9leGNlbChydXRhX2FyY2hpdm8sIHNoZWV0ID0gIllvdXRoIFJ1cmFsIiwgc2tpcCA9IDIpDQp5b3V0aF91cmJhbiA8LSByZWFkX2V4Y2VsKHJ1dGFfYXJjaGl2bywgc2hlZXQgPSAiWW91dGggVXJiYW4iLCBza2lwID0gMikNCmFkdWx0c19ydXJhbCA8LSByZWFkX2V4Y2VsKHJ1dGFfYXJjaGl2bywgc2hlZXQgPSAiMjAtNDAgUnVyYWwiLCBza2lwID0gMikNCmFkdWx0c191cmJhbiA8LSByZWFkX2V4Y2VsKHJ1dGFfYXJjaGl2bywgc2hlZXQgPSAiMjAtNDAgVXJiYW4iLCBza2lwID0gMikNCnNlbmlvcnNfcnVyYWwgPC0gcmVhZF9leGNlbChydXRhX2FyY2hpdm8sIHNoZWV0ID0gIjQwLTYwIFJ1cmFsIiwgc2tpcCA9IDIpDQpzZW5pb3JzX3VyYmFuIDwtIHJlYWRfZXhjZWwocnV0YV9hcmNoaXZvLCBzaGVldCA9ICI0MC02MCBVcmJhbiIsIHNraXAgPSAyKQ0KYGBgDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IERhcms7Ij5hKQlUaGUgaGlzdG9ncmFtIGZyZXF1ZW5jeSBmb3IgZWFjaCBhZ2UgY2F0ZWdvcnkgaW4gcnVyYWwgYXJlYSBhbmQgdGhlIGJpYXMgcHJlc2VudGVkIGJ5IHRoZSBkYXRhIGZyb20gdGhlIGdyYXBoIGNvbXBhcmluZyB0aGUgbWVhbiB0byB0aGUgbWVkaWFuPC9zcGFuPg0KDQoNCmBgYHtyfQ0KcGxvdF9oaXN0b2dyYW0gPC0gZnVuY3Rpb24oZGYsIHRpdGxlKSB7DQogIG1lYW5fdmFsdWUgPC0gbWVhbihkZiRgR2xhc3NlcyBvZiBzb2Z0IGRyaW5rIGEgZGF5YCwgbmEucm0gPSBUUlVFKQ0KICBtZWRpYW5fdmFsdWUgPC0gbWVkaWFuKGRmJGBHbGFzc2VzIG9mIHNvZnQgZHJpbmsgYSBkYXlgLCBuYS5ybSA9IFRSVUUpDQogIHNrZXduZXNzIDwtIG1lYW5fdmFsdWUgLSBtZWRpYW5fdmFsdWUNCiAgDQogIHAgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IGBHbGFzc2VzIG9mIHNvZnQgZHJpbmsgYSBkYXlgKSkgKw0KICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjcsIGNvbG9yID0gImJsYWNrIikgKw0KICAgIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuX3ZhbHVlKSwgY29sb3IgPSAicmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVkaWFuX3ZhbHVlKSwgY29sb3IgPSAiZ3JlZW4iLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMSkgKw0KICAgIGxhYnModGl0bGUgPSB0aXRsZSwgeCA9ICJTb2Z0IGRyaW5rIGdsYXNzZXMgcGVyIGRheSIsIHkgPSAiRnJlcXVlbmN5IikgKw0KICAgIHRoZW1lX21pbmltYWwoKQ0KICANCiAgcmV0dXJuKGxpc3QocGxvdCA9IHAsIHNrZXduZXNzID0gc2tld25lc3MpKQ0KfQ0KYGBgDQoNCmBgYHtyfQ0KaGlzdF95b3V0aF9ydXJhbCA8LSBwbG90X2hpc3RvZ3JhbSh5b3V0aF9ydXJhbCwgIkNvbnN1bW8gZGUgcmVmcmVzY28gLSBKw7N2ZW5lcyAoUnVyYWwpIikNCmhpc3RfYWR1bHRzX3J1cmFsIDwtIHBsb3RfaGlzdG9ncmFtKGFkdWx0c19ydXJhbCwgIkNvbnN1bW8gZGUgcmVmcmVzY28gLSBBZHVsdG9zIChSdXJhbCkiKQ0KaGlzdF9zZW5pb3JzX3J1cmFsIDwtIHBsb3RfaGlzdG9ncmFtKHNlbmlvcnNfcnVyYWwsICJDb25zdW1vIGRlIHJlZnJlc2NvIC0gTWF5b3JlcyAoUnVyYWwpIikNCg0KcHJpbnQoaGlzdF95b3V0aF9ydXJhbCRwbG90KQ0KcHJpbnQoaGlzdF9hZHVsdHNfcnVyYWwkcGxvdCkNCnByaW50KGhpc3Rfc2VuaW9yc19ydXJhbCRwbG90KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogRGFyazsiPmIpCVRoZSBoaXN0b2dyYW0gZnJlcXVlbmN5IGZvciBlYWNoIGFnZSBjYXRlZ29yeSBpbiB1cmJhbiBhcmVhIGFuZCB0aGUgYmlhcyBwcmVzZW50ZWQgYnkgdGhlIGRhdGEgZnJvbSB0aGUgZ3JhcGggY29tcGFyaW5nIHRoZSBtZWFuIHRvIHRoZSBtZWRpYW48L3NwYW4+DQoNCmBgYHtyfQ0KaGlzdF95b3V0aF91cmJhbiA8LSBwbG90X2hpc3RvZ3JhbSh5b3V0aF91cmJhbiwgIlNvZnQgRHJpbmsgQ29uc3VtcHRpb24gLSBZb3V0aCAoVXJiYW4pIikNCmhpc3RfYWR1bHRzX3VyYmFuIDwtIHBsb3RfaGlzdG9ncmFtKGFkdWx0c191cmJhbiwgIlNvZnQgRHJpbmsgQ29uc3VtcHRpb24gLSBBZHVsdHMgKFVyYmFuKSIpDQpoaXN0X3NlbmlvcnNfdXJiYW4gPC0gcGxvdF9oaXN0b2dyYW0oc2VuaW9yc191cmJhbiwgIlNvZnQgRHJpbmsgQ29uc3VtcHRpb24gLSBTZW5pb3JzIChVcmJhbikiKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KcHJpbnQoaGlzdF95b3V0aF91cmJhbiRwbG90KQ0KcHJpbnQoaGlzdF9hZHVsdHNfdXJiYW4kcGxvdCkNCnByaW50KGhpc3Rfc2VuaW9yc191cmJhbiRwbG90KQ0KYGBgDQoNCmBgYHtyfQ0Kc2tld25lc3NfY29tcGFyaXNvbiA8LSBkYXRhLmZyYW1lKA0KICBDYXRlZ29yeSA9IGMoIllvdXRoIiwgIllvdXRoIiwgIkFkdWx0cyIsICJBZHVsdHMiLCAiU2VuaW9ycyIsICJTZW5pb3JzIiksDQogIEFyZWEgPSBjKCJSdXJhbCIsICJVcmJhbiIsICJSdXJhbCIsICJVcmJhbiIsICJSdXJhbCIsICJVcmJhbiIpLA0KICBTa2V3bmVzcyA9IGMoaGlzdF95b3V0aF9ydXJhbCRza2V3bmVzcywgaGlzdF95b3V0aF91cmJhbiRza2V3bmVzcywgDQogICAgICAgICAgICAgICBoaXN0X2FkdWx0c19ydXJhbCRza2V3bmVzcywgaGlzdF9hZHVsdHNfdXJiYW4kc2tld25lc3MsIA0KICAgICAgICAgICAgICAgaGlzdF9zZW5pb3JzX3J1cmFsJHNrZXduZXNzLCBoaXN0X3NlbmlvcnNfdXJiYW4kc2tld25lc3MpDQopDQoNCnByaW50KHNrZXduZXNzX2NvbXBhcmlzb24pDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBEYXJrOyI+Ni4JV2l0aCBhbGwgdGhlIGRhdGEgcmVsYXRlZCB0byB0aGUgY29uc3VtcHRpb24gaW4gcnVyYWwgYXJlYSBhbmQgaW4gdXJiYW4gYXJlYSwgZmluZDo8L3NwYW4+DQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IERhcms7Ij5hKQlUaGUgZnJlcXVlbmN5IGhpc3RvZ3JhbSBvZiB0aGUgcnVyYWwgYXJlYS4gPC9zcGFuPg0KDQpgYGB7cn0NCnJ1cmFsX2RhdGEgPC0gYmluZF9yb3dzKHlvdXRoX3J1cmFsLCBhZHVsdHNfcnVyYWwsIHNlbmlvcnNfcnVyYWwpDQpoaXN0X3J1cmFsIDwtIHBsb3RfaGlzdG9ncmFtKHJ1cmFsX2RhdGEsICJTb2Z0IERyaW5rIENvbnN1bXB0aW9uIC0gUnVyYWwgQXJlYSIpDQpwcmludChoaXN0X3J1cmFsJHBsb3QpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBEYXJrOyI+YikJVGhlIGZyZXF1ZW5jeSBoaXN0b2dyYW0gb2YgdGhlIHVyYmFuIGFyZWEuIDwvc3Bhbj4NCmBgYHtyfQ0KDQp1cmJhbl9kYXRhIDwtIGJpbmRfcm93cyh5b3V0aF91cmJhbiwgYWR1bHRzX3VyYmFuLCBzZW5pb3JzX3VyYmFuKQ0KaGlzdF91cmJhbiA8LSBwbG90X2hpc3RvZ3JhbSh1cmJhbl9kYXRhLCAiU29mdCBEcmluayBDb25zdW1wdGlvbiAtIFVyYmFuIEFyZWEiKQ0KcHJpbnQoaGlzdF91cmJhbiRwbG90KQ0KYGBgDQoNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBEYXJrOyI+YykJV2hhdCBhcmUgdGhlIG1haW4gZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdXJiYW4gYW5kIHJ1cmFsIGFyZWE/PC9zcGFuPg0KDQpgYGB7cn0NCmRpZmZfbWVhbiA8LSBtZWFuKHVyYmFuX2RhdGEkYEdsYXNzZXMgb2Ygc29mdCBkcmluayBhIGRheWAsIG5hLnJtID0gVFJVRSkgLSBtZWFuKHJ1cmFsX2RhdGEkYEdsYXNzZXMgb2Ygc29mdCBkcmluayBhIGRheWAsIG5hLnJtID0gVFJVRSkNCmRpZmZfbWVkaWFuIDwtIG1lZGlhbih1cmJhbl9kYXRhJGBHbGFzc2VzIG9mIHNvZnQgZHJpbmsgYSBkYXlgLCBuYS5ybSA9IFRSVUUpIC0gbWVkaWFuKHJ1cmFsX2RhdGEkYEdsYXNzZXMgb2Ygc29mdCBkcmluayBhIGRheWAsIG5hLnJtID0gVFJVRSkNCg0KZGlmZl9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIE1ldHJpYyA9IGMoIk1lYW4gRGlmZmVyZW5jZSIsICJNZWRpYW4gRGlmZmVyZW5jZSIpLA0KICBWYWx1ZSA9IGMoZGlmZl9tZWFuLCBkaWZmX21lZGlhbikNCikNCg0KcHJpbnQoZGlmZl9zdW1tYXJ5KQ0KDQpgYGANCg0KDQoNCg0K