EJERCICIO 1. MODELOS DE REGRESIÓN PARA LOS CASOS ACUMULADOS DE COVID-19 EN REINO UNIDO

Un modelo de regresión es una herramienta matemática que nos ayuda a determinar una relacíon entre una variable dependiente con respecto a otras variables llamadas explicativas o independientes. Estos, a lo largo de los últimos meses, se han puesto muy de moda en los noticiarios y periódicos de todo el mundo, ya que nos permite representar y estudiar la evolución del virus en un país, en otras palabras, hacer un seguimiento y predicciones, además de proporcionar gráficas de “fácil” comprensión para que la gente aprenda como funciona, desde un punto de vista matemático, la propagación del virus.

En nuestro caso estudiaremos la evolución de los casos acumulados de nuevas infecciones que han ocurrido en Reino Unido (UK).

Apartado a): Modelar el número acumulado de personas infectadas mediante un ajuste lineal.
Para ello, recurriremos a los comando que R nos proporciona. Empezaremos, lo primero de todo, por introducir los datos oficales:

days<-read.table("AcummulativeDaysUK")
NewCasesUK<-read.table("NewCasesUK",sep=".")

days<-c(days$V1);days
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
[45] 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
[89] 89 90 91 92 93
NewCasesUK<-c(NewCasesUK$V1);NewCasesUK
 [1]    2    0    0    0    0    1    0    0    1    4    0    0    1    0    0    0    0    0    0    0    0    0    0    4    0    0
[27]    0    6    4   12    5   11   34   29   46   46   65   50   52   83  134  207  264  330  152  407  676  643  714 1040  665  967
[53] 1430 1450 2130 2890 2560 2500 2670 3250 4570 4520 4670 4000 6200 4140 3890 5870 4680 5710 5230 5290 4340 5250 4600 4620 5600 5530
[79] 5850 4680 4300 4450 4580 5390 4910 4460 4310 4000 4080 6030 6200 4810 4340


Como podemos observar, la primera lista de números, se trata de el número de días que han pasado desde el día 1 correspondiente con 31/1/2020, cuando se detectó el primer infectado. La segunda lista se corresponde con el número de nuevos infectados en cada día desde el día uno hasta hoy.
Para visualizarlo mejor, representaremos en una gráfica los picos de infecciones por día:

plot(days,NewCasesUK,xlim=c(0,100),ylim=c(0,7000),ylab="Number of Cases",xlab="Days since 31-1-20", main="New Cases UK")
lines(spline(days,NewCasesUK),lwd="3",col="blue")


Ahora vamos a realizar el ajuste lineal de la suma acumulada por día de los datos representados en la siguente gráfica:

AllCasesUK<-cumsum(NewCasesUK)
AllCasesUK
 [1]      2      2      2      2      2      3      3      3      4      8      8      8      9      9      9      9      9      9
[19]      9      9      9      9      9     13     13     13     13     19     23     35     40     51     85    114    160    206
[37]    271    321    373    456    590    797   1061   1391   1543   1950   2626   3269   3983   5023   5688   6655   8085   9535
[55]  11665  14555  17115  19615  22285  25535  30105  34625  39295  43295  49495  53635  57525  63395  68075  73785  79015  84305
[73]  88645  93895  98495 103115 108715 114245 120095 124775 129075 133525 138105 143495 148405 152865 157175 161175 165255 171285
[91] 177485 182295 186635


Si nos fijamos, hasta día de hoy el número total de infectados es de 177485.

plot(days,AllCasesUK,ylab="Number of Cases",xlab="Days since 31-1-20", main="New Cases UK")
lines(spline(days,AllCasesUK),col="red",lwd="3")


Lo que buscamos es minimizar el error cuadrático medio de los puntos de esta gráfica y modelarlo mediante la expresión de una recta de regresión: \[y=a+bx\]
Para ello usaremos principalmente el comando “lineal model” o lm() de R y las herramientas que nos proporciona para obtener los parámetros \(a\) y \(b\):

LinealModel<-lm(AllCasesUK~days)
summary(LinealModel)

Call:
lm(formula = AllCasesUK ~ days)

Residuals:
   Min     1Q Median     3Q    Max 
-43570 -28214  -1559  26043  61752 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -46280       6387  -7.246 1.35e-10 ***
days            1840        118  15.598  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 30550 on 91 degrees of freedom
Multiple R-squared:  0.7278,    Adjusted R-squared:  0.7248 
F-statistic: 243.3 on 1 and 91 DF,  p-value: < 2.2e-16


Hemos usado el comando summary() para mostrar algunos datos aparte de los parámetros \(a\) y \(b\) que también son de interés. Más concretamente nos referimos a “Multiple R-squared”, lo cual nos da el coeficiente de determinación (número comprendido entre 0 y 1 que de una forma general nos dice como de bueno es el ajuste), que en este caso es de 0.7145. Dado que no supera el 0.8, desgraciadamente, no podemos decir que nos encontramos ante un buen ajuste en relación al conjunto de datos proporcionado. Esto se debe a que en el intervalo de tiempo que hemos representado, el crecimiento y expansión del virus aumenta drásticamente entre los 40 y 60 dias, perdiendo la forma lineal en cuanto al aumento de casos.

A continuación haremos uso de los comandos de representación gráfica de R para mostrar la siguiente recta:

\[y=-46280+1840x\]

xaj<-seq(0.005,100,0.001)
plot(days,AllCasesUK,ylab="Number of Cases",xlab="Days since 31-1-20", main="Total Cases UK")
abline(LinealModel, col="orange",lwd="3")



Apartado b): Modelar el número acumulado de personas infectadas mediante un ajuste no lineal de los presentados en las transparencias teóricas de la asignatura.

Para este apartado hemos elegido el modelo exponencial, al cual hay que aplicarle un cambio de variable para linealizarlo, obtener los parámetros correspondientes y por último deshacer el cambio para poder representar el grafo. A continuación, la manipulación algebraica del modelo elegido:
\[ \begin{align*} y&=\alpha e^{\beta x}\\ \\ log(y)&=log(\alpha)+\beta x\\ \\ Z&=A+Bx \end{align*} \] \[Z=log(y);\ A=log(\alpha);\ B=\beta \]
Con la forma de esta recta averiguaremos los parámetros \(\alpha\) y \(\beta\) procediendo de la misma manera que en el apartado anterior con los comandos de R. La diferencia es que ahora tendremos que transformar los valores de \(y\) para la nueva variable \(Z\):

Z<-log(AllCasesUK);Z
 [1]  0.6931472  0.6931472  0.6931472  0.6931472  0.6931472  1.0986123  1.0986123  1.0986123  1.3862944  2.0794415  2.0794415  2.0794415
[13]  2.1972246  2.1972246  2.1972246  2.1972246  2.1972246  2.1972246  2.1972246  2.1972246  2.1972246  2.1972246  2.1972246  2.5649494
[25]  2.5649494  2.5649494  2.5649494  2.9444390  3.1354942  3.5553481  3.6888795  3.9318256  4.4426513  4.7361984  5.0751738  5.3278762
[37]  5.6021188  5.7714411  5.9215784  6.1224928  6.3801225  6.6808547  6.9669671  7.2377782  7.3414839  7.5755847  7.8732171  8.0922394
[49]  8.2897906  8.5217826  8.6461140  8.8031237  8.9977658  9.1627245  9.3643482  9.5856899  9.7477106  9.8840499 10.0116691 10.1478053
[61] 10.3124465 10.4523312 10.5788526 10.6757924 10.8096269 10.8899571 10.9599749 11.0571403 11.1283653 11.2089107 11.2773930 11.3421965
[73] 11.3923949 11.4499324 11.4977611 11.5436001 11.5964851 11.6461005 11.6960384 11.7342674 11.7681489 11.8020440 11.8357695 11.8740555
[85] 11.9077003 11.9373105 11.9651151 11.9902460 12.0152450 12.0510841 12.0866414 12.1133815 12.1369101
cor(Z,days)**2
[1] 0.9581646


Como podemos comprobar, el coeficiente de determinación de este conjunto de datos, es bastante mejor que en el caso del ajuste mediante la recta de regresión.

ExpModel<-lm(Z~days)
summary(ExpModel)

Call:
lm(formula = Z ~ days)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.81048 -0.67971  0.06022  0.70234  1.18595 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 0.034520   0.177367   0.195    0.846    
days        0.149601   0.003277  45.653   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8483 on 91 degrees of freedom
Multiple R-squared:  0.9582,    Adjusted R-squared:  0.9577 
F-statistic:  2084 on 1 and 91 DF,  p-value: < 2.2e-16


Tras haber realizado el “linear model” de los datos Z sobre “days” (datos del eje x), obtenemos los valores de los parámetros del ajuste lineal, ahora toca deshacer el cambio:
\[\alpha=e^A;\ \beta=B \]

A<-ExpModel1$coefficients[1]
b<-ExpModel1$coefficients[2]
a<-exp(A)
a
(Intercept) 
   1.035123 
b
     days 
0.1496007 


Con estos valores para los parámetros \(\alpha\) y \(\beta\) respectivamente dibujaremos la siguiente función:
\[y=1.035123 e^{0.1496007}\]

xaj<-xaj<-seq(0.005,100,0.001)
yaj<-a*exp(b*xaj)
plot(days,AllCasesUK,ylab="Number of Cases",xlab="Days since 31-1-20", main="Total Cases UK")
lines(spline(xaj,yaj),col="blue",lwd="4")


Lo que podemos observar en este ajuste es bastante gráfico. La función exponencial se ajusta mucho mejor que la recta (sobretodo en los 50 primeros dias), pero aún así, después, hay mucha disparidad entre los valores reales y los que la función nos da, ya que esta crece mucho más rápido que el número de infectados.

Apartado c): Mejorar dicho ajuste mediante técnicas de mínimos cuadrados no lineales.

Las técnicas de mínimos cuadrados no lineales que ya hemos ido presentando en los dos apartados anteriores son, a “grosso modo”, un problema de optimización muy complejo. Se trata de aproximar un conjunto de datos de forma lineal y después, refinar los parámetros mediante métodos iterativos:
\[ \min_{\theta} SR(\hat{\theta})= \min_{\theta}\sum_{t=1}^{T}\hat{u_t}(\hat{\theta})= \min_{\theta}\sum_{t=1}^{T}[y_t-f(x_t,\beta)]^2 \]
lo que implica resolver el sistema de ecuaciones,
\[ \left( \dfrac{\partial f(x_t,\beta)}{\partial \beta} \right)^{´}y= \left( \dfrac{\partial f(x_t,\beta)}{\partial \beta} \right)^{'}f(X,\beta) \]
donde el vector gradiente es \(Txk\), y \(f(X,\beta)\) es \(Tk1\). Este sistema puede no tener solución o tener múltiples soluciones. A diferencia del estimador de Mínimos Cuadrados aplicado a un modelo lineal, el estimador no es insesgado. La matriz de covarianzas del estimador resultante es:
\[ Var(\hat{\theta}) = \sigma^{2}_{u} \left[ \left( \dfrac{\partial f(x_t,\beta)}{\partial \beta} \right)^{´} \left( \dfrac{\partial f(x_t,\beta)}{\partial \beta} \right) \right]^{-1} \]
que se reduce a la matriz de covarianzas \(\sigma^{2}_{u}(X^{'}X)^-1\) en el caso de un modelo lineal. Si quisiéramos aplicar Minimos Cuadrados directamente, en el modelo exponencial,
\[ y_t= f(x_t,\theta)+u_t= \alpha + \beta_1e^{\beta_{2}x_t} + u_t \]
con \(\theta = (\alpha,\beta_1,\beta_2)\), tendríamos que resolver el problema,
\[ \min_{\theta} SR(\hat{\theta})= \min_{\theta}\sum_{t=1}^{T} \left[ \hat{u_t}(\hat{\theta}) \right]^2= \min_{\theta}\sum_{t=1}^{T}[y_t-(\alpha + \beta_1e^{\beta_{2}x_t})]^2 \]
que conduce a las condiciones de optimalidad,
\[ \begin{align*} \sum y_t &= \alpha T + \beta_1 \sum e^{\beta_2 x_t}\\ \sum y_te^{\beta_2 x_t} &= \alpha\sum e^{\beta_2 x_t}+\beta_1\sum e^{2\beta_2 x_t}\\ \sum y_tx_te^{\beta_2 x_t} &= \alpha\sum x_te^{2\beta_2 x_t}+\beta_1\sum x_te^{2\beta_2 x_t}\\ \end{align*} \]
que carece de solucion explícita, por lo que debe resolverse por procedimientos numéricos.

Para hacer esto en Rstudio, usaremos el comando nls (“Nonlineal Least Squares”), que nos agilizará este poceso. El comando precisa de una ecuación (el modelo exponencial anterior) y un gérmen inicial para cada parámetro. Estos siempre son muy difíciles de encontrar, pero por suerte, ya tenemos dos muy buenos, los valores de \(\alpha\) y \(\beta\) del anterior apartado.

\[A=\alpha = 1.035123; B=\beta = 0.1496007 \]

NLS<-nls(AllCasesUK~A*exp(B*days),start=list(A=a,B=b))
summary(NLS)

Formula: AllCasesUK ~ A * exp(B * days)

Parameters:
   Estimate Std. Error t value Pr(>|t|)    
A 1.381e+03  2.150e+02   6.426  5.9e-09 ***
B 5.429e-02  1.835e-03  29.580  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11320 on 91 degrees of freedom

Number of iterations to convergence: 24 
Achieved convergence tolerance: 8.401e-06


Como podemos observar en el summary, los parámetros han cambiado y se han realizado 24 iteraciones para lograrlo. Vamos a representar la gráfica con los nuevos parámetros para comprobar cuánto ha mejorado el ajuste:

A<-summary(NLS)$coefficients[1];A
[1] 1381.294
B<-summary(NLS)$coefficients[2];B
[1] 0.05429373


\[y=1381.294 e^{0.05429373}\]

xaj<-xaj<-seq(0.005,100,0.001)
yaj<-A*exp(B*xaj)
plot(days,AllCasesUK,ylab="Number of Cases",xlab="Days since 31-1-20", main="Total Cases UK")
lines(spline(xaj,yaj),col="green",lwd="4")


Cabe destacar que el cambio es muy grande. La nueva función se ajusta mucho mejor de forma general a los datos, dejando atrás la gran disparidad que mostraba el ajuste del apartado anterior.

Apartado d): modelar el número acumulado de personas infectadas mediante un ajuste no lineal de tipo asintótico más realista que los anteriores.

Para este apartado hemos decidido usar la “Función de Gompertz”. Esta función es un tipo de modelo matemático para una serie temporal y lleva el nombre de Benjamin Gompertz. Es una función sigmoidea que describe un crecimiento lento al comienzo y el crecimiento del final de un periodo de tiempo dado. Las funciones en base a este modelo, son inicialmente cóncavas y, tras pasar el punto de inflexión, convexas, conocidas también como curvas en forma de S. Benjamin Gompertz utilizó la curva para describir la ley de la naturaleza que rige la mortalidad humana.

Existen diferentes tipos de curvas Gompertz en función de los parámetros que la componen, pero todas tienen una doble exponencial como elemento característistico común.

Benjamin Gompertz introduce esta curva en su libro “On the Nature of the Function Expressive of the Law of Human Mortality, and on a New Mode of Determining the Value of Life Contingencies”. Para ello postula que los incrementos
\[Log(n)-Log(n+m),\ Log(n+m)-Log(n+2m),\ etc\]
son constantes, siendo \(Log(n+km)\) el logaritmo de la población en el instante \(n+km\), siendo indicio de encontrarnos ante un crecimiento geométrico.

La función que aparece en libro previamente citado, se expresa como:
\[L_x=dg^{q^{x}}, _{Ec1}\] donde

\[1\ \ log(g)=\dfrac{mq^{-a}}{1-q^{r}}\]

\[2\ \ q = p^{\dfrac{1}{r}}\]

\[3\ \ m=log(L_a)-log(L_{a+r})\]

\[4\ \ d=\dfrac{L_a}{\xi}\]

\[5\ \ log(\xi)=\dfrac{m}{1-q^{r}}\]

El valor de a denota el instante inicial, el de r la unidad de salto considerada en el tiempo y p es la razón de la progresión geométrica que define el número de personas vivas en el tiempo x.

La curva Gompertz fue objeto de interés en ciencias actuariales, pero con el paso del tiempo su aplicación se trasladó también a otros campos como la Biología o la Economía. P. Winsor, motivado por las diferentes aplicaciones de los modelos Gompertz, realizó en un estudio comparativo entre un modelo de Gompertz y otro de Verhulst. Para ello reescribió “Ec1” cómo:
\[Y = Ke^{-e^{a-bx}},\ k>0,\ b>0\]
deduciendose que \(lim_{x\rightarrow\infty}y=K\) y \(lim_{x\rightarrow-\infty}Y=0\). A partir de esta expresión, se obtiene la ecuación diferencial
\[\dfrac{\partial Y}{\partial x}=bye^{a-bx}\]
donde también se deduce que la pendiente de \(Y(x)\) es siempre positiva para valores finitos de \(x\), tendiendo a 0 cuando la \(x\) tiende a \(+\infty\). Buscando el punto de inflexión de la curva se llega a la expresión
\[\dfrac{\partial^2 y}{\partial x^2}= b^2ye^{a-bx}(e^{a-bx}-1)\]
de donde se extrae que está situado en \(\left(\dfrac{a}{b},\dfrac{k}{e}\right)\), alcanzando aproximadamente en el 36,78% del crecimiento total.

Con esto ya podemos calcular una aproximación de nuestro modelo para los datos que tenemos. Vamos a volver a plantearlos:

plot(days,AllCasesUK,ylab="Number of Cases",xlab="Days since 31-1-20", main="Total Cases UK")


Dado que el número de casos acumulados no presenta un comportamiento decreciente a simple vista, tomaré como punto de inflexión el último dato registrado.

AllCasesUK
 [1]      2      2      2      2      2      3      3      3      4      8      8      8      9      9      9      9      9      9
[19]      9      9      9      9      9     13     13     13     13     19     23     35     40     51     85    114    160    206
[37]    271    321    373    456    590    797   1061   1391   1543   1950   2626   3269   3983   5023   5688   6655   8085   9535
[55]  11665  14555  17115  19615  22285  25535  30105  34625  39295  43295  49495  53635  57525  63395  68075  73785  79015  84305
[73]  88645  93895  98495 103115 108715 114245 120095 124775 129075 133525 138105 143495 148405 152865 157175 161175 165255 171285
[91] 177485 182295 186635


Día 93, con un total de 186635 infectados. Lo siguiente será sacar unos valores de los párametros que necesitamos para:

\[Y = Ke^{-e^{a-bx}}\] Dado que, como hemos mencionado antes, en el punto de inflexión de esta función se cumple:

\[ \left. x=\dfrac{a}{b} \atop y=\dfrac{k}{e} \right\} \]
Cogeremos el punto (93,186635) para averiguar los valores:
\[ \left. x=\dfrac{a}{b} \atop y=\dfrac{k}{e} \right\} \left. 93 \approx\dfrac{a}{b} \atop 186635 \approx\dfrac{k}{e} \right\} \left. \begin{array}{rcl} a = 9.3\\ b = 0.1\\ k = 186635e \end{array} \right\} \]
Con estos datos ya podemos trabajar con el comando nls. Usaremos entonces los valores de a, b y k como gérmenes iniciales:

Gompertz<-nls(AllCasesUK~k*exp(-exp(a-b*days)),star=list(a=9.3,b=0.1,k=507326.5291),control=nls.control(minFactor=2^-24, maxiter=200))
summary(Gompertz)

Formula: AllCasesUK ~ k * exp(-exp(a - b * days))

Parameters:
   Estimate Std. Error t value Pr(>|t|)    
a 4.177e+00  4.098e-02  101.95   <2e-16 ***
b 5.606e-02  7.123e-04   78.70   <2e-16 ***
k 2.609e+05  2.905e+03   89.79   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1022 on 90 degrees of freedom

Number of iterations to convergence: 159 
Achieved convergence tolerance: 2.967e-06


Al principio hemos tenido algún problema con los parámetros iniciales ya que en las iteraciones establecidas por defecto (unas 50), el método no lograba alcanzar la tolerancia establecida. Para ello hemos tenido que añadir un “nls.control” para solucionarlo. Como podemos observar en summary, el método converge tras 159 iteraciones, proporcionándonos una buena aproximación.

A continuación vamos a cargar los valores en unas variables para representar la gráfica.

a<-summary(NLS4)$coefficients[1];a
[1] 4.177245
b<-summary(NLS4)$coefficients[2];b
[1] 0.05605732
k<-summary(NLS4)$coefficients[3];k
[1] 260853.9


La ecuación de Gompertz para nuestro ajuste quedaría tal que así:
\[Y = 260853.9e^{-e^{4.177245-0.05605732x}}\]
Ahora vamos a dibujar el gráfico:

xaj<-seq(1,300,0.005)
yaj<-k*exp(-exp(a-b*xaj))
plot(days,AllCasesUK,xlim=c(0,150),ylim=c(0,300000),ylab="Number of Cases",xlab="Days since 31-1-20", main="Total Cases UK")
lines(spline(xaj,yaj),col="cyan",lwd="4")


Se puede observar que la función se ajusta perfectamente a los puntos e incluso nos predice de manera aproximada cuántos infectados va ha haber en El Reino Unido, \(Infectados\approx 250000\) (en el caso de que a partir de hoy empiecen a bajar el número de nuevos casos). De todas formas no podemos fiarnos de estos datos ya que hemos despreciado una gran cantidad de variables y solo nos hemos fijado en el número acumulado de infectados por día.


Como conclusiones podemos sacar que estos modelos son una gran ayuda a la hora de explicarnos como una epidemia en este caso va a desarrollarse, ya que nos ayudan con las predicciones. En cuanto a las gráficas, esta última se ajusta a una situación social de confinamiento, es decir, obligando a que la gente se quede en sus casas, obligamos también a frenar la expansión del virus. De esta forma la curva se aplana manteniendo constante el número global de casos y evitando una crísis sanitaria. Si estas medidas no se tomaran, la gráfica que mejor ajustaría la expansión del virus, sería el modelo exponencial que hemos hecho en el apartado b y luego mejorado en el apartado c. Una curva sin control y monotonamente creciente, que, hubiera colapsado el sistema.

Datos recogidos hasta el día 03/05/2020.

REFERENCIAS

https://www.google.com/covid19-map/?hl=es
https://www.overleaf.com/learn/latex/
https://masteres.ugr.es/moea/pages/curso201516/tfm1516/simon_minguez_tfm/!
https://es.wikipedia.org/wiki/Funci%C3%B3n_de_Gompertz
https://www.ucm.es/data/cont/media/www/pag-41459/Modelos%20no%20lineales%20corto.pdf
https://es.wikipedia.org/wiki/M%C3%ADnimos_cuadrados_no_lineales
https://www.ucm.es/data/cont/media/www/pag-41459/Modelos%20no%20lineales%20corto.pdf







Ejercicio 2.

Un profesor se interroga por la distribución que sigue el número de asignaturas aprobadas por los alumnos en el cuatrimestre que se imparte la asignatura antes citada de un total de cinco. Olvidando el hecho de que la proporción de aprobar una asignatura varía entre las cinco asignaturas, se aventura a afirmar que esas distribuciones siguen una B(5, 0. 85) en el grupo A y una B(5, 0. 1) en el grupo B. También sabe que a lo largo de los años, el 75 % de los alumnos asisten al grupo A y el 25 % asisten al grupo B. Si se escoge al azar un alumno que ha aprobado más de dos asignaturas en el cuatrimestre, ¿cuál es la probabilidad de que ese alumno haya asistido a clase en el grupo A?

Del enunciado obtenemos lar probabilidades de que un alumno pertenezca a cada uno de los grupos: \[P(A)=0.75\] \[P(B)=0.25\]

Pa<-0.75
Pb<-0.25

Del enunciado también extraemos que la porbabilidad de aprobar una asignatura en el grupo A es de 0.85; mientras que en el grupo B es de 0.1.

Tenemos que hallar la probabilidad de que un alumno que ha aprobado más de dos asignaturas haya asistido a clase en el grupo A. Esta se trata de una probabilidad condicionada. Como el alumno “ha aprobado más de dos asignaturas” establecemos que la variable aleatoria X es el número de asignaturas aprobadas y este tiene que ser estrictamente mayor que dos. Por tanto, tenemos que lo que nos pide el problema viene dado por: \[P(A/X>2)\] Para resolverlo aplicamos la regla de Bayes y posteriormente las propiedades de variables aleatiorias: \[P{(A/X>2)}=\frac{P(A)\cap P(X>2)}{P(X>2)}=\frac{(P(A)\cap (1-P(X\le2))}{1-P(X\le2)}\]

Primero hallamos la probabilidad de que un alumno haya aprobado más de dos asignaturas:

Pa2<-1-pbinom(2,5,0.85);Pa2
[1] 0.9733881

\[P{(X>2)}=(1-P(X\le2)=0.9733881\] A continuación, obtenemos la intersección de la probabilidad de que un alumno pertenezca al grupo A y la probabilidad de que un alumno haya aprobado dos asignaturas. Como se tratan de sucesos independientes, esta es la multiplicación de ambas.

Pa*Pa2
[1] 0.7300411

\[P(A)\cap (1-P(X\le2)=P(A)P(X>2)=0.7300411\]

Ahora, debemos obtener la probabilidad total de que un alumno haya aprobado más de dos asignaturas. Esto es lo mismo que la unión de la probabilidad de que un alumno haya aprobado más de dos asignaturas y vaya al grupo A y la probabilidad de que un alumno haya aprobado más de dos asignaturas y vaya al grupo B. \[P(X>2)=(P(A)\cap (1-P(X\le2))\cup(P(B)\cap(1-P(X\le2))\] Anteriormente, hemos hayado la probabilidad de que esto ocurra en el grupo A. Por lo que ahora debemos obtener la probabilidad de que esto ocurra en el grupo B.

Pb2<-1-pbinom(2,5,0.1);Pb2
[1] 0.00856

Como en el grupo A, se trata de sucesos independientes por lo que la intersección equivale al producto de probabilidadades:

Pb*Pb2
[1] 0.00214

\[P(B)\cap (1-P(X\le2)=P(B)P(X>2)=0.25*0.00856=0.00214\] Ahora ya podemos obtener la probabilidad total de aprobar más de dos asignaturas. Además, como la probabilizar de cumplir este requisito y pertenecer al grupo A es incompatible con la probabilidad de hacerlo y pertenecer al grupo B (ya que un alumno no puede pertenecer a ambos grupos a la vez) la unión de ambos es equivalente a la suma.

P2<-Pa*Pa2+Pb*Pb2;P2
[1] 0.7321811

\[P(X>2)=(P(A)\cap (1-P(X\le2))\cup(P(B)\cap(1-P(X\le2))=0.9733881∗0.75+0.00856∗0.25=0.7321811\] Finalmente, resolvemos:

Pa*Pa2/P2
[1] 0.9970772

\[P({A/X>2})=\frac{P(A)\cap P(X>2)}{P(X>2)}=\frac{(P(A)\cap (1-P(X\le2))}{1-P(X\le2)}=\frac{0.7300411}{0.7321811}=0.9970772\] Por tanto, la probabilidad de que habiendo aprobado más de dos asignaturas un alumno haya ido a clase al grupo A es 0.9970772.








EJERCICIO 3.

La duración de las bombillas de la Marca A siguen una distribución N(14000, 600), mientras que la duración de las bombillas de la Marca B siguen una distribución N(15000, 800). Se establece la siguiente regla para clasificar las bombillas producidas por las Marcas A y B: una bombilla será clasificada como Marca A si su duración es inferior al cuantil teórico 0.05 de la distribución que la gobierna la duración de las bombillas de la Marca B. Las bombillas de la Marca A se catalogan como deficientes si su duración es inferior al primer decil teórico de la distribución que gobierna su duración. Si se clasifica incorrectamente una bombilla de la Marca B, ¿cuál es la probabilidad de que sea clasificada como una bombilla deficiente de la Marca A?

Del enunciado extraemos que la variable aleatoria de duración de las bombillas sigue una distribución normal. Además, este tipo de distribución es característico de las variables aleatorias continuas ya que el conjunto de valores accesibles de duración de las bombillas es infinito no numerable. Tenemos que: -La variable aleatoria que gobierna duración de las bombillas de la Marca A sigue una distribución: \[X_a\sim N(14000,600)\]

-La variable aleatoria que gobierna duración de las bombillas de la Marca B sigue una distribución: \[X_b\sim N(15000,800)\] Así, hacemos las siguientes asignaciones:

mua<-14000
sigmaa<-600
mub<-15000
sigmab<-800

También sabemos que las bombillas se clasifican como Marca A si su duración se encuentra por debajo del cuantil teórico 0.05 de la distribución de las bombillas de la Marca B. Por tanto:

uc<-qnorm(0.05,mub,sigmab);uc
[1] 13684.12

En consecuencia, el umbral de duración de una bombilla por debajo del cual será clasificada como de la Marca A es 13684.12

Además, para que una bombilla sea clasificada como deficiente de la Marca A su duración ha de ser inferior al decil teórico (primer decil–> 0.1) de la distribución de bombillas de la Marca A.

ud<-qnorm(0.1,mua,sigmaa);ud
[1] 13231.07

Por tanto, se determina el umbral de duración de una bombilla tal que, por debajo del cual esta se clasifica como deficiente de la Marca A. Este umbral es 13231.07.

El ejercicio nos pregunta la probabilidad de que una bombilla sea clasificada como deficiente de la Marca A siendo esta una bombilla incorrectamente clasificada de la Marca B. Esto es una probabilidad condicionada: \[P(D/I)\] Siendo:

-** \(D\): Bombilla de la Marca B clasificada como deficiente de la Marca A**

-** \(I\): Bombilla de la Marca B incorrectamente clasificada como de la Marca A**

Para resolverlo aplicamos la regla de Bayes: \[P(D/I)=\frac{P(D)P(I/D)}{P(I)}\]

De acuerdo con el enunciado se tiene que la probabilidad de que una bombilla de la Marca B sea clasificada como de la marca A es de 0.05. \[P(I)=0.05\] La siguiente probabilidad que debemos calcular es P(I/D). Esta es la probabilidad de que una bombilla de la Marca B sea clasificada erróneamente como de la Marca A, habiendo sido previamente clasificada como deficiente de la Marca A. Esta es del 100 % ya que en el enunciado nos asegura que se clasifica incorrectamente una bombilla de la Marca B. Por tanto, tenemos: \[P(I/D)=1\]

Por último, debemos averiguar cual es la probabilidad de que una bombilla B sea clasificada como deficiente de la Marca A, es decir P(D). Antes, hemos calculado que para que esto ocurra su duración ha de estar por debajo del umbral 13231.07 (ud).

PD<-pnorm(ud,mub,sigmab);PD
[1] 0.01351225

Por lo tanto, tenemos que: \[P(D)=0.01351229\] Finalmente, operamos:

PD*1/0.05
[1] 0.270245

\[P(D/I)=\frac{P(D)P(I/D)}{P(I)}=\frac{0.01351229\cdot1}{0.05}=0.2702459\] En consecuencia, la probabilidad de que una bombilla de la Marca B que se ha clasificado incorrectamente como Marca A sea clasificada como deficiente de la marca A es 0.2702459.

0.2702459*100
[1] 27.02459

Esta expresada en porcentaje sería del 27.02459 %

Gráficamente:

curve(dnorm(x,mua,sigmaa),xlim=c(11000,20000),col="blue",lwd="2",ylab="Funcion densidad",xlab="Duracion de la bombilla",main="Clasificaci?n de bombillas")
curve(dnorm(x,mub,sigmab),xlim=c(6500,20000),col="red",lwd= "2",add=T)
lt2<-seq(11000,ud,0.01)
polygon(c(lt2[lt2<ud],ud),c(dnorm(lt2[lt2<ud],mua,sigmaa),0),col="grey")
abline(v=ud,col="black",lwd=1)
lt<-seq(11000,uc,0.01)
polygon(c(lt[lt<uc],uc),c(dnorm(lt[lt<uc],mub,sigmab),0),col="yellow")
abline(v=uc,col="black",lwd=1)
polygon(c(lt[lt<ud],ud),c(dnorm(lt[lt<ud],mub,sigmab),0),col="green")
legend(x="topright",legend=c("Distribucion Marca A","Distribucion Marca b","Clasificada como A","Clasificada como deficiente de A","P(D/I)"),fill=c("blue","red","yellow","grey","green"))

LS0tDQp0aXRsZTogIiBDb2xlY2Npw7NuIGRlIGVqZXJjaWNpb3MgcGFyYSByZXNvbHZlciBkZSBmb3JtYSB0cmFkaWNpb25hbCBjb24gYXl1ZGEgZGUgUiB5IFJTdHVkaW8uIg0Kc3VidGl0bGU6ICJHcnVwbyAxMC4gTWFyY29zIEZsw7NyZXogRmVybsOhbmRleiwgSnVsaW8gR29uesOhbGV6IEVzY3VkZXJvLCBNYXJpbmEgTWFydMOtbmV6IEdvbnrDoWxleiwgTHVjw61hIE9qZXIgR3VlcnJhLCBSb2JlcnRvIFBhbmVybyBIb3osIFNlcmdpIFNvcyBMbHVjaC4iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KXA0KXA0KDQoqKkVKRVJDSUNJTyAxLiBNT0RFTE9TIERFIFJFR1JFU0nDk04gUEFSQSBMT1MgQ0FTT1MgQUNVTVVMQURPUyBERSBDT1ZJRC0xOSBFTiBSRUlOTyBVTklETyoqXA0KXA0KVW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gZXMgdW5hIGhlcnJhbWllbnRhIG1hdGVtw6F0aWNhIHF1ZSBub3MgYXl1ZGEgYSBkZXRlcm1pbmFyIHVuYSByZWxhY8Otb24gZW50cmUgdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlIGNvbiByZXNwZWN0byBhIG90cmFzIHZhcmlhYmxlcyBsbGFtYWRhcyBleHBsaWNhdGl2YXMgbyBpbmRlcGVuZGllbnRlcy4gRXN0b3MsIGEgbG8gbGFyZ28gZGUgbG9zIMO6bHRpbW9zIG1lc2VzLCBzZSBoYW4gcHVlc3RvIG11eSBkZSBtb2RhIGVuIGxvcyBub3RpY2lhcmlvcyB5IHBlcmnDs2RpY29zIGRlIHRvZG8gZWwgbXVuZG8sIHlhIHF1ZSBub3MgcGVybWl0ZSByZXByZXNlbnRhciB5IGVzdHVkaWFyIGxhIGV2b2x1Y2nDs24gZGVsIHZpcnVzIGVuIHVuIHBhw61zLCBlbiBvdHJhcyBwYWxhYnJhcywgaGFjZXIgdW4gc2VndWltaWVudG8geSBwcmVkaWNjaW9uZXMsIGFkZW3DoXMgZGUgcHJvcG9yY2lvbmFyIGdyw6FmaWNhcyBkZSAiZsOhY2lsIiBjb21wcmVuc2nDs24gcGFyYSBxdWUgbGEgZ2VudGUgYXByZW5kYSBjb21vIGZ1bmNpb25hLCBkZXNkZSB1biBwdW50byBkZSB2aXN0YSBtYXRlbcOhdGljbywgbGEgcHJvcGFnYWNpw7NuIGRlbCB2aXJ1cy4NCg0KRW4gbnVlc3RybyBjYXNvIGVzdHVkaWFyZW1vcyBsYSBldm9sdWNpw7NuIGRlIGxvcyBjYXNvcyBhY3VtdWxhZG9zIGRlIG51ZXZhcyBpbmZlY2Npb25lcyBxdWUgaGFuIG9jdXJyaWRvIGVuIFJlaW5vIFVuaWRvIChVSykuIA0KDQoqKkFwYXJ0YWRvIGEpKio6IE1vZGVsYXIgZWwgbsO6bWVybyBhY3VtdWxhZG8gZGUgcGVyc29uYXMgaW5mZWN0YWRhcyBtZWRpYW50ZSB1biBhanVzdGUgbGluZWFsLg0KXA0KUGFyYSBlbGxvLCByZWN1cnJpcmVtb3MgYSBsb3MgY29tYW5kbyBxdWUgUiBub3MgcHJvcG9yY2lvbmEuIEVtcGV6YXJlbW9zLCBsbyBwcmltZXJvIGRlIHRvZG8sIHBvciBpbnRyb2R1Y2lyIGxvcyBkYXRvcyBvZmljYWxlczogDQpcDQpgYGB7cn0NCmRheXM8LXJlYWQudGFibGUoIkFjdW1tdWxhdGl2ZURheXNVSyIpDQpOZXdDYXNlc1VLPC1yZWFkLnRhYmxlKCJOZXdDYXNlc1VLIixzZXA9Ii4iKQ0KDQpkYXlzPC1jKGRheXMkVjEpO2RheXMNCk5ld0Nhc2VzVUs8LWMoTmV3Q2FzZXNVSyRWMSk7TmV3Q2FzZXNVSw0KDQpgYGANClwNCkNvbW8gcG9kZW1vcyBvYnNlcnZhciwgbGEgcHJpbWVyYSBsaXN0YSBkZSBuw7ptZXJvcywgc2UgdHJhdGEgZGUgZWwgbsO6bWVybyBkZSBkw61hcyBxdWUgaGFuIHBhc2FkbyBkZXNkZSBlbCBkw61hIDEgY29ycmVzcG9uZGllbnRlIGNvbiAzMS8xLzIwMjAsIGN1YW5kbyBzZSBkZXRlY3TDsyBlbCBwcmltZXIgaW5mZWN0YWRvLiBMYSBzZWd1bmRhIGxpc3RhIHNlIGNvcnJlc3BvbmRlIGNvbiBlbCBuw7ptZXJvIGRlIG51ZXZvcyBpbmZlY3RhZG9zIGVuIGNhZGEgZMOtYSBkZXNkZSBlbCBkw61hIHVubyBoYXN0YSBob3kuDQpcDQpQYXJhIHZpc3VhbGl6YXJsbyBtZWpvciwgcmVwcmVzZW50YXJlbW9zIGVuIHVuYSBncsOhZmljYSBsb3MgcGljb3MgZGUgaW5mZWNjaW9uZXMgcG9yIGTDrWE6DQpcDQpgYGB7cn0NCnBsb3QoZGF5cyxOZXdDYXNlc1VLLHhsaW09YygwLDEwMCkseWxpbT1jKDAsNzAwMCkseWxhYj0iTnVtYmVyIG9mIENhc2VzIix4bGFiPSJEYXlzIHNpbmNlIDMxLTEtMjAiLCBtYWluPSJOZXcgQ2FzZXMgVUsiKQ0KbGluZXMoc3BsaW5lKGRheXMsTmV3Q2FzZXNVSyksbHdkPSIzIixjb2w9ImJsdWUiKQ0KYGBgDQpcDQpBaG9yYSB2YW1vcyBhIHJlYWxpemFyIGVsIGFqdXN0ZSBsaW5lYWwgZGUgbGEgc3VtYSBhY3VtdWxhZGEgcG9yIGTDrWEgZGUgbG9zIGRhdG9zIHJlcHJlc2VudGFkb3MgZW4gbGEgc2lndWVudGUgZ3LDoWZpY2E6DQpcDQpgYGB7cn0NCkFsbENhc2VzVUs8LWN1bXN1bShOZXdDYXNlc1VLKQ0KQWxsQ2FzZXNVSw0KYGBgDQpcDQpTaSBub3MgZmlqYW1vcywgaGFzdGEgZMOtYSBkZSBob3kgZWwgbsO6bWVybyB0b3RhbCBkZSBpbmZlY3RhZG9zIGVzIGRlIDE3NzQ4NS4NClwNCmBgYHtyfQ0KcGxvdChkYXlzLEFsbENhc2VzVUsseWxhYj0iTnVtYmVyIG9mIENhc2VzIix4bGFiPSJEYXlzIHNpbmNlIDMxLTEtMjAiLCBtYWluPSJOZXcgQ2FzZXMgVUsiKQ0KbGluZXMoc3BsaW5lKGRheXMsQWxsQ2FzZXNVSyksY29sPSJyZWQiLGx3ZD0iMyIpDQpgYGANClwNCkxvIHF1ZSBidXNjYW1vcyBlcyBtaW5pbWl6YXIgZWwgZXJyb3IgY3VhZHLDoXRpY28gbWVkaW8gZGUgbG9zIHB1bnRvcyBkZSBlc3RhIGdyw6FmaWNhIHkgbW9kZWxhcmxvIG1lZGlhbnRlIGxhIGV4cHJlc2nDs24gZGUgdW5hIHJlY3RhIGRlIHJlZ3Jlc2nDs246DQokJHk9YStieCQkDQpcDQpQYXJhIGVsbG8gdXNhcmVtb3MgcHJpbmNpcGFsbWVudGUgZWwgY29tYW5kbyAibGluZWFsIG1vZGVsIiBvIGxtKCkgZGUgUiB5IGxhcyBoZXJyYW1pZW50YXMgcXVlIG5vcyBwcm9wb3JjaW9uYSBwYXJhIG9idGVuZXIgbG9zIHBhcsOhbWV0cm9zICRhJCB5ICRiJDoNClwNCmBgYHtyfQ0KTGluZWFsTW9kZWw8LWxtKEFsbENhc2VzVUt+ZGF5cykNCnN1bW1hcnkoTGluZWFsTW9kZWwpDQpgYGANClwNCkhlbW9zIHVzYWRvIGVsIGNvbWFuZG8gc3VtbWFyeSgpIHBhcmEgbW9zdHJhciBhbGd1bm9zIGRhdG9zIGFwYXJ0ZSBkZSBsb3MgcGFyw6FtZXRyb3MgJGEkIHkgJGIkIHF1ZSB0YW1iacOpbiBzb24gZGUgaW50ZXLDqXMuIE3DoXMgY29uY3JldGFtZW50ZSBub3MgcmVmZXJpbW9zIGEgIk11bHRpcGxlIFItc3F1YXJlZCIsIGxvIGN1YWwgbm9zIGRhIGVsIGNvZWZpY2llbnRlIGRlIGRldGVybWluYWNpw7NuIChuw7ptZXJvIGNvbXByZW5kaWRvIGVudHJlIDAgeSAxIHF1ZSBkZSB1bmEgZm9ybWEgZ2VuZXJhbCBub3MgZGljZSBjb21vIGRlIGJ1ZW5vIGVzIGVsIGFqdXN0ZSksIHF1ZSBlbiBlc3RlIGNhc28gZXMgZGUgMC43MTQ1LiBEYWRvIHF1ZSBubyBzdXBlcmEgZWwgMC44LCBkZXNncmFjaWFkYW1lbnRlLCBubyBwb2RlbW9zIGRlY2lyIHF1ZSBub3MgZW5jb250cmFtb3MgYW50ZSB1biBidWVuIGFqdXN0ZSBlbiByZWxhY2nDs24gYWwgY29uanVudG8gZGUgZGF0b3MgcHJvcG9yY2lvbmFkby4gRXN0byBzZSBkZWJlIGEgcXVlIGVuIGVsIGludGVydmFsbyBkZSB0aWVtcG8gcXVlIGhlbW9zIHJlcHJlc2VudGFkbywgZWwgY3JlY2ltaWVudG8geSBleHBhbnNpw7NuIGRlbCB2aXJ1cyBhdW1lbnRhIGRyw6FzdGljYW1lbnRlIGVudHJlIGxvcyA0MCB5IDYwIGRpYXMsIHBlcmRpZW5kbyBsYSBmb3JtYSBsaW5lYWwgZW4gY3VhbnRvIGFsIGF1bWVudG8gZGUgY2Fzb3MuDQoNCkEgY29udGludWFjacOzbiBoYXJlbW9zIHVzbyBkZSBsb3MgY29tYW5kb3MgZGUgcmVwcmVzZW50YWNpw7NuIGdyw6FmaWNhIGRlIFIgcGFyYSBtb3N0cmFyIGxhIHNpZ3VpZW50ZSByZWN0YTpcDQpcDQokJHk9LTQ2MjgwKzE4NDB4JCQNClwNCmBgYHtyfQ0KeGFqPC1zZXEoMC4wMDUsMTAwLDAuMDAxKQ0KcGxvdChkYXlzLEFsbENhc2VzVUsseWxhYj0iTnVtYmVyIG9mIENhc2VzIix4bGFiPSJEYXlzIHNpbmNlIDMxLTEtMjAiLCBtYWluPSJUb3RhbCBDYXNlcyBVSyIpDQphYmxpbmUoTGluZWFsTW9kZWwsIGNvbD0ib3JhbmdlIixsd2Q9IjMiKQ0KYGBgDQpcDQpcDQoqKkFwYXJ0YWRvIGIpKio6IE1vZGVsYXIgZWwgbsO6bWVybyBhY3VtdWxhZG8gZGUgcGVyc29uYXMgaW5mZWN0YWRhcyBtZWRpYW50ZSB1biBhanVzdGUgbm8gbGluZWFsIGRlIGxvcyBwcmVzZW50YWRvcyBlbiBsYXMgdHJhbnNwYXJlbmNpYXMgdGXDs3JpY2FzIGRlIGxhIGFzaWduYXR1cmEuDQpcDQpcDQpQYXJhIGVzdGUgYXBhcnRhZG8gaGVtb3MgZWxlZ2lkbyBlbCBtb2RlbG8gZXhwb25lbmNpYWwsIGFsIGN1YWwgaGF5IHF1ZSBhcGxpY2FybGUgdW4gY2FtYmlvIGRlIHZhcmlhYmxlIHBhcmEgbGluZWFsaXphcmxvLCBvYnRlbmVyIGxvcyBwYXLDoW1ldHJvcyBjb3JyZXNwb25kaWVudGVzIHkgcG9yIMO6bHRpbW8gZGVzaGFjZXIgZWwgY2FtYmlvIHBhcmEgcG9kZXIgcmVwcmVzZW50YXIgZWwgZ3JhZm8uIEEgY29udGludWFjacOzbiwgbGEgbWFuaXB1bGFjacOzbiBhbGdlYnJhaWNhIGRlbCBtb2RlbG8gZWxlZ2lkbzoNClwNCiQkDQpcYmVnaW57YWxpZ24qfQ0KeSY9XGFscGhhIGVee1xiZXRhIHh9XFwNClxcDQpsb2coeSkmPWxvZyhcYWxwaGEpK1xiZXRhIHhcXA0KXFwNClomPUErQngNClxlbmR7YWxpZ24qfQ0KJCQNCiQkWj1sb2coeSk7XCBBPWxvZyhcYWxwaGEpO1wgQj1cYmV0YSAkJA0KXA0KQ29uIGxhIGZvcm1hIGRlIGVzdGEgcmVjdGEgYXZlcmlndWFyZW1vcyBsb3MgcGFyw6FtZXRyb3MgJFxhbHBoYSQgeSAkXGJldGEkIHByb2NlZGllbmRvIGRlIGxhIG1pc21hIG1hbmVyYSBxdWUgZW4gZWwgYXBhcnRhZG8gYW50ZXJpb3IgY29uIGxvcyBjb21hbmRvcyBkZSBSLiBMYSBkaWZlcmVuY2lhIGVzIHF1ZSBhaG9yYSB0ZW5kcmVtb3MgcXVlIHRyYW5zZm9ybWFyIGxvcyB2YWxvcmVzIGRlICR5JCBwYXJhIGxhIG51ZXZhIHZhcmlhYmxlICRaJDoNClwNCmBgYHtyfQ0KWjwtbG9nKEFsbENhc2VzVUspO1oNCmBgYA0KYGBge3J9DQpjb3IoWixkYXlzKSoqMg0KYGBgDQpcDQpDb21vIHBvZGVtb3MgY29tcHJvYmFyLCBlbCBjb2VmaWNpZW50ZSBkZSBkZXRlcm1pbmFjacOzbiBkZSBlc3RlIGNvbmp1bnRvIGRlIGRhdG9zLCBlcyBiYXN0YW50ZSBtZWpvciBxdWUgZW4gZWwgY2FzbyBkZWwgYWp1c3RlIG1lZGlhbnRlIGxhIHJlY3RhIGRlIHJlZ3Jlc2nDs24uDQpcDQpgYGB7cn0NCkV4cE1vZGVsPC1sbShafmRheXMpDQpzdW1tYXJ5KEV4cE1vZGVsKQ0KYGBgDQpcDQpUcmFzIGhhYmVyIHJlYWxpemFkbyBlbCAibGluZWFyIG1vZGVsIiBkZSBsb3MgZGF0b3MgWiBzb2JyZSAiZGF5cyIgKGRhdG9zIGRlbCBlamUgeCksIG9idGVuZW1vcyBsb3MgdmFsb3JlcyBkZSBsb3MgcGFyw6FtZXRyb3MgZGVsIGFqdXN0ZSBsaW5lYWwsIGFob3JhIHRvY2EgZGVzaGFjZXIgZWwgY2FtYmlvOg0KXA0KJCRcYWxwaGE9ZV5BO1wgXGJldGE9QiAkJA0KXA0KYGBge3J9DQpBPC1FeHBNb2RlbDEkY29lZmZpY2llbnRzWzFdDQpiPC1FeHBNb2RlbDEkY29lZmZpY2llbnRzWzJdDQphPC1leHAoQSkNCmENCmINCmBgYA0KXA0KQ29uIGVzdG9zIHZhbG9yZXMgcGFyYSBsb3MgcGFyw6FtZXRyb3MgJFxhbHBoYSQgeSAkXGJldGEkIHJlc3BlY3RpdmFtZW50ZSBkaWJ1amFyZW1vcyBsYSBzaWd1aWVudGUgZnVuY2nDs246DQpcDQokJHk9MS4wMzUxMjMgZV57MC4xNDk2MDA3fSQkDQpcDQpgYGB7cn0NCnhhajwteGFqPC1zZXEoMC4wMDUsMTAwLDAuMDAxKQ0KeWFqPC1hKmV4cChiKnhhaikNCnBsb3QoZGF5cyxBbGxDYXNlc1VLLHlsYWI9Ik51bWJlciBvZiBDYXNlcyIseGxhYj0iRGF5cyBzaW5jZSAzMS0xLTIwIiwgbWFpbj0iVG90YWwgQ2FzZXMgVUsiKQ0KbGluZXMoc3BsaW5lKHhhaix5YWopLGNvbD0iYmx1ZSIsbHdkPSI0IikNCmBgYA0KXA0KTG8gcXVlIHBvZGVtb3Mgb2JzZXJ2YXIgZW4gZXN0ZSBhanVzdGUgZXMgYmFzdGFudGUgZ3LDoWZpY28uIExhIGZ1bmNpw7NuIGV4cG9uZW5jaWFsIHNlIGFqdXN0YSBtdWNobyBtZWpvciBxdWUgbGEgcmVjdGEgKHNvYnJldG9kbyBlbiBsb3MgNTAgcHJpbWVyb3MgZGlhcyksIHBlcm8gYcO6biBhc8OtLCBkZXNwdcOpcywgaGF5IG11Y2hhIGRpc3BhcmlkYWQgZW50cmUgbG9zIHZhbG9yZXMgcmVhbGVzIHkgbG9zIHF1ZSBsYSBmdW5jacOzbiBub3MgZGEsIHlhIHF1ZSBlc3RhIGNyZWNlIG11Y2hvIG3DoXMgcsOhcGlkbyBxdWUgZWwgbsO6bWVybyBkZSBpbmZlY3RhZG9zLg0KXA0KXA0KKipBcGFydGFkbyBjKSoqOiBNZWpvcmFyIGRpY2hvIGFqdXN0ZSBtZWRpYW50ZSB0w6ljbmljYXMgZGUgbcOtbmltb3MgY3VhZHJhZG9zIG5vIGxpbmVhbGVzLg0KXA0KXA0KTGFzIHTDqWNuaWNhcyBkZSBtw61uaW1vcyBjdWFkcmFkb3Mgbm8gbGluZWFsZXMgcXVlIHlhIGhlbW9zIGlkbyBwcmVzZW50YW5kbyBlbiBsb3MgZG9zIGFwYXJ0YWRvcyBhbnRlcmlvcmVzIHNvbiwgYSAiZ3Jvc3NvIG1vZG8iLCB1biBwcm9ibGVtYSBkZSBvcHRpbWl6YWNpw7NuIG11eSBjb21wbGVqby4gU2UgdHJhdGEgZGUgYXByb3hpbWFyIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGRlIGZvcm1hIGxpbmVhbCB5IGRlc3B1w6lzLCByZWZpbmFyIGxvcyBwYXLDoW1ldHJvcyBtZWRpYW50ZSBtw6l0b2RvcyBpdGVyYXRpdm9zOg0KXA0KJCQNClxtaW5fe1x0aGV0YX0gU1IoXGhhdHtcdGhldGF9KT0NClxtaW5fe1x0aGV0YX1cc3VtX3t0PTF9XntUfVxoYXR7dV90fShcaGF0e1x0aGV0YX0pPQ0KXG1pbl97XHRoZXRhfVxzdW1fe3Q9MX1ee1R9W3lfdC1mKHhfdCxcYmV0YSldXjINCiQkDQpcDQpsbyBxdWUgaW1wbGljYSByZXNvbHZlciBlbCBzaXN0ZW1hIGRlIGVjdWFjaW9uZXMsDQpcDQokJA0KXGxlZnQoDQpcZGZyYWN7XHBhcnRpYWwgZih4X3QsXGJldGEpfXtccGFydGlhbCBcYmV0YX0NClxyaWdodClee8K0fXk9DQpcbGVmdCgNClxkZnJhY3tccGFydGlhbCBmKHhfdCxcYmV0YSl9e1xwYXJ0aWFsIFxiZXRhfQ0KXHJpZ2h0KV57J31mKFgsXGJldGEpDQokJA0KXA0KZG9uZGUgZWwgdmVjdG9yIGdyYWRpZW50ZSBlcyAkVHhrJCwgeSAkZihYLFxiZXRhKSQgZXMgJFRrMSQuIEVzdGUgc2lzdGVtYSBwdWVkZSBubyB0ZW5lciBzb2x1Y2nDs24gbyB0ZW5lciBtw7psdGlwbGVzIHNvbHVjaW9uZXMuIEEgZGlmZXJlbmNpYSBkZWwgZXN0aW1hZG9yIGRlIE3DrW5pbW9zIEN1YWRyYWRvcyBhcGxpY2FkbyBhIHVuIG1vZGVsbyBsaW5lYWwsIGVsIGVzdGltYWRvciAqbm8qIGVzIGluc2VzZ2Fkby4gTGEgbWF0cml6IGRlIGNvdmFyaWFuemFzIGRlbCBlc3RpbWFkb3IgcmVzdWx0YW50ZSBlczoNClwNCiQkDQpWYXIoXGhhdHtcdGhldGF9KSA9IA0KXHNpZ21hXnsyfV97dX0NClxsZWZ0Ww0KXGxlZnQoDQpcZGZyYWN7XHBhcnRpYWwgZih4X3QsXGJldGEpfXtccGFydGlhbCBcYmV0YX0NClxyaWdodClee8K0fQ0KXGxlZnQoDQpcZGZyYWN7XHBhcnRpYWwgZih4X3QsXGJldGEpfXtccGFydGlhbCBcYmV0YX0NClxyaWdodCkNClxyaWdodF1eey0xfQ0KJCQNClwNCnF1ZSBzZSByZWR1Y2UgYSBsYSBtYXRyaXogZGUgY292YXJpYW56YXMgJFxzaWdtYV57Mn1fe3V9KFheeyd9WCleLTEkIGVuIGVsIGNhc28gZGUgdW4gbW9kZWxvIGxpbmVhbC4NClNpIHF1aXNpw6lyYW1vcyBhcGxpY2FyIE1pbmltb3MgQ3VhZHJhZG9zIGRpcmVjdGFtZW50ZSwgZW4gZWwgbW9kZWxvIGV4cG9uZW5jaWFsLA0KXA0KJCQNCnlfdD0NCmYoeF90LFx0aGV0YSkrdV90PQ0KXGFscGhhICsgXGJldGFfMWVee1xiZXRhX3syfXhfdH0gKyB1X3QNCiQkDQpcDQpjb24gJFx0aGV0YSA9IChcYWxwaGEsXGJldGFfMSxcYmV0YV8yKSQsIHRlbmRyw61hbW9zIHF1ZSByZXNvbHZlciBlbCBwcm9ibGVtYSwgIA0KJCQNClxtaW5fe1x0aGV0YX0gU1IoXGhhdHtcdGhldGF9KT0NClxtaW5fe1x0aGV0YX1cc3VtX3t0PTF9XntUfQ0KXGxlZnRbDQpcaGF0e3VfdH0oXGhhdHtcdGhldGF9KQ0KXHJpZ2h0XV4yPQ0KXG1pbl97XHRoZXRhfVxzdW1fe3Q9MX1ee1R9W3lfdC0oXGFscGhhICsgXGJldGFfMWVee1xiZXRhX3syfXhfdH0pXV4yDQokJA0KXA0KcXVlIGNvbmR1Y2UgYSBsYXMgY29uZGljaW9uZXMgZGUgb3B0aW1hbGlkYWQsDQpcDQokJA0KXGJlZ2lue2FsaWduKn0NClxzdW0geV90ICY9IFxhbHBoYSBUICsgXGJldGFfMSBcc3VtIGVee1xiZXRhXzIgeF90fVxcDQpcc3VtIHlfdGVee1xiZXRhXzIgeF90fSAmPSBcYWxwaGFcc3VtIGVee1xiZXRhXzIgeF90fStcYmV0YV8xXHN1bSBlXnsyXGJldGFfMiB4X3R9XFwNClxzdW0geV90eF90ZV57XGJldGFfMiB4X3R9ICY9IFxhbHBoYVxzdW0geF90ZV57MlxiZXRhXzIgeF90fStcYmV0YV8xXHN1bSB4X3RlXnsyXGJldGFfMiB4X3R9XFwNClxlbmR7YWxpZ24qfQ0KJCQNClwNCnF1ZSBjYXJlY2UgZGUgc29sdWNpb24gZXhwbMOtY2l0YSwgcG9yIGxvIHF1ZSBkZWJlIHJlc29sdmVyc2UgcG9yIHByb2NlZGltaWVudG9zIG51bcOpcmljb3MuDQpcDQpcDQpQYXJhIGhhY2VyIGVzdG8gZW4gUnN0dWRpbywgdXNhcmVtb3MgZWwgY29tYW5kbyBubHMgKCJOb25saW5lYWwgTGVhc3QgU3F1YXJlcyIpLCBxdWUgbm9zIGFnaWxpemFyw6EgZXN0ZSBwb2Nlc28uIEVsIGNvbWFuZG8gcHJlY2lzYSBkZSB1bmEgZWN1YWNpw7NuIChlbCBtb2RlbG8gZXhwb25lbmNpYWwgYW50ZXJpb3IpIHkgdW4gZ8Opcm1lbiBpbmljaWFsIHBhcmEgY2FkYSBwYXLDoW1ldHJvLiBFc3RvcyBzaWVtcHJlIHNvbiBtdXkgZGlmw61jaWxlcyBkZSBlbmNvbnRyYXIsIHBlcm8gcG9yIHN1ZXJ0ZSwgeWEgdGVuZW1vcyBkb3MgbXV5IGJ1ZW5vcywgbG9zIHZhbG9yZXMgZGUgJFxhbHBoYSQgeSAkXGJldGEkIGRlbCBhbnRlcmlvciBhcGFydGFkby5cDQpcDQokJEE9XGFscGhhID0gMS4wMzUxMjM7IEI9XGJldGEgPSAwLjE0OTYwMDcgJCQNClwNCmBgYHtyfQ0KTkxTPC1ubHMoQWxsQ2FzZXNVS35BKmV4cChCKmRheXMpLHN0YXJ0PWxpc3QoQT1hLEI9YikpDQpzdW1tYXJ5KE5MUykNCmBgYA0KXA0KQ29tbyBwb2RlbW9zIG9ic2VydmFyIGVuIGVsIHN1bW1hcnksIGxvcyBwYXLDoW1ldHJvcyBoYW4gY2FtYmlhZG8geSBzZSBoYW4gcmVhbGl6YWRvIDI0IGl0ZXJhY2lvbmVzIHBhcmEgbG9ncmFybG8uIFZhbW9zIGEgcmVwcmVzZW50YXIgbGEgZ3LDoWZpY2EgY29uIGxvcyBudWV2b3MgcGFyw6FtZXRyb3MgcGFyYSBjb21wcm9iYXIgY3XDoW50byBoYSBtZWpvcmFkbyBlbCBhanVzdGU6DQpcDQpgYGB7cn0NCkE8LXN1bW1hcnkoTkxTKSRjb2VmZmljaWVudHNbMV07QQ0KQjwtc3VtbWFyeShOTFMpJGNvZWZmaWNpZW50c1syXTtCDQpgYGANClwNCiQkeT0xMzgxLjI5NCBlXnswLjA1NDI5MzczfSQkDQpcDQpgYGB7cn0NCnhhajwteGFqPC1zZXEoMC4wMDUsMTAwLDAuMDAxKQ0KeWFqPC1BKmV4cChCKnhhaikNCnBsb3QoZGF5cyxBbGxDYXNlc1VLLHlsYWI9Ik51bWJlciBvZiBDYXNlcyIseGxhYj0iRGF5cyBzaW5jZSAzMS0xLTIwIiwgbWFpbj0iVG90YWwgQ2FzZXMgVUsiKQ0KbGluZXMoc3BsaW5lKHhhaix5YWopLGNvbD0iZ3JlZW4iLGx3ZD0iNCIpDQpgYGANClwNCkNhYmUgZGVzdGFjYXIgcXVlIGVsIGNhbWJpbyBlcyBtdXkgZ3JhbmRlLiBMYSBudWV2YSBmdW5jacOzbiBzZSBhanVzdGEgbXVjaG8gbWVqb3IgZGUgZm9ybWEgZ2VuZXJhbCBhIGxvcyBkYXRvcywgZGVqYW5kbyBhdHLDoXMgbGEgZ3JhbiBkaXNwYXJpZGFkIHF1ZSBtb3N0cmFiYSBlbCBhanVzdGUgZGVsIGFwYXJ0YWRvIGFudGVyaW9yLg0KXA0KXA0KKipBcGFydGFkbyBkKSoqOiBtb2RlbGFyIGVsIG7Dum1lcm8gYWN1bXVsYWRvIGRlIHBlcnNvbmFzIGluZmVjdGFkYXMgbWVkaWFudGUgdW4gYWp1c3RlIG5vIGxpbmVhbCBkZSB0aXBvIGFzaW50w7N0aWNvIG3DoXMgcmVhbGlzdGEgcXVlIGxvcyBhbnRlcmlvcmVzLg0KXA0KXA0KUGFyYSBlc3RlIGFwYXJ0YWRvIGhlbW9zIGRlY2lkaWRvIHVzYXIgbGEgKioiRnVuY2nDs24gZGUgR29tcGVydHoiKiouIEVzdGEgZnVuY2nDs24gZXMgdW4gdGlwbyBkZSBtb2RlbG8gbWF0ZW3DoXRpY28gcGFyYSB1bmEgc2VyaWUgdGVtcG9yYWwgeSBsbGV2YSBlbCBub21icmUgZGUgKkJlbmphbWluIEdvbXBlcnR6Ki4gRXMgdW5hIGZ1bmNpw7NuICpzaWdtb2lkZWEqIHF1ZSBkZXNjcmliZSB1biBjcmVjaW1pZW50byBsZW50byBhbCBjb21pZW56byB5IGVsIGNyZWNpbWllbnRvIGRlbCBmaW5hbCBkZSB1biBwZXJpb2RvIGRlIHRpZW1wbyBkYWRvLiBMYXMgZnVuY2lvbmVzIGVuIGJhc2UgYSBlc3RlIG1vZGVsbywgc29uIGluaWNpYWxtZW50ZSBjw7NuY2F2YXMgeSwgdHJhcyBwYXNhciBlbCBwdW50byBkZSBpbmZsZXhpw7NuLCBjb252ZXhhcywgY29ub2NpZGFzIHRhbWJpw6luIGNvbW8gY3VydmFzIGVuIGZvcm1hIGRlIFMuICpCZW5qYW1pbiBHb21wZXJ0eiogdXRpbGl6w7MgbGEgY3VydmEgcGFyYSBkZXNjcmliaXIgbGEgbGV5IGRlIGxhIG5hdHVyYWxlemEgcXVlIHJpZ2UgbGEgbW9ydGFsaWRhZCBodW1hbmEuXA0KXA0KRXhpc3RlbiBkaWZlcmVudGVzIHRpcG9zIGRlIGN1cnZhcyBHb21wZXJ0eiBlbiBmdW5jacOzbiBkZSBsb3MgcGFyw6FtZXRyb3MgcXVlIGxhIGNvbXBvbmVuLCBwZXJvIHRvZGFzIHRpZW5lbiB1bmEgZG9ibGUgZXhwb25lbmNpYWwgY29tbyBlbGVtZW50byBjYXJhY3RlcsOtc3Rpc3RpY28gY29tw7puLlwNClwNCipCZW5qYW1pbiBHb21wZXJ0eiogaW50cm9kdWNlIGVzdGEgY3VydmEgZW4gc3UgbGlicm8gKuKAnE9uIHRoZSBOYXR1cmUgb2YgdGhlIEZ1bmN0aW9uIEV4cHJlc3NpdmUgb2YgdGhlIExhdyBvZiBIdW1hbiBNb3J0YWxpdHksIGFuZCBvbiBhIE5ldyBNb2RlIG9mIERldGVybWluaW5nIHRoZSBWYWx1ZSBvZiBMaWZlIENvbnRpbmdlbmNpZXPigJ0qLiBQYXJhIGVsbG8gcG9zdHVsYSBxdWUgbG9zIGluY3JlbWVudG9zDQpcDQokJExvZyhuKS1Mb2cobittKSxcIExvZyhuK20pLUxvZyhuKzJtKSxcIGV0YyQkDQpcDQpzb24gY29uc3RhbnRlcywgc2llbmRvICRMb2cobitrbSkkIGVsIGxvZ2FyaXRtbyBkZSBsYSBwb2JsYWNpw7NuIGVuIGVsIGluc3RhbnRlICRuK2ttJCwgc2llbmRvIGluZGljaW8gZGUgZW5jb250cmFybm9zIGFudGUgdW4gY3JlY2ltaWVudG8gZ2VvbcOpdHJpY28uXA0KXA0KTGEgZnVuY2nDs24gcXVlIGFwYXJlY2UgZW4gbGlicm8gcHJldmlhbWVudGUgY2l0YWRvLCBzZSBleHByZXNhIGNvbW86XA0KJCRMX3g9ZGdee3Fee3h9fSwgX3tFYzF9JCQNCmRvbmRlDQpcDQoNCiQkMVwgXCBsb2coZyk9XGRmcmFje21xXnstYX19ezEtcV57cn19JCQNCg0KJCQyXCBcIHEgPSBwXntcZGZyYWN7MX17cn19JCQNCg0KJCQzXCBcIG09bG9nKExfYSktbG9nKExfe2Ercn0pJCQNCg0KJCQ0XCBcIGQ9XGRmcmFje0xfYX17XHhpfSQkDQoNCiQkNVwgXCBsb2coXHhpKT1cZGZyYWN7bX17MS1xXntyfX0kJA0KXA0KXA0KRWwgdmFsb3IgZGUgKiphKiogZGVub3RhIGVsIGluc3RhbnRlIGluaWNpYWwsIGVsIGRlICoqcioqIGxhIHVuaWRhZCBkZSBzYWx0byBjb25zaWRlcmFkYSBlbiBlbCB0aWVtcG8geSAqKnAqKiBlcyBsYSByYXrDs24gZGUgbGEgcHJvZ3Jlc2nDs24gZ2VvbcOpdHJpY2EgcXVlIGRlZmluZSBlbCBuw7ptZXJvIGRlIHBlcnNvbmFzIHZpdmFzIGVuIGVsIHRpZW1wbyB4LlwNClwNCkxhIGN1cnZhIEdvbXBlcnR6IGZ1ZSBvYmpldG8gZGUgaW50ZXLDqXMgZW4gY2llbmNpYXMgYWN0dWFyaWFsZXMsIHBlcm8gY29uIGVsIHBhc28gZGVsIHRpZW1wbyBzdSBhcGxpY2FjacOzbiBzZSB0cmFzbGFkw7MgdGFtYmnDqW4gYSBvdHJvcyBjYW1wb3MgY29tbyBsYSBCaW9sb2fDrWEgbyBsYSBFY29ub23DrWEuICpQLiBXaW5zb3IqLCBtb3RpdmFkbyBwb3IgbGFzIGRpZmVyZW50ZXMgYXBsaWNhY2lvbmVzIGRlIGxvcyBtb2RlbG9zIEdvbXBlcnR6LCByZWFsaXrDsyBlbiB1biBlc3R1ZGlvIGNvbXBhcmF0aXZvIGVudHJlIHVuIG1vZGVsbyBkZSBHb21wZXJ0eiB5IG90cm8gZGUgVmVyaHVsc3QuIFBhcmEgZWxsbyByZWVzY3JpYmnDsyAqIkVjMSIqIGPDs21vOlwNCiQkWSA9IEtlXnstZV57YS1ieH19LFwgaz4wLFwgYj4wJCQNClwNCmRlZHVjaWVuZG9zZSBxdWUgJGxpbV97eFxyaWdodGFycm93XGluZnR5fXk9SyQgeSAkbGltX3t4XHJpZ2h0YXJyb3ctXGluZnR5fVk9MCQuIEEgcGFydGlyIGRlIGVzdGEgZXhwcmVzacOzbiwgc2Ugb2J0aWVuZSBsYSBlY3VhY2nDs24gZGlmZXJlbmNpYWwgDQpcDQokJFxkZnJhY3tccGFydGlhbCBZfXtccGFydGlhbCB4fT1ieWVee2EtYnh9JCQNClwNCmRvbmRlIHRhbWJpw6luIHNlIGRlZHVjZSBxdWUgbGEgcGVuZGllbnRlIGRlICRZKHgpJCBlcyBzaWVtcHJlIHBvc2l0aXZhIHBhcmEgdmFsb3JlcyBmaW5pdG9zIGRlICR4JCwgdGVuZGllbmRvIGEgMCBjdWFuZG8gbGEgJHgkIHRpZW5kZSBhICQrXGluZnR5JC4gQnVzY2FuZG8gZWwgcHVudG8gZGUgaW5mbGV4acOzbiBkZSBsYSBjdXJ2YSBzZSBsbGVnYSBhIGxhIGV4cHJlc2nDs24gDQpcDQokJFxkZnJhY3tccGFydGlhbF4yIHl9e1xwYXJ0aWFsIHheMn09IGJeMnllXnthLWJ4fShlXnthLWJ4fS0xKSQkDQpcDQpkZSBkb25kZSBzZSBleHRyYWUgcXVlIGVzdMOhIHNpdHVhZG8gZW4gJFxsZWZ0KFxkZnJhY3thfXtifSxcZGZyYWN7a317ZX1ccmlnaHQpJCwgYWxjYW56YW5kbyBhcHJveGltYWRhbWVudGUgZW4gZWwgMzYsNzglIGRlbCBjcmVjaW1pZW50byB0b3RhbC5cDQpcDQpDb24gZXN0byB5YSBwb2RlbW9zIGNhbGN1bGFyIHVuYSBhcHJveGltYWNpw7NuIGRlIG51ZXN0cm8gbW9kZWxvIHBhcmEgbG9zIGRhdG9zIHF1ZSB0ZW5lbW9zLiBWYW1vcyBhIHZvbHZlciBhIHBsYW50ZWFybG9zOg0KXA0KYGBge3J9DQpwbG90KGRheXMsQWxsQ2FzZXNVSyx5bGFiPSJOdW1iZXIgb2YgQ2FzZXMiLHhsYWI9IkRheXMgc2luY2UgMzEtMS0yMCIsIG1haW49IlRvdGFsIENhc2VzIFVLIikNCg0KYGBgDQpcDQpEYWRvIHF1ZSBlbCBuw7ptZXJvIGRlIGNhc29zIGFjdW11bGFkb3Mgbm8gcHJlc2VudGEgdW4gY29tcG9ydGFtaWVudG8gZGVjcmVjaWVudGUgYSBzaW1wbGUgdmlzdGEsIHRvbWFyw6kgY29tbyBwdW50byBkZSBpbmZsZXhpw7NuIGVsIMO6bHRpbW8gZGF0byByZWdpc3RyYWRvLg0KXA0KYGBge3J9DQpBbGxDYXNlc1VLDQpgYGANClwNCkTDrWEgOTMsIGNvbiB1biB0b3RhbCBkZSAxODY2MzUgaW5mZWN0YWRvcy4gTG8gc2lndWllbnRlIHNlcsOhIHNhY2FyIHVub3MgdmFsb3JlcyBkZSBsb3MgcMOhcmFtZXRyb3MgcXVlIG5lY2VzaXRhbW9zIHBhcmE6XA0KXA0KJCRZID0gS2Veey1lXnthLWJ4fX0kJA0KRGFkbyBxdWUsIGNvbW8gaGVtb3MgbWVuY2lvbmFkbyBhbnRlcywgZW4gZWwgcHVudG8gZGUgaW5mbGV4acOzbiBkZSBlc3RhIGZ1bmNpw7NuIHNlIGN1bXBsZTpcDQpcDQokJA0KXGxlZnQuDQp4PVxkZnJhY3thfXtifSBcYXRvcA0KeT1cZGZyYWN7a317ZX0NClxyaWdodFx9DQokJA0KXA0KQ29nZXJlbW9zIGVsIHB1bnRvICg5MywxODY2MzUpIHBhcmEgYXZlcmlndWFyIGxvcyB2YWxvcmVzOg0KXA0KJCQNClxsZWZ0Lg0KeD1cZGZyYWN7YX17Yn0gXGF0b3ANCnk9XGRmcmFje2t9e2V9DQpccmlnaHRcfQ0KXGxlZnQuDQo5MyBcYXBwcm94XGRmcmFje2F9e2J9IFxhdG9wDQoxODY2MzUgXGFwcHJveFxkZnJhY3trfXtlfQ0KXHJpZ2h0XH0NClxsZWZ0Lg0KXGJlZ2lue2FycmF5fXtyY2x9DQphID0gOS4zXFwNCmIgPSAwLjFcXA0KayA9IDE4NjYzNWUNClxlbmR7YXJyYXl9DQpccmlnaHRcfQ0KJCQNClwNCkNvbiBlc3RvcyBkYXRvcyB5YSBwb2RlbW9zIHRyYWJhamFyIGNvbiBlbCBjb21hbmRvIG5scy4gVXNhcmVtb3MgZW50b25jZXMgbG9zIHZhbG9yZXMgZGUgYSwgYiB5IGsgY29tbyBnw6lybWVuZXMgaW5pY2lhbGVzOg0KXA0KYGBge3J9DQpHb21wZXJ0ejwtbmxzKEFsbENhc2VzVUt+aypleHAoLWV4cChhLWIqZGF5cykpLHN0YXI9bGlzdChhPTkuMyxiPTAuMSxrPTUwNzMyNi41MjkxKSxjb250cm9sPW5scy5jb250cm9sKG1pbkZhY3Rvcj0yXi0yNCwgbWF4aXRlcj0yMDApKQ0Kc3VtbWFyeShHb21wZXJ0eikNCmBgYA0KXA0KQWwgcHJpbmNpcGlvIGhlbW9zIHRlbmlkbyBhbGfDum4gcHJvYmxlbWEgY29uIGxvcyBwYXLDoW1ldHJvcyBpbmljaWFsZXMgeWEgcXVlIGVuIGxhcyBpdGVyYWNpb25lcyBlc3RhYmxlY2lkYXMgcG9yIGRlZmVjdG8gKHVuYXMgNTApLCBlbCBtw6l0b2RvIG5vIGxvZ3JhYmEgYWxjYW56YXIgbGEgdG9sZXJhbmNpYSBlc3RhYmxlY2lkYS4gUGFyYSBlbGxvIGhlbW9zIHRlbmlkbyBxdWUgYcOxYWRpciB1biAqKiJubHMuY29udHJvbCIqKiBwYXJhIHNvbHVjaW9uYXJsby4gQ29tbyBwb2RlbW9zIG9ic2VydmFyIGVuIHN1bW1hcnksIGVsIG3DqXRvZG8gY29udmVyZ2UgdHJhcyAxNTkgaXRlcmFjaW9uZXMsIHByb3BvcmNpb27DoW5kb25vcyB1bmEgYnVlbmEgYXByb3hpbWFjacOzbi5cDQpcDQpBIGNvbnRpbnVhY2nDs24gdmFtb3MgYSBjYXJnYXIgbG9zIHZhbG9yZXMgZW4gdW5hcyB2YXJpYWJsZXMgcGFyYSByZXByZXNlbnRhciBsYSBncsOhZmljYS4NClwNCmBgYHtyfQ0KYTwtc3VtbWFyeShOTFM0KSRjb2VmZmljaWVudHNbMV07YQ0KYjwtc3VtbWFyeShOTFM0KSRjb2VmZmljaWVudHNbMl07Yg0Kazwtc3VtbWFyeShOTFM0KSRjb2VmZmljaWVudHNbM107aw0KYGBgDQpcDQpMYSBlY3VhY2nDs24gZGUgR29tcGVydHogcGFyYSBudWVzdHJvIGFqdXN0ZSBxdWVkYXLDrWEgdGFsIHF1ZSBhc8OtOg0KXA0KJCRZID0gMjYwODUzLjllXnstZV57NC4xNzcyNDUtMC4wNTYwNTczMnh9fSQkDQpcDQpBaG9yYSB2YW1vcyBhIGRpYnVqYXIgZWwgZ3LDoWZpY286DQpcDQpgYGB7cn0NCnhhajwtc2VxKDEsMzAwLDAuMDA1KQ0KeWFqPC1rKmV4cCgtZXhwKGEtYip4YWopKQ0KcGxvdChkYXlzLEFsbENhc2VzVUsseGxpbT1jKDAsMTUwKSx5bGltPWMoMCwzMDAwMDApLHlsYWI9Ik51bWJlciBvZiBDYXNlcyIseGxhYj0iRGF5cyBzaW5jZSAzMS0xLTIwIiwgbWFpbj0iVG90YWwgQ2FzZXMgVUsiKQ0KbGluZXMoc3BsaW5lKHhhaix5YWopLGNvbD0iY3lhbiIsbHdkPSI0IikNCmBgYA0KXA0KU2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGxhIGZ1bmNpw7NuIHNlIGFqdXN0YSBwZXJmZWN0YW1lbnRlIGEgbG9zIHB1bnRvcyBlIGluY2x1c28gbm9zIHByZWRpY2UgZGUgbWFuZXJhIGFwcm94aW1hZGEgY3XDoW50b3MgaW5mZWN0YWRvcyB2YSBoYSBoYWJlciBlbiAqRWwgUmVpbm8gVW5pZG8qLCAkSW5mZWN0YWRvc1xhcHByb3ggMjUwMDAwJCAoZW4gZWwgY2FzbyBkZSBxdWUgYSBwYXJ0aXIgZGUgaG95IGVtcGllY2VuIGEgYmFqYXIgZWwgbsO6bWVybyBkZSBudWV2b3MgY2Fzb3MpLiBEZSB0b2RhcyBmb3JtYXMgbm8gcG9kZW1vcyBmaWFybm9zIGRlIGVzdG9zIGRhdG9zIHlhIHF1ZSBoZW1vcyBkZXNwcmVjaWFkbyB1bmEgZ3JhbiBjYW50aWRhZCBkZSB2YXJpYWJsZXMgeSBzb2xvIG5vcyBoZW1vcyBmaWphZG8gZW4gZWwgbsO6bWVybyBhY3VtdWxhZG8gZGUgaW5mZWN0YWRvcyBwb3IgZMOtYS5cDQpcDQpcDQpDb21vIGNvbmNsdXNpb25lcyBwb2RlbW9zIHNhY2FyIHF1ZSBlc3RvcyBtb2RlbG9zIHNvbiB1bmEgZ3JhbiBheXVkYSBhIGxhIGhvcmEgZGUgZXhwbGljYXJub3MgY29tbyB1bmEgZXBpZGVtaWEgZW4gZXN0ZSBjYXNvIHZhIGEgZGVzYXJyb2xsYXJzZSwgeWEgcXVlIG5vcyBheXVkYW4gY29uIGxhcyBwcmVkaWNjaW9uZXMuIEVuIGN1YW50byBhIGxhcyBncsOhZmljYXMsIGVzdGEgw7psdGltYSBzZSBhanVzdGEgYSB1bmEgc2l0dWFjacOzbiBzb2NpYWwgZGUgY29uZmluYW1pZW50bywgZXMgZGVjaXIsIG9ibGlnYW5kbyBhIHF1ZSBsYSBnZW50ZSBzZSBxdWVkZSBlbiBzdXMgY2FzYXMsIG9ibGlnYW1vcyB0YW1iacOpbiBhIGZyZW5hciBsYSBleHBhbnNpw7NuIGRlbCB2aXJ1cy4gRGUgZXN0YSBmb3JtYSBsYSBjdXJ2YSBzZSBhcGxhbmEgbWFudGVuaWVuZG8gY29uc3RhbnRlIGVsIG7Dum1lcm8gZ2xvYmFsIGRlIGNhc29zIHkgZXZpdGFuZG8gdW5hIGNyw61zaXMgc2FuaXRhcmlhLiBTaSBlc3RhcyBtZWRpZGFzIG5vIHNlIHRvbWFyYW4sIGxhIGdyw6FmaWNhIHF1ZSBtZWpvciBhanVzdGFyw61hIGxhIGV4cGFuc2nDs24gZGVsIHZpcnVzLCBzZXLDrWEgZWwgbW9kZWxvIGV4cG9uZW5jaWFsIHF1ZSBoZW1vcyBoZWNobyBlbiBlbCBhcGFydGFkbyBiIHkgbHVlZ28gbWVqb3JhZG8gZW4gZWwgYXBhcnRhZG8gYy4gVW5hIGN1cnZhIHNpbiBjb250cm9sIHkgbW9ub3RvbmFtZW50ZSBjcmVjaWVudGUsIHF1ZSwgaHViaWVyYSBjb2xhcHNhZG8gZWwgc2lzdGVtYS5cDQpcDQpEYXRvcyByZWNvZ2lkb3MgaGFzdGEgZWwgZMOtYSAwMy8wNS8yMDIwLlwNClwNCg0KKipSRUZFUkVOQ0lBUyoqXA0KXA0KaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9jb3ZpZDE5LW1hcC8/aGw9ZXMNClwNCmh0dHBzOi8vd3d3Lm92ZXJsZWFmLmNvbS9sZWFybi9sYXRleC8NClwNCmh0dHBzOi8vbWFzdGVyZXMudWdyLmVzL21vZWEvcGFnZXMvY3Vyc28yMDE1MTYvdGZtMTUxNi9zaW1vbl9taW5ndWV6X3RmbS8hDQpcDQpodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9GdW5jaSVDMyVCM25fZGVfR29tcGVydHoNClwNCmh0dHBzOi8vd3d3LnVjbS5lcy9kYXRhL2NvbnQvbWVkaWEvd3d3L3BhZy00MTQ1OS9Nb2RlbG9zJTIwbm8lMjBsaW5lYWxlcyUyMGNvcnRvLnBkZg0KXA0KaHR0cHM6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvTSVDMyVBRG5pbW9zX2N1YWRyYWRvc19ub19saW5lYWxlcw0KXA0KaHR0cHM6Ly93d3cudWNtLmVzL2RhdGEvY29udC9tZWRpYS93d3cvcGFnLTQxNDU5L01vZGVsb3MlMjBubyUyMGxpbmVhbGVzJTIwY29ydG8ucGRmDQpcDQpcDQpcDQpcDQpcDQpcDQpcDQpcDQoqKkVqZXJjaWNpbyAyLioqXA0KXA0KVW4gcHJvZmVzb3Igc2UgaW50ZXJyb2dhIHBvciBsYSBkaXN0cmlidWNpw7NuIHF1ZSBzaWd1ZSBlbCBuw7ptZXJvIGRlIGFzaWduYXR1cmFzIGFwcm9iYWRhcyBwb3IgbG9zDQphbHVtbm9zIGVuIGVsIGN1YXRyaW1lc3RyZSBxdWUgc2UgaW1wYXJ0ZSBsYSBhc2lnbmF0dXJhIGFudGVzIGNpdGFkYSBkZSB1biB0b3RhbCBkZSBjaW5jby4gT2x2aWRhbmRvDQplbCBoZWNobyBkZSBxdWUgbGEgcHJvcG9yY2nDs24gZGUgYXByb2JhciB1bmEgYXNpZ25hdHVyYSB2YXLDrWEgZW50cmUgbGFzIGNpbmNvIGFzaWduYXR1cmFzLCBzZSBhdmVudHVyYQ0KYSBhZmlybWFyIHF1ZSBlc2FzIGRpc3RyaWJ1Y2lvbmVzIHNpZ3VlbiB1bmEgQig1LCAwLiA4NSkgZW4gZWwgZ3J1cG8gQSB5IHVuYSBCKDUsIDAuIDEpIGVuIGVsIGdydXBvDQpCLiBUYW1iacOpbiBzYWJlIHF1ZSBhIGxvIGxhcmdvIGRlIGxvcyBhw7FvcywgZWwgNzUgJSBkZSBsb3MgYWx1bW5vcyBhc2lzdGVuIGFsIGdydXBvIEEgeSBlbCAyNSAlDQphc2lzdGVuIGFsIGdydXBvIEIuIFNpIHNlIGVzY29nZSBhbCBhemFyIHVuIGFsdW1ubyBxdWUgaGEgYXByb2JhZG8gbcOhcyBkZSBkb3MgYXNpZ25hdHVyYXMgZW4gZWwNCmN1YXRyaW1lc3RyZSwgwr9jdcOhbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGVzZSBhbHVtbm8gaGF5YSBhc2lzdGlkbyBhIGNsYXNlIGVuIGVsIGdydXBvIEE/DQoNCg0KRGVsIGVudW5jaWFkbyBvYnRlbmVtb3MgbGFyIHByb2JhYmlsaWRhZGVzIGRlIHF1ZSB1biBhbHVtbm8gcGVydGVuZXpjYSBhIGNhZGEgdW5vIGRlIGxvcyBncnVwb3M6DQokJFAoQSk9MC43NSQkDQokJFAoQik9MC4yNSQkDQoNCg0KYGBge3J9DQpQYTwtMC43NQ0KUGI8LTAuMjUNCmBgYA0KDQpEZWwgZW51bmNpYWRvIHRhbWJpw6luIGV4dHJhZW1vcyBxdWUgbGEgKipwb3JiYWJpbGlkYWQgZGUgYXByb2JhciB1bmEgYXNpZ25hdHVyYSoqIGVuIGVsICoqZ3J1cG8gQSBlcyBkZSAwLjg1Kio7IG1pZW50cmFzIHF1ZSBlbiBlbCAqKmdydXBvIEIgZXMgZGUgMC4xKiouDQoNCg0KVGVuZW1vcyBxdWUgaGFsbGFyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gYWx1bW5vIHF1ZSBoYSBhcHJvYmFkbyBtw6FzIGRlIGRvcyBhc2lnbmF0dXJhcyBoYXlhIGFzaXN0aWRvIGEgY2xhc2UgZW4gZWwgZ3J1cG8gQS4gRXN0YSBzZSB0cmF0YSBkZSB1bmEgKipwcm9iYWJpbGlkYWQgY29uZGljaW9uYWRhKiouIENvbW8gZWwgYWx1bW5vICJoYSBhcHJvYmFkbyBtw6FzIGRlIGRvcyBhc2lnbmF0dXJhcyIgZXN0YWJsZWNlbW9zIHF1ZSBsYSAqKnZhcmlhYmxlIGFsZWF0b3JpYSBYIGVzIGVsIG7Dum1lcm8gZGUgYXNpZ25hdHVyYXMgYXByb2JhZGFzIHkgZXN0ZSB0aWVuZSBxdWUgc2VyIGVzdHJpY3RhbWVudGUgbWF5b3IgcXVlIGRvcyoqLiANClBvciB0YW50bywgdGVuZW1vcyBxdWUgbG8gcXVlIG5vcyBwaWRlIGVsIHByb2JsZW1hIHZpZW5lIGRhZG8gcG9yOiANCiQkUChBL1g+MikkJA0KUGFyYSByZXNvbHZlcmxvIGFwbGljYW1vcyBsYSByZWdsYSBkZSBCYXllcyB5IHBvc3Rlcmlvcm1lbnRlIGxhcyBwcm9waWVkYWRlcyBkZSB2YXJpYWJsZXMgYWxlYXRpb3JpYXM6DQokJFB7KEEvWD4yKX09XGZyYWN7UChBKVxjYXAgUChYPjIpfXtQKFg+Mil9PVxmcmFjeyhQKEEpXGNhcCAoMS1QKFhcbGUyKSl9ezEtUChYXGxlMil9JCQNCg0KUHJpbWVybyBoYWxsYW1vcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIGFsdW1ubyBoYXlhIGFwcm9iYWRvIG3DoXMgZGUgZG9zIGFzaWduYXR1cmFzOg0KYGBge3J9DQpQYTI8LTEtcGJpbm9tKDIsNSwwLjg1KTtQYTINCmBgYA0KDQokJFB7KFg+Mil9PSgxLVAoWFxsZTIpPTAuOTczMzg4MSQkDQpBIGNvbnRpbnVhY2nDs24sIG9idGVuZW1vcyBsYSBpbnRlcnNlY2Npw7NuIGRlIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gYWx1bW5vIHBlcnRlbmV6Y2EgYWwgZ3J1cG8gQSB5IGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gYWx1bW5vIGhheWEgYXByb2JhZG8gZG9zIGFzaWduYXR1cmFzLiBDb21vIHNlIHRyYXRhbiBkZSAqKnN1Y2Vzb3MgaW5kZXBlbmRpZW50ZXMqKiwgZXN0YSBlcyBsYSBtdWx0aXBsaWNhY2nDs24gZGUgYW1iYXMuDQpgYGB7cn0NClBhKlBhMg0KYGBgDQogJCRQKEEpXGNhcCAoMS1QKFhcbGUyKT1QKEEpUChYPjIpPTAuNzMwMDQxMSQkDQogDQpBaG9yYSwgZGViZW1vcyBvYnRlbmVyIGxhIHByb2JhYmlsaWRhZCB0b3RhbCBkZSBxdWUgdW4gYWx1bW5vIGhheWEgYXByb2JhZG8gbcOhcyBkZSBkb3MgYXNpZ25hdHVyYXMuIEVzdG8gZXMgbG8gbWlzbW8gcXVlIGxhIHVuacOzbiBkZSBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIGFsdW1ubyBoYXlhIGFwcm9iYWRvIG3DoXMgZGUgZG9zIGFzaWduYXR1cmFzIHkgdmF5YSBhbCBncnVwbyBBIHkgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB1biBhbHVtbm8gaGF5YSBhcHJvYmFkbyBtw6FzIGRlIGRvcyBhc2lnbmF0dXJhcyB5IHZheWEgYWwgZ3J1cG8gQi4gDQokJFAoWD4yKT0oUChBKVxjYXAgKDEtUChYXGxlMikpXGN1cChQKEIpXGNhcCgxLVAoWFxsZTIpKSQkDQpBbnRlcmlvcm1lbnRlLCBoZW1vcyBoYXlhZG8gbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBlc3RvIG9jdXJyYSBlbiBlbCBncnVwbyBBLiBQb3IgbG8gcXVlIGFob3JhIGRlYmVtb3Mgb2J0ZW5lciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGVzdG8gb2N1cnJhIGVuIGVsIGdydXBvIEIuDQoNCmBgYHtyfQ0KUGIyPC0xLXBiaW5vbSgyLDUsMC4xKTtQYjINCmBgYA0KQ29tbyBlbiBlbCBncnVwbyBBLCBzZSB0cmF0YSBkZSBzdWNlc29zIGluZGVwZW5kaWVudGVzIHBvciBsbyBxdWUgbGEgaW50ZXJzZWNjacOzbiBlcXVpdmFsZSBhbCBwcm9kdWN0byBkZSBwcm9iYWJpbGlkYWRhZGVzOg0KYGBge3J9DQpQYipQYjINCmBgYA0KDQokJFAoQilcY2FwICgxLVAoWFxsZTIpPVAoQilQKFg+Mik9MC4yNSowLjAwODU2PTAuMDAyMTQkJA0KQWhvcmEgeWEgcG9kZW1vcyBvYnRlbmVyIGxhIHByb2JhYmlsaWRhZCB0b3RhbCBkZSBhcHJvYmFyIG3DoXMgZGUgZG9zIGFzaWduYXR1cmFzLiBBZGVtw6FzLCBjb21vIGxhIHByb2JhYmlsaXphciBkZSBjdW1wbGlyIGVzdGUgcmVxdWlzaXRvIHkgcGVydGVuZWNlciBhbCBncnVwbyBBIGVzIGluY29tcGF0aWJsZSBjb24gbGEgcHJvYmFiaWxpZGFkIGRlIGhhY2VybG8geSBwZXJ0ZW5lY2VyIGFsIGdydXBvIEIgKHlhIHF1ZSB1biBhbHVtbm8gbm8gcHVlZGUgcGVydGVuZWNlciBhIGFtYm9zIGdydXBvcyBhIGxhIHZleikgbGEgdW5pw7NuIGRlIGFtYm9zIGVzIGVxdWl2YWxlbnRlIGEgbGEgc3VtYS4NCmBgYHtyfQ0KUDI8LVBhKlBhMitQYipQYjI7UDINCmBgYA0KDQokJFAoWD4yKT0oUChBKVxjYXAgKDEtUChYXGxlMikpXGN1cChQKEIpXGNhcCgxLVAoWFxsZTIpKT0wLjk3MzM4ODHiiJcwLjc1KzAuMDA4NTbiiJcwLjI1PTAuNzMyMTgxMSQkDQpGaW5hbG1lbnRlLCByZXNvbHZlbW9zOg0KYGBge3J9DQpQYSpQYTIvUDINCmBgYA0KDQokJFAoe0EvWD4yfSk9XGZyYWN7UChBKVxjYXAgUChYPjIpfXtQKFg+Mil9PVxmcmFjeyhQKEEpXGNhcCAoMS1QKFhcbGUyKSl9ezEtUChYXGxlMil9PVxmcmFjezAuNzMwMDQxMX17MC43MzIxODExfT0wLjk5NzA3NzIkJA0KUG9yIHRhbnRvLCBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGhhYmllbmRvIGFwcm9iYWRvIG3DoXMgZGUgZG9zIGFzaWduYXR1cmFzIHVuIGFsdW1ubyBoYXlhIGlkbyBhIGNsYXNlIGFsIGdydXBvIEEgZXMgKiowLjk5NzA3NzIqKi5cDQpcDQpcDQpcDQpcDQpcDQpcDQpcDQpcDQoqKkVKRVJDSUNJTyAzLioqXA0KXA0KTGEgZHVyYWNpw7NuIGRlIGxhcyBib21iaWxsYXMgZGUgbGEgTWFyY2EgQSBzaWd1ZW4gdW5hIGRpc3RyaWJ1Y2nDs24gTigxNDAwMCwgNjAwKSwgbWllbnRyYXMgcXVlIGxhIGR1cmFjacOzbiBkZSBsYXMgYm9tYmlsbGFzIGRlIGxhIE1hcmNhIEIgc2lndWVuIHVuYSBkaXN0cmlidWNpw7NuIE4oMTUwMDAsIDgwMCkuIFNlIGVzdGFibGVjZSBsYSBzaWd1aWVudGUgcmVnbGEgcGFyYSBjbGFzaWZpY2FyIGxhcyBib21iaWxsYXMgcHJvZHVjaWRhcyBwb3IgbGFzIE1hcmNhcyBBIHkgQjogdW5hIGJvbWJpbGxhIHNlcsOhIGNsYXNpZmljYWRhIGNvbW8gTWFyY2EgQSBzaSBzdSBkdXJhY2nDs24gZXMgaW5mZXJpb3IgYWwgY3VhbnRpbCB0ZcOzcmljbyAwLjA1IGRlIGxhIGRpc3RyaWJ1Y2nDs24gcXVlIGxhIGdvYmllcm5hIGxhIGR1cmFjacOzbiBkZSBsYXMgYm9tYmlsbGFzIGRlIGxhIE1hcmNhIEIuIExhcyBib21iaWxsYXMgZGUgbGEgTWFyY2EgQSBzZSBjYXRhbG9nYW4gY29tbyBkZWZpY2llbnRlcyBzaSBzdSBkdXJhY2nDs24gZXMgaW5mZXJpb3IgYWwgcHJpbWVyIGRlY2lsIHRlw7NyaWNvIGRlIGxhIGRpc3RyaWJ1Y2nDs24gcXVlIGdvYmllcm5hIHN1IGR1cmFjacOzbi4gU2kgc2UgY2xhc2lmaWNhIGluY29ycmVjdGFtZW50ZSB1bmEgYm9tYmlsbGEgZGUgbGEgTWFyY2EgQiwgwr9jdcOhbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHNlYSBjbGFzaWZpY2FkYSBjb21vIHVuYSBib21iaWxsYSBkZWZpY2llbnRlIGRlIGxhIE1hcmNhIEE/DQoNCg0KRGVsIGVudW5jaWFkbyBleHRyYWVtb3MgcXVlIGxhIHZhcmlhYmxlIGFsZWF0b3JpYSBkZSBkdXJhY2nDs24gZGUgbGFzIGJvbWJpbGxhcyBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwuIEFkZW3DoXMsIGVzdGUgdGlwbyBkZSBkaXN0cmlidWNpw7NuIGVzIGNhcmFjdGVyw61zdGljbyBkZSBsYXMgdmFyaWFibGVzIGFsZWF0b3JpYXMgY29udGludWFzIHlhIHF1ZSBlbCBjb25qdW50byBkZSB2YWxvcmVzIGFjY2VzaWJsZXMgZGUgZHVyYWNpw7NuIGRlIGxhcyBib21iaWxsYXMgZXMgaW5maW5pdG8gbm8gbnVtZXJhYmxlLiBUZW5lbW9zIHF1ZToNCi1MYSB2YXJpYWJsZSBhbGVhdG9yaWEgcXVlIGdvYmllcm5hIGR1cmFjacOzbiBkZSBsYXMgYm9tYmlsbGFzIGRlIGxhICoqTWFyY2EgQSoqIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuOg0KJCRYX2Fcc2ltIE4oMTQwMDAsNjAwKSQkDQoNCg0KLUxhIHZhcmlhYmxlIGFsZWF0b3JpYSBxdWUgZ29iaWVybmEgZHVyYWNpw7NuIGRlIGxhcyBib21iaWxsYXMgZGUgbGEgKipNYXJjYSBCKiogc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs246DQokJFhfYlxzaW0gTigxNTAwMCw4MDApJCQNCkFzw60sIGhhY2Vtb3MgbGFzIHNpZ3VpZW50ZXMgYXNpZ25hY2lvbmVzOg0KDQoNCmBgYHtyfQ0KbXVhPC0xNDAwMA0Kc2lnbWFhPC02MDANCm11YjwtMTUwMDANCnNpZ21hYjwtODAwDQpgYGANCg0KDQpUYW1iacOpbiBzYWJlbW9zIHF1ZSBsYXMgYm9tYmlsbGFzIHNlICoqY2xhc2lmaWNhbiBjb21vIE1hcmNhIEEqKiBzaSBzdSBkdXJhY2nDs24gc2UgZW5jdWVudHJhIHBvciBkZWJham8gZGVsIGN1YW50aWwgdGXDs3JpY28gMC4wNSBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhcyBib21iaWxsYXMgZGUgbGEgTWFyY2EgQi4gUG9yIHRhbnRvOg0KDQoNCmBgYHtyfQ0KdWM8LXFub3JtKDAuMDUsbXViLHNpZ21hYik7dWMNCmBgYA0KDQpFbiBjb25zZWN1ZW5jaWEsIGVsICoqdW1icmFsIGRlIGR1cmFjacOzbioqIGRlIHVuYSBib21iaWxsYSBwb3IgZGViYWpvIGRlbCBjdWFsIHNlcsOhIGNsYXNpZmljYWRhIGNvbW8gZGUgbGEgTWFyY2EgQSBlcyAqKjEzNjg0LjEyKioNCg0KDQpBZGVtw6FzLCBwYXJhIHF1ZSB1bmEgYm9tYmlsbGEgc2VhICoqY2xhc2lmaWNhZGEgY29tbyBkZWZpY2llbnRlIGRlIGxhIE1hcmNhIEEqKiBzdSBkdXJhY2nDs24gaGEgZGUgc2VyIGluZmVyaW9yIGFsIGRlY2lsIHRlw7NyaWNvIChwcmltZXIgZGVjaWwtLT4gMC4xKSBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIGJvbWJpbGxhcyBkZSBsYSBNYXJjYSBBLiANCmBgYHtyfQ0KdWQ8LXFub3JtKDAuMSxtdWEsc2lnbWFhKTt1ZA0KYGBgDQoNClBvciB0YW50bywgc2UgZGV0ZXJtaW5hIGVsIHVtYnJhbCBkZSBkdXJhY2nDs24gZGUgdW5hIGJvbWJpbGxhIHRhbCBxdWUsIHBvciBkZWJham8gZGVsIGN1YWwgZXN0YSBzZSBjbGFzaWZpY2EgY29tbyBkZWZpY2llbnRlIGRlIGxhIE1hcmNhIEEuIEVzdGUgdW1icmFsIGVzICoqMTMyMzEuMDcqKi4NCg0KDQpFbCBlamVyY2ljaW8gbm9zIHByZWd1bnRhIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW5hIGJvbWJpbGxhIHNlYSBjbGFzaWZpY2FkYSBjb21vIGRlZmljaWVudGUgZGUgbGEgTWFyY2EgQSBzaWVuZG8gZXN0YSB1bmEgYm9tYmlsbGEgaW5jb3JyZWN0YW1lbnRlIGNsYXNpZmljYWRhIGRlIGxhIE1hcmNhIEIuIEVzdG8gZXMgdW5hIHByb2JhYmlsaWRhZCBjb25kaWNpb25hZGE6DQokJFAoRC9JKSQkDQpTaWVuZG86DQoNCg0KLSoqICREJDogQm9tYmlsbGEgZGUgbGEgTWFyY2EgQiBjbGFzaWZpY2FkYSBjb21vIGRlZmljaWVudGUgZGUgbGEgTWFyY2EgQSoqDQoNCg0KLSoqICRJJDogQm9tYmlsbGEgZGUgbGEgTWFyY2EgQiBpbmNvcnJlY3RhbWVudGUgY2xhc2lmaWNhZGEgY29tbyBkZSBsYSBNYXJjYSBBKioNCg0KUGFyYSByZXNvbHZlcmxvIGFwbGljYW1vcyBsYSByZWdsYSBkZSAqKkJheWVzKio6DQokJFAoRC9JKT1cZnJhY3tQKEQpUChJL0QpfXtQKEkpfSQkDQoNCkRlIGFjdWVyZG8gY29uIGVsIGVudW5jaWFkbyBzZSB0aWVuZSBxdWUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB1bmEgYm9tYmlsbGEgZGUgbGEgTWFyY2EgQiBzZWEgY2xhc2lmaWNhZGEgY29tbyBkZSBsYSBtYXJjYSBBIGVzIGRlIDAuMDUuIA0KJCRQKEkpPTAuMDUkJA0KTGEgc2lndWllbnRlIHByb2JhYmlsaWRhZCBxdWUgZGViZW1vcyBjYWxjdWxhciBlcyBQKEkvRCkuIEVzdGEgZXMgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB1bmEgYm9tYmlsbGEgZGUgbGEgTWFyY2EgQiBzZWEgY2xhc2lmaWNhZGEgZXJyw7NuZWFtZW50ZSBjb21vIGRlIGxhIE1hcmNhIEEsIGhhYmllbmRvIHNpZG8gcHJldmlhbWVudGUgY2xhc2lmaWNhZGEgY29tbyBkZWZpY2llbnRlIGRlIGxhIE1hcmNhIEEuIEVzdGEgZXMgZGVsIDEwMCAlIHlhIHF1ZSBlbiBlbCBlbnVuY2lhZG8gbm9zIGFzZWd1cmEgcXVlIHNlIGNsYXNpZmljYSBpbmNvcnJlY3RhbWVudGUgdW5hIGJvbWJpbGxhIGRlIGxhIE1hcmNhIEIuIFBvciB0YW50bywgdGVuZW1vczoNCiQkUChJL0QpPTEkJA0KDQpQb3Igw7psdGltbywgZGViZW1vcyBhdmVyaWd1YXIgY3VhbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuYSBib21iaWxsYSBCIHNlYSBjbGFzaWZpY2FkYSBjb21vIGRlZmljaWVudGUgZGUgbGEgTWFyY2EgQSwgZXMgZGVjaXIgUChEKS4gQW50ZXMsIGhlbW9zIGNhbGN1bGFkbyBxdWUgcGFyYSBxdWUgZXN0byBvY3VycmEgc3UgZHVyYWNpw7NuIGhhIGRlIGVzdGFyIHBvciBkZWJham8gZGVsIHVtYnJhbCAxMzIzMS4wNyAodWQpLiANCmBgYHtyfQ0KUEQ8LXBub3JtKHVkLG11YixzaWdtYWIpO1BEDQpgYGANCg0KDQpQb3IgbG8gdGFudG8sIHRlbmVtb3MgcXVlOg0KJCRQKEQpPTAuMDEzNTEyMjkkJA0KRmluYWxtZW50ZSwgb3BlcmFtb3M6DQpgYGB7cn0NClBEKjEvMC4wNQ0KYGBgDQokJFAoRC9JKT1cZnJhY3tQKEQpUChJL0QpfXtQKEkpfT1cZnJhY3swLjAxMzUxMjI5XGNkb3QxfXswLjA1fT0wLjI3MDI0NTkkJA0KRW4gY29uc2VjdWVuY2lhLCBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuYSBib21iaWxsYSBkZSBsYSBNYXJjYSBCIHF1ZSBzZSBoYSBjbGFzaWZpY2FkbyBpbmNvcnJlY3RhbWVudGUgY29tbyBNYXJjYSBBIHNlYSBjbGFzaWZpY2FkYSBjb21vIGRlZmljaWVudGUgZGUgbGEgbWFyY2EgQSBlcyAqKjAuMjcwMjQ1OSoqLiANCmBgYHtyfQ0KMC4yNzAyNDU5KjEwMA0KYGBgDQoNCg0KRXN0YSBleHByZXNhZGEgZW4gcG9yY2VudGFqZSBzZXLDrWEgZGVsICoqMjcuMDI0NTkgJSoqDQoNCkdyw6FmaWNhbWVudGU6DQoNCg0KYGBge3J9DQpjdXJ2ZShkbm9ybSh4LG11YSxzaWdtYWEpLHhsaW09YygxMTAwMCwyMDAwMCksY29sPSJibHVlIixsd2Q9IjIiLHlsYWI9IkZ1bmNpb24gZGVuc2lkYWQiLHhsYWI9IkR1cmFjaW9uIGRlIGxhIGJvbWJpbGxhIixtYWluPSJDbGFzaWZpY2FjaT9uIGRlIGJvbWJpbGxhcyIpDQpjdXJ2ZShkbm9ybSh4LG11YixzaWdtYWIpLHhsaW09Yyg2NTAwLDIwMDAwKSxjb2w9InJlZCIsbHdkPSAiMiIsYWRkPVQpDQpsdDI8LXNlcSgxMTAwMCx1ZCwwLjAxKQ0KcG9seWdvbihjKGx0MltsdDI8dWRdLHVkKSxjKGRub3JtKGx0MltsdDI8dWRdLG11YSxzaWdtYWEpLDApLGNvbD0iZ3JleSIpDQphYmxpbmUodj11ZCxjb2w9ImJsYWNrIixsd2Q9MSkNCmx0PC1zZXEoMTEwMDAsdWMsMC4wMSkNCnBvbHlnb24oYyhsdFtsdDx1Y10sdWMpLGMoZG5vcm0obHRbbHQ8dWNdLG11YixzaWdtYWIpLDApLGNvbD0ieWVsbG93IikNCmFibGluZSh2PXVjLGNvbD0iYmxhY2siLGx3ZD0xKQ0KcG9seWdvbihjKGx0W2x0PHVkXSx1ZCksYyhkbm9ybShsdFtsdDx1ZF0sbXViLHNpZ21hYiksMCksY29sPSJncmVlbiIpDQpsZWdlbmQoeD0idG9wcmlnaHQiLGxlZ2VuZD1jKCJEaXN0cmlidWNpb24gTWFyY2EgQSIsIkRpc3RyaWJ1Y2lvbiBNYXJjYSBiIiwiQ2xhc2lmaWNhZGEgY29tbyBBIiwiQ2xhc2lmaWNhZGEgY29tbyBkZWZpY2llbnRlIGRlIEEiLCJQKEQvSSkiKSxmaWxsPWMoImJsdWUiLCJyZWQiLCJ5ZWxsb3ciLCJncmV5IiwiZ3JlZW4iKSkNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==