Commit Graph

299 Commits

Author SHA1 Message Date
James McCoy
88e4f73777 getSocket: Use returned family to create the socket
The existing code was parsing the passed in host to determine what type
of socket family to create.  getaddrinfo already provides this for us,
so there's no need to perform our own, potentially buggy, parsing.

Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2013-08-22 23:40:28 -04:00
Valentin Lorentz
e3acc03fd6 Another fix for b46a0dd6a2. 2013-08-17 19:27:52 +02:00
Valentin Lorentz
f3ecc33678 Fix commit b46a0dd (breaks tests for Alias and Aka). 2013-08-17 17:08:55 +02:00
Kill Your TV
b46a0dd6a2 Unicode fixes for python 2.x
These changes have been tested with Python 3.2.3 and Python 2.7.5.
2013-08-17 14:12:10 +00:00
Valentin Lorentz
dd37f8dd3f Socket: Forward DNS queries via the socks proxy (if any). 2013-08-17 15:47:39 +02:00
Valentin Lorentz
8d7b06efd1 utils.str.format: Replace %u with '' instead of '<>' if URL is empty. 2013-08-13 19:19:54 +00:00
Valentin Lorentz
1e050d7fa8 utils/str.py: Use already existing function utils.gen.timeElapsed instead of redundant one. 2013-08-11 12:08:01 +02:00
Valentin Lorentz
8b4b45ecf0 utils/str.py: Add the %T (Time delta) argument type. 2013-08-11 12:03:41 +02:00
Valentin Lorentz
c23f25545f Fix core tests for Python 3 (actually imported + fixes). 2013-08-10 15:18:04 +02:00
Valentin Lorentz
4a265a6ce9 Enhance representation of InsensitivePreservingDict objects. 2013-07-13 11:20:02 +02:00
Valentin Lorentz
771b739af7 utils.web.getEncoding: use <meta charset /> if available. 2013-07-09 12:40:42 +00:00
Valentin Lorentz
b4402b28ed utils.web: Rename get_encoding to getEncoding for consistency. 2013-07-09 12:05:51 +00:00
Valentin Lorentz
d4df5de91d utils.web: Add function get_encoding. 2013-07-09 12:02:25 +00:00
Carsten Teibes
7129dc2697 Switch to charade, which is better maintained and works under 2 and 3 2013-06-27 19:36:44 +02:00
Valentin Lorentz
774158f2ec utils/web.py: Fix compatibility with Python 3. 2013-06-17 04:10:29 +00:00
Valentin Lorentz
cca1e6dba5 utils/web.py: Add some 'try' statements to make decoding as error-permissive as possible. 2013-06-13 17:22:33 +00:00
Valentin Lorentz
2eec980c8e utils/web.py: Python 3 should use decode() only if it is a bytes object. 2013-06-13 04:22:20 +00:00
Valentin Lorentz
a82ad9cb1a utils/web.py: Properly import chardet. 2013-06-12 17:38:50 +00:00
Valentin Lorentz
e24ab4501d Fix bug with Python 3.3 (?) 2013-06-06 05:49:25 +00:00
Valentin Lorentz
2016983d35 Add supybot.utils.net.getAddressFromHostname() and improve Socket driver to try successively all IP addresses. 2013-05-31 17:21:10 +02:00
Valentin Lorentz
cefd91d4f1 Fix encoding issues with Alias containing non-ascii characters. 2013-05-31 15:42:57 +02:00
Valentin Lorentz
ad25f17639 RSS: Add Python 3 support. 2013-05-29 15:16:23 +02:00
Valentin Lorentz
6ffcf122a7 Remove code specific to Python 2.{3,4,5}. 2013-05-13 15:27:26 +02:00
Valentin Lorentz
8d95a424b0 Fix fetch of RSS feeds containing unicode. 2013-05-13 10:51:24 +02:00
Valentin Lorentz
caf255afd9 Internationalize string-handling functions in src/utils/.
This commit was supposed to be before the two previous ones, but I messed up with Git.
2013-04-21 16:00:31 +02:00
Valentin Lorentz
916a85c965 core: Various Python 3 compatibility fixes. 2013-03-25 19:15:08 +01:00
Valentin Lorentz
d753df9d0c Print extra debug data in the logs. 2013-02-03 17:46:39 +01:00
Valentin Lorentz
77f614be86 utils.web.HtmlToText: Convert html entities. 2013-02-01 20:50:46 +01:00
Valentin Lorentz
6c0497d34e Fix traceback when utils.str.dqrepr is given a unicode object. 2013-01-23 13:53:37 +01:00
Valentin Lorentz
fe39d35b2f core: Fix normalizeWhitespace handling of new lines. 2013-01-04 22:28:44 +01:00
Valentin Lorentz
28dc3dd3ac core: Fix normalizeWhitespace. 2013-01-04 20:25:25 +01:00
Valentin Lorentz
3dba9088b0 Merge remote-tracking branch 'supybot/master' into testing
Conflicts:
	INSTALL
	plugins/ChannelLogger/README.txt
	plugins/ChannelStats/README.txt
	plugins/Google/plugin.py
	plugins/Google/test.py
	plugins/Plugin/test.py
	plugins/Web/test.py
	setup.py
	src/callbacks.py
	src/ircdb.py
	src/irclib.py
	src/utils/str.py
	test/test_irclib.py
2013-01-01 21:11:24 +01:00
James McCoy
295f9b1f0d Make utils.str.soundex perform better when length is large
Closes: Sf patch#148
Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2012-12-31 17:29:02 -05:00
Valentin Lorentz
cab1830140 utils.structures: Prevent a RingBuffer from being bigger than the new size, when calling resize(). 2012-12-27 12:22:14 +00:00
James McCoy
90b7f3cd4e utils.web: Simplify getUrlFd by using standard parse methods
Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2012-10-23 17:06:30 -04:00
Valentin Lorentz
85eb0b4b0d Fix 3a78300971. 2012-10-23 16:15:13 +00:00
James McCoy
6ab807be43 utils.net: Use _ipAddr and _domain from utils.web to define emailRe
Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2012-10-20 19:43:11 -04:00
Valentin Lorentz
db3746d122 Add support for authentication scheme.
This commit closes http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=690879

Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2012-10-20 19:42:15 -04:00
Valentin Lorentz
7d87d422e1 Fix detection of .42 domains
Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2012-10-20 19:15:05 -04:00
Valentin Lorentz
3a78300971 Add support for authentication scheme.
This commit closes http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=690879
2012-10-20 20:23:32 +02:00
Daniel Folkinshteyn
f310350335 Web: add 'timeout' config for web fetch, default 5 sec.
Otherwise, when a site would take a long time to respond, the thread would hang for quite a while.

also needed to mod src/utils/web.py to take the timeout arg.

Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2012-10-15 22:10:56 -04:00
Daniel Folkinshteyn
6025f7364c core: force inet_aton argument to string to prevent occasional error on reconnect.
it /should/ always be a string anyway, but sometimes things break with
a TypeError that it is an int instead of the expected string and hangs
up the bot.

Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2012-10-14 12:21:56 -04:00
Valentin Lorentz
156b3d93e1 Socket driver: Add support for Socks proxies. 2012-10-07 13:13:08 +02:00
James McCoy
cef93a6cfd Use relative imports for all packages under the supybot namespace
Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2012-09-17 22:12:11 -04:00
James McCoy
82ecf36fcd Update my name/contact information
Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2012-09-01 10:16:48 -04:00
Daniel Folkinshteyn
2c051bab9f core: force inet_aton argument to string to prevent occasional error on reconnect.
it /should/ always be a string anyway, but sometimes things break with
a TypeError that it is an int instead of the expected string and hangs
up the bot.
2012-08-30 11:32:48 +02:00
Valentin Lorentz
d2b33a3794 Fix compatibility with Python 2.6. 2012-08-13 13:01:50 +00:00
Valentin Lorentz
3dc8e04195 utils.web.urlencode: Encode data into bytes. 2012-08-05 16:57:40 +02:00
Valentin Lorentz
32a7da6f51 Add 2to3 fixer to process utils.gen.IterableMap correctly. 2012-08-05 12:32:57 +02:00
Valentin Lorentz
393f78c573 Use a boolean instead of hacky reference comparison in utils.iter.choice. 2012-08-05 09:59:42 +02:00
Valentin Lorentz
e89dcf867a Remove unused import of UserDict. 2012-08-04 22:39:22 +02:00
Valentin Lorentz
fff9b837fb Import ifilter from itertools instead of utils.iter. 2012-08-04 22:38:11 +02:00
Valentin Lorentz
1a64f1052a Use MultipleReplace for utils.str.soundex. 2012-08-04 22:36:40 +02:00
Valentin Lorentz
9edda206ea Remove utils.str.chars. 2012-08-04 22:33:08 +02:00
Valentin Lorentz
3838ab5314 Remove unused imports of new. 2012-08-04 22:31:59 +02:00
Valentin Lorentz
ced2e7b72d Implement seed, tell, and flush to AtomicFile. 2012-08-04 21:24:17 +02:00
Valentin Lorentz
c4dfa55d65 Use HTMLParser instead of deprecated sgmllib in utils.web. 2012-08-04 18:02:45 +02:00
Valentin Lorentz
9ae90c3869 Make utils.structures.CacheDict subclass collections.MutableMapping instead of deprecated UserDict.DictMixin. 2012-08-04 17:46:28 +02:00
Valentin Lorentz
6514db9b3f Prevent name clashes in utils.structures. 2012-08-04 17:42:08 +02:00
Valentin Lorentz
452c706092 Make utils.str.perlRoToReplacer less ambiguous. 2012-08-04 17:36:15 +02:00
Valentin Lorentz
8af6761275 Use 'unicode_escape' in utils.str.dqrepr if running Python 3. 2012-08-04 17:33:17 +02:00
Valentin Lorentz
0a4a12243d Prevent name clash in utils.iter.startswith. 2012-08-04 17:26:59 +02:00
Valentin Lorentz
b8fe420ef3 Use 'ast' instead of 'compiler' in utils.gen.safeEval. 2012-08-04 17:24:08 +02:00
Valentin Lorentz
d3d93da602 utils.gen.saltHash: encode string before hashing it. 2012-08-04 17:12:23 +02:00
Valentin Lorentz
ab978a8c31 Remove utils/gen.py dependency on deprecated libraries (new and UserDict). 2012-08-04 17:09:32 +02:00
Valentin Lorentz
caaf290c9b utils/gen.py: Import imap from itertools instead of utils.iter. 2012-08-04 17:03:51 +02:00
Valentin Lorentz
9de7316f02 Change utils.file.AtomicFile into a wrapper instead of a subclass. 2012-08-04 17:01:36 +02:00
Valentin Lorentz
174a5a4b1f Encode strings before hashing them in utils.file.mktemp. 2012-08-04 16:39:33 +02:00
Valentin Lorentz
602f1c7ecb utils/str.py: Use classes Multiple* instead of lambda functions.
As in Python 3, functions are bound to a class when assigned to an attribute,
lambda functions get two parameters, unless they are decorated with classmethod().
And there is no reason to ask plugin developpers use this decorator, while we
avoid them doing this (more over, it is not obvious to debug if they forgot it).
2012-08-04 13:52:02 +02:00
Valentin Lorentz
d52e501ae8 Use open() instead of file(). 2012-08-04 13:13:16 +02:00
Valentin Lorentz
fa35a07941 Add utils.str.multipleRemover. 2012-08-04 11:27:50 +02:00
Valentin Lorentz
fffccb4600 Add utils.str.multipleReplacer. 2012-08-04 11:27:41 +02:00
Valentin Lorentz
ef78c86974 Add configuration variable supybot.reply.format.url. 2012-07-31 13:12:33 +00:00
Guido Tabbernuk
7e002ed2a2 Fix normalizeWhitespace to support Unicode. 2012-07-29 11:45:27 +02:00
Valentin Lorentz
6286558fa5 Replace tabulations in utils.str.normalizeWhitespace. Closes GH-372. 2012-06-12 19:37:49 +02:00
Valentin Lorentz
a5e8f8ede8 Allow supybot.directories.backup to be /dev/null. 2012-03-15 20:22:46 +01:00
James McCoy
d1df9e8306 Use socket.inet_aton for isIPV4 since Windows doesn't (always?) have inet_pton
Closes: Sf#3430008
Signed-off-by: James McCoy <jamessan@users.sourceforge.net>

Conflicts:

	src/utils/net.py
2011-12-13 18:05:14 +01:00
James McCoy
ca23cbb774 Merge branch 'maint/0.83.4' 2011-12-06 01:18:18 -05:00
James McCoy
360a2036ac Use socket.inet_aton for isIPV4 since Windows doesn't (always?) have inet_pton
Closes: Sf#3430008
Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2011-12-05 22:48:09 -05:00
James McCoy
8b73f78b3e Merge branch 'maint/0.83.4'
Conflicts:
	plugins/Misc/plugin.py
	src/ircutils.py

Signed-off-by: James McCoy <jamessan@users.sourceforge.net>
2011-11-13 15:26:19 -05:00
Valentin Lorentz
08405c6ec5 Fix Windows support (broken in 543e7882). 2011-10-29 14:46:35 +02:00
Valentin Lorentz
be585ecea9 Merge remote-tracking branch 'supybot/maint/0.83.4' into testing
Conflicts:
	src/ircutils.py
2011-08-23 16:41:52 +02:00
Valentin Lorentz
5215aa1095 Move http server from src/utils/ to src/ 2011-07-01 16:15:04 +02:00
Valentin Lorentz
efc30a4ed2 Fix traceback when sending POST requests to the 404 error handler. 2011-06-30 00:58:46 +02:00
Valentin Lorentz
509a6c1780 Forgot a debug print in httpserver.py 2011-06-25 16:28:49 +02:00
Valentin Lorentz
4df4977a76 Internationalize strings in the HTTP server. Closes GH-29. 2011-06-25 14:27:44 +02:00
Valentin Lorentz
fc41fc6153 Add support for POST and HEAD requests to the HTTP server. 2011-06-25 11:37:10 +02:00
Valentin Lorentz
fa3fc7d20a Fix exception when stopping the HTTP server if already stopped. 2011-06-25 10:02:30 +02:00
Valentin Lorentz
b9baa579fe Bug fix in HTTP server. 2011-06-24 16:26:32 +02:00
Valentin Lorentz
667d7c34b4 Bug fixes to the HTTP server 2011-06-24 15:32:22 +02:00
Valentin Lorentz
ef5438e937 Add docstrings to the HTTP server callbacks 2011-06-24 14:52:01 +02:00
Valentin Lorentz
13e4f45e30 Add an embedded HTTP server to Supybot. 2011-06-24 14:31:29 +02:00
James Vega
543e78828b Add utils.net.isIPV4, with utils.net.isIP checking v4 or v6
Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2011-06-06 21:44:15 -04:00
Valentin Lorentz
d6cd8a5427 Fix email regexp to be RFC-compliant 2011-05-03 20:23:20 +02:00
Daniel Folkinshteyn
b306c5440f add damerau-levenshtein distance to supybot.utils.seq
use it in factoids invalid command to match possible typos
write tests for same.
2011-02-25 18:36:09 +01:00
Valentin Lorentz
ad2ad80263 Fix forgotten merge 2011-01-26 09:56:04 +01:00
Valentin Lorentz
17248b5d2c Merge branch 'testing' into unit-tests
Conflicts:
	src/utils/str.py
2011-01-22 10:29:22 +01:00
Valentin Lorentz
e4cced8364 Fix depluralize. 2011-01-22 10:28:27 +01:00
Valentin Lorentz
4649188b96 Fix detection of .42 domains 2011-01-02 13:22:54 +01:00
Valentin Lorentz
83aca7c651 Merge branch 'testing' 2010-12-22 18:12:28 +01:00
Valentin Lorentz
a58e270516 Fix issue with Pypy 2010-12-12 14:22:44 +01:00
Valentin Lorentz
f2a0b60e79 Fix unicode bug 2010-11-28 17:47:38 +01:00
Valentin Lorentz
4ea359d503 Merge branch 'l10n-fr' into testing 2010-11-11 12:03:04 +01:00
Valentin Lorentz
323ffe1a1f i18n: Fix internationalization problems 2010-11-11 12:01:56 +01:00
Valentin Lorentz
52b701526d Merge branch 'l10n-fr' into testing 2010-11-01 15:02:05 +01:00
Valentin Lorentz
30a1ca06b2 Fix the @Misc help formatting
Stop removing the \n in the translated docstrings
2010-11-01 15:01:50 +01:00
Valentin Lorentz
0410cf3d0d Merge branch 'l10n-fr' into testing 2010-11-01 11:49:11 +01:00
Valentin Lorentz
a2c8c613db Bug fix (didn't keep any beginning or ending space) 2010-11-01 11:47:19 +01:00
Valentin Lorentz
27bb53b560 Merge branch 'l10n-fr' into testing 2010-10-30 21:41:44 +02:00
Valentin Lorentz
3ea8115095 Internationalize src/utils/str.py and modify src/i18n.py to fit this changes 2010-10-30 21:10:49 +02:00
Valentin Lorentz
5f2699b2c0 Merge branch 'l10n-fr' into testing 2010-10-30 12:15:09 +02:00
Valentin Lorentz
b85d289bbb Fix wrong method name 2010-10-30 12:14:54 +02:00
Valentin Lorentz
5e09a9c887 Merge branch 'l10n-fr' into testing 2010-10-30 12:11:29 +02:00
Valentin Lorentz
ec6a267c09 Internationalize more functions in src/utils/str.py 2010-10-29 15:31:36 +02:00
Valentin Lorentz
e8bc966827 Add locale abitrary code
Add the capability for Supybot to load code depending on the locale
src/utils/str.py now imports pluralize and depluralize from this code
2010-10-28 17:28:27 +02:00
Valentin Lorentz
b7651b06a1 Merge branch 'l10n-fr' into testing 2010-10-28 15:45:51 +02:00
Valentin Lorentz
f3a579f3da Add the '<empty>' feature to nItems, and changed ChannelStats localization in order to use it as bug fixer 2010-10-28 15:18:06 +02:00
Valentin Lorentz
8be4aaeff1 Merge branch 'readability' 2010-10-23 10:38:52 +02:00
Valentin Lorentz
e556fbde2e Added %S to format() 2010-10-16 11:37:10 +02:00
Valentin Lorentz
50acd3d8d9 Creating the internationalization module and internationalize/localize ChannelStats into French 2010-10-09 11:36:22 +02:00
James Vega
0abe22f5d1 Merge branch 'maint/0.83.4' 2010-09-08 23:50:35 -04:00
James Vega
b0575cec88 Handle changes to fnmatch.translate in Python 2.6
Define utils.python.glob2re based on the Python version being used.
Use glob2re in Todo and Note plugins.

Closes: Sf#3059292
Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2010-09-08 23:31:01 -04:00
James Vega
a6857ce9bf utils/web.py: Only try catching socket.sslerror if built with SSL support
Closes: Sf#2998820

Signed-off-by: James Vega <jamessan@users.sourceforge.net>
(cherry picked from commit f03a3f6c85)
2010-08-24 19:49:30 -04:00
James Vega
f0852a9e45 utils.web: Provide access to the raw httpUrlRe/urlRe strings
Using the compiled regexps for a PluginRegexp method's __doc__ doesn't work.

Closes Sourceforge #2879862

Signed-off-by: James Vega <jamessan@users.sourceforge.net>
(cherry picked from commit 25fc2de643)
2010-08-24 19:14:58 -04:00
Ricky Zhou
6299ef5c22 Account for negative times in timeElapsed.
Signed-off-by: James Vega <jamessan@users.sourceforge.net>
(cherry picked from commit aa2337791a)
2010-08-24 19:02:16 -04:00
James Vega
f03a3f6c85 utils/web.py: Only try catching socket.sslerror if built with SSL support
Closes: Sf#2998820

Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2010-05-24 15:44:25 -04:00
James Vega
25fc2de643 utils.web: Provide access to the raw httpUrlRe/urlRe strings
Using the compiled regexps for a PluginRegexp method's __doc__ doesn't work.

Closes Sourceforge #2879862

Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2009-10-15 22:16:38 -04:00
James Vega
c5896ff6cb utils.web: Import urllib's urlencode into our namespace.
Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2009-09-29 19:54:07 -04:00
James Vega
de79e679f4 Add a data kwarg to getUrl(Fd) a la urllib2.Request.
This allows plugins to easily make POST requests using our getUrl(Fd)
functions.

Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2009-09-16 01:17:33 -04:00
Štěpán Němec
a66034f852 Fix some typos/wordings.
Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2009-08-26 16:34:12 -04:00
Ricky Zhou
aa2337791a Account for negative times in timeElapsed.
Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2009-07-20 16:07:51 -04:00
Jeremy Fincher
43129239d6 Added Seen.since, which lets a user see messages which were sent since the last time he parted a channel. 2009-07-01 15:40:58 -05:00
Ricky Zhou
fa3a2dd23b Allow nItems to take longs as well.
Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2009-05-19 00:58:07 -04:00
Jeremy Fincher
757991afc9 Added basic CacheDict with simple test. 2009-04-02 11:28:57 -05:00
James Vega
6b6861f884 Don't specify globals as a kwarg; only in 2.5+
Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2009-03-22 13:47:42 -04:00
James Vega
58d308b54d Fix perlReToReplacer when \ is used in the replacement
Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2009-03-12 17:17:20 -04:00
James Vega
ecd2c63650 Make universalImport support 'from ModuleA import ModuleB'
Signed-off-by: James Vega <jamessan@users.sourceforge.net>
2009-03-11 15:55:08 -04:00
Jeremy Fincher
a86b4694d7 Added utils.python.universalImport to make the previous idiom cleaner. 2009-03-11 14:05:53 -04:00
James Vega
0c42ea111a Fix our RE parsing to handle multiple backslashes before the separator
This also adds support for using brace pairs ({}, [], (), <>) as the
separators for m//.
2009-03-11 13:37:27 -04:00
James Vega
e787c7aa49 Clarify comment about timestamp() override 2009-03-11 13:37:26 -04:00
James Vega
3d5c877f80 Finally fix the XXX we had for httpUrlRe and urlRe 2009-03-11 13:37:26 -04:00
James Vega
828d41e37d Add utils/crypt.py as a Python version-agnostic crypt module 2009-03-11 13:37:26 -04:00
James Vega
880cce5505 src/utils/str.format: Recognize digits before the '.' in %f formatting. 2006-04-06 04:01:11 +00:00
James Vega
a3e4fc5b1d Change the modeline to use softtabstop instead of tabstop. 2006-02-11 15:52:51 +00:00
James Vega
9cb1669b5f src/utils/web: Add another "UNKNOWN_HOST" code to catch. 2005-10-14 12:59:47 +00:00
James Vega
ef3e002db3 src/utils/net: Fix our method of determining whether an IPV6 or IP socket is needed. 2005-08-22 18:52:37 +00:00
Jeremy Fincher
f8156cc9cc Removed TupleSubclass, which wasn't being used. 2005-07-21 18:32:41 +00:00
Jeremy Fincher
1aa73acd8d Removed Acquire, which I won't be using anymore. 2005-07-21 05:04:31 +00:00
Jeremy Fincher
77330d496a Moved an XXX and added a skeleton method. 2005-07-18 04:55:12 +00:00
Jeremy Fincher
fc87901a89 Added some more XXXes for dangerfan. 2005-07-18 04:46:41 +00:00