About

In this worksheet we look at different variance, covariance, volatility, and causality calculations. We finish with a short matematical proof (no R required).

Setup

Remember to always set your working directory to the source file location. Go to ‘Session’, scroll down to ‘Set Working Directory’, and click ‘To Source File Location’. Read carefully the below and follow the instructions to complete the tasks and answer any questions. Submit your work to RPubs as detailed in previous notes.

Note

For clarity, tasks/questions to be completed/answered are highlighted in red color (color visible only in preview mode) and numbered according to their particular placement in the task section. Type your answers outside the red color tags!

Quite often you will need to add your own code chunk. Execute sequentially all code chunks, preview, publish, and submit link on Sakai following the naming convention. Make sure to add comments to your code where appropriate. Use own language!

Any sign of plagiarism, will result in dissmissal of work!


Task 1: Variance, Covariance, and Volatility

This task follows the two examples in the book R Example 2.5/p. 58 and R Example 2.6/p. 66

# Require will load the package only if not installed 
# Dependencies = TRUE makes sure that dependencies are install
if(!require("quantmod",quietly = TRUE))
  install.packages("quantmod",dependencies = TRUE, repos = "https://cloud.r-project.org")

##### 1A) Calculate the correlation and covariance matrix of the adjusted daily log returns for four different stocks of your choice. Explain your observations in terms of potential relationships.

Here the 4 shares show a positive covariance, which indicates that if one share goes up, so does the other. a covariance lias between -1 and +1, we can decide the strength of the covariance from the fact that how close it is to 1. closer to 1, stronger the covarience. the correlation between these 4 stocks is very high in most cases it is more than 50%. Which means they are very similar and mostly from the same industry.

 getSymbols("ORCL",src="yahoo")
[1] "ORCL"
ORCLRD=dailyReturn(ORCL,periods="daily", type="log")
getSymbols("SAP",src="yahoo")
[1] "SAP"
SAPRD=dailyReturn(SAP,periods="daily", type="log")
getSymbols("ADBE",src="yahoo")
[1] "ADBE"
ADBERD=dailyReturn(ADBE,periods="daily", type="log")
getSymbols("IBM",src="yahoo")
[1] "IBM"
IBMRD=dailyReturn(IBM,periods="daily", type="log")
M<- cbind(ORCLRD,SAPRD,ADBERD,IBMRD)
colnames(M)<- c("ORCLRD","SAPRD","ADBERD","IBMRD")
colnames(M)
[1] "ORCLRD" "SAPRD"  "ADBERD" "IBMRD" 
cov(M)
             ORCLRD        SAPRD       ADBERD        IBMRD
ORCLRD 0.0003047189 0.0001829241 0.0002035892 0.0001412052
SAPRD  0.0001829241 0.0003068716 0.0001929072 0.0001299595
ADBERD 0.0002035892 0.0001929072 0.0004310746 0.0001431262
IBMRD  0.0001412052 0.0001299595 0.0001431262 0.0001956820
cor(M, method = "pearson")
          ORCLRD     SAPRD    ADBERD     IBMRD
ORCLRD 1.0000000 0.5981953 0.5617314 0.5782631
SAPRD  0.5981953 1.0000000 0.5303882 0.5303399
ADBERD 0.5617314 0.5303882 1.0000000 0.4927964
IBMRD  0.5782631 0.5303399 0.4927964 1.0000000
  

##### 1B) Calculate the three types of volatility for a particular stock of your choice. Consider a time window extending one year back from most recent obtainable closing day price. Order the three estimates from low to high volatility and explain how the ordering makes sense.

nflx=NFLX['2017-11/2018-11'];m=length(nflx$NFLX.Close);
ohcl<-nflx[,c("NFLX.Open","NFLX.High","NFLX.Low","NFLX.Close")]
vClose<-volatility(ohcl,n=m,calc="close",N=252)
vParkinson<-volatility(ohcl,n=m,calc="parkinson", N=252)
vGK<-volatility(ohcl,n=m,calc="garman",N=252)
vClose[m];vParkinson[m];vGK[m]
                [,1]
2018-11-30 0.4257689
                [,1]
2018-11-30 0.3756358
                [,1]
2018-11-30 0.3708174

The volatilities above show that, the more we stabalize this stock, lesser is the volatility. if we just consider the opening and closing price it shows a very high volatility but as we add more factors like random walk, highs and lows to it, the number starts to diffuse. This says that although the stock is volatile, the numbers of volatility may be a bit inflated.

Task 2: Auto-Correlation and Auto-Regression

Follow the example in the book R Example 3.2/p. 74 and R Example 4.1/p. 115

##### 2A) Calculate the ACF for a stock of your choice. Consider both the log return and squared log return. Interpret your results in terms of possible existence of autocorrelation.

1,13,17,29 show some linear dependence on past values. We do see some level of autocorrelation

getSymbols("ORCL",src="yahoo")
[1] "ORCL"
ORCLRD=dailyReturn(ORCL,periods="daily", type="log")
ORCLRD1<- ORCLRD^2
acf(ORCLRD)

pacf(ORCLRD)

acf(ORCLRD1)

pacf(ORCLRD1)

##### 2B) Plot the exchange rate for USD versus another currency of your choice. Interpret your results in terms of behavior.

As we can see the rates started declining since august and continued to fall rapidly upto october.In october the INR saw it’s lowest point and then started gaining ground as it tried to regain it’s previous position. The decline was a result of pull out by the FIIs.

##### 2C) Test for the possible existence of an underlying AR(1) – Markov process in your exchange rate currency pair. To this end, plot the ACF and the partial ACF (PACF). Interpret your results. Clearly refer to the lags, and their impacts in determining the order.

There exists a Markov process in the currency data as the past rate of the currency on any given date does not affect it’s future rate given the present rate. The future rate is independent and moves based on other factors than the past rate. As we can see in the ACF and PACF plots there is no substantial linear correlation.

Task 3: Granger Causality Test

To conduct this test the package lmtest will be required, as already done in the code chunk below.

grangertest(chicken ~ egg, order = 3, data = ChickEgg)
Granger causality test

Model 1: chicken ~ Lags(chicken, 1:3) + Lags(egg, 1:3)
Model 2: chicken ~ Lags(chicken, 1:3)
  Res.Df Df     F   Pr(>F)   
1     44                     
2     47 -3 5.405 0.002966 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
grangertest(egg ~ chicken, order = 3, data = ChickEgg)
Granger causality test

Model 1: egg ~ Lags(egg, 1:3) + Lags(chicken, 1:3)
Model 2: egg ~ Lags(egg, 1:3)
  Res.Df Df      F Pr(>F)
1     44                 
2     47 -3 0.5916 0.6238

##### 3A) Include below the code chunk to solve for 3.5.7 R Lab/p. 106. Write your conclusions.

grangertest(chicken ~ egg, order = 3, data = ChickEgg)
Granger causality test

Model 1: chicken ~ Lags(chicken, 1:3) + Lags(egg, 1:3)
Model 2: chicken ~ Lags(chicken, 1:3)
  Res.Df Df     F   Pr(>F)   
1     44                     
2     47 -3 5.405 0.002966 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
grangertest(egg ~ chicken, order = 3, data = ChickEgg)
Granger causality test

Model 1: egg ~ Lags(egg, 1:3) + Lags(chicken, 1:3)
Model 2: egg ~ Lags(egg, 1:3)
  Res.Df Df      F Pr(>F)
1     44                 
2     47 -3 0.5916 0.6238

In the first case of chicken causing egg, the p-value is 0.002966 which is less than the critical value, so we reject the null hypothesis and say that chicken does depend on eggs and chicken.

In the second case of eggs causing chicken, the p-value is 0.6238 which is above the critical value, so we cannot reject the null hypothesis that eggs may not depend on chicken.

##### 3B) Briefly describe the data in terms of time range and variables. Similar to the linear autoegressive model described in class, write the mathematical regression model solved in each Granger test, including the proper order. Use naming conventions, and notations more reflective of the data set considered for ChickEgg.

Task 4: Mathematical Proof

##### 4A) Prove the two results in Eq (2.32)/p. 53. No R-coding is needed here. Clearly show your steps. Hint: Use the definition of \(E(X^n)\) for X-log normally distributed. Observe also that \(Var(X) = E(X^2)-E^2(X)\) for any random variable X.

```

*http://computationalfinance.lsi.upc.edu

LS0tDQp0aXRsZTogIkZJTkM2MjEgV2ludGVyIDIwMTgtMTkgTGFiIFdvcmtzaGVldCAwMyINCmF1dGhvcjogIlNhbmdhbWl0cmEgQUdyYXdhbCINCmRhdGU6ICIxMi8wNS8yMDE4Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQNCnN1YnRpdGxlOiBWYXJpYW5jZSwgQ292YXJpYW5jZSwgQ29ycmVsYXRpb24gJiBDYXVzYWxpdHkgKGZpbmM2MjEtbGFiMDMpDQotLS0NCg0KIyMjIEFib3V0DQoNCkluIHRoaXMgd29ya3NoZWV0IHdlIGxvb2sgYXQgZGlmZmVyZW50IHZhcmlhbmNlLCBjb3ZhcmlhbmNlLCB2b2xhdGlsaXR5LCBhbmQgY2F1c2FsaXR5IGNhbGN1bGF0aW9ucy4gV2UgZmluaXNoIHdpdGggYSBzaG9ydCBtYXRlbWF0aWNhbCBwcm9vZiAobm8gUiByZXF1aXJlZCkuICANCg0KIyMjIFNldHVwDQoNClJlbWVtYmVyIHRvIGFsd2F5cyBzZXQgeW91ciB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24uIEdvIHRvICdTZXNzaW9uJywgc2Nyb2xsIGRvd24gdG8gJ1NldCBXb3JraW5nIERpcmVjdG9yeScsIGFuZCBjbGljayAnVG8gU291cmNlIEZpbGUgTG9jYXRpb24nLiBSZWFkIGNhcmVmdWxseSB0aGUgYmVsb3cgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGNvbXBsZXRlIHRoZSB0YXNrcyBhbmQgYW5zd2VyIGFueSBxdWVzdGlvbnMuICBTdWJtaXQgeW91ciB3b3JrIHRvIFJQdWJzIGFzIGRldGFpbGVkIGluIHByZXZpb3VzIG5vdGVzLiANCg0KIyMjIE5vdGUNCg0KRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAoY29sb3IgdmlzaWJsZSBvbmx5IGluIHByZXZpZXcgbW9kZSkgYW5kIG51bWJlcmVkIGFjY29yZGluZyB0byB0aGVpciBwYXJ0aWN1bGFyIHBsYWNlbWVudCBpbiB0aGUgdGFzayBzZWN0aW9uLiAgVHlwZSB5b3VyIGFuc3dlcnMgb3V0c2lkZSB0aGUgcmVkIGNvbG9yIHRhZ3MhDQoNClF1aXRlIG9mdGVuIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHlvdXIgb3duIGNvZGUgY2h1bmsuIEV4ZWN1dGUgc2VxdWVudGlhbGx5IGFsbCBjb2RlIGNodW5rcywgcHJldmlldywgcHVibGlzaCwgYW5kIHN1Ym1pdCBsaW5rIG9uIFNha2FpIGZvbGxvd2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24uIE1ha2Ugc3VyZSB0byBhZGQgY29tbWVudHMgdG8geW91ciBjb2RlIHdoZXJlIGFwcHJvcHJpYXRlLiBVc2Ugb3duIGxhbmd1YWdlIQ0KDQoqKkFueSBzaWduIG9mIHBsYWdpYXJpc20sIHdpbGwgcmVzdWx0IGluIGRpc3NtaXNzYWwgb2Ygd29yayEqKg0KDQotLS0tLS0tLS0tLS0tLQ0KDQojIyMgVGFzayAxOiBWYXJpYW5jZSwgQ292YXJpYW5jZSwgYW5kIFZvbGF0aWxpdHkNCg0KVGhpcyB0YXNrIGZvbGxvd3MgdGhlIHR3byBleGFtcGxlcyBpbiB0aGUgYm9vayBgUiBFeGFtcGxlIDIuNS9wLiA1OGAgYW5kIGBSIEV4YW1wbGUgMi42L3AuIDY2YCANCg0KYGBge3J9DQojIFJlcXVpcmUgd2lsbCBsb2FkIHRoZSBwYWNrYWdlIG9ubHkgaWYgbm90IGluc3RhbGxlZCANCiMgRGVwZW5kZW5jaWVzID0gVFJVRSBtYWtlcyBzdXJlIHRoYXQgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsDQppZighcmVxdWlyZSgicXVhbnRtb2QiLHF1aWV0bHkgPSBUUlVFKSkNCiAgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpDQpgYGANCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFBKSBDYWxjdWxhdGUgdGhlIGNvcnJlbGF0aW9uIGFuZCBjb3ZhcmlhbmNlIG1hdHJpeCBvZiB0aGUgYWRqdXN0ZWQgZGFpbHkgbG9nIHJldHVybnMgZm9yIGZvdXIgZGlmZmVyZW50IHN0b2NrcyBvZiB5b3VyIGNob2ljZS4gRXhwbGFpbiB5b3VyIG9ic2VydmF0aW9ucyBpbiB0ZXJtcyBvZiBwb3RlbnRpYWwgcmVsYXRpb25zaGlwcy4NCjwvc3Bhbj4NCg0KSGVyZSB0aGUgNCBzaGFyZXMgc2hvdyBhIHBvc2l0aXZlIGNvdmFyaWFuY2UsIHdoaWNoIGluZGljYXRlcyB0aGF0IGlmIG9uZSBzaGFyZSBnb2VzIHVwLCBzbyBkb2VzIHRoZSBvdGhlci4gYSBjb3ZhcmlhbmNlIGxpYXMgYmV0d2VlbiAtMSBhbmQgKzEsIHdlIGNhbiBkZWNpZGUgdGhlIHN0cmVuZ3RoIG9mIHRoZSBjb3ZhcmlhbmNlIGZyb20gdGhlIGZhY3QgdGhhdCBob3cgY2xvc2UgaXQgaXMgdG8gMS4gY2xvc2VyIHRvIDEsIHN0cm9uZ2VyIHRoZSBjb3ZhcmllbmNlLg0KdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlc2UgNCBzdG9ja3MgaXMgdmVyeSBoaWdoIGluIG1vc3QgY2FzZXMgaXQgaXMgbW9yZSB0aGFuIDUwJS4gV2hpY2ggbWVhbnMgdGhleSBhcmUgdmVyeSBzaW1pbGFyIGFuZCBtb3N0bHkgZnJvbSB0aGUgc2FtZSBpbmR1c3RyeS4NCg0KDQpgYGB7cn0NCiBnZXRTeW1ib2xzKCJPUkNMIixzcmM9InlhaG9vIikNCk9SQ0xSRD1kYWlseVJldHVybihPUkNMLHBlcmlvZHM9ImRhaWx5IiwgdHlwZT0ibG9nIikNCg0KZ2V0U3ltYm9scygiU0FQIixzcmM9InlhaG9vIikNClNBUFJEPWRhaWx5UmV0dXJuKFNBUCxwZXJpb2RzPSJkYWlseSIsIHR5cGU9ImxvZyIpDQoNCmdldFN5bWJvbHMoIkFEQkUiLHNyYz0ieWFob28iKQ0KQURCRVJEPWRhaWx5UmV0dXJuKEFEQkUscGVyaW9kcz0iZGFpbHkiLCB0eXBlPSJsb2ciKQ0KDQpnZXRTeW1ib2xzKCJJQk0iLHNyYz0ieWFob28iKQ0KSUJNUkQ9ZGFpbHlSZXR1cm4oSUJNLHBlcmlvZHM9ImRhaWx5IiwgdHlwZT0ibG9nIikNCg0KDQpNPC0gY2JpbmQoT1JDTFJELFNBUFJELEFEQkVSRCxJQk1SRCkNCg0KY29sbmFtZXMoTSk8LSBjKCJPUkNMUkQiLCJTQVBSRCIsIkFEQkVSRCIsIklCTVJEIikNCmNvbG5hbWVzKE0pDQoNCmNvdihNKQ0KDQpjb3IoTSwgbWV0aG9kID0gInBlYXJzb24iKQ0KICANCg0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUIpIENhbGN1bGF0ZSB0aGUgdGhyZWUgdHlwZXMgb2Ygdm9sYXRpbGl0eSBmb3IgYSBwYXJ0aWN1bGFyIHN0b2NrIG9mIHlvdXIgY2hvaWNlLiBDb25zaWRlciBhIHRpbWUgd2luZG93IGV4dGVuZGluZyBvbmUgeWVhciBiYWNrIGZyb20gbW9zdCByZWNlbnQgb2J0YWluYWJsZSBjbG9zaW5nIGRheSBwcmljZS4gT3JkZXIgdGhlIHRocmVlIGVzdGltYXRlcyBmcm9tIGxvdyB0byBoaWdoIHZvbGF0aWxpdHkgYW5kIGV4cGxhaW4gaG93IHRoZSBvcmRlcmluZyBtYWtlcyBzZW5zZS4NCjwvc3Bhbj4NCg0KYGBge3J9DQojIEZvciB0aGlzIHRhc2sgbWFrZSBzdXJlIHlvdSB1bmRlcnN0YW5kIHdlbGwgd2hhdCB0aGUgdmFyaWFibGVzIG4sbSByZXByZXNlbnQgaW4gdGhlIGJvb2sncyByZWZlcmVuY2VkIGV4YW1wbGUuDQoNCmdldFN5bWJvbHMoIk5GTFgiLCBzcmM9J3lhaG9vJykNCm5mbHg9TkZMWFsnMjAxNy0xMS8yMDE4LTExJ107bT1sZW5ndGgobmZseCRORkxYLkNsb3NlKTsNCm9oY2w8LW5mbHhbLGMoIk5GTFguT3BlbiIsIk5GTFguSGlnaCIsIk5GTFguTG93IiwiTkZMWC5DbG9zZSIpXQ0KdkNsb3NlPC12b2xhdGlsaXR5KG9oY2wsbj1tLGNhbGM9ImNsb3NlIixOPTI1MikNCnZQYXJraW5zb248LXZvbGF0aWxpdHkob2hjbCxuPW0sY2FsYz0icGFya2luc29uIiwgTj0yNTIpDQp2R0s8LXZvbGF0aWxpdHkob2hjbCxuPW0sY2FsYz0iZ2FybWFuIixOPTI1MikNCnZDbG9zZVttXTt2UGFya2luc29uW21dO3ZHS1ttXQ0KYGBgDQpUaGUgdm9sYXRpbGl0aWVzIGFib3ZlIHNob3cgdGhhdCwgdGhlIG1vcmUgd2Ugc3RhYmFsaXplIHRoaXMgc3RvY2ssIGxlc3NlciBpcyB0aGUgdm9sYXRpbGl0eS4gaWYgd2UganVzdCBjb25zaWRlciB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBwcmljZSBpdCBzaG93cyBhIHZlcnkgaGlnaCB2b2xhdGlsaXR5IGJ1dCBhcyB3ZSBhZGQgbW9yZSBmYWN0b3JzIGxpa2UgcmFuZG9tIHdhbGssIGhpZ2hzIGFuZCBsb3dzIHRvIGl0LCB0aGUgbnVtYmVyIHN0YXJ0cyB0byBkaWZmdXNlLiBUaGlzIHNheXMgdGhhdCBhbHRob3VnaCB0aGUgc3RvY2sgaXMgdm9sYXRpbGUsIHRoZSBudW1iZXJzIG9mIHZvbGF0aWxpdHkgbWF5IGJlIGEgYml0IGluZmxhdGVkLg0KDQojIyMgVGFzayAyOiBBdXRvLUNvcnJlbGF0aW9uIGFuZCBBdXRvLVJlZ3Jlc3Npb24NCg0KRm9sbG93IHRoZSBleGFtcGxlIGluIHRoZSBib29rICBgUiBFeGFtcGxlIDMuMi9wLiA3NGAgYW5kIGBSIEV4YW1wbGUgNC4xL3AuIDExNWANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQSkgQ2FsY3VsYXRlIHRoZSBBQ0YgZm9yIGEgc3RvY2sgb2YgeW91ciBjaG9pY2UuIENvbnNpZGVyIGJvdGggdGhlIGxvZyByZXR1cm4gYW5kIHNxdWFyZWQgbG9nIHJldHVybi4gSW50ZXJwcmV0IHlvdXIgcmVzdWx0cyBpbiB0ZXJtcyBvZiBwb3NzaWJsZSBleGlzdGVuY2Ugb2YgYXV0b2NvcnJlbGF0aW9uLiAgDQoNCjEsMTMsMTcsMjkgc2hvdyBzb21lIGxpbmVhciBkZXBlbmRlbmNlIG9uIHBhc3QgdmFsdWVzLg0KV2UgZG8gc2VlIHNvbWUgbGV2ZWwgb2YgYXV0b2NvcnJlbGF0aW9uDQoNCjwvc3Bhbj4NCmBgYHtyfQ0KIGdldFN5bWJvbHMoIk9SQ0wiLHNyYz0ieWFob28iKQ0KT1JDTFJEPWRhaWx5UmV0dXJuKE9SQ0wscGVyaW9kcz0iZGFpbHkiLCB0eXBlPSJsb2ciKQ0KDQpPUkNMUkQxPC0gT1JDTFJEXjINCmFjZihPUkNMUkQpDQpwYWNmKE9SQ0xSRCkNCg0KYWNmKE9SQ0xSRDEpDQpwYWNmKE9SQ0xSRDEpDQoNCiAgDQpgYGANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQikgUGxvdCB0aGUgZXhjaGFuZ2UgcmF0ZSBmb3IgVVNEIHZlcnN1cyBhbm90aGVyIGN1cnJlbmN5IG9mIHlvdXIgY2hvaWNlLiBJbnRlcnByZXQgeW91ciByZXN1bHRzIGluIHRlcm1zIG9mIGJlaGF2aW9yLg0KPC9zcGFuPg0KYGBge3J9DQpnZXRGWCgiSU5SL1VTRCIpDQogIHBsb3QoSU5SVVNEKQ0KYGBgDQpBcyB3ZSBjYW4gc2VlIHRoZSByYXRlcyBzdGFydGVkIGRlY2xpbmluZyBzaW5jZSBhdWd1c3QgYW5kIGNvbnRpbnVlZCB0byBmYWxsIHJhcGlkbHkgdXB0byBvY3RvYmVyLkluIG9jdG9iZXIgdGhlIElOUiBzYXcgaXQncyBsb3dlc3QgcG9pbnQgYW5kIHRoZW4gc3RhcnRlZCBnYWluaW5nIGdyb3VuZCBhcyBpdCB0cmllZCB0byByZWdhaW4gaXQncyBwcmV2aW91cyBwb3NpdGlvbi4gVGhlIGRlY2xpbmUgd2FzIGEgcmVzdWx0IG9mIHB1bGwgb3V0IGJ5IHRoZSBGSUlzLg0KDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMkMpIFRlc3QgZm9yIHRoZSBwb3NzaWJsZSBleGlzdGVuY2Ugb2YgYW4gdW5kZXJseWluZyBBUigxKSDigJMgTWFya292IHByb2Nlc3MgaW4geW91ciBleGNoYW5nZSByYXRlIGN1cnJlbmN5IHBhaXIuIFRvIHRoaXMgZW5kLCBwbG90IHRoZSBBQ0YgYW5kIHRoZSBwYXJ0aWFsIEFDRiAoUEFDRikuIEludGVycHJldCB5b3VyIHJlc3VsdHMuICBDbGVhcmx5IHJlZmVyIHRvIHRoZSBsYWdzLCBhbmQgdGhlaXIgaW1wYWN0cyBpbiBkZXRlcm1pbmluZyB0aGUgb3JkZXIuDQo8L3NwYW4+DQpgYGB7cn0NCiAgYWNmKElOUlVTRCkNCg0KYGBgDQpgYGB7cn0NCnBhY2YoSU5SVVNEKQ0KYGBgDQpUaGVyZSBleGlzdHMgYSBNYXJrb3YgcHJvY2VzcyBpbiB0aGUgY3VycmVuY3kgZGF0YSBhcyB0aGUgcGFzdCByYXRlIG9mIHRoZSBjdXJyZW5jeSBvbiBhbnkgZ2l2ZW4gZGF0ZSBkb2VzIG5vdCBhZmZlY3QgaXQncyBmdXR1cmUgcmF0ZSBnaXZlbiB0aGUgcHJlc2VudCByYXRlLiBUaGUgZnV0dXJlIHJhdGUgaXMgaW5kZXBlbmRlbnQgYW5kIG1vdmVzIGJhc2VkIG9uIG90aGVyIGZhY3RvcnMgdGhhbiB0aGUgcGFzdCByYXRlLiBBcyB3ZSBjYW4gc2VlIGluIHRoZSBBQ0YgYW5kIFBBQ0YgIHBsb3RzIHRoZXJlIGlzIG5vIHN1YnN0YW50aWFsIGxpbmVhciBjb3JyZWxhdGlvbi4NCg0KDQojIyMgVGFzayAzOiBHcmFuZ2VyIENhdXNhbGl0eSBUZXN0DQoNClRvIGNvbmR1Y3QgdGhpcyB0ZXN0IHRoZSBwYWNrYWdlIGBsbXRlc3RgIHdpbGwgYmUgcmVxdWlyZWQsIGFzIGFscmVhZHkgZG9uZSBpbiB0aGUgY29kZSBjaHVuayBiZWxvdy4NCg0KYGBge3J9DQojIFJlcXVpcmUgd2lsbCBsb2FkIHRoZSBwYWNrYWdlIG9ubHkgaWYgbm90IGluc3RhbGxlZCANCiMgRGVwZW5kZW5jaWVzID0gVFJVRSBtYWtlcyBzdXJlIHRoYXQgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsDQppZighcmVxdWlyZSgibG10ZXN0IixxdWlldGx5ID0gVFJVRSkpDQogIGluc3RhbGwucGFja2FnZXMoImxtdGVzdCIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikNCmxpYnJhcnkobG10ZXN0KQ0KDQoNCmBgYA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDNBKSBJbmNsdWRlIGJlbG93IHRoZSBjb2RlIGNodW5rIHRvIHNvbHZlIGZvciAzLjUuNyBSIExhYi9wLiAxMDYuICBXcml0ZSB5b3VyIGNvbmNsdXNpb25zLg0KPC9zcGFuPg0KDQpgYGB7cn0NCiMgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0YSB1c2VkIGluIHRlc3RpbmcgZm9yIGNhdXNhbGl0eSBjYW4gYmUgb2J0YWluZWQgYnkgdHlwaW5nIHRoZSBuYW1lIG9mIHRoZSBkYXRhIHNldCBgQ2hpY2tFZ2dgIGluIHRoZSBSIEhlbHAgbWVudS4NCg0KZ3JhbmdlcnRlc3QoY2hpY2tlbiB+IGVnZywgb3JkZXIgPSAzLCBkYXRhID0gQ2hpY2tFZ2cpDQpncmFuZ2VydGVzdChlZ2cgfiBjaGlja2VuLCBvcmRlciA9IDMsIGRhdGEgPSBDaGlja0VnZykNCg0KDQpgYGANCkluIHRoZSBmaXJzdCBjYXNlIG9mIGNoaWNrZW4gY2F1c2luZyBlZ2csIHRoZSBwLXZhbHVlIGlzIDAuMDAyOTY2IHdoaWNoIGlzIGxlc3MgdGhhbiB0aGUgY3JpdGljYWwgdmFsdWUsIHNvIHdlIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGFuZCBzYXkgdGhhdCBjaGlja2VuIGRvZXMgZGVwZW5kIG9uIGVnZ3MgYW5kIGNoaWNrZW4uDQoNCkluIHRoZSBzZWNvbmQgY2FzZSBvZiBlZ2dzIGNhdXNpbmcgY2hpY2tlbiwgdGhlIHAtdmFsdWUgaXMgMC42MjM4IHdoaWNoIGlzIGFib3ZlIHRoZSBjcml0aWNhbCB2YWx1ZSwgc28gd2UgY2Fubm90IHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgZWdncyBtYXkgbm90IGRlcGVuZCBvbiBjaGlja2VuLg0KDQoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAzQikgQnJpZWZseSBkZXNjcmliZSB0aGUgZGF0YSBpbiB0ZXJtcyBvZiB0aW1lIHJhbmdlIGFuZCB2YXJpYWJsZXMuIFNpbWlsYXIgdG8gdGhlIGxpbmVhciBhdXRvZWdyZXNzaXZlIG1vZGVsIGRlc2NyaWJlZCBpbiBjbGFzcywgd3JpdGUgdGhlIG1hdGhlbWF0aWNhbCByZWdyZXNzaW9uIG1vZGVsIHNvbHZlZCBpbiBlYWNoIEdyYW5nZXIgdGVzdCwgaW5jbHVkaW5nIHRoZSBwcm9wZXIgb3JkZXIuIFVzZSBuYW1pbmcgY29udmVudGlvbnMsIGFuZCBub3RhdGlvbnMgbW9yZSByZWZsZWN0aXZlIG9mIHRoZSBkYXRhIHNldCBjb25zaWRlcmVkIGZvciAgYENoaWNrRWdnYC4NCjwvc3Bhbj4NCg0KDQojIyMgVGFzayA0OiBNYXRoZW1hdGljYWwgUHJvb2YNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyA0QSkgUHJvdmUgdGhlIHR3byByZXN1bHRzIGluIEVxICgyLjMyKS9wLiA1My4gIE5vIFItY29kaW5nIGlzIG5lZWRlZCBoZXJlLiAgQ2xlYXJseSBzaG93IHlvdXIgc3RlcHMuIEhpbnQ6IFVzZSB0aGUgZGVmaW5pdGlvbiBvZiAkRShYXm4pJCBmb3IgWC1sb2cgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuICAgT2JzZXJ2ZSBhbHNvIHRoYXQgJFZhcihYKSA9IEUoWF4yKS1FXjIoWCkkIGZvciBhbnkgcmFuZG9tIHZhcmlhYmxlIFguDQo8L3NwYW4+DQoNCg0KDQoNCmBgYA0KDQoNCipbaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1IF0oaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1KQ0K