Authors

Executive Statement

Supermarket giants Woolworths and Coles both claim to offer “low priced groceries”.

Woolworths - [link]https://www.youtube.com/watch?v=AfcA00BjMDk
Coles - [link]https://www.youtube.com/watch?v=3B_5XUYPHA8

But, who is cheaper, Woolworths or Coles? The aim of the present study was to investigate whether the prices offered by Coles and Woolworths are significantly different. To achieve this, random sampling of identical items from both supermarkets and hypothesis testing was carried out. Due to the research context of randomly sampling identical items, a paired samples t-test was chosen to test the hypothesis. It was tested at the 0.05 significance level (\(\alpha\) = 0.05). Sampling was carried out by generating a random number in Microsoft Excel and navigating to the corresponding item slot on Coles.com. A search for this item was then carried out on Woolworths.com. If a match was found the item and its non-sale price at both supermarkets was noted. If a match was found but the item was offered in a different weight or volume, price scaling was applied. To make sure the sample was representative, as well as random, ten items were sampled from each grocery category. Fifteen categories exist on the Coles website (eg, drinks, bakery, meat), so a total of 150 observations were obtained. Then, the difference between prices was calculated.

Results indicated that the mean price at Woolworths (M = 11.07, SD = 21.01) was cheaper than Coles (M = 11.58, SD = 21.20). The paired sample t-test showed that the difference in mean price was significant, t(149) = 4.132, p < 0.05. A second analysis was carried out after the removal of an outlier. The mean difference also remained significant, t(148) = 5.312, p < 0.05. To conclude, on average, Woolworths offers cheaper prices than Coles.

Load Packages and Data

#install.packages("readr")
library(readr)
library(dplyr)
#install.packages("car")
library(car)
#install.packages("ggplot2")
library(ggplot2)
Supermarket <- read_csv("C:/Users/olive/Desktop/Uni/First Year/Intro to Stats/Assignment 3/Supermarket_comparison.csv")
Parsed with column specification:
cols(
  Categories = col_character(),
  Products = col_character(),
  Coles = col_double(),
  Woolworths = col_double()
)
Supermarket$dif <- Supermarket$Coles - Supermarket$Woolworths
Super_filter <- filter(Supermarket, dif<15)

Summary Statistics

From a sample of 150 products (n=150) the average price, measured in Australian dollars, of products from Coles was $11.58 (M = 11.58, SD=21.2). The range of product prices was from $1.2 to $199.

Supermarket %>% 
  summarise(Min = min(Coles, na.rm = TRUE),
  Q1 = quantile(Coles, probs = .25, na.rm = TRUE),
  Median = median(Coles, na.rm = TRUE),
  Q3 = quantile(Coles, probs = .75, na.rm = TRUE),
  Max = max(Coles, na.rm = TRUE),
  Mean = mean(Coles, na.rm = TRUE),
  SD = sd(Coles, na.rm = TRUE),
  n = n(),
  Missing = sum(is.na(Coles)))

From a sample of 150 products (n=150) the average price of products from Woolworths was $11.07 (M = 11.07, SD=21.01). The range of product prices was from $1.2 to $199.95.

Supermarket %>% 
  summarise(Min = min(Woolworths, na.rm = TRUE),
  Q1 = quantile(Woolworths, probs = .25, na.rm = TRUE),
  Median = median(Woolworths, na.rm = TRUE),
  Q3 = quantile(Woolworths, probs = .75, na.rm = TRUE),
  Max = max(Woolworths, na.rm = TRUE),
  Mean = mean(Woolworths, na.rm = TRUE),
  SD = sd(Woolworths, na.rm = TRUE),
  n = n(),
  Missing = sum(is.na(Woolworths)))

The mean difference between products sampled from Coles and Woolworths (n=150) was $0.52 (M = 0.52, SD=1.53). The range of difference between product prices was from $-3.17 to $15.

Supermarket %>% 
  summarise(Min = min(dif, na.rm = TRUE),
  Q1 = quantile(dif, probs = .25, na.rm = TRUE),
  Median = median(dif, na.rm = TRUE),
  Q3 = quantile(dif, probs = .75, na.rm = TRUE),
  Max = max(dif, na.rm = TRUE),
  Mean = mean(dif, na.rm = TRUE),
  SD = sd(dif, na.rm = TRUE),
  n = n(),
  Missing = sum(is.na(dif)))

Both Coles and Woolworths prices were positively skewed. Outliers were present in both supermarkets.

boxplot(Supermarket$Coles, Supermarket$Woolworths, main = "Coles & Woolworths prices", ylab = "Price ($)", xlab = "Supermarket") 
axis (1, at= 1:2, labels = c ("Coles", "Woolworths"))

This boxplot identified an extreme outlier among the difference in prices between supermarkets.

boxplot(Supermarket$dif, main = "Difference in price", ylab = "Price ($)", xlab = "Supermarket") 

This data was filtered to reduce the possibility of a type 1 error. The box plot below shows the distribution of the filtered difference in price.

boxplot(Super_filter$dif, main = "Filtered difference in price", ylab = "Price ($)", xlab = "Supermarket") 

This mat plot indicates a general trend towards Woolworths products costing less than matched products at Coles.

matplot(t(data.frame(Supermarket$Coles, Supermarket$Woolworths)),
  type = "b",
  pch = 19,
  col = 1,
  lty = 1,
  xlab = "Supermarket",
  ylab = "Price",
  xaxt = "n")
axis(1, at = 1:2, labels = c("Coles", "Woolworths"))

Hypothesis Test

A paired sample t-test was used to analyse the difference in price between matched products offered by Coles and Woolworths. This hypothesis test was chosen as the analysis was conducted on matched, quantitative, independent observations between Coles and Woolworths.The paired sample t-test assumes that the observations are independent, and that the population mean difference is normally distributed. Due to the large sample size (n=150), the paired sample t-test is robust enough to handle observations that stray from a normally distributed sample. To address an outlier, a second paired sample t-test was used to evaluate the affects of its removal from the dataset. The chosen alpha level for these t-tests was 0.05 (\(\alpha\) = 0.05).

t.test(Supermarket$Coles, Supermarket$Woolworths, paired = TRUE, var.equal = TRUE, alternative = "two.sided") 

    Paired t-test

data:  Supermarket$Coles and Supermarket$Woolworths
t = 4.1317, df = 149, p-value = 5.983e-05
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2689754 0.7620912
sample estimates:
mean of the differences 
              0.5155333 
t.test(Super_filter$Coles, Super_filter$Woolworths, paired = TRUE, var.equal = TRUE, alternative = "two.sided")

    Paired t-test

data:  Super_filter$Coles and Super_filter$Woolworths
t = 5.312, df = 148, p-value = 3.904e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2627023 0.5739420
sample estimates:
mean of the differences 
              0.4183221 

Interpretation

A paired sample t-test was used to statistically investigate the mean price difference between products in Coles and Woolworths (n=150). The null hypothesis was that the price difference between products in Coles and Woolworths is equal to 0; \(H_0\): \(\mu \delta\) = 0. The alternate hypothesis was that the price difference between products in Coles and Woolworths is not equal to 0; \(H_a\): \(\mu \delta \neq\) 0.

The mean difference between Coles and Woolworths products was 0.516 (SD=1.53). The paired-sample t-test found a statistically significant mean difference between Coles and Woolworths prices, t(149)= 4.13, p < .001, 95% C.I [0.27 0.76], suggesting that Coles was more expensive than Woolworths.

To ensure that any outliers did not influence the results of the analyses, another paired sample t-test was conducted with substantial outliers removed (difference scores >15 were removed). The paired-sample t-test with outliers removed also found a statistically significant mean difference between Coles and Woolworths prices, t(148)= 5.31, p < .001, 95% C.I [0.26 0.57], again suggesting that Coles was more expensive than Woolworths.

Discussion

The aim of the current report was to compare the price of products between Coles and Woolworths. 10 products were randomly selected from each category at Coles online store and matched to the equivalent product in Woolworths online store (n=150). A paired sample t-test was then used to statistically investigate the mean price difference between Coles and Woolworths.

The results revealed a statistically significant mean difference between Coles and Woolworths prices, both when outliers were removed and presented. Inspection of the mean difference showed that Coles had a higher average product price than Woolworths. Thus, the current results suggest that products are, on average, more expensive at Coles compared to Woolworths.

The current report had numerous methodological and statistical strengths. Firstly, items were randomly sampled with help from a random number generator in Microsoft excel. Random sampling reduces the risk of sample bias, thus increasing the samples validity in representing the targeted population. Secondly, the current report sampled equivalent products in Coles and Woolworths. This allowed a paired sample t-test to be used in the statistical analysis, reducing potentially confounding variability between products at Coles and Woolworths.

However, despite the aforementioned strengths, the present report had a number of apparent limitations. For instance, the current report only sampled online products, which may not represent prices of in-store products. This issue could be resolved in future research by sampling the prices of products in-store, instead of online. Or, both online and in-store.

Another methodological flaw is that the current report only used equivalent products from both stores. Although this enabled a paired sample t-test to be used, it has resulted in a number of exclusive products (including home brand products) being neglected from the sample. Exclusive products may influence the overall price of products from each store, thus potentially changing the results of the statistical analysis. Perhaps a large scale, randomised two sample t-test could resolve this issue by randomly including exclusive products from Coles and Woolworths.

Nevertheless, the current findings showed that Woolworths prices are significantly lower than Coles prices for matched products. Future research should investigate the price difference between Coles and Woolworths in-store products, as well as sampling store exclusive products. In conclusion, Woolworths has, on average, cheaper prices than Coles.

LS0tDQp0aXRsZTogIlN1cGVybWFya2V0IFByaWNlIFdhcnMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojQXV0aG9ycw0KDQoqIE9saXZlciBFYXRvbiAob2xpdmVyZi5lYXRvbkBnbWFpbC5jb20pDQoqIE1heGltaWxpYW4gSmFjb2JzDQoqIEpvbmF0aGFuIEJyb2Rlcg0KDQojRXhlY3V0aXZlIFN0YXRlbWVudA0KDQoNClN1cGVybWFya2V0IGdpYW50cyBXb29sd29ydGhzIGFuZCBDb2xlcyBib3RoIGNsYWltIHRvIG9mZmVyICJsb3cgcHJpY2VkIGdyb2NlcmllcyIuDQoNCldvb2x3b3J0aHMgLSBbbGlua11odHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUFmY0EwMEJqTURrICAgIA0KQ29sZXMgLSBbbGlua11odHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTNCXzVYVVlQSEE4DQoNCkJ1dCwgd2hvIGlzIGNoZWFwZXIsIFdvb2x3b3J0aHMgb3IgQ29sZXM/IFRoZSBhaW0gb2YgdGhlIHByZXNlbnQgc3R1ZHkgd2FzIHRvIGludmVzdGlnYXRlIHdoZXRoZXIgdGhlIHByaWNlcyBvZmZlcmVkIGJ5IENvbGVzIGFuZCBXb29sd29ydGhzIGFyZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudC4gIFRvIGFjaGlldmUgdGhpcywgcmFuZG9tIHNhbXBsaW5nIG9mIGlkZW50aWNhbCBpdGVtcyBmcm9tIGJvdGggc3VwZXJtYXJrZXRzIGFuZCBoeXBvdGhlc2lzIHRlc3Rpbmcgd2FzIGNhcnJpZWQgb3V0LiBEdWUgdG8gdGhlIHJlc2VhcmNoIGNvbnRleHQgb2YgcmFuZG9tbHkgc2FtcGxpbmcgaWRlbnRpY2FsIGl0ZW1zLCBhIHBhaXJlZCBzYW1wbGVzIHQtdGVzdCB3YXMgY2hvc2VuIHRvIHRlc3QgdGhlIGh5cG90aGVzaXMuIEl0IHdhcyB0ZXN0ZWQgYXQgdGhlIDAuMDUgc2lnbmlmaWNhbmNlIGxldmVsICgkXGFscGhhJCA9ICowLjA1KikuIFNhbXBsaW5nIHdhcyBjYXJyaWVkIG91dCBieSBnZW5lcmF0aW5nIGEgcmFuZG9tIG51bWJlciBpbiBNaWNyb3NvZnQgRXhjZWwgYW5kIG5hdmlnYXRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbSBzbG90IG9uIENvbGVzLmNvbS4gQSBzZWFyY2ggZm9yIHRoaXMgaXRlbSB3YXMgdGhlbiBjYXJyaWVkIG91dCBvbiBXb29sd29ydGhzLmNvbS4gSWYgYSBtYXRjaCB3YXMgZm91bmQgdGhlIGl0ZW0gYW5kIGl0cyBub24tc2FsZSBwcmljZSBhdCBib3RoIHN1cGVybWFya2V0cyB3YXMgbm90ZWQuIElmIGEgbWF0Y2ggd2FzIGZvdW5kIGJ1dCB0aGUgaXRlbSB3YXMgb2ZmZXJlZCBpbiBhIGRpZmZlcmVudCB3ZWlnaHQgb3Igdm9sdW1lLCBwcmljZSBzY2FsaW5nIHdhcyBhcHBsaWVkLiBUbyBtYWtlIHN1cmUgdGhlIHNhbXBsZSB3YXMgcmVwcmVzZW50YXRpdmUsIGFzIHdlbGwgYXMgcmFuZG9tLCB0ZW4gaXRlbXMgd2VyZSBzYW1wbGVkIGZyb20gZWFjaCBncm9jZXJ5IGNhdGVnb3J5LiBGaWZ0ZWVuIGNhdGVnb3JpZXMgZXhpc3Qgb24gdGhlIENvbGVzIHdlYnNpdGUgKGVnLCBkcmlua3MsIGJha2VyeSwgbWVhdCksIHNvIGEgdG90YWwgb2YgMTUwIG9ic2VydmF0aW9ucyB3ZXJlIG9idGFpbmVkLiBUaGVuLCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHByaWNlcyB3YXMgY2FsY3VsYXRlZC4gDQoNClJlc3VsdHMgaW5kaWNhdGVkIHRoYXQgdGhlIG1lYW4gcHJpY2UgYXQgV29vbHdvcnRocyAoKk0qID0gMTEuMDcsICpTRCogPSAyMS4wMSkgd2FzIGNoZWFwZXIgdGhhbiBDb2xlcyAoKk0qID0gMTEuNTgsICpTRCogPSAyMS4yMCkuIFRoZSBwYWlyZWQgc2FtcGxlIHQtdGVzdCBzaG93ZWQgdGhhdCB0aGUgZGlmZmVyZW5jZSBpbiBtZWFuIHByaWNlIHdhcyBzaWduaWZpY2FudCwgKnQqKDE0OSkgPSA0LjEzMiwgKnAqIDwgMC4wNS4gQSBzZWNvbmQgYW5hbHlzaXMgd2FzIGNhcnJpZWQgb3V0IGFmdGVyIHRoZSByZW1vdmFsIG9mIGFuIG91dGxpZXIuIFRoZSBtZWFuIGRpZmZlcmVuY2UgYWxzbyByZW1haW5lZCBzaWduaWZpY2FudCwgKnQqKDE0OCkgPSA1LjMxMiwgKnAqIDwgMC4wNS4gVG8gY29uY2x1ZGUsIG9uIGF2ZXJhZ2UsIFdvb2x3b3J0aHMgb2ZmZXJzIGNoZWFwZXIgcHJpY2VzIHRoYW4gQ29sZXMuDQoNCg0KI0xvYWQgUGFja2FnZXMgYW5kIERhdGENCg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygicmVhZHIiKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZHBseXIpDQojaW5zdGFsbC5wYWNrYWdlcygiY2FyIikNCmxpYnJhcnkoY2FyKQ0KI2luc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpTdXBlcm1hcmtldCA8LSByZWFkX2NzdigiQzovVXNlcnMvb2xpdmUvRGVza3RvcC9VbmkvRmlyc3QgWWVhci9JbnRybyB0byBTdGF0cy9Bc3NpZ25tZW50IDMvU3VwZXJtYXJrZXRfY29tcGFyaXNvbi5jc3YiKQ0KDQpTdXBlcm1hcmtldCRkaWYgPC0gU3VwZXJtYXJrZXQkQ29sZXMgLSBTdXBlcm1hcmtldCRXb29sd29ydGhzDQpTdXBlcl9maWx0ZXIgPC0gZmlsdGVyKFN1cGVybWFya2V0LCBkaWY8MTUpDQpgYGANCg0KI1N1bW1hcnkgU3RhdGlzdGljcw0KDQpGcm9tIGEgc2FtcGxlIG9mIDE1MCBwcm9kdWN0cyAoKm4qPTE1MCkgdGhlIGF2ZXJhZ2UgcHJpY2UsIG1lYXN1cmVkIGluIEF1c3RyYWxpYW4gZG9sbGFycywgb2YgcHJvZHVjdHMgZnJvbSBDb2xlcyB3YXMgJDExLjU4ICgqTSogPSAxMS41OCwgKlNEKj0yMS4yKS4gVGhlIHJhbmdlIG9mIHByb2R1Y3QgcHJpY2VzIHdhcyBmcm9tICQxLjIgdG8gJDE5OS4NCmBgYHtyfQ0KU3VwZXJtYXJrZXQgJT4lIA0KICBzdW1tYXJpc2UoTWluID0gbWluKENvbGVzLCBuYS5ybSA9IFRSVUUpLA0KICBRMSA9IHF1YW50aWxlKENvbGVzLCBwcm9icyA9IC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgTWVkaWFuID0gbWVkaWFuKENvbGVzLCBuYS5ybSA9IFRSVUUpLA0KICBRMyA9IHF1YW50aWxlKENvbGVzLCBwcm9icyA9IC43NSwgbmEucm0gPSBUUlVFKSwNCiAgTWF4ID0gbWF4KENvbGVzLCBuYS5ybSA9IFRSVUUpLA0KICBNZWFuID0gbWVhbihDb2xlcywgbmEucm0gPSBUUlVFKSwNCiAgU0QgPSBzZChDb2xlcywgbmEucm0gPSBUUlVFKSwNCiAgbiA9IG4oKSwNCiAgTWlzc2luZyA9IHN1bShpcy5uYShDb2xlcykpKQ0KYGBgDQpGcm9tIGEgc2FtcGxlIG9mIDE1MCBwcm9kdWN0cyAoKm4qPTE1MCkgdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgcHJvZHVjdHMgZnJvbSBXb29sd29ydGhzIHdhcyAkMTEuMDcgKCpNKiA9IDExLjA3LCAqU0QqPTIxLjAxKS4gVGhlIHJhbmdlIG9mIHByb2R1Y3QgcHJpY2VzIHdhcyBmcm9tICQxLjIgdG8gJDE5OS45NS4NCmBgYHtyfQ0KU3VwZXJtYXJrZXQgJT4lIA0KICBzdW1tYXJpc2UoTWluID0gbWluKFdvb2x3b3J0aHMsIG5hLnJtID0gVFJVRSksDQogIFExID0gcXVhbnRpbGUoV29vbHdvcnRocywgcHJvYnMgPSAuMjUsIG5hLnJtID0gVFJVRSksDQogIE1lZGlhbiA9IG1lZGlhbihXb29sd29ydGhzLCBuYS5ybSA9IFRSVUUpLA0KICBRMyA9IHF1YW50aWxlKFdvb2x3b3J0aHMsIHByb2JzID0gLjc1LCBuYS5ybSA9IFRSVUUpLA0KICBNYXggPSBtYXgoV29vbHdvcnRocywgbmEucm0gPSBUUlVFKSwNCiAgTWVhbiA9IG1lYW4oV29vbHdvcnRocywgbmEucm0gPSBUUlVFKSwNCiAgU0QgPSBzZChXb29sd29ydGhzLCBuYS5ybSA9IFRSVUUpLA0KICBuID0gbigpLA0KICBNaXNzaW5nID0gc3VtKGlzLm5hKFdvb2x3b3J0aHMpKSkNCmBgYA0KDQpUaGUgbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gcHJvZHVjdHMgc2FtcGxlZCBmcm9tIENvbGVzIGFuZCBXb29sd29ydGhzICgqbio9MTUwKSB3YXMgJDAuNTIgKCpNKiA9IDAuNTIsICpTRCo9MS41MykuIFRoZSByYW5nZSBvZiBkaWZmZXJlbmNlIGJldHdlZW4gcHJvZHVjdCBwcmljZXMgd2FzIGZyb20gJC0zLjE3IHRvICQxNS4NCmBgYHtyfQ0KU3VwZXJtYXJrZXQgJT4lIA0KICBzdW1tYXJpc2UoTWluID0gbWluKGRpZiwgbmEucm0gPSBUUlVFKSwNCiAgUTEgPSBxdWFudGlsZShkaWYsIHByb2JzID0gLjI1LCBuYS5ybSA9IFRSVUUpLA0KICBNZWRpYW4gPSBtZWRpYW4oZGlmLCBuYS5ybSA9IFRSVUUpLA0KICBRMyA9IHF1YW50aWxlKGRpZiwgcHJvYnMgPSAuNzUsIG5hLnJtID0gVFJVRSksDQogIE1heCA9IG1heChkaWYsIG5hLnJtID0gVFJVRSksDQogIE1lYW4gPSBtZWFuKGRpZiwgbmEucm0gPSBUUlVFKSwNCiAgU0QgPSBzZChkaWYsIG5hLnJtID0gVFJVRSksDQogIG4gPSBuKCksDQogIE1pc3NpbmcgPSBzdW0oaXMubmEoZGlmKSkpDQpgYGANCg0KQm90aCBDb2xlcyBhbmQgV29vbHdvcnRocyBwcmljZXMgd2VyZSBwb3NpdGl2ZWx5IHNrZXdlZC4gT3V0bGllcnMgd2VyZSBwcmVzZW50IGluIGJvdGggc3VwZXJtYXJrZXRzLg0KYGBge3J9DQpib3hwbG90KFN1cGVybWFya2V0JENvbGVzLCBTdXBlcm1hcmtldCRXb29sd29ydGhzLCBtYWluID0gIkNvbGVzICYgV29vbHdvcnRocyBwcmljZXMiLCB5bGFiID0gIlByaWNlICgkKSIsIHhsYWIgPSAiU3VwZXJtYXJrZXQiKSANCmF4aXMgKDEsIGF0PSAxOjIsIGxhYmVscyA9IGMgKCJDb2xlcyIsICJXb29sd29ydGhzIikpDQpgYGANCg0KVGhpcyBib3hwbG90IGlkZW50aWZpZWQgYW4gZXh0cmVtZSBvdXRsaWVyIGFtb25nIHRoZSBkaWZmZXJlbmNlIGluIHByaWNlcyBiZXR3ZWVuIHN1cGVybWFya2V0cy4NCmBgYHtyfQ0KYm94cGxvdChTdXBlcm1hcmtldCRkaWYsIG1haW4gPSAiRGlmZmVyZW5jZSBpbiBwcmljZSIsIHlsYWIgPSAiUHJpY2UgKCQpIiwgeGxhYiA9ICJTdXBlcm1hcmtldCIpIA0KYGBgDQoNClRoaXMgZGF0YSB3YXMgZmlsdGVyZWQgdG8gcmVkdWNlIHRoZSBwb3NzaWJpbGl0eSBvZiBhIHR5cGUgMSBlcnJvci4gVGhlIGJveCBwbG90IGJlbG93IHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGZpbHRlcmVkIGRpZmZlcmVuY2UgaW4gcHJpY2UuIA0KYGBge3J9DQpib3hwbG90KFN1cGVyX2ZpbHRlciRkaWYsIG1haW4gPSAiRmlsdGVyZWQgZGlmZmVyZW5jZSBpbiBwcmljZSIsIHlsYWIgPSAiUHJpY2UgKCQpIiwgeGxhYiA9ICJTdXBlcm1hcmtldCIpIA0KYGBgDQoNClRoaXMgbWF0IHBsb3QgaW5kaWNhdGVzIGEgZ2VuZXJhbCB0cmVuZCB0b3dhcmRzIFdvb2x3b3J0aHMgcHJvZHVjdHMgY29zdGluZyBsZXNzIHRoYW4gbWF0Y2hlZCBwcm9kdWN0cyBhdCBDb2xlcy4gDQpgYGB7cn0NCm1hdHBsb3QodChkYXRhLmZyYW1lKFN1cGVybWFya2V0JENvbGVzLCBTdXBlcm1hcmtldCRXb29sd29ydGhzKSksDQogIHR5cGUgPSAiYiIsDQogIHBjaCA9IDE5LA0KICBjb2wgPSAxLA0KICBsdHkgPSAxLA0KICB4bGFiID0gIlN1cGVybWFya2V0IiwNCiAgeWxhYiA9ICJQcmljZSIsDQogIHhheHQgPSAibiIpDQpheGlzKDEsIGF0ID0gMToyLCBsYWJlbHMgPSBjKCJDb2xlcyIsICJXb29sd29ydGhzIikpDQpgYGANCg0KI0h5cG90aGVzaXMgVGVzdA0KDQpBIHBhaXJlZCBzYW1wbGUgdC10ZXN0IHdhcyB1c2VkIHRvIGFuYWx5c2UgdGhlIGRpZmZlcmVuY2UgaW4gcHJpY2UgYmV0d2VlbiBtYXRjaGVkIHByb2R1Y3RzIG9mZmVyZWQgYnkgQ29sZXMgYW5kIFdvb2x3b3J0aHMuIFRoaXMgaHlwb3RoZXNpcyB0ZXN0IHdhcyBjaG9zZW4gYXMgdGhlIGFuYWx5c2lzIHdhcyBjb25kdWN0ZWQgb24gbWF0Y2hlZCwgcXVhbnRpdGF0aXZlLCBpbmRlcGVuZGVudCBvYnNlcnZhdGlvbnMgYmV0d2VlbiBDb2xlcyBhbmQgV29vbHdvcnRocy5UaGUgcGFpcmVkIHNhbXBsZSB0LXRlc3QgYXNzdW1lcyB0aGF0IHRoZSBvYnNlcnZhdGlvbnMgYXJlIGluZGVwZW5kZW50LCBhbmQgdGhhdCB0aGUgcG9wdWxhdGlvbiBtZWFuIGRpZmZlcmVuY2UgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIER1ZSB0byB0aGUgbGFyZ2Ugc2FtcGxlIHNpemUgKCpuKj0xNTApLCB0aGUgcGFpcmVkIHNhbXBsZSB0LXRlc3QgaXMgcm9idXN0IGVub3VnaCB0byBoYW5kbGUgb2JzZXJ2YXRpb25zIHRoYXQgc3RyYXkgZnJvbSBhIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHNhbXBsZS4gVG8gYWRkcmVzcyBhbiBvdXRsaWVyLCBhIHNlY29uZCBwYWlyZWQgc2FtcGxlIHQtdGVzdCB3YXMgdXNlZCB0byBldmFsdWF0ZSB0aGUgYWZmZWN0cyBvZiBpdHMgcmVtb3ZhbCBmcm9tIHRoZSBkYXRhc2V0LiBUaGUgY2hvc2VuIGFscGhhIGxldmVsIGZvciB0aGVzZSB0LXRlc3RzIHdhcyAwLjA1ICgkXGFscGhhJCA9IDAuMDUpLiANCmBgYHtyfQ0KdC50ZXN0KFN1cGVybWFya2V0JENvbGVzLCBTdXBlcm1hcmtldCRXb29sd29ydGhzLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBUUlVFLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSANCg0KdC50ZXN0KFN1cGVyX2ZpbHRlciRDb2xlcywgU3VwZXJfZmlsdGVyJFdvb2x3b3J0aHMsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IFRSVUUsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpDQpgYGANCg0KI0ludGVycHJldGF0aW9uDQoNCkEgcGFpcmVkIHNhbXBsZSB0LXRlc3Qgd2FzIHVzZWQgdG8gc3RhdGlzdGljYWxseSBpbnZlc3RpZ2F0ZSB0aGUgbWVhbiBwcmljZSBkaWZmZXJlbmNlIGJldHdlZW4gcHJvZHVjdHMgaW4gQ29sZXMgYW5kIFdvb2x3b3J0aHMgKCpuKj0xNTApLiBUaGUgbnVsbCBoeXBvdGhlc2lzIHdhcyB0aGF0IHRoZSBwcmljZSBkaWZmZXJlbmNlIGJldHdlZW4gcHJvZHVjdHMgaW4gQ29sZXMgYW5kIFdvb2x3b3J0aHMgaXMgZXF1YWwgdG8gMDsgJEhfMCQ6ICRcbXUgXGRlbHRhJCA9IDAuIFRoZSBhbHRlcm5hdGUgaHlwb3RoZXNpcyB3YXMgdGhhdCB0aGUgcHJpY2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHByb2R1Y3RzIGluIENvbGVzIGFuZCBXb29sd29ydGhzIGlzIG5vdCBlcXVhbCB0byAwOyAkSF9hJDogJFxtdSBcZGVsdGEgXG5lcSQgMC4gDQoNClRoZSBtZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiBDb2xlcyBhbmQgV29vbHdvcnRocyBwcm9kdWN0cyB3YXMgMC41MTYgKCpTRCo9MS41MykuIFRoZSBwYWlyZWQtc2FtcGxlIHQtdGVzdCBmb3VuZCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gQ29sZXMgYW5kIFdvb2x3b3J0aHMgcHJpY2VzLCAqdCooMTQ5KT0gNC4xMywgKnAqIDwgLjAwMSwgOTUlICpDLkkqIFswLjI3ICAwLjc2XSwgc3VnZ2VzdGluZyB0aGF0IENvbGVzIHdhcyBtb3JlIGV4cGVuc2l2ZSB0aGFuIFdvb2x3b3J0aHMuDQoNClRvIGVuc3VyZSB0aGF0IGFueSBvdXRsaWVycyBkaWQgbm90IGluZmx1ZW5jZSB0aGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzZXMsIGFub3RoZXIgcGFpcmVkIHNhbXBsZSB0LXRlc3Qgd2FzIGNvbmR1Y3RlZCB3aXRoIHN1YnN0YW50aWFsIG91dGxpZXJzIHJlbW92ZWQgKGRpZmZlcmVuY2Ugc2NvcmVzID4xNSB3ZXJlIHJlbW92ZWQpLiBUaGUgcGFpcmVkLXNhbXBsZSB0LXRlc3Qgd2l0aCBvdXRsaWVycyByZW1vdmVkIGFsc28gZm91bmQgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IG1lYW4gZGlmZmVyZW5jZSBiZXR3ZWVuIENvbGVzIGFuZCBXb29sd29ydGhzIHByaWNlcywgKnQqKDE0OCk9IDUuMzEsICpwKiA8IC4wMDEsIDk1JSAqQy5JKiBbMC4yNiAgMC41N10sIGFnYWluIHN1Z2dlc3RpbmcgdGhhdCBDb2xlcyB3YXMgbW9yZSBleHBlbnNpdmUgdGhhbiBXb29sd29ydGhzLiANCg0KI0Rpc2N1c3Npb24gDQoNClRoZSBhaW0gb2YgdGhlIGN1cnJlbnQgcmVwb3J0IHdhcyB0byBjb21wYXJlIHRoZSBwcmljZSBvZiBwcm9kdWN0cyBiZXR3ZWVuIENvbGVzIGFuZCBXb29sd29ydGhzLiAxMCBwcm9kdWN0cyB3ZXJlIHJhbmRvbWx5IHNlbGVjdGVkIGZyb20gZWFjaCBjYXRlZ29yeSBhdCBDb2xlcyBvbmxpbmUgc3RvcmUgYW5kIG1hdGNoZWQgdG8gdGhlIGVxdWl2YWxlbnQgcHJvZHVjdCBpbiBXb29sd29ydGhzIG9ubGluZSBzdG9yZSAoKm4qPTE1MCkuIEEgcGFpcmVkIHNhbXBsZSB0LXRlc3Qgd2FzIHRoZW4gdXNlZCB0byBzdGF0aXN0aWNhbGx5IGludmVzdGlnYXRlIHRoZSBtZWFuIHByaWNlIGRpZmZlcmVuY2UgYmV0d2VlbiBDb2xlcyBhbmQgV29vbHdvcnRocy4NCg0KVGhlIHJlc3VsdHMgcmV2ZWFsZWQgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IG1lYW4gZGlmZmVyZW5jZSBiZXR3ZWVuIENvbGVzIGFuZCBXb29sd29ydGhzIHByaWNlcywgYm90aCB3aGVuIG91dGxpZXJzIHdlcmUgcmVtb3ZlZCBhbmQgcHJlc2VudGVkLiBJbnNwZWN0aW9uIG9mIHRoZSBtZWFuIGRpZmZlcmVuY2Ugc2hvd2VkIHRoYXQgQ29sZXMgaGFkIGEgaGlnaGVyIGF2ZXJhZ2UgcHJvZHVjdCBwcmljZSB0aGFuIFdvb2x3b3J0aHMuIFRodXMsIHRoZSBjdXJyZW50IHJlc3VsdHMgc3VnZ2VzdCB0aGF0IHByb2R1Y3RzIGFyZSwgb24gYXZlcmFnZSwgbW9yZSBleHBlbnNpdmUgYXQgQ29sZXMgY29tcGFyZWQgdG8gV29vbHdvcnRocy4NCg0KVGhlIGN1cnJlbnQgcmVwb3J0IGhhZCBudW1lcm91cyBtZXRob2RvbG9naWNhbCBhbmQgc3RhdGlzdGljYWwgc3RyZW5ndGhzLiBGaXJzdGx5LCBpdGVtcyB3ZXJlIHJhbmRvbWx5IHNhbXBsZWQgd2l0aCBoZWxwIGZyb20gYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpbiBNaWNyb3NvZnQgZXhjZWwuIFJhbmRvbSBzYW1wbGluZyByZWR1Y2VzIHRoZSByaXNrIG9mIHNhbXBsZSBiaWFzLCB0aHVzIGluY3JlYXNpbmcgdGhlIHNhbXBsZXMgdmFsaWRpdHkgaW4gcmVwcmVzZW50aW5nIHRoZSB0YXJnZXRlZCBwb3B1bGF0aW9uLiBTZWNvbmRseSwgdGhlIGN1cnJlbnQgcmVwb3J0IHNhbXBsZWQgZXF1aXZhbGVudCBwcm9kdWN0cyBpbiBDb2xlcyBhbmQgV29vbHdvcnRocy4gVGhpcyBhbGxvd2VkIGEgcGFpcmVkIHNhbXBsZSB0LXRlc3QgdG8gYmUgdXNlZCBpbiB0aGUgc3RhdGlzdGljYWwgYW5hbHlzaXMsIHJlZHVjaW5nIHBvdGVudGlhbGx5IGNvbmZvdW5kaW5nIHZhcmlhYmlsaXR5IGJldHdlZW4gcHJvZHVjdHMgYXQgQ29sZXMgYW5kIFdvb2x3b3J0aHMuIA0KDQpIb3dldmVyLCBkZXNwaXRlIHRoZSBhZm9yZW1lbnRpb25lZCBzdHJlbmd0aHMsIHRoZSBwcmVzZW50IHJlcG9ydCBoYWQgYSBudW1iZXIgb2YgYXBwYXJlbnQgbGltaXRhdGlvbnMuIEZvciBpbnN0YW5jZSwgdGhlIGN1cnJlbnQgcmVwb3J0IG9ubHkgc2FtcGxlZCBvbmxpbmUgcHJvZHVjdHMsIHdoaWNoIG1heSBub3QgcmVwcmVzZW50IHByaWNlcyBvZiBpbi1zdG9yZSBwcm9kdWN0cy4gVGhpcyBpc3N1ZSBjb3VsZCBiZSByZXNvbHZlZCBpbiBmdXR1cmUgcmVzZWFyY2ggYnkgc2FtcGxpbmcgdGhlIHByaWNlcyBvZiBwcm9kdWN0cyBpbi1zdG9yZSwgaW5zdGVhZCBvZiBvbmxpbmUuIE9yLCBib3RoIG9ubGluZSBhbmQgaW4tc3RvcmUuDQoNCkFub3RoZXIgbWV0aG9kb2xvZ2ljYWwgZmxhdyBpcyB0aGF0IHRoZSBjdXJyZW50IHJlcG9ydCBvbmx5IHVzZWQgZXF1aXZhbGVudCBwcm9kdWN0cyBmcm9tIGJvdGggc3RvcmVzLiBBbHRob3VnaCB0aGlzIGVuYWJsZWQgYSBwYWlyZWQgc2FtcGxlIHQtdGVzdCB0byBiZSB1c2VkLCBpdCBoYXMgcmVzdWx0ZWQgaW4gYSBudW1iZXIgb2YgZXhjbHVzaXZlIHByb2R1Y3RzIChpbmNsdWRpbmcgaG9tZSBicmFuZCBwcm9kdWN0cykgYmVpbmcgbmVnbGVjdGVkIGZyb20gdGhlIHNhbXBsZS4gRXhjbHVzaXZlIHByb2R1Y3RzIG1heSBpbmZsdWVuY2UgdGhlIG92ZXJhbGwgcHJpY2Ugb2YgcHJvZHVjdHMgZnJvbSBlYWNoIHN0b3JlLCB0aHVzIHBvdGVudGlhbGx5IGNoYW5naW5nIHRoZSByZXN1bHRzIG9mIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcy4gUGVyaGFwcyBhIGxhcmdlIHNjYWxlLCByYW5kb21pc2VkIHR3byBzYW1wbGUgdC10ZXN0IGNvdWxkIHJlc29sdmUgdGhpcyBpc3N1ZSBieSByYW5kb21seSBpbmNsdWRpbmcgZXhjbHVzaXZlIHByb2R1Y3RzIGZyb20gQ29sZXMgYW5kIFdvb2x3b3J0aHMuDQoNCk5ldmVydGhlbGVzcywgdGhlIGN1cnJlbnQgZmluZGluZ3Mgc2hvd2VkIHRoYXQgV29vbHdvcnRocyBwcmljZXMgYXJlIHNpZ25pZmljYW50bHkgbG93ZXIgdGhhbiBDb2xlcyBwcmljZXMgZm9yIG1hdGNoZWQgcHJvZHVjdHMuIEZ1dHVyZSByZXNlYXJjaCBzaG91bGQgaW52ZXN0aWdhdGUgdGhlIHByaWNlIGRpZmZlcmVuY2UgYmV0d2VlbiBDb2xlcyBhbmQgV29vbHdvcnRocyBpbi1zdG9yZSBwcm9kdWN0cywgYXMgd2VsbCBhcyBzYW1wbGluZyBzdG9yZSBleGNsdXNpdmUgcHJvZHVjdHMuIEluIGNvbmNsdXNpb24sIFdvb2x3b3J0aHMgaGFzLCBvbiBhdmVyYWdlLCBjaGVhcGVyIHByaWNlcyB0aGFuIENvbGVzLg==