This homework assignment must be completed individually. To ensure a comprehensive understanding of the material, students will be selected at random for a brief oral examination to discuss their solutions and the underlying methodology.

Problem 1: Sampling from \(Beta(\alpha,\beta)\)

Gamma Transformation

For \(X\) and \(Y\) independent random variables with \(X \sim Gamma(\alpha,1)\) and \(Y \sim Gamma(\beta,1)\), it can be shown that \[ B_g = \frac{X}{X+Y} \sim Beta(\alpha,\beta). \]

Jöhnk’s Generator - rejection sampling

For very small \(\alpha,\beta\) (e.g., \(\alpha, \beta < 1\)), the scheme is elegantly simple and avoids complex functions:

  • Step 1: Generate \(U_1, U_2 \sim \mbox{Uniform}(0, 1)\);

  • Step 2: Set \(X = U_1^{1/\alpha}\) and \(Y = U_2^{1/\beta}\);

  • Step 3: If \(X + Y \leq 1\), then \[ B_j = \frac{X}{X + Y} \sim Beta(\alpha,\beta). \] Otherwise, repeat.

Jöhnk, M. D. (1964). Erzeugung von Beta-verteilten und Gamma-verteilten Zufallszahlen. Metrika, 8(1), 5–15, which is in German! The most comprehensive English resource for this and nearly all other classical sampling algorithms is Luc Devroye’s definitive text, Devroye, L. (1986). Non-Uniform Random Variate Generation. Springer-Verlag. His book book provides the full mathematical proof and a performance analysis of Jöhnk’s method in Chapter 9. Another reference, which is cited as a standard reference for the implementation of the algorithm is Kennedy, W. J., & Gentle, J. E. (1980). Statistical Computing. Marcel Dekker.

Answer the following questions

Let us call the first sampling scheme rbetag and the second rbetaj.

Comparing sampler

Compare draws from these two samplers with draws from the R function rbeta, for the case where \(B \sim Beta(0.7,0.7)\). You can, for instance, compare the histograms of the draws to the exact beta density (dbeta in R).

Approximationg a tail probability

Obtain the Monte Carlo approximation of \(Pr(B<0.2)=0.2504119\).

Replication and MC error

Repeat the sampling \(N=1,000\) times and compare root mean squared errors (RMSEs) and the mean absolute errors (MAEs) for the three sampler.

Repeat the exercise

What happens when \(\alpha=2.5\) and \(\beta=2.5\), where \(Pr(B<0.2)=0.07718863\)?

Problem 2: Bayesian Gaussian linear model

Weight and height dataset

We collected data from 15 volunteers (my students and myself).

n    = 15
data = matrix(c(178,70,175,80,184,82,200,89,183,80,173,65,185,70,162,70,
190,85,174,80,180,87,165,74,176,72,174,63,196,113),n,2,byrow=TRUE)
height = scale(data[,1])
weight = scale(data[,2])
par(mfrow=c(1,1))
plot(height,weight,xlab="Height (standardized)",ylab="Weight (standardized)",pch=16)
points(height[n],weight[n],col=2,pch=16,cex=1.5)
abline(v=0,lty=2)
abline(h=0,lty=2)

Maximum likelihood estimation (MLE)

Below we use the lm (linear model) function from R to run the OLS estimation for the regression \[ y_i = \beta \ x_i + \varepsilon_i \qquad\qquad \varepsilon_i \ \ \mbox{iid} \ \ N(0,\sigma^2), \] where \(x_i=\mbox{height}_i\) and \(y_i=\mbox{weight}_i\), for \(i=1,\ldots,n\). From the frequentist/Fisherian approach, we have learned that the MLEs of \(\beta\) and \(\sigma^2\) are, respectively, \[ {\widehat \beta} = \frac{\sum_{i=1}^n y_i x_i}{\sum_{i=1}^n x^2_i} \qquad \mbox{and} \qquad {\widehat \sigma}^2 = \frac{\sum_{i=1}^n (y_i-{\widehat y}_i)^2}{n}. \] We also know the sampling distribution of these estimators: \[ {\widehat \beta}|{\widehat \sigma}^2 \sim t_{n-1}\left(\beta,\frac{{\widehat \sigma}^2}{\sum_{i=1}^n x_i^2}\right) \qquad and \qquad {\widehat \sigma}^2|\sigma^2 \sim IG\left(\frac{n-1}{2},\frac{(n-1)\sigma^2}{2}\right), \] from which confidence intervals and hypothesis testing can be derived. An unbiased estimator of \(\sigma^2\) is \(s^2 = n{\widehat \sigma}^2/(n-1)\).

bhat  = sum(height*weight)/sum(height^2)
sighat = sqrt(sum((weight-bhat*height)^2)/n)
s = sqrt(n*sighat^2/(n-1))
se = s/sqrt(sum(height^2))
round(c(bhat,se),4)
## [1] 0.6875 0.1941
round(c(sighat,s),4)
## [1] 0.7016 0.7262
# The -1 is to inform the lm function that the regression has no intercept
summary(lm(weight~height-1))
## 
## Call:
## lm(formula = weight ~ height - 1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.0537 -0.5485 -0.1120  0.4731  1.7021 
## 
## Coefficients:
##        Estimate Std. Error t value Pr(>|t|)   
## height   0.6875     0.1941   3.542  0.00325 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7262 on 14 degrees of freedom
## Multiple R-squared:  0.4727, Adjusted R-squared:  0.435 
## F-statistic: 12.55 on 1 and 14 DF,  p-value: 0.003249

OLS fit with and without the atypical individual (red)

par(mfrow=c(1,1))
plot(height,weight,xlab="Height (standardized)",ylab="Weight (standardized)")
points(height[n],weight[n],col=2,pch=16,cex=2)
abline(lm(weight~height-1),col=2,lwd=2)
abline(lm(weight[1:(n-1)]~height[1:(n-1)]-1),lwd=2)
legend("topleft",legend=c("With atypical","Without atypical "),col=2:1,lwd=2,lty=1,bty="n")
abline(v=0,lty=2)
abline(h=0,lty=2)

Bayesian inference

Let us assume the following independent prior for \(\beta\) and \(\sigma^2\) \[ p(\beta,\sigma^2) = p(\beta|\sigma^2)p(\sigma^2), \] with \(\beta \sim N(b_0,\sigma^2B_0)\) and \(\sigma^2 \sim IG(c_0,d_0)\), with hyperparameters \(b_0=0\), \(B_0=1\), \(c_0=2\) and \(d0=1\). Notice that this is a conjugate prior for \((\beta,\sigma^2)\), so closed-form posterior inference is readily available.

Draws from the prior

b0=0
B0=1
c0=2
d0=1
M    = 1000
sig2 = 1/rgamma(M,c0,d0)
beta = rnorm(M,b0,sqrt(sig2*B0))
par(mfrow=c(1,1))
boxplot(cbind(beta,sqrt(sig2)),names=c(expression(beta),expression(sigma)),outline=F,xlab="",horizontal=TRUE)
points(bhat,1,col=2,pch=16,cex=2)
points(s,2,col=2,pch=16,cex=2)
title("Prior draws (MLE in red)")

Answer the following questions

Sampling importance resampling (SIR)

Implement the SIR algorithm to obtain draws from the posterior \(p(\beta,\sigma^2|\mbox{data})\). You can either use the prior for \((\beta,\sigma^2)\) as proposal density or you can use the following proposal: \(q(\beta) \equiv N(0.7,0.25)\) and \(q(\sigma^2) \equiv IG(7,5)\).

Note: These proposal densities are inspired by the sampling distributions of the corresponding estimators. Recall that the proposal distributions can be anything with or without the use of the data since it is not altering the prior in any way.

Gibbs sampler

Implement the Gibbs sampler to obtain draws from the posterior \(p(\beta,\sigma^2|\mbox{data})\). Check the mixing of the Markov chains and the convergence of the draws to the posterior.

Metropolis-Hastings

Repeat the previous exercise, but replace the Gibbs sampler by a Metropolis algorithm with proposals \(q(\beta) \equiv N(0.7,0.25)\) and \(q(\sigma^2) \equiv IG(7,5)\), which already appear in 1).

Comparing the results

If the three algorithms are running properly, the results should be the same up to small Monte Carlo errors.

LS0tCnRpdGxlOiAiSG9tZXdvcmsgQXNzaWdubWVudCAyIgphdXRob3I6ICJNb250ZSBDYXJsbyBzYW1wbGluZyIKZGF0ZTogIkR1ZSBvbiA5OjQ1YW0sIE1hcmNoIDEydGggMjAyNiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogeWVzCi0tLQoKClxub2luZGVudCB7XGJmIEluZGl2aWR1YWwgV29yayBcJiBPcmFsIEFzc2Vzc21lbnQ6fSBUaGlzIGhvbWV3b3JrIGFzc2lnbm1lbnQgbXVzdCBiZSBjb21wbGV0ZWQgaW5kaXZpZHVhbGx5LiBUbyBlbnN1cmUgYSBjb21wcmVoZW5zaXZlIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG1hdGVyaWFsLCBzdHVkZW50cyB3aWxsIGJlIHNlbGVjdGVkIGF0IHJhbmRvbSBmb3IgYSBicmllZiBvcmFsIGV4YW1pbmF0aW9uIHRvIGRpc2N1c3MgdGhlaXIgc29sdXRpb25zIGFuZCB0aGUgdW5kZXJseWluZyBtZXRob2RvbG9neS4KCgojIFByb2JsZW0gMTogU2FtcGxpbmcgZnJvbSAkQmV0YShcYWxwaGEsXGJldGEpJAoKIyMgR2FtbWEgVHJhbnNmb3JtYXRpb24KCkZvciAkWCQgYW5kICRZJCBpbmRlcGVuZGVudCByYW5kb20gdmFyaWFibGVzIHdpdGggCiRYIFxzaW0gR2FtbWEoXGFscGhhLDEpJCBhbmQgJFkgXHNpbSBHYW1tYShcYmV0YSwxKSQsIGl0IGNhbiBiZSBzaG93biB0aGF0IAokJApCX2cgPSBcZnJhY3tYfXtYK1l9IFxzaW0gQmV0YShcYWxwaGEsXGJldGEpLgokJCAKCiMjIErDtmhua+KAmXMgR2VuZXJhdG9yIC0gcmVqZWN0aW9uIHNhbXBsaW5nCgpGb3IgdmVyeSBzbWFsbCAkXGFscGhhLFxiZXRhJCAoZS5nLiwgJFxhbHBoYSwgXGJldGEgPCAxJCksIHRoZSBzY2hlbWUgaXMgZWxlZ2FudGx5IHNpbXBsZSBhbmQgYXZvaWRzIGNvbXBsZXggZnVuY3Rpb25zOgoKKiBTdGVwIDE6IEdlbmVyYXRlICRVXzEsIFVfMiBcc2ltIFxtYm94e1VuaWZvcm19KDAsIDEpJDsKCiogU3RlcCAyOiBTZXQgJFggPSBVXzFeezEvXGFscGhhfSQgYW5kICRZID0gVV8yXnsxL1xiZXRhfSQ7CgoqIFN0ZXAgMzogSWYgJFggKyBZIFxsZXEgMSQsIHRoZW4gCiQkCkJfaiA9IFxmcmFje1h9e1ggKyBZfSBcc2ltIEJldGEoXGFscGhhLFxiZXRhKS4KJCQKT3RoZXJ3aXNlLCByZXBlYXQuCgoqSsO2aG5rLCBNLiBELiAoMTk2NCkuIEVyemV1Z3VuZyB2b24gQmV0YS12ZXJ0ZWlsdGVuIHVuZCBHYW1tYS12ZXJ0ZWlsdGVuIFp1ZmFsbHN6YWhsZW4uIE1ldHJpa2EsIDgoMSksIDXigJMxNSosIHdoaWNoIGlzIGluIEdlcm1hbiEgIFRoZSBtb3N0IGNvbXByZWhlbnNpdmUgRW5nbGlzaCByZXNvdXJjZSBmb3IgdGhpcyBhbmQgbmVhcmx5IGFsbCBvdGhlciBjbGFzc2ljYWwgc2FtcGxpbmcgYWxnb3JpdGhtcyBpcyBMdWMgRGV2cm95ZeKAmXMgZGVmaW5pdGl2ZSB0ZXh0LCAqRGV2cm95ZSwgTC4gKDE5ODYpLiBOb24tVW5pZm9ybSBSYW5kb20gVmFyaWF0ZSBHZW5lcmF0aW9uLiBTcHJpbmdlci1WZXJsYWcqLiBIaXMgYm9vayBib29rIHByb3ZpZGVzIHRoZSBmdWxsIG1hdGhlbWF0aWNhbCBwcm9vZiBhbmQgYSBwZXJmb3JtYW5jZSBhbmFseXNpcyBvZiBKw7ZobmsncyBtZXRob2QgaW4gQ2hhcHRlciA5LgpBbm90aGVyIHJlZmVyZW5jZSwgd2hpY2ggaXMgY2l0ZWQgYXMgYSBzdGFuZGFyZCByZWZlcmVuY2UgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWxnb3JpdGhtIGlzICpLZW5uZWR5LCBXLiBKLiwgJiBHZW50bGUsIEouIEUuICgxOTgwKS4gU3RhdGlzdGljYWwgQ29tcHV0aW5nLiBNYXJjZWwgRGVra2VyKi4KCgojIyBBbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMKCkxldCB1cyBjYWxsIHRoZSBmaXJzdCBzYW1wbGluZyBzY2hlbWUgKipyYmV0YWcqKiBhbmQgdGhlIHNlY29uZCAqKnJiZXRhaioqLiAgCgojIyMgQ29tcGFyaW5nIHNhbXBsZXIKCkNvbXBhcmUgZHJhd3MgZnJvbSB0aGVzZSB0d28gc2FtcGxlcnMgd2l0aCBkcmF3cyBmcm9tIHRoZSBSIGZ1bmN0aW9uICoqcmJldGEqKiwgZm9yIAp0aGUgY2FzZSB3aGVyZSAkQiBcc2ltIEJldGEoMC43LDAuNykkLiAgWW91IGNhbiwgZm9yIGluc3RhbmNlLCBjb21wYXJlIHRoZSBoaXN0b2dyYW1zIG9mIHRoZSBkcmF3cyB0byB0aGUgZXhhY3QgYmV0YSBkZW5zaXR5ICgqKmRiZXRhKiogaW4gUikuICAKCiMjIyBBcHByb3hpbWF0aW9uZyBhIHRhaWwgcHJvYmFiaWxpdHkKCk9idGFpbiB0aGUgTW9udGUgQ2FybG8gYXBwcm94aW1hdGlvbiBvZiAkUHIoQjwwLjIpPTAuMjUwNDExOSQuICAKCiMjIyBSZXBsaWNhdGlvbiBhbmQgTUMgZXJyb3IKClJlcGVhdCB0aGUgc2FtcGxpbmcgJE49MSwwMDAkIHRpbWVzIGFuZCBjb21wYXJlIHJvb3QgbWVhbiBzcXVhcmVkIGVycm9ycyAoUk1TRXMpIGFuZCB0aGUgbWVhbiBhYnNvbHV0ZSBlcnJvcnMgKE1BRXMpIGZvciB0aGUgdGhyZWUgc2FtcGxlci4gIAoKIyMjIFJlcGVhdCB0aGUgZXhlcmNpc2UKCldoYXQgaGFwcGVucyB3aGVuICRcYWxwaGE9Mi41JCBhbmQgJFxiZXRhPTIuNSQsIHdoZXJlICRQcihCPDAuMik9MC4wNzcxODg2MyQ/CgoKCiMgUHJvYmxlbSAyOiBCYXllc2lhbiBHYXVzc2lhbiBsaW5lYXIgbW9kZWwKCiMjIFdlaWdodCBhbmQgaGVpZ2h0IGRhdGFzZXQKCldlIGNvbGxlY3RlZCBkYXRhIGZyb20gMTUgdm9sdW50ZWVycyAobXkgc3R1ZGVudHMgYW5kIG15c2VsZikuCgpgYGB7ciBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD01LCBmaWcuYWxpZ249J2NlbnRlcid9Cm4gICAgPSAxNQpkYXRhID0gbWF0cml4KGMoMTc4LDcwLDE3NSw4MCwxODQsODIsMjAwLDg5LDE4Myw4MCwxNzMsNjUsMTg1LDcwLDE2Miw3MCwKMTkwLDg1LDE3NCw4MCwxODAsODcsMTY1LDc0LDE3Niw3MiwxNzQsNjMsMTk2LDExMyksbiwyLGJ5cm93PVRSVUUpCmhlaWdodCA9IHNjYWxlKGRhdGFbLDFdKQp3ZWlnaHQgPSBzY2FsZShkYXRhWywyXSkKcGFyKG1mcm93PWMoMSwxKSkKcGxvdChoZWlnaHQsd2VpZ2h0LHhsYWI9IkhlaWdodCAoc3RhbmRhcmRpemVkKSIseWxhYj0iV2VpZ2h0IChzdGFuZGFyZGl6ZWQpIixwY2g9MTYpCnBvaW50cyhoZWlnaHRbbl0sd2VpZ2h0W25dLGNvbD0yLHBjaD0xNixjZXg9MS41KQphYmxpbmUodj0wLGx0eT0yKQphYmxpbmUoaD0wLGx0eT0yKQpgYGAKCiMjIE1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0aW9uIChNTEUpCgpCZWxvdyB3ZSB1c2UgdGhlICoqbG0qKiAobGluZWFyIG1vZGVsKSBmdW5jdGlvbiBmcm9tIFIgdG8gcnVuIHRoZSBPTFMgZXN0aW1hdGlvbiBmb3IgdGhlIHJlZ3Jlc3Npb24KJCQKeV9pID0gXGJldGEgXCB4X2kgKyBcdmFyZXBzaWxvbl9pIFxxcXVhZFxxcXVhZCBcdmFyZXBzaWxvbl9pIFwgXCBcbWJveHtpaWR9IFwgXCBOKDAsXHNpZ21hXjIpLAokJAp3aGVyZSAkeF9pPVxtYm94e2hlaWdodH1faSQgYW5kICR5X2k9XG1ib3h7d2VpZ2h0fV9pJCwgZm9yICRpPTEsXGxkb3RzLG4kLiAgRnJvbSB0aGUgZnJlcXVlbnRpc3QvRmlzaGVyaWFuIGFwcHJvYWNoLCB3ZSBoYXZlIGxlYXJuZWQgdGhhdCB0aGUgTUxFcyBvZiAkXGJldGEkIGFuZCAkXHNpZ21hXjIkIGFyZSwgcmVzcGVjdGl2ZWx5LAokJAp7XHdpZGVoYXQgXGJldGF9ID0gXGZyYWN7XHN1bV97aT0xfV5uIHlfaSB4X2l9e1xzdW1fe2k9MX1ebiB4XjJfaX0gXHFxdWFkIFxtYm94e2FuZH0gXHFxdWFkCntcd2lkZWhhdCBcc2lnbWF9XjIgPSBcZnJhY3tcc3VtX3tpPTF9Xm4gKHlfaS17XHdpZGVoYXQgeX1faSleMn17bn0uCiQkCldlIGFsc28ga25vdyB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZXNlIGVzdGltYXRvcnM6CiQkCntcd2lkZWhhdCBcYmV0YX18e1x3aWRlaGF0IFxzaWdtYX1eMiBcc2ltIHRfe24tMX1cbGVmdChcYmV0YSxcZnJhY3t7XHdpZGVoYXQgXHNpZ21hfV4yfXtcc3VtX3tpPTF9Xm4geF9pXjJ9XHJpZ2h0KSBccXF1YWQgYW5kIFxxcXVhZCB7XHdpZGVoYXQgXHNpZ21hfV4yfFxzaWdtYV4yIFxzaW0gSUdcbGVmdChcZnJhY3tuLTF9ezJ9LFxmcmFjeyhuLTEpXHNpZ21hXjJ9ezJ9XHJpZ2h0KSwKJCQKZnJvbSB3aGljaCBjb25maWRlbmNlIGludGVydmFscyBhbmQgaHlwb3RoZXNpcyB0ZXN0aW5nIGNhbiBiZSBkZXJpdmVkLiAgQW4gdW5iaWFzZWQgZXN0aW1hdG9yIG9mICRcc2lnbWFeMiQgaXMgJHNeMiA9IG57XHdpZGVoYXQgXHNpZ21hfV4yLyhuLTEpJC4KCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTYsIGZpZy5hbGlnbj0nY2VudGVyJ30KYmhhdCAgPSBzdW0oaGVpZ2h0KndlaWdodCkvc3VtKGhlaWdodF4yKQpzaWdoYXQgPSBzcXJ0KHN1bSgod2VpZ2h0LWJoYXQqaGVpZ2h0KV4yKS9uKQpzID0gc3FydChuKnNpZ2hhdF4yLyhuLTEpKQpzZSA9IHMvc3FydChzdW0oaGVpZ2h0XjIpKQpyb3VuZChjKGJoYXQsc2UpLDQpCnJvdW5kKGMoc2lnaGF0LHMpLDQpCgojIFRoZSAtMSBpcyB0byBpbmZvcm0gdGhlIGxtIGZ1bmN0aW9uIHRoYXQgdGhlIHJlZ3Jlc3Npb24gaGFzIG5vIGludGVyY2VwdApzdW1tYXJ5KGxtKHdlaWdodH5oZWlnaHQtMSkpCmBgYAoKIyMjIE9MUyBmaXQgd2l0aCBhbmQgd2l0aG91dCB0aGUgYXR5cGljYWwgaW5kaXZpZHVhbCAocmVkKSAKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTYsIGZpZy5hbGlnbj0nY2VudGVyJ30KcGFyKG1mcm93PWMoMSwxKSkKcGxvdChoZWlnaHQsd2VpZ2h0LHhsYWI9IkhlaWdodCAoc3RhbmRhcmRpemVkKSIseWxhYj0iV2VpZ2h0IChzdGFuZGFyZGl6ZWQpIikKcG9pbnRzKGhlaWdodFtuXSx3ZWlnaHRbbl0sY29sPTIscGNoPTE2LGNleD0yKQphYmxpbmUobG0od2VpZ2h0fmhlaWdodC0xKSxjb2w9Mixsd2Q9MikKYWJsaW5lKGxtKHdlaWdodFsxOihuLTEpXX5oZWlnaHRbMToobi0xKV0tMSksbHdkPTIpCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kPWMoIldpdGggYXR5cGljYWwiLCJXaXRob3V0IGF0eXBpY2FsICIpLGNvbD0yOjEsbHdkPTIsbHR5PTEsYnR5PSJuIikKYWJsaW5lKHY9MCxsdHk9MikKYWJsaW5lKGg9MCxsdHk9MikKYGBgCgojIyBCYXllc2lhbiBpbmZlcmVuY2UKCkxldCB1cyBhc3N1bWUgdGhlIGZvbGxvd2luZyBpbmRlcGVuZGVudCBwcmlvciBmb3IgJFxiZXRhJCBhbmQgJFxzaWdtYV4yJAokJApwKFxiZXRhLFxzaWdtYV4yKSA9IHAoXGJldGF8XHNpZ21hXjIpcChcc2lnbWFeMiksCiQkCndpdGggJFxiZXRhIFxzaW0gTihiXzAsXHNpZ21hXjJCXzApJCBhbmQgJFxzaWdtYV4yIFxzaW0gSUcoY18wLGRfMCkkLCB3aXRoIGh5cGVycGFyYW1ldGVycyAkYl8wPTAkLCAkQl8wPTEkLCAkY18wPTIkIGFuZCAkZDA9MSQuICBOb3RpY2UgdGhhdCB0aGlzIGlzIGEgY29uanVnYXRlIHByaW9yIGZvciAkKFxiZXRhLFxzaWdtYV4yKSQsIHNvIGNsb3NlZC1mb3JtIHBvc3RlcmlvciBpbmZlcmVuY2UgaXMgcmVhZGlseSBhdmFpbGFibGUuCgojIyMgRHJhd3MgZnJvbSB0aGUgcHJpb3IKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NCwgZmlnLmFsaWduPSdjZW50ZXInfQpiMD0wCkIwPTEKYzA9MgpkMD0xCk0gICAgPSAxMDAwCnNpZzIgPSAxL3JnYW1tYShNLGMwLGQwKQpiZXRhID0gcm5vcm0oTSxiMCxzcXJ0KHNpZzIqQjApKQpwYXIobWZyb3c9YygxLDEpKQpib3hwbG90KGNiaW5kKGJldGEsc3FydChzaWcyKSksbmFtZXM9YyhleHByZXNzaW9uKGJldGEpLGV4cHJlc3Npb24oc2lnbWEpKSxvdXRsaW5lPUYseGxhYj0iIixob3Jpem9udGFsPVRSVUUpCnBvaW50cyhiaGF0LDEsY29sPTIscGNoPTE2LGNleD0yKQpwb2ludHMocywyLGNvbD0yLHBjaD0xNixjZXg9MikKdGl0bGUoIlByaW9yIGRyYXdzIChNTEUgaW4gcmVkKSIpCmBgYAoKIyMgQW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zCgoKIyMjIFNhbXBsaW5nIGltcG9ydGFuY2UgcmVzYW1wbGluZyAoU0lSKQoKSW1wbGVtZW50IHRoZSBTSVIgYWxnb3JpdGhtIHRvIG9idGFpbiBkcmF3cyBmcm9tIHRoZSBwb3N0ZXJpb3IgJHAoXGJldGEsXHNpZ21hXjJ8XG1ib3h7ZGF0YX0pJC4gIFlvdSBjYW4gZWl0aGVyIHVzZSB0aGUgcHJpb3IgZm9yICQoXGJldGEsXHNpZ21hXjIpJCBhcyBwcm9wb3NhbCBkZW5zaXR5IG9yIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgcHJvcG9zYWw6ICRxKFxiZXRhKSBcZXF1aXYgTigwLjcsMC4yNSkkIGFuZCAkcShcc2lnbWFeMikgXGVxdWl2IElHKDcsNSkkLgoKTm90ZTogVGhlc2UgcHJvcG9zYWwgZGVuc2l0aWVzIGFyZSBpbnNwaXJlZCBieSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBvZiB0aGUgY29ycmVzcG9uZGluZyBlc3RpbWF0b3JzLiAgUmVjYWxsIHRoYXQgdGhlIHByb3Bvc2FsIGRpc3RyaWJ1dGlvbnMgY2FuIGJlIGFueXRoaW5nIHdpdGggb3Igd2l0aG91dCB0aGUgdXNlIG9mIHRoZSBkYXRhIHNpbmNlIGl0IGlzIG5vdCBhbHRlcmluZyB0aGUgcHJpb3IgaW4gYW55IHdheS4KCiMjIyBHaWJicyBzYW1wbGVyCgpJbXBsZW1lbnQgdGhlIEdpYmJzIHNhbXBsZXIgdG8gb2J0YWluIGRyYXdzIGZyb20gdGhlIHBvc3RlcmlvciAkcChcYmV0YSxcc2lnbWFeMnxcbWJveHtkYXRhfSkkLiBDaGVjayB0aGUgbWl4aW5nIG9mIHRoZSBNYXJrb3YgY2hhaW5zIGFuZCB0aGUgY29udmVyZ2VuY2Ugb2YgdGhlIGRyYXdzIHRvIHRoZSBwb3N0ZXJpb3IuCgojIyMgTWV0cm9wb2xpcy1IYXN0aW5ncwoKUmVwZWF0IHRoZSBwcmV2aW91cyBleGVyY2lzZSwgYnV0IHJlcGxhY2UgdGhlIEdpYmJzIHNhbXBsZXIgYnkgYSBNZXRyb3BvbGlzIGFsZ29yaXRobSB3aXRoIHByb3Bvc2FscyAkcShcYmV0YSkgXGVxdWl2IE4oMC43LDAuMjUpJCBhbmQgJHEoXHNpZ21hXjIpIFxlcXVpdiBJRyg3LDUpJCwgd2hpY2ggYWxyZWFkeSBhcHBlYXIgaW4gMSkuIAoKIyMjIENvbXBhcmluZyB0aGUgcmVzdWx0cwpJZiB0aGUgdGhyZWUgYWxnb3JpdGhtcyBhcmUgcnVubmluZyBwcm9wZXJseSwgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIHRoZSBzYW1lIHVwIHRvIHNtYWxsIE1vbnRlIENhcmxvIGVycm9ycy4KCgo=