<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Everything is wrong &#187; JSF</title>
	<atom:link href="http://everythingiswrong.free.fr/index.php/tag/jsf/feed/" rel="self" type="application/rss+xml" />
	<link>http://everythingiswrong.free.fr</link>
	<description>Un blog dédié à l&#039;informatique en général</description>
	<lastBuildDate>Wed, 06 Oct 2021 21:20:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>JSF2.2 – @Inject dans un FacesConverter</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/09/09/jsf2-2-inject-dans-un-facesconverter/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/09/09/jsf2-2-inject-dans-un-facesconverter/#comments</comments>
		<pubDate>Tue, 09 Sep 2014 19:07:03 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=3275</guid>
		<description><![CDATA[Si vous avez déjà développé un FacesConverter, vous avez certainement compris qu&#8217;il n&#8217;est pas possible d&#8217;utiliser l&#8217;injection CDI dans ce type d&#8217;objet. Je vais donc transformer le simple converter suivant pour permettre l&#8217;injection : @FacesConverter(value="monConverter") public class MonConverter implements Converter { @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { // création d'un objet [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Si vous avez déjà développé un FacesConverter, vous avez certainement compris qu&#8217;il n&#8217;est pas possible d&#8217;utiliser l&#8217;injection CDI dans ce type d&#8217;objet. Je vais donc transformer le simple converter suivant pour permettre l&#8217;injection :</p>
<pre class="brush: java; gutter: true; first-line: 1">@FacesConverter(value="monConverter")
public class MonConverter implements Converter {

   @Override
   public Object getAsObject(FacesContext context, UIComponent component, String value) {
      // création d'un objet en fonction de la valeur à convertir
      return new MonObjet(value);
   }

   @Override
   public String getAsString(FacesContext context, UIComponent component, Object value) {
      // Exemple de version de l'objet en String
      return ((MonObjet) value).getValue();
   }

}</pre>
<p style="text-align: justify;">Tout d&#8217;abord, pour pouvoir injecter un objet et rendre le converter visible dans la vue XHTML, il faut remplacer l&#8217;annotation @FacesConverter par @Named. Puis Injecter l&#8217;objet souhaité :</p>
<pre class="brush: java; gutter: true; first-line: 1; highlight: [2,6]">//@FacesConverter(value="monConverter")
@Named
public class MonConverter implements Converter {

   // Injection possible dans ce cas
   @Inject private EntityManager em;

   @Override
   public Object getAsObject(FacesContext context, UIComponent component, String value) {
      // création d'un objet en fonction de la valeur à convertir
      return new MonObject(value);
   }

   @Override
   public String getAsString(FacesContext context, UIComponent component, Object value) {
      // Exemple de version de l'objet en String
      return ((MonObjet) value).getValue();
   }

}</pre>
<p style="text-align: justify;">Ensuite, une petite transformation de la vue est nécessaire pour faire appel à ce nouveau converter. On n&#8217;utilise plus l&#8217;identifiant du converter mais sa référence directement  :</p>
<pre class="brush: xhtml; gutter: true; first-line: 1">&lt;!-- Avant avec l'ID--&gt;
&lt;h:input... converter="monConverter" /&gt;
ou
&lt;f:converter converterId="monConverter" /&gt;

&lt;!-- Après avec l'objet directement --&gt;
&lt;h:input... converter="#{monConverter}" /&gt;
ou
&lt;f:converter binding="#{monConverter}" /&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/09/09/jsf2-2-inject-dans-un-facesconverter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSF2.2 &#8211; Implémenter un logout</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/08/05/jsf2-2-implementer-un-logout/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/08/05/jsf2-2-implementer-un-logout/#comments</comments>
		<pubDate>Tue, 05 Aug 2014 20:48:46 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=3247</guid>
		<description><![CDATA[Déconnexion ou logout JSF]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Pour implémenter une fonctionnalité de logout (déconnexion) à partir d&#8217;une interface JSF, il faut invalider la session en cours. Pour cela, un bouton va appeler une action d&#8217;un <code>@Model</code>. C&#8217;est-à-dire, coté JSF :</p>
<pre class="brush: xhtml; gutter: true; first-line: 1">&lt;h:form&gt;
    &lt;h:commandLink value="Logout" action="#{logoutBean.logout}" /&gt;
&lt;/h:form&gt;</pre>
<p style="text-align: justify;">Coté Java, si on considère que le point d&#8217;entrée de l&#8217;application est <code>/index.html</code> :</p>
<pre class="brush: java; gutter: true; first-line: 1">public String logout() {
    ((HttpSession) FacesContext.getCurrentInstance().getExternalContext()
         .getSession(true)).invalidate();
     return "/index.html?faces-redirect=true";
}</pre>
<p style="text-align: justify;">Remarque, pour procéder à une redirection avec JSF2.2, il faut ajouter ce paramètre à l&#8217;URL choisie : <code>...?faces-redirect=true</code></p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/08/05/jsf2-2-implementer-un-logout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arquillian &#8211; Graphene et RichFaces</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/07/29/arquillian-graphene-et-richfaces/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/07/29/arquillian-graphene-et-richfaces/#comments</comments>
		<pubDate>Tue, 29 Jul 2014 18:28:38 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[Tests unitaires]]></category>
		<category><![CDATA[Arquillian]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=3216</guid>
		<description><![CDATA[Profitez des pages fragments de RichFaces pour développer ses propres tests unitaires...]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Richfaces 4.5.0.Alpha3 est sortie ! Avec cette version, une nouveauté, les fragments de page (pages-fragments). Il s&#8217;agit de classes qui permettent de développer des tests unitaires automatisés sur les applications utilisant RichFaces.</p>
<p style="text-align: justify;">La configuration Maven pour utiliser ces fragements est la suivante :</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;dependency&gt;
    &lt;groupId&gt;org.richfaces&lt;/groupId&gt;
    &lt;artifactId&gt;richfaces-page-fragments&lt;/artifactId&gt;
    &lt;version&gt;4.5.0.Alpha3&lt;/version&gt;
    &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;</pre>
<p style="text-align: justify;">Les sources sont disponibles sur GitHub : <a href="https://github.com/richfaces/richfaces/tree/master/build/page-fragments" target="_blank">https://github.com/richfaces/richfaces/tree/master/build/page-fragments</a>.</p>
<p style="text-align: justify;">Pour plus d&#8217;informations sur Arquillian : <a href="http://slides.com/vineetreynolds/the-arquillian-universe" target="_blank">http://slides.com/vineetreynolds/the-arquillian-universe</a>.</p>
<p style="text-align: justify;">Pour plus d&#8217;informations sur les tests d&#8217;application JSF : <a href="http://www.bleathem.ca/talks/2012-JavaOne/testing-jsf.html" target="_blank">http://www.bleathem.ca/talks/2012-JavaOne/testing-jsf.html</a>.</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/07/29/arquillian-graphene-et-richfaces/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSF2.2 – Inclure une librairie Javascript</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/07/16/jsf22houtputscript/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/07/16/jsf22houtputscript/#comments</comments>
		<pubDate>Wed, 16 Jul 2014 20:27:14 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=3169</guid>
		<description><![CDATA[Comment utiliser le composant h:outputScript.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Il existe un composant standard pour inclure une librairie Javascript : <code>h:outputScript</code>. Pour que JSF trouve cette librairie, il faut quelle soit présente dans un répertoire de type <code>resources</code> :</p>
<ul>
<li>Soit à la racine du contexte web : <code>src/main/webapp/resources</code> pour un projet Maven</li>
<li>Soit directement encapsulée dans un jar : <code>META-INF/resources<br />
</code></li>
</ul>
<p style="text-align: justify;">A mon sens, les deux attributs les plus importants de ce composant sont :</p>
<ul>
<li><code>library</code> : Le chemin du répertoire où se trouve le fichier Javascript en prenant en compte le répertoire <code>resources</code> comme référence</li>
<li><code>name</code> : Le nom du fichier Javascript</li>
</ul>
<p style="text-align: justify;">Par exemple pour inclure le fichier Javascript se trouvant dans <code>src/main/webapp/resources/ma/librairie/lib.js</code> ou bien dans <code>META-INF/resources/ma/librairie/lib.js</code> :</p>
<pre class="brush: actionscript3; gutter: true; first-line: 1">&lt;h:outputScript library="ma/librairie" name="lib.js" /&gt;</pre>
<p style="text-align: justify;">Pour tester sur des cas réels, vous pouvez récupérer une des nombreuses librairies Javascript packagées dans un jar disponibles à cette adresse : <a href="http://www.webjars.org/" target="_blank">http://www.webjars.org/</a>. Pour vous facilité la tâche ces librairies sont disponibles sur Maven. Par exemple pour ajouter aux dépendances de votre projet la librairie amchart :</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;dependency&gt;
    &lt;groupId&gt;org.webjars&lt;/groupId&gt;
    &lt;artifactId&gt;amcharts&lt;/artifactId&gt;
    &lt;version&gt;3.10.0&lt;/version&gt;
&lt;/dependency&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/07/16/jsf22houtputscript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSF2.2 – Hello world Ajax</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/03/17/jsf2-2helloworldajax/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/03/17/jsf2-2helloworldajax/#comments</comments>
		<pubDate>Mon, 17 Mar 2014 20:48:10 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[Wildfly]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=2987</guid>
		<description><![CDATA[Hello world JSF2.2 avec un rechargement ajax !]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Dans cet article il est proposé de développer une petite application JSF 2.2 avec un rechargement Ajax. Il existe beaucoup d’exemples qui utilisent par simplicité des objets en session. Le problème dans ce cas c’est que l’on ne comprend pas forcément l’importance des scopes et de la structure que l’on peut utiliser lors d’un développement en prenant en compte les problématiques de production classiques (limiter et simplifier la taille et l’utilisation de la mémoire).</p>
<h2>Vue d’ensemble et configurations</h2>
<p style="text-align: justify;">Dans cet exemple en conditions réelles nous pouvons séparer les objets <code>Java</code> en trois catégories d’où les trois packages suivant :</p>
<ul>
<li style="text-align: justify;"><code>Le modèle</code> (les données dans le modèle MVC) : dans l’exemple un simple POJO, dans une application réelle cela peut être une entité JPA.</li>
<li style="text-align: justify;"><code>Le contrôleur</code> (le contrôleur dans le modèle MVC) : dans l’exemple un simple POJO, dans une application réelle cela peut aussi être une EJB.</li>
<li style="text-align: justify;"><code>Le DAO</code> pour l’accès aux données. Dans ce cas il s’agit d’un producer.</li>
</ul>
<p style="text-align: justify;">Le fichier <code>XHTML</code> représente la vue dans le modèle MVC. Les fichiers de configuration restent vides.</p>
<p style="text-align: center;"><img class="aligncenter" style="vertical-align: middle; border: 1px solid black;" src="http://everythingiswrong.free.fr/wp-content/uploads/tree-hwa.png" alt="" width="562" height="432" /></p>
<h2>Le model</h2>
<p style="text-align: justify;">Dans cet exemple il s’agit d’un simple POJO avec une variable d’instance de type <code>String</code> pour sauvegarder le nom de l’utilisateur.</p>
<pre class="brush: java; gutter: true; first-line: 1">package org.eiw.model;

/**
 * Dans un cas réel, ce bean pourrait être un objet persistant.
 *
 */
public class HelloBean {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}</pre>
<h2 style="text-align: justify;">Le producer</h2>
<p style="text-align: justify;">Le producer, est un POJO enregistré dans le scope Request afin de limiter le nombre d’objets en session. C’est lui qui se charge de délivrer le modèle aux autres parties de l’application, dont la vue. Il y a deux méthodes d’initialisations :</p>
<ul>
<li style="text-align: justify;"><code><code></code><code>@PostConstruct</code></code> : méthode qui est exécutée automatiquement à la création de l’objet donc à chaque nouvelle requête HTTP.</li>
<li style="text-align: justify;"><code><code>@Observes</code></code> : méthode qui est exécuté lorsqu’un événement de type HelloBean est lancé. Elle remplace la valeur par défaut du modèle par la valeur de l’objet passé en paramètre.</li>
</ul>
<pre class="brush: java; gutter: true; first-line: 1">package org.eiw.data;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.enterprise.inject.Produces;
import javax.inject.Named;

import org.eiw.model.HelloBean;
/**
 * Le producer es dans le scope Request,
 * il sera recréé à chaque nouvelle requete HTTP.
 */
@RequestScoped
public class HelloWorldProducer {
    private HelloBean myHelloBean;
    /**
         * La méthode qui produit l'objet de données vis à vis de la page XHTML.
         */
    @Named
    @Produces
    public HelloBean getMyHelloBean() {
        return myHelloBean;
    }
    /**
     * Initialise myHelloBean via un évènement.
     * Méthode observeur qui s'éxécute lorsqu'un évènement
     * de type HelloBean est lancé.
     * @param helloBean Le paramètre de l'évènement détecté.
     */
    public void myHelloBeanObserver(
            @Observes(notifyObserver = Reception.IF_EXISTS)
                HelloBean helloBean) {
        myHelloBean = helloBean;
    }

    /**
     * La méthode qui initialise l'objet,
         * à chaque nouvelle requête HTTP.
         */
    @PostConstruct
    public void initMessage() {
        myHelloBean = new HelloBean();
    }
}</pre>
<h2>Le contrôleur</h2>
<p style="text-align: justify;">Cet objet est annoté avec <code>@Model</code>. Cela lui permet d’être enregistré dans le scope Request et d’être &#8220;outjecter&#8221; dans le contexte CDI. Il est donc visible dans la vue. Il possède une méthode <code>public</code> que la vue peut appeler. Il a aussi une variable d’instance de type <code>javax.enterprise.event.Event</code> qui va permettre de déclencher un événement de type HelloBean et donc de prévenir le producer que l’objet myHelloBean doit être initialisé avec la méthode <code>@Observes</code>.</p>
<pre class="brush: java; gutter: true; first-line: 1">package org.eiw.controller;

import javax.enterprise.event.Event;
import javax.enterprise.inject.Model;
import javax.inject.Inject;

import org.eiw.model.HelloBean;

/**
 * Controller qui va traiter les demandes des vues.
 * L'annotation est utilisée pour :
 *  - Positionner l'objet dans le scope Request
 *  - Outjecter l'objet dans le contexte d'injection CDI
 *  - Pouvoir référencer l'objet dans la vue XHTML
 */
@Model
public class HelloController {

    /**
     * Injection d'un evènement pour pouvoir prévenir
     * le producer que l'objet myHelloBean doit être modifier.
     */
    @Inject
    private Event&lt;HelloBean&gt; helloBeanEventSrc;

    /**
     * Action pour traiter la soumission du formulaire.
     * @param helloBean Cet instance vient de l'IHM.
     */
    public void modifierBean(HelloBean helloBean) {
        // Lancement de l'évènement de type HelloBean pour
        // provoquer l'exécution de la méthode observeur
        // pour mettre à jour le bean HeeloBean
        helloBeanEventSrc.fire(helloBean);
    }
}</pre>
<h2>La vue</h2>
<p style="text-align: justify;">Dans le fichier <code>XHTML</code>, il est important de remarquer que le composant de saisi et le bouton d’action sont encapsulés dans un formulaire (<code>&lt;h:form/&gt;</code>). Dès qu’un composant fait appel à une action ou un listner il faut l’encapsuler dans un formulaire.  Sinon, la vue ne peut pas interagir avec le code Java. Cela provient de  la façon de travailler de JSF, en effet, toutes les interactions entre <code>XHTML</code> et <code>Java</code> passent par la soumission d’un formulaire en <code>POST</code>.</p>
<p style="text-align: justify;">En revanche, la partie de la page qui se rafraîchit n&#8217;est pas nécessairement dans un formulaire.</p>
<pre class="brush: xhtml; gutter: true; first-line: 1">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"&gt;
&lt;h:head&gt;
&lt;/h:head&gt;
&lt;h:body&gt;
	&lt;h:form&gt;
		Saisir votre nom :
		&lt;h:inputText value="#{myHelloBean.name}" /&gt;
		&lt;h:commandButton value="valider"&gt;
			&lt;f:ajax render="message" execute="@form"
				listener="#{helloController.modifierBean(myHelloBean)}" /&gt;
		&lt;/h:commandButton&gt;
	&lt;/h:form&gt;
	&lt;h:outputText id="message" value="Hello #{myHelloBean.name} !" /&gt;

&lt;/h:body&gt;

&lt;/html&gt;</pre>
<p style="text-align: justify;">La seule contrainte pour que le composant puisse être mis à jour correctement c&#8217;est d&#8217;exister dans la page générée avant la demande de rechargement. Le code suivant ne fonctionnerai pas par exemple :</p>
<pre class="brush: xhtml; gutter: true; first-line: 1">&lt;h:outputText id="message" value="Hello #{myHelloBean.name} !"
              render="#{not emty myHelloBean.name}" /&gt;</pre>
<h2>Le déploiement</h2>
<p style="text-align: justify;">Pour déployer cette application, il suffit d’utiliser le plugin wildfly avec la commande suivante : <code>mvn wildfly:run</code>. Ensuite de se rendre sur l’adresse <a href="http://localhost:8080/hello-world-ajax/index.jsf" target="_blank">http://localhost:8080/hello-world-ajax/index.jsf</a>  et de visualiser le résultat :</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" src="http://everythingiswrong.free.fr/wp-content/uploads/resultat-hwa1.png" alt="" width="556" height="79" /></p>
<p style="text-align: justify;">Après avoir saisi son nom et cliqué sur le bouton validé, seul le libellé “Hello !” est mis à jour :</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" src="http://everythingiswrong.free.fr/wp-content/uploads/resultat-hwa2.png" alt="" width="499" height="105" /></p>
<p style="text-align: justify;">Que s’est-il passé coté HTTP lorsque le bouton “valider” est pressé ? Une requête POST est envoyée à la servlet JSF qui donne la main au contrôleur. Ensuite pour le rechargement seul un rechargement partiel est envoyé à la page d’origine. On peut d’ailleurs voir le contenu du message mis à jour. Le flux qui transite sur le réseau est donc limité au strict minimum.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" src="http://everythingiswrong.free.fr/wp-content/uploads/network-hwa.png" alt="" width="556" height="220" /></p>
<p style="text-align: justify;">Ce tutoriel est disponible sur GitHub à l’adresse suivante : <a href="https://github.com/yanLanglois/jsf-2.2-tutoriel/tree/master/hello-world-ajax" target="_blank">https://github.com/yanLanglois/jsf-2.2-tutoriel/tree/master/hello-world-ajax</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/03/17/jsf2-2helloworldajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSF2.2 &#8211; Hello world</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/03/14/jsf2-2-hello-world/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/03/14/jsf2-2-hello-world/#comments</comments>
		<pubDate>Fri, 14 Mar 2014 21:11:04 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[Wildfly]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=2914</guid>
		<description><![CDATA[Hello world en JSF 2.2]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Voici un exemple d&#8217;une application JSF2.2 minimaliste. Une vue xhtml un bean Java contenant le message &#8220;Hello world !&#8221;. Une configuration minimaliste aussi pour pouvoir déployer l&#8217;application dans le serveur wildfly.</p>
<h2>Vue d&#8217;ensemble et configurations</h2>
<p style="text-align: justify;">Pour cette application il est suffisant d&#8217;avoir un fichier <code>Java</code> porteur des données (le model), un fichier <code>xhtml</code> décrivant la vue et un quelques fichiers de configuration :</p>
<ul>
<li style="text-align: justify;"><code>beans.xml</code> : ce fichier est vide dans cet exemple. Il permet à l&#8217;application de bénéficier du CDI</li>
<li style="text-align: justify;"><code>faces-config.xml</code> : ce fichier est vide dans cet exemple. Il permet de configurer tout ce qui est en lien avec JSF</li>
<li style="text-align: justify;"><code>web.xml</code> : ce fichier est facultatif je l&#8217;ai ajouté pour avoir un exemple de namespace XML pour la bonne version du serveur wildfly</li>
</ul>
<p style="text-align: justify;">Pour rappel, JSF est une technologie qui se base sur le modèle MVC-2. Le rôle du contrôleur est joué par la servlet JSF qui centralise les demandes provenant de la vue et qui redirige vers les bons traitements Java (avec JSF on parle en général d&#8217;actions).</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhwAAAElCAYAAACvYzuEAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF7snQdgFVXWx//zWnpCSAgtQAAhSBNUFAvoYsVVsaCADQGxLyC6q9hdC6KiK9jb6re6NlZsi+gqKEiRIl0gtAABAun99fnOufNeSHlJJiFAAmfwmeTOLef+7iTnP+feO6MNTR2s43AcGlUarFnTwD+CvkLXVbIWSNPp54qHcbZC2YonA+W5bNVylSqpVIbaon+q3gb1VIPFaocjIgKRUeEIs2vwe11wO11wOd3wePzw+v3crXodmsUKq8OBsMgIhEeGwWG3QPd54XW5qW76uD3wef3wc90GPWgWCyyaRcHRKd2v08fnVyz5MMWkyrjU2/B69VIyCwEhIASEgBAwCNgsQWfFP5MzMpwzfV9NCBgFgvmVeAg4ceVrKb9yfCwkDF1RLjI0cpKa1QIrOUxOVF/ZWbLTDHy4OcNhsjOl+gy/ajQa/L9qkutnAaGqMoREoH1OqWiLEjUBW1ROFjsBYWDOOXN/yMlbrbCHh5PgiEREGOBzUjKJA5/HAq9PJ1NJLATrDmKpwC8oCILGKLuIh81mg81uh91BHxYcXrLS54PVRmKEvqoquK/0VSMbrFYbfeirwueD10s2cD6/ThwN/kb3gp00+PB5PliwqK9sIx+UHORl2B8oFzgtX4SAEDgMBCyx6HzdOAyL/AJvvrUTZYehCakyNAHdkYJz7roSXZe/hQ9+LQG7GjmOHAGL3aaRs7PC4bDRJ+D8+GuYQzlCm91GX+lOnBxuON2Nh0XQXT55XQed5w/n46+c7gikc/7gOXsY5aVzEVFRiIqLRYuEeMS1jENsfCxiYqPJidMdfngY1c9lqD12wmSLlb6y4+X2+aO+Vw464KTLHTVFH+h7dtzB/EGbHFSn0Q8qE6jPQk7XECKGcDFEEgEPOmElUjiqYVUfLmcPJ6ERFYPYFrGIb0FfY0h8RJC9SigYNql+Mg9uh8tyNII+Rj+CNhssVR9UPyk/2ajYqa/MgeuhPlFd5X2lusPCKcISHYXoGOLIH/o+ksYjgssyfypvKx8/Zkn1MNeAXYoFnT84ZnROtWeUVWNNjMvF0eG6Brvdhdc3fYdpf3KUIzfXlAbHGQ/jzfU/4J2JySDdF/qI7IATzzsbveJDn66WWqs9Uej410/w1bp/4p5T7PW0N9iSDTHn3ImHvv0WX236BXM2/BcfffEorutuiL9q9jSXhPpyrqlfjVVPTfWXp5u8fmqpR299DZ7nMQx+/tUPMbXkLz9V9RqztEDXa67AhYPiYTNTvoY8Zuwxk6eG6pt0ckP7pTu64rzbrsCfTnCoe9qKh3XQK/hy/dMYFH0IMuSIXc9NenhqNM4WHRVGQQMLKT2+k+Y7eo4SGHfVfP9rOGdy0sqBGhEDrk1FCIJ3yMpZG7ER48Y+eI4cNztWGzlm5fwMB8136BzG8Lp5aoKnD9zwemg6ge7W1TSCihawFQenTtRdekAsKDHAokC1y3f3HCnhu3NKoMSDooKSAhEUn4oG+OHTfEb+QBvKcu4316S6HxAcSqCwUHAgXImNOMS1iES03Ut3JB6a+qApFQ+1aXOQBRSdCAgWjlD4vdQPNeXBNnGExPhwfzi6wNEJjpzYyNmHs9PnKRUSfjylEow+cFTIQtMuPmWUhYQTCT0WDyQOmZ+f8rpdNniIncfDfSIOzKxcUHGH+L9gZMfgo1XlQ2X8ZLPiT9M4HvrKURODp8LSiIcDSUMvRKeSBXhmhUtdZ+YPYtCuK9rbwmDpFg8HMuAKVbjrjXjg1f5Yd80ibMjjPtd21GGPFob47m1JVHrRuQ0LDg8jrdehJ16ESTNH4LRV72LGs6uwzxeDFm2jUZRt9o+aFeF9r8ToycPxpwFtEWv1ojjtV8x97gW6QysCXUkmj8aqJ9BcvTjXYmJj1VNLE8Ypk9dPLfVoOT9g+uW/I9zWGqe/NBWja8l78FQd15ipOkJnMmOPmTyha2/aqY3ar8huGHTvJNx0VW/6OwxMWfE/3LlhDt667WXMz64nhyN2PdfTriaS3dYiPko5NZ+fPvSV/TYLj+CUg5oOYbGh7toNh8luwnBkFXpRHqfnk3yW3b9RzqaiIEYEgEWHlZ0eSRwPCQ4PrYVw0sdNaxfY2XnJWbOzC7avQv3KmbIYCNSnIgQsOth5s9gwRISSKOxw2V5lD5dlAcDO1Ev1k0OlQkp40EdZqfobdCNGeQtNXaiIhYrqRFJEIdaIysRRpEZzQfM64Syj6IKPplpAUQHKz3yInmorKAK81AaLBSVcVOTDEGUsFlhYaY5gRIOFBDOhPMwmIDas5Oh8XuoVrSFhe5Tg4OgPT6l4PbDRN26O/JDgMPrD9gf6EBiPSoKDRVqAj7JFqR9iyzartSMuWHg8yJMrJtQnmjeqwOfQrlrd0QXnXN4C/oVfYU1RfcQGt+tDyZd/wfi09sC2zSg6NFNU6Trt0XOxdtL1mNjFh70bShsUfrW06YMujhws/seH+N8qsyLjYOd0e0f86eGxGLj/U/zfhA3Y7+iOMybchuGvh2H/+Q/gv/vNgWisesy11hRzNcL14y1AZloB3WQ4kVJqro91XmPmqgmdy4w9ZvKErr1ppzZav6LQ+f6ZmHLtXsz/+714aW0x/HHt0DnVivQiw4s1bRDNyzpbi4Q4iiwA5LPUegQffciHG3fnirfh5NW6AiU4+I7bWDOgHHrwLpXSlQuhrywQ+Cd1N81TEjx1EBQcFLpnZ0cxARIBYfCEuemcUwkOI9LB0YGg4DDEBjtTdfeukQ1cX0XHy3fj7MDJaCUblEAK2MkpVNbLUQC7G1YXRw0s8FCHLRXu4pXeCGgOFhtWEgLhtF4jMiYa0bExNI1BEQ6a/omKJIFBnHwumgaK8iHKQosuKMJhoQiOMR3BfaLIR5kTLhdFQVhwWALTKWr6RYUmlIPnRaF+oqCmpuhcWLiNsPqJMXM2Pm4XR304akGigmwK5rUSf90W6CeLK1tApLHE42gKp7EaC3TLEFTUQR4jOm9M+VQWHByxcVKdDILNhkZ2x7XGiROfwd+v9GLZpFvx9P/ol1HV2rDD0vXPuCi5CKse21JJMOj2Nuh322SMu+F0nNCC6vaXIHfrOvz2/ON4dWEZfBTKfuGXu9Er2OzyiRhx4+rKdUQOwJ3zX8BlcUamIZ//jCHB/D/cimsmbEZJFbNrsscffymeXfJX9KuYf8nduHbMOhQH06J74cKH7sGoi7uhdQTbXIaitP/iH6NnYEkB/Q5Usaf1x/MxKFA2b/pVGP12DujqqfPQPDsw97ph+J4EpsF+BVYd6IEzPjoZp3eykuAwF+NorHqq9isU52JHKq6Z8xbGrL0F10zeAvbN/ujz8OSKR9H52Ssw9v08eEyOl7o27rgXt95wGjrH6ihN+wXfvfgS/u/nfIo3BY64k/HniSNw7lknonP7OESqeYpCpD8/DhPfPQC3ietH1WRLQOqNEzB+zGD0TKLfhbw0/Pbei5j53kbkmsMctKj8a03XmMpw6uN4aw1NMdP8oGf3Unw/bSre/rFCvw6DPdUMDCSY4lxTYZUehW6vzMHLbR7Fzdf+ggMV/lD44y7Gk4smwHHrZZiymNacNcKYlo99rTaxWd1wzt/+ijFXpSKJbuAKNu9S01jBdTO6owNOPYt+gVe9jnc+WQEjKLoJmxZzxeZvisz8Xqi/P3Vcq6pfZsbdTB6uq4kdtiiaKvDSXTTvtvDQXbeXPsrBK6fP/ttwUOzoD06pGOF7JTgoj9Il6o466MSMn1VZvrvnNR1KdNCH12OQ02PnGlzLwA7Qzmsy3I5AhMMQD2qHBn18aoqCjWHHy2sOjLUHtOJVTUMowcHTMRwNYT3EooPN4Z+pvJeEho2cqWE/2UjRDi9FJ4J9VD1QnWBxRWtZaEdKRDSJDRIaMbTuJDqGxIfaSUJlKQpjpekNRxRdy/SHwkKCw8prSNhZ6z6KFATWdfAOFmLJgsMQW5TuoCgI2+nhqA5NI/Fpiljw2gvulyEkOILB0RsWFG5YWAlyvwPrPpgdCz+dP9w/NtvKgoPNZ5HHa08Oig7OoQSV4sKCwxgjY9rJYMRTQN6g2KDv+VrQLXZEtGqL3n1ZILbGKYMS4SDBQetlG3iEoe2w89Cu8Cf6I8uTISxu6NBi0e3BdzB1VDFWzngCT6wugjdpMG599nIM6BoOCwkOf85cPHfJckTQH6rTX56GMSEs0MrW4eMRozGn5+2Y+mIPpE2+B++lccdpWAr3hliYV4M9lN9SOB8vXrIekTyk1jY4c8a0KuHzCHT460uYNHQ9vnr8HizYVgYtri2Sk8uwK3DnW7M9dD1m5ZsSG8FucjTL6AmnWBDWJon+vO/BlgP184KNUU/N/aqJc4jBoiRT9WhxSH3oXUwdmY/fpj+K97eEIfmquzD+jTeQOGY0nlvC03J0tBqIS68biOhZL+G15zKQXUjCPbYFIrblKlGimbh+oEWh071v46UbsjH/uSn4YJ0L0WeOxl33zsSTRcMx4ZP8ekxfBftc8zWmcmT+jE+nLcUuV0t0v2kybpr5d+ReNAGf7GKjD4c9QbuqfDXLuYbiRrIXRTtJjndvg1ibjgNaAtq20ZC3KwfOuDZogVxsyuG/ZY0zprWaEjxpTcRJz7yO+y/YjYUvPIJX0yPRdtBwjE49WFrzUdQqh37uOxbXD9mJd+YdgPPgL5upZjiTqeuZM9ZxrZoa9yN5bZgmYC6jLSw6lkLy5PzprtvKd9Q8/cAh+nLBwVEFw+EF75nZmfOWTCU22OnxN+zMlKM3HAk7N7WrQkU4DIdq50WhnMZ331zeqMiIiND37Ow5KmA4UqqTxQKvvWDBQXf6vNbEEBw81REOOzlPFTGgsL/Kx9MrAVtU99k2cvCcTdketJWFkVorEoCkPDIfHC3gaAPVTx+1OJbWTNjV9E0gqsPTTVYSThGUl6ZTOIKjIgYBW+hswH7qj1IUhkhSizY5KkGixKsQUaSFDVDl6UOixcFOn8STNcCFt7yy5X5q01hbEjCTUxUvssDPep3jRZwYiF6w4AiIDtXxwIcFiZEtEB1RJ8heYkfa0Jh6ooiT2u7LQq9kP75/7kPYBvqx/v30QxAb1Ep4Ks6/JAre+V9jQ3FAbHDrbS7C2JExKHrzVjz12l61LsNP1+Tl9K+zspYObxGyttMkis2DLjUt6dedyE9PR35MITkZD4p3p2PX1pr/ctRkj2rPV4Ls7YF4iM2PnGoqy46YtqQ2C7Zg/a+/Y6Oa592IP1RhgzHqYY8WTguAHTQmXJxFa2kpXDVoCUvKVZj02Iko+9ct+HKnarBBR2311GpPPfpVq2Em6vG3uRjjRkYjb+ZYTH17P9xU4bLF6cDXb2P8pLPwwbJ5yCznVIa9332DeYtCgDNx/eith+K2m2Kw9cGbMP2rQCRvDe0gOXU2nhk1EG1nzUWGmZBUhU7Xeo1xvoyf8dNcI1K3cksCBv54C84fEIXPdpVQVK/x7alpPOrDueZrw0O/DnnAtR0RT5HcyPOn4+1pLnx0wW34pGVHJOj7sT2L/uY21pjW1JmK/NsNxeiL7Mh67j48/54RUfQv8+CUURRpC+bzZWLxo29j8fvjccmrn+OSvcvwv//7BP/5bGX5zYOJpuj3tj5/f2q+Vs1ch7sTj9y1Yarv9chks4ZFqTtkjdY30K0/NIoGUICP/shzlIGdWkBwkGNkP8gOij8WWvPBd89KmPA/vsNmJ8hrBOgrC4+Du0x4F0lwHYOx4BNU3m+hSQV1R04fqsfKEQY76wJjoobXZlh46ylNXbBA0Klu3o2iIgJUH4sBY4qC29WMRaeBqRU1BUOm8oJOUggqP09l8C4SvxIvhiNnB6H6xXnpYyxyJVvJYXMEhTvm85ADpoA2RxX4Zz9P7dAvlYWiFwfXtnDUh+xV0xlGlMFK9flZgClufNA3ATYWnqJiccW81IfFC6WxiCBj+HkcKhJEi1xZGRlrVTjyRPaqPjH1QH2sFrgfZJ+xQDXQPpXnhS7GNBhlYVOCYxRM53q4X8Tax9GngA2a7kZZNqn9rLn4J20fq3bY2uDkh57HlFEdEZmzEctmfY4vZi3H7o5jMWXcPrx7xydIc5V3HJbUy3FeUh6Wz9peaWrD2ul0dNNy8PvPmaEXgVZruHESarLHXO2F2DTtFcx/92489OuF2PG/7zF/9reY+0sGikP4u9rrjESnx7/Ga1cE9yvkYcn1V+PJlVUrot1kJ96ABz64Bf2WPIqJz6ehKLhSufYGqpytqx6z9tSr0QZltqechq7IwrJfs5TY4ENz78byxU6Mv/xUdAz/CZklB6+xBjUSKGRNGYhudCMRNe2/+HZalZqyOyGe7tozvPVrqz7XmJ63A3tI2J5MC4qt/BtyGOypiY95zrVdG344M3aiICoZbaLj4RvWhf7c+DHkjDh8WdgZcQXLsK+Mrr3UIzemtg4noxNdP0tX5NYSUSQftvlDPHXuj+g29HKKlF2BCx54ERfc/F/MGPUc5u6ridrhSTdzHe49gtdGY/fSpmsOunMkwcHOlhyghcUH/WKxEw7e+BuRi6BjNu4alexQEQMjIqFC+oHfR15rYWFvG/C0QSentokqp83/cVmOGlB5cqjGjg5DsLDjZTnjp1CycvgU4VB35+ys2VEGnKVy1DyzzdME7IhVyCJQJzt7Vbfx4c4EowSqvM8wlm2mn+h/gXUnymbDRo4w8JSNz6XDzZEfFTUI9DuQhwck+BAuIxLD0RiOupDdAfHDkQevZvSFAyEGQcP5q/KKIzfLwoG/MmvDPj6hIh18nuPDnJeFSKCfwd0pqphyQMF+cZ+4Z8ZXtaaD/2NBo/oRaIMjGXrgZ64kaJxqSu1d4tRqh3bizbj9nFWYce5dSKO1GcPvuR/TbuPNqqXY9vxY7KwgNoBIdLhqMFrlfYOX/+DbxEDf+DtaEEt7cWj6KXQ7lRqukOVgDdVMM5FQsz0mCqss/m2f47kLfsKsP12MIZdfjGteG4Wb172HJ2/9P/xW5+6Yiq04se+tyZjytZ31IFXsRO7mqmKD1vr0vw1Pvj8SHefcj7seXYJMT0MImKnHjD11UeLfQRpbuiFoiJWVa1dXcKUj+KtRlxXVztdy/ai/DRT2X3rPvTR1w5HFCocnH/srXc/Vag6RUN9rjH4HeMYhcH/S+PaEMLFSkhnOtV8bvj3rsNc/jBZcnomTT9yAz9+Lw7ArB+KE5S1hpXP7yhmaaasue02cZ99Eo2qsZ6vj74srE1u+fAsvffk+/nnhg3hxxp9x91+/xq+TNx1ct2WiyUPNYmbczeQ5VDsOV3kbOxvlxDgsT2OinD87S94totwNXRwUiWBPxD6LBQDnDu4MCS7oVA6TQ/+BO3yeSuHLin9mx6/8VsCxqtgIpXHEgbereim6wtM43Ao/fdNGEQ+OLvhJBPhoESbvNOFdHWyqRdWhKlM2aFQP72xR2155LQJ/JfuN9Rn0VYkGY6Gml9d7sAhQgoCnjRhr4M+Zuh7p4qQ+WNieoG00/xGcJuGoDv+xU3VwOY2mP0gcqSrYcZNA4h0qxgJYY9GoeiwYR1TYbu4ziyPuf4AH20FqBh4rrdeg/lqYr1pjYggXww4qR05Z9UnVwc/LCNbJHKgyMkzVyRER/uPJzNlKpZAYPaWp6AmfDoyTymHYrngEPhwB4lBTRMtERHfsjYsHgqZUZmN5hS1i+rpncfsFNLYMMfNjvLroc7zXtj0SvPuwN8tdaXGpHtULF18YBvcP32JjlTtS7176I0XLM3uf3AK2dXm13ImwsW6U8q1uVEtEUUcKq/pl7pu7jO6GI9Eimt13iAxcTS32MA6zh+bJxY4f/o13f/gY73e/GdO+HosJ13yL0W+ZWxBqtOOHa/sarNleS6tt/ox73hqJznPuw92PLMeBGu+0rYg6/VpcO8hZbbxU7abqMWEPVVUbZ81XhP20mQMdUygysAkltUxF1FaPJ30ZtuFUnHR2EhxrMlWUQy3yOyOcdiqtwC5nVSlSC0M+Vcv1403/DVv0U9Grrw/Zc3eiVP1i1HD4vaDZZyA8BjSziqIq+kQ1dYjXWGPbQ39sa7TZPOfarw2tYBvSilpjwMiRaLHlDbz2UVukXnMDroyNRemSnaClNTDfVg3sqybX2q/fsJWun5OHtEPY6hq20Vetj66yvJ8/wXcZf8KYDkm0josER4jxrVYskFDb9VxTmYrpZsZdr8+1aqZR8gq1/t0wVYe5TDa1C4I9FYsMcjjs/JXTVM92oD8sFPFgB25jRxkUHOxcA1tReS2HWl/BdSjBQdEN+rAj9jl8cPAvLosQWhvBaRYrVcpOU20N5e2qAQdN7fEaDQetZ+Cq1BoRFhpsDz9GnM/TFAaLIHV3Tq7SF1jzwI6e87n5q3KabBOX54/hpA3RYqxRUdtj3dRXZXdFUFQ3O9vAdJCxdZQcOt2p8Ye7z+2Wb90N5FPRF7LXTwtKPTT9Ur7Fl22gErxGg8WRztNBKsJg5PewqOGLmTnQOhR3GZ1jQcOCh3ft8E4XtpXW2LCmMIQUL+LkqRuyRPUvIK6YCws1WtNhRHZ4uodFCPfHGAMrTZnwIPI4GKLHEEm8Q8XtpJ01ansytcdiUydbw1rhvPtuwDU9EjEsdhVGPlp5HYexxiTIj55Psm8nPR2j+mHrdQXOjc/C4i+qP1VR2/1f/HvRjXj4r89ikv8jLNgbjlanXYkTqZpqSyf8hchYRQvTbh6D0aPctEc+Hu3CVmDOV/vKp2P8+9dhq/MKnDN5DC5+fQ2yLK3RMXol5nx5ME9t9lS3PlRKNLpM+AsuLFiKlRv2Id8dgfgBJ6I1CZzC7MpiK1Tp+qVFouPtf8E52jy8/lkOIrt2QUqgAq00E7t2l5bLKj2iL0a+dDuubokQ42W+HjP21crZl4UNX++G/tAE3DfJi48X58Hdsg9ahai41noy5+KdT2/Cy3+ZjinetzF3awSSr7gd41L24Zcxi2Byg87BVmu7fjK/wzv/uh4zx7yJ6XHv4YufdiDHF4X4Tq3g+eFzLKgYWud6/qDVRuRMR13lxZLiBLSxrcD33x6cFjzUa0xrZHtQm82NxFlz7sSqdCuGDUnEhrtXIHtfDGatuxt/P9OLbTOMaTFLI7VVPqh19OvdT+j6ufUVPG19E7OXZqGsRV8kVbgOdVsyBv1tOFI2LcXaLTko0aOQcMYNuDwZOPDZRuTVQ2xwtbVezyGu/6pJZsbdTJ6q9db2c+1/N2orWf9zNhYLFlp7wAsH+bkY7HTUtk66yw7uDGFHxREHdlKEVN3Vqvd4sLML3rmr6Qzl2ZTjM9Zv0EJIqiecB43EAtdjJcetIiVKTLBT5fboeRwUUrfQ1k/jGSBGFMLj4uddlKGspAROdro0VeMgp66eG8G7O3hqgAUA1aPEi3LcLJQCtrHYUEKIFYzhnNXzJtQzPziEyef4dMB2dsZchnvCRqooAokmstvDgoP6zMLCeEiZISaMR44HpoBY7LANvOZDLbzlPMzDS4ty6WcSYMEFqCyAWHAo0UPtVlwLojNfPscP4go8jEtFKGgtC4sd9QySgMhhwWEIEbaZ180Y25CttMBScebxoQ+vJbHzc9mpLRv1RQW2WKTRWJcVl6KsiD70lZ+Jwm16iYOlOBsb1rrg67YHKxdml8+j1+8yi0bK8IFocYDuGtI44sBGVTgoIrL4ngl45dHJuG7KkxhCfcxPy1CRGA6T8FgcPFzY8+ZT+KDH33Ddw09jsD8PGZ/uxM/fkJgI/GHQ8n/BWw+eipYPXIcJr91IYi4Xuz5Nx/yvg3nqsKdSexV+qGiIlbZNWxLR67ZHcHlLZSl8OVuw9u0H8Mq3hUoUN9ah21qhx8k0btFDcMfHQypXu+5hjB6xELQWTx2aOwMrF+ThistKq41XfeoxY3vtnL3I++Q+PNz6Qdwx6hE8dgvX6EbxrtX4bWdlQVZ7PQVIe2ocHsy7H7eNfwKPRZMI3b4Qs++cjveDO1TMGFuep7brpwjbpo3BxIy7MPamW3DPVTw96EPZzqX4auksEhwVL4Ay7H51Kj7rPhlXP/UsLvLlYvdnO7FwDgkONRYNvMYq9kVvTHu44tpsbiTO/nzsXF4IpPyAT5aU0p9KF1a/9xuKzkzAirQydfMFvZHaKmdVW78Kkfb0ONx/4B7ccsP9eGgc/156UbJ7FZaku4worC2CAqZ9cf6jV+I6Cpypg7ZDr3ztHsz85wGaxa7f73Lt13O50TV/Y2bczeSpuYVqZ2r7u1Et8yEmaM9OeUHXaZump4ycenERSouKycGX0cOfAs+RIIepFiMa4Q1qTnlo5cSUI1POmv1wIE0NEDk1Fc0ggUCP5A6nB2fFJCQgPjEeMTG0pdVCIoHaK84rQHFhCUopTu6lhZ0OevYFP7Y7PIycK70grSQ/H/m5+SgspFX79FRP/kOuHgfOz7RQuzsMERSMXqjIBjt5FkNsH4sgZW7AZnbOSlhxJCTgqNl8/qj+kS4K7hhRD/6iLbiBrbwsblRUgIQCO33+GNMqxuJYtTaFUoypHUMYsJjjepUA422/vCBT7VThaSsWG2wDR3aoLH0CJnB4x4heBKY4VFvcF/UcEl5Yymy579QiR6WoT2SW+gViwVGeh2cVWHxxpIWiTmG8zbcljUVcBEWSSDiRmCspKEZxQQmJDRZ39KEdKi6KFyuxSWV0irzweDf08EefhUnzn8E5s2/Edc/sMrUwVO84Gi//cBOsEy7BhB8CWx8bakCVcvW1R6cHbV397du4ZVPoZ3k0kllSzTFEoL7X2DHU9WbdFX60+X9eL8D0gVOwsMJOumbdqSZmvE0jh+Ljt5+SACgrJufPnxJ6EJdaR8CRgsB6Dfqe76qDL2Cr2A/lswMOPrjOQK3lICdtsxUjrJTq95FjjqBnW8TT/vhI2lFC/5xFxhtSecrEZ6NnW6hdH+RGeV6ulB1hIYrIIZaUUPnAiiqt2dg3AAAgAElEQVQLOUR22srpKifN9gWmFgIiSNnCBqqfja/K3kDko3zKhR1/uTNlB85TEF4lWFTkgKZoeLpBOfCAoFBTGAGxooqSDWyLsZCVmlTneY2IIXp4esZgQZEVtVjTsMeog6cuDGduVGVMgSghwelsX6C94DoNFcVQaziMWIFqK9AvntLisIaxU4bX5JAECZzjxZlhpB0sLKBoC6afoi6uwkIU5hahuKiMokxkn3oaq7EGRrXPKuYQD0f/K3F2zF4s/Gp3DWIjCh2uvQL9irZgVxZNorQ4ASePG43uJT/jpd8bV2xwV+q2x4a4oXdgZIet2LStGNZ+ozCioxtpMzJCPMvjEOFI8WOSQN3X2DHZbemUEKiTgM1dWkTOvZTudAvV3W5JCYXW2fnw1EUgamF4bWMJnjd4G27c0FdqIOjkVaJy2LRIiKYvnKX0FMaCAuQVWBDbtTe60ANhDtAfcxYkrhJqkxyej6IatigPOT5+AFkZRT/yUJBboKIbzsAdt9q5QVt3D269DdzlB51zufMOOHH6WeVQ3pyNMqIeQXHEsiRQxDjHAkat62DBwdEKEhxuY/rC2DVyUAQYTVL9SlAY0QnOE4z0sAgwWmQNEMjDIozNocIqOsR52K+znQEzuYxCG+wL5w1GavgcZfQq8cOZOB/XYQgnJZiC5ekr1x/ISekk2vgx6TQ9ZNFoTQ49GdNVSKKOIkxlFGFy05oWte4lYJvRwCH+nx7y0+3aUxG97z2af2ceQWsq1GuLQ/KAofTEzlvRgrZEw0/P3Fj5Fd4e/SZ+qu97DOoy14w99JaW6ORO6DN6GIYlkEEle7Dx3Qcwba68WbIuvHKeL3ET17yAapIEfAvvxhW92TS+K5TjcBDQJlw5hmZU6MmXJDRKaSqFH8mtFg2ykztMhxaViPa03xzFOSijLadOJz1ng6Ifkfz22HC6M6edBmVFJSgpJnvYEYawRe20YAcfdNbKQatJD8NhB20PeGAjehHsU0WhEaKTXDf/Czh2Q2xUFwLcEOfjQ9mi2jZs4jQlGlRdKoPKo1SCcVJ9FxQWgdo548E8Fc8HTec6AvWqr5XqUD/WetjoKanh0eG0Jod8O62RcRF7Y91LRVtqrUJOCgEhIASEgBCoNwFt+CkX0U2ysZ4h+Ajxg06w3vU1vEDAMatHb5MfDd5pB3xqw+ttaiUDIiUolAyBERQnZGy5sKjw/WHog9I+AXFzzDE+DLykSiEgBISAEDg0AjZerxE8jorQONi4ccdv5gFQh9bno1uaxVRAVRiOPqgwyKwK31b6/jBYXK3tw9CGVCkEhIAQEAJCIEjAdlRFhoyDEBACQkAICAEhcFwQkNUxx8UwSyeFgBAQAkJACBxdAiI4ji5/aV0ICAEhIASEwHFBQATHcTHM0kkhIASEgBAQAkeXgAiOo8tfWhcCQkAICAEhcFwQEMFxXAyzdFIICAEhIASEwNElIILj6PKX1oWAEBACQkAIHBcERHAcF8MsnRQCQkAICAEhcHQJiOA4uvyldSEgBISAEBACxwUBm27vhKhh49Ghowv+Ra9j+7Js8FvV5RACQkAICAEhIASEQGMRsPhanomkE2JgcSQi7NRTEWUVtdFYcKUeISAEhIAQEAJCwCBgseYtRdYuN/1UDM+aVSj1GW8/FUBCQAgIASEgBISAEGgsAtrQ1MES0mgsmlKPEBACQkAICAEhEJKALBoNiUUShYAQEAJCQAgIgcYkIIKjMWlKXUJACAgBISAEhEBIAkpwWJLPxvlXDkD7MJldCUlJEoWAEBACQkAICIFDIkCCQ4Ot73hMnjoKfSJFcBwSTSksBISAEBACQkAIhCQgUyohsUiiEBACQkAICAEh0JgERHA0Jk2pSwgIASEgBISAEAhJwBYyVRIbjYDe+hq88Mvd6BWscflEjLhxNYoarQWpSAgIASEgBIRA0ycgguMwj5GW8wOmX/47wm2tcfpLUzH6MLcn1QsBISAEhIAQaIoERHAc7lHxFiAzrQCwOZFSergbk/qFgBAQAkJACDRNAk1HcFgS0PuBp/GXS09Ah5Z2ouVF0R/z8N/pM/HvRYX0k3Ho9jbod8e9uPWG09A5Vkdp2i/47sWX8H8/58NDWbQet+PxV6/CgPZh8GWuxq+L/ehy8cno4F6P/z34AGbMK4LPzFi0vRz3f30vzlhwH8b/bTmyqJCeeCHu+e9DOHvuHRj3xB8o7N5IbZmxR/IIASEgBISAEGjGBCoIjnboP2I4wkqMdaS+zM3ISUhFEvv+Gg4zefwZ8zB3fq4SA7Uelii0Of1EdCj6AC/8bTXywjqg53W34/p3e6LVjWPw4nI3dC0OqQ+9i6kj8/Hb9Efx/pYwJF91F8a/8QYSx4zGc0tcsLTqjZPa78YXt72INUOm4YkRmfjqzon46JJpeODJGzBvyWtYU2bifTH7vsXL9/RDj3eexqOrr8e9H9tw8lNTcGH+e3jguQ0o8GuwNlZbtYKRk0JACAgBISAEmj+BCoKjLQZNmohBwT6t/Q/W97gavR01d1JfNQsbeg2vNQ8WbMJ8M4Ij2MyB37H8V15U+Tt+X7QV7m9ew5jJZ+DDG37BvqSLMW5kNPJmjsXUt/eDXzm3bHE68PXbGD/pLHywbB6yuB49F+mr12Glbzuc13qQvmoVFjn/QNmfu6M9PWvElOCAH85FL+DhV3rizYdewORuXpw2aDNmXfUh1pZUECyN0lbNjOWMEBACQkAICIFjgUAFwbESM86YhLl5FXfKzjDRx5km8jQsi+bcjqW/OjHmstPQMfxnZKechq4kKZb9mqXEBh+aezeWL3Zi/OWnUp6fDMERPKfzg8w0+qdD9/tIQthh0UxEN4Lm6qXIePMB/GPQB5h8LZD3ygh8tDn0hIx2qG0F25SvQkAICAEhIASOQQJN/DkcLBRINGgWEg3BgwVE5aNGDaGTyPD5SWg0/NDaDMDAEyhoQjoj/rKh6BFdw9NYG6GthlspJYWAEBACQkAING0CTVpw6La26HtaBJD+O/a4NHjSl2EbEnHS2UkIzvTojg449YxwYNsK7HJWliK+xZMxvPd9+KFS1KbigFgRdfoojLnvSgxIDDFQUX1w9St348xN03D3sFewNOlmPPbgSYgPQa3OtvxeuHjla3gMIkKUD9G6JAkBISAEhIAQOGYINJ1dKkGkvW/G2DHfYvlOIHHobbi9WyFW/WUR9pGztmTOxTuf3oSX/zIdU7xvY+7WCCRfcTvGpezDL2MWYT9FIerjy/WIvhj50u24uiUwLHYVRj6aDmfQDi0GXSc9g3Ftf8A/Lp2DHQesmP7wWXh/+t8x6cdReGJeWf0uAn8hMv5wAdfcgFFXebGkOAFtbCvw/beZoFQ5hIAQEAJCQAgc0wSanuDwR6PbuIdxUSKtvDiwBvMfnoZXfyw1pkX0AqQ9NQ4P5t2P28Y/gceiAef2hZh953S8TztUapjsqHEANXcGVi7IwxWXlWLlwuzydSHqhXYn3YkpN+pYefdL+PEAV+FDyffP4R/XfoyHHr8Z/ZbRbpcaaw51ogy7X52Kz7pPxtVPPYuLfLnY/dlOLJxDguNQ5nxCNSVpQkAICAEhIASaGAFtaOo5uuOS9/HlizkhFo0eQWttHXH+f/6FyYXy6O8jSF2aEgJCQAgIASFwRAjUZwbiiBgkjQgBISAEhIAQEALHHgElODSfC64yF00aVN3/cex1WHokBISAEBACQkAIHHkCNKUyWLckn40hA1zYOGeZ2g0ihxAQAkJACAgBISAEGpMARThogWTf8Zg8dRT60FM45RACQkAICAEhIASEQGMTkDUcjU1U6hMCQkAICAEhIASqERDBUQ2JJAgBISAEhIAQEAKNTUAER2MTlfqEgBAQAkJACAiBagREcFRDIglCQAgIASEgBIRAYxMQwdHYRKU+ISAEhIAQEAJCoBqBJvVocz28K6L/dAVan5iCMAc/79sF/4G1KPzyQ+zLZds1+NsMRqvT+iGmYwdERNsDHXJD2zkbOz9bhBIfb+ul9M7nIenMgYhNjoedkjRvPrwbZ2HXd2vh9MvW32pXgiQIASEgBISAEDiMBCoIjnboP2I4wkqMoIcvczNyElKRFPTpIYwwk8efMQ9z5+fCE6J8pSQtFpZLJqJjd53EwQE495bAH5GE8FatYOFX1KuHklmgp1yEpJ5RVWpzwGEnQaGEhA2+/hNw4kUdYeVSvkJ4CpzwhcUjylEIn4iNukZCzgsBISAEhIAQaHQCSnBo9Op0D1IwaNJEDAo0oa+ahQ29hqN38D3wIZo2kwcLNmG+CcGhW0gQJLFE8EL7ZQZ2riiAj3WGPQIWb/WIhGPfu0j7aC3K6C2yuiUC9nCPyu8P642kP6WQ2KDnpi5+AVt/zYA7+HI0rXo9IbolSUJACAgBISAEhEAjEyDBocM1dxyG9QhV88xQiVXSzOSpuxrNtw/F67Ognx0P/3l/x4kDtqBowzLkrVqBwsLq5TVvCbz0Ono+NH8ZvKXG93p8b8TSdIzmX4Os5btIbFRYpqLLg82qk5QUISAEhIAQEAKHn0ATWjRK6zAWTUXap1/hwMZdKInsjsgzrkf7O+9FSgeOfJg8glEMEheiL0wyk2xCQAgIASEgBA4zgaYjOLQwWFrROo6dPyHnq+nY/tLjSNvAIYxktBjQhlZmmDu0/I0o8mjQrf2QdGoy7E2nh+Y6ILmEgBAQAkJACByDBMz68cPedd3eGTEj70K7yGL4cnLg9oTB2saIbPgOFCG4DKMuQyxla3BgwT4knNcGlrPvR7czjEWjflsUwnwLkfHuHBSGWBNSV71yXggIASEgBISAEGg4gSYjOOAvhPuPjShJ7YqoBNryyn0q3gXX+u+QvrTQtOAALX+1rJiOtPwLkXTaKYhp3xL2lrFUmQv6Xg2aJbjjpeHQpKQQEAJCQAgIASFQPwLq9fT1KyK5hYAQEAJCQAgIASFQPwKywqF+vCS3EBACQkAICAEh0AACIjgaAE2KCAEhIASEgBAQAvUj0CQFhyX5bJx/5QC0D5PZnvoNp+QWAkJACAgBIdA0CTRBwaHB1nc8Jk8dhT6RIjia5mUjVgkBISAEhIAQqB+BJig46tcByS0EhIAQEAJCQAg0fQIiOJr+GImFQkAICAEhIASaPYGm8xyOZo+ytg44oA+chG7nJsGx+lVs/WHHwRfK1VZMzgkBISAEhIAQOEYISITjSAykFgN7ahfY6Z+lW09EWGVtypHALm0IASEgBIRA0yEgEY4jMRZ6LtzffYis/q1gS5uHQnrXixxCQAgIASEgBI4nAiI4Qo62Ff5eo9FpUCqiWoTTq+5z4NxZCq1jR4Rr2fD88hq2L8uGT9fg6zYOXS7ugYgoO5SMKNoO5/JZyFixBx6/Bk/vR9D30oSDrfRPhPelN5HtOhhc0q3tEHnJ9WiT0hphgXq04h0oW/Jv7P79ALwSEAk5SpIoBISAEBACzYdAExYc7dB/xHCElRiO2Ze5GTkJqUiy1wzXTB5/xjzMnZ9Lb1yp7bBAb9UD0S3CgOy9cCe2Q3jnBOgH9sGd1AaOwZei5dp/IqsM0J0+aO5suAqd8NtbIzKxC8KHTEDXgoexebMXlsLNKExPgMXRFlHtYg1RUrVpaxzCupCYifBDK9qHMn8iwuM6I/yCu5Fy4DFs3S2Koyoy+VkICAEhIASaF4EmKTg0v5cEQQoGTZqIQQGe+qpZ2NBrOHo7agZsJg8WbML8OgVHsI0i+L6fgS39p6FXz31wfjsT6ec+hxO7tCJxQHlIcNh2/xPpb1JswxEFm90O38Ap6DEgHOGpJDI2Z8K661Ps2QX4Wl6Ozreeh6iazaczBXB/+Sx27I2HdeTT6N4pDlE9E2HdnQVfreXkpBAQAkJACAiBpk2gCQoOHa654zCsRyhwM0MlVkkzk8dENeVZ/NBL3fSTAxarB74S/t4Oq40nUOzQe45Ah/MHIiaysiTQwgNTLPVpKphXL4Y7sxjoFAYthj4NqUPKCAEhIASEgBBoQgSaoOBoQnQCpnDEBeBPZdfvix2M5MsGIEYrgOe3b5Gd6Yan6wh07E1TMVUOXdcRnBgxIyB0r1/VoFnM5K7amvwsBISAEBACQqBpERDBUed4uGGZ9wA2zuOM4ZVy69EdEEF6wOL8HTmLFiPfbYUn/LKQgsPiLQ5Mi7RAeDQVclFVNoqC+DzlQqROUySDEBACQkAICIFmSkAExyEMnKVgM4q9JyMsfDDajmmLmGwnfPHxIWvUSrciP9eOuJbJiBn7BLoW2uEIW4PMNz5FbsgSkigEhIAQEAJC4NghIA/+OoSxtJQsQ+asH5FH21X88d0Q1a0PYhO98BfuRfHe0kqRC82XgeIvv0DOATd0azwcLXT49hyQxaCHwF+KCgEhIASEQPMhoA1NHSx7LpvPeImlQkAICAEhIASaJQGJcDTLYROjhYAQEAJCQAg0LwIiOJrXeIm1QkAICAEhIASaJQERHCaGzZJ8Ns6/cgDah8nskwlckkUICAEhIASEQDUCIjiqIamaoMHWdzwmTx2FPpEiOKrSkZ+FgBAQAkJACJghIILDDCXJIwSEgBAQAkJACBwSAREch4RPCgsBISAEhIAQEAJmCMiDv8xQamJ5dEsSwq+8F5270tNLv5uOresqP/OjiZkr5ggBISAEhIAQgEQ4muFFoNvbI7ZLBL1nJRHRqS1hbYZ9EJOFgBAQAkLg+CIgEY5mON4W1wZkffMjrB1L4Vm2R71WTg4hIASEgBAQAk2ZgAiOpjw6lWyzw3fu0+g9sPKbaLXeCfC/8jHy3Bys0uDrNg5dLu6BiCh6MRyXL9oO5/JZyFixBx5/BPTLnkXPXkDY5uexfnaGEiu6vTta3D4B7aIK4Pv4YaTtRB31NBtoYqgQEAJCQAg0EQIiOEwPRDv0HzEcYSXGLJQvczNyElKRZK+5AjN5/BnzMHd+Ljw1VxM444eWvQFF6VFqHkwP64DotpFVSunQnT5o7my4Cp3w21sjMrELwodMQNeCh7F5cxm867fC2+sEWJP7I8q+GwUeDf7EgWgZ5aO33q5C5j4f1Wmpox55w22dwyUZhIAQEAJCoBIBERymL4i2GDRpIgYF86/9D9b3uBq9HTVXoK+ahQ29hteaBws2Yb4pwUGCYP0HyFhvtOdtexO6jz4F4VWat+3+J9LfpNiGIwo2O0VFBk5BjwHhCE9NgGVzJix7FyLX3R1JUf2RkPgNCvaFQet7kqrHvmURilSkBKirHpYlcggBISAEhIAQMEtABIdZUliJGWdMwty8iutsZ5goPdNEnsbKYofecwQ6nD8QMZGVJYEWbkyxWFybkbXZh6Q+CYjplQAtpw1a9mDVdACFK/cF1oPUXU9jWSz1CAEhIASEwPFBQATHMTTOvtjBSL5sAGK0Anh++xbZmW54uo5Ax94V132Uwb9qFVx9Tob1xDMQsacLkiL8sGf9Dzuz+EmqtA7EVD3HEDjpihAQAkJACBx2ArIt9rAjPnIN6NEdEEGzKRbn78hZtBj5G1chf09pNQOs+3/Evhyabok6D+2HdqNttSRMlvyOMp9aZgqz9VSrWBKEgBAQAkJACNRAQCIcNYBpjsmWgs0o9p6MsPDBaDumLWKynfDFx1friubbh6IlO+G/tB1sDj+sxfOxe6sLurGvBWbrqVaxJAgBISAEhIAQqIGARDhqANPkkzVj6DgmoQWFQskyZM76EXlZNG0S3w1R3fogNtELf+FeFO+t+DRSEhlpX2FfMT8yzA//r/NQ6DaiG9xvi+l6mjwlMVAICAEhIASaCAGJcDSRgajbDBIH7bsgMmcrSp007dGiNXipp8VJW2r9wdK0kyX9a2S+S586KtTcm1D4yt0oDJnPfD0hi0uiEBACQkAICIEqBERwNJNLQrd1RuywiUiOpWmSAlqXERen4hqWtNUo9R6MTjST7oiZQkAICAEhcJwRkCkVEwOu+VxwlblAj9QykfvwZNEtbvjSNqKszA4riQ2rPw++tR9g64IssksOISAEhIAQEAJNm4A2NHUw74WUoxYCluSzMWSACxvnLMMe19ETHUETm5o9taCTU0JACAgBISAEFAGJcNR5IWiw9R2PyVNHoU9kU9BmTc2eOgFKBiEgBISAEBACIjjkGhACQkAICAEhIAQOPwGJcBx+xtKCEBACQkAICIHjnoAIjuP+EhAAQkAICAEhIAQOPwERHIefsbQgBISAEBACQuC4JyCC47i/BASAEBACQkAICIHDT0Ae/HX4GR+zLeiODogcfBVa9zkBEWF+aPkbUbx4Fvauy4ZXbejR4G8zGK1O64eYjvRiuWh7gIUb2s7Z2PnZIpTQC+P8jmREnT0MSb27ITKSth3rbuj5u+Fa/gF2/l5AD1+XQwgIASEgBJo7AREczXYE26H/iOEIKzGCVL7MzchJSEVS0KeH6JeZPP6MeZg7nx6XHqJ8xSTdkoSwq/6GlBSWA4XwFFhhb3Eioi6Zgu5hj2PT8iISChboKRchqWdUldoccNjz4fVr0K1tEXnNA0jpQI9V8x2AMz0fntY9EB3fFXEdIqGR4JBDCAgBISAEmj8BERzNcAw1v5cEQQoGTZqIQQH79VWzsKHXcPTmF6zUcJjJgwWbMN+E4PC1vwIdWGz4N6LgnTexN9cC30n3oufQ9rCddSFi13yOfDe/HM44HPveRdpHa1HmpQCGJQL2cA98FAXxtRmKdiQ24N+E/Ldfw978CPiHTkWvk2S2r4ZhlGQhIASEQLMkIIKj2Q2bDtfccRjWI5ThM0MlVkkzk6euakhIJHdSL48L278AOXk8f0IRiq1LKdZxNVqEd0VsjIb8nIP1aN4SeAPPYNf8ZfDS62B4ykVP6IAw+s6evRz5hUf/Ka519VzOCwEhIASEQMMIyG1kw7hJqeBDVys+fFULCgYdpp/J6g/ktLD2NV1K+AsBISAEhEAzIyCCo5kNWNMwl0IVe3bCTca4W5+F+FgWCrR4pMfZiKPvLGXbUFxkxlIdlpwdcFJWT+I5aNWR1mw4WsARfXAqxkwtkkcICAEhIASaPgGZUmn6Y9QkLbTu+QoZu/qgS8feiL/9KUQXOWCPDSdbfdAX/w8FbnPTI5b9c7EnfQC6prRD5MhnYcwUSaSjSQ66GCUEhIAQOAQCEuE4BHjHc1HNvx9ls55H+u874fTEKbGhFW5BydypSFvBO1TMHZo/C65ZT2H7TwuRt3ENitb8jAOZgcvSa7YWc21JLiEgBISAEDh6BCTCcfTYN/uWLe5dKPvhRez4oaau+GBd+iA2Lq3pPKVrYbA7cuFePguZ9KNuTUbE6AvoOz/8WcWmhUstLcgpISAEhIAQaAIERHA0gUE4nk3wRw1EqzuvQouiDDhL/NDjOyMiwkPP5FiPA5uKaRmpuamZ45mh9F0ICAEh0BwIiOAwMUqazwVXmYs3fprILVnqQ0C3uOHenQ1322SE84pTfwF8O39HwS9f44Bsk60PSskrBISAEGjSBLShqYNlhV4dQ2RJPhtDBriwcc4y7HGJ6KiKS/hUJSI/CwEhIASEQFUCsmi0KpFqP2uw9R2PyVNHoU+kaLNqeCjqI3yqU5EUISAEhIAQqExABIdcEUJACAgBISAEhMBhJyCC47AjlgaEgBAQAkJACAgBWTQq18BxRsABfeAkdDs3CY7Vr2LrDzvglsd9HGfXgHRXCAiBo0FAIhxHg7q0efQIaDGwp3ahB7HbYenWExFWWZdz9AZDWhYCQuB4IiARjuNptKWv9GQxesjYdx8iq38r2NLmodAju47kshACQkAIHAkCIjiOBGVp44gQ0G1JCD9rONr064HICHpkWFkGXKu/wZ5FG+H0WuDp/Qj6Xppw0Jb+ifC+9CayXYFAn6U1wsY8ji6t1iF35ivYXxIMAGrw9HwYfS9PhO1/D2D9yjJ5r+0RGVFpRAgIgWOJgAiOY2k0j2pf2qH/iOEICzhpX+Zm5CSkIoleIlvTYSaPP2Me5s7PhaemSoLplnjYLp2CLj0ssLgzUbqPBEebZISdcQe625/Ghh+z4CvcjML0BFgcbRHVLrb6Y9z8JXCVcsQjDDabBXpif7RoT49YTyMBEsZvsPXBX+gSsVHXWMh5ISAEhEAIAiI4QkCRpPoR0PxeEgQpGDRpIgYFiuqrZmFDr+Ho7ai5LjN5sGAT5psQHN6kS9CZxYZrOQ589A3ynVb4Eoai44jTYOl7LuIWfIrcXZ9izy6SDS0vR+dbz0NUNdM88OWVAp0csNojgLPHol0PD9X5IPLDWTkVqsevyyEEhIAQEAL1JyCCo/7MpEQlAjpcc8dhmPFe+SpsZppgZSZPXdXQ1Ee7VIRTNn/YACSOpU+FIn5HKzjstDjUXdd6DS/07GIqGQ5rRDvEtuf8VthOSILNGUbf0xtyi3mRaV311GWvnBcCQkAIHH8ERHAcf2N+DPaYBIDFEAHW4oXI/HEzXL6D3dR0ikw4D4oEXdfLp0UqSwcfrSnNo4mTdrC1PgnxMW54yxywdeqPqCwHLM69KHMeg/ikS0JACAiBI0BABMcRgCxNHG4CpC7274IbveGI7o4Y3xzkbilVr7bXbbFwWArh8R2UFhZvMYkKPlogPJrSXfStzU5vqKW31OZtRRlSEH3qmXA4l2LXvGS0+/OZSKIAhy03DWVeiW4c7tGU+oWAEDg2CYjgODbH9bjrlXXPV9i9vQ+6dmmN8KunokdxFlw6PXMjJhz2KjtLtNKtyM+1I65lMmLGPoGuhXY4wtYg8w1a51GSjhK3BdEt7LCt/xUlW9shx30TWjloKmXvXnhkCcdxd21Jh4WAEGgcAvLgr8bhKLUcZQKa/wBcXzyF7QvXorjADT2a1m2Q2NCKdqDEY6206kLzZaD4yy+Qc4DyWePhaKHDt+eAinpont3I3886PB8lq/fBX/YHsrdx59zwbOfpFjmEgBAQAqTN52UAACAASURBVEKgIQTk9fR1UtPguOR9fPliDmacMQlz80Sj1YlMMggBISAEhIAQqEJAvKdcEkJACAgBISAEhMBhJyCCwwRizeeCq8xF4XRZMGgCl2QRAkJACAgBIVCNgLVbYqfHq6VKQiUCuisP2VvXY+Mfe1BUYbeDYGqaBCzJZ+O881rDtUPGq2mOkFglBITA8UhAIhx1jroGW9/xmDx1FPpEyptF68R11DPIeB31IRADhIAQEAIhCIjgCAFFkoSAEBACQkAICIHGJSCCo3F5Sm1CoAYC9PK3Nn0Rc8r5aN0hTFYD1UBJkoWAEDh2CYjgOHbHVnrWlAhokcB5dyL5gsvQun0tr9CtyWbNBi22HSISRKzUhEjShYAQaNoERHA07fER64QAEbDDd+4z6HHn/UgdnECvk5NDCAgBIdD8CIjgaH5jJhYfjwQ02ZJ9PA679FkIHEsE5F0qx9JoSl+aEAEN/tZD0HroBUhoEwGLOx9OG78lruKhwddtHLpc3AMRUfTyOD5VtB3O5bOQsWIPvbdFg6f3I+h7aUJ5IVfq/ej2QPDHP5Dz8us4UGato54qzcqPQkAICIGjQEAEx1GALk0eCQLt0H/EcISVGEE8X+Zm5CSkIqmW5RNm8vgz5mHu/Fx46uiCP+IkJIy8AokRflhcB1DqpDfTxlUtpEN30uPk3NlwFTrht7dGZGIXhA+ZgK4FD2PzZi8shZtRmJ4IS+KJiI72UV27ULyvDLxB2+JJBxWno656PCq/HEJACAiBo0lABMfRpC9tHxYCmt9LgiAFgyZNxKBAC/qqWdjQazh6O2pu0kweLNiE+XUKDopcdLgASSw2yn5F5lufIccZB+3659AjuXKUw7b7n0h/k2IbjijY7LRWY+AU9BgQjvDUBFg2Z8K661Ps2UXpQ55B79McsKd/jD2z98Jb3g1DUNVVj7x0ruZxlzNCQAgcGQIiOI4MZ2nliBHQ4Zo7DsN6hGpwZqjEKmlm8tRVDe0oaU2CgbLZs39HYRkJCo2iENXCDHboPUegw/kDERNZWRJo4YEplrqaUucbqx5TjUkmISAEhECDCIjgaBA2KSQE6iAQVBdWEg41rPf0xQ5G8mUDEKMVwPPbt8jOdMPTdQQ69g6ro/LKpxurnno1KpmFgBAQAvUkILtU6glMsguBugnQhMf+LHrZH+BuPRgJcdVCG6oKPboDIkiMWJy/I2fRYuRvXIX8PaUhqqfoiDswiRKTCFvwt9ZBi1GpvPl6QlQtSUJACAiBI0RAIhxHCLQ0czwR0GHd+Q325k1Ch/heaHHbk4jKdkNvVXn9hqVgM4q9JyMsfDDajmmLmGwnfPHxIUB5oe/ldRsnAO1oV8udWXB6w2GP3IHc19/BftP1hKhakoSAEBACR4iARDiOEGhp5vgioLm3oPCjN7FnUybc/hawt2oFh592ouSmoTDH2ONiKVmGzFk/Ii+rDP74bojq1gexiV74C/eieG9ppZ0ltvR/Y+eKDLi8GkU0WiEsjqZqcnKh01PA6lPP8TUK0lshIASaEgFtaOrg0PHepmTlUbVFg+OS9/HlizmYccYkzM0TjXZUh0MaFwJCQAgIgWZJQLxnsxw2MVoICAEhIASEQPMiIILDxHhpPhdcZS5aBFjDdgMTdUgWISAEhIAQEALHMwFrt8ROjx/PAMz0XXflIXvremz8Yw+KfCI6zDCTPAcJWJLPxnnntYZrh1w/cl0IASFw/BKQCEedY6/B1nc8Jk8dhT6RstylTlySoQoBuX7kkhACQkAIMAERHHIdCAEhIASEgBAQAoedgAiOw45YGhACQuBYJaA7UjD4nnsw5uyoJnH31tTsOVbHXfrVMAIiOBrGTUoJgeOSgN76Gjy/6RfMCX7+1Q8xVUiYydPU4DXUZt3RFefddgX+dIKjiQiOpmXPoY9zFDr+9RN8te6fuOeU+rxf6NBblhoan4AIjsZnKjUKgSZHQOv3GD7c9Dnu61Nx0XM42j30HeYsuQsnRZhbn6Tl/IDpl4/FnVdNwQc7Q3fTTJ7QJSumWhF702eYs+ohDIzyV8puHTQTsze9jmvbm7O57rbo3Xom+mWmHlgScNI/vsQXFUTZ7J9m4IExPZEgz3U2hbBSJi0M8d3bwm7viM5tRHDUH2DTKiG/Ak1rPMQaIdC0CXgLkJlWANicSAn12he23kyeOnupw1PopnYcsFXdGMZpKEWxkwVH1ZN1Vhw6Q6PYzOY4ENMhHuGbX8YjD21AoT0ObQZdj9vufx0vRo/ArTMzUfkB96HNkdQAAT0Xayddj4ldfNi7oRSVpadQam4ERHA0txETe4XA4SRgS0DqjRMwfsxg9EyiAGheGn5770XMfG8jcvltdI146PY26HfHvbj1htPQOVZHadov+O7Fl/B/P+fDQ67FXeSC3+oAPb298kFpFn8OSkiP8FF7PYGicSfjzxNH4NyzTkTn9nGIVH/5CpH+/DhMfPcAtWfyiOqGc/72V4y5KhVJdi8KNu8i8QOUVS1evAvbNmxGPmmiLau3orDfbEwddh46vfkh0twkkkzYY6pfddijO1JxzZy3MGbtLbhm8haSaYA/+jw8ueJRdH72Cox9P4/e0cOHA3GDrsPNd1yCM/u3pjcYU1LJXmx8+148+MZeQySZuTZM9KsqqlA/++MvxbNL/op+FU8uuRvXjlmH4kCanjQUk/81CUM6hatrxLt/LRa98QJe/XQniv0awi96HZ++nITfRg3HM6uCUsWBpImz8P64NXjhnIcxL49eFVBrPaGsk7SGEhDB0VByUk4I1ItAO/QfMRxhJcYspi9zM3IS2GnVXImZPP6MeZg7P9e8w6y5Obo7j0Kne9/GSzdkY/5zNGWyzoXoM0fjrntn4smi4ZjwSb56A26jHFocUh96F1NH5uO36Y/i/S1hSL7qLox/4w0kjhmN55ZQHKCsAE7dBjt7k5gUdOvgxr5N++B2EMPSfJSRU4GJetTES6uBuPS6gYie9RJeey4D2YV+WGNbIGJbPdhZE3HSM6/j/gt2Y+ELj+DV9Ei0HTQco1PrIKJ74eawhsUCLRiQqcseM/1qqD3VzLUi+rJn8ebzp8C+7DN88uBa7Mxyw9KyDVqk5xnXltlro65+VWs7dIKlcD5evGQ9ImmodWsbnDljGkZXzVqwAQv+8QR+2Z+HEprKSrl6EiY+9gL8G0fg+dV+lK34Br97/4ZTLm6PsFW7lWjSaWrmjEvigOVfY3VBYDDqqKdqs/JzwwmI4Gg4OykpBEwR0Pxe+qOdgkGTJmJQoIS+ahY29BqO3o6aqzCTBws2Yb5pwZGEIZ//jCFVm8wzEvTWQ3HbTTHY+uBNmP5VsRG+XrMTZafOxjOjBqLtrLnIMG6Hq9ZQ75/9bS7GuJHRyJs5FlPf3g8OVixbnA58/TbGTzoLHyybh/0leSjVW8Jhi0THCW/h5RE5+P6qG/FWGCmQ4mwUk/oxU09muUoqw97vvsG8RQ2TTXq7oRh9kR1Zz92H59/LUZEB/zIPThlF0YIaCGjhCUj+01jcfg5ppI8XYpcrqDi4QM32mOnXvgbYE8pMPbI/Rj14CmJXPYNbx9EYeyraaJSo37VRc79CtR8yzVeC7O0lximbHznO6rk01y6s/G5X+YmNmx045dLHcNKAeNhW0/jkLcN/lwOnXzgEXV58HxuJvaXLUFzSqQwbnluHvEDQo856qjctKQ0kIIKjgeCkmBAwR0CHa+44DOsRKvfMUIlV0szkMVGNypKPFQ/8Df/aEszvQOItL+KRgcbP1pSB6EbTFVHT/otvp1WpM7sT4m06CY7qzshs6xXz2VNOQ1dkYdmvWUps8KG5d2P5YifGX34qOob/hMzSXJT6k2CP7YmLBxdg5bIoDLwiGR9tCwgO8vim6ilpHJttHU5GJ7J56YrcwDRELT0/ZTr+vTF4vgi7Zz+NB6anV596qaEKM/3Kqo89NbSjkpP64aR4YO/zC7E3hNjgLEfy2qjN1ErnEk7HsPvH4rLBXdCGghbO3DKEUcSwJMJm7BjyZ2PdR2vhfOViXHTCv7Bxgx1thl2MDoX/wxO/8duYA3sm6qrHtEGSsS4CIjjqIiTnhcAxQ8CNwm1p2LIhuLsjHCXZB0MWGsX7NeRi6T330hRHleV5nnzsr3R33hhQuL3KR/mUAyXrhQdoLr4PIk66EoOds/H3fyTjgRcuw4k5FugFeyu8ZqD2ehrDUlWH7icnRXfJFra6jh0ym17ElPvXIt9VjNw9WSgyvUikorV19MuUPTr8NJQazUtVZR1siVYxqN5QdTUeR/7aqNEUdUK3dcKFbzyH2zr+illPvY5FW0rgTzoLY14dgy7lRXU4l36MeYVTcd7wjng9PRGXXRmN0i8/w5piQ2yYq6d2W+SseQIiOMyzkpxC4Jgm4E3/DVv0U9Grrw/Zc3fSdEYt3aVpIhdrlfAYRNDf7qJQzqqWPJ70ZdiGU3HS2UlwrMlUUQ7d0QGnnhEObFuBXU5yg1o2Cjxx6DaiA/D9K9ixIRE/+p7BsH60JuJAIVxkn5l6aulF9VO12vwbtpLNJw9ph7DVGbXvNinZg51pO9Si0YYcZvrlofGqyx7NV4T9tKkIHVMoQrUJJSGmxPSstVhP02rDrj4Dbb/9EXtCRLHqdW2Y6rAVUadfi2sHObH+/dlYnm2qUHkmPTwFAyhqWPjODHz4jTElp+9uiX009XJQcJDQKl6J/3xehEtGXIdBm9ri4hYb8cW/dyM4Q2O2nvpZJ7lrIiCCoyYyki4EjjMCWuZ3eOdf12PmmDcxPe49fPHTDuT4ohDfqRU8P3yOBfsqAPEXIuMPWoZ3zQ0YdZUXS4oT0Ma2At9/W2HbZ215MufinU9vwst/mY4p3rcxd2sEkq+4HeNS9uGXMYuwn5ZZaN5c7C5rh2v778Q3j9NOElc+5v1gwQ3jElHweoGa1rCYqKdew1iHze9+Qjbf+gqetr6J2UuzUNaiL5Lq1YC5zGb6xXnqtMeXhQ1f74b+0ATcN8mLjxfnwd2yD1pVMEMrWYVPX9qAC/7+KGb880R8+p9V2EGRLy06CW1tyzGXx7Q+14aJLuoRfTHypdtxdUsSOrGrMPLR9HIRYKI4eN3F6u3A2Vffgqs3foNVez3Q43ugNenVyocLez/+N9befBsmP0Fnfr4PFZZ91KOeqvXKzw0hIIKjIdSkjBA4FgnoRdg2bQwmZtyFsTfdgnuuCqNe+lC2cym+WjqLBEfF2/Uy7H51Kj7rPhlXP/UsLvKROPhsJxbOIedUHu2oLU8B0p4ahwfz7sdt45/AY9E0B799IWbfOR3v0w4VbknzZCM9h75xfYcfd3ClLuz/Zh72jLsC+o5CY/eEXnc99Ruq2mwuRNrT43D/gXtwyw3346FxPEnhRcnuVViSTlt469dQ7bnN9Es3Y48XeZ/ch4dbP4g7Rj2Cx27hZt0o3rUav+10B2z2Iv/zybgt+0bcfNvFuPbZaxDJ2UozsX32rsCY1ufaqL1rfFZzZ2DlgjxccVkpVi7MLl/HU2vJCpef5tmB7+9+CgmP3IxLX7gQN/Lia92F0v2bsHanq9JuKm3Pt3jvv2Pxj8v347uZK5FTYaDqU0+ttslJUwS0oamDGxj0M1X/MZBJg+OS9/HlizmYccYkzM0LLDQ6BnomXRACQkAINHUCuqM7rv72bdyy6VZcM2EzAntXmrrZYl8IAhLhCAFFkoSAEBACQuBoEbAhbugdGNlhKzZtK4a13yiM6OhG2owM07t8jpbl0m7tBERw1M5HndV8LrjKOExX0zpvE5VIFiEgBISAEDBBwIHo5E7oM3oYhiXwPtc92PjuA5g2l3aimCgtWZouAZlSMTE2luSzMWSACxvnLMOeRt8aaMIAySIEhIAQEAJCoJkTkAUJdQ6gBlvf8Zg8dRT6RMpylzpxSQYhIASEgBAQAiEIiOAIAUWShIAQEAJCQAgIgcYlIIKjcXk2/dq0SNhSBiDu9HPQMrbpmysWCgEhIASEwLFBQBaNHhvjaLoXur0zYq+8Ca3DcuDa9TNyC2UhrGl4klEICAEhIAQaTEAiHA1GJwWFgBAQAkJACAgBswREcJglJfmEgBAQAkJACAiBBhOQKZUGozuCBS2tETbmcXRptQ65M1/B/pKgTtTg6fkw+l6eCNv/HsD6lWXw25IQftZwtOnXA5ER9G7LMnrJ1OpvsGfRRjgrvZQpHo4rn0ZqbAws/jx4187G3p/WoES91VKDr9s4dLm4ByKi7MbTR4q2w7l8FjJW7IGHNsPr1naIunQ02qQkwBFh5NHy01D823+wb3UmPLShx0yeI0hRmhICQkAICIGjSEAEh2n47dB/xHCEBZy9L3MzchJSkUTPpanpMJPHnzEPc+fnGu+FqKkifwlcpbzWIgw2G72aO7E/WrT3w59GAiTMSuk++Avp/ROWeNgunYIuPSywuDNRSu++0NokI+yMO9Dd/jQ2/HhAvfAqeGjRPnhz8qEnULl+Y3GC/iw2/LAPXp1eV+2kx5y5s+EqdMJvb43IxC4IHzIBXQsexubN9KIkaxwcKfTWzAg/tPwMlPpaIiKhO6Iu+hu62R7FpuXF8JnIIw/yqWnQJV0ICAEhcGwREMFhYjw1emW1BykYNGkiBgXy66tmYUOv4ejNLw2q4TCTBws2YX5dgoNa9+WVAp0csNoj6BWJY9GuhwcW14PID2fFUwhniR/epEvQmcWGazkOfPQN8p1W+BKGouOI02Dpey7iFnwKfheWcdBbIz98DNv2WuE9cSJ6DkuBp9efEPvzh8h1WWDb/U+kv0kixxEFm90O38Ap6DEgHOGpCbBszqzwxL8CuL95Hul7HPCd8RB6n9MCljPPR+ya2aA3XgeOmvPku2XRajkm+UYICAEhcAwTEMFR5+DqcM0dh2E9QmWcGSqxSpqZPHVV44WeXUyZwmGNaIfY9uykrbCdkASbk9/ouR9lxZR2QirlAPxhA5A4lj4VqvU7WsFhp3kONWViHBTI4Nyw7PodRSSoWjjaIipSI8Fhh95zBDqcPxAxkfSe8AqHRgIntERwAxuXouicixETkULTOUBeWaWi9EP1PPmUJIcQEAJCQAgc+wREcDSLMfZBz82jiZN2sLU+CfExbnjLHLB16o+oLAcszr0oc5IMsBhSwFq8EJk/boarglbQ6FXWTs7DMzBVD4s1ICJoKoXO+WIHI/myAYjRCuD57VtkZ7rh6ToCHXuzuKnloEiQ8SxWDVpoVUL6xkSeWpqQU0JACAgBIdA8CYjgaCbjpuVtpTclpiD61DP/v70zgYu6Wv//ewBZRFRcENTS3HfNxK3wlpWppZY7pSK5mylg97pey9IMc8ulmz/NP12zumV17ZoRuZt7CO6KGyoKKPs+wMz3fwbUUAcdDGV7Dq95yXy/53vOc95n5HzmLM+DbcY+Lm2tTc2XO+OiNIBNXBjp2Wo3RPQlNYfQAtsKjXAybCLuTFrO0odmUxFbqySyDOYEh1qSadIZkw8wq7TzpKjYz1q1x3Aw6ZeMQ8Tu3kNCpjVZ9r3uIzjURlYlgCqYytFfIS3NnBt4c3nyUyYlpGPETCEgBISAELCIgAgOizAVfSbr1HBSM62oULkcNsd+J/VsTWIzh1HdVg3sV6/mnByxvrKBy+dbUr9eDez7zaNJynX0mhPlnOwpd+MUy58ywBn7vtOpp1XDrqLpY6AK2L+VJLWnwirxNCnZbbGz74KbtxtOMRkYnJ3zgaA2j77xPg0SdFgr16Wm8zM2R7erctRvt/a33CNPPqXKZSEgBISAEChdBMQPRwnpT13WZRKiTcIggdTQSIzpJ4g5ZzJeLXecNy23qMOsxmvof5jD+V1HSEnMRKug9m0osaFLvqCOu95YNjEkkHH+Cvr0bIxOrjliQ5dwitRf/Qk7kJQzI2KVeoCo9ZuJv66O2To3xLFhSypWU/mTrpJyNe3Gssmf4IwJ6jSMSWwY48g+tJqw7dE59uRNluS54xF5KwSEgBAQAqWIgISnL0Wd+Sibotk2xXnceNwc4slaO4uzV+6u3ZI8dz8lV4SAEBACQqA0EpAZjtLYq9ImISAEhIAQEALFjIAIjmLWIWKOEBACQkAICIHSSECWVEpgr1rVfoau7npObjrAFb2c8iiBXSgmCwEhIATKHAGZ4ShxXa7DptUo/OZ50rK8uaOnJa5BYrAQEAJCQAiUAQIiOMpAJ0sThYAQEAJCQAgUNQERHEXdA1L/XQQ027p08fXF+xnHHL8exS5ZVeSJIb74jK6D8uAuSQgIASEgBCwgUCz/nltgt2QpFgR02HaaycpjQayepKLSFpJNmm19nh/zKs81UG7bC6nMQi3GqjL1B7xKNw8VZfd+BZd/jKbPP0Pz/Pym3ed5rcYAPj61g003X2vb4HSfZ+S2EBACQqA4EiiWf8+LIyixyRwBK8rVrE8tGztqNnT+07Gouaxl9Vr9oUxdMYketR9sc68uNoiFvd9kfN9pfHGxrEKUdgsBIVAaCNz3C1ppaKS04WERMJD637cZFVYLzp1WEWclFTqB7ESiwhKVv/gM6qYVeulSoBAQAkLgkREQwfHIUJeuikxT/Qt2TKD5zWYdnMSgoaG3iw6rqrSYMptxL6lZENfyOTMg+kt72bxgPquC4kzB6nOTY0P+9o+/4923MS7lskk8fSlnqeK26PY2VWk8dCKjvLvQzEVNzMWHsX/NIpatOUmcyY+6W2+m/DSZTjvfYdQ/DnJdXdOqdcP35xk8EziOEbNPkGjy236/ZEk5N8to9x7/d9iZSmotKevyPn71n8eqzQlkqftaeXfGb1tAr0q5mbt+t52uN58LGs2AiadJazKW91b0xb2WHYaoUH7fY6Re97Y8lnmM36ZPZenW5LtcxN/PfLkvBISAECiuBERwFNeeua9dNXlyUH/sUnNXxQxRp4mtahqw83/QkjzGiK0EbovLGTTvlXSxgczveRCHcq50+MQfb3OZrRxx7diSJzK/ZOn4UKKpQVMvX4YsnUtSj3GsvaAesq5G6w//xZQXL7NrwT9ZEV4eN4/+eDXOU6DOkTqTV7F4SAzb5qulhaN6KnT24q3Jy/gguT8Tv0nAELmRT3zb0GT1XGaFvsHkr21oO2ca3RLWMHX+cSU2LFzSsKScmwuRUdv5j7+K3KuvQqNhfgxb9j5xL03km0sqrk36Ub4e5MWmZmOZt6gJYX6+rAnLPcasqZg0JjFlVb0FrWtd5ocxizjc1Z/Zg6LYMH4S63r6M/WDIWzd+ymH0y202xx/uSYEhIAQKEYERHAUo84omCluePhMwuPmQ0e+51iTfrS4FaH17tK0kPUcb97/nnnYeYptFggOspO5fl4tothkUe+2qYi76yX6ILu35s5+HDpdiXZbRvNceyfWXVDf4Gv2wOulclyf/w4fr4klWz1uPJDFU56zeOJGUVqNHowZ5sTZ6cNYuCElJ8Achy+S3u5HPvTsiNv6QCKyjWTsXsDM5c1YOWMBfg2zae9xmvV9v+RIakEG7QKUE7GdLYG57Qo+U5WOm0fygrsj315KxahlkBAeToJTkhJvWaRcDufS2dv9plib2qHFER56lGDDeTIGZhEeEsLujBOkv9yIWsrPiggOM58nuSQEhECJJCCCo0R2m8noYJZ28iEwPu++36UWtGaZBXkeXhYtIZwrSqC4VXfAWi3A6B5rSx2us+8PFWk2n2qt63akobUtjv4/s9H/jkwxdXC20ZTgUKJCSyNi5VSWeHyB30C16rJ8EOtO3xm3Np9K8l5+gHK0+AtcyYC2bhVUu5TgsKCavFl0mkmM6NSPhmY0qOfLYaUriFAqYIWSXQgIASHwiAmI4HjEwEtddXm+tFs2PBoxqNFYZ2UaXFXSjGqI1WGl3qs3ZvHo1MCrI459vpMJOHPHUJ6VQHQe9+46V3c6NlAlKZ3h3KsHTQLWcDjFMsvyVl7wcgxkqTp1Sv8VvDZT05XIUGAKKlTMApOLQkAICIFiSCDv1+NiaJ6YVOwJaJmkmXZ/OlbBMWeNoGApK3w/Z6lG26418/Xjka3ynNGq0LyVgZhzpqWJPK+LCehv6hTHlvRbPoHOp/yZ0Gc5+1yG8+701jjf9Sm3xrGDJ97vvIZ7NTP2WlyOmWfvuKTLTFebY8tTucJdRtyW07DHj/4t3iHothmrPFmM2ehNU0D2Tjjcu6j7GyU5hIAQEAJFQED+dBUB9FJVpTGJiJAUaOaNl+czdOjei9f6uOUrHu5su1VUIJ9/k4zT6OXM/XsPnvZoR7vnWuGSJ6Mu6hdWr03AyXslC+cO5MXn3Wn77LM87zWALm43MuqcqO/zISPcgljiu4kLZ39g4cwQDH3fx+dZh9sciGkOrRi8eCwDRvowY2Jd7PMaVYBy7myLuffG6KOczahAWz9vund156kXXuG1Vy3nc6tME+cTemg+BM++nWjf/RV6v+JqMWdztsk1ISAEhMCjJCCC41HSLpV16bmycg5f7KtAp5lzeXfRCHq0qU55Sz9ZWhJhc0cwZekpyr02hRmrFjLn41eodjmE0HB97hKDlsw5f28mfbibhPYj8V2xgDmfzWL8609St6JpAUMFtGs9nmlDNYKnL2bzNRNo5SPk1/ks2e+M+3vDaVPhz+UaXWYEwTvjMRiuELwr5s/juQUsx5Lu1CXs4P+m/8LRGq8z8dMFfLBkBC+1rPoAsxTpXF4xj28P1+SFOR/x3sIRvPxUAThbYqzkEQJCQAg8RAISnv4hwn04RSt34j0D+O+iWDObRh9OjVKqEBACQkAICIG/SsDS76F/tR55XggIASEgBISAECjDBERwlMDO1xn06NP1atHggc5DlMAWi8lCQAgIASFQ0gnIsdgS14MaWcf/zYr39ZyU2BolrvfEYCEgBIRAWSUgMxwlrufVBslWo/Cb50lL5YlSkhAQAkJACAiBkkBABEdJ6CWxUQgIASEgBIRAfhA2FgAAH61JREFUCScggqOEd6CYLwSEgBAQAkKgJBAQwVESeklsFAJCQAgIASFQwgnIptES3oFFY749hpc/okVLtZ/kp8kcPXEj7JquEroh/jSppaK+rptBWHRTnMeNx83h7gghdic/4uiGSLIcnsJlyECqONtjnSN/VUCSuDOkHfqJq4eukHX3o2abbHTqSu23+lDJzF3bawGEBYSQXGMYjbyeokLcBi78vy0kZ+m4+VyV5E1cWhlIolWz/G0OX8gxFXs+vyBzZqqWS0JACAgBIXCDgAgO+Sg8AAEVbk2Fg0fFRVVx2PM8r37PEQhZGLLv2NAadZpUFU01N6kQ8FczckO12VTCtqoSG+qGFh9Fpk1V7Ko0ofwL9WmQMYNTx/T5hHTLU636VZcdQ/qZMGzK2agItPUpb61hHX+WpEQDGTGJGPKYk1WlD3Xa/cGJvUn3DpZ2m80aGRHpFtlyu2XyTggIASEgBEwERHDI5+ABCKgIr6bQqCpCiWYK/XozqcivubFSM1GxxvKkRLJ++5RLV+5V1VkSv1pKZEp5tG5zaPZkOWzrV8HqWKRpzuO+SZd+hPjv1UvnjPWweTRy02MVvJrLf5gXCcZnBuJyfDVX8z3oY4nN9zVLMggBISAEhMANAiI4SuxHoSZPDuqPXWruNhyD+jYeW7UxLuXyb5AleYwRWwncFqfmKO6V1CidE7rUWkWXt8L4uAcutTPJPnyY+JwZj0wVp+Rez+dzT4Whx6Em5avZqgwGsiMS7z0DkU8x97usM6gZD+uW1PCozbVd98st94WAEBACQqAwCIjgKAyKj7gMnZo+yKIuHj6T8LhRtxaynuPN+9PCNFbnkyzJw85TbLNAcGg5gsNGCYIq2D47mOo19diknSZRMwkOPdm3zXBUotzQT2h6y64TxH7yL66l592z3IDK4z+hck4eI+XOB3AmNFUtYRS+N9Vy11Q02aTB1G05CLcTIfksk9xp8yVSVi7gcnzh25NPd8llISAEhECpIiCCo8R1p4Y+cAR9mpgzfJm5i3dcsyTP/YpRSyppKlQ6thjKN6Oaq/pdraZYNa9LuZxdnsrtelb+ezisssLJuGsGxIDh8lnSccKmVk2o5039FxIICwon07Q1xPFv1Hq77w1Bkmuf3ZVPOfHl6Zz7BUk6ksne8QsJjXpSzSNBvTOfdNfO3tp3osuOIP3e0z7mC5GrQkAICAEhkENABId8EB6AgBrh01PUoocThlqdlAg4wbXNjlR7/mkqRRvRZSWTs8XjVjK3H+LOE9kXSP5pBZHJOgzOPXh8THcqPvkKVfcuIzKp8GcVrFTY+CvBL1C5XSsczBJIJPPXZVy8bd9J4dthtmq5KASEgBAohQREcJTCTn0UTdLpE9Tx0Cco17Im9pe+J+FkRXTPelGthoZVRrI6vKIG5wcan9VD9hXuUsJWqTuI/Ei9Cqtxmjoyc2Aj8U/2w1mdaJEkBISAEBACD5eACI6Hy7fUlq7LiM3ZWGpnrSLXhlzAkGFPzEUd1RsaleBQm05vnJrNBaD2Q7w4nsdvHYtVWiTjJHEbt5J4i1ADKr0+HQedE7aVHXO0iu2lXSSkWKZaNIdWVOnpgZPpWKxLZk6pxqdG8lgDA9YxgVzZcv4u/xlWSfu5GtoL56fusdO21PagNEwICAEh8GgJiOB4tLxLTW269Gs5eyd0hqNcv6ykh6ZOlYSEkd2wAXZKjGQblVAwOde4mVwb45jnrc6QSoqV2hJqiEcfnUJ2dTWr4eyKnSlPagQZJ7dweVco6aZyLEiaTTUcGja6UUfujIXBuQGOzkq4lN9LlNlilC+Qg7+R2Lan2voqSQgIASEgBB4mAV2Pxl1kPvlhEpayhYAQEAJCQAgIAeW5SZIQEAJCQAgIASEgBB4yAREcDxmwFC8EhIAQEAJCQAiYfFNLEgJ/kYBV7Wd44TV3atnJ6txfRCmPCwEhIARKLQERHKW2ax9Vw1TE2Faj8JvnScvyIjgeFXWpRwgIASFQ0giI4ChpPSb2CgEhIASEgBAogQREcJTAThOTzRCwcqKO50QmjqyDvZnbckkICAEhIASKloAIjqLlL7UXFgErZxoO7kf3vzkjbrzuhqrVGMDHp3aw6eZrbRvlmF6SEBACQuDRERDHX4+OtdQkBIqMgC42iIW9D2FvU4MOi+fhVWSWSMVCQAiUVQIiOMpqz0u7yxaB7ESiwpQjeZsM6qaVraZLa4WAECgeBERwFI9+ECsKi0Cz8czZ3oCGrtYYo0PZsWw+K76/QtrNAzQ2VWk8dCKjvLvQzEWtKMaHsX/NIpatUbFdbkS41Vx64LfWh6517HO8s2dHH2H3ZwtY8Z+LpJhixFhVpcWU2Yx7qT61XMtjqy7pL+1l84L5rAqKIzeSi7pYoTndZvji2b0hNUwhaY3pJIf9zBKvpexNNOtr/W4Kbr2Z8tNkOu18h1H/OMh1ZaNWrRu+P8/gmcBxjJh9gqRGY3lvRV/ca9lhiArl9z1G6nVvy2OZx/ht+lSWbk1WkX0lCQEhIASKloAIjqLlX4pqr8mTg/pjl5q7LcgQdZrYqo1xuceGCkvyGCO2ErhNBYOzlJQujfMBc/k6HKr3HMvYOZ9RKWEQszanYdQ5UmfyKhYPiWHb/Gl8cVRPhc5evDV5GR8k92fiNwm5A3PicXYumc2O6HhSlbio28+HSe8uwHhyEB+HKsVh5Yhrx5Y8kfklS8eHEk0Nmnr5MmTpXJJ6jGPtBZOxDjz298X49DjGhvd82XkuHV0lN2rXTudSQWYYIjfyiW8bmqyey6zQN5j8tQ1t50yjW8Iaps4/TqKKNWNdvQWta13mhzGLONzVn9mDotgwfhLrevoz9YMhbN37KYfTLRQ4lnKWfEJACAiBAhIQwVFAYJI9PwJuePhMwuPm7SPfc6xJP1qYvv7nk7SQ9Rxv3v+eedh5im0FERzHA1gTEEqyqlP7XUWIbRrA2+Oexm37b0RU68GYYU6cnT6MhRtSME1WcPgi6e1+5EPPjritDyQiWwWk018i+JdLt6w+edqWp155l9buztiEqsB0N+9EH2T31ty6Dp2uRLsto3muvRPrLiSrssvh5KZC0SWe4djvhzgZY3roJCdyni3I4G8kY/cCZi5vxsoZC/BrmE17j9Os7/slR1LzlKPFER56lGDDeTIGZhEeEsLujBOkv9yIWso/igiOW90pvwgBIVBEBERwFBH40ldtMEs7+RAYn/fg01ILmrnMgjwPlkWXHcnRA+nwalvlBTWIyLodaWhti6P/z2z0v6PMmDo422hKcKhBvGoH+kx5k15d6uFaCTLi0rFTMzWpDjb5uubVEsK5oqpyq+6glmFMgiOJU/7L2fb5BGb83o0Lv/3Kth83ErgjgpSCrm9oaUSsnMoSjy/wG6hWgZYPYt1p84XoNNPakU79aGhGQ47wsdIVROA8GGt5SggIASFwPwIiOO5HSO6XYAJqoDUNtmoQzhmG1e864tjnO5mAMznzG3+mrASi9WqYtqlDt8/mM+bx31k/51/sPpOK0eVpvFd4U++eJIwYVJE6K1Mducl47jvmv7iF9c91p2vv7gz41JPhR9fwweh/sz++YF5Zda7udGygmqJ0hnOvHjQJWMPhFDNCQmUwKkPuaN09LZebQkAICIFHQUD8cDwKylJHkRDQ7B6n/dPKDdjZA1zO0JEdvp8zWhWatzIQcy6cS2fzvC4moFcaQLOvi3sTSPpqKV/+L5TTp84QFnySyIwHa4IuK44LQV/x+QQvXu8dwKmWbzJxQBVuV/rWOHbwxPud13CvZqYex5b0Wz6Bzqf8mdBnOftchvPu9NY4m/nfa9jjR/8W7xB020xTnjKN2ehNa0L2TjiYed5M7XJJCAgBIVAoBGSGo1AwSiHFhoDLU3TwsCJGiY0WnqN5vc5Vts3aQ7SaGdBF/cLqtW+wzHslCyut4YctF4g1OOJcpzpZQd+xMzJ3/0boeXim30j6nfwfIVez0JybUKPA7ksrUG/i23RL3Efw8UgSMh1wdm+qtpcaSIrJvG0GQnNoxeDFY+lXBfpUDGHwrHBu6RudE/V9PmSEWxBLXtnEhWvWLJz5NAEL38dnsyezt6p1nIIkYxIRJ/QwYAiefbPZm1IVV5s/+HVjFOqqJCEgBITAQyMgguOhoZWCHykBYypRB05xtfcQ/FYNU1Vnk3xiG9+MXMZX+zNzllTQkjnn782kiLd4c9hIfPuqTZ1KAKRf3MeGfeuV4NDQZV3g1wlzqPrP4byyoBtDTZteNT1p0ac4clFv+fFSazvsrarRfMw/6V3FdLhW1RR7hiOrprJ8Y5ISHH8uh+gyIwjeGc+rvdII3hXz57Falcem9XimDdUInrCYzddySiH11/ksGfg1M94bTpsD6gRKTumWpnQur5jHt4386DfnI14yxHH524vs2qQEh6zDWApR8gkBIfAABHQ9Gncp2GLyA1Qij5RmAjpsewbw30WxZjaNluZ2S9uEgBAQAkKgIARkFbcgtCSvEBACQkAICAEh8EAERHA8EDZ5KC8BnUGPPt203GDm1ISgEgJCQAgIASGgCMgeDvkY/EUCGlnH/82K9/WcLIgHzb9YqzwuBISAEBACJYuAzHCUrP4qhtaqjY2tRuE3z5OWyqOlJCEgBISAEBAC5giI4DBHRa4JASEgBISAEBAChUpABEeh4pTChIAQEAJCQAgIAXMERHCYoyLXSjABG5z+Np4ZGzey4dQONh3/mXU/zOL1RvJRt7xT78dQHYXuNJOVx4JYPak2Jm8mxTlpNQbwsemzcPO1tg1OxdlgsU0IlFICsmm0lHZsWW2WVu0lfJYNon3I5yz9KIRIgxOV3SqQHCNerSz9TNyfoRXlatanlo0dVg2dsSWiWHsp1cUGsbD3IextatBh8Ty8LAUh+YSAEChUAiI4ChWnFFbUBKxcW1LPNpY9S77ktxARGQ/SH/dnqLyd/vdtRoXVgnOnVWzcYp6yE4kKS1Rn8jKoKyepinlniXmlmYAIjtLcu2WobVp5d8ZvW0AvFU7elGp8vQ2PG+2PX9gXr1Wxytm58lLu0gO/tT50rWOvwsgrB+jRR9j92QJW/OciKbf0iS2VPF5n+LiedH6yBk4m9yKpVzm5ajLTP7ua+23epiqNh05klHcXmrmo5Zr4MPavWcSyNSeJuxk5vkJzus3wxbN7Q2o4qDKM6SSH/cwSr6XsTSyIz5L726OVc6XNuMmMHtKeJypqpIXt4JdFi/n39gSyTBysqtJiymzGvaRmJlzLq1kJ0F/ay+YF81kVFJfjTt0ShllqeWLBjgk0N5VpSgcnMWho6F2iI8eeMX6MGNKBBpVVPuV6Pu7sUfZ//B4rdqVbFs3WrTdTfppMp53vMOofB7muuGrVuuH78wyeCRzHiNknSGo0lvdW9MW9lh2GqFB+32OkXve2PJZ5jN+mT2Xp1mTL3dHfbJP8KwSEwEMhIILjoWAti4XW5MlB/bFLzd0rYYg6TWzVxriUy5+FJXmMEVsJ3BaXO2jmXxS69KN8PciLTc3GMm9RE8L8fFkTZjqmayT7ekKO2MhJicfZuWQ2O6LjSVWDcN1+Pkx6dwHGk4P4ONSkOKyp0OsjVn78FOUOfMs3049w8XomVlVcqRwen2uHzpE6k1exeEgM2+ZP44ujeip09uKtycv4ILk/E79JUIOcA4/9fTE+PY6x4T1fdp5LR1fJjdq107lUoG/ZlthTicYzPmfe4AT2L5xFwBk7avd9i1GffUY1by/m79WjWTni2rElT2R+ydLxoUSrMHJNvXwZsnQuST3GsfaCClxnAUNdbCDzex7EQQmKDp/4432Ta95/dRVpOH018zxTCF46m9mhyWS7dGH0R71xr2+PlaWCI3Ijn/i2ocnqucwKfYPJX9vQds40uiWsYer84yQadVhXb0HrWpf5YcwiDnf1Z/agKDaMn8S6nv5M/WAIW/eqWDPpBRF35hok14SAECgMAiI4CoOilKEIuOHhM+nWrAJHvudYk360MH2VzidpIes53rz/PfOw8xTbLBAcaBkkhIeT4JSkREEWKZdNoefv9gui018i+JdLtyw6edqWp155l9buztiExpJV/kk8pz9FxZAPGT0ikIisuwcrrUYPxgxz4uz0YSzckJL7bf3wRdLb/ciHnh1xW6+eyy6Hk5vaTpl4hmO/H+JkjKnKk5zIqfn2MnX2jpS3tcq9qhnISktDf2OWRLPAHqNrd0YMrkD8sjeZtyo6Z7biwJ5w+GkVo3ye5osDW4m62eLog+zemjsjceh0JdptGc1z7Z1YdyEZoyUMs5O5fl4tothkUS+fQLWa60u8OdiJ5JWjmfNp7oyQsUJFequfJ27aYdG/RjJ2L2Dm8masnLEAv4bZtPc4zfq+X3IkNQ9DLY7w0KMEG86TMTCL8JAQdmecIP3lRtRSvmFEcFgEWzIJgYdOQATHQ0dcVioINhO8bakFjV9mQZ5CzFK1A32mvEmvLvVwVcsvGXHp2KlZmFQHG3LmZlza0NoZrn68i6tmxIYpi3XdjjS0tsXR/2c2+t9hW0wdnG00JTiSOOW/nG2fT2DG79248NuvbPtxI4E7Iki5ueSS82h56rz3E5++evO/Yjx73+jHB8E3MllgT7m67anPdQ78fv1WpFld5mUO7slgVO92PG6/hSgzsee1hHCuKNHgVt1BzesowXFHUx70rXWdDjTUxXJoeyGEvNfSiFg5lSUeX+A3UK1cLR/EutO3Abxlpk4zCUyd+tHQjAbVnnJY6e4WjA/aLnlOCAiBv0ZABMdf4ydPlyACmk0dun02nzGP/876Of9i95lUjC5P473Cm3o32pEzWKnftXuMvjo1iOmIY5/vZLV8cUfGrASi9bmDnPHcd8x/cQvrn+tO197dGfCpJ8OPruGD0f9mf/zN2ZcMIv/Pj2k/qcHRZIMxg7g8A6ol9uSabrLp9nT/sdaIQZmvs7r72ft2a57Jo7vqtS6nBIyaqcm+e4bpvuWayaBzdadjA9UnSmc49+pBk4A1HE65s1b1oMpgVA26R9eZKV0uCQEh8KgIiHOCR0Va6ilyApp9XdybQNJXS/nyf6GcPnWGsOCTRGb8aZp2/QjH4qFWv064qZkKcyk7fD9ntCo0b2Ug5pxp6SbP62IC+ryDcVYcF4K+4vMJXrzeO4BTLd9k4oAqeYIYGdGfP8zhPX8QYnrtO8bFlILZkxV+gHNUo/UzLjmbQU1Js32Mdp3s1SmSP7iUYWZwNtewglzTMkkzrd04VsHRtPs2T8q+epSruNCibWULgjVZ49jBE+93XsO9mhkDHFvSb/kEOp/yZ0Kf5exzGc6701vjbOYvl2GPH/1bvENQvJmbpqKN2ehNm3nsnXDIJ4sZC+SSEBAChURAZjgKCaQUU/wJmPZvhJ6HZ/qNpN/J/xFyNQvNuQk11Lh8M+lSQ/jP4uO8+P4slv6/pvzn+xAuxGSjq+CiBMhBAjeqZYKoX1i99g2Wea9kYaU1/LDlArEGR5zrVCcr6Dt2RppKq0C9iW/TLXEfwccjSch0wNm9qdqqaSApJtPib+GW2RPI6v8M45O3FzItexWBZx2o/epYRtSNZIf3bqJNKxCF/T/dmEREiFJGw73x8sxkW4wzNe3+YNOGSPSXf+ar3UOZ+feP8DGuY+dVe6q3f42myow82i4HuebQisGLx9KvCvSpGMLgWeF/5tE5Ud/nQ0a4BbHklU1cuGbNwplPE7DwfXw2ezJ7az6bSG525p3/mmw+odaWBgzBs282e1Oq4mrzB7+a+vTOvPJeCAiBQidQ2H+GCt1AKVAIFBYBXdYFfp0wh6r/HM4rC7ox1DQdoOlJiz7FkYv6G8cns0n4zo8xMUMZPqY7Az8aoHZZqJQWxfkfL7FrkxqcjMmc8/dmUsRbvDlsJL59Tb42DaRf3MeGfeuV4FBTHNZ22FtVo/mYf9K7Su4UgCH2DEdWTWX5xiQlOCyddbDEnkTC5oxgevwUxoyazbsV1MB+fhc/jl9IgOmESmEBvK0cPVdWzuGLJv/g9Zlz6WKMJ0IdLd7+PyU4siPZ4zuR5bP8eH3aB3S1Um0Ii8g5hmxSWnnt0WVGELwznld7pRG8K+bWHhTTXgyb1uOZNlQjeMJiNl8zPaz8f/w6nyUDv2bGe8Npc0CdQClQ29K5vGIe3zbyo9+cj3jJEMflby/e6NMCFSSZhYAQeAACuh6Nuzycv0cPYIw8UhIJKDfXPQP476JYM5tGS2J7xOaHQUB73ItPgoZhPbEnE4Melgh6GJZLmUJACBQWAZnhKCySUo4QEAI3CDjy2MBXaZN8hkvX1SJK5Qa0HeFFo9TtLD4kYkM+JkKgrBIQwVFWe74Q260z6NGnm5YkLF0mKMTKpajiR8CmErXdeygPq6OpbHL8ppagrgdvYJXXSrbk+CORJASEQFkkIEsqZbHXC7nNVrWfoau7npObDnDlxpHQQq5CihMCQkAICIESTkAOh5XwDix689Xmvlaj8JvnSUvl1VGSEBACQkAICAFzBERwmKMi14SAEBACQkAICIFCJSCCo1BxSmElnoCVE3U8JzJxZB3yuOco8c2SBggBISAEipqACI6i7gGpv3gRsHKm4eB+dP+bs4rEUfRJU+HgPz61g003X2vb4FT0ZokFQkAICIECE5BTKgVGJg8IgUdHQBcbxMLeh7C3qUGHxfPwenRVS01CQAgIgUIlIIKjUHFKYUKgkAlkJxIVlqhck2dQN62Qy5bihIAQEAKPkIAsqTxC2FLVwyLgSMPlatlh/d9wueMTbazUndnHNjGv840IYzZVaew9mwU7t+UuU+xdxbujmnLD+/ifBjYbz5ztW3PybNzxCX/vX4vyBXEz4tabKQd38N+F7lS/UbVWrRs++3ewfnYzKik7dU3GMntLUE4d/9v+CVM+XMzKQ6od+1bg29Up1xX4w0Im5QoBISAEHjEBmeF4xMBLb3U1eXJQf+xSc0d8Q9RpYqs2xuUeGyEsyWOM2Ergtjiy7gkum2RTiNVGrlRUEV6v6ari5qoj/lIsGZVcqaxCyZ+KVRHMdI7UmbyKxUNi2DZ/Gl8c1VOhsxdvTV7GB8n9mfhNwo14KqoyXRrnA+bydThU7zmWsXM+o1LCIGZtTrMs8FrkRj7xbUOT1XOZFfoGk7+2oe2caXRLWMPU+cdJNOqwrt6C1rUu88OYRRzu6s/sQVFsGD+JdT39mfrBELbuVbFC0guicu4JSW4KASEgBIqUgAiOIsVfOirXqbDfWdTFw2cSHjeapIWs53jz/rS4GS/dTFMtycPOU2y7r+DIIvGMiik/8HGcy1lR/oWFrPLXs+7FMXxT5XGqatGcv25Eq9GDMcOcODt9GAs3pOQKh8MXSW/3Ix96dsRtfSARN+08HsCagFCS1Xvt9/NkNw3g7XFP47b9N66YQpzfNxnJ2L2AmcubsXLGAvwaZtPe4zTr+37JkdQ8IkKLIzz0KMGG82QMzCI8JITdGSdIf7kRtZRfExEc9wUtGYSAECghBERwlJCOKr5maugDR9CniTkLl5m7eMc1S/Lcrxg1uEdcJNGxNq4VnDH0qYeVkhNdO1Xiv0lPUCnxAJFqpsC6UUcaWtvi6P8zG/3vKDOmDs5qdiTCjJjQqeinRw+oUOivtqWWXZASHBbOOmhpRKycyhKPL/AbCPHLB7HutClW/N1Jp5mcpunUj4ZmNCjry2Gls7Ceu4uTK0JACAiBYkdABEex6xIx6EEIGK4c5aqxD0807kzbpsf5bk0l+rzWkQYHq2Ct7kUql+s6NYDr1PLKPt/JBJxRcdLzpqwEok1u2W/st7j9prpuGvyVKCioL1WdqzsdG6hHlc5w7tWDJgFrOJxiRkioDEaD0bLlmgcBJM8IASEgBIqYgAiOIu4Aqb5wCOgSzxGWXAP3wYOpfOYzPl3nRuMBQ3itYkXS9l4kSemL7PD9nNHa0byVgZjAi6RZqB40u8dp/7RyA3b2AJcz8ooFaxw7DGSgRwbHAn7k4J2ByRxb0m/5BDqf8uetdx0Z+t0E3p0ezIiZR4i/Q+8Y9vjRv4WJhZX6MZPUspXeNPti74SDypB8x/NmnpBLQkAICIFiRcDs37ZiZaEYIwQsIKDLuEhIuDU1u1bjwr//ICZyO+uP1qFjfSORB6+TqcrQRf3C6rUJOHmvZOHcgbz4vDttn32W570G0MXtjkpcnqKDR1vavPAqQz9dzMg6V9m2eA/ReVZENIdWDF48lgEjfZgxse7tnkl1TtT3+ZARbkEs8d3EhbM/sHBmCIa+7+PzrIN5UXGvdhqTiDihh+ZD8OzbifbdX6H3K67Y3esZuScEhIAQKEYEZIajGHWGmPIXCBgTuHgwCeoG8c3eNLUPQk/omv0kd67KH2HpainEtCSSzDl/byZFvMWbw0bi29c0XBtIv7iPDfvWszNSTXkYU4k6cIqrvYfgt2qYuq9OwJzYxjcjl/HV/szbllR0mREE74zn1V5pBO+KyRE1uUkFtGs9nmlDNYInLGbzNdNVA6m/zmfJwK+Z8d5w2hxQJ1Bu5bfkl3Qur5jHt4386DfnI14yxHH524vs2hSFXmY7LAEoeYSAEChiAhKevog7QKoXAkJACAgBIVAWCMiSSlnoZWmjEBACQkAICIEiJiCCo4g7QKoXAkJACAgBIVAWCIjgKAu9LG0UAkJACAgBIVDEBERwFHEHSPVCQAgIASEgBMoCAREcZaGXpY1CQAgIASEgBIqYgAiOIu4AqV4ICAEhIASEQFkgIIKjLPSytFEICAEhIASEQBETEMFRxB0g1QsBISAEhIAQKAsERHCUhV6WNgoBISAEhIAQKGIC/x8A2/SssmrCSwAAAABJRU5ErkJggg==" alt="" width="540" height="293" /></p>
<h2>Le model (Bean Java)</h2>
<p style="text-align: justify;">L&#8217;objet <code>Java</code> qui va contenir les données, c&#8217;est à dire le message &#8220;Hello world !&#8221; est un <code>String</code>. Cet objet va être créé par un producer en scope Request. A chaque nouvel appel à la vue, une nouvelle requête sera nécessaire et l&#8217;objet sera recréé de toute pièce.</p>
<pre class="brush: java; gutter: true; first-line: 1">package org.eiw.data;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.inject.Named;

/***
 * Le producer est dans le scope Request,
 * il sera recréé à chaque nouvelle requête HTTP.
 */
@RequestScoped
public class HelloWorldProducer {
	private String message;

	/**
	 * La méthode qui produit l'objet de données vis à vis de la page XHTML.
	 */
	@Named
	@Produces
	public String getMessage() {
		return message;
	}

	/**
	 * La méthode qui initialise l'objet,
	 * à chaque nouvelle requête HTTP.
	 */
	@PostConstruct
	public void initMessage() {
		message = "Hello world !";
	}
}</pre>
<h2>La vue (XHTML)</h2>
<p style="text-align: justify;">Dans ce fichier, nous allons utiliser le conteneur CDI pour récupérer l&#8217;objet <code>Java</code> des données vu ci-dessus. Nous allons ensuite l&#8217;associer à un tag JSF pour formater son affichage :</p>
<pre class="brush: xhtml; gutter: true; first-line: 1">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"&gt;
&lt;h:head&gt;
&lt;/h:head&gt;
&lt;h:body&gt;
	&lt;h:outputText value="#{message}" /&gt;
&lt;/h:body&gt;</pre>
<p style="text-align: justify;">Pour récupérer l&#8217;objet, il faut utiliser son nom qui est égal par défaut au nom de l&#8217;instance avec le langage EL : <code>#{maVariable}</code>.</p>
<h2>Le déploiement</h2>
<p style="text-align: justify;">Pour déployer cette application, il suffit d&#8217;utiliser le plugin wildfly avec la commande suivante : <code>mvn wildfly:run</code>. Ensuite de se rendre sur l&#8217;adresse <a href="http://localhost:8080/hello-world/index.jsf" target="_blank">http://localhost:8080/hello-world/index.jsf</a>  et de visualiser le résultat :</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" src="data:image/png;base64,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" alt="" width="408" height="90" /></p>
<p style="text-align: justify;">Remarque : s&#8217;il s&#8217;agit de la première fois que vous utilisez le plugin wildfly, il vous faudra un peu de temps pour démarrer l&#8217;application car il est nécessaire de télécharger, dans le repository maven local, le serveur complet avant de le démarrer.</p>
<p style="text-align: justify;">Ce tutoriel est disponible sur GitHub à l&#8217;adresse suivante : <a href="https://github.com/yanLanglois/jsf-2.2-tutoriel/tree/master/hello-world" target="_blank">https://github.com/yanLanglois/jsf-2.2-tutoriel/tree/master/hello-world</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/03/14/jsf2-2-hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>J2EE 6 : Doublons dans les scopes @&#8230;Scoped</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/02/06/j2ee-6-doublons-dans-les-scopes-scoped/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/02/06/j2ee-6-doublons-dans-les-scopes-scoped/#comments</comments>
		<pubDate>Thu, 06 Feb 2014 20:52:40 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=2523</guid>
		<description><![CDATA[Doublons dans les scopes J2EE6 : scope JSF ou scope CDI.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Dans J2EE6 il existe deux spécifications qui parlent de scopes applicatifs : <a href="https://jcp.org/en/jsr/detail?id=314" target="_blank">JSR 314: JavaServer Faces 2.0</a> et <a href="https://jcp.org/en/jsr/detail?id=299" target="_blank">JSR 299: Contexts and Dependency Injection for the Java<span><sup>TM</sup></span> EE platform</a> (CDI). La difficulté vient du fait que ces scopes ont le même nom et la même fonction :</p>
<ul>
<li>@javax.faces.bean.<em>RequestScoped</em> (JSF) et @javax.enterprise.context.<em>RequestScoped</em> (CDI).</li>
<li>@javax.faces.bean.SessionScoped (JSF) et @javax.enterprise.context.SessionScoped (CDI).</li>
<li>@javax.faces.bean.ApplicationScoped (JSF) et @javax.enterprise.context.ApplicationScoped (CDI).</li>
</ul>
<p style="text-align: justify;">Lesquels utilisés ? Comme pour certaines autres annotations qui semblent dupliquées dans J2EE, ces annotations sont identiques, elle diffèrent uniquement suivant le contexte de déploiement. JSF2.0 propose ses propres annotations pour laisser la possibilité aux développeurs de déployer des applications JSF2.0 dans des conteneurs dépourvus de CDI (Tomcat par exemple) mais en conservant l&#8217;avantage de l&#8217;outjection proposée par la JSR CDI.</p>
<p style="text-align: justify;">Sachant cela, la sélection de ces annotations doit se faire en fonction du contexte de déploiement. Il faut bien entendu préférer les annotations CDI à JSF si le conteneur est compatible avec la JSR-299.</p>
<p style="text-align: justify;">Il existe cependant un scope proposé par JSF2.0 et inexistant dans CDI : @ViewScoped. Il est possible dans ce cas d&#8217;utiliser la librairie <a href="http://deltaspike.apache.org/jsf.html" target="_blank">DeltaSpike JSF</a> ou <a href="http://www.seamframework.org/Seam3/FacesModuleHome" target="_blank">Seam 3 Face Module</a> pour avoir accès à une version CDI du scope.</p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/02/06/j2ee-6-doublons-dans-les-scopes-scoped/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>@Model versus @Named versus @ManagedBean</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/02/04/model-versus-named-versus-managedbean/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/02/04/model-versus-named-versus-managedbean/#comments</comments>
		<pubDate>Tue, 04 Feb 2014 21:52:29 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=2466</guid>
		<description><![CDATA[@Model, @Named, @ManagedBean ! Quelles annotations utiliser...]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Lorsque l&#8217;on débute en J2EE il est parfois difficile de voir la différence entre certaines annotations. Elles proviennent souvent de spécifications (JSR) différentes et peuvent avoir un rôle similaire ou totalement identique. Certaines fois, il s&#8217;agit uniquement d&#8217;une différence de contexte dans lequel le code est développé ou déployé.</p>
<p style="text-align: justify;">Les annotations suivantes sont utiles pour déclarer des objets Java qui vont être accessibles dans le langage EL via les symboles <em>#{}</em> (on parle d&#8217;outjection par opposition à injection).</p>
<h2>@javax.faces.bean.ManagedBean</h2>
<p style="text-align: justify;">Cette annotation arrive avec la <a href="https://jcp.org/en/jsr/detail?id=314" target="_blank">JSR-314 JavaServer Faces 2.0</a>. Grâce à elle, il n&#8217;est plus nécessaire de déclarer les Managed Bean JSF dans le fichier XML faces-config.xml. Elle n&#8217;est utile que lorsque le l&#8217;application développée est déployée dans un contexte où le conteneur CDI n&#8217;existe pas, comme Tomcat par example.</p>
<p style="text-align: justify;">De plus, elle peut facilement être confondue avec l&#8217;annotation suivante @java.annotation.ManagedBean.</p>
<h2>@javax.annotation.ManagedBean</h2>
<p style="text-align: justify;">Cette annotation est définie dans la <a href="https://jcp.org/en/jsr/detail?id=316" target="_blank">JSR-250</a>. Elle est utilisée pour déclarer un managed bean spécifié dans la <a href="https://jcp.org/en/jsr/detail?id=316" target="_blank">JSR-316</a>. Il ne faut pas confondre avec les managed bean JSF. Le principe de la JSR-316 est de pouvoir transformer n&#8217;importe quel POJO (Plain Old Java Object) en objet pouvoir avoir un cycle de vie, des intercepteurs, etc.</p>
<p style="text-align: justify;">Dans un contexte CDI, cette annotation est obsolète car le principe du CDI est de transformer tous les POJO en Managed Bean. Donc cette annotation n&#8217;est pas du tout utile. Elle n&#8217;aura d&#8217;ailleurs aucun impact visible sur l&#8217;exécution du code.</p>
<h2>@javax.enterprise.inject.Model @javax.inject.Named</h2>
<p style="text-align: justify;">L&#8217;annotation @Model est équivalante à l&#8217;annotation @Named à laquel il a été rajouté le contexte @RequestScoped (@javax.enterprise.context.RequestScoped).</p>
<p style="text-align: justify;">Ces annotations proviennent de la <a href="https://jcp.org/en/jsr/detail?id=299" target="_blank">JSR 299 “contexts and dependency injection” (CDI)</a>. Cette JSR offre beaucoup plus de possibilités d&#8217;utilisation que celle sur JSF2.0. Dans un contexte où une application est déployée dans un conteneur compatible CDI il est donc préférable d&#8217;utiliser les annotations CDI plutôt que JSF2.0.</p>
<h2 style="text-align: justify;">Conclusion</h2>
<p style="text-align: justify;">Le choix de l&#8217;annotation à utiliser dépend essentiellement du conteneur où l&#8217;application sera déployée. Il est toujours préférable d&#8217;utiliser les annotations provenant de la JSR-299 (CDI) dans le cas où le conteneur est compatible avec CDI.</p>
<p style="text-align: justify;">Pour plus d&#8217;information cet article est très intéressant : <a href="https://weblogs.java.net/blog/cayhorstmann/archive/2009/12/23/javaxfacesbeanmanagedbean-dead-arrival" target="_blank">Is @javax.faces.bean.ManagedBean Dead on Arrival?</a></p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/02/04/model-versus-named-versus-managedbean/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java EE 7 : Fichiers de déploiements (deployment descriptors)</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/01/24/java-ee-7-fichiers-de-deploiements-deployment-descriptors/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/01/24/java-ee-7-fichiers-de-deploiements-deployment-descriptors/#comments</comments>
		<pubDate>Fri, 24 Jan 2014 21:00:43 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=2401</guid>
		<description><![CDATA[Fichier XML dans Java EE 7.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Il est toujours compliqué de savoir quelles versions il faut utiliser pour les fichiers de description des déploiements (comme le fichier web.xml par exemple). Cet article a pour but de référencer les principaux fichiers utilisés dans le cadre d&#8217;une application java J2EE 7 avec une petite explication sur leur utilité.</p>
<h2>CDI 1.1</h2>
<p style="text-align: justify;">Il s&#8217;agit du fichier beans.xml. Il est obligatoire si l&#8217;on souhaite utiliser l&#8217;injection de dépendance. Attention, il peut resté totalement vide.</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.1" bean-discovery-mode="all"&gt;
&lt;/beans&gt;</pre>
<p style="text-align: justify;">Ce fichier doit être déposé dans le répertoire WEB-INF/lib ou WEB-INF/classes/META-INF pour un archive web (WAR) et META-INF/ dans une archive java (JAR)</p>
<p>Pour plus d&#8217;information : <a href="https://jcp.org/en/jsr/detail?id=346">JSR 346: Contexts and Dependency Injection for Java<sup>TM</sup> EE 1.1</a></p>
<h2>Bean Validation 1.1</h2>
<p style="text-align: justify;">Deux fichiers pour cette JSR (<a href="https://jcp.org/en/jsr/detail?id=349" target="_blank">349</a>) : validation.xml et constraints.xml</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;validation-config
        xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration validation-configuration-1.1.xsd"
        version="1.1"&gt;
&lt;/validation-config&gt;</pre>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;constraint-mappings
        xmlns="http://jboss.org/xml/ns/javax/validation/mapping"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.1.xsd"
        version="1.1"&gt;
&lt;/constraint-mappings&gt;</pre>
<p style="text-align: justify;">Ces fichiers doivent être déposés dans le répertoire META-INF d&#8217;une archive Java (JAR).</p>
<p>Pour plus d&#8217;information : <a href="https://jcp.org/en/jsr/detail?id=349" target="_blank">JSR 349: Bean Validation 1.1</a></p>
<h2>JPA 2.1</h2>
<p style="text-align: justify;">Pour avoir accès à la base de données, il est obligatoire de posséder le fichier persistence.xml.</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1"&gt;
&lt;/persistence&gt;</pre>
<p style="text-align: justify;">Il existe aussi un fichier de mapping des entités qui n&#8217;est pas obligatoire : orm.xml. Il permet, entre autre, de référencer des classes qui se trouvent dans une même application mais dans des librairies tierces (JAR).</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd"
                 version="2.1"&gt;
&lt;/entity-mappings&gt;</pre>
<p style="text-align: justify;">Ces deux fichiers doivent être positionnés dans le répertoire META-INF/ dans une archive java (JAR). Pour rappel, seul le fichier persistence.xml est obligatoire s&#8217;il est question d&#8217;avoir des accès avec une base de données.</p>
<p>Pour plus d&#8217;information : <a href="http://jcp.org/en/jsr/detail?id=338">JSR 338: Java<span><sup>TM</sup></span> Persistence 2.1</a> :</p>
<h2>EJB 3.2</h2>
<p>Ce fichier n&#8217;est pas non plus obligatoire : ejb-jar.xml.</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd"
         version="3.2"&gt;
&lt;/ejb-jar&gt;</pre>
<p>Ce fichier doit être positionné dans le répertoire META-INF/ dans une archive java (JAR).</p>
<p>Pour plus d&#8217;information : <a href="https://jcp.org/en/jsr/detail?id=345" target="_blank">JSR 345: Enterprise JavaBeans<sup><span>TM</span></sup> 3.2</a></p>
<h2>Servlet 3.1</h2>
<p>Pour plus d&#8217;information : <a href="https://jcp.org/en/jsr/detail?id=340" target="_blank">JSR 340: Java Servlet 3.1 Specification</a></p>
<h2>JSF 2.2</h2>
<p>Pour la partie vue de J2EE7, le fichier faces-config.xml n&#8217;est plus obligatoire.</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
              version="2.2"&gt;
&lt;/faces-config&gt;</pre>
<p>Un fichier JSF est un fichier XML avec l&#8217;extention *.xhtml. Il se présente sous cette forme :</p>
<pre class="brush: xhtml; gutter: true; first-line: 1">&lt;html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"&gt;
&lt;/html&gt;</pre>
<p>Le fichier faces-config.xml doit se trouver dans le répertoire WEB-INF/ d&#8217;une archive web (WAR).</p>
<p>Pour plus d&#8217;information : <a href="https://jcp.org/en/jsr/detail?id=344" target="_blank">JSR 344: JavaServer<span><sup>TM</sup></span> Faces 2.2</a></p>
<h2>JAX-WS 2.2</h2>
<p>Pour les services web, il s&#8217;agit du fichier webservices.xml :</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;webservices xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/javaee_web_services_1_4.xsd"
             version="1.4"&gt;
&lt;/webservices&gt;</pre>
<p>Il doit être positionné dans le répertoire WEB-INF/ d&#8217;une archive web (WAR).</p>
<p>Pour plus d&#8217;information : <a href="https://jcp.org/en/jsr/detail?id=224" target="_blank">JSR 224: Java<sup><span>TM</span></sup> API for XML-Based Web Services (JAX-WS) 2.0</a>, <a href="https://jcp.org/en/jsr/detail?id=109" target="_blank">JSR 109: Implementing Enterprise Web Services</a>, <a href="https://jcp.org/en/jsr/detail?id=181" target="_blank">JSR 181: Web Services Metadata for the Java<sup><span>TM</span></sup> </a></p>
<h2>Conclusion</h2>
<p style="text-align: justify;">Pour plus d&#8217;information et connaître les autres fichiers qui permettre de réaliser d&#8217;autres types de traitements, par exemple des batchs en J2EE7 ou décrire une archives entreprises (EAR) : <a href="http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html#7">http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html#7</a></p>
<p style="text-align: justify;">Cet article est fortement inspiré de ce site internet : <a href="http://antoniogoncalves.org/2013/06/04/java-ee-7-deployment-descriptors/" target="_blank">http://antoniogoncalves.org/2013/06/04/java-ee-7-deployment-descriptors/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/01/24/java-ee-7-fichiers-de-deploiements-deployment-descriptors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSFCharts : Highcharts pour JSF version 0.0.1</title>
		<link>http://everythingiswrong.free.fr/index.php/2013/09/27/jsfcharts-highcharts-pour-jsf-version-0-0-1/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2013/09/27/jsfcharts-highcharts-pour-jsf-version-0-0-1/#comments</comments>
		<pubDate>Fri, 27 Sep 2013 20:12:06 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=2341</guid>
		<description><![CDATA[La version 0.0.1 de JSFCharts est disponible !]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="alignleft" src="http://showcase-jsfcharts.rhcloud.com/resources/gfx/birdLogo.png" alt="" width="142" height="106" />La version 0.0.1 de <a href="http://yanlanglois.github.io/jsfcharts/" target="_blank">JSFCharts</a> est disponible. Cette librairie est un wrapper JSF de <a href="http://everythingiswrong.free.fr/wp-admin/www.highcharts.com" target="_blank">Highcharts</a> 3.0.x (3.0.1 pour cette version). Le site de démonstration est hébergé <a href="http://showcase-jsfcharts.rhcloud.com/home.jsf">ici</a>. Les sources de cette application exemple sont disponibles sur <a href="https://github.com/yanLanglois/jsfcharts/tree/master/jsfcharts-demo" target="_blank">GitHub</a>.</p>
<p style="text-align: justify;">Une fois intégrée à votre projet, elle vous permettra de générer les graphiques dynamiques  suivants :</p>
<ul>
<li>Ligne (Line)</li>
<li>Histogramme (Bar, Column)</li>
<li>Aires (Area)</li>
</ul>
<p style="text-align: justify;">Pour l&#8217;intégrer dans un projet Maven, il faut ajouter ces informations dans votre POM :</p>
<pre class="brush: xml; gutter: true; first-line: 1">	&lt;repositories&gt;
		&lt;repository&gt;
			&lt;id&gt;jsfcharts-repo&lt;/id&gt;
			&lt;name&gt;Jsfcharts Maven Repository&lt;/name&gt;
			&lt;url&gt;http://yanlanglois.github.io/jsfcharts/repository&lt;/url&gt;
			&lt;layout&gt;default&lt;/layout&gt;
		&lt;/repository&gt;
	&lt;/repositories&gt;

	&lt;dependencies&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;org.eiw&lt;/groupId&gt;
			&lt;artifactId&gt;jsfcharts-core&lt;/artifactId&gt;
			&lt;version&gt;0.0.1&lt;/version&gt;
		&lt;/dependency&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;org.eiw&lt;/groupId&gt;
			&lt;artifactId&gt;jsfcharts-jslib&lt;/artifactId&gt;
			&lt;version&gt;0.0.1&lt;/version&gt;
		&lt;/dependency&gt;
	&lt;/dependencies&gt;</pre>
<p style="text-align: justify;">Rappel : des informations complémentaires sur JSFCharts sont disponibles <a href="http://everythingiswrong.free.fr/index.php/2013/01/31/jsf-charts-graphiques-avec-jsf/" target="_blank">ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2013/09/27/jsfcharts-highcharts-pour-jsf-version-0-0-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
