diff --git a/config.json b/config.json
index 9e1277e3108d1ed885e5c591fe9f1841514e8be4..27f950c8976c887efdafe22c4897bfdd9842a5c3 100644
--- a/config.json
+++ b/config.json
@@ -14,7 +14,7 @@
 	},
 	"ldap_data_tol": {
 		"searchBase": "ou=eleves,dc=frankiz,dc=net",
-		"searchFilter": "(&(&(&(|(givenName=*${app_fn})(|(givenName=*${app_fn}*)(givenName=${app_fn}*)))(|(sn=*${app_ln})(|(sn=*${app_ln}*)(sn=${app_ln}*))))(brPromo=${app_yr}))(brMemberOf=*${app_na}))",
+		"searchFilterAttributes": ["givenName", "sn", "brPromo","telephoneNumber","mail","brRoom","brIP","brMemberOf","brMemberOf","brMemberOf","brMemberOf","brMemberOf","brMemberOf"],
 		"searchAttributes": ["jpegPhoto","givenName", "sn", "brBirthdate", "brPromo","telephoneNumber","mail","brRoom","brIP"]
 	},
 	"sessionSecret":"change this"
diff --git a/doc/db_knex_router.js.html b/doc/db_knex_router.js.html
index 6b9955abfc463d4541bd9e7923ef831f24d6ff66..77b0a19670a523b59b3d45f4c80c3ea135bf1507 100644
--- a/doc/db_knex_router.js.html
+++ b/doc/db_knex_router.js.html
@@ -45,17 +45,13 @@ module.exports = require('knex')(config);</code></pre>
 </div>
 
 <nav>
-    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul>
+    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul>
 </nav>
 
 <br class="clear">
 
 <footer>
-<<<<<<< HEAD
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid)
-=======
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time)
->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36
+    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid)
 </footer>
 
 <script> prettyPrint(); </script>
diff --git a/doc/global.html b/doc/global.html
index c50257454724b35b0045fe3b6e121c7de98e0aab..f5578b0321c3be27c2047513620d4b8ba8d5f3b6 100644
--- a/doc/global.html
+++ b/doc/global.html
@@ -154,7 +154,7 @@
     
     <dt class="tag-source">Source:</dt>
     <dd class="tag-source"><ul class="dummy"><li>
-        <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line89">line 89</a>
+        <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line95">line 95</a>
     </li></ul></dd>
     
 
@@ -238,7 +238,7 @@
     
     <dt class="tag-source">Source:</dt>
     <dd class="tag-source"><ul class="dummy"><li>
-        <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line99">line 99</a>
+        <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line105">line 105</a>
     </li></ul></dd>
     
 
@@ -371,7 +371,7 @@
     
     <dt class="tag-source">Source:</dt>
     <dd class="tag-source"><ul class="dummy"><li>
-        <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line58">line 58</a>
+        <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line64">line 64</a>
     </li></ul></dd>
     
 
@@ -409,11 +409,15 @@
     
 
     
-    <p class="summary"><p>Fonction qui retrouve les groupes du LDAP dont un individu est membre (pas de bind nécessaire)</p></p>
+    <p class="summary"><p>Fonction qui interroge le LDAP et retrouve les groupes dont un individu est membre.</p></p>
     
 
 
 
+<div class="description">
+    <p>Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listGroups(uid).then((res) =&gt; { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).</p>
+</div>
+
 
 
 
@@ -504,7 +508,7 @@
     
     <dt class="tag-source">Source:</dt>
     <dd class="tag-source"><ul class="dummy"><li>
-        <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line17">line 17</a>
+        <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line30">line 30</a>
     </li></ul></dd>
     
 
@@ -531,7 +535,7 @@
 
         
 <div class="param-desc">
-    <p>Liste des uid de groupes (noms flat des groupes) où l'id fourni</p>
+    <p>Liste des uid de groupes (noms flat des groupes) où l'id fourni est membre</p>
 </div>
 
 
@@ -560,17 +564,17 @@
     
 
     
-    <h4 class="name" id="listMembers"><span class="type-signature"></span>listMembers<span class="signature">(uid)</span><span class="type-signature"> &rarr; {string}</span></h4>
+    <h4 class="name" id="listMembers"><span class="type-signature"></span>listMembers<span class="signature">(gid)</span><span class="type-signature"> &rarr; {string}</span></h4>
     
 
     
-    <p class="summary"><p>Fonction qui retrouve la liste des membres d'un binet sur le LDAP</p></p>
+    <p class="summary"><p>Fonction qui interroge le LDAP et retrouve la liste des membres d'un groupe.</p></p>
     
 
 
 
 <div class="description">
-    <p>TBM</p>
+    <p>Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listMembers(uid).then((res) =&gt; { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).</p>
 </div>
 
 
@@ -606,7 +610,7 @@
 
         <tr>
             
-                <td class="name"><code>uid</code></td>
+                <td class="name"><code>gid</code></td>
             
 
             <td class="type">
@@ -622,7 +626,7 @@
 
             
 
-            <td class="description last"><p>Identifiant du groupe à interrogeant (pour des raisons d'identification)</p></td>
+            <td class="description last"><p>Identifiant du groupe à interroger</p></td>
         </tr>
 
     
@@ -663,7 +667,7 @@
     
     <dt class="tag-source">Source:</dt>
     <dd class="tag-source"><ul class="dummy"><li>
-        <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line38">line 38</a>
+        <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line51">line 51</a>
     </li></ul></dd>
     
 
@@ -690,7 +694,7 @@
 
         
 <div class="param-desc">
-    <p>Liste des uid de groupes où l'id fournie est membre (noms flat des groupes)</p>
+    <p>Liste des uid des membres où l'id fournie est membre (noms flat des groupes)</p>
 </div>
 
 
@@ -714,6 +718,441 @@
 
 
         
+            
+
+    
+
+    
+    <h4 class="name" id="TOL"><span class="type-signature"></span>TOL<span class="signature">(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12)</span><span class="type-signature"> &rarr; {Array.&lt;string>}</span></h4>
+    
+
+    
+    <p class="summary"><p>Fonction qui interroge le LDAP et retrouve les paxs validant les critères de recherche.</p></p>
+    
+
+
+
+<div class="description">
+    <p>Accepte des champs incomplets mais pas approximatifs et ne gère pas l'auto-complete. Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma TOL(uid).then((res) =&gt; { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma généré à la volée à partir de config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).</p>
+</div>
+
+
+
+
+
+
+
+
+
+    <h5>Parameters:</h5>
+    
+
+<table class="params">
+    <thead>
+    <tr>
+        
+        <th>Name</th>
+        
+
+        <th>Type</th>
+
+        
+
+        
+
+        <th class="last">Description</th>
+    </tr>
+    </thead>
+
+    <tbody>
+    
+
+        <tr>
+            
+                <td class="name"><code>c0</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Prénom</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c1</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Nom</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c2</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Surnom</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c3</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Nationalité</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c4</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Ecole ou université d'origine</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c5</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">int</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Promotion</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c6</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Groupe</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c7</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Cours</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c8</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Sport pratiqué</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c9</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">int</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Numéro de téléphone</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c10</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Adresse courriel</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c11</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Adresse physique</p></td>
+        </tr>
+
+    
+
+        <tr>
+            
+                <td class="name"><code>c12</code></td>
+            
+
+            <td class="type">
+            
+                
+<span class="param-type">string</span>
+
+
+            
+            </td>
+
+            
+
+            
+
+            <td class="description last"><p>Adresse ip</p></td>
+        </tr>
+
+    
+    </tbody>
+</table>
+
+
+
+
+
+
+<dl class="details">
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    <dt class="tag-source">Source:</dt>
+    <dd class="tag-source"><ul class="dummy"><li>
+        <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line84">line 84</a>
+    </li></ul></dd>
+    
+
+    
+
+    
+
+    
+</dl>
+
+
+
+
+
+
+
+
+
+
+
+
+
+<h5>Returns:</h5>
+
+        
+<div class="param-desc">
+    <p>Informations recueillies ; plusieurs fois une liste sur le format ci-dessus pour tous les résultats correspondants plus une photo en byttestring et date de naissance.</p>
+</div>
+
+
+
+<dl>
+    <dt>
+        Type
+    </dt>
+    <dd>
+        
+<span class="param-type">Array.&lt;string></span>
+
+
+    </dd>
+</dl>
+
+    
+
+
+
+
+
+        
     
 
     
@@ -729,17 +1168,13 @@
 </div>
 
 <nav>
-    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul>
+    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul>
 </nav>
 
 <br class="clear">
 
 <footer>
-<<<<<<< HEAD
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid)
-=======
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time)
->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36
+    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid)
 </footer>
 
 <script> prettyPrint(); </script>
diff --git a/doc/index.html b/doc/index.html
index 60b4594156aa513e4d4661d48aab0917194506a6..04bfcdb11193051b2a612e887d90d4c0aabce777 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -44,7 +44,7 @@
 
     <section>
         <article><p><a href="https://gitlab.binets.fr/br/sigma-backend/commits/master"><img src="https://gitlab.binets.fr/br/sigma-backend/badges/master/pipeline.svg" alt="pipeline status"></a></p>
-<h1>Backend Sigma</h1><p>Ce dépôt contient le <em>backend</em> de Sigma, le successeur de Frankiz.</p>
+<h2>Introduction</h2><p>Ce dépôt contient le <em>backend</em> de Sigma, le successeur de Frankiz, un site étudiant permettant de gérer les groupes et les étudiants du plateau de Saclay.</p>
 <p>Pour obtenir une copie de ce dépôt, clonez-le avec</p>
 <pre class="prettyprint source"><code>git clone git@gitlab.binets.fr:br/sigma-backend.git</code></pre><p>ou <code>git clone https://gitlab.binets.fr/br/sigma-backend.git</code>, puis installez les dépendences JavaScript avec <code>npm install</code>.</p>
 <p>A terme, ce projet doit tourné sur un serveur de l'école polytechnique et fournir à un serveur front - au code séparé et documenté séparément - toute les données nécessaires à son bon fonctionnement (authentification, appartenance à un groupe, droits de visibilité...).</p>
@@ -59,35 +59,35 @@
 <pre class="prettyprint source lang-bash"><code>npm install -g knex
 npm install -g webpack
 npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont knex.js, notre outil de gestion de BDD locale, GraphQL qui sert à communiquer entre serveurs, ldap.js qui interroge le LDAP avec la plupart des données, webpack qui sert à la gestion du serveur. ESlint est un outil de vérification synthaxique.</p>
-<p>Le serveur utilisé est <a href="https://expressjs.com/">express.js</a> ; il est configuré dans <a href="./src/server.js"><code>server.js</code></a> puis lancé sur le port 8888 dans <a href="./src/index.js"><code>index.js</code></a>.</p>
+<p>Le serveur utilisé est <a href="https://expressjs.com/">express.js</a> ; il est configuré dans <a href="../src/server.js"><code>server.js</code></a> puis lancé sur le port 8888 dans <a href="../src/index.js"><code>index.js</code></a>.</p>
 <h2>Structure</h2><p>La structure générale du projet est détaillée ci-dessous ; pas d'inquiétude, la plupart des fichiers .js sont aussi extensivement documentés plus bas.</p>
 <ul>
 <li>Racine du projet : fichiers de configuration ;<ul>
 <li>config.json : données &quot;sensibles&quot; spécifique au projet à priori non partageable (adresse du LDAP, mots de passe),</li>
 <li>configfile_doc.json : JSDoc, l'outil de génération automatique de documentation,</li>
 <li>autres fichiers relatifs à des modules particuliers ou à la gestion de paquets,</li>
-<li><a href="./assets"><code>assets</code></a> : ressources ;<ul>
+<li><a href="../assets"><code>assets</code></a> : ressources ;<ul>
 <li>images et divers (dont l'essentiel flavicon)</li>
 </ul>
 </li>
-<li><a href="./build"><code>build</code></a> : dépendances gérées automatiquement ;<ul>
+<li><a href="../build"><code>build</code></a> : dépendances gérées automatiquement ;<ul>
 <li>bundle.js est un monstrueux fichier généré automatiquement qui gère nos dépendances.</li>
 </ul>
 </li>
-<li><a href="./db"><code>db</code></a> : base de donnée sigma ;<ul>
+<li><a href="../db"><code>db</code></a> : base de donnée sigma ;<ul>
 <li>knex_router.js charge la configuration précisée dans knexfile.js,</li>
-<li><a href="./db/migrations"><code>migrations</code></a> stocke l'ensemble des migrations knex ; c'est un équivalent d'un répertoire git pour la BDD sigma (du coup seulement les groupes pas les individus),</li>
-<li><a href="./db/seeds"><code>seeds</code></a> : stocke les éléments de générations des BDD ; c'est un ensemble de scripts.</li>
+<li><a href="../db/migrations"><code>migrations</code></a> stocke l'ensemble des migrations knex ; c'est un équivalent d'un répertoire git pour la BDD sigma (du coup seulement les groupes pas les individus),</li>
+<li><a href="../db/seeds"><code>seeds</code></a> : stocke les éléments de générations des BDD ; c'est un ensemble de scripts.</li>
 </ul>
 </li>
-<li><a href="./doc"><code>doc</code></a> : documentation ;<ul>
+<li><a href="."><code>doc</code></a> : documentation ;<ul>
 <li>ensemble de pages html et fichiers associés ; index.html permet de naviguer sereinement sur toute la doc JSDoc.</li>
 </ul>
 </li>
-<li><a href="./node_modules"><code>node_modules</code></a> : gestion automatique des modules.</li>
-<li><a href="./src"><code>src</code></a> : code source<ul>
-<li><a href="./src/admin_view"><code>admin_view</code></a> : gestion d'une interface administrateur de la base de donnée, s'appuie sur <em>css</em> et <em>views</em></li>
-<li><a href="./src/ldap"><code>ldap</code></a> : gestion des requêtes LDAP</li>
+<li><a href="../node_modules"><code>node_modules</code></a> : gestion automatique des modules.</li>
+<li><a href="../src"><code>src</code></a> : code source<ul>
+<li><a href="../src/admin_view"><code>admin_view</code></a> : gestion d'une interface administrateur de la base de donnée, s'appuie sur <em>css</em> et <em>views</em></li>
+<li><a href="../src/ldap"><code>ldap</code></a> : gestion des requêtes LDAP</li>
 </ul>
 </li>
 </ul>
@@ -127,11 +127,11 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont
 <li><code>knex seed:make filename</code> crée un <em>seed</em> <code>seeds/filename</code></li>
 <li><code>knex seed:run</code> insère les <em>seeds</em> dans la BDD</li>
 </ul>
-<p>Un fichier <em>seed</em> permet d'insérer des données dans la BDD. Ils sont stockés dans <a href="./db/seeds"><code>seeds</code></a>.</p>
+<p>Un fichier <em>seed</em> permet d'insérer des données dans la BDD. Ils sont stockés dans <a href="../db/seeds"><code>seeds</code></a>.</p>
 <h3>Fonctions LDAP</h3><p>On peut facilement explorer et modifier des éléments du LDAP de l'école depuis le réseau de l'X avec <a href="http://jxplorer.org/">JXplorer</a> en entrant <code>frankiz</code> dans nouvelle connexion et en allant dans <code>net</code>.</p>
-<h2>Scripts</h2><p>Les scripts sont des instructions en ligne de commande que l'on peut faire tourner avec la commande <code>npm run</code>. Ce sont des raccourcis pour gagner du temps sur des opérations un peu longues. Ils sont définis dans <a href="./package.json"><code>package.json</code></a>.</p>
+<h2>Scripts</h2><p>Les scripts sont des instructions en ligne de commande que l'on peut faire tourner avec la commande <code>npm run</code>. Ce sont des raccourcis pour gagner du temps sur des opérations un peu longues. Ils sont définis dans <a href="../package.json"><code>package.json</code></a>.</p>
 <p>Les plus importants sont détaillées ci-dessous (ne pas oublier <code>npm install</code> déjà mentionné plus tôt) :</p>
-<p>On utilisera Webpack pour transpiler le fichier source <a href="./src/index.js"><code>src/index.js</code></a> en <a href="./build/bundle.js"><code>build/bundle.js</code></a> qui est suit la syntaxe ES5 compatible Node. Pour ça, on utilise :</p>
+<p>On utilisera Webpack pour transpiler le fichier source <a href="../src/index.js"><code>src/index.js</code></a> en <a href="../build/bundle.js"><code>build/bundle.js</code></a> qui est suit la syntaxe ES5 compatible Node. Pour ça, on utilise :</p>
 <ul>
 <li><code>npm run build</code> qui exécute la commande <code>webpack</code> avec le fichier de configuration <code>webpack.config.js</code>, ou</li>
 <li><code>npm run watch</code> qui recompile automatiquement dès que le code est modifié.</li>
@@ -143,13 +143,12 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont
 </ul>
 <p>Donc, lancer <code>npm run watch</code> dans un terminal et <code>npm test</code> dans un autre permet de recompiler le serveur <strong>et</strong> le redémarrer automatiquement dès qu'il y a une modification.</p>
 <p>Le script pour faire tourner <a href="http://usejsdoc.org/index.html">JSDoc</a> et régénérrer la documentation est : <code>npm run doc</code> </p>
-<h2>Documentation</h2><p>La documentation détaillée du projet est <a href="./doc/index.html">ici</a>. Elle a été compilée avec <a href="http://usejsdoc.org/index.html">JSDoc</a> sous format hmtl selon le fichier de configuration <a href="./configfile_doc.json"><code>configfile_doc.json</code></a> à la racine du projet.</p>
-<p>Les fichiers compilés se situent dans <a href="./doc"><code>doc</code></a> avec leurs fichiers image. Par nature de l'outil JSDoc il est facile de documenter en détail des fonctions .js mais plus compliqué de documenter un fichier.</p>
+<h2>Documentation</h2><p>La documentation détaillée du projet est <a href="./doc/index.html">ici</a>. Elle a été compilée avec <a href="http://usejsdoc.org/index.html">JSDoc</a> sous format hmtl selon le fichier de configuration <a href="../configfile_doc.json"><code>configfile_doc.json</code></a> à la racine du projet.</p>
+<p>Les fichiers compilés se situent dans <a href="."><code>doc</code></a> avec leurs fichiers image. Par nature de l'outil JSDoc il est facile de documenter en détail des fonctions .js mais plus compliqué de documenter un fichier.</p>
+<p>A la fin de ce fichier JSDoc rajjoute les commentaires placés dans chacun des fichiers et des hyperliens pour y accéder.</p>
 <h2>Appendixes</h2><h3>ESLint</h3><p>On utilisera ESLint pour standardiser le code : un ensemble de règles de style pour le code sont appliquées, et quelques-unes d'entre elles sont dans le fichier <code>.eslintrc.json</code>. Pour l'instant, la config ESLint impose d'utiliser quatre espaces pour les indentations et d'utiliser des points-virgule en fin de ligne.</p>
-<p>Il est préférable de l'installer <strong>globalement</strong> avec</p>
-<p>   npm install -g eslint</p>
-<p>Pour faire valider les fichiers source par ESLint, utilisez</p>
-<pre class="prettyprint source"><code>npm run lint</code></pre><p>qui fait appel au script <code>eslint src/</code> défini dans le <a href="./package.json"><code>package.json</code></a>. L'option <code>--fix</code> permet de corriger les fichiers.</p>
+<p>Il est préférable de l'installer <strong>globalement</strong> avec <code>npm install -g eslint</code>. Pour faire valider les fichiers source par ESLint, utilisez <code>npm run lint</code>.</p>
+<p>qui fait appel au script <code>eslint src/</code> défini dans le <a href="../package.json"><code>package.json</code></a>. L'option <code>--fix</code> permet de corriger les fichiers.</p>
 <p>Sinon, si vous utilisez Atom ou Visual Studio Code pour éditer votre code, il existe des plugins qui font tourner ESLint en <em>live</em> sur le code et vérifient que tout est en ordre.</p>
 <p>Pour mieux comprendre ESLint, référez-vous à la <a href="https://eslint.org/docs/user-guide/getting-started">doc</a>.</p></article>
     </section>
@@ -368,8 +367,6 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont
     <div class="container-overview">
     
         
-            <div class="description"><p>Interface &quot;administrateur&quot; de l'acces aux BDD. S'appuie sur css et views.</p></div>
-        
 
         
 
@@ -554,7 +551,7 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont
     <div class="container-overview">
     
         
-            <div class="description"><p>ldap_auth</p></div>
+            <div class="description"><p>Ce fichier gère les authentifications avec le LDAP précisé dans config.json à l'aide de passport-ldapauth.</p></div>
         
 
         
@@ -582,106 +579,12 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont
     <dt class="tag-author">Author:</dt>
     <dd class="tag-author">
         <ul>
-            <li>Wangounet</li>
+            <li>Wang</li>
         </ul>
     </dd>
     
 
     
-
-    
-
-    
-
-    
-    <dt class="tag-source">Source:</dt>
-    <dd class="tag-source"><ul class="dummy"><li>
-<<<<<<< HEAD
-        <a href="src_ldap_ldap_auth.js.html">src/ldap/ldap_auth.js</a>, <a href="src_ldap_ldap_auth.js.html#line11">line 11</a>
-    </li></ul></dd>
-    
-
-    
-
-    
-
-    
-</dl>
-
-
-        
-    
-    </div>
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-</article>
-
-</section>
-
-
-
-
-
-
-
-<section>
-
-<header>
-    
-        <h2>src/ldap/ldap_auth.js</h2>
-        
-    
-</header>
-
-<article>
-    <div class="container-overview">
-    
-        
-            <div class="description"><p>ldap_auth</p></div>
-        
-
-        
-
-
-<dl class="details">
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
-
-    
 
     
 
@@ -691,9 +594,6 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont
     <dt class="tag-source">Source:</dt>
     <dd class="tag-source"><ul class="dummy"><li>
         <a href="src_ldap_ldap_auth.js.html">src/ldap/ldap_auth.js</a>, <a href="src_ldap_ldap_auth.js.html#line1">line 1</a>
-=======
-        <a href="src_ldap_auth_ldap_auth.js.html">src/ldap_auth/ldap_auth.js</a>, <a href="src_ldap_auth_ldap_auth.js.html#line1">line 1</a>
->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36
     </li></ul></dd>
     
 
@@ -751,7 +651,7 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont
     <div class="container-overview">
     
         
-            <div class="description"><p>Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu, liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification.</p></div>
+            <div class="description"><p>Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu=&quot;&quot;, liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification.</p></div>
         
 
         
@@ -886,7 +786,7 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont
     
     <dt class="tag-source">Source:</dt>
     <dd class="tag-source"><ul class="dummy"><li>
-        <a href="src_server.js.html">src/server.js</a>, <a href="src_server.js.html#line11">line 11</a>
+        <a href="src_server.js.html">src/server.js</a>, <a href="src_server.js.html#line1">line 1</a>
     </li></ul></dd>
     
 
@@ -931,17 +831,13 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont
 </div>
 
 <nav>
-    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul>
+    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul>
 </nav>
 
 <br class="clear">
 
 <footer>
-<<<<<<< HEAD
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid)
-=======
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time)
->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36
+    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid)
 </footer>
 
 <script> prettyPrint(); </script>
diff --git a/doc/knexfile.js.html b/doc/knexfile.js.html
index 3eff8aab5c3ca514cec6e78032086a6e019aaaa4..cf39b23a7abd36b8c8f646a25e12d169a1bf256b 100644
--- a/doc/knexfile.js.html
+++ b/doc/knexfile.js.html
@@ -66,17 +66,13 @@ module.exports = {
 </div>
 
 <nav>
-    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul>
+    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul>
 </nav>
 
 <br class="clear">
 
 <footer>
-<<<<<<< HEAD
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid)
-=======
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time)
->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36
+    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid)
 </footer>
 
 <script> prettyPrint(); </script>
diff --git a/doc/src_admin_view_admin_router.js.html b/doc/src_admin_view_admin_router.js.html
index e7e3c34e28a13139b3a282a8ed4f4c9243ce7859..eca8b450a1341f19524253ed11b160e7d7286173 100644
--- a/doc/src_admin_view_admin_router.js.html
+++ b/doc/src_admin_view_admin_router.js.html
@@ -27,12 +27,12 @@
     <section>
         <article>
             <pre class="prettyprint source linenums"><code>/**
- * @file Interface "administrateur" de l'acces aux BDD. S'appuie sur css et views.
+ * @file
  */
-
 import express from 'express';
 import knex from '../../db/knex_router';
 import passport from 'passport';
+import { ensureLoggedIn } from 'connect-ensure-login';
 
 const router = express.Router();
 
@@ -40,25 +40,30 @@ let port = process.env.PORT || 3000;
 
 router.get('/', function (req, res) {
     console.log('Connecting to ' + req.url);
-    res.render('login', { title: 'Login', port: port });
+    req.flash('failureFlash', 'Invalid username or password.');
+    res.render('login', { title: 'Login', port: port, 
+        errorMessage: req.flash('error') });
 });
 
-router.get('/admin', function (req, res) {
-    console.log('Connecting to ' + req.url);
-    res.render('home', { title: 'Home', port: port });
-});
+router.get('/admin',
+    ensureLoggedIn('/'),
+    function (req, res) {
+        console.log('Connecting to ' + req.url);
+        res.render('home', { title: 'Home', port: port });
+    });
 
-router.post('/loginAttempt'
-    , passport.authenticate('ldapauth', {
-        //successRedirect: '/admin',
+router.post('/login', 
+    passport.authenticate('ldapauth', {
+        successRedirect: '/admin',
         failureRedirect: '/',
-        //failureFlash: true
-        //failureFlas: 'Invalid username or password.' //TODO: test this. ce message s'affiche-t-il tout seul ou faut-il aller le chercher quand on genere login.pug?
-    })
-    // on a commente les deux lignes dessus et on a besoin de faire un callback apres le passport.authenticate car
+        failureFlash: true
+    }),
+    // on a besoin de faire un callback apres le passport.authenticate car
     // on souhaite garde l'information user.dn et body.password qq part.
     // TODO: essayer de garder ces informations plus proprement...
-    , function (req, res) {
+    // EDIT: en fait apparemment on a pas besoin de ces informations du tout
+    /*
+    function (req, res) {
         req.session.dn = req.user.dn;
         req.session.password = req.body.password;
 
@@ -68,10 +73,11 @@ router.post('/loginAttempt'
             res.redirect("/admin");
         }
     }
+    */
 
 );
 
-router.get('/logout', function (req, res) {
+router.post('/logout', function (req, res) {
     req.logout();
     res.redirect('/');
 });
@@ -150,17 +156,13 @@ export default router;
 </div>
 
 <nav>
-    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul>
+    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul>
 </nav>
 
 <br class="clear">
 
 <footer>
-<<<<<<< HEAD
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid)
-=======
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time)
->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36
+    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid)
 </footer>
 
 <script> prettyPrint(); </script>
diff --git a/doc/src_index.js.html b/doc/src_index.js.html
index adac30a53b537bfa9a0a955b2b27a9fd1b3d02d1..5678fe8cfd7d98bde0bd22b2fc4aa43fad66cf0e 100644
--- a/doc/src_index.js.html
+++ b/doc/src_index.js.html
@@ -29,14 +29,9 @@
             <pre class="prettyprint source linenums"><code>/**
  * @file Entry point de webpack
  */
-
 import server from './server';
 import colors from 'colors';
-
-import { graphqlExpress, graphiqlExpress } from 'graphql-server-express';
-import makeExecutableSchema from 'graphql-tools';
-
-import setupLdapAuth from './ldap_auth/ldap_auth';
+import setupLdapAuth from './ldap/ldap_auth.js';
 import router from './admin_view/admin_router';
 
 // setting up ldap authentication
@@ -60,17 +55,13 @@ server.listen(port, () => {
 </div>
 
 <nav>
-    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul>
+    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul>
 </nav>
 
 <br class="clear">
 
 <footer>
-<<<<<<< HEAD
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid)
-=======
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time)
->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36
+    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid)
 </footer>
 
 <script> prettyPrint(); </script>
diff --git a/doc/src_ldap_ldap_auth.js.html b/doc/src_ldap_ldap_auth.js.html
index de89ecac68e0945e82b2fa63a9e9171916dda2ce..4feb25815829ca6c8898bf76a78f3059cef28989 100644
--- a/doc/src_ldap_ldap_auth.js.html
+++ b/doc/src_ldap_ldap_auth.js.html
@@ -27,31 +27,28 @@
     <section>
         <article>
             <pre class="prettyprint source linenums"><code>/**
- * @file ldap_auth
- * @summary Setup de l'auth ldap avec passport-ldapauth
+ * @file Ce fichier gère les authentifications avec le LDAP précisé dans config.json à l'aide de passport-ldapauth.
+ * @author Wang
  */
-
 import passport from 'passport';
 import LdapStrategy from 'passport-ldapauth';
 import session from 'express-session';
 import fs from 'fs';
 
-/**
- * @file Ce fichier gère les authentifications avec le LDAP précisé dans config.json.
- * @author Wangounet
- */
+let config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
+
+passport.use(new LdapStrategy({
+    server: {
+        url: config.ldap.server,
+        searchBase: config.ldap.searchBase,
+        searchFilter: config.ldap.searchFilter
+    }
+}
+));
 
 function setupLdapAuth(server) {
-    var config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
     
-    passport.use(new LdapStrategy({
-        server: {
-            url: config.ldap.server,
-            searchBase: config.ldap.searchBase,
-            searchFilter: config.ldap.searchFilter
-        }
-    }));
-
+    // Define new login strategy
     server.use(session({ 
         secret: config.sessionSecret,
         //store: a modifier avant de lancer en prod
@@ -85,13 +82,13 @@ export default setupLdapAuth;
 </div>
 
 <nav>
-    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul>
+    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul>
 </nav>
 
 <br class="clear">
 
 <footer>
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid)
+    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid)
 </footer>
 
 <script> prettyPrint(); </script>
diff --git a/doc/src_ldap_ldap_data.js.html b/doc/src_ldap_ldap_data.js.html
index 0b0265d5164e9c8edc965b1358328ac5c35353ae..943d24f7871cec923247001766e28d734bfbb0f9 100644
--- a/doc/src_ldap_ldap_data.js.html
+++ b/doc/src_ldap_ldap_data.js.html
@@ -27,26 +27,39 @@
     <section>
         <article>
             <pre class="prettyprint source linenums"><code>/**
- * @file Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu, liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification.
+ * @file Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu="", liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification.
  * @author hawkspar
 */
 
-var ensureLoggedin =  require('connect-ensure-login').ensureLoggedIn;
-var ldapescape = require("ldap-escape");
+/* Ne pas hésiter à repasser en synthaxe ES5... Plus simple pour tester en solo avec node directement
+import ldap  from 'ldapjs';
+import fs from 'fs';
+import ldapEscape from 'ldap-escape'; */
+
 var ldap = require('ldapjs');
+var fs = require('fs');
+var ldapEscape = require('ldap-escape');
+
+// Important ; permet de vérifier que l'utilisateur reste connecté.
+var ensureLoggedin =  require('connect-ensure-login').ensureLoggedIn;
 
-var client = ldap.createClient({ url: "ldap://frankiz.eleves.polytechnique.fr", timeout: 10000, idleTimeout: 10000});
+// Point central ; tous les champs de la BDD sont 'cachés' dans config.json et pas visibles directement
+let config = JSON.parse(fs.readFileSync('../../config.json', 'utf8'));
+
+// Connection au serveur LDAP avec des temps de timeout arbitraires
+var client = ldap.createClient({ url: config.ldap.server, timeout: 10000, idleTimeout: 10000});
 
 /**
- * @summary Fonction qui retrouve les groupes du LDAP dont un individu est membre (pas de bind nécessaire)
+ * @summary Fonction qui interroge le LDAP et retrouve les groupes dont un individu est membre.
+ * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listGroups(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).
  * @arg {int} uid - Identifiant de l'individu à interroger
- * @return {string} Liste des uid de groupes (noms flat des groupes) où l'id fourni
+ * @return {string} Liste des uid de groupes (noms flat des groupes) où l'id fourni est membre
  */
 function listGroups(uid) {
     return new Promise(function(resolve, reject) {
         var groupsList=[];
         
-        client.search("ou=groups,dc=frankiz,dc=net", {scope: "sub", attributes: "uid", filter: ldapescape.filter("(restrictedMemberUid=${id})", {id: uid})}, function(err, res) {
+        client.search(config.ldap_data_gl.searchBase, {scope: "sub", attributes: "uid", filter: ldapEscape.filter(config.ldap_data_gl.searchFilter, {id: uid})}, function(err, res) {
             if (err) {
                 reject(err);
             } else {
@@ -58,30 +71,85 @@ function listGroups(uid) {
 }
  
 /**
- * TBM
- * @summary Fonction qui retrouve la liste des membres d'un binet sur le LDAP
- * @arg {int} uid - Identifiant du groupe à interrogeant (pour des raisons d'identification)
- * @return {string} Liste des uid de groupes où l'id fournie est membre (noms flat des groupes)
+ * @summary Fonction qui interroge le LDAP et retrouve la liste des membres d'un groupe.
+ * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listMembers(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).
+ * @arg {int} gid - Identifiant du groupe à interroger
+ * @return {string} Liste des uid des membres où l'id fournie est membre (noms flat des groupes)
  */
-function listMembers(uid) {
-    client.bind("uid=${uid},ou=eleves,dc=frankiz,dc=net", (err) => { console.log(err); });
-    
+function listMembers(gid) {
     return new Promise(function(resolve, reject) {
-        var groupsList=[];
+        var membersList=[];
         
-        client.search("ou=groups,dc=frankiz,dc=net", {scope: "sub", attributes: "uid", filter: ldapescape.filter("(restrictedMemberUid=${id})", {id: uid})}, function(err, res) {
+        client.search(config.ldap_data_ml.searchBase="", {scope: "sub", attributes: "uid", filter: ldapEscape.filter(config.ldap_data_ml.searchFilter, {id: gid})}, function(err, res) {
             if (err) {
                 reject(err);
             } else {
-                res.on('searchEntry', function(entry) { groupsList.push(entry.object.uid); });
-                res.on('end', function(res) { resolve(groupsList); });
+                res.on('searchEntry', function(entry) { membersList.push(entry.object.uid); });
+                res.on('end', function(res) { resolve(membersList); });
+            }
+        });
+    });
+}
+ 
+/**
+ * @summary Fonction qui interroge le LDAP et retrouve les paxs validant les critères de recherche.
+ * @desc Accepte des champs incomplets mais pas approximatifs et ne gère pas l'auto-complete. Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma TOL(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma généré à la volée à partir de config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).
+ * @arg {string} c0 - Prénom
+ * @arg {string} c1 - Nom
+ * @arg {string} c2 - Surnom
+ * @arg {string} c3 - Nationalité
+ * @arg {string} c4 - Ecole ou université d'origine
+ * @arg {int} c5 - Promotion
+ * @arg {string} c6 - Groupe
+ * @arg {string} c7 - Cours
+ * @arg {string} c8 - Sport pratiqué
+ * @arg {int} c9 - Numéro de téléphone
+ * @arg {string} c10 - Adresse courriel
+ * @arg {string} c11 - Adresse physique
+ * @arg {string} c12 - Adresse ip
+ * @return {string[]} Informations recueillies ; plusieurs fois une liste sur le format ci-dessus pour tous les résultats correspondants plus une photo en byttestring et date de naissance.
+ */
+function TOL(c0="", c1="", c2="", c3="", c4="", c5="", c6="", c7="", c8="", c9="", c10="", c11="", c12="") {
+    return new Promise(function(resolve, reject) {
+        var candidatesList=[];
+
+        var filter="";
+        var dic={};
+
+        config.ldap_data_tol.searchFilterAttributes.forEach((element, index, list) => {
+            if (eval("c"+index.toString()) != '') {
+                filter="(&amp;"+filter+"(|("+element+"=*${app_"+element+index+"})"+
+                                "(|("+element+"=${app_"+element+index+"})"+
+                                "(|("+element+"=*${app_"+element+index+"}*)"+
+                                    "("+element+"=${app_"+element+index+"}*)))))";
+                dic["app_"+element+index]=eval("c"+index.toString());
+            }
+        });
+
+        client.search(config.ldap_data_tol.searchBase, {scope: "sub", attributes: config.ldap_data_tol.searchAttributes, filter: ldapEscape.filter(filter, dic)}, function(err, res) {
+            if (err) {
+                reject(err);
+            } else {
+                res.on('searchEntry', function(entry) {
+                    for (var i=0; i&lt;config.ldap_data_tol.searchAttributes.length; i++) {
+                        // Complicated, but hides searchAttributes
+                        eval("candidatesList.push(entry.object."+config.ldap_data_tol.searchAttributes[i]+")");
+                    }
+                });
+                res.on('end', function(res) { resolve(candidatesList); });
             }
         });
     });
 }
 
 // Synthaxe d'utilisation
-listGroups("quentin.chevalier","Ie42fds'eaJm1").then((grList) => { console.log(grList); });</code></pre>
+//listGroups("quentin.louis").then((meList) => { console.log(meList); });
+TOL("","","","","","","faerix","","","","","","").then((meList) => { console.log(meList); });
+
+/* Partage pour le reste du monde ; même remarque synthaxe  
+export { listGroups, listMembers, TOL }; */
+
+module.exports ={ listGroups, listMembers, TOL };</code></pre>
         </article>
     </section>
 
@@ -91,13 +159,13 @@ listGroups("quentin.chevalier","Ie42fds'eaJm1").then((grList) => { console.log(g
 </div>
 
 <nav>
-    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul>
+    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul>
 </nav>
 
 <br class="clear">
 
 <footer>
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid)
+    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid)
 </footer>
 
 <script> prettyPrint(); </script>
diff --git a/doc/src_server.js.html b/doc/src_server.js.html
index d55747f36337aac154ca31d3fbc49a3f11e9e111..e4aac1742a2d0300fcc6081c9c727dda328c4138 100644
--- a/doc/src_server.js.html
+++ b/doc/src_server.js.html
@@ -26,19 +26,17 @@
     
     <section>
         <article>
-            <pre class="prettyprint source linenums"><code>import express from 'express';
+            <pre class="prettyprint source linenums"><code>/** 
+ * @file Cree le serveur express avec tous les middleware qui vont bien
+*/
+import express from 'express';
 import bodyParser from 'body-parser';
 import favicon from 'serve-favicon';
 import morgan from 'morgan';
-import knex from '../db/knex_router';
 import path from 'path';
-import ldap_auth from './ldap_auth/ldap_auth';
+import schema from './graphql/schema';
 import { graphqlExpress, graphiqlExpress } from 'graphql-server-express';
-import { makeExecutableSchema } from 'graphql-tools';
-
-/** 
- * @file Cree le serveur express avec tous les middleware qui vont bien
-*/
+import flash from 'connect-flash';
 
 const server = express();
 
@@ -60,41 +58,14 @@ server.use(favicon(path.resolve('./','assets','favicon.ico')));
 // Morgan is middleware for logging requests
 server.use(morgan('dev'));
 
-// setting up ldap authentication
-ldap_auth(server);
-
-const typeDefs = `
-    type Query {
-        groups: [Group]
-    }
-
-    type Group {
-        name: String!
-        id: ID!
-        website: String
-        updatedAt: String!
-        description: String
-        school: String!
-    }
-`;
-
-const resolvers = {
-    Query: {
-        groups: () => knex.select().from('groups')
-    }
-};
-
-const schema = makeExecutableSchema({
-    typeDefs,
-    resolvers
-});
-
 // Charge le middleware express pour GraphQL
 server.use('/graphql', bodyParser.json(), graphqlExpress({schema}));
 
 // GraphiQL est une console interactive pour faire des requêtes au schéma GraphQL
 server.use('/graphiql', graphiqlExpress({ endpointURL: '/graphql'}));
 
+// connect-flash is middleware for flashing messages
+server.use(flash());
 
 export default server;
 </code></pre>
@@ -107,17 +78,13 @@ export default server;
 </div>
 
 <nav>
-    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul>
+    <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul>
 </nav>
 
 <br class="clear">
 
 <footer>
-<<<<<<< HEAD
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid)
-=======
-    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time)
->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36
+    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid)
 </footer>
 
 <script> prettyPrint(); </script>
diff --git a/package-lock.json b/package-lock.json
index 619815b76bdc7a1cadab47f1a379f223c02f03cb..a3573454acae693429fbcc9a3230bfb7127bfc4a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,7 +20,7 @@
     "@types/body-parser": {
       "version": "1.16.8",
       "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz",
-      "integrity": "sha1-aH7DQUBiSjvsKxqOqSaEeK6PO+M=",
+      "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==",
       "requires": {
         "@types/express": "4.11.1",
         "@types/node": "9.4.6"
@@ -29,12 +29,12 @@
     "@types/events": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
-      "integrity": "sha1-k7G+kfY8GERQOFJyxHtklv0CjgI="
+      "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw=="
     },
     "@types/express": {
       "version": "4.11.1",
       "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.1.tgz",
-      "integrity": "sha1-+ZZjs6sy0EyxHbYS713Xkz91Rls=",
+      "integrity": "sha512-ttWle8cnPA5rAelauSWeWJimtY2RsUf2aspYZs7xPHiWgOlPn6nnUfBMtrkcnjFJuIHJF4gNOdVvpLK2Zmvh6g==",
       "requires": {
         "@types/body-parser": "1.16.8",
         "@types/express-serve-static-core": "4.11.1",
@@ -44,7 +44,7 @@
     "@types/express-serve-static-core": {
       "version": "4.11.1",
       "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz",
-      "integrity": "sha1-9vchI4LVmxnWlmd7yqSKNygPXUU=",
+      "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==",
       "requires": {
         "@types/events": "1.1.0",
         "@types/node": "9.4.6"
@@ -62,12 +62,12 @@
     "@types/mime": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz",
-      "integrity": "sha1-WnMG42fFObn2VDSZ3o3VGfrDeos="
+      "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA=="
     },
     "@types/node": {
       "version": "9.4.6",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
-      "integrity": "sha1-2Bdthk7kh1PQU3g+TkY67Ia42C4="
+      "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ=="
     },
     "@types/passport": {
       "version": "0.3.5",
@@ -80,7 +80,7 @@
     "@types/serve-static": {
       "version": "1.13.1",
       "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.1.tgz",
-      "integrity": "sha1-HSgB+mNdJ0zZfU7AfiayG0QSdJI=",
+      "integrity": "sha512-jDMH+3BQPtvqZVIcsH700Dfi8Q3MIcEx16g/VdxjoqiGR/NntekB10xdBpirMKnPe9z2C5cBmL0vte0YttOr3Q==",
       "requires": {
         "@types/express-serve-static-core": "4.11.1",
         "@types/mime": "2.0.0"
@@ -89,7 +89,7 @@
     "abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
       "dev": true
     },
     "accepts": {
@@ -104,7 +104,7 @@
     "acorn": {
       "version": "5.4.1",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz",
-      "integrity": "sha1-/cWNnRf0pOmNEC3tgmqbl1kSUQI="
+      "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ=="
     },
     "acorn-dynamic-import": {
       "version": "2.0.2",
@@ -208,7 +208,7 @@
     "ansi-escapes": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz",
-      "integrity": "sha1-7D6LTp+AZPwCw6ybZfHCdb2o75I=",
+      "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==",
       "dev": true
     },
     "ansi-regex": {
@@ -219,7 +219,7 @@
     "ansi-styles": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
-      "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=",
+      "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
       "requires": {
         "color-convert": "1.9.1"
       }
@@ -227,7 +227,7 @@
     "anymatch": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
       "dev": true,
       "requires": {
         "micromatch": "3.1.8",
@@ -292,7 +292,7 @@
     "argparse": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
       "dev": true,
       "requires": {
         "sprintf-js": "1.0.3"
@@ -306,7 +306,7 @@
     "arr-flatten": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE="
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
     },
     "arr-union": {
       "version": "3.1.0",
@@ -326,7 +326,7 @@
     "array-slice": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
-      "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ="
+      "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w=="
     },
     "array-union": {
       "version": "1.0.2",
@@ -367,7 +367,7 @@
     "asn1.js": {
       "version": "4.10.1",
       "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
-      "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
       "requires": {
         "bn.js": "4.11.8",
         "inherits": "2.0.3",
@@ -395,7 +395,7 @@
     "async": {
       "version": "2.6.0",
       "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
-      "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=",
+      "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
       "requires": {
         "lodash": "4.17.5"
       }
@@ -505,7 +505,7 @@
     "base": {
       "version": "0.11.2",
       "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
       "requires": {
         "cache-base": "1.0.1",
         "class-utils": "0.3.6",
@@ -529,7 +529,7 @@
     "base64-js": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz",
-      "integrity": "sha1-+xNmgjPZYUz1+0vOlam6QJbN+AE="
+      "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w=="
     },
     "basic-auth": {
       "version": "2.0.0",
@@ -547,7 +547,7 @@
     "big.js": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
-      "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4="
+      "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q=="
     },
     "binary-extensions": {
       "version": "1.11.0",
@@ -557,12 +557,12 @@
     "bluebird": {
       "version": "3.5.1",
       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
-      "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk="
+      "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
     },
     "bn.js": {
       "version": "4.11.8",
       "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
-      "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8="
+      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
     },
     "body-parser": {
       "version": "1.18.2",
@@ -584,7 +584,7 @@
     "boxen": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
-      "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=",
+      "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
       "dev": true,
       "requires": {
         "ansi-align": "2.0.0",
@@ -599,7 +599,7 @@
     "brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "requires": {
         "balanced-match": "1.0.0",
         "concat-map": "0.0.1"
@@ -608,7 +608,7 @@
     "braces": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz",
-      "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=",
+      "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==",
       "requires": {
         "arr-flatten": "1.1.0",
         "array-unique": "0.3.2",
@@ -650,7 +650,7 @@
     "browserify-aes": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz",
-      "integrity": "sha1-OLerVe24Bv8tzaGn8WIHc6R3xJ8=",
+      "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==",
       "requires": {
         "buffer-xor": "1.0.3",
         "cipher-base": "1.0.4",
@@ -706,7 +706,7 @@
     "browserify-zlib": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
-      "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
       "requires": {
         "pako": "1.0.6"
       }
@@ -760,7 +760,7 @@
     "cache-base": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
       "requires": {
         "collection-visit": "1.0.0",
         "component-emitter": "1.2.1",
@@ -852,7 +852,7 @@
     "chokidar": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz",
-      "integrity": "sha1-TcZROe6ycUl3c1tqNdBul7SU39c=",
+      "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==",
       "dev": true,
       "requires": {
         "anymatch": "2.0.0",
@@ -872,7 +872,7 @@
     "cipher-base": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
-      "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
       "requires": {
         "inherits": "2.0.3",
         "safe-buffer": "5.1.1"
@@ -881,13 +881,13 @@
     "circular-json": {
       "version": "0.3.3",
       "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
-      "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=",
+      "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
       "dev": true
     },
     "class-utils": {
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
       "requires": {
         "arr-union": "3.1.0",
         "define-property": "0.2.5",
@@ -942,7 +942,7 @@
         "is-descriptor": {
           "version": "0.1.6",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "requires": {
             "is-accessor-descriptor": "0.1.6",
             "is-data-descriptor": "0.1.4",
@@ -952,7 +952,7 @@
         "kind-of": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0="
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
         }
       }
     },
@@ -1044,7 +1044,7 @@
     "color-convert": {
       "version": "1.9.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
-      "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=",
+      "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
       "requires": {
         "color-name": "1.1.3"
       }
@@ -1062,7 +1062,7 @@
     "commander": {
       "version": "2.14.1",
       "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
-      "integrity": "sha1-IjUSPjevjKPGXfRbAm29NXsBuao="
+      "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
     },
     "component-emitter": {
       "version": "1.2.1",
@@ -1088,7 +1088,7 @@
     "configstore": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz",
-      "integrity": "sha1-CU7mYquD+tmRdnjeEU+q6o/NypA=",
+      "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==",
       "dev": true,
       "requires": {
         "dot-prop": "4.2.0",
@@ -1154,7 +1154,7 @@
     "content-type": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js="
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
     },
     "cookie": {
       "version": "0.3.1",
@@ -1241,7 +1241,7 @@
     "crypto-browserify": {
       "version": "3.12.0",
       "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
-      "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
       "requires": {
         "browserify-cipher": "1.0.0",
         "browserify-sign": "4.0.4",
@@ -1286,7 +1286,7 @@
     "debug": {
       "version": "2.6.9",
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "requires": {
         "ms": "2.0.0"
       }
@@ -1316,7 +1316,7 @@
     "define-property": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
       "requires": {
         "is-descriptor": "1.0.2",
         "isobject": "3.0.1"
@@ -1387,7 +1387,7 @@
     "doctrine": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-      "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
       "dev": true,
       "requires": {
         "esutils": "2.0.2"
@@ -1401,12 +1401,12 @@
     "domain-browser": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-      "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto="
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
     },
     "dot-prop": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
-      "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=",
+      "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
       "dev": true,
       "requires": {
         "is-obj": "1.0.1"
@@ -1476,7 +1476,7 @@
     "errno": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
-      "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=",
+      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
       "requires": {
         "prr": "1.0.1"
       }
@@ -1492,7 +1492,7 @@
     "es5-ext": {
       "version": "0.10.39",
       "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.39.tgz",
-      "integrity": "sha1-/KIbZ1WSd8pKwaHtcEixB7b3bYc=",
+      "integrity": "sha512-AlaXZhPHl0po/uxMx1tyrlt1O86M6D5iVaDH8UgLfgek4kXTX6vzsRfJQWC2Ku+aG8pkw1XWzh9eTkwfVrsD5g==",
       "requires": {
         "es6-iterator": "2.0.3",
         "es6-symbol": "3.1.1"
@@ -1577,7 +1577,7 @@
     "eslint": {
       "version": "4.18.1",
       "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.1.tgz",
-      "integrity": "sha1-uROEQMsemLL0Sg1XjG7Pjq5hULA=",
+      "integrity": "sha512-gPSfpSRCHre1GLxGmO68tZNxOlL2y7xBd95VcLD+Eo4S2js31YoMum3CAQIOaxY24hqYOMksMvW38xuuWKQTgw==",
       "dev": true,
       "requires": {
         "ajv": "5.5.2",
@@ -1622,7 +1622,7 @@
         "debug": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
           "dev": true,
           "requires": {
             "ms": "2.0.0"
@@ -1633,13 +1633,13 @@
     "eslint-config-standard": {
       "version": "11.0.0",
       "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz",
-      "integrity": "sha1-h+4NPJ2VOC3HYZWMuyPanuox4Lo=",
+      "integrity": "sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==",
       "dev": true
     },
     "eslint-import-resolver-node": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
-      "integrity": "sha1-WPFfuDm40FdsqYBBNHaqskcttmo=",
+      "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
       "dev": true,
       "requires": {
         "debug": "2.6.9",
@@ -1649,7 +1649,7 @@
     "eslint-module-utils": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz",
-      "integrity": "sha1-q67IJBd2E7ipWymWOeG2+s9HNEk=",
+      "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==",
       "dev": true,
       "requires": {
         "debug": "2.6.9",
@@ -1689,7 +1689,7 @@
     "eslint-plugin-node": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz",
-      "integrity": "sha1-vxlkIpgGQ3kxXXpLKnWTc3b6BeQ=",
+      "integrity": "sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw==",
       "dev": true,
       "requires": {
         "ignore": "3.3.7",
@@ -1701,7 +1701,7 @@
     "eslint-plugin-promise": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz",
-      "integrity": "sha1-VLdljI9FSBPcKocK/4FS7ElpunU=",
+      "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==",
       "dev": true
     },
     "eslint-plugin-standard": {
@@ -1723,13 +1723,13 @@
     "eslint-visitor-keys": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
-      "integrity": "sha1-PzGA+y4pEBdxastMnW1bXDSmqB0=",
+      "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
       "dev": true
     },
     "espree": {
       "version": "3.5.3",
       "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz",
-      "integrity": "sha1-kx4K9k5/u+0msFCinarR/GR5n6Y=",
+      "integrity": "sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ==",
       "dev": true,
       "requires": {
         "acorn": "5.4.1",
@@ -1739,7 +1739,7 @@
     "esprima": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
-      "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=",
+      "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
       "dev": true
     },
     "esquery": {
@@ -1807,7 +1807,7 @@
     "evp_bytestokey": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
-      "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
       "requires": {
         "md5.js": "1.3.4",
         "safe-buffer": "5.1.1"
@@ -1896,7 +1896,7 @@
         "is-descriptor": {
           "version": "0.1.6",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "requires": {
             "is-accessor-descriptor": "0.1.6",
             "is-data-descriptor": "0.1.4",
@@ -1906,7 +1906,7 @@
         "kind-of": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0="
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
         }
       }
     },
@@ -2004,7 +2004,7 @@
         "setprototypeof": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
-          "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY="
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
         },
         "statuses": {
           "version": "1.3.1",
@@ -2046,7 +2046,7 @@
         "is-extendable": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
           "requires": {
             "is-plain-object": "2.0.4"
           }
@@ -2056,7 +2056,7 @@
     "external-editor": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
-      "integrity": "sha1-PQJqIbf5W1cmOH1CAKwWDTcsO0g=",
+      "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
       "dev": true,
       "requires": {
         "chardet": "0.4.2",
@@ -2067,7 +2067,7 @@
     "extglob": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
       "requires": {
         "array-unique": "0.3.2",
         "define-property": "1.0.0",
@@ -3107,7 +3107,7 @@
     "function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0="
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
     },
     "functional-red-black-tree": {
       "version": "1.0.1",
@@ -3138,7 +3138,7 @@
     "glob": {
       "version": "7.1.2",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
-      "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
+      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
       "dev": true,
       "requires": {
         "fs.realpath": "1.0.0",
@@ -3214,7 +3214,7 @@
     "global-modules": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
-      "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=",
+      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
       "requires": {
         "global-prefix": "1.0.2",
         "is-windows": "1.0.2",
@@ -3236,7 +3236,7 @@
     "globals": {
       "version": "11.3.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz",
-      "integrity": "sha1-4E/be5eW2K2snI9kwUg3sjEzeLA=",
+      "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==",
       "dev": true
     },
     "globby": {
@@ -3293,7 +3293,7 @@
     "graphql": {
       "version": "0.13.1",
       "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.13.1.tgz",
-      "integrity": "sha1-mz2z2OQNGCfkFyQEv90uTheli1U=",
+      "integrity": "sha512-awNp3LTrQ7dJDSX3p3PBuxNDC+WFSOrWeV6+l4Xeh2PQJVOFyQ9SZPonXRz2WZc7aIxLZsf2nDZuuuc0qyEq/A==",
       "requires": {
         "iterall": "1.2.1"
       }
@@ -3398,7 +3398,7 @@
     "hash.js": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
-      "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=",
+      "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
       "requires": {
         "inherits": "2.0.3",
         "minimalistic-assert": "1.0.0"
@@ -3425,7 +3425,7 @@
     "hosted-git-info": {
       "version": "2.5.0",
       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
-      "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw="
+      "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg=="
     },
     "http-errors": {
       "version": "1.6.2",
@@ -3453,7 +3453,7 @@
     "iconv-lite": {
       "version": "0.4.19",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
-      "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs="
+      "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
     },
     "ieee754": {
       "version": "1.1.8",
@@ -3463,7 +3463,7 @@
     "ignore": {
       "version": "3.3.7",
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
-      "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=",
+      "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
       "dev": true
     },
     "ignore-by-default": {
@@ -3506,12 +3506,12 @@
     "ini": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc="
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
     },
     "inquirer": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
-      "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=",
+      "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
       "dev": true,
       "requires": {
         "ansi-escapes": "3.0.0",
@@ -3548,7 +3548,7 @@
     "is-absolute": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
-      "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=",
+      "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
       "requires": {
         "is-relative": "1.0.0",
         "is-windows": "1.0.2"
@@ -3557,7 +3557,7 @@
     "is-accessor-descriptor": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
       "requires": {
         "kind-of": "6.0.2"
       }
@@ -3578,7 +3578,7 @@
     "is-buffer": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4="
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
     },
     "is-builtin-module": {
       "version": "1.0.0",
@@ -3591,7 +3591,7 @@
     "is-data-descriptor": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
       "requires": {
         "kind-of": "6.0.2"
       }
@@ -3599,7 +3599,7 @@
     "is-descriptor": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-      "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
       "requires": {
         "is-accessor-descriptor": "1.0.0",
         "is-data-descriptor": "1.0.0",
@@ -3702,7 +3702,7 @@
     "is-odd": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
-      "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=",
+      "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
       "requires": {
         "is-number": "4.0.0"
       },
@@ -3710,7 +3710,7 @@
         "is-number": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8="
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
         }
       }
     },
@@ -3741,7 +3741,7 @@
     "is-plain-object": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "requires": {
         "isobject": "3.0.1"
       }
@@ -3778,7 +3778,7 @@
     "is-relative": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
-      "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=",
+      "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
       "requires": {
         "is-unc-path": "1.0.0"
       }
@@ -3786,7 +3786,7 @@
     "is-resolvable": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
-      "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=",
+      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
       "dev": true
     },
     "is-retry-allowed": {
@@ -3803,7 +3803,7 @@
     "is-unc-path": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
-      "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=",
+      "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
       "requires": {
         "unc-path-regex": "0.1.2"
       }
@@ -3811,7 +3811,7 @@
     "is-windows": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0="
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
     },
     "isarray": {
       "version": "1.0.0",
@@ -3831,7 +3831,7 @@
     "iterall": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.1.tgz",
-      "integrity": "sha1-WaNHroAB0tS8VGuEh8p1XWGEmWU="
+      "integrity": "sha512-XH2awY4PboL5tG5i2P7wZ2E6oet/JkmEUpUhjcroXxBUy7bPsUOXRDMAAZe+rnH2azSXboqvyDIp5n2f7GtlCQ=="
     },
     "js-string-escape": {
       "version": "1.0.1",
@@ -3852,7 +3852,7 @@
     "js-yaml": {
       "version": "3.10.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
-      "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=",
+      "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
       "dev": true,
       "requires": {
         "argparse": "1.0.10",
@@ -3891,7 +3891,7 @@
     "json-loader": {
       "version": "0.5.7",
       "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
-      "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0="
+      "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w=="
     },
     "json-schema-traverse": {
       "version": "0.3.1",
@@ -3921,7 +3921,7 @@
     "kind-of": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-      "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE="
+      "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
     },
     "klaw": {
       "version": "2.0.0",
@@ -3970,7 +3970,7 @@
         "debug": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
           "requires": {
             "ms": "2.0.0"
           }
@@ -4176,7 +4176,7 @@
     "lodash": {
       "version": "4.17.5",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
-      "integrity": "sha1-maktZcAnLevoyWtgV7yPv6O+1RE="
+      "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
     },
     "longest": {
       "version": "1.0.1",
@@ -4192,7 +4192,7 @@
     "lru-cache": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
-      "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=",
+      "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
       "requires": {
         "pseudomap": "1.0.2",
         "yallist": "2.1.2"
@@ -4201,7 +4201,7 @@
     "make-dir": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
-      "integrity": "sha1-bWpJ7q1KrilsU7vzoaAIvWyJRps=",
+      "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
       "dev": true,
       "requires": {
         "pify": "3.0.0"
@@ -4325,7 +4325,7 @@
     "miller-rabin": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
-      "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
       "requires": {
         "bn.js": "4.11.8",
         "brorand": "1.1.0"
@@ -4334,17 +4334,17 @@
     "mime": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
-      "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY="
+      "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
     },
     "mime-db": {
       "version": "1.33.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
-      "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s="
+      "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
     },
     "mime-types": {
       "version": "2.1.18",
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
-      "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=",
+      "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
       "requires": {
         "mime-db": "1.33.0"
       }
@@ -4352,7 +4352,7 @@
     "mimic-fn": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
-      "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI="
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
     },
     "minimalistic-assert": {
       "version": "1.0.0",
@@ -4367,7 +4367,7 @@
     "minimatch": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
       "requires": {
         "brace-expansion": "1.1.11"
       }
@@ -4380,7 +4380,7 @@
     "mixin-deep": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
-      "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=",
+      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
       "requires": {
         "for-in": "1.0.2",
         "is-extendable": "1.0.1"
@@ -4389,7 +4389,7 @@
         "is-extendable": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
           "requires": {
             "is-plain-object": "2.0.4"
           }
@@ -4484,7 +4484,7 @@
     "nanomatch": {
       "version": "1.2.9",
       "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
-      "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=",
+      "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
       "requires": {
         "arr-diff": "4.0.0",
         "array-unique": "0.3.2",
@@ -4520,7 +4520,7 @@
     "node-libs-browser": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
-      "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=",
+      "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
       "requires": {
         "assert": "1.4.1",
         "browserify-zlib": "0.2.0",
@@ -4568,7 +4568,7 @@
         "debug": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
           "dev": true,
           "requires": {
             "ms": "2.0.0"
@@ -4588,7 +4588,7 @@
     "normalize-package-data": {
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
-      "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=",
+      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
       "requires": {
         "hosted-git-info": "2.5.0",
         "is-builtin-module": "1.0.0",
@@ -4659,7 +4659,7 @@
         "is-descriptor": {
           "version": "0.1.6",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "requires": {
             "is-accessor-descriptor": "0.1.6",
             "is-data-descriptor": "0.1.4",
@@ -4669,7 +4669,7 @@
             "kind-of": {
               "version": "5.1.0",
               "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-              "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0="
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
             }
           }
         },
@@ -4805,7 +4805,7 @@
     "os-locale": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
-      "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=",
+      "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
       "requires": {
         "execa": "0.7.0",
         "lcid": "1.0.0",
@@ -4826,7 +4826,7 @@
     "p-limit": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
-      "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=",
+      "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
       "requires": {
         "p-try": "1.0.0"
       }
@@ -4864,7 +4864,7 @@
     "pako": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
-      "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg="
+      "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg=="
     },
     "parse-asn1": {
       "version": "5.1.0",
@@ -5060,7 +5060,7 @@
     "pbkdf2": {
       "version": "3.0.14",
       "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz",
-      "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=",
+      "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==",
       "requires": {
         "create-hash": "1.1.3",
         "create-hmac": "1.1.6",
@@ -5072,7 +5072,7 @@
     "pg": {
       "version": "7.4.1",
       "resolved": "https://registry.npmjs.org/pg/-/pg-7.4.1.tgz",
-      "integrity": "sha1-80Ecjd+faSMi/gXnAXoYiOR/ePE=",
+      "integrity": "sha512-Pi5qYuXro5PAD9xXx8h7bFtmHgAQEG6/SCNyi7gS3rvb/ZQYDmxKchfB0zYtiSJNWq9iXTsYsHjrM+21eBcN1A==",
       "requires": {
         "buffer-writer": "1.0.1",
         "js-string-escape": "1.0.1",
@@ -5163,7 +5163,7 @@
     "pluralize": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
-      "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=",
+      "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
       "dev": true
     },
     "posix-character-classes": {
@@ -5189,7 +5189,7 @@
     "postgres-interval": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.1.1.tgz",
-      "integrity": "sha1-rNsPiXtLHG5JbZ1OCoU+HEKPBvA=",
+      "integrity": "sha512-OkuCi9t/3CZmeQreutGgx/OVNv9MKHGIT5jH8KldQ4NLYXkvmT9nDVxEuCENlNwhlGPE374oA/xMqn05G49pHA==",
       "requires": {
         "xtend": "4.0.1"
       }
@@ -5243,7 +5243,7 @@
     "proxy-addr": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
-      "integrity": "sha1-NV8mJQWmIWRrMTCnKOtkfiIFU0E=",
+      "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
       "requires": {
         "forwarded": "0.1.2",
         "ipaddr.js": "1.6.0"
@@ -5271,7 +5271,7 @@
     "pstree.remy": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.0.tgz",
-      "integrity": "sha1-8q8nJlvT5bMrv8wQ6AusVbp4aIs=",
+      "integrity": "sha512-q5I5vLRMVtdWa8n/3UEzZX7Lfghzrg9eG2IKk2ENLSofKRCXVqMvMUHxCKgXNaqH/8ebhBxrqftHWnyTFweJ5Q==",
       "dev": true,
       "requires": {
         "ps-tree": "1.1.0"
@@ -5411,7 +5411,7 @@
     "qs": {
       "version": "6.5.1",
       "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
-      "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg="
+      "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
     },
     "querystring": {
       "version": "0.2.0",
@@ -5431,7 +5431,7 @@
     "randomatic": {
       "version": "1.1.7",
       "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
-      "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=",
+      "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
       "requires": {
         "is-number": "3.0.0",
         "kind-of": "4.0.0"
@@ -5450,7 +5450,7 @@
     "randombytes": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
-      "integrity": "sha1-0wLFIpSFiISKjTAMkytEwkIx2oA=",
+      "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
       "requires": {
         "safe-buffer": "5.1.1"
       }
@@ -5458,7 +5458,7 @@
     "randomfill": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
       "requires": {
         "randombytes": "2.0.6",
         "safe-buffer": "5.1.1"
@@ -5557,12 +5557,12 @@
     "regenerator-runtime": {
       "version": "0.11.1",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-      "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk="
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
     },
     "regex-cache": {
       "version": "0.4.4",
       "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
-      "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=",
+      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
       "requires": {
         "is-equal-shallow": "0.1.3"
       }
@@ -5570,7 +5570,7 @@
     "regex-not": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
       "requires": {
         "extend-shallow": "3.0.2",
         "safe-regex": "1.1.0"
@@ -5579,7 +5579,7 @@
     "registry-auth-token": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
-      "integrity": "sha1-hR/UkDjuy1hpERFa+EUmDuyYPyA=",
+      "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
       "dev": true,
       "requires": {
         "rc": "1.2.5",
@@ -5650,7 +5650,7 @@
     "resolve": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
-      "integrity": "sha1-HwmsznlsmnYlefMbLBzEw83fnzY=",
+      "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
       "requires": {
         "path-parse": "1.0.5"
       }
@@ -5688,7 +5688,7 @@
     "ret": {
       "version": "0.1.15",
       "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w="
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
     },
     "right-align": {
       "version": "0.1.3",
@@ -5701,7 +5701,7 @@
     "rimraf": {
       "version": "2.6.2",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
-      "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=",
+      "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
       "dev": true,
       "requires": {
         "glob": "7.1.2"
@@ -5743,7 +5743,7 @@
     "safe-buffer": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
-      "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM="
+      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
     },
     "safe-json-stringify": {
       "version": "1.1.0",
@@ -5776,7 +5776,7 @@
     "send": {
       "version": "0.16.1",
       "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
-      "integrity": "sha1-pw4coh0TgsEdDZ9iMd6ygQgNerM=",
+      "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==",
       "requires": {
         "debug": "2.6.9",
         "depd": "1.1.2",
@@ -5803,7 +5803,7 @@
     "serve-favicon": {
       "version": "2.4.5",
       "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz",
-      "integrity": "sha1-SdmkaGMVOpJAaRyJPSsOfYXW1DY=",
+      "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==",
       "requires": {
         "etag": "1.8.1",
         "fresh": "0.5.2",
@@ -5815,7 +5815,7 @@
     "serve-static": {
       "version": "1.13.1",
       "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz",
-      "integrity": "sha1-TFfVNASnYdjy58HooYpH2/J4pxk=",
+      "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==",
       "requires": {
         "encodeurl": "1.0.2",
         "escape-html": "1.0.3",
@@ -5844,7 +5844,7 @@
     "set-value": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
-      "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=",
+      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
       "requires": {
         "extend-shallow": "2.0.1",
         "is-extendable": "0.1.1",
@@ -5875,7 +5875,7 @@
     "sha.js": {
       "version": "2.4.10",
       "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz",
-      "integrity": "sha1-sf3lzX0RpWJmOKB8YEq5Cc+jH5s=",
+      "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==",
       "requires": {
         "inherits": "2.0.3",
         "safe-buffer": "5.1.1"
@@ -5902,7 +5902,7 @@
     "slice-ansi": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
-      "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=",
+      "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
       "dev": true,
       "requires": {
         "is-fullwidth-code-point": "2.0.0"
@@ -5978,7 +5978,7 @@
         "is-descriptor": {
           "version": "0.1.6",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "requires": {
             "is-accessor-descriptor": "0.1.6",
             "is-data-descriptor": "0.1.4",
@@ -5988,14 +5988,14 @@
         "kind-of": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0="
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
         }
       }
     },
     "snapdragon-node": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
       "requires": {
         "define-property": "1.0.0",
         "isobject": "3.0.1",
@@ -6015,7 +6015,7 @@
     "snapdragon-util": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
       "requires": {
         "kind-of": "3.2.2"
       },
@@ -6033,7 +6033,7 @@
     "source-list-map": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz",
-      "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU="
+      "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A=="
     },
     "source-map": {
       "version": "0.5.7",
@@ -6043,7 +6043,7 @@
     "source-map-resolve": {
       "version": "0.5.1",
       "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
-      "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=",
+      "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
       "requires": {
         "atob": "2.0.3",
         "decode-uri-component": "0.2.0",
@@ -6102,7 +6102,7 @@
     "split-string": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
       "requires": {
         "extend-shallow": "3.0.2"
       }
@@ -6169,7 +6169,7 @@
         "is-descriptor": {
           "version": "0.1.6",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "requires": {
             "is-accessor-descriptor": "0.1.6",
             "is-data-descriptor": "0.1.4",
@@ -6179,14 +6179,14 @@
         "kind-of": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0="
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
         }
       }
     },
     "statuses": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-      "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic="
+      "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
     },
     "stream-browserify": {
       "version": "2.0.1",
@@ -6209,7 +6209,7 @@
     "stream-http": {
       "version": "2.8.0",
       "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz",
-      "integrity": "sha1-/YZUbaybHJGv+PxdKHuY+vtBvBA=",
+      "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==",
       "requires": {
         "builtin-status-codes": "3.0.0",
         "inherits": "2.0.3",
@@ -6221,7 +6221,7 @@
     "string-width": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-      "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
       "requires": {
         "is-fullwidth-code-point": "2.0.0",
         "strip-ansi": "4.0.0"
@@ -6230,7 +6230,7 @@
     "string_decoder": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
-      "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=",
+      "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
       "requires": {
         "safe-buffer": "5.1.1"
       }
@@ -6335,7 +6335,7 @@
     "timers-browserify": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz",
-      "integrity": "sha1-JB52kn2coF9NlZgZAi9bNmS2S64=",
+      "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==",
       "requires": {
         "setimmediate": "1.0.5"
       }
@@ -6343,7 +6343,7 @@
     "tmp": {
       "version": "0.0.33",
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
       "dev": true,
       "requires": {
         "os-tmpdir": "1.0.2"
@@ -6473,7 +6473,7 @@
     "touch": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
-      "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=",
+      "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
       "dev": true,
       "requires": {
         "nopt": "1.0.10"
@@ -6496,7 +6496,7 @@
     "type-is": {
       "version": "1.6.16",
       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
-      "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=",
+      "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
       "requires": {
         "media-typer": "0.3.0",
         "mime-types": "2.1.18"
@@ -6795,7 +6795,7 @@
         "is-descriptor": {
           "version": "0.1.6",
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "requires": {
             "is-accessor-descriptor": "0.1.6",
             "is-data-descriptor": "0.1.4",
@@ -6805,7 +6805,7 @@
         "kind-of": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0="
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
         }
       }
     },
@@ -6837,7 +6837,7 @@
     "uuid": {
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
-      "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ="
+      "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
     },
     "v8flags": {
       "version": "3.0.1",
@@ -6915,7 +6915,7 @@
         "anymatch": {
           "version": "1.3.2",
           "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
-          "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=",
+          "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
           "requires": {
             "micromatch": "2.3.11",
             "normalize-path": "2.1.1"
@@ -7030,7 +7030,7 @@
     "webpack": {
       "version": "3.11.0",
       "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz",
-      "integrity": "sha1-d9pFGx17SxF62vQaGpO1dC8k2JQ=",
+      "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==",
       "requires": {
         "acorn": "5.4.1",
         "acorn-dynamic-import": "2.0.2",
@@ -7094,7 +7094,7 @@
     "webpack-sources": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz",
-      "integrity": "sha1-oQHrrlnWUHNU1x2AE5UKOot6WlQ=",
+      "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==",
       "requires": {
         "source-list-map": "2.0.0",
         "source-map": "0.6.1"
@@ -7110,7 +7110,7 @@
     "which": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
-      "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=",
+      "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
       "requires": {
         "isexe": "2.0.0"
       }
@@ -7215,7 +7215,7 @@
     "write-file-atomic": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
-      "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=",
+      "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
       "dev": true,
       "requires": {
         "graceful-fs": "4.1.11",
diff --git a/src/admin_view/admin_router.js b/src/admin_view/admin_router.js
index dad2d71dcba5e2268ff6dd3fa529ec24f5565636..4a4a663a0399002eda6dddf291918779dd355641 100644
--- a/src/admin_view/admin_router.js
+++ b/src/admin_view/admin_router.js
@@ -18,7 +18,7 @@ router.get('/', function (req, res) {
 });
 
 router.get('/admin',
-    ensureLoggedIn('/'),
+    // ensureLoggedIn('/'),
     function (req, res) {
         console.log('Connecting to ' + req.url);
         res.render('home', { title: 'Home', port: port });
@@ -29,7 +29,6 @@ router.post('/login',
         successRedirect: '/admin',
         failureRedirect: '/',
         failureFlash: true
-    }),
     // on a besoin de faire un callback apres le passport.authenticate car
     // on souhaite garde l'information user.dn et body.password qq part.
     // TODO: essayer de garder ces informations plus proprement...
@@ -46,8 +45,7 @@ router.post('/login',
         }
     }
     */
-
-);
+    }));
 
 router.post('/logout', function (req, res) {
     req.logout();
diff --git a/src/ldap/ldap_data.js b/src/ldap/ldap_data.js
index 9d7b3f3a76b2c2b195fed3c560daafa16a1ae9b7..9a93f2dc203c022304c49b32f0e9bfcb13497c51 100644
--- a/src/ldap/ldap_data.js
+++ b/src/ldap/ldap_data.js
@@ -1,19 +1,29 @@
 /**
- * @file Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu, liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification.
+ * @file Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu="", liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification.
  * @author hawkspar
 */
-var ldap  = require('ldapjs');
+
+/* Ne pas hésiter à repasser en synthaxe ES5... Plus simple pour tester en solo avec node directement
+import ldap  from 'ldapjs';
+import fs from 'fs';
+import ldapEscape from 'ldap-escape'; */
+
+var ldap = require('ldapjs');
 var fs = require('fs');
 var ldapEscape = require('ldap-escape');
 
+// Important ; permet de vérifier que l'utilisateur reste connecté.
 var ensureLoggedin =  require('connect-ensure-login').ensureLoggedIn;
 
+// Point central ; tous les champs de la BDD sont 'cachés' dans config.json et pas visibles directement
 let config = JSON.parse(fs.readFileSync('../../config.json', 'utf8'));
 
+// Connection au serveur LDAP avec des temps de timeout arbitraires
 var client = ldap.createClient({ url: config.ldap.server, timeout: 10000, idleTimeout: 10000});
 
 /**
- * @summary Fonction qui retrouve les groupes du LDAP dont un individu est membre (pas de bind nécessaire).
+ * @summary Fonction qui interroge le LDAP et retrouve les groupes dont un individu est membre.
+ * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listGroups(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).
  * @arg {int} uid - Identifiant de l'individu à interroger
  * @return {string} Liste des uid de groupes (noms flat des groupes) où l'id fourni est membre
  */
@@ -33,7 +43,8 @@ function listGroups(uid) {
 }
  
 /**
- * @summary Fonction qui retrouve la liste des membres d'un binet sur le LDAP.
+ * @summary Fonction qui interroge le LDAP et retrouve la liste des membres d'un groupe.
+ * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listMembers(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).
  * @arg {int} gid - Identifiant du groupe à interroger
  * @return {string} Liste des uid des membres où l'id fournie est membre (noms flat des groupes)
  */
@@ -41,7 +52,7 @@ function listMembers(gid) {
     return new Promise(function(resolve, reject) {
         var membersList=[];
         
-        client.search(config.ldap_data_ml.searchBase, {scope: "sub", attributes: "uid", filter: ldapEscape.filter(config.ldap_data_ml.searchFilter, {id: gid})}, function(err, res) {
+        client.search(config.ldap_data_ml.searchBase="", {scope: "sub", attributes: "uid", filter: ldapEscape.filter(config.ldap_data_ml.searchFilter, {id: gid})}, function(err, res) {
             if (err) {
                 reject(err);
             } else {
@@ -53,33 +64,41 @@ function listMembers(gid) {
 }
  
 /**
- * @summary Fonction qui retrouve les paxs validant les critères de recherche. Accepte des champs incomplets mais pas approximatifs et ne gère pas l'auto-complete.
- * @arg {string} fn - Prénom
- * @arg {string} ln - Nom
- * @arg {string} nk - Surnom
- * @arg {string} na - Nationalité
- * @arg {string} sc - Ecole ou université d'origine
- * @arg {int} yr - Promotion
- * @arg {string} gr - Groupe
- * @arg {string} co - Cours
- * @arg {string} sp - Sport pratiqué
- * @arg {int} nb - Numéro de téléphone
- * @arg {string} ma - Adresse courriel
- * @arg {string} ad - Adresse physique
- * @arg {string} ip - Adresse ip
- * @return {string[]} Informations recueillies ; plusieurs fois une liste sur le format ci-dessus pour tous les résultats correspondants plus une photo et date de naissance !
+ * @summary Fonction qui interroge le LDAP et retrouve les paxs validant les critères de recherche.
+ * @desc Accepte des champs incomplets mais pas approximatifs et ne gère pas l'auto-complete. Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma TOL(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma généré à la volée à partir de config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).
+ * @arg {string} c0 - Prénom
+ * @arg {string} c1 - Nom
+ * @arg {string} c2 - Surnom
+ * @arg {string} c3 - Nationalité
+ * @arg {string} c4 - Ecole ou université d'origine
+ * @arg {int} c5 - Promotion
+ * @arg {string} c6 - Groupe
+ * @arg {string} c7 - Cours
+ * @arg {string} c8 - Sport pratiqué
+ * @arg {int} c9 - Numéro de téléphone
+ * @arg {string} c10 - Adresse courriel
+ * @arg {string} c11 - Adresse physique
+ * @arg {string} c12 - Adresse ip
+ * @return {string[]} Informations recueillies ; plusieurs fois une liste sur le format ci-dessus pour tous les résultats correspondants plus une photo en byttestring et date de naissance.
  */
-function TOL(fn, ln, nk, na, sc, yr, gr, co, sp, nb, ma, ad, ip) {
+function TOL(c0="", c1="", c2="", c3="", c4="", c5="", c6="", c7="", c8="", c9="", c10="", c11="", c12="") {
     return new Promise(function(resolve, reject) {
         var candidatesList=[];
-        ["jpegPhoto","givenName", "sn", "brBirthdate", "brPromo","telephoneNumber","mail","brRoom","brIP"]
+
         var filter="";
-        
-        config.ldap_data_tol.searchAttributes.forEach(element => { filter="(&("+filter+")";
-            
+        var dic={};
+
+        config.ldap_data_tol.searchFilterAttributes.forEach((element, index, list) => {
+            if (eval("c"+index.toString()) != '') {
+                filter="(&"+filter+"(|("+element+"=*${app_"+element+index+"})"+
+                                "(|("+element+"=${app_"+element+index+"})"+
+                                "(|("+element+"=*${app_"+element+index+"}*)"+
+                                    "("+element+"=${app_"+element+index+"}*)))))";
+                dic["app_"+element+index]=eval("c"+index.toString());
+            }
         });
-        
-        client.search(config.ldap_data_tol.searchBase, {scope: "sub", attributes: config.ldap_data_tol.searchAttributes, filter: ldapEscape.filter(config.ldap_data_tol.searchFilter, { app_fn: fn, app_ln: ln, app_nk: nk, app_na: na, app_sc: sc, app_yr: yr, app_gr: gr, app_co: co, app_sp: sp, app_nb: nb, app_ma: ma, app_ad: ad, app_ip: ip})}, function(err, res) {
+
+        client.search(config.ldap_data_tol.searchBase, {scope: "sub", attributes: config.ldap_data_tol.searchAttributes, filter: ldapEscape.filter(filter, dic)}, function(err, res) {
             if (err) {
                 reject(err);
             } else {
@@ -97,6 +116,9 @@ function TOL(fn, ln, nk, na, sc, yr, gr, co, sp, nb, ma, ad, ip) {
 
 // Synthaxe d'utilisation
 //listGroups("quentin.louis").then((meList) => { console.log(meList); });
-TOL("Quentin","u","","","",2016,"","","","","","").then((meList) => { console.log(meList); });
+TOL("","","","","","","faerix","","","","","","").then((meList) => { console.log(meList); });
+
+/* Partage pour le reste du monde ; même remarque synthaxe  
+export { listGroups, listMembers, TOL }; */
 
-export { listGroups, listMembers, TOL };
\ No newline at end of file
+module.exports ={ listGroups, listMembers, TOL };
\ No newline at end of file