We are considering a data set to answer some follow on questions
about that data set. We are considering this data based on a
Satisfaction Survey:
Find the mean and median satisfaction ratings
# Creating the dataset
RespondentID <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
Age <- c(25, 34, 28, 45, 30, 22, 40, 35, 29, 50, 31, 38, 27, 42, 26, 33, 39, 28, 46, 31)
Gender <- c("Female", "Male", "Non-binary", "Male", "Female", "Female", "Male", "Non-binary", "Female", "Male",
"Female", "Male", "Female", "Non-binary", "Male", "Female", "Male", "Female", "Non-binary", "Male")
Satisfaction <- c(8, 6, 7, 5, 9, 7, 4, 6, 8, 7, 9, 6, 7, 8, 5, 8, 7, 6, 7, 5)
Department <- c("HR", "IT", "Finance", "Marketing", "HR", "IT", "Finance", "Marketing", "HR", "Finance",
"Marketing", "IT", "HR", "Finance", "Marketing", "IT", "HR", "Finance", "Marketing", "IT")
# Combining into a data frame
data <- data.frame(RespondentID, Age, Gender, Satisfaction, Department)
# Calculating mean and median satisfaction
mean_satisfaction <- mean(data$Satisfaction)
median_satisfaction <- median(data$Satisfaction)
# Printing the results
cat("Mean Satisfaction:", mean_satisfaction, "\n")
Mean Satisfaction: 6.75
cat("Median Satisfaction:", median_satisfaction, "\n")
Median Satisfaction: 7
We want to know the average ages of respondents in the HR
department.
# Create a vector of ages for respondents in the 'HR' department
hr_ages <- data$Age[data$Department == 'HR']
# Compute the average age of respondents in the 'HR' department
average_age_hr <- mean(hr_ages)
# Print the average age
average_age_hr
[1] 30
# Convert the Age and Satisfaction columns into a matrix
age_satisfaction_matrix <- as.matrix(data[, c("Age", "Satisfaction")])
# Create a data frame from the matrix to compute mean satisfaction by age group
age_groups <- cut(age_satisfaction_matrix[, 1], breaks = seq(20, 60, by = 10), right = FALSE)
mean_satisfaction_by_age_group <- tapply(age_satisfaction_matrix[, 2], age_groups, mean)
# Print the mean satisfaction rating for each age group
mean_satisfaction_by_age_group
[20,30) [30,40) [40,50) [50,60)
6.857143 7.000000 6.000000 7.000000
After learning the mean satisfaction rating for each age group, we
want to know the mean satisfaction rating by department.
# Assuming the 'data' data frame is already created
# Calculate mean satisfaction ratings by department
mean_satisfaction <- aggregate(Satisfaction ~ Department, data = data, FUN = mean)
# Convert the result to a matrix
satisfaction_matrix <- as.matrix(mean_satisfaction[, -1])
rownames(satisfaction_matrix) <- mean_satisfaction$Department
# Display the matrix
print(satisfaction_matrix)
[,1]
Finance 6.4
HR 7.8
IT 6.4
Marketing 6.4
We want to know how many rows and columns are in the data frame.
# Get the number of rows and columns
dimensions <- dim(data)
rows <- dimensions[1]
cols <- dimensions[2]
# Summary of Gender and Department columns
gender_summary <- summary(data$Gender)
department_summary <- summary(data$Department)
# Print the results
print(paste("Number of rows:", rows))
[1] "Number of rows: 20"
print(paste("Number of columns:", cols))
[1] "Number of columns: 5"
print("Summary of Gender:")
[1] "Summary of Gender:"
print(gender_summary)
Length Class Mode
20 character character
print("Summary of Department:")
[1] "Summary of Department:"
print(department_summary)
Length Class Mode
20 character character
We want to find the average satisfaction rate of those aged
30-40.
# Assuming the 'data' data frame is already created
# Filter the data frame for respondents aged between 30 and 40
filtered_data <- subset(data, Age >= 30 & Age <= 40)
# Calculate the average satisfaction rating for this age group
average_satisfaction <- mean(filtered_data$Satisfaction)
# Print the average satisfaction rating
print(paste("Average satisfaction rating for respondents aged 30 to 40:", average_satisfaction))
[1] "Average satisfaction rating for respondents aged 30 to 40: 6.66666666666667"
We want a histogram of the age column.
# Load necessary library for visualization
library(ggplot2)
# Create a histogram of the Age column
ggplot(data, aes(x = Age)) +
geom_histogram(binwidth = 5, fill = "blue", color = "black", alpha = 0.7) +
labs(title = "Histogram of Ages", x = "Age", y = "Frequency") +
theme_minimal()

We want a histogram based off the Satisfaction Ratings
# Load necessary library for visualization
library(ggplot2)
# Create a histogram of the Satisfaction ratings
ggplot(data, aes(x = Satisfaction)) +
geom_histogram(binwidth = 1, fill = "green", color = "black", alpha = 0.7) +
labs(title = "Histogram of Satisfaction Ratings", x = "Satisfaction Rating", y = "Frequency") +
theme_minimal()

library(ggplot2)
# Create the boxplot
ggplot(data, aes(x = Department, y = Satisfaction)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Boxplot of Satisfaction Ratings by Department",
x = "Department",
y = "Satisfaction Rating") +
theme_minimal()

We want to create box plots from the data frames given for
satisfaction by department. Now we want a second boxplot based off age
by gender.
# Load necessary library
library(ggplot2)
# Create the boxplot for Age by Gender
ggplot(data, aes(x = Gender, y = Age)) +
geom_boxplot(fill = "lightgreen") +
labs(title = "Boxplot of Age by Gender",
x = "Gender",
y = "Age") +
theme_minimal()

We now need to identify outliers using the IQR method.
# Create the data frame
data <- data.frame(
Satisfaction = c(8, 6, 7, 5, 9, 7, 4, 6, 8, 7, 9, 6, 7, 8, 5, 8, 7, 6, 7, 5)
)
# Calculate Q1 and Q3
Q1 <- quantile(data$Satisfaction, 0.25)
Q3 <- quantile(data$Satisfaction, 0.75)
# Calculate IQR
IQR_value <- IQR(data$Satisfaction)
# Determine outlier thresholds
lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value
# Identify outliers
outliers <- data$Satisfaction[data$Satisfaction < lower_bound | data$Satisfaction > upper_bound]
# Print outliers
print(outliers)
numeric(0)
Using a boxplot, we need to identify any outliers in Satisfaction
ratings.
# Load necessary library
library(ggplot2)
# Create boxplot
ggplot(data, aes(x = Department, y = Satisfaction)) +
geom_boxplot() +
labs(title = "Boxplot of Satisfaction Ratings by Department",
x = "Department",
y = "Satisfaction Rating") +
theme_minimal()

We want to show linear regression to predict Satisfaction based on
Age.
# Fit the linear regression model
model <- lm(Satisfaction ~ Age, data = data)
# Summary of the model
summary(model)
Call:
lm(formula = Satisfaction ~ Age, data = data)
Residuals:
Min 1Q Median 3Q Max
-2.54574 -0.79895 0.03224 0.98160 2.15040
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.89620 1.42944 5.524 3.03e-05 ***
Age -0.03376 0.04111 -0.821 0.422
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.384 on 18 degrees of freedom
Multiple R-squared: 0.03612, Adjusted R-squared: -0.01743
F-statistic: 0.6746 on 1 and 18 DF, p-value: 0.4222
We want to create a scatter plot with a regression line. We want to
find the relationship between Satisfaction and Age.
# Load necessary library
library(ggplot2)
# Create scatter plot with regression line
ggplot(data, aes(x = Age, y = Satisfaction)) +
geom_point() + # Add points for the scatter plot
geom_smooth(method = "lm", se = FALSE, color = "blue") + # Add the regression line
labs(title = "Scatter Plot of Age vs. Satisfaction",
x = "Age",
y = "Satisfaction Rating") +
theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

LS0tDQp0aXRsZTogIlByZXNlbnRhdGlvbiAzIEpvc2UgU2FsYXphciINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCldlIGFyZSBjb25zaWRlcmluZyBhIGRhdGEgc2V0IHRvIGFuc3dlciBzb21lIGZvbGxvdyBvbiBxdWVzdGlvbnMgYWJvdXQgdGhhdCBkYXRhIHNldC4NCldlIGFyZSBjb25zaWRlcmluZyB0aGlzIGRhdGEgYmFzZWQgb24gYSBTYXRpc2ZhY3Rpb24gU3VydmV5Og0KDQpGaW5kIHRoZSBtZWFuIGFuZCBtZWRpYW4gc2F0aXNmYWN0aW9uIHJhdGluZ3MgDQoNCmBgYHtyfQ0KIyBDcmVhdGluZyB0aGUgZGF0YXNldA0KUmVzcG9uZGVudElEIDwtIGMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwKQ0KQWdlIDwtIGMoMjUsIDM0LCAyOCwgNDUsIDMwLCAyMiwgNDAsIDM1LCAyOSwgNTAsIDMxLCAzOCwgMjcsIDQyLCAyNiwgMzMsIDM5LCAyOCwgNDYsIDMxKQ0KR2VuZGVyIDwtIGMoIkZlbWFsZSIsICJNYWxlIiwgIk5vbi1iaW5hcnkiLCAiTWFsZSIsICJGZW1hbGUiLCAiRmVtYWxlIiwgIk1hbGUiLCAiTm9uLWJpbmFyeSIsICJGZW1hbGUiLCAiTWFsZSIsIA0KICAgICAgICAgICAgIkZlbWFsZSIsICJNYWxlIiwgIkZlbWFsZSIsICJOb24tYmluYXJ5IiwgIk1hbGUiLCAiRmVtYWxlIiwgIk1hbGUiLCAiRmVtYWxlIiwgIk5vbi1iaW5hcnkiLCAiTWFsZSIpDQpTYXRpc2ZhY3Rpb24gPC0gYyg4LCA2LCA3LCA1LCA5LCA3LCA0LCA2LCA4LCA3LCA5LCA2LCA3LCA4LCA1LCA4LCA3LCA2LCA3LCA1KQ0KRGVwYXJ0bWVudCA8LSBjKCJIUiIsICJJVCIsICJGaW5hbmNlIiwgIk1hcmtldGluZyIsICJIUiIsICJJVCIsICJGaW5hbmNlIiwgIk1hcmtldGluZyIsICJIUiIsICJGaW5hbmNlIiwNCiAgICAgICAgICAgICAgICAiTWFya2V0aW5nIiwgIklUIiwgIkhSIiwgIkZpbmFuY2UiLCAiTWFya2V0aW5nIiwgIklUIiwgIkhSIiwgIkZpbmFuY2UiLCAiTWFya2V0aW5nIiwgIklUIikNCg0KIyBDb21iaW5pbmcgaW50byBhIGRhdGEgZnJhbWUNCmRhdGEgPC0gZGF0YS5mcmFtZShSZXNwb25kZW50SUQsIEFnZSwgR2VuZGVyLCBTYXRpc2ZhY3Rpb24sIERlcGFydG1lbnQpDQoNCiMgQ2FsY3VsYXRpbmcgbWVhbiBhbmQgbWVkaWFuIHNhdGlzZmFjdGlvbg0KbWVhbl9zYXRpc2ZhY3Rpb24gPC0gbWVhbihkYXRhJFNhdGlzZmFjdGlvbikNCm1lZGlhbl9zYXRpc2ZhY3Rpb24gPC0gbWVkaWFuKGRhdGEkU2F0aXNmYWN0aW9uKQ0KDQojIFByaW50aW5nIHRoZSByZXN1bHRzDQpjYXQoIk1lYW4gU2F0aXNmYWN0aW9uOiIsIG1lYW5fc2F0aXNmYWN0aW9uLCAiXG4iKQ0KY2F0KCJNZWRpYW4gU2F0aXNmYWN0aW9uOiIsIG1lZGlhbl9zYXRpc2ZhY3Rpb24sICJcbiIpDQoNCmBgYA0KV2Ugd2FudCB0byBrbm93IHRoZSBhdmVyYWdlIGFnZXMgb2YgcmVzcG9uZGVudHMgaW4gdGhlIEhSIGRlcGFydG1lbnQuDQpgYGB7cn0NCiMgQ3JlYXRlIGEgdmVjdG9yIG9mIGFnZXMgZm9yIHJlc3BvbmRlbnRzIGluIHRoZSAnSFInIGRlcGFydG1lbnQNCmhyX2FnZXMgPC0gZGF0YSRBZ2VbZGF0YSREZXBhcnRtZW50ID09ICdIUiddDQoNCiMgQ29tcHV0ZSB0aGUgYXZlcmFnZSBhZ2Ugb2YgcmVzcG9uZGVudHMgaW4gdGhlICdIUicgZGVwYXJ0bWVudA0KYXZlcmFnZV9hZ2VfaHIgPC0gbWVhbihocl9hZ2VzKQ0KDQojIFByaW50IHRoZSBhdmVyYWdlIGFnZQ0KYXZlcmFnZV9hZ2VfaHINCg0KYGBgDQpgYGB7cn0NCiMgQ29udmVydCB0aGUgQWdlIGFuZCBTYXRpc2ZhY3Rpb24gY29sdW1ucyBpbnRvIGEgbWF0cml4DQphZ2Vfc2F0aXNmYWN0aW9uX21hdHJpeCA8LSBhcy5tYXRyaXgoZGF0YVssIGMoIkFnZSIsICJTYXRpc2ZhY3Rpb24iKV0pDQoNCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSBmcm9tIHRoZSBtYXRyaXggdG8gY29tcHV0ZSBtZWFuIHNhdGlzZmFjdGlvbiBieSBhZ2UgZ3JvdXANCmFnZV9ncm91cHMgPC0gY3V0KGFnZV9zYXRpc2ZhY3Rpb25fbWF0cml4WywgMV0sIGJyZWFrcyA9IHNlcSgyMCwgNjAsIGJ5ID0gMTApLCByaWdodCA9IEZBTFNFKQ0KbWVhbl9zYXRpc2ZhY3Rpb25fYnlfYWdlX2dyb3VwIDwtIHRhcHBseShhZ2Vfc2F0aXNmYWN0aW9uX21hdHJpeFssIDJdLCBhZ2VfZ3JvdXBzLCBtZWFuKQ0KDQojIFByaW50IHRoZSBtZWFuIHNhdGlzZmFjdGlvbiByYXRpbmcgZm9yIGVhY2ggYWdlIGdyb3VwDQptZWFuX3NhdGlzZmFjdGlvbl9ieV9hZ2VfZ3JvdXANCg0KYGBgDQpBZnRlciBsZWFybmluZyB0aGUgbWVhbiBzYXRpc2ZhY3Rpb24gcmF0aW5nIGZvciBlYWNoIGFnZSBncm91cCwgd2Ugd2FudCB0byBrbm93IHRoZSBtZWFuIHNhdGlzZmFjdGlvbiByYXRpbmcgYnkgZGVwYXJ0bWVudC4NCmBgYHtyfQ0KIyBBc3N1bWluZyB0aGUgJ2RhdGEnIGRhdGEgZnJhbWUgaXMgYWxyZWFkeSBjcmVhdGVkDQoNCiMgQ2FsY3VsYXRlIG1lYW4gc2F0aXNmYWN0aW9uIHJhdGluZ3MgYnkgZGVwYXJ0bWVudA0KbWVhbl9zYXRpc2ZhY3Rpb24gPC0gYWdncmVnYXRlKFNhdGlzZmFjdGlvbiB+IERlcGFydG1lbnQsIGRhdGEgPSBkYXRhLCBGVU4gPSBtZWFuKQ0KDQojIENvbnZlcnQgdGhlIHJlc3VsdCB0byBhIG1hdHJpeA0Kc2F0aXNmYWN0aW9uX21hdHJpeCA8LSBhcy5tYXRyaXgobWVhbl9zYXRpc2ZhY3Rpb25bLCAtMV0pDQpyb3duYW1lcyhzYXRpc2ZhY3Rpb25fbWF0cml4KSA8LSBtZWFuX3NhdGlzZmFjdGlvbiREZXBhcnRtZW50DQoNCiMgRGlzcGxheSB0aGUgbWF0cml4DQpwcmludChzYXRpc2ZhY3Rpb25fbWF0cml4KQ0KYGBgDQpXZSB3YW50IHRvIGtub3cgaG93IG1hbnkgcm93cyBhbmQgY29sdW1ucyBhcmUgaW4gdGhlIGRhdGEgZnJhbWUuDQpgYGB7cn0NCiMgR2V0IHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucw0KZGltZW5zaW9ucyA8LSBkaW0oZGF0YSkNCnJvd3MgPC0gZGltZW5zaW9uc1sxXQ0KY29scyA8LSBkaW1lbnNpb25zWzJdDQoNCiMgU3VtbWFyeSBvZiBHZW5kZXIgYW5kIERlcGFydG1lbnQgY29sdW1ucw0KZ2VuZGVyX3N1bW1hcnkgPC0gc3VtbWFyeShkYXRhJEdlbmRlcikNCmRlcGFydG1lbnRfc3VtbWFyeSA8LSBzdW1tYXJ5KGRhdGEkRGVwYXJ0bWVudCkNCg0KIyBQcmludCB0aGUgcmVzdWx0cw0KcHJpbnQocGFzdGUoIk51bWJlciBvZiByb3dzOiIsIHJvd3MpKQ0KcHJpbnQocGFzdGUoIk51bWJlciBvZiBjb2x1bW5zOiIsIGNvbHMpKQ0KcHJpbnQoIlN1bW1hcnkgb2YgR2VuZGVyOiIpDQpwcmludChnZW5kZXJfc3VtbWFyeSkNCnByaW50KCJTdW1tYXJ5IG9mIERlcGFydG1lbnQ6IikNCnByaW50KGRlcGFydG1lbnRfc3VtbWFyeSkNCg0KYGBgDQpXZSB3YW50IHRvIGZpbmQgdGhlIGF2ZXJhZ2Ugc2F0aXNmYWN0aW9uIHJhdGUgb2YgdGhvc2UgYWdlZCAzMC00MC4NCmBgYHtyfQ0KIyBBc3N1bWluZyB0aGUgJ2RhdGEnIGRhdGEgZnJhbWUgaXMgYWxyZWFkeSBjcmVhdGVkDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZyYW1lIGZvciByZXNwb25kZW50cyBhZ2VkIGJldHdlZW4gMzAgYW5kIDQwDQpmaWx0ZXJlZF9kYXRhIDwtIHN1YnNldChkYXRhLCBBZ2UgPj0gMzAgJiBBZ2UgPD0gNDApDQoNCiMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIHNhdGlzZmFjdGlvbiByYXRpbmcgZm9yIHRoaXMgYWdlIGdyb3VwDQphdmVyYWdlX3NhdGlzZmFjdGlvbiA8LSBtZWFuKGZpbHRlcmVkX2RhdGEkU2F0aXNmYWN0aW9uKQ0KDQojIFByaW50IHRoZSBhdmVyYWdlIHNhdGlzZmFjdGlvbiByYXRpbmcNCnByaW50KHBhc3RlKCJBdmVyYWdlIHNhdGlzZmFjdGlvbiByYXRpbmcgZm9yIHJlc3BvbmRlbnRzIGFnZWQgMzAgdG8gNDA6IiwgYXZlcmFnZV9zYXRpc2ZhY3Rpb24pKQ0KDQpgYGANCldlIHdhbnQgYSBoaXN0b2dyYW0gb2YgdGhlIGFnZSBjb2x1bW4uDQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeSBmb3IgdmlzdWFsaXphdGlvbg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWF0ZSBhIGhpc3RvZ3JhbSBvZiB0aGUgQWdlIGNvbHVtbg0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gQWdlKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUsIGZpbGwgPSAiYmx1ZSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gb2YgQWdlcyIsIHggPSAiQWdlIiwgeSA9ICJGcmVxdWVuY3kiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQpXZSB3YW50IGEgaGlzdG9ncmFtIGJhc2VkIG9mZiB0aGUgU2F0aXNmYWN0aW9uIFJhdGluZ3MNCmBgYHtyfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJ5IGZvciB2aXN1YWxpemF0aW9uDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgQ3JlYXRlIGEgaGlzdG9ncmFtIG9mIHRoZSBTYXRpc2ZhY3Rpb24gcmF0aW5ncw0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gU2F0aXNmYWN0aW9uKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEsIGZpbGwgPSAiZ3JlZW4iLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC43KSArDQogIGxhYnModGl0bGUgPSAiSGlzdG9ncmFtIG9mIFNhdGlzZmFjdGlvbiBSYXRpbmdzIiwgeCA9ICJTYXRpc2ZhY3Rpb24gUmF0aW5nIiwgeSA9ICJGcmVxdWVuY3kiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWF0ZSB0aGUgYm94cGxvdA0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gRGVwYXJ0bWVudCwgeSA9IFNhdGlzZmFjdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAibGlnaHRibHVlIikgKw0KICBsYWJzKHRpdGxlID0gIkJveHBsb3Qgb2YgU2F0aXNmYWN0aW9uIFJhdGluZ3MgYnkgRGVwYXJ0bWVudCIsDQogICAgICAgeCA9ICJEZXBhcnRtZW50IiwNCiAgICAgICB5ID0gIlNhdGlzZmFjdGlvbiBSYXRpbmciKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCldlIHdhbnQgdG8gY3JlYXRlIGJveCBwbG90cyBmcm9tIHRoZSBkYXRhIGZyYW1lcyBnaXZlbiBmb3Igc2F0aXNmYWN0aW9uIGJ5IGRlcGFydG1lbnQuIE5vdyB3ZSB3YW50IGEgc2Vjb25kIGJveHBsb3QgYmFzZWQgb2ZmIGFnZSBieSBnZW5kZXIuDQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWF0ZSB0aGUgYm94cGxvdCBmb3IgQWdlIGJ5IEdlbmRlcg0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gR2VuZGVyLCB5ID0gQWdlKSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICJsaWdodGdyZWVuIikgKw0KICBsYWJzKHRpdGxlID0gIkJveHBsb3Qgb2YgQWdlIGJ5IEdlbmRlciIsDQogICAgICAgeCA9ICJHZW5kZXIiLA0KICAgICAgIHkgPSAiQWdlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQpXZSBub3cgbmVlZCB0byBpZGVudGlmeSBvdXRsaWVycyB1c2luZyB0aGUgSVFSIG1ldGhvZC4NCmBgYHtyfQ0KIyBDcmVhdGUgdGhlIGRhdGEgZnJhbWUNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgU2F0aXNmYWN0aW9uID0gYyg4LCA2LCA3LCA1LCA5LCA3LCA0LCA2LCA4LCA3LCA5LCA2LCA3LCA4LCA1LCA4LCA3LCA2LCA3LCA1KQ0KKQ0KDQojIENhbGN1bGF0ZSBRMSBhbmQgUTMNClExIDwtIHF1YW50aWxlKGRhdGEkU2F0aXNmYWN0aW9uLCAwLjI1KQ0KUTMgPC0gcXVhbnRpbGUoZGF0YSRTYXRpc2ZhY3Rpb24sIDAuNzUpDQoNCiMgQ2FsY3VsYXRlIElRUg0KSVFSX3ZhbHVlIDwtIElRUihkYXRhJFNhdGlzZmFjdGlvbikNCg0KIyBEZXRlcm1pbmUgb3V0bGllciB0aHJlc2hvbGRzDQpsb3dlcl9ib3VuZCA8LSBRMSAtIDEuNSAqIElRUl92YWx1ZQ0KdXBwZXJfYm91bmQgPC0gUTMgKyAxLjUgKiBJUVJfdmFsdWUNCg0KIyBJZGVudGlmeSBvdXRsaWVycw0Kb3V0bGllcnMgPC0gZGF0YSRTYXRpc2ZhY3Rpb25bZGF0YSRTYXRpc2ZhY3Rpb24gPCBsb3dlcl9ib3VuZCB8IGRhdGEkU2F0aXNmYWN0aW9uID4gdXBwZXJfYm91bmRdDQoNCiMgUHJpbnQgb3V0bGllcnMNCnByaW50KG91dGxpZXJzKQ0KDQpgYGANClVzaW5nIGEgYm94cGxvdCwgd2UgbmVlZCB0byBpZGVudGlmeSBhbnkgb3V0bGllcnMgaW4gU2F0aXNmYWN0aW9uIHJhdGluZ3MuDQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWF0ZSBib3hwbG90DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBEZXBhcnRtZW50LCB5ID0gU2F0aXNmYWN0aW9uKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGUgPSAiQm94cGxvdCBvZiBTYXRpc2ZhY3Rpb24gUmF0aW5ncyBieSBEZXBhcnRtZW50IiwNCiAgICAgICB4ID0gIkRlcGFydG1lbnQiLA0KICAgICAgIHkgPSAiU2F0aXNmYWN0aW9uIFJhdGluZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KV2Ugd2FudCB0byBzaG93IGxpbmVhciByZWdyZXNzaW9uIHRvIHByZWRpY3QgU2F0aXNmYWN0aW9uIGJhc2VkIG9uIEFnZS4NCmBgYHtyfQ0KIyBGaXQgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsDQptb2RlbCA8LSBsbShTYXRpc2ZhY3Rpb24gfiBBZ2UsIGRhdGEgPSBkYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsKQ0KDQpgYGANCldlIHdhbnQgdG8gY3JlYXRlIGEgc2NhdHRlciBwbG90IHdpdGggYSByZWdyZXNzaW9uIGxpbmUuIFdlIHdhbnQgdG8gZmluZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gU2F0aXNmYWN0aW9uIGFuZCBBZ2UuDQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENyZWF0ZSBzY2F0dGVyIHBsb3Qgd2l0aCByZWdyZXNzaW9uIGxpbmUNCmdncGxvdChkYXRhLCBhZXMoeCA9IEFnZSwgeSA9IFNhdGlzZmFjdGlvbikpICsNCiAgZ2VvbV9wb2ludCgpICsgICMgQWRkIHBvaW50cyBmb3IgdGhlIHNjYXR0ZXIgcGxvdA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJibHVlIikgKyAgIyBBZGQgdGhlIHJlZ3Jlc3Npb24gbGluZQ0KICBsYWJzKHRpdGxlID0gIlNjYXR0ZXIgUGxvdCBvZiBBZ2UgdnMuIFNhdGlzZmFjdGlvbiIsDQogICAgICAgeCA9ICJBZ2UiLA0KICAgICAgIHkgPSAiU2F0aXNmYWN0aW9uIFJhdGluZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0K