Uma
visão geral sobre o R Markdown
O
que é R Markdown?
R Markdown é uma linguagem de
marcação que combina o poder do R com a simplicidade
do Markdown. Essa ferramenta versátil foi desenvolvida para facilitar a
criação de documentos dinâmicos e reprodutíveis, integrando código,
texto e resultados em um único ambiente.
Um
pouco de história
O R Markdown teve suas origens no ecossistema do R, uma linguagem de programação estatística popular
entre cientistas de dados e pesquisadores. A ideia era criar um formato
de documento que permitisse a incorporação de análises de dados
diretamente no texto, facilitando a comunicação e a reprodução dos
resultados. O R Markdown é uma extensão do Markdown, que por sua vez foi
criado por John Gruber e Aaron Swartz em 2004.
Desenvolvimento do R Markdown
A criação do R Markdown é atribuída a Yihui Xie, um estatístico e
desenvolvedor chinês que contribuiu significativamente para a comunidade
R. Yihui Xie percebeu a necessidade de um formato de documento que fosse
mais flexível e permitisse a integração fluida de código R em documentos
de texto. Em 2012, ele lançou o pacote knitr
para o R, que facilitou a execução de código R incorporado em
documentos. O R Markdown surgiu como uma evolução natural desse
trabalho, proporcionando uma experiência mais simplificada e amigável
para os usuários.
Os objetivos principais por trás do R Markdown eram fornecer uma maneira
fácil e eficiente de combinar narrativas, código e resultados em um
único documento.
Benefícios do R Markdown
Algumas características e benefícios importantes incluem:
- Reprodutibilidade:
-
A capacidade de incorporar código diretamente no documento permite a
reprodução fácil e rápida dos resultados, garantindo a transparência e a
confiabilidade.
- Comunicação Efetiva:
-
Ao integrar análises de dados diretamente no texto, o R Markdown torna a
comunicação de resultados mais clara e compreensível, tornando a análise
de dados mais acessível para um público mais amplo.
- Flexibilidade:
-
Suporte para vários formatos de saída, como HTML, PDF, Word, entre
outros, proporciona flexibilidade na apresentação dos resultados.
Como criar o seu arquivo
Markdown
Para começar a utilizar o Markdown, você precisa ter algumas
ferramentas instaladas no seu ambiente de desenvolvimento. Aqui estão as
principais ferramentas que você precisa:
- R:
-
O R é uma linguagem de programação estatística amplamente
utilizada.
- RStudio:
-
Embora não seja estritamente necessário, o RStudio é um ambiente de
desenvolvimento integrado (IDE) muito popular para o R e é altamente
recomendado para trabalhar com R Markdown devido à sua integração
perfeita.
- Pandoc:
-
O Pandoc é uma ferramenta de conversão de documentos que o R Markdown
utiliza para converter documentos Markdown em vários formatos de saída,
como HTML, PDF, Word, etc. O RStudio instala
automaticamente o Pandoc. No entanto, se você não estiver
usando o RStudio ou precisar de uma versão mais recente do Pandoc, você
pode baixá-lo diretamente do site oficial.
Para começar, utilizaremos exclusivamente o R e o RStudio. Após a
instalação de ambos, você deve abrir o RStudio para iniciar o documento
RMarkdown.
Obs: Serão apresentadas aqui duas formas de como
você pode armazenar seu documento RMarkdown. O autor deste guia utiliza
e recomenda a segunda forma.
Segunda foma
Com o Rstudio aberto, você deve ir no canto superior esquerdo em
File > New Project....

Agora escolha a opção New Directory para iniciar um
projeto ne um novo diretório de
trabalho.

Escolha a opção New Project para criar um novo projeto
em um diretório vazio.

Coloque um nome no seu diretório. Após isso, vá no seu
Explorador de Arquivos e crie uma pasta para ser seu
subdiretório. Você pode utilizar um único subdiretório para armazenar
vários diretórios.

Volte para o Rstudio e vá na opção Browse... para
selecionar a pasta que você criou como subdiretório.

Lembre de deixar selecionado a opção
Use renv with this project para que seja utilizado um
caminho relativo.
Feito isso, basta ir em
Create Project para criar o seu
novo projeto.
Com o projeto criado, basta criar o arquivo Markdown. Você pode fazer
de duas formas: a primeira mostrada será a recomendada para quem está
começando ou para quem está querendo seguir este guia de RMarkdown à
risca, e a segunda forma é para quem já sabe um pouco de Markdown,
inclusive fazer uma cabeçalho YAML, o que será mostrado nos ultimos
capítulos deste guia.
Renderização do documento no RMarkdown
Para começar, escreva qualquer coisa que venha na sua mente abaixo do
cabeçalho YAML. Após isso aperte
Ctrl+Shift+k ou clique no botão
Knit para renderizar o documento, igual na seguinte imagem.
Cabeçalhos
Para inserir seções de diferentes níveis, vulgo cabeçalhos, você vai
utilizar a seguinte sintaxe
# Cabeçalho 1
## Cabeçalho 2
### Cabeçalho 3
#### Cabeçalho 4
##### Cabeçalho 5
###### Cabeçalho 6
Cabeçalho 1
Cabeçalho 2
Cabeçalho 3
Cabeçalho 4
Cabeçalho 5
Cabeçalho 6
Observe a relação entre os cabeçalhos: os de nível mais alto estão
aninhados dentro dos de nível mais baixo, desde que os de nível mais
alto sejam posicionados após os de nível mais baixos.
Opções de output para
cabeçalho
Sem numeração e não listado no
índice
O RMarkdown permite utilizar algumas opções que mudam o output do
cabeçalho. Nos cabeçalhos anteriores você deve ter percebido que não há
numeração e eles também não são colocados no índice. Para que isso
ocorra, use o seguinte código em que .unlisted tira o
cabeçalho do índice e .unnumbered tira a numeração.
#### Cabeçalho sem numeração e não listado no índice {.unlisted .unnumbered}
Cabeçalho sem numeração e não
listado no índice
Abas iterativas
Também é possível tranformar os cabeçalhos em abas iterativas a
partir da opção.tabset. Outra opção como
.tabset-fade permite deixar a transição entre as abas mais
suave. O exemplo a seguir ilustra esses comandos.
#### Seções com Abas {.tabset .tabset-fade .unlisted .unnumbered}
##### Aba 1 {.unlisted .unnumbered}
Este é o conteúdo da Aba 1.
##### Aba 2 {.unlisted .unnumbered}
Este é o conteúdo da Aba 2.
##### Aba 3 {.unlisted .unnumbered}
Este é o conteúdo da Aba 3.
Quebra de linha
Para fazer quebra de linha basta colocar dois espaços no final de um
texto ou adicionar uma barra invertida, de acordo com o seguinte
código.
Aqui vai ser realizado uma quebra de linha
Aqui também será feito uma quebra de linha\
Aqui vai ser realizado uma quebra de
linha
Aqui também será feito uma quebra de linha
Além disso, se você quer adicionar mais quebras de linhas, mas em
linhas sem nenhuma informação, é possível fazer o seguinte código
html.
Aqui será realizado ...\
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
... várias quebras de linha\
Aqui será realizado …
… várias quebras de
linha
Algumas opções de formatação de texto
| *itálico* |
itálico |
| _itálico_ |
itálico |
| *em*apenas*algumas*letras |
emapenasalgumasletras |
| **negrito** |
negrito |
| __negrito__ |
negrito |
| **em**apenas**algumas**letras |
emapenasalgumasletras |
| sobrescrito^2^ |
sobrescrito2 |
| subscrito~2~ |
subscrito2 |
| ~~sublinhado~~ |
sublinhado |
Bloco
de citação
Para adicionar um bloco de citação você utilizará a seguinte
syntax:
> Aqui você fará sua citação
> Veja que a quebra de linha não é automática
Aqui você fará sua citação Veja que a quebra de linha não é
automática
Traço, travessão e reta de separação
Para adicionar um traço e um travessão faça o seguinte:
| Traço: -- |
Traço: – |
| Travessão: --- |
Travessão: — |
Para adicionar uma reta horizontal de separação você pode utiizar
duas formas, veja:
Três estrelas ou mais:
***
Três traços ou mais:
---
Listas
Lista não ordenada
Há três formas de fazer uma lista não ordenada. Observe e pratique:
Primeira forma
- Lista não ordenada
- Item
- Item
- Item
Segunda forma
+ Lista não ordenada
+ Item
+ Item
+ Item
Terceira forma
* Lista não ordenada
* Item
* Item
* Item
Lista Ordenada
Você pode fazer listas ordenadas da seguinte forma.
1. Lista ordenada
1. Item
1. Item
2. Lista ordenada
1. Item
1. Item
2. Lista ordenada
- Item
* Item
- Lista não ordenada
+ Item
3. Ordenção automática sem funcionamento
- Lista ordenada
- Item
- Item
- Lista ordenada
- Item
- Item
- Lista ordenada
- Ordenção automática sem funcionamento
Links
Há três maneiras de adicionar links clicáveis no RMarkdown, ambas
interessantes para diferentes casos.
- Para fazer a primeira maneira realize o seguinte código.
Primeiro estilo de link: <https://linktr.ee/pet_estatisticaufc>
Primeiro estilo de link: https://linktr.ee/pet_estatisticaufc
- A segunda maneira deixa o link visualmente mais bonito,
observe:
Segundo estilo de link: [PET Estatística UFC](https://linktr.ee/pet_estatisticaufc "PET Estatística")
Segundo estilo de link: PET
Estatística UFC
- A terceira maneira é interessante para adicionar o mesmo link várias
vezes em diferentes palavras, veja:
Terceiro estilo de link: [PET Estatística UFC][Link-1]\
O Mesmo link com outro nome: [Programa de Educação Tutorial da Estatística][Link-1]
[Link-1]:https://linktr.ee/pet_estatisticaufc 'PET Estatística'
Terceiro estilo de link: PET
Estatística UFC
O Mesmo link com outro nome: Programa de Educação Tutorial da
Estatística
Imagens
Parecido com os links, as imagens podem ser adicionadas de três
formas.
- A primeira forma é a seguinte:
<div style="text-align:center">
{ width=20% }
</div>
Universidade Federal do Ceará
Observe que esses códigos com <div alguma-coisa>
são adicionais do html que você pode está utilizando. Então não se
preocupe se não entendê-los porque para entender markdown basta focar
nas outras partes.
- A segunda maneira, melhor para adicionar a mesma imagem várias vezes
ou para ter uma maior organização, é a seguinte:
![Universidade Federal do Ceará][link-2]
![Logo da UFC][link-2]
[link-2]:https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTyblZQAVU4rkTuEx-8wocoM7XxO2a31Nsu3L5Y3Guj0w&s 'Logo UFC'
Universidade Federal do Ceará
Logo da UFC
Notas de Rodapé
Utilize a seguinte syntax para adicionar uma nota de rodapé:
Isso é uma nota de rodapé: [^def]
[^def]: definição
Isso é uma nota de rodapé:
Note que não é necessário fazer a numeração das notas de rodapé
porque elas são numeradas automaticamente. Além disso, a nota de rodapé
é clicável, levando o usuário ao final do documento, onde se encontram
todas notas de rodapé.
Bibliográfia
Arquivo .bib
Para criar um arquivo .bib você deve
abrir um arquivo de texto. Para preenchê-lo você irá utilizar os dados
bibliográficos no formato BibTeX. É possível pegar esses dados já feitos
no Google
Acadêmico.
Por exemplo, digamos que você quer citar o livro Estatística Básica.
Basta você pesquisar o nome do livro e ir na opção
Citar.

Após isso, basta escolher a opção BibTeX.
Depois, é só copiar e colar no seu arquivo de texto. Você pode ir
adicionando essas referências a qualquer momento no seu arquivo de
texto, então já é possível salvá-lo dentro do seu diretório. Lembre de
salvar o seu arquivo com o “.bib” no final ao invés de “.txt”.

Com isso, no próximo tópico você irá aprender a como colocar o seu
arquvo .bib em funcionamento dentro do RMarkdown.
A
opção de bibliografia no YAML HEADER
Para colocar seu arquivo .bib em funcionamento basta adicionar
bibliography: Nome.bib em seu cabeçalho YAML. Veja o
seguinte exemplo com o arquivo criado na seção anterior:
---
title: "Novo_Arquivo"
author: "Jonas"
date: "2024-02-08"
bibliography: bibliografia.bib
output: html_document
---
Observe que apenas colocar essa opção no cabeçalho YAML não vai
adicionar suas citações ou referências ao arquivo. Além disso, é
importante observar se o arquivo .bib está no seu diretório de trabalho
para não haver erros.
Citações
Para fazer uma citação você vai utiizar o @. Por
exemplo, para citar o livro Estatística Básica, o qual já está no
arquivo .bib criado anteriormente, você vai pegar a primeira informação
na citação BibTeX e colocá-la após o @.

Após renderizar o seu arquivo você verá que além da citação
foi colocado automaticamente no final do output a referência da
citação.

Se você quiser uma citação entre parênteses basta colocar
colchetes no código anterior.

Caso você queira que apenas o ano apareça na citação, você
pode utilizar a syntax anterior com um - na frente do
@.

Citação clicável
Para que seja possível clicar na citação e ir direto para as
referências é possível colocar a opção link-citations: TRUE
no cabeçalho YAML.

Mudança de idioma
Além disso, você deve ter percebido que as citações estão em outra
língua. Adicione a opção lang: pt-br no cabeçalho YAML para
que fique no idioma do Brasil, semelhante ao seguinte exemplo.
---
title: "Novo_Arquivo"
author: "Jonas"
date: "*07 de janeiro, 2025*"
bibliography: bibliografia.bib
link-citations: TRUE
lang: pt-br
output: html_document
---
Referência sem citação
Se caso você quiser fazer apenas a referência sem precisar fazer a
citação ao longo do seu documento, então coloque a opção
notice.

Se forem várias referências, então você pode fazer a separação com
vírgulas.

Equações matemáticas
Você pode inserir equações matemáticas no RMarkdown da mesma maneira
que o faria no LaTeX. Se você não está familiarizado com esse formato,
recomendamos acessar o site do Overleaf para obter mais
detalhes. Abaixo estão dois exemplos que demonstram como adicionar
equações matemáticas em seu documento.
Equação em linha
Essa forma permite colocar uma equação matemática na mesma linha que
o seu texto. Você pode fazer isso utilizando a seguinte syntax.
Por exemplo, esta é a fórmula do desvio padrão:
Desvio Padrão: $\sqrt{\frac{\sum_{i=1}^{n}x_i^2-n\overline{x}^2}{n-1}}$
Desvio Padrão: \(\sqrt{\frac{\sum_{i=1}^{n}x_i^2-n\overline{x}^2}{n-1}}\)
Veja que a equação foi colocada junto ao texto normal em uma única
linha.
Equação em bloco
Esta forma de escrita não possibilita a inserção de texto normal na
mesma linha que a equação, no entanto, centraliza automaticamente a
equação e deixa ela maior, o que dá um maior destaque. A sua syntax é a
seguinte:
O seguinte exemplo faz uma equação em bloco na qual a variável
W tem distribuição normal padrão.
$$W = \frac{\displaystyle\sum_{i=1}^{n}X{i}-n\mu}{\sqrt{n}\sigma}$$
\[W =
\frac{\displaystyle\sum_{i=1}^{n}X{i}-n\mu}{\sqrt{n}\sigma}\]
Chunks
Chunks permitem que códigos de diferentes linguagens (como R, python,
SQL, LaTeX, entre outras) sejam adicionadas ao arquivo do RMarkdown, o
que permite reproduzir, por exemplo, tabelas, gráficos e cálculos dentro
do seu arquivo. Para adiconar um chunk que permite a reprodução de
código R realize o seguinte código.
```\{r\}
# Aqui dentro é onde irá ficar seu código R.
```
Uma observação a se fazer é que as barras invertidas que estam
aparecendo não fazem parte da sintaxe, foram apenas necessárias para
conseguir mostrar as chaves.
Para adicionar um chunk que reproduza qualquer linguagem, faça o
seguinte código substituindo nome pelo nome da línguagem de
interesse (python, r, bash, sql, php, etc).
```\{nome\}
Digite o seu código aqui.
```
Chunks oferecem opções que permitem mudar o output do código. Para
adicionar uma ou mais opções, faça o seguinte código.
```\{nome opcao1, opcao2, ..., opcaon\}
Digite o seu código aqui.
```
A seguir são apresentadas algumas das opções disponíveis no RMarkdown
para mudar o output do chunk.
| echo=FALSE |
Oculta o código, mostrando apenas o resultado. |
| message=FALSE |
Retira os avisos que aparecem no código. |
| eval=FALSE |
O código não é executado, mas será exibido no
documento. |
| include=FALSE |
Oculta o código e os resultados, mas executa o
código. |
| warning=FALSE |
Tira os avisos do output. |
| results=‘hide’ |
Oculta os resultados do código. |
| error=TRUE |
Renderiza o arquivo mesmo ocorrendo erros. |
| collapse=TRUE |
Junta todas as saídas de um chunk em um único
bloco. |
Para exemplificar a utilização de chunks com a linguagem r, a seguir
é feito um diagrama de disperção utilizando ggplot.
```\{r chunk-label, echo=TRUE, message=FALSE, warning=FALSE\}
library(tidyverse)
library(palmerpenguins)
library(ggthemes)
ggplot(data = penguins,
mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
geom_point(mapping = aes(color = species)) +
geom_smooth(method = 'lm')
```
library(tidyverse)
library(palmerpenguins)
library(ggthemes)
ggplot(data = penguins,
mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
geom_point(mapping = aes(color = species)) +
geom_smooth(method = 'lm')

Tambem é possível apresentar resultados numéricos dentro do seu
texto, como no seguinte exemplo.
A massa corporal média dos pinguins é `\r round(mean(penguins$body_mass_g, na.rm = T), 2)`
A massa corporal média dos pinguins é 4201.75
É importante ressaltar que a barra invertida não faz parte da
sintaxe, mas foi necessária para que todo o código seja mostrado.
Tabelas
Tabela feita na mão
Para fazer uma tabela sem a utilização do R diretamente no RMarkdown,
observe e execute o seguinte código.
|direita|esquerda|padrão|centralizado|
|---:|:---|---|:---:|
|12|12|12|12|
|123|123|123|123|
|2|2|2|2|
| 12 |
12 |
12 |
12 |
| 123 |
123 |
123 |
123 |
| 2 |
2 |
2 |
2 |
Veja que o caractere | é utilizado para delimitar o que
fica dentro de cada célula, alem da segunda linha do código ter traços e
pontos que dizem como vai ser o alinhamento do texto e delimita quem é
nome das colunas.
Referências
GRUBER, J. Markdown: Syntax. URL http://daringfireball.
net/projects/markdown/syntax. Retrieved on June, v. 24, p. 640,
2012.
XIE, Y. Dynamic Documents with R and knitr. [s.l.] CRC
Press, 2017.
XIE, Y.; ALLAIRE, J. J.; GROLEMUND, G. R markdown: The
definitive guide. [s.l.] CRC Press, 2018.
XIE, Y.; DERVIEUX, C.; RIEDERER, E. R markdown
cookbook. [s.l.] CRC Press, 2020.
LS0tDQp0aXRsZTogfA0KICA6Ojogey5mbG9hdHRpbmd9DQoNCiAgYGBge3Igb3V0LndpZHRoPScxOCUnLCBvdXQuZXh0cmE9J3N0eWxlPSJmbG9hdDpsZWZ0OyBwYWRkaW5nOjEwcHgiJywgZWNobz1GQUxTRX0NCg0KICBrbml0cjo6aW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly9pLmltZ3VyLmNvbS9PeGRIY0x6LnBuZyIpDQogIGBgYA0KICAqKkludHJvZHXDp8OjbyBhbyBSbWFya2Rvd24qKg0KICA6OjoNCmF1dGhvcjogJypQRVQgRXN0YXTDrXN0aWNhIFVGQyonDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICcqJWQgZGUgJUIsICAlWSonKWAiDQpsaW5rLWNpdGF0aW9uczogdHJ1ZQ0KYmlibGlvZ3JhcGh5OiByZWZfaW50cm9fcm1hcmtkb3duLmJpYg0KY3NsOiAiYXNzb2NpYWNhby1icmFzaWxlaXJhLWRlLW5vcm1hcy10ZWNuaWNhcy5jc2wiDQpsYW5nOiAicHQtYnIiDQpub3RpY2U6IHwNCiAgQGdydWJlcjIwMTJtYXJrZG93biwgQHhpZTIwMTdkeW5hbWljLCBAeGllMjAxOHIsIEB4aWUyMDIwcg0KdG9jLXRpdGxlOiB8DQogIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCiAgSW50cm9kdcOnw6NvIGFvIFJNYXJrZG93bg0KICA8L2Rpdj4NCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZToNCiAgICAgIGJvb3Rzd2F0Y2g6IHN1cGVyaGVybw0KICAgIHNjc3M6IF9ib290c3dhdGNoICgyKS5zY3NzDQogICAgaGlnaGxpZ2h0OiBicmVlemVkYXJrDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgYW5jaG9yX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGZpZ19jYXB0aW9uOiB0cnVlDQogICAgY2l0YXRpb25fcGFja2FnZTogYmlibGF0ZXgNCi0tLQ0KDQo8YnI+DQoNCi0tLQ0KDQojIFVtYSB2aXPDo28gZ2VyYWwgc29icmUgbyBSIE1hcmtkb3duDQojIyBPIHF1ZSDDqSBSIE1hcmtkb3duPw0KUiBNYXJrZG93biDDqSB1bWEgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5saW5ndWFnZW0gZGUgbWFyY2HDp8Ojbzwvc3Bhbj5bXjFdIHF1ZSBjb21iaW5hIG8gcG9kZXIgZG8gUiBjb20gYSBzaW1wbGljaWRhZGUgZG8gTWFya2Rvd24uIEVzc2EgZmVycmFtZW50YSB2ZXJzw6F0aWwgZm9pIGRlc2Vudm9sdmlkYSBwYXJhIGZhY2lsaXRhciBhIGNyaWHDp8OjbyBkZSBkb2N1bWVudG9zIGRpbsOibWljb3MgZSByZXByb2R1dMOtdmVpcywgaW50ZWdyYW5kbyBjw7NkaWdvLCB0ZXh0byBlIHJlc3VsdGFkb3MgZW0gdW0gw7puaWNvIGFtYmllbnRlLlwNCg0KW14xXTogVW1hIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+bGluZ3VhZ2VtIGRlIG1hcmNhw6fDo288L3NwYW4+IMOpIHVtIGNvbmp1bnRvIGRlIHJlZ3JhcyBlIGNvbnZlbsOnw7VlcyB1c2FkYXMgcGFyYSBlc3RydXR1cmFyIGUgZm9ybWF0YXIgZG9jdW1lbnRvcyBkZSB0ZXh0by4gRWxhIGFkaWNpb25hIG1hcmNhw6fDtWVzIG91IHRhZ3MgYW8gdGV4dG8gcGFyYSBpbmRpY2FyIGNvbW8gbyBkb2N1bWVudG8gZGV2ZSBzZXIgYXByZXNlbnRhZG8gb3UgZXN0cnV0dXJhZG8gcXVhbmRvIHJlbmRlcml6YWRvIG91IHByb2Nlc3NhZG8uIEFzIGxpbmd1YWdlbnMgZGUgbWFyY2HDp8OjbyBzw6NvIGNvbXVtZW50ZSB1c2FkYXMgbmEgY3JpYcOnw6NvIGRlIGRvY3VtZW50b3MsIHDDoWdpbmFzIHdlYiwgZS1tYWlscyBlIG91dHJvcyB0aXBvcyBkZSBjb250ZcO6ZG8gdGV4dHVhbC4NCg0KIyMgVW0gcG91Y28gZGUgaGlzdMOzcmlhDQpPIFIgTWFya2Rvd24gdGV2ZSBzdWFzIG9yaWdlbnMgbm8gZWNvc3Npc3RlbWEgZG8gUiwgdW1hIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+bGluZ3VhZ2VtIGRlIHByb2dyYW1hw6fDo288L3NwYW4+W14yXSBlc3RhdMOtc3RpY2EgcG9wdWxhciBlbnRyZSBjaWVudGlzdGFzIGRlIGRhZG9zIGUgcGVzcXVpc2Fkb3Jlcy4gQSBpZGVpYSBlcmEgY3JpYXIgdW0gZm9ybWF0byBkZSBkb2N1bWVudG8gcXVlIHBlcm1pdGlzc2UgYSBpbmNvcnBvcmHDp8OjbyBkZSBhbsOhbGlzZXMgZGUgZGFkb3MgZGlyZXRhbWVudGUgbm8gdGV4dG8sIGZhY2lsaXRhbmRvIGEgY29tdW5pY2HDp8OjbyBlIGEgcmVwcm9kdcOnw6NvIGRvcyByZXN1bHRhZG9zLiBPIFIgTWFya2Rvd24gw6kgdW1hIGV4dGVuc8OjbyBkbyBNYXJrZG93biwgcXVlIHBvciBzdWEgdmV6IGZvaSBjcmlhZG8gcG9yIEpvaG4gR3J1YmVyIGUgQWFyb24gU3dhcnR6IGVtIDIwMDQuXA0KDQpbXjJdOiBVbWEgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5saW5ndWFnZW0gZGUgcHJvZ3JhbWHDp8Ojbzwvc3Bhbj4gw6kgdW0gY29uanVudG8gZGUgcmVncmFzLCBzw61tYm9sb3MgZSBjb252ZW7Dp8O1ZXMgdXNhZG9zIHBhcmEgZXNjcmV2ZXIgaW5zdHJ1w6fDtWVzIHF1ZSB1bSBjb21wdXRhZG9yIHBvZGUgc2VndWlyIHBhcmEgcmVhbGl6YXIgdW1hIHRhcmVmYSBlc3BlY8OtZmljYS4gRWxhIHNlcnZlIGNvbW8gdW0gbWVpbyBkZSBjb211bmljYcOnw6NvIGVudHJlIHVtIHByb2dyYW1hZG9yIGUgdW0gY29tcHV0YWRvciwgcGVybWl0aW5kbyBxdWUgbyBwcm9ncmFtYWRvciB0cmFuc21pdGEgc3VhcyBpbnRlbsOnw7VlcyBwYXJhIGEgbcOhcXVpbmEgZGUgZm9ybWEgY29tcHJlZW5zw612ZWwuDQoNCiMjIERlc2Vudm9sdmltZW50byBkbyBSIE1hcmtkb3duDQpBIGNyaWHDp8OjbyBkbyBSIE1hcmtkb3duIMOpIGF0cmlidcOtZGEgYSBZaWh1aSBYaWUsIHVtIGVzdGF0w61zdGljbyBlIGRlc2Vudm9sdmVkb3IgY2hpbsOqcyBxdWUgY29udHJpYnVpdSBzaWduaWZpY2F0aXZhbWVudGUgcGFyYSBhIGNvbXVuaWRhZGUgUi4gWWlodWkgWGllIHBlcmNlYmV1IGEgbmVjZXNzaWRhZGUgZGUgdW0gZm9ybWF0byBkZSBkb2N1bWVudG8gcXVlIGZvc3NlIG1haXMgZmxleMOtdmVsIGUgcGVybWl0aXNzZSBhIGludGVncmHDp8OjbyBmbHVpZGEgZGUgY8OzZGlnbyBSIGVtIGRvY3VtZW50b3MgZGUgdGV4dG8uIEVtIDIwMTIsIGVsZSBsYW7Dp291IG8gcGFjb3RlIFtrbml0cl0oaHR0cHM6Ly95aWh1aS5vcmcva25pdHIvICJrbml0cjogDQpFbGVnYW50LCBmbGV4aWJsZSwgYW5kIGZhc3QgZHluYW1pYyByZXBvcnQgZ2VuZXJhdGlvbiB3aXRoIFIiKSBwYXJhIG8gUiwgcXVlIGZhY2lsaXRvdSBhIGV4ZWN1w6fDo28gZGUgY8OzZGlnbyBSIGluY29ycG9yYWRvIGVtIGRvY3VtZW50b3MuIE8gUiBNYXJrZG93biBzdXJnaXUgY29tbyB1bWEgZXZvbHXDp8OjbyBuYXR1cmFsIGRlc3NlIHRyYWJhbGhvLCBwcm9wb3JjaW9uYW5kbyB1bWEgZXhwZXJpw6puY2lhIG1haXMgc2ltcGxpZmljYWRhIGUgYW1pZ8OhdmVsIHBhcmEgb3MgdXN1w6FyaW9zLlwNCk9zIG9iamV0aXZvcyBwcmluY2lwYWlzIHBvciB0csOhcyBkbyBSIE1hcmtkb3duIGVyYW0gZm9ybmVjZXIgdW1hIG1hbmVpcmEgZsOhY2lsIGUgZWZpY2llbnRlIGRlIGNvbWJpbmFyIG5hcnJhdGl2YXMsIGPDs2RpZ28gZSByZXN1bHRhZG9zIGVtIHVtIMO6bmljbyBkb2N1bWVudG8uIA0KDQojIyBCZW5lZsOtY2lvcyBkbyBSIE1hcmtkb3duDQpBbGd1bWFzIGNhcmFjdGVyw61zdGljYXMgZSBiZW5lZsOtY2lvcyBpbXBvcnRhbnRlcyBpbmNsdWVtOlwNCg0KLSBSZXByb2R1dGliaWxpZGFkZToNCjogICBBIGNhcGFjaWRhZGUgZGUgaW5jb3Jwb3JhciBjw7NkaWdvIGRpcmV0YW1lbnRlIG5vIGRvY3VtZW50byBwZXJtaXRlIGEgcmVwcm9kdcOnw6NvIGbDoWNpbCBlIHLDoXBpZGEgZG9zIHJlc3VsdGFkb3MsIGdhcmFudGluZG8gYSB0cmFuc3BhcsOqbmNpYSBlIGEgY29uZmlhYmlsaWRhZGUuXA0KDQoqIENvbXVuaWNhw6fDo28gRWZldGl2YToNCjogICBBbyBpbnRlZ3JhciBhbsOhbGlzZXMgZGUgZGFkb3MgZGlyZXRhbWVudGUgbm8gdGV4dG8sIG8gUiBNYXJrZG93biB0b3JuYSBhIGNvbXVuaWNhw6fDo28gZGUgcmVzdWx0YWRvcyBtYWlzIGNsYXJhIGUgY29tcHJlZW5zw612ZWwsIHRvcm5hbmRvIGEgYW7DoWxpc2UgZGUgZGFkb3MgbWFpcyBhY2Vzc8OtdmVsIHBhcmEgdW0gcMO6YmxpY28gbWFpcyBhbXBsby5cDQoNCisgRmxleGliaWxpZGFkZToNCjogICBTdXBvcnRlIHBhcmEgdsOhcmlvcyBmb3JtYXRvcyBkZSBzYcOtZGEsIGNvbW8gSFRNTCwgUERGLCBXb3JkLCBlbnRyZSBvdXRyb3MsIHByb3BvcmNpb25hIGZsZXhpYmlsaWRhZGUgbmEgYXByZXNlbnRhw6fDo28gZG9zIHJlc3VsdGFkb3MuXA0KDQoNCiMgQ29tbyBjcmlhciBvIHNldSBhcnF1aXZvIE1hcmtkb3duIHsudGFic2V0IC50YWJzZXQtZmFkZX0NClBhcmEgY29tZcOnYXIgYSB1dGlsaXphciBvIE1hcmtkb3duLCB2b2PDqiBwcmVjaXNhIHRlciBhbGd1bWFzIGZlcnJhbWVudGFzIGluc3RhbGFkYXMgbm8gc2V1IGFtYmllbnRlIGRlIGRlc2Vudm9sdmltZW50by4gQXF1aSBlc3TDo28gYXMgcHJpbmNpcGFpcyBmZXJyYW1lbnRhcyBxdWUgdm9jw6ogcHJlY2lzYTpcDQoNCi0gW1JdKGh0dHBzOi8vd3d3LnItcHJvamVjdC5vcmcvICJUaGUgUiBQcm9qZWN0IGZvciBTdGF0aXN0aWNhbCBDb21wdXRpbmciKToNCjogICBPIFIgw6kgdW1hIGxpbmd1YWdlbSBkZSBwcm9ncmFtYcOnw6NvIGVzdGF0w61zdGljYSBhbXBsYW1lbnRlIHV0aWxpemFkYS5cDQoNCiogW1JTdHVkaW9dKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvICJSU3R1ZGlvIERlc2t0b3AiKToNCjogICBFbWJvcmEgbsOjbyBzZWphIGVzdHJpdGFtZW50ZSBuZWNlc3PDoXJpbywgbyBSU3R1ZGlvIMOpIHVtIGFtYmllbnRlIGRlIGRlc2Vudm9sdmltZW50byBpbnRlZ3JhZG8gKElERSkgbXVpdG8gcG9wdWxhciBwYXJhIG8gUiBlIMOpIGFsdGFtZW50ZSByZWNvbWVuZGFkbyBwYXJhIHRyYWJhbGhhciBjb20gUiBNYXJrZG93biBkZXZpZG8gw6Agc3VhIGludGVncmHDp8OjbyBwZXJmZWl0YS5cDQoNCi0gW1BhbmRvY10oaHR0cHM6Ly9wYW5kb2Mub3JnL2luc3RhbGxpbmcuaHRtbCAiUGFuZG9jICAgYSB1bml2ZXJzYWwgZG9jdW1lbnQgY29udmVydGVyIik6DQo6ICAgTyBQYW5kb2Mgw6kgdW1hIGZlcnJhbWVudGEgZGUgY29udmVyc8OjbyBkZSBkb2N1bWVudG9zIHF1ZSBvIFIgTWFya2Rvd24gdXRpbGl6YSBwYXJhIGNvbnZlcnRlciBkb2N1bWVudG9zIE1hcmtkb3duIGVtIHbDoXJpb3MgZm9ybWF0b3MgZGUgc2HDrWRhLCBjb21vIEhUTUwsIFBERiwgV29yZCwgZXRjLiBPIFJTdHVkaW8gKippbnN0YWxhIGF1dG9tYXRpY2FtZW50ZSoqIG8gUGFuZG9jLiBObyBlbnRhbnRvLCBzZSB2b2PDqiBuw6NvIGVzdGl2ZXIgdXNhbmRvIG8gUlN0dWRpbyBvdSBwcmVjaXNhciBkZSB1bWEgdmVyc8OjbyBtYWlzIHJlY2VudGUgZG8gUGFuZG9jLCB2b2PDqiBwb2RlIGJhaXjDoS1sbyBkaXJldGFtZW50ZSBkbyBzaXRlIG9maWNpYWwuXA0KDQpQYXJhIGNvbWXDp2FyLCB1dGlsaXphcmVtb3MgZXhjbHVzaXZhbWVudGUgbyBSIGUgbyBSU3R1ZGlvLiBBcMOzcyBhIGluc3RhbGHDp8OjbyBkZSBhbWJvcywgdm9jw6ogZGV2ZSBhYnJpciBvIFJTdHVkaW8gcGFyYSBpbmljaWFyIG8gZG9jdW1lbnRvIFJNYXJrZG93bi5cDQoNCjxicj4NCg0KKipPYnM6KiogU2Vyw6NvIGFwcmVzZW50YWRhcyBhcXVpIGR1YXMgZm9ybWFzIGRlIGNvbW8gdm9jw6ogcG9kZSBhcm1hemVuYXIgc2V1IGRvY3VtZW50byBSTWFya2Rvd24uIE8gYXV0b3IgZGVzdGUgZ3VpYSB1dGlsaXphIGUgcmVjb21lbmRhIGEgc2VndW5kYSBmb3JtYS4NCg0KIyMgUHJpbWVpcmEgZm9ybWENCg0KDQpDb20gbyBSc3R1ZGlvIGFiZXJ0bywgdm9jw6ogZGV2ZSBpciBubyBjYW50byBzdXBlcmlvciBlc3F1ZXJkbyBlbSBgRmlsZWAgPiBgTmV3IEZpbGVgID4gYFIgTWFya2Rvd25gLlwNCiFbXShodHRwczovL2kuaW1ndXIuY29tLzJCSDNRVlQucG5nICJDcmlhw6fDo28gZGUgTm92byBBcnF1aXZvIilcDQoNCjxicj4NCjxicj4NCg0KQXDDs3MgaXNzbyB2b2PDqiBkZXZlIGluZm9ybWFyIG8gYHTDrXR1bG9gIGRvIHNldSBkb2N1bWVudG8sIG8gYHNldSBub21lYCBlIG8gYGZvcm1hdG8gZGUgc2HDrWRhYCAow6kgcG9zc8OtdmVsLCBhcMOzcyBhIGNyaWHDp8OjbyBkbyBhcnF1aXZvLCBtdWRhciBvIGZvcm1hdG8gZGUgc2HDrWRhKS5cDQohW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9INjNiR1F6LnBuZyAiRXNwZWNpZmljYcOnw6NvIGRlIGFsZ3VtYXMgaW5mb3JtYcOnw7VlcyBwYXJhIG8gY2FiZcOnYWxobyBZQU1MIilcDQo8YnI+DQo8YnI+DQoNCkNvbSBvIGFycXVpdm8gY3JpYWRvIHN1YSB0ZWxhIGFwYXJlY2Vyw6EgbWFpcyBvdSBtZW5vcyBkYSBzZWd1aW50ZSBmb3JtYS4gTsOjbyBzZSBhc3N1c3RlIGNvbSBlc3NlIHNjcmlwdCBnZXJhZG8gcGVsbyBwcsOzcHJpbyBSTWFya2Rvd24sIG9zIHNldXMgZWxlbWVudG9zIHNlcsOjbyBleHBsaWNhZG9zIGVtIGJyZXZlLlwNCiFbXShodHRwczovL2kuaW1ndXIuY29tL1NnV01CRGQucG5nICJBcnF1aXZvIGNyaWFkbyIpXA0KPGJyPg0KPGJyPg0KDQpWb2PDqiBwb2RlIGFwYWdhciB0dWRvIHF1ZSBlc3TDoSBhYmFpeG8gZG8gY2FiZcOnYWxobyBZQU1MLCBvIHF1YWwgw6kgZGVsaW1pdGFkbyBwb3IgdHLDqnMgdHJhw6dvcyBgLS0tYC4gT2JzZXJ2ZSwgdGFtYsOpbSwgcXVlIGFiYWl4byBkbyBhcnF1aXZvIFJNYXJrZG93biB0ZW0gdW1hIG91dHJhIGphbmVsYSBjaGFtYWRhIGNvbnNvbGUuIENvbSBlc3NhIGphbmVsYSDDqSBwb3Nzw612ZWwgdXRpbGl6YXIgY8OzZGlnb3MgZG8gUiBwYXJhIGZhemVyIGRpdmVyc2FzIGNvaXNhcywgaW5jbHVzaXZlIGJhaXhhciBwYWNvdGVzIG5lY2Vzc8OhcmlvcyBhbyBmdW5jaW9uYW1lbnRvIGRvIHJtYXJrZG93bi5cDQohW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9pS3NDS0pJLnBuZyAiQXJxdWl2byBhcGVuYXMgY29tIG8gY2FiZcOnYWxobyBZQU1MIilcDQo8YnI+DQo8YnI+DQoNCkFudGVzIGRlIGNvbWXDp2FyLCDDqSBwcmVjaXNvIGVudGVuZGVyIGNvbW8gZ3VhcmRhciwgZGEgZm9ybWEgY29ycmV0YSwgbyBhcnF1aXZvIGNyaWFkby4gUGFyYSBpc3NvLCBjcmllIHVtYSBwYXN0YSBubyBleHBsb3JhZG9yIGRlIGFycXVpdm9zLCBlbGEgc2Vyw6EgYSBwYXN0YSBkb3Mgc2V1cyBwcm9qZXRvcyBkZSBSTWFya2Rvd24uIERlbnRybyBkZXNzYSBwYXN0YSwgY3JpZSBvdXRyYSBwYXN0YSBxdWUgY29udGVyw6EgbyBzZXUgYXJxdWl2byBSTWFya2Rvd24gZSBvdXRyb3MgYXJxdWl2b3MgbmVjZXNzw6FyaW9zIGFvIGZ1bmNpb25hbWVudG8gZG8gUk1hcmtkb3duIHF1ZSBmdXR1cmFtZW50ZSB2b2PDqiBwcmVjaXNhcsOhIGd1YXJkYXIuIENvbSBpc3NvIGZlaXRvLCB2b2x0ZSBwYXJhIG8gUnN0dWRpbywgY2xpcXVlIGBDdHJsYCtgQWx0YCtgU2AgZSBlc2NvbGhhIGEgcGFzdGEgcXVlIHZvY8OqIGNyaW91LlwNCkNvbSBhIHBhc3RhIGNyaWFkYSwgYWdvcmEgw6kgcHJlY2lzbyBkZWZpbmktbGEgY29tbyBvIHNldSA8c3BhbiBzdHlsZT0iY29sb3I6IHZpb2xldDsiPmRpcmV0w7NyaW8gZGUgdHJhYmFsaG88L3NwYW4+W14zXSBhIHNlciB1dGlsaXphZG8uIFZvY8OqIHBvZGUgdmVyaWZpY2FyIG8gZGlyZXTDs3JpbyBkZSB0cmFiYWxobyBhdHVhbCBubyBjb25zb2xlIChuYSBwYXJ0ZSBpbmZlcmlvciBlc3F1ZXJkYSDDqSBwb3Nzw612ZWwgdmVyIG9uZGUgw6kgbyBjb25zb2xlKSBkbyByc3R1ZGlvIHVzYW5kbyBhIGZ1bsOnw6NvIGdldHdkKCkgZSBhbHRlcsOhLWxvIHBhcmEgYSBwYXN0YSBtYWlzIGludGVybmEgcXVlIHZvY8OqIGNyaW91IHVzYW5kbyBhIGZ1bsOnw6NvIHNldHdkKCkuIFBvciBleGVtcGxvOg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCmdldHdkKCkgIyBSZXRvcm5hIG8gZGlyZXTDs3JpbyBkZSB0cmFiYWxobyBzZW5kbyB1dGlsaXphZG8NCg0KI3NldHdkKCJDOi9Vc2Vycy9BZG1pbmlzdHJhdG9yL0RvY3VtZW50cy9QRVRfUHJvamV0b3MvUEVUX1JNYXJkb3duIikgIyBBbHRlcmEgbyBkaXJldMOzcmlvIGRlIHRyYWJhaG8NCg0KIyBPYnNldmUgYXMgYmFycmFzIGRlIHNlcGFyYcOnw6NvIGRvIGNhbWluaG8gZW0gc2V0d2QoKSANCiMgUXVhbmRvIHZvY8OqIGNvcGlhIHVtIGNhbWluaG8gbm8gd2luZG93cywgZXNzZSBjYW1pbmhvIMOpIGNvbG9jYWRvIGNvbSB1bWEgYmFycmEgZGlmZXJlbnRlIChcKQ0KYGBgDQo8YnI+DQo8YnI+DQoNCiMjIFNlZ3VuZGEgZm9tYSB7LnRhYnNldCAudGFic2V0LWZhZGV9DQoNCkNvbSBvIFJzdHVkaW8gYWJlcnRvLCB2b2PDqiBkZXZlIGlyIG5vIGNhbnRvIHN1cGVyaW9yIGVzcXVlcmRvIGVtIGBGaWxlYCA+IGBOZXcgUHJvamVjdC4uLmAuXA0KIVtdKEltYWdlbnMvY3JpYXJfcHJvamV0by5wbmcpXA0KPGJyPg0KPGJyPg0KDQpBZ29yYSBlc2NvbGhhIGEgb3DDp8OjbyBgTmV3IERpcmVjdG9yeWAgcGFyYSBpbmljaWFyIHVtIHByb2pldG8gbmUgdW0gbm92byA8c3BhbiBzdHlsZT0iY29sb3I6IHZpb2xldDsiPmRpcmV0w7NyaW8gZGUgdHJhYmFsaG88L3NwYW4+W14zXS5cDQohW10oSW1hZ2Vucy9jcmlhcl9wcm9qZXRvX25ld19kaXJlY3RvcnkucG5nKVwNCg0KPGJyPg0KPGJyPg0KDQpFc2NvbGhhIGEgb3DDp8OjbyBgTmV3IFByb2plY3RgIHBhcmEgY3JpYXIgdW0gbm92byBwcm9qZXRvIGVtIHVtIGRpcmV0w7NyaW8gdmF6aW8uXA0KIVtdKEltYWdlbnMvY3JpYXJfcHJvamV0b19uZXdfcHJvamVjdC5wbmcpXA0KDQo8YnI+DQo8YnI+DQoNCkNvbG9xdWUgdW0gbm9tZSBubyBzZXUgZGlyZXTDs3Jpby4gQXDDs3MgaXNzbywgdsOhIG5vIHNldSBgRXhwbG9yYWRvciBkZSBBcnF1aXZvc2AgZSBjcmllIHVtYSBwYXN0YSBwYXJhIHNlciBzZXUgc3ViZGlyZXTDs3Jpby4gVm9jw6ogcG9kZSB1dGlsaXphciB1bSDDum5pY28gc3ViZGlyZXTDs3JpbyBwYXJhIGFybWF6ZW5hciB2w6FyaW9zIGRpcmV0w7NyaW9zLlwNCiFbXShJbWFnZW5zL2NyZWF0ZV9uZXdfcHJvamVjdC5wbmcpXA0KDQo8YnI+DQo8YnI+DQoNClZvbHRlIHBhcmEgbyBSc3R1ZGlvIGUgdsOhIG5hIG9ww6fDo28gYEJyb3dzZS4uLmAgcGFyYSBzZWxlY2lvbmFyIGEgcGFzdGEgcXVlIHZvY8OqIGNyaW91IGNvbW8gc3ViZGlyZXTDs3Jpby5cDQohW10oSW1hZ2Vucy9jcmlhcl9wcm9qZXRvX3N1YmRpcmV0b3Jpby5wbmcpXA0KDQo8YnI+DQo8YnI+DQoNCkxlbWJyZSBkZSBkZWl4YXIgc2VsZWNpb25hZG8gYSBvcMOnw6NvIGBVc2UgcmVudiB3aXRoIHRoaXMgcHJvamVjdGAgcGFyYSBxdWUgc2VqYSB1dGlsaXphZG8gdW0gKipjYW1pbmhvIHJlbGF0aXZvKiouXA0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KIVtdKEltYWdlbnMvY2FtaW5ob19yZWxhdGl2by5wbmcpXA0KPC9kaXY+DQoNCjxicj4NCjxicj4NCg0KRmVpdG8gaXNzbywgYmFzdGEgaXIgZW0gYENyZWF0ZSBQcm9qZWN0YCBwYXJhIGNyaWFyIG8gc2V1IG5vdm8gcHJvamV0by5cDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQohW10oSW1hZ2Vucy9jcmVhdGVfcHJvamVjdC5wbmcpXA0KPC9kaXY+DQoNCjxicj4NCjxicj4NCg0KQ29tIG8gcHJvamV0byBjcmlhZG8sIGJhc3RhIGNyaWFyIG8gYXJxdWl2byBNYXJrZG93bi4gVm9jw6ogcG9kZSBmYXplciBkZSBkdWFzIGZvcm1hczogYSBwcmltZWlyYSBtb3N0cmFkYSBzZXLDoSBhIHJlY29tZW5kYWRhIHBhcmEgcXVlbSBlc3TDoSBjb21lw6dhbmRvIG91IHBhcmEgcXVlbSBlc3TDoSBxdWVyZW5kbyBzZWd1aXIgZXN0ZSBndWlhIGRlIFJNYXJrZG93biDDoCByaXNjYSwgZSBhIHNlZ3VuZGEgZm9ybWEgw6kgcGFyYSBxdWVtIGrDoSBzYWJlIHVtIHBvdWNvIGRlIE1hcmtkb3duLCBpbmNsdXNpdmUgZmF6ZXIgdW1hIGNhYmXDp2FsaG8gWUFNTCwgbyBxdWUgc2Vyw6EgbW9zdHJhZG8gbm9zIHVsdGltb3MgY2Fww610dWxvcyBkZXN0ZSBndWlhLg0KDQojIyMgUHJpbWVpcmEgZm9ybWEgZGUgY3JpYXIgbyBhcnF1aXZvIFJNYXJrZG93bg0KUGFyYSBhIHByaW1laXJhIGZvcm1hLCB2w6EgZW0gYEZpbGVgID4gYE5ldyBGaWxlYCA+IGBSIE1hcmtkb3duLi4uYC5cDQohW10oSW1hZ2Vucy9uZXdfcm1hcmtkb3duX2ZpbGUucG5nKVwNCg0KPGJyPg0KPGJyPg0KQXDDs3MgaXNzbyB2b2PDqiBkZXZlIGluZm9ybWFyIG8gYHTDrXR1bG9gIGRvIHNldSBkb2N1bWVudG8sIG8gYHNldSBub21lYCBlIG8gYGZvcm1hdG8gZGUgc2HDrWRhYCAow6kgcG9zc8OtdmVsLCBhcMOzcyBhIGNyaWHDp8OjbyBkbyBhcnF1aXZvLCBtdWRhciBvIGZvcm1hdG8gZGUgc2HDrWRhKS5cDQohW10oSW1hZ2Vucy9jcmlhcl9ybWFya2Rvd25zLnBuZylcDQoNCjxicj4NCjxicj4NCg0KQ29tIG8gYXJxdWl2byBjcmlhZG8sIHN1YSB0ZWxhIGFwYXJlY2Vyw6EgbWFpcyBvdSBtZW5vcyBkYSBzZWd1aW50ZSBmb3JtYS4gTsOjbyBzZSBhc3N1c3RlIGNvbSBlc3NlIHNjcmlwdCBnZXJhZG8gcGVsbyBwZWxvIHByw7NwcmlvIFJNYXJrZG93biwgb3Mgc2V1cyBlbGVtZW50b3Mgc2Vyw6NvIGV4cGxpY2Fkb3MgZW0gYnJldmUuXA0KIVtdKEltYWdlbnMvdGVsYV9hcG9zX2NyaWFjYW8ucG5nKVwNCg0KPGJyPg0KPGJyPg0KDQpWb2PDqiBwb2RlIGFwYWdhciB0dWRvIHF1ZSBlc3TDoSBhYmFpeG8gZG8gY2FiZcOnYWxobyBZQU1MLCBvIHF1YWwgw6kgZGVsaW1pdGFkbyBwb3IgdHLDqnMgdHJhw6dvcyBgLS0tYC4gT2JzZXJ2ZSwgdGFtYsOpbSwgcXVlIGFiYWl4byBkbyBhcnF1aXZvIGRvIFJNYXJrZG93biB0ZW0gdW1hIG91dHJhIGphbmVsYSBjaGFtYWRhIGNvbnNvbGUuIENvbSBlc3NhIGphbmVsYSDDqSBwb3Nzw612ZWwgdXRpbGl6YXIgY8OzZGlnb3MgZG8gUiBwYXJhIGZhemVyIGRpdmVyc2FzIGNvaXNhcywgaW5jbHVzaXZlIGJhaXhhciBwYWNvdGVzIG5lY2Vzc8OhcmlvcyBhbyBmdW5jaW9uYW1lbnRvIGRvIHJtYXJrZG93bi5cDQohW10oSW1hZ2Vucy9hbWJpZW50ZS5wbmcpXA0KDQpPYnNlcnZlIHF1ZSB2b2PDqiBjcmlvdSBvIHNldSBhcnF1aXZvIFJNYXJrZG93biBtYXMgbsOjbyBvIHNhbHZvdSBlbSBzZXUgZGlyZXTDs3JpbyBkZSB0cmFiYWxoby4gVm9jw6ogcG9kZSBhcGVydGFyIGBDdHJsYCArIGBTYCBwYXJhIHNhbHZhciBvdSBhcGVydGFyIGBDdHJsYCArIGBTaGlmdGAgKyBgS2AgcXVlLCBlbWJvcmEgc2lydmEgcGFyYSByZW5kZXJpemFyIG8gc2V1IGFycXVpdm8sIHRhbWLDqW0gbyBzYWx2YSBhdXRvbWF0aWNhbWVudGUuVm9jw6ogZGV2ZSBzZWxlY2lvbmFyIG8gc2V1IGRpcmV0w7NyaW8gZGUgdHJhYmFobywgYXF1ZWxlIGRlbnRybyBkbyBzdWJkaXJldMOzcmlvLCBwYXJhIHNhbHZhciBvIHNldSBhcnF1aXZvLlwNCg0KPGJyPg0KPGJyPg0KDQpBcMOzcyBlc3NlcyBwYXNzb3Mgdm9jw6ogcG9kZSBpbmljaWFyIGNvbSBvIHDDqSBkaXJlaXRvIG5hIHBhcnRlIGRhIFtzeW50YXhdKCNzeW50YXgpIGRvIFJNYXJrZG93bi4gQXByb3ZlaXRlIQ0KDQojIyMgU2VndW5kYSBmb3JtYSBkZSBjcmlhciBvIHNldSBhcnF1aXZvDQoNCkEgc2VndW5kYSBmb3JtYSBkZSBjcmlhciBzZXUgYXJxdWl2byBSTWFya2Rvd24gZmF6IHVtIFNjcmlwdCBlbSBicmFuY28sIHNlbSBhcXVlbGUgZ2VyYWRvIGF1dG9tYXRpY2FtZW50ZSBwZWxvIHByw7NwcmlvIFJNYXJrZG93bi4gRGVzc2EgZm9ybWEsIHZvY8OqIGNyaWEgdHVkbyBkbyB6ZXJvLCBpbmNsdXNpdmUgbyBjYWJlw6dhbGhvIFlBTUwuIFBhcmEgZmF6w6otbG8sIHbDoSBlbSBgTmV3IEJsYW5rIEZpbGVgID4gYFIgTWFya2Rvd24uLi5gIGUgZGlnaXRlIHVtIG5vbWUgcGFyYSBvIHNldSBhcnF1aXZvLlwNCiFbXShJbWFnZW5zL2FycXVpdm9fbWFya2Rvd24ucG5nKVwNCg0KPGJyPg0KPGJyPg0KDQpBbyBjcmlhciBzZXUgYXJxdWl2byB2b2PDqiBwb2RlcsOhIHbDqi1sbyBuYSBhYmEgYEZpbGVzYCBubyBjYW50byBpbmZlcmlvciBkaXJlaXRvLiBBbMOpbSBkaXNzbywgc2UgZm9yIHBlZGlkbyBhIGluc3RhbGHDp8OjbyBkZSBhbGd1bSBwYWNvdGUgcGFyYSBvIGNvcnJldG8gZnVuY2lvbmFtZW50byBkbyBSTWFya2Rvd24gZW50w6NvIGFwZXJ0ZSBlbSBgSW5zdGFsbGAuXA0KIVtdKEltYWdlbnMvaW5pY2lvX21hcmtkb3duLnBuZylcDQoNCg0KQXDDs3MgZXNzZXMgcGFzc29zIHZvY8OqIHBvZGUgaW5pY2lhciBjb20gbyBww6kgZGlyZWl0byBuYSBwYXJ0ZSBkYSBzaW50YXhlIGRvIFJNYXJrZG93bi4gQXByb3ZlaXRlIQ0KDQpbXjNdOiBPIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+ZGlyZXTDs3JpbyBkZSB0cmFiYWxobzwvc3Bhbj4gbm8gUiDDqSBvIGxvY2FsIG5vIHNpc3RlbWEgZGUgYXJxdWl2b3Mgb25kZSBvIFIgcHJvY3VyYSBwb3IgYXJxdWl2b3MgZSBvbmRlIGVsZSBzYWx2YSBub3ZvcyBhcnF1aXZvcyBwb3IgcGFkcsOjbywgYSBtZW5vcyBxdWUgdW0gY2FtaW5obyBzZWphIGVzcGVjaWZpY2Fkby4gUXVhbmRvIHZvY8OqIGluaWNpYSB1bWEgc2Vzc8OjbyBkbyBSLCBvIGRpcmV0w7NyaW8gZGUgdHJhYmFsaG8gcGFkcsOjbyDDqSBkZWZpbmlkbyBjb21vIG8gZGlyZXTDs3JpbyBlbSBxdWUgbyBSIGZvaSBpbmljaWFkby4gSXNzbyBzaWduaWZpY2EgcXVlIHF1YWxxdWVyIGFycXVpdm8gcXVlIHZvY8OqIGNhcnJlZ2Egb3Ugc2FsdmEgc2VtIGVzcGVjaWZpY2FyIHVtIGNhbWluaG8gc2Vyw6EgcmVsYXRpdm8gYSBlc3NlIGRpcmV0w7NyaW8uDQoNCg0KIyBSZW5kZXJpemHDp8OjbyBkbyBkb2N1bWVudG8gbm8gUk1hcmtkb3duDQpQYXJhIGNvbWXDp2FyLCBlc2NyZXZhIHF1YWxxdWVyIGNvaXNhIHF1ZSB2ZW5oYSBuYSBzdWEgbWVudGUgYWJhaXhvIGRvIGNhYmXDp2FsaG8gWUFNTC4gQXDDs3MgaXNzbyBhcGVydGUgYEN0cmxgK2BTaGlmdGArYGtgIG91IGNsaXF1ZSBubyBib3TDo28gYEtuaXRgIHBhcmEgcmVuZGVyaXphciBvIGRvY3VtZW50bywgaWd1YWwgbmEgc2VndWludGUgaW1hZ2VtLg0KIVtdKGh0dHBzOi8vaS5pbWd1ci5jb20veWtka2lKcC5wbmcgUmVuZGVucml6YcOnw6NvIGRvIFJNYXJrZG93bikNCjxicj4NCjxicj4NCg0KIyBDYWJlw6dhbGhvcw0KDQpQYXJhIGluc2VyaXIgc2XDp8O1ZXMgZGUgZGlmZXJlbnRlcyBuw612ZWlzLCB2dWxnbyBjYWJlw6dhbGhvcywgdm9jw6ogdmFpIHV0aWxpemFyIGEgc2VndWludGUgc2ludGF4ZVwNCg0KYGBgIE1hcmtkb3duDQojIENhYmXDp2FsaG8gMQ0KIyMgQ2FiZcOnYWxobyAyDQojIyMgQ2FiZcOnYWxobyAzDQojIyMjIENhYmXDp2FsaG8gNA0KIyMjIyMgQ2FiZcOnYWxobyA1DQojIyMjIyMgQ2FiZcOnYWxobyA2DQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KDQojIENhYmXDp2FsaG8gMSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KIyMgQ2FiZcOnYWxobyAyIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQojIyMgQ2FiZcOnYWxobyAzIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQojIyMjIENhYmXDp2FsaG8gNCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KIyMjIyMgQ2FiZcOnYWxobyA1IHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQojIyMjIyMgQ2FiZcOnYWxobyA2IHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCjwvc3Bhbj4NCg0KT2JzZXJ2ZSBhIHJlbGHDp8OjbyBlbnRyZSBvcyBjYWJlw6dhbGhvczogb3MgZGUgbsOtdmVsIG1haXMgYWx0byBlc3TDo28gYW5pbmhhZG9zIGRlbnRybyBkb3MgZGUgbsOtdmVsIG1haXMgYmFpeG8sIGRlc2RlIHF1ZSBvcyBkZSBuw612ZWwgbWFpcyBhbHRvIHNlamFtIHBvc2ljaW9uYWRvcyBhcMOzcyBvcyBkZSBuw612ZWwgbWFpcyBiYWl4b3MuXA0KDQojIyBPcMOnw7VlcyBkZSBvdXRwdXQgcGFyYSBjYWJlw6dhbGhvIHsudGFic2V0IC51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KIyMjIFNlbSBudW1lcmHDp8OjbyBlIG7Do28gbGlzdGFkbyBubyDDrW5kaWNlIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCk8gUk1hcmtkb3duIHBlcm1pdGUgdXRpbGl6YXIgYWxndW1hcyBvcMOnw7VlcyBxdWUgbXVkYW0gbyBvdXRwdXQgZG8gY2FiZcOnYWxoby4gTm9zIGNhYmXDp2FsaG9zIGFudGVyaW9yZXMgdm9jw6ogZGV2ZSB0ZXIgcGVyY2ViaWRvIHF1ZSBuw6NvIGjDoSBudW1lcmHDp8OjbyBlIGVsZXMgdGFtYsOpbSBuw6NvIHPDo28gY29sb2NhZG9zIG5vIMOtbmRpY2UuIFBhcmEgcXVlIGlzc28gb2NvcnJhLCB1c2UgbyBzZWd1aW50ZSBjw7NkaWdvIGVtIHF1ZSBgLnVubGlzdGVkYCB0aXJhIG8gY2FiZcOnYWxobyBkbyDDrW5kaWNlIGUgYC51bm51bWJlcmVkYCB0aXJhIGEgbnVtZXJhw6fDo28uDQpgYGAgTWFya2Rvd24NCiMjIyMgQ2FiZcOnYWxobyBzZW0gbnVtZXJhw6fDo28gZSBuw6NvIGxpc3RhZG8gbm8gw61uZGljZSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBgDQojIyMjIENhYmXDp2FsaG8gc2VtIG51bWVyYcOnw6NvIGUgbsOjbyBsaXN0YWRvIG5vIMOtbmRpY2Ugey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KIyMjIEFiYXMgaXRlcmF0aXZhcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KVGFtYsOpbSDDqSBwb3Nzw612ZWwgdHJhbmZvcm1hciBvcyBjYWJlw6dhbGhvcyBlbSBhYmFzIGl0ZXJhdGl2YXMgYSBwYXJ0aXIgZGEgb3DDp8Ojb2AudGFic2V0YC4gT3V0cmEgb3DDp8OjbyBjb21vIGAudGFic2V0LWZhZGVgIHBlcm1pdGUgZGVpeGFyIGEgdHJhbnNpw6fDo28gZW50cmUgYXMgYWJhcyBtYWlzIHN1YXZlLiBPIGV4ZW1wbG8gYSBzZWd1aXIgaWx1c3RyYSBlc3NlcyBjb21hbmRvcy4NCg0KYGBgDQojIyMjIFNlw6fDtWVzIGNvbSBBYmFzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCiMjIyMjIEFiYSAxIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpFc3RlIMOpIG8gY29udGXDumRvIGRhIEFiYSAxLg0KDQojIyMjIyBBYmEgMiB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KRXN0ZSDDqSBvIGNvbnRlw7pkbyBkYSBBYmEgMi4NCg0KIyMjIyMgQWJhIDMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCkVzdGUgw6kgbyBjb250ZcO6ZG8gZGEgQWJhIDMuDQpgYGANCg0KIyMjIyBTZcOnw7VlcyBjb20gQWJhcyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQojIyMjIyBBYmEgMSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KRXN0ZSDDqSBvIGNvbnRlw7pkbyBkYSBBYmEgMS4NCg0KIyMjIyMgQWJhIDIgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCkVzdGUgw6kgbyBjb250ZcO6ZG8gZGEgQWJhIDIuDQoNCiMjIyMjIEFiYSAzIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpFc3RlIMOpIG8gY29udGXDumRvIGRhIEFiYSAzLg0KDQoNCiMgUXVlYnJhIGRlIGxpbmhhDQpQYXJhIGZhemVyIHF1ZWJyYSBkZSBsaW5oYSBiYXN0YSBjb2xvY2FyIGRvaXMgZXNwYcOnb3Mgbm8gZmluYWwgZGUgdW0gdGV4dG8gb3UgYWRpY2lvbmFyIHVtYSBiYXJyYSBpbnZlcnRpZGEsIGRlIGFjb3JkbyBjb20gbyBzZWd1aW50ZSBjw7NkaWdvLg0KYGBgIG1hcmtkb3duDQpBcXVpIHZhaSBzZXIgcmVhbGl6YWRvIHVtYSBxdWVicmEgZGUgbGluaGEgIA0KQXF1aSB0YW1iw6ltIHNlcsOhIGZlaXRvIHVtYSBxdWVicmEgZGUgbGluaGFcDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KQXF1aSB2YWkgc2VyIHJlYWxpemFkbyB1bWEgcXVlYnJhIGRlIGxpbmhhICANCkFxdWkgdGFtYsOpbSBzZXLDoSBmZWl0byB1bWEgcXVlYnJhIGRlIGxpbmhhXA0KPC9zcGFuPg0KDQpBbMOpbSBkaXNzbywgc2Ugdm9jw6ogcXVlciBhZGljaW9uYXIgbWFpcyBxdWVicmFzIGRlIGxpbmhhcywgbWFzIGVtIGxpbmhhcyBzZW0gbmVuaHVtYSBpbmZvcm1hw6fDo28sIMOpIHBvc3PDrXZlbCBmYXplciBvIHNlZ3VpbnRlIGPDs2RpZ28gaHRtbC4NCmBgYCBodG1sDQpBcXVpIHNlcsOhIHJlYWxpemFkbyAuLi5cDQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQouLi4gdsOhcmlhcyBxdWVicmFzIGRlIGxpbmhhXA0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IGdyZXk7Ij4NCkFxdWkgc2Vyw6EgcmVhbGl6YWRvIC4uLlwNCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCi4uLiB2w6FyaWFzIHF1ZWJyYXMgZGUgbGluaGFcDQo8L3NwYW4+DQoNCiMgQWxndW1hcyBvcMOnw7VlcyBkZSBmb3JtYXRhw6fDo28gZGUgdGV4dG8NCg0KfEPDs2RpZ298U2HDrWRhfA0KfDotLS06fDotLS06fA0KfFwqaXTDoWxpY29cKnwqaXTDoWxpY28qfA0KfFxfaXTDoWxpY29cX3xfaXTDoWxpY29ffA0KfFwqZW1cKmFwZW5hc1wqYWxndW1hc1wqbGV0cmFzfCplbSphcGVuYXMqYWxndW1hcypsZXRyYXN8DQp8XCpcKm5lZ3JpdG9cKlwqfCoqbmVncml0byoqfA0KfFxfXF9uZWdyaXRvXF9cX3xfX25lZ3JpdG9fX3wNCnxcKlwqZW1cKlwqYXBlbmFzXCpcKmFsZ3VtYXNcKlwqbGV0cmFzfCoqZW0qKmFwZW5hcyoqYWxndW1hcyoqbGV0cmFzfA0KfHNvYnJlc2NyaXRvXF4yXF58c29icmVzY3JpdG9eMl58DQp8c3Vic2NyaXRvXH4yXH58c3Vic2NyaXRvfjJ+fA0KfFx+XH5zdWJsaW5oYWRvXH5cfnx+fnN1YmxpbmhhZG9+fnwNCg0KIyBDb21vIGRlaXhhciBvIGPDs2RpZ28gZGUgZm9ybWEgbGl0ZXJhbCB7LnRhYnNldCAudGFic2V0LWZhZGV9DQojIyBQYXJhIHVtIGNhcmFjdGVyZQ0KUGFyYSBmYXplciBpc3NvIGVtIHVtIGNhcmFjdGVyZSBiYXN0YSB1c2FyIGEgYmFycmEgaW52ZXJ0aWRhIChcXCksIHZlamEgc8OzOg0KYGBgIG1hcmtkb3duDQoqKm5lZ3JpdG8qKlwNClwqXCpuZWdyaXRvXCpcKg0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KKipuZWdyaXRvKipcDQpcKlwqbmVncml0b1wqXCpcDQo8L3NwYW4+DQoNCiMjIFBhcmEgdsOhcmlhcyBwYWxhdnJhcyBlbSB1bWEgbGluaGENClBhcmEgdsOhcmlhcyBwYWxhdnJhcyB2b2PDqiB1dGlsaXphIGNyYXNlczoNCmBgYCBNYXJrZG93bg0KYEPDs2RpZ28gZGUgZm9ybWEgbGl0ZXJhbGANCg0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KYEPDs2RpZ28gZGUgZm9ybWEgbGl0ZXJhbGANCjwvc3Bhbj4NCg0KIyMgUGFyYSB2w6FyaWFzIGxpbmhhczoNClBhcmEgdXRpbGl6YXIgY8OzZGlnbyBsaXRlcmFsIGVtIHbDoXJpYXMgbGluaGFzIHZvY8OqIHBvZGUgdXNhciB0csOqcyBjcmFzZXMganVudGFzIGBgYGBgYCBgYGAgYGBgYGBgOg0KDQpgYGBgYGBgYGBtYXJrZG93bg0KYGBgDQpWw6FyaWFzDQpsaW5oYXMNCmRlDQpjw7NkaWdvDQpsaXRlcmFsDQpgYGANCmBgYGBgYGBgYA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6IGdyZXk7Ij4NCmBgYA0KVsOhcmlhcw0KbGluaGFzDQpkZQ0KY8OzZGlnbw0KbGl0ZXJhbA0KYGBgDQo8L3NwYW4+DQoNCiMgQmxvY28gZGUgY2l0YcOnw6NvDQpQYXJhIGFkaWNpb25hciB1bSBibG9jbyBkZSBjaXRhw6fDo28gdm9jw6ogdXRpbGl6YXLDoSBhIHNlZ3VpbnRlIHN5bnRheDoNCmBgYE1hcmtkb3duDQo+IEFxdWkgdm9jw6ogZmFyw6Egc3VhIGNpdGHDp8Ojbw0KPiBWZWphIHF1ZSBhIHF1ZWJyYSBkZSBsaW5oYSBuw6NvIMOpIGF1dG9tw6F0aWNhDQpgYGANCj4gQXF1aSB2b2PDqiBmYXLDoSBzdWEgY2l0YcOnw6NvDQo+IFZlamEgcXVlIGEgcXVlYnJhIGRlIGxpbmhhIG7Do28gw6kgYXV0b23DoXRpY2ENCg0KIyBUcmHDp28sIHRyYXZlc3PDo28gZSByZXRhIGRlIHNlcGFyYcOnw6NvDQpQYXJhIGFkaWNpb25hciB1bSB0cmHDp28gZSB1bSB0cmF2ZXNzw6NvIGZhw6dhIG8gc2VndWludGU6DQoNCnxDw7NkaWdvfFNhw61kYXwNCnw6LS0tOnw6LS0tOnwNCnxUcmHDp286IFwtXC18VHJhw6dvOiAtLXwNCnxUcmF2ZXNzw6NvOiBcLVwtXC18VHJhdmVzc8OjbzogLS0tfA0KDQpQYXJhIGFkaWNpb25hciB1bWEgcmV0YSBob3Jpem9udGFsIGRlIHNlcGFyYcOnw6NvIHZvY8OqIHBvZGUgdXRpaXphciBkdWFzIGZvcm1hcywgdmVqYTpcDQoNClRyw6pzIGVzdHJlbGFzIG91IG1haXM6DQoNCmAqKipgXA0KDQoqKioNCg0KVHLDqnMgdHJhw6dvcyBvdSBtYWlzOg0KDQpgLS0tYA0KDQotLS0NCg0KIyBMaXN0YXMgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KIyMgTGlzdGEgbsOjbyBvcmRlbmFkYQ0KSMOhIHRyw6pzIGZvcm1hcyBkZSBmYXplciB1bWEgbGlzdGEgbsOjbyBvcmRlbmFkYS4gT2JzZXJ2ZSBlIHByYXRpcXVlOg0KPGJyPg0KDQoqKlByaW1laXJhIGZvcm1hKioNCmBgYCBtYXJrZG93bg0KLSBMaXN0YSBuw6NvIG9yZGVuYWRhDQogIC0gSXRlbQ0KICAgIC0gSXRlbQ0KICAgICAgLSBJdGVtDQpgYGANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiBncmV5OyI+DQoNCi0gTGlzdGEgbsOjbyBvcmRlbmFkYQ0KICAtIEl0ZW0NCiAgICAtIEl0ZW0NCiAgICAgIC0gSXRlbQ0KDQo8L3NwYW4+DQoNCjxicj4NCg0KKipTZWd1bmRhIGZvcm1hKioNCmBgYCBtYXJrZG93bg0KKyBMaXN0YSBuw6NvIG9yZGVuYWRhDQogICsgSXRlbQ0KICAgICsgSXRlbQ0KICAgICAgKyBJdGVtDQpgYGANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiBncmV5OyI+DQoNCisgTGlzdGEgbsOjbyBvcmRlbmFkYQ0KICArIEl0ZW0NCiAgICArIEl0ZW0NCiAgICAgICsgSXRlbQ0KDQo8L3NwYW4+DQoNCjxicj4NCg0KKipUZXJjZWlyYSBmb3JtYSoqDQpgYGAgbWFya2Rvd24NCiogTGlzdGEgbsOjbyBvcmRlbmFkYQ0KICAqIEl0ZW0NCiAgICAqIEl0ZW0NCiAgICAgICogSXRlbQ0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KDQoqIExpc3RhIG7Do28gb3JkZW5hZGENCiAgKiBJdGVtDQogICAgKiBJdGVtDQogICAgICAqIEl0ZW0NCg0KPC9zcGFuPg0KICAgICAgDQojIyBMaXN0YSBPcmRlbmFkYQ0KVm9jw6ogcG9kZSBmYXplciBsaXN0YXMgb3JkZW5hZGFzIGRhIHNlZ3VpbnRlIGZvcm1hLg0KDQpgYGAgTWFya2Rvd24NCjEuIExpc3RhIG9yZGVuYWRhDQogICAgMS4gSXRlbQ0KICAgIDEuIEl0ZW0NCjIuIExpc3RhIG9yZGVuYWRhDQogICAgMS4gSXRlbQ0KICAgICAgICAxLiBJdGVtDQoyLiBMaXN0YSBvcmRlbmFkYQ0KICAgIC0gSXRlbQ0KICAgICAgKiBJdGVtDQotIExpc3RhIG7Do28gb3JkZW5hZGENCiAgICArIEl0ZW0NCjMuIE9yZGVuw6fDo28gYXV0b23DoXRpY2Egc2VtIGZ1bmNpb25hbWVudG8NCg0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KDQoxLiBMaXN0YSBvcmRlbmFkYQ0KICAgIDEuIEl0ZW0NCiAgICAxLiBJdGVtDQoyLiBMaXN0YSBvcmRlbmFkYQ0KICAgIDEuIEl0ZW0NCiAgICAgICAgMS4gSXRlbQ0KMi4gTGlzdGEgb3JkZW5hZGENCiAgICAtIEl0ZW0NCiAgICAgICogSXRlbQ0KLSBMaXN0YSBuw6NvIG9yZGVuYWRhDQogICAgKyBJdGVtDQozLiBPcmRlbsOnw6NvIGF1dG9tw6F0aWNhIHNlbSBmdW5jaW9uYW1lbnRvDQoNCjwvc3Bhbj4NCg0KIyMgTGlzdGEgY29tIG9ww6fDtWVzIGRlIG1hcmNhw6fDo28NClZvY8OqIHBvZGUgZmF6ZXIgbGlzdGFzIGNvbSBvcMOnw6NvIGRlIG1hcmNhciBqdW50byBhbyBxdWUgZm9pIG1vc3RyYWRvIGRlIGxpc3RhcyBuw6NvIG9yZGVuYWRhcyBlIG9yZGVuYWRhcywgb2xoZSBzw7M6DQoNCmBgYCBNYXJrZG93bg0KLSBbeF0gUHJpbWVpcmEgb3DDp8Ojbw0KICAqIFsgXSBJdGVtDQogICsgW3hdIEl0ZW0NCiAgICAxLiBbIF0gSXRlbQ0KICAgIDIuIFsgXSBJdGVtDQogICAgLSBbIF0gSXRlbQ0KICAgICogWyBdIEl0ZW0NCiAgICArIFsgXSBJdGVtDQoNCi0gWyBdIFNlZ3VuZGEgb3DDp8Ojbw0KICAqIFt4XSBJdGVtDQogICAgKyBbIF0gSXRlbQ0KICAgICAgMS4gWyBdIEl0ZW0NCiAgICAgIDEuIFsgXSBJdGVtDQogICAgICAxLiBbIF0gSXRlbQ0KICAgIA0KLSBbeF0gVGVyY2VpcmEgb3DDp8Ojbw0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KDQotIFt4XSBQcmltZWlyYSBvcMOnw6NvDQogICogWyBdIEl0ZW0NCiAgKyBbeF0gSXRlbQ0KICAgIDEuIFsgXSBJdGVtDQogICAgMi4gWyBdIEl0ZW0NCiAgICAtIFsgXSBJdGVtDQogICAgKiBbIF0gSXRlbQ0KICAgICsgWyBdIEl0ZW0NCg0KLSBbIF0gU2VndW5kYSBvcMOnw6NvDQogICogW3hdIEl0ZW0NCiAgICArIFsgXSBJdGVtDQogICAgICAxLiBbIF0gSXRlbQ0KICAgICAgMS4gWyBdIEl0ZW0NCiAgICAgIDEuIFsgXSBJdGVtDQogICAgDQotIFt4XSBUZXJjZWlyYSBvcMOnw6NvDQoNCjwvc3Bhbj4NCg0KDQojIExpbmtzDQpIw6EgdHLDqnMgbWFuZWlyYXMgZGUgYWRpY2lvbmFyIGxpbmtzIGNsaWPDoXZlaXMgbm8gUk1hcmtkb3duLCBhbWJhcyBpbnRlcmVzc2FudGVzIHBhcmEgZGlmZXJlbnRlcyBjYXNvcy4gDQoNCjxicj4NCg0KKiBQYXJhIGZhemVyIGEgcHJpbWVpcmEgbWFuZWlyYSByZWFsaXplIG8gc2VndWludGUgY8OzZGlnby5cDQoNCmBgYCBtYXJrZG93bg0KUHJpbWVpcm8gZXN0aWxvIGRlIGxpbms6IDxodHRwczovL2xpbmt0ci5lZS9wZXRfZXN0YXRpc3RpY2F1ZmM+DQpgYGANClByaW1laXJvIGVzdGlsbyBkZSBsaW5rOiA8aHR0cHM6Ly9saW5rdHIuZWUvcGV0X2VzdGF0aXN0aWNhdWZjPlwNCg0KPGJyPg0KDQoqIEEgc2VndW5kYSBtYW5laXJhIGRlaXhhIG8gbGluayB2aXN1YWxtZW50ZSBtYWlzIGJvbml0bywgb2JzZXJ2ZTpcDQoNCmBgYCBtYXJrZG93bg0KU2VndW5kbyBlc3RpbG8gZGUgbGluazogW1BFVCBFc3RhdMOtc3RpY2EgVUZDXShodHRwczovL2xpbmt0ci5lZS9wZXRfZXN0YXRpc3RpY2F1ZmMgIlBFVCBFc3RhdMOtc3RpY2EiKQ0KYGBgDQoNClNlZ3VuZG8gZXN0aWxvIGRlIGxpbms6IFtQRVQgRXN0YXTDrXN0aWNhIFVGQ10oaHR0cHM6Ly9saW5rdHIuZWUvcGV0X2VzdGF0aXN0aWNhdWZjICJQRVQgRXN0YXTDrXN0aWNhIilcDQoNCjxicj4NCg0KKiBBIHRlcmNlaXJhIG1hbmVpcmEgw6kgaW50ZXJlc3NhbnRlIHBhcmEgYWRpY2lvbmFyIG8gbWVzbW8gbGluayB2w6FyaWFzIHZlemVzIGVtIGRpZmVyZW50ZXMgcGFsYXZyYXMsIHZlamE6XA0KDQpgYGAgbWFya2Rvd24NClRlcmNlaXJvIGVzdGlsbyBkZSBsaW5rOiBbUEVUIEVzdGF0w61zdGljYSBVRkNdW0xpbmstMV1cDQpPIE1lc21vIGxpbmsgY29tIG91dHJvIG5vbWU6IFtQcm9ncmFtYSBkZSBFZHVjYcOnw6NvIFR1dG9yaWFsIGRhIEVzdGF0w61zdGljYV1bTGluay0xXQ0KDQpbTGluay0xXTpodHRwczovL2xpbmt0ci5lZS9wZXRfZXN0YXRpc3RpY2F1ZmMgJ1BFVCBFc3RhdMOtc3RpY2EnDQpgYGANCg0KVGVyY2Vpcm8gZXN0aWxvIGRlIGxpbms6IFtQRVQgRXN0YXTDrXN0aWNhIFVGQ11bTGluay0xXVwNCk8gTWVzbW8gbGluayBjb20gb3V0cm8gbm9tZTogW1Byb2dyYW1hIGRlIEVkdWNhw6fDo28gVHV0b3JpYWwgZGEgRXN0YXTDrXN0aWNhXVtMaW5rLTFdDQoNCltMaW5rLTFdOmh0dHBzOi8vbGlua3RyLmVlL3BldF9lc3RhdGlzdGljYXVmYyAnUEVUIEVzdGF0w61zdGljYScNCg0KIyBJbWFnZW5zDQpQYXJlY2lkbyBjb20gb3MgbGlua3MsIGFzIGltYWdlbnMgcG9kZW0gc2VyIGFkaWNpb25hZGFzIGRlIHRyw6pzIGZvcm1hcy5cDQoNCjxicj4NCg0KKiBBIHByaW1laXJhIGZvcm1hIMOpIGEgc2VndWludGU6DQoNCmBgYCBtYXJrZG93bg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KIVtVbml2ZXJzaWRhZGUgRmVkZXJhbCBkbyBDZWFyw6FdKGh0dHBzOi8vZW5jcnlwdGVkLXRibjAuZ3N0YXRpYy5jb20vaW1hZ2VzP3E9dGJuOkFOZDlHY1R5YmxaUUFWVTRya1R1RXgtOHdvY29NN1h4TzJhMzFOc3UzTDVZM0d1ajB3JnMgJ0xvZ28gVUZDJyl7IHdpZHRoPTIwJSB9DQo8L2Rpdj4NCmBgYA0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KIVtVbml2ZXJzaWRhZGUgRmVkZXJhbCBkbyBDZWFyw6FdKGh0dHBzOi8vZW5jcnlwdGVkLXRibjAuZ3N0YXRpYy5jb20vaW1hZ2VzP3E9dGJuOkFOZDlHY1R5YmxaUUFWVTRya1R1RXgtOHdvY29NN1h4TzJhMzFOc3UzTDVZM0d1ajB3JnMgJ0xvZ28gVUZDJyl7IHdpZHRoPTIwJSB9DQo8L2Rpdj4NCg0KT2JzZXJ2ZSBxdWUgZXNzZXMgY8OzZGlnb3MgY29tIGA8ZGl2IGFsZ3VtYS1jb2lzYT5gIHPDo28gYWRpY2lvbmFpcyBkbyBodG1sIHF1ZSB2b2PDqiBwb2RlIGVzdMOhIHV0aWxpemFuZG8uIEVudMOjbyBuw6NvIHNlIHByZW9jdXBlIHNlIG7Do28gZW50ZW5kw6otbG9zIHBvcnF1ZSBwYXJhIGVudGVuZGVyIG1hcmtkb3duIGJhc3RhIGZvY2FyIG5hcyBvdXRyYXMgcGFydGVzLg0KDQo8YnI+DQoNCiogQSBzZWd1bmRhIG1hbmVpcmEsIG1lbGhvciBwYXJhIGFkaWNpb25hciBhIG1lc21hIGltYWdlbSB2w6FyaWFzIHZlemVzIG91IHBhcmEgdGVyIHVtYSBtYWlvciBvcmdhbml6YcOnw6NvLCDDqSBhIHNlZ3VpbnRlOg0KDQpgYGAgbWFya2Rvd24NCiFbVW5pdmVyc2lkYWRlIEZlZGVyYWwgZG8gQ2VhcsOhXVtsaW5rLTJdDQoNCiFbTG9nbyBkYSBVRkNdW2xpbmstMl0NCg0KW2xpbmstMl06aHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVHlibFpRQVZVNHJrVHVFeC04d29jb003WHhPMmEzMU5zdTNMNVkzR3VqMHcmcyAnTG9nbyBVRkMnDQpgYGANCg0KIVtVbml2ZXJzaWRhZGUgRmVkZXJhbCBkbyBDZWFyw6FdW2xpbmstMl0NCg0KIVtMb2dvIGRhIFVGQ11bbGluay0yXQ0KDQpbbGluay0yXTpodHRwczovL2VuY3J5cHRlZC10Ym4wLmdzdGF0aWMuY29tL2ltYWdlcz9xPXRibjpBTmQ5R2NUeWJsWlFBVlU0cmtUdUV4LTh3b2NvTTdYeE8yYTMxTnN1M0w1WTNHdWowdyZzICdMb2dvIFVGQycNCg0KIyBOb3RhcyBkZSBSb2RhcMOpDQpVdGlsaXplIGEgc2VndWludGUgc3ludGF4IHBhcmEgYWRpY2lvbmFyIHVtYSBub3RhIGRlIHJvZGFww6k6XA0KYGBgU1FMDQpJc3NvIMOpIHVtYSBub3RhIGRlIHJvZGFww6k6IFteZGVmXQ0KDQpbXmRlZl06IGRlZmluacOnw6NvDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KSXNzbyDDqSB1bWEgbm90YSBkZSByb2RhcMOpOiBbXmRlZl0NCjwvc3Bhbj4NCg0KDQpbXmRlZl06IGRlZmluacOnw6NvICANCg0KTm90ZSBxdWUgbsOjbyDDqSBuZWNlc3PDoXJpbyBmYXplciBhIG51bWVyYcOnw6NvIGRhcyBub3RhcyBkZSByb2RhcMOpIHBvcnF1ZSBlbGFzIHPDo28gbnVtZXJhZGFzIGF1dG9tYXRpY2FtZW50ZS4gQWzDqW0gZGlzc28sIGEgbm90YSBkZSByb2RhcMOpIMOpIGNsaWPDoXZlbCwgbGV2YW5kbyBvIHVzdcOhcmlvIGFvIGZpbmFsIGRvIGRvY3VtZW50bywgb25kZSBzZSBlbmNvbnRyYW0gdG9kYXMgbm90YXMgZGUgcm9kYXDDqS5cDQoNCiMgQmlibGlvZ3LDoWZpYSB7LnRhYnNldCAudGFic2V0LWZhZGV9DQojIyBBcnF1aXZvIC5iaWINClBhcmEgY3JpYXIgdW0gPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5hcnF1aXZvIC5iaWI8L3NwYW4+W15iaWJdIHZvY8OqIGRldmUgYWJyaXIgdW0gYXJxdWl2byBkZSB0ZXh0by4gUGFyYSBwcmVlbmNow6otbG8gdm9jw6ogaXLDoSB1dGlsaXphciBvcyBkYWRvcyBiaWJsaW9ncsOhZmljb3Mgbm8gZm9ybWF0byBCaWJUZVguIMOJIHBvc3PDrXZlbCBwZWdhciBlc3NlcyBkYWRvcyBqw6EgZmVpdG9zIG5vIFtHb29nbGUgQWNhZMOqbWljb10oaHR0cHM6Ly9zY2hvbGFyLmdvb2dsZS5jb20uYnIvP2hsPXB0KS5cDQoNClBvciBleGVtcGxvLCBkaWdhbW9zIHF1ZSB2b2PDqiBxdWVyIGNpdGFyIG8gbGl2cm8gRXN0YXTDrXN0aWNhIELDoXNpY2EuIEJhc3RhIHZvY8OqIHBlc3F1aXNhciBvIG5vbWUgZG8gbGl2cm8gZSBpciBuYSBvcMOnw6NvIGBDaXRhcmAuXA0KIVtdKEltYWdlbnMvZ29vZ2xlX2FjYWRlbWljby5wbmcpXA0KDQo8YnI+DQo8YnI+DQoNCkFww7NzIGlzc28sIGJhc3RhIGVzY29saGVyIGEgb3DDp8OjbyBCaWJUZVguXA0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KIVtdKEltYWdlbnMvZ29vZ2xlX2FjYWRlbWljbzIucG5nKVwNCjwvZGl2Pg0KDQo8YnI+DQo8YnI+DQoNCkRlcG9pcywgw6kgc8OzIGNvcGlhciBlIGNvbGFyIG5vIHNldSBhcnF1aXZvIGRlIHRleHRvLiBWb2PDqiBwb2RlIGlyIGFkaWNpb25hbmRvIGVzc2FzIHJlZmVyw6puY2lhcyBhIHF1YWxxdWVyIG1vbWVudG8gbm8gc2V1IGFycXVpdm8gZGUgdGV4dG8sIGVudMOjbyBqw6Egw6kgcG9zc8OtdmVsIHNhbHbDoS1sbyBkZW50cm8gZG8gc2V1IGRpcmV0w7NyaW8uIExlbWJyZSBkZSBzYWx2YXIgbyBzZXUgYXJxdWl2byBjb20gbyAiLmJpYiIgbm8gZmluYWwgYW8gaW52w6lzIGRlICIudHh0Ii5cDQohW10oSW1hZ2Vucy9iaWIucG5nKVwNCg0KQ29tIGlzc28sIG5vIHByw7N4aW1vIHTDs3BpY28gdm9jw6ogaXLDoSBhcHJlbmRlciBhIGNvbW8gY29sb2NhciBvIHNldSBhcnF1dm8gLmJpYiBlbSBmdW5jaW9uYW1lbnRvIGRlbnRybyBkbyBSTWFya2Rvd24uXA0KDQpbXmJpYl06IFVtIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+YXJxdWl2byAuYmliPC9zcGFuPiDDqSB1bSBhcnF1aXZvIGRlIGJhbmNvIGRlIGRhZG9zIGJpYmxpb2dyw6FmaWNvIHVzYWRvIGNvbXVtZW50ZSBjb20gbyBzb2Z0d2FyZSBkZSBnZXJlbmNpYW1lbnRvIGRlIHJlZmVyw6puY2lhcyBiaWJsaW9ncsOhZmljYXMsIGNvbW8gQmliVGVYLiBFc3NlIHRpcG8gZGUgYXJxdWl2byDDqSBmcmVxdWVudGVtZW50ZSB1dGlsaXphZG8gZW0gdHJhYmFsaG9zIGFjYWTDqm1pY29zLCBjb21vIHRlc2VzLCBkaXNzZXJ0YcOnw7VlcywgYXJ0aWdvcyBkZSByZXZpc3RhcyBlIG91dHJvcyBkb2N1bWVudG9zIHF1ZSByZXF1ZXJlbSBjaXRhw6fDtWVzIGUgcmVmZXLDqm5jaWFzIGJpYmxpb2dyw6FmaWNhcy4gTyBmb3JtYXRvIC5iaWIgZ2VyYWxtZW50ZSBjb250w6ltIGluZm9ybWHDp8O1ZXMgYmlibGlvZ3LDoWZpY2FzIHNvYnJlIG9icmFzLCBjb21vIGxpdnJvcywgYXJ0aWdvcyBkZSBwZXJpw7NkaWNvcywgY29uZmVyw6puY2lhcywgZW50cmUgb3V0cm9zLiBFc3NhcyBpbmZvcm1hw6fDtWVzIGluY2x1ZW0gZGV0YWxoZXMgY29tbyBhdXRvcihlcyksIHTDrXR1bG8sIGFubyBkZSBwdWJsaWNhw6fDo28sIGVkaXRvcmEsIG7Dum1lcm8gZGUgcMOhZ2luYXMsIElTU04gb3UgSVNCTiwgZSBvdXRyYXMgaW5mb3JtYcOnw7VlcyByZWxldmFudGVzLg0KDQojIyBBIG9ww6fDo28gZGUgYmlibGlvZ3JhZmlhIG5vIFlBTUwgSEVBREVSIHsjYmlifQ0KUGFyYSBjb2xvY2FyIHNldSBhcnF1aXZvIC5iaWIgZW0gZnVuY2lvbmFtZW50byBiYXN0YSBhZGljaW9uYXIgYGJpYmxpb2dyYXBoeTogTm9tZS5iaWJgIGVtIHNldSBjYWJlw6dhbGhvIFlBTUwuIFZlamEgbyBzZWd1aW50ZSBleGVtcGxvIGNvbSBvIGFycXVpdm8gY3JpYWRvIG5hIHNlw6fDo28gYW50ZXJpb3I6XA0KYGBgTWFya2Rvd24NCi0tLQ0KdGl0bGU6ICJOb3ZvX0FycXVpdm8iDQphdXRob3I6ICJKb25hcyINCmRhdGU6ICIyMDI0LTAyLTA4Ig0KYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFmaWEuYmliDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQpgYGANCk9ic2VydmUgcXVlIGFwZW5hcyBjb2xvY2FyIGVzc2Egb3DDp8OjbyBubyBjYWJlw6dhbGhvIFlBTUwgbsOjbyB2YWkgYWRpY2lvbmFyIHN1YXMgY2l0YcOnw7VlcyBvdSByZWZlcsOqbmNpYXMgYW8gYXJxdWl2by4gQWzDqW0gZGlzc28sIMOpIGltcG9ydGFudGUgb2JzZXJ2YXIgc2UgbyBhcnF1aXZvIC5iaWIgZXN0w6Egbm8gc2V1IGRpcmV0w7NyaW8gZGUgdHJhYmFsaG8gcGFyYSBuw6NvIGhhdmVyIGVycm9zLg0KDQojIyBDaXRhw6fDtWVzDQpQYXJhIGZhemVyIHVtYSBjaXRhw6fDo28gdm9jw6ogdmFpIHV0aWl6YXIgbyBgQGAuIFBvciBleGVtcGxvLCBwYXJhIGNpdGFyIG8gbGl2cm8gRXN0YXTDrXN0aWNhIELDoXNpY2EsIG8gcXVhbCBqw6EgZXN0w6Egbm8gYXJxdWl2byAuYmliIGNyaWFkbyBhbnRlcmlvcm1lbnRlLCB2b2PDqiB2YWkgcGVnYXIgYSBwcmltZWlyYSBpbmZvcm1hw6fDo28gbmEgY2l0YcOnw6NvIEJpYlRlWCBlIGNvbG9jw6EtbGEgYXDDs3MgbyBgQGAuXA0KIVtdKEltYWdlbnMvY2l0YWNhby5wbmcpXA0KPGJyPg0KPGJyPg0KQXDDs3MgcmVuZGVyaXphciBvIHNldSBhcnF1aXZvIHZvY8OqIHZlcsOhIHF1ZSBhbMOpbSBkYSBjaXRhw6fDo28gZm9pIGNvbG9jYWRvIGF1dG9tYXRpY2FtZW50ZSBubyBmaW5hbCBkbyBvdXRwdXQgYSByZWZlcsOqbmNpYSBkYSBjaXRhw6fDo28uXA0KIVtdKEltYWdlbnMvb3V0cHV0X2NpdGFjYW8yLnBuZylcDQo8YnI+DQo8YnI+DQpTZSB2b2PDqiBxdWlzZXIgdW1hIGNpdGHDp8OjbyBlbnRyZSBwYXLDqm50ZXNlcyBiYXN0YSBjb2xvY2FyIGNvbGNoZXRlcyBubyBjw7NkaWdvIGFudGVyaW9yLlwNCiFbXShJbWFnZW5zL2NpdGFjYW8yLnBuZylcDQo8YnI+DQo8YnI+DQpDYXNvIHZvY8OqIHF1ZWlyYSBxdWUgYXBlbmFzIG8gYW5vIGFwYXJlw6dhIG5hIGNpdGHDp8Ojbywgdm9jw6ogcG9kZSB1dGlsaXphciBhIHN5bnRheCBhbnRlcmlvciBjb20gdW0gYC1gIG5hIGZyZW50ZSBkbyBgQGAuXA0KIVtdKEltYWdlbnMvY2l0YWNhbzMucG5nKVwNCg0KIyMjIENpdGHDp8OjbyBjbGljw6F2ZWwNClBhcmEgcXVlIHNlamEgcG9zc8OtdmVsIGNsaWNhciBuYSBjaXRhw6fDo28gZSBpciBkaXJldG8gcGFyYSBhcyByZWZlcsOqbmNpYXMgw6kgcG9zc8OtdmVsIGNvbG9jYXIgYSBvcMOnw6NvIGBsaW5rLWNpdGF0aW9uczogVFJVRWAgbm8gY2FiZcOnYWxobyBZQU1MLlwNCiFbXShJbWFnZW5zL2xpbmstY2l0YXRpb24ucG5nKVwNCg0KIyMjIE11ZGFuw6dhIGRlIGlkaW9tYQ0KQWzDqW0gZGlzc28sIHZvY8OqIGRldmUgdGVyIHBlcmNlYmlkbyBxdWUgYXMgY2l0YcOnw7VlcyBlc3TDo28gZW0gb3V0cmEgbMOtbmd1YS4gQWRpY2lvbmUgYSBvcMOnw6NvIGBsYW5nOiBwdC1icmAgbm8gY2FiZcOnYWxobyBZQU1MIHBhcmEgcXVlIGZpcXVlIG5vIGlkaW9tYSBkbyBCcmFzaWwsIHNlbWVsaGFudGUgYW8gc2VndWludGUgZXhlbXBsby5cDQpgYGBNYXJrZG93bg0KLS0tDQp0aXRsZTogIk5vdm9fQXJxdWl2byINCmF1dGhvcjogIkpvbmFzIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnKiVkIGRlICVCLCAgJVkqJylgIg0KYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFmaWEuYmliDQpsaW5rLWNpdGF0aW9uczogVFJVRQ0KbGFuZzogcHQtYnINCm91dHB1dDogaHRtbF9kb2N1bWVudA0KLS0tDQoNCmBgYA0KDQojIyMgUmVmZXLDqm5jaWEgc2VtIGNpdGHDp8Ojbw0KDQpTZSBjYXNvIHZvY8OqIHF1aXNlciBmYXplciBhcGVuYXMgYSByZWZlcsOqbmNpYSBzZW0gcHJlY2lzYXIgZmF6ZXIgYSBjaXRhw6fDo28gYW8gbG9uZ28gZG8gc2V1IGRvY3VtZW50bywgZW50w6NvIGNvbG9xdWUgYSBvcMOnw6NvIGBub3RpY2VgLlwNCg0KIVtdKEltYWdlbnMvYXBlbmFzX3JlZi5wbmcpXA0KDQpTZSBmb3JlbSB2w6FyaWFzIHJlZmVyw6puY2lhcywgZW50w6NvIHZvY8OqIHBvZGUgZmF6ZXIgYSBzZXBhcmHDp8OjbyBjb20gdsOtcmd1bGFzLlwNCiFbXShJbWFnZW5zL2FwZW5hc19yZWYyLnBuZylcDQoNCg0KIyBFcXVhw6fDtWVzIG1hdGVtw6F0aWNhcyB7LnRhYnNldCAudGFic2V0LWZhZGV9DQpWb2PDqiBwb2RlIGluc2VyaXIgZXF1YcOnw7VlcyBtYXRlbcOhdGljYXMgbm8gUk1hcmtkb3duIGRhIG1lc21hIG1hbmVpcmEgcXVlIG8gZmFyaWEgbm8gTGFUZVguIFNlIHZvY8OqIG7Do28gZXN0w6EgZmFtaWxpYXJpemFkbyBjb20gZXNzZSBmb3JtYXRvLCByZWNvbWVuZGFtb3MgYWNlc3NhciBvIFtzaXRlIGRvIE92ZXJsZWFmXShodHRwczovL3d3dy5vdmVybGVhZi5jb20vbGVhcm4vbGF0ZXgvTWF0aGVtYXRpY2FsX2V4cHJlc3Npb25zICJNYXRoZW1hdGljYWwgZXhwcmVzc2lvbnMiKSBwYXJhIG9idGVyIG1haXMgZGV0YWxoZXMuIEFiYWl4byBlc3TDo28gZG9pcyBleGVtcGxvcyBxdWUgZGVtb25zdHJhbSBjb21vIGFkaWNpb25hciBlcXVhw6fDtWVzIG1hdGVtw6F0aWNhcyBlbSBzZXUgZG9jdW1lbnRvLg0KDQojIyBFcXVhw6fDo28gZW0gbGluaGENCkVzc2EgZm9ybWEgcGVybWl0ZSBjb2xvY2FyIHVtYSBlcXVhw6fDo28gbWF0ZW3DoXRpY2EgbmEgbWVzbWEgbGluaGEgcXVlIG8gc2V1IHRleHRvLiBWb2PDqiBwb2RlIGZhemVyIGlzc28gdXRpbGl6YW5kbyBhIHNlZ3VpbnRlIHN5bnRheC4NCmBgYExhdGV4DQokU3VhRXF1YcOnw6NvJA0KYGBgDQoNClBvciBleGVtcGxvLCBlc3RhIMOpIGEgZsOzcm11bGEgZG8gZGVzdmlvIHBhZHLDo286DQpgYGBMYXRleA0KRGVzdmlvIFBhZHLDo286ICRcc3FydHtcZnJhY3tcc3VtX3tpPTF9XntufXhfaV4yLW5cb3ZlcmxpbmV7eH1eMn17bi0xfX0kDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KRGVzdmlvIFBhZHLDo286ICRcc3FydHtcZnJhY3tcc3VtX3tpPTF9XntufXhfaV4yLW5cb3ZlcmxpbmV7eH1eMn17bi0xfX0kXA0KPC9zcGFuPg0KDQpWZWphIHF1ZSBhIGVxdWHDp8OjbyBmb2kgY29sb2NhZGEganVudG8gYW8gdGV4dG8gbm9ybWFsIGVtIHVtYSDDum5pY2EgbGluaGEuDQoNCg0KIyMgRXF1YcOnw6NvIGVtIGJsb2NvDQpFc3RhIGZvcm1hIGRlIGVzY3JpdGEgbsOjbyBwb3NzaWJpbGl0YSBhIGluc2Vyw6fDo28gZGUgdGV4dG8gbm9ybWFsIG5hIG1lc21hIGxpbmhhIHF1ZSBhIGVxdWHDp8Ojbywgbm8gZW50YW50bywgY2VudHJhbGl6YSBhdXRvbWF0aWNhbWVudGUgYSBlcXVhw6fDo28gZSBkZWl4YSBlbGEgbWFpb3IsIG8gcXVlIGTDoSB1bSBtYWlvciBkZXN0YXF1ZS4gQSBzdWEgc3ludGF4IMOpIGEgc2VndWludGU6DQpgYGBMYXRleA0KJCRTdWFFcXVhw6fDo28kJA0KYGBgDQoNCk8gc2VndWludGUgZXhlbXBsbyBmYXogdW1hIGVxdWHDp8OjbyBlbSBibG9jbyBuYSBxdWFsIGEgdmFyacOhdmVsICoqVyoqIHRlbSBkaXN0cmlidWnDp8OjbyBub3JtYWwgcGFkcsOjby4NCmBgYExhdGV4DQokJFcgPSBcZnJhY3tcZGlzcGxheXN0eWxlXHN1bV97aT0xfV57bn1Ye2l9LW5cbXV9e1xzcXJ0e259XHNpZ21hfSQkDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KJCRXID0gXGZyYWN7XGRpc3BsYXlzdHlsZVxzdW1fe2k9MX1ee259WHtpfS1uXG11fXtcc3FydHtufVxzaWdtYX0kJA0KPC9zcGFuPg0KDQojIENodW5rcw0KQ2h1bmtzIHBlcm1pdGVtIHF1ZSBjw7NkaWdvcyBkZSBkaWZlcmVudGVzIGxpbmd1YWdlbnMgKGNvbW8gUiwgcHl0aG9uLCBTUUwsIExhVGVYLCBlbnRyZSBvdXRyYXMpIHNlamFtIGFkaWNpb25hZGFzIGFvIGFycXVpdm8gZG8gUk1hcmtkb3duLCBvIHF1ZSBwZXJtaXRlIHJlcHJvZHV6aXIsIHBvciBleGVtcGxvLCB0YWJlbGFzLCBncsOhZmljb3MgZSBjw6FsY3Vsb3MgZGVudHJvIGRvIHNldSBhcnF1aXZvLiBQYXJhIGFkaWNvbmFyIHVtIGNodW5rIHF1ZSBwZXJtaXRlIGEgcmVwcm9kdcOnw6NvIGRlIGPDs2RpZ28gUiByZWFsaXplIG8gc2VndWludGUgY8OzZGlnby5cDQoNCmBgYGBgYGBgYGBgYE1hcmtkb3duDQpgYGBce3JcfQ0KIyBBcXVpIGRlbnRybyDDqSBvbmRlIGlyw6EgZmljYXIgc2V1IGPDs2RpZ28gUi4NCmBgYA0KYGBgYGBgYGBgYGBgDQoNClVtYSBvYnNlcnZhw6fDo28gYSBzZSBmYXplciDDqSBxdWUgYXMgYmFycmFzIGludmVydGlkYXMgcXVlIGVzdGFtIGFwYXJlY2VuZG8gbsOjbyBmYXplbSBwYXJ0ZSBkYSBzaW50YXhlLCBmb3JhbSBhcGVuYXMgbmVjZXNzw6FyaWFzIHBhcmEgY29uc2VndWlyIG1vc3RyYXIgYXMgY2hhdmVzLlwNCg0KUGFyYSBhZGljaW9uYXIgdW0gY2h1bmsgcXVlIHJlcHJvZHV6YSBxdWFscXVlciBsaW5ndWFnZW0sIGZhw6dhIG8gc2VndWludGUgY8OzZGlnbyBzdWJzdGl0dWluZG8gYG5vbWVgIHBlbG8gbm9tZSBkYSBsw61uZ3VhZ2VtIGRlIGludGVyZXNzZSAocHl0aG9uLCByLCBiYXNoLCBzcWwsIHBocCwgZXRjKS4NCg0KYGBgYGBgYGBgYGBgTWFya2Rvd24NCmBgYFx7bm9tZVx9DQpEaWdpdGUgbyBzZXUgY8OzZGlnbyBhcXVpLg0KYGBgDQpgYGBgYGBgYGBgYGANCkNodW5rcyBvZmVyZWNlbSBvcMOnw7VlcyBxdWUgcGVybWl0ZW0gbXVkYXIgbyBvdXRwdXQgZG8gY8OzZGlnby4gUGFyYSBhZGljaW9uYXIgdW1hIG91IG1haXMgb3DDp8O1ZXMsIGZhw6dhIG8gc2VndWludGUgY8OzZGlnby4NCg0KYGBgYGBgYGBgYGBgTWFya2Rvd24NCmBgYFx7bm9tZSBvcGNhbzEsIG9wY2FvMiwgLi4uLCBvcGNhb25cfQ0KRGlnaXRlIG8gc2V1IGPDs2RpZ28gYXF1aS4NCmBgYA0KYGBgYGBgYGBgYGBgDQpBIHNlZ3VpciBzw6NvIGFwcmVzZW50YWRhcyBhbGd1bWFzIGRhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgbm8gUk1hcmtkb3duIHBhcmEgbXVkYXIgbyBvdXRwdXQgZG8gY2h1bmsuXA0KDQp8T3DDp8Ojb3xPIHF1ZSBlbGEgZmF6fA0KfDotLS06fDotLS18DQp8ZWNobz1GQUxTRXxPY3VsdGEgbyBjw7NkaWdvLCBtb3N0cmFuZG8gYXBlbmFzIG8gcmVzdWx0YWRvLnwNCnxtZXNzYWdlPUZBTFNFfFJldGlyYSBvcyBhdmlzb3MgcXVlIGFwYXJlY2VtIG5vIGPDs2RpZ28ufA0KfGV2YWw9RkFMU0V8TyBjw7NkaWdvIG7Do28gw6kgZXhlY3V0YWRvLCBtYXMgc2Vyw6EgZXhpYmlkbyBubyBkb2N1bWVudG8ufA0KfGluY2x1ZGU9RkFMU0V8T2N1bHRhIG8gY8OzZGlnbyBlIG9zIHJlc3VsdGFkb3MsIG1hcyBleGVjdXRhIG8gY8OzZGlnby58DQp8d2FybmluZz1GQUxTRXxUaXJhIG9zIGF2aXNvcyBkbyBvdXRwdXQufA0KfHJlc3VsdHM9J2hpZGUnfE9jdWx0YSBvcyByZXN1bHRhZG9zIGRvIGPDs2RpZ28ufA0KfGVycm9yPVRSVUV8UmVuZGVyaXphIG8gYXJxdWl2byBtZXNtbyBvY29ycmVuZG8gZXJyb3MufA0KfGNvbGxhcHNlPVRSVUV8SnVudGEgdG9kYXMgYXMgc2HDrWRhcyBkZSB1bSBjaHVuayBlbSB1bSDDum5pY28gYmxvY28ufA0KDQpQYXJhIGV4ZW1wbGlmaWNhciBhIHV0aWxpemHDp8OjbyBkZSBjaHVua3MgY29tIGEgbGluZ3VhZ2VtIHIsIGEgc2VndWlyIMOpIGZlaXRvIHVtIGRpYWdyYW1hIGRlIGRpc3BlcsOnw6NvIHV0aWxpemFuZG8gZ2dwbG90Lg0KYGBgYGBgYGBgYGBgTWFya2Rvd24NCmBgYFx7ciBjaHVuay1sYWJlbCwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFXH0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwYWxtZXJwZW5ndWlucykNCmxpYnJhcnkoZ2d0aGVtZXMpDQoNCmdncGxvdChkYXRhID0gcGVuZ3VpbnMsDQogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gZmxpcHBlcl9sZW5ndGhfbW0sIHkgPSBib2R5X21hc3NfZykNCikgKw0KICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoY29sb3IgPSBzcGVjaWVzKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nKQ0KYGBgDQpgYGBgYGBgYGBgYGANCg0KYGBge3IgY2h1bmstbGFiZWwsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwYWxtZXJwZW5ndWlucykNCmxpYnJhcnkoZ2d0aGVtZXMpDQoNCmdncGxvdChkYXRhID0gcGVuZ3VpbnMsDQogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gZmxpcHBlcl9sZW5ndGhfbW0sIHkgPSBib2R5X21hc3NfZykNCikgKw0KICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoY29sb3IgPSBzcGVjaWVzKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nKQ0KYGBgDQoNClRhbWJlbSDDqSBwb3Nzw612ZWwgYXByZXNlbnRhciByZXN1bHRhZG9zIG51bcOpcmljb3MgZGVudHJvIGRvIHNldSB0ZXh0bywgY29tbyBubyBzZWd1aW50ZSBleGVtcGxvLg0KYGBgTWFya2Rvd24NCkEgbWFzc2EgY29ycG9yYWwgbcOpZGlhIGRvcyBwaW5ndWlucyDDqSBgXHIgcm91bmQobWVhbihwZW5ndWlucyRib2R5X21hc3NfZywgbmEucm0gPSBUKSwgMilgDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KDQpBIG1hc3NhIGNvcnBvcmFsIG3DqWRpYSBkb3MgcGluZ3VpbnMgw6kgYHIgcm91bmQobWVhbihwZW5ndWlucyRib2R5X21hc3NfZywgbmEucm0gPSBUKSwgMilgXA0KDQo8L3NwYW4+DQoNCsOJIGltcG9ydGFudGUgcmVzc2FsdGFyIHF1ZSBhIGJhcnJhIGludmVydGlkYSBuw6NvIGZheiBwYXJ0ZSBkYSBzaW50YXhlLCBtYXMgZm9pIG5lY2Vzc8OhcmlhIHBhcmEgcXVlIHRvZG8gbyBjw7NkaWdvIHNlamEgbW9zdHJhZG8uDQoNCiMgVGFiZWxhcyB7LnRhYnNldCAudGFic2V0LWZhZGV9DQoNCiMjIFRhYmVsYSBmZWl0YSBuYSBtw6NvDQpQYXJhIGZhemVyIHVtYSB0YWJlbGEgc2VtIGEgdXRpbGl6YcOnw6NvIGRvIFIgZGlyZXRhbWVudGUgbm8gUk1hcmtkb3duLCBvYnNlcnZlIGUgZXhlY3V0ZSBvIHNlZ3VpbnRlIGPDs2RpZ28uDQoNCmBgYCBtYXJrZG93bg0KfGRpcmVpdGF8ZXNxdWVyZGF8cGFkcsOjb3xjZW50cmFsaXphZG98DQp8LS0tOnw6LS0tfC0tLXw6LS0tOnwNCnwxMnwxMnwxMnwxMnwNCnwxMjN8MTIzfDEyM3wxMjN8DQp8MnwyfDJ8MnwNCmBgYA0KDQp8IGRpcmVpdGEgfCBlc3F1ZXJkYSB8IHBhZHLDo28gfCBjZW50cmFsaXphZG8gfA0KfC0tLS0tLS0tOnw6LS0tLS0tLS0tfC0tLS0tLS0tfDotLS0tLS0tLS0tLS06fA0KfCAgICAgIDEyIHwgMTIgICAgICAgfCAxMiAgICAgfCAgICAgIDEyICAgICAgfA0KfCAgICAgMTIzIHwgMTIzICAgICAgfCAxMjMgICAgfCAgICAgMTIzICAgICAgfA0KfCAgICAgICAyIHwgMiAgICAgICAgfCAyICAgICAgfCAgICAgIDIgICAgICAgfA0KDQpWZWphIHF1ZSBvIGNhcmFjdGVyZSBgfGAgw6kgdXRpbGl6YWRvIHBhcmEgZGVsaW1pdGFyIG8gcXVlIGZpY2EgZGVudHJvIGRlIGNhZGEgY8OpbHVsYSwgYWxlbSBkYSBzZWd1bmRhIGxpbmhhIGRvIGPDs2RpZ28gdGVyIHRyYcOnb3MgZSBwb250b3MgcXVlIGRpemVtIGNvbW8gdmFpIHNlciBvIGFsaW5oYW1lbnRvIGRvIHRleHRvIGUgZGVsaW1pdGEgcXVlbSDDqSBub21lIGRhcyBjb2x1bmFzLg0KDQojIyBUYWJlbGFzIGNvbSBSDQpIw6EgZHVhcyBtYW5laXJhIGludGVyZXNzYW50ZXMgZGUgYWRpY2lvbmFyIHVtYSB0YWJlbGEgY29tIGEgdXRpbGl6YcOnw6NvIGRvIFIuXA0KPGJyPg0KDQotIFBhcmEgYSBwcmltZWlyYSDDqSBuZWNlc3PDoXJpbyB0ZXIgbyBwYWNvdGUgYGtuaXRyYCwgbyBwYWNvdGUgYGthYmxlRXh0cmFgIGUgbyBwYWNvdGUgYHBhbG1lcnBlbmd1aW5zYCBpbnN0YWxhZG9zIG5vIHNldSBwYy4gRXhlY3V0ZSBvIGPDs2RpZ28gYGluc3RhbGwucGFja2FnZXMoImtuaXRyIilgLCBgaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpYCBlIGBpbnN0YWxsLnBhY2thZ2VzKCJwYWxtZXJwZW5ndWlucyIpYCBlbSBzZXUgY29uc29sZS4gQXDDs3MgaXNzbyB2b2PDqiB2YWkgdXRpbGl6YXIgYSBmdW7Dp8OjbyBgbGlicmFyeShrbml0cilgIGUgYGxpYnJhcnkoa2FibGVFeHRyYSlgIHBhcmEgY2FycmVnYXIgbyBwYWNvdGUgZSBwYXJhIHBvZGVyIHRlciBhY2Vzc28gYSBzdWEgZnVuw6fDo28gYGthYmxlKClgIGUgYGthYmxlX3N0eWxpbmcoKWAuIFNlIHZvY8OqIG7Do28gcXVpc2VyIHVzYXIgbyBsaWJyYXJ5LCDDqSBwb3Nzw612ZWwgY2FycmVnYXIgbyBwYWNvdGUgZSB1c2FyIGEgZnVuw6fDo28gYW8gbWVzbW8gdGVtcG8gY29tIGBrbml0cjo6a2FibGUoKWAgZSBga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZygpYC4gQ29tIGlzc28gZW0gbWVudGUsIG9ic2VydmUgZSBleGVjdXRlIG8gc2VndWludGUgY8OzZGlnby4NCmBgYHtyfQ0KbGlicmFyeShwYWxtZXJwZW5ndWlucykNCg0Ka25pdHI6OmthYmxlKGhlYWQocGVuZ3VpbnMsIDEwKSkgfD4gDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQpgYGANCkFsZ3VtYXMgaW5mb3JtYcOnw7VlcyBpbXBvcnRhbnRlcyBzb2JyZSBvcyBwYXLDom1ldHJvcyB1dGlsaXphZG9zIG5hcyBmdW7Dp8O1ZXM6DQoNCnxDw7NkaWdvfENvbmNlaXRvfA0KfDotLS06fDotLS06fA0KfGBwYWxtZXJwZW5ndWluc2B8w4kgbyBwYWNvdGUgb25kZSBlc3TDoSBsb2NhbGl6YWRvIG8gdGliYmxlICh1bSB0aXBvIGRlIGJhc2UgZGUgZGFkb3MpIHBlbmd1aW5zfA0KfGBrYWJsZShoZWFkKHBlbmd1aW5zLCAxMCkpYHxGYXogdW1hIHRhYmVsYSBjb20gYXMgMTAgcHJpbWVpcmFzIGxpbmhhc3wNCnxga2FibGVfc3R5bGluZygpYHxQZW1pdGUgbXVkYXIgdsOhcmlhcyBvcMOnw7VlcyB2aXN1YWlzLiBPcyBjw7NkaWdvcyBkZW50cm8gZGVzc2EgZnVuw6fDo28gYXBlbmFzIGVzcGVjaWZpY2FtIHByb3ByaWVkYWRlcyB2aXN1YWlzfA0KfGBmdWxsX3dpZHRoID0gVFJVRWB8RXNzYSBvcMOnw6NvIGZheiBhIHRhYmVsYSBwZWdhciB0b2RhIGEgZXh0ZW5zw6NvIGRvIHJlbGF0w7NyaW98DQp8YHN0cmlwZWRgfGRlaXhhIGFzIGNvcmVzIGRhcyBsaW5oYXMgYWx0ZXJuYWRhc3wNCnxgaG92ZXJgfGRlc3RhY2EgYSBsaW5oYSBxdWFuZG8gcGFzc2EgbyBtb3VzZXwNCnxgY29uZGVuc2VkYHxkZWl4YSBhIHRhYmVsYSBtYWlzIGNvbmRlbnNhZGF8DQp8YHJlc3BvbnNpdmVgfHF1YW5kbyBkaW1pbnVpIG11aXRvIGEgdGVsYSBlbGUgYWRhcHRhIGEgdGFiZWxhfA0KDQo8YnI+DQoNCi0gUGFyYSBhIG91dHJhIGZvcm1hIGRlIGZhemVyIHVtYSB0YWJlbGEgY29tIFIgdm9jw6ogdmFpIHByZWNpc2FyIGRvIHBhY290ZSBgcm1hcmtkb3duYC4gRGVzc2UgbW9kbywgZXhlY3V0ZSBgaW5zdGFsbC5wYWNrYWdlcygicm1hcmtkb3duIilgLiBBcMOzcyBpc3NvLCBvYnNlcnZlIGUgZXhlY3V0ZSBvIHNlZ3VpbnRlIGPDs2RpZ28uDQpgYGB7cn0NCmxpYnJhcnkocGFsbWVycGVuZ3VpbnMpDQoNCnJtYXJrZG93bjo6cGFnZWRfdGFibGUocGVuZ3VpbnMpDQpgYGANCg0KQ29tIGlzc28gdm9jw6ogdGVtIHVtYSBib2EgZm9ybWEgcGFyYSBhcHJlc2VudGFyLCBkZXBlbmRlbmRvIGRvIHF1ZSBmb3IgbWFpcyBjb3ZlbmllbnRlLCBwb3Vjb3MgZGFkb3MgZGUgdW1hIHRhYmVsYSBvdSBtdWl0b3MgZGFkb3MgZGUgdW1hIHRhYmVsYS5cDQo8YnI+DQpWb2PDqiBkZXZlIHRlciBwZXJjZWJpZG8gYSBmb3J0ZSBpbnRlZ3Jhw6fDo28gZW50cmUgTWFya2Rvd24gZSBSIGFxdWkgbm8gUlN0dWRpby4gQWzDqW0gZGUgY3JpYXIgdGFiZWxhcywgdm9jw6ogcG9kZSBpbmNvcnBvcmFyIGdyw6FmaWNvcyBnZXJhZG9zIHBlbG8gUiBlIGF0w6kgbWVzbW8gcmVhbGl6YXIgY8OhbGN1bG9zIGNvbXBsZXhvcyBjb20gYmFzZSBlbSBjb25qdW50b3MgZGUgZGFkb3MuIEVzc2EgaW50ZWdyYcOnw6NvIG9mZXJlY2UgdW1hIGFtcGxhIGdhbWEgZGUgcG9zc2liaWxpZGFkZXMgcGFyYSBjcmlhciBkb2N1bWVudG9zIGRpbsOibWljb3MgZSBpbnRlcmF0aXZvcyBxdWUgY29tYmluYW0gdGV4dG8sIGPDs2RpZ28gZSByZXN1bHRhZG9zIGVtIHVtIMO6bmljbyBhbWJpZW50ZS4NCg0KDQoNCiMgUmVmZXLDqm5jaWFzDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K