1. Introducción al YAML.
En esta sección se presenta una breve introducción al lenguaje del YAML (Yet Another Markdown Language), con el que se configuran las características generales que se arrojarán en el documento de salida o output, una vez que el documento en formato Markdown haya sido renderizado (con el comando knitr()).
Es importante tener en cuenta que un documento en formato .Rmd (o de R Markdown) se integra por 3 partes:
- El texto o cuerpo del documento, que se redacta con la sintaxis de Markdown,
- Los trozos de código o chunks que contienen los códigos en lenguaje de R, y
- El YAML o los metadatos y características de formato del documento general.
En este documento se trabajarán varios elementos para configurar el YAML, los que se considera que son de interés para la elaboración de documentos y reportes de investigación especialmente dirigidos al ámbito de las Ciencias Sociales. Para ello se abordan:
- Características generales del YAML.
- Características del YAML para un documento de salida en formato .html.
- Características del YAML para un documento de salida en formato .pdf.
- Add-in de la paquetería
ymlthis() para diseñar YAML.
- Insertar referencias bibliográficas en el texto e integración del listado bibliográfico.
- Uso de plantillas de artículos para la elaboración de artículos científicos con
distill(), rticles() y papaja().
2. Características generales del YAML.
El YAML se usualmente se encuentra ubicado en la parte superior del documento de R Markdown, pues así lo posiciona por defecto el sistema. Este apartado es identificable ya que se encuentra separado por tres guiones en la parte superior y tres en la parte inferior. Sin embargo, los documentos Markdown puede indentificar más características del YAML en el resto del documento si es que vuelven a encontrar una sección que se encuentre separada del resto mediante la misma instrucción de guiones superiores e inferiores. Al final, al renderizar el documento de salida, lo que ocurre es que el sistema lee como una sola sección a todas las partes enmarcadas por los guiones.
Las características generales o básicas del YAML contienen la información siguiente: título (“title”), autor (“author”), fecha (“date”) y formato de salida (“output”). La manera más común de configurar estas características es mediante la ventada de diálogo que se despliega al momento de selección la apertura de un nuevo documento de R Markdown.
Tras seleccionar y rellenar las opciones básicas con el texto deseado, se observará que el YAML se ubicará en la parte superior de la nueva hoja de R Markdown y, además, estará delimitada del resto del documento por los tres guiones intermedios en la parte superior e inferior. Y en su interior se encontrarán los elementos básicos de los metadatos. También es posible observar que el texto rellenado previamente aparecerá entrecomillado en el YAML.
---
title: "Diseño de YAML"
author: "Gustavo Martínez Valdes"
date: "3/3/2022"
output: html_document
---
Una vez renderizado el documento de salida se observará que, en un primer momento, el título del documento aparecerá en la parte superior del texto y se mostrarán en un tamaño de fuente mayor al resto del documento. En el caso de esta sección es posible, también, añadir un subtítulo mediante el comando subtitle: "texto del subtítulo".
---
title: "Diseño de YAML"
subtitle: "este es mi primer borrador"
---
Una vez renderizado, el texto del subtítulo aparecerá debajo del título general, pero en un tamaño de letra menor.
Por otro lado, el nombre del autor aparecerá debajo del título, y será renderizado en un tamaño de fuente menor. En dicho renglón es posible incluir a más de un autor a partir de separar los nombres mediante una coma, por ejemplo: author: "nombre apellido1, nombre apellido2".
---
author: "nombre apellido 1, nombre apellido 2"
---
En el caso del elemento de la fecha, por defecto este dato suele ser rellenado por el sistema y para ello recupera la información del sistema. En base a ello, el documento retoma la fecha en que el documento fue elaborado originalmente, pero esto puede ser modificado manualmente en la sección de YAML para ajustarlo a las necesidades del autor o, también se puede configurar para que se actualice a los momentos en que el documento de R Markdown es renderizado. En este último caso, se puede usar el comando r date: r Sys.Date().
---
date: "Sys.Date()"
---
La característica general final del YAML consiste en definir el formato de salida en que será renderizado el resto de los elementos del documento R Markdown. Los formatos básicos que se pueden seleccionar en la ventaja de diálogo (presentada arriba) son: .doc, .pdf o .html.
Esto se define en la opción output: html_document, por ejemplo para un documento en formato “.html”, output: pdf_document en el caso de uno en formato “.pdf” o output: word_document en caso de solicitar un documento de salida en formato “.doc”.
Además es posible solicitar la renderización de más de un formato de salida desde un mismo YAML, para ello es debe especificar en el argumento del output: los formatos de salida que se desean generar. Por ejemplo si se desean producir dos formatos de un mismo documento R Markdown, uno en “.html” y otro en “.pdf”, se realiza especifica lo siguiente:
---
output:
html_document: default
pdf_document: defaul
---
3. Características del YAML para distintos “outputs”.
Es importante tener en cuenta que las características básicas revisadas anteriormente aplican para todos los documentos R Markdown en general, independientemente del tipo de formato de salida. Sin embargo, también se debe considerar que existen características o elementos particulares según el output solicitado. Esto es, no necesariamente las características de un YAML para un formato .html aplican igualmente para un documento en formato .pdf. Para distinguir estas diferencias es muy útil consultar la guía de referencia de R Markdown diseñada por R Studio.
3.2. Elementos básicos del YAML para el formato “.pdf”.
En el caso de un documento de salida en formato .pdf, otros son los parámetros que se pueden modificar. En este caso es importante recordar que el formato de salida se asemejará a un documento escrito en páginas blancas ya sea de tamaño “carta” o “A4” u otro, según así se defina.
Aquí se debe tener en cuenta que al renderizar un documento “.Rmd” en un formato de salida en formato .pdf, este es transformado en un proceso intermedio bajo el leguanje “LaTex”, y para ello se utiliza un programa denominado Pandoc. En la página web de Pandoc se pueden revisar de manera completa las variables a incluir en este tipo de documentos. Sin embargo, aquí solo se revisarán algunas de las características más usuales a incluir en el YAML consisten en:
- Tipo de documento: Aquí se puede definir, inicialmente, el tipo de documento que se elaborará, para lo que se usa el comando:
documentclass:, y las opciones de respuesta disponibles son: book, article o report. Por ejemplo:
---
title: "Diseño de YAML"
author: "Gustavo Martínez Valdes"
date: "3/3/2022"
output: pdf_document
documentclass: article #aquí se define que el documento a elaborar es un "artículo".
---
- Organización del texto. Con esta opción se puede especificar la manera en que se presentará el texto visualmente. Para ello se utiliza el comando:
classoption:, y las opciones de respuesta posibles son: twocolumn, landscape o portrait. Esta última es la opción por defecto. Por ejemplo:
---
title: "Diseño de YAML"
author: "Gustavo Martínez Valdes"
date: "3/3/2022"
output: pdf_document
documentclass: article
classoption:
- twocolumns #aquí se define que el texto en cada cuartilla se distribuya en dos columnas.
---
- Tamaño de la hoja de impresión. A partir del comando
papersize:, entre cuyas opciones de respuesta se encuentran a4 o letter, se define el tamaño de la hoja de impresión. Por ejemplo:
---
title: "Diseño de YAML"
author: "Gustavo Martínez Valdes"
date: "3/3/2022"
output: pdf_document
documentclass: article
classoption:
- twocolumns
papersize: letter #aquí se define el tamaño de la hoja de impresión sea de tamaño "carta".
---
- Interlineado. Mediante el comando
linestretch:, y cuyos valores son un vector numérico, se define el tamaño del salto de renglón dentro del documento. Por ejemplo:
---
title: "Diseño de YAML"
author: "Gustavo Martínez Valdes"
date: "3/3/2022"
output: pdf_document
documentclass: article
classoption:
- twocolumns
papersize: letter
linestretch: 1.5 #Aquí se define que el interlineado o el salto entre renglones sea de 1.5.
---
- Tamaño de fuente. El tamaño de la fuente del texto en general puede ser modificada utilizando el comando
fontsize:, y cuyos valores se definen en unidades de “puntos”, por ejemplo: 10pt, 11pt o 12pt.
---
title: "Diseño de YAML"
author: "Gustavo Martínez Valdes"
date: "3/3/2022"
output: pdf_document
documentclass: article
classoption:
- twocolumns
papersize: letter
linestretch: 1.5
fontsize: 12pt #Aquí se define el tamaño de la fuente a uno de 12 puntos.
---
- Márgenes o geometría del texto dentro del documento. Mediante el comando
geometry: se pueden definir el tamaño de los márgenes del texto dentro del documento. Los valores de respuesta de este comando consisten en un vector numérico, a la vez que se puede definir manualmente la unidad métrica en que se desea especificar su tamaño, como pueden ser in (pulgadas), cm(centímetros) o mm (milímetros). Asimismo se pueden utilizar los argumentos top=, bottom=, left= y right= para especificar los márgenes deseados. Por ejemplo:
---
title: "Diseño de YAML"
author: "Gustavo Martínez Valdes"
date: "3/3/2022"
output: pdf_document
documentclass: article
classoption:
- twocolumns
papersize: letter
linestretch: 1.5
fontsize: 12pt
geometry:
- top=3cm #Se define un márgen de 3cm en la parte superior del documento.
- left=2.5cm #Se define un márgen de 2.5cm en la parte izquierda del documento.
---
- Índice o tabla de contenido. En un documento en formato
.pdf también es posible incluir un listado o tabla de contenido así como la opción para solicitar que las secciones reconocidas en la tabla de contenido sean numeradas automáticamente. Para ello se utiliza el comando toc: TRUE así como number_sections: TRUE, por ejemplo:
---
title: "Diseño de YAML"
author: "Gustavo Martínez Valdes"
date: "3/3/2022"
output: pdf_document
documentclass: article
classoption:
- twocolumns
papersize: letter
linestretch: 1.5
fontsize: 12pt
geometry:
- top=3cm
- left=2.5cm
toc: TRUE
number_sections: TRUE
---
- Tipo de fuente. También es posible modificar el tipo de fuente tipográfica de los documentos de salida. Para ello se utiliza el comando
mainfont:, y como respuesta se debe especificar el nombre a alguna de las tipografías pre cargadas en la computadora en el listado tipográfico del disco duro. Se debe tener en cuenta que para que este comando aplique la solicitud de un tipo de fuente deseado, se debe acompañar de un comando adicional que consiste en definir el motor para transformar el documento “.Rmd” a formato “LaTex” y, posteriormente, a uno de tipo “.pdf”. Este comando es latex_engine:, y el motor de transformación debe ser la opción xelatex. De manera que la solicitud para configurar este cambio de fuente es de la siguiente forma:
---
title: "Diseño de YAML"
author: "Gustavo Martínez Valdes"
date: "3/3/2022"
output:
pdf_document:
latex_engine: xelatex #Aquí se define el motor de renderización a LaTex
documentclass: article
classoption:
- twocolumns
papersize: letter
linestretch: 1.5
fontsize: 12pt
geometry:
- top=3cm
- left=2.5cm
toc: TRUE
number_sections: TRUE
mainfont: Arial #Aquí se solicita el cambio del tipo de fuente, que previamente está cargada dentro del listado tipográfico de la computadora de trabajo.
---
4. Paquetería ymlthis() para diseñar YAML y su add-in.
La utilidad del YAML, además de definir los metadados del documento elaborado, así como configurar desde un inicio las características generales del documento, consiste en que una vez que se cuenta con una estructura preferida por el autor, esta puede ser copiada para diseñar otros documentos posteriores. Sin embargo también puede ser engorroso recordar la mayoría de los comandos dentro de un YAML, especialmente al comenzar a conocer y trabajar con el formato “.Rmd”.
Pero existe, adicionalmente, la paquetería ymlthis() que permite manipular de manera más “sencilla” las características del YAML, tomando en consideración el tipo de documento de salida deseado.
Primero se debe instalar dicha paquetería:
install.packages("ymlthis")
Tras activar dicha paquetería con library(ymlthis), el comando básico es yml(). Una vez que se “corre” dicho código, este arroja como resultado el contenido básico de un YAML.
library(ymlthis)
yml()
## ---
## author: Gustavo
## date: '`r format(Sys.Date())`'
## ---
Asimismo, el resultado del YAML a generar se puede adicionar con otros argumentos, como: yml_author(), yml_date(), o yml_output(), además de vincularlos mediante el uso de pipes (%>%), por ejemplo.
yml() %>%
yml_author(c("autor1", "autor2"), affiliation = "institución") %>%
yml_date(lubridate::today()) %>%
yml_output(
word_document(keep_md = TRUE),
bookdown::html_document2()
)
## ---
## author:
## - name: autor1
## affiliation: institución
## - name: autor2
## affiliation: institución
## date: '2022-03-08'
## output:
## word_document:
## keep_md: true
## bookdown::html_document2: default
## ---
4.1. Add-in de ymlthis().
Adicionalmente la paquetería de ymlthis() cuenta con una “add-in”, que se traduce en una ventana emergente que permite, a su vez, apoyar al usuario en la generación del YAML sin la necesidad de escribir código en un “chunk”.
Para activar dicho “add-in” se debe seguir la ruta “Tools” > “addins” > “browse addins” > “ymlthis”. En caso de no usar el mouse para seguir dicha ruta, el comando para activar el “add-in” es ymlthis:::launch_yaml_addin().
ymlthis:::launch_yaml_addin()
Una vez activado el “add-in”, después aparecerá una ventana emergente parecida a la siguiente:
En dicha ventana emergente, el autor tendrá la oportunidad de rellenar diversas opciones, tanto referentes al tipo de documento de salida (.pdf, .html, .doc u otro), así como las características particulares. Y el resultado generado se traduce en una esquela del YAML configurado a partir de las necesidades del autor.
5. Referencias y listado bibliográfico basado en Zotero.
Aquí se revisará el proceso de inserción de citaciones apoyándose en el gestor de referencias bibliográficas de Zotero, que es un software de código abierto.
5.1. Preparación de la base de datos de referencias bibliográficas (“.bib”).
Inicialmente se requiere contar con un archivo con extensión .bib en el que se encuentren enlistadas todas las referencias bibliográficas que se utilizarán en el documento.
Este tipo de archivos consiste en un listado de las referencias bibliográficas que se utilizarán como recursos de un documento, donde cada una de dichas referencias son archivadas bajo un formato especial denominado BibTex, con la siguiente estructura por ejemplo:
@Key{R-base,
title = {R: A Language and Environment for Statistical
Computing},
author = {{R Core Team}},
organization = {R Foundation for Statistical Computing},
address = {Vienna, Austria},
year = {2019},
url = {https://www.R-project.org},
}
Manualmente se puede crear un listado de todas las obras a referenciar en un archivo de texto plano, el que, finalmente, deberá ser guardado con la extensión .bib, y que será necesario para el proceso de insertar citaciones en R Markdown, así como para generar el listado bibliográfico a incluir en el documento de salida.
Crear dicho archivo con extensión .bib es un proceso engorroso, actualmente el gestor bibliográfico de Zotero también permite generar dicho archivo de manera más sencilla.
Desde Zotero se pueden seleccionar las referencias que deberán ser exportadas en formato .bib (apoyado en el plug-in de Better Bib Tex). Esto se traduce en un nuevo archivo con extensión .bib.
Para ello, primero se debe seleccionar la colección de obras seleccionadas en Zotero.
Posteriormente se debe seleccionar el formato de BetterBibTex para su exportación, así como también se recomienda seleccionar la casilla que permite mantener actualizada dicha colección exportada.
Al crear el archivo, es importante seleccionar la opción de Zotero que permite actualizar constantemente al archivo .bib. Esto permitirá incluir en éste último las referencias que sean guardadas en Zotero posteriormente a la creación del archivo .bib.
Una vez creado el archivo de las referencias bibliográficas, debe guardarse en la misma carpeta en la que se encuentra el documento .Rmd.
Posteriormente, el archivo .bib debe ser llamado desde el YAML de R Markdown para que esté disponible y se puedan utilizar las referencias contenidas. El script dentro del YAML para llamar al listado de referencias es bibliography: nombre.bib. Por ejemplo:
---
output: html_document
bibliography: metodologia.bib
---
5.2. Definición del estilo de citación (archivo “.csl”).
Para darle formato a las referencias insertadas en el documento requiere utilizar un archivo con extensión .csl, que contiene la información necesaria para cada uno de los estilos de citación.
Estos archvios .csl pueden ser creados por el autor o también pueden ser importados. Ésta última opción es la más “fácil” de llevar a cabo.
Zotero cuenta con un repositorio de archivos .csl que se pueden importar. Este se encuentra en https://www.zotero.org/styles.
Por ejemplo, en el caso de desear trabajar con el estilo de la American Psychology Association (APA), se debe importar el archivo apa.csl.
Es importante que el archivo se encuentre ubicado en la misma carpeta donde se encuentra guardado el documento .Rmd, Posteriormente, el archivo apa.csl se manda a llamar desde el YAML con el script csl: apa.csl.
---
output: html_document
bibliography: references.bib
csl: apa.csl
---
Una vez que se cuenta con el archivo en formato .bib con el listado de las obras a referencias, así como con el archivo en formato .csl, que contiene la estructura del estilo de citación a utilizar, ya se está listo para comenzar la inserción de referencias bibliográficas así como para integrar el listado bibliográficos en el output.
5.3. Inserción de referencias en el texto.
Para insertar una referencia se utiliza el símbolo @key y se escribe el nombre que el sistema le asignó a cada referencia. El @key se refiere al nombre que le asigna automáticamente el listado de BibTex.
Existen varias maneras de insertar una referencia bibliográfica en el texto:
Insertar una sola obra en una referencia. En caso de insertar una referencia con un solo autor, entre paréntesis: [@key]
Insertar más de una obra en una referencia. En caso de insertar una referencia con más de un autor, entre paréntesis: [@key1; @key2]
Insertar nombre de autor en texto y año entre paréntesis. En caso de insertar el apellido del autor en el texto, el año de la obra aparecerá entre paréntesis: @key
Insertar año entre paréntesis y excluir nombre de autor. En caso de insertar el año de la obra en la referencia entre paréntesis y excluir el nombre del autor: [-@key]
Insertar una obra y definir las páginas consultadas. [@key, pág. 123]
5.4. Incluir sección del listado bibliográfico
Tras insertar las referencias, R Markdown construye el listado bibliográfico ordenado alfabéticamente. Sin embargo se requiere crear una sección específica para ello pues el programa no distingue por sí solo el espacio en el documento para incluirlo.
Para ello es necesario incluir un subapartado (mediante el uso de ##) al final del documento, partir de añadir los signos de numerales pertinentes así como el título “bibliográfía” o correspondiente. Y dicha sección debe estar vacía. De esta manera R Markdown identificará que ese es el espacio donde incluirá la información del listado bibliográfico de la obra.
Final del texto.
## Bibliografía
(espacio vacío)
6. Plantillas de artículos científicos con distill(), rticles() y papaja().
Con el fortalecimiento del criterio de “ciencia abierta” y el aumento de recursos tecnológicos para compartir los elementos de la investigación científica, hoy en día se cuenta con la posibilidad de hacer públicos ya no solo los resultados de un análisis, sino también los datos utilizados así como los códigos de R elaborados y, además, el contenido de los textos. En este sentido, el formato de .Rmd se ha vuelto muy útil para permitir que todos estos elementos de un documento de análisis de datos se pueda compartir de manera abierta al público.
Para ello se cuenta, además, con varias librerías que permiten sistematizar las estructuras de los documentos de .Rmd, en donde un autor solo debe ajustar su contenido a dichas plantillas y, de esa manera, su preocupación se centre en la redacción del texto y en la elaboración de códigos y resultados del análisis de los datos.
Entre las librerías que se revisarán a continuación se encuentran las de ’distill(),rticlesypapaja()`. Las primeras dos librerías se pueden instalar desde el CRAN de R y R Studio:
install.packages("distill")
install.packages("rticles")
En el caso de la librería de papaja(), su instalación se debe realizar directamente desde el repositorio del diseñador. Este proceso requiere apoyarse en otra paquetería denominada devtools().
En caso de no contar previamente con devtools(), una manera para instalarlo es:
if(!"devtools" %in% rownames(installed.packages())) install.packages("devtools")
Posteriormente se puede instalar papaja() desde GitHub de la siguiente manera:
devtools::install_github("crsh/papaja")
6.2. Artículos científicos con distill().
La paquetería distill() consiste en una plantilla básica para la construcción de un artículo científico. Este formato permite integrar tanto texto, signos matemáticos desde “LaTex”, citaciones y pies de página, gráficos y tablas de contenido, entre otros elementos que les son característicos. En la página web de distill() se pueden revisar con detalles todos los elementos que se pueden configurar.
La manera de abrir una plantilla desde distill() consiste en seleccionar este tipo de documento desde la ventana emergente donde se abren los nuevos documentos .Rmd, de la siguiente manera:
A partir de esta platilla de artículo científico, se abre una nueva ventana de un archivo en formato .Rmd que estructura tanto el contenido del texto, así como de los “chunks”. Mientras que la estructura del YAML será la siguiente:
---
title: "Distill for R Markdown"
description: |
Scientific and technical writing, native to the web
date: May 4, 2018
author:
- first_name: "Yihui"
last_name: "Xie"
url: https://github.com/yihui
affiliation: RStudio
affiliation_url: https://www.rstudio.com
orcid_id: 0000-0003-0645-5666
- name: "JJ Allaire"
url: https://github.com/jjallaire
affiliation: RStudio
affiliation_url: https://www.rstudio.com
- name: "Rich Iannone"
url: https://github.com/rich-iannone
affiliation: RStudio
affiliation_url: https://www.rstudio.com
bibliography: biblio.bib
output: distill::distill_article
---
6.3. Artículos científicos para diversas editoriales desde rticles().
Finalmente, la paquetería rticles() se ha vuelto muy útil para la producción de artículos que se ajusten directamente a las necesidades de diversas editoriales, como por ejemplo: Elsevier, Oxford University Press, PLOS, SAGE, Taylos & Francis, entre otras publicaciones específicas. De manera más detallada se puede revisar este listado en la página de la librería.
La manera para revisar y seleccionar la plantilla del artículo a construir es mediante la apertura de la ventana emergente para solicitar un nuevo archivo en formato .Rmd desde R Studio. Tras seleccionar la apertura de una plantilla (“From Template”), se puede observar el listado de todos los formatos de artículos incluidos en la librería rticles(), de la siguiente forma:
El resultado de la selección de la plantilla será variado según el tipo de artículo solicitado, y de esa manera variará, por ejemplo, la estructura del YAML. (por ello ahora no se presenta un resultado particular)
LS0tCnRpdGxlOiAiRGlzZcOxbyBkZSBZQU1MIgphdXRob3I6ICJHdXN0YXZvIE1hcnTDrW5leiBWYWxkZXMiCmRhdGU6ICIzLzMvMjAyMiIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIHRoZW1lOiBjb3NtbwogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojIyAxLiBJbnRyb2R1Y2Npw7NuIGFsIFlBTUwuCgpFbiBlc3RhIHNlY2Npw7NuIHNlIHByZXNlbnRhIHVuYSBicmV2ZSBpbnRyb2R1Y2Npw7NuIGFsIGxlbmd1YWplIGRlbCAqKllBTUwqKiAoWWV0IEFub3RoZXIgTWFya2Rvd24gTGFuZ3VhZ2UpLCBjb24gZWwgcXVlIHNlIGNvbmZpZ3VyYW4gbGFzIGNhcmFjdGVyw61zdGljYXMgZ2VuZXJhbGVzIHF1ZSBzZSBhcnJvamFyw6FuIGVuIGVsIGRvY3VtZW50byBkZSBzYWxpZGEgbyAqKm91dHB1dCoqLCB1bmEgdmV6IHF1ZSBlbCBkb2N1bWVudG8gZW4gZm9ybWF0byAqKk1hcmtkb3duKiogaGF5YSBzaWRvICpyZW5kZXJpemFkbyogKGNvbiBlbCBjb21hbmRvIGBrbml0cigpYCkuXApFcyBpbXBvcnRhbnRlIHRlbmVyIGVuIGN1ZW50YSBxdWUgdW4gZG9jdW1lbnRvIGVuIGZvcm1hdG8gKiouUm1kKiogKG8gZGUgKipSIE1hcmtkb3duKiopIHNlIGludGVncmEgcG9yIDMgcGFydGVzOgoKMS4gRWwgdGV4dG8gbyBjdWVycG8gZGVsIGRvY3VtZW50bywgcXVlIHNlIHJlZGFjdGEgY29uIGxhIHNpbnRheGlzIGRlICoqTWFya2Rvd24qKiwKMi4gTG9zIHRyb3pvcyBkZSBjw7NkaWdvIG8gKipjaHVua3MqKiBxdWUgY29udGllbmVuIGxvcyBjw7NkaWdvcyBlbiBsZW5ndWFqZSBkZSBSLCB5CjMuIEVsICoqWUFNTCoqIG8gbG9zIG1ldGFkYXRvcyB5IGNhcmFjdGVyw61zdGljYXMgZGUgZm9ybWF0byBkZWwgZG9jdW1lbnRvIGdlbmVyYWwuCgpFbiBlc3RlIGRvY3VtZW50byBzZSB0cmFiYWphcsOhbiB2YXJpb3MgZWxlbWVudG9zIHBhcmEgY29uZmlndXJhciBlbCAqKllBTUwqKiwgbG9zIHF1ZSBzZSBjb25zaWRlcmEgcXVlIHNvbiBkZSBpbnRlcsOpcyBwYXJhIGxhIGVsYWJvcmFjacOzbiBkZSBkb2N1bWVudG9zIHkgcmVwb3J0ZXMgZGUgaW52ZXN0aWdhY2nDs24gZXNwZWNpYWxtZW50ZSBkaXJpZ2lkb3MgYWwgw6FtYml0byBkZSBsYXMgKipDaWVuY2lhcyBTb2NpYWxlcyoqLiBQYXJhIGVsbG8gc2UgYWJvcmRhbjoKCjEuIENhcmFjdGVyw61zdGljYXMgZ2VuZXJhbGVzIGRlbCBZQU1MLgoyLiBDYXJhY3RlcsOtc3RpY2FzIGRlbCBZQU1MIHBhcmEgdW4gZG9jdW1lbnRvIGRlIHNhbGlkYSBlbiBmb3JtYXRvICoqLmh0bWwqKi4KMy4gQ2FyYWN0ZXLDrXN0aWNhcyBkZWwgWUFNTCBwYXJhIHVuIGRvY3VtZW50byBkZSBzYWxpZGEgZW4gZm9ybWF0byAqKi5wZGYqKi4KNC4gQWRkLWluIGRlIGxhIHBhcXVldGVyw61hIGB5bWx0aGlzKClgIHBhcmEgZGlzZcOxYXIgKllBTUwqLgo1LiBJbnNlcnRhciByZWZlcmVuY2lhcyBiaWJsaW9ncsOhZmljYXMgZW4gZWwgdGV4dG8gZSBpbnRlZ3JhY2nDs24gZGVsIGxpc3RhZG8gYmlibGlvZ3LDoWZpY28uCjYuIFVzbyBkZSAqcGxhbnRpbGxhcyogZGUgYXJ0w61jdWxvcyBwYXJhIGxhIGVsYWJvcmFjacOzbiBkZSBhcnTDrWN1bG9zIGNpZW50w61maWNvcyBjb24gYGRpc3RpbGwoKWAsIGBydGljbGVzKClgIHkgYHBhcGFqYSgpYC4KCgojIyAyLiBDYXJhY3RlcsOtc3RpY2FzIGdlbmVyYWxlcyBkZWwgKipZQU1MKiouCgpFbCBZQU1MIHNlIHVzdWFsbWVudGUgc2UgZW5jdWVudHJhIHViaWNhZG8gZW4gbGEgcGFydGUgc3VwZXJpb3IgZGVsIGRvY3VtZW50byBkZSBSIE1hcmtkb3duLCBwdWVzIGFzw60gbG8gcG9zaWNpb25hIHBvciBkZWZlY3RvIGVsIHNpc3RlbWEuIEVzdGUgYXBhcnRhZG8gZXMgaWRlbnRpZmljYWJsZSB5YSBxdWUgc2UgZW5jdWVudHJhIHNlcGFyYWRvIHBvciB0cmVzIGd1aW9uZXMgZW4gbGEgcGFydGUgc3VwZXJpb3IgeSB0cmVzIGVuIGxhIHBhcnRlIGluZmVyaW9yLlwgClNpbiBlbWJhcmdvLCBsb3MgZG9jdW1lbnRvcyBNYXJrZG93biBwdWVkZSBpbmRlbnRpZmljYXIgbcOhcyBjYXJhY3RlcsOtc3RpY2FzIGRlbCBZQU1MIGVuIGVsIHJlc3RvIGRlbCBkb2N1bWVudG8gc2kgZXMgcXVlIHZ1ZWx2ZW4gYSBlbmNvbnRyYXIgdW5hIHNlY2Npw7NuIHF1ZSBzZSBlbmN1ZW50cmUgc2VwYXJhZGEgZGVsIHJlc3RvIG1lZGlhbnRlIGxhIG1pc21hIGluc3RydWNjacOzbiBkZSBndWlvbmVzIHN1cGVyaW9yZXMgZSBpbmZlcmlvcmVzLiBBbCBmaW5hbCwgYWwgcmVuZGVyaXphciBlbCBkb2N1bWVudG8gZGUgc2FsaWRhLCBsbyBxdWUgb2N1cnJlIGVzIHF1ZSBlbCBzaXN0ZW1hIGxlZSBjb21vIHVuYSBzb2xhIHNlY2Npw7NuIGEgdG9kYXMgbGFzIHBhcnRlcyBlbm1hcmNhZGFzIHBvciBsb3MgZ3Vpb25lcy5cCkxhcyBjYXJhY3RlcsOtc3RpY2FzIGdlbmVyYWxlcyBvIGLDoXNpY2FzIGRlbCBZQU1MIGNvbnRpZW5lbiBsYSBpbmZvcm1hY2nDs24gc2lndWllbnRlOiB0w610dWxvICjigJx0aXRsZeKAnSksIGF1dG9yICjigJxhdXRob3LigJ0pLCBmZWNoYSAoImRhdGUiKSB5IGZvcm1hdG8gZGUgc2FsaWRhICjigJxvdXRwdXTigJ0pLiBMYSBtYW5lcmEgbcOhcyBjb23Dum4gZGUgY29uZmlndXJhciBlc3RhcyBjYXJhY3RlcsOtc3RpY2FzIGVzIG1lZGlhbnRlIGxhIHZlbnRhZGEgZGUgZGnDoWxvZ28gcXVlIHNlIGRlc3BsaWVnYSBhbCBtb21lbnRvIGRlIHNlbGVjY2nDs24gbGEgYXBlcnR1cmEgZGUgdW4gbnVldm8gZG9jdW1lbnRvIGRlIFIgTWFya2Rvd24uXAoKYGBge3IsIGVjaG89RkFMU0UsIG91dC53aWR0aD0iOTAlIiwgZmlnLmNhcD0iVmVudGFuYSBkZSBhcGVydHVyYSBkZSBudWV2YSBob2phIGRlIFIgTWFya2Rvd24uIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoInZlbnRhbmFfY29uZmlnX2Jhc2ljYV95YW1sLnBuZyIpCmBgYAoKVHJhcyBzZWxlY2Npb25hciB5IHJlbGxlbmFyIGxhcyBvcGNpb25lcyBiw6FzaWNhcyBjb24gZWwgdGV4dG8gZGVzZWFkbywgc2Ugb2JzZXJ2YXLDoSBxdWUgZWwgWUFNTCBzZSB1YmljYXLDoSBlbiBsYSBwYXJ0ZSBzdXBlcmlvciBkZSBsYSBudWV2YSBob2phIGRlIFIgTWFya2Rvd24geSwgYWRlbcOhcywgZXN0YXLDoSBkZWxpbWl0YWRhIGRlbCByZXN0byBkZWwgZG9jdW1lbnRvIHBvciBsb3MgdHJlcyBndWlvbmVzIGludGVybWVkaW9zIGVuIGxhIHBhcnRlIHN1cGVyaW9yIGUgaW5mZXJpb3IuIFkgZW4gc3UgaW50ZXJpb3Igc2UgZW5jb250cmFyw6FuIGxvcyBlbGVtZW50b3MgYsOhc2ljb3MgZGUgbG9zIG1ldGFkYXRvcy4gVGFtYmnDqW4gZXMgcG9zaWJsZSBvYnNlcnZhciBxdWUgZWwgdGV4dG8gcmVsbGVuYWRvIHByZXZpYW1lbnRlIGFwYXJlY2Vyw6EgZW50cmVjb21pbGxhZG8gZW4gZWwgWUFNTC5cCmBgYAotLS0KdGl0bGU6ICJEaXNlw7FvIGRlIFlBTUwiCmF1dGhvcjogIkd1c3Rhdm8gTWFydMOtbmV6IFZhbGRlcyIKZGF0ZTogIjMvMy8yMDIyIgpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQKLS0tCmBgYAoKVW5hIHZleiAqcmVuZGVyaXphZG8qIGVsIGRvY3VtZW50byBkZSBzYWxpZGEgc2Ugb2JzZXJ2YXLDoSBxdWUsIGVuIHVuIHByaW1lciBtb21lbnRvLCBlbCAqKnTDrXR1bG8qKiBkZWwgZG9jdW1lbnRvIGFwYXJlY2Vyw6EgZW4gbGEgcGFydGUgc3VwZXJpb3IgZGVsIHRleHRvIHkgc2UgbW9zdHJhcsOhbiBlbiB1biB0YW1hw7FvIGRlIGZ1ZW50ZSBtYXlvciBhbCByZXN0byBkZWwgZG9jdW1lbnRvLiBFbiBlbCBjYXNvIGRlIGVzdGEgc2VjY2nDs24gZXMgcG9zaWJsZSwgdGFtYmnDqW4sIGHDsWFkaXIgdW4gKipzdWJ0w610dWxvKiogbWVkaWFudGUgZWwgY29tYW5kbyBgc3VidGl0bGU6ICJ0ZXh0byBkZWwgc3VidMOtdHVsbyJgLiAKCmBgYAotLS0KdGl0bGU6ICJEaXNlw7FvIGRlIFlBTUwiCnN1YnRpdGxlOiAiZXN0ZSBlcyBtaSBwcmltZXIgYm9ycmFkb3IiCi0tLQpgYGAKClVuYSB2ZXogcmVuZGVyaXphZG8sIGVsIHRleHRvIGRlbCBzdWJ0w610dWxvIGFwYXJlY2Vyw6EgZGViYWpvIGRlbCB0w610dWxvIGdlbmVyYWwsIHBlcm8gZW4gdW4gdGFtYcOxbyBkZSBsZXRyYSBtZW5vci5cCgpQb3Igb3RybyBsYWRvLCBlbCBub21icmUgZGVsICoqYXV0b3IqKiBhcGFyZWNlcsOhIGRlYmFqbyBkZWwgKnTDrXR1bG8qLCB5IHNlcsOhIHJlbmRlcml6YWRvIGVuIHVuIHRhbWHDsW8gZGUgZnVlbnRlIG1lbm9yLiBFbiBkaWNobyByZW5nbMOzbiBlcyBwb3NpYmxlIGluY2x1aXIgYSBtw6FzIGRlIHVuIGF1dG9yIGEgcGFydGlyIGRlIHNlcGFyYXIgbG9zIG5vbWJyZXMgbWVkaWFudGUgdW5hIGNvbWEsIHBvciBlamVtcGxvOiBgYXV0aG9yOiAibm9tYnJlIGFwZWxsaWRvMSwgbm9tYnJlIGFwZWxsaWRvMiJgLlwKCmBgYAotLS0KYXV0aG9yOiAibm9tYnJlIGFwZWxsaWRvIDEsIG5vbWJyZSBhcGVsbGlkbyAyIgotLS0KYGBgCgpFbiBlbCBjYXNvIGRlbCBlbGVtZW50byBkZSBsYSAqKmZlY2hhKiosIHBvciBkZWZlY3RvIGVzdGUgZGF0byBzdWVsZSBzZXIgcmVsbGVuYWRvIHBvciBlbCBzaXN0ZW1hIHkgcGFyYSBlbGxvIHJlY3VwZXJhIGxhIGluZm9ybWFjacOzbiBkZWwgc2lzdGVtYS4gRW4gYmFzZSBhIGVsbG8sIGVsIGRvY3VtZW50byByZXRvbWEgbGEgZmVjaGEgZW4gcXVlIGVsIGRvY3VtZW50byBmdWUgZWxhYm9yYWRvIG9yaWdpbmFsbWVudGUsIHBlcm8gZXN0byBwdWVkZSBzZXIgbW9kaWZpY2FkbyBtYW51YWxtZW50ZSBlbiBsYSBzZWNjacOzbiBkZSBZQU1MIHBhcmEgYWp1c3RhcmxvIGEgbGFzIG5lY2VzaWRhZGVzIGRlbCBhdXRvciBvLCB0YW1iacOpbiBzZSBwdWVkZSBjb25maWd1cmFyIHBhcmEgcXVlIHNlIGFjdHVhbGljZSBhIGxvcyBtb21lbnRvcyBlbiBxdWUgZWwgZG9jdW1lbnRvIGRlIFIgTWFya2Rvd24gZXMgcmVuZGVyaXphZG8uIEVuIGVzdGUgw7psdGltbyBjYXNvLCBzZSBwdWVkZSB1c2FyIGVsIGNvbWFuZG8gYHIga25pdHI6OmlubGluZV9leHByKCJkYXRlOiByIFN5cy5EYXRlKCkiKWAuXAoKYGBgCi0tLQpkYXRlOiAiU3lzLkRhdGUoKSIKLS0tCmBgYAoKTGEgY2FyYWN0ZXLDrXN0aWNhIGdlbmVyYWwgZmluYWwgZGVsIFlBTUwgY29uc2lzdGUgZW4gZGVmaW5pciBlbCBmb3JtYXRvIGRlIHNhbGlkYSBlbiBxdWUgc2Vyw6EgcmVuZGVyaXphZG8gZWwgcmVzdG8gZGUgbG9zIGVsZW1lbnRvcyBkZWwgZG9jdW1lbnRvIFIgTWFya2Rvd24uIExvcyBmb3JtYXRvcyBiw6FzaWNvcyBxdWUgc2UgcHVlZGVuIHNlbGVjY2lvbmFyIGVuIGxhIHZlbnRhamEgZGUgZGnDoWxvZ28gKHByZXNlbnRhZGEgYXJyaWJhKSBzb246IC5kb2MsIC5wZGYgbyAuaHRtbC5cCkVzdG8gc2UgZGVmaW5lIGVuIGxhIG9wY2nDs24gYG91dHB1dDogaHRtbF9kb2N1bWVudGAsIHBvciBlamVtcGxvIHBhcmEgdW4gZG9jdW1lbnRvIGVuIGZvcm1hdG8gIi5odG1sIiwgYG91dHB1dDogcGRmX2RvY3VtZW50YCBlbiBlbCBjYXNvIGRlIHVubyBlbiBmb3JtYXRvICIucGRmIiBvIGBvdXRwdXQ6IHdvcmRfZG9jdW1lbnRgIGVuIGNhc28gZGUgc29saWNpdGFyIHVuIGRvY3VtZW50byBkZSBzYWxpZGEgZW4gZm9ybWF0byAiLmRvYyIuXApBZGVtw6FzIGVzIHBvc2libGUgc29saWNpdGFyIGxhIHJlbmRlcml6YWNpw7NuIGRlIG3DoXMgZGUgdW4gZm9ybWF0byBkZSBzYWxpZGEgZGVzZGUgdW4gbWlzbW8gWUFNTCwgcGFyYSBlbGxvIGVzIGRlYmUgZXNwZWNpZmljYXIgZW4gZWwgYXJndW1lbnRvIGRlbCBgb3V0cHV0OiBgIGxvcyBmb3JtYXRvcyBkZSBzYWxpZGEgcXVlIHNlIGRlc2VhbiBnZW5lcmFyLiBQb3IgZWplbXBsbyBzaSBzZSBkZXNlYW4gcHJvZHVjaXIgZG9zIGZvcm1hdG9zIGRlIHVuIG1pc21vIGRvY3VtZW50byBSIE1hcmtkb3duLCB1bm8gZW4gIi5odG1sIiB5IG90cm8gZW4gIi5wZGYiLCBzZSByZWFsaXphIGVzcGVjaWZpY2EgbG8gc2lndWllbnRlOgoKYGBgCi0tLQpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsCi0tLQpgYGAKCgojIyAzLiBDYXJhY3RlcsOtc3RpY2FzIGRlbCBZQU1MIHBhcmEgZGlzdGludG9zICJvdXRwdXRzIi4KRXMgaW1wb3J0YW50ZSB0ZW5lciBlbiBjdWVudGEgcXVlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGLDoXNpY2FzIHJldmlzYWRhcyBhbnRlcmlvcm1lbnRlIGFwbGljYW4gcGFyYSB0b2RvcyBsb3MgZG9jdW1lbnRvcyBSIE1hcmtkb3duIGVuIGdlbmVyYWwsIGluZGVwZW5kaWVudGVtZW50ZSBkZWwgdGlwbyBkZSAqZm9ybWF0byBkZSBzYWxpZGEqLiBTaW4gZW1iYXJnbywgdGFtYmnDqW4gc2UgZGViZSBjb25zaWRlcmFyIHF1ZSBleGlzdGVuIGNhcmFjdGVyw61zdGljYXMgbyBlbGVtZW50b3MgcGFydGljdWxhcmVzIHNlZ8O6biBlbCAqKm91dHB1dCoqIHNvbGljaXRhZG8uIEVzdG8gZXMsIG5vIG5lY2VzYXJpYW1lbnRlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIHVuIFlBTUwgcGFyYSB1biBmb3JtYXRvIGAuaHRtbGAgYXBsaWNhbiBpZ3VhbG1lbnRlIHBhcmEgdW4gZG9jdW1lbnRvIGVuIGZvcm1hdG8gYC5wZGZgLlwgClBhcmEgZGlzdGluZ3VpciBlc3RhcyBkaWZlcmVuY2lhcyBlcyBtdXkgw7p0aWwgY29uc3VsdGFyIGxhIFtndcOtYSBkZSByZWZlcmVuY2lhIGRlIFIgTWFya2Rvd25dKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzAzL3JtYXJrZG93bi1yZWZlcmVuY2UucGRmKSBkaXNlw7FhZGEgcG9yIFIgU3R1ZGlvLlwKCgojIyMgMy4xLiBFbGVtZW50b3MgYsOhc2ljb3MgZGVsIFlBTUwgcGFyYSBlbCBmb3JtYXRvICIuaHRtbCIuCkFsIGRlZmluaXIgZWwgZm9ybWF0byBkZSBzYWxpZGEgZW4gZm9ybWF0byBgLmh0bWxgLCBlcyBpbXBvcnRhbnRlIHRlbmVyIGVuIGN1ZW50YSBxdWUgZXN0ZSB0aXBvIGRlIGRvY3VtZW50b3Mgbm8gbmVjZXNhcmlhbWVudGUgc2UgYWp1c3RhbiBhIGxhICJsw7NnaWNhIiBxdWUgaW1wb25lIHVuYSBww6FnaW5hIHUgaG9qYSBkZSBpbXByZXNpw7NuIGbDrXNpY2EuIEVuIGNhbWJpbywgZWwgY29udGVuaWRvIGRlIGVzdG9zIGRvY3VtZW50b3MgZXMgYXV0byBhanVzdGFibGUgYSBsYSBww6FnaW5hIGVuIHF1ZSBzZSB2aXN1YWxpemEgZGlnaXRhbG1lbnRlLlwKQWxndW5hcyBkZSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBwYXJ0aWN1bGFyZXMgZW4gZWwgZGlzZcOxbyBkZSB1biBkb2N1bWVudG8gZGUgc2FsaWRhIGVuIGZvcm1hdG8gIi5odG1sIiBzb24gY29uc2lzdGVuIGVuOgoKMS4gSW5jbHVpciB1bmEgKip0YWJsYSBkZSBjb250ZW5pZG9zKiogKHRhYmxlIG9mIGNvbnRlbnRzIFt0b2NdKTogcGFyYSBlbGxvIHNlIHV0aWxpemEgZWwgYXJndW1lbnRvIGB0b2M6IFRSVUVgIGRlc3B1w6lzIGRlIGVzcGVjaWZpY2FyIHF1ZSBlbCBkb2N1bWVudG8gZGUgc2FsaWRhIHNlcsOhIGVuIGZvcm1hdG8gYC5odG1sYC4gQWRlbcOhcywgc2kgc2UgZGVzZWEgcXVlIGVsIHNpc3RlbWEgYXNpZ25lIHVuYSBudW1lcmFjacOzbiBhdXRvbcOhdGljYSBhIGNhZGEgdW5hIGRlIGxhcyBzZWNjaW9uZXMgKHF1ZSBmdWVyb24gZGVmaW5pZGFzIG1lZGlhbnRlIGVsIHPDrW1ib2xvIGAjYCBkZSBsYSBzaW50YXhpcyBkZSBNYXJrZG93biksIHNlIHV0aWxpemEgZWwgYXJndW1lbnRvOiBgbnVtYmVyX3NlY3Rpb25zOiBUUlVFYCwgZGUgbGEgc2lndWllbnRlIG1hbmVyYToKCmBgYAotLS0KdGl0bGU6ICJEaXNlw7FvIGRlIFlBTUwiCmF1dGhvcjogIkd1c3Rhdm8gTWFydMOtbmV6IFZhbGRlcyIKZGF0ZTogIjMvMy8yMDIyIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uczogVFJVRQotLS0KYGBgCgoyLiBUYW1iacOpbiBzZSBwdWVkZSBpbmRpY2FyIHNpIGRlIGRlc2VhIHF1ZSBlbCDDrW5kaWNlIGVsYWJvcmFkbyBwcmV2aWFtZW50ZSBzZSB1YmlxdWUgZW4gdW4gKipyZWN1YWRybyAiZmxvdGFudGUiKiogZGVudHJvIGRlIGxhIHDDoWdpbmEgYC5odG1sYCB5LCBhc8OtLCBzZSBlbmN1ZW50cmUgc2llbXByZSBhIGxhIHZpc3RhLiBQYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvIGB0b2NfZmxvYXQ6IFRSVUVgOgoKYGBgCi0tLQp0aXRsZTogIkRpc2XDsW8gZGUgWUFNTCIKYXV0aG9yOiAiR3VzdGF2byBNYXJ0w61uZXogVmFsZGVzIgpkYXRlOiAiMy8zLzIwMjIiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgbnVtYmVyX3NlY3Rpb25zOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tIApgYGAKCjMuIE90cmEgY2FyYWN0ZXLDrXN0aWNhIHF1ZSBwdWVkZSBzZXIgbW9kaWZpY2FkYSBjb25zaXN0ZSBlbiBlbCAqKnRlbWEqKiBvIHRpcG8gZGUgcGxhbnRpbGxhIHZpc3VhbCBlbiBxdWUgc2UgbXVlc3RyYSBlbCBjb250ZW5pZG8uIEVudHJlIGxhcyBvcGNpb25lcyBkaXNwb25pYmxlcyBkZSAidGVtYXMiLCBzZSBlbmN1ZW50cmFuIGxvcyBzaWd1aWVudGVzIHZhbG9yZXM6IGBjZXJ1bGVhbmAsIGBqb3VybmFsYCwgYGZsYXRseWAsIGByZWFkYWJsZWAsIGBzcGFjZWxhYmAsIGB1bml0ZWRgIHkgYGNvc21vYC5cIApQb3IgZWplbXBsbywgZWwgdGV4dG8gcXVlIGFjdHVhbG1lbnRlIHNlIGVzdMOhIHZpc3VhbGl6YW5kbyB1dGlsaXphIGxhIG9wY2nDs24gYGNvc21vYCBlbiBlbCB0ZW1hLiBQYXJhIGNhbWJpYXIgZGUgdGVtYSBzZSB1dGlsaXphIGVsIGNvbWFuZG8gYHRoZW1lOiBqb3VybmFsYCwgcG9yIGVqZW1wbG8uIEVuIGxhIHDDoWdpbmEgZGUgW0FuZHJldyBaaWVmZmxlcl0oaHR0cHM6Ly93d3cuZGF0YWRyZWFtaW5nLm9yZy9wb3N0L3ItbWFya2Rvd24tdGhlbWUtZ2FsbGVyeS8pIHNlIHB1ZWRlIGVjaGFyIHVuIHZpc3Rhem8gYSBsYSBhcGFyaWVuY2lhIGRlIGxvcyB0ZW1hcy4KCmBgYAotLS0KdGl0bGU6ICJEaXNlw7FvIGRlIFlBTUwiCmF1dGhvcjogIkd1c3Rhdm8gTWFydMOtbmV6IFZhbGRlcyIKZGF0ZTogIjMvMy8yMDIyIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uczogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICB0aGVtZTogam91cm5hbAotLS0gCmBgYAoKNC4gVGFtYmnDqW4gZXMgcG9zaWJsZSBkZWZpbmlyIGRlc2RlIHVuIGluaWNpbyBlbCAqKm9jdWx0YW1pZW50byoqIGRlIGxvcyByZXN1bHRhZG9zIGRlIGxvcyB0cm96b3MgZGUgY8OzZGlnb3MgbyAqY2h1bmtzKiwgcGFyYSBlbGxvIHNlIHV0aWxpemEgZWwgY29tYW5kbyBgY29kZV9mb2xkaW5nOiBgIHkgc3VzIG9wY2lvbmVzIGRlIHJlc3B1ZXN0YSBwb3NpYmxlIHNvbjogYHNob3dgIG8gYGhpZGVgLlwgCkVuIGVsIGNhc28gZGUgdXNhciBsYSBvcGNpw7NuIGBjb2RlX2ZvbGRpbmc6IGhpZGVgLCBhdXRvbcOhdGljYW1lbnRlIHRvZG9zIGxvcyBjw7NkaWdvcyBzZSBvY3VsdGFyw6FuIGEgbGEgdmlzdGEgZGVsIGxlY3RvciBwZXJvIHBvZHLDoW4gc2VyIGRlc3BsZWdhZG9zIHNpIHNlIGRhICJjbGljayIgZW4gdW4gcGVxdWXDsW8gYm90w7NuIHRyaWFuZ3VsYXIgcXVlIHNlIGluc2VydGEgZW4gbGFzIHDDoWdpbmEgYC5odG1sYC4gRXN0byBlcyDDunRpbCBjdWFuZG8gbG9zIHJlc3VsdGFkb3MgZGUgbG9zIGPDs2RpZ29zIHNvbiBkZW1hc2lhZG8gZ3JhbmRlcyB5LCBlbnRvbmNlcywgZGlmaWN1bHRhbiBsYSBsZWN0dXJhIGRlIHVuIHRleHRvLgoKYGBgCi0tLQp0aXRsZTogIkRpc2XDsW8gZGUgWUFNTCIKYXV0aG9yOiAiR3VzdGF2byBNYXJ0w61uZXogVmFsZGVzIgpkYXRlOiAiMy8zLzIwMjIiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgbnVtYmVyX3NlY3Rpb25zOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIHRoZW1lOiBqb3VybmFsCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKLS0tIApgYGAKCjUuICoqRGVzY2FyZ2FyIGVsIGPDs2RpZ28gZnVlbnRlKiogZGUgLlJtZC4gU2kgc2UgZGVzZWEgcGVybWl0aXIgcXVlIGVsIGPDs2RpZ28gZnVlbnRlIGRlIFJtZCBzZWEgZGVzY2FyZ2FkbywgZXN0byBzZSBlc3BlY2lmaWNhIGRlc2RlIGVsIFlBTUwgY29uIGVsIHNjcmlwdDogYGNvZGVfZG93bmxvYWQ6IFRSVUVgIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgpgYGAKLS0tCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0gCmBgYAoKIyMjIDMuMi4gRWxlbWVudG9zIGLDoXNpY29zIGRlbCBZQU1MIHBhcmEgZWwgZm9ybWF0byAiLnBkZiIuCkVuIGVsIGNhc28gZGUgdW4gZG9jdW1lbnRvIGRlIHNhbGlkYSBlbiBmb3JtYXRvIGAucGRmYCwgb3Ryb3Mgc29uIGxvcyBwYXLDoW1ldHJvcyBxdWUgc2UgcHVlZGVuIG1vZGlmaWNhci4gRW4gZXN0ZSBjYXNvIGVzIGltcG9ydGFudGUgcmVjb3JkYXIgcXVlIGVsIGZvcm1hdG8gZGUgc2FsaWRhIHNlIGFzZW1lamFyw6EgYSB1biBkb2N1bWVudG8gZXNjcml0byBlbiBww6FnaW5hcyBibGFuY2FzIHlhIHNlYSBkZSB0YW1hw7FvICJjYXJ0YSIgbyAiQTQiIHUgb3Rybywgc2Vnw7puIGFzw60gc2UgZGVmaW5hLlwKQXF1w60gc2UgZGViZSB0ZW5lciBlbiBjdWVudGEgcXVlIGFsIHJlbmRlcml6YXIgdW4gZG9jdW1lbnRvICIuUm1kIiBlbiB1biBmb3JtYXRvIGRlIHNhbGlkYSBlbiBmb3JtYXRvIGAucGRmYCwgZXN0ZSBlcyB0cmFuc2Zvcm1hZG8gZW4gdW4gcHJvY2VzbyBpbnRlcm1lZGlvIGJham8gZWwgbGVndWFuamUgIkxhVGV4IiwgeSBwYXJhIGVsbG8gc2UgdXRpbGl6YSB1biBwcm9ncmFtYSBkZW5vbWluYWRvIGBQYW5kb2NgLiBFbiBsYSBbcMOhZ2luYSB3ZWIgZGUgUGFuZG9jXShodHRwczovL3BhbmRvYy5vcmcvTUFOVUFMLmh0bWwjdmFyaWFibGVzLWZvci1sYXRleCkgc2UgcHVlZGVuIHJldmlzYXIgZGUgbWFuZXJhIGNvbXBsZXRhIGxhcyB2YXJpYWJsZXMgYSBpbmNsdWlyIGVuIGVzdGUgdGlwbyBkZSBkb2N1bWVudG9zLlwgClNpbiBlbWJhcmdvLCBhcXXDrSBzb2xvIHNlIHJldmlzYXLDoW4gYWxndW5hcyBkZSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBtw6FzIHVzdWFsZXMgYSBpbmNsdWlyIGVuIGVsIFlBTUwgY29uc2lzdGVuIGVuOgoKMS4gKipUaXBvIGRlIGRvY3VtZW50byoqOiBBcXXDrSBzZSBwdWVkZSBkZWZpbmlyLCBpbmljaWFsbWVudGUsIGVsIHRpcG8gZGUgZG9jdW1lbnRvIHF1ZSBzZSBlbGFib3JhcsOhLCBwYXJhIGxvIHF1ZSBzZSB1c2EgZWwgY29tYW5kbzogYGRvY3VtZW50Y2xhc3M6IGAsIHkgbGFzIG9wY2lvbmVzIGRlIHJlc3B1ZXN0YSBkaXNwb25pYmxlcyBzb246IGBib29rYCwgYGFydGljbGVgIG8gYHJlcG9ydGAuIFBvciBlamVtcGxvOgoKYGBgCi0tLQp0aXRsZTogIkRpc2XDsW8gZGUgWUFNTCIKYXV0aG9yOiAiR3VzdGF2byBNYXJ0w61uZXogVmFsZGVzIgpkYXRlOiAiMy8zLzIwMjIiCm91dHB1dDogcGRmX2RvY3VtZW50CmRvY3VtZW50Y2xhc3M6IGFydGljbGUgI2FxdcOtIHNlIGRlZmluZSBxdWUgZWwgZG9jdW1lbnRvIGEgZWxhYm9yYXIgZXMgdW4gImFydMOtY3VsbyIuCi0tLQpgYGAKCjIuICoqT3JnYW5pemFjacOzbiBkZWwgdGV4dG8qKi4gQ29uIGVzdGEgb3BjacOzbiBzZSBwdWVkZSBlc3BlY2lmaWNhciBsYSBtYW5lcmEgZW4gcXVlIHNlIHByZXNlbnRhcsOhIGVsIHRleHRvIHZpc3VhbG1lbnRlLiBQYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvOiBgY2xhc3NvcHRpb246IGAsIHkgbGFzIG9wY2lvbmVzIGRlIHJlc3B1ZXN0YSBwb3NpYmxlcyBzb246IGB0d29jb2x1bW5gLCBgbGFuZHNjYXBlYCBvIGBwb3J0cmFpdGAuIEVzdGEgw7psdGltYSBlcyBsYSBvcGNpw7NuIHBvciBkZWZlY3RvLiBQb3IgZWplbXBsbzoKCmBgYAotLS0KdGl0bGU6ICJEaXNlw7FvIGRlIFlBTUwiCmF1dGhvcjogIkd1c3Rhdm8gTWFydMOtbmV6IFZhbGRlcyIKZGF0ZTogIjMvMy8yMDIyIgpvdXRwdXQ6IHBkZl9kb2N1bWVudApkb2N1bWVudGNsYXNzOiBhcnRpY2xlCmNsYXNzb3B0aW9uOiAKLSB0d29jb2x1bW5zICNhcXXDrSBzZSBkZWZpbmUgcXVlIGVsIHRleHRvIGVuIGNhZGEgY3VhcnRpbGxhIHNlIGRpc3RyaWJ1eWEgZW4gZG9zIGNvbHVtbmFzLgotLS0KYGBgCgozLiAqKlRhbWHDsW8gZGUgbGEgaG9qYSBkZSBpbXByZXNpw7NuKiouIEEgcGFydGlyIGRlbCBjb21hbmRvIGBwYXBlcnNpemU6IGAsIGVudHJlIGN1eWFzIG9wY2lvbmVzIGRlIHJlc3B1ZXN0YSBzZSBlbmN1ZW50cmFuIGBhNGAgbyBgbGV0dGVyYCwgc2UgZGVmaW5lIGVsIHRhbWHDsW8gZGUgbGEgaG9qYSBkZSBpbXByZXNpw7NuLiBQb3IgZWplbXBsbzoKCmBgYAotLS0KdGl0bGU6ICJEaXNlw7FvIGRlIFlBTUwiCmF1dGhvcjogIkd1c3Rhdm8gTWFydMOtbmV6IFZhbGRlcyIKZGF0ZTogIjMvMy8yMDIyIgpvdXRwdXQ6IHBkZl9kb2N1bWVudApkb2N1bWVudGNsYXNzOiBhcnRpY2xlCmNsYXNzb3B0aW9uOiAKLSB0d29jb2x1bW5zCnBhcGVyc2l6ZTogbGV0dGVyICAjYXF1w60gc2UgZGVmaW5lIGVsIHRhbWHDsW8gZGUgbGEgaG9qYSBkZSBpbXByZXNpw7NuIHNlYSBkZSB0YW1hw7FvICJjYXJ0YSIuCi0tLQpgYGAKCjQuICoqSW50ZXJsaW5lYWRvKiouIE1lZGlhbnRlIGVsIGNvbWFuZG8gYGxpbmVzdHJldGNoOiBgLCB5IGN1eW9zIHZhbG9yZXMgc29uIHVuIHZlY3RvciBudW3DqXJpY28sIHNlIGRlZmluZSBlbCB0YW1hw7FvIGRlbCBzYWx0byBkZSByZW5nbMOzbiBkZW50cm8gZGVsIGRvY3VtZW50by4gUG9yIGVqZW1wbG86CgpgYGAKLS0tCnRpdGxlOiAiRGlzZcOxbyBkZSBZQU1MIgphdXRob3I6ICJHdXN0YXZvIE1hcnTDrW5leiBWYWxkZXMiCmRhdGU6ICIzLzMvMjAyMiIKb3V0cHV0OiBwZGZfZG9jdW1lbnQKZG9jdW1lbnRjbGFzczogYXJ0aWNsZQpjbGFzc29wdGlvbjogCi0gdHdvY29sdW1ucwpwYXBlcnNpemU6IGxldHRlcgpsaW5lc3RyZXRjaDogMS41ICAjQXF1w60gc2UgZGVmaW5lIHF1ZSBlbCBpbnRlcmxpbmVhZG8gbyBlbCBzYWx0byBlbnRyZSByZW5nbG9uZXMgc2VhIGRlIDEuNS4KLS0tCmBgYAoKNS4gKipUYW1hw7FvIGRlIGZ1ZW50ZSoqLiBFbCB0YW1hw7FvIGRlIGxhIGZ1ZW50ZSBkZWwgdGV4dG8gZW4gZ2VuZXJhbCBwdWVkZSBzZXIgbW9kaWZpY2FkYSB1dGlsaXphbmRvIGVsIGNvbWFuZG8gYGZvbnRzaXplOiBgLCB5IGN1eW9zIHZhbG9yZXMgc2UgZGVmaW5lbiBlbiB1bmlkYWRlcyBkZSAicHVudG9zIiwgcG9yIGVqZW1wbG86IDEwcHQsIDExcHQgbyAxMnB0LgoKYGBgCi0tLQp0aXRsZTogIkRpc2XDsW8gZGUgWUFNTCIKYXV0aG9yOiAiR3VzdGF2byBNYXJ0w61uZXogVmFsZGVzIgpkYXRlOiAiMy8zLzIwMjIiCm91dHB1dDogcGRmX2RvY3VtZW50CmRvY3VtZW50Y2xhc3M6IGFydGljbGUKY2xhc3NvcHRpb246IAotIHR3b2NvbHVtbnMKcGFwZXJzaXplOiBsZXR0ZXIKbGluZXN0cmV0Y2g6IDEuNQpmb250c2l6ZTogMTJwdCAgI0FxdcOtIHNlIGRlZmluZSBlbCB0YW1hw7FvIGRlIGxhIGZ1ZW50ZSBhIHVubyBkZSAxMiBwdW50b3MuCi0tLQpgYGAKCjYuICoqTcOhcmdlbmVzKiogbyAqZ2VvbWV0csOtYSogZGVsIHRleHRvIGRlbnRybyBkZWwgZG9jdW1lbnRvLiBNZWRpYW50ZSBlbCBjb21hbmRvIGBnZW9tZXRyeTogYCBzZSBwdWVkZW4gZGVmaW5pciBlbCB0YW1hw7FvIGRlIGxvcyBtw6FyZ2VuZXMgZGVsIHRleHRvIGRlbnRybyBkZWwgZG9jdW1lbnRvLlwgCkxvcyB2YWxvcmVzIGRlIHJlc3B1ZXN0YSBkZSBlc3RlIGNvbWFuZG8gY29uc2lzdGVuIGVuIHVuIHZlY3RvciBudW3DqXJpY28sIGEgbGEgdmV6IHF1ZSBzZSBwdWVkZSBkZWZpbmlyIG1hbnVhbG1lbnRlIGxhIHVuaWRhZCBtw6l0cmljYSBlbiBxdWUgc2UgZGVzZWEgZXNwZWNpZmljYXIgc3UgdGFtYcOxbywgY29tbyBwdWVkZW4gc2VyIGBpbmAgKHB1bGdhZGFzKSwgYGNtYChjZW50w61tZXRyb3MpIG8gYG1tYCAobWlsw61tZXRyb3MpLlwgCkFzaW1pc21vIHNlIHB1ZWRlbiB1dGlsaXphciBsb3MgYXJndW1lbnRvcyBgdG9wPSBgLCBgYm90dG9tPSBgLCBgbGVmdD0gYCB5IGByaWdodD0gYCBwYXJhIGVzcGVjaWZpY2FyIGxvcyBtw6FyZ2VuZXMgZGVzZWFkb3MuIFBvciBlamVtcGxvOgoKYGBgCi0tLQp0aXRsZTogIkRpc2XDsW8gZGUgWUFNTCIKYXV0aG9yOiAiR3VzdGF2byBNYXJ0w61uZXogVmFsZGVzIgpkYXRlOiAiMy8zLzIwMjIiCm91dHB1dDogcGRmX2RvY3VtZW50CmRvY3VtZW50Y2xhc3M6IGFydGljbGUKY2xhc3NvcHRpb246IAotIHR3b2NvbHVtbnMKcGFwZXJzaXplOiBsZXR0ZXIKbGluZXN0cmV0Y2g6IDEuNQpmb250c2l6ZTogMTJwdApnZW9tZXRyeToKLSB0b3A9M2NtICAjU2UgZGVmaW5lIHVuIG3DoXJnZW4gZGUgM2NtIGVuIGxhIHBhcnRlIHN1cGVyaW9yIGRlbCBkb2N1bWVudG8uCi0gbGVmdD0yLjVjbSAjU2UgZGVmaW5lIHVuIG3DoXJnZW4gZGUgMi41Y20gZW4gbGEgcGFydGUgaXpxdWllcmRhIGRlbCBkb2N1bWVudG8uCi0tLQpgYGAKCjcuICoqw41uZGljZSoqIG8gKnRhYmxhIGRlIGNvbnRlbmlkbyouIEVuIHVuIGRvY3VtZW50byBlbiBmb3JtYXRvIGAucGRmYCB0YW1iacOpbiBlcyBwb3NpYmxlIGluY2x1aXIgdW4gbGlzdGFkbyBvIHRhYmxhIGRlIGNvbnRlbmlkbyBhc8OtIGNvbW8gbGEgb3BjacOzbiBwYXJhIHNvbGljaXRhciBxdWUgbGFzIHNlY2Npb25lcyByZWNvbm9jaWRhcyBlbiBsYSB0YWJsYSBkZSBjb250ZW5pZG8gc2VhbiBudW1lcmFkYXMgYXV0b23DoXRpY2FtZW50ZS5cIApQYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvIGB0b2M6IFRSVUVgIGFzw60gY29tbyBgbnVtYmVyX3NlY3Rpb25zOiBUUlVFYCwgcG9yIGVqZW1wbG86CgpgYGAKLS0tCnRpdGxlOiAiRGlzZcOxbyBkZSBZQU1MIgphdXRob3I6ICJHdXN0YXZvIE1hcnTDrW5leiBWYWxkZXMiCmRhdGU6ICIzLzMvMjAyMiIKb3V0cHV0OiBwZGZfZG9jdW1lbnQKZG9jdW1lbnRjbGFzczogYXJ0aWNsZQpjbGFzc29wdGlvbjogCi0gdHdvY29sdW1ucwpwYXBlcnNpemU6IGxldHRlcgpsaW5lc3RyZXRjaDogMS41CmZvbnRzaXplOiAxMnB0Cmdlb21ldHJ5OgotIHRvcD0zY20KLSBsZWZ0PTIuNWNtCnRvYzogVFJVRQpudW1iZXJfc2VjdGlvbnM6IFRSVUUKLS0tCmBgYAoKOC4gKipUaXBvIGRlIGZ1ZW50ZSoqLiBUYW1iacOpbiBlcyBwb3NpYmxlIG1vZGlmaWNhciBlbCB0aXBvIGRlIGZ1ZW50ZSB0aXBvZ3LDoWZpY2EgZGUgbG9zIGRvY3VtZW50b3MgZGUgc2FsaWRhLiBQYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvIGBtYWluZm9udDogYCwgeSBjb21vIHJlc3B1ZXN0YSBzZSBkZWJlIGVzcGVjaWZpY2FyIGVsIG5vbWJyZSBhIGFsZ3VuYSBkZSBsYXMgdGlwb2dyYWbDrWFzIHByZSBjYXJnYWRhcyBlbiBsYSBjb21wdXRhZG9yYSBlbiBlbCBsaXN0YWRvIHRpcG9ncsOhZmljbyBkZWwgZGlzY28gZHVyby5cIApTZSBkZWJlIHRlbmVyIGVuIGN1ZW50YSBxdWUgcGFyYSBxdWUgZXN0ZSBjb21hbmRvIGFwbGlxdWUgbGEgc29saWNpdHVkIGRlIHVuIHRpcG8gZGUgZnVlbnRlIGRlc2VhZG8sIHNlIGRlYmUgYWNvbXBhw7FhciBkZSB1biBjb21hbmRvIGFkaWNpb25hbCBxdWUgY29uc2lzdGUgZW4gZGVmaW5pciBlbCBtb3RvciBwYXJhIHRyYW5zZm9ybWFyIGVsIGRvY3VtZW50byAiLlJtZCIgYSBmb3JtYXRvICJMYVRleCIgeSwgcG9zdGVyaW9ybWVudGUsIGEgdW5vIGRlIHRpcG8gIi5wZGYiLiBFc3RlIGNvbWFuZG8gZXMgYGxhdGV4X2VuZ2luZTogYCwgeSBlbCBtb3RvciBkZSB0cmFuc2Zvcm1hY2nDs24gZGViZSBzZXIgbGEgb3BjacOzbiBgeGVsYXRleGAuXCAKRGUgbWFuZXJhIHF1ZSBsYSBzb2xpY2l0dWQgcGFyYSBjb25maWd1cmFyIGVzdGUgY2FtYmlvIGRlIGZ1ZW50ZSBlcyBkZSBsYSBzaWd1aWVudGUgZm9ybWE6CgpgYGAKLS0tCnRpdGxlOiAiRGlzZcOxbyBkZSBZQU1MIgphdXRob3I6ICJHdXN0YXZvIE1hcnTDrW5leiBWYWxkZXMiCmRhdGU6ICIzLzMvMjAyMiIKb3V0cHV0OiAKICBwZGZfZG9jdW1lbnQ6CiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXggICNBcXXDrSBzZSBkZWZpbmUgZWwgbW90b3IgZGUgcmVuZGVyaXphY2nDs24gYSBMYVRleApkb2N1bWVudGNsYXNzOiBhcnRpY2xlCmNsYXNzb3B0aW9uOiAKLSB0d29jb2x1bW5zCnBhcGVyc2l6ZTogbGV0dGVyCmxpbmVzdHJldGNoOiAxLjUKZm9udHNpemU6IDEycHQKZ2VvbWV0cnk6Ci0gdG9wPTNjbQotIGxlZnQ9Mi41Y20KdG9jOiBUUlVFCm51bWJlcl9zZWN0aW9uczogVFJVRQptYWluZm9udDogQXJpYWwgICNBcXXDrSBzZSBzb2xpY2l0YSBlbCBjYW1iaW8gZGVsIHRpcG8gZGUgZnVlbnRlLCBxdWUgcHJldmlhbWVudGUgZXN0w6EgY2FyZ2FkYSBkZW50cm8gZGVsIGxpc3RhZG8gdGlwb2dyw6FmaWNvIGRlIGxhIGNvbXB1dGFkb3JhIGRlIHRyYWJham8uCi0tLQpgYGAKCiMjIDQuIFBhcXVldGVyw61hIGB5bWx0aGlzKClgIHBhcmEgZGlzZcOxYXIgWUFNTCB5IHN1ICphZGQtaW4qLgoKTGEgdXRpbGlkYWQgZGVsICoqWUFNTCoqLCBhZGVtw6FzIGRlIGRlZmluaXIgbG9zIG1ldGFkYWRvcyBkZWwgZG9jdW1lbnRvIGVsYWJvcmFkbywgYXPDrSBjb21vIGNvbmZpZ3VyYXIgZGVzZGUgdW4gaW5pY2lvIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGdlbmVyYWxlcyBkZWwgZG9jdW1lbnRvLCBjb25zaXN0ZSBlbiBxdWUgdW5hIHZleiBxdWUgc2UgY3VlbnRhIGNvbiB1bmEgZXN0cnVjdHVyYSBwcmVmZXJpZGEgcG9yIGVsIGF1dG9yLCBlc3RhIHB1ZWRlIHNlciBjb3BpYWRhIHBhcmEgZGlzZcOxYXIgb3Ryb3MgZG9jdW1lbnRvcyBwb3N0ZXJpb3Jlcy4gU2luIGVtYmFyZ28gdGFtYmnDqW4gcHVlZGUgc2VyIGVuZ29ycm9zbyByZWNvcmRhciBsYSBtYXlvcsOtYSBkZSBsb3MgY29tYW5kb3MgZGVudHJvIGRlIHVuIFlBTUwsIGVzcGVjaWFsbWVudGUgYWwgY29tZW56YXIgYSBjb25vY2VyIHkgdHJhYmFqYXIgY29uIGVsIGZvcm1hdG8gIi5SbWQiLlwKUGVybyBleGlzdGUsIGFkaWNpb25hbG1lbnRlLCBsYSBbcGFxdWV0ZXLDrWFdKGh0dHBzOi8veW1sdGhpcy5yLWxpYi5vcmcvKSBgeW1sdGhpcygpYCBxdWUgcGVybWl0ZSBtYW5pcHVsYXIgZGUgbWFuZXJhIG3DoXMgInNlbmNpbGxhIiBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZWwgWUFNTCwgdG9tYW5kbyBlbiBjb25zaWRlcmFjacOzbiBlbCB0aXBvIGRlIGRvY3VtZW50byBkZSBzYWxpZGEgZGVzZWFkby5cClByaW1lcm8gc2UgZGViZSBpbnN0YWxhciBkaWNoYSBwYXF1ZXRlcsOtYToKCmBgYAppbnN0YWxsLnBhY2thZ2VzKCJ5bWx0aGlzIikKYGBgCgpUcmFzIGFjdGl2YXIgZGljaGEgcGFxdWV0ZXLDrWEgY29uIGBsaWJyYXJ5KHltbHRoaXMpYCwgZWwgY29tYW5kbyBiw6FzaWNvIGVzIGB5bWwoKWAuIFVuYSB2ZXogcXVlIHNlICJjb3JyZSIgZGljaG8gY8OzZGlnbywgZXN0ZSBhcnJvamEgY29tbyByZXN1bHRhZG8gZWwgY29udGVuaWRvIGLDoXNpY28gZGUgdW4gWUFNTC5cCgpgYGAge3J9CmxpYnJhcnkoeW1sdGhpcykKeW1sKCkKYGBgCgpBc2ltaXNtbywgZWwgcmVzdWx0YWRvIGRlbCBZQU1MIGEgZ2VuZXJhciBzZSBwdWVkZSBhZGljaW9uYXIgY29uIG90cm9zIGFyZ3VtZW50b3MsIGNvbW86IGB5bWxfYXV0aG9yKClgLCBgeW1sX2RhdGUoKWAsIG8gYHltbF9vdXRwdXQoKWAsIGFkZW3DoXMgZGUgdmluY3VsYXJsb3MgbWVkaWFudGUgZWwgdXNvIGRlIHBpcGVzIChgJT4lYCksIHBvciBlamVtcGxvLgoKYGBge3J9CnltbCgpICU+JSAKICB5bWxfYXV0aG9yKGMoImF1dG9yMSIsICJhdXRvcjIiKSwgYWZmaWxpYXRpb24gPSAiaW5zdGl0dWNpw7NuIikgJT4lIAogIHltbF9kYXRlKGx1YnJpZGF0ZTo6dG9kYXkoKSkgJT4lIAogIHltbF9vdXRwdXQoCiAgICB3b3JkX2RvY3VtZW50KGtlZXBfbWQgPSBUUlVFKSwgCiAgICBib29rZG93bjo6aHRtbF9kb2N1bWVudDIoKQogICkgCmBgYAoKCiMjIyA0LjEuIEFkZC1pbiBkZSBgeW1sdGhpcygpYC4KCkFkaWNpb25hbG1lbnRlIGxhIHBhcXVldGVyw61hIGRlIGB5bWx0aGlzKClgIGN1ZW50YSBjb24gdW5hICJhZGQtaW4iLCBxdWUgc2UgdHJhZHVjZSBlbiB1bmEgdmVudGFuYSBlbWVyZ2VudGUgcXVlIHBlcm1pdGUsIGEgc3UgdmV6LCBhcG95YXIgYWwgdXN1YXJpbyBlbiBsYSBnZW5lcmFjacOzbiBkZWwgWUFNTCBzaW4gbGEgbmVjZXNpZGFkIGRlIGVzY3JpYmlyIGPDs2RpZ28gZW4gdW4gImNodW5rIi5cClBhcmEgYWN0aXZhciBkaWNobyAiYWRkLWluIiBzZSBkZWJlIHNlZ3VpciBsYSBydXRhICJUb29scyIgPiAiYWRkaW5zIiA+ICJicm93c2UgYWRkaW5zIiA+ICJ5bWx0aGlzIi4gRW4gY2FzbyBkZSBubyB1c2FyIGVsIG1vdXNlIHBhcmEgc2VndWlyIGRpY2hhIHJ1dGEsIGVsIGNvbWFuZG8gcGFyYSBhY3RpdmFyIGVsICJhZGQtaW4iIGVzIGB5bWx0aGlzOjo6bGF1bmNoX3lhbWxfYWRkaW4oKWAuXAoKYGBgCnltbHRoaXM6OjpsYXVuY2hfeWFtbF9hZGRpbigpCmBgYAoKVW5hIHZleiBhY3RpdmFkbyBlbCAiYWRkLWluIiwgZGVzcHXDqXMgYXBhcmVjZXLDoSB1bmEgdmVudGFuYSBlbWVyZ2VudGUgcGFyZWNpZGEgYSBsYSBzaWd1aWVudGU6CgpgYGB7ciwgZWNobz1GQUxTRSwgb3V0LndpZHRoPSI5MCUiLCBmaWcuY2FwPSJWZW50YW5hIGRlbCAnYWRkLWluJyBkZSAneW1sdGhpcygpJy4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiYWRkIGluIHltbHRoaXMucG5nIikKYGBgCgpFbiBkaWNoYSB2ZW50YW5hIGVtZXJnZW50ZSwgZWwgYXV0b3IgdGVuZHLDoSBsYSBvcG9ydHVuaWRhZCBkZSByZWxsZW5hciBkaXZlcnNhcyBvcGNpb25lcywgdGFudG8gcmVmZXJlbnRlcyBhbCB0aXBvIGRlIGRvY3VtZW50byBkZSBzYWxpZGEgKGAucGRmYCwgYC5odG1sYCwgYC5kb2NgIHUgb3RybyksIGFzw60gY29tbyBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBwYXJ0aWN1bGFyZXMuIFkgZWwgcmVzdWx0YWRvIGdlbmVyYWRvIHNlIHRyYWR1Y2UgZW4gdW5hIGVzcXVlbGEgZGVsIFlBTUwgY29uZmlndXJhZG8gYSBwYXJ0aXIgZGUgbGFzIG5lY2VzaWRhZGVzIGRlbCBhdXRvci4KCgojIyA1LiBSZWZlcmVuY2lhcyB5IGxpc3RhZG8gYmlibGlvZ3LDoWZpY28gYmFzYWRvIGVuICoqWm90ZXJvKiouCgpBcXXDrSBzZSByZXZpc2Fyw6EgZWwgcHJvY2VzbyBkZSBpbnNlcmNpw7NuIGRlIGNpdGFjaW9uZXMgYXBvecOhbmRvc2UgZW4gZWwgZ2VzdG9yIGRlIHJlZmVyZW5jaWFzIGJpYmxpb2dyw6FmaWNhcyBkZSBbKipab3Rlcm8qKl0oaHR0cHM6Ly93d3cuem90ZXJvLm9yZy8pLCBxdWUgZXMgdW4gc29mdHdhcmUgZGUgY8OzZGlnbyBhYmllcnRvLgoKCiMjIyA1LjEuIFByZXBhcmFjacOzbiBkZSBsYSBiYXNlIGRlIGRhdG9zIGRlIHJlZmVyZW5jaWFzIGJpYmxpb2dyw6FmaWNhcyAoIi5iaWIiKS4KCkluaWNpYWxtZW50ZSBzZSByZXF1aWVyZSBjb250YXIgY29uIHVuIGFyY2hpdm8gY29uIGV4dGVuc2nDs24gKipgLmJpYmAqKiBlbiBlbCBxdWUgc2UgZW5jdWVudHJlbiBlbmxpc3RhZGFzIHRvZGFzIGxhcyByZWZlcmVuY2lhcyBiaWJsaW9ncsOhZmljYXMgcXVlIHNlIHV0aWxpemFyw6FuIGVuIGVsIGRvY3VtZW50by5cCkVzdGUgdGlwbyBkZSBhcmNoaXZvcyBjb25zaXN0ZSBlbiB1biBsaXN0YWRvIGRlIGxhcyByZWZlcmVuY2lhcyBiaWJsaW9ncsOhZmljYXMgcXVlIHNlIHV0aWxpemFyw6FuIGNvbW8gcmVjdXJzb3MgZGUgdW4gZG9jdW1lbnRvLCBkb25kZSBjYWRhIHVuYSBkZSBkaWNoYXMgcmVmZXJlbmNpYXMgc29uIGFyY2hpdmFkYXMgYmFqbyB1biBmb3JtYXRvIGVzcGVjaWFsIGRlbm9taW5hZG8gYEJpYlRleGAsIGNvbiBsYSBzaWd1aWVudGUgZXN0cnVjdHVyYSBwb3IgZWplbXBsbzoKCmBgYApAS2V5e1ItYmFzZSwKICB0aXRsZSA9IHtSOiBBIExhbmd1YWdlIGFuZCBFbnZpcm9ubWVudCBmb3IgU3RhdGlzdGljYWwKICAgICAgICAgICBDb21wdXRpbmd9LAogIGF1dGhvciA9IHt7UiBDb3JlIFRlYW19fSwKICBvcmdhbml6YXRpb24gPSB7UiBGb3VuZGF0aW9uIGZvciBTdGF0aXN0aWNhbCBDb21wdXRpbmd9LAogIGFkZHJlc3MgPSB7Vmllbm5hLCBBdXN0cmlhfSwKICB5ZWFyID0gezIwMTl9LAogIHVybCA9IHtodHRwczovL3d3dy5SLXByb2plY3Qub3JnfSwKfQpgYGAKTWFudWFsbWVudGUgc2UgcHVlZGUgY3JlYXIgdW4gbGlzdGFkbyBkZSB0b2RhcyBsYXMgb2JyYXMgYSByZWZlcmVuY2lhciBlbiB1biBhcmNoaXZvIGRlIHRleHRvIHBsYW5vLCBlbCBxdWUsIGZpbmFsbWVudGUsIGRlYmVyw6Egc2VyIGd1YXJkYWRvIGNvbiBsYSBleHRlbnNpw7NuIGAuYmliYCwgeSBxdWUgc2Vyw6EgbmVjZXNhcmlvIHBhcmEgZWwgcHJvY2VzbyBkZSBpbnNlcnRhciBjaXRhY2lvbmVzIGVuIFIgTWFya2Rvd24sIGFzw60gY29tbyBwYXJhIGdlbmVyYXIgZWwgbGlzdGFkbyBiaWJsaW9ncsOhZmljbyBhIGluY2x1aXIgZW4gZWwgZG9jdW1lbnRvIGRlIHNhbGlkYS5cCkNyZWFyIGRpY2hvIGFyY2hpdm8gY29uIGV4dGVuc2nDs24gYC5iaWJgIGVzIHVuIHByb2Nlc28gZW5nb3Jyb3NvLCBhY3R1YWxtZW50ZSBlbCBnZXN0b3IgYmlibGlvZ3LDoWZpY28gZGUgKipab3Rlcm8qKiB0YW1iacOpbiBwZXJtaXRlIGdlbmVyYXIgZGljaG8gYXJjaGl2byBkZSBtYW5lcmEgbcOhcyBzZW5jaWxsYS5cCkRlc2RlICoqWm90ZXJvKiogc2UgcHVlZGVuIHNlbGVjY2lvbmFyIGxhcyByZWZlcmVuY2lhcyBxdWUgZGViZXLDoW4gc2VyICpleHBvcnRhZGFzKiBlbiBmb3JtYXRvICoqYC5iaWJgKiogKGFwb3lhZG8gZW4gZWwgcGx1Zy1pbiBkZSAqKkJldHRlciBCaWIgVGV4KiopLiBFc3RvIHNlIHRyYWR1Y2UgZW4gdW4gbnVldm8gYXJjaGl2byBjb24gZXh0ZW5zacOzbiBgLmJpYmAuXAoKUGFyYSBlbGxvLCBwcmltZXJvIHNlIGRlYmUgc2VsZWNjaW9uYXIgbGEgY29sZWNjacOzbiBkZSBvYnJhcyBzZWxlY2Npb25hZGFzIGVuIFpvdGVyby4KCmBgYHtyLCBlY2hvPUZBTFNFLCBvdXQud2lkdGg9IjkwJSIsIGZpZy5jYXA9IkV4cG90YXIgbGEgY29sZWNjacOzbiBkZXNlYWRhIGVuIFpvdGVyby4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiem90ZXJvMS5wbmciKQpgYGAKClBvc3Rlcmlvcm1lbnRlIHNlIGRlYmUgc2VsZWNjaW9uYXIgZWwgZm9ybWF0byBkZSBgQmV0dGVyQmliVGV4YCBwYXJhIHN1IGV4cG9ydGFjacOzbiwgYXPDrSBjb21vIHRhbWJpw6luIHNlIHJlY29taWVuZGEgc2VsZWNjaW9uYXIgbGEgY2FzaWxsYSBxdWUgcGVybWl0ZSBtYW50ZW5lciBhY3R1YWxpemFkYSBkaWNoYSBjb2xlY2Npw7NuIGV4cG9ydGFkYS4KCmBgYHtyLCBlY2hvPUZBTFNFLCBvdXQud2lkdGg9IjkwJSIsIGZpZy5jYXA9IlNlbGVjY2nDs24gZGVsIGZvcm1hdG8gQmV0dGVyQmliVGV4IGFjdHVhbGl6YWRvLiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJ6b3Rlcm8yLnBuZyIpCmBgYAoKCkFsIGNyZWFyIGVsIGFyY2hpdm8sIGVzIGltcG9ydGFudGUgc2VsZWNjaW9uYXIgbGEgb3BjacOzbiBkZSBab3Rlcm8gcXVlIHBlcm1pdGUgYWN0dWFsaXphciBjb25zdGFudGVtZW50ZSBhbCBhcmNoaXZvIGAuYmliYC4gRXN0byBwZXJtaXRpcsOhIGluY2x1aXIgZW4gw6lzdGUgw7psdGltbyBsYXMgcmVmZXJlbmNpYXMgcXVlIHNlYW4gZ3VhcmRhZGFzIGVuIFpvdGVybyBwb3N0ZXJpb3JtZW50ZSBhIGxhIGNyZWFjacOzbiBkZWwgYXJjaGl2byBgLmJpYmAuXApVbmEgdmV6IGNyZWFkbyBlbCBhcmNoaXZvIGRlIGxhcyByZWZlcmVuY2lhcyBiaWJsaW9ncsOhZmljYXMsIGRlYmUgZ3VhcmRhcnNlIGVuIGxhIG1pc21hIGNhcnBldGEgZW4gbGEgcXVlIHNlIGVuY3VlbnRyYSBlbCBkb2N1bWVudG8gKiouUm1kKiouXAoKYGBge3IsIGVjaG89RkFMU0UsIG91dC53aWR0aD0iOTAlIiwgZmlnLmNhcD0iU2VsZWNjacOzbiBkZSBsYSBjYXJwZXRhIHBhcmEgZ3VhcmRhciBlbCBhcmNoaXZvIGNvbiBleHRlbnNpw7NuICcuYmliJy4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiem90ZXJvMy5wbmciKQpgYGAKClBvc3Rlcmlvcm1lbnRlLCBlbCBhcmNoaXZvICoqLmJpYioqIGRlYmUgc2VyICpsbGFtYWRvKiBkZXNkZSBlbCAqKllBTUwqKiBkZSBSIE1hcmtkb3duIHBhcmEgcXVlIGVzdMOpIGRpc3BvbmlibGUgeSBzZSBwdWVkYW4gdXRpbGl6YXIgbGFzIHJlZmVyZW5jaWFzIGNvbnRlbmlkYXMuIEVsIHNjcmlwdCBkZW50cm8gZGVsIFlBTUwgcGFyYSBsbGFtYXIgYWwgbGlzdGFkbyBkZSByZWZlcmVuY2lhcyBlcyBgYmlibGlvZ3JhcGh5OiBub21icmUuYmliYC4gUG9yIGVqZW1wbG86CgpgYGAKLS0tCm91dHB1dDogaHRtbF9kb2N1bWVudApiaWJsaW9ncmFwaHk6IG1ldG9kb2xvZ2lhLmJpYiAgCi0tLQpgYGAKCgojIyMgNS4yLiBEZWZpbmljacOzbiBkZWwgZXN0aWxvIGRlIGNpdGFjacOzbiAoYXJjaGl2byAiLmNzbCIpLgoKUGFyYSBkYXJsZSBmb3JtYXRvIGEgbGFzIHJlZmVyZW5jaWFzIGluc2VydGFkYXMgZW4gZWwgZG9jdW1lbnRvIHJlcXVpZXJlIHV0aWxpemFyIHVuIGFyY2hpdm8gY29uIGV4dGVuc2nDs24gYC5jc2xgLCBxdWUgY29udGllbmUgbGEgaW5mb3JtYWNpw7NuIG5lY2VzYXJpYSBwYXJhIGNhZGEgdW5vIGRlIGxvcyBlc3RpbG9zIGRlIGNpdGFjacOzbi5cCkVzdG9zIGFyY2h2aW9zIGAuY3NsYCBwdWVkZW4gc2VyIGNyZWFkb3MgcG9yIGVsIGF1dG9yIG8gdGFtYmnDqW4gcHVlZGVuIHNlciBpbXBvcnRhZG9zLiDDiXN0YSDDumx0aW1hIG9wY2nDs24gZXMgbGEgbcOhcyAiZsOhY2lsIiBkZSBsbGV2YXIgYSBjYWJvLlwKWm90ZXJvIGN1ZW50YSBjb24gdW4gcmVwb3NpdG9yaW8gZGUgYXJjaGl2b3MgYC5jc2xgIHF1ZSBzZSBwdWVkZW4gaW1wb3J0YXIuIEVzdGUgc2UgZW5jdWVudHJhIGVuIDxodHRwczovL3d3dy56b3Rlcm8ub3JnL3N0eWxlcz4uXApQb3IgZWplbXBsbywgZW4gZWwgY2FzbyBkZSBkZXNlYXIgdHJhYmFqYXIgY29uIGVsIGVzdGlsbyBkZSBsYSBBbWVyaWNhbiBQc3ljaG9sb2d5IEFzc29jaWF0aW9uIChBUEEpLCBzZSBkZWJlIGltcG9ydGFyIGVsIGFyY2hpdm8gYGFwYS5jc2xgLlwKRXMgaW1wb3J0YW50ZSBxdWUgZWwgYXJjaGl2byBzZSBlbmN1ZW50cmUgdWJpY2FkbyBlbiBsYSBtaXNtYSBjYXJwZXRhIGRvbmRlIHNlIGVuY3VlbnRyYSBndWFyZGFkbyBlbCBkb2N1bWVudG8gKiouUm1kKiosIFBvc3Rlcmlvcm1lbnRlLCBlbCBhcmNoaXZvIGBhcGEuY3NsYCBzZSBtYW5kYSBhICpsbGFtYXIqIGRlc2RlIGVsICoqWUFNTCoqIGNvbiBlbCBzY3JpcHQgYGNzbDogYXBhLmNzbGAuCgpgYGAKLS0tCm91dHB1dDogaHRtbF9kb2N1bWVudApiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliCmNzbDogYXBhLmNzbAotLS0KYGBgCgpVbmEgdmV6IHF1ZSBzZSBjdWVudGEgY29uIGVsIGFyY2hpdm8gZW4gZm9ybWF0byBgLmJpYmAgY29uIGVsIGxpc3RhZG8gZGUgbGFzIG9icmFzIGEgcmVmZXJlbmNpYXMsIGFzw60gY29tbyBjb24gZWwgYXJjaGl2byBlbiBmb3JtYXRvIGAuY3NsYCwgcXVlIGNvbnRpZW5lIGxhIGVzdHJ1Y3R1cmEgZGVsIGVzdGlsbyBkZSBjaXRhY2nDs24gYSB1dGlsaXphciwgeWEgc2UgZXN0w6EgbGlzdG8gcGFyYSBjb21lbnphciBsYSBpbnNlcmNpw7NuIGRlIHJlZmVyZW5jaWFzIGJpYmxpb2dyw6FmaWNhcyBhc8OtIGNvbW8gcGFyYSBpbnRlZ3JhciBlbCBsaXN0YWRvIGJpYmxpb2dyw6FmaWNvcyBlbiBlbCAqKm91dHB1dCoqLgoKCiMjIyA1LjMuIEluc2VyY2nDs24gZGUgcmVmZXJlbmNpYXMgZW4gZWwgdGV4dG8uCgpQYXJhIGluc2VydGFyIHVuYSByZWZlcmVuY2lhIHNlIHV0aWxpemEgZWwgc8OtbWJvbG8gYEBrZXlgIHkgc2UgZXNjcmliZSBlbCBub21icmUgcXVlIGVsIHNpc3RlbWEgbGUgYXNpZ27DsyBhIGNhZGEgcmVmZXJlbmNpYS4gRWwgYEBrZXlgIHNlIHJlZmllcmUgYWwgbm9tYnJlIHF1ZSBsZSBhc2lnbmEgYXV0b23DoXRpY2FtZW50ZSBlbCBsaXN0YWRvIGRlIEJpYlRleC5cCkV4aXN0ZW4gdmFyaWFzIG1hbmVyYXMgZGUgaW5zZXJ0YXIgdW5hIHJlZmVyZW5jaWEgYmlibGlvZ3LDoWZpY2EgZW4gZWwgdGV4dG86CgoxLiAgSW5zZXJ0YXIgdW5hIHNvbGEgb2JyYSBlbiB1bmEgcmVmZXJlbmNpYS4KRW4gY2FzbyBkZSBpbnNlcnRhciB1bmEgcmVmZXJlbmNpYSBjb24gdW4gc29sbyBhdXRvciwgZW50cmUgcGFyw6ludGVzaXM6CmBbQGtleV1gCgoyLiAgSW5zZXJ0YXIgbcOhcyBkZSB1bmEgb2JyYSBlbiB1bmEgcmVmZXJlbmNpYS4KRW4gY2FzbyBkZSBpbnNlcnRhciB1bmEgcmVmZXJlbmNpYSBjb24gbcOhcyBkZSB1biBhdXRvciwgZW50cmUgcGFyw6ludGVzaXM6CmBbQGtleTE7IEBrZXkyXWAKCjMuICBJbnNlcnRhciBub21icmUgZGUgYXV0b3IgZW4gdGV4dG8geSBhw7FvIGVudHJlIHBhcsOpbnRlc2lzLgpFbiBjYXNvIGRlIGluc2VydGFyIGVsIGFwZWxsaWRvIGRlbCBhdXRvciBlbiBlbCB0ZXh0bywgZWwgYcOxbyBkZSBsYSBvYnJhIGFwYXJlY2Vyw6EgZW50cmUgcGFyw6ludGVzaXM6CmBAa2V5YAoKNC4gIEluc2VydGFyIGHDsW8gZW50cmUgcGFyw6ludGVzaXMgeSBleGNsdWlyIG5vbWJyZSBkZSBhdXRvci4KRW4gY2FzbyBkZSBpbnNlcnRhciBlbCBhw7FvIGRlIGxhIG9icmEgZW4gbGEgcmVmZXJlbmNpYSBlbnRyZSBwYXLDqW50ZXNpcyB5IGV4Y2x1aXIgZWwgbm9tYnJlIGRlbCBhdXRvcjoKYFstQGtleV1gCgo1LiAgSW5zZXJ0YXIgdW5hIG9icmEgeSBkZWZpbmlyIGxhcyBww6FnaW5hcyBjb25zdWx0YWRhcy4KYFtAa2V5LCBww6FnLiAxMjNdYAoKIyMjIDUuNC4gSW5jbHVpciBzZWNjacOzbiBkZWwgbGlzdGFkbyBiaWJsaW9ncsOhZmljbwoKVHJhcyBpbnNlcnRhciBsYXMgcmVmZXJlbmNpYXMsIFIgTWFya2Rvd24gY29uc3RydXllIGVsIGxpc3RhZG8gYmlibGlvZ3LDoWZpY28gb3JkZW5hZG8gYWxmYWLDqXRpY2FtZW50ZS4gU2luIGVtYmFyZ28gc2UgcmVxdWllcmUgY3JlYXIgdW5hIHNlY2Npw7NuIGVzcGVjw61maWNhIHBhcmEgZWxsbyBwdWVzIGVsIHByb2dyYW1hIG5vIGRpc3Rpbmd1ZSBwb3Igc8OtCnNvbG8gZWwgZXNwYWNpbyBlbiBlbCBkb2N1bWVudG8gcGFyYSBpbmNsdWlybG8uXApQYXJhIGVsbG8gZXMgbmVjZXNhcmlvIGluY2x1aXIgdW4gKipzdWJhcGFydGFkbyoqIChtZWRpYW50ZSBlbCB1c28gZGUgYCMjYCkgYWwgZmluYWwgZGVsIGRvY3VtZW50bywgcGFydGlyIGRlIGHDsWFkaXIgbG9zIHNpZ25vcyBkZSBudW1lcmFsZXMgcGVydGluZW50ZXMgYXPDrSBjb21vIGVsIHTDrXR1bG8gImJpYmxpb2dyw6Fmw61hIiBvIGNvcnJlc3BvbmRpZW50ZS4gWSBkaWNoYSBzZWNjacOzbiBkZWJlIGVzdGFyIHZhY8OtYS4gRGUgZXN0YSBtYW5lcmEgUiBNYXJrZG93biBpZGVudGlmaWNhcsOhIHF1ZSBlc2UgZXMgZWwgZXNwYWNpbyBkb25kZSBpbmNsdWlyw6EgbGEgaW5mb3JtYWNpw7NuIGRlbCBsaXN0YWRvIGJpYmxpb2dyw6FmaWNvIGRlIGxhIG9icmEuCgpgYGAKRmluYWwgZGVsIHRleHRvLgoKIyMgQmlibGlvZ3JhZsOtYQooZXNwYWNpbyB2YWPDrW8pCgpgYGAKCiMjIDYuIFBsYW50aWxsYXMgZGUgYXJ0w61jdWxvcyBjaWVudMOtZmljb3MgY29uIGBkaXN0aWxsKClgLCBgcnRpY2xlcygpYCB5IGBwYXBhamEoKWAuCgpDb24gZWwgZm9ydGFsZWNpbWllbnRvIGRlbCBjcml0ZXJpbyBkZSAiY2llbmNpYSBhYmllcnRhIiB5IGVsIGF1bWVudG8gZGUgcmVjdXJzb3MgdGVjbm9sw7NnaWNvcyBwYXJhIGNvbXBhcnRpciBsb3MgZWxlbWVudG9zIGRlIGxhIGludmVzdGlnYWNpw7NuIGNpZW50w61maWNhLCBob3kgZW4gZMOtYSBzZSBjdWVudGEgY29uIGxhIHBvc2liaWxpZGFkIGRlIGhhY2VyIHDDumJsaWNvcyB5YSBubyBzb2xvIGxvcyByZXN1bHRhZG9zIGRlIHVuIGFuw6FsaXNpcywgc2lubyB0YW1iacOpbiBsb3MgZGF0b3MgdXRpbGl6YWRvcyBhc8OtIGNvbW8gbG9zIGPDs2RpZ29zIGRlIFIgZWxhYm9yYWRvcyB5LCBhZGVtw6FzLCBlbCBjb250ZW5pZG8gZGUgbG9zIHRleHRvcy4gRW4gZXN0ZSBzZW50aWRvLCBlbCBmb3JtYXRvIGRlIGAuUm1kYCBzZSBoYSB2dWVsdG8gbXV5IMO6dGlsIHBhcmEgcGVybWl0aXIgcXVlIHRvZG9zIGVzdG9zIGVsZW1lbnRvcyBkZSB1biBkb2N1bWVudG8gZGUgYW7DoWxpc2lzIGRlIGRhdG9zIHNlIHB1ZWRhIGNvbXBhcnRpciBkZSBtYW5lcmEgYWJpZXJ0YSBhbCBww7pibGljby5cClBhcmEgZWxsbyBzZSBjdWVudGEsIGFkZW3DoXMsIGNvbiB2YXJpYXMgbGlicmVyw61hcyBxdWUgcGVybWl0ZW4gc2lzdGVtYXRpemFyIGxhcyBlc3RydWN0dXJhcyBkZSBsb3MgZG9jdW1lbnRvcyBkZSBgLlJtZGAsIGVuIGRvbmRlIHVuIGF1dG9yIHNvbG8gZGViZSBhanVzdGFyIHN1IGNvbnRlbmlkbyBhIGRpY2hhcyBwbGFudGlsbGFzIHksIGRlIGVzYSBtYW5lcmEsIHN1IHByZW9jdXBhY2nDs24gc2UgY2VudHJlIGVuIGxhIHJlZGFjY2nDs24gZGVsIHRleHRvIHkgZW4gbGEgZWxhYm9yYWNpw7NuIGRlIGPDs2RpZ29zIHkgcmVzdWx0YWRvcyBkZWwgYW7DoWxpc2lzIGRlIGxvcyBkYXRvcy5cCkVudHJlIGxhcyBsaWJyZXLDrWFzIHF1ZSBzZSByZXZpc2Fyw6FuIGEgY29udGludWFjacOzbiBzZSBlbmN1ZW50cmFuIGxhcyBkZSAnZGlzdGlsbCgpYCwgYHJ0aWNsZXNgIHkgYHBhcGFqYSgpYC4gTGFzIHByaW1lcmFzIGRvcyBsaWJyZXLDrWFzIHNlIHB1ZWRlbiBpbnN0YWxhciBkZXNkZSBlbCBDUkFOIGRlIFIgeSBSIFN0dWRpbzoKCmBgYAppbnN0YWxsLnBhY2thZ2VzKCJkaXN0aWxsIikKaW5zdGFsbC5wYWNrYWdlcygicnRpY2xlcyIpCmBgYApFbiBlbCBjYXNvIGRlIGxhIGxpYnJlcsOtYSBkZSBgcGFwYWphKClgLCBzdSBpbnN0YWxhY2nDs24gc2UgZGViZSByZWFsaXphciBkaXJlY3RhbWVudGUgZGVzZGUgZWwgcmVwb3NpdG9yaW8gZGVsIGRpc2XDsWFkb3IuIEVzdGUgcHJvY2VzbyByZXF1aWVyZSBhcG95YXJzZSBlbiBvdHJhIHBhcXVldGVyw61hIGRlbm9taW5hZGEgYGRldnRvb2xzKClgLlwKRW4gY2FzbyBkZSBubyBjb250YXIgcHJldmlhbWVudGUgY29uIGBkZXZ0b29scygpYCwgdW5hIG1hbmVyYSBwYXJhIGluc3RhbGFybG8gZXM6CgpgYGAKaWYoISJkZXZ0b29scyIgJWluJSByb3duYW1lcyhpbnN0YWxsZWQucGFja2FnZXMoKSkpIGluc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikKYGBgCgpQb3N0ZXJpb3JtZW50ZSBzZSBwdWVkZSBpbnN0YWxhciBgcGFwYWphKClgIGRlc2RlIEdpdEh1YiBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgoKYGBgCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiY3JzaC9wYXBhamEiKQpgYGAKCiMjIyA2LjEuIERvY3VtZW50b3MgZW4gZm9ybWF0byAqKkFQQSoqIGNvbiBgcGFwYWphKClgLgoKTGEgbGlicmVyw61hIGBwYXBhamEoKWAgZnVlIGRpc2XDsWFkYSBwYXJhIGZhY2lsaXRhciBlbCBkaXNlw7FvIGRlIGRvY3VtZW50b3MgZGUgc2FsaWRhIGJham8gZWwgZm9ybWF0byBlc3RhYmxlY2lkbyBwb3IgbGEgQW1lcmljYW4gUHN5Y2hvbG9neSBBc3NvY2lhdGlvbiAoQVBBKSwgeSBhY3R1YWxtZW50ZSBsYSBwYXF1ZXRlcsOtYSB0b21hIGVuIGNvbnNpZGVyYWNpw7NuIGxhcyBndcOtYXMgZXN0YWJsZWNpZGFzIGVuIGxhIDZhIGVkaWNpw7NuLlwKRW4gbGEgW3DDoWdpbmEgd2ViIGRlIGBwYXBhamEoKWBdKGh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9wYXBhamEvdmVyc2lvbnMvMC4xLjAuOTk5Nykgc2UgZW5jdWVudHJhLCBhZGVtw6FzLCB1biBjb25qdW50byBkZSBjb21hbmRvIHF1ZSwgYSBzdSB2ZXosIHBlcm1pdGVuIGFqdXN0YXIgbGEgbWFuZXJhIGRlIGluc2VydGFyIHRhYmxhcyB5IGdyw6FmaWNvcywgYXPDrSBjb21vIGxhIHByZXNlbnRhY2nDs24gZGUgbG9zIHJlc3VsdGFkb3MgZGUgbG9zIGFuw6FsaXNpcyBkZSBkYXRvcy5cClBhcmEgY29tZW56YXIgYSB1dGlsaXphciBsYSBwbGFudGlsbGEgZGUgdGV4dG8gZW4gZm9ybWF0byBBUEEgNmEgZWRpY2nDs24gZW4gYmFzZSBhIGBwYXBhamEoKWAsIGVzdG8gc2UgZGVmaW5lIGFsIG1vbWVudG8gZGUgYWJyaXIgdW4gbnVldm8gZG9jdW1lbnRvIGVuIGZvcm1hdG8gYC5SbWRgLiBFbiBsYSB2ZW50YW5hIGVtZXJnZW50ZSBwYXJhIGRlZmluaXIgYWwgbnVldm8gYXJjaGl2byBkZSBgLlJtZGAgc2Ugc2VsZWNjaW9uYSBsYSBvcGNpw7NuIGRlICpwbGFudGlsbGFzKiBvICpGcm9tIFRlbXBsYXRlKiwgeSBzZSBsb2NhbGl6YSBlbCBub21icmUgZGUgbGEgcGxhbnRpbGxhICoqQVBBIGFydGljbGUgKDZ0aCBlZGl0aW9uKSB7cGFwYWphfSoqLgoKYGBge3IsIGVjaG89RkFMU0UsIG91dC53aWR0aD0iOTAlIiwgZmlnLmNhcD0iU2VsZWNjacOzbiBkZSBsYSBwbGFudGlsbGEgZGUgdW4gZG9jdW1lbnRvIGVuIGZvcm1hdG8gQVBBIDZhLiBlZGljacOzbiBjb24gYHBhcGFqYSgpYC4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygicGFwYWphLnBuZyIpCmBgYAoKRWwgcmVzdWx0YWRvIHF1ZSBhcnJvamEgZXN0YSBzZWxlY2Npw7NuIGNvbnNpc3RlIGVuIGxhIGFwZXJ0dXJhIGRlIHVuIGRvY3VtZW50byBudWV2byBkZSBgLlJtZGAgY29uIHVuYSBlc3RydWN0dXJhIHBhcnRpY3VsYXIgZW4gZWwgKipZQU1MKiogYXPDrSBjb21vIGVuIHRvcm5vIGEgbGEgZXN0cnVjdHVyYWNpw7NuIGRlbCBjb250ZW5pZG8gZGVsIHRleHRvIGFzw60gY29tbyBkZSBsb3MgImNodW5rcyIuXApQb3IgZWplbXBsbywgbGEgZXN0cnVjdHVyYSBkZWwgKipZQU1MKiogZXMgbGEgc2lndWllbnRlOgoKYGBgCi0tLQp0aXRsZSAgICAgICAgICAgICA6ICJUaGUgdGl0bGUiCnNob3J0dGl0bGUgICAgICAgIDogIlRpdGxlIgoKYXV0aG9yOiAKICAtIG5hbWUgICAgICAgICAgOiAiRmlyc3QgQXV0aG9yIgogICAgYWZmaWxpYXRpb24gICA6ICIxIgogICAgY29ycmVzcG9uZGluZyA6IHllcyAgICAjIERlZmluZSBvbmx5IG9uZSBjb3JyZXNwb25kaW5nIGF1dGhvcgogICAgYWRkcmVzcyAgICAgICA6ICJQb3N0YWwgYWRkcmVzcyIKICAgIGVtYWlsICAgICAgICAgOiAibXlAZW1haWwuY29tIgogICAgcm9sZTogICAgICAgICAjIENvbnRyaWJ1dG9yc2hpcCByb2xlcyAoZS5nLiwgQ1JlZGlULCBodHRwczovL2Nhc3JhaS5vcmcvY3JlZGl0LykKICAgICAgLSBDb25jZXB0dWFsaXphdGlvbgogICAgICAtIFdyaXRpbmcgLSBPcmlnaW5hbCBEcmFmdCBQcmVwYXJhdGlvbgogICAgICAtIFdyaXRpbmcgLSBSZXZpZXcgJiBFZGl0aW5nCiAgLSBuYW1lICAgICAgICAgIDogIkVybnN0LUF1Z3VzdCBEb2VsbGUiCiAgICBhZmZpbGlhdGlvbiAgIDogIjEsMiIKICAgIHJvbGU6CiAgICAgIC0gV3JpdGluZyAtIFJldmlldyAmIEVkaXRpbmcKCmFmZmlsaWF0aW9uOgogIC0gaWQgICAgICAgICAgICA6ICIxIgogICAgaW5zdGl0dXRpb24gICA6ICJXaWxoZWxtLVd1bmR0LVVuaXZlcnNpdHkiCiAgLSBpZCAgICAgICAgICAgIDogIjIiCiAgICBpbnN0aXR1dGlvbiAgIDogIktvbnN0YW56IEJ1c2luZXNzIFNjaG9vbCIKCmF1dGhvcm5vdGU6IHwKICBBZGQgY29tcGxldGUgZGVwYXJ0bWVudGFsIGFmZmlsaWF0aW9ucyBmb3IgZWFjaCBhdXRob3IgaGVyZS4gRWFjaCBuZXcgbGluZSBoZXJlaW4gbXVzdCBiZSBpbmRlbnRlZCwgbGlrZSB0aGlzIGxpbmUuCgogIEVudGVyIGF1dGhvciBub3RlIGhlcmUuCgphYnN0cmFjdDogfAogIE9uZSBvciB0d28gc2VudGVuY2VzIHByb3ZpZGluZyBhICoqYmFzaWMgaW50cm9kdWN0aW9uKiogdG8gdGhlIGZpZWxkLCAgY29tcHJlaGVuc2libGUgdG8gYSBzY2llbnRpc3QgaW4gYW55IGRpc2NpcGxpbmUuCiAgCiAgVHdvIHRvIHRocmVlIHNlbnRlbmNlcyBvZiAqKm1vcmUgZGV0YWlsZWQgYmFja2dyb3VuZCoqLCBjb21wcmVoZW5zaWJsZSAgdG8gc2NpZW50aXN0cyBpbiByZWxhdGVkIGRpc2NpcGxpbmVzLgogIAogIE9uZSBzZW50ZW5jZSBjbGVhcmx5IHN0YXRpbmcgdGhlICoqZ2VuZXJhbCBwcm9ibGVtKiogYmVpbmcgYWRkcmVzc2VkIGJ5ICB0aGlzIHBhcnRpY3VsYXIgc3R1ZHkuCiAgCiAgT25lIHNlbnRlbmNlIHN1bW1hcml6aW5nIHRoZSBtYWluIHJlc3VsdCAod2l0aCB0aGUgd29yZHMgIioqaGVyZSB3ZSBzaG93KioiIG9yIHRoZWlyIGVxdWl2YWxlbnQpLgogIAogIFR3byBvciB0aHJlZSBzZW50ZW5jZXMgZXhwbGFpbmluZyB3aGF0IHRoZSAqKm1haW4gcmVzdWx0KiogcmV2ZWFscyBpbiBkaXJlY3QgY29tcGFyaXNvbiB0byB3aGF0IHdhcyB0aG91Z2h0IHRvIGJlIHRoZSBjYXNlIHByZXZpb3VzbHksIG9yIGhvdyB0aGUgIG1haW4gcmVzdWx0IGFkZHMgdG8gcHJldmlvdXMga25vd2xlZGdlLgogIAogIE9uZSBvciB0d28gc2VudGVuY2VzIHRvIHB1dCB0aGUgcmVzdWx0cyBpbnRvIGEgbW9yZSAqKmdlbmVyYWwgY29udGV4dCoqLgogIAogIFR3byBvciB0aHJlZSBzZW50ZW5jZXMgdG8gcHJvdmlkZSBhICoqYnJvYWRlciBwZXJzcGVjdGl2ZSoqLCByZWFkaWx5IGNvbXByZWhlbnNpYmxlIHRvIGEgc2NpZW50aXN0IGluIGFueSBkaXNjaXBsaW5lLgogIAogIDwhLS0gaHR0cHM6Ly90aW55dXJsLmNvbS95YnJlbWVscSAtLT4KICAKa2V5d29yZHMgICAgICAgICAgOiAia2V5d29yZHMiCndvcmRjb3VudCAgICAgICAgIDogIlgiCgpiaWJsaW9ncmFwaHkgICAgICA6IFsici1yZWZlcmVuY2VzLmJpYiJdCgpmbG9hdHNpbnRleHQgICAgICA6IG5vCmZpZ3VyZWxpc3QgICAgICAgIDogbm8KdGFibGVsaXN0ICAgICAgICAgOiBubwpmb290bm90ZWxpc3QgICAgICA6IG5vCmxpbmVudW1iZXJzICAgICAgIDogeWVzCm1hc2sgICAgICAgICAgICAgIDogbm8KZHJhZnQgICAgICAgICAgICAgOiBubwoKZG9jdW1lbnRjbGFzcyAgICAgOiAiYXBhNiIKY2xhc3NvcHRpb24gICAgICAgOiAibWFuIgpvdXRwdXQgICAgICAgICAgICA6IHBhcGFqYTo6YXBhNl9wZGYKLS0tCmBgYAoKIyMjIDYuMi4gQXJ0w61jdWxvcyBjaWVudMOtZmljb3MgY29uIGBkaXN0aWxsKClgLgoKTGEgcGFxdWV0ZXLDrWEgYGRpc3RpbGwoKWAgY29uc2lzdGUgZW4gdW5hIHBsYW50aWxsYSBiw6FzaWNhIHBhcmEgbGEgY29uc3RydWNjacOzbiBkZSB1biBhcnTDrWN1bG8gY2llbnTDrWZpY28uIEVzdGUgZm9ybWF0byBwZXJtaXRlIGludGVncmFyIHRhbnRvIHRleHRvLCBzaWdub3MgbWF0ZW3DoXRpY29zIGRlc2RlICJMYVRleCIsIGNpdGFjaW9uZXMgeSBwaWVzIGRlIHDDoWdpbmEsIGdyw6FmaWNvcyB5IHRhYmxhcyBkZSBjb250ZW5pZG8sIGVudHJlIG90cm9zIGVsZW1lbnRvcyBxdWUgbGVzIHNvbiBjYXJhY3RlcsOtc3RpY29zLiBFbiBsYSBbcMOhZ2luYSB3ZWIgZGUgYGRpc3RpbGwoKWBdKGh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vZGlzdGlsbC8pIHNlIHB1ZWRlbiByZXZpc2FyIGNvbiBkZXRhbGxlcyB0b2RvcyBsb3MgZWxlbWVudG9zIHF1ZSBzZSBwdWVkZW4gY29uZmlndXJhci5cCkxhIG1hbmVyYSBkZSBhYnJpciB1bmEgcGxhbnRpbGxhIGRlc2RlIGBkaXN0aWxsKClgIGNvbnNpc3RlIGVuIHNlbGVjY2lvbmFyIGVzdGUgdGlwbyBkZSBkb2N1bWVudG8gZGVzZGUgbGEgdmVudGFuYSBlbWVyZ2VudGUgZG9uZGUgc2UgYWJyZW4gbG9zIG51ZXZvcyBkb2N1bWVudG9zIGAuUm1kYCwgZGUgbGEgc2lndWllbnRlIG1hbmVyYToKCmBgYHtyLCBlY2hvPUZBTFNFLCBvdXQud2lkdGg9IjkwJSIsIGZpZy5jYXA9IlNlbGVjY2nDs24gZGUgbGEgcGxhbnRpbGxhIGRlIHVuIGFydMOtY3VsbyBjaWVudMOtZmljbyBkZXNkZSBgZGlzdGlsbCgpYC4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiZGlzdGlsbC5wbmciKQpgYGAKCkEgcGFydGlyIGRlIGVzdGEgcGxhdGlsbGEgZGUgYXJ0w61jdWxvIGNpZW50w61maWNvLCBzZSBhYnJlIHVuYSBudWV2YSB2ZW50YW5hIGRlIHVuIGFyY2hpdm8gZW4gZm9ybWF0byBgLlJtZGAgcXVlIGVzdHJ1Y3R1cmEgdGFudG8gZWwgY29udGVuaWRvIGRlbCB0ZXh0bywgYXPDrSBjb21vIGRlIGxvcyAiY2h1bmtzIi4gTWllbnRyYXMgcXVlIGxhIGVzdHJ1Y3R1cmEgZGVsICoqWUFNTCoqIHNlcsOhIGxhIHNpZ3VpZW50ZToKCmBgYAotLS0KdGl0bGU6ICJEaXN0aWxsIGZvciBSIE1hcmtkb3duIgpkZXNjcmlwdGlvbjogfCAKICBTY2llbnRpZmljIGFuZCB0ZWNobmljYWwgd3JpdGluZywgbmF0aXZlIHRvIHRoZSB3ZWIKZGF0ZTogTWF5IDQsIDIwMTgKYXV0aG9yOgogIC0gZmlyc3RfbmFtZTogIllpaHVpIgogICAgbGFzdF9uYW1lOiAiWGllIgogICAgdXJsOiBodHRwczovL2dpdGh1Yi5jb20veWlodWkKICAgIGFmZmlsaWF0aW9uOiBSU3R1ZGlvCiAgICBhZmZpbGlhdGlvbl91cmw6IGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tCiAgICBvcmNpZF9pZDogMDAwMC0wMDAzLTA2NDUtNTY2NgogIC0gbmFtZTogIkpKIEFsbGFpcmUiCiAgICB1cmw6IGh0dHBzOi8vZ2l0aHViLmNvbS9qamFsbGFpcmUKICAgIGFmZmlsaWF0aW9uOiBSU3R1ZGlvCiAgICBhZmZpbGlhdGlvbl91cmw6IGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tCiAgLSBuYW1lOiAiUmljaCBJYW5ub25lIgogICAgdXJsOiBodHRwczovL2dpdGh1Yi5jb20vcmljaC1pYW5ub25lCiAgICBhZmZpbGlhdGlvbjogUlN0dWRpbwogICAgYWZmaWxpYXRpb25fdXJsOiBodHRwczovL3d3dy5yc3R1ZGlvLmNvbQpiaWJsaW9ncmFwaHk6IGJpYmxpby5iaWIKb3V0cHV0OiBkaXN0aWxsOjpkaXN0aWxsX2FydGljbGUKLS0tCmBgYAoKIyMjIDYuMy4gQXJ0w61jdWxvcyBjaWVudMOtZmljb3MgcGFyYSBkaXZlcnNhcyBlZGl0b3JpYWxlcyBkZXNkZSBgcnRpY2xlcygpYC4KCkZpbmFsbWVudGUsIGxhIHBhcXVldGVyw61hIGBydGljbGVzKClgIHNlIGhhIHZ1ZWx0byBtdXkgw7p0aWwgcGFyYSBsYSBwcm9kdWNjacOzbiBkZSBhcnTDrWN1bG9zIHF1ZSBzZSBhanVzdGVuIGRpcmVjdGFtZW50ZSBhIGxhcyBuZWNlc2lkYWRlcyBkZSBkaXZlcnNhcyBlZGl0b3JpYWxlcywgY29tbyBwb3IgZWplbXBsbzogRWxzZXZpZXIsIE94Zm9yZCBVbml2ZXJzaXR5IFByZXNzLCBQTE9TLCBTQUdFLCBUYXlsb3MgJiBGcmFuY2lzLCBlbnRyZSBvdHJhcyBwdWJsaWNhY2lvbmVzIGVzcGVjw61maWNhcy4gRGUgbWFuZXJhIG3DoXMgZGV0YWxsYWRhIHNlIHB1ZWRlIHJldmlzYXIgZXN0ZSBsaXN0YWRvIGVuIGxhIFtww6FnaW5hIGRlIGxhIGxpYnJlcsOtYV0oaHR0cHM6Ly9naXRodWIuY29tL3JzdHVkaW8vcnRpY2xlcykuXApMYSBtYW5lcmEgcGFyYSByZXZpc2FyIHkgc2VsZWNjaW9uYXIgbGEgcGxhbnRpbGxhIGRlbCBhcnTDrWN1bG8gYSBjb25zdHJ1aXIgZXMgbWVkaWFudGUgbGEgYXBlcnR1cmEgZGUgbGEgdmVudGFuYSBlbWVyZ2VudGUgcGFyYSBzb2xpY2l0YXIgdW4gbnVldm8gYXJjaGl2byBlbiBmb3JtYXRvIGAuUm1kYCBkZXNkZSBSIFN0dWRpby4gVHJhcyBzZWxlY2Npb25hciBsYSBhcGVydHVyYSBkZSB1bmEgcGxhbnRpbGxhICgiRnJvbSBUZW1wbGF0ZSIpLCBzZSBwdWVkZSBvYnNlcnZhciBlbCBsaXN0YWRvIGRlIHRvZG9zIGxvcyBmb3JtYXRvcyBkZSBhcnTDrWN1bG9zIGluY2x1aWRvcyBlbiBsYSBsaWJyZXLDrWEgYHJ0aWNsZXMoKWAsIGRlIGxhIHNpZ3VpZW50ZSBmb3JtYToKCmBgYHtyLCBlY2hvPUZBTFNFLCBvdXQud2lkdGg9IjkwJSIsIGZpZy5jYXA9IlNlbGVjY2nDs24gZGUgbGEgcGxhbnRpbGxhIGRlIHVuIGFydMOtY3VsbyBjaWVudMOtZmljbyBkZXNkZSBgcnRpY2xlcygpYC4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygicnRpY2xlcy5wbmciKQpgYGAKCkVsIHJlc3VsdGFkbyBkZSBsYSBzZWxlY2Npw7NuIGRlIGxhIHBsYW50aWxsYSBzZXLDoSB2YXJpYWRvIHNlZ8O6biBlbCB0aXBvIGRlIGFydMOtY3VsbyBzb2xpY2l0YWRvLCB5IGRlIGVzYSBtYW5lcmEgdmFyaWFyw6EsIHBvciBlamVtcGxvLCBsYSBlc3RydWN0dXJhIGRlbCAqKllBTUwqKi4gKHBvciBlbGxvIGFob3JhIG5vIHNlIHByZXNlbnRhIHVuIHJlc3VsdGFkbyBwYXJ0aWN1bGFyKQo=