Definción posteriori empírica
Tal como se nos introdujo en clase, se ha estado trabajando en el
modelo Bayesiano, el cual esta compuesto por:
- Distribución de muestreo:
\[ (Y_i| a,b) \sim N(a + b, \sigma^2),
\hspace{0.5 cm} i = 1,...,n; \hspace{1 cm} \perp\perp_{1 \leq i \leq
n} Y_i | (a, b)\]
- Especificación a priori de los parámetros
\[ a \sim N(\mu_a, \sigma^2_a),\hspace{0.5
cm} b \sim N(\mu_b, \sigma_b^2), \hspace{0.5 cm} a ⊥⊥ b \]
Si queremos obtener la distribución a posteriori empírica de los
parámetros, podemos trabajar bajo el supuesto de que como todas las
\(Yes\) distribuyen Normal y los
parámetros a priori también lo hacen, se puede trabajar bajo el supuesto
que a posteriori seguirán distribuyendo Normal, por lo que tenemos:
\[E(a | Y_1) = E(a) +
Cov(a,Y_1)Var[Y_1]^{-1}(Y_1-E(Y_1))\] \[E(a| Y_1) = \mu_a +
\frac{\sigma_a^2}{\sigma_a^2+\sigma_b^2+\sigma^2} (Y_1 - \mu_a
-\mu_b)\] \[E(a| Y_1) = \frac{
(\sigma_a^2 + \sigma^2)\mu_a + \sigma_a^2(Y_1 -\mu_b)
}{\sigma_a^2+\sigma_b^2+\sigma^2}\] Luego para la varianza
tenemos:
\[Var(a | Y_1) = Var(a) +
Cov(a,Y_1)Var[Y_1]^{-1}Cov(Y_1,a)\]
\[Var(a| Y_1) = \sigma_a +
\frac{\sigma_a^2\sigma_b^2}{\sigma_a^2+\sigma_b^2+\sigma^2}\]
\[Var(a| Y_1) = \frac{\sigma_a^2(\sigma_b^2 +
\sigma^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\] Por lo que podemos
concluir que la distribución es:
\[(a|Y_1) \sim N\bigg( \frac{ (\sigma_a^2
+ \sigma^2)\mu_a + \sigma_a^2(Y_1 -\mu_b)
}{\sigma_a^2+\sigma_b^2+\sigma^2},\frac{\sigma_a^2(\sigma_b^2 +
\sigma^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\]
Analogamente para el caso de \((b|Y_1)\) y \((a+b|Y_1)\) tenemos:
\[(b|Y_1) \sim N\bigg( \frac{ (\sigma_b^2
+ \sigma^2)\mu_b + \sigma_b^2(Y_1 -\mu_a)
}{\sigma_a^2+\sigma_b^2+\sigma^2},\frac{\sigma_b^2(\sigma_a^2 +
\sigma^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\] y
\[(a+b|Y_1) \sim N\bigg( \frac{
\sigma^2(\mu_a^2 + \mu_b^2) + Y_1(\sigma_a^2
-\sigma_b^2)}{\sigma_a^2+\sigma_b^2+\sigma^2},
\frac{\sigma^2(\sigma_a^2 +
\sigma_b^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\]
Claramente aquí estamos basando nuestro análisis solo para el caso
univariado, es decir, solo para \(Y_1\), por lo que si lo generalizamos para
\(n\) \(Yes\) tenemos:
\[(a|Y_i) \sim N_i\bigg( \frac{
(\sigma_a^2 + \sigma^2)\mu_a + \sigma_a^2(Y_i -\mu_b)
}{\sigma_a^2+\sigma_b^2+\sigma^2},\frac{\sigma_a^2(\sigma_b^2 +
\sigma^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\] ,
\[(b|Y_i) \sim N_i\bigg( \frac{
(\sigma_b^2 + \sigma^2)\mu_b + \sigma_b^2(Y_i -\mu_a)
}{\sigma_a^2+\sigma_b^2+\sigma^2},\frac{\sigma_b^2(\sigma_a^2 +
\sigma^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\] y
\[(a+b|Y_i) \sim N_i\bigg( \frac{
\sigma^2(\mu_a^2 + \mu_b^2) + Y_i(\sigma_a^2
-\sigma_b^2)}{\sigma_a^2+\sigma_b^2+\sigma^2},
\frac{\sigma^2(\sigma_a^2 +
\sigma_b^2)}{\sigma_a^2+\sigma_b^2+\sigma^2}\bigg)\]
De modo, que cada distribución será una coordenada del vector y
tendremos \(n\) entradas.
Definición de posteriori con Gibbs Sampleing
Ahora que ya sabemos como distribuye empíricamente nuestros
parámetros, mediante el proceso de Gibbs Sampling intentaremos explicar
si esto es consistente, para ellos revisaremos distintos casos.
Lo primero a hacer es definir la distribución que tendrán los
parámetros a posteriori, pero cuando son simulados desde un Gibbs
Sampler, serán:
\[ (a^{(k)}|Y_i,b^{(k-1)}) \sim
N\bigg(\frac{\mu_a + \sigma_a^2(Y_i - b^{(k-1)})}{ \sigma_a^2 +
\sigma^2},\frac{\sigma_a^2}{\sigma_a^2+\sigma^2} \bigg) \]
\[ (b^{(k)}|Y_i,a^{(k-1)}) \sim
N\bigg(\frac{\mu_b + \sigma_b^2(Y_i - a^{(k-1)})}{ \sigma_b^2 +
\sigma^2},\frac{\sigma_b^2}{\sigma_b^2+\sigma^2} \bigg) \]
\[
(a^{(k)}+b^{(k)}|Y_i,a^{(k-1)},b^{(k-1)}) =
(a^{(k)}|Y_i,b^{(k-1)})+(b^{(k)}|Y_i,a^{(k-1)}) \]
Con esto podemos analizar la convergencia del algoritmo, para cuando
las medias son 0 y las desviaciones estándar 1:
# Definimos el tamaño del vector Y
n = 10000
# Definimos los hiperparámetros mu_a, mu_b, sigma_a, sigma_b y sigma
mu_a = 0
mu_b = 0
sigma_a = 1
sigma_b = 1
sigma = 1
# Definimos los valores iniciales de a y b
#
a_0 = rnorm(1,mu_a,sigma_a)
b_0 = rnorm(1,mu_b,sigma_b)
# Definimos el vector de las observaciones
Y_obs <- rnorm(n,a_0 + b_0, sigma)
# Con ello empezamos el algoritmo de Gibbs para obtener la dist a posteriori
# de la (a|Y_obs),(b|Y_obs) y (a+b|Y_obs)
a_sim = vector(mode = "numeric", length = n)
b_sim = vector(mode = "numeric", length = n)
a_b_sim = vector(mode = "numeric", length = n)
a_sim[1] = a_0
b_sim[1] = b_0
a_b_sim[1] = a_0 + b_0
i = 2
k = 21000
while (i<=k) {
a_sim[i] <- rnorm(1,mean = (mu_a + sigma_a^2*(Y_obs - b_sim[i-1]))/(sigma_a^2+sigma^2),
sd = sqrt((sigma_a^2)/(sigma_a^2+sigma^2)))
b_sim[i] <- rnorm(1,mean = (mu_b + sigma_b^2*(Y_obs - a_sim[i-1]))/(sigma_b^2+sigma^2),
sd = sqrt((sigma_b^2)/(sigma_b^2+sigma^2)))
a_b_sim[i] <- a_sim[i] + b_sim[i]
i=i+1
}
a_sim_20000 <- a_sim[1001:21000]
b_sim_20000 <- b_sim[1001:21000]
a_b_sim_20000 <- a_b_sim[1001:21000]
pos <- seq(1,20000, by = 10)
a_sim_2000 <- c()
b_sim_2000 <- c()
a_b_sim_2000 <- c()
for (i in pos) {
aux1 <- a_sim_20000[i]
aux2 <- b_sim_20000[i]
aux3 <- a_b_sim_20000[i]
a_sim_2000 <- c(a_sim_2000,aux1)
b_sim_2000 <- c(b_sim_2000,aux2)
a_b_sim_2000 <- c(a_b_sim_2000,aux3)
}
Una vez obtenidos los valores de las parámetros a través de la
simulación de Gibbs, podemos analizar su convergencia mediante un
traceplot():
Aquí podemos ver que el parámetro de \(a\) converge a 0.3259672 y \(b\) converge a 0.3360609, mientras que el
mínimo suficiente \(a+b\), converge a
0.6620281 que coincide exactamente con la suma de los parámetros \(a\) y \(b\) (0.6620281) , por lo que hasta el
minuto podemos ver que todo va bien encaminado. Ahora que tenemos las
distribuciones a posteriori mediante un qqplot() y el
ks.test() las podemos comparar en base a la distribución
empírica original:
- Para el parámetro \(a\), tenemos
que el
qqplot() se acerca mucho a la Normal, como se puede
ver en el siguiente gráfico:

y analizando el resultado que nos da el ks.test() es
claro que el parámetro si distribuye Normal, ya que su valor es
demasiado pequeño, como se muestra a continuación:
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_a
D = 0.60929, p-value < 2.2e-16
alternative hypothesis: two-sided
- Para el parámetro \(b\), tenemos
que el
qqplot() se acerca mucho a la Normal:

Es claro observar que practicamente todos los valores son cercanos a
la Normal, nuevamente si analizamos de manera cuantitativa usando el
ks.test(), el valor es demasiado pequeño lo que hace
validar nuestro supuesto.
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_b
D = 0.59964, p-value < 2.2e-16
alternative hypothesis: two-sided
- Para el parámetro \(a+b\), tenemos
que el
qqplot() se acerca mucho a la Normal, mucho más que
los parámetros de forma individual, esto tambien se debe principalmente
a que es el mínimo suficiente:

Nuevamente en este caso la gráfica es practicamente perfecta, y el
ks.test() nos confirma esta idea de que el parámetro
distribuye Normal, dado su tamaño extremadamente pequeño:
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_a_b
D = 0.29368, p-value < 2.2e-16
alternative hypothesis: two-sided
Finalmente, si nos interesa revisar si las distribuciones a
posteriori de \((a|Y_1,...,Y_n)\) y de
\((b|Y_1,...,Y_n)\) son función o se
parecen en algo a la distribución a posteriori del parámetro mínimo
suficiente podemos usar un histograma para revisar su
comportamiento:

Con lo anterior, podemos ver que el algoritmo de Gibbs aplicado a una
cadena de 10^{4} observaciones, cuyas medias son \(0_s\) y sus desviaciones estándar son \(1_s\), todo resulta perfecto. Sin embargo,
¿Qué ocurre cuando la varianza comienza a aumentar?. A
continuación, ampliaremos el análisis para distintos casos donde la
desviación estándar comienza a cambiar (para revisar todos los casos ver
Anexos):
Caso 1: sigma_a > sigma_b > sigma
En este caso definimos, los valores de sigma como :
sigma_a_caso1 = 10000
sigma_b_caso1 = 50
sigma_caso1 = 1
El traceplot() de dicho caso, nos muestra que el
parámetro de \(a\) tiene mayor
dispersión que el de \(b\), por lo que
al final el parámetro mínimo suficiente tiende a dispersarse mucho, sin
embargo si revisamos los qqplot(), tanto el de \(a\) como \(b\) no son muy adecuados, sin embargo el
mínimo sufiente \(a+b\) tiende a ser
mucho más correcto y parecerse a una Normal.
Caso 3: sigma_b > sigma_a > sigma
En este caso definimos, los valores de sigma como :
sigma_a_caso1 = 10000
sigma_b_caso1 = 50
sigma_caso1 = 1
El traceplot() de dicho caso, nos muestra que el
parámetro de \(a\) tiene mayor
dispersión que el de \(b\), por lo que
al final el parámetro mínimo suficiente tiende a dispersarse mucho, sin
embargo si revisamos los qqplot(), tanto el de \(a\) como \(b\) no son muy adecuados, sin embargo el
mínimo sufiente \(a+b\) tiende a ser
mucho más correcto y parecerse a una Normal.
Caso 2: sigma > sigma_b > sigma_a
En este caso definimos, los valores de sigma como :
sigma_a_caso2 = 1
sigma_b_caso2 = 50
sigma_caso2 = 10000
El traceplot() de dicho caso, nos muestra que el
parámetro de \(a\) es el menos
disperso, mientras que el de \(b\) es
muy disperso, por lo que al final el parámetro mínimo suficiente tiende
a dispersarse mucho, sin embargo si revisamos los qqplot(),
tanto el de \(a\), como el de \(b\) y como el mínimo sufiente \(a+b\), no se acercan al valor de la Normal.
Aquí, tenemos un caso particular en el que donde la dispersión de las
observaciones hace que el algoritmo de Gibbs no simula los valores de
manera correcta. A pesar de que el valor del ks.test() nos
da muy pequeño, los valores gráficos nos demuestran que no es correcto.
Esto ocurre de manera similar en el caso 4(revisar Anexos).
Caso 5: sigma_a > sigma_b = sigma y Caso 6: sigma_b > sigma_a
= sigma
En este caso definimos, los valores de sigma como :
# caso 5
sigma_a_caso5 = 10000
sigma_b_caso5 = 3
sigma_caso5 = 3
# caso 6
sigma_a_caso6 = 3
sigma_b_caso6 = 10000
sigma_caso6 = 3
Aquí podemos ver que cuando la varianza de alguno de los parámetros
es demasiado grande la convergencia es muy complicada, tanto del
parámetro correspondiente como la del mínimo suficiente, esto se puede
ver claramente en los qqplots() de dichos casos. Por lo que
podemos ver que en casos como este la convergencia se le complica al
algoritmo de Gibbs.
Caso 7: sigma > sigma_a = sigma_b
En este caso definimos, los valores de sigma como :
sigma_a_caso7 = 1
sigma_b_caso7 = 1
sigma_caso7 = 10000
Aquí tenemos otro caso interesante, ya que al definir la desviación
estándar de las observaciones tan alta, hace que ningún parámetro
converja de manera correcta, algo similar al caso 2 o caso 4, y esto se
aprecia considerablemente en el qqplot() de dicho
problema.
Caso 8: sigma_a = sigma_b > sigma
En este caso definimos, los valores de sigma como :
sigma_a_caso8 = 10000
sigma_b_caso8 = 10000
sigma_caso8 = 1
Finalmente, en este último caso que se ha decidido analizar, podemos
es claro ver que a pesar que la dispersión de los parámetros es
altisima, si el de las observaciones es bajo, podemos asegurar una buena
convergencia del algoritmo.
Anexos
Caso 1: sigma_a > sigma_b > sigma

Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso1_a
D = 0.48916, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso1_b
D = 0.47519, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso1_a_b
D = 0.82388, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 2: sigma > sigma_b > sigma_a

Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso2_a
D = 0.48706, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso2_b
D = 0.48794, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso2_a_b
D = 0.48799, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 3: sigma_b > sigma_a > sigma

Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso3_a
D = 0.47137, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso3_b
D = 0.49592, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso3_a_b
D = 0.73385, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 4: sigma > sigma_a > sigma_b

Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso4_a
D = 0.97789, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso4_b
D = 0.49879, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso4_a_b
D = 0.97785, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 5: sigma_a > sigma_b = sigma

Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso5_a
D = 0.94527, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso5_b
D = 0.30027, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso5_a_b
D = 0.97988, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 6: sigma_b > sigma_a = sigma

Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso6_a
D = 0.30262, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso6_b
D = 0.96133, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso6_a_b
D = 0.97717, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 7: sigma > sigma_a = sigma_b

Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso7_a
D = 0.92548, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso7_b
D = 0.0094631, p-value = 0.05564
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso7_a_b
D = 0.82482, p-value < 2.2e-16
alternative hypothesis: two-sided

Caso 8: sigma_a = sigma_b > sigma

Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso8_a
D = 0.49966, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso8_b
D = 0.49979, p-value < 2.2e-16
alternative hypothesis: two-sided
Asymptotic one-sample Kolmogorov-Smirnov test
data: datos_ordenados_caso8_a_b
D = 0.13896, p-value < 2.2e-16
alternative hypothesis: two-sided

LS0tDQp0aXRsZTogIjxjZW50ZXI+SW50ZXJyb2dhY2nDs24gMyAtIE3DqXRvZG9zIEJheWVzaWFub3M8L2NlbnRlcj4iDQpzdWJ0aXRsZTogIjxjZW50ZXI+RnJhbmNpc2NhIFZpbGNhIFPDoW5jaGV6PC9jZW50ZXI+Ig0KYXV0b3I6ICIiDQpkYXRlOiAiPGNlbnRlcj5gciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkLyVtLyVZJylgPC9jZW50ZXI+Ig0Kb3V0cHV0OiANCiAgICBodG1sX2RvY3VtZW50Og0KICAgICAgICB0b2M6IHRydWUNCiAgICAgICAgdG9jX2Zsb2F0Og0KICAgICAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICAgICAgdGhlbWU6DQogICAgICAgICAgICBiZzogJyMyMDIxMjMnICAgICAgIyBDb2xvciBkZSBmb25kbw0KICAgICAgICAgICAgZmc6ICcjQjhCQ0MyJyAgICAgICMgQ29sb3IgZnVlbnRlIHkgbGluZWFzLg0KICAgICAgICAgICAgcHJpbWFyeTogIiM3ZjAwYjIiICMgUmVzYWx0YWRvDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiA3Mg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gICAgICA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSAgID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyAgID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAgID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gJ2NlbnRlcicsDQogICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBUUlVFKQ0KDQpyZXF1aXJlKGRwbHlyKQ0KcmVxdWlyZShyaW8pDQpyZXF1aXJlKGthYmxlRXh0cmEpDQpyZXF1aXJlKGJlZXByKQ0KcmVxdWlyZShoZXJlKQ0KYGBgDQoNCmBgYHtyIGNhY2hlPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpzb3VyY2UoaGVyZSgiY29kaWdvX2kzLlIiKSwgbG9jYWwgPSBrbml0cjo6a25pdF9nbG9iYWwoKSkNCmBgYA0KDQojIyBJbnRyb2R1Y2Npw7NuDQoNCkVuIGxhIGluZmVyZW5jaWEgQmF5ZXNpYW5hLCBub3JtYWxtZW50ZSBzZSBjb25vY2UgJGYoeXxcdGhldGEpJCB5DQokcChcdGhldGEpJCBkb25kZSAkeSQgc29uIGxhcyBvYnNlcnZhY2lvbmVzIFxuIHkgJFx0aGV0YSQgbG9zIHBhcsOhbWV0cm9zLA0KZW4gbXVjaGFzIG9jYXNpb25lcyBwb3IgbGEgY29tcGxlamlkYWQgcXVlIHB1ZWRlIGFkcXVpcmlyIGxhDQpkaXN0cmlidWNpw7NuIGEgcG9zdGVyaW9yaSAkcChcdGhldGF8eSkkIGVzIGRpZmljaWwgZGUgbXVlc3RyZWFybGEsIHBvcg0KbG8gcXVlIHNlIHJlcXVpZXJlIGRlIG3DqXRvZG9zIGl0ZXJhdGl2b3MgcGFyYSBwb2RlciBvYnRlbmVyIGxhIGZvcm1hIGRlDQpsYSBkaXN0cmlidWNpw7NuIHkgcG9kZXIgcmVzdW1pciBzdXMgY2FyYWN0ZXLDrXN0aWNhcy4gRW4gZXN0b3MgY2Fzb3MsIGxhDQphcHJveGltYWNpw7NuIHNlIHB1ZWRlIHJlYWxpemFyIGEgdHJhdsOpcyBkZSB1biBHaWJicyBTYW1wbGluZywgeWEgcXVlDQplc3RlIGFsZ29yaXRtbyBzZSBjb25zdHJ1eWUgZW4gYmFzZSBhIHVuYSBzZWN1ZW5jaWEgcXVlIGRlcGVuZGUgZGUNCnZhbG9yZXMgZGUgcGFyw6FtZXRyb3MgcHJvdmVuaWVudGVzIGRlIHVuYSBkaXN0cmlidWPDs24gcXVlIHNhYmVtb3MNCnF1ZSBjb252ZXJnZS4NCg0KRW4gZXN0ZSBpbmZvcm1lIHRyYXRhcmVtb3MgZGUgZGVtb3N0cmFyIHF1ZSBlbCBHaWJicyBTYW1wbGluZywgZXMNCmVmZWN0aXZvIGJham8gY2llcnRhcyBjb25kaWNpb25lcywgeWEgcXVlLCBkZW1vc3RyYXJlbW9zIHF1ZSBwYXJhIGNpZXJ0b3MgdmFscm9lcyBkZSBsYSB2YXJpYW56YSBlbCBhbGdvcml0bW8gbm8gY29udmVyZ2UgbyBsZSBjdWVzdGEgbcOhcywgbG8gY3VhbCBzZSBkZWJlIGEgcXVlIG5vIHNlIHRpZW5lIHVuIHBhcsOhbWV0cm8gbcOtbmltbyBzdWZpY2llbnRlLCBsbyBxdWUgbm8gYXNlZ3VyYSBsYSBjb252ZXJnZW5jaWEgZGVsIHByb2Nlc28uIFBvciBsbyBxdWUsIHNlIGFuYWxpemFyw6FuIGxvcyBjYXNvcyBlbiBsb3MgcXVlIGVzIGVmZWN0aXZvIHkgY3VhbGVzIG5vLCBhIHRyYXbDqXMgZGUgZGl2ZXJzYXMgc2ltdWxhY2lvbmVzLg0KDQojIyBEZWZpbmNpw7NuIHBvc3RlcmlvcmkgZW1ww61yaWNhDQoNClRhbCBjb21vIHNlIG5vcyBpbnRyb2R1am8gZW4gY2xhc2UsIHNlIGhhIGVzdGFkbyB0cmFiYWphbmRvIGVuIGVsIG1vZGVsbyBCYXllc2lhbm8sIGVsIGN1YWwgZXN0YSBjb21wdWVzdG8gcG9yOg0KDQoxLiAgRGlzdHJpYnVjacOzbiBkZSBtdWVzdHJlbzoNCg0KJCQgKFlfaXwgYSxiKSBcc2ltIE4oYSArIGIsIFxzaWdtYV4yKSwgXGhzcGFjZXswLjUgY219IGkgPSAxLC4uLixuOyBcaHNwYWNlezEgY219ICBccGVycFxwZXJwX3sxICBcbGVxIGkgIFxsZXEgbn0gWV9pIHwgKGEsIGIpJCQNCg0KMi4gIEVzcGVjaWZpY2FjacOzbiBhIHByaW9yaSBkZSBsb3MgcGFyw6FtZXRyb3MNCg0KJCQgYSBcc2ltIE4oXG11X2EsIFxzaWdtYV4yX2EpLFxoc3BhY2V7MC41IGNtfSAgYiBcc2ltIE4oXG11X2IsIFxzaWdtYV9iXjIpLCBcaHNwYWNlezAuNSBjbX0gYSDiiqXiiqUgYiAkJA0KDQpTaSBxdWVyZW1vcyBvYnRlbmVyIGxhIGRpc3RyaWJ1Y2nDs24gYSBwb3N0ZXJpb3JpIGVtcMOtcmljYSBkZSBsb3MNCnBhcsOhbWV0cm9zLCBwb2RlbW9zIHRyYWJhamFyIGJham8gZWwgc3VwdWVzdG8gZGUgcXVlIGNvbW8gdG9kYXMgbGFzDQokWWVzJCBkaXN0cmlidXllbiBOb3JtYWwgeSBsb3MgcGFyw6FtZXRyb3MgYSBwcmlvcmkgdGFtYmnDqW4gbG8gaGFjZW4sIHNlDQpwdWVkZSB0cmFiYWphciBiYWpvIGVsIHN1cHVlc3RvIHF1ZSBhIHBvc3Rlcmlvcmkgc2VndWlyw6FuIGRpc3RyaWJ1eWVuZG8NCk5vcm1hbCwgcG9yIGxvIHF1ZSB0ZW5lbW9zOg0KDQokJEUoYSB8IFlfMSkgPSBFKGEpICsgQ292KGEsWV8xKVZhcltZXzFdXnstMX0oWV8xLUUoWV8xKSkkJA0KJCRFKGF8IFlfMSkgPSBcbXVfYSArIFxmcmFje1xzaWdtYV9hXjJ9e1xzaWdtYV9hXjIrXHNpZ21hX2JeMitcc2lnbWFeMn0gKFlfMSAtIFxtdV9hIC1cbXVfYikkJA0KJCRFKGF8IFlfMSkgPSBcZnJhY3sgKFxzaWdtYV9hXjIgKyBcc2lnbWFeMilcbXVfYSArIFxzaWdtYV9hXjIoWV8xIC1cbXVfYikgfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9JCQNCkx1ZWdvIHBhcmEgbGEgdmFyaWFuemEgdGVuZW1vczoNCg0KJCRWYXIoYSB8IFlfMSkgPSBWYXIoYSkgKyBDb3YoYSxZXzEpVmFyW1lfMV1eey0xfUNvdihZXzEsYSkkJA0KDQokJFZhcihhfCBZXzEpID0gXHNpZ21hX2EgKyBcZnJhY3tcc2lnbWFfYV4yXHNpZ21hX2JeMn17XHNpZ21hX2FeMitcc2lnbWFfYl4yK1xzaWdtYV4yfSQkDQokJFZhcihhfCBZXzEpID0gXGZyYWN7XHNpZ21hX2FeMihcc2lnbWFfYl4yICsgXHNpZ21hXjIpfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9JCQNClBvciBsbyBxdWUgcG9kZW1vcyBjb25jbHVpciBxdWUgbGEgZGlzdHJpYnVjacOzbiBlczoNCg0KJCQoYXxZXzEpIFxzaW0gTlxiaWdnKCBcZnJhY3sgKFxzaWdtYV9hXjIgKyBcc2lnbWFeMilcbXVfYSArIFxzaWdtYV9hXjIoWV8xIC1cbXVfYikgfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9LFxmcmFje1xzaWdtYV9hXjIoXHNpZ21hX2JeMiArIFxzaWdtYV4yKX17XHNpZ21hX2FeMitcc2lnbWFfYl4yK1xzaWdtYV4yfVxiaWdnKSQkDQoNCkFuYWxvZ2FtZW50ZSBwYXJhIGVsIGNhc28gZGUgJChifFlfMSkkIHkgJChhK2J8WV8xKSQgdGVuZW1vczoNCg0KJCQoYnxZXzEpIFxzaW0gTlxiaWdnKCBcZnJhY3sgKFxzaWdtYV9iXjIgKyBcc2lnbWFeMilcbXVfYiArIFxzaWdtYV9iXjIoWV8xIC1cbXVfYSkgfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9LFxmcmFje1xzaWdtYV9iXjIoXHNpZ21hX2FeMiArIFxzaWdtYV4yKX17XHNpZ21hX2FeMitcc2lnbWFfYl4yK1xzaWdtYV4yfVxiaWdnKSQkDQp5DQoNCiQkKGErYnxZXzEpIFxzaW0gTlxiaWdnKCBcZnJhY3sgXHNpZ21hXjIoXG11X2FeMiArIFxtdV9iXjIpICsgWV8xKFxzaWdtYV9hXjIgLVxzaWdtYV9iXjIpfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9LA0KXGZyYWN7XHNpZ21hXjIoXHNpZ21hX2FeMiArIFxzaWdtYV9iXjIpfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9XGJpZ2cpJCQNCg0KQ2xhcmFtZW50ZSBhcXXDrSBlc3RhbW9zIGJhc2FuZG8gbnVlc3RybyBhbsOhbGlzaXMgc29sbyBwYXJhIGVsIGNhc28NCnVuaXZhcmlhZG8sIGVzIGRlY2lyLCBzb2xvIHBhcmEgJFlfMSQsIHBvciBsbyBxdWUgc2kgbG8gZ2VuZXJhbGl6YW1vcw0KcGFyYSAkbiQgJFllcyQgdGVuZW1vczoNCg0KJCQoYXxZX2kpIFxzaW0gTl9pXGJpZ2coIFxmcmFjeyAoXHNpZ21hX2FeMiArIFxzaWdtYV4yKVxtdV9hICsgXHNpZ21hX2FeMihZX2kgLVxtdV9iKSB9e1xzaWdtYV9hXjIrXHNpZ21hX2JeMitcc2lnbWFeMn0sXGZyYWN7XHNpZ21hX2FeMihcc2lnbWFfYl4yICsgXHNpZ21hXjIpfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9XGJpZ2cpJCQNCiwNCg0KJCQoYnxZX2kpIFxzaW0gTl9pXGJpZ2coIFxmcmFjeyAoXHNpZ21hX2JeMiArIFxzaWdtYV4yKVxtdV9iICsgXHNpZ21hX2JeMihZX2kgLVxtdV9hKSB9e1xzaWdtYV9hXjIrXHNpZ21hX2JeMitcc2lnbWFeMn0sXGZyYWN7XHNpZ21hX2JeMihcc2lnbWFfYV4yICsgXHNpZ21hXjIpfXtcc2lnbWFfYV4yK1xzaWdtYV9iXjIrXHNpZ21hXjJ9XGJpZ2cpJCQNCnkNCg0KJCQoYStifFlfaSkgXHNpbSBOX2lcYmlnZyggXGZyYWN7IFxzaWdtYV4yKFxtdV9hXjIgKyBcbXVfYl4yKSArIFlfaShcc2lnbWFfYV4yIC1cc2lnbWFfYl4yKX17XHNpZ21hX2FeMitcc2lnbWFfYl4yK1xzaWdtYV4yfSwNClxmcmFje1xzaWdtYV4yKFxzaWdtYV9hXjIgKyBcc2lnbWFfYl4yKX17XHNpZ21hX2FeMitcc2lnbWFfYl4yK1xzaWdtYV4yfVxiaWdnKSQkDQoNCkRlIG1vZG8sIHF1ZSBjYWRhIGRpc3RyaWJ1Y2nDs24gc2Vyw6EgdW5hIGNvb3JkZW5hZGEgZGVsIHZlY3RvciB5DQp0ZW5kcmVtb3MgJG4kIGVudHJhZGFzLg0KDQojIyBEZWZpbmljacOzbiBkZSBwb3N0ZXJpb3JpIGNvbiBHaWJicyBTYW1wbGVpbmcNCg0KQWhvcmEgcXVlIHlhIHNhYmVtb3MgY29tbyBkaXN0cmlidXllIGVtcMOtcmljYW1lbnRlIG51ZXN0cm9zIHBhcsOhbWV0cm9zLA0KbWVkaWFudGUgZWwgcHJvY2VzbyBkZSBHaWJicyBTYW1wbGluZyBpbnRlbnRhcmVtb3MgZXhwbGljYXIgc2kgZXN0byBlcw0KY29uc2lzdGVudGUsIHBhcmEgZWxsb3MgcmV2aXNhcmVtb3MgZGlzdGludG9zIGNhc29zLg0KDQpMbyBwcmltZXJvIGEgaGFjZXIgZXMgZGVmaW5pciBsYSBkaXN0cmlidWNpw7NuIHF1ZSB0ZW5kcsOhbiBsb3MgcGFyw6FtZXRyb3MgYSBwb3N0ZXJpb3JpLCBwZXJvIGN1YW5kbyBzb24gc2ltdWxhZG9zIGRlc2RlIHVuIEdpYmJzIFNhbXBsZXIsIHNlcsOhbjoNCg0KJCQgKGFeeyhrKX18WV9pLGJeeyhrLTEpfSkgXHNpbSBOXGJpZ2coXGZyYWN7XG11X2EgKyBcc2lnbWFfYV4yKFlfaSAtIGJeeyhrLTEpfSl9eyBcc2lnbWFfYV4yICsgXHNpZ21hXjJ9LFxmcmFje1xzaWdtYV9hXjJ9e1xzaWdtYV9hXjIrXHNpZ21hXjJ9IFxiaWdnKSAkJA0KDQokJCAoYl57KGspfXxZX2ksYV57KGstMSl9KSBcc2ltIE5cYmlnZyhcZnJhY3tcbXVfYiArIFxzaWdtYV9iXjIoWV9pIC0gYV57KGstMSl9KX17IFxzaWdtYV9iXjIgKyBcc2lnbWFeMn0sXGZyYWN7XHNpZ21hX2JeMn17XHNpZ21hX2JeMitcc2lnbWFeMn0gXGJpZ2cpICQkDQoNCiQkIChhXnsoayl9K2JeeyhrKX18WV9pLGFeeyhrLTEpfSxiXnsoay0xKX0pID0gKGFeeyhrKX18WV9pLGJeeyhrLTEpfSkrKGJeeyhrKX18WV9pLGFeeyhrLTEpfSkgJCQNCg0KQ29uIGVzdG8gcG9kZW1vcyBhbmFsaXphciBsYSBjb252ZXJnZW5jaWEgZGVsIGFsZ29yaXRtbywgcGFyYSBjdWFuZG8gbGFzIG1lZGlhcyBzb24gMCB5IGxhcyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIDE6DQoNCmBgYHtyfQ0KIyBEZWZpbmltb3MgZWwgdGFtYcOxbyBkZWwgdmVjdG9yIFkNCg0KbiA9IDEwMDAwDQoNCiMgRGVmaW5pbW9zIGxvcyBoaXBlcnBhcsOhbWV0cm9zIG11X2EsIG11X2IsIHNpZ21hX2EsIHNpZ21hX2IgeSBzaWdtYQ0KDQptdV9hID0gMA0KbXVfYiA9IDAgDQpzaWdtYV9hID0gMQ0Kc2lnbWFfYiA9IDENCnNpZ21hID0gMSANCg0KIyBEZWZpbmltb3MgbG9zIHZhbG9yZXMgaW5pY2lhbGVzIGRlIGEgeSBiDQojIA0KYV8wID0gcm5vcm0oMSxtdV9hLHNpZ21hX2EpDQpiXzAgPSBybm9ybSgxLG11X2Isc2lnbWFfYikNCg0KIyBEZWZpbmltb3MgZWwgdmVjdG9yIGRlIGxhcyBvYnNlcnZhY2lvbmVzIA0KDQpZX29icyA8LSBybm9ybShuLGFfMCArIGJfMCwgc2lnbWEpDQoNCiMgQ29uIGVsbG8gZW1wZXphbW9zIGVsIGFsZ29yaXRtbyBkZSBHaWJicyBwYXJhIG9idGVuZXIgbGEgZGlzdCBhIHBvc3RlcmlvcmkNCiMgZGUgbGEgKGF8WV9vYnMpLChifFlfb2JzKSB5IChhK2J8WV9vYnMpDQoNCmFfc2ltID0gdmVjdG9yKG1vZGUgPSAibnVtZXJpYyIsIGxlbmd0aCA9IG4pDQpiX3NpbSA9IHZlY3Rvcihtb2RlID0gIm51bWVyaWMiLCBsZW5ndGggPSBuKQ0KYV9iX3NpbSA9IHZlY3Rvcihtb2RlID0gIm51bWVyaWMiLCBsZW5ndGggPSBuKQ0KDQphX3NpbVsxXSA9IGFfMCANCmJfc2ltWzFdID0gYl8wDQphX2Jfc2ltWzFdID0gYV8wICsgYl8wDQoNCmkgPSAyDQprID0gMjEwMDANCg0Kd2hpbGUgKGk8PWspIHsNCiAgYV9zaW1baV0gPC0gcm5vcm0oMSxtZWFuID0gKG11X2EgKyBzaWdtYV9hXjIqKFlfb2JzIC0gYl9zaW1baS0xXSkpLyhzaWdtYV9hXjIrc2lnbWFeMiksDQogICAgICAgICAgICAgICAgICAgIHNkID0gc3FydCgoc2lnbWFfYV4yKS8oc2lnbWFfYV4yK3NpZ21hXjIpKSkNCiAgYl9zaW1baV0gPC0gcm5vcm0oMSxtZWFuID0gKG11X2IgKyBzaWdtYV9iXjIqKFlfb2JzIC0gYV9zaW1baS0xXSkpLyhzaWdtYV9iXjIrc2lnbWFeMiksDQogICAgICAgICAgICAgICAgICAgIHNkID0gc3FydCgoc2lnbWFfYl4yKS8oc2lnbWFfYl4yK3NpZ21hXjIpKSkNCiAgYV9iX3NpbVtpXSA8LSBhX3NpbVtpXSArIGJfc2ltW2ldDQogIGk9aSsxICANCn0NCg0KYV9zaW1fMjAwMDAgPC0gYV9zaW1bMTAwMToyMTAwMF0NCmJfc2ltXzIwMDAwIDwtIGJfc2ltWzEwMDE6MjEwMDBdDQphX2Jfc2ltXzIwMDAwIDwtIGFfYl9zaW1bMTAwMToyMTAwMF0NCg0KcG9zIDwtIHNlcSgxLDIwMDAwLCBieSA9IDEwKQ0KDQphX3NpbV8yMDAwIDwtIGMoKQ0KYl9zaW1fMjAwMCA8LSBjKCkNCmFfYl9zaW1fMjAwMCA8LSBjKCkNCg0KZm9yIChpIGluIHBvcykgew0KICBhdXgxIDwtIGFfc2ltXzIwMDAwW2ldDQogIGF1eDIgPC0gYl9zaW1fMjAwMDBbaV0NCiAgYXV4MyA8LSBhX2Jfc2ltXzIwMDAwW2ldDQogIGFfc2ltXzIwMDAgPC0gYyhhX3NpbV8yMDAwLGF1eDEpDQogIGJfc2ltXzIwMDAgPC0gYyhiX3NpbV8yMDAwLGF1eDIpDQogIGFfYl9zaW1fMjAwMCA8LSBjKGFfYl9zaW1fMjAwMCxhdXgzKQ0KfQ0KYGBgDQoNClVuYSB2ZXogb2J0ZW5pZG9zIGxvcyB2YWxvcmVzIGRlIGxhcyBwYXLDoW1ldHJvcyBhIHRyYXbDqXMgZGUgbGEgc2ltdWxhY2nDs24gZGUgR2liYnMsIHBvZGVtb3MgYW5hbGl6YXIgc3UgY29udmVyZ2VuY2lhIG1lZGlhbnRlIHVuIGB0cmFjZXBsb3QoKWA6DQoNCmBgYHtyIGZpZy5jYXA9ICJtZWRpYXMgPSAwIHkgc2lnbWFzID0gMSIgLGVjaG89RkFMU0UsIG91dC53aWR0aD0gIjEwMCUiLCBmaWcuYWxpZ249J2NlbnRlcicgLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCnBhcihtZnJvdz1jKDEsMykpDQp2YWxvcmVzPSBjKGFfc2ltXzIwMDAsYl9zaW1fMjAwMCxhX2Jfc2ltXzIwMDApDQoNCnBsb3QoYV9zaW1fMjAwMCwgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzKSxtYXgodmFsb3JlcykpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IHBhcmEgKGF8WV9pLGIpIFxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXMpLG1heCh2YWxvcmVzKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QgcGFyYSAoYnxZX2ksYSkgIFxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChhX2Jfc2ltXzIwMDAsIHR5cGU9ImwiLCB5bGltID0gYyhtaW4odmFsb3JlcyksbWF4KHZhbG9yZXMpKSwgeGxhYiA9ICJDYW50aWRhZCBkZSBzaW11bGFjaW9uZXMiLHlsYWIgPSAiU2ltdWxhY2lvbmVzIGRlIEdpYmJzIiwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24ocGFzdGUoIlRyYWNlcGxvdCBwYXJhIChhK2J8WV9pLGEsYikgXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCmBgYA0KDQpBcXXDrSBwb2RlbW9zIHZlciBxdWUgZWwgcGFyw6FtZXRybyBkZSAkYSQgY29udmVyZ2UgYSBgciBtZWFuKGFfc2ltXzIwMDApIGAgeSAkYiQgY29udmVyZ2UgYSBgciBtZWFuKGJfc2ltXzIwMDApIGAsIG1pZW50cmFzIHF1ZSBlbCBtw61uaW1vIHN1ZmljaWVudGUgJGErYiQsIGNvbnZlcmdlIGEgYHIgbWVhbihhX2Jfc2ltXzIwMDApIGAgcXVlIGNvaW5jaWRlIGV4YWN0YW1lbnRlIGNvbiBsYSBzdW1hIGRlIGxvcyBwYXLDoW1ldHJvcyAkYSQgeSAkYiQgKGByIG1lYW4oYV9zaW1fMjAwMCkgKyBtZWFuKGJfc2ltXzIwMDApYCkgLCBwb3IgbG8gcXVlIGhhc3RhIGVsIG1pbnV0byBwb2RlbW9zIHZlciBxdWUgdG9kbyB2YSBiaWVuIGVuY2FtaW5hZG8uIEFob3JhIHF1ZSB0ZW5lbW9zIGxhcyBkaXN0cmlidWNpb25lcyBhIHBvc3RlcmlvcmkgbWVkaWFudGUgdW4gYHFxcGxvdCgpYCB5IGVsIGBrcy50ZXN0KClgIGxhcyBwb2RlbW9zIGNvbXBhcmFyIGVuIGJhc2UgYSBsYSBkaXN0cmlidWNpw7NuIGVtcMOtcmljYSBvcmlnaW5hbDoNCg0KMS4gUGFyYSBlbCBwYXLDoW1ldHJvICRhJCwgdGVuZW1vcyBxdWUgZWwgYHFxcGxvdCgpYCBzZSBhY2VyY2EgbXVjaG8gYSBsYSBOb3JtYWwsIGNvbW8gc2UgcHVlZGUgdmVyIGVuIGVsIHNpZ3VpZW50ZSBncsOhZmljbzoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KZGF0b3Nfb3JkZW5hZG9zX2EgPC0gc29ydChhX3NpbV8yMDAwMCkNCmxhcmdvX2EgPC0gbGVuZ3RoKGRhdG9zX29yZGVuYWRvc19hKQ0KdmFsb3Jlc19hIDwtIGMoMTpsYXJnb19hKQ0KcGlfYSA8LSAodmFsb3Jlc19hLTAuNSkvbGFyZ29fYQ0KDQpxdWFudGlsZXNfbl9hID0gcW5vcm0oIHAgPSBwaV9hLCBtZWFuID0gKChzaWdtYV9iXjIrc2lnbWFeMikqbXVfYSArIHNpZ21hX2FeMiooWV9vYnMgLSBtdV9iKSkvKHNpZ21hX2FeMitzaWdtYV9iXjIrc2lnbWFeMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNxcnQoKHNpZ21hX2FeMiooc2lnbWFfYl4yK3NpZ21hXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSkpDQpwbG90KGRhdG9zX29yZGVuYWRvc19hLCBxdWFudGlsZXNfbl9hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KYGBgDQoNCnkgYW5hbGl6YW5kbyBlbCByZXN1bHRhZG8gcXVlIG5vcyBkYSBlbCBga3MudGVzdCgpYCBlcyBjbGFybyBxdWUgZWwgcGFyw6FtZXRybyBzaSBkaXN0cmlidXllIE5vcm1hbCwgeWEgcXVlIHN1IHZhbG9yIGVzIGRlbWFzaWFkbyBwZXF1ZcOxbywgY29tbyBzZSBtdWVzdHJhIGEgY29udGludWFjacOzbjoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iXjIrc2lnbWFeMikqbXVfYSArIHNpZ21hX2FeMiooWV9vYnMgLSBtdV9iKSkvKHNpZ21hX2FeMitzaWdtYV9iXjIrc2lnbWFeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FeMiooc2lnbWFfYl4yK3NpZ21hXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSkpDQpgYGANCg0KMi4gUGFyYSBlbCBwYXLDoW1ldHJvICRiJCwgdGVuZW1vcyBxdWUgZWwgYHFxcGxvdCgpYCBzZSBhY2VyY2EgbXVjaG8gYSBsYSBOb3JtYWw6DQoNCmBgYHtyIGVjaG89RkFMU0UsIG91dC53aWR0aD0gIjEwMCUiLCBmaWcuYWxpZ249J2NlbnRlcicgLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCmRhdG9zX29yZGVuYWRvc19iIDwtIHNvcnQoYl9zaW1fMjAwMDApDQpsYXJnb19iIDwtIGxlbmd0aChkYXRvc19vcmRlbmFkb3NfYikNCnZhbG9yZXNfYiA8LSBjKDE6bGFyZ29fYikNCnBpX2IgPC0gKHZhbG9yZXNfYi0wLjUpL2xhcmdvX2INCg0KcXVhbnRpbGVzX25fYiA9IHFub3JtKCBwID0gcGlfYiwgbWVhbiA9ICgoc2lnbWFfYV4yK3NpZ21hXjIpKm11X2IgKyBzaWdtYV9iXjIqKFlfb2JzIC0gbXVfYSkpLyhzaWdtYV9hXjIrc2lnbWFfYl4yK3NpZ21hXjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNxcnQoKHNpZ21hX2JeMiooc2lnbWFfYV4yK3NpZ21hXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSkpDQpwbG90KGRhdG9zX29yZGVuYWRvc19iLCBxdWFudGlsZXNfbl9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQpgYGANCg0KRXMgY2xhcm8gb2JzZXJ2YXIgcXVlIHByYWN0aWNhbWVudGUgdG9kb3MgbG9zIHZhbG9yZXMgc29uIGNlcmNhbm9zIGEgbGEgTm9ybWFsLCBudWV2YW1lbnRlIHNpIGFuYWxpemFtb3MgZGUgbWFuZXJhIGN1YW50aXRhdGl2YSB1c2FuZG8gZWwgYGtzLnRlc3QoKWAsIGVsIHZhbG9yIGVzIGRlbWFzaWFkbyBwZXF1ZcOxbyBsbyBxdWUgaGFjZSB2YWxpZGFyIG51ZXN0cm8gc3VwdWVzdG8uDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19iLCB5ID0gInBub3JtIiwgKChzaWdtYV9hXjIrc2lnbWFeMikqbXVfYiArIHNpZ21hX2JeMiooWV9vYnMgLSBtdV9hKSkvKHNpZ21hX2FeMitzaWdtYV9iXjIrc2lnbWFeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2JeMiooc2lnbWFfYV4yK3NpZ21hXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSkpDQpgYGANCg0KMy4gUGFyYSBlbCBwYXLDoW1ldHJvICRhK2IkLCB0ZW5lbW9zIHF1ZSBlbCBgcXFwbG90KClgIHNlIGFjZXJjYSBtdWNobyBhIGxhIE5vcm1hbCwgbXVjaG8gbcOhcyBxdWUgbG9zIHBhcsOhbWV0cm9zIGRlIGZvcm1hIGluZGl2aWR1YWwsIGVzdG8gdGFtYmllbiBzZSBkZWJlIHByaW5jaXBhbG1lbnRlIGEgcXVlIGVzIGVsIG3DrW5pbW8gc3VmaWNpZW50ZToNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KZGF0b3Nfb3JkZW5hZG9zX2FfYiA8LSBzb3J0KGFfYl9zaW1fMjAwMDApDQpsYXJnb19hX2IgPC0gbGVuZ3RoKGRhdG9zX29yZGVuYWRvc19hX2IpDQp2YWxvcmVzX2FfYiA8LSBjKDE6bGFyZ29fYV9iKQ0KcGlfYV9iIDwtICh2YWxvcmVzX2FfYi0wLjUpL2xhcmdvX2FfYg0KDQpxdWFudGlsZXNfbl9hX2IgPSBxbm9ybSggcCA9IHBpX2FfYiwgbWVhbiA9ICgobXVfYV4yK211X2JeMikqc2lnbWFeMiArIFlfb2JzKihzaWdtYV9hXjIgLSBzaWdtYV9iXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzcXJ0KChzaWdtYV4yKihzaWdtYV9hXjIrc2lnbWFfYl4yKSkvKHNpZ21hX2FeMitzaWdtYV9iXjIrc2lnbWFeMikpKQ0KcGxvdChkYXRvc19vcmRlbmFkb3NfYV9iLCBxdWFudGlsZXNfbl9hX2IseGxhYiA9ICJEYXRvcyBvcmRlbmFkb3MgZW4gYStiIix5bGFiID0gIkN1YW50aWxlcyBkZSBhK2IiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGErYiIsIGNvbCA9ICIjN2YwMGIyIikNCmFibGluZShhID0gMCwgYiA9IDEsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCmBgYA0KDQpOdWV2YW1lbnRlIGVuIGVzdGUgY2FzbyBsYSBncsOhZmljYSBlcyBwcmFjdGljYW1lbnRlIHBlcmZlY3RhLCB5IGVsIGBrcy50ZXN0KClgIG5vcyBjb25maXJtYSBlc3RhIGlkZWEgZGUgcXVlIGVsIHBhcsOhbWV0cm8gZGlzdHJpYnV5ZSBOb3JtYWwsIGRhZG8gc3UgdGFtYcOxbyBleHRyZW1hZGFtZW50ZSBwZXF1ZcOxbzoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19hX2IsIHkgPSAicG5vcm0iLCgobXVfYV4yK211X2JeMikqc2lnbWFeMiArIFlfb2JzKihzaWdtYV9hXjIgLSBzaWdtYV9iXjIpKS8oc2lnbWFfYV4yK3NpZ21hX2JeMitzaWdtYV4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFeMiooc2lnbWFfYV4yK3NpZ21hX2JeMikpLyhzaWdtYV9hXjIrc2lnbWFfYl4yK3NpZ21hXjIpKSkNCg0KYGBgDQoNCkZpbmFsbWVudGUsIHNpIG5vcyBpbnRlcmVzYSByZXZpc2FyIHNpIGxhcyBkaXN0cmlidWNpb25lcyBhIHBvc3RlcmlvcmkgZGUgJChhfFlfMSwuLi4sWV9uKSQgeSBkZSAkKGJ8WV8xLC4uLixZX24pJCBzb24gZnVuY2nDs24gbyBzZSBwYXJlY2VuIGVuIGFsZ28gYSBsYSBkaXN0cmlidWNpw7NuIGEgcG9zdGVyaW9yaSBkZWwgcGFyw6FtZXRybyBtw61uaW1vIHN1ZmljaWVudGUgcG9kZW1vcyB1c2FyIHVuIGhpc3RvZ3JhbWEgcGFyYSByZXZpc2FyIHN1IGNvbXBvcnRhbWllbnRvOg0KDQpgYGB7ciBlY2hvID0gRkFMU0V9DQpwYXIobWZyb3c9YygxLDMpKQ0KaGlzdChhX3NpbV8yMDAwLCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYSIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBhIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYl9zaW1fMjAwMCwgZnJlcSA9IEYsIHhsYWIgPSAic2ltdWxhY2lvbmVzIGRlIGIiLHlsYWIgPSAiRGVuc2lkYWQiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbWEgZGUgYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpoaXN0KGFfYl9zaW1fMjAwMCwgZnJlcSA9IEYsIHhsYWIgPSAic2ltdWxhY2lvbmVzIGRlIGErYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBhK2IiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KYGBgDQoNCkNvbiBsbyBhbnRlcmlvciwgcG9kZW1vcyB2ZXIgcXVlIGVsIGFsZ29yaXRtbyBkZSBHaWJicyBhcGxpY2FkbyBhIHVuYSBjYWRlbmEgZGUgYHIgbmAgb2JzZXJ2YWNpb25lcywgY3V5YXMgbWVkaWFzIHNvbiAkMF9zJCB5IHN1cyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIHNvbiAkMV9zJCwgdG9kbyByZXN1bHRhIHBlcmZlY3RvLiBTaW4gZW1iYXJnbywgKirCv1F1w6kgb2N1cnJlIGN1YW5kbyBsYSB2YXJpYW56YSBjb21pZW56YSBhIGF1bWVudGFyPyoqLiBBIGNvbnRpbnVhY2nDs24sIGFtcGxpYXJlbW9zIGVsIGFuw6FsaXNpcyBwYXJhIGRpc3RpbnRvcyBjYXNvcyBkb25kZSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgY29taWVuemEgYSBjYW1iaWFyIChwYXJhIHJldmlzYXIgdG9kb3MgbG9zIGNhc29zIHZlciBBbmV4b3MpOg0KDQojIyMgQ2FzbyAxOiBzaWdtYV9hID4gc2lnbWFfYiA+IHNpZ21hDQoNCkVuIGVzdGUgY2FzbyBkZWZpbmltb3MsIGxvcyB2YWxvcmVzIGRlIHNpZ21hIGNvbW8gOg0KDQpgYGB7cn0NCnNpZ21hX2FfY2FzbzEgPSAxMDAwMA0Kc2lnbWFfYl9jYXNvMSA9IDUwDQpzaWdtYV9jYXNvMSA9IDEgDQpgYGANCg0KRWwgYHRyYWNlcGxvdCgpYCBkZSBkaWNobyBjYXNvLCBub3MgbXVlc3RyYSBxdWUgZWwgcGFyw6FtZXRybyBkZSAkYSQgdGllbmUgbWF5b3IgZGlzcGVyc2nDs24gcXVlIGVsIGRlICRiJCwgcG9yIGxvIHF1ZSBhbCBmaW5hbCBlbCBwYXLDoW1ldHJvIG3DrW5pbW8gc3VmaWNpZW50ZSB0aWVuZGUgYSBkaXNwZXJzYXJzZSBtdWNobywgc2luIGVtYmFyZ28gc2kgcmV2aXNhbW9zIGxvcyBgcXFwbG90KClgLCB0YW50byBlbCBkZSAkYSQgY29tbyAkYiQgbm8gc29uIG11eSBhZGVjdWFkb3MsIHNpbiBlbWJhcmdvIGVsIG3DrW5pbW8gc3VmaWVudGUgJGErYiQgdGllbmRlIGEgc2VyIG11Y2hvIG3DoXMgY29ycmVjdG8geSBwYXJlY2Vyc2UgYSB1bmEgTm9ybWFsLg0KDQojIyMgQ2FzbyAzOiBzaWdtYV9iID4gc2lnbWFfYSA+IHNpZ21hDQoNCkVuIGVzdGUgY2FzbyBkZWZpbmltb3MsIGxvcyB2YWxvcmVzIGRlIHNpZ21hIGNvbW8gOg0KDQpgYGB7cn0NCnNpZ21hX2FfY2FzbzEgPSAxMDAwMA0Kc2lnbWFfYl9jYXNvMSA9IDUwDQpzaWdtYV9jYXNvMSA9IDEgDQpgYGANCg0KRWwgYHRyYWNlcGxvdCgpYCBkZSBkaWNobyBjYXNvLCBub3MgbXVlc3RyYSBxdWUgZWwgcGFyw6FtZXRybyBkZSAkYSQgdGllbmUgbWF5b3IgZGlzcGVyc2nDs24gcXVlIGVsIGRlICRiJCwgcG9yIGxvIHF1ZSBhbCBmaW5hbCBlbCBwYXLDoW1ldHJvIG3DrW5pbW8gc3VmaWNpZW50ZSB0aWVuZGUgYSBkaXNwZXJzYXJzZSBtdWNobywgc2luIGVtYmFyZ28gc2kgcmV2aXNhbW9zIGxvcyBgcXFwbG90KClgLCB0YW50byBlbCBkZSAkYSQgY29tbyAkYiQgbm8gc29uIG11eSBhZGVjdWFkb3MsIHNpbiBlbWJhcmdvIGVsIG3DrW5pbW8gc3VmaWVudGUgJGErYiQgdGllbmRlIGEgc2VyIG11Y2hvIG3DoXMgY29ycmVjdG8geSBwYXJlY2Vyc2UgYSB1bmEgTm9ybWFsLg0KDQojIyMgQ2FzbyAyOiBzaWdtYSA+IHNpZ21hX2IgPiBzaWdtYV9hDQoNCkVuIGVzdGUgY2FzbyBkZWZpbmltb3MsIGxvcyB2YWxvcmVzIGRlIHNpZ21hIGNvbW8gOg0KDQpgYGB7cn0NCnNpZ21hX2FfY2FzbzIgPSAxDQpzaWdtYV9iX2Nhc28yID0gNTANCnNpZ21hX2Nhc28yID0gMTAwMDANCmBgYA0KDQpFbCBgdHJhY2VwbG90KClgIGRlIGRpY2hvIGNhc28sIG5vcyBtdWVzdHJhIHF1ZSBlbCBwYXLDoW1ldHJvIGRlICRhJCBlcyBlbCBtZW5vcyBkaXNwZXJzbywgbWllbnRyYXMgcXVlIGVsIGRlICRiJCBlcyBtdXkgZGlzcGVyc28sIHBvciBsbyBxdWUgYWwgZmluYWwgZWwgcGFyw6FtZXRybyBtw61uaW1vIHN1ZmljaWVudGUgdGllbmRlIGEgZGlzcGVyc2Fyc2UgbXVjaG8sIHNpbiBlbWJhcmdvIHNpIHJldmlzYW1vcyBsb3MgYHFxcGxvdCgpYCwgdGFudG8gZWwgZGUgJGEkLCBjb21vIGVsIGRlICRiJCB5IGNvbW8gZWwgbcOtbmltbyBzdWZpZW50ZSAkYStiJCwgbm8gc2UgYWNlcmNhbiBhbCB2YWxvciBkZSBsYSBOb3JtYWwuIEFxdcOtLCB0ZW5lbW9zIHVuICBjYXNvIHBhcnRpY3VsYXIgZW4gZWwgcXVlIGRvbmRlIGxhIGRpc3BlcnNpw7NuIGRlIGxhcyBvYnNlcnZhY2lvbmVzIGhhY2UgcXVlIGVsIGFsZ29yaXRtbyBkZSBHaWJicyBubyBzaW11bGEgbG9zIHZhbG9yZXMgZGUgbWFuZXJhIGNvcnJlY3RhLiBBIHBlc2FyIGRlIHF1ZSBlbCB2YWxvciBkZWwgYGtzLnRlc3QoKWAgbm9zIGRhIG11eSBwZXF1ZcOxbywgbG9zIHZhbG9yZXMgZ3LDoWZpY29zIG5vcyBkZW11ZXN0cmFuIHF1ZSBubyBlcyBjb3JyZWN0by4gRXN0byBvY3VycmUgZGUgbWFuZXJhIHNpbWlsYXIgZW4gZWwgY2FzbyA0KHJldmlzYXIgQW5leG9zKS4NCg0KIyMjIENhc28gNTogc2lnbWFfYSA+IHNpZ21hX2IgPSBzaWdtYSB5IENhc28gNjogc2lnbWFfYiA+IHNpZ21hX2EgPSBzaWdtYQ0KDQpFbiBlc3RlIGNhc28gZGVmaW5pbW9zLCBsb3MgdmFsb3JlcyBkZSBzaWdtYSBjb21vIDoNCg0KYGBge3J9DQojIGNhc28gNQ0KDQpzaWdtYV9hX2Nhc281ID0gMTAwMDANCnNpZ21hX2JfY2FzbzUgPSAzDQpzaWdtYV9jYXNvNSA9IDMNCg0KIyBjYXNvIDYNCg0Kc2lnbWFfYV9jYXNvNiA9IDMNCnNpZ21hX2JfY2FzbzYgPSAxMDAwMA0Kc2lnbWFfY2FzbzYgPSAzDQoNCmBgYA0KDQpBcXXDrSBwb2RlbW9zIHZlciBxdWUgY3VhbmRvIGxhIHZhcmlhbnphIGRlIGFsZ3VubyBkZSBsb3MgcGFyw6FtZXRyb3MgZXMgZGVtYXNpYWRvIGdyYW5kZSBsYSBjb252ZXJnZW5jaWEgZXMgbXV5IGNvbXBsaWNhZGEsIHRhbnRvIGRlbCBwYXLDoW1ldHJvIGNvcnJlc3BvbmRpZW50ZSBjb21vIGxhIGRlbCBtw61uaW1vIHN1ZmljaWVudGUsIGVzdG8gc2UgcHVlZGUgdmVyIGNsYXJhbWVudGUgZW4gbG9zIGBxcXBsb3RzKClgIGRlIGRpY2hvcyBjYXNvcy4gUG9yIGxvIHF1ZSBwb2RlbW9zIHZlciBxdWUgZW4gY2Fzb3MgY29tbyBlc3RlIGxhIGNvbnZlcmdlbmNpYSBzZSBsZSBjb21wbGljYSBhbCBhbGdvcml0bW8gZGUgR2liYnMuDQoNCiMjIyBDYXNvIDc6IHNpZ21hID4gc2lnbWFfYSA9IHNpZ21hX2INCg0KRW4gZXN0ZSBjYXNvIGRlZmluaW1vcywgbG9zIHZhbG9yZXMgZGUgc2lnbWEgY29tbyA6DQoNCmBgYHtyfQ0Kc2lnbWFfYV9jYXNvNyA9IDEgDQpzaWdtYV9iX2Nhc283ID0gMQ0Kc2lnbWFfY2FzbzcgPSAxMDAwMCANCmBgYA0KDQpBcXXDrSB0ZW5lbW9zIG90cm8gY2FzbyBpbnRlcmVzYW50ZSwgeWEgcXVlIGFsIGRlZmluaXIgbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlIGxhcyBvYnNlcnZhY2lvbmVzIHRhbiBhbHRhLCBoYWNlIHF1ZSBuaW5nw7puIHBhcsOhbWV0cm8gY29udmVyamEgZGUgbWFuZXJhIGNvcnJlY3RhLCBhbGdvIHNpbWlsYXIgYWwgY2FzbyAyIG8gY2FzbyA0LCB5IGVzdG8gc2UgYXByZWNpYSBjb25zaWRlcmFibGVtZW50ZSBlbiBlbCBgcXFwbG90KClgIGRlIGRpY2hvIHByb2JsZW1hLg0KDQojIyMgQ2FzbyA4OiBzaWdtYV9hID0gc2lnbWFfYiA+IHNpZ21hDQoNCkVuIGVzdGUgY2FzbyBkZWZpbmltb3MsIGxvcyB2YWxvcmVzIGRlIHNpZ21hIGNvbW8gOg0KDQpgYGB7cn0NCnNpZ21hX2FfY2FzbzggPSAxMDAwMCANCnNpZ21hX2JfY2FzbzggPSAxMDAwMA0Kc2lnbWFfY2FzbzggPSAxIA0KYGBgDQoNCkZpbmFsbWVudGUsIGVuIGVzdGUgw7psdGltbyBjYXNvIHF1ZSBzZSBoYSBkZWNpZGlkbyBhbmFsaXphciwgcG9kZW1vcyBlcyBjbGFybyB2ZXIgcXVlIGEgcGVzYXIgcXVlIGxhIGRpc3BlcnNpw7NuIGRlIGxvcyBwYXLDoW1ldHJvcyBlcyBhbHRpc2ltYSwgc2kgZWwgZGUgbGFzIG9ic2VydmFjaW9uZXMgZXMgYmFqbywgcG9kZW1vcyBhc2VndXJhciB1bmEgYnVlbmEgY29udmVyZ2VuY2lhIGRlbCBhbGdvcml0bW8uDQoNCiMjIFJlZmxleGnDs24gZGUgcHJlZ3VudGFzDQoNClNlZ8O6biBsbyBleHB1ZXN0byBhIGxvIGxhcmdvIGRlIGVzdGUgaW5mb3JtZSwgeWEgbm9zIGVuY29udHJhbW9zIGNvbiBlbCBjb25vY2ltaWVudG8gc3VmaWNpZW50ZSBwYXJhIGRhciB1bmEgcmVzcHVlc3RhIG11Y2hvIG3DoXMgY2xhcmEgZGUgbG8gc29saWNpdGFkby4NCg0KTGEgcHJpbWVyYSBwcmVndW50YSBhIGFuYWxpemFyIGVzOiAqKsK/RXMgY29ycmVjdG8gYWZpcm1hciBxdWUgbGEgY2FkZW5hIGRlIE1hcmtvdiBhc29jaWFkYSBhbCBwYXLDoW1ldHJvIG3DrW5pbW8gc3VmaWNpZW50ZSBjb252ZXJnZSDigJxtw6FzIGbDoWNpbG1lbnRl4oCdIHF1ZSBsYXMgY2FkZW5hcyBkZSBNYXJrb3YgYXNvY2lhZGFzIGEgbG9zIHBhcsOhbWV0cm9zIGEgeSBiPyoqLCB5IGJ1ZW5vIGNvbW8gbG8gcmV2aXNhbW9zIGVuIGxvcyBgdHJhY2VwbG90KClgIGRlIGxvcyBkaXN0aW50b3MgY2Fzb3MsIGxhIGNvbnZlcmdlbmNpYSBlcyBhbGdvIHF1ZSBzaWVtcHJlIHRyYXRhIGRlIGhhY2VyIGVsIGFsZ290aXRtbyBkZWwgR2liYnMsIHNpbiBlbWJhcmdvLCBwb2RlbW9zIG5vdGFyIGNsYXJhbWVudGUgcXVlIGN1YW5kbyBsYSB2YXJpYW56YSBkZSBhbGd1bm8gZGUgbG9zIHBhcsOhbWV0cm9zIG8gZGUgbGFzIG9ic2VydmFjaW9uZXMgYXVtZW50YSBkZSBtYW5lcmEgY29uc2lkZXJhYmxlIGhhY2UgcXVlIGxhIGNvbnZlcmdlbmNpYSBzZWEgbcOhcyBkaWbDrWNpbCBkZSBvY3VycmlyLCBoYWNpZW5kbyBxdWUgZWwgcGFyw6FtZXRybyBsbGVndWUgYSBvc2NpbGFyIGRlIG1hbmVyYSBiYXN0YW50ZSBydWlkb3NhLCBubyBvYnN0YW50ZSwgYSBwZXNhciBkZSBxdWUgYSAkYSQgeSBhICRiJCBsZXMgY3Vlc3RlLCBzaWVtcHJlIHBhcmEgZWwgcGFyw6FtZXRybyBtw61uaW1vIHN1ZmljaWVudGUgc2Vyw6EgbcOhcyBzZW5jaWxsby4NCg0KTHVlZ28sIHNpIHJlc3BvbmRlbW9zIGEgbGEgc2VndW5kYSBwcmVndW50YSBxdWUgZXM6ICoqwr9FbiBxdcOpIG1lZGlkYSBlbCBHaWJicyBzYW1wbGluZyBwZXJtaXRlIGNvbnN0YXRhciBxdWUgbGEgZGlzdHJpYnVjacOzbiBhIHBvc3RlcmlvcmkgZGUgdW4gcMOhcmFtZXRybyBxdWUgbm8gZXMgZWwgbcOtbmltbyBzdWZpY2llbnRlIChwb3IgZWplbXBsbywgYSkgc2UgcmVkdWNlIGEgbGEgZGlzdHJpYnVjacOzbiBhIHBvc3RlcmlvcmkgZGVsIHDDoXJhbWV0cm8gbcOtbmltbyBzdWZpY2llbnRlPyoqIGVzdMOhIHByZWd1bnRhIGFsIGlndWFsIHF1ZSBsYSBhbnRlcmlvciBlc3RhIGFsdGFtZW50ZSByZWxhY2lvbmFkYSBhIGxhIGFudGVyaW9yLCB5YSBxdWUsIGFsIHNhYmVyIHF1ZSBlbCBhbGdvcml0bW8gDQoNCiMjIENvbmNsdXNpw7NuDQoNCkVuIGNvbmNsdXNpw7NuIGRlIHRvZG8gZXN0ZSB0cmFiYWpvLCBwb2RlbW9zIGRlY2lyIHF1ZSBlbCBhbGdvcnRpbW8gZGUgR2liYnMgZXMgdW5hIGhlcnJhbWllbnRhIGFsdGFtZW50ZSBwb2Rlcm9zYSwgeWEgcXVlLCBub3MgcGVybWl0ZSBlbmNvbnRyYXIgbGEgZm9ybWEgZGUgbGFzIGRpc3RyaWJ1Y2lvbmVzIGEgcG9zdGVyaW9yaSBjdWFuZG8gZXMgbXV5IGNvbXBsZWpvIGhhY2VybG8gYSBtYW5vLiBTaW4gZW1iYXJnbywgZXMgbmVjZXNhcmlvIHRlbmVyIHByZXNlbnRlIHF1ZSBjdWFuZG8gc2UgYW5hbGl6YSBwcm9ibGVtYXMgZGUgZXN0ZSBlc3RpbG8sIGFudGVzIGRlIGRldGVybWluYXIgbGEgY29udmVnZW5jaWEgZGVsIGFsZ29yaXRtbyBvIG5vLCBlcyBtdXkgaW1wb3J0YW50ZSBjb25vY2VyIGxhIG5hdHVyYWxlemEgZGUgbnVlc3Ryb3MgZGF0b3MsIHBhcmEgc2FiZXIgc2kgYWZlY3RhcsOhIG8gbm8gZW4gbGEgY29udmVyZ2VuY2lhIGRlbCBhbGdvcml0bW8uIE90cm8gcHVudG8gaW1wb3J0YW50ZSBhIGRlc3RhY2FyIGFxdcOtIGVzIHF1ZSBhIHByaW9yaSBubyBpbXBvcnRhIGNvbW8gc2VhIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIHBhcsOhbWV0cm9zLCBzaW5vIHF1ZSBwYXJhIHRvbWFyIHVuIGp1aWNpbyBlcyBtdXkgaW1wb3J0YW50ZSBxdWUgZWwgcGFyw6FtZXRybyBzZWEgbcOtbmltbyBzdWZpY2llbnRlLCB5YSBxdWUsIGRlIGVzdGEgbWFuZXJhIGFzZWd1cmFtb3MgbGEgY29udmVyZ2VuY2lhIGRlbCBhbGdvcml0bW8uDQoNCiMjIFJlZmVyZW5jaWFzDQoNCjEuIEhvZmYsIFAuIEQuICgyMDA5KS4gKkEgRmlyc3QgQ291cnNlIGluIEJheWVzaWFuIFN0YXRpc3RpY2FsIE1ldGhvZHMqLiBTcHJpbmdlci4NCg0KMi4gTWF0ZXJpYWwgZXhwbGljYWRvIGVuIGNsYXNlcy4NCg0KIyMgQW5leG9zDQoNCiMjIyBDYXNvIDE6IHNpZ21hX2EgPiBzaWdtYV9iID4gc2lnbWENCg0KYGBge3IgZmlnLmNhcD0gIkNhc28gMTogc2lnbWFfYSA+IHNpZ21hX2IgPiBzaWdtYSIgLGVjaG89RkFMU0UsIG91dC53aWR0aD0gIjEwMCUiLCBmaWcuYWxpZ249J2NlbnRlcicgLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCnBhcihtZnJvdyA9IGMoMSwzKSkNCg0KdmFsb3Jlc19jYXNvMSA9IGMoYV9zaW1fMjAwMF9jYXNvMSxiX3NpbV8yMDAwX2Nhc28xLGFfYl9zaW1fMjAwMF9jYXNvMSkNCg0KcGxvdChhX3NpbV8yMDAwX2Nhc28xLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzEpLG1heCh2YWxvcmVzX2Nhc28xKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QgKGF8WV9pLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQpwbG90KGJfc2ltXzIwMDBfY2FzbzEsIHR5cGU9ImwiLCB5bGltID0gYyhtaW4odmFsb3Jlc19jYXNvMSksbWF4KHZhbG9yZXNfY2FzbzEpKSwgeGxhYiA9ICJDYW50aWRhZCBkZSBzaW11bGFjaW9uZXMiLHlsYWIgPSAiU2ltdWxhY2lvbmVzIGRlIEdpYmJzIiwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24ocGFzdGUoIlRyYWNlcGxvdChifFlfaSxhKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChhX2Jfc2ltXzIwMDBfY2FzbzEsIHR5cGU9ImwiLCB5bGltID0gYyhtaW4odmFsb3Jlc19jYXNvMSksbWF4KHZhbG9yZXNfY2FzbzEpKSwgeGxhYiA9ICJDYW50aWRhZCBkZSBzaW11bGFjaW9uZXMiLHlsYWIgPSAiU2ltdWxhY2lvbmVzIGRlIEdpYmJzIiwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24ocGFzdGUoIlRyYWNlcGxvdChhK2J8WV9pLGEsYilcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc28xX2EsIHF1YW50aWxlc19uX2Nhc28xX2EsIHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGEiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGEiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGEiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc28xX2IsIHF1YW50aWxlc19uX2Nhc28xX2IseGxhYiA9ICJEYXRvcyBvcmRlbmFkb3MgZW4gYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYiIsbWFpbiA9ICJxcXBsb3QgZGVsIHBhcsOhbWV0cm8gYiIsIGNvbCA9ICIjN2YwMGIyIikNCmFibGluZShhID0gMCwgYiA9IDEsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCg0KcGxvdChkYXRvc19vcmRlbmFkb3NfY2FzbzFfYV9iLCBxdWFudGlsZXNfbl9jYXNvMV9hX2IseGxhYiA9ICJEYXRvcyBvcmRlbmFkb3MgZW4gYStiIix5bGFiID0gIkN1YW50aWxlcyBkZSBhK2IiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGErYiIsIGNvbCA9ICIjN2YwMGIyIikNCmFibGluZShhID0gMCwgYiA9IDEsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG91dC53aWR0aD0gIjEwMCUiLCBmaWcuYWxpZ249J2NlbnRlcicgLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc28xX2EsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2JfY2FzbzFeMitzaWdtYV9jYXNvMV4yKSptdV9hICsgc2lnbWFfYV9jYXNvMV4yKihZX29ic19jYXNvMSAtIG11X2IpKS8oc2lnbWFfYV9jYXNvMV4yK3NpZ21hX2JfY2FzbzFeMitzaWdtYV9jYXNvMV4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYV9jYXNvMV4yKihzaWdtYV9iX2Nhc28xXjIrc2lnbWFfY2FzbzFeMikpLyhzaWdtYV9hX2Nhc28xXjIrc2lnbWFfYl9jYXNvMV4yK3NpZ21hX2Nhc28xXjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzFfYiwgeSA9ICJwbm9ybSIsICgoc2lnbWFfYV9jYXNvMV4yK3NpZ21hX2Nhc28xXjIpKm11X2IgKyBzaWdtYV9iX2Nhc28xXjIqKFlfb2JzX2Nhc28xIC0gbXVfYSkpLyhzaWdtYV9hX2Nhc28xXjIrc2lnbWFfYl9jYXNvMV4yK3NpZ21hX2Nhc28xXjIpLA0KICAgICAgICBzcXJ0KChzaWdtYV9iX2Nhc28xXjIqKHNpZ21hX2FfY2FzbzFeMitzaWdtYV9jYXNvMV4yKSkvKHNpZ21hX2FfY2FzbzFeMitzaWdtYV9iX2Nhc28xXjIrc2lnbWFfY2FzbzFeMikpKQ0KDQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvMV9hX2IsIHkgPSAicG5vcm0iLCgobXVfYV4yK211X2JeMikqc2lnbWFeMiArIFlfb2JzX2Nhc28xKihzaWdtYV9hX2Nhc28xXjIgLSBzaWdtYV9iX2Nhc28xXjIpKS8oc2lnbWFfYV9jYXNvMV4yK3NpZ21hX2JfY2FzbzFeMitzaWdtYV9jYXNvMV4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfY2FzbzFeMiooc2lnbWFfYV9jYXNvMV4yK3NpZ21hX2JfY2FzbzFeMikpLyhzaWdtYV9hX2Nhc28xXjIrc2lnbWFfYl9jYXNvMV4yK3NpZ21hX2Nhc28xXjIpKSkNCg0KDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFfQ0KcGFyKG1mcm93PWMoMSwzKSkNCmhpc3QoYV9zaW1fMjAwMF9jYXNvMSwgZnJlcSA9IEYsIHhsYWIgPSAic2ltdWxhY2lvbmVzIGRlIGEiLHlsYWIgPSAiRGVuc2lkYWQiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbWEgZGUgYSIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpoaXN0KGJfc2ltXzIwMDBfY2FzbzEsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGIiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChhX2Jfc2ltXzIwMDBfY2FzbzEsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhK2IiLHlsYWIgPSAiRGVuc2lkYWQiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbWEgZGUgYStiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmBgYA0KDQojIyMgQ2FzbyAyOiBzaWdtYSA+IHNpZ21hX2IgPiBzaWdtYV9hDQoNCmBgYHtyIGZpZy5jYXA9ICJDYXNvIDI6IHNpZ21hID4gc2lnbWFfYiA+IHNpZ21hX2EiICxlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzIgPSBjKGFfc2ltXzIwMDBfY2FzbzIsYl9zaW1fMjAwMF9jYXNvMixhX2Jfc2ltXzIwMDBfY2FzbzIpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvMiwgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc28yKSxtYXgodmFsb3Jlc19jYXNvMikpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc28yLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzIpLG1heCh2YWxvcmVzX2Nhc28yKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc28yLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzIpLG1heCh2YWxvcmVzX2Nhc28yKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvMl9hLCBxdWFudGlsZXNfbl9jYXNvMl9hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvMl9iLCBxdWFudGlsZXNfbl9jYXNvMl9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc28yX2FfYiwgcXVhbnRpbGVzX25fY2FzbzJfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvMl9hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc28yXjIrc2lnbWFfY2FzbzJeMikqbXVfYSArIHNpZ21hX2FfY2FzbzJeMiooWV9vYnNfY2FzbzIgLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzJeMitzaWdtYV9iX2Nhc28yXjIrc2lnbWFfY2FzbzJeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzJeMiooc2lnbWFfYl9jYXNvMl4yK3NpZ21hX2Nhc28yXjIpKS8oc2lnbWFfYV9jYXNvMl4yK3NpZ21hX2JfY2FzbzJeMitzaWdtYV9jYXNvMl4yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc28yX2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzJeMitzaWdtYV9jYXNvMl4yKSptdV9iICsgc2lnbWFfYl9jYXNvMl4yKihZX29ic19jYXNvMiAtIG11X2EpKS8oc2lnbWFfYV9jYXNvMl4yK3NpZ21hX2JfY2FzbzJeMitzaWdtYV9jYXNvMl4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvMl4yKihzaWdtYV9hX2Nhc28yXjIrc2lnbWFfY2FzbzJeMikpLyhzaWdtYV9hX2Nhc28yXjIrc2lnbWFfYl9jYXNvMl4yK3NpZ21hX2Nhc28yXjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzJfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvMiooc2lnbWFfYV9jYXNvMl4yIC0gc2lnbWFfYl9jYXNvMl4yKSkvKHNpZ21hX2FfY2FzbzJeMitzaWdtYV9iX2Nhc28yXjIrc2lnbWFfY2FzbzJeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc28yXjIqKHNpZ21hX2FfY2FzbzJeMitzaWdtYV9iX2Nhc28yXjIpKS8oc2lnbWFfYV9jYXNvMl4yK3NpZ21hX2JfY2FzbzJeMitzaWdtYV9jYXNvMl4yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzIsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc28yLCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc28yLCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KIyMjIENhc28gMzogc2lnbWFfYiA+IHNpZ21hX2EgPiBzaWdtYQ0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyAzOiBzaWdtYV9iID4gc2lnbWFfYSA+IHNpZ21hIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzMgPSBjKGFfc2ltXzIwMDBfY2FzbzMsYl9zaW1fMjAwMF9jYXNvMyxhX2Jfc2ltXzIwMDBfY2FzbzMpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvMywgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc28zKSxtYXgodmFsb3Jlc19jYXNvMykpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc28zLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzMpLG1heCh2YWxvcmVzX2Nhc28zKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc28zLCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzMpLG1heCh2YWxvcmVzX2Nhc28zKSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvM19hLCBxdWFudGlsZXNfbl9jYXNvM19hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvM19iLCBxdWFudGlsZXNfbl9jYXNvM19iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc28zX2FfYiwgcXVhbnRpbGVzX25fY2FzbzNfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvM19hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc28zXjIrc2lnbWFfY2FzbzNeMikqbXVfYSArIHNpZ21hX2FfY2FzbzNeMiooWV9vYnNfY2FzbzMgLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzNeMitzaWdtYV9iX2Nhc28zXjIrc2lnbWFfY2FzbzNeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzNeMiooc2lnbWFfYl9jYXNvM14yK3NpZ21hX2Nhc28zXjIpKS8oc2lnbWFfYV9jYXNvM14yK3NpZ21hX2JfY2FzbzNeMitzaWdtYV9jYXNvM14yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc28zX2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzNeMitzaWdtYV9jYXNvM14yKSptdV9iICsgc2lnbWFfYl9jYXNvM14yKihZX29ic19jYXNvMyAtIG11X2EpKS8oc2lnbWFfYV9jYXNvM14yK3NpZ21hX2JfY2FzbzNeMitzaWdtYV9jYXNvM14yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvM14yKihzaWdtYV9hX2Nhc28zXjIrc2lnbWFfY2FzbzNeMikpLyhzaWdtYV9hX2Nhc28zXjIrc2lnbWFfYl9jYXNvM14yK3NpZ21hX2Nhc28zXjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzNfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvMyooc2lnbWFfYV9jYXNvM14yIC0gc2lnbWFfYl9jYXNvM14yKSkvKHNpZ21hX2FfY2FzbzNeMitzaWdtYV9iX2Nhc28zXjIrc2lnbWFfY2FzbzNeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc28zXjIqKHNpZ21hX2FfY2FzbzNeMitzaWdtYV9iX2Nhc28zXjIpKS8oc2lnbWFfYV9jYXNvM14yK3NpZ21hX2JfY2FzbzNeMitzaWdtYV9jYXNvM14yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzMsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc28zLCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc28zLCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KIyMjIENhc28gNDogc2lnbWEgPiBzaWdtYV9hID4gc2lnbWFfYg0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyA0OiBzaWdtYSA+IHNpZ21hX2EgPiBzaWdtYV9iIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzQgPSBjKGFfc2ltXzIwMDBfY2FzbzQsYl9zaW1fMjAwMF9jYXNvNCxhX2Jfc2ltXzIwMDBfY2FzbzQpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvNCwgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc280KSxtYXgodmFsb3Jlc19jYXNvNCkpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc280LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzQpLG1heCh2YWxvcmVzX2Nhc280KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc280LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzQpLG1heCh2YWxvcmVzX2Nhc280KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG91dC53aWR0aD0gIjEwMCUiLCBmaWcuYWxpZ249J2NlbnRlcicgLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCnBhcihtZnJvdyA9IGMoMSwzKSkNCg0KcGxvdChkYXRvc19vcmRlbmFkb3NfY2FzbzRfYSwgcXVhbnRpbGVzX25fY2FzbzRfYSwgeGxhYiA9ICJEYXRvcyBvcmRlbmFkb3MgZW4gYSIseWxhYiA9ICJDdWFudGlsZXMgZGUgYSIsbWFpbiA9ICJxcXBsb3QgZGVsIHBhcsOhbWV0cm8gYSIsIGNvbCA9ICIjN2YwMGIyIikNCmFibGluZShhID0gMCwgYiA9IDEsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCg0KcGxvdChkYXRvc19vcmRlbmFkb3NfY2FzbzRfYiwgcXVhbnRpbGVzX25fY2FzbzRfYix4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBiIix5bGFiID0gIkN1YW50aWxlcyBkZSBiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBiIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvNF9hX2IsIHF1YW50aWxlc19uX2Nhc280X2FfYix4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhK2IiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGErYiIsbWFpbiA9ICJxcXBsb3QgZGVsIHBhcsOhbWV0cm8gYStiIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzRfYSwgeSA9ICJwbm9ybSIsICgoc2lnbWFfYl9jYXNvNF4yK3NpZ21hX2Nhc280XjIpKm11X2EgKyBzaWdtYV9hX2Nhc280XjIqKFlfb2JzX2Nhc280IC0gbXVfYikpLyhzaWdtYV9hX2Nhc280XjIrc2lnbWFfYl9jYXNvNF4yK3NpZ21hX2Nhc280XjIpLA0KICAgICAgICBzcXJ0KChzaWdtYV9hX2Nhc280XjIqKHNpZ21hX2JfY2FzbzReMitzaWdtYV9jYXNvNF4yKSkvKHNpZ21hX2FfY2FzbzReMitzaWdtYV9iX2Nhc280XjIrc2lnbWFfY2FzbzReMikpKQ0KDQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvNF9iLCB5ID0gInBub3JtIiwgKChzaWdtYV9hX2Nhc280XjIrc2lnbWFfY2FzbzReMikqbXVfYiArIHNpZ21hX2JfY2FzbzReMiooWV9vYnNfY2FzbzQgLSBtdV9hKSkvKHNpZ21hX2FfY2FzbzReMitzaWdtYV9iX2Nhc280XjIrc2lnbWFfY2FzbzReMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2JfY2FzbzReMiooc2lnbWFfYV9jYXNvNF4yK3NpZ21hX2Nhc280XjIpKS8oc2lnbWFfYV9jYXNvNF4yK3NpZ21hX2JfY2FzbzReMitzaWdtYV9jYXNvNF4yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc280X2FfYiwgeSA9ICJwbm9ybSIsKChtdV9hXjIrbXVfYl4yKSpzaWdtYV4yICsgWV9vYnNfY2FzbzQqKHNpZ21hX2FfY2FzbzReMiAtIHNpZ21hX2JfY2FzbzReMikpLyhzaWdtYV9hX2Nhc280XjIrc2lnbWFfYl9jYXNvNF4yK3NpZ21hX2Nhc280XjIpLA0KICAgICAgICBzcXJ0KChzaWdtYV9jYXNvNF4yKihzaWdtYV9hX2Nhc280XjIrc2lnbWFfYl9jYXNvNF4yKSkvKHNpZ21hX2FfY2FzbzReMitzaWdtYV9iX2Nhc280XjIrc2lnbWFfY2FzbzReMikpKQ0KDQoNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0V9DQpwYXIobWZyb3c9YygxLDMpKQ0KaGlzdChhX3NpbV8yMDAwX2Nhc280LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYSIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBhIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYl9zaW1fMjAwMF9jYXNvNCwgZnJlcSA9IEYsIHhsYWIgPSAic2ltdWxhY2lvbmVzIGRlIGIiLHlsYWIgPSAiRGVuc2lkYWQiLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbWEgZGUgYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpoaXN0KGFfYl9zaW1fMjAwMF9jYXNvNCwgZnJlcSA9IEYsIHhsYWIgPSAic2ltdWxhY2lvbmVzIGRlIGErYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBhK2IiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KYGBgDQoNCg0KIyMjIENhc28gNTogc2lnbWFfYSA+IHNpZ21hX2IgPSBzaWdtYQ0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyA1OiBzaWdtYV9hID4gc2lnbWFfYiA9IHNpZ21hIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzUgPSBjKGFfc2ltXzIwMDBfY2FzbzUsYl9zaW1fMjAwMF9jYXNvNSxhX2Jfc2ltXzIwMDBfY2FzbzUpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvNSwgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc281KSxtYXgodmFsb3Jlc19jYXNvNSkpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc281LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzUpLG1heCh2YWxvcmVzX2Nhc281KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc281LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzUpLG1heCh2YWxvcmVzX2Nhc281KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvNV9hLCBxdWFudGlsZXNfbl9jYXNvNV9hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvNV9iLCBxdWFudGlsZXNfbl9jYXNvNV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc281X2FfYiwgcXVhbnRpbGVzX25fY2FzbzVfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvNV9hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc281XjIrc2lnbWFfY2FzbzVeMikqbXVfYSArIHNpZ21hX2FfY2FzbzVeMiooWV9vYnNfY2FzbzUgLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzVeMitzaWdtYV9iX2Nhc281XjIrc2lnbWFfY2FzbzVeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzVeMiooc2lnbWFfYl9jYXNvNV4yK3NpZ21hX2Nhc281XjIpKS8oc2lnbWFfYV9jYXNvNV4yK3NpZ21hX2JfY2FzbzVeMitzaWdtYV9jYXNvNV4yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc281X2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzVeMitzaWdtYV9jYXNvNV4yKSptdV9iICsgc2lnbWFfYl9jYXNvNV4yKihZX29ic19jYXNvNSAtIG11X2EpKS8oc2lnbWFfYV9jYXNvNV4yK3NpZ21hX2JfY2FzbzVeMitzaWdtYV9jYXNvNV4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvNV4yKihzaWdtYV9hX2Nhc281XjIrc2lnbWFfY2FzbzVeMikpLyhzaWdtYV9hX2Nhc281XjIrc2lnbWFfYl9jYXNvNV4yK3NpZ21hX2Nhc281XjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzVfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvNSooc2lnbWFfYV9jYXNvNV4yIC0gc2lnbWFfYl9jYXNvNV4yKSkvKHNpZ21hX2FfY2FzbzVeMitzaWdtYV9iX2Nhc281XjIrc2lnbWFfY2FzbzVeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc281XjIqKHNpZ21hX2FfY2FzbzVeMitzaWdtYV9iX2Nhc281XjIpKS8oc2lnbWFfYV9jYXNvNV4yK3NpZ21hX2JfY2FzbzVeMitzaWdtYV9jYXNvNV4yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzUsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc281LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc281LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KIyMjIENhc28gNjogc2lnbWFfYiA+IHNpZ21hX2EgPSBzaWdtYQ0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyA2OiBzaWdtYV9iID4gc2lnbWFfYSA9IHNpZ21hIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzYgPSBjKGFfc2ltXzIwMDBfY2FzbzYsYl9zaW1fMjAwMF9jYXNvNixhX2Jfc2ltXzIwMDBfY2FzbzYpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvNiwgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc282KSxtYXgodmFsb3Jlc19jYXNvNikpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc282LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzYpLG1heCh2YWxvcmVzX2Nhc282KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc282LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzYpLG1heCh2YWxvcmVzX2Nhc282KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvNl9hLCBxdWFudGlsZXNfbl9jYXNvNl9hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvNl9iLCBxdWFudGlsZXNfbl9jYXNvNl9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc282X2FfYiwgcXVhbnRpbGVzX25fY2FzbzZfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvNl9hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc282XjIrc2lnbWFfY2FzbzZeMikqbXVfYSArIHNpZ21hX2FfY2FzbzZeMiooWV9vYnNfY2FzbzYgLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzZeMitzaWdtYV9iX2Nhc282XjIrc2lnbWFfY2FzbzZeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzZeMiooc2lnbWFfYl9jYXNvNl4yK3NpZ21hX2Nhc282XjIpKS8oc2lnbWFfYV9jYXNvNl4yK3NpZ21hX2JfY2FzbzZeMitzaWdtYV9jYXNvNl4yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc282X2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzZeMitzaWdtYV9jYXNvNl4yKSptdV9iICsgc2lnbWFfYl9jYXNvNl4yKihZX29ic19jYXNvNiAtIG11X2EpKS8oc2lnbWFfYV9jYXNvNl4yK3NpZ21hX2JfY2FzbzZeMitzaWdtYV9jYXNvNl4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvNl4yKihzaWdtYV9hX2Nhc282XjIrc2lnbWFfY2FzbzZeMikpLyhzaWdtYV9hX2Nhc282XjIrc2lnbWFfYl9jYXNvNl4yK3NpZ21hX2Nhc282XjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzZfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvNiooc2lnbWFfYV9jYXNvNl4yIC0gc2lnbWFfYl9jYXNvNl4yKSkvKHNpZ21hX2FfY2FzbzZeMitzaWdtYV9iX2Nhc282XjIrc2lnbWFfY2FzbzZeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc282XjIqKHNpZ21hX2FfY2FzbzZeMitzaWdtYV9iX2Nhc282XjIpKS8oc2lnbWFfYV9jYXNvNl4yK3NpZ21hX2JfY2FzbzZeMitzaWdtYV9jYXNvNl4yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzYsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc282LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc282LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KIyMjIENhc28gNzogc2lnbWEgPiBzaWdtYV9hID0gc2lnbWFfYg0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyA3OiBzaWdtYSA+IHNpZ21hX2EgPSBzaWdtYV9iIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQpwYXIobWZyb3cgPSBjKDEsMykpDQoNCnZhbG9yZXNfY2FzbzcgPSBjKGFfc2ltXzIwMDBfY2FzbzcsYl9zaW1fMjAwMF9jYXNvNyxhX2Jfc2ltXzIwMDBfY2FzbzcpDQoNCnBsb3QoYV9zaW1fMjAwMF9jYXNvNywgdHlwZT0ibCIsIHlsaW0gPSBjKG1pbih2YWxvcmVzX2Nhc283KSxtYXgodmFsb3Jlc19jYXNvNykpLCB4bGFiID0gIkNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyIseWxhYiA9ICJTaW11bGFjaW9uZXMgZGUgR2liYnMiLA0KICAgICBtYWluID0gZXhwcmVzc2lvbihwYXN0ZSgiVHJhY2VwbG90IChhfFlfaSxiKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChiX3NpbV8yMDAwX2Nhc283LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzcpLG1heCh2YWxvcmVzX2Nhc283KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYnxZX2ksYSlcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCnBsb3QoYV9iX3NpbV8yMDAwX2Nhc283LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzcpLG1heCh2YWxvcmVzX2Nhc283KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QoYStifFlfaSxhLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQoNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvN19hLCBxdWFudGlsZXNfbl9jYXNvN19hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvN19iLCBxdWFudGlsZXNfbl9jYXNvN19iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc283X2FfYiwgcXVhbnRpbGVzX25fY2FzbzdfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvN19hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc283XjIrc2lnbWFfY2FzbzdeMikqbXVfYSArIHNpZ21hX2FfY2FzbzdeMiooWV9vYnNfY2FzbzcgLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzdeMitzaWdtYV9iX2Nhc283XjIrc2lnbWFfY2FzbzdeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzdeMiooc2lnbWFfYl9jYXNvN14yK3NpZ21hX2Nhc283XjIpKS8oc2lnbWFfYV9jYXNvN14yK3NpZ21hX2JfY2FzbzdeMitzaWdtYV9jYXNvN14yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc283X2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzdeMitzaWdtYV9jYXNvN14yKSptdV9iICsgc2lnbWFfYl9jYXNvN14yKihZX29ic19jYXNvNyAtIG11X2EpKS8oc2lnbWFfYV9jYXNvN14yK3NpZ21hX2JfY2FzbzdeMitzaWdtYV9jYXNvN14yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvN14yKihzaWdtYV9hX2Nhc283XjIrc2lnbWFfY2FzbzdeMikpLyhzaWdtYV9hX2Nhc283XjIrc2lnbWFfYl9jYXNvN14yK3NpZ21hX2Nhc283XjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzdfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvNyooc2lnbWFfYV9jYXNvN14yIC0gc2lnbWFfYl9jYXNvN14yKSkvKHNpZ21hX2FfY2FzbzdeMitzaWdtYV9iX2Nhc283XjIrc2lnbWFfY2FzbzdeMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc283XjIqKHNpZ21hX2FfY2FzbzdeMitzaWdtYV9iX2Nhc283XjIpKS8oc2lnbWFfYV9jYXNvN14yK3NpZ21hX2JfY2FzbzdeMitzaWdtYV9jYXNvN14yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzcsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc283LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc283LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KIyMjIENhc28gODogc2lnbWFfYSA9IHNpZ21hX2IgPiBzaWdtYQ0KDQpgYGB7ciBmaWcuY2FwPSAiQ2FzbyA4OiBzaWdtYV9hID0gc2lnbWFfYiA+IHNpZ21hIixlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQuaGVpZ2h0PSAiMjAlIn0NCnBhcihtZnJvdyA9IGMoMSwzKSkNCg0KdmFsb3Jlc19jYXNvOCA9IGMoYV9zaW1fMjAwMF9jYXNvOCxiX3NpbV8yMDAwX2Nhc284LGFfYl9zaW1fMjAwMF9jYXNvOCkNCg0KcGxvdChhX3NpbV8yMDAwX2Nhc284LCB0eXBlPSJsIiwgeWxpbSA9IGMobWluKHZhbG9yZXNfY2FzbzgpLG1heCh2YWxvcmVzX2Nhc284KSksIHhsYWIgPSAiQ2FudGlkYWQgZGUgc2ltdWxhY2lvbmVzIix5bGFiID0gIlNpbXVsYWNpb25lcyBkZSBHaWJicyIsDQogICAgIG1haW4gPSBleHByZXNzaW9uKHBhc3RlKCJUcmFjZXBsb3QgKGF8WV9pLGIpXG4gY29uIDIwMDAgc2ltdWxhY2lvbmVzIikpLCBjb2wgPSAiIzdmMDBiMiIpDQpwbG90KGJfc2ltXzIwMDBfY2FzbzgsIHR5cGU9ImwiLCB5bGltID0gYyhtaW4odmFsb3Jlc19jYXNvOCksbWF4KHZhbG9yZXNfY2FzbzgpKSwgeGxhYiA9ICJDYW50aWRhZCBkZSBzaW11bGFjaW9uZXMiLHlsYWIgPSAiU2ltdWxhY2lvbmVzIGRlIEdpYmJzIiwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24ocGFzdGUoIlRyYWNlcGxvdChifFlfaSxhKVxuIGNvbiAyMDAwIHNpbXVsYWNpb25lcyIpKSwgY29sID0gIiM3ZjAwYjIiKQ0KcGxvdChhX2Jfc2ltXzIwMDBfY2FzbzgsIHR5cGU9ImwiLCB5bGltID0gYyhtaW4odmFsb3Jlc19jYXNvOCksbWF4KHZhbG9yZXNfY2FzbzgpKSwgeGxhYiA9ICJDYW50aWRhZCBkZSBzaW11bGFjaW9uZXMiLHlsYWIgPSAiU2ltdWxhY2lvbmVzIGRlIEdpYmJzIiwNCiAgICAgbWFpbiA9IGV4cHJlc3Npb24ocGFzdGUoIlRyYWNlcGxvdChhK2J8WV9pLGEsYilcbiBjb24gMjAwMCBzaW11bGFjaW9uZXMiKSksIGNvbCA9ICIjN2YwMGIyIikNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgb3V0LndpZHRoPSAiMTAwJSIsIGZpZy5hbGlnbj0nY2VudGVyJyAsIG91dC5oZWlnaHQ9ICIyMCUifQ0KcGFyKG1mcm93ID0gYygxLDMpKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvOF9hLCBxdWFudGlsZXNfbl9jYXNvOF9hLCB4bGFiID0gIkRhdG9zIG9yZGVuYWRvcyBlbiBhIix5bGFiID0gIkN1YW50aWxlcyBkZSBhIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhIiwgY29sID0gIiM3ZjAwYjIiKQ0KYWJsaW5lKGEgPSAwLCBiID0gMSwgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KGRhdG9zX29yZGVuYWRvc19jYXNvOF9iLCBxdWFudGlsZXNfbl9jYXNvOF9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGIiLHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGIiLG1haW4gPSAicXFwbG90IGRlbCBwYXLDoW1ldHJvIGIiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoZGF0b3Nfb3JkZW5hZG9zX2Nhc284X2FfYiwgcXVhbnRpbGVzX25fY2FzbzhfYV9iLHhsYWIgPSAiRGF0b3Mgb3JkZW5hZG9zIGVuIGErYiIseWxhYiA9ICJDdWFudGlsZXMgZGUgYStiIixtYWluID0gInFxcGxvdCBkZWwgcGFyw6FtZXRybyBhK2IiLCBjb2wgPSAiIzdmMDBiMiIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBvdXQud2lkdGg9ICIxMDAlIiwgZmlnLmFsaWduPSdjZW50ZXInICwgb3V0LmhlaWdodD0gIjIwJSJ9DQoNCmtzLnRlc3QoeCA9IGRhdG9zX29yZGVuYWRvc19jYXNvOF9hLCB5ID0gInBub3JtIiwgKChzaWdtYV9iX2Nhc284XjIrc2lnbWFfY2FzbzheMikqbXVfYSArIHNpZ21hX2FfY2FzbzheMiooWV9vYnNfY2FzbzggLSBtdV9iKSkvKHNpZ21hX2FfY2FzbzheMitzaWdtYV9iX2Nhc284XjIrc2lnbWFfY2FzbzheMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2FfY2FzbzheMiooc2lnbWFfYl9jYXNvOF4yK3NpZ21hX2Nhc284XjIpKS8oc2lnbWFfYV9jYXNvOF4yK3NpZ21hX2JfY2FzbzheMitzaWdtYV9jYXNvOF4yKSkpDQoNCg0Ka3MudGVzdCh4ID0gZGF0b3Nfb3JkZW5hZG9zX2Nhc284X2IsIHkgPSAicG5vcm0iLCAoKHNpZ21hX2FfY2FzbzheMitzaWdtYV9jYXNvOF4yKSptdV9iICsgc2lnbWFfYl9jYXNvOF4yKihZX29ic19jYXNvOCAtIG11X2EpKS8oc2lnbWFfYV9jYXNvOF4yK3NpZ21hX2JfY2FzbzheMitzaWdtYV9jYXNvOF4yKSwNCiAgICAgICAgc3FydCgoc2lnbWFfYl9jYXNvOF4yKihzaWdtYV9hX2Nhc284XjIrc2lnbWFfY2FzbzheMikpLyhzaWdtYV9hX2Nhc284XjIrc2lnbWFfYl9jYXNvOF4yK3NpZ21hX2Nhc284XjIpKSkNCg0KDQprcy50ZXN0KHggPSBkYXRvc19vcmRlbmFkb3NfY2FzbzhfYV9iLCB5ID0gInBub3JtIiwoKG11X2FeMittdV9iXjIpKnNpZ21hXjIgKyBZX29ic19jYXNvOCooc2lnbWFfYV9jYXNvOF4yIC0gc2lnbWFfYl9jYXNvOF4yKSkvKHNpZ21hX2FfY2FzbzheMitzaWdtYV9iX2Nhc284XjIrc2lnbWFfY2FzbzheMiksDQogICAgICAgIHNxcnQoKHNpZ21hX2Nhc284XjIqKHNpZ21hX2FfY2FzbzheMitzaWdtYV9iX2Nhc284XjIpKS8oc2lnbWFfYV9jYXNvOF4yK3NpZ21hX2JfY2FzbzheMitzaWdtYV9jYXNvOF4yKSkpDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnBhcihtZnJvdz1jKDEsMykpDQpoaXN0KGFfc2ltXzIwMDBfY2FzbzgsIGZyZXEgPSBGLCB4bGFiID0gInNpbXVsYWNpb25lcyBkZSBhIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGEiLCBjb2wgPSAiIzdmMDBiMiIsIGJyZWFrcyA9IDIwKQ0KaGlzdChiX3NpbV8yMDAwX2Nhc284LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYiIseWxhYiA9ICJEZW5zaWRhZCIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBiIiwgY29sID0gIiM3ZjAwYjIiLCBicmVha3MgPSAyMCkNCmhpc3QoYV9iX3NpbV8yMDAwX2Nhc284LCBmcmVxID0gRiwgeGxhYiA9ICJzaW11bGFjaW9uZXMgZGUgYStiIix5bGFiID0gIkRlbnNpZGFkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGErYiIsIGNvbCA9ICIjN2YwMGIyIiwgYnJlYWtzID0gMjApDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJlZXAoOCkNCmBgYA0KDQo=