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.

symbols = c('NKE','ADDYY','SKX', 'UAA')
getSymbols(symbols,src="yahoo") 
[1] "NKE"   "ADDYY" "SKX"   "UAA"  
NikeLog = periodReturn(NKE, period = "daily", type = "log")
AdidasLog = periodReturn(ADDYY, period = "daily", type = "log")
SkechersLog = periodReturn(SKX, period = "daily", type = "log")
UALog = periodReturn(UAA, period = "daily", type = "log")
M <- cbind(NikeLog,AdidasLog,SkechersLog,UALog)
colnames(M) <- c("NKE","ADDYY","SKX","UAA")
cov(M)
               NKE        ADDYY          SKX          UAA
NKE   0.0003049668 0.0001540662 0.0002209870 0.0002739733
ADDYY 0.0001540662 0.0004488069 0.0001768652 0.0001954422
SKX   0.0002209870 0.0001768652 0.0010815882 0.0003759568
UAA   0.0002739733 0.0001954422 0.0003759568 0.0009590296
cor(M, method="pearson")
            NKE     ADDYY       SKX       UAA
NKE   1.0000000 0.4164390 0.3847774 0.5066008
ADDYY 0.4164390 1.0000000 0.2538527 0.2979014
SKX   0.3847774 0.2538527 1.0000000 0.3691398
UAA   0.5066008 0.2979014 0.3691398 1.0000000

There are positive covariances between the daily log returns for all four stocks, Nike, Adidas, Skechers, and Under Armour. They all show weak to moderate positive correlation with each other. These are all competitors in the athletic wear market that have been successful recently, so I wouldn’t expect any single company to have a large effect on another.

# 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

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

library(quantmod)
nke = NKE['2017-11/2018-11']; m = length(nke$NKE.Close);
ohlc <-nke[,c("NKE.Open","NKE.High","NKE.Low","NKE.Close")]
vGK <- volatility(ohlc, n = m, calc="garman",N=252)
vClose <- volatility(ohlc, n = m, calc="close",N = 252)
vParkinson <- volatility(ohlc, n = m, calc="parkinson", N = 252)
vGK[m];vParkinson[m];vClose[m]
                [,1]
2018-11-30 0.1959917
                [,1]
2018-11-30 0.1992922
                [,1]
2018-11-30 0.2526894

The Garman-Klass estimator has the lowest volatility, as it uses the most data, and will be less susceptible to jumps in value because it will be able to capture incremental changes. The next is the Parkinson estimator, which uses the difference between the high and low prices of the day. The most volatile is the Close-to-Close estimator.

# For this task make sure you understand well what the variables n,m represent in the book's referenced example.

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.

acf(na.omit(NikeLog),main="acf of NKE",ylim=c(-0.2,0.2))

There does not appear to be any meaningful autocorrelations in the log returns for Nike. Lag 10 is slightly above the limit, but not at a value that is statistically significant.

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

getFX("JPY/USD") #download JPY/USD rates from oanda.com
[1] "JPYUSD"
plot(JPYUSD)

Within this relatively small scale, there is a lot of volatility in the relation between the Japanese Yen and the US Dollar. Instead of a linear increase or decrease, it exhibits spiky behavior.

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

getFX("JPY/USD") #download JPY/USD rates from oanda.com
[1] "JPYUSD"
acf(JPYUSD)

pacf(JPYUSD)

The lags of the ACF plot decay exponentially so it appears that there is an underlying AR(1) Markov process.

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.

library(lmtest)
#chickens cause eggs
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
#eggs cause chickens
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
ChickEgg
Time Series:
Start = 1930 
End = 1983 
Frequency = 1 
     chicken  egg
1930  468491 3581
1931  449743 3532
1932  436815 3327
1933  444523 3255
1934  433937 3156
1935  389958 3081
1936  403446 3166
1937  423921 3443
1938  389624 3424
1939  418591 3561
1940  438288 3640
1941  422841 3840
1942  476935 4456
1943  542047 5000
1944  582197 5366
1945  516497 5154
1946  523227 5130
1947  467217 5077
1948  499644 5032
1949  430876 5148
1950  456549 5404
1951  430988 5322
1952  426555 5323
1953  398156 5307
1954  396776 5402
1955  390708 5407
1956  383690 5500
1957  391363 5442
1958  374281 5442
1959  387002 5542
1960  369484 5339
1961  366082 5358
1962  377392 5403
1963  375575 5345
1964  382262 5435
1965  394118 5474
1966  393019 5540
1967  428746 5836
1968  425158 5777
1969  422096 5629
1970  433280 5704
1971  421763 5806
1972  404191 5742
1973  408769 5502
1974  394101 5461
1975  379754 5382
1976  378361 5377
1977  386518 5408
1978  396933 5608
1979  400585 5777
1980  392110 5825
1981  384838 5625
1982  378609 5800
1983  364584 5656

The results show no significance for chickens causing eggs, but there is a .001 significance level for eggs causing chicken so it would appear that it is proven true.

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

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

From 1930 to 1983, the data shows the number of commercial chickens on December 1 and the annual egg production in millions.

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

LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDAzIgphdXRob3I6ICJEZWlvbiBGb3N0ZXIiCmRhdGU6ICIxMi81LzIwMTgiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApzdWJ0aXRsZTogVmFyaWFuY2UsIENvdmFyaWFuY2UsIENvcnJlbGF0aW9uICYgQ2F1c2FsaXR5IChmaW5jNjIxLWxhYjAzKQotLS0KCiMjIyBBYm91dAoKSW4gdGhpcyB3b3Jrc2hlZXQgd2UgbG9vayBhdCBkaWZmZXJlbnQgdmFyaWFuY2UsIGNvdmFyaWFuY2UsIHZvbGF0aWxpdHksIGFuZCBjYXVzYWxpdHkgY2FsY3VsYXRpb25zLiBXZSBmaW5pc2ggd2l0aCBhIHNob3J0IG1hdGVtYXRpY2FsIHByb29mIChubyBSIHJlcXVpcmVkKS4gIAoKIyMjIFNldHVwCgpSZW1lbWJlciB0byBhbHdheXMgc2V0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uLiBHbyB0byAnU2Vzc2lvbicsIHNjcm9sbCBkb3duIHRvICdTZXQgV29ya2luZyBEaXJlY3RvcnknLCBhbmQgY2xpY2sgJ1RvIFNvdXJjZSBGaWxlIExvY2F0aW9uJy4gUmVhZCBjYXJlZnVsbHkgdGhlIGJlbG93IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBjb21wbGV0ZSB0aGUgdGFza3MgYW5kIGFuc3dlciBhbnkgcXVlc3Rpb25zLiAgU3VibWl0IHlvdXIgd29yayB0byBSUHVicyBhcyBkZXRhaWxlZCBpbiBwcmV2aW91cyBub3Rlcy4gCgojIyMgTm90ZQoKRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAoY29sb3IgdmlzaWJsZSBvbmx5IGluIHByZXZpZXcgbW9kZSkgYW5kIG51bWJlcmVkIGFjY29yZGluZyB0byB0aGVpciBwYXJ0aWN1bGFyIHBsYWNlbWVudCBpbiB0aGUgdGFzayBzZWN0aW9uLiAgVHlwZSB5b3VyIGFuc3dlcnMgb3V0c2lkZSB0aGUgcmVkIGNvbG9yIHRhZ3MhCgpRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLiBFeGVjdXRlIHNlcXVlbnRpYWxseSBhbGwgY29kZSBjaHVua3MsIHByZXZpZXcsIHB1Ymxpc2gsIGFuZCBzdWJtaXQgbGluayBvbiBTYWthaSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUgdG8gYWRkIGNvbW1lbnRzIHRvIHlvdXIgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4gVXNlIG93biBsYW5ndWFnZSEKCioqQW55IHNpZ24gb2YgcGxhZ2lhcmlzbSwgd2lsbCByZXN1bHQgaW4gZGlzc21pc3NhbCBvZiB3b3JrISoqCgotLS0tLS0tLS0tLS0tLQoKIyMjIFRhc2sgMTogVmFyaWFuY2UsIENvdmFyaWFuY2UsIGFuZCBWb2xhdGlsaXR5CgpUaGlzIHRhc2sgZm9sbG93cyB0aGUgdHdvIGV4YW1wbGVzIGluIHRoZSBib29rIGBSIEV4YW1wbGUgMi41L3AuIDU4YCBhbmQgYFIgRXhhbXBsZSAyLjYvcC4gNjZgIAoKYGBge3J9CiMgUmVxdWlyZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2Ugb25seSBpZiBub3QgaW5zdGFsbGVkIAojIERlcGVuZGVuY2llcyA9IFRSVUUgbWFrZXMgc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbAppZighcmVxdWlyZSgicXVhbnRtb2QiLHF1aWV0bHkgPSBUUlVFKSkKICBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikKYGBgCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUEpIENhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gYW5kIGNvdmFyaWFuY2UgbWF0cml4IG9mIHRoZSBhZGp1c3RlZCBkYWlseSBsb2cgcmV0dXJucyBmb3IgZm91ciBkaWZmZXJlbnQgc3RvY2tzIG9mIHlvdXIgY2hvaWNlLiBFeHBsYWluIHlvdXIgb2JzZXJ2YXRpb25zIGluIHRlcm1zIG9mIHBvdGVudGlhbCByZWxhdGlvbnNoaXBzLgo8L3NwYW4+CmBgYHtyfQpzeW1ib2xzID0gYygnTktFJywnQUREWVknLCdTS1gnLCAnVUFBJykKZ2V0U3ltYm9scyhzeW1ib2xzLHNyYz0ieWFob28iKSAKTmlrZUxvZyA9IHBlcmlvZFJldHVybihOS0UsIHBlcmlvZCA9ICJkYWlseSIsIHR5cGUgPSAibG9nIikKQWRpZGFzTG9nID0gcGVyaW9kUmV0dXJuKEFERFlZLCBwZXJpb2QgPSAiZGFpbHkiLCB0eXBlID0gImxvZyIpClNrZWNoZXJzTG9nID0gcGVyaW9kUmV0dXJuKFNLWCwgcGVyaW9kID0gImRhaWx5IiwgdHlwZSA9ICJsb2ciKQpVQUxvZyA9IHBlcmlvZFJldHVybihVQUEsIHBlcmlvZCA9ICJkYWlseSIsIHR5cGUgPSAibG9nIikKTSA8LSBjYmluZChOaWtlTG9nLEFkaWRhc0xvZyxTa2VjaGVyc0xvZyxVQUxvZykKY29sbmFtZXMoTSkgPC0gYygiTktFIiwiQUREWVkiLCJTS1giLCJVQUEiKQpjb3YoTSkKY29yKE0sIG1ldGhvZD0icGVhcnNvbiIpCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+ClRoZXJlIGFyZSBwb3NpdGl2ZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSBkYWlseSBsb2cgcmV0dXJucyBmb3IgYWxsIGZvdXIgc3RvY2tzLCBOaWtlLCBBZGlkYXMsIFNrZWNoZXJzLCBhbmQgVW5kZXIgQXJtb3VyLiBUaGV5IGFsbCBzaG93IHdlYWsgdG8gbW9kZXJhdGUgcG9zaXRpdmUgY29ycmVsYXRpb24gd2l0aCBlYWNoIG90aGVyLiBUaGVzZSBhcmUgYWxsIGNvbXBldGl0b3JzIGluIHRoZSBhdGhsZXRpYyB3ZWFyIG1hcmtldCB0aGF0IGhhdmUgYmVlbiBzdWNjZXNzZnVsIHJlY2VudGx5LCBzbyBJIHdvdWxkbid0IGV4cGVjdCBhbnkgc2luZ2xlIGNvbXBhbnkgdG8gaGF2ZSBhIGxhcmdlIGVmZmVjdCBvbiBhbm90aGVyLgo8L3NwYW4+CmBgYHtyfQojIE9uY2UgeW91IGhhdmUgb2J0YWluZWQgdGhlIGFkanVzdGVkIGRhaWx5IGxvZyByZXR1cm5zIGZvciB5b3VyIHN0b2Nrcywgb21pdHRpbmcgdGhlIHRpbWUgaW5kZXgsIHlvdSB3aWxsIG5lZWQgdG8gY29tYmluZSB0aGVtIHRvIGNyZWF0ZSBhIG1hdHJpeC4gQmVsb3cgaXMgYW4gZXhhbXBsZS4gIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBIZWxwIGNvbW1hbmQgaW4gUiBvbiBjYmluZCwgY292LCBhbmQgY29yLgojIE0gPC0gY2JpbmQoQSxCLEMpICMgY3JlYXRlIGEgbWF0cml4IHdoZXJlIGVhY2ggY29sdW1uIGlzIGFuIGFycmF5L3ZlY3RvciBvZiBudW1lcmljYWwgdmFsdWVzIAojIGNvdihNKSAjIGNvbXB1dGUgdGhlIGNvdmFyaWFuY2UgbWF0cml4CiMgY29yKE0sIG1ldGhvZD0icGVhcnNvbiIpICMgY29tcHV0ZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IGJhc2VkIG9uIHRoZSBQZWFyc29uIG1ldGhvZApgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQikgQ2FsY3VsYXRlIHRoZSB0aHJlZSB0eXBlcyBvZiB2b2xhdGlsaXR5IGZvciBhIHBhcnRpY3VsYXIgc3RvY2sgb2YgeW91ciBjaG9pY2UuIENvbnNpZGVyIGEgdGltZSB3aW5kb3cgZXh0ZW5kaW5nIG9uZSB5ZWFyIGJhY2sgZnJvbSBtb3N0IHJlY2VudCBvYnRhaW5hYmxlIGNsb3NpbmcgZGF5IHByaWNlLiBPcmRlciB0aGUgdGhyZWUgZXN0aW1hdGVzIGZyb20gbG93IHRvIGhpZ2ggdm9sYXRpbGl0eSBhbmQgZXhwbGFpbiBob3cgdGhlIG9yZGVyaW5nIG1ha2VzIHNlbnNlLgo8L3NwYW4+CgpgYGB7cn0KbGlicmFyeShxdWFudG1vZCkKbmtlID0gTktFWycyMDE3LTExLzIwMTgtMTEnXTsgbSA9IGxlbmd0aChua2UkTktFLkNsb3NlKTsKb2hsYyA8LW5rZVssYygiTktFLk9wZW4iLCJOS0UuSGlnaCIsIk5LRS5Mb3ciLCJOS0UuQ2xvc2UiKV0KdkdLIDwtIHZvbGF0aWxpdHkob2hsYywgbiA9IG0sIGNhbGM9Imdhcm1hbiIsTj0yNTIpCnZDbG9zZSA8LSB2b2xhdGlsaXR5KG9obGMsIG4gPSBtLCBjYWxjPSJjbG9zZSIsTiA9IDI1MikKdlBhcmtpbnNvbiA8LSB2b2xhdGlsaXR5KG9obGMsIG4gPSBtLCBjYWxjPSJwYXJraW5zb24iLCBOID0gMjUyKQp2R0tbbV07dlBhcmtpbnNvblttXTt2Q2xvc2VbbV0KYGBgCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KVGhlIEdhcm1hbi1LbGFzcyBlc3RpbWF0b3IgaGFzIHRoZSBsb3dlc3Qgdm9sYXRpbGl0eSwgYXMgaXQgdXNlcyB0aGUgbW9zdCBkYXRhLCBhbmQgd2lsbCBiZSBsZXNzIHN1c2NlcHRpYmxlIHRvIGp1bXBzIGluIHZhbHVlIGJlY2F1c2UgaXQgd2lsbCBiZSBhYmxlIHRvIGNhcHR1cmUgaW5jcmVtZW50YWwgY2hhbmdlcy4gVGhlIG5leHQgaXMgdGhlIFBhcmtpbnNvbiBlc3RpbWF0b3IsIHdoaWNoIHVzZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaGlnaCBhbmQgbG93IHByaWNlcyBvZiB0aGUgZGF5LiBUaGUgbW9zdCB2b2xhdGlsZSBpcyB0aGUgQ2xvc2UtdG8tQ2xvc2UgZXN0aW1hdG9yLgo8L3NwYW4+CgpgYGB7cn0KIyBGb3IgdGhpcyB0YXNrIG1ha2Ugc3VyZSB5b3UgdW5kZXJzdGFuZCB3ZWxsIHdoYXQgdGhlIHZhcmlhYmxlcyBuLG0gcmVwcmVzZW50IGluIHRoZSBib29rJ3MgcmVmZXJlbmNlZCBleGFtcGxlLgpgYGAKCgojIyMgVGFzayAyOiBBdXRvLUNvcnJlbGF0aW9uIGFuZCBBdXRvLVJlZ3Jlc3Npb24KCkZvbGxvdyB0aGUgZXhhbXBsZSBpbiB0aGUgYm9vayAgYFIgRXhhbXBsZSAzLjIvcC4gNzRgIGFuZCBgUiBFeGFtcGxlIDQuMS9wLiAxMTVgCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkEpIENhbGN1bGF0ZSB0aGUgQUNGIGZvciBhIHN0b2NrIG9mIHlvdXIgY2hvaWNlLiBDb25zaWRlciBib3RoIHRoZSBsb2cgcmV0dXJuIGFuZCBzcXVhcmVkIGxvZyByZXR1cm4uIEludGVycHJldCB5b3VyIHJlc3VsdHMgaW4gdGVybXMgb2YgcG9zc2libGUgZXhpc3RlbmNlIG9mIGF1dG9jb3JyZWxhdGlvbi4gIAo8L3NwYW4+CgpgYGB7cn0KYWNmKG5hLm9taXQoTmlrZUxvZyksbWFpbj0iYWNmIG9mIE5LRSIseWxpbT1jKC0wLjIsMC4yKSkKYGBgCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KVGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFueSBtZWFuaW5nZnVsIGF1dG9jb3JyZWxhdGlvbnMgaW4gdGhlIGxvZyByZXR1cm5zIGZvciBOaWtlLiBMYWcgMTAgaXMgc2xpZ2h0bHkgYWJvdmUgdGhlIGxpbWl0LCBidXQgbm90IGF0IGEgdmFsdWUgdGhhdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50Lgo8L3NwYW4+Cgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkIpIFBsb3QgdGhlIGV4Y2hhbmdlIHJhdGUgZm9yIFVTRCB2ZXJzdXMgYW5vdGhlciBjdXJyZW5jeSBvZiB5b3VyIGNob2ljZS4gSW50ZXJwcmV0IHlvdXIgcmVzdWx0cyBpbiB0ZXJtcyBvZiBiZWhhdmlvci4KPC9zcGFuPgoKYGBge3J9CmdldEZYKCJKUFkvVVNEIikgI2Rvd25sb2FkIEpQWS9VU0QgcmF0ZXMgZnJvbSBvYW5kYS5jb20KcGxvdChKUFlVU0QpCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+CldpdGhpbiB0aGlzIHJlbGF0aXZlbHkgc21hbGwgc2NhbGUsIHRoZXJlIGlzIGEgbG90IG9mIHZvbGF0aWxpdHkgaW4gdGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlIEphcGFuZXNlIFllbiBhbmQgdGhlIFVTIERvbGxhci4gSW5zdGVhZCBvZiBhIGxpbmVhciBpbmNyZWFzZSBvciBkZWNyZWFzZSwgaXQgZXhoaWJpdHMgc3Bpa3kgYmVoYXZpb3IuCjwvc3Bhbj4KICAgICAgCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQykgVGVzdCBmb3IgdGhlIHBvc3NpYmxlIGV4aXN0ZW5jZSBvZiBhbiB1bmRlcmx5aW5nIEFSKDEpIOKAkyBNYXJrb3YgcHJvY2VzcyBpbiB5b3VyIGV4Y2hhbmdlIHJhdGUgY3VycmVuY3kgcGFpci4gVG8gdGhpcyBlbmQsIHBsb3QgdGhlIEFDRiBhbmQgdGhlIHBhcnRpYWwgQUNGIChQQUNGKS4gSW50ZXJwcmV0IHlvdXIgcmVzdWx0cy4gIENsZWFybHkgcmVmZXIgdG8gdGhlIGxhZ3MsIGFuZCB0aGVpciBpbXBhY3RzIGluIGRldGVybWluaW5nIHRoZSBvcmRlci4KPC9zcGFuPgoKYGBge3J9CmdldEZYKCJKUFkvVVNEIikgI2Rvd25sb2FkIEpQWS9VU0QgcmF0ZXMgZnJvbSBvYW5kYS5jb20KYWNmKEpQWVVTRCkKcGFjZihKUFlVU0QpCmBgYAoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPgpUaGUgbGFncyBvZiB0aGUgQUNGIHBsb3QgZGVjYXkgZXhwb25lbnRpYWxseSBzbyBpdCBhcHBlYXJzIHRoYXQgdGhlcmUgaXMgYW4gdW5kZXJseWluZyBBUigxKSBNYXJrb3YgcHJvY2Vzcy4KPC9zcGFuPgoKIyMjIFRhc2sgMzogR3JhbmdlciBDYXVzYWxpdHkgVGVzdAoKVG8gY29uZHVjdCB0aGlzIHRlc3QgdGhlIHBhY2thZ2UgYGxtdGVzdGAgd2lsbCBiZSByZXF1aXJlZCwgYXMgYWxyZWFkeSBkb25lIGluIHRoZSBjb2RlIGNodW5rIGJlbG93LgoKYGBge3J9CiMgUmVxdWlyZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2Ugb25seSBpZiBub3QgaW5zdGFsbGVkIAojIERlcGVuZGVuY2llcyA9IFRSVUUgbWFrZXMgc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbAppZighcmVxdWlyZSgibG10ZXN0IixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygibG10ZXN0IixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQpgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAzQSkgSW5jbHVkZSBiZWxvdyB0aGUgY29kZSBjaHVuayB0byBzb2x2ZSBmb3IgMy41LjcgUiBMYWIvcC4gMTA2LiAgV3JpdGUgeW91ciBjb25jbHVzaW9ucy4KPC9zcGFuPgoKYGBge3J9CmxpYnJhcnkobG10ZXN0KQojY2hpY2tlbnMgY2F1c2UgZWdncwpncmFuZ2VydGVzdChlZ2cgfiBjaGlja2VuLCBvcmRlciA9IDMsIGRhdGEgPSBDaGlja0VnZykKI2VnZ3MgY2F1c2UgY2hpY2tlbnMKZ3JhbmdlcnRlc3QoY2hpY2tlbiB+IGVnZywgb3JkZXIgPSAzLCBkYXRhID0gQ2hpY2tFZ2cpCkNoaWNrRWdnCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+ClRoZSByZXN1bHRzIHNob3cgbm8gc2lnbmlmaWNhbmNlIGZvciBjaGlja2VucyBjYXVzaW5nIGVnZ3MsIGJ1dCB0aGVyZSBpcyBhIC4wMDEgc2lnbmlmaWNhbmNlIGxldmVsIGZvciBlZ2dzIGNhdXNpbmcgY2hpY2tlbiBzbyBpdCB3b3VsZCBhcHBlYXIgdGhhdCBpdCBpcyBwcm92ZW4gdHJ1ZS4KPC9zcGFuPgpgYGB7cn0KIyBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhIHVzZWQgaW4gdGVzdGluZyBmb3IgY2F1c2FsaXR5IGNhbiBiZSBvYnRhaW5lZCBieSB0eXBpbmcgdGhlIG5hbWUgb2YgdGhlIGRhdGEgc2V0IGBDaGlja0VnZ2AgaW4gdGhlIFIgSGVscCBtZW51LgpgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAzQikgQnJpZWZseSBkZXNjcmliZSB0aGUgZGF0YSBpbiB0ZXJtcyBvZiB0aW1lIHJhbmdlIGFuZCB2YXJpYWJsZXMuIFNpbWlsYXIgdG8gdGhlIGxpbmVhciBhdXRvZWdyZXNzaXZlIG1vZGVsIGRlc2NyaWJlZCBpbiBjbGFzcywgd3JpdGUgdGhlIG1hdGhlbWF0aWNhbCByZWdyZXNzaW9uIG1vZGVsIHNvbHZlZCBpbiBlYWNoIEdyYW5nZXIgdGVzdCwgaW5jbHVkaW5nIHRoZSBwcm9wZXIgb3JkZXIuIFVzZSBuYW1pbmcgY29udmVudGlvbnMsIGFuZCBub3RhdGlvbnMgbW9yZSByZWZsZWN0aXZlIG9mIHRoZSBkYXRhIHNldCBjb25zaWRlcmVkIGZvciAgYENoaWNrRWdnYC4KPC9zcGFuPgoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPgpGcm9tIDE5MzAgdG8gMTk4MywgdGhlIGRhdGEgc2hvd3MgdGhlIG51bWJlciBvZiBjb21tZXJjaWFsIGNoaWNrZW5zIG9uIERlY2VtYmVyIDEgYW5kIHRoZSBhbm51YWwgZWdnIHByb2R1Y3Rpb24gaW4gbWlsbGlvbnMuCjwvc3Bhbj4KCiMjIyBUYXNrIDQ6IE1hdGhlbWF0aWNhbCBQcm9vZgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDRBKSBQcm92ZSB0aGUgdHdvIHJlc3VsdHMgaW4gRXEgKDIuMzIpL3AuIDUzLiAgTm8gUi1jb2RpbmcgaXMgbmVlZGVkIGhlcmUuICBDbGVhcmx5IHNob3cgeW91ciBzdGVwcy4gSGludDogVXNlIHRoZSBkZWZpbml0aW9uIG9mICRFKFhebikkIGZvciBYLWxvZyBub3JtYWxseSBkaXN0cmlidXRlZC4gICBPYnNlcnZlIGFsc28gdGhhdCAkVmFyKFgpID0gRShYXjIpLUVeMihYKSQgZm9yIGFueSByYW5kb20gdmFyaWFibGUgWC4KPC9zcGFuPgoKCgoKCipbaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1IF0oaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1KQo=