1 The shrimps dataset

Dataset on the accumulation of PCBs (Polychlorinated biphenyls) in the adipose tissue of shrimps. PCBs are often present in coolants, and are know to accumulate easily in the adipose tissue of shrimps. In this experiment, two groups of 18 samples (each 100 grams) of shrimps each were cultivated in different conditions, one control condition and one condition where the medium was poluted with PCBs. Note that the PCB concentrations were measured in pg/g adipose tissue.

2 Goal

The research question is; is there an effect of the growth condition on the PCB concentration in the adipose tissue of shrimps?

Load libraries:

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

3 Import the data

shrimps <- read_tsv(
  "https://raw.githubusercontent.com/statOmics/PSLSData/main/shrimps.txt"
)
## Rows: 36 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## dbl (2): PCB.conc, group
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
glimpse(shrimps)
## Rows: 36
## Columns: 2
## $ PCB.conc <dbl> 29.7, 24.5, 97.7, 39.1, 22.6, 32.4, 27.7, 100.1, 40.1, 23.3, …
## $ group    <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2…

4 Data tidying

shrimps <- shrimps %>%
  mutate(group = as.factor(group))

5 Data exploration

The first step is to explore the data.

shrimps %>%
  count(group)

Visualize the data:

shrimps %>%
  ggplot(aes(x = group, y = PCB.conc, fill = group)) +
  scale_fill_manual(values = c("darkorchid", "olivedrab")) +
  theme_bw() +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(width = 0.2) +
  ggtitle("Boxplot of the PCB concentrations in two groups of shrimps") +
  ylab("PCB concentration (pg/g)") +
  stat_summary(
    fun = mean, geom = "point",
    shape = 5, size = 3, color = "black",
  )

We can see that for group 1 we have four very clear outliers in the data. These values were double-checked (i.e for typing errors), but there was no reason found to believe that these values are incorrect.

6 Analysis

A good way for testing the research hypothesis is to perform an unpaired two-sample t-test to find out whether there is a significant difference in the mean PCB concentrations between both groups of samples. Before we can do this, we must check if all the required assumptions are met.

6.1 Assumptions

  1. The observations are independent of each other (in both groups)
  2. The data (PCB.conc) must be normally distributed (in both groups)
  3. The variance is equal in the two groups.

The first assumption is met, as we randomly selected shrimps and submitted them to one of two growth conditions. No underlying correlation patterns are expected.

We can check the second assumption with a QQ-plot.

shrimps %>%
  ggplot(aes(sample = PCB.conc)) +
  geom_qq() +
  geom_qq_line() +
  facet_grid(~ group)

We clearly see that we have strong deviations from normality. Many datapoints do not lie near the quantile-quantile line. As such, we may conclude that our data are not normally distributed. In addition, the boxplots suggest that the variability differs between the two groups.

As such, we are not allowed to perform the t-test. Given the location of the outliers transformation will not help, so we will resort to non-parametric tests, i.e. to the Wilcoxon rank-sum test.

6.2 Wilcoxon rank-sum test

The Wilcoxon rank-sum test (or the Mann-Whitney U test) is an important non-parametric data analysis method. In rank-based tests, the data \(Y_i\) are first transformed to its ranked equivalent \[ R_i=R(Y_i) = \#\{Y_j: Y_j\leq Y_i; j=1,\ldots, n\}. \]

Ranks are very robust to outliers. For instance, it does not matter if the highest value in an hypothetical dataset has a value of 10 or 100; it will keep the same rank (highest rank).

Note, that there might be ties in the data, e.g., if two samples of shrimps have an equal concentration of PCBs. In this case, the Wilcoxon rank-sum test will compute mid-ranks, which are calculated as follows; \[R(Y_i) = \frac{\sum\limits_{\forall j : Y_j=Y_i}R(Y_j)}{\#{\forall j:Y_j=Y_i}} \] i.e., the midrank is equal to the mean of the ranks of equal observations.

After computing the ranks and midranks, the Wilcoxon test will compare the mean rank between both treatment groups:

wilcox_res <- wilcox.test(PCB.conc ~ group, data = shrimps)
wilcox_res
## 
##  Wilcoxon rank sum exact test
## 
## data:  PCB.conc by group
## W = 88, p-value = 0.01871
## alternative hypothesis: true location shift is not equal to 0

We find that the test is significant on the 5% significance level (p = 0.01871). The value W=88 could be calculated manually as the Mann-Withney statistic that counts how many times a value from group 1 is larger or equal than values of group 2.

6.2.1 Interpretation

The interpretation of the Wilcoxon rank-sum test is slightly more challenging than that of a t-test. Since we are no longer interpreting differences in the distributions between the groups in terms of the average differences but in in terms of the probabilistic index.

The null hypothesis of the Wilcoxon test states that the distributions are equal for both groups:

\[ H_0: f_1 = f_2 \]

In words: the distribution of PCB concentrations in shrimps are equal for both treatment conditions.

against the alternative hypothesis that

\[ H_1: P(Y_{1} \geq Y_{2}) \ne 1/2 \]

In words: The probability that a random observation of a PCB concentration derived from shrimps that was grown in the control condition is larger than or equal to than a random observation of a PCB concentration derived from a shrimps that was grown in the other condition is not equal to 50%.

We can estimate this probability based on the observed test statistic.

n1 <- n2 <- 18 # 18 observations in each group
WObs <- wilcox_res$statistic # get the observed test statistic
WObs / (n1 * n2)
##         W 
## 0.2716049

We can see that the point estimate of this probability is 27.2%.

We can interpret it as follows;

There is a probability of 27.2% that the PCB concentration in a random shrimp that was grown in the control condition is greater than or equal to the PCB concentration in a random shrimp that was grown in the treatment condition. This probability is significantly different from 50% on the 5% significance level (p = 0.01871).

LS0tCnRpdGxlOiAiRXhlcmNpc2UgOS4xOiBOb24tcGFyYW1ldHJpYyBzdGF0aXN0aWNzIG9uIHRoZSBzaHJpbXBzIGRhdGFzZXQgLSBzb2x1dGlvbiIKYXV0aG9yOiAiTGlldmVuIENsZW1lbnQgYW5kIEplcm9lbiBHaWxpcyIKZGF0ZTogInN0YXRPbWljcywgR2hlbnQgVW5pdmVyc2l0eSAoaHR0cHM6Ly9zdGF0b21pY3MuZ2l0aHViLmlvKSIKLS0tCgojIFRoZSBzaHJpbXBzIGRhdGFzZXQKCkRhdGFzZXQgb24gdGhlIGFjY3VtdWxhdGlvbiBvZiBQQ0JzIChQb2x5Y2hsb3JpbmF0ZWQgYmlwaGVueWxzKQppbiB0aGUgYWRpcG9zZSB0aXNzdWUgb2Ygc2hyaW1wcy4gUENCcyBhcmUgb2Z0ZW4gcHJlc2VudCBpbiBjb29sYW50cywgYW5kIGFyZQprbm93IHRvIGFjY3VtdWxhdGUgZWFzaWx5IGluIHRoZSBhZGlwb3NlIHRpc3N1ZSBvZiBzaHJpbXBzLiBJbiB0aGlzIGV4cGVyaW1lbnQsCnR3byBncm91cHMgb2YgMTggc2FtcGxlcyAoZWFjaCAxMDAgZ3JhbXMpIG9mIHNocmltcHMgZWFjaCB3ZXJlIGN1bHRpdmF0ZWQKaW4gZGlmZmVyZW50IGNvbmRpdGlvbnMsIG9uZSBjb250cm9sIGNvbmRpdGlvbiBhbmQgb25lIGNvbmRpdGlvbgp3aGVyZSB0aGUgbWVkaXVtIHdhcyBwb2x1dGVkIHdpdGggUENCcy4gTm90ZSB0aGF0IHRoZSBQQ0IgY29uY2VudHJhdGlvbnMgd2VyZQptZWFzdXJlZCBpbiBwZy9nIGFkaXBvc2UgdGlzc3VlLgoKIyBHb2FsCgpUaGUgcmVzZWFyY2ggcXVlc3Rpb24gaXM7IGlzIHRoZXJlIGFuIGVmZmVjdCBvZiB0aGUKZ3Jvd3RoIGNvbmRpdGlvbiBvbiB0aGUgUENCIGNvbmNlbnRyYXRpb24gaW4gdGhlIGFkaXBvc2UKdGlzc3VlIG9mIHNocmltcHM/CgpMb2FkIGxpYnJhcmllczoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgojIEltcG9ydCB0aGUgZGF0YQoKYGBge3J9CnNocmltcHMgPC0gcmVhZF90c3YoCiAgImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9zdGF0T21pY3MvUFNMU0RhdGEvbWFpbi9zaHJpbXBzLnR4dCIKKQpnbGltcHNlKHNocmltcHMpCmBgYAoKIyBEYXRhIHRpZHlpbmcKCmBgYHtyfQpzaHJpbXBzIDwtIHNocmltcHMgJT4lCiAgbXV0YXRlKGdyb3VwID0gYXMuZmFjdG9yKGdyb3VwKSkKYGBgCgojIERhdGEgZXhwbG9yYXRpb24KClRoZSBmaXJzdCBzdGVwIGlzIHRvIGV4cGxvcmUgdGhlIGRhdGEuCgpgYGB7cn0Kc2hyaW1wcyAlPiUKICBjb3VudChncm91cCkKYGBgCgpWaXN1YWxpemUgdGhlIGRhdGE6CgpgYGB7cn0Kc2hyaW1wcyAlPiUKICBnZ3Bsb3QoYWVzKHggPSBncm91cCwgeSA9IFBDQi5jb25jLCBmaWxsID0gZ3JvdXApKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya29yY2hpZCIsICJvbGl2ZWRyYWIiKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKwogIGdndGl0bGUoIkJveHBsb3Qgb2YgdGhlIFBDQiBjb25jZW50cmF0aW9ucyBpbiB0d28gZ3JvdXBzIG9mIHNocmltcHMiKSArCiAgeWxhYigiUENCIGNvbmNlbnRyYXRpb24gKHBnL2cpIikgKwogIHN0YXRfc3VtbWFyeSgKICAgIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLAogICAgc2hhcGUgPSA1LCBzaXplID0gMywgY29sb3IgPSAiYmxhY2siLAogICkKYGBgCgpXZSBjYW4gc2VlIHRoYXQgZm9yIGdyb3VwIDEgd2UgaGF2ZSBmb3VyIHZlcnkgY2xlYXIgb3V0bGllcnMKaW4gdGhlIGRhdGEuIFRoZXNlIHZhbHVlcyB3ZXJlIGRvdWJsZS1jaGVja2VkIChpLmUgZm9yCnR5cGluZyBlcnJvcnMpLCBidXQgdGhlcmUgd2FzIG5vIHJlYXNvbiBmb3VuZCB0byBiZWxpZXZlCnRoYXQgdGhlc2UgdmFsdWVzIGFyZSBpbmNvcnJlY3QuCgojIEFuYWx5c2lzCgpBIGdvb2Qgd2F5IGZvcgp0ZXN0aW5nIHRoZSByZXNlYXJjaCBoeXBvdGhlc2lzIGlzIHRvIHBlcmZvcm0gYW4gdW5wYWlyZWQKdHdvLXNhbXBsZSB0LXRlc3QgdG8gZmluZCBvdXQgd2hldGhlciB0aGVyZSBpcyBhIHNpZ25pZmljYW50CmRpZmZlcmVuY2UgaW4gdGhlIG1lYW4gUENCIGNvbmNlbnRyYXRpb25zIGJldHdlZW4gYm90aCBncm91cHMKb2Ygc2FtcGxlcy4gQmVmb3JlIHdlIGNhbiBkbyB0aGlzLCB3ZSBtdXN0IGNoZWNrIGlmIGFsbCB0aGUKcmVxdWlyZWQgYXNzdW1wdGlvbnMgYXJlIG1ldC4KCiMjIEFzc3VtcHRpb25zCgoxLiBUaGUgb2JzZXJ2YXRpb25zIGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyIChpbiBib3RoIGdyb3VwcykKMi4gVGhlIGRhdGEgKFBDQi5jb25jKSBtdXN0IGJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBib3RoIGdyb3VwcykKMy4gVGhlIHZhcmlhbmNlIGlzIGVxdWFsIGluIHRoZSB0d28gZ3JvdXBzLgoKVGhlIGZpcnN0IGFzc3VtcHRpb24gaXMgbWV0LCBhcyB3ZSByYW5kb21seSBzZWxlY3RlZCBzaHJpbXBzIGFuZApzdWJtaXR0ZWQgdGhlbSB0byBvbmUgb2YgdHdvIGdyb3d0aCBjb25kaXRpb25zLiBObyB1bmRlcmx5aW5nCmNvcnJlbGF0aW9uIHBhdHRlcm5zIGFyZSBleHBlY3RlZC4KCldlIGNhbiBjaGVjayB0aGUgc2Vjb25kIGFzc3VtcHRpb24gd2l0aCBhIFFRLXBsb3QuCgpgYGB7cn0Kc2hyaW1wcyAlPiUKICBnZ3Bsb3QoYWVzKHNhbXBsZSA9IFBDQi5jb25jKSkgKwogIGdlb21fcXEoKSArCiAgZ2VvbV9xcV9saW5lKCkgKwogIGZhY2V0X2dyaWQofiBncm91cCkKYGBgCgpXZSBjbGVhcmx5IHNlZSB0aGF0IHdlIGhhdmUgc3Ryb25nIGRldmlhdGlvbnMgZnJvbQpub3JtYWxpdHkuIE1hbnkgZGF0YXBvaW50cyBkbyBub3QgbGllIG5lYXIgdGhlIHF1YW50aWxlLXF1YW50aWxlCmxpbmUuIEFzIHN1Y2gsIHdlIG1heSBjb25jbHVkZSB0aGF0IG91ciBkYXRhIGFyZSBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuCkluIGFkZGl0aW9uLCB0aGUgYm94cGxvdHMgc3VnZ2VzdCB0aGF0IHRoZQp2YXJpYWJpbGl0eSBkaWZmZXJzIGJldHdlZW4gdGhlIHR3byBncm91cHMuCgpBcyBzdWNoLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gcGVyZm9ybSB0aGUgdC10ZXN0LgpHaXZlbiB0aGUgbG9jYXRpb24gb2YgdGhlIG91dGxpZXJzIHRyYW5zZm9ybWF0aW9uIHdpbGwgbm90IGhlbHAsIHNvIHdlIHdpbGwgcmVzb3J0IHRvIG5vbi1wYXJhbWV0cmljCnRlc3RzLCBpLmUuIHRvIHRoZSBXaWxjb3hvbiByYW5rLXN1bSB0ZXN0LgoKIyMgV2lsY294b24gcmFuay1zdW0gdGVzdAoKVGhlIFdpbGNveG9uIHJhbmstc3VtIHRlc3QgKG9yIHRoZSBNYW5uLVdoaXRuZXkgVSB0ZXN0KSBpcyBhbiBpbXBvcnRhbnQKbm9uLXBhcmFtZXRyaWMgZGF0YSBhbmFseXNpcyBtZXRob2QuIEluIHJhbmstYmFzZWQgdGVzdHMsIHRoZSBkYXRhCiRZX2kkIGFyZSBmaXJzdCB0cmFuc2Zvcm1lZCB0byBpdHMgcmFua2VkIGVxdWl2YWxlbnQKXFsgUl9pPVIoWV9pKSA9IFwjXHtZX2o6IFlfalxsZXEgWV9pOyBqPTEsXGxkb3RzLCBuXH0uIFxdCgpSYW5rcyBhcmUgdmVyeSByb2J1c3QgdG8gb3V0bGllcnMuIEZvciBpbnN0YW5jZSwgaXQgZG9lcyBub3QKbWF0dGVyIGlmIHRoZSBoaWdoZXN0IHZhbHVlIGluIGFuIGh5cG90aGV0aWNhbCBkYXRhc2V0IGhhcyBhCnZhbHVlIG9mIDEwIG9yIDEwMDsgaXQgd2lsbCBrZWVwIHRoZSBzYW1lIHJhbmsgKGhpZ2hlc3QgcmFuaykuCgpOb3RlLCB0aGF0IHRoZXJlIG1pZ2h0IGJlIHRpZXMgaW4gdGhlIGRhdGEsIGUuZy4sIGlmCnR3byBzYW1wbGVzIG9mIHNocmltcHMgaGF2ZSBhbiBlcXVhbCBjb25jZW50cmF0aW9uIG9mIFBDQnMuCkluIHRoaXMgY2FzZSwgdGhlIFdpbGNveG9uIHJhbmstc3VtIHRlc3Qgd2lsbCBjb21wdXRlCm1pZC1yYW5rcywgd2hpY2ggYXJlIGNhbGN1bGF0ZWQgYXMgZm9sbG93czsKXFtSKFlfaSkgPSBcZnJhY3tcc3VtXGxpbWl0c197XGZvcmFsbCBqIDogWV9qPVlfaX1SKFlfail9e1wje1xmb3JhbGwgajpZX2o9WV9pfX0gIFxdCmkuZS4sIHRoZSBtaWRyYW5rIGlzIGVxdWFsIHRvIHRoZSBtZWFuIG9mIHRoZSByYW5rcyBvZiBlcXVhbApvYnNlcnZhdGlvbnMuCgpBZnRlciBjb21wdXRpbmcgdGhlIHJhbmtzIGFuZCBtaWRyYW5rcywgdGhlIFdpbGNveG9uIHRlc3Qgd2lsbApjb21wYXJlIHRoZSBtZWFuIHJhbmsgYmV0d2VlbiBib3RoIHRyZWF0bWVudCBncm91cHM6CgpgYGB7cn0Kd2lsY294X3JlcyA8LSB3aWxjb3gudGVzdChQQ0IuY29uYyB+IGdyb3VwLCBkYXRhID0gc2hyaW1wcykKd2lsY294X3JlcwpgYGAKCldlIGZpbmQgdGhhdCB0aGUgdGVzdCBpcyBzaWduaWZpY2FudCBvbiB0aGUgNSUKc2lnbmlmaWNhbmNlIGxldmVsIChwID0gMC4wMTg3MSkuIFRoZSB2YWx1ZSBXPTg4CmNvdWxkIGJlIGNhbGN1bGF0ZWQgbWFudWFsbHkgYXMgdGhlIE1hbm4tV2l0aG5leSBzdGF0aXN0aWMKdGhhdCBjb3VudHMgaG93IG1hbnkgdGltZXMgYSB2YWx1ZSBmcm9tIGdyb3VwIDEgaXMgbGFyZ2VyIG9yIGVxdWFsIHRoYW4gdmFsdWVzIG9mIGdyb3VwIDIuCgojIyMgSW50ZXJwcmV0YXRpb24KClRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgV2lsY294b24gcmFuay1zdW0gdGVzdCBpcwpzbGlnaHRseSBtb3JlIGNoYWxsZW5naW5nIHRoYW4gdGhhdCBvZiBhIHQtdGVzdC4KU2luY2Ugd2UgYXJlIG5vIGxvbmdlciBpbnRlcnByZXRpbmcgZGlmZmVyZW5jZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbnMgYmV0d2VlbiB0aGUgZ3JvdXBzIGluIHRlcm1zIG9mIHRoZSBhdmVyYWdlIGRpZmZlcmVuY2VzIGJ1dCBpbiBpbiB0ZXJtcyBvZiB0aGUKKnByb2JhYmlsaXN0aWMgaW5kZXgqLgoKVGhlIG51bGwgaHlwb3RoZXNpcyBvZiB0aGUgV2lsY294b24gdGVzdCBzdGF0ZXMgdGhhdAp0aGUgZGlzdHJpYnV0aW9ucwphcmUgZXF1YWwgZm9yIGJvdGggZ3JvdXBzOgoKXFsgSF8wOiBmXzEgPSBmXzIgXF0KCkluIHdvcmRzOiB0aGUgZGlzdHJpYnV0aW9uIG9mIFBDQiBjb25jZW50cmF0aW9ucyBpbgpzaHJpbXBzIGFyZSBlcXVhbCBmb3IgYm90aCB0cmVhdG1lbnQgY29uZGl0aW9ucy4KCmFnYWluc3QgdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgdGhhdAoKXFsgSF8xOiBQKFlfezF9IFxnZXEgWV97Mn0pIFxuZSAxLzIgXF0KCkluIHdvcmRzOiBUaGUgcHJvYmFiaWxpdHkgdGhhdCBhIHJhbmRvbSBvYnNlcnZhdGlvbiBvZiBhClBDQiBjb25jZW50cmF0aW9uIGRlcml2ZWQgZnJvbSBzaHJpbXBzIHRoYXQKd2FzIGdyb3duIGluIHRoZSBjb250cm9sIGNvbmRpdGlvbiAqaXMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8qCnRoYW4gYSByYW5kb20gb2JzZXJ2YXRpb24gb2YgYSBQQ0IgY29uY2VudHJhdGlvbgpkZXJpdmVkIGZyb20gYSBzaHJpbXBzIHRoYXQgd2FzIGdyb3duIGluCnRoZSBvdGhlciBjb25kaXRpb24gKmlzIG5vdCBlcXVhbCB0byA1MCUqLgoKV2UgY2FuIGVzdGltYXRlIHRoaXMgcHJvYmFiaWxpdHkgYmFzZWQgb24gdGhlIG9ic2VydmVkIHRlc3Qgc3RhdGlzdGljLgoKYGBge3J9Cm4xIDwtIG4yIDwtIDE4ICMgMTggb2JzZXJ2YXRpb25zIGluIGVhY2ggZ3JvdXAKV09icyA8LSB3aWxjb3hfcmVzJHN0YXRpc3RpYyAjIGdldCB0aGUgb2JzZXJ2ZWQgdGVzdCBzdGF0aXN0aWMKV09icyAvIChuMSAqIG4yKQpgYGAKCldlIGNhbiBzZWUgdGhhdCB0aGUgcG9pbnQgZXN0aW1hdGUgb2YgdGhpcyBwcm9iYWJpbGl0eQppcyBgciByb3VuZChXT2JzLyhuMSpuMiksMykqMTAwYCUuCgpXZSBjYW4gaW50ZXJwcmV0IGl0IGFzIGZvbGxvd3M7CgpUaGVyZSBpcyBhIHByb2JhYmlsaXR5IG9mIDI3LjIlIHRoYXQgdGhlIFBDQiBjb25jZW50cmF0aW9uIGluIGEgcmFuZG9tCnNocmltcCB0aGF0IHdhcyBncm93biBpbiB0aGUgY29udHJvbCBjb25kaXRpb24gaXMKZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBQQ0IgY29uY2VudHJhdGlvbiBpbiBhIHJhbmRvbQpzaHJpbXAgdGhhdCB3YXMgZ3Jvd24gaW4gdGhlIHRyZWF0bWVudCBjb25kaXRpb24uIFRoaXMgcHJvYmFiaWxpdHkgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSA1MCUgb24gdGhlIDUlIHNpZ25pZmljYW5jZSBsZXZlbCAocCA9IDAuMDE4NzEpLgo=