Bosque de árboles aleatorios

La principal característica del algoritmo bosque aleatorio es su flexibilidad, facilidad de uso y no se necesitan grandes datos además se pueden utilizar tanto para la regresión y clasificación.

Este algoritmo se trata en la creación y combinación de múltiples árboles de decisión para generar una mayor precisión y que la predicción sea más estable es decir trata de encontrar de una diversidad de datos las mejores características de un subconjunto para un mejor modelo (Faleiros, Henrique, & Maia Polo, 2018).

Estos son los pasos del modelo bosque aleatorio:

• Se define el número de árboles que contendrá el bosque.

• Aplicar un muestreo de sustitución del tamaño de su base de entrenamiento (bootstrapping) para cada árbol.

• Elegir un número m menor o igual que el número de variables independientes.

• Para cada árbol del algoritmo elegir m variables independientes en forma aleatoria.

• Hacer crecer los árboles hasta una profundidad que ya no sea posible que crezcan más.

• Tener en cuenta todas las predicciones de un individuo.

• En el caso de clasificación realizar una votación (por mayoría) y una media en el caso de regresión para obtener la predicción final.

Regresión Lineal

Es más utilizado como un algoritmo de clasificación a pesar de tener el nombre de algoritmo de regresión, y el más sencillo para empezar en ML, su análisis permite hacer predicciones a través de datos históricos continuos y su relación existente (Chollet, 2018).

En un algoritmo de regresión lineal cada dato de entrada tiene su propio peso, donde los datos de entrada o variables independientes se asignan en una matriz X y los pesos de regresión o variables dependientes en una vector Y (Harrington, 2012).

La regresión utiliza ecuaciones lineales, ya sean simples donde solo existe una variable independiente, y múltiples donde existe más de una variable independiente, a continuación, la fórmula de una ecuación lineal múltiple:

\[ y = b + m_1 x_1 + m_2 x_2 + ... + m_d x_d \]

Donde: y = Variable dependiente. b = La constante o intersección. xi = Las entradas o variables independientes. mi = Coeficiente, pendiente o valor a determinar.

El objetivo de este algoritmo es minimizar la distancia entre los datos y la línea para ello utiliza el criterio del error de los mínimos cuadrados con los valores predichos y los reales, donde cuanto más cerca pasen los puntos de la recta, es mejor.

Naive Bayes

Este clasificador es probabilístico y aplica el teorema de bayes, digamos que las características de entrada \(x_1, x_2, ..., x_n\) por condición son independientes entre sí, dado la etiqueta de clase Y, tal como:

\[ P\left(x_{1}, x_{2} \ldots x_{n} \mid Y\right)=\prod_{i=1}^{n} P\left(x_{i} \mid Y\right) \]

Para esta clasificación de dos clases donde \((i=0.1)\), se define como P (i | x) como la probabilidad del vector de medidas \(x\) {\(x_1,x_2,..., x_n\)} pertenece a la clase \(i\). Donde se define el puntaje de la clasificación de la siguiente forma:

\[ \frac{P(1 \mid x)}{P(0 \mid x)}=\frac{\prod_{j=1}^{n} f\left(x_{j} \mid 1\right) P(1)}{\prod_{j=1}^{n} f\left(\boldsymbol{x}_{j} \mid \mathbf{0}\right) P(\mathbf{0})}=\frac{P(1)}{P(0)}=\prod_{j=1}^{n} \frac{f\left(\boldsymbol{x}_{j} \mid \mathbf{1}\right)}{f\left(\boldsymbol{x}_{j} \mid \mathbf{0}\right.} \] \[ \ln \frac{P(1 \mid x)}{P(0 \mid x)}=\ln \frac{P(1)}{P(0)}+\sum_{j=1}^{n} \ln \frac{f\left(x_{j} \mid 1\right)}{f\left(x_{j} \mid 0\right.} \]

Donde P\((i|x)\) es proporcional a \(f (x|i) P(i)\) y \(f(x|i)\) es la estructura condicional de \(x\) para objetos de la clase \(i\).

El modelo de Bayes es eficaz, e interesante ya que es simple y robusto. Y no requiere la realización de esquemas complicados de estimación iterativa de parámetros a grandes volúmenes de datos ya que es muy fácil de construir y utilizar (Awad & Khanna, 2015, pág. 15).

Regresión Logística

Este algoritmo de regresión logística, es un modelo estadístico y probabilístico que pronostica la probabilidad de que se manifieste un suceso, ya que modela la relación entre la dependiente “X” y un resultado característico “Y”.

Se expresa como:

\[ P(Y \mid X)=\frac{e^{\beta_{0}+\beta_{1} X}}{1+e^{\beta_{0}+\beta_{1} X}} \]

Esta función logística puede reformularse como la inversa que se le llama logit o log-odds fundamental para generar sus coeficientes.

\[ \operatorname{logit}(P(Y \mid X))=\operatorname{In}\left[\frac{P(Y \mid X)}{1-P(Y \mid X)}\right]=\beta_{0}+\beta_{1} X \]

Esta función logística recibe un rango de valores de entrada (_0+_1X) entre infinito positivo y negativo, y la salida P(Y|X) esta limitado a los valores 0 y 1, como se muestra:

Red Neuronal Artificial

La red neuronal artificial es un modelo computacional que imita las conexiones neuronales del cerebro, intentando realizar tareas de clasificación de manera similar al ser humano. Las neuronas o unidades están conectadas de manera direccional o bidireccional y cada conexión tiene un peso para representar la fuerza de las conexiones neuronales, contando con unidades de entrada y de salida (Biem, 2015).

Una red neuronal está compuesta por un modelo neuronal que indica como una neurona devuelve una salida a partir de datos de entrada, la arquitectura que describe las conexiones entre las neuronas, la política de codificación, la política de codificación de datos de entrada y etiquetas, y por último el algoritmo de entrenamiento (Biem, 2015).

La red neuronal está comúnmente descrita como un grafo, donde las neuronas son los nodos y sus conexiones son las aristas que unen la salida de una neurona con la entrada de otra, definiendo la entrada como la suma ponderada de las salidas de las neuronas conectadas a ella. La red neuronal puede estar distribuida en capas o subconjuntos, teniendo como una capa de entrada V0 de n + 1 neuronas, donde n es la cantidad del espacio de entrada, la salida de la neurona \(i\) en \(V_0\) es \(x_i\), la última neurona en este nivel es una constante 1 (Shalev & Ben, 2014).

Denotamos \(V_t,i\), donde t es la profundidad de la red o la cantidad de capas sin la considerar \(V_0\), calculando las salidas de las neuronas de la capa t, se podrá calcular las salidas de las neuronas de la capa t + 1 como sigue, cuando la red es alimentada con el vector de entrada x. Las capas \(V_1\), . . ., \(V_T - 1\) son las capas ocultas y la última es la capa de salida. En la siguiente figura se muestra una red neuronal de profundidad V = 2, tamaño 10 y anchura 5, con una neurona en la capa oculta que no tiene aristas de entrada (Shalev & Ben, 2014).

LS0tDQp0aXRsZTogIlNpbnRheGlzIC0gQ29tYW5kb3MgTGF0ZXgiDQpzdWJ0aXRsZTogIkxhdGV4IC0gTWFya2Rvd24iDQphdXRob3I6ICJDZXNhciBDYW50b3JhbCBNb250ZWpvIg0KZGF0ZTogIjIwMjIvMDUvMDEiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCjwhLS1NaSBwcmltZXIgZG9jdW1lbnRvIGVuIE1hcmtkb3duLS0+DQoNCiMgQm9zcXVlIGRlIMOhcmJvbGVzIGFsZWF0b3Jpb3MNCg0KTGEgcHJpbmNpcGFsIGNhcmFjdGVyw61zdGljYSBkZWwgYWxnb3JpdG1vICoqYm9zcXVlIGFsZWF0b3JpbyoqIGVzIHN1IGZsZXhpYmlsaWRhZCwgZmFjaWxpZGFkIGRlIHVzbyB5IG5vIHNlIG5lY2VzaXRhbiBncmFuZGVzIGRhdG9zIGFkZW3DoXMgc2UgcHVlZGVuIHV0aWxpemFyIHRhbnRvIHBhcmEgbGEgcmVncmVzacOzbiB5IGNsYXNpZmljYWNpw7NuLg0KDQpFc3RlIGFsZ29yaXRtbyBzZSB0cmF0YSBlbiBsYSBjcmVhY2nDs24geSBjb21iaW5hY2nDs24gZGUgbcO6bHRpcGxlcyDDoXJib2xlcyBkZSBkZWNpc2nDs24gcGFyYSBnZW5lcmFyIHVuYSBtYXlvciBwcmVjaXNpw7NuIHkgcXVlIGxhIHByZWRpY2Npw7NuIHNlYSBtw6FzIGVzdGFibGUgZXMgZGVjaXIgdHJhdGEgZGUgZW5jb250cmFyIGRlIHVuYSBkaXZlcnNpZGFkIGRlIGRhdG9zIGxhcyBtZWpvcmVzIGNhcmFjdGVyw61zdGljYXMgZGUgdW4gc3ViY29uanVudG8gcGFyYSB1biBtZWpvciBtb2RlbG8gKEZhbGVpcm9zLCBIZW5yaXF1ZSwgJiBNYWlhIFBvbG8sIDIwMTgpLg0KDQpFc3RvcyBzb24gbG9zIHBhc29zIGRlbCBtb2RlbG8gYm9zcXVlIGFsZWF0b3JpbzoNCg0K4oCiIFNlIGRlZmluZSBlbCBuw7ptZXJvIGRlIMOhcmJvbGVzIHF1ZSBjb250ZW5kcsOhIGVsIGJvc3F1ZS4NCg0K4oCiIEFwbGljYXIgdW4gbXVlc3RyZW8gZGUgc3VzdGl0dWNpw7NuIGRlbCB0YW1hw7FvIGRlIHN1IGJhc2UgZGUgZW50cmVuYW1pZW50byAoYm9vdHN0cmFwcGluZykgcGFyYSBjYWRhIMOhcmJvbC4NCg0K4oCiIEVsZWdpciB1biBuw7ptZXJvIG0gbWVub3IgbyBpZ3VhbCBxdWUgZWwgbsO6bWVybyBkZSB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMuDQoNCuKAoiBQYXJhIGNhZGEgw6FyYm9sIGRlbCBhbGdvcml0bW8gZWxlZ2lyIG0gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGVuIGZvcm1hIGFsZWF0b3JpYS4NCg0K4oCiIEhhY2VyIGNyZWNlciBsb3Mgw6FyYm9sZXMgaGFzdGEgdW5hIHByb2Z1bmRpZGFkIHF1ZSB5YSBubyBzZWEgcG9zaWJsZSBxdWUgY3JlemNhbiBtw6FzLg0KDQrigKIgVGVuZXIgZW4gY3VlbnRhIHRvZGFzIGxhcyBwcmVkaWNjaW9uZXMgZGUgdW4gaW5kaXZpZHVvLg0KDQrigKIgRW4gZWwgY2FzbyBkZSBjbGFzaWZpY2FjacOzbiByZWFsaXphciB1bmEgdm90YWNpw7NuIChwb3IgbWF5b3LDrWEpIHkgdW5hIG1lZGlhIGVuIGVsIGNhc28gZGUgcmVncmVzacOzbiBwYXJhIG9idGVuZXIgbGEgcHJlZGljY2nDs24gZmluYWwuDQoNCjxjZW50ZXI+DQohW10oYXJib2xlc2FsZWF0b3Jpb3MuanBnKQ0KPC9jZW50ZXI+DQoNCiMgUmVncmVzacOzbiBMaW5lYWwNCg0KRXMgbcOhcyB1dGlsaXphZG8gY29tbyB1biBhbGdvcml0bW8gZGUgY2xhc2lmaWNhY2nDs24gYSBwZXNhciBkZSB0ZW5lciBlbCBub21icmUgZGUgYWxnb3JpdG1vIGRlIHJlZ3Jlc2nDs24sIHkgZWwgbcOhcyBzZW5jaWxsbyBwYXJhIGVtcGV6YXIgZW4gTUwsIHN1IGFuw6FsaXNpcyBwZXJtaXRlIGhhY2VyIHByZWRpY2Npb25lcyBhIHRyYXbDqXMgZGUgZGF0b3MgaGlzdMOzcmljb3MgY29udGludW9zIHkgc3UgcmVsYWNpw7NuIGV4aXN0ZW50ZSAoQ2hvbGxldCwgMjAxOCkuDQoNCkVuIHVuIGFsZ29yaXRtbyBkZSAqKnJlZ3Jlc2nDs24gbGluZWFsKiogY2FkYSBkYXRvIGRlIGVudHJhZGEgdGllbmUgc3UgcHJvcGlvIHBlc28sIGRvbmRlIGxvcyBkYXRvcyBkZSBlbnRyYWRhIG8gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIHNlIGFzaWduYW4gZW4gdW5hIG1hdHJpeiBYIHkgbG9zIHBlc29zIGRlIHJlZ3Jlc2nDs24gbyB2YXJpYWJsZXMgZGVwZW5kaWVudGVzIGVuIHVuYSB2ZWN0b3IgWSAoSGFycmluZ3RvbiwgMjAxMikuDQoNCkxhIHJlZ3Jlc2nDs24gdXRpbGl6YSBlY3VhY2lvbmVzIGxpbmVhbGVzLCB5YSBzZWFuIHNpbXBsZXMgZG9uZGUgc29sbyBleGlzdGUgdW5hIHZhcmlhYmxlIGluZGVwZW5kaWVudGUsIHkgbcO6bHRpcGxlcyBkb25kZSBleGlzdGUgbcOhcyBkZSB1bmEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSwgYSBjb250aW51YWNpw7NuLCBsYSBmw7NybXVsYSBkZSB1bmEgZWN1YWNpw7NuIGxpbmVhbCBtw7psdGlwbGU6DQoNCiQkDQp5ID0gYiArIG1fMSB4XzEgKyBtXzIgeF8yICsgLi4uICsgbV9kIHhfZA0KJCQNCg0KRG9uZGU6IHkgPSBWYXJpYWJsZSBkZXBlbmRpZW50ZS4gYiA9IExhIGNvbnN0YW50ZSBvIGludGVyc2VjY2nDs24uIHhpID0gTGFzIGVudHJhZGFzIG8gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLiBtaSA9IENvZWZpY2llbnRlLCBwZW5kaWVudGUgbyB2YWxvciBhIGRldGVybWluYXIuDQoNCkVsIG9iamV0aXZvIGRlIGVzdGUgYWxnb3JpdG1vIGVzIG1pbmltaXphciBsYSBkaXN0YW5jaWEgZW50cmUgbG9zIGRhdG9zIHkgbGEgbMOtbmVhIHBhcmEgZWxsbyB1dGlsaXphIGVsIGNyaXRlcmlvIGRlbCBlcnJvciBkZSBsb3MgbcOtbmltb3MgY3VhZHJhZG9zIGNvbiBsb3MgdmFsb3JlcyBwcmVkaWNob3MgeSBsb3MgcmVhbGVzLCBkb25kZSBjdWFudG8gbcOhcyBjZXJjYSBwYXNlbiBsb3MgcHVudG9zIGRlIGxhIHJlY3RhLCBlcyBtZWpvci4NCg0KPGNlbnRlcj4NCiFbXShyZWdyZXNpb25saW5lYWwuanBnKQ0KPC9jZW50ZXI+DQoNCiMgTmFpdmUgQmF5ZXMNCg0KRXN0ZSBjbGFzaWZpY2Fkb3IgZXMgcHJvYmFiaWzDrXN0aWNvIHkgYXBsaWNhIGVsIHRlb3JlbWEgZGUgYmF5ZXMsIGRpZ2Ftb3MgcXVlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGVudHJhZGEgJHhfMSwgeF8yLCAuLi4sIHhfbiQgcG9yIGNvbmRpY2nDs24gc29uIGluZGVwZW5kaWVudGVzIGVudHJlIHPDrSwgZGFkbyBsYSBldGlxdWV0YSBkZSBjbGFzZSBZLCB0YWwgY29tbzoNCg0KJCQNClBcbGVmdCh4X3sxfSwgeF97Mn0gXGxkb3RzIHhfe259IFxtaWQgWVxyaWdodCk9XHByb2Rfe2k9MX1ee259IFBcbGVmdCh4X3tpfSBcbWlkIFlccmlnaHQpDQokJA0KDQpQYXJhIGVzdGEgY2xhc2lmaWNhY2nDs24gZGUgZG9zIGNsYXNlcyBkb25kZSAkKGk9MC4xKSQsIHNlIGRlZmluZSBjb21vIFDCoChpwqBcfMKgeCkgY29tbyBsYSBwcm9iYWJpbGlkYWQgZGVsIHZlY3RvciBkZSBtZWRpZGFzICR4JCB7JHhfMSx4XzIsLi4uLCB4X24kfSBwZXJ0ZW5lY2UgYSBsYSBjbGFzZSAkaSQuIERvbmRlIHNlIGRlZmluZSBlbCBwdW50YWplIGRlIGxhIGNsYXNpZmljYWNpw7NuIGRlIGxhIHNpZ3VpZW50ZSBmb3JtYToNCg0KJCQNClxmcmFje1AoMSBcbWlkIHgpfXtQKDAgXG1pZCB4KX09XGZyYWN7XHByb2Rfe2o9MX1ee259IGZcbGVmdCh4X3tqfSBcbWlkIDFccmlnaHQpIFAoMSl9e1xwcm9kX3tqPTF9XntufSBmXGxlZnQoXGJvbGRzeW1ib2x7eH1fe2p9IFxtaWQgXG1hdGhiZnswfVxyaWdodCkgUChcbWF0aGJmezB9KX09XGZyYWN7UCgxKX17UCgwKX09XHByb2Rfe2o9MX1ee259IFxmcmFje2ZcbGVmdChcYm9sZHN5bWJvbHt4fV97an0gXG1pZCBcbWF0aGJmezF9XHJpZ2h0KX17ZlxsZWZ0KFxib2xkc3ltYm9se3h9X3tqfSBcbWlkIFxtYXRoYmZ7MH1ccmlnaHQufQ0KJCQgJCQNClxsbiBcZnJhY3tQKDEgXG1pZCB4KX17UCgwIFxtaWQgeCl9PVxsbiBcZnJhY3tQKDEpfXtQKDApfStcc3VtX3tqPTF9XntufSBcbG4gXGZyYWN7ZlxsZWZ0KHhfe2p9IFxtaWQgMVxyaWdodCl9e2ZcbGVmdCh4X3tqfSBcbWlkIDBccmlnaHQufQ0KJCQNCg0KRG9uZGUgUCQoaXx4KSQgZXMgcHJvcG9yY2lvbmFsIGEgJGYgKHh8aSkgUChpKSQgeSAkZih4fGkpJCBlcyBsYSBlc3RydWN0dXJhIGNvbmRpY2lvbmFsIGRlICR4JCBwYXJhIG9iamV0b3MgZGUgbGEgY2xhc2UgJGkkLg0KDQpFbCBtb2RlbG8gZGUgQmF5ZXMgZXMgZWZpY2F6LCBlIGludGVyZXNhbnRlIHlhIHF1ZSBlcyBzaW1wbGUgeSByb2J1c3RvLiBZIG5vIHJlcXVpZXJlIGxhIHJlYWxpemFjacOzbiBkZSBlc3F1ZW1hcyBjb21wbGljYWRvcyBkZSBlc3RpbWFjacOzbiBpdGVyYXRpdmEgZGUgcGFyw6FtZXRyb3MgYSBncmFuZGVzIHZvbMO6bWVuZXMgZGUgZGF0b3MgeWEgcXVlIGVzIG11eSBmw6FjaWwgZGUgY29uc3RydWlyIHkgdXRpbGl6YXIgKEF3YWQgJiBLaGFubmEsIDIwMTUsIHDDoWcuIDE1KS4NCg0KIyBSZWdyZXNpw7NuIExvZ8Otc3RpY2ENCg0KRXN0ZSBhbGdvcml0bW8gZGUgcmVncmVzacOzbiBsb2fDrXN0aWNhLCBlcyB1biBtb2RlbG8gZXN0YWTDrXN0aWNvIHkgcHJvYmFiaWzDrXN0aWNvIHF1ZSBwcm9ub3N0aWNhIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgc2UgbWFuaWZpZXN0ZSB1biBzdWNlc28sIHlhIHF1ZSBtb2RlbGEgbGEgcmVsYWNpw7NuIGVudHJlIGxhIGRlcGVuZGllbnRlICJYIiB5IHVuIHJlc3VsdGFkbyBjYXJhY3RlcsOtc3RpY28gIlkiLg0KDQpTZSBleHByZXNhIGNvbW86DQoNCiQkDQpQKFkgXG1pZCBYKT1cZnJhY3tlXntcYmV0YV97MH0rXGJldGFfezF9IFh9fXsxK2Vee1xiZXRhX3swfStcYmV0YV97MX0gWH19DQokJA0KDQpFc3RhIGZ1bmNpw7NuIGxvZ8Otc3RpY2EgcHVlZGUgcmVmb3JtdWxhcnNlIGNvbW8gbGEgaW52ZXJzYSBxdWUgc2UgbGUgbGxhbWEgbG9naXQgbyBsb2ctb2RkcyBmdW5kYW1lbnRhbCBwYXJhIGdlbmVyYXIgc3VzIGNvZWZpY2llbnRlcy4NCg0KJCQNClxvcGVyYXRvcm5hbWV7bG9naXR9KFAoWSBcbWlkIFgpKT1cb3BlcmF0b3JuYW1le0lufVxsZWZ0W1xmcmFje1AoWSBcbWlkIFgpfXsxLVAoWSBcbWlkIFgpfVxyaWdodF09XGJldGFfezB9K1xiZXRhX3sxfSBYDQokJA0KDQpFc3RhIGZ1bmNpw7NuIGxvZ8Otc3RpY2EgcmVjaWJlIHVuIHJhbmdvIGRlIHZhbG9yZXMgZGUgZW50cmFkYSAoXGJldGFcXzArXGJldGFcXzFYKSBlbnRyZSBpbmZpbml0byBwb3NpdGl2byB5IG5lZ2F0aXZvLCB5IGxhIHNhbGlkYSBQXGxlZnQoWVx8WFxyaWdodCkgZXN0YSBsaW1pdGFkbyBhIGxvcyB2YWxvcmVzIDAgeSAxLCBjb21vIHNlIG11ZXN0cmE6DQoNCjxjZW50ZXI+DQohW10ocmVncmVzaW9ubG9naXN0aWNhLmpwZykNCjwvY2VudGVyPg0KDQojIFJlZCBOZXVyb25hbCBBcnRpZmljaWFsDQoNCkxhIHJlZCBuZXVyb25hbCBhcnRpZmljaWFsIGVzIHVuIG1vZGVsbyBjb21wdXRhY2lvbmFsIHF1ZSBpbWl0YSBsYXMgY29uZXhpb25lcyBuZXVyb25hbGVzIGRlbCBjZXJlYnJvLCBpbnRlbnRhbmRvIHJlYWxpemFyIHRhcmVhcyBkZSBjbGFzaWZpY2FjacOzbiBkZSBtYW5lcmEgc2ltaWxhciBhbCBzZXIgaHVtYW5vLiBMYXMgbmV1cm9uYXMgbyB1bmlkYWRlcyBlc3TDoW4gY29uZWN0YWRhcyBkZSBtYW5lcmEgZGlyZWNjaW9uYWwgbyBiaWRpcmVjY2lvbmFsIHkgY2FkYSBjb25leGnDs24gdGllbmUgdW4gcGVzbyBwYXJhIHJlcHJlc2VudGFyIGxhIGZ1ZXJ6YSBkZSBsYXMgY29uZXhpb25lcyBuZXVyb25hbGVzLCBjb250YW5kbyBjb24gdW5pZGFkZXMgZGUgZW50cmFkYSB5IGRlIHNhbGlkYSAoQmllbSwgMjAxNSkuDQoNClVuYSByZWQgbmV1cm9uYWwgZXN0w6EgY29tcHVlc3RhIHBvciB1biBtb2RlbG8gbmV1cm9uYWwgcXVlIGluZGljYSBjb21vIHVuYSBuZXVyb25hIGRldnVlbHZlIHVuYSBzYWxpZGEgYSBwYXJ0aXIgZGUgZGF0b3MgZGUgZW50cmFkYSwgbGEgYXJxdWl0ZWN0dXJhIHF1ZSBkZXNjcmliZSBsYXMgY29uZXhpb25lcyBlbnRyZSBsYXMgbmV1cm9uYXMsIGxhIHBvbMOtdGljYSBkZSBjb2RpZmljYWNpw7NuLCBsYSBwb2zDrXRpY2EgZGUgY29kaWZpY2FjacOzbiBkZSBkYXRvcyBkZSBlbnRyYWRhIHkgZXRpcXVldGFzLCB5IHBvciDDumx0aW1vIGVsIGFsZ29yaXRtbyBkZSBlbnRyZW5hbWllbnRvIChCaWVtLCAyMDE1KS4NCg0KTGEgcmVkIG5ldXJvbmFsIGVzdMOhIGNvbcO6bm1lbnRlIGRlc2NyaXRhIGNvbW8gdW4gZ3JhZm8sIGRvbmRlIGxhcyBuZXVyb25hcyBzb24gbG9zIG5vZG9zIHkgc3VzIGNvbmV4aW9uZXMgc29uIGxhcyBhcmlzdGFzIHF1ZSB1bmVuIGxhIHNhbGlkYSBkZSB1bmEgbmV1cm9uYSBjb24gbGEgZW50cmFkYSBkZSBvdHJhLCBkZWZpbmllbmRvIGxhIGVudHJhZGEgY29tbyBsYSBzdW1hIHBvbmRlcmFkYSBkZSBsYXMgc2FsaWRhcyBkZSBsYXMgbmV1cm9uYXMgY29uZWN0YWRhcyBhIGVsbGEuIExhIHJlZCBuZXVyb25hbCBwdWVkZSBlc3RhciBkaXN0cmlidWlkYSBlbiBjYXBhcyBvIHN1YmNvbmp1bnRvcywgdGVuaWVuZG8gY29tbyB1bmEgY2FwYSBkZSBlbnRyYWRhIFYwIGRlIG4gKyAxIG5ldXJvbmFzLCBkb25kZSBuIGVzIGxhIGNhbnRpZGFkIGRlbCBlc3BhY2lvIGRlIGVudHJhZGEsIGxhIHNhbGlkYSBkZSBsYSBuZXVyb25hICRpJCBlbiAkVl8wJCBlcyAkeF9pJCwgbGEgw7psdGltYSBuZXVyb25hIGVuIGVzdGUgbml2ZWwgZXMgdW5hIGNvbnN0YW50ZSAxIChTaGFsZXYgJiBCZW4sIDIwMTQpLg0KDQpEZW5vdGFtb3MgJFZfdCxpJCwgZG9uZGUgdCBlcyBsYSBwcm9mdW5kaWRhZCBkZSBsYSByZWQgbyBsYSBjYW50aWRhZCBkZSBjYXBhcyBzaW4gbGEgY29uc2lkZXJhciAkVl8wJCwgY2FsY3VsYW5kbyBsYXMgc2FsaWRhcyBkZSBsYXMgbmV1cm9uYXMgZGUgbGEgY2FwYSB0LCBzZSBwb2Ryw6EgY2FsY3VsYXIgbGFzIHNhbGlkYXMgZGUgbGFzIG5ldXJvbmFzIGRlIGxhIGNhcGEgdCArIDEgY29tbyBzaWd1ZSwgY3VhbmRvIGxhIHJlZCBlcyBhbGltZW50YWRhIGNvbiBlbCB2ZWN0b3IgZGUgZW50cmFkYSB4LiBMYXMgY2FwYXMgJFZfMSQsIC4gLiAuLCAkVl9UIC0gMSQgc29uIGxhcyBjYXBhcyBvY3VsdGFzIHkgbGEgw7psdGltYSBlcyBsYSBjYXBhIGRlIHNhbGlkYS4gRW4gbGEgc2lndWllbnRlIGZpZ3VyYSBzZSBtdWVzdHJhIHVuYSByZWQgbmV1cm9uYWwgZGUgcHJvZnVuZGlkYWQgViA9IDIsIHRhbWHDsW8gMTAgeSBhbmNodXJhIDUsIGNvbiB1bmEgbmV1cm9uYSBlbiBsYSBjYXBhIG9jdWx0YSBxdWUgbm8gdGllbmUgYXJpc3RhcyBkZSBlbnRyYWRhIChTaGFsZXYgJiBCZW4sIDIwMTQpLg0KDQo8Y2VudGVyPg0KIVtdKHJlZG5ldXJvbmFsLmpwZykNCjwvY2VudGVyPg0K