hllinas2023

1 Librerías

1.0.1 Para PCA

El software R dispone de varias funciones de diferentes paquetes para calcular PCA:

  • prcomp y princomp, del paquete stats.

  • PCA del paquete FactoMineR.

  • dudi.pca del paquete ade4.

  • epPCA del paquete ExPosition.

Sin importar la función que elija emplear, es posible extraer y representar de manera sencilla los resultados del PCA mediante las funciones del paquete factoextra. En este documento, se hará uso de los paquetes FactoMineR y ade4 para los análisis y factoextra para la visualización basada en ggplot2.

library(FactoMineR)
library(factoextra)
library(ade4)

1.0.2 Para otros análisis

library(aplore3)       #Base de datos para los ejemplos
library(lsm)           #Base de datos para ejemplos y estimaciones del Log-verosimilitud
library(tidyverse)     #Incluye a dplyr y ggplot2
library(stringr)       #Reemplazar caracteres en un data frame
library(outliers)      #outliers::grubbs.test
library(EnvStats)      #EnvStats::rosnerTest
library(DMwR2)         #LOF (Local Outlier Factor)
library(rgl)           #rgl::plot3d
library(corrplot)      #Matriz de correlaciones
library(textshape)     #column_to_rownames

2 Introducción

2.0.1 Preliminares

Es un método de interdependencia para resumir la información contenida en las variables y facilitar su análisis. El ACP transforma el conjunto de variables originales en un subconjunto más pequeño de variables (véase la figura 2.1).

**Reducción de la dimensión**

Figure 2.1: Reducción de la dimensión

Estas variables son combinaciones lineales de las primeras, que contienen mayor parte de la variabilidad presente en el conjunto inicial. Para aplicar esta técnica se requiere que las variables sean cuantitativas (véase la figura 2.2).

**Resumen y visualización de datos multivariados**

Figure 2.2: Resumen y visualización de datos multivariados

2.0.2 Propósito

Su objetivo general es lograr una reducción de datos que facilite la interpretación . En este sentido, el método se aplica para representar óptimamente en un espacio de dimensión pequeña, observaciones de un espacio general K-dimensional. Por esta razón, la técnica se considera como el primer paso para identificar posibles variables latentes o no observadas, que están generando la variabilidad de los datos. Siempre está basada en describir la estructura de la matriz de covarianza de un conjunto de variables mediante la utilización de combinaciones lineales de estas variables .

Con esta técnica se busca transformar las variables originales (en general, correladas), en nuevas variables incorreladas, facilitando la interpretación de los datos.

Aunque se requieren las \(N\) componentes principales para reproducir toda la variabilidad del sistema, en la práctica, la mayor parte de esta variabilidad suele explicarse mediante un número reducido \(J\) de componentes principales. En tales casos, las \(J\) primeras componentes principales sustituyen a las \(N\) variables originales, generando así una simplificación del sistema original.

2.0.3 Ejemplo: Pingüino

Este ejemplo (véase la figura 2.3) ilustra la reducción de la dimensionalidad de un conjunto de datos tridimensionales a dos dimensiones.

**Pingüino**

Figure 2.3: Pingüino

Inicialmente, aparte del estiramiento de los puntos, no se percibe una estructura clara en la distribución de los puntos. Sin embargo, al elegir una rotación adecuada, podemos revelar la estructura subyacente. Esta rotación puede ser concebida como una exploración del conjunto tridimensional, buscando el ángulo óptimo para visualizar los datos. El Análisis de Componentes Principales (ACP) puede ser útil para descubrir esta estructura subyacente. Selecciona una rotación de tal manera que la mayor parte de la variabilidad del conjunto de datos esté capturada en las primeras dimensiones de los datos rotados. Aunque pueda parecer poco útil en nuestro caso tridimensional, este enfoque se vuelve muy poderoso cuando los datos tienen muchas dimensiones (decenas de dimensiones).

2.0.4 Características

  1. PCA supone que las direcciones con las mayores varianzas son las más “importantes”, ya que representan las direcciones donde los datos presentan la mayor dispersión y, por tanto, contienen la mayor cantidad de información del conjunto de datos.

  2. En la figura 2.4:

    • El eje PC1 representa la primera dirección principal, es decir, la dirección a lo largo de la cual las muestras presentan la máxima variación.

    • El eje PC2 corresponde a la segunda dirección principal y es ortogonal a PC1.

    • En la figura 2.4b, después de proyectar los datos sobre el nuevo sistema de coordenadas definido por las componentes principales, se observa que la mayor dispersión de los datos ocurre a lo largo de PC1, mientras que la variación sobre PC2 es considerablemente menor.

**Dispersión y PCA**

Figure 2.4: Dispersión y PCA

  1. La dimensionalidad de nuestros datos bidimensionales puede reducirse a una sola dimensión proyectando cada muestra sobre el primer componente principal (véase la figura @ref(fig:PCA3)b). Esto es posible porque PC1 retiene la mayor parte de la variabilidad presente en los datos originales.

  2. Desde el punto de vista técnico, la medida de la cantidad de varianza retenida por cada componente principal se determina a través del valor propio correspondiente.

  3. Es importante resaltar que PCA resulta especialmente beneficioso cuando las variables del conjunto de datos presentan una alta correlación. Una alta correlación indica la existencia de redundancia, es decir, que varias variables contienen información similar o parcialmente repetida (véase la figura 2.5). En estas situaciones, gran parte de la variabilidad total de los datos puede describirse mediante un número reducido de direcciones principales.

    • Baja redundancia: las variables aportan información diferente y, por tanto, se requieren más componentes para representar adecuadamente la variabilidad del conjunto de datos.

    • Alta redundancia: las variables contienen información similar debido a su fuerte correlación, permitiendo que la mayor parte de la variabilidad se concentre en pocos componentes principales.

    Aprovechando esta redundancia, PCA transforma las variables originales en un conjunto menor de nuevas variables denominadas componentes principales. Estos componentes principales conservan la mayor parte de la varianza presente en las variables originales, permitiendo reducir la dimensionalidad del conjunto de datos con una pérdida mínima de información.

**Tipos de redundancia**

Figure 2.5: Tipos de redundancia

  1. En situaciones de alta redundancia, como en la figura 2.5b, las variables originales aportan información muy parecida. Por esta razón, una sola componente principal puede representar adecuadamente la mayor parte de la estructura y variabilidad de los datos.

2.0.5 Conclusión

En resumen, el objetivo principal del análisis de componentes principales es:

  • Identificar patrones ocultos en un conjunto de datos.

  • Reducir la dimensionalidad de los datos eliminando el ruido y la redundancia en los datos.

  • Identificar variables correlacionadas.

3 Pasos para realizar un PCA

Vamos a explicar el PCA paso a paso sin utilizar demasiada terminología matemática avanzada. En general, se puede visualizar en la figura 3.1.

**Pasos generales para aplicar un PCA**

Figure 3.1: Pasos generales para aplicar un PCA

3.0.1 Paso 1: Describir los Datos y objetivo

Suponga que, en un estudio realizado sobre \(n\) individuos, se tiene un vector \(X=(X_1, X_2, \ldots, X_K)^T\) de tamaño \(K\). El objetivo es encontrar nuevas variables notadas como \(Y_j\), \(j=1, \ldots, J\), que sean combinaciones lineales de las variables originales \(X_k\).

3.0.2 Paso 2: Definir las componentes principales

Se procede de la siguiente manera:

Observación 2.1:

La primera componente principal \(Y_1\) es una combinación lineal de las variables originales que captura la máxima variabilidad posible contenida en los datos:

\[ Y_1 \;=\; a_{11}\, X_1 \;+\; a_{12}\, X_2 \;+\; \cdots \;+\; a_{1K}\, X_K \;=\; a_1^T X \]

donde

\[ a_1=(a_{11},a_{12},\ldots,a_{1K})^T \]

es un vector unitario escogido de tal forma que maximice la varianza de \(Y_1\), sujeto a la restricción:

\[ a_1^T \, a_1 \;=\; \sum_{k=1}^{K} a_{1k}^2 \;=\; 1 \]

Observación 2.2:

La segunda componente principal \(Y_2\) es otra combinación lineal de las variables originales:

\[ Y_2 \;=\; a_{21}\, X_1 \;+\; a_{22}\, X_2 \;+\; \cdots \;+\; a_{2K}\, X_K \;=\; a_2^T \, X \]

donde:

  • \(Y_2\) es incorrelada con \(Y_1\), es decir,

\[ Cov(Y_1,Y_2)=0 \]

  • y captura la mayor parte de la variabilidad restante de los datos bajo la restricción de ser ortogonal a \(Y_1\).

Observación 2.3:

Del mismo modo se construyen las componentes principales

\[ Y_1, Y_2, \ldots, Y_J \]

de manera que:

  • sean incorreladas entre sí,

  • estén asociadas a direcciones ortogonales,

  • y expliquen cantidades decrecientes de varianza.

Observación 2.4:

La \(j\)-ésima componente principal se define como:

\[ Y_j \;=\; a_{j1}\, X_1 + a_{j2}\, X_2 + \cdots + a_{jK}\, X_K \;=\; a_j^T \, X \]

donde

\[ a_j\;=\;(a_{j1},a_{j2},\ldots,a_{jK})^T \]

es un vector unitario que satisface:

\[ a_j^T a_j \;=\; \sum_{k=1}^{K} a_{jk}^2 \;=\; 1 \]

Además, los vectores asociados a distintas componentes principales son ortogonales entre sí.

Observación 2.5:

La varianza de \(Y_j\) se obtiene utilizando la propiedad de las combinaciones lineales de variables aleatorias:

\[ V(AX)=A\,Cov(X)\,A^T \]

Como la matriz de covarianzas del vector aleatorio \(X\) se denota por:

\[ Cov(X)=\Sigma \]

entonces:

\[ V(Y_j) = V(a_j^T\, X) = a_j^T \, \Sigma \, a_j \]

La expresión

\[ a_j^T \Sigma \, a_j \]

corresponde a la forma matricial compacta de calcular la varianza de una combinación lineal de variables aleatorias.

Por ejemplo, en el caso de dos variables:

\[ Y\; =\; a_1X_1\; +\; a_2X_2 \]

la varianza viene dada por:

\[ V(Y) \; =\; a_1^2\, V(X_1) \; +\; a_2^2\,V(X_2) \; +\; 2\,a_1\,a_2\,Cov(X_1,X_2) \]

Ahora, si definimos:

\[ a= \begin{bmatrix} a_1\\ a_2 \end{bmatrix} \quad \mbox{y} \quad \Sigma= \begin{bmatrix} V(X_1) & Cov(X_1,X_2)\\ Cov(X_1,X_2) & V(X_2) \end{bmatrix} \]

entonces:

\[ a^T\Sigma a \]

produce exactamente la misma expresión anterior. Por tanto, la fórmula:

\[ V(Y_j)\; =\; a_j^T\; \Sigma \; a_j \]

es simplemente la generalización matricial de la varianza de una combinación lineal de múltiples variables aleatorias.

Observación 2.6:

En general, el objetivo consiste en elegir el vector \(a_j\) de manera que maximice la varianza de \(Y_j\), sujeto a la restricción:

\[ a_j^T a_j = 1 \]

y a la condición de ortogonalidad respecto a las componentes principales previamente obtenidas.

Observación 2.7:

Las componentes principales

\[ Y_1,Y_2,\ldots,Y_K \]

resumen la variabilidad total del conjunto de datos en orden decreciente de importancia. En consecuencia, las primeras componentes principales explican la mayor parte de la varianza de los datos originales.

Observación 2.8:

Geométricamente, PCA puede interpretarse como una rotación del sistema de coordenadas original hacia nuevas direcciones ortogonales que maximizan la variabilidad de los datos.

Observación 2.9:

El procedimiento matemático comúnmente utilizado para maximizar funciones bajo restricciones corresponde al método de los multiplicadores de Lagrange.

3.0.3 Paso 3: Matriz de covarianzas o matriz de correlaciones

Existen dos formas habituales de aplicar PCA.

Primera forma 3.1: Matriz de correlaciones

Se recomienda utilizar la matriz de correlaciones cuando:

  • las variables originales se encuentran en diferentes unidades de medida,

  • o las variables presentan varianzas muy diferentes entre sí.

En este caso, normalmente se requiere estandarizar previamente los datos.

Segunda forma 3.2: Matriz de covarianzas

Se recomienda utilizar la matriz de covarianzas \(\Sigma\) cuando:

  • las variables originales se encuentran en las mismas unidades,

  • y se desea conservar la información proporcionada por las diferencias naturales de variabilidad entre las variables.

Observación 3.3:

Si las variables comparten unidades similares, ambas alternativas son factibles. En situaciones de incertidumbre, puede resultar útil realizar ambos análisis y comparar los resultados obtenidos.

Observación 3.4:

En los pasos siguientes se considerará únicamente la matriz de covarianzas.

3.0.4 Paso 4: Cálculo de vectores y valores propios

Se calculan los valores propios y vectores propios de la matriz de covarianzas \(\Sigma\).

Si \(a_j\) es un vector propio de \(\Sigma\) asociado al valor propio \(\lambda_j\), entonces se cumple:

\[ \Sigma \, a_j \;=\; \lambda_j\, a_j \]

Como:

\[ V(Y_j) \;=\; V(a_j^T \, X) \;=\; a_j^T \, \Sigma \, a_j \]

entonces:

\[ V(Y_j) \;=\; a_j^T\, (\lambda_j \, a_j) \;=\; \lambda_j \, a_j^T\, a_j \]

y dado que:

\[ a_j^T \, a_j \;=\; 1 \]

se obtiene:

\[ V(Y_j)\;=\;\lambda_j \]

Por tanto:

  • cada valor propio representa la varianza explicada por una componente principal,

  • y cada vector propio define la dirección principal correspondiente.

En consecuencia, las componentes principales vienen dadas por:

\[ Y_j\;=\;a_j^T X, \quad j=1,\ldots,K \]

3.0.5 Paso 5: Selección de componentes principales

Una vez obtenidas las componentes principales, se seleccionan aquellas que expliquen una proporción suficientemente alta de la variabilidad total del conjunto de datos.

Algunos criterios habitualmente utilizados son:

  • Retener las componentes necesarias para alcanzar un porcentaje acumulado de varianza explicada (por ejemplo, 70%, 80% o 90%).

  • Utilizar el criterio de Kaiser, el cual sugiere conservar únicamente las componentes cuyos valores propios satisfacen:

\[ \lambda_j > 1 \]

  • Analizar visualmente el gráfico Scree Plot para identificar el punto de inflexión a partir del cual los valores propios decrecen lentamente.

Observación 5.1:

Los valores propios

\[ \lambda_1,\, \lambda_2,\, \ldots,\, \lambda_K \]

representan la cantidad de variabilidad explicada por cada componente principal.

Observación 5.2:

Los valores propios asociados a las componentes principales corresponden a sus respectivas varianzas. Es decir:

\[ V(Y_j)\;=\; \lambda_j, \quad j=1,2,\ldots,K \]

Observación 5.3:

Los valores propios se ordenan de mayor a menor:

\[ \lambda_1 \;\geq\; \lambda_2 \;\geq\; \cdots \;\geq\; \lambda_K \]

Por consiguiente, las primeras componentes principales concentran la mayor parte de la variabilidad total del conjunto de datos.

Observación 5.4:

La proporción de varianza explicada por la componente principal \(j\) se calcula mediante:

\[ \frac{\lambda_j}{\sum\limits_{k=1}^{K}\lambda_k} \]

mientras que la proporción acumulada de varianza explicada viene dada por:

\[ \frac{\sum\limits_{j=1}^{m}\lambda_j} {\sum\limits_{k=1}^{K}\lambda_k} \]

donde \(m\) representa el número de componentes principales retenidas.

3.0.6 Paso 6: Proyección de los datos

Las observaciones originales se proyectan sobre las nuevas direcciones definidas por los vectores propios asociados a las componentes principales.

Si:

  • \(x_i\) representa la observación \(i\), con \(i=1,2,\ldots,n\)

  • y \(a_j\) representa el vector propio asociado a la componente principal \(j\), con \(j=1,2,\ldots,K\)

entonces la coordenada proyectada viene dada por:

\[ y_{ij}=a_j^T x_i \]

donde \(y_{ij}\) representa la coordenada de la observación \(i\) sobre la componente principal \(j\).

En forma matricial:

\[ Y = XA \]

donde:

\[ X\; =\; \begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1K}\\ x_{21} & x_{22} & \cdots & x_{2K}\\ \vdots & \vdots & \ddots & \vdots\\ x_{n1} & x_{n2} & \cdots & x_{nK} \end{bmatrix} \]

corresponde a la matriz de datos originales, con:

  • \(n\) observaciones (filas),

  • y \(K\) variables originales (columnas).

La matriz de vectores propios viene dada por:

\[ A\; =\; \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1K}\\ a_{21} & a_{22} & \cdots & a_{2K}\\ \vdots & \vdots & \ddots & \vdots\\ a_{K1} & a_{K2} & \cdots & a_{KK} \end{bmatrix} \; =\; \begin{bmatrix} a_1 & a_2 & \cdots & a_K \end{bmatrix} \]

donde cada columna \(a_j\) corresponde al vector propio asociado a la componente principal \(j\).

Finalmente, la matriz proyectada viene dada por:

\[ Y\; =\; \begin{bmatrix} y_{11} & y_{12} & \cdots & y_{1K}\\ y_{21} & y_{22} & \cdots & y_{2K}\\ \vdots & \vdots & \ddots & \vdots\\ y_{n1} & y_{n2} & \cdots & y_{nK} \end{bmatrix} \]

donde:

\[ y_{ij}=a_j^T x_i \]

representa la coordenada de la observación \(i\) proyectada sobre la componente principal \(j\).

3.0.7 Paso 7: Visualización e interpretación

Finalmente, los datos proyectados sobre las componentes principales pueden visualizarse para:

  • identificar patrones,

  • detectar agrupamientos,

  • analizar relaciones entre variables,

  • explorar redundancias,

  • y describir la estructura general del conjunto de datos.

En muchos casos, las primeras dos componentes principales permiten representar adecuadamente gran parte de la variabilidad total mediante gráficos bidimensionales.

4 Propiedades según la matriz de varianzas y covarianzas

4.0.1 Propiedades básicas

Propiedad 1:

La influencia de la variable original \(X_k\) sobre la componente principal \(Y_j\) está determinada por la magnitud del coeficiente \(a_{jk}\).

En general:

  • valores grandes de \(|a_{jk}|\) indican una mayor contribución de la variable \(X_k\) a la componente principal \(Y_j\),

  • mientras que valores cercanos a cero indican una contribución reducida.

Propiedad 2:

Recordemos que la matriz de covarianzas viene dada por:

\[ \Sigma= \begin{bmatrix} Cov(X_1,X_1) & Cov(X_1,X_2) & \cdots & Cov(X_1,X_K)\\ Cov(X_2,X_1) & Cov(X_2,X_2) & \cdots & Cov(X_2,X_K)\\ \vdots & \vdots & \ddots & \vdots\\ Cov(X_K,X_1) & Cov(X_K,X_2) & \cdots & Cov(X_K,X_K) \end{bmatrix} \]

Por tanto:

\[ Cov(X_k,X) = \begin{bmatrix} Cov(X_k,X_1)\\ Cov(X_k,X_2)\\ \vdots\\ Cov(X_k,X_K) \end{bmatrix} \]

contiene las covarianzas entre la variable \(X_k\) y cada una de las variables originales. Teniendo en cuentqa llo anterior y utilizando la linealidad de la covarianza, la covarianza entre la variable original \(X_k\) y la componente principal \(Y_j\) viene dada por:

\[ Cov(X_k,Y_j) \;=\; Cov(X_k,\; a_j^T\, X) \;=\; \sum_{i=1}^{K}a_{ij} \, Cov(X_k,X_i) \;=\; Cov(X_k,X)^T a_j \]

Por consiguiente:

\[ Cov(X_k,Y_j) \;=\; \begin{bmatrix} Cov(X_k,X_1) & Cov(X_k,X_2) & \cdots & Cov(X_k,X_K) \end{bmatrix} \, a_j \]

Ahora, recordemos que:

\[ \Sigma\, a_j\;=\;\lambda_j \,a_j \]

Por tanto, la \(k\)-ésima entrada del vector \(\Sigma a_j\) viene dada por:

\[ \sum_{i=1}^{K}Cov(X_k,X_i)\, a_{ij} \;=\; \lambda_j \, a_{kj} \]

Luego:

\[ Cov(X_k,Y_j) \;=\; \lambda_j \, a_{kj} \]

Propiedad 3:

Sabemos que:

\[ V(AX)=A\,V(X)\,A^T \]

o equivalentemente, para vectores columna:

\[ V(a_j^T X)=a_j^T\,V(X)\,a_j \]

Por consiguiente, la varianza de la componente principal \(Y_k\) viene dada por:

\[ V(Y_j) \;=\; V(a_j^T X) \;=\; a_j^T\, V(X)\, a_j \;=\; a_j^T\, \Sigma\, a_j \;=\; a_j^T\, \lambda_j \, a_j \;=\; \lambda_j (a_j^T\, a_j) \;=\; \lambda_j \]

Por tanto, cada valor propio \(\lambda_j\) representa la varianza explicada por la correspondiente componente principal.

Propiedad 4:

Para todo \(j\neq \ell\), las componentes principales \(Y_j\) y \(Y_\ell\) son incorreladas. Es decir:

\[ Cov(Y_j,Y_\ell)=0 \]

Esta propiedad garantiza que cada componente principal aporta información nueva no contenida en las demás componentes principales.

Propiedad 5:

Los vectores propios asociados a valores propios distintos son ortogonales entre sí. Es decir, para todo \(j\neq s\):

\[ a_j^T\, a_s=0 \]

Sabemos que:

\[ Y_j\; =\; a_j^T\, X \quad\mbox{y}\quad Y_s\; =\;a_s^T\, X \]

Teniendo en cuenta que \[ Cov(AU,BW) \, =\; A\,Cov(U,W)\,B^T \]

donde:

  • \(U\) y \(W\) son vectores aleatorios,

  • \(A\) y \(B\) son matrices de constantes,

entonces:

\[ Cov(Y_j,Y_s) \;=\; Cov(a_j^T\, X, \; a_s^T\, X) \;=\; a_j^T\, Cov(X,X) \, a_s \;=\; a_j^T\, \Sigma \, a_s \;=\; a_j^T\,\lambda_\ell a_s \;=\; \lambda_s a_j^Ta_s \;=\; 0 \]

debido a la ortogonalidad entre los vectores propios.

Propiedad 6:

Todas las componentes principales pueden expresarse matricialmente como:

\[ Y\;=\;XA \]

donde:

\[ Y\;=\; \begin{bmatrix} y_{11} & y_{12} & \cdots & y_{1K}\\ y_{21} & y_{22} & \cdots & y_{2K}\\ \vdots & \vdots & \ddots & \vdots\\ y_{n1} & y_{n2} & \cdots & y_{nK} \end{bmatrix} \]

es la matriz de datos proyectados,

\[ X\;=\; \begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1K}\\ x_{21} & x_{22} & \cdots & x_{2K}\\ \vdots & \vdots & \ddots & \vdots\\ x_{n1} & x_{n2} & \cdots & x_{nK} \end{bmatrix} \]

es la matriz de datos originales, y

\[ A\;=\; \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1K}\\ a_{21} & a_{22} & \cdots & a_{2K}\\ \vdots & \vdots & \ddots & \vdots\\ a_{K1} & a_{K2} & \cdots & a_{KK} \end{bmatrix} \;=\; \begin{bmatrix} a_1 & a_2 & \cdots & a_K \end{bmatrix} \]

es la matriz cuyos vectores columna corresponden a los vectores propios asociados a las componentes principales.

Propiedad 7:

La matriz de covarianzas de las componentes principales viene dada por:

\[ \Lambda \;=\; V(Y) \;=\; V(XA) \;=\; A^T\, V(X)\, A \;=\; A^T\, \Sigma \, A \]

donde:

\[ \Lambda\;=\; \begin{bmatrix} \lambda_1 & 0 & \cdots & 0\\ 0 & \lambda_2 & \cdots & 0\\ \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & \cdots & \lambda_K \end{bmatrix} \]

es una matriz diagonal cuyos elementos diagonales corresponden a los valores propios de \(\Sigma\).

La diagonalidad de \(\Lambda\) refleja que las componentes principales son incorreladas entre sí.

Interpretación geométrica profunda

Antes de aplicar PCA, la matriz de covarianzas:

\[ \Sigma= \begin{bmatrix} \sigma_1^2 & cov_{12}\\ cov_{21} & \sigma_2^2 \end{bmatrix} \]

presenta elementos fuera de la diagonal distintos de cero. Esto indica que las variables originales están correlacionadas entre sí.

Geométricamente:

  • las variables contienen información redundante,

  • la nube de datos aparece inclinada respecto a los ejes originales,

  • y existe dependencia lineal entre las variables.

Después de aplicar PCA, la matriz de covarianzas de las componentes principales toma la forma:

\[ \Lambda= \begin{bmatrix} \lambda_1 & 0\\ 0 & \lambda_2 \end{bmatrix} \]

Ahora:

  • las covarianzas fuera de la diagonal desaparecen,

  • las componentes principales son incorreladas entre sí,

  • la nube de datos queda alineada con los nuevos ejes principales,

  • y la variabilidad de los datos queda desacoplada en direcciones ortogonales.

En consecuencia, PCA transforma un sistema de variables correlacionadas en un nuevo sistema de variables incorreladas, facilitando la interpretación y reducción de dimensionalidad.

Propiedad 8:

La matriz \(A\) es ortogonal porque sus columnas forman un conjunto ortonormal de vectores propios. Es decir:

\[ a_i^Ta_j= \begin{cases} 1, & i=j\\ 0, & i\neq j \end{cases} \]

Esto significa que cada vector propio tiene norma igual a 1 y que vectores propios distintos son ortogonales entre sí.

Por tanto:

\[ A^TA=AA^T=I_K \]

donde:

\[ I_K= \begin{bmatrix} 1 & 0 & \cdots & 0\\ 0 & 1 & \cdots & 0\\ \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & \cdots & 1 \end{bmatrix} \]

corresponde a la matriz identidad de dimensión \(K\times K\).

Propiedad 9:

Teniendo en cuenta las propiedades anteriores, la matriz de covarianzas puede descomponerse como:

\[ \Sigma\; =\; A\, \Lambda \, A^T \]

Esta descomposición espectral expresa la matriz de covarianzas original en función de:

  • sus vectores propios (contenidos en la matriz \(A\)),

  • y sus valores propios (contenidos en la matriz diagonal \(\Lambda\)).

Geométricamente, esta descomposición representa una rotación del sistema de coordenadas original hacia un nuevo sistema definido por las componentes principales.

En este nuevo sistema:

  • las componentes principales quedan incorreladas entre sí,

  • la matriz de covarianzas se vuelve diagonal,

  • y la variabilidad de los datos queda distribuida a lo largo de direcciones ortogonales.

Además, los valores propios de \(\Lambda\) indican la cantidad de varianza explicada por cada componente principal.

4.0.2 Porcentajes de variabilidad

Propiedad 10:

La varianza total de las componentes principales corresponde a la suma de todos los valores propios, es decir, a la traza de la matriz diagonal \(\Lambda\):

\[ \mbox{Varianza total} \; =\; \sum_{j=1}^{K}V(Y_j) \; =\; \sum_{j=1}^{K}\lambda_j \; =\; \mbox{traza}(\Lambda) \]

Propiedad 11:

Teniendo en cuenta las propiedades anteriores:

\[ \Lambda\; =\;A^T\, \Sigma \, A \]

y

\[ A\, A^T\; =\;I_K \]

además de las propiedades del operador traza, se tiene que:

\[ \mbox{traza}(\Lambda) \; =\; \mbox{traza}(A^T\Sigma A) \; =\; \mbox{traza}(\Sigma A A^T) \; =\; \mbox{traza}(\Sigma) \]

Por tanto, la varianza total de las componentes principales coincide con la varianza total de las variables originales.

Propiedad 12:

La suma de las varianzas de las variables originales es igual a la suma de las varianzas de las componentes principales:

\[ \mbox{Varianza total} \; =\; \mbox{traza}(\Lambda) \; =\; \mbox{traza}(\Sigma) \; =\; \sum_{k=1}^{K}Var(X_k) \]

Propiedad 13:

La proporción de varianza total explicada por la componente principal \(Y_j\) viene dada por:

\[ \mbox{Prop.}\;V(Y_j) \; =\; \frac{\lambda_j}{\mbox{Varianza total}} \]

Si se multiplica por 100, se obtiene el porcentaje de variabilidad explicado por dicha componente principal.

Propiedad 14:

La proporción acumulada de varianza explicada por las primeras \(J\) componentes principales viene dada por:

\[ \mbox{Prop.}\;V(Y_{1\to J}) \; =\; \frac{\sum\limits_{j=1}^{J}\lambda_j} {\mbox{Varianza total}} \]

donde:

\[ J<K \]

Si se multiplica por 100, se obtiene el porcentaje acumulado de variabilidad explicado por las primeras \(J\) componentes principales.

En aplicaciones prácticas, cuando inicialmente se dispone de \(K\) variables, generalmente se selecciona un número considerablemente menor de componentes principales que logren explicar una gran proporción de la variabilidad total de los datos.

En muchos casos, se procura seleccionar pocas componentes principales para facilitar tanto la interpretación como la representación gráfica de los datos.

5 Propiedades según la matriz de correlaciones

Normalmente, los componentes principales se calculan utilizando variables estandarizadas, es decir, variables con media igual a 0 y varianza igual a 1.

En este caso, los componentes principales no se obtienen a partir de la matriz de covarianzas \(\Sigma\), sino de la matriz de correlaciones \(R\).

  • La matriz de covarianzas de las variables estandarizadas coincide con la matriz de correlaciones de las variables originales.

  • Por tanto, las componentes principales corresponden a los vectores propios de la matriz de correlaciones.

  • Este enfoque evita que variables con escalas grandes dominen el análisis únicamente debido a sus unidades de medida.

En la matriz de correlaciones:

  • todos los elementos diagonales son iguales a 1,

  • y los elementos fuera de la diagonal corresponden a coeficientes de correlación.

El procedimiento matemático es análogo al realizado con la matriz de covarianzas, sustituyendo \(\Sigma\) por \(R\).

Sin embargo, existen algunas diferencias importantes en la interpretación, las cuales se describen en las propiedades siguientes.

Propiedad 15:

Si las variables originales han sido tipificadas, entonces:

\[ Var(X_k)\; =\;1, \quad k=1,2,\ldots,K \]

Por tanto, la varianza total coincide con el número total de variables:

\[ \mbox{Varianza total} \; =\; \sum_{k=1}^{K}Var(X_k) \; =\; \sum_{k=1}^{K}1 \; =\; K \]

Propiedad 16:

La suma de todos los valores propios es igual a \(K\):

\[ \sum_{j=1}^{K}\lambda_j \; =\; K \]

Propiedad 17:

La proporción de varianza explicada por la componente principal \(Y_j\) viene dada por:

\[ \mbox{Prop.}\;V(Y_j) \; =\; \frac{\lambda_j}{\mbox{Varianza total}} \; =\; \frac{\lambda_j}{K} \]

Propiedad 18:

La proporción acumulada de varianza explicada por las primeras \(J\) componentes principales viene dada por:

\[ \mbox{Prop.}\;V(Y_{1\to J}) \; =\; \frac{\sum\limits_{j=1}^{J}\lambda_j} {\mbox{Varianza total}} \; =\; \frac{\sum\limits_{j=1}^{J}\lambda_j}{K} \]

Propiedad 19:

La correlación entre la variable original \(X_k\) y la componente principal \(Y_j\) viene dada por:

\[ Corr(X_k,Y_j) \; =\; \frac{Cov(X_k,Y_j)} {\sqrt{Var(X_k)}\ \sqrt{Var(Y_j)}} \; =\; \frac{a_{kj}\, \lambda_j} {\sqrt{\sigma^2 _{k}} \; \sqrt{\lambda_j}} \;=\; \frac{a_{kj}\, \sqrt{\lambda_j}} {\sigma_{k}} \]

donde:

  • \(a_{kj}\) corresponde al coeficiente de la variable \(X_k\) en la componente principal \(Y_j\),

  • \(\lambda_j\) es el valor propio asociado a la componente principal \(Y_j\),

  • y \(\sigma^2_{k}\) corresponde a la varianza de la variable original \(X_k\).

Propiedad 20:

En el caso de variables estandarizadas:

\[ \sigma_{k}\; =\;1 \]

y por tanto:

\[ Corr(X_k,Y_j) \; =\; a_{kj} \, \sqrt{\lambda_j} \]

Esta correlación indica el grado de asociación entre la variable original y la correspondiente componente principal.

Propiedad 21:

Frecuentemente, los coeficientes de los vectores propios se ajustan teniendo en cuenta la variabilidad explicada por cada componente principal. Para ello, se multiplican por la raíz cuadrada del valor propio correspondiente:

\[ a_{kj}^* = a_{kj}\sqrt{\lambda_j} \]

Estas cantidades reciben el nombre de cargas (loadings) y permiten medir el grado de asociación entre la variable original \(X_k\) y la componente principal \(Y_j\).

En consecuencia:

  • componentes principales con mayor varianza explicada producen cargas más grandes,

  • mientras que componentes con baja variabilidad reducen la magnitud de las cargas.

Por esta razón, las cargas permiten interpretar simultáneamente:

  • la dirección del componente principal,

  • y su importancia en términos de variabilidad explicada.

Ejemplo sencillo

Supongamos que para la componente principal \(Y_1\) se obtiene:

\[ a_{1}\; =\; \begin{bmatrix} a_{11}\\ a_{21} \end{bmatrix} \;=\; \begin{bmatrix} 0.8\\ 0.6 \end{bmatrix} \]

y que el valor propio asociado es:

\[ \lambda_1=9 \]

Entonces:

\[ \sqrt{\lambda_1}=\sqrt{9}=3 \]

Las cargas (loadings) se calculan como:

\[ a_{k1}^* = a_{k1}\sqrt{\lambda_1} \]

Por tanto:

\[ a_{11}^* = 0.8(3) = 2.4 \]

y

\[ a_{21}^* = 0.6(3) = 1.8 \]

En consecuencia, las cargas asociadas a la primera componente principal son:

\[ a_{1}^*\; =\; \begin{bmatrix} a_{11}^*\\ a_{21}^* \end{bmatrix} \;=\; \begin{bmatrix} 2.4\\ 1.8 \end{bmatrix} \]

Interpretación:

  • la variable \(X_1\) tiene una asociación más fuerte con la componente principal \(Y_1\),

  • mientras que \(X_2\) también contribuye, aunque en menor magnitud.

Además, el valor propio grande (\(\lambda_1=9\)) indica que esta componente principal explica una gran cantidad de variabilidad en los datos.

6 Selección del número de componentes principales

La elección del número de componentes principales se basa en criterios empíricos que consideran la proporción de variabilidad que se desea conservar. No existe una regla única y universalmente aceptada para decidir cuántas componentes principales son suficientes. Por esta razón, suelen utilizarse varios criterios complementarios.

6.0.1 Primera forma: Porcentaje de varianza explicada

Se selecciona un número \(J<K\) de componentes principales cuando las primeras \(J\) componentes explican una proporción suficientemente alta de la variabilidad total:

\[ \mbox{Prop.}\;V(Y_{1\to J}) = \frac{\sum_{j=1}^{J}\lambda_j} {\sum_{j=1}^{K}\lambda_j} \]

En este caso:

  • La idea es elegir el menor número de componentes principales que permita conservar una proporción alta de la información original, por ejemplo, 70%, 80%, 90% o 95%, según el contexto del análisis.

De esta manera, las variables originales \(X_1,X_2,\ldots,X_K\) pueden resumirse mediante un número menor de componentes principales \(Y_1,Y_2,\ldots,Y_J\), conservando la mayor parte de la variabilidad total de los datos.

6.0.2 Segunda forma: Valores propios

Cuando se utiliza la matriz de correlaciones, los valores propios también pueden emplearse para decidir cuántas componentes principales conservar.

  • Un criterio frecuente es el criterio de Kaiser, según el cual se retienen las componentes principales con valores propios mayores que 1:

\[ \lambda_j>1 \]

La razón es que, en datos estandarizados, cada variable original tiene varianza igual a 1. Por tanto, una componente con \(\lambda_j>1\) explica más variabilidad que una variable original individual.

Este criterio debe usarse principalmente cuando el PCA se realiza sobre la matriz de correlaciones o sobre datos estandarizados.

6.0.3 Tercera forma: Métodos gráficos

Un método gráfico común consiste en analizar el Scree Plot. Este gráfico presenta las componentes principales en el eje horizontal y sus valores propios, o la proporción de varianza explicada, en el eje vertical.

  • El criterio consiste en identificar el punto de inflexión o “codo” de la curva. A partir de ese punto, los incrementos en varianza explicada suelen ser pequeños, por lo que añadir más componentes aporta poca información adicional.

En la figura 6.1, se observa que la proporción de varianza explicada acumulada aumenta rápidamente con las primeras componentes y luego tiende a estabilizarse. En este caso, una elección razonable podría ser conservar las primeras tres componentes principales, ya que explican aproximadamente el 95% de la variabilidad acumulada.

**Scree Plot: varianza explicada acumulada**

Figure 6.1: Scree Plot: varianza explicada acumulada

7 Interpretación de las componentes principales

Primera interpretación.

  • Cuando las variables originales presentan fuertes correlaciones positivas entre sí, la primera componente principal suele presentar coeficientes del mismo signo en su vector propio asociado.

  • En este caso, la primera componente principal puede interpretarse como una combinación ponderada de todas las variables originales.

  • Geométricamente, esta componente representa la dirección de máxima variabilidad común compartida por las variables. Por esta razón, frecuentemente se interpreta como un factor global de tamaño, intensidad o magnitud general.

Segunda interpretación.

Las componentes principales restantes suelen presentar coeficientes positivos y negativos en sus vectores propios asociados.

  • La presencia de signos opuestos indica que estas componentes principales establecen contrastes entre grupos de variables.

Por ejemplo, una componente principal de la forma:

\[ Y_j=0.8X_1+0.7X_2-0.6X_3 \]

indica que las variables \(X_1\) y \(X_2\) contribuyen en una dirección, mientras que \(X_3\) contribuye en dirección opuesta.

En consecuencia:

  • variables con coeficientes del mismo signo tienden a variar conjuntamente,

  • mientras que variables con signos opuestos representan comportamientos contrastantes.

Por esta razón:

  • Estas componentes principales suelen interpretarse como factores de contraste o de forma, ya que describen diferencias relativas entre variables más que una magnitud global común.

  • Estas componentes permiten identificar patrones estructurales, relaciones de oposición o diferencias relativas entre subconjuntos de variables originales.

Tercera interpretación.

En general, la interpretación de una componente principal se realiza analizando:

  • la magnitud de los coeficientes (o cargas),

  • los signos de dichos coeficientes,

  • y la proporción de varianza explicada por la componente principal.

Variables con cargas grandes en magnitud son las que más contribuyen a la definición e interpretación de la componente principal correspondiente.

Además:

  • coeficientes con el mismo signo indican asociaciones en una misma dirección,

  • mientras que coeficientes con signos opuestos reflejan relaciones de contraste entre variables.

8 Ejemplo 1: PCA aplicado a una distribución normal tridimensional

En este ejemplo consideramos una distribución normal tridimensional con vector de medias:

\[ \mu= \begin{bmatrix} 0\\ 5\\ 2 \end{bmatrix} \]

y matriz de covarianzas:

\[ \Sigma= \begin{bmatrix} 25 & -1 & 7\\ -1 & 4 & -4\\ 7 & -4 & 10 \end{bmatrix} \]

La matriz de covarianzas indica que:

  • las variables presentan diferentes niveles de variabilidad,

  • y además existe correlación entre algunas de ellas.

Geométricamente, esto implica que la nube de datos no será esférica, sino alargada en ciertas direcciones preferenciales.

Bajo estas condiciones, el diagrama de dispersión tridimensional se muestra en la figura 8.1.

**Distribución normal tridimensional**

Figure 8.1: Distribución normal tridimensional

Obsérvese que:

  • la nube de datos presenta una dirección dominante de dispersión,

  • lo cual sugiere la existencia de correlaciones entre variables,

  • y motiva la aplicación de PCA para identificar las direcciones principales de variabilidad.

Después de aplicar PCA, los datos son proyectados sobre los nuevos ejes ortogonales definidos por las componentes principales.

En la figura 8.2, se muestran las proyecciones correspondientes sobre los distintos pares de componentes principales.

**Proyecciones de una distribución normal tridimensional**

Figure 8.2: Proyecciones de una distribución normal tridimensional

Obsérvese que:

  1. En las proyecciones que involucran la primera componente principal \(Y_1\), la nube de datos presenta la mayor dispersión. Esto indica que \(Y_1\) concentra la mayor parte de la variabilidad total de los datos.

  2. Las proyecciones asociadas a la segunda componente principal \(Y_2\) muestran una dispersión menor que las correspondientes a \(Y_1\). Esto refleja que \(Y_2\) recoge la mayor parte de la variabilidad restante no explicada por \(Y_1\).

  3. Las proyecciones que involucran la tercera componente principal \(Y_3\) presentan una menor elongación y dispersión, indicando que esta componente explica una proporción menor de variabilidad.

  4. Las componentes principales resultantes son incorreladas entre sí, razón por la cual las nubes de puntos aparecen alineadas con los nuevos ejes coordenados.

  5. PCA rota el sistema de coordenadas original hacia nuevas direcciones ortogonales que describen más eficientemente la estructura de variabilidad de los datos.

  6. La elongación observada en cada proyección refleja directamente la cantidad de varianza explicada por las componentes principales involucradas.

9 Ejemplo 2: Datos survey

9.0.1 Enunciado

Los datos se recogieron aplicando una encuesta a una muestra de estudiantes universitarios. Es un data frame con 800 observaciones y 66 variables. Con estos datos llevaremos a cabo un PCA.

library(lsm)
datosCompleto <- lsm::survey
names(datosCompleto)
##  [1] "Observation"  "ID"           "Gender"       "Like"         "Age"         
##  [6] "Smoke"        "Height"       "Weight"       "BMI"          "School"      
## [11] "SES"          "Enrollment"   "Score"        "MotherHeight" "MotherAge"   
## [16] "MotherCHD"    "FatherHeight" "FatherAge"    "FatherCHD"    "Status"      
## [21] "SemAcum"      "Exam1"        "Exam2"        "Exam3"        "Exam4"       
## [26] "ExamAcum"     "Definitive"   "Expense"      "Income"       "Gas"         
## [31] "Course"       "Law"          "Economic"     "Race"         "Region"      
## [36] "EMO1"         "EMO2"         "EMO3"         "EMO4"         "EMO5"        
## [41] "GOAL1"        "GOAL2"        "GOAL3"        "Pre_STAT1"    "Pre_STAT2"   
## [46] "Pre_STAT3"    "Pre_STAT4"    "Post_STAT1"   "Post_STAT2"   "Post_STAT3"  
## [51] "Post_STAT4"   "Pre_IDARE1"   "Pre_IDARE2"   "Pre_IDARE3"   "Pre_IDARE4"  
## [56] "Pre_IDARE5"   "Post_IDARE1"  "Post_IDARE2"  "Post_IDARE3"  "Post_IDARE4" 
## [61] "Post_IDARE5"  "PSICO1"       "PSICO2"       "PSICO3"       "PSICO4"      
## [66] "PSICO5"

Se resalta que sólo algunos de estos individuos y variables se utilizarán para realizar el análisis de componentes principales.

dat <- datosCompleto[1:23, 21:30]
attach(dat)
head(dat,4) 
SemAcum Exam1 Exam2 Exam3 Exam4 ExamAcum Definitive Expense Income Gas
4.25 1.5 5.0 5.0 4.5 16.0 4.000 48.9 1.61 27.45
2.80 2.3 4.9 3.7 3.3 14.2 3.550 72.1 2.07 24.17
4.15 3.4 3.6 2.0 1.9 10.9 2.725 85.2 2.84 22.27
3.20 2.5 4.2 5.0 2.5 14.2 3.550 56.6 1.55 23.08

9.0.2 Solución.

La solución se puede revisar haciendo click aquí.

10 Tópicos sumplementarios

No hacer click aquí: Pendiente

11 Ejercicios

Pendiente

Bibliografía

Consultar el documento RPubs :: Análisis multivariado (bibliografía).

 

 
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.  
LS0tDQp0aXRsZTogIkFOw4FMSVNJUyBERSBDT01QT05FTlRFUyBQUklOQ0lQQUxFUyINCnN1YnRpdGxlOiA8aDE+KipUZW9yw61hKio8L2gxPg0KDQphdXRob3I6IA0KICAtIG5hbWUgICAgICAgICAgOiAiRHIuIHJlci4gbmF0LiBIdW1iZXJ0byBMTGluw6FzIFNvbGFubyINCiAgICBhZmZpbGlhdGlvbiAgIDogIkRlcGFydGFtZW50byBkZSBNYXRlbcOhdGljYXMgeSBFc3RhZMOtc3RpY2EsIFVuaXZlcnNpZGFkIGRlbCBOb3J0ZSAoQmFycmFucXVpbGxhLCBDb2xvbWJpYSkiDQogICAgICNjb3JyZXNwb25kaW5nIDogeWVzICAgICMgRGVmaW5lIG9ubHkgb25lIGNvcnJlc3BvbmRpbmcgYXV0aG9yDQogICAgICNhZGRyZXNzICAgICAgIDogIkRlcGFydGFtZW50byBkZSBNYXRlbcOhdGljYXMgeSBFc3RhZMOtc3RpY2EiDQogICAgZW1haWwgICAgICAgICA6IHwNCiAgICAgIGhsbGluYXNAdW5pbm9ydGUuZWR1LmNvDQogICAgICANCiAgICAgIFtCaW9ncmFwaGljYWwgc2tldGNoXShodHRwczovL3JwdWJzLmNvbS9obGxpbmFzL0Jpb19Ta2V0Y2gpDQogICAgICANCiAgICAgIGByIGZvcm1hdChTeXMudGltZSgpLCAiJWQvJW0vJXkiKWAgDQogICAgICANCiAgICAgI3JvbGU6ICAgICAgICAgIyBDb250cmlidXRvcnNoaXAgcm9sZXMgKGUuZy4sIENSZWRpVCwgaHR0cHM6Ly9jYXNyYWkub3JnL2NyZWRpdC8pDQogICMgICAgLSBDb25jZXB0dWFsaXphdGlvbg0KICAjICAgIC0gV3JpdGluZyAtIE9yaWdpbmFsIERyYWZ0IFByZXBhcmF0aW9uDQogICMgICAgLSBXcml0aW5nIC0gUmV2aWV3ICYgRWRpdGluZw0KICMgLSBuYW1lICAgICAgICAgIDogIkF1dG9yIG51bWVybyAyIg0KICMgICBhZmZpbGlhdGlvbiAgIDogIjEsMiINCiAjICAgcm9sZToNCiAjICAgICAtIFdyaXRpbmcgLSBSZXZpZXcgJiBFZGl0aW5nDQogICAgICNhZmZpbGlhdGlvbjoNCiAgIy0gaWQgICAgICAgICAgICA6ICIxIg0KICAjICBpbnN0aXR1dGlvbiAgIDogIlVuaXZlcnNpZGFkIGRlbCBOb3J0ZSAoQmFycmFucXVpbGxhLCBDb2xvbWJpYSkiDQogICMhW10oaGxsaW5hcy5qcGcpe3dpZHRoPTFpbn0gDQogIA0KI2RhdGU6ICdgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVkLyVtLyV5IilgJyAgIyB2ZXIgaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLWNvb2tib29rL3VwZGF0ZS1kYXRlLmh0bWwNCm91dHB1dDogDQogICAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOiANCiAgICAgICAgICAjT0pPIFNhbGVuIGNhcGl0dWxvcywgc2VjY2lvbmVzIHkgVGVvcmVtYXMNCiAgICAjYm9va2Rvd246Omh0bWxfYm9vazoNCiAgICAgICAgICAjT0pPIEVSUk9SIFNhbGVuIHRlb3JlbWFzLCBwZXJvIG5vIHNhbGVuIGxvcyBjYXBpdHVsb3MgDQogICAgI2h0bWxfZG9jdW1lbnQ6DQogICAgICAgICAgdG9jOiB0cnVlICAgICAgIyB0YWJsZSBvZiBjb250ZW50IHRydWUNCiAgICAgICAgICB0b2NfZGVwdGg6IDQgICAjIHVwdG8gdGhyZWUgZGVwdGhzIG9mIGhlYWRpbmdzIChzcGVjaWZpZWQgYnkgIywgIyMgYW5kICMjIykNCiAgICAgICAgICB0b2NfZmxvYXQ6IHRydWUgI0NvbiB0cnVlLCB0b2Mgc2FsZSBhbCBtYXJnZW4gaXpxdWllcmRvIGRlIGxhIHDDoWdpbmE7IGRlIGxvIGNvbnRyYXJpbywgYXJyaWJhDQogICAgICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgICAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQogICAgICAgICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlICAgIyBpZiB5b3Ugd2FudCBudW1iZXIgc2VjdGlvbnMgYXQgZWFjaCB0YWJsZSBoZWFkZXINCiAgICAgICAgICAjdGhlbWU6IHNhbmRzdG9uZQ0KICAgICAgICAgICN0aGVtZTogdW5pdGVkICAjIG1hbnkgb3B0aW9ucyBmb3IgdGhlbWUsIHRoaXMgb25lIGlzIG15IGZhdm9yaXRlLg0KICAgICAgICAgICN0aGVtZTogZmxhdGx5ICAjIA0KICAgICAgICAgICN0aGVtZTogY2VydWxlYW4gICMgDQogICAgICAgICAgI2hpZ2hsaWdodDogdGFuZ28gICMgc3BlY2lmaWVzIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlDQogICAgICAgICAgI2NzczogU2NyaXB0cyBhY2Nlc29yaW9zL2VzdGlsb2JvdG9uLmNzcw0KICAgICAgICAgICNjc3M6IG15LmNzcyAgICMgeW91IGNhbiBhZGQgeW91ciBjdXN0b20gY3NzLCBzaG91bGQgYmUgaW4gc2FtZSBmb2xkZXINCiAgICAgICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgICAgICAgI2hpZ2hsaWdodDogdGFuZ28gICMgY2FtYmlhciBjb2xvciBkZSBsaWJyYXJ5IGVuIGF6dWwNCiAgICAjIGJvb2tkb3duOjpnaXRib29rOg0KICAgICMgICAgICBpbmNsdWRlczoNCiAgICAjICAgICAgICBpbl9oZWFkZXI6IGhlYWRlci5odG1sDQogICAgIyBib29rZG93bjo6cGRmX2Jvb2s6DQogICAgIyAgICAgICBrZWVwX3RleDogeWVzDQogICAgIyBib29rZG93bjo6aHRtbF9ib29rOg0KICAgICMgICAgICAgY3NzOiB0b2MuY3NzDQogICAgIyBib29rZG93bjo6aHRtbF9ib29rOg0KICAgICMgICAgICAgICBpbmNsdWRlczoNCiAgICAjICAgICAgICAgICBpbl9oZWFkZXI6IHN0eWxlLmNzcw0KICAgICNib29rZG93bjo6aHRtbF9kb2N1bWVudDI6IGRlZmF1bHQNCiAgICAjIGJvb2tkb3duOjpwZGZfZG9jdW1lbnQyOg0KICAgICMgICAgICBrZWVwX3RleDogdHJ1ZQ0KICAgICNiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQogICAgbWF0aGpheDogImh0dHA6Ly9leGFtcGxlLmNvbS9tYXRoamF4L01hdGhKYXguanM/Y29uZmlnPVRlWC1BTVMtTU1MX0hUTUxvck1NTCINCmhlYWRlci1pbmNsdWRlczoNCiAgICBcdXNlcGFja2FnZVt4MTFuYW1lc117eGNvbG9yfSANCiAgICANCmNzbDogc2NpZW5jZS5jc2wNCiNPam86IFNlIHV0aWxpemEgbGVuZ3VhamUgWUFNTA0KDQphYnN0cmFjdDogfA0KICoqRW4gW1JwdWJzOjogdG9jXShodHRwczovL3JwdWJzLmNvbS9obGxpbmFzL3RvYykgc2UgcHVlZGVuIHZlciBvdHJvcyBkb2N1bWVudG9zIGRlIHBvc2libGUgaW50ZXLDqXMuKioNCiAgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGZpZy5hbGlnbj0iY2VudGVyIiwgIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UjLA0KICAgICAgICAgICAgICAgICAgICAgICNzdHlsZSA9ICJjb2xvcjpkYXJrYmx1ZSINCiAgICAgICAgICAgICAgICAgICAgIyBjbGFzcy5zb3VyY2U9ImJnLWRhbmdlciIsIGNsYXNzLm91dHB1dD0iYmctd2FybmluZyIgICAjQ29sb3JlcyBkZW50cm8gZGVsIGNodW5rDQogICAgICAgICAgICAgICAgICAgICApDQpsaWJyYXJ5KHJnbCkNCmtuaXRyOjprbml0X2hvb2tzJHNldCh3ZWJnbCA9IGhvb2tfd2ViZ2wpDQpgYGANCg0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9DQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vbGFuZ3VhZ2UtZW5naW5lcy5odG1sDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL21hcmtkb3duLXN5bnRheC5odG1sDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL2Etc2luZ2xlLWRvY3VtZW50Lmh0bWwNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vbWFya2Rvd24tZXh0ZW5zaW9ucy1ieS1ib29rZG93bi5odG1sDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9ib29rZG93bi1tYXJrZG93bi5odG1sICAjIFRlb3JlbXMgYW5kIHByb29mcw0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9tYXJrZG93bi1leHRlbnNpb25zLWJ5LWJvb2tkb3duLmh0bWwjdGhlb3JlbXMNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vaHRtbC5odG1sDQoNCmh0dHBzOi8vd3d3LmRhdGEtdG8tdml6LmNvbS8NCiAgDQpbUnB1YnNdKGxpbmspDQogIA0KKFwjZXE6ZWMtKSwgIEVjdWFjaW9uIFxAcmVmKGVxOmVjLSksIEZpZ3VyYSBcQHJlZihmaWc6RmlnLSksIFRhYmxlIFxAcmVmKHRhYjptdGNhcnMpLCBUaGVvcmVtIFxAcmVmKHRobTpib3JpbmcpDQoNCg0KIyBUaXR1bG8geyNUaXR1bG9TZWNjaW9ufSAgIFxAcmVmKFRpdHVsb1NlY2Npb24pDQogIA0KIyBGb3IgSFRNTCwgd2UgY2FuIHNldCBjb2xvciB3aXRoIENTUywgZS5nLiwgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij50ZXh0PC9zcGFuPg0KICANCiMgaHR0cHM6Ly9yYWRpYW50LXJzdGF0cy5naXRodWIuaW8vZG9jcy9tb2RlbC9sb2dpc3RpYy5odG1sIFNoaW5ueSBMb2dpdCAgDQogIA0KYGBgDQoNCg0KYGBge3IsIGV2YWw9RkFMU0UsIGVjaG89RkFMU0V9DQojTGEgZm90byB0YW1hw7FvIGPDqWR1bGENCg0KaHRtbHRvb2xzOjppbWcoc3JjID0ga25pdHI6OmltYWdlX3VyaShmaWxlLnBhdGgoUi5ob21lKCJkb2MiKSwgImh0bWwiLCAibG9nby5qcGciKSksIA0KICAgICAgICAgICAgICAgYWx0ID0gJ2hsbGluYXMnLCANCiAgICAgICAgICAgICAgIHN0eWxlID0gJ3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MDsgcmlnaHQ6MDsgcGFkZGluZzoxMHB4OycgIywNCiAgICAgICAgICAgICAgIHdpZHRoID0gIjIwMHB4IikgICMgQXF1w60gZXNwZWNpZmljYXMgZWwgYW5jaG8gZGVzZWFkbyBlbiBww614ZWxlcyBvIHBvcmNlbnRhamUNCmBgYA0KDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgfQ0KIyBMYSBmb3RvIGdyYW5kZQ0KDQpodG1sdG9vbHM6OmltZyhzcmMgPSBrbml0cjo6aW1hZ2VfdXJpKCJobGxpbmFzMjAyMy5qcGciKSwgDQogICAgICAgICAgICAgICBhbHQgPSAnaGxsaW5hczIwMjMnLCANCiAgICAgICAgICAgICAgIHN0eWxlID0gJ3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MDsgcmlnaHQ6MDsgcGFkZGluZzoxcHg7JywNCiAgICAgICAgICAgICAgIHdpZHRoPSIxNSUiKQ0KYGBgDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgIC0tPg0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KLmNvbHVtbnMge2Rpc3BsYXk6IGZsZXg7fQ0KaDEge2NvbG9yOiBkYXJrYmx1ZTt9DQpoMyB7Y29sb3I6IGRhcmtncmVlbjt9DQpoNCB7Y29sb3I6IGdyZWVuO30NCmBgYA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gQ2Fww610dWxvICAtLT4NCg0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQ0KI2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQxMDMwNDc3L2NoYW5naW5nLWNodW5rLWJhY2tncm91bmQtY29sb3ItaW4tcm1hcmtkb3duDQoNCi5iYWRDb2RlIHsNCmJhY2tncm91bmQtY29sb3I6IHJlZDsNCn0NCmBgYA0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgIC0tPg0KDQojIExpYnJlcsOtYXMNCg0KIyMjIFBhcmEgUENBDQoNCg0KYGBge3IsIGV2YWw9RkFMU0UsIGVjaG89RkFMU0V9DQojICBodHRwczovL3JwdWJzLmNvbS9BbGVtYS8xMDAwNTgyDQoNCiMgaHR0cHM6Ly93d3cuZ2Vla3Nmb3JnZWVrcy5vcmcvY29udGV4dHVhbC1vdXRsaWVycy8NCmBgYA0KDQpFbCBzb2Z0d2FyZSBSIGRpc3BvbmUgZGUgdmFyaWFzIGZ1bmNpb25lcyBkZSBkaWZlcmVudGVzIHBhcXVldGVzIHBhcmEgY2FsY3VsYXIgUENBOg0KDQogICAtIGBwcmNvbXBgIHkgYHByaW5jb21wYCwgZGVsIHBhcXVldGUgYHN0YXRzYC4NCiAgICAgICAgDQogICAtIGBQQ0FgIGRlbCBwYXF1ZXRlIGBGYWN0b01pbmVSYC4NCiAgICANCiAgIC0gYGR1ZGkucGNhYCBkZWwgcGFxdWV0ZSBgYWRlNGAuDQogICAgDQogICAtIGBlcFBDQWAgZGVsIHBhcXVldGUgYEV4UG9zaXRpb25gLg0KICAgICAgICANCg0KU2luIGltcG9ydGFyIGxhIGZ1bmNpw7NuIHF1ZSBlbGlqYSBlbXBsZWFyLCBlcyBwb3NpYmxlIGV4dHJhZXIgeSByZXByZXNlbnRhciBkZSBtYW5lcmEgc2VuY2lsbGEgbG9zIHJlc3VsdGFkb3MgZGVsIFBDQSBtZWRpYW50ZSBsYXMgZnVuY2lvbmVzIGRlbCBwYXF1ZXRlIGBmYWN0b2V4dHJhYC4gRW4gZXN0ZSBkb2N1bWVudG8sIHNlIGhhcsOhIHVzbyBkZSBsb3MgcGFxdWV0ZXMgYEZhY3RvTWluZVJgIHkgYGFkZTRgICBwYXJhIGxvcyBhbsOhbGlzaXMgeSBgZmFjdG9leHRyYWAgcGFyYSBsYSB2aXN1YWxpemFjacOzbiBiYXNhZGEgZW4gYGdncGxvdDJgLg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KEZhY3RvTWluZVIpDQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpsaWJyYXJ5KGFkZTQpDQpgYGANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yICAtLT4NCg0KIyMjIFBhcmEgb3Ryb3MgYW7DoWxpc2lzDQoNCmBgYHtyLCAgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkoYXBsb3JlMykgICAgICAgI0Jhc2UgZGUgZGF0b3MgcGFyYSBsb3MgZWplbXBsb3MNCmxpYnJhcnkobHNtKSAgICAgICAgICAgI0Jhc2UgZGUgZGF0b3MgcGFyYSBlamVtcGxvcyB5IGVzdGltYWNpb25lcyBkZWwgTG9nLXZlcm9zaW1pbGl0dWQNCmxpYnJhcnkoa25pdHIpICAgICAgICAgI0VkaXRhciB0YWJsYXMgY29uIGthYmxlKCkNCmxpYnJhcnkoa2FibGVFeHRyYSkgICAgI0VkaXRhciB0YWJsYXMgbcOhcyBlc3RpbGl6YWRhcw0KbGlicmFyeSh0aWR5dmVyc2UpICAgICAjSW5jbHV5ZSBhIGRwbHlyIHkgZ2dwbG90Mg0KbGlicmFyeShzdHJpbmdyKSAgICAgICAjUmVlbXBsYXphciBjYXJhY3RlcmVzIGVuIHVuIGRhdGEgZnJhbWUNCmxpYnJhcnkob3V0bGllcnMpICAgICAgI291dGxpZXJzOjpncnViYnMudGVzdA0KbGlicmFyeShFbnZTdGF0cykgICAgICAjRW52U3RhdHM6OnJvc25lclRlc3QNCmxpYnJhcnkoRE13UjIpICAgICAgICAgI0xPRiAoTG9jYWwgT3V0bGllciBGYWN0b3IpDQpsaWJyYXJ5KHJnbCkgICAgICAgICAgICNyZ2w6OnBsb3QzZGANCmxpYnJhcnkoY29ycnBsb3QpICAgICAgI01hdHJpeiBkZSBjb3JyZWxhY2lvbmVzDQpsaWJyYXJ5KHRleHRzaGFwZSkgICAgICNjb2x1bW5fdG9fcm93bmFtZXMNCiNvcHRzX2tuaXQkc2V0KGV2YWwuYWZ0ZXIgPSAnZmlnLmNhcCcpDQpgYGANCg0KYGBge2NzcywgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCiNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTAzMDQ3Ny9jaGFuZ2luZy1jaHVuay1iYWNrZ3JvdW5kLWNvbG9yLWluLXJtYXJrZG93bg0KDQouYmFkQ29kZSB7DQpiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7DQp9DQpgYGANCg0KYGBge3IsICBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFfQ0KbGlicmFyeShhcGxvcmUzKSAgICAgICAjQmFzZSBkZSBkYXRvcyBwYXJhIGxvcyBlamVtcGxvcw0KbGlicmFyeShsc20pICAgICAgICAgICAjQmFzZSBkZSBkYXRvcyBwYXJhIGVqZW1wbG9zIHkgZXN0aW1hY2lvbmVzIGRlbCBMb2ctdmVyb3NpbWlsaXR1ZA0KbGlicmFyeSh0aWR5dmVyc2UpICAgICAjSW5jbHV5ZSBhIGRwbHlyIHkgZ2dwbG90Mg0KbGlicmFyeShzdHJpbmdyKSAgICAgICAjUmVlbXBsYXphciBjYXJhY3RlcmVzIGVuIHVuIGRhdGEgZnJhbWUNCmxpYnJhcnkob3V0bGllcnMpICAgICAgI291dGxpZXJzOjpncnViYnMudGVzdA0KbGlicmFyeShFbnZTdGF0cykgICAgICAjRW52U3RhdHM6OnJvc25lclRlc3QNCmxpYnJhcnkoRE13UjIpICAgICAgICAgI0xPRiAoTG9jYWwgT3V0bGllciBGYWN0b3IpDQpsaWJyYXJ5KHJnbCkgICAgICAgICAgICNyZ2w6OnBsb3QzZA0KbGlicmFyeShjb3JycGxvdCkgICAgICAjTWF0cml6IGRlIGNvcnJlbGFjaW9uZXMNCmxpYnJhcnkodGV4dHNoYXBlKSAgICAgI2NvbHVtbl90b19yb3duYW1lcw0KYGBgDQoNCg0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBJbnRyb2R1Y2Npw7NuDQoNCiMjIyBQcmVsaW1pbmFyZXMNCg0KRXMgdW4gbcOpdG9kbyBkZSBpbnRlcmRlcGVuZGVuY2lhIHBhcmEgcmVzdW1pciBsYSBpbmZvcm1hY2nDs24gY29udGVuaWRhIGVuIGxhcyB2YXJpYWJsZXMgeSBmYWNpbGl0YXIgc3UgYW7DoWxpc2lzLiBFbCBBQ1AgdHJhbnNmb3JtYSBlbCBjb25qdW50byBkZSB2YXJpYWJsZXMgb3JpZ2luYWxlcyBlbiB1biBzdWJjb25qdW50byBtw6FzIHBlcXVlw7FvIGRlIHZhcmlhYmxlcyAodsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UENBMSkpLiAgDQoNCjxjZW50ZXI+DQpgYGB7ciBQQ0ExLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqUmVkdWNjacOzbiBkZSBsYSBkaW1lbnNpw7NuKioiLCBvdXQud2lkdGggPSAiMTAwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJQQ0ExLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KDQpFc3RhcyB2YXJpYWJsZXMgc29uIGNvbWJpbmFjaW9uZXMgbGluZWFsZXMgZGUgbGFzIHByaW1lcmFzLCBxdWUgY29udGllbmVuIG1heW9yIHBhcnRlIGRlIGxhIHZhcmlhYmlsaWRhZCBwcmVzZW50ZSBlbiBlbCBjb25qdW50byBpbmljaWFsLiBQYXJhIGFwbGljYXIgZXN0YSB0w6ljbmljYSBzZSByZXF1aWVyZSBxdWUgbGFzIHZhcmlhYmxlcyBzZWFuIGN1YW50aXRhdGl2YXMgKHbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlBDQTIpKS4gIA0KDQo8Y2VudGVyPg0KYGBge3IgUENBMiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKlJlc3VtZW4geSB2aXN1YWxpemFjacOzbiBkZSBkYXRvcyBtdWx0aXZhcmlhZG9zKioiLCBvdXQud2lkdGggPSAiMTAwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJQQ0EyLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIFByb3DDs3NpdG8NCg0KU3Ugb2JqZXRpdm8gZ2VuZXJhbCBlcyBsb2dyYXIgdW5hIHJlZHVjY2nDs24gZGUgZGF0b3MgcXVlIGZhY2lsaXRlIGxhIGludGVycHJldGFjacOzbiAuIEVuIGVzdGUgc2VudGlkbywgZWwgbcOpdG9kbyBzZSBhcGxpY2EgcGFyYSByZXByZXNlbnRhciDDs3B0aW1hbWVudGUgZW4gdW4gZXNwYWNpbyBkZSBkaW1lbnNpw7NuIHBlcXVlw7FhLCBvYnNlcnZhY2lvbmVzIGRlIHVuIGVzcGFjaW8gZ2VuZXJhbCBLLWRpbWVuc2lvbmFsLiBQb3IgZXN0YSByYXrDs24sIGxhIHTDqWNuaWNhIHNlIGNvbnNpZGVyYSBjb21vIGVsIHByaW1lciBwYXNvIHBhcmEgaWRlbnRpZmljYXIgcG9zaWJsZXMgdmFyaWFibGVzIGxhdGVudGVzIG8gbm8gb2JzZXJ2YWRhcywgcXVlIGVzdMOhbiBnZW5lcmFuZG8gbGEgdmFyaWFiaWxpZGFkIGRlIGxvcyBkYXRvcy4gU2llbXByZSBlc3TDoSBiYXNhZGEgZW4gZGVzY3JpYmlyIGxhIGVzdHJ1Y3R1cmEgZGUgbGEgbWF0cml6IGRlIGNvdmFyaWFuemEgZGUgdW4gY29uanVudG8gZGUgdmFyaWFibGVzIG1lZGlhbnRlIGxhIHV0aWxpemFjacOzbiBkZSBjb21iaW5hY2lvbmVzIGxpbmVhbGVzIGRlIGVzdGFzIHZhcmlhYmxlcyAuDQoNCg0KQ29uIGVzdGEgdMOpY25pY2Egc2UgYnVzY2EgdHJhbnNmb3JtYXIgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIChlbiBnZW5lcmFsLCBjb3JyZWxhZGFzKSwgZW4gbnVldmFzIHZhcmlhYmxlcyBpbmNvcnJlbGFkYXMsIGZhY2lsaXRhbmRvIGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgZGF0b3MuDQoNCg0KQXVucXVlIHNlIHJlcXVpZXJlbiBsYXMgJE4kIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHBhcmEgcmVwcm9kdWNpciB0b2RhIGxhIHZhcmlhYmlsaWRhZCBkZWwgc2lzdGVtYSwgZW4gbGEgcHLDoWN0aWNhLCBsYSBtYXlvciBwYXJ0ZSBkZSBlc3RhIHZhcmlhYmlsaWRhZCBzdWVsZSBleHBsaWNhcnNlIG1lZGlhbnRlIHVuIG7Dum1lcm8gcmVkdWNpZG8gJEokIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLiBFbiB0YWxlcyBjYXNvcywgbGFzICRKJCBwcmltZXJhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBzdXN0aXR1eWVuIGEgbGFzICROJCB2YXJpYWJsZXMgb3JpZ2luYWxlcywgZ2VuZXJhbmRvIGFzw60gdW5hIHNpbXBsaWZpY2FjacOzbiBkZWwgc2lzdGVtYSBvcmlnaW5hbC4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBFamVtcGxvOiBQaW5nw7xpbm8NCg0KRXN0ZSBlamVtcGxvICh2w6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpQaW5ndWlubzEpKSBpbHVzdHJhIGxhIHJlZHVjY2nDs24gZGUgbGEgZGltZW5zaW9uYWxpZGFkIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIHRyaWRpbWVuc2lvbmFsZXMgYSBkb3MgZGltZW5zaW9uZXMuIA0KDQo8Y2VudGVyPg0KYGBge3IgUGluZ3Vpbm8xLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqUGluZ8O8aW5vKioiLCBvdXQud2lkdGggPSAiMTAwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJQaWd1aW5vMS5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQpJbmljaWFsbWVudGUsIGFwYXJ0ZSBkZWwgZXN0aXJhbWllbnRvIGRlIGxvcyBwdW50b3MsIG5vIHNlIHBlcmNpYmUgdW5hIGVzdHJ1Y3R1cmEgY2xhcmEgZW4gbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgcHVudG9zLiBTaW4gZW1iYXJnbywgYWwgZWxlZ2lyIHVuYSByb3RhY2nDs24gYWRlY3VhZGEsIHBvZGVtb3MgcmV2ZWxhciBsYSBlc3RydWN0dXJhIHN1YnlhY2VudGUuIEVzdGEgcm90YWNpw7NuIHB1ZWRlIHNlciBjb25jZWJpZGEgY29tbyB1bmEgZXhwbG9yYWNpw7NuIGRlbCBjb25qdW50byB0cmlkaW1lbnNpb25hbCwgYnVzY2FuZG8gZWwgw6FuZ3VsbyDDs3B0aW1vIHBhcmEgdmlzdWFsaXphciBsb3MgZGF0b3MuIEVsIEFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBQcmluY2lwYWxlcyAoQUNQKSBwdWVkZSBzZXIgw7p0aWwgcGFyYSBkZXNjdWJyaXIgZXN0YSBlc3RydWN0dXJhIHN1YnlhY2VudGUuIFNlbGVjY2lvbmEgdW5hIHJvdGFjacOzbiBkZSB0YWwgbWFuZXJhIHF1ZSBsYSBtYXlvciBwYXJ0ZSBkZSBsYSB2YXJpYWJpbGlkYWQgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGVzdMOpIGNhcHR1cmFkYSBlbiBsYXMgcHJpbWVyYXMgZGltZW5zaW9uZXMgZGUgbG9zIGRhdG9zIHJvdGFkb3MuIEF1bnF1ZSBwdWVkYSBwYXJlY2VyIHBvY28gw7p0aWwgZW4gbnVlc3RybyBjYXNvIHRyaWRpbWVuc2lvbmFsLCBlc3RlIGVuZm9xdWUgc2UgdnVlbHZlIG11eSBwb2Rlcm9zbyBjdWFuZG8gbG9zIGRhdG9zIHRpZW5lbiBtdWNoYXMgZGltZW5zaW9uZXMgKGRlY2VuYXMgZGUgZGltZW5zaW9uZXMpLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ2FyYWN0ZXLDrXN0aWNhcw0KDQoxLiBQQ0Egc3Vwb25lIHF1ZSBsYXMgZGlyZWNjaW9uZXMgY29uIGxhcyBtYXlvcmVzIHZhcmlhbnphcyBzb24gbGFzIG3DoXMg4oCcaW1wb3J0YW50ZXPigJ0sIHlhIHF1ZSByZXByZXNlbnRhbiBsYXMgZGlyZWNjaW9uZXMgZG9uZGUgbG9zIGRhdG9zIHByZXNlbnRhbiBsYSBtYXlvciBkaXNwZXJzacOzbiB5LCBwb3IgdGFudG8sIGNvbnRpZW5lbiBsYSBtYXlvciBjYW50aWRhZCBkZSBpbmZvcm1hY2nDs24gZGVsIGNvbmp1bnRvIGRlIGRhdG9zLg0KDQoyLiBFbiBsYSBmaWd1cmEgXEByZWYoZmlnOlBDQTMpOg0KICANCiAgIC0gRWwgZWplIFBDMSByZXByZXNlbnRhIGxhIHByaW1lcmEgZGlyZWNjacOzbiBwcmluY2lwYWwsIGVzIGRlY2lyLCBsYSBkaXJlY2Npw7NuIGEgbG8gbGFyZ28gZGUgbGEgY3VhbCBsYXMgbXVlc3RyYXMgcHJlc2VudGFuIGxhIG3DoXhpbWEgdmFyaWFjacOzbi4gDQogIA0KICAgLSBFbCBlamUgUEMyIGNvcnJlc3BvbmRlIGEgbGEgc2VndW5kYSBkaXJlY2Npw7NuIHByaW5jaXBhbCB5IGVzIG9ydG9nb25hbCBhIFBDMS4gDQogIA0KICAgLSBFbiBsYSBmaWd1cmEgXEByZWYoZmlnOlBDQTMpYiwgZGVzcHXDqXMgZGUgcHJveWVjdGFyIGxvcyBkYXRvcyBzb2JyZSBlbCBudWV2byBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIGRlZmluaWRvIHBvciBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMsIHNlIG9ic2VydmEgcXVlIGxhIG1heW9yIGRpc3BlcnNpw7NuIGRlIGxvcyBkYXRvcyBvY3VycmUgYSBsbyBsYXJnbyBkZSBQQzEsIG1pZW50cmFzIHF1ZSBsYSB2YXJpYWNpw7NuIHNvYnJlIFBDMiBlcyBjb25zaWRlcmFibGVtZW50ZSBtZW5vci4NCiAgDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFBDQTMsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipEaXNwZXJzacOzbiB5IFBDQSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJQQ0EzLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KDQoNCjMuIExhIGRpbWVuc2lvbmFsaWRhZCBkZSBudWVzdHJvcyBkYXRvcyBiaWRpbWVuc2lvbmFsZXMgcHVlZGUgcmVkdWNpcnNlIGEgdW5hIHNvbGEgZGltZW5zacOzbiBwcm95ZWN0YW5kbyBjYWRhIG11ZXN0cmEgc29icmUgZWwgcHJpbWVyIGNvbXBvbmVudGUgcHJpbmNpcGFsICh2w6lhc2UgbGEgZmlndXJhIEByZWYoZmlnOlBDQTMpYikuIEVzdG8gZXMgcG9zaWJsZSBwb3JxdWUgUEMxIHJldGllbmUgbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkIHByZXNlbnRlIGVuIGxvcyBkYXRvcyBvcmlnaW5hbGVzLg0KDQoNCjQuIERlc2RlIGVsIHB1bnRvIGRlIHZpc3RhIHTDqWNuaWNvLCBsYSBtZWRpZGEgZGUgbGEgY2FudGlkYWQgZGUgdmFyaWFuemEgcmV0ZW5pZGEgcG9yIGNhZGEgY29tcG9uZW50ZSBwcmluY2lwYWwgc2UgZGV0ZXJtaW5hIGEgdHJhdsOpcyBkZWwgKip2YWxvciBwcm9waW8qKiBjb3JyZXNwb25kaWVudGUuIA0KDQo1LiBFcyBpbXBvcnRhbnRlIHJlc2FsdGFyIHF1ZSBQQ0EgcmVzdWx0YSBlc3BlY2lhbG1lbnRlIGJlbmVmaWNpb3NvIGN1YW5kbyBsYXMgdmFyaWFibGVzIGRlbCBjb25qdW50byBkZSBkYXRvcyBwcmVzZW50YW4gdW5hIGFsdGEgY29ycmVsYWNpw7NuLiBVbmEgYWx0YSBjb3JyZWxhY2nDs24gaW5kaWNhIGxhIGV4aXN0ZW5jaWEgZGUgKipyZWR1bmRhbmNpYSoqLCBlcyBkZWNpciwgcXVlIHZhcmlhcyB2YXJpYWJsZXMgY29udGllbmVuIGluZm9ybWFjacOzbiBzaW1pbGFyIG8gcGFyY2lhbG1lbnRlIHJlcGV0aWRhICh2w6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWR1bmRhbmNpYTEpKS4gRW4gZXN0YXMgc2l0dWFjaW9uZXMsIGdyYW4gcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkIHRvdGFsIGRlIGxvcyBkYXRvcyBwdWVkZSBkZXNjcmliaXJzZSBtZWRpYW50ZSB1biBuw7ptZXJvIHJlZHVjaWRvIGRlIGRpcmVjY2lvbmVzIHByaW5jaXBhbGVzLg0KDQogICAtICoqQmFqYSByZWR1bmRhbmNpYToqKiBsYXMgdmFyaWFibGVzIGFwb3J0YW4gaW5mb3JtYWNpw7NuIGRpZmVyZW50ZSB5LCBwb3IgdGFudG8sIHNlIHJlcXVpZXJlbiBtw6FzIGNvbXBvbmVudGVzIHBhcmEgcmVwcmVzZW50YXIgYWRlY3VhZGFtZW50ZSBsYSB2YXJpYWJpbGlkYWQgZGVsIGNvbmp1bnRvIGRlIGRhdG9zLg0KICAgDQogICAtICoqQWx0YSByZWR1bmRhbmNpYToqKiBsYXMgdmFyaWFibGVzIGNvbnRpZW5lbiBpbmZvcm1hY2nDs24gc2ltaWxhciBkZWJpZG8gYSBzdSBmdWVydGUgY29ycmVsYWNpw7NuLCBwZXJtaXRpZW5kbyBxdWUgbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkIHNlIGNvbmNlbnRyZSBlbiBwb2NvcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcy4NCg0KICAgQXByb3ZlY2hhbmRvIGVzdGEgcmVkdW5kYW5jaWEsIFBDQSB0cmFuc2Zvcm1hIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyBlbiB1biBjb25qdW50byBtZW5vciBkZSBudWV2YXMgdmFyaWFibGVzIGRlbm9taW5hZGFzICoqY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMqKi4gRXN0b3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgY29uc2VydmFuIGxhIG1heW9yIHBhcnRlIGRlIGxhIHZhcmlhbnphIHByZXNlbnRlIGVuIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcywgcGVybWl0aWVuZG8gcmVkdWNpciBsYSBkaW1lbnNpb25hbGlkYWQgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGNvbiB1bmEgcMOpcmRpZGEgbcOtbmltYSBkZSBpbmZvcm1hY2nDs24uDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWR1bmRhbmNpYTEsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipUaXBvcyBkZSByZWR1bmRhbmNpYSoqIiwgb3V0LndpZHRoID0gIjgwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWR1bmRhbmNpYTEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KNi4gRW4gc2l0dWFjaW9uZXMgZGUgYWx0YSByZWR1bmRhbmNpYSwgY29tbyBlbiBsYSBmaWd1cmEgXEByZWYoZmlnOlJlZHVuZGFuY2lhMSliLCBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgYXBvcnRhbiBpbmZvcm1hY2nDs24gbXV5IHBhcmVjaWRhLiBQb3IgZXN0YSByYXrDs24sIHVuYSBzb2xhIGNvbXBvbmVudGUgcHJpbmNpcGFsIHB1ZWRlIHJlcHJlc2VudGFyIGFkZWN1YWRhbWVudGUgbGEgbWF5b3IgcGFydGUgZGUgbGEgZXN0cnVjdHVyYSB5IHZhcmlhYmlsaWRhZCBkZSBsb3MgZGF0b3MuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ29uY2x1c2nDs24NCg0KRW4gcmVzdW1lbiwgZWwgb2JqZXRpdm8gcHJpbmNpcGFsIGRlbCBhbsOhbGlzaXMgZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgZXM6DQogICAgDQogICAtIElkZW50aWZpY2FyIHBhdHJvbmVzIG9jdWx0b3MgZW4gdW4gY29uanVudG8gZGUgZGF0b3MuDQogICAgDQogICAtIFJlZHVjaXIgbGEgZGltZW5zaW9uYWxpZGFkIGRlIGxvcyBkYXRvcyBlbGltaW5hbmRvIGVsIHJ1aWRvIHkgbGEgcmVkdW5kYW5jaWEgZW4gbG9zIGRhdG9zLg0KICAgIA0KICAgLSBJZGVudGlmaWNhciB2YXJpYWJsZXMgY29ycmVsYWNpb25hZGFzLg0KICAgIA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUGFzb3MgcGFyYSAgcmVhbGl6YXIgdW4gUENBDQoNClZhbW9zIGEgZXhwbGljYXIgZWwgUENBIHBhc28gYSBwYXNvIHNpbiB1dGlsaXphciBkZW1hc2lhZGEgdGVybWlub2xvZ8OtYSBtYXRlbcOhdGljYSBhdmFuemFkYS4gRW4gZ2VuZXJhbCwgc2UgcHVlZGUgdmlzdWFsaXphciBlbiAgbGEgZmlndXJhIFxAcmVmKGZpZzpQQ0E0KS4NCg0KDQo8Y2VudGVyPg0KYGBge3IgUENBNCwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKlBhc29zIGdlbmVyYWxlcyBwYXJhIGFwbGljYXIgdW4gUENBKioiLCBvdXQud2lkdGggPSAiMTAwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJQQ0E0LnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUGFzbyAxOiBEZXNjcmliaXIgbG9zIERhdG9zIHkgb2JqZXRpdm8NCg0KU3Vwb25nYSBxdWUsIGVuIHVuIGVzdHVkaW8gcmVhbGl6YWRvIHNvYnJlICRuJCBpbmRpdmlkdW9zLCAgc2UgdGllbmUgdW4gdmVjdG9yICRYPShYXzEsIFhfMiwgXGxkb3RzLCBYX0spXlQkIGRlIHRhbWHDsW8gJEskLiBFbCBvYmpldGl2byBlcyBlbmNvbnRyYXIgbnVldmFzIHZhcmlhYmxlcyBub3RhZGFzIGNvbW8gJFlfaiQsICRqPTEsIFxsZG90cywgSiQsICBxdWUgc2VhbiBjb21iaW5hY2lvbmVzIGxpbmVhbGVzIGRlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyAkWF9rJC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUGFzbyAyOiBFc3RhbmRhcml6YWNpw7NuIGRlIGRhdG9zDQoNCiNBbnRlcyBkZSBjb21lbnphciBlbCBQQ0EsIGVzIMO6dGlsIGVzdGFuZGFyaXphciBsb3MgZGF0b3MuIEVzdG8gc2lnbmlmaWNhIHJlc3RhciBsYSBtZWRpYSB5IGRpdmlkaXIgcG9yIGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBwYXJhIHF1ZSB0b2RhcyBsYXMgdmFyaWFibGVzIHRlbmdhbiBsYSBtaXNtYSBlc2NhbGEuIEVzdG8gZmFjaWxpdGEgbGEgY29tcGFyYWNpw7NuLg0KDQojJCRaX3tpa30gPSBcZnJhY3tYX3tpa30gLSBcYmFye1hfa319e3Nfa30kJA0KDQojRG9uZGUgJFpfe2lrfSQgIGVzIGxhIHZhcmlhYmxlIGVzdGFuZGFyaXphZGEsICRYX3tpa30kIGVzICRLJC3DqXNpbWEgdmFyaWFibGUgZW4gbGEgb2JzZXJ2YWNpw7NuICRpJCwgJFhfayQgeSAkc19rJCBzb24gbGEgbWVkaWEgZGUgbGEgdmFyaWFibGUgeSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgZGUgbGEgJGskLcOpc2ltYSAgdmFyaWFibGUuDQoNCmBgYA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBQYXNvIDI6IERlZmluaXIgbGFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzDQoNClNlIHByb2NlZGUgZGUgbGEgc2lndWllbnRlIG1hbmVyYToNCg0KKipPYnNlcnZhY2nDs24gMi4xOioqDQoNCkxhIHByaW1lcmEgY29tcG9uZW50ZSBwcmluY2lwYWwgJFlfMSQgZXMgdW5hIGNvbWJpbmFjacOzbiBsaW5lYWwgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIHF1ZSBjYXB0dXJhIGxhIG3DoXhpbWEgdmFyaWFiaWxpZGFkIHBvc2libGUgY29udGVuaWRhIGVuIGxvcyBkYXRvczoNCg0KJCQNCllfMSBcOz1cOyBhX3sxMX1cLCBYXzEgXDsrXDsgYV97MTJ9XCwgWF8yIFw7K1w7IFxjZG90cyBcOytcOyBhX3sxS31cLCBYX0sNClw7PVw7DQphXzFeVCBYDQokJA0KDQpkb25kZQ0KDQokJA0KYV8xPShhX3sxMX0sYV97MTJ9LFxsZG90cyxhX3sxS30pXlQNCiQkDQoNCmVzIHVuIHZlY3RvciB1bml0YXJpbyBlc2NvZ2lkbyBkZSB0YWwgZm9ybWEgcXVlIG1heGltaWNlIGxhIHZhcmlhbnphIGRlICRZXzEkLCBzdWpldG8gYSBsYSByZXN0cmljY2nDs246DQoNCiQkDQphXzFeVCBcLCBhXzENClw7PVw7DQpcc3VtX3trPTF9XntLfSBhX3sxa31eMg0KXDs9XDsNCjENCiQkDQoNCioqT2JzZXJ2YWNpw7NuIDIuMjoqKg0KDQpMYSBzZWd1bmRhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZXzIkIGVzIG90cmEgY29tYmluYWNpw7NuIGxpbmVhbCBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXM6DQoNCiQkDQpZXzINClw7PVw7DQphX3syMX1cLCBYXzEgXDsrXDsgYV97MjJ9XCwgWF8yIFw7K1w7ICBcY2RvdHMgXDsrXDsgIGFfezJLfVwsIFhfSw0KXDs9XDsNCmFfMl5UIFwsIFgNCiQkDQoNCmRvbmRlOg0KDQotICRZXzIkIGVzIGluY29ycmVsYWRhIGNvbiAkWV8xJCwgZXMgZGVjaXIsDQoNCiQkDQpDb3YoWV8xLFlfMik9MA0KJCQNCg0KLSB5IGNhcHR1cmEgbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkIHJlc3RhbnRlIGRlIGxvcyBkYXRvcyBiYWpvIGxhIHJlc3RyaWNjacOzbiBkZSBzZXIgb3J0b2dvbmFsIGEgJFlfMSQuDQoNCioqT2JzZXJ2YWNpw7NuIDIuMzoqKg0KDQpEZWwgbWlzbW8gbW9kbyBzZSBjb25zdHJ1eWVuIGxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcw0KDQokJA0KWV8xLCBZXzIsIFxsZG90cywgWV9KDQokJA0KDQpkZSBtYW5lcmEgcXVlOg0KDQotIHNlYW4gaW5jb3JyZWxhZGFzIGVudHJlIHPDrSwNCg0KLSBlc3TDqW4gYXNvY2lhZGFzIGEgZGlyZWNjaW9uZXMgb3J0b2dvbmFsZXMsDQoNCi0geSBleHBsaXF1ZW4gY2FudGlkYWRlcyBkZWNyZWNpZW50ZXMgZGUgdmFyaWFuemEuDQoNCioqT2JzZXJ2YWNpw7NuIDIuNDoqKg0KDQpMYSAkaiQtw6lzaW1hIGNvbXBvbmVudGUgcHJpbmNpcGFsIHNlIGRlZmluZSBjb21vOg0KDQokJA0KWV9qDQpcOz1cOw0KYV97ajF9XCwgWF8xICsgYV97ajJ9XCwgWF8yICsgXGNkb3RzICsgYV97akt9XCwgWF9LDQpcOz1cOw0KYV9qXlQgXCwgWA0KJCQNCg0KZG9uZGUNCg0KJCQNCmFfalw7PVw7KGFfe2oxfSxhX3tqMn0sXGxkb3RzLGFfe2pLfSleVA0KJCQNCg0KZXMgdW4gdmVjdG9yIHVuaXRhcmlvIHF1ZSBzYXRpc2ZhY2U6DQoNCiQkDQphX2peVCBhX2oNClw7PVw7DQpcc3VtX3trPTF9XntLfSBhX3tqa31eMg0KXDs9XDsNCjENCiQkDQoNCkFkZW3DoXMsIGxvcyB2ZWN0b3JlcyBhc29jaWFkb3MgYSBkaXN0aW50YXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgc29uIG9ydG9nb25hbGVzIGVudHJlIHPDrS4NCg0KKipPYnNlcnZhY2nDs24gMi41OioqDQoNCkxhIHZhcmlhbnphIGRlICRZX2okIHNlIG9idGllbmUgdXRpbGl6YW5kbyBsYSBwcm9waWVkYWQgZGUgbGFzIGNvbWJpbmFjaW9uZXMgbGluZWFsZXMgZGUgdmFyaWFibGVzIGFsZWF0b3JpYXM6DQoNCiQkDQpWKEFYKT1BXCxDb3YoWClcLEFeVA0KJCQNCg0KQ29tbyBsYSBtYXRyaXogZGUgY292YXJpYW56YXMgZGVsIHZlY3RvciBhbGVhdG9yaW8gJFgkIHNlIGRlbm90YSBwb3I6DQoNCiQkDQpDb3YoWCk9XFNpZ21hDQokJA0KDQplbnRvbmNlczoNCg0KJCQNClYoWV9qKQ0KPQ0KVihhX2peVFwsIFgpDQo9DQphX2peVCBcLCAgXFNpZ21hIFwsIGFfag0KJCQNCg0KTGEgZXhwcmVzacOzbg0KDQokJA0KYV9qXlQgXFNpZ21hIFwsIGFfag0KJCQNCg0KY29ycmVzcG9uZGUgYSBsYSBmb3JtYSBtYXRyaWNpYWwgY29tcGFjdGEgZGUgY2FsY3VsYXIgbGEgdmFyaWFuemEgZGUgdW5hIGNvbWJpbmFjacOzbiBsaW5lYWwgZGUgdmFyaWFibGVzIGFsZWF0b3JpYXMuDQoNClBvciBlamVtcGxvLCBlbiBlbCBjYXNvIGRlIGRvcyB2YXJpYWJsZXM6DQoNCiQkDQpZXDsgPVw7IGFfMVhfMVw7ICtcOyBhXzJYXzINCiQkDQoNCmxhIHZhcmlhbnphIHZpZW5lIGRhZGEgcG9yOg0KDQokJA0KVihZKQ0KXDsgPVw7DQphXzFeMlwsIFYoWF8xKQ0KXDsgK1w7DQphXzJeMlwsVihYXzIpDQpcOyArXDsNCjJcLGFfMVwsYV8yXCxDb3YoWF8xLFhfMikNCiQkDQoNCkFob3JhLCBzaSBkZWZpbmltb3M6DQoNCiQkDQphPQ0KXGJlZ2lue2JtYXRyaXh9DQphXzFcXA0KYV8yDQpcZW5ke2JtYXRyaXh9DQpccXVhZA0KXG1ib3h7eX0NClxxdWFkDQpcU2lnbWE9DQpcYmVnaW57Ym1hdHJpeH0NClYoWF8xKSAmIENvdihYXzEsWF8yKVxcDQpDb3YoWF8xLFhfMikgJiBWKFhfMikNClxlbmR7Ym1hdHJpeH0NCiQkDQoNCmVudG9uY2VzOg0KDQokJA0KYV5UXFNpZ21hIGENCiQkDQoNCnByb2R1Y2UgZXhhY3RhbWVudGUgbGEgbWlzbWEgZXhwcmVzacOzbiBhbnRlcmlvci4gUG9yIHRhbnRvLCBsYSBmw7NybXVsYToNCg0KJCQNClYoWV9qKVw7ID1cOyBhX2peVFw7IFxTaWdtYSBcOyBhX2oNCiQkDQoNCmVzIHNpbXBsZW1lbnRlIGxhIGdlbmVyYWxpemFjacOzbiBtYXRyaWNpYWwgZGUgbGEgdmFyaWFuemEgZGUgdW5hIGNvbWJpbmFjacOzbiBsaW5lYWwgZGUgbcO6bHRpcGxlcyB2YXJpYWJsZXMgYWxlYXRvcmlhcy4NCg0KDQoqKk9ic2VydmFjacOzbiAyLjY6KioNCg0KRW4gZ2VuZXJhbCwgZWwgb2JqZXRpdm8gY29uc2lzdGUgZW4gZWxlZ2lyIGVsIHZlY3RvciAkYV9qJCBkZSBtYW5lcmEgcXVlIG1heGltaWNlIGxhIHZhcmlhbnphIGRlICRZX2okLCBzdWpldG8gYSBsYSByZXN0cmljY2nDs246DQoNCiQkDQphX2peVCBhX2ogPSAxDQokJA0KDQp5IGEgbGEgY29uZGljacOzbiBkZSBvcnRvZ29uYWxpZGFkIHJlc3BlY3RvIGEgbGFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHByZXZpYW1lbnRlIG9idGVuaWRhcy4NCg0KKipPYnNlcnZhY2nDs24gMi43OioqDQoNCkxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcw0KDQokJA0KWV8xLFlfMixcbGRvdHMsWV9LDQokJA0KDQpyZXN1bWVuIGxhIHZhcmlhYmlsaWRhZCB0b3RhbCBkZWwgY29uanVudG8gZGUgZGF0b3MgZW4gb3JkZW4gZGVjcmVjaWVudGUgZGUgaW1wb3J0YW5jaWEuIEVuIGNvbnNlY3VlbmNpYSwgbGFzIHByaW1lcmFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIGV4cGxpY2FuIGxhIG1heW9yIHBhcnRlIGRlIGxhIHZhcmlhbnphIGRlIGxvcyBkYXRvcyBvcmlnaW5hbGVzLg0KDQoqKk9ic2VydmFjacOzbiAyLjg6KioNCg0KR2VvbcOpdHJpY2FtZW50ZSwgUENBIHB1ZWRlIGludGVycHJldGFyc2UgY29tbyB1bmEgcm90YWNpw7NuIGRlbCBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIG9yaWdpbmFsIGhhY2lhIG51ZXZhcyBkaXJlY2Npb25lcyBvcnRvZ29uYWxlcyBxdWUgbWF4aW1pemFuIGxhIHZhcmlhYmlsaWRhZCBkZSBsb3MgZGF0b3MuDQoNCioqT2JzZXJ2YWNpw7NuIDIuOToqKg0KDQpFbCBwcm9jZWRpbWllbnRvIG1hdGVtw6F0aWNvIGNvbcO6bm1lbnRlIHV0aWxpemFkbyBwYXJhIG1heGltaXphciBmdW5jaW9uZXMgYmFqbyByZXN0cmljY2lvbmVzIGNvcnJlc3BvbmRlIGFsIG3DqXRvZG8gZGUgbG9zIG11bHRpcGxpY2Fkb3JlcyBkZSBMYWdyYW5nZS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBQYXNvIDM6IE1hdHJpeiBkZSBjb3ZhcmlhbnphcyBvIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzDQoNCkV4aXN0ZW4gZG9zIGZvcm1hcyBoYWJpdHVhbGVzIGRlIGFwbGljYXIgUENBLg0KDQoqKlByaW1lcmEgZm9ybWEgMy4xOiBNYXRyaXogZGUgY29ycmVsYWNpb25lcyoqDQoNClNlIHJlY29taWVuZGEgdXRpbGl6YXIgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMgY3VhbmRvOg0KDQotIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyBzZSBlbmN1ZW50cmFuIGVuIGRpZmVyZW50ZXMgdW5pZGFkZXMgZGUgbWVkaWRhLA0KDQotIG8gbGFzIHZhcmlhYmxlcyBwcmVzZW50YW4gdmFyaWFuemFzIG11eSBkaWZlcmVudGVzIGVudHJlIHPDrS4NCg0KRW4gZXN0ZSBjYXNvLCBub3JtYWxtZW50ZSBzZSByZXF1aWVyZSBlc3RhbmRhcml6YXIgcHJldmlhbWVudGUgbG9zIGRhdG9zLg0KDQoqKlNlZ3VuZGEgZm9ybWEgMy4yOiBNYXRyaXogZGUgY292YXJpYW56YXMqKg0KDQpTZSByZWNvbWllbmRhIHV0aWxpemFyIGxhIG1hdHJpeiBkZSBjb3ZhcmlhbnphcyAkXFNpZ21hJCBjdWFuZG86DQoNCi0gbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIHNlIGVuY3VlbnRyYW4gZW4gbGFzIG1pc21hcyB1bmlkYWRlcywNCg0KLSB5IHNlIGRlc2VhIGNvbnNlcnZhciBsYSBpbmZvcm1hY2nDs24gcHJvcG9yY2lvbmFkYSBwb3IgbGFzIGRpZmVyZW5jaWFzIG5hdHVyYWxlcyBkZSB2YXJpYWJpbGlkYWQgZW50cmUgbGFzIHZhcmlhYmxlcy4NCg0KKipPYnNlcnZhY2nDs24gMy4zOioqDQoNClNpIGxhcyB2YXJpYWJsZXMgY29tcGFydGVuIHVuaWRhZGVzIHNpbWlsYXJlcywgYW1iYXMgYWx0ZXJuYXRpdmFzIHNvbiBmYWN0aWJsZXMuIEVuIHNpdHVhY2lvbmVzIGRlIGluY2VydGlkdW1icmUsIHB1ZWRlIHJlc3VsdGFyIMO6dGlsIHJlYWxpemFyIGFtYm9zIGFuw6FsaXNpcyB5IGNvbXBhcmFyIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcy4NCg0KKipPYnNlcnZhY2nDs24gMy40OioqDQoNCkVuIGxvcyBwYXNvcyBzaWd1aWVudGVzIHNlIGNvbnNpZGVyYXLDoSDDum5pY2FtZW50ZSBsYSBtYXRyaXogZGUgY292YXJpYW56YXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUGFzbyA0OiBDw6FsY3VsbyBkZSB2ZWN0b3JlcyB5IHZhbG9yZXMgcHJvcGlvcw0KDQpTZSBjYWxjdWxhbiBsb3MgdmFsb3JlcyBwcm9waW9zIHkgdmVjdG9yZXMgcHJvcGlvcyBkZSBsYSBtYXRyaXogZGUgY292YXJpYW56YXMgJFxTaWdtYSQuDQoNClNpICRhX2okIGVzIHVuIHZlY3RvciBwcm9waW8gZGUgJFxTaWdtYSQgYXNvY2lhZG8gYWwgdmFsb3IgcHJvcGlvICRcbGFtYmRhX2okLCBlbnRvbmNlcyBzZSBjdW1wbGU6DQoNCiQkDQpcU2lnbWEgXCwgYV9qDQpcOz1cOw0KXGxhbWJkYV9qXCwgYV9qDQokJA0KDQpDb21vOg0KDQokJA0KVihZX2opDQpcOz1cOw0KVihhX2peVCBcLCBYKQ0KXDs9XDsNCmFfal5UIFwsIFxTaWdtYSBcLCBhX2oNCiQkDQoNCmVudG9uY2VzOg0KDQokJA0KVihZX2opDQpcOz1cOw0KYV9qXlRcLCAoXGxhbWJkYV9qIFwsIGFfaikNClw7PVw7DQpcbGFtYmRhX2ogXCwgYV9qXlRcLCAgYV9qDQokJA0KDQp5IGRhZG8gcXVlOg0KDQokJA0KYV9qXlQgXCwgYV9qIFw7PVw7IDENCiQkDQoNCnNlIG9idGllbmU6DQoNCiQkDQpWKFlfailcOz1cO1xsYW1iZGFfag0KJCQNCg0KUG9yIHRhbnRvOg0KDQotIGNhZGEgdmFsb3IgcHJvcGlvIHJlcHJlc2VudGEgbGEgdmFyaWFuemEgZXhwbGljYWRhIHBvciB1bmEgY29tcG9uZW50ZSBwcmluY2lwYWwsDQoNCi0geSBjYWRhIHZlY3RvciBwcm9waW8gZGVmaW5lIGxhIGRpcmVjY2nDs24gcHJpbmNpcGFsIGNvcnJlc3BvbmRpZW50ZS4NCg0KRW4gY29uc2VjdWVuY2lhLCBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgdmllbmVuIGRhZGFzIHBvcjoNCg0KJCQNCllfalw7PVw7YV9qXlQgWCwNClxxdWFkDQpqPTEsXGxkb3RzLEsNCiQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUGFzbyA1OiBTZWxlY2Npw7NuIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzDQoNClVuYSB2ZXogb2J0ZW5pZGFzIGxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcywgc2Ugc2VsZWNjaW9uYW4gYXF1ZWxsYXMgcXVlIGV4cGxpcXVlbiB1bmEgcHJvcG9yY2nDs24gc3VmaWNpZW50ZW1lbnRlIGFsdGEgZGUgbGEgdmFyaWFiaWxpZGFkIHRvdGFsIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KQWxndW5vcyBjcml0ZXJpb3MgaGFiaXR1YWxtZW50ZSB1dGlsaXphZG9zIHNvbjoNCg0KLSBSZXRlbmVyIGxhcyBjb21wb25lbnRlcyBuZWNlc2FyaWFzIHBhcmEgYWxjYW56YXIgdW4gcG9yY2VudGFqZSBhY3VtdWxhZG8gZGUgdmFyaWFuemEgZXhwbGljYWRhIChwb3IgZWplbXBsbywgNzAlLCA4MCUgbyA5MCUpLg0KDQotIFV0aWxpemFyIGVsIGNyaXRlcmlvIGRlIEthaXNlciwgZWwgY3VhbCBzdWdpZXJlIGNvbnNlcnZhciDDum5pY2FtZW50ZSBsYXMgY29tcG9uZW50ZXMgY3V5b3MgdmFsb3JlcyBwcm9waW9zIHNhdGlzZmFjZW46DQoNCiQkDQpcbGFtYmRhX2ogPiAxDQokJA0KDQotIEFuYWxpemFyIHZpc3VhbG1lbnRlIGVsIGdyw6FmaWNvICpTY3JlZSBQbG90KiBwYXJhIGlkZW50aWZpY2FyIGVsIHB1bnRvIGRlIGluZmxleGnDs24gYSBwYXJ0aXIgZGVsIGN1YWwgbG9zIHZhbG9yZXMgcHJvcGlvcyBkZWNyZWNlbiBsZW50YW1lbnRlLg0KDQoqKk9ic2VydmFjacOzbiA1LjE6KioNCg0KTG9zIHZhbG9yZXMgcHJvcGlvcw0KDQokJA0KXGxhbWJkYV8xLFwsIFxsYW1iZGFfMixcLCBcbGRvdHMsXCwgXGxhbWJkYV9LDQokJA0KDQpyZXByZXNlbnRhbiBsYSBjYW50aWRhZCBkZSB2YXJpYWJpbGlkYWQgZXhwbGljYWRhIHBvciBjYWRhIGNvbXBvbmVudGUgcHJpbmNpcGFsLg0KDQoqKk9ic2VydmFjacOzbiA1LjI6KioNCg0KTG9zIHZhbG9yZXMgcHJvcGlvcyBhc29jaWFkb3MgYSBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgY29ycmVzcG9uZGVuIGEgc3VzIHJlc3BlY3RpdmFzIHZhcmlhbnphcy4gRXMgZGVjaXI6DQoNCiQkDQpWKFlfailcOz1cOyBcbGFtYmRhX2osDQpccXVhZA0Kaj0xLDIsXGxkb3RzLEsNCiQkDQoNCioqT2JzZXJ2YWNpw7NuIDUuMzoqKg0KDQpMb3MgdmFsb3JlcyBwcm9waW9zIHNlIG9yZGVuYW4gZGUgbWF5b3IgYSBtZW5vcjoNCg0KJCQNClxsYW1iZGFfMQ0KXDtcZ2VxXDsgDQpcbGFtYmRhXzINClw7XGdlcVw7IA0KXGNkb3RzDQpcO1xnZXFcOyANClxsYW1iZGFfSw0KJCQNCg0KUG9yIGNvbnNpZ3VpZW50ZSwgbGFzIHByaW1lcmFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIGNvbmNlbnRyYW4gbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkIHRvdGFsIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KKipPYnNlcnZhY2nDs24gNS40OioqDQoNCkxhIHByb3BvcmNpw7NuIGRlIHZhcmlhbnphIGV4cGxpY2FkYSBwb3IgbGEgY29tcG9uZW50ZSBwcmluY2lwYWwgJGokIHNlIGNhbGN1bGEgbWVkaWFudGU6DQoNCiQkDQpcZnJhY3tcbGFtYmRhX2p9e1xzdW1cbGltaXRzX3trPTF9XntLfVxsYW1iZGFfa30NCiQkDQoNCm1pZW50cmFzIHF1ZSBsYSBwcm9wb3JjacOzbiBhY3VtdWxhZGEgZGUgdmFyaWFuemEgZXhwbGljYWRhIHZpZW5lIGRhZGEgcG9yOg0KDQokJA0KXGZyYWN7XHN1bVxsaW1pdHNfe2o9MX1ee219XGxhbWJkYV9qfQ0Ke1xzdW1cbGltaXRzX3trPTF9XntLfVxsYW1iZGFfa30NCiQkDQoNCmRvbmRlICRtJCByZXByZXNlbnRhIGVsIG7Dum1lcm8gZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgcmV0ZW5pZGFzLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFBhc28gNjogUHJveWVjY2nDs24gZGUgbG9zIGRhdG9zDQoNCkxhcyBvYnNlcnZhY2lvbmVzIG9yaWdpbmFsZXMgc2UgcHJveWVjdGFuIHNvYnJlIGxhcyBudWV2YXMgZGlyZWNjaW9uZXMgZGVmaW5pZGFzIHBvciBsb3MgdmVjdG9yZXMgcHJvcGlvcyBhc29jaWFkb3MgYSBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuDQoNClNpOg0KDQotICR4X2kkIHJlcHJlc2VudGEgbGEgb2JzZXJ2YWNpw7NuICRpJCwgY29uICRpPTEsMixcbGRvdHMsbiQNCg0KLSB5ICRhX2okIHJlcHJlc2VudGEgZWwgdmVjdG9yIHByb3BpbyBhc29jaWFkbyBhIGxhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRqJCwgY29uICRqPTEsMixcbGRvdHMsSyQNCg0KZW50b25jZXMgbGEgY29vcmRlbmFkYSBwcm95ZWN0YWRhIHZpZW5lIGRhZGEgcG9yOg0KDQokJA0KeV97aWp9PWFfal5UIHhfaQ0KJCQNCg0KZG9uZGUgJHlfe2lqfSQgcmVwcmVzZW50YSBsYSBjb29yZGVuYWRhIGRlIGxhIG9ic2VydmFjacOzbiAkaSQgc29icmUgbGEgY29tcG9uZW50ZSBwcmluY2lwYWwgJGokLg0KDQpFbiBmb3JtYSBtYXRyaWNpYWw6DQoNCiQkDQpZID0gWEENCiQkDQoNCmRvbmRlOg0KDQokJA0KWFw7ID1cOw0KXGJlZ2lue2JtYXRyaXh9DQp4X3sxMX0gJiB4X3sxMn0gJiBcY2RvdHMgJiB4X3sxS31cXA0KeF97MjF9ICYgeF97MjJ9ICYgXGNkb3RzICYgeF97Mkt9XFwNClx2ZG90cyAmIFx2ZG90cyAmIFxkZG90cyAmIFx2ZG90c1xcDQp4X3tuMX0gJiB4X3tuMn0gJiBcY2RvdHMgJiB4X3tuS30NClxlbmR7Ym1hdHJpeH0NCiQkDQoNCmNvcnJlc3BvbmRlIGEgbGEgbWF0cml6IGRlIGRhdG9zIG9yaWdpbmFsZXMsIGNvbjoNCg0KLSAkbiQgb2JzZXJ2YWNpb25lcyAoZmlsYXMpLA0KDQotIHkgJEskIHZhcmlhYmxlcyBvcmlnaW5hbGVzIChjb2x1bW5hcykuDQoNCkxhIG1hdHJpeiBkZSB2ZWN0b3JlcyBwcm9waW9zIHZpZW5lIGRhZGEgcG9yOg0KDQokJA0KQVw7ID1cOw0KXGJlZ2lue2JtYXRyaXh9DQphX3sxMX0gJiBhX3sxMn0gJiBcY2RvdHMgJiBhX3sxS31cXA0KYV97MjF9ICYgYV97MjJ9ICYgXGNkb3RzICYgYV97Mkt9XFwNClx2ZG90cyAmIFx2ZG90cyAmIFxkZG90cyAmIFx2ZG90c1xcDQphX3tLMX0gJiBhX3tLMn0gJiBcY2RvdHMgJiBhX3tLS30NClxlbmR7Ym1hdHJpeH0NClw7ID1cOw0KXGJlZ2lue2JtYXRyaXh9DQphXzEgJiBhXzIgJiBcY2RvdHMgJiBhX0sNClxlbmR7Ym1hdHJpeH0NCiQkDQoNCmRvbmRlIGNhZGEgY29sdW1uYSAkYV9qJCBjb3JyZXNwb25kZSBhbCB2ZWN0b3IgcHJvcGlvIGFzb2NpYWRvIGEgbGEgY29tcG9uZW50ZSBwcmluY2lwYWwgJGokLg0KDQpGaW5hbG1lbnRlLCBsYSBtYXRyaXogcHJveWVjdGFkYSB2aWVuZSBkYWRhIHBvcjoNCg0KJCQNCllcOyA9XDsNClxiZWdpbntibWF0cml4fQ0KeV97MTF9ICYgeV97MTJ9ICYgXGNkb3RzICYgeV97MUt9XFwNCnlfezIxfSAmIHlfezIyfSAmIFxjZG90cyAmIHlfezJLfVxcDQpcdmRvdHMgJiBcdmRvdHMgJiBcZGRvdHMgJiBcdmRvdHNcXA0KeV97bjF9ICYgeV97bjJ9ICYgXGNkb3RzICYgeV97bkt9DQpcZW5ke2JtYXRyaXh9DQokJA0KDQpkb25kZToNCg0KJCQNCnlfe2lqfT1hX2peVCB4X2kNCiQkDQoNCnJlcHJlc2VudGEgbGEgY29vcmRlbmFkYSBkZSBsYSBvYnNlcnZhY2nDs24gJGkkIHByb3llY3RhZGEgc29icmUgbGEgY29tcG9uZW50ZSBwcmluY2lwYWwgJGokLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFBhc28gNzogVmlzdWFsaXphY2nDs24gZSBpbnRlcnByZXRhY2nDs24NCg0KRmluYWxtZW50ZSwgbG9zIGRhdG9zIHByb3llY3RhZG9zIHNvYnJlIGxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBwdWVkZW4gdmlzdWFsaXphcnNlIHBhcmE6DQoNCi0gaWRlbnRpZmljYXIgcGF0cm9uZXMsDQoNCi0gZGV0ZWN0YXIgYWdydXBhbWllbnRvcywNCg0KLSBhbmFsaXphciByZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcywNCg0KLSBleHBsb3JhciByZWR1bmRhbmNpYXMsDQoNCi0geSBkZXNjcmliaXIgbGEgZXN0cnVjdHVyYSBnZW5lcmFsIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KRW4gbXVjaG9zIGNhc29zLCBsYXMgcHJpbWVyYXMgZG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHBlcm1pdGVuIHJlcHJlc2VudGFyIGFkZWN1YWRhbWVudGUgZ3JhbiBwYXJ0ZSBkZSBsYSB2YXJpYWJpbGlkYWQgdG90YWwgbWVkaWFudGUgZ3LDoWZpY29zIGJpZGltZW5zaW9uYWxlcy4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBQcm9waWVkYWRlcyBzZWfDum4gbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzDQoNCiMjIyBQcm9waWVkYWRlcyBiw6FzaWNhcw0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KKipQcm9waWVkYWQgMToqKg0KDQpMYSBpbmZsdWVuY2lhIGRlIGxhIHZhcmlhYmxlIG9yaWdpbmFsICRYX2skIHNvYnJlIGxhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZX2okIGVzdMOhIGRldGVybWluYWRhIHBvciBsYSBtYWduaXR1ZCBkZWwgY29lZmljaWVudGUgJGFfe2prfSQuDQoNCkVuIGdlbmVyYWw6DQoNCi0gdmFsb3JlcyBncmFuZGVzIGRlICR8YV97amt9fCQgaW5kaWNhbiB1bmEgbWF5b3IgY29udHJpYnVjacOzbiBkZSBsYSB2YXJpYWJsZSAkWF9rJCBhIGxhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZX2okLA0KDQotIG1pZW50cmFzIHF1ZSB2YWxvcmVzIGNlcmNhbm9zIGEgY2VybyBpbmRpY2FuIHVuYSBjb250cmlidWNpw7NuIHJlZHVjaWRhLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KKipQcm9waWVkYWQgMjoqKg0KDQpSZWNvcmRlbW9zIHF1ZSBsYSBtYXRyaXogZGUgY292YXJpYW56YXMgdmllbmUgZGFkYSBwb3I6DQoNCiQkDQpcU2lnbWE9DQpcYmVnaW57Ym1hdHJpeH0NCkNvdihYXzEsWF8xKSAmIENvdihYXzEsWF8yKSAmIFxjZG90cyAmIENvdihYXzEsWF9LKVxcDQpDb3YoWF8yLFhfMSkgJiBDb3YoWF8yLFhfMikgJiBcY2RvdHMgJiBDb3YoWF8yLFhfSylcXA0KXHZkb3RzICYgXHZkb3RzICYgXGRkb3RzICYgXHZkb3RzXFwNCkNvdihYX0ssWF8xKSAmIENvdihYX0ssWF8yKSAmIFxjZG90cyAmIENvdihYX0ssWF9LKQ0KXGVuZHtibWF0cml4fQ0KJCQNCg0KUG9yIHRhbnRvOg0KDQokJA0KQ292KFhfayxYKQ0KPQ0KXGJlZ2lue2JtYXRyaXh9DQpDb3YoWF9rLFhfMSlcXA0KQ292KFhfayxYXzIpXFwNClx2ZG90c1xcDQpDb3YoWF9rLFhfSykNClxlbmR7Ym1hdHJpeH0NCiQkDQoNCmNvbnRpZW5lIGxhcyBjb3ZhcmlhbnphcyBlbnRyZSBsYSB2YXJpYWJsZSAkWF9rJCB5IGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcy4gVGVuaWVuZG8gZW4gY3VlbnRxYSBsbG8gYW50ZXJpb3IgeSB1dGlsaXphbmRvIGxhIGxpbmVhbGlkYWQgZGUgbGEgY292YXJpYW56YSwgbGEgY292YXJpYW56YSBlbnRyZSBsYSB2YXJpYWJsZSBvcmlnaW5hbCAkWF9rJCB5IGxhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZX2okIHZpZW5lIGRhZGEgcG9yOg0KDQokJA0KQ292KFhfayxZX2opDQpcOz1cOw0KQ292KFhfayxcOyBhX2peVFwsIFgpDQpcOz1cOw0KXHN1bV97aT0xfV57S31hX3tpan0gXCwgQ292KFhfayxYX2kpDQpcOz1cOw0KQ292KFhfayxYKV5UIGFfag0KJCQNCg0KDQoNClBvciBjb25zaWd1aWVudGU6DQoNCiQkDQpDb3YoWF9rLFlfaikNClw7PVw7DQpcYmVnaW57Ym1hdHJpeH0NCkNvdihYX2ssWF8xKSAmDQpDb3YoWF9rLFhfMikgJg0KXGNkb3RzICYNCkNvdihYX2ssWF9LKQ0KXGVuZHtibWF0cml4fSBcLCANCmFfag0KJCQNCg0KQWhvcmEsIHJlY29yZGVtb3MgcXVlOg0KDQokJA0KXFNpZ21hXCwgYV9qXDs9XDtcbGFtYmRhX2ogXCxhX2oNCiQkDQoNClBvciB0YW50bywgbGEgJGskLcOpc2ltYSBlbnRyYWRhIGRlbCB2ZWN0b3IgJFxTaWdtYSBhX2okIHZpZW5lIGRhZGEgcG9yOg0KDQokJA0KXHN1bV97aT0xfV57S31Db3YoWF9rLFhfaSlcLCBhX3tpan0NClw7PVw7DQpcbGFtYmRhX2ogXCwgYV97a2p9DQokJA0KDQpMdWVnbzoNCg0KJCQNCkNvdihYX2ssWV9qKQ0KXDs9XDsNClxsYW1iZGFfaiBcLCBhX3tran0NCiQkDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDM6KioNCg0KU2FiZW1vcyBxdWU6DQoNCiQkDQpWKEFYKT1BXCxWKFgpXCxBXlQNCiQkDQoNCm8gZXF1aXZhbGVudGVtZW50ZSwgcGFyYSB2ZWN0b3JlcyBjb2x1bW5hOg0KDQokJA0KVihhX2peVCBYKT1hX2peVFwsVihYKVwsYV9qDQokJCANCg0KUG9yIGNvbnNpZ3VpZW50ZSwgbGEgdmFyaWFuemEgZGUgbGEgY29tcG9uZW50ZSBwcmluY2lwYWwgJFlfayQgdmllbmUgZGFkYSBwb3I6DQoNCiQkDQpWKFlfaikNClw7PVw7DQpWKGFfal5UIFgpDQpcOz1cOw0KYV9qXlRcLCBWKFgpXCwgYV9qDQpcOz1cOw0KYV9qXlRcLCBcU2lnbWFcLCBhX2oNClw7PVw7DQphX2peVFwsIFxsYW1iZGFfaiBcLCBhX2oNClw7PVw7DQpcbGFtYmRhX2ogKGFfal5UXCwgYV9qKSANClw7PVw7DQpcbGFtYmRhX2oNCiQkDQoNClBvciB0YW50bywgY2FkYSB2YWxvciBwcm9waW8gJFxsYW1iZGFfaiQgcmVwcmVzZW50YSBsYSB2YXJpYW56YSBleHBsaWNhZGEgcG9yIGxhIGNvcnJlc3BvbmRpZW50ZSBjb21wb25lbnRlIHByaW5jaXBhbC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDQ6KioNCg0KUGFyYSB0b2RvICRqXG5lcSBcZWxsJCwgbGFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzICRZX2okIHkgJFlfXGVsbCQgc29uIGluY29ycmVsYWRhcy4gRXMgZGVjaXI6DQoNCiQkDQpDb3YoWV9qLFlfXGVsbCk9MA0KJCQNCg0KRXN0YSBwcm9waWVkYWQgZ2FyYW50aXphIHF1ZSBjYWRhIGNvbXBvbmVudGUgcHJpbmNpcGFsIGFwb3J0YSBpbmZvcm1hY2nDs24gbnVldmEgbm8gY29udGVuaWRhIGVuIGxhcyBkZW3DoXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCA1OioqDQoNCkxvcyB2ZWN0b3JlcyBwcm9waW9zIGFzb2NpYWRvcyBhIHZhbG9yZXMgcHJvcGlvcyBkaXN0aW50b3Mgc29uIG9ydG9nb25hbGVzIGVudHJlIHPDrS4gRXMgZGVjaXIsIHBhcmEgdG9kbyAkalxuZXEgcyQ6DQoNCiQkDQphX2peVFwsIGFfcz0wDQokJA0KDQoNClNhYmVtb3MgcXVlOg0KDQokJA0KWV9qXDsgPVw7IGFfal5UXCwgWA0KXHF1YWRcbWJveHt5fVxxdWFkDQpZX3NcOyA9XDthX3NeVFwsIFgNCiQkDQoNClRlbmllbmRvIGVuIGN1ZW50YSBxdWUgDQokJA0KQ292KEFVLEJXKQ0KXCwgPVw7DQpBXCxDb3YoVSxXKVwsQl5UDQokJA0KDQpkb25kZToNCg0KLSAkVSQgeSAkVyQgc29uIHZlY3RvcmVzIGFsZWF0b3Jpb3MsDQoNCi0gJEEkIHkgJEIkIHNvbiBtYXRyaWNlcyBkZSBjb25zdGFudGVzLCANCg0KZW50b25jZXM6DQoNCiQkDQpDb3YoWV9qLFlfcykNClw7PVw7DQpDb3YoYV9qXlRcLCBYLCBcOyBhX3NeVFwsIFgpDQpcOz1cOw0KYV9qXlRcLCBDb3YoWCxYKSBcLCBhX3MNClw7PVw7DQphX2peVFwsIFxTaWdtYSBcLCBhX3MNClw7PVw7IA0KYV9qXlRcLFxsYW1iZGFfXGVsbCBhX3MNClw7PVw7DQpcbGFtYmRhX3MgYV9qXlRhX3MNClw7PVw7DQowDQokJA0KDQpkZWJpZG8gYSBsYSBvcnRvZ29uYWxpZGFkIGVudHJlIGxvcyB2ZWN0b3JlcyBwcm9waW9zLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KKipQcm9waWVkYWQgNjoqKg0KDQpUb2RhcyBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgcHVlZGVuIGV4cHJlc2Fyc2UgbWF0cmljaWFsbWVudGUgY29tbzoNCg0KJCQNCllcOz1cO1hBDQokJA0KDQpkb25kZToNCg0KJCQNCllcOz1cOw0KXGJlZ2lue2JtYXRyaXh9DQp5X3sxMX0gJiB5X3sxMn0gJiBcY2RvdHMgJiB5X3sxS31cXA0KeV97MjF9ICYgeV97MjJ9ICYgXGNkb3RzICYgeV97Mkt9XFwNClx2ZG90cyAmIFx2ZG90cyAmIFxkZG90cyAmIFx2ZG90c1xcDQp5X3tuMX0gJiB5X3tuMn0gJiBcY2RvdHMgJiB5X3tuS30NClxlbmR7Ym1hdHJpeH0NCiQkDQoNCmVzIGxhIG1hdHJpeiBkZSBkYXRvcyBwcm95ZWN0YWRvcywNCg0KJCQNClhcOz1cOw0KXGJlZ2lue2JtYXRyaXh9DQp4X3sxMX0gJiB4X3sxMn0gJiBcY2RvdHMgJiB4X3sxS31cXA0KeF97MjF9ICYgeF97MjJ9ICYgXGNkb3RzICYgeF97Mkt9XFwNClx2ZG90cyAmIFx2ZG90cyAmIFxkZG90cyAmIFx2ZG90c1xcDQp4X3tuMX0gJiB4X3tuMn0gJiBcY2RvdHMgJiB4X3tuS30NClxlbmR7Ym1hdHJpeH0NCiQkDQoNCmVzIGxhIG1hdHJpeiBkZSBkYXRvcyBvcmlnaW5hbGVzLCB5DQoNCiQkDQpBXDs9XDsNClxiZWdpbntibWF0cml4fQ0KYV97MTF9ICYgYV97MTJ9ICYgXGNkb3RzICYgYV97MUt9XFwNCmFfezIxfSAmIGFfezIyfSAmIFxjZG90cyAmIGFfezJLfVxcDQpcdmRvdHMgJiBcdmRvdHMgJiBcZGRvdHMgJiBcdmRvdHNcXA0KYV97SzF9ICYgYV97SzJ9ICYgXGNkb3RzICYgYV97S0t9DQpcZW5ke2JtYXRyaXh9DQpcOz1cOw0KXGJlZ2lue2JtYXRyaXh9DQphXzEgJiBhXzIgJiBcY2RvdHMgJiBhX0sNClxlbmR7Ym1hdHJpeH0NCiQkDQoNCmVzIGxhIG1hdHJpeiBjdXlvcyB2ZWN0b3JlcyBjb2x1bW5hIGNvcnJlc3BvbmRlbiBhIGxvcyB2ZWN0b3JlcyBwcm9waW9zIGFzb2NpYWRvcyBhIGxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcy4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDc6KioNCg0KTGEgbWF0cml6IGRlIGNvdmFyaWFuemFzIGRlIGxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyB2aWVuZSBkYWRhIHBvcjoNCg0KJCQNClxMYW1iZGENClw7PVw7DQpWKFkpDQpcOz1cOw0KVihYQSkNClw7PVw7DQpBXlRcLCBWKFgpXCwgQQ0KXDs9XDsNCkFeVFwsIFxTaWdtYSBcLCBBDQokJA0KDQpkb25kZToNCg0KJCQNClxMYW1iZGFcOz1cOw0KXGJlZ2lue2JtYXRyaXh9DQpcbGFtYmRhXzEgJiAwICYgXGNkb3RzICYgMFxcDQowICYgXGxhbWJkYV8yICYgXGNkb3RzICYgMFxcDQpcdmRvdHMgJiBcdmRvdHMgJiBcZGRvdHMgJiBcdmRvdHNcXA0KMCAmIDAgJiBcY2RvdHMgJiBcbGFtYmRhX0sNClxlbmR7Ym1hdHJpeH0NCiQkDQoNCmVzIHVuYSBtYXRyaXogZGlhZ29uYWwgY3V5b3MgZWxlbWVudG9zIGRpYWdvbmFsZXMgY29ycmVzcG9uZGVuIGEgbG9zIHZhbG9yZXMgcHJvcGlvcyBkZSAkXFNpZ21hJC4NCg0KTGEgZGlhZ29uYWxpZGFkIGRlICRcTGFtYmRhJCByZWZsZWphIHF1ZSBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgc29uIGluY29ycmVsYWRhcyBlbnRyZSBzw60uDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKkludGVycHJldGFjacOzbiBnZW9tw6l0cmljYSBwcm9mdW5kYSoqDQoNCkFudGVzIGRlIGFwbGljYXIgUENBLCBsYSBtYXRyaXogZGUgY292YXJpYW56YXM6DQoNCiQkDQpcU2lnbWE9DQpcYmVnaW57Ym1hdHJpeH0NClxzaWdtYV8xXjIgJiBjb3ZfezEyfVxcDQpjb3ZfezIxfSAmIFxzaWdtYV8yXjINClxlbmR7Ym1hdHJpeH0NCiQkDQoNCnByZXNlbnRhIGVsZW1lbnRvcyBmdWVyYSBkZSBsYSBkaWFnb25hbCBkaXN0aW50b3MgZGUgY2Vyby4gRXN0byBpbmRpY2EgcXVlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyBlc3TDoW4gY29ycmVsYWNpb25hZGFzIGVudHJlIHPDrS4NCg0KR2VvbcOpdHJpY2FtZW50ZToNCg0KLSBsYXMgdmFyaWFibGVzIGNvbnRpZW5lbiBpbmZvcm1hY2nDs24gcmVkdW5kYW50ZSwNCg0KLSBsYSBudWJlIGRlIGRhdG9zIGFwYXJlY2UgaW5jbGluYWRhIHJlc3BlY3RvIGEgbG9zIGVqZXMgb3JpZ2luYWxlcywNCg0KLSB5IGV4aXN0ZSBkZXBlbmRlbmNpYSBsaW5lYWwgZW50cmUgbGFzIHZhcmlhYmxlcy4NCg0KRGVzcHXDqXMgZGUgYXBsaWNhciBQQ0EsIGxhIG1hdHJpeiBkZSBjb3ZhcmlhbnphcyBkZSBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgdG9tYSBsYSBmb3JtYToNCg0KJCQNClxMYW1iZGE9DQpcYmVnaW57Ym1hdHJpeH0NClxsYW1iZGFfMSAmIDBcXA0KMCAmIFxsYW1iZGFfMg0KXGVuZHtibWF0cml4fQ0KJCQNCg0KQWhvcmE6DQoNCi0gbGFzIGNvdmFyaWFuemFzIGZ1ZXJhIGRlIGxhIGRpYWdvbmFsIGRlc2FwYXJlY2VuLA0KDQotIGxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBzb24gaW5jb3JyZWxhZGFzIGVudHJlIHPDrSwNCg0KLSBsYSBudWJlIGRlIGRhdG9zIHF1ZWRhIGFsaW5lYWRhIGNvbiBsb3MgbnVldm9zIGVqZXMgcHJpbmNpcGFsZXMsDQoNCi0geSBsYSB2YXJpYWJpbGlkYWQgZGUgbG9zIGRhdG9zIHF1ZWRhIGRlc2Fjb3BsYWRhIGVuIGRpcmVjY2lvbmVzIG9ydG9nb25hbGVzLg0KDQpFbiBjb25zZWN1ZW5jaWEsIFBDQSB0cmFuc2Zvcm1hIHVuIHNpc3RlbWEgZGUgdmFyaWFibGVzIGNvcnJlbGFjaW9uYWRhcyBlbiB1biBudWV2byBzaXN0ZW1hIGRlIHZhcmlhYmxlcyBpbmNvcnJlbGFkYXMsIGZhY2lsaXRhbmRvIGxhIGludGVycHJldGFjacOzbiB5IHJlZHVjY2nDs24gZGUgZGltZW5zaW9uYWxpZGFkLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KKipQcm9waWVkYWQgODoqKg0KDQpMYSBtYXRyaXogJEEkIGVzIG9ydG9nb25hbCBwb3JxdWUgc3VzIGNvbHVtbmFzIGZvcm1hbiB1biBjb25qdW50byBvcnRvbm9ybWFsIGRlIHZlY3RvcmVzIHByb3Bpb3MuIEVzIGRlY2lyOg0KDQokJA0KYV9pXlRhX2o9DQpcYmVnaW57Y2FzZXN9DQoxLCAmIGk9alxcDQowLCAmIGlcbmVxIGoNClxlbmR7Y2FzZXN9DQokJA0KDQpFc3RvIHNpZ25pZmljYSBxdWUgY2FkYSB2ZWN0b3IgcHJvcGlvIHRpZW5lIG5vcm1hIGlndWFsIGEgMSB5IHF1ZSB2ZWN0b3JlcyBwcm9waW9zIGRpc3RpbnRvcyBzb24gb3J0b2dvbmFsZXMgZW50cmUgc8OtLg0KDQpQb3IgdGFudG86DQoNCiQkDQpBXlRBPUFBXlQ9SV9LDQokJA0KDQpkb25kZToNCg0KJCQNCklfSz0NClxiZWdpbntibWF0cml4fQ0KMSAmIDAgJiBcY2RvdHMgJiAwXFwNCjAgJiAxICYgXGNkb3RzICYgMFxcDQpcdmRvdHMgJiBcdmRvdHMgJiBcZGRvdHMgJiBcdmRvdHNcXA0KMCAmIDAgJiBcY2RvdHMgJiAxDQpcZW5ke2JtYXRyaXh9DQokJA0KDQpjb3JyZXNwb25kZSBhIGxhIG1hdHJpeiBpZGVudGlkYWQgZGUgZGltZW5zacOzbiAkS1x0aW1lcyBLJC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDk6KioNCg0KVGVuaWVuZG8gZW4gY3VlbnRhIGxhcyBwcm9waWVkYWRlcyBhbnRlcmlvcmVzLCBsYSBtYXRyaXogZGUgY292YXJpYW56YXMgcHVlZGUgZGVzY29tcG9uZXJzZSBjb21vOg0KDQokJA0KXFNpZ21hXDsgPVw7IEFcLCBcTGFtYmRhIFwsIEFeVA0KJCQNCg0KRXN0YSBkZXNjb21wb3NpY2nDs24gZXNwZWN0cmFsIGV4cHJlc2EgbGEgbWF0cml6IGRlIGNvdmFyaWFuemFzIG9yaWdpbmFsIGVuIGZ1bmNpw7NuIGRlOg0KDQotIHN1cyB2ZWN0b3JlcyBwcm9waW9zIChjb250ZW5pZG9zIGVuIGxhIG1hdHJpeiAkQSQpLA0KDQotIHkgc3VzIHZhbG9yZXMgcHJvcGlvcyAoY29udGVuaWRvcyBlbiBsYSBtYXRyaXogZGlhZ29uYWwgJFxMYW1iZGEkKS4NCg0KR2VvbcOpdHJpY2FtZW50ZSwgZXN0YSBkZXNjb21wb3NpY2nDs24gcmVwcmVzZW50YSB1bmEgcm90YWNpw7NuIGRlbCBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIG9yaWdpbmFsIGhhY2lhIHVuIG51ZXZvIHNpc3RlbWEgZGVmaW5pZG8gcG9yIGxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcy4NCg0KRW4gZXN0ZSBudWV2byBzaXN0ZW1hOg0KDQotIGxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBxdWVkYW4gaW5jb3JyZWxhZGFzIGVudHJlIHPDrSwNCg0KLSBsYSBtYXRyaXogZGUgY292YXJpYW56YXMgc2UgdnVlbHZlIGRpYWdvbmFsLA0KDQotIHkgbGEgdmFyaWFiaWxpZGFkIGRlIGxvcyBkYXRvcyBxdWVkYSBkaXN0cmlidWlkYSBhIGxvIGxhcmdvIGRlIGRpcmVjY2lvbmVzIG9ydG9nb25hbGVzLg0KDQpBZGVtw6FzLCBsb3MgdmFsb3JlcyBwcm9waW9zIGRlICRcTGFtYmRhJCBpbmRpY2FuIGxhIGNhbnRpZGFkIGRlIHZhcmlhbnphIGV4cGxpY2FkYSBwb3IgY2FkYSBjb21wb25lbnRlIHByaW5jaXBhbC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBQb3JjZW50YWplcyBkZSB2YXJpYWJpbGlkYWQNCg0KKipQcm9waWVkYWQgMTA6KioNCg0KTGEgdmFyaWFuemEgdG90YWwgZGUgbGFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIGNvcnJlc3BvbmRlIGEgbGEgc3VtYSBkZSB0b2RvcyBsb3MgdmFsb3JlcyBwcm9waW9zLCBlcyBkZWNpciwgYSBsYSB0cmF6YSBkZSBsYSBtYXRyaXogZGlhZ29uYWwgJFxMYW1iZGEkOg0KDQokJA0KXG1ib3h7VmFyaWFuemEgdG90YWx9DQpcOyA9XDsNClxzdW1fe2o9MX1ee0t9VihZX2opDQpcOyA9XDsNClxzdW1fe2o9MX1ee0t9XGxhbWJkYV9qDQpcOyA9XDsNClxtYm94e3RyYXphfShcTGFtYmRhKQ0KJCQNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDExOioqDQoNClRlbmllbmRvIGVuIGN1ZW50YSBsYXMgcHJvcGllZGFkZXMgYW50ZXJpb3JlczoNCg0KJCQNClxMYW1iZGFcOyA9XDtBXlRcLCBcU2lnbWEgXCwgQQ0KJCQNCg0KeQ0KDQokJA0KQVwsIEFeVFw7ID1cO0lfSw0KJCQNCg0KYWRlbcOhcyBkZSBsYXMgcHJvcGllZGFkZXMgZGVsIG9wZXJhZG9yIHRyYXphLCBzZSB0aWVuZSBxdWU6DQoNCiQkDQpcbWJveHt0cmF6YX0oXExhbWJkYSkNClw7ID1cOw0KXG1ib3h7dHJhemF9KEFeVFxTaWdtYSBBKQ0KXDsgPVw7DQpcbWJveHt0cmF6YX0oXFNpZ21hIEEgQV5UKQ0KXDsgPVw7DQpcbWJveHt0cmF6YX0oXFNpZ21hKQ0KJCQNCg0KUG9yIHRhbnRvLCBsYSB2YXJpYW56YSB0b3RhbCBkZSBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgY29pbmNpZGUgY29uIGxhIHZhcmlhbnphIHRvdGFsIGRlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcy4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDEyOioqDQoNCkxhIHN1bWEgZGUgbGFzIHZhcmlhbnphcyBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgZXMgaWd1YWwgYSBsYSBzdW1hIGRlIGxhcyB2YXJpYW56YXMgZGUgbGFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzOg0KDQokJA0KXG1ib3h7VmFyaWFuemEgdG90YWx9DQpcOyA9XDsNClxtYm94e3RyYXphfShcTGFtYmRhKQ0KXDsgPVw7DQpcbWJveHt0cmF6YX0oXFNpZ21hKQ0KXDsgPVw7DQpcc3VtX3trPTF9XntLfVZhcihYX2spDQokJA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KKipQcm9waWVkYWQgMTM6KioNCg0KTGEgcHJvcG9yY2nDs24gZGUgdmFyaWFuemEgdG90YWwgZXhwbGljYWRhIHBvciBsYSBjb21wb25lbnRlIHByaW5jaXBhbCAkWV9qJCB2aWVuZSBkYWRhIHBvcjoNCg0KJCQNClxtYm94e1Byb3AufVw7VihZX2opDQpcOyA9XDsNClxmcmFje1xsYW1iZGFfan17XG1ib3h7VmFyaWFuemEgdG90YWx9fQ0KJCQNCg0KU2kgc2UgbXVsdGlwbGljYSBwb3IgMTAwLCBzZSBvYnRpZW5lIGVsIHBvcmNlbnRhamUgZGUgdmFyaWFiaWxpZGFkIGV4cGxpY2FkbyBwb3IgZGljaGEgY29tcG9uZW50ZSBwcmluY2lwYWwuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAxNDoqKg0KDQpMYSBwcm9wb3JjacOzbiBhY3VtdWxhZGEgZGUgdmFyaWFuemEgZXhwbGljYWRhIHBvciBsYXMgcHJpbWVyYXMgJEokIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHZpZW5lIGRhZGEgcG9yOg0KDQokJA0KXG1ib3h7UHJvcC59XDtWKFlfezFcdG8gSn0pDQpcOyA9XDsNClxmcmFje1xzdW1cbGltaXRzX3tqPTF9XntKfVxsYW1iZGFfan0NCntcbWJveHtWYXJpYW56YSB0b3RhbH19DQokJA0KDQpkb25kZToNCg0KJCQNCko8Sw0KJCQNCg0KU2kgc2UgbXVsdGlwbGljYSBwb3IgMTAwLCBzZSBvYnRpZW5lIGVsIHBvcmNlbnRhamUgYWN1bXVsYWRvIGRlIHZhcmlhYmlsaWRhZCBleHBsaWNhZG8gcG9yIGxhcyBwcmltZXJhcyAkSiQgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuDQoNCkVuIGFwbGljYWNpb25lcyBwcsOhY3RpY2FzLCBjdWFuZG8gaW5pY2lhbG1lbnRlIHNlIGRpc3BvbmUgZGUgJEskIHZhcmlhYmxlcywgZ2VuZXJhbG1lbnRlIHNlIHNlbGVjY2lvbmEgdW4gbsO6bWVybyBjb25zaWRlcmFibGVtZW50ZSBtZW5vciBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBxdWUgbG9ncmVuIGV4cGxpY2FyIHVuYSBncmFuIHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhYmlsaWRhZCB0b3RhbCBkZSBsb3MgZGF0b3MuDQoNCkVuIG11Y2hvcyBjYXNvcywgc2UgcHJvY3VyYSBzZWxlY2Npb25hciBwb2NhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBwYXJhIGZhY2lsaXRhciB0YW50byBsYSBpbnRlcnByZXRhY2nDs24gY29tbyBsYSByZXByZXNlbnRhY2nDs24gZ3LDoWZpY2EgZGUgbG9zIGRhdG9zLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBQcm9waWVkYWRlcyBzZWfDum4gbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMNCg0KTm9ybWFsbWVudGUsIGxvcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBzZSBjYWxjdWxhbiB1dGlsaXphbmRvIHZhcmlhYmxlcyBlc3RhbmRhcml6YWRhcywgZXMgZGVjaXIsIHZhcmlhYmxlcyBjb24gbWVkaWEgaWd1YWwgYSAwIHkgdmFyaWFuemEgaWd1YWwgYSAxLg0KDQpFbiBlc3RlIGNhc28sIGxvcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBubyBzZSBvYnRpZW5lbiBhIHBhcnRpciBkZSBsYSBtYXRyaXogZGUgY292YXJpYW56YXMgJFxTaWdtYSQsIHNpbm8gZGUgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMgJFIkLg0KDQotIExhIG1hdHJpeiBkZSBjb3ZhcmlhbnphcyBkZSBsYXMgdmFyaWFibGVzIGVzdGFuZGFyaXphZGFzIGNvaW5jaWRlIGNvbiBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMuDQoNCi0gUG9yIHRhbnRvLCBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgY29ycmVzcG9uZGVuIGEgbG9zIHZlY3RvcmVzIHByb3Bpb3MgZGUgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMuDQoNCi0gRXN0ZSBlbmZvcXVlIGV2aXRhIHF1ZSB2YXJpYWJsZXMgY29uIGVzY2FsYXMgZ3JhbmRlcyBkb21pbmVuIGVsIGFuw6FsaXNpcyDDum5pY2FtZW50ZSBkZWJpZG8gYSBzdXMgdW5pZGFkZXMgZGUgbWVkaWRhLg0KDQpFbiBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lczoNCg0KLSB0b2RvcyBsb3MgZWxlbWVudG9zIGRpYWdvbmFsZXMgc29uIGlndWFsZXMgYSAxLA0KDQotIHkgbG9zIGVsZW1lbnRvcyBmdWVyYSBkZSBsYSBkaWFnb25hbCBjb3JyZXNwb25kZW4gYSBjb2VmaWNpZW50ZXMgZGUgY29ycmVsYWNpw7NuLg0KDQpFbCBwcm9jZWRpbWllbnRvIG1hdGVtw6F0aWNvIGVzIGFuw6Fsb2dvIGFsIHJlYWxpemFkbyBjb24gbGEgbWF0cml6IGRlIGNvdmFyaWFuemFzLCBzdXN0aXR1eWVuZG8gJFxTaWdtYSQgcG9yICRSJC4NCg0KU2luIGVtYmFyZ28sIGV4aXN0ZW4gYWxndW5hcyBkaWZlcmVuY2lhcyBpbXBvcnRhbnRlcyBlbiBsYSBpbnRlcnByZXRhY2nDs24sIGxhcyBjdWFsZXMgc2UgZGVzY3JpYmVuIGVuIGxhcyBwcm9waWVkYWRlcyBzaWd1aWVudGVzLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KKipQcm9waWVkYWQgMTU6KioNCg0KU2kgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIGhhbiBzaWRvIHRpcGlmaWNhZGFzLCBlbnRvbmNlczoNCg0KJCQNClZhcihYX2spXDsgPVw7MSwNClxxdWFkDQprPTEsMixcbGRvdHMsSw0KJCQNCg0KUG9yIHRhbnRvLCBsYSB2YXJpYW56YSB0b3RhbCBjb2luY2lkZSBjb24gZWwgbsO6bWVybyB0b3RhbCBkZSB2YXJpYWJsZXM6DQoNCiQkDQpcbWJveHtWYXJpYW56YSB0b3RhbH0NClw7ID1cOw0KXHN1bV97az0xfV57S31WYXIoWF9rKQ0KXDsgPVw7DQpcc3VtX3trPTF9XntLfTENClw7ID1cOw0KSw0KJCQNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDE2OioqDQoNCkxhIHN1bWEgZGUgdG9kb3MgbG9zIHZhbG9yZXMgcHJvcGlvcyBlcyBpZ3VhbCBhICRLJDoNCg0KJCQNClxzdW1fe2o9MX1ee0t9XGxhbWJkYV9qDQpcOyA9XDsNCksNCiQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAxNzoqKg0KDQpMYSBwcm9wb3JjacOzbiBkZSB2YXJpYW56YSBleHBsaWNhZGEgcG9yIGxhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZX2okIHZpZW5lIGRhZGEgcG9yOg0KDQokJA0KXG1ib3h7UHJvcC59XDtWKFlfaikNClw7ID1cOw0KXGZyYWN7XGxhbWJkYV9qfXtcbWJveHtWYXJpYW56YSB0b3RhbH19DQpcOyA9XDsNClxmcmFje1xsYW1iZGFfan17S30NCiQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAxODoqKg0KDQpMYSBwcm9wb3JjacOzbiBhY3VtdWxhZGEgZGUgdmFyaWFuemEgZXhwbGljYWRhIHBvciBsYXMgcHJpbWVyYXMgJEokIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHZpZW5lIGRhZGEgcG9yOg0KDQokJA0KXG1ib3h7UHJvcC59XDtWKFlfezFcdG8gSn0pDQpcOyA9XDsNClxmcmFje1xzdW1cbGltaXRzX3tqPTF9XntKfVxsYW1iZGFfan0NCntcbWJveHtWYXJpYW56YSB0b3RhbH19DQpcOyA9XDsNClxmcmFje1xzdW1cbGltaXRzX3tqPTF9XntKfVxsYW1iZGFfan17S30NCiQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAxOToqKg0KDQpMYSBjb3JyZWxhY2nDs24gZW50cmUgbGEgdmFyaWFibGUgb3JpZ2luYWwgJFhfayQgeSBsYSBjb21wb25lbnRlIHByaW5jaXBhbCAkWV9qJCB2aWVuZSBkYWRhIHBvcjoNCg0KJCQNCkNvcnIoWF9rLFlfaikNClw7ID1cOw0KXGZyYWN7Q292KFhfayxZX2opfQ0Ke1xzcXJ0e1ZhcihYX2spfVwgXHNxcnR7VmFyKFlfail9fSANClw7ID1cOw0KXGZyYWN7YV97a2p9XCwgXGxhbWJkYV9qfQ0Ke1xzcXJ0e1xzaWdtYV4yIF97a319IFw7IFxzcXJ0e1xsYW1iZGFfan19IA0KXDs9XDsgDQpcZnJhY3thX3tran1cLCBcc3FydHtcbGFtYmRhX2p9fQ0Ke1xzaWdtYV97a319DQokJA0KDQpkb25kZToNCg0KLSAkYV97a2p9JCBjb3JyZXNwb25kZSBhbCBjb2VmaWNpZW50ZSBkZSBsYSB2YXJpYWJsZSAkWF9rJCBlbiBsYSBjb21wb25lbnRlIHByaW5jaXBhbCAkWV9qJCwNCg0KLSAkXGxhbWJkYV9qJCBlcyBlbCB2YWxvciBwcm9waW8gYXNvY2lhZG8gYSBsYSBjb21wb25lbnRlIHByaW5jaXBhbCAkWV9qJCwNCg0KLSB5ICRcc2lnbWFeMl97a30kIGNvcnJlc3BvbmRlIGEgbGEgdmFyaWFuemEgZGUgbGEgdmFyaWFibGUgb3JpZ2luYWwgJFhfayQuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAyMDoqKg0KDQpFbiBlbCBjYXNvIGRlIHZhcmlhYmxlcyBlc3RhbmRhcml6YWRhczoNCg0KJCQNClxzaWdtYV97a31cOyA9XDsxDQokJA0KDQp5IHBvciB0YW50bzoNCg0KJCQNCkNvcnIoWF9rLFlfaikNClw7ID1cOw0KYV97a2p9IFwsIFxzcXJ0e1xsYW1iZGFfan0NCiQkDQoNCkVzdGEgY29ycmVsYWNpw7NuIGluZGljYSBlbCBncmFkbyBkZSBhc29jaWFjacOzbiBlbnRyZSBsYSB2YXJpYWJsZSBvcmlnaW5hbCB5IGxhIGNvcnJlc3BvbmRpZW50ZSBjb21wb25lbnRlIHByaW5jaXBhbC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDIxOioqDQoNCg0KRnJlY3VlbnRlbWVudGUsIGxvcyBjb2VmaWNpZW50ZXMgZGUgbG9zIHZlY3RvcmVzIHByb3Bpb3Mgc2UgYWp1c3RhbiB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgdmFyaWFiaWxpZGFkIGV4cGxpY2FkYSBwb3IgY2FkYSBjb21wb25lbnRlIHByaW5jaXBhbC4gUGFyYSBlbGxvLCBzZSBtdWx0aXBsaWNhbiBwb3IgbGEgcmHDrXogY3VhZHJhZGEgZGVsIHZhbG9yIHByb3BpbyBjb3JyZXNwb25kaWVudGU6DQoNCiQkDQphX3tran1eKg0KPQ0KYV97a2p9XHNxcnR7XGxhbWJkYV9qfQ0KJCQNCg0KRXN0YXMgY2FudGlkYWRlcyByZWNpYmVuIGVsIG5vbWJyZSBkZSAqY2FyZ2FzKiAoKmxvYWRpbmdzKikgeSBwZXJtaXRlbiBtZWRpciBlbCBncmFkbyBkZSBhc29jaWFjacOzbiBlbnRyZSBsYSB2YXJpYWJsZSBvcmlnaW5hbCAkWF9rJCB5IGxhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZX2okLg0KDQpFbiBjb25zZWN1ZW5jaWE6DQoNCi0gY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgY29uIG1heW9yIHZhcmlhbnphIGV4cGxpY2FkYSBwcm9kdWNlbiBjYXJnYXMgbcOhcyBncmFuZGVzLA0KDQotIG1pZW50cmFzIHF1ZSBjb21wb25lbnRlcyBjb24gYmFqYSB2YXJpYWJpbGlkYWQgcmVkdWNlbiBsYSBtYWduaXR1ZCBkZSBsYXMgY2FyZ2FzLg0KDQpQb3IgZXN0YSByYXrDs24sIGxhcyBjYXJnYXMgcGVybWl0ZW4gaW50ZXJwcmV0YXIgc2ltdWx0w6FuZWFtZW50ZToNCg0KLSBsYSBkaXJlY2Npw7NuIGRlbCBjb21wb25lbnRlIHByaW5jaXBhbCwNCg0KLSB5IHN1IGltcG9ydGFuY2lhIGVuIHTDqXJtaW5vcyBkZSB2YXJpYWJpbGlkYWQgZXhwbGljYWRhLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKkVqZW1wbG8gc2VuY2lsbG8qKg0KDQpTdXBvbmdhbW9zIHF1ZSBwYXJhIGxhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZXzEkIHNlIG9idGllbmU6DQoNCiQkDQphX3sxfVw7ID1cOyBcYmVnaW57Ym1hdHJpeH0NCmFfezExfVxcDQphX3syMX0NClxlbmR7Ym1hdHJpeH0gXDs9XDsgDQpcYmVnaW57Ym1hdHJpeH0NCjAuOFxcDQowLjYNClxlbmR7Ym1hdHJpeH0NCiQkDQoNCnkgcXVlIGVsIHZhbG9yIHByb3BpbyBhc29jaWFkbyBlczoNCg0KJCQNClxsYW1iZGFfMT05DQokJA0KDQpFbnRvbmNlczoNCg0KJCQNClxzcXJ0e1xsYW1iZGFfMX09XHNxcnR7OX09Mw0KJCQNCg0KTGFzIGNhcmdhcyAoKmxvYWRpbmdzKikgc2UgY2FsY3VsYW4gY29tbzoNCg0KJCQNCmFfe2sxfV4qDQo9DQphX3trMX1cc3FydHtcbGFtYmRhXzF9DQokJA0KDQpQb3IgdGFudG86DQoNCiQkDQphX3sxMX1eKg0KPQ0KMC44KDMpDQo9DQoyLjQNCiQkDQoNCnkNCg0KJCQNCmFfezIxfV4qDQo9DQowLjYoMykNCj0NCjEuOA0KJCQNCg0KRW4gY29uc2VjdWVuY2lhLCBsYXMgY2FyZ2FzIGFzb2NpYWRhcyBhIGxhIHByaW1lcmEgY29tcG9uZW50ZSBwcmluY2lwYWwgc29uOg0KDQokJA0KYV97MX1eKlw7ID1cOyBcYmVnaW57Ym1hdHJpeH0NCmFfezExfV4qXFwNCmFfezIxfV4qDQpcZW5ke2JtYXRyaXh9IFw7PVw7IFxiZWdpbntibWF0cml4fQ0KMi40XFwNCjEuOA0KXGVuZHtibWF0cml4fQ0KJCQNCg0KSW50ZXJwcmV0YWNpw7NuOg0KDQotIGxhIHZhcmlhYmxlICRYXzEkIHRpZW5lIHVuYSBhc29jaWFjacOzbiBtw6FzIGZ1ZXJ0ZSBjb24gbGEgY29tcG9uZW50ZSBwcmluY2lwYWwgJFlfMSQsDQoNCi0gbWllbnRyYXMgcXVlICRYXzIkIHRhbWJpw6luIGNvbnRyaWJ1eWUsIGF1bnF1ZSBlbiBtZW5vciBtYWduaXR1ZC4NCg0KQWRlbcOhcywgZWwgdmFsb3IgcHJvcGlvIGdyYW5kZSAoJFxsYW1iZGFfMT05JCkgaW5kaWNhIHF1ZSBlc3RhIGNvbXBvbmVudGUgcHJpbmNpcGFsIGV4cGxpY2EgdW5hIGdyYW4gY2FudGlkYWQgZGUgdmFyaWFiaWxpZGFkIGVuIGxvcyBkYXRvcy4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgU2VsZWNjacOzbiBkZWwgbsO6bWVybyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcw0KDQpMYSBlbGVjY2nDs24gZGVsIG7Dum1lcm8gZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgc2UgYmFzYSBlbiBjcml0ZXJpb3MgZW1ww61yaWNvcyBxdWUgY29uc2lkZXJhbiBsYSBwcm9wb3JjacOzbiBkZSB2YXJpYWJpbGlkYWQgcXVlIHNlIGRlc2VhIGNvbnNlcnZhci4gTm8gZXhpc3RlIHVuYSByZWdsYSDDum5pY2EgeSB1bml2ZXJzYWxtZW50ZSBhY2VwdGFkYSBwYXJhIGRlY2lkaXIgY3XDoW50YXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgc29uIHN1ZmljaWVudGVzLiBQb3IgZXN0YSByYXrDs24sIHN1ZWxlbiB1dGlsaXphcnNlIHZhcmlvcyBjcml0ZXJpb3MgY29tcGxlbWVudGFyaW9zLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFByaW1lcmEgZm9ybWE6IFBvcmNlbnRhamUgZGUgdmFyaWFuemEgZXhwbGljYWRhDQoNClNlIHNlbGVjY2lvbmEgdW4gbsO6bWVybyAkSjxLJCBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBjdWFuZG8gbGFzIHByaW1lcmFzICRKJCBjb21wb25lbnRlcyBleHBsaWNhbiB1bmEgcHJvcG9yY2nDs24gc3VmaWNpZW50ZW1lbnRlIGFsdGEgZGUgbGEgdmFyaWFiaWxpZGFkIHRvdGFsOg0KDQokJA0KXG1ib3h7UHJvcC59XDtWKFlfezFcdG8gSn0pDQo9DQpcZnJhY3tcc3VtX3tqPTF9XntKfVxsYW1iZGFfan0NCntcc3VtX3tqPTF9XntLfVxsYW1iZGFfan0NCiQkDQoNCkVuIGVzdGUgY2FzbzogDQoNCi0gTGEgaWRlYSBlcyBlbGVnaXIgZWwgbWVub3IgbsO6bWVybyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBxdWUgcGVybWl0YSBjb25zZXJ2YXIgdW5hIHByb3BvcmNpw7NuIGFsdGEgZGUgbGEgaW5mb3JtYWNpw7NuIG9yaWdpbmFsLCBwb3IgZWplbXBsbywgNzAlLCA4MCUsIDkwJSBvIDk1JSwgc2Vnw7puIGVsIGNvbnRleHRvIGRlbCBhbsOhbGlzaXMuDQoNCkRlIGVzdGEgbWFuZXJhLCBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgJFhfMSxYXzIsXGxkb3RzLFhfSyQgcHVlZGVuIHJlc3VtaXJzZSBtZWRpYW50ZSB1biBuw7ptZXJvIG1lbm9yIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzICRZXzEsWV8yLFxsZG90cyxZX0okLCBjb25zZXJ2YW5kbyBsYSBtYXlvciBwYXJ0ZSBkZSBsYSB2YXJpYWJpbGlkYWQgdG90YWwgZGUgbG9zIGRhdG9zLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFNlZ3VuZGEgZm9ybWE6IFZhbG9yZXMgcHJvcGlvcw0KDQpDdWFuZG8gc2UgdXRpbGl6YSBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcywgbG9zIHZhbG9yZXMgcHJvcGlvcyB0YW1iacOpbiBwdWVkZW4gZW1wbGVhcnNlIHBhcmEgZGVjaWRpciBjdcOhbnRhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBjb25zZXJ2YXIuDQoNCi0gVW4gY3JpdGVyaW8gZnJlY3VlbnRlIGVzIGVsICoqY3JpdGVyaW8gZGUgS2Fpc2VyKiosIHNlZ8O6biBlbCBjdWFsIHNlIHJldGllbmVuIGxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBjb24gdmFsb3JlcyBwcm9waW9zIG1heW9yZXMgcXVlIDE6DQoNCiQkDQpcbGFtYmRhX2o+MQ0KJCQNCg0KTGEgcmF6w7NuIGVzIHF1ZSwgZW4gZGF0b3MgZXN0YW5kYXJpemFkb3MsIGNhZGEgdmFyaWFibGUgb3JpZ2luYWwgdGllbmUgdmFyaWFuemEgaWd1YWwgYSAxLiBQb3IgdGFudG8sIHVuYSBjb21wb25lbnRlIGNvbiAkXGxhbWJkYV9qPjEkIGV4cGxpY2EgbcOhcyB2YXJpYWJpbGlkYWQgcXVlIHVuYSB2YXJpYWJsZSBvcmlnaW5hbCBpbmRpdmlkdWFsLg0KDQpFc3RlIGNyaXRlcmlvIGRlYmUgdXNhcnNlIHByaW5jaXBhbG1lbnRlIGN1YW5kbyBlbCBQQ0Egc2UgcmVhbGl6YSBzb2JyZSBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyBvIHNvYnJlIGRhdG9zIGVzdGFuZGFyaXphZG9zLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFRlcmNlcmEgZm9ybWE6IE3DqXRvZG9zIGdyw6FmaWNvcw0KDQpVbiBtw6l0b2RvIGdyw6FmaWNvIGNvbcO6biBjb25zaXN0ZSBlbiBhbmFsaXphciBlbCAqKlNjcmVlIFBsb3QqKi4gRXN0ZSBncsOhZmljbyBwcmVzZW50YSBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgZW4gZWwgZWplIGhvcml6b250YWwgeSBzdXMgdmFsb3JlcyBwcm9waW9zLCBvIGxhIHByb3BvcmNpw7NuIGRlIHZhcmlhbnphIGV4cGxpY2FkYSwgZW4gZWwgZWplIHZlcnRpY2FsLg0KDQotIEVsIGNyaXRlcmlvIGNvbnNpc3RlIGVuIGlkZW50aWZpY2FyIGVsIHB1bnRvIGRlIGluZmxleGnDs24gbyDigJxjb2Rv4oCdIGRlIGxhIGN1cnZhLiBBIHBhcnRpciBkZSBlc2UgcHVudG8sIGxvcyBpbmNyZW1lbnRvcyBlbiB2YXJpYW56YSBleHBsaWNhZGEgc3VlbGVuIHNlciBwZXF1ZcOxb3MsIHBvciBsbyBxdWUgYcOxYWRpciBtw6FzIGNvbXBvbmVudGVzIGFwb3J0YSBwb2NhIGluZm9ybWFjacOzbiBhZGljaW9uYWwuDQoNCkVuIGxhIGZpZ3VyYSBcQHJlZihmaWc6U2NyZWUxKSwgc2Ugb2JzZXJ2YSBxdWUgbGEgcHJvcG9yY2nDs24gZGUgdmFyaWFuemEgZXhwbGljYWRhIGFjdW11bGFkYSBhdW1lbnRhIHLDoXBpZGFtZW50ZSBjb24gbGFzIHByaW1lcmFzIGNvbXBvbmVudGVzIHkgbHVlZ28gdGllbmRlIGEgZXN0YWJpbGl6YXJzZS4gRW4gZXN0ZSBjYXNvLCB1bmEgZWxlY2Npw7NuIHJhem9uYWJsZSBwb2Ryw61hIHNlciBjb25zZXJ2YXIgbGFzIHByaW1lcmFzIHRyZXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMsIHlhIHF1ZSBleHBsaWNhbiBhcHJveGltYWRhbWVudGUgZWwgOTUlIGRlIGxhIHZhcmlhYmlsaWRhZCBhY3VtdWxhZGEuDQoNCjxjZW50ZXI+DQoNCmBgYHtyIFNjcmVlMSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKlNjcmVlIFBsb3Q6IHZhcmlhbnphIGV4cGxpY2FkYSBhY3VtdWxhZGEqKiIsIG91dC53aWR0aCA9ICI2MCUifQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlNjcmVlMS5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEludGVycHJldGFjacOzbiBkZSBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMNCg0KKipQcmltZXJhIGludGVycHJldGFjacOzbi4qKg0KDQotIEN1YW5kbyBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgcHJlc2VudGFuIGZ1ZXJ0ZXMgY29ycmVsYWNpb25lcyBwb3NpdGl2YXMgZW50cmUgc8OtLCBsYSBwcmltZXJhIGNvbXBvbmVudGUgcHJpbmNpcGFsIHN1ZWxlIHByZXNlbnRhciBjb2VmaWNpZW50ZXMgZGVsIG1pc21vIHNpZ25vIGVuIHN1IHZlY3RvciBwcm9waW8gYXNvY2lhZG8uIA0KDQotIEVuIGVzdGUgY2FzbywgbGEgcHJpbWVyYSBjb21wb25lbnRlIHByaW5jaXBhbCBwdWVkZSBpbnRlcnByZXRhcnNlIGNvbW8gdW5hIGNvbWJpbmFjacOzbiBwb25kZXJhZGEgZGUgdG9kYXMgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzLg0KDQotIEdlb23DqXRyaWNhbWVudGUsIGVzdGEgY29tcG9uZW50ZSByZXByZXNlbnRhIGxhIGRpcmVjY2nDs24gZGUgbcOheGltYSB2YXJpYWJpbGlkYWQgY29tw7puIGNvbXBhcnRpZGEgcG9yIGxhcyB2YXJpYWJsZXMuIFBvciBlc3RhIHJhesOzbiwgZnJlY3VlbnRlbWVudGUgc2UgaW50ZXJwcmV0YSBjb21vIHVuIGZhY3RvciBnbG9iYWwgZGUgKip0YW1hw7FvKiosICoqaW50ZW5zaWRhZCoqIG8gKiptYWduaXR1ZCBnZW5lcmFsKiouDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlNlZ3VuZGEgaW50ZXJwcmV0YWNpw7NuLioqDQoNCkxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyByZXN0YW50ZXMgc3VlbGVuIHByZXNlbnRhciBjb2VmaWNpZW50ZXMgcG9zaXRpdm9zIHkgbmVnYXRpdm9zIGVuIHN1cyB2ZWN0b3JlcyBwcm9waW9zIGFzb2NpYWRvcy4NCg0KLSBMYSBwcmVzZW5jaWEgZGUgc2lnbm9zIG9wdWVzdG9zIGluZGljYSBxdWUgZXN0YXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgZXN0YWJsZWNlbiBjb250cmFzdGVzIGVudHJlIGdydXBvcyBkZSB2YXJpYWJsZXMuDQoNClBvciBlamVtcGxvLCB1bmEgY29tcG9uZW50ZSBwcmluY2lwYWwgZGUgbGEgZm9ybWE6DQoNCiQkDQpZX2o9MC44WF8xKzAuN1hfMi0wLjZYXzMNCiQkDQoNCmluZGljYSBxdWUgbGFzIHZhcmlhYmxlcyAkWF8xJCB5ICRYXzIkIGNvbnRyaWJ1eWVuIGVuIHVuYSBkaXJlY2Npw7NuLCBtaWVudHJhcyBxdWUgJFhfMyQgY29udHJpYnV5ZSBlbiBkaXJlY2Npw7NuIG9wdWVzdGEuDQoNCkVuIGNvbnNlY3VlbmNpYToNCg0KLSB2YXJpYWJsZXMgY29uIGNvZWZpY2llbnRlcyBkZWwgbWlzbW8gc2lnbm8gdGllbmRlbiBhIHZhcmlhciBjb25qdW50YW1lbnRlLA0KDQotIG1pZW50cmFzIHF1ZSB2YXJpYWJsZXMgY29uIHNpZ25vcyBvcHVlc3RvcyByZXByZXNlbnRhbiBjb21wb3J0YW1pZW50b3MgY29udHJhc3RhbnRlcy4NCg0KUG9yIGVzdGEgcmF6w7NuOg0KDQotIEVzdGFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHN1ZWxlbiBpbnRlcnByZXRhcnNlIGNvbW8gZmFjdG9yZXMgZGUgY29udHJhc3RlIG8gZGUgZm9ybWEsIHlhIHF1ZSBkZXNjcmliZW4gZGlmZXJlbmNpYXMgcmVsYXRpdmFzIGVudHJlIHZhcmlhYmxlcyBtw6FzIHF1ZSB1bmEgbWFnbml0dWQgZ2xvYmFsIGNvbcO6bi4NCg0KLSBFc3RhcyBjb21wb25lbnRlcyBwZXJtaXRlbiBpZGVudGlmaWNhciBwYXRyb25lcyBlc3RydWN0dXJhbGVzLCByZWxhY2lvbmVzIGRlIG9wb3NpY2nDs24gbyBkaWZlcmVuY2lhcyByZWxhdGl2YXMgZW50cmUgc3ViY29uanVudG9zIGRlIHZhcmlhYmxlcyBvcmlnaW5hbGVzLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KKipUZXJjZXJhIGludGVycHJldGFjacOzbi4qKg0KDQpFbiBnZW5lcmFsLCBsYSBpbnRlcnByZXRhY2nDs24gZGUgdW5hIGNvbXBvbmVudGUgcHJpbmNpcGFsIHNlIHJlYWxpemEgYW5hbGl6YW5kbzoNCg0KLSBsYSBtYWduaXR1ZCBkZSBsb3MgY29lZmljaWVudGVzIChvIGNhcmdhcyksDQoNCi0gbG9zIHNpZ25vcyBkZSBkaWNob3MgY29lZmljaWVudGVzLA0KDQotIHkgbGEgcHJvcG9yY2nDs24gZGUgdmFyaWFuemEgZXhwbGljYWRhIHBvciBsYSBjb21wb25lbnRlIHByaW5jaXBhbC4NCg0KVmFyaWFibGVzIGNvbiBjYXJnYXMgZ3JhbmRlcyBlbiBtYWduaXR1ZCBzb24gbGFzIHF1ZSBtw6FzIGNvbnRyaWJ1eWVuIGEgbGEgZGVmaW5pY2nDs24gZSBpbnRlcnByZXRhY2nDs24gZGUgbGEgY29tcG9uZW50ZSBwcmluY2lwYWwgY29ycmVzcG9uZGllbnRlLg0KDQpBZGVtw6FzOg0KDQotIGNvZWZpY2llbnRlcyBjb24gZWwgbWlzbW8gc2lnbm8gaW5kaWNhbiBhc29jaWFjaW9uZXMgZW4gdW5hIG1pc21hIGRpcmVjY2nDs24sDQoNCi0gbWllbnRyYXMgcXVlIGNvZWZpY2llbnRlcyBjb24gc2lnbm9zIG9wdWVzdG9zIHJlZmxlamFuIHJlbGFjaW9uZXMgZGUgY29udHJhc3RlIGVudHJlIHZhcmlhYmxlcy4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgRWplbXBsbyAxOiBQQ0EgYXBsaWNhZG8gYSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgdHJpZGltZW5zaW9uYWwNCg0KRW4gZXN0ZSBlamVtcGxvIGNvbnNpZGVyYW1vcyB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgdHJpZGltZW5zaW9uYWwgY29uIHZlY3RvciBkZSBtZWRpYXM6DQoNCiQkDQpcbXU9DQpcYmVnaW57Ym1hdHJpeH0NCjBcXA0KNVxcDQoyDQpcZW5ke2JtYXRyaXh9DQokJA0KDQp5IG1hdHJpeiBkZSBjb3ZhcmlhbnphczoNCg0KJCQNClxTaWdtYT0NClxiZWdpbntibWF0cml4fQ0KMjUgJiAtMSAmIDdcXA0KLTEgJiA0ICYgLTRcXA0KNyAmIC00ICYgMTANClxlbmR7Ym1hdHJpeH0NCiQkDQoNCkxhIG1hdHJpeiBkZSBjb3ZhcmlhbnphcyBpbmRpY2EgcXVlOg0KDQotIGxhcyB2YXJpYWJsZXMgcHJlc2VudGFuIGRpZmVyZW50ZXMgbml2ZWxlcyBkZSB2YXJpYWJpbGlkYWQsDQoNCi0geSBhZGVtw6FzIGV4aXN0ZSBjb3JyZWxhY2nDs24gZW50cmUgYWxndW5hcyBkZSBlbGxhcy4NCg0KR2VvbcOpdHJpY2FtZW50ZSwgZXN0byBpbXBsaWNhIHF1ZSBsYSBudWJlIGRlIGRhdG9zIG5vIHNlcsOhIGVzZsOpcmljYSwgc2lubyBhbGFyZ2FkYSBlbiBjaWVydGFzIGRpcmVjY2lvbmVzIHByZWZlcmVuY2lhbGVzLg0KDQpCYWpvIGVzdGFzIGNvbmRpY2lvbmVzLCBlbCBkaWFncmFtYSBkZSBkaXNwZXJzacOzbiB0cmlkaW1lbnNpb25hbCBzZSBtdWVzdHJhIGVuIGxhIGZpZ3VyYSBcQHJlZihmaWc6Tm9ybWFsMSkuDQoNCg0KDQo8Y2VudGVyPg0KYGBge3IgTm9ybWFsMSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkRpc3RyaWJ1Y2nDs24gbm9ybWFsIHRyaWRpbWVuc2lvbmFsKioiLCBvdXQud2lkdGggPSAiNTAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIk5vcm1hbDEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQpPYnPDqXJ2ZXNlIHF1ZToNCg0KLSBsYSBudWJlIGRlIGRhdG9zIHByZXNlbnRhIHVuYSBkaXJlY2Npw7NuIGRvbWluYW50ZSBkZSBkaXNwZXJzacOzbiwNCg0KLSBsbyBjdWFsIHN1Z2llcmUgbGEgZXhpc3RlbmNpYSBkZSBjb3JyZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcywNCg0KLSB5IG1vdGl2YSBsYSBhcGxpY2FjacOzbiBkZSBQQ0EgcGFyYSBpZGVudGlmaWNhciBsYXMgZGlyZWNjaW9uZXMgcHJpbmNpcGFsZXMgZGUgdmFyaWFiaWxpZGFkLg0KDQpEZXNwdcOpcyBkZSBhcGxpY2FyIFBDQSwgbG9zIGRhdG9zIHNvbiBwcm95ZWN0YWRvcyBzb2JyZSBsb3MgbnVldm9zIGVqZXMgb3J0b2dvbmFsZXMgZGVmaW5pZG9zIHBvciBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuDQoNCkVuIGxhIGZpZ3VyYSBcQHJlZihmaWc6Tm9ybWFsMiksIHNlIG11ZXN0cmFuIGxhcyBwcm95ZWNjaW9uZXMgY29ycmVzcG9uZGllbnRlcyBzb2JyZSBsb3MgZGlzdGludG9zIHBhcmVzIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLg0KDQo8Y2VudGVyPg0KYGBge3IgTm9ybWFsMiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKlByb3llY2Npb25lcyBkZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgdHJpZGltZW5zaW9uYWwqKiIsIG91dC53aWR0aCA9ICIxMDAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIk5vcm1hbDIucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KKipPYnPDqXJ2ZXNlIHF1ZToqKg0KDQoxLiBFbiBsYXMgcHJveWVjY2lvbmVzIHF1ZSBpbnZvbHVjcmFuIGxhIHByaW1lcmEgY29tcG9uZW50ZSBwcmluY2lwYWwgJFlfMSQsIGxhIG51YmUgZGUgZGF0b3MgcHJlc2VudGEgbGEgbWF5b3IgZGlzcGVyc2nDs24uIEVzdG8gaW5kaWNhIHF1ZSAkWV8xJCBjb25jZW50cmEgbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkIHRvdGFsIGRlIGxvcyBkYXRvcy4NCg0KMi4gTGFzIHByb3llY2Npb25lcyBhc29jaWFkYXMgYSBsYSBzZWd1bmRhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZXzIkIG11ZXN0cmFuIHVuYSBkaXNwZXJzacOzbiBtZW5vciBxdWUgbGFzIGNvcnJlc3BvbmRpZW50ZXMgYSAkWV8xJC4gRXN0byByZWZsZWphIHF1ZSAkWV8yJCByZWNvZ2UgbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkIHJlc3RhbnRlIG5vIGV4cGxpY2FkYSBwb3IgJFlfMSQuDQoNCjMuIExhcyBwcm95ZWNjaW9uZXMgcXVlIGludm9sdWNyYW4gbGEgdGVyY2VyYSBjb21wb25lbnRlIHByaW5jaXBhbCAkWV8zJCBwcmVzZW50YW4gdW5hIG1lbm9yIGVsb25nYWNpw7NuIHkgZGlzcGVyc2nDs24sIGluZGljYW5kbyBxdWUgZXN0YSBjb21wb25lbnRlIGV4cGxpY2EgdW5hIHByb3BvcmNpw7NuIG1lbm9yIGRlIHZhcmlhYmlsaWRhZC4NCg0KNC4gTGFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHJlc3VsdGFudGVzIHNvbiBpbmNvcnJlbGFkYXMgZW50cmUgc8OtLCByYXrDs24gcG9yIGxhIGN1YWwgbGFzIG51YmVzIGRlIHB1bnRvcyBhcGFyZWNlbiBhbGluZWFkYXMgY29uIGxvcyBudWV2b3MgZWplcyBjb29yZGVuYWRvcy4NCg0KNS4gUENBIHJvdGEgZWwgc2lzdGVtYSBkZSBjb29yZGVuYWRhcyBvcmlnaW5hbCBoYWNpYSBudWV2YXMgZGlyZWNjaW9uZXMgb3J0b2dvbmFsZXMgcXVlIGRlc2NyaWJlbiBtw6FzIGVmaWNpZW50ZW1lbnRlIGxhIGVzdHJ1Y3R1cmEgZGUgdmFyaWFiaWxpZGFkIGRlIGxvcyBkYXRvcy4NCg0KNi4gTGEgZWxvbmdhY2nDs24gb2JzZXJ2YWRhIGVuIGNhZGEgcHJveWVjY2nDs24gcmVmbGVqYSBkaXJlY3RhbWVudGUgbGEgY2FudGlkYWQgZGUgdmFyaWFuemEgZXhwbGljYWRhIHBvciBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgaW52b2x1Y3JhZGFzLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEVqZW1wbG8gMjogRGF0b3MgYHN1cnZleWANCg0KIyMjIEVudW5jaWFkbw0KDQpgYGB7ciwgZXZhbD1GQUxTRSwgZWNobz1GQUxTRX0NCkxvcyBkYXRvcyB1dGlsaXphZG9zIGVuIGVzdGUgZWplbXBsbyBkZXNjcmliZW4gZWwgcmVuZGltaWVudG8gZGUgbG9zIGF0bGV0YXMgZHVyYW50ZSBkb3MgZXZlbnRvcyBkZXBvcnRpdm9zIChEZXNjdGFyIHkgT2x5bXBpY0cpLiBDb250aWVuZSAyNyBpbmRpdmlkdW9zIChhdGxldGFzKSBkZXNjcml0b3MgbWVkaWFudGUgMTMgdmFyaWFibGVzLiBDb24gZXN0b3MgZGF0b3MgbGxldmFyZW1vcyBhIGNhYm8gdW4gUENBLiANCg0KDQojYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkYXRvc0NvbXBsZXRvIDwtIGZhY3RvZXh0cmE6OmRlY2F0aGxvbjINCmF0dGFjaChkYXRvc0NvbXBsZXRvKQ0KI2BgYA0KDQoNCiNgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm5hbWVzKGRhdG9zQ29tcGxldG8pDQojYGBgDQoNClNlIHJlc2FsdGEgcXVlIHPDs2xvIGFsZ3Vub3MgZGUgZXN0b3MgaW5kaXZpZHVvcyB5IHZhcmlhYmxlcyBzZSB1dGlsaXphcsOhbiBwYXJhIHJlYWxpemFyIGVsIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcy4gDQoNCiNgYGB7ciBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0IDwtIGRhdG9zQ29tcGxldG9bMToyMywgMToxMF0NCmF0dGFjaChkYXQpDQpoZWFkKGRhdCw0KSkgDQojYGBgDQoNCiNgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0IDwtIGRhdG9zQ29tcGxldG9bMToyMywgMToxMF0NCmF0dGFjaChkYXQpDQprYWJsZShoZWFkKGRhdCw0KSxhbGlnbiA9ICJjY2MiKSAlPiUjIFNlIG5lY2VzaXRhIGxpYnJhcnkoa25pdHIpIA0Ka2FibGVfc3R5bGluZygpICU+JSAgICAgICAgICAgICAgICAjbGlicmFyeShrYWJsZUV4dHJhKS4uLi4gU29sbyBwYXJhIGtuaXQgdG8gaHRtbA0Ka2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGKSAgICNsaWJyYXJ5KGthYmxlRXh0cmEpLi4uLlNvbG8gcGFyYSBrbml0IHRvIGh0bWwNCiNgYGANCmBgYA0KDQoNCg0KDQoNCkxvcyBkYXRvcyBzZSByZWNvZ2llcm9uIGFwbGljYW5kbyB1bmEgZW5jdWVzdGEgYSB1bmEgbXVlc3RyYSBkZSBlc3R1ZGlhbnRlcyB1bml2ZXJzaXRhcmlvcy4gRXMgdW4gZGF0YSBmcmFtZSBjb24gODAwIG9ic2VydmFjaW9uZXMgeSA2NiB2YXJpYWJsZXMuIENvbiBlc3RvcyBkYXRvcyBsbGV2YXJlbW9zIGEgY2FibyB1biBQQ0EuIA0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShsc20pDQpkYXRvc0NvbXBsZXRvIDwtIGxzbTo6c3VydmV5DQpgYGANCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm5hbWVzKGRhdG9zQ29tcGxldG8pDQpgYGANCg0KU2UgcmVzYWx0YSBxdWUgc8OzbG8gYWxndW5vcyBkZSBlc3RvcyBpbmRpdmlkdW9zIHkgdmFyaWFibGVzIHNlIHV0aWxpemFyw6FuIHBhcmEgcmVhbGl6YXIgZWwgYW7DoWxpc2lzIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLiANCg0KDQpgYGB7ciBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0IDwtIGRhdG9zQ29tcGxldG9bMToyMywgMjE6MzBdDQphdHRhY2goZGF0KQ0KaGVhZChkYXQsNCkgDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojZGF0IDwtIGRhdG9zQ29tcGxldG9bMToyMywgYyg1LDcsOCw5LDEzLDE1LDIxLDI3LDI5LDMwKV0gIyBwcmltZXIgaW50ZW50bw0KZGF0IDwtIGRhdG9zQ29tcGxldG9bMToyMywgMjE6MzBdDQphdHRhY2goZGF0KQ0Ka2FibGUoaGVhZChkYXQsNCksYWxpZ24gPSAiY2NjIikgJT4lIyBTZSBuZWNlc2l0YSBsaWJyYXJ5KGtuaXRyKSANCmthYmxlX3N0eWxpbmcoKSAlPiUgICAgICAgICAgICAgICAgI2xpYnJhcnkoa2FibGVFeHRyYSkuLi4uIFNvbG8gcGFyYSBrbml0IHRvIGh0bWwNCmthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRikgICAjbGlicmFyeShrYWJsZUV4dHJhKS4uLi5Tb2xvIHBhcmEga25pdCB0byBodG1sDQpgYGANCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgU29sdWNpw7NuLg0KDQoNCkxhIHNvbHVjacOzbiBzZSBwdWVkZSByZXZpc2FyIFtoYWNpZW5kbyBjbGljayBhcXXDrV0oaHR0cHM6Ly9ycHVicy5jb20vaGxsaW5hcy9SX1BDQV9hcGxpY2FjaW9uKS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgVMOzcGljb3Mgc3VtcGxlbWVudGFyaW9zIA0KDQpbTm8gaGFjZXIgY2xpY2sgYXF1w61dKE9KT0pPSk8pOiBQZW5kaWVudGUNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gQ2Fww610dWxvIEVqZXJjaWNpb3MgLS0+DQoNCiMgRWplcmNpY2lvcw0KDQpQZW5kaWVudGUNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCg0KPCEtLSBDYXDDrXR1bG8gQmlibGlvZ3JhZsOtYS0tPg0KDQoNCiMgQmlibGlvZ3JhZsOtYSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KICANCkNvbnN1bHRhciBlbCBkb2N1bWVudG8gW1JQdWJzIDo6IEFuw6FsaXNpcyBtdWx0aXZhcmlhZG8gKGJpYmxpb2dyYWbDrWEpXShodHRwczovL3JwdWJzLmNvbS9obGxpbmFzL1JfTXVsdGl2YXJpYWRvX0JpYmxpb2dyYWZpYSkuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQoNCiZuYnNwOw0KDQoNCiZuYnNwOw0KPGNlbnRlcj4NCn5+fg0KSWYgeW91IGZvdW5kIGFueSBFUlJPUlMgb3IgaGF2ZSBTVUdHRVNUSU9OUywgcGxlYXNlIHJlcG9ydCB0aGVtIHRvIG15IGVtYWlsLiBUaGFua3MuICANCn5+fg0KPC9jZW50ZXI+DQoNCg0K