Original Report
Summary
This report examines and expands on Yiping Su’s Project 2, which
investigated how customer ratings vary across different product lines.
Understanding these differences can help identify areas for improvement
and inform strategies in marketing and product development. In my
analysis, I aim to replicate and build upon Su’s original research
question by incorporating both visualizations and statistical tests to
reassess the conclusions.
Initial Data Analysis
(IDA)
The dataset, sourced from @kaggle_supermarket_sales, includes 1,000
transactions from three supermarket branches over three months (January
to March 2019). It contains details on customer
demographics, transaction amounts, and
customer satisfaction ratings. For this report, I will
only keep the Ratings and Product.line
columns, as they are directly relevant to the analysis.
Libraries
#Load all libraries
library(tidyverse)
library(knitr)
library(ggridges)
Initalizing
Dataset
# Import dataset
sales_data <- read.csv("~/Documents/MATH1115/Project 2/Supermarket Sales Data.csv")
Data Cleaning:
# Keep only the 'Rating' and 'Product.line' columns in sales_data
sales_data_clean <- sales_data[, c("Rating", "Product.line")]
Data Exploration:
Research
Question:
How does customer satisfaction differ across product
lines?
Distribution of
Ratings:
To understand customer satisfaction across different product lines, I
used a ridge plot to visualize the distribution of ratings across each
category. This plot provides insight into where customer satisfaction is
concentrated as the plot shows the distribution of ratings for each
product line. This helps to not only see the average rating but also
whether certain product lines tend to receive higher or lower ratings
overall.
# Ridge plot of customer ratings by product line
ggplot(sales_data_clean, aes(x = Rating, y = Product.line, fill = Product.line)) +
geom_density_ridges(scale = 0.9, alpha = 0.6) +
labs(
title = "Customer Ratings Distribution by Product Line",
x = "Rating",
y = "Product Line"
) +
theme_minimal() +
theme(legend.position = "none")

Findings from rating
distribution:
Each curve represents a product line and shows where customer ratings
are concentrated, providing insights into the shape and spread of
ratings across categories.
Ratings for Sports and Travel and Food
and Beverages are concentrated towards the higher end of the
scale, suggesting typically positive customer satisfaction.
Home and Lifestyle have a more even spread of
ratings, indicating mixed customer experiences.
Health and Beauty and Electronic
Accessories show a wide spread, with slight peaks at higher
ratings.
These trends suggest that certain product lines may have more
variation in ratings than others. Next, I will use statistical tests to
determine if these visual differences are significant.
Visualization:
Customer Ratings by product line
While the ridge plot highlights the distribution of ratings,
examining average satisfaction levels can also provide valuable insight.
By plotting the mean ratings with a bar plot, direct comparison of
satisfaction levels across product lines is simplified.
# Calculate mean and standard error for each product line
summary_stats <- sales_data_clean %>%
group_by(Product.line) %>%
summarize(
mean_rating = mean(Rating),
se = sd(Rating) / sqrt(n())
)
# Create the improved bar plot with enhanced error bars
ggplot(summary_stats, aes(x = Product.line, y = mean_rating, fill = Product.line)) +
geom_bar(stat = "identity", color = "black") +
geom_errorbar(aes(ymin = mean_rating - se, ymax = mean_rating + se),
width = 0.2, size = 0.8, color = "black") + # Increase width, size, and set color
geom_text(aes(label = round(mean_rating, 2)), vjust = -1, size = 3.5, color = "black") +
scale_fill_brewer(palette = "Set3") + # Use a color palette
labs(
title = "Average Customer Ratings by Product Line",
x = "Product Line",
y = "Mean Customer Rating"
) +
ylim(0, 7.5) + # Adjust y-axis range to focus on relevant data range
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
axis.text.y = element_text(size = 10),
axis.title = element_text(size = 12),
plot.title = element_text(size = 14, face = "bold"),
legend.position = "none" # Remove legend if not needed
)

This bar plot shows the average customer ratings for each product
line, with error bars representing the standard error.
However, to confirm if these differences are meaningful, I conducted
statistical tests.
Hypothesis Testing:
Differences in customer rating across product line
To assess whether the differences in average ratings across product
lines are statistically significant, I conducted an ANOVA test.
anova_result <- aov(Rating ~ Product.line, data = sales_data_clean)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Product.line 5 8 1.598 0.54 0.746
## Residuals 994 2943 2.960
An ANOVA test was conducted to confirm the visual
findings. The results, with a p-value of 0.746,
indicated no statistically significant differences in customer ratings
across product lines.
Tukey Post-Hoc Test
(for pairwise comparisons):
# Tukey post-hoc test
tukey_result <- TukeyHSD(anova_result)
print(tukey_result)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Rating ~ Product.line, data = sales_data_clean)
##
## $Product.line
## diff lwr upr
## Fashion accessories-Electronic accessories 0.104507601 -0.4223276 0.6313428
## Food and beverages-Electronic accessories 0.188512508 -0.3412726 0.7182976
## Health and beauty-Electronic accessories 0.078583591 -0.4698213 0.6269885
## Home and lifestyle-Electronic accessories -0.087205882 -0.6283241 0.4539123
## Sports and travel-Electronic accessories -0.008440822 -0.5444976 0.5276159
## Food and beverages-Fashion accessories 0.084004908 -0.4397237 0.6077336
## Health and beauty-Fashion accessories -0.025924009 -0.5684803 0.5166323
## Home and lifestyle-Fashion accessories -0.191713483 -0.7269035 0.3434765
## Sports and travel-Fashion accessories -0.112948423 -0.6430203 0.4171235
## Health and beauty-Food and beverages -0.109928917 -0.6553501 0.4354923
## Home and lifestyle-Food and beverages -0.275718391 -0.8138125 0.2623757
## Sports and travel-Food and beverages -0.196953331 -0.7299573 0.3360506
## Home and lifestyle-Health and beauty -0.165789474 -0.7222254 0.3906464
## Sports and travel-Health and beauty -0.087024413 -0.6385394 0.4644906
## Sports and travel-Home and lifestyle 0.078765060 -0.4655049 0.6230350
## p adj
## Fashion accessories-Electronic accessories 0.9931366
## Food and beverages-Electronic accessories 0.9126782
## Health and beauty-Electronic accessories 0.9985315
## Home and lifestyle-Electronic accessories 0.9974214
## Sports and travel-Electronic accessories 1.0000000
## Food and beverages-Fashion accessories 0.9974789
## Health and beauty-Fashion accessories 0.9999934
## Home and lifestyle-Fashion accessories 0.9103561
## Sports and travel-Fashion accessories 0.9904450
## Health and beauty-Food and beverages 0.9926104
## Home and lifestyle-Food and beverages 0.6879939
## Sports and travel-Food and beverages 0.8988551
## Home and lifestyle-Health and beauty 0.9577532
## Sports and travel-Health and beauty 0.9976685
## Sports and travel-Home and lifestyle 0.9984600
A Tukey’s HSD test was conducted to compare each pair of product
lines. None of the comparisons showed significant p-values, confirming
there are no significant differences in customer ratings between any
pair of product lines.
Conclusion
In this analysis, I revisited the research question, “How do customer
ratings vary across different product lines?” posed in Yiping Su’s
Project 2. In comparison to Su’s approach, which relied on a boxplot for
visual analysis, my analysis incorporated statistical tests (ANOVA and
Tukey’s HSD) to validate whether observed differences in ratings were
statistically significant.
Su concluded that Health and Beauty and Fashion and Accessories had
the highest customer ratings, which somewhat aligns with results from my
visualizations. However, my analysis reveals that these differences are
not statistically significant. The ANOVA test yielded a high p-value
(0.746), indicating no meaningful variation in satisfaction across
product lines. The Tukey’s HSD test further confirmed this by showing no
significant differences in any pairwise comparisons between product
lines.
These findings suggest that customer satisfaction is generally
consistent across all product lines, contrasting with Su’s initial
interpretation. The additional statistical tests in this report provide
a more reliable basis for concluding that customer satisfaction does not
significantly vary across categories. As a result, a uniform approach to
enhancing customer satisfaction may be more appropriate than focusing on
specific product categories.
LS0tCnRpdGxlOiAiUHJvamVjdCAyOiBJbnRlcnJvZ2F0aW9uIgphdXRob3I6ICI1MzA1MDYzNjgiCnN1YnRpdGxlOiAiTUFUSDExMTUgUHJvamVjdCAyOiBJbnRlcnJvZ2F0aW9uIgpkYXRlOiAiVW5pdmVyc2l0eSBvZiBTeWRuZXkgfCBNQVRIMTExNSB8IExBQiBGMDcuMDMuMzUzIHwgV2VkIDExOjAwIHwgYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiAlWScpYCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9mb2xkaW5nOiBoaWRlICAjIGRvbid0IGNoYW5nZSB0aGlzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlICMgZW1iZWQgLlJtZCBmaWxlCiAgICB0b2M6IHRydWUgICMgdGFibGUgb2YgY29udGVudHMKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlICMgdG9jIGlzIGFsd2F5cyB2aXNpYmxlIHdoZW4gc2Nyb2xsZWQKICAgIG51bWJlcl9zZWN0aW9uOiB0cnVlICMgYWRkIHNlY3Rpb24gbnVtYmVycyB0byBoZWFkaW5ncwogICAgdGhlbWU6CiAgICAgIGJvb3Rzd2F0Y2g6ICJzaW1wbGV4IiAjIGNoZWNrIGh0dHBzOi8vYm9vdHN3YXRjaC5jb20vIAogICAgICBiYXNlX2ZvbnQ6CiAgICAgICAgZ29vZ2xlOiBQcm9tcHQgIyBzZWxlY3QgYW55IEdvb2dsZSBGb250CiAgICAgIGhlYWRpbmdfZm9udDoKICAgICAgICBnb29nbGU6IFByb3phIExpYnJlICMgc2VsZWN0IGFueSBHb29nbGUgRm9udAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQppZiAocmVxdWlyZU5hbWVzcGFjZSgidGhlbWF0aWMiKSkgCiAgdGhlbWF0aWM6OnRoZW1hdGljX3JtZChmb250ID0gImF1dG8iKQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGZpZy5zaG93dGV4dCA9IFRSVUUpCmBgYAoKIyBPcmlnaW5hbCBSZXBvcnQgU3VtbWFyeQoKVGhpcyByZXBvcnQgZXhhbWluZXMgYW5kIGV4cGFuZHMgb24gWWlwaW5nIFN1J3MgUHJvamVjdCAyLCB3aGljaCBpbnZlc3RpZ2F0ZWQgaG93IGN1c3RvbWVyIHJhdGluZ3MgdmFyeSBhY3Jvc3MgZGlmZmVyZW50IHByb2R1Y3QgbGluZXMuIFVuZGVyc3RhbmRpbmcgdGhlc2UgZGlmZmVyZW5jZXMgY2FuIGhlbHAgaWRlbnRpZnkgYXJlYXMgZm9yIGltcHJvdmVtZW50IGFuZCBpbmZvcm0gc3RyYXRlZ2llcyBpbiBtYXJrZXRpbmcgYW5kIHByb2R1Y3QgZGV2ZWxvcG1lbnQuIEluIG15IGFuYWx5c2lzLCBJIGFpbSB0byByZXBsaWNhdGUgYW5kIGJ1aWxkIHVwb24gU3UncyBvcmlnaW5hbCByZXNlYXJjaCBxdWVzdGlvbiBieSBpbmNvcnBvcmF0aW5nIGJvdGggdmlzdWFsaXphdGlvbnMgYW5kIHN0YXRpc3RpY2FsIHRlc3RzIHRvIHJlYXNzZXNzIHRoZSBjb25jbHVzaW9ucy4KCiMgSW5pdGlhbCBEYXRhIEFuYWx5c2lzIChJREEpCgpUaGUgZGF0YXNldCwgc291cmNlZCBmcm9tIEBrYWdnbGVfc3VwZXJtYXJrZXRfc2FsZXMsIGluY2x1ZGVzIDEsMDAwIHRyYW5zYWN0aW9ucyBmcm9tIHRocmVlIHN1cGVybWFya2V0IGJyYW5jaGVzIG92ZXIgdGhyZWUgbW9udGhzIChKYW51YXJ5IHRvIE1hcmNoIDIwMTkpLiBJdCBjb250YWlucyBkZXRhaWxzIG9uICoqY3VzdG9tZXIgZGVtb2dyYXBoaWNzKiosICoqdHJhbnNhY3Rpb24gYW1vdW50cyoqLCBhbmQgKipjdXN0b21lciBzYXRpc2ZhY3Rpb24gcmF0aW5ncyoqLiBGb3IgdGhpcyByZXBvcnQsIEkgd2lsbCBvbmx5IGtlZXAgdGhlICoqUmF0aW5ncyoqIGFuZCAqKlByb2R1Y3QubGluZSoqIGNvbHVtbnMsIGFzIHRoZXkgYXJlIGRpcmVjdGx5IHJlbGV2YW50IHRvIHRoZSBhbmFseXNpcy4KCiMjIExpYnJhcmllcwoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CiNMb2FkIGFsbCBsaWJyYXJpZXMgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdncmlkZ2VzKQpgYGAKCiMjIEluaXRhbGl6aW5nIERhdGFzZXQKCmBgYHtyfQojIEltcG9ydCBkYXRhc2V0CnNhbGVzX2RhdGEgPC0gcmVhZC5jc3YoIn4vRG9jdW1lbnRzL01BVEgxMTE1L1Byb2plY3QgMi9TdXBlcm1hcmtldCBTYWxlcyBEYXRhLmNzdiIpCmBgYAoKIyMjIERhdGEgQ2xlYW5pbmc6CgpgYGB7cn0KIyBLZWVwIG9ubHkgdGhlICdSYXRpbmcnIGFuZCAnUHJvZHVjdC5saW5lJyBjb2x1bW5zIGluIHNhbGVzX2RhdGEKc2FsZXNfZGF0YV9jbGVhbiA8LSBzYWxlc19kYXRhWywgYygiUmF0aW5nIiwgIlByb2R1Y3QubGluZSIpXQpgYGAKCiMgRGF0YSBFeHBsb3JhdGlvbjoKCiMjIFJlc2VhcmNoIFF1ZXN0aW9uOgoKKkhvdyBkb2VzIGN1c3RvbWVyIHNhdGlzZmFjdGlvbiBkaWZmZXIgYWNyb3NzIHByb2R1Y3QgbGluZXM/KgoKIyMgRGlzdHJpYnV0aW9uIG9mIFJhdGluZ3M6CgpUbyB1bmRlcnN0YW5kIGN1c3RvbWVyIHNhdGlzZmFjdGlvbiBhY3Jvc3MgZGlmZmVyZW50IHByb2R1Y3QgbGluZXMsIEkgdXNlZCBhIHJpZGdlIHBsb3QgdG8gdmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb24gb2YgcmF0aW5ncyBhY3Jvc3MgZWFjaCBjYXRlZ29yeS4gVGhpcyBwbG90IHByb3ZpZGVzIGluc2lnaHQgaW50byB3aGVyZSBjdXN0b21lciBzYXRpc2ZhY3Rpb24gaXMgY29uY2VudHJhdGVkIGFzIHRoZSBwbG90IHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgcmF0aW5ncyBmb3IgZWFjaCBwcm9kdWN0IGxpbmUuIFRoaXMgaGVscHMgdG8gbm90IG9ubHkgc2VlIHRoZSBhdmVyYWdlIHJhdGluZyBidXQgYWxzbyB3aGV0aGVyIGNlcnRhaW4gcHJvZHVjdCBsaW5lcyB0ZW5kIHRvIHJlY2VpdmUgaGlnaGVyIG9yIGxvd2VyIHJhdGluZ3Mgb3ZlcmFsbC4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgUmlkZ2UgcGxvdCBvZiBjdXN0b21lciByYXRpbmdzIGJ5IHByb2R1Y3QgbGluZQpnZ3Bsb3Qoc2FsZXNfZGF0YV9jbGVhbiwgYWVzKHggPSBSYXRpbmcsIHkgPSBQcm9kdWN0LmxpbmUsIGZpbGwgPSBQcm9kdWN0LmxpbmUpKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhzY2FsZSA9IDAuOSwgYWxwaGEgPSAwLjYpICsKICBsYWJzKAogICAgdGl0bGUgPSAiQ3VzdG9tZXIgUmF0aW5ncyBEaXN0cmlidXRpb24gYnkgUHJvZHVjdCBMaW5lIiwKICAgIHggPSAiUmF0aW5nIiwKICAgIHkgPSAiUHJvZHVjdCBMaW5lIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCiMjIEZpbmRpbmdzIGZyb20gcmF0aW5nIGRpc3RyaWJ1dGlvbjoKCkVhY2ggY3VydmUgcmVwcmVzZW50cyBhIHByb2R1Y3QgbGluZSBhbmQgc2hvd3Mgd2hlcmUgY3VzdG9tZXIgcmF0aW5ncyBhcmUgY29uY2VudHJhdGVkLCBwcm92aWRpbmcgaW5zaWdodHMgaW50byB0aGUgc2hhcGUgYW5kIHNwcmVhZCBvZiByYXRpbmdzIGFjcm9zcyBjYXRlZ29yaWVzLgoKLSAgIFJhdGluZ3MgZm9yICoqU3BvcnRzIGFuZCBUcmF2ZWwqKiBhbmQgKipGb29kIGFuZCBCZXZlcmFnZXMqKiBhcmUgY29uY2VudHJhdGVkIHRvd2FyZHMgdGhlIGhpZ2hlciBlbmQgb2YgdGhlIHNjYWxlLCBzdWdnZXN0aW5nIHR5cGljYWxseSBwb3NpdGl2ZSBjdXN0b21lciBzYXRpc2ZhY3Rpb24uCgotICAgKipIb21lIGFuZCBMaWZlc3R5bGUqKiBoYXZlIGEgbW9yZSBldmVuIHNwcmVhZCBvZiByYXRpbmdzLCBpbmRpY2F0aW5nIG1peGVkIGN1c3RvbWVyIGV4cGVyaWVuY2VzLgoKLSAgICoqSGVhbHRoIGFuZCBCZWF1dHkqKiBhbmQgKipFbGVjdHJvbmljIEFjY2Vzc29yaWVzKiogc2hvdyBhIHdpZGUgc3ByZWFkLCB3aXRoIHNsaWdodCBwZWFrcyBhdCBoaWdoZXIgcmF0aW5ncy4KClRoZXNlIHRyZW5kcyBzdWdnZXN0IHRoYXQgY2VydGFpbiBwcm9kdWN0IGxpbmVzIG1heSBoYXZlIG1vcmUgdmFyaWF0aW9uIGluIHJhdGluZ3MgdGhhbiBvdGhlcnMuIE5leHQsIEkgd2lsbCB1c2Ugc3RhdGlzdGljYWwgdGVzdHMgdG8gZGV0ZXJtaW5lIGlmIHRoZXNlIHZpc3VhbCBkaWZmZXJlbmNlcyBhcmUgc2lnbmlmaWNhbnQuCgojIyBWaXN1YWxpemF0aW9uOiBDdXN0b21lciBSYXRpbmdzIGJ5IHByb2R1Y3QgbGluZQoKV2hpbGUgdGhlIHJpZGdlIHBsb3QgaGlnaGxpZ2h0cyB0aGUgZGlzdHJpYnV0aW9uIG9mIHJhdGluZ3MsIGV4YW1pbmluZyBhdmVyYWdlIHNhdGlzZmFjdGlvbiBsZXZlbHMgY2FuIGFsc28gcHJvdmlkZSB2YWx1YWJsZSBpbnNpZ2h0LiBCeSBwbG90dGluZyB0aGUgbWVhbiByYXRpbmdzIHdpdGggYSBiYXIgcGxvdCwgZGlyZWN0IGNvbXBhcmlzb24gb2Ygc2F0aXNmYWN0aW9uIGxldmVscyBhY3Jvc3MgcHJvZHVjdCBsaW5lcyBpcyBzaW1wbGlmaWVkLgoKYGBge3J9CiMgQ2FsY3VsYXRlIG1lYW4gYW5kIHN0YW5kYXJkIGVycm9yIGZvciBlYWNoIHByb2R1Y3QgbGluZQpzdW1tYXJ5X3N0YXRzIDwtIHNhbGVzX2RhdGFfY2xlYW4gJT4lCiAgZ3JvdXBfYnkoUHJvZHVjdC5saW5lKSAlPiUKICBzdW1tYXJpemUoCiAgICBtZWFuX3JhdGluZyA9IG1lYW4oUmF0aW5nKSwKICAgIHNlID0gc2QoUmF0aW5nKSAvIHNxcnQobigpKQogICkKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQojIENyZWF0ZSB0aGUgaW1wcm92ZWQgYmFyIHBsb3Qgd2l0aCBlbmhhbmNlZCBlcnJvciBiYXJzCmdncGxvdChzdW1tYXJ5X3N0YXRzLCBhZXMoeCA9IFByb2R1Y3QubGluZSwgeSA9IG1lYW5fcmF0aW5nLCBmaWxsID0gUHJvZHVjdC5saW5lKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbl9yYXRpbmcgLSBzZSwgeW1heCA9IG1lYW5fcmF0aW5nICsgc2UpLCAKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yLCBzaXplID0gMC44LCBjb2xvciA9ICJibGFjayIpICsgICMgSW5jcmVhc2Ugd2lkdGgsIHNpemUsIGFuZCBzZXQgY29sb3IKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobWVhbl9yYXRpbmcsIDIpKSwgdmp1c3QgPSAtMSwgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKyAgIyBVc2UgYSBjb2xvciBwYWxldHRlCiAgbGFicygKICAgIHRpdGxlID0gIkF2ZXJhZ2UgQ3VzdG9tZXIgUmF0aW5ncyBieSBQcm9kdWN0IExpbmUiLAogICAgeCA9ICJQcm9kdWN0IExpbmUiLAogICAgeSA9ICJNZWFuIEN1c3RvbWVyIFJhdGluZyIKICApICsKICB5bGltKDAsIDcuNSkgKyAgIyBBZGp1c3QgeS1heGlzIHJhbmdlIHRvIGZvY3VzIG9uIHJlbGV2YW50IGRhdGEgcmFuZ2UKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTApLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiAgIyBSZW1vdmUgbGVnZW5kIGlmIG5vdCBuZWVkZWQKICApCgpgYGAKClRoaXMgYmFyIHBsb3Qgc2hvd3MgdGhlIGF2ZXJhZ2UgY3VzdG9tZXIgcmF0aW5ncyBmb3IgZWFjaCBwcm9kdWN0IGxpbmUsIHdpdGggZXJyb3IgYmFycyByZXByZXNlbnRpbmcgdGhlIHN0YW5kYXJkIGVycm9yLgoKLSAgICJIZWFsdGggYW5kIEJlYXV0eSIgYW5kICJGb29kIGFuZCBCZXZlcmFnZXMiIHRlbmQgdG8gaGF2ZSBzbGlnaHRseSBoaWdoZXIgYXZlcmFnZSByYXRpbmdzCgotICAgIkhvbWUgYW5kIExpZmVzdHlsZSIgc2hvd3MgYSBsb3dlciBhdmVyYWdlLgoKSG93ZXZlciwgdG8gY29uZmlybSBpZiB0aGVzZSBkaWZmZXJlbmNlcyBhcmUgbWVhbmluZ2Z1bCwgSSBjb25kdWN0ZWQgc3RhdGlzdGljYWwgdGVzdHMuCgojIyBIeXBvdGhlc2lzIFRlc3Rpbmc6IERpZmZlcmVuY2VzIGluIGN1c3RvbWVyIHJhdGluZyBhY3Jvc3MgcHJvZHVjdCBsaW5lCgpUbyBhc3Nlc3Mgd2hldGhlciB0aGUgZGlmZmVyZW5jZXMgaW4gYXZlcmFnZSByYXRpbmdzIGFjcm9zcyBwcm9kdWN0IGxpbmVzIGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCBJIGNvbmR1Y3RlZCBhbiBBTk9WQSB0ZXN0LgoKYGBge3J9CmFub3ZhX3Jlc3VsdCA8LSBhb3YoUmF0aW5nIH4gUHJvZHVjdC5saW5lLCBkYXRhID0gc2FsZXNfZGF0YV9jbGVhbikKc3VtbWFyeShhbm92YV9yZXN1bHQpCmBgYAoKQW4gKipBTk9WQSB0ZXN0Kiogd2FzIGNvbmR1Y3RlZCB0byBjb25maXJtIHRoZSB2aXN1YWwgZmluZGluZ3MuIFRoZSByZXN1bHRzLCB3aXRoIGEgKipwLXZhbHVlIG9mIDAuNzQ2KiosIGluZGljYXRlZCBubyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIGN1c3RvbWVyIHJhdGluZ3MgYWNyb3NzIHByb2R1Y3QgbGluZXMuCgojIyBUdWtleSBQb3N0LUhvYyBUZXN0IChmb3IgcGFpcndpc2UgY29tcGFyaXNvbnMpOgoKYGBge3J9CiMgVHVrZXkgcG9zdC1ob2MgdGVzdAp0dWtleV9yZXN1bHQgPC0gVHVrZXlIU0QoYW5vdmFfcmVzdWx0KQpwcmludCh0dWtleV9yZXN1bHQpCmBgYAoKQSBUdWtleSdzIEhTRCB0ZXN0IHdhcyBjb25kdWN0ZWQgdG8gY29tcGFyZSBlYWNoIHBhaXIgb2YgcHJvZHVjdCBsaW5lcy4gTm9uZSBvZiB0aGUgY29tcGFyaXNvbnMgc2hvd2VkIHNpZ25pZmljYW50IHAtdmFsdWVzLCBjb25maXJtaW5nIHRoZXJlIGFyZSBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiBjdXN0b21lciByYXRpbmdzIGJldHdlZW4gYW55IHBhaXIgb2YgcHJvZHVjdCBsaW5lcy4KCiMgS2V5IEluc2lnaHRzOgoKQmFzZWQgb24gdGhpcyBhbmFseXNpcywgY3VzdG9tZXIgcmF0aW5ncyBkbyBub3QgdmFyeSBzaWduaWZpY2FudGx5IGFjcm9zcyBkaWZmZXJlbnQgcHJvZHVjdCBsaW5lcy4KCiMgQ29uY2x1c2lvbgoKSW4gdGhpcyBhbmFseXNpcywgSSByZXZpc2l0ZWQgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uLCAiSG93IGRvIGN1c3RvbWVyIHJhdGluZ3MgdmFyeSBhY3Jvc3MgZGlmZmVyZW50IHByb2R1Y3QgbGluZXM/IiBwb3NlZCBpbiBZaXBpbmcgU3UncyBQcm9qZWN0IDIuIEluIGNvbXBhcmlzb24gdG8gU3UncyBhcHByb2FjaCwgd2hpY2ggcmVsaWVkIG9uIGEgYm94cGxvdCBmb3IgdmlzdWFsIGFuYWx5c2lzLCBteSBhbmFseXNpcyBpbmNvcnBvcmF0ZWQgc3RhdGlzdGljYWwgdGVzdHMgKEFOT1ZBIGFuZCBUdWtleSdzIEhTRCkgdG8gdmFsaWRhdGUgd2hldGhlciBvYnNlcnZlZCBkaWZmZXJlbmNlcyBpbiByYXRpbmdzIHdlcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4KClN1IGNvbmNsdWRlZCB0aGF0IEhlYWx0aCBhbmQgQmVhdXR5IGFuZCBGYXNoaW9uIGFuZCBBY2Nlc3NvcmllcyBoYWQgdGhlIGhpZ2hlc3QgY3VzdG9tZXIgcmF0aW5ncywgd2hpY2ggc29tZXdoYXQgYWxpZ25zIHdpdGggcmVzdWx0cyBmcm9tIG15IHZpc3VhbGl6YXRpb25zLiBIb3dldmVyLCBteSBhbmFseXNpcyByZXZlYWxzIHRoYXQgdGhlc2UgZGlmZmVyZW5jZXMgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBUaGUgQU5PVkEgdGVzdCB5aWVsZGVkIGEgaGlnaCBwLXZhbHVlICgwLjc0NiksIGluZGljYXRpbmcgbm8gbWVhbmluZ2Z1bCB2YXJpYXRpb24gaW4gc2F0aXNmYWN0aW9uIGFjcm9zcyBwcm9kdWN0IGxpbmVzLiBUaGUgVHVrZXkncyBIU0QgdGVzdCBmdXJ0aGVyIGNvbmZpcm1lZCB0aGlzIGJ5IHNob3dpbmcgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgaW4gYW55IHBhaXJ3aXNlIGNvbXBhcmlzb25zIGJldHdlZW4gcHJvZHVjdCBsaW5lcy4KClRoZXNlIGZpbmRpbmdzIHN1Z2dlc3QgdGhhdCBjdXN0b21lciBzYXRpc2ZhY3Rpb24gaXMgZ2VuZXJhbGx5IGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBwcm9kdWN0IGxpbmVzLCBjb250cmFzdGluZyB3aXRoIFN1J3MgaW5pdGlhbCBpbnRlcnByZXRhdGlvbi4gVGhlIGFkZGl0aW9uYWwgc3RhdGlzdGljYWwgdGVzdHMgaW4gdGhpcyByZXBvcnQgcHJvdmlkZSBhIG1vcmUgcmVsaWFibGUgYmFzaXMgZm9yIGNvbmNsdWRpbmcgdGhhdCBjdXN0b21lciBzYXRpc2ZhY3Rpb24gZG9lcyBub3Qgc2lnbmlmaWNhbnRseSB2YXJ5IGFjcm9zcyBjYXRlZ29yaWVzLiBBcyBhIHJlc3VsdCwgYSB1bmlmb3JtIGFwcHJvYWNoIHRvIGVuaGFuY2luZyBjdXN0b21lciBzYXRpc2ZhY3Rpb24gbWF5IGJlIG1vcmUgYXBwcm9wcmlhdGUgdGhhbiBmb2N1c2luZyBvbiBzcGVjaWZpYyBwcm9kdWN0IGNhdGVnb3JpZXMuCg==