www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - home made copy-on-write arrays

Discussing constant-ness / read-only-ness.....

As we know, in D, there is no difference between
array (master buffer) and slices from it (slave buffer).
So far this unisex solution is working (at least in Harmonia) and
allows to build effective code.
So I can e.g. return subvector of Widgets from a container and
caller can use it effectively for immutable enumerations (90% of cases).
The main problem for me is that I want to prevent cases when caller
will decide to modify such subvector - it can modify master buffer
too. The bad thing that it may happen in code far from original place
and in worst case asynchronously. Implementation nightmare to be short.

So to add some robustness to the library and keep effectiveness almost
at the same level I've came up with the idea of using array
wrappers with 'mutable' flags. (Kris, thanks, this is sort of your 
read-only)

struct array(T)
{
    T[] elements;
    bit  mutable;

    void mutate();
   ....
}

Full implementation of the array(T) attached.
It is an imperfect solution - there are some holes - but it seems is the
best one of what we can reach without compiler/runtime support.
(Actually it is feasible to implement mutable flag as higher bit in the
 length field of builtin arrays - max possible length will be twice less 
though. )

Any comments will be appreciated at this point
as I am going to use this approach for strings also - so it will be a 
massive update.

Andrew.


begin 666 types.d
M+RH-"B  *RTM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TK#0H ('P 2&%R;6]N
M:6$ 1U5)($9R86UE=V]R:RP =F5R<VEO;B Q+C N("  ("  ("  ("  ("  
M("  ("  ("  ("  ("  ("  ? T*(" K+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2L-"B  ?"!#;W!Y<FEG:'0 *&,I(#(P,#4 06YD<F5W($9R961O;FEO
M=6L 86YD("  ("  ("  ("  ("  ("  ("  ("  ("  ("!\#0H ('P 5&5R
M<F$ 26YF;W)M871I8V$ 4V]F='=A<F4L($EN8RX ("  ("  ("  ("  ("  
M("  ("  ("  ("  ("  ("  ("  ? T*(" K+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2L-"B  ?"!4:&ES('-O=7)C92!F:6QE(&ES('-U8FIE8W0 =&\ 
M2&%R;6]N:6$ 1U5)($9R86UE=V]R:R!L:6-E;G-E+"  ("  ("!\#0H ('P 
M=&AA="!I<R!B=6YD;&5D('=I=&  =&AI<R!P86-K86=E(&EN('1H92!F:6QE
M($Q)0T5.4T4N5%A4+"!A;F0 :7, ("  ? T*("!\(&%V86EL86)L92!T:')O
M=6=H('1H92!W;W)L9"UW:61E+7=E8B!A="!T:&4 9F]L;&]W:6YG('5R;#H 
M("  ("  ("  ('P-"B  ?"!H='1P.B\O=W=W+G1E<G)A:6YF;W)M871I8V$N
M8V]M+VAA<FUO;FEA+VQI8V5N<V4N='AT("  ("  ("  ("  ("  ("!\#0H 
M("LM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM*PT*("!\($%U=&AO<G,Z($%N
M9')E=R!&<F5D;VYI;W5K("  ("  ("  ("  ("  ("  ("  ("  ("  ("  
M("  ("  ("  ("  ('P-"B  *RTM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TK
M#0HJ+PT*#0HO+WP-"B\O?"!(87)M;VYI82!T>7!E('!R:6UI=&EV97,N#0HO
M+WP-"B\O?"!A<G)A>2A4*2P 1&EC=&EO;F%R>2A++%8I+"!3>6U486)L92A4
M*2!D871E=&EM90T*+R]\#0H-"FUO9'5L92!H87)M;VYI82YT>7!E<SL-" T*
M:6UP;W)T(&AA<FUO;FEA+G-T<FEN9SL-" T*<')I=F%T92!I;7!O<G0 <W1D
M+F,N<W1D:6\[#0IP<FEV871E(&EM<&]R="!S=&0N<W1R:6YG.PT*<')I=F%T
M92!I;7!O<G0 <W1D+F1A=&4[#0IP<FEV871E(&EM<&]R="!S=&0N=71F.PT*
M#0HO+WP-"B\O?"!A<G)A>0T*+R]\#0IS=')U8W0 87)R87DH5"D-"GL-"B  
M5%M=(&5L96UE;G1S.PT*("!B:70 ;75T86)L92 ](&9A;'-E.PT*#0H ("\O
M(&-T;W)S#0H ('-T871I8R!A<G)A>2!O<$-A;&PH(%1;72!V+"!B:70 ;75T
M86)L92 ](&9A;'-E("D >R!A<G)A>2!A.R!A+F5L96UE;G1S(#T =CL 82YM
M=71A8FQE(#T 9F%L<V4[(')E='5R;B!A.R!]#0H ('-T871I8R!A<G)A>2!O
M<$-A;&PH(&%R<F%Y('8 *2![(&%R<F%Y(&$[(&$ /2!V.R!R971U<FX 83L 
M?0T*#0H ('9O:60 ;75T871E*"D >R!I9B A;75T86)L92D 96QE;65N=', 
M/2!E;&5M96YT<RYD=7 [(&UU=&%B;&4 /2!T<G5E.R!]#0H ('9O:60 ;75T
M871E*'5I;G0 97AT<F%%;&5M96YT<RD +R\ =7-E('1H:7, ;VYL>2!F;W( 
M:6YC<F5A<VEN9R!S:7IE#0H ('L #0H ("  :68H(6UU=&%B;&4I( T*("  
M('L #0H ("  ("!U:6YT(&YE=TQE;F=T:" ](&5L96UE;G1S+FQE;F=T:" K
M(&5X=')A16QE;65N=',[#0H ("  ("!46UT ;F4 /2!N97< 5%MN97=,96YG
M=&A=.R -"B  ("  (&YE6S N+F5L96UE;G1S+FQE;F=T:%T /2!E;&5M96YT
M<ULP+BYE;&5M96YT<RYL96YG=&A=.R -"B  ("  (&YE+FQE;F=T:" ](&5L
M96UE;G1S+FQE;F=T:#L-"B  ("  (&5L96UE;G1S(#T ;F4[#0H ("  ("!M
M=71A8FQE(#T =')U93L-"B  ("!]#0H ('T-" T*(" O+R!A<'!E;F0 87)R
M87D 8GD ;VYE(&5L96UE;G0-"B  =F]I9"!P=7-H*%0 =BD-"B  ("  ('L-
M"B  ("  ("  ;75T871E*#$I.PT*("  ("  ("!E;&5M96YT<R!^/2!V.PT*
M("  ("  ?0T*(" O+R!A<'!E;F0 87)R87D 8GD 96QE;65N=',-"B  =F]I
M9"!P=7-H*%1;72!V*0T*("  ("  >PT*("  ("  ("!M=71A=&4H=BYL96YG
M=& I.PT*("  ("  ("!E;&5M96YT<R!^/2!V.PT*("  ("  ?0T*#0H ("\O
M(&1E;&5T92!L87-T(&5L96UE;G0 86YD(')E='5R;B!I= T*("!4('!O<" I
M#0H ("  ("![#0H ("  ("  ("\O(&1O;B=T(&YE960 =&\ ;75T871E(&%S
M('=E( T*("  ("  (" O+R!A<F4 ;VYL>2!D96-R96%S:6YG(&QE;F=T: T*
M("  ("  ("!I;G0 ;" ](&5L96UE;G1S+FQE;F=T:" M(#$[#0H ("  ("  
M(&%S<V5R="AL(#X](# I.R -"B  ("  ("  5"!T(#T 96QE;65N='-;;%T[
M#0H ("  ("  (&5L96UE;G1S+FQE;F=T:" ](&P[#0H ("  ("  (')E='5R
M;B!T.PT*("  ("  ?0T*#0H ("\O(&EN<V5R="!E;&5M96YT(&EN=&\ 87)R
M87D-"B  =F]I9"!I;G-E<G0H=6EN="!A="P 5"!V*0T*("  ("  >PT*("  
M("  ("!M=71A=&4H,2D[#0H ("  ("  ('5I;G0 ;" ](&5L96UE;G1S+FQE
M;F=T:#L-"B  ("  ("  :68H870 /CT ;"D >R!E;&5M96YT<R!^/2!V.R!R
M971U<FX[('T-"B  ("  ("  96QE;65N=',N;&5N9W1H(#T ;" K(#$[#0H 
M("  ("  (&UE;6UO=F4H)F5L96UE;G1S6V%T*S%=+"9E;&5M96YT<UMA=%TL
M*&PM870I*E0N<VEZ96]F*3L-"B  ("  ("  96QE;65N='-;871=(#T =CL-
M"B  ("  ('T-"B  #0H ("\O(&EN<V5R="!A<G)A>2!I;G1O(&%R<F%Y#0H 
M('9O:60 :6YS97)T*'5I;G0 870L(%1;72!V82 I#0H ("  ("![#0H ("  
M("  (&UU=&%T92AV82YL96YG=& I.PT*("  ("  ("!U:6YT(&P /2!E;&5M
M96YT<RYL96YG=& [#0H ("  ("  (&EF*&%T(#X](&PI('L 96QE;65N=', 
M?CT =F$[(')E='5R;CL ?0T*("  ("  ("!E;&5M96YT<RYL96YG=&  /2!L
M("L =F$N;&5N9W1H.PT*("  ("  ("!M96UM;W9E*"9E;&5M96YT<UMA=" K
M('9A+FQE;F=T:%TL)F5L96UE;G1S6V%T72PH;"UA="DJ5"YS:7IE;V8I.PT*
M("  ("  ("!E;&5M96YT<UMA="XN870K=F$N;&5N9W1H72 ]('9A.PT*("  
M("  ?0T*#0H ("\O(&1E;"!E;&5M96YT(&%N9"!R971U<FX :70-"B  5"!C
M=70H=6EN="!A="D-"B  ("  ('L-"B  ("  ("  =6EN="!L(#T 96QE;65N
M=',N;&5N9W1H("T ,3L-"B  ("  ("  :68H870 /CT ;"D <F5T=7)N('!O
M<" I.PT*("  ("  ("!M=71A=&4H*3L-"B  ("  ("  5"!T(#T 96QE;65N
M='-;871=.R -"B  ("  ("  ;65M;6]V92 F96QE;65N='-;871=+"9E;&5M
M96YT<UMA="LQ72PH;"UA="DJ5"YS:7IE;V8I.PT*("  ("  ("!E;&5M96YT
M<RYL96YG=&  /2!L.PT*("  ("  ("!R971U<FX =#L-"B  ("  ('T-" T*
M(" O+R!J=7-T(&1E;&5T92!R86YG90T*(" O+R!H86QF+6]P96X <F%N9V4 
M6V%T+BYE;F0I#0H ('9O:60 8W5T*&EN="!A="P :6YT(&5N9"D-"B  ("  
M('L-"B  ("  ("  ("!A<W-E<G0H870 /#T 96YD*3L-"B  ("  ("  ("!I
M9BAA=" ]/2!E;F0I(')E='5R;CL-"B  ("  ("  ("!U:6YT(&P /2!E;&5M
M96YT<RYL96YG=&  +2 H96YD("T 870I.PT*("  ("  ("  (&EF*&%T(#X]
M(&PI('L 96QE;65N=',N;&5N9W1H(#T 870[(')E='5R;CL ?0T*("  ("  
M("  (&UU=&%T92 I.PT*("  ("  ("  (&UE;6UO=F4H)F5L96UE;G1S6V%T
M72PF96QE;65N='-;96YD72PH;"UA="DJ5"YS:7IE;V8I.PT*("  ("  ("  
M(&5L96UE;G1S+FQE;F=T:" ](&P[#0H ("  ("!]#0H-"B  +R\ 9FEN9"!I
M;F1E>"!O9B!T:&4 96QE;65N="!I;B!A<G)A>2P +3$ :68 ;F]T(&9O=6YD
M#0H (&EN="!I;F1E>"A4('0I#0H ("  ("![#0H ("  ("  :6YT(&D /2!E
M;&5M96YT<RYL96YG=&  +2 Q.PT*("  ("  (&9O<B [(&D /CT ,#L +2UI
M*0T*("  ("  ("  (&EF*"!E;&5M96YT<UMI72 ]/3T =" I(&)R96%K.PT*
M("  ("  (')E='5R;B!I.PT*("  ("  ?0T*#0H ('5I;G0 ;&5N9W1H*"D 
M>R!R971U<FX 96QE;65N=',N;&5N9W1H.R!]#0H ('5I;G0 ;&5N9W1H*'5I
M;G0 ;FPI( T*("![( T*("  (&EF*"!N;" ^(&5L96UE;G1S+FQE;F=T:" I
M(&UU=&%T92AN;" M(&5L96UE;G1S+FQE;F=T:"D[#0H ("  <F5T=7)N(&5L
M96UE;G1S+FQE;F=T:" ](&YL.R -"B  ?0T*#0H (%0 (&9I<G-T*"D >R!R
M971U<FX 96QE;65N='-;,%T[('T-"B  5"  ;&%S=" I('L <F5T=7)N(&5L
M96UE;G1S6V5L96UE;G1S+FQE;F=T:" M(#%=.R!]#0H ( T*("!V;VED(&-L
M96%R*"D >R!E;&5M96YT<RYL96YG=&  /2 P.R!]#0H-"B  +R\ ;W9E<FQO
M861S('8 /2!A6VE=.PT*("!4("  (&]P26YD97 H=6EN="!I*2![(')E='5R
M;B!E;&5M96YT<UMI73L ?0T*(" O+R!O=F5R;&]A9', 85MI72 ]('8[#0H 
M(%0 ("  ;W!);F1E>$%S<VEG;BA4('<L('5I;G0 :2D >R!M=71A=&4H*3L 
M96QE;65N='-;:5T /2!W.R!R971U<FX =SM]#0H ("\O(&]V97)L;V%D<R!A
M6UT-"B  87)R87D (&]P4VQI8V4H*2![(')E='5R;B!O<$-A;&PH96QE;65N
M=',L(&9A;'-E*3L ?0T*(" O+R!O=F5R;&]A9', 85MI("XN(&I=#0H (&%R
M<F%Y("!O<%-L:6-E*'5I;G0 ;"P =6EN="!H*2![(')E='5R;B!O<$-A;&PH
M96QE;65N='-;;"XN:%TL9F%L<V4I.R!]#0H-"B  +R\ ;W9E<FQO861S(&%R
M<F%Y('X](%0-"B  87)R87DJ("!O<$-A=$%S<VEG;BA4('<I('L <'5S:"AW
M*3L <F5T=7)N('1H:7,[('T ( T*(" O+R!O=F5R;&]A9', 87)R87D ?CT 
M5%M=( T*("!A<G)A>2H (&]P0V%T07-S:6=N*%1;72!W82D >R!P=7-H*'=A
M*3L <F5T=7)N('1H:7,[('T #0H-"B  +R\ ;W9E<FQO861S(&%R<F%Y(#T 
M87)R87D ?B!4#0H (&%R<F%Y*B  ;W!#870H5"!V*2![('!U<V H=BD[(')E
M='5R;B!T:&ES.R!]( T*(" O+R!O=F5R;&]A9', 87)R87D /2!A<G)A>2!^
M(%1;70T*("!A<G)A>2H (&]P0V%T*%1;72!V82D >R!P=7-H*'9A*3L <F5T
M=7)N('1H:7,[('T #0H ("\O(&]V97)L;V%D<R!A<G)A>2 ](%0 ?B!A<G)A
M>2 -"B  87)R87DJ("!O<$-A=%]R*%0 =BD >R!I;G-E<G0H,"QV*3L <F5T
M=7)N('1H:7,[('T #0H ("\O(&]V97)L;V%D<R!A<G)A>2 ](%1;72!^(&%R
M<F%Y( T*("!A<G)A>2H (&]P0V%T7W(H5%M=('9A*2![(&EN<V5R=" P+'9A
M*3L <F5T=7)N('1H:7,[('T #0H-"B  +R\ 05143CH <&QE87-E('5S92!I
M="!O;FQY(&9O<B!R96%D+6]N;'D 86-C97-S(0T*("!46UT ("  (&]P0V%S
M=" I('L <F5T=7)N(&5L96UE;G1S.R!]#0H-"B  +R\ :6UM=71A8FQE(&5N
M=6UE<F%T:6]N#0H ("\O(&9O<B!M=71A=&EO;G, =7-E(&UU=&%B;&5?:71E
M;7,-"B  :6YT("  ("!O<$%P<&QY*&EN="!D96QE9V%T92AI;F]U="!4*2!D
M9RD-"B  >R  ( T*("  (&EN="!R97-U;'0 /2 P.PT*("  (&9O<BAU:6YT
M(&D /2 P.R!I(#P 96QE;65N=',N;&5N9W1H.R K*VD *2 -"B  ("![#0H 
M("  ("!4('0 /2!E;&5M96YT<UMI73L-"B  ("  (')E<W5L=" ](&1G*'0I
M.PT*("  ("  :68 *')E<W5L="D (&)R96%K.PT*("  ('T-"B  ("!R971U
M<FX <F5S=6QT.PT*("!]#0H-"B  <W1R=6-T($5.54T +R\ 8FED:7)E8W1I
M;VYA;"!E;G5M97)A=&]R#0H ('L-"B  ("!46UT ("!?83L-"B  ("!B;V]L
M("!?9F]R=V%R9#L-"B  ("!I;G0 ;W!!<'!L>2AI;G0 9&5L96=A=&4H:6YO
M=70 5"D 9&<I#0H ("  >R  ( T*("  ("  :6YT(')E<W5L=" ](# [#0H 
M("  ("!I9BA?9F]R=V%R9"D-"B  ("  ("  9F]R*'5I;G0 :2 ](# [(&D 
M/"!?82YL96YG=& [("LK:2 I('L 5"!T(#T 7V%;:5T[(')E<W5L=" ](&1G
M*'0I.R  :68 *')E<W5L="D (&)R96%K.R!]#0H ("  ("!E;'-E#0H ("  
M("  (&9O<BAI;G0 :2 ](%]A+FQE;F=T:" M(#$[(&D /CT ,#L +2UI("D 
M>R!4('0 /2!?85MI73L <F5S=6QT(#T 9&<H="D[(&EF("AR97-U;'0I("!B
M<F5A:SL ?0T*("  ("  <F5T=7)N(')E<W5L=#L-"B  ("!]#0H ('T-"B  
M14Y532!I=&5M<RAB;V]L(&9O<G=A<F0I('L 14Y532!W.R!W+E]F;W)W87)D
M(#T 9F]R=V%R9#L =RY?82 ](&5L96UE;G1S.R!R971U<FX =SL ?0T*("!%
M3E5-(&9O<G=A<F0H*2![(')E='5R;B!I=&5M<RAT<G5E*3L ?0T*("!%3E5-
M(&)A8VMW87)D*"D >R!R971U<FX :71E;7,H9F%L<V4I.R!]#0H-"B  <W1R
M=6-T($U55$%"3$5?14Y532 O+R!B:61I<F5C=&EO;F%L(&UU=&%B;&4 96YU
M;65R871O< T*("![#0H ("  5%M=("  7V$[#0H ("  8F]O;"  7V9O<G=A
M<F0[#0H ("  :6YT(&]P07!P;'DH:6YT(&1E;&5G871E*&EN;W5T(%0I(&1G
M*0T*("  ('L (" -"B  ("  (&EN="!R97-U;'0 /2 P.PT*("  ("  :68H
M7V9O<G=A<F0I#0H ("  ("  (&9O<BAU:6YT(&D /2 P.R!I(#P 7V$N;&5N
M9W1H.R K*VD *2![(')E<W5L=" ](&1G*%]A6VE=*3L (&EF("AR97-U;'0I
M("!B<F5A:SL ?0T*("  ("  96QS90T*("  ("  ("!F;W(H:6YT(&D /2!?
M82YL96YG=&  +2 Q.R!I(#X](# [("TM:2 I('L <F5S=6QT(#T 9&<H7V%;
M:5TI.R!I9B H<F5S=6QT*2  8G)E86L[('T-"B  ("  (')E='5R;B!R97-U
M;'0[#0H ("  ?0T*("!]#0H ($U55$%"3$5?14Y532!M=71A8FQE7VET96US
M*&)O;VP 9F]R=V%R9"D >R!M=71A=&4H*3L 355404),15]%3E5-('<[('<N
M7V9O<G=A<F0 /2!F;W)W87)D.R!W+E]A(#T 96QE;65N=',[(')E='5R;B!W
M.R!]#0H ($U55$%"3$5?14Y532!M=71A8FQE7V9O<G=A<F0H*2![(')E='5R
M;B!M=71A8FQE7VET96US*'1R=64I.R!]#0H ($U55$%"3$5?14Y532!M=71A
M8FQE7V)A8VMW87)D*"D >R!R971U<FX ;75T86)L95]I=&5M<RAF86QS92D[
M('T-" T*#0H ("\O('-E;&5C=&EV92!E;G5M97)A=&]R+"!W:6QL('=A;&L 
M=&AR;W5G:" -"B  +R\ ;VYL>2!E;&5M96YT<R!O9B!T:&4 87)R87D =VAI
M8V  87)E(&EN<W1A;F-E<PT*(" O+R!O9B!45"P :6UM=71A8FQE#0H-"B  
M=&5M<&QA=&4 <V5L96-T;W(H5%0I#0H ('L-"B  ("  ('!U8FQI8R!S=')U
M8W0 4T5.54T-"B  ("  ('L-"B  ("  ("  5%M=(%]A.PT*("  ("  ("!I
M;G0 7V9O<G=A<F0[#0H ("  ("  (&EN="!O<$%P<&QY*&EN="!D96QE9V%T
M92AI;F]U="!45"D 9&<I#0H ("  ("  ('L (" -"B  ("  ("  ("!I;G0 
M<F5S=6QT(#T ,#L-"B  ("  ("  ("!I9BA?9F]R=V%R9"D-"B  ("  ("  
M("  (&9O<BAU:6YT(&D /2 P.R!I(#P 7V$N;&5N9W1H.R K*VD *2 -"B  
M("  ("  ("  ('L-"B  ("  ("  ("  ("  5%0 ='0 /2!C87-T*%14*5]A
M6VE=.PT*("  ("  ("  ("  ("!I9BAT="D-"B  ("  ("  ("  ("  ("!R
M97-U;'0 /2!D9RAT="D[#0H ("  ("  ("  ("  (&EF("AR97-U;'0I("!B
M<F5A:SL-"B  ("  ("  ("  ('T-"B  ("  ("  ("!E;'-E#0H ("  ("  
M("  ("!F;W(H:6YT(&D /2!?82YL96YG=&  +2 Q.R!I(#X](# [("TM:2 I
M( T*("  ("  ("  ("  >PT*("  ("  ("  ("  ("!45"!T=" ](&-A<W0H
M5%0I7V%;:5T[#0H ("  ("  ("  ("  (&EF*'1T*0T*("  ("  ("  ("  
M("  (')E<W5L=" ](&1G*'1T*3L-"B  ("  ("  ("  ("  :68 *')E<W5L
M="D (&)R96%K.PT*("  ("  ("  ("  ?0T*("  ("  ("  (')E='5R;B!R
M97-U;'0[#0H ("  ("  ('T-"B  ("  ('T-"B  ("  (%-%3E5-('-E;&5C
M="AB;V]L(&9O<G=A<F0 /2!T<G5E*2![(%-%3E5-('<[('<N7V9O<G=A<F0 
M/2!F;W)W87)D.R!W+E]A(#T 96QE;65N=',[(')E='5R;B!W.R!]#0H ('T-
M" T*(" O+R!D96QE=&5S('1H92!B=69F97(L($9,04U-04),12P 55-%(%=)
M5$  0T%212$-"B  =F]I9"!D97-T<F]Y*"D >R!I9BAM=71A8FQE*2!D96QE
M=&4 96QE;65N=',[(&5L96UE;G1S(#T ;G5L;#L ?0T*#0I]#0H-" T*+R]\
M#0HO+WP 4WEM5&%B;&4 :7, 82 B<WEM8F]L('1A8FQE( T*+R]\#0H-" T*
M8VQA<W, 4WEM5&%B;&4-"GL-"B  86QI87, ("!U:6YT('-Y;6)O;#L-"B  
M<W1A=&EC("!C:&%R6UT =6YD969I;F5D(#T (GMU;F1E9FEN961](CL +R\ 
M=6YD969I;F5D(&5L96UE;G0-"G!R:79A=&4Z(" -"B  =6EN=%MC:&%R6UU=
M("!M87 [#0H (&-H87);72  ("  ("  96QE;65N='-;73L-" T*(" O+R!A
M9&0 4F5F(&]F(&5L96UE;G0-"B  =F]I9"!A9&12968H8VAA<EM=(&5L96UE
M;G0I#0H ('L-"B  ("!A<W-E<G0H("$H96QE;65N="!I;B!M87 I("D[#0H 
M("  <WEM8F]L('-Y;2 ](&-A<W0H<WEM8F]L*2AE;&5M96YT<RYL96YG=&  
M*R Q*3L-"B  ("!E;&5M96YT<RYL96YG=&  /2!S>6T[#0H ("  96QE;65N
M='-;<WEM("T ,5T /2!E;&5M96YT.PT*("  (&UA<%L 96QE;65N="!=(#T 
M<WEM.PT*("!]#0H-"G!U8FQI8SH-" T*("!T:&ES*"D >WT-" T*(" O+R!I
M;FET:6%L:7IE(%!O;VP 8GD =&%B;&4 ;V8 <W1A=&EC(&]B:F5C=',-"B  
M=&AI<RAC:&%R6UT =&%B;&5;72D >R!F;W)E86-H*&-H87);72!W.R!T86)L
M92D 861D4F5F*'<I.R!]#0H-"B  +R\ 9V5T('-Y;6)O;"!O9B!E;&5M96YT
M#0H ('-Y;6)O;"!O<$EN9&5X*&-H87);72!E;&5M96YT*0T*("![#0H ("  
M<WEM8F]L('-Y;2 ](&UA<%ME;&5M96YT73L-"B  ("!I9B  <WEM(#T](#  
M*2 O+R!I="!I<R!N;W0 :6X <&]O;"!Y970-"B  ("![#0H ("  ("!S>6T 
M/2!C87-T*'-Y;6)O;"DH96QE;65N=',N;&5N9W1H("L ,2D[#0H ("  ("!E
M;&5M96YT<RYL96YG=&  /2!S>6T[#0H ("  ("!E;&5M96YT<UMS>6T +2 Q
M72 ](&5L96UE;G0N9'5P.PT*("  ("  ;6%P6R!E;&5M96YT(%T /2!S>6T[
M#0H ("  ?0T*("  (')E='5R;B!S>6T[#0H ('T-" T*(" O+R!G970 96QE
M;65N="!B>2!I=', <WEM8F]L#0H (&-H87);72  ;W!#86QL*'-Y;6)O;"!S
M>6TI#0H ('L-"B  ("!R971U<FX *"!S>6T /B P("8F('-Y;2 \/2!E;&5M
M96YT<RYL96YG=&  *3\ 96QE;65N='-;<WEM+3%=.B!U;F1E9FEN960[#0H 
M('T-"B  +R\ =&5S="!F;W( 97AI<W1E;F-E(&]F(&5L96UE;G0 :6X =&AE
M('!O;VP-"B  8F]O;"!E>&ES=',H8VAA<EM=(&5L96UE;G0I('L <F5T=7)N
M("AE;&5M96YT(&EN(&UA<"D (3T](&YU;&P[('T-"B  #0H ("\O(&EN=&5R
M;B!E;&5M96YT+"!R971U<FYS(&$ =6YI<75E(&-O<'D ;V8 =&AE(&5L96UE
M;G0-"B  8VAA<EM=(&EN=&5R;BAC:&%R6UT 96QE;65N="D >R!R971U<FX 
M;W!#86QL*"!O<$EN9&5X*"!E;&5M96YT("D *3L ?0T*?0T*#0H-"B\O#0HO
M+R!$:6-T:6]N87)Y+"!M87!S(&ME>2]V86QU92!P86ER('1O('1H92!S>6UB
M;VPH=6EN="D ( T*+R\ 06QL;W=S('1O(')E=')I979E('9A;'5E(&)Y(&ET
M<R!K97D ;W( ;G5M97)I8R!S>6UB;VP-"B\O#0H-"F-L87-S($1I8W1I;VYA
M<GDH2T59+"!604Q512D-"GL-"B  86QI87, ("!U:6YT("  <WEM8F]L.PT*
M("!S=&%T:6, (%9!3%5%("!U;F1E9FEN960[("\O('5N9&5F:6YE9"!E;&5M
M96YT#0IP<FEV871E.B  #0H ('5I;G1;2T5972  ;6%P.PT*("!604Q512  
M("  (&5L96UE;G1S6UT[#0IP=6)L:6,Z#0H-"B  =&AI<R I('M]#0H-"B  
M+R\ 9V5T('-Y;6)O;"!O9B!E;&5M96YT#0H ('-Y;6)O;"!O<$EN9&5X*$M%
M62!K97DI#0H ('L-"B  ("!R971U<FX ;6%P6VME>5T[#0H ('T-" T*("!S
M>6UB;VP ;W!);F1E>"A+15D :V5Y+"!604Q512!D96QE9V%T92A+15D :RD 
M8W1O<BD-"B  >PT*("  ('-Y;6)O;"!S>6T /2!M87!;:V5Y73L-"B  ("!I
M9B  <WEM(#T](#  *2 O+R!I="!I<R!N;W0 :6X 9&EC=&EO;F%R>2!Y970-
M"B  ("![#0H ("  ("!S>6T /2!C87-T*'-Y;6)O;"DH96QE;65N=',N;&5N
M9W1H("L ,2D[#0H ("  ("!E;&5M96YT<RYL96YG=&  /2!S>6T[#0H ("  
M("!E;&5M96YT<UMS>6T +2 Q72 ](&-T;W(H:V5Y*3L-"B  ("  (&UA<%L 
M:V5Y(%T /2!S>6T[#0H ("  ?0T*("  (')E='5R;B!S>6T[#0H ('T-"B  
M<WEM8F]L(&]P26YD97 H2T59(&ME>2P 5D%,544 9G5N8W1I;VXH2T59(&LI
M(&-T;W(I#0H ('L-"B  ("!R971U<FX ;W!);F1E>"AK97DL("!D96QE9V%T
M92!604Q512A+15D :RD >R!R971U<FX 8W1O<BAK*3L ?2 I.PT*("!]#0H-
M"B  +R\ 9V5T('-Y;6)O;"!O9B!E;&5M96YT#0H (%9!3%5%(&]P26YD97A!
M<W-I9VXH5D%,544 =BP 2T59(&ME>2D-"B  >PT*("  ('-Y;6)O;"!S>6T 
M/2!M87!;:V5Y73L-"B  ("!I9B  <WEM(#T](#  *2 O+R!I="!I<R!N;W0 
M:6X 9&EC=&EO;F%R>2!Y970-"B  ("![#0H ("  ("!S>6T /2!C87-T*'-Y
M;6)O;"DH96QE;65N=',N;&5N9W1H("L ,2D[#0H ("  ("!E;&5M96YT<RYL
M96YG=&  /2!S>6T[#0H ("  ("!M87!;(&ME>2!=(#T <WEM.PT*("  ('T-
M"B  ("!E;&5M96YT<UMS>6T +2 Q72 ]('8[#0H ("  <F5T=7)N('8[#0H 
M('T-"B  +R\ #0H-"B  +R\ 9V5T(&5L96UE;G0 8GD :71S('-Y;6)O; T*
M("!604Q512  ;W!#86QL*'-Y;6)O;"!S>6TI#0H ('L-"B  ("!R971U<FX 
M*"!S>6T /B P("8F('-Y;2 \/2!E;&5M96YT<RYL96YG=&  *3\ 96QE;65N
M='-;<WEM+3%=.B!U;F1E9FEN960[#0H ('T-"B  +R\ =&5S="!F;W( 97AI
M<W1E;F-E(&]F(&5L96UE;G0 :6X =&AE('!O;VP-"B  8F]O;"!E>&ES=',H
M2T59(&ME>2D >R!R971U<FX *&ME>2!I;B!M87 I("$]/2!N=6QL.R!]#0H 
M(&)O;VP =F%L:60H<WEM8F]L('-Y;2D >R!R971U<FX *"!S>6T /B P("8F
M('-Y;2 \/2!E;&5M96YT<RYL96YG=&  *3L ?0T*(" -"B  +R\ :6YT97)N
M(&5L96UE;G0L(')E='5R;G, 82!U;FEQ=64 8V]P>2!O9B!T:&4 96QE;65N
M= T*("!604Q512!I;G1E<FXH2T59(&ME>2P 5D%,544 9G5N8W1I;VXH2T59
M(&LI(&-T;W( *2 -"B  >R -"B  ("!R971U<FX ;W!#86QL*"!O<$EN9&5X
M*&ME>2QC=&]R*2 I.R -"B  ?0T*("!604Q512!I;G1E<FXH2T59(&ME>2P 
M5D%,544 9&5L96=A=&4H2T59(&LI(&-T;W( *2 -"B  >R -"B  ("!R971U
M<FX ;W!#86QL*"!O<$EN9&5X*&ME>2QC=&]R*2 I.R -"B  ?0T*#0I]#0H-
M"G-T<G5C="!D871E=&EM90T*>PT*("!D7W1I;64 9'0 /2!L;VYG+FUI;CL-
M" T*("!B;V]L('9A;&ED*"D >R!R971U<FX 9'0 (3T 9%]T:6UE7VYA;CL 
M?0T*#0H ('-T871I8R!D871E=&EM92!O<$-A;&PH9%]T:6UE(&1T*2![(&1A
M=&5T:6UE(&0[(&0N9'0 /2!D=#L <F5T=7)N(&0[('T-"B  <W1A=&EC(&1A
M=&5T:6UE(&]P0V%L;"AC:&%R6UT <RD >R!D871E=&EM92!D.R!D+F1T(#T 
M<W1D+F1A=&4N<&%R<V4H<RD[(')E='5R;B!D.R!]#0H ('-T871I8R!D871E
M=&EM92!O<$-A;&PH=V-H87);72!S*2![(&1A=&5T:6UE(&0[(&0N9'0 /2!S
M=&0N9&%T92YP87)S92AW,F$H<RDI.R!R971U<FX 9#L ?0T*#0H (&5N=6T 
M1D]234%4('L 551#+"!'350L($-53"!]#0H-"B  8VAA<EM=(&9O<FUA="A&
M3U)-050 9B ]($9/4DU!5"Y55$,I( T*("![( T*("  (&EF*"!F(#T]($9/
M4DU!5"Y55$, *2!R971U<FX <W1D+F1A=&4N=&]55$-3=')I;F<H9'0I.PT*
M("  (&5L<V4 :68H(&8 /3T 1D]234%4+D=-5" I(')E='5R;B!S=&0N9&%T
M92YT;U-T<FEN9RAD="D[#0H ("  96QS92!I9B  9B ]/2!&3U)-050N0U5,
M("D <F5T=7)N(")#54PZ(&-U<G)E;G0 =7-E<B!L;V-A;&4 :7, ;F]T(&EM
M<&QE;65N=&5D('EE="([#0H ("  <F5T=7)N("(B.PT*("!]( T*("!W8VAA
M<EM=('=F;W)M870H1D]234%4(&8 /2!&3U)-050N551#*2![(')E='5R;B!T
;U541C$V*&9O<FUA="AF*2D[('T #0I]#0H-" T*
` end
May 26 2005