diff --git a/notebook.ipynb b/notebook.ipynb index a9309b4..80ad555 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","metadata":{"id":"arqpDh95Zt6W"},"source":["# Wasserstein GAN\n","\n","L'objectif de ce projet était d'étudier les GANs dans le cas de la distance de Wasserstein.\n","\n","Voici les membres de notre groupe classés par ordres alphabétiques pour leur nom de famille :\n","- Paul Corbalan\n","- Nicolas Gonel\n","- Oihan Joyot\n","- Tristan Portugues\n","- Florian Zorzynski\n","\n","Notre projet s'inspire grandement des ressources suivantes qui sont l'article initial de notre projet ainsi que le code correspondant.\n","- Article : [[1701.07875] Wasserstein GAN (arxiv.org)](https://arxiv.org/abs/1701.07875)\n","- Code : [martinarjovsky/WassersteinGAN (github.com)](https://github.com/martinarjovsky/WassersteinGAN)\n","\n","Un répertoire pour ce projet en général est disponible à l'adresse suivante :\n","https://github.com/paul-corbalan/wasserstein-gan\n","\n","---"]},{"cell_type":"markdown","metadata":{"id":"Hke_hyXT3bSP"},"source":["## Introduction\n","\n","Les Réseaux Antagonistes Génératifs (GANs) représentent une avancée majeure dans le domaine de l'apprentissage profond, révolutionnant la manière dont les machines comprennent et génèrent des données, en particulier des images. Cette technologie imite la façon dont les humains apprennent et créent, ouvrant des portes vers des applications innovantes allant de l'art numérique à des solutions médicales avancées. Le projet \"Wasserstein GAN\" s'inscrit dans cette perspective, visant à explorer une variante spécifique des GANs qui utilise la distance de Wasserstein pour améliorer la stabilité et la qualité des résultats.\n","\n","Le choix de la distance de Wasserstein comme métrique clé dans notre projet offre un avantage distinct sur les méthodes traditionnelles. Elle permet de surmonter certains des défis inhérents aux GANs classiques, comme le mode collapse et les problèmes de convergence. En se concentrant sur cette approche, notre projet cherche à démontrer comment une compréhension approfondie de la théorie mathématique peut être appliquée efficacement pour améliorer la performance et la fiabilité des modèles génératifs.\n","\n","Ce notebook est conçu pour servir d'outil d'apprentissage et d'exploration dans le domaine des GANs, avec un accent particulier sur les Wasserstein GANs. Il guide le lecteur à travers les principes fondamentaux, les défis et les solutions uniques associés à cette technologie, offrant un mélange d'explications théoriques et d'applications pratiques. L'objectif est de fournir une base solide pour comprendre et utiliser les Wasserstein GANs."]},{"cell_type":"markdown","metadata":{"id":"P_O5MYE_xMU5"},"source":["## Generative Adversarial Network (GAN)\n","\n","Les GANs sont des modèles d'apprentissage profond définis par deux réseaux neuronaux, le générateur $G$ et le discriminateur $D$.\n","\n"," Le générateur crée des données, tandis que le discriminateur les évalue. L'objectif du générateur est d'approcher un distribution $\\mathbb{P}_g$ inconnue telle que les données générées $G(z)$ soient indiscernables des données réelles $x$, où $z$ un vecteur de notre espace latent. Le discriminateur est entraîné à faire la distinction entre un inputs et $x$.\n","\n"," Les deux modèles sont mis en compétition et $G$ cherche à minimiser la probabilité que $D$ fasse la distinction entre $G(z)$ et $x$, tandis que $D$ cherche à maximiser cette probabilité.\n","\n","Formellement, cela correspond à résoudre le problème min-max pour :\n","$$V(D, G) = \\mathbb{E}_{x \\sim \\mathbb{P}_{r}}[\\log D(x)] + \\mathbb{E}_{z \\sim \\mathbb{P}_z}[\\log(1 - D(G(z)))]$$\n","où le problème est le suivant :\n","$$\n","\\min _G \\max _D V(D, G)\n","$$\n","\n"," Cette minimisation utilise la log-vraissemblance négative et est la solution d'origine pour arriver à un équilibre entre le générateur et le discriminateur. Cependant cette méthode peut présenter plusieurs problèmes:\n"," - des \"modes collapse\" où l'entraînement converge vers une solution oubliant certaines particularités de la distibution cherché.\n"," - des gradients évanescents, lorsque le discriminateur devient trop parfait, il devient impossible de générer un gradient utilisable à partir de la sortie du discriminateur.\n","\n"," On va donc chercher un moyen de résoudre ces problèmes en changeant de fonction de perte et on va essayer d'utiliser la distance de wasserstein."]},{"cell_type":"markdown","metadata":{"id":"yIx0TILzG6-l"},"source":["## Distance de Wasserstein\n","\n","### Définition\n","\n","En mathématiques, la distance de Wasserstein est une fonction définie entre des distributions de probabilité sur un espace métrique donné $(M,d)$. La distance de Wasserstein d'ordre $p \\in \\left[1,+\\infty \\right]$ entre deux mesures de probabilité $\\mu$ et $\\nu$ définies sur $M$ (avec des moments finis de l'ordre $p$) est définie par :\n","\n","\\begin{equation}\n","\\begin{split}\n","{\\displaystyle W_{p}(\\mu ,\\nu )=\\left(\\inf _{\\gamma \\in \\Gamma (\\mu ,\\nu )}\\mathbf {E} _{(x,y)\\sim \\gamma }d(x,y)^{p}\\right)^{1/p}.}\n","\\end{split}\n","\\end{equation}\n","\n","L'infimum est pris sur $\\Gamma (\\mu,\\nu )$, l'ensemble de tous les couplages dont les distributions marginales sont respectivement $\\mu$ et $\\nu$.\n","\n","### Interprétation physique\n","\n","Cette métrique est également connue sous le nom de earth mover distance. De manière intuitive, si l'on imagine chaque distribution comme une unité de terre empilée sur un espace métrique $M$, la métrique représente le coût minimal pour remodeler une pile en une autre. Ce coût est conçu comme la quantité de terre à déplacer, multipliée par la distance moyenne qu'elle doit parcourir.\n","\n","En d'autres termes, la distance de Wasserstein fournit une mesure précise du coût minimal nécessaire pour transformer une distribution de probabilité en une autre, tout en minimisant le coût total de ce déplacement. C'est pourquoi l'avantage de cette distance réside dans son incorporation des concepts de transport optimal et de couplage, tous deux pertinents et pratiques pour l'étude.\n","\n","### Utilisation pour les images numériques\n","\n","Pour résumer, la distance de Wasserstein est une manière naturelle de comparer les distributions de probabilité de deux variables, où une variable est dérivée de l'autre par de petites perturbations non uniformes (aléatoires ou déterministes). C'est pourquoi, en informatique, cette métrique est largement utilisée pour comparer des distributions discrètes, notamment les histogrammes de couleur de deux images numériques.\n","\n","\n","### Calcul numérique\n","\n","Le problème principal de cette distance est son calcul, l'infimum étant très compliqué à calculer. Heureusement, la dualité de Kantorovich-Rubinstein nous donne :\n","\\begin{equation}\n","W(\\mathbb{P}_r, \\mathbb{P}_{\\theta})=\\frac{1}{K}\\sup_{||f|| 0.7:\n"," print(f\"Image {filename} is predicted as a human face and will be moved.\")\n"," shutil.copy(os.path.join(folder_path, filename), 'predicted_humans')\n","\n","\n","predict_and_move(\"..\")"]},{"cell_type":"markdown","metadata":{"id":"Pl2UlIxJMb-s"},"source":["![confusion.svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmcxIgogICB3aWR0aD0iNjE0LjQwMDAyIgogICBoZWlnaHQ9IjQ2MC43OTk5OSIKICAgdmlld0JveD0iMCAwIDYxNC40MDAwMiA0NjAuNzk5OTkiCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczEiPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDQiPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDU3LjYsMzguMDE2IEggNDE0LjcyIFYgMzA0LjEyOCBIIDU3LjYgWiIKICAgICAgICAgaWQ9InBhdGg0IiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxjbGlwUGF0aAogICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0iY2xpcFBhdGg2Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA1Ny42LDM4LjAxNiBIIDQxNC43MiBWIDMwNC4xMjggSCA1Ny42IFoiCiAgICAgICAgIGlkPSJwYXRoNiIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8Y2xpcFBhdGgKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImNsaXBQYXRoOCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gNTcuNiwzOC4wMTYgSCA0MTQuNzIgViAzMDQuMTI4IEggNTcuNiBaIgogICAgICAgICBpZD0icGF0aDgiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDEwIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA1Ny42LDM4LjAxNiBIIDQxNC43MiBWIDMwNC4xMjggSCA1Ny42IFoiCiAgICAgICAgIGlkPSJwYXRoMTAiIC8+CiAgICA8L2NsaXBQYXRoPgogIDwvZGVmcz4KICA8ZwogICAgIGlkPSJnMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgxIgogICAgICAgZD0iTSAwLDAgSCA0NjAuOCBWIDM0NS42IEggMCBaIgogICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsLTEuMzMzMzMzMywwLDQ2MC44KSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDIiCiAgICAgICBkPSJNIDU3LjYsMzguMDE2IEggNDE0LjcyIFYgMzA0LjEyOCBIIDU3LjYgWiIKICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMzMzMsMCwwLC0xLjMzMzMzMzMsMCw0NjAuOCkiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgzIgogICAgICAgZD0iTSA1Ny42LDMwNC4xMjggSCAyMzYuMTYgViAxNzEuMDcyIEggNTcuNiB2IDEzMy4wNTYiCiAgICAgICBzdHlsZT0iZmlsbDojYjJkMmU4O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLDAsNDYwLjgpIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNCkiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1IgogICAgICAgZD0iTSAyMzYuMTYsMzA0LjEyOCBIIDQxNC43MiBWIDE3MS4wNzIgSCAyMzYuMTYgdiAxMzMuMDU2IgogICAgICAgc3R5bGU9ImZpbGw6I2YyZjhmZDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsLTEuMzMzMzMzMywwLDQ2MC44KSIKICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDYpIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNyIKICAgICAgIGQ9Ik0gNTcuNiwxNzEuMDcyIEggMjM2LjE2IFYgMzguMDE2IEggNTcuNiB2IDEzMy4wNTYiCiAgICAgICBzdHlsZT0iZmlsbDojZjdmYmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLDAsNDYwLjgpIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg5IgogICAgICAgZD0iTSAyMzYuMTYsMTcxLjA3MiBIIDQxNC43MiBWIDM4LjAxNiBIIDIzNi4xNiB2IDEzMy4wNTYiCiAgICAgICBzdHlsZT0iZmlsbDojMDgzMDZiO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLDAsNDYwLjgpIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTApIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMTEiCiAgICAgICBkPSJtIDE0Ni44OCwzOC4wMTYgdiAtMy41IgogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC44O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLDAsNDYwLjgpIiAvPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsMTU2LjA3OTU4LDQyOS41NzAzMykiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDcuNDggMTMuNiAxOS45NDAwMDEgMjMuNTQ5OTk5IDMxLjA3IDM3LjQxIDQ3LjE1MDAwMiA1My4yNzk5OTkiCiAgICAgICAgIHk9IjAiCiAgICAgICAgIGlkPSJ0c3BhbjExIj5Ob24tSHVtYW48L3RzcGFuPjwvdGV4dD4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDEyIgogICAgICAgZD0ibSAzMjUuNDQsMzguMDE2IHYgLTMuNSIKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsLTEuMzMzMzMzMywwLDQ2MC44KSIgLz4KICAgIDx0ZXh0CiAgICAgICBpZD0idGV4dDEyIgogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsMS4zMzMzMzMzLDQwOS44Njc5Miw0MjkuNTcwMzMpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5OidEZWphVnUgU2Fucyc7d3JpdGluZy1tb2RlOmxyLXRiO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgeD0iMCA3LjUyIDEzLjg2IDIzLjYgMjkuNzMiCiAgICAgICAgIHk9IjAiCiAgICAgICAgIGlkPSJ0c3BhbjEyIj5IdW1hbjwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTMiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsMjgzLjU2NzUsNDQ3Ljc5OTUpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5OidEZWphVnUgU2Fucyc7d3JpdGluZy1tb2RlOmxyLXRiO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgeD0iMCA1Ljg1ODEyNTIgOS43NDkzNzUzIDE1Ljg5OTM3NSAyMi4yNDkzNzQgMjUuMDI5Mzc1IDMwLjUyOTM3NSAzNC40NDkzNzUgNDAuNTk5Mzc3IgogICAgICAgICB5PSIwIgogICAgICAgICBpZD0idHNwYW4xMyI+UHJlZGljdGVkPC90c3Bhbj48L3RleHQ+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgxMyIKICAgICAgIGQ9Ik0gNTcuNiwyMzcuNiBIIDU0LjEiCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMzMzMsMCwwLC0xLjMzMzMzMzMsMCw0NjAuOCkiIC8+CiAgICA8dGV4dAogICAgICAgaWQ9InRleHQxNCIKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLC0xLjMzMzMzMzMsMS4zMzMzMzMzLDAsNjQuNjk1ODMzLDE4My43NjA0MikiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDcuNDggMTMuNiAxOS45NDAwMDEgMjMuNTQ5OTk5IDMxLjA3IDM3LjQxIDQ3LjE1MDAwMiA1My4yNzk5OTkiCiAgICAgICAgIHk9IjAiCiAgICAgICAgIGlkPSJ0c3BhbjE0Ij5Ob24tSHVtYW48L3RzcGFuPjwvdGV4dD4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDE0IgogICAgICAgZD0iTSA1Ny42LDEwNC41NDQgSCA1NC4xIgogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC44O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLDAsNDYwLjgpIiAvPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTUiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMS4zMzMzMzMzLDEuMzMzMzMzMywwLDY0LjY5NTgzMywzNDUuNDYwMDgpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5OidEZWphVnUgU2Fucyc7d3JpdGluZy1tb2RlOmxyLXRiO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgeD0iMCA3LjUyIDEzLjg2IDIzLjYgMjkuNzMiCiAgICAgICAgIHk9IjAiCiAgICAgICAgIGlkPSJ0c3BhbjE1Ij5IdW1hbjwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTYiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMS4zMzMzMzMzLDEuMzMzMzMzMywwLDQ2LjQ2NjY2NywyNDYuODQ5ODMpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5OidEZWphVnUgU2Fucyc7d3JpdGluZy1tb2RlOmxyLXRiO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgeD0iMCA0LjY0MTI1MDEgOC43NTEyNTAzIDE1LjA5MTI1IgogICAgICAgICB5PSIwIgogICAgICAgICBpZD0idHNwYW4xNiI+VHJ1ZTwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTciCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsMTgzLjEyMTI1LDE0Ny42NzcwOCkiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojMjYyNjI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDYuMzYwMDAwMSAxMi43MiIKICAgICAgICAgeT0iMCIKICAgICAgICAgaWQ9InRzcGFuMTciPjY3NjwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTgiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsNDIxLjIwMTI1LDE0Ny42NzcwOCkiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojMjYyNjI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDYuMzYwMDAwMSAxMi43MiIKICAgICAgICAgeT0iMCIKICAgICAgICAgaWQ9InRzcGFuMTgiPjE4MDwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTkiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsMTgzLjEyMTI1LDMyNS4wODUwOCkiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojMjYyNjI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDYuMzYwMDAwMSAxMi43MiIKICAgICAgICAgeT0iMCIKICAgICAgICAgaWQ9InRzcGFuMTkiPjEzOTwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MjAiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsNDE2Ljk2MTY3LDMyNS4wODUwOCkiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDYuMzYwMDAwMSAxMi43MiAxOS4wOCIKICAgICAgICAgeT0iMCIKICAgICAgICAgaWQ9InRzcGFuMjAiPjE4NDE8L3RzcGFuPjwvdGV4dD4KICAgIDx0ZXh0CiAgICAgICBpZD0idGV4dDIxIgogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsMS4zMzMzMzMzLDI0Ny4zNDg3NSw0Ny4yOTYpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OidEZWphVnUgU2Fucyc7d3JpdGluZy1tb2RlOmxyLXRiO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgeD0iMCA4LjM3NjAwMDQgMTUuNzIgMjMuMzI3OTk5IDI3LjU1MiAzNS4xNiA0MS40MTE5OTkgNDQuNzQ4MDAxIDUyLjA5MTk5OSA1OS43MDAwMDEgNjMuNTE1OTk5IDczLjg3MjAwMiA4MS4yMjc5OTcgODUuOTMxOTk5IDkwLjg2Mzk5OCA5NC4xOTk5OTciCiAgICAgICAgIHk9IjAiCiAgICAgICAgIGlkPSJ0c3BhbjIxIj5Db25mdXNpb24gTWF0cml4PC90c3Bhbj48L3RleHQ+CiAgPC9nPgo8L3N2Zz4K)"]},{"cell_type":"markdown","metadata":{"id":"vEH1G2zSIZ3p"},"source":["L'ensemble de données a ensuite été mis à l'échelle pour appliquer le filtre de convolution à l'aide de la commande :\n","```shell\n","convert *.png resized 400% *upscaled*/*.png\n","```\n","\n","Les données finales peuvent être téléchargées sur :\n","https://github.com/paul-corbalan/wasserstein-gan/blob/develop/data/predicted_humans.zip"]},{"cell_type":"markdown","metadata":{"id":"xA3azaz1US4k"},"source":["## Architecture du modèle GAN\n","\n","Dans cette partie sont décrites les architectures du discriminateur et du générateur de notre modèle."]},{"cell_type":"markdown","metadata":{"id":"dxaMaimlY21r"},"source":["### Discriminateur"]},{"cell_type":"markdown","metadata":{"id":"dFj_wV-i4dIG"},"source":["![netD_architecture.svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDguMS4wICgyMDIzMDcwNy4wNzM5KQogLS0+CjwhLS0gUGFnZXM6IDEgLS0+Cjxzdmcgd2lkdGg9Ijc3NnB0IiBoZWlnaHQ9Ijg2NHB0Igogdmlld0JveD0iMC4wMCAwLjAwIDc3Ni40OCA4NjQuMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgo8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMC45Nzc5MjkgMC45Nzc5MjkpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA4NzkuNSkiPgo8cG9seWdvbiBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSJub25lIiBwb2ludHM9Ii00LDQgLTQsLTg3OS41IDc5MCwtODc5LjUgNzkwLDQgLTQsNCIvPgo8IS0tIDE0MDI0NDk0MDU4NTY4MCAtLT4KPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDA1ODU2ODA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSIjY2FmZjcwIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjY4NCwtMzQuMjUgNjMwLC0zNC4yNSA2MzAsMCA2ODQsMCA2ODQsLTM0LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjY1NyIgeT0iLTguNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMSk8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODM3NDQgLS0+CjxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNzQ0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjY1MywtOTguNSA1NTksLTk4LjUgNTU5LC03Ni4yNSA2NTMsLTc2LjI1IDY1MywtOTguNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2MDYiIHk9Ii04NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+Vmlld0JhY2t3YXJkMDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4Mzc0NCYjNDU7Jmd0OzE0MDI0NDk0MDU4NTY4MCAtLT4KPGcgaWQ9ImVkZ2UyNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNzQ0JiM0NTsmZ3Q7MTQwMjQ0OTQwNTg1NjgwPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTYxMy43NSwtNzYuMDFDNjIwLjIxLC02Ny4zNiA2MjkuNywtNTQuNjYgNjM4LjE0LC00My4zNyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2NDEuNDMsLTQ1LjgxIDY0NC42MSwtMzUuNzEgNjM1LjgyLC00MS42MiA2NDEuNDMsLTQ1LjgxIi8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODM1NTIgLS0+CjxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNTUyPC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjcwNCwtMTYyLjc1IDYxMCwtMTYyLjc1IDYxMCwtMTQwLjUgNzA0LC0xNDAuNSA3MDQsLTE2Mi43NSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2NTciIHk9Ii0xNDkuMjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPk1lYW5CYWNrd2FyZDE8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODM1NTImIzQ1OyZndDsxNDAyNDQ5NDM1ODM3NDQgLS0+CjxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNTUyJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzNzQ0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTY0OC4zNSwtMTQwLjA3QzY0MC45OCwtMTMxLjA3IDYzMC4yMSwtMTE3LjkyIDYyMS4zNywtMTA3LjE0Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjYyMy41NywtMTA1LjMgNjE0LjUyLC05OS43OCA2MTguMTUsLTEwOS43MyA2MjMuNTcsLTEwNS4zIi8+CjwvZz4KPCEtLSAxNDAyNDQ5NDA1ODU1ODQgLS0+CjxnIGlkPSJub2RlMjkiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MDU4NTU4NDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9IiNhMmNkNWEiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzQ3LC0xMDQuNSA2NzEsLTEwNC41IDY3MSwtNzAuMjUgNzQ3LC03MC4yNSA3NDcsLTEwNC41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjcwOSIgeT0iLTc5IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDEsIDEsIDEpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgzNTUyJiM0NTsmZ3Q7MTQwMjQ0OTQwNTg1NTg0IC0tPgo8ZyBpZD0iZWRnZTI4IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODM1NTImIzQ1OyZndDsxNDAyNDQ5NDA1ODU1ODQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjY1LjgyLC0xNDAuMDdDNjcyLjAzLC0xMzIuNjMgNjgwLjYxLC0xMjIuMzYgNjg4LjQ5LC0xMTIuOTMiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNjkxLjcxLC0xMTUuNTMgNjk1LjQ0LC0xMDUuNjEgNjg2LjM0LC0xMTEuMDQgNjkxLjcxLC0xMTUuNTMiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDAzMiAtLT4KPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODQwMzI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzI1LC0yMjEgNTg5LC0yMjEgNTg5LC0xOTguNzUgNzI1LC0xOTguNzUgNzI1LC0yMjEiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjU3IiB5PSItMjA3LjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkNvbnZvbHV0aW9uQmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTg0MDMyJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzNTUyIC0tPgo8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4NDAzMiYjNDU7Jmd0OzE0MDI0NDk0MzU4MzU1MjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik02NTcsLTE5OC4yOUM2NTcsLTE5MS40NiA2NTcsLTE4Mi4zMiA2NTcsLTE3NC4wMiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2NjAuNSwtMTc0LjE2IDY1NywtMTY0LjE2IDY1My41LC0xNzQuMTYgNjYwLjUsLTE3NC4xNiIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc4MDgwIC0tPgo8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU3ODA4MDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2NDksLTI3OS4yNSA1MjUsLTI3OS4yNSA1MjUsLTI1NyA2NDksLTI1NyA2NDksLTI3OS4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1ODciIHk9Ii0yNjUuNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkxlYWt5UmVsdUJhY2t3YXJkMTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3ODA4MCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDAzMiAtLT4KPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzgwODAmIzQ1OyZndDsxNDAyNDQ5NDM1ODQwMzI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjAwLjE3LC0yNTYuNTRDNjEwLjE0LC0yNDguNTMgNjI0LjA1LC0yMzcuMzUgNjM1LjYxLC0yMjguMDYiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNjM3LjI5LC0yMzAuNCA2NDIuODksLTIyMS40MSA2MzIuOTEsLTIyNC45NCA2MzcuMjksLTIzMC40Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODM5ODQgLS0+CjxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzOTg0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjY2MiwtMzQzLjUgNTAyLC0zNDMuNSA1MDIsLTMyMS4yNSA2NjIsLTMyMS4yNSA2NjIsLTM0My41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU4MiIgeT0iLTMzMCIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+TmF0aXZlQmF0Y2hOb3JtQmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgzOTg0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc4MDgwIC0tPgo8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4Mzk4NCYjNDU7Jmd0OzE0MDI0NDk0MzU3ODA4MDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik01ODIuODUsLTMyMC44MkM1ODMuNTIsLTMxMi40NSA1ODQuNDgsLTMwMC40OSA1ODUuMzEsLTI5MC4xOCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1ODguODUsLTI5MC43OCA1ODYuMTYsLTI4MC41MyA1ODEuODcsLTI5MC4yMiA1ODguODUsLTI5MC43OCIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyNTkyIC0tPgo8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjU5MjwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1MTQsLTQwNy43NSAzNzgsLTQwNy43NSAzNzgsLTM4NS41IDUxNCwtMzg1LjUgNTE0LC00MDcuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDQ2IiB5PSItMzk0LjI1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5Db252b2x1dGlvbkJhY2t3YXJkMDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MjU5MiYjNDU7Jmd0OzE0MDI0NDk0MzU4Mzk4NCAtLT4KPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODI1OTImIzQ1OyZndDsxNDAyNDQ5NDM1ODM5ODQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDY5LjA3LC0zODUuMDdDNDkxLjA1LC0zNzUgNTI0LjM3LC0zNTkuNzUgNTQ5LjEyLC0zNDguNDIiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTUwLjE4LC0zNTEuMzMgNTU3LjgyLC0zNDMuOTkgNTQ3LjI3LC0zNDQuOTcgNTUwLjE4LC0zNTEuMzMiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDg0OCAtLT4KPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODQ4NDg8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzkzLC00NzIgMjY5LC00NzIgMjY5LC00NDkuNzUgMzkzLC00NDkuNzUgMzkzLC00NzIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzMxIiB5PSItNDU4LjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkxlYWt5UmVsdUJhY2t3YXJkMTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDg0OCYjNDU7Jmd0OzE0MDI0NDk0MzU4MjU5MiAtLT4KPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODQ4NDgmIzQ1OyZndDsxNDAyNDQ5NDM1ODI1OTI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzUwLjUxLC00NDkuMzJDMzY4LjY4LC00MzkuNDggMzk2LjAyLC00MjQuNjggNDE2Ljc5LC00MTMuNDMiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDE4LjI3LC00MTYuMDggNDI1LjQsLTQwOC4yNCA0MTQuOTQsLTQwOS45MiA0MTguMjcsLTQxNi4wOCIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyNDQ4IC0tPgo8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjQ0ODwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzOTksLTU0Mi4yNSAyMzksLTU0Mi4yNSAyMzksLTUyMCAzOTksLTUyMCAzOTksLTU0Mi4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTkiIHk9Ii01MjguNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPk5hdGl2ZUJhdGNoTm9ybUJhY2t3YXJkMDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MjQ0OCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDg0OCAtLT4KPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODI0NDgmIzQ1OyZndDsxNDAyNDQ5NDM1ODQ4NDg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzIwLjgyLC01MTkuNzZDMzIyLjUzLC01MTAuMDQgMzI1LjE0LC00OTUuMjEgMzI3LjI5LC00ODMiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzMwLjg4LC00ODMuNzkgMzI5LjE2LC00NzMuMzQgMzIzLjk4LC00ODIuNTggMzMwLjg4LC00ODMuNzkiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MzI2NCAtLT4KPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzMjY0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjI1MSwtNjA2LjUgMTE1LC02MDYuNSAxMTUsLTU4NC4yNSAyNTEsLTU4NC4yNSAyNTEsLTYwNi41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4MyIgeT0iLTU5MyIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+Q29udm9sdXRpb25CYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODMyNjQmIzQ1OyZndDsxNDAyNDQ5NDM1ODI0NDggLS0+CjxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzMjY0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyNDQ4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIwNi4wNywtNTgzLjgyQzIyOC4wNSwtNTczLjc1IDI2MS4zNywtNTU4LjUgMjg2LjEyLC01NDcuMTciLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjg3LjE4LC01NTAuMDggMjk0LjgyLC01NDIuNzQgMjg0LjI3LC01NDMuNzIgMjg3LjE4LC01NTAuMDgiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3OTYxNiAtLT4KPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTc5NjE2PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjEzNCwtNjcwLjc1IDEwLC02NzAuNzUgMTAsLTY0OC41IDEzNCwtNjQ4LjUgMTM0LC02NzAuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzIiIHk9Ii02NTcuMjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkxlYWt5UmVsdUJhY2t3YXJkMTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3OTYxNiYjNDU7Jmd0OzE0MDI0NDk0MzU4MzI2NCAtLT4KPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1Nzk2MTYmIzQ1OyZndDsxNDAyNDQ5NDM1ODMyNjQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNOTAuODMsLTY0OC4wN0MxMDguMjksLTYzOC4yNyAxMzQuNTIsLTYyMy41NiAxNTQuNTQsLTYxMi4zNCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxNTYuMDcsLTYxNC45MyAxNjMuMDgsLTYwNi45OSAxNTIuNjQsLTYwOC44MyAxNTYuMDcsLTYxNC45MyIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc4MTc2IC0tPgo8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzgxNzY8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTM2LC03NDEgMCwtNzQxIDAsLTcxOC43NSAxMzYsLTcxOC43NSAxMzYsLTc0MSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2OCIgeT0iLTcyNy41IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5Db252b2x1dGlvbkJhY2t3YXJkMDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3ODE3NiYjNDU7Jmd0OzE0MDI0NDk0MzU3OTYxNiAtLT4KPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTc4MTc2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc5NjE2PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTY4LjYxLC03MTguNTFDNjkuMTgsLTcwOC43OSA3MC4wNSwtNjkzLjk2IDcwLjc2LC02ODEuNzUiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzQuMywtNjgyLjI4IDcxLjM5LC02NzIuMDkgNjcuMzEsLTY4MS44NyA3NC4zLC02ODIuMjgiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDUxMiAtLT4KPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTg0NTEyPC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjExOCwtODA1LjI1IDE4LC04MDUuMjUgMTgsLTc4MyAxMTgsLTc4MyAxMTgsLTgwNS4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2OCIgeT0iLTc5MS43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODQ1MTImIzQ1OyZndDsxNDAyNDQ5NDM1NzgxNzYgLS0+CjxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4NDUxMiYjNDU7Jmd0OzE0MDI0NDk0MzU3ODE3NjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik02OCwtNzgyLjU3QzY4LC03NzQuMjkgNjgsLTc2Mi41IDY4LC03NTIuMjciLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzEuNSwtNzUyLjI4IDY4LC03NDIuMjggNjQuNSwtNzUyLjI4IDcxLjUsLTc1Mi4yOCIvPgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIxMDQwIC0tPgo8ZyBpZD0ibm9kZTE0IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjEwNDA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGJsdWUiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTE4LC04NzUuNSAxOCwtODc1LjUgMTgsLTg0MS4yNSAxMTgsLTg0MS4yNSAxMTgsLTg3NS41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjY4IiB5PSItODUwIiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDMyLCAzLCA0LCA0KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1MzEyMTA0MCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDUxMiAtLT4KPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUzMTIxMDQwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTg0NTEyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTY4LC04NDEuMDJDNjgsLTgzMy40NyA2OCwtODI0LjQxIDY4LC04MTYuMzQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzEuNSwtODE2LjUyIDY4LC04MDYuNTIgNjQuNSwtODE2LjUyIDcxLjUsLTgxNi41MiIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgwNDgwIC0tPgo8ZyBpZD0ibm9kZTE1IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODA0ODA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjU0LC02NzAuNzUgMTU0LC02NzAuNzUgMTU0LC02NDguNSAyNTQsLTY0OC41IDI1NCwtNjcwLjc1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNCIgeT0iLTY1Ny4yNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODA0ODAmIzQ1OyZndDsxNDAyNDQ5NDM1ODMyNjQgLS0+CjxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MDQ4MCYjNDU7Jmd0OzE0MDI0NDk0MzU4MzI2NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0yMDAuNDQsLTY0OC4wN0MxOTcuNTgsLTYzOS42MSAxOTMuNDksLTYyNy40OCAxODkuOTksLTYxNy4xIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE5My4wMiwtNjE2LjE0IDE4Ni41MSwtNjA3Ljc4IDE4Ni4zOSwtNjE4LjM3IDE5My4wMiwtNjE2LjE0Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjA5NDQgLS0+CjxnIGlkPSJub2RlMTYiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMDk0NDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyNjAsLTc0NyAxNTQsLTc0NyAxNTQsLTcxMi43NSAyNjAsLTcxMi43NSAyNjAsLTc0NyIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDciIHk9Ii03MjEuNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICg2NCwgMzIsIDQsIDQpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIwOTQ0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgwNDgwIC0tPgo8ZyBpZD0iZWRnZTE0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjA5NDQmIzQ1OyZndDsxNDAyNDQ5NDM1ODA0ODA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMjA2LjI3LC03MTIuMzVDMjA1Ljg3LC03MDMuMTUgMjA1LjM2LC02OTEuNiAyMDQuOTMsLTY4MS43NSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyMDguMzksLTY4MS42OSAyMDQuNDUsLTY3MS44NSAyMDEuMzksLTY4MiAyMDguMzksLTY4MS42OSIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgzNjQ4IC0tPgo8ZyBpZD0ibm9kZTE3IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODM2NDg8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzY5LC02MDYuNSAyNjksLTYwNi41IDI2OSwtNTg0LjI1IDM2OSwtNTg0LjI1IDM2OSwtNjA2LjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzE5IiB5PSItNTkzIiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5BY2N1bXVsYXRlR3JhZDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MzY0OCYjNDU7Jmd0OzE0MDI0NDk0MzU4MjQ0OCAtLT4KPGcgaWQ9ImVkZ2UxNSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNjQ4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyNDQ4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTMxOSwtNTgzLjgyQzMxOSwtNTc1LjU0IDMxOSwtNTYzLjc1IDMxOSwtNTUzLjUyIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMyMi41LC01NTMuNTMgMzE5LC01NDMuNTMgMzE1LjUsLTU1My41MyAzMjIuNSwtNTUzLjUzIi8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjE1MjAgLS0+CjxnIGlkPSJub2RlMTgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMTUyMDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzNDYsLTY3Ni43NSAyOTIsLTY3Ni43NSAyOTIsLTY0Mi41IDM0NiwtNjQyLjUgMzQ2LC02NzYuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzE5IiB5PSItNjUxLjI1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDY0KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1MzEyMTUyMCYjNDU7Jmd0OzE0MDI0NDk0MzU4MzY0OCAtLT4KPGcgaWQ9ImVkZ2UxNiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUzMTIxNTIwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzNjQ4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTMxOSwtNjQyLjI3QzMxOSwtNjM0LjcyIDMxOSwtNjI1LjY2IDMxOSwtNjE3LjU5Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMyMi41LC02MTcuNzcgMzE5LC02MDcuNzcgMzE1LjUsLTYxNy43NyAzMjIuNSwtNjE3Ljc3Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODQ4MDAgLS0+CjxnIGlkPSJub2RlMTkiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4NDgwMDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0ODcsLTYwNi41IDM4NywtNjA2LjUgMzg3LC01ODQuMjUgNDg3LC01ODQuMjUgNDg3LC02MDYuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MzciIHk9Ii01OTMiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkFjY3VtdWxhdGVHcmFkPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTg0ODAwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyNDQ4IC0tPgo8ZyBpZD0iZWRnZTE3IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODQ4MDAmIzQ1OyZndDsxNDAyNDQ5NDM1ODI0NDg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDE2Ljk4LC01ODMuODJDMzk4LjI1LC01NzMuOTMgMzcwLjAzLC01NTkuMDUgMzQ4LjY4LC01NDcuNzgiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzUwLjU5LC01NDQuMzEgMzQwLjEyLC01NDIuNzQgMzQ3LjMzLC01NTAuNSAzNTAuNTksLTU0NC4zMSIvPgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIxMzI4IC0tPgo8ZyBpZD0ibm9kZTIwIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjEzMjg8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGJsdWUiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDY0LC02NzYuNzUgNDEwLC02NzYuNzUgNDEwLC02NDIuNSA0NjQsLTY0Mi41IDQ2NCwtNjc2Ljc1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQzNyIgeT0iLTY1MS4yNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICg2NCk8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjEzMjgmIzQ1OyZndDsxNDAyNDQ5NDM1ODQ4MDAgLS0+CjxnIGlkPSJlZGdlMTgiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMTMyOCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDgwMDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00MzcsLTY0Mi4yN0M0MzcsLTYzNC43MiA0MzcsLTYyNS42NiA0MzcsLTYxNy41OSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0NDAuNSwtNjE3Ljc3IDQzNywtNjA3Ljc3IDQzMy41LC02MTcuNzcgNDQwLjUsLTYxNy43NyIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTg1MTg0IC0tPgo8ZyBpZD0ibm9kZTIxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODUxODQ8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTE3LC00NzIgNDE3LC00NzIgNDE3LC00NDkuNzUgNTE3LC00NDkuNzUgNTE3LC00NzIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDY3IiB5PSItNDU4LjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkFjY3VtdWxhdGVHcmFkPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTg1MTg0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyNTkyIC0tPgo8ZyBpZD0iZWRnZTE5IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODUxODQmIzQ1OyZndDsxNDAyNDQ5NDM1ODI1OTI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDYzLjQ0LC00NDkuMzJDNDYwLjU4LC00NDAuODYgNDU2LjQ5LC00MjguNzMgNDUyLjk5LC00MTguMzUiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDU2LjAyLC00MTcuMzkgNDQ5LjUxLC00MDkuMDMgNDQ5LjM5LC00MTkuNjIgNDU2LjAyLC00MTcuMzkiLz4KPC9nPgo8IS0tIDE0MDI0NDk1MzEzMDA2NCAtLT4KPGcgaWQ9Im5vZGUyMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTUzMTMwMDY0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRibHVlIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjUyOSwtNTQ4LjI1IDQxNywtNTQ4LjI1IDQxNywtNTE0IDUyOSwtNTE0IDUyOSwtNTQ4LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ3MyIgeT0iLTUyMi43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICgxMjgsIDY0LCA0LCA0KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1MzEzMDA2NCYjNDU7Jmd0OzE0MDI0NDk0MzU4NTE4NCAtLT4KPGcgaWQ9ImVkZ2UyMCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUzMTMwMDY0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTg1MTg0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTQ3MS41NSwtNTEzLjZDNDcwLjc0LC01MDQuNCA0NjkuNzIsLTQ5Mi44NSA0NjguODYsLTQ4MyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0NzIuMjYsLTQ4Mi43NiA0NjcuOSwtNDczLjEgNDY1LjI5LC00ODMuMzcgNDcyLjI2LC00ODIuNzYiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MzY5NiAtLT4KPGcgaWQ9Im5vZGUyMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNjk2PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjYzMiwtNDA3Ljc1IDUzMiwtNDA3Ljc1IDUzMiwtMzg1LjUgNjMyLC0zODUuNSA2MzIsLTQwNy43NSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1ODIiIHk9Ii0zOTQuMjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkFjY3VtdWxhdGVHcmFkPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgzNjk2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzOTg0IC0tPgo8ZyBpZD0iZWRnZTIxIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODM2OTYmIzQ1OyZndDsxNDAyNDQ5NDM1ODM5ODQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNTgyLC0zODUuMDdDNTgyLC0zNzYuNzkgNTgyLC0zNjUgNTgyLC0zNTQuNzciLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTg1LjUsLTM1NC43OCA1ODIsLTM0NC43OCA1NzguNSwtMzU0Ljc4IDU4NS41LC0zNTQuNzgiLz4KPC9nPgo8IS0tIDE0MDI0NDk1MzEzMDE2MCAtLT4KPGcgaWQ9Im5vZGUyNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTUzMTMwMTYwPC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRibHVlIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjYwOSwtNDc4IDU1NSwtNDc4IDU1NSwtNDQzLjc1IDYwOSwtNDQzLjc1IDYwOSwtNDc4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU4MiIgeT0iLTQ1Mi41IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDEyOCk8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMzAxNjAmIzQ1OyZndDsxNDAyNDQ5NDM1ODM2OTYgLS0+CjxnIGlkPSJlZGdlMjIiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk1MzEzMDE2MCYjNDU7Jmd0OzE0MDI0NDk0MzU4MzY5NjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik01ODIsLTQ0My41MkM1ODIsLTQzNS45NyA1ODIsLTQyNi45MSA1ODIsLTQxOC44NCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1ODUuNSwtNDE5LjAyIDU4MiwtNDA5LjAyIDU3OC41LC00MTkuMDIgNTg1LjUsLTQxOS4wMiIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgzMzEyIC0tPgo8ZyBpZD0ibm9kZTI1IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODMzMTI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzUwLC00MDcuNzUgNjUwLC00MDcuNzUgNjUwLC0zODUuNSA3NTAsLTM4NS41IDc1MCwtNDA3Ljc1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjcwMCIgeT0iLTM5NC4yNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODMzMTImIzQ1OyZndDsxNDAyNDQ5NDM1ODM5ODQgLS0+CjxnIGlkPSJlZGdlMjMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MzMxMiYjNDU7Jmd0OzE0MDI0NDk0MzU4Mzk4NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik02NzkuOTgsLTM4NS4wN0M2NjEuMjUsLTM3NS4xOCA2MzMuMDMsLTM2MC4zIDYxMS42OCwtMzQ5LjAzIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjYxMy41OSwtMzQ1LjU2IDYwMy4xMiwtMzQzLjk5IDYxMC4zMywtMzUxLjc1IDYxMy41OSwtMzQ1LjU2Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMzAyNTYgLS0+CjxnIGlkPSJub2RlMjYiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEzMDI1NjwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI3MjcsLTQ3OCA2NzMsLTQ3OCA2NzMsLTQ0My43NSA3MjcsLTQ0My43NSA3MjcsLTQ3OCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3MDAiIHk9Ii00NTIuNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICgxMjgpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTMwMjU2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzMzEyIC0tPgo8ZyBpZD0iZWRnZTI0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMzAyNTYmIzQ1OyZndDsxNDAyNDQ5NDM1ODMzMTI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNzAwLC00NDMuNTJDNzAwLC00MzUuOTcgNzAwLC00MjYuOTEgNzAwLC00MTguODQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzAzLjUsLTQxOS4wMiA3MDAsLTQwOS4wMiA2OTYuNSwtNDE5LjAyIDcwMy41LC00MTkuMDIiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3ODcwNCAtLT4KPGcgaWQ9Im5vZGUyNyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTc4NzA0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc3NywtMjc5LjI1IDY3NywtMjc5LjI1IDY3NywtMjU3IDc3NywtMjU3IDc3NywtMjc5LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjcyNyIgeT0iLTI2NS43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1Nzg3MDQmIzQ1OyZndDsxNDAyNDQ5NDM1ODQwMzIgLS0+CjxnIGlkPSJlZGdlMjUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU3ODcwNCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDAzMjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik03MTMuODMsLTI1Ni41NEM3MDMuODYsLTI0OC41MyA2ODkuOTUsLTIzNy4zNSA2NzguMzksLTIyOC4wNiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2ODEuMDksLTIyNC45NCA2NzEuMTEsLTIyMS40MSA2NzYuNzEsLTIzMC40IDY4MS4wOSwtMjI0Ljk0Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMzA2NDAgLS0+CjxnIGlkPSJub2RlMjgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEzMDY0MDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI3ODYsLTM0OS41IDY4MCwtMzQ5LjUgNjgwLC0zMTUuMjUgNzg2LC0zMTUuMjUgNzg2LC0zNDkuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3MzMiIHk9Ii0zMjQiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMSwgMTI4LCA0LCA0KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1MzEzMDY0MCYjNDU7Jmd0OzE0MDI0NDk0MzU3ODcwNCAtLT4KPGcgaWQ9ImVkZ2UyNiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUzMTMwNjQwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTc4NzA0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTczMS40MiwtMzE1LjAyQzczMC43LC0zMDcuNDcgNzI5LjgyLC0yOTguNDEgNzI5LjA0LC0yOTAuMzQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzMyLjQ1LC0yOTAuMTQgNzI4LC0yODAuNTIgNzI1LjQ4LC0yOTAuODEgNzMyLjQ1LC0yOTAuMTQiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MDU4NTU4NCYjNDU7Jmd0OzE0MDI0NDk0MDU4NTY4MCAtLT4KPGcgaWQ9ImVkZ2UyOSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQwNTg1NTg0JiM0NTsmZ3Q7MTQwMjQ0OTQwNTg1NjgwPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLWRhc2hhcnJheT0iMSw1IiBkPSJNNjk2LjQxLC02OS44NUM2OTAuMjgsLTYxLjgxIDY4Mi43OCwtNTEuOTYgNjc1Ljk3LC00My4wMiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2NzguMzIsLTQxLjMzIDY2OS40NywtMzUuNDkgNjcyLjc1LC00NS41NyA2NzguMzIsLTQxLjMzIi8+CjwvZz4KPC9nPgo8L3N2Zz4K)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"5DgOVOMHSMqA"},"outputs":[],"source":["class DCGAN_D(nn.Module):\n"," def __init__(self, isize, nz, nc, ndf, ngpu, n_extra_layers=0):\n"," super(DCGAN_D, self).__init__()\n"," self.ngpu = ngpu\n"," assert isize % 16 == 0, \"isize has to be a multiple of 16\"\n","\n"," main = nn.Sequential()\n"," # inputs is nc x isize x isize\n"," main.add_module('initial:{0}-{1}:conv'.format(nc, ndf),\n"," nn.Conv2d(nc, ndf, 4, 2, 1, bias=False))\n"," main.add_module('initial:{0}:relu'.format(ndf),\n"," nn.LeakyReLU(0.2, inplace=True))\n"," csize, cndf = isize / 2, ndf\n","\n"," # Extra layers\n"," for t in range(n_extra_layers):\n"," main.add_module('extra-layers-{0}:{1}:conv'.format(t, cndf),\n"," nn.Conv2d(cndf, cndf, 3, 1, 1, bias=False))\n"," main.add_module('extra-layers-{0}:{1}:batchnorm'.format(t, cndf),\n"," nn.BatchNorm2d(cndf))\n"," main.add_module('extra-layers-{0}:{1}:relu'.format(t, cndf),\n"," nn.LeakyReLU(0.2, inplace=True))\n","\n"," while csize > 4:\n"," in_feat = cndf\n"," out_feat = cndf * 2\n"," main.add_module('pyramid:{0}-{1}:conv'.format(in_feat, out_feat),\n"," nn.Conv2d(in_feat, out_feat, 4, 2, 1, bias=False))\n"," main.add_module('pyramid:{0}:batchnorm'.format(out_feat),\n"," nn.BatchNorm2d(out_feat))\n"," main.add_module('pyramid:{0}:relu'.format(out_feat),\n"," nn.LeakyReLU(0.2, inplace=True))\n"," cndf = cndf * 2\n"," csize = csize / 2\n","\n"," # state size. K x 4 x 4\n"," main.add_module('final:{0}-{1}:conv'.format(cndf, 1),\n"," nn.Conv2d(cndf, 1, 4, 1, 0, bias=False))\n"," self.main = main\n","\n","\n"," def forward(self, inputs):\n"," if isinstance(inputs.data, torch.cuda.FloatTensor) and self.ngpu > 1:\n"," output = nn.parallel.data_parallel(self.main, inputs, range(self.ngpu))\n"," else:\n"," output = self.main(inputs)\n","\n"," output = output.mean(0)\n"," return output.view(1)"]},{"cell_type":"markdown","metadata":{"id":"2X34F3vIY-6c"},"source":["### Generateur"]},{"cell_type":"markdown","metadata":{"id":"Kg60CsB74fHR"},"source":["![netG_architecture.svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDguMS4wICgyMDIzMDcwNy4wNzM5KQogLS0+CjwhLS0gUGFnZXM6IDEgLS0+Cjxzdmcgd2lkdGg9Ijg2NHB0IiBoZWlnaHQ9IjgyNHB0Igogdmlld0JveD0iMC4wMCAwLjAwIDg2NC4wMCA4MjQuMzUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgo8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMC45MzMwNDUgMC45MzMwNDUpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA4NzkuNSkiPgo8cG9seWdvbiBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSJub25lIiBwb2ludHM9Ii00LDQgLTQsLTg3OS41IDkyMiwtODc5LjUgOTIyLDQgLTQsNCIvPgo8IS0tIDE0MDI0NDk0MDY2MTA3MiAtLT4KPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDA2NjEwNzI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSIjY2FmZjcwIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijg0NiwtMzQuMjUgNzQwLC0zNC4yNSA3NDAsMCA4NDYsMCA4NDYsLTM0LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc5MyIgeT0iLTguNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMSwgMywgMzIsIDMyKTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MDAwMCAtLT4KPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODAwMDA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iODQwLC05Mi41IDc0NiwtOTIuNSA3NDYsLTcwLjI1IDg0MCwtNzAuMjUgODQwLC05Mi41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc5MyIgeT0iLTc5IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5UYW5oQmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgwMDAwJiM0NTsmZ3Q7MTQwMjQ0OTQwNjYxMDcyIC0tPgo8ZyBpZD0iZWRnZTMxIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODAwMDAmIzQ1OyZndDsxNDAyNDQ5NDA2NjEwNzI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNzkzLC02OS44MkM3OTMsLTYzLjA2IDc5MywtNTMuOTcgNzkzLC00NS4zIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc5Ni41LC00NS4zNiA3OTMsLTM1LjM2IDc4OS41LC00NS4zNiA3OTYuNSwtNDUuMzYiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MDQzMiAtLT4KPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODA0MzI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iODYxLC0xNTAuNzUgNzI1LC0xNTAuNzUgNzI1LC0xMjguNSA4NjEsLTEyOC41IDg2MSwtMTUwLjc1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc5MyIgeT0iLTEzNy4yNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+Q29udm9sdXRpb25CYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODA0MzImIzQ1OyZndDsxNDAyNDQ5NDM1ODAwMDAgLS0+CjxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgwNDMyJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgwMDAwPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTc5MywtMTI4LjA0Qzc5MywtMTIxLjIxIDc5MywtMTEyLjA3IDc5MywtMTAzLjc3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc5Ni41LC0xMDMuOTEgNzkzLC05My45MSA3ODkuNSwtMTAzLjkxIDc5Ni41LC0xMDMuOTEiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3ODMyMCAtLT4KPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzgzMjA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzc1LC0yMDkgNjgxLC0yMDkgNjgxLC0xODYuNzUgNzc1LC0xODYuNzUgNzc1LC0yMDkiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzI4IiB5PSItMTk1LjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPlJlbHVCYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1NzgzMjAmIzQ1OyZndDsxNDAyNDQ5NDM1ODA0MzIgLS0+CjxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTc4MzIwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgwNDMyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTc0MC4yMywtMTg2LjI5Qzc0OS40LC0xNzguMzYgNzYyLjE1LC0xNjcuMzIgNzcyLjgyLC0xNTguMDkiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzc0LjU2LC0xNjAuMzUgNzc5LjgzLC0xNTEuMTYgNzY5Ljk4LC0xNTUuMDUgNzc0LjU2LC0xNjAuMzUiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MDE5MiAtLT4KPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODAxOTI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iODAwLC0yNzMuMjUgNjQwLC0yNzMuMjUgNjQwLC0yNTEgODAwLC0yNTEgODAwLC0yNzMuMjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzIwIiB5PSItMjU5Ljc1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5OYXRpdmVCYXRjaE5vcm1CYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODAxOTImIzQ1OyZndDsxNDAyNDQ5NDM1NzgzMjAgLS0+CjxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgwMTkyJiM0NTsmZ3Q7MTQwMjQ0OTQzNTc4MzIwPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTcyMS4zNiwtMjUwLjU3QzcyMi40MywtMjQyLjIgNzIzLjk3LC0yMzAuMjQgNzI1LjI5LC0yMTkuOTMiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzI4Ljg2LC0yMjAuNjQgNzI2LjY2LC0yMTAuMjggNzIxLjkyLC0yMTkuNzUgNzI4Ljg2LC0yMjAuNjQiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3Njg4MCAtLT4KPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzY4ODA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNjUyLC0zMzcuNSA1MTYsLTMzNy41IDUxNiwtMzE1LjI1IDY1MiwtMzE1LjI1IDY1MiwtMzM3LjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTg0IiB5PSItMzI0IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5Db252b2x1dGlvbkJhY2t3YXJkMDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3Njg4MCYjNDU7Jmd0OzE0MDI0NDk0MzU4MDE5MiAtLT4KPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzY4ODAmIzQ1OyZndDsxNDAyNDQ5NDM1ODAxOTI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjA3LjA3LC0zMTQuODJDNjI5LjA1LC0zMDQuNzUgNjYyLjM3LC0yODkuNSA2ODcuMTIsLTI3OC4xNyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2ODguMTgsLTI4MS4wOCA2OTUuODIsLTI3My43NCA2ODUuMjcsLTI3NC43MiA2ODguMTgsLTI4MS4wOCIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyMjA4IC0tPgo8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjIwODwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1MjgsLTQwMS43NSA0MzQsLTQwMS43NSA0MzQsLTM3OS41IDUyOCwtMzc5LjUgNTI4LC00MDEuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDgxIiB5PSItMzg4LjI1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5SZWx1QmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyMjA4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc2ODgwIC0tPgo8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjIwOCYjNDU7Jmd0OzE0MDI0NDk0MzU3Njg4MDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00OTguNDcsLTM3OS4wN0M1MTQuNTMsLTM2OS4zNiA1MzguNTcsLTM1NC44MyA1NTcuMDgsLTM0My42NSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1NTguNjksLTM0Ni4xNSA1NjUuNDQsLTMzNy45OSA1NTUuMDcsLTM0MC4xNiA1NTguNjksLTM0Ni4xNSIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyMDE2IC0tPgo8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjAxNjwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1NDMsLTQ3MiAzODMsLTQ3MiAzODMsLTQ0OS43NSA1NDMsLTQ0OS43NSA1NDMsLTQ3MiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NjMiIHk9Ii00NTguNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+TmF0aXZlQmF0Y2hOb3JtQmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyMDE2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyMjA4IC0tPgo8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjAxNiYjNDU7Jmd0OzE0MDI0NDk0MzU4MjIwODwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00NjUuNzMsLTQ0OS41MUM0NjguMzIsLTQzOS42OSA0NzIuMjksLTQyNC42NSA0NzUuNTMsLTQxMi4zNyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0NzkuMDcsLTQxMy42NSA0NzguMjQsLTQwMy4wOSA0NzIuMzEsLTQxMS44NyA0NzkuMDcsLTQxMy42NSIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc3ODg4IC0tPgo8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU3Nzg4ODwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzOTUsLTUzNi4yNSAyNTksLTUzNi4yNSAyNTksLTUxNCAzOTUsLTUxNCAzOTUsLTUzNi4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjciIHk9Ii01MjIuNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkNvbnZvbHV0aW9uQmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc3ODg4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyMDE2IC0tPgo8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU3Nzg4OCYjNDU7Jmd0OzE0MDI0NDk0MzU4MjAxNjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zNTAuMDcsLTUxMy41N0MzNzIuMDUsLTUwMy41IDQwNS4zNywtNDg4LjI1IDQzMC4xMiwtNDc2LjkyIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQzMS4xOCwtNDc5LjgzIDQzOC44MiwtNDcyLjQ5IDQyOC4yNywtNDczLjQ3IDQzMS4xOCwtNDc5LjgzIi8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODMwMjQgLS0+CjxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MzAyNDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyNzAsLTYwMC41IDE3NiwtNjAwLjUgMTc2LC01NzguMjUgMjcwLC01NzguMjUgMjcwLC02MDAuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjMiIHk9Ii01ODciIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPlJlbHVCYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODMwMjQmIzQ1OyZndDsxNDAyNDQ5NDM1Nzc4ODggLS0+CjxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzMDI0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc3ODg4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTI0MC42NCwtNTc3LjgyQzI1Ni45MywtNTY4LjA3IDI4MS4zNSwtNTUzLjQ1IDMwMC4wNywtNTQyLjI0Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMwMS40OSwtNTQ0Ljg4IDMwOC4yNywtNTM2Ljc0IDI5Ny44OSwtNTM4Ljg3IDMwMS40OSwtNTQ0Ljg4Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1Nzc3NDQgLS0+CjxnIGlkPSJub2RlMTEiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU3Nzc0NDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyODQsLTY3MC43NSAxMjQsLTY3MC43NSAxMjQsLTY0OC41IDI4NCwtNjQ4LjUgMjg0LC02NzAuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjA0IiB5PSItNjU3LjI1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5OYXRpdmVCYXRjaE5vcm1CYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1Nzc3NDQmIzQ1OyZndDsxNDAyNDQ5NDM1ODMwMjQgLS0+CjxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTc3NzQ0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzMDI0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIwNi44OSwtNjQ4LjI2QzIwOS42MiwtNjM4LjQ0IDIxMy44MSwtNjIzLjQgMjE3LjIzLC02MTEuMTIiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjIwLjc4LC02MTIuNDEgMjIwLjA5LC02MDEuODQgMjE0LjAzLC02MTAuNTMgMjIwLjc4LC02MTIuNDEiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3NzAyNCAtLT4KPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTc3MDI0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjEzNiwtNzM1IDAsLTczNSAwLC03MTIuNzUgMTM2LC03MTIuNzUgMTM2LC03MzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjgiIHk9Ii03MjEuNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+Q29udm9sdXRpb25CYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1NzcwMjQmIzQ1OyZndDsxNDAyNDQ5NDM1Nzc3NDQgLS0+CjxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU3NzAyNCYjNDU7Jmd0OzE0MDI0NDk0MzU3Nzc0NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik05MS4wNywtNzEyLjMyQzExMy4wNSwtNzAyLjI1IDE0Ni4zNywtNjg3IDE3MS4xMiwtNjc1LjY3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE3Mi4xOCwtNjc4LjU4IDE3OS44MiwtNjcxLjI0IDE2OS4yNywtNjcyLjIyIDE3Mi4xOCwtNjc4LjU4Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM2MDI5NzYgLS0+CjxnIGlkPSJub2RlMTMiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzYwMjk3NjwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxMTgsLTc5OS4yNSAxOCwtNzk5LjI1IDE4LC03NzcgMTE4LC03NzcgMTE4LC03OTkuMjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjgiIHk9Ii03ODUuNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkFjY3VtdWxhdGVHcmFkPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNjAyOTc2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc3MDI0IC0tPgo8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM2MDI5NzYmIzQ1OyZndDsxNDAyNDQ5NDM1NzcwMjQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjgsLTc3Ni41N0M2OCwtNzY4LjI5IDY4LC03NTYuNSA2OCwtNzQ2LjI3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjcxLjUsLTc0Ni4yOCA2OCwtNzM2LjI4IDY0LjUsLTc0Ni4yOCA3MS41LC03NDYuMjgiLz4KPC9nPgo8IS0tIDE0MDI0NDk1MjgzOTA4OCAtLT4KPGcgaWQ9Im5vZGUxNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTUyODM5MDg4PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRibHVlIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjEyNywtODc1LjUgOSwtODc1LjUgOSwtODQxLjI1IDEyNywtODQxLjI1IDEyNywtODc1LjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjgiIHk9Ii04NTAiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMTAwLCAxMjgsIDQsIDQpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUyODM5MDg4JiM0NTsmZ3Q7MTQwMjQ0OTQzNjAyOTc2IC0tPgo8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTI4MzkwODgmIzQ1OyZndDsxNDAyNDQ5NDM2MDI5NzY8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjgsLTg0MC44NUM2OCwtODMxLjY1IDY4LC04MjAuMSA2OCwtODEwLjI1Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjcxLjUsLTgxMC4zNSA2OCwtODAwLjM1IDY0LjUsLTgxMC4zNSA3MS41LC04MTAuMzUiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDEyOCAtLT4KPGcgaWQ9Im5vZGUxNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTg0MTI4PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjI1NCwtNzM1IDE1NCwtNzM1IDE1NCwtNzEyLjc1IDI1NCwtNzEyLjc1IDI1NCwtNzM1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNCIgeT0iLTcyMS41IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5BY2N1bXVsYXRlR3JhZDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDEyOCYjNDU7Jmd0OzE0MDI0NDk0MzU3Nzc0NCAtLT4KPGcgaWQ9ImVkZ2UxMyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTg0MTI4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc3NzQ0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIwNCwtNzEyLjMyQzIwNCwtNzA0LjA0IDIwNCwtNjkyLjI1IDIwNCwtNjgyLjAyIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjIwNy41LC02ODIuMDMgMjA0LC02NzIuMDMgMjAwLjUsLTY4Mi4wMyAyMDcuNSwtNjgyLjAzIi8+CjwvZz4KPCEtLSAxNDAyNDQ5NTI4NDE5NjggLS0+CjxnIGlkPSJub2RlMTYiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1Mjg0MTk2ODwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyMzEsLTgwNS4yNSAxNzcsLTgwNS4yNSAxNzcsLTc3MSAyMzEsLTc3MSAyMzEsLTgwNS4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDQiIHk9Ii03NzkuNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMTI4KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1Mjg0MTk2OCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDEyOCAtLT4KPGcgaWQ9ImVkZ2UxNCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUyODQxOTY4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTg0MTI4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIwNCwtNzcwLjc3QzIwNCwtNzYzLjIyIDIwNCwtNzU0LjE2IDIwNCwtNzQ2LjA5Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjIwNy41LC03NDYuMjcgMjA0LC03MzYuMjcgMjAwLjUsLTc0Ni4yNyAyMDcuNSwtNzQ2LjI3Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM2MDE5MjAgLS0+CjxnIGlkPSJub2RlMTciIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzYwMTkyMDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzNzIsLTczNSAyNzIsLTczNSAyNzIsLTcxMi43NSAzNzIsLTcxMi43NSAzNzIsLTczNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjIiIHk9Ii03MjEuNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM2MDE5MjAmIzQ1OyZndDsxNDAyNDQ5NDM1Nzc3NDQgLS0+CjxnIGlkPSJlZGdlMTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzYwMTkyMCYjNDU7Jmd0OzE0MDI0NDk0MzU3Nzc0NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zMDEuOTgsLTcxMi4zMkMyODMuMjUsLTcwMi40MyAyNTUuMDMsLTY4Ny41NSAyMzMuNjgsLTY3Ni4yOCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyMzUuNTksLTY3Mi44MSAyMjUuMTIsLTY3MS4yNCAyMzIuMzMsLTY3OSAyMzUuNTksLTY3Mi44MSIvPgo8L2c+CjwhLS0gMTQwMjQ0OTUyODM5MjgwIC0tPgo8ZyBpZD0ibm9kZTE4IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NTI4MzkyODA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGJsdWUiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzQ5LC04MDUuMjUgMjk1LC04MDUuMjUgMjk1LC03NzEgMzQ5LC03NzEgMzQ5LC04MDUuMjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzIyIiB5PSItNzc5Ljc1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDEyOCk8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NTI4MzkyODAmIzQ1OyZndDsxNDAyNDQ5NDM2MDE5MjAgLS0+CjxnIGlkPSJlZGdlMTYiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk1MjgzOTI4MCYjNDU7Jmd0OzE0MDI0NDk0MzYwMTkyMDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zMjIsLTc3MC43N0MzMjIsLTc2My4yMiAzMjIsLTc1NC4xNiAzMjIsLTc0Ni4wOSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzMjUuNSwtNzQ2LjI3IDMyMiwtNzM2LjI3IDMxOC41LC03NDYuMjcgMzI1LjUsLTc0Ni4yNyIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyNDk2IC0tPgo8ZyBpZD0ibm9kZTE5IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODI0OTY8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzk4LC02MDAuNSAyOTgsLTYwMC41IDI5OCwtNTc4LjI1IDM5OCwtNTc4LjI1IDM5OCwtNjAwLjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzQ4IiB5PSItNTg3IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5BY2N1bXVsYXRlR3JhZDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MjQ5NiYjNDU7Jmd0OzE0MDI0NDk0MzU3Nzg4OCAtLT4KPGcgaWQ9ImVkZ2UxNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgyNDk2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc3ODg4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTM0NC40NCwtNTc3LjgyQzM0MS41OCwtNTY5LjM2IDMzNy40OSwtNTU3LjIzIDMzMy45OSwtNTQ2Ljg1Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMzNy4wMiwtNTQ1Ljg5IDMzMC41MSwtNTM3LjUzIDMzMC4zOSwtNTQ4LjEyIDMzNy4wMiwtNTQ1Ljg5Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjM1MzYgLS0+CjxnIGlkPSJub2RlMjAiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMzUzNjwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0MTQsLTY3Ni43NSAzMDIsLTY3Ni43NSAzMDIsLTY0Mi41IDQxNCwtNjQyLjUgNDE0LC02NzYuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU4IiB5PSItNjUxLjI1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDEyOCwgNjQsIDQsIDQpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIzNTM2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyNDk2IC0tPgo8ZyBpZD0iZWRnZTE4IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjM1MzYmIzQ1OyZndDsxNDAyNDQ5NDM1ODI0OTY8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzU1LjU4LC02NDIuMUMzNTQuMjIsLTYzMi44IDM1Mi41LC02MjEuMSAzNTEuMDUsLTYxMS4xOCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzNTQuNDEsLTYxMC45OSAzNDkuNSwtNjAxLjYgMzQ3LjQ5LC02MTIgMzU0LjQxLC02MTAuOTkiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MjgzMiAtLT4KPGcgaWQ9Im5vZGUyMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgyODMyPC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjUxMywtNTM2LjI1IDQxMywtNTM2LjI1IDQxMywtNTE0IDUxMywtNTE0IDUxMywtNTM2LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ2MyIgeT0iLTUyMi43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODI4MzImIzQ1OyZndDsxNDAyNDQ5NDM1ODIwMTYgLS0+CjxnIGlkPSJlZGdlMTkiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjgzMiYjNDU7Jmd0OzE0MDI0NDk0MzU4MjAxNjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00NjMsLTUxMy41N0M0NjMsLTUwNS4yOSA0NjMsLTQ5My41IDQ2MywtNDgzLjI3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQ2Ni41LC00ODMuMjggNDYzLC00NzMuMjggNDU5LjUsLTQ4My4yOCA0NjYuNSwtNDgzLjI4Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjM0NDAgLS0+CjxnIGlkPSJub2RlMjIiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMzQ0MDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0OTAsLTYwNi41IDQzNiwtNjA2LjUgNDM2LC01NzIuMjUgNDkwLC01NzIuMjUgNDkwLC02MDYuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NjMiIHk9Ii01ODEiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoNjQpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIzNDQwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyODMyIC0tPgo8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjM0NDAmIzQ1OyZndDsxNDAyNDQ5NDM1ODI4MzI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDYzLC01NzIuMDJDNDYzLC01NjQuNDcgNDYzLC01NTUuNDEgNDYzLC01NDcuMzQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDY2LjUsLTU0Ny41MiA0NjMsLTUzNy41MiA0NTkuNSwtNTQ3LjUyIDQ2Ni41LC01NDcuNTIiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MjkyOCAtLT4KPGcgaWQ9Im5vZGUyMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgyOTI4PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjYzMSwtNTM2LjI1IDUzMSwtNTM2LjI1IDUzMSwtNTE0IDYzMSwtNTE0IDYzMSwtNTM2LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU4MSIgeT0iLTUyMi43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODI5MjgmIzQ1OyZndDsxNDAyNDQ5NDM1ODIwMTYgLS0+CjxnIGlkPSJlZGdlMjEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjkyOCYjNDU7Jmd0OzE0MDI0NDk0MzU4MjAxNjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik01NjAuOTgsLTUxMy41N0M1NDIuMjUsLTUwMy42OCA1MTQuMDMsLTQ4OC44IDQ5Mi42OCwtNDc3LjUzIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQ5NC41OSwtNDc0LjA2IDQ4NC4xMiwtNDcyLjQ5IDQ5MS4zMywtNDgwLjI1IDQ5NC41OSwtNDc0LjA2Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjMzNDQgLS0+CjxnIGlkPSJub2RlMjQiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMzM0NDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2MDgsLTYwNi41IDU1NCwtNjA2LjUgNTU0LC01NzIuMjUgNjA4LC01NzIuMjUgNjA4LC02MDYuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1ODEiIHk9Ii01ODEiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoNjQpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIzMzQ0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyOTI4IC0tPgo8ZyBpZD0iZWRnZTIyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjMzNDQmIzQ1OyZndDsxNDAyNDQ5NDM1ODI5Mjg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNTgxLC01NzIuMDJDNTgxLC01NjQuNDcgNTgxLC01NTUuNDEgNTgxLC01NDcuMzQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTg0LjUsLTU0Ny41MiA1ODEsLTUzNy41MiA1NzcuNSwtNTQ3LjUyIDU4NC41LC01NDcuNTIiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3ODQxNiAtLT4KPGcgaWQ9Im5vZGUyNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTc4NDE2PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjY1NSwtNDAxLjc1IDU1NSwtNDAxLjc1IDU1NSwtMzc5LjUgNjU1LC0zNzkuNSA2NTUsLTQwMS43NSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2MDUiIHk9Ii0zODguMjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkFjY3VtdWxhdGVHcmFkPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc4NDE2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc2ODgwIC0tPgo8ZyBpZD0iZWRnZTIzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1Nzg0MTYmIzQ1OyZndDsxNDAyNDQ5NDM1NzY4ODA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjAxLjQ0LC0zNzkuMDdDNTk4LjU4LC0zNzAuNjEgNTk0LjQ5LC0zNTguNDggNTkwLjk5LC0zNDguMSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1OTQuMDIsLTM0Ny4xNCA1ODcuNTEsLTMzOC43OCA1ODcuMzksLTM0OS4zNyA1OTQuMDIsLTM0Ny4xNCIvPgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIyOTYwIC0tPgo8ZyBpZD0ibm9kZTI2IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjI5NjA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGJsdWUiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNjY3LC00NzggNTYxLC00NzggNTYxLC00NDMuNzUgNjY3LC00NDMuNzUgNjY3LC00NzgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjE0IiB5PSItNDUyLjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoNjQsIDMyLCA0LCA0KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1MzEyMjk2MCYjNDU7Jmd0OzE0MDI0NDk0MzU3ODQxNiAtLT4KPGcgaWQ9ImVkZ2UyNCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUzMTIyOTYwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTc4NDE2PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTYxMS44MiwtNDQzLjM1QzYxMC42MSwtNDM0LjE1IDYwOS4wOSwtNDIyLjYgNjA3Ljc5LC00MTIuNzUiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNjExLjEzLC00MTIuMzEgNjA2LjM1LC00MDIuODUgNjA0LjE5LC00MTMuMjIgNjExLjEzLC00MTIuMzEiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3NjMwNCAtLT4KPGcgaWQ9Im5vZGUyNyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTc2MzA0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc3MCwtMzM3LjUgNjcwLC0zMzcuNSA2NzAsLTMxNS4yNSA3NzAsLTMxNS4yNSA3NzAsLTMzNy41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjcyMCIgeT0iLTMyNCIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1NzYzMDQmIzQ1OyZndDsxNDAyNDQ5NDM1ODAxOTIgLS0+CjxnIGlkPSJlZGdlMjUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU3NjMwNCYjNDU7Jmd0OzE0MDI0NDk0MzU4MDE5MjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik03MjAsLTMxNC44MkM3MjAsLTMwNi41NCA3MjAsLTI5NC43NSA3MjAsLTI4NC41MiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI3MjMuNSwtMjg0LjUzIDcyMCwtMjc0LjUzIDcxNi41LC0yODQuNTMgNzIzLjUsLTI4NC41MyIvPgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIyODY0IC0tPgo8ZyBpZD0ibm9kZTI4IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjI4NjQ8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGJsdWUiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzQ3LC00MDcuNzUgNjkzLC00MDcuNzUgNjkzLC0zNzMuNSA3NDcsLTM3My41IDc0NywtNDA3Ljc1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjcyMCIgeT0iLTM4Mi4yNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICgzMik8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjI4NjQmIzQ1OyZndDsxNDAyNDQ5NDM1NzYzMDQgLS0+CjxnIGlkPSJlZGdlMjYiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMjg2NCYjNDU7Jmd0OzE0MDI0NDk0MzU3NjMwNDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik03MjAsLTM3My4yN0M3MjAsLTM2NS43MiA3MjAsLTM1Ni42NiA3MjAsLTM0OC41OSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI3MjMuNSwtMzQ4Ljc3IDcyMCwtMzM4Ljc3IDcxNi41LC0zNDguNzcgNzIzLjUsLTM0OC43NyIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc1ODcyIC0tPgo8ZyBpZD0ibm9kZTI5IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzU4NzI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iODg4LC0zMzcuNSA3ODgsLTMzNy41IDc4OCwtMzE1LjI1IDg4OCwtMzE1LjI1IDg4OCwtMzM3LjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iODM4IiB5PSItMzI0IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5BY2N1bXVsYXRlR3JhZDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3NTg3MiYjNDU7Jmd0OzE0MDI0NDk0MzU4MDE5MiAtLT4KPGcgaWQ9ImVkZ2UyNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTc1ODcyJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgwMTkyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTgxNy45OCwtMzE0LjgyQzc5OS4yNSwtMzA0LjkzIDc3MS4wMywtMjkwLjA1IDc0OS42OCwtMjc4Ljc4Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc1MS41OSwtMjc1LjMxIDc0MS4xMiwtMjczLjc0IDc0OC4zMywtMjgxLjUgNzUxLjU5LC0yNzUuMzEiLz4KPC9nPgo8IS0tIDE0MDI0NDk1MzEyMjc2OCAtLT4KPGcgaWQ9Im5vZGUzMCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTUzMTIyNzY4PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRibHVlIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijg2NSwtNDA3Ljc1IDgxMSwtNDA3Ljc1IDgxMSwtMzczLjUgODY1LC0zNzMuNSA4NjUsLTQwNy43NSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4MzgiIHk9Ii0zODIuMjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMzIpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIyNzY4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc1ODcyIC0tPgo8ZyBpZD0iZWRnZTI4IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjI3NjgmIzQ1OyZndDsxNDAyNDQ5NDM1NzU4NzI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNODM4LC0zNzMuMjdDODM4LC0zNjUuNzIgODM4LC0zNTYuNjYgODM4LC0zNDguNTkiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iODQxLjUsLTM0OC43NyA4MzgsLTMzOC43NyA4MzQuNSwtMzQ4Ljc3IDg0MS41LC0zNDguNzciLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDk0NCAtLT4KPGcgaWQ9Im5vZGUzMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTg0OTQ0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjkwOSwtMjA5IDgwOSwtMjA5IDgwOSwtMTg2Ljc1IDkwOSwtMTg2Ljc1IDkwOSwtMjA5Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijg1OSIgeT0iLTE5NS41IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5BY2N1bXVsYXRlR3JhZDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDk0NCYjNDU7Jmd0OzE0MDI0NDk0MzU4MDQzMiAtLT4KPGcgaWQ9ImVkZ2UyOSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTg0OTQ0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgwNDMyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTg0Ni41OSwtMTg2LjI5QzgzNy4yOCwtMTc4LjM2IDgyNC4zMiwtMTY3LjMyIDgxMy40OSwtMTU4LjA5Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjgxNi4yNCwtMTU0Ljk4IDgwNi4zNiwtMTUxLjE2IDgxMS43LC0xNjAuMzEgODE2LjI0LC0xNTQuOTgiLz4KPC9nPgo8IS0tIDE0MDI0NDk1MzEyMTQyNCAtLT4KPGcgaWQ9Im5vZGUzMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTUzMTIxNDI0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRibHVlIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjkxOCwtMjc5LjI1IDgxOCwtMjc5LjI1IDgxOCwtMjQ1IDkxOCwtMjQ1IDkxOCwtMjc5LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijg2OCIgeT0iLTI1My43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICgzMiwgMywgNCwgNCk8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjE0MjQmIzQ1OyZndDsxNDAyNDQ5NDM1ODQ5NDQgLS0+CjxnIGlkPSJlZGdlMzAiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMTQyNCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDk0NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik04NjUuNjQsLTI0NC43N0M4NjQuNTQsLTIzNy4yMiA4NjMuMjMsLTIyOC4xNiA4NjIuMDcsLTIyMC4wOSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI4NjUuNCwtMjE5LjY2IDg2MC41LC0yMTAuMjcgODU4LjQ3LC0yMjAuNjcgODY1LjQsLTIxOS42NiIvPgo8L2c+CjwvZz4KPC9zdmc+Cg==)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"CiqFCjoAYtBq"},"outputs":[],"source":["class DCGAN_G(nn.Module):\n"," def __init__(self, isize, nz, nc, ngf, ngpu, n_extra_layers=0):\n"," super(DCGAN_G, self).__init__()\n"," self.ngpu = ngpu\n"," assert isize % 16 == 0, \"isize has to be a multiple of 16\"\n","\n"," cngf, tisize = ngf//2, 4\n"," while tisize != isize:\n"," cngf = cngf * 2\n"," tisize = tisize * 2\n","\n"," main = nn.Sequential()\n"," # inputs is Z, going into a convolution\n"," main.add_module('initial:{0}-{1}:convt'.format(nz, cngf),\n"," nn.ConvTranspose2d(nz, cngf, 4, 1, 0, bias=False))\n"," main.add_module('initial:{0}:batchnorm'.format(cngf),\n"," nn.BatchNorm2d(cngf))\n"," main.add_module('initial:{0}:relu'.format(cngf),\n"," nn.ReLU(True))\n","\n"," csize, cndf = 4, cngf\n"," while csize < isize//2:\n"," main.add_module('pyramid:{0}-{1}:convt'.format(cngf, cngf//2),\n"," nn.ConvTranspose2d(cngf, cngf//2, 4, 2, 1, bias=False))\n"," main.add_module('pyramid:{0}:batchnorm'.format(cngf//2),\n"," nn.BatchNorm2d(cngf//2))\n"," main.add_module('pyramid:{0}:relu'.format(cngf//2),\n"," nn.ReLU(True))\n"," cngf = cngf // 2\n"," csize = csize * 2\n","\n"," # Extra layers\n"," for t in range(n_extra_layers):\n"," main.add_module('extra-layers-{0}:{1}:conv'.format(t, cngf),\n"," nn.Conv2d(cngf, cngf, 3, 1, 1, bias=False))\n"," main.add_module('extra-layers-{0}:{1}:batchnorm'.format(t, cngf),\n"," nn.BatchNorm2d(cngf))\n"," main.add_module('extra-layers-{0}:{1}:relu'.format(t, cngf),\n"," nn.ReLU(True))\n","\n"," main.add_module('final:{0}-{1}:convt'.format(cngf, nc),\n"," nn.ConvTranspose2d(cngf, nc, 4, 2, 1, bias=False))\n"," main.add_module('final:{0}:tanh'.format(nc),\n"," nn.Tanh())\n"," self.main = main\n","\n"," def forward(self, inputs):\n"," if isinstance(inputs.data, torch.cuda.FloatTensor) and self.ngpu > 1:\n"," output = nn.parallel.data_parallel(self.main, inputs, range(self.ngpu))\n"," else:\n"," output = self.main(inputs)\n"," return output"]},{"cell_type":"markdown","metadata":{"id":"zyRrm3ClUMX1"},"source":["## Entrainement\n","\n","Voici un exemple de code qui permettrait l'entraînement de notre modèle et la configuration de celui-ci."]},{"cell_type":"markdown","metadata":{"id":"PhynHzMXXEyP"},"source":["### Options pour l'exécution"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"zkk11X5zSQLK"},"outputs":[],"source":["# Path to dataset\n","opt_dataroot = 'data/faces'\n","# Number of data loading workers\n","opt_workers = 2\n","# inputs batch size\n","opt_batchSize = 64\n","# The height / width of the inputs image to network\n","opt_imageSize = 32\n","# inputs image channels\n","nc = 3\n","# Size of the latent z vector\n","nz = 100\n","# Size of feature maps in generator\n","ngf = 32\n","# Size of feature maps in discriminator\n","ndf = 32\n","# Number of epochs to train for\n","opt_niter = 25\n","# Learning rate for Discriminator\n","opt_lrD = 0.00005\n","# Learning rate for Generator\n","opt_lrG = 0.00005\n","# beta1 for adam.\n","opt_beta1 = 0.5\n","# Lower value clamp for Discriminator weights\n","opt_clamp_lower = -0.01\n","# Upper value clamp for Discriminator weights\n","opt_clamp_upper = 0.01\n","# Number of D iters per each G iter\n","opt_Diters = 5\n","# Where to store samples and models\n","opt_experiment = 'samples'"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"LVYpQv-_tFsK"},"outputs":[],"source":["# Use CUDA if a GPU is available\n","opt_cuda = False\n","\n","opt_cuda_resp = input(\"Use cuda? (y/n)\\n{} by default\\n\".format(opt_cuda))\n","\n","# Use CUDA if a GPU is available\n","opt_cuda = True if opt_cuda_resp == 'y' else opt_cuda\n","# Number of GPUs to use for running the model if CUDA is enabled\n","ngpu = 1"]},{"cell_type":"markdown","metadata":{"id":"Ggb5i2jsX1jp"},"source":["### Configuration du modèle"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"ENkqSYs2Tbj9"},"outputs":[],"source":["os.system('mkdir {0}'.format(opt_experiment))\n","\n","opt_manualSeed = random.randint(1, 10000) # fix seed\n","print(\"Random Seed: \", opt_manualSeed)\n","random.seed(opt_manualSeed)\n","torch.manual_seed(opt_manualSeed)\n","\n","cudnn.benchmark = True\n","\n","# folder dataset\n","dataset = dset.ImageFolder(root=opt_dataroot,\n"," transform=transforms.Compose([\n"," transforms.Resize(opt_imageSize),\n"," transforms.CenterCrop(opt_imageSize),\n"," transforms.ToTensor(),\n"," transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),\n"," ]))\n","assert dataset\n","dataloader = torch.utils.data.DataLoader(dataset, batch_size=opt_batchSize,\n"," shuffle=True, num_workers=int(opt_workers))\n","\n","# custom weights initialization called on netG and netD\n","def weights_init(m):\n"," classname = m.__class__.__name__\n"," if classname.find('Conv') != -1:\n"," m.weight.data.normal_(0.0, 0.02)\n"," elif classname.find('BatchNorm') != -1:\n"," m.weight.data.normal_(1.0, 0.02)\n"," m.bias.data.fill_(0)\n","\n","netG = DCGAN_G(opt_imageSize, nz, nc, ngf, ngpu)\n","\n","netG.apply(weights_init)\n","print(netG)\n","\n","netD = DCGAN_D(opt_imageSize, nz, nc, ndf, ngpu)\n","netD.apply(weights_init)\n","\n","print(netD)\n","\n","inputs = torch.FloatTensor(opt_batchSize, 3, opt_imageSize, opt_imageSize)\n","noise = torch.FloatTensor(opt_batchSize, nz, 1, 1)\n","fixed_noise = torch.FloatTensor(opt_batchSize, nz, 1, 1).normal_(0, 1)\n","one = torch.FloatTensor([1])\n","mone = one * -1\n","\n","if opt_cuda:\n"," netD.cuda()\n"," netG.cuda()\n"," inputs = inputs.cuda()\n"," one, mone = one.cuda(), mone.cuda()\n"," noise, fixed_noise = noise.cuda(), fixed_noise.cuda()\n","\n","# setup optimizer\n","optimizerD = optim.RMSprop(netD.parameters(), lr = opt_lrD)\n","optimizerG = optim.RMSprop(netG.parameters(), lr = opt_lrG)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"W96oVYCkjzPR"},"outputs":[],"source":["netD_graph = make_dot(netD(Variable(torch.randn(1, 3, 32, 32))))\n","netD_graph.render(\"netD_architecture\", format=\"png\")\n","\n","netG_graph = make_dot(netG(Variable(torch.randn(1, 100, 1, 1))))\n","netG_graph.render(\"netG_architecture\", format=\"png\")"]},{"cell_type":"markdown","metadata":{"id":"YkMM0kSeX6cH"},"source":["### Entrainement du modèle"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Pf06223hTrpJ"},"outputs":[],"source":["gen_iterations = 0\n","for epoch in range(opt_niter):\n"," data_iter = iter(dataloader)\n"," i = 0\n"," while i < len(dataloader):\n"," ############################\n"," # (1) Update D network\n"," ###########################\n"," for p in netD.parameters(): # reset requires_grad\n"," p.requires_grad = True # they are set to False below in netG update\n","\n"," # train the discriminator Diters times\n"," if gen_iterations < 25 or gen_iterations % 500 == 0:\n"," Diters = 100\n"," else:\n"," Diters = opt_Diters\n"," j = 0\n"," while j < Diters and i < len(dataloader):\n"," j += 1\n","\n"," # clamp parameters to a cube\n"," for p in netD.parameters():\n"," p.data.clamp_(opt_clamp_lower, opt_clamp_upper)\n","\n"," data = next(data_iter)\n"," i += 1\n","\n"," # train with real\n"," real_cpu, _ = data\n"," netD.zero_grad()\n"," batch_size = real_cpu.size(0)\n","\n"," if opt_cuda:\n"," real_cpu = real_cpu.cuda()\n"," inputs.resize_as_(real_cpu).copy_(real_cpu)\n"," inputsv = Variable(inputs)\n","\n"," errD_real = netD(inputsv)\n"," errD_real.backward(one)\n","\n"," # train with fake\n"," noise.resize_(opt_batchSize, nz, 1, 1).normal_(0, 1)\n"," noisev = Variable(noise, volatile = True) # totally freeze netG\n"," fake = Variable(netG(noisev).data)\n"," inputsv = fake\n"," errD_fake = netD(inputsv)\n"," errD_fake.backward(mone)\n"," errD = errD_real - errD_fake\n"," optimizerD.step()\n","\n"," ############################\n"," # (2) Update G network\n"," ###########################\n"," for p in netD.parameters():\n"," p.requires_grad = False # to avoid computation\n"," netG.zero_grad()\n"," # in case our last batch was the tail batch of the dataloader,\n"," # make sure we feed a full batch of noise\n"," noise.resize_(opt_batchSize, nz, 1, 1).normal_(0, 1)\n"," noisev = Variable(noise)\n"," fake = netG(noisev)\n"," errG = netD(fake)\n"," errG.backward(one)\n"," optimizerG.step()\n"," gen_iterations += 1\n","\n"," print('[%d/%d][%d/%d][%d] Loss_D: %f Loss_G: %f Loss_D_real: %f Loss_D_fake %f'\n"," % (epoch, opt_niter, i, len(dataloader), gen_iterations,\n"," errD.data[0], errG.data[0], errD_real.data[0], errD_fake.data[0]))\n"," if gen_iterations % 500 == 0:\n"," real_cpu = real_cpu.mul(0.5).add(0.5)\n"," vutils.save_image(real_cpu, '{0}/real_samples.png'.format(opt_experiment))\n"," fake = netG(Variable(fixed_noise, volatile=True))\n"," fake.data = fake.data.mul(0.5).add(0.5)\n"," vutils.save_image(fake.data, '{0}/fake_samples_{1}.png'.format(opt_experiment, gen_iterations))\n","\n"," # do checkpointing\n"," torch.save(netG.state_dict(), '{0}/netG_epoch_{1}.pth'.format(opt_experiment, epoch))\n"," torch.save(netD.state_dict(), '{0}/netD_epoch_{1}.pth'.format(opt_experiment, epoch))"]},{"cell_type":"markdown","metadata":{"id":"NfPfYpS-T5DN"},"source":["## Generation\n","\n","Voici la section de code correspondant à la génération de nos images, plus tard exploitées."]},{"cell_type":"markdown","metadata":{"id":"-B6fUl2zW_Ak"},"source":["### Options pour l'exécution"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"3r_w9O_zUERu"},"outputs":[],"source":["# Number of images to generate\n","opt_nimages = 100\n","# Path to output directory\n","opt_output_dir = 'data/generated'\n","# Path to generator weights .pth file\n","opt_weights = 'samples/netG_epoch_2384.pth'"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"1smXNRDUw-5k"},"outputs":[],"source":["opt_nimages_resp = input(\"How many images to generate?\\n{} by default\\n\".format(opt_nimages))\n","opt_output_dir_resp = input(\"Where to store generated images?\\n{} by default\\n\".format(opt_output_dir))\n","\n","# Number of images to generate\n","opt_nimages = int(opt_nimages_resp) if opt_nimages_resp != '' else opt_nimages\n","# Path to output directory\n","opt_output_dir = opt_output_dir_resp if opt_output_dir_resp != '' else opt_output_dir"]},{"cell_type":"markdown","metadata":{"id":"XWGZgsuyYDet"},"source":["### Configuration du modèle"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"KLNgMfV_T7Ou"},"outputs":[],"source":["netG = DCGAN_G(opt_imageSize, nz, nc, ngf, ngpu)\n","\n","# load weights\n","if opt_cuda:\n"," netG.load_state_dict(torch.load(opt_weights, map_location=torch.device('cuda')))\n","else:\n"," netG.load_state_dict(torch.load(opt_weights, map_location=torch.device('cpu')))\n","\n","# initialize noise\n","fixed_noise = torch.FloatTensor(opt_nimages, nz, 1, 1).normal_(0, 1)\n","\n","if opt_cuda:\n"," netG.cuda()\n"," fixed_noise = fixed_noise.cuda()\n","\n","fake = netG(fixed_noise)\n","fake.data = fake.data.mul(0.5).add(0.5)\n","\n","if not os.path.exists(opt_output_dir):\n"," os.makedirs(opt_output_dir)"]},{"cell_type":"markdown","metadata":{"id":"rPU04cGsYFVz"},"source":["### Génération des images"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Jg82PIsjUH55"},"outputs":[],"source":["for i in range(opt_nimages):\n"," vutils.save_image(fake.data[i, ...].reshape((1, nc, opt_imageSize, opt_imageSize)), os.path.join(opt_output_dir, \"generated_%02d.png\"%i))"]},{"cell_type":"markdown","metadata":{"id":"ePeCi4PZJ5Ar"},"source":["## Résultats\n","L'entrainement a été réalisé à partir d'un ordinateur équipé d'un GPU accessible via internet ssh et un VPN configuré.\n","\n","Voici la commande utilisée pour effectuer la formation :\n","```shell\n","python main.py --dataset folder --dataroot data/faces --batchSize 2048 --niter 5000 --ngf 32 --ndf 32 --imageSize 32 --cuda\n","```\n","\n","et la génération :\n","```shell\n","python generate.py --config samples/generator_config.json --weight samples/netG_epoch_2384.pth --output_dir data/generated --nimages 100 --cuda\n","```\n","\n","Les fichiers Python sont ceux de l'article original. Ce sont les fichiers qui sont réutilisés et grandement simplifiés dans ce Jupyter Notebook.\n","\n","Les poids et les fichiers de configuration peuvent être téléchargés sur :\n","https://github.com/paul-corbalan/wasserstein-gan/tree/develop/samples\n","\n","La partie verbale de l'exécution `out` est également accessible."]},{"cell_type":"markdown","metadata":{"id":"xme7UNdR678K"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"3PQ8dgt1OLyT"},"source":["Comme nous avons oublié de stocker les pertes pendant la formation, ce script a été créé pour les récupérer à partir du fichier verbeux."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"uLZ1Egi8OEAo"},"outputs":[],"source":["data = open('out', 'r').read()\n","\n","pattern = re.compile(r\"\\[(\\d+)/(\\d+)\\]\\[(\\d+)/(\\d+)\\]\\[(\\d+)\\] Loss_D: ([-+]?\\d*\\.\\d+|\\d+) Loss_G: ([-+]?\\d*\\.\\d+|\\d+) Loss_D_real: ([-+]?\\d*\\.\\d+|\\d+) Loss_D_fake ([-+]?\\d*\\.\\d+|\\d+)\")\n","\n","matches = pattern.findall(data)\n","\n","df = pd.DataFrame(matches, columns=['epoch', 'niter', 'i', 'dataloader_size', 'gen_iterations', 'Loss_D', 'Loss_G', 'Loss_D_real', 'Loss_D_fake'])\n","\n","df = df.apply(pd.to_numeric)\n","\n","plt.plot(df['gen_iterations'][::100], -df['Loss_D'][::100])\n","plt.xlabel('Generator Iterations')\n","plt.ylabel('Loss_D ~ Wasserstein Distance')\n","plt.title('Loss_D vs. Generator Iterations')\n","plt.show()"]},{"cell_type":"markdown","metadata":{"id":"en27GDwsO4J_"},"source":["Nous traçons l'évolution de la perte du discriminateur car, contrairement au GAN classique, elles sont interprétables. Il s'agit en fait d'une estimation de la distance de Wasserstein entre la distribution générée et la distribution cible. Les valeurs décroissantes sont la preuve que le modèle continue d'apprendre et n'est pas affecté par l'un des problèmes des GANs classiques."]},{"cell_type":"markdown","metadata":{"id":"fdKb4NcvNzTz"},"source":["![evolution.png](data:image/png;base64,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)"]},{"cell_type":"markdown","metadata":{"id":"qLhnYB0uPpjt"},"source":["## Application\n","### Problème inverse : Récupérer le vecteur latent d'une image\n","\n","Voici le problème d'optimisation que nous voulons résoudre :\n","\n","$$\\underset{z \\in \\mathbb{Z}}{\\text{argmin}}\\lVert g(z)-x_0 \\rVert_2^2$$\n","\n","Voici le code pour résoudre ce problème en utilisant la différenciation automatique de PyTorch :"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"sdc3spKfRDO3"},"outputs":[],"source":["x0 = inputsv[0][None, :,:,:]\n","\n","noise = torch.FloatTensor(1, nz, 1, 1).normal_(0,1)\n","noise.requires_grad = True\n","\n","\n","# Choisissez un optimiseur, par exemple Adam\n","optimizer = optim.Adam([noise], lr=0.001)\n","\n","\n","for p in netD.parameters():\n"," p.requires_grad = False\n","for p in netG.parameters():\n"," p.requires_grad = False\n","\n","# Boucle d'optimisation\n","for iteration in range(100000):\n"," optimizer.zero_grad()\n","\n"," # Générer une donnée à partir de z\n"," generated_data = netG(noise)\n","\n"," # Calculer la perte (norme L2 au carré)\n"," loss = torch.norm(generated_data - x0)**2\n","\n"," # Rétropropagation et optimisation\n"," loss.backward()\n"," optimizer.step()\n","\n"," print(f\"Iteration: {iteration}, Loss: {loss.item()}\")"]},{"cell_type":"markdown","metadata":{"id":"pUw0PYPNR5wo"},"source":["Voici un exemple :\n","\n","- Image cible :"]},{"cell_type":"markdown","metadata":{"id":"Ic24cRnN7aus"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"I-DndMBm7YJa"},"source":["- Image trouvée :"]},{"cell_type":"markdown","metadata":{"id":"HXoaWAoV7hoj"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"_tBHFalDSRcI"},"source":["À partir d'un vecteur latent, nous pouvons explorer l'espace engendré par le générateur.\n","\n","---\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"pS4lMtoBSgnZ"},"outputs":[],"source":["fixed_noise = noise.repeat(25, 1, 1, 1)\n","\n","n = int(fixed_noise.shape[0]**.5)\n","for i in range(n):\n"," for j in range(n):\n"," fixed_noise[i*n+j] = fixed_noise[0] + i*torch.eye(nz)[0][:, None, None] + j*torch.eye(nz)[1][:, None, None]\n","\n"," for n in fixed_noise:\n"," im = netG(n[None, :,: ,:])[0]\n"," plt.imshow(torch.permute(im.detach(), (1,2,0)))\n"," plt.show()"]},{"cell_type":"markdown","metadata":{"id":"nDMasgAOS8aa"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"cgRBSaWRTAtT"},"source":["D'après les propriétés énnoncées, nous savons que la distance de Wasserstein est Lipschitz sur l'espace engendré par le générateur. Par conséquent, nous remarquons que toutes les images sont des barycentres de Wasserstein pour les autres."]},{"cell_type":"markdown","metadata":{"id":"cyp-fhG03bS3"},"source":["## Conclusion\n","\n","Notre exploration des Wasserstein GANs, telle que détaillée dans ce projet, nous a permis de nous familiariser avec des concepts clés tels que le Generative Adversarial Network (GAN), la distance de Wasserstein, et les techniques avancées de traitement de données. Cette compréhension approfondie nous a équipés avec une perspective unique et une connaissance approfondie des mécanismes sous-jacents aux GANs, ainsi que de leur potentiel dans des applications variées.\n","\n","En regardant vers l'avenir, nous identifions plusieurs domaines potentiels d'amélioration et de recherche. Parmi ceux-ci, comparer les Wasserstein GANs avec d'autres formes de GANs utilisant différentes fonctions de coût se présente comme une piste prometteuse. De plus, l'optimisation des paramètres du modèle, en se concentrant sur des aspects tels que le taux d'apprentissage, le clipping, et le nombre d'itérations du discriminant, pourrait conduire à des avancées significatives dans la performance et l'efficacité des GANs."]}],"metadata":{"colab":{"provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.7"}},"nbformat":4,"nbformat_minor":0} \ No newline at end of file +{"cells":[{"cell_type":"markdown","metadata":{"id":"arqpDh95Zt6W"},"source":["# Wasserstein GAN\n","\n","L'objectif de ce projet était d'étudier les GANs dans le cas de la distance de Wasserstein.\n","\n","Voici les membres de notre groupe classés par ordres alphabétiques pour leur nom de famille :\n","- Paul Corbalan\n","- Nicolas Gonel\n","- Oihan Joyot\n","- Tristan Portugues\n","- Florian Zorzynski\n","\n","Notre projet s'inspire grandement des ressources suivantes qui sont l'article initial de notre projet ainsi que le code correspondant.\n","- Article : [[1701.07875] Wasserstein GAN (arxiv.org)](https://arxiv.org/abs/1701.07875)\n","- Code : [martinarjovsky/WassersteinGAN (github.com)](https://github.com/martinarjovsky/WassersteinGAN)\n","\n","Un répertoire pour ce projet en général est disponible à l'adresse suivante :\n","https://code.paul-corbalan.com/paul-corbalan/wasserstein-gan\n","\n","---"]},{"cell_type":"markdown","metadata":{"id":"Hke_hyXT3bSP"},"source":["## Introduction\n","\n","Les Réseaux Antagonistes Génératifs (GANs) représentent une avancée majeure dans le domaine de l'apprentissage profond, révolutionnant la manière dont les machines comprennent et génèrent des données, en particulier des images. Cette technologie imite la façon dont les humains apprennent et créent, ouvrant des portes vers des applications innovantes allant de l'art numérique à des solutions médicales avancées. Le projet \"Wasserstein GAN\" s'inscrit dans cette perspective, visant à explorer une variante spécifique des GANs qui utilise la distance de Wasserstein pour améliorer la stabilité et la qualité des résultats.\n","\n","Le choix de la distance de Wasserstein comme métrique clé dans notre projet offre un avantage distinct sur les méthodes traditionnelles. Elle permet de surmonter certains des défis inhérents aux GANs classiques, comme le mode collapse et les problèmes de convergence. En se concentrant sur cette approche, notre projet cherche à démontrer comment une compréhension approfondie de la théorie mathématique peut être appliquée efficacement pour améliorer la performance et la fiabilité des modèles génératifs.\n","\n","Ce notebook est conçu pour servir d'outil d'apprentissage et d'exploration dans le domaine des GANs, avec un accent particulier sur les Wasserstein GANs. Il guide le lecteur à travers les principes fondamentaux, les défis et les solutions uniques associés à cette technologie, offrant un mélange d'explications théoriques et d'applications pratiques. L'objectif est de fournir une base solide pour comprendre et utiliser les Wasserstein GANs."]},{"cell_type":"markdown","metadata":{"id":"P_O5MYE_xMU5"},"source":["## Generative Adversarial Network (GAN)\n","\n","Les GANs sont des modèles d'apprentissage profond définis par deux réseaux neuronaux, le générateur $G$ et le discriminateur $D$.\n","\n"," Le générateur crée des données, tandis que le discriminateur les évalue. L'objectif du générateur est d'approcher un distribution $\\mathbb{P}_g$ inconnue telle que les données générées $G(z)$ soient indiscernables des données réelles $x$, où $z$ un vecteur de notre espace latent. Le discriminateur est entraîné à faire la distinction entre un inputs et $x$.\n","\n"," Les deux modèles sont mis en compétition et $G$ cherche à minimiser la probabilité que $D$ fasse la distinction entre $G(z)$ et $x$, tandis que $D$ cherche à maximiser cette probabilité.\n","\n","Formellement, cela correspond à résoudre le problème min-max pour :\n","$$V(D, G) = \\mathbb{E}_{x \\sim \\mathbb{P}_{r}}[\\log D(x)] + \\mathbb{E}_{z \\sim \\mathbb{P}_z}[\\log(1 - D(G(z)))]$$\n","où le problème est le suivant :\n","$$\n","\\min _G \\max _D V(D, G)\n","$$\n","\n"," Cette minimisation utilise la log-vraissemblance négative et est la solution d'origine pour arriver à un équilibre entre le générateur et le discriminateur. Cependant cette méthode peut présenter plusieurs problèmes:\n"," - des \"modes collapse\" où l'entraînement converge vers une solution oubliant certaines particularités de la distibution cherché.\n"," - des gradients évanescents, lorsque le discriminateur devient trop parfait, il devient impossible de générer un gradient utilisable à partir de la sortie du discriminateur.\n","\n"," On va donc chercher un moyen de résoudre ces problèmes en changeant de fonction de perte et on va essayer d'utiliser la distance de wasserstein."]},{"cell_type":"markdown","metadata":{"id":"yIx0TILzG6-l"},"source":["## Distance de Wasserstein\n","\n","### Définition\n","\n","En mathématiques, la distance de Wasserstein est une fonction définie entre des distributions de probabilité sur un espace métrique donné $(M,d)$. La distance de Wasserstein d'ordre $p \\in \\left[1,+\\infty \\right]$ entre deux mesures de probabilité $\\mu$ et $\\nu$ définies sur $M$ (avec des moments finis de l'ordre $p$) est définie par :\n","\n","\\begin{equation}\n","\\begin{split}\n","{\\displaystyle W_{p}(\\mu ,\\nu )=\\left(\\inf _{\\gamma \\in \\Gamma (\\mu ,\\nu )}\\mathbf {E} _{(x,y)\\sim \\gamma }d(x,y)^{p}\\right)^{1/p}.}\n","\\end{split}\n","\\end{equation}\n","\n","L'infimum est pris sur $\\Gamma (\\mu,\\nu )$, l'ensemble de tous les couplages dont les distributions marginales sont respectivement $\\mu$ et $\\nu$.\n","\n","### Interprétation physique\n","\n","Cette métrique est également connue sous le nom de earth mover distance. De manière intuitive, si l'on imagine chaque distribution comme une unité de terre empilée sur un espace métrique $M$, la métrique représente le coût minimal pour remodeler une pile en une autre. Ce coût est conçu comme la quantité de terre à déplacer, multipliée par la distance moyenne qu'elle doit parcourir.\n","\n","En d'autres termes, la distance de Wasserstein fournit une mesure précise du coût minimal nécessaire pour transformer une distribution de probabilité en une autre, tout en minimisant le coût total de ce déplacement. C'est pourquoi l'avantage de cette distance réside dans son incorporation des concepts de transport optimal et de couplage, tous deux pertinents et pratiques pour l'étude.\n","\n","### Utilisation pour les images numériques\n","\n","Pour résumer, la distance de Wasserstein est une manière naturelle de comparer les distributions de probabilité de deux variables, où une variable est dérivée de l'autre par de petites perturbations non uniformes (aléatoires ou déterministes). C'est pourquoi, en informatique, cette métrique est largement utilisée pour comparer des distributions discrètes, notamment les histogrammes de couleur de deux images numériques.\n","\n","\n","### Calcul numérique\n","\n","Le problème principal de cette distance est son calcul, l'infimum étant très compliqué à calculer. Heureusement, la dualité de Kantorovich-Rubinstein nous donne :\n","\\begin{equation}\n","W(\\mathbb{P}_r, \\mathbb{P}_{\\theta})=\\frac{1}{K}\\sup_{||f|| 0.7:\n"," print(f\"Image {filename} is predicted as a human face and will be moved.\")\n"," shutil.copy(os.path.join(folder_path, filename), 'predicted_humans')\n","\n","\n","predict_and_move(\"..\")"]},{"cell_type":"markdown","metadata":{"id":"Pl2UlIxJMb-s"},"source":["![confusion.svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmcxIgogICB3aWR0aD0iNjE0LjQwMDAyIgogICBoZWlnaHQ9IjQ2MC43OTk5OSIKICAgdmlld0JveD0iMCAwIDYxNC40MDAwMiA0NjAuNzk5OTkiCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczEiPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDQiPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDU3LjYsMzguMDE2IEggNDE0LjcyIFYgMzA0LjEyOCBIIDU3LjYgWiIKICAgICAgICAgaWQ9InBhdGg0IiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxjbGlwUGF0aAogICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0iY2xpcFBhdGg2Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA1Ny42LDM4LjAxNiBIIDQxNC43MiBWIDMwNC4xMjggSCA1Ny42IFoiCiAgICAgICAgIGlkPSJwYXRoNiIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8Y2xpcFBhdGgKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImNsaXBQYXRoOCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gNTcuNiwzOC4wMTYgSCA0MTQuNzIgViAzMDQuMTI4IEggNTcuNiBaIgogICAgICAgICBpZD0icGF0aDgiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDEwIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA1Ny42LDM4LjAxNiBIIDQxNC43MiBWIDMwNC4xMjggSCA1Ny42IFoiCiAgICAgICAgIGlkPSJwYXRoMTAiIC8+CiAgICA8L2NsaXBQYXRoPgogIDwvZGVmcz4KICA8ZwogICAgIGlkPSJnMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgxIgogICAgICAgZD0iTSAwLDAgSCA0NjAuOCBWIDM0NS42IEggMCBaIgogICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsLTEuMzMzMzMzMywwLDQ2MC44KSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDIiCiAgICAgICBkPSJNIDU3LjYsMzguMDE2IEggNDE0LjcyIFYgMzA0LjEyOCBIIDU3LjYgWiIKICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMzMzMsMCwwLC0xLjMzMzMzMzMsMCw0NjAuOCkiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgzIgogICAgICAgZD0iTSA1Ny42LDMwNC4xMjggSCAyMzYuMTYgViAxNzEuMDcyIEggNTcuNiB2IDEzMy4wNTYiCiAgICAgICBzdHlsZT0iZmlsbDojYjJkMmU4O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLDAsNDYwLjgpIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNCkiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1IgogICAgICAgZD0iTSAyMzYuMTYsMzA0LjEyOCBIIDQxNC43MiBWIDE3MS4wNzIgSCAyMzYuMTYgdiAxMzMuMDU2IgogICAgICAgc3R5bGU9ImZpbGw6I2YyZjhmZDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsLTEuMzMzMzMzMywwLDQ2MC44KSIKICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDYpIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNyIKICAgICAgIGQ9Ik0gNTcuNiwxNzEuMDcyIEggMjM2LjE2IFYgMzguMDE2IEggNTcuNiB2IDEzMy4wNTYiCiAgICAgICBzdHlsZT0iZmlsbDojZjdmYmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLDAsNDYwLjgpIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg5IgogICAgICAgZD0iTSAyMzYuMTYsMTcxLjA3MiBIIDQxNC43MiBWIDM4LjAxNiBIIDIzNi4xNiB2IDEzMy4wNTYiCiAgICAgICBzdHlsZT0iZmlsbDojMDgzMDZiO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLDAsNDYwLjgpIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTApIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMTEiCiAgICAgICBkPSJtIDE0Ni44OCwzOC4wMTYgdiAtMy41IgogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC44O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLDAsNDYwLjgpIiAvPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsMTU2LjA3OTU4LDQyOS41NzAzMykiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDcuNDggMTMuNiAxOS45NDAwMDEgMjMuNTQ5OTk5IDMxLjA3IDM3LjQxIDQ3LjE1MDAwMiA1My4yNzk5OTkiCiAgICAgICAgIHk9IjAiCiAgICAgICAgIGlkPSJ0c3BhbjExIj5Ob24tSHVtYW48L3RzcGFuPjwvdGV4dD4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDEyIgogICAgICAgZD0ibSAzMjUuNDQsMzguMDE2IHYgLTMuNSIKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsLTEuMzMzMzMzMywwLDQ2MC44KSIgLz4KICAgIDx0ZXh0CiAgICAgICBpZD0idGV4dDEyIgogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsMS4zMzMzMzMzLDQwOS44Njc5Miw0MjkuNTcwMzMpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5OidEZWphVnUgU2Fucyc7d3JpdGluZy1tb2RlOmxyLXRiO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgeD0iMCA3LjUyIDEzLjg2IDIzLjYgMjkuNzMiCiAgICAgICAgIHk9IjAiCiAgICAgICAgIGlkPSJ0c3BhbjEyIj5IdW1hbjwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTMiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsMjgzLjU2NzUsNDQ3Ljc5OTUpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5OidEZWphVnUgU2Fucyc7d3JpdGluZy1tb2RlOmxyLXRiO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgeD0iMCA1Ljg1ODEyNTIgOS43NDkzNzUzIDE1Ljg5OTM3NSAyMi4yNDkzNzQgMjUuMDI5Mzc1IDMwLjUyOTM3NSAzNC40NDkzNzUgNDAuNTk5Mzc3IgogICAgICAgICB5PSIwIgogICAgICAgICBpZD0idHNwYW4xMyI+UHJlZGljdGVkPC90c3Bhbj48L3RleHQ+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgxMyIKICAgICAgIGQ9Ik0gNTcuNiwyMzcuNiBIIDU0LjEiCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMzMzMsMCwwLC0xLjMzMzMzMzMsMCw0NjAuOCkiIC8+CiAgICA8dGV4dAogICAgICAgaWQ9InRleHQxNCIKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLC0xLjMzMzMzMzMsMS4zMzMzMzMzLDAsNjQuNjk1ODMzLDE4My43NjA0MikiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDcuNDggMTMuNiAxOS45NDAwMDEgMjMuNTQ5OTk5IDMxLjA3IDM3LjQxIDQ3LjE1MDAwMiA1My4yNzk5OTkiCiAgICAgICAgIHk9IjAiCiAgICAgICAgIGlkPSJ0c3BhbjE0Ij5Ob24tSHVtYW48L3RzcGFuPjwvdGV4dD4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDE0IgogICAgICAgZD0iTSA1Ny42LDEwNC41NDQgSCA1NC4xIgogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC44O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLDAsNDYwLjgpIiAvPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTUiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMS4zMzMzMzMzLDEuMzMzMzMzMywwLDY0LjY5NTgzMywzNDUuNDYwMDgpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5OidEZWphVnUgU2Fucyc7d3JpdGluZy1tb2RlOmxyLXRiO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgeD0iMCA3LjUyIDEzLjg2IDIzLjYgMjkuNzMiCiAgICAgICAgIHk9IjAiCiAgICAgICAgIGlkPSJ0c3BhbjE1Ij5IdW1hbjwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTYiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMS4zMzMzMzMzLDEuMzMzMzMzMywwLDQ2LjQ2NjY2NywyNDYuODQ5ODMpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5OidEZWphVnUgU2Fucyc7d3JpdGluZy1tb2RlOmxyLXRiO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgeD0iMCA0LjY0MTI1MDEgOC43NTEyNTAzIDE1LjA5MTI1IgogICAgICAgICB5PSIwIgogICAgICAgICBpZD0idHNwYW4xNiI+VHJ1ZTwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTciCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsMTgzLjEyMTI1LDE0Ny42NzcwOCkiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojMjYyNjI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDYuMzYwMDAwMSAxMi43MiIKICAgICAgICAgeT0iMCIKICAgICAgICAgaWQ9InRzcGFuMTciPjY3NjwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTgiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsNDIxLjIwMTI1LDE0Ny42NzcwOCkiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojMjYyNjI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDYuMzYwMDAwMSAxMi43MiIKICAgICAgICAgeT0iMCIKICAgICAgICAgaWQ9InRzcGFuMTgiPjE4MDwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MTkiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsMTgzLjEyMTI1LDMyNS4wODUwOCkiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojMjYyNjI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDYuMzYwMDAwMSAxMi43MiIKICAgICAgICAgeT0iMCIKICAgICAgICAgaWQ9InRzcGFuMTkiPjEzOTwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MjAiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwxLjMzMzMzMzMsNDE2Ljk2MTY3LDMyNS4wODUwOCkiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjEwcHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTYW5zJzt3cml0aW5nLW1vZGU6bHItdGI7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICB4PSIwIDYuMzYwMDAwMSAxMi43MiAxOS4wOCIKICAgICAgICAgeT0iMCIKICAgICAgICAgaWQ9InRzcGFuMjAiPjE4NDE8L3RzcGFuPjwvdGV4dD4KICAgIDx0ZXh0CiAgICAgICBpZD0idGV4dDIxIgogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsMS4zMzMzMzMzLDI0Ny4zNDg3NSw0Ny4yOTYpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OidEZWphVnUgU2Fucyc7d3JpdGluZy1tb2RlOmxyLXRiO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgeD0iMCA4LjM3NjAwMDQgMTUuNzIgMjMuMzI3OTk5IDI3LjU1MiAzNS4xNiA0MS40MTE5OTkgNDQuNzQ4MDAxIDUyLjA5MTk5OSA1OS43MDAwMDEgNjMuNTE1OTk5IDczLjg3MjAwMiA4MS4yMjc5OTcgODUuOTMxOTk5IDkwLjg2Mzk5OCA5NC4xOTk5OTciCiAgICAgICAgIHk9IjAiCiAgICAgICAgIGlkPSJ0c3BhbjIxIj5Db25mdXNpb24gTWF0cml4PC90c3Bhbj48L3RleHQ+CiAgPC9nPgo8L3N2Zz4K)"]},{"cell_type":"markdown","metadata":{"id":"vEH1G2zSIZ3p"},"source":["L'ensemble de données a ensuite été mis à l'échelle pour appliquer le filtre de convolution à l'aide de la commande :\n","```shell\n","convert *.png resized 400% *upscaled*/*.png\n","```\n","\n","Les données finales peuvent être téléchargées sur :\n","https://code.paul-corbalan.com/paul-corbalan/wasserstein-gan/media/branch/master/data/predicted_humans.zip"]},{"cell_type":"markdown","metadata":{"id":"xA3azaz1US4k"},"source":["## Architecture du modèle GAN\n","\n","Dans cette partie sont décrites les architectures du discriminateur et du générateur de notre modèle."]},{"cell_type":"markdown","metadata":{"id":"dxaMaimlY21r"},"source":["### Discriminateur"]},{"cell_type":"markdown","metadata":{"id":"dFj_wV-i4dIG"},"source":["![netD_architecture.svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDguMS4wICgyMDIzMDcwNy4wNzM5KQogLS0+CjwhLS0gUGFnZXM6IDEgLS0+Cjxzdmcgd2lkdGg9Ijc3NnB0IiBoZWlnaHQ9Ijg2NHB0Igogdmlld0JveD0iMC4wMCAwLjAwIDc3Ni40OCA4NjQuMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgo8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMC45Nzc5MjkgMC45Nzc5MjkpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA4NzkuNSkiPgo8cG9seWdvbiBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSJub25lIiBwb2ludHM9Ii00LDQgLTQsLTg3OS41IDc5MCwtODc5LjUgNzkwLDQgLTQsNCIvPgo8IS0tIDE0MDI0NDk0MDU4NTY4MCAtLT4KPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDA1ODU2ODA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSIjY2FmZjcwIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjY4NCwtMzQuMjUgNjMwLC0zNC4yNSA2MzAsMCA2ODQsMCA2ODQsLTM0LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjY1NyIgeT0iLTguNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMSk8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODM3NDQgLS0+CjxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNzQ0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjY1MywtOTguNSA1NTksLTk4LjUgNTU5LC03Ni4yNSA2NTMsLTc2LjI1IDY1MywtOTguNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2MDYiIHk9Ii04NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+Vmlld0JhY2t3YXJkMDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4Mzc0NCYjNDU7Jmd0OzE0MDI0NDk0MDU4NTY4MCAtLT4KPGcgaWQ9ImVkZ2UyNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNzQ0JiM0NTsmZ3Q7MTQwMjQ0OTQwNTg1NjgwPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTYxMy43NSwtNzYuMDFDNjIwLjIxLC02Ny4zNiA2MjkuNywtNTQuNjYgNjM4LjE0LC00My4zNyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2NDEuNDMsLTQ1LjgxIDY0NC42MSwtMzUuNzEgNjM1LjgyLC00MS42MiA2NDEuNDMsLTQ1LjgxIi8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODM1NTIgLS0+CjxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNTUyPC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjcwNCwtMTYyLjc1IDYxMCwtMTYyLjc1IDYxMCwtMTQwLjUgNzA0LC0xNDAuNSA3MDQsLTE2Mi43NSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2NTciIHk9Ii0xNDkuMjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPk1lYW5CYWNrd2FyZDE8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODM1NTImIzQ1OyZndDsxNDAyNDQ5NDM1ODM3NDQgLS0+CjxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNTUyJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzNzQ0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTY0OC4zNSwtMTQwLjA3QzY0MC45OCwtMTMxLjA3IDYzMC4yMSwtMTE3LjkyIDYyMS4zNywtMTA3LjE0Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjYyMy41NywtMTA1LjMgNjE0LjUyLC05OS43OCA2MTguMTUsLTEwOS43MyA2MjMuNTcsLTEwNS4zIi8+CjwvZz4KPCEtLSAxNDAyNDQ5NDA1ODU1ODQgLS0+CjxnIGlkPSJub2RlMjkiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MDU4NTU4NDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9IiNhMmNkNWEiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzQ3LC0xMDQuNSA2NzEsLTEwNC41IDY3MSwtNzAuMjUgNzQ3LC03MC4yNSA3NDcsLTEwNC41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjcwOSIgeT0iLTc5IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDEsIDEsIDEpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgzNTUyJiM0NTsmZ3Q7MTQwMjQ0OTQwNTg1NTg0IC0tPgo8ZyBpZD0iZWRnZTI4IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODM1NTImIzQ1OyZndDsxNDAyNDQ5NDA1ODU1ODQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjY1LjgyLC0xNDAuMDdDNjcyLjAzLC0xMzIuNjMgNjgwLjYxLC0xMjIuMzYgNjg4LjQ5LC0xMTIuOTMiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNjkxLjcxLC0xMTUuNTMgNjk1LjQ0LC0xMDUuNjEgNjg2LjM0LC0xMTEuMDQgNjkxLjcxLC0xMTUuNTMiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDAzMiAtLT4KPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODQwMzI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzI1LC0yMjEgNTg5LC0yMjEgNTg5LC0xOTguNzUgNzI1LC0xOTguNzUgNzI1LC0yMjEiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjU3IiB5PSItMjA3LjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkNvbnZvbHV0aW9uQmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTg0MDMyJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzNTUyIC0tPgo8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4NDAzMiYjNDU7Jmd0OzE0MDI0NDk0MzU4MzU1MjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik02NTcsLTE5OC4yOUM2NTcsLTE5MS40NiA2NTcsLTE4Mi4zMiA2NTcsLTE3NC4wMiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2NjAuNSwtMTc0LjE2IDY1NywtMTY0LjE2IDY1My41LC0xNzQuMTYgNjYwLjUsLTE3NC4xNiIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc4MDgwIC0tPgo8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU3ODA4MDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2NDksLTI3OS4yNSA1MjUsLTI3OS4yNSA1MjUsLTI1NyA2NDksLTI1NyA2NDksLTI3OS4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1ODciIHk9Ii0yNjUuNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkxlYWt5UmVsdUJhY2t3YXJkMTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3ODA4MCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDAzMiAtLT4KPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzgwODAmIzQ1OyZndDsxNDAyNDQ5NDM1ODQwMzI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjAwLjE3LC0yNTYuNTRDNjEwLjE0LC0yNDguNTMgNjI0LjA1LC0yMzcuMzUgNjM1LjYxLC0yMjguMDYiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNjM3LjI5LC0yMzAuNCA2NDIuODksLTIyMS40MSA2MzIuOTEsLTIyNC45NCA2MzcuMjksLTIzMC40Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODM5ODQgLS0+CjxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzOTg0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjY2MiwtMzQzLjUgNTAyLC0zNDMuNSA1MDIsLTMyMS4yNSA2NjIsLTMyMS4yNSA2NjIsLTM0My41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU4MiIgeT0iLTMzMCIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+TmF0aXZlQmF0Y2hOb3JtQmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgzOTg0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc4MDgwIC0tPgo8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4Mzk4NCYjNDU7Jmd0OzE0MDI0NDk0MzU3ODA4MDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik01ODIuODUsLTMyMC44MkM1ODMuNTIsLTMxMi40NSA1ODQuNDgsLTMwMC40OSA1ODUuMzEsLTI5MC4xOCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1ODguODUsLTI5MC43OCA1ODYuMTYsLTI4MC41MyA1ODEuODcsLTI5MC4yMiA1ODguODUsLTI5MC43OCIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyNTkyIC0tPgo8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjU5MjwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1MTQsLTQwNy43NSAzNzgsLTQwNy43NSAzNzgsLTM4NS41IDUxNCwtMzg1LjUgNTE0LC00MDcuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDQ2IiB5PSItMzk0LjI1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5Db252b2x1dGlvbkJhY2t3YXJkMDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MjU5MiYjNDU7Jmd0OzE0MDI0NDk0MzU4Mzk4NCAtLT4KPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODI1OTImIzQ1OyZndDsxNDAyNDQ5NDM1ODM5ODQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDY5LjA3LC0zODUuMDdDNDkxLjA1LC0zNzUgNTI0LjM3LC0zNTkuNzUgNTQ5LjEyLC0zNDguNDIiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTUwLjE4LC0zNTEuMzMgNTU3LjgyLC0zNDMuOTkgNTQ3LjI3LC0zNDQuOTcgNTUwLjE4LC0zNTEuMzMiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDg0OCAtLT4KPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODQ4NDg8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzkzLC00NzIgMjY5LC00NzIgMjY5LC00NDkuNzUgMzkzLC00NDkuNzUgMzkzLC00NzIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzMxIiB5PSItNDU4LjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkxlYWt5UmVsdUJhY2t3YXJkMTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDg0OCYjNDU7Jmd0OzE0MDI0NDk0MzU4MjU5MiAtLT4KPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODQ4NDgmIzQ1OyZndDsxNDAyNDQ5NDM1ODI1OTI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzUwLjUxLC00NDkuMzJDMzY4LjY4LC00MzkuNDggMzk2LjAyLC00MjQuNjggNDE2Ljc5LC00MTMuNDMiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDE4LjI3LC00MTYuMDggNDI1LjQsLTQwOC4yNCA0MTQuOTQsLTQwOS45MiA0MTguMjcsLTQxNi4wOCIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyNDQ4IC0tPgo8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjQ0ODwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzOTksLTU0Mi4yNSAyMzksLTU0Mi4yNSAyMzksLTUyMCAzOTksLTUyMCAzOTksLTU0Mi4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTkiIHk9Ii01MjguNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPk5hdGl2ZUJhdGNoTm9ybUJhY2t3YXJkMDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MjQ0OCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDg0OCAtLT4KPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODI0NDgmIzQ1OyZndDsxNDAyNDQ5NDM1ODQ4NDg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzIwLjgyLC01MTkuNzZDMzIyLjUzLC01MTAuMDQgMzI1LjE0LC00OTUuMjEgMzI3LjI5LC00ODMiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzMwLjg4LC00ODMuNzkgMzI5LjE2LC00NzMuMzQgMzIzLjk4LC00ODIuNTggMzMwLjg4LC00ODMuNzkiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MzI2NCAtLT4KPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzMjY0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjI1MSwtNjA2LjUgMTE1LC02MDYuNSAxMTUsLTU4NC4yNSAyNTEsLTU4NC4yNSAyNTEsLTYwNi41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4MyIgeT0iLTU5MyIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+Q29udm9sdXRpb25CYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODMyNjQmIzQ1OyZndDsxNDAyNDQ5NDM1ODI0NDggLS0+CjxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzMjY0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyNDQ4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIwNi4wNywtNTgzLjgyQzIyOC4wNSwtNTczLjc1IDI2MS4zNywtNTU4LjUgMjg2LjEyLC01NDcuMTciLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjg3LjE4LC01NTAuMDggMjk0LjgyLC01NDIuNzQgMjg0LjI3LC01NDMuNzIgMjg3LjE4LC01NTAuMDgiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3OTYxNiAtLT4KPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTc5NjE2PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjEzNCwtNjcwLjc1IDEwLC02NzAuNzUgMTAsLTY0OC41IDEzNCwtNjQ4LjUgMTM0LC02NzAuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzIiIHk9Ii02NTcuMjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkxlYWt5UmVsdUJhY2t3YXJkMTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3OTYxNiYjNDU7Jmd0OzE0MDI0NDk0MzU4MzI2NCAtLT4KPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1Nzk2MTYmIzQ1OyZndDsxNDAyNDQ5NDM1ODMyNjQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNOTAuODMsLTY0OC4wN0MxMDguMjksLTYzOC4yNyAxMzQuNTIsLTYyMy41NiAxNTQuNTQsLTYxMi4zNCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxNTYuMDcsLTYxNC45MyAxNjMuMDgsLTYwNi45OSAxNTIuNjQsLTYwOC44MyAxNTYuMDcsLTYxNC45MyIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc4MTc2IC0tPgo8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzgxNzY8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTM2LC03NDEgMCwtNzQxIDAsLTcxOC43NSAxMzYsLTcxOC43NSAxMzYsLTc0MSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2OCIgeT0iLTcyNy41IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5Db252b2x1dGlvbkJhY2t3YXJkMDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3ODE3NiYjNDU7Jmd0OzE0MDI0NDk0MzU3OTYxNiAtLT4KPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTc4MTc2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc5NjE2PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTY4LjYxLC03MTguNTFDNjkuMTgsLTcwOC43OSA3MC4wNSwtNjkzLjk2IDcwLjc2LC02ODEuNzUiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzQuMywtNjgyLjI4IDcxLjM5LC02NzIuMDkgNjcuMzEsLTY4MS44NyA3NC4zLC02ODIuMjgiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDUxMiAtLT4KPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTg0NTEyPC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjExOCwtODA1LjI1IDE4LC04MDUuMjUgMTgsLTc4MyAxMTgsLTc4MyAxMTgsLTgwNS4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2OCIgeT0iLTc5MS43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODQ1MTImIzQ1OyZndDsxNDAyNDQ5NDM1NzgxNzYgLS0+CjxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4NDUxMiYjNDU7Jmd0OzE0MDI0NDk0MzU3ODE3NjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik02OCwtNzgyLjU3QzY4LC03NzQuMjkgNjgsLTc2Mi41IDY4LC03NTIuMjciLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzEuNSwtNzUyLjI4IDY4LC03NDIuMjggNjQuNSwtNzUyLjI4IDcxLjUsLTc1Mi4yOCIvPgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIxMDQwIC0tPgo8ZyBpZD0ibm9kZTE0IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjEwNDA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGJsdWUiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTE4LC04NzUuNSAxOCwtODc1LjUgMTgsLTg0MS4yNSAxMTgsLTg0MS4yNSAxMTgsLTg3NS41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjY4IiB5PSItODUwIiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDMyLCAzLCA0LCA0KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1MzEyMTA0MCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDUxMiAtLT4KPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUzMTIxMDQwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTg0NTEyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTY4LC04NDEuMDJDNjgsLTgzMy40NyA2OCwtODI0LjQxIDY4LC04MTYuMzQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzEuNSwtODE2LjUyIDY4LC04MDYuNTIgNjQuNSwtODE2LjUyIDcxLjUsLTgxNi41MiIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgwNDgwIC0tPgo8ZyBpZD0ibm9kZTE1IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODA0ODA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjU0LC02NzAuNzUgMTU0LC02NzAuNzUgMTU0LC02NDguNSAyNTQsLTY0OC41IDI1NCwtNjcwLjc1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNCIgeT0iLTY1Ny4yNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODA0ODAmIzQ1OyZndDsxNDAyNDQ5NDM1ODMyNjQgLS0+CjxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MDQ4MCYjNDU7Jmd0OzE0MDI0NDk0MzU4MzI2NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0yMDAuNDQsLTY0OC4wN0MxOTcuNTgsLTYzOS42MSAxOTMuNDksLTYyNy40OCAxODkuOTksLTYxNy4xIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE5My4wMiwtNjE2LjE0IDE4Ni41MSwtNjA3Ljc4IDE4Ni4zOSwtNjE4LjM3IDE5My4wMiwtNjE2LjE0Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjA5NDQgLS0+CjxnIGlkPSJub2RlMTYiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMDk0NDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyNjAsLTc0NyAxNTQsLTc0NyAxNTQsLTcxMi43NSAyNjAsLTcxMi43NSAyNjAsLTc0NyIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDciIHk9Ii03MjEuNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICg2NCwgMzIsIDQsIDQpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIwOTQ0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgwNDgwIC0tPgo8ZyBpZD0iZWRnZTE0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjA5NDQmIzQ1OyZndDsxNDAyNDQ5NDM1ODA0ODA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMjA2LjI3LC03MTIuMzVDMjA1Ljg3LC03MDMuMTUgMjA1LjM2LC02OTEuNiAyMDQuOTMsLTY4MS43NSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyMDguMzksLTY4MS42OSAyMDQuNDUsLTY3MS44NSAyMDEuMzksLTY4MiAyMDguMzksLTY4MS42OSIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgzNjQ4IC0tPgo8ZyBpZD0ibm9kZTE3IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODM2NDg8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzY5LC02MDYuNSAyNjksLTYwNi41IDI2OSwtNTg0LjI1IDM2OSwtNTg0LjI1IDM2OSwtNjA2LjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzE5IiB5PSItNTkzIiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5BY2N1bXVsYXRlR3JhZDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MzY0OCYjNDU7Jmd0OzE0MDI0NDk0MzU4MjQ0OCAtLT4KPGcgaWQ9ImVkZ2UxNSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNjQ4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyNDQ4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTMxOSwtNTgzLjgyQzMxOSwtNTc1LjU0IDMxOSwtNTYzLjc1IDMxOSwtNTUzLjUyIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMyMi41LC01NTMuNTMgMzE5LC01NDMuNTMgMzE1LjUsLTU1My41MyAzMjIuNSwtNTUzLjUzIi8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjE1MjAgLS0+CjxnIGlkPSJub2RlMTgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMTUyMDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzNDYsLTY3Ni43NSAyOTIsLTY3Ni43NSAyOTIsLTY0Mi41IDM0NiwtNjQyLjUgMzQ2LC02NzYuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzE5IiB5PSItNjUxLjI1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDY0KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1MzEyMTUyMCYjNDU7Jmd0OzE0MDI0NDk0MzU4MzY0OCAtLT4KPGcgaWQ9ImVkZ2UxNiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUzMTIxNTIwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzNjQ4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTMxOSwtNjQyLjI3QzMxOSwtNjM0LjcyIDMxOSwtNjI1LjY2IDMxOSwtNjE3LjU5Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMyMi41LC02MTcuNzcgMzE5LC02MDcuNzcgMzE1LjUsLTYxNy43NyAzMjIuNSwtNjE3Ljc3Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODQ4MDAgLS0+CjxnIGlkPSJub2RlMTkiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4NDgwMDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0ODcsLTYwNi41IDM4NywtNjA2LjUgMzg3LC01ODQuMjUgNDg3LC01ODQuMjUgNDg3LC02MDYuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MzciIHk9Ii01OTMiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkFjY3VtdWxhdGVHcmFkPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTg0ODAwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyNDQ4IC0tPgo8ZyBpZD0iZWRnZTE3IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODQ4MDAmIzQ1OyZndDsxNDAyNDQ5NDM1ODI0NDg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDE2Ljk4LC01ODMuODJDMzk4LjI1LC01NzMuOTMgMzcwLjAzLC01NTkuMDUgMzQ4LjY4LC01NDcuNzgiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzUwLjU5LC01NDQuMzEgMzQwLjEyLC01NDIuNzQgMzQ3LjMzLC01NTAuNSAzNTAuNTksLTU0NC4zMSIvPgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIxMzI4IC0tPgo8ZyBpZD0ibm9kZTIwIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjEzMjg8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGJsdWUiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDY0LC02NzYuNzUgNDEwLC02NzYuNzUgNDEwLC02NDIuNSA0NjQsLTY0Mi41IDQ2NCwtNjc2Ljc1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQzNyIgeT0iLTY1MS4yNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICg2NCk8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjEzMjgmIzQ1OyZndDsxNDAyNDQ5NDM1ODQ4MDAgLS0+CjxnIGlkPSJlZGdlMTgiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMTMyOCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDgwMDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00MzcsLTY0Mi4yN0M0MzcsLTYzNC43MiA0MzcsLTYyNS42NiA0MzcsLTYxNy41OSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0NDAuNSwtNjE3Ljc3IDQzNywtNjA3Ljc3IDQzMy41LC02MTcuNzcgNDQwLjUsLTYxNy43NyIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTg1MTg0IC0tPgo8ZyBpZD0ibm9kZTIxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODUxODQ8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTE3LC00NzIgNDE3LC00NzIgNDE3LC00NDkuNzUgNTE3LC00NDkuNzUgNTE3LC00NzIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDY3IiB5PSItNDU4LjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkFjY3VtdWxhdGVHcmFkPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTg1MTg0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyNTkyIC0tPgo8ZyBpZD0iZWRnZTE5IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODUxODQmIzQ1OyZndDsxNDAyNDQ5NDM1ODI1OTI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDYzLjQ0LC00NDkuMzJDNDYwLjU4LC00NDAuODYgNDU2LjQ5LC00MjguNzMgNDUyLjk5LC00MTguMzUiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDU2LjAyLC00MTcuMzkgNDQ5LjUxLC00MDkuMDMgNDQ5LjM5LC00MTkuNjIgNDU2LjAyLC00MTcuMzkiLz4KPC9nPgo8IS0tIDE0MDI0NDk1MzEzMDA2NCAtLT4KPGcgaWQ9Im5vZGUyMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTUzMTMwMDY0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRibHVlIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjUyOSwtNTQ4LjI1IDQxNywtNTQ4LjI1IDQxNywtNTE0IDUyOSwtNTE0IDUyOSwtNTQ4LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ3MyIgeT0iLTUyMi43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICgxMjgsIDY0LCA0LCA0KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1MzEzMDA2NCYjNDU7Jmd0OzE0MDI0NDk0MzU4NTE4NCAtLT4KPGcgaWQ9ImVkZ2UyMCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUzMTMwMDY0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTg1MTg0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTQ3MS41NSwtNTEzLjZDNDcwLjc0LC01MDQuNCA0NjkuNzIsLTQ5Mi44NSA0NjguODYsLTQ4MyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0NzIuMjYsLTQ4Mi43NiA0NjcuOSwtNDczLjEgNDY1LjI5LC00ODMuMzcgNDcyLjI2LC00ODIuNzYiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MzY5NiAtLT4KPGcgaWQ9Im5vZGUyMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzNjk2PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjYzMiwtNDA3Ljc1IDUzMiwtNDA3Ljc1IDUzMiwtMzg1LjUgNjMyLC0zODUuNSA2MzIsLTQwNy43NSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1ODIiIHk9Ii0zOTQuMjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkFjY3VtdWxhdGVHcmFkPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgzNjk2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzOTg0IC0tPgo8ZyBpZD0iZWRnZTIxIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODM2OTYmIzQ1OyZndDsxNDAyNDQ5NDM1ODM5ODQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNTgyLC0zODUuMDdDNTgyLC0zNzYuNzkgNTgyLC0zNjUgNTgyLC0zNTQuNzciLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTg1LjUsLTM1NC43OCA1ODIsLTM0NC43OCA1NzguNSwtMzU0Ljc4IDU4NS41LC0zNTQuNzgiLz4KPC9nPgo8IS0tIDE0MDI0NDk1MzEzMDE2MCAtLT4KPGcgaWQ9Im5vZGUyNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTUzMTMwMTYwPC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRibHVlIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjYwOSwtNDc4IDU1NSwtNDc4IDU1NSwtNDQzLjc1IDYwOSwtNDQzLjc1IDYwOSwtNDc4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU4MiIgeT0iLTQ1Mi41IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDEyOCk8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMzAxNjAmIzQ1OyZndDsxNDAyNDQ5NDM1ODM2OTYgLS0+CjxnIGlkPSJlZGdlMjIiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk1MzEzMDE2MCYjNDU7Jmd0OzE0MDI0NDk0MzU4MzY5NjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik01ODIsLTQ0My41MkM1ODIsLTQzNS45NyA1ODIsLTQyNi45MSA1ODIsLTQxOC44NCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1ODUuNSwtNDE5LjAyIDU4MiwtNDA5LjAyIDU3OC41LC00MTkuMDIgNTg1LjUsLTQxOS4wMiIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgzMzEyIC0tPgo8ZyBpZD0ibm9kZTI1IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODMzMTI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzUwLC00MDcuNzUgNjUwLC00MDcuNzUgNjUwLC0zODUuNSA3NTAsLTM4NS41IDc1MCwtNDA3Ljc1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjcwMCIgeT0iLTM5NC4yNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODMzMTImIzQ1OyZndDsxNDAyNDQ5NDM1ODM5ODQgLS0+CjxnIGlkPSJlZGdlMjMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MzMxMiYjNDU7Jmd0OzE0MDI0NDk0MzU4Mzk4NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik02NzkuOTgsLTM4NS4wN0M2NjEuMjUsLTM3NS4xOCA2MzMuMDMsLTM2MC4zIDYxMS42OCwtMzQ5LjAzIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjYxMy41OSwtMzQ1LjU2IDYwMy4xMiwtMzQzLjk5IDYxMC4zMywtMzUxLjc1IDYxMy41OSwtMzQ1LjU2Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMzAyNTYgLS0+CjxnIGlkPSJub2RlMjYiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEzMDI1NjwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI3MjcsLTQ3OCA2NzMsLTQ3OCA2NzMsLTQ0My43NSA3MjcsLTQ0My43NSA3MjcsLTQ3OCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3MDAiIHk9Ii00NTIuNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICgxMjgpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTMwMjU2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzMzEyIC0tPgo8ZyBpZD0iZWRnZTI0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMzAyNTYmIzQ1OyZndDsxNDAyNDQ5NDM1ODMzMTI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNzAwLC00NDMuNTJDNzAwLC00MzUuOTcgNzAwLC00MjYuOTEgNzAwLC00MTguODQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzAzLjUsLTQxOS4wMiA3MDAsLTQwOS4wMiA2OTYuNSwtNDE5LjAyIDcwMy41LC00MTkuMDIiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3ODcwNCAtLT4KPGcgaWQ9Im5vZGUyNyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTc4NzA0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc3NywtMjc5LjI1IDY3NywtMjc5LjI1IDY3NywtMjU3IDc3NywtMjU3IDc3NywtMjc5LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjcyNyIgeT0iLTI2NS43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1Nzg3MDQmIzQ1OyZndDsxNDAyNDQ5NDM1ODQwMzIgLS0+CjxnIGlkPSJlZGdlMjUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU3ODcwNCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDAzMjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik03MTMuODMsLTI1Ni41NEM3MDMuODYsLTI0OC41MyA2ODkuOTUsLTIzNy4zNSA2NzguMzksLTIyOC4wNiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2ODEuMDksLTIyNC45NCA2NzEuMTEsLTIyMS40MSA2NzYuNzEsLTIzMC40IDY4MS4wOSwtMjI0Ljk0Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMzA2NDAgLS0+CjxnIGlkPSJub2RlMjgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEzMDY0MDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI3ODYsLTM0OS41IDY4MCwtMzQ5LjUgNjgwLC0zMTUuMjUgNzg2LC0zMTUuMjUgNzg2LC0zNDkuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3MzMiIHk9Ii0zMjQiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMSwgMTI4LCA0LCA0KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1MzEzMDY0MCYjNDU7Jmd0OzE0MDI0NDk0MzU3ODcwNCAtLT4KPGcgaWQ9ImVkZ2UyNiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUzMTMwNjQwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTc4NzA0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTczMS40MiwtMzE1LjAyQzczMC43LC0zMDcuNDcgNzI5LjgyLC0yOTguNDEgNzI5LjA0LC0yOTAuMzQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzMyLjQ1LC0yOTAuMTQgNzI4LC0yODAuNTIgNzI1LjQ4LC0yOTAuODEgNzMyLjQ1LC0yOTAuMTQiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MDU4NTU4NCYjNDU7Jmd0OzE0MDI0NDk0MDU4NTY4MCAtLT4KPGcgaWQ9ImVkZ2UyOSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQwNTg1NTg0JiM0NTsmZ3Q7MTQwMjQ0OTQwNTg1NjgwPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLWRhc2hhcnJheT0iMSw1IiBkPSJNNjk2LjQxLC02OS44NUM2OTAuMjgsLTYxLjgxIDY4Mi43OCwtNTEuOTYgNjc1Ljk3LC00My4wMiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2NzguMzIsLTQxLjMzIDY2OS40NywtMzUuNDkgNjcyLjc1LC00NS41NyA2NzguMzIsLTQxLjMzIi8+CjwvZz4KPC9nPgo8L3N2Zz4K)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"5DgOVOMHSMqA"},"outputs":[],"source":["class DCGAN_D(nn.Module):\n"," def __init__(self, isize, nz, nc, ndf, ngpu, n_extra_layers=0):\n"," super(DCGAN_D, self).__init__()\n"," self.ngpu = ngpu\n"," assert isize % 16 == 0, \"isize has to be a multiple of 16\"\n","\n"," main = nn.Sequential()\n"," # inputs is nc x isize x isize\n"," main.add_module('initial:{0}-{1}:conv'.format(nc, ndf),\n"," nn.Conv2d(nc, ndf, 4, 2, 1, bias=False))\n"," main.add_module('initial:{0}:relu'.format(ndf),\n"," nn.LeakyReLU(0.2, inplace=True))\n"," csize, cndf = isize / 2, ndf\n","\n"," # Extra layers\n"," for t in range(n_extra_layers):\n"," main.add_module('extra-layers-{0}:{1}:conv'.format(t, cndf),\n"," nn.Conv2d(cndf, cndf, 3, 1, 1, bias=False))\n"," main.add_module('extra-layers-{0}:{1}:batchnorm'.format(t, cndf),\n"," nn.BatchNorm2d(cndf))\n"," main.add_module('extra-layers-{0}:{1}:relu'.format(t, cndf),\n"," nn.LeakyReLU(0.2, inplace=True))\n","\n"," while csize > 4:\n"," in_feat = cndf\n"," out_feat = cndf * 2\n"," main.add_module('pyramid:{0}-{1}:conv'.format(in_feat, out_feat),\n"," nn.Conv2d(in_feat, out_feat, 4, 2, 1, bias=False))\n"," main.add_module('pyramid:{0}:batchnorm'.format(out_feat),\n"," nn.BatchNorm2d(out_feat))\n"," main.add_module('pyramid:{0}:relu'.format(out_feat),\n"," nn.LeakyReLU(0.2, inplace=True))\n"," cndf = cndf * 2\n"," csize = csize / 2\n","\n"," # state size. K x 4 x 4\n"," main.add_module('final:{0}-{1}:conv'.format(cndf, 1),\n"," nn.Conv2d(cndf, 1, 4, 1, 0, bias=False))\n"," self.main = main\n","\n","\n"," def forward(self, inputs):\n"," if isinstance(inputs.data, torch.cuda.FloatTensor) and self.ngpu > 1:\n"," output = nn.parallel.data_parallel(self.main, inputs, range(self.ngpu))\n"," else:\n"," output = self.main(inputs)\n","\n"," output = output.mean(0)\n"," return output.view(1)"]},{"cell_type":"markdown","metadata":{"id":"2X34F3vIY-6c"},"source":["### Generateur"]},{"cell_type":"markdown","metadata":{"id":"Kg60CsB74fHR"},"source":["![netG_architecture.svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDguMS4wICgyMDIzMDcwNy4wNzM5KQogLS0+CjwhLS0gUGFnZXM6IDEgLS0+Cjxzdmcgd2lkdGg9Ijg2NHB0IiBoZWlnaHQ9IjgyNHB0Igogdmlld0JveD0iMC4wMCAwLjAwIDg2NC4wMCA4MjQuMzUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgo8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMC45MzMwNDUgMC45MzMwNDUpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA4NzkuNSkiPgo8cG9seWdvbiBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSJub25lIiBwb2ludHM9Ii00LDQgLTQsLTg3OS41IDkyMiwtODc5LjUgOTIyLDQgLTQsNCIvPgo8IS0tIDE0MDI0NDk0MDY2MTA3MiAtLT4KPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDA2NjEwNzI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSIjY2FmZjcwIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijg0NiwtMzQuMjUgNzQwLC0zNC4yNSA3NDAsMCA4NDYsMCA4NDYsLTM0LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc5MyIgeT0iLTguNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMSwgMywgMzIsIDMyKTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MDAwMCAtLT4KPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODAwMDA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iODQwLC05Mi41IDc0NiwtOTIuNSA3NDYsLTcwLjI1IDg0MCwtNzAuMjUgODQwLC05Mi41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc5MyIgeT0iLTc5IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5UYW5oQmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgwMDAwJiM0NTsmZ3Q7MTQwMjQ0OTQwNjYxMDcyIC0tPgo8ZyBpZD0iZWRnZTMxIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODAwMDAmIzQ1OyZndDsxNDAyNDQ5NDA2NjEwNzI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNzkzLC02OS44MkM3OTMsLTYzLjA2IDc5MywtNTMuOTcgNzkzLC00NS4zIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc5Ni41LC00NS4zNiA3OTMsLTM1LjM2IDc4OS41LC00NS4zNiA3OTYuNSwtNDUuMzYiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MDQzMiAtLT4KPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODA0MzI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iODYxLC0xNTAuNzUgNzI1LC0xNTAuNzUgNzI1LC0xMjguNSA4NjEsLTEyOC41IDg2MSwtMTUwLjc1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc5MyIgeT0iLTEzNy4yNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+Q29udm9sdXRpb25CYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODA0MzImIzQ1OyZndDsxNDAyNDQ5NDM1ODAwMDAgLS0+CjxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgwNDMyJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgwMDAwPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTc5MywtMTI4LjA0Qzc5MywtMTIxLjIxIDc5MywtMTEyLjA3IDc5MywtMTAzLjc3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc5Ni41LC0xMDMuOTEgNzkzLC05My45MSA3ODkuNSwtMTAzLjkxIDc5Ni41LC0xMDMuOTEiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3ODMyMCAtLT4KPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzgzMjA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzc1LC0yMDkgNjgxLC0yMDkgNjgxLC0xODYuNzUgNzc1LC0xODYuNzUgNzc1LC0yMDkiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzI4IiB5PSItMTk1LjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPlJlbHVCYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1NzgzMjAmIzQ1OyZndDsxNDAyNDQ5NDM1ODA0MzIgLS0+CjxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTc4MzIwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgwNDMyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTc0MC4yMywtMTg2LjI5Qzc0OS40LC0xNzguMzYgNzYyLjE1LC0xNjcuMzIgNzcyLjgyLC0xNTguMDkiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzc0LjU2LC0xNjAuMzUgNzc5LjgzLC0xNTEuMTYgNzY5Ljk4LC0xNTUuMDUgNzc0LjU2LC0xNjAuMzUiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MDE5MiAtLT4KPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODAxOTI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iODAwLC0yNzMuMjUgNjQwLC0yNzMuMjUgNjQwLC0yNTEgODAwLC0yNTEgODAwLC0yNzMuMjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzIwIiB5PSItMjU5Ljc1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5OYXRpdmVCYXRjaE5vcm1CYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODAxOTImIzQ1OyZndDsxNDAyNDQ5NDM1NzgzMjAgLS0+CjxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgwMTkyJiM0NTsmZ3Q7MTQwMjQ0OTQzNTc4MzIwPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTcyMS4zNiwtMjUwLjU3QzcyMi40MywtMjQyLjIgNzIzLjk3LC0yMzAuMjQgNzI1LjI5LC0yMTkuOTMiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzI4Ljg2LC0yMjAuNjQgNzI2LjY2LC0yMTAuMjggNzIxLjkyLC0yMTkuNzUgNzI4Ljg2LC0yMjAuNjQiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3Njg4MCAtLT4KPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzY4ODA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNjUyLC0zMzcuNSA1MTYsLTMzNy41IDUxNiwtMzE1LjI1IDY1MiwtMzE1LjI1IDY1MiwtMzM3LjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTg0IiB5PSItMzI0IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5Db252b2x1dGlvbkJhY2t3YXJkMDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3Njg4MCYjNDU7Jmd0OzE0MDI0NDk0MzU4MDE5MiAtLT4KPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzY4ODAmIzQ1OyZndDsxNDAyNDQ5NDM1ODAxOTI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjA3LjA3LC0zMTQuODJDNjI5LjA1LC0zMDQuNzUgNjYyLjM3LC0yODkuNSA2ODcuMTIsLTI3OC4xNyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2ODguMTgsLTI4MS4wOCA2OTUuODIsLTI3My43NCA2ODUuMjcsLTI3NC43MiA2ODguMTgsLTI4MS4wOCIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyMjA4IC0tPgo8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjIwODwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1MjgsLTQwMS43NSA0MzQsLTQwMS43NSA0MzQsLTM3OS41IDUyOCwtMzc5LjUgNTI4LC00MDEuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDgxIiB5PSItMzg4LjI1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5SZWx1QmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyMjA4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc2ODgwIC0tPgo8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjIwOCYjNDU7Jmd0OzE0MDI0NDk0MzU3Njg4MDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00OTguNDcsLTM3OS4wN0M1MTQuNTMsLTM2OS4zNiA1MzguNTcsLTM1NC44MyA1NTcuMDgsLTM0My42NSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1NTguNjksLTM0Ni4xNSA1NjUuNDQsLTMzNy45OSA1NTUuMDcsLTM0MC4xNiA1NTguNjksLTM0Ni4xNSIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyMDE2IC0tPgo8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjAxNjwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1NDMsLTQ3MiAzODMsLTQ3MiAzODMsLTQ0OS43NSA1NDMsLTQ0OS43NSA1NDMsLTQ3MiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NjMiIHk9Ii00NTguNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+TmF0aXZlQmF0Y2hOb3JtQmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyMDE2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyMjA4IC0tPgo8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjAxNiYjNDU7Jmd0OzE0MDI0NDk0MzU4MjIwODwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00NjUuNzMsLTQ0OS41MUM0NjguMzIsLTQzOS42OSA0NzIuMjksLTQyNC42NSA0NzUuNTMsLTQxMi4zNyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0NzkuMDcsLTQxMy42NSA0NzguMjQsLTQwMy4wOSA0NzIuMzEsLTQxMS44NyA0NzkuMDcsLTQxMy42NSIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc3ODg4IC0tPgo8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU3Nzg4ODwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzOTUsLTUzNi4yNSAyNTksLTUzNi4yNSAyNTksLTUxNCAzOTUsLTUxNCAzOTUsLTUzNi4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjciIHk9Ii01MjIuNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkNvbnZvbHV0aW9uQmFja3dhcmQwPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc3ODg4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyMDE2IC0tPgo8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU3Nzg4OCYjNDU7Jmd0OzE0MDI0NDk0MzU4MjAxNjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zNTAuMDcsLTUxMy41N0MzNzIuMDUsLTUwMy41IDQwNS4zNywtNDg4LjI1IDQzMC4xMiwtNDc2LjkyIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQzMS4xOCwtNDc5LjgzIDQzOC44MiwtNDcyLjQ5IDQyOC4yNywtNDczLjQ3IDQzMS4xOCwtNDc5LjgzIi8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODMwMjQgLS0+CjxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MzAyNDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyNzAsLTYwMC41IDE3NiwtNjAwLjUgMTc2LC01NzguMjUgMjcwLC01NzguMjUgMjcwLC02MDAuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjMiIHk9Ii01ODciIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPlJlbHVCYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODMwMjQmIzQ1OyZndDsxNDAyNDQ5NDM1Nzc4ODggLS0+CjxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgzMDI0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc3ODg4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTI0MC42NCwtNTc3LjgyQzI1Ni45MywtNTY4LjA3IDI4MS4zNSwtNTUzLjQ1IDMwMC4wNywtNTQyLjI0Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMwMS40OSwtNTQ0Ljg4IDMwOC4yNywtNTM2Ljc0IDI5Ny44OSwtNTM4Ljg3IDMwMS40OSwtNTQ0Ljg4Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1Nzc3NDQgLS0+CjxnIGlkPSJub2RlMTEiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzU3Nzc0NDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyODQsLTY3MC43NSAxMjQsLTY3MC43NSAxMjQsLTY0OC41IDI4NCwtNjQ4LjUgMjg0LC02NzAuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjA0IiB5PSItNjU3LjI1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5OYXRpdmVCYXRjaE5vcm1CYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1Nzc3NDQmIzQ1OyZndDsxNDAyNDQ5NDM1ODMwMjQgLS0+CjxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTc3NzQ0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgzMDI0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIwNi44OSwtNjQ4LjI2QzIwOS42MiwtNjM4LjQ0IDIxMy44MSwtNjIzLjQgMjE3LjIzLC02MTEuMTIiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjIwLjc4LC02MTIuNDEgMjIwLjA5LC02MDEuODQgMjE0LjAzLC02MTAuNTMgMjIwLjc4LC02MTIuNDEiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3NzAyNCAtLT4KPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTc3MDI0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjEzNiwtNzM1IDAsLTczNSAwLC03MTIuNzUgMTM2LC03MTIuNzUgMTM2LC03MzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjgiIHk9Ii03MjEuNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+Q29udm9sdXRpb25CYWNrd2FyZDA8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1NzcwMjQmIzQ1OyZndDsxNDAyNDQ5NDM1Nzc3NDQgLS0+CjxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU3NzAyNCYjNDU7Jmd0OzE0MDI0NDk0MzU3Nzc0NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik05MS4wNywtNzEyLjMyQzExMy4wNSwtNzAyLjI1IDE0Ni4zNywtNjg3IDE3MS4xMiwtNjc1LjY3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE3Mi4xOCwtNjc4LjU4IDE3OS44MiwtNjcxLjI0IDE2OS4yNywtNjcyLjIyIDE3Mi4xOCwtNjc4LjU4Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM2MDI5NzYgLS0+CjxnIGlkPSJub2RlMTMiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzYwMjk3NjwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxMTgsLTc5OS4yNSAxOCwtNzk5LjI1IDE4LC03NzcgMTE4LC03NzcgMTE4LC03OTkuMjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjgiIHk9Ii03ODUuNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkFjY3VtdWxhdGVHcmFkPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNjAyOTc2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc3MDI0IC0tPgo8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM2MDI5NzYmIzQ1OyZndDsxNDAyNDQ5NDM1NzcwMjQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjgsLTc3Ni41N0M2OCwtNzY4LjI5IDY4LC03NTYuNSA2OCwtNzQ2LjI3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjcxLjUsLTc0Ni4yOCA2OCwtNzM2LjI4IDY0LjUsLTc0Ni4yOCA3MS41LC03NDYuMjgiLz4KPC9nPgo8IS0tIDE0MDI0NDk1MjgzOTA4OCAtLT4KPGcgaWQ9Im5vZGUxNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTUyODM5MDg4PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRibHVlIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjEyNywtODc1LjUgOSwtODc1LjUgOSwtODQxLjI1IDEyNywtODQxLjI1IDEyNywtODc1LjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjgiIHk9Ii04NTAiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMTAwLCAxMjgsIDQsIDQpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUyODM5MDg4JiM0NTsmZ3Q7MTQwMjQ0OTQzNjAyOTc2IC0tPgo8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTI4MzkwODgmIzQ1OyZndDsxNDAyNDQ5NDM2MDI5NzY8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjgsLTg0MC44NUM2OCwtODMxLjY1IDY4LC04MjAuMSA2OCwtODEwLjI1Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjcxLjUsLTgxMC4zNSA2OCwtODAwLjM1IDY0LjUsLTgxMC4zNSA3MS41LC04MTAuMzUiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDEyOCAtLT4KPGcgaWQ9Im5vZGUxNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTg0MTI4PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjI1NCwtNzM1IDE1NCwtNzM1IDE1NCwtNzEyLjc1IDI1NCwtNzEyLjc1IDI1NCwtNzM1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNCIgeT0iLTcyMS41IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5BY2N1bXVsYXRlR3JhZDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDEyOCYjNDU7Jmd0OzE0MDI0NDk0MzU3Nzc0NCAtLT4KPGcgaWQ9ImVkZ2UxMyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTg0MTI4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc3NzQ0PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIwNCwtNzEyLjMyQzIwNCwtNzA0LjA0IDIwNCwtNjkyLjI1IDIwNCwtNjgyLjAyIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjIwNy41LC02ODIuMDMgMjA0LC02NzIuMDMgMjAwLjUsLTY4Mi4wMyAyMDcuNSwtNjgyLjAzIi8+CjwvZz4KPCEtLSAxNDAyNDQ5NTI4NDE5NjggLS0+CjxnIGlkPSJub2RlMTYiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1Mjg0MTk2ODwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyMzEsLTgwNS4yNSAxNzcsLTgwNS4yNSAxNzcsLTc3MSAyMzEsLTc3MSAyMzEsLTgwNS4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDQiIHk9Ii03NzkuNzUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMTI4KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1Mjg0MTk2OCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDEyOCAtLT4KPGcgaWQ9ImVkZ2UxNCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUyODQxOTY4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTg0MTI4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIwNCwtNzcwLjc3QzIwNCwtNzYzLjIyIDIwNCwtNzU0LjE2IDIwNCwtNzQ2LjA5Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjIwNy41LC03NDYuMjcgMjA0LC03MzYuMjcgMjAwLjUsLTc0Ni4yNyAyMDcuNSwtNzQ2LjI3Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NDM2MDE5MjAgLS0+CjxnIGlkPSJub2RlMTciIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk0MzYwMTkyMDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzNzIsLTczNSAyNzIsLTczNSAyNzIsLTcxMi43NSAzNzIsLTcxMi43NSAzNzIsLTczNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjIiIHk9Ii03MjEuNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM2MDE5MjAmIzQ1OyZndDsxNDAyNDQ5NDM1Nzc3NDQgLS0+CjxnIGlkPSJlZGdlMTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzYwMTkyMCYjNDU7Jmd0OzE0MDI0NDk0MzU3Nzc0NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zMDEuOTgsLTcxMi4zMkMyODMuMjUsLTcwMi40MyAyNTUuMDMsLTY4Ny41NSAyMzMuNjgsLTY3Ni4yOCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyMzUuNTksLTY3Mi44MSAyMjUuMTIsLTY3MS4yNCAyMzIuMzMsLTY3OSAyMzUuNTksLTY3Mi44MSIvPgo8L2c+CjwhLS0gMTQwMjQ0OTUyODM5MjgwIC0tPgo8ZyBpZD0ibm9kZTE4IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NTI4MzkyODA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGJsdWUiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzQ5LC04MDUuMjUgMjk1LC04MDUuMjUgMjk1LC03NzEgMzQ5LC03NzEgMzQ5LC04MDUuMjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzIyIiB5PSItNzc5Ljc1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDEyOCk8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NTI4MzkyODAmIzQ1OyZndDsxNDAyNDQ5NDM2MDE5MjAgLS0+CjxnIGlkPSJlZGdlMTYiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk1MjgzOTI4MCYjNDU7Jmd0OzE0MDI0NDk0MzYwMTkyMDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zMjIsLTc3MC43N0MzMjIsLTc2My4yMiAzMjIsLTc1NC4xNiAzMjIsLTc0Ni4wOSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzMjUuNSwtNzQ2LjI3IDMyMiwtNzM2LjI3IDMxOC41LC03NDYuMjcgMzI1LjUsLTc0Ni4yNyIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTgyNDk2IC0tPgo8ZyBpZD0ibm9kZTE5IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1ODI0OTY8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzk4LC02MDAuNSAyOTgsLTYwMC41IDI5OCwtNTc4LjI1IDM5OCwtNTc4LjI1IDM5OCwtNjAwLjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzQ4IiB5PSItNTg3IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5BY2N1bXVsYXRlR3JhZDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MjQ5NiYjNDU7Jmd0OzE0MDI0NDk0MzU3Nzg4OCAtLT4KPGcgaWQ9ImVkZ2UxNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTgyNDk2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc3ODg4PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTM0NC40NCwtNTc3LjgyQzM0MS41OCwtNTY5LjM2IDMzNy40OSwtNTU3LjIzIDMzMy45OSwtNTQ2Ljg1Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMzNy4wMiwtNTQ1Ljg5IDMzMC41MSwtNTM3LjUzIDMzMC4zOSwtNTQ4LjEyIDMzNy4wMiwtNTQ1Ljg5Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjM1MzYgLS0+CjxnIGlkPSJub2RlMjAiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMzUzNjwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0MTQsLTY3Ni43NSAzMDIsLTY3Ni43NSAzMDIsLTY0Mi41IDQxNCwtNjQyLjUgNDE0LC02NzYuNzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU4IiB5PSItNjUxLjI1IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj4gKDEyOCwgNjQsIDQsIDQpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIzNTM2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyNDk2IC0tPgo8ZyBpZD0iZWRnZTE4IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjM1MzYmIzQ1OyZndDsxNDAyNDQ5NDM1ODI0OTY8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzU1LjU4LC02NDIuMUMzNTQuMjIsLTYzMi44IDM1Mi41LC02MjEuMSAzNTEuMDUsLTYxMS4xOCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzNTQuNDEsLTYxMC45OSAzNDkuNSwtNjAxLjYgMzQ3LjQ5LC02MTIgMzU0LjQxLC02MTAuOTkiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MjgzMiAtLT4KPGcgaWQ9Im5vZGUyMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgyODMyPC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjUxMywtNTM2LjI1IDQxMywtNTM2LjI1IDQxMywtNTE0IDUxMywtNTE0IDUxMywtNTM2LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ2MyIgeT0iLTUyMi43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODI4MzImIzQ1OyZndDsxNDAyNDQ5NDM1ODIwMTYgLS0+CjxnIGlkPSJlZGdlMTkiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjgzMiYjNDU7Jmd0OzE0MDI0NDk0MzU4MjAxNjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00NjMsLTUxMy41N0M0NjMsLTUwNS4yOSA0NjMsLTQ5My41IDQ2MywtNDgzLjI3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQ2Ni41LC00ODMuMjggNDYzLC00NzMuMjggNDU5LjUsLTQ4My4yOCA0NjYuNSwtNDgzLjI4Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjM0NDAgLS0+CjxnIGlkPSJub2RlMjIiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMzQ0MDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI0OTAsLTYwNi41IDQzNiwtNjA2LjUgNDM2LC01NzIuMjUgNDkwLC01NzIuMjUgNDkwLC02MDYuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NjMiIHk9Ii01ODEiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoNjQpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIzNDQwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyODMyIC0tPgo8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjM0NDAmIzQ1OyZndDsxNDAyNDQ5NDM1ODI4MzI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDYzLC01NzIuMDJDNDYzLC01NjQuNDcgNDYzLC01NTUuNDEgNDYzLC01NDcuMzQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDY2LjUsLTU0Ny41MiA0NjMsLTUzNy41MiA0NTkuNSwtNTQ3LjUyIDQ2Ni41LC01NDcuNTIiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4MjkyOCAtLT4KPGcgaWQ9Im5vZGUyMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTgyOTI4PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjYzMSwtNTM2LjI1IDUzMSwtNTM2LjI1IDUzMSwtNTE0IDYzMSwtNTE0IDYzMSwtNTM2LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU4MSIgeT0iLTUyMi43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1ODI5MjgmIzQ1OyZndDsxNDAyNDQ5NDM1ODIwMTYgLS0+CjxnIGlkPSJlZGdlMjEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU4MjkyOCYjNDU7Jmd0OzE0MDI0NDk0MzU4MjAxNjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik01NjAuOTgsLTUxMy41N0M1NDIuMjUsLTUwMy42OCA1MTQuMDMsLTQ4OC44IDQ5Mi42OCwtNDc3LjUzIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQ5NC41OSwtNDc0LjA2IDQ4NC4xMiwtNDcyLjQ5IDQ5MS4zMywtNDgwLjI1IDQ5NC41OSwtNDc0LjA2Ii8+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjMzNDQgLS0+CjxnIGlkPSJub2RlMjQiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMzM0NDwvdGl0bGU+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Ymx1ZSIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI2MDgsLTYwNi41IDU1NCwtNjA2LjUgNTU0LC01NzIuMjUgNjA4LC01NzIuMjUgNjA4LC02MDYuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1ODEiIHk9Ii01ODEiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoNjQpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIzMzQ0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgyOTI4IC0tPgo8ZyBpZD0iZWRnZTIyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjMzNDQmIzQ1OyZndDsxNDAyNDQ5NDM1ODI5Mjg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNTgxLC01NzIuMDJDNTgxLC01NjQuNDcgNTgxLC01NTUuNDEgNTgxLC01NDcuMzQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTg0LjUsLTU0Ny41MiA1ODEsLTUzNy41MiA1NzcuNSwtNTQ3LjUyIDU4NC41LC01NDcuNTIiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3ODQxNiAtLT4KPGcgaWQ9Im5vZGUyNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTc4NDE2PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjY1NSwtNDAxLjc1IDU1NSwtNDAxLjc1IDU1NSwtMzc5LjUgNjU1LC0zNzkuNSA2NTUsLTQwMS43NSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2MDUiIHk9Ii0zODguMjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPkFjY3VtdWxhdGVHcmFkPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc4NDE2JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc2ODgwIC0tPgo8ZyBpZD0iZWRnZTIzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1Nzg0MTYmIzQ1OyZndDsxNDAyNDQ5NDM1NzY4ODA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNjAxLjQ0LC0zNzkuMDdDNTk4LjU4LC0zNzAuNjEgNTk0LjQ5LC0zNTguNDggNTkwLjk5LC0zNDguMSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI1OTQuMDIsLTM0Ny4xNCA1ODcuNTEsLTMzOC43OCA1ODcuMzksLTM0OS4zNyA1OTQuMDIsLTM0Ny4xNCIvPgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIyOTYwIC0tPgo8ZyBpZD0ibm9kZTI2IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjI5NjA8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGJsdWUiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNjY3LC00NzggNTYxLC00NzggNTYxLC00NDMuNzUgNjY3LC00NDMuNzUgNjY3LC00NzgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjE0IiB5PSItNDUyLjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoNjQsIDMyLCA0LCA0KTwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk1MzEyMjk2MCYjNDU7Jmd0OzE0MDI0NDk0MzU3ODQxNiAtLT4KPGcgaWQ9ImVkZ2UyNCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTUzMTIyOTYwJiM0NTsmZ3Q7MTQwMjQ0OTQzNTc4NDE2PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTYxMS44MiwtNDQzLjM1QzYxMC42MSwtNDM0LjE1IDYwOS4wOSwtNDIyLjYgNjA3Ljc5LC00MTIuNzUiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNjExLjEzLC00MTIuMzEgNjA2LjM1LC00MDIuODUgNjA0LjE5LC00MTMuMjIgNjExLjEzLC00MTIuMzEiLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3NjMwNCAtLT4KPGcgaWQ9Im5vZGUyNyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTc2MzA0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc3MCwtMzM3LjUgNjcwLC0zMzcuNSA2NzAsLTMxNS4yNSA3NzAsLTMxNS4yNSA3NzAsLTMzNy41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjcyMCIgeT0iLTMyNCIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+QWNjdW11bGF0ZUdyYWQ8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NDM1NzYzMDQmIzQ1OyZndDsxNDAyNDQ5NDM1ODAxOTIgLS0+CjxnIGlkPSJlZGdlMjUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk0MzU3NjMwNCYjNDU7Jmd0OzE0MDI0NDk0MzU4MDE5MjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik03MjAsLTMxNC44MkM3MjAsLTMwNi41NCA3MjAsLTI5NC43NSA3MjAsLTI4NC41MiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI3MjMuNSwtMjg0LjUzIDcyMCwtMjc0LjUzIDcxNi41LC0yODQuNTMgNzIzLjUsLTI4NC41MyIvPgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIyODY0IC0tPgo8ZyBpZD0ibm9kZTI4IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjI4NjQ8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGJsdWUiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNzQ3LC00MDcuNzUgNjkzLC00MDcuNzUgNjkzLC0zNzMuNSA3NDcsLTM3My41IDc0NywtNDA3Ljc1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjcyMCIgeT0iLTM4Mi4yNSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICgzMik8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjI4NjQmIzQ1OyZndDsxNDAyNDQ5NDM1NzYzMDQgLS0+CjxnIGlkPSJlZGdlMjYiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMjg2NCYjNDU7Jmd0OzE0MDI0NDk0MzU3NjMwNDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik03MjAsLTM3My4yN0M3MjAsLTM2NS43MiA3MjAsLTM1Ni42NiA3MjAsLTM0OC41OSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI3MjMuNSwtMzQ4Ljc3IDcyMCwtMzM4Ljc3IDcxNi41LC0zNDguNzcgNzIzLjUsLTM0OC43NyIvPgo8L2c+CjwhLS0gMTQwMjQ0OTQzNTc1ODcyIC0tPgo8ZyBpZD0ibm9kZTI5IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xNDAyNDQ5NDM1NzU4NzI8L3RpdGxlPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iODg4LC0zMzcuNSA3ODgsLTMzNy41IDc4OCwtMzE1LjI1IDg4OCwtMzE1LjI1IDg4OCwtMzM3LjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iODM4IiB5PSItMzI0IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5BY2N1bXVsYXRlR3JhZDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU3NTg3MiYjNDU7Jmd0OzE0MDI0NDk0MzU4MDE5MiAtLT4KPGcgaWQ9ImVkZ2UyNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTc1ODcyJiM0NTsmZ3Q7MTQwMjQ0OTQzNTgwMTkyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTgxNy45OCwtMzE0LjgyQzc5OS4yNSwtMzA0LjkzIDc3MS4wMywtMjkwLjA1IDc0OS42OCwtMjc4Ljc4Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijc1MS41OSwtMjc1LjMxIDc0MS4xMiwtMjczLjc0IDc0OC4zMywtMjgxLjUgNzUxLjU5LC0yNzUuMzEiLz4KPC9nPgo8IS0tIDE0MDI0NDk1MzEyMjc2OCAtLT4KPGcgaWQ9Im5vZGUzMCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTUzMTIyNzY4PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRibHVlIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9Ijg2NSwtNDA3Ljc1IDgxMSwtNDA3Ljc1IDgxMSwtMzczLjUgODY1LC0zNzMuNSA4NjUsLTQwNy43NSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4MzgiIHk9Ii0zODIuMjUiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAuMDAiPiAoMzIpPC90ZXh0Pgo8L2c+CjwhLS0gMTQwMjQ0OTUzMTIyNzY4JiM0NTsmZ3Q7MTQwMjQ0OTQzNTc1ODcyIC0tPgo8ZyBpZD0iZWRnZTI4IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xNDAyNDQ5NTMxMjI3NjgmIzQ1OyZndDsxNDAyNDQ5NDM1NzU4NzI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNODM4LC0zNzMuMjdDODM4LC0zNjUuNzIgODM4LC0zNTYuNjYgODM4LC0zNDguNTkiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iODQxLjUsLTM0OC43NyA4MzgsLTMzOC43NyA4MzQuNSwtMzQ4Ljc3IDg0MS41LC0zNDguNzciLz4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDk0NCAtLT4KPGcgaWQ9Im5vZGUzMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTQzNTg0OTQ0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjkwOSwtMjA5IDgwOSwtMjA5IDgwOSwtMTg2Ljc1IDkwOSwtMTg2Ljc1IDkwOSwtMjA5Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijg1OSIgeT0iLTE5NS41IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmb250LXNpemU9IjEwLjAwIj5BY2N1bXVsYXRlR3JhZDwvdGV4dD4KPC9nPgo8IS0tIDE0MDI0NDk0MzU4NDk0NCYjNDU7Jmd0OzE0MDI0NDk0MzU4MDQzMiAtLT4KPGcgaWQ9ImVkZ2UyOSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MTQwMjQ0OTQzNTg0OTQ0JiM0NTsmZ3Q7MTQwMjQ0OTQzNTgwNDMyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTg0Ni41OSwtMTg2LjI5QzgzNy4yOCwtMTc4LjM2IDgyNC4zMiwtMTY3LjMyIDgxMy40OSwtMTU4LjA5Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjgxNi4yNCwtMTU0Ljk4IDgwNi4zNiwtMTUxLjE2IDgxMS43LC0xNjAuMzEgODE2LjI0LC0xNTQuOTgiLz4KPC9nPgo8IS0tIDE0MDI0NDk1MzEyMTQyNCAtLT4KPGcgaWQ9Im5vZGUzMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTQwMjQ0OTUzMTIxNDI0PC90aXRsZT4KPHBvbHlnb24gZmlsbD0ibGlnaHRibHVlIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjkxOCwtMjc5LjI1IDgxOCwtMjc5LjI1IDgxOCwtMjQ1IDkxOCwtMjQ1IDkxOCwtMjc5LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijg2OCIgeT0iLTI1My43NSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZm9udC1zaXplPSIxMC4wMCI+ICgzMiwgMywgNCwgNCk8L3RleHQ+CjwvZz4KPCEtLSAxNDAyNDQ5NTMxMjE0MjQmIzQ1OyZndDsxNDAyNDQ5NDM1ODQ5NDQgLS0+CjxnIGlkPSJlZGdlMzAiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjE0MDI0NDk1MzEyMTQyNCYjNDU7Jmd0OzE0MDI0NDk0MzU4NDk0NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik04NjUuNjQsLTI0NC43N0M4NjQuNTQsLTIzNy4yMiA4NjMuMjMsLTIyOC4xNiA4NjIuMDcsLTIyMC4wOSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI4NjUuNCwtMjE5LjY2IDg2MC41LC0yMTAuMjcgODU4LjQ3LC0yMjAuNjcgODY1LjQsLTIxOS42NiIvPgo8L2c+CjwvZz4KPC9zdmc+Cg==)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"CiqFCjoAYtBq"},"outputs":[],"source":["class DCGAN_G(nn.Module):\n"," def __init__(self, isize, nz, nc, ngf, ngpu, n_extra_layers=0):\n"," super(DCGAN_G, self).__init__()\n"," self.ngpu = ngpu\n"," assert isize % 16 == 0, \"isize has to be a multiple of 16\"\n","\n"," cngf, tisize = ngf//2, 4\n"," while tisize != isize:\n"," cngf = cngf * 2\n"," tisize = tisize * 2\n","\n"," main = nn.Sequential()\n"," # inputs is Z, going into a convolution\n"," main.add_module('initial:{0}-{1}:convt'.format(nz, cngf),\n"," nn.ConvTranspose2d(nz, cngf, 4, 1, 0, bias=False))\n"," main.add_module('initial:{0}:batchnorm'.format(cngf),\n"," nn.BatchNorm2d(cngf))\n"," main.add_module('initial:{0}:relu'.format(cngf),\n"," nn.ReLU(True))\n","\n"," csize, cndf = 4, cngf\n"," while csize < isize//2:\n"," main.add_module('pyramid:{0}-{1}:convt'.format(cngf, cngf//2),\n"," nn.ConvTranspose2d(cngf, cngf//2, 4, 2, 1, bias=False))\n"," main.add_module('pyramid:{0}:batchnorm'.format(cngf//2),\n"," nn.BatchNorm2d(cngf//2))\n"," main.add_module('pyramid:{0}:relu'.format(cngf//2),\n"," nn.ReLU(True))\n"," cngf = cngf // 2\n"," csize = csize * 2\n","\n"," # Extra layers\n"," for t in range(n_extra_layers):\n"," main.add_module('extra-layers-{0}:{1}:conv'.format(t, cngf),\n"," nn.Conv2d(cngf, cngf, 3, 1, 1, bias=False))\n"," main.add_module('extra-layers-{0}:{1}:batchnorm'.format(t, cngf),\n"," nn.BatchNorm2d(cngf))\n"," main.add_module('extra-layers-{0}:{1}:relu'.format(t, cngf),\n"," nn.ReLU(True))\n","\n"," main.add_module('final:{0}-{1}:convt'.format(cngf, nc),\n"," nn.ConvTranspose2d(cngf, nc, 4, 2, 1, bias=False))\n"," main.add_module('final:{0}:tanh'.format(nc),\n"," nn.Tanh())\n"," self.main = main\n","\n"," def forward(self, inputs):\n"," if isinstance(inputs.data, torch.cuda.FloatTensor) and self.ngpu > 1:\n"," output = nn.parallel.data_parallel(self.main, inputs, range(self.ngpu))\n"," else:\n"," output = self.main(inputs)\n"," return output"]},{"cell_type":"markdown","metadata":{"id":"zyRrm3ClUMX1"},"source":["## Entrainement\n","\n","Voici un exemple de code qui permettrait l'entraînement de notre modèle et la configuration de celui-ci."]},{"cell_type":"markdown","metadata":{"id":"PhynHzMXXEyP"},"source":["### Options pour l'exécution"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"zkk11X5zSQLK"},"outputs":[],"source":["# Path to dataset\n","opt_dataroot = 'data/faces'\n","# Number of data loading workers\n","opt_workers = 2\n","# inputs batch size\n","opt_batchSize = 64\n","# The height / width of the inputs image to network\n","opt_imageSize = 32\n","# inputs image channels\n","nc = 3\n","# Size of the latent z vector\n","nz = 100\n","# Size of feature maps in generator\n","ngf = 32\n","# Size of feature maps in discriminator\n","ndf = 32\n","# Number of epochs to train for\n","opt_niter = 25\n","# Learning rate for Discriminator\n","opt_lrD = 0.00005\n","# Learning rate for Generator\n","opt_lrG = 0.00005\n","# beta1 for adam.\n","opt_beta1 = 0.5\n","# Lower value clamp for Discriminator weights\n","opt_clamp_lower = -0.01\n","# Upper value clamp for Discriminator weights\n","opt_clamp_upper = 0.01\n","# Number of D iters per each G iter\n","opt_Diters = 5\n","# Where to store samples and models\n","opt_experiment = 'samples'"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"LVYpQv-_tFsK"},"outputs":[],"source":["# Use CUDA if a GPU is available\n","opt_cuda = False\n","\n","opt_cuda_resp = input(\"Use cuda? (y/n)\\n{} by default\\n\".format(opt_cuda))\n","\n","# Use CUDA if a GPU is available\n","opt_cuda = True if opt_cuda_resp == 'y' else opt_cuda\n","# Number of GPUs to use for running the model if CUDA is enabled\n","ngpu = 1"]},{"cell_type":"markdown","metadata":{"id":"Ggb5i2jsX1jp"},"source":["### Configuration du modèle"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"ENkqSYs2Tbj9"},"outputs":[],"source":["os.system('mkdir {0}'.format(opt_experiment))\n","\n","opt_manualSeed = random.randint(1, 10000) # fix seed\n","print(\"Random Seed: \", opt_manualSeed)\n","random.seed(opt_manualSeed)\n","torch.manual_seed(opt_manualSeed)\n","\n","cudnn.benchmark = True\n","\n","# folder dataset\n","dataset = dset.ImageFolder(root=opt_dataroot,\n"," transform=transforms.Compose([\n"," transforms.Resize(opt_imageSize),\n"," transforms.CenterCrop(opt_imageSize),\n"," transforms.ToTensor(),\n"," transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),\n"," ]))\n","assert dataset\n","dataloader = torch.utils.data.DataLoader(dataset, batch_size=opt_batchSize,\n"," shuffle=True, num_workers=int(opt_workers))\n","\n","# custom weights initialization called on netG and netD\n","def weights_init(m):\n"," classname = m.__class__.__name__\n"," if classname.find('Conv') != -1:\n"," m.weight.data.normal_(0.0, 0.02)\n"," elif classname.find('BatchNorm') != -1:\n"," m.weight.data.normal_(1.0, 0.02)\n"," m.bias.data.fill_(0)\n","\n","netG = DCGAN_G(opt_imageSize, nz, nc, ngf, ngpu)\n","\n","netG.apply(weights_init)\n","print(netG)\n","\n","netD = DCGAN_D(opt_imageSize, nz, nc, ndf, ngpu)\n","netD.apply(weights_init)\n","\n","print(netD)\n","\n","inputs = torch.FloatTensor(opt_batchSize, 3, opt_imageSize, opt_imageSize)\n","noise = torch.FloatTensor(opt_batchSize, nz, 1, 1)\n","fixed_noise = torch.FloatTensor(opt_batchSize, nz, 1, 1).normal_(0, 1)\n","one = torch.FloatTensor([1])\n","mone = one * -1\n","\n","if opt_cuda:\n"," netD.cuda()\n"," netG.cuda()\n"," inputs = inputs.cuda()\n"," one, mone = one.cuda(), mone.cuda()\n"," noise, fixed_noise = noise.cuda(), fixed_noise.cuda()\n","\n","# setup optimizer\n","optimizerD = optim.RMSprop(netD.parameters(), lr = opt_lrD)\n","optimizerG = optim.RMSprop(netG.parameters(), lr = opt_lrG)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"W96oVYCkjzPR"},"outputs":[],"source":["netD_graph = make_dot(netD(Variable(torch.randn(1, 3, 32, 32))))\n","netD_graph.render(\"netD_architecture\", format=\"png\")\n","\n","netG_graph = make_dot(netG(Variable(torch.randn(1, 100, 1, 1))))\n","netG_graph.render(\"netG_architecture\", format=\"png\")"]},{"cell_type":"markdown","metadata":{"id":"YkMM0kSeX6cH"},"source":["### Entrainement du modèle"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Pf06223hTrpJ"},"outputs":[],"source":["gen_iterations = 0\n","for epoch in range(opt_niter):\n"," data_iter = iter(dataloader)\n"," i = 0\n"," while i < len(dataloader):\n"," ############################\n"," # (1) Update D network\n"," ###########################\n"," for p in netD.parameters(): # reset requires_grad\n"," p.requires_grad = True # they are set to False below in netG update\n","\n"," # train the discriminator Diters times\n"," if gen_iterations < 25 or gen_iterations % 500 == 0:\n"," Diters = 100\n"," else:\n"," Diters = opt_Diters\n"," j = 0\n"," while j < Diters and i < len(dataloader):\n"," j += 1\n","\n"," # clamp parameters to a cube\n"," for p in netD.parameters():\n"," p.data.clamp_(opt_clamp_lower, opt_clamp_upper)\n","\n"," data = next(data_iter)\n"," i += 1\n","\n"," # train with real\n"," real_cpu, _ = data\n"," netD.zero_grad()\n"," batch_size = real_cpu.size(0)\n","\n"," if opt_cuda:\n"," real_cpu = real_cpu.cuda()\n"," inputs.resize_as_(real_cpu).copy_(real_cpu)\n"," inputsv = Variable(inputs)\n","\n"," errD_real = netD(inputsv)\n"," errD_real.backward(one)\n","\n"," # train with fake\n"," noise.resize_(opt_batchSize, nz, 1, 1).normal_(0, 1)\n"," noisev = Variable(noise, volatile = True) # totally freeze netG\n"," fake = Variable(netG(noisev).data)\n"," inputsv = fake\n"," errD_fake = netD(inputsv)\n"," errD_fake.backward(mone)\n"," errD = errD_real - errD_fake\n"," optimizerD.step()\n","\n"," ############################\n"," # (2) Update G network\n"," ###########################\n"," for p in netD.parameters():\n"," p.requires_grad = False # to avoid computation\n"," netG.zero_grad()\n"," # in case our last batch was the tail batch of the dataloader,\n"," # make sure we feed a full batch of noise\n"," noise.resize_(opt_batchSize, nz, 1, 1).normal_(0, 1)\n"," noisev = Variable(noise)\n"," fake = netG(noisev)\n"," errG = netD(fake)\n"," errG.backward(one)\n"," optimizerG.step()\n"," gen_iterations += 1\n","\n"," print('[%d/%d][%d/%d][%d] Loss_D: %f Loss_G: %f Loss_D_real: %f Loss_D_fake %f'\n"," % (epoch, opt_niter, i, len(dataloader), gen_iterations,\n"," errD.data[0], errG.data[0], errD_real.data[0], errD_fake.data[0]))\n"," if gen_iterations % 500 == 0:\n"," real_cpu = real_cpu.mul(0.5).add(0.5)\n"," vutils.save_image(real_cpu, '{0}/real_samples.png'.format(opt_experiment))\n"," fake = netG(Variable(fixed_noise, volatile=True))\n"," fake.data = fake.data.mul(0.5).add(0.5)\n"," vutils.save_image(fake.data, '{0}/fake_samples_{1}.png'.format(opt_experiment, gen_iterations))\n","\n"," # do checkpointing\n"," torch.save(netG.state_dict(), '{0}/netG_epoch_{1}.pth'.format(opt_experiment, epoch))\n"," torch.save(netD.state_dict(), '{0}/netD_epoch_{1}.pth'.format(opt_experiment, epoch))"]},{"cell_type":"markdown","metadata":{"id":"NfPfYpS-T5DN"},"source":["## Generation\n","\n","Voici la section de code correspondant à la génération de nos images, plus tard exploitées."]},{"cell_type":"markdown","metadata":{"id":"-B6fUl2zW_Ak"},"source":["### Options pour l'exécution"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"3r_w9O_zUERu"},"outputs":[],"source":["# Number of images to generate\n","opt_nimages = 100\n","# Path to output directory\n","opt_output_dir = 'data/generated'\n","# Path to generator weights .pth file\n","opt_weights = 'samples/netG_epoch_2384.pth'"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"1smXNRDUw-5k"},"outputs":[],"source":["opt_nimages_resp = input(\"How many images to generate?\\n{} by default\\n\".format(opt_nimages))\n","opt_output_dir_resp = input(\"Where to store generated images?\\n{} by default\\n\".format(opt_output_dir))\n","\n","# Number of images to generate\n","opt_nimages = int(opt_nimages_resp) if opt_nimages_resp != '' else opt_nimages\n","# Path to output directory\n","opt_output_dir = opt_output_dir_resp if opt_output_dir_resp != '' else opt_output_dir"]},{"cell_type":"markdown","metadata":{"id":"XWGZgsuyYDet"},"source":["### Configuration du modèle"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"KLNgMfV_T7Ou"},"outputs":[],"source":["netG = DCGAN_G(opt_imageSize, nz, nc, ngf, ngpu)\n","\n","# load weights\n","if opt_cuda:\n"," netG.load_state_dict(torch.load(opt_weights, map_location=torch.device('cuda')))\n","else:\n"," netG.load_state_dict(torch.load(opt_weights, map_location=torch.device('cpu')))\n","\n","# initialize noise\n","fixed_noise = torch.FloatTensor(opt_nimages, nz, 1, 1).normal_(0, 1)\n","\n","if opt_cuda:\n"," netG.cuda()\n"," fixed_noise = fixed_noise.cuda()\n","\n","fake = netG(fixed_noise)\n","fake.data = fake.data.mul(0.5).add(0.5)\n","\n","if not os.path.exists(opt_output_dir):\n"," os.makedirs(opt_output_dir)"]},{"cell_type":"markdown","metadata":{"id":"rPU04cGsYFVz"},"source":["### Génération des images"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Jg82PIsjUH55"},"outputs":[],"source":["for i in range(opt_nimages):\n"," vutils.save_image(fake.data[i, ...].reshape((1, nc, opt_imageSize, opt_imageSize)), os.path.join(opt_output_dir, \"generated_%02d.png\"%i))"]},{"cell_type":"markdown","metadata":{"id":"ePeCi4PZJ5Ar"},"source":["## Résultats\n","L'entrainement a été réalisé à partir d'un ordinateur équipé d'un GPU accessible via internet ssh et un VPN configuré.\n","\n","Voici la commande utilisée pour effectuer la formation :\n","```shell\n","python main.py --dataset folder --dataroot data/faces --batchSize 2048 --niter 5000 --ngf 32 --ndf 32 --imageSize 32 --cuda\n","```\n","\n","et la génération :\n","```shell\n","python generate.py --config samples/generator_config.json --weight samples/netG_epoch_2384.pth --output_dir data/generated --nimages 100 --cuda\n","```\n","\n","Les fichiers Python sont ceux de l'article original. Ce sont les fichiers qui sont réutilisés et grandement simplifiés dans ce Jupyter Notebook.\n","\n","Les poids et les fichiers de configuration peuvent être téléchargés sur :\n","https://code.paul-corbalan.com/paul-corbalan/wasserstein-gan/src/branch/master/samples\n","\n","La partie verbale de l'exécution `out` est également accessible."]},{"cell_type":"markdown","metadata":{"id":"xme7UNdR678K"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"3PQ8dgt1OLyT"},"source":["Comme nous avons oublié de stocker les pertes pendant la formation, ce script a été créé pour les récupérer à partir du fichier verbeux."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"uLZ1Egi8OEAo"},"outputs":[],"source":["data = open('out', 'r').read()\n","\n","pattern = re.compile(r\"\\[(\\d+)/(\\d+)\\]\\[(\\d+)/(\\d+)\\]\\[(\\d+)\\] Loss_D: ([-+]?\\d*\\.\\d+|\\d+) Loss_G: ([-+]?\\d*\\.\\d+|\\d+) Loss_D_real: ([-+]?\\d*\\.\\d+|\\d+) Loss_D_fake ([-+]?\\d*\\.\\d+|\\d+)\")\n","\n","matches = pattern.findall(data)\n","\n","df = pd.DataFrame(matches, columns=['epoch', 'niter', 'i', 'dataloader_size', 'gen_iterations', 'Loss_D', 'Loss_G', 'Loss_D_real', 'Loss_D_fake'])\n","\n","df = df.apply(pd.to_numeric)\n","\n","plt.plot(df['gen_iterations'][::100], -df['Loss_D'][::100])\n","plt.xlabel('Generator Iterations')\n","plt.ylabel('Loss_D ~ Wasserstein Distance')\n","plt.title('Loss_D vs. Generator Iterations')\n","plt.show()"]},{"cell_type":"markdown","metadata":{"id":"en27GDwsO4J_"},"source":["Nous traçons l'évolution de la perte du discriminateur car, contrairement au GAN classique, elles sont interprétables. Il s'agit en fait d'une estimation de la distance de Wasserstein entre la distribution générée et la distribution cible. Les valeurs décroissantes sont la preuve que le modèle continue d'apprendre et n'est pas affecté par l'un des problèmes des GANs classiques."]},{"cell_type":"markdown","metadata":{"id":"fdKb4NcvNzTz"},"source":["![evolution.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkoAAAHLCAYAAAA3J7d5AAAAAXNSR0IB2cksfwAAIABJREFUeJzs3XlYlNXiB/DvsA2yCioggoi4ICkuKKuIuOC+pCalgetNK68hWT9JLSWVXCPLpbIkvVfC0kxvmuJ2xTA30PJmZqZCCiKajKKCwPv7I3h1HEZBD87r8P08z/s8znnfOefMwL18O+e851VJkiSBiIiIiHSYGLoDRERERErFoERERESkB4MSERERkR4MSkRERER6MCgRERER6cGgRERERKQHgxIRERGRHgxKRERERHowKBERERHpwaBEREREpAeDEhEREZEeDEpEREREejAoEREREenBoERERESkB4MSERERkR4MSkRERER6MCgRERER6cGgRERERKQHgxJRuaSkJKhUKhw5csTQXamyij5XHJaWlnBxcUF4eDgSEhKQl5dn6C4+1KVLl/DWW2+hXbt2sLOzg4WFBdzc3DBkyBBs3rwZpaWlhu6iMBcvXsSsWbNw7NixJ9bm3r17oVKp8PXXX8tl6enpmDVrFq5du/bE+lGZB/Wja9eu6Nq1q0H6RXQvBiUiI7B69WocOHAAqampWLZsGdq1a4f58+ejVatW2Llzp6G7p9ePP/6INm3a4NNPP8XAgQPx5ZdfYufOnXjvvfdgbm6OIUOGICkpydDdFObixYuYPXv2Ew1KlUlPT8fs2bMVEZT09WP58uVYvny5QfpFdC8zQ3eAiB5f69at0bFjR/n10KFDMWXKFHTu3BlDhgzB6dOn4ezsbNA+3u/atWsYPHgwbGxs8MMPP6Bhw4Za51988UX89NNPuHLlisH6+DC3bt2CpaUlVCqVQftx8+ZNWFlZGbQPovvh4+MjpB6ix8URJaJq2r9/P7p37w5bW1tYWVkhODgY3333ndY1N2/exNSpU+Hp6QlLS0s4OjqiY8eOSE5Olq/5448/8Pzzz8PV1RVqtRrOzs7o3r27sNGGxo0bY/Hixbh+/To+/vhjvdcdP34cKpUKn332mc65bdu2QaVSYfPmzQCAy5cv46WXXoK7uzvUajUaNGiAkJCQRxq1+vTTT3Hp0iUsWLBAJyRV8PX1RXh4uFZZbm4uJkyYADc3N1hYWMDT0xOzZ89GSUmJfM25c+egUqmwaNEiLFmyBJ6enrCxsUFQUBB+/PFHnXaOHDmCgQMHwtHREZaWlmjfvj3Wr1+vdU3FNOeOHTswduxYNGjQAFZWVigqKsLvv/+OMWPGoHnz5rCyskKjRo0wYMAA/Pzzz/L79+7di06dOgEAxowZI0+Xzpo1S75m8+bNCAoKgpWVFWxtbdGzZ08cOHBAqx+zZs2CSqVCRkYGhg0bBgcHB3h5eVX5e581axbeeOMNAICnp6fcj71798rXpKSkICgoCNbW1rCxsUGvXr2QmZmpVc/o0aNhY2ODn3/+GREREbC1tUX37t0BAKmpqRg0aBDc3NxgaWmJZs2aYcKECcjPz69yPyqbert69SpeeeUVNGrUCBYWFmjatCmmT5+OoqIiretUKhUmTZqEtWvXolWrVrCyskLbtm3xn//8R+s6kb/PZLw4okRUDf/973/Rs2dP+Pr64rPPPoNarcby5csxYMAAJCcnIzIyEgAQGxuLtWvXYs6cOWjfvj0KCwtx4sQJrdGRvn37orS0FAsWLEDjxo2Rn5+P9PR0odMhffv2hampKfbt26f3mrZt26J9+/ZYvXo1xo0bp3UuKSkJTk5O6Nu3LwAgKioKGRkZmDt3Llq0aIFr164hIyPjkUZ9UlNTYWpqKtddFbm5ufD394eJiQnefvtteHl54cCBA5gzZw7OnTuH1atXa12/bNkyeHt7IzExEQAwc+ZM9O3bF2fPnoW9vT0AYM+ePejduzcCAgKwcuVK2Nvb48svv0RkZCRu3ryJ0aNHa9U5duxY9OvXD2vXrkVhYSHMzc1x8eJF1KtXD++99x4aNGiAq1ev4osvvkBAQAAyMzPRsmVLdOjQAatXr8aYMWMwY8YM9OvXDwDg5uYGAFi3bh1GjhyJiIgIJCcno6ioCAsWLEDXrl2xa9cudO7cWasfQ4YMwfPPP4+JEyeisLCwyt/h+PHjcfXqVXz44YfYuHGjHFIrRnDmzZuHGTNmyP0sLi7GwoULERoaikOHDmmN9BQXF2PgwIGYMGECpk2bJofVM2fOICgoCOPHj4e9vT3OnTuHJUuWoHPnzvj5559hbm7+0H7c7/bt2wgPD8eZM2cwe/Zs+Pr6Ii0tDQkJCTh27JjOf6x89913OHz4MOLj42FjY4MFCxbg2WefxalTp9C0aVNA8O8zGTGJiCRJkqTVq1dLAKTDhw/rvSYwMFBycnKSrl+/LpeVlJRIrVu3ltzc3KSysjJJkiSpdevW0uDBg/XWk5+fLwGQEhMTa7zPzs7OUqtWrR5Yz9KlSyUA0qlTp+Syq1evSmq1Wnr99dflMhsbGykmJuax+lzB29tbcnFx0SkvLS2V7ty5Ix+lpaXyuQkTJkg2NjbS+fPntd6zaNEiCYD0v//9T5IkSTp79qwEQGrTpo1UUlIiX3fo0CEJgJScnKzVj/bt20t37tzRqrN///5Sw4YN5fYrvuvo6OiHfraSkhKpuLhYat68uTRlyhS5/PDhwxIAafXq1Tqf2dXVVWrTpo3W571+/brk5OQkBQcHy2XvvPOOBEB6++23H9oPSZKkPXv2SACkr776Si5buHChBEA6e/as1rVZWVmSmZmZ9M9//lOr/Pr165KLi4s0fPhwuWzUqFESAOnzzz9/YPtlZWXSnTt3pPPnz0sApG+//fah/ZAkSQoLC5PCwsLk1ytXrpQASOvXr9e6bv78+RIAaceOHXIZAMnZ2VnSaDRyWW5urmRiYiIlJCTIZSJ/n8l4ceqNqIoKCwtx8OBBDBs2DDY2NnK5qakpoqKi8Oeff+LUqVMAAH9/f2zbtg3Tpk3D3r17cevWLa26HB0d4eXlhYULF2LJkiXIzMxEWVlZjfT7778bDzZy5Eio1WqthdMVoxpjxoyRy/z9/ZGUlIQ5c+bgxx9/xJ07d4T3NzY2Fubm5vIxcOBA+dx//vMfhIeHw9XVFSUlJfLRp08foHzE7179+vWDqamp/NrX1xcAcP78eQDA77//jl9//RUjR44EAK06+/bti5ycHPlnWmHo0KE6fS4pKcG8efPg4+MDCwsLmJmZwcLCAqdPn8bJkycf+plPnTqFixcvIioqCiYmd/9v2cbGBkOHDsWPP/6ImzdvPrQfj2v79u0oKSlBdHS01ndhaWmJsLAwrem5B/UjLy8PEydOhLu7O8zMzGBubg4PDw8AqNL3UZndu3fD2toaw4YN0yqvGPHbtWuXVnl4eDhsbW3l187OznBycpJ/9nhCv8/09GNQIqqiv/76C5IkVbqextXVFQDkIfulS5fi//7v/7Bp0yaEh4fD0dERgwcPxunTp4HyNRS7du1Cr169sGDBAnTo0AENGjTA5MmTcf36dWF9LiwsxJUrV+T+6ePo6IiBAwdizZo18u34SUlJ8Pf3xzPPPCNfl5KSglGjRmHVqlUICgqCo6MjoqOjkZubW+2+NW7cGJcvX9YJAK+//joOHz6Mw4cP63zXly5dwpYtW7SClLm5udzHe9fAAEC9evW0XqvVaqB8EXZFfQAwdepUnTpfeeWVSuus7OcfGxuLmTNnYvDgwdiyZQsOHjyIw4cPo23btjohuTIVvzf6frfKysrw119/PbQfj6vi++jUqZPO95GSkqLzXVhZWcHOzk6rrKysDBEREdi4cSPefPNN7Nq1C4cOHZLXhlXl+6jMlStX4OLiorNw3snJCWZmZjrTZff/7FH+87+3fZG/z2S8uEaJqIocHBxgYmKCnJwcnXMXL14EANSvXx8AYG1tjdmzZ2P27Nm4dOmSPLo0YMAA/PrrrwAADw8PeQH1b7/9hvXr12PWrFkoLi7GypUrhfT5u+++Q2lpaZX2oxkzZgy++uorpKamonHjxjh8+DBWrFihdU39+vWRmJiIxMREZGVlYfPmzZg2bRry8vLw/fffV6tvPXv2xI4dO7B161atUQJ3d3e4u7sDACwsLHTa9/X1xdy5cyut82GB8H4VP6+4uDgMGTKk0mtatmyp9bqyO9z+9a9/ITo6GvPmzdMqz8/PR926dR/aj4o/6vp+t0xMTODg4PDQfjyuiu/j66+/lkeAHqSyPpw4cQLHjx9HUlISRo0aJZf//vvvj9W3evXq4eDBg5AkSavdvLw8lJSUyH2vDpG/z2S8GJSIqsja2hoBAQHYuHEjFi1ahDp16gDl/wX9r3/9C25ubmjRooXO+5ydnTF69GgcP34ciYmJld5C3aJFC8yYMQMbNmxARkaGkP5mZWVh6tSpsLe3x4QJEx56fUREBBo1aoTVq1ejcePGsLS0xAsvvKD3+saNG2PSpEnYtWsXfvjhh2r3b/z48Vi0aBHefPNNhISEVGmEpH///ti6dSu8vLx0gsOjaNmyJZo3b47jx4/rhJzqUKlU8mhVhe+++w4XLlxAs2bN5LL7R7Tu7UejRo2wbt06TJ06VQ4ChYWF2LBhg3wnnCj6+tGrVy+YmZnhzJkzjzy1V9H3+7+Pyu681NePynTv3h3r16/Hpk2b8Oyzz8rla9askc8/jsf9fSbjxaBEdJ/du3fj3LlzOuV9+/ZFQkICevbsifDwcEydOhUWFhZYvnw5Tpw4geTkZPmPREBAAPr37w9fX184ODjg5MmTWLt2rfwH76effsKkSZPw3HPPoXnz5rCwsMDu3bvx008/Ydq0adXu84kTJ+T1JHl5eUhLS8Pq1athamqKb775Bg0aNHhoHaampoiOjsaSJUtgZ2eHIUOGyHeGAUBBQQHCw8MxYsQIeHt7w9bWFocPH8b333+vNRoTHx+P+Ph47Nq1C2FhYXrbq1u3LjZt2oQBAwagbdu2ePnllxEYGAgbGxtcuXIF+/btQ25uLoKDg7XqTk1NRXBwMCZPnoyWLVvi9u3bOHfuHLZu3YqVK1fKd5FV1ccff4w+ffqgV69eGD16NBo1aoSrV6/i5MmTyMjIwFdfffXQOvr374+kpCR4e3vD19cXR48excKFC3X64uXlhTp16uDf//43WrVqBRsbG7i6usLV1RULFizAyJEj0b9/f0yYMAFFRUVYuHAhrl27hvfee69an+lh2rRpAwD44IMPMGrUKJibm6Nly5Zo0qQJ4uPjMX36dPzxxx/o3bs3HBwccOnSJRw6dEgeKX0Qb29veHl5Ydq0aZAkCY6OjtiyZQtSU1Or3I971xZViI6OxrJlyzBq1CicO3cObdq0wf79+zFv3jz07dsXPXr0qNZ3UNXfZyLe9UZUruKuJn1HxZ05aWlpUrdu3SRra2upTp06UmBgoLRlyxatuqZNmyZ17NhRcnBwkNRqtdS0aVNpypQpUn5+viRJknTp0iVp9OjRkre3t2RtbS3Z2NhIvr6+0vvvv691l1Z1+2xhYSE5OTlJYWFh0rx586S8vLxqfQe//fabXFdqaqrWudu3b0sTJ06UfH19JTs7O6lOnTpSy5YtpXfeeUcqLCyUr6u4K2vPnj1VajM3N1eKi4uTfH19JWtra8nc3FxydXWVBgwYIK1Zs0bnbrTLly9LkydPljw9PSVzc3PJ0dFR8vPzk6ZPny7duHFDku65623hwoU67QGQ3nnnHa2y48ePS8OHD5ecnJwkc3NzycXFRerWrZu0cuVK+ZoH3WH4119/SePGjZOcnJwkKysrqXPnzlJaWprOnVuSJEnJycmSt7e3ZG5urtOXTZs2SQEBAZKlpaVkbW0tde/eXfrhhx+03l/x/V6+fLlK329ld71JkiTFxcVJrq6ukomJic7Pa9OmTVJ4eLhkZ2cnqdVqycPDQxo2bJi0c+dO+ZpRo0ZJ1tbWlbb5yy+/SD179pRsbW0lBwcH6bnnnpOysrIq/e719aOy7+7KlSvSxIkTpYYNG0pmZmaSh4eHFBcXJ92+fVvrOgDSq6++qtMvDw8PadSoUZJUjd9nIpVUlVtiiIiIiGoh3vVGREREpAfXKBEpUFlZ2UP3VTIz4/98iYhqGkeUiBQoPj5eZx+b+4/KFpwTEZFYXKNEpEAXL16U92bSx9fXV2efISIiEotBiYiIiEgPTr0RERER6cGgRERERKQHb5upprKyMly8eBG2trY18qwlIiIiEk+SJFy/fh2urq4wMan6OBGDUjVdvHhRfmAnERERPV2ys7Or9agjBqVqqngGUXZ2Nuzs7AzdHSIiIqoCjUYDd3f3Sp8l+CAMStVUMd1mZ2fHoERERPSUqe6yGS7mJiIiItKDQYmIiIhIDwYlIiIiIj0YlIiIiIj0YFAiIiIi0oNBiYiIiEgPBiUiIiIiPRiUiIiIiPRgUCIiIiLSg0GJiIiISA8GJSIiIiI9GJSIiIiI9GBQUojSMgnvp/6G/afzDd0VIiIiKmdm6A7Q37Ycv4gPdp0GAJx7r5+hu0NEREQcUVKOrKs3Dd0FIiIiug+DkkKoDN0BIiIi0sGgpBAqJiUiIiLFYVAiIiIi0oNBSSFUHFIiIiJSHAYlIiIiIj0YlBSCA0pERETKw6CkECre90ZERKQ4ig5Ky5cvh6enJywtLeHn54e0tDS91+7fvx8hISGoV68e6tSpA29vb7z//vs6123YsAE+Pj5Qq9Xw8fHBN998U8Ofomo4okRERKQ8ig1KKSkpiImJwfTp05GZmYnQ0FD06dMHWVlZlV5vbW2NSZMmYd++fTh58iRmzJiBGTNm4JNPPpGvOXDgACIjIxEVFYXjx48jKioKw4cPx8GDB5/gJyMiIqKnhUqSJMnQnahMQEAAOnTogBUrVshlrVq1wuDBg5GQkFClOoYMGQJra2usXbsWABAZGQmNRoNt27bJ1/Tu3RsODg5ITk6uUp0ajQb29vYoKCiAnZ1dtT+XPh//9wwStv0K8BEmREREwj3q329FjigVFxfj6NGjiIiI0CqPiIhAenp6lerIzMxEeno6wsLC5LIDBw7o1NmrV68q11mTOPVGRESkPIp8KG5+fj5KS0vh7OysVe7s7Izc3NwHvtfNzQ2XL19GSUkJZs2ahfHjx8vncnNzq11nUVERioqK5NcajeYRPtHDcTE3ERGR8ihyRKnC/ZswSpL00I0Z09LScOTIEaxcuRKJiYk6U2rVrTMhIQH29vby4e7u/kifhYiIiJ4+ihxRql+/PkxNTXVGevLy8nRGhO7n6ekJAGjTpg0uXbqEWbNm4YUXXgAAuLi4VLvOuLg4xMbGyq81Gk2NhCVOvRERESmPIkeULCws4Ofnh9TUVK3y1NRUBAcHV7keSZK0ps2CgoJ06tyxY8cD61Sr1bCzs9M6iIiIqHZQ5IgSAMTGxiIqKgodO3ZEUFAQPvnkE2RlZWHixIlA+UjPhQsXsGbNGgDAsmXL0LhxY3h7ewPl+yotWrQI//znP+U6X3vtNXTp0gXz58/HoEGD8O2332Lnzp3Yv3+/gT7lXfdO/5WVSTAx4RATERGRoSk2KEVGRuLKlSuIj49HTk4OWrduja1bt8LDwwMAkJOTo7WnUllZGeLi4nD27FmYmZnBy8sL7733HiZMmCBfExwcjC+//BIzZszAzJkz4eXlhZSUFAQEBBjkM+pTJkkw4eJuIiIig1PsPkpKVVP7KH2+/yzi//MLAODUnN5Qm5kKq5uIiKi2M6p9lGo7RlciIiJlYFBSiHvveistY1IiIiJSAgYlhbh3RVIZh5SIiIgUgUFJgcrKDN0DIiIiAoOScmhtD8ARJSIiIkVgUFIIrTVKDEpERESKwKCkEPdmozIu5iYiIlIEBiWFuHe6jTGJiIhIGRiUFOLeQSTOvBERESkDg5JC3LtBOhdzExERKQODkkLcm40Yk4iIiJSBQUkh7h1F4mJuIiIiZWBQUghGIyIiIuVhUFKIMq5RIiIiUhwGJYXQ2keJOYmIiEgRGJQU4t51SRJHlIiIiBSBQUkh7o1GHFEiIiJSBgYlhdBel8SkREREpAQMSgphaW4q/5sjSkRERMrAoKQQE8O8UM/aAuAjTIiIiBSDQUlBVCoVwO0BiIiIFINBSUHKcxKDEhERkUIwKCmISXlQYk4iIiJSBgYlBTEpH1JiUCIiIlIGBiUFKR9QgsTtAYiIiBSBQUlB7i7mNnRPiIiICAxKyqKS1ygxKRERESkBg5KCmHBEiYiISFEYlBSk4q43PsKEiIhIGRiUFIRrlIiIiJSFQUlB5A0nmZSIiIgUgUFJQe5uD0BERERKwKCkICZ81hsREZGiMCgpiIpDSkRERIrCoKQg3B6AiIhIWRiUFKTirjc+woSIiEgZGJQUpGLmjSNKREREysCgpCAm5T8NLuYmIiJSBgYlBVFVjCkxJxERESkCg5KCVDzChCNKREREysCgpCDyYm7mJCIiIkUQHpSuXbuGVatWIS4uDlevXgUAZGRk4MKFC6KbMjoqjigREREpipnIyn766Sf06NED9vb2OHfuHP7xj3/A0dER33zzDc6fP481a9aIbM7omMjbAxAREZESCB1Rio2NxejRo3H69GlYWlrK5X369MG+fftENmWU5I25OaJERESkCEKD0uHDhzFhwgSd8kaNGiE3N1dkU0bJhGuUiIiIFEVoULK0tIRGo9EpP3XqFBo0aCCyKaN0d42SoXtCREREEB2UBg0ahPj4eNy5cwcov4srKysL06ZNw9ChQ6td3/Lly+Hp6QlLS0v4+fkhLS1N77UbN25Ez5490aBBA9jZ2SEoKAjbt2/XuiYpKQkqlUrnuH379iN8WvG4mJuIiEhZhAalRYsW4fLly3BycsKtW7cQFhaGZs2awdbWFnPnzq1WXSkpKYiJicH06dORmZmJ0NBQ9OnTB1lZWZVev2/fPvTs2RNbt27F0aNHER4ejgEDBiAzM1PrOjs7O+Tk5Ggd966nMqSKDScZk4iIiJRB6F1vdnZ22L9/P3bv3o2MjAyUlZWhQ4cO6NGjR7XrWrJkCcaNG4fx48cDABITE7F9+3asWLECCQkJOtcnJiZqvZ43bx6+/fZbbNmyBe3bt5fLVSoVXFxcHunz1bSKESUu5iYiIlIGoUGpQrdu3dCtW7dHfn9xcTGOHj2KadOmaZVHREQgPT29SnWUlZXh+vXrcHR01Cq/ceMGPDw8UFpainbt2uHdd9/VClKGVBGUiIiISBmETr1NnjwZS5cu1Sn/6KOPEBMTU+V68vPzUVpaCmdnZ61yZ2fnKt89t3jxYhQWFmL48OFymbe3N5KSkrB582YkJyfD0tISISEhOH36tN56ioqKoNFotI6aIk+9cUCJiIhIEYQGpQ0bNiAkJESnPDg4GF9//XW161PdN8QiSZJOWWWSk5Mxa9YspKSkwMnJSS4PDAzEiy++iLZt2yI0NBTr169HixYt8OGHH+qtKyEhAfb29vLh7u5e7c9RVfLUG1cpERERKYLQoHTlyhXY29vrlNvZ2SE/P7/K9dSvXx+mpqY6o0d5eXk6o0z3S0lJwbhx47B+/fqHro0yMTFBp06dHjiiFBcXh4KCAvnIzs6u8ucgIiKip5vQoNSsWTN8//33OuXbtm1D06ZNq1yPhYUF/Pz8kJqaqlWempqK4OBgve9LTk7G6NGjsW7dOvTr1++h7UiShGPHjqFhw4Z6r1Gr1bCzs9M6ahqn3oiIiJRB6GLu2NhYTJo0CZcvX5YXc+/atQuLFy/WuSutKnVFRUWhY8eOCAoKwieffIKsrCxMnDgRKB/puXDhgvz8uOTkZERHR+ODDz5AYGCgPBpVp04deZRr9uzZCAwMRPPmzaHRaLB06VIcO3YMy5YtE/k1PDIVd+YmIiJSFKFBaezYsSgqKsLcuXPx7rvvAgCaNGmCFStWIDo6ulp1RUZG4sqVK4iPj0dOTg5at26NrVu3wsPDAwCQk5OjtafSxx9/jJKSErz66qt49dVX5fJRo0YhKSkJAHDt2jW89NJLyM3Nhb29Pdq3b499+/bB399f0DfweORnvRm4H0RERPQ3lVRDm/ZcvnwZderUgY2NTU1UbzAajQb29vYoKCgQPg03evUh7D11GQuH+eK5jjW3aJyIiKi2edS/3zWyjxIAPtvtEXBEiYiISFmELua+dOkSoqKi4OrqCjMzM5iammod9GCqu/sDEBERkQIIHVEaPXo0srKyMHPmTDRs2LBKex7RXfy2iIiIlEVoUNq/fz/S0tLQrl07kdXWOtxwkoiISBmETr25u7vzga6P4e5DcQ3dEyIiIoLooJSYmIhp06bh3LlzIqutRcr3UTJ0N4iIiAgQPfUWGRmJmzdvwsvLC1ZWVjA3N9c6f/XqVZHNGR2OKBERESmL0KBU3d23Sdvd7QGYlIiIiJRAaFAaNWqUyOpqHY4oERERKUuNbTh569Yt3LlzR6vsSTxQloiIiEgUoYu5CwsLMWnSJDg5OcHGxgYODg5aBz2Yiou5iYiIFEVoUHrzzTexe/duLF++HGq1GqtWrcLs2bPh6uqKNWvWiGzKKMn7c3LujYiISBGETr1t2bIFa9asQdeuXTF27FiEhoaiWbNm8PDwwL///W+MHDlSZHNGh08wISIiUhahI0pXr16Fp6cnUL4eqWI7gM6dO2Pfvn0imzJK8tQbkxIREZEiCA1KTZs2lTeb9PHxwfr164Hykaa6deuKbMo4yXe9MSkREREpgdCgNGbMGBw/fhwAEBcXJ69VmjJlCt544w2RTRklPhSXiIhIWYSuUZoyZYr87/DwcPz66684cuQIvLy80LZtW5FNGTWOJxERESmD0BGlNWvWoKioSH7duHFjDBkyBK1ateJdb1WgUnGNEhERkZIIn3orKCjQKb9+/TrGjBkjsimjdPcRJkRERKQEQoOSJEnyqMi9/vzzT9jb24tsyiipuJibiIhIUYSsUWrfvj1UKhVUKhW6d+8OM7O71ZaWluLs2bPo3bu3iKaMGhdzExERKYuQoDR48GAAwLFjx9B1bSnRAAAgAElEQVSrVy/Y2NjI5ywsLNCkSRMMHTpURFNGjWuUiIiIlEVIUHrnnXcAAE2aNMHzzz8PtVototpahyNKREREyiJ0jVK3bt1w+fJl+fWhQ4cQExODTz75RGQzRk/icm4iIiJFEBqURowYgT179gAAcnNz0aNHDxw6dAhvvfUW4uPjRTZlnOTF3IbuCBEREUF0UDpx4gT8/f0BAOvXr0ebNm2Qnp6OdevWISkpSWRTRkl+1puhO0JERESA6KB0584deX3Szp07MXDgQACAt7c3cnJyRDZllFQcUSIiIlIUoUHpmWeewcqVK5GWlobU1FR5S4CLFy+iXr16IpsySnc3nGRSIiIiUgKhQWn+/Pn4+OOP0bVrV7zwwgvy8902b94sT8mRfhxRIiIiUhahD8Xt2rUr8vPzodFo4ODgIJe/9NJLsLKyEtmUUVJxgwAiIiJFERqUAMDU1FQrJKF8fyUiIiKip81jB6UOHTpg165dcHBwkB9lok9GRsbjNmfU+Kw3IiIiZXnsoDRo0CD5TreKR5nQo+EaJSIiImV57KBU8fiS+/9Nj4L7KBERESmJ0DVKkiTh6NGjOHfuHFQqFTw9PR86HUd3cUSJiIhIWYQFpT179mDcuHE4f/68vMamIix9/vnn6NKli6imjBb3USIiIlIWIfso/f777+jfvz+aNGmCjRs34uTJk/jll1/w1Vdfwc3NDX379sUff/whoimjxoE3IiIiZREyopSYmIjAwEDs2rVLq9zb2xvPPvssevTogffffx8ffvihiOaMHqfeiIiIlEHIiNLevXsRExNT6TmVSoWYmBjs2bNHRFNGjQ/FJSIiUhYhQSkrKwtt2rTRe75169Y4f/68iKaMmjz1xiElIiIiRRASlG7cuPHAR5RYWVnh5s2bIpoyancXcxMREZESCLvr7ZdffkFubm6l5/Lz80U1Y9QqtlHggBIREZEyCAtK3bt3r/TRGyqVCpIkcS+lauD2AERERMogJCidPXtWRDW1HrMkERGRsggJSh4eHiKqoXKceiMiIlIGIYu5SQxuD0BERKQsig5Ky5cvh6enJywtLeHn54e0tDS9127cuBE9e/ZEgwYNYGdnh6CgIGzfvl3nug0bNsDHxwdqtRo+Pj745ptvavhTVB2f9UZERKQsig1KKSkpiImJwfTp05GZmYnQ0FD06dMHWVlZlV6/b98+9OzZE1u3bsXRo0cRHh6OAQMGIDMzU77mwIEDiIyMRFRUFI4fP46oqCgMHz4cBw8efIKfTD8+642IiEhZVFJlt6opQEBAADp06IAVK1bIZa1atcLgwYORkJBQpTqeeeYZREZG4u233wYAREZGQqPRYNu2bfI1vXv3hoODA5KTk6tUp0ajgb29PQoKCmBnZ1ftz/Ugc7/7BZ+mncWELk0R17eV0LqJiIhqs0f9+63IEaXi4mIcPXoUERERWuURERFIT0+vUh1lZWW4fv06HB0d5bIDBw7o1NmrV68H1llUVASNRqN11BR5H6Uaa4GIiIiqQ2hQunTpEqKiouDq6gozMzOYmppqHVWVn5+P0tJSODs7a5U7Ozvr3dTyfosXL0ZhYSGGDx8ul+Xm5la7zoSEBNjb28uHu7t7lT8HERERPd2EbTgJAKNHj0ZWVhZmzpyJhg0bPvYmk/e/v6obVyYnJ2PWrFn49ttv4eTk9Fh1xsXFITY2Vn6t0WhqLCzdfdQbx5SIiIiUQGhQ2r9/P9LS0tCuXbvHqqd+/fowNTXVGenJy8vTGRG6X0pKCsaNG4evvvoKPXr00Drn4uJS7TrVajXUavUjfY5q411vREREiiJ06s3d3V3IaIiFhQX8/PyQmpqqVZ6amorg4GC970tOTsbo0aOxbt069OvXT+d8UFCQTp07dux4YJ1PEvdRIiIiUhahQSkxMRHTpk3DuXPnHruu2NhYrFq1Cp9//jlOnjyJKVOmICsrCxMnTgTKp8Sio6Pl65OTkxEdHY3FixcjMDAQubm5yM3NRUFBgXzNa6+9hh07dmD+/Pn49ddfMX/+fOzcuRMxMTGP3V8RuI8SERGRsgideouMjMTNmzfh5eUFKysrmJuba52/evVqteq6cuUK4uPjkZOTg9atW2Pr1q3y41JycnK09lT6+OOPUVJSgldffRWvvvqqXD5q1CgkJSUBAIKDg/Hll19ixowZmDlzJry8vJCSkoKAgAABn/7xcR8lIiIiZRG6j9IXX3zxwPOjRo0S1ZTB1OQ+Sgu3/4ple85gTEgTvDPgGaF1ExER1WaP+vdb6IiSMQQhJeDUGxERkTI8dlDSaDRyMnvYZoyiR2CMjQqPt50CERERifXYQcnBwQE5OTlwcnJC3bp1K92TqGKvotLS0sdtzqjdXczNISUiIiIleOygtHv3bvkxIXv27BHRp1rr7mJuIiIiUoLHDkphYWGV/pseQcWz3piUiIiIFEH4Q3HT0tLw4osvIjg4GBcuXAAArF27Fvv37xfdlNHh9gBERETKIjQobdiwAb169UKdOnWQkZGBoqIiAMD169cxb948kU0Zpcd8NB4REREJJjQozZkzBytXrsSnn36qtdlkcHAwMjIyRDZl1Dj1RkREpAxCg9KpU6fQpUsXnXI7Oztcu3ZNZFNGic96IyIiUhahQalhw4b4/fffdcr379+Ppk2bimzKKJmW/zTKyhiViIiIlEBoUJowYQJee+01HDx4ECqVChcvXsS///1vTJ06Fa+88orIpoySpbkpAODWHe43RUREpARCH2Hy5ptvoqCgAOHh4bh9+za6dOkCtVqNqVOnYtKkSSKbMkpWFn//OG4WMygREREpgdCgBABz587F9OnT8csvv6CsrAw+Pj6wsbER3YxRqmPx9wDfLQYlIiIiRRA69TZ27Fhcv34dVlZW6NixI/z9/WFjY4PCwkKMHTtWZFNGqY55xYhSiaG7QkRERKKD0hdffIFbt27plN+6dQtr1qwR2ZRRsrL4e40Sp96IiIiUQcjUm0ajgSRJkCQJ169fh6WlpXyutLQUW7duhZOTk4imjFqd8qBUVFJm6K4QERGRqKBUt25dqFQqqFQqtGjRQue8SqXC7NmzRTRl1MxM/t5H6U4pgxIREZESCAlKe/bsgSRJ6NatGzZs2ABHR0f5nIWFBTw8PODq6iqiKaNmZvL3TGgp91EiIiJSBCFBKSwsDABw9uxZNG7cGCo+tOyRmJlWjCgxKBERESmB0MXcJ0+exA8//CC/XrZsGdq1a4cRI0bgr7/+EtmUUTIvD0olZZx6IyIiUgKhQemNN96ARqMBAPz888+IjY1F37598ccffyA2NlZkU0apYuqthCNKREREiiB0w8mzZ8/Cx8cHALBhwwYMGDAA8+bNQ0ZGBvr27SuyKaNkasIRJSIiIiUROqJkYWGBmzdvAgB27tyJiIgIAICjo6M80kT6mZtyRImIiEhJhI4ohYSEIDY2FiEhITh06BBSUlIAAL/99hvc3NxENmWUzOQ1Sn/vScVF8URERIYldERp2bJlMDc3x9dff40VK1agUaNGAIBt27ahd+/eIpsySuYmd38c3CKAiIjI8ISNKJWUlGDPnj345JNP0LBhQ61z77//vqhmjJqp6d0RpJIyCWamBu0OERFRrSdsRMnMzAwvv/wyiouLRVVZ61TszA3uzk1ERKQIQqfeAgICkJmZKbLKWqViMTe4oJuIiEgRhC7mfuWVV/D666/jzz//hJ+fH6ytrbXO+/r6imzO6NwzoIQSrlEiIiIyOKFBKTIyEgAwefJkuUylUsl3cJWWlopszuioVCqYmahQUiZxMTcREZECCN9wkh5PxY4AEhiUiIiIDE1oUPLw8BBZXa2kgurvmMScREREZHBCF3MDwNq1axESEgJXV1ecP38eAJCYmIhvv/1WdFPGSR5RIiIiIkMTGpRWrFghPwj32rVr8pqkunXrIjExUWRTRqtiPbfEISUiIiKDExqUPvzwQ3z66aeYPn06TE3v7pbYsWNH/PzzzyKbMlom5YuUmJOIiIgMT2hQOnv2LNq3b69TrlarUVhYKLIpoyUv5mZQIiIiMjihQcnT0xPHjh3TKd+2bRt8fHxENmW05Kk3rlIiIiIyOKF3vb3xxht49dVXcfv2bUiShEOHDiE5ORkJCQlYtWqVyKaMlopTb0RERIohNCiNGTMGJSUlePPNN3Hz5k2MGDECjRo1wgcffIDnn39eZFNG6+6IEhERERma0KAEAP/4xz/wj3/8A/n5+SgrK4OTk5PoJoxaxRqlMg4pERERGZzQNUq3bt3CzZs3AQD169fHrVu3kJiYiB07dohsxqhx6o2IiEg5hAalQYMGYc2aNQCAa9euwd/fH4sXL8agQYOwYsUKkU0ZLZX8YFwmJSIiIkMTGpQyMjIQGhoKAPj666/h4uKC8+fPY82aNVi6dKnIpozW3Q0nDdwRIiIiEhuUbt68CVtbWwDAjh07MGTIEJiYmCAwMFB+nAk9mDz1ZuiOEBERkdig1KxZM2zatAnZ2dnYvn07IiIiAAB5eXmws7MT2ZTRMuFibiIiIsUQGpTefvttTJ06FU2aNEFAQACCgoKA8tGlynbsfpjly5fD09MTlpaW8PPzQ1pamt5rc3JyMGLECLRs2RImJiaIiYnRuSYpKQkqlUrnuH37drX7VnO4mJuIiEgphAalYcOGISsrC0eOHMH3338vl3fv3h3vv/9+tepKSUlBTEwMpk+fjszMTISGhqJPnz7Iysqq9PqioiI0aNAA06dPR9u2bfXWa2dnh5ycHK3D0tKyWn2rSXyECRERkXIIDUoA4OLigvbt28PExAQajQabNm2Cra0tvL29q1XPkiVLMG7cOIwfPx6tWrVCYmIi3N3d9d4916RJE3zwwQeIjo6Gvb293npVKhVcXFy0DiXhI0yIiIiUQ2hQGj58OD766COgfE+ljh07Yvjw4fD19cWGDRuqXE9xcTGOHj0qr3GqEBERgfT09Mfq440bN+Dh4QE3Nzf0798fmZmZj1WfaBxRIiIiUg6hQWnfvn3y9gDffPMNJEnCtWvXsHTpUsyZM6fK9eTn56O0tBTOzs5a5c7OzsjNzX3k/nl7eyMpKQmbN29GcnIyLC0tERISgtOnT+t9T1FRETQajdZRk0y44SQREZFiCA1KBQUFcHR0BAB8//33GDp0KKysrNCvX78HhhF9VHd3XwQASJKkU1YdgYGBePHFF9G2bVuEhoZi/fr1aNGiBT788EO970lISIC9vb18uLu7P3L7VcGpNyIiIuUQGpTc3d1x4MABFBYW4vvvv5enzv76669qLZiuX78+TE1NdUaP8vLydEaZHoeJiQk6der0wBAXFxeHgoIC+cjOzhbWfmX4CBMiIiLlEBqUYmJiMHLkSLi5ucHV1RVdu3YFyqfk2rRpU+V6LCws4Ofnh9TUVK3y1NRUBAcHC+uvJEk4duwYGjZsqPcatVoNOzs7reNJYE4iIiIyPDORlb3yyisICAhAVlYWevbsCROTv3NY06ZNq7VGCQBiY2MRFRWFjh07IigoCJ988gmysrIwceJEoHyk58KFC/Kz5QDg2LFjQPmC7cuXL+PYsWOwsLCAj48PAGD27NkIDAxE8+bNodFosHTpUhw7dgzLli0T+C08HhU3nCQiIlIMoUEJAPz8/ODn56dV1q9fv2rXExkZiStXriA+Ph45OTlo3bo1tm7dCg8PD6B8g8n791S6d1PLo0ePYt26dfDw8MC5c+eA8gf1vvTSS8jNzYW9vT3at2+Pffv2wd/f/xE/rXhczE1ERKQcKkkS+yf5zz//xObNm5GVlYXi4mKtc0uWLBHZlEFoNBrY29ujoKCgRqbhwhbuwfkrN7Hh5SD4eTgKr5+IiKg2etS/30JHlHbt2oWBAwfC09MTp06dQuvWrXHu3DlIkoQOHTqIbMpoyXe9cUSJiIjI4IQu5o6Li8Prr7+OEydOwNLSEhs2bEB2djbCwsLw3HPPiWzKaMl3vRm6I0RERCQ2KJ08eRKjRo0CAJiZmeHWrVuwsbFBfHw85s+fL7Ipo1UxolRWxqhERERkaEKDkrW1NYqKigAArq6uOHPmjHwuPz9fZFNGS36EiaE7QkRERGLXKAUGBuKHH36Aj48P+vXrh9dffx0///wzNm7ciMDAQJFNGS1uOElERKQcQoPSkiVLcOPGDQDArFmzcOPGDaSkpKBZs2Z4//33RTZltPgIEyIiIuUQEpRmzJiBbt26ITg4WH5UiZWVFZYvXy6i+lpFnnpjTiIiIjI4IWuUkpOT0aNHD9StWxdhYWGYNWsW9u3bp7OPEj2cCpx6IyIiUgohQenMmTPIzs7Gp59+imbNmmHt2rXo2rUrHBwc0KNHD8ydOxfp6ekimjJ6dxdzMykREREZmrC73ho1aoSoqCh89tlnOHPmDM6fP48VK1agcePGWLBgAbp06SKqKaPGxdxERETKIfxZbygfYdq7dy92796NvXv3orS0FOHh4TXRlNG5u5ibiIiIDE1IUDp79iz27NmDPXv2YO/evSgoKEBISAjCwsIwadIkdOrUCWZmNZLJjE7F1FsZh5SIiIgMTkh68fLyQuPGjfHKK69g8uTJ6NChA0xNTUVUXeuoOKRERESkGELWKD333HMoKipCQkIC3n33XSQmJiIjIwMSR0WqTb7rjUmJiIjI4ISMKKWkpAAAfv31V3n6beHChbh9+zY6d+6MsLAwdO3aFZ06dRLRnFEz4T5KREREiiH0WW/e3t54+eWXkZKSgtzcXKSnp6Ndu3aYM2cOgoKCRDZlvHjXGxERkWIIX2F96dIl7N27F3v37sWePXvw22+/Qa1WIzQ0VHRTRqliiRIXcxMRERmekKD01VdfyVNup06dgpmZGfz9/TF8+HCEh4cjODgYarVaRFNG7+6Gk0RERGRoQoLSyJEj0bFjRzz77LMIDw9HSEgI6tSpI6LqWke+6Y1JiYiIyOCEBKW//voL1tbWIqqq9Uy4PwAREZFiCFnMzZAkzt0NJw3dEyIiIhJ61xs9PnkfJQYlIiIig2NQUhp5MTeTEhERkaExKCkMF3MTEREpB4OSwlQs5mZOIiIiMjzhQUmSJMyZMwe//PKL6KprBXkfJQ4pERERGZzwoKRSqeDp6YmXX35ZdNW1QsWIEnfmJiIiMrwamXqLjIzEwYMHUVhYWBPVGzXT8qfilpYZuidERERUI0Hpxo0bKC4uxp07d2qieqNmVh6USpiUiIiIDK5GgtKGDRvQqVMn1K1btyaqN2pmpuVBiTtOEhERGVyNBKV//etfiI6OromqjZ6Zyd8/klIGJSIiIoOrkaB08uRJdOnSpSaqNnoVI0p3OPVGRERkcDUSlFq2bImsrKyaqNro3V3MzRElIiIiQ6uRoPTPf/4TM2fORHFxcU1Ub9TMy6feuEaJiIjI8MxqotJhw4YhICCgJqo2eqYVi7lLGZSIiIgMrUaCEgC4u7vXVNVGzbxie4AyrlEiIiIyND7rTWFMOfVGRESkGAxKCmNuyg0niYiIlIJBSWFMTbjhJBERkVIwKCmMmWn51BsXcxMRERmc8KAkSRLy8/Nx5coV0VXXCmZczE1ERKQYwoJSbm4uoqOj4eDgAGdnZzg5OcHBwQFjx47FpUuXRDVj9LjhJBERkXII2R5Ao9EgODgYN27cwJgxY+Dt7Q1JkvDLL78gOTkZ+/fvR0ZGBmxsbEQ0Z9TuBiVD94SIiIiEBKUPPvgApqam+N///ocGDRponZsxYwZCQkKwdOlSvPXWWyKaM2qmqr+DUpnEESUiIiJDEzL19t133+Gtt97SCUkA4OTkhLi4OGzZskVEU0bPhFNvREREiiEkKP32228IDg7Wez44OBinTp0S0ZTRK99GCaUcUSIiIjI4IUFJo9Ggbt26es/XrVsXGo2m2vUuX74cnp6esLS0hJ+fH9LS0vRem5OTgxEjRqBly5YwMTFBTExMpddt2LABPj4+UKvV8PHxwTfffFPtftWkijVKZRxRIiIiMjghQUmSJJiY6K9KpVJBquYISUpKCmJiYjB9+nRkZmYiNDQUffr0QVZWVqXXFxUVoUGDBpg+fTratm1b6TUHDhxAZGQkoqKicPz4cURFRWH48OE4ePBgtfpWkzj1RkREpBwqqboJphImJiawt7eHqnwh8v0kSYJGo0FpaWmV6wwICECHDh2wYsUKuaxVq1YYPHgwEhISHvjerl27ol27dkhMTNQqj4yMhEajwbZt2+Sy3r17w8HBAcnJyVXql0ajgb29PQoKCmBnZ1flz1NVXx7KwrSNP6NHKyesGtVJeP1ERES10aP+/RZy19vq1atFVCMrLi7G0aNHMW3aNK3yiIgIpKenP3K9Bw4cwJQpU7TKevXqpROoDMmEjzAhIiJSDCFBadSoUdW6Pjk5GQMHDoS1tXWl5/Pz81FaWgpnZ2etcmdnZ+Tm5j5yP3Nzc6tdZ1FREYqKiuTXj7LWqjrMOPVGRESkGAZ51tuECROqtFv3/VN5kiTpnd6rqurWmZCQAHt7e/lwd3d/rPYfRl7MzbveiIiIDM4gQelhy6Lq168PU1NTnZGevLw8nRGh6nBxcal2nXFxcSgoKJCP7OzsR26/KkxUHFEiIiJSCoMEpYexsLCAn58fUlNTtcpTU1MfuF/TwwQFBenUuWPHjgfWqVarYWdnp3XUpLvbA9RoM0RERFQFQtYo1YTY2FhERUWhY8eOCAoKwieffIKsrCxMnDgRKB/puXDhAtasWSO/59ixYwCAGzdu4PLlyzh27BgsLCzg4+MDAHjttdfQpUsXzJ8/H4MGDcK3336LnTt3Yv/+/Qb6lLrkESVOvRERERmcYoNSZGQkrly5gvj4eOTk5KB169bYunUrPDw8gPINJu/fU6l9+/byv48ePYp169bBw8MD586dA8p3CP/yyy8xY8YMzJw5E15eXkhJSUFAQMAT/nT6mXIxNxERkWII2UepumxtbXH8+HE0bdr0STf92Gp6H6Xdv17C2KQj8HWzx+ZJnYXXT0REVBs96t9vg6xR8vDwgLm5uSGaVjwu5iYiIlIOoVNv2dnZUKlUcHNzAwAcOnQI69atg4+PD1566SX5uhMnTohs1qhw6o2IiEg5hI4ojRgxAnv27AHKN3fs2bMnDh06hLfeegvx8fEimzJapiruo0RERKQUQoPSiRMn4O/vDwBYv349WrdujfT0dKxbtw5JSUkimzJafCguERGRcggNSnfu3IFarQYA7Ny5EwMHDgQAeHt7IycnR2RTRotTb0RERMohNCg988wzWLlyJdLS0pCamorevXsDAC5evIh69eqJbMpoWZqZAgBu3+GOk0RERIYmNCjNnz8fH3/8Mbp27YoXXngBbdu2BQBs3rxZnpKjB7O1/Ht9/fXbdwzdFSIiolpP6F1vXbt2RX5+PjQaDRwcHOTyl156CVZWViKbMlp2df7eNqGwuBSlZZI8FUdERERPntARpVu3bqGoqEgOSefPn0diYiJOnToFJycnkU0ZrYoRJQC4cbvEoH0hIiKq7YQGpUGDBsnPXrt27RoCAgKwePFiDB48GCtWrBDZlNEyNzWB2uzvH8v1Ik6/ERERGZLQoJSRkYHQ0FAAwNdffw1nZ2ecP38ea9aswdKlS0U2ZdTqWHBBNxERkRIIDUo3b96Era0tAGDHjh0YMmQITExMEBgYiPPnz4tsyqjdvfOt1NBdISIiqtWEBqVmzZph06ZNyM7Oxvbt2xEREQEAyMvLq5EHyBqrihGlWwxKREREBiU0KL399tuYOnUqmjRpAn9/fwQFBQHlo0vt27cX2ZRRszQvD0rFDEpERESGJHR7gGHDhqFz587IycmR91ACgO7du+PZZ58V2ZRRu6S5DQBY/cNZdGnRwNDdISIiqrWEjigBgIuLC9q3b4+LFy/iwoULAAB/f394e3uLbspoXS0sBgDsOXUZ45IOG7o7REREtZbQoFRWVob4+HjY29vDw8MDjRs3Rt26dfHuu++irIx3cFXVjH6t5H/v+jXPoH0hIiKqzYROvU2fPh2fffYZ3nvvPYSEhECSJPzwww+YNWsWbt++jblz54pszmiND22KOd+dlF+XlUkw4Q7dRERET5zQoPTFF19g1apVGDhwoFzWtm1bNGrUCK+88gqDUjXYqs1wvejvnbkvXLsFd0c+AoaIiOhJEzr1dvXq1UrXInl7e+Pq1asimzJ6Y0KayP9e8d8zBu0LERFRbSU0KLVt2xYfffSRTvlHH32kdRccPdykbs0xuJ0rACD993xDd4eIiKhWEjr1tmDBAvTr1w87d+5EUFAQVCoV0tPTkZ2dja1bt4psyuhZmJlgcvfm2HTsIs5duYkrN4pQz0Zt6G4RERHVKkJHlMLCwvDbb7/h2WefxbVr13D16lUMGTIEp06dkp8BR1Vna2ku/3vB96cM2hciIqLaSOiIEgC4urrqLNrOzs7G2LFj8fnnn4tuzqjZWt798aQcycb8Yb4G7Q8REVFtI3zDycpcvXoVX3zxxZNoyqhUPMqEiIiIDOOJBCUSQ5IkQ3eBiIioVmFQUrhGdevI/5639eQDryUiIiKxGJQUzvSeHbk/TTuL0jKOKhERET0pQhZzDxky5IHnr127JqKZWqnXM874NO2s/PqPyzfQ3NnWoH0iIiKqLYQEJXt7+4eej46OFtFUrfN6REutoPTjH1cYlIiIiJ4QIUFp9erVIqqhSliam0JtZoKikjIAwMxv/4fhndyhNuMdcURERDWNa5SeAm3d6mq9bjnje/znp4u4fL3IYH0iIiKqDRiUngKLh+s+J2/Sukx0mrsTAFBWJmHXyUsMTkRERIIxKD0F3B2tcPztCL3n1x/JxrgvjqD/h2lPtF9ERETGjkHpKWFjWflyspLSMmw7kQsAuKThiBIREZFIDEpPiXv3U7rX7ZIy/Pe3y1plZdxriYiISAgGpafc3jG9AQgAACAASURBVFN5Wq9nbf4f/Oft5HolIiIiARiUniLzh7bRKZu0LlPrdVL6OeTfKMZXR7OfYM+IiIiME4PSU+Q5P/cqX2ttIWSLLCIiolqNQekpYqJnnVJlvjqajYJbd2q0P0RERMaOQclInbigwZtfHzd0N4iIiJ5qDEpGbPv/Lhm6C0RERE81BqWnzMJhvmhgq0bSmE54xtXO0N0hIiIyaipJkrjpTjVoNBrY29ujoKAAdnaGCSqSJEGl+nu90p9/3UROwW08t/JApddamJnAv4kj1oz1r9YaJyIiImPyqH+/OaL0FKoISQDg5mCFTk0cMSm8WaXXFpeUYf/v+fgjv1Auu3KjCDkFt55IX4mIiJ5mDEpGYlA71wee//Ovm5AkCRuO/gm/OTsRlLAbmtu8K46IiOhBFB2Uli9fDk9PT1haWsLPzw9paQ9+6Ot///tf+Pn5wdLSEk2bNsXKlSu1ziclJUGlUukct2/fruFPUvOaO9vis1Ed9Z4fvfowlqT+hte/unsn3J9XOapERET0IIoNSikpKYiJicH06dORmZmJ0NBQ9OnTB1lZWZVef/bsWfTt2xehoaHIzMzEW2+9hcmTJ2PDhg1a19nZ2SEnJ0frsLS0fEKfqmZ1b+WMX9/tjVXRlQemD3f/rvVa3/PjiIiI6G+K3b55yZIlGDduHMaPHw8ASExMxPbt27FixQokJCToXL9y5Uo0btwYiYmJAIBWrVrhyJEjWLRoEYYOHSpfp1Kp4OLi8gQ/yZNlaW6KHj7OVbq2jOv4iYiIHkiRI0rFxcU4evQoIiIitMojIiKQnp5e6XsOHDigc32vXr1w5MgR3Llzdy3OjRs34OHhATc3N/Tv3x+ZmZmV1HZXUVERNBqN1vE0+OD5dg+9prik7In0hYiI6GmlyKCUn5+P0tJSODtrj4w4OzsjNze30vfk5uZWen1JSQny8/MBAN7e3khKSsLmzZuRnJwMS0tLhISE4PTp03r7kpCQAHt7e/lwd6/689YMaVC7Rg+9priUQYmIiOhBFBmUKtx7Gzzu2z+oqtffWx4YGIgXX3wRbdu2RWhoKNavX48WLVrgww8/1FtnXFwcCgoK5CM7O/sxP9WT84L/g0Pdy//KQG7BbQz6aD8Stp18Yv0iIiJ6WihyjVL9+vVhamqqM3qUl5enM2pUwcXFpdLrzczMUK9evUrfY2Jigk6dOj1wREmtVkOtVj/S5zC0KT1b4Iffr2CYnxtu3SnFir1ntM7n3yhCYMIuAMDxPwsQ16eVgXpKRESkTIocUbKwsICfnx9SU1O1ylNTUxEcHFzpe4KCgnSu37FjBzp27Ahzc/NK3yNJEo4dO4aGDRsK7L1yONlaYt+b4ZjcvTn+r7e3obtDRET01FFkUAKA2NhYrFq1Cp9//jlOnjyJKVOmICsrCxMnTgTKp8Sio6Pl6ydOnIjz588jNjYWJ0+exOf/3959R0V1rX0A/g0dxqFK76KoOIgCFtSAiopdYxJ71KsxMdFojCUxds1VkmhiYjTmJmqMKZaI3vupUUGxgqCAShNFmoUiSG/T9vcHcOTADAJBmu+zlmsx5+xzzt6zB3ln1337sHfvXixfvpxLs3HjRpw9exZJSUm4desW5s2bh1u3bnH3fNX9dDkJ6/8bU2shSplcgf/eekyreRNCCHnltMquNwCYMmUKcnJysGnTJqSnp0MsFuP06dOwt7cHAKSnp/PWVHJ0dMTp06exdOlS7Nq1C1ZWVvjuu+94SwPk5eXh3XffRUZGBgwMDNC7d29cvnwZffv2bZEyNrcxrpY4FZ2u8vy/T1eMUzoQmop/DXTA+nE9uNebT8bBUE8Tt9aNUHk9IYQQ0t7QprgN1Bo2xW2swjIp9lx6gISMQujraiIg8nGd6cNX+8JMpIOZP4fhamLFzMH4TSOhq6XeTDkmhBBCmkZj/35ToNRAbTlQqi67qBw/X0lGp45CrDx2R2W6j4Z1wc2UXC5Q0tVUx+WVQ2AqapsD3AkhhLyaKFBqJu0lUKrur4hHWF5tD7j6uLDMB9qa6riXUYjBXU3rXLaBEEIIaWmN/fvdascokeYz3s0K5+Mz0dmsQ6394FQ5dScd2wPvAQC2v+UGOxM99HEwfsk5JYQQQppXq531RpqPloYafpjpgWUjutb7mvtZRdzPy47exlt7QrHz/H3Iaqz2LZMrsPp4NI5HPQKqLQJKCCGEtAXU9dZA7bHrrbrAuEzM//Vmo6/vbWeISe42iErNRWRaLlJySrhzmyeKsfP8fRyc1w9dLURNlGNCCCHkxWiMUjNp74ESAMgVDE6fnX6pz/jjnX4Y0LnjS30GIYQQUqWxf7+p643Uoq7GH5h9a91w9LBq2qBw+s9h3M9lUnmT3psQQghpKhQoEaX2z+nD/WyopwVdzaZfO+nknSdw+PQUuq09g5AH2fW+Lj2/FI9yS2qNhyKEEEKaGs16I0oN6WaGtWNdYG2oCwCwMdLFzdRcpWk11ASQKRreg7vojyju52VHbiN0la/KtAoFg5qaAHIFg9fWC9xzAz/2gWNHYYOfTQghhNQHjVFqoFdhjJIyWYVl+OjQLUzvZ4exPa1QJpUjNCkHKdnFmNnfHpcSnuKdykHg0/vZ4Y+wtBfeUxVrQ11I5Ar8NMsTvWwNsflkHAIiH+HvJd7Q1VSH26ZzvPTnlnrD2bzuweFyBavVpUgIIeTVQYO5m8mrGii9SLlMjq5rzgAAItcOh5GeJjILyiHUVkdOkQSDt11s8D1tjHRx9ZOhcPj0FABApK0BFyt9hCU/q5V2iqct/N9wRX6pFIZ6WkDl6uN5JVKUSeWY+p/rWOLbBXMHOaJMKodQmxpTCSHkVUKBUjOhQEm1gMhHkMoVmNLHrtY5xhj2XUvB5pNxDbqng4keb4mB+orZ6AfXDWfBWEUL1eO8UgDA4K6muJaYjWufDoWZSKfB9yWEENI2UaDUTChQ+mfOxmYg7kkB9LTUcf5uFsKVtA41hS5mHXiLYirzychuGNLNFN0s9JFfIsWZ2HSMcrWEvo4mYp/k41piNuYOdISGuuo5DzK5Ag9zS1vdOCnGGMplCui8hEH4hBDSFtHyAKRN8OthgaXDnfGejxP6OBjxzhnoauLe56NgpKf5j5/zoiAJAL44cxcjd1wBAHx2PBqfHIvG6G+vQCZXYMx3V7Hl9F38dj0VJRKZyhXFlx29jSHbLmJH0D1I5Qql6aRyBXKKyrnXjDEcvJ6KN34IQV6JhDuenF2M38NSIa2czXf7YR6C72Y1qvzLj95Bt7VnkNaI1jhCCCHPUYtSA1GLUtMplcjx2/VU/Pt0PABg7VgXzBvkCIWCoevavyGVP/9omoq08bSwvI67NZ6aAKjPpL13Bjli9Zju3AbA+aVSuG3kDyx3sdTHqtHd8FoXUzDGMP/XCATFZwIADr/bH30cjDH1p+tcS9p7Pp2walR3AODGYq0e3R3zvTtxry+tGAx7k7pbrG4/zMPOC/exanR3OJl24K6d1NsaX0/p1fA3pQ0plchxJjYdg53NYCTUaunsEEJaKWpRIm2OrpY65nt34l572le0MKmpCTCihwV3PMV/DPbO9lR5n2+muP2jfNR3ZYOfrybDcdVpbDkdj8V/RtUKkgAgLr0Ab+8Nx5dn7iIhs5ALkgBgyn+uY9u5BF53Y1GZrNY9QpNyeC1Tac8qWoX2Xk2G/993ceTGw1rXTNh1DUHxWVhwMIK3vlRA1GMcvJ5ar/LdTHnW5C1QT/JKubFrL8vnp+Kw9PBtzD1wgzvGGEPsk3xIZLTWFiHkn6GpP6TFnV/mg0e5pXCzNXx+sEbw0tPGEF++0RMa6gK4WOlj54VE6Gqq44PBTuhk2gGn7mTwgpKX6T+Xk16YZvfFB1AT1F6OYPfFB7zXoUk5mPHzdXQ1f/7t5sLdLKRWC1gYA6LScnkD4X8LS8Wu6e5IySlGYrVuxvtZRRj17RXeM9aeiMEAJxOY6+ugg4rZfolZhXhzTyhQGZg2REXL2U3IFAz75/RBmVQBXa2KsVF+Oy6jsEyG3BIp5g1yfOG9SiQy6Gk17L+lE1GPAQBRaXncPdb9NxZ/RTzCcBdz/DRLdZDdXGIe50NLQ+2Fy1g0pargVLOOMXaEkBejQIm0OCfTDnAy7cA7ZqhknNLkPrbcz7umu/PObXldjLc8bTDCxRwTd13D7Uf5AIClw5zhaqOPny4nIzQph3fNp6O6wf/vu01cmue+D058YZqkp8VIelqMa4n8vFVfTkHBGDILynjn7zzKx2tfBiu9p7LxWb7bLwEAnEyF+GN+f5jr82f83al8vxqqTCpHuVSBoPiKsVTd1p5BuUyBf78uxox+9iisbDG7mJD1wkAp+lE+xn1/FfMGOWLtWBfeucSsIggEFZ+VMqkcy47cxtBuZnjDw6ZmTI05+24gPKWi1S4wLhNbT8dj1ejuKp/LGOO6U1+G/FIpxu68CgBI2jIaas2wnpdcwTB0+0VoqKnh/Mc+zfJMQtor+qpBWqWlw53R18EY296qX7eamb4O/HpYQCAQIOCDgdxx3+5mGNrNHF+91RMe9kbYNd0dJxYOhP8kV7zn3Qn2Jnoq78lr4WpBc/bfwMb/a9iyCqo8eFqMflvOIypN+SrrAPDJX3ew72oySiQyxD0pwMNnz1u3nhVLoKjsqzwe9Qg91p/FschH3Pnyyq6u1cdjePdUEwjwJK8UxeW1uxqrfHUuAajsYqxSVC7Du7/exLCvL8F3+yUcDE3BwdBUnIpOx7Kjt2vdIyotlwuSqvyopAUws6AMEanP8PBZCfr8OwjzfrmB6Ef5SMwqwpJDUUjMKgQqW4J2BSeiXNaw/Qh/u56KhX9EQiJTILvaQP7yal2BF+5m4kTUY8Q+qQhS5Ur6gH8PS0VYjQD/RXKLJfD+MhgPn5UiObsYBWVS7lxRuYw3gYAQ8mLUokRapY4dtHFkgVejrlVXE2DfHE+k5ZRAbG0AALAx0sOx9wdwaXpVBkF7Z/fB3qvJWDjECTZGerwB2kff80JeiQR9t5yvlbcFPp0QkZqL5Oxi3M0o/AclrZ/0/LJ6pKq/13eHIOHzkZArGHQ11bmWHwA4fLNiDNSmal19Kf5jEJWWi9d3hwAAxva0xMk76bXSqXLp3lMM8L8APS11/PKvvnjwtAiv97aGjqY6dgUnwsZIF8oaPfz/jse5uOddqmv/G8s7X1wuQ4nkeRBTlT9l8kulMNCtaKl87ctgSGQKdOooRHaRBOfvZuF8tRmGYUnPsGRYF6wKiAYqt8t5z8eJO59TVI7vgxMxoZc1elobICg+EzsvJOKbKb1gpq+NNScqAkUfZ1P0cTDmriuVyqGrpY4yqRxzf7nJHf96shv+fSoeI3pYYOskVwDA9aQcLuBcPLQzlg53hkAgQGJWEfR1NGCmr3wdsJ0XErl1wwBAUtkFxxhDzw1noWBA/KaR0NVSR/SjfJRIZNDUUIO7nZHS+5HWI6uwDBcTnmK8mxUt/dGMaNZbA9Gst/avqLLVo2o8T16JBD9ceoDZXg7Q1VSvNbPqelIOIlJzcS4uE7cf5rVInl+2qLXDMcD/Akql9W9ZidnoB/H6s3Wm+d+igRj//TUAQDcLERd0TuxlBbG1AT4/FV/n9X0djeu1FpeeljpKJHKsHt0dswc4wHnN3/UuBwC81qUjDs7rh+C7WcguKsele0+5QNHb2RSX7z0FADibd8C9TH7X569z+2LWvnAAwLVPh+JJXimeFUvw3sEIpc+qGiP2R1gaPjsezR0/9r4XrA310H9rReB+dIEXfr+eCjmr+IxWzLjsjuVHb+OviOetfFdWDoGtsR5v9fwzH72Ge5lFWPzn8/0Wr306lNvbEZV/lC/EZ2FCL2tuzFljlErkKJfJuRXzY5/kQypn0FATcF9kqlMoGM7FZaCXrREsDFQvCltcLsPMvWEY1t0cC4d0bnT+2pIh2y4iObsYcwc6Yt04l3pcQaqjBSebCQVKRJVymRxlEgWKJTJ8dOgW+juZ4KfLSZjsaQOTDtr4OvAeAGDbW25w7CjEm3tCQL997Z+RniZySyq6v0b2sMCZ2Iw606f4j8GzYgncNwfyji8e2hknbj3hZkEqc3fzSHwWEI2AygHuABC41BudzTogr0SK3jXuWd3asS74MzwNi327YLybFYZ9fQmJWUUY2NkEuprqsDMW4m0ve/wamoIxrpboaWMILY0Xj97w2ByInGIJ7mwYgdxiCXy+ej7+7vKKIbCr7P6OeZyPhIxCyBQKfHIsGhpqAsRs9FPZcvLzlSQukE7xHwPGGBKziuDYUYgSqRxFZTJYVQZ+ZVI5tNTVVI7VKpXIsfa/MRgltsDgrmbILZGgYwdtbjNuVR7lluCz4zGYN8gRPs6mtc4zxrjJDU0xFq5q2Q8A+Gx0N4wSWyLtWQkGdu74j+6bkFEIY6EWTEXadab77vx96OtoYM5A5eMNq7fatkYUKDUTCpRIQ0jlCm7W0eEbadDWUMfE3tZA5V50jFWsESVXMBwISUF3S330sjWEeMNZyBUM2hpqWDbCGVtOVww619VUx8YJPbDyrztAZavN3ivJuHgvC4VlMt4MOAD48W0PXsvF0G5muNDIRSxJ85jQywoaamq8sV/19XpvaxyvFiRVN7WPLQ4pWVpCmaMLvPBW5SzIuvw5vz+8nEx4xwIiH+HQjYfYOa03tp1NwNHK1q1D7/ZHdlE5Fv3xvBVrz0wPjBRb4GbKM27WpUhbA4WVrbpmIm2EfeYLBQMOhKQAlS2PAzp3xNa/4/HjpYrxZyn+Y3DweirWnohBTxsDbnJC+Ge+6KCjgYH+F9DJtAOv+726787f577IjBJb4O+YDOya7o51/43BmJ6W2DRBDFT+Pi87cht9HIzwtpcD5v96E4GVXcNvuNtg+2T+mMolh6JwJiYDv7/TDwt+i8DM/vb4aJiz0jwUlklxPOoxRootVG6vVD1Q4r3nHwxodNdpSnYxN3kkxX8Mispl2B2ciIPXUzGyhwU2TugBPS0NpOYUc0HuZE8bfD7RlRcoH7n5ECv/uoN1Y10wtx4zXKvLK5FwLY4vEwVKzYQCJdIc0vNL8dWZBPxroCNcbQyQnl8KXU117j+TkMRsGAm10N3y+WewTCpHt7Vn0MNKH9aGuhjrZoXxblY4H5+Jjw7dwhdv9sRoV0t8G3Qf3wTd464b1t282ZZWIO1P+GpfnLydjhE9zHE6Op0L6mv6dmovlErk+DTgeXfiwiFOmNHPHgP8L6i8/18LvLggqor/JFfeff54px+m/xxW69o9Mz2gq6WO2ZVdn5FrhyP4bhb8xBaYsy8cxkIt/GeWZ63uyppS/MfgzqM8rpsYAH6Y4Y73f4/kpbuycgj+784TTOtjh/m/3sTN1NqTJlL8x+B+ZiG+CbqHxb5dUFAqQ4lEhr1Xk3HlfjbcbAwwo5890vPLsGRYF6ByqyR1NQEcV51Wmr9lw52hr6sJexM9dLPQh1SuwH8uJ0EqV8BPbAGZnOFmyjMsHe5cq4XueNQjLD1cMTEifLUvhm2/hIIa67v1dTTGnAEO+KBaeTdN6IFZXg7c6+pBXMSaYTDpUHfrVJUdQfewI+g+dk13x5ielvW6prEoUGomFCiR1qzq17lmE3/1Zn+FgmHTyTgIBMC6sS6IfpzP/QH4dmov2BhVdFe88UMotNTVsGCwE747fx8AcOz9ARBqq8PZTIS/Ih7hcV4pvq08p0rMRj/EPSnAv/aHo1giRydTIRZ4OyG3RIKtNZZn2DfHE2HJz9DH3hjbziVg7kBHTO5jq/SbdG87Q0Sl5UEgAHVhtmHVJwY0tWl97WBjpIuvziaoTPP+YCf8UGN9s5pW+HWt8x5VdDXVUSqVw93OEJFpyscrXlk5ROXSHjWdWDgQelrqmPlzGHrbGeJsbP2+0HQyFSLpaXGt430djDFSbIGTd54gMi0PRxd4IT2/jBurZmesp7Jrt+YOBv07GWOJrzNCHmRjsW8XdFn9fNyfSFsD0Rv9lN4nt1iCb8/fx5seNhBbG9TqTvzXQEcUlErrHWg1BAVKzYQCJdIeBcVlwtZYD10tlC+IGJ9eADtjPQiVLFhZVC6DXM7wwR8RFWM9xrrAxkgPkWm56Gz2fI2sonIZHmQVccsuSGQKzNxb0QowsZc1JrlbqxyPUjNQEgiA5K3PF8YsLJOioEyGDf+LRWBcJnrbGUJbQw3Xk/gDvTubdcAXb7jijR9e3K3U0mZ52ePX0Pqtqk5IYy3x7fLCLzuNcWXlEHzweySiH+fj1OJB6GFVMXB/2ZHbXLfynpkeWPCb8kkN9dm6qaEoUGomFCgRopyq1qymEBSXieV/3ca2N92goS6As7mIG6hbU3J2MWyMdKGprob7mYV492AEetsZ4j1vJy4QfPC0CDN/DkN6fhmGdDXFd9N6Q6TDH4Ra1QqXXyrFwdAUJGUXQ09LHZ+N7o7Xd4UgIbNiht7Xk91gaaCLaT9dBwC8590JUQ/zkJhVBDORNnraGCCrsBxvedjiwt0snIp+gt0z3LnlAWb0s8MHQzojIOIRtleOkzn54SCIrQ2w4X+xiHmcjx8qu5AyC8qQWVAGr04m+CUkBWYiHYzoYY4FByN4yxtU+XZqLyw5dKtpK4OQRpjsaYMZ/ewxYde1eqSuaMVr6tmMFCg1EwqUCGkZL3sF7YbIK5EgMi0XdsZCOJkKIRAIsPP8fdx+lIfvp7urbBljjKFUKoeelgaO3HyIgMhH2DPTgxt7lllQhjKpvMHfpBljtcavPNgyGupqAmTkl8Fvx2WMdrXEn+Fp3PmFQ5ygq6mOP8MfIrdEwluP6p/o42CEGymqFzQlpD6qNgdvSo39+00LThJC2oTWEiQBgKGeFoZ2M+cd+9C3ywuvEwgE3F52kz1tMdnTlne+5tYy9VXzvTERakG9clq7hYEOItYMg4a6GuyM9bDvWjL+WuDFBWOLhlbkO7OgDAdDUxGXXoB1Y11QKpVj4q5rKJcpILbWR8zjAkztY4uridl4lFuKES7mCE6oWGepaiD0/X+PgppAAKfPngdtQ7qaYvUYF/j/Hc9tddMU1o9zabIV61Xp1FGIpOzaY30aw8ZIF49yS+uRkgCApnrr+X2nFqUGohYlQkhrVDWOa2g3M3zxRk+Va+I0pmWuTCpHzON89LI1hEa1TXar7lXznolZhSiTKmotKHn4Rhq+OpuAI+95ITz5GW/m2teT3TDezQrPiiU4cvMh3u7vALdNFavkj+lpifPxmSiTKnBl5RB00NaAkVALZ2IyuDEukz1tYKCriZ+uJKOhVvh1RW87Q8zaGw5Z5YjlqLXDYSTUQlhSDmKfFHAr0I92tUDS02LMf60TVvx1G8v9uuKDwZ2x4uhtHI14BG9nUywa0hl9HY25965UIoeRUAvZReXw/DwIAGChr4ORYgtYGuhg7iBHPMotRZlUDpGOBt47GIE+DsaY5G4NM5EOfrz8AAkZhZjl5YAPfo/A2/3tMXuAAwQCAYZUTu3fOL4H3vCwQVhSDuYduKm0nJsm9MC6Gqvb15ePsyliHucjp7h+W+A4dhQi+R8EmTVn1TUF6nprJhQoEUJao5+vJOFcXCb2z+mjdNB9a/Tb9VSsOREDNQEQt2lkrS7LquDvPe9OWOHXFWoCQa0FIAvLpLzxZQkZhTh55wlMhFr46UoyfprlCVORNv4MT4O6mgAjXMxhqKcFQz1NfBN4D8NdzNG72hpEN1KeQSZntdaH+ulyEtLzy7B6THeuta5cJoe2RsNWLa8q07dTe2FCL+sGXQslge63Qfdh0kELM/vbc8ekcgVyiyVQUxPg8I2HsDbUxUixBXQ01ZGYVYQpP4byAp7OZh1qrcE2d6Aj9l2rCDpnedlj0wQxSiQyuKw7C5G2Bvb9qw+31lYXsw5IfFqEntYGMNDTwp6Z7tDT0kBusYRb5NRQTxPnPvJGxw7a6PSZ8mUOTn44iNtAetWobrxtg5oCBUrNhAIlQghpOnWtfl09UFo1unsz5+zluJtRgIjUXEzrY1fnqt8v2+O8Ugz0v4Cu5iKcXerNvdfdLET4enIvuFjpIy2nBJFpuVyQBQD5JVKoqQEiHU08K5ZAAMBAVxMKxnitjVXOx2fij7A0bJnkynUtd1l9GlJ5Regxs78dfrteMXbu3uejsPlkHA5eT8Vi3y74eLjyxTkbi8YoEUIIaXPqChaq9ujzVrI9SFvVzUIf3Sxa/ku2taEubqweBpFORRiwwq8r4tML8O3U3lyLmZ2JHrfFTBUDveetd8bV9r1Ug/J69O1uDt/u/PF8F5YNxv9uP4FIRwO+3c25QElLQw0Te1ujl60hXKxa/j2qQi1KDUQtSoQQ0jyyCsuQ/LQY/TqZ1CM1aatCErNhoKfJrbX0slCLEiGEkHbFTKSjct8z0n4M+Ieb+r5sL976mRBCCCHkFUWBEiGEEEKIChQoEUIIIYSoQIESIYQQQogKFCgRQgghhKhAgRIhhBBCiAoUKBFCCCGEqECBEiGEEEKIChQoEUIIIYSoQIESIYQQQogKFCgRQgghhKhAgRIhhBBCiAoUKBFCCCGEqKDR0hloaxhjAICCgoKWzgohhBBC6qnq73bV3/H6okCpgQoLCwEAtra2LZ0VQgghhDRQYWEhDAwM6p1ewBoaWr3iFAoFnjx5ApFIBIFA0KT3LigogK2tLR4+fAh9ff0mvXdrR2WnslPZXx1Udip7S5SdMYbCwkJYWVlBTa3+I4+oRamB1NTUYGNj81Kfoa+v/8r9AlWhslPZXzVUdir7q6Yly96QlqQqNJibEEIIIUQFCpQIIYQQQlRQ37Bhw4aWzgR5Tl1dHYMHD4aGxqvXK0plp7K/aqjsVPZXTVssOw3mJoQQQghRgbreCCGEEEJUoECJEEIIIUQFCpQIIYQQQlSgQIkQQgghRAUKlFqJ3bt3w9HRETo6OvDw8MCVK1dazIbFBgAAE/hJREFUOksqbd26FX369IFIJIKZmRkmTpyIhIQEXpo5c+ZAIBDw/vXv35+Xpry8HB9++CE6duwIoVCI8ePH49GjR7w0ubm5ePvtt2FgYAADAwO8/fbbyMvL46VJS0vDuHHjIBQK0bFjRyxevBgSieSllX/Dhg21ymZhYcGdZ4xhw4YNsLKygq6uLgYPHozY2Nh2UXYHB4daZRcIBFi4cCHQzur98uXLGDduHKysrCAQCHDixAne+dZWz9HR0fDx8YGuri6sra2xadOmBu9pVZ+yS6VSfPLJJ3B1dYVQKISVlRVmzZqFJ0+e8O4xePDgWp+FqVOntumyoxV+xpuz7Mp+9wUCAb766isuTVut9zox0uIOHTrENDU12U8//cTi4uLYkiVLmFAoZKmpqS2dNaX8/PzY/v37WUxMDLt16xYbM2YMs7OzY0VFRVya2bNns5EjR7L09HTuX05ODu8+CxYsYNbW1iwwMJBFRkayIUOGMDc3NyaTybg0I0eOZGKxmIWEhLCQkBAmFovZ2LFjufMymYyJxWI2ZMgQFhkZyQIDA5mVlRVbtGjRSyv/+vXrWY8ePXhly8rK4s77+/szkUjEjh07xqKjo9mUKVOYpaUlKygoaPNlz8rK4pU7MDCQAWDBwcGMtbN6P336NFu9ejU7duwYA8COHz/OO9+a6jk/P5+Zm5uzqVOnsujoaHbs2DEmEonYtm3bmrzseXl5bNiwYezw4cPs7t27LDQ0lPXr1495eHjw7uHj48Pmz5/P+yzk5eXx0rS1srNW9hlv7rJXL3N6ejrbt28fEwgE7MGDB1yatlrvdaFAqRXo27cvW7BgAe9Yt27d2KefftpieWqIrKwsBoBdunSJOzZ79mw2YcIEldfk5eUxTU1NdujQIe7Y48ePmZqaGjtz5gxjjLG4uDgGgF2/fp1LExoaygCwu3fvMlb5i62mpsYeP37Mpfnzzz+ZtrY2y8/Pb/KysspAyc3NTek5hULBLCwsmL+/P3esrKyMGRgYsD179jDWxste05IlS5iTkxNTKBSMteN6r/lHo7XV8+7du5mBgQErKyvj0mzdupVZWVlxddNUZVcmPDycAeB9ufPx8WFLlixReU1bLXtr+oy3dL1PmDCBDR06lHesPdR7TdT11sIkEgkiIiIwYsQI3vERI0YgJCSkxfLVEPn5+QAAY2Nj3vGLFy/CzMwMzs7OmD9/PrKysrhzERERkEqlvHJbWVlBLBZz5Q4NDYWBgQH69evHpenfvz8MDAx4acRiMaysrLg0fn5+KC8vR0RExEsr8/3792FlZQVHR0dMnToVSUlJAIDk5GRkZGTwyqWtrQ0fHx8uz2297FUkEgl+++03zJ07l7dBdHuu9yqtrZ5DQ0Ph4+MDbW1tXponT54gJSXlpb4XqPw/QCAQwNDQkHf8999/R8eOHdGjRw8sX74chYWF3Lm2XPbW8hlvyXrPzMzEqVOnMG/evFrn2lu9t52lMdup7OxsyOVymJub846bm5sjIyOjxfJVX4wxfPzxxxg0aBDEYjF3fNSoUXjrrbdgb2+P5ORkrF27FkOHDkVERAS0tbWRkZEBLS0tGBkZ8e5XvdwZGRkwMzOr9UwzMzNemprvnZGREbS0tF7a+9evXz/8+uuvcHZ2RmZmJj7//HMMGDAAsbGx3DOV1WdqaiqX57Za9upOnDiBvLw8zJkzhzvWnuu9utZWzxkZGXBwcKj1nKpzjo6O/7jMqpSVleHTTz/F9OnTeRudzpgxA46OjrCwsEBMTAxWrVqF27dvIzAwkMtXWyx7a/qMt2S9HzhwACKRCJMmTeIdb4/1ToFSK1H9GzkqA5Cax1qjRYsW4c6dO7h69Srv+JQpU7ifxWIxPD09YW9vj1OnTtX6xaquZrmVvQeNSdOURo0axf3s6uoKLy8vODk54cCBA9ygzsbUZ1soe3V79+7FqFGjeN/62nO9K9Oa6llZXlRd21SkUimmTp0KhUKB3bt3887Nnz+f+1ksFqNLly7w9PREZGQk3N3dVeattZe9tX3GW6LeAWDfvn2YMWMGdHR0eMfbY71T11sL69ixI9TV1Wt9C87KyqoVUbc2H374If73v/8hODgYNjY2daa1tLSEvb097t+/DwCwsLCARCJBbm4uL131cltYWCAzM7PWvZ4+fcpLU/O9y83NhVQqbbb3TygUwtXVFffv3+dmv9VVn+2h7KmpqQgKCsI777xTZ7r2Wu+trZ6VpanqDnpZ74dUKsXkyZORnJyMwMBAXmuSMu7u7tDU1OR9Ftpq2atryc94S5X9ypUrSEhIeOHvP9pJvVOg1MK0tLTg4eHBNUtWCQwMxIABA1osX3VhjGHRokUICAjAhQsX6tXEmZOTg4cPH8LS0hIA4OHhAU1NTV6509PTERMTw5Xby8sL+fn5CA8P59KEhYUhPz+flyYmJgbp6elcmnPnzkFbWxseHh5NWm5VysvLER8fD0tLS67JuXq5JBIJLl26xOW5PZR9//79MDMzw5gxY+pM117rvbXVs5eXFy5fvsybPn3u3DlYWVnV6p5oClVB0v379xEUFAQTE5MXXhMbGwupVMp9Ftpq2Wtqyc94S5V979698PDwgJub2wvTtot6b9Kh4aRRqpYH2Lt3L4uLi2MfffQREwqFLCUlpaWzptT777/PDAwM2MWLF3lTQEtKShhjjBUWFrJly5axkJAQlpyczIKDg5mXlxeztrauNXXaxsaGBQUFscjISDZ06FClU2h79uzJQkNDWWhoKHN1dVU6jdTX15dFRkayoKAgZmNj81KnyC9btoxdvHiRJSUlsevXr7OxY8cykUjE1Ze/vz8zMDBgAQEBLDo6mk2bNk3ptPG2WHbGGJPL5czOzo598sknvOPtrd4LCwtZVFQUi4qKYgDY119/zaKioriZXa2pnvPy8pi5uTmbNm0ai46OZgEBAUxfX7/RU6XrKrtUKmXjx49nNjY27NatW7z/A8rLyxljjCUmJrKNGzeyGzdusOTkZHbq1CnWrVs31rt37zZd9tb2GW/OslfJz89nenp67Icffqh1fVuu97pQoNRK7Nq1i9nb2zMtLS3m7u7Om2rf2gBQ+m///v2MMcZKSkrYiBEjmKmpKdPU1GR2dnZs9uzZLC0tjXef0tJStmjRImZsbMx0dXXZ2LFja6XJyclhM2bMYCKRiIlEIjZjxgyWm5vLS5OamsrGjBnDdHV1mbGxMVu0aBFvymhTq1ovR1NTk1lZWbFJkyax2NhY7rxCoWDr169nFhYWTFtbm3l7e7Po6Oh2UXbGGDt79iwDwBISEnjH21u9BwcHK/2cz549m7FWWM937txhr732GtPW1mYWFhZsw4YNjZ4mXVfZk5OTVf4fULWeVlpaGvP29mbGxsZMS0uLOTk5scWLF9dab6itlb01fsabq+xVfvzxR6arq1trbSTWxuu9LgL2UpaxJIQQQghp+2iMEiGEEEKIChQoEUIIIYSoQIESIYQQQogKFCgRQgghhKhAgRIhhBBCiAoUKBFCCCGEqECBEiGEEEKIChQoEUJIG+Xg4IAdO3a0dDYIadcoUCLkFZaRkYElS5agc+fO0NHRgbm5OQYNGoQ9e/agpKSkpbNXby87YJgzZw4mTpzIvR48eDA++uijl/a8mn755RcYGhrWOn7jxg28++67zZYPQl5FGi2dAUJIy0hKSsLAgQNhaGiILVu2wNXVFTKZDPfu3cO+fftgZWWF8ePHt1j+GGOQy+XQ0Gi+/6YkEgm0tLTazPNMTU2bND+EECWafFMUQkib4Ofnx2xsbFhRUZHS89X3TMrLy2Pz589npqamTCQSsSFDhrBbt25x59evX8/c3NzYr7/+yuzt7Zm+vj6bMmUKb6NQhULBvvjiC+bo6Mh0dHRYz5492dGjR7nzVftMnTlzhnl4eDBNTU124cIFlpiYyMaPH8/MzMyYUChknp6eLDAwkLvOx8en1t5UVf766y/m4uLCtLS0mL29fa0NM+3t7dnmzZvZ7Nmzmb6+Pps1a5bS92L27NlswoQJ3M81n5ecnMwYYyw2NpaNGjWKCYVCZmZmxmbOnMmePn3Ky+vChQvZ0qVLmYmJCfP29maMMbZ9+3YmFouZnp4es7GxYe+//z4rLCzkvS/V/61fv57L/zfffMPdPzU1lY0fP54JhUImEonYW2+9xTIyMhpUT0ePHmVisZjp6OgwY2Nj5uvrq/IzQsirgLreCHkF5eTk4Ny5c1i4cCGEQqHSNAKBAKhs2RkzZgwyMjJw+vRpREREwN3dHb6+vnj27BmX/sGDBzhx4gROnjyJkydP4tKlS/D39+fOr1mzBvv378cPP/yA2NhYLF26FDNnzsSlS5d4z125ciW2bt2K+Ph49OzZE0VFRRg9ejSCgoIQFRUFPz8/jBs3DmlpaQCAgIAA2NjYYNOmTUhPT0d6ejoAICIiApMnT8bUqVMRHR2NDRs2YO3atfjll194z/vqq68gFosRERGBtWvXvvC9+/bbb+Hl5YX58+dzz7O1tUV6ejp8fHzQq1cv3Lx5E2fOnEFmZiYmT57Mu/7AgQPQ0NDAtWvX8OOPPwIA1NTU8N133yEmJgYHDhzAhQsXsHLlSgDAgAEDsGPHDujr63PPW758ea18McYwceJEPHv2DJcuXUJgYCAePHiAKVOm8NLVVU/p6emYNm0a5s6di/j4eFy8eBGTJk0CbQlKXmktHakRQprf9evXGQAWEBDAO25iYsKEQiETCoVs5cqVjDHGzp8/z/T19Wvt3O3k5MR+/PFHxipbKvT09HgtEytWrGD9+vVjjDFWVFTEdHR0WEhICO8e8+bNY9OmTWOsWsvJiRMnXph/FxcXtnPnTu51zZYVxhibPn06Gz58OO/YihUrmIuLC++6iRMnvvB51VuUWGXL0JIlS3hp1q5dy0aMGME79vDhQwaAJSQkcNf16tXrhc87cuQIMzEx4V7v37+fGRgY1EpXvdznzp1j6urqvF3qY2NjGQAWHh7OWD3qKSIiggFgKSkpL8wjIa8KGqNEyCusqtWoSnh4OBQKBWbMmIHy8nKgsmWmqKgIJiYmvLSlpaV48OAB99rBwQEikYh7bWlpiaysLABAXFwcysrKMHz4cN49JBIJevfuzTvm6enJe11cXIyNGzfi5MmTePLkCWQyGUpLS7kWJVXi4+MxYcIE3rGBAwdix44dkMvlUFdXV/q8xoqIiEBwcDA6dOhQ69yDBw/g7Oys8nnBwcHYsmUL4uLiUFBQAJlMhrKyMhQXF6ts8aspPj4etra2sLW15Y65uLjA0NAQ8fHx6NOnD/CCenJzc4Ovry9cXV3h5+eHESNG4M0334SRkVEj3hFC2gcKlAh5BXXu3BkCgQB3797lHe/UqRMAQFdXlzumUChgaWmJixcv1rpP9ZlYmpqavHMCgQAKhYK7BwCcOnUK1tbWvHTa2tq81zUDgxUrVuDs2bPYtm0bOnfuDF1dXbz55puQSCR1lpExVisQVNaFVN9A5EUUCgXGjRuHL774otY5S0tLlc9LTU3F6NGjsWDBAmzevBnGxsa4evUq5s2bB6lUWu/nKyuvsuN11ZO6ujoCAwMREhKCc+fOYefOnVi9ejXCwsLg6OhY77wQ0p5QoETIK8jExATDhw/H999/jw8//LDOYMHd3R0ZGRnQ0NCAg4NDo57n4uICbW1tpKWlwcfHp0HXXrlyBXPmzMHrr78OACgqKkJKSgovjZaWFuRyea1nXr16lXcsJCQEzs7OXGtSYyl7nru7O44dOwYHB4cGzdS7efMmZDIZtm/fDjW1imGjR44ceeHzanJxcUFaWhoePnzItSrFxcUhPz8f3bt3r3d+BAIBBg4ciIEDB2LdunWwt7fH8ePH8fHHH9f7HoS0JzSYm5BX1O7duyGTyeDp6YnDhw8jPj4eCQkJ+O2333D37l0umBg2bBi8vLwwceJEnD17FikpKQgJCcGaNWtw8+bNej1LJBJh+fLlWLp0KQ4cOIAHDx4gKioKu3btwoEDB+q8tnPnzggICMCtW7dw+/ZtTJ8+nWsBqeLg4IDLly/j8ePHyM7OBgAsW7YM58+fx+bNm3Hv3j0cOHAA33//vdKB0A3l4OCAsLAwpKSkIDs7GwqFAgsXLsSzZ88wbdo0hIeHIykpCefOncPcuXPrDHKcnJwgk8mwc+dOJCUl4eDBg9izZ0+t5xUVFeH8+fPIzs5WusbVsGHD0LNnT8yYMQORkZEIDw/HrFmz4OPjU+/uxbCwMGzZsgU3b95EWloaAgIC8PTp0wYFWoS0NxQoEfKKcnJyQlRUFIYNG4ZVq1bBzc0Nnp6e2LlzJ5YvX47NmzcDlS0Mp0+fhre3N+bOnQtnZ2dMnToVKSkpMDc3r/fzNm/ejHXr1mHr1q3o3r07/Pz88H//938v7NL55ptvYGRkhAEDBmDcuHHw8/ODu7s7L82mTZuQkpICJycnbm0hd3d3HDlyBIcOHYJYLMa6deuwadMmzJkzp1HvV3XLly+Huro6XFxcYGpqirS0NFhZWeHatWuQy+Xw8/ODWCzGkiVLYGBgwLUUKdOrVy98/fXX+OKLLyAWi/H7779j69atvDQDBgzAggULMGXKFJiamuLLL7+sdR+BQIATJ07AyMgI3t7eGDZsGDp16oTDhw/Xu1z6+vq4fPkyRo8eDWdnZ6xZswbbt2/HqFGjGvgOEdJ+CBjN+ySEEEIIUYpalAghhBBCVKBAiRBCCCFEBQqUCCGEEEJUoECJEEIIIUQFCpQIIYQQQlSgQIkQQgghRAUKlAghhBBCVKBAiRBCCCFEBQqUCCGEEEJU+H+QCzmPuER91wAAAABJRU5ErkJggg==)"]},{"cell_type":"markdown","metadata":{"id":"qLhnYB0uPpjt"},"source":["## Application\n","### Problème inverse : Récupérer le vecteur latent d'une image\n","\n","Voici le problème d'optimisation que nous voulons résoudre :\n","\n","$$\\underset{z \\in \\mathbb{Z}}{\\text{argmin}}\\lVert g(z)-x_0 \\rVert_2^2$$\n","\n","Voici le code pour résoudre ce problème en utilisant la différenciation automatique de PyTorch :"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"sdc3spKfRDO3"},"outputs":[],"source":["x0 = inputsv[0][None, :,:,:]\n","\n","noise = torch.FloatTensor(1, nz, 1, 1).normal_(0,1)\n","noise.requires_grad = True\n","\n","\n","# Choisissez un optimiseur, par exemple Adam\n","optimizer = optim.Adam([noise], lr=0.001)\n","\n","\n","for p in netD.parameters():\n"," p.requires_grad = False\n","for p in netG.parameters():\n"," p.requires_grad = False\n","\n","# Boucle d'optimisation\n","for iteration in range(100000):\n"," optimizer.zero_grad()\n","\n"," # Générer une donnée à partir de z\n"," generated_data = netG(noise)\n","\n"," # Calculer la perte (norme L2 au carré)\n"," loss = torch.norm(generated_data - x0)**2\n","\n"," # Rétropropagation et optimisation\n"," loss.backward()\n"," optimizer.step()\n","\n"," print(f\"Iteration: {iteration}, Loss: {loss.item()}\")"]},{"cell_type":"markdown","metadata":{"id":"pUw0PYPNR5wo"},"source":["Voici un exemple :\n","\n","- Image cible :"]},{"cell_type":"markdown","metadata":{"id":"Ic24cRnN7aus"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"I-DndMBm7YJa"},"source":["- Image trouvée :"]},{"cell_type":"markdown","metadata":{"id":"HXoaWAoV7hoj"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"_tBHFalDSRcI"},"source":["À partir d'un vecteur latent, nous pouvons explorer l'espace engendré par le générateur.\n","\n","---\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"pS4lMtoBSgnZ"},"outputs":[],"source":["fixed_noise = noise.repeat(25, 1, 1, 1)\n","\n","n = int(fixed_noise.shape[0]**.5)\n","for i in range(n):\n"," for j in range(n):\n"," fixed_noise[i*n+j] = fixed_noise[0] + i*torch.eye(nz)[0][:, None, None] + j*torch.eye(nz)[1][:, None, None]\n","\n"," for n in fixed_noise:\n"," im = netG(n[None, :,: ,:])[0]\n"," plt.imshow(torch.permute(im.detach(), (1,2,0)))\n"," plt.show()"]},{"cell_type":"markdown","metadata":{"id":"nDMasgAOS8aa"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"cgRBSaWRTAtT"},"source":["D'après les propriétés énnoncées, nous savons que la distance de Wasserstein est Lipschitz sur l'espace engendré par le générateur. Par conséquent, nous remarquons que toutes les images sont des barycentres de Wasserstein pour les autres."]},{"cell_type":"markdown","metadata":{"id":"cyp-fhG03bS3"},"source":["## Conclusion\n","\n","Notre exploration des Wasserstein GANs, telle que détaillée dans ce projet, nous a permis de nous familiariser avec des concepts clés tels que le Generative Adversarial Network (GAN), la distance de Wasserstein, et les techniques avancées de traitement de données. Cette compréhension approfondie nous a équipés avec une perspective unique et une connaissance approfondie des mécanismes sous-jacents aux GANs, ainsi que de leur potentiel dans des applications variées.\n","\n","En regardant vers l'avenir, nous identifions plusieurs domaines potentiels d'amélioration et de recherche. Parmi ceux-ci, comparer les Wasserstein GANs avec d'autres formes de GANs utilisant différentes fonctions de coût se présente comme une piste prometteuse. De plus, l'optimisation des paramètres du modèle, en se concentrant sur des aspects tels que le taux d'apprentissage, le clipping, et le nombre d'itérations du discriminant, pourrait conduire à des avancées significatives dans la performance et l'efficacité des GANs."]}],"metadata":{"colab":{"provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.7"}},"nbformat":4,"nbformat_minor":0}