[DAS] problems in all public DAS servers
Andrew Dalke
dalke@dalkescientific.com
Thu, 29 Aug 2002 01:26:40 -0600
This is a multi-part message in MIME format.
--Multipart_Thu__29_Aug_2002_01:26:40_-0600_085e32d0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
[Oops, sent part of this email as an attachment of the previous one.]
When developing this client I found that all of the publically available
servers listed at
http://www.tigr.org/tdb/DAS/das_server_list.html
have problems. To get valid results I had to tweaked the DTDs to
support things like 'COLOR' and 'OUTLINECOI've implemented a DAS client
for Python.
List of public DAS servers and the problems I identified with them.
- http://servlet.sanger.ac.uk:8080/das
The stylesheet at
http://servlet.sanger.ac.uk:8080/das/mouse73/stylesheet
has some differences from the published DTD. For example, get the
file and you'll see a section which looks like
<TYPE id="transcript">
<GLYPH bumped="true">
<BOX>
<HEIGHT>15</HEIGHT>
<COLOR>green</COLOR>
<OUTLINECOLOR>black</OUTLINECOLOR>
<BROKEN>true</BROKEN> <!-- For XFF-DAS sparse locations -->
<LINEWIDTH>1</LINEWIDTH>
</BOX>
</GLYPH>
</TYPE>
I assume that COLOR should be FGCOLOR and OUTLINECOLOR be BGCOLOR.
However, the first changed with the 1.0 spec (says the log) and
the latter never existed.
See also that he has 'bumped' as a GLYPH attribute. This isn't defined
anywhere in the spec. Nor is the <BROKEN> element.
Already mentioned some of the problems with the XML not matching the
DTD. Also, it says it's using
X-DAS-Version: 1.52
which isn't allowed by the spec.
- http://genome.cse.ucsc.edu/cgi-bin/das/dsn
Why does that have a "dsn" at the end?
The server says it is running version "DAS/0.95".
Consider
http://genome.cse.ucsc.edu/cgi-bin/das/hg12/types?segment=chr1:1000,5000;
This contains
<GFF version="1.2" summary="yes" href="http://genome.cse.ucsc.edu/cgi-bin/das/hg12/types">
<SEGMENT id="chr1" start="1000" stop="5000" version="1.00">
<TYPE id="affyRatio" category="other" >0</TYPE>
The documentation says
> <GFF> (required; one only)
> There is a single <GFF> tag. Its version (required) attribute
> indicates the current version of the XML form of the General Feature
> Format. The current version is (arbitrarily) 1.0. The href (required)
> attribute echoes the URL query that was used to fetch the current
> document.
So the version is different ("1.2" instead of "1.0". In addition,
there is a GFF attributed 'summary' which is not listed in the DTD.
For my version of the DTD I added that as IMPLIED.
Take a look at
http://genome.cse.ucsc.edu/cgi-bin/das/hg12/types?type=all_sts_primer;type=sysMap
This returns
<?xml version="1.0" standalone="no"?>
<DASTYPES>
<GFF version="1.2" summary="yes" href="http://genome.cse.ucsc.edu/cgi-bin/das/hg12/types">
<SEGMENT version="1.00">
<TYPE id="all_sts_primer" category="other" >129864</TYPE>
</SEGMENT>
</GFF>
</DASTYPES>
According to the documentation for 'SEGMENT'
> The id, start, stop, and version attributes are required. The
> optional label attribute provides a human readable label for display
> purposes.
In this case, the SEGMENT contains only the version, and none of id,
start, nor stop.
- http://www.wormbase.org/db/das/dsn
Again, there's the '/dsn' at the end...
Without the '/dsn' this returns a text document.
With the '/dsn' it sends back the following:
=====================
HTTP/1.1 200 OK
Date: Fri, 23 Aug 2002 07:02:28 GMT
Server: Apache/1.3.26 (Unix) mod_perl/1.27
X-das-status: 200
X-das-version: DAS/0.999
Connection: close
Content-Type: text/plain; charset=ISO-8859-1
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE DASDSN SYSTEM "http://www.wormbase.org/dtd/dasdsn.dtd">
<DASDSN>
<DSN>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>200 OK</TITLE>
</HEAD><BODY>
<H1>OK</H1>
The server encountered an internal error or
misconfiguration and was unable to complete
your request.<P>
Please contact the server administrator,
webmaster@wormbase.org and inform them of the time the error occurred,
and anything you might have done that may have
caused the error.<P>
More information about this error may be available
in the server error log.<P>
<HR>
<ADDRESS>Apache/1.3.26 Server at www.wormbase.org Port 80</ADDRESS>
</BODY></HTML>
=====================
- http://stash.mrc-lmb.cam.ac.uk:8080/das
This is running 'X-DAS-Version: 0.999'.
I tried downloading a stylesheet from
http://stash.mrc-lmb.cam.ac.uk:8080/das/bernards_track/stylesheet
and got 0 bytes, but a 200 status.
And when I try to get
http://stash.mrc-lmb.cam.ac.uk:8080/das/exon_track/stylesheet
it hangs .. been waiting for about 15 minutes now. And I can't seem
to get 'bernards_track' stylesheet again. Nor even the 'dsn'. I
think I froze the server.
- http://genome.ornl.gov/das/das.cgi/dsn
The format of the URL also isn't to spec.
I can't even load the DSN because it contains elements which look like
<DSN>
<SOURCE id="lmon">Listeria monocytogenes strain EGD</SOURCE>
<MAPMASTER>http://genome.ornl.gov/das/das.cgi/lmon</MAPMASTER>
<DESCRIPTION href="http://www.ncbi.nlm.nih.gov/cgi-bin/Entrez/framik?db=Genome&gi=204">Listeria monocytogenes strain EGD</DESCRIPTION>
</DSN>
Specificallly, it fails because the '&' entity is supposed to be escaped
inside of XML. (Where it points to '&gi=204'.) The XML spec at
http://www.w3.org/TR/2000/REC-xml-20001006#AVNormalize
says:
> 3. For each character, entity reference, or character reference
> in the unnormalized attribute value, beginning with the first and
> continuing to the last, do the following:
> * For a character reference, append the referenced character to
> the normalized value.
>
> * For an entity reference, recursively apply step 3 of this algorithm
> to the replacement text of the entity.
>
> * For a white space character (#x20, #xD, #xA, #x9), append a
> space character (#x20) to the normalized value.
>
> * For another character, append the character to the normalized value.
And '&' is a character reference that should be escaped, even inside
of an attribute, because:
> The ampersand character (&) and the left angle bracket (<) may
> appear in their literal form only when used as markup delimiters, or
> within a comment, a processing instruction, or a CDATA section. If
> they are needed elsewhere, they must be escaped using either numeric
> character references or the strings "&" and "<" respectively.
- http://das.bcgsc.ca:8080/das
Connection refused.
- http://gadfly.gen.cam.ac.uk:8080/das
Connection refused.
- http://tomcat.molgen.mpg.de:8080/das
Also running 'X-DAS-Version: 1.52'
The stylesheet for 'CNBs' is
404: Bad stylesheet (requested stylesheet unknown)
entry_points for that gives a '501: Unimplemented feature'
As do other entry points.
Asking for 'EPD_Mouse's DNA also gives a 501.
Asking for 'EPD_Mouse's types (giving it no parameters) gives a
SEGMENT without the required 'id' attribute, as in:
<?xml version='1.0' standalone='no' ?>
<!DOCTYPE DASTYPES SYSTEM 'dastypes.dtd' >
<DASTYPES>
<GFF version="1.0" href="http://tomcat.molgen.mpg.de:8080/das/EPD_Mouse/types">
<SEGMENT version="1.0">
<TYPE id="null" />
</SEGMENT>
</GFF>
</DASTYPES>
- http://eugenes.org/cgi-bin/srsdas/dsn
Says it's moved to http://eugenes.org:8089/cgi-bin/srsdas
which is moved to http://eugenes.org:7180/cgi-bin/srsdas
This is using "x-das-version: DAS/1.50".
Like the wormbase.org one above, when I ask for
http://eugenes.org/cgi-bin/srsdas/dsn/human/entry_points
I get the DSN output, as in
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE DASDSN SYSTEM "http://www.biodas.org/dtd/dasdsn.dtd">
<DASDSN>
<DSN>
<SOURCE id="fly">fly</SOURCE>
<MAPMASTER>http://eugenes.org:7180/cgi-bin/srsdas/fly</MAPMASTER>
<DESCRIPTION>Drosophila melanogaster annotations from euGenes summary service</DESCRIPTION>
</DSN>
....
When I access http://eugenes.org:7180/cgi-bin/srsdas/human/dna
I get
<?xml version="1.0" standalone="yes"?
<!DOCTYPE DASDNA SYSTEM "http://www.wormbase.org/dtd/dasdna.dtd">
<DASDNA>
</DASDNA>
but the documentation and DTD say there must be a 'SEQUENCE' tag.
- http://www.tigr.org/docs/tigr-scripts/tgi/das/dsn
This returns a header of the form
X-das-version: DAS/0.996
X-das-status: 200 OK
The spec says
> The second line is X-DAS-Status and contains a three digit status
> code which indicates the outcome of the request.
In this case the three digit code is followed by a text message.
However, this is more similar to the HTTP spec, which defines its
staus line as:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1
> 6.1 Status-Line
>
> The first line of a Response message is the Status-Line, consisting
> of the protocol version followed by a numeric status code and its
> associated textual phrase, with each element separated by SP
> characters. No CR or LF is allowed except in the final CRLF
> sequence.
>
> Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
>
> 6.1.1 Status Code and Reason Phrase
>
> The Status-Code element is a 3-digit integer result code of the
> attempt to understand and satisfy the request. These codes are fully
> defined in section 10. The Reason-Phrase is intended to give a short
> textual description of the Status-Code. The Status-Code is intended
> for use by automata and the Reason-Phrase is intended for the human
> user. The client is not required to examine or display the Reason-
> Phrase.
When I ask for the 'entry_points' of 'elegansgenes' I got a regular
HTTP 404 "Not Found", as from
http://www.tigr.org/docs/tigr-scripts/tgi/das/elegansgenes/entry_points
whereas it works with arabidopsis.
http://www.tigr.org/docs/tigr-scripts/tgi/das/arabidopsis/entry_points
I didn't look into this server any further.
LOR' which are pre-1.0 spec
and added a few other things as I found them. Another has 'X-DAS-Status'
line with descriptive text after the 3 digit status number. Still
others return syntactically invalid XML or simply implement the wrong
function (a couple return the DASDSN for 'entry_points'!).
I've attached a list of all the problems I found, and there could
be more I didn't find.
This implies at least one of several things:
- no one is using DAS;
- people add special code to handle errors they find in others'
servers, but don't bother to inform people about those errors;
- one group writes a client and a server, so they are designed to work
with each other, but not necessarily meet the spec. Then this
code is distributed for other groups to use, not realizing
that the code doesn't meet spec
- people with different client/server code bases don't test for
interoperability;
- people aren't using tools which make it easy to handle XML, like
a DTD -> XML parser generator (like JAXB for Java), which would have
pointed out that the DTDs and XML didn't match;
- people are using XML tools which (incorrectly) parse non-XML
instead of giving an error. Eg, this is not valid XML
<DESCRIPTION
href="http://www.ncbi.nlm.nih.gov/cgi-bin/Entrez/framik?db=Genome&gi=204">
Listeria monocytogenes strain EGD</DESCRIPTION>
because the '&' *must* be escaped -- otherwise it's the undeclared
entity '&gi' and the XML is not "well-formed."
- people aren't even using the right tools to generate the XML
in the first place.
- there isn't a decent regression suite for any of DAS
In any case, it worries me. It also shows that the belief "XML makes
the parsing problem disappear" just ain't true.
If I were to write a client-side regression suite, would people here
use it? At the beginning it would make a set of calls to an arbitrary
server to test that the requests are answered in the correct format,
and do some minimal integrity checks (like that 'dna' of size 500
should return 500).
I also found problems in the spec and DTDs, and have told Lincoln
about them. He's worked to update things appropriately.
Andrew
dalke@dalkescientific.com
--Multipart_Thu__29_Aug_2002_01:26:40_-0600_085e32d0
Content-Type: text/plain;
name="problems.txt"
Content-Disposition: attachment;
filename="problems.txt"
Content-Transfer-Encoding: base64
SSd2ZSBpbXBsZW1lbnRlZCBhIERBUyBjbGllbnQgZm9yIFB5dGhvbi4KCgoKTGlzdCBvZiBwdWJs
aWMgREFTIHNlcnZlcnMgYW5kIHRoZSBwcm9ibGVtcyBJIGlkZW50aWZpZWQgd2l0aCB0aGVtLgoK
CiAgLSAgaHR0cDovL3NlcnZsZXQuc2FuZ2VyLmFjLnVrOjgwODAvZGFzCgpUaGUgc3R5bGVzaGVl
dCBhdAogICBodHRwOi8vc2VydmxldC5zYW5nZXIuYWMudWs6ODA4MC9kYXMvbW91c2U3My9zdHls
ZXNoZWV0CgpoYXMgc29tZSBkaWZmZXJlbmNlcyBmcm9tIHRoZSBwdWJsaXNoZWQgRFRELiAgRm9y
IGV4YW1wbGUsIGdldCB0aGUKZmlsZSBhbmQgeW91J2xsIHNlZSBhIHNlY3Rpb24gd2hpY2ggbG9v
a3MgbGlrZQoKCiAgICAgIDxUWVBFIGlkPSJ0cmFuc2NyaXB0Ij4KICAgICAgICA8R0xZUEggYnVt
cGVkPSJ0cnVlIj4KICAgICAgICAgIDxCT1g+CiAgICAgICAgICAgIDxIRUlHSFQ+MTU8L0hFSUdI
VD4KICAgICAgICAgICAgPENPTE9SPmdyZWVuPC9DT0xPUj4KICAgICAgICAgICAgPE9VVExJTkVD
T0xPUj5ibGFjazwvT1VUTElORUNPTE9SPgogICAgICAgICAgICA8QlJPS0VOPnRydWU8L0JST0tF
Tj4gICAgIDwhLS0gRm9yIFhGRi1EQVMgc3BhcnNlIGxvY2F0aW9ucyAtLT4KICAgICAgICAgICAg
PExJTkVXSURUSD4xPC9MSU5FV0lEVEg+CiAgICAgICAgICA8L0JPWD4KICAgICAgICA8L0dMWVBI
PgogICAgICA8L1RZUEU+CgpJIGFzc3VtZSB0aGF0IENPTE9SIHNob3VsZCBiZSBGR0NPTE9SIGFu
ZCBPVVRMSU5FQ09MT1IgYmUgQkdDT0xPUi4KSG93ZXZlciwgdGhlIGZpcnN0IGNoYW5nZWQgd2l0
aCB0aGUgMS4wIHNwZWMgKHNheXMgdGhlIGxvZykgYW5kCnRoZSBsYXR0ZXIgbmV2ZXIgZXhpc3Rl
ZC4KCgpTZWUgYWxzbyB0aGF0IGhlIGhhcyAnYnVtcGVkJyBhcyBhIEdMWVBIIGF0dHJpYnV0ZS4g
IFRoaXMgaXNuJ3QgZGVmaW5lZAphbnl3aGVyZSBpbiB0aGUgc3BlYy4gIE5vciBpcyB0aGUgPEJS
T0tFTj4gZWxlbWVudC4KCgoKCgoKCgpBbHJlYWR5IG1lbnRpb25lZCBzb21lIG9mIHRoZSBwcm9i
bGVtcyB3aXRoIHRoZSBYTUwgbm90IG1hdGNoaW5nIHRoZQpEVEQuICBBbHNvLCBpdCBzYXlzIGl0
J3MgdXNpbmcKCiAgWC1EQVMtVmVyc2lvbjogMS41MgoKd2hpY2ggaXNuJ3QgYWxsb3dlZCBieSB0
aGUgc3BlYy4KCiAgLSAgaHR0cDovL2dlbm9tZS5jc2UudWNzYy5lZHUvY2dpLWJpbi9kYXMvZHNu
CgpXaHkgZG9lcyB0aGF0IGhhdmUgYSAiZHNuIiBhdCB0aGUgZW5kPwoKVGhlIHNlcnZlciBzYXlz
IGl0IGlzIHJ1bm5pbmcgdmVyc2lvbiAiREFTLzAuOTUiLgoKQ29uc2lkZXIKIGh0dHA6Ly9nZW5v
bWUuY3NlLnVjc2MuZWR1L2NnaS1iaW4vZGFzL2hnMTIvdHlwZXM/c2VnbWVudD1jaHIxOjEwMDAs
NTAwMDsKClRoaXMgY29udGFpbnMKCjxHRkYgdmVyc2lvbj0iMS4yIiBzdW1tYXJ5PSJ5ZXMiIGhy
ZWY9Imh0dHA6Ly9nZW5vbWUuY3NlLnVjc2MuZWR1L2NnaS1iaW4vZGFzL2hnMTIvdHlwZXMiPgo8
U0VHTUVOVCBpZD0iY2hyMSIgc3RhcnQ9IjEwMDAiIHN0b3A9IjUwMDAiIHZlcnNpb249IjEuMDAi
Pgo8VFlQRSBpZD0iYWZmeVJhdGlvIiBjYXRlZ29yeT0ib3RoZXIiID4wPC9UWVBFPgoKClRoZSBk
b2N1bWVudGF0aW9uIHNheXMKCj4gPEdGRj4gKHJlcXVpcmVkOyBvbmUgb25seSkKPiBUaGVyZSBp
cyBhIHNpbmdsZSA8R0ZGPiB0YWcuIEl0cyB2ZXJzaW9uIChyZXF1aXJlZCkgYXR0cmlidXRlCj4g
aW5kaWNhdGVzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIFhNTCBmb3JtIG9mIHRoZSBHZW5l
cmFsIEZlYXR1cmUKPiBGb3JtYXQuIFRoZSBjdXJyZW50IHZlcnNpb24gaXMgKGFyYml0cmFyaWx5
KSAxLjAuIFRoZSBocmVmIChyZXF1aXJlZCkKPiBhdHRyaWJ1dGUgZWNob2VzIHRoZSBVUkwgcXVl
cnkgdGhhdCB3YXMgdXNlZCB0byBmZXRjaCB0aGUgY3VycmVudAo+IGRvY3VtZW50LgoKU28gdGhl
IHZlcnNpb24gaXMgZGlmZmVyZW50ICgiMS4yIiBpbnN0ZWFkIG9mICIxLjAiLiAgSW4gYWRkaXRp
b24sCnRoZXJlIGlzIGEgR0ZGIGF0dHJpYnV0ZWQgJ3N1bW1hcnknIHdoaWNoIGlzIG5vdCBsaXN0
ZWQgaW4gdGhlIERURC4KRm9yIG15IHZlcnNpb24gb2YgdGhlIERURCBJIGFkZGVkIHRoYXQgYXMg
SU1QTElFRC4KCgpUYWtlIGEgbG9vayBhdAogaHR0cDovL2dlbm9tZS5jc2UudWNzYy5lZHUvY2dp
LWJpbi9kYXMvaGcxMi90eXBlcz90eXBlPWFsbF9zdHNfcHJpbWVyO3R5cGU9c3lzTWFwCgpUaGlz
IHJldHVybnMKCjw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KPERBU1RZUEVT
Pgo8R0ZGIHZlcnNpb249IjEuMiIgc3VtbWFyeT0ieWVzIiBocmVmPSJodHRwOi8vZ2Vub21lLmNz
ZS51Y3NjLmVkdS9jZ2ktYmluL2Rhcy9oZzEyL3R5cGVzIj4KPFNFR01FTlQgdmVyc2lvbj0iMS4w
MCI+CjxUWVBFIGlkPSJhbGxfc3RzX3ByaW1lciIgY2F0ZWdvcnk9Im90aGVyIiA+MTI5ODY0PC9U
WVBFPgo8L1NFR01FTlQ+CjwvR0ZGPgo8L0RBU1RZUEVTPgoKCkFjY29yZGluZyB0byB0aGUgZG9j
dW1lbnRhdGlvbiBmb3IgJ1NFR01FTlQnCgo+IFRoZSBpZCwgc3RhcnQsIHN0b3AsIGFuZCB2ZXJz
aW9uIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkLiBUaGUKPiBvcHRpb25hbCBsYWJlbCBhdHRyaWJ1
dGUgcHJvdmlkZXMgYSBodW1hbiByZWFkYWJsZSBsYWJlbCBmb3IgZGlzcGxheQo+IHB1cnBvc2Vz
LgoKSW4gdGhpcyBjYXNlLCB0aGUgU0VHTUVOVCBjb250YWlucyBvbmx5IHRoZSB2ZXJzaW9uLCBh
bmQgbm9uZSBvZiBpZCwKc3RhcnQsIG5vciBzdG9wLgoKCgogIC0gIGh0dHA6Ly93d3cud29ybWJh
c2Uub3JnL2RiL2Rhcy9kc24KCkFnYWluLCB0aGVyZSdzIHRoZSAnL2RzbicgYXQgdGhlIGVuZC4u
LgoKV2l0aG91dCB0aGUgJy9kc24nIHRoaXMgcmV0dXJucyBhIHRleHQgZG9jdW1lbnQuCldpdGgg
dGhlICcvZHNuJyBpdCBzZW5kcyBiYWNrIHRoZSBmb2xsb3dpbmc6CiA9PT09PT09PT09PT09PT09
PT09PT0KSFRUUC8xLjEgMjAwIE9LCkRhdGU6IEZyaSwgMjMgQXVnIDIwMDIgMDc6MDI6MjggR01U
ClNlcnZlcjogQXBhY2hlLzEuMy4yNiAoVW5peCkgbW9kX3BlcmwvMS4yNwpYLWRhcy1zdGF0dXM6
IDIwMApYLWRhcy12ZXJzaW9uOiBEQVMvMC45OTkKQ29ubmVjdGlvbjogY2xvc2UKQ29udGVudC1U
eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTEKCjw/eG1sIHZlcnNpb249IjEuMCIg
c3RhbmRhbG9uZT0ieWVzIj8+CjwhRE9DVFlQRSBEQVNEU04gU1lTVEVNICJodHRwOi8vd3d3Lndv
cm1iYXNlLm9yZy9kdGQvZGFzZHNuLmR0ZCI+CjxEQVNEU04+CiAgIDxEU04+CjwhRE9DVFlQRSBI
VE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+CjxIVE1MPjxIRUFEPgo8VElU
TEU+MjAwIE9LPC9USVRMRT4KPC9IRUFEPjxCT0RZPgo8SDE+T0s8L0gxPgpUaGUgc2VydmVyIGVu
Y291bnRlcmVkIGFuIGludGVybmFsIGVycm9yIG9yCm1pc2NvbmZpZ3VyYXRpb24gYW5kIHdhcyB1
bmFibGUgdG8gY29tcGxldGUKeW91ciByZXF1ZXN0LjxQPgpQbGVhc2UgY29udGFjdCB0aGUgc2Vy
dmVyIGFkbWluaXN0cmF0b3IsCiB3ZWJtYXN0ZXJAd29ybWJhc2Uub3JnIGFuZCBpbmZvcm0gdGhl
bSBvZiB0aGUgdGltZSB0aGUgZXJyb3Igb2NjdXJyZWQsCmFuZCBhbnl0aGluZyB5b3UgbWlnaHQg
aGF2ZSBkb25lIHRoYXQgbWF5IGhhdmUKY2F1c2VkIHRoZSBlcnJvci48UD4KTW9yZSBpbmZvcm1h
dGlvbiBhYm91dCB0aGlzIGVycm9yIG1heSBiZSBhdmFpbGFibGUKaW4gdGhlIHNlcnZlciBlcnJv
ciBsb2cuPFA+CjxIUj4KPEFERFJFU1M+QXBhY2hlLzEuMy4yNiBTZXJ2ZXIgYXQgd3d3Lndvcm1i
YXNlLm9yZyBQb3J0IDgwPC9BRERSRVNTPgo8L0JPRFk+PC9IVE1MPgogPT09PT09PT09PT09PT09
PT09PT09CgoKICAtICBodHRwOi8vc3Rhc2gubXJjLWxtYi5jYW0uYWMudWs6ODA4MC9kYXMKClRo
aXMgaXMgcnVubmluZyAnWC1EQVMtVmVyc2lvbjogMC45OTknLgoKSSB0cmllZCBkb3dubG9hZGlu
ZyBhIHN0eWxlc2hlZXQgZnJvbQogaHR0cDovL3N0YXNoLm1yYy1sbWIuY2FtLmFjLnVrOjgwODAv
ZGFzL2Jlcm5hcmRzX3RyYWNrL3N0eWxlc2hlZXQKYW5kIGdvdCAwIGJ5dGVzLCBidXQgYSAyMDAg
c3RhdHVzLgoKQW5kIHdoZW4gSSB0cnkgdG8gZ2V0CiBodHRwOi8vc3Rhc2gubXJjLWxtYi5jYW0u
YWMudWs6ODA4MC9kYXMvZXhvbl90cmFjay9zdHlsZXNoZWV0Cml0IGhhbmdzIC4uIGJlZW4gd2Fp
dGluZyBmb3IgYWJvdXQgMTUgbWludXRlcyBub3cuICBBbmQgSSBjYW4ndCBzZWVtCnRvIGdldCAn
YmVybmFyZHNfdHJhY2snIHN0eWxlc2hlZXQgYWdhaW4uICBOb3IgZXZlbiB0aGUgJ2RzbicuICBJ
CnRoaW5rIEkgZnJvemUgdGhlIHNlcnZlci4KCgogIC0gIGh0dHA6Ly9nZW5vbWUub3JubC5nb3Yv
ZGFzL2Rhcy5jZ2kvZHNuCgpUaGUgZm9ybWF0IG9mIHRoZSBVUkwgYWxzbyBpc24ndCB0byBzcGVj
LgoKSSBjYW4ndCBldmVuIGxvYWQgdGhlIERTTiBiZWNhdXNlIGl0IGNvbnRhaW5zIGVsZW1lbnRz
IHdoaWNoIGxvb2sgbGlrZQoKICA8RFNOPgogICAgPFNPVVJDRSBpZD0ibG1vbiI+TGlzdGVyaWEg
bW9ub2N5dG9nZW5lcyBzdHJhaW4gRUdEPC9TT1VSQ0U+CiAgICA8TUFQTUFTVEVSPmh0dHA6Ly9n
ZW5vbWUub3JubC5nb3YvZGFzL2Rhcy5jZ2kvbG1vbjwvTUFQTUFTVEVSPgogICAgPERFU0NSSVBU
SU9OIGhyZWY9Imh0dHA6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9jZ2ktYmluL0VudHJlei9mcmFt
aWs/ZGI9R2Vub21lJmdpPTIwNCI+TGlzdGVyaWEgbW9ub2N5dG9nZW5lcyBzdHJhaW4gRUdEPC9E
RVNDUklQVElPTj4KICA8L0RTTj4KClNwZWNpZmljYWxsbHksIGl0IGZhaWxzIGJlY2F1c2UgdGhl
ICcmJyBlbnRpdHkgaXMgc3VwcG9zZWQgdG8gYmUgZXNjYXBlZAppbnNpZGUgb2YgWE1MLiAgKFdo
ZXJlIGl0IHBvaW50cyB0byAnJmdpPTIwNCcuKSAgVGhlIFhNTCBzcGVjIGF0CiAgaHR0cDovL3d3
dy53My5vcmcvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2I0FWTm9ybWFsaXplCnNheXM6Cgo+ICAg
IDMuIEZvciBlYWNoIGNoYXJhY3RlciwgZW50aXR5IHJlZmVyZW5jZSwgb3IgY2hhcmFjdGVyIHJl
ZmVyZW5jZQo+IGluIHRoZSB1bm5vcm1hbGl6ZWQgYXR0cmlidXRlIHZhbHVlLCBiZWdpbm5pbmcg
d2l0aCB0aGUgZmlyc3QgYW5kCj4gY29udGludWluZyB0byB0aGUgbGFzdCwgZG8gdGhlIGZvbGxv
d2luZzoKPiAgICAgICogRm9yIGEgY2hhcmFjdGVyIHJlZmVyZW5jZSwgYXBwZW5kIHRoZSByZWZl
cmVuY2VkIGNoYXJhY3RlciB0bwo+ICAgICAgICAgIHRoZSBub3JtYWxpemVkIHZhbHVlLgo+IAo+
ICAgICAgKiBGb3IgYW4gZW50aXR5IHJlZmVyZW5jZSwgcmVjdXJzaXZlbHkgYXBwbHkgc3RlcCAz
IG9mIHRoaXMgYWxnb3JpdGhtCj4gICAgICAgICAgdG8gdGhlIHJlcGxhY2VtZW50IHRleHQgb2Yg
dGhlIGVudGl0eS4KPiAKPiAgICAgICogRm9yIGEgd2hpdGUgc3BhY2UgY2hhcmFjdGVyICgjeDIw
LCAjeEQsICN4QSwgI3g5KSwgYXBwZW5kIGEKPiAgICAgICAgICBzcGFjZSBjaGFyYWN0ZXIgKCN4
MjApIHRvIHRoZSBub3JtYWxpemVkIHZhbHVlLgo+IAo+ICAgICAgKiBGb3IgYW5vdGhlciBjaGFy
YWN0ZXIsIGFwcGVuZCB0aGUgY2hhcmFjdGVyIHRvIHRoZSBub3JtYWxpemVkIHZhbHVlLgoKQW5k
ICcmJyBpcyBhIGNoYXJhY3RlciByZWZlcmVuY2UgdGhhdCBzaG91bGQgYmUgZXNjYXBlZCwgZXZl
biBpbnNpZGUKb2YgYW4gYXR0cmlidXRlLCBiZWNhdXNlOgoKPiBUaGUgYW1wZXJzYW5kIGNoYXJh
Y3RlciAoJikgYW5kIHRoZSBsZWZ0IGFuZ2xlIGJyYWNrZXQgKDwpIG1heQo+IGFwcGVhciBpbiB0
aGVpciBsaXRlcmFsIGZvcm0gb25seSB3aGVuIHVzZWQgYXMgbWFya3VwIGRlbGltaXRlcnMsIG9y
Cj4gd2l0aGluIGEgY29tbWVudCwgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLCBvciBhIENEQVRB
IHNlY3Rpb24uIElmCj4gdGhleSBhcmUgbmVlZGVkIGVsc2V3aGVyZSwgdGhleSBtdXN0IGJlIGVz
Y2FwZWQgdXNpbmcgZWl0aGVyIG51bWVyaWMKPiBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBvciB0aGUg
c3RyaW5ncyAiJmFtcDsiIGFuZCAiJmx0OyIgcmVzcGVjdGl2ZWx5LgoKCiAgLSAgaHR0cDovL2Rh
cy5iY2dzYy5jYTo4MDgwL2RhcwoKQ29ubmVjdGlvbiByZWZ1c2VkLgoKICAtICBodHRwOi8vZ2Fk
Zmx5Lmdlbi5jYW0uYWMudWs6ODA4MC9kYXMKCkNvbm5lY3Rpb24gcmVmdXNlZC4KCiAgLSAgaHR0
cDovL3RvbWNhdC5tb2xnZW4ubXBnLmRlOjgwODAvZGFzCgpBbHNvIHJ1bm5pbmcgJ1gtREFTLVZl
cnNpb246IDEuNTInCgpUaGUgc3R5bGVzaGVldCBmb3IgJ0NOQnMnIGlzCiAgIDQwNDogQmFkIHN0
eWxlc2hlZXQgKHJlcXVlc3RlZCBzdHlsZXNoZWV0IHVua25vd24pCgplbnRyeV9wb2ludHMgZm9y
IHRoYXQgZ2l2ZXMgYSAnNTAxOiBVbmltcGxlbWVudGVkIGZlYXR1cmUnCkFzIGRvIG90aGVyIGVu
dHJ5IHBvaW50cy4KCkFza2luZyBmb3IgJ0VQRF9Nb3VzZSdzIEROQSBhbHNvIGdpdmVzIGEgNTAx
LgoKQXNraW5nIGZvciAnRVBEX01vdXNlJ3MgdHlwZXMgKGdpdmluZyBpdCBubyBwYXJhbWV0ZXJz
KSBnaXZlcyBhClNFR01FTlQgd2l0aG91dCB0aGUgcmVxdWlyZWQgJ2lkJyBhdHRyaWJ1dGUsIGFz
IGluOgoKPD94bWwgdmVyc2lvbj0nMS4wJyBzdGFuZGFsb25lPSdubycgPz4KPCFET0NUWVBFIERB
U1RZUEVTIFNZU1RFTSAnZGFzdHlwZXMuZHRkJyA+CjxEQVNUWVBFUz4KICA8R0ZGIHZlcnNpb249
IjEuMCIgaHJlZj0iaHR0cDovL3RvbWNhdC5tb2xnZW4ubXBnLmRlOjgwODAvZGFzL0VQRF9Nb3Vz
ZS90eXBlcyI+CiAgICA8U0VHTUVOVCB2ZXJzaW9uPSIxLjAiPgogICAgICA8VFlQRSBpZD0ibnVs
bCIgLz4KICAgIDwvU0VHTUVOVD4KICA8L0dGRj4KPC9EQVNUWVBFUz4KCgoKICAtICBodHRwOi8v
ZXVnZW5lcy5vcmcvY2dpLWJpbi9zcnNkYXMvZHNuCgpTYXlzIGl0J3MgbW92ZWQgdG8gaHR0cDov
L2V1Z2VuZXMub3JnOjgwODkvY2dpLWJpbi9zcnNkYXMKd2hpY2ggaXMgbW92ZWQgdG8gIGh0dHA6
Ly9ldWdlbmVzLm9yZzo3MTgwL2NnaS1iaW4vc3JzZGFzCgoKVGhpcyBpcyB1c2luZyAieC1kYXMt
dmVyc2lvbjogREFTLzEuNTAiLgoKTGlrZSB0aGUgd29ybWJhc2Uub3JnIG9uZSBhYm92ZSwgd2hl
biBJIGFzayBmb3IKICBodHRwOi8vZXVnZW5lcy5vcmcvY2dpLWJpbi9zcnNkYXMvZHNuL2h1bWFu
L2VudHJ5X3BvaW50cwpJIGdldCB0aGUgRFNOIG91dHB1dCwgYXMgaW4KCjw/eG1sIHZlcnNpb249
IjEuMCIgc3RhbmRhbG9uZT0ieWVzIj8+CjwhRE9DVFlQRSBEQVNEU04gU1lTVEVNICJodHRwOi8v
d3d3LmJpb2Rhcy5vcmcvZHRkL2Rhc2Rzbi5kdGQiPgo8REFTRFNOPgogICA8RFNOPgogICAgICA8
U09VUkNFIGlkPSJmbHkiPmZseTwvU09VUkNFPgogICAgICA8TUFQTUFTVEVSPmh0dHA6Ly9ldWdl
bmVzLm9yZzo3MTgwL2NnaS1iaW4vc3JzZGFzL2ZseTwvTUFQTUFTVEVSPgogICAgICA8REVTQ1JJ
UFRJT04+RHJvc29waGlsYSBtZWxhbm9nYXN0ZXIgYW5ub3RhdGlvbnMgZnJvbSBldUdlbmVzIHN1
bW1hcnkgc2VydmljZTwvREVTQ1JJUFRJT04+CiAgIDwvRFNOPgogIC4uLi4KCgpXaGVuIEkgYWNj
ZXNzIGh0dHA6Ly9ldWdlbmVzLm9yZzo3MTgwL2NnaS1iaW4vc3JzZGFzL2h1bWFuL2RuYQpJIGdl
dAoKPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJ5ZXMiPwo8IURPQ1RZUEUgREFTRE5B
IFNZU1RFTSAiaHR0cDovL3d3dy53b3JtYmFzZS5vcmcvZHRkL2Rhc2RuYS5kdGQiPgo8REFTRE5B
Pgo8L0RBU0ROQT4KCmJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgRFREIHNheSB0aGVyZSBtdXN0
IGJlIGEgJ1NFUVVFTkNFJyB0YWcuCgoKCiAgLSAgaHR0cDovL3d3dy50aWdyLm9yZy9kb2NzL3Rp
Z3Itc2NyaXB0cy90Z2kvZGFzL2RzbgoKVGhpcyByZXR1cm5zIGEgaGVhZGVyIG9mIHRoZSBmb3Jt
CgogIFgtZGFzLXZlcnNpb246IERBUy8wLjk5NgogIFgtZGFzLXN0YXR1czogMjAwIE9LCgpUaGUg
c3BlYyBzYXlzCgo+IFRoZSBzZWNvbmQgbGluZSBpcyBYLURBUy1TdGF0dXMgYW5kIGNvbnRhaW5z
IGEgdGhyZWUgZGlnaXQgc3RhdHVzCj4gY29kZSB3aGljaCBpbmRpY2F0ZXMgdGhlIG91dGNvbWUg
b2YgdGhlIHJlcXVlc3QuCgpJbiB0aGlzIGNhc2UgdGhlIHRocmVlIGRpZ2l0IGNvZGUgaXMgZm9s
bG93ZWQgYnkgYSB0ZXh0IG1lc3NhZ2UuCgpIb3dldmVyLCB0aGlzIGlzIG1vcmUgc2ltaWxhciB0
byB0aGUgSFRUUCBzcGVjLCB3aGljaCBkZWZpbmVzIGl0cwpzdGF1cyBsaW5lIGFzOgoKaHR0cDov
L3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWM2Lmh0bWwjc2VjNi4xCj4g
Ni4xIFN0YXR1cy1MaW5lCj4gCj4gVGhlIGZpcnN0IGxpbmUgb2YgYSBSZXNwb25zZSBtZXNzYWdl
IGlzIHRoZSBTdGF0dXMtTGluZSwgY29uc2lzdGluZwo+IG9mIHRoZSBwcm90b2NvbCB2ZXJzaW9u
IGZvbGxvd2VkIGJ5IGEgbnVtZXJpYyBzdGF0dXMgY29kZSBhbmQgaXRzCj4gYXNzb2NpYXRlZCB0
ZXh0dWFsIHBocmFzZSwgd2l0aCBlYWNoIGVsZW1lbnQgc2VwYXJhdGVkIGJ5IFNQCj4gY2hhcmFj
dGVycy4gTm8gQ1Igb3IgTEYgaXMgYWxsb3dlZCBleGNlcHQgaW4gdGhlIGZpbmFsIENSTEYKPiBz
ZXF1ZW5jZS4KPiAKPiAgICAgICAgU3RhdHVzLUxpbmUgPSBIVFRQLVZlcnNpb24gU1AgU3RhdHVz
LUNvZGUgU1AgUmVhc29uLVBocmFzZSBDUkxGCj4gCj4gNi4xLjEgU3RhdHVzIENvZGUgYW5kIFJl
YXNvbiBQaHJhc2UKPiAKPiBUaGUgU3RhdHVzLUNvZGUgZWxlbWVudCBpcyBhIDMtZGlnaXQgaW50
ZWdlciByZXN1bHQgY29kZSBvZiB0aGUKPiBhdHRlbXB0IHRvIHVuZGVyc3RhbmQgYW5kIHNhdGlz
ZnkgdGhlIHJlcXVlc3QuIFRoZXNlIGNvZGVzIGFyZSBmdWxseQo+IGRlZmluZWQgaW4gc2VjdGlv
biAxMC4gVGhlIFJlYXNvbi1QaHJhc2UgaXMgaW50ZW5kZWQgdG8gZ2l2ZSBhIHNob3J0Cj4gdGV4
dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgU3RhdHVzLUNvZGUuIFRoZSBTdGF0dXMtQ29kZSBpcyBp
bnRlbmRlZAo+IGZvciB1c2UgYnkgYXV0b21hdGEgYW5kIHRoZSBSZWFzb24tUGhyYXNlIGlzIGlu
dGVuZGVkIGZvciB0aGUgaHVtYW4KPiB1c2VyLiBUaGUgY2xpZW50IGlzIG5vdCByZXF1aXJlZCB0
byBleGFtaW5lIG9yIGRpc3BsYXkgdGhlIFJlYXNvbi0KPiBQaHJhc2UuCgoKV2hlbiBJIGFzayBm
b3IgdGhlICdlbnRyeV9wb2ludHMnIG9mICdlbGVnYW5zZ2VuZXMnIEkgZ290IGEgcmVndWxhcgpI
VFRQIDQwNCAiTm90IEZvdW5kIiwgYXMgZnJvbQoKIGh0dHA6Ly93d3cudGlnci5vcmcvZG9jcy90
aWdyLXNjcmlwdHMvdGdpL2Rhcy9lbGVnYW5zZ2VuZXMvZW50cnlfcG9pbnRzCgp3aGVyZWFzIGl0
IHdvcmtzIHdpdGggYXJhYmlkb3BzaXMuCiBodHRwOi8vd3d3LnRpZ3Iub3JnL2RvY3MvdGlnci1z
Y3JpcHRzL3RnaS9kYXMvYXJhYmlkb3BzaXMvZW50cnlfcG9pbnRzCgpJIGRpZG4ndCBsb29rIGlu
dG8gdGhpcyBzZXJ2ZXIgYW55IGZ1cnRoZXIuCgo=
--Multipart_Thu__29_Aug_2002_01:26:40_-0600_085e32d0--