Assignment Objectives

  • Master the fundamental concepts of point estimation and performance metrics

  • Understand the theoretical foundation of the method of moments estimator (MME)

  • Implement MME in R, incorporating numerical approximation methods


Use of AI Tools

Policy on AI Tool Use: Students must adhere to the AI tool policy specified in the course syllabus. The direct copying of AI-generated content is strictly prohibited. All submitted work must reflect your own understanding; where external tools are consulted, content must be thoroughly rephrased and synthesized in your own words.

Code Inclusion Requirement: Any code included in your essay must be properly commented to explain the purpose and/or expected output of key code lines. Submitting AI-generated code without meaningful, student-added comments will not be accepted.


Log-logistic Distribution

The log-logistic distribution (also known as the Fisk distribution) is a continuous probability distribution that is particularly useful in contexts where data exhibit non-negative, skewed behavior and where the hazard rate is unimodal (increases to a peak and then decreases). It has been widely used in the areas such as survival analysis and reliability engineering, environmental science, economics, pharmacology, finance and risk management, etc.

For given shape parameter \(\beta\) and scale parameter \(\alpha\), the cumulative distribution function

\[ F(x) = \frac{1}{1+(x/\alpha)^{-\beta}} \]

As an exercise, you can derive the density in the following form

\[ f(x) = \frac{(\beta/\alpha)(x/\alpha)^{\beta-1}}{[1+(x/\alpha)^\beta]^2}, \ \ \text{ for } \ \ x > 0. \]

After some algebra, we can find the \(k\)th moment

\[ \mu_k = E[X^k] = \alpha^k B\left(1+\frac{k}{\beta}, 1 - \frac{k}{\beta} \right). \]

This assignment will focus on finding MME of parameters \(\alpha\) and \(\beta\) based on a real-world application data set.


Question 1: Derive the log-logistic density function

Given the CDF of the two-parameter log-logistic distribution

\[ F(x) = \frac{1}{1+(x/\alpha)^{-\beta}}. \]

Step 1: Rewrite the CDF

Using exponent rules:

\[ (x/\alpha)^{-\beta} = (\alpha/x)^{\beta} \] So we rewrite the CDF as:

\[ F(x) = \left[1 + (\alpha/x)^{\beta}\right]^{-1} \] Let:

\[ g(x) = 1 + (\alpha/x)^{\beta} \]

Then:

\[ F(x) = [g(x)]^{-1} \]

Step 2: Differentiate the CDF using Chain Rule

The probability density function is:

\[ f(x) = \frac{d}{dx} F(x) \] Using the chain rule:

\[ \frac{d}{dx}[g(x)]^{-1} = -g(x)^{-2} g'(x) \]

Step 3: Compute \(g'(x)\)

First rewrite:

\[ (\alpha/x)^{\beta} = \alpha^{\beta} x^{-\beta} \] Differentiate:

\[ \frac{d}{dx} \left(\alpha^{\beta} x^{-\beta}\right) = \alpha^{\beta}(-\beta)x^{-\beta-1} \] So:

\[ g'(x) = -\beta \alpha^{\beta} x^{-\beta-1} \]

Step 4: Substitute into the Chain Rule

\[ f(x) = - \left[1 + (\alpha/x)^{\beta}\right]^{-2} \left(-\beta \alpha^{\beta} x^{-\beta-1}\right) \]

The negatives cancel:

\[ f(x) = \beta \alpha^{\beta} x^{-\beta-1} \left[1 + (\alpha/x)^{\beta}\right]^{-2} \]

Standard Form

After algebraic simplification and differentiating with respect to x, we are able to see how the density function becomes:

\[ f(x) = \frac{(\beta/\alpha)(x/\alpha)^{\beta-1}}{[1+(x/\alpha)^\beta]^2} , x > 0 \]

Question 2: Distribution of Recovery Time from A Surgery

Time to recovery (in days) after a specific knee surgery procedure. This follows a typical log-logistic pattern in medical survival/recovery analysis:

8.23, 12.74, 14.83, 16.61, 18.16, 19.55, 20.80, 21.94, 23.00, 23.98, 24.89, 25.75, 26.56, 
27.34, 28.08, 28.79, 29.48, 30.15, 30.81, 31.45, 32.08, 32.70, 33.31, 33.92, 34.53, 35.13, 
35.73, 36.33, 36.93, 37.53, 38.14, 38.75, 39.37, 40.00, 40.64, 41.29, 41.95, 42.63, 43.33, 
44.05, 44.79, 45.56, 46.36, 47.20, 48.08, 49.02, 50.03, 51.12, 52.32, 53.65

Based on the above data to perform the following analysis.

  1. Using method of moment estimation to estimate \(\alpha\) and \(\beta\), denoted by \(\hat{\alpha}\) and \(\hat{\beta}\), respectively.
# Data
x <- c(
8.23, 12.74, 14.83, 16.61, 18.16, 19.55, 20.80, 21.94, 23.00, 23.98,
24.89, 25.75, 26.56, 27.34, 28.08, 28.79, 29.48, 30.15, 30.81, 31.45,
32.08, 32.70, 33.31, 33.92, 34.53, 35.13, 35.73, 36.33, 36.93, 37.53,
38.14, 38.75, 39.37, 40.00, 40.64, 41.29, 41.95, 42.63, 43.33, 44.05,
44.79, 45.56, 46.36, 47.20, 48.08, 49.02, 50.03, 51.12, 52.32, 53.65
)

n <- length(x)

# Compute sample moments
m <- mean(x)
s2 <- var(x)

m
[1] 34.1922
s2
[1] 122.1819
# Beta
moment_eq <- function(beta){
  
  A <- (pi/beta)/sin(pi/beta)
  B <- (2*pi/beta)/sin(2*pi/beta)
  
  alpha <- m / A
  
  theoretical_var <- alpha^2 * (B - A^2)
  
  theoretical_var - s2
}

beta_hat <- uniroot(moment_eq, interval = c(2.01, 20))$root

beta_hat
[1] 5.95252
# Alpha 
alpha_hat <- m * sin(pi/beta_hat)/(pi/beta_hat)

alpha_hat
[1] 32.62681
  1. Since the moment estimates \(\hat{\alpha}\) and \(\hat{\beta}\) are random, construct bootstrap sampling distributions for each. To visualize these distributions, plot separate bootstrap histograms for \(\hat{\alpha}\) and \(\hat{\beta}\). Then, overlay a smooth density curve on each histogram using Gaussian kernel density estimation. Finally, describe the patterns of these density curves.
# Bootstrap Sampling Distributions
set.seed(1)

B <- 2000

alpha_boot <- numeric(B)
beta_boot  <- numeric(B)

for(i in 1:B){
  
  xb <- sample(x, n, replace = TRUE)
  
  m_b <- mean(xb)
  s2_b <- var(xb)
  
  moment_eq_boot <- function(beta){
    
    A <- (pi/beta)/sin(pi/beta)
    Bterm <- (2*pi/beta)/sin(2*pi/beta)
    
    alpha <- m_b / A
    
    theoretical_var <- alpha^2 * (Bterm - A^2)
    
    theoretical_var - s2_b
  }
  
  beta_hat_b <- tryCatch(
    uniroot(moment_eq_boot, interval = c(2.01, 20))$root,
    error = function(e) NA
  )
  
  if(!is.na(beta_hat_b)){
    alpha_hat_b <- m_b * sin(pi/beta_hat_b)/(pi/beta_hat_b)
  } else {
    alpha_hat_b <- NA
  }
  
  alpha_boot[i] <- alpha_hat_b
  beta_boot[i]  <- beta_hat_b
}

alpha_boot <- na.omit(alpha_boot)
beta_boot  <- na.omit(beta_boot)

# Bootstrap Histogram for Alpha
hist(alpha_boot,
     probability = TRUE,
     main = expression("Bootstrap Distribution of " * hat(alpha)),
     xlab = expression(hat(alpha)))

lines(density(alpha_boot), lwd = 2)

# Bootstrap Histogram for Beta
hist(beta_boot,
     probability = TRUE,
     main = expression("Bootstrap Distribution of " * hat(beta)),
     xlab = expression(hat(beta)))

lines(density(beta_boot), lwd = 2)

The bootstrap distribution of the scale estimator of \(\alpha\) and \(\beta\) are both symmetric and unimodal and shows that bootstrap resampling provides a accurate approximation of the estimators’ sampling variability.

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMzogTWV0aG9kcyBvZiBNb21lbnQgRXN0aW1hdGlvbiINCmF1dGhvcjogIktpZXJhbiBIZWZmZXJhbiAiDQpkYXRlOiAiIER1ZTogMi8yNC8yNiAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzIA0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICJUYWJsZSBvZiBDb250ZW50cyI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXNpemU6IDEuMmVtOw0KICBkaXNwbGF5OiBibG9jazsNCiAgY29sb3I6IG5hdnk7DQogIG1hcmdpbi1ib3R0b206IDEwcHg7DQp9DQoNCg0KZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDIycHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMTVweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBuYXZ5Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQp9DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KICBsaWJyYXJ5KGdncGxvdDIpDQp9DQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KDQppZiAoIXJlcXVpcmUoInBsb3RseSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogIGxpYnJhcnkocGxvdGx5KQ0KfQ0KIyMjIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANCiANCiBcDQogDQojIyAqKkFzc2lnbm1lbnQgT2JqZWN0aXZlcyoqIA0KDQoqIE1hc3RlciB0aGUgZnVuZGFtZW50YWwgY29uY2VwdHMgb2YgcG9pbnQgZXN0aW1hdGlvbiBhbmQgcGVyZm9ybWFuY2UgbWV0cmljcw0KDQoqIFVuZGVyc3RhbmQgdGhlIHRoZW9yZXRpY2FsIGZvdW5kYXRpb24gb2YgdGhlIG1ldGhvZCBvZiBtb21lbnRzIGVzdGltYXRvciAoTU1FKQ0KDQoqIEltcGxlbWVudCBNTUUgaW4gUiwgaW5jb3Jwb3JhdGluZyBudW1lcmljYWwgYXBwcm94aW1hdGlvbiBtZXRob2RzDQoNClwNCg0KKipVc2Ugb2YgQUkgVG9vbHMqKg0KDQoqKlBvbGljeSBvbiBBSSBUb29sIFVzZSoqOiBTdHVkZW50cyBtdXN0IGFkaGVyZSB0byB0aGUgQUkgdG9vbCBwb2xpY3kgc3BlY2lmaWVkIGluIHRoZSBjb3Vyc2Ugc3lsbGFidXMuIFRoZSBkaXJlY3QgY29weWluZyBvZiBBSS1nZW5lcmF0ZWQgY29udGVudCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLiBBbGwgc3VibWl0dGVkIHdvcmsgbXVzdCByZWZsZWN0IHlvdXIgb3duIHVuZGVyc3RhbmRpbmc7IHdoZXJlIGV4dGVybmFsIHRvb2xzIGFyZSBjb25zdWx0ZWQsIGNvbnRlbnQgbXVzdCBiZSB0aG9yb3VnaGx5IHJlcGhyYXNlZCBhbmQgc3ludGhlc2l6ZWQgaW4geW91ciBvd24gd29yZHMuDQoNCioqQ29kZSBJbmNsdXNpb24gUmVxdWlyZW1lbnQqKjogQW55IGNvZGUgaW5jbHVkZWQgaW4geW91ciBlc3NheSBtdXN0IGJlIHByb3Blcmx5IGNvbW1lbnRlZCB0byBleHBsYWluIHRoZSBwdXJwb3NlIGFuZC9vciBleHBlY3RlZCBvdXRwdXQgb2Yga2V5IGNvZGUgbGluZXMuIFN1Ym1pdHRpbmcgQUktZ2VuZXJhdGVkIGNvZGUgd2l0aG91dCBtZWFuaW5nZnVsLCBzdHVkZW50LWFkZGVkIGNvbW1lbnRzIHdpbGwgbm90IGJlIGFjY2VwdGVkLg0KDQpcDQoNCioqTG9nLWxvZ2lzdGljIERpc3RyaWJ1dGlvbioqDQoNClRoZSBsb2ctbG9naXN0aWMgZGlzdHJpYnV0aW9uIChhbHNvIGtub3duIGFzIHRoZSBGaXNrIGRpc3RyaWJ1dGlvbikgaXMgYSBjb250aW51b3VzIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiB0aGF0IGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gY29udGV4dHMgd2hlcmUgZGF0YSBleGhpYml0IG5vbi1uZWdhdGl2ZSwgc2tld2VkIGJlaGF2aW9yIGFuZCB3aGVyZSB0aGUgaGF6YXJkIHJhdGUgaXMgdW5pbW9kYWwgKGluY3JlYXNlcyB0byBhIHBlYWsgYW5kIHRoZW4gZGVjcmVhc2VzKS4gSXQgaGFzIGJlZW4gd2lkZWx5IHVzZWQgaW4gdGhlIGFyZWFzIHN1Y2ggYXMgc3Vydml2YWwgYW5hbHlzaXMgYW5kIHJlbGlhYmlsaXR5IGVuZ2luZWVyaW5nLCBlbnZpcm9ubWVudGFsIHNjaWVuY2UsIGVjb25vbWljcywgcGhhcm1hY29sb2d5LCBmaW5hbmNlIGFuZCByaXNrIG1hbmFnZW1lbnQsIGV0Yy4gDQoNCkZvciBnaXZlbiBzaGFwZSBwYXJhbWV0ZXIgJFxiZXRhJCBhbmQgc2NhbGUgcGFyYW1ldGVyICRcYWxwaGEkLCB0aGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24NCg0KJCQNCkYoeCkgPSBcZnJhY3sxfXsxKyh4L1xhbHBoYSleey1cYmV0YX19DQokJA0KDQpBcyBhbiBleGVyY2lzZSwgeW91IGNhbiBkZXJpdmUgdGhlIGRlbnNpdHkgaW4gdGhlIGZvbGxvd2luZyBmb3JtDQoNCiQkDQpmKHgpID0gXGZyYWN7KFxiZXRhL1xhbHBoYSkoeC9cYWxwaGEpXntcYmV0YS0xfX17WzErKHgvXGFscGhhKV5cYmV0YV1eMn0sIFwgXCBcdGV4dHsgZm9yIH0gXCBcIHggPiAwLg0KJCQNCg0KQWZ0ZXIgc29tZSBhbGdlYnJhLCB3ZSBjYW4gZmluZCB0aGUgJGskdGggbW9tZW50DQoNCiQkDQpcbXVfayA9IEVbWF5rXSA9IFxhbHBoYV5rIEJcbGVmdCgxK1xmcmFje2t9e1xiZXRhfSwgMSAtIFxmcmFje2t9e1xiZXRhfSBccmlnaHQpLg0KJCQNCg0KVGhpcyBhc3NpZ25tZW50IHdpbGwgZm9jdXMgb24gZmluZGluZyBNTUUgb2YgcGFyYW1ldGVycyAkXGFscGhhJCBhbmQgJFxiZXRhJCBiYXNlZCBvbiBhIHJlYWwtd29ybGQgYXBwbGljYXRpb24gZGF0YSBzZXQuDQoNCg0KXA0KDQojIyAqKlF1ZXN0aW9uIDE6IERlcml2ZSB0aGUgbG9nLWxvZ2lzdGljIGRlbnNpdHkgZnVuY3Rpb24gKioNCg0KR2l2ZW4gdGhlIENERiBvZiB0aGUgdHdvLXBhcmFtZXRlciBsb2ctbG9naXN0aWMgZGlzdHJpYnV0aW9uDQoNCiQkDQpGKHgpID0gXGZyYWN7MX17MSsoeC9cYWxwaGEpXnstXGJldGF9fS4NCiQkDQpcDQoNCiMjIyBTdGVwIDE6IFJld3JpdGUgdGhlIENERg0KDQpVc2luZyBleHBvbmVudCBydWxlczoNCg0KJCQNCih4L1xhbHBoYSleey1cYmV0YX0gPSAoXGFscGhhL3gpXntcYmV0YX0NCiQkDQpTbyB3ZSByZXdyaXRlIHRoZSBDREYgYXM6DQoNCiQkDQpGKHgpID0gXGxlZnRbMSArIChcYWxwaGEveClee1xiZXRhfVxyaWdodF1eey0xfQ0KJCQNCkxldDoNCg0KJCQNCmcoeCkgPSAxICsgKFxhbHBoYS94KV57XGJldGF9DQokJA0KDQpUaGVuOg0KDQokJA0KRih4KSA9IFtnKHgpXV57LTF9DQokJA0KDQojIyMgU3RlcCAyOiBEaWZmZXJlbnRpYXRlIHRoZSBDREYgdXNpbmcgQ2hhaW4gUnVsZQ0KDQpUaGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpczoNCg0KJCQNCmYoeCkgPSBcZnJhY3tkfXtkeH0gRih4KQ0KJCQNClVzaW5nIHRoZSBjaGFpbiBydWxlOg0KDQokJA0KXGZyYWN7ZH17ZHh9W2coeCldXnstMX0gPSAtZyh4KV57LTJ9IGcnKHgpDQokJA0KDQojIyMgU3RlcCAzOiBDb21wdXRlIFwoIGcnKHgpIFwpDQoNCkZpcnN0IHJld3JpdGU6DQoNCiQkDQooXGFscGhhL3gpXntcYmV0YX0gPSBcYWxwaGFee1xiZXRhfSB4XnstXGJldGF9DQokJA0KRGlmZmVyZW50aWF0ZToNCg0KJCQNClxmcmFje2R9e2R4fSBcbGVmdChcYWxwaGFee1xiZXRhfSB4XnstXGJldGF9XHJpZ2h0KQ0KPQ0KXGFscGhhXntcYmV0YX0oLVxiZXRhKXheey1cYmV0YS0xfQ0KJCQNClNvOg0KDQokJA0KZycoeCkgPSAtXGJldGEgXGFscGhhXntcYmV0YX0geF57LVxiZXRhLTF9DQokJA0KDQoNCiMjIyBTdGVwIDQ6IFN1YnN0aXR1dGUgaW50byB0aGUgQ2hhaW4gUnVsZQ0KDQokJA0KZih4KQ0KPQ0KLSBcbGVmdFsxICsgKFxhbHBoYS94KV57XGJldGF9XHJpZ2h0XV57LTJ9DQpcbGVmdCgtXGJldGEgXGFscGhhXntcYmV0YX0geF57LVxiZXRhLTF9XHJpZ2h0KQ0KJCQNCg0KVGhlIG5lZ2F0aXZlcyBjYW5jZWw6DQoNCiQkDQpmKHgpDQo9DQpcYmV0YSBcYWxwaGFee1xiZXRhfSB4XnstXGJldGEtMX0NClxsZWZ0WzEgKyAoXGFscGhhL3gpXntcYmV0YX1ccmlnaHRdXnstMn0NCiQkDQoNCiMjIyBTdGFuZGFyZCBGb3JtDQoNCkFmdGVyIGFsZ2VicmFpYyBzaW1wbGlmaWNhdGlvbiBhbmQgZGlmZmVyZW50aWF0aW5nIHdpdGggcmVzcGVjdCB0byB4LCB3ZSBhcmUgYWJsZSB0byBzZWUgaG93IHRoZSBkZW5zaXR5IGZ1bmN0aW9uIGJlY29tZXM6DQoNCiQkDQpmKHgpID0gXGZyYWN7KFxiZXRhL1xhbHBoYSkoeC9cYWxwaGEpXntcYmV0YS0xfX17WzErKHgvXGFscGhhKV5cYmV0YV1eMn0gLCB4ID4gMA0KJCQNCg0KIyMgKipRdWVzdGlvbiAyOiBEaXN0cmlidXRpb24gb2YgUmVjb3ZlcnkgVGltZSBmcm9tIEEgU3VyZ2VyeSoqDQoNClRpbWUgdG8gcmVjb3ZlcnkgKGluIGRheXMpIGFmdGVyIGEgc3BlY2lmaWMga25lZSBzdXJnZXJ5IHByb2NlZHVyZS4gVGhpcyBmb2xsb3dzIGEgdHlwaWNhbCAqKmxvZy1sb2dpc3RpYyBwYXR0ZXJuKiogaW4gbWVkaWNhbCBzdXJ2aXZhbC9yZWNvdmVyeSBhbmFseXNpczoNCg0KYGBgDQo4LjIzLCAxMi43NCwgMTQuODMsIDE2LjYxLCAxOC4xNiwgMTkuNTUsIDIwLjgwLCAyMS45NCwgMjMuMDAsIDIzLjk4LCAyNC44OSwgMjUuNzUsIDI2LjU2LCANCjI3LjM0LCAyOC4wOCwgMjguNzksIDI5LjQ4LCAzMC4xNSwgMzAuODEsIDMxLjQ1LCAzMi4wOCwgMzIuNzAsIDMzLjMxLCAzMy45MiwgMzQuNTMsIDM1LjEzLCANCjM1LjczLCAzNi4zMywgMzYuOTMsIDM3LjUzLCAzOC4xNCwgMzguNzUsIDM5LjM3LCA0MC4wMCwgNDAuNjQsIDQxLjI5LCA0MS45NSwgNDIuNjMsIDQzLjMzLCANCjQ0LjA1LCA0NC43OSwgNDUuNTYsIDQ2LjM2LCA0Ny4yMCwgNDguMDgsIDQ5LjAyLCA1MC4wMywgNTEuMTIsIDUyLjMyLCA1My42NQ0KYGBgDQpCYXNlZCBvbiB0aGUgYWJvdmUgZGF0YSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYW5hbHlzaXMuDQoNCmEpIFVzaW5nIG1ldGhvZCBvZiBtb21lbnQgZXN0aW1hdGlvbiB0byBlc3RpbWF0ZSAkXGFscGhhJCBhbmQgJFxiZXRhJCwgZGVub3RlZCBieSAkXGhhdHtcYWxwaGF9JCBhbmQgJFxoYXR7XGJldGF9JCwgcmVzcGVjdGl2ZWx5LiANCg0KYGBge3J9DQojIERhdGENCnggPC0gYygNCjguMjMsIDEyLjc0LCAxNC44MywgMTYuNjEsIDE4LjE2LCAxOS41NSwgMjAuODAsIDIxLjk0LCAyMy4wMCwgMjMuOTgsDQoyNC44OSwgMjUuNzUsIDI2LjU2LCAyNy4zNCwgMjguMDgsIDI4Ljc5LCAyOS40OCwgMzAuMTUsIDMwLjgxLCAzMS40NSwNCjMyLjA4LCAzMi43MCwgMzMuMzEsIDMzLjkyLCAzNC41MywgMzUuMTMsIDM1LjczLCAzNi4zMywgMzYuOTMsIDM3LjUzLA0KMzguMTQsIDM4Ljc1LCAzOS4zNywgNDAuMDAsIDQwLjY0LCA0MS4yOSwgNDEuOTUsIDQyLjYzLCA0My4zMywgNDQuMDUsDQo0NC43OSwgNDUuNTYsIDQ2LjM2LCA0Ny4yMCwgNDguMDgsIDQ5LjAyLCA1MC4wMywgNTEuMTIsIDUyLjMyLCA1My42NQ0KKQ0KDQpuIDwtIGxlbmd0aCh4KQ0KDQojIENvbXB1dGUgc2FtcGxlIG1vbWVudHMNCm0gPC0gbWVhbih4KQ0KczIgPC0gdmFyKHgpDQoNCm0NCnMyDQoNCiMgQmV0YQ0KbW9tZW50X2VxIDwtIGZ1bmN0aW9uKGJldGEpew0KICANCiAgQSA8LSAocGkvYmV0YSkvc2luKHBpL2JldGEpDQogIEIgPC0gKDIqcGkvYmV0YSkvc2luKDIqcGkvYmV0YSkNCiAgDQogIGFscGhhIDwtIG0gLyBBDQogIA0KICB0aGVvcmV0aWNhbF92YXIgPC0gYWxwaGFeMiAqIChCIC0gQV4yKQ0KICANCiAgdGhlb3JldGljYWxfdmFyIC0gczINCn0NCg0KYmV0YV9oYXQgPC0gdW5pcm9vdChtb21lbnRfZXEsIGludGVydmFsID0gYygyLjAxLCAyMCkpJHJvb3QNCg0KYmV0YV9oYXQNCg0KIyBBbHBoYSANCmFscGhhX2hhdCA8LSBtICogc2luKHBpL2JldGFfaGF0KS8ocGkvYmV0YV9oYXQpDQoNCmFscGhhX2hhdA0KYGBgDQoNCmIpIFNpbmNlIHRoZSBtb21lbnQgZXN0aW1hdGVzICRcaGF0e1xhbHBoYX0kIGFuZCAkXGhhdHtcYmV0YX0kIGFyZSByYW5kb20sIGNvbnN0cnVjdCBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmb3IgZWFjaC4gVG8gdmlzdWFsaXplIHRoZXNlIGRpc3RyaWJ1dGlvbnMsIHBsb3Qgc2VwYXJhdGUgYm9vdHN0cmFwIGhpc3RvZ3JhbXMgZm9yICRcaGF0e1xhbHBoYX0kIGFuZCAkXGhhdHtcYmV0YX0kLiAgVGhlbiwgb3ZlcmxheSBhIHNtb290aCBkZW5zaXR5IGN1cnZlIG9uIGVhY2ggaGlzdG9ncmFtIHVzaW5nIEdhdXNzaWFuIGtlcm5lbCBkZW5zaXR5IGVzdGltYXRpb24uIEZpbmFsbHksIGRlc2NyaWJlIHRoZSBwYXR0ZXJucyBvZiB0aGVzZSBkZW5zaXR5IGN1cnZlcy4NCg0KYGBge3J9DQojIEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb25zDQpzZXQuc2VlZCgxKQ0KDQpCIDwtIDIwMDANCg0KYWxwaGFfYm9vdCA8LSBudW1lcmljKEIpDQpiZXRhX2Jvb3QgIDwtIG51bWVyaWMoQikNCg0KZm9yKGkgaW4gMTpCKXsNCiAgDQogIHhiIDwtIHNhbXBsZSh4LCBuLCByZXBsYWNlID0gVFJVRSkNCiAgDQogIG1fYiA8LSBtZWFuKHhiKQ0KICBzMl9iIDwtIHZhcih4YikNCiAgDQogIG1vbWVudF9lcV9ib290IDwtIGZ1bmN0aW9uKGJldGEpew0KICAgIA0KICAgIEEgPC0gKHBpL2JldGEpL3NpbihwaS9iZXRhKQ0KICAgIEJ0ZXJtIDwtICgyKnBpL2JldGEpL3NpbigyKnBpL2JldGEpDQogICAgDQogICAgYWxwaGEgPC0gbV9iIC8gQQ0KICAgIA0KICAgIHRoZW9yZXRpY2FsX3ZhciA8LSBhbHBoYV4yICogKEJ0ZXJtIC0gQV4yKQ0KICAgIA0KICAgIHRoZW9yZXRpY2FsX3ZhciAtIHMyX2INCiAgfQ0KICANCiAgYmV0YV9oYXRfYiA8LSB0cnlDYXRjaCgNCiAgICB1bmlyb290KG1vbWVudF9lcV9ib290LCBpbnRlcnZhbCA9IGMoMi4wMSwgMjApKSRyb290LA0KICAgIGVycm9yID0gZnVuY3Rpb24oZSkgTkENCiAgKQ0KICANCiAgaWYoIWlzLm5hKGJldGFfaGF0X2IpKXsNCiAgICBhbHBoYV9oYXRfYiA8LSBtX2IgKiBzaW4ocGkvYmV0YV9oYXRfYikvKHBpL2JldGFfaGF0X2IpDQogIH0gZWxzZSB7DQogICAgYWxwaGFfaGF0X2IgPC0gTkENCiAgfQ0KICANCiAgYWxwaGFfYm9vdFtpXSA8LSBhbHBoYV9oYXRfYg0KICBiZXRhX2Jvb3RbaV0gIDwtIGJldGFfaGF0X2INCn0NCg0KYWxwaGFfYm9vdCA8LSBuYS5vbWl0KGFscGhhX2Jvb3QpDQpiZXRhX2Jvb3QgIDwtIG5hLm9taXQoYmV0YV9ib290KQ0KDQojIEJvb3RzdHJhcCBIaXN0b2dyYW0gZm9yIEFscGhhDQpoaXN0KGFscGhhX2Jvb3QsDQogICAgIHByb2JhYmlsaXR5ID0gVFJVRSwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24oIkJvb3RzdHJhcCBEaXN0cmlidXRpb24gb2YgIiAqIGhhdChhbHBoYSkpLA0KICAgICB4bGFiID0gZXhwcmVzc2lvbihoYXQoYWxwaGEpKSkNCg0KbGluZXMoZGVuc2l0eShhbHBoYV9ib290KSwgbHdkID0gMikNCg0KIyBCb290c3RyYXAgSGlzdG9ncmFtIGZvciBCZXRhDQpoaXN0KGJldGFfYm9vdCwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICBtYWluID0gZXhwcmVzc2lvbigiQm9vdHN0cmFwIERpc3RyaWJ1dGlvbiBvZiAiICogaGF0KGJldGEpKSwNCiAgICAgeGxhYiA9IGV4cHJlc3Npb24oaGF0KGJldGEpKSkNCg0KbGluZXMoZGVuc2l0eShiZXRhX2Jvb3QpLCBsd2QgPSAyKQ0KYGBgDQoNCioqVGhlIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gb2YgdGhlIHNjYWxlIGVzdGltYXRvciBvZiAkXGFscGhhJCBhbmQgJFxiZXRhJCBhcmUgYm90aCBzeW1tZXRyaWMgYW5kIHVuaW1vZGFsIGFuZCBzaG93cyB0aGF0IGJvb3RzdHJhcCByZXNhbXBsaW5nIHByb3ZpZGVzIGEgYWNjdXJhdGUgYXBwcm94aW1hdGlvbiBvZiB0aGUgZXN0aW1hdG9yc+KAmSBzYW1wbGluZyB2YXJpYWJpbGl0eS4qKiANCg0KDQoNCg==