Mime-proxy
Version 2.1.c.2 du 19 Juillet 2006. Patrick Lamaizière <patrick(dot)softs(at)lamaiziere(dot)net>
A quoi ça sert ?
Mime-proxy ajoute un support des jeux de
caractères aux logiciels lecteurs de news (comme Gravity ou
Xnews) ou de courriers ne gérant pas la nome MIME. Il effectue
les conversions entre les jeux de caractères à la place
du logiciel lecteur de manière à afficher et envoyer
correctement les articles.
C'est un
logiciel « proxy », c'est à dire qu'il sert
d'intermédiaire à la connexion entre le lecteur et le
serveur et qu'il traite ce qui passe entre les deux. Le lecteur se
connecte sur Mime-proxy et Mime-proxy à son tour se connecte
sur le serveur. Quand Mime-proxy voit « passer » un
article ou un courrier, il effectue toutes les conversions qui vont
bien pour que l'article soit proprement encodé, ou pour qu'il
s'affiche correctement sur votre lecteur.
Caractéristiques.
Support des jeux de caractères par l'intermédiaire de la bibliothèque libiconv. Entre autres : iso-8859-1 et iso-8859-15, windows-1252, utf-8, utf-7 (etc).
Décodage / encodage en quoted-printable.
Décodage / encodage en base 64.
Décodage / encodage des mots encodés (RFC 2047).
Gestion des articles multi-parties MIME.
Gestion de l'yEncode.
Multi-serveurs, configuration différente possible pour chaque serveur.
Possibilité de spécifier des paramètres par les entêtes des articles.
Protocoles : NNTP, POP, SMTP.
Systèmes d'exploitations : Windows 32 bits, *nix.
Comment ça marche
?
L'encodage des articles postés.
Lorsque Mime-proxy reçoit un article de
la part du lecteur, il commence par décoder les éventuels
encodages quoted-printable ou base 64 de manière à
obtenir un article au format "8 bits". La
configuration indique au programme quel est le jeu de caractère
utilisé par le logiciel client et MP converti l'article vers
le jeu de caractères Unicode qui sert de référence.
Si l'article contient des indications de jeu de caractères,
elles sont ignorées (sauf si l'option trust_client_charset=1).
Ensuite
commence l'encodage proprement dit. Le programme recherche le premier
jeu de caractères qui convient pour émettre l'article ;
les jeux disponibles pour l'encodage sont spécifiés
dans la configuration. Une fois un jeu trouvé, l'application
effectue la conversion de l'article (au format Unicode) vers le jeu
de caractères trouvé précédemment.
Toujours suivant la configuration, un encodage en
quoted-printable ou base 64 peut ensuite être appliqué.
On peut également choisir d'encoder les caractères 8
bits des entêtes sous forme de mot-encodés.
Il n'y a plus qu'a rajouter les entêtes MIME pour correspondre
à l'article encodé :
Mime-Version:
1.0
Content-Type: text/plain; charset=le jeu de caractères
utilisé.
Content-Transfer-Encoding: 7bit, 8bit,
quoted-printable ou base64
Mime-proxy ne tient pas compte de
ces entêtes si elles sont présentes dans l'article
d'origine et les remplace. Le programme modifie également
le champ User-Agent à des fins publicitaires. Une fois tout
ceci exécuté, l'article est envoyé sur le
serveur.
En cas d'erreur, l'article est
rejeté et une erreur est renvoyée au logiciel lecteur.
Remarques :
Les encodages en quoted-printable ou en base 64 sont strictement interdit sur Usenet-Fr.
Seul le traitement de la commande POST est implémenté pour le protocole NNTP (news) et DATA pour le protocole SMTP (courrier).
Seules les parties MIME "text/plain" sont traitées par le programme.
Le décodage des articles reçus.
Le principe est d'obtenir un article au format
8 bits (donc sans encodage en quoted-printable ou base 64) et dans le
jeu de caractères utilisé par le lecteur. Mime-proxy
décode donc tout d'abord ces encodages quoted-printable ou
base 64 vers du 8 bits. Si le jeu de caractère spécifié
dans l'article est connu, Mime-proxy converti l'article vers Unicode
puis ensuite vers le jeu de caractères utilisé par le
lecteur. Si l'article ne spécifie pas de jeu de caractères,
un jeu par défaut peut être employé.
Remarques
:
Pour le protocole NNTP (news),
Mime-proxy reconnait les commandes ARTICLE, HEAD, BODY et XOVER.
Pour le
protocole POP, Mime-proxy reconnait les commandes RETR et TOP.
Seules les parties MIME "text/plain" sont traitées
par le programme.
Utilisation.
L'installation.
Le programme nécessite la bibliothèque libiconv
(une dll pour windows est disponible sur mon site)
et un fichier de configuration. Extraire les fichiers de l'archive
dans un répertoire puis éditer le fichier de
configuration (voir configuration). Sous windows extraire libiconv dans
le répertoire de mime-proxy.
David
Epelbaum, que je remercie vivement, a écrit un guide sur
l'installation que vous trouverez ici : http://mproxy.gattaca.org
La
désinstallation.
Comme l'installation mais en sens inverse. Supprimez simplement les
fichiers.
L'exécution.
Mime-proxy est une application console, c'est à
dire qu'il n'utilise pas de système de fenêtre, c'est
une application en mode "texte".
Le
lancement s'effectue à partir de la ligne de commande avec :
mproxy.exe fichier_de_configuration [Options]
où
:
fichier_de_configuration : fichier de configuration de l'application (voir configuration).-free_console : N'utilise pas la console Windows, dans ce mode le programme n'est pas visible sauf dans le gestionnaire de tâches de Windows.
Options :
Sous Windows, le plus simple est de créer un racourcis vers le programme. Il suffit ensuite de cliquer sur le raccourcis pour le lancer.
J'ai écris un petit utilitaire « MPLaunch » qui permet de lancer Mime-proxy dans une fenêtre ; il n'est pas indispensable et ne fonctionne que sous Windows. L'option -user ne fait strictement rien sous Windows.
Sous Posix, le principe est le même, mais les options -free_console et -silent ne fonctionnent pas. Le programme s'appelle mime-proxy (c'est plus joli que mproxy.exe)
Remarque : le nom du fichier de configuration peut contenir un chemin d'accès. En l'absence, Mime-proxy recherche le fichier dans le répertoire de travail courant, puis dans le répertoire de l'application.
La configuration.
La configuration s'effectue par l'intermédiaire
d'un fichier texte dont la syntaxe est proche d'un fichier .ini de
Windows.
Editez le fichier mproxy.ini et adaptez le à votre
configuration. En pratique spécifiez juste les paramètres
des serveurs dans la section [proxies]. Les autres paramètres
sont adaptés pour un usage avec un lecteur utilisant le jeu
windows-1252 et pour un usage sur la hiérarchie de news fr.*
Vous pouvez vérifier la prise en compte des paramètres avec l'option
-lint : mproxy.exe mproxy.ini -lint. Le programme affiche sa
configuration et se termine.
Configuration des connexions "proxies".
Un proxy est un intermédiaire entre des clients et un
serveur. Chaque proxy à l'écoute sur un port se
connecte sur un seul serveur. La section [proxies] spécifie
les paramètres des connexions.
[proxies]
server_alias
= local_port_number, remote_host, remote_port_number
[, protocol]
Où :
serveur_alias est un nom pour identifier le proxy dans le fichier
de configuration, il est ainsi possible d'utiliser une configuration
différente pour chaque proxy.
local_port_number est le numéro du port local du proxy,
c'est à dire le numéro du port sur lequel il
écoute.
remote_host l'adresse du
serveur.
remote_port_number le numéro
de port du serveur.
protocol indique le
protocole du proxy : nntp (news), pop (courrier
entrant), smtp (courrier sortant), ou none (aucun). Ce paramètre
est optionnel, en l'absence la valeur par défaut est
nntp.
Note:
Dans le cas du protocole "none", le programme fait
office de simple proxy et ne fait aucun autre traitement.
Exemple :
[proxies]
; server_alias = local_port_number, remote_host, remote_port_number [,protocol]
hamster = 6000, localhost, 119
free = 6001, news.free.fr, 119
wanadoo = 6002, news.wanadoo.fr, 119, nntp
smtp_wanadoo = 25, smtp.wanadoo.fr, 25, smtp
pop_wanadoo = 6003, pop.wanadoo.fr, 110, pop
Ici, le proxy à l'écoute sur le port 6000 se connecte sur votre machine (localhost), par exemple sur un serveur local comme Hamster. Celui sur le port 6001 se connecte sur le serveur de Free (news.free.fr), le 6002 sur le serveur de news de Wanadoo (news.wanadoo.fr). Le proxy smtp_wanadoo se connecte sur le serveur de courrier sortant de Wanadoo (smtp.wanadoo.fr). Enfin le dernier proxy pop_wanadoo se connecte sur le serveur de courrier entrant de Wanadoo (pop.wanadoo.fr).
Numéros de port par défaut : Les numéros de port sont standardisés pour chaque protocole, en générale les serveurs distants écoutent sur ces ports en fonction du protocole :
smtp ( courrier sortant ) : port numéro 25.
pop ( courrier entrant ) : port numéro 110.
nntp ( news ) : port numéro 119.
Configuration de l'encodage et du décodage.
Il est possible de spécifier une
configuration différente au niveau des encodages pour chaque
proxy. En l'absence de configuration, les paramètres de la
section [default] sont utilisés. Pour associer une
configuration à un proxy, il suffit de créer une
section [server_alias] où server_alias est le
nom donné au proxy dans la section [proxies].
Exemple :
[proxies]
smtp_free = 6000, smtp.free.fr, 25, smtp
news_free = 6001, news.free.fr, 119, nntp
[default]
encoded_word = 0
encode_to_qp = 0
charsets = us-ascii, iso-8859-1, iso-8859-15, utf-8
[smtp_free]
encoded_word = 1
encode_to_qp = 1
[news_free]
encoded_word = 0
Ainsi, on indique au proxy d'utiliser les mots encodés (paramètre encoded_word = 1) sur le serveur de courrier de Free (alias new_free) et pas sur le serveur de news (alias smtp_free). L'indication pour le serveur de news de Free est inutile puisque la section [default] défini déjà ce paramètre à 0 (faux) par défaut. Egalement, pour le courrier sur "smpt_free" on encode en quoted-printable (paramètre encode_to_qp = 1)
Jeux de caractères.
Mime-proxy supporte un grand nombre de jeux de
caractères, la liste complète dépend de votre système et de la
bibliothèque libiconv (voir http://www.gnu.org/software/libiconv
). La translitération est également supportée en ajoutant "//TRANSLIT"
à un jeu de caractères. La translitération permet de remplacer un
caractère par un équivalent. Par exemple le caractère euro peut être
converti en "EUR" dans le jeu iso-8859-1//TRANSLIT.
Paramètres
d'encodage et de décodage:
charsets : la liste des jeux de caractères à utiliser pour l'encodage des articles. Pour encoder l'article, Mime-proxy essai le premier jeu, le second, etc. Ceci jusqu'à trouver un jeu qui implémente tous les caractères de l'article.
charsets = us-ascii, iso-8859-1, iso-8859-15, utf-8
client_charset : le jeu de caractères utilisé à l'envoi par les clients (en général un lecteur de news ou de courrier). Mime-proxy encode de ce jeu de caractères vers un des jeux spécifiés dans la liste charsets.
client_charset = windows-1252
client_decoding_charset : le jeu de caractères utilisé à la lecture par les clients (en général un lecteur de news ou de courrier). Mime-proxy décode les articles vers ce jeu de caractères. Si ce paramètre n'est pas spécifié, le paramètre client_charset est utilisé à la place.
client_decoding_charset = windows-1252
date : Génération du champ Date:
date = 0 | 1 (valeur par défaut 0)
decode_header : interdit | autorise le décodage des entêtes des articles (si decoding = 1).
decode_header = 0 | 1 (valeur par défaut 1)
decoding : interdit | autorise le décodage des articles.
decoding = 0 | 1 (valeur par défaut : 1)
default_charset : Jeu de caractères par défaut. Si un article ne contient pas de déclaration d'encodage, Mime-proxy utilise ce jeu de caractères. Ce paramètre s'applique aux entêtes, y compris lors du XOVER, et au corps de l'article.
default_charset = iso-8859-15 (valeur par défaut : aucune )
enable_incoming_yEncode = 0 | 1 ( valeur par défaut : 0 )
enable_mime_proxy_header = 0 | 1 (valeur par défaut : 1)
enable_outgoing_yEncode: Désactive | Active le support de l'encodage yEncode pour les articles sortants (client vers serveur).
enable_outgoing_yEncode = 0 | 1 ( valeur par défaut : 0 )
encoded_word : interdit | autorise l'usage des mots encodés lors de l'encodage (seulement si encoding = 1).
encoded_word = 0 | 1 (valeur par défaut : 0)
encoding : interdit | autorise l'encodage des articles.
encoding = 0 | 1 (valeur par défaut : 1)
encode_to_b64 : interdit | autorise l'encodage en base 64 du corps de l'article (interdit sur Usenet-Fr, utilisation pour d'autres hiérarchies) (seulement si encoding = 1).
encode_to_b64 = 0 | 1 (valeur par défaut : 0 )
encode_to_qp : interdit | autorise l'encodage en quoted-printable du corps de l'article (interdit sur Usenet-Fr, utilisation pour d'autres hiérarchies ou pour le courrier) (seulement si encoding = 1).
encode_to_qp = 0 | 1 (valeur par défaut : 0 )
header_charset : jeu de caractères à utiliser pour l'encodage des entêtes des articles si elles sont en "8bits brut". Si ce paramètre n'est pas spécifié, le paramètre client_charset est utilisé à la place. Ce paramètre n'est actif que si l'encodage en mot encodé est désactivé (encoded_word=0)
header_charset = iso-8859-15 (valeur par défaut : aucune)
ip : adresse(s) ip autorisée(s) à se connecter sur le proxy. Par défaut, seule l'IP locale 127.0.0.1 est autorisée.
ip = ip_simple | ip1 - ip2 [, ip | ip1 - ip2]
où ip_simple désigne une adresse IP simple ( comme 127.0.0.1 ) et ip1 - ip2 une plage d'adresses IP comprises entre les adresses ip1 et ip2.
exemples :
[default]
ip = 127.0.0.1
Ce qui autorise l'adresse ip locale 127.0.0.1
[default]
ip = 127.0.0.1, 192.168.0.1 - 192.168.0.15
Ce qui autorise l'adresse ip locale 127.0.0.1 et les adresses ip comprises entre 192.168.0.1 et 192.168.0.15
message_id : Génération du champ Message-ID.
Le paramétrage s'effectue en spécifiant une chaîne de format : le caractère '#' suivi d'un nombre sur deux chiffres (impératifs) permet de générer un nombre aléatoire hexadécimal sur le nombre de chiffres spécifié. Par exemple pour générer un nombre composé de 9 chiffres : #09
exemple :
[default]
message_id : Xns#13totoplam#03@localhost
Mime-proxy va construire un Message-Id: de la forme
Message-ID: <Xns0123456789ABCDtotoplam012@localhost>
Important : ne pas inclure les signes '<' et '>' dans la chaîne de format. Veillez à ce que le nombre de chiffres aléatoires soit conséquent, afin de garantir l'unicité du Message-ID.
original_ip_header : ajoute une entête X-Original-IP indiquant l'adresse IP du client.
original_ip_header = 0 | 1 (valeur par défaut 0)
original_ip_reverse : Si "original_ip_header" est également spécifié, l'adresse IP du client est indiquée sous la forme de son reverse dns.
original_ip_reverse = 0 | 1 (valeur par défaut 0)
smtp_helo_to_ehlo : En SMPT, Mime-proxy remplace la requête HELO du client par EHLO. Ceci est une bidouille pour Xnews qui utilise HELO au lieu de EHLO.
trust_client_charset : Si cette option est présente, Mime-proxy utilise les indications de jeux de caractères présents dans les articles sortants au lieu du jeu spécifié dans le paramètre client_charset.
unknown_character : caractère de remplacement à utiliser en présence d'un caractère inconnu.
user_agent : Mime-proxy ne s'ajoute pas | s'ajoute au champ User-Agent.
user_agent = 0 | 1 (valeur par défaut : 1)
xover_decoding : interdit | autorise le décodage du XOVER.
xover_decoding = 0 | 1 (valeur par défaut : 1)
Entêtes de contrôles.
Les paramètres d'encodage peuvent être forcés
pour un article à partir de ses entêtes en ajoutant les
champs suivants :
Spécifier une liste de jeux de caractères à utiliser pour l'encodage de l'article
X-Mp-Charsets: jeu1,jeu2,...
Ne pas générer | générer un champ Date :
X-Mp-Date: no | yes
Ne pas utiliser | utiliser les mots encodés.
X-Mp-Encoded-Word: no | yes
Ne pas encoder | encoder le corps de l'article en quoted-printable.
X-Mp-Encode-To-Qp: no | yes
Ne pas encoder | encoder le corps de l'article en base 64.
X-Mp-Encode-To-B64: no | yes
Interdire | autoriser l'encodage de l'article :
X-Mp-Encoding: no | yes
Spécifier un jeu de caractères pour les entêtes (si entêtes en 8 bits brut):
X-Mp-Header-Charset: jeu
Spécifier un format de message-id :
X-Mp-Message-Id: chaine_de_format
Interdire | autoriser l'ajout du champ User-Agent
X-Mp-User-Agent: no | yes
Désactiver | activer le support de l'encodage yEncode.
X-Mp-yEncode: no | yes
Utiliser les jeux de caractères indiqués dans l'article.
X-Mp-Trust-Client: no | yes
Ces champs sont supprimés avant envoi de l'article sur le serveur. Mime-proxy contrôle qu'un champ d'entêtes commençant par "X-Mp" correspond à un des entêtes ci-dessus. Si le champ ne correspond pas ou en cas de paramètre invalide, l'article est rejeté.
Les entêtes de contrôles peuvent-être désactivés avec l'option :
allow_mp_control_header = 0 | 1 (par défaut : 1 )
Configuration diverse.
La section [misc] est utilisée pour les paramètres généraux de Mime-proxy.
socket_buffer_capacity
: taille en octets du buffer de communication des
sockets. La valeur par défaut est de 2048
octets, si vous avez des problèmes à l'envoi de
messages de grandes tailles, essayez de la diminuer.
[misc]
socket_buffer_capacity = 1024
fork_connection : sous *nix, forker un processus
enfant par connexion.
max_child : si fork_connection, nombre maximal de processus enfants. Si
le nombre de processus enfants dépasse cette valeur, les connexions
sont rejetées avec une erreur "No more ressources
available. Try later!".
Langue.
Il est possible de traduire les messages de
l'application en fournissant un fichier mproxy.dat dans le répertoire
du Mime-proxy. Voir le fichier mproxy_en.dat pour un exemple en
anglais. Renommer simplement ce fichier en mproxy.dat pour utiliser
ces messages.
Paramétrage
des lecteurs de news ou de courrier.
Il suffit simplement de configurer le lecteur pour se connecter sur le proxy correspondant au serveur d'origine désiré. Spécifiez l'identifiant de connexion "login" et le mot de passe comme si vous vous connectiez directement sur le serveur.
adresse du serveur : localhost (si Mime-proxy tourne sur votre machine en local).
numéro de port du serveur : numéro de port local correspondant au serveur spécifié dans la section [proxies] du fichier de configuration. Procédez de même pour l'adresse et le numéro du port du serveur de courrier sortant (SMTP).
Ça ne marche pas !
Ben ça devrait, chez moi ça marche (c)
En premier lieu, vérifiez que le programme se
lance correctement. Vous devez avoir un affichage de la forme :
«
Mime-proxy version: 2.0.c.0
Installation sur le port : 5000, localhost, 119,
nntp
Installation sur le port : 5001, news.free.fr, 119,
nntp
Installation sur le port : 25, smtp.wanadoo.fr, 25,
smtp
»
Si le programme rend la main, vérifiez la configuration du programme
et s'il n'y a pas un conflit de socket sur un port.
Mime-proxy se lance bien mais je n'arrive pas à me connecter dessus.
Vérifiez les paramètres du lecteur, si vous utilisez un fire-wall vérifiez que ce n'est pas lui qui bloque la connexion. Vérifez en direct que le serveur fonctionne au cas où.
Messages d'erreurs.
Messages d'erreurs à la configuration.
"Erreur parametre incorrect :". Un paramètre de configuration est incorrect, un descriptif de l'erreur est également affiché.
"Erreur
jeu de caracteres inconnu :". La configuration
utilise un jeu de caractères inconnu, c'est à dire non
gérés par la bibliothèque libiconv.
"Erreur : Format d'adresse IP incorrect : ". Une adresse ou une plage d'adresse IP spécifiée en configuration dans le paramètre "ip" est invalide.
"Erreur : Echec de l'installation sur le port : ". Le programme n'a pas pu installer un proxy sur le port. Le port est peut-être déjà occupé.
Messages d'erreurs à la
connexion.
Mime-proxy rapporte les
erreurs au logiciel client au travers de la connexion. Suivant le
protocole utilisé, le message peut être précédé
d'un numéro d'erreur. Les messages d'erreurs provenant des
serveurs sont bien sûr toujours reportés, pour cette
raison les messages venant de MP sont toujours précédés
de "Mime-proxy :".
"Mime-proxy : Access denied". Mime-proxy vous refuse l'accès, vérifiez le paramètrage des adresses IP autorisées à se connecter sur Mime-proxy.
"Mime-proxy : Impossible de se connecter sur :". Le serveur distant indiqué ne répond pas.
"Mime-proxy
: Ne peut pas encoder cet article !". Mime-proxy ne
peut pas encoder cet article car aucun jeu de caractères ne
convient pour l'encodage. Vérifiez qu'il n'y a pas
d'incompatibilité entre des caractères (par exemple
vous voulez envoyer un euro et un symbole monétaire neutre en
iso-8859-1 ou iso-8859-15) ou un caractère qui n'est pas dans
un jeu ISO (en particulier les caractères TM et l'apostrophe
"windows". L'apostrophe windows peut être très
difficile à distinguer d'une apostrophe normale).
"Mime-proxy
: Erreur parametre incorrect !". Mime-proxy ne peut
pas encoder cet article car un paramètre spécifié
par l'intermédiaire des entêtes de l'article est
incorrect.
"Mime-proxy
: No more ressources available. Try later!". Mime-proxy ne
dispose pas des ressources pour assurer la connexion. Attendre qu'il
soit moins occupé et refaire l'essai.
Y'a un bug !
C'est possible, envoyez moi un mail. Si c'est sur un article particulier, joignez une copie complète de l'article (avec les entêtes).
Essayez également avec et sans Mime-proxy pour voir si le problème vient bien du proxy.
Remerciements.
Le camarade David.
David Epelbaum qui a eu le courage de faire un guide de configuration.
Piotrek, un guide en polonais.
Luca, un guide en italien.
Merci aux testeurs !
Mime-proxy utilise les bibliothèques et outils suivants :
Compilateur SmartEiffel <http://SmartEiffel.loria.fr>
Bibliothèques (libres) :
EPOSIX <http://berend.gameren.nl/eposix/ >
UCSTRING <http://sourceforge.net/projects/ucstring/ >
(Mime-proxy n'utilise plus ces bibliothèques, mais merci quand même)
GOBO <http://elj.sourceforge.net/projects/other/gobo/ >
"NET" de Nenie.org < http://sourceforge.net/projects/nenie/ >
YAESOCKETS < http://sourceforge.net/projects/yaesockets/ >
Licence (fichier forum.txt).
Mime-proxy utilise la bibliothèque GNU Libiconv http://www.gnu.org/software/libiconv/,
en licence LGPL (voir le fichier COPYING.LIB)
-----------------------------------------------------------------------------------------------
Mime-proxy.
Copyright
(c) 2002-2006 Patrick Lamaizière
<patrick(dot)softs(at)lamaiziere(dot)net>
-----------------------------------------------------------------------------------------------
Eiffel Forum Freeware License, version 1
Permission is hereby granted, without written agreement and without
license or royalty fees, to use, copy, modify and/or distribute this
package, provided that:
- copyright notices are retained unchanged
- any distribution of this package, whether modified or not,
includes this file
Permission is hereby also granted, without written agreement and
without license or royalty fees, to distribute binary programs which
depend on this package, provided that:
- if the binary program depends on a modified version of this
package, you must publicly release the modified version of this
package - for example by submitting it to the Eiffel Forum archive
(http://www.eiffel-forum.org/archive/ )
THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT WARRANTY. ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE TO ANY PARTY FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THIS PACKAGE.