About
In this worksheet we look at different distribution functions, sampling methods, and probability calculations. Next we consider a calculation of a Europen option using Monte Carlo simulation, and compare results to calculation using Black-Scholes.
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: Distribution, Sampling & Probability
#Install package quantmod
if(!require("quantmod",quietly = TRUE))
install.packages("quantmod",dependencies = TRUE, repos = "https://cloud.r-project.org")
Attaching package: ‘zoo’
The following objects are masked from ‘package:base’:
as.Date, as.Date.numeric
Version 0.4-0 included new data defaults. See ?getSymbols.
Learn from a quantmod author: https://www.datacamp.com/courses/importing-and-managing-financial-data-in-r
Consider the free cash flow example with an estimated range set by a minimum of -$25M and maximum $275M. We start by generating a sample random set. Following is an example to generate a random set of 10 data points from a uniform distribution with probability \(\frac{1}{b-a}\), a minimum of a, and a maximum of b.
ud = runif(10, min=5, max=15) # runif is in reference to uniform distribution
# Other R functions needed for this task are hist(), mean(), sd(), punif(), runif(), pnorm(), and rnorm(). Check the Help command in R for more details about these functions.
##### 1A) Assuming a uniform probability distribution, generate a sample of 100 random observations (or deviates) representing the cash flows
ud = runif(100, min=-25, max=275)
Next we plot a histogram to describe the generated sample data, and calculate the mean and standard deviation of the sample using the proper R-functions
##### 1B) Plot a histogram and calculate the mean and standard deviation of your sample. Compare the mean and standard deviation of the sample to the theoretical values obtained using the proper formulas.
hist(ud, breaks=20)

mean(ud)
[1] 127.1072
sd(ud)
[1] 86.75506
Calculating manually
mean = \(\frac{a + b}{2}\), = \(\frac{-25 + 275}{2}\) = 125
Variance = \(\frac{(b - a)^2}{12}\)
\(\frac{(275 - (-25))^2}{12}\) = 7500
Standard deviation = \(\sqrt{7500}\) = 86.6025
The sample mean of 127.10 is far from the theoretical mean which is a result of the small sample size. The standard deviation of 86.75 is much closer to the theoretical value.
However, the plots are not “uniformed” at all. The reason for that being that the sample is not large enough.
##### 1C) Repeat 1A & 1B above by increasing the sample size to 1000. Share your insights.
ud1 = runif(1000, min=-25, max=275)
hist(ud1, breaks=20)

mean(ud1)
[1] 124.9719
sd(ud1)
[1] 86.87762
Since the sample size is larger, the mean and SD are much closer to the theoretical values than the smaller sample
Given the characteristics of a probability distribution we should be able to compute various probability scenarios using the proper functions in R.
##### 1D) Calculate the probability that the free cash flow is negative
# Here we are calculating the probability when the free cash flow < 0
punif(0, min=-25, max=275, lower.tail=TRUE)
[1] 0.08333333
We will now repeat the above exercises 1A, 1B, 1C using instead a normal distribution.
##### 1E) Repeat steps A-C for the case of a portfolio daily returns with normal probability distribution,a mean=1.2% and a standard deviation= 3.7%
# Sample sizee here is 100
nd <- rnorm(100, mean=1.2,sd=3.7)
hist(nd,breaks=20)

mean(nd)
[1] 1.101812
sd(nd)
[1] 3.857621
# Sample sizee here is 1000
nd1 <- rnorm(1000, mean=1.2,sd=3.7)
hist(nd1,breaks=20)

mean(nd1)
[1] 1.361276
sd(nd1)
[1] 3.447729
Same applies for the normal distribution as with the uniform distribution, the sample mean and SD collected are closer to the theoretical values as the sample size increases from 100 to 1000.
Similarly we should be able to compute various probability senarios with our obtained normal distribution.
##### 1F) Calculate the probability that returns will be negative using the values for mean and standard deviation as in 1E
pnorm(0, mean=1.2, sd=3.7, lower.tail=TRUE)
[1] 0.3728463
##### 1G) Repeat the calculation in 1F using instead the standard Z-value. Share insights.
# Here we are using the standard z-value to calculate the probability that returns will be negative
z=(0-1.2)/3.7
pnorm(z,0,1)
[1] 0.3728463
The probability of normal distribution is same with the probability of standard normal distribution.
Task 2: MC Simulation & European Option Pricing
Follow the Algorithm 5.2 example on p 167 (*) to calculate the price of a European option using a MC simulation. Note that the code in the book example is missing one detail and a correction. Those are left for your investigation.
##### 2A) Identify and explain the nature of the missing detail and the correction needed.
The missing detail: The stock price needs to be reset to the current price at the start of each simulation. If we don’t set old stock price to new stock price, we will not be able to get stabilized results.
The correction to the missing detail is the function rnorm() requires an additional input parameter to function properly E = rnorm(1, 0, 1). In the book, it’s missing the first “1” which should be the place for n. The code won’t work without the first 1. Since the rnorm function requires inputs as rnorm(n, mean = 0, sd = 1).
Given the MC simulation we should be able to price a European option. Note the introduction of user defined function in the book. Below is an example of a user defined function and usage. The function returns the squared value.
myfunction <- function(x=2){
y=x^2
return(y)}
myfunction(x=5)
EulerMC = function(Type, S, K, T , r , sigma, n , m ){
S0=S
dt= T/n
sum = 0;
for(i in 1:m){
S=S0
for(j in 1:n){
E = rnorm(1, 0,1);
S=S+r*S*dt+sigma*S*sqrt(dt)*E;}
if(Type == "c"){payoff = max(S-K,0)}
else if(Type == "p"){payoff = max(K-S,0)}
else{payoff = max(S-K,0)}
sum=sum + payoff}
OptionValue = (sum/m)*exp(-r*T);
return(OptionValue)}
##### 2B) Use MC simulation to price a European Call option on a stock with initial price of $155, strike price $140, a time to expiration equal to six months, a risk-free interest rate of 2.5% and a volatility of 23%. Consider a number of periods n=100 and a number of simulations m=1000
EulerMC("c",S= 155,K=140,T=0.5,r=0.025,sigma=0.23,n=100,m=1000)
[1] 20.6441
##### 2C) Write the mathematical representation of the discrete pricing equation modeled in the MC simulation. Explain what each variable in the equation represents, and provide the associated numerical value.
The mathematical representation of the discrete princing used is in the R code is:
\(\hat{C}_{m}^{n} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} f(\hat{S}_{i,n})e^{-rT}\)
\(\hat{C}_{m}^{n}\) is the price call option with simulation of n steps and m paths.
m is the simulated stock paths. \(\hat{S}_{i,n}\) is the stock price at the end of each simulation path of length n steps. \(f(x)\) is the option payout at expiration \(e^{-rT}\) represents the continuous discount factor.r is the risk free interest rate and T is total length of time.
Stock price = S = 155, strike price = K = 140, Time = T = 0.5, interest rate = r = 0.025, volatility = sigma = 0.23, number of periods = n = 100, simulated paths = m = 1000, dt = T/n = 0.005
##### 2D) Compare the price obtained from the MC simulation to the option price using the Black-Scholes function pricing GBSOption(). Share insights.
GBSOption(TypeFlag = "c", S = 155, X = 140, Time = 6/12, r = 0.025,b = 0.025, sigma = 0.23)
Title:
Black Scholes Option Valuation
Call:
GBSOption(TypeFlag = "c", S = 155, X = 140, Time = 6/12, r = 0.025,
b = 0.025, sigma = 0.23)
Parameters:
Value:
TypeFlag c
S 155
X 140
Time 0.5
r 0.025
b 0.025
sigma 0.23
Option Price:
20.11899
Description:
Wed Jan 30 14:48:01 2019
The price of the call option using the GSBOption shows a constant result which is 20.118, however the MC simulation varies from $19 to 21. Whenever the number of simulation increases, it results in the increase in the MC simulation as well. It is noted that the BSM is considered to be a more accurate method for option price.
*http://computationalfinance.lsi.upc.edu
LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDA2IgphdXRob3I6ICJUaXRpbG9wZSBPbHV0YXlvIgpkYXRlOiAiMDEvMzAvMjAxOSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CnN1YnRpdGxlOiBEaXN0cmlidXRpb25zLCBTYW1wbGluZyBNZXRob2RzICYgTW9udGUgQ2FybG8gU2ltdWxhdGlvbiAgKGZpbmM2MjEtbGFiMDYpCi0tLQoKIyMjIEFib3V0CgpJbiB0aGlzIHdvcmtzaGVldCB3ZSBsb29rIGF0IGRpZmZlcmVudCBkaXN0cmlidXRpb24gZnVuY3Rpb25zLCBzYW1wbGluZyBtZXRob2RzLCBhbmQgcHJvYmFiaWxpdHkgY2FsY3VsYXRpb25zLiAgTmV4dCB3ZSBjb25zaWRlciBhIGNhbGN1bGF0aW9uIG9mIGEgRXVyb3BlbiBvcHRpb24gdXNpbmcgTW9udGUgQ2FybG8gc2ltdWxhdGlvbiwgYW5kIGNvbXBhcmUgcmVzdWx0cyB0byBjYWxjdWxhdGlvbiB1c2luZyBCbGFjay1TY2hvbGVzLgoKIyMjIFNldHVwCgpSZW1lbWJlciB0byBhbHdheXMgc2V0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uLiBHbyB0byAnU2Vzc2lvbicsIHNjcm9sbCBkb3duIHRvICdTZXQgV29ya2luZyBEaXJlY3RvcnknLCBhbmQgY2xpY2sgJ1RvIFNvdXJjZSBGaWxlIExvY2F0aW9uJy4gUmVhZCBjYXJlZnVsbHkgdGhlIGJlbG93IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBjb21wbGV0ZSB0aGUgdGFza3MgYW5kIGFuc3dlciBhbnkgcXVlc3Rpb25zLiAgU3VibWl0IHlvdXIgd29yayB0byBSUHVicyBhcyBkZXRhaWxlZCBpbiBwcmV2aW91cyBub3Rlcy4gCgojIyMgTm90ZQoKQWx3YXlzIHJlYWQgY2FyZWZ1bGx5IHRoZSBpbnN0cnVjdGlvbnMgb24gU2FrYWkuICBGb3IgY2xhcml0eSwgdGFza3MvcXVlc3Rpb25zIHRvIGJlIGNvbXBsZXRlZC9hbnN3ZXJlZCBhcmUgaGlnaGxpZ2h0ZWQgaW4gcmVkIGNvbG9yICh2aXNpYmxlIGluIHByZXZpZXcpIGFuZCBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgcGFydGljdWxhciBwbGFjZW1lbnQgaW4gdGhlIHRhc2sgc2VjdGlvbi4gIFF1aXRlIG9mdGVuIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHlvdXIgb3duIGNvZGUgY2h1bmsuCgpFeGVjdXRlIGFsbCBjb2RlIGNodW5rcywgcHJldmlldywgcHVibGlzaCwgYW5kIHN1Ym1pdCBsaW5rIG9uIFNha2FpIGZvbGx3b2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24uIE1ha2Ugc3VyZSB0byBhZGQgY29tbWVudHMgdG8geW91ciBjb2RlIHdoZXJlIGFwcHJvcHJpYXRlLiBVc2Ugb3duIGxhbmd1YWdlIQoKLS0tLS0tLS0tLS0tLS0KCiMjIyBUYXNrIDE6IERpc3RyaWJ1dGlvbiwgU2FtcGxpbmcgJiBQcm9iYWJpbGl0eQoKCmBgYHtyfQojSW5zdGFsbCBwYWNrYWdlIHF1YW50bW9kIAppZighcmVxdWlyZSgicXVhbnRtb2QiLHF1aWV0bHkgPSBUUlVFKSkKICBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikKYGBgCgpDb25zaWRlciB0aGUgZnJlZSBjYXNoIGZsb3cgZXhhbXBsZSB3aXRoIGFuIGVzdGltYXRlZCByYW5nZSBzZXQgYnkgYSBtaW5pbXVtIG9mIC0kMjVNIGFuZCBtYXhpbXVtICQyNzVNLiBXZSBzdGFydCBieSBnZW5lcmF0aW5nIGEgc2FtcGxlIHJhbmRvbSBzZXQuIEZvbGxvd2luZyBpcyBhbiBleGFtcGxlIHRvIGdlbmVyYXRlIGEgcmFuZG9tIHNldCBvZiAxMCBkYXRhIHBvaW50cyBmcm9tIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gd2l0aCBwcm9iYWJpbGl0eSAkXGZyYWN7MX17Yi1hfSQsIGEgbWluaW11bSBvZiBhLCBhbmQgYSBtYXhpbXVtIG9mIGIuCgoKCmBgYHtyfQp1ZCA9IHJ1bmlmKDEwLCBtaW49NSwgbWF4PTE1KSAjIHJ1bmlmIGlzIGluIHJlZmVyZW5jZSB0byB1bmlmb3JtIGRpc3RyaWJ1dGlvbgoKIyBPdGhlciBSIGZ1bmN0aW9ucyBuZWVkZWQgZm9yIHRoaXMgdGFzayBhcmUgaGlzdCgpLCBtZWFuKCksIHNkKCksIHB1bmlmKCksIHJ1bmlmKCksICBwbm9ybSgpLCBhbmQgcm5vcm0oKS4gQ2hlY2sgdGhlIEhlbHAgY29tbWFuZCBpbiBSIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlc2UgZnVuY3Rpb25zLgpgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQSkgQXNzdW1pbmcgYSB1bmlmb3JtIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiwgIGdlbmVyYXRlIGEgc2FtcGxlIG9mIDEwMCByYW5kb20gb2JzZXJ2YXRpb25zIChvciBkZXZpYXRlcykgcmVwcmVzZW50aW5nIHRoZSBjYXNoIGZsb3dzCjwvc3Bhbj4KCmBgYHtyfQp1ZCA9IHJ1bmlmKDEwMCwgbWluPS0yNSwgbWF4PTI3NSkKYGBgCgoKTmV4dCB3ZSBwbG90IGEgaGlzdG9ncmFtIHRvIGRlc2NyaWJlIHRoZSBnZW5lcmF0ZWQgc2FtcGxlIGRhdGEsIGFuZCBjYWxjdWxhdGUgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc2FtcGxlIHVzaW5nIHRoZSBwcm9wZXIgUi1mdW5jdGlvbnMKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQikgUGxvdCBhIGhpc3RvZ3JhbSBhbmQgY2FsY3VsYXRlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgeW91ciBzYW1wbGUuIENvbXBhcmUgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc2FtcGxlIHRvIHRoZSB0aGVvcmV0aWNhbCB2YWx1ZXMgb2J0YWluZWQgdXNpbmcgdGhlIHByb3BlciBmb3JtdWxhcy4gCjwvc3Bhbj4KCmBgYHtyfQpoaXN0KHVkLCBicmVha3M9MjApCm1lYW4odWQpCnNkKHVkKQpgYGAKCkNhbGN1bGF0aW5nIG1hbnVhbGx5IAoKbWVhbiA9ICRcZnJhY3thICsgYn17Mn0kLCA9ICRcZnJhY3stMjUgKyAyNzV9ezJ9JCA9IDEyNQoKVmFyaWFuY2UgPSAkXGZyYWN7KGIgLSBhKV4yfXsxMn0kIAoKJFxmcmFjeygyNzUgLSAoLTI1KSleMn17MTJ9JCA9IDc1MDAKClN0YW5kYXJkIGRldmlhdGlvbiA9ICRcc3FydHs3NTAwfSQgPSA4Ni42MDI1CgpUaGUgc2FtcGxlIG1lYW4gb2YgMTI3LjEwIGlzIGZhciBmcm9tIHRoZSB0aGVvcmV0aWNhbCBtZWFuIHdoaWNoIGlzIGEgcmVzdWx0IG9mIHRoZSBzbWFsbCBzYW1wbGUgc2l6ZS4gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiA4Ni43NSBpcyBtdWNoIGNsb3NlciB0byB0aGUgdGhlb3JldGljYWwgdmFsdWUuCgpIb3dldmVyLCB0aGUgcGxvdHMgYXJlIG5vdCDigJx1bmlmb3JtZWTigJ0gYXQgYWxsLiBUaGUgcmVhc29uIGZvciB0aGF0IGJlaW5nIHRoYXQgdGhlIHNhbXBsZSBpcyBub3QgbGFyZ2UgZW5vdWdoLgoKCgoKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQykgUmVwZWF0IDFBICYgMUIgIGFib3ZlIGJ5IGluY3JlYXNpbmcgdGhlIHNhbXBsZSBzaXplIHRvIDEwMDAuIFNoYXJlIHlvdXIgaW5zaWdodHMuCjwvc3Bhbj4KCmBgYHtyfQp1ZDEgPSBydW5pZigxMDAwLCBtaW49LTI1LCBtYXg9Mjc1KQpoaXN0KHVkMSwgYnJlYWtzPTIwKQptZWFuKHVkMSkKc2QodWQxKQoKYGBgCgpTaW5jZSB0aGUgc2FtcGxlIHNpemUgaXMgbGFyZ2VyLCB0aGUgbWVhbiBhbmQgU0QgYXJlIG11Y2ggY2xvc2VyIHRvIHRoZSB0aGVvcmV0aWNhbCB2YWx1ZXMgdGhhbiB0aGUgc21hbGxlciBzYW1wbGUKCgpHaXZlbiB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGEgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIHdlIHNob3VsZCBiZSBhYmxlIHRvIGNvbXB1dGUgdmFyaW91cyBwcm9iYWJpbGl0eSBzY2VuYXJpb3MgdXNpbmcgdGhlIHByb3BlciBmdW5jdGlvbnMgaW4gUi4KCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxRCkgQ2FsY3VsYXRlIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBmcmVlIGNhc2ggZmxvdyBpcyBuZWdhdGl2ZQo8L3NwYW4+CgpgYGB7cn0KCgojIEhlcmUgd2UgYXJlIGNhbGN1bGF0aW5nIHRoZSBwcm9iYWJpbGl0eSB3aGVuIHRoZSBmcmVlIGNhc2ggZmxvdyA8IDAKcHVuaWYoMCwgbWluPS0yNSwgbWF4PTI3NSwgbG93ZXIudGFpbD1UUlVFKQoKCmBgYAoKCldlIHdpbGwgbm93IHJlcGVhdCB0aGUgYWJvdmUgZXhlcmNpc2VzIDFBLCAxQiwgMUMgdXNpbmcgaW5zdGVhZCBhIG5vcm1hbCBkaXN0cmlidXRpb24uIAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFFKSBSZXBlYXQgc3RlcHMgQS1DIGZvciB0aGUgY2FzZSBvZiBhIHBvcnRmb2xpbyBkYWlseSByZXR1cm5zIHdpdGggbm9ybWFsIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbixhIG1lYW49MS4yJSBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb249IDMuNyUKPC9zcGFuPgoKYGBge3J9CgojIFNhbXBsZSBzaXplZSBoZXJlIGlzIDEwMApuZCA8LSBybm9ybSgxMDAsIG1lYW49MS4yLHNkPTMuNykKCmhpc3QobmQsYnJlYWtzPTIwKQoKbWVhbihuZCkKCnNkKG5kKQoKIyBTYW1wbGUgc2l6ZWUgaGVyZSBpcyAxMDAwCm5kMSA8LSBybm9ybSgxMDAwLCBtZWFuPTEuMixzZD0zLjcpCgpoaXN0KG5kMSxicmVha3M9MjApCgptZWFuKG5kMSkKCnNkKG5kMSkKCmBgYAoKU2FtZSBhcHBsaWVzIGZvciB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhcyB3aXRoIHRoZSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiwgdGhlIHNhbXBsZSBtZWFuIGFuZCBTRCBjb2xsZWN0ZWQgYXJlIGNsb3NlciB0byB0aGUgdGhlb3JldGljYWwgdmFsdWVzIGFzIHRoZSBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMgZnJvbSAxMDAgdG8gMTAwMC4KCgoKU2ltaWxhcmx5IHdlIHNob3VsZCBiZSBhYmxlIHRvIGNvbXB1dGUgdmFyaW91cyBwcm9iYWJpbGl0eSBzZW5hcmlvcyB3aXRoIG91ciBvYnRhaW5lZCBub3JtYWwgZGlzdHJpYnV0aW9uLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFGKSBDYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IHRoYXQgcmV0dXJucyB3aWxsIGJlIG5lZ2F0aXZlIHVzaW5nIHRoZSB2YWx1ZXMgZm9yIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcyBpbiAxRQo8L3NwYW4+CgpgYGB7cn0KIyBIZXJlIHdlIGFyZSBjYWxjdWxhdGluZyB0aGUgcHJvYmFiaWxpdHkgIHRoYXQgcmV0dXJucyB3aWxsIGJlIG5lZ2F0aXZlIHVzaW5nIG5vcm1hbCBkaXN0cmlidXRpb24KCnBub3JtKDAsIG1lYW49MS4yLCBzZD0zLjcsIGxvd2VyLnRhaWw9VFJVRSkKYGBgCgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFHKSBSZXBlYXQgdGhlIGNhbGN1bGF0aW9uIGluIDFGIHVzaW5nIGluc3RlYWQgdGhlIHN0YW5kYXJkIFotdmFsdWUuIFNoYXJlIGluc2lnaHRzLgo8L3NwYW4+CgpgYGB7cn0KCiMgSGVyZSB3ZSBhcmUgdXNpbmcgdGhlIHN0YW5kYXJkIHotdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBwcm9iYWJpbGl0eSAgdGhhdCByZXR1cm5zIHdpbGwgYmUgbmVnYXRpdmUKCno9KDAtMS4yKS8zLjcKcG5vcm0oeiwwLDEpCmBgYAoKVGhlIHByb2JhYmlsaXR5IG9mIG5vcm1hbCBkaXN0cmlidXRpb24gaXMgc2FtZSB3aXRoIHRoZSBwcm9iYWJpbGl0eSBvZiBzdGFuZGFyZCBub3JtYWwgZGlzdHJpYnV0aW9uLiAKCgojIyMgVGFzayAyOiBNQyBTaW11bGF0aW9uICYgRXVyb3BlYW4gT3B0aW9uIFByaWNpbmcKCkZvbGxvdyB0aGUgYCBBbGdvcml0aG0gNS4yIGV4YW1wbGUgb24gcCAxNjcgKCopYCB0byBjYWxjdWxhdGUgdGhlIHByaWNlIG9mIGEgRXVyb3BlYW4gb3B0aW9uIHVzaW5nIGEgTUMgc2ltdWxhdGlvbi4gTm90ZSB0aGF0IHRoZSBjb2RlIGluIHRoZSBib29rIGV4YW1wbGUgaXMgbWlzc2luZyBvbmUgZGV0YWlsIGFuZCBhIGNvcnJlY3Rpb24uIFRob3NlIGFyZSBsZWZ0IGZvciB5b3VyIGludmVzdGlnYXRpb24uIAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJBKSBJZGVudGlmeSBhbmQgZXhwbGFpbiB0aGUgbmF0dXJlIG9mIHRoZSBtaXNzaW5nIGRldGFpbCBhbmQgdGhlIGNvcnJlY3Rpb24gbmVlZGVkLiAgICAgIAo8L3NwYW4+CgpUaGUgbWlzc2luZyBkZXRhaWw6IFRoZSBzdG9jayBwcmljZSBuZWVkcyB0byBiZSByZXNldCB0byB0aGUgY3VycmVudCBwcmljZSBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzaW11bGF0aW9uLiBJZiB3ZSBkb27igJl0IHNldCBvbGQgc3RvY2sgcHJpY2UgdG8gbmV3IHN0b2NrIHByaWNlLCB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGdldCBzdGFiaWxpemVkIHJlc3VsdHMuCgoKVGhlIGNvcnJlY3Rpb24gdG8gdGhlIG1pc3NpbmcgZGV0YWlsIGlzIHRoZSBmdW5jdGlvbiBybm9ybSgpIHJlcXVpcmVzIGFuIGFkZGl0aW9uYWwgaW5wdXQgcGFyYW1ldGVyIHRvIGZ1bmN0aW9uIHByb3Blcmx5IEUgPSBybm9ybSgxLCAwLCAxKS4gSW4gdGhlIGJvb2ssIGl04oCZcyBtaXNzaW5nIHRoZSBmaXJzdCDigJwx4oCdIHdoaWNoIHNob3VsZCBiZSB0aGUgcGxhY2UgZm9yIG4uIFRoZSBjb2RlIHdvbuKAmXQgd29yayB3aXRob3V0IHRoZSBmaXJzdCAxLiBTaW5jZSB0aGUgcm5vcm0gZnVuY3Rpb24gcmVxdWlyZXMgaW5wdXRzIGFzIHJub3JtKG4sIG1lYW4gPSAwLCBzZCA9IDEpLgoKCgpHaXZlbiB0aGUgTUMgc2ltdWxhdGlvbiB3ZSBzaG91bGQgYmUgYWJsZSB0byBwcmljZSBhIEV1cm9wZWFuIG9wdGlvbi4gIE5vdGUgdGhlIGludHJvZHVjdGlvbiBvZiB1c2VyIGRlZmluZWQgZnVuY3Rpb24gaW4gdGhlIGJvb2suCkJlbG93IGlzIGFuIGV4YW1wbGUgb2YgYSB1c2VyIGRlZmluZWQgZnVuY3Rpb24gYW5kIHVzYWdlLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNxdWFyZWQgdmFsdWUuCgpgYGB7cn0KbXlmdW5jdGlvbiA8LSBmdW5jdGlvbih4PTIpewogIHk9eF4yCnJldHVybih5KX0KCm15ZnVuY3Rpb24oeD01KQpgYGAKCmBgYHtyfQpFdWxlck1DID0gZnVuY3Rpb24oVHlwZSwgUywgSywgVCAsIHIgLCBzaWdtYSwgbiAsIG0gKXsKUzA9UwpkdD0gVC9uCnN1bSA9IDA7CmZvcihpIGluIDE6bSl7CiAgUz1TMAogIGZvcihqIGluIDE6bil7CiAgICBFID0gcm5vcm0oMSwgMCwxKTsKICAgIFM9UytyKlMqZHQrc2lnbWEqUypzcXJ0KGR0KSpFO30KICBpZihUeXBlID09ICJjIil7cGF5b2ZmID0gbWF4KFMtSywwKX0KICBlbHNlIGlmKFR5cGUgPT0gInAiKXtwYXlvZmYgPSBtYXgoSy1TLDApfQogIGVsc2V7cGF5b2ZmID0gbWF4KFMtSywwKX0KICBzdW09c3VtICsgcGF5b2ZmfQpPcHRpb25WYWx1ZSA9IChzdW0vbSkqZXhwKC1yKlQpOwpyZXR1cm4oT3B0aW9uVmFsdWUpfQpgYGAKCgoKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQikgVXNlIE1DIHNpbXVsYXRpb24gdG8gcHJpY2UgYSBFdXJvcGVhbiBDYWxsIG9wdGlvbiBvbiBhIHN0b2NrIHdpdGggaW5pdGlhbCBwcmljZSBvZiAkMTU1LCBzdHJpa2UgcHJpY2UgJDE0MCwgYSB0aW1lIHRvIGV4cGlyYXRpb24gZXF1YWwgdG8gc2l4IG1vbnRocywgYSByaXNrLWZyZWUgaW50ZXJlc3QgcmF0ZSBvZiAyLjUlIGFuZCBhIHZvbGF0aWxpdHkgb2YgMjMlLiBDb25zaWRlciBhIG51bWJlciBvZiBwZXJpb2RzIG49MTAwIGFuZCBhIG51bWJlciBvZiBzaW11bGF0aW9ucyBtPTEwMDAKPC9zcGFuPgoKYGBge3J9CgpFdWxlck1DKCJjIixTPSAxNTUsSz0xNDAsVD0wLjUscj0wLjAyNSxzaWdtYT0wLjIzLG49MTAwLG09MTAwMCkKYGBgCgoKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQykgV3JpdGUgdGhlIG1hdGhlbWF0aWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGlzY3JldGUgcHJpY2luZyBlcXVhdGlvbiBtb2RlbGVkIGluIHRoZSBNQyBzaW11bGF0aW9uLiBFeHBsYWluIHdoYXQgZWFjaCB2YXJpYWJsZSBpbiB0aGUgZXF1YXRpb24gcmVwcmVzZW50cywgYW5kIHByb3ZpZGUgdGhlIGFzc29jaWF0ZWQgbnVtZXJpY2FsIHZhbHVlLgo8L3NwYW4+CgoKClRoZSBtYXRoZW1hdGljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRpc2NyZXRlIHByaW5jaW5nIHVzZWQgaXMgaW4gdGhlIFIgY29kZSBpczoKCiRcaGF0e0N9X3ttfV57bn0gPSBcZGlzcGxheXN0eWxlIFxmcmFjezF9e219IFxzdW1fe2k9MX1ee219IGYoXGhhdHtTfV97aSxufSllXnstclR9JAoKCgokXGhhdHtDfV97bX1ee259JCBpcyB0aGUgcHJpY2UgY2FsbCBvcHRpb24gIHdpdGggc2ltdWxhdGlvbiBvZiBuIHN0ZXBzIGFuZCBtIHBhdGhzLiAKCm0gaXMgdGhlIHNpbXVsYXRlZCBzdG9jayBwYXRocy4gJFxoYXR7U31fe2ksbn0kIGlzIHRoZSBzdG9jayBwcmljZSBhdCB0aGUgZW5kIG9mIGVhY2ggc2ltdWxhdGlvbiBwYXRoIG9mIGxlbmd0aCBuIHN0ZXBzLgokZih4KSQgaXMgdGhlIG9wdGlvbiBwYXlvdXQgYXQgZXhwaXJhdGlvbiAKJGVeey1yVH0kIHJlcHJlc2VudHMgdGhlIGNvbnRpbnVvdXMgZGlzY291bnQgZmFjdG9yLnIgaXMgdGhlIHJpc2sgZnJlZSBpbnRlcmVzdCByYXRlIGFuZCBUIGlzIHRvdGFsIGxlbmd0aCBvZiB0aW1lLgoKU3RvY2sgcHJpY2UgPSBTID0gMTU1LCBzdHJpa2UgcHJpY2UgPSBLID0gMTQwLCBUaW1lID0gVCA9IDAuNSwgaW50ZXJlc3QgcmF0ZSA9IHIgPSAwLjAyNSwgdm9sYXRpbGl0eSA9IHNpZ21hID0gMC4yMywgbnVtYmVyIG9mIHBlcmlvZHMgPSBuID0gMTAwLCBzaW11bGF0ZWQgcGF0aHMgPSBtID0gMTAwMCwgZHQgPSBUL24gPSAwLjAwNQoKCgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJEKSBDb21wYXJlIHRoZSBwcmljZSBvYnRhaW5lZCBmcm9tIHRoZSBNQyBzaW11bGF0aW9uIHRvIHRoZSBvcHRpb24gcHJpY2UgdXNpbmcgdGhlIEJsYWNrLVNjaG9sZXMgZnVuY3Rpb24gcHJpY2luZyBHQlNPcHRpb24oKS4gU2hhcmUgaW5zaWdodHMuCjwvc3Bhbj4KCmBgYHtyfQpHQlNPcHRpb24oVHlwZUZsYWcgPSAiYyIsIFMgPSAxNTUsIFggPSAxNDAsIFRpbWUgPSA2LzEyLCByID0gMC4wMjUsYiA9IDAuMDI1LCBzaWdtYSA9IDAuMjMpCmBgYAoKVGhlIHByaWNlIG9mIHRoZSBjYWxsIG9wdGlvbiB1c2luZyB0aGUgR1NCT3B0aW9uIHNob3dzIGEgY29uc3RhbnQgcmVzdWx0IHdoaWNoIGlzIDIwLjExOCwgaG93ZXZlciB0aGUgTUMgc2ltdWxhdGlvbiB2YXJpZXMgZnJvbSAkMTkgdG8gMjEuIFdoZW5ldmVyIHRoZSBudW1iZXIgb2Ygc2ltdWxhdGlvbiBpbmNyZWFzZXMsIGl0IHJlc3VsdHMgaW4gdGhlIGluY3JlYXNlIGluIHRoZSBNQyBzaW11bGF0aW9uIGFzIHdlbGwuIEl0IGlzIG5vdGVkIHRoYXQgdGhlIEJTTSBpcyBjb25zaWRlcmVkIHRvIGJlIGEgbW9yZSBhY2N1cmF0ZSBtZXRob2QgZm9yIG9wdGlvbiBwcmljZS4KCgoqW2h0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSBdKGh0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSkK