Question A MLE of
Weibull Parameters
The Weibull probability density function is:
\[
f(t;\lambda,\beta) = \frac{\beta}{\lambda}
\left(\frac{t}{\lambda}\right)^{\beta-1}
\exp\left[-\left(\frac{t}{\lambda}\right)^\beta\right]
\]
For an independent sample \(t_1, \dots,
t_n\), the log-likelihood function is:
\[
\ell(\lambda,\beta) =
n \ln \beta - n \beta \ln \lambda
+ (\beta - 1)\sum_{i=1}^n \ln t_i
- \sum_{i=1}^n \left(\frac{t_i}{\lambda}\right)^\beta
\]
The gradient components are:
\[
\frac{\partial \ell}{\partial \lambda}
=
-\frac{n\beta}{\lambda}
+
\frac{\beta}{\lambda} \sum_{i=1}^n
\left(\frac{t_i}{\lambda}\right)^\beta
\]
\[
\frac{\partial \ell}{\partial \beta}
=
\frac{n}{\beta}
- n \ln \lambda
+ \sum_{i=1}^n \ln t_i
- \sum_{i=1}^n \left(\frac{t_i}{\lambda}\right)^\beta
\ln\left(\frac{t_i}{\lambda}\right)
\]
Since no closed-form solution exists, numerical optimization is
used.
t <- c(12.4, 18.7, 25.3, 30.1, 33.5, 35.2, 38.9, 40.3, 42.7, 45.1,
47.6, 49.8, 52.4, 55.0, 57.3, 60.2, 62.8, 65.1, 67.9, 70.5,
72.3, 75.6, 78.2, 80.9, 83.4, 85.7, 88.1, 90.6, 93.2, 95.8,
98.4, 101.0, 104.5, 107.3, 110.6, 113.2, 116.8, 120.1, 123.7,
127.4, 130.9, 134.5, 138.2, 142.0, 146.3, 150.7, 155.2, 160.8,
168.4, 175.9)
n <- length(t)
# Log-likelihood function (negative for minimization)
loglik_weibull <- function(par) {
lambda <- par[1]
beta <- par[2]
if(lambda <= 0 || beta <= 0) return(Inf)
val <- n*log(beta) - n*beta*log(lambda) +
(beta - 1)*sum(log(t)) -
sum((t/lambda)^beta)
return(-val) # negative for minimization
}
# Gradient
grad_weibull <- function(par) {
lambda <- par[1]
beta <- par[2]
d_lambda <- (-n*beta/lambda) +
(beta/lambda)*sum((t/lambda)^beta)
d_beta <- n/beta - n*log(lambda) +
sum(log(t)) -
sum((t/lambda)^beta * log(t/lambda))
return(-c(d_lambda, d_beta)) # negative for minimization
}
# Initial guesses
init <- c(mean(t), 1)
# Optimization
fit <- optim(init, loglik_weibull, grad_weibull, method = "BFGS", hessian = TRUE)
lambda_hat <- fit$par[1]
beta_hat <- fit$par[2]
lambda_hat
[1] 98.95336
[1] 2.205325
Question B MLE of
Exponential Parameter \(\lambda\)
When \(\beta = 1\), the Weibull
distribution reduces to the exponential distribution:
\[
f(t;\lambda) = \frac{1}{\lambda} \exp\left(-\frac{t}{\lambda}\right)
\]
For an independent sample \(t_1, \dots,
t_n\), the log-likelihood function is:
\[
\ell(\lambda) = -n \ln \lambda - \frac{1}{\lambda}\sum_{i=1}^n t_i
\]
Taking the derivative with respect to \(\lambda\) and setting it equal to zero:
\[
\frac{d\ell}{d\lambda}
=
-\frac{n}{\lambda}
+
\frac{1}{\lambda^2}\sum_{i=1}^n t_i = 0
\]
Solving for \(\lambda\), we
obtain:
\[
\hat{\lambda} = \bar{t}
\]
# Data (reuse)
t <- c(12.4, 18.7, 25.3, 30.1, 33.5, 35.2, 38.9, 40.3, 42.7, 45.1,
47.6, 49.8, 52.4, 55.0, 57.3, 60.2, 62.8, 65.1, 67.9, 70.5,
72.3, 75.6, 78.2, 80.9, 83.4, 85.7, 88.1, 90.6, 93.2, 95.8,
98.4, 101.0, 104.5, 107.3, 110.6, 113.2, 116.8, 120.1, 123.7,
127.4, 130.9, 134.5, 138.2, 142.0, 146.3, 150.7, 155.2, 160.8,
168.4, 175.9)
# MLE of lambda for exponential distribution
lambda_hat_exp <- mean(t)
lambda_hat_exp
[1] 87.61
Question C Likelihood
Ratio \(\chi^2\) Test for \(H_0: \beta = 1\)
We test:
\[
H_0: \beta = 1 \quad \text{vs} \quad H_1: \beta \ne 1
\]
The likelihood ratio statistic is defined as:
\[
LR = 2\big[\ell(\hat{\lambda}, \hat{\beta}) - \ell(\hat{\lambda}_{H_0},
1)\big]
\]
where: - \(\ell(\hat{\lambda},
\hat{\beta})\) is the log-likelihood under the full Weibull model
- \(\ell(\hat{\lambda}_{H_0}, 1)\) is
the log-likelihood under the exponential model
By Wilks’ Theorem:
\[
LR \xrightarrow{d} \chi^2_1
\]
The p-value is computed as:
\[
p\text{-value} = P(\chi^2_1 \ge LR)
\]
# Reuse results from (a) and (b)
# theta_hat values already computed:
lambda_hat_weibull <- lambda_hat
beta_hat <- beta_hat
lambda_hat_exp <- mean(t)
n <- length(t)
# Log-likelihood for Weibull (full model)
loglik_weibull_full <- function(lambda, beta) {
n*log(beta) - n*beta*log(lambda) +
(beta - 1)*sum(log(t)) -
sum((t/lambda)^beta)
}
# Log-likelihood for exponential (beta = 1)
loglik_exp <- function(lambda) {
-n*log(lambda) - sum(t)/lambda
}
# Compute log-likelihoods
l_full <- loglik_weibull_full(lambda_hat_weibull, beta_hat)
l_restricted <- loglik_exp(lambda_hat_exp)
# Likelihood ratio statistic
LR <- 2 * (l_full - l_restricted)
# p-value
p_value <- 1 - pchisq(LR, df = 1)
p_value
[1] 4.373757e-09
Question D Wald \(\chi^2\) Test for \(H_0: \beta = 1\)
We test:
\[
H_0: \beta = 1 \quad \text{vs} \quad H_1: \beta \ne 1
\]
The Wald test statistic is given by:
\[
W = \frac{(\hat{\beta} - 1)^2}{\text{Var}(\hat{\beta})}
\]
Under \(H_0\), the statistic
follows:
\[
W \xrightarrow{d} \chi^2_1
\]
The variance of \(\hat{\beta}\) is
obtained from the covariance matrix:
\[
\text{Cov}(\hat{\lambda}, \hat{\beta}) = H^{-1}
\]
where \(H\) is the Hessian matrix
obtained from the optimization procedure.
# Extract Hessian from optimization
H <- fit$hessian
# Covariance matrix (inverse of Hessian)
cov_matrix <- solve(H)
# Variance of beta_hat (second diagonal element)
var_beta <- cov_matrix[2,2]
# Wald statistic
W <- (beta_hat - 1)^2 / var_beta
# p-value
p_value_wald <- 1 - pchisq(W, df = 1)
p_value_wald
[1] 1.54359e-06
Question E Summary,
Model Recommendation, and Density Visualization
Comparison of
Tests
Two hypothesis tests were conducted to evaluate:
\[
H_0: \beta = 1 \quad \text{vs} \quad H_1: \beta \ne 1
\]
The results are:
- Likelihood Ratio Test p-value: \(4.37
\times 10^{-9}\)
- Wald Test p-value: \(1.54 \times
10^{-6}\)
Both p-values are significantly smaller than 0.05, leading to
rejection of \(H_0\) in both cases.
Although both tests lead to the same decision, the likelihood ratio
test produces a smaller p-value, indicating stronger evidence against
the null hypothesis. This is consistent with theoretical expectations,
as the likelihood ratio test is based directly on the likelihood
function, whereas the Wald test relies on an asymptotic normal
approximation.
Model
Recommendation
The null hypothesis \(H_0: \beta =
1\) corresponds to the exponential model, which assumes a
constant hazard rate. Rejecting this hypothesis indicates that this
assumption is not supported by the data.
Since the exponential distribution is a special case of the Weibull
distribution obtained by fixing \(\beta =
1\), rejecting \(H_0\) implies
that this restriction is invalid. Therefore, the more general Weibull
model, which allows \(\beta \ne 1\),
provides a better fit to the data.
Based on the estimated value of \(\hat{\beta}\), the failure rate is not
constant over time, further supporting the use of the Weibull model.
Density Plot
To visualize the fitted distribution, we plot the Weibull density
using the maximum likelihood estimates \(\hat{\lambda}\) and \(\hat{\beta}\).
# Create sequence
t_seq <- seq(min(t), max(t), length.out = 200)
# Weibull density
weibull_density <- (beta_hat / lambda_hat_weibull) *
(t_seq / lambda_hat_weibull)^(beta_hat - 1) *
exp(-(t_seq / lambda_hat_weibull)^beta_hat)
# Set proper y-limit
y_max <- max(weibull_density)
# Plot histogram with adjusted ylim
hist(t, probability = TRUE, breaks = 10,
ylim = c(0, y_max * 1.1), # add buffer so curve fits
main = "Weibull Fit to Time-to-Failure Data",
xlab = "Time")
# Add curve
lines(t_seq, weibull_density, lwd = 2)

Interpretation of the
Distribution
The fitted Weibull density curve aligns with the observed data and
deviates from the shape expected under an exponential distribution.
Specifically, the distribution does not exhibit the constant hazard rate
implied by \(\beta = 1\).
Instead, the estimated shape parameter \(\hat{\beta}\) indicates that the failure
rate changes over time. This behavior is consistent with the rejection
of the exponential model and supports the conclusion that the Weibull
distribution provides a more appropriate model for the time-to-failure
data.
LS0tDQp0aXRsZTogJ1NUQSA1MDYgSE9NRVdPUksgMTAnDQphdXRob3I6ICdHZXJhcmQgSWtlJw0KZGF0ZTogIjIwMjYtMDQtMTQiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6ICAgICAgICAgICAgICAjIG91dHB1dCBkb2N1bWVudCBmb3JtYXQNCiAgICB0b2M6IHllcyAgICAgICAgICAgICAgICAgICMgYWRkIHRhYmxlIGNvbnRlbnRzDQogICAgdG9jX2Zsb2F0OiB5ZXMgICAgICAgICAgICAjIHRvY19wcm9wZXJ0eTogZmxvYXRpbmcNCiAgICB0b2NfZGVwdGg6IDQgICAgICAgICAgICAgICMgZGVwdGggb2YgVE9DIGhlYWRpbmdzDQogICAgZmlnX3dpZHRoOiA2ICAgICAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgd2lkdGgNCiAgICBmaWdfaGVpZ2h0OiA0ICAgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSBoZWlnaHQNCiAgICBmaWdfY2FwdGlvbjogeWVzICAgICAgICAgICMgYWRkIGZpZ3VyZSBjYXB0aW9uDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMgICAgICAjIG51bWJlcmluZyBzZWN0aW9uIGhlYWRpbmdzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzICAgICAgICAjIFRPQyBzdWJoZWFkaW5nIGNsYXBzaW5nDQogICAgY29kZV9mb2xkaW5nOiBoaWRlICAgICAgICAjIGZvbGRpbmcvc2hvd2luZyBjb2RlDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICAgICMgY29kZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzQnDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRvIGRldGVjdA0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbg0KICAgbGlicmFyeShrbml0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91ciBtYWNoaW5lLiBJZiBub3QsIGluc3RhbGwgaXQgYW5kDQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGl0IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4NCiMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgICAgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgICAgICAgIyBzdXBwcmVzcyBtZXNzYWdlcyANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgICAgICAjIHJlbW92ZSB0aGUgZGVmYXVsdCBsZWFkaW5nIGhhc2ggdGFncyBpbiB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCiMgUXVlc3Rpb24gQSBNTEUgb2YgV2VpYnVsbCBQYXJhbWV0ZXJzDQoNCg0KVGhlIFdlaWJ1bGwgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpczoNCg0KXFsNCmYodDtcbGFtYmRhLFxiZXRhKSA9IFxmcmFje1xiZXRhfXtcbGFtYmRhfSBcbGVmdChcZnJhY3t0fXtcbGFtYmRhfVxyaWdodClee1xiZXRhLTF9DQpcZXhwXGxlZnRbLVxsZWZ0KFxmcmFje3R9e1xsYW1iZGF9XHJpZ2h0KV5cYmV0YVxyaWdodF0NClxdDQoNCkZvciBhbiBpbmRlcGVuZGVudCBzYW1wbGUgXCh0XzEsIFxkb3RzLCB0X25cKSwgdGhlIGxvZy1saWtlbGlob29kIGZ1bmN0aW9uIGlzOg0KDQpcWw0KXGVsbChcbGFtYmRhLFxiZXRhKSA9DQpuIFxsbiBcYmV0YSAtIG4gXGJldGEgXGxuIFxsYW1iZGENCisgKFxiZXRhIC0gMSlcc3VtX3tpPTF9Xm4gXGxuIHRfaQ0KLSBcc3VtX3tpPTF9Xm4gXGxlZnQoXGZyYWN7dF9pfXtcbGFtYmRhfVxyaWdodCleXGJldGENClxdDQoNClRoZSBncmFkaWVudCBjb21wb25lbnRzIGFyZToNCg0KXFsNClxmcmFje1xwYXJ0aWFsIFxlbGx9e1xwYXJ0aWFsIFxsYW1iZGF9DQo9DQotXGZyYWN7blxiZXRhfXtcbGFtYmRhfQ0KKw0KXGZyYWN7XGJldGF9e1xsYW1iZGF9IFxzdW1fe2k9MX1ebiBcbGVmdChcZnJhY3t0X2l9e1xsYW1iZGF9XHJpZ2h0KV5cYmV0YQ0KXF0NCg0KXFsNClxmcmFje1xwYXJ0aWFsIFxlbGx9e1xwYXJ0aWFsIFxiZXRhfQ0KPQ0KXGZyYWN7bn17XGJldGF9DQotIG4gXGxuIFxsYW1iZGENCisgXHN1bV97aT0xfV5uIFxsbiB0X2kNCi0gXHN1bV97aT0xfV5uIFxsZWZ0KFxmcmFje3RfaX17XGxhbWJkYX1ccmlnaHQpXlxiZXRhDQpcbG5cbGVmdChcZnJhY3t0X2l9e1xsYW1iZGF9XHJpZ2h0KQ0KXF0NCg0KU2luY2Ugbm8gY2xvc2VkLWZvcm0gc29sdXRpb24gZXhpc3RzLCBudW1lcmljYWwgb3B0aW1pemF0aW9uIGlzIHVzZWQuDQoNCmBgYHtyfQ0KdCA8LSBjKDEyLjQsIDE4LjcsIDI1LjMsIDMwLjEsIDMzLjUsIDM1LjIsIDM4LjksIDQwLjMsIDQyLjcsIDQ1LjEsDQogICAgICAgNDcuNiwgNDkuOCwgNTIuNCwgNTUuMCwgNTcuMywgNjAuMiwgNjIuOCwgNjUuMSwgNjcuOSwgNzAuNSwNCiAgICAgICA3Mi4zLCA3NS42LCA3OC4yLCA4MC45LCA4My40LCA4NS43LCA4OC4xLCA5MC42LCA5My4yLCA5NS44LA0KICAgICAgIDk4LjQsIDEwMS4wLCAxMDQuNSwgMTA3LjMsIDExMC42LCAxMTMuMiwgMTE2LjgsIDEyMC4xLCAxMjMuNywNCiAgICAgICAxMjcuNCwgMTMwLjksIDEzNC41LCAxMzguMiwgMTQyLjAsIDE0Ni4zLCAxNTAuNywgMTU1LjIsIDE2MC44LA0KICAgICAgIDE2OC40LCAxNzUuOSkNCg0KbiA8LSBsZW5ndGgodCkNCg0KIyBMb2ctbGlrZWxpaG9vZCBmdW5jdGlvbiAobmVnYXRpdmUgZm9yIG1pbmltaXphdGlvbikNCmxvZ2xpa193ZWlidWxsIDwtIGZ1bmN0aW9uKHBhcikgew0KICBsYW1iZGEgPC0gcGFyWzFdDQogIGJldGEgPC0gcGFyWzJdDQogIA0KICBpZihsYW1iZGEgPD0gMCB8fCBiZXRhIDw9IDApIHJldHVybihJbmYpDQogIA0KICB2YWwgPC0gbipsb2coYmV0YSkgLSBuKmJldGEqbG9nKGxhbWJkYSkgKw0KICAgICAgICAgKGJldGEgLSAxKSpzdW0obG9nKHQpKSAtDQogICAgICAgICBzdW0oKHQvbGFtYmRhKV5iZXRhKQ0KICANCiAgcmV0dXJuKC12YWwpICAjIG5lZ2F0aXZlIGZvciBtaW5pbWl6YXRpb24NCn0NCg0KIyBHcmFkaWVudA0KZ3JhZF93ZWlidWxsIDwtIGZ1bmN0aW9uKHBhcikgew0KICBsYW1iZGEgPC0gcGFyWzFdDQogIGJldGEgPC0gcGFyWzJdDQogIA0KICBkX2xhbWJkYSA8LSAoLW4qYmV0YS9sYW1iZGEpICsNCiAgICAgICAgICAgICAgKGJldGEvbGFtYmRhKSpzdW0oKHQvbGFtYmRhKV5iZXRhKQ0KICANCiAgZF9iZXRhIDwtIG4vYmV0YSAtIG4qbG9nKGxhbWJkYSkgKw0KICAgICAgICAgICAgc3VtKGxvZyh0KSkgLQ0KICAgICAgICAgICAgc3VtKCh0L2xhbWJkYSleYmV0YSAqIGxvZyh0L2xhbWJkYSkpDQogIA0KICByZXR1cm4oLWMoZF9sYW1iZGEsIGRfYmV0YSkpICAjIG5lZ2F0aXZlIGZvciBtaW5pbWl6YXRpb24NCn0NCg0KIyBJbml0aWFsIGd1ZXNzZXMNCmluaXQgPC0gYyhtZWFuKHQpLCAxKQ0KDQojIE9wdGltaXphdGlvbg0KZml0IDwtIG9wdGltKGluaXQsIGxvZ2xpa193ZWlidWxsLCBncmFkX3dlaWJ1bGwsIG1ldGhvZCA9ICJCRkdTIiwgaGVzc2lhbiA9IFRSVUUpDQoNCmxhbWJkYV9oYXQgPC0gZml0JHBhclsxXQ0KYmV0YV9oYXQgPC0gZml0JHBhclsyXQ0KDQpsYW1iZGFfaGF0DQpiZXRhX2hhdA0KYGBgDQoNCiMgUXVlc3Rpb24gQiBNTEUgb2YgRXhwb25lbnRpYWwgUGFyYW1ldGVyIFwoXGxhbWJkYVwpDQoNCldoZW4gXChcYmV0YSA9IDFcKSwgdGhlIFdlaWJ1bGwgZGlzdHJpYnV0aW9uIHJlZHVjZXMgdG8gdGhlIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbjoNCg0KXFsNCmYodDtcbGFtYmRhKSA9IFxmcmFjezF9e1xsYW1iZGF9IFxleHBcbGVmdCgtXGZyYWN7dH17XGxhbWJkYX1ccmlnaHQpDQpcXQ0KDQpGb3IgYW4gaW5kZXBlbmRlbnQgc2FtcGxlIFwodF8xLCBcZG90cywgdF9uXCksIHRoZSBsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbiBpczoNCg0KXFsNClxlbGwoXGxhbWJkYSkgPSAtbiBcbG4gXGxhbWJkYSAtIFxmcmFjezF9e1xsYW1iZGF9XHN1bV97aT0xfV5uIHRfaQ0KXF0NCg0KVGFraW5nIHRoZSBkZXJpdmF0aXZlIHdpdGggcmVzcGVjdCB0byBcKFxsYW1iZGFcKSBhbmQgc2V0dGluZyBpdCBlcXVhbCB0byB6ZXJvOg0KDQpcWw0KXGZyYWN7ZFxlbGx9e2RcbGFtYmRhfQ0KPQ0KLVxmcmFje259e1xsYW1iZGF9DQorDQpcZnJhY3sxfXtcbGFtYmRhXjJ9XHN1bV97aT0xfV5uIHRfaSA9IDANClxdDQoNClNvbHZpbmcgZm9yIFwoXGxhbWJkYVwpLCB3ZSBvYnRhaW46DQoNClxbDQpcaGF0e1xsYW1iZGF9ID0gXGJhcnt0fQ0KXF0NCg0KYGBge3J9DQojIERhdGEgKHJldXNlKQ0KdCA8LSBjKDEyLjQsIDE4LjcsIDI1LjMsIDMwLjEsIDMzLjUsIDM1LjIsIDM4LjksIDQwLjMsIDQyLjcsIDQ1LjEsDQogICAgICAgNDcuNiwgNDkuOCwgNTIuNCwgNTUuMCwgNTcuMywgNjAuMiwgNjIuOCwgNjUuMSwgNjcuOSwgNzAuNSwNCiAgICAgICA3Mi4zLCA3NS42LCA3OC4yLCA4MC45LCA4My40LCA4NS43LCA4OC4xLCA5MC42LCA5My4yLCA5NS44LA0KICAgICAgIDk4LjQsIDEwMS4wLCAxMDQuNSwgMTA3LjMsIDExMC42LCAxMTMuMiwgMTE2LjgsIDEyMC4xLCAxMjMuNywNCiAgICAgICAxMjcuNCwgMTMwLjksIDEzNC41LCAxMzguMiwgMTQyLjAsIDE0Ni4zLCAxNTAuNywgMTU1LjIsIDE2MC44LA0KICAgICAgIDE2OC40LCAxNzUuOSkNCg0KIyBNTEUgb2YgbGFtYmRhIGZvciBleHBvbmVudGlhbCBkaXN0cmlidXRpb24NCmxhbWJkYV9oYXRfZXhwIDwtIG1lYW4odCkNCg0KbGFtYmRhX2hhdF9leHANCmBgYA0KDQojIFF1ZXN0aW9uIEMgTGlrZWxpaG9vZCBSYXRpbyBcKFxjaGleMlwpIFRlc3QgZm9yIFwoSF8wOiBcYmV0YSA9IDFcKQ0KDQpXZSB0ZXN0Og0KDQpcWw0KSF8wOiBcYmV0YSA9IDEgXHF1YWQgXHRleHR7dnN9IFxxdWFkIEhfMTogXGJldGEgXG5lIDENClxdDQoNClRoZSBsaWtlbGlob29kIHJhdGlvIHN0YXRpc3RpYyBpcyBkZWZpbmVkIGFzOg0KDQpcWw0KTFIgPSAyXGJpZ1tcZWxsKFxoYXR7XGxhbWJkYX0sIFxoYXR7XGJldGF9KSAtIFxlbGwoXGhhdHtcbGFtYmRhfV97SF8wfSwgMSlcYmlnXQ0KXF0NCg0Kd2hlcmU6DQotIFwoXGVsbChcaGF0e1xsYW1iZGF9LCBcaGF0e1xiZXRhfSlcKSBpcyB0aGUgbG9nLWxpa2VsaWhvb2QgdW5kZXIgdGhlIGZ1bGwgV2VpYnVsbCBtb2RlbA0KLSBcKFxlbGwoXGhhdHtcbGFtYmRhfV97SF8wfSwgMSlcKSBpcyB0aGUgbG9nLWxpa2VsaWhvb2QgdW5kZXIgdGhlIGV4cG9uZW50aWFsIG1vZGVsDQoNCkJ5IFdpbGtz4oCZIFRoZW9yZW06DQoNClxbDQpMUiBceHJpZ2h0YXJyb3d7ZH0gXGNoaV4yXzENClxdDQoNClRoZSBwLXZhbHVlIGlzIGNvbXB1dGVkIGFzOg0KDQpcWw0KcFx0ZXh0ey12YWx1ZX0gPSBQKFxjaGleMl8xIFxnZSBMUikNClxdDQoNCmBgYHtyfQ0KIyBSZXVzZSByZXN1bHRzIGZyb20gKGEpIGFuZCAoYikNCiMgdGhldGFfaGF0IHZhbHVlcyBhbHJlYWR5IGNvbXB1dGVkOg0KbGFtYmRhX2hhdF93ZWlidWxsIDwtIGxhbWJkYV9oYXQNCmJldGFfaGF0IDwtIGJldGFfaGF0DQoNCmxhbWJkYV9oYXRfZXhwIDwtIG1lYW4odCkNCg0KbiA8LSBsZW5ndGgodCkNCg0KIyBMb2ctbGlrZWxpaG9vZCBmb3IgV2VpYnVsbCAoZnVsbCBtb2RlbCkNCmxvZ2xpa193ZWlidWxsX2Z1bGwgPC0gZnVuY3Rpb24obGFtYmRhLCBiZXRhKSB7DQogIG4qbG9nKGJldGEpIC0gbipiZXRhKmxvZyhsYW1iZGEpICsNCiAgKGJldGEgLSAxKSpzdW0obG9nKHQpKSAtDQogIHN1bSgodC9sYW1iZGEpXmJldGEpDQp9DQoNCiMgTG9nLWxpa2VsaWhvb2QgZm9yIGV4cG9uZW50aWFsIChiZXRhID0gMSkNCmxvZ2xpa19leHAgPC0gZnVuY3Rpb24obGFtYmRhKSB7DQogIC1uKmxvZyhsYW1iZGEpIC0gc3VtKHQpL2xhbWJkYQ0KfQ0KDQojIENvbXB1dGUgbG9nLWxpa2VsaWhvb2RzDQpsX2Z1bGwgPC0gbG9nbGlrX3dlaWJ1bGxfZnVsbChsYW1iZGFfaGF0X3dlaWJ1bGwsIGJldGFfaGF0KQ0KbF9yZXN0cmljdGVkIDwtIGxvZ2xpa19leHAobGFtYmRhX2hhdF9leHApDQoNCiMgTGlrZWxpaG9vZCByYXRpbyBzdGF0aXN0aWMNCkxSIDwtIDIgKiAobF9mdWxsIC0gbF9yZXN0cmljdGVkKQ0KDQojIHAtdmFsdWUNCnBfdmFsdWUgPC0gMSAtIHBjaGlzcShMUiwgZGYgPSAxKQ0KDQpwX3ZhbHVlDQpgYGANCg0KIyBRdWVzdGlvbiBEIFdhbGQgXChcY2hpXjJcKSBUZXN0IGZvciBcKEhfMDogXGJldGEgPSAxXCkNCg0KDQpXZSB0ZXN0Og0KDQpcWw0KSF8wOiBcYmV0YSA9IDEgXHF1YWQgXHRleHR7dnN9IFxxdWFkIEhfMTogXGJldGEgXG5lIDENClxdDQoNClRoZSBXYWxkIHRlc3Qgc3RhdGlzdGljIGlzIGdpdmVuIGJ5Og0KDQpcWw0KVyA9IFxmcmFjeyhcaGF0e1xiZXRhfSAtIDEpXjJ9e1x0ZXh0e1Zhcn0oXGhhdHtcYmV0YX0pfQ0KXF0NCg0KVW5kZXIgXChIXzBcKSwgdGhlIHN0YXRpc3RpYyBmb2xsb3dzOg0KDQpcWw0KVyBceHJpZ2h0YXJyb3d7ZH0gXGNoaV4yXzENClxdDQoNClRoZSB2YXJpYW5jZSBvZiBcKFxoYXR7XGJldGF9XCkgaXMgb2J0YWluZWQgZnJvbSB0aGUgY292YXJpYW5jZSBtYXRyaXg6DQoNClxbDQpcdGV4dHtDb3Z9KFxoYXR7XGxhbWJkYX0sIFxoYXR7XGJldGF9KSA9IEheey0xfQ0KXF0NCg0Kd2hlcmUgXChIXCkgaXMgdGhlIEhlc3NpYW4gbWF0cml4IG9idGFpbmVkIGZyb20gdGhlIG9wdGltaXphdGlvbiBwcm9jZWR1cmUuDQoNCmBgYHtyfQ0KIyBFeHRyYWN0IEhlc3NpYW4gZnJvbSBvcHRpbWl6YXRpb24NCkggPC0gZml0JGhlc3NpYW4NCg0KIyBDb3ZhcmlhbmNlIG1hdHJpeCAoaW52ZXJzZSBvZiBIZXNzaWFuKQ0KY292X21hdHJpeCA8LSBzb2x2ZShIKQ0KDQojIFZhcmlhbmNlIG9mIGJldGFfaGF0IChzZWNvbmQgZGlhZ29uYWwgZWxlbWVudCkNCnZhcl9iZXRhIDwtIGNvdl9tYXRyaXhbMiwyXQ0KDQojIFdhbGQgc3RhdGlzdGljDQpXIDwtIChiZXRhX2hhdCAtIDEpXjIgLyB2YXJfYmV0YQ0KDQojIHAtdmFsdWUNCnBfdmFsdWVfd2FsZCA8LSAxIC0gcGNoaXNxKFcsIGRmID0gMSkNCg0KcF92YWx1ZV93YWxkDQpgYGANCg0KDQojIFF1ZXN0aW9uIEUgU3VtbWFyeSwgTW9kZWwgUmVjb21tZW5kYXRpb24sIGFuZCBEZW5zaXR5IFZpc3VhbGl6YXRpb24NCg0KIyMgQ29tcGFyaXNvbiBvZiBUZXN0cw0KDQpUd28gaHlwb3RoZXNpcyB0ZXN0cyB3ZXJlIGNvbmR1Y3RlZCB0byBldmFsdWF0ZToNCg0KXFsNCkhfMDogXGJldGEgPSAxIFxxdWFkIFx0ZXh0e3ZzfSBccXVhZCBIXzE6IFxiZXRhIFxuZSAxDQpcXQ0KDQpUaGUgcmVzdWx0cyBhcmU6DQoNCi0gTGlrZWxpaG9vZCBSYXRpbyBUZXN0IHAtdmFsdWU6IFwoNC4zNyBcdGltZXMgMTBeey05fVwpDQotIFdhbGQgVGVzdCBwLXZhbHVlOiBcKDEuNTQgXHRpbWVzIDEwXnstNn1cKQ0KDQpCb3RoIHAtdmFsdWVzIGFyZSBzaWduaWZpY2FudGx5IHNtYWxsZXIgdGhhbiAwLjA1LCBsZWFkaW5nIHRvIHJlamVjdGlvbiBvZiBcKEhfMFwpIGluIGJvdGggY2FzZXMuDQoNCkFsdGhvdWdoIGJvdGggdGVzdHMgbGVhZCB0byB0aGUgc2FtZSBkZWNpc2lvbiwgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBwcm9kdWNlcyBhIHNtYWxsZXIgcC12YWx1ZSwgaW5kaWNhdGluZyBzdHJvbmdlciBldmlkZW5jZSBhZ2FpbnN0IHRoZSBudWxsIGh5cG90aGVzaXMuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZW9yZXRpY2FsIGV4cGVjdGF0aW9ucywgYXMgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBpcyBiYXNlZCBkaXJlY3RseSBvbiB0aGUgbGlrZWxpaG9vZCBmdW5jdGlvbiwgd2hlcmVhcyB0aGUgV2FsZCB0ZXN0IHJlbGllcyBvbiBhbiBhc3ltcHRvdGljIG5vcm1hbCBhcHByb3hpbWF0aW9uLg0KDQotLS0NCg0KIyMgTW9kZWwgUmVjb21tZW5kYXRpb24NCg0KVGhlIG51bGwgaHlwb3RoZXNpcyBcKEhfMDogXGJldGEgPSAxXCkgY29ycmVzcG9uZHMgdG8gdGhlIGV4cG9uZW50aWFsIG1vZGVsLCB3aGljaCBhc3N1bWVzIGEgY29uc3RhbnQgaGF6YXJkIHJhdGUuIFJlamVjdGluZyB0aGlzIGh5cG90aGVzaXMgaW5kaWNhdGVzIHRoYXQgdGhpcyBhc3N1bXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGRhdGEuDQoNClNpbmNlIHRoZSBleHBvbmVudGlhbCBkaXN0cmlidXRpb24gaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIFdlaWJ1bGwgZGlzdHJpYnV0aW9uIG9idGFpbmVkIGJ5IGZpeGluZyBcKFxiZXRhID0gMVwpLCByZWplY3RpbmcgXChIXzBcKSBpbXBsaWVzIHRoYXQgdGhpcyByZXN0cmljdGlvbiBpcyBpbnZhbGlkLiBUaGVyZWZvcmUsIHRoZSBtb3JlIGdlbmVyYWwgV2VpYnVsbCBtb2RlbCwgd2hpY2ggYWxsb3dzIFwoXGJldGEgXG5lIDFcKSwgcHJvdmlkZXMgYSBiZXR0ZXIgZml0IHRvIHRoZSBkYXRhLg0KDQpCYXNlZCBvbiB0aGUgZXN0aW1hdGVkIHZhbHVlIG9mIFwoXGhhdHtcYmV0YX1cKSwgdGhlIGZhaWx1cmUgcmF0ZSBpcyBub3QgY29uc3RhbnQgb3ZlciB0aW1lLCBmdXJ0aGVyIHN1cHBvcnRpbmcgdGhlIHVzZSBvZiB0aGUgV2VpYnVsbCBtb2RlbC4NCg0KLS0tDQoNCiMjIERlbnNpdHkgUGxvdA0KDQpUbyB2aXN1YWxpemUgdGhlIGZpdHRlZCBkaXN0cmlidXRpb24sIHdlIHBsb3QgdGhlIFdlaWJ1bGwgZGVuc2l0eSB1c2luZyB0aGUgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRlcyBcKFxoYXR7XGxhbWJkYX1cKSBhbmQgXChcaGF0e1xiZXRhfVwpLg0KDQpgYGB7ciwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9Nn0NCiMgQ3JlYXRlIHNlcXVlbmNlDQp0X3NlcSA8LSBzZXEobWluKHQpLCBtYXgodCksIGxlbmd0aC5vdXQgPSAyMDApDQoNCiMgV2VpYnVsbCBkZW5zaXR5DQp3ZWlidWxsX2RlbnNpdHkgPC0gKGJldGFfaGF0IC8gbGFtYmRhX2hhdF93ZWlidWxsKSAqDQogICAgICAgICAgICAgICAgICAgKHRfc2VxIC8gbGFtYmRhX2hhdF93ZWlidWxsKV4oYmV0YV9oYXQgLSAxKSAqDQogICAgICAgICAgICAgICAgICAgZXhwKC0odF9zZXEgLyBsYW1iZGFfaGF0X3dlaWJ1bGwpXmJldGFfaGF0KQ0KDQojIFNldCBwcm9wZXIgeS1saW1pdA0KeV9tYXggPC0gbWF4KHdlaWJ1bGxfZGVuc2l0eSkNCg0KIyBQbG90IGhpc3RvZ3JhbSB3aXRoIGFkanVzdGVkIHlsaW0NCmhpc3QodCwgcHJvYmFiaWxpdHkgPSBUUlVFLCBicmVha3MgPSAxMCwNCiAgICAgeWxpbSA9IGMoMCwgeV9tYXggKiAxLjEpLCAgICMgYWRkIGJ1ZmZlciBzbyBjdXJ2ZSBmaXRzDQogICAgIG1haW4gPSAiV2VpYnVsbCBGaXQgdG8gVGltZS10by1GYWlsdXJlIERhdGEiLA0KICAgICB4bGFiID0gIlRpbWUiKQ0KDQojIEFkZCBjdXJ2ZQ0KbGluZXModF9zZXEsIHdlaWJ1bGxfZGVuc2l0eSwgbHdkID0gMikNCmBgYA0KDQojIyBJbnRlcnByZXRhdGlvbiBvZiB0aGUgRGlzdHJpYnV0aW9uDQoNClRoZSBmaXR0ZWQgV2VpYnVsbCBkZW5zaXR5IGN1cnZlIGFsaWducyB3aXRoIHRoZSBvYnNlcnZlZCBkYXRhIGFuZCBkZXZpYXRlcyBmcm9tIHRoZSBzaGFwZSBleHBlY3RlZCB1bmRlciBhbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb24uIFNwZWNpZmljYWxseSwgdGhlIGRpc3RyaWJ1dGlvbiBkb2VzIG5vdCBleGhpYml0IHRoZSBjb25zdGFudCBoYXphcmQgcmF0ZSBpbXBsaWVkIGJ5IFwoXGJldGEgPSAxXCkuDQoNCkluc3RlYWQsIHRoZSBlc3RpbWF0ZWQgc2hhcGUgcGFyYW1ldGVyIFwoXGhhdHtcYmV0YX1cKSBpbmRpY2F0ZXMgdGhhdCB0aGUgZmFpbHVyZSByYXRlIGNoYW5nZXMgb3ZlciB0aW1lLiBUaGlzIGJlaGF2aW9yIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVqZWN0aW9uIG9mIHRoZSBleHBvbmVudGlhbCBtb2RlbCBhbmQgc3VwcG9ydHMgdGhlIGNvbmNsdXNpb24gdGhhdCB0aGUgV2VpYnVsbCBkaXN0cmlidXRpb24gcHJvdmlkZXMgYSBtb3JlIGFwcHJvcHJpYXRlIG1vZGVsIGZvciB0aGUgdGltZS10by1mYWlsdXJlIGRhdGEu