In this material, we consider the special case of \(\beta_0=0\) (called regression through the origin).

What is regression through the origin?

Regression through the origin \((x,y)=(0,0)\) is not common but does happen. For example we consider a model where we may have a strong prior belief that there is no possibility that the intercept can be anything other than zero. Then our model reduces to \[ Y_i = \beta_1 x_i + \varepsilon_i\]
This model forces the mean value of y to equal 0 if \(x=0\). This is called regression through the origin.

All statistical packages allow you to fit this model, and it is useful at times - but one must interpret the results with care. One aspect of this warning is that we cannot use \(R^2\) to compare the goodness of fit with that of the usual linear model \(\beta_0+ \beta_1 x\).

The reason is that the usual \[R^2 = 1- \frac{\sum\left(y - \hat y\right)^2}{\sum\left(y - \bar y\right)^2}\]

refers to the improvement in fit relative to a flat line: the denominator is based on deviations around the mean. In the case of regression through the origin, the flat line would have to be the flat line going though y=0.
\[ \mbox{Fake }R^2 = 1- \frac{\sum\left(y - \hat y\right)^2}{\sum\left(y - 0\right)^2}\] For this reason the \(R^2\) can only be used to compare two models both of the same sort, i.e. both regression through the origin or both not through the origin.

Manawatu wind speeds example

As an example, the dataset TenMinuteWinds.csv gives the wind speed at a Manawatu Wind Farm, every 10 minutes for one day. Wind Farms want to be able to predict the wind 10 minutes ahead, because they have to nominate in advance how much electricity they can supply to the national power grid, and there is a financial incentive for getting their prediction as close to the true amount as possible.

Download TenMinuteWinds.csv to replicate the following examples.

Winds = read.csv(file = "../../data/TenMinuteWinds.csv", header = TRUE)
head(Winds)
  Hour Minutes Speed TenMinEarlier
1    0       0  8.73          8.74
2    0      10  9.28          8.73
3    0      20  9.35          9.28
4    0      30  9.91          9.35
5    0      40  9.21          9.91
6    0      50  9.63          9.21
tail(Winds)
    Hour Minutes Speed TenMinEarlier
139   23       0 10.42          9.75
140   23      10 10.38         10.42
141   23      20  8.97         10.38
142   23      30  7.97          8.97
143   23      40  8.18          7.97
144   23      50  9.23          8.18
plot(Speed ~ TenMinEarlier, data = Winds)
Wind.lm = lm(Speed ~ TenMinEarlier, data = Winds)
abline(Wind.lm)

unlabelled

A simple model used in Industry is the so-called Persistence model \[Speed_t = Speed_{t-1} + \varepsilon_t \] where \(Speed_{t-1}\) is the wind speed 1 unit of time (one row) earlier (i.e. 10 minutes earlier .) Note the slope of this model is 1, and the intercept is 0, implying that we predict the next wind speed to be exactly the same as the last one, which seems reasonable. The intercept =0 would imply that if there is no wind 10 minutes earlier then we predict no wind next time.

Having an intercept suggests the wind speed is always increasing by that amount (on average) over time. This might be reasonable in very short runs of data, but it is not realistic for a natural system that has an equilibrium.

We can examine this model by fitting the slightly more general model
\[ Speed_t = \beta_1 Speed_{t-1} +\varepsilon_t\] and checking whether the hypothesis \(H_0: \beta_1= 1\) is reasonable.

We fit this model in R using 0 + in the model formulation

Wind.lm0 = lm(Speed ~ 0 + TenMinEarlier, data = Winds)
summary(Wind.lm0)

Call:
lm(formula = Speed ~ 0 + TenMinEarlier, data = Winds)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.83822 -0.48117  0.02208  0.51050  2.05404 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
TenMinEarlier 0.994561   0.009108   109.2   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8488 on 143 degrees of freedom
Multiple R-squared:  0.9882,    Adjusted R-squared:  0.9881 
F-statistic: 1.192e+04 on 1 and 143 DF,  p-value: < 2.2e-16
confint(Wind.lm0)
                  2.5 %   97.5 %
TenMinEarlier 0.9765582 1.012564

The confidence interval shows that \(\beta_1= 1\) is included in the interval. So this indicates 1 is a plausible slope that cannot be rejected. If we want an actual p-value for \(H_0: \beta_1= 1\) vs \(H_1: \beta_1 \ne 1\) then we have to calculate our own \(T\) ratio \[ T = \frac{\hat\beta_1 -1}{se(\hat\beta_1)} \sim t_{n-1} \]

coeff = summary(Wind.lm0)$coef
coeff
               Estimate  Std. Error  t value      Pr(>|t|)
TenMinEarlier 0.9945612 0.009107649 109.2006 1.248051e-139
T = (coeff[1] - 1)/coeff[2]
T
[1] -0.5971713
Wind.df = summary(Wind.lm0)$df
Wind.df
[1]   1 143   1
pvalue = 1 - 2 * pt(-abs(T), df = Wind.df[2])
pvalue
[1] 0.4486626

Note that the \(df = n-1\) this time, since we are only estimating one coefficient \(\beta_1\) and not two coefficients.

However the question remains whether the assumption \(\beta_0 = 0\) is valid or not. We can examine this by comparing the output to the model with an intercept.

Wind.lm = lm(Speed ~ TenMinEarlier, data = Winds)
summary(Wind.lm)

Call:
lm(formula = Speed ~ TenMinEarlier, data = Winds)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.76044 -0.56069  0.06546  0.55033  1.93953 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    0.46593    0.22868   2.037   0.0435 *  
TenMinEarlier  0.93745    0.02944  31.839   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8396 on 142 degrees of freedom
Multiple R-squared:  0.8771,    Adjusted R-squared:  0.8763 
F-statistic:  1014 on 1 and 142 DF,  p-value: < 2.2e-16

Comparing these two models, we see that we would reject the null hypothesis \(H_0 : \beta_0 = 0\) with a p-value of 0.0435.

Also the residual standard error is lower in the model with an intercept.

What we cannot do is compare the \(R^2\) here to the Fake \(R^2\) from the model without an intercept. We also cannot compare the F statistics because they are based on different denominators.

It is recommended that you decide between such models based on the smallest RSE (residual standard error). In this case the two-parameter model wins.

Final reminder: we only fit models with regression through the origin if the context makes it a logical model.

Standardised variables

Another situation where regression through the origin makes sense is when the X and Y data have been standardised

\[\tilde{y_i} = \frac{y_i-\bar y}{s_y} ~, ~~~~~~ \tilde{ x_i} = \frac{x_i-\bar x}{s_x} \]

This is done quite often in social science or economics, where the actual units of measurement may be quite arbitrary, and it is more useful just to know whether a data value is average \(\tilde{y_i}=0\), above average (e.g. \(\tilde{y_i}=0.5\) or 1.8 etc.) or below average (e.g. \(\tilde{y_i}=-1\) or -2.3 etc.)

In that case a regression of \(\tilde{y }\) vs \(\tilde{x }\) will go through the origin.

What is the slope when \(s_y\) = \(s_x\)?

Back in the context of simple linear regression with or without an intercept, it can be shown that the slope estimate is \[\hat\beta_1 = r. \frac{s_y}{s_x}\]

That is why testing a hypothesis \(H_0:~~ \beta_1 = 0\) gives the same conclusion as testing for zero correlation \(H_0: ~~\rho = 0\).

What we are drawing attention to here is that if x and y have the same standard deviation then the slope equals the correlation coefficient.

Clearly this happens when dealing with standardised variables \(\tilde{y}\) and \(\tilde{x}\). Then the model becomes \[\tilde{y_i} = \rho \tilde{x_i}+ \varepsilon_i~.\] This means a confidence interval for the slope (in this context) can also be thought of as a confidence interval for the correlation.

Incidentally, since the correlation\(^2\) = the \(R^2\), the coefficient of determination, one could square the values in such a CI and get a confidence interval for the \(R^2\). Conversely, some hypothesis tests in econometrics are based on testing the hypothesis that the \(H_0:~R^2 =0\). We will not pursue this approach further in this course.

The other common situation where x and y have the same standard deviation is where the data for each variable are ranks. For example many international comparisons are made by coming up with some rather arbitrary set of criteria and then ranking the countries: 1= best country, 2=second best,…, \(n\)=worst country. If the same set of countries is ranked by both criteria then \(s_y\) = \(s_x\) and the slope equals the correlation coefficient. (However it will not be regression through the origin.)

LS0tDQp0aXRsZTogIkxlY3R1cmUgNDI6IEFwcGVuZGl4OiBSZWdyZXNzaW9uIHRocm91Z2ggdGhlIG9yaWdpbiINCnN1YnRpdGxlOiAxNjEuMjUxIFJlZ3Jlc3Npb24gTW9kZWxsaW5nDQphdXRob3I6ICJQcmVzZW50ZWQgYnkgTWF0dGhldyBQYXdsZXkgPE0uUGF3bGV5QG1hc3NleS5hYy5uej4iICANCmRhdGU6ICJXZWVrIDIgb2YgU2VtZXN0ZXIgMiwgYHIgbHVicmlkYXRlOjp5ZWFyKGx1YnJpZGF0ZTo6bm93KCkpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHlldGkNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogIGh0bWxfbm90ZWJvb2s6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiB5ZXRpDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICBpb3NsaWRlc19wcmVzZW50YXRpb246DQogICAgd2lkZXNjcmVlbjogdHJ1ZQ0KICAgIHNtYWxsZXI6IHRydWUNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KICBzbGlkeV9wcmVzZW50YXRpb246IA0KICAgIHRoZW1lOiB5ZXRpDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQoNCg0KDQo8IS0tLSBEYXRhIGlzIG9uDQpodHRwczovL3ItcmVzb3VyY2VzLm1hc3NleS5hYy5uei9kYXRhLzE2MTI1MS8NCi0tLT4NCg0KYGBge3Igc2V0dXAsIHB1cmw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0Kb3B0c19jaHVuayRzZXQoZGV2PWMoInBuZyIsICJwZGYiKSkNCm9wdHNfY2h1bmskc2V0KGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTcsIGZpZy5wYXRoPSJGaWd1cmVzLyIsIGZpZy5hbHQ9InVubGFiZWxsZWQiKQ0Kb3B0c19jaHVuayRzZXQoY29tbWVudD0iIiwgZmlnLmFsaWduPSJjZW50ZXIiLCB0aWR5PVRSVUUpDQpvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gJycpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoYnJvb20pDQpgYGANCg0KDQo8IS0tLSBEbyBub3QgZWRpdCBhbnl0aGluZyBhYm92ZSB0aGlzIGxpbmUuIC0tLT4NCg0KSW4gdGhpcyBtYXRlcmlhbCwgd2UgY29uc2lkZXIgdGhlIHNwZWNpYWwgY2FzZSBvZiAkXGJldGFfMD0wJCAoY2FsbGVkICoqcmVncmVzc2lvbiB0aHJvdWdoIHRoZSBvcmlnaW4qKikuDQoNCg0KIyMgV2hhdCBpcyByZWdyZXNzaW9uIHRocm91Z2ggdGhlIG9yaWdpbj8NCg0KUmVncmVzc2lvbiB0aHJvdWdoIHRoZSBvcmlnaW4gJCh4LHkpPSgwLDApJCBpcyBub3QgY29tbW9uIGJ1dCBkb2VzIGhhcHBlbi4gICBGb3IgZXhhbXBsZSB3ZSBjb25zaWRlciBhIG1vZGVsIHdoZXJlIHdlIG1heSBoYXZlIGEgc3Ryb25nIHByaW9yIGJlbGllZiB0aGF0IHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGludGVyY2VwdCBjYW4gYmUgYW55dGhpbmcgb3RoZXIgdGhhbiB6ZXJvLiAgIFRoZW4gb3VyIG1vZGVsIHJlZHVjZXMgdG8gICAgICQkIFlfaSA9IFxiZXRhXzEgeF9pICsgXHZhcmVwc2lsb25faSQkICANClRoaXMgbW9kZWwgZm9yY2VzIHRoZSBtZWFuIHZhbHVlIG9mICp5KiB0byBlcXVhbCAwIGlmICR4PTAkLiAgVGhpcyBpcyBjYWxsZWQgcmVncmVzc2lvbiB0aHJvdWdoIHRoZSBvcmlnaW4uDQoNCkFsbCBzdGF0aXN0aWNhbCBwYWNrYWdlcyBhbGxvdyB5b3UgdG8gZml0IHRoaXMgbW9kZWwsIGFuZCBpdCBpcyB1c2VmdWwgYXQgdGltZXMgLSBidXQgb25lIG11c3QgaW50ZXJwcmV0IHRoZSByZXN1bHRzIHdpdGggY2FyZS4gIE9uZSBhc3BlY3Qgb2YgdGhpcyB3YXJuaW5nIGlzIHRoYXQgKip3ZSBjYW5ub3QgIHVzZSAkUl4yJCB0byBjb21wYXJlIHRoZSBnb29kbmVzcyBvZiBmaXQgd2l0aCB0aGF0IG9mIHRoZSB1c3VhbCBsaW5lYXIgbW9kZWwqKiAgJFxiZXRhXzArIFxiZXRhXzEgeCQuICAgIA0KDQpUaGUgcmVhc29uIGlzIHRoYXQgdGhlIHVzdWFsIA0KJCRSXjIgPSAgMS0gXGZyYWN7XHN1bVxsZWZ0KHkgLSBcaGF0IHlccmlnaHQpXjJ9e1xzdW1cbGVmdCh5IC0gXGJhciB5XHJpZ2h0KV4yfSQkDQoNCnJlZmVycyB0byB0aGUgaW1wcm92ZW1lbnQgaW4gZml0IHJlbGF0aXZlIHRvIGEgZmxhdCBsaW5lOiB0aGUgZGVub21pbmF0b3IgaXMgYmFzZWQgb24gZGV2aWF0aW9ucyBhcm91bmQgdGhlIG1lYW4uICBJbiB0aGUgY2FzZSBvZiByZWdyZXNzaW9uIHRocm91Z2ggdGhlIG9yaWdpbiwgdGhlIGZsYXQgbGluZSB3b3VsZCBoYXZlIHRvIGJlIHRoZSBmbGF0IGxpbmUgZ29pbmcgdGhvdWdoIHk9MC4gIA0KJCQgXG1ib3h7RmFrZSB9Ul4yICA9IDEtIFxmcmFje1xzdW1cbGVmdCh5IC0gXGhhdCB5XHJpZ2h0KV4yfXtcc3VtXGxlZnQoeSAtIDBccmlnaHQpXjJ9JCQNCkZvciB0aGlzIHJlYXNvbiB0aGUgJFJeMiQgY2FuIG9ubHkgYmUgdXNlZCB0byBjb21wYXJlIHR3byBtb2RlbHMgYm90aCBvZiB0aGUgc2FtZSBzb3J0LCBpLmUuIGJvdGggcmVncmVzc2lvbiB0aHJvdWdoIHRoZSBvcmlnaW4gb3IgYm90aCBub3QgdGhyb3VnaCB0aGUgb3JpZ2luLiANCg0KIyMjIE1hbmF3YXR1IHdpbmQgc3BlZWRzIGV4YW1wbGUNCg0KQXMgYW4gZXhhbXBsZSwgdGhlIGRhdGFzZXQgICBUZW5NaW51dGVXaW5kcy5jc3YgIGdpdmVzIHRoZSB3aW5kIHNwZWVkIGF0IGEgTWFuYXdhdHUgV2luZCBGYXJtLCBldmVyeSAxMCBtaW51dGVzIGZvciBvbmUgZGF5LiAgICAgV2luZCBGYXJtcyB3YW50IHRvIGJlIGFibGUgdG8gcHJlZGljdCB0aGUgd2luZCAxMCBtaW51dGVzIGFoZWFkLCBiZWNhdXNlIHRoZXkgaGF2ZSB0byBub21pbmF0ZSBpbiBhZHZhbmNlIGhvdyBtdWNoIGVsZWN0cmljaXR5IHRoZXkgY2FuIHN1cHBseSB0byB0aGUgbmF0aW9uYWwgcG93ZXIgZ3JpZCwgIGFuZCB0aGVyZSBpcyBhIGZpbmFuY2lhbCBpbmNlbnRpdmUgZm9yIGdldHRpbmcgdGhlaXIgcHJlZGljdGlvbiBhcyBjbG9zZSB0byB0aGUgdHJ1ZSBhbW91bnQgYXMgcG9zc2libGUuIA0KDQoNCmByIHhmdW46OmVtYmVkX2ZpbGUoIi4uLy4uL2RhdGEvVGVuTWludXRlV2luZHMuY3N2IilgIHRvIHJlcGxpY2F0ZSB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLg0KIA0KDQpgYGB7ciBUZW4gTWludXRlIFdpbmRzfQ0KV2luZHMgPSByZWFkLmNzdihmaWxlPSIuLi8uLi9kYXRhL1Rlbk1pbnV0ZVdpbmRzLmNzdiIsIGhlYWRlcj1UUlVFKQ0KaGVhZChXaW5kcyk7IHRhaWwoV2luZHMpIA0KcGxvdChTcGVlZH5UZW5NaW5FYXJsaWVyLCBkYXRhPVdpbmRzKQ0KV2luZC5sbSA9IGxtKFNwZWVkIH4gVGVuTWluRWFybGllciwgZGF0YT1XaW5kcykNCmFibGluZShXaW5kLmxtKQ0KYGBgDQoNCg0KQSBzaW1wbGUgIG1vZGVsIHVzZWQgaW4gSW5kdXN0cnkgaXMgdGhlIHNvLWNhbGxlZCAqKlBlcnNpc3RlbmNlICBtb2RlbCoqDQokJFNwZWVkX3QgICA9IFNwZWVkX3t0LTF9ICAgICsgXHZhcmVwc2lsb25fdCAkJA0Kd2hlcmUgJFNwZWVkX3t0LTF9JCAgICBpcyB0aGUgd2luZCBzcGVlZCAxIHVuaXQgb2YgdGltZSAob25lIHJvdykgZWFybGllciAgIChpLmUuIDEwIG1pbnV0ZXMgZWFybGllciAuKSAgIE5vdGUgdGhlIHNsb3BlIG9mIHRoaXMgbW9kZWwgIGlzIDEsIGFuZCB0aGUgaW50ZXJjZXB0IGlzIDAsIGltcGx5aW5nIHRoYXQgd2UgcHJlZGljdCB0aGUgbmV4dCB3aW5kIHNwZWVkIHRvIGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGxhc3Qgb25lLCB3aGljaCBzZWVtcyByZWFzb25hYmxlLiBUaGUgaW50ZXJjZXB0ID0wIHdvdWxkIGltcGx5IHRoYXQgaWYgdGhlcmUgaXMgbm8gd2luZCAxMCBtaW51dGVzIGVhcmxpZXIgdGhlbiB3ZSBwcmVkaWN0IG5vIHdpbmQgbmV4dCB0aW1lLg0KDQpIYXZpbmcgYW4gaW50ZXJjZXB0IHN1Z2dlc3RzIHRoZSB3aW5kIHNwZWVkIGlzIGFsd2F5cyBpbmNyZWFzaW5nIGJ5IHRoYXQgYW1vdW50IChvbiBhdmVyYWdlKSBvdmVyIHRpbWUuIFRoaXMgbWlnaHQgYmUgcmVhc29uYWJsZSBpbiB2ZXJ5IHNob3J0IHJ1bnMgb2YgZGF0YSwgYnV0IGl0IGlzIG5vdCByZWFsaXN0aWMgZm9yIGEgbmF0dXJhbCBzeXN0ZW0gdGhhdCBoYXMgYW4gZXF1aWxpYnJpdW0uDQoNCldlIGNhbiBleGFtaW5lIHRoaXMgbW9kZWwgYnkgZml0dGluZyB0aGUgc2xpZ2h0bHkgbW9yZSBnZW5lcmFsIG1vZGVsICAgICAgICANCiQkIFNwZWVkX3QgICA9ICBcYmV0YV8xIFNwZWVkX3t0LTF9ICArXHZhcmVwc2lsb25fdCQkICAgICAgICAgYW5kIGNoZWNraW5nIHdoZXRoZXIgdGhlIGh5cG90aGVzaXMgJEhfMDogIFxiZXRhXzE9IDEkIGlzIHJlYXNvbmFibGUuIA0KDQpXZSBmaXQgdGhpcyBtb2RlbCBpbiBSIHVzaW5nICAqMCArKiBpbiB0aGUgbW9kZWwgZm9ybXVsYXRpb24gDQoNCmBgYHtyIE5vLWludGVyY2VwdH0NCldpbmQubG0wID0gbG0oU3BlZWQgfiAwICsgVGVuTWluRWFybGllciwgZGF0YT1XaW5kcykNCnN1bW1hcnkoV2luZC5sbTApDQpjb25maW50KFdpbmQubG0wKQ0KYGBgDQoNClRoZSBjb25maWRlbmNlIGludGVydmFsIHNob3dzIHRoYXQgJFxiZXRhXzE9IDEkIGlzIGluY2x1ZGVkIGluIHRoZSBpbnRlcnZhbC4gIFNvIHRoaXMgaW5kaWNhdGVzIDEgIGlzIGEgcGxhdXNpYmxlIHNsb3BlIHRoYXQgY2Fubm90IGJlIHJlamVjdGVkLiANCklmIHdlIHdhbnQgYW4gYWN0dWFsIHAtdmFsdWUgZm9yICRIXzA6ICBcYmV0YV8xPSAxJCB2cyAkSF8xOiAgXGJldGFfMSBcbmUgMSQgIHRoZW4gd2UgaGF2ZSB0byBjYWxjdWxhdGUgb3VyIG93biAkVCQgcmF0aW8NCiQkIFQgPSBcZnJhY3tcaGF0XGJldGFfMSAtMX17c2UoXGhhdFxiZXRhXzEpfSAgXHNpbSB0X3tuLTF9ICQkDQoNCmBgYHtyIFQgYW5kIHAtdmFsdWV9DQpjb2VmZiA9IHN1bW1hcnkoV2luZC5sbTApJGNvZWYgDQpjb2VmZg0KVCA9IChjb2VmZlsxXSAtIDEpIC9jb2VmZlsyXTsgICBUDQoNCldpbmQuZGYgPSBzdW1tYXJ5KFdpbmQubG0wKSRkZg0KV2luZC5kZg0KcHZhbHVlID0gMSAtIDIqcHQoLWFicyhUKSxkZj0gIFdpbmQuZGZbMl0pDQpwdmFsdWUNCmBgYA0KTm90ZSB0aGF0IHRoZSAkZGYgPSBuLTEkIHRoaXMgdGltZSwgc2luY2Ugd2UgYXJlIG9ubHkgZXN0aW1hdGluZyBvbmUgY29lZmZpY2llbnQgJFxiZXRhXzEkICBhbmQgbm90IHR3byBjb2VmZmljaWVudHMuIA0KDQpIb3dldmVyIHRoZSBxdWVzdGlvbiByZW1haW5zIHdoZXRoZXIgdGhlIGFzc3VtcHRpb24gICRcYmV0YV8wID0gMCQgaXMgdmFsaWQgb3Igbm90LiAgV2UgY2FuIGV4YW1pbmUgdGhpcyBieSBjb21wYXJpbmcgdGhlIG91dHB1dCB0byB0aGUgbW9kZWwgKndpdGgqIGFuIGludGVyY2VwdC4gDQoNCmBgYHtyIHdpdGhJbnRlcmNlcHR9DQpXaW5kLmxtID0gbG0oIFNwZWVkIH4gVGVuTWluRWFybGllciwgZGF0YT1XaW5kcykNCnN1bW1hcnkoV2luZC5sbSkNCmBgYA0KDQpDb21wYXJpbmcgdGhlc2UgdHdvIG1vZGVscywgd2Ugc2VlIHRoYXQgd2Ugd291bGQgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgJEhfMCA6IFxiZXRhXzAgPSAwJCB3aXRoIGEgcC12YWx1ZSBvZiBgciByb3VuZChzdW1tYXJ5KFdpbmQubG0pJGNvZWZbN10sNClgLiANCg0KQWxzbyB0aGUgcmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IgaXMgbG93ZXIgaW4gdGhlIG1vZGVsIHdpdGggYW4gaW50ZXJjZXB0LiANCg0KV2hhdCB3ZSAqY2Fubm90IGRvKiBpcyBjb21wYXJlIHRoZSAkUl4yJCBoZXJlIHRvIHRoZSAqRmFrZSogJFJeMiQgZnJvbSB0aGUgbW9kZWwgd2l0aG91dCBhbiBpbnRlcmNlcHQuICBXZSBhbHNvIGNhbm5vdCBjb21wYXJlIHRoZSAqRiBzdGF0aXN0aWNzKiBiZWNhdXNlIHRoZXkgYXJlIGJhc2VkIG9uIGRpZmZlcmVudCBkZW5vbWluYXRvcnMuIA0KDQpJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkZWNpZGUgYmV0d2VlbiBzdWNoIG1vZGVscyBiYXNlZCBvbiB0aGUgc21hbGxlc3QgUlNFIChyZXNpZHVhbCBzdGFuZGFyZCBlcnJvcikuICBJbiB0aGlzICBjYXNlIHRoZSB0d28tcGFyYW1ldGVyIG1vZGVsIHdpbnMuIA0KDQpGaW5hbCByZW1pbmRlcjogd2Ugb25seSBmaXQgbW9kZWxzIHdpdGggcmVncmVzc2lvbiB0aHJvdWdoIHRoZSBvcmlnaW4gaWYgdGhlIGNvbnRleHQgbWFrZXMgaXQgYSBsb2dpY2FsIG1vZGVsLiANCg0KIyMgU3RhbmRhcmRpc2VkIHZhcmlhYmxlcw0KDQpBbm90aGVyIHNpdHVhdGlvbiB3aGVyZSByZWdyZXNzaW9uIHRocm91Z2ggdGhlIG9yaWdpbiBtYWtlcyBzZW5zZSBpcyB3aGVuIHRoZSAqWCogYW5kICpZKiBkYXRhIGhhdmUgYmVlbiBzdGFuZGFyZGlzZWQNCg0KJCRcdGlsZGV7eV9pfSA9IFxmcmFje3lfaS1cYmFyIHl9e3NfeX0gfiwgDQp+fn5+fn4gIFx0aWxkZXsgeF9pfSA9IFxmcmFje3hfaS1cYmFyIHh9e3NfeH0gICAkJA0KDQpUaGlzIGlzIGRvbmUgcXVpdGUgb2Z0ZW4gaW4gc29jaWFsIHNjaWVuY2Ugb3IgZWNvbm9taWNzLCAgd2hlcmUgdGhlIGFjdHVhbCB1bml0cyBvZiBtZWFzdXJlbWVudCBtYXkgYmUgcXVpdGUgYXJiaXRyYXJ5LCAgYW5kIGl0IGlzIG1vcmUgdXNlZnVsIGp1c3QgdG8ga25vdyB3aGV0aGVyIGEgZGF0YSB2YWx1ZSBpcyBhdmVyYWdlICRcdGlsZGV7eV9pfT0wJCwgYWJvdmUgYXZlcmFnZSAoZS5nLiAkXHRpbGRle3lfaX09MC41JCBvciAxLjggZXRjLikgIG9yIGJlbG93IGF2ZXJhZ2UgKGUuZy4gJFx0aWxkZXt5X2l9PS0xJCBvciAtMi4zIGV0Yy4pDQoNCkluIHRoYXQgY2FzZSBhIHJlZ3Jlc3Npb24gb2YgJFx0aWxkZXt5IH0kIHZzICRcdGlsZGV7eCB9JCB3aWxsIGdvIHRocm91Z2ggdGhlIG9yaWdpbi4gICANCg0KIyMgV2hhdCBpcyB0aGUgc2xvcGUgd2hlbiAkc195JCA9ICRzX3gkPw0KDQpCYWNrIGluIHRoZSBjb250ZXh0IG9mIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiB3aXRoIG9yIHdpdGhvdXQgYW4gaW50ZXJjZXB0LCBpdCBjYW4gYmUgc2hvd24gdGhhdCB0aGUgc2xvcGUgZXN0aW1hdGUgaXMgDQokJFxoYXRcYmV0YV8xID0gIHIuIFxmcmFje3NfeX17c194fSQkDQoNClRoYXQgaXMgd2h5IHRlc3RpbmcgYSBoeXBvdGhlc2lzICAkSF8wOn5+IFxiZXRhXzEgPSAwJCBnaXZlcyB0aGUgc2FtZSBjb25jbHVzaW9uIGFzIHRlc3RpbmcgZm9yIHplcm8gY29ycmVsYXRpb24gJEhfMDogfn5ccmhvID0gMCQuDQoNCldoYXQgd2UgYXJlIGRyYXdpbmcgYXR0ZW50aW9uIHRvIGhlcmUgaXMgdGhhdCBpZiAqeCogYW5kICp5KiBoYXZlIHRoZSBzYW1lIHN0YW5kYXJkIGRldmlhdGlvbiB0aGVuIHRoZSBzbG9wZSBlcXVhbHMgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50LiANCg0KQ2xlYXJseSB0aGlzIGhhcHBlbnMgd2hlbiBkZWFsaW5nICB3aXRoIHN0YW5kYXJkaXNlZCB2YXJpYWJsZXMgJFx0aWxkZXt5fSQgYW5kICRcdGlsZGV7eH0kLiAgVGhlbiB0aGUgbW9kZWwgYmVjb21lcyANCiQkXHRpbGRle3lfaX0gPSBccmhvIFx0aWxkZXt4X2l9KyBcdmFyZXBzaWxvbl9pfi4kJA0KVGhpcyBtZWFucyBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBzbG9wZSAoaW4gdGhpcyBjb250ZXh0KSBjYW4gYWxzbyBiZSB0aG91Z2h0IG9mIGFzIGEgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIGNvcnJlbGF0aW9uLg0KDQpJbmNpZGVudGFsbHksIHNpbmNlIHRoZSBjb3JyZWxhdGlvbiReMiQgPSB0aGUgJFJeMiQsIHRoZSBjb2VmZmljaWVudCBvZiBkZXRlcm1pbmF0aW9uLCAgb25lIGNvdWxkIHNxdWFyZSB0aGUgdmFsdWVzIGluIHN1Y2ggYSBDSSBhbmQgIGdldCBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSAkUl4yJC4gQ29udmVyc2VseSwgc29tZSBoeXBvdGhlc2lzIHRlc3RzIGluIGVjb25vbWV0cmljcyAgYXJlICBiYXNlZCBvbiB0ZXN0aW5nIHRoZSAgaHlwb3RoZXNpcyB0aGF0IHRoZSAkSF8wOn5SXjIgPTAkLiBXZSB3aWxsIG5vdCBwdXJzdWUgdGhpcyBhcHByb2FjaCBmdXJ0aGVyIGluIHRoaXMgY291cnNlLiANCg0KVGhlIG90aGVyIGNvbW1vbiBzaXR1YXRpb24gd2hlcmUgKngqIGFuZCAqeSogaGF2ZSB0aGUgc2FtZSBzdGFuZGFyZCBkZXZpYXRpb24gaXMgd2hlcmUgdGhlIGRhdGEgZm9yIGVhY2ggdmFyaWFibGUgYXJlIHJhbmtzLiAgRm9yIGV4YW1wbGUgbWFueSBpbnRlcm5hdGlvbmFsIGNvbXBhcmlzb25zIGFyZSBtYWRlIGJ5IGNvbWluZyB1cCB3aXRoIHNvbWUgcmF0aGVyIGFyYml0cmFyeSBzZXQgb2YgY3JpdGVyaWEgYW5kIHRoZW4gcmFua2luZyB0aGUgY291bnRyaWVzOiAxPSBiZXN0IGNvdW50cnksIDI9c2Vjb25kIGJlc3QsLi4uLCAkbiQ9d29yc3QgY291bnRyeS4gIElmICB0aGUgc2FtZSBzZXQgb2YgY291bnRyaWVzIGlzIHJhbmtlZCBieSBib3RoIGNyaXRlcmlhIHRoZW4gJHNfeSQgPSAkc194JCBhbmQgdGhlICBzbG9wZSBlcXVhbHMgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50LiAgKEhvd2V2ZXIgaXQgd2lsbCBub3QgYmUgcmVncmVzc2lvbiB0aHJvdWdoIHRoZSBvcmlnaW4uKSANCg0KDQoNCg==