1 Breast cancer dataset

  • Subset of study https://doi.org/10.1093/jnci/djj052

  • 32 breast cancer patients with estrogen receptor positive tumour that had tamoxifen chemotherapy. Variables:

    • grade: histological grade of tumour (grade 1 vs 3),
    • node: lymph node status (0: not affected, 1: lymph nodes affected and removed),
    • size: tumour size in cm,
    • ESR1 and S100A8 gene expression in tumour biopsy (microarray technology)
  • ESR1 in active in \(\pm\) 75% of breast cancer tumours.

  • Expression of ER gene positive for treatment: tumour responds to hormone therapy
    • Tamoxifen interacts with ER and modulates gene expression.
  • Proteins of S100 family often dysregulated in cancer

    • S100A8 expression represses immune system in tumour en creates an environment of inflammation that promotes tumour growth.
brca <- read_csv("https://raw.githubusercontent.com/GTPB/PSLS20/master/data/breastcancer.csv")
brca
# A tibble: 32 x 10
   sample_name filename     treatment    er grade  node  size   age  ESR1 S100A8
   <chr>       <chr>        <chr>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
 1 OXFT_209    gsm65344.ce… tamoxifen     1     3     1   2.5    66 1939.  207. 
 2 OXFT_1769   gsm65345.ce… tamoxifen     1     1     1   3.5    86 2752.   37.0
 3 OXFT_2093   gsm65347.ce… tamoxifen     1     1     1   2.2    74  379. 2364. 
 4 OXFT_1770   gsm65348.ce… tamoxifen     1     1     1   1.7    69 2532.   23.6
 5 OXFT_1342   gsm65350.ce… tamoxifen     1     3     0   2.5    62  141. 3219. 
 6 OXFT_2338   gsm65352.ce… tamoxifen     1     3     1   1.4    63 1495.  108. 
 7 OXFT_2341   gsm65353.ce… tamoxifen     1     1     1   3.3    76 3406.   14.0
 8 OXFT_1902   gsm65354.ce… tamoxifen     1     3     0   2.4    61 2813.   68.4
 9 OXFT_1982   gsm65355.ce… tamoxifen     1     1     0   1.7    62  950.   74.2
10 OXFT_5210   gsm65356.ce… tamoxifen     1     3     0   3.5    65 1053.  182. 
# … with 22 more rows

2 Research question

Is the expression of the S100A8 gene associated with that of that of the ESR1 gene?

3 Data exploration

There are many variables in the data, we will plot all variables in a scatterplot matrix using the GGally package.

#install.packages("GGally")
library(GGally)
brca[,-(1:4)] %>% ggpairs()

We now focus on the association between S100A8 expression and the ESR1 expression.

brca %>% 
  ggplot(aes(x=ESR1,y=S100A8)) +
  geom_point() +
  geom_smooth(se=FALSE,col="grey") +
  geom_smooth(method="lm",se=FALSE)

The association of S100A and ESR1 does not appear to be linear.

  • Concentration measurements are often skewed.
  • We will log2 transform the data.
brca %>% 
  ggplot(aes(x=ESR1 %>% log2,y=S100A8 %>% log2)) +
  geom_point() +
  geom_smooth(se=FALSE,col="grey") +
  geom_smooth(method="lm",se=FALSE)

Upon log transformation the data are showing a linear association. Is this association strong enough to be able to conclude that the S100A8 gene expression is associated to the ESR1 gene expression?

4 Descriptive statistics

We first calculate the Pearson and Spearman correlation based on the original data and the log2 transformed data

Pearson correlation

brca %>% 
  select(S100A8,ESR1) %>% 
  mutate(S100A8Log2=S100A8%>%log2,ESR1Log2=ESR1%>%log2) %>%
  cor
               S100A8       ESR1 S100A8Log2   ESR1Log2
S100A8      1.0000000 -0.5376479  0.8080424 -0.7717210
ESR1       -0.5376479  1.0000000 -0.7762524  0.9151322
S100A8Log2  0.8080424 -0.7762524  1.0000000 -0.8911990
ESR1Log2   -0.7717210  0.9151322 -0.8911990  1.0000000

Spearman correlation

brca %>% 
  select(S100A8,ESR1) %>% 
  mutate(S100A8Log2=S100A8%>%log2,ESR1Log2=ESR1%>%log2) %>%
  cor(,method = "spearman")
              S100A8      ESR1 S100A8Log2  ESR1Log2
S100A8      1.000000 -0.733871   1.000000 -0.733871
ESR1       -0.733871  1.000000  -0.733871  1.000000
S100A8Log2  1.000000 -0.733871   1.000000 -0.733871
ESR1Log2   -0.733871  1.000000  -0.733871  1.000000

Both the Pearson and Spearman correlation are negative. Note, that the Spearman correlation is much larger in absolute value than the Pearson correlation on the original expression measurements. Indeed, the Pearson correlation is affected by the non linear association at the original scale.

On the log scale the Pearson correlation is much higher. The spearman correlation, however, remains because it is based on rank transformed data.

5 Model

We will model the data on the log2 scale and we assume the following statistical model:

\[Y_i\vert X_i\sim N(\beta_0+\beta_1X_i,\sigma^2)\]

with \(Y_i\) the log2 transformed S100A8 gene expression and \(X_i\) the log2 transformed ESR1 gene expression.

5.1 Model fitting

We fit the model to the data using the lm function and we first assess the assumptions. Because the subjects were selected at random from the population they are independent. We still have to check the following assumptions.

  1. Linearity
  2. Equality of the variance
  3. The residuals are normally distribution.
lm2<-lm(S100A8%>%log2 ~ ESR1 %>% log2, brca)
plot(lm2)

summary(lm2)

Call:
lm(formula = S100A8 %>% log2 ~ ESR1 %>% log2, data = brca)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.94279 -0.66537  0.08124  0.68468  1.92714 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)     23.401      1.603   14.60 3.57e-15 ***
ESR1 %>% log2   -1.615      0.150  -10.76 8.07e-12 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.026 on 30 degrees of freedom
Multiple R-squared:  0.7942,    Adjusted R-squared:  0.7874 
F-statistic: 115.8 on 1 and 30 DF,  p-value: 8.07e-12

In the residuals vs fitted values plot we observe that the residuals are nicely spread around zero with more or less the same variance and we do not observed a trend in the residuals so there is no indication on deviations from linearity and homoscedasticity.

The QQ-plot further shows no substantial deviations from normality. So the assumptions hold.

We can now assess a formal hypothesis test to for the linear association between the S100A8 gene and the ESR1 gene expression at the log2 scale.

We can translate the hypothesis that there is an association between the S100A8 and ESR1 gene expression in terms of the slope of the model, so under the alternative hypothesis \(\beta_1\) is different from zero. \[H_1: \beta_1 \neq 0\]

With data we can never prove a hypothesis, so we therefore falsify the opposite: the null hypothesis the there is no association between the expression of both genes:

\[H_0: \beta_0 = 0\] We can do this by adopting a t-test on the slope and by using confidence intervals on the slope.

summary(lm2)

Call:
lm(formula = S100A8 %>% log2 ~ ESR1 %>% log2, data = brca)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.94279 -0.66537  0.08124  0.68468  1.92714 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)     23.401      1.603   14.60 3.57e-15 ***
ESR1 %>% log2   -1.615      0.150  -10.76 8.07e-12 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.026 on 30 degrees of freedom
Multiple R-squared:  0.7942,    Adjusted R-squared:  0.7874 
F-statistic: 115.8 on 1 and 30 DF,  p-value: 8.07e-12
confint(lm2)
                  2.5 %    97.5 %
(Intercept)   20.128645 26.674023
ESR1 %>% log2 -1.921047 -1.308185

Both the t-test and the confidence interval indicate that association is extremely significant. The interval moreover shows that the association is biologically relevant.

We will transform slope and the confidence interval back to the original scale to interpret the results in terms of fold changes.

2^(lm2$coef)
  (Intercept) ESR1 %>% log2 
 1.107908e+07  3.265519e-01 
2^confint(lm2)
                     2.5 %       97.5 %
(Intercept)   1.146373e+06 1.070733e+08
ESR1 %>% log2 2.640628e-01 4.038287e-01

6 Conclusion

There is an extremely significant negative association between the S100A8 gene expression and that of ESR1 (\(p<<0.001\)).

A patient with an ESR1 expression that is 2 times the expression of that of another patient will on average have an S100A8 expression that is 3.06 times lower (95% CI [2.48,3.79]).

LS0tCnRpdGxlOiAiQnJlYXN0IGNhbmNlciBleGFtcGxlIiAgIAphdXRob3I6ICJMaWV2ZW4gQ2xlbWVudCIKZGF0ZTogInN0YXRPbWljcywgR2hlbnQgVW5pdmVyc2l0eSAoaHR0cHM6Ly9zdGF0b21pY3MuZ2l0aHViLmlvKSIKb3V0cHV0OgogICAgaHRtbF9kb2N1bWVudDoKICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZSAgICAKICAgICAgdGhlbWU6IGNvc21vCiAgICAgIHRvYzogdHJ1ZQogICAgICB0b2NfZmxvYXQ6IHRydWUKICAgICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGluY2x1ZGUgPSBUUlVFLCBjb21tZW50ID0gTkEsIGVjaG8gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpCmxpYnJhcnkoUm1pc2MpCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCgojIEJyZWFzdCBjYW5jZXIgZGF0YXNldAotIFN1YnNldCBvZiBzdHVkeSBodHRwczovL2RvaS5vcmcvMTAuMTA5My9qbmNpL2RqajA1MgoKLSAzMiBicmVhc3QgY2FuY2VyIHBhdGllbnRzIHdpdGggZXN0cm9nZW4gcmVjZXB0b3IgcG9zaXRpdmUgdHVtb3VyIHRoYXQgaGFkIHRhbW94aWZlbiBjaGVtb3RoZXJhcHkuIFZhcmlhYmxlczoKCiAgICAtIGdyYWRlOiBoaXN0b2xvZ2ljYWwgZ3JhZGUgb2YgdHVtb3VyIChncmFkZSAxIHZzIDMpLAogICAgLSBub2RlOiBseW1waCBub2RlIHN0YXR1cyAgKDA6IG5vdCBhZmZlY3RlZCwgMTogbHltcGggbm9kZXMgYWZmZWN0ZWQgYW5kIHJlbW92ZWQpLAogICAgLSBzaXplOiB0dW1vdXIgc2l6ZSBpbiBjbSwKICAgIC0gRVNSMSBhbmQgUzEwMEE4IGdlbmUgZXhwcmVzc2lvbiBpbiB0dW1vdXIgYmlvcHN5IChtaWNyb2FycmF5IHRlY2hub2xvZ3kpCiAgICAKCi0gRVNSMSBpbiBhY3RpdmUgaW4gJFxwbSQgNzUlIG9mIGJyZWFzdCBjYW5jZXIgdHVtb3Vycy4KCi0gRXhwcmVzc2lvbiBvZiBFUiBnZW5lIHBvc2l0aXZlIGZvciB0cmVhdG1lbnQ6IHR1bW91ciByZXNwb25kcyB0byBob3Jtb25lIHRoZXJhcHkKICAgIC0gVGFtb3hpZmVuIGludGVyYWN0cyB3aXRoIEVSIGFuZCBtb2R1bGF0ZXMgZ2VuZSBleHByZXNzaW9uLgoKLSBQcm90ZWlucyBvZiBTMTAwIGZhbWlseSBvZnRlbiBkeXNyZWd1bGF0ZWQgaW4gY2FuY2VyCgogICAgICAtIFMxMDBBOCBleHByZXNzaW9uIHJlcHJlc3NlcyBpbW11bmUgc3lzdGVtIGluIHR1bW91ciBlbiBjcmVhdGVzIGFuIGVudmlyb25tZW50IG9mIGluZmxhbW1hdGlvbiB0aGF0IHByb21vdGVzIHR1bW91ciBncm93dGguCgoKYGBge3J9CmJyY2EgPC0gcmVhZF9jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9HVFBCL1BTTFMyMC9tYXN0ZXIvZGF0YS9icmVhc3RjYW5jZXIuY3N2IikKYnJjYQpgYGAKCgojIFJlc2VhcmNoIHF1ZXN0aW9uCgpJcyB0aGUgZXhwcmVzc2lvbiBvZiB0aGUgUzEwMEE4IGdlbmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgb2YgdGhhdCBvZiB0aGUgRVNSMSBnZW5lPyAKCiMgRGF0YSBleHBsb3JhdGlvbgoKVGhlcmUgYXJlIG1hbnkgdmFyaWFibGVzIGluIHRoZSBkYXRhLCB3ZSB3aWxsIHBsb3QgYWxsIHZhcmlhYmxlcyBpbiBhIHNjYXR0ZXJwbG90IG1hdHJpeCB1c2luZyB0aGUgR0dhbGx5IHBhY2thZ2UuCgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoIkdHYWxseSIpCmxpYnJhcnkoR0dhbGx5KQpicmNhWywtKDE6NCldICU+JSBnZ3BhaXJzKCkKYGBgCgpXZSBub3cgZm9jdXMgb24gdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gUzEwMEE4IGV4cHJlc3Npb24gYW5kIHRoZSBFU1IxIGV4cHJlc3Npb24uCgpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcid9CmJyY2EgJT4lIAogIGdncGxvdChhZXMoeD1FU1IxLHk9UzEwMEE4KSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgoc2U9RkFMU0UsY29sPSJncmV5IikgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNlPUZBTFNFKQpgYGAKClRoZSBhc3NvY2lhdGlvbiBvZiBTMTAwQSBhbmQgRVNSMSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgbGluZWFyLiAKCi0gQ29uY2VudHJhdGlvbiBtZWFzdXJlbWVudHMgYXJlIG9mdGVuIHNrZXdlZC4KLSBXZSB3aWxsIGxvZzIgdHJhbnNmb3JtIHRoZSBkYXRhLiAKCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJ30KYnJjYSAlPiUgCiAgZ2dwbG90KGFlcyh4PUVTUjEgJT4lIGxvZzIseT1TMTAwQTggJT4lIGxvZzIpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChzZT1GQUxTRSxjb2w9ImdyZXkiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2U9RkFMU0UpCmBgYAoKVXBvbiBsb2cgdHJhbnNmb3JtYXRpb24gdGhlIGRhdGEgYXJlIHNob3dpbmcgYSBsaW5lYXIgYXNzb2NpYXRpb24uIElzIHRoaXMgYXNzb2NpYXRpb24gc3Ryb25nIGVub3VnaCB0byBiZSBhYmxlIHRvIGNvbmNsdWRlIHRoYXQgdGhlIFMxMDBBOCBnZW5lIGV4cHJlc3Npb24gaXMgYXNzb2NpYXRlZCB0byB0aGUgRVNSMSBnZW5lIGV4cHJlc3Npb24/IAoKIyBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzCgpXZSBmaXJzdCBjYWxjdWxhdGUgdGhlIFBlYXJzb24gYW5kIFNwZWFybWFuIGNvcnJlbGF0aW9uIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBkYXRhIGFuZCB0aGUgbG9nMiB0cmFuc2Zvcm1lZCBkYXRhCgpQZWFyc29uICBjb3JyZWxhdGlvbgpgYGB7cn0KYnJjYSAlPiUgCiAgc2VsZWN0KFMxMDBBOCxFU1IxKSAlPiUgCiAgbXV0YXRlKFMxMDBBOExvZzI9UzEwMEE4JT4lbG9nMixFU1IxTG9nMj1FU1IxJT4lbG9nMikgJT4lCiAgY29yCmBgYAoKU3BlYXJtYW4gY29ycmVsYXRpb24KYGBge3J9CmJyY2EgJT4lIAogIHNlbGVjdChTMTAwQTgsRVNSMSkgJT4lIAogIG11dGF0ZShTMTAwQThMb2cyPVMxMDBBOCU+JWxvZzIsRVNSMUxvZzI9RVNSMSU+JWxvZzIpICU+JQogIGNvcigsbWV0aG9kID0gInNwZWFybWFuIikKYGBgCgpCb3RoIHRoZSBQZWFyc29uIGFuZCBTcGVhcm1hbiBjb3JyZWxhdGlvbiBhcmUgbmVnYXRpdmUuIE5vdGUsIHRoYXQgdGhlIFNwZWFybWFuIGNvcnJlbGF0aW9uIGlzIG11Y2ggbGFyZ2VyIGluIGFic29sdXRlIHZhbHVlIHRoYW4gdGhlIFBlYXJzb24gY29ycmVsYXRpb24gb24gdGhlIG9yaWdpbmFsIGV4cHJlc3Npb24gbWVhc3VyZW1lbnRzLiBJbmRlZWQsIHRoZSBQZWFyc29uIGNvcnJlbGF0aW9uIGlzIGFmZmVjdGVkIGJ5IHRoZSBub24gbGluZWFyIGFzc29jaWF0aW9uIGF0IHRoZSBvcmlnaW5hbCBzY2FsZS4gCgpPbiB0aGUgbG9nIHNjYWxlIHRoZSBQZWFyc29uIGNvcnJlbGF0aW9uIGlzIG11Y2ggaGlnaGVyLiAKVGhlIHNwZWFybWFuIGNvcnJlbGF0aW9uLCBob3dldmVyLCByZW1haW5zIGJlY2F1c2UgaXQgaXMgYmFzZWQgb24gcmFuayB0cmFuc2Zvcm1lZCBkYXRhLiAKCiMgTW9kZWwgCgpXZSB3aWxsIG1vZGVsIHRoZSBkYXRhIG9uIHRoZSBsb2cyIHNjYWxlIGFuZCB3ZSBhc3N1bWUgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNhbCBtb2RlbDoKCiQkWV9pXHZlcnQgWF9pXHNpbSBOKFxiZXRhXzArXGJldGFfMVhfaSxcc2lnbWFeMikkJAoKd2l0aCAkWV9pJCB0aGUgbG9nMiB0cmFuc2Zvcm1lZCBTMTAwQTggZ2VuZSBleHByZXNzaW9uIGFuZCAkWF9pJCB0aGUgbG9nMiB0cmFuc2Zvcm1lZCBFU1IxIGdlbmUgZXhwcmVzc2lvbi4gCgojIyBNb2RlbCBmaXR0aW5nCgpXZSBmaXQgdGhlIG1vZGVsIHRvIHRoZSBkYXRhIHVzaW5nIHRoZSBsbSBmdW5jdGlvbiBhbmQgd2UgZmlyc3QgYXNzZXNzIHRoZSBhc3N1bXB0aW9ucy4gQmVjYXVzZSB0aGUgc3ViamVjdHMgd2VyZSBzZWxlY3RlZCBhdCByYW5kb20gZnJvbSB0aGUgcG9wdWxhdGlvbiB0aGV5IGFyZSBpbmRlcGVuZGVudC4gV2Ugc3RpbGwgaGF2ZSB0byBjaGVjayB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zLgoKMS4gTGluZWFyaXR5CjIuIEVxdWFsaXR5IG9mIHRoZSB2YXJpYW5jZQozLiBUaGUgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRpb24uIAoKYGBge3J9CmxtMjwtbG0oUzEwMEE4JT4lbG9nMiB+IEVTUjEgJT4lIGxvZzIsIGJyY2EpCnBsb3QobG0yKQpzdW1tYXJ5KGxtMikKYGBgCgpJbiB0aGUgcmVzaWR1YWxzIHZzIGZpdHRlZCB2YWx1ZXMgcGxvdCB3ZSBvYnNlcnZlIHRoYXQgdGhlIHJlc2lkdWFscyBhcmUgbmljZWx5IHNwcmVhZCBhcm91bmQgemVybyB3aXRoIG1vcmUgb3IgbGVzcyB0aGUgc2FtZSB2YXJpYW5jZSBhbmQgd2UgZG8gbm90IG9ic2VydmVkIGEgdHJlbmQgaW4gdGhlIHJlc2lkdWFscyBzbyB0aGVyZSBpcyBubyBpbmRpY2F0aW9uIG9uIGRldmlhdGlvbnMgZnJvbSBsaW5lYXJpdHkgYW5kIGhvbW9zY2VkYXN0aWNpdHkuIAoKVGhlIFFRLXBsb3QgZnVydGhlciBzaG93cyBubyBzdWJzdGFudGlhbCBkZXZpYXRpb25zIGZyb20gbm9ybWFsaXR5LiBTbyB0aGUgYXNzdW1wdGlvbnMgaG9sZC4gCgpXZSBjYW4gbm93IGFzc2VzcyBhIGZvcm1hbCBoeXBvdGhlc2lzIHRlc3QgdG8gZm9yIHRoZSBsaW5lYXIgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgUzEwMEE4IGdlbmUgYW5kIHRoZSBFU1IxIGdlbmUgZXhwcmVzc2lvbiBhdCB0aGUgbG9nMiBzY2FsZS4gCgpXZSBjYW4gdHJhbnNsYXRlIHRoZSBoeXBvdGhlc2lzIHRoYXQgdGhlcmUgaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgUzEwMEE4IGFuZCBFU1IxIGdlbmUgZXhwcmVzc2lvbiBpbiB0ZXJtcyBvZiB0aGUgc2xvcGUgb2YgdGhlIG1vZGVsLCBzbyB1bmRlciB0aGUgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyAkXGJldGFfMSQgaXMgZGlmZmVyZW50IGZyb20gemVyby4gCiQkSF8xOiBcYmV0YV8xIFxuZXEgMCQkCgpXaXRoIGRhdGEgd2UgY2FuIG5ldmVyIHByb3ZlIGEgaHlwb3RoZXNpcywgc28gd2UgdGhlcmVmb3JlIGZhbHNpZnkgdGhlIG9wcG9zaXRlOiB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoZSB0aGVyZSBpcyBubyBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBleHByZXNzaW9uIG9mIGJvdGggZ2VuZXM6IAoKJCRIXzA6IFxiZXRhXzAgPSAwJCQKV2UgY2FuIGRvIHRoaXMgYnkgYWRvcHRpbmcgYSB0LXRlc3Qgb24gdGhlIHNsb3BlIGFuZCBieSB1c2luZyBjb25maWRlbmNlIGludGVydmFscyBvbiB0aGUgc2xvcGUuIAoKYGBge3J9CnN1bW1hcnkobG0yKQpjb25maW50KGxtMikKYGBgCgpCb3RoIHRoZSB0LXRlc3QgYW5kIHRoZSBjb25maWRlbmNlIGludGVydmFsIGluZGljYXRlIHRoYXQgYXNzb2NpYXRpb24gaXMgZXh0cmVtZWx5IHNpZ25pZmljYW50LiAKVGhlIGludGVydmFsIG1vcmVvdmVyIHNob3dzIHRoYXQgdGhlIGFzc29jaWF0aW9uIGlzIGJpb2xvZ2ljYWxseSByZWxldmFudC4KCldlIHdpbGwgdHJhbnNmb3JtIHNsb3BlIGFuZCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzY2FsZSB0byBpbnRlcnByZXQgdGhlIHJlc3VsdHMgaW4gdGVybXMgb2YgZm9sZCBjaGFuZ2VzLiAgCgpgYGB7cn0KMl4obG0yJGNvZWYpCmBgYAoKYGBge3J9CjJeY29uZmludChsbTIpCmBgYAogCgojIENvbmNsdXNpb24KClRoZXJlIGlzIGFuIGV4dHJlbWVseSBzaWduaWZpY2FudCBuZWdhdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBTMTAwQTggZ2VuZSBleHByZXNzaW9uIGFuZCB0aGF0IG9mIEVTUjEgKCRwPDwwLjAwMSQpLiAKCkEgcGF0aWVudCB3aXRoIGFuIEVTUjEgZXhwcmVzc2lvbiB0aGF0IGlzIDIgdGltZXMgdGhlIGV4cHJlc3Npb24gb2YgdGhhdCBvZiBhbm90aGVyIHBhdGllbnQgd2lsbCBvbiBhdmVyYWdlIGhhdmUgYW4gIFMxMDBBOCBleHByZXNzaW9uIHRoYXQgaXMgYHIgcm91bmQoMl4tbG0yJGNvZWZbMl0KLDIpYCB0aW1lcyBsb3dlciAoOTVcJSBDSSBbYHIgcGFzdGUoc29ydChyb3VuZCgyXi1jb25maW50KGxtMilbMixdLDIpKSxjb2xsYXBzZT0iLCIpYF0pLgoKCg==