www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - D language lexer written in D - dlexer.d

reply James Dunne <jdunne4 bradley.edu> writes:
Hello all,

I thought as a nice Christmas present for you all working so hard on D, I would
contribute something some of you might find useful.  I've been working hard on a
lexer (tokenizer) for the D language.  Attached to this post is the lexer module
written in D!!

I began work on it for code-completion support for my D IDE called Orion (over
on dsource.org).  Don't bother checking anything out there yet, as its all in
ruins right now. ;)

I tested this module somewhat, and it successfully lexes its own source code!
This module could be useful for a few things, like:

+ code-completion database for D modules
+ generating CTAGS for the D language
+ indent-like program for D

..and any other D source code tools you can think of.

Merry Christmas all, enjoy!

Regards,
James Dunne
Dec 18 2004
next sibling parent "Matthew" <admin.hat stlsoft.dot.org> writes:
Excellent! I shall be checking this out in the new year.

:-)

Matthew

"James Dunne" <jdunne4 bradley.edu> wrote in message
news:cq0t39$18b8$1 digitaldaemon.com...
 Hello all,

 I thought as a nice Christmas present for you all working so hard on D, I would
 contribute something some of you might find useful.  I've been working hard on
a
 lexer (tokenizer) for the D language.  Attached to this post is the lexer
module
 written in D!!

 I began work on it for code-completion support for my D IDE called Orion (over
 on dsource.org).  Don't bother checking anything out there yet, as its all in
 ruins right now. ;)

 I tested this module somewhat, and it successfully lexes its own source code!
 This module could be useful for a few things, like:

 + code-completion database for D modules
 + generating CTAGS for the D language
 + indent-like program for D

 ..and any other D source code tools you can think of.

 Merry Christmas all, enjoy!

 Regards,
 James Dunne
 

Dec 18 2004
prev sibling next sibling parent "Ivan Senji" <ivan.senji public.srce.hr> writes:
"James Dunne" <jdunne4 bradley.edu> wrote in message
news:cq0t39$18b8$1 digitaldaemon.com...
 Hello all,

 I thought as a nice Christmas present for you all working so hard on D, I

 contribute something some of you might find useful.  I've been working

 lexer (tokenizer) for the D language.  Attached to this post is the lexer

 written in D!!

Thanks! This is just what of my projects needs. It looks great and looks like it isn't going to be hard to use. You scared me for a moment when i saw TOKdotvar ,TOKdotti, TOKdotexp, and TOKdottype but you don't seem to use them :)
 I began work on it for code-completion support for my D IDE called Orion

 on dsource.org).  Don't bother checking anything out there yet, as its all

 ruins right now. ;)

 I tested this module somewhat, and it successfully lexes its own source

 This module could be useful for a few things, like:

 + code-completion database for D modules
 + generating CTAGS for the D language
 + indent-like program for D

 ..and any other D source code tools you can think of.

hooray!
 Merry Christmas all, enjoy!

To you too!
 Regards,
 James Dunne

Dec 18 2004
prev sibling next sibling parent reply James Dunne <jdunne4 bradley.edu> writes:
I have updated the dlexer.d module, so please use this version.

New features:
- line number tracking (line property of DLexer class)
- DLexerException class: constructs error message containing filename and
current line number
- independent module now
- more comments! :)

TODO:
- correct wysiwyg string parsing
- correct hex string parsing
- correct numeric literal parsing (ints, floats, etc.)

I'm glad I could help you all in your project endeavours!  If anyone has some
extra webspace that they wouldn't mind hosting D code snippets on, please let me
know!  I've got a bunch of useful ones :)

Regards,
James Dunne
Dec 18 2004
next sibling parent J C Calvarese <jcc7 cox.net> writes:
James Dunne wrote:
 I'm glad I could help you all in your project endeavours!  If anyone has some
 extra webspace that they wouldn't mind hosting D code snippets on, please let
me
 know!  I've got a bunch of useful ones :)
 
 Regards,
 James Dunne

It sounds like you want to check out dsource.org. To start a new project, just post a request in the "Potential Projects" forum (http://www.dsource.org/forums/viewforum.php?f=13). If you just want to make some examples available to the community, you can post an example in the Tutorials section (http://www.dsource.org/tutorials/). -- Justin (a/k/a jcc7) http://jcc_7.tripod.com/d/
Dec 18 2004
prev sibling next sibling parent reply "Matthew" <admin.hat stlsoft.dot.org> writes:
James

I've not yet had chance to look at the code, but I was wondering whether you
could give a quick 2-para precise of the 
interface for your module? A bit of sample program might be useful? (I've just
had a sneak, and seen nextToken(), so I 
reckon I could work it out, but it'd be nicer and quicker if you can just give
us a bit of usage info.)

Cheers

Matthew

P.S. FYI, I wrote a source parser / processor about 4 yrs ago which I used to
great effect on a very poorly programmed 
Java project I was brought in on. I was able to write filters to effect changes
to hundreds of thousands of lines of 
code automatically, which was of great benefit when clearing up after a band of
careless programmers. Now I'm sure that 
such programs will not be needed with D, being as how we're all so cool and
all, but it'd be jolly nice to be able to 
write a server plug-in for D, and use it in the same tool (it uses COM). I
shall investigate this in a couple of weeks' 
time. :-)

"James Dunne" <jdunne4 bradley.edu> wrote in message
news:cq2dot$2lgq$1 digitaldaemon.com...
 I have updated the dlexer.d module, so please use this version.

 New features:
 - line number tracking (line property of DLexer class)
 - DLexerException class: constructs error message containing filename and
 current line number
 - independent module now
 - more comments! :)

 TODO:
 - correct wysiwyg string parsing
 - correct hex string parsing
 - correct numeric literal parsing (ints, floats, etc.)

 I'm glad I could help you all in your project endeavours!  If anyone has some
 extra webspace that they wouldn't mind hosting D code snippets on, please let
me
 know!  I've got a bunch of useful ones :)

 Regards,
 James Dunne
 

Dec 18 2004
parent James Dunne <jdunne4 bradley.edu> writes:
Sure thing Matthew,

As you have guessed already, nextToken() is your main guy to call.  This returns
a Token *, representing the current language token.  A Token is a structure
defined to have only 2 members: 'ident', and 'token'.  'token' is any value from
the TOK enumeration which enumerates all the D language tokens available.  This
lexer works just like the D compiler's lexer, making the longest possible token
at all times (greedy).  The 'ident' member is used only if the token being
parsed has a special meaning, like an identifier, string literal, or a numeric
literal.

As of right now, the lexer is somewhat limited.  It successfully lexes most D
language tokens, but does not have support for wysiwyg or hex strings, or for
proper numeric literal parsing.  All numeric literals are assumed to be int32v
tokens.  There is no official hexadecimal, octal, or floating-point parsing.
However, a cheap hack is in effect to successfully half-assedly parse these,
since it ensures the characters in the literal are either alpha or numeric.
This means that 0x000 will be parsed as one numeric literal, since it starts
with a numeric ('0') and follows with alphas ('x') and numerics ('0').

There are two ways to parse double-quoted strings ("string"), preserving
escape-sequences, or interpreting the escape-sequences.  Code is in place to
perform both methods for convenience.  Setting the version identifier
'interpret_slashes' will return the escaped characters in the string as they
should be.  If this version identifier is disabled, then the string is simply
copied and not escaped (this is the default).

In order to fully utilize the parser, you would ideally create a child class
based on the DLexer class and use its methods.  If you encounter errors during
your parsing, you may throw a DLexerException(), which will provide you with a
fully detailed error message including the filename being parsed, and the
current line number being parsed.  You must supply the actual error message
yourself.  Here's an example:

# module dparser;
# import dlexer;
# class DParser : DLexer {
#   public:
#     this(char[] filename, char[] src) {
#       super(filename, src);
#     }
#
#     void parse() {
#       Token*   tok;
#
#       // Start parsing from the beginning of the module:
#       restart();
#
#       tok = nextToken();
#       // Throw some nicely formatted bogus error:
#       if (tok.token != TOK.TOKlcurly)
#         throw new DLexerException(this, "Some bogus error here.");
#     }
# }

You'll find this type of activity common when parsing source code.  Writing a
convenience wrapper function to 'expect' tokens is a good idea.  Here's an
example of what that would look like:

(within "class DParser : DLexer {" scope)

# Token* expect(TOK value, char[] msg) {
#   Token* tok = nextToken();
#   if (tok.token != value)
#     throw new DLexerException(this, msg);
#   return tok;
# }

Calling nextToken() will always consume a token and will place the cursor at the
next token to be consumed.  If you wish to peek ahead of the current token to
see what the next token will be without consuming it, call peekToken().  It
works exactly like nextToken() but resets the cursor back to its original
position.

The DLexer class provides the following public methods and variables:

this(char[] filename, char[] src) -- give the lexer the name of the file parsing
(filename), and the contents of the entire file as a single string (src)
Token* nextToken();    --   consumes next token
Token* peekToken();    --   peeks at next token without consuming it
void restart();        --   restart parsing from the beginning of the module
char[] filename        --   name of the file being parsed
int line               --   current line number

Hope that helps a bit!  The code is pretty self-explanatory and somewhat
well-documented.  Take a good long gander at it before you try to really use it.

In article <cq2o54$2seg$1 digitaldaemon.com>, Matthew says...
James

I've not yet had chance to look at the code, but I was wondering whether you
could give a quick 2-para precise of the 
interface for your module? A bit of sample program might be useful? (I've just
had a sneak, and seen nextToken(), so I 
reckon I could work it out, but it'd be nicer and quicker if you can just give
us a bit of usage info.)

Cheers

Matthew

P.S. FYI, I wrote a source parser / processor about 4 yrs ago which I used to
great effect on a very poorly programmed 
Java project I was brought in on. I was able to write filters to effect changes
to hundreds of thousands of lines of 
code automatically, which was of great benefit when clearing up after a band of
careless programmers. Now I'm sure that 
such programs will not be needed with D, being as how we're all so cool and
all, but it'd be jolly nice to be able to 
write a server plug-in for D, and use it in the same tool (it uses COM). I
shall investigate this in a couple of weeks' 
time. :-)

Regards, James Dunne
Dec 18 2004
prev sibling parent reply James Dunne <jdunne4 bradley.edu> writes:
Hey all again,

I thought I'd release my D parser now.  This puppy is still very much a work in
progress, but will successfully parse relatively simple D programs.  Writing a
parser isn't very difficult, it's just a lot of work ;).  This module uses my
dlexer module I released in this thread.  And so, it is a good(?) example of how
to use the dlexer module.

The point of this module is to parse D programs for code-completion purposes.  A
few simple structures are used to represent the module's information.  An
example program is supplied which dumps out the parsed module's structs, enums,
classes, functions, and variables.

I should mention that functionality is somewhat limited: version blocks aren't
parsed correctly, and the type parsing on identifiers and functions is somewhat
lacking.  I do intend to fix these issues in the next couple of days.  Test it
out on some D programs you have lying around (or the phobos library for a good
kick).

Regards,
James Dunne
Dec 18 2004
next sibling parent Vincent Risi <Vincent_member pathlink.com> writes:
In article <cq30e7$31fq$1 digitaldaemon.com>, James Dunne says...
Hey all again,

I thought I'd release my D parser now.  This puppy is still very much a work in
progress, but will successfully parse relatively simple D programs.  Writing a
parser isn't very difficult, it's just a lot of work ;).  This module uses my
dlexer module I released in this thread.  And so, it is a good(?) example of how
to use the dlexer module.

The point of this module is to parse D programs for code-completion purposes.  A
few simple structures are used to represent the module's information.  An
example program is supplied which dumps out the parsed module's structs, enums,
classes, functions, and variables.

I should mention that functionality is somewhat limited: version blocks aren't
parsed correctly, and the type parsing on identifiers and functions is somewhat
lacking.  I do intend to fix these issues in the next couple of days.  Test it
out on some D programs you have lying around (or the phobos library for a good
kick).

Regards,
James Dunne
begin 0644 dtags.d
M+R\ 9'1A9W, +2!$(&UO9'5L92!P87)S97(-"B\O("A#*2!#;W!Y<FEG:'0 
M,C`P-"TR,#`U($IA;65S($1U;FYE#0H-"B\O(%!L96%S92!F965L(&9R964 
M=&\ 9&ES=')I8G5T92!T:&ES(&UO9'5L92!I;B!A;GD 9F]R;2!Y;W4 ;&EK
M92X ($D ;VYL>2!A<VL =&AA="!Y;W4-"B\O(&=I=F4 8W)E9&ET('=H97)E
M(&-R961I="!I<R!D=64N("!9;W4 ;6%Y(&UA:V4 ;6]D:69I8V%T:6]N<R!T
M;R!T:&ES(&UO9'5L92X ($EF('EO=2!D;PT*+R\ <V\L('EO=2!M87D <')O
M=FED92!Y;W5R(&UO9&EF:6-A=&EO;G, <'5B;&EC;'DL(&)U="!Y;W4 87)E
M(&YO="!R97%U:7)E9"!T;RX-" T*+R\ 5$]$3R!L:7-T. T*+R\ +2!C;W)R
M96-T('!A<G-I;F< ;V8 ='EP92!D96-L87)A=&EO;G, :6X :61E;G1I9FEE
M<G, 86YD(&9U;F-T:6]N<PT*+R\ +2!I;G1E<F9A8V4 <&%R<VEN9PT*+R\ 
M+2!V97)S:6]N('M](&)L;V-K<PT*+R\ +2!C;W)R96-T(&5X=&5R;B`H='EP
M92D >R!](&)L;V-K<RP (F5X=&5R;B`H='EP92DZ(B!A;F0 (F5X=&5R;B`H
M='EP92D 9&5C;"( =V]R:RX-"B\O("T 8V]M<&QE=&4 86-C97-S(&UO9&EF
M:65R<R!O;B!F=6YC=&EO;G,-" T*;6]D=6QE"61T86=S.PH*:6UP;W)T"7-T
M9"YS=')E86T["FEM<&]R=`ES=&0N<W1R:6YG.PII;7!O<G0)<W1D+F-T>7!E
M.PH*:6UP;W)T"61L97AE<CL*"B\O('!U8FQI8RP <')I=F%T92P 971C+B!A
M8V-E<W,Z"F5N=6T 86-C97-S4FEG:'1S(#H :6YT('L*"6%R56YD969I;F5D
M(#T +3$L" EA<E!U8FQI8RP*"6%R4&%C:V%G92P*"6%R4')O=&5C=&5D+`H)
M87)0<FEV871E"GT[" HO+R!C;VYS="P 9FEN86PL(&%U=&\L(&5T8RX ;6]D
M:69I97)S. IE;G5M(&%C8V5S<TUO9&EF:65R(#H =6EN="![" EA;4-O;G-T
M"0D](#!X,#`P,2P)+R\ =6YU<V5D" EA;5-T871I8PD](#!X,#`P,BP)+R\ 
M=6YU<V5D" EA;49I;F%L"0D](#!X,#`P-"P)+R\ =6YU<V5D" EA;4%U=&\)
M"3T ,' P,#`X+`DO+R!U;G5S960-" EA;4EN"0D](#!X,#`Q,"P-" EA;4]U
M=`D)/2`P>#`P,C`L#0H)86U);D]U=`D)/2`P>#`P,S`L"GT[" T*+R\ 02!M
M;V1U;&4 :6UP;W)T. IS=')U8W0 1$EM<&]R="![" EC:&%R6UT)"0EN86UE
M.PH)86-C97-S4FEG:'1S"6%C8V5S<SL)"2\O(&UA:6YL>2!F;W( <'5B;&EC
M(&%N9"!P<FEV871E('%U86QI9FEE<G,*?3L*"B\O($$ =F%R:6%B;&4Z"G-T
M<G5C="!$5F%R('L*"6-H87);70D);F%M93L*"51O:V5N*EM="71Y<&4[" H)
M86-C97-S4FEG:'1S"6%C8V5S<SL*"6%C8V5S<TUO9&EF:65R"6UO9&EF:65R
M.PDO+R!M86EN;'D 9F]R(&EN+"!O=70L(&%N9"!I;F]U=`I].PH*+R\ 06X 
M96YU;65R871I;VXZ"G-T<G5C="!$16YU;2![" EC:&%R6UT)"6YA;64[#0H)
M5$]+"0D)='EP93L)"0DO+R!T>7!E(&]F('9A;'5E<R!I;B!E;G5M97)A=&EO
M; H*"7-T<G5C="!E;G5M5F%L=64 >PH)"6-H87);70EN86UE.PH)"6-H87);
M70EV86QU93L*"7T*"65N=6U686QU95M="79A;'5E<SL*?3L*"B\O($$ <W1R
M=6-T=7)E. IS=')U8W0 1%-T<G5C="![" EC:&%R6UT)"6YA;64[" H)1%9A
M<BI;70D)=F%R<SL*"41&=6YC*EM="69U;F-S.PT*"413=')U8W0J6UT)<W1R
M=6-T<RP =6YI;VYS.PT*?3L*"B\O($$ 9G5N8W1I;VXZ"G-T<G5C="!$1G5N
M8R![" EC:&%R6UT)"6YA;64[" E4;VME;BI;70ET>7!E.PT*"6-H87);70D)
M;&EN:V%G93L*" E$5F%R*EM="0EP87)M<RP =F%R<SL*"413=')U8W0J6UT)
M<W1R=6-T<RP =6YI;VYS.PH)1$5N=6TJ6UT)96YU;7,[" E$1G5N8RI;70EF
M=6YC<SL*" EA8V-E<W-2:6=H=',)86-C97-S.PH)86-C97-S36]D:69I97()
M;6]D:69I97(["GT[" HO+R!!;B!I;G1E<F9A8V4Z"G-T<G5C="!$26YT97)F
M86-E('L*"6-H87);70D)"6YA;64[" EA8V-E<W-2:6=H=',)86-C97-S.PH)
M86-C97-S36]D:69I97();6]D:69I97([" H)+R\ 26YH97)I=&5D(&EN=&5R
M9F%C97,Z" EC:&%R6UU;70EI:6YT97)F86-E<SL*" E$1G5N8RI;70EF=6YC
M<SL*?3L*"B\O($$ 8VQA<W,Z"G-T<G5C="!$0VQA<W, >PH)8VAA<EM="0D)
M;F%M93L*"6%C8V5S<U)I9VAT<PEA8V-E<W,[" EA8V-E<W--;V1I9FEE< EM
M;V1I9FEE<CL*" DO+R!);FAE<FET960 :6YT97)F86-E<R`H86YD(&-L87-S
M97,I+"!C86XG="!D:7-T:6YG=6ES:"!B971W965N(&$ 8VQA<W, ;W( :6YT
M97)F86-E(&AE<F4Z" EC:&%R6UU;70EI:6YT97)F86-E<SL*" E$4W1R=6-T
M*EM="7-T<G5C=',L('5N:6]N<SL*"41%;G5M*EM="65N=6US.PH)1$9U;F,J
M6UT)9G5N8W,L(&-T;W)S+"!D=&]R<SL*"41687(J6UT)"79A<G,["GT[" HO
M+R!!(&UO9'5L93H*<W1R=6-T($1-;V1U;&4 >PH)8VAA<EM="6YA;64[" H)
M1$EM<&]R="I;70EI;7!O<G1S.PH)1$-L87-S*EM="6-L87-S97,L(&EN=&5R
M9F%C97,[" E$4W1R=6-T*EM="7-T<G5C=',L('5N:6]N<SL*"41%;G5M*EM=
M"65N=6US.PH)1$9U;F,J6UT)9G5N8W,[" E$5F%R*EM="0EV87)S.PI].PH*
M8VQA<W, 1%1A9W, .B!$3&5X97( >PH)<')I=F%T93H*"0EA8V-E<W-2:6=H
M=',)87)$969A=6QT+"!A<D-U<G)E;G0[#0H)"6-H87);70D)"6QN:T-U<G)E
M;G0L(&QN:T1E9F%U;'0[" H)<'5B;&EC. H)"2\O(%1H92!P=6)L:6-L>2!A
M=F%I;&%B;&4 ;6]D=6QE('1A9R!S=')U8W1U<F4Z" D)1$UO9'5L92H)9&UO
M9'5L93L*" D)+R\ 3&]A9"!U<"!T:&4 ;6]D=6QE('-O=7)C92!C;V1E. H)
M"71H:7,H8VAA<EM=(&9I;&5N86UE+"!C:&%R6UT <W)C*2![" D)"2\O($QO
M860 =7` =&AE('-O=7)C92!F;W( =&AE(&QE>&5R. H)"0ES=7!E<BAF:6QE
M;F%M92P <W)C*3L*" D)"2\O($-R96%T92!A(&1E9F%U;'0 ;6]D=6QE('-T
M<G5C='5R93H*"0D)9&UO9'5L92`](&YE=R!$36]D=6QE.PH)"0ED;6]D=6QE
M+FYA;64 /2!F:6QE;F%M93L*" D)"2\O(%-E="!T:&4 9&5F875L="!A8V-E
M<W, <FEG:'1S(&9O<B!N97=L>2!C<F5A=&5D(&ED96YT:69I97)S. H)"0EA
M<D1E9F%U;'0 /2!A8V-E<W-2:6=H=',N87)0=6)L:6,[" D)"6%R0W5R<F5N
M="`](&%C8V5S<U)I9VAT<RYA<E5N9&5F:6YE9#L-" D)"6QN:T1E9F%U;'0 
M/2`B1"([#0H)"0EL;FM#=7)R96YT(#T ;G5L;#L*"0E]" T*"7!R:79A=&4Z
M" D)+R\ 17AP96-T(&$ =&]K96X 86YD('1H<F]W(&%N(&5X8V5P=&EO;B!I
M9B!N;W0 9F]U;F0Z" D)5&]K96XJ"65X<&5C="A43TL =F%L=64L(&-H87);
M72!M<V<I('L*"0D)5&]K96XJ"6YT;VL /2!N97AT5&]K96XH*3L*"0D):68 
M*&YT;VLN=&]K96X (3T =F%L=64I#0H)"0EI9B`H;G1O:RYT;VME;B`A/2!V
M86QU92D*"0D)"71H<F]W(&YE=R!$3&5X97)%>&-E<'1I;VXH=&AI<RP (F5X
M<&5C=&5D("( ?B!M<V<I.PH)"0ER971U<FX ;G1O:SL*"0E]" H)"2\O($5X
M<&5C="!A('1O:V5N(&%N9"!T:')O=R!A;B!E>&-E<'1I;VX :68 ;F]T(&9O
M=6YD. H)"51O:V5N* EE>'!E8W14;VME;BA4;VME;B`J=&]K+"!43TL =F%L
M=64L(&-H87);72!M<V<I('L*"0D):68 *'1O:RYT;VME;B`A/2!V86QU92D*
M"0D)"71H<F]W(&YE=R!$3&5X97)%>&-E<'1I;VXH=&AI<RP (F5X<&5C=&5D
M("( ?B!M<V<I.PH)"0ER971U<FX =&]K.PH)"7T-" T*"0DO+R!)<R!T:&ES
M('1O:V5N(&$ 8F%S:6, ='EP93\-" D)8F]O;"!I<U1Y<&4H5$]+('9A;'5E
M*2![#0H)"0ES=VET8V  *'9A;'5E*2![#0H)"0D)8V%S92!43TLN5$]+=F]I
M9#H*"0D)"6-A<V4 5$]++E1/2VEN=# L(%1/2RY43TMU;G,X. H)"0D)8V%S
M92!43TLN5$]+:6YT,38L(%1/2RY43TMU;G,Q-CH*"0D)"6-A<V4 5$]++E1/
M2VEN=#,R+"!43TLN5$]+=6YS,S(Z" D)"0EC87-E(%1/2RY43TMI;G0V-"P 
M5$]++E1/2W5N<S8T. H)"0D)8V%S92!43TLN5$]+9FQO870S,BP 5$]++E1/
M2V9L;V%T-C0L(%1/2RY43TMF;&]A=# P. H)"0D)8V%S92!43TLN5$]+:6UA
M9VEN87)Y,S(L(%1/2RY43TMI;6%G:6YA<GDV-"P 5$]++E1/2VEM86=I;F%R
M>3 P. H)"0D)8V%S92!43TLN5$]+8V]M<&QE>#,R+"!43TLN5$]+8V]M<&QE
M>#8T+"!43TLN5$]+8V]M<&QE># P. H)"0D)8V%S92!43TLN5$]+8VAA<BP 
M5$]++E1/2W=C:&%R+"!43TLN5$]+9&-H87(L(%1/2RY43TMB:70Z#0H)"0D)
M"7)E='5R;B!T<G5E.PT*"0D)"61E9F%U;'0Z#0H)"0D)"7)E='5R;B!F86QS
M93L-" D)"7T-" D)"7)E='5R;B!F86QS93L*"0E]" H)"2\O($=E="!T:&4 
M8W5R<F5N="!O<B!D969A=6QT(&%C8V5S<R!R:6=H=#H*"0EA8V-E<W-2:6=H
M=',)9V5T06-C97-S*"D >PH)"0EA8V-E<W-2:6=H=',)87( /2!A8V-E<W-2
M:6=H=',N87)5;F1E9FEN960[" D)"6EF("AA<D-U<G)E;G0 (3T 86-C97-S
M4FEG:'1S+F%R56YD969I;F5D*2![" D)"0EA<B`](&%R0W5R<F5N=#L*"0D)
M"2\O($EN=F%L:61A=&4 =&AE(&-U<G)E;G0 86-C97-S(')I9VAT. H)"0D)
M87)#=7)R96YT(#T 86-C97-S4FEG:'1S+F%R56YD969I;F5D.PH)"0E](&5L
M<V4 >PH)"0D)+R\ 57-E('1H92!D969A=6QT(&EF(&YO(&-U<G)E;G0 86-C
M97-S('-P96-I9FEE9#H*"0D)"6%R(#T 87)$969A=6QT.PH)"0E]" D)"7)E
M='5R;B!A<CL*"0E]#0H)"0T*"0DO+R!'970 =&AE(&-U<G)E;G0 ;W( 9&5F
M875L="!F=6YC=&EO;B!L:6YK86=E. T*"0EC:&%R6UT)9V5T3&EN:V%G92 I
M('L-" D)"6-H87);70EL:6YK86=E(#T (D0B.PT*"0D):68 *&QN:T-U<G)E
M;G0 :7, ;G5L;"D >PT*"0D)"6QI;FMA9V4 /2!L;FM$969A=6QT.PT*"0D)
M?2!E;'-E('L-" D)"0EL:6YK86=E(#T ;&YK0W5R<F5N=#L-" D)"0EL;FM#
M=7)R96YT(#T ;G5L;#L-" D)"7T-" D)"7)E='5R;B!L:6YK86=E.PT*"0E]
M" H)"2\O(%-K:7` ;W9E<B!A('-E="!O9B!N97-T960 =&]K96YS. T*"0EV
M;VED('-K:7!.97-T*%1/2R!L+"!43TL <BD >PT*"0D):6YT"6YE<W0 /2`P
M.PT*"0D)9F]R(" [.RD >PT*"0D)"51O:V5N* ET;VL /2!N97AT5&]K96XH
M*3L-" D)"0EI9B`H=&]K(&ES(&YU;&PI(&)R96%K.PT*"0D)"6EF("AT;VLN
M=&]K96X /3T ;"D *RMN97-T.PT*"0D)"6EF("AT;VLN=&]K96X /3T <BD 
M>PT*"0D)"0DM+6YE<W0[#0H)"0D)"6EF("AN97-T(#P ,"D 8G)E86L[#0H)
M"0D)?0T*"0D)?0T*"0E]#0H-" D)+R\ 4F5A9"!A('!A<F%M971E<B!L:7-T
M. T*"0EV;VED(')E861087)A;65T97)S*&EN;W5T($1687(J6UT <&%R;7,I
M('L-" D)"51O:V5N* D)"71O:SL-" D)"6%C8V5S<TUO9&EF:65R"6YE>'1A
M;3L-" T*"0D);F5X=&%M(#T 86-C97-S36]D:69I97(N86U);CL-" T*"0D)
M9F]R(" [.RD >PT*"0D)"71O:R`](&YE>'14;VME;B I.PT*"0D)"6EF("AT
M;VLN=&]K96X /3T 5$]++E1/2W)P87)E;BD 8G)E86L[#0H)"0D):68 *'1O
M:RYT;VME;B`]/2!43TLN5$]+8V]M;6$I(&-O;G1I;G5E.PT*#0H)"0D)<W=I
M=&-H("AT;VLN=&]K96XI('L-" D)"0D)8V%S92!43TLN5$]+:6XZ"0EN97AT
M86T /2!A8V-E<W--;V1I9FEE<BYA;4EN.R!B<F5A:SL-" D)"0D)8V%S92!4
M3TLN5$]+;W5T. EN97AT86T /2!A8V-E<W--;V1I9FEE<BYA;4]U=#L 8G)E
M86L[#0H)"0D)"6-A<V4 5$]++E1/2VEN;W5T. EN97AT86T /2!A8V-E<W--
M;V1I9FEE<BYA;4EN3W5T.R!B<F5A:SL-" T*"0D)"0DO+R!#:&5C:R!F;W( 
M86X :61E;G1I9FEE<B!O<B!A(')E<V5R=F5D('1Y<&4Z#0H)"0D)"6-A<V4 
M5$]++E1/2W9O:60Z" D)"0D)8V%S92!43TLN5$]+:6YT."P 5$]++E1/2W5N
M<S Z" D)"0D)8V%S92!43TLN5$]+:6YT,38L(%1/2RY43TMU;G,Q-CH*"0D)
M"0EC87-E(%1/2RY43TMI;G0S,BP 5$]++E1/2W5N<S,R. H)"0D)"6-A<V4 
M5$]++E1/2VEN=#8T+"!43TLN5$]+=6YS-C0Z" D)"0D)8V%S92!43TLN5$]+
M9FQO870S,BP 5$]++E1/2V9L;V%T-C0L(%1/2RY43TMF;&]A=# P. H)"0D)
M"6-A<V4 5$]++E1/2VEM86=I;F%R>3,R+"!43TLN5$]+:6UA9VEN87)Y-C0L
M(%1/2RY43TMI;6%G:6YA<GDX,#H*"0D)"0EC87-E(%1/2RY43TMC;VUP;&5X
M,S(L(%1/2RY43TMC;VUP;&5X-C0L(%1/2RY43TMC;VUP;&5X.#`Z" D)"0D)
M8V%S92!43TLN5$]+8VAA<BP 5$]++E1/2W=C:&%R+"!43TLN5$]+9&-H87(L
M(%1/2RY43TMB:70Z" D)"0D)8V%S92!43TLN5$]+:61E;G1I9FEE<CH >PT*
M"0D)"0D)5&]K96XJ"6YT;VL[#0H)"0D)"0E$5F%R* EV87([#0H)"0D)"0EC
M:&%R6UT):61E;G0[#0H)"0D)"0E4;VME;BI;70ET>7!E.PT*#0H)"0D)"0DO
M+R!#;VYS=')U8W0 =&AE('1Y<&4 ;V8 =&AE(&ED96YT:69I97(Z#0H)"0D)
M"0ET>7!E+FQE;F=T:"`](#$[#0H)"0D)"0ET>7!E6S!=(#T =&]K.PT*"0D)
M"0D)=VAI;&4 *"AN=&]K(#T ;F5X=%1O:V5N*"DI+G1O:V5N("$](%1/2RY4
M3TMI9&5N=&EF:65R*2![#0H)"0D)"0D)='EP92YL96YG=&  /2!T>7!E+FQE
M;F=T:"`K(#$[#0H)"0D)"0D)='EP95ML96YG=&  +2`Q72`](&YT;VL[#0H)
M"0D)"0E]#0H-" D)"0D)"2\O(%)E860 =&AE(&ED96YT:69I97(Z#0H)"0D)
M"0EE>'!E8W14;VME;BAN=&]K+"!43TLN5$]+:61E;G1I9FEE<BP (FED96YT
M:69I97( 869T97( ='EP92(I.PT*"0D)"0D):61E;G0 /2!N=&]K+FED96YT
M.PT*#0H)"0D)"0DO+R!!9&0 =&AE('!A<F%M971E<CH-" D)"0D)"79A<B`]
M(&YE=R!$5F%R.PT*"0D)"0D)=F%R+FYA;64 /2!I9&5N=#L-" D)"0D)"79A
M<BYT>7!E(#T ='EP93L-" D)"0D)"79A<BYM;V1I9FEE<B`](&YE>'1A;3L-
M" T*"0D)"0D)<&%R;7,N;&5N9W1H(#T <&%R;7,N;&5N9W1H("L ,3L-" D)
M"0D)"7!A<FUS6VQE;F=T:"`M(#%=(#T =F%R.PT*#0H)"0D)"0EN97AT86T 
M/2!A8V-E<W--;V1I9FEE<BYA;4EN.PT*"0D)"0D)8G)E86L[#0H)"0D)"7T-
M" T*"0D)"0ED969A=6QT. T*"0D)"7T-" D)"7T-" D)?0T*" D)+R\ 4&%R
M<V4 86X :6UP;W)T(&QI;F4Z" D)+R\ 4W1A<G1S(&%F=&5R(&EM<&]R="!T
M;VME;BX*"0E$26UP;W)T*B!P87)S94EM<&]R=" I('L*"0D)1$EM<&]R="H)
M:6UP.PH)"0EC:&%R6UT)"6ED96YT.PH)"0E4;VME;BH)"6YT;VL[" H)"0DO
M+R!'970 =&AE(&EM<&]R="!I9&5N=&EF:65R. H)"0EW:&EL92`H*&YT;VL 
M/2!N97AT5&]K96XH*2DN=&]K96X (3T 5$]++E1/2W-E;6EC;VQO;BD >PH)
M"0D):68 *&YT;VLN=&]K96X /3T 5$]++E1/2VED96YT:69I97(I" D)"0D)
M:61E;G0 ?CT ;G1O:RYI9&5N=#L*"0D)"65L<V4 :68 *&YT;VLN=&]K96X 
M/3T 5$]++E1/2V1O="D*"0D)"0EI9&5N="!^/2`B+B([" D)"7T*" D)"6EM
M<"`](&YE=R!$26UP;W)T.PH)"0EI;7`N;F%M92`](&ED96YT.PH)"0EI;7`N
M86-C97-S(#T 9V5T06-C97-S*"D[" D)"7)E='5R;B!I;7`[" D)?0H-" D)
M+R\ 4&%R<V4 82!C;&%S<R!D969I;FET:6]N. H)"2\O(%-T87)T<R!A9G1E
M<B!C;&%S<R!T;VME;BX*"0E$0VQA<W,J"7!A<G-E0VQA<W,H*2![" D)"41#
M;&%S<RH)"6-L<SL*"0D)8VAA<EM="0EI9&5N=#L*"0D)5&]K96XJ"0EN=&]K
M.PT*"0D):6YT"0D);F5S=#L*" D)"2\O($-R96%T92!T:&4 1$-L87-S('-T
M<G5C='5R93H*"0D)8VQS(#T ;F5W($1#;&%S<SL*"0D)+R\ 1W)A8B!T:&4 
M8VQA<W, :61E;G1I9FEE<CH*"0D)8VQS+FYA;64 /2!E>'!E8W0H5$]++E1/
M2VED96YT:69I97(L(")I9&5N=&EF:65R(&%F=&5R(&-L87-S(BDN:61E;G0[
M#0H)"0EA<D1E9F%U;'0 /2!A8V-E<W-2:6=H=',N87)0<FEV871E.PH*"0D)
M+R\ 0VAE8VL 9F]R(&%N(&EN=&5R9F%C92!L:7-T. H)"0EN=&]K(#T ;F5X
M=%1O:V5N*"D[" D)"6EF("AN=&]K+G1O:V5N(#T](%1/2RY43TMC;VQO;BD 
M>PH)"0D)9F]R(" [.RD >PH)"0D)"6YT;VL /2!E>'!E8W0H5$]++E1/2VED
M96YT:69I97(L(")I9&5N=&EF:65R(BD[" H)"0D)"2\O($%D9"!A(&YE=R!I
M;G1E<F9A8V4Z" D)"0D)8VQS+FEI;G1E<F9A8V5S+FQE;F=T:"`](&-L<RYI
M:6YT97)F86-E<RYL96YG=&  *R`Q.PH)"0D)"6-L<RYI:6YT97)F86-E<UML
M96YG=&  +2`Q72`](&YT;VLN:61E;G0[" H)"0D)"6YT;VL /2!N97AT5&]K
M96XH*3L*"0D)"0DO+R!!(&QE9G0M8W5R;'D_($)R96%K+ H)"0D)"6EF("AN
M=&]K+G1O:V5N(#T](%1/2RY43TML8W5R;'DI(&)R96%K.PH)"0D)"2\O($UA
M:V4 <W5R92!I="=S(&$ 8V]M;6$Z" D)"0D)97AP96-T5&]K96XH;G1O:RP 
M5$]++E1/2V-O;6UA+"`B)RPG(&]R("=[)R!A9G1E<B!I;G1E<F9A8V4B*3L*
M"0D)"7T*"0D)?0H*"0D)+R\ 36%K92!S=7)E('=E)W)E(&%T(&$ ;&5F="UC
M=7)L>2UB<F%C92`G>R<Z" D)"65X<&5C=%1O:V5N*&YT;VLL(%1/2RY43TML
M8W5R;'DL("(G>R< 869T97( :6YT97)F86-E(&QI<W0 ;W( 8VQA<W, :61E
M;G1I9FEE<B(I.PH-" D)"6YE<W0 /2`P.PH)"0EF;W( *#L[*2![#0H)"0D)
M;G1O:R`](&YE>'14;VME;B I.PT*#0H)"0D)+R\ 3F5S=&5D(&-U<FQY(&)R
M86-E<SH-" D)"0EI9B`H;G1O:RYT;VME;B`]/2!43TLN5$]+;&-U<FQY*2![
M("LK;F5S=#L 8V]N=&EN=64[('T-" D)"0EI9B`H;G1O:RYT;VME;B`]/2!4
M3TLN5$]+<F-U<FQY*2![#0H)"0D)"2TM;F5S=#L-" D)"0D):68 *&YE<W0 
M/"`P*2!B<F5A:SL-" D)"0D)8V]N=&EN=64[#0H)"0D)?0T*#0H)"0D)+R\ 
M4&5E:R!A="!T:&4 ;F5X="!T;VME;B!T;R!S964 :68 :70G<R!A(&-O;&]N
M(&]N;'D :68 =V4G<F4 :6X =&AE(&EM;65D:6%T92!C;&%S<R!S8V]P93H-
M" D)"0EI9B`H*&YE<W0 /3T ,"D )B8 *'!E96M4;VME;B I+G1O:V5N(#T]
M(%1/2RY43TMC;VQO;BDI('L-" D)"0D)+R\ 268 <V\L('1H96X =&AE(&-U
M<G)E;G0 =&]K96X <VAO=6QD(&)E(&%N(&%C8V5S<PT*"0D)"0DO+R!M;V1I
M9FEE<BX-" D)"0D):68 *&YT;VLN=&]K96X /3T 5$]++E1/2W!R:79A=&4I
M#0H)"0D)"0EA<D1E9F%U;'0 /2!A8V-E<W-2:6=H=',N87)0<FEV871E.PT*
M"0D)"0EE;'-E(&EF("AN=&]K+G1O:V5N(#T](%1/2RY43TMP<F]T96-T960I
M#0H)"0D)"0EA<D1E9F%U;'0 /2!A8V-E<W-2:6=H=',N87)0<F]T96-T960[
M#0H)"0D)"65L<V4 :68 *&YT;VLN=&]K96X /3T 5$]++E1/2W!U8FQI8RD-
M" D)"0D)"6%R1&5F875L="`](&%C8V5S<U)I9VAT<RYA<E!U8FQI8SL-" D)
M"0D)96QS92!I9B`H;G1O:RYT;VME;B`]/2!43TLN5$]+<&%C:V%G92D-" D)
M"0D)"6%R1&5F875L="`](&%C8V5S<U)I9VAT<RYA<E!A8VMA9V4[#0H)"0D)
M"65L<V4-" D)"0D)"71H<F]W(&YE=R!$3&5X97)%>&-E<'1I;VXH=&AI<RP 
M(DEN=F%L:60 86-C97-S(')I9VAT(&UO9&EF:65R(BD[#0H)"0D)?2!E;'-E
M('L-" D)"0D)+R\ 0VAE8VL =&AE('1O:V5N. T*"0D)"0ES=VET8V  *&YT
M;VLN=&]K96XI('L-" D)"0D)"2\O(%-E="!T:&4 ;F5X="!U<V5D(&%C8V5S
M<R!R:6=H=#H-" D)"0D)"6-A<V4 5$]++E1/2W!R:79A=&4Z"6%R0W5R<F5N
M="`](&%C8V5S<U)I9VAT<RYA<E!R:79A=&4[(&)R96%K.PT*"0D)"0D)8V%S
M92!43TLN5$]+<')O=&5C=&5D. EA<D-U<G)E;G0 /2!A8V-E<W-2:6=H=',N
M87)0<F]T96-T960[(&)R96%K.PT*"0D)"0D)8V%S92!43TLN5$]+<'5B;&EC
M. D)87)#=7)R96YT(#T 86-C97-S4FEG:'1S+F%R4'5B;&EC.R!B<F5A:SL-
M" D)"0D)"6-A<V4 5$]++E1/2W!A8VMA9V4Z"6%R0W5R<F5N="`](&%C8V5S
M<U)I9VAT<RYA<E!A8VMA9V4[(&)R96%K.PT*"0D)"0D)#0H)"0D)"0EC87-E
M(%1/2RY43TME>'1E<FXZ#0H)"0D)"0D)+R\ 5$]$3SH ($-O<G)E8W0 :6UP
M;&5M96YT871I;VX-" D)"0D)"0EP<FEN=&8H(F5X=&5R;EQN(BD[#0H)"0D)
M"0D);F5X=%1O:V5N*"D[#0H)"0D)"0D);F5X=%1O:V5N*"D[#0H)"0D)"0D)
M;F5X=%1O:V5N*"D[#0H)"0D)"0D)8G)E86L[#0H)"0D)"0D-" D)"0D)"6-A
M<V4 5$]++E1/2W9E<G-I;VXZ#0H)"0D)"0D)+R\ 5$]$3SH ($-O<G)E8W0 
M:6UP;&5M96YT871I;VX-" D)"0D)"0EB<F5A:SL-" T*"0D)"0D)+R\ 4W1A
M<G0 ;V8 82!V87)I86)L92!O<B!F=6YC=&EO;B!D969I;FET:6]N. T*"0D)
M"0D)8V%S92!43TLN5$]+=F]I9#H*"0D)"0D)8V%S92!43TLN5$]+:6YT."P 
M5$]++E1/2W5N<S Z" D)"0D)"6-A<V4 5$]++E1/2VEN=#$V+"!43TLN5$]+
M=6YS,38Z" D)"0D)"6-A<V4 5$]++E1/2VEN=#,R+"!43TLN5$]+=6YS,S(Z
M" D)"0D)"6-A<V4 5$]++E1/2VEN=#8T+"!43TLN5$]+=6YS-C0Z" D)"0D)
M"6-A<V4 5$]++E1/2V9L;V%T,S(L(%1/2RY43TMF;&]A=#8T+"!43TLN5$]+
M9FQO870X,#H*"0D)"0D)8V%S92!43TLN5$]+:6UA9VEN87)Y,S(L(%1/2RY4
M3TMI;6%G:6YA<GDV-"P 5$]++E1/2VEM86=I;F%R>3 P. H)"0D)"0EC87-E
M(%1/2RY43TMC;VUP;&5X,S(L(%1/2RY43TMC;VUP;&5X-C0L(%1/2RY43TMC
M;VUP;&5X.#`Z" D)"0D)"6-A<V4 5$]++E1/2V-H87(L(%1/2RY43TMW8VAA
M<BP 5$]++E1/2V1C:&%R+"!43TLN5$]+8FET. H)"0D)"0EC87-E(%1/2RY4
M3TMI9&5N=&EF:65R.B![#0H)"0D)"0D)5&]K96XJ"71O:SL-" D)"0D)"0EC
M:&%R6UT):61E;G0[#0H)"0D)"0D)5&]K96XJ6UT)='EP93L-" D)"0D)"0EA
M8V-E<W-2:6=H=',)8W5R87([#0H-" D)"0D)"0DO+R!#;VYS=')U8W0 =&AE
M('1Y<&4 ;V8 =&AE(&ED96YT:69I97(Z#0H)"0D)"0D)='EP92YL96YG=&  
M/2`Q.PT*"0D)"0D)"71Y<&5;,%T /2!N=&]K.PT*"0D)"0D)"69O<B`H.SLI
M('L-" D)"0D)"0D)=&]K(#T ;F5X=%1O:V5N*"D[#0H)"0D)"0D)"6EF("AT
M;VLN=&]K96X /3T 5$]++E1/2VED96YT:69I97(I(&)R96%K.PT*"0D)"0D)
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
M96YG=&  /2!C;',N9'1O<G,N;&5N9W1H("L ,3L-" D)"0D)"0EC;',N9'1O
M<G-;;&5N9W1H("T ,5T /2!F=6YC.PT*#0H)"0D)"0D)9G5N8RYL:6YK86=E
M(#T 9V5T3&EN:V%G92 I.PT*#0H)"0D)"0D)97AP96-T*%1/2RY43TML<&%R
M96XL("(G*"<B*3L-" D)"0D)"0ER96%D4&%R86UE=&5R<RAF=6YC+G!A<FUS
M*3L-" T*"0D)"0D)"6YT;VL /2!N97AT5&]K96XH*3L-" D)"0D)"0EI9B`H
M;G1O:RYT;VME;B`]/2!43TLN5$]+<V5M:6-O;&]N*2!B<F5A:SL-" T*"0D)
M"0D)"65X<&5C=%1O:V5N*&YT;VLL(%1/2RY43TML8W5R;'DL("(G>R<B*3L-
M" D)"0D)"0ES:VEP3F5S="A43TLN5$]+;&-U<FQY+"!43TLN5$]+<F-U<FQY
M*3L-" D)"0D)"7T-" T*"0D)"0D)9&5F875L=#H-" D)"0D)"0D-" D)"0D)
M?0T*"0D)"7T-" D)"7T*" D)"7)E='5R;B!C;',[" D)?0T*#0H)"2\O(%!A
M<G-E(&$ <W1R=6-T(&]R('5N:6]N("AS86UE(&9O<FUA="DZ#0H)"2\O(%-T
M87)T(&%F=&5R('-T<G5C="]U;FEO;B!T;VME;BX-" D)1%-T<G5C="H)<&%R
M<V53=')U8W0H*2![#0H)"0E4;VME;BH)"71O:SL-" D)"413=')U8W0J"7-T
M(#T ;F5W($13=')U8W0[#0H-" D)"71O:R`](&YE>'14;VME;B I.PT*"0D)
M+R\ 06YO;GEM;W5S('-T<G5C=',O=6YI;VYS(&%L;&]W960Z#0H)"0ES="YN
M86UE(#T ;G5L;#L-" D)"6EF("AT;VLN=&]K96X /3T 5$]++E1/2VED96YT
M:69I97(I('L-" D)"0ES="YN86UE(#T =&]K+FED96YT.PT*"0D)"71O:R`]
M(&YE>'14;VME;B I.PT*"0D)?0T*#0H)"0DO+R!792!S:&]U;&0 8F4 870 
M82!C=7)L>3H-" D)"65X<&5C=%1O:V5N*'1O:RP 5$]++E1/2VQC=7)L>2P 
M(B=[)R(I.PT*"0D)+R\ 4F5A9"!I;B!A;&P =&AE(&9U;F-T:6]N<RP =F%R
M:6%B;&5S+"!S=')U8W1S+"!A;F0 =6YI;VYS. T*"0D)9F]R(" [.RD >PT*
M"0D)"71O:R`](&YE>'14;VME;B I.PT*"0D)"6EF("AT;VLN=&]K96X /3T 
M5$]++E1/2W)C=7)L>2D 8G)E86L[#0H)"0D)+R\ 4&%R<V4 82!M;V1U;&4Z
M#0H)"0D)<W=I=&-H("AT;VLN=&]K96XI('L-" D)"0D)+R\ 4W1A<G0 ;V8 
M82!V87)I86)L92!O<B!F=6YC=&EO;B!D969I;FET:6]N. T*"0D)"0EC87-E
M(%1/2RY43TMV;VED. H)"0D)"6-A<V4 5$]++E1/2VEN=# L(%1/2RY43TMU
M;G,X. H)"0D)"6-A<V4 5$]++E1/2VEN=#$V+"!43TLN5$]+=6YS,38Z" D)
M"0D)8V%S92!43TLN5$]+:6YT,S(L(%1/2RY43TMU;G,S,CH*"0D)"0EC87-E
M(%1/2RY43TMI;G0V-"P 5$]++E1/2W5N<S8T. H)"0D)"6-A<V4 5$]++E1/
M2V9L;V%T,S(L(%1/2RY43TMF;&]A=#8T+"!43TLN5$]+9FQO870X,#H*"0D)
M"0EC87-E(%1/2RY43TMI;6%G:6YA<GDS,BP 5$]++E1/2VEM86=I;F%R>38T
M+"!43TLN5$]+:6UA9VEN87)Y.#`Z" D)"0D)8V%S92!43TLN5$]+8V]M<&QE
M>#,R+"!43TLN5$]+8V]M<&QE>#8T+"!43TLN5$]+8V]M<&QE># P. H)"0D)
M"6-A<V4 5$]++E1/2V-H87(L(%1/2RY43TMW8VAA<BP 5$]++E1/2V1C:&%R
M+"!43TLN5$]+8FET. H)"0D)"6-A<V4 5$]++E1/2VED96YT:69I97(Z('L-
M" D)"0D)"51O:V5N* EN=&]K.PT*"0D)"0D)8VAA<EM="6ED96YT.PT*"0D)
M"0D)5&]K96XJ6UT)='EP93L-" T*"0D)"0D)+R\ 0V]N<W1R=6-T('1H92!T
M>7!E(&]F('1H92!I9&5N=&EF:65R. T*"0D)"0D)='EP92YL96YG=&  /2`Q
M.PT*"0D)"0D)='EP95LP72`]('1O:SL-" D)"0D)"7=H:6QE(" H;G1O:R`]
M(&YE>'14;VME;B I*2YT;VME;B`A/2!43TLN5$]+:61E;G1I9FEE<BD >PT*
M"0D)"0D)"71Y<&4N;&5N9W1H(#T ='EP92YL96YG=&  *R`Q.PT*"0D)"0D)
M"71Y<&5;;&5N9W1H("T ,5T /2!N=&]K.PT*"0D)"0D)?0T*#0H)"0D)"0DO
M+R!296%D('1H92!I9&5N=&EF:65R. T*"0D)"0D)97AP96-T5&]K96XH;G1O
M:RP 5$]++E1/2VED96YT:69I97(L(")I9&5N=&EF:65R(&%F=&5R('1Y<&4B
M*3L-" D)"0D)"6ED96YT(#T ;G1O:RYI9&5N=#L-" T*"0D)"0D);G1O:R`]
M(&YE>'14;VME;B I.PT*"0D)"0D):68 *&YT;VLN=&]K96X /3T 5$]++E1/
M2VQP87)E;BD >PT*"0D)"0D)"2\O($ET)W, 82!F=6YC=&EO;CH-" D)"0D)
M"0E$1G5N8RH)9G5N8R`](&YE=R!$1G5N8SL-" D)"0D)"0EF=6YC+FYA;64 
M/2!I9&5N=#L-" D)"0D)"0EF=6YC+G1Y<&4 /2!T>7!E+F1U<#L-" D)"0D)
M"0EF=6YC+FQI;FMA9V4 /2!G971,:6YK86=E*"D[#0H)"0D)"0D)9G5N8RYA
M8V-E<W, /2!A8V-E<W-2:6=H=',N87)0=6)L:6,[#0H-" D)"0D)"0DO+R!!
M9&0 9G5N8W1I;VX =&\ 8VQA<W,Z#0H)"0D)"0D)<W0N9G5N8W,N;&5N9W1H
M(#T <W0N9G5N8W,N;&5N9W1H("L ,3L-" D)"0D)"0ES="YF=6YC<UML96YG
M=&  +2`Q72`](&9U;F,[#0H-" D)"0D)"0DO+R!296%D('1H92!P87)A;65T
M97( ;&ES=#H-" D)"0D)"0ER96%D4&%R86UE=&5R<RAF=6YC+G!A<FUS*3L-
M" T*"0D)"0D)"2\O(%-K:7` =&AE(&9U;F-T:6]N(&1E9FEN:71I;VXZ#0H)
M"0D)"0D);G1O:R`](&YE>'14;VME;B I.PT*"0D)"0D)"6EF("AN=&]K+G1O
M:V5N(#T](%1/2RY43TMS96UI8V]L;VXI(&)R96%K.PT*#0H)"0D)"0D)97AP
M96-T5&]K96XH;G1O:RP 5$]++E1/2VQC=7)L>2P (B=[)R(I.PT*"0D)"0D)
M"7-K:7!.97-T*%1/2RY43TML8W5R;'DL(%1/2RY43TMR8W5R;'DI.PT*#0H)
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
M8W0H5$]++E1/2V-O;&]N+"`B)SHG(BD[#0H)"0D)=&]K(#T ;F5X=%1O:V5N
M*"D[#0H)"0E]#0H-" D)"2\O(%=E('-H;W5L9"!B92!A="!A(&-U<FQY. T*
M"0D)97AP96-T5&]K96XH=&]K+"!43TLN5$]+;&-U<FQY+"`B)WLG(BD[#0H-
M" D)"6D /2`P.PT*"0D)96XN=F%L=65S+FQE;F=T:"`](# [#0H)"0EF;W( 
M*#L[*2![#0H)"0D)=&]K(#T ;F5X=%1O:V5N*"D[#0H)"0D):68 *'1O:RYT
M;VME;B`]/2!43TLN5$]+<F-U<FQY*2!B<F5A:SL-" T*"0D)"2\O($YE960 
M86X :61E;G1I9FEE<CH-" D)"0EE>'!E8W14;VME;BAT;VLL(%1/2RY43TMI
M9&5N=&EF:65R+"`B:61E;G1I9FEE<B(I.PT*#0H)"0D)1$5N=6TN96YU;59A
M;'5E"65V.PT*"0D)"65V+FYA;64 /2!T;VLN:61E;G0[#0H-" D)"0DO+R!!
M;B!A<W-I9VYM96YT(&]R(&-O;6UA#0H)"0D)=&]K(#T ;F5X=%1O:V5N*"D[
M#0H)"0D):68 *'1O:RYT;VME;B`]/2!43TLN5$]+87-S:6=N*2![#0H)"0D)
M"69O<B`H.SLI('L-" D)"0D)"71O:R`](&YE>'14;VME;B I.PT*"0D)"0D)
M:68 *'1O:RYT;VME;B`]/2!43TLN5$]+8V]M;6$I(&)R96%K.PT*"0D)"0D)
M96QS92!I9B`H=&]K+G1O:V5N(#T](%1/2RY43TMR8W5R;'DI(&)R96%K.PT*
M#0H)"0D)"0EI9B`H=&]K+G1O:V5N(#T](%1/2RY43TMI9&5N=&EF:65R*2!E
M=BYV86QU92!^/2!T;VLN:61E;G0[#0H)"0D)"0EE;'-E(&EF("AT;VLN=&]K
M96X /3T 5$]++E1/2VEN=#,R=BD 978N=F%L=64 ?CT =&]K+FED96YT.PT*
M"0D)"0D)96QS92!E=BYV86QU92!^/2!T;VMT;W-T<EMT;VLN=&]K96Y=.PT*
M"0D)"0E]#0H)"0D)?0T*#0H)"0D):68 *&D /3T 96XN=F%L=65S+FQE;F=T
M:"D 96XN=F%L=65S+FQE;F=T:"`](&5N+G9A;'5E<RYL96YG=&  *B`R.PT*
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
M;G0 /2!L:6YK86=E.PT*"0D)"0D)"7T-" D)"0D)"0EB<F5A:SL-" D)"0D)
M"7T-" T*"0D)"0D)+R\ 4W1A<G0 ;V8 82!V87)I86)L92!O<B!F=6YC=&EO
M;B!D969I;FET:6]N. T*"0D)"0D)8V%S92!43TLN5$]+=F]I9#H*"0D)"0D)
M8V%S92!43TLN5$]+:6YT."P 5$]++E1/2W5N<S Z" D)"0D)"6-A<V4 5$]+
M+E1/2VEN=#$V+"!43TLN5$]+=6YS,38Z" D)"0D)"6-A<V4 5$]++E1/2VEN
M=#,R+"!43TLN5$]+=6YS,S(Z" D)"0D)"6-A<V4 5$]++E1/2VEN=#8T+"!4
M3TLN5$]+=6YS-C0Z" D)"0D)"6-A<V4 5$]++E1/2V9L;V%T,S(L(%1/2RY4
M3TMF;&]A=#8T+"!43TLN5$]+9FQO870X,#H*"0D)"0D)8V%S92!43TLN5$]+
M:6UA9VEN87)Y,S(L(%1/2RY43TMI;6%G:6YA<GDV-"P 5$]++E1/2VEM86=I
M;F%R>3 P. H)"0D)"0EC87-E(%1/2RY43TMC;VUP;&5X,S(L(%1/2RY43TMC
M;VUP;&5X-C0L(%1/2RY43TMC;VUP;&5X.#`Z" D)"0D)"6-A<V4 5$]++E1/
M2V-H87(L(%1/2RY43TMW8VAA<BP 5$]++E1/2V1C:&%R+"!43TLN5$]+8FET
M. H)"0D)"0EC87-E(%1/2RY43TMI9&5N=&EF:65R.B![#0H)"0D)"0D)5&]K
M96XJ"6YT;VL[#0H)"0D)"0D)8VAA<EM="6ED96YT.PT*"0D)"0D)"51O:V5N
M*EM="71Y<&4[#0H)"0D)"0D)86-C97-S4FEG:'1S"6-U<F%R.PT*#0H)"0D)
M"0D)+R\ 0V]N<W1R=6-T('1H92!T>7!E(&]F('1H92!I9&5N=&EF:65R. T*
M"0D)"0D)"71Y<&4N;&5N9W1H(#T ,3L-" D)"0D)"0ET>7!E6S!=(#T =&]K
M.PT*"0D)"0D)"7=H:6QE(" H;G1O:R`](&YE>'14;VME;B I*2YT;VME;B`A
M/2!43TLN5$]+:61E;G1I9FEE<BD >PT*"0D)"0D)"0ET>7!E+FQE;F=T:"`]
M('1Y<&4N;&5N9W1H("L ,3L-" D)"0D)"0D)='EP95ML96YG=&  +2`Q72`]
M(&YT;VL[#0H)"0D)"0D)?0T*#0H)"0D)"0D)+R\ 4F5A9"!T:&4 :61E;G1I
M9FEE<CH-" D)"0D)"0EE>'!E8W14;VME;BAN=&]K+"!43TLN5$]+:61E;G1I
M9FEE<BP (FED96YT:69I97( 869T97( ='EP92(I.PT*"0D)"0D)"6ED96YT
M(#T ;G1O:RYI9&5N=#L-" T*"0D)"0D)"2\O($=E="!T:&4 86-C97-S(')I
M9VAT<R!F;W( =&AI<R!I9&5N=&EF:65R. T*"0D)"0D)"6-U<F%R(#T 9V5T
M06-C97-S*"D[#0H-" D)"0D)"0EN=&]K(#T ;F5X=%1O:V5N*"D[#0H)"0D)
M"0D):68 *&YT;VLN=&]K96X /3T 5$]++E1/2VQP87)E;BD >PT*"0D)"0D)
M"0DO+R!)="=S(&$ 9G5N8W1I;VXZ#0H)"0D)"0D)"41&=6YC* EF=6YC(#T 
M;F5W($1&=6YC.PT*"0D)"0D)"0EF=6YC+FYA;64 /2!I9&5N=#L-" D)"0D)
M"0D)9G5N8RYT>7!E(#T ='EP92YD=7`[#0H)"0D)"0D)"69U;F,N;&EN:V%G
M92`](&=E=$QI;FMA9V4H*3L-" D)"0D)"0D)9G5N8RYA8V-E<W, /2!C=7)A
M<CL-" T*"0D)"0D)"0DO+R!!9&0 9G5N8W1I;VX =&\ 8VQA<W,Z#0H)"0D)
M"0D)"61M;V1U;&4N9G5N8W,N;&5N9W1H(#T 9&UO9'5L92YF=6YC<RYL96YG
M=&  *R`Q.PT*"0D)"0D)"0ED;6]D=6QE+F9U;F-S6VQE;F=T:"`M(#%=(#T 
M9G5N8SL-" T*"0D)"0D)"0DO+R!296%D('1H92!P87)A;65T97( ;&ES=#H-
M" D)"0D)"0D)<F5A9%!A<F%M971E<G,H9G5N8RYP87)M<RD[#0H-" D)"0D)
M"0D)+R\ 4VMI<"!T:&4 9G5N8W1I;VX 9&5F:6YI=&EO;CH-" D)"0D)"0D)
M;G1O:R`](&YE>'14;VME;B I.PT*"0D)"0D)"0EI9B`H;G1O:RYT;VME;B`]
M/2!43TLN5$]+<V5M:6-O;&]N*2!B<F5A:SL-" T*"0D)"0D)"0EE>'!E8W14
M;VME;BAN=&]K+"!43TLN5$]+;&-U<FQY+"`B)WLG(BD[#0H)"0D)"0D)"7-K
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
M9'5L93H >PH)"0D)"0D)8VAA<EM="6UO9#L*" D)"0D)"0DO+R!'970 =&AE
M(&UO9'5L92=S(&ED96YT:69I97(Z" D)"0D)"0EW:&EL92`H*&YT;VL /2!N
M97AT5&]K96XH*2DN=&]K96X (3T 5$]++E1/2W-E;6EC;VQO;BD >PH)"0D)
M"0D)"6EF("AN=&]K+G1O:V5N(#T](%1/2RY43TMI9&5N=&EF:65R*0H)"0D)
M"0D)"0EM;V0 ?CT ;G1O:RYI9&5N=#L*"0D)"0D)"0EE;'-E(&EF("AN=&]K
M+G1O:V5N(#T](%1/2RY43TMD;W0I" D)"0D)"0D)"6UO9"!^/2`B+B([" D)
M"0D)"0E]" H)"0D)"0D)9&UO9'5L92YN86UE(#T ;6]D.PT*"0D)"0D)"6%R
M1&5F875L="`](&%C8V5S<U)I9VAT<RYA<E!U8FQI8SL-" D)"0D)"0EB<F5A
M:SL*"0D)"0D)?0T*#0H)"0D)"0EC87-E(%1/2RY43TMS=')U8W0Z('L-" D)
M"0D)"0E$4W1R=6-T* ES="`]('!A<G-E4W1R=6-T*"D[#0H-" D)"0D)"0ED
M;6]D=6QE+G-T<G5C=',N;&5N9W1H(#T 9&UO9'5L92YS=')U8W1S+FQE;F=T
M:"`K(#$[#0H)"0D)"0D)9&UO9'5L92YS=')U8W1S6VQE;F=T:"`M(#%=(#T 
M<W0[#0H)"0D)"0D)8G)E86L[#0H)"0D)"0E]#0H)"0D)"0EC87-E(%1/2RY4
M3TMU;FEO;CH >PT*"0D)"0D)"413=')U8W0J"7-T(#T <&%R<V53=')U8W0H
M*3L-" T*"0D)"0D)"61M;V1U;&4N=6YI;VYS+FQE;F=T:"`](&1M;V1U;&4N
M=6YI;VYS+FQE;F=T:"`K(#$[#0H)"0D)"0D)9&UO9'5L92YU;FEO;G-;;&5N
M9W1H("T ,5T /2!S=#L-" D)"0D)"0EB<F5A:SL-" D)"0D)"7T-" D)"0D)
M"6-A<V4 5$]++E1/2V5N=6TZ('L-" D)"0D)"0E$16YU;2H)"7-T(#T <&%R
M<V5%;G5M*"D[#0H-" D)"0D)"0ED;6]D=6QE+F5N=6US+FQE;F=T:"`](&1M
M;V1U;&4N96YU;7,N;&5N9W1H("L ,3L-" D)"0D)"0ED;6]D=6QE+F5N=6US
M6VQE;F=T:"`M(#%=(#T <W0[#0H)"0D)"0D)8G)E86L[#0H)"0D)"0E]#0H-
M" D)"0D)"61E9F%U;'0Z#0H)"0D)"7T*"0D)"7T*"0D)?0H)"0ER971U<FX[
M" D)?0I]" T*#0HO+R!2971U<FX 82!S=')I;F< <F5P<F5S96YT871I;VX 
M;V8 =&AE('1Y<&4Z#0IC:&%R6UT ='EP95-T<FEN9RA4;VME;BI;72!T>7!E
M*2![#0H)8VAA<EM="7,[#0H)9F]R96%C:"`H5&]K96XJ('1O:SL ='EP92D 
M>PT*"0EI9B`H=&]K+G1O:V5N(#T](%1/2RY43TMI9&5N=&EF:65R*0T*"0D)
M<R!^/2!T;VLN:61E;G0[#0H)"65L<V4-" D)"7, ?CT =&]K=&]S=');=&]K
M+G1O:V5N73L-" E]#0H)<F5T=7)N(',[#0I]#0H*+R\ 4F5T=7)N(&$ 8V]M
M;6$M<V5P87)A=&5D(&QI<W0 ;V8 <&%R86UE=&5R<SH-"F-H87);72!P87)M
M;&ES="A$5F%R*EM=('!A<FUS*2![#0H)8VAA<EM="7,[#0H)9F]R96%C:"`H
M:6YT(&DL($1687(J('!A<FT[('!A<FUS*2![#0H)"6EF("AI(#X ,"D <R!^
M/2`B+"`B.PT*"0EI9B`H*'!A<FTN;6]D:69I97( )B!A8V-E<W--;V1I9FEE
M<BYA;4EN3W5T*2`]/2!A8V-E<W--;V1I9FEE<BYA;4]U="D-" D)"7, ?CT 
M(F]U="`B.PT*"0EE;'-E(&EF(" H<&%R;2YM;V1I9FEE<B`F(&%C8V5S<TUO
M9&EF:65R+F%M26Y/=70I(#T](&%C8V5S<TUO9&EF:65R+F%M26Y/=70I#0H)
M"0ES('X](")I;F]U="`B.PT*"0ES('X]('1Y<&53=')I;F<H<&%R;2YT>7!E
M*2!^("( (B!^('!A<FTN;F%M93L-" E]#0H)<F5T=7)N(',[#0I]#0H-"G9O
M:60 9'5M<%-T<G5C="A$4W1R=6-T("IS="P :6YT(&EN9&5N="P 8F]O;"!I
M<W5N:6]N*2![#0H)8VAA<EM="6EN9'-T<CL-" EF;W( *&EN="!I(#T ,#L 
M:2`\(&EN9&5N=#L *RMI*2!I;F1S='( ?CT (EQT(CL-" T*"7!R:6YT9B B
M)2XJ<R(L(&EN9'-T<BD[#0H-" EI9B`H:7-U;FEO;BD-" D)<')I;G1F*")U
M;FEO;B`B*3L-" EE;'-E#0H)"7!R:6YT9B B<W1R=6-T("(I.PT*#0H):68 
M*'-T+FYA;64 :7, ;G5L;"D-" D)<')I;G1F*")[7&XB*3L*"65L<V4*"0EP
M<FEN=&8H(B4N*G, >UQN(BP <W0N;F%M92D[#0H-" EF;W)E86-H("A$4W1R
M=6-T*B!S=#([('-T+G-T<G5C=',I('L-" D)9'5M<%-T<G5C="AS=#(L(&EN
M9&5N="LQ+"!F86QS92D[#0H)?0T*#0H)9F]R96%C:"`H1%-T<G5C="H <W0R
M.R!S="YU;FEO;G,I('L-" D)9'5M<%-T<G5C="AS=#(L(&EN9&5N="LQ+"!T
M<G5E*3L-" E]#0H-" EF;W)E86-H("A$5F%R*B!V87([('-T+G9A<G,I('L-
M" D)<')I;G1F*"(E+BIS7'0B+"!I;F1S='(I.PT*"0EP<FEN=&8H(B4N*G-<
M="4N*G,[7&XB+"!T>7!E4W1R:6YG*'9A<BYT>7!E*2P =F%R+FYA;64I.PT*
M"7T-" T*"69O<F5A8V  *$1&=6YC*B!F=6YC.R!S="YF=6YC<RD >PT*"0EP
M<FEN=&8H(B4N*G-<="(L(&EN9'-T<BD[#0H)"7-W:71C:"`H9G5N8RYA8V-E
M<W,I('L-" D)"6-A<V4 86-C97-S4FEG:'1S+F%R4'5B;&EC.B!P<FEN=&8H
M(G!U8FQI8R`B*3L 8G)E86L[#0H)"0EC87-E(&%C8V5S<U)I9VAT<RYA<E!R
M:79A=&4Z('!R:6YT9B B<')I=F%T92`B*3L 8G)E86L[#0H)"0EC87-E(&%C
M8V5S<U)I9VAT<RYA<E!R;W1E8W1E9#H <')I;G1F*")P<F]T96-T960 (BD[
M(&)R96%K.PT*"0D)8V%S92!A8V-E<W-2:6=H=',N87)086-K86=E.B!P<FEN
M=&8H(G!A8VMA9V4 (BD[(&)R96%K.PT*"0E]#0H)"6EF("AF=6YC+FQI;FMA
M9V4 (3T (D0B*0T*"0D)<')I;G1F*")E>'1E<FX *"4N*G,I("(L(&9U;F,N
M;&EN:V%G92D[#0H)"7!R:6YT9B B)2XJ<UQT)2XJ<R E+BIS*3M<;B(L('1Y
M<&53=')I;F<H9G5N8RYT>7!E*2P 9G5N8RYN86UE+"!P87)M;&ES="AF=6YC
M+G!A<FUS*2D[#0H)?0T*#0H)<')I;G1F*"(E+BIS(BP :6YD<W1R*3L-" EP
M<FEN=&8H(GU<;EQN(BD["GT-" T*+R\ 4VEM<&QE(&UA:6X <')O9W)A;3H*
M:6YT(&UA:6XH8VAA<EM=6UT 87)G<RD >PH)1%1A9W,);&5X.PH)1FEL90ED
M9FEL93L*" EI9B`H87)G<RYL96YG=&  /#T ,2D >PH)"7!R:6YT9B B)2XJ
M<R`\9FEL92YD/EQN(BP 87)G<ULP72D[" D)<F5T=7)N("TQ.PH)?0H*"2\O
M($]P96X =&AE(&9I;&4Z" ED9FEL92`](&YE=R!&:6QE*&%R9W-;,5TI.PH)
M+R\ 4V5N9"!I;B!T:&4 8G5F9F5R('1O('1H92!L97AE<CH*"6-H87);70ES
M='( /2!D9FEL92YR96%D4W1R:6YG*&1F:6QE+G-I>F4H*2D[" H);&5X(#T 
M;F5W($1486=S*&%R9W-;,5TL('-T<BD[" DO+R!#;&]S92!T:&4 9FEL92!N
M;W<Z" ED9FEL92YC;&]S92 I.PH*"2\O($QE="!T:&4 ;&5X97( ;&]O<V4Z
M" EL97 N9V\H*3L*" DO+R!297!O<G0 =&AE(')E<W5L=',Z" H)<')I;G1F
M*")M;V1U;&4 )2XJ<R![7&XB+"!L97 N9&UO9'5L92YN86UE*3L*" EP<FEN
M=&8H(EQT<'5B;&EC("!I;7!O<G1S("(I.PH)9F]R96%C:"`H:6YT(&DL($1)
M;7!O<G0J(&EM.R!L97 N9&UO9'5L92YI;7!O<G1S*2![" D):68 *&EM+F%C
M8V5S<R`]/2!A8V-E<W-2:6=H=',N87)0=6)L:6,I('L*"0D):68 *&D /B`P
M*2!P<FEN=&8H(BP (BD[" D)"7!R:6YT9B B)2XJ<R(L(&EM+FYA;64I.PH)
M"7T*"7T*"7!R:6YT9B B.UQN(BD[" H)<')I;G1F*")<='!R:79A=&4 :6UP
M;W)T<R`B*3L*"69O<F5A8V  *&EN="!I+"!$26UP;W)T*B!I;3L ;&5X+F1M
M;V1U;&4N:6UP;W)T<RD >PH)"6EF("AI;2YA8V-E<W, /3T 86-C97-S4FEG
M:'1S+F%R4')I=F%T92D >PH)"0EI9B`H:2`^(#`I('!R:6YT9B B+"`B*3L*
M"0D)<')I;G1F*"(E+BIS(BP :6TN;F%M92D[" D)?0H)?0H)<')I;G1F*"([
M7&Y<;B(I.PH*"2\O($5N=6US. H)9F]R96%C:"`H1$5N=6TJ(&5N.R!L97 N
M9&UO9'5L92YE;G5M<RD >PH)"7!R:6YT9B B7'1E;G5M("4N*G, >UQN(BP 
M96XN;F%M92D[" D)9F]R96%C:"`H1$5N=6TN96YU;59A;'5E(&5V.R!E;BYV
M86QU97,I('L-" D)"6EF("AE=BYV86QU92!I<R!N=6QL*0T*"0D)"7!R:6YT
M9B B7'1<="4N*G,L7&XB+"!E=BYN86UE*3L*"0D)96QS90H)"0D)<')I;G1F
M*")<=%QT)2XJ<R`]("4N*G,L7&XB+"!E=BYN86UE+"!E=BYV86QU92D[" D)
M?0H)"7!R:6YT9B B7'1]7&Y<;B(I.PH)?0H*"2\O(%-T<G5C=',Z" EF;W)E
M86-H("A$4W1R=6-T*B!S=#L ;&5X+F1M;V1U;&4N<W1R=6-T<RD >PT*"0ED
M=6UP4W1R=6-T*'-T+"`Q+"!F86QS92D[#0H)?0H-" DO+R!5;FEO;G,Z" EF
M;W)E86-H("A$4W1R=6-T*B!S=#L ;&5X+F1M;V1U;&4N=6YI;VYS*2![#0H)
M"61U;7!3=')U8W0H<W0L(#$L('1R=64I.PT*"7T*#0H)+R\ 5F%R:6%B;&5S
M. H)9F]R96%C:"`H1%9A<BH =G([(&QE>"YD;6]D=6QE+G9A<G,I('L*"0EP
M<FEN=&8H(EQT)2XJ<UQT)2XJ<SM<;B(L('1Y<&53=')I;F<H=G(N='EP92DL
M('9R+FYA;64I.PH)?0H):68 *&QE>"YD;6]D=6QE+G9A<G,N;&5N9W1H(#X 
M,"D <')I;G1F*")<;B(I.PH*"2\O($-L87-S97,Z" EF;W)E86-H("A$0VQA
M<W,J(&-L.R!L97 N9&UO9'5L92YC;&%S<V5S*2![" D):6YT"6H /2`P.PH*
M"0EP<FEN=&8H(EQT8VQA<W, )2XJ<R(L(&-L+FYA;64I.PH)"6EF("AC;"YI
M:6YT97)F86-E<RYL96YG=&  /B`P*2!P<FEN=&8H(B`Z("(I.PH*"0EF;W)E
M86-H("AC:&%R6UT =CL 8VPN:6EN=&5R9F%C97,I('L*"0D):68 *&H /B`P
M*2!P<FEN=&8H(BP (BD[" D)"7!R:6YT9B B)2XJ<R(L('8I.PH)"0DK*VH[
M" D)?0H)"7!R:6YT9B B('M<;B(I.PH*"0DO+R!687)I86)L97,Z" D)9F]R
M96%C:"`H1%9A<BH =F%R.R!C;"YV87)S*2![#0H)"0EP<FEN=&8H(EQT7'0B
M*3L-" D)"7-W:71C:"`H=F%R+F%C8V5S<RD >PT*"0D)"6-A<V4 86-C97-S
M4FEG:'1S+F%R4'5B;&EC.B!P<FEN=&8H(G!U8FQI8R`B*3L 8G)E86L[#0H)
M"0D)8V%S92!A8V-E<W-2:6=H=',N87)0<FEV871E.B!P<FEN=&8H(G!R:79A
M=&4 (BD[(&)R96%K.PT*"0D)"6-A<V4 86-C97-S4FEG:'1S+F%R4')O=&5C
M=&5D.B!P<FEN=&8H(G!R;W1E8W1E9"`B*3L 8G)E86L[#0H)"0D)8V%S92!A
M8V-E<W-2:6=H=',N87)086-K86=E.B!P<FEN=&8H(G!A8VMA9V4 (BD[(&)R
M96%K.PT*"0D)?0T*"0D)<')I;G1F*"(E+BIS7'0E+BIS.UQN(BP ='EP95-T
M<FEN9RAV87(N='EP92DL('9A<BYN86UE*3L-" D)?0T*"0EI9B`H8VPN=F%R
M<RYL96YG=&  /B`P*2!P<FEN=&8H(EQN(BD[#0H-" D)+R\ 0V]N<W1R=6-T
M;W)S. T*"0EF;W)E86-H("A$1G5N8RH 9G5N8SL 8VPN8W1O<G,I('L-" D)
M"7!R:6YT9B B7'1<="(I.PT*"0D)<W=I=&-H("AF=6YC+F%C8V5S<RD >PT*
M"0D)"6-A<V4 86-C97-S4FEG:'1S+F%R4'5B;&EC.B!P<FEN=&8H(G!U8FQI
M8R`B*3L 8G)E86L[#0H)"0D)8V%S92!A8V-E<W-2:6=H=',N87)0<FEV871E
M.B!P<FEN=&8H(G!R:79A=&4 (BD[(&)R96%K.PT*"0D)"6-A<V4 86-C97-S
M4FEG:'1S+F%R4')O=&5C=&5D.B!P<FEN=&8H(G!R;W1E8W1E9"`B*3L 8G)E
M86L[#0H)"0D)8V%S92!A8V-E<W-2:6=H=',N87)086-K86=E.B!P<FEN=&8H
M(G!A8VMA9V4 (BD[(&)R96%K.PT*"0D)?0T*"0D)<')I;G1F*")T:&ES*"4N
M*G,I.UQN(BP <&%R;6QI<W0H9G5N8RYP87)M<RDI.PT*"0E]" T*"0DO+R!$
M97-T<G5C=&]R<SH-" D)9F]R96%C:"`H1$9U;F,J(&9U;F,[(&-L+F1T;W)S
M*2![#0H)"0EP<FEN=&8H(EQT7'0B*3L-" D)"7-W:71C:"`H9G5N8RYA8V-E
M<W,I('L-" D)"0EC87-E(&%C8V5S<U)I9VAT<RYA<E!U8FQI8SH <')I;G1F
M*")P=6)L:6, (BD[(&)R96%K.PT*"0D)"6-A<V4 86-C97-S4FEG:'1S+F%R
M4')I=F%T93H <')I;G1F*")P<FEV871E("(I.R!B<F5A:SL-" D)"0EC87-E
M(&%C8V5S<U)I9VAT<RYA<E!R;W1E8W1E9#H <')I;G1F*")P<F]T96-T960 
M(BD[(&)R96%K.PT*"0D)"6-A<V4 86-C97-S4FEG:'1S+F%R4&%C:V%G93H 
M<')I;G1F*")P86-K86=E("(I.R!B<F5A:SL-" D)"7T-" D)"7!R:6YT9B B
M?G1H:7,H)2XJ<RD[7&XB+"!P87)M;&ES="AF=6YC+G!A<FUS*2D[#0H)"7T*
M#0H)"2\O($9U;F-T:6]N<SH-" D)9F]R96%C:"`H1$9U;F,J(&9U;F,[(&-L
M+F9U;F-S*2![#0H)"0EP<FEN=&8H(EQT7'0B*3L-" D)"7-W:71C:"`H9G5N
M8RYA8V-E<W,I('L-" D)"0EC87-E(&%C8V5S<U)I9VAT<RYA<E!U8FQI8SH 
M<')I;G1F*")P=6)L:6, (BD[(&)R96%K.PT*"0D)"6-A<V4 86-C97-S4FEG
M:'1S+F%R4')I=F%T93H <')I;G1F*")P<FEV871E("(I.R!B<F5A:SL-" D)
M"0EC87-E(&%C8V5S<U)I9VAT<RYA<E!R;W1E8W1E9#H <')I;G1F*")P<F]T
M96-T960 (BD[(&)R96%K.PT*"0D)"6-A<V4 86-C97-S4FEG:'1S+F%R4&%C
M:V%G93H <')I;G1F*")P86-K86=E("(I.R!B<F5A:SL-" D)"7T-" D)"7!R
M:6YT9B B)2XJ<UQT)2XJ<R E+BIS*3M<;B(L('1Y<&53=')I;F<H9G5N8RYT
M>7!E*2P 9G5N8RYN86UE+"!P87)M;&ES="AF=6YC+G!A<FUS*2D[#0H)"7T*
M" D)<')I;G1F*")<='U<;EQN(BD[" E]" T*"2\O($9U;F-T:6]N<SH-" EF
M;W)E86-H("A$1G5N8RH 9G5N8SL ;&5X+F1M;V1U;&4N9G5N8W,I('L-" D)
M<')I;G1F*")<="(I.PT*"0ES=VET8V  *&9U;F,N86-C97-S*2![#0H)"0EC
M87-E(&%C8V5S<U)I9VAT<RYA<E!U8FQI8SH <')I;G1F*")P=6)L:6, (BD[
M(&)R96%K.PT*"0D)8V%S92!A8V-E<W-2:6=H=',N87)0<FEV871E.B!P<FEN
M=&8H(G!R:79A=&4 (BD[(&)R96%K.PT*"0D)8V%S92!A8V-E<W-2:6=H=',N
M87)0<F]T96-T960Z('!R:6YT9B B<')O=&5C=&5D("(I.R!B<F5A:SL-" D)
M"6-A<V4 86-C97-S4FEG:'1S+F%R4&%C:V%G93H <')I;G1F*")P86-K86=E
M("(I.R!B<F5A:SL-" D)?0T*"0EP<FEN=&8H(B4N*G-<="4N*G,H)2XJ<RD[
M7&XB+"!T>7!E4W1R:6YG*&9U;F,N='EP92DL(&9U;F,N;F%M92P <&%R;6QI
M<W0H9G5N8RYP87)M<RDI.PT*"7T*#0H)<')I;G1F*")]7&XB*3L*" ER971U
'<FX ,#L*?2YP
`
end

Why not produce a Coco/R for D instead?
Dec 24 2004
prev sibling parent reply ahiru <asuka h5.dion.ne.jp> writes:
The parser couldn't parse below code.

==
import std.stream, std.string;
~
==

parseImport() have a bug.


--- ../dtags.d	2004-12-25 06:00:53.834500000 +0900
+++ dtags.d	2005-01-01 18:34:57.953125000 +0900
   -296,14 +296,28   

// Parse an import line:
// Starts after import token.
+		private int parse_import_continue = true;
DImport* parseImport() {
DImport*	imp;
char[]		ident;
Token*		ntok;

+			if (!parse_import_continue) {
+				parse_import_continue = true;
+				return null;
+			}
// Get the import identifier:
-			while ((ntok = nextToken()).token != TOK.TOKsemicolon) {
-				if (ntok.token == TOK.TOKidentifier)
+			while (true) {
+				ntok = nextToken();
+				if (ntok.token == TOK.TOKsemicolon) {
+					parse_import_continue = false;
+					break;
+				}
+				else if (ntok.token == TOK.TOKcomma) {
+					parse_import_continue = true;
+					break;
+				}
+				else if (ntok.token == TOK.TOKidentifier)
ident ~= ntok.ident;
else if (ntok.token == TOK.TOKdot)
ident ~= ".";
   -925,11 +939,13   
break;
}
case TOK.TOKimport: {
-							DImport*	imp = parseImport();
+							DImport*	imp;

-							// Add the import to the module:
-							dmodule.imports.length = dmodule.imports.length + 1;
-							dmodule.imports[length - 1] = imp;
+							while ((imp = parseImport()) !== null) {
+								// Add the import to the module:
+								dmodule.imports.length = dmodule.imports.length + 1;
+								dmodule.imports[length - 1] = imp;
+							}
break;
}
case TOK.TOKmodule: {
Jan 01 2005
parent James Dunne <jdunne4 bradley.edu> writes:
I never said it was complete ;)  Thanks for the bugfix, but I dropped that
module a while back.  I'm working off the DMD front end C++ parsing code now.
It will be pretty much guaranteed to work like the compiler does.  I'll let
everyone know when I've hammered out all the fine details.

In article <cr5sh1$2ida$1 digitaldaemon.com>, ahiru says...
The parser couldn't parse below code.

==
import std.stream, std.string;
~
==

parseImport() have a bug.


--- ../dtags.d	2004-12-25 06:00:53.834500000 +0900
+++ dtags.d	2005-01-01 18:34:57.953125000 +0900
   -296,14 +296,28   

// Parse an import line:
// Starts after import token.
+		private int parse_import_continue = true;
DImport* parseImport() {
DImport*	imp;
char[]		ident;
Token*		ntok;

+			if (!parse_import_continue) {
+				parse_import_continue = true;
+				return null;
+			}
// Get the import identifier:
-			while ((ntok = nextToken()).token != TOK.TOKsemicolon) {
-				if (ntok.token == TOK.TOKidentifier)
+			while (true) {
+				ntok = nextToken();
+				if (ntok.token == TOK.TOKsemicolon) {
+					parse_import_continue = false;
+					break;
+				}
+				else if (ntok.token == TOK.TOKcomma) {
+					parse_import_continue = true;
+					break;
+				}
+				else if (ntok.token == TOK.TOKidentifier)
ident ~= ntok.ident;
else if (ntok.token == TOK.TOKdot)
ident ~= ".";
   -925,11 +939,13   
break;
}
case TOK.TOKimport: {
-							DImport*	imp = parseImport();
+							DImport*	imp;

-							// Add the import to the module:
-							dmodule.imports.length = dmodule.imports.length + 1;
-							dmodule.imports[length - 1] = imp;
+							while ((imp = parseImport()) !== null) {
+								// Add the import to the module:
+								dmodule.imports.length = dmodule.imports.length + 1;
+								dmodule.imports[length - 1] = imp;
+							}
break;
}
case TOK.TOKmodule: {

Jan 02 2005
prev sibling parent reply "Simon Buchan" <currently no.where> writes:
On Sat, 18 Dec 2004 09:26:01 +0000 (UTC), James Dunne  
<jdunne4 bradley.edu> wrote:

 Hello all,

 I thought as a nice Christmas present for you all working so hard on D,  
 I would
 contribute something some of you might find useful.  I've been working  
 hard on a
 lexer (tokenizer) for the D language.  Attached to this post is the  
 lexer module
 written in D!!

 I began work on it for code-completion support for my D IDE called Orion  
 (over
 on dsource.org).  Don't bother checking anything out there yet, as its  
 all in
 ruins right now. ;)

 I tested this module somewhat, and it successfully lexes its own source  
 code!
 This module could be useful for a few things, like:

 + code-completion database for D modules
 + generating CTAGS for the D language
 + indent-like program for D

 ..and any other D source code tools you can think of.

 Merry Christmas all, enjoy!

 Regards,
 James Dunne

Any particular reason you kept the whole TOK.TOK... naming system? Just seemed confusing to me... Plus, it seems you still have the === identity token in there, wasn't that replaced with 'in'? Just a small hint, those debug format strings would make a little more sense with wysiwyg strings (ie `"%s"` instead of "\"%s\"") Looks like a good start, though, and works as a beutifier, to boot! :D -- "Unhappy Microsoft customers have a funny way of becoming Linux, Salesforce.com and Oracle customers." - www.microsoft-watch.com: "The Year in Review: Microsoft Opens Up" -- "I plan on at least one critical patch every month, and I haven't been disappointed." - Adam Hansen, manager of security at Sonnenschein Nath & Rosenthal LLP (Quote from http://www.eweek.com/article2/0,1759,1736104,00.asp) -- "It's been a challenge to "reteach or retrain" Web users to pay for content, said Pizey" -Wired website: "The Incredible Shrinking Comic"
Dec 18 2004
parent reply James Dunne <jdunne4 bradley.edu> writes:
Any particular reason you kept the whole TOK.TOK... naming system? Just  
seemed
confusing to me...

I kept the TOK.TOK naming scheme out of pure dumb ignorance on my part ;) I didn't realize we had anonymous enumerations. Also, D doesn't allow you to use reserved keywords to declare enumeration values, so the TOK prefix was kept. Tonight I'll run thru and remove the redundant TOK.TOK to be just TOK.
Plus, it seems you still have the === identity token in there, wasn't that  
replaced
with 'in'?

The === operator, AFAIK, is indeed the same as 'is', which I'm sure you meant rather than 'in' (just clarifying for newbies, no offense meant). In the static this() constructor of the DLexer class, you can see the line `keywords["in"] = TOK.TOKidentity` (this is used to convert identifier tokens to reserved keyword tokens). And reversibly, if you use toktostr[TOK.TOKidentity], you get "===" back. Strange, but that's exactly the behavior of the D front-end, and I mindlessly copied it over to my code. I'll fix it if it bugs you ;)
Just a small hint, those debug format strings would make a little more  
sense with
wysiwyg strings (ie `"%s"` instead of "\"%s\"")

About the wysiwyg strings as a formatting suggestion for the code itself, I'd like to claim ignorance on my part as well. :-D. I often forget about the nice new features of D, since I'm so used to doing things "the old way." I'm sure you can relate ;). Besides, I'm growing accustomed to seeing all the horrible backslashes in strings.
Looks like a good start, though, and works as a beutifier, to boot! :D

And yes, it does work quite famously as a beautifier doesn't it? Except the small side-effect of REMOVING ALL COMMENTS :-D. Of course, that's a small change if this module is to be used as the basis for a beautifier/indenter project. Someone should really take that up, as I've got my hands full right now trying to come up with some preliminary code-completion support for my D IDE. That, and Christmas shopping still... I'll make my changes tonight and ship them out ASAP. I don't want to host these projects on dsource.org due to the overhead of the SVN repository (since they're only single modules) and that dsource is (I'm sure) intended for medium-sized to large-scale projects. If there was a code-snippets section, that would be perfect! I think Brad (admin of dsource) is in the process of evaluating replacement PHP systems right now, so he's got enough to do at the moment. Regards, James Dunne
Dec 19 2004
next sibling parent James Dunne <jdunne4 bradley.edu> writes:
Plus, it seems you still have the === identity token in there, wasn't that  
replaced
with 'in'?

The === operator, AFAIK, is indeed the same as 'is', which I'm sure you meant rather than 'in' (just clarifying for newbies, no offense meant). In the static this() constructor of the DLexer class, you can see the line `keywords["in"] = TOK.TOKidentity` ...

Lousy kharmic retribution... that's what I get for correcting someone else. The line is actually keywords["is"], not keywords["in"].
Dec 19 2004
prev sibling parent reply Brad Anderson <brad dsource.dot.org> writes:
James Dunne wrote:
 I don't want to host these projects on dsource.org due to the overhead of the
 SVN repository (since they're only single modules) and that dsource is (I'm
 sure) intended for medium-sized to large-scale projects.  If there was a
 code-snippets section, that would be perfect!  

This may be a good idea. I'd say put them in the Bindings project, because it's read/write for everyone, but your code is not really a binding to C. Perhaps it's time to start a project that has D syntax/grammar/beautifier code (other than DGrammar), and we just start by dropping your work to-date in there. The SVN repos is web-enabled, and you can make project downloads that point directly to the repos, so it will be quite easy to make accessible the two files you have so far. The other approach is to make a project like Bindings that everyone can upload utilities and tools they've created. Thoughts? BA
Dec 20 2004
parent reply James Dunne <jdunne4 bradley.edu> writes:
As a temporary solution, that sounds great.  But I have a few issues with
that... Seeing how its read/write to everyone, what's to stop someone from
simply removing the files there?  In SVN, can I be the only one to modify my
modules?  For now, your solution works ;)  I'll throw my stuff in the Bindings
project.  Keep me informed on anything you'll be doing in this area.

Thanks a lot, Brad!

In article <cq62nv$2lpp$1 digitaldaemon.com>, Brad Anderson says...
James Dunne wrote:
 I don't want to host these projects on dsource.org due to the overhead of the
 SVN repository (since they're only single modules) and that dsource is (I'm
 sure) intended for medium-sized to large-scale projects.  If there was a
 code-snippets section, that would be perfect!  

This may be a good idea. I'd say put them in the Bindings project, because it's read/write for everyone, but your code is not really a binding to C. Perhaps it's time to start a project that has D syntax/grammar/beautifier code (other than DGrammar), and we just start by dropping your work to-date in there. The SVN repos is web-enabled, and you can make project downloads that point directly to the repos, so it will be quite easy to make accessible the two files you have so far. The other approach is to make a project like Bindings that everyone can upload utilities and tools they've created. Thoughts? BA

Regards, James Dunne
Dec 20 2004
parent reply James Dunne <jdunne4 bradley.edu> writes:
Anyone interested in my dlexer and dparser modules will take a look in the
bindings project over at dsource.org!  I've taken to completely rewriting the
parser code.  I slightly modified the lexer code to work more closely like DMD's
front end lexer.  I'm gonna do a straight conversion of the C++ code to D for
the parser.  It's working well so far, just gotta define all those darn classes!
I'll throw my work into the bindings project as I go along.

Regards,
James Dunne
Dec 21 2004
parent reply "Ivan Senji" <ivan.senji public.srce.hr> writes:
"James Dunne" <jdunne4 bradley.edu> wrote in message
news:cqb842$1uud$1 digitaldaemon.com...
 Anyone interested in my dlexer and dparser modules will take a look in the
 bindings project over at dsource.org!  I've taken to completely rewriting

 parser code.  I slightly modified the lexer code to work more closely like

 front end lexer.  I'm gonna do a straight conversion of the C++ code to D

 the parser.  It's working well so far, just gotta define all those darn

 I'll throw my work into the bindings project as I go along.

Great work James! I am not only interested in this but also succesfully using your lexer. It is used in a translator D+some_new_features->D. I have this working: int[] numbers; numbers.length=100; (each[int index] numbers) = index+1; int sum=0; sum += (each numbers); All i have to do is fix a bug that stops writef("%s\n",(each numbers)); from working and it will be updated to dsource as part of the lr-lalr parser project. Thanks again for dlexer :)
 Regards,
 James Dunne

Dec 22 2004
parent reply James Dunne <jdunne4 bradley.edu> writes:
Great work James!
I am not only interested in this but also succesfully using your lexer. It
is used
in a translator D+some_new_features->D.
I have this working:

int[]  numbers;
numbers.length=100;

(each[int index] numbers) = index+1;

int sum=0;

sum += (each numbers);

Glad to see someone besides me benefiting from my work! And since dlexer is working just like the one in DMD's front end code, it might not be much work at all to convert that parsing routine back to C++ to throw in the compiler itself ;)
All i have to do is fix a bug that stops
writef("%s\n",(each numbers));
from working and it will be updated to dsource as part of the
lr-lalr parser project.

Is that a bug in my code? I was pretty sure I tested all the string parsing routines fairly well.
Thanks again for dlexer :)

You're very welcome! BTW, I've made an incompatible change to dlexer unfortunately. It is not released yet, but here's the change: The nextToken() function no longer returns a Token *, but returns the token value (TOK...) of the token parsed. The actual token structure is a protected member called 'token' in the DLexer class. Then just check the 'token' member. This eliminates a lot of extra memory allocation and garbage lying around, since we just reuse one Token structure. peekToken() also works similarly, as it should. I've also changed the layout of the Token structure itself. We're now using a new structure Identifier (token.ident) to reference identifiers, and the ustring property to reference string literal tokens (token.ustring). Identifiers are kept in an AA to eliminate duplicates, just as they are (essentially) in DMD's front end. Actually, they're stored in the stringtable, but an AA works similarly for our purposes. Also, numeric parsing works (but still not real number parsing) and returns values in the fields token.(int32value, uns32value, int64value, uns64value, float80value). All integers smaller than an int32 are stored in int32value. But it doesn't matter which member you choose to read from, since they're all in a union ;). I'll throw this new version up to the bindings project now. Sorry to everyone using the old module, but it shouldn't be too hard to convert over to this new format. For history purposes, the old dlexer module is in bindings revision #11 and 12, and I the new one is in bindings revision #13. Regards, James Dunne
Dec 22 2004
parent "Ivan Senji" <ivan.senji public.srce.hr> writes:
"James Dunne" <jdunne4 bradley.edu> wrote in message
news:cqcs5s$118n$1 digitaldaemon.com...
Great work James!
I am not only interested in this but also succesfully using your lexer.


is used
in a translator D+some_new_features->D.
I have this working:

int[]  numbers;
numbers.length=100;

(each[int index] numbers) = index+1;

int sum=0;

sum += (each numbers);

Glad to see someone besides me benefiting from my work! And since dlexer

 working just like the one in DMD's front end code, it might not be much

 all to convert that parsing routine back to C++ to throw in the compiler

 ;)

All i have to do is fix a bug that stops
writef("%s\n",(each numbers));
from working and it will be updated to dsource as part of the
lr-lalr parser project.

Is that a bug in my code? I was pretty sure I tested all the string

 routines fairly well.

No! The bug is in my code ;)
Thanks again for dlexer :)

You're very welcome! BTW, I've made an incompatible change to dlexer unfortunately. It is not released yet, but here's the change: The nextToken() function no longer returns a Token *, but returns the

 value (TOK...) of the token parsed.  The actual token structure is a

 member called 'token' in the DLexer class.  Then just check the 'token'

 This eliminates a lot of extra memory allocation and garbage lying around,

 we just reuse one Token structure.  peekToken() also works similarly, as

 should.

 I've also changed the layout of the Token structure itself.  We're now

 new structure Identifier (token.ident) to reference identifiers, and the

 property to reference string literal tokens (token.ustring).  Identifiers

 kept in an AA to eliminate duplicates, just as they are (essentially) in

 front end.  Actually, they're stored in the stringtable, but an AA works
 similarly for our purposes.

 Also, numeric parsing works (but still not real number parsing) and

 values in the fields token.(int32value, uns32value, int64value,

 float80value).  All integers smaller than an int32 are stored in

 But it doesn't matter which member you choose to read from, since they're

 a union ;).

 I'll throw this new version up to the bindings project now.  Sorry to

 using the old module, but it shouldn't be too hard to convert over to this

 format.  For history purposes, the old dlexer module is in bindings

 and 12, and I the new one is in bindings revision #13.

I'll check it out and make the changes.
 Regards,
 James Dunne

Dec 23 2004