About
This worksheet looks at VaR calculations for the two cases of single and multiple equity asset. This is the last lab worksheet, other than the extra credit assignment.
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
Always read carefully the instructions on Sakai. For clarity, tasks/questions to be completed/answered are highlighted in red color (visible in preview) and numbered according to their particular placement in the task section. Quite often you will need to add your own code chunk.
Execute all code chunks, preview, publish, and submit link on Sakai follwoing the naming convention. Make sure to add comments to your code where appropriate. Use own language!
Task 1: VaR Calculations: Single Equity Asset
#Install package quantmod
install.packages("quantmod")
Error in install.packages : Updating loaded packages
library("quantmod")
Consider the time series of a stock of your choice (other than AAPL and your colleague!) and for the time-period from Jan 1, 2015 to present.
We will first generate the historical time series of daily log returns, and calculate the mean and standard deviation of the time series.
##### 1A) Calculate the historical daily log returns, mean and standard deviation
Given a time series we can generate a histogram and mark the quantile value that corresponds to the 95% confidence level. The quantile value in this case is the critical value for which 95% of the data is on the right (higher) of the critical value as represented by the histogram. The remaining 5% will be on the left. To find the quantile value you will need to use the function quantile() with the proper arguments. For example quantile(xts,probs=0.01) applies to a time series xts and return the critical value correspondng to 99% confidence level.
getSymbols("TWTR",src="yahoo",from="2015-01-01") ##data starts from 2015
[1] "TWTR"
TWTRD = periodReturn(TWTR,period="daily",type="log")
plot(TWTRD, main="TWTR daily log returns")#it says the daily log is not the correct code

mean(TWTRD)
[1] -5.116839e-05
sd(TWTRD)
[1] 0.03357331
quantile(TWTRD,0.05)#the 95% confidence level quantile for Twtr is -4.62%
5%
-0.04616212
##### 1B) Plot a histogram and mark the quantile value that corresponds to 95% confidence level. A mark can be added to a plot by using the function abline().
hist(TWTRD,breaks=50)
abline(v =-0.04619, untf = FALSE)

#we now konw the mean for daily log return is very close to 0, and standard deviation is 0.0336, VaR=-1.645*sigma+mean=-0.055. this result is not strictly match the quantile value but very close since it is not a strict normal distribution.
Given the above, we can calculate a VaR value for a given investment and a time horizon.
##### 1C) Assume $1000 investment in the stock, calculate the 95% VaR for 3 days鈥? time horizon. Explain the meaning of VaR in practical terms.
From the quantile result, the VaR value for daily log return is -4.62%, this means the investor has less than 5% probability of losing 1000x4.62%=$46.2 the next day. For 3 days’ horizon,we need to scale the result with square-root rule. the new VaR=-46.2 x 3^(0.5)=80.02.This means the investor has less than 5% probability of losing more than $80.02 in the coming 3 days. ##### 1D) How does the VaR calculated in 1C changes if we assumed simple returns instead of the log returns.
getSymbols("TWTR",src="yahoo",from="2015-01-01") ##data starts from 2015
[1] "TWTR"
TWTRD1 = periodReturn(TWTR,period="daily")
quantile(TWTRD1,0.05)
5%
-0.04513803
VaR95=exp(-0.04619)-1
VaR95
[1] -0.04513948
in actual historical data the quantile for 95% confidence interval is -4.513% ,but if we use the exp calculation form the result is -4.513% as well.
when we use the simple daily return to replace the daily log return, the new VaR we get is 4.51%, this result is very close to the previous VaR.
Calculations so far have been on the histogram of log returns. We can instead, looking at the histogram, assume a normal distribution of the log returns. The normal return assumption will have a mean and standard deviation equal to those calculated from the histogram, and properly scaled by the horizon time. Note that the mean is linearly scaled with time and volatility with square-root of time.
##### 1E) Repeat the calculation in 1D assuming instead a normal distribution. How the two results compare and why so?
mean(TWTRD1)
[1] 0.0004738883
sd(TWTRD1)
[1] 0.03324971
#assuming normally distributed, we get the mean=0.000474 and standard deviation=0.0332, according to VaR=(z value)*sigma+mean
#VaR=-1.645*0.0332+0.0000474=-5.414%
#the result has a little diffrence with the actual VaR ,but very close, since the actual distribution is not a strict normal distribution
VaR95=exp(-0.04619)-1
VaR95 #in actual historical data the quantile for 95% confidence interval is -4.513% ,but if we use the exp calculation form the result is -4.513 as well.
[1] -0.04513948
##### 1F) Write down the mathematical representation corresponding to the VaR calculation in 1E. Explain what each variable in the equation represents, and provide the corresponding numerical value. 
Task 2: VaR Calculations: Multiple Equity Assets
Consider the times series of the three stocks DIS, TWTR, and NFLX for the time-period from Jan 1,2015 to present. Assume an investment of $100,000 equally distributed among all three stocks.
To calculate the portfolio VaR we will follow the methodolgy described by the variance-covariance. First the covariance matrix needs to be computed. We then calculate the variance or volatility of the portolio as expressed in the varaince-covariance method taking into the weights associated with each asset in the portfolio. Fiinally we compute the mean or expected return of the portfolio taking also into account the weights. Given the expected return and volatility we should be able to compute the VaR of the portfolio. The assumption is we have a normal distribution of log returns.
First we calculate the overall portfolio VaR.
##### 2A) Calculate the portfolio 99% VaR for 1 day, and 3 days. Specify whether using log-returns or simple returns.
# Covariance & Correlation
symbols=c('DIS','TWTR','NFLX')
#getSymbols(symbols,src='yahoo',from="2015-01-01")
getSymbols(symbols,src='yahoo',from="2015-01-01")
[1] "DIS" "TWTR" "NFLX"
disRd= as.numeric(periodReturn(DIS$DIS.Adjusted,period="daily",type="log"))
twtrRd= as.numeric(periodReturn(TWTR$TWTR.Adjusted,period="daily",type="log"))
nflxRd= as.numeric(periodReturn(NFLX$NFLX.Adjusted,period="daily",type="log"))
M <- cbind(disRd,twtrRd,nflxRd) # create a matrix
cov(M)
disRd twtrRd nflxRd
disRd 1.459283e-04 8.730401e-05 9.318157e-05
twtrRd 8.730401e-05 1.128636e-03 2.433119e-04
nflxRd 9.318157e-05 2.433119e-04 7.334634e-04
cor(M, method="pearson")
disRd twtrRd nflxRd
disRd 1.0000000 0.2151233 0.2848203
twtrRd 0.2151233 1.0000000 0.2674220
nflxRd 0.2848203 0.2674220 1.0000000
standardofportfolip=0.537# this comes from cor(M) times vector (1/3,1/3,1/3) and the vector's trancope.
mean(disRd)
[1] 0.0002235978
mean(twtrRd)
[1] -9.407216e-05
mean(nflxRd)
[1] 0.001867232
the standard deviation of portfolip=$5343.87 ,this comes from cor(M) times vector (100000,100000,100000) and the vector’s trancope.
the mean for the portfolio is nearly 1/3(0+0+0)=0 The VaR for 1 day is sd(portfolio)x(z value)+mean=-2.3265343.87=$-12430
the VaR for 3 days is -12430x 3^(0.5)=$-21529
We then describe the mathetical formulation useds in the code to perform the calculations
##### 2B) Write down the mathematical representations used in the code to calculate the VaR. Label properly each variable, what it represents, and the numerical value corresponding to in the code. 
We now calculated individual VaR corresponding to each asst in the portfolio
##### 2C) Calculate the three-individual asset 99% VaR for 1 day.
quantile(disRd,0.01)
1%
-0.03774623
quantile(twtrRd,0.01)
1%
-0.1150925
quantile(nflxRd,0.01)
1%
-0.07067303
# -0.03774623 x100,000=$-3774 , this is VaR for individual Disney, #-0.1150925 x100,000=-$11509 , this is VaR for individual TWTR, #-0.07067303x100,000=-&7067 , this is VaR for individual NFLX。 Finally we compare the overall VaR to the individual VaR calculations
##### 2D) Compare the overall portfolio VaR to the sum of the individual asset VaR for the 1 day case. Share observations. Theoretically, the portfolio consists of multiple assets could reduce the risk ,so the VaR for the combined Portfolio should have a lower absolute VaR Value. The result from my calculation shows that the combined portfolio has a VaR of $-12430 while the individual assets has a VaR of $-22350 in total, this matches the theory. INvesting in a combines portfolio can actually and significantly reduce the risk of losing money. *http://computationalfinance.lsi.upc.edu
LS0tDQp0aXRsZTogIkZJTkM2MjEgV2ludGVyIDIwMTgtMTkgTGFiIFdvcmtzaGVldCAwNyINCmF1dGhvcjogIllvdXIgTmFtZSBIZXJlIg0KZGF0ZTogIkFkZCBEYXRlIEhlcmUiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0Kc3VidGl0bGU6IFZhciBDYWxjdWxhdGlvbnMgKGZpbmM2MjEtbGFiMDcpDQotLS0NCg0KIyMjIEFib3V0DQoNClRoaXMgd29ya3NoZWV0IGxvb2tzIGF0IFZhUiBjYWxjdWxhdGlvbnMgZm9yIHRoZSB0d28gY2FzZXMgb2Ygc2luZ2xlIGFuZCBtdWx0aXBsZSBlcXVpdHkgYXNzZXQuIFRoaXMgaXMgdGhlIGxhc3QgbGFiIHdvcmtzaGVldCwgb3RoZXIgdGhhbiB0aGUgZXh0cmEgY3JlZGl0IGFzc2lnbm1lbnQuDQoNCiMjIyBTZXR1cA0KDQpSZW1lbWJlciB0byBhbHdheXMgc2V0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uLiBHbyB0byAnU2Vzc2lvbicsIHNjcm9sbCBkb3duIHRvICdTZXQgV29ya2luZyBEaXJlY3RvcnknLCBhbmQgY2xpY2sgJ1RvIFNvdXJjZSBGaWxlIExvY2F0aW9uJy4gUmVhZCBjYXJlZnVsbHkgdGhlIGJlbG93IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBjb21wbGV0ZSB0aGUgdGFza3MgYW5kIGFuc3dlciBhbnkgcXVlc3Rpb25zLiAgU3VibWl0IHlvdXIgd29yayB0byBSUHVicyBhcyBkZXRhaWxlZCBpbiBwcmV2aW91cyBub3Rlcy4gDQoNCiMjIyBOb3RlDQoNCkFsd2F5cyByZWFkIGNhcmVmdWxseSB0aGUgaW5zdHJ1Y3Rpb25zIG9uIFNha2FpLiAgRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAodmlzaWJsZSBpbiBwcmV2aWV3KSBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLg0KDQpFeGVjdXRlIGFsbCBjb2RlIGNodW5rcywgcHJldmlldywgcHVibGlzaCwgYW5kIHN1Ym1pdCBsaW5rIG9uIFNha2FpIGZvbGx3b2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24uIE1ha2Ugc3VyZSB0byBhZGQgY29tbWVudHMgdG8geW91ciBjb2RlIHdoZXJlIGFwcHJvcHJpYXRlLiBVc2Ugb3duIGxhbmd1YWdlIQ0KDQotLS0tLS0tLS0tLS0tLQ0KDQojIyMgVGFzayAxOiBWYVIgQ2FsY3VsYXRpb25zOiBTaW5nbGUgRXF1aXR5IEFzc2V0DQoNCg0KYGBge3J9DQojSW5zdGFsbCBwYWNrYWdlIHF1YW50bW9kIA0KaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiKQ0KbGlicmFyeSgicXVhbnRtb2QiKQ0KYGBgDQoNCkNvbnNpZGVyIHRoZSB0aW1lIHNlcmllcyBvZiBhIHN0b2NrIG9mIHlvdXIgY2hvaWNlIChvdGhlciB0aGFuIEFBUEwgYW5kIHlvdXIgY29sbGVhZ3VlISkgYW5kIGZvciB0aGUgdGltZS1wZXJpb2QgZnJvbSBKYW4gMSwgMjAxNSB0byBwcmVzZW50LiANCg0KV2Ugd2lsbCBmaXJzdCBnZW5lcmF0ZSB0aGUgaGlzdG9yaWNhbCB0aW1lIHNlcmllcyBvZiBkYWlseSBsb2cgcmV0dXJucywgYW5kIGNhbGN1bGF0ZSB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSB0aW1lIHNlcmllcy4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxQSkgQ2FsY3VsYXRlIHRoZSBoaXN0b3JpY2FsIGRhaWx5IGxvZyByZXR1cm5zLCBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24NCjwvc3Bhbj4NCg0KR2l2ZW4gYSB0aW1lIHNlcmllcyB3ZSBjYW4gZ2VuZXJhdGUgYSBoaXN0b2dyYW0gYW5kIG1hcmsgdGhlIHF1YW50aWxlIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIDk1JSBjb25maWRlbmNlIGxldmVsLiBUaGUgcXVhbnRpbGUgdmFsdWUgaW4gdGhpcyBjYXNlIGlzIHRoZSBjcml0aWNhbCB2YWx1ZSBmb3Igd2hpY2ggOTUlIG9mIHRoZSBkYXRhIGlzIG9uIHRoZSByaWdodCAoaGlnaGVyKSBvZiB0aGUgY3JpdGljYWwgdmFsdWUgYXMgcmVwcmVzZW50ZWQgYnkgdGhlIGhpc3RvZ3JhbS4gVGhlIHJlbWFpbmluZyA1JSB3aWxsIGJlIG9uIHRoZSBsZWZ0LiBUbyBmaW5kIHRoZSBxdWFudGlsZSB2YWx1ZSB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgZnVuY3Rpb24gYHF1YW50aWxlKClgIHdpdGggdGhlIHByb3BlciBhcmd1bWVudHMuIEZvciBleGFtcGxlIGBxdWFudGlsZSh4dHMscHJvYnM9MC4wMSlgICBhcHBsaWVzIHRvIGEgdGltZSBzZXJpZXMgYHh0c2AgYW5kIHJldHVybiB0aGUgY3JpdGljYWwgdmFsdWUgY29ycmVzcG9uZG5nIHRvIGA5OSVgIGNvbmZpZGVuY2UgbGV2ZWwuDQpgYGB7cn0NCmdldFN5bWJvbHMoIlRXVFIiLHNyYz0ieWFob28iLGZyb209IjIwMTUtMDEtMDEiKSAjI2RhdGEgc3RhcnRzIGZyb20gMjAxNQ0KVFdUUkQgPSBwZXJpb2RSZXR1cm4oVFdUUixwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKQ0KcGxvdChUV1RSRCwgbWFpbj0iVFdUUiBkYWlseSBsb2cgcmV0dXJucyIpI2l0IHNheXMgdGhlIGRhaWx5IGxvZyBpcyBub3QgdGhlIGNvcnJlY3QgY29kZQ0KbWVhbihUV1RSRCkNCnNkKFRXVFJEKQ0KcXVhbnRpbGUoVFdUUkQsMC4wNSkjdGhlIDk1JSBjb25maWRlbmNlIGxldmVsIHF1YW50aWxlIGZvciBUd3RyIGlzIC00LjYyJQ0KDQoNCmBgYA0KDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUIpIFBsb3QgYSBoaXN0b2dyYW0gYW5kIG1hcmsgdGhlIHF1YW50aWxlIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gOTUlIGNvbmZpZGVuY2UgbGV2ZWwuIEEgbWFyayBjYW4gYmUgYWRkZWQgdG8gYSBwbG90IGJ5IHVzaW5nIHRoZSBmdW5jdGlvbiBgYWJsaW5lKClgLg0KPC9zcGFuPg0KYGBge3J9DQpoaXN0KFRXVFJELGJyZWFrcz01MCkNCmFibGluZSh2ID0tMC4wNDYxOSwgdW50ZiA9IEZBTFNFKQ0KI3dlIG5vdyBrb253IHRoZSBtZWFuIGZvciBkYWlseSBsb2cgcmV0dXJuIGlzIHZlcnkgY2xvc2UgdG8gMCwgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAwLjAzMzYsIFZhUj0tMS42NDUqc2lnbWErbWVhbj0tMC4wNTUuIHRoaXMgcmVzdWx0IGlzIG5vdCBzdHJpY3RseSBtYXRjaCB0aGUgcXVhbnRpbGUgdmFsdWUgYnV0IHZlcnkgY2xvc2Ugc2luY2UgaXQgaXMgbm90IGEgc3RyaWN0IG5vcm1hbCBkaXN0cmlidXRpb24uDQpgYGANCg0KR2l2ZW4gdGhlIGFib3ZlLCB3ZSBjYW4gY2FsY3VsYXRlIGEgVmFSIHZhbHVlIGZvciBhIGdpdmVuIGludmVzdG1lbnQgYW5kIGEgdGltZSBob3Jpem9uLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFDKSBBc3N1bWUgJDEwMDAgaW52ZXN0bWVudCBpbiB0aGUgc3RvY2ssIGNhbGN1bGF0ZSB0aGUgOTUlIFZhUiBmb3IgMyBkYXlz4oA/IHRpbWUgaG9yaXpvbi4gIEV4cGxhaW4gdGhlIG1lYW5pbmcgb2YgVmFSIGluIHByYWN0aWNhbCB0ZXJtcy4NCjwvc3Bhbj4NCg0KRnJvbSB0aGUgcXVhbnRpbGUgcmVzdWx0LCB0aGUgVmFSIHZhbHVlIGZvciBkYWlseSBsb2cgcmV0dXJuIGlzIC00LjYyJSwgdGhpcyBtZWFucyB0aGUgaW52ZXN0b3IgaGFzIGxlc3MgdGhhbiA1JSBwcm9iYWJpbGl0eSBvZiBsb3NpbmcgMTAwMHg0LjYyJT0kNDYuMiAgdGhlIG5leHQgZGF5LiBGb3IgMyBkYXlzJyBob3Jpem9uLHdlIG5lZWQgdG8gc2NhbGUgdGhlIHJlc3VsdCB3aXRoIHNxdWFyZS1yb290IHJ1bGUuIHRoZSBuZXcgVmFSPS00Ni4yIHggM14oMC41KT04MC4wMi5UaGlzIG1lYW5zIHRoZSBpbnZlc3RvciBoYXMgbGVzcyB0aGFuIDUlIHByb2JhYmlsaXR5IG9mIGxvc2luZyBtb3JlIHRoYW4gJDgwLjAyIGluIHRoZSBjb21pbmcgMyBkYXlzLiANCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUQpIEhvdyBkb2VzIHRoZSBWYVIgY2FsY3VsYXRlZCBpbiAxQyBjaGFuZ2VzIGlmIHdlIGFzc3VtZWQgc2ltcGxlIHJldHVybnMgaW5zdGVhZCBvZiB0aGUgbG9nIHJldHVybnMuDQo8L3NwYW4+DQpgYGB7cn0NCmdldFN5bWJvbHMoIlRXVFIiLHNyYz0ieWFob28iLGZyb209IjIwMTUtMDEtMDEiKSAjI2RhdGEgc3RhcnRzIGZyb20gMjAxNQ0KVFdUUkQxID0gcGVyaW9kUmV0dXJuKFRXVFIscGVyaW9kPSJkYWlseSIpDQpxdWFudGlsZShUV1RSRDEsMC4wNSkNClZhUjk1PWV4cCgtMC4wNDYxOSktMQ0KVmFSOTUgI2luIGFjdHVhbCBoaXN0b3JpY2FsIGRhdGEgdGhlIHF1YW50aWxlIGZvciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyAtNC41MTMlICxidXQgaWYgd2UgdXNlIHRoZSBleHAgY2FsY3VsYXRpb24gZm9ybSB0aGUgcmVzdWx0IGlzIC00LjUxMyUgYXMgd2VsbC4NCmBgYA0KaW4gYWN0dWFsIGhpc3RvcmljYWwgZGF0YSB0aGUgcXVhbnRpbGUgZm9yIDk1JSBjb25maWRlbmNlIGludGVydmFsIGlzIC00LjUxMyUgLGJ1dCBpZiB3ZSB1c2UgdGhlIGV4cCBjYWxjdWxhdGlvbiBmb3JtIHRoZSByZXN1bHQgaXMgLTQuNTEzJSBhcyB3ZWxsLg0KDQp3aGVuIHdlIHVzZSB0aGUgc2ltcGxlIGRhaWx5IHJldHVybiB0byByZXBsYWNlIHRoZSBkYWlseSBsb2cgcmV0dXJuLCB0aGUgbmV3IFZhUiB3ZSBnZXQgaXMgNC41MSUsIHRoaXMgcmVzdWx0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIHByZXZpb3VzIFZhUi4NCg0KQ2FsY3VsYXRpb25zIHNvIGZhciBoYXZlIGJlZW4gb24gdGhlIGhpc3RvZ3JhbSBvZiBsb2cgcmV0dXJucy4gV2UgY2FuIGluc3RlYWQsIGxvb2tpbmcgYXQgdGhlIGhpc3RvZ3JhbSwgYXNzdW1lIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbG9nIHJldHVybnMuIFRoZSBub3JtYWwgcmV0dXJuIGFzc3VtcHRpb24gd2lsbCBoYXZlIGEgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGVxdWFsIHRvIHRob3NlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaGlzdG9ncmFtLCBhbmQgcHJvcGVybHkgc2NhbGVkIGJ5IHRoZSBob3Jpem9uIHRpbWUuICBOb3RlIHRoYXQgdGhlIG1lYW4gaXMgbGluZWFybHkgc2NhbGVkIHdpdGggdGltZSBhbmQgdm9sYXRpbGl0eSB3aXRoIHNxdWFyZS1yb290IG9mIHRpbWUuDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUUpIFJlcGVhdCB0aGUgY2FsY3VsYXRpb24gaW4gMUQgYXNzdW1pbmcgaW5zdGVhZCBhIG5vcm1hbCBkaXN0cmlidXRpb24uIEhvdyB0aGUgdHdvIHJlc3VsdHMgY29tcGFyZSBhbmQgd2h5IHNvPw0KPC9zcGFuPg0KYGBge3J9DQptZWFuKFRXVFJEMSkNCnNkKFRXVFJEMSkNCiNhc3N1bWluZyBub3JtYWxseSBkaXN0cmlidXRlZCwgd2UgZ2V0IHRoZSBtZWFuPTAuMDAwNDc0IGFuZCBzdGFuZGFyZCBkZXZpYXRpb249MC4wMzMyLCBhY2NvcmRpbmcgdG8gVmFSPSh6IHZhbHVlKSpzaWdtYSttZWFuIA0KI1ZhUj0tMS42NDUqMC4wMzMyKzAuMDAwMDQ3ND0tNS40MTQlDQojdGhlIHJlc3VsdCBoYXMgYSBsaXR0bGUgZGlmZnJlbmNlIHdpdGggdGhlIGFjdHVhbCBWYVIgLGJ1dCB2ZXJ5IGNsb3NlLCBzaW5jZSB0aGUgYWN0dWFsIGRpc3RyaWJ1dGlvbiBpcyBub3QgYSBzdHJpY3Qgbm9ybWFsIGRpc3RyaWJ1dGlvbg0KVmFSOTU9ZXhwKC0wLjA0NjE5KS0xDQpWYVI5NSAjaW4gYWN0dWFsIGhpc3RvcmljYWwgZGF0YSB0aGUgcXVhbnRpbGUgZm9yIDk1JSBjb25maWRlbmNlIGludGVydmFsIGlzIC00LjUxMyUgLGJ1dCBpZiB3ZSB1c2UgdGhlIGV4cCBjYWxjdWxhdGlvbiBmb3JtIHRoZSByZXN1bHQgaXMgLTQuNTEzIGFzIHdlbGwuDQpgYGANCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFGKSBXcml0ZSBkb3duIHRoZSBtYXRoZW1hdGljYWwgcmVwcmVzZW50YXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgVmFSIGNhbGN1bGF0aW9uIGluIDFFLiBFeHBsYWluIHdoYXQgZWFjaCB2YXJpYWJsZSBpbiB0aGUgZXF1YXRpb24gcmVwcmVzZW50cywgYW5kIHByb3ZpZGUgdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpY2FsIHZhbHVlLg0KPC9zcGFuPg0KIVtDYXB0aW9uIEhlcmVdKGhvbWV3b3JrNy5qcGcpDQoNCg0KIyMjIFRhc2sgMjogVmFSIENhbGN1bGF0aW9uczogTXVsdGlwbGUgRXF1aXR5IEFzc2V0cw0KDQpDb25zaWRlciB0aGUgdGltZXMgc2VyaWVzIG9mIHRoZSB0aHJlZSBzdG9ja3MgRElTLCBUV1RSLCBhbmQgTkZMWCBmb3IgdGhlIHRpbWUtcGVyaW9kIGZyb20gSmFuIDEsMjAxNSB0byBwcmVzZW50LiBBc3N1bWUgYW4gaW52ZXN0bWVudCBvZiAkMTAwLDAwMCBlcXVhbGx5IGRpc3RyaWJ1dGVkIGFtb25nIGFsbCB0aHJlZSBzdG9ja3MuIA0KDQpUbyBjYWxjdWxhdGUgdGhlIHBvcnRmb2xpbyBWYVIgd2Ugd2lsbCBmb2xsb3cgdGhlIG1ldGhvZG9sZ3kgZGVzY3JpYmVkIGJ5IHRoZSB2YXJpYW5jZS1jb3ZhcmlhbmNlLiBGaXJzdCB0aGUgY292YXJpYW5jZSBtYXRyaXggbmVlZHMgdG8gYmUgY29tcHV0ZWQuICBXZSB0aGVuIGNhbGN1bGF0ZSB0aGUgdmFyaWFuY2Ugb3Igdm9sYXRpbGl0eSBvZiB0aGUgcG9ydG9saW8gYXMgZXhwcmVzc2VkIGluIHRoZSB2YXJhaW5jZS1jb3ZhcmlhbmNlIG1ldGhvZCB0YWtpbmcgaW50byB0aGUgd2VpZ2h0cyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhc3NldCBpbiB0aGUgcG9ydGZvbGlvLiAgRmlpbmFsbHkgd2UgY29tcHV0ZSB0aGUgbWVhbiBvciBleHBlY3RlZCByZXR1cm4gb2YgdGhlIHBvcnRmb2xpbyB0YWtpbmcgYWxzbyBpbnRvIGFjY291bnQgdGhlIHdlaWdodHMuICBHaXZlbiB0aGUgZXhwZWN0ZWQgcmV0dXJuIGFuZCB2b2xhdGlsaXR5IHdlIHNob3VsZCBiZSBhYmxlIHRvIGNvbXB1dGUgdGhlIFZhUiBvZiB0aGUgcG9ydGZvbGlvLiAgVGhlIGFzc3VtcHRpb24gaXMgd2UgaGF2ZSBhIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgbG9nIHJldHVybnMuDQoNCkZpcnN0IHdlIGNhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBwb3J0Zm9saW8gVmFSLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJBKSBDYWxjdWxhdGUgdGhlIHBvcnRmb2xpbyA5OSUgVmFSIGZvciAxIGRheSwgYW5kIDMgZGF5cy4gU3BlY2lmeSB3aGV0aGVyIHVzaW5nIGxvZy1yZXR1cm5zIG9yIHNpbXBsZSByZXR1cm5zLiAgICAgIA0KPC9zcGFuPg0KYGBge3J9DQojIENvdmFyaWFuY2UgJiBDb3JyZWxhdGlvbg0Kc3ltYm9scz1jKCdESVMnLCdUV1RSJywnTkZMWCcpDQojZ2V0U3ltYm9scyhzeW1ib2xzLHNyYz0neWFob28nLGZyb209IjIwMTUtMDEtMDEiKQ0KZ2V0U3ltYm9scyhzeW1ib2xzLHNyYz0neWFob28nLGZyb209IjIwMTUtMDEtMDEiKSANCmRpc1JkPSBhcy5udW1lcmljKHBlcmlvZFJldHVybihESVMkRElTLkFkanVzdGVkLHBlcmlvZD0iZGFpbHkiLHR5cGU9ImxvZyIpKQ0KdHd0clJkPSBhcy5udW1lcmljKHBlcmlvZFJldHVybihUV1RSJFRXVFIuQWRqdXN0ZWQscGVyaW9kPSJkYWlseSIsdHlwZT0ibG9nIikpDQpuZmx4UmQ9IGFzLm51bWVyaWMocGVyaW9kUmV0dXJuKE5GTFgkTkZMWC5BZGp1c3RlZCxwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKSkNCg0KTSA8LSBjYmluZChkaXNSZCx0d3RyUmQsbmZseFJkKSAjIGNyZWF0ZSBhIG1hdHJpeCANCmNvdihNKQ0KY29yKE0sIG1ldGhvZD0icGVhcnNvbiIpDQojdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBwb3J0Zm9saXA9JDUzNDMuODcgLHRoaXMgY29tZXMgZnJvbSBjb3IoTSkgdGltZXMgdmVjdG9yICgxMDAwMDAsMTAwMDAwLDEwMDAwMCkgYW5kIHRoZSB2ZWN0b3IncyB0cmFuY29wZS4NCm1lYW4oZGlzUmQpDQptZWFuKHR3dHJSZCkNCm1lYW4obmZseFJkKQ0KI3RoZSBtZWFuIGZvciB0aGUgcG9ydGZvbGlvIGlzIG5lYXJseSAxLzMqKDArMCswKT0wDQojVGhlIFZhUiBmb3IgMSBkYXkgaXMgIHNkKHBvcnRmb2xpbykqKHogdmFsdWUpK21lYW49LTIuMzI2KjUzNDMuODc9JC0xMjQzMA0KIyB0aGUgVmFSIGZvciAzIGRheXMgaXMgLTEyNDMwKjNeKDAuNSk9JC0yMTUyOQ0KDQoNCmBgYA0KdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBwb3J0Zm9saXA9JDUzNDMuODcgLHRoaXMgY29tZXMgZnJvbSAgY29yKE0pIHRpbWVzIHZlY3RvciAoMTAwMDAwLDEwMDAwMCwxMDAwMDApIGFuZCB0aGUgdmVjdG9yJ3MgdHJhbmNvcGUuDQoNCnRoZSBtZWFuIGZvciB0aGUgcG9ydGZvbGlvIGlzIG5lYXJseSAxLzMqKDArMCswKT0wDQpUaGUgVmFSIGZvciAxIGRheSBpcyAgc2QocG9ydGZvbGlvKXgoeiB2YWx1ZSkrbWVhbj0tMi4zMjYqNTM0My44Nz0kLTEyNDMwDQoNCnRoZSBWYVIgZm9yIDMgZGF5cyBpcyAtMTI0MzB4IDNeKDAuNSk9JC0yMTUyOQ0KDQpXZSB0aGVuIGRlc2NyaWJlIHRoZSBtYXRoZXRpY2FsIGZvcm11bGF0aW9uIHVzZWRzIGluIHRoZSBjb2RlIHRvIHBlcmZvcm0gdGhlIGNhbGN1bGF0aW9ucw0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJCKSBXcml0ZSBkb3duIHRoZSBtYXRoZW1hdGljYWwgcmVwcmVzZW50YXRpb25zIHVzZWQgaW4gdGhlIGNvZGUgdG8gY2FsY3VsYXRlIHRoZSBWYVIuICBMYWJlbCBwcm9wZXJseSBlYWNoIHZhcmlhYmxlLCB3aGF0IGl0IHJlcHJlc2VudHMsIGFuZCB0aGUgbnVtZXJpY2FsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gaW4gdGhlIGNvZGUuDQo8L3NwYW4+DQohW0NhcHRpb24gSGVyZV0oaG9tZXdvcms3Mi5qcGcpDQoNCldlIG5vdyBjYWxjdWxhdGVkIGluZGl2aWR1YWwgVmFSIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBhc3N0IGluIHRoZSBwb3J0Zm9saW8NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQykgQ2FsY3VsYXRlIHRoZSB0aHJlZS1pbmRpdmlkdWFsIGFzc2V0IDk5JSBWYVIgZm9yIDEgZGF5LiAgDQo8L3NwYW4+DQpgYGB7cn0NCnF1YW50aWxlKGRpc1JkLDAuMDEpICAgIyAtMC4wMzc3NDYyMyAqMTAwLDAwMD0kLTM3NzQgICAgdGhpcyBpcyBWYVIgZm9yIGluZGl2aWR1YWwgRGlzbmV5DQpxdWFudGlsZSh0d3RyUmQsMC4wMSkgICMtMC4xMTUwOTI1ICoxMDAsMDAwPS0kMTE1MDkgICB0aGlzIGlzIFZhUiBmb3IgaW5kaXZpZHVhbCBUV1RSDQpxdWFudGlsZShuZmx4UmQsMC4wMSkgICMtMC4wNzA2NzMwMyoxMDAsMDAwPS0mNzA2NyAgdGhpcyBpcyBWYVIgZm9yIGluZGl2aWR1YWwgTkZMWA0KYGBgDQogIyAtMC4wMzc3NDYyMyB4MTAwLDAwMD0kLTM3NzQgIKOsICB0aGlzIGlzIFZhUiBmb3IgaW5kaXZpZHVhbCBEaXNuZXmjrA0KICMtMC4xMTUwOTI1IHgxMDAsMDAwPS0kMTE1MDkgIKOsIHRoaXMgaXMgVmFSIGZvciBpbmRpdmlkdWFsIFRXVFKjrA0KICAjLTAuMDcwNjczMDN4MTAwLDAwMD0tJjcwNjcgo6wgdGhpcyBpcyBWYVIgZm9yIGluZGl2aWR1YWwgTkZMWKGjDQpGaW5hbGx5IHdlIGNvbXBhcmUgdGhlIG92ZXJhbGwgVmFSIHRvIHRoZSBpbmRpdmlkdWFsIFZhUiBjYWxjdWxhdGlvbnMNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyRCkgQ29tcGFyZSB0aGUgb3ZlcmFsbCBwb3J0Zm9saW8gVmFSIHRvIHRoZSBzdW0gb2YgdGhlIGluZGl2aWR1YWwgYXNzZXQgVmFSIGZvciB0aGUgMSBkYXkgY2FzZS4gIFNoYXJlIG9ic2VydmF0aW9ucy4NCjwvc3Bhbj4NClRoZW9yZXRpY2FsbHksIHRoZSBwb3J0Zm9saW8gY29uc2lzdHMgb2YgbXVsdGlwbGUgYXNzZXRzIGNvdWxkIHJlZHVjZSB0aGUgcmlzayAsc28gdGhlIFZhUiBmb3IgdGhlIGNvbWJpbmVkIFBvcnRmb2xpbyBzaG91bGQgaGF2ZSBhIGxvd2VyIGFic29sdXRlIFZhUiBWYWx1ZS4gVGhlIHJlc3VsdCBmcm9tIG15IGNhbGN1bGF0aW9uIHNob3dzIHRoYXQgdGhlIGNvbWJpbmVkIHBvcnRmb2xpbyBoYXMgYSBWYVIgb2YgJC0xMjQzMCB3aGlsZSB0aGUgaW5kaXZpZHVhbCBhc3NldHMgaGFzIGEgVmFSIG9mICQtMjIzNTAgaW4gdG90YWwsIHRoaXMgbWF0Y2hlcyB0aGUgdGhlb3J5LiBJTnZlc3RpbmcgaW4gYSBjb21iaW5lcyBwb3J0Zm9saW8gY2FuIGFjdHVhbGx5IGFuZCBzaWduaWZpY2FudGx5IHJlZHVjZSB0aGUgcmlzayBvZiBsb3NpbmcgbW9uZXkuDQoqW2h0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSBdKGh0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSkNCg==