REPORTE TRABAJO 2: APLICACIONES DE REDES NEURONALES A DATOS TABULARES
REDES NEURONALES Y ALGORITMOS BIOINSPIRADOS
Presentado por:
Leonardo Federico Corona Torres
David Escobar Ruiz
Johan Sebastian Robles Rincón
Sebastián Soto Arcila
Profesor: Juan David Ospina Arango
Monitor: Andrés Mauricio Zapata Rincón
Universidad Nacional de Colombia
Facultad de Minas
Ingeniería de
Sistemas e Informática
12 de junio de 2025
Introducción
Las redes neuronales son un tipo de modelo computacional inspirado en
el funcionamiento del cerebro humano, compuesto por capas de unidades
llamadas neuronas artificiales (Wikipedia, s.f., Artificial Neural
Networks). Estas redes son capaces de aprender patrones complejos a
partir de grandes volúmenes de datos mediante un proceso conocido como
entrenamiento. A través de este proceso, ajustan internamente sus
parámetros para minimizar el error en la tarea que se les asigna.
Se utilizan ampliamente en tareas de clasificación, regresión,
detección de anomalías, procesamiento de imágenes, procesamiento de
lenguaje natural, entre muchas otras aplicaciones. Su capacidad para
capturar relaciones no lineales y complejas entre variables las
convierte en una herramienta poderosa dentro del campo del aprendizaje
automático.
Uno de los problemas clásicos en los que se aplican técnicas de
aprendizaje supervisado es la clasificación de riesgo de crédito , que
consiste en predecir la probabilidad de que un solicitante de crédito
cumpla o no con sus obligaciones financieras (Synapse Analytics, s.f.,
Credit Scoring Explained - The Problem Statement). Este tipo de modelos
es crucial para las instituciones financieras, ya que les permite tomar
decisiones más informadas, reducir riesgos y mejorar la asignación de
recursos.
En este contexto, las redes neuronales ofrecen una alternativa eficaz
frente a modelos más tradicionales, ya que pueden modelar relaciones no
evidentes entre los atributos financieros y demográficos de los
solicitantes y su comportamiento crediticio futuro. A pesar de que
requieren más datos y mayor capacidad de cómputo, su rendimiento suele
ser superior cuando se dispone de información suficiente y bien
estructurada.
Para facilitar el uso del modelo desarrollado, se construyó una
aplicación web que permite ingresar los datos relevantes del solicitante
y obtener, en tiempo real, la predicción del nivel de riesgo de crédito.
Esta interfaz busca demostrar cómo una solución basada en inteligencia
artificial puede integrarse fácilmente en entornos reales, brindando
accesibilidad, automatización y soporte a la toma de decisiones.
Metodología
El desarrollo del proyecto se dividió en tres etapas principales:
limpieza de datos y análisis exploratorio (EDA), ingeniería de features
y modelado. Cada una de estas fases fue abordada de manera modular para
facilitar la comprensión y el desarrollo iterativo del modelo.
Para el procesamiento y análisis, se utilizaron Jupyter Notebooks, lo
cual permitió una exploración interactiva del dataset. No obstante, se
reconoce que para entornos de producción y mejor escalabilidad, sería
recomendable implementar estos procesos como pipelines orquestados con
herramientas como Apache Airflow.
El dataset utilizado proviene de Kaggle y está disponible en su
respectivo enlace (Kaggle, s.f., Credit Risk Analysis).
Durante la etapa de análisis exploratorio y visualización, se hizo
uso de librerías como Seaborn y Matplotlib, mientras que para la
manipulación y transformación de los datos se emplearon NumPy y Pandas.
El preprocesamiento y el modelado inicial se realizaron con herramientas
de Scikit-learn, y para la construcción del modelo de red neuronal se
utilizó PyTorch, lo que permitió una mayor flexibilidad en la
implementación del modelo de deep learning.
Definición del problema
El riesgo crediticio se puede abordar como un problema de
clasificación binaria, en el que se busca predecir si un solicitante de
crédito representa un riesgo alto o bajo de incumplimiento. Esta tarea
es fundamental para instituciones financieras, ya que les permite tomar
decisiones más seguras y eficientes al momento de otorgar préstamos.
El objetivo principal de la solución a este problema es entrenar un
modelo basado en redes neuronales que sea capaz de aprender patrones a
partir de los datos históricos y realizar predicciones precisas sobre el
riesgo crediticio de nuevos solicitantes.
Para lograrlo, es necesario identificar y seleccionar las variables
más relevantes del conjunto de datos, de manera que el modelo pueda
capturar la información crítica que influye en el comportamiento
financiero de los individuos.
El qué tan bueno sea el modelo estará definido por las siguientes
métricas (Geeks for Geeks, 2025):
Accuracy: Proporción de predicciones correctas
sobre el total de casos.
Precision: Casos que el modelo predijo como alto
riesgo y sí lo eran realmente (verdaderos positivos).
Recall: Tasa de verdaderos positivos, es decir,
los casos que el modelo detectó correctamente de todos los casos de alto
riesgo.
F1-score: Media armónica entre precision y
recall.
AUC-ROC: Área bajo la curva ROC. Evalúa la
capacidad del modelo para distinguir entre clases. Mientras más cercano
a 1 esté esta métrica, más discriminativo será el modelo, lo cual es lo
ideal.
Parte 1. Limpieza de Datos y Análisis Exploratorio de Datos
A continuación se presenta una síntesis de lo realizado en el proceso
de limpieza de datos y análisis exploratorio de datos. Todo el código
con los detalles de implementación se puede encontrar en el archivo
poc_EDA.ipynb en el repositorio del proyecto.
1.1 Objetivos
Antes de comenzar a modelar, es necesario asegurarse de que los datos
están lo suficientemente procesados y preparados para poder entrenar el
modelo, de tal forma que este pueda alcanzar los niveles deseados en las
métricas previamente definidas.
Adicionalmente, se debe entender primero el conjunto de datos junto
con sus propiedades estadísticas tanto univariadas como multivariadas,
con el objetivo de encontrar patrones o relaciones que den pistas de qué
factores podrían estar más relacionados con la probabilidad de
cumplimiento o incumplimiento del pago del préstamo.
A manera de síntesis, se tienen los siguientes objetivos para la
limpieza de datos y el análisis exploratorio de datos:
Entender la estructura general del dataset y sus columnas,
recogiendo información como las dimensiones del dataset, sus tipos de
datos y cómo se ven las primeras y últimas filas del dataset.
Definir un conjunto de criterios de limpieza de datos previo al
análisis exploratorio de datos que permita evitar desvíos de los
patrones realmente relevantes del conjunto de datos.
Realizar una adecuada limpieza de los datos a partir de los
criterios anteriormente definidos.
Realizar un análisis univariado y multivariado de las columnas
tanto numéricas como no numéricas del dataset para poder entender de
mejor manera las propiedades estadísticas del mismo.
Derivar conclusiones relevantes a partir de cada análisis
realizado.
Contar con un dataset lo suficientemente limpio como para poder
seguir con un proceso de ingeniería de features.
1.2 Estructura del dataset
Antes de comenzar con la limpieza de los datos, se debe estar
familiarizado con el propio dataset. Es por esto que se parte de una
visión general, revisando la estructura del dataset, para después ir a
lo particular, revisando cada columna.
1.2.1 Origen del dataset
El dataset a utilizar se puede encontrar en (Kaggle, s.f., Credit
Risk Analysis).
1.2.2 Dimensiones del dataset
Las dimensiones del dataset, calculadas a partir de la lectura del
mismo como un DataFrame de pandas (ver código en repositorio), son las
siguientes:
| Columnas |
74 columnas |
| Filas |
887379 filas |
Tabla 1. Dimensiones del dataset crudo.
De la Tabla 1 se puede evidenciar que se está lidiando con un dataset
de tamaño relativamente grande, lo cual hay que considerar a la hora de
realizar la limpieza y el modelado.
Algo bueno a resaltar es que se cuenta con una buena abundancia de
datos para poder entrenar el modelo, y por lo tanto con una buena
limpieza y preprocesamiento, se cree que se pueden alcanzar valores
ideales para las métricas del modelo una vez entrenado.
1.2.3 Primeras y últimas 5 filas del dataset
Debido al gran tamaño del dataset, se complica la exploración del
mismo por el uso de herramientas de ofimática básicas como Excel o
Google Sheets. Es por esto que se optó por revisar las primeras y
últimas 5 filas del dataset por medio del uso de los métodos head() y
tail() de pandas.
Debido al gran tamaño del dataset no es posible adjuntar las filas y
columnas en este reporte. Sin embargo, se puede revisar el archivo
poc_EDA.ipynb en el repositorio del proyecto para revisarlas.
1.2.5 Conclusiones
A partir de lo anterior, se derivaron las siguientes
conclusiones:
Se cuenta con un dataset relativamente grande, con
aproximadamente 887K filas y 74 columnas. Se tendrá que hacer un
análisis riguroso para poder limpiar los datos apropiadamente.
Se cuenta con datos tanto de tipo numérico (float64 e int64) como
no numérico (object). Probablemente los de tipo no numérico pertenecen a
columnas de texto plano, categóricas y ordinales, que se tendrán que
tratar más adelante.
Puede que algunos valores de columnas object pertenezcan a
fechas, los cuales se analizarán más adelante.
Las columnas de identificación se podrán eliminar (id y
member_id) debido a que son de identificación de cada fila y no
impactarán en la probabilidad de pago.
1.3 Limpieza de datos inicial
Una vez más familiarizados con los datos, se procederá a definir
ciertos criterios de limpieza generales para implementar antes del
análisis exploratorio de datos.
1.3.1 Criterios de limpieza
Se definen los siguientes criterios de limpieza previo al análisis
con el objetivo de mitigar la cantidad de “pistas falsas” con las que se
podría estropear el entendimiento del dataset.
Criterio 1: El porcentaje de valores nulls no debe
superar el 80%:
Columnas que tengan más del 80% de sus valores nulos serán difíciles
de imputar mas adelante, y por lo tanto se optará por
eliminarlas.
Criterio 2: No se dejarán columnas de texto plano. Se
aceptarán columnas categóricas y ordinales que luego se
codificarán:
Columnas que sean de texto plano y no sigan ninguna estructura
definida que permitan tratarlas serán eliminadas debido a la dificultad
que podrían traer al momento de codificarlos a valores
numéricos.
Criterio 3: No se dejarán columnas de identificación, ya
que son para identificar filas y entidades y no están relacionados con
ningún patrón relevante para el análisis:
Columnas que correspondan a formas de identificación de filas serán
eliminadas ya que no contribuirán al análisis.
Criterio 4: Se descartarán columnas que tengan solamente
un valor único:
Se descartarán columnas que consten de solamente un valor único para
evitar redundancias entre los datos.
1.3.2 Cumplimiento de criterio 1
| desc |
761353 |
85.797951 |
| mths_since_last_record |
750326 |
84.555303 |
| mths_since_last_major_derog |
665676 |
75.015974 |
| annual_inc_joint |
886868 |
99.942415 |
| dti_joint |
886870 |
99.942640 |
| verification_status_joint |
886868 |
99.942415 |
| open_acc_6m |
866007 |
97.591559 |
| open_il_6m |
866007 |
97.591559 |
| open_il_12m |
866007 |
97.591559 |
| open_il_24m |
866007 |
97.591559 |
| mths_since_rcnt_il |
866569 |
97.654892 |
| total_bal_il |
866007 |
97.591559 |
| il_util |
868762 |
97.902024 |
| open_rv_12m |
866007 |
97.591559 |
| open_rv_24m |
866007 |
97.591559 |
| max_bal_bc |
866007 |
97.591559 |
| all_util |
866007 |
97.591559 |
| inq_fi |
866007 |
97.591559 |
| total_cu_tl |
866007 |
97.591559 |
| inq_last_12m |
866007 |
97.591559 |
Tabla 3. Columnas que tienen más del 80% de sus
valores como nulos.
Para cumplir el criterio del porcentaje de valores nulls se
identificaron las columnas que se muestran en la Tabla 3 que tienen un
porcentaje de valores nulls mayor al 80%.
Se procedió a eliminarlos, pasando de tener un dataset de 74 columnas
a uno de 55 columnas.
Se filtraron las columnas utilizando las herramientas y los métodos
de tratamiendo de datos de pandas.
1.3.3 Cumplimiento de criterio 2
Para el cumplimiento de este criterio se tuvieron que separar las
columnas numéricas de las no numéricas.
| term |
[’ 36 months’ ’ 60 months’] |
| grade |
[‘B’ ‘C’ ‘A’ ‘E’ ‘F’ ‘D’ ‘G’] |
| sub_grade |
[‘B2’ ‘C4’ ‘C5’ ‘C1’ ‘B5’ ‘A4’ ‘E1’ ‘F2’ ‘C3’ ‘B1’ ‘D1’ ‘A1’ ‘B3’
‘B4’ ‘C2’ ‘D2’ ‘A3’ ‘A5’ ‘D5’ ‘A2’] |
| emp_title |
[nan ‘Ryder’ ‘AIR RESOURCES BOARD’ ‘University Medical Group’
‘Veolia Transportaton’ ‘Southern Star Photography’ ‘MKC Accounting’
‘Starbucks’ ‘Southwest Rural metro’ ‘UCLA’ ‘Va. Dept of
Conservation/Recreation’ ‘Target’ ‘SFMTA’ ‘Internal revenue Service’
“Chin’s Restaurant” ‘Duracell’ ‘Connection Inspection’ ‘Network
Interpreting Service’ ‘Archdiocese of Galveston Houston’ ‘Osram
Sylvania’] |
| emp_length |
[‘10+ years’ ‘< 1 year’ ‘1 year’ ‘3 years’ ‘8 years’ ‘9 years’ ‘4
years’ ‘5 years’ ‘6 years’ ‘2 years’ ‘7 years’ nan] |
| home_ownership |
[‘RENT’ ‘OWN’ ‘MORTGAGE’ ‘OTHER’ ‘NONE’ ‘ANY’] |
| verification_status |
[‘Verified’ ‘Source Verified’ ‘Not Verified’] |
| issue_d |
[‘Dec-2011’ ‘Nov-2011’ ‘Oct-2011’ ‘Sep-2011’ ‘Aug-2011’ ‘Jul-2011’
‘Jun-2011’ ‘May-2011’ ‘Apr-2011’ ‘Mar-2011’ ‘Feb-2011’ ‘Jan-2011’
‘Dec-2010’ ‘Nov-2010’ ‘Oct-2010’ ‘Sep-2010’ ‘Aug-2010’ ‘Jul-2010’
‘Jun-2010’ ‘May-2010’] |
| loan_status |
[‘Fully Paid’ ‘Charged Off’ ‘Current’ ‘Default’ ‘Late (31-120 days)’
‘In Grace Period’ ‘Late (16-30 days)’ ‘Does not meet the credit policy.
Status:Fully Paid’ ‘Does not meet the credit policy. Status:Charged Off’
‘Issued’] |
| pymnt_plan |
[‘n’ ‘y’] |
| url |
[‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1077501’
‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1077430’
‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1077175’
‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1065775’
‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1069971’
‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1062474’
‘https://www.lendingclub.com/browse/loanDetail.action?loan_id=1069742’] |
| purpose |
[‘credit_card’ ‘car’ ‘small_business’ ‘other’ ‘wedding’
‘debt_consolidation’ ‘home_improvement’ ‘major_purchase’ ‘medical’
‘moving’ ‘vacation’ ‘house’ ‘renewable_energy’ ‘educational’] |
| title |
[‘Computer’ ‘bike’ ‘real estate business’ ‘personel’ ‘Personal’ ‘My
wedding loan I promise to pay back’ ‘Loan’ ‘Car Downpayment’ ‘Expand
Business & Buy Debt Portfolio’ ‘Building my credit history.’ ‘High
intrest Consolidation’ ‘Consolidation’ ‘freedom’ ‘citicard fund’ ‘Other
Loan’ ‘Debt Consolidation Loan’ ‘Home’ ‘Holiday’ ‘Medical’
‘lowerratemeanseasiertogetoutofdebt!’] |
| zip_code |
[‘860xx’ ‘309xx’ ‘606xx’ ‘917xx’ ‘972xx’ ‘852xx’ ‘280xx’ ‘900xx’
‘958xx’ ‘774xx’ ‘853xx’ ‘913xx’ ‘245xx’ ‘951xx’ ‘641xx’ ‘921xx’ ‘067xx’
‘890xx’ ‘770xx’ ‘335xx’] |
| addr_state |
[‘AZ’ ‘GA’ ‘IL’ ‘CA’ ‘OR’ ‘NC’ ‘TX’ ‘VA’ ‘MO’ ‘CT’ ‘UT’ ‘FL’ ‘NY’
‘PA’ ‘MN’ ‘NJ’ ‘KY’ ‘OH’ ‘SC’ ‘RI’] |
| earliest_cr_line |
[‘Jan-1985’ ‘Apr-1999’ ‘Nov-2001’ ‘Feb-1996’ ‘Jan-1996’ ‘Nov-2004’
‘Jul-2005’ ‘Jan-2007’ ‘Apr-2004’ ‘Sep-2004’ ‘Jan-1998’ ‘Oct-1989’
‘Jul-2003’ ‘May-1991’ ‘Sep-2007’ ‘Oct-1998’ ‘Aug-1993’ ‘Oct-2003’
‘Jan-2001’ ‘Nov-1997’] |
| initial_list_status |
[‘f’ ‘w’] |
| last_pymnt_d |
[‘Jan-2015’ ‘Apr-2013’ ‘Jun-2014’ ‘Jan-2016’ ‘Apr-2012’ ‘Nov-2012’
‘Jun-2013’ ‘Sep-2013’ ‘Jul-2012’ ‘Oct-2013’ ‘May-2013’ ‘Feb-2015’
‘Aug-2015’ ‘Oct-2012’ ‘Sep-2012’ nan ‘Dec-2012’ ‘Dec-2014’ ‘Aug-2013’
‘Nov-2013’] |
| next_pymnt_d |
[nan ‘Feb-2016’ ‘Jan-2016’ ‘Sep-2013’ ‘Feb-2014’ ‘May-2014’
‘Jun-2013’ ‘Mar-2012’ ‘Apr-2012’ ‘May-2013’ ‘Aug-2012’ ‘Aug-2013’
‘Jun-2012’ ‘Nov-2013’ ‘Feb-2012’ ‘Oct-2011’ ‘Jan-2013’ ‘Jan-2014’
‘Jul-2013’ ‘Jul-2015’] |
| last_credit_pull_d |
[‘Jan-2016’ ‘Sep-2013’ ‘Jan-2015’ ‘Sep-2015’ ‘Dec-2014’ ‘Aug-2012’
‘Mar-2013’ ‘Dec-2015’ ‘Aug-2013’ ‘Nov-2012’ ‘Mar-2014’ ‘Apr-2015’
‘May-2014’ ‘Jul-2015’ ‘Jul-2012’ ‘Sep-2012’ ‘May-2013’ ‘Oct-2015’
‘Jun-2012’ ‘Mar-2015’] |
| application_type |
[‘INDIVIDUAL’ ‘JOINT’] |
Tabla 4. Columnas no numéricas junto con algunos de
sus valores únicos
Se revisaron las columnas de tipo object (mostradas en la Tabla 4 y
se revisaron sus valores únicos para verificar cuáles eran de texto
plano para poder eliminarlas.
De lo anterior, se concluyó que las columnas de texto plano eran las
siguientes: emp_title, title y url. Se procedió con su eliminación,
pasando de tener 55 columnas a tener 52.
1.3.4 Cumplimiento de criterio 3
Del propio nombre de las columnas id y member_id y del diccionario de
datos que vino con el dataset, se concluye que estas dos columnas son de
identificación y se procede a eliminarlas para cumplir el criterio
3.
Tras la eliminación, se pasa de 52 columnas a 50 columnas.
1.3.5 Cumplimiento de criterio 4
Tras examinar los valores únicos de las columnas numéricas, se
identificó que la columna policy_code solamente tenía 1 solo valor para
cada fila de las columnas, y por eso se procedió con su eliminación,
pasando de tener 50 columnas a 49 columnas.
1.3.6 Conclusiones
A partir de lo anterior, se derivaron las siguientes
conclusiones:
Se eliminaron columnas con más del 80% de valores nulos, lo que
permitió reducir significativamente la cantidad de ruido y valores
faltantes difíciles de imputar.
Se descartaron columnas de texto plano que no aportaban
estructura útil para el modelado, lo que facilitó la futura codificación
de variables categóricas.
Se eliminaron columnas de identificación y aquellas con un único
valor, ya que no aportaban información relevante al análisis.
Tras aplicar todos los criterios de limpieza definidos, se pasó
de un total de 74 columnas a 49, dejando un conjunto de datos más
limpio, manejable y adecuado para el análisis y modelado
posterior.
1.4 Análisis exploratorio univariado de columnas numéricas
Utilizando este nuevo dataset procesado, se permite proceder con el
análisis exploratorio de los datos. Se comenzó por el análisis
univariado de las columnas numéricas.
1.4.1 Estadísticas descriptivas
| loan_amnt |
14755.264605 |
8435.455601 |
500.000000 |
8000.000000 |
13000.000000 |
20000.000000 |
35000.000000 |
0.681683 |
-0.256715 |
| funded_amnt |
14741.877625 |
8429.897657 |
500.000000 |
8000.000000 |
13000.000000 |
20000.000000 |
35000.000000 |
0.683745 |
-0.251638 |
| funded_amnt_inv |
14702.464383 |
8442.106732 |
0.000000 |
8000.000000 |
13000.000000 |
20000.000000 |
35000.000000 |
0.680983 |
-0.251765 |
| int_rate |
13.246740 |
4.381867 |
5.320000 |
9.990000 |
12.990000 |
16.200000 |
28.990000 |
0.429481 |
-0.155362 |
| installment |
436.717127 |
244.186593 |
15.670000 |
260.705000 |
382.550000 |
572.600000 |
1445.460000 |
0.936952 |
0.685970 |
| annual_inc |
7.502759e+04 |
6.469830e+04 |
0.000000e+00 |
4.500000e+04 |
6.500000e+04 |
9.000000e+04 |
9.500000e+06 |
4.447849e+01 |
4.808192e+03 |
| dti |
18.157039 |
17.190626 |
0.000000 |
11.910000 |
17.650000 |
23.950000 |
9999.000000 |
441.486775 |
256126.862941 |
| delinq_2yrs |
0.314442 |
0.862244 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
39.000000 |
5.473796 |
57.309081 |
| inq_last_6mths |
0.694623 |
0.998448 |
0.000000 |
0.000000 |
0.000000 |
1.000000 |
33.000000 |
2.108411 |
11.925103 |
| mths_since_last_delinq |
34.063798 |
21.884940 |
0.000000 |
15.000000 |
31.000000 |
50.000000 |
188.000000 |
0.455520 |
-0.767314 |
| open_acc |
11.548469 |
5.317313 |
0.000000 |
8.000000 |
11.000000 |
14.000000 |
90.000000 |
1.249380 |
3.103994 |
| pub_rec |
0.195307 |
0.582091 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
86.000000 |
13.261941 |
993.199008 |
| revol_bal |
1.692079e+04 |
2.242679e+04 |
0.000000 |
6.443000e+03 |
1.187500e+04 |
2.082900e+04 |
2.904836e+06 |
1.594930e+01 |
9.858908e+02 |
| revol_util |
55.067693 |
23.834344 |
0.000000 |
37.700000 |
56.000000 |
73.600000 |
892.300000 |
-0.123869 |
1.027269 |
| total_acc |
25.268026 |
11.840561 |
0.000000 |
17.000000 |
24.000000 |
32.000000 |
169.000000 |
0.892539 |
1.377589 |
| out_prncp |
8403.124852 |
8493.450269 |
0.000000 |
0.000000 |
6458.290000 |
13659.055000 |
49372.860000 |
0.932018 |
0.122621 |
| out_prncp_inv |
8399.713242 |
8489.997617 |
0.000000 |
0.000000 |
6455.810000 |
13654.050000 |
49372.860000 |
0.931868 |
0.121827 |
| total_pymnt |
7558.826684 |
7871.243336 |
0.000000 |
1914.590000 |
4894.999117 |
10616.814231 |
57777.579870 |
1.788894 |
3.620120 |
| total_pymnt_inv |
7521.160306 |
7846.108604 |
0.000000 |
1899.700000 |
4862.010000 |
10565.690000 |
57777.580000 |
1.793832 |
3.641981 |
| total_rec_prncp |
5757.706424 |
6625.441046 |
0.000000 |
1200.570000 |
3215.320000 |
8000.000000 |
35000.030000 |
1.935036 |
3.989046 |
| total_rec_int |
1754.804327 |
2095.356099 |
0.000000 |
441.460000 |
1073.280000 |
2238.265000 |
24205.620000 |
2.826100 |
11.543598 |
| total_rec_late_fee |
0.396692 |
4.087825 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
358.680000 |
17.404085 |
515.724165 |
| recoveries |
45.919243 |
409.693874 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
33520.270000 |
18.061839 |
617.211417 |
| collection_recovery_fee |
4.880757 |
63.125281 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
7002.190000 |
29.655693 |
1684.165364 |
| last_pymnt_amnt |
2164.145585 |
4794.783233 |
0.000000 |
280.170000 |
462.780000 |
831.245000 |
36475.590000 |
3.475852 |
13.355772 |
| collections_12_mths_ex_med |
0.014380 |
0.134191 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
20.000000 |
17.410400 |
1097.854795 |
| mths_since_last_major_derog |
44.104838 |
22.179841 |
0.000000 |
27.000000 |
44.000000 |
61.000000 |
188.000000 |
0.264932 |
-0.031362 |
| acc_now_delinq |
0.004991 |
0.077625 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
14.000000 |
24.066357 |
1630.866453 |
| tot_coll_amt |
2.257026e+02 |
1.031137e+04 |
0.000000 |
0.000000e+00 |
0.000000e+00 |
0.000000e+00 |
9.152545e+06 |
8.561805e+02 |
7.596112e+05 |
| tot_cur_bal |
1.394582e+05 |
1.537500e+05 |
0.000000 |
2.985300e+04 |
8.055900e+04 |
2.082050e+05 |
8.000078e+06 |
2.918174e+00 |
2.940881e+01 |
| total_rev_hi_lim |
3.206862e+04 |
3.749826e+04 |
0.000000 |
1.390000e+04 |
2.370000e+04 |
3.980000e+04 |
9.999999e+06 |
7.304552e+01 |
1.840039e+04 |
Tabla 5. Resumen de estadísticas descriptivas para
cada columna numérica.
De esta tabla se pueden realizar las siguientes observaciones:
annual_inc, dti, pub_rec, recoveries, collection_recovery_fee,
tot_coll_amt, total_rev_hi_lim, entre otras, presentan fuerte asimetría
a la derecha (valores extremos altos). Esto podría llegar a afectar el
modelo de redes neuronales.
dti, annual_inc, tot_coll_amt, pub_rec,
collections_12_mths_ex_med, total_rev_hi_lim, etc., tienen colas pesadas
con outliers extremos.
delinq_2yrs, inq_last_6mths, pub_rec, collections_12_mths_ex_med,
acc_now_delinq, etc., tienen mayoría de valores en 0.
Variables financieras como loan_amnt, funded_amnt, installment,
total_pymnt, etc., probablemente están altamente
correlacionadas.
Montos como total_rec_late_fee, recoveries,
collection_recovery_fee tienen valores extremos que pueden distorsionar
análisis
1.4.2 Valores vacíos y conteo de valores por columna
| annual_inc |
4 |
0.000451 |
49385 |
| delinq_2yrs |
29 |
0.003268 |
30
[ 0. 2. 3. 1. 4. 6. 5. 8. 7. 9. 11. nan 13. 15. 10. 12. 17. 18. 29.
24.] |
| inq_last_6mths |
29 |
0.003268 |
29
[ 1. 5. 2. 0. 3. 4. 6. 7. 8. 9. 10. 11. 12. 15. 14. 33. 17. 32. 24.
13.] |
| mths_since_last_delinq |
454312 |
51.197065 |
156
[nan 35. 38. 61. 8. 20. 18. 68. 45. 48. 41. 40. 74. 25. 53. 39. 10.
26. 56. 77.] |
| open_acc |
29 |
0.003268 |
78
[ 3. 2. 10. 15. 9. 7. 4. 11. 14. 12. 20. 8. 6. 17. 5. 13. 16. 30. 21.
18.] |
| pub_rec |
29 |
0.003268 |
33
[ 0. 1. 2. 3. 4. 5. nan 6. 9. 8. 7. 11. 49. 10. 54. 12. 18. 19. 16.
15.] |
| revol_util |
502 |
0.056571 |
1357 |
| total_acc |
29 |
0.003268 |
136 |
| collections_12_mths_ex_med |
145 |
0.016340 |
13
[ 0. nan 1. 2. 4. 3. 6. 16. 20. 5. 7. 10. 14.] |
| mths_since_last_major_derog |
665676 |
75.015974 |
169
[nan 53. 34. 54. 69. 7. 16. 71. 33. 59. 45. 8. 56. 11. 50. 47. 64.
32. 62. 39.] |
| acc_now_delinq |
29 |
0.003268 |
9
[ 0. 1. nan 2. 3. 5. 4. 6. 14.] |
| tot_coll_amt |
70276 |
7.919502 |
10326 |
| tot_cur_bal |
70276 |
7.919502 |
327343 |
| total_rev_hi_lim |
70276 |
7.919502 |
21252 |
Tabla 6. Valores vacíos y conteo de valores únicos
para cada columna numérica.
Los valores null de las columnas categóricas se resumen en la Tabla
6. A partir de esto se pudo notar lo siguiente:
Las columnas con mayor número de nulos son
mths_since_last_major_derog y mths_since_last_delinq. Se deberán imputar
con precaución.
La mayoría de valores tienen una cantidad de nulos relativamente
baja, así que se podrá realizar una imputación sencilla para llenar
estos valores.
Hay varias columnas que tienen nans, así que se tendrán que
imputar con precaución también.
1.4.3 Distribución e identificación de datos atípicos
(outliers)

Figura 1. Violin plots y box plots de cada variable
numérica en el dataset.
En la Figura 1 se muestran plots de violin y caja para poder
identificar tanto la distribución de los datos como para identificar los
valores anómalos por cada columna. Se puede apreciar lo siguiente:
loan_amnt, funded_amnt, funded_amnt_inv tienen distribuciones
simétricas y estables, sin valores extremos notables.
installment presenta un leve sesgo a la derecha.
out_prncp y out_prncp_inv están centradas en cero, indicando
muchos préstamos pagados.
total_rec_prncp se concentra cerca de cero pero con un rango
amplio.
annual_inc tiene un fuerte sesgo a la derecha, con outliers
significativos.
revol_bal, tot_cur_bal, total_rev_hi_lim, total_rec_int,
total_rec_late_fee, tot_coll_amt están sesgadas a la derecha con colas
largas.
collection_recovery_fee, recoveries, last_pymnt_amnt, avg_cur_bal
también muestran colas largas hacia la derecha.
delinq_2yrs, inq_last_6mths, open_acc, pub_rec, acc_now_delinq,
collections_12_mths_ex_med tienen distribuciones discretas, centradas en
pocos valores.
mths_since_last_delinq y mths_since_last_major_derog presentan
huecos grandes debido a muchos valores nulos.
collections_12_mths_ex_med, acc_now_delinq, total_rec_late_fee,
recoveries, collection_recovery_fee están dominadas por ceros.
funded_amnt, loan_amnt, funded_amnt_inv tienen patrones similares
y pueden ser redundantes.
out_prncp y out_prncp_inv también son similares entre
sí.
total_rec_prncp, total_rec_int, total_rec_late_fee, recoveries
podrían agruparse como montos recuperados.
Variables fuertemente sesgadas podrían beneficiarse de
transformaciones.
Variables con muchos ceros podrían eliminarse.
Variables redundantes podrían eliminarse o consolidarse.
Variables discretas con pocos valores pueden tratarse como
categorías ordinales.
1.4.4. Conclusiones
A partir de lo anterior, se derivaron las siguientes
conclusiones:
Entre los datos se encuentran varias columnas que están muy o
poco sesgadas, además de contar con muchos o pocos outliers. Se tendrá
que tener esto en cuenta a la hora de preprocesar los datos.
Existen varias columnas con valores nulos pero imputables, y por
lo tanto se podrá realizar la debida imputación al momento de hacer el
preprocesado.
1.5 Análisis exploratorio univariado de columnas no numéricas
1.5.1 Distribución de frecuencias y cardinalidad
A partir del análisis de la estructura del proyecto, se pudieron
identificar las columnas no numéricas que se muestran en la Tabla 4. Se
procedió a analizar la frecuencia y cardinalidad de estas columnas.
De esto, se pudo identificar lo siguiente:
term solo tiene dos valores posibles, y por lo tanto podrá ser
codificada fácilmente.
grade y sub_grade están relacionadas, pero sub_grade tiene más
granularidad, y por lo tanto se decide eliminar la columna
grade.
emp_length es ordinal, y por lo tanto deberá ser codificada según
corresponde.
home_ownership tiene algunas clases similares, como OTHER, NONE y
ANY, por lo que dependiendo de su frecuencia se podrían
agrupar.
verification_status también será fácil de codificar debido a que
cuenta solamente con 2 valores.
Debido a la antiguedad de los datos, se optará luego por
descartar las columnas que contengan fechas.
loan_status será nuestro target, el cual más adelante se
codificará siguiendo las recomendaciones dadas por el enunciado del
problema.
purpose es una versión más estructurada y constante de title, y
por lo tanto se conservará.
zip_code y addr_state están relacionadas, pero addr_state tiene
menos cardinalidad, y por lo tanto se optará por eliminar la columna
zip_code.
initial_list_status será fácil de codificar al contar con pocos
valores.
1.5.2 Conteo de valores por columna

Figura 2. Gráficos de barras para las variables
categóricas.
En la Figura 2 se muestran los gráficos de barras generados para ver
la frecuencia de los valores de cada variable categórica. De esta, se
puede identificar lo siguiente:
Muchas variables categóricas (como term,
grade, pymnt_plan,
application_type) tienen categorías dominantes, lo que
sugiere un fuerte desbalance que se tendría que tratar, por ejemplo,
eliminando las filas que contienen valores que no son comunes.
Se puede ver que la mayoría de los préstamos son a 36 meses y los
principales motivos de préstamo son deb_consolidation y
credit_card.
La mayoría de los datos tienen a MORTGAGE como su estado de
home_ownership.
Columnas como application_type, last_credit_pull_d, next_pymnt,
last_pymnt_d, pymnt_plan y home_ownership tienen muy poca variabilidad o
tienen valores que son muy raros. Para tratarlos, se optará por eliminar
las filas que contengan valores extremadamente raros, y se eliminarán
columnas que tengan más del 80% de los valores iguales.
1.5.3 Limpieza adicional de columnas con poca varianza
A partir de lo anteriormente mencionado, se decidió por realizar las
siguientes acciones de limpieza para las columnas categóricas:
Se eliminarán las columnas grade y zip_code debido a que ya
tienen otras columnas que encapsulan sus significados.
Por el momento, debido a que los datos van hasta el 2016, se
eliminarán las siguientes columnas que representan fechas: last_pymnt_d,
next_pymnt_d, issue_d, earliest_cr_line, last_credit_pull_d.
Se eliminarán las filas que no cumplan con los siguientes
criterios:
El valor de home_ownership deberá ser RENT, MORTGAGE o
OWN.
El valor de pymnt_plan deberá ser “n”.
El valor de application_type deberá ser INDIVIDUAL.
Una vez aplicada la limpieza de acuerdo a los anteriores criterios,
se pasó de tener 887379 filas a tener 886623 filas, es decir, que hubo
una reducción de menos del 0.01% del dataset.
1.6 Análisis multivariado
1.6.2 Matriz de correlación

Figura 3. Matriz de correlación.
De esta matriz de correlación, considerando que loan_status es el
target del problema de aprendizaje supervisado, se observa lo
siguiente:
Las columnas loan_amnt, funded_amnt y funded_amnt_inv están
fuertemente correlacionadas, lo cual tiene sentido al tratarse de
representaciones del monto del préstamo.
La mayoría de las variables presentan correlaciones moderadas o
bajas, lo cual es positivo para evitar redundancia en modelos lineales
como regresión logística.
loan_status no tiene correlaciones muy fuertes, lo que sugiere
que no hay ningún predictor lineal dominante y que el modelo podría
beneficiarse de enfoques no lineales o combinaciones de múltiples
variables.
1.6.3 Análisis de target
Tras hacer la conversión de loan_status a valores binarios, se
procedió a realizar el análisis de la frecuencia de las clases.
| NaN |
618330 |
69.7% |
| 0 |
209526 |
23.6% |
| 1 |
58767 |
6.6% |
Tabla 7. Balance de target antes de eliminar valores
NaN.
En la Tabla 7 se muestran los valores en la columna del target
loan_status. Como se busca realizar el entrenamiento del modelo,
aquellos valores NaN que están en la columna no nos servirán, y por lo
tanto esas filas se eliminarán.
| 0 |
209526 |
78.1% |
| 1 |
58767 |
21.9% |
Tabla 8. Balance de target después de eliminar
valores NaN.
En la Tabla 8 se muestra el nuevo balance de los valores de las
clases después de eliminar las filas con NaNs en el target.
Ya se cuenta con un total de 268293 de 887379 que se tenían
inicialmente, lo cual representa una disminución considerable del 70% de
los datos. Sin embargo, debido a cómo se recomendó codificar el target,
se considera apropiado.
1.6.4 Conclusiones
A partir de lo anterior, se derivaron las siguientes
conclusiones:
- La transformación del target
loan_status a una variable
binaria permitió definir con claridad las clases positivas y negativas,
eliminando aquellos casos con estado incierto.
- La matriz de correlación reveló que no existe una variable numérica
con correlación fuerte directa con el target, lo que sugiere que se
requerirán modelos no lineales o técnicas de combinación de variables
para una predicción efectiva.
- La eliminación de registros con valores nulos en el target redujo el
dataset en aproximadamente un 70%, lo cual representa una pérdida
significativa de datos, pero es necesaria para garantizar la calidad del
aprendizaje supervisado.
- Tras la depuración, se identificó un leve desbalance de clases
(78.1% positivas vs 21.9% negativas), lo cual se deberá tener en cuenta
en el diseño del modelo y en la selección de métricas de
evaluación.
1.7 Conclusiones parte 1
- Se realizó una limpieza estructurada del dataset, eliminando
columnas irrelevantes, redundantes o con valores excesivos nulos, lo que
permitió reducir la dimensionalidad y facilitar futuros análisis.
- A través del análisis de variables categóricas, se identificaron
patrones de frecuencia esperables en atributos como term, grade,
home_ownership y purpose, lo cual aporta contexto relevante para la
posterior construcción del modelo.
- El análisis de correlación evidenció que muchas variables numéricas
tienen baja correlación entre sí y con el target, lo que reduce el
riesgo de multicolinealidad pero también sugiere que el problema no será
fácilmente resuelto por modelos lineales simples.
- La transformación del target loan_status a una variable binaria (0:
positivo, 1: negativo) permitió estructurar el problema como una
clasificación supervisada binaria, eliminando casos con estatus
indefinido.
- La depuración del target implicó una pérdida significativa de datos
(70%), pero se consideró necesaria para asegurar la coherencia y
confiabilidad del modelo predictivo.
- El conjunto final presenta un leve desbalance de clases, lo que debe
ser tratado adecuadamente en la etapa de modelado mediante técnicas como
el uso de métricas apropiadas o balanceo de datos.
Ya con el dataset limpio, se procede a la sección dedicada a la
ingeniería de features.
Parte 2. Ingeniería de Features
A continuación se presenta una síntesis de lo realizado en el proceso
de ingeniería de features. Todo el código con los detalles de
implementación se puede encontrar en el archivo
poc_FeatureEngineering.ipynb en el repositorio del proyecto.
2.1 Objetivos
Una vez con el dataset lo suficientemente limpio, se procederá a
preprocesar estos datos para poder realizar el entrenamiento de los
modelos. Se tendrán los siguientes objetivos:
Codificar las columnas no numéricas de acuerdo a su naturaleza
categórica u ordinal, y de acuerdo a la cardinalidad de cada
una.
Imputar valores nulls para variables numéricas que lo
permitan.
Escalar los datos numéricos para mitigar el efecto de las
anomalías en el modelo.
2.2 Tratamiento de columnas numéricas
2.2.1 Imputación de nulls
Para la imputación de nulls, se optó por utilizar un SimpleImputer de
la herramienta sklearn, el cual permite realizar imputación de nulls
sencilla utilizando la media, mediana o el valor más frecuente. Para
este caso, se optó por imputar utilizando el valor de la media para cada
columna numérica.
Esto se hizo para poder verificar cómo se comportaba el modelo con
este tipo de imputación. Si se notaba que las métricas no eran las
deseadas a la hora de evaluar el modelo, se volvería aquí a cambiar la
técnica de imputación. Sin embargo, de los resultados del modelado se
concluyó que esto era suficiente.
2.2.2 Escalado de datos
Para el escalado de datos, se optó por utilizar el escalador
RobustScaler de sklearn, ya que aplica un escalado que es más robusto a
los valores atípicos. Según (Interactive Chaos,s.f., Robust Scaler),
realiza dos pasos principales:
- Calcula la mediana y el rango intercuartil (IQR) de cada
característica en el conjunto de datos (el IQR es la diferencia entre el
percentil 75 y el percentil 25 de los datos).
- Utiliza la mediana y el IQR de cada característica para escalar los
datos.
En caso de ver que el modelo no tiene métricas favorables, se
cambiaría. Sin embargo, a partir de los resultados del modelado se
concluyó que esta opción era suficiente.
2.3 Tratamiento de columnas no numéricas
2.3.1 Transformación de variables ordinales
A partir de la Tabla 4, se pudieron identificar que las variables
ordinales a codificar eran sub_grade y emp_length respectivamente.
Para codificar a sub_grade, dado que se trataba de una “nota” similar
a una nota académica, se optó por intentar codificarla de una forma
similar a como se califica del 1 al 5 en los sistemas educativos
colombianos. Sin embargo, al tratarse de 7 notas mayores (A, B, C, D, E,
F y G), la calificación ahora sería del 1 al 7. Por otro lado, cada
valor estaba acompañado de un número del 1 al 5, por lo que se optó
porque estos valores representaran cierta fracción dentro de la nota
mayor.
Se codificó utilizando la siguiente función:
def sub_grade_mapper(val):
val = str(val)
grade_mapping = {
"A": 7,
"B": 6,
"C": 5,
"D": 4,
"E": 3,
"F": 2,
"G": 1
}
num_mapping = {
"1": 0.8,
"2": 0.6,
"3": 0.4,
"4": 0.2,
"5": 0.0
}
num_val = grade_mapping[val[0]] + num_mapping[val[1]]
return num_val
Para la columna emp_length, se optó por utilizar la clase
OrdinalEncoder y sus métodos para codificarla de acuerdo al siguiente
orden:
- “Unknown”: Estos son los valores que estaban como NaN en esta
columna.
- “< 1 year”
- “1 year”
- “2 years”
- “3 years”
- “4 years”
- “5 years”
- “6 years”
- “7 years”
- “8 years”
- “9 years”
- “10+ years”
Se utilizó la siguiente porción de código para hacerlo:
ordered_vals = [
"Unknown",
"< 1 year",
"1 year",
"2 years",
"3 years",
"4 years",
"5 years",
"6 years",
"7 years",
"8 years",
"9 years",
"10+ years"
]
ordinal_encoder = OrdinalEncoder(categories=[ordered_vals])
df["emp_length"] = ordinal_encoder.fit_transform(df[["emp_length"]])
2.4 Conclusiones parte 2
Tras haber realizado todo el preprocesamiento adecuado de los datos y
haber generado un nuevo dataset con todos estos datos tratados, se
sacaron las siguientes conclusiones y aprendizajes:
Se implementaron técnicas adecuadas de preprocesamiento para
preparar los datos para el siguiente proceso de modelado, implementando
técnicas de imputación, escalado y codificación de variables no
numéricas.
Una variable ordinal puede ser codificada tanto manualmente (si
se ve un paralelo claro y una forma de implementación concisa) como
apoyándose en herramientas especializadas en codificación, como lo son
las herramientas que brinda SKlearn.
Se logró una transformación del dataset que se considera lo
suficientemente coherente, escalada y completamente numérica como para
pasar a la siguiente fase de modelado.
Parte 3. Modelado
A continuación se presenta una síntesis de lo realizado en el proceso
de modelado. Todo el código con los detalles de implementación se puede
encontrar en el archivo poc_Modeling.ipynb en el repositorio del
proyecto.
3.1 Objetivos
Ya contando con un dataset listo para el entrenamiento de modelos de
deep learning y clasificación binaria, se espera cumplir con los
siguientes objetivos:
Realizar una división apropiada del dataset para entrenar y
validar el modelo, concretamente un 70% para entrenamiento y un 30% para
la evaluación.
Entrenar un modelo simple de XGBoost para tenerlo como punto de
comparación vs los modelos multiperceptron a definir.
Entrenar dos modelos multiperceptron con varias variaciones de
arquitectura para comparar cómo es el impacto de estos cambios en los
valores objetivos para las métricas del modelado.
3.2 Train-Test split
Para hacer el split de los datos, se optó por utilizar una proporción
del 70% para el entrenamiento y un 30% para el testeo, el cual es una
proporción estándar en machine learning (Stojiljkovic, 2025).
Se hizo el split utilizando la siguiente porción de código:
y = df["loan_status"].astype(int)
X = df.drop(columns=["loan_status"])
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size = 0.3,
random_state = 35,
stratify = y,
shuffle=True
)
3.3. Modelo 1: XGBoost
XGBoost es una librería de código abierto que emplea árboles de
decisiones potenciados por gradiente. (IBM, 2024). Suele ser muy veloz y
eficiente con conjuntos grandes de datos. Suele ser muy utilizado en
problemas de clasificación y regresión.
3.3.1 Definición del modelo
El modelo utilizado se definió de la siguiente manera:
xgb_classifier = XGBClassifier(
objective='multi:softmax', #
num_class=2,
n_estimators=500,
learning_rate=0.1,
max_depth=3,
subsample=0.8,
colsample_bytree=0.8,
gamma=0,
reg_lambda=1,
use_label_encoder=False,
eval_metric='mlogloss',
random_state=35,
n_jobs=-1
)
A continuación algunas observaciones recogidas para definir el
modelo:
Se optó por utilizar un objetivo multiclase para poder ver cómo
afectaba esto a la calidad del modelo, sabiendo que la tarea en cuestión
es de clasificación binaria.
Se optó por utilizar un número relativamente alto de estimadores
para garantizar tener un desempeño descente del modelo, considerando que
se tiene un alto número de features.
Se optó por un valor bajo de la tasa de aprendizaje para tener un
modelo más robusto.
Se optó por una profundización de 3 para evitar sobreajuste y
ayudar al modelo con la generalización.
Se introduce una proporción de muestras aleatorias de 80% para
reducir el sobreajuste.
Se introduce una proporción de features para la construcción de
los árboles de 0.8 para reducir el sobre ajuste.
Se le pasa un gamma igual a 0 para darle algo de flexibilidad al
modelo.
Se optó por utilizar multi log loss para la función de pérdida,
la cual es válida tanto para problemas multiclase como de clasificación
binaria.
3.3.2 Evaluación
Los resultados obtenidos en el conjunto de entrenamiento se resumen
en la siguiente tabla generada por el código encargado de realizar la
evaluación:

Figura 4. Tabla de resultados de XGBoost en el
conjunto de entrenamiento
De igual forma, a continuación se tiene la tabla respectiva para el
conjunto de testing.

Figura 5. Tabla de resultados de XGBoost en el
conjunto de testing
3.3.3. Conclusiones modelado XGBoost
De los anteriores resultados se obtuvieron las siguientes
conclusiones y aprendizajes:
- Sorprendentemente, el modelo tuvo resultados excelentes en ambos
conjuntos de datos. Esto es algo sospechoso, debido a que puede haber
una alta probabilidad de data leakage debido a la falta de revisión en
algún punto durante la limpieza de los datos.
3.4. Modelo 2: XGBoost tras resolver problema de data leakage
Debido a lo anterior, hizo falta revisar nuevamente las columnas
utilizadas para verificar que no hubiera ninguna fuga de datos, es
decir, que no hubiera ninguna columna que no debiera aparecer al momento
de entrenar y evaluar el modelo.
Después de una revisión del diccionario de datos, se confirmó que
había un problema de fuga de datos, específicamente con las siguientes
columnas que se estaban utilizando:
- total_rec_prncp: Pagos principales recibidos hasta
la fecha.
- total_rec_int: Intereses recibidos hasta la
fecha.
- total_rec_late_fee: Intereses tardíos recibidos
hasta la fecha.
- recoveries: Monto total recuperado por el acreedor
después de considerar la deuda como incobrable.
- total_pymnt: Pagos recibidos hasta la fecha de la
totalidad de lo prestado.
- total_pymnt_inv: Pagos recibidos hasta la fecha en
proporción a lo pagado por inversores.
- collection_recovery_fee: Monto de tarifas cobradas
por recuperar la deuda después de haber sido cobrada.
- last_pymnt_amnt: Monto total del último pago
recibido.
3.4.2 Evaluación
Los resultados obtenidos en el conjunto de entrenamiento se resumen
en la siguiente tabla generada por el código encargado de realizar la
evaluación:

Figura 4. Tabla de resultados de XGBoost en el
conjunto de entrenamiento corregido
De igual forma, a continuación se tiene la tabla respectiva para el
conjunto de testing.

Figura 5. Tabla de resultados de XGBoost en el
conjunto de testing corregido
3.4.3. Conclusiones modelado XGBoost
De los anteriores resultados se obtuvieron las siguientes
conclusiones y aprendizajes:
- Ahora sí, se cuentan con valores de las métricas más razonables, y
por lo tanto se puede concluir que se ha resuelto el problema del data
leakage.
- Debido al desbalance de clases, se puede notar que el modelo tiene
un buen rendimiento general identificando a las personas que pagan sus
deudas (f1 score 0.9), pero no lo es a la hora de identificar los casos
de personas que no pagan (f1 score 0.4). Esto es crítico, ya que el
interés principal está en identificar a estos últimos para mitigar el
riesgo de dar préstamos que no se van a pagar después.
3.5 Modelo 3: MultiLayer Perceptron
3.5.1 Definición del modelo
Para crear el modelo, se optó por utilizar la herramienta PyTorch
para crear un modelo multiperceptron. El modelo como tal está definido
en la siguiente clase:
class MLP(nn.Module):
def __init__(self, input_dim, n_classes):
super(MLP, self).__init__()
self.model = nn.Sequential(
nn.Linear(input_dim, 128),
nn.ReLU(),
nn.BatchNorm1d(128),
nn.Dropout(0.3),
nn.Linear(128, 64),
nn.ReLU(),
nn.BatchNorm1d(64),
nn.Dropout(0.3),
nn.Linear(64, n_classes)
)
def forward(self, x):
return self.model(x)
Para el entrenamiento, se utilizó como función de pérdida la función
CrossEntropyLoss, y como optimzador, se optó por usar el optimizador
ADAM. Se utilizaron 10 épocas para entrenar el respectivo modelo
3.5.2 Evaluación
Los resultados obtenidos en el conjunto de entrenamiento se resumen
en la siguiente tabla generada por el código encargado de realizar la
evaluación:

Figura 6. Tabla de resultados de Multilayer
Perceptronen el conjunto de entrenamiento corregido
De igual forma, a continuación se tiene la tabla respectiva para el
conjunto de testing.

Figura 7. Tabla de resultados de Multilayer
Perceptron en el conjunto de testing corregido
3.5.3 Conclusiones multilayer perceptron
Se tiene una situación similar a con el anterior modelo, pero
esta vez el modelo pudo clasificar los verdaderos positivos a la
perfección.
Sin embargo, debido al desbalance sigue estando la dificultad con
la segunda categoría, lo cual sigue siendo muy crítico.
Talvez con cambios breves en la red neuronal creada pueda mejorar
un poco, pero si no se trata el desbalance se tendrá el mismo
problema.
3.6 Conclusiones parte 3
- La división 70/30 de entrenamiento y prueba permitió garantizar que
ambas particiones tuvieran una representación balanceada de las clases,
lo cual es crucial para problemas de clasificación binaria y
especialmente útil en presencia de desbalance.
- El modelo inicial de XGBoost ofreció resultados prometedores, aunque
inicialmente demasiado buenos, lo cual llevó a sospechar de un posible
problema de data leakage. Esto demuestra la utilidad de este modelo como
un baseline fuerte para evaluar comparativamente otros enfoques más
complejos como las redes neuronales.
- La detección de variables relacionadas directamente con el resultado
a predecir (como pagos realizados, intereses recibidos, etc.) confirmó
la existencia de una fuga de información. Su exclusión fue fundamental
para obtener resultados realistas y fiables, evidenciando la importancia
de una limpieza rigurosa de los datos basada en un buen entendimiento
del negocio.
- A pesar de corregir el leakage, ambos modelos (XGBoost y MLP)
evidenciaron dificultades para identificar correctamente a los deudores
(la clase minoritaria), logrando un F1 score bajo (cercano a 0.4) en esa
clase, mientras que el desempeño en la clase mayoritaria fue mucho
mejor. Esto es problemático desde el punto de vista de negocio, ya que
el foco está en identificar correctamente los casos de alto riesgo.
- El modelo de red neuronal mostró un rendimiento comparable al de
XGBoost, con incluso mejor precisión para verdaderos positivos. Sin
embargo, el problema de desbalance persistió, lo que indica que ajustes
en la arquitectura por sí solos no serán suficientes.
- El modelado no solo sirve para ajustar hiperparámetros y
arquitecturas, sino también para validar supuestos, detectar problemas
en los datos y comprender las limitaciones de los modelos ante
características del dataset como el desbalance o la calidad de las
features.
Casos de uso alternativos
El análisis y la detección de personas con alto riesgo de impago
crediticio no solo son fundamentales para la gestión financiera de las
entidades prestamistas, sino que también pueden extrapolarse a otros
dominios mediante el desarrollo de modelos predictivos similares.
Este tipo de enfoque basado en datos permite identificar patrones de
comportamiento y factores de riesgo que, una vez comprendidos, pueden
aplicarse a problemas como la detección temprana de fraudes financieros,
la evaluación de riesgo en la suscripción de seguros o la predicción de
enfermedades crónicas en el ámbito de la salud.
Conclusiones finales
A lo largo del desarrollo del proyecto, se evidenció que la calidad
del preprocesamiento es determinante para el éxito del modelado, ya que
las decisiones tomadas durante la ingeniería de features —como la
imputación de valores faltantes, el escalado de variables numéricas y la
codificación adecuada de variables categóricas— permitieron construir un
conjunto de datos sólido y apto para el entrenamiento de modelos. No
obstante, la experiencia con el primer modelo XGBoost también demostró
que el data leakage puede invalidar completamente los resultados,
resaltando la necesidad de comprender a profundidad el significado y la
temporalidad de cada variable para evitar fugas de información.
Una vez corregido este problema, los modelos entrenados dejaron en
evidencia otro gran desafío: el desbalance de clases. A pesar de obtener
buenos resultados generales, tanto XGBoost como el modelo MultiLayer
Perceptron mostraron ser ineficientes para detectar correctamente a los
usuarios que no pagan sus deudas, lo cual es crítico dado el objetivo
del problema.
Finalmente, se concluye que utilizar modelos más complejos no
garantiza mejores resultados si no se aborda de forma adecuada la
estructura del problema; por ello, el foco debe estar tanto en la
calidad de los datos como en estrategias específicas que respondan a los
retos particulares del dominio, como el balanceo de clases o el ajuste
fino de métricas.
Reporte de contribución individual
- Leonardo Federico Corona Torres
- Definición y escritura de estructura del reporte.
- Colaboración en creación de video promocional.
- Aportes entregable escrito.
- David Escobar Ruiz
Realización de limpieza de datos.
Realización de EDA.
Realización de ingeniería de features.
Realización de proceso de modelado.
Colaboración en creación de video promocional.
- Johan Sebastián Robles Rincón
Desarrollo del backend de la aplicación web.
Apoyo en despliegue de la aplicación.
Apoyo en desarrollo frontend.
Apoyo en conexión de API del modelo con vistas de
Django.
- Sebastian Soto Arcila
Desarrollo frontend de la aplicación web.
Apoyo en conexión de API del modelo con vistas de
Django.
Apoyo en despliegue de la aplicación.
Aportes entregable escrito.
LS0tDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQotLS0NCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IGZhbHNlDQogICAgY3NzOiBhcGFfc3R5bGUuY3NzDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IGZhbHNlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KOjo6IHtzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDYwcHg7In0NCjxoMT5SRVBPUlRFIFRSQUJBSk8gMjogQVBMSUNBQ0lPTkVTIERFIFJFREVTIE5FVVJPTkFMRVMgQSBEQVRPUyBUQUJVTEFSRVM8L2gxPg0KDQo8aDI+UkVERVMgTkVVUk9OQUxFUyBZIEFMR09SSVRNT1MgQklPSU5TUElSQURPUzwvaDI+DQoNCjxicj48YnI+PGJyPg0KDQo8cD48c3Ryb25nPlByZXNlbnRhZG8gcG9yOjwvc3Ryb25nPjwvcD4NCg0KPHA+TGVvbmFyZG8gRmVkZXJpY28gQ29yb25hIFRvcnJlczxicj4gRGF2aWQgRXNjb2JhciBSdWl6PGJyPiBgSm9oYW4gU2ViYXN0aWFuIFJvYmxlcyBSaW5jw7NuPGJyPmB7PWh0bWx9U2ViYXN0acOhbiBTb3RvIEFyY2lsYTwvcD4NCg0KPGJyPjxicj4NCg0KPHA+PHN0cm9uZz5Qcm9mZXNvcjo8L3N0cm9uZz4gSnVhbiBEYXZpZCBPc3BpbmEgQXJhbmdvPC9wPg0KDQo8cD48c3Ryb25nPk1vbml0b3I6PC9zdHJvbmc+IEFuZHLDqXMgTWF1cmljaW8gWmFwYXRhIFJpbmPDs248L3A+DQoNCjxicj4gIVtVbml2ZXJzaXR5IExvZ29dKGxvZ29fdW5hbC5wbmcpe2FsdD0iVW5pdmVyc2l0eSBMb2dvIiB3aWR0aD0iMTAwIn0gPGJyPjxicj4NCg0KPHA+VW5pdmVyc2lkYWQgTmFjaW9uYWwgZGUgQ29sb21iaWE8YnI+IEZhY3VsdGFkIGRlIE1pbmFzPGJyPiBJbmdlbmllcsOtYSBkZSBTaXN0ZW1hcyBlIEluZm9ybcOhdGljYTwvcD4NCg0KPHA+PHN0cm9uZz5gciBmb3JtYXQoU3lzLkRhdGUoKSwgIiVkIGRlICVCIGRlICVZIilgPC9zdHJvbmc+PC9wPg0KOjo6DQoNCmBgYHs9aHRtbH0NCjwhLS0NCiAgTk9URTogTG9zIHRpcG9zIGRlIHNlbGVjdG9yZXMgc29uOg0KICAgIC0gQ29tZW56YWRvcyBlbiAiaXUiIHBhcmEgaXRlbXMgZGUgbGlzdGFzIG5vIG9yZGVuYWRhcw0KICAgIC0gQ29tZW56YWRvcyBlbiAiaW8iIHBhcmEgaXRlbXMgZGUgbGlzdGFzIG9yZGVuYWRhcw0KLS0+DQpgYGANCiMgQ29udGVuaWRvcw0KDQotICAgW0ludHJvZHVjY2nDs25dKCNpdTEuKQ0KLSAgIFtNZXRvZG9sb2fDrWFdKCNpdTIuKQ0KLSAgIFtEZWZpbmljacOzbiBkZWwgcHJvYmxlbWFdKCNpdTMuKQ0KLSAgIFsxLiBMaW1waWV6YSBkZSBkYXRvc10oI2l1NC4pDQotICAgWzEuMSBPYmpldGl2b3NdKCNpdTUuKQ0KLSAgIFsxLjIgRXN0cnVjdHVyYSBkZWwgZGF0YXNldF0oI2l1Ni4pDQotICAgWzEuMyBMaW1waWV6YSBkZSBkYXRvcyBpbmljaWFsXSgjaXU3LikNCi0gICBbMS40IEFuw6FsaXNpcyBleHBsb3JhdG9yaW8gdW5pdmFyaWFkbyBkZSBjb2x1bW5hcyBudW3DqXJpY2FzXSgjaXU4LikNCi0gICBbMS41IEFuw6FsaXNpcyBleHBsb3JhdG9yaW8gdW5pdmFyaWFkbyBkZSBjb2x1bW5hcyBubyBudW3DqXJpY2FzXSgjaXU5LikNCi0gICBbMS42IEFuw6FsaXNpcyBtdWx0aXZhcmlhZG9dKCNpdTEwLikNCi0gICBbMS43IENvbmNsdXNpb25lcyBwYXJ0ZSAxXSgjaXUxMS4pDQotICAgWzIuIEluZ2VuaWVyw61hIGRlIGZlYXR1cmVzXSgjaXUxMi4pDQotICAgWzIuMSBPYmpldGl2b3NdKCNpdTEzLikNCi0gICBbMi4yIFRyYXRhbWllbnRvIGRlIGNvbHVtbmFzIG51bcOpcmljYXNdKCNpdTE0LikNCi0gICBbMi4zIFRyYXRhbWllbnRvIGRlIGNvbHVtbmFzIG5vIG51bcOpcmljYXNdKCNpdTE1LikNCi0gICBbMi40IENvbmNsdXNpb25lcyBwYXJ0ZSAyXSgjaXUxNi4pDQotICAgWzMuIE1vZGVsYWRvXSgjaXUxNy4pDQotICAgWzMuMSBPYmpldGl2b3NdKCNpdTE4LikNCi0gICBbMy4yIFRyYWluLVRlc3Qgc3BsaXRdKCNpdTE5LikNCi0gICBbMy4zIE1vZGVsbyAxOiBYR0Jvb3N0XSgjaXUyMC4pDQotICAgWzMuNCBNb2RlbG8gMjogWEdCb29zdCB0cmFzIHJlc29sdmVyIHByb2JsZW1hIGRlIGRhdGEgbGVha2FnZV0oI2l1MjEuKQ0KLSAgIFszLjUgTW9kZWxvIDM6IE11bHRpbGF5ZXIgUGVyY2VwdHJvbl0oI2l1MjIuKQ0KLSAgIFszLjYgQ29uY2x1c2lvbmVzIHBhcnRlIDNdKCNpdTIzLikNCi0gICBbQ2Fzb3MgZGUgdXNvIGFsdGVybmF0aXZvc10oI2l1MjQuKQ0KLSAgIFtDb25jbHVzaW9uZXMgZmluYWxlc10oI2l1MjUuKQ0KLSAgIFtSZXBvcnRlIGRlIGNvbnRyaWJ1Y2nDs24gaW5kaXZpZHVhbF0oI2l1MjYuKQ0KLSAgIFtSZXBvc2l0b3JpbyBkZSBHaXRIdWIgZGVsIHByb3llY3RvXSgjaXUyNy4pDQotICAgW0xpbmsgaGFjaWEgYXBwIHdlYiBkZWwgcHJveWVjdG8uXSgjaXUyOC4pDQotICAgW0JpYmxpb2dyYWbDrWFdKCNpdTI5LikNCg0KPGEgbmFtZT0iaXUxLiI+PC9hPg0KDQojIEludHJvZHVjY2nDs24NCg0KTGFzIHJlZGVzIG5ldXJvbmFsZXMgc29uIHVuIHRpcG8gZGUgbW9kZWxvIGNvbXB1dGFjaW9uYWwgaW5zcGlyYWRvIGVuIGVsIGZ1bmNpb25hbWllbnRvIGRlbCBjZXJlYnJvIGh1bWFubywgY29tcHVlc3RvIHBvciBjYXBhcyBkZSB1bmlkYWRlcyBsbGFtYWRhcyBuZXVyb25hcyBhcnRpZmljaWFsZXMgKFdpa2lwZWRpYSwgcy5mLiwgQXJ0aWZpY2lhbCBOZXVyYWwgTmV0d29ya3MpLiBFc3RhcyByZWRlcyBzb24gY2FwYWNlcyBkZSBhcHJlbmRlciBwYXRyb25lcyBjb21wbGVqb3MgYSBwYXJ0aXIgZGUgZ3JhbmRlcyB2b2zDum1lbmVzIGRlIGRhdG9zIG1lZGlhbnRlIHVuIHByb2Nlc28gY29ub2NpZG8gY29tbyBlbnRyZW5hbWllbnRvLiBBIHRyYXbDqXMgZGUgZXN0ZSBwcm9jZXNvLCBhanVzdGFuIGludGVybmFtZW50ZSBzdXMgcGFyw6FtZXRyb3MgcGFyYSBtaW5pbWl6YXIgZWwgZXJyb3IgZW4gbGEgdGFyZWEgcXVlIHNlIGxlcyBhc2lnbmEuDQoNClNlIHV0aWxpemFuIGFtcGxpYW1lbnRlIGVuIHRhcmVhcyBkZSBjbGFzaWZpY2FjacOzbiwgcmVncmVzacOzbiwgZGV0ZWNjacOzbiBkZSBhbm9tYWzDrWFzLCBwcm9jZXNhbWllbnRvIGRlIGltw6FnZW5lcywgcHJvY2VzYW1pZW50byBkZSBsZW5ndWFqZSBuYXR1cmFsLCBlbnRyZSBtdWNoYXMgb3RyYXMgYXBsaWNhY2lvbmVzLiBTdSBjYXBhY2lkYWQgcGFyYSBjYXB0dXJhciByZWxhY2lvbmVzIG5vIGxpbmVhbGVzIHkgY29tcGxlamFzIGVudHJlIHZhcmlhYmxlcyBsYXMgY29udmllcnRlIGVuIHVuYSBoZXJyYW1pZW50YSBwb2Rlcm9zYSBkZW50cm8gZGVsIGNhbXBvIGRlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljby4NCg0KVW5vIGRlIGxvcyBwcm9ibGVtYXMgY2zDoXNpY29zIGVuIGxvcyBxdWUgc2UgYXBsaWNhbiB0w6ljbmljYXMgZGUgYXByZW5kaXphamUgc3VwZXJ2aXNhZG8gZXMgbGEgY2xhc2lmaWNhY2nDs24gZGUgcmllc2dvIGRlIGNyw6lkaXRvICwgcXVlIGNvbnNpc3RlIGVuIHByZWRlY2lyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gc29saWNpdGFudGUgZGUgY3LDqWRpdG8gY3VtcGxhIG8gbm8gY29uIHN1cyBvYmxpZ2FjaW9uZXMgZmluYW5jaWVyYXMgKFN5bmFwc2UgQW5hbHl0aWNzLCBzLmYuLCBDcmVkaXQgU2NvcmluZyBFeHBsYWluZWQgLSBUaGUgUHJvYmxlbSBTdGF0ZW1lbnQpLiBFc3RlIHRpcG8gZGUgbW9kZWxvcyBlcyBjcnVjaWFsIHBhcmEgbGFzIGluc3RpdHVjaW9uZXMgZmluYW5jaWVyYXMsIHlhIHF1ZSBsZXMgcGVybWl0ZSB0b21hciBkZWNpc2lvbmVzIG3DoXMgaW5mb3JtYWRhcywgcmVkdWNpciByaWVzZ29zIHkgbWVqb3JhciBsYSBhc2lnbmFjacOzbiBkZSByZWN1cnNvcy4NCg0KRW4gZXN0ZSBjb250ZXh0bywgbGFzIHJlZGVzIG5ldXJvbmFsZXMgb2ZyZWNlbiB1bmEgYWx0ZXJuYXRpdmEgZWZpY2F6IGZyZW50ZSBhIG1vZGVsb3MgbcOhcyB0cmFkaWNpb25hbGVzLCB5YSBxdWUgcHVlZGVuIG1vZGVsYXIgcmVsYWNpb25lcyBubyBldmlkZW50ZXMgZW50cmUgbG9zIGF0cmlidXRvcyBmaW5hbmNpZXJvcyB5IGRlbW9ncsOhZmljb3MgZGUgbG9zIHNvbGljaXRhbnRlcyB5IHN1IGNvbXBvcnRhbWllbnRvIGNyZWRpdGljaW8gZnV0dXJvLiBBIHBlc2FyIGRlIHF1ZSByZXF1aWVyZW4gbcOhcyBkYXRvcyB5IG1heW9yIGNhcGFjaWRhZCBkZSBjw7NtcHV0bywgc3UgcmVuZGltaWVudG8gc3VlbGUgc2VyIHN1cGVyaW9yIGN1YW5kbyBzZSBkaXNwb25lIGRlIGluZm9ybWFjacOzbiBzdWZpY2llbnRlIHkgYmllbiBlc3RydWN0dXJhZGEuDQoNClBhcmEgZmFjaWxpdGFyIGVsIHVzbyBkZWwgbW9kZWxvIGRlc2Fycm9sbGFkbywgc2UgY29uc3RydXnDsyB1bmEgYXBsaWNhY2nDs24gd2ViIHF1ZSBwZXJtaXRlIGluZ3Jlc2FyIGxvcyBkYXRvcyByZWxldmFudGVzIGRlbCBzb2xpY2l0YW50ZSB5IG9idGVuZXIsIGVuIHRpZW1wbyByZWFsLCBsYSBwcmVkaWNjacOzbiBkZWwgbml2ZWwgZGUgcmllc2dvIGRlIGNyw6lkaXRvLiBFc3RhIGludGVyZmF6IGJ1c2NhIGRlbW9zdHJhciBjw7NtbyB1bmEgc29sdWNpw7NuIGJhc2FkYSBlbiBpbnRlbGlnZW5jaWEgYXJ0aWZpY2lhbCBwdWVkZSBpbnRlZ3JhcnNlIGbDoWNpbG1lbnRlIGVuIGVudG9ybm9zIHJlYWxlcywgYnJpbmRhbmRvIGFjY2VzaWJpbGlkYWQsIGF1dG9tYXRpemFjacOzbiB5IHNvcG9ydGUgYSBsYSB0b21hIGRlIGRlY2lzaW9uZXMuDQoNCjxhIG5hbWU9Iml1Mi4iPjwvYT4NCg0KIyBNZXRvZG9sb2fDrWENCg0KRWwgZGVzYXJyb2xsbyBkZWwgcHJveWVjdG8gc2UgZGl2aWRpw7MgZW4gdHJlcyBldGFwYXMgcHJpbmNpcGFsZXM6IGxpbXBpZXphIGRlIGRhdG9zIHkgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyAoRURBKSwgaW5nZW5pZXLDrWEgZGUgZmVhdHVyZXMgeSBtb2RlbGFkby4gQ2FkYSB1bmEgZGUgZXN0YXMgZmFzZXMgZnVlIGFib3JkYWRhIGRlIG1hbmVyYSBtb2R1bGFyIHBhcmEgZmFjaWxpdGFyIGxhIGNvbXByZW5zacOzbiB5IGVsIGRlc2Fycm9sbG8gaXRlcmF0aXZvIGRlbCBtb2RlbG8uDQoNClBhcmEgZWwgcHJvY2VzYW1pZW50byB5IGFuw6FsaXNpcywgc2UgdXRpbGl6YXJvbiBKdXB5dGVyIE5vdGVib29rcywgbG8gY3VhbCBwZXJtaXRpw7MgdW5hIGV4cGxvcmFjacOzbiBpbnRlcmFjdGl2YSBkZWwgZGF0YXNldC4gTm8gb2JzdGFudGUsIHNlIHJlY29ub2NlIHF1ZSBwYXJhIGVudG9ybm9zIGRlIHByb2R1Y2Npw7NuIHkgbWVqb3IgZXNjYWxhYmlsaWRhZCwgc2Vyw61hIHJlY29tZW5kYWJsZSBpbXBsZW1lbnRhciBlc3RvcyBwcm9jZXNvcyBjb21vIHBpcGVsaW5lcyBvcnF1ZXN0YWRvcyBjb24gaGVycmFtaWVudGFzIGNvbW8gQXBhY2hlIEFpcmZsb3cuDQoNCkVsIGRhdGFzZXQgdXRpbGl6YWRvIHByb3ZpZW5lIGRlIEthZ2dsZSB5IGVzdMOhIGRpc3BvbmlibGUgZW4gc3UgcmVzcGVjdGl2byBlbmxhY2UgKEthZ2dsZSwgcy5mLiwgQ3JlZGl0IFJpc2sgQW5hbHlzaXMpLg0KDQpEdXJhbnRlIGxhIGV0YXBhIGRlIGFuw6FsaXNpcyBleHBsb3JhdG9yaW8geSB2aXN1YWxpemFjacOzbiwgc2UgaGl6byB1c28gZGUgbGlicmVyw61hcyBjb21vIFNlYWJvcm4geSBNYXRwbG90bGliLCBtaWVudHJhcyBxdWUgcGFyYSBsYSBtYW5pcHVsYWNpw7NuIHkgdHJhbnNmb3JtYWNpw7NuIGRlIGxvcyBkYXRvcyBzZSBlbXBsZWFyb24gTnVtUHkgeSBQYW5kYXMuIEVsIHByZXByb2Nlc2FtaWVudG8geSBlbCBtb2RlbGFkbyBpbmljaWFsIHNlIHJlYWxpemFyb24gY29uIGhlcnJhbWllbnRhcyBkZSBTY2lraXQtbGVhcm4sIHkgcGFyYSBsYSBjb25zdHJ1Y2Npw7NuIGRlbCBtb2RlbG8gZGUgcmVkIG5ldXJvbmFsIHNlIHV0aWxpesOzIFB5VG9yY2gsIGxvIHF1ZSBwZXJtaXRpw7MgdW5hIG1heW9yIGZsZXhpYmlsaWRhZCBlbiBsYSBpbXBsZW1lbnRhY2nDs24gZGVsIG1vZGVsbyBkZSBkZWVwIGxlYXJuaW5nLg0KDQo8YSBuYW1lPSJpdTMuIj48L2E+DQoNCiMgRGVmaW5pY2nDs24gZGVsIHByb2JsZW1hDQoNCkVsIHJpZXNnbyBjcmVkaXRpY2lvIHNlIHB1ZWRlIGFib3JkYXIgY29tbyB1biBwcm9ibGVtYSBkZSBjbGFzaWZpY2FjacOzbiBiaW5hcmlhLCBlbiBlbCBxdWUgc2UgYnVzY2EgcHJlZGVjaXIgc2kgdW4gc29saWNpdGFudGUgZGUgY3LDqWRpdG8gcmVwcmVzZW50YSB1biByaWVzZ28gYWx0byBvIGJham8gZGUgaW5jdW1wbGltaWVudG8uIEVzdGEgdGFyZWEgZXMgZnVuZGFtZW50YWwgcGFyYSBpbnN0aXR1Y2lvbmVzIGZpbmFuY2llcmFzLCB5YSBxdWUgbGVzIHBlcm1pdGUgdG9tYXIgZGVjaXNpb25lcyBtw6FzIHNlZ3VyYXMgeSBlZmljaWVudGVzIGFsIG1vbWVudG8gZGUgb3RvcmdhciBwcsOpc3RhbW9zLg0KDQpFbCBvYmpldGl2byBwcmluY2lwYWwgZGUgbGEgc29sdWNpw7NuIGEgZXN0ZSBwcm9ibGVtYSBlcyBlbnRyZW5hciB1biBtb2RlbG8gYmFzYWRvIGVuIHJlZGVzIG5ldXJvbmFsZXMgcXVlIHNlYSBjYXBheiBkZSBhcHJlbmRlciBwYXRyb25lcyBhIHBhcnRpciBkZSBsb3MgZGF0b3MgaGlzdMOzcmljb3MgeSByZWFsaXphciBwcmVkaWNjaW9uZXMgcHJlY2lzYXMgc29icmUgZWwgcmllc2dvIGNyZWRpdGljaW8gZGUgbnVldm9zIHNvbGljaXRhbnRlcy4NCg0KUGFyYSBsb2dyYXJsbywgZXMgbmVjZXNhcmlvIGlkZW50aWZpY2FyIHkgc2VsZWNjaW9uYXIgbGFzIHZhcmlhYmxlcyBtw6FzIHJlbGV2YW50ZXMgZGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBkZSBtYW5lcmEgcXVlIGVsIG1vZGVsbyBwdWVkYSBjYXB0dXJhciBsYSBpbmZvcm1hY2nDs24gY3LDrXRpY2EgcXVlIGluZmx1eWUgZW4gZWwgY29tcG9ydGFtaWVudG8gZmluYW5jaWVybyBkZSBsb3MgaW5kaXZpZHVvcy4NCg0KRWwgcXXDqSB0YW4gYnVlbm8gc2VhIGVsIG1vZGVsbyBlc3RhcsOhIGRlZmluaWRvIHBvciBsYXMgc2lndWllbnRlcyBtw6l0cmljYXMgKEdlZWtzIGZvciBHZWVrcywgMjAyNSk6DQoNCi0gICAqKkFjY3VyYWN5OioqIFByb3BvcmNpw7NuIGRlIHByZWRpY2Npb25lcyBjb3JyZWN0YXMgc29icmUgZWwgdG90YWwgZGUgY2Fzb3MuDQoNCi0gICAqKlByZWNpc2lvbjoqKiBDYXNvcyBxdWUgZWwgbW9kZWxvIHByZWRpam8gY29tbyBhbHRvIHJpZXNnbyB5IHPDrSBsbyBlcmFuIHJlYWxtZW50ZSAodmVyZGFkZXJvcyBwb3NpdGl2b3MpLg0KDQotICAgKipSZWNhbGw6KiogVGFzYSBkZSB2ZXJkYWRlcm9zIHBvc2l0aXZvcywgZXMgZGVjaXIsIGxvcyBjYXNvcyBxdWUgZWwgbW9kZWxvIGRldGVjdMOzIGNvcnJlY3RhbWVudGUgZGUgdG9kb3MgbG9zIGNhc29zIGRlIGFsdG8gcmllc2dvLg0KDQotICAgKipGMS1zY29yZToqKiBNZWRpYSBhcm3Ds25pY2EgZW50cmUgcHJlY2lzaW9uIHkgcmVjYWxsLg0KDQotICAgKipBVUMtUk9DOioqIMOBcmVhIGJham8gbGEgY3VydmEgUk9DLiBFdmFsw7phIGxhIGNhcGFjaWRhZCBkZWwgbW9kZWxvIHBhcmEgZGlzdGluZ3VpciBlbnRyZSBjbGFzZXMuIE1pZW50cmFzIG3DoXMgY2VyY2FubyBhIDEgZXN0w6kgZXN0YSBtw6l0cmljYSwgbcOhcyBkaXNjcmltaW5hdGl2byBzZXLDoSBlbCBtb2RlbG8sIGxvIGN1YWwgZXMgbG8gaWRlYWwuDQoNCjxhIG5hbWU9Iml1NC4iPjwvYT4NCg0KIyBQYXJ0ZSAxLiBMaW1waWV6YSBkZSBEYXRvcyB5IEFuw6FsaXNpcyBFeHBsb3JhdG9yaW8gZGUgRGF0b3MNCg0KQSBjb250aW51YWNpw7NuIHNlIHByZXNlbnRhIHVuYSBzw61udGVzaXMgZGUgbG8gcmVhbGl6YWRvIGVuIGVsIHByb2Nlc28gZGUgbGltcGllemEgZGUgZGF0b3MgeSBhbsOhbGlzaXMgZXhwbG9yYXRvcmlvIGRlIGRhdG9zLiBUb2RvIGVsIGPDs2RpZ28gY29uIGxvcyBkZXRhbGxlcyBkZSBpbXBsZW1lbnRhY2nDs24gc2UgcHVlZGUgZW5jb250cmFyIGVuIGVsIGFyY2hpdm8gcG9jX0VEQS5pcHluYiBlbiBlbCByZXBvc2l0b3JpbyBkZWwgcHJveWVjdG8uDQoNCjxhIG5hbWU9Iml1NS4iPjwvYT4NCg0KIyMgMS4xIE9iamV0aXZvcw0KDQpBbnRlcyBkZSBjb21lbnphciBhIG1vZGVsYXIsIGVzIG5lY2VzYXJpbyBhc2VndXJhcnNlIGRlIHF1ZSBsb3MgZGF0b3MgZXN0w6FuIGxvIHN1ZmljaWVudGVtZW50ZSBwcm9jZXNhZG9zIHkgcHJlcGFyYWRvcyBwYXJhIHBvZGVyIGVudHJlbmFyIGVsIG1vZGVsbywgZGUgdGFsIGZvcm1hIHF1ZSBlc3RlIHB1ZWRhIGFsY2FuemFyIGxvcyBuaXZlbGVzIGRlc2VhZG9zIGVuIGxhcyBtw6l0cmljYXMgcHJldmlhbWVudGUgZGVmaW5pZGFzLg0KDQpBZGljaW9uYWxtZW50ZSwgc2UgZGViZSBlbnRlbmRlciBwcmltZXJvIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGp1bnRvIGNvbiBzdXMgcHJvcGllZGFkZXMgZXN0YWTDrXN0aWNhcyB0YW50byB1bml2YXJpYWRhcyBjb21vIG11bHRpdmFyaWFkYXMsIGNvbiBlbCBvYmpldGl2byBkZSBlbmNvbnRyYXIgcGF0cm9uZXMgbyByZWxhY2lvbmVzIHF1ZSBkZW4gcGlzdGFzIGRlIHF1w6kgZmFjdG9yZXMgcG9kcsOtYW4gZXN0YXIgbcOhcyByZWxhY2lvbmFkb3MgY29uIGxhIHByb2JhYmlsaWRhZCBkZSBjdW1wbGltaWVudG8gbyBpbmN1bXBsaW1pZW50byBkZWwgcGFnbyBkZWwgcHLDqXN0YW1vLg0KDQpBIG1hbmVyYSBkZSBzw61udGVzaXMsIHNlIHRpZW5lbiBsb3Mgc2lndWllbnRlcyBvYmpldGl2b3MgcGFyYSBsYSBsaW1waWV6YSBkZSBkYXRvcyB5IGVsIGFuw6FsaXNpcyBleHBsb3JhdG9yaW8gZGUgZGF0b3M6DQoNCi0gICBFbnRlbmRlciBsYSBlc3RydWN0dXJhIGdlbmVyYWwgZGVsIGRhdGFzZXQgeSBzdXMgY29sdW1uYXMsIHJlY29naWVuZG8gaW5mb3JtYWNpw7NuIGNvbW8gbGFzIGRpbWVuc2lvbmVzIGRlbCBkYXRhc2V0LCBzdXMgdGlwb3MgZGUgZGF0b3MgeSBjw7NtbyBzZSB2ZW4gbGFzIHByaW1lcmFzIHkgw7psdGltYXMgZmlsYXMgZGVsIGRhdGFzZXQuDQoNCi0gICBEZWZpbmlyIHVuIGNvbmp1bnRvIGRlIGNyaXRlcmlvcyBkZSBsaW1waWV6YSBkZSBkYXRvcyBwcmV2aW8gYWwgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZSBkYXRvcyBxdWUgcGVybWl0YSBldml0YXIgZGVzdsOtb3MgZGUgbG9zIHBhdHJvbmVzIHJlYWxtZW50ZSByZWxldmFudGVzIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KLSAgIFJlYWxpemFyIHVuYSBhZGVjdWFkYSBsaW1waWV6YSBkZSBsb3MgZGF0b3MgYSBwYXJ0aXIgZGUgbG9zIGNyaXRlcmlvcyBhbnRlcmlvcm1lbnRlIGRlZmluaWRvcy4NCg0KLSAgIFJlYWxpemFyIHVuIGFuw6FsaXNpcyB1bml2YXJpYWRvIHkgbXVsdGl2YXJpYWRvIGRlIGxhcyBjb2x1bW5hcyB0YW50byBudW3DqXJpY2FzIGNvbW8gbm8gbnVtw6lyaWNhcyBkZWwgZGF0YXNldCBwYXJhIHBvZGVyIGVudGVuZGVyIGRlIG1lam9yIG1hbmVyYSBsYXMgcHJvcGllZGFkZXMgZXN0YWTDrXN0aWNhcyBkZWwgbWlzbW8uDQoNCi0gICBEZXJpdmFyIGNvbmNsdXNpb25lcyByZWxldmFudGVzIGEgcGFydGlyIGRlIGNhZGEgYW7DoWxpc2lzIHJlYWxpemFkby4NCg0KLSAgIENvbnRhciBjb24gdW4gZGF0YXNldCBsbyBzdWZpY2llbnRlbWVudGUgbGltcGlvIGNvbW8gcGFyYSBwb2RlciBzZWd1aXIgY29uIHVuIHByb2Nlc28gZGUgaW5nZW5pZXLDrWEgZGUgZmVhdHVyZXMuDQoNCjxhIG5hbWU9Iml1Ni4iPjwvYT4NCg0KIyMgMS4yIEVzdHJ1Y3R1cmEgZGVsIGRhdGFzZXQNCg0KQW50ZXMgZGUgY29tZW56YXIgY29uIGxhIGxpbXBpZXphIGRlIGxvcyBkYXRvcywgc2UgZGViZSBlc3RhciBmYW1pbGlhcml6YWRvIGNvbiBlbCBwcm9waW8gZGF0YXNldC4gRXMgcG9yIGVzdG8gcXVlIHNlIHBhcnRlIGRlIHVuYSB2aXNpw7NuIGdlbmVyYWwsIHJldmlzYW5kbyBsYSBlc3RydWN0dXJhIGRlbCBkYXRhc2V0LCBwYXJhIGRlc3B1w6lzIGlyIGEgbG8gcGFydGljdWxhciwgcmV2aXNhbmRvIGNhZGEgY29sdW1uYS4NCg0KIyMjIDEuMi4xIE9yaWdlbiBkZWwgZGF0YXNldA0KDQpFbCBkYXRhc2V0IGEgdXRpbGl6YXIgc2UgcHVlZGUgZW5jb250cmFyIGVuIChLYWdnbGUsIHMuZi4sIENyZWRpdCBSaXNrIEFuYWx5c2lzKS4NCg0KIyMjIDEuMi4yIERpbWVuc2lvbmVzIGRlbCBkYXRhc2V0DQoNCkxhcyBkaW1lbnNpb25lcyBkZWwgZGF0YXNldCwgY2FsY3VsYWRhcyBhIHBhcnRpciBkZSBsYSBsZWN0dXJhIGRlbCBtaXNtbyBjb21vIHVuIERhdGFGcmFtZSBkZSBwYW5kYXMgKHZlciBjw7NkaWdvIGVuIHJlcG9zaXRvcmlvKSwgc29uIGxhcyBzaWd1aWVudGVzOg0KDQp8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18DQp8ICoqQ29sdW1uYXMqKiB8IDc0IGNvbHVtbmFzICB8DQp8ICoqRmlsYXMqKiAgICB8IDg4NzM3OSBmaWxhcyB8DQoNCioqVGFibGEgMS4qKiBEaW1lbnNpb25lcyBkZWwgZGF0YXNldCBjcnVkby4NCg0KRGUgbGEgVGFibGEgMSBzZSBwdWVkZSBldmlkZW5jaWFyIHF1ZSBzZSBlc3TDoSBsaWRpYW5kbyBjb24gdW4gZGF0YXNldCBkZSB0YW1hw7FvIHJlbGF0aXZhbWVudGUgZ3JhbmRlLCBsbyBjdWFsIGhheSBxdWUgY29uc2lkZXJhciBhIGxhIGhvcmEgZGUgcmVhbGl6YXIgbGEgbGltcGllemEgeSBlbCBtb2RlbGFkby4NCg0KQWxnbyBidWVubyBhIHJlc2FsdGFyIGVzIHF1ZSBzZSBjdWVudGEgY29uIHVuYSBidWVuYSBhYnVuZGFuY2lhIGRlIGRhdG9zIHBhcmEgcG9kZXIgZW50cmVuYXIgZWwgbW9kZWxvLCB5IHBvciBsbyB0YW50byBjb24gdW5hIGJ1ZW5hIGxpbXBpZXphIHkgcHJlcHJvY2VzYW1pZW50bywgc2UgY3JlZSBxdWUgc2UgcHVlZGVuIGFsY2FuemFyIHZhbG9yZXMgaWRlYWxlcyBwYXJhIGxhcyBtw6l0cmljYXMgZGVsIG1vZGVsbyB1bmEgdmV6IGVudHJlbmFkby4NCg0KIyMjIDEuMi4zIFByaW1lcmFzIHkgw7psdGltYXMgNSBmaWxhcyBkZWwgZGF0YXNldA0KDQpEZWJpZG8gYWwgZ3JhbiB0YW1hw7FvIGRlbCBkYXRhc2V0LCBzZSBjb21wbGljYSBsYSBleHBsb3JhY2nDs24gZGVsIG1pc21vIHBvciBlbCB1c28gZGUgaGVycmFtaWVudGFzIGRlIG9maW3DoXRpY2EgYsOhc2ljYXMgY29tbyBFeGNlbCBvIEdvb2dsZSBTaGVldHMuIEVzIHBvciBlc3RvIHF1ZSBzZSBvcHTDsyBwb3IgcmV2aXNhciBsYXMgcHJpbWVyYXMgeSDDumx0aW1hcyA1IGZpbGFzIGRlbCBkYXRhc2V0IHBvciBtZWRpbyBkZWwgdXNvIGRlIGxvcyBtw6l0b2RvcyBoZWFkKCkgeSB0YWlsKCkgZGUgcGFuZGFzLg0KDQpEZWJpZG8gYWwgZ3JhbiB0YW1hw7FvIGRlbCBkYXRhc2V0IG5vIGVzIHBvc2libGUgYWRqdW50YXIgbGFzIGZpbGFzIHkgY29sdW1uYXMgZW4gZXN0ZSByZXBvcnRlLiBTaW4gZW1iYXJnbywgc2UgcHVlZGUgcmV2aXNhciBlbCBhcmNoaXZvIHBvY19FREEuaXB5bmIgZW4gZWwgcmVwb3NpdG9yaW8gZGVsIHByb3llY3RvIHBhcmEgcmV2aXNhcmxhcy4NCg0KIyMjIDEuMi40IEluZm9ybWFjacOzbiBlc3RydWN0dXJhbCBnZW5lcmFsIGRlbCBkYXRhc2V0DQoNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IE5vbWJyZSBkZSBjb2x1bW5hICAgICAgICAgICB8IE7Dum1lcm8gZGUgdmFsb3JlcyBubyBudWxvcyB8IFRpcG8gZGUgZGF0byAgIHwNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT0rDQp8IGlkICAgICAgICAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgaW50NjQgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgbWVtYmVyX2lkICAgICAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBpbnQ2NCAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBsb2FuX2FtbnQgICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGZ1bmRlZF9hbW50ICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgZnVuZGVkX2FtbnRfaW52ICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCB0ZXJtICAgICAgICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGludF9yYXRlICAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgaW5zdGFsbG1lbnQgICAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBncmFkZSAgICAgICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHN1Yl9ncmFkZSAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgZW1wX3RpdGxlICAgICAgICAgICAgICAgICAgIHwgODM1OTE3ICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBlbXBfbGVuZ3RoICAgICAgICAgICAgICAgICAgfCA4NDI1NTQgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGhvbWVfb3duZXJzaGlwICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgYW5udWFsX2luYyAgICAgICAgICAgICAgICAgIHwgODg3Mzc1ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCB2ZXJpZmljYXRpb25fc3RhdHVzICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGlzc3VlX2QgICAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgbG9hbl9zdGF0dXMgICAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBweW1udF9wbGFuICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHVybCAgICAgICAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgZGVzYyAgICAgICAgICAgICAgICAgICAgICAgIHwgMTI2MDI2ICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBwdXJwb3NlICAgICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHRpdGxlICAgICAgICAgICAgICAgICAgICAgICB8IDg4NzIyNiAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgemlwX2NvZGUgICAgICAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBhZGRyX3N0YXRlICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGR0aSAgICAgICAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgZGVsaW5xXzJ5cnMgICAgICAgICAgICAgICAgIHwgODg3MzUwICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBlYXJsaWVzdF9jcl9saW5lICAgICAgICAgICAgfCA4ODczNTAgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGlucV9sYXN0XzZtdGhzICAgICAgICAgICAgICB8IDg4NzM1MCAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgbXRoc19zaW5jZV9sYXN0X2RlbGlucSAgICAgIHwgNDMzMDY3ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBtdGhzX3NpbmNlX2xhc3RfcmVjb3JkICAgICAgfCAxMzcwNTMgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IG9wZW5fYWNjICAgICAgICAgICAgICAgICAgICB8IDg4NzM1MCAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgcHViX3JlYyAgICAgICAgICAgICAgICAgICAgIHwgODg3MzUwICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCByZXZvbF9iYWwgICAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHJldm9sX3V0aWwgICAgICAgICAgICAgICAgICB8IDg4Njg3NyAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90YWxfYWNjICAgICAgICAgICAgICAgICAgIHwgODg3MzUwICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBpbml0aWFsX2xpc3Rfc3RhdHVzICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IG91dF9wcm5jcCAgICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgb3V0X3BybmNwX2ludiAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RhbF9weW1udCAgICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHRvdGFsX3B5bW50X2ludiAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90YWxfcmVjX3BybmNwICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RhbF9yZWNfaW50ICAgICAgICAgICAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHRvdGFsX3JlY19sYXRlX2ZlZSAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgcmVjb3ZlcmllcyAgICAgICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBjb2xsZWN0aW9uX3JlY292ZXJ5X2ZlZSAgICAgfCA4ODczNzkgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGxhc3RfcHltbnRfZCAgICAgICAgICAgICAgICB8IDg2OTcyMCAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgbGFzdF9weW1udF9hbW50ICAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBuZXh0X3B5bW50X2QgICAgICAgICAgICAgICAgfCA2MzQ0MDggICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGxhc3RfY3JlZGl0X3B1bGxfZCAgICAgICAgICB8IDg4NzMyNiAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgY29sbGVjdGlvbnNfMTJfbXRoc19leF9tZWQgIHwgODg3MjM0ICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBtdGhzX3NpbmNlX2xhc3RfbWFqb3JfZGVyb2cgfCAyMjE3MDMgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHBvbGljeV9jb2RlICAgICAgICAgICAgICAgICB8IDg4NzM3OSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgYXBwbGljYXRpb25fdHlwZSAgICAgICAgICAgIHwgODg3Mzc5ICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBhbm51YWxfaW5jX2pvaW50ICAgICAgICAgICAgfCA1MTEgICAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGR0aV9qb2ludCAgICAgICAgICAgICAgICAgICB8IDUwOSAgICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdmVyaWZpY2F0aW9uX3N0YXR1c19qb2ludCAgIHwgNTExICAgICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBhY2Nfbm93X2RlbGlucSAgICAgICAgICAgICAgfCA4ODczNTAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHRvdF9jb2xsX2FtdCAgICAgICAgICAgICAgICB8IDgxNzEwMyAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90X2N1cl9iYWwgICAgICAgICAgICAgICAgIHwgODE3MTAzICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBvcGVuX2FjY182bSAgICAgICAgICAgICAgICAgfCAyMTM3MiAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IG9wZW5faWxfNm0gICAgICAgICAgICAgICAgICB8IDIxMzcyICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgb3Blbl9pbF8xMm0gICAgICAgICAgICAgICAgIHwgMjEzNzIgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBvcGVuX2lsXzI0bSAgICAgICAgICAgICAgICAgfCAyMTM3MiAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IG10aHNfc2luY2VfcmNudF9pbCAgICAgICAgICB8IDIwODEwICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90YWxfYmFsX2lsICAgICAgICAgICAgICAgIHwgMjEzNzIgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBpbF91dGlsICAgICAgICAgICAgICAgICAgICAgfCAxODYxNyAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IG9wZW5fcnZfMTJtICAgICAgICAgICAgICAgICB8IDIxMzcyICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgb3Blbl9ydl8yNG0gICAgICAgICAgICAgICAgIHwgMjEzNzIgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBtYXhfYmFsX2JjICAgICAgICAgICAgICAgICAgfCAyMTM3MiAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IGFsbF91dGlsICAgICAgICAgICAgICAgICAgICB8IDIxMzcyICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90YWxfcmV2X2hpX2xpbSAgICAgICAgICAgIHwgODE3MTAzICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KfCBpbnFfZmkgICAgICAgICAgICAgICAgICAgICAgfCAyMTM3MiAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0NjQgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rDQp8IHRvdGFsX2N1X3RsICAgICAgICAgICAgICAgICB8IDIxMzcyICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsNCnwgaW5xX2xhc3RfMTJtICAgICAgICAgICAgICAgIHwgMjEzNzIgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKw0KDQoqKlRhYmxhIDIuKiogSW5mb3JtYWNpw7NuIGVzdHJ1Y3R1cmFsIGLDoXNpY2EgZGVsIGRhdGFzZXQgY3J1ZG8uDQoNClV0aWxpemFuZG8gZWwgbcOpdG9kbyBpbmZvKCkgZGUgbGEgbGliZXLDrWEgcGFuZGFzLCBzZSBwdWVkZSBnZW5lcmFyIGxhIGluZm9ybWFjacOzbiBkZSBsYSBpbmZvcm1hY2nDs24gZXN0cnVjdHVyYWwgZ2VuZXJhbCBkZWwgZGF0YXNldCBxdWUgY29udGllbmUgaW5mb3JtYWNpw7NuIGNvbW8gZWwgbsO6bWVybyBkZSBjb2x1bW5hcyB5IGVudHJhZGFzLCB2YWxvcmVzIG5vIG51bG9zIHBvciBjYWRhIGNvbHVtbmEgeSBlbCB0aXBvIGRlIGRhdG8gZGUgY2FkYSB1bmEuDQoNCiMjIyAxLjIuNSBDb25jbHVzaW9uZXMNCg0KQSBwYXJ0aXIgZGUgbG8gYW50ZXJpb3IsIHNlIGRlcml2YXJvbiBsYXMgc2lndWllbnRlcyBjb25jbHVzaW9uZXM6DQoNCi0gICBTZSBjdWVudGEgY29uIHVuIGRhdGFzZXQgcmVsYXRpdmFtZW50ZSBncmFuZGUsIGNvbiBhcHJveGltYWRhbWVudGUgODg3SyBmaWxhcyB5IDc0IGNvbHVtbmFzLiBTZSB0ZW5kcsOhIHF1ZSBoYWNlciB1biBhbsOhbGlzaXMgcmlndXJvc28gcGFyYSBwb2RlciBsaW1waWFyIGxvcyBkYXRvcyBhcHJvcGlhZGFtZW50ZS4NCg0KLSAgIFNlIGN1ZW50YSBjb24gZGF0b3MgdGFudG8gZGUgdGlwbyBudW3DqXJpY28gKGZsb2F0NjQgZSBpbnQ2NCkgY29tbyBubyBudW3DqXJpY28gKG9iamVjdCkuIFByb2JhYmxlbWVudGUgbG9zIGRlIHRpcG8gbm8gbnVtw6lyaWNvIHBlcnRlbmVjZW4gYSBjb2x1bW5hcyBkZSB0ZXh0byBwbGFubywgY2F0ZWfDs3JpY2FzIHkgb3JkaW5hbGVzLCBxdWUgc2UgdGVuZHLDoW4gcXVlIHRyYXRhciBtw6FzIGFkZWxhbnRlLg0KDQotICAgUHVlZGUgcXVlIGFsZ3Vub3MgdmFsb3JlcyBkZSBjb2x1bW5hcyBvYmplY3QgcGVydGVuZXpjYW4gYSBmZWNoYXMsIGxvcyBjdWFsZXMgc2UgYW5hbGl6YXLDoW4gbcOhcyBhZGVsYW50ZS4NCg0KLSAgIExhcyBjb2x1bW5hcyBkZSBpZGVudGlmaWNhY2nDs24gc2UgcG9kcsOhbiBlbGltaW5hciAoaWQgeSBtZW1iZXJfaWQpIGRlYmlkbyBhIHF1ZSBzb24gZGUgaWRlbnRpZmljYWNpw7NuIGRlIGNhZGEgZmlsYSB5IG5vIGltcGFjdGFyw6FuIGVuIGxhIHByb2JhYmlsaWRhZCBkZSBwYWdvLg0KDQo8YSBuYW1lPSJpdTcuIj48L2E+DQoNCiMjIDEuMyBMaW1waWV6YSBkZSBkYXRvcyBpbmljaWFsDQoNClVuYSB2ZXogbcOhcyBmYW1pbGlhcml6YWRvcyBjb24gbG9zIGRhdG9zLCBzZSBwcm9jZWRlcsOhIGEgZGVmaW5pciBjaWVydG9zIGNyaXRlcmlvcyBkZSBsaW1waWV6YSBnZW5lcmFsZXMgcGFyYSBpbXBsZW1lbnRhciBhbnRlcyBkZWwgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZSBkYXRvcy4NCg0KIyMjIDEuMy4xIENyaXRlcmlvcyBkZSBsaW1waWV6YQ0KDQpTZSBkZWZpbmVuIGxvcyBzaWd1aWVudGVzIGNyaXRlcmlvcyBkZSBsaW1waWV6YSBwcmV2aW8gYWwgYW7DoWxpc2lzIGNvbiBlbCBvYmpldGl2byBkZSBtaXRpZ2FyIGxhIGNhbnRpZGFkIGRlICJwaXN0YXMgZmFsc2FzIiBjb24gbGFzIHF1ZSBzZSBwb2Ryw61hIGVzdHJvcGVhciBlbCBlbnRlbmRpbWllbnRvIGRlbCBkYXRhc2V0Lg0KDQotICAgKipDcml0ZXJpbyAxOiBFbCBwb3JjZW50YWplIGRlIHZhbG9yZXMgbnVsbHMgbm8gZGViZSBzdXBlcmFyIGVsIDgwJToqKg0KDQogICAgQ29sdW1uYXMgcXVlIHRlbmdhbiBtw6FzIGRlbCA4MCUgZGUgc3VzIHZhbG9yZXMgbnVsb3Mgc2Vyw6FuIGRpZsOtY2lsZXMgZGUgaW1wdXRhciBtYXMgYWRlbGFudGUsIHkgcG9yIGxvIHRhbnRvIHNlIG9wdGFyw6EgcG9yIGVsaW1pbmFybGFzLg0KDQotICAgKipDcml0ZXJpbyAyOiBObyBzZSBkZWphcsOhbiBjb2x1bW5hcyBkZSB0ZXh0byBwbGFuby4gU2UgYWNlcHRhcsOhbiBjb2x1bW5hcyBjYXRlZ8OzcmljYXMgeSBvcmRpbmFsZXMgcXVlIGx1ZWdvIHNlIGNvZGlmaWNhcsOhbjoqKg0KDQogICAgQ29sdW1uYXMgcXVlIHNlYW4gZGUgdGV4dG8gcGxhbm8geSBubyBzaWdhbiBuaW5ndW5hIGVzdHJ1Y3R1cmEgZGVmaW5pZGEgcXVlIHBlcm1pdGFuIHRyYXRhcmxhcyBzZXLDoW4gZWxpbWluYWRhcyBkZWJpZG8gYSBsYSBkaWZpY3VsdGFkIHF1ZSBwb2Ryw61hbiB0cmFlciBhbCBtb21lbnRvIGRlIGNvZGlmaWNhcmxvcyBhIHZhbG9yZXMgbnVtw6lyaWNvcy4NCg0KLSAgICoqQ3JpdGVyaW8gMzogTm8gc2UgZGVqYXLDoW4gY29sdW1uYXMgZGUgaWRlbnRpZmljYWNpw7NuLCB5YSBxdWUgc29uIHBhcmEgaWRlbnRpZmljYXIgZmlsYXMgeSBlbnRpZGFkZXMgeSBubyBlc3TDoW4gcmVsYWNpb25hZG9zIGNvbiBuaW5nw7puIHBhdHLDs24gcmVsZXZhbnRlIHBhcmEgZWwgYW7DoWxpc2lzOioqDQoNCiAgICBDb2x1bW5hcyBxdWUgY29ycmVzcG9uZGFuIGEgZm9ybWFzIGRlIGlkZW50aWZpY2FjacOzbiBkZSBmaWxhcyBzZXLDoW4gZWxpbWluYWRhcyB5YSBxdWUgbm8gY29udHJpYnVpcsOhbiBhbCBhbsOhbGlzaXMuDQoNCi0gICAqKkNyaXRlcmlvIDQ6IFNlIGRlc2NhcnRhcsOhbiBjb2x1bW5hcyBxdWUgdGVuZ2FuIHNvbGFtZW50ZSB1biB2YWxvciDDum5pY286KioNCg0KICAgIFNlIGRlc2NhcnRhcsOhbiBjb2x1bW5hcyBxdWUgY29uc3RlbiBkZSBzb2xhbWVudGUgdW4gdmFsb3Igw7puaWNvIHBhcmEgZXZpdGFyIHJlZHVuZGFuY2lhcyBlbnRyZSBsb3MgZGF0b3MuDQoNCiMjIyAxLjMuMiBDdW1wbGltaWVudG8gZGUgY3JpdGVyaW8gMQ0KDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKk5vbWJyZSBkZSBDb2x1bW5hKiogICAgICAgfCAqKk7Dum1lcm8gZGUgdmFsb3JlcyBudWxvcyoqIHwgKipQb3JjZW50YWplIGRlIHZhbG9yZXMgbnVsb3MqKiB8DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PTorPT09PT09PT09PT09PT09PT09PT09PT09PT09PTorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT06Kw0KfCBkZXNjICAgICAgICAgICAgICAgICAgICAgICAgfCA3NjEzNTMgICAgICAgICAgICAgICAgICAgICAgfCA4NS43OTc5NTEgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IG10aHNfc2luY2VfbGFzdF9yZWNvcmQgICAgICB8IDc1MDMyNiAgICAgICAgICAgICAgICAgICAgICB8IDg0LjU1NTMwMyAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgbXRoc19zaW5jZV9sYXN0X21ham9yX2Rlcm9nIHwgNjY1Njc2ICAgICAgICAgICAgICAgICAgICAgIHwgNzUuMDE1OTc0ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBhbm51YWxfaW5jX2pvaW50ICAgICAgICAgICAgfCA4ODY4NjggICAgICAgICAgICAgICAgICAgICAgfCA5OS45NDI0MTUgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IGR0aV9qb2ludCAgICAgICAgICAgICAgICAgICB8IDg4Njg3MCAgICAgICAgICAgICAgICAgICAgICB8IDk5Ljk0MjY0MCAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgdmVyaWZpY2F0aW9uX3N0YXR1c19qb2ludCAgIHwgODg2ODY4ICAgICAgICAgICAgICAgICAgICAgIHwgOTkuOTQyNDE1ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBvcGVuX2FjY182bSAgICAgICAgICAgICAgICAgfCA4NjYwMDcgICAgICAgICAgICAgICAgICAgICAgfCA5Ny41OTE1NTkgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IG9wZW5faWxfNm0gICAgICAgICAgICAgICAgICB8IDg2NjAwNyAgICAgICAgICAgICAgICAgICAgICB8IDk3LjU5MTU1OSAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgb3Blbl9pbF8xMm0gICAgICAgICAgICAgICAgIHwgODY2MDA3ICAgICAgICAgICAgICAgICAgICAgIHwgOTcuNTkxNTU5ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBvcGVuX2lsXzI0bSAgICAgICAgICAgICAgICAgfCA4NjYwMDcgICAgICAgICAgICAgICAgICAgICAgfCA5Ny41OTE1NTkgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IG10aHNfc2luY2VfcmNudF9pbCAgICAgICAgICB8IDg2NjU2OSAgICAgICAgICAgICAgICAgICAgICB8IDk3LjY1NDg5MiAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgdG90YWxfYmFsX2lsICAgICAgICAgICAgICAgIHwgODY2MDA3ICAgICAgICAgICAgICAgICAgICAgIHwgOTcuNTkxNTU5ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBpbF91dGlsICAgICAgICAgICAgICAgICAgICAgfCA4Njg3NjIgICAgICAgICAgICAgICAgICAgICAgfCA5Ny45MDIwMjQgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IG9wZW5fcnZfMTJtICAgICAgICAgICAgICAgICB8IDg2NjAwNyAgICAgICAgICAgICAgICAgICAgICB8IDk3LjU5MTU1OSAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgb3Blbl9ydl8yNG0gICAgICAgICAgICAgICAgIHwgODY2MDA3ICAgICAgICAgICAgICAgICAgICAgIHwgOTcuNTkxNTU5ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBtYXhfYmFsX2JjICAgICAgICAgICAgICAgICAgfCA4NjYwMDcgICAgICAgICAgICAgICAgICAgICAgfCA5Ny41OTE1NTkgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IGFsbF91dGlsICAgICAgICAgICAgICAgICAgICB8IDg2NjAwNyAgICAgICAgICAgICAgICAgICAgICB8IDk3LjU5MTU1OSAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgaW5xX2ZpICAgICAgICAgICAgICAgICAgICAgIHwgODY2MDA3ICAgICAgICAgICAgICAgICAgICAgIHwgOTcuNTkxNTU5ICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RhbF9jdV90bCAgICAgICAgICAgICAgICAgfCA4NjYwMDcgICAgICAgICAgICAgICAgICAgICAgfCA5Ny41OTE1NTkgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IGlucV9sYXN0XzEybSAgICAgICAgICAgICAgICB8IDg2NjAwNyAgICAgICAgICAgICAgICAgICAgICB8IDk3LjU5MTU1OSAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCg0KKipUYWJsYSAzLioqIENvbHVtbmFzIHF1ZSB0aWVuZW4gbcOhcyBkZWwgODAlIGRlIHN1cyB2YWxvcmVzIGNvbW8gbnVsb3MuDQoNClBhcmEgY3VtcGxpciBlbCBjcml0ZXJpbyBkZWwgcG9yY2VudGFqZSBkZSB2YWxvcmVzIG51bGxzIHNlIGlkZW50aWZpY2Fyb24gbGFzIGNvbHVtbmFzIHF1ZSBzZSBtdWVzdHJhbiBlbiBsYSBUYWJsYSAzIHF1ZSB0aWVuZW4gdW4gcG9yY2VudGFqZSBkZSB2YWxvcmVzIG51bGxzIG1heW9yIGFsIDgwJS4NCg0KU2UgcHJvY2VkacOzIGEgZWxpbWluYXJsb3MsIHBhc2FuZG8gZGUgdGVuZXIgdW4gZGF0YXNldCBkZSA3NCBjb2x1bW5hcyBhIHVubyBkZSA1NSBjb2x1bW5hcy4NCg0KU2UgZmlsdHJhcm9uIGxhcyBjb2x1bW5hcyB1dGlsaXphbmRvIGxhcyBoZXJyYW1pZW50YXMgeSBsb3MgbcOpdG9kb3MgZGUgdHJhdGFtaWVuZG8gZGUgZGF0b3MgZGUgcGFuZGFzLg0KDQojIyMgMS4zLjMgQ3VtcGxpbWllbnRvIGRlIGNyaXRlcmlvIDINCg0KUGFyYSBlbCBjdW1wbGltaWVudG8gZGUgZXN0ZSBjcml0ZXJpbyBzZSB0dXZpZXJvbiBxdWUgc2VwYXJhciBsYXMgY29sdW1uYXMgbnVtw6lyaWNhcyBkZSBsYXMgbm8gbnVtw6lyaWNhcy4NCg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBOb21icmUgZGUgQ29sdW1uYSAgIHwgQWxndW5vcyBWYWxvcmVzIMOabmljb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCis9PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsNCnwgdGVybSAgICAgICAgICAgICAgICB8IFsnIDM2IG1vbnRocycgJyA2MCBtb250aHMnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgZ3JhZGUgICAgICAgICAgICAgICB8IFsnQicgJ0MnICdBJyAnRScgJ0YnICdEJyAnRyddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgc3ViX2dyYWRlICAgICAgICAgICB8IFsnQjInICdDNCcgJ0M1JyAnQzEnICdCNScgJ0E0JyAnRTEnICdGMicgJ0MzJyAnQjEnICdEMScgJ0ExJyAnQjMnICdCNCcgJ0MyJyAnRDInICdBMycgJ0E1JyAnRDUnICdBMiddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgZW1wX3RpdGxlICAgICAgICAgICB8IFtuYW4gJ1J5ZGVyJyAnQUlSIFJFU09VUkNFUyBCT0FSRCcgJ1VuaXZlcnNpdHkgTWVkaWNhbCBHcm91cCcgJ1Zlb2xpYSBUcmFuc3BvcnRhdG9uJyAnU291dGhlcm4gU3RhciBQaG90b2dyYXBoeScgJ01LQyBBY2NvdW50aW5nICcgJ1N0YXJidWNrcycgJ1NvdXRod2VzdCBSdXJhbCBtZXRybycgJ1VDTEEnICdWYS4gRGVwdCBvZiBDb25zZXJ2YXRpb24vUmVjcmVhdGlvbicgJ1RhcmdldCcgJ1NGTVRBJyAnSW50ZXJuYWwgcmV2ZW51ZSBTZXJ2aWNlJyAiQ2hpbidzIFJlc3RhdXJhbnQiICdEdXJhY2VsbCcgJ0Nvbm5lY3Rpb24gSW5zcGVjdGlvbicgJ05ldHdvcmsgSW50ZXJwcmV0aW5nIFNlcnZpY2UnICdBcmNoZGlvY2VzZSBvZiBHYWx2ZXN0b24gSG91c3RvbicgJ09zcmFtIFN5bHZhbmlhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgZW1wX2xlbmd0aCAgICAgICAgICB8IFsnMTArIHllYXJzJyAnXDwgMSB5ZWFyJyAnMSB5ZWFyJyAnMyB5ZWFycycgJzggeWVhcnMnICc5IHllYXJzJyAnNCB5ZWFycycgJzUgeWVhcnMnICc2IHllYXJzJyAnMiB5ZWFycycgJzcgeWVhcnMnIG5hbl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgaG9tZV9vd25lcnNoaXAgICAgICB8IFsnUkVOVCcgJ09XTicgJ01PUlRHQUdFJyAnT1RIRVInICdOT05FJyAnQU5ZJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgdmVyaWZpY2F0aW9uX3N0YXR1cyB8IFsnVmVyaWZpZWQnICdTb3VyY2UgVmVyaWZpZWQnICdOb3QgVmVyaWZpZWQnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgaXNzdWVfZCAgICAgICAgICAgICB8IFsnRGVjLTIwMTEnICdOb3YtMjAxMScgJ09jdC0yMDExJyAnU2VwLTIwMTEnICdBdWctMjAxMScgJ0p1bC0yMDExJyAnSnVuLTIwMTEnICdNYXktMjAxMScgJ0Fwci0yMDExJyAnTWFyLTIwMTEnICdGZWItMjAxMScgJ0phbi0yMDExJyAnRGVjLTIwMTAnICdOb3YtMjAxMCcgJ09jdC0yMDEwJyAnU2VwLTIwMTAnICdBdWctMjAxMCcgJ0p1bC0yMDEwJyAnSnVuLTIwMTAnICdNYXktMjAxMCddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgbG9hbl9zdGF0dXMgICAgICAgICB8IFsnRnVsbHkgUGFpZCcgJ0NoYXJnZWQgT2ZmJyAnQ3VycmVudCcgJ0RlZmF1bHQnICdMYXRlICgzMS0xMjAgZGF5cyknICdJbiBHcmFjZSBQZXJpb2QnICdMYXRlICgxNi0zMCBkYXlzKScgJ0RvZXMgbm90IG1lZXQgdGhlIGNyZWRpdCBwb2xpY3kuIFN0YXR1czpGdWxseSBQYWlkJyAnRG9lcyBub3QgbWVldCB0aGUgY3JlZGl0IHBvbGljeS4gU3RhdHVzOkNoYXJnZWQgT2ZmJyAnSXNzdWVkJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgcHltbnRfcGxhbiAgICAgICAgICB8IFsnbicgJ3knXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgdXJsICAgICAgICAgICAgICAgICB8IFsnPGh0dHBzOi8vd3d3LmxlbmRpbmdjbHViLmNvbS9icm93c2UvbG9hbkRldGFpbC5hY3Rpb24/bG9hbl9pZD0xMDc3NTAxPicgJzxodHRwczovL3d3dy5sZW5kaW5nY2x1Yi5jb20vYnJvd3NlL2xvYW5EZXRhaWwuYWN0aW9uP2xvYW5faWQ9MTA3NzQzMD4nICc8aHR0cHM6Ly93d3cubGVuZGluZ2NsdWIuY29tL2Jyb3dzZS9sb2FuRGV0YWlsLmFjdGlvbj9sb2FuX2lkPTEwNzcxNzU+JyAnPGh0dHBzOi8vd3d3LmxlbmRpbmdjbHViLmNvbS9icm93c2UvbG9hbkRldGFpbC5hY3Rpb24/bG9hbl9pZD0xMDY1Nzc1PicgJzxodHRwczovL3d3dy5sZW5kaW5nY2x1Yi5jb20vYnJvd3NlL2xvYW5EZXRhaWwuYWN0aW9uP2xvYW5faWQ9MTA2OTk3MT4nICc8aHR0cHM6Ly93d3cubGVuZGluZ2NsdWIuY29tL2Jyb3dzZS9sb2FuRGV0YWlsLmFjdGlvbj9sb2FuX2lkPTEwNjI0NzQ+JyAnPGh0dHBzOi8vd3d3LmxlbmRpbmdjbHViLmNvbS9icm93c2UvbG9hbkRldGFpbC5hY3Rpb24/bG9hbl9pZD0xMDY5NzQyPiddIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgcHVycG9zZSAgICAgICAgICAgICB8IFsnY3JlZGl0X2NhcmQnICdjYXInICdzbWFsbF9idXNpbmVzcycgJ290aGVyJyAnd2VkZGluZycgJ2RlYnRfY29uc29saWRhdGlvbicgJ2hvbWVfaW1wcm92ZW1lbnQnICdtYWpvcl9wdXJjaGFzZScgJ21lZGljYWwnICdtb3ZpbmcnICd2YWNhdGlvbicgJ2hvdXNlJyAncmVuZXdhYmxlX2VuZXJneScgJ2VkdWNhdGlvbmFsJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgdGl0bGUgICAgICAgICAgICAgICB8IFsnQ29tcHV0ZXInICdiaWtlJyAncmVhbCBlc3RhdGUgYnVzaW5lc3MnICdwZXJzb25lbCcgJ1BlcnNvbmFsJyAnTXkgd2VkZGluZyBsb2FuIEkgcHJvbWlzZSB0byBwYXkgYmFjaycgJ0xvYW4nICdDYXIgRG93bnBheW1lbnQnICdFeHBhbmQgQnVzaW5lc3MgJiBCdXkgRGVidCBQb3J0Zm9saW8nICdCdWlsZGluZyBteSBjcmVkaXQgaGlzdG9yeS4nICdIaWdoIGludHJlc3QgQ29uc29saWRhdGlvbicgJ0NvbnNvbGlkYXRpb24nICdmcmVlZG9tJyAnY2l0aWNhcmQgZnVuZCcgJ090aGVyIExvYW4nICdEZWJ0IENvbnNvbGlkYXRpb24gTG9hbicgJ0hvbWUnICdIb2xpZGF5JyAnTWVkaWNhbCcgJ2xvd2VycmF0ZW1lYW5zZWFzaWVydG9nZXRvdXRvZmRlYnQhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgemlwX2NvZGUgICAgICAgICAgICB8IFsnODYweHgnICczMDl4eCcgJzYwNnh4JyAnOTE3eHgnICc5NzJ4eCcgJzg1Mnh4JyAnMjgweHgnICc5MDB4eCcgJzk1OHh4JyAnNzc0eHgnICc4NTN4eCcgJzkxM3h4JyAnMjQ1eHgnICc5NTF4eCcgJzY0MXh4JyAnOTIxeHgnICcwNjd4eCcgJzg5MHh4JyAnNzcweHgnICczMzV4eCddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgYWRkcl9zdGF0ZSAgICAgICAgICB8IFsnQVonICdHQScgJ0lMJyAnQ0EnICdPUicgJ05DJyAnVFgnICdWQScgJ01PJyAnQ1QnICdVVCcgJ0ZMJyAnTlknICdQQScgJ01OJyAnTkonICdLWScgJ09IJyAnU0MnICdSSSddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgZWFybGllc3RfY3JfbGluZSAgICB8IFsnSmFuLTE5ODUnICdBcHItMTk5OScgJ05vdi0yMDAxJyAnRmViLTE5OTYnICdKYW4tMTk5NicgJ05vdi0yMDA0JyAnSnVsLTIwMDUnICdKYW4tMjAwNycgJ0Fwci0yMDA0JyAnU2VwLTIwMDQnICdKYW4tMTk5OCcgJ09jdC0xOTg5JyAnSnVsLTIwMDMnICdNYXktMTk5MScgJ1NlcC0yMDA3JyAnT2N0LTE5OTgnICdBdWctMTk5MycgJ09jdC0yMDAzJyAnSmFuLTIwMDEnICdOb3YtMTk5NyddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgaW5pdGlhbF9saXN0X3N0YXR1cyB8IFsnZicgJ3cnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgbGFzdF9weW1udF9kICAgICAgICB8IFsnSmFuLTIwMTUnICdBcHItMjAxMycgJ0p1bi0yMDE0JyAnSmFuLTIwMTYnICdBcHItMjAxMicgJ05vdi0yMDEyJyAnSnVuLTIwMTMnICdTZXAtMjAxMycgJ0p1bC0yMDEyJyAnT2N0LTIwMTMnICdNYXktMjAxMycgJ0ZlYi0yMDE1JyAnQXVnLTIwMTUnICdPY3QtMjAxMicgJ1NlcC0yMDEyJyBuYW4gJ0RlYy0yMDEyJyAnRGVjLTIwMTQnICdBdWctMjAxMycgJ05vdi0yMDEzJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgbmV4dF9weW1udF9kICAgICAgICB8IFtuYW4gJ0ZlYi0yMDE2JyAnSmFuLTIwMTYnICdTZXAtMjAxMycgJ0ZlYi0yMDE0JyAnTWF5LTIwMTQnICdKdW4tMjAxMycgJ01hci0yMDEyJyAnQXByLTIwMTInICdNYXktMjAxMycgJ0F1Zy0yMDEyJyAnQXVnLTIwMTMnICdKdW4tMjAxMicgJ05vdi0yMDEzJyAnRmViLTIwMTInICdPY3QtMjAxMScgJ0phbi0yMDEzJyAnSmFuLTIwMTQnICdKdWwtMjAxMycgJ0p1bC0yMDE1J10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgbGFzdF9jcmVkaXRfcHVsbF9kICB8IFsnSmFuLTIwMTYnICdTZXAtMjAxMycgJ0phbi0yMDE1JyAnU2VwLTIwMTUnICdEZWMtMjAxNCcgJ0F1Zy0yMDEyJyAnTWFyLTIwMTMnICdEZWMtMjAxNScgJ0F1Zy0yMDEzJyAnTm92LTIwMTInICdNYXItMjAxNCcgJ0Fwci0yMDE1JyAnTWF5LTIwMTQnICdKdWwtMjAxNScgJ0p1bC0yMDEyJyAnU2VwLTIwMTInICdNYXktMjAxMycgJ09jdC0yMDE1JyAnSnVuLTIwMTInICdNYXItMjAxNSddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgYXBwbGljYXRpb25fdHlwZSAgICB8IFsnSU5ESVZJRFVBTCcgJ0pPSU5UJ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCg0KKipUYWJsYSA0LioqIENvbHVtbmFzIG5vIG51bcOpcmljYXMganVudG8gY29uIGFsZ3Vub3MgZGUgc3VzIHZhbG9yZXMgw7puaWNvcw0KDQpTZSByZXZpc2Fyb24gbGFzIGNvbHVtbmFzIGRlIHRpcG8gb2JqZWN0IChtb3N0cmFkYXMgZW4gbGEgVGFibGEgNCB5IHNlIHJldmlzYXJvbiBzdXMgdmFsb3JlcyDDum5pY29zIHBhcmEgdmVyaWZpY2FyIGN1w6FsZXMgZXJhbiBkZSB0ZXh0byBwbGFubyBwYXJhIHBvZGVyIGVsaW1pbmFybGFzLg0KDQpEZSBsbyBhbnRlcmlvciwgc2UgY29uY2x1ecOzIHF1ZSBsYXMgY29sdW1uYXMgZGUgdGV4dG8gcGxhbm8gZXJhbiBsYXMgc2lndWllbnRlczogZW1wX3RpdGxlLCB0aXRsZSB5IHVybC4gU2UgcHJvY2VkacOzIGNvbiBzdSBlbGltaW5hY2nDs24sIHBhc2FuZG8gZGUgdGVuZXIgNTUgY29sdW1uYXMgYSB0ZW5lciA1Mi4NCg0KIyMjIDEuMy40IEN1bXBsaW1pZW50byBkZSBjcml0ZXJpbyAzDQoNCkRlbCBwcm9waW8gbm9tYnJlIGRlIGxhcyBjb2x1bW5hcyBpZCB5IG1lbWJlcl9pZCB5IGRlbCBkaWNjaW9uYXJpbyBkZSBkYXRvcyBxdWUgdmlubyBjb24gZWwgZGF0YXNldCwgc2UgY29uY2x1eWUgcXVlIGVzdGFzIGRvcyBjb2x1bW5hcyBzb24gZGUgaWRlbnRpZmljYWNpw7NuIHkgc2UgcHJvY2VkZSBhIGVsaW1pbmFybGFzIHBhcmEgY3VtcGxpciBlbCBjcml0ZXJpbyAzLg0KDQpUcmFzIGxhIGVsaW1pbmFjacOzbiwgc2UgcGFzYSBkZSA1MiBjb2x1bW5hcyBhIDUwIGNvbHVtbmFzLg0KDQojIyMgMS4zLjUgQ3VtcGxpbWllbnRvIGRlIGNyaXRlcmlvIDQNCg0KVHJhcyBleGFtaW5hciBsb3MgdmFsb3JlcyDDum5pY29zIGRlIGxhcyBjb2x1bW5hcyBudW3DqXJpY2FzLCBzZSBpZGVudGlmaWPDsyBxdWUgbGEgY29sdW1uYSBwb2xpY3lfY29kZSBzb2xhbWVudGUgdGVuw61hIDEgc29sbyB2YWxvciBwYXJhIGNhZGEgZmlsYSBkZSBsYXMgY29sdW1uYXMsIHkgcG9yIGVzbyBzZSBwcm9jZWRpw7MgY29uIHN1IGVsaW1pbmFjacOzbiwgcGFzYW5kbyBkZSB0ZW5lciA1MCBjb2x1bW5hcyBhIDQ5IGNvbHVtbmFzLg0KDQojIyMgMS4zLjYgQ29uY2x1c2lvbmVzDQoNCkEgcGFydGlyIGRlIGxvIGFudGVyaW9yLCBzZSBkZXJpdmFyb24gbGFzIHNpZ3VpZW50ZXMgY29uY2x1c2lvbmVzOg0KDQotICAgU2UgZWxpbWluYXJvbiBjb2x1bW5hcyBjb24gbcOhcyBkZWwgODAlIGRlIHZhbG9yZXMgbnVsb3MsIGxvIHF1ZSBwZXJtaXRpw7MgcmVkdWNpciBzaWduaWZpY2F0aXZhbWVudGUgbGEgY2FudGlkYWQgZGUgcnVpZG8geSB2YWxvcmVzIGZhbHRhbnRlcyBkaWbDrWNpbGVzIGRlIGltcHV0YXIuDQoNCi0gICBTZSBkZXNjYXJ0YXJvbiBjb2x1bW5hcyBkZSB0ZXh0byBwbGFubyBxdWUgbm8gYXBvcnRhYmFuIGVzdHJ1Y3R1cmEgw7p0aWwgcGFyYSBlbCBtb2RlbGFkbywgbG8gcXVlIGZhY2lsaXTDsyBsYSBmdXR1cmEgY29kaWZpY2FjacOzbiBkZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzLg0KDQotICAgU2UgZWxpbWluYXJvbiBjb2x1bW5hcyBkZSBpZGVudGlmaWNhY2nDs24geSBhcXVlbGxhcyBjb24gdW4gw7puaWNvIHZhbG9yLCB5YSBxdWUgbm8gYXBvcnRhYmFuIGluZm9ybWFjacOzbiByZWxldmFudGUgYWwgYW7DoWxpc2lzLg0KDQotICAgVHJhcyBhcGxpY2FyIHRvZG9zIGxvcyBjcml0ZXJpb3MgZGUgbGltcGllemEgZGVmaW5pZG9zLCBzZSBwYXPDsyBkZSB1biB0b3RhbCBkZSA3NCBjb2x1bW5hcyBhIDQ5LCBkZWphbmRvIHVuIGNvbmp1bnRvIGRlIGRhdG9zIG3DoXMgbGltcGlvLCBtYW5lamFibGUgeSBhZGVjdWFkbyBwYXJhIGVsIGFuw6FsaXNpcyB5IG1vZGVsYWRvIHBvc3Rlcmlvci4NCg0KPGEgbmFtZT0iaXU4LiI+PC9hPg0KDQojIyAxLjQgQW7DoWxpc2lzIGV4cGxvcmF0b3JpbyB1bml2YXJpYWRvIGRlIGNvbHVtbmFzIG51bcOpcmljYXMNCg0KVXRpbGl6YW5kbyBlc3RlIG51ZXZvIGRhdGFzZXQgcHJvY2VzYWRvLCBzZSBwZXJtaXRlIHByb2NlZGVyIGNvbiBlbCBhbsOhbGlzaXMgZXhwbG9yYXRvcmlvIGRlIGxvcyBkYXRvcy4gU2UgY29tZW56w7MgcG9yIGVsIGFuw6FsaXNpcyB1bml2YXJpYWRvIGRlIGxhcyBjb2x1bW5hcyBudW3DqXJpY2FzLg0KDQojIyMgMS40LjEgRXN0YWTDrXN0aWNhcyBkZXNjcmlwdGl2YXMNCg0KfCBOb21icmUgY29sICAgICAgICAgICAgICAgICAgfCBNZWRpYSAgICAgICAgfCBTdGQgICAgICAgICAgfCBNaW4gICAgICAgICAgfCAyNSUgICAgICAgICAgfCA1MCUgICAgICAgICAgfCA3NSUgICAgICAgICAgfCBNYXggICAgICAgICAgfCBTa2V3bmVzcyAgICAgfCBLdXJ0b3NpcyAgICAgIHwNCnwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwNCnwgbG9hbl9hbW50ICAgICAgICAgICAgICAgICAgIHwgMTQ3NTUuMjY0NjA1IHwgODQzNS40NTU2MDEgIHwgNTAwLjAwMDAwMCAgIHwgODAwMC4wMDAwMDAgIHwgMTMwMDAuMDAwMDAwIHwgMjAwMDAuMDAwMDAwIHwgMzUwMDAuMDAwMDAwIHwgMC42ODE2ODMgICAgIHwgLTAuMjU2NzE1ICAgICB8DQp8IGZ1bmRlZF9hbW50ICAgICAgICAgICAgICAgICB8IDE0NzQxLjg3NzYyNSB8IDg0MjkuODk3NjU3ICB8IDUwMC4wMDAwMDAgICB8IDgwMDAuMDAwMDAwICB8IDEzMDAwLjAwMDAwMCB8IDIwMDAwLjAwMDAwMCB8IDM1MDAwLjAwMDAwMCB8IDAuNjgzNzQ1ICAgICB8IC0wLjI1MTYzOCAgICAgfA0KfCBmdW5kZWRfYW1udF9pbnYgICAgICAgICAgICAgfCAxNDcwMi40NjQzODMgfCA4NDQyLjEwNjczMiAgfCAwLjAwMDAwMCAgICAgfCA4MDAwLjAwMDAwMCAgfCAxMzAwMC4wMDAwMDAgfCAyMDAwMC4wMDAwMDAgfCAzNTAwMC4wMDAwMDAgfCAwLjY4MDk4MyAgICAgfCAtMC4yNTE3NjUgICAgIHwNCnwgaW50X3JhdGUgICAgICAgICAgICAgICAgICAgIHwgMTMuMjQ2NzQwICAgIHwgNC4zODE4NjcgICAgIHwgNS4zMjAwMDAgICAgIHwgOS45OTAwMDAgICAgIHwgMTIuOTkwMDAwICAgIHwgMTYuMjAwMDAwICAgIHwgMjguOTkwMDAwICAgIHwgMC40Mjk0ODEgICAgIHwgLTAuMTU1MzYyICAgICB8DQp8IGluc3RhbGxtZW50ICAgICAgICAgICAgICAgICB8IDQzNi43MTcxMjcgICB8IDI0NC4xODY1OTMgICB8IDE1LjY3MDAwMCAgICB8IDI2MC43MDUwMDAgICB8IDM4Mi41NTAwMDAgICB8IDU3Mi42MDAwMDAgICB8IDE0NDUuNDYwMDAwICB8IDAuOTM2OTUyICAgICB8IDAuNjg1OTcwICAgICAgfA0KfCBhbm51YWxfaW5jICAgICAgICAgICAgICAgICAgfCA3LjUwMjc1OWUrMDQgfCA2LjQ2OTgzMGUrMDQgfCAwLjAwMDAwMGUrMDAgfCA0LjUwMDAwMGUrMDQgfCA2LjUwMDAwMGUrMDQgfCA5LjAwMDAwMGUrMDQgfCA5LjUwMDAwMGUrMDYgfCA0LjQ0Nzg0OWUrMDEgfCA0LjgwODE5MmUrMDMgIHwNCnwgZHRpICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTguMTU3MDM5ICAgIHwgMTcuMTkwNjI2ICAgIHwgMC4wMDAwMDAgICAgIHwgMTEuOTEwMDAwICAgIHwgMTcuNjUwMDAwICAgIHwgMjMuOTUwMDAwICAgIHwgOTk5OS4wMDAwMDAgIHwgNDQxLjQ4Njc3NSAgIHwgMjU2MTI2Ljg2Mjk0MSB8DQp8IGRlbGlucV8yeXJzICAgICAgICAgICAgICAgICB8IDAuMzE0NDQyICAgICB8IDAuODYyMjQ0ICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDM5LjAwMDAwMCAgICB8IDUuNDczNzk2ICAgICB8IDU3LjMwOTA4MSAgICAgfA0KfCBpbnFfbGFzdF82bXRocyAgICAgICAgICAgICAgfCAwLjY5NDYyMyAgICAgfCAwLjk5ODQ0OCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAxLjAwMDAwMCAgICAgfCAzMy4wMDAwMDAgICAgfCAyLjEwODQxMSAgICAgfCAxMS45MjUxMDMgICAgIHwNCnwgbXRoc19zaW5jZV9sYXN0X2RlbGlucSAgICAgIHwgMzQuMDYzNzk4ICAgIHwgMjEuODg0OTQwICAgIHwgMC4wMDAwMDAgICAgIHwgMTUuMDAwMDAwICAgIHwgMzEuMDAwMDAwICAgIHwgNTAuMDAwMDAwICAgIHwgMTg4LjAwMDAwMCAgIHwgMC40NTU1MjAgICAgIHwgLTAuNzY3MzE0ICAgICB8DQp8IG9wZW5fYWNjICAgICAgICAgICAgICAgICAgICB8IDExLjU0ODQ2OSAgICB8IDUuMzE3MzEzICAgICB8IDAuMDAwMDAwICAgICB8IDguMDAwMDAwICAgICB8IDExLjAwMDAwMCAgICB8IDE0LjAwMDAwMCAgICB8IDkwLjAwMDAwMCAgICB8IDEuMjQ5MzgwICAgICB8IDMuMTAzOTk0ICAgICAgfA0KfCBwdWJfcmVjICAgICAgICAgICAgICAgICAgICAgfCAwLjE5NTMwNyAgICAgfCAwLjU4MjA5MSAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCA4Ni4wMDAwMDAgICAgfCAxMy4yNjE5NDEgICAgfCA5OTMuMTk5MDA4ICAgIHwNCnwgcmV2b2xfYmFsICAgICAgICAgICAgICAgICAgIHwgMS42OTIwNzllKzA0IHwgMi4yNDI2NzllKzA0IHwgMC4wMDAwMDAgICAgIHwgNi40NDMwMDBlKzAzIHwgMS4xODc1MDBlKzA0IHwgMi4wODI5MDBlKzA0IHwgMi45MDQ4MzZlKzA2IHwgMS41OTQ5MzBlKzAxIHwgOS44NTg5MDhlKzAyICB8DQp8IHJldm9sX3V0aWwgICAgICAgICAgICAgICAgICB8IDU1LjA2NzY5MyAgICB8IDIzLjgzNDM0NCAgICB8IDAuMDAwMDAwICAgICB8IDM3LjcwMDAwMCAgICB8IDU2LjAwMDAwMCAgICB8IDczLjYwMDAwMCAgICB8IDg5Mi4zMDAwMDAgICB8IC0wLjEyMzg2OSAgICB8IDEuMDI3MjY5ICAgICAgfA0KfCB0b3RhbF9hY2MgICAgICAgICAgICAgICAgICAgfCAyNS4yNjgwMjYgICAgfCAxMS44NDA1NjEgICAgfCAwLjAwMDAwMCAgICAgfCAxNy4wMDAwMDAgICAgfCAyNC4wMDAwMDAgICAgfCAzMi4wMDAwMDAgICAgfCAxNjkuMDAwMDAwICAgfCAwLjg5MjUzOSAgICAgfCAxLjM3NzU4OSAgICAgIHwNCnwgb3V0X3BybmNwICAgICAgICAgICAgICAgICAgIHwgODQwMy4xMjQ4NTIgIHwgODQ5My40NTAyNjkgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgNjQ1OC4yOTAwMDAgIHwgMTM2NTkuMDU1MDAwIHwgNDkzNzIuODYwMDAwIHwgMC45MzIwMTggICAgIHwgMC4xMjI2MjEgICAgICB8DQp8IG91dF9wcm5jcF9pbnYgICAgICAgICAgICAgICB8IDgzOTkuNzEzMjQyICB8IDg0ODkuOTk3NjE3ICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDY0NTUuODEwMDAwICB8IDEzNjU0LjA1MDAwMCB8IDQ5MzcyLjg2MDAwMCB8IDAuOTMxODY4ICAgICB8IDAuMTIxODI3ICAgICAgfA0KfCB0b3RhbF9weW1udCAgICAgICAgICAgICAgICAgfCA3NTU4LjgyNjY4NCAgfCA3ODcxLjI0MzMzNiAgfCAwLjAwMDAwMCAgICAgfCAxOTE0LjU5MDAwMCAgfCA0ODk0Ljk5OTExNyAgfCAxMDYxNi44MTQyMzEgfCA1Nzc3Ny41Nzk4NzAgfCAxLjc4ODg5NCAgICAgfCAzLjYyMDEyMCAgICAgIHwNCnwgdG90YWxfcHltbnRfaW52ICAgICAgICAgICAgIHwgNzUyMS4xNjAzMDYgIHwgNzg0Ni4xMDg2MDQgIHwgMC4wMDAwMDAgICAgIHwgMTg5OS43MDAwMDAgIHwgNDg2Mi4wMTAwMDAgIHwgMTA1NjUuNjkwMDAwIHwgNTc3NzcuNTgwMDAwIHwgMS43OTM4MzIgICAgIHwgMy42NDE5ODEgICAgICB8DQp8IHRvdGFsX3JlY19wcm5jcCAgICAgICAgICAgICB8IDU3NTcuNzA2NDI0ICB8IDY2MjUuNDQxMDQ2ICB8IDAuMDAwMDAwICAgICB8IDEyMDAuNTcwMDAwICB8IDMyMTUuMzIwMDAwICB8IDgwMDAuMDAwMDAwICB8IDM1MDAwLjAzMDAwMCB8IDEuOTM1MDM2ICAgICB8IDMuOTg5MDQ2ICAgICAgfA0KfCB0b3RhbF9yZWNfaW50ICAgICAgICAgICAgICAgfCAxNzU0LjgwNDMyNyAgfCAyMDk1LjM1NjA5OSAgfCAwLjAwMDAwMCAgICAgfCA0NDEuNDYwMDAwICAgfCAxMDczLjI4MDAwMCAgfCAyMjM4LjI2NTAwMCAgfCAyNDIwNS42MjAwMDAgfCAyLjgyNjEwMCAgICAgfCAxMS41NDM1OTggICAgIHwNCnwgdG90YWxfcmVjX2xhdGVfZmVlICAgICAgICAgIHwgMC4zOTY2OTIgICAgIHwgNC4wODc4MjUgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMzU4LjY4MDAwMCAgIHwgMTcuNDA0MDg1ICAgIHwgNTE1LjcyNDE2NSAgICB8DQp8IHJlY292ZXJpZXMgICAgICAgICAgICAgICAgICB8IDQ1LjkxOTI0MyAgICB8IDQwOS42OTM4NzQgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDMzNTIwLjI3MDAwMCB8IDE4LjA2MTgzOSAgICB8IDYxNy4yMTE0MTcgICAgfA0KfCBjb2xsZWN0aW9uX3JlY292ZXJ5X2ZlZSAgICAgfCA0Ljg4MDc1NyAgICAgfCA2My4xMjUyODEgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCAwLjAwMDAwMCAgICAgfCA3MDAyLjE5MDAwMCAgfCAyOS42NTU2OTMgICAgfCAxNjg0LjE2NTM2NCAgIHwNCnwgbGFzdF9weW1udF9hbW50ICAgICAgICAgICAgIHwgMjE2NC4xNDU1ODUgIHwgNDc5NC43ODMyMzMgIHwgMC4wMDAwMDAgICAgIHwgMjgwLjE3MDAwMCAgIHwgNDYyLjc4MDAwMCAgIHwgODMxLjI0NTAwMCAgIHwgMzY0NzUuNTkwMDAwIHwgMy40NzU4NTIgICAgIHwgMTMuMzU1NzcyICAgICB8DQp8IGNvbGxlY3Rpb25zXzEyX210aHNfZXhfbWVkICB8IDAuMDE0MzgwICAgICB8IDAuMTM0MTkxICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwICAgICB8IDIwLjAwMDAwMCAgICB8IDE3LjQxMDQwMCAgICB8IDEwOTcuODU0Nzk1ICAgfA0KfCBtdGhzX3NpbmNlX2xhc3RfbWFqb3JfZGVyb2cgfCA0NC4xMDQ4MzggICAgfCAyMi4xNzk4NDEgICAgfCAwLjAwMDAwMCAgICAgfCAyNy4wMDAwMDAgICAgfCA0NC4wMDAwMDAgICAgfCA2MS4wMDAwMDAgICAgfCAxODguMDAwMDAwICAgfCAwLjI2NDkzMiAgICAgfCAtMC4wMzEzNjIgICAgIHwNCnwgYWNjX25vd19kZWxpbnEgICAgICAgICAgICAgIHwgMC4wMDQ5OTEgICAgIHwgMC4wNzc2MjUgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMC4wMDAwMDAgICAgIHwgMTQuMDAwMDAwICAgIHwgMjQuMDY2MzU3ICAgIHwgMTYzMC44NjY0NTMgICB8DQp8IHRvdF9jb2xsX2FtdCAgICAgICAgICAgICAgICB8IDIuMjU3MDI2ZSswMiB8IDEuMDMxMTM3ZSswNCB8IDAuMDAwMDAwICAgICB8IDAuMDAwMDAwZSswMCB8IDAuMDAwMDAwZSswMCB8IDAuMDAwMDAwZSswMCB8IDkuMTUyNTQ1ZSswNiB8IDguNTYxODA1ZSswMiB8IDcuNTk2MTEyZSswNSAgfA0KfCB0b3RfY3VyX2JhbCAgICAgICAgICAgICAgICAgfCAxLjM5NDU4MmUrMDUgfCAxLjUzNzUwMGUrMDUgfCAwLjAwMDAwMCAgICAgfCAyLjk4NTMwMGUrMDQgfCA4LjA1NTkwMGUrMDQgfCAyLjA4MjA1MGUrMDUgfCA4LjAwMDA3OGUrMDYgfCAyLjkxODE3NGUrMDAgfCAyLjk0MDg4MWUrMDEgIHwNCnwgdG90YWxfcmV2X2hpX2xpbSAgICAgICAgICAgIHwgMy4yMDY4NjJlKzA0IHwgMy43NDk4MjZlKzA0IHwgMC4wMDAwMDAgICAgIHwgMS4zOTAwMDBlKzA0IHwgMi4zNzAwMDBlKzA0IHwgMy45ODAwMDBlKzA0IHwgOS45OTk5OTllKzA2IHwgNy4zMDQ1NTJlKzAxIHwgMS44NDAwMzllKzA0ICB8DQoNCioqVGFibGEgNS4qKiBSZXN1bWVuIGRlIGVzdGFkw61zdGljYXMgZGVzY3JpcHRpdmFzIHBhcmEgY2FkYSBjb2x1bW5hIG51bcOpcmljYS4NCg0KRGUgZXN0YSB0YWJsYSBzZSBwdWVkZW4gcmVhbGl6YXIgbGFzIHNpZ3VpZW50ZXMgb2JzZXJ2YWNpb25lczoNCg0KLSAgIGFubnVhbF9pbmMsIGR0aSwgcHViX3JlYywgcmVjb3ZlcmllcywgY29sbGVjdGlvbl9yZWNvdmVyeV9mZWUsIHRvdF9jb2xsX2FtdCwgdG90YWxfcmV2X2hpX2xpbSwgZW50cmUgb3RyYXMsIHByZXNlbnRhbiBmdWVydGUgYXNpbWV0csOtYSBhIGxhIGRlcmVjaGEgKHZhbG9yZXMgZXh0cmVtb3MgYWx0b3MpLiBFc3RvIHBvZHLDrWEgbGxlZ2FyIGEgYWZlY3RhciBlbCBtb2RlbG8gZGUgcmVkZXMgbmV1cm9uYWxlcy4NCg0KLSAgIGR0aSwgYW5udWFsX2luYywgdG90X2NvbGxfYW10LCBwdWJfcmVjLCBjb2xsZWN0aW9uc18xMl9tdGhzX2V4X21lZCwgdG90YWxfcmV2X2hpX2xpbSwgZXRjLiwgdGllbmVuIGNvbGFzIHBlc2FkYXMgY29uIG91dGxpZXJzIGV4dHJlbW9zLg0KDQotICAgZGVsaW5xXzJ5cnMsIGlucV9sYXN0XzZtdGhzLCBwdWJfcmVjLCBjb2xsZWN0aW9uc18xMl9tdGhzX2V4X21lZCwgYWNjX25vd19kZWxpbnEsIGV0Yy4sIHRpZW5lbiBtYXlvcsOtYSBkZSB2YWxvcmVzIGVuIDAuDQoNCi0gICBWYXJpYWJsZXMgZmluYW5jaWVyYXMgY29tbyBsb2FuX2FtbnQsIGZ1bmRlZF9hbW50LCBpbnN0YWxsbWVudCwgdG90YWxfcHltbnQsIGV0Yy4sIHByb2JhYmxlbWVudGUgZXN0w6FuIGFsdGFtZW50ZSBjb3JyZWxhY2lvbmFkYXMuDQoNCi0gICBNb250b3MgY29tbyB0b3RhbF9yZWNfbGF0ZV9mZWUsIHJlY292ZXJpZXMsIGNvbGxlY3Rpb25fcmVjb3ZlcnlfZmVlIHRpZW5lbiB2YWxvcmVzIGV4dHJlbW9zIHF1ZSBwdWVkZW4gZGlzdG9yc2lvbmFyIGFuw6FsaXNpcw0KDQojIyMgMS40LjIgVmFsb3JlcyB2YWPDrW9zIHkgY29udGVvIGRlIHZhbG9yZXMgcG9yIGNvbHVtbmENCg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCAqKk5vbWJyZSBkZSBDb2x1bW5hKiogICAgICAgfCAqKk7Dum1lcm8gZGUgdmFsb3JlcyBudWxsKiogfCAqKlBvcmNlbnRhamUgZGUgdmFsb3JlcyBudWxsKiogfCAqKk7Dum1lcm8gZGUgdmFsb3JlcyDDum5pY29zIGVuIGNvbHVtbmEgKFNpIHRpZW5lIG1lbm9zIGRlIDMwMCwgc2UgbXVlc3RyYW4gbG9zIHByaW1lcm9zIDIwIHZhbG9yZXMpKiogfA0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kw0KfCBhbm51YWxfaW5jICAgICAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAwNDUxICAgICAgICAgICAgICAgICAgICAgICB8IDQ5Mzg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBkZWxpbnFfMnlycyAgICAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMC4gMi4gMy4gMS4gNC4gNi4gNS4gOC4gNy4gOS4gMTEuIG5hbiAxMy4gMTUuIDEwLiAxMi4gMTcuIDE4LiAyOS4gMjQuXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBpbnFfbGFzdF82bXRocyAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMS4gNS4gMi4gMC4gMy4gNC4gNi4gNy4gOC4gOS4gMTAuIDExLiAxMi4gMTUuIDE0LiAzMy4gMTcuIDMyLiAyNC4gMTMuXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBtdGhzX3NpbmNlX2xhc3RfZGVsaW5xICAgICAgfCA0NTQzMTIgICAgICAgICAgICAgICAgICAgICB8IDUxLjE5NzA2NSAgICAgICAgICAgICAgICAgICAgICB8IDE1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtuYW4gMzUuIDM4LiA2MS4gOC4gMjAuIDE4LiA2OC4gNDUuIDQ4LiA0MS4gNDAuIDc0LiAyNS4gNTMuIDM5LiAxMC4gMjYuIDU2LiA3Ny5dICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBvcGVuX2FjYyAgICAgICAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMy4gMi4gMTAuIDE1LiA5LiA3LiA0LiAxMS4gMTQuIDEyLiAyMC4gOC4gNi4gMTcuIDUuIDEzLiAxNi4gMzAuIDIxLiAxOC5dICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBwdWJfcmVjICAgICAgICAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMC4gMS4gMi4gMy4gNC4gNS4gbmFuIDYuIDkuIDguIDcuIDExLiA0OS4gMTAuIDU0LiAxMi4gMTguIDE5LiAxNi4gMTUuXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCByZXZvbF91dGlsICAgICAgICAgICAgICAgICAgfCA1MDIgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDU2NTcxICAgICAgICAgICAgICAgICAgICAgICB8IDEzNTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RhbF9hY2MgICAgICAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDEzNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBjb2xsZWN0aW9uc18xMl9tdGhzX2V4X21lZCAgfCAxNDUgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDE2MzQwICAgICAgICAgICAgICAgICAgICAgICB8IDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMC4gbmFuIDEuIDIuIDQuIDMuIDYuIDE2LiAyMC4gNS4gNy4gMTAuIDE0Ll0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBtdGhzX3NpbmNlX2xhc3RfbWFqb3JfZGVyb2cgfCA2NjU2NzYgICAgICAgICAgICAgICAgICAgICB8IDc1LjAxNTk3NCAgICAgICAgICAgICAgICAgICAgICB8IDE2OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtuYW4gNTMuIDM0LiA1NC4gNjkuIDcuIDE2LiA3MS4gMzMuIDU5LiA0NS4gOC4gNTYuIDExLiA1MC4gNDcuIDY0LiAzMi4gNjIuIDM5Ll0gICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBhY2Nfbm93X2RlbGlucSAgICAgICAgICAgICAgfCAyOSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuMDAzMjY4ICAgICAgICAgICAgICAgICAgICAgICB8IDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFsgMC4gMS4gbmFuIDIuIDMuIDUuIDQuIDYuIDE0Ll0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RfY29sbF9hbXQgICAgICAgICAgICAgICAgfCA3MDI3NiAgICAgICAgICAgICAgICAgICAgICB8IDcuOTE5NTAyICAgICAgICAgICAgICAgICAgICAgICB8IDEwMzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RfY3VyX2JhbCAgICAgICAgICAgICAgICAgfCA3MDI3NiAgICAgICAgICAgICAgICAgICAgICB8IDcuOTE5NTAyICAgICAgICAgICAgICAgICAgICAgICB8IDMyNzM0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCB0b3RhbF9yZXZfaGlfbGltICAgICAgICAgICAgfCA3MDI3NiAgICAgICAgICAgICAgICAgICAgICB8IDcuOTE5NTAyICAgICAgICAgICAgICAgICAgICAgICB8IDIxMjUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KDQoqKlRhYmxhIDYuKiogVmFsb3JlcyB2YWPDrW9zIHkgY29udGVvIGRlIHZhbG9yZXMgw7puaWNvcyBwYXJhIGNhZGEgY29sdW1uYSBudW3DqXJpY2EuDQoNCkxvcyB2YWxvcmVzIG51bGwgZGUgbGFzIGNvbHVtbmFzIGNhdGVnw7NyaWNhcyBzZSByZXN1bWVuIGVuIGxhIFRhYmxhIDYuIEEgcGFydGlyIGRlIGVzdG8gc2UgcHVkbyBub3RhciBsbyBzaWd1aWVudGU6DQoNCi0gICBMYXMgY29sdW1uYXMgY29uIG1heW9yIG7Dum1lcm8gZGUgbnVsb3Mgc29uIG10aHNfc2luY2VfbGFzdF9tYWpvcl9kZXJvZyB5IG10aHNfc2luY2VfbGFzdF9kZWxpbnEuIFNlIGRlYmVyw6FuIGltcHV0YXIgY29uIHByZWNhdWNpw7NuLg0KDQotICAgTGEgbWF5b3LDrWEgZGUgdmFsb3JlcyB0aWVuZW4gdW5hIGNhbnRpZGFkIGRlIG51bG9zIHJlbGF0aXZhbWVudGUgYmFqYSwgYXPDrSBxdWUgc2UgcG9kcsOhIHJlYWxpemFyIHVuYSBpbXB1dGFjacOzbiBzZW5jaWxsYSBwYXJhIGxsZW5hciBlc3RvcyB2YWxvcmVzLg0KDQotICAgSGF5IHZhcmlhcyBjb2x1bW5hcyBxdWUgdGllbmVuIG5hbnMsIGFzw60gcXVlIHNlIHRlbmRyw6FuIHF1ZSBpbXB1dGFyIGNvbiBwcmVjYXVjacOzbiB0YW1iacOpbi4NCg0KIyMjIDEuNC4zIERpc3RyaWJ1Y2nDs24gZSBpZGVudGlmaWNhY2nDs24gZGUgZGF0b3MgYXTDrXBpY29zIChvdXRsaWVycykNCg0KIVtdKFZpb2xpbkFuZEJveHBsb3RzLnBuZykNCg0KKipGaWd1cmEgMS4qKiBWaW9saW4gcGxvdHMgeSBib3ggcGxvdHMgZGUgY2FkYSB2YXJpYWJsZSBudW3DqXJpY2EgZW4gZWwgZGF0YXNldC4NCg0KRW4gbGEgRmlndXJhIDEgc2UgbXVlc3RyYW4gcGxvdHMgZGUgdmlvbGluIHkgY2FqYSBwYXJhIHBvZGVyIGlkZW50aWZpY2FyIHRhbnRvIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGRhdG9zIGNvbW8gcGFyYSBpZGVudGlmaWNhciBsb3MgdmFsb3JlcyBhbsOzbWFsb3MgcG9yIGNhZGEgY29sdW1uYS4gU2UgcHVlZGUgYXByZWNpYXIgbG8gc2lndWllbnRlOg0KDQotICAgbG9hbl9hbW50LCBmdW5kZWRfYW1udCwgZnVuZGVkX2FtbnRfaW52IHRpZW5lbiBkaXN0cmlidWNpb25lcyBzaW3DqXRyaWNhcyB5IGVzdGFibGVzLCBzaW4gdmFsb3JlcyBleHRyZW1vcyBub3RhYmxlcy4NCg0KLSAgIGluc3RhbGxtZW50IHByZXNlbnRhIHVuIGxldmUgc2VzZ28gYSBsYSBkZXJlY2hhLg0KDQotICAgb3V0X3BybmNwIHkgb3V0X3BybmNwX2ludiBlc3TDoW4gY2VudHJhZGFzIGVuIGNlcm8sIGluZGljYW5kbyBtdWNob3MgcHLDqXN0YW1vcyBwYWdhZG9zLg0KDQotICAgdG90YWxfcmVjX3BybmNwIHNlIGNvbmNlbnRyYSBjZXJjYSBkZSBjZXJvIHBlcm8gY29uIHVuIHJhbmdvIGFtcGxpby4NCg0KLSAgIGFubnVhbF9pbmMgdGllbmUgdW4gZnVlcnRlIHNlc2dvIGEgbGEgZGVyZWNoYSwgY29uIG91dGxpZXJzIHNpZ25pZmljYXRpdm9zLg0KDQotICAgcmV2b2xfYmFsLCB0b3RfY3VyX2JhbCwgdG90YWxfcmV2X2hpX2xpbSwgdG90YWxfcmVjX2ludCwgdG90YWxfcmVjX2xhdGVfZmVlLCB0b3RfY29sbF9hbXQgZXN0w6FuIHNlc2dhZGFzIGEgbGEgZGVyZWNoYSBjb24gY29sYXMgbGFyZ2FzLg0KDQotICAgY29sbGVjdGlvbl9yZWNvdmVyeV9mZWUsIHJlY292ZXJpZXMsIGxhc3RfcHltbnRfYW1udCwgYXZnX2N1cl9iYWwgdGFtYmnDqW4gbXVlc3RyYW4gY29sYXMgbGFyZ2FzIGhhY2lhIGxhIGRlcmVjaGEuDQoNCi0gICBkZWxpbnFfMnlycywgaW5xX2xhc3RfNm10aHMsIG9wZW5fYWNjLCBwdWJfcmVjLCBhY2Nfbm93X2RlbGlucSwgY29sbGVjdGlvbnNfMTJfbXRoc19leF9tZWQgdGllbmVuIGRpc3RyaWJ1Y2lvbmVzIGRpc2NyZXRhcywgY2VudHJhZGFzIGVuIHBvY29zIHZhbG9yZXMuDQoNCi0gICBtdGhzX3NpbmNlX2xhc3RfZGVsaW5xIHkgbXRoc19zaW5jZV9sYXN0X21ham9yX2Rlcm9nIHByZXNlbnRhbiBodWVjb3MgZ3JhbmRlcyBkZWJpZG8gYSBtdWNob3MgdmFsb3JlcyBudWxvcy4NCg0KLSAgIGNvbGxlY3Rpb25zXzEyX210aHNfZXhfbWVkLCBhY2Nfbm93X2RlbGlucSwgdG90YWxfcmVjX2xhdGVfZmVlLCByZWNvdmVyaWVzLCBjb2xsZWN0aW9uX3JlY292ZXJ5X2ZlZSBlc3TDoW4gZG9taW5hZGFzIHBvciBjZXJvcy4NCg0KLSAgIGZ1bmRlZF9hbW50LCBsb2FuX2FtbnQsIGZ1bmRlZF9hbW50X2ludiB0aWVuZW4gcGF0cm9uZXMgc2ltaWxhcmVzIHkgcHVlZGVuIHNlciByZWR1bmRhbnRlcy4NCg0KLSAgIG91dF9wcm5jcCB5IG91dF9wcm5jcF9pbnYgdGFtYmnDqW4gc29uIHNpbWlsYXJlcyBlbnRyZSBzw60uDQoNCi0gICB0b3RhbF9yZWNfcHJuY3AsIHRvdGFsX3JlY19pbnQsIHRvdGFsX3JlY19sYXRlX2ZlZSwgcmVjb3ZlcmllcyBwb2Ryw61hbiBhZ3J1cGFyc2UgY29tbyBtb250b3MgcmVjdXBlcmFkb3MuDQoNCi0gICBWYXJpYWJsZXMgZnVlcnRlbWVudGUgc2VzZ2FkYXMgcG9kcsOtYW4gYmVuZWZpY2lhcnNlIGRlIHRyYW5zZm9ybWFjaW9uZXMuDQoNCi0gICBWYXJpYWJsZXMgY29uIG11Y2hvcyBjZXJvcyBwb2Ryw61hbiBlbGltaW5hcnNlLg0KDQotICAgVmFyaWFibGVzIHJlZHVuZGFudGVzIHBvZHLDrWFuIGVsaW1pbmFyc2UgbyBjb25zb2xpZGFyc2UuDQoNCi0gICBWYXJpYWJsZXMgZGlzY3JldGFzIGNvbiBwb2NvcyB2YWxvcmVzIHB1ZWRlbiB0cmF0YXJzZSBjb21vIGNhdGVnb3LDrWFzIG9yZGluYWxlcy4NCg0KIyMjIDEuNC40LiBDb25jbHVzaW9uZXMNCg0KQSBwYXJ0aXIgZGUgbG8gYW50ZXJpb3IsIHNlIGRlcml2YXJvbiBsYXMgc2lndWllbnRlcyBjb25jbHVzaW9uZXM6DQoNCi0gICBFbnRyZSBsb3MgZGF0b3Mgc2UgZW5jdWVudHJhbiB2YXJpYXMgY29sdW1uYXMgcXVlIGVzdMOhbiBtdXkgbyBwb2NvIHNlc2dhZGFzLCBhZGVtw6FzIGRlIGNvbnRhciBjb24gbXVjaG9zIG8gcG9jb3Mgb3V0bGllcnMuIFNlIHRlbmRyw6EgcXVlIHRlbmVyIGVzdG8gZW4gY3VlbnRhIGEgbGEgaG9yYSBkZSBwcmVwcm9jZXNhciBsb3MgZGF0b3MuDQoNCi0gICBFeGlzdGVuIHZhcmlhcyBjb2x1bW5hcyBjb24gdmFsb3JlcyBudWxvcyBwZXJvIGltcHV0YWJsZXMsIHkgcG9yIGxvIHRhbnRvIHNlIHBvZHLDoSByZWFsaXphciBsYSBkZWJpZGEgaW1wdXRhY2nDs24gYWwgbW9tZW50byBkZSBoYWNlciBlbCBwcmVwcm9jZXNhZG8uDQoNCjxhIG5hbWU9Iml1OS4iPjwvYT4NCg0KIyMgMS41IEFuw6FsaXNpcyBleHBsb3JhdG9yaW8gdW5pdmFyaWFkbyBkZSBjb2x1bW5hcyBubyBudW3DqXJpY2FzDQoNCiMjIyAxLjUuMSBEaXN0cmlidWNpw7NuIGRlIGZyZWN1ZW5jaWFzIHkgY2FyZGluYWxpZGFkDQoNCkEgcGFydGlyIGRlbCBhbsOhbGlzaXMgZGUgbGEgZXN0cnVjdHVyYSBkZWwgcHJveWVjdG8sIHNlIHB1ZGllcm9uIGlkZW50aWZpY2FyIGxhcyBjb2x1bW5hcyBubyBudW3DqXJpY2FzIHF1ZSBzZSBtdWVzdHJhbiBlbiBsYSBUYWJsYSA0LiBTZSBwcm9jZWRpw7MgYSBhbmFsaXphciBsYSBmcmVjdWVuY2lhIHkgY2FyZGluYWxpZGFkIGRlIGVzdGFzIGNvbHVtbmFzLg0KDQpEZSBlc3RvLCBzZSBwdWRvIGlkZW50aWZpY2FyIGxvIHNpZ3VpZW50ZToNCg0KLSAgIHRlcm0gc29sbyB0aWVuZSBkb3MgdmFsb3JlcyBwb3NpYmxlcywgeSBwb3IgbG8gdGFudG8gcG9kcsOhIHNlciBjb2RpZmljYWRhIGbDoWNpbG1lbnRlLg0KDQotICAgZ3JhZGUgeSBzdWJfZ3JhZGUgZXN0w6FuIHJlbGFjaW9uYWRhcywgcGVybyBzdWJfZ3JhZGUgdGllbmUgbcOhcyBncmFudWxhcmlkYWQsIHkgcG9yIGxvIHRhbnRvIHNlIGRlY2lkZSBlbGltaW5hciBsYSBjb2x1bW5hIGdyYWRlLg0KDQotICAgZW1wX2xlbmd0aCBlcyBvcmRpbmFsLCB5IHBvciBsbyB0YW50byBkZWJlcsOhIHNlciBjb2RpZmljYWRhIHNlZ8O6biBjb3JyZXNwb25kZS4NCg0KLSAgIGhvbWVfb3duZXJzaGlwIHRpZW5lIGFsZ3VuYXMgY2xhc2VzIHNpbWlsYXJlcywgY29tbyBPVEhFUiwgTk9ORSB5IEFOWSwgcG9yIGxvIHF1ZSBkZXBlbmRpZW5kbyBkZSBzdSBmcmVjdWVuY2lhIHNlIHBvZHLDrWFuIGFncnVwYXIuDQoNCi0gICB2ZXJpZmljYXRpb25fc3RhdHVzIHRhbWJpw6luIHNlcsOhIGbDoWNpbCBkZSBjb2RpZmljYXIgZGViaWRvIGEgcXVlIGN1ZW50YSBzb2xhbWVudGUgY29uIDIgdmFsb3Jlcy4NCg0KLSAgIERlYmlkbyBhIGxhIGFudGlndWVkYWQgZGUgbG9zIGRhdG9zLCBzZSBvcHRhcsOhIGx1ZWdvIHBvciBkZXNjYXJ0YXIgbGFzIGNvbHVtbmFzIHF1ZSBjb250ZW5nYW4gZmVjaGFzLg0KDQotICAgbG9hbl9zdGF0dXMgc2Vyw6EgbnVlc3RybyB0YXJnZXQsIGVsIGN1YWwgbcOhcyBhZGVsYW50ZSBzZSBjb2RpZmljYXLDoSBzaWd1aWVuZG8gbGFzIHJlY29tZW5kYWNpb25lcyBkYWRhcyBwb3IgZWwgZW51bmNpYWRvIGRlbCBwcm9ibGVtYS4NCg0KLSAgIHB1cnBvc2UgZXMgdW5hIHZlcnNpw7NuIG3DoXMgZXN0cnVjdHVyYWRhIHkgY29uc3RhbnRlIGRlIHRpdGxlLCB5IHBvciBsbyB0YW50byBzZSBjb25zZXJ2YXLDoS4NCg0KLSAgIHppcF9jb2RlIHkgYWRkcl9zdGF0ZSBlc3TDoW4gcmVsYWNpb25hZGFzLCBwZXJvIGFkZHJfc3RhdGUgdGllbmUgbWVub3MgY2FyZGluYWxpZGFkLCB5IHBvciBsbyB0YW50byBzZSBvcHRhcsOhIHBvciBlbGltaW5hciBsYSBjb2x1bW5hIHppcF9jb2RlLg0KDQotICAgaW5pdGlhbF9saXN0X3N0YXR1cyBzZXLDoSBmw6FjaWwgZGUgY29kaWZpY2FyIGFsIGNvbnRhciBjb24gcG9jb3MgdmFsb3Jlcy4NCg0KIyMjIDEuNS4yIENvbnRlbyBkZSB2YWxvcmVzIHBvciBjb2x1bW5hDQoNCiFbXShpbWFnZXMvQ2F0ZWdEaXN0cmlidXRpb25zLnBuZykNCg0KKipGaWd1cmEgMi4qKiBHcsOhZmljb3MgZGUgYmFycmFzIHBhcmEgbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMuDQoNCkVuIGxhIEZpZ3VyYSAyIHNlIG11ZXN0cmFuIGxvcyBncsOhZmljb3MgZGUgYmFycmFzIGdlbmVyYWRvcyBwYXJhIHZlciBsYSBmcmVjdWVuY2lhIGRlIGxvcyB2YWxvcmVzIGRlIGNhZGEgdmFyaWFibGUgY2F0ZWfDs3JpY2EuIERlIGVzdGEsIHNlIHB1ZWRlIGlkZW50aWZpY2FyIGxvIHNpZ3VpZW50ZToNCg0KLSAgIE11Y2hhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIChjb21vIGB0ZXJtYCwgYGdyYWRlYCwgYHB5bW50X3BsYW5gLCBgYXBwbGljYXRpb25fdHlwZWApIHRpZW5lbiBjYXRlZ29yw61hcyBkb21pbmFudGVzLCBsbyBxdWUgc3VnaWVyZSB1biBmdWVydGUgZGVzYmFsYW5jZSBxdWUgc2UgdGVuZHLDrWEgcXVlIHRyYXRhciwgcG9yIGVqZW1wbG8sIGVsaW1pbmFuZG8gbGFzIGZpbGFzIHF1ZSBjb250aWVuZW4gdmFsb3JlcyBxdWUgbm8gc29uIGNvbXVuZXMuDQoNCi0gICBTZSBwdWVkZSB2ZXIgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBwcsOpc3RhbW9zIHNvbiBhIDM2IG1lc2VzIHkgbG9zIHByaW5jaXBhbGVzIG1vdGl2b3MgZGUgcHLDqXN0YW1vIHNvbiBkZWJfY29uc29saWRhdGlvbiB5IGNyZWRpdF9jYXJkLg0KDQotICAgTGEgbWF5b3LDrWEgZGUgbG9zIGRhdG9zIHRpZW5lbiBhIE1PUlRHQUdFIGNvbW8gc3UgZXN0YWRvIGRlIGhvbWVfb3duZXJzaGlwLg0KDQotICAgQ29sdW1uYXMgY29tbyBhcHBsaWNhdGlvbl90eXBlLCBsYXN0X2NyZWRpdF9wdWxsX2QsIG5leHRfcHltbnQsIGxhc3RfcHltbnRfZCwgcHltbnRfcGxhbiB5IGhvbWVfb3duZXJzaGlwIHRpZW5lbiBtdXkgcG9jYSB2YXJpYWJpbGlkYWQgbyB0aWVuZW4gdmFsb3JlcyBxdWUgc29uIG11eSByYXJvcy4gUGFyYSB0cmF0YXJsb3MsIHNlIG9wdGFyw6EgcG9yIGVsaW1pbmFyIGxhcyBmaWxhcyBxdWUgY29udGVuZ2FuIHZhbG9yZXMgZXh0cmVtYWRhbWVudGUgcmFyb3MsIHkgc2UgZWxpbWluYXLDoW4gY29sdW1uYXMgcXVlIHRlbmdhbiBtw6FzIGRlbCA4MCUgZGUgbG9zIHZhbG9yZXMgaWd1YWxlcy4NCg0KIyMjIDEuNS4zIExpbXBpZXphIGFkaWNpb25hbCBkZSBjb2x1bW5hcyBjb24gcG9jYSB2YXJpYW56YQ0KDQpBIHBhcnRpciBkZSBsbyBhbnRlcmlvcm1lbnRlIG1lbmNpb25hZG8sIHNlIGRlY2lkacOzIHBvciByZWFsaXphciBsYXMgc2lndWllbnRlcyBhY2Npb25lcyBkZSBsaW1waWV6YSBwYXJhIGxhcyBjb2x1bW5hcyBjYXRlZ8OzcmljYXM6DQoNCi0gICBTZSBlbGltaW5hcsOhbiBsYXMgY29sdW1uYXMgZ3JhZGUgeSB6aXBfY29kZSBkZWJpZG8gYSBxdWUgeWEgdGllbmVuIG90cmFzIGNvbHVtbmFzIHF1ZSBlbmNhcHN1bGFuIHN1cyBzaWduaWZpY2Fkb3MuDQoNCi0gICBQb3IgZWwgbW9tZW50bywgZGViaWRvIGEgcXVlIGxvcyBkYXRvcyB2YW4gaGFzdGEgZWwgMjAxNiwgc2UgZWxpbWluYXLDoW4gbGFzIHNpZ3VpZW50ZXMgY29sdW1uYXMgcXVlIHJlcHJlc2VudGFuIGZlY2hhczogbGFzdF9weW1udF9kLCBuZXh0X3B5bW50X2QsIGlzc3VlX2QsIGVhcmxpZXN0X2NyX2xpbmUsIGxhc3RfY3JlZGl0X3B1bGxfZC4NCg0KLSAgIFNlIGVsaW1pbmFyw6FuIGxhcyBmaWxhcyBxdWUgbm8gY3VtcGxhbiBjb24gbG9zIHNpZ3VpZW50ZXMgY3JpdGVyaW9zOg0KDQogICAgLSAgIEVsIHZhbG9yIGRlIGhvbWVfb3duZXJzaGlwIGRlYmVyw6Egc2VyIFJFTlQsIE1PUlRHQUdFIG8gT1dOLg0KDQogICAgLSAgIEVsIHZhbG9yIGRlIHB5bW50X3BsYW4gZGViZXLDoSBzZXIgIm4iLg0KDQogICAgLSAgIEVsIHZhbG9yIGRlIGFwcGxpY2F0aW9uX3R5cGUgZGViZXLDoSBzZXIgSU5ESVZJRFVBTC4NCg0KVW5hIHZleiBhcGxpY2FkYSBsYSBsaW1waWV6YSBkZSBhY3VlcmRvIGEgbG9zIGFudGVyaW9yZXMgY3JpdGVyaW9zLCBzZSBwYXPDsyBkZSB0ZW5lciA4ODczNzkgZmlsYXMgYSB0ZW5lciA4ODY2MjMgZmlsYXMsIGVzIGRlY2lyLCBxdWUgaHVibyB1bmEgcmVkdWNjacOzbiBkZSBtZW5vcyBkZWwgMC4wMSUgZGVsIGRhdGFzZXQuDQoNCjxhIG5hbWU9Iml1MTAuIj48L2E+DQoNCiMjIDEuNiBBbsOhbGlzaXMgbXVsdGl2YXJpYWRvDQoNCiMjIyAxLjYuMSBUcmFuc2Zvcm1hY2nDs24gZGUgdGFyZ2V0IGEgdmFsb3JlcyBudW3DqXJpY29zDQoNClNlZ8O6biBlbCBlbnVuY2lhZG8sIGxvcyB2YWxvcmVzIGRlbCB0YXJnZXQgZGViZXLDoW4gc2VyIGNvZGlmaWNhZG9zIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNCi0gICBQb3NpdGl2ZSAoMCk6IFNpIGVsIHRhcmdldCBlcyAiRnVsbHkgUGFpZCIgbyAiRG9lcyBub3QgbWVldCB0aGUgY3JlZGl0IHBvbGljeS4gU3RhdHVzOkZ1bGx5IFBhaWQiLg0KDQotICAgTmVnYXRpdmUgKDEpOiBTaSBlbCB0YXJnZXQgZXMgIkNoYXJnZWQgT2ZmIiwgIkxhdGUgKDMxLTEyMCBkYXlzKSIsICJEZWZhdWx0IiBvICJEb2VzIG5vdCBtZWV0IHRoZSBjcmVkaXQgcG9saWN5LiBTdGF0dXM6Q2hhcmdlZCBvZmYiLg0KDQotICAgTnVsbCAoaW5kZWZpbmlkbyk6IFNpIGVsIHRhcmdldCBlcyAiQ3VycmVudCIsICJJc3N1ZWQiLCAiSW4gR3JhY2UgUGVyaW9kIiBvICJMYXRlICgxNi0zMCBkYXlzKSIuDQoNCkxhIGNvZGlmaWNhY2nDs24gc2UgcmVhbGl6w7MgdXRpbGl6YW5kbyBsYSBzaWd1aWVudGUgZnVuY2nDs24gZGUgbWFwZW86DQoNCmBgYHtweXRob259DQpwb3NpdGl2ZSA9IHsNCiAgICAiRnVsbHkgUGFpZCIsIA0KICAgICJEb2VzIG5vdCBtZWV0IHRoZSBjcmVkaXQgcG9saWN5LiBTdGF0dXM6RnVsbHkgUGFpZCINCn0NCm5lZ2F0aXZlID0gew0KICAgICJDaGFyZ2VkIE9mZiIsDQogICAgIkxhdGUgKDMxLTEyMCBkYXlzKSIsDQogICAgIkRlZmF1bHQiLA0KICAgICJEb2VzIG5vdCBtZWV0IHRoZSBjcmVkaXQgcG9saWN5LiBTdGF0dXM6Q2hhcmdlZCBPZmYiDQp9DQpudWxsID0gew0KICAgICJDdXJyZW50IiwNCiAgICAiSXNzdWVkIiwNCiAgICAiSW4gR3JhY2UgUGVyaW9kIiwNCiAgICAiTGF0ZSAoMTYtMzAgZGF5cykiLA0KfQ0KDQoNCmRlZiBjdXN0b21fdGFyZ2V0X3RyYW5zZm9ybWVyKHZhbHVlKToNCiAgICBpZiB2YWx1ZSBpbiBwb3NpdGl2ZToNCiAgICAgICAgcmV0dXJuIDANCiAgICBlbGlmIHZhbHVlIGluIG5lZ2F0aXZlOg0KICAgICAgICByZXR1cm4gMQ0KICAgIGVsc2U6DQogICAgICAgIHJldHVybiBucC5uYW4NCmBgYA0KDQpDb24gZWwgdGFyZ2V0IGRlYmlkYW1lbnRlIGNvZGlmaWNhZG8gY29tbyB1bmEgdmFyaWFibGUgYmluYXJpYSwgeWEgc2UgcG9kcsOhIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBkZSBjb3JyZWxhY2nDs24gcmVzcGVjdGl2by4NCg0KIyMjIDEuNi4yIE1hdHJpeiBkZSBjb3JyZWxhY2nDs24NCg0KIVtdKGltYWdlcy9Db3JyZWxhdGlvbkhlYXRtYXAtMDEucG5nKQ0KDQoqKkZpZ3VyYSAzLioqIE1hdHJpeiBkZSBjb3JyZWxhY2nDs24uDQoNCkRlIGVzdGEgbWF0cml6IGRlIGNvcnJlbGFjacOzbiwgY29uc2lkZXJhbmRvIHF1ZSBsb2FuX3N0YXR1cyBlcyBlbCB0YXJnZXQgZGVsIHByb2JsZW1hIGRlIGFwcmVuZGl6YWplIHN1cGVydmlzYWRvLCBzZSBvYnNlcnZhIGxvIHNpZ3VpZW50ZToNCg0KLSAgIExhcyBjb2x1bW5hcyBsb2FuX2FtbnQsIGZ1bmRlZF9hbW50IHkgZnVuZGVkX2FtbnRfaW52IGVzdMOhbiBmdWVydGVtZW50ZSBjb3JyZWxhY2lvbmFkYXMsIGxvIGN1YWwgdGllbmUgc2VudGlkbyBhbCB0cmF0YXJzZSBkZSByZXByZXNlbnRhY2lvbmVzIGRlbCBtb250byBkZWwgcHLDqXN0YW1vLg0KDQotICAgTGEgbWF5b3LDrWEgZGUgbGFzIHZhcmlhYmxlcyBwcmVzZW50YW4gY29ycmVsYWNpb25lcyBtb2RlcmFkYXMgbyBiYWphcywgbG8gY3VhbCBlcyBwb3NpdGl2byBwYXJhIGV2aXRhciByZWR1bmRhbmNpYSBlbiBtb2RlbG9zIGxpbmVhbGVzIGNvbW8gcmVncmVzacOzbiBsb2fDrXN0aWNhLg0KDQotICAgbG9hbl9zdGF0dXMgbm8gdGllbmUgY29ycmVsYWNpb25lcyBtdXkgZnVlcnRlcywgbG8gcXVlIHN1Z2llcmUgcXVlIG5vIGhheSBuaW5nw7puIHByZWRpY3RvciBsaW5lYWwgZG9taW5hbnRlIHkgcXVlIGVsIG1vZGVsbyBwb2Ryw61hIGJlbmVmaWNpYXJzZSBkZSBlbmZvcXVlcyBubyBsaW5lYWxlcyBvIGNvbWJpbmFjaW9uZXMgZGUgbcO6bHRpcGxlcyB2YXJpYWJsZXMuDQoNCiMjIyAxLjYuMyBBbsOhbGlzaXMgZGUgdGFyZ2V0DQoNClRyYXMgaGFjZXIgbGEgY29udmVyc2nDs24gZGUgbG9hbl9zdGF0dXMgYSB2YWxvcmVzIGJpbmFyaW9zLCBzZSBwcm9jZWRpw7MgYSByZWFsaXphciBlbCBhbsOhbGlzaXMgZGUgbGEgZnJlY3VlbmNpYSBkZSBsYXMgY2xhc2VzLg0KDQp8IGxvYW5fc3RhdHVzIHwgQ29udGVvIHwgRnJlY3VlbmNpYSBkZSB2YWxvciB8DQp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IE5hTiAgICAgICAgIHwgNjE4MzMwIHwgNjkuNyUgICAgICAgICAgICAgICB8DQp8IDAgICAgICAgICAgIHwgMjA5NTI2IHwgMjMuNiUgICAgICAgICAgICAgICB8DQp8IDEgICAgICAgICAgIHwgNTg3NjcgIHwgNi42JSAgICAgICAgICAgICAgICB8DQoNCioqVGFibGEgNy4qKiBCYWxhbmNlIGRlIHRhcmdldCBhbnRlcyBkZSBlbGltaW5hciB2YWxvcmVzIE5hTi4NCg0KRW4gbGEgVGFibGEgNyBzZSBtdWVzdHJhbiBsb3MgdmFsb3JlcyBlbiBsYSBjb2x1bW5hIGRlbCB0YXJnZXQgbG9hbl9zdGF0dXMuIENvbW8gc2UgYnVzY2EgcmVhbGl6YXIgZWwgZW50cmVuYW1pZW50byBkZWwgbW9kZWxvLCBhcXVlbGxvcyB2YWxvcmVzIE5hTiBxdWUgZXN0w6FuIGVuIGxhIGNvbHVtbmEgbm8gbm9zIHNlcnZpcsOhbiwgeSBwb3IgbG8gdGFudG8gZXNhcyBmaWxhcyBzZSBlbGltaW5hcsOhbi4NCg0KfCBsb2FuX3N0YXR1cyB8IENvbnRlbyB8IEZyZWN1ZW5jaWEgZGUgdmFsb3IgfA0KfC0tLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAwICAgICAgICAgICB8IDIwOTUyNiB8IDc4LjElICAgICAgICAgICAgICAgfA0KfCAxICAgICAgICAgICB8IDU4NzY3ICB8IDIxLjklICAgICAgICAgICAgICAgfA0KDQoqKlRhYmxhIDguKiogQmFsYW5jZSBkZSB0YXJnZXQgZGVzcHXDqXMgZGUgZWxpbWluYXIgdmFsb3JlcyBOYU4uDQoNCkVuIGxhIFRhYmxhIDggc2UgbXVlc3RyYSBlbCBudWV2byBiYWxhbmNlIGRlIGxvcyB2YWxvcmVzIGRlIGxhcyBjbGFzZXMgZGVzcHXDqXMgZGUgZWxpbWluYXIgbGFzIGZpbGFzIGNvbiBOYU5zIGVuIGVsIHRhcmdldC4NCg0KWWEgc2UgY3VlbnRhIGNvbiB1biB0b3RhbCBkZSAyNjgyOTMgZGUgODg3Mzc5IHF1ZSBzZSB0ZW7DrWFuIGluaWNpYWxtZW50ZSwgbG8gY3VhbCByZXByZXNlbnRhIHVuYSBkaXNtaW51Y2nDs24gY29uc2lkZXJhYmxlIGRlbCA3MCUgZGUgbG9zIGRhdG9zLiBTaW4gZW1iYXJnbywgZGViaWRvIGEgY8OzbW8gc2UgcmVjb21lbmTDsyBjb2RpZmljYXIgZWwgdGFyZ2V0LCBzZSBjb25zaWRlcmEgYXByb3BpYWRvLg0KDQojIyMgMS42LjQgQ29uY2x1c2lvbmVzDQoNCkEgcGFydGlyIGRlIGxvIGFudGVyaW9yLCBzZSBkZXJpdmFyb24gbGFzIHNpZ3VpZW50ZXMgY29uY2x1c2lvbmVzOg0KDQotICAgTGEgdHJhbnNmb3JtYWNpw7NuIGRlbCB0YXJnZXQgYGxvYW5fc3RhdHVzYCBhIHVuYSB2YXJpYWJsZSBiaW5hcmlhIHBlcm1pdGnDsyBkZWZpbmlyIGNvbiBjbGFyaWRhZCBsYXMgY2xhc2VzIHBvc2l0aXZhcyB5IG5lZ2F0aXZhcywgZWxpbWluYW5kbyBhcXVlbGxvcyBjYXNvcyBjb24gZXN0YWRvIGluY2llcnRvLg0KLSAgIExhIG1hdHJpeiBkZSBjb3JyZWxhY2nDs24gcmV2ZWzDsyBxdWUgbm8gZXhpc3RlIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EgY29uIGNvcnJlbGFjacOzbiBmdWVydGUgZGlyZWN0YSBjb24gZWwgdGFyZ2V0LCBsbyBxdWUgc3VnaWVyZSBxdWUgc2UgcmVxdWVyaXLDoW4gbW9kZWxvcyBubyBsaW5lYWxlcyBvIHTDqWNuaWNhcyBkZSBjb21iaW5hY2nDs24gZGUgdmFyaWFibGVzIHBhcmEgdW5hIHByZWRpY2Npw7NuIGVmZWN0aXZhLg0KLSAgIExhIGVsaW1pbmFjacOzbiBkZSByZWdpc3Ryb3MgY29uIHZhbG9yZXMgbnVsb3MgZW4gZWwgdGFyZ2V0IHJlZHVqbyBlbCBkYXRhc2V0IGVuIGFwcm94aW1hZGFtZW50ZSB1biA3MCUsIGxvIGN1YWwgcmVwcmVzZW50YSB1bmEgcMOpcmRpZGEgc2lnbmlmaWNhdGl2YSBkZSBkYXRvcywgcGVybyBlcyBuZWNlc2FyaWEgcGFyYSBnYXJhbnRpemFyIGxhIGNhbGlkYWQgZGVsIGFwcmVuZGl6YWplIHN1cGVydmlzYWRvLg0KLSAgIFRyYXMgbGEgZGVwdXJhY2nDs24sIHNlIGlkZW50aWZpY8OzIHVuIGxldmUgZGVzYmFsYW5jZSBkZSBjbGFzZXMgKDc4LjElIHBvc2l0aXZhcyB2cyAyMS45JSBuZWdhdGl2YXMpLCBsbyBjdWFsIHNlIGRlYmVyw6EgdGVuZXIgZW4gY3VlbnRhIGVuIGVsIGRpc2XDsW8gZGVsIG1vZGVsbyB5IGVuIGxhIHNlbGVjY2nDs24gZGUgbcOpdHJpY2FzIGRlIGV2YWx1YWNpw7NuLg0KDQo8YSBuYW1lPSJpdTExLiI+PC9hPg0KDQojIyAxLjcgQ29uY2x1c2lvbmVzIHBhcnRlIDENCg0KLSAgIFNlIHJlYWxpesOzIHVuYSBsaW1waWV6YSBlc3RydWN0dXJhZGEgZGVsIGRhdGFzZXQsIGVsaW1pbmFuZG8gY29sdW1uYXMgaXJyZWxldmFudGVzLCByZWR1bmRhbnRlcyBvIGNvbiB2YWxvcmVzIGV4Y2VzaXZvcyBudWxvcywgbG8gcXVlIHBlcm1pdGnDsyByZWR1Y2lyIGxhIGRpbWVuc2lvbmFsaWRhZCB5IGZhY2lsaXRhciBmdXR1cm9zIGFuw6FsaXNpcy4NCi0gICBBIHRyYXbDqXMgZGVsIGFuw6FsaXNpcyBkZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzLCBzZSBpZGVudGlmaWNhcm9uIHBhdHJvbmVzIGRlIGZyZWN1ZW5jaWEgZXNwZXJhYmxlcyBlbiBhdHJpYnV0b3MgY29tbyB0ZXJtLCBncmFkZSwgaG9tZV9vd25lcnNoaXAgeSBwdXJwb3NlLCBsbyBjdWFsIGFwb3J0YSBjb250ZXh0byByZWxldmFudGUgcGFyYSBsYSBwb3N0ZXJpb3IgY29uc3RydWNjacOzbiBkZWwgbW9kZWxvLg0KLSAgIEVsIGFuw6FsaXNpcyBkZSBjb3JyZWxhY2nDs24gZXZpZGVuY2nDsyBxdWUgbXVjaGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIHRpZW5lbiBiYWphIGNvcnJlbGFjacOzbiBlbnRyZSBzw60geSBjb24gZWwgdGFyZ2V0LCBsbyBxdWUgcmVkdWNlIGVsIHJpZXNnbyBkZSBtdWx0aWNvbGluZWFsaWRhZCBwZXJvIHRhbWJpw6luIHN1Z2llcmUgcXVlIGVsIHByb2JsZW1hIG5vIHNlcsOhIGbDoWNpbG1lbnRlIHJlc3VlbHRvIHBvciBtb2RlbG9zIGxpbmVhbGVzIHNpbXBsZXMuDQotICAgTGEgdHJhbnNmb3JtYWNpw7NuIGRlbCB0YXJnZXQgbG9hbl9zdGF0dXMgYSB1bmEgdmFyaWFibGUgYmluYXJpYSAoMDogcG9zaXRpdm8sIDE6IG5lZ2F0aXZvKSBwZXJtaXRpw7MgZXN0cnVjdHVyYXIgZWwgcHJvYmxlbWEgY29tbyB1bmEgY2xhc2lmaWNhY2nDs24gc3VwZXJ2aXNhZGEgYmluYXJpYSwgZWxpbWluYW5kbyBjYXNvcyBjb24gZXN0YXR1cyBpbmRlZmluaWRvLg0KLSAgIExhIGRlcHVyYWNpw7NuIGRlbCB0YXJnZXQgaW1wbGljw7MgdW5hIHDDqXJkaWRhIHNpZ25pZmljYXRpdmEgZGUgZGF0b3MgKDcwJSksIHBlcm8gc2UgY29uc2lkZXLDsyBuZWNlc2FyaWEgcGFyYSBhc2VndXJhciBsYSBjb2hlcmVuY2lhIHkgY29uZmlhYmlsaWRhZCBkZWwgbW9kZWxvIHByZWRpY3Rpdm8uDQotICAgRWwgY29uanVudG8gZmluYWwgcHJlc2VudGEgdW4gbGV2ZSBkZXNiYWxhbmNlIGRlIGNsYXNlcywgbG8gcXVlIGRlYmUgc2VyIHRyYXRhZG8gYWRlY3VhZGFtZW50ZSBlbiBsYSBldGFwYSBkZSBtb2RlbGFkbyBtZWRpYW50ZSB0w6ljbmljYXMgY29tbyBlbCB1c28gZGUgbcOpdHJpY2FzIGFwcm9waWFkYXMgbyBiYWxhbmNlbyBkZSBkYXRvcy4NCg0KWWEgY29uIGVsIGRhdGFzZXQgbGltcGlvLCBzZSBwcm9jZWRlIGEgbGEgc2VjY2nDs24gZGVkaWNhZGEgYSBsYSBpbmdlbmllcsOtYSBkZSBmZWF0dXJlcy4NCg0KPGEgbmFtZT0iaXUxMi4iPjwvYT4NCg0KIyBQYXJ0ZSAyLiBJbmdlbmllcsOtYSBkZSBGZWF0dXJlcw0KDQpBIGNvbnRpbnVhY2nDs24gc2UgcHJlc2VudGEgdW5hIHPDrW50ZXNpcyBkZSBsbyByZWFsaXphZG8gZW4gZWwgcHJvY2VzbyBkZSBpbmdlbmllcsOtYSBkZSBmZWF0dXJlcy4gVG9kbyBlbCBjw7NkaWdvIGNvbiBsb3MgZGV0YWxsZXMgZGUgaW1wbGVtZW50YWNpw7NuIHNlIHB1ZWRlIGVuY29udHJhciBlbiBlbCBhcmNoaXZvIHBvY19GZWF0dXJlRW5naW5lZXJpbmcuaXB5bmIgZW4gZWwgcmVwb3NpdG9yaW8gZGVsIHByb3llY3RvLg0KDQo8YSBuYW1lPSJpdTEzLiI+PC9hPg0KDQojIyAyLjEgT2JqZXRpdm9zDQoNClVuYSB2ZXogY29uIGVsIGRhdGFzZXQgbG8gc3VmaWNpZW50ZW1lbnRlIGxpbXBpbywgc2UgcHJvY2VkZXLDoSBhIHByZXByb2Nlc2FyIGVzdG9zIGRhdG9zIHBhcmEgcG9kZXIgcmVhbGl6YXIgZWwgZW50cmVuYW1pZW50byBkZSBsb3MgbW9kZWxvcy4gU2UgdGVuZHLDoW4gbG9zIHNpZ3VpZW50ZXMgb2JqZXRpdm9zOg0KDQotICAgQ29kaWZpY2FyIGxhcyBjb2x1bW5hcyBubyBudW3DqXJpY2FzIGRlIGFjdWVyZG8gYSBzdSBuYXR1cmFsZXphIGNhdGVnw7NyaWNhIHUgb3JkaW5hbCwgeSBkZSBhY3VlcmRvIGEgbGEgY2FyZGluYWxpZGFkIGRlIGNhZGEgdW5hLg0KDQotICAgSW1wdXRhciB2YWxvcmVzIG51bGxzIHBhcmEgdmFyaWFibGVzIG51bcOpcmljYXMgcXVlIGxvIHBlcm1pdGFuLg0KDQotICAgRXNjYWxhciBsb3MgZGF0b3MgbnVtw6lyaWNvcyBwYXJhIG1pdGlnYXIgZWwgZWZlY3RvIGRlIGxhcyBhbm9tYWzDrWFzIGVuIGVsIG1vZGVsby4NCg0KPGEgbmFtZT0iaXUxNC4iPjwvYT4NCg0KIyMgMi4yIFRyYXRhbWllbnRvIGRlIGNvbHVtbmFzIG51bcOpcmljYXMNCg0KIyMjIDIuMi4xIEltcHV0YWNpw7NuIGRlIG51bGxzDQoNClBhcmEgbGEgaW1wdXRhY2nDs24gZGUgbnVsbHMsIHNlIG9wdMOzIHBvciB1dGlsaXphciB1biBTaW1wbGVJbXB1dGVyIGRlIGxhIGhlcnJhbWllbnRhIHNrbGVhcm4sIGVsIGN1YWwgcGVybWl0ZSByZWFsaXphciBpbXB1dGFjacOzbiBkZSBudWxscyBzZW5jaWxsYSB1dGlsaXphbmRvIGxhIG1lZGlhLCBtZWRpYW5hIG8gZWwgdmFsb3IgbcOhcyBmcmVjdWVudGUuIFBhcmEgZXN0ZSBjYXNvLCBzZSBvcHTDsyBwb3IgaW1wdXRhciB1dGlsaXphbmRvIGVsIHZhbG9yIGRlIGxhIG1lZGlhIHBhcmEgY2FkYSBjb2x1bW5hIG51bcOpcmljYS4NCg0KRXN0byBzZSBoaXpvIHBhcmEgcG9kZXIgdmVyaWZpY2FyIGPDs21vIHNlIGNvbXBvcnRhYmEgZWwgbW9kZWxvIGNvbiBlc3RlIHRpcG8gZGUgaW1wdXRhY2nDs24uIFNpIHNlIG5vdGFiYSBxdWUgbGFzIG3DqXRyaWNhcyBubyBlcmFuIGxhcyBkZXNlYWRhcyBhIGxhIGhvcmEgZGUgZXZhbHVhciBlbCBtb2RlbG8sIHNlIHZvbHZlcsOtYSBhcXXDrSBhIGNhbWJpYXIgbGEgdMOpY25pY2EgZGUgaW1wdXRhY2nDs24uIFNpbiBlbWJhcmdvLCBkZSBsb3MgcmVzdWx0YWRvcyBkZWwgbW9kZWxhZG8gc2UgY29uY2x1ecOzIHF1ZSBlc3RvIGVyYSBzdWZpY2llbnRlLg0KDQojIyMgMi4yLjIgRXNjYWxhZG8gZGUgZGF0b3MNCg0KUGFyYSBlbCBlc2NhbGFkbyBkZSBkYXRvcywgc2Ugb3B0w7MgcG9yIHV0aWxpemFyIGVsIGVzY2FsYWRvciBSb2J1c3RTY2FsZXIgZGUgc2tsZWFybiwgeWEgcXVlIGFwbGljYSB1biBlc2NhbGFkbyBxdWUgZXMgbcOhcyByb2J1c3RvIGEgbG9zIHZhbG9yZXMgYXTDrXBpY29zLiBTZWfDum4gKEludGVyYWN0aXZlIENoYW9zLHMuZi4sIFJvYnVzdCBTY2FsZXIpLCByZWFsaXphIGRvcyBwYXNvcyBwcmluY2lwYWxlczoNCg0KMS4gIENhbGN1bGEgbGEgbWVkaWFuYSB5IGVsIHJhbmdvIGludGVyY3VhcnRpbCAoSVFSKSBkZSBjYWRhIGNhcmFjdGVyw61zdGljYSBlbiBlbCBjb25qdW50byBkZSBkYXRvcyAoZWwgSVFSIGVzIGxhIGRpZmVyZW5jaWEgZW50cmUgZWwgcGVyY2VudGlsIDc1IHkgZWwgcGVyY2VudGlsIDI1IGRlIGxvcyBkYXRvcykuDQoyLiAgVXRpbGl6YSBsYSBtZWRpYW5hIHkgZWwgSVFSIGRlIGNhZGEgY2FyYWN0ZXLDrXN0aWNhIHBhcmEgZXNjYWxhciBsb3MgZGF0b3MuDQoNCkVuIGNhc28gZGUgdmVyIHF1ZSBlbCBtb2RlbG8gbm8gdGllbmUgbcOpdHJpY2FzIGZhdm9yYWJsZXMsIHNlIGNhbWJpYXLDrWEuIFNpbiBlbWJhcmdvLCBhIHBhcnRpciBkZSBsb3MgcmVzdWx0YWRvcyBkZWwgbW9kZWxhZG8gc2UgY29uY2x1ecOzIHF1ZSBlc3RhIG9wY2nDs24gZXJhIHN1ZmljaWVudGUuDQoNCjxhIG5hbWU9Iml1MTUuIj48L2E+DQoNCiMjIDIuMyBUcmF0YW1pZW50byBkZSBjb2x1bW5hcyBubyBudW3DqXJpY2FzDQoNCiMjIyAyLjMuMSBUcmFuc2Zvcm1hY2nDs24gZGUgdmFyaWFibGVzIG9yZGluYWxlcw0KDQpBIHBhcnRpciBkZSBsYSBUYWJsYSA0LCBzZSBwdWRpZXJvbiBpZGVudGlmaWNhciBxdWUgbGFzIHZhcmlhYmxlcyBvcmRpbmFsZXMgYSBjb2RpZmljYXIgZXJhbiBzdWJfZ3JhZGUgeSBlbXBfbGVuZ3RoIHJlc3BlY3RpdmFtZW50ZS4NCg0KUGFyYSBjb2RpZmljYXIgYSBzdWJfZ3JhZGUsIGRhZG8gcXVlIHNlIHRyYXRhYmEgZGUgdW5hICJub3RhIiBzaW1pbGFyIGEgdW5hIG5vdGEgYWNhZMOpbWljYSwgc2Ugb3B0w7MgcG9yIGludGVudGFyIGNvZGlmaWNhcmxhIGRlIHVuYSBmb3JtYSBzaW1pbGFyIGEgY29tbyBzZSBjYWxpZmljYSBkZWwgMSBhbCA1IGVuIGxvcyBzaXN0ZW1hcyBlZHVjYXRpdm9zIGNvbG9tYmlhbm9zLiBTaW4gZW1iYXJnbywgYWwgdHJhdGFyc2UgZGUgNyBub3RhcyBtYXlvcmVzIChBLCBCLCBDLCBELCBFLCBGIHkgRyksIGxhIGNhbGlmaWNhY2nDs24gYWhvcmEgc2Vyw61hIGRlbCAxIGFsIDcuIFBvciBvdHJvIGxhZG8sIGNhZGEgdmFsb3IgZXN0YWJhIGFjb21wYcOxYWRvIGRlIHVuIG7Dum1lcm8gZGVsIDEgYWwgNSwgcG9yIGxvIHF1ZSBzZSBvcHTDsyBwb3JxdWUgZXN0b3MgdmFsb3JlcyByZXByZXNlbnRhcmFuIGNpZXJ0YSBmcmFjY2nDs24gZGVudHJvIGRlIGxhIG5vdGEgbWF5b3IuDQoNClNlIGNvZGlmaWPDsyB1dGlsaXphbmRvIGxhIHNpZ3VpZW50ZSBmdW5jacOzbjoNCg0KYGBge3B5dGhvbn0NCmRlZiBzdWJfZ3JhZGVfbWFwcGVyKHZhbCk6DQogICAgdmFsID0gc3RyKHZhbCkNCiAgICBncmFkZV9tYXBwaW5nID0gew0KICAgICAgICAiQSI6IDcsDQogICAgICAgICJCIjogNiwNCiAgICAgICAgIkMiOiA1LA0KICAgICAgICAiRCI6IDQsDQogICAgICAgICJFIjogMywNCiAgICAgICAgIkYiOiAyLA0KICAgICAgICAiRyI6IDENCiAgICB9DQogICAgbnVtX21hcHBpbmcgPSB7DQogICAgICAgICIxIjogMC44LA0KICAgICAgICAiMiI6IDAuNiwNCiAgICAgICAgIjMiOiAwLjQsDQogICAgICAgICI0IjogMC4yLA0KICAgICAgICAiNSI6IDAuMA0KICAgIH0NCiAgICBudW1fdmFsID0gZ3JhZGVfbWFwcGluZ1t2YWxbMF1dICsgbnVtX21hcHBpbmdbdmFsWzFdXQ0KICAgIHJldHVybiBudW1fdmFsDQpgYGANCg0KUGFyYSBsYSBjb2x1bW5hIGVtcF9sZW5ndGgsIHNlIG9wdMOzIHBvciB1dGlsaXphciBsYSBjbGFzZSBPcmRpbmFsRW5jb2RlciB5IHN1cyBtw6l0b2RvcyBwYXJhIGNvZGlmaWNhcmxhIGRlIGFjdWVyZG8gYWwgc2lndWllbnRlIG9yZGVuOg0KDQoxLiAgIlVua25vd24iOiBFc3RvcyBzb24gbG9zIHZhbG9yZXMgcXVlIGVzdGFiYW4gY29tbyBOYU4gZW4gZXN0YSBjb2x1bW5hLg0KMi4gICJcPCAxIHllYXIiDQozLiAgIjEgeWVhciINCjQuICAiMiB5ZWFycyINCjUuICAiMyB5ZWFycyINCjYuICAiNCB5ZWFycyINCjcuICAiNSB5ZWFycyINCjguICAiNiB5ZWFycyINCjkuICAiNyB5ZWFycyINCjEwLiAiOCB5ZWFycyINCjExLiAiOSB5ZWFycyINCjEyLiAiMTArIHllYXJzIg0KDQpTZSB1dGlsaXrDsyBsYSBzaWd1aWVudGUgcG9yY2nDs24gZGUgY8OzZGlnbyBwYXJhIGhhY2VybG86DQoNCmBgYHtweXRob259DQpvcmRlcmVkX3ZhbHMgPSBbDQogICAgIlVua25vd24iLCANCiAgICAiPCAxIHllYXIiLCANCiAgICAiMSB5ZWFyIiwgDQogICAgIjIgeWVhcnMiLCANCiAgICAiMyB5ZWFycyIsIA0KICAgICI0IHllYXJzIiwgDQogICAgIjUgeWVhcnMiLCANCiAgICAiNiB5ZWFycyIsIA0KICAgICI3IHllYXJzIiwgDQogICAgIjggeWVhcnMiLCANCiAgICAiOSB5ZWFycyIsIA0KICAgICIxMCsgeWVhcnMiDQpdDQpvcmRpbmFsX2VuY29kZXIgPSBPcmRpbmFsRW5jb2RlcihjYXRlZ29yaWVzPVtvcmRlcmVkX3ZhbHNdKQ0KZGZbImVtcF9sZW5ndGgiXSA9IG9yZGluYWxfZW5jb2Rlci5maXRfdHJhbnNmb3JtKGRmW1siZW1wX2xlbmd0aCJdXSkNCmBgYA0KDQojIyMgMi4zLjIgVHJhbnNmb3JtYWNpw7NuIGRlIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgY29uIGJhamEgY2FyZGluYWxpZGFkDQoNCkVuIGN1YW50byBhIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIHF1ZSBjb250YWJhbiBjb24gYmFqYSBjYXJkaW5hbGlkYWQsIGVzIGRlY2lyLCBjb24gcG9jb3MgdmFsb3JlcyDDum5pY29zLCBzZSBvcHTDsyBwb3IgY29kaWZpY2FybG9zIHV0aWxpemFuZG8gbGEgdMOpY25pY2EgT25lLUhvdCwgdXNhbmRvIGxhcyBoZXJyYW1pZW50YXMgZGUgcGFuZGFzIHBhcmEgZXN0by4NCg0KTGFzIGNvbHVtbmFzIGlkZW50aWZpY2FkYXMgY29tbyBhcHRhcyBwYXJhIGxhIGltcGxlbWVudGFjacOzbiBkZSBlc3RhIHTDqWNuaWNhIGRlIGFjdWVyZG8gYSBsYSByZXZpc2nDs24gZGUgbGEgVGFibGEgNCBmdWVyb246IHRlcm0sIGhvbWVfb3duZXJzaGlwLCB2ZXJpZmljYXRpb25fc3RhdHVzLCBpbml0aWFsX2xpc3Rfc3RhdHVzIHkgcHVycG9zZS4NCg0KU2UgY29kaWZpY2Fyb24gdXRpbGl6YW5kbyBsYSBzaWd1aWVudGUgcG9yY2nDs24gZGUgY8OzZGlnbzoNCg0KYGBge3B5dGhvbn0NCmNhdGVnX2NvbHNfb25laG90ID0gWw0KICAgICJ0ZXJtIiwNCiAgICAiaG9tZV9vd25lcnNoaXAiLA0KICAgICJ2ZXJpZmljYXRpb25fc3RhdHVzIiwNCiAgICAiaW5pdGlhbF9saXN0X3N0YXR1cyIsDQogICAgInB1cnBvc2UiDQpdDQoNCmRmID0gcGQuZ2V0X2R1bW1pZXMoZGYsIGNvbHVtbnM9Y2F0ZWdfY29sc19vbmVob3QpDQpgYGANCg0KIyMjIDIuMy4zIFRyYW5zZm9ybWFjacOzbiBkZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGNvbiBhbHRhIGNhcmRpbmFsaWRhZA0KDQpQYXJhIGVsIGNhc28gZGUgbGEgdmFyaWFibGUgYWRkcl9zdGF0ZSwgbGEgY3VhbCBzZSBjb25zaWRlcsOzIHF1ZSB0ZW7DrWEgdW5hIGFsdGEgY2FyZGluYWxpZGFkIGFsIGNvbnRhciBjb24gNTEgdmFsb3JlcyDDum5pY29zLCBzZSBvcHTDsyBwb3IgdXRpbGl6YXIgZWwgbcOpdG9kbyBkZSBIYXNoaW5nIGVuY29kaW5nLCBlbCBjdWFsIGVzIHJlY29tZW5kYWRvIHBhcmEgdmFyaWFibGVzIGNvbiBhbHRhIGNhcmRpbmFsaWRhZCAoU3dheWFtLCAyMDIzKS4NCg0KU2UgdXRpbGl6w7MgbGEgc2lndWllbnRlIHBvcmNpw7NuIGRlIGPDs2RpZ28gcGFyYSBlc3RvOg0KDQpgYGB7cHl0aG9ufQ0KaGFzaGluZ19lbmNvZGVyID0gSGFzaGluZ0VuY29kZXIoY29scz1bImFkZHJfc3RhdGUiXSwgbl9jb21wb25lbnRzPTgpDQogICAgDQpoYXNoZWQgPSBoYXNoaW5nX2VuY29kZXIuZml0X3RyYW5zZm9ybShkZltbImFkZHJfc3RhdGUiXV0pDQogICAgDQpoYXNoZWQuY29sdW1ucyA9IFtmImFkZHJfc3RhdGVfaGFzaF97aX0iIGZvciBpIGluIHJhbmdlKGhhc2hlZC5zaGFwZVsxXSldDQogICAgDQpkZiA9IGRmLmRyb3AoY29sdW1ucz1bImFkZHJfc3RhdGUiXSkuam9pbihoYXNoZWQpDQpgYGANCg0KPGEgbmFtZT0iaXUxNi4iPjwvYT4NCg0KIyMgMi40IENvbmNsdXNpb25lcyBwYXJ0ZSAyDQoNClRyYXMgaGFiZXIgcmVhbGl6YWRvIHRvZG8gZWwgcHJlcHJvY2VzYW1pZW50byBhZGVjdWFkbyBkZSBsb3MgZGF0b3MgeSBoYWJlciBnZW5lcmFkbyB1biBudWV2byBkYXRhc2V0IGNvbiB0b2RvcyBlc3RvcyBkYXRvcyB0cmF0YWRvcywgc2Ugc2FjYXJvbiBsYXMgc2lndWllbnRlcyBjb25jbHVzaW9uZXMgeSBhcHJlbmRpemFqZXM6DQoNCi0gICBTZSBpbXBsZW1lbnRhcm9uIHTDqWNuaWNhcyBhZGVjdWFkYXMgZGUgcHJlcHJvY2VzYW1pZW50byBwYXJhIHByZXBhcmFyIGxvcyBkYXRvcyBwYXJhIGVsIHNpZ3VpZW50ZSBwcm9jZXNvIGRlIG1vZGVsYWRvLCBpbXBsZW1lbnRhbmRvIHTDqWNuaWNhcyBkZSBpbXB1dGFjacOzbiwgZXNjYWxhZG8geSBjb2RpZmljYWNpw7NuIGRlIHZhcmlhYmxlcyBubyBudW3DqXJpY2FzLg0KDQotICAgVW5hIHZhcmlhYmxlIG9yZGluYWwgcHVlZGUgc2VyIGNvZGlmaWNhZGEgdGFudG8gbWFudWFsbWVudGUgKHNpIHNlIHZlIHVuIHBhcmFsZWxvIGNsYXJvIHkgdW5hIGZvcm1hIGRlIGltcGxlbWVudGFjacOzbiBjb25jaXNhKSBjb21vIGFwb3nDoW5kb3NlIGVuIGhlcnJhbWllbnRhcyBlc3BlY2lhbGl6YWRhcyBlbiBjb2RpZmljYWNpw7NuLCBjb21vIGxvIHNvbiBsYXMgaGVycmFtaWVudGFzIHF1ZSBicmluZGEgU0tsZWFybi4NCg0KLSAgIFNlIGxvZ3LDsyB1bmEgdHJhbnNmb3JtYWNpw7NuIGRlbCBkYXRhc2V0IHF1ZSBzZSBjb25zaWRlcmEgbG8gc3VmaWNpZW50ZW1lbnRlIGNvaGVyZW50ZSwgZXNjYWxhZGEgeSBjb21wbGV0YW1lbnRlIG51bcOpcmljYSBjb21vIHBhcmEgcGFzYXIgYSBsYSBzaWd1aWVudGUgZmFzZSBkZSBtb2RlbGFkby4NCg0KPGEgbmFtZT0iaXUxNy4iPjwvYT4NCg0KIyBQYXJ0ZSAzLiBNb2RlbGFkbw0KDQpBIGNvbnRpbnVhY2nDs24gc2UgcHJlc2VudGEgdW5hIHPDrW50ZXNpcyBkZSBsbyByZWFsaXphZG8gZW4gZWwgcHJvY2VzbyBkZSBtb2RlbGFkby4gVG9kbyBlbCBjw7NkaWdvIGNvbiBsb3MgZGV0YWxsZXMgZGUgaW1wbGVtZW50YWNpw7NuIHNlIHB1ZWRlIGVuY29udHJhciBlbiBlbCBhcmNoaXZvIHBvY19Nb2RlbGluZy5pcHluYiBlbiBlbCByZXBvc2l0b3JpbyBkZWwgcHJveWVjdG8uDQoNCjxhIG5hbWU9Iml1MTguIj48L2E+DQoNCiMjIDMuMSBPYmpldGl2b3MNCg0KWWEgY29udGFuZG8gY29uIHVuIGRhdGFzZXQgbGlzdG8gcGFyYSBlbCBlbnRyZW5hbWllbnRvIGRlIG1vZGVsb3MgZGUgZGVlcCBsZWFybmluZyB5IGNsYXNpZmljYWNpw7NuIGJpbmFyaWEsIHNlIGVzcGVyYSBjdW1wbGlyIGNvbiBsb3Mgc2lndWllbnRlcyBvYmpldGl2b3M6DQoNCi0gICBSZWFsaXphciB1bmEgZGl2aXNpw7NuIGFwcm9waWFkYSBkZWwgZGF0YXNldCBwYXJhIGVudHJlbmFyIHkgdmFsaWRhciBlbCBtb2RlbG8sIGNvbmNyZXRhbWVudGUgdW4gNzAlIHBhcmEgZW50cmVuYW1pZW50byB5IHVuIDMwJSBwYXJhIGxhIGV2YWx1YWNpw7NuLg0KDQotICAgRW50cmVuYXIgdW4gbW9kZWxvIHNpbXBsZSBkZSBYR0Jvb3N0IHBhcmEgdGVuZXJsbyBjb21vIHB1bnRvIGRlIGNvbXBhcmFjacOzbiB2cyBsb3MgbW9kZWxvcyBtdWx0aXBlcmNlcHRyb24gYSBkZWZpbmlyLg0KDQotICAgRW50cmVuYXIgZG9zIG1vZGVsb3MgbXVsdGlwZXJjZXB0cm9uIGNvbiB2YXJpYXMgdmFyaWFjaW9uZXMgZGUgYXJxdWl0ZWN0dXJhIHBhcmEgY29tcGFyYXIgY8OzbW8gZXMgZWwgaW1wYWN0byBkZSBlc3RvcyBjYW1iaW9zIGVuIGxvcyB2YWxvcmVzIG9iamV0aXZvcyBwYXJhIGxhcyBtw6l0cmljYXMgZGVsIG1vZGVsYWRvLg0KDQo8YSBuYW1lPSJpdTE5LiI+PC9hPg0KDQojIyAzLjIgVHJhaW4tVGVzdCBzcGxpdA0KDQpQYXJhIGhhY2VyIGVsIHNwbGl0IGRlIGxvcyBkYXRvcywgc2Ugb3B0w7MgcG9yIHV0aWxpemFyIHVuYSBwcm9wb3JjacOzbiBkZWwgNzAlIHBhcmEgZWwgZW50cmVuYW1pZW50byB5IHVuIDMwJSBwYXJhIGVsIHRlc3RlbywgZWwgY3VhbCBlcyB1bmEgcHJvcG9yY2nDs24gZXN0w6FuZGFyIGVuIG1hY2hpbmUgbGVhcm5pbmcgKFN0b2ppbGprb3ZpYywgMjAyNSkuDQoNClNlIGhpem8gZWwgc3BsaXQgdXRpbGl6YW5kbyBsYSBzaWd1aWVudGUgcG9yY2nDs24gZGUgY8OzZGlnbzoNCg0KYGBge3B5dGhvbn0NCnkgPSBkZlsibG9hbl9zdGF0dXMiXS5hc3R5cGUoaW50KQ0KWCA9IGRmLmRyb3AoY29sdW1ucz1bImxvYW5fc3RhdHVzIl0pDQpYX3RyYWluLCBYX3Rlc3QsIHlfdHJhaW4sIHlfdGVzdCA9IHRyYWluX3Rlc3Rfc3BsaXQoDQogICAgWCwgeSwNCiAgICB0ZXN0X3NpemUgPSAwLjMsDQogICAgcmFuZG9tX3N0YXRlID0gMzUsDQogICAgc3RyYXRpZnkgPSB5LA0KICAgIHNodWZmbGU9VHJ1ZQ0KKQ0KYGBgDQoNCjxhIG5hbWU9Iml1MjAuIj48L2E+DQoNCiMjIDMuMy4gTW9kZWxvIDE6IFhHQm9vc3QNCg0KWEdCb29zdCBlcyB1bmEgbGlicmVyw61hIGRlIGPDs2RpZ28gYWJpZXJ0byBxdWUgZW1wbGVhIMOhcmJvbGVzIGRlIGRlY2lzaW9uZXMgcG90ZW5jaWFkb3MgcG9yIGdyYWRpZW50ZS4gKElCTSwgMjAyNCkuIFN1ZWxlIHNlciBtdXkgdmVsb3ogeSBlZmljaWVudGUgY29uIGNvbmp1bnRvcyBncmFuZGVzIGRlIGRhdG9zLiBTdWVsZSBzZXIgbXV5IHV0aWxpemFkbyBlbiBwcm9ibGVtYXMgZGUgY2xhc2lmaWNhY2nDs24geSByZWdyZXNpw7NuLg0KDQojIyMgMy4zLjEgRGVmaW5pY2nDs24gZGVsIG1vZGVsbw0KDQpFbCBtb2RlbG8gdXRpbGl6YWRvIHNlIGRlZmluacOzIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNCmBgYHtweXRob259DQp4Z2JfY2xhc3NpZmllciA9IFhHQkNsYXNzaWZpZXIoDQogICAgb2JqZWN0aXZlPSdtdWx0aTpzb2Z0bWF4JywgIyANCiAgICBudW1fY2xhc3M9MiwgICAgICAgDQogICAgbl9lc3RpbWF0b3JzPTUwMCwgICAgICAgICAgDQogICAgbGVhcm5pbmdfcmF0ZT0wLjEsICAgICAgICAgDQogICAgbWF4X2RlcHRoPTMsICAgICAgICAgICAgICAgDQogICAgc3Vic2FtcGxlPTAuOCwgICAgICAgICAgICAgDQogICAgY29sc2FtcGxlX2J5dHJlZT0wLjgsICAgICAgDQogICAgZ2FtbWE9MCwgICAgICAgICAgICAgICAgICAgDQogICAgcmVnX2xhbWJkYT0xLCAgICAgICAgICAgICAgDQogICAgdXNlX2xhYmVsX2VuY29kZXI9RmFsc2UsICAgDQogICAgZXZhbF9tZXRyaWM9J21sb2dsb3NzJywgICAgDQogICAgcmFuZG9tX3N0YXRlPTM1LA0KICAgIG5fam9icz0tMSAgICAgICAgICAgICAgICAgDQopDQpgYGANCg0KQSBjb250aW51YWNpw7NuIGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyByZWNvZ2lkYXMgcGFyYSBkZWZpbmlyIGVsIG1vZGVsbzoNCg0KLSAgIFNlIG9wdMOzIHBvciB1dGlsaXphciB1biBvYmpldGl2byBtdWx0aWNsYXNlIHBhcmEgcG9kZXIgdmVyIGPDs21vIGFmZWN0YWJhIGVzdG8gYSBsYSBjYWxpZGFkIGRlbCBtb2RlbG8sIHNhYmllbmRvIHF1ZSBsYSB0YXJlYSBlbiBjdWVzdGnDs24gZXMgZGUgY2xhc2lmaWNhY2nDs24gYmluYXJpYS4NCg0KLSAgIFNlIG9wdMOzIHBvciB1dGlsaXphciB1biBuw7ptZXJvIHJlbGF0aXZhbWVudGUgYWx0byBkZSBlc3RpbWFkb3JlcyBwYXJhIGdhcmFudGl6YXIgdGVuZXIgdW4gZGVzZW1wZcOxbyBkZXNjZW50ZSBkZWwgbW9kZWxvLCBjb25zaWRlcmFuZG8gcXVlIHNlIHRpZW5lIHVuIGFsdG8gbsO6bWVybyBkZSBmZWF0dXJlcy4NCg0KLSAgIFNlIG9wdMOzIHBvciB1biB2YWxvciBiYWpvIGRlIGxhIHRhc2EgZGUgYXByZW5kaXphamUgcGFyYSB0ZW5lciB1biBtb2RlbG8gbcOhcyByb2J1c3RvLg0KDQotICAgU2Ugb3B0w7MgcG9yIHVuYSBwcm9mdW5kaXphY2nDs24gZGUgMyBwYXJhIGV2aXRhciBzb2JyZWFqdXN0ZSB5IGF5dWRhciBhbCBtb2RlbG8gY29uIGxhIGdlbmVyYWxpemFjacOzbi4NCg0KLSAgIFNlIGludHJvZHVjZSB1bmEgcHJvcG9yY2nDs24gZGUgbXVlc3RyYXMgYWxlYXRvcmlhcyBkZSA4MCUgcGFyYSByZWR1Y2lyIGVsIHNvYnJlYWp1c3RlLg0KDQotICAgU2UgaW50cm9kdWNlIHVuYSBwcm9wb3JjacOzbiBkZSBmZWF0dXJlcyBwYXJhIGxhIGNvbnN0cnVjY2nDs24gZGUgbG9zIMOhcmJvbGVzIGRlIDAuOCBwYXJhIHJlZHVjaXIgZWwgc29icmUgYWp1c3RlLg0KDQotICAgU2UgbGUgcGFzYSB1biBnYW1tYSBpZ3VhbCBhIDAgcGFyYSBkYXJsZSBhbGdvIGRlIGZsZXhpYmlsaWRhZCBhbCBtb2RlbG8uDQoNCi0gICBTZSBvcHTDsyBwb3IgdXRpbGl6YXIgbXVsdGkgbG9nIGxvc3MgcGFyYSBsYSBmdW5jacOzbiBkZSBww6lyZGlkYSwgbGEgY3VhbCBlcyB2w6FsaWRhIHRhbnRvIHBhcmEgcHJvYmxlbWFzIG11bHRpY2xhc2UgY29tbyBkZSBjbGFzaWZpY2FjacOzbiBiaW5hcmlhLg0KDQojIyMgMy4zLjIgRXZhbHVhY2nDs24NCg0KTG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIGVuIGVsIGNvbmp1bnRvIGRlIGVudHJlbmFtaWVudG8gc2UgcmVzdW1lbiBlbiBsYSBzaWd1aWVudGUgdGFibGEgZ2VuZXJhZGEgcG9yIGVsIGPDs2RpZ28gZW5jYXJnYWRvIGRlIHJlYWxpemFyIGxhIGV2YWx1YWNpw7NuOg0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC00MTI5MDgzNDczLnBuZykNCg0KKipGaWd1cmEgNC4qKiBUYWJsYSBkZSByZXN1bHRhZG9zIGRlIFhHQm9vc3QgZW4gZWwgY29uanVudG8gZGUgZW50cmVuYW1pZW50bw0KDQpEZSBpZ3VhbCBmb3JtYSwgYSBjb250aW51YWNpw7NuIHNlIHRpZW5lIGxhIHRhYmxhIHJlc3BlY3RpdmEgcGFyYSBlbCBjb25qdW50byBkZSB0ZXN0aW5nLg0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC02MDkwMzYzNjUucG5nKQ0KDQoqKkZpZ3VyYSA1LioqIFRhYmxhIGRlIHJlc3VsdGFkb3MgZGUgWEdCb29zdCBlbiBlbCBjb25qdW50byBkZSB0ZXN0aW5nDQoNCiMjIyAzLjMuMy4gQ29uY2x1c2lvbmVzIG1vZGVsYWRvIFhHQm9vc3QNCg0KRGUgbG9zIGFudGVyaW9yZXMgcmVzdWx0YWRvcyBzZSBvYnR1dmllcm9uIGxhcyBzaWd1aWVudGVzIGNvbmNsdXNpb25lcyB5IGFwcmVuZGl6YWplczoNCg0KLSAgIFNvcnByZW5kZW50ZW1lbnRlLCBlbCBtb2RlbG8gdHV2byByZXN1bHRhZG9zIGV4Y2VsZW50ZXMgZW4gYW1ib3MgY29uanVudG9zIGRlIGRhdG9zLiBFc3RvIGVzIGFsZ28gc29zcGVjaG9zbywgZGViaWRvIGEgcXVlIHB1ZWRlIGhhYmVyIHVuYSBhbHRhIHByb2JhYmlsaWRhZCBkZSBkYXRhIGxlYWthZ2UgZGViaWRvIGEgbGEgZmFsdGEgZGUgcmV2aXNpw7NuIGVuIGFsZ8O6biBwdW50byBkdXJhbnRlIGxhIGxpbXBpZXphIGRlIGxvcyBkYXRvcy4NCg0KPGEgbmFtZT0iaXUyMS4iPjwvYT4NCg0KIyMgMy40LiBNb2RlbG8gMjogWEdCb29zdCB0cmFzIHJlc29sdmVyIHByb2JsZW1hIGRlIGRhdGEgbGVha2FnZQ0KDQpEZWJpZG8gYSBsbyBhbnRlcmlvciwgaGl6byBmYWx0YSByZXZpc2FyIG51ZXZhbWVudGUgbGFzIGNvbHVtbmFzIHV0aWxpemFkYXMgcGFyYSB2ZXJpZmljYXIgcXVlIG5vIGh1YmllcmEgbmluZ3VuYSBmdWdhIGRlIGRhdG9zLCBlcyBkZWNpciwgcXVlIG5vIGh1YmllcmEgbmluZ3VuYSBjb2x1bW5hIHF1ZSBubyBkZWJpZXJhIGFwYXJlY2VyIGFsIG1vbWVudG8gZGUgZW50cmVuYXIgeSBldmFsdWFyIGVsIG1vZGVsby4NCg0KRGVzcHXDqXMgZGUgdW5hIHJldmlzacOzbiBkZWwgZGljY2lvbmFyaW8gZGUgZGF0b3MsIHNlIGNvbmZpcm3DsyBxdWUgaGFiw61hIHVuIHByb2JsZW1hIGRlIGZ1Z2EgZGUgZGF0b3MsIGVzcGVjw61maWNhbWVudGUgY29uIGxhcyBzaWd1aWVudGVzIGNvbHVtbmFzIHF1ZSBzZSBlc3RhYmFuIHV0aWxpemFuZG86DQoNCi0gICAqKnRvdGFsX3JlY19wcm5jcDoqKiBQYWdvcyBwcmluY2lwYWxlcyByZWNpYmlkb3MgaGFzdGEgbGEgZmVjaGEuDQotICAgKip0b3RhbF9yZWNfaW50Kio6IEludGVyZXNlcyByZWNpYmlkb3MgaGFzdGEgbGEgZmVjaGEuDQotICAgKip0b3RhbF9yZWNfbGF0ZV9mZWUqKjogSW50ZXJlc2VzIHRhcmTDrW9zIHJlY2liaWRvcyBoYXN0YSBsYSBmZWNoYS4NCi0gICAqKnJlY292ZXJpZXMqKjogTW9udG8gdG90YWwgcmVjdXBlcmFkbyBwb3IgZWwgYWNyZWVkb3IgZGVzcHXDqXMgZGUgY29uc2lkZXJhciBsYSBkZXVkYSBjb21vIGluY29icmFibGUuDQotICAgKip0b3RhbF9weW1udDoqKiBQYWdvcyByZWNpYmlkb3MgaGFzdGEgbGEgZmVjaGEgZGUgbGEgdG90YWxpZGFkIGRlIGxvIHByZXN0YWRvLg0KLSAgICoqdG90YWxfcHltbnRfaW52Kio6IFBhZ29zIHJlY2liaWRvcyBoYXN0YSBsYSBmZWNoYSBlbiBwcm9wb3JjacOzbiBhIGxvIHBhZ2FkbyBwb3IgaW52ZXJzb3Jlcy4NCi0gICAqKmNvbGxlY3Rpb25fcmVjb3ZlcnlfZmVlOioqIE1vbnRvIGRlIHRhcmlmYXMgY29icmFkYXMgcG9yIHJlY3VwZXJhciBsYSBkZXVkYSBkZXNwdcOpcyBkZSBoYWJlciBzaWRvIGNvYnJhZGEuDQotICAgKipsYXN0X3B5bW50X2FtbnQ6KiogTW9udG8gdG90YWwgZGVsIMO6bHRpbW8gcGFnbyByZWNpYmlkby4NCg0KIyMjIDMuNC4yIEV2YWx1YWNpw7NuDQoNCkxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBlbiBlbCBjb25qdW50byBkZSBlbnRyZW5hbWllbnRvIHNlIHJlc3VtZW4gZW4gbGEgc2lndWllbnRlIHRhYmxhIGdlbmVyYWRhIHBvciBlbCBjw7NkaWdvIGVuY2FyZ2FkbyBkZSByZWFsaXphciBsYSBldmFsdWFjacOzbjoNCg0KIVtdKGltYWdlcy9pbWFnZS5wbmcpDQoNCioqRmlndXJhIDQuKiogVGFibGEgZGUgcmVzdWx0YWRvcyBkZSBYR0Jvb3N0IGVuIGVsIGNvbmp1bnRvIGRlIGVudHJlbmFtaWVudG8gY29ycmVnaWRvDQoNCkRlIGlndWFsIGZvcm1hLCBhIGNvbnRpbnVhY2nDs24gc2UgdGllbmUgbGEgdGFibGEgcmVzcGVjdGl2YSBwYXJhIGVsIGNvbmp1bnRvIGRlIHRlc3RpbmcuDQoNCiFbXShpbWFnZXMvaW1hZ2UtMDEucG5nKQ0KDQoqKkZpZ3VyYSA1LioqIFRhYmxhIGRlIHJlc3VsdGFkb3MgZGUgWEdCb29zdCBlbiBlbCBjb25qdW50byBkZSB0ZXN0aW5nIGNvcnJlZ2lkbw0KDQojIyMgMy40LjMuIENvbmNsdXNpb25lcyBtb2RlbGFkbyBYR0Jvb3N0DQoNCkRlIGxvcyBhbnRlcmlvcmVzIHJlc3VsdGFkb3Mgc2Ugb2J0dXZpZXJvbiBsYXMgc2lndWllbnRlcyBjb25jbHVzaW9uZXMgeSBhcHJlbmRpemFqZXM6DQoNCi0gICBBaG9yYSBzw60sIHNlIGN1ZW50YW4gY29uIHZhbG9yZXMgZGUgbGFzIG3DqXRyaWNhcyBtw6FzIHJhem9uYWJsZXMsIHkgcG9yIGxvIHRhbnRvIHNlIHB1ZWRlIGNvbmNsdWlyIHF1ZSBzZSBoYSByZXN1ZWx0byBlbCBwcm9ibGVtYSBkZWwgZGF0YSBsZWFrYWdlLg0KLSAgIERlYmlkbyBhbCBkZXNiYWxhbmNlIGRlIGNsYXNlcywgc2UgcHVlZGUgbm90YXIgcXVlIGVsIG1vZGVsbyB0aWVuZSB1biBidWVuIHJlbmRpbWllbnRvIGdlbmVyYWwgaWRlbnRpZmljYW5kbyBhIGxhcyBwZXJzb25hcyBxdWUgcGFnYW4gc3VzIGRldWRhcyAoZjEgc2NvcmUgMC45KSwgcGVybyBubyBsbyBlcyBhIGxhIGhvcmEgZGUgaWRlbnRpZmljYXIgbG9zIGNhc29zIGRlIHBlcnNvbmFzIHF1ZSBubyBwYWdhbiAoZjEgc2NvcmUgMC40KS4gRXN0byBlcyBjcsOtdGljbywgeWEgcXVlIGVsIGludGVyw6lzIHByaW5jaXBhbCBlc3TDoSBlbiBpZGVudGlmaWNhciBhIGVzdG9zIMO6bHRpbW9zIHBhcmEgbWl0aWdhciBlbCByaWVzZ28gZGUgZGFyIHByw6lzdGFtb3MgcXVlIG5vIHNlIHZhbiBhIHBhZ2FyIGRlc3B1w6lzLg0KDQo8YSBuYW1lPSJpdTIyLiI+PC9hPg0KDQojIyAzLjUgTW9kZWxvIDM6IE11bHRpTGF5ZXIgUGVyY2VwdHJvbg0KDQojIyMgMy41LjEgRGVmaW5pY2nDs24gZGVsIG1vZGVsbw0KDQpQYXJhIGNyZWFyIGVsIG1vZGVsbywgc2Ugb3B0w7MgcG9yIHV0aWxpemFyIGxhIGhlcnJhbWllbnRhIFB5VG9yY2ggcGFyYSBjcmVhciB1biBtb2RlbG8gbXVsdGlwZXJjZXB0cm9uLiBFbCBtb2RlbG8gY29tbyB0YWwgZXN0w6EgZGVmaW5pZG8gZW4gbGEgc2lndWllbnRlIGNsYXNlOg0KDQpgYGB7cHl0aG9ufQ0KY2xhc3MgTUxQKG5uLk1vZHVsZSk6DQogICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0X2RpbSwgbl9jbGFzc2VzKToNCiAgICAgICAgc3VwZXIoTUxQLCBzZWxmKS5fX2luaXRfXygpDQogICAgICAgIA0KICAgICAgICBzZWxmLm1vZGVsID0gbm4uU2VxdWVudGlhbCgNCiAgICAgICAgICAgIG5uLkxpbmVhcihpbnB1dF9kaW0sIDEyOCksDQogICAgICAgICAgICBubi5SZUxVKCksDQogICAgICAgICAgICBubi5CYXRjaE5vcm0xZCgxMjgpLA0KICAgICAgICAgICAgbm4uRHJvcG91dCgwLjMpLA0KICAgICAgICAgICAgbm4uTGluZWFyKDEyOCwgNjQpLA0KICAgICAgICAgICAgbm4uUmVMVSgpLA0KICAgICAgICAgICAgbm4uQmF0Y2hOb3JtMWQoNjQpLA0KICAgICAgICAgICAgbm4uRHJvcG91dCgwLjMpLA0KICAgICAgICAgICAgbm4uTGluZWFyKDY0LCBuX2NsYXNzZXMpDQogICAgICAgICkNCiAgICANCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4KToNCiAgICAgICAgcmV0dXJuIHNlbGYubW9kZWwoeCkNCg0KYGBgDQoNClBhcmEgZWwgZW50cmVuYW1pZW50bywgc2UgdXRpbGl6w7MgY29tbyBmdW5jacOzbiBkZSBww6lyZGlkYSBsYSBmdW5jacOzbiBDcm9zc0VudHJvcHlMb3NzLCB5IGNvbW8gb3B0aW16YWRvciwgc2Ugb3B0w7MgcG9yIHVzYXIgZWwgb3B0aW1pemFkb3IgQURBTS4gU2UgdXRpbGl6YXJvbiAxMCDDqXBvY2FzIHBhcmEgZW50cmVuYXIgZWwgcmVzcGVjdGl2byBtb2RlbG8NCg0KIyMjIDMuNS4yIEV2YWx1YWNpw7NuDQoNCkxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBlbiBlbCBjb25qdW50byBkZSBlbnRyZW5hbWllbnRvIHNlIHJlc3VtZW4gZW4gbGEgc2lndWllbnRlIHRhYmxhIGdlbmVyYWRhIHBvciBlbCBjw7NkaWdvIGVuY2FyZ2FkbyBkZSByZWFsaXphciBsYSBldmFsdWFjacOzbjoNCg0KIVtdKGltYWdlcy9pbWFnZS0wNC5wbmcpDQoNCioqRmlndXJhIDYuKiogVGFibGEgZGUgcmVzdWx0YWRvcyBkZSBNdWx0aWxheWVyIFBlcmNlcHRyb25lbiBlbCBjb25qdW50byBkZSBlbnRyZW5hbWllbnRvIGNvcnJlZ2lkbw0KDQpEZSBpZ3VhbCBmb3JtYSwgYSBjb250aW51YWNpw7NuIHNlIHRpZW5lIGxhIHRhYmxhIHJlc3BlY3RpdmEgcGFyYSBlbCBjb25qdW50byBkZSB0ZXN0aW5nLg0KDQohW10oaW1hZ2VzL2ltYWdlLTA1LnBuZykNCg0KKipGaWd1cmEgNy4qKiBUYWJsYSBkZSByZXN1bHRhZG9zIGRlIE11bHRpbGF5ZXIgUGVyY2VwdHJvbiBlbiBlbCBjb25qdW50byBkZSB0ZXN0aW5nIGNvcnJlZ2lkbw0KDQojIyMgMy41LjMgQ29uY2x1c2lvbmVzIG11bHRpbGF5ZXIgcGVyY2VwdHJvbg0KDQotICAgU2UgdGllbmUgdW5hIHNpdHVhY2nDs24gc2ltaWxhciBhIGNvbiBlbCBhbnRlcmlvciBtb2RlbG8sIHBlcm8gZXN0YSB2ZXogZWwgbW9kZWxvIHB1ZG8gY2xhc2lmaWNhciBsb3MgdmVyZGFkZXJvcyBwb3NpdGl2b3MgYSBsYSBwZXJmZWNjacOzbi4NCg0KLSAgIFNpbiBlbWJhcmdvLCBkZWJpZG8gYWwgZGVzYmFsYW5jZSBzaWd1ZSBlc3RhbmRvIGxhIGRpZmljdWx0YWQgY29uIGxhIHNlZ3VuZGEgY2F0ZWdvcsOtYSwgbG8gY3VhbCBzaWd1ZSBzaWVuZG8gbXV5IGNyw610aWNvLg0KDQotICAgVGFsdmV6IGNvbiBjYW1iaW9zIGJyZXZlcyBlbiBsYSByZWQgbmV1cm9uYWwgY3JlYWRhIHB1ZWRhIG1lam9yYXIgdW4gcG9jbywgcGVybyBzaSBubyBzZSB0cmF0YSBlbCBkZXNiYWxhbmNlIHNlIHRlbmRyw6EgZWwgbWlzbW8gcHJvYmxlbWEuDQoNCjxhIG5hbWU9Iml1MjMuIj48L2E+DQoNCiMjIDMuNiBDb25jbHVzaW9uZXMgcGFydGUgMw0KDQotICAgTGEgZGl2aXNpw7NuIDcwLzMwIGRlIGVudHJlbmFtaWVudG8geSBwcnVlYmEgcGVybWl0acOzIGdhcmFudGl6YXIgcXVlIGFtYmFzIHBhcnRpY2lvbmVzIHR1dmllcmFuIHVuYSByZXByZXNlbnRhY2nDs24gYmFsYW5jZWFkYSBkZSBsYXMgY2xhc2VzLCBsbyBjdWFsIGVzIGNydWNpYWwgcGFyYSBwcm9ibGVtYXMgZGUgY2xhc2lmaWNhY2nDs24gYmluYXJpYSB5IGVzcGVjaWFsbWVudGUgw7p0aWwgZW4gcHJlc2VuY2lhIGRlIGRlc2JhbGFuY2UuDQotICAgRWwgbW9kZWxvIGluaWNpYWwgZGUgWEdCb29zdCBvZnJlY2nDsyByZXN1bHRhZG9zIHByb21ldGVkb3JlcywgYXVucXVlIGluaWNpYWxtZW50ZSBkZW1hc2lhZG8gYnVlbm9zLCBsbyBjdWFsIGxsZXbDsyBhIHNvc3BlY2hhciBkZSB1biBwb3NpYmxlIHByb2JsZW1hIGRlIGRhdGEgbGVha2FnZS4gRXN0byBkZW11ZXN0cmEgbGEgdXRpbGlkYWQgZGUgZXN0ZSBtb2RlbG8gY29tbyB1biBiYXNlbGluZSBmdWVydGUgcGFyYSBldmFsdWFyIGNvbXBhcmF0aXZhbWVudGUgb3Ryb3MgZW5mb3F1ZXMgbcOhcyBjb21wbGVqb3MgY29tbyBsYXMgcmVkZXMgbmV1cm9uYWxlcy4NCi0gICBMYSBkZXRlY2Npw7NuIGRlIHZhcmlhYmxlcyByZWxhY2lvbmFkYXMgZGlyZWN0YW1lbnRlIGNvbiBlbCByZXN1bHRhZG8gYSBwcmVkZWNpciAoY29tbyBwYWdvcyByZWFsaXphZG9zLCBpbnRlcmVzZXMgcmVjaWJpZG9zLCBldGMuKSBjb25maXJtw7MgbGEgZXhpc3RlbmNpYSBkZSB1bmEgZnVnYSBkZSBpbmZvcm1hY2nDs24uIFN1IGV4Y2x1c2nDs24gZnVlIGZ1bmRhbWVudGFsIHBhcmEgb2J0ZW5lciByZXN1bHRhZG9zIHJlYWxpc3RhcyB5IGZpYWJsZXMsIGV2aWRlbmNpYW5kbyBsYSBpbXBvcnRhbmNpYSBkZSB1bmEgbGltcGllemEgcmlndXJvc2EgZGUgbG9zIGRhdG9zIGJhc2FkYSBlbiB1biBidWVuIGVudGVuZGltaWVudG8gZGVsIG5lZ29jaW8uDQotICAgQSBwZXNhciBkZSBjb3JyZWdpciBlbCBsZWFrYWdlLCBhbWJvcyBtb2RlbG9zIChYR0Jvb3N0IHkgTUxQKSBldmlkZW5jaWFyb24gZGlmaWN1bHRhZGVzIHBhcmEgaWRlbnRpZmljYXIgY29ycmVjdGFtZW50ZSBhIGxvcyBkZXVkb3JlcyAobGEgY2xhc2UgbWlub3JpdGFyaWEpLCBsb2dyYW5kbyB1biBGMSBzY29yZSBiYWpvIChjZXJjYW5vIGEgMC40KSBlbiBlc2EgY2xhc2UsIG1pZW50cmFzIHF1ZSBlbCBkZXNlbXBlw7FvIGVuIGxhIGNsYXNlIG1heW9yaXRhcmlhIGZ1ZSBtdWNobyBtZWpvci4gRXN0byBlcyBwcm9ibGVtw6F0aWNvIGRlc2RlIGVsIHB1bnRvIGRlIHZpc3RhIGRlIG5lZ29jaW8sIHlhIHF1ZSBlbCBmb2NvIGVzdMOhIGVuIGlkZW50aWZpY2FyIGNvcnJlY3RhbWVudGUgbG9zIGNhc29zIGRlIGFsdG8gcmllc2dvLg0KLSAgIEVsIG1vZGVsbyBkZSByZWQgbmV1cm9uYWwgbW9zdHLDsyB1biByZW5kaW1pZW50byBjb21wYXJhYmxlIGFsIGRlIFhHQm9vc3QsIGNvbiBpbmNsdXNvIG1lam9yIHByZWNpc2nDs24gcGFyYSB2ZXJkYWRlcm9zIHBvc2l0aXZvcy4gU2luIGVtYmFyZ28sIGVsIHByb2JsZW1hIGRlIGRlc2JhbGFuY2UgcGVyc2lzdGnDsywgbG8gcXVlIGluZGljYSBxdWUgYWp1c3RlcyBlbiBsYSBhcnF1aXRlY3R1cmEgcG9yIHPDrSBzb2xvcyBubyBzZXLDoW4gc3VmaWNpZW50ZXMuDQotICAgRWwgbW9kZWxhZG8gbm8gc29sbyBzaXJ2ZSBwYXJhIGFqdXN0YXIgaGlwZXJwYXLDoW1ldHJvcyB5IGFycXVpdGVjdHVyYXMsIHNpbm8gdGFtYmnDqW4gcGFyYSB2YWxpZGFyIHN1cHVlc3RvcywgZGV0ZWN0YXIgcHJvYmxlbWFzIGVuIGxvcyBkYXRvcyB5IGNvbXByZW5kZXIgbGFzIGxpbWl0YWNpb25lcyBkZSBsb3MgbW9kZWxvcyBhbnRlIGNhcmFjdGVyw61zdGljYXMgZGVsIGRhdGFzZXQgY29tbyBlbCBkZXNiYWxhbmNlIG8gbGEgY2FsaWRhZCBkZSBsYXMgZmVhdHVyZXMuDQoNCjxhIG5hbWU9Iml1MjQuIj48L2E+DQoNCiMgQ2Fzb3MgZGUgdXNvIGFsdGVybmF0aXZvcw0KDQpFbCBhbsOhbGlzaXMgeSBsYSBkZXRlY2Npw7NuIGRlIHBlcnNvbmFzIGNvbiBhbHRvIHJpZXNnbyBkZSBpbXBhZ28gY3JlZGl0aWNpbyBubyBzb2xvIHNvbiBmdW5kYW1lbnRhbGVzIHBhcmEgbGEgZ2VzdGnDs24gZmluYW5jaWVyYSBkZSBsYXMgZW50aWRhZGVzIHByZXN0YW1pc3Rhcywgc2lubyBxdWUgdGFtYmnDqW4gcHVlZGVuIGV4dHJhcG9sYXJzZSBhIG90cm9zIGRvbWluaW9zIG1lZGlhbnRlIGVsIGRlc2Fycm9sbG8gZGUgbW9kZWxvcyBwcmVkaWN0aXZvcyBzaW1pbGFyZXMuDQoNCkVzdGUgdGlwbyBkZSBlbmZvcXVlIGJhc2FkbyBlbiBkYXRvcyBwZXJtaXRlIGlkZW50aWZpY2FyIHBhdHJvbmVzIGRlIGNvbXBvcnRhbWllbnRvIHkgZmFjdG9yZXMgZGUgcmllc2dvIHF1ZSwgdW5hIHZleiBjb21wcmVuZGlkb3MsIHB1ZWRlbiBhcGxpY2Fyc2UgYSBwcm9ibGVtYXMgY29tbyBsYSBkZXRlY2Npw7NuIHRlbXByYW5hIGRlIGZyYXVkZXMgZmluYW5jaWVyb3MsIGxhIGV2YWx1YWNpw7NuIGRlIHJpZXNnbyBlbiBsYSBzdXNjcmlwY2nDs24gZGUgc2VndXJvcyBvIGxhIHByZWRpY2Npw7NuIGRlIGVuZmVybWVkYWRlcyBjcsOzbmljYXMgZW4gZWwgw6FtYml0byBkZSBsYSBzYWx1ZC4NCg0KPGEgbmFtZT0iaXUyNS4iPjwvYT4NCg0KIyBDb25jbHVzaW9uZXMgZmluYWxlcw0KDQpBIGxvIGxhcmdvIGRlbCBkZXNhcnJvbGxvIGRlbCBwcm95ZWN0bywgc2UgZXZpZGVuY2nDsyBxdWUgbGEgY2FsaWRhZCBkZWwgcHJlcHJvY2VzYW1pZW50byBlcyBkZXRlcm1pbmFudGUgcGFyYSBlbCDDqXhpdG8gZGVsIG1vZGVsYWRvLCB5YSBxdWUgbGFzIGRlY2lzaW9uZXMgdG9tYWRhcyBkdXJhbnRlIGxhIGluZ2VuaWVyw61hIGRlIGZlYXR1cmVzIOKAlGNvbW8gbGEgaW1wdXRhY2nDs24gZGUgdmFsb3JlcyBmYWx0YW50ZXMsIGVsIGVzY2FsYWRvIGRlIHZhcmlhYmxlcyBudW3DqXJpY2FzIHkgbGEgY29kaWZpY2FjacOzbiBhZGVjdWFkYSBkZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2Fz4oCUIHBlcm1pdGllcm9uIGNvbnN0cnVpciB1biBjb25qdW50byBkZSBkYXRvcyBzw7NsaWRvIHkgYXB0byBwYXJhIGVsIGVudHJlbmFtaWVudG8gZGUgbW9kZWxvcy4gTm8gb2JzdGFudGUsIGxhIGV4cGVyaWVuY2lhIGNvbiBlbCBwcmltZXIgbW9kZWxvIFhHQm9vc3QgdGFtYmnDqW4gZGVtb3N0csOzIHF1ZSBlbCBkYXRhIGxlYWthZ2UgcHVlZGUgaW52YWxpZGFyIGNvbXBsZXRhbWVudGUgbG9zIHJlc3VsdGFkb3MsIHJlc2FsdGFuZG8gbGEgbmVjZXNpZGFkIGRlIGNvbXByZW5kZXIgYSBwcm9mdW5kaWRhZCBlbCBzaWduaWZpY2FkbyB5IGxhIHRlbXBvcmFsaWRhZCBkZSBjYWRhIHZhcmlhYmxlIHBhcmEgZXZpdGFyIGZ1Z2FzIGRlIGluZm9ybWFjacOzbi4NCg0KVW5hIHZleiBjb3JyZWdpZG8gZXN0ZSBwcm9ibGVtYSwgbG9zIG1vZGVsb3MgZW50cmVuYWRvcyBkZWphcm9uIGVuIGV2aWRlbmNpYSBvdHJvIGdyYW4gZGVzYWbDrW86IGVsIGRlc2JhbGFuY2UgZGUgY2xhc2VzLiBBIHBlc2FyIGRlIG9idGVuZXIgYnVlbm9zIHJlc3VsdGFkb3MgZ2VuZXJhbGVzLCB0YW50byBYR0Jvb3N0IGNvbW8gZWwgbW9kZWxvIE11bHRpTGF5ZXIgUGVyY2VwdHJvbiBtb3N0cmFyb24gc2VyIGluZWZpY2llbnRlcyBwYXJhIGRldGVjdGFyIGNvcnJlY3RhbWVudGUgYSBsb3MgdXN1YXJpb3MgcXVlIG5vIHBhZ2FuIHN1cyBkZXVkYXMsIGxvIGN1YWwgZXMgY3LDrXRpY28gZGFkbyBlbCBvYmpldGl2byBkZWwgcHJvYmxlbWEuDQoNCkZpbmFsbWVudGUsIHNlIGNvbmNsdXllIHF1ZSB1dGlsaXphciBtb2RlbG9zIG3DoXMgY29tcGxlam9zIG5vIGdhcmFudGl6YSBtZWpvcmVzIHJlc3VsdGFkb3Mgc2kgbm8gc2UgYWJvcmRhIGRlIGZvcm1hIGFkZWN1YWRhIGxhIGVzdHJ1Y3R1cmEgZGVsIHByb2JsZW1hOyBwb3IgZWxsbywgZWwgZm9jbyBkZWJlIGVzdGFyIHRhbnRvIGVuIGxhIGNhbGlkYWQgZGUgbG9zIGRhdG9zIGNvbW8gZW4gZXN0cmF0ZWdpYXMgZXNwZWPDrWZpY2FzIHF1ZSByZXNwb25kYW4gYSBsb3MgcmV0b3MgcGFydGljdWxhcmVzIGRlbCBkb21pbmlvLCBjb21vIGVsIGJhbGFuY2VvIGRlIGNsYXNlcyBvIGVsIGFqdXN0ZSBmaW5vIGRlIG3DqXRyaWNhcy4NCg0KPGEgbmFtZT0iaXUyNi4iPjwvYT4NCg0KIyBSZXBvcnRlIGRlIGNvbnRyaWJ1Y2nDs24gaW5kaXZpZHVhbA0KDQojIyAtIExlb25hcmRvIEZlZGVyaWNvIENvcm9uYSBUb3JyZXMNCg0KLSAgIERlZmluaWNpw7NuIHkgZXNjcml0dXJhIGRlIGVzdHJ1Y3R1cmEgZGVsIHJlcG9ydGUuDQotICAgQ29sYWJvcmFjacOzbiBlbiBjcmVhY2nDs24gZGUgdmlkZW8gcHJvbW9jaW9uYWwuDQotICAgQXBvcnRlcyBlbnRyZWdhYmxlIGVzY3JpdG8uDQoNCiMjIC0gRGF2aWQgRXNjb2JhciBSdWl6DQoNCi0gICBSZWFsaXphY2nDs24gZGUgbGltcGllemEgZGUgZGF0b3MuDQoNCi0gICBSZWFsaXphY2nDs24gZGUgRURBLg0KDQotICAgUmVhbGl6YWNpw7NuIGRlIGluZ2VuaWVyw61hIGRlIGZlYXR1cmVzLg0KDQotICAgUmVhbGl6YWNpw7NuIGRlIHByb2Nlc28gZGUgbW9kZWxhZG8uDQoNCi0gICBDb2xhYm9yYWNpw7NuIGVuIGNyZWFjacOzbiBkZSB2aWRlbyBwcm9tb2Npb25hbC4NCg0KIyMgLSBKb2hhbiBTZWJhc3Rpw6FuIFJvYmxlcyBSaW5jw7NuDQoNCi0gICBEZXNhcnJvbGxvIGRlbCBiYWNrZW5kIGRlIGxhIGFwbGljYWNpw7NuIHdlYi4NCg0KLSAgIEFwb3lvIGVuIGRlc3BsaWVndWUgZGUgbGEgYXBsaWNhY2nDs24uDQoNCi0gICBBcG95byBlbiBkZXNhcnJvbGxvIGZyb250ZW5kLg0KDQotICAgQXBveW8gZW4gY29uZXhpw7NuIGRlIEFQSSBkZWwgbW9kZWxvIGNvbiB2aXN0YXMgZGUgRGphbmdvLg0KDQojIyAtIFNlYmFzdGlhbiBTb3RvIEFyY2lsYQ0KDQotICAgRGVzYXJyb2xsbyBmcm9udGVuZCBkZSBsYSBhcGxpY2FjacOzbiB3ZWIuDQoNCi0gICBBcG95byBlbiBjb25leGnDs24gZGUgQVBJIGRlbCBtb2RlbG8gY29uIHZpc3RhcyBkZSBEamFuZ28uDQoNCi0gICBBcG95byBlbiBkZXNwbGllZ3VlIGRlIGxhIGFwbGljYWNpw7NuLg0KDQotICAgQXBvcnRlcyBlbnRyZWdhYmxlIGVzY3JpdG8uDQoNCjxhIG5hbWU9Iml1MjcuIj48L2E+DQoNCiMgUmVwb3NpdG9yaW8gZGUgR2l0SHViIGRlbCBwcm95ZWN0bw0KDQpbaHR0cHM6Ly9naXRodWIuY29tL2RydWl6MzUvUk5BQkkyMDI1LTEtRXF1aXBvMy9dKGh0dHBzOi8vZ2l0aHViLmNvbS9kcnVpejM1L1JOQUJJMjAyNS0xLUVxdWlwbzMvdHJlZS9tYWluKXsudXJpfQ0KDQo8YSBuYW1lPSJpdTI4LiI+PC9hPg0KDQojIExpbmsgaGFjaWEgYXBwIHdlYiBkZWwgcHJveWVjdG8NCg0KPGh0dHA6Ly8zLjEwMS42Ni4xMjc6ODAwMC9wcmVkaWN0b3IvPg0KDQo8YSBuYW1lPSJpdTI5LiI+PC9hPg0KDQojIEJpYmxpb2dyYWbDrWENCg0KR2Vla3MgZm9yIEdlZWtzLiAoMjAyNSkuICpFdmFsdWF0aW9uIE1ldHJpY3MgaW4gTWFjaGluZSBMZWFybmluZyouIEdlZWtzIGZvciBHZWVrcy4gUmVjdXBlcmFkbyBlbCAxMiBkZSBqdW5pbyBkZSAyMDI1IGRlIDxodHRwczovL3d3dy5nZWVrc2ZvcmdlZWtzLm9yZy9tZXRyaWNzLWZvci1tYWNoaW5lLWxlYXJuaW5nLW1vZGVsLz4NCg0KSUJNLiAoMjAyNCkuICrCv1F1w6kgZXMgWEdCb29zdD8qIElCTS4gPGh0dHBzOi8vd3d3LmlibS5jb20vbXgtZXMvdGhpbmsvdG9waWNzL3hnYm9vc3Q+DQoNCkludGVyYWN0aXZlIENoYW9zLiAocy5mLikuICpSb2J1c3QgU2NhbGVyKi4gSW50ZXJhY3RpdmUgQ2hhb3MuIFJlY3VwZXJhZG8gZWwgMTIgZGUganVuaW8gZGUgMjAyNSBkZSA8aHR0cHM6Ly9pbnRlcmFjdGl2ZWNoYW9zLmNvbS9lcy9tYW51YWwvdHV0b3JpYWwtZGUtbWFjaGluZS1sZWFybmluZy9yb2J1c3RzY2FsZXI+DQoNCkthZ2dsZS4gKHMuZi4pLiAqQ3JlZGl0IFJpc2sgQW5hbHlzaXMqLiBLYWdnbGUuIFJlY3VwZXJhZG8gZWwgMTIgZGUganVuaW8gZGUgMjAyNSBkZSA8aHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9yYW5hZGVlcC9jcmVkaXQtcmlzay1kYXRhc2V0L2RhdGE+DQoNClN0b2ppbGprb3ZpYy4gKDIwMjUpLiAqU3BsaXQgWW91ciBEYXRhc2V0IFdpdGggc2Npa2l0LWxlYXJuJ3MgdHJhaW5fdGVzdF9zcGxpdCgpKi4gUmVhbCBQeXRob24uIDxodHRwczovL3JlYWxweXRob24uY29tL3RyYWluLXRlc3Qtc3BsaXQtcHl0aG9uLWRhdGE+DQoNClN3YXlhbS4gKDIwMjMpLiAqRXhwbG9yaW5nIERpZmZlcmVudCBFbmNvZGluZyBUZWNobmlxdWVzIGZvciBNYWNoaW5lIExlYXJuaW5nIE1vZGVscyouIE1lZGl1bS4gW2h0dHBzOi8vbWVkaXVtLmNvbS9cQHN3YXlhbXBhdGlsNzkxOC9leHBsb3JpbmctZGlmZmVyZW50LWVuY29kaW5nLXRlY2huaXF1ZXMtZm9yLW1hY2hpbmUtbGVhcm5pbmctbW9kZWxzLWI3NjJlM2I1NDZkYl0oaHR0cHM6Ly9tZWRpdW0uY29tL0Bzd2F5YW1wYXRpbDc5MTgvZXhwbG9yaW5nLWRpZmZlcmVudC1lbmNvZGluZy10ZWNobmlxdWVzLWZvci1tYWNoaW5lLWxlYXJuaW5nLW1vZGVscy1iNzYyZTNiNTQ2ZGIpDQoNClN5bmFwc2UtQW5hbHl0aWNzLiAocy5mLikuICpDcmVkaXQgU2NvcmluZyBFeHBsYWluZWQgLSBUaGUgUHJvYmxlbSBTdGF0ZW1lbnQqLiBTeW5hcHNlIEFuYWx5dGljcy4gUmVjdXBlcmFkbyBlbCAxMiBkZSBqdW5pbyBkZSAyMDI1IGRlIDxodHRwczovL3N5bmFwc2UtYW5hbHl0aWNzLmlvL2Jsb2cvZ3VpZGUtdG8tY3JlZGl0LXNjb3JpbmctcGFydC0xLXRoZS1wcm9ibGVtLXN0YXRlbWVudD4NCg0KV2lraXBlZGlhLiAocy5mLikuICpBcnRpZmljaWFsIE5ldXJhbCBOZXR3b3JrcyouIFdpa2lwZWRpYS4gUmVjdXBlcmFkbyBlbCAxMiBkZSBqdW5pbyBkZSAyMDI1IGRlIDxodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9SZWRfbmV1cm9uYWxfYXJ0aWZpY2lhbD4NCg==