2003-04-29 16:52:22 +02:00
|
|
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
|
|
|
<!DOCTYPE html
|
|
|
|
|
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
|
|
|
|
|
"tuteurs://DTD/tml.dtd">
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Emacs avanc<6E></title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
<h1>Aller plus loin avec GNU Emacs</h1>
|
|
|
|
|
|
|
|
|
|
<p>Cette page contient une collection d'astuces pour l'utilisateur
|
|
|
|
|
d<EFBFBD>j<EFBFBD> rompu <20> GNU Emacs. Si vous <20>tes d<>butant et souhaitez vous
|
|
|
|
|
initier <20> Emacs, allez plut<75>t voir le <a
|
|
|
|
|
href="&url.tuteurs;unix/editeurs/emacs.html">tutorial</a> de
|
|
|
|
|
tuteurs.</p>
|
|
|
|
|
|
|
|
|
|
<h2>Abr<62>viations</h2>
|
|
|
|
|
|
|
|
|
|
<h3>Principe</h3>
|
|
|
|
|
|
|
|
|
|
<p> Vous connaissez d<>j<EFBFBD> la commande <code>M-/</code> qui permet de
|
|
|
|
|
compl<EFBFBD>ter un mot en cours de frappe (sinon, voir le <a
|
|
|
|
|
href="emacs.html">tutorial</a>. Dans le m<>me genre, emacs g<>re les
|
|
|
|
|
abr<EFBFBD>viations.</p>
|
|
|
|
|
|
|
|
|
|
<p>Le mode mineur « abbreviation » vous permet,
|
|
|
|
|
comme son nom l'indique, de d<>finir des abr<62>viations qu'emacs se
|
|
|
|
|
chargera de d<>velopper au cours de l'<27>dition du fichier. Par exemple,
|
|
|
|
|
vous pouvez d<>finir l'abr<62>viation ENS qui se d<>veloppera en
|
|
|
|
|
« <3B>cole Normale sup<75>rieure. »</p>
|
|
|
|
|
|
|
|
|
|
<p>Essayons un peu. Tapez <code>M-x abbrev-mode</code> pour basculer
|
|
|
|
|
dans le mode « abbreviation » (Cf. la <em
|
|
|
|
|
lang="en">mode line</em>). Tapez ensuite l'abr<62>viation de votre choix
|
|
|
|
|
(pour des raisons <20>videntes, ne choisissez pas un mot existant). Si
|
|
|
|
|
vous souhaitez des abr<62>viations locales (limit<69>es au mode dans lequel
|
|
|
|
|
vous vous trouvez), tapez ensuite <code>C-x ail</code>. Pour les
|
|
|
|
|
abr<EFBFBD>viations globales (qui s'appliquent <20> tous les modes), c'est
|
|
|
|
|
<code>C-x aig</code>. Tapez ensuite la version d<>velopp<70>e, puis
|
|
|
|
|
appuyez sur <code>ENTER</code>. Dor<6F>navant, dans cette session, <20>
|
|
|
|
|
chaque fois que vous taperez « ENS », emacs
|
|
|
|
|
d<EFBFBD>veloppera en « <3B>cole Normale sup<75>rieure. »</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Pour sortir du mode abr<62>viation, tapez <code>M-x
|
|
|
|
|
kill-all-abbrevs</code>.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<h3>Correction d'orthographe <20> la vol<6F>e</h3>
|
|
|
|
|
|
|
|
|
|
<p>On peut s'en servir pour faire comme dans MS Word et d<>finir une
|
|
|
|
|
liste de mots sur lesquels on fait tout le temps des coquilles. Genre
|
|
|
|
|
<EFBFBD><EFBFBD>teh<EFBFBD><EFBFBD> pour <20><>the<68><65> ou <20><>poru<72><75> pour <20><>pour<75><72>. Il suffit de dire <20>
|
|
|
|
|
Emacs que ce sont des abr<62>viations pour qu'il les remplace au vol par
|
|
|
|
|
le mot orthographi<68> correctement.</p>
|
|
|
|
|
|
|
|
|
|
<p> Commen<65>ons par indiquer <20> emacs que l'on souhaite utiliser le mode
|
|
|
|
|
abr<EFBFBD>viation par d<>faut, que l'on a un fichier d'abr<62>viations qui
|
|
|
|
|
s'appelle <code>~/.abrev</code> et que l'on souhaite sauvegarder ce
|
|
|
|
|
fichier <20> chaque fois. D'abord, on cr<63>e le fichier
|
|
|
|
|
<code>.abrev</code>, vide pour l'instant.</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<span class="prompt">clipper ~ $</span> touch .abrev
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p> Puis on indique dans son <code>.emacs</code> : </p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
(setq-default abbrev-mode t)
|
|
|
|
|
(read-abbrev-file "~/.abrev")
|
|
|
|
|
(setq save-abbrevs t)
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p> Quittez puis remancez emacs tout seul, <20><>Abbrev<65><76> figurera dans la
|
|
|
|
|
<em lang="en">mode line</em>. Suivez la proc<6F>dure d<>crite
|
|
|
|
|
ci-dessus : on tape l'abr<62>viation, puis <code>C-x aig</code> ou
|
|
|
|
|
<code>C-x ail</code>, l'abr<62>viation d<>velopp<70>e, puis
|
|
|
|
|
<code>Enter</code>. R<>p<EFBFBD>tez l'op<6F>ration autant de fois que souhait<69>
|
|
|
|
|
pour constituer votre liste d'abr<62>viations. Ensuite, on sauvegarde
|
|
|
|
|
cette liste : <code>M-x write abbrev-file</code> puis
|
|
|
|
|
<code>Enter</code>. Emacs vous demande alors le nom de votre fichier,
|
|
|
|
|
tapez donc <code>~/.abrev</code> puis <code>Enter</code>.</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Par la suite, pour ajouter de nouvelles abr<62>viations, contentez-vous
|
|
|
|
|
de les d<>finir comme indiqu<71> ci-dessus, emacs vous demandera si vous
|
|
|
|
|
voulez sauvegarder votre fichier d'abr<62>viations. Il suffira de
|
|
|
|
|
r<EFBFBD>pondre oui.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>Pour effacer une abr<62>viation, tapez <code>M-x edit-abbrevs</code>
|
|
|
|
|
qui lance l'<27>diteur d'abr<62>viations (pour simplement voir la liste,
|
|
|
|
|
c'est <code>M-x list-abbrevs</code>). Ladite liste ressemble <20>
|
|
|
|
|
ceci :
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
(global-abbrev-table)
|
|
|
|
|
|
|
|
|
|
"gwb" 1 "George W. Bush"
|
|
|
|
|
"usa" 1 "<22>tats-Unis"
|
|
|
|
|
"poru 1 "pour"
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Entre parenth<74>ses, emacs vous dit qu'il s'agit d'abr<62>viations globales
|
|
|
|
|
(si elles avaient <20>t<EFBFBD> locales, vous auriez vu
|
|
|
|
|
<code>(text-mode-abbrev-table)</code>, ou
|
|
|
|
|
<code>(fundamental-mode-abbrev-table)</code>, etc.). La colonne de
|
|
|
|
|
gauche affiche les abr<62>viations proprement dites, la seconde colonne
|
|
|
|
|
est la cuisine interne d'emacs, la colonne de droite contient les
|
|
|
|
|
abr<EFBFBD>viations d<>velopp<70>es. Pour effacer une abr<62>viation, utiliser une
|
|
|
|
|
commande standard pour effacer la ligne en question, <code>C-k</code>
|
|
|
|
|
par exemple, puis sauvegardez.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<div class="attention">Attention, n'essayez pas d'ajouter <20> la main de
|
|
|
|
|
nouvelles lignes <20> la liste. Effacer est la seule op<6F>ration s<>re.
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<h2>Bookmarks</h2>
|
|
|
|
|
|
|
|
|
|
<p>Vous connaissez les bookmarks (alias <20><>signets<74><73> pour Netscape ou
|
|
|
|
|
<EFBFBD><EFBFBD>favoris<EFBFBD><EFBFBD> pour Internet Explorer) dans un navigateur. Eh bien dans
|
|
|
|
|
emacs, il y en a aussi. Ils jouent tr<74>s exactement le r<>le de
|
|
|
|
|
marque-pages : vous pouvez ainsi retrouver exactement l'endroit
|
|
|
|
|
o<EFBFBD> vous en <20>tiez d'une session <20> l'autre.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<table class="tableau">
|
|
|
|
|
<tr><th>Commande</th><th>Commande compl<70>te</th><th>Action</th></tr>
|
|
|
|
|
<tr><td>C-x r m <code>Enter</code></td><td>_</td><td>Pose un bookmark <20>
|
|
|
|
|
l'endroit o<> se trouve le point</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>C-x r m <nom> <code>Enter</code></td><td>M-x
|
|
|
|
|
bookmark-set</td><td>Pose un bookmark et lui donne un nom</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>_</td><td>M-x bookmark-delete <nom></td><td>D<>truit le bookmark <nom></td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>C-x r b <nom></td><td>M-x bookmark-jump</td><td>Aller au
|
|
|
|
|
bookmark <nom></td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>C-x r l</td><td>M-x bookmark-list</td><td>Lister tous les bookmarks</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>_</td><td>M-x bookmark-file</td><td>Sauve les bookmarks</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
<h2>Histoires de r<>pertoires (Dired)</h2>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Emacs vous permet d'agir sur vos r<>pertoires : regarder le
|
|
|
|
|
contenu d'un r<>pertoire, effacer des fichiers, les renommer, les
|
|
|
|
|
copier, etc. Bref, tout ce que vous faites d'ordinaire avec les
|
|
|
|
|
commandes <code>cp</code>, <code>rm</code> ou encore <code>mv</code>
|
|
|
|
|
sous UNIX. Tout cela, gr<67>ce <20> Dired (DIRectory EDitor)...
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Commen<EFBFBD>ons par demander <20> Emacs de lire un r<>pertoire. Par exemple, le
|
|
|
|
|
r<EFBFBD>pertoire <code>armoire/</code> de tuteurs.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<span class="prompt">clipper ~ $</span> emacs ~tuteurs/armoire
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
On obtient alors le r<>sultat suivant, similaire <20> ce que vous aurait
|
|
|
|
|
donn<EFBFBD> un <code>ls -la</code> sur le m<>me r<>pertoire :
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
/users/staffs/tuteurs/armoire:
|
|
|
|
|
used 8 available 222601
|
|
|
|
|
drwxr-xr-x 3 tuteurs 512 Jan 8 02:30 .
|
|
|
|
|
drwxr-xr-x 30 tuteurs 2560 Apr 1 20:06 ..
|
|
|
|
|
drwxr-xr-x 2 tuteurs 512 Jan 8 02:32 affiche
|
|
|
|
|
-rw-r--r-- 1 tuteurs 1334 Oct 14 2002 inventaire.txt
|
|
|
|
|
-rw-r--r-- 1 tuteurs 954 Nov 14 11:24 livres.txt
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p> Vous pouvez vous d<>placer dans Dired <20> l'aide de la touche
|
|
|
|
|
<code>n</code>, de la barre d'espace ou encore de
|
|
|
|
|
<code>C-n</code>. Pour <20>diter un fichier, appuyez sur
|
|
|
|
|
<code>e</code>. Pour simplement jeter un coup d'œil au fichier,
|
|
|
|
|
<code>v</code> demande <20> emacs d'afficher le fichier dans un buffer en
|
|
|
|
|
lecture seule appel<65> <20><>View<65><77>. On quitte ce buffer avec un simple
|
|
|
|
|
<code>q</code>.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<div class="attention">Avant toutes choses, attention : dans
|
|
|
|
|
Dired, vous travaillez directement sur vos fichiers, pas par
|
|
|
|
|
l'interm<72>diaire d'un buffer. Quand vous effacez un fichier, c'est
|
|
|
|
|
d<EFBFBD>finitif.
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Autre remarque : si vous modifiez le contenu de votre directoire
|
|
|
|
|
en dehors de Dired (par exemple, en suspendant emacs pour revenir au
|
|
|
|
|
shell), il faudra relancer Dired pour prendre en compte les
|
|
|
|
|
modifications du disque (<code>C-x C-f <r<>pertoire></code>).
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<h3>Effacer un fichier</h3>
|
|
|
|
|
|
|
|
|
|
<p>Le m<>canisme est identique que celui pour effacer un buffer dans la
|
|
|
|
|
liste des buffers (<code>C-x C-b</code>). Placez votre curseur sur la
|
|
|
|
|
bonne ligne puis tapez sur <code>d</code>. Un <20><>D<EFBFBD><44> appara<72>t alors sur
|
|
|
|
|
la ligne, tout <20> gauche :</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
/users/staffs/tuteurs/armoire:
|
|
|
|
|
used 8 available 222601
|
|
|
|
|
drwxr-xr-x 3 tuteurs 512 Jan 8 02:30 .
|
|
|
|
|
drwxr-xr-x 30 tuteurs 2560 Apr 1 20:06 ..
|
|
|
|
|
D drwxr-xr-x 2 tuteurs 512 Jan 8 02:32 affiche
|
|
|
|
|
-rw-r--r-- 1 tuteurs 1334 Oct 14 2002 inventaire.txt
|
|
|
|
|
D -rw-r--r-- 1 tuteurs 954 Nov 14 11:24 livres.txt
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Pour aller plus rapidement, <code>#</code> marque comme <20> effacer tous
|
|
|
|
|
les fichiers d'auto-save (ceux dont le nom commence et finit par des
|
|
|
|
|
#, pr<70>cis<69>ment) et <code>~</code>, tous les fichiers de backup (dont
|
|
|
|
|
le nom finit en ~). Pour enlever la marque d'effacement d'un fichier,
|
|
|
|
|
appuyez sur <code>u</code> (comme <20><><em lang="en">undelete</em><3E><>).
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Quand vous avez fini, et que vous souhaitez vraiment d<>truire les
|
|
|
|
|
fichiers, tapez <code>x</code>. Emacs vous demandera de confirmer la
|
|
|
|
|
destruction des fichiers marqu<71>s.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<h3>Copier et renommer</h3>
|
|
|
|
|
|
2003-04-29 19:04:56 +02:00
|
|
|
|
<p> Pour copier, tapez <code>C</code> (ou <code>M-x
|
2003-04-29 16:52:22 +02:00
|
|
|
|
dired-do-copy</code>) sur le fichier <20> copier. Emacs vous demande
|
|
|
|
|
alors le nom du nouveau fichier. Pour renommer, m<>me principe en
|
2003-04-29 19:04:56 +02:00
|
|
|
|
tapant <code>R</code> (ou <code>M-x dired-do-move</code>).</p>
|
2003-04-29 16:52:22 +02:00
|
|
|
|
|
|
|
|
|
<h3>R<>capitulons</h3>
|
|
|
|
|
|
|
|
|
|
<p> Dired vous permet de faire quasiment toutes les op<6F>rations sur
|
|
|
|
|
fichier ou r<>pertoire que les commandes UNIX standard. Le tableau
|
|
|
|
|
suivant r<>capitule des points d<>j<EFBFBD> expliqu<71>s et vous pr<70>sente d'autres
|
|
|
|
|
possibilit<EFBFBD>s. </p>
|
|
|
|
|
|
|
|
|
|
<table class="tableau">
|
|
|
|
|
<tr>
|
|
|
|
|
<th>Commande</th><th>Nom complet</th><th>Action</th><th><3E>quivalent UNIX</th>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>e</td><td>_</td><td><3E>diter le fichier</td><td>emacs</td>
|
|
|
|
|
</tr><tr>
|
2003-04-29 19:04:56 +02:00
|
|
|
|
<td>R</td><td>M-x dired-do-rename</td><td>Renommer le
|
2003-04-29 16:52:22 +02:00
|
|
|
|
fichier</td><td>cp</td>
|
|
|
|
|
</tr><tr>
|
2003-04-29 19:04:56 +02:00
|
|
|
|
<td>C</td><td>M-x dired-do-copy</td><td>Renommer le
|
2003-04-29 16:52:22 +02:00
|
|
|
|
fichier</td><td>mv</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>d</td><td>M-x dired-do-delete</td><td>Marquer pour
|
|
|
|
|
l'effacement</td><td>rm</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>~</td><td>_</td><td>Marquer pour l'effacement tous les fichiers de
|
|
|
|
|
backup</td><td>rm *~</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>#</td><td>_</td><td>Marquer pour l'effacement tous les fichiers
|
|
|
|
|
d'autosave</td><td>rm *#</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>u</td><td>_</td><td>Enlever la marque d'effacement</td><td>_</td>
|
|
|
|
|
</tr><tr>
|
2003-04-30 01:08:13 +02:00
|
|
|
|
<td>+</td><td>M-x dired-create-directory</td><td>Cr<43>er un
|
|
|
|
|
r<EFBFBD>pertoire</td><td>mkdir</td>
|
|
|
|
|
</tr><tr>
|
2003-04-29 16:52:22 +02:00
|
|
|
|
<td>M</td><td>M-x dired-do-chmod</td><td>Changer les droits
|
|
|
|
|
d'acc<63>s</td><td>chmod</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>G</td><td>M-x dired-do-chgrp</td><td>Changer le
|
|
|
|
|
groupe</td><td>chgrp</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>O</td><td>M-x dired-do-chown</td><td>Changer le propri<72>taire du
|
|
|
|
|
fichier</td><td>chown</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>S</td><td>M-x dired-do-symlink</td><td>Faire un lien
|
|
|
|
|
symbolique</td><td>ln -s</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>H</td><td>M-x dired-do-hardlink</td><td>Faire un lien
|
|
|
|
|
dur</td><td>ln</td>
|
|
|
|
|
</tr><tr>
|
|
|
|
|
<td>Z</td><td>M-x dired-do-compress</td><td>Compresse un fichier (avec
|
|
|
|
|
<a href="&url.tuteurs;unix/archives.html">gunzip</a>)</td><td>gzip</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h2>Lire les pages de man</h2>
|
|
|
|
|
|
|
|
|
|
<p>Vous pouvez <20>galement lire des pages de man direcetement dans
|
|
|
|
|
emacs, gr<67>ce <20> la commande <code>M-x man</code>. Appuyez sur
|
|
|
|
|
<code>Enter</code>, puis emacs vous demandera quelle page de man vous
|
|
|
|
|
souhaitez lire. Par d<>faut, il s'agit du mot sur lequel est plac<61>
|
|
|
|
|
votre curseur. Vous pouvez <20>galement sp<73>cifier la section dans
|
|
|
|
|
laquelle se trouve la page recherch<63>e. Par exemple, vous recherchez la
|
|
|
|
|
page de man du test, c<>l<EFBFBD>bre distraction normalienne, qui se trouve
|
|
|
|
|
dans la section I : </p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
Manual entry: test I
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Ce qui vous donne :
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
Misc. Manual Pages TEST(I)
|
|
|
|
|
|
|
|
|
|
NAME
|
|
|
|
|
test - distraction normalienne
|
|
|
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
|
Le test est une distraction sp<73>cifiquement normalienne. Le
|
|
|
|
|
test consiste <20> dire ou faire quelque chose avec l'intention
|
|
|
|
|
de tirer de son interlocuteur une r<>action pr<70>cise. Si
|
|
|
|
|
cette r<>action se produit effectivement, on dira <20> test <20>,
|
|
|
|
|
--11:%%-F1 *Man test I* { page 1 of 1} (Man)--L1--Top---------------------
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p> Il est plus facile de lire une page de man dans emacs qu'en
|
|
|
|
|
invoquant la commande <code>man</code> dans le shell. Seul
|
|
|
|
|
inconv<EFBFBD>nient : vous ne pouvez pas interrompre emacs pendant qu'il
|
|
|
|
|
est en train de mouliner <20> la recherche de la page de man demand<6E>e,
|
|
|
|
|
pas m<>me avec <code>C-g</code>... </p>
|
|
|
|
|
|
|
|
|
|
<h2>Emacs comme shell de login</h2>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Non, je rigole...</p>
|
|
|
|
|
|
|
|
|
|
<div class="metainformation">Auteur : Marie-Lan Nguyen. Derni<6E>re
|
|
|
|
|
modification : 2003-04-29
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|