About
This worksheet has three main taks: analyze the time series of returns, assess for normal distribution, and check for exponential behavior of prices time series.
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: Plot of Returns & Testing for Normality Distribution
In this task we will look at various type of daily returns calculations for comparison and to test normality.
# 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) Follow the instructions on p.41 to generate four plots for daily, daily log, weekly, and monthly returns. Select a stock of your choice and a time period long enough (5-10 years) to capture the returns behavior.
getSymbols('AAPL',src='yahoo', from="2008-01-01", to="2018-12-30")
[1] "AAPL"
aplRd = periodReturn(AAPL,period="daily")
plot(aplRd, main="APPLE daily returns")

aplRd2 = periodReturn(AAPL,period="daily",type="log")
plot(aplRd, main="APPLE daily log returns")

aplRd3 = periodReturn(AAPL,period="weekly")
plot(aplRd, main="APPLE weekly returns")

aplRd4 = periodReturn(AAPL,period="monthly")
plot(aplRd, main="APPLE monthly returns")

##### 1B) For the case of daily log returns only, write down the mathematical formula representing the calculation in the code. Confirm integrity of your mathematical formula by selecting a recent data point from your time series object, substituting the corresponding values in the formula to manually calculate the log return, and comparing both results.
The mathematical formula representing the calculation in the code is \(r_{t}\)=ln(1+\(R_{t}\))=ln(\(\frac{P_{t}}{P_{t-1}}\))=ln\(P_{t}\)-ln\(P_{t-1}\), in which \(r_{t}\) is daily log return, \(R_{t}\) is daily return, \(P_{t}\) is daily price of APPL. To confirm the integrity of my mathematical formula, I select a recent data point from time series object: the daily price on 11-12-2018 is 194.17, and the daily price on 11-13-2018 is 192.23. The daily return on 11-13-2018 is -9.991255\(10^{-3}\), and the calculated daily log return is ln(192.23)-1n(194.17)=-1.004149\(10^{-2}\), which is almostly the same as the data -1.004150*\(10^{-2}\) shown on the daily-log-returns plot.
##### 1C) Check the normality of the daily returns using the R function qqnorm() to generate a Q-Q plot. For the function to work properly, you will need to extract first the numeric values from the time series object. Note that a time series object contains both a date and a corresponding value. To extract the numerical value only, on can use the R function as.numeric() on the time series object. Explain what the Y and X axis of the Q-Q plot represent, and share your observation on the normality of the returns distribution.
getSymbols('AAPL',src='yahoo', from="2007-01-01", to="2017-12-30")
[1] "AAPL"
aplRd = periodReturn(AAPL,period="daily")
numericv=as.numeric(aplRd)
#dsd=density(aplRd) #estimate density of daily log ret
ylim=c(-0.05,0.05) #set y limit
qqnorm(numericv, ylim, main = "Normal Q-Q Plot",
xlab = "Theoretical Quantiles", ylab = "Sample Quantiles",
plot.it = TRUE, datax = FALSE)
qqline(numericv, datax = FALSE, distribution = qnorm,
probs = c(0.25, 0.75), qtype = 7)

The X axis of the Q-Q plot represents the theoretical quantiles of daily-returns data set, the Y axis of the Q-Q plot represents the sample quantiles of daily-returns data set. Since the plot we draw is near the qqline, which is the Q-Q plot of normal distrubution, we can conclude that although the distribution of daily returns of APPL stock is symmetric with fat tails, it is still similar to the normal distribution.
Task 2: Density Distribution
Another way to assess the normality of a distribution, other than a Q-Q plot, is to look at the actual density distribution and compare to a normal distribution.
##### 2A) Follow the example in R Lab 2.7.9/p. 70 to generate the density distribution for your stock of choice. Comment on your results.
require(quantmod)
getSymbols("AAPL",src="yahoo")
[1] "AAPL"
appl=AAPL
apRd= periodReturn(appl,period="daily",type="log")
dsd=density(apRd) #estimate density of daily log ret
yl=c(min(dsd$y),max(dsd$y)) #set y limits
plot(dsd,main=NULL,ylim=yl)
##plot the normal density with mean, stdv of apRd
a=seq(min(apRd),max(apRd),0.001)
points(a,dnorm(a,mean(apRd),sd(apRd)), type="l",lty=2)

apRd= periodReturn(appl,period="weekly",type="log")
dsd=density(apRd) #estimate density of weekly log ret
yl=c(min(dsd$y),max(dsd$y)) #set y limits
plot(dsd,main=NULL,ylim=yl)
##plot the normal density with mean, stdv of apRd
a=seq(min(apRd),max(apRd),0.001)
points(a,dnorm(a,mean(apRd),sd(apRd)), type="l",lty=2)

apRd= periodReturn(appl,period="monthly",type="log")
dsd=density(apRd) #estimate density of monthly log ret
yl=c(min(dsd$y),max(dsd$y)) #set y limits
plot(dsd,main=NULL,ylim=yl)
##plot the normal density with mean, stdv of apRd
a=seq(min(apRd),max(apRd),0.001)
points(a,dnorm(a,mean(apRd),sd(apRd)), type="l",lty=2)

From the plots of results above, we can see the density distributions for AAPL stock’s daily, weekly and monthly returns. And we can also conclude that the aggregational normality holds in stock returns, which refers to the fact that as one increases the time scale (from daily to monthly), the distribution of the related time-period returns looks more like a normal distribution.
Task 3: Exponential Behavior of Prices & Curve Fitting
In general, the price history of a stock, over a sufficiently large time window, tends to follow an exponential curve. Many other economic indicators like GDP, population growth, and inflation also follow exponential growth over a long time. Keep in mind that for investment purposes we care more about returns and not prices.
##### 3A) Follow the example in R Lab 2.7.2/p. 67 or R Labs 2 from bookâs website (*) to generate an exponential fit for the Dow Jones Industrial Average DJIA. In case the suggested command in the book does not work, consider using instead the command in the code chunk below to capture the DIJA prices.
#Federal Reserve Bank of St Louis
getSymbols.FRED("DJIA",env=globalenv())
[1] "DJIA"
serie=DJIA["2008/2018"]
price=as.numeric(serie) #extract numeric values of price
time = index(serie) #extract the indices
x=1:length(price)
model=lm(log(price)~x)
expo=exp(model$coef[1]+model$coef[2]*x)
plot(x=time,y=price, main="Dow Jones",type="l")
lines(time,expo,col=2,lwd=2)

##### 3B) Write down the mathematical form representing the exponential function in the code. Substitute for the exact coefficients in the exponential form and clearly label the variables in the function, in particular the time index.
The mathematical form representing the exponential function in the code is expo=\(e^{coef[1]+coef[2]*x}\), in which expo is the fitted price variable of the DJIA, coef[1] and coef[2] are the estimated coefficients of the function log(price)=coef[1]+coef[2]*x, x is an continuous integer vector that has number from 1 to the length of the DJIA’s price data set. Price is the real daily numeric value of DJIA, and time index is a data collection that contains the date of the daily value of DJIA.
##### 3C) Repeat the exercise in 3A) for AAPL Adjusted prices.
getSymbols('AAPL',src='yahoo', from="2008-01-01", to="2018-12-30")
[1] "AAPL"
##to see only the adjusted close price for that period
applAdj = AAPL$AAPL.Adjusted["2008-01-01/2018-12-30"]
serie=applAdj["2008/2018"]
price=as.numeric(serie) #extract numeric values of price
time = index(serie) #extract the indices
x=1:length(price)
model=lm(log(price)~x)
expo=exp(model$coef[1]+model$coef[2]*x)
plot(x=time,y=price, main="APPL stock",type="l")
lines(time,expo,col=2,lwd=2)

*http://computationalfinance.lsi.upc.edu
LS0tDQp0aXRsZTogIkZJTkM2MjEgV2ludGVyIDIwMTgtMTkgTGFiIFdvcmtzaGVldCAwMiINCmF1dGhvcjogIll1ZSBIdWFuZyINCmRhdGU6ICIxMS0yMS0yMDE4Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQNCnN1YnRpdGxlOiBUaW1lIFNlcmllcyBEaXN0cmlidXRpb25zICYgTm9ybWFsaXR5IChmaW5jNjIxLWxhYjAyKQ0KLS0tDQoNCiMjIyBBYm91dA0KDQpUaGlzIHdvcmtzaGVldCBoYXMgdGhyZWUgbWFpbiB0YWtzOiBhbmFseXplIHRoZSB0aW1lIHNlcmllcyBvZiByZXR1cm5zLCBhc3Nlc3MgZm9yIG5vcm1hbCBkaXN0cmlidXRpb24sIGFuZCBjaGVjayBmb3IgZXhwb25lbnRpYWwgYmVoYXZpb3Igb2YgcHJpY2VzIHRpbWUgc2VyaWVzLg0KDQojIyMgU2V0dXANCg0KUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIA0KDQojIyMgTm90ZQ0KDQpGb3IgY2xhcml0eSwgdGFza3MvcXVlc3Rpb25zIHRvIGJlIGNvbXBsZXRlZC9hbnN3ZXJlZCBhcmUgaGlnaGxpZ2h0ZWQgaW4gcmVkIGNvbG9yIChjb2xvciB2aXNpYmxlIG9ubHkgaW4gcHJldmlldyBtb2RlKSBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBUeXBlIHlvdXIgYW5zd2VycyBvdXRzaWRlIHRoZSByZWQgY29sb3IgdGFncyENCg0KUXVpdGUgb2Z0ZW4geW91IHdpbGwgbmVlZCB0byBhZGQgeW91ciBvd24gY29kZSBjaHVuay4gRXhlY3V0ZSBzZXF1ZW50aWFsbHkgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTWFrZSBzdXJlIHRvIGFkZCBjb21tZW50cyB0byB5b3VyIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuIFVzZSBvd24gbGFuZ3VhZ2UhDQoNCioqQW55IHNpZ24gb2YgcGxhZ2lhcmlzbSwgd2lsbCByZXN1bHQgaW4gZGlzc21pc3NhbCBvZiB3b3JrISoqDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIyBUYXNrIDE6IFBsb3Qgb2YgUmV0dXJucyAmIFRlc3RpbmcgZm9yIE5vcm1hbGl0eSBEaXN0cmlidXRpb24NCg0KSW4gdGhpcyB0YXNrIHdlIHdpbGwgbG9vayBhdCB2YXJpb3VzIHR5cGUgb2YgZGFpbHkgcmV0dXJucyBjYWxjdWxhdGlvbnMgZm9yIGNvbXBhcmlzb24gYW5kIHRvIHRlc3Qgbm9ybWFsaXR5Lg0KDQpgYGB7cn0NCiMgUmVxdWlyZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2Ugb25seSBpZiBub3QgaW5zdGFsbGVkIA0KIyBEZXBlbmRlbmNpZXMgPSBUUlVFIG1ha2VzIHN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGwNCmlmKCFyZXF1aXJlKCJxdWFudG1vZCIscXVpZXRseSA9IFRSVUUpKQ0KICBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikNCmBgYA0KDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUEpIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIG9uIHAuNDEgdG8gZ2VuZXJhdGUgZm91ciBwbG90cyBmb3IgZGFpbHksIGRhaWx5IGxvZywgd2Vla2x5LCBhbmQgbW9udGhseSByZXR1cm5zLiBTZWxlY3QgYSBzdG9jayBvZiB5b3VyIGNob2ljZSBhbmQgYSB0aW1lIHBlcmlvZCBsb25nIGVub3VnaCAoNS0xMCB5ZWFycykgdG8gY2FwdHVyZSB0aGUgcmV0dXJucyBiZWhhdmlvci4gDQo8L3NwYW4+DQoNCmBgYHtyfQ0KZ2V0U3ltYm9scygnQUFQTCcsc3JjPSd5YWhvbycsIGZyb209IjIwMDgtMDEtMDEiLCB0bz0iMjAxOC0xMi0zMCIpDQphcGxSZCA9IHBlcmlvZFJldHVybihBQVBMLHBlcmlvZD0iZGFpbHkiKQ0KcGxvdChhcGxSZCwgbWFpbj0iQVBQTEUgZGFpbHkgcmV0dXJucyIpDQphcGxSZDIgPSBwZXJpb2RSZXR1cm4oQUFQTCxwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKQ0KcGxvdChhcGxSZCwgbWFpbj0iQVBQTEUgZGFpbHkgbG9nIHJldHVybnMiKQ0KYXBsUmQzID0gcGVyaW9kUmV0dXJuKEFBUEwscGVyaW9kPSJ3ZWVrbHkiKQ0KcGxvdChhcGxSZCwgbWFpbj0iQVBQTEUgd2Vla2x5IHJldHVybnMiKQ0KYXBsUmQ0ID0gcGVyaW9kUmV0dXJuKEFBUEwscGVyaW9kPSJtb250aGx5IikNCnBsb3QoYXBsUmQsIG1haW49IkFQUExFIG1vbnRobHkgcmV0dXJucyIpDQpgYGANCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFCKSBGb3IgdGhlIGNhc2Ugb2YgKipkYWlseSBsb2cgcmV0dXJucyoqICBvbmx5LCB3cml0ZSBkb3duIHRoZSBtYXRoZW1hdGljYWwgZm9ybXVsYSByZXByZXNlbnRpbmcgdGhlIGNhbGN1bGF0aW9uIGluIHRoZSBjb2RlLiBDb25maXJtIGludGVncml0eSBvZiB5b3VyIG1hdGhlbWF0aWNhbCBmb3JtdWxhIGJ5IHNlbGVjdGluZyBhIHJlY2VudCBkYXRhIHBvaW50IGZyb20geW91ciB0aW1lIHNlcmllcyBvYmplY3QsIHN1YnN0aXR1dGluZyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhlIGZvcm11bGEgdG8gbWFudWFsbHkgY2FsY3VsYXRlIHRoZSBsb2cgcmV0dXJuLCBhbmQgY29tcGFyaW5nIGJvdGggcmVzdWx0cy4NCjwvc3Bhbj4NCg0KVGhlIG1hdGhlbWF0aWNhbCBmb3JtdWxhIHJlcHJlc2VudGluZyB0aGUgY2FsY3VsYXRpb24gaW4gdGhlIGNvZGUgaXMgJHJfe3R9JD1sbigxKyRSX3t0fSQpPWxuKCRcZnJhY3tQX3t0fX17UF97dC0xfX0kKT1sbiRQX3t0fSQtbG4kUF97dC0xfSQsIGluIHdoaWNoICRyX3t0fSQgaXMgZGFpbHkgbG9nIHJldHVybiwgJFJfe3R9JCBpcyBkYWlseSByZXR1cm4sICRQX3t0fSQgaXMgZGFpbHkgcHJpY2Ugb2YgQVBQTC4gVG8gY29uZmlybSB0aGUgaW50ZWdyaXR5IG9mIG15IG1hdGhlbWF0aWNhbCBmb3JtdWxhLCBJIHNlbGVjdCBhIHJlY2VudCBkYXRhIHBvaW50IGZyb20gdGltZSBzZXJpZXMgb2JqZWN0OiB0aGUgZGFpbHkgcHJpY2Ugb24gMTEtMTItMjAxOCBpcyAxOTQuMTcsIGFuZCB0aGUgZGFpbHkgcHJpY2Ugb24gMTEtMTMtMjAxOCBpcyAxOTIuMjMuIFRoZSBkYWlseSByZXR1cm4gb24gMTEtMTMtMjAxOCBpcyAtOS45OTEyNTUqJDEwXnstM30kLCBhbmQgdGhlIGNhbGN1bGF0ZWQgZGFpbHkgbG9nIHJldHVybiBpcw0KbG4oMTkyLjIzKS0xbigxOTQuMTcpPS0xLjAwNDE0OSokMTBeey0yfSQsDQp3aGljaCBpcyBhbG1vc3RseSB0aGUgc2FtZSBhcyB0aGUgZGF0YSAtMS4wMDQxNTAqJDEwXnstMn0kIHNob3duIG9uIHRoZSBkYWlseS1sb2ctcmV0dXJucyBwbG90LiANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxQykgQ2hlY2sgdGhlIG5vcm1hbGl0eSBvZiB0aGUgKipkYWlseSByZXR1cm5zKiogdXNpbmcgdGhlIFIgZnVuY3Rpb24gYHFxbm9ybSgpYCB0byBnZW5lcmF0ZSBhIFEtUSBwbG90LiBGb3IgdGhlIGZ1bmN0aW9uIHRvIHdvcmsgcHJvcGVybHksIHlvdSB3aWxsIG5lZWQgdG8gZXh0cmFjdCBmaXJzdCB0aGUgbnVtZXJpYyB2YWx1ZXMgZnJvbSB0aGUgdGltZSBzZXJpZXMgb2JqZWN0LiBOb3RlIHRoYXQgYSB0aW1lIHNlcmllcyBvYmplY3QgY29udGFpbnMgYm90aCBhIGRhdGUgYW5kIGEgY29ycmVzcG9uZGluZyB2YWx1ZS4gVG8gZXh0cmFjdCB0aGUgbnVtZXJpY2FsIHZhbHVlIG9ubHksIG9uIGNhbiB1c2UgdGhlIFIgZnVuY3Rpb24gYGFzLm51bWVyaWMoKWAgb24gdGhlIHRpbWUgc2VyaWVzIG9iamVjdC4gRXhwbGFpbiB3aGF0IHRoZSBZIGFuZCBYIGF4aXMgb2YgdGhlIFEtUSBwbG90IHJlcHJlc2VudCwgYW5kIHNoYXJlIHlvdXIgb2JzZXJ2YXRpb24gb24gdGhlIG5vcm1hbGl0eSBvZiB0aGUgcmV0dXJucyBkaXN0cmlidXRpb24uDQo8L3NwYW4+DQoNCmBgYHtyfQ0KZ2V0U3ltYm9scygnQUFQTCcsc3JjPSd5YWhvbycsIGZyb209IjIwMDctMDEtMDEiLCB0bz0iMjAxNy0xMi0zMCIpDQphcGxSZCA9IHBlcmlvZFJldHVybihBQVBMLHBlcmlvZD0iZGFpbHkiKQ0KbnVtZXJpY3Y9YXMubnVtZXJpYyhhcGxSZCkNCnlsaW09YygtMC4wNSwwLjA1KSAjc2V0IHkgbGltaXQNCnFxbm9ybShudW1lcmljdiwgeWxpbSwgbWFpbiA9ICJOb3JtYWwgUS1RIFBsb3QiLA0KICAgICAgIHhsYWIgPSAiVGhlb3JldGljYWwgUXVhbnRpbGVzIiwgeWxhYiA9ICJTYW1wbGUgUXVhbnRpbGVzIiwNCiAgICAgICBwbG90Lml0ID0gVFJVRSwgZGF0YXggPSBGQUxTRSkNCnFxbGluZShudW1lcmljdiwgZGF0YXggPSBGQUxTRSwgZGlzdHJpYnV0aW9uID0gcW5vcm0sDQogICAgICAgcHJvYnMgPSBjKDAuMjUsIDAuNzUpLCBxdHlwZSA9IDcpDQpgYGANClRoZSBYIGF4aXMgb2YgdGhlIFEtUSBwbG90IHJlcHJlc2VudHMgdGhlIHRoZW9yZXRpY2FsIHF1YW50aWxlcyBvZiBkYWlseS1yZXR1cm5zIGRhdGEgc2V0LCB0aGUgWSBheGlzIG9mIHRoZSBRLVEgcGxvdCByZXByZXNlbnRzIHRoZSBzYW1wbGUgcXVhbnRpbGVzIG9mIGRhaWx5LXJldHVybnMgZGF0YSBzZXQuIFNpbmNlIHRoZSBwbG90IHdlIGRyYXcgaXMgbmVhciB0aGUgcXFsaW5lLCB3aGljaCBpcyB0aGUgUS1RIHBsb3Qgb2Ygbm9ybWFsIGRpc3RydWJ1dGlvbiwgd2UgY2FuIGNvbmNsdWRlIHRoYXQgYWx0aG91Z2ggdGhlIGRpc3RyaWJ1dGlvbiBvZiBkYWlseSByZXR1cm5zIG9mIEFQUEwgc3RvY2sgaXMgc3ltbWV0cmljIHdpdGggZmF0IHRhaWxzLCBpdCBpcyBzdGlsbCBzaW1pbGFyIHRvIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQojIyMgVGFzayAyOiBEZW5zaXR5IERpc3RyaWJ1dGlvbg0KDQpBbm90aGVyIHdheSB0byBhc3Nlc3MgdGhlIG5vcm1hbGl0eSBvZiBhIGRpc3RyaWJ1dGlvbiwgb3RoZXIgdGhhbiBhIFEtUSBwbG90LCBpcyB0byBsb29rIGF0IHRoZSBhY3R1YWwgZGVuc2l0eSBkaXN0cmlidXRpb24gYW5kIGNvbXBhcmUgdG8gYSBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJBKSBGb2xsb3cgdGhlIGV4YW1wbGUgaW4gUiBMYWIgMi43LjkvcC4gNzAgdG8gZ2VuZXJhdGUgdGhlIGRlbnNpdHkgZGlzdHJpYnV0aW9uIGZvciB5b3VyIHN0b2NrIG9mIGNob2ljZS4gQ29tbWVudCBvbiB5b3VyIHJlc3VsdHMuDQo8L3NwYW4+DQoNCmBgYHtyfQ0KcmVxdWlyZShxdWFudG1vZCkNCmdldFN5bWJvbHMoIkFBUEwiLHNyYz0ieWFob28iKQ0KYXBwbD1BQVBMDQphcFJkPSBwZXJpb2RSZXR1cm4oYXBwbCxwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKQ0KZHNkPWRlbnNpdHkoYXBSZCkgI2VzdGltYXRlIGRlbnNpdHkgb2YgZGFpbHkgbG9nIHJldA0KeWw9YyhtaW4oZHNkJHkpLG1heChkc2QkeSkpICNzZXQgeSBsaW1pdHMNCnBsb3QoZHNkLG1haW49TlVMTCx5bGltPXlsKQ0KIyNwbG90IHRoZSBub3JtYWwgZGVuc2l0eSB3aXRoIG1lYW4sIHN0ZHYgb2YgYXBSZA0KYT1zZXEobWluKGFwUmQpLG1heChhcFJkKSwwLjAwMSkNCnBvaW50cyhhLGRub3JtKGEsbWVhbihhcFJkKSxzZChhcFJkKSksIHR5cGU9ImwiLGx0eT0yKQ0KYXBSZD0gcGVyaW9kUmV0dXJuKGFwcGwscGVyaW9kPSJ3ZWVrbHkiLHR5cGU9ImxvZyIpDQpkc2Q9ZGVuc2l0eShhcFJkKSAjZXN0aW1hdGUgZGVuc2l0eSBvZiB3ZWVrbHkgbG9nIHJldA0KeWw9YyhtaW4oZHNkJHkpLG1heChkc2QkeSkpICNzZXQgeSBsaW1pdHMNCnBsb3QoZHNkLG1haW49TlVMTCx5bGltPXlsKQ0KIyNwbG90IHRoZSBub3JtYWwgZGVuc2l0eSB3aXRoIG1lYW4sIHN0ZHYgb2YgYXBSZA0KYT1zZXEobWluKGFwUmQpLG1heChhcFJkKSwwLjAwMSkNCnBvaW50cyhhLGRub3JtKGEsbWVhbihhcFJkKSxzZChhcFJkKSksIHR5cGU9ImwiLGx0eT0yKQ0KYXBSZD0gcGVyaW9kUmV0dXJuKGFwcGwscGVyaW9kPSJtb250aGx5Iix0eXBlPSJsb2ciKQ0KZHNkPWRlbnNpdHkoYXBSZCkgI2VzdGltYXRlIGRlbnNpdHkgb2YgbW9udGhseSBsb2cgcmV0DQp5bD1jKG1pbihkc2QkeSksbWF4KGRzZCR5KSkgI3NldCB5IGxpbWl0cw0KcGxvdChkc2QsbWFpbj1OVUxMLHlsaW09eWwpDQojI3Bsb3QgdGhlIG5vcm1hbCBkZW5zaXR5IHdpdGggbWVhbiwgc3RkdiBvZiBhcFJkDQphPXNlcShtaW4oYXBSZCksbWF4KGFwUmQpLDAuMDAxKQ0KcG9pbnRzKGEsZG5vcm0oYSxtZWFuKGFwUmQpLHNkKGFwUmQpKSwgdHlwZT0ibCIsbHR5PTIpDQpgYGANCkZyb20gdGhlIHBsb3RzIG9mIHJlc3VsdHMgYWJvdmUsIHdlIGNhbiBzZWUgdGhlIGRlbnNpdHkgZGlzdHJpYnV0aW9ucyBmb3IgQUFQTCBzdG9jaydzIGRhaWx5LCB3ZWVrbHkgYW5kIG1vbnRobHkgcmV0dXJucy4gQW5kIHdlIGNhbiBhbHNvIGNvbmNsdWRlIHRoYXQgdGhlIGFnZ3JlZ2F0aW9uYWwgbm9ybWFsaXR5IGhvbGRzIGluIHN0b2NrIHJldHVybnMsIHdoaWNoIHJlZmVycyB0byB0aGUgZmFjdCB0aGF0IGFzIG9uZSBpbmNyZWFzZXMgdGhlIHRpbWUgc2NhbGUgKGZyb20gZGFpbHkgdG8gbW9udGhseSksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHJlbGF0ZWQgdGltZS1wZXJpb2QgcmV0dXJucyBsb29rcyBtb3JlIGxpa2UgYSBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQojIyMgVGFzayAzOiBFeHBvbmVudGlhbCBCZWhhdmlvciBvZiBQcmljZXMgJiBDdXJ2ZSBGaXR0aW5nDQoNCkluIGdlbmVyYWwsIHRoZSBwcmljZSBoaXN0b3J5IG9mIGEgc3RvY2ssIG92ZXIgYSBzdWZmaWNpZW50bHkgbGFyZ2UgdGltZSB3aW5kb3csIHRlbmRzIHRvIGZvbGxvdyBhbiBleHBvbmVudGlhbCBjdXJ2ZS4gTWFueSBvdGhlciBlY29ub21pYyBpbmRpY2F0b3JzIGxpa2UgR0RQLCBwb3B1bGF0aW9uIGdyb3d0aCwgYW5kIGluZmxhdGlvbiBhbHNvIGZvbGxvdyBleHBvbmVudGlhbCBncm93dGggb3ZlciBhIGxvbmcgdGltZS4gS2VlcCBpbiBtaW5kIHRoYXQgZm9yIGludmVzdG1lbnQgcHVycG9zZXMgd2UgY2FyZSBtb3JlIGFib3V0IHJldHVybnMgYW5kIG5vdCBwcmljZXMuDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgM0EpIEZvbGxvdyB0aGUgZXhhbXBsZSBpbiBSIExhYiAyLjcuMi9wLiA2NyBvciBSIExhYnMgMiBmcm9tIGJvb2vigJlzIHdlYnNpdGUgKCopIHRvIGdlbmVyYXRlIGFuIGV4cG9uZW50aWFsIGZpdCBmb3IgdGhlIERvdyBKb25lcyBJbmR1c3RyaWFsIEF2ZXJhZ2UgREpJQS4gSW4gY2FzZSB0aGUgc3VnZ2VzdGVkIGNvbW1hbmQgaW4gdGhlIGJvb2sgZG9lcyBub3Qgd29yaywgY29uc2lkZXIgdXNpbmcgaW5zdGVhZCB0aGUgY29tbWFuZCBpbiB0aGUgY29kZSBjaHVuayBiZWxvdyB0byBjYXB0dXJlIHRoZSBESUpBIHByaWNlcy4gIA0KPC9zcGFuPg0KDQpgYGB7cn0NCiNGZWRlcmFsIFJlc2VydmUgQmFuayBvZiBTdCBMb3Vpcw0KZ2V0U3ltYm9scy5GUkVEKCJESklBIixlbnY9Z2xvYmFsZW52KCkpDQpzZXJpZT1ESklBWyIyMDA4LzIwMTgiXQ0KcHJpY2U9YXMubnVtZXJpYyhzZXJpZSkgI2V4dHJhY3QgbnVtZXJpYyB2YWx1ZXMgb2YgcHJpY2UNCnRpbWUgPSBpbmRleChzZXJpZSkgI2V4dHJhY3QgdGhlIGluZGljZXMNCng9MTpsZW5ndGgocHJpY2UpDQptb2RlbD1sbShsb2cocHJpY2UpfngpDQpleHBvPWV4cChtb2RlbCRjb2VmWzFdK21vZGVsJGNvZWZbMl0qeCkNCnBsb3QoeD10aW1lLHk9cHJpY2UsIG1haW49IkRvdyBKb25lcyIsdHlwZT0ibCIpDQpsaW5lcyh0aW1lLGV4cG8sY29sPTIsbHdkPTIpDQoNCmBgYA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDNCKSBXcml0ZSBkb3duIHRoZSBtYXRoZW1hdGljYWwgZm9ybSByZXByZXNlbnRpbmcgdGhlIGV4cG9uZW50aWFsIGZ1bmN0aW9uIGluIHRoZSBjb2RlLiBTdWJzdGl0dXRlIGZvciB0aGUgZXhhY3QgY29lZmZpY2llbnRzIGluIHRoZSBleHBvbmVudGlhbCBmb3JtIGFuZCBjbGVhcmx5IGxhYmVsIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGZ1bmN0aW9uLCBpbiBwYXJ0aWN1bGFyIHRoZSB0aW1lIGluZGV4LiANCjwvc3Bhbj4NCg0KVGhlIG1hdGhlbWF0aWNhbCBmb3JtIHJlcHJlc2VudGluZyB0aGUgZXhwb25lbnRpYWwgZnVuY3Rpb24gaW4gdGhlIGNvZGUgaXMgZXhwbz0kZV57Y29lZlsxXStjb2VmWzJdKnh9JCwgaW4gd2hpY2ggZXhwbyBpcyB0aGUgZml0dGVkIHByaWNlIHZhcmlhYmxlIG9mIHRoZSBESklBLCBjb2VmWzFdIGFuZCBjb2VmWzJdIGFyZSB0aGUgZXN0aW1hdGVkIGNvZWZmaWNpZW50cyBvZiB0aGUgZnVuY3Rpb24gbG9nKHByaWNlKT1jb2VmWzFdK2NvZWZbMl0qeCwgeCBpcyBhbiBjb250aW51b3VzIGludGVnZXIgdmVjdG9yIHRoYXQgaGFzIG51bWJlciBmcm9tIDEgdG8gdGhlIGxlbmd0aCBvZiB0aGUgREpJQSdzIHByaWNlIGRhdGEgc2V0LiBQcmljZSBpcyB0aGUgcmVhbCBkYWlseSBudW1lcmljIHZhbHVlIG9mIERKSUEsIGFuZCB0aW1lIGluZGV4IGlzIGEgZGF0YSBjb2xsZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIGRhdGUgb2YgdGhlIGRhaWx5IHZhbHVlIG9mIERKSUEuDQoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAzQykgUmVwZWF0IHRoZSAgZXhlcmNpc2UgaW4gM0EpIGZvciBBQVBMIEFkanVzdGVkIHByaWNlcy4NCjwvc3Bhbj4NCg0KYGBge3J9DQpnZXRTeW1ib2xzKCdBQVBMJyxzcmM9J3lhaG9vJywgZnJvbT0iMjAwOC0wMS0wMSIsIHRvPSIyMDE4LTEyLTMwIikNCiMjdG8gc2VlIG9ubHkgdGhlIGFkanVzdGVkIGNsb3NlIHByaWNlIGZvciB0aGF0IHBlcmlvZA0KYXBwbEFkaiA9IEFBUEwkQUFQTC5BZGp1c3RlZFsiMjAwOC0wMS0wMS8yMDE4LTEyLTMwIl0NCnNlcmllPWFwcGxBZGpbIjIwMDgvMjAxOCJdDQpwcmljZT1hcy5udW1lcmljKHNlcmllKSAjZXh0cmFjdCBudW1lcmljIHZhbHVlcyBvZiBwcmljZQ0KdGltZSA9IGluZGV4KHNlcmllKSAjZXh0cmFjdCB0aGUgaW5kaWNlcw0KeD0xOmxlbmd0aChwcmljZSkNCm1vZGVsPWxtKGxvZyhwcmljZSl+eCkNCmV4cG89ZXhwKG1vZGVsJGNvZWZbMV0rbW9kZWwkY29lZlsyXSp4KQ0KcGxvdCh4PXRpbWUseT1wcmljZSwgbWFpbj0iQVBQTCBzdG9jayIsdHlwZT0ibCIpDQpsaW5lcyh0aW1lLGV4cG8sY29sPTIsbHdkPTIpDQoNCmBgYA0KDQoNCg0KDQoNCipbaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1IF0oaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1KQ0K