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.

# Once you have obtained the adjusted daily log returns for your stocks, omitting the time index, you will need to combine them to create a matrix. Below is an example.  For more details see the Help command in R on cbind, cov, and cor.
# M <- cbind(A,B,C) # create a matrix where each column is an array/vector of numerical values 
# cov(M) # compute the covariance matrix
# cor(M, method="pearson") # compute the correlation matrix based on the Pearson method
require(quantmod)
symbols=c('ILMN','CGIX','NVTA','CELG')
getSymbols(symbols, src="yahoo", from="2016-01-01", to="2018-12-04")
[1] "ILMN" "CGIX" "NVTA" "CELG"
ILMNad = ILMN$ILMN.Adjusted 
CGIXad = CGIX$CGIX.Adjusted
NVTAad = NVTA$NVTA.adjusted
CELGad = CELG$CELG.Adjusted
ilmnRD = periodReturn(ILMN, period = "daily", type = "log")
cgixRD = periodReturn(CGIX, period = "daily", type = "log")
nvtaRD = periodReturn(NVTA, period = "daily", type = "log")
celgRD = periodReturn(CELG, period = "daily", type = "log")
require(graphics)
ilmnR = as.numeric(ilmnRD)
cgixR = as.numeric(cgixRD)
nvtaR = as.numeric(nvtaRD)
celgR = as.numeric(celgRD)
M <- cbind(ilmnR, cgixR, nvtaR, celgR)
cov(M)
             ilmnR        cgixR        nvtaR        celgR
ilmnR 0.0006426052 0.0001424649 0.0002758442 0.0001640151
cgixR 0.0001424649 0.0028512927 0.0001996236 0.0001715704
nvtaR 0.0002758442 0.0001996236 0.0016049141 0.0001625055
celgR 0.0001640151 0.0001715704 0.0001625055 0.0003610570
cor(M, method = "pearson")
          ilmnR      cgixR      nvtaR     celgR
ilmnR 1.0000000 0.10524823 0.27162256 0.3405053
cgixR 0.1052482 1.00000000 0.09331793 0.1690961
nvtaR 0.2716226 0.09331793 1.00000000 0.2134786
celgR 0.3405053 0.16909609 0.21347860 1.0000000

The Covariance of of all these stocks have a positive covariance, probably because all of these stocks are genetic development companies and follow similar trends.

The Correlation of of these stocks are also all positive for the same reason above.

##### 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.

# For this task make sure you understand well what the variables n,m represent in the book's referenced example.
require(quantmod)
getSymbols("KHC", src="yahoo", subset= "2016:2017")
[1] "KHC"
khc = KHC["2016-01/2017-01"]; m=length(khc$KHC.Close);
ohlc <-khc[,c("KHC.Open","KHC.High","KHC.Low","KHC.Close")]
vClose <- volatility(ohlc, n= m,calc="close",N=272)
vParkinson <- volatility(ohlc, n= m,calc="parkinson",N=272)
vGK <- volatility(ohlc, n= m,calc="garman",N=272)
vClose[m]; vParkinson[m]; vGK[m];
                [,1]
2017-01-31 0.2067402
                [,1]
2017-01-31 0.1808091
                [,1]
2017-01-31 0.1824004

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.

The only point at which Illumina could have significant autocorrelation is about at the 10 lag point.

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

require(quantmod)
symbols=c("USD", "JPY")
getSymbols(symbols, src="oanda")
incorrectly specified currency pair USDincorrectly specified currency pair JPY
[1] "USD" "JPY"
getFX("JPY/USD")
[1] "JPYUSD"
plot(JPYUSD)

The JPY/USD exchange rate declined significantly over time, meaning that the yen has become stronger, relative to the dollar, over time.

##### 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.

require(quantmod)
symbols=c("USD", "JPY")
getSymbols(symbols, src="oanda")
incorrectly specified currency pair USDincorrectly specified currency pair JPY
[1] "USD" "JPY"
getFX("JPY/USD")
[1] "JPYUSD"
acf(JPYUSD)

pacf(JPYUSD)

Task 3: Granger Causality Test

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

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

##### 3A) Include below the code chunk to solve for 3.5.7 R Lab/p. 106. Write your conclusions. A curious application of Granger causality is the by now classic experiment of Thruman and Fisher (1988) to assess which came first, if the chicken or the egg. The necessary data is in the package lmtest, and it is the data set ChickEgg that contains the yearly production of chicken and eggs in the US from 1930 to 1983. To assess if chicken causes egg, execute grangertest(egg chicken, order=3, data=ChickEgg). Do also the test for egg causing chicken, and write your conclusions.

# More information about the data used in testing for causality can be obtained by typing the name of the data set `ChickEgg` in the R Help menu.
require(lmtest)
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
require(lmtest)
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

The P-Value for Chicken causes egg = 0.6238, which is > 0.05. This means we fail to reject the null hypothesis and we cannot say that chicken causes egg.

The P-value for egg causes Chicken = 0.002966, which is < 0.05. This means we rejct the null hypothesis and we can say that the egg causes 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.

!(imgs/IMG_1864.jpg)
Error: object 'imgs' not found

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

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

plot(cars)

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDAzIgphdXRob3I6ICJHcmFjZSBPbnVmZXIiCmRhdGU6ICJEZWNlbWJlciA1dGgsIDIwMTgiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApzdWJ0aXRsZTogVmFyaWFuY2UsIENvdmFyaWFuY2UsIENvcnJlbGF0aW9uICYgQ2F1c2FsaXR5IChmaW5jNjIxLWxhYjAzKQotLS0KCiMjIyBBYm91dAoKSW4gdGhpcyB3b3Jrc2hlZXQgd2UgbG9vayBhdCBkaWZmZXJlbnQgdmFyaWFuY2UsIGNvdmFyaWFuY2UsIHZvbGF0aWxpdHksIGFuZCBjYXVzYWxpdHkgY2FsY3VsYXRpb25zLiBXZSBmaW5pc2ggd2l0aCBhIHNob3J0IG1hdGVtYXRpY2FsIHByb29mIChubyBSIHJlcXVpcmVkKS4gIAoKIyMjIFNldHVwCgpSZW1lbWJlciB0byBhbHdheXMgc2V0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uLiBHbyB0byAnU2Vzc2lvbicsIHNjcm9sbCBkb3duIHRvICdTZXQgV29ya2luZyBEaXJlY3RvcnknLCBhbmQgY2xpY2sgJ1RvIFNvdXJjZSBGaWxlIExvY2F0aW9uJy4gUmVhZCBjYXJlZnVsbHkgdGhlIGJlbG93IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBjb21wbGV0ZSB0aGUgdGFza3MgYW5kIGFuc3dlciBhbnkgcXVlc3Rpb25zLiAgU3VibWl0IHlvdXIgd29yayB0byBSUHVicyBhcyBkZXRhaWxlZCBpbiBwcmV2aW91cyBub3Rlcy4gCgojIyMgTm90ZQoKRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAoY29sb3IgdmlzaWJsZSBvbmx5IGluIHByZXZpZXcgbW9kZSkgYW5kIG51bWJlcmVkIGFjY29yZGluZyB0byB0aGVpciBwYXJ0aWN1bGFyIHBsYWNlbWVudCBpbiB0aGUgdGFzayBzZWN0aW9uLiAgVHlwZSB5b3VyIGFuc3dlcnMgb3V0c2lkZSB0aGUgcmVkIGNvbG9yIHRhZ3MhCgpRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLiBFeGVjdXRlIHNlcXVlbnRpYWxseSBhbGwgY29kZSBjaHVua3MsIHByZXZpZXcsIHB1Ymxpc2gsIGFuZCBzdWJtaXQgbGluayBvbiBTYWthaSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUgdG8gYWRkIGNvbW1lbnRzIHRvIHlvdXIgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4gVXNlIG93biBsYW5ndWFnZSEKCioqQW55IHNpZ24gb2YgcGxhZ2lhcmlzbSwgd2lsbCByZXN1bHQgaW4gZGlzc21pc3NhbCBvZiB3b3JrISoqCgotLS0tLS0tLS0tLS0tLQoKIyMjIFRhc2sgMTogVmFyaWFuY2UsIENvdmFyaWFuY2UsIGFuZCBWb2xhdGlsaXR5CgpUaGlzIHRhc2sgZm9sbG93cyB0aGUgdHdvIGV4YW1wbGVzIGluIHRoZSBib29rIGBSIEV4YW1wbGUgMi41L3AuIDU4YCBhbmQgYFIgRXhhbXBsZSAyLjYvcC4gNjZgIAoKYGBge3J9CiMgUmVxdWlyZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2Ugb25seSBpZiBub3QgaW5zdGFsbGVkIAojIERlcGVuZGVuY2llcyA9IFRSVUUgbWFrZXMgc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbAppZighcmVxdWlyZSgicXVhbnRtb2QiLHF1aWV0bHkgPSBUUlVFKSkKICBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikKYGBgCgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFBKSBDYWxjdWxhdGUgdGhlIGNvcnJlbGF0aW9uIGFuZCBjb3ZhcmlhbmNlIG1hdHJpeCBvZiB0aGUgYWRqdXN0ZWQgZGFpbHkgbG9nIHJldHVybnMgZm9yIGZvdXIgZGlmZmVyZW50IHN0b2NrcyBvZiB5b3VyIGNob2ljZS4gRXhwbGFpbiB5b3VyIG9ic2VydmF0aW9ucyBpbiB0ZXJtcyBvZiBwb3RlbnRpYWwgcmVsYXRpb25zaGlwcy4KPC9zcGFuPgoKYGBge3J9CiMgT25jZSB5b3UgaGF2ZSBvYnRhaW5lZCB0aGUgYWRqdXN0ZWQgZGFpbHkgbG9nIHJldHVybnMgZm9yIHlvdXIgc3RvY2tzLCBvbWl0dGluZyB0aGUgdGltZSBpbmRleCwgeW91IHdpbGwgbmVlZCB0byBjb21iaW5lIHRoZW0gdG8gY3JlYXRlIGEgbWF0cml4LiBCZWxvdyBpcyBhbiBleGFtcGxlLiAgRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIEhlbHAgY29tbWFuZCBpbiBSIG9uIGNiaW5kLCBjb3YsIGFuZCBjb3IuCiMgTSA8LSBjYmluZChBLEIsQykgIyBjcmVhdGUgYSBtYXRyaXggd2hlcmUgZWFjaCBjb2x1bW4gaXMgYW4gYXJyYXkvdmVjdG9yIG9mIG51bWVyaWNhbCB2YWx1ZXMgCiMgY292KE0pICMgY29tcHV0ZSB0aGUgY292YXJpYW5jZSBtYXRyaXgKIyBjb3IoTSwgbWV0aG9kPSJwZWFyc29uIikgIyBjb21wdXRlIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXggYmFzZWQgb24gdGhlIFBlYXJzb24gbWV0aG9kCmBgYAoKYGBge3J9CnJlcXVpcmUocXVhbnRtb2QpCnN5bWJvbHM9YygnSUxNTicsJ0NHSVgnLCdOVlRBJywnQ0VMRycpCmdldFN5bWJvbHMoc3ltYm9scywgc3JjPSJ5YWhvbyIsIGZyb209IjIwMTYtMDEtMDEiLCB0bz0iMjAxOC0xMi0wNCIpCgpJTE1OYWQgPSBJTE1OJElMTU4uQWRqdXN0ZWQgCkNHSVhhZCA9IENHSVgkQ0dJWC5BZGp1c3RlZApOVlRBYWQgPSBOVlRBJE5WVEEuYWRqdXN0ZWQKQ0VMR2FkID0gQ0VMRyRDRUxHLkFkanVzdGVkCgppbG1uUkQgPSBwZXJpb2RSZXR1cm4oSUxNTiwgcGVyaW9kID0gImRhaWx5IiwgdHlwZSA9ICJsb2ciKQpjZ2l4UkQgPSBwZXJpb2RSZXR1cm4oQ0dJWCwgcGVyaW9kID0gImRhaWx5IiwgdHlwZSA9ICJsb2ciKQpudnRhUkQgPSBwZXJpb2RSZXR1cm4oTlZUQSwgcGVyaW9kID0gImRhaWx5IiwgdHlwZSA9ICJsb2ciKQpjZWxnUkQgPSBwZXJpb2RSZXR1cm4oQ0VMRywgcGVyaW9kID0gImRhaWx5IiwgdHlwZSA9ICJsb2ciKQoKcmVxdWlyZShncmFwaGljcykKaWxtblIgPSBhcy5udW1lcmljKGlsbW5SRCkKY2dpeFIgPSBhcy5udW1lcmljKGNnaXhSRCkKbnZ0YVIgPSBhcy5udW1lcmljKG52dGFSRCkKY2VsZ1IgPSBhcy5udW1lcmljKGNlbGdSRCkKCk0gPC0gY2JpbmQoaWxtblIsIGNnaXhSLCBudnRhUiwgY2VsZ1IpCgpjb3YoTSkKCmNvcihNLCBtZXRob2QgPSAicGVhcnNvbiIpCgpgYGAKVGhlIENvdmFyaWFuY2Ugb2Ygb2YgYWxsIHRoZXNlIHN0b2NrcyBoYXZlIGEgcG9zaXRpdmUgY292YXJpYW5jZSwgcHJvYmFibHkgYmVjYXVzZSBhbGwgb2YgdGhlc2Ugc3RvY2tzIGFyZSBnZW5ldGljIGRldmVsb3BtZW50IGNvbXBhbmllcyBhbmQgZm9sbG93IHNpbWlsYXIgdHJlbmRzLiAKClRoZSBDb3JyZWxhdGlvbiBvZiBvZiB0aGVzZSBzdG9ja3MgYXJlIGFsc28gYWxsIHBvc2l0aXZlIGZvciB0aGUgc2FtZSByZWFzb24gYWJvdmUuICAKCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUIpIENhbGN1bGF0ZSB0aGUgdGhyZWUgdHlwZXMgb2Ygdm9sYXRpbGl0eSBmb3IgYSBwYXJ0aWN1bGFyIHN0b2NrIG9mIHlvdXIgY2hvaWNlLiBDb25zaWRlciBhIHRpbWUgd2luZG93IGV4dGVuZGluZyBvbmUgeWVhciBiYWNrIGZyb20gbW9zdCByZWNlbnQgb2J0YWluYWJsZSBjbG9zaW5nIGRheSBwcmljZS4gT3JkZXIgdGhlIHRocmVlIGVzdGltYXRlcyBmcm9tIGxvdyB0byBoaWdoIHZvbGF0aWxpdHkgYW5kIGV4cGxhaW4gaG93IHRoZSBvcmRlcmluZyBtYWtlcyBzZW5zZS4KPC9zcGFuPgoKYGBge3J9CiMgRm9yIHRoaXMgdGFzayBtYWtlIHN1cmUgeW91IHVuZGVyc3RhbmQgd2VsbCB3aGF0IHRoZSB2YXJpYWJsZXMgbixtIHJlcHJlc2VudCBpbiB0aGUgYm9vaydzIHJlZmVyZW5jZWQgZXhhbXBsZS4KYGBgCgpgYGB7cn0KcmVxdWlyZShxdWFudG1vZCkKZ2V0U3ltYm9scygiS0hDIiwgc3JjPSJ5YWhvbyIsIHN1YnNldD0gIjIwMTY6MjAxNyIpCgpraGMgPSBLSENbIjIwMTYtMDEvMjAxNy0wMSJdOyBtPWxlbmd0aChraGMkS0hDLkNsb3NlKTsKCm9obGMgPC1raGNbLGMoIktIQy5PcGVuIiwiS0hDLkhpZ2giLCJLSEMuTG93IiwiS0hDLkNsb3NlIildCgp2Q2xvc2UgPC0gdm9sYXRpbGl0eShvaGxjLCBuPSBtLGNhbGM9ImNsb3NlIixOPTI3MikKCnZQYXJraW5zb24gPC0gdm9sYXRpbGl0eShvaGxjLCBuPSBtLGNhbGM9InBhcmtpbnNvbiIsTj0yNzIpCgp2R0sgPC0gdm9sYXRpbGl0eShvaGxjLCBuPSBtLGNhbGM9Imdhcm1hbiIsTj0yNzIpCgp2Q2xvc2VbbV07IHZQYXJraW5zb25bbV07IHZHS1ttXTsKYGBgCgoKCiMjIyBUYXNrIDI6IEF1dG8tQ29ycmVsYXRpb24gYW5kIEF1dG8tUmVncmVzc2lvbgoKRm9sbG93IHRoZSBleGFtcGxlIGluIHRoZSBib29rICBgUiBFeGFtcGxlIDMuMi9wLiA3NGAgYW5kIGBSIEV4YW1wbGUgNC4xL3AuIDExNWAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQSkgQ2FsY3VsYXRlIHRoZSBBQ0YgZm9yIGEgc3RvY2sgb2YgeW91ciBjaG9pY2UuIENvbnNpZGVyIGJvdGggdGhlIGxvZyByZXR1cm4gYW5kIHNxdWFyZWQgbG9nIHJldHVybi4gSW50ZXJwcmV0IHlvdXIgcmVzdWx0cyBpbiB0ZXJtcyBvZiBwb3NzaWJsZSBleGlzdGVuY2Ugb2YgYXV0b2NvcnJlbGF0aW9uLgo8L3NwYW4+CgpgYGB7cn0KcmVxdWlyZShxdWFudG1vZCkKc3ltYm9scz1jKCdJTE1OJywnQ0dJWCcsJ05WVEEnLCdDRUxHJykKZ2V0U3ltYm9scyhzeW1ib2xzLCBzcmM9InlhaG9vIiwgZnJvbT0iMjAxNi0wMS0wMSIsIHRvPSIyMDE4LTEyLTA0IikKCmlsbW5SRCA9IHBlcmlvZFJldHVybihJTE1OLCBwZXJpb2QgPSAiZGFpbHkiLCB0eXBlID0gImxvZyIpCgpyZXF1aXJlKGdyYXBoaWNzKQppbG1uUiA9IGFzLm51bWVyaWMoaWxtblJEKQoKYWNmKG5hLm9taXQoaWxtblIpLG1haW49ImFjZiBvZiBJTE1OIix5bGltPWMoLTAuMiwwLjIpKQpgYGAKVGhlIG9ubHkgcG9pbnQgYXQgd2hpY2ggSWxsdW1pbmEgY291bGQgaGF2ZSBzaWduaWZpY2FudCBhdXRvY29ycmVsYXRpb24gaXMgYWJvdXQgYXQgdGhlIDEwIGxhZyBwb2ludC4gIAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJCKSBQbG90IHRoZSBleGNoYW5nZSByYXRlIGZvciBVU0QgdmVyc3VzIGFub3RoZXIgY3VycmVuY3kgb2YgeW91ciBjaG9pY2UuIEludGVycHJldCB5b3VyIHJlc3VsdHMgaW4gdGVybXMgb2YgYmVoYXZpb3IuCjwvc3Bhbj4KCmBgYHtyfQpyZXF1aXJlKHF1YW50bW9kKQoKc3ltYm9scz1jKCJVU0QiLCAiSlBZIikKZ2V0U3ltYm9scyhzeW1ib2xzLCBzcmM9Im9hbmRhIikKCmdldEZYKCJKUFkvVVNEIikKcGxvdChKUFlVU0QpCmBgYApUaGUgSlBZL1VTRCBleGNoYW5nZSByYXRlIGRlY2xpbmVkIHNpZ25pZmljYW50bHkgb3ZlciB0aW1lLCBtZWFuaW5nIHRoYXQgdGhlIHllbiBoYXMgYmVjb21lIHN0cm9uZ2VyLCByZWxhdGl2ZSB0byB0aGUgZG9sbGFyLCBvdmVyIHRpbWUuIAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJDKSBUZXN0IGZvciB0aGUgcG9zc2libGUgZXhpc3RlbmNlIG9mIGFuIHVuZGVybHlpbmcgQVIoMSkg4oCTIE1hcmtvdiBwcm9jZXNzIGluIHlvdXIgZXhjaGFuZ2UgcmF0ZSBjdXJyZW5jeSBwYWlyLiBUbyB0aGlzIGVuZCwgcGxvdCB0aGUgQUNGIGFuZCB0aGUgcGFydGlhbCBBQ0YgKFBBQ0YpLiBJbnRlcnByZXQgeW91ciByZXN1bHRzLiAgQ2xlYXJseSByZWZlciB0byB0aGUgbGFncywgYW5kIHRoZWlyIGltcGFjdHMgaW4gZGV0ZXJtaW5pbmcgdGhlIG9yZGVyLgo8L3NwYW4+CgpgYGB7cn0KcmVxdWlyZShxdWFudG1vZCkKCnN5bWJvbHM9YygiVVNEIiwgIkpQWSIpCmdldFN5bWJvbHMoc3ltYm9scywgc3JjPSJvYW5kYSIpCgpnZXRGWCgiSlBZL1VTRCIpCmFjZihKUFlVU0QpCnBhY2YoSlBZVVNEKQpgYGAKCgoKIyMjIFRhc2sgMzogR3JhbmdlciBDYXVzYWxpdHkgVGVzdAoKVG8gY29uZHVjdCB0aGlzIHRlc3QgdGhlIHBhY2thZ2UgYGxtdGVzdGAgd2lsbCBiZSByZXF1aXJlZCwgYXMgYWxyZWFkeSBkb25lIGluIHRoZSBjb2RlIGNodW5rIGJlbG93LgoKYGBge3J9CiMgUmVxdWlyZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2Ugb25seSBpZiBub3QgaW5zdGFsbGVkIAojIERlcGVuZGVuY2llcyA9IFRSVUUgbWFrZXMgc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbAppZighcmVxdWlyZSgibG10ZXN0IixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygibG10ZXN0IixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQpgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAzQSkgSW5jbHVkZSBiZWxvdyB0aGUgY29kZSBjaHVuayB0byBzb2x2ZSBmb3IgMy41LjcgUiBMYWIvcC4gMTA2LiAgV3JpdGUgeW91ciBjb25jbHVzaW9ucy4KPC9zcGFuPgpBIGN1cmlvdXMgYXBwbGljYXRpb24gb2YgR3JhbmdlciBjYXVzYWxpdHkgaXMgdGhlIGJ5IG5vdyBjbGFzc2ljIGV4cGVyaW1lbnQgb2YgVGhydW1hbiBhbmQgRmlzaGVyICgxOTg4KSB0byBhc3Nlc3Mgd2hpY2ggY2FtZSBmaXJzdCwgaWYgdGhlIGNoaWNrZW4gb3IgdGhlIGVnZy4gVGhlIG5lY2Vzc2FyeSBkYXRhIGlzIGluIHRoZSBwYWNrYWdlIGxtdGVzdCwgYW5kIGl0IGlzIHRoZSBkYXRhIHNldCBDaGlja0VnZyB0aGF0IGNvbnRhaW5zIHRoZSB5ZWFybHkgcHJvZHVjdGlvbiBvZiBjaGlja2VuIGFuZCBlZ2dzIGluIHRoZSBVUyBmcm9tIDE5MzAgdG8gMTk4My4gVG8gYXNzZXNzIGlmIGNoaWNrZW4gY2F1c2VzIGVnZywgZXhlY3V0ZSBncmFuZ2VydGVzdChlZ2cgY2hpY2tlbiwgb3JkZXI9MywgZGF0YT1DaGlja0VnZykuIERvIGFsc28gdGhlIHRlc3QgZm9yIGVnZyBjYXVzaW5nIGNoaWNrZW4sIGFuZCB3cml0ZSB5b3VyIGNvbmNsdXNpb25zLgpgYGB7cn0KIyBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhIHVzZWQgaW4gdGVzdGluZyBmb3IgY2F1c2FsaXR5IGNhbiBiZSBvYnRhaW5lZCBieSB0eXBpbmcgdGhlIG5hbWUgb2YgdGhlIGRhdGEgc2V0IGBDaGlja0VnZ2AgaW4gdGhlIFIgSGVscCBtZW51LgpgYGAKCgpgYGB7cn0KcmVxdWlyZShsbXRlc3QpCiNjaGljayBjYXVzZXMgZWdnPwpncmFuZ2VydGVzdChlZ2cgfiBjaGlja2VuLCBvcmRlcj0zLCBkYXRhPUNoaWNrRWdnKQpgYGAKCmBgYHtyfQpyZXF1aXJlKGxtdGVzdCkKI2VnZyBjYXVzZXMgY2hpY2tlbj8KZ3JhbmdlcnRlc3QoY2hpY2tlbiB+IGVnZywgb3JkZXI9MywgZGF0YT1DaGlja0VnZykKYGBgClRoZSBQLVZhbHVlIGZvciBDaGlja2VuIGNhdXNlcyBlZ2cgPSAwLjYyMzgsIHdoaWNoIGlzID4gMC4wNS4KVGhpcyBtZWFucyB3ZSBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGFuZCB3ZSBjYW5ub3Qgc2F5IHRoYXQgY2hpY2tlbiBjYXVzZXMgZWdnLgoKVGhlIFAtdmFsdWUgZm9yIGVnZyBjYXVzZXMgQ2hpY2tlbiA9IDAuMDAyOTY2LCB3aGljaCBpcyA8IDAuMDUuClRoaXMgbWVhbnMgd2UgcmVqY3QgdGhlIG51bGwgaHlwb3RoZXNpcyBhbmQgd2UgY2FuIHNheSB0aGF0IHRoZSBlZ2cgY2F1c2VzIGNoaWNrZW4uCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgM0IpIEJyaWVmbHkgZGVzY3JpYmUgdGhlIGRhdGEgaW4gdGVybXMgb2YgdGltZSByYW5nZSBhbmQgdmFyaWFibGVzLiBTaW1pbGFyIHRvIHRoZSBsaW5lYXIgYXV0b2VncmVzc2l2ZSBtb2RlbCBkZXNjcmliZWQgaW4gY2xhc3MsIHdyaXRlIHRoZSBtYXRoZW1hdGljYWwgcmVncmVzc2lvbiBtb2RlbCBzb2x2ZWQgaW4gZWFjaCBHcmFuZ2VyIHRlc3QsIGluY2x1ZGluZyB0aGUgcHJvcGVyIG9yZGVyLiBVc2UgbmFtaW5nIGNvbnZlbnRpb25zLCBhbmQgbm90YXRpb25zIG1vcmUgcmVmbGVjdGl2ZSBvZiB0aGUgZGF0YSBzZXQgY29uc2lkZXJlZCBmb3IgIGBDaGlja0VnZ2AuCjwvc3Bhbj4KYGBge3J9CiEoaW1ncy9JTUdfMTg2NC5qcGcpCmBgYAoKCiMjIyBUYXNrIDQ6IE1hdGhlbWF0aWNhbCBQcm9vZgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDRBKSBQcm92ZSB0aGUgdHdvIHJlc3VsdHMgaW4gRXEgKDIuMzIpL3AuIDUzLiAgTm8gUi1jb2RpbmcgaXMgbmVlZGVkIGhlcmUuICBDbGVhcmx5IHNob3cgeW91ciBzdGVwcy4gSGludDogVXNlIHRoZSBkZWZpbml0aW9uIG9mICRFKFhebikkIGZvciBYLWxvZyBub3JtYWxseSBkaXN0cmlidXRlZC4gICBPYnNlcnZlIGFsc28gdGhhdCAkVmFyKFgpID0gRShYXjIpLUVeMihYKSQgZm9yIGFueSByYW5kb20gdmFyaWFibGUgWC4KPC9zcGFuPgoKCgoKCipbaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1IF0oaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1KQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0KcGxvdChjYXJzKQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgo=