Final Exam Guidelines

  • Coverage: The major concepts and inference procedures—such as sampling distributions, confidence intervals, and hypothesis testing—are covered and implemented using both classical parametric likelihood-based methods and modern non-parametric approaches, including the bootstrap and kernel density estimation.

  • Part A requires derivation of selected likelihood-based functions for performing various types of inference, with sufficient detail to enable translation of these derivations into code for numerical analysis.

  • Your code for the problems in Part B must align with your derivations in Part A and be well commented where necessary.

  • In Part B, all numerical results must be interpreted from a practical perspective.


Policies of Using 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.


Working Model for the Final Exam

Caution: Please follow the suggested expressions and guided steps to complete the exam. Other approaches such as transformation for trivialize the problems that will not meet the exam objectives.

The Kumaraswamy distribution is a two-parameter continuous probability distribution defined on the interval (0, 1). It is often used as an alternative to the Beta distribution due to its simple closed-form expressions for the cumulative distribution function (CDF) and quantile function. It is commonly used in

  • Hydrology: Modeling rainfall, streamflow, or other bounded natural phenomena

  • Economics: Income shares, proportions, or bounded indices

  • Monte Carlo simulation: Efficient random variate generation (via inverse transform)

  • Machine learning: Output layer for bounded targets, prior distributions in Bayesian models

  • Reliability engineering: Modeling failure rates of systems with bounded lifetimes


Let \(X\) be the Kumaraswamy random variable with Cumulative Distribution Function (CDF)

\[ F(x; a, b) = 1 - (1 - x^a)^b \]

where \(a > 0\) and \(b > 0\) unknown parameters and \(0 < x < 1\).

The following are two special case of the Kumaraswamy distribution:

  1. Uniform Distribution: When \(a = 1\) and \(b = 1\), the Kumaraswamy distribution becomes a uniform distribution over \([0, 1]\) with CDF \(F(x) = x\).

  2. Power Distribution: when \(b = 1\) and \(a > 0\), the Kumaraswamy distribution becomes a power distribution over \([0, 1]\) with CDF \(F(x) = x^a\).

This final exam focuses on inferences of Kumaraswamy distribution and related data analysis.

Part A: Methodological Derivations


Problem A1:

Show that the density function of the Kumaraswamy distribution is

\[ f(x; a, b) = ab \, x^{a-1} (1 - x^a)^{b-1}. \]

We take the derivative of the CDF with respect to \(x\) to obtain the density function.

\[ f(x;a,b)=\frac{d}{dx}\left[1-(1-x^a)^b\right] \]

Apply the chain rule:

\[ = -b(1-x^a)^{b-1}(-ax^{a-1}) \]

Simplifying the expression:

\[ = abx^{a-1}(1-x^a)^{b-1}, \quad 0<x<1,\ a>0,\ b>0. \]

This matches the given density function.

Problem A2:

Let \(\{x_1, x_2, \cdots, x_n \}\) be an i.i.d. random sample taken from a population that follows the above 2-parameter Kumaraswamy distribution. Write out the loglikelihood function of \(a\) and \(b\), denoted by \(\ell(a,b)\), based on the above random sample and derive the gradient vector \([\ell_a^\prime(a,b), \ell_b^\prime(a,b)]\), the first order partial derivative of the log-likelihood with respect to parameters \(a\) and \(b\).


Using the density from Problem A1,

\[ f(x_i;a,b)=abx_i^{a-1}(1-x_i^a)^{b-1} \]

Since the sample is i.i.d., the likelihood function is

\[ L(a,b)=\prod_{i=1}^{n}abx_i^{a-1}(1-x_i^a)^{b-1} \]

Taking the natural log gives the log-likelihood function

\[ \ell(a,b)=\sum_{i=1}^{n} \left[ \log(a)+\log(b)+(a-1)\log(x_i)+(b-1)\log(1-x_i^a) \right] \]

Simplifying,

\[ \ell(a,b)= n\log(a)+n\log(b) +(a-1)\sum_{i=1}^{n}\log(x_i) +(b-1)\sum_{i=1}^{n}\log(1-x_i^a) \]

Differentiate with respect to \(a\),

\[ \ell_a'(a,b) = \frac{n}{a} + \sum_{i=1}^{n}\log(x_i) - (b-1)\sum_{i=1}^{n} \frac{x_i^a\log(x_i)}{1-x_i^a} \]

Differentiate with respect to \(b\),

\[ \ell_b'(a,b) = \frac{n}{b} + \sum_{i=1}^{n}\log(1-x_i^a) \]

The gradient vector is

\[ \left[ \ell_a'(a,b),\ell_b'(a,b) \right] = \left[ \frac{n}{a} + \sum_{i=1}^{n}\log(x_i) - (b-1)\sum_{i=1}^{n} \frac{x_i^a\log(x_i)}{1-x_i^a}, \frac{n}{b} + \sum_{i=1}^{n}\log(1-x_i^a) \right]. \]

This gives the required gradient vector for the log-likelihood with respect to \(a\) and \(b\).

Problem A3:

Based on the gradients functions obtained in the above problem A2, derive the observed Fisher Information matrix (i.e, the negative Hessian Matrix).


The observed Fisher Information matrix comes from the negative Hessian matrix, so I use the second partial derivatives of the log-likelihood.

\[ I(a,b)=-H(a,b) \]

Using the gradient functions from Problem A2,

\[ \ell_a'(a,b) = \frac{n}{a} + \sum_{i=1}^{n}\log(x_i) - (b-1)\sum_{i=1}^{n} \frac{x_i^a\log(x_i)}{1-x_i^a} \]

\[ \ell_b'(a,b) = \frac{n}{b} + \sum_{i=1}^{n}\log(1-x_i^a) \]

Differentiate \(\ell_a'(a,b)\) with respect to \(a\),

\[ \ell_{aa}''(a,b) = -\frac{n}{a^2} - (b-1)\sum_{i=1}^{n} \frac{x_i^a[\log(x_i)]^2}{(1-x_i^a)^2} \]

Differentiate \(\ell_a'(a,b)\) with respect to \(b\),

\[ \ell_{ab}''(a,b) = -\sum_{i=1}^{n} \frac{x_i^a\log(x_i)}{1-x_i^a} \]

Differentiate \(\ell_b'(a,b)\) with respect to \(b\),

\[ \ell_{bb}''(a,b) = -\frac{n}{b^2} \]

The Hessian matrix is

\[ H(a,b)= \begin{bmatrix} \ell_{aa}''(a,b) & \ell_{ab}''(a,b) \\ \ell_{ba}''(a,b) & \ell_{bb}''(a,b) \end{bmatrix} \]

Since the observed Fisher Information matrix is the negative Hessian,

\[ I(a,b)= \begin{bmatrix} \frac{n}{a^2} + (b-1)\sum_{i=1}^{n} \frac{x_i^a[\log(x_i)]^2}{(1-x_i^a)^2} & \sum_{i=1}^{n} \frac{x_i^a\log(x_i)}{1-x_i^a} \\ \sum_{i=1}^{n} \frac{x_i^a\log(x_i)}{1-x_i^a} & \frac{n}{b^2} \end{bmatrix}. \]

This gives the observed Fisher Information matrix based on the second partial derivatives from Problem A2.

Problem A4:

Consider power distribution \(F(x) = x^a, (a >0 \quad \text{ and }\quad x \in (0,1))\), a special case of the Kumaraswamy distribution with \(b = 1\), and a random sample from this distribution \(\{ x_1, x_2, \cdots, x_n\}\). Derive the MLE and MME of \(a\) respectively. [Hint: To find the MME, you need to compute the moment of the power distribution; that is, \(E[X^k] = \int_0^1 x^k F'(x) dx\). Note that both the MLE and the MME have closed-form expressions.]


Since this is the special case with \(b=1\), the power distribution has CDF

\[ F(x)=x^a \]

Taking the derivative gives the density

\[ f(x)=F'(x)=ax^{a-1}, \quad 0<x<1,\ a>0. \]

For the MLE, I construct the likelihood using the i.i.d. sample

\[ L(a)=\prod_{i=1}^{n} ax_i^{a-1} \]

Taking the natural log to simplify the product,

\[ \ell(a)=n\log(a)+(a-1)\sum_{i=1}^{n}\log(x_i) \]

Differentiate with respect to \(a\) to obtain the score function,

\[ \ell'(a)=\frac{n}{a}+\sum_{i=1}^{n}\log(x_i) \]

Set the derivative equal to zero and solve for \(a\),

\[ \frac{n}{a}+\sum_{i=1}^{n}\log(x_i)=0 \]

\[ \hat{a}_{MLE}= -\frac{n}{\sum_{i=1}^{n}\log(x_i)} \]

For the MME, I compute the first moment using the definition from the hint.

\[ E[X]=\int_0^1 x f(x)\,dx \]

Substituting the density,

\[ E[X]=\int_0^1 x(ax^{a-1})\,dx = a\int_0^1 x^a\,dx = \frac{a}{a+1} \]

Set the population moment equal to the sample mean,

\[ \bar{x}=\frac{a}{a+1} \]

Solve for \(a\),

\[ \bar{x}(a+1)=a \]

\[ \bar{x}a+\bar{x}=a \]

\[ \bar{x}=a(1-\bar{x}) \]

\[ \tilde{a}_{MME}=\frac{\bar{x}}{1-\bar{x}} \]

Therefore, the MLE is \(\hat{a}_{MLE}=-\frac{n}{\sum_{i=1}^{n}\log(x_i)}\), and the MME is \(\tilde{a}_{MME}=\frac{\bar{x}}{1-\bar{x}}\).

Problem A5:

Using the same setting as in Problem A4, find the asymptotic (Wald) confidence interval for \(a\). [Hint: Compute the Fisher information for \(a\), then take its reciprocal to obtain the variance.]


Using the MLE from Problem A4,

\[ \hat{a}_{MLE}=-\frac{n}{\sum_{i=1}^{n}\log(x_i)} \]

The log-likelihood from Problem A4 is

\[ \ell(a)=n\log(a)+(a-1)\sum_{i=1}^{n}\log(x_i) \]

Differentiate a second time to obtain the Hessian,

\[ \ell''(a)=-\frac{n}{a^2} \]

The Fisher information is the negative second derivative,

\[ I(a)=-\ell''(a)=\frac{n}{a^2} \]

Using the hint, the approximate variance is the reciprocal of the Fisher information evaluated at \(\hat{a}\),

\[ Var(\hat{a})\approx \frac{1}{I(\hat{a})} = \frac{\hat{a}^2}{n} \]

Therefore, the standard error is

\[ SE(\hat{a})=\frac{\hat{a}}{\sqrt{n}} \]

The Wald confidence interval for \(a\) is

\[ \hat{a}\pm z_{\alpha/2}\frac{\hat{a}}{\sqrt{n}} \]

For a 95% confidence interval,

\[ \hat{a}\pm 1.96\frac{\hat{a}}{\sqrt{n}}. \]

Problem A6:

Using the same setting as in Problem A4, perform a likelihood ratio test for the hypothesis \(H_0 :a=1\) (i.e., the power distribution reduces to a uniform distribution). [Hint: Evaluate the log-likelihood function at the maximum likelihood estimate \(\hat{a}\) and at \(a=1\), then use these values to construct the LRT test statistic.]


Using the same log-likelihood from Problem A4,

\[ \ell(a)=n\log(a)+(a-1)\sum_{i=1}^{n}\log(x_i) \]

The hypotheses are

\[ H_0:a=1 \]

and

\[ H_A:a\neq 1. \]

Evaluate the log-likelihood at the MLE,

\[ \ell(\hat{a})=n\log(\hat{a})+(\hat{a}-1)\sum_{i=1}^{n}\log(x_i) \]

Under the null hypothesis, \(a=1\), so

\[ \ell(1)=n\log(1)+(1-1)\sum_{i=1}^{n}\log(x_i)=0 \]

The likelihood ratio test statistic is

\[ G^2=2\left[\ell(\hat{a})-\ell(1)\right] \]

Substituting the log-likelihood values,

\[ G^2=2\left[n\log(\hat{a})+(\hat{a}-1)\sum_{i=1}^{n}\log(x_i)\right] \]

Since one parameter is fixed under \(H_0\),

\[ G^2\sim \chi^2_1. \]

Reject \(H_0\) if

\[ G^2>\chi^2_{1,1-\alpha}. \]

This tests whether the power distribution can be reduced to the uniform distribution when \(a=1\).

Part B: Numerical Analysis

All code must be well commented and adhere to best coding practices

Working Dataset: A small reservoir supplies water to a town. During the dry season (50 days), engineers record the fraction of usable storage filled each morning. Values near 0 mean the reservoir is nearly empty; values near 1 mean it’s full. The distribution tends to be right‑skewed (mostly low levels due to drought) but with occasional replenishment.

The following 50 data points (ordered for clarity) represent the daily proportion of usable storage:

0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22,
0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32,
0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42,
0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52,
0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.78


Problem B1:

Fit the Kumaraswamy distribution to the above data. Use the derivations in Problem A2 to find the MLE of \(a\) and \(b\). Please copy the key formulas before coding.


Using the log-likelihood from Problem A2,

\[ \ell(a,b)= n\log(a)+n\log(b) +(a-1)\sum_{i=1}^{n}\log(x_i) +(b-1)\sum_{i=1}^{n}\log(1-x_i^a) \]

The MLEs of \(a\) and \(b\) are found by maximizing this log-likelihood.

# Input the reservoir storage data from the problem
reservoir <- c(
  0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22,
  0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32,
  0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42,
  0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52,
  0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.78
)

# Store sample size for use in likelihood expressions
n <- length(reservoir)
# Define the negative log-likelihood from Problem A2
neg_loglik_kumar <- function(par, x) {
  a <- par[1]
  b <- par[2]
  
  # Enforce parameter constraints (a > 0, b > 0)
  if (a <= 0 || b <= 0) return(Inf)
  
  # Negative log-likelihood (used for minimization)
  -(
    length(x) * log(a) +
    length(x) * log(b) +
    (a - 1) * sum(log(x)) +
    (b - 1) * sum(log(1 - x^a))
  )
}

# Perform numerical maximization of the log-likelihood
fit_kumar <- optim(
  par = c(1, 1),                  # initial guesses
  fn = neg_loglik_kumar,
  x = reservoir,
  method = "L-BFGS-B",
  lower = c(0.0001, 0.0001)       # enforce positivity
)

# Extract MLE estimates
a_hat <- fit_kumar$par[1]
b_hat <- fit_kumar$par[2]

# Display results
a_hat
[1] 2.529602
b_hat
[1] 7.883394

The maximum likelihood estimates are \(\hat{a} = 2.5296020115006\) and \(\hat{b} = 7.88339354060574\).

Problem B2:

Fit the power distribution to the above data using the derived of \(a\) obtained in Problem A4 to test the following hypothesis using likelihood ratio procedure at significance level \(\alpha = 0.05\):

\[ H_0: b = 1 \quad \text{ versus } \quad H_a: b \ne 1. \]

State the statistical decision clearly. What is the practical implication of the testing result?


Using the power distribution restriction \(b=1\), the MLE of \(a\) from Problem A4 is

\[ \hat{a}_{0}=-\frac{n}{\sum_{i=1}^{n}\log(x_i)} \]

# Estimate a under the restricted model where b = 1 (power distribution case)
a_hat_power <- -n / sum(log(reservoir))

# Evaluate the log-likelihood using the full Kumaraswamy model (from B1 estimates)
loglik_full <- -neg_loglik_kumar(c(a_hat, b_hat), reservoir)

# Evaluate the log-likelihood under the restricted model where b = 1
loglik_restricted <- -neg_loglik_kumar(c(a_hat_power, 1), reservoir)

# Construct the likelihood ratio test statistic comparing the two models
G2 <- 2 * (loglik_full - loglik_restricted)

# Since one parameter is restricted, the test follows a chi-square distribution with 1 degree of freedom
p_value <- 1 - pchisq(G2, df = 1)
critical_value <- qchisq(0.95, df = 1)

# Display results so I can interpret the test
a_hat_power
[1] 0.9393197
loglik_full
[1] 24.56271
loglik_restricted
[1] 0.1000435
G2
[1] 48.92533
critical_value
[1] 3.841459
p_value
[1] 2.658984e-12

The likelihood ratio test gives \(G^2 = 48.92533\) with a p-value of \(2.658984 \times 10^{-12}\). Since the p-value is less than \(0.05\), I reject \(H_0\). This indicates that \(b \neq 1\), so the power distribution does not fit the data well, and the Kumaraswamy model is more appropriate.

Problem B3:

Use the procedure and code from Problem B1 to estimate the MLEs of \(a\) and \(b\), and then complete the following analyses:

(1). Obtain the bootstrap sampling distributions of \(\hat{a}\) and \(\hat{b}\) and plot each distribution using Gaussian kernel density curves.

Using the procedure from Problem B1, the Kumaraswamy MLEs are \(\hat{a} = 2.5296020115006\) and \(\hat{b} = 7.88339354060574\). These estimates are used as the starting values when refitting the model to each bootstrap sample.

# Set seed so the bootstrap results can be repeated
set.seed(506)

# Choose the number of bootstrap samples
B <- 1000

# Store the bootstrap estimates of a and b
boot_a <- numeric(B)
boot_b <- numeric(B)

# Refit the Kumaraswamy model to each bootstrap sample
for (i in 1:B) {
  boot_sample <- sample(reservoir, size = n, replace = TRUE)
  
  boot_fit <- optim(
    par = c(a_hat, b_hat),
    fn = neg_loglik_kumar,
    x = boot_sample,
    method = "L-BFGS-B",
    lower = c(0.0001, 0.0001)
  )
  
  boot_a[i] <- boot_fit$par[1]
  boot_b[i] <- boot_fit$par[2]
}
# Plot the bootstrap sampling distribution of a-hat
plot(
  density(boot_a, kernel = "gaussian"),
  main = "Bootstrap Sampling Distribution of a-hat",
  xlab = "Bootstrap estimates of a",
  ylab = "Density"
)

# Plot the bootstrap sampling distribution of b-hat
plot(
  density(boot_b, kernel = "gaussian"),
  main = "Bootstrap Sampling Distribution of b-hat",
  xlab = "Bootstrap estimates of b",
  ylab = "Density"
)

(2). Construct both the \(95\%\) bootstrap confidence interval and the Wald confidence interval for \(b\). Do these intervals agree with the results obtained in Problem B2? [Compute the standard error of \(\hat{b}\) using the observed Fisher information matrix, i.e., the inverse of the negative Hessian obtained from optim()]

For \(b\), the bootstrap confidence interval is obtained from the bootstrap estimates of \(\hat{b}\), while the Wald confidence interval is constructed using the standard error from the inverse of the observed Fisher information matrix.

# Use the bootstrap estimates from B3(1) to get the 95% percentile interval for b
boot_ci_b <- quantile(boot_b, probs = c(0.025, 0.975))

# Refit the model one more time so I can extract the Hessian matrix from optim()
fit_kumar_hessian <- optim(
  par = c(a_hat, b_hat),
  fn = neg_loglik_kumar,
  x = reservoir,
  method = "L-BFGS-B",
  lower = c(0.0001, 0.0001),
  hessian = TRUE
)

# Take the inverse of the Hessian to get the estimated variance-covariance matrix
cov_matrix <- solve(fit_kumar_hessian$hessian)

# Pull out the standard error for b-hat (second parameter)
se_b <- sqrt(cov_matrix[2, 2])

# Build the Wald confidence interval using b-hat ± 1.96 * SE
wald_ci_b <- b_hat + c(-1, 1) * 1.96 * se_b

# Print everything so I can compare the two intervals and relate back to B2
boot_ci_b
     2.5%     97.5% 
 4.845854 15.541923 
se_b
[1] 2.244614
wald_ci_b
[1]  3.483951 12.282836

The 95% bootstrap confidence interval for \(b\) is \((4.845854, 15.541923)\), and the 95% Wald confidence interval is \((3.483951, 12.282836)\). The standard error of \(\hat{b}\) obtained from the inverse Hessian is \(2.244614\). Both intervals are entirely above \(1\), so they agree with the result from Problem B2 where \(H_0:b=1\) was rejected. This supports the conclusion that \(b \neq 1\), meaning the power distribution does not fit the data as well as the full Kumaraswamy model.

(3). Based on the bootstrap sampling distributions from part (1) of this problem, assess whether the validity of the Wald confidence interval is supported.


The bootstrap sampling distribution for \(\hat{b}\) is right-skewed, so the normal approximation used for the Wald confidence interval is not strongly supported. However, both the bootstrap and Wald confidence intervals are entirely above \(1\), so they still agree with the decision from Problem B2 that \(H_0:b=1\) should be rejected. Therefore, the Wald interval gives the same conclusion, but the bootstrap interval is more appropriate because it reflects the skewness in the sampling distribution.

Problem B4:

In the introduction to the working model for this exam, the Kumaraswamy distribution reduces to the uniform distribution on (0,1). In this problem, we perform a likelihood ratio test for the following hypothesis to assess whether the data come from the uniform distribution on (0,1):

\[ H_0: a = 1\quad \& \quad b = 1\quad \text{ versus } \quad H_a: a \ne 1 \quad \text{or} \quad b \ne 1 \quad \text{or}\quad (a \ne 1 \quad \& \quad b \ne 1). \]

Provide a practical interpretation of the above test result. [Hint: \(H_a\) basically says that there is no constraints for \(a\) and \(b\). Please review the lecture note for module 11 on the likelihood ratio test before coding.]


# Use the unrestricted Kumaraswamy model from Problem B1
loglik_full <- -neg_loglik_kumar(c(a_hat, b_hat), reservoir)

# Use the restricted uniform model where a = 1 and b = 1
loglik_restricted <- -neg_loglik_kumar(c(1, 1), reservoir)

# Build the likelihood ratio test statistic
G2_uniform <- 2 * (loglik_full - loglik_restricted)

# Two parameters are fixed under H0, so the test uses 2 degrees of freedom
critical_value_uniform <- qchisq(0.95, df = 2)
p_value_uniform <- 1 - pchisq(G2_uniform, df = 2)

# Print the values needed for the statistical decision
loglik_full
[1] 24.56271
loglik_restricted
[1] 0
G2_uniform
[1] 49.12542
critical_value_uniform
[1] 5.991465
p_value_uniform
[1] 2.150558e-11

Practically, this result suggests that the reservoir storage data are not spread evenly across the interval \((0,1)\), so the Uniform\((0,1)\) model does not describe the data well. The likelihood ratio statistic was \(G^2 = 49.12542\) with p-value \(= 2.150558 \times 10^{-11}\), which gives very strong evidence against \(H_0:a=1,\ b=1\). When both parameters are allowed to vary freely, the Kumaraswamy model fits the data much better than the restricted uniform model.

Note: Please download the template and insert your work into it to complete the exam.

LS0tCnRpdGxlOiAiU1RBIDUwNiBGaW5hbCBFeGFtaW5hdGlvbiIKYXV0aG9yOiAiS2F5bGEgRHllciIKZGF0ZTogIiBEdWU6IE1heSA1LCAyMDI2ICIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogbm8KICAgIHRvY19jb2xsYXBzZWQ6IHllcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIHNtb290aF9zY3JvbGw6IHllcwogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lCiAgICB0aGVtZTogc3BhY2VsYWIKICBwZGZfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgZmlnX3dpZHRoOiAzCiAgICBmaWdfaGVpZ2h0OiAzCiAgd29yZF9kb2N1bWVudDogCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBrZWVwX21kOiB5ZXMKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9CiNUT0M6OmJlZm9yZSB7CiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDEuMmVtOwogIGRpc3BsYXk6IGJsb2NrOwogIGNvbG9yOiBuYXZ5OwogIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCgpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOwogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOwogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsKICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsKfQoKaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8KICBmb250LXNpemU6IDIycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgY29sb3I6IERhcmtSZWQ7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsKfQoKaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICBmb250LXNpemU6IDE1cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsKICBjb2xvcjogbmF2eTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogIGZvbnQtc2l6ZTogMThweDsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7CiAgY29sb3I6IERhcmtCbHVlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAyMHB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBkYXJrcmVkOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE0cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBkYXJrcmVkOwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLwouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7CiAgY29udGVudDogIi4iOwoKYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0KCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9CgpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQoKfQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLgppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQogICBsaWJyYXJ5KGtuaXRyKQp9CmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikKICAgbGlicmFyeShwYW5kZXIpCn0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKICBsaWJyYXJ5KGdncGxvdDIpCn0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgewogIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCiAgbGlicmFyeSh0aWR5dmVyc2UpCn0KCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQogIGxpYnJhcnkocGxvdGx5KQp9CiMjIyMKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUKICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEKICAgICAgICAgICAgICAgICAgICAgICkgIApgYGAKIAogXAogCiMjICoqRmluYWwgRXhhbSBHdWlkZWxpbmVzKiogCgoqICoqQ292ZXJhZ2UqKjogVGhlIG1ham9yIGNvbmNlcHRzIGFuZCBpbmZlcmVuY2UgcHJvY2VkdXJlc+KAlHN1Y2ggYXMgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucywgY29uZmlkZW5jZSBpbnRlcnZhbHMsIGFuZCBoeXBvdGhlc2lzIHRlc3RpbmfigJRhcmUgY292ZXJlZCBhbmQgaW1wbGVtZW50ZWQgdXNpbmcgYm90aCBjbGFzc2ljYWwgcGFyYW1ldHJpYyBsaWtlbGlob29kLWJhc2VkIG1ldGhvZHMgYW5kIG1vZGVybiBub24tcGFyYW1ldHJpYyBhcHByb2FjaGVzLCBpbmNsdWRpbmcgdGhlIGJvb3RzdHJhcCBhbmQga2VybmVsIGRlbnNpdHkgZXN0aW1hdGlvbi4KCiogKipQYXJ0IEEqKiByZXF1aXJlcyBkZXJpdmF0aW9uIG9mIHNlbGVjdGVkIGxpa2VsaWhvb2QtYmFzZWQgZnVuY3Rpb25zIGZvciBwZXJmb3JtaW5nIHZhcmlvdXMgdHlwZXMgb2YgaW5mZXJlbmNlLCB3aXRoIHN1ZmZpY2llbnQgZGV0YWlsIHRvIGVuYWJsZSB0cmFuc2xhdGlvbiBvZiB0aGVzZSBkZXJpdmF0aW9ucyBpbnRvIGNvZGUgZm9yIG51bWVyaWNhbCBhbmFseXNpcy4KCiogWW91ciBjb2RlIGZvciB0aGUgcHJvYmxlbXMgaW4gKipQYXJ0IEIqKiBtdXN0IGFsaWduIHdpdGggeW91ciBkZXJpdmF0aW9ucyBpbiAqKlBhcnQgQSoqIGFuZCBiZSB3ZWxsIGNvbW1lbnRlZCB3aGVyZSBuZWNlc3NhcnkuCgoqIEluICoqUGFydCBCKiosIGFsbCBudW1lcmljYWwgcmVzdWx0cyBtdXN0IGJlIGludGVycHJldGVkIGZyb20gYSBwcmFjdGljYWwgcGVyc3BlY3RpdmUuCgoKXAoKIyMgKipQb2xpY2llcyBvZiBVc2luZyBBSSBUb29scyoqCgoqICoqUG9saWN5IG9uIEFJIFRvb2wgVXNlKio6IFN0dWRlbnRzIG11c3QgYWRoZXJlIHRvIHRoZSBBSSB0b29sIHBvbGljeSBzcGVjaWZpZWQgaW4gdGhlIGNvdXJzZSBzeWxsYWJ1cy4gVGhlIGRpcmVjdCBjb3B5aW5nIG9mIEFJLWdlbmVyYXRlZCBjb250ZW50IGlzIHN0cmljdGx5IHByb2hpYml0ZWQuIEFsbCBzdWJtaXR0ZWQgd29yayBtdXN0IHJlZmxlY3QgeW91ciBvd24gdW5kZXJzdGFuZGluZzsgd2hlcmUgZXh0ZXJuYWwgdG9vbHMgYXJlIGNvbnN1bHRlZCwgY29udGVudCBtdXN0IGJlIHRob3JvdWdobHkgcmVwaHJhc2VkIGFuZCBzeW50aGVzaXplZCBpbiB5b3VyIG93biB3b3Jkcy4KCiogKipDb2RlIEluY2x1c2lvbiBSZXF1aXJlbWVudCoqOiBBbnkgY29kZSBpbmNsdWRlZCBpbiB5b3VyIGVzc2F5IG11c3QgYmUgcHJvcGVybHkgY29tbWVudGVkIHRvIGV4cGxhaW4gdGhlIHB1cnBvc2UgYW5kL29yIGV4cGVjdGVkIG91dHB1dCBvZiBrZXkgY29kZSBsaW5lcy4gU3VibWl0dGluZyBBSS1nZW5lcmF0ZWQgY29kZSB3aXRob3V0IG1lYW5pbmdmdWwsIHN0dWRlbnQtYWRkZWQgY29tbWVudHMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuCgpcCgojIyAqKldvcmtpbmcgTW9kZWwgZm9yIHRoZSBGaW5hbCBFeGFtKioKCjxmb250IGNvbG9yID0gIm9yYW5nZSI+KipDYXV0aW9uKio6ICpQbGVhc2UgZm9sbG93IHRoZSBzdWdnZXN0ZWQgZXhwcmVzc2lvbnMgYW5kIGd1aWRlZCBzdGVwcyB0byBjb21wbGV0ZSB0aGUgZXhhbS4gT3RoZXIgYXBwcm9hY2hlcyBzdWNoIGFzIHRyYW5zZm9ybWF0aW9uIGZvciB0cml2aWFsaXplIHRoZSBwcm9ibGVtcyB0aGF0IHdpbGwgbm90IG1lZXQgdGhlIGV4YW0gb2JqZWN0aXZlcy4qPC9mb250PgoKClRoZSAqKkt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbioqIGlzIGEgdHdvLXBhcmFtZXRlciBjb250aW51b3VzIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBkZWZpbmVkIG9uIHRoZSBpbnRlcnZhbCAoMCwgMSkuIEl0IGlzIG9mdGVuIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIEJldGEgZGlzdHJpYnV0aW9uIGR1ZSB0byBpdHMgc2ltcGxlIGNsb3NlZC1mb3JtIGV4cHJlc3Npb25zIGZvciB0aGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gKENERikgYW5kIHF1YW50aWxlIGZ1bmN0aW9uLiBJdCBpcyBjb21tb25seSB1c2VkIGluIAoKKiAqKkh5ZHJvbG9neSoqOiBNb2RlbGluZyByYWluZmFsbCwgc3RyZWFtZmxvdywgb3Igb3RoZXIgYm91bmRlZCBuYXR1cmFsIHBoZW5vbWVuYQoKKiAqKkVjb25vbWljcyoqOiBJbmNvbWUgc2hhcmVzLCBwcm9wb3J0aW9ucywgb3IgYm91bmRlZCBpbmRpY2VzCgoqICoqTW9udGUgQ2FybG8gc2ltdWxhdGlvbioqOiBFZmZpY2llbnQgcmFuZG9tIHZhcmlhdGUgZ2VuZXJhdGlvbiAodmlhIGludmVyc2UgdHJhbnNmb3JtKQoKKiAqKk1hY2hpbmUgbGVhcm5pbmcqKjogT3V0cHV0IGxheWVyIGZvciBib3VuZGVkIHRhcmdldHMsIHByaW9yIGRpc3RyaWJ1dGlvbnMgaW4gQmF5ZXNpYW4gbW9kZWxzCgoqICoqUmVsaWFiaWxpdHkgZW5naW5lZXJpbmcqKjogTW9kZWxpbmcgZmFpbHVyZSByYXRlcyBvZiBzeXN0ZW1zIHdpdGggYm91bmRlZCBsaWZldGltZXMKClwKCkxldCAkWCQgYmUgdGhlIEt1bWFyYXN3YW15IHJhbmRvbSB2YXJpYWJsZSB3aXRoIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9uIChDREYpICAKCiQkCkYoeDsgYSwgYikgPSAxIC0gKDEgLSB4XmEpXmIKJCQKCndoZXJlICRhID4gMCQgYW5kICRiID4gMCQgdW5rbm93biBwYXJhbWV0ZXJzIGFuZCAkMCA8IHggPCAxJC4gCgpUaGUgZm9sbG93aW5nIGFyZSB0d28gc3BlY2lhbCBjYXNlIG9mIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb246CgoxLiAqKlVuaWZvcm0gRGlzdHJpYnV0aW9uKio6IFdoZW4gJGEgPSAxJCBhbmQgJGIgPSAxJCwgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBiZWNvbWVzIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gb3ZlciAkWzAsIDFdJCB3aXRoIENERiAkRih4KSA9IHgkLgoKCjIuICoqUG93ZXIgRGlzdHJpYnV0aW9uKio6IHdoZW4gJGIgPSAxJCBhbmQgJGEgPiAwJCwgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBiZWNvbWVzIGEgcG93ZXIgZGlzdHJpYnV0aW9uIG92ZXIgJFswLCAxXSQgd2l0aCBDREYgJEYoeCkgPSB4XmEkLiAKClRoaXMgZmluYWwgZXhhbSBmb2N1c2VzIG9uIGluZmVyZW5jZXMgb2YgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIGFuZCByZWxhdGVkIGRhdGEgYW5hbHlzaXMuCgoKIyMgUGFydCBBOiBNZXRob2RvbG9naWNhbCBEZXJpdmF0aW9ucwoKXAoKIyMjICoqUHJvYmxlbSBBMSoqOiAKU2hvdyB0aGF0IHRoZSBkZW5zaXR5IGZ1bmN0aW9uIG9mIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gaXMKCiQkCmYoeDsgYSwgYikgPSBhYiBcLCB4XnthLTF9ICgxIC0geF5hKV57Yi0xfS4KJCQKXAoKV2UgdGFrZSB0aGUgZGVyaXZhdGl2ZSBvZiB0aGUgQ0RGIHdpdGggcmVzcGVjdCB0byBcKHhcKSB0byBvYnRhaW4gdGhlIGRlbnNpdHkgZnVuY3Rpb24uCgokJApmKHg7YSxiKT1cZnJhY3tkfXtkeH1cbGVmdFsxLSgxLXheYSleYlxyaWdodF0KJCQKCkFwcGx5IHRoZSBjaGFpbiBydWxlOgoKJCQKPSAtYigxLXheYSlee2ItMX0oLWF4XnthLTF9KQokJAoKU2ltcGxpZnlpbmcgdGhlIGV4cHJlc3Npb246CgokJAo9IGFieF57YS0xfSgxLXheYSlee2ItMX0sIFxxdWFkIDA8eDwxLFwgYT4wLFwgYj4wLgokJAoKVGhpcyBtYXRjaGVzIHRoZSBnaXZlbiBkZW5zaXR5IGZ1bmN0aW9uLgoKIyMjICoqUHJvYmxlbSBBMioqOiAKTGV0ICRce3hfMSwgeF8yLCBcY2RvdHMsIHhfbiBcfSQgYmUgYW4gaS5pLmQuIHJhbmRvbSBzYW1wbGUgdGFrZW4gZnJvbSBhIHBvcHVsYXRpb24gdGhhdCBmb2xsb3dzIHRoZSBhYm92ZSAyLXBhcmFtZXRlciBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24uIFdyaXRlIG91dCB0aGUgbG9nbGlrZWxpaG9vZCBmdW5jdGlvbiBvZiAkYSQgYW5kICRiJCwgZGVub3RlZCBieSAkXGVsbChhLGIpJCwgYmFzZWQgb24gdGhlIGFib3ZlIHJhbmRvbSBzYW1wbGUgYW5kICoqZGVyaXZlKiogdGhlIGdyYWRpZW50IHZlY3RvciAkW1xlbGxfYV5ccHJpbWUoYSxiKSwgXGVsbF9iXlxwcmltZShhLGIpXSQsIHRoZSBmaXJzdCBvcmRlciBwYXJ0aWFsIGRlcml2YXRpdmUgb2YgdGhlIGxvZy1saWtlbGlob29kIHdpdGggcmVzcGVjdCB0byBwYXJhbWV0ZXJzICRhJCBhbmQgJGIkLgoKXAoKVXNpbmcgdGhlIGRlbnNpdHkgZnJvbSBQcm9ibGVtIEExLAoKJCQKZih4X2k7YSxiKT1hYnhfaV57YS0xfSgxLXhfaV5hKV57Yi0xfQokJAoKU2luY2UgdGhlIHNhbXBsZSBpcyBpLmkuZC4sIHRoZSBsaWtlbGlob29kIGZ1bmN0aW9uIGlzCgokJApMKGEsYik9XHByb2Rfe2k9MX1ee259YWJ4X2lee2EtMX0oMS14X2leYSlee2ItMX0KJCQKClRha2luZyB0aGUgbmF0dXJhbCBsb2cgZ2l2ZXMgdGhlIGxvZy1saWtlbGlob29kIGZ1bmN0aW9uCgokJApcZWxsKGEsYik9XHN1bV97aT0xfV57bn0KXGxlZnRbClxsb2coYSkrXGxvZyhiKSsoYS0xKVxsb2coeF9pKSsoYi0xKVxsb2coMS14X2leYSkKXHJpZ2h0XQokJAoKU2ltcGxpZnlpbmcsCgokJApcZWxsKGEsYik9Cm5cbG9nKGEpK25cbG9nKGIpCisoYS0xKVxzdW1fe2k9MX1ee259XGxvZyh4X2kpCisoYi0xKVxzdW1fe2k9MX1ee259XGxvZygxLXhfaV5hKQokJAoKRGlmZmVyZW50aWF0ZSB3aXRoIHJlc3BlY3QgdG8gXChhXCksCgokJApcZWxsX2EnKGEsYikKPQpcZnJhY3tufXthfQorClxzdW1fe2k9MX1ee259XGxvZyh4X2kpCi0KKGItMSlcc3VtX3tpPTF9XntufQpcZnJhY3t4X2leYVxsb2coeF9pKX17MS14X2leYX0KJCQKCkRpZmZlcmVudGlhdGUgd2l0aCByZXNwZWN0IHRvIFwoYlwpLAoKJCQKXGVsbF9iJyhhLGIpCj0KXGZyYWN7bn17Yn0KKwpcc3VtX3tpPTF9XntufVxsb2coMS14X2leYSkKJCQKClRoZSBncmFkaWVudCB2ZWN0b3IgaXMKCiQkClxsZWZ0WwpcZWxsX2EnKGEsYiksXGVsbF9iJyhhLGIpClxyaWdodF0KPQpcbGVmdFsKXGZyYWN7bn17YX0KKwpcc3VtX3tpPTF9XntufVxsb2coeF9pKQotCihiLTEpXHN1bV97aT0xfV57bn0KXGZyYWN7eF9pXmFcbG9nKHhfaSl9ezEteF9pXmF9LApcZnJhY3tufXtifQorClxzdW1fe2k9MX1ee259XGxvZygxLXhfaV5hKQpccmlnaHRdLgokJAoKVGhpcyBnaXZlcyB0aGUgcmVxdWlyZWQgZ3JhZGllbnQgdmVjdG9yIGZvciB0aGUgbG9nLWxpa2VsaWhvb2Qgd2l0aCByZXNwZWN0IHRvIFwoYVwpIGFuZCBcKGJcKS4KCgojIyMgKipQcm9ibGVtIEEzKio6IApCYXNlZCBvbiB0aGUgZ3JhZGllbnRzIGZ1bmN0aW9ucyBvYnRhaW5lZCBpbiB0aGUgYWJvdmUgcHJvYmxlbSBBMiwgKipkZXJpdmUqKiB0aGUgb2JzZXJ2ZWQgRmlzaGVyIEluZm9ybWF0aW9uIG1hdHJpeCAoaS5lLCB0aGUgbmVnYXRpdmUgSGVzc2lhbiBNYXRyaXgpLgoKXAoKVGhlIG9ic2VydmVkIEZpc2hlciBJbmZvcm1hdGlvbiBtYXRyaXggY29tZXMgZnJvbSB0aGUgbmVnYXRpdmUgSGVzc2lhbiBtYXRyaXgsIHNvIEkgdXNlIHRoZSBzZWNvbmQgcGFydGlhbCBkZXJpdmF0aXZlcyBvZiB0aGUgbG9nLWxpa2VsaWhvb2QuCgokJApJKGEsYik9LUgoYSxiKQokJAoKVXNpbmcgdGhlIGdyYWRpZW50IGZ1bmN0aW9ucyBmcm9tIFByb2JsZW0gQTIsCgokJApcZWxsX2EnKGEsYikKPQpcZnJhY3tufXthfQorClxzdW1fe2k9MX1ee259XGxvZyh4X2kpCi0KKGItMSlcc3VtX3tpPTF9XntufQpcZnJhY3t4X2leYVxsb2coeF9pKX17MS14X2leYX0KJCQKCiQkClxlbGxfYicoYSxiKQo9ClxmcmFje259e2J9CisKXHN1bV97aT0xfV57bn1cbG9nKDEteF9pXmEpCiQkCgpEaWZmZXJlbnRpYXRlIFwoXGVsbF9hJyhhLGIpXCkgd2l0aCByZXNwZWN0IHRvIFwoYVwpLAoKJCQKXGVsbF97YWF9JycoYSxiKQo9Ci1cZnJhY3tufXthXjJ9Ci0KKGItMSlcc3VtX3tpPTF9XntufQpcZnJhY3t4X2leYVtcbG9nKHhfaSldXjJ9eygxLXhfaV5hKV4yfQokJAoKRGlmZmVyZW50aWF0ZSBcKFxlbGxfYScoYSxiKVwpIHdpdGggcmVzcGVjdCB0byBcKGJcKSwKCiQkClxlbGxfe2FifScnKGEsYikKPQotXHN1bV97aT0xfV57bn0KXGZyYWN7eF9pXmFcbG9nKHhfaSl9ezEteF9pXmF9CiQkCgpEaWZmZXJlbnRpYXRlIFwoXGVsbF9iJyhhLGIpXCkgd2l0aCByZXNwZWN0IHRvIFwoYlwpLAoKJCQKXGVsbF97YmJ9JycoYSxiKQo9Ci1cZnJhY3tufXtiXjJ9CiQkCgpUaGUgSGVzc2lhbiBtYXRyaXggaXMKCiQkCkgoYSxiKT0KXGJlZ2lue2JtYXRyaXh9ClxlbGxfe2FhfScnKGEsYikgJiBcZWxsX3thYn0nJyhhLGIpIFxcClxlbGxfe2JhfScnKGEsYikgJiBcZWxsX3tiYn0nJyhhLGIpClxlbmR7Ym1hdHJpeH0KJCQKClNpbmNlIHRoZSBvYnNlcnZlZCBGaXNoZXIgSW5mb3JtYXRpb24gbWF0cml4IGlzIHRoZSBuZWdhdGl2ZSBIZXNzaWFuLAoKJCQKSShhLGIpPQpcYmVnaW57Ym1hdHJpeH0KXGZyYWN7bn17YV4yfQorCihiLTEpXHN1bV97aT0xfV57bn0KXGZyYWN7eF9pXmFbXGxvZyh4X2kpXV4yfXsoMS14X2leYSleMn0KJgpcc3VtX3tpPTF9XntufQpcZnJhY3t4X2leYVxsb2coeF9pKX17MS14X2leYX0KXFwKXHN1bV97aT0xfV57bn0KXGZyYWN7eF9pXmFcbG9nKHhfaSl9ezEteF9pXmF9CiYKXGZyYWN7bn17Yl4yfQpcZW5ke2JtYXRyaXh9LgokJAoKVGhpcyBnaXZlcyB0aGUgb2JzZXJ2ZWQgRmlzaGVyIEluZm9ybWF0aW9uIG1hdHJpeCBiYXNlZCBvbiB0aGUgc2Vjb25kIHBhcnRpYWwgZGVyaXZhdGl2ZXMgZnJvbSBQcm9ibGVtIEEyLgoKIyMjICoqUHJvYmxlbSBBNCoqOiAKCkNvbnNpZGVyIHBvd2VyIGRpc3RyaWJ1dGlvbiAkRih4KSA9IHheYSwgKGEgPjAgXHF1YWQgXHRleHR7IGFuZCB9XHF1YWQgeCBcaW4gKDAsMSkpJCwgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiB3aXRoICRiID0gMSQsIGFuZCBhIHJhbmRvbSBzYW1wbGUgZnJvbSB0aGlzIGRpc3RyaWJ1dGlvbiAkXHsgeF8xLCB4XzIsIFxjZG90cywgeF9uXH0kLiAqKkRlcml2ZSoqIHRoZSBNTEUgYW5kIE1NRSBvZiAkYSQgcmVzcGVjdGl2ZWx5LiBbKkhpbnQ6IFRvIGZpbmQgdGhlIE1NRSwgeW91IG5lZWQgdG8gY29tcHV0ZSB0aGUgbW9tZW50IG9mIHRoZSBwb3dlciBkaXN0cmlidXRpb247IHRoYXQgaXMsICRFW1hea10gPSBcaW50XzBeMSB4XmsgRicoeCkgZHgkLiBOb3RlIHRoYXQgYm90aCB0aGUgTUxFIGFuZCB0aGUgTU1FIGhhdmUgY2xvc2VkLWZvcm0gZXhwcmVzc2lvbnMuKl0KClwKClNpbmNlIHRoaXMgaXMgdGhlIHNwZWNpYWwgY2FzZSB3aXRoIFwoYj0xXCksIHRoZSBwb3dlciBkaXN0cmlidXRpb24gaGFzIENERgoKJCQKRih4KT14XmEKJCQKClRha2luZyB0aGUgZGVyaXZhdGl2ZSBnaXZlcyB0aGUgZGVuc2l0eQoKJCQKZih4KT1GJyh4KT1heF57YS0xfSwgXHF1YWQgMDx4PDEsXCBhPjAuCiQkCgpGb3IgdGhlIE1MRSwgSSBjb25zdHJ1Y3QgdGhlIGxpa2VsaWhvb2QgdXNpbmcgdGhlIGkuaS5kLiBzYW1wbGUKCiQkCkwoYSk9XHByb2Rfe2k9MX1ee259IGF4X2lee2EtMX0KJCQKClRha2luZyB0aGUgbmF0dXJhbCBsb2cgdG8gc2ltcGxpZnkgdGhlIHByb2R1Y3QsCgokJApcZWxsKGEpPW5cbG9nKGEpKyhhLTEpXHN1bV97aT0xfV57bn1cbG9nKHhfaSkKJCQKCkRpZmZlcmVudGlhdGUgd2l0aCByZXNwZWN0IHRvIFwoYVwpIHRvIG9idGFpbiB0aGUgc2NvcmUgZnVuY3Rpb24sCgokJApcZWxsJyhhKT1cZnJhY3tufXthfStcc3VtX3tpPTF9XntufVxsb2coeF9pKQokJAoKU2V0IHRoZSBkZXJpdmF0aXZlIGVxdWFsIHRvIHplcm8gYW5kIHNvbHZlIGZvciBcKGFcKSwKCiQkClxmcmFje259e2F9K1xzdW1fe2k9MX1ee259XGxvZyh4X2kpPTAKJCQKCiQkClxoYXR7YX1fe01MRX09Ci1cZnJhY3tufXtcc3VtX3tpPTF9XntufVxsb2coeF9pKX0KJCQKCkZvciB0aGUgTU1FLCBJIGNvbXB1dGUgdGhlIGZpcnN0IG1vbWVudCB1c2luZyB0aGUgZGVmaW5pdGlvbiBmcm9tIHRoZSBoaW50LgoKJCQKRVtYXT1caW50XzBeMSB4IGYoeClcLGR4CiQkCgpTdWJzdGl0dXRpbmcgdGhlIGRlbnNpdHksCgokJApFW1hdPVxpbnRfMF4xIHgoYXhee2EtMX0pXCxkeAo9CmFcaW50XzBeMSB4XmFcLGR4Cj0KXGZyYWN7YX17YSsxfQokJAoKU2V0IHRoZSBwb3B1bGF0aW9uIG1vbWVudCBlcXVhbCB0byB0aGUgc2FtcGxlIG1lYW4sCgokJApcYmFye3h9PVxmcmFje2F9e2ErMX0KJCQKClNvbHZlIGZvciBcKGFcKSwKCiQkClxiYXJ7eH0oYSsxKT1hCiQkCgokJApcYmFye3h9YStcYmFye3h9PWEKJCQKCiQkClxiYXJ7eH09YSgxLVxiYXJ7eH0pCiQkCgokJApcdGlsZGV7YX1fe01NRX09XGZyYWN7XGJhcnt4fX17MS1cYmFye3h9fQokJAoKVGhlcmVmb3JlLCB0aGUgTUxFIGlzIFwoXGhhdHthfV97TUxFfT0tXGZyYWN7bn17XHN1bV97aT0xfV57bn1cbG9nKHhfaSl9XCksIGFuZCB0aGUgTU1FIGlzIFwoXHRpbGRle2F9X3tNTUV9PVxmcmFje1xiYXJ7eH19ezEtXGJhcnt4fX1cKS4KCgojIyMgKipQcm9ibGVtIEE1Kio6CgpVc2luZyB0aGUgc2FtZSBzZXR0aW5nIGFzIGluICoqUHJvYmxlbSBBNCoqLCBmaW5kIHRoZSBhc3ltcHRvdGljIChXYWxkKSBjb25maWRlbmNlIGludGVydmFsIGZvciAkYSQuIFsqSGludDogQ29tcHV0ZSB0aGUgRmlzaGVyIGluZm9ybWF0aW9uIGZvciAkYSQsIHRoZW4gdGFrZSBpdHMgcmVjaXByb2NhbCB0byBvYnRhaW4gdGhlIHZhcmlhbmNlKi5dCgpcCgpVc2luZyB0aGUgTUxFIGZyb20gUHJvYmxlbSBBNCwKCiQkClxoYXR7YX1fe01MRX09LVxmcmFje259e1xzdW1fe2k9MX1ee259XGxvZyh4X2kpfQokJAoKVGhlIGxvZy1saWtlbGlob29kIGZyb20gUHJvYmxlbSBBNCBpcwoKJCQKXGVsbChhKT1uXGxvZyhhKSsoYS0xKVxzdW1fe2k9MX1ee259XGxvZyh4X2kpCiQkCgpEaWZmZXJlbnRpYXRlIGEgc2Vjb25kIHRpbWUgdG8gb2J0YWluIHRoZSBIZXNzaWFuLAoKJCQKXGVsbCcnKGEpPS1cZnJhY3tufXthXjJ9CiQkCgpUaGUgRmlzaGVyIGluZm9ybWF0aW9uIGlzIHRoZSBuZWdhdGl2ZSBzZWNvbmQgZGVyaXZhdGl2ZSwKCiQkCkkoYSk9LVxlbGwnJyhhKT1cZnJhY3tufXthXjJ9CiQkCgpVc2luZyB0aGUgaGludCwgdGhlIGFwcHJveGltYXRlIHZhcmlhbmNlIGlzIHRoZSByZWNpcHJvY2FsIG9mIHRoZSBGaXNoZXIgaW5mb3JtYXRpb24gZXZhbHVhdGVkIGF0IFwoXGhhdHthfVwpLAoKJCQKVmFyKFxoYXR7YX0pXGFwcHJveCBcZnJhY3sxfXtJKFxoYXR7YX0pfQo9ClxmcmFje1xoYXR7YX1eMn17bn0KJCQKClRoZXJlZm9yZSwgdGhlIHN0YW5kYXJkIGVycm9yIGlzCgokJApTRShcaGF0e2F9KT1cZnJhY3tcaGF0e2F9fXtcc3FydHtufX0KJCQKClRoZSBXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIFwoYVwpIGlzCgokJApcaGF0e2F9XHBtIHpfe1xhbHBoYS8yfVxmcmFje1xoYXR7YX19e1xzcXJ0e259fQokJAoKRm9yIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwsCgokJApcaGF0e2F9XHBtIDEuOTZcZnJhY3tcaGF0e2F9fXtcc3FydHtufX0uCiQkCgojIyMgKipQcm9ibGVtIEE2Kio6CgpVc2luZyB0aGUgc2FtZSBzZXR0aW5nIGFzIGluICoqUHJvYmxlbSBBNCoqLCBwZXJmb3JtIGEgbGlrZWxpaG9vZCByYXRpbyB0ZXN0IGZvciB0aGUgaHlwb3RoZXNpcyAkSF8wIDphPTEkIChpLmUuLCB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIHJlZHVjZXMgdG8gYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbikuIFsqSGludDogRXZhbHVhdGUgdGhlIGxvZy1saWtlbGlob29kIGZ1bmN0aW9uIGF0IHRoZSBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGUgJFxoYXR7YX0kIGFuZCBhdCAkYT0xJCwgdGhlbiB1c2UgdGhlc2UgdmFsdWVzIHRvIGNvbnN0cnVjdCB0aGUgTFJUIHRlc3Qgc3RhdGlzdGljLipdCgpcCgpVc2luZyB0aGUgc2FtZSBsb2ctbGlrZWxpaG9vZCBmcm9tIFByb2JsZW0gQTQsCgokJApcZWxsKGEpPW5cbG9nKGEpKyhhLTEpXHN1bV97aT0xfV57bn1cbG9nKHhfaSkKJCQKClRoZSBoeXBvdGhlc2VzIGFyZQoKJCQKSF8wOmE9MQokJAoKYW5kCgokJApIX0E6YVxuZXEgMS4KJCQKCkV2YWx1YXRlIHRoZSBsb2ctbGlrZWxpaG9vZCBhdCB0aGUgTUxFLAoKJCQKXGVsbChcaGF0e2F9KT1uXGxvZyhcaGF0e2F9KSsoXGhhdHthfS0xKVxzdW1fe2k9MX1ee259XGxvZyh4X2kpCiQkCgpVbmRlciB0aGUgbnVsbCBoeXBvdGhlc2lzLCBcKGE9MVwpLCBzbwoKJCQKXGVsbCgxKT1uXGxvZygxKSsoMS0xKVxzdW1fe2k9MX1ee259XGxvZyh4X2kpPTAKJCQKClRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3Qgc3RhdGlzdGljIGlzCgokJApHXjI9MlxsZWZ0W1xlbGwoXGhhdHthfSktXGVsbCgxKVxyaWdodF0KJCQKClN1YnN0aXR1dGluZyB0aGUgbG9nLWxpa2VsaWhvb2QgdmFsdWVzLAoKJCQKR14yPTJcbGVmdFtuXGxvZyhcaGF0e2F9KSsoXGhhdHthfS0xKVxzdW1fe2k9MX1ee259XGxvZyh4X2kpXHJpZ2h0XQokJAoKU2luY2Ugb25lIHBhcmFtZXRlciBpcyBmaXhlZCB1bmRlciBcKEhfMFwpLAoKJCQKR14yXHNpbSBcY2hpXjJfMS4KJCQKClJlamVjdCBcKEhfMFwpIGlmCgokJApHXjI+XGNoaV4yX3sxLDEtXGFscGhhfS4KJCQKClRoaXMgdGVzdHMgd2hldGhlciB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIGNhbiBiZSByZWR1Y2VkIHRvIHRoZSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiB3aGVuIFwoYT0xXCkuCgojIyBQYXJ0IEI6IE51bWVyaWNhbCBBbmFseXNpcwoKKipBbGwgY29kZSBtdXN0IGJlIHdlbGwgY29tbWVudGVkIGFuZCBhZGhlcmUgdG8gYmVzdCBjb2RpbmcgcHJhY3RpY2VzKioKCioqV29ya2luZyBEYXRhc2V0Kio6IEEgc21hbGwgcmVzZXJ2b2lyIHN1cHBsaWVzIHdhdGVyIHRvIGEgdG93bi4gRHVyaW5nIHRoZSBkcnkgc2Vhc29uICg1MCBkYXlzKSwgZW5naW5lZXJzIHJlY29yZCB0aGUgZnJhY3Rpb24gb2YgdXNhYmxlIHN0b3JhZ2UgZmlsbGVkIGVhY2ggbW9ybmluZy4gVmFsdWVzIG5lYXIgMCBtZWFuIHRoZSByZXNlcnZvaXIgaXMgbmVhcmx5IGVtcHR5OyB2YWx1ZXMgbmVhciAxIG1lYW4gaXQncyBmdWxsLiBUaGUgZGlzdHJpYnV0aW9uIHRlbmRzIHRvIGJlIHJpZ2h04oCRc2tld2VkIChtb3N0bHkgbG93IGxldmVscyBkdWUgdG8gZHJvdWdodCkgYnV0IHdpdGggb2NjYXNpb25hbCByZXBsZW5pc2htZW50LgoKVGhlIGZvbGxvd2luZyA1MCBkYXRhIHBvaW50cyAob3JkZXJlZCBmb3IgY2xhcml0eSkgcmVwcmVzZW50IHRoZSBkYWlseSBwcm9wb3J0aW9uIG9mIHVzYWJsZSBzdG9yYWdlOgoKYGBgCjAuMTIsIDAuMTQsIDAuMTUsIDAuMTYsIDAuMTcsIDAuMTgsIDAuMTksIDAuMjAsIDAuMjEsIDAuMjIsCjAuMjMsIDAuMjQsIDAuMjUsIDAuMjYsIDAuMjcsIDAuMjgsIDAuMjksIDAuMzAsIDAuMzEsIDAuMzIsCjAuMzMsIDAuMzQsIDAuMzUsIDAuMzYsIDAuMzcsIDAuMzgsIDAuMzksIDAuNDAsIDAuNDEsIDAuNDIsCjAuNDMsIDAuNDQsIDAuNDUsIDAuNDYsIDAuNDcsIDAuNDgsIDAuNDksIDAuNTAsIDAuNTEsIDAuNTIsCjAuNTMsIDAuNTQsIDAuNTUsIDAuNTYsIDAuNTcsIDAuNTgsIDAuNTksIDAuNjAsIDAuNjEsIDAuNzgKYGBgCgpcCgojIyMgKipQcm9ibGVtIEIxKio6CgpGaXQgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiB0byB0aGUgYWJvdmUgZGF0YS4gVXNlIHRoZSBkZXJpdmF0aW9ucyBpbiAqKlByb2JsZW0gQTIqKiB0byBmaW5kIHRoZSBNTEUgb2YgJGEkIGFuZCAkYiQuIFBsZWFzZSBjb3B5IHRoZSBrZXkgZm9ybXVsYXMgYmVmb3JlIGNvZGluZy4KClwKClVzaW5nIHRoZSBsb2ctbGlrZWxpaG9vZCBmcm9tIFByb2JsZW0gQTIsCgokJApcZWxsKGEsYik9Cm5cbG9nKGEpK25cbG9nKGIpCisoYS0xKVxzdW1fe2k9MX1ee259XGxvZyh4X2kpCisoYi0xKVxzdW1fe2k9MX1ee259XGxvZygxLXhfaV5hKQokJAoKVGhlIE1MRXMgb2YgXChhXCkgYW5kIFwoYlwpIGFyZSBmb3VuZCBieSBtYXhpbWl6aW5nIHRoaXMgbG9nLWxpa2VsaWhvb2QuCgpgYGB7cn0KIyBJbnB1dCB0aGUgcmVzZXJ2b2lyIHN0b3JhZ2UgZGF0YSBmcm9tIHRoZSBwcm9ibGVtCnJlc2Vydm9pciA8LSBjKAogIDAuMTIsIDAuMTQsIDAuMTUsIDAuMTYsIDAuMTcsIDAuMTgsIDAuMTksIDAuMjAsIDAuMjEsIDAuMjIsCiAgMC4yMywgMC4yNCwgMC4yNSwgMC4yNiwgMC4yNywgMC4yOCwgMC4yOSwgMC4zMCwgMC4zMSwgMC4zMiwKICAwLjMzLCAwLjM0LCAwLjM1LCAwLjM2LCAwLjM3LCAwLjM4LCAwLjM5LCAwLjQwLCAwLjQxLCAwLjQyLAogIDAuNDMsIDAuNDQsIDAuNDUsIDAuNDYsIDAuNDcsIDAuNDgsIDAuNDksIDAuNTAsIDAuNTEsIDAuNTIsCiAgMC41MywgMC41NCwgMC41NSwgMC41NiwgMC41NywgMC41OCwgMC41OSwgMC42MCwgMC42MSwgMC43OAopCgojIFN0b3JlIHNhbXBsZSBzaXplIGZvciB1c2UgaW4gbGlrZWxpaG9vZCBleHByZXNzaW9ucwpuIDwtIGxlbmd0aChyZXNlcnZvaXIpCmBgYAoKYGBge3J9CiMgRGVmaW5lIHRoZSBuZWdhdGl2ZSBsb2ctbGlrZWxpaG9vZCBmcm9tIFByb2JsZW0gQTIKbmVnX2xvZ2xpa19rdW1hciA8LSBmdW5jdGlvbihwYXIsIHgpIHsKICBhIDwtIHBhclsxXQogIGIgPC0gcGFyWzJdCiAgCiAgIyBFbmZvcmNlIHBhcmFtZXRlciBjb25zdHJhaW50cyAoYSA+IDAsIGIgPiAwKQogIGlmIChhIDw9IDAgfHwgYiA8PSAwKSByZXR1cm4oSW5mKQogIAogICMgTmVnYXRpdmUgbG9nLWxpa2VsaWhvb2QgKHVzZWQgZm9yIG1pbmltaXphdGlvbikKICAtKAogICAgbGVuZ3RoKHgpICogbG9nKGEpICsKICAgIGxlbmd0aCh4KSAqIGxvZyhiKSArCiAgICAoYSAtIDEpICogc3VtKGxvZyh4KSkgKwogICAgKGIgLSAxKSAqIHN1bShsb2coMSAtIHheYSkpCiAgKQp9CgojIFBlcmZvcm0gbnVtZXJpY2FsIG1heGltaXphdGlvbiBvZiB0aGUgbG9nLWxpa2VsaWhvb2QKZml0X2t1bWFyIDwtIG9wdGltKAogIHBhciA9IGMoMSwgMSksICAgICAgICAgICAgICAgICAgIyBpbml0aWFsIGd1ZXNzZXMKICBmbiA9IG5lZ19sb2dsaWtfa3VtYXIsCiAgeCA9IHJlc2Vydm9pciwKICBtZXRob2QgPSAiTC1CRkdTLUIiLAogIGxvd2VyID0gYygwLjAwMDEsIDAuMDAwMSkgICAgICAgIyBlbmZvcmNlIHBvc2l0aXZpdHkKKQoKIyBFeHRyYWN0IE1MRSBlc3RpbWF0ZXMKYV9oYXQgPC0gZml0X2t1bWFyJHBhclsxXQpiX2hhdCA8LSBmaXRfa3VtYXIkcGFyWzJdCgojIERpc3BsYXkgcmVzdWx0cwphX2hhdApiX2hhdApgYGAKClRoZSBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGVzIGFyZSAkXGhhdHthfSA9IDIuNTI5NjAyMDExNTAwNiQgYW5kICRcaGF0e2J9ID0gNy44ODMzOTM1NDA2MDU3NCQuCgojIyMgKipQcm9ibGVtIEIyKio6CgpGaXQgdGhlICoqcG93ZXIgZGlzdHJpYnV0aW9uKiogdG8gdGhlIGFib3ZlIGRhdGEgdXNpbmcgdGhlIGRlcml2ZWQgIG9mICRhJCBvYnRhaW5lZCBpbiAqKlByb2JsZW0gQTQqKiB0byB0ZXN0IHRoZSBmb2xsb3dpbmcgaHlwb3RoZXNpcyB1c2luZyBsaWtlbGlob29kIHJhdGlvIHByb2NlZHVyZSBhdCBzaWduaWZpY2FuY2UgbGV2ZWwgJFxhbHBoYSA9IDAuMDUkOgoKJCQKSF8wOiBiID0gMSBccXVhZCBcdGV4dHsgdmVyc3VzIH0gXHF1YWQgSF9hOiBiIFxuZSAxLgokJAoKU3RhdGUgdGhlIHN0YXRpc3RpY2FsIGRlY2lzaW9uIGNsZWFybHkuIFdoYXQgaXMgdGhlIHByYWN0aWNhbCBpbXBsaWNhdGlvbiBvZiB0aGUgdGVzdGluZyByZXN1bHQ/CgpcCgpVc2luZyB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIHJlc3RyaWN0aW9uIFwoYj0xXCksIHRoZSBNTEUgb2YgXChhXCkgZnJvbSBQcm9ibGVtIEE0IGlzCgokJApcaGF0e2F9X3swfT0tXGZyYWN7bn17XHN1bV97aT0xfV57bn1cbG9nKHhfaSl9CiQkCgpgYGB7cn0KIyBFc3RpbWF0ZSBhIHVuZGVyIHRoZSByZXN0cmljdGVkIG1vZGVsIHdoZXJlIGIgPSAxIChwb3dlciBkaXN0cmlidXRpb24gY2FzZSkKYV9oYXRfcG93ZXIgPC0gLW4gLyBzdW0obG9nKHJlc2Vydm9pcikpCgojIEV2YWx1YXRlIHRoZSBsb2ctbGlrZWxpaG9vZCB1c2luZyB0aGUgZnVsbCBLdW1hcmFzd2FteSBtb2RlbCAoZnJvbSBCMSBlc3RpbWF0ZXMpCmxvZ2xpa19mdWxsIDwtIC1uZWdfbG9nbGlrX2t1bWFyKGMoYV9oYXQsIGJfaGF0KSwgcmVzZXJ2b2lyKQoKIyBFdmFsdWF0ZSB0aGUgbG9nLWxpa2VsaWhvb2QgdW5kZXIgdGhlIHJlc3RyaWN0ZWQgbW9kZWwgd2hlcmUgYiA9IDEKbG9nbGlrX3Jlc3RyaWN0ZWQgPC0gLW5lZ19sb2dsaWtfa3VtYXIoYyhhX2hhdF9wb3dlciwgMSksIHJlc2Vydm9pcikKCiMgQ29uc3RydWN0IHRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3Qgc3RhdGlzdGljIGNvbXBhcmluZyB0aGUgdHdvIG1vZGVscwpHMiA8LSAyICogKGxvZ2xpa19mdWxsIC0gbG9nbGlrX3Jlc3RyaWN0ZWQpCgojIFNpbmNlIG9uZSBwYXJhbWV0ZXIgaXMgcmVzdHJpY3RlZCwgdGhlIHRlc3QgZm9sbG93cyBhIGNoaS1zcXVhcmUgZGlzdHJpYnV0aW9uIHdpdGggMSBkZWdyZWUgb2YgZnJlZWRvbQpwX3ZhbHVlIDwtIDEgLSBwY2hpc3EoRzIsIGRmID0gMSkKY3JpdGljYWxfdmFsdWUgPC0gcWNoaXNxKDAuOTUsIGRmID0gMSkKCiMgRGlzcGxheSByZXN1bHRzIHNvIEkgY2FuIGludGVycHJldCB0aGUgdGVzdAphX2hhdF9wb3dlcgpsb2dsaWtfZnVsbApsb2dsaWtfcmVzdHJpY3RlZApHMgpjcml0aWNhbF92YWx1ZQpwX3ZhbHVlCmBgYAoKVGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBnaXZlcyAkR14yID0gNDguOTI1MzMkIHdpdGggYSBwLXZhbHVlIG9mICQyLjY1ODk4NCBcdGltZXMgMTBeey0xMn0kLiBTaW5jZSB0aGUgcC12YWx1ZSBpcyBsZXNzIHRoYW4gJDAuMDUkLCBJIHJlamVjdCAkSF8wJC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCAkYiBcbmVxIDEkLCBzbyB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIGRvZXMgbm90IGZpdCB0aGUgZGF0YSB3ZWxsLCBhbmQgdGhlIEt1bWFyYXN3YW15IG1vZGVsIGlzIG1vcmUgYXBwcm9wcmlhdGUuCgojIyMgKipQcm9ibGVtIEIzKio6CgpVc2UgdGhlIHByb2NlZHVyZSBhbmQgY29kZSBmcm9tICoqUHJvYmxlbSBCMSoqIHRvIGVzdGltYXRlIHRoZSBNTEVzIG9mICRhJCBhbmQgJGIkLCBhbmQgdGhlbiBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGFuYWx5c2VzOgoKKDEpLiBPYnRhaW4gdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb25zIG9mICRcaGF0e2F9JCBhbmQgJFxoYXR7Yn0kIGFuZCBwbG90IGVhY2ggZGlzdHJpYnV0aW9uIHVzaW5nICoqR2F1c3NpYW4ga2VybmVsIGRlbnNpdHkgY3VydmVzKiouCgpVc2luZyB0aGUgcHJvY2VkdXJlIGZyb20gUHJvYmxlbSBCMSwgdGhlIEt1bWFyYXN3YW15IE1MRXMgYXJlICRcaGF0e2F9ID0gMi41Mjk2MDIwMTE1MDA2JCBhbmQgJFxoYXR7Yn0gPSA3Ljg4MzM5MzU0MDYwNTc0JC4gVGhlc2UgZXN0aW1hdGVzIGFyZSB1c2VkIGFzIHRoZSBzdGFydGluZyB2YWx1ZXMgd2hlbiByZWZpdHRpbmcgdGhlIG1vZGVsIHRvIGVhY2ggYm9vdHN0cmFwIHNhbXBsZS4KCmBgYHtyfQojIFNldCBzZWVkIHNvIHRoZSBib290c3RyYXAgcmVzdWx0cyBjYW4gYmUgcmVwZWF0ZWQKc2V0LnNlZWQoNTA2KQoKIyBDaG9vc2UgdGhlIG51bWJlciBvZiBib290c3RyYXAgc2FtcGxlcwpCIDwtIDEwMDAKCiMgU3RvcmUgdGhlIGJvb3RzdHJhcCBlc3RpbWF0ZXMgb2YgYSBhbmQgYgpib290X2EgPC0gbnVtZXJpYyhCKQpib290X2IgPC0gbnVtZXJpYyhCKQoKIyBSZWZpdCB0aGUgS3VtYXJhc3dhbXkgbW9kZWwgdG8gZWFjaCBib290c3RyYXAgc2FtcGxlCmZvciAoaSBpbiAxOkIpIHsKICBib290X3NhbXBsZSA8LSBzYW1wbGUocmVzZXJ2b2lyLCBzaXplID0gbiwgcmVwbGFjZSA9IFRSVUUpCiAgCiAgYm9vdF9maXQgPC0gb3B0aW0oCiAgICBwYXIgPSBjKGFfaGF0LCBiX2hhdCksCiAgICBmbiA9IG5lZ19sb2dsaWtfa3VtYXIsCiAgICB4ID0gYm9vdF9zYW1wbGUsCiAgICBtZXRob2QgPSAiTC1CRkdTLUIiLAogICAgbG93ZXIgPSBjKDAuMDAwMSwgMC4wMDAxKQogICkKICAKICBib290X2FbaV0gPC0gYm9vdF9maXQkcGFyWzFdCiAgYm9vdF9iW2ldIDwtIGJvb3RfZml0JHBhclsyXQp9CmBgYAoKYGBge3J9CiMgUGxvdCB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiBhLWhhdApwbG90KAogIGRlbnNpdHkoYm9vdF9hLCBrZXJuZWwgPSAiZ2F1c3NpYW4iKSwKICBtYWluID0gIkJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgYS1oYXQiLAogIHhsYWIgPSAiQm9vdHN0cmFwIGVzdGltYXRlcyBvZiBhIiwKICB5bGFiID0gIkRlbnNpdHkiCikKYGBgCgpgYGB7cn0KIyBQbG90IHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIGItaGF0CnBsb3QoCiAgZGVuc2l0eShib290X2IsIGtlcm5lbCA9ICJnYXVzc2lhbiIpLAogIG1haW4gPSAiQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBiLWhhdCIsCiAgeGxhYiA9ICJCb290c3RyYXAgZXN0aW1hdGVzIG9mIGIiLAogIHlsYWIgPSAiRGVuc2l0eSIKKQpgYGAKCigyKS4gIENvbnN0cnVjdCBib3RoIHRoZSAkOTVcJSQgKipib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCoqIGFuZCB0aGUgKipXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwqKiBmb3IgJGIkLiBEbyB0aGVzZSBpbnRlcnZhbHMgYWdyZWUgd2l0aCB0aGUgcmVzdWx0cyBvYnRhaW5lZCBpbiAqKlByb2JsZW0gQjIqKj8gWypDb21wdXRlIHRoZSBzdGFuZGFyZCBlcnJvciBvZiAkXGhhdHtifSQgdXNpbmcgdGhlIG9ic2VydmVkIEZpc2hlciBpbmZvcm1hdGlvbiBtYXRyaXgsIGkuZS4sIHRoZSBpbnZlcnNlIG9mIHRoZSBuZWdhdGl2ZSBIZXNzaWFuIG9idGFpbmVkIGZyb20gb3B0aW0oKSpdCgpGb3IgXChiXCksIHRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBib290c3RyYXAgZXN0aW1hdGVzIG9mIFwoXGhhdHtifVwpLCB3aGlsZSB0aGUgV2FsZCBjb25maWRlbmNlIGludGVydmFsIGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBlcnJvciBmcm9tIHRoZSBpbnZlcnNlIG9mIHRoZSBvYnNlcnZlZCBGaXNoZXIgaW5mb3JtYXRpb24gbWF0cml4LgoKYGBge3J9CiMgVXNlIHRoZSBib290c3RyYXAgZXN0aW1hdGVzIGZyb20gQjMoMSkgdG8gZ2V0IHRoZSA5NSUgcGVyY2VudGlsZSBpbnRlcnZhbCBmb3IgYgpib290X2NpX2IgPC0gcXVhbnRpbGUoYm9vdF9iLCBwcm9icyA9IGMoMC4wMjUsIDAuOTc1KSkKCiMgUmVmaXQgdGhlIG1vZGVsIG9uZSBtb3JlIHRpbWUgc28gSSBjYW4gZXh0cmFjdCB0aGUgSGVzc2lhbiBtYXRyaXggZnJvbSBvcHRpbSgpCmZpdF9rdW1hcl9oZXNzaWFuIDwtIG9wdGltKAogIHBhciA9IGMoYV9oYXQsIGJfaGF0KSwKICBmbiA9IG5lZ19sb2dsaWtfa3VtYXIsCiAgeCA9IHJlc2Vydm9pciwKICBtZXRob2QgPSAiTC1CRkdTLUIiLAogIGxvd2VyID0gYygwLjAwMDEsIDAuMDAwMSksCiAgaGVzc2lhbiA9IFRSVUUKKQoKIyBUYWtlIHRoZSBpbnZlcnNlIG9mIHRoZSBIZXNzaWFuIHRvIGdldCB0aGUgZXN0aW1hdGVkIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4CmNvdl9tYXRyaXggPC0gc29sdmUoZml0X2t1bWFyX2hlc3NpYW4kaGVzc2lhbikKCiMgUHVsbCBvdXQgdGhlIHN0YW5kYXJkIGVycm9yIGZvciBiLWhhdCAoc2Vjb25kIHBhcmFtZXRlcikKc2VfYiA8LSBzcXJ0KGNvdl9tYXRyaXhbMiwgMl0pCgojIEJ1aWxkIHRoZSBXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwgdXNpbmcgYi1oYXQgwrEgMS45NiAqIFNFCndhbGRfY2lfYiA8LSBiX2hhdCArIGMoLTEsIDEpICogMS45NiAqIHNlX2IKCiMgUHJpbnQgZXZlcnl0aGluZyBzbyBJIGNhbiBjb21wYXJlIHRoZSB0d28gaW50ZXJ2YWxzIGFuZCByZWxhdGUgYmFjayB0byBCMgpib290X2NpX2IKc2VfYgp3YWxkX2NpX2IKYGBgCgpUaGUgOTUlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFsIGZvciAkYiQgaXMgJCg0Ljg0NTg1NCwgMTUuNTQxOTIzKSQsIGFuZCB0aGUgOTUlIFdhbGQgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyAkKDMuNDgzOTUxLCAxMi4yODI4MzYpJC4gVGhlIHN0YW5kYXJkIGVycm9yIG9mICRcaGF0e2J9JCBvYnRhaW5lZCBmcm9tIHRoZSBpbnZlcnNlIEhlc3NpYW4gaXMgJDIuMjQ0NjE0JC4gQm90aCBpbnRlcnZhbHMgYXJlIGVudGlyZWx5IGFib3ZlICQxJCwgc28gdGhleSBhZ3JlZSB3aXRoIHRoZSByZXN1bHQgZnJvbSBQcm9ibGVtIEIyIHdoZXJlICRIXzA6Yj0xJCB3YXMgcmVqZWN0ZWQuIFRoaXMgc3VwcG9ydHMgdGhlIGNvbmNsdXNpb24gdGhhdCAkYiBcbmVxIDEkLCBtZWFuaW5nIHRoZSBwb3dlciBkaXN0cmlidXRpb24gZG9lcyBub3QgZml0IHRoZSBkYXRhIGFzIHdlbGwgYXMgdGhlIGZ1bGwgS3VtYXJhc3dhbXkgbW9kZWwuCgooMykuIEJhc2VkIG9uIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmcm9tIHBhcnQgKDEpIG9mIHRoaXMgcHJvYmxlbSwgYXNzZXNzIHdoZXRoZXIgdGhlIHZhbGlkaXR5IG9mIHRoZSBXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaXMgc3VwcG9ydGVkLgoKXAoKVGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24gZm9yICRcaGF0e2J9JCBpcyByaWdodC1za2V3ZWQsIHNvIHRoZSBub3JtYWwgYXBwcm94aW1hdGlvbiB1c2VkIGZvciB0aGUgV2FsZCBjb25maWRlbmNlIGludGVydmFsIGlzIG5vdCBzdHJvbmdseSBzdXBwb3J0ZWQuIEhvd2V2ZXIsIGJvdGggdGhlIGJvb3RzdHJhcCBhbmQgV2FsZCBjb25maWRlbmNlIGludGVydmFscyBhcmUgZW50aXJlbHkgYWJvdmUgJDEkLCBzbyB0aGV5IHN0aWxsIGFncmVlIHdpdGggdGhlIGRlY2lzaW9uIGZyb20gUHJvYmxlbSBCMiB0aGF0ICRIXzA6Yj0xJCBzaG91bGQgYmUgcmVqZWN0ZWQuIFRoZXJlZm9yZSwgdGhlIFdhbGQgaW50ZXJ2YWwgZ2l2ZXMgdGhlIHNhbWUgY29uY2x1c2lvbiwgYnV0IHRoZSBib290c3RyYXAgaW50ZXJ2YWwgaXMgbW9yZSBhcHByb3ByaWF0ZSBiZWNhdXNlIGl0IHJlZmxlY3RzIHRoZSBza2V3bmVzcyBpbiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLgoKIyMjICoqUHJvYmxlbSBCNCoqOgoKSW4gdGhlIGludHJvZHVjdGlvbiB0byB0aGUgd29ya2luZyBtb2RlbCBmb3IgdGhpcyBleGFtLCB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIHJlZHVjZXMgdG8gdGhlIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9uICgwLDEpLiBJbiB0aGlzIHByb2JsZW0sIHdlIHBlcmZvcm0gYSAqKmxpa2VsaWhvb2QgcmF0aW8gdGVzdCoqIGZvciB0aGUgZm9sbG93aW5nIGh5cG90aGVzaXMgdG8gYXNzZXNzIHdoZXRoZXIgdGhlIGRhdGEgY29tZSBmcm9tIHRoZSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvbiAoMCwxKToKCiQkCkhfMDogYSA9IDFccXVhZCBcJiBccXVhZCBiID0gMVxxdWFkIFx0ZXh0eyB2ZXJzdXMgfSBccXVhZCBIX2E6IGEgXG5lIDEgXHF1YWQgXHRleHR7b3J9IFxxdWFkIGIgXG5lIDEgXHF1YWQgXHRleHR7b3J9XHF1YWQgKGEgXG5lIDEgXHF1YWQgXCYgXHF1YWQgYiBcbmUgMSkuCiQkCgpQcm92aWRlIGEgcHJhY3RpY2FsIGludGVycHJldGF0aW9uIG9mIHRoZSBhYm92ZSB0ZXN0IHJlc3VsdC4gWypIaW50OiAkSF9hJCBiYXNpY2FsbHkgc2F5cyB0aGF0IHRoZXJlIGlzIG5vIGNvbnN0cmFpbnRzIGZvciAkYSQgYW5kICRiJC4gUGxlYXNlIHJldmlldyB0aGUgbGVjdHVyZSBub3RlIGZvciBtb2R1bGUgMTEgIG9uIHRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3QgYmVmb3JlIGNvZGluZy4qXQoKXAoKYGBge3J9CiMgVXNlIHRoZSB1bnJlc3RyaWN0ZWQgS3VtYXJhc3dhbXkgbW9kZWwgZnJvbSBQcm9ibGVtIEIxCmxvZ2xpa19mdWxsIDwtIC1uZWdfbG9nbGlrX2t1bWFyKGMoYV9oYXQsIGJfaGF0KSwgcmVzZXJ2b2lyKQoKIyBVc2UgdGhlIHJlc3RyaWN0ZWQgdW5pZm9ybSBtb2RlbCB3aGVyZSBhID0gMSBhbmQgYiA9IDEKbG9nbGlrX3Jlc3RyaWN0ZWQgPC0gLW5lZ19sb2dsaWtfa3VtYXIoYygxLCAxKSwgcmVzZXJ2b2lyKQoKIyBCdWlsZCB0aGUgbGlrZWxpaG9vZCByYXRpbyB0ZXN0IHN0YXRpc3RpYwpHMl91bmlmb3JtIDwtIDIgKiAobG9nbGlrX2Z1bGwgLSBsb2dsaWtfcmVzdHJpY3RlZCkKCiMgVHdvIHBhcmFtZXRlcnMgYXJlIGZpeGVkIHVuZGVyIEgwLCBzbyB0aGUgdGVzdCB1c2VzIDIgZGVncmVlcyBvZiBmcmVlZG9tCmNyaXRpY2FsX3ZhbHVlX3VuaWZvcm0gPC0gcWNoaXNxKDAuOTUsIGRmID0gMikKcF92YWx1ZV91bmlmb3JtIDwtIDEgLSBwY2hpc3EoRzJfdW5pZm9ybSwgZGYgPSAyKQoKIyBQcmludCB0aGUgdmFsdWVzIG5lZWRlZCBmb3IgdGhlIHN0YXRpc3RpY2FsIGRlY2lzaW9uCmxvZ2xpa19mdWxsCmxvZ2xpa19yZXN0cmljdGVkCkcyX3VuaWZvcm0KY3JpdGljYWxfdmFsdWVfdW5pZm9ybQpwX3ZhbHVlX3VuaWZvcm0KYGBgCgpQcmFjdGljYWxseSwgdGhpcyByZXN1bHQgc3VnZ2VzdHMgdGhhdCB0aGUgcmVzZXJ2b2lyIHN0b3JhZ2UgZGF0YSBhcmUgbm90IHNwcmVhZCBldmVubHkgYWNyb3NzIHRoZSBpbnRlcnZhbCAkKDAsMSkkLCBzbyB0aGUgVW5pZm9ybSQoMCwxKSQgbW9kZWwgZG9lcyBub3QgZGVzY3JpYmUgdGhlIGRhdGEgd2VsbC4gVGhlIGxpa2VsaWhvb2QgcmF0aW8gc3RhdGlzdGljIHdhcyAkR14yID0gNDkuMTI1NDIkIHdpdGggcC12YWx1ZSAkPSAyLjE1MDU1OCBcdGltZXMgMTBeey0xMX0kLCB3aGljaCBnaXZlcyB2ZXJ5IHN0cm9uZyBldmlkZW5jZSBhZ2FpbnN0ICRIXzA6YT0xLFwgYj0xJC4gV2hlbiBib3RoIHBhcmFtZXRlcnMgYXJlIGFsbG93ZWQgdG8gdmFyeSBmcmVlbHksIHRoZSBLdW1hcmFzd2FteSBtb2RlbCBmaXRzIHRoZSBkYXRhIG11Y2ggYmV0dGVyIHRoYW4gdGhlIHJlc3RyaWN0ZWQgdW5pZm9ybSBtb2RlbC4KCjxmb250IGNvbG9yID0gInJlZCI+KipOb3RlKio6IFBsZWFzZSBkb3dubG9hZCB0aGUgdGVtcGxhdGUgYW5kIGluc2VydCB5b3VyIHdvcmsgaW50byBpdCB0byBjb21wbGV0ZSB0aGUgZXhhbS4gPC9mb250PgoKCgoK