Acontinuacion se desarrollan los ejercicios del libro “Introduction to Statistical Learning” de Gareth James, Daniel Witten, Trevor Hastie y Robert Tibshirani.
Ejercicio 1
Using a little bit of algebra, prove that (4.2) is equivalent to (4.3). In other words, the logistic function representation and logit representation for the logistic regression model are equivalent.
\[(4.2) p(X) = \frac{e^{\beta_{0}+\beta_{1}X}}{1+e^{\beta_{0}+\beta_{1}X}}\] \[ \frac{p(X)}{1-p(x)} = \frac{\frac{e^{\beta_{0}+\beta_{1}X}}{1+e^{\beta_{0}+\beta_{1}X}}}{1 - \frac{e^{\beta_{0}+\beta_{1}X}}{1+e^{\beta_{0}+\beta_{1}X}}}\] \[\frac{p(X)}{1-p(x)} = \frac{\frac{e^{\beta_{0}+\beta_{1}X}}{1+e^{\beta_{0}+\beta_{1}X}}}{\frac{1+e^{\beta_{0}+\beta_{1}X}}{1+e^{\beta_{0}+\beta_{1}X}} - \frac{e^{\beta_{0}+\beta_{1}X}}{1+e^{\beta_{0}+\beta_{1}X}}} \] \[\frac{p(X)}{1-p(x)} = \frac{\frac{e^{\beta_{0}+\beta_{1}X}}{1+e^{\beta_{0}+\beta_{1}X}}}{\frac{1}{1+e^{\beta_{0}+\beta_{1}X}}}\]
\[(4.3)\frac{p(X)}{1-p(x)} =e^{\beta_{0}+\beta_{1}X}\]
Ejercicio 2
It was stated in the text that classifying an observation to the class for which (4.12) is largest is equivalent to classifying an observation to the class for which (4.13) is largest. Prove that this is the case. In other words, under the assumption that the observations in the kth class are drawn from a N(μk, σ2) distribution, the Bayes’ classifier assigns an observation to the class for which the discriminant function is maximized.
Si asumimos que \(f_{k}(x)\) es normal, la probabilidad de observar \(x\) en \(k\) esta dada por:
\[p_k(x)=\frac{\pi_k\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_k)^2}}{\sum{\pi_t\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_t)^2}}}\] Mientras la funcion de discrimancion esta dada por:
\[\delta_k(x)= x\frac{\mu_k}{\sigma^2}-\frac{\mu_k^2}{2\sigma^2}+log(\pi_k)\] Asumimos
\[Max \;\;\; p_k(x) \equiv \delta_k(x)\] Para comprobar esto, dejemox que \(x\) permaesca fija y observerve que estaremos maximizando sobre el parametro \(k\). Suponiendo que \(\delta_k(x) \geq \delta_i(x)\). Con lo que asumimos que \(f_k(x) \geq f_i(x)\):
\[x\frac{\mu_k}{\sigma^2}-\frac{\mu_k^2}{2\sigma^2}+log(\pi_k) \geq x\frac{\mu_i}{\sigma^2}-\frac{\mu_i^2}{2\sigma^2}+log(\pi_i)\] Con esto podemos operar y obtenemos:
\[\pi_ke^{x\frac{\mu_k}{\sigma^2}-\frac{\mu_k^2}{2\sigma^2}} = \pi_ie^{x\frac{\mu_i}{\sigma^2}-\frac{\mu_i^2}{2\sigma^2}}\] Multiplicamos la inecuacion por una constante positiva y obtenemos:
\[e=\frac{\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}x^2}}{\sum{\pi_t\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_t)^2}}}\] Finalmente obtenemos:
\[\frac{\pi_k\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_k)^2}}{\sum{\pi_t\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_t)^2}}} \geq \frac{\pi_i\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_i)^2}}{\sum{\pi_t\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_t)^2}}}\] Que es lo mismo que estipulamos anteriormente cuando establecimos que \(f_k(x) \geq f_i(x)\).
Ejercicio 3
This problem relates to the QDA model, in which the observations within each class are drawn from a normal distribution with a classspecific mean vector and a class specific covariance matrix. We consider the simple case where \(p = 1\); i.e. there is only one feature.
Suppose that we have \(K\) classes, and that if an observation belongs to the kth class then X comes from a one-dimensional normal distribution, \(X ∼ N(μ_k, σ_k^2)\) Recall that the density function for the one-dimensional normal distribution is given in (4.11). Prove that in this case, the Bayes’ classifier is not linear. Argue that it is in fact quadratic.
\[p_k(x)=\frac{\pi_k\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_k)^2}}{\sum{\pi_t\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_t)^2}}}\] \[log(p_k(x))=\frac{log(\pi_k)+log(\frac{1}{\sqrt{2\pi\sigma_k}})-\frac{1}{2\sigma_k^2}(x-\mu_k)^2}{log(\sum{\pi_t\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_t)^2}})}\] \[log(p_k(x))log(\sum{\pi_t\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_t)^2}})=log(\pi_k)+log(\frac{1}{\sqrt{2\pi\sigma_k}})-\frac{1}{2\sigma_k^2}(x-\mu_k)^2\] \[\delta(x)=log(\pi_k)+log(\frac{1}{\sqrt{2\pi\sigma_k}})-\frac{1}{2\sigma_k^2}(x-\mu_k)^2\] Por lo que vemos que \(\delta(x)\) es una funcion quadratica sobre \(x\).
Ejercicio 4
When the number of features p is large, there tends to be a deterioration in the performance of KNN and other local approaches that perform prediction using only observations that are near the test observation for which a prediction must be made. This phenomenon is known as the curse of dimensionality, and it ties into the fact that non-parametric approaches often perform poorly when p is large. We will now investigate this curse.
- Suppose that we have a set of observations, each with measurements on \(p = 1\) feature, \(X\). We assume that \(X\) is uniformly (evenly) distributed on \([0, 1]\). Associated with each observation is a response value. Suppose that we wish to predict a test observation’s response using only observations that are within 10% of the range of \(X\) closest to that test observation. For instance, in order to predict the response for a test observation with \(X = 0.6\), we will use observations in the range \([0.55, 0.65]\). On average, what fraction of the available observations will we use to make the prediction?
R/ En promedio el 10%.
- Now suppose that we have a set of observations, each with measurements on \(p = 2\) features, \(X_1\) and \(X_2\). We assume that (\(X_1\), \(X_2\)) are uniformly distributed on \([0, 1] × [0, 1]\). We wish to predict a test observation’s response using only observations that are within \(10%\) of the range of \(X_1\) and within \(10%\) of the range of \(X_2\) closest to that test observation. For instance, in order to predict the response for a test observation with \(X_1 = 0.6\) and \(X_2 = 0.35\), we will use observations in the range \([0.55, 0.65]\) for \(X_1\) and in the range \([0.3, 0.4]\) for \(X_2\). On average, what fraction of the available observations will we use to make the prediction?
R/ En promedio 1%
- Now suppose that we have a set of observations on \(p = 100\) features. Again the observations are uniformly distributed on each feature, and again each feature ranges in value from 0 to 1. We wish to predict a test observation’s response using observations within the \(10%\) of each feature’s range that is closest to that test observation. What fraction of the available observations will we use to make the prediction?
R/\(\pmb{0.1^100*100=10^-98}\)
- Using your answers to parts (a)–(c), argue that a drawback of KNN when p is large is that there are very few training observations “near” any given test observation.
R/ Como p incrementa linealmente, las observaciones que se encuentran geometricamente cerca disminuyen exponencialmente.
- Now suppose that we wish to make a prediction for a test observation by creating a p-dimensional hypercube centered around the test observation that contains, on average, \(10%\) of the training observations. For \(p = 1, 2, \dots,100\), what is the length of each side of the hypercube? Comment on your answer.
\[p=1, l=0.1\] \[p=2, l=\sqrt{0.1}*0.32\] \[p=3, l=0.1^{\frac{1}{3}}*0.46\] \[ \dots \] \[p=N, l=0.1^{\frac{1}{N}}\]
Ejercicio 5
We now examine the differences between LDA and QDA.
- If the Bayes decision boundary is linear, do we expect LDA or QDA to perform better on the training set? On the test set?
R/ Si el límite de decisión de Bayes es lineal, esperamos que el QDA se desempeñe mejor en el conjunto de entrenamiento porque su mayor flexibilidad dará un mejor ajuste. En el conjunto de pruebas, esperamos que LDA se desempeñe mejor que QDA porque QDA podría sobrepasar la linealidad del límite de decisión de Bayes.
- If the Bayes decision boundary is non-linear, do we expect LDA or QDA to perform better on the training set? On the test set?
R/ Si el límite de decisión de Bayes no es lineal, esperamos que QDA tenga un mejor desempeño tanto en el entrenamiento como en los conjuntos de pruebas.
- In general, as the sample size n increases, do we expect the test prediction accuracy of QDA relative to LDA to improve, decline, or be unchanged? Why?
R/ Esperamos que la precisión de la predicción de la prueba de QDA en relación con la LDA mejore, en general, a medida que aumenta el tamaño de la muestra n porque un método más flexible proporcionará un mejor ajuste, ya que se pueden ajustar más muestras y la variación se compensa con los tamaños de muestra más grandes.
- True or False: Even if the Bayes decision boundary for a given problem is linear, we will probably achieve a superior test error rate using QDA rather than LDA because QDA is flexible enough to model a linear decision boundary. Justify your answer.
R/ Falso. Con menos puntos de muestra, la varianza de usar un método más flexible, como el QDA, llevaría a un ajuste excesivo, produciendo una tasa de prueba más alta que la LDA.
Ejercicio 6
Suppose we collect data for a group of students in a statistics class with variables \(X_1=hours studied\), \(X_2=undergrad \; GPA\), and \(Y= receive\;an\;A\). We fit a logistic regression and produce estimated coefficient, \(\hat{\beta}_0=-6\), \(\hat{\beta}_1=0.05\), \(\hat{\beta}_2=1\).
- Estimate the probability that a student who studies for 40 h and has an undergrad GPA of 3.5 gets an A in the class.
\[X=[40\;hours, 3.5\;GPA]\] \[p(X)=\frac{e^{-6+0.05X_1+X_2}}{1+e^{-6+0.05X_1+X_2}}\] \[p(X)=\frac{e^{-6+0.0540+3.5}}{1+e^{-6+0.0540+3.5}}\] \[p(X)=\frac{e^{-0.5}}{1+e^{-0.5}}\] \[p(X)=37.75\%\] b) How many hours would the student in part (a) need to study to have a 50% chance of getting an A in the class?
\[X=[X_1\;hours,3.5\;GPA]\] \[p(X)=\frac{e^{-6+0.05X_1+X_2}}{1+e^{-6+0.05X_1+X_2}}\] \[0.5=\frac{e^{-6+0.05X_1+3.5}}{1+e^{-6+0.05X_1+3.5}}\] \[0.5(1+e^{-2.5+0.05X_1})=e^{-2.5+0.05X_1}\] \[0.5 +0.5e^{-2.5+0.05X_1}=e^{-2.5+0.05X_1}\] \[0.5=0.5e^{-2.5+0.05X_1}\] \[log(1)=-2.5+0.05X_1\] \[X_1=2.5/0.05\] \[X_1=50\;hours\]
Ejercicio 7
Suppose that we wish to predict whether a given stock will issue a dividend this year (“Yes” or “No”) based on \(X\), last year’s percent profit. We examine a large number of companies and discover that the mean value of \(X\) for companies that issued a dividend was \(\bar{X}=10\), while the mean for those that didn’t was \(\bar{X}=0\). In addition, the variance of \(X\) for these two sets of companies was \(\hat{\sigma}^2=36\). Finally, 80% of companies issues dividends. Assuming that \(X\) follows a normal distribution, predict the probability that a company will issue a dividend this year given that its percentage profit was \(X=4\) last year.
\[p_k(x)=\frac{\pi_k\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_k)^2}}{\sum{\pi_t\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_t)^2}}}\] \[p_{yes}(x)=\frac{\pi_{yes}\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_{yes})^2}}{\sum{\pi_t\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_t)^2}}}\] \[p_{yes}(x)=\frac{\pi_{yes}\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_{yes})^2}}{\pi_{yes}\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_{yes})^2} + \pi_{no}\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{1}{2\sigma^2}(x-\mu_{no})^2}}\] \[p_{yes}(x)=\frac{0.8e^{-\frac{1}{2*36}(x-10)^2}}{0.8e^{-\frac{1}{2*36}(x-10)^2}+0.2e^{-\frac{1}{2*36}x^2}}\] \[p_{yes}(4)=\frac{0.8e^{-\frac{1}{2*36}(4-10)^2}}{0.8e^{-\frac{1}{2*36}(4-10)^2}+0.2e^{-\frac{1}{2*36}4^2}}\] \[p_{yes}(4)=75.2\%\]
Ejercicio 8
Suppose that we take a data set, divide it into equally-sized training and test sets, and then try out two different classification procedures. First we use logistic regression and get an error rate of 20 % on the training data and 30 % on the test data. Next we use 1-nearest neighbors (i.e. K = 1) and get an average error rate (averaged over both test and training data sets) of 18 %. Based on these results, which method should we prefer to use for classification of new observations? Why?
R/ Dado: Regresión logística: 20% de tasa de error de entrenamiento, 30% de tasa de error de prueba KNN (K = 1): tasa de error promedio de 18%. Para KNN con K = 1, la tasa de error de entrenamiento es 0% porque para cualquier observación de entrenamiento, su vecino más cercano será la respuesta en sí. Entonces, KNN tiene una tasa de error de prueba del 36%. Elegiría la regresión logística debido a su menor tasa de error de prueba del 30%.
Ejercicio 9
This problem has to do with odds.
- On average, what fraction of people with an odds of 0.37 of defaulting on their credit card payment will in fact default?
\[\frac{p(X)}{1-p(X)}=0.37\] \[p(X)=0.37(1-p(X))\] \[1.37p(X)=0.37\] \[p(X)=\frac{0.37}{1.37}\] \[p(X)=27\%\]
- Suppose that an individual has a 16 % chance of defaulting on her credit card payment. What are the odds that she will default?
\[prob=\frac{p(X)}{1-p(X)}\] \[prob=\frac{0.16}{0.84}\]
\[prob=0.19\]
LS0tCnRpdGxlOiAiSG9qYSBkZSBUcmFiYWpvIDMsIEV4dHJhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpBY29udGludWFjaW9uIHNlIGRlc2Fycm9sbGFuIGxvcyBlamVyY2ljaW9zIGRlbCBsaWJybyAiSW50cm9kdWN0aW9uIHRvIFN0YXRpc3RpY2FsIExlYXJuaW5nIiBkZSBHYXJldGggSmFtZXMsIERhbmllbCBXaXR0ZW4sIFRyZXZvciBIYXN0aWUgeSBSb2JlcnQgVGlic2hpcmFuaS4KCiMjIyBFamVyY2ljaW8gMQoKVXNpbmcgYSBsaXR0bGUgYml0IG9mIGFsZ2VicmEsIHByb3ZlIHRoYXQgKDQuMikgaXMgZXF1aXZhbGVudCB0byAoNC4zKS4gSW4gb3RoZXIgd29yZHMsIHRoZSBsb2dpc3RpYyBmdW5jdGlvbiByZXByZXNlbnRhdGlvbiBhbmQgbG9naXQgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIGFyZSBlcXVpdmFsZW50LgoKJCQoNC4yKSAgcChYKSA9IFxmcmFje2Vee1xiZXRhX3swfStcYmV0YV97MX1YfX17MStlXntcYmV0YV97MH0rXGJldGFfezF9WH19JCQKJCQgXGZyYWN7cChYKX17MS1wKHgpfSA9IFxmcmFje1xmcmFje2Vee1xiZXRhX3swfStcYmV0YV97MX1YfX17MStlXntcYmV0YV97MH0rXGJldGFfezF9WH19fXsxIC0gXGZyYWN7ZV57XGJldGFfezB9K1xiZXRhX3sxfVh9fXsxK2Vee1xiZXRhX3swfStcYmV0YV97MX1YfX19JCQKJCRcZnJhY3twKFgpfXsxLXAoeCl9ID0gXGZyYWN7XGZyYWN7ZV57XGJldGFfezB9K1xiZXRhX3sxfVh9fXsxK2Vee1xiZXRhX3swfStcYmV0YV97MX1YfX19e1xmcmFjezErZV57XGJldGFfezB9K1xiZXRhX3sxfVh9fXsxK2Vee1xiZXRhX3swfStcYmV0YV97MX1YfX0gLSBcZnJhY3tlXntcYmV0YV97MH0rXGJldGFfezF9WH19ezErZV57XGJldGFfezB9K1xiZXRhX3sxfVh9fX0gJCQKJCRcZnJhY3twKFgpfXsxLXAoeCl9ID0gXGZyYWN7XGZyYWN7ZV57XGJldGFfezB9K1xiZXRhX3sxfVh9fXsxK2Vee1xiZXRhX3swfStcYmV0YV97MX1YfX19e1xmcmFjezF9ezErZV57XGJldGFfezB9K1xiZXRhX3sxfVh9fX0kJAoKJCQoNC4zKVxmcmFje3AoWCl9ezEtcCh4KX0gPWVee1xiZXRhX3swfStcYmV0YV97MX1YfSQkCgojIyMgRWplcmNpY2lvIDIKCkl0IHdhcyBzdGF0ZWQgaW4gdGhlIHRleHQgdGhhdCBjbGFzc2lmeWluZyBhbiBvYnNlcnZhdGlvbiB0byB0aGUgY2xhc3MgZm9yIHdoaWNoICg0LjEyKSBpcyBsYXJnZXN0IGlzIGVxdWl2YWxlbnQgdG8gY2xhc3NpZnlpbmcgYW4gb2JzZXJ2YXRpb24gdG8gdGhlIGNsYXNzIGZvciB3aGljaCAoNC4xMykgaXMgbGFyZ2VzdC4gUHJvdmUgdGhhdCB0aGlzIGlzIHRoZSBjYXNlLiBJbiBvdGhlciB3b3JkcywgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgb2JzZXJ2YXRpb25zIGluIHRoZSBrdGggY2xhc3MgYXJlIGRyYXduIGZyb20gYSBOKM68aywgz4MyKSBkaXN0cmlidXRpb24sIHRoZSBCYXllc+KAmSBjbGFzc2lmaWVyIGFzc2lnbnMgYW4gb2JzZXJ2YXRpb24gdG8gdGhlIGNsYXNzIGZvciB3aGljaCB0aGUgZGlzY3JpbWluYW50IGZ1bmN0aW9uIGlzIG1heGltaXplZC4KClNpIGFzdW1pbW9zIHF1ZSAkZl97a30oeCkkIGVzIG5vcm1hbCwgbGEgcHJvYmFiaWxpZGFkIGRlIG9ic2VydmFyICR4JCBlbiAkayQgZXN0YSBkYWRhIHBvcjoKCiQkcF9rKHgpPVxmcmFje1xwaV9rXGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYX19ZV57LVxmcmFjezF9ezJcc2lnbWFeMn0oeC1cbXVfayleMn19e1xzdW17XHBpX3RcZnJhY3sxfXtcc3FydHsyXHBpXHNpZ21hfX1lXnstXGZyYWN7MX17MlxzaWdtYV4yfSh4LVxtdV90KV4yfX19JCQKTWllbnRyYXMgbGEgZnVuY2lvbiBkZSBkaXNjcmltYW5jaW9uIGVzdGEgZGFkYSBwb3I6CgokJFxkZWx0YV9rKHgpPSB4XGZyYWN7XG11X2t9e1xzaWdtYV4yfS1cZnJhY3tcbXVfa14yfXsyXHNpZ21hXjJ9K2xvZyhccGlfaykkJApBc3VtaW1vcwoKJCRNYXggXDtcO1w7IHBfayh4KSBcZXF1aXYgXGRlbHRhX2soeCkkJApQYXJhIGNvbXByb2JhciBlc3RvLCBkZWplbW94IHF1ZSAkeCQgcGVybWFlc2NhIGZpamEgeSBvYnNlcnZlcnZlIHF1ZSBlc3RhcmVtb3MgbWF4aW1pemFuZG8gc29icmUgZWwgcGFyYW1ldHJvICRrJC4gU3Vwb25pZW5kbyBxdWUgJFxkZWx0YV9rKHgpIFxnZXEgXGRlbHRhX2koeCkkLiBDb24gbG8gcXVlIGFzdW1pbW9zIHF1ZSAkZl9rKHgpIFxnZXEgZl9pKHgpJDoKCiQkeFxmcmFje1xtdV9rfXtcc2lnbWFeMn0tXGZyYWN7XG11X2teMn17MlxzaWdtYV4yfStsb2coXHBpX2spIFxnZXEgeFxmcmFje1xtdV9pfXtcc2lnbWFeMn0tXGZyYWN7XG11X2leMn17MlxzaWdtYV4yfStsb2coXHBpX2kpJCQKQ29uIGVzdG8gcG9kZW1vcyBvcGVyYXIgeSBvYnRlbmVtb3M6CgokJFxwaV9rZV57eFxmcmFje1xtdV9rfXtcc2lnbWFeMn0tXGZyYWN7XG11X2teMn17MlxzaWdtYV4yfX0gPSBccGlfaWVee3hcZnJhY3tcbXVfaX17XHNpZ21hXjJ9LVxmcmFje1xtdV9pXjJ9ezJcc2lnbWFeMn19JCQKTXVsdGlwbGljYW1vcyBsYSBpbmVjdWFjaW9uIHBvciB1bmEgY29uc3RhbnRlIHBvc2l0aXZhIHkgb2J0ZW5lbW9zOgoKJCRlPVxmcmFje1xmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWF9fWVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9eF4yfX17XHN1bXtccGlfdFxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWF9fWVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9KHgtXG11X3QpXjJ9fX0kJApGaW5hbG1lbnRlIG9idGVuZW1vczoKCiQkXGZyYWN7XHBpX2tcZnJhY3sxfXtcc3FydHsyXHBpXHNpZ21hfX1lXnstXGZyYWN7MX17MlxzaWdtYV4yfSh4LVxtdV9rKV4yfX17XHN1bXtccGlfdFxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWF9fWVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9KHgtXG11X3QpXjJ9fX0gXGdlcSBcZnJhY3tccGlfaVxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWF9fWVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9KHgtXG11X2kpXjJ9fXtcc3Vte1xwaV90XGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYX19ZV57LVxmcmFjezF9ezJcc2lnbWFeMn0oeC1cbXVfdCleMn19fSQkClF1ZSBlcyBsbyBtaXNtbyBxdWUgZXN0aXB1bGFtb3MgYW50ZXJpb3JtZW50ZSBjdWFuZG8gZXN0YWJsZWNpbW9zIHF1ZSAkZl9rKHgpIFxnZXEgZl9pKHgpJC4KCiMjIyBFamVyY2ljaW8gMwoKVGhpcyBwcm9ibGVtIHJlbGF0ZXMgdG8gdGhlIFFEQSBtb2RlbCwgaW4gd2hpY2ggdGhlIG9ic2VydmF0aW9ucyB3aXRoaW4gZWFjaCBjbGFzcyBhcmUgZHJhd24gZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBhIGNsYXNzc3BlY2lmaWMgbWVhbiB2ZWN0b3IgYW5kIGEgY2xhc3Mgc3BlY2lmaWMgY292YXJpYW5jZSBtYXRyaXguIFdlIGNvbnNpZGVyIHRoZSBzaW1wbGUgY2FzZSB3aGVyZSAkcCA9IDEkOyBpLmUuIHRoZXJlIGlzIG9ubHkgb25lIGZlYXR1cmUuCgpTdXBwb3NlIHRoYXQgd2UgaGF2ZSAkSyQgY2xhc3NlcywgYW5kIHRoYXQgaWYgYW4gb2JzZXJ2YXRpb24gYmVsb25ncyB0byB0aGUga3RoIGNsYXNzIHRoZW4gWCBjb21lcyBmcm9tIGEgb25lLWRpbWVuc2lvbmFsIG5vcm1hbCBkaXN0cmlidXRpb24sICRYIOKIvCBOKM68X2ssIM+DX2teMikkIFJlY2FsbCB0aGF0IHRoZSBkZW5zaXR5IGZ1bmN0aW9uIGZvciB0aGUKb25lLWRpbWVuc2lvbmFsIG5vcm1hbCBkaXN0cmlidXRpb24gaXMgZ2l2ZW4gaW4gKDQuMTEpLiBQcm92ZSB0aGF0IGluIHRoaXMgY2FzZSwgdGhlIEJheWVz4oCZIGNsYXNzaWZpZXIgaXMgbm90IGxpbmVhci4gQXJndWUgdGhhdCBpdCBpcyBpbiBmYWN0IHF1YWRyYXRpYy4KIAokJHBfayh4KT1cZnJhY3tccGlfa1xmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWF9fWVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9KHgtXG11X2spXjJ9fXtcc3Vte1xwaV90XGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYX19ZV57LVxmcmFjezF9ezJcc2lnbWFeMn0oeC1cbXVfdCleMn19fSQkCiQkbG9nKHBfayh4KSk9XGZyYWN7bG9nKFxwaV9rKStsb2coXGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYV9rfX0pLVxmcmFjezF9ezJcc2lnbWFfa14yfSh4LVxtdV9rKV4yfXtsb2coXHN1bXtccGlfdFxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWF9fWVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9KHgtXG11X3QpXjJ9fSl9JCQKJCRsb2cocF9rKHgpKWxvZyhcc3Vte1xwaV90XGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYX19ZV57LVxmcmFjezF9ezJcc2lnbWFeMn0oeC1cbXVfdCleMn19KT1sb2coXHBpX2spK2xvZyhcZnJhY3sxfXtcc3FydHsyXHBpXHNpZ21hX2t9fSktXGZyYWN7MX17MlxzaWdtYV9rXjJ9KHgtXG11X2spXjIkJAokJFxkZWx0YSh4KT1sb2coXHBpX2spK2xvZyhcZnJhY3sxfXtcc3FydHsyXHBpXHNpZ21hX2t9fSktXGZyYWN7MX17MlxzaWdtYV9rXjJ9KHgtXG11X2spXjIkJApQb3IgbG8gcXVlIHZlbW9zIHF1ZSAkXGRlbHRhKHgpJCBlcyB1bmEgZnVuY2lvbiBxdWFkcmF0aWNhIHNvYnJlICR4JC4KCgojIyMgRWplcmNpY2lvIDQKCldoZW4gdGhlIG51bWJlciBvZiBmZWF0dXJlcyBwIGlzIGxhcmdlLCB0aGVyZSB0ZW5kcyB0byBiZSBhIGRldGVyaW9yYXRpb24gaW4gdGhlIHBlcmZvcm1hbmNlIG9mIEtOTiBhbmQgb3RoZXIgbG9jYWwgYXBwcm9hY2hlcyB0aGF0IHBlcmZvcm0gcHJlZGljdGlvbiB1c2luZyBvbmx5IG9ic2VydmF0aW9ucyB0aGF0IGFyZSBuZWFyIHRoZSB0ZXN0IG9ic2VydmF0aW9uIGZvciB3aGljaCBhIHByZWRpY3Rpb24gbXVzdCBiZSBtYWRlLiBUaGlzIHBoZW5vbWVub24gaXMga25vd24gYXMgdGhlIGN1cnNlIG9mIGRpbWVuc2lvbmFsaXR5LCBhbmQgaXQgdGllcyBpbnRvIHRoZSBmYWN0IHRoYXQKbm9uLXBhcmFtZXRyaWMgYXBwcm9hY2hlcyBvZnRlbiBwZXJmb3JtIHBvb3JseSB3aGVuIHAgaXMgbGFyZ2UuIFdlIHdpbGwgbm93IGludmVzdGlnYXRlIHRoaXMgY3Vyc2UuCgphKSBTdXBwb3NlIHRoYXQgd2UgaGF2ZSBhIHNldCBvZiBvYnNlcnZhdGlvbnMsIGVhY2ggd2l0aCBtZWFzdXJlbWVudHMgb24gJHAgPSAxJCBmZWF0dXJlLCAkWCQuIFdlIGFzc3VtZSB0aGF0ICRYJCBpcyB1bmlmb3JtbHkgKGV2ZW5seSkgZGlzdHJpYnV0ZWQgb24gJFswLCAxXSQuIEFzc29jaWF0ZWQgd2l0aCBlYWNoIG9ic2VydmF0aW9uIGlzIGEgcmVzcG9uc2UgdmFsdWUuIFN1cHBvc2UgdGhhdCB3ZSB3aXNoIHRvIHByZWRpY3QgYSB0ZXN0IG9ic2VydmF0aW9u4oCZcyByZXNwb25zZSB1c2luZyBvbmx5IG9ic2VydmF0aW9ucyB0aGF0IGFyZSB3aXRoaW4gMTAlIG9mIHRoZSByYW5nZSBvZiAkWCQgY2xvc2VzdCB0byB0aGF0IHRlc3Qgb2JzZXJ2YXRpb24uIEZvciBpbnN0YW5jZSwgaW4gb3JkZXIgdG8gcHJlZGljdCB0aGUgcmVzcG9uc2UgZm9yIGEgdGVzdCBvYnNlcnZhdGlvbiB3aXRoICRYID0gMC42JCwgd2Ugd2lsbCB1c2Ugb2JzZXJ2YXRpb25zIGluIHRoZSByYW5nZSAkWzAuNTUsIDAuNjVdJC4gT24gYXZlcmFnZSwgd2hhdCBmcmFjdGlvbiBvZiB0aGUgYXZhaWxhYmxlIG9ic2VydmF0aW9ucyB3aWxsIHdlIHVzZSB0byBtYWtlIHRoZSBwcmVkaWN0aW9uPwoKUi8gKipFbiBwcm9tZWRpbyBlbCAxMCUuICoqCgpiKSBOb3cgc3VwcG9zZSB0aGF0IHdlIGhhdmUgYSBzZXQgb2Ygb2JzZXJ2YXRpb25zLCBlYWNoIHdpdGggbWVhc3VyZW1lbnRzIG9uICRwID0gMiQgZmVhdHVyZXMsICRYXzEkIGFuZCAkWF8yJC4gV2UgYXNzdW1lIHRoYXQgKCRYXzEkLCAkWF8yJCkgYXJlIHVuaWZvcm1seSBkaXN0cmlidXRlZCBvbiAkWzAsIDFdIMOXIFswLCAxXSQuIFdlIHdpc2ggdG8gcHJlZGljdCBhIHRlc3Qgb2JzZXJ2YXRpb27igJlzIHJlc3BvbnNlIHVzaW5nIG9ubHkgb2JzZXJ2YXRpb25zIHRoYXQgYXJlIHdpdGhpbiAkMTAlJCBvZiB0aGUgcmFuZ2Ugb2YgJFhfMSQgYW5kIHdpdGhpbiAkMTAlJCBvZiB0aGUgcmFuZ2Ugb2YgJFhfMiQgY2xvc2VzdCB0byB0aGF0IHRlc3Qgb2JzZXJ2YXRpb24uIEZvciBpbnN0YW5jZSwgaW4gb3JkZXIgdG8gcHJlZGljdCB0aGUgcmVzcG9uc2UgZm9yIGEgdGVzdCBvYnNlcnZhdGlvbiB3aXRoICRYXzEgPSAwLjYkIGFuZCAkWF8yID0gMC4zNSQsIHdlIHdpbGwgdXNlIG9ic2VydmF0aW9ucyBpbiB0aGUgcmFuZ2UgJFswLjU1LCAwLjY1XSQgZm9yICRYXzEkIGFuZCBpbiB0aGUgcmFuZ2UgJFswLjMsIDAuNF0kIGZvciAkWF8yJC4gT24gYXZlcmFnZSwgd2hhdCBmcmFjdGlvbiBvZiB0aGUgYXZhaWxhYmxlIG9ic2VydmF0aW9ucyB3aWxsIHdlIHVzZSB0byBtYWtlIHRoZSBwcmVkaWN0aW9uPwoKUi8gKipFbiBwcm9tZWRpbyAxJSoqCgpjKSBOb3cgc3VwcG9zZSB0aGF0IHdlIGhhdmUgYSBzZXQgb2Ygb2JzZXJ2YXRpb25zIG9uICRwID0gMTAwJCBmZWF0dXJlcy4gQWdhaW4gdGhlIG9ic2VydmF0aW9ucyBhcmUgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIG9uIGVhY2ggZmVhdHVyZSwgYW5kIGFnYWluIGVhY2ggZmVhdHVyZSByYW5nZXMgaW4gdmFsdWUgZnJvbSAwIHRvIDEuIFdlIHdpc2ggdG8gcHJlZGljdCBhIHRlc3Qgb2JzZXJ2YXRpb27igJlzIHJlc3BvbnNlIHVzaW5nIG9ic2VydmF0aW9ucyB3aXRoaW4gdGhlICQxMCUkIG9mIGVhY2ggZmVhdHVyZeKAmXMgcmFuZ2UgdGhhdCBpcyBjbG9zZXN0IHRvIHRoYXQgdGVzdApvYnNlcnZhdGlvbi4gV2hhdCBmcmFjdGlvbiBvZiB0aGUgYXZhaWxhYmxlIG9ic2VydmF0aW9ucyB3aWxsIHdlIHVzZSB0byBtYWtlIHRoZSBwcmVkaWN0aW9uPwoKUi8kXHBtYnswLjFeMTAwKjEwMD0xMF4tOTh9JAoKZCkgVXNpbmcgeW91ciBhbnN3ZXJzIHRvIHBhcnRzIChhKeKAkyhjKSwgYXJndWUgdGhhdCBhIGRyYXdiYWNrIG9mIEtOTiB3aGVuIHAgaXMgbGFyZ2UgaXMgdGhhdCB0aGVyZSBhcmUgdmVyeSBmZXcgdHJhaW5pbmcgb2JzZXJ2YXRpb25zIOKAnG5lYXLigJ0gYW55IGdpdmVuIHRlc3Qgb2JzZXJ2YXRpb24uCgpSLyAqKkNvbW8gcCBpbmNyZW1lbnRhIGxpbmVhbG1lbnRlLCBsYXMgb2JzZXJ2YWNpb25lcyBxdWUgc2UgZW5jdWVudHJhbiBnZW9tZXRyaWNhbWVudGUgY2VyY2EgZGlzbWludXllbiBleHBvbmVuY2lhbG1lbnRlLioqCgplKSBOb3cgc3VwcG9zZSB0aGF0IHdlIHdpc2ggdG8gbWFrZSBhIHByZWRpY3Rpb24gZm9yIGEgdGVzdCBvYnNlcnZhdGlvbiBieSBjcmVhdGluZyBhIHAtZGltZW5zaW9uYWwgaHlwZXJjdWJlIGNlbnRlcmVkIGFyb3VuZCB0aGUgdGVzdCBvYnNlcnZhdGlvbiB0aGF0IGNvbnRhaW5zLCBvbiBhdmVyYWdlLCAkMTAlJCBvZiB0aGUgdHJhaW5pbmcgb2JzZXJ2YXRpb25zLiBGb3IgJHAgPSAxLCAyLCBcZG90cywxMDAkLCB3aGF0IGlzIHRoZSBsZW5ndGggb2YgZWFjaCBzaWRlIG9mIHRoZSBoeXBlcmN1YmU/IENvbW1lbnQgb24geW91ciBhbnN3ZXIuCgokJHA9MSwgbD0wLjEkJAokJHA9MiwgbD1cc3FydHswLjF9KjAuMzIkJAokJHA9MywgbD0wLjFee1xmcmFjezF9ezN9fSowLjQ2JCQKJCQgXGRvdHMgJCQKJCRwPU4sIGw9MC4xXntcZnJhY3sxfXtOfX0kJAoKIyMjIEVqZXJjaWNpbyA1CgpXZSBub3cgZXhhbWluZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBMREEgYW5kIFFEQS4KCmEpIElmIHRoZSBCYXllcyBkZWNpc2lvbiBib3VuZGFyeSBpcyBsaW5lYXIsIGRvIHdlIGV4cGVjdCBMREEgb3IgUURBIHRvIHBlcmZvcm0gYmV0dGVyIG9uIHRoZSB0cmFpbmluZyBzZXQ/IE9uIHRoZSB0ZXN0IHNldD8KClIvICoqU2kgZWwgbMOtbWl0ZSBkZSBkZWNpc2nDs24gZGUgQmF5ZXMgZXMgbGluZWFsLCBlc3BlcmFtb3MgcXVlIGVsIFFEQSBzZSBkZXNlbXBlw7FlIG1lam9yIGVuIGVsIGNvbmp1bnRvIGRlIGVudHJlbmFtaWVudG8gcG9ycXVlIHN1IG1heW9yIGZsZXhpYmlsaWRhZCBkYXLDoSB1biBtZWpvciBhanVzdGUuIEVuIGVsIGNvbmp1bnRvIGRlIHBydWViYXMsIGVzcGVyYW1vcyBxdWUgTERBIHNlIGRlc2VtcGXDsWUgbWVqb3IgcXVlIFFEQSBwb3JxdWUgUURBIHBvZHLDrWEgc29icmVwYXNhciBsYSBsaW5lYWxpZGFkIGRlbCBsw61taXRlIGRlIGRlY2lzacOzbiBkZSBCYXllcy4qKgoKYikgSWYgdGhlIEJheWVzIGRlY2lzaW9uIGJvdW5kYXJ5IGlzIG5vbi1saW5lYXIsIGRvIHdlIGV4cGVjdCBMREEgb3IgUURBIHRvIHBlcmZvcm0gYmV0dGVyIG9uIHRoZSB0cmFpbmluZyBzZXQ/IE9uIHRoZSB0ZXN0IHNldD8KClIvICoqU2kgZWwgbMOtbWl0ZSBkZSBkZWNpc2nDs24gZGUgQmF5ZXMgbm8gZXMgbGluZWFsLCBlc3BlcmFtb3MgcXVlIFFEQSB0ZW5nYSB1biBtZWpvciBkZXNlbXBlw7FvIHRhbnRvIGVuIGVsIGVudHJlbmFtaWVudG8gY29tbyBlbiBsb3MgY29uanVudG9zIGRlIHBydWViYXMuKioKCmMpIEluIGdlbmVyYWwsIGFzIHRoZSBzYW1wbGUgc2l6ZSBuIGluY3JlYXNlcywgZG8gd2UgZXhwZWN0IHRoZSB0ZXN0IHByZWRpY3Rpb24gYWNjdXJhY3kgb2YgUURBIHJlbGF0aXZlIHRvIExEQSB0byBpbXByb3ZlLCBkZWNsaW5lLCBvciBiZSB1bmNoYW5nZWQ/IFdoeT8KClIvICoqRXNwZXJhbW9zIHF1ZSBsYSBwcmVjaXNpw7NuIGRlIGxhIHByZWRpY2Npw7NuIGRlIGxhIHBydWViYSBkZSBRREEgZW4gcmVsYWNpw7NuIGNvbiBsYSBMREEgbWVqb3JlLCBlbiBnZW5lcmFsLCBhIG1lZGlkYSBxdWUgYXVtZW50YSBlbCB0YW1hw7FvIGRlIGxhIG11ZXN0cmEgbiBwb3JxdWUgdW4gbcOpdG9kbyBtw6FzIGZsZXhpYmxlIHByb3BvcmNpb25hcsOhIHVuIG1lam9yIGFqdXN0ZSwgeWEgcXVlIHNlIHB1ZWRlbiBhanVzdGFyIG3DoXMgbXVlc3RyYXMgeSBsYSB2YXJpYWNpw7NuIHNlIGNvbXBlbnNhIGNvbiBsb3MgdGFtYcOxb3MgZGUgbXVlc3RyYSBtw6FzIGdyYW5kZXMuKioKCmQpIFRydWUgb3IgRmFsc2U6IEV2ZW4gaWYgdGhlIEJheWVzIGRlY2lzaW9uIGJvdW5kYXJ5IGZvciBhIGdpdmVuIHByb2JsZW0gaXMgbGluZWFyLCB3ZSB3aWxsIHByb2JhYmx5IGFjaGlldmUgYSBzdXBlcmlvciB0ZXN0IGVycm9yIHJhdGUgdXNpbmcgUURBIHJhdGhlciB0aGFuIExEQSBiZWNhdXNlIFFEQSBpcyBmbGV4aWJsZSBlbm91Z2ggdG8gbW9kZWwgYSBsaW5lYXIgZGVjaXNpb24gYm91bmRhcnkuIEp1c3RpZnkgeW91ciBhbnN3ZXIuCgpSLyAqKkZhbHNvLiBDb24gbWVub3MgcHVudG9zIGRlIG11ZXN0cmEsIGxhIHZhcmlhbnphIGRlIHVzYXIgdW4gbcOpdG9kbyBtw6FzIGZsZXhpYmxlLCBjb21vIGVsIFFEQSwgbGxldmFyw61hIGEgdW4gYWp1c3RlIGV4Y2VzaXZvLCBwcm9kdWNpZW5kbyB1bmEgdGFzYSBkZSBwcnVlYmEgbcOhcyBhbHRhIHF1ZSBsYSBMREEuKioKCiMjIyBFamVyY2ljaW8gNgoKU3VwcG9zZSB3ZSBjb2xsZWN0IGRhdGEgZm9yIGEgZ3JvdXAgb2Ygc3R1ZGVudHMgaW4gYSBzdGF0aXN0aWNzIGNsYXNzIHdpdGggdmFyaWFibGVzICRYXzE9aG91cnMgc3R1ZGllZCQsICRYXzI9dW5kZXJncmFkIFw7IEdQQSQsIGFuZCAkWT0gcmVjZWl2ZVw7YW5cO0EkLiBXZSBmaXQgYSBsb2dpc3RpYyByZWdyZXNzaW9uIGFuZCBwcm9kdWNlIGVzdGltYXRlZCBjb2VmZmljaWVudCwgJFxoYXR7XGJldGF9XzA9LTYkLCAkXGhhdHtcYmV0YX1fMT0wLjA1JCwgJFxoYXR7XGJldGF9XzI9MSQuCgphKSBFc3RpbWF0ZSB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIHN0dWRlbnQgd2hvIHN0dWRpZXMgZm9yIDQwIGggYW5kIGhhcyBhbiB1bmRlcmdyYWQgR1BBIG9mIDMuNSBnZXRzIGFuIEEgaW4gdGhlIGNsYXNzLgoKJCRYPVs0MFw7aG91cnMsIDMuNVw7R1BBXSQkCiQkcChYKT1cZnJhY3tlXnstNiswLjA1WF8xK1hfMn19ezErZV57LTYrMC4wNVhfMStYXzJ9fSQkCiQkcChYKT1cZnJhY3tlXnstNiswLjA1NDArMy41fX17MStlXnstNiswLjA1NDArMy41fX0kJAokJHAoWCk9XGZyYWN7ZV57LTAuNX19ezErZV57LTAuNX19JCQKJCRwKFgpPTM3Ljc1XCUkJApiKSBIb3cgbWFueSBob3VycyB3b3VsZCB0aGUgc3R1ZGVudCBpbiBwYXJ0IChhKSBuZWVkIHRvIHN0dWR5IHRvIGhhdmUgYSA1MCUgY2hhbmNlIG9mIGdldHRpbmcgYW4gQSBpbiB0aGUgY2xhc3M/CgokJFg9W1hfMVw7aG91cnMsMy41XDtHUEFdJCQKJCRwKFgpPVxmcmFje2Veey02KzAuMDVYXzErWF8yfX17MStlXnstNiswLjA1WF8xK1hfMn19JCQKJCQwLjU9XGZyYWN7ZV57LTYrMC4wNVhfMSszLjV9fXsxK2Veey02KzAuMDVYXzErMy41fX0kJAokJDAuNSgxK2Veey0yLjUrMC4wNVhfMX0pPWVeey0yLjUrMC4wNVhfMX0kJAokJDAuNSArMC41ZV57LTIuNSswLjA1WF8xfT1lXnstMi41KzAuMDVYXzF9JCQKJCQwLjU9MC41ZV57LTIuNSswLjA1WF8xfSQkCiQkbG9nKDEpPS0yLjUrMC4wNVhfMSQkCiQkWF8xPTIuNS8wLjA1JCQKJCRYXzE9NTBcO2hvdXJzJCQKCiMjIyBFamVyY2ljaW8gNwoKU3VwcG9zZSB0aGF0IHdlIHdpc2ggdG8gcHJlZGljdCB3aGV0aGVyIGEgZ2l2ZW4gc3RvY2sgd2lsbCBpc3N1ZSBhIGRpdmlkZW5kIHRoaXMgeWVhciAo4oCcWWVz4oCdIG9yIOKAnE5v4oCdKSBiYXNlZCBvbiAkWCQsIGxhc3QgeWVhcuKAmXMgcGVyY2VudCBwcm9maXQuIFdlIGV4YW1pbmUgYSBsYXJnZSBudW1iZXIgb2YgY29tcGFuaWVzIGFuZCBkaXNjb3ZlciB0aGF0IHRoZSBtZWFuIHZhbHVlIG9mICRYJCBmb3IgY29tcGFuaWVzIHRoYXQgaXNzdWVkIGEgZGl2aWRlbmQgd2FzICRcYmFye1h9PTEwJCwgd2hpbGUgdGhlIG1lYW4gZm9yIHRob3NlIHRoYXQgZGlkbid0IHdhcyAkXGJhcntYfT0wJC4gSW4gYWRkaXRpb24sIHRoZSB2YXJpYW5jZSBvZiAkWCQgZm9yIHRoZXNlIHR3byBzZXRzIG9mIGNvbXBhbmllcyB3YXMgJFxoYXR7XHNpZ21hfV4yPTM2JC4gRmluYWxseSwgODAlIG9mIGNvbXBhbmllcyBpc3N1ZXMgZGl2aWRlbmRzLiBBc3N1bWluZyB0aGF0ICRYJCBmb2xsb3dzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgcHJlZGljdCB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIGNvbXBhbnkgd2lsbCBpc3N1ZSBhIGRpdmlkZW5kIHRoaXMgeWVhciBnaXZlbiB0aGF0IGl0cyBwZXJjZW50YWdlIHByb2ZpdCB3YXMgJFg9NCQgbGFzdCB5ZWFyLgoKJCRwX2soeCk9XGZyYWN7XHBpX2tcZnJhY3sxfXtcc3FydHsyXHBpXHNpZ21hfX1lXnstXGZyYWN7MX17MlxzaWdtYV4yfSh4LVxtdV9rKV4yfX17XHN1bXtccGlfdFxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWF9fWVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9KHgtXG11X3QpXjJ9fX0kJAokJHBfe3llc30oeCk9XGZyYWN7XHBpX3t5ZXN9XGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYX19ZV57LVxmcmFjezF9ezJcc2lnbWFeMn0oeC1cbXVfe3llc30pXjJ9fXtcc3Vte1xwaV90XGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYX19ZV57LVxmcmFjezF9ezJcc2lnbWFeMn0oeC1cbXVfdCleMn19fSQkCiQkcF97eWVzfSh4KT1cZnJhY3tccGlfe3llc31cZnJhY3sxfXtcc3FydHsyXHBpXHNpZ21hfX1lXnstXGZyYWN7MX17MlxzaWdtYV4yfSh4LVxtdV97eWVzfSleMn19e1xwaV97eWVzfVxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWF9fWVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9KHgtXG11X3t5ZXN9KV4yfSArIFxwaV97bm99XGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYX19ZV57LVxmcmFjezF9ezJcc2lnbWFeMn0oeC1cbXVfe25vfSleMn19JCQKJCRwX3t5ZXN9KHgpPVxmcmFjezAuOGVeey1cZnJhY3sxfXsyKjM2fSh4LTEwKV4yfX17MC44ZV57LVxmcmFjezF9ezIqMzZ9KHgtMTApXjJ9KzAuMmVeey1cZnJhY3sxfXsyKjM2fXheMn19JCQKJCRwX3t5ZXN9KDQpPVxmcmFjezAuOGVeey1cZnJhY3sxfXsyKjM2fSg0LTEwKV4yfX17MC44ZV57LVxmcmFjezF9ezIqMzZ9KDQtMTApXjJ9KzAuMmVeey1cZnJhY3sxfXsyKjM2fTReMn19JCQKJCRwX3t5ZXN9KDQpPTc1LjJcJSQkCgojIyMgRWplcmNpY2lvIDgKClN1cHBvc2UgdGhhdCB3ZSB0YWtlIGEgZGF0YSBzZXQsIGRpdmlkZSBpdCBpbnRvIGVxdWFsbHktc2l6ZWQgdHJhaW5pbmcgYW5kIHRlc3Qgc2V0cywgYW5kIHRoZW4gdHJ5IG91dCB0d28gZGlmZmVyZW50IGNsYXNzaWZpY2F0aW9uIHByb2NlZHVyZXMuIEZpcnN0IHdlIHVzZSBsb2dpc3RpYyByZWdyZXNzaW9uIGFuZCBnZXQgYW4gZXJyb3IgcmF0ZSBvZiAyMCAlIG9uIHRoZQp0cmFpbmluZyBkYXRhIGFuZCAzMCAlIG9uIHRoZSB0ZXN0IGRhdGEuIE5leHQgd2UgdXNlIDEtbmVhcmVzdCBuZWlnaGJvcnMgKGkuZS4gSyA9IDEpIGFuZCBnZXQgYW4gYXZlcmFnZSBlcnJvciByYXRlIChhdmVyYWdlZCBvdmVyIGJvdGggdGVzdCBhbmQgdHJhaW5pbmcgZGF0YSBzZXRzKSBvZiAxOCAlLiBCYXNlZCBvbiB0aGVzZSByZXN1bHRzLCB3aGljaCBtZXRob2Qgc2hvdWxkIHdlIHByZWZlciB0byB1c2UgZm9yIGNsYXNzaWZpY2F0aW9uIG9mIG5ldyBvYnNlcnZhdGlvbnM/IFdoeT8KClIvICoqRGFkbzogUmVncmVzacOzbiBsb2fDrXN0aWNhOiAyMCUgZGUgdGFzYSBkZSBlcnJvciBkZSBlbnRyZW5hbWllbnRvLCAzMCUgZGUgdGFzYSBkZSBlcnJvciBkZSBwcnVlYmEgS05OIChLID0gMSk6IHRhc2EgZGUgZXJyb3IgcHJvbWVkaW8gZGUgMTglLiBQYXJhIEtOTiBjb24gSyA9IDEsIGxhIHRhc2EgZGUgZXJyb3IgZGUgZW50cmVuYW1pZW50byBlcyAwJSBwb3JxdWUgcGFyYSBjdWFscXVpZXIgb2JzZXJ2YWNpw7NuIGRlIGVudHJlbmFtaWVudG8sIHN1IHZlY2lubyBtw6FzIGNlcmNhbm8gc2Vyw6EgbGEgcmVzcHVlc3RhIGVuIHPDrS4gRW50b25jZXMsIEtOTiB0aWVuZSB1bmEgdGFzYSBkZSBlcnJvciBkZSBwcnVlYmEgZGVsIDM2JS4gRWxlZ2lyw61hIGxhIHJlZ3Jlc2nDs24gbG9nw61zdGljYSBkZWJpZG8gYSBzdSBtZW5vciB0YXNhIGRlIGVycm9yIGRlIHBydWViYSBkZWwgMzAlLioqCgojIyMgRWplcmNpY2lvIDkKClRoaXMgcHJvYmxlbSBoYXMgdG8gZG8gd2l0aCBvZGRzLgoKYSkgT24gYXZlcmFnZSwgd2hhdCBmcmFjdGlvbiBvZiBwZW9wbGUgd2l0aCBhbiBvZGRzIG9mIDAuMzcgb2YgZGVmYXVsdGluZyBvbiB0aGVpciBjcmVkaXQgY2FyZCBwYXltZW50IHdpbGwgaW4gZmFjdCBkZWZhdWx0PwoKJCRcZnJhY3twKFgpfXsxLXAoWCl9PTAuMzckJAokJHAoWCk9MC4zNygxLXAoWCkpJCQKJCQxLjM3cChYKT0wLjM3JCQKJCRwKFgpPVxmcmFjezAuMzd9ezEuMzd9JCQKJCRwKFgpPTI3XCUkJAoKYikgU3VwcG9zZSB0aGF0IGFuIGluZGl2aWR1YWwgaGFzIGEgMTYgJSBjaGFuY2Ugb2YgZGVmYXVsdGluZyBvbiBoZXIgY3JlZGl0IGNhcmQgcGF5bWVudC4gV2hhdCBhcmUgdGhlIG9kZHMgdGhhdCBzaGUgd2lsbCBkZWZhdWx0PwoKJCRwcm9iPVxmcmFje3AoWCl9ezEtcChYKX0kJAokJHByb2I9XGZyYWN7MC4xNn17MC44NH0kJAoKJCRwcm9iPTAuMTkkJAo=