Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » Is EMF suitable to implement key/keyref pairs?
Is EMF suitable to implement key/keyref pairs? [message #504371] Fri, 18 December 2009 14:42 Go to next message
Mauro Condarelli is currently offline Mauro CondarelliFriend
Messages: 428
Registered: September 2009
Senior Member
Hi,
Disclaimer: although I'm a seasoned programmer I am no XML guru and a
real newbie to EMF. I seek advice about how to learn fast.

Problem: I must write an application that reads a moderately complex
..xml file, does some non-trivial modifications and then writes it back.

Constraint: I must read a file written by another application and write
it back exactly in the same format because ti must be opened again by
the other app (I have no control over that app). My app is RCP-based.

Current status: I have this somewhat working using JAXB, problem is JAXB
handling of the in-memory model seems to be rather primitive and adding
features is becoming more and more complex. Also, since I'm using
eclipse-RCP, switching to EMF seems the logical step.

Question: will I gain some significant advantage from the switch? I
refer mainly to model manipulation; I already wrote a
ITreeContentProvider/ILabelProvider implementation to the JAXB-generated
classes.

My main problem is the .xml file contains several constructs like
....
<OBJECTS>
    <OBJECT>
       <ID>1</ID>
       <NAME><[!CDATA[aName]]></NAME>
       ...
    </OBJECT>
    <OBJECT>
       <ID>33</ID>
       <NAME><[!CDATA[anotherName]]></NAME>
       ...
    </OBJECT>
    ...
</OBJECTS>
<PLACES>
    <PLACE>
       <ID>1</ID>
       <NAME><[!CDATA[aPlaceName]]></NAME>
       <Objects>
          <ObjID>1</ObjID>
          <ObjID>2</ObjID>
       </Objects>
       ...
    </PLACE>
    <PLACE>
       <ID>33</ID>
       <NAME><[!CDATA[anotherPlaceName]]></NAME>
       <Objects>
          <ObjID>11</ObjID>
          <ObjID>2</ObjID>
       </Objects>
       ...
    </PLACE>
    ...
</PLACES>
<ROOMS>
    <ROOM>
       <ID>21</ID>
       <NAME><[!CDATA[aRoomName]]></NAME>
       <Places>
          <PlID>1</PlID>
          <PlID>2</PlID>
          ...
       </Places>
       ...
    </ROOM>
    <ROOM>
       <ID>22</ID>
       <NAME><[!CDATA[anotherRoomName]]></NAME>
       <Places>
          <PlID>3</PlID>
          <PlID>4</PlID>
          ...
       </Places>
       ...
    </ROOM>
    ...
</ROOMS>
....
Ok. You get the trend.
Notice the CDATA and the name clash between classes (e.g.:
Places/PLACES), at least under windows.

I am already fighting with XML specification to code the key/keyref
stanzas in my .xsd file (is that worthwhile? JAXB does not use them).
As said I'm no XML expert.

After that I will have to code things like move OBJECT from PLACE to
PLACE, add OBJECT, delete OBJECT and the like.

I would like some knowledgeable person to suggest an implementation
strategy for both .xsd and EMF, if appropriate.
I strongly fear I will have many false starts and will explore many dead
alleys if left alone to experiment.

Thanks in Advance for any light :)

Best Regards
Mauro
Re: Is EMF suitable to implement key/keyref pairs? [message #504402 is a reply to message #504371] Fri, 18 December 2009 12:22 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33137
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------090200000600000700070208
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Mauro,

Comments below.

Mauro Condarelli wrote:
> Hi,
> Disclaimer: although I'm a seasoned programmer I am no XML guru and a
> real newbie to EMF. I seek advice about how to learn fast.
>
> Problem: I must write an application that reads a moderately complex
> .xml file, does some non-trivial modifications and then writes it back.
>
> Constraint: I must read a file written by another application and
> write it back exactly in the same format because ti must be opened
> again by the other app (I have no control over that app). My app is
> RCP-based.
>
> Current status: I have this somewhat working using JAXB, problem is
> JAXB handling of the in-memory model seems to be rather primitive and
> adding features is becoming more and more complex. Also, since I'm
> using eclipse-RCP, switching to EMF seems the logical step.
>
> Question: will I gain some significant advantage from the switch? I
> refer mainly to model manipulation; I already wrote a
> ITreeContentProvider/ILabelProvider implementation to the
> JAXB-generated classes.
You'd get the latter for free. I assume you have an XML Schema? It
would take only a few minutes to test drive your schema using the steps
in this tutorial:

Tutorial: Generating an EMF Model using XML Schema
< http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclips e.emf.doc/tutorials/xlibmod/xlibmod.html>

>
> My main problem is the .xml file contains several constructs like
>
> ...
> <OBJECTS>
>    <OBJECT>
>       <ID>1</ID>
>       <NAME><[!CDATA[aName]]></NAME>
>       ...
>    </OBJECT>
>    <OBJECT>
>       <ID>33</ID>
>       <NAME><[!CDATA[anotherName]]></NAME>
>       ...
>    </OBJECT>
>    ...
> </OBJECTS>
> <PLACES>
>    <PLACE>
>       <ID>1</ID>
>       <NAME><[!CDATA[aPlaceName]]></NAME>
>       <Objects>
>          <ObjID>1</ObjID>
>          <ObjID>2</ObjID>
>       </Objects>
>       ...
>    </PLACE>
>    <PLACE>
>       <ID>33</ID>
>       <NAME><[!CDATA[anotherPlaceName]]></NAME>
>       <Objects>
>          <ObjID>11</ObjID>
>          <ObjID>2</ObjID>
>       </Objects>
>       ...
>    </PLACE>
>    ...
> </PLACES>
> <ROOMS>
>    <ROOM>
>       <ID>21</ID>
>       <NAME><[!CDATA[aRoomName]]></NAME>
>       <Places>
>          <PlID>1</PlID>
>          <PlID>2</PlID>
>          ...
>       </Places>
>       ...
>    </ROOM>
>    <ROOM>
>       <ID>22</ID>
>       <NAME><[!CDATA[anotherRoomName]]></NAME>
>       <Places>
>          <PlID>3</PlID>
>          <PlID>4</PlID>
>          ...
>       </Places>
>       ...
>    </ROOM>
>    ...
> </ROOMS>
> ...
> 
Ok. You get the trend.
> Notice the CDATA and the name clash between classes
This option will help, but it will only use CDATA when it's needed.

/**
* Serialized element content that needs escaping and doesn't
contain <code>"]]>"</code>, will be escaped using CDATA.
* The default value is false.
* @since {@link #OPTION_SKIP_ESCAPE}
* @since 2.4
*/
String OPTION_ESCAPE_USING_CDATA = "ESCAPE_USING_CDATA";

If the content corresponds a complex type with mixed content then the
CDATA will be preserved in all cases.

Binding XML to Java
< http://www.theserverside.com/tt/articles/article.tss?l=Bindi ngXMLJava>

> (e.g.: Places/PLACES), at least under windows.
With extended meta data, the Java names needn't be the same as the XML
names, which could even include things line - which aren't allowed in Java.
>
> I am already fighting with XML specification to code the key/keyref
> stanzas in my .xsd file (is that worthwhile? JAXB does not use them).
> As said I'm no XML expert.
EMF will ignore them as well, at least as far as treating them as a
reference or enforcing the constraint.
>
> After that I will have to code things like move OBJECT from PLACE to
> PLACE, add OBJECT, delete OBJECT and the like.
>
> I would like some knowledgeable person to suggest an implementation
> strategy for both .xsd and EMF, if appropriate.
> I strongly fear I will have many false starts and will explore many
> dead alleys if left alone to experiment.
If you have a schema it will take only a few minutes to test drive EMF.
Note that you can also invoke Generate Test Code and end up with a
simple stand alone application XyzExample.java for reading and writing
instances.
>
> Thanks in Advance for any light :)
>
> Best Regards
> Mauro

--------------090200000600000700070208
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Mauro,<br>
<br>
Comments below.<br>
<br>
Mauro Condarelli wrote:
<blockquote cite="mid:hgg4dv$93g$1@build.eclipse.org" type="cite">Hi,
<br>
Disclaimer: although I'm a seasoned programmer I am no XML guru and a
real newbie to EMF. I seek advice about how to learn fast.
<br>
<br>
Problem: I must write an application that reads a moderately complex
..xml file, does some non-trivial modifications and then writes it back.
<br>
<br>
Constraint: I must read a file written by another application and write
it back exactly in the same format because ti must be opened again by
the other app (I have no control over that app). My app is RCP-based.
<br>
<br>
Current status: I have this somewhat working using JAXB, problem is
JAXB handling of the in-memory model seems to be rather primitive and
adding features is becoming more and more complex. Also, since I'm
using eclipse-RCP, switching to EMF seems the logical step.
<br>
<br>
Question: will I gain some significant advantage from the switch? I
refer mainly to model manipulation; I already wrote a
ITreeContentProvider/ILabelProvider implementation to the
JAXB-generated classes.
<br>
</blockquote>
You'd get the latter for free.&nbsp; I assume you have an XML Schema? It
would take only a few minutes to test drive your schema using the steps
in this tutorial:<br>
<blockquote><a
href=" http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclips e.emf.doc/tutorials/xlibmod/xlibmod.html">Tutorial:
Generating an EMF Model using XML Schema</a></blockquote>
<blockquote cite="mid:hgg4dv$93g$1@build.eclipse.org" type="cite"><br>
My main problem is the .xml file contains several constructs like
<br>
  <br>
....
  <br>
&lt;OBJECTS&gt;
  <br>
&nbsp;&nbsp; &lt;OBJECT&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;1&lt;/ID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;NAME&gt;&lt;[!CDATA[aName]]&gt;&lt;/NAME&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
  <br>
&nbsp;&nbsp; &lt;/OBJECT&gt;
  <br>
&nbsp;&nbsp; &lt;OBJECT&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;33&lt;/ID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;NAME&gt;&lt;[!CDATA[anotherName]]&gt;&lt;/NAME&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
  <br>
&nbsp;&nbsp; &lt;/OBJECT&gt;
  <br>
&nbsp;&nbsp; ...
  <br>
&lt;/OBJECTS&gt;
  <br>
&lt;PLACES&gt;
  <br>
&nbsp;&nbsp; &lt;PLACE&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;1&lt;/ID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;NAME&gt;&lt;[!CDATA[aPlaceName]]&gt;&lt;/NAME&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Objects&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ObjID&gt;1&lt;/ObjID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ObjID&gt;2&lt;/ObjID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Objects&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
  <br>
&nbsp;&nbsp; &lt;/PLACE&gt;
  <br>
&nbsp;&nbsp; &lt;PLACE&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;33&lt;/ID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;NAME&gt;&lt;[!CDATA[anotherPlaceName]]&gt;&lt;/NAME&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Objects&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ObjID&gt;11&lt;/ObjID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ObjID&gt;2&lt;/ObjID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Objects&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
  <br>
&nbsp;&nbsp; &lt;/PLACE&gt;
  <br>
&nbsp;&nbsp; ...
  <br>
&lt;/PLACES&gt;
  <br>
&lt;ROOMS&gt;
  <br>
&nbsp;&nbsp; &lt;ROOM&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;21&lt;/ID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;NAME&gt;&lt;[!CDATA[aRoomName]]&gt;&lt;/NAME&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Places&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;PlID&gt;1&lt;/PlID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;PlID&gt;2&lt;/PlID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Places&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
  <br>
&nbsp;&nbsp; &lt;/ROOM&gt;
  <br>
&nbsp;&nbsp; &lt;ROOM&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;22&lt;/ID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;NAME&gt;&lt;[!CDATA[anotherRoomName]]&gt;&lt;/NAME&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Places&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;PlID&gt;3&lt;/PlID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;PlID&gt;4&lt;/PlID&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Places&gt;
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
  <br>
&nbsp;&nbsp; &lt;/ROOM&gt;
  <br>
&nbsp;&nbsp; ...
  <br>
&lt;/ROOMS&gt;
  <br>
....
  <br>
Ok. You get the trend.
<br>
Notice the CDATA and the name clash between classes</blockquote>
This option will help,&nbsp; but it will only use CDATA when it's needed.<br>
<blockquote>&nbsp; /**<br>
&nbsp;&nbsp; * Serialized element content that needs escaping and doesn't contain
&lt;code&gt;"]]&gt;"&lt;/code&gt;, will be escaped using CDATA.<br>
&nbsp;&nbsp; * The default value is false.<br>
&nbsp;&nbsp; * @since {@link #OPTION_SKIP_ESCAPE}<br>
&nbsp;&nbsp; * @since 2.4<br>
&nbsp;&nbsp; */<br>
&nbsp; String OPTION_ESCAPE_USING_CDATA = "ESCAPE_USING_CDATA";<br>
</blockquote>
If the content corresponds a complex type with mixed content then the
CDATA will be preserved in all cases.<br>
<blockquote><a target="_out"
href=" http://www.theserverside.com/tt/articles/article.tss?l=Bindi ngXMLJava">Binding
XML to Java</a></blockquote>
<blockquote cite="mid:hgg4dv$93g$1@build.eclipse.org" type="cite">
(e.g.: Places/PLACES), at least under windows.
<br>
</blockquote>
With extended meta data, the Java names needn't be the same as the XML
names, which could even include things line - which aren't allowed in
Java.<br>
<blockquote cite="mid:hgg4dv$93g$1@build.eclipse.org" type="cite"><br>
I am already fighting with XML specification to code the key/keyref
stanzas in my .xsd file (is that worthwhile? JAXB does not use them).
<br>
As said I'm no XML expert.
<br>
</blockquote>
EMF will ignore them as well, at least as far as treating them as a
reference or enforcing the constraint.<br>
<blockquote cite="mid:hgg4dv$93g$1@build.eclipse.org" type="cite"><br>
After that I will have to code things like move OBJECT from PLACE to
PLACE, add OBJECT, delete OBJECT and the like.
<br>
<br>
I would like some knowledgeable person to suggest an implementation
strategy for both .xsd and EMF, if appropriate.
<br>
I strongly fear I will have many false starts and will explore many
dead alleys if left alone to experiment.
<br>
</blockquote>
If you have a schema it will take only a few minutes to test drive
EMF.&nbsp; Note that you can also invoke Generate Test Code and end up with
a simple stand alone application XyzExample.java for reading and
writing instances.<br>
<blockquote cite="mid:hgg4dv$93g$1@build.eclipse.org" type="cite"><br>
Thanks in Advance for any light :)
<br>
<br>
Best Regards
<br>
Mauro
<br>
</blockquote>
</body>
</html>

--------------090200000600000700070208--


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: Is EMF suitable to implement key/keyref pairs? [message #504485 is a reply to message #504402] Sun, 20 December 2009 14:35 Go to previous messageGo to next message
Mauro Condarelli is currently offline Mauro CondarelliFriend
Messages: 428
Registered: September 2009
Senior Member
This is a multi-part message in MIME format.
--------------040001080107010107070602
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Ed Merks wrote:
> You'd get the latter for free. I assume you have an XML Schema? It
> would take only a few minutes to test drive your schema using the steps
> in this tutorial:
>
> Tutorial: Generating an EMF Model using XML Schema
> < http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclips e.emf.doc/tutorials/xlibmod/xlibmod.html>
>
> This option will help, but it will only use CDATA when it's needed.
>
> /**
> * Serialized element content that needs escaping and doesn't
> contain <code>"]]>"</code>, will be escaped using CDATA.
> * The default value is false.
> * @since {@link #OPTION_SKIP_ESCAPE}
> * @since 2.4
> */
> String OPTION_ESCAPE_USING_CDATA = "ESCAPE_USING_CDATA";
>
> If the content corresponds a complex type with mixed content then the
> CDATA will be preserved in all cases.
>
> Binding XML to Java
> < http://www.theserverside.com/tt/articles/article.tss?l=Bindi ngXMLJava>
>
>> (e.g.: Places/PLACES), at least under windows.
> With extended meta data, the Java names needn't be the same as the XML
> names, which could even include things line - which aren't allowed in Java.
>>
> If you have a schema it will take only a few minutes to test drive EMF.
> Note that you can also invoke Generate Test Code and end up with a
> simple stand alone application XyzExample.java for reading and writing
> instances.
I tried, but my unadulterated .xls (working with JAXB) doesn't seem able
to read my current file.
Unless I goofed very badly there's something amiss.

I include both my .xls and my test file.
Please notice I built the .xls file from the examples, so I could have
done wrong choices.

The test application can read my test file, but I didn't find an easy
way to print out the resulting tree.
I tried walking it, but the eContents() field seem jut to enumerate the
list arguments. Perusing in debug mode shows the content is there. I
just miss the correct printing method, which should be different for
each class. Is there a way to automatically generate it?
OTOH the generated editor does not show any of the resources, which, I
assume, are accessible through specialized API in the model.

A few questions:

1) Is there a way to create a new element with all required fields set
to the default values? (aside from coding it explicitly, of course ;) )
2) when I peruse any of the ID list types (e.g.: ScID) I see elements
interspersed with strings (mainly indentation) Is there a way (aside
from coding "if (elem instanceof ...) ...") to get the raw int[] or,
better, List<int> I need?
3) What is the correct way to add a certain WhateverID to an ID-list? I
see a eInverseAdd() function is available, but usage is unclear (to me).
4) I see complete notification framework is generated: what is its
intended usage?
5) I seem to understand there is no automatic way to associate the IDs
to the actual classes (map ScID to SCENE) whether I define the
key/keyref pairs or not. Is this correct?
6) CDATA generation will happen if and only if it is required for
escaping. This would be bad because I need to generate them for several
fields regardless of the contents.
7) How can I control the class names? Should i bother?

I am reading now the EMF Developer Guide. What other documentation
should I read? what are other projects/frameworks that could be useful
in this development?

Thanks
Mauro

--------------040001080107010107070602
Content-Type: text/xml;
name="Missione.yw5"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="Missione.yw5"

PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0K PFlXUklURVI1
Pg0KCTxQUk9KRUNUPg0KCQk8VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NE QVRBW0xhIE1p
c3Npb25lXV0+PC9UaXRsZT4NCgkJPERlc2M+PCFbQ0RBVEFbXV0+PC9EZXNj Pg0KCQk8Rmll
bGRUaXRsZTE+PCFbQ0RBVEFbXV0+PC9GaWVsZFRpdGxlMT4NCgkJPEZpZWxk VGl0bGUyPjwh
W0NEQVRBW11dPjwvRmllbGRUaXRsZTI+DQoJCTxGaWVsZFRpdGxlMz48IVtD REFUQVtdXT48
L0ZpZWxkVGl0bGUzPg0KCQk8RmllbGRUaXRsZTQ+PCFbQ0RBVEFbXV0+PC9G aWVsZFRpdGxl
ND4NCgkJPEJpbz48IVtDREFUQVtdXT48L0Jpbz4NCgkJPEF1dGhvck5hbWU+ PCFbQ0RBVEFb
TWF1cm8gQ29uZGFyZWxsaV1dPjwvQXV0aG9yTmFtZT4NCgkJPFdvcmRUYXJn ZXQ+MDwvV29y
ZFRhcmdldD4NCgkJPEVuZE1pZGRsZUNoSUQ+MDwvRW5kTWlkZGxlQ2hJRD4N CgkJPEVuZEJl
Z2lubmluZ0NoSUQ+MjwvRW5kQmVnaW5uaW5nQ2hJRD4NCgkJPFdvcmRDb3Vu dFN0YXJ0PjA8
L1dvcmRDb3VudFN0YXJ0Pg0KCQk8WE1MRmlsZVZlcnNpb24+MjwvWE1MRmls ZVZlcnNpb24+
DQoJCTxMYXN0RnVsbEJhY2t1cD4yMDA5LTEyLTE2PC9MYXN0RnVsbEJhY2t1 cD4NCgkJPFdv
cmRUYXJnZXRTdGFydERhdGU+MTg5OS0xMi0zMDwvV29yZFRhcmdldFN0YXJ0 RGF0ZT4NCgkJ
PFdvcmRUYXJnZXRFbmREYXRlPjE4OTktMTItMzA8L1dvcmRUYXJnZXRFbmRE YXRlPg0KCQk8
TVJVU3BlY2lmaWNEYXRlPjI3MzAtMDUtMDM8L01SVVNwZWNpZmljRGF0ZT4N CgkJPE1SVVNw
ZWNpZmljVGltZT4xMS40MjwvTVJVU3BlY2lmaWNUaW1lPg0KCQk8RGVhZGxp bmVEYXRlMT4y
MDA5LTA5LTI0PC9EZWFkbGluZURhdGUxPg0KCQk8RGVhZGxpbmVEYXRlMj4y MDA5LTEwLTI0
PC9EZWFkbGluZURhdGUyPg0KCQk8RGVhZGxpbmVEYXRlMz4yMDA5LTExLTIz PC9EZWFkbGlu
ZURhdGUzPg0KCQk8RGVhZGxpbmVEYXRlND4yMDA5LTEyLTIzPC9EZWFkbGlu ZURhdGU0Pg0K
CQk8RGVhZGxpbmVEYXRlNT4yMDEwLTAxLTIyPC9EZWFkbGluZURhdGU1Pg0K CQk8RGVhZGxp
bmVTdGFydERhdGUxPjIwMDktMDgtMjY8L0RlYWRsaW5lU3RhcnREYXRlMT4N CgkJPERlYWRs
aW5lU3RhcnREYXRlMj4yMDA5LTA5LTI1PC9EZWFkbGluZVN0YXJ0RGF0ZTI+ DQoJCTxEZWFk
bGluZVN0YXJ0RGF0ZTM+MjAwOS0xMC0yNTwvRGVhZGxpbmVTdGFydERhdGUz Pg0KCQk8RGVh
ZGxpbmVTdGFydERhdGU0PjIwMDktMTEtMjQ8L0RlYWRsaW5lU3RhcnREYXRl ND4NCgkJPERl
YWRsaW5lU3RhcnREYXRlNT4yMDA5LTEyLTI0PC9EZWFkbGluZVN0YXJ0RGF0 ZTU+DQoJPC9Q
Uk9KRUNUPg0KCTxMT0NBVElPTlM+DQoJPExPQ0FUSU9OPg0KCQk8SUQ+MTwv SUQ+DQoJCTxW
ZXI+NTwvVmVyPg0KCQk8VGl0bGU+PCFbQ0RBVEFbQ2FzYSBkZWwgTWFnbyAt IEN1Y2luYV1d
PjwvVGl0bGU+DQoJCTxVbnVzZWQ+MDwvVW51c2VkPg0KCQk8U29ydE9yZGVy PjE8L1NvcnRP
cmRlcj4NCgk8L0xPQ0FUSU9OPg0KCTxMT0NBVElPTj4NCgkJPElEPjI8L0lE Pg0KCQk8VmVy
PjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW0Nhc2EgZGVsIE1hZ28gLSBT dHVkaW9dXT48
L1RpdGxlPg0KCQk8VW51c2VkPjA8L1VudXNlZD4NCgkJPFNvcnRPcmRlcj4y PC9Tb3J0T3Jk
ZXI+DQoJPC9MT0NBVElPTj4NCgk8L0xPQ0FUSU9OUz4NCgk8SVRFTVM+DQoJ PElURU0+DQoJ
CTxJRD4xPC9JRD4NCgkJPFZlcj41PC9WZXI+DQoJCTxUaXRsZT48IVtDREFU QVtBbXVsZXRv
IGRlbCBNYWdvXV0+PC9UaXRsZT4NCgkJPFVudXNlZD4wPC9VbnVzZWQ+DQoJ CTxTb3J0T3Jk
ZXI+MTwvU29ydE9yZGVyPg0KCTwvSVRFTT4NCgk8SVRFTT4NCgkJPElEPjI8 L0lEPg0KCQk8
VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW0FtdWxldG8gZGkgVGhh bm9dXT48L1Rp
dGxlPg0KCQk8VW51c2VkPjA8L1VudXNlZD4NCgkJPFNvcnRPcmRlcj4yPC9T b3J0T3JkZXI+
DQoJPC9JVEVNPg0KCTwvSVRFTVM+DQoJPENIQVJBQ1RFUlM+DQoJPENIQVJB Q1RFUj4NCgkJ
PElEPjE8L0lEPg0KCQk8VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRB W01hZ29dXT48
L1RpdGxlPg0KCQk8VW51c2VkPjA8L1VudXNlZD4NCgkJPFNvcnRPcmRlcj4x PC9Tb3J0T3Jk
ZXI+DQoJCTxBS0E+PCFbQ0RBVEFbSm9uYV1dPjwvQUtBPg0KCQk8QmlvPjwh W0NEQVRBW11d
PjwvQmlvPg0KCQk8R29hbHM+PCFbQ0RBVEFbXV0+PC9Hb2Fscz4NCgkJPEZ1 bGxOYW1lPjwh
W0NEQVRBW0pvbmEgaWwgTWFnb11dPjwvRnVsbE5hbWU+DQoJCTxNYWpvcj4t MTwvTWFqb3I+
DQoJPC9DSEFSQUNURVI+DQoJPENIQVJBQ1RFUj4NCgkJPElEPjI8L0lEPg0K CQk8VmVyPjU8
L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW1Nlcm5hXV0+PC9UaXRsZT4NCgkJ PERlc2M+PCFb
Q0RBVEFbRmlnbGlhIGRpIEpvbmEgaWwgTWFnby5dXT48L0Rlc2M+DQoJCTxV bnVzZWQ+MDwv
VW51c2VkPg0KCQk8U29ydE9yZGVyPjI8L1NvcnRPcmRlcj4NCgkJPEJpbz48 IVtDREFUQVtd
XT48L0Jpbz4NCgkJPEdvYWxzPjwhW0NEQVRBW11dPjwvR29hbHM+DQoJCTxG dWxsTmFtZT48
IVtDREFUQVtTZXJuYSBsJ2FwcHJlbmRpc3RhIE1hZ29dXT48L0Z1bGxOYW1l Pg0KCQk8TWFq
b3I+MDwvTWFqb3I+DQoJPC9DSEFSQUNURVI+DQoJPENIQVJBQ1RFUj4NCgkJ PElEPjM8L0lE
Pg0KCQk8VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW1RoYW5vXV0+ PC9UaXRsZT4N
CgkJPERlc2M+PCFbQ0RBVEFbRGlvIENhY2NpYXRvcmVdXT48L0Rlc2M+DQoJ CTxOb3Rlcz48
IVtDREFUQVtDb2xvcmU6IHJvc3NvIHNhbmd1ZV1dPjwvTm90ZXM+DQoJCTxV bnVzZWQ+MDwv
VW51c2VkPg0KCQk8U29ydE9yZGVyPjM8L1NvcnRPcmRlcj4NCgkJPEFLQT48 IVtDREFUQVtN
b3J0ZV1dPjwvQUtBPg0KCQk8QmlvPjwhW0NEQVRBW11dPjwvQmlvPg0KCQk8 R29hbHM+PCFb
Q0RBVEFbXV0+PC9Hb2Fscz4NCgkJPEZ1bGxOYW1lPjwhW0NEQVRBW1RoYW5v LCBEaW8gQ2Fj
Y2lhdG9yZV1dPjwvRnVsbE5hbWU+DQoJCTxNYWpvcj4tMTwvTWFqb3I+DQoJ PC9DSEFSQUNU
RVI+DQoJPENIQVJBQ1RFUj4NCgkJPElEPjQ8L0lEPg0KCQk8VmVyPjU8L1Zl cj4NCgkJPFRp
dGxlPjwhW0NEQVRBW0lwbm9dXT48L1RpdGxlPg0KCQk8RGVzYz48IVtDREFU QVtEaW8gZGVs
bJJPYmxpbyBlIGRlbCBQZXJkb25vXV0+PC9EZXNjPg0KCQk8Tm90ZXM+PCFb Q0RBVEFbQ29s
b3JlOiBOZXJvXV0+PC9Ob3Rlcz4NCgkJPFVudXNlZD4wPC9VbnVzZWQ+DQoJ CTxTb3J0T3Jk
ZXI+NDwvU29ydE9yZGVyPg0KCQk8QmlvPjwhW0NEQVRBW11dPjwvQmlvPg0K CQk8R29hbHM+
PCFbQ0RBVEFbXV0+PC9Hb2Fscz4NCgkJPEZ1bGxOYW1lPjwhW0NEQVRBW0lw bm8sIERpbyBk
ZWxskk9ibGlvIGUgZGVsIFBlcmRvbm9dXT48L0Z1bGxOYW1lPg0KCQk8TWFq b3I+MDwvTWFq
b3I+DQoJPC9DSEFSQUNURVI+DQoJPENIQVJBQ1RFUj4NCgkJPElEPjU8L0lE Pg0KCQk8VmVy
PjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW0FzY2xlcF1dPjwvVGl0bGU+ DQoJCTxEZXNj
PjwhW0NEQVRBW0RpbyBkZWxsYSBNZWRpY2luYSBlIGRlbGxhIEZsb3JhXV0+ PC9EZXNjPg0K
CQk8Tm90ZXM+PCFbQ0RBVEFbQ29sb3JlOiB2ZXJkZV1dPjwvTm90ZXM+DQoJ CTxVbnVzZWQ+
MDwvVW51c2VkPg0KCQk8U29ydE9yZGVyPjU8L1NvcnRPcmRlcj4NCgkJPEJp bz48IVtDREFU
QVtdXT48L0Jpbz4NCgkJPEdvYWxzPjwhW0NEQVRBW11dPjwvR29hbHM+DQoJ CTxGdWxsTmFt
ZT48IVtDREFUQVtBc2NsZXAsIERpbyBkZWxsYSBNZWRpY2luYSBlIGRlbGxh IEZsb3JhXV0+
PC9GdWxsTmFtZT4NCgkJPE1ham9yPjA8L01ham9yPg0KCTwvQ0hBUkFDVEVS Pg0KCTxDSEFS
QUNURVI+DQoJCTxJRD42PC9JRD4NCgkJPFZlcj41PC9WZXI+DQoJCTxUaXRs ZT48IVtDREFU
QVtBZnJvXV0+PC9UaXRsZT4NCgkJPERlc2M+PCFbQ0RBVEFbRGVhIGRlbGyS QW1vcmVdXT48
L0Rlc2M+DQoJCTxOb3Rlcz48IVtDREFUQVtDb2xvcmU6IHJvc2FdXT48L05v dGVzPg0KCQk8
VW51c2VkPjA8L1VudXNlZD4NCgkJPFNvcnRPcmRlcj42PC9Tb3J0T3JkZXI+ DQoJCTxCaW8+
PCFbQ0RBVEFbXV0+PC9CaW8+DQoJCTxHb2Fscz48IVtDREFUQVtdXT48L0dv YWxzPg0KCQk8
RnVsbE5hbWU+PCFbQ0RBVEFbQWZybywgRGVhIGRlbGySQW1vcmVdXT48L0Z1 bGxOYW1lPg0K
CQk8TWFqb3I+MDwvTWFqb3I+DQoJPC9DSEFSQUNURVI+DQoJPENIQVJBQ1RF Uj4NCgkJPElE
Pjc8L0lEPg0KCQk8VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW09w aWFdXT48L1Rp
dGxlPg0KCQk8RGVzYz48IVtDREFUQVtEZWEgZGVsbGEgRmVydGlsaXTgXV0+ PC9EZXNjPg0K
CQk8Tm90ZXM+PCFbQ0RBVEFbQ29sb3JlOiBnaWFsbG8gb3JvXV0+PC9Ob3Rl cz4NCgkJPFVu
dXNlZD4wPC9VbnVzZWQ+DQoJCTxTb3J0T3JkZXI+NzwvU29ydE9yZGVyPg0K CQk8QmlvPjwh
W0NEQVRBW11dPjwvQmlvPg0KCQk8R29hbHM+PCFbQ0RBVEFbXV0+PC9Hb2Fs cz4NCgkJPEZ1
bGxOYW1lPjwhW0NEQVRBW09waWEsIERlYSBkZWxsYSBGZXJ0aWxpdOBdXT48 L0Z1bGxOYW1l
Pg0KCQk8TWFqb3I+MDwvTWFqb3I+DQoJPC9DSEFSQUNURVI+DQoJPENIQVJB Q1RFUj4NCgkJ
PElEPjg8L0lEPg0KCQk8VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRB W1BhbGxhXV0+
PC9UaXRsZT4NCgkJPERlc2M+PCFbQ0RBVEFbRGVhIGRlbGxhIENvbm9zY2Vu emFdXT48L0Rl
c2M+DQoJCTxVbnVzZWQ+MDwvVW51c2VkPg0KCQk8U29ydE9yZGVyPjg8L1Nv cnRPcmRlcj4N
CgkJPEJpbz48IVtDREFUQVtdXT48L0Jpbz4NCgkJPEdvYWxzPjwhW0NEQVRB W11dPjwvR29h
bHM+DQoJCTxGdWxsTmFtZT48IVtDREFUQVtQYWxsYSwgRGVhIGRlbGxhIENv bm9zY2VuemFd
XT48L0Z1bGxOYW1lPg0KCQk8TWFqb3I+MDwvTWFqb3I+DQoJPC9DSEFSQUNU RVI+DQoJPENI
QVJBQ1RFUj4NCgkJPElEPjk8L0lEPg0KCQk8VmVyPjU8L1Zlcj4NCgkJPFRp dGxlPjwhW0NE
QVRBW1Bvc3NlXV0+PC9UaXRsZT4NCgkJPERlc2M+PCFbQ0RBVEFbRGlvIGRl bCBNYXJlXV0+
PC9EZXNjPg0KCQk8Tm90ZXM+PCFbQ0RBVEFbQ29sb3JlOiBibHVdXT48L05v dGVzPg0KCQk8
VW51c2VkPjA8L1VudXNlZD4NCgkJPFNvcnRPcmRlcj45PC9Tb3J0T3JkZXI+ DQoJCTxCaW8+
PCFbQ0RBVEFbXV0+PC9CaW8+DQoJCTxHb2Fscz48IVtDREFUQVtdXT48L0dv YWxzPg0KCQk8
RnVsbE5hbWU+PCFbQ0RBVEFbUG9zc2UsIERpbyBkZWwgTWFyZV1dPjwvRnVs bE5hbWU+DQoJ
CTxNYWpvcj4wPC9NYWpvcj4NCgk8L0NIQVJBQ1RFUj4NCgk8Q0hBUkFDVEVS Pg0KCQk8SUQ+
MTA8L0lEPg0KCQk8VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW0Fy Y2hpXV0+PC9U
aXRsZT4NCgkJPERlc2M+PCFbQ0RBVEFbRGlvIGRlbGxlIENvc3RydXppb25p IGUgZGVsbGUg
TWFjY2hpbmVdXT48L0Rlc2M+DQoJCTxOb3Rlcz48IVtDREFUQVtDb2xvcmU6 IGFyZ2VudG9d
XT48L05vdGVzPg0KCQk8VW51c2VkPjA8L1VudXNlZD4NCgkJPFNvcnRPcmRl cj4xMDwvU29y
dE9yZGVyPg0KCQk8QmlvPjwhW0NEQVRBW11dPjwvQmlvPg0KCQk8R29hbHM+ PCFbQ0RBVEFb
XV0+PC9Hb2Fscz4NCgkJPEZ1bGxOYW1lPjwhW0NEQVRBW0FyY2hpLCBEaW8g ZGVsbGUgQ29z
dHJ1emlvbmkgZSBkZWxsZSBNYWNjaGluZV1dPjwvRnVsbE5hbWU+DQoJCTxN YWpvcj4wPC9N
YWpvcj4NCgk8L0NIQVJBQ1RFUj4NCgk8Q0hBUkFDVEVSPg0KCQk8SUQ+MTE8 L0lEPg0KCQk8
VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW0Rpb25uZV1dPjwvVGl0 bGU+DQoJCTxE
ZXNjPjwhW0NEQVRBW0RpbyBkZWxsYSBnaW9pYSBlIGRlbGySZWJicmV6emEu XV0+PC9EZXNj
Pg0KCQk8Tm90ZXM+PCFbQ0RBVEFbQ29sb3JlOiBSb3NzbyBib3VyZGVhdXhd XT48L05vdGVz
Pg0KCQk8VW51c2VkPjA8L1VudXNlZD4NCgkJPFNvcnRPcmRlcj4xMTwvU29y dE9yZGVyPg0K
CQk8QmlvPjwhW0NEQVRBW11dPjwvQmlvPg0KCQk8R29hbHM+PCFbQ0RBVEFb XV0+PC9Hb2Fs
cz4NCgkJPEZ1bGxOYW1lPjwhW0NEQVRBW0Rpb25uZSwgRGlvIGRlbGxhIGdp b2lhIGUgZGVs
bJJlYmJyZXp6YV1dPjwvRnVsbE5hbWU+DQoJCTxNYWpvcj4wPC9NYWpvcj4N Cgk8L0NIQVJB
Q1RFUj4NCgk8Q0hBUkFDVEVSPg0KCQk8SUQ+MTI8L0lEPg0KCQk8VmVyPjU8 L1Zlcj4NCgkJ
PFRpdGxlPjwhW0NEQVRBW1plb11dPjwvVGl0bGU+DQoJCTxEZXNjPjwhW0NE QVRBW0RpbyBk
ZWwgQ2llbG8sIGRlbCBDbGltYSBlIGRlbGxlIFN0YWdpb25pXV0+PC9EZXNj Pg0KCQk8Tm90
ZXM+PCFbQ0RBVEFbQ29sb3JlOiBBenp1cnJvXV0+PC9Ob3Rlcz4NCgkJPFVu dXNlZD4wPC9V
bnVzZWQ+DQoJCTxTb3J0T3JkZXI+MTI8L1NvcnRPcmRlcj4NCgkJPEJpbz48 IVtDREFUQVtd
XT48L0Jpbz4NCgkJPEdvYWxzPjwhW0NEQVRBW11dPjwvR29hbHM+DQoJCTxG dWxsTmFtZT48
IVtDREFUQVtaZW8sIERpbyBkZWwgQ2llbG8sIGRlbCBDbGltYSBlIGRlbGxl IFN0YWdpb25p
XV0+PC9GdWxsTmFtZT4NCgkJPE1ham9yPjA8L01ham9yPg0KCTwvQ0hBUkFD VEVSPg0KCTxD
SEFSQUNURVI+DQoJCTxJRD4xMzwvSUQ+DQoJCTxWZXI+NTwvVmVyPg0KCQk8 VGl0bGU+PCFb
Q0RBVEFbRGFuYV1dPjwvVGl0bGU+DQoJCTxEZXNjPjwhW0NEQVRBW0RlYSBk ZWxsYSBGYXVu
YV1dPjwvRGVzYz4NCgkJPE5vdGVzPjwhW0NEQVRBW0NvbG9yZSBNYXJyb25l XV0+PC9Ob3Rl
cz4NCgkJPFVudXNlZD4wPC9VbnVzZWQ+DQoJCTxTb3J0T3JkZXI+MTM8L1Nv cnRPcmRlcj4N
CgkJPEJpbz48IVtDREFUQVtdXT48L0Jpbz4NCgkJPEdvYWxzPjwhW0NEQVRB W11dPjwvR29h
bHM+DQoJCTxGdWxsTmFtZT48IVtDREFUQVtEYW5hLCBEZWEgZGVsbGEgRmF1 bmFdXT48L0Z1
bGxOYW1lPg0KCQk8TWFqb3I+MDwvTWFqb3I+DQoJPC9DSEFSQUNURVI+DQoJ PENIQVJBQ1RF
Uj4NCgkJPElEPjE0PC9JRD4NCgkJPFZlcj41PC9WZXI+DQoJCTxUaXRsZT48 IVtDREFUQVtJ
c3RvXV0+PC9UaXRsZT4NCgkJPERlc2M+PCFbQ0RBVEFbRGlvIGRlbCBSaWNv cmRvIGUgZGVs
bGEgU3RvcmlhXV0+PC9EZXNjPg0KCQk8Tm90ZXM+PCFbQ0RBVEFbQ29sb3Jl IFZpb2xhXV0+
PC9Ob3Rlcz4NCgkJPFVudXNlZD4wPC9VbnVzZWQ+DQoJCTxTb3J0T3JkZXI+ MTQ8L1NvcnRP
cmRlcj4NCgkJPEJpbz48IVtDREFUQVtdXT48L0Jpbz4NCgkJPEdvYWxzPjwh W0NEQVRBW11d
PjwvR29hbHM+DQoJCTxGdWxsTmFtZT48IVtDREFUQVtJc3RvLCBEaW8gZGVs IFJpY29yZG8g
ZSBkZWxsYSBTdG9yaWFdXT48L0Z1bGxOYW1lPg0KCQk8TWFqb3I+MDwvTWFq b3I+DQoJPC9D
SEFSQUNURVI+DQoJPENIQVJBQ1RFUj4NCgkJPElEPjE1PC9JRD4NCgkJPFZl cj41PC9WZXI+
DQoJCTxUaXRsZT48IVtDREFUQVtEYXJkYV1dPjwvVGl0bGU+DQoJCTxEZXNj PjwhW0NEQVRB
W2xhIFN1b2NlcmEgZGVsIE1hZ29dXT48L0Rlc2M+DQoJCTxVbnVzZWQ+MDwv VW51c2VkPg0K
CQk8U29ydE9yZGVyPjE1PC9Tb3J0T3JkZXI+DQoJCTxCaW8+PCFbQ0RBVEFb XV0+PC9CaW8+
DQoJCTxHb2Fscz48IVtDREFUQVtdXT48L0dvYWxzPg0KCQk8RnVsbE5hbWU+ PCFbQ0RBVEFb
RGFyZGEgbGEgU3VvY2VyYV1dPjwvRnVsbE5hbWU+DQoJCTxNYWpvcj4wPC9N YWpvcj4NCgk8
L0NIQVJBQ1RFUj4NCgk8Q0hBUkFDVEVSPg0KCQk8SUQ+MTY8L0lEPg0KCQk8 VmVyPjU8L1Zl
cj4NCgkJPFRpdGxlPjwhW0NEQVRBW0RhbmlhXV0+PC9UaXRsZT4NCgkJPERl c2M+PCFbQ0RB
VEFbTW9nbGkgZGVsIE1hZ28uClNhY2VyZG90ZXNzYSBkaSBBc2NsZXAuXV0+ PC9EZXNjPg0K
CQk8VW51c2VkPjA8L1VudXNlZD4NCgkJPFNvcnRPcmRlcj4xNjwvU29ydE9y ZGVyPg0KCQk8
QmlvPjwhW0NEQVRBW11dPjwvQmlvPg0KCQk8R29hbHM+PCFbQ0RBVEFbXV0+ PC9Hb2Fscz4N
CgkJPEZ1bGxOYW1lPjwhW0NEQVRBW0RhbmlhLCBsYSBtb2dsaWUgZGVsIE1h Z29dXT48L0Z1
bGxOYW1lPg0KCQk8TWFqb3I+MDwvTWFqb3I+DQoJPC9DSEFSQUNURVI+DQoJ PENIQVJBQ1RF
Uj4NCgkJPElEPjE3PC9JRD4NCgkJPFZlcj41PC9WZXI+DQoJCTxUaXRsZT48 IVtDREFUQVtN
aWNoZWxlXV0+PC9UaXRsZT4NCgkJPERlc2M+PCFbQ0RBVEFbQXBwcmVuZGlz dGEgZmFiYnJv
IGRpIE1pbGEgY2hlIGRpdmVudGVy4CBpbCBwcmltbyBjYXJib25haW8gZGkg THVnYV1dPjwv
RGVzYz4NCgkJPFVudXNlZD4wPC9VbnVzZWQ+DQoJCTxTb3J0T3JkZXI+MTc8 L1NvcnRPcmRl
cj4NCgkJPEJpbz48IVtDREFUQVtdXT48L0Jpbz4NCgkJPEdvYWxzPjwhW0NE QVRBW11dPjwv
R29hbHM+DQoJCTxGdWxsTmFtZT48IVtDREFUQVtNaWNoZWxlLCBhcHByZW5k aXN0YSBmYWJi
cm8gZGkgTWlsYV1dPjwvRnVsbE5hbWU+DQoJCTxNYWpvcj4wPC9NYWpvcj4N Cgk8L0NIQVJB
Q1RFUj4NCgk8L0NIQVJBQ1RFUlM+DQoJPFBST0pFQ1ROT1RFUz4NCgk8L1BS T0pFQ1ROT1RF
Uz4NCgk8U0NFTkVTPg0KCTxTQ0VORT4NCgkJPElEPjE8L0lEPg0KCQk8VmVy PjU8L1Zlcj4N
CgkJPFRpdGxlPjwhW0NEQVRBW0xhIENvbGF6aW9uZV1dPjwvVGl0bGU+DQoJ CTxEZXNjPjwh
W0NEQVRBW0Rlc2NyaXppb25lIGRlbGxhIEZhbWlnbGlhIGRlbCBNYWdvLgpN ZWRpYXppb25l
IGRpIFNlcm5hOiBBcHBlbGxhcnNpIGFkIElwbm8gcGVyIG90dGVuZXJlIGZh dm9yaSBjaGUg
QXNjbGVwIG5vcm1hbG1lbnRlIG5vbiBkYXJlYmJlLgpDZW5uaSBkaSB2aXRh IGluIGZhbWln
bGlhLl1dPjwvRGVzYz4NCgkJPFVudXNlZD4wPC9VbnVzZWQ+DQoJCTxTb3J0 T3JkZXI+MDwv
U29ydE9yZGVyPg0KCQk8T3V0Y29tZT48IVtDREFUQVtdXT48L091dGNvbWU+ DQoJCTxHb2Fs
PjwhW0NEQVRBW11dPjwvR29hbD4NCgkJPENvbmZsaWN0PjwhW0NEQVRBW11d PjwvQ29uZmxp
Y3Q+DQoJCTxSVEZGaWxlPjwhW0NEQVRBW1JURl8wMDAwMS5ydGZdXT48L1JU RkZpbGU+DQoJ
CTxCZWxvbmdzVG9DaElEPjI8L0JlbG9uZ3NUb0NoSUQ+DQoJCTxNaW51dGU+ MDwvTWludXRl
Pg0KCQk8SG91cj43PC9Ib3VyPg0KCQk8RGF5PjE8L0RheT4NCgkJPFNwZWNp ZmljRGF0ZU1v
ZGU+MDwvU3BlY2lmaWNEYXRlTW9kZT4NCgkJPExhc3RzTWludXRlcz4wPC9M YXN0c01pbnV0
ZXM+DQoJCTxMYXN0c0hvdXJzPjA8L0xhc3RzSG91cnM+DQoJCTxMYXN0c0Rh eXM+MDwvTGFz
dHNEYXlzPg0KCQk8RmllbGQxPjE8L0ZpZWxkMT4NCgkJPEZpZWxkMj4xPC9G aWVsZDI+DQoJ
CTxGaWVsZDM+MTwvRmllbGQzPg0KCQk8RmllbGQ0PjE8L0ZpZWxkND4NCgkJ PFN0YXR1cz4x
PC9TdGF0dXM+DQoJCTxXb3JkQ291bnQ+ODA3PC9Xb3JkQ291bnQ+DQoJCTxM ZXR0ZXJDb3Vu
dD40ODU4PC9MZXR0ZXJDb3VudD4NCgkJPENoYXJhY3RlcnM+DQoJCQk8Q2hh cklEPjE8L0No
YXJJRD4NCgkJPC9DaGFyYWN0ZXJzPg0KCQk8TG9jYXRpb25zPg0KCQk8L0xv Y2F0aW9ucz4N
CgkJPEl0ZW1zPg0KCQk8L0l0ZW1zPg0KCTwvU0NFTkU+DQoJPFNDRU5FPg0K CQk8SUQ+Mjwv
SUQ+DQoJCTxWZXI+NTwvVmVyPg0KCQk8VGl0bGU+PCFbQ0RBVEFbUHJvbG9n b11dPjwvVGl0
bGU+DQoJCTxEZXNjPjwhW0NEQVRBW1ByZXNlbnRhemlvbmUgZGVsIE1hZ28g ZSBkaSBzdWEg
ZmlnbGlhLgpdXT48L0Rlc2M+DQoJCTxVbnVzZWQ+MDwvVW51c2VkPg0KCQk8 U29ydE9yZGVy
PjA8L1NvcnRPcmRlcj4NCgkJPE91dGNvbWU+PCFbQ0RBVEFbXV0+PC9PdXRj b21lPg0KCQk8
R29hbD48IVtDREFUQVtdXT48L0dvYWw+DQoJCTxDb25mbGljdD48IVtDREFU QVtdXT48L0Nv
bmZsaWN0Pg0KCQk8UlRGRmlsZT48IVtDREFUQVtSVEZfMDAwMDIucnRmXV0+ PC9SVEZGaWxl
Pg0KCQk8QmVsb25nc1RvQ2hJRD4xPC9CZWxvbmdzVG9DaElEPg0KCQk8TWlu dXRlPjA8L01p
bnV0ZT4NCgkJPEhvdXI+MDwvSG91cj4NCgkJPERheT4wPC9EYXk+DQoJCTxT cGVjaWZpY0Rh
dGVNb2RlPi0xPC9TcGVjaWZpY0RhdGVNb2RlPg0KCQk8U3BlY2lmaWNEYXRl VGltZT4yNzMw
LTA1LTAzIDExLjQyPC9TcGVjaWZpY0RhdGVUaW1lPg0KCQk8TGFzdHNNaW51 dGVzPjU8L0xh
c3RzTWludXRlcz4NCgkJPExhc3RzSG91cnM+MDwvTGFzdHNIb3Vycz4NCgkJ PExhc3RzRGF5
cz4wPC9MYXN0c0RheXM+DQoJCTxGaWVsZDE+MTwvRmllbGQxPg0KCQk8Rmll bGQyPjE8L0Zp
ZWxkMj4NCgkJPEZpZWxkMz4xPC9GaWVsZDM+DQoJCTxGaWVsZDQ+MTwvRmll bGQ0Pg0KCQk8
U3ViUGxvdD4tMTwvU3ViUGxvdD4NCgkJPFN0YXR1cz4xPC9TdGF0dXM+DQoJ CTxXb3JkQ291
bnQ+NDYwPC9Xb3JkQ291bnQ+DQoJCTxMZXR0ZXJDb3VudD4yODM1PC9MZXR0 ZXJDb3VudD4N
CgkJPENoYXJhY3RlcnM+DQoJCQk8Q2hhcklEPjE8L0NoYXJJRD4NCgkJCTxD aGFySUQ+Mjwv
Q2hhcklEPg0KCQk8L0NoYXJhY3RlcnM+DQoJCTxMb2NhdGlvbnM+DQoJCQk8 TG9jSUQ+Mjwv
TG9jSUQ+DQoJCTwvTG9jYXRpb25zPg0KCQk8SXRlbXM+DQoJCQk8SXRlbUlE PjE8L0l0ZW1J
RD4NCgkJPC9JdGVtcz4NCgk8L1NDRU5FPg0KCTxTQ0VORT4NCgkJPElEPjM8 L0lEPg0KCQk8
VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW2lsIE1hdHJpbW9uaW9d XT48L1RpdGxl
Pg0KCQk8RGVzYz48IVtDREFUQVtEZXNjcml6aW9uZSBkaSB1biBtYXRyaW9u aW8gaW1wb3J0
YW50ZS4KUHJlc2VudGF6aW9uZSBkZWkgYWxjdW5pIGRlZ2kgRGVpIChGZXJ0 aWxpdOAgZSBB
bW9yZSkgZSBwcmVyb2dhdGl2ZSBkZWwgTWFnbyAoTWVkaWF6aW9uZSkuClVz byBkZWdsaSBB
bXVsZXRpLl1dPjwvRGVzYz4NCgkJPFVudXNlZD4wPC9VbnVzZWQ+DQoJCTxT b3J0T3JkZXI+
MDwvU29ydE9yZGVyPg0KCQk8T3V0Y29tZT48IVtDREFUQVtdXT48L091dGNv bWU+DQoJCTxH
b2FsPjwhW0NEQVRBW11dPjwvR29hbD4NCgkJPENvbmZsaWN0PjwhW0NEQVRB W11dPjwvQ29u
ZmxpY3Q+DQoJCTxSVEZGaWxlPjwhW0NEQVRBW1JURl8wMDAwMy5ydGZdXT48 L1JURkZpbGU+
DQoJCTxCZWxvbmdzVG9DaElEPjE8L0JlbG9uZ3NUb0NoSUQ+DQoJCTxNaW51 dGU+MTA8L01p
bnV0ZT4NCgkJPEhvdXI+MDwvSG91cj4NCgkJPERheT4wPC9EYXk+DQoJCTxT cGVjaWZpY0Rh
dGVNb2RlPi0xPC9TcGVjaWZpY0RhdGVNb2RlPg0KCQk8U3BlY2lmaWNEYXRl VGltZT4yNzMw
LTA1LTAzIDExLjQyPC9TcGVjaWZpY0RhdGVUaW1lPg0KCQk8TGFzdHNNaW51 dGVzPjA8L0xh
c3RzTWludXRlcz4NCgkJPExhc3RzSG91cnM+MDwvTGFzdHNIb3Vycz4NCgkJ PExhc3RzRGF5
cz4wPC9MYXN0c0RheXM+DQoJCTxGaWVsZDE+MTwvRmllbGQxPg0KCQk8Rmll bGQyPjE8L0Zp
ZWxkMj4NCgkJPEZpZWxkMz4xPC9GaWVsZDM+DQoJCTxGaWVsZDQ+MTwvRmll bGQ0Pg0KCQk8
U3ViUGxvdD4tMTwvU3ViUGxvdD4NCgkJPFN0YXR1cz4xPC9TdGF0dXM+DQoJ CTxXb3JkQ291
bnQ+OTQ0PC9Xb3JkQ291bnQ+DQoJCTxMZXR0ZXJDb3VudD41ODA0PC9MZXR0 ZXJDb3VudD4N
CgkJPENoYXJhY3RlcnM+DQoJCQk8Q2hhcklEPjE8L0NoYXJJRD4NCgkJCTxD aGFySUQ+Mjwv
Q2hhcklEPg0KCQk8L0NoYXJhY3RlcnM+DQoJCTxMb2NhdGlvbnM+DQoJCTwv TG9jYXRpb25z
Pg0KCQk8SXRlbXM+DQoJCQk8SXRlbUlEPjE8L0l0ZW1JRD4NCgkJPC9JdGVt cz4NCgk8L1ND
RU5FPg0KCTxTQ0VORT4NCgkJPElEPjQ8L0lEPg0KCQk8VmVyPjU8L1Zlcj4N CgkJPFRpdGxl
PjwhW0NEQVRBW0lsIFJpc3ZlZ2xpb11dPjwvVGl0bGU+DQoJCTxEZXNjPjwh W0NEQVRBW1Bv
c3R1bWkgZGVsbGEgZmVzdGEgZGkgTWF0cmltb25pby4KUmlmbGVzc2lvbmkg ZGVsIE1hZ28u
CkNhcmF0dGVyaXp6YXppb25lIGRpIGFsY3VuaSBEZWkgKEFzY2xlcCkuXV0+ PC9EZXNjPg0K
CQk8VW51c2VkPjA8L1VudXNlZD4NCgkJPFNvcnRPcmRlcj4wPC9Tb3J0T3Jk ZXI+DQoJCTxP
dXRjb21lPjwhW0NEQVRBW11dPjwvT3V0Y29tZT4NCgkJPEdvYWw+PCFbQ0RB VEFbXV0+PC9H
b2FsPg0KCQk8Q29uZmxpY3Q+PCFbQ0RBVEFbXV0+PC9Db25mbGljdD4NCgkJ PFJURkZpbGU+
PCFbQ0RBVEFbUlRGXzAwMDA0LnJ0Zl1dPjwvUlRGRmlsZT4NCgkJPEJlbG9u Z3NUb0NoSUQ+
MjwvQmVsb25nc1RvQ2hJRD4NCgkJPE1pbnV0ZT4zMDwvTWludXRlPg0KCQk8 SG91cj42PC9I
b3VyPg0KCQk8RGF5PjE8L0RheT4NCgkJPFNwZWNpZmljRGF0ZU1vZGU+LTE8 L1NwZWNpZmlj
RGF0ZU1vZGU+DQoJCTxTcGVjaWZpY0RhdGVUaW1lPjI3MzAtMDUtMDMgMTEu NDI8L1NwZWNp
ZmljRGF0ZVRpbWU+DQoJCTxMYXN0c01pbnV0ZXM+MDwvTGFzdHNNaW51dGVz Pg0KCQk8TGFz
dHNIb3Vycz4wPC9MYXN0c0hvdXJzPg0KCQk8TGFzdHNEYXlzPjA8L0xhc3Rz RGF5cz4NCgkJ
PEZpZWxkMT4xPC9GaWVsZDE+DQoJCTxGaWVsZDI+MTwvRmllbGQyPg0KCQk8 RmllbGQzPjE8
L0ZpZWxkMz4NCgkJPEZpZWxkND4xPC9GaWVsZDQ+DQoJCTxTdGF0dXM+MTwv U3RhdHVzPg0K
CQk8V29yZENvdW50PjIyNDwvV29yZENvdW50Pg0KCQk8TGV0dGVyQ291bnQ+ MTM4MzwvTGV0
dGVyQ291bnQ+DQoJCTxDaGFyYWN0ZXJzPg0KCQkJPENoYXJJRD4xPC9DaGFy SUQ+DQoJCTwv
Q2hhcmFjdGVycz4NCgkJPExvY2F0aW9ucz4NCgkJPC9Mb2NhdGlvbnM+DQoJ CTxJdGVtcz4N
CgkJPC9JdGVtcz4NCgk8L1NDRU5FPg0KCTxTQ0VORT4NCgkJPElEPjU8L0lE Pg0KCQk8VmVy
PjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW0lsIENvbmZyb250b11dPjwv VGl0bGU+DQoJ
CTxEZXNjPjwhW0NEQVRBW0pvbmEgc3BpZWdhIGEgU2VybmEgbGUgc3VlIHBy ZW9jY3VwYXpp
b25pLgpJIGR1ZSBpbml6aWFubyBsZSByaWNlcmNoZSBwZXIgY2FwaXJlIGNo ZSBjb3NhIHN0
YSBzdWNjZWRlbmRvLl1dPjwvRGVzYz4NCgkJPFVudXNlZD4wPC9VbnVzZWQ+ DQoJCTxTb3J0
T3JkZXI+MDwvU29ydE9yZGVyPg0KCQk8T3V0Y29tZT48IVtDREFUQVtdXT48 L091dGNvbWU+
DQoJCTxHb2FsPjwhW0NEQVRBW11dPjwvR29hbD4NCgkJPENvbmZsaWN0Pjwh W0NEQVRBW11d
PjwvQ29uZmxpY3Q+DQoJCTxSVEZGaWxlPjwhW0NEQVRBW1JURl8wMDAwNS5y dGZdXT48L1JU
RkZpbGU+DQoJCTxCZWxvbmdzVG9DaElEPjI8L0JlbG9uZ3NUb0NoSUQ+DQoJ CTxNaW51dGU+
MDwvTWludXRlPg0KCQk8SG91cj4wPC9Ib3VyPg0KCQk8RGF5PjA8L0RheT4N CgkJPFNwZWNp
ZmljRGF0ZU1vZGU+LTE8L1NwZWNpZmljRGF0ZU1vZGU+DQoJCTxTcGVjaWZp Y0RhdGVUaW1l
PjI3MzAtMDUtMDMgMTEuNDI8L1NwZWNpZmljRGF0ZVRpbWU+DQoJCTxMYXN0 c01pbnV0ZXM+
MDwvTGFzdHNNaW51dGVzPg0KCQk8TGFzdHNIb3Vycz4wPC9MYXN0c0hvdXJz Pg0KCQk8TGFz
dHNEYXlzPjA8L0xhc3RzRGF5cz4NCgkJPEZpZWxkMT4xPC9GaWVsZDE+DQoJ CTxGaWVsZDI+
MTwvRmllbGQyPg0KCQk8RmllbGQzPjE8L0ZpZWxkMz4NCgkJPEZpZWxkND4x PC9GaWVsZDQ+
DQoJCTxTdGF0dXM+MTwvU3RhdHVzPg0KCQk8V29yZENvdW50PjcyNzwvV29y ZENvdW50Pg0K
CQk8TGV0dGVyQ291bnQ+NDMyMjwvTGV0dGVyQ291bnQ+DQoJCTxDaGFyYWN0 ZXJzPg0KCQkJ
PENoYXJJRD4xPC9DaGFySUQ+DQoJCQk8Q2hhcklEPjI8L0NoYXJJRD4NCgkJ PC9DaGFyYWN0
ZXJzPg0KCQk8TG9jYXRpb25zPg0KCQkJPExvY0lEPjI8L0xvY0lEPg0KCQk8 L0xvY2F0aW9u
cz4NCgkJPEl0ZW1zPg0KCQkJPEl0ZW1JRD4xPC9JdGVtSUQ+DQoJCTwvSXRl bXM+DQoJPC9T
Q0VORT4NCgk8U0NFTkU+DQoJCTxJRD42PC9JRD4NCgkJPFZlcj41PC9WZXI+ DQoJCTxUaXRs
ZT48IVtDREFUQVtpbCBEb3BvY2VuYV1dPjwvVGl0bGU+DQoJCTxVbnVzZWQ+ MDwvVW51c2Vk
Pg0KCQk8U29ydE9yZGVyPjA8L1NvcnRPcmRlcj4NCgkJPE91dGNvbWU+PCFb Q0RBVEFbXV0+
PC9PdXRjb21lPg0KCQk8R29hbD48IVtDREFUQVtdXT48L0dvYWw+DQoJCTxD b25mbGljdD48
IVtDREFUQVtdXT48L0NvbmZsaWN0Pg0KCQk8UlRGRmlsZT48IVtDREFUQVtS VEZfMDAwMDYu
cnRmXV0+PC9SVEZGaWxlPg0KCQk8QmVsb25nc1RvQ2hJRD4yPC9CZWxvbmdz VG9DaElEPg0K
CQk8TWludXRlPjA8L01pbnV0ZT4NCgkJPEhvdXI+MDwvSG91cj4NCgkJPERh eT4wPC9EYXk+
DQoJCTxTcGVjaWZpY0RhdGVNb2RlPi0xPC9TcGVjaWZpY0RhdGVNb2RlPg0K CQk8U3BlY2lm
aWNEYXRlVGltZT4yNzMwLTA1LTAzIDExLjQyPC9TcGVjaWZpY0RhdGVUaW1l Pg0KCQk8TGFz
dHNNaW51dGVzPjA8L0xhc3RzTWludXRlcz4NCgkJPExhc3RzSG91cnM+MDwv TGFzdHNIb3Vy
cz4NCgkJPExhc3RzRGF5cz4wPC9MYXN0c0RheXM+DQoJCTxGaWVsZDE+MTwv RmllbGQxPg0K
CQk8RmllbGQyPjE8L0ZpZWxkMj4NCgkJPEZpZWxkMz4xPC9GaWVsZDM+DQoJ CTxGaWVsZDQ+
MTwvRmllbGQ0Pg0KCQk8U3RhdHVzPjE8L1N0YXR1cz4NCgkJPFdvcmRDb3Vu dD4xMDIwPC9X
b3JkQ291bnQ+DQoJCTxMZXR0ZXJDb3VudD42MjM2PC9MZXR0ZXJDb3VudD4N CgkJPENoYXJh
Y3RlcnM+DQoJCQk8Q2hhcklEPjE8L0NoYXJJRD4NCgkJCTxDaGFySUQ+Mzwv Q2hhcklEPg0K
CQkJPENoYXJJRD4yPC9DaGFySUQ+DQoJCQk8Q2hhcklEPjE1PC9DaGFySUQ+ DQoJCTwvQ2hh
cmFjdGVycz4NCgkJPExvY2F0aW9ucz4NCgkJPC9Mb2NhdGlvbnM+DQoJCTxJ dGVtcz4NCgkJ
CTxJdGVtSUQ+MTwvSXRlbUlEPg0KCQkJPEl0ZW1JRD4yPC9JdGVtSUQ+DQoJ CTwvSXRlbXM+
DQoJPC9TQ0VORT4NCgk8U0NFTkU+DQoJCTxJRD43PC9JRD4NCgkJPFZlcj41 PC9WZXI+DQoJ
CTxUaXRsZT48IVtDREFUQVtMYSBDZW5hXV0+PC9UaXRsZT4NCgkJPERlc2M+ PCFbQ0RBVEFb
RGVzY3JpemlvbmUgZGVsbGEgY2VuYV1dPjwvRGVzYz4NCgkJPFVudXNlZD4w PC9VbnVzZWQ+
DQoJCTxTb3J0T3JkZXI+MDwvU29ydE9yZGVyPg0KCQk8T3V0Y29tZT48IVtD REFUQVtdXT48
L091dGNvbWU+DQoJCTxHb2FsPjwhW0NEQVRBW11dPjwvR29hbD4NCgkJPENv bmZsaWN0Pjwh
W0NEQVRBW11dPjwvQ29uZmxpY3Q+DQoJCTxSVEZGaWxlPjwhW0NEQVRBW1JU Rl8wMDAwNy5y
dGZdXT48L1JURkZpbGU+DQoJCTxCZWxvbmdzVG9DaElEPjI8L0JlbG9uZ3NU b0NoSUQ+DQoJ
CTxNaW51dGU+MDwvTWludXRlPg0KCQk8SG91cj4wPC9Ib3VyPg0KCQk8RGF5 PjA8L0RheT4N
CgkJPFNwZWNpZmljRGF0ZU1vZGU+LTE8L1NwZWNpZmljRGF0ZU1vZGU+DQoJ CTxTcGVjaWZp
Y0RhdGVUaW1lPjI3MzAtMDUtMDMgMTEuNDI8L1NwZWNpZmljRGF0ZVRpbWU+ DQoJCTxMYXN0
c01pbnV0ZXM+MDwvTGFzdHNNaW51dGVzPg0KCQk8TGFzdHNIb3Vycz4wPC9M YXN0c0hvdXJz
Pg0KCQk8TGFzdHNEYXlzPjA8L0xhc3RzRGF5cz4NCgkJPEZpZWxkMT4xPC9G aWVsZDE+DQoJ
CTxGaWVsZDI+MTwvRmllbGQyPg0KCQk8RmllbGQzPjE8L0ZpZWxkMz4NCgkJ PEZpZWxkND4x
PC9GaWVsZDQ+DQoJCTxTdWJQbG90Pi0xPC9TdWJQbG90Pg0KCQk8U3RhdHVz PjE8L1N0YXR1
cz4NCgkJPFdvcmRDb3VudD41NDQ8L1dvcmRDb3VudD4NCgkJPExldHRlckNv dW50PjMzNjQ8
L0xldHRlckNvdW50Pg0KCQk8Q2hhcmFjdGVycz4NCgkJCTxDaGFySUQ+MTwv Q2hhcklEPg0K
CQk8L0NoYXJhY3RlcnM+DQoJCTxMb2NhdGlvbnM+DQoJCQk8TG9jSUQ+MTwv TG9jSUQ+DQoJ
CTwvTG9jYXRpb25zPg0KCQk8SXRlbXM+DQoJCTwvSXRlbXM+DQoJPC9TQ0VO RT4NCgk8U0NF
TkU+DQoJCTxJRD44PC9JRD4NCgkJPFZlcj41PC9WZXI+DQoJCTxUaXRsZT48 IVtDREFUQVtE
ZWNpc2lvbmldXT48L1RpdGxlPg0KCQk8VW51c2VkPjA8L1VudXNlZD4NCgkJ PFNvcnRPcmRl
cj4wPC9Tb3J0T3JkZXI+DQoJCTxPdXRjb21lPjwhW0NEQVRBW11dPjwvT3V0 Y29tZT4NCgkJ
PEdvYWw+PCFbQ0RBVEFbXV0+PC9Hb2FsPg0KCQk8Q29uZmxpY3Q+PCFbQ0RB VEFbXV0+PC9D
b25mbGljdD4NCgkJPFJURkZpbGU+PCFbQ0RBVEFbUlRGXzAwMDA4LnJ0Zl1d PjwvUlRGRmls
ZT4NCgkJPEJlbG9uZ3NUb0NoSUQ+MjwvQmVsb25nc1RvQ2hJRD4NCgkJPE1p bnV0ZT4wPC9N
aW51dGU+DQoJCTxIb3VyPjA8L0hvdXI+DQoJCTxEYXk+MDwvRGF5Pg0KCQk8 U3BlY2lmaWNE
YXRlTW9kZT4tMTwvU3BlY2lmaWNEYXRlTW9kZT4NCgkJPFNwZWNpZmljRGF0 ZVRpbWU+Mjcz
MC0wNS0wMyAxMS40MjwvU3BlY2lmaWNEYXRlVGltZT4NCgkJPExhc3RzTWlu dXRlcz4wPC9M
YXN0c01pbnV0ZXM+DQoJCTxMYXN0c0hvdXJzPjA8L0xhc3RzSG91cnM+DQoJ CTxMYXN0c0Rh
eXM+MDwvTGFzdHNEYXlzPg0KCQk8RmllbGQxPjE8L0ZpZWxkMT4NCgkJPEZp ZWxkMj4xPC9G
aWVsZDI+DQoJCTxGaWVsZDM+MTwvRmllbGQzPg0KCQk8RmllbGQ0PjE8L0Zp ZWxkND4NCgkJ
PFN0YXR1cz4xPC9TdGF0dXM+DQoJCTxXb3JkQ291bnQ+NTAzPC9Xb3JkQ291 bnQ+DQoJCTxM
ZXR0ZXJDb3VudD4zMTU4PC9MZXR0ZXJDb3VudD4NCgkJPENoYXJhY3RlcnM+ DQoJCQk8Q2hh
cklEPjE8L0NoYXJJRD4NCgkJCTxDaGFySUQ+MjwvQ2hhcklEPg0KCQkJPENo YXJJRD4xNjwv
Q2hhcklEPg0KCQkJPENoYXJJRD4xNTwvQ2hhcklEPg0KCQk8L0NoYXJhY3Rl cnM+DQoJCTxM
b2NhdGlvbnM+DQoJCQk8TG9jSUQ+MTwvTG9jSUQ+DQoJCTwvTG9jYXRpb25z Pg0KCQk8SXRl
bXM+DQoJCQk8SXRlbUlEPjE8L0l0ZW1JRD4NCgkJCTxJdGVtSUQ+MjwvSXRl bUlEPg0KCQk8
L0l0ZW1zPg0KCTwvU0NFTkU+DQoJPFNDRU5FPg0KCQk8SUQ+OTwvSUQ+DQoJ CTxWZXI+NTwv
VmVyPg0KCQk8VGl0bGU+PCFbQ0RBVEFbQ29uc2lnbGlvIGRpIEd1ZXJyYV1d PjwvVGl0bGU+
DQoJCTxEZXNjPjwhW0NEQVRBW0xhIHN0b3JpYSBkaSBEYXJkYSAoY29uZnVz YSk7IHNpIGRl
Y2lkZSBkaSBhbmRhcmUgYWwgdGVtcGlvIGRpIElzdG8uCl1dPjwvRGVzYz4N CgkJPFVudXNl
ZD4wPC9VbnVzZWQ+DQoJCTxTb3J0T3JkZXI+MDwvU29ydE9yZGVyPg0KCQk8 T3V0Y29tZT48
IVtDREFUQVtdXT48L091dGNvbWU+DQoJCTxHb2FsPjwhW0NEQVRBW11dPjwv R29hbD4NCgkJ
PENvbmZsaWN0PjwhW0NEQVRBW11dPjwvQ29uZmxpY3Q+DQoJCTxSVEZGaWxl PjwhW0NEQVRB
W1JURl8wMDAwOS5ydGZdXT48L1JURkZpbGU+DQoJCTxCZWxvbmdzVG9DaElE PjM8L0JlbG9u
Z3NUb0NoSUQ+DQoJCTxNaW51dGU+MDwvTWludXRlPg0KCQk8SG91cj4wPC9I b3VyPg0KCQk8
RGF5PjA8L0RheT4NCgkJPFNwZWNpZmljRGF0ZU1vZGU+LTE8L1NwZWNpZmlj RGF0ZU1vZGU+
DQoJCTxTcGVjaWZpY0RhdGVUaW1lPjI3MzAtMDUtMDMgMTEuNDI8L1NwZWNp ZmljRGF0ZVRp
bWU+DQoJCTxMYXN0c01pbnV0ZXM+MDwvTGFzdHNNaW51dGVzPg0KCQk8TGFz dHNIb3Vycz4w
PC9MYXN0c0hvdXJzPg0KCQk8TGFzdHNEYXlzPjA8L0xhc3RzRGF5cz4NCgkJ PEZpZWxkMT4x
PC9GaWVsZDE+DQoJCTxGaWVsZDI+MTwvRmllbGQyPg0KCQk8RmllbGQzPjE8 L0ZpZWxkMz4N
CgkJPEZpZWxkND4xPC9GaWVsZDQ+DQoJCTxTdGF0dXM+MTwvU3RhdHVzPg0K CQk8V29yZENv
dW50PjQ0MzwvV29yZENvdW50Pg0KCQk8TGV0dGVyQ291bnQ+Mjc4MDwvTGV0 dGVyQ291bnQ+
DQoJCTxDaGFyYWN0ZXJzPg0KCQkJPENoYXJJRD4xPC9DaGFySUQ+DQoJCQk8 Q2hhcklEPjI8
L0NoYXJJRD4NCgkJCTxDaGFySUQ+MTU8L0NoYXJJRD4NCgkJPC9DaGFyYWN0 ZXJzPg0KCQk8
TG9jYXRpb25zPg0KCQk8L0xvY2F0aW9ucz4NCgkJPEl0ZW1zPg0KCQk8L0l0 ZW1zPg0KCTwv
U0NFTkU+DQoJPFNDRU5FPg0KCQk8SUQ+MTA8L0lEPg0KCQk8VmVyPjU8L1Zl cj4NCgkJPFRp
dGxlPjwhW0NEQVRBW0lsIHRlbXBpbyBkaSBJc3RvXV0+PC9UaXRsZT4NCgkJ PERlc2M+PCFb
Q0RBVEFbSWwgdGVtcGlvIGluIG1vbnRhZ25hCkNvbnZlcnNhemlvbmUgY29u IGlsIFNhY2Vy
ZG90ZQpHbGkgRGVpIG5vbiBtZW50b25vIG1haSwgYWxtZW5vIG5lbCBzZW5z byBwcm9wcmlv
IGRlbCB0ZXJtaW5lLCBtYSBzcGVzc28gc29ubyBhbWJpZ3VpLgpUaGFubyB2 dW9sZSB2ZXJh
bWVudGUgY2hlIEpvbmEgc2NvcHJhIHF1YWxjb3NhLgpMYSBMZWdnZW5kYSBk ZWwgU2FjZXJk
b3RlIGRpIFBhbGxhCi0gaWwgc2FjZXJkb3RlIGF2ZXZhIHJpY2V2dXRvIGxh IHZpc2l0YSBk
aSBUaGFubyBlZCBlcmEgZG92dXRvIHBhcnRpcmUgdmVyc28gaWwgc29sZSBu YXNjZW50ZS4K
LSBlcmEgcmltYXN0byBpbiBjb211bmlhemlvbmUgY29uIGlsIG51b3ZvIFNh Y2VyZG90ZSBk
aSBQYWxsYSwgbWEgZXJhIHNlbXByZSBzdGF0byB2YWdvIHN1aSB2ZXJpIHNj b3BpIGRlbGxh
IHN1YSBtaXNzaW9uZS4KLSB0YW50aSBhbmVkZG90aSwgbWEgbmVzc3VuYSBz cGllZ2F6aW9u
ZS4KLSBhdmV2YSBhdHRyYXZlcnNhdG8gaW5udW1lcmV2b2xpIHRlcnJpdG9y aSBmaW5vIGEg
cXVhbmRvIG5vbiBlcmEgZ2l1bnRvIGRhdmFudGkgYWwgR3JhbmRlIE1hcmUK LSBxdWkgc2kg
ZXJhIGltYmFyY2F0byBwYXIgaWwgY2llbG8uCi0gbm9uIGF2ZXZhIHBp+SBm YXR0byByaXRv
cm5vLgpSaWVudHJvIGEgY2FzYS4KTGEgbWlzc2lvbmUgZGF0YSDoIGVzdHJt YW1hbnRlIHZh
Z2E6IGNoZSBmYXJlPwpMJ0FtdWV0byBkaSBUaGFubyBtb3N0cmEgbGEgYnVz c29sYS5dXT48
L0Rlc2M+DQoJCTxVbnVzZWQ+MDwvVW51c2VkPg0KCQk8U29ydE9yZGVyPjA8 L1NvcnRPcmRl
cj4NCgkJPE91dGNvbWU+PCFbQ0RBVEFbXV0+PC9PdXRjb21lPg0KCQk8R29h bD48IVtDREFU
QVtdXT48L0dvYWw+DQoJCTxDb25mbGljdD48IVtDREFUQVtdXT48L0NvbmZs aWN0Pg0KCQk8
UlRGRmlsZT48IVtDREFUQVtSVEZfMDAwMTAucnRmXV0+PC9SVEZGaWxlPg0K CQk8QmVsb25n
c1RvQ2hJRD4zPC9CZWxvbmdzVG9DaElEPg0KCQk8TWludXRlPjA8L01pbnV0 ZT4NCgkJPEhv
dXI+MDwvSG91cj4NCgkJPERheT4wPC9EYXk+DQoJCTxTcGVjaWZpY0RhdGVN b2RlPi0xPC9T
cGVjaWZpY0RhdGVNb2RlPg0KCQk8U3BlY2lmaWNEYXRlVGltZT4yNzMwLTA1 LTAzIDExLjQy
PC9TcGVjaWZpY0RhdGVUaW1lPg0KCQk8TGFzdHNNaW51dGVzPjA8L0xhc3Rz TWludXRlcz4N
CgkJPExhc3RzSG91cnM+MDwvTGFzdHNIb3Vycz4NCgkJPExhc3RzRGF5cz4w PC9MYXN0c0Rh
eXM+DQoJCTxGaWVsZDE+MTwvRmllbGQxPg0KCQk8RmllbGQyPjE8L0ZpZWxk Mj4NCgkJPEZp
ZWxkMz4xPC9GaWVsZDM+DQoJCTxGaWVsZDQ+MTwvRmllbGQ0Pg0KCQk8U3Rh dHVzPjE8L1N0
YXR1cz4NCgkJPFdvcmRDb3VudD4xNjA1PC9Xb3JkQ291bnQ+DQoJCTxMZXR0 ZXJDb3VudD45
OTI2PC9MZXR0ZXJDb3VudD4NCgkJPENoYXJhY3RlcnM+DQoJCQk8Q2hhcklE PjE8L0NoYXJJ
RD4NCgkJPC9DaGFyYWN0ZXJzPg0KCQk8TG9jYXRpb25zPg0KCQk8L0xvY2F0 aW9ucz4NCgkJ
PEl0ZW1zPg0KCQk8L0l0ZW1zPg0KCTwvU0NFTkU+DQoJPFNDRU5FPg0KCQk8 SUQ+MTE8L0lE
Pg0KCQk8VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW0kgcHJlcGFy YXRpdmldXT48
L1RpdGxlPg0KCQk8RGVzYz48IVtDREFUQVtKb25hIGRlY2lkZSBkaSBkaXJl IGFsbGEgZmFt
aWdsaWEgY2hlIHBvdHLgIGNvbXVuaWNhcmUgKHNlIGxhIGxlZ2dlbmRhIG5l IHBhcmxhIGV2
aWRlbnRlbWVudGUgc2kgcHXyIGRpcmUpLgpQcmVwYXJhemlvbmUgZGkgYmFn YWdsaSBsZWdn
ZXJpIHBlciB1biBsdW5nbyB2aWFnZ2lvLgpTaSBwYXJ0aXLgIGEgcGllZGkg dmlzdG8gY2hl
IGxhIEJ1c3NvbGEgcHVudGEgZGVjaXNhIHZlcnNvIGxlIG1vbnRhZ25lLgpD b25zaWxnaW8g
Y29uIERhcmRhIGUgU2FybmE7IEpvbmEgY2VyY2EgZGkgaW5jbHVkZXJlIGxh IG1vZ2xpZSwg
bWEgbCdhbXVsZXRvIHZpYnJhIG1pbmFjY2lvc28uClNpIGRlY2lkZSBkaSBz ZW50aXJzaSB0
dXR0ZSBsZSBzZXJlLCBldmVudGkgcGVybWV0dGVuZG8uXV0+PC9EZXNjPg0K CQk8VW51c2Vk
PjA8L1VudXNlZD4NCgkJPFNvcnRPcmRlcj4wPC9Tb3J0T3JkZXI+DQoJCTxP dXRjb21lPjwh
W0NEQVRBW11dPjwvT3V0Y29tZT4NCgkJPEdvYWw+PCFbQ0RBVEFbXV0+PC9H b2FsPg0KCQk8
Q29uZmxpY3Q+PCFbQ0RBVEFbXV0+PC9Db25mbGljdD4NCgkJPFJURkZpbGU+ PCFbQ0RBVEFb
UlRGXzAwMDExLnJ0Zl1dPjwvUlRGRmlsZT4NCgkJPEJlbG9uZ3NUb0NoSUQ+ MzwvQmVsb25n
c1RvQ2hJRD4NCgkJPE1pbnV0ZT4wPC9NaW51dGU+DQoJCTxIb3VyPjA8L0hv dXI+DQoJCTxE
YXk+MDwvRGF5Pg0KCQk8U3BlY2lmaWNEYXRlTW9kZT4tMTwvU3BlY2lmaWNE YXRlTW9kZT4N
CgkJPFNwZWNpZmljRGF0ZVRpbWU+MjczMC0wNS0wMyAxMS40MjwvU3BlY2lm aWNEYXRlVGlt
ZT4NCgkJPExhc3RzTWludXRlcz4wPC9MYXN0c01pbnV0ZXM+DQoJCTxMYXN0 c0hvdXJzPjA8
L0xhc3RzSG91cnM+DQoJCTxMYXN0c0RheXM+MDwvTGFzdHNEYXlzPg0KCQk8 RmllbGQxPjE8
L0ZpZWxkMT4NCgkJPEZpZWxkMj4xPC9GaWVsZDI+DQoJCTxGaWVsZDM+MTwv RmllbGQzPg0K
CQk8RmllbGQ0PjE8L0ZpZWxkND4NCgkJPFN0YXR1cz4xPC9TdGF0dXM+DQoJ CTxXb3JkQ291
bnQ+OTk5PC9Xb3JkQ291bnQ+DQoJCTxMZXR0ZXJDb3VudD42MDMxPC9MZXR0 ZXJDb3VudD4N
CgkJPENoYXJhY3RlcnM+DQoJCQk8Q2hhcklEPjE8L0NoYXJJRD4NCgkJPC9D aGFyYWN0ZXJz
Pg0KCQk8TG9jYXRpb25zPg0KCQk8L0xvY2F0aW9ucz4NCgkJPEl0ZW1zPg0K CQk8L0l0ZW1z
Pg0KCTwvU0NFTkU+DQoJPFNDRU5FPg0KCQk8SUQ+MTI8L0lEPg0KCQk8VmVy PjU8L1Zlcj4N
CgkJPFRpdGxlPjwhW0NEQVRBW0xhIG1hdHRpbmFdXT48L1RpdGxlPg0KCQk8 RGVzYz48IVtD
REFUQVtDb2xhemlvbmUgZSBzYWx1dGkuCkpvbmEgZXNjZSBjb24gU2FybmEu CkkgZHVlIHRy
b3Zhbm8gbGEgcG9wb2xhemlvbmUgYSBzYWx1dGFyZSBpbCBNYWdvIGNoZSBw YXJ0ZS4KU3R1
cG9yZSBkZWwgTWFnby4KSWwgU2FjZXJkb3RlIGRpIElzdG8gYXZldmEgYXZ2 ZXJ0aXRvLl1d
PjwvRGVzYz4NCgkJPFVudXNlZD4wPC9VbnVzZWQ+DQoJCTxTb3J0T3JkZXI+ MDwvU29ydE9y
ZGVyPg0KCQk8T3V0Y29tZT48IVtDREFUQVtdXT48L091dGNvbWU+DQoJCTxH b2FsPjwhW0NE
QVRBW11dPjwvR29hbD4NCgkJPENvbmZsaWN0PjwhW0NEQVRBW11dPjwvQ29u ZmxpY3Q+DQoJ
CTxSVEZGaWxlPjwhW0NEQVRBW1JURl8wMDAxMi5ydGZdXT48L1JURkZpbGU+ DQoJCTxCZWxv
bmdzVG9DaElEPjQ8L0JlbG9uZ3NUb0NoSUQ+DQoJCTxNaW51dGU+MDwvTWlu dXRlPg0KCQk8
SG91cj4wPC9Ib3VyPg0KCQk8RGF5PjA8L0RheT4NCgkJPFNwZWNpZmljRGF0 ZU1vZGU+MDwv
U3BlY2lmaWNEYXRlTW9kZT4NCgkJPExhc3RzTWludXRlcz4wPC9MYXN0c01p bnV0ZXM+DQoJ
CTxMYXN0c0hvdXJzPjA8L0xhc3RzSG91cnM+DQoJCTxMYXN0c0RheXM+MDwv TGFzdHNEYXlz
Pg0KCQk8RmllbGQxPjE8L0ZpZWxkMT4NCgkJPEZpZWxkMj4xPC9GaWVsZDI+ DQoJCTxGaWVs
ZDM+MTwvRmllbGQzPg0KCQk8RmllbGQ0PjE8L0ZpZWxkND4NCgkJPFN0YXR1 cz4xPC9TdGF0
dXM+DQoJCTxXb3JkQ291bnQ+NDk4PC9Xb3JkQ291bnQ+DQoJCTxMZXR0ZXJD b3VudD4yOTc1
PC9MZXR0ZXJDb3VudD4NCgkJPENoYXJhY3RlcnM+DQoJCQk8Q2hhcklEPjE8 L0NoYXJJRD4N
CgkJPC9DaGFyYWN0ZXJzPg0KCQk8TG9jYXRpb25zPg0KCQk8L0xvY2F0aW9u cz4NCgkJPEl0
ZW1zPg0KCQk8L0l0ZW1zPg0KCTwvU0NFTkU+DQoJPFNDRU5FPg0KCQk8SUQ+ MTM8L0lEPg0K
CQk8VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW1N1aSBNb250aV1d PjwvVGl0bGU+
DQoJCTxEZXNjPjwhW0NEQVRBW1Nhcm5hIGFjY29tcGFnbmEgSm9uYSBmaW5v IGFsIGxpbWl0
YXJlIGRlbCB0ZXJyaXRvcmlvLCBwb2kgc2kgdm9sdGEgZSB0b3JuYSBhIGNh c2EuIEUnIGZl
cm1hbWVudGUgY29udmludGEgY2hlIHJpdmVkcuAgaWwgcGFkcmUuClNvbG8u CkFtdWxldG8s
IGRvdmUgZGV2byBhbmRhcmU/CkxhIGNhcnRpbmEgc2F0ZWxsaXRhcmUuCl1d PjwvRGVzYz4N
CgkJPFVudXNlZD4wPC9VbnVzZWQ+DQoJCTxTb3J0T3JkZXI+MDwvU29ydE9y ZGVyPg0KCQk8
T3V0Y29tZT48IVtDREFUQVtdXT48L091dGNvbWU+DQoJCTxHb2FsPjwhW0NE QVRBW11dPjwv
R29hbD4NCgkJPENvbmZsaWN0PjwhW0NEQVRBW11dPjwvQ29uZmxpY3Q+DQoJ CTxSVEZGaWxl
PjwhW0NEQVRBW1JURl8wMDAxMy5ydGZdXT48L1JURkZpbGU+DQoJCTxCZWxv bmdzVG9DaElE
PjQ8L0JlbG9uZ3NUb0NoSUQ+DQoJCTxNaW51dGU+MDwvTWludXRlPg0KCQk8 SG91cj4wPC9I
b3VyPg0KCQk8RGF5PjA8L0RheT4NCgkJPFNwZWNpZmljRGF0ZU1vZGU+LTE8 L1NwZWNpZmlj
RGF0ZU1vZGU+DQoJCTxTcGVjaWZpY0RhdGVUaW1lPjI3MzAtMDUtMDMgMTEu NDI8L1NwZWNp
ZmljRGF0ZVRpbWU+DQoJCTxMYXN0c01pbnV0ZXM+MDwvTGFzdHNNaW51dGVz Pg0KCQk8TGFz
dHNIb3Vycz4wPC9MYXN0c0hvdXJzPg0KCQk8TGFzdHNEYXlzPjA8L0xhc3Rz RGF5cz4NCgkJ
PEZpZWxkMT4xPC9GaWVsZDE+DQoJCTxGaWVsZDI+MTwvRmllbGQyPg0KCQk8 RmllbGQzPjE8
L0ZpZWxkMz4NCgkJPEZpZWxkND4xPC9GaWVsZDQ+DQoJCTxTdGF0dXM+MTwv U3RhdHVzPg0K
CQk8V29yZENvdW50PjM4MzwvV29yZENvdW50Pg0KCQk8TGV0dGVyQ291bnQ+ MjM1OTwvTGV0
dGVyQ291bnQ+DQoJCTxDaGFyYWN0ZXJzPg0KCQkJPENoYXJJRD4xPC9DaGFy SUQ+DQoJCTwv
Q2hhcmFjdGVycz4NCgkJPExvY2F0aW9ucz4NCgkJPC9Mb2NhdGlvbnM+DQoJ CTxJdGVtcz4N
CgkJPC9JdGVtcz4NCgk8L1NDRU5FPg0KCTxTQ0VORT4NCgkJPElEPjE0PC9J RD4NCgkJPFZl
cj41PC9WZXI+DQoJCTxUaXRsZT48IVtDREFUQVtsYSBzZXJhXV0+PC9UaXRs ZT4NCgkJPERl
c2M+PCFbQ0RBVEFbU2NlbmRlIGxhIHNlcmEuClJhZHVyYS4KUHJlcGFyYSBi aXZhY2NvIGUg
cHJlcGFyYSBpbCBmdW9jby4KTCdBbXVsZXRvIGFjY2VuZGUgaWwgZnVvY28g cGVyIGx1aS4K
UGVyY2joIGhhaSBhY2Nlc28gaWwgZnVvY28sIHF1YW5kbyB0dXR0aSBoYW5u byBzZW1wcmUg
ZG92dXRvIHRyaWJvbGFyZSBjb24gbCdhY2NpYXJpbm8/ClF1YW5kbyBhdnJh aSBjYXBpdG8g
cXVlc3RvIHNhcmFpIGEgYnVvbiBwdW50byEKXV0+PC9EZXNjPg0KCQk8VW51 c2VkPjA8L1Vu
dXNlZD4NCgkJPFNvcnRPcmRlcj4wPC9Tb3J0T3JkZXI+DQoJCTxPdXRjb21l PjwhW0NEQVRB
W11dPjwvT3V0Y29tZT4NCgkJPEdvYWw+PCFbQ0RBVEFbXV0+PC9Hb2FsPg0K CQk8Q29uZmxp
Y3Q+PCFbQ0RBVEFbXV0+PC9Db25mbGljdD4NCgkJPFJURkZpbGU+PCFbQ0RB VEFbUlRGXzAw
MDE0LnJ0Zl1dPjwvUlRGRmlsZT4NCgkJPEJlbG9uZ3NUb0NoSUQ+NDwvQmVs b25nc1RvQ2hJ
RD4NCgkJPE1pbnV0ZT4wPC9NaW51dGU+DQoJCTxIb3VyPjA8L0hvdXI+DQoJ CTxEYXk+MDwv
RGF5Pg0KCQk8U3BlY2lmaWNEYXRlTW9kZT4wPC9TcGVjaWZpY0RhdGVNb2Rl Pg0KCQk8TGFz
dHNNaW51dGVzPjA8L0xhc3RzTWludXRlcz4NCgkJPExhc3RzSG91cnM+MDwv TGFzdHNIb3Vy
cz4NCgkJPExhc3RzRGF5cz4wPC9MYXN0c0RheXM+DQoJCTxGaWVsZDE+MTwv RmllbGQxPg0K
CQk8RmllbGQyPjE8L0ZpZWxkMj4NCgkJPEZpZWxkMz4xPC9GaWVsZDM+DQoJ CTxGaWVsZDQ+
MTwvRmllbGQ0Pg0KCQk8U3RhdHVzPjE8L1N0YXR1cz4NCgkJPFdvcmRDb3Vu dD40NjI8L1dv
cmRDb3VudD4NCgkJPExldHRlckNvdW50PjI4MDQ8L0xldHRlckNvdW50Pg0K CQk8Q2hhcmFj
dGVycz4NCgkJCTxDaGFySUQ+MTwvQ2hhcklEPg0KCQk8L0NoYXJhY3RlcnM+ DQoJCTxMb2Nh
dGlvbnM+DQoJCTwvTG9jYXRpb25zPg0KCQk8SXRlbXM+DQoJCTwvSXRlbXM+ DQoJPC9TQ0VO
RT4NCgk8U0NFTkU+DQoJCTxJRD4xNTwvSUQ+DQoJCTxWZXI+NTwvVmVyPg0K CQk8VGl0bGU+
PCFbQ0RBVEFbUmlzYWxpdGEgZGVpIFBlbm4gXV0+PC9UaXRsZT4NCgkJPERl c2M+PCFbQ0RB
VEFbUmlzYWxpdGEgZGVsbGEgdmFsbGUKU2VudGllcmkgc2Nvc2Nlc2kKSW5j b250cm8gZGVs
bGEgY2Fyb3ZhbmEgZGkgY2FycmkgdGlyYXRpIGRhIG11bGkuCklsIE1hZ28g c2kgYWNjb2Rh
IHNlbnphIGZhcnNpIHJpY29ub3NjZXJlLl1dPjwvRGVzYz4NCgkJPFVudXNl ZD4wPC9VbnVz
ZWQ+DQoJCTxTb3J0T3JkZXI+MDwvU29ydE9yZGVyPg0KCQk8T3V0Y29tZT48 IVtDREFUQVtd
XT48L091dGNvbWU+DQoJCTxHb2FsPjwhW0NEQVRBW11dPjwvR29hbD4NCgkJ PENvbmZsaWN0
PjwhW0NEQVRBW11dPjwvQ29uZmxpY3Q+DQoJCTxSVEZGaWxlPjwhW0NEQVRB W1JURl8wMDAx
NS5ydGZdXT48L1JURkZpbGU+DQoJCTxCZWxvbmdzVG9DaElEPjU8L0JlbG9u Z3NUb0NoSUQ+
DQoJCTxNaW51dGU+MDwvTWludXRlPg0KCQk8SG91cj4wPC9Ib3VyPg0KCQk8 RGF5PjA8L0Rh
eT4NCgkJPFNwZWNpZmljRGF0ZU1vZGU+LTE8L1NwZWNpZmljRGF0ZU1vZGU+ DQoJCTxTcGVj
aWZpY0RhdGVUaW1lPjI3MzAtMDUtMDMgMTEuNDI8L1NwZWNpZmljRGF0ZVRp bWU+DQoJCTxM
YXN0c01pbnV0ZXM+MDwvTGFzdHNNaW51dGVzPg0KCQk8TGFzdHNIb3Vycz4w PC9MYXN0c0hv
dXJzPg0KCQk8TGFzdHNEYXlzPjA8L0xhc3RzRGF5cz4NCgkJPEZpZWxkMT4x PC9GaWVsZDE+
DQoJCTxGaWVsZDI+MTwvRmllbGQyPg0KCQk8RmllbGQzPjE8L0ZpZWxkMz4N CgkJPEZpZWxk
ND4xPC9GaWVsZDQ+DQoJCTxTdGF0dXM+MTwvU3RhdHVzPg0KCQk8V29yZENv dW50PjM2OTwv
V29yZENvdW50Pg0KCQk8TGV0dGVyQ291bnQ+MjI3OTwvTGV0dGVyQ291bnQ+ DQoJCTxDaGFy
YWN0ZXJzPg0KCQkJPENoYXJJRD4xPC9DaGFySUQ+DQoJCTwvQ2hhcmFjdGVy cz4NCgkJPExv
Y2F0aW9ucz4NCgkJPC9Mb2NhdGlvbnM+DQoJCTxJdGVtcz4NCgkJPC9JdGVt cz4NCgk8L1ND
RU5FPg0KCTxTQ0VORT4NCgkJPElEPjE2PC9JRD4NCgkJPFZlcj41PC9WZXI+ DQoJCTxUaXRs
ZT48IVtDREFUQVtJbnNpZGllIGRpIG1vbnRhZ25hXV0+PC9UaXRsZT4NCgkJ PERlc2M+PCFb
Q0RBVEFbVW4gY2Fycm8gY2FyaWNvIGQnb2xpbyBwcmVjaXBpdGEgbmVsIHRv cnJlbnRlLgpW
aWVuZSBhYmJhbmRvbmF0by5dXT48L0Rlc2M+DQoJCTxVbnVzZWQ+MDwvVW51 c2VkPg0KCQk8
U29ydE9yZGVyPjA8L1NvcnRPcmRlcj4NCgkJPE91dGNvbWU+PCFbQ0RBVEFb XV0+PC9PdXRj
b21lPg0KCQk8R29hbD48IVtDREFUQVtdXT48L0dvYWw+DQoJCTxDb25mbGlj dD48IVtDREFU
QVtdXT48L0NvbmZsaWN0Pg0KCQk8UlRGRmlsZT48IVtDREFUQVtSVEZfMDAw MTYucnRmXV0+
PC9SVEZGaWxlPg0KCQk8QmVsb25nc1RvQ2hJRD41PC9CZWxvbmdzVG9DaElE Pg0KCQk8TWlu
dXRlPjA8L01pbnV0ZT4NCgkJPEhvdXI+MDwvSG91cj4NCgkJPERheT4wPC9E YXk+DQoJCTxT
cGVjaWZpY0RhdGVNb2RlPjA8L1NwZWNpZmljRGF0ZU1vZGU+DQoJCTxMYXN0 c01pbnV0ZXM+
MDwvTGFzdHNNaW51dGVzPg0KCQk8TGFzdHNIb3Vycz4wPC9MYXN0c0hvdXJz Pg0KCQk8TGFz
dHNEYXlzPjA8L0xhc3RzRGF5cz4NCgkJPEZpZWxkMT4xPC9GaWVsZDE+DQoJ CTxGaWVsZDI+
MTwvRmllbGQyPg0KCQk8RmllbGQzPjE8L0ZpZWxkMz4NCgkJPEZpZWxkND4x PC9GaWVsZDQ+
DQoJCTxTdGF0dXM+MTwvU3RhdHVzPg0KCQk8V29yZENvdW50PjQ0MzwvV29y ZENvdW50Pg0K
CQk8TGV0dGVyQ291bnQ+MjY0MDwvTGV0dGVyQ291bnQ+DQoJCTxDaGFyYWN0 ZXJzPg0KCQkJ
PENoYXJJRD4xPC9DaGFySUQ+DQoJCTwvQ2hhcmFjdGVycz4NCgkJPExvY2F0 aW9ucz4NCgkJ
PC9Mb2NhdGlvbnM+DQoJCTxJdGVtcz4NCgkJPC9JdGVtcz4NCgk8L1NDRU5F Pg0KCTxTQ0VO
RT4NCgkJPElEPjE3PC9JRD4NCgkJPFZlcj41PC9WZXI+DQoJCTxUaXRsZT48 IVtDREFUQVtp
bCBiaXZhY2NvXV0+PC9UaXRsZT4NCgkJPERlc2M+PCFbQ0RBVEFbTGEgc2Vy YSBhY2NhbnRv
IGFsIGZ1b2NvOiBsZSBzdHJhZGUgc29ubyBwZXJpY29sb3NlLCBtYSBpIGNv bW1lcmNpIGJ1
b25pLiAob2xpbyBjb250cm8gZ3JhbmFnbGllKS4KXV0+PC9EZXNjPg0KCQk8 VW51c2VkPjA8
L1VudXNlZD4NCgkJPFNvcnRPcmRlcj4wPC9Tb3J0T3JkZXI+DQoJCTxPdXRj b21lPjwhW0NE
QVRBW11dPjwvT3V0Y29tZT4NCgkJPEdvYWw+PCFbQ0RBVEFbXV0+PC9Hb2Fs Pg0KCQk8Q29u
ZmxpY3Q+PCFbQ0RBVEFbXV0+PC9Db25mbGljdD4NCgkJPFJURkZpbGU+PCFb Q0RBVEFbUlRG
XzAwMDE3LnJ0Zl1dPjwvUlRGRmlsZT4NCgkJPEJlbG9uZ3NUb0NoSUQ+NTwv QmVsb25nc1Rv
Q2hJRD4NCgkJPE1pbnV0ZT4wPC9NaW51dGU+DQoJCTxIb3VyPjA8L0hvdXI+ DQoJCTxEYXk+
MDwvRGF5Pg0KCQk8U3BlY2lmaWNEYXRlTW9kZT4wPC9TcGVjaWZpY0RhdGVN b2RlPg0KCQk8
TGFzdHNNaW51dGVzPjA8L0xhc3RzTWludXRlcz4NCgkJPExhc3RzSG91cnM+ MDwvTGFzdHNI
b3Vycz4NCgkJPExhc3RzRGF5cz4wPC9MYXN0c0RheXM+DQoJCTxGaWVsZDE+ MTwvRmllbGQx
Pg0KCQk8RmllbGQyPjE8L0ZpZWxkMj4NCgkJPEZpZWxkMz4xPC9GaWVsZDM+ DQoJCTxGaWVs
ZDQ+MTwvRmllbGQ0Pg0KCQk8U3RhdHVzPjE8L1N0YXR1cz4NCgkJPFdvcmRD b3VudD4zOTM8
L1dvcmRDb3VudD4NCgkJPExldHRlckNvdW50PjIzMjA8L0xldHRlckNvdW50 Pg0KCQk8Q2hh
cmFjdGVycz4NCgkJCTxDaGFySUQ+MTwvQ2hhcklEPg0KCQk8L0NoYXJhY3Rl cnM+DQoJCTxM
b2NhdGlvbnM+DQoJCTwvTG9jYXRpb25zPg0KCQk8SXRlbXM+DQoJCTwvSXRl bXM+DQoJPC9T
Q0VORT4NCgk8U0NFTkU+DQoJCTxJRD4xODwvSUQ+DQoJCTxWZXI+NTwvVmVy Pg0KCQk8VGl0
bGU+PCFbQ0RBVEFbbWFwcGFdXT48L1RpdGxlPg0KCQk8RGVzYz48IVtDREFU QVtJbCBtYWdv
IHNpIGFsbG9udGFuYSBwZXIgY29tdW5pY2FyZS4KTGEgY2FydGluYSBtb3N0 cmEgdW4gc2Vu
dGllcm8gYWx0ZXJuYXRpdm8gZSBzZW1icmEgc3VnZ2VyaXJlIGRpIHVzYXJs by4KaWwgbWFn
byDoIHBlcnBsZXNzbywgbWEgbWVtb3JpenphIGxlIGluZm9ybWF6aW9uaS5d XT48L0Rlc2M+
DQoJCTxVbnVzZWQ+MDwvVW51c2VkPg0KCQk8U29ydE9yZGVyPjA8L1NvcnRP cmRlcj4NCgkJ
PE91dGNvbWU+PCFbQ0RBVEFbXV0+PC9PdXRjb21lPg0KCQk8R29hbD48IVtD REFUQVtdXT48
L0dvYWw+DQoJCTxDb25mbGljdD48IVtDREFUQVtdXT48L0NvbmZsaWN0Pg0K CQk8UlRGRmls
ZT48IVtDREFUQVtSVEZfMDAwMTgucnRmXV0+PC9SVEZGaWxlPg0KCQk8QmVs b25nc1RvQ2hJ
RD41PC9CZWxvbmdzVG9DaElEPg0KCQk8TWludXRlPjA8L01pbnV0ZT4NCgkJ PEhvdXI+MDwv
SG91cj4NCgkJPERheT4wPC9EYXk+DQoJCTxTcGVjaWZpY0RhdGVNb2RlPi0x PC9TcGVjaWZp
Y0RhdGVNb2RlPg0KCQk8U3BlY2lmaWNEYXRlVGltZT4yNzMwLTA1LTAzIDEx LjQyPC9TcGVj
aWZpY0RhdGVUaW1lPg0KCQk8TGFzdHNNaW51dGVzPjA8L0xhc3RzTWludXRl cz4NCgkJPExh
c3RzSG91cnM+MDwvTGFzdHNIb3Vycz4NCgkJPExhc3RzRGF5cz4wPC9MYXN0 c0RheXM+DQoJ
CTxGaWVsZDE+MTwvRmllbGQxPg0KCQk8RmllbGQyPjE8L0ZpZWxkMj4NCgkJ PEZpZWxkMz4x
PC9GaWVsZDM+DQoJCTxGaWVsZDQ+MTwvRmllbGQ0Pg0KCQk8U3RhdHVzPjE8 L1N0YXR1cz4N
CgkJPFdvcmRDb3VudD4yMzc8L1dvcmRDb3VudD4NCgkJPExldHRlckNvdW50 PjE0NDg8L0xl
dHRlckNvdW50Pg0KCQk8Q2hhcmFjdGVycz4NCgkJCTxDaGFySUQ+MTwvQ2hh cklEPg0KCQk8
L0NoYXJhY3RlcnM+DQoJCTxMb2NhdGlvbnM+DQoJCTwvTG9jYXRpb25zPg0K CQk8SXRlbXM+
DQoJCTwvSXRlbXM+DQoJPC9TQ0VORT4NCgk8U0NFTkU+DQoJCTxJRD4xOTwv SUQ+DQoJCTxW
ZXI+NTwvVmVyPg0KCQk8VGl0bGU+PCFbQ0RBVEFbaWwgcGFzc29dXT48L1Rp dGxlPg0KCQk8
RGVzYz48IVtDREFUQVtJbCBtYWdvIGdpdW5nZSBhbCBiaXZpbzog6CB1biB0 cmF0dHVybywg
bWEgbG8gcHJlbmRlLgpJbCB0cmF0dHVybyBzYWxlIGluIG1vbnRhZ25hIG1l bnRyZSBsYSBj
YXJvdmFuYSBwcm9jZWRlIHN1bCBzZW50aWVybyBpbiB2YWxsZS4KQSBzZXJh IGlsIE1hZ28g
c2kgcml0cm92YSBzdSB1bmEgY2VuZ2lhIHBhcmVjY2hpbyBwafkgaW4gYWx0 byBkZWxsYSBj
YXJvdmFuYSwgY2hlIHZlZGUgZ2n5IGFsIHBhc3NvLgpJbXByb3Z2aXNhbWVu dGUgbGEgY2Fy
b3ZhbmEgdmllbmUgYXR0YWNjYXRhIGRhIHVuIGdydXBwbyBkaSBicmlnYW50 aS4KSWwgTWFn
byBlc3RyYWUgbCdBbXVsZXRvIHBlciBpbnRlcnZlbmlyZSwgbWEgcXVlbGxv IHNpIHNwZWdu
ZS4KTCdBbWlsZXRvIHJpZml1dGEgZGkgY29sbGFib3JhcmUgcGVyIHR1dHRh IGxhIG5vdHRl
LCBjaGUgaWwgbWFnbyBwYXNzYSBpbiB1bmEgcGljb2xhIHJpZW50cmFuemEg ZGVsbGEgcm9j
Y2lhLCBhbCBmcmVkZG8uCk5vbiBhY2NlbmRlIGlsIGZ1b2NvIHBlciB0aW1v cmUgZGkgYXR0
aXJlcmUgbCdhdHRlbnppb25lIGRlaSBicmlnYW50aS5dXT48L0Rlc2M+DQoJ CTxVbnVzZWQ+
MDwvVW51c2VkPg0KCQk8U29ydE9yZGVyPjA8L1NvcnRPcmRlcj4NCgkJPE91 dGNvbWU+PCFb
Q0RBVEFbXV0+PC9PdXRjb21lPg0KCQk8R29hbD48IVtDREFUQVtdXT48L0dv YWw+DQoJCTxD
b25mbGljdD48IVtDREFUQVtdXT48L0NvbmZsaWN0Pg0KCQk8UlRGRmlsZT48 IVtDREFUQVtS
VEZfMDAwMTkucnRmXV0+PC9SVEZGaWxlPg0KCQk8QmVsb25nc1RvQ2hJRD41 PC9CZWxvbmdz
VG9DaElEPg0KCQk8TWludXRlPjA8L01pbnV0ZT4NCgkJPEhvdXI+MDwvSG91 cj4NCgkJPERh
eT4wPC9EYXk+DQoJCTxTcGVjaWZpY0RhdGVNb2RlPjA8L1NwZWNpZmljRGF0 ZU1vZGU+DQoJ
CTxMYXN0c01pbnV0ZXM+MDwvTGFzdHNNaW51dGVzPg0KCQk8TGFzdHNIb3Vy cz4wPC9MYXN0
c0hvdXJzPg0KCQk8TGFzdHNEYXlzPjA8L0xhc3RzRGF5cz4NCgkJPEZpZWxk MT4xPC9GaWVs
ZDE+DQoJCTxGaWVsZDI+MTwvRmllbGQyPg0KCQk8RmllbGQzPjE8L0ZpZWxk Mz4NCgkJPEZp
ZWxkND4xPC9GaWVsZDQ+DQoJCTxTdGF0dXM+MTwvU3RhdHVzPg0KCQk8V29y ZENvdW50Pjkx
NDwvV29yZENvdW50Pg0KCQk8TGV0dGVyQ291bnQ+NTYzMDwvTGV0dGVyQ291 bnQ+DQoJCTxD
aGFyYWN0ZXJzPg0KCQkJPENoYXJJRD4xPC9DaGFySUQ+DQoJCTwvQ2hhcmFj dGVycz4NCgkJ
PExvY2F0aW9ucz4NCgkJPC9Mb2NhdGlvbnM+DQoJCTxJdGVtcz4NCgkJPC9J dGVtcz4NCgk8
L1NDRU5FPg0KCTxTQ0VORT4NCgkJPElEPjIwPC9JRD4NCgkJPFZlcj41PC9W ZXI+DQoJCTxU
aXRsZT48IVtDREFUQVtMYSBkaXNjZXNhXV0+PC9UaXRsZT4NCgkJPERlc2M+ PCFbQ0RBVEFb
SWwgc29sZSBzY2FjY2lhIGxhIG5lYmJpYSBlIHJpc2NhbGRhIGlsIG1hZ28u ClNpIHRvcm5h
IHNvdHRvIGlsIGxpbWl0ZSBkZWxsZSBmb3Jlc3RlLgpJbCBNYWdvIHJpdG9y bmEgc3VsIHNl
bnRpZXJvIHByaW5jaXBhbGUgZmFjZW5kbyBhdHRlbnppb25lIGEgbm9uIGVz c2VyZSB2aXN0
byBkYWwgcGFzc28uCkxhIHZhbGxlIHNpIGNvbWluY2lhIGFkIGFwcmlyZSBl ZCBpbCBtYWdv
IHRyb3ZhIHJpZnVnaW8gcHJlc3NvIHBhc3RvcmkuXV0+PC9EZXNjPg0KCQk8 VW51c2VkPjA8
L1VudXNlZD4NCgkJPFNvcnRPcmRlcj4wPC9Tb3J0T3JkZXI+DQoJCTxPdXRj b21lPjwhW0NE
QVRBW11dPjwvT3V0Y29tZT4NCgkJPEdvYWw+PCFbQ0RBVEFbXV0+PC9Hb2Fs Pg0KCQk8Q29u
ZmxpY3Q+PCFbQ0RBVEFbXV0+PC9Db25mbGljdD4NCgkJPFJURkZpbGU+PCFb Q0RBVEFbUlRG
XzAwMDIwLnJ0Zl1dPjwvUlRGRmlsZT4NCgkJPEJlbG9uZ3NUb0NoSUQ+NTwv QmVsb25nc1Rv
Q2hJRD4NCgkJPE1pbnV0ZT4wPC9NaW51dGU+DQoJCTxIb3VyPjA8L0hvdXI+ DQoJCTxEYXk+
MDwvRGF5Pg0KCQk8U3BlY2lmaWNEYXRlTW9kZT4tMTwvU3BlY2lmaWNEYXRl TW9kZT4NCgkJ
PFNwZWNpZmljRGF0ZVRpbWU+MjczMC0wNS0wMyAxMS40MjwvU3BlY2lmaWNE YXRlVGltZT4N
CgkJPExhc3RzTWludXRlcz4wPC9MYXN0c01pbnV0ZXM+DQoJCTxMYXN0c0hv dXJzPjA8L0xh
c3RzSG91cnM+DQoJCTxMYXN0c0RheXM+MDwvTGFzdHNEYXlzPg0KCQk8Rmll bGQxPjE8L0Zp
ZWxkMT4NCgkJPEZpZWxkMj4xPC9GaWVsZDI+DQoJCTxGaWVsZDM+MTwvRmll bGQzPg0KCQk8
RmllbGQ0PjE8L0ZpZWxkND4NCgkJPFN0YXR1cz4xPC9TdGF0dXM+DQoJCTxX b3JkQ291bnQ+
NTQzPC9Xb3JkQ291bnQ+DQoJCTxMZXR0ZXJDb3VudD4zMjYxPC9MZXR0ZXJD b3VudD4NCgkJ
PENoYXJhY3RlcnM+DQoJCQk8Q2hhcklEPjE8L0NoYXJJRD4NCgkJPC9DaGFy YWN0ZXJzPg0K
CQk8TG9jYXRpb25zPg0KCQk8L0xvY2F0aW9ucz4NCgkJPEl0ZW1zPg0KCQk8 L0l0ZW1zPg0K
CTwvU0NFTkU+DQoJPFNDRU5FPg0KCQk8SUQ+MjE8L0lEPg0KCQk8VmVyPjU8 L1Zlcj4NCgkJ
PFRpdGxlPjwhW0NEQVRBW0Rpc2Nlc2FdXT48L1RpdGxlPg0KCQk8RGVzYz48 IVtDREFUQVtE
aXNjZXNhIHZlcnNvIGEgdmFsbGUuCkZpbmFsbWVudGUgbCdBbXVsZXRvIGRl Y2lkZSBkaSBj
b29wZXJhcmUgZSBpbCBtYWdvIHJpZXNjZSBhIGNvbnRhdHRhcmUgU2VybmEg ZSBEYXJkYS4K
U29zcGlybyBkaSBzb2xsaWV2byBkZWxsZSBkdWUuCkpvbmEgcmFjY29udGEg bCdhY2NhZHV0
byBlIGNoaWVkZSBub3RpemllIGRlbGxhIG1vZ2xpZS4gCkNvbWUgU2VybmEg Y29taW5jaWEg
YSBwYXJsYXJlIGwnQW11bGV0byBzaSBzcGVnbmUuCklsIG1hZ28gdm9ycmVi YmUgc3BhY2Nh
cmUgaWwgY2llbG8sIG1hIHNpIGNvbnRyb2xsYTogZGV2ZSBjYXBpcmUgcGVy Y2joIFRoYW5v
IG5vbiB2dW9sZSBjaGUgbHVpIGFiYmlhIG5vdGl6aWUgZGkgRGFuaWEuCl1d PjwvRGVzYz4N
CgkJPFVudXNlZD4wPC9VbnVzZWQ+DQoJCTxTb3J0T3JkZXI+MDwvU29ydE9y ZGVyPg0KCQk8
T3V0Y29tZT48IVtDREFUQVtdXT48L091dGNvbWU+DQoJCTxHb2FsPjwhW0NE QVRBW11dPjwv
R29hbD4NCgkJPENvbmZsaWN0PjwhW0NEQVRBW11dPjwvQ29uZmxpY3Q+DQoJ CTxSVEZGaWxl
PjwhW0NEQVRBW1JURl8wMDAyMS5ydGZdXT48L1JURkZpbGU+DQoJCTxCZWxv bmdzVG9DaElE
PjY8L0JlbG9uZ3NUb0NoSUQ+DQoJCTxNaW51dGU+MDwvTWludXRlPg0KCQk8 SG91cj4wPC9I
b3VyPg0KCQk8RGF5PjA8L0RheT4NCgkJPFNwZWNpZmljRGF0ZU1vZGU+LTE8 L1NwZWNpZmlj
RGF0ZU1vZGU+DQoJCTxTcGVjaWZpY0RhdGVUaW1lPjI3MzAtMDUtMDMgMTEu NDI8L1NwZWNp
ZmljRGF0ZVRpbWU+DQoJCTxMYXN0c01pbnV0ZXM+MDwvTGFzdHNNaW51dGVz Pg0KCQk8TGFz
dHNIb3Vycz4wPC9MYXN0c0hvdXJzPg0KCQk8TGFzdHNEYXlzPjA8L0xhc3Rz RGF5cz4NCgkJ
PEZpZWxkMT4xPC9GaWVsZDE+DQoJCTxGaWVsZDI+MTwvRmllbGQyPg0KCQk8 RmllbGQzPjE8
L0ZpZWxkMz4NCgkJPEZpZWxkND4xPC9GaWVsZDQ+DQoJCTxTdGF0dXM+MTwv U3RhdHVzPg0K
CQk8V29yZENvdW50Pjg3NjwvV29yZENvdW50Pg0KCQk8TGV0dGVyQ291bnQ+ NTM1MjwvTGV0
dGVyQ291bnQ+DQoJCTxDaGFyYWN0ZXJzPg0KCQkJPENoYXJJRD4xPC9DaGFy SUQ+DQoJCTwv
Q2hhcmFjdGVycz4NCgkJPExvY2F0aW9ucz4NCgkJPC9Mb2NhdGlvbnM+DQoJ CTxJdGVtcz4N
CgkJPC9JdGVtcz4NCgk8L1NDRU5FPg0KCTxTQ0VORT4NCgkJPElEPjIyPC9J RD4NCgkJPFZl
cj41PC9WZXI+DQoJCTxUaXRsZT48IVtDREFUQVtTY2FtYmlvIGRpIGlkZWVd XT48L1RpdGxl
Pg0KCQk8RGVzYz48IVtDREFUQVtMYSBmaW5lIGRlaSBib3NjaGkgZSBsJ2lu aXppbyBkZWxs
ZSB2aWduZS4KVmlsbGFnZ2kgb3Blcm9zaSBsdW5nbyBpbCBmaXVtZSBjaGUg c2kgYWxsYXJn
YS4KTG8gc3RyYW5vIGxpbmd1YWdnaW8gZGVpIHZhbGxpZ2lhbmkuCkwnQW11 bGV0byBjb21p
bmNpYSBhIHRyYWR1cnJlLCBhbmNoZSBzZSBub24gc2FyZWJiZSBzdHJldHRh bWVudGUgbmVj
ZXNzYXJpby5dXT48L0Rlc2M+DQoJCTxVbnVzZWQ+MDwvVW51c2VkPg0KCQk8 U29ydE9yZGVy
PjA8L1NvcnRPcmRlcj4NCgkJPE91dGNvbWU+PCFbQ0RBVEFbXV0+PC9PdXRj b21lPg0KCQk8
R29hbD48IVtDREFUQVtdXT48L0dvYWw+DQoJCTxDb25mbGljdD48IVtDREFU QVtdXT48L0Nv
bmZsaWN0Pg0KCQk8UlRGRmlsZT48IVtDREFUQVtSVEZfMDAwMjIucnRmXV0+ PC9SVEZGaWxl
Pg0KCQk8QmVsb25nc1RvQ2hJRD42PC9CZWxvbmdzVG9DaElEPg0KCQk8TWlu dXRlPjA8L01p
bnV0ZT4NCgkJPEhvdXI+MDwvSG91cj4NCgkJPERheT4wPC9EYXk+DQoJCTxT cGVjaWZpY0Rh
dGVNb2RlPi0xPC9TcGVjaWZpY0RhdGVNb2RlPg0KCQk8U3BlY2lmaWNEYXRl VGltZT4yNzMw
LTA1LTAzIDExLjQyPC9TcGVjaWZpY0RhdGVUaW1lPg0KCQk8TGFzdHNNaW51 dGVzPjA8L0xh
c3RzTWludXRlcz4NCgkJPExhc3RzSG91cnM+MDwvTGFzdHNIb3Vycz4NCgkJ PExhc3RzRGF5
cz4wPC9MYXN0c0RheXM+DQoJCTxGaWVsZDE+MTwvRmllbGQxPg0KCQk8Rmll bGQyPjE8L0Zp
ZWxkMj4NCgkJPEZpZWxkMz4xPC9GaWVsZDM+DQoJCTxGaWVsZDQ+MTwvRmll bGQ0Pg0KCQk8
U3RhdHVzPjE8L1N0YXR1cz4NCgkJPFdvcmRDb3VudD41Nzc8L1dvcmRDb3Vu dD4NCgkJPExl
dHRlckNvdW50PjM1NDc8L0xldHRlckNvdW50Pg0KCQk8Q2hhcmFjdGVycz4N CgkJCTxDaGFy
SUQ+MTwvQ2hhcklEPg0KCQk8L0NoYXJhY3RlcnM+DQoJCTxMb2NhdGlvbnM+ DQoJCTwvTG9j
YXRpb25zPg0KCQk8SXRlbXM+DQoJCTwvSXRlbXM+DQoJPC9TQ0VORT4NCgk8 U0NFTkU+DQoJ
CTxJRD4yMzwvSUQ+DQoJCTxWZXI+NTwvVmVyPg0KCQk8VGl0bGU+PCFbQ0RB VEFbVmVyc28g
TWlsYV1dPjwvVGl0bGU+DQoJCTxEZXNjPjwhW0NEQVRBW0pvbmEgc2kgaW5m b3JtYSBzdSBx
dWFsaSBjaXR04CBjaSBzaWFubyBuZWxsYSBkaXJlemlvbmUgaW5kaWNhdGEg ZGFsbGEgQnVz
c29sYTogTWlsYSwgdW5hIGRlbGxlIGNpdHTgIHByaW5jaXBhbGkgZGVsbGEg VmFsbGUsIOgg
aW4gcXVlbGxhIGRpcmV6aW9uZS4KaWwgTWFnbyBzaSBhZ2dyZWdhIGFkIHVu YSBjYXJvdmFu
YSBkaSBjYXJyaSBkaXJldHRvIGEgTWlsYSBwZXIgdmVuZGVyZSB2aW5vIGlu IGNhbWJpbyBk
aSBtYW51ZmF0dGkuIFBlciB1biBwaWNjb2xvIHByZXp6byBmYSBpbCB2aWFn Z2lvIHNiYWxs
b3R0YXRvIHN1bCBjYXJybyBpbnZlY2UgY2hlIGEgcGllZGkuCkpvbmEgcmFj Y29udGEgZGkg
ZXNzZXJlIHNmdWdnaXRvIGFsbCdhc3NhbHRvIGRlaSBiaWdhbnRpIGRpIHBh c3NvLgpDb21t
ZXJjaWFudGUgc3BpZWdhIGxhIHNpdHVhemlvbmUgbmVsbGEgVmFsbGU6Ci0g dGFudGUgY2l0
dOAgc2VtaS1pbmRpcGVuZGVudGkgaW4gbG90dGEsIHBp+SBjaGUgYWx0cm8g Y29tbWVyY2lh
bGUsIGZyYSBsb3JvLgotIGdvdmVybmF0ZSBkYSBjb21pdHRpIGNpdHRhZGlu aSBlZ2Vtb25p
enphdGkgZGFsbGUgZmFtaWdsaWUgbWVyY2FudGlsaSBwafkgcmljY2hlLgot IHNpY3VyZXp6
YSBnYXJhbnRpdGEgbmVsbGUgY2l0dOAgKGEgcGFydGUgZ2xpIGluZXZpdGFi aWxpIGxhZHJp
IGUgYm9yc2VnZ2lhdG9yaSksIG1lbm8gbmVsbGUgY2FtcGFnbmUuCi0gYnJp Z2FudGFnZ2lv
IGVuZGVtaWNvIGFpIGNvbmZpbmk6IG5lc3N1bm8gc2VtYnJhdmEgaW4gZ3Jh ZG8gZGkgZ2Fy
YW50aXJlIGxhIHNpY3VyZXp6YSBkZWkgcGFzc2kgdmVyc28gbGUgcmVnaW9u aSBjb25maW5h
bnRpLgpTaSBhcnJpdmEgYWxsYSBWYWxsZTogSm9uYSwgYWJpdHVhdG8gYSB2 aXZlcmUgc2No
aWFjY2lhdG8gdHJhIG1hcmUgZSBtb250YWduZSBzaSBzZW50ZSBwZXJzby4K SW5ncmVzc28g
bmVsbGEgY2l0dOAgZGkgVG9ydGEgKFRvcnRvbmEpXV0+PC9EZXNjPg0KCQk8 VW51c2VkPjA8
L1VudXNlZD4NCgkJPFNvcnRPcmRlcj4wPC9Tb3J0T3JkZXI+DQoJCTxPdXRj b21lPjwhW0NE
QVRBW11dPjwvT3V0Y29tZT4NCgkJPEdvYWw+PCFbQ0RBVEFbXV0+PC9Hb2Fs Pg0KCQk8Q29u
ZmxpY3Q+PCFbQ0RBVEFbXV0+PC9Db25mbGljdD4NCgkJPFJURkZpbGU+PCFb Q0RBVEFbUlRG
XzAwMDIzLnJ0Zl1dPjwvUlRGRmlsZT4NCgkJPEJlbG9uZ3NUb0NoSUQ+Njwv QmVsb25nc1Rv
Q2hJRD4NCgkJPE1pbnV0ZT4wPC9NaW51dGU+DQoJCTxIb3VyPjA8L0hvdXI+ DQoJCTxEYXk+
MDwvRGF5Pg0KCQk8U3BlY2lmaWNEYXRlTW9kZT4tMTwvU3BlY2lmaWNEYXRl TW9kZT4NCgkJ
PFNwZWNpZmljRGF0ZVRpbWU+MjczMC0wNS0wMyAxMS40MjwvU3BlY2lmaWNE YXRlVGltZT4N
CgkJPExhc3RzTWludXRlcz4wPC9MYXN0c01pbnV0ZXM+DQoJCTxMYXN0c0hv dXJzPjA8L0xh
c3RzSG91cnM+DQoJCTxMYXN0c0RheXM+MDwvTGFzdHNEYXlzPg0KCQk8Rmll bGQxPjE8L0Zp
ZWxkMT4NCgkJPEZpZWxkMj4xPC9GaWVsZDI+DQoJCTxGaWVsZDM+MTwvRmll bGQzPg0KCQk8
RmllbGQ0PjE8L0ZpZWxkND4NCgkJPFN0YXR1cz4xPC9TdGF0dXM+DQoJCTxX b3JkQ291bnQ+
MTE3MjwvV29yZENvdW50Pg0KCQk8TGV0dGVyQ291bnQ+NjgxMzwvTGV0dGVy Q291bnQ+DQoJ
CTxDaGFyYWN0ZXJzPg0KCQkJPENoYXJJRD4xPC9DaGFySUQ+DQoJCTwvQ2hh cmFjdGVycz4N
CgkJPExvY2F0aW9ucz4NCgkJPC9Mb2NhdGlvbnM+DQoJCTxJdGVtcz4NCgkJ PC9JdGVtcz4N
Cgk8L1NDRU5FPg0KCTxTQ0VORT4NCgkJPElEPjI0PC9JRD4NCgkJPFZlcj41 PC9WZXI+DQoJ
CTxUaXRsZT48IVtDREFUQVtNaWxhXV0+PC9UaXRsZT4NCgkJPERlc2M+PCFb Q0RBVEFbTGUg
bXVyYSBkaSBNaWxhIChNaWxhbm8pLgpMYSBCdXNzb2xhIHB1bnRhIHZlcnNv IGlsIHRlbXBp
byBkaSBQYWxsYS4KTGUgYm90dGVnaGUgZGVnbGkgYXJ0aWdpYW5pLl1dPjwv RGVzYz4NCgkJ
PFVudXNlZD4wPC9VbnVzZWQ+DQoJCTxTb3J0T3JkZXI+MDwvU29ydE9yZGVy Pg0KCQk8T3V0
Y29tZT48IVtDREFUQVtdXT48L091dGNvbWU+DQoJCTxHb2FsPjwhW0NEQVRB W11dPjwvR29h
bD4NCgkJPENvbmZsaWN0PjwhW0NEQVRBW11dPjwvQ29uZmxpY3Q+DQoJCTxS VEZGaWxlPjwh
W0NEQVRBW1JURl8wMDAyNC5ydGZdXT48L1JURkZpbGU+DQoJCTxCZWxvbmdz VG9DaElEPjY8
L0JlbG9uZ3NUb0NoSUQ+DQoJCTxNaW51dGU+MDwvTWludXRlPg0KCQk8SG91 cj4wPC9Ib3Vy
Pg0KCQk8RGF5PjA8L0RheT4NCgkJPFNwZWNpZmljRGF0ZU1vZGU+LTE8L1Nw ZWNpZmljRGF0
ZU1vZGU+DQoJCTxTcGVjaWZpY0RhdGVUaW1lPjI3MzAtMDUtMDMgMTEuNDI8 L1NwZWNpZmlj
RGF0ZVRpbWU+DQoJCTxMYXN0c01pbnV0ZXM+MDwvTGFzdHNNaW51dGVzPg0K CQk8TGFzdHNI
b3Vycz4wPC9MYXN0c0hvdXJzPg0KCQk8TGFzdHNEYXlzPjA8L0xhc3RzRGF5 cz4NCgkJPEZp
ZWxkMT4xPC9GaWVsZDE+DQoJCTxGaWVsZDI+MTwvRmllbGQyPg0KCQk8Rmll bGQzPjE8L0Zp
ZWxkMz4NCgkJPEZpZWxkND4xPC9GaWVsZDQ+DQoJCTxTdGF0dXM+MTwvU3Rh dHVzPg0KCQk8
V29yZENvdW50PjY4NjwvV29yZENvdW50Pg0KCQk8TGV0dGVyQ291bnQ+NDEz OTwvTGV0dGVy
Q291bnQ+DQoJCTxDaGFyYWN0ZXJzPg0KCQkJPENoYXJJRD4xPC9DaGFySUQ+ DQoJCTwvQ2hh
cmFjdGVycz4NCgkJPExvY2F0aW9ucz4NCgkJPC9Mb2NhdGlvbnM+DQoJCTxJ dGVtcz4NCgkJ
PC9JdGVtcz4NCgk8L1NDRU5FPg0KCTxTQ0VORT4NCgkJPElEPjI1PC9JRD4N CgkJPFZlcj41
PC9WZXI+DQoJCTxUaXRsZT48IVtDREFUQVtJbCB0ZW1waW8gZGkgUGFsbGFd XT48L1RpdGxl
Pg0KCQk8RGVzYz48IVtDREFUQVtJbCBNYWdvIHNpIGZhIHJpY29ub3NjZXJl IGRhbCBTYWNl
cmRvdGUuCgpMJ2FtdWxldG8gZGkgUGFsbGEgbm9uIGZvcm5pc2NlIG1vbHRl IGluZm9ybXpp
b25pLCBtYSBpbCBTYWNlcmRvdGUgZGljZToKCi0gU29ubyBwYXNzYXRpIGRh bCB0ZW1waW8g
YWx0cmkgUGVsbGVncmluaSBDYWNjaWF0b3JpOyB1bm8gbG8gYXZldmEgcGVy c29uYWxtZW50
ZSB2aXN0byBpbCBTYWNlcmRvdGUuCgotIEdsaSBEZWkgbm9uIHNlbWJyYW5v IGZhdm9yaXJl
IGdsaSBpbnRlcnNjYW1iaSBmcmEgbGUgZGl2ZXJzZSByZWdpb25pOiBjaGkg dmlhZ2dpYSBs
byBmYSBhIHN1byByaXNjaGlvIGUgcGVyaWNvbG8uCgotIEEgdm9sdGUgZ2xp IERlaSBoYW5u
byBpbnRlcmRldHRvIGNvbXBsZXRhbWVudGUgbGUgY29tdW5pY2F6aW9uaSBj b24gaWwgTm9y
ZDogbmVzc3VubyByaXVzY2l2YSBhIHBhc3NhcmUuCgotIEdsaSBEZWkgbm9u IGhhbm5vIG1h
aSB2b2x1dG8gaW50cm9tZXR0ZXJzaSBuZWdsaSBhZmZhcmkgZGVsbGEgVmFs bGUKCi0gQW5j
aGUgc2UsIGEgdm9sdGUsIGVyYSBkZWwgdHV0dG8gZXZpZGVudGUgY2hlIGRp c2FwcHJvdmF2
YW5vIGFsY3VuZSBwb2xpdGljaGUgZSBhbGN1bmkgZ292ZXJuYW50aS4KCi0g QXZldmFubyBl
c3ByZXNzYW1lbnRlIHZpZXRhdG8gYWkgU2FjZXJkb3RpIGRpIHNjaGllcmFy c2ksIGFsbWVu
byBhIG5vbWUgZGVsIERpby4KCi0gUG90ZXZhbm8gZmFybG8gYSB0aXRvbG8g cGVyc29uYWxl
LiBJbiBxdWVpIGNhc2kgZ2xpIEFtdWxldGkgc21ldHRldmFubyBkaSBmdW56 aW9uYXJlLgoK
UXVhbmRvIGVzY2UgSm9uYSBub3RhIGNoZSBsYSBCdXNzb2xhIHB1bnRhIGEg Tm9yZC5dXT48
L0Rlc2M+DQoJCTxVbnVzZWQ+MDwvVW51c2VkPg0KCQk8U29ydE9yZGVyPjA8 L1NvcnRPcmRl
cj4NCgkJPE91dGNvbWU+PCFbQ0RBVEFbXV0+PC9PdXRjb21lPg0KCQk8R29h bD48IVtDREFU
QVtdXT48L0dvYWw+DQoJCTxDb25mbGljdD48IVtDREFUQVtdXT48L0NvbmZs aWN0Pg0KCQk8
UlRGRmlsZT48IVtDREFUQVtSVEZfMDAwMjUucnRmXV0+PC9SVEZGaWxlPg0K CQk8QmVsb25n
c1RvQ2hJRD42PC9CZWxvbmdzVG9DaElEPg0KCQk8TWludXRlPjA8L01pbnV0 ZT4NCgkJPEhv
dXI+MDwvSG91cj4NCgkJPERheT4wPC9EYXk+DQoJCTxTcGVjaWZpY0RhdGVN b2RlPi0xPC9T
cGVjaWZpY0RhdGVNb2RlPg0KCQk8U3BlY2lmaWNEYXRlVGltZT4yNzMwLTA1 LTAzIDExLjQy
PC9TcGVjaWZpY0RhdGVUaW1lPg0KCQk8TGFzdHNNaW51dGVzPjA8L0xhc3Rz TWludXRlcz4N
CgkJPExhc3RzSG91cnM+MDwvTGFzdHNIb3Vycz4NCgkJPExhc3RzRGF5cz4w PC9MYXN0c0Rh
eXM+DQoJCTxGaWVsZDE+MTwvRmllbGQxPg0KCQk8RmllbGQyPjE8L0ZpZWxk Mj4NCgkJPEZp
ZWxkMz4xPC9GaWVsZDM+DQoJCTxGaWVsZDQ+MTwvRmllbGQ0Pg0KCQk8U3Rh dHVzPjE8L1N0
YXR1cz4NCgkJPFdvcmRDb3VudD4xMDI5PC9Xb3JkQ291bnQ+DQoJCTxMZXR0 ZXJDb3VudD42
MjI3PC9MZXR0ZXJDb3VudD4NCgkJPENoYXJhY3RlcnM+DQoJCQk8Q2hhcklE PjE8L0NoYXJJ
RD4NCgkJPC9DaGFyYWN0ZXJzPg0KCQk8TG9jYXRpb25zPg0KCQk8L0xvY2F0 aW9ucz4NCgkJ
PEl0ZW1zPg0KCQk8L0l0ZW1zPg0KCTwvU0NFTkU+DQoJPFNDRU5FPg0KCQk8 SUQ+MjY8L0lE
Pg0KCQk8VmVyPjU8L1Zlcj4NCgkJPFRpdGxlPjwhW0NEQVRBW0NvbnNpZ2xp byBzZXJhbGVd
XT48L1RpdGxlPg0KCQk8RGVzYz48IVtDREFUQVtKb25hIHJpcG9ydGEgcXVh bnRvIHNhcHV0
byBhbCB0ZW1waW8gZGkgUGFsbGEuCgpTZSBsYSBCdXNzb2xhIHB1bnRhIGEg Tm9yZCBzaWdu
aWZpY2EgY2hlIHF1ZWxsbyBjaGUgZG92ZXZhIGZhcmUgYWwgdGVtcGlvIGRp IFBhbGwg6CBz
dGF0byBmYXR0by4KClF1YWxlIOggaWwgU2VncmV0byBjaGUgaGEgYXBwcmVz bz8KCkkgYnJp
Z2FudGkgZGkgcGFzc28gc29ubyB1biBhZ2VudGUgY29uIGN1aSBnbGkgRGVp IG1hbnRlbmdv
bm8gc2VwYXJhdGkgaSB0ZXJyaXRvcmkuCgpQZXJjaOggZ2xpIERlaSB2b2ds aW9ubyBpIHRl
cnJpdG9yaSBzZXBhcmF0aT8KCkRhcmRhOiBwcm92YSBhIGNoaWVkZXJsbyBh bGwnQW11bGV0
byEKCkFtdWxldG86IFRyb3BwbyBmYWNpbGUuIERvdmV0ZSBjYXBpcmxvIGRh IHNvbGkuCgpE
YXJkYTogYWxtZW5vIGhhIGNvbmZlcm1hdG8gY2hlIHF1ZXN0byDoIHF1ZWxs byBjaGUgZG92
ZXZlbW8gY2FwaXJlIV1dPjwvRGVzYz4NCgkJPFVudXNlZD4wPC9VbnVzZWQ+ DQoJCTxTb3J0
T3JkZXI+MDwvU29ydE9yZGVyPg0KCQk8T3V0Y29tZT48IVtDREFUQVtdXT48 L091dGNvbWU+
DQoJCTxHb2FsPjwhW0NEQVRBW11dPjwvR29hbD4NCgkJPENvbmZsaWN0Pjwh W0NEQVRBW11d
PjwvQ29uZmxpY3Q+DQoJCTxSVEZGaWxlPjwhW0NEQVRBW1JURl8wMDAyNi5y dGZdXT48L1JU
RkZpbGU+DQoJCTxCZWxvbmdzVG9DaElEPjY8L0JlbG9uZ3NUb0NoSUQ+DQoJ CTxNaW51dGU+
MDwvTWludXRlPg0KCQk8SG91cj4wPC9Ib3VyPg0KCQk8RGF5PjA8L0RheT4N CgkJPFNwZWNp
ZmljRGF0ZU1vZGU+LTE8L1NwZWNpZmljRGF0ZU1vZGU+DQoJCTxTcGVjaWZp Y0RhdGVUaW1l
PjI3MzAtMDUtMDMgMTEuNDI8L1NwZWNpZmljRGF0ZVRpbWU+DQoJCTxMYXN0 c01pbnV0ZXM+
MDwvTGFzdHNNaW51dGVzPg0KCQk8TGFzdHNIb3Vycz4wPC9MYXN0c0hvdXJz Pg0KCQk8TGFz
dHNEYXlzPjA8L0xhc3RzRGF5cz4NCgkJPEZpZWxkMT4xPC9GaWVsZDE+DQoJ CTxGaWVsZDI+
MTwvRmllbGQyPg0KCQk8RmllbGQzPjE8L0ZpZWxkMz4NCgkJPEZpZWxkND4x PC9GaWVsZDQ+
DQoJCTxTdGF0dXM+MTwvU3RhdHVzPg0KCQk8V29yZENvdW50PjU0ODwvV29y ZENvdW50Pg0K
CQk8TGV0dGVyQ291bnQ+MzQyNTwvTGV0dGVyQ291bnQ+DQoJCTxDaGFyYWN0 ZXJzPg0KCQkJ
PENoYXJJRD4xPC9DaGFySUQ+DQoJCTwvQ2hhcmFjdGVycz4NCgkJPExvY2F0 aW9ucz4NCgkJ
PC9Mb2NhdGlvbnM+DQoJCTxJdGVtcz4NCgkJPC9JdGVtcz4NCgk8L1NDRU5F Pg0KCTxTQ0VO
RT4NCgkJPElEPjI3PC9JRD4NCgkJPFZlcj41PC9WZXI+DQoJCTxUaXRsZT48 IVtDREFUQVtW
ZXJzbyBOb3JkXV0+PC9UaXRsZT4NCgkJPERlc2M+PCFbQ0RBVEFbTGUgbW9u dGFnbmUgaW4g
bG9udGFuYW56YQoKTGUgZm9yZXN0ZSBlIGkgbGFnaGkuCkxhIGNpdHTgIGFs bG8gc2JvY2Nv
IGRlbCBsYWdvIEt1bSAoQ29tbyldXT48L0Rlc2M+DQoJCTxVbnVzZWQ+MDwv VW51c2VkPg0K
CQk8U29ydE9yZGVyPjA8L1NvcnRPcmRlcj4NCgkJPE91dGNvbWU+PCFbQ0RB VEFbXV0+PC9P
dXRjb21lPg0KCQk8R29hbD48IVtDREFUQVtdXT48L0dvYWw+DQoJCTxDb25m bGljdD48IVtD
REFUQVtdXT48L0NvbmZsaWN0Pg0KCQk8UlRGRmlsZT48IVtDREFUQVtSVEZf MDAwMjcucnRm
XV0+PC9SVEZGaWxlPg0KCQk8QmVsb25nc1RvQ2hJRD42PC9CZWxvbmdzVG9D aElEPg0KCQk8
TWludXRlPjA8L01pbnV0ZT4NCgkJPEhvdXI+MDwvSG91cj4NCgkJPERheT4w PC9EYXk+DQoJ
CTxTcGVjaWZpY0RhdGVNb2RlPi0xPC9TcGVjaWZpY0RhdGVNb2RlPg0KCQk8 U3BlY2lmaWNE
YXRlVGltZT4yNzMwLTA1LTAzIDExLjQyPC9TcGVjaWZpY0RhdGVUaW1lPg0K CQk8TGFzdHNN
aW51dGVzPjA8L0xhc3RzTWludXRlcz4NCgkJPExhc3RzSG91cnM+MDwvTGFz dHNIb3Vycz4N
CgkJPExhc3RzRGF5cz4wPC9MYXN0c0RheXM+DQoJCTxGaWVsZDE+MTwvRmll bGQxPg0KCQk8
RmllbGQyPjE8L0ZpZWxkMj4NCgkJPEZpZWxkMz4xPC9GaWVsZDM+DQoJCTxG aWVsZDQ+MTwv
RmllbGQ0Pg0KCQk8U3RhdHVzPjE8L1N0YXR1cz4NCgkJPFdvcmRDb3VudD4y NjE8L1dvcmRD
b3VudD4NCgkJPExldHRlckNvdW50PjE1MzQ8L0xldHRlckNvdW50Pg0KCQk8 Q2hhcmFjdGVy
cz4NCgkJCTxDaGFySUQ+MTwvQ2hhcklEPg0KCQk8L0NoYXJhY3RlcnM+DQoJ CTxMb2NhdGlv
bnM+DQoJCTwvTG9jYXRpb25zPg0KCQk8SXRlbXM+DQoJCTwvSXRlbXM+DQoJ PC9TQ0VORT4N
Cgk8U0NFTkU+DQoJCTxJRD4yODwvSUQ+DQoJCTxWZXI+NTwvVmVyPg0KCQk8 VGl0bGU+PCFb
Q0RBVEFbU3VsIExhZ29dXT48L1RpdGxlPg0KCQk8RGVzYz48IVtDREFUQVtJ IG1vbnRpIHZp
Y2luaSB2aXN0aSBvbHRyZSBpbCBsYWdvLgpMZSB6YXR0ZXJlIGRpIHRyb25j aGkgc3VsIGxh
Z28uCkxlIHNlZ2hlcmllIGFkIGFjcXVhLiBBY2Nlbm5vIGFpIG1hY2NoaW5h cmkgZGVpIE5h
bmkuXV0+PC9EZXNjPg0KCQk8VW51c2VkPjA8L1VudXNlZD4NCgkJPFNvcnRP cmRlcj4wPC9T
b3J0T3JkZXI+DQoJCTxPdXRjb21lPjwhW0NEQVRBW11dPjwvT3V0Y29tZT4N CgkJPEdvYWw+
PCFbQ0RBVEFbXV0+PC9Hb2FsPg0KCQk8Q29uZmxpY3Q+PCFbQ0RBVEFbXV0+ PC9Db25mbGlj
dD4NCgkJPFJURkZpbGU+PCFbQ0RBVEFbUlRGXzAwMDI4LnJ0Zl1dPjwvUlRG RmlsZT4NCgkJ
PEJlbG9uZ3NUb0NoSUQ+NzwvQmVsb25nc1RvQ2hJRD4NCgkJPE1pbnV0ZT4w PC9NaW51dGU+
DQoJCTxIb3VyPjA8L0hvdXI+DQoJCTxEYXk+MDwvRGF5Pg0KCQk8U3BlY2lm aWNEYXRlTW9k
ZT4tMTwvU3BlY2lmaWNEYXRlTW9kZT4NCgkJPFNwZWNpZmljRGF0ZVRpbWU+ MjczMC0wNS0w
MyAxMS40MjwvU3BlY2lmaWNEYXRl
Re: Is EMF suitable to implement key/keyref pairs? [message #504489 is a reply to message #504485] Sun, 20 December 2009 10:32 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33137
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------020507050209040107030200
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Mauro,

Comments below.

Mauro Condarelli wrote:
> Ed Merks wrote:
>> You'd get the latter for free. I assume you have an XML Schema? It
>> would take only a few minutes to test drive your schema using the
>> steps in this tutorial:
>>
>> Tutorial: Generating an EMF Model using XML Schema
>>
>> < http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclips e.emf.doc/tutorials/xlibmod/xlibmod.html>
>>
>>
>> This option will help, but it will only use CDATA when it's needed.
>>
>> /**
>> * Serialized element content that needs escaping and doesn't
>> contain <code>"]]>"</code>, will be escaped using CDATA.
>> * The default value is false.
>> * @since {@link #OPTION_SKIP_ESCAPE}
>> * @since 2.4
>> */
>> String OPTION_ESCAPE_USING_CDATA = "ESCAPE_USING_CDATA";
>>
>> If the content corresponds a complex type with mixed content then the
>> CDATA will be preserved in all cases.
>>
>> Binding XML to Java
>>
>> < http://www.theserverside.com/tt/articles/article.tss?l=Bindi ngXMLJava>
>>
>>> (e.g.: Places/PLACES), at least under windows.
>> With extended meta data, the Java names needn't be the same as the
>> XML names, which could even include things line - which aren't
>> allowed in Java.
>>>
>> If you have a schema it will take only a few minutes to test drive
>> EMF. Note that you can also invoke Generate Test Code and end up
>> with a simple stand alone application XyzExample.java for reading and
>> writing instances.
> I tried, but my unadulterated .xls (working with JAXB) doesn't seem
> able to read my current file.
> Unless I goofed very badly there's something amiss.
>
> I include both my .xls and my test file.
> Please notice I built the .xls file from the examples, so I could have
> done wrong choices.
>
> The test application can read my test file, but I didn't find an easy
> way to print out the resulting tree.
Resource.save.
> I tried walking it, but the eContents() field seem jut to enumerate
> the list arguments. Perusing in debug mode shows the content is there.
> I just miss the correct printing method, which should be different for
> each class. Is there a way to automatically generate it?
Objects are stored in resources and those are what's saved.
> OTOH the generated editor does not show any of the resources, which, I
> assume, are accessible through specialized API in the model.
By default resources factories are registered based on file extension,
so I'm not sure if you changed the file extension in the GenPackage
properties to recognize your extension?
>
> A few questions:
>
> 1) Is there a way to create a new element with all required fields set
> to the default values? (aside from coding it explicitly, of course ;) )
If an element has a default value then the newly created object will
yield that value from the accessor.
> 2) when I peruse any of the ID list types (e.g.: ScID) I see elements
> interspersed with strings (mainly indentation) Is there a way (aside
> from coding "if (elem instanceof ...) ...") to get the raw int[] or,
> better, List<int> I need?
I'm not sure what you mean. List<int> isn't valid in Java.
> 3) What is the correct way to add a certain WhateverID to an ID-list?
> I see a eInverseAdd() function is available, but usage is unclear (to
> me).
Nor would you ever to that directly. Just add objects to the list and
that's add.
> 4) I see complete notification framework is generated: what is its
> intended usage?
The uses are many. Keeping a UI in sync with changes is one. There's
also a ChangeRecorder that can be used to record all changes and encode
them as a delta description (or can be used to undo all changes).
> 5) I seem to understand there is no automatic way to associate the IDs
> to the actual classes (map ScID to SCENE) whether I define the
> key/keyref pairs or not. Is this correct?
xsd:ID and xsd:IDREF are supported but key/keyref is ignored.
> 6) CDATA generation will happen if and only if it is required for
> escaping. This would be bad because I need to generate them for
> several fields regardless of the contents.
It's hard to imagine an application that requires CDATA encoding.
Normal DOM processing makes this transparent. But I see you have mixed
text complex types so you can certain force CDATA into that.
> 7) How can I control the class names? Should i bother?
XML Schema to Ecore Mapping
< http://www.eclipse.org/modeling/emf/docs/overviews/XMLSchema ToEcoreMapping.pdf>

>
> I am reading now the EMF Developer Guide. What other documentation
> should I read? what are other projects/frameworks that could be useful
> in this development?
That sounds like a good start. You don't need much else to do the
basic XML stuff you're trying to do.
>
> Thanks
> Mauro

--------------020507050209040107030200
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Mauro,<br>
<br>
Comments below.<br>
<br>
Mauro Condarelli wrote:
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite">Ed Merks
wrote:
<br>
<blockquote type="cite">You'd get the latter for free.&nbsp; I assume you
have an XML Schema? It would take only a few minutes to test drive your
schema using the steps in this tutorial:
<br>
<br>
&nbsp;&nbsp;&nbsp; Tutorial: Generating an EMF Model using XML Schema
<br>
&nbsp;&nbsp;&nbsp;
<a class="moz-txt-link-rfc2396E" href=" http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclips e.emf.doc/tutorials/xlibmod/xlibmod.html">&lt; http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclips e.emf.doc/tutorials/xlibmod/xlibmod.html&gt;</a>
<br>
<br>
This option will help,&nbsp; but it will only use CDATA when it's needed.
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Serialized element content that needs escaping and doesn't
<br>
&nbsp;&nbsp;&nbsp; contain &lt;code&gt;"]]&gt;"&lt;/code&gt;, will be escaped using
CDATA.
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * The default value is false.
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @since {@link #OPTION_SKIP_ESCAPE}
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @since 2.4
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String OPTION_ESCAPE_USING_CDATA = "ESCAPE_USING_CDATA";
<br>
<br>
If the content corresponds a complex type with mixed content then the
CDATA will be preserved in all cases.
<br>
<br>
&nbsp;&nbsp;&nbsp; Binding XML to Java
<br>
&nbsp;&nbsp;&nbsp;
<a class="moz-txt-link-rfc2396E" href=" http://www.theserverside.com/tt/articles/article.tss?l=Bindi ngXMLJava">&lt; http://www.theserverside.com/tt/articles/article.tss?l=Bindi ngXMLJava&gt;</a>
<br>
<br>
<blockquote type="cite">(e.g.: Places/PLACES), at least under
windows.
<br>
</blockquote>
With extended meta data, the Java names needn't be the same as the XML
names, which could even include things line - which aren't allowed in
Java.
<br>
<blockquote type="cite"><br>
</blockquote>
If you have a schema it will take only a few minutes to test drive
EMF.&nbsp; Note that you can also invoke Generate Test Code and end up with
a simple stand alone application XyzExample.java for reading and
writing instances.
<br>
</blockquote>
I tried, but my unadulterated .xls (working with JAXB) doesn't seem
able to read my current file.
<br>
Unless I goofed very badly there's something amiss.
<br>
<br>
I include both my .xls and my test file.
<br>
Please notice I built the .xls file from the examples, so I could have
done wrong choices.
<br>
<br>
The test application can read my test file, but I didn't find an easy
way to print out the resulting tree.
<br>
</blockquote>
Resource.save.<br>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite">I tried
walking it, but the eContents() field seem jut to enumerate the list
arguments. Perusing in debug mode shows the content is there. I just
miss the correct printing method, which should be different for each
class. Is there a way to automatically generate it?
<br>
</blockquote>
Objects are stored in resources and those are what's saved.&nbsp; <br>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite">OTOH the
generated editor does not show any of the resources, which, I assume,
are accessible through specialized API in the model.
<br>
</blockquote>
By default resources factories are registered based on file extension,
so I'm not sure if you changed the file extension in the GenPackage
properties to recognize your extension?<br>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite"><br>
A few questions:
<br>
<br>
1) Is there a way to create a new element with all required fields set
to the default values? (aside from coding it explicitly, of course ;) )
<br>
</blockquote>
If an element has a default value then the newly created object will
yield that value from the accessor.<br>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite">2) when I
peruse any of the ID list types (e.g.: ScID) I see elements
interspersed with strings (mainly indentation) Is there a way (aside
from coding "if (elem instanceof ...) ...") to get the raw int[] or,
better, List&lt;int&gt; I need?
<br>
</blockquote>
I'm not sure what you mean.&nbsp; List&lt;int&gt; isn't valid in Java.<br>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite">3) What is
the correct way to add a certain WhateverID to an ID-list? I see a
eInverseAdd() function is available, but usage is unclear (to me).
<br>
</blockquote>
Nor would you ever to that directly.&nbsp; Just add objects to the list and
that's add.<br>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite">4) I see
complete notification framework is generated: what is its intended
usage?
<br>
</blockquote>
The uses are many.&nbsp; Keeping a UI in sync with changes is one.&nbsp; There's
also a ChangeRecorder that can be used to record all changes and encode
them as a delta description (or can be used to undo all changes).<br>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite">5) I seem
to understand there is no automatic way to associate the IDs to the
actual classes (map ScID to SCENE) whether I define the key/keyref
pairs or not. Is this correct?
<br>
</blockquote>
xsd:ID and xsd:IDREF are supported but key/keyref is ignored.<br>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite">6) CDATA
generation will happen if and only if it is required for escaping. This
would be bad because I need to generate them for several fields
regardless of the contents.
<br>
</blockquote>
It's hard to imagine an application that requires CDATA encoding.&nbsp;
Normal DOM processing makes this transparent.&nbsp; But I see you have mixed
text complex types so you can certain force CDATA into that.<br>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite">7) How can
I control the class names? Should i bother?
<br>
</blockquote>
<a
href=" http://www.eclipse.org/modeling/emf/docs/overviews/XMLSchema ToEcoreMapping.pdf">XML
Schema to Ecore Mapping</a>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite"><br>
I am reading now the EMF Developer Guide. What other documentation
should I read? what are other projects/frameworks that could be useful
in this development?
<br>
</blockquote>
That sounds like a good start.&nbsp;&nbsp; You don't need much else to do the
basic XML stuff you're trying to do.<br>
<blockquote cite="mid:4B2E361A.70606@mclink.it" type="cite"><br>
Thanks
<br>
Mauro
<br>
</blockquote>
</body>
</html>

--------------020507050209040107030200--


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: Is EMF suitable to implement key/keyref pairs? [message #505079 is a reply to message #504489] Sat, 26 December 2009 14:02 Go to previous messageGo to next message
Mauro Condarelli is currently offline Mauro CondarelliFriend
Messages: 428
Registered: September 2009
Senior Member
This is a multi-part message in MIME format.
--------------080504080903060704050008
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Sorry for the late answer, but festivities and my wife at hospital took
some of my time.

Thanks for the support, but I'm not there yet.

Ed Merks wrote:
> Mauro,
>
> Comments below.
>
> Mauro Condarelli wrote:
>> Ed Merks wrote:
>>> You'd get the latter for free. I assume you have an XML Schema? It
>>> would take only a few minutes to test drive your schema using the
>>> steps in this tutorial:
>>>
>>> Tutorial: Generating an EMF Model using XML Schema
Done.
It works :)

>>>
>>> This option will help, but it will only use CDATA when it's needed.
>>>
>>> String OPTION_ESCAPE_USING_CDATA = "ESCAPE_USING_CDATA";
>>>
>>> If the content corresponds a complex type with mixed content then the
>>> CDATA will be preserved in all cases.
This is a big stumbling block.

The following code:

try {
Map<String, Boolean> opt = new HashMap<String, Boolean>();
OutputStream os = new FileOutputStream("C:\\TEMP\\no-opts.xml");
resource.save(os, opt);
os.close();
opt.put(XMLResource.OPTION_ESCAPE_USING_CDATA, Boolean.TRUE);
os = new FileOutputStream("C:\\TEMP\\one-opt.xml");
resource.save(os, opt);
os.close();
opt.put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
os = new FileOutputStream("C:\\TEMP\\two-opts.xml");
resource.save(os, opt);
os.close();
} catch (IOException e) {
e.printStackTrace();
}

trasforms:
<Title><![CDATA[La Missione]]></Title>
<Desc><![CDATA[]]></Desc>
<FieldTitle1><![CDATA[]]></FieldTitle1>
<FieldTitle2><![CDATA[]]></FieldTitle2>
<FieldTitle3><![CDATA[]]></FieldTitle3>
<FieldTitle4><![CDATA[]]></FieldTitle4>
<Bio><![CDATA[]]></Bio>
<AuthorName><![CDATA[Mauro Condarelli]]></AuthorName>
into:
<Title>La Missione</Title>
<Desc></Desc>
<FieldTitle1></FieldTitle1>
<FieldTitle2></FieldTitle2>
<FieldTitle3></FieldTitle3>
<FieldTitle4></FieldTitle4>
<Bio></Bio>
<AuthorName>Mauro Condarelli</AuthorName>
which is not good, but I can live with it, but also transforms:
<Scenes>
<ScID>87</ScID>
<ScID>91</ScID>
<ScID>90</ScID>
<ScID>89</ScID>
<ScID>88</ScID>
<ScID>92</ScID>
<ScID>93</ScID>
<ScID>94</ScID>
<ScID>95</ScID>
<ScID>96</ScID>
</Scenes>
into:
<Scenes><![CDATA[
]]><ScID>87</ScID><![CDATA[
]]><ScID>91</ScID><![CDATA[
]]><ScID>90</ScID><![CDATA[
]]><ScID>89</ScID><![CDATA[
]]><ScID>88</ScID><![CDATA[
]]><ScID>92</ScID><![CDATA[
]]><ScID>93</ScID><![CDATA[
]]><ScID>94</ScID><![CDATA[
]]><ScID>95</ScID><![CDATA[
]]><ScID>96</ScID><![CDATA[
]]></Scenes>
which is surely bad!
How can I avoid this effect?

I do attach a .zip archive with the .xsd file along with the original
file and YW5Example output with and without option
(OPTION_USE_LEXICAL_HANDLER does not have any impact on the output).
In an ideal world I would like to have the output identical to the input
(unless I change it, of course!).

>>>
>>> Binding XML to Java
I see, I think I can live with the default, but it's nice to know I can
change it if needed.

All other questions are solved (more or less).
The real problem is the other application will *not* read the
regenerated xml file, so all is useless :(

Thanks and I wish You a
Merry Christmas (I hope it was, I mean)
and a Very Happy New Year!

Mauro

--------------080504080903060704050008
Content-Type: application/x-zip-compressed;
name="temp.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="temp.zip"

UEsDBBQAAAAIAEcDlzsZFejksV0AABY3AgAPAAAATGEgTWlzc2lvbmUueXc1 7F3ZcttId76O
qvIOSG5kV1GyuGgdx1MaeTxxIi+xPJOtUqkmCFKdgACDhUn0GHnCufR17nKX 7zunGyAlmwRl
MUVm+Nf8Fgg0esU5fZbvnH7543+M42AaZblNk7/48/bh0Z8HURKmA5uM/uLP bZ4enJ0dnx+0
//zHV3+69/Lv//bT288/fzrG9Z+8/Pjpw1/9fPWZ13/y8rcoe3X88gX+6O/P toijVy//7B+v
Xl9+vvzHaxO8sznbiP7pn169fCGPteTrKA/rgvKUt/ThGxvFAyncvldm5sn9 op1vFu3cL9r9
ZtHu/aK9bxbtadGfbHqvCO7oo8uyuE2z92Y8MyXvTJmlwVWaDEwWxbGVN+qC +uLfptngs8lG
UfHq6OWL+pc+/TkZvLODQRxd3b59zQJzN6oyP0UjmyRYULnbQbF79+q2rtIy KW4Kk1Xt1Xe0
1N+9u35j4+g3/WJY2/wdLXVt8uJNGcc/mfBfy8mrztERvqHOQaf78sX8o3vD 1JZemyJ61T47
l3e67MjD5/dfxJgevDb3tH7p3adfbyZRaIc2lJud0+7RwdHxwRF6N//s4Quf 7RhttA97GPj8
7epzNoPYJhHfbuvA8V+n9/LF3JOHhTtulo4eFO48LNx1hdsypXNPHhbuzc3/ 3JOHhY9RGH04
Qs0Y4tyT+cJuJepRnh10Tuo36sffeK1TT87xV17rfPW1euRHX3+t+43Xen7C ZHYfPv7Ga8d+
6r7+mjLCFzOc8OX1h6vLz28/vL+Z+6XVg9LaL1+8fd2IZV6Z3ASDKA7emVEa HARXZWgTc597
/pqUeTQgseqV3r1Js+JDNkDNaK/6oZ31Xfp6/zqP7t9NUQ5sumr/Oov792J+ OrH5vKuvHjGp
l+MyjorU93vl7j6cTnak6tEjprHqkQ0+35pk5R51vt2jF/V0Xf3l5afLK2zd 934+YgqfYtqw
I/71ZV3lX6Xuw8bdpXvpL6mJ83sP5Z4+5tbiN9q69sDOrLcr4pm7+Zc0e3WA LvLKzWE1QfPT
9Yj1vYmyxCyWed7YUWwNv4DZrh5WolCzOZ79EJ5+EmUYQbxvJpMsSgY2L8zi CT1aaT67jedT
iGTxfL62kKtMGFpTpFl0bxrfp0U0M/KrNEaZiyBL8zwNcpOMSn1DyjWb+e7i r/sdnkXr+7xl
QlrB/KCf6jvvNV6Xt5MmywK+G//Xh36My0iY8McoG6RJ2myR3kdZuuri9NZK Fhx1K1g6su8n
kOPGC3GZh3E0abYUoOFoYClXBJG78QZTbZotxxQjXJlYjte6Hjr4VtBogN+/ KifNV2WYLSOP
yOhHdDlehWuZVRfgZL0LgHG2gvmxPNFknzae7A8Ta5pNNj6HKCtsbIvfm834 yJo4ToN0dUZ0
utZ555BbwVeG9USTf9Z48j9ighrP/hU4ZB5GyZ1ZUdo5W+tsyhhawVf6+VSc 47z5fEIyiRqx
cwhkTRlHPy5X/X7P1zvjHGUrqEfyZGyjfdR4qi+z8NY2muo4wieRF1l5B5OX dXtLhG6HqCFp
uAi0TCXFyoykfbTWlZBJaAUrDPQJ1qi5+vka/Uia0QPodmRT67f+/4r6/Sy6 uzOHzZbnk6gE
/bTEPJvyP1ZepvZal0nnoRUsHOuTsat2c4X3H6K00eoEVzCgpy29jO3YVB8X zGsjfm3Nluny
7q7MVt+O2+vVl/8hwtBWG+kTrFJzNfq1SRpv0m9MmTRSCci2szRZWSdod9e6 FhxrK5gfz5MR
xgoacl40pIxPNkyhPFYqyw1UettsBX6zabyyStBes5KMgbeCBoN7guVorie/ NtlgCQmwd2Ua
Rllt6F5RTG2vV92VMQS+m0+m1rab67WgrWW61rsU5s1qAg/3bgy6OuDXmYvR U3X2Vc2d7fXq
sTKuFqd2zO7Lx/qUBs92c232nQ1vo3iJyHM5Y5cdGmz+4lF4ZzEAvI3rKUTN KPud1uVJZsdp
EJqsD3OzlYLX5WhVDay9XoXWjboVmG+N7HFfe/3zZhbF8P7D55/1xosHd26u fn4/e/kIp8k1
VcjY3C0HQPBXZqVgtV2N1UFQkxCNWloZ50Js8xcBPgGWhxc+MIOAlslgEmVB WhRREmURJm8K
TsvPwZFckKTZ2MRjfhm4TgIiEfr96HDvKgI2gFVPLWbdJnhX+7AqlT5UVT6U RZjOLrTU6O7W
38pXPhV9CE18GNuwuFfA39ZCnz6/eWNn5x83/vkI/2sfZsVQXnBF3IcL+SwZ 5Z9Tj5CYu+E+
LZuURcQR6ZXe/cu0FNMO/7rlNP/JDwN/9PcsnOBdOpAa7t+rQRO5Vp6z1Nzv ugSb0uf1r/op
2pWH9Y8ax9Jmx9xVfbdT3e3M3O1Wd7szd3vV3Z4bXWGKMuddvboHJXl1doTJ qX66fkb4JDO9
0Ts7hiln5o5b5VuTmRD3pEJ3QylOr7TYi7qcqzoNTQG6cD9f3Pv9tojG/pG/ xqVQdU3fj/Dy
fcwgfo2+Id7VhaIctKaEW7vOhYbzEtxNSWxvy2ms04TG2qvS2NF9GjtaRGMH 7YdE9rCooHZq
9E/gcD0PijykzuMtoc6y/zFOC5kOd92MbHsnRwvJtnPWPX402Va3OytRs/zW t+RiCYm7a21d
r5pTfnNFWrz1BSWqxKYrbO02KJNgzDf5YmDHE9CwSQrsvvf5BPbzOCy5IQO0 F7zG72eVeR/c
Q3wsz3EBOSlLR5iM6Qx3eVbLCs8P937NqYRRHlfcid32Db373cymvfncZltk gcdym/NebyG3
OT476v1fc5s1MZYVzEU0leRTEusyuQIG+nJsnbowjPJC9OqaLR3ufbLDOBL8 9awmfoUJ4Jza
uzvPbByvcWxG9YTn284kek2YxEKpv/s1JnGykti/YxKNeEGns5gXtLtn3Ufz gu8g+kbU3dz6
COrmxwtr+QKjcA1fzCc2GpnABA6HF0FhkA0/DcNyIsRrD/feBgPctQlkDGDC WCqzsLVB4xdL
QGgmFnYA/gzTHJUW+H8ZhtEA9pWV8YabRuTH303kO0Hg/4jGTztLjALdTufR NP7I/f7/Urto
bl6HdvE6ncC2vzryf9Po82RHn9tCn+2jzmL1/6TTPfl+Au02odu6kuOV6Hl1 0q1ud1an6Obe
HHoCouW+9/tOAHCAVR00m8YATncMYGMYwGM19eMlmnq3e/J4Tf1lwy263XCL bkS5zYGtr7H6
okFv+058tiPEjSHEZfR21F1Mb+3vcJ8t3XFPnmQnXpVs17A9N0dbX6FDcMMp KuKXMsqyb23V
9X6eC4KJLyge51kIOixz8/yHIKe5LbQDtaxJqD8MbAF6PNEmiI3aeo/feROG 0t0xlA1gKL3e
YobSOT07Wh9DWY1xfO/WvgLy/+0sTS4HalbFiY2BiR0w3sTsgVqYSMWZ0sEE CLaq0G57v8Rq
VU/wgJgbhJTAAQioPSE4uE5gl4ffL09h10snmYNLYnLGlkDvMa2AkUSp8k0z 7ttRCaOfxH8G
0zKFuQ/NG1atRj61HIaoywT/VpqYRr/DPTCs62g0isCM2EDdQQ5dAl/2Dtjx vLpvptHUiClx
WhYpMXFTCELqZNDWo0EgIMlUCkyQHYGGRk5GKlWxb4lBAI34Nw+kMHwTIAmZ QTApuBzm5y0p
02n6lc5xIuT9HAuARnJ85hg+XZ15admmlTE7d4gAK8aaekaapo+VrDgaoFor tSWY1bIyst65
km7YcJBkRpZV+pqUY2CppmlsuTKZJesHcANzIHMMOyrXVzo4siAfLKKZapNx 8EuGApEEt+wd
oDh6aqWoHfdNFhqdO44+JGIcnWBlriMT+z+AYRUoI60m4tXBhGZsOjSytPVQ 0SwW6EsAZxAw
XmM6ljlJ5kK+jCF68OPe9T6cwLO5B/Apo7gASvtljlXbdrxX+2i3M23LztQ+ OTpeuDWdn3ce
b3Ra+17THAv6ln4b0DmBGraB76cSIPEfxUdx8npMqPh20iL73THRkBLmszwi DceezYMdoD3c
iaaoKcFo+A+Zz6T8b6n1uaBOUKj2A/fBLdCE1pJZepAIWYnLZJRiAzCjER3L N1bZPTpAFhUJ
ZhRsXTqGFn8SPoJHWC8dSm50Y0DFbuskuxW5O0aV5P9Ojo7A/uHt+kE3Mjqy ZMuxSRiXA3Dh
Cp3N3VGSUwimhb3rZ2SFCfMhpLl0s55GbrLoMEZflPiWxJmG2lqYHTyQgY7x kf0/8Im1G8Fd
d+xvE9jf+fn5YpP7Ube9udyvOVKWMgqkGLvMBF7B5QOQp4nLAqKu8AGUEiFR mYN3ekMMmlKC
IatJJ9W7Rt8FU/RpdZRjmoyCKFJWAXVXg+VQ2Yw87FUBLwhOpwTdFVvPFBrh c3vrZQp/KAx8
7/xssc59fvp4MO3aSbs5FPYGCs077OhLhBqh28CE+Ngn1Jtle3c6VBwgPhaq pRJlrWKlLZC1
qEtQvQqKBriLt5zmE/y8HwyxbXvlF4q4TQqVjjLAYQcu8MkMMpJ9St3KJV5r UWtla9OUBjpV
jFgtaJ06Ib7OOJYebbuZrt0IK7tmwt9JA41YRvdsiZmue3y+uSyjOcg1ph1n mYn9JoxoNnFl
YfYwgxJ/vcYS9O2U3IQIeL1DWh8iIhZUfr3v6BwMR6qpnolCE9OC9pEQuS/B rbFSKE+rMi1n
0xFNwaJEkqTO8OSNXcDY9iFuZCqTxPuSgi0DM/tx72/0XTPNUDPBdyj+b2WU 409ueI9mFrxE
3Sj9s23nLo1AtmvmLn8sseKks5hHfA9qfu08ojlU9hNMBtyBJRLmIyJTg0Xs oi7vDMBTGEyi
vRuq9s42nIPG7d5bZDmn9dQDbIxoELQw8BolC0sTTQBDBDgI0bVOgciFTaS4 nzMhFI2puAXz
uOaIyqJtVxAaIWmP10vJOzmhEQ/onpwv5gGd0w2WE5rjYN/COjiwVMkrd9ti JvBrIlSc8l8b
gsj34bKhZw1fxgTMgd426hCZuqR+sxGtBf0+d+zEbL+S3whtu2Ya/mPtxssc 6ye9xzvW106J
zfGrNvby9nJcDF2bKGkSit9OpL6gvZ1exgH+pJKjggQap7la8S0dGWNI5FaE Y3sYPBPKdZv1
KMMeTZP/861XxxvhYXck+nQk2j1fplR3NphEmwNVx0iZY5YCWMZelo1j7qiJ ISXOeBEPZ8xg
DhhA/1+ugjQJGkNN6MSE5k2lmD63vBRnYaYB7tByaWmzrrEvbGESE8MipD6O xqnEnpIl2GSI
bDRitt/2oPR2I4Dtmil7J0A34gmd7unicNNe7/EA27XzhOa4VrF+5/lyXBsp VaBLI8jDstdb
7NlfSPoFo8XLTIk3pjBNgxoV4+oR3W3RLChOkG5gBzMaNuFtjDkFs4grdoJ3 VFOHYV4Eh8pf
J7q1uPfwArohsTAji2rApJiFNiU0Cu+TI93X5lviApiytREKGTcL6PN4ghKA KojLYL5/U1EG
MCDKLrQjCOMbZeVkkgoyIrMjyDQzJoGI3BGVeGOjsFLLhGuAFNhMJZt/K9E1 joc4PoAe1Dhp
pXwGaivZFMUfDKCfZhgdqxHTo0CyEmby0gE5jiqDkfxcJaeVYhRxdZxxk9x5 A0iW0iTZEgks
A+wNo3+fJl+3hxZIGCDMm8NHxzMOCpdR4oOR/PC3PnVIuxFqec1c+g8lf523 l6T5OOlurvzV
aQ4mviYd08i4XAgTZGwe0mmgNI78e7ii1xJ344FxpC4QJvV54p2CUFTnKvWp hCE9gQtFFU9C
DVJ8nstO4JmAAcTwBUP6T4MZ6jaKXc0Jh3IwrkHNMq/Flsr+io7GigwzDZqJ CHzRwPdVwRjk
aeVIbS54n7WgQ9vONTqNEKVr5ho72a4RvzleYpLpdk42F1LVaQ4ofd2E2Uih CntpvLD1xiY+
A2gtvdRQyTBNJ5GIIrXQkVmBYBkxyYB74KlLSxIpcJMIC2DpJVErORysNVN3 mACxWg7HhbmT
CtRnCpcuGmbcgoWwRlnH3mnW3QrkeRgAJTr2bdUcSLGtWT2AORnLi7TIfSrJ TfEAzaF4BbPX
0ArrLExo74JokMinS5mId1gB8uSPGmqh+NYSchIZtu+vxoAl25/EsdMIOXqy Y3MbwObOTk8W
i1Xd48dnU1k7m2uOHL0JGfMkTAXcKVpqfh5ar7CkOdhKQAYhuZE8L5pa4RC/ 2Tgmmj0gq0tz
qxB30YtsORZKd3YyHNjCKJuU9msBm1ocFyhAeLYjLNWOLOh/Bncyy6jwFpAr VAdNIrVq2uVc
0y6zViySU0iTCOwaT+y2u6I6jfCmO1ayCazk+PR0scR03DvdXFbSHKn6G4Ug ySHfIP4mt844
TV1KAiktBIei+B3/4qGIBRRTJJBGFCmUH1hnOorrIJgLabFFY41yIK2mVsp8 zOJveAtM4gvq
QXvzdR/uzRjGwHsyyQs3YKUPMSzyGrVFw6bVwj+F1qf6XSJWt5qrIkqwZIQh fG4fNdhnYiGj
qaXv7i4NhlRHXewP2u/TdVAw/pJKprTIGqdRKEzTBwTdk/fQklcx82GJmvA6 KtqHkkkDnnJs
tTChqFc+r5xTELcjnw0v5toUpYP6J/XUXbg4TzfBdE7YA67JhGNHxRy3dL1F 26F0Fm0TLeCb
4fwPM5o5M4nDHKVT8XYwsJKlUK9+BWZgeS7WKILFk74M9pp98CFaUcAKOZrY SmPwdqI91InO
hyUnFqGiJkMJhSXU38UzEW3RJKpBj6MpCvRZTQwcM/czWAnzCDNoqFg/b9HW mvoajICr2Y43
2OmqcQbGREQYkXiH6P2Fi4BNnRdnKibFETYrfha+c2rErfs8iHRxbB3OhW8R S+Hr5UtituCX
yACKen0E8o1dsM/lk89zaqf8IrhRu0NsuVvik8TNKk4MzzV6S6RyMeMmI7Eu 6OrrvEk4K5Mp
B8/4By093/IdtBFwe7eDbsIO2m6fdhbHcZ21Nzd/aac5cnv55nkNugVOuzqH 5hn/TdLnEI7v
xYX6TAE+q0IV7I+i5HKYq9Ft5BKXgyNSyN56L3GnEWB6R9WbQNUnZ4tV7F67 u7kwy05zqPVc
GpQGB/nOQKKHZhYCTRmojqQ83Nu7dsHZdc2i+kKsTmCY5A4fFx4EIhgQBYPN h2OGkOwgz9yg
FRE9VNjyfRYRDpVT/hllkGvq8/DtD0FJfd3Fcqr04AyfztMx19Yhm5nJ1+IE I1ShhyhlXibj
mokArcIiO0leVolCFzRoOokZz0WEphqRioPnlvJYBYCTRi8lwA3VS+Mu5EQb Gogkz6g5zKN3
W0cVYkdmzWdPeY9v1Yt1bKvMQxHBdNqyBwN07YyNBNiVnA4aQ8fyRecooqx3 CKz7nJIiXXa2
DMhz0nlcuBPzxHedVlkH3ElkOeBJ1FMYr6vZ5pnCAIh9y+eR3rIqcasQKa1w 4RK62sWfZPzS
RYUIkNYvnmoNnFvarfM6vQ4/uLGGFb62Otkf00IrxbBilmB4Ly785wGT81vR wKhOYRbqczPQ
AuZG32Z7w1JcaDKzPu4HlCI5eMQ6bL6eEMHISm37TtYoYGC3k23CTobUvudL Uvt2NtjE0zxi
oErkJ2iiOGpg6MmsnMEjMX8SozcpyVq+IpXu3XyTlgO0mvBbEop3oB/lfClZ mOReelhp8EUz
WWmKJ2UiYO5fZFvCdha5lCq3Rg9EzBFfuPfWq/a1pUQx1WUC05APhQ7C0lb7 iWSCSkYslLsk
NMFMKis0rNGQ1QvTFFcoPluqehV9EI/fBTFd3F+c/064aVz54/5sb89dXQSf kdtswmGGlvz1
NSalUF8bX2JQFbaCQ1+vZ9634m2UEG+dCB9I+eXBDMMQ41x3f7blbLVRDMeO rW4CWz3unS02
nPc6m5viodM8+kMM58Lnluv+zmYntlZeJ8QkQhOosEoBnoGNjm7pL/PGOyMY yT4wi+Km4/M0
+OtyHDyDCTjddkteo5iPHUlvAkkDHLQYGX7c3dzw6k7zaJEbuG6uzWgZMlzo mapsaBP+yfED
yh5xNEqkYqu7I5pQAcRQH6EY8mTTmec5DXkAEAluMISgdRhcEodM/YzCCfHc ieqYNnj//8DI
1ygU5HRH8BtA8L3j9rJ8Co/XjOrbp/+3jKB5iMjb4CcY73AgfLwsgVNplRuI TSUbyD59rfnT
qIWEqGE2UvsHSdRo4pFkCNa8k1k6KEPhHbT40TxW5bM1omz0fV8CDSR1Hr4Y s5EAYqgGK1Sc
q7NwJiemDyVx4ROG98CS6H0lMufDwIqFRzScn+OhncEIaXDFeBIRv02lx4XN ONcpuw1XhGhP
NeSaXl03E5iAuuOEB3hdy2jkOU1vbINJpyY0RlYdRCIq6p/0b3P8Ym2L+5G4 eU0+kY+OI3Yp
rUK0HKJgSw7zx7wqOBzVe8wATGr51oexdxrFaKyZff6hYjS6ne7ZYrEHWXg3 NyKu2zxK4zfn
c3RohWgJz2MUmqAx1FnpyP1G0tEiwso6rlWmykQKK3ysEoPkrQpUWOGS62wy HsTjMDc1mEeq
E8NUHfxOptC3mpxG/Q8uAZXnpluPGuw2irNYM+XvBKdmPKPdWcwyzo43N86i 2zzO4qcYFow0
TZYij0X6EKnoM3xaoHWBY0loJ8Ll0VkxiCRW4YFOjiDYobp28oSQs+IInTgg jlIX8TqeAPcm
/rH36uiTdN71gQVON6sTas40BsEBJ8ppBm3JhStZsyQgzGq3g3weufWRLAiV eLHpIvDzUVtv
nJ90ptvoJQy4eS3NoGAGRjVwj0sBWEYTyi3olw2JcBP9MYM4R6QfPMoAJP7i WqU4ppg3WrBL
V2xiMWqJSqNUBnFRIdqDrc/Z2W0Uh3G2Xjb4hxKAjk/aSyy5Gxyk2m0eTQHH djN+Jq6xInLI
XfyVcLCxER0lIknCYAufV0qBxx+FEt5KaIPPG+I9QfVRI+RZcexoX1gNc2qW 1NwySeXJZsnP
fIst1eYoE2WCyGbhEKQKmlB8hHjipULPN0QkUjyB4x6oiu4wvFsl/JYLGQja jR3WIksZ6fFT
JnFg6kn0OYg9/9MouVRUMkEcxw1QbXqgvuiy+2+TJMr+HUG+/pyXL1DmSkVK YNpMqGlFDcbt
4B7s9lUkB8XgQTWVbHufeI0y50k4igj5t5L5lbIp+fX25zPrNgoi2fHBp+OD 7dMlKYjb7fbR
BnPC5sEg14ZGFMK1moAENDkIJRiG4avSpsINSJ3Ej5tewqE/WxnSYRC5w5uY m1SSkAszkhAE
o+mFlaEOhxGuW5I/Kal6hhd+nflFEk8Hak5TkBVeYPJ0DfaQgBHJ+uEEMhdw wUpTVoEawBgA
nZJ8K4lLKYKEA+QrenYMrHMV6o12L01kIhLrvhuuDg+jQHViuZKDFRgSUEj2 qPt5XNBrQvPE
lT8fMUzeXgWIoBVGXUi0QTkT4rHteVW7jWD8Ox72hDxsGW63fdQ939wzpbrN 0fjXJCqofEtV
U3f2itifnXqXMCs5tcZU5RqbUNwrRT+rgr08Nhel3XFMtyRTYYRlRtO08MJK ptFjFTz7mSJi
PtPjFXz4/xe+SrFSMov4HxpZxKiBCXNF1sIWTW+pSHg60MC1DvZjvYkdemFJ FNGhIjB9RyWm
n6VzlBZ7vIT8z0KhfHYs6Zt2Bl/+bLSbxJDlU86LpLtDkSk1ca/CG6qurmHF Q0cyWT5rvYi4
gwFmkJK0Rwv3yfPsrFZ9uHdvkSTkSaQ4ssN6szngwReSaUtC82YNCT+gXhFc Z4/QqeyXh8G1
c2TkNGbKDHgBnnx7/rCtMp/LrKDnJRJTZl0eCHbYLcmQ7H2mS3XkNZ3AM8d9 cYWd6s/NDvOE
qXsvc1DG+I2t0BIYLgvo803wAtHWA3qUVFWYpPvoIrcq5AaG8SFq6RetWfdn JWwZPiPfZGnT
2RDEQrZpyPv46/MA55I0GDc0w7eeGanIaxjyeG0eCvWM6/Q2GUDa5pYpvPWk ID4fcRmJ5UK3
+X3ROfz6bfuhi91GgS27fe7p9rnzo8U2i+PjzuZmgOg2D0/5BIDushSGSsFE yGp0M7oVgWPM
B6TUVCukWWffIz/IYt1MNOZV6irIO1iUm8bI8mZq+SBREyZ+CqPVXVHiCX4X OLHGWsybUIh/
ZWAC6hKgah5KG/7QxC8zkRP8LGP0wefhcWeM1LHAWy8TNwod2PGKp+MVx90l SbG67c1Fqnab
4/9h2PtkVXBawjEu4yBzJUVkBAnOR1k5Sq7lA5uA/PBbHRia7G+Skm34E4hA 36LT1mdlG/TH
swI8dOVErh6kQJioQ1ftkNuOeus2Qq7vqPrpqPrsaLELtrfRLtgV8OcVMYVG Ulo2Mdn5TJi1
0J777f/eiZ9favcqgx1lh1XlTIJLnS76DJVguJLIeAg9wkqs4I/P925m8pIw qQqaqTS7KjRz
TNNhZX4LIucj0QjYOXOaeBWu9+lMngonSp1VUB8b0S3U+l/mLqmV838M1AUS 8em1r+4g5r+Y
CblrnDtaVUR52xfUNCh5geFvPStqhLjfsaKnY0Xt8yW8qN0+32QXanPk/HVF iIS9Lz3GUHjR
QxAZ+YJylzkzHG1JIEGxnWmSTHoUaDf54gxZ0FioQjwzE0I5nuMuFQtVCzTF d7j/hUYxMZup
jYMZc5iD0xlYaoyHOjIkGsf5EOhBFSBHLeiMXHIeOfh9zu4veFTYkcTQo2eu XoizFT+Gkr1T
Ys9j40s6fjPKIPsgbKAE8J+/LBzSOXr/i/ctk0uLgQoNY/AqkZEHyjumJcxW ErWjjJ4Ij/7L
C5pdGT31jydpNcW+UxDc+BccOdasXQhVL31egKiuK6liOSPRDVGhOnFCMjFm ARuzRU14OtHo
9zo/c43mVTucggNd3nbOQVGQG4ujV4DTpcsN4LIEmEzRMvf5eO1kid18BLdV ZlTNq4S5G+L9
XLcfJnPKPRAoUltkzf6pxsYT81UT5NCoORFlpSYJecf3IC/6Maid0VkFXY94 5ws/hdyBgvyw
lWZcD2V80rtD7kz7/ZLf2b43moWAVRJyzcNF8O1VYKChO5ATe40gBlQyiOSk IJ+iQc4ycKZj
UI2kM0BXsDBMdoC1QEvudOGJVWh31Tk66iuaEPviENNGO2n9YR8wm7b48VK8 oKul30+O9efK
w/Q4ZhNmZAS2VOMC0kwOIPMBrDJ1WGdp0xujb4X0bK4JzQYahgtDoTuaVA83 4GcZ0uXft/Kt
0rjAaddg2wI+NntRj0u9mPJ1kfB09o0QLuwRRE3VKcxbXDu9j/75ybBqwq05 yaFMf23PkCDi
OrMEmhKOVXEiWlnqBBWTtNAUmBlRaOpn9JnvnNH6531+NQrrMmqfwSQy80U6 m8XYTWs9q5QS
SvZJvzuF31LAEzQtx8QMEVIOSF1auENUhb5ZKpDJtos/jeKPduLPE4o/C2Wf DVbCmgcKXQ4Y
QmO8YrNY6ql4NQi7LGr3YaoALmx5qQAPPCZC8wgk8CjJTlGfAC+1hBXC7Cdj YnK5VpDLrlOo
56b0WXslycxAvXGps+hmAjRgo9y+/QEFeKlWfUSnchmAnSATRK7yvtp+JPhR fIODDK1QOCq4
E+AvbTytiqvFeISiZYad/3dIXr5rnyy5osh8nuNWfrX6NDxnP1IRyXNu3Zz/ Qa5l6A5EUhjp
XUsQc4NSIXo45XYmPiivRQE8A8pOYCifBXlCvyR2vnsnyXAqDtSNpXGf6mZ0 PBWesa33VDUK
L9pxxx137DWPK6LBpkhB5MvjBOaE7Fn1UFhWy5+d5Ritczg5CXVqRclwxq20 Trb7GtQvqcGU
jVWCHBvQH/iAnDFKMpHV0Fz1OongdT/bTEAVQcrXCW6K2fP13akwooHygh56 n2gNtUD048Hb
Tq9SKzhz9krwUzYiDA3TMAa/Fl1X69TBhf5UCOHl7uVbzh5t7AkM8x5xjBYM dTGC4aZTsC1R
D7XdO6PytM9UQ1FzkkoqZH8ABGfXMWSV4Gu0QE4UruQpC2cHPec5pPFPz010 QjGoWWAlqpoO
Kxm11rrdPiai+cTHV3jV1/gYs7KPaag/Ere1iXIi7B3Dh31Q4j2DciyI4I+Q r3HBNdAs9dxM
uTwZgzFoIRBog8x1mdtYc+LPwTx0K5YaMJVV5C3nhDesNIWu6tO+zbJt3w56 jWLOdtvBbjvo
NQ8aQ0R8lZCygX0wL1RGhf8AIpokMPTnEU5FBlNrnLdjHYLzgCArRBPtIASq 5S5PY3ADZu2C
BfCt3AkGDwJftRG4sNEafnZFVlvXiAJivBHuVEg2j9qM0FJHCWpEr2v7gXMm 6BhcYkphHzHM
BB+Gw0zzd46EyYrQmWbO2sHtAEtOOyVP6vCb19ZzlkZhXOc7zrLjLM0juCBm vME6Njv2a0gP
Y0mm4FGZCG+Sc9yFAOVgGuOP6uOhoXjGUxfkFAGrR2wpU+CxhKpMA2nqhTF3 sqh7I8v1gAvt
YPDMJoLzrGGQqMrFuTNpH1CaEm8Ah+7zQ58p0MlT+o6PlVD/J57hbnaXuuO2 zAWzHjo937XV
khQjqSi3Zka9xzdNrvnO6CtjEIH3KkS18u3NmbncJqd1ZvKcqr2JpagaKMX3 QccMbJSVVCi2
Up00yQ6LNrPx9h9s3WsUhbVjYzs21msefvVJTtBbzMU8kssnCAUFv/Ui0Ix8 pTSth8qIw2vW
5SFOEnfoc1EhsSJRvSpseK17Hu4Jec/qoLXqSY6SFC7v0Kike8Vc0J7ZLyXo dSAZhjQ7ES1t
0nSUEI9Ru0lcnXVs7C39LBLf5SP6PRvNS1FuoyoztXX5YqGlpTykek65rUIh Ip9vRFRcz9bV
nTen51pJu5Q7TKnW5ZRuzd00mfjTpO/w6JCeZQnWlaPTaAyuEp9jKW6r2ZUD iOzogTtH+uf0
eYHxsCBkU5gqtx5x0msU5rVjkjsm2VspvssFhywxKqaSP2wusQgJ3+HN7hj5 qfmCLuh/gKJo
JX2Gnhwg5i09X5oyYnqoUaFj4AkcCEAVvlE0FWRFzboIOCiciRF0z7TUors6 K9OgPkgV5jEX
XfqFcTYulGsm8ckUdQtKgBwzFfd/ObYDFutn5RgmPoF0UA6FMlsFWDl3eJ2y xDEncCcvzBHd
XwrjFV6mqaYHgkuRk7tYMQdZnWiNV9QKpo6RukYMiHN1y8nMeTDte7J96TfS bnuzn3I9e1hJ
mXhtOLQDNUZeu7Jy9BUrdKeARxoIG0txyNUwyaoqr0uy9xHt2uqgMu46HAEK VLIm9kThzukI
a672yyk8bKrJi4lVb47NQPPFDZnegOL+/7J3NT1yG0n2LmD/A90XzwClhlpS f8mADNnyzAqw
NVpL9mFv2SS7lAsWWcuPWqx+rY86+A/sbePFi2AWW55uGpAXXV4Cg3GrKpnM JCsjIyPeexEQ
NNZ6BQjTOpLEBemGaqiCDgakq23EpRy07Fd6Sc3H2uPXl9xhAhzRMZgUuHx8 knJPkMY8FODE
4E/O+6828qObmlvZRx6fPNy2D4PsYp0ILx3/x3atl42ND3P/mEWf+oP3j0X5 6s+988znXL0z
dFrQ6rZ188XtG9APmtJykxuKRvFFsEbsoZnYCFn+TjTV5ARQQfKXBgSp+dRS YgVGys2jNGE0
oG480YRQY6uFCm662NK+kYhj6ckuGNZSE/P01R3PmL1AbRsTaVhhDOmskDH1 X8QPe/0jrV6X
hlRwulbFxE+TTRQ+kV2PNLn10Oymj2BlHrHpKhx8pHMWoesPtl6L93sINmg+ l+t7sz960L0r
3olj6EggL7z4llO5yx0OnLrmFOTSxj031uHAWeVAQ1gdnFPlU7mUOnrR4oT4 iFlbaUCTkhzE
SG/xzyDF+XQWm2tZ0suSfjqfyHU9NC1D8zNPtj/7akpHpR5dlCagXYHlTVpC McjiZBo1HZSo
rhnrqQ4mQNJMqx66UuTTWUSnZZUuq/TpfIYTIAN3BJxcXTZFKJi610LuN3Vv JXoRQw3uCXUb
Q2/gtT1o7KRieCohjKEc+AqdhcVfVuiyQp/Ox+LLpjaffCiur6LqCQUqTeVp qB3c58D3pFL/
s2WAuiEl0hCu650wKBBKrGQs+l2TW5Y8UJjUWUDbATV+5cbSUwGHm98iqaRR 1paQIeoEfoVz
MTd403HqBcdJ4rRxoEvriKKpfgQHz6uXg/y3EDNkX5rbi14fEX+txScQeJT4 7+4fdFDsR8wU
AztSYZfVaiWNcsSVI+bY7cvGYOwynnc/fXH04GiES27RSyoCy7iEo1jluf7w 4u//+PooO3r7
q/wfQxOYhGMzMflNBJcL4ZIRkitX/KQyV0SoSqh4aCjJtYkOcYXOWhuiREBU d0KznD+8emE9
y912pAawiz7I3Mk0wHtC5nUzStQ2B+8DzcLzLxZ2sbCn8/H8r0sh0syBbnq2 JFNNffmfBgsk
jjAQAZkKoiq4fr/9VYvTjcI0mRtbR8YGwwYtO8MmqDMFOlAUewvaa6xIwE3G mSqr1OIu2NiD
sR+V9joAQboiUoKWUxFdkqX6W9OSSgUOEQEEtP254jCdpXV8nNUjREzu7ggD z9IRCgaYBMCb
ClgQm4ReAPIHdqHDoLVi+oZqekxOci7OZD7O3gAgxiuxx1SKNC/iflYqFNxF MNK6RBMILNp8
K8IM5K7f1X0iXCsNHfqE6xLdwlWVCxLgYfKeqsYVArX3FlsHs3VgEq+RRj2C Me2VnCHB7gF7
2lFCj93AeDAJaWgJqIoR90rW+n47RquJ6UeaLW7gDtv+fBXk47q8qc+JDZgg F4qSEA8DrcSO
mVKVL9PwleEyWvnIQ+jI0fYUFv+yaWXUiICBja1OfKiDYX+lSTv58e7ilf7U se9rdjFF27tB
cXmyt1DzUH+B8n5+9rJYhedaB/QHx3+DY0L2rbLqrzVvWvP3gxwnN/YmE5MT a4oiyDBleQbX
E5DctvRPzU/cQAmEYYpoKQzP2I40GOm71Qeqhd5l1qK9gFevbxWvkUXF5F7S JuVHd1G5FPgR
6wB3BAVh+Pi5I94I4HQeRp15V1HVB6TQ7KanOXA4k0zEnBL81JT6iOSr06iH q9BPGOr2AxuA
1pY3SgYR/TCK26S7dBG3H9oYOO/xln+RLmgR4B/q07GUePwrmeRjDX+bK5K2 OyUA/bOVI3/Z
ye0VfsOlt+nKvRuHddyZo8h3WmLqq+w1AF6TJ4RFg3tjyYxPE+B33jUkDlOp S0kT22JhusFM
L36bQDsEkM01A3/jHZRGrJd5+8RSLQBGj0Gx6n85RneMJRFZ0UJ8FNT9Z3uo NPxwaTwiV0XP
hYc3iMHBNsmCmygElQUvYy03Qtj29X7kp/EQOrQOr7rS1FxQB7qVu9fU/CAA TS2lr8fqkz4S
/ycO/X5tgnLlBQTkrxE4u1/PD/cZKfttowAGM8B7tW9wlheDD67Sdew1SE77 bo4/O+0cWjt9
G6NaItF87WjTxfhVYmb5C5aNJhq9ABF42ew0O8cR8ucur4K/h1+ymjocyPPp 5sNnfuPG+nPX
yCA+l8XSf/JTBHPBSAtGZUsSkUNtGcaqsVyf1iRs2pE+xwGO1vrL4KtkSwET asE24y6Vh0If
Ldan51XxYzv40jans9hWi7O+OOun89lW34grKyZ8TjCkjTd8Lpp1OJuD7qsu Guf+bQPwFIC3
V4NWEOW2RmI8zO4kkCJINdgj8zxwcIdgjFyjtatgz/bknX5zAy2iYQz0WOAo 4z0FySj2wZFp
fZB+LKSi/mrpPlKhThnuSRwDbn1j4nDsrIcp6EvHFXIMDh7eJ2zfCdl3DF4E iZ3AB+KM3BWe
SnDT5Ul048q1b8OOGuuOkSBujmDnxkpoaJzKsYXco+F5NbaVvix9gyyiY6wV iQHoc4NaqtoX
KwqxOhDR1WxDsSfFj/QEmCAJLF94+76VlqjzMzhvBHZZHs2UuPKfoZJOAzaU ETd+Ve4wt3X8
xaV5HJ5SBH03nxwSnaWcHf3cVIaVHsUi3lOpEA9QG+vhBKMka/vDBwqlB4W6 2N3DkTwc30rl
+ZNGfIU9VTf7EtGtzHTsY/rmI37D4LbIP3FVGmaJcL08NCt45OHCXB7OwVOC Txfi3rJJzduk
5hP3vH42gsnD3SoR06JiIXstj2dla22/o69MsirboVWD0+pxuTKCMGW8gFk2 ikaWG12mUhCz
TH1UrkG7Tk+2ONgUkWhmxAqmlBrf29Sqp49ZJzsvi32VQ+lbbkYRM5xnMaxg 5aydkcjxJBKe
nPM4PVzLL4Gx1pwAjSA+M+E89GhJfQ1sB9zrg0Gu84g7yrxQmqF1TfYkceA0 FOxr+eD6bUOn
kR+T4En8FD+KMLzEgpbYVg6+ytrpLH7fyaPF3C3mbj7B71X2DuG4GS55dzXk rg9plGSktxIN
A0scKn30aijg53X/8S3vBJeQVVpIpZAvxbUilQKtRpxClUDJsYfU5ie1Glj+ ZhfaCKe5KeJK
Oq0RB3VpypT0E8BylA9i6hXxyErcPCQn/wdgJzVnLqDZ61hDpQa4yhFZmYwJ XjgiryuNAdCB
FpA0IoV0Lc0QteKWqc9VJTNWphpGwUMoMKd6y1SdCF9igrCMHz7E6dhrFXoh /NqKlefvJx13
uR44Dj8UMYuyt9i9xe49P53P2XNKlOvj3old/q1Qep9ADPsMXMlpfelHyGrk /CmuQ8OV21B2
mnHx+MTH7MehKFL5LsNYIS7qCoGa1pgc8rdyg6ZWY0u5Bp8JrA0/DUrpalFs Ui3SrbxfdI4E
VsJXp2MknEJniiUVevHm1A+lXU64sE8GguvSeJBcizi2Hmf/6i5gU4kzSwgM YyCIy0qAurJq
lxMBrMw8W6v6M94uaep2YoULBCdWsMcyYwpBa/3xTuMhwJ3ke4Fc2F7NDql0 NrXJ2kmVTnBg
rCRozfO8zWvlAW3aYxzTEYVoVEGuqaNnRCy/CIcc+wGFpA8egH46ixG3mOfF PD8/nU9sS1Rp
nH/viBh/i4xYJL7NjsG8jIZprF0LK8YYJgsFHnviM5URZ7azG7YaU907fgv8 DFiu0nW3NK47
oOfYVLyKB/Hyq73TtgrdXAVPQ6+0TampObX2sXGDjyuj7gmFKqQDwPYm6XT3 UePC0b6d3KJZ
mb1c+bfQugitLMWvjx44Cs6xI3Apv34wFcNJsdju11X2ESHQ/Ziuo08+yoag mt6ew/Qp8zlP
q2jiOE9kA/p9+d3P3/HJyVwHllTQbg7e/M2i1C3mbzF/z0/nc+rgDt5RFw3O Fo6IaCoehiJX
mG5POtvH2Wt4JrZOuUqNyyuL0HPggWr8aRGjfK6cbw+9fOHpLGrcsjSXpfn8 dD43Tn35DruX
AnxiM+PYaElHhJj2L51kV9cVQWWymY63SPtyHkdJPHgC8hcLHmPS5rLEPAqa qLPTGE9r00wg
+qgKnEd8IMxv4oyGIelZUVa+VRyRPgbB4+D+DuR3VRY/qppTAb+F0TiMhYW5 a8bwOqTU5RqE
swBuRfpZ4PC4Wzz8kPwsWt9iYRYL8/x0Pq/vtYZkvsF6vN22vFIJ34ZiloRN AtJXIv/lC/oj
TjhDt28IEjqYRoI15JGaaxH48FCJd8GYCW7xIbpGulzUKUyQIam4kQB0rHE3 hkSA3yB6Rv/A
CUqOW3KXT/VDjSc01N6LaZZv+G1F1eWjIm5jvQbA9EjxJf79R8dDyjjlIAfa 4r5VBfJH2cwy
TJ8PBQXJo6oc9ijGzabzNoHYx0rTaI34/tXYPHR7wn4fGWWaYFQxQq0437Pb NPcUoyfSmVbT
FAywDeRt7CKPVzht0Y6ibsGz7OSxjEg6AJQW7yvy8W95TPMpsiSK6Lf4nSqr /49pmt5sqieF
N+AbDCw5nn+SUQDNDHlir2S21nQGUbvtOlip/xSYtE2rsDRG2wFQHBPy07Wt RRa2omgMhiXv
Vg7iK6+8q9iWsA56Ike5GH0DTCbL75lvwSab3izgo/JoJuqJYwhgraXGpA3c XuD2sUcqRMrL
0aRw5TZK89LgNzZnvsE0Q0c4bTQ307dAyPMXaafxNP/qVzzN8Ul5uIKtAdDV 6nfeoTwU/D51
xvjt5np2p/TammhTd9mz0gKXgsaPNfbTQ99QZ7Fwlw112VCfn86n4UKqilj/ WAtUE5yTO3E9
Xv1lXPTuUCfFVRSmiyV3EIXRsOJj7Ac9h6eCxVftoKr5PzQu6mgJG9jIoYiu KRgT5R4bDJY4
tgEmFIinSTOASYFoLY1502rlk6awCGb+nrica8vtYIx6MySbyhoxOhwIJGGt Gv6jEId82KkE
pdZx5G4eS7J5meavG6Iys9DFMWiA0OgvoDsRP+v5KpKYSS7w8bRMlMjgVcgr cRxSgoe9WgTx
BkWr7MK6VDawOAuhjV8cISxpBWM6POUHGvMIGmR1U9wlk8rIyF5ezkuifi0X arqogjth9WrW
+Fom5TUZy1xDw+PO0OFfSiWCjhrJ1i+QHvJHYN1uwjikgpCnko8T1IzQ6Y6u wCvWBxrFyg7+
hDSL9Htyshj0//cG/Ww+6/dbA7VfI/Hebe6w5m/7Mtc4ia7fWMtfzU7XOERV a01aKJ+yx58Z
itvCVoi9HhrqlXGt06Kth1gQebhvr15zDWvrItrapQRrp0JmQD3CEII5hiJU RoyKlAI4dCT2
2Sy60LLMl2X+/Gw+XwiaYOoRsdRQDzdqDnnoY4Ip8xDoOBuF5wCAHPvAoz4P aa7v6fDGdFtQ
ollOLw0Bf8GS8Hj5bynYAAfHyTAdmDnwHOQf/qH3gIM82YowEXBN0ArGqAg4 e6u89iAYkms6
kqO5yl6XOARTnqkYSmP17OsFwKeLMHcjEhrVV1sFOR4/ePgws6SycXHwpLyO utyhE1kTbaSQ
JmpWR+m3QrBn/5r9GAvrfONL8sS/8OoNhIKSbYXBJ2HVG5qz7Tj6Dm16LShf 4z96xQCAT7mV
U7lUmt6nOpMF5uX3Khzo6euOpPFEp9kOlXq6BnD/xUk9RD1Zya2ucwjBhICl s5UzerNXebGK
G68yQbe7zGDgo3zgz+kvnT5SAGH5IXuMfxUwqjWpnccs713a1XQVSSePXYNn oUQsE+heY3ip
MjdC7wIiohz6tvGfAlzXX7Mog+oJrDdHMxQjwgov+R1uCBcZqhH4t/TC92p4 KS2GWOpLRNlM
xUAdfLWvs1mkoWWrWraq52fzWUM/JWc0cz3uOzKDb9qGFJVYuVCIupgDTn3Y mtroJFdV3htB
j6uxKKDqd09rg8KwlgqzQcgi4KDphE5Aj2Sn2UfnSyvBXWKsOOqXG7kx9wfM xgzJ165cYND6
WPMyxhkGLV+wVvuEzANw9n6nkRzUozM/ixf4jzeBM/wPMVTOuKUiiLTZlQa0 YqKz7FPR127Y
WIaSlteVzOxfXbRGcPgr9kjSFKIEOGyX7aFDG87mcYEWI7YYsbP5XKAXKKWH E29wLb9qTqXs
ulBQuIY4CUvyUoUDgpWhsOAeBLIaht/c4U4JNBRQNScZForV++UqFnjO34sF EJc+0rRqRDLx
dzDkpItoUgD0+adEoveIhg7tnjDWWNHwWSrwpY4SngMbwyOTPplTBca9lL9d axAjB8ExgavE
jiJRuc/WSX4XjGfIJcZIDzDW2AEoI9RJAmxdCxhdzWYXKaUit2BdHPjzbxpU arWrGsztdenK
i/hYrXESrELcmFDzytw3Zasnz5y6LDCStTwqxh1rr5agB40tck/SyPNXeEV6 6pmOnmY+uZ4u
ZRafZXAx15jF0FZkrVsJNsm3gjxAV/RFob+XHIYcood5HJnxSbUBjrSkEqtK JaCiYU/0+p+H
RlkNAMtoZg7vT5x5Y4lWaeqxxhnMMPsBgF4Er1XTwEM4mziqJvTNlgeilxIJ 2mng+k+wecwj
VC2bx7J5nM0nVAG0JqsVKBKWfpWb1ncBWG5KULPeFeKlVEhR//BFL6m3a1jd Vr7qOsVd/N0c
2MYlHMvMOT/kfNcFnUSC4WFdNoMXsqY5hgc5lvbftkB8bCGmURZi1ZmRa6zN WxeZ7eD/eqHH
lRgQJTPpjSiqZ9sJLWRC18HmUOQDpoxlehWurxXWOtDan9Ei13tPTxGD/lCf ybwajErmxUzj
OKgORtIKWposmV6X0/FHnjGoHl5PUgPAHMzS7cqeKrWl/EnZP38Z2jCRvUa2 l3KswN+KK8SG
qqHjbhHyINP+Jqzrxl8UL5Wx4B844KCkEB6/HjbMo28FtYE3bZq/uGWuNScd eqGzTVJdVxH+
vBf8pEyu3CGafovgVTRVFwXDrP5E8MIhmLrRuNZ4eRi2/7OhfoxH+Z0qZ4Nq ozgLeHbqC6TI
0DUrGbVlCv/xUUDWU7hr6jUM0QeQTX5JltokSRfjwMTlNgcfYJlFCHt8sWwv y/YynxD2uiQV
H6v1rm3lB4AO4NHtR8vLZEoR5SBgMgVrEHKRSDyNIgx6WKtaiXw8tZWxHgOy PpyDX7GzOEzL
il1W7POz+RwmkAz2HcI3ssrurCSeU4OtCHTAIlCtN12drtd6AtAoShLNEbG9 61a6m8A/EQJM
6E8cXOVCFkBRHmKFNBFpUrkXO0QeSIkU2Vv9d1AB1e5KKxlhQC8EoekWAH5m XXMr77S54KjU
z1KqP16+F0YyR5BYgrI1yWZqpnw6MrhMnRxXGwUtFHEnN/6OiIIedgpZKCVq Vt6p6olPe4Xy
XdhX+q2avRAFHOotYMSItYbeQqxTyb9ukMl2HV4DE0leR8KSmjecuSpK5JY5 rLF531AypuSF
BuGSS9FneoIawIWfnMdu0zwbdWx/SUqLtUsswMffRfjqI/RslxpQaEq79hoS kCE3hUBGS3pp
LbeNeEKStmzgL5aWIFQMx0aD2fQle6oeyhlEGmKSVxi/g8f4QqSj8UXI25Kb wOWG95pVvENC
lRcaDcFjV/kX5Kel2Wtm9byEpmG4Xw6YIw4Djv8rIpLLYj3gZ6vyZKNd1gyR dPqYE6RPhRZU
ZH1zxU70xZWZNJLxEpvm1fnbgGxkV+6vOl10SW0CHcu/NvIxfySExgUuCl2w 44jljcj3lkqo
FQmvKwwxs+Q0v2cD7tr43guGKlgQjxE5cjkG/FRAtxvvA3BrRJXGaiLSCccm P10JEjXM4XIO
ZjhkQdb8cXtSII7ueNRBMHCJjK+OUn+RdWnywGuAgSAm+VOHO0cFXXpKNytb NjCtoZTs1SGF
K4r+y0EHAbQG6Qq5wXhz4NpdarvSh93JnyrwRn0OefiV6YZngJHKqw/tuF5D hUfpp5L3TGZD
0Q3nicb13t80qj46ypuqDLbrv3f4ys1q71punaxm3uZmZdV9486IIcSR9Qll WAfSjzyJdKzW
PpRw0TXX8eA9plnU0sVjWjym52e/i1o68Zj+hkV6V+HFDocVrjwEr8Jv9WGV KSrmJ4KB1fdv
x/ojG7W/mrZpA/jhG+ulLPAji6OujnJQZQu92XHXtIghMdxVwvTZztWqPD2s fyD8HFtyxS1g
HWH7MHIVCiYg570aCxZ9QNIFW5vGAxW3gy1d2uI61eVXayffrCsfK7y3cSTy oan4mEoleU6d
3AD6cB2+x+aOfd8RMB5foh1VVm4K3tiTnQojVaIDfC3hqDbKrI6mQTXwixQ+ CtndHUJZe0dK
hclDmDk8kzngyYgfE/173RVS0C5EhfzUqgYC4g+rKYxdaGt7aJrlwF4ju1pU n1HeMMprVXKT
St483mkrF+3swXYDEAU+WnzECCBV9pRqlWYQ8BAdSYC90qquJKfAOwr0lNg2 ZjI5NClTQxIK
sT/h5O1pSPcb+byP4CkOiss7wpXgTGFDhdNGCrRGVduSaaPEe6DelrGrrmLX rPFbwbUocTNm
IE3aGrtvIgtAIkEpGyj7YNQzPYFstvakf+uUA0AVXCXWC0Ef9kLolZQCiZMf EdBqV7HQwacH
0FapJFDceLUYxQf+uL/38o4jLFn6jJxxlcgrgMXhPKA350lJ2/MVuc4X/8Uw eLhhEwJfXgau
33vkJA1yEsff20q3f/lRiidaxUPf12cRupd9fdnXn5/NJ3T/jV7vrMIHHzOs 3XYEQoBELduw
nepzK1108P7zLJ7nss4+4zp7enp660p7fHlyfn8X23yy554mexs1u9fupQsO c7XMItEtq+Vz
rpaLu1bLxem9XS3nv4NJV/13d9cJk/FrOuRov0qbUR94zEE1LxUjUSqN180B jqFpWrQfnWEJ
0csBCxC3K9nonGuAOOXhe4/ns1hwyzr9jOv0UL3H8/ksOCyheUsU58gN6fdt 6ekcLlxWHJEg
BoMsONvJWyfbiLz8nQSGZdmirOCXXMue59GFjg61GK48bauSJb3VMWkCkczg dmGF4zlw/Mh3
IN6UULoYIlGziPUERWe5NYGqkB7o29JzeAQLq6wOUgiEPpUE8ZoYTuOEW5Du EZzg0E02JXq9
wNBqaP9FddXU0s3Nc3KUqXoCiYrTwPhuEKeI3lWO5qHS03LjBUr58Biq19kd unt+Po8j9Xgx
ZIshm8+ResVlo6v0bqNGAB59inJS7DfETP7cyojDldXYRm4LmccH3/6zIsLf SnOxbtLkB0Zr
YYhKgyV6oy6uY8UeqynoYAztidHbbMBconn1+GUHnJEd2jdat1qFBUxf/tBV PM7n0Y0We7DY
g/P5dKNX46qcYQlMf8cBQtTbi9OlWISxR+VBKuqiENT3alohG99hkRLRC/eH OaEUbv9U4OON
W58KC1wa7cJqz67g46pcA2GEtJPfT4ao2YgITBKMX6SpGaHyMVWT2O8tj5Tw YzYij10wuEQb
9XOknZhkFzeuATFqNFCcCzVih97sIxKDuLmnrY5hKMOGddLyNl4FIGng4rFO qvylHlayunSo
4GHKQ8lR82gT5aKbzXNUfe49ZTW+IOBAcjxaKdD94B3RG5AFRDYoVgm1Merw A9kl/5HuHbjO
Wky4tkxFUeTZECNSjaM6eGzB+Tx6zmJsF2N7Pp+e8z3XzhxT+x7oQZkwlrcc bKhaJgvyk5Pl
dNU9+N5tycrL+nZYtrlRLLCk9RKkr3FAxPqeMihYpXkrhgLrWywoXT+vwhv3 Omule3xkSrIt
OvPSa+a/7YiM4HlvBTNiRHjXucfw0F/TWgF8uQZ5z29CK35nkzLDYc0ZYyBl Z3RW31IAttJ6
vrBe5GB+ROK7HgD2446xle6q4LhIFinSjQFZ6Y7mEo92nMIIMj306m3ns9gg izVbrNnz8/ls
kLdAO91uytDEwdA7FZCykkBvZMVFlZD8ce8UST0LSu72ShR8Cdg1AUjSSP4k gZvSQgqvBe5m
lO7QltfSJAloD+I+6fFRtR5r8r+TwqQzt8cqRDyt6gGZnVQhWtnzNdh3/Vi+ O3RAsxy+cZgF
o3y62IbFNsznnbxt7lLeQYtR+GGlGSxEqhtzcr5GaDjHeQkGJGiSqv8TFFI9 nwVu+oNX28OT
T5fbp03fRXkcj8+fPHr46PThoyfZycnxU3ERbjT5E6/T84tHt67Up2dP7y9a 43w+5FlWWn13
oYs3ct5PsQHWIoByCIq4Hroax/ksKNSyKu/Dqnzy9PJ2VMjJ6T1GhcwHLL5C wTgArWdEC1Ji
lMIbYC6hGMm+2FLMBBS/hrCRBB6VZlkp5DvXNKuD1T0X7dLoqDyCOi0+mKyN LqOUs5n88JB4
LfeL1mWh8AGxGtbbFMQ0r7qBbPuHaPyDJNnatGjomh91CWUJ7ZyKsp1rS7g4 iHyn1S5x73GY
Bw9imQU2O13s0T2wR6ePbvfnn8jucn/t0XxMp3ze6dn351DNyhZ1LuzsYmYG ECHluenIvQ3p
3B1T/UwEBj6lUgDdotG+7VBbtBB5GYsLklLl1bdYcWqMQop1MQG8agvoDElD 1H0xFTkWjMhF
2vfom1bQJEpp/UJMaLRaxDz6I+9hcr5fHB22mbmYhZVbzMx9MDNnslRvPYw8 Or2/ZuZiPhj2
e9cajOVdFYK8oj+UY2RJm3C8X6+oWK+kA/FIw+ZJCrUvtU0VtTobMHGTsuVp AIeexryYhSE7
Wxb4PVjgJ48ub1/hZ2dP7+/B5mI+lvZFG0N9V+bgZZPn0TT6jrMbpEll59aK W2dhFwpnkP3o
tSejNh26QMGO7+N6OJ5CUAjD0FSr+CVR/lTW7VpZvXRb1A8hybmwUjKg3vJs lHEmOKVQ3AEY
DMtYulxdVo6t8ujCDZtQubpdpT6Hn4GuMG4kXpmm/MgsJWcmLZl3uFZsxgqz 7Kh/pyaOmWFg
4DrWGS6GkjcE+TnVuTx+4AOSblj1rB6do63ybikCDIitPKlt3BdDhE1d6SOG hAb6lH92pkML
WK6mX7z6cFbyg0y6Zv2Jb6NLkcjEIvM1sUD1rp6HTyJxQif5aLmDVtj0dA7H LUfS777M+tAW
UUdRWGUxTlL+oqTNvyPd9AuqJihbNigxvpCpkU4bivG9pFx0uGbOXR+W5LMJ KTrCgdTAN0dk
ME9KqOlRVW548KCXi1kIw2W3uA+7xcXpxa2bxemji/ubSLr4XXjlH0srV/Bd dR3v9AildUf5
MCsWNGpqeW45faTUi2R/taZuPgBGYvbwVV22/yVb0FgLoS0Zx2p3YlB8j8ii Eieiy48n+HMj
TxCBKrUTU3v6osurcpv9pQJVErvYpCSxvLAxU21qVm2pFuivxw84yzaqnPZU 9lRPp7CDKrWG
m1a/omPvpo0YXYd9yXZS0E3amLTU0ZPXwdEhtUGap8mFbez4vPBQ1OhK8zzy RIxHqlwUlY1A
5wcvpXoxCwq48Mk+n217+uR22/b47PLR/bVt8+GAso7f3bAHt5u3h+LYsCwY A/pvBfP3TGNS
/Iy6+w2jbVy8APWm7lcqBjPkWPidXCzfwIRRZhrlCUp2BXUyulYQEwLAGBde VSUQgVUiZXgd
cdzLLRqGANtACeaVf3wtxvVXjDCN96HM4SGGYaMKuI/8u1S1lsaw1mIbd3Ao xxGIAysWFeYJ
gUg+j/LhALWUfzL5lwFeYyKl077KXXYjPa9rNHp46LZqFpZnsVWfz1bdHvu/ uLy/dup3Af1Y
epFx+0YdsbyZkQKwZOGe55NEqcqOB+qGJ0dSPWKtEmBla3pIcuOYB9euV4mw 2EW4VeKHGL81
VzV75S+UxAgTBCzDPnhV6ItZwIRlQX++BX1x+uT2g9Xj88f3d1HPR+jZttxG 5sBuX8zTxgjq
WG341rN3a2rlbbAX19Rtk39QtK2NcmC6Au3bw0Zhy/Vf85BlpyxRyP3yRoSu 06rRjRuHvh1Y
HNSPK8f/sn/m8u79sCjHORUnvL5GSM82e4wxQsm1j3I1Z5YOU3VoGevDYVDL zzqlfMhzhIU+
HLzu08UscMFiUz6fTbkdRniPzzLzMYSvpKZxh6VqsQSJth+44NPlrNzZ48tl nXy2dXJyenm7
O32PkTQXvwPZV3mJKWagDn2hzEobLAvlMy6UJ09O7sDAntzjlTIfc/ZOxtF1 B79AZkWQlwXy
GRfI2eXZ7Wipx0/ub3rscj5a6q3HOzeHr7B5OYulvCyTz7hMTh49eXI75ujk 9On9XSe/A3Mk
yI6GOdU3Tdcd/FKZVyxuWSqfcancCrjAUrrHLtfl7wJctCiDKon+ufVPhKnk Z3/E9bcyE83/
lyhrVIXWC0BUYRMtNl+VXksWFZjWTYUcnADvAmF7LAQFFFtqFpCu/DIAFhgR 93sLJFlGJL7c
Qz75iWW5uh7V5GK6o0K71mtpZ8g5+X90h88RUyzRJ26HD9oo8wCQTf7aeSFf lksBzKJgLYdr
CF5aZFDl8eT26TF4Ia+hZV0ThBwLuQNTEoqe84oYmEhT4WnJAwBQrXGQIB/T oTOZLmdlJBdL
9Rkt1aFGGy/nq9ZxHSHJMK65co4SyfQKkAUVHoy/Vf8tagkYsJCIGiZjKbIs nqx41vQuyCQo
oW1kVwIpiqp4ZmpoaTQ98aaJam/yUEgbglEbF+9WJFakXtFLQbQGU5yLhieG pm3DxGsuANoV
jAKt1/q9V2d3dJukTgEdRtcqECzX4R/r98BFsMrNoUtgXs4ST1iMyb00Jo// b43JfBjW94G5
izsMSHAD4hu1VzwLyiq8YjqU6iXJLSGdqG1srReB5geGAfv81B5VgRWgBEMp N6nkv9cqbpRH
3iYwH2pWhSZt16wDbI+bAfx/O7Vz0p0YBuCqglmZWNf4sm5GV6jM1EZV+Iz6 2V/BWsmUCHy3
glwA/HP2CuhoxsKlgvQUnJiYQHSem+6m1/ui63XwpQX+t71r643jtsLvAfof JnmxDTiKZvbu
FAFsOXbUSoohuQ1aoA/cWUomMhou5qIg/rV9TID+gbz1fOeQmr0w3qGglRvU QBBryRmeGZ7h
4eF3brNezhifxM//pPh5YF2mv3fVG5OfmZw1gkdwdrTN7vNWw8KilmOL1z3c uk1csV9f8IOE
FOdrWdqcrgUIgiXOITa6wQ/vNo5LUDcb0dE4zqxKJh8mJDoFEcKYXDyP2yAW JBWDRr/l4CMJ
VHpKaSfa3EhtQwFfICjzd7+6Q553e6f7nXCs9Cb5mxYnRAXnzdYJuk5hszeS ohadIqs2tbPc
wiOV4s/FNaUyXFB7If4jJz6/sAQCKJGruA9hYTXCsq41ZhBKmMt9cSAXcdaK dsmJNGnuu/ih
23NwY27+8FKvl7vIJ6n3Sep9M+vvfnbOMMsOQXcqugyuLKX4USftZAV6x68u TTif0VhWNQ5r
EiMiLXWKG5TARiSFVD6TlcRN+rWLuD6RT78k7zhxhIyIsrW5xYWNLcsu3Q7D Oz7LjpdJiLk0
EKwswiT1jRE98XpTtErC8xzJZguSZRgC9BEw5O//HA71njCOrEUjcp81S4y+ AFnRHTFRRgKT
umPp53/6zM3lGmkt6iAnNK9WthIvA02JyErF24jsFrktZBKQT50r5xfXpvRV /QvZXlR1+7j0
shRIUBvO4qG5lLrXOEX6Q3DjBej9PZTG/Obkf3D9Xcgk/MEzjKWHvVJtfJKi /5dSVP684L+P
vnv+5u2352s/bgVsf4MX58ZooNWVxu5K7EeL+oqT7SJ1+HvvYAus63aIyNWX bq2+C51jSohV
FU/+2m95g5+X/IXiX3cPSR/5/viHgAj4d7VpIE1ufuUWmdVu9rZnsr9BhOCB U8MFKaKthtme
ZmG4PQvpdtNou2my3TTebpreaUb7o7fkK9ppx7FzOtjTnM4Cc3oYaEvvNDlx aBQ9OHbh2KkZ
7mlq0m7VdW2DwNcV+uLGgXuHgesmd5rX/sfsY2T+aQxBfWW5I9jBl76XWCKn snBWsdLrOoXE
YbYVuLXg8MJj5CeXjBagpK7Q+EbVrCG+cKkX5axc19FI/GhfvB0F+BPi2STQ Ng20BdZRtrmO
JBHmdtvsTt9A/0PHSa/kdcclrrrl6/OryuRt0bQV+GkFF0BGEE0/DZJQGtK4 i4Lj0+ql5Ls8
NYV6lpjVgP/juondRcd7YnqWBpi0ucglbdd2W+jeQaBtGGgbBdrGgba7CYOY aIVTFgbPVbEj
5PoEaBqSCdGVptRk5J/bOn8nC9kgT6G0KGML/CiQqoZL6Vr2ejih2MboxT7Z F983F50cObZV
qsM7zX9/D/gzbYQDO1fixQ2VHNUV5CsLTscITjWLddho6paA1HcaId4Lc3lp Ftg+neDW1EcX
3OjG5CaSEdM9MQLOp1uTHtJtB4G2YaBtFGgLaXYhGpPAdZvjSWKD7bZxYLxp oC3wkQ3v9pFl
/b3Hj0t8DbqWZAmw8Zl/9XZkckFMSHKi6kYcmsT+JokFPTgjYLvkNEUWAxL/ 3sOp0pxHDDlo
6MLcCvoNlyNdSRS0lhQ17dUVIKy8LTVDIO8AgAsE4y8WVFscESq9hnfjYhm5 ACIPclJSTrae
SwbCGGeyZZcthh6zrQFSLc1v/mHXnZj4slLDwlhYIEBqqWFMXLYV3tBy1i1J tgBdvmHEil91
bgrx+Xp5bP2byKMnyrQNPCvEr8wFeVt+MuMctiQR2FO6aGEYdTIuAJQeHkiV pJ4x3YM+vU22
toCRoZKhKrqSk8PdPoFe9bLyd0ueay35bkwh7h3AA6vKNrh/xbnDlIJQgRVI 7lMVMHLgms72
UquCaDvLJ95v3fsMRCo5/cwNEuXE586f7UkoTTcFgbjYbreFtIJZoG1TEIgj 4nbbppAT8/12
2yjQNr6TEImQIUXyyrS7SrYRxtkAvJU6RLJ6GJnGunHB0gtxLmKQtirM19Kq fIWxl6bORVRR
didTEhws9n5bLlx5hgT57oROnSMQu7Q+Yel7Xn4+lR1kFi8r5Es24o1Az2I4 Bcor1l1Vcsab
6mtoNnPTyNlEG6fdOMWW8+61JeoywTIpJSQLCAtFgk5LXkYp31Ypxt0VlCUx BOI6OEHcGKjK
t88jQyinQ8tSgpeVpHxuJEG0mwKXQ0KSLQJDXlQQqIRLvj9Ijssb68ujK4kG 98B9YZDhhSaU
3pA7uhxfQPErJfmyOElWo25dNKjjoDMHrte8M61Un1llGpwmbq+m+a+4Prpa 4ZOdzwtzBc8x
zkuJNzYNWLLONEk3KF4bX5S24ATVXzxNLGfkYclXk7yi/1uaS4CyyaILwcdd buLl+cRc2rmi
XBJZVy5+7ZF/EX9a+Ip1FVCfYq5cRdZ3incHU7jKoaoyVhhmSfbUYnadtxb/ R0lY5ZNaoq5e
03SJMec2z1XBMzk3VXxa3fRwTzJvuC3fKDYo0DYItA0DbaNA2zjQNgm0TQNt Abk6Ogy03Q2W
SvtHGtFB6FwtzWKHJHxLOxpwPdlDt5AUIyjMQfIWyZnWsZITb4hqXLImEnoo 5auKG/t57Aez
LwB6lAUmfxBoGwbaRoG2caBtEmi7Gyib9rcYYCuAIcUkr1uSZUbvqjziwY9L 3S4MdKPCNiLQ
dVlqSuYBJfFaqv6R3MeyJw0YmTe8RxnrquIVh7y1FZGEhLILOFvoHAp1Hn14 TveFuo8Ca3F8
GGhLA21ZoO2Olov+x+xjV+J6JyuPS8kmjC3qyogy3iB4QyIZOq/oxrBXdKVK WboyuD8QXRI3
pSS2xFOIAzP9KYvbDf0LykI0pgCrZZCc7cPq+tqUOA55xeZxpQvIEvUkQfYn pOVE8uIK0kUV
t++2kp74GSXIkx3mKUbMDe070FvwU3dp6+qa5Ep3u6/a/Sw5TgozrwxdbeU1 LI9TGTozgPxK
Ge+NAV6h7syz5O8a277GYUddG1j1/1YLEHSjS1xAJWuRJZpGJK0q+tPel/Fj 3Emrrm0UaBsH
2kJGpWmgLbB8JnfDANL+1juuO7wD4nu0vk/5uJ5TVZpcgH29MNxlknOL9EFS P53Ll7jSy/RB
FTrxhZihOFeSU0iOAN1ioXtftCTX4FfLn+WVEVcKcU3BCdZUpmlsdKXDdF/2 n0ka4FwWaAvZ
hIZ343CUNdEDAbzQzkif3ZkluIPl31iWBjyG06+BX0Dx4BiNyjY+26YqiIly inpdWV0WkIIK
Py9tLoDHxcGJrejkj+L+HgcWF5aiMJKUUqAHziZsJLkVnLaLaBggvXeTUAR7 +tszz9TP9scf
1Y4lCFndsHuQSc5UCemqaUka8TIF6FYawGKfdbzrhC61vZBqQAwr36X+V3rv ppaIyYwxYiLg
n7Mza7PTcPFaFQWrVPDzqUqavdXG5yVDafw5H5nG+2a5dj6NX9KFIvaUCETI qvgP9d7NGRFz
G2Ec1A4bEXTxHMBjsWOSScWtAW9cC27z2rSVwrK2MFe8QMS5rVVbsZXoSFWl uYGUevwC9Roq
tWxsVT9hrgAdLEF4ZZ6Tx0eqpmOQUWWunmCImpkv3HfXXjT8z+M3OHeh0AMu 7OpoSTiYK2ph
ky+elwg6+bYBHhpbvCq9d2tIBB/72/ZeGpc+uN5Zgxgm/EsjIJLIb19IXDQC 53Dq9d0lW/y1
O6nWqjCN8P0NyZxrlbN0Om1Jwj+eqxoTIVmWv4S+SHSMKsAP502gCgUkWiBi HzR9vPIRedD7
tVAXfwPkf3++WOARE9xdWFecnAa7XuIg3ViOGir+Q88Z0mzwhPGHqnsHnSN4 3//Ac7I5W7vs
PW+wL1eiApxYWk10SIGIAzCKM2nbsBlClYZWFS3h0ko5++R72BDODU0tr22s vpbL2eO78HYR
+I1Zao5W5bJ7x7siprs/ON5N96mgOHqn4kV6M0fYG9mt3e0vKwS0yqzDlou+ tUZd0Tpyp68b
EmWiCZxwvt/kW/rwGxG6pIH5Q95K4u9Hul66rQz2MJQSj14B2b0jSv1ZkvWH 6aRKo0sIdPBh
dkDB9aieaK+6+En9DLEBCbPGhBOEDl773UgWS6l+1CtrQJFalhzZAid2tiZA LUPoIv5ER4sq
RSIkVRWtRmT3jutEMKA/jHacnEFvvT2PFIqLg3xQAZa7yrXrMaU5OYKT/4i5 1YBlYaxceuQu
hWhqjGZN45ptlI0LAFNJqW5gLwAC4cuQXLQLqB1gii2NToq2vLLJKml3eolW pLN7hygiuNQf
Frigjb/qcSjB/AiCKXckjy8OXiEUBIW2nsgcAupxRuluZk2ZwxWA7hZtUr0X syB1IrrCGeA+
WzdiAYWi2RcwCggoR6MY5pxxXgndzYmW9Oe+fKqY1ldi7DotRmxLIm313Vbf vYMLEXyNAQP4
Hft5e5RO3ZPQItmxtVPfwXwFu6Mr77ZA0Z/GYjORCBwRjwhdIR4zBtBeid3i LWn2QLlXmSU9
c2WUX7iqMFx1TolV1gBMoL+7miCyfcGLMCEZ7Fd8N6IgsyuqJW7eBDboK7J5 Wykx1vkAG3h7
YH/o3psDG7uENkYC0XGoRpkziHjzNFE52TWBVpCM14iIynNZGzAhAimZtyI9 YNjBJIl/hZNY
vCxeQDmC1mCujI7Wij4i4pH1RzxOKMmHZmWeDhcoK7hTzHiHb5oiJ4Khe5JW U0lkG9uVLVxF
JFlQDv+dX5MaSLalcnhFm7dzCdSHP1JloB45tiV4Bk5U8LX4vCQtYE0urFLV QhJ+Nj7Qn6HN
SsUa3LKPCKBk/QGU7x+dtMVvO9QiC5lQ+foy36mflDF06rpkZN8bGsCVK6MQ U9wALnxsSnIt
gtbpS85izRVaQqXFb4KdBGSfoOUnnkHsSXCjuA6XbOG0HiV0WkQMZJTsHexO oUuD65KF8sHc
X4u3l13Coo+UWzQylN0apg+XCsJaiX6GmvxkXcj8U9tn/AWaypdIwy7GIeGu 3GZJQUEcnlex
Vb9uBKCIP9Z8RCQo648EvSSBBQQBpq7TnbURjlxKHix6qGgiVHkKLw27//zV VHOuoOb+4I+n
BrrU/NvXUBCfDU695qonvFXz38Cfv6jqxtQHfotx7jOFumrLzf3i+6XA0Red oUv5dvEkzPWC
2LYGkeAt5WtsJRrTVEgpUi8Nx/srw6areEXwI6JFWX+0CPs1LM8O/HypzcFO cY09VrOQ9nHA
4AQVsoCPVMcyZk6pWlIbr4yoFCSoNasTudGFNB21Swul7wxCAeai7kl4gBrm dOvS0nl/JnZT
gv8lyXAdy5gHhHLkh49m/OHoxF65v3zAakNlPCnHwJeH0y+B8aFBum6jNOUP eQrbqOK2o/sl
tDDo744929/Y2H42x05/b+w0cuzx+thSgWY42R6+64ukMAlRGI+3KXR9kRSm 2xQm2TRMQfpi
Kcz2TQEREVsUhqMwH6Qvkg+DdJvCLIPauUmh64uhQP8N905hvG8K2d5naXC4 VwopVSze7zuA
wiBAYTScbVPo+iIphL6lSRYWe9IXI/lAYRKQqukYzuJbJLrOSBrTAI3scBx8 Dd8Z+x6zEI3x
IEjDd0bSSA/DNCYfohEjn0AjDdAYDEfBj8p3Rn5V8OvZokGSNPgevjP2PdbW hs/tPAmKct8Z
JctBY311+PzRh8Fv13dGfrvp6AFojB+ARmgNjseTaZCG74yjkYXeY5KNgiLX d0bK3Gy2fxqD
0DqfDkZBfvjOKH6ktHc8AI3hA9AYPwCN7T2K+miP2KbRdcZonqAxDdDIZmlw //CdUftHGtyj
qEBKGjwh+c6YUxLRwPVbNIaHwYOG74w6aYDG2h7VFQsP7lG+M2qPIhrZA9AY BGnMhh+gMYuS
JURj/AA0QutjMhkGvyvfGftdhdbHdBzkh++M5Uc2eAAaowegsc4PX0osqF/5 zjj9Ku32qDUa
VEcmSMN3xtDI6AT1ADSyB6AxCNGYTYO6j++M0n2yoGwfjEZpUO76zii5m5G+ +wA0xiEas2Fw
P/edUft5FkQXBtPROLg+fGfU+iAaWYjGZPgBGpMoTA80BvdK4ysP3P75q3/8 cH5MeO7om/8C
UEsDBBQAAAAIAOVVmjunJ4sx6GEAAINTAgALAAAAbm8tb3B0cy54bWzsXVtz GzeWfo6r/B+Q
vMSukiiySeriaJRSZDujGcn2So5nd1+2wG6Qxm6zwaC7WbP6GfML8+jnfdu3 Pd8B+kKJFNsU
Y09nlUpZzcb9APhwrujjH/8+jcVc2VSb5E/f9Trd74RKQhPpZPKn786v3+4e Hg6Pdnvf/Xjy
9Mnxv/3t6vz9q6shPQtx/O7q7V9enb3nH/Tzg7Inw+M9/PFv3ussVicXUlzq FPWr4z33yqe/
VGl4crzHf/yr11rFEWfqUUr9150MwUKG4G6G/kKG/t0Mg4UMgyLDT9pQAv71 L07z7KOxb+RU
nVzK3BpxZpJIWhXH+nivluiz/83Y6L20E5WddI/3ar98+qskutRRFKuzj+cv kWXxRZXrJzXR
SUIzwe8Dzrj4rtbimcmT7DqTtmy19sbn+9fLi9c6Vh/cdKPGW298vguZZq/z OP5Jhv+Vz06C
bpeWQLAb9I/3biXdGTK391Jm6qR3eMSl+gtEqNLvFKXR3VOwSPXFLq9+uZ6p UI91yK+Dg353
tzvc7VIfb6fdLfJe03T1ep1BsJCbX5eLU0axThRq6DkS0P/BAOu1nrIke+Ap 1r2TPViWve+z
95jAiylLsg8W5mMxZUn2IWWnnnSp9mAx+/B29nJuivEe7gb7VZla8qqCQUWo 4ZKCd4ZfpvQr
ki0reIcQZcqgIt5gScE7JClThhUZlxX0GLdXB7nji7dnp+/P3765LjeKf+F/ 0xvalL3jvXJr
iiW4KApkPJOpFJGKxaWcGLErzvJQJ3IRJCnzL0meqgi72j+VKdfGZm9tRDVT m9UP37m9W71b
3ttg095eZ3mkzUa9Ddb2tvrpaH1M585lSXb82Izkp9M8Vpkpx7FR95cSu9an u/1rTOSyf1q8
/yiTzfq3lLxln9yjJ+vZn0+vTs/oTC9pW77ZjMDbJCqln/719OQvBpsCT+Xr 20c0vfrZyDjd
q37jkOJTGcWFLqa7fF1mvJT/aezJLrXvngqC3SbECso0ntprZZdsbmZ+XutJ rCUmvd7ZzgJr
1JCMS+b+M+nF/RTx93I2syqJdJrJNbTrbki6flPSLd8KTJyXmtgxGYZaZsaq 2xR7YzKVnpyZ
mNJeCGvS1IhUJpOccrq0zyJuf+UavaTX6gGLlEe4I26PZuurddCU5Oez+yhO 8Bn/4+0opkfF
WPpO2cigxH30f6Os2YjugwcvagzHkXd117e9vIdNaX2ahrGa3U9t2oMq0uAP XLfpxWuiqryf
4iTYRZst9eGDSe5GVRF99Qi2Tfj9xoQf21WLXEm3Uk6nTWBFbkTj/YfTmAZA FL7V2W3T86Ap
Pd/O9IoTrugizbmymY519tv9RJ1oGcdGmA0R4+DBpMVYKtIu9Hvb9D1sSt93 RJO1BD4jMEtD
ldzcwYYmhDt8MOG4k3XK1Tu0bdIdNSYdnf3qXoglJmfdTh/F+Uar8ejhREX3 Syz1Xd02MXvd
ptQ8teFHff+BpWje08zmN9ok2iO+oo6HVDJZQ2cofJJss52PQTyQ2Dy66uBa N5KtT0NjYYt6
mNzWqt6eB0lQanRx5v5DjUZW3dzIO8LF4gxcMas8MjlRUeZ/32wmlot0nzMT boB1HmLpYH6H
OWgs1v27up9PFmdaxXRI82Osp7JcQdeZnGBJ3T8Tpzc3ud3wFOw9XBqk4VWw 02AoW5+IxkLi
S7lKvK4d4jJP7mWZgayWLRWbkHu5fPg55MYgFrgO1+GtU7W5HJhma9b3lQ4N SVAlU39Noqu+
n8gftIk3Y5l7WxAFaUTVkl7V+61TvLE0+FLaaMVCRv9yEypbKWI34fF6Dxfu uJOi6s/vQLDG
UhztmVVix6WZxLqkVefpk2sZQtyndZeyvs0JqRtp2noPF9+45zsg4xQdVbVZ 3To5Gwtxlzr8
qOIVXMVpTSk4lnT8sqr6UtMQqBQ9z4lxU/Y36DBnVk+NCKUdmURqzniRTzaS SnoPl+f8sHaE
XDmEjale++316t5s9Obt+1d4801pSCreYHhnr968KvXu/GtxyprO2AVkrFje 3DWxi/IETEOr
OUN5sEy90rnaHNDPSJ9JC9YDE/8xm6GATbWQkYAeTcyUFSbLVKIIy8dyTojJ s+82k0iMncp4
ioVAz4mAqXw0UtTAmUqIg6a655qIrxMq7Hqx0QZczui/zbPQ0Awe7xVPC2uD 3vOf8iVJp+NY
hxkllI9l4tX71zCPn9Df/+jSf72OzcbHe8XraiESX5RM0vemsNQvvqhWk07y TPFyck9lyp+J
1YbWgv9Wkyf/G8sAfyoC1Ezblybi2u68K3PDXp+6xlLkXPi9mAtNV3ncr8Uc 1I8qA/+o9hn8
KHrorH9aTAnKlOBWSr9M6d9KGZQpg9roM5nlKVuL3FOZUro8nBx2D2oeELUx KFq01r0cHA4P
aSC1N9WK+CitDOl9Vbl/6zalfyrz7y0pcHxhQpnRVsKrb2j713/7LOeZmhbJ xbOrsI4FS4Ch
sWzyzhK/tcQex3vtnVUp7VFZooIz7PLeT3PCRrcznz5pyd4MGu3N3qZ7s7ts b3bX7U0YalZv
znoK+55UXizCe6fcybK4I4udPPwD7Ox89C42mSOZf64SG2z7wX537bYPDvvD 7Wz7Ki3YCBK+
wW9X2j00wIlv+NmzBu5pA/hoLFGzHToDF5cscfS4y1hokSdiihIoIPR0RhAg iQ3oPH1yG22I
m4jDHNyAmmgSeLV4VmrYCYPYkvGcHohXs2ZCJJnXMOpZxak8p7p/SSHLgdN3 7hO6LexEfzuQ
1WsnZv0RuJGHYtbRYLAWs4aH3cE/B2Z9EXhqrpqC9iadY+OvYnFMmuVT7UWe sYLIB1mvBLXO
0ydXehwrdk9eUBScES1AcH1zU4lEHrIYrZyw87wtUDNoBDVrJZf+KqjZ30h0 eYSa5lDTAE2C
YD2a9PqH/e2gyRYQ4zOhobEOlaABW8KaZJX2mh3t0plWEymk8D5vigQfZjlM GOYz3ve68/TJ
uYjotU6Iz5GJQTarQ2Wh8oAqJJQzbRVrQEKTUq2EMmkehipSSbSZF99XAIjh dgDikRX5J8aH
g6CBYqSPOIFt4IN4ILfx9SSkxqYHkpBempkJ1YZu+19hn+8/7vM//D7vdYPu 2o2+H/T3t73R
+58FArU6hxshxGZgUL4OHoIRje1psM4sw4cVhhmHJa1gGQ4eoaTdUPJQ7cWw gfai39/fkvai
CSIUPEPvM3iGz9z4jb11X9I6Sp1XVDtYg8PH/dzu/dxkyyJAet2W7W3LNiqa nf7722cNNgGC
35VfaOypTvs0hemV3VJ+zpW1K3iHC6ga4K2GjM4h61lImzxP5fMfRAp1Zqgj p7jk+wqEjAV1
eeaqhh9cpzXW3aNG2NR/xKYWY9NgsB6bgoPD7hfFps3gZ7ssR/PAjPPbO3w5 dFTZdCKmJsnk
JJFPn9A2nNOgvMGDsARufKXL5NMnP8fO+AGvLvh3mcSIqdQ7gt29jEhULFKV pEbMrJlZ72JL
dJpqePFPoXFVHIOLknI60pMcClaOfhXz3MQKIYvS+Y5BoerUtCFVJsWvuYyh YKUCBH0XajJR
BGvcRNlHDJsDkJ4+2UXn0zJBztVcsuJ2nmcGPpdz4s6cQci1ryLBnrWGM8yk zaDWBUEMV4Xe
JRKRTGzR3uXcVk9pUzEdCfLyRC8SL8nN3CzpHhMD5VOaBmolpU1BFIBxO801 GtU87MJ2BYec
qb9Fh9uGXR24riKqV3N1CZE2L7XaN2VWN3KZZVby7HJvk3yqrJobmlGaH6tx kIixxrSA0Elk
eJbRxYmmbUZTKeeuzVj8bCkD+8orNPAr9ZiOG+TV05G0oXT0AwFCwgHD3UB1 risz/b9iTP0x
gttNnBmOyGrReiiLKS4GTE3TPH0SKs3sVE7hUQBSyRe8RMbUix8p//en07x+ dQKta8rPTsqj
nBZd3BYvw1738az7w591vf3ucO1hd3QUbElF9xXOrF7jMwsWtxns7Xq+IqiQ j4GKnY00M7Ow
6RduzGyMM5n9zcNwCH73Waqw/ePiqCAooXbojZpTTQQj7qAh7Jrl/8O1wp3o netNafUfEdTA
uYirIZSEzS9PRJwnhNZzLScTdiS41v7M+E0A4hS7OeNoQNeozZ8cCFFTSeYG k0p/utDB4g9h
9pKGABBTpXyIOMZe0RliE/mDOxBhfOSDSydhnEdwwy5jCPgoiL+X/iKZuR5Z IGmCWyVM6jta
kRJOWRrO3VlOq4xNoFTdDlEICRjrFMuvPYbMXjMf7Uf0bDN6Hh0drQXP/W6/ 11rwbOziDTaJ
WKll94bxbi0DQwhCUhnnGfhtBhFKdWwqI0uncHMgJmzOXg6EVGZWlpauNFDV X0/kIJcQD5h1
neUzRPbVPKjOb7HlkEYKXnQ+h69n1hpMaeZbPviymNK9D1L+P6LC4OhwLSoE RwdbcgD/CqjQ
2HP7miSyS+IoVrBTvOMFcQRmOoPk77gKJ/3FItZTzRvdC+9OODQ7hAcs55HQ mIEjgegmC4FN
vPpejBXEMye7m2SuwecAJKyeq8jHBMrIMl4Ylgr9dXc7ELrRHsnKTlX5IwuA IfgpSLS0vOOY
O9Vpi8ay18y5+wtjxiMfslXEYV/KdYjTHx61FnEaO2NDR6VWWSquQwV9kc/T efrkSkY5P3hZ
S4z0HHDkAj74DYHFODchUIJVOyzNUB6uqUhkWSxmHeI7OGR+Eh+l5lxOZ8eZ dgqFFkQcTTkS
wjmvd/PKvszqEbE61jFEJD3hCj5LeEg49C+usJxbqhq+npT/11yBm0kl3kG/ RKUg15lvWwNP
zRzCvzA8PbI0nFKPaQvWA8zW4kO+AsA0dum+0iSAsL5eafFOJYlYjjW1fFAQ zWUcK+I3oM3w
SnWSe1JN8klCex0qZ+93JVnwYbUKPVPWTEMlJSKSsPKY/cC94JMyxJgIcJbc QAkFBYrVobvo
jJiUlmBAM5/v4ZfFgEcWZasI0t9fryoJgoP2siiNnbXPk1RHmnURhclzOYT8 kjAC8N0ltKlF
9L2BOwbxC6GeAVpg5yTpxypnCfygFTQkoxEYhUS2R63RzBf8C+//Rx6AUz7T LWJ/0G3tDm7s
Sk0cvRcUVntEwQpNOSRM1tJLAC/YrpFZSaIDux6Q2EAbOzapM5doGI2mJEBo ZuV1RzzjHe8Z
hIklvgC2FViHWrK1m/lmP27tr7u1+0cNtnY/aO/WbuwsPZWz2YrjmNjuacF2 xzFObuLSOfCy
tPR2FtSF3vEjT5x1U8GtJM4Q4pnpOXQMJPzDKprmbNC17uoKEuZZJ6l9c5/Q xgyx4YZBYqqm
hsPBASY6GeOWKxch2hJIaObe/YUh4ZHb3yqgBP31EZ69wWBL7t1fAVAau1Gz sYH27v2YAt+2
CTtGE2OhiVH4BNjIcPdDbt2+j5nzTyKADPwmfRrsoaruPskekc4To9QlzKxB GDghTVxhEZVh
rQTVd+r4FV0pFqxmAyyVEDl7eiQTLWFmVbhu2rDvHFVAeHZbcbHDtpY5mptQ JunHj15PqR/z
uU69cabew7mTXbIMPBO0JoybE5vPZuxKN7J6Are/TqX+gBuepFpKrSywWOPa x7lKtHUs1a+5
wv39NKJ0ppxfC9S4mgtY2rC5c70kLiyWI2Ohe0U90NGyz16CGwbdmApExnj4 2kBQZgYGDv6X
oLqEGsaRgyge4lJN8H4W3pHU8hu4Hi5THWd6ahz8w4Zu2ZHme9z7kVT3FJUU aAnMN/OU/8Iw
/8j5cUrNg6W3PnRuuN9vLecHnrUZUF8AB6CTXc3+set1GrJVhrFBjUZ8C7yl gjKOZAERHfZu
c4bp1MDDWHt7dnFTObFthF8eyxnOnA+yXMTomdVJqGeA+LEEcBhRgwXpfKNT uMp5J7+ohrcX
Xu0M9KPdjZokLk+VM2Y2VVQimsN6gsN84hRMcI6namBwbwneBM28lb8w3jyy lVtFq2EDFVQ/
2O+1Fq16TdHq5X1Q5RO9V68s2bzXJJX6C5ErrqnywQ2NIWYEHFDF6xBfA/88 yToosGeU6m4p
Us4luAMnmnSm3fXVhJCxhvuMQ7koR7Ps1WOhLoMnDlu1ZQRzN2JrNBhFYrL0 jS6uHnAOxB0B
F+Rp0VwFYM532tbHUGfvCpZ6DsX4aEToN0ODzmGQw0BcBJD2ajVq8QVcflRx gdLMWfBd8AYA
1gUEsft0rqFf17LqMUIekxbdTxs080vef8TJFuPk4cH+Wpwc9odbumDpK+Bk Y7/k6xDhfYxN
hHJqpb5+rAsxy6QESgLowjetFVA21w5ePmgCjMlEC2ClIRRx8RcQ53Q+dTDh NITSTjiAzLDK
H67MOpnkHKbBLQGVNUnVfLdb5VtUAzpYCnILSVYmXK+7yD6VHthIzCdE9jfc qxAfk7C6LVa/
oJkz8yMQtRmIhgfr9YD94eCgtUDU2BX6A/Ni7vMeK0PLUl1o9KF4Q6AxcSk6 y36jfylRutjm
WHKMmJMBdRJprzGLq+iuF9zSDmuoHH65akp5sgjo/QDWcEd8gjqLdWW1ujts hChdjSYTy7dU
Rk4jeMdPCeUg6kr3HRboteZQdbFsmrjQ5BKMpzLJEXurO/jwLXR9Mx3CFArp 8+bGkLgLTPVh
bSIdweRCYAdmjwRk5xehk7kKHeT6ULfObW6TmvLycUrC7USzNZZYUIJKp7ok xHd6NWQtJOcz
b4blEF9/Oye8RnWW+ziUpKLeiyIOuiByqqZ6F/Myw/BRNQ2de7/DelPubwyL bmHulZiDMYKE
jXVRyhMzZ0MRgo75SIDLKKqXkcbX/yYKFwff3DjPMNYouBBEJVAjBkRzjNYs 0fWji8BOdZjz
h+rEhLYJZXE+JOXqeCZdII1AmCEdiPg8ygj1xDKyOBNHxqaKqIjPQuvnO6KI tkcNkn34XUNe
V+nmDkSYwn9FMstNJ61+4YPEjTeBzVmdOqHjjheH751TYledxmRhhnQVrkgr EqYvX69XEF/T
YqUFiQCfapI4toAO0hHmkFfpXM95XdBx7z91jQOXViYLQEUgJMsWfMLO0GgH DnsTpyBxa8CR
DtHedH5K8Qx/qKnnLTmFm4UHPJ7CbT6Fe72D9e67+4e91l7IHDSOD1h9AF/Q ns+tu5gd59cz
/JsY+Npc3I6advij65ec8HUayAuUJBpO8Bky/hgEvAEcm98SSGjmkv8ICW2G hP3D9RqCQa/f
WnfcoLFD//mdXbzS/lOwwmNZ97Jnm0sZYtx5+gTSfHHvQVEnC+7E2SdQzRJz EWeF8w777jj3
v8VI5RCcJbipa3YVBMvqmL2iv+AhEYNA7M3Egis883yM1T8IMFdxEejMrEup +3WWIn2707ui
fq+SY8wS4z+sZwumEFPIbLzjV9FRoGHJiuEyHO35dnZaGEOTkeaGjWRwHVCl 26Nv9pRDOV0D
aN5FRnFTEUsUBHAzombhNqBKj6ubgvnDaN7Qaq4YS6vzNGQe0JHOLhuka2kq OZgUGmkNjTDf
NIFQisTh93gs7YK85LvtdTI74CUxgB1RfBEV3gOmvN3Df5IyxRcfSWbisHb+ hAeuCol1hi9C
ClV81cNz/o6V5XYwhbgXKmXDnCwmUbE0RH0vppFFGNAYSvy0ug4Li2/qwmhf 6oLo72ja525+
LdaJQBx8bMqlojrinEVCiHdEi9pnjUTKFOLS1OI4Z3NkQWEfp8ZmA5bFEuPj b+Pbx6jkOWvL
sdgsSuXxWGzzsdjrBuvDVPaDoL0Kq8ZhKmemuP8TvmGrPsTrtC2av7DG8a0c jjrLndf7XfYY
IXCrgICO1kmCtejgwrtuMXgaPsbGdy4PRbXik7+2ju9y63gMolPiE59xdDay Wp2q+SjdV3dT
xNPiopHCp6rU/Ti3/DwRcqL8/QEizHV5NPGlb8nEsObC3RUlajfXceM+Argo Moc1EwXqN9wV
hbkfbEd9IfhwgKWVbaIMynFp4vwWGf3zC/HeGvjFjWWoAdQviTyZt1/G8AGB HdZ1xtftT4KP
bMcd434ETxIfQfzpDrUVfzMZBtFvW4LPzaKIHvG5zfg8HKy/WqU/CFp7tUrQ OAbJ2RMAm6vV
GYUKk9XPHK+Q3EiWT0oHNLh6EB5PPrIRstBmSvaZHZkwdFenxhB8/ppPxbMz MzVtUW02iz16
BIQ2AwI7e60LNBj2W3sxQdA4cuk6j8WFXPWV7XNGAwjmITQFUAFoQUKrc4uK nc8qwcINf22S
/ZpIEk4gy8PeVmVIodm0WrEjaUgcX0ecwqU9YVF0KhEekDh5WYs3LdJ6NgtL OnhEixajxWC4
Hi2Cw+6WpLta2sE/A5Q0jlk6Fz+ZNJSahIgVFynl2uMJ1DskuYFJuPD3LUKS CnGhd1RdcPAD
Xwwr44l0V6zhqltrojx0gTDwePDX1175QBrIS6OiF8IHVDuLa0xESSICHqe+ i6k5tt7GtXt4
i+AmF16DqGn2ABUzze5WbyPtIm8gpf1fe9+25DaSZPm8Zdb/gH7ZrDJLcZN5 U6Zqbct0q5rc
TanVSlWNbb9FgkEqdkCAjQvbWl+rR41Z/0C/rZ/jHgAokSkUa1IqztCs20pJ gggggPDwyznH
n2fT0Md+keszX3jQARi4KaTeqtm48NrPGAN2QH6W2nUyOAfdpaeI+zRkdKrd UFHg6a2H3NyC
Kdp4iZCgk2AauAPMALOP2a1n7d1VC76TvGeVs0tlaJkKSOJB/51GGxyC0kc4 R7Ioqp3RgTge
Rhn6wib46C4L/F/RiJ4cn3w+CBtfHp/vLLsTdKdhlvKXWAhWAMqGJNkN+JSK rNHKsZmJGypn
l0UazN41hVofSD5pxsh8sLbgTJDpqEO5dxpQhstSGFUPn6WK5EjPtfoRsCa3 gcWkRIs5UXKu
s8S7YTJOhrF+vrDJ2Htt/7EGZ/x59Mr4Aq7djpqb8VBz8yRz+buiyDfC2NXn gTf2JqRvR/BE
AMwjv7kOS6SrkQnKg8FF1XuxPif2R/TpaAuUim1OCMrWRv2eL4rca43ypVVc 0bug6+5igWVP
w7cbTvwVnzvtFaC63VTLI70x6KXTsPVAfK9owRRQA3/tURLnYtTLW5mgRu/K w3zu86rnRqWh
FEM3aTnmABj6BRwmubKQAu/I6LcUTxLQz7yowohFY7qJcASJgMy1Qw4PE4eN 8ExUWadFBeKm
qvyMdoUVdDKMFXTxZe3o3vXiN73094Bs18np7rK1Twbzeq7y5G5jyMKkBF6G AUdMKWZIgiRY
EI+lnImxmYmlIwhCO07BV2JTMWvZ1JEkrZnTCOaOjbBoNGBYIN/bINosqRvM cWEKbchDjUDh
jJWE9+PgVFZ3oGyHzK2iKHDCaHDUFzM8CM0OrgZ1SPlt19ZAVTDk65RQH56s LEg6elKS0BhL
uKqZ3ot10zApNIwkev2TguwagOPjKs38giH4wVWe+/JvLoMTqx21PkgI2ija RebOpapi7OTe
I2xHLv2pZ08uTS/G+XxAplVdNhUajym0R0LXpCrKpdegeFec0WGMpr0R/bpG dPxwgFr6eDw+
2l0zOpiVdI2UVABw7y58x5LiPHCbqGXBSFM9KrERsBpAzplbpfADGLNR4q29 HpSQtd1CUN0i
EDFMBp3meDqVeQ6HMAuMYe2S5Bc/9/6EbUCkywwiIXaHhENmSjsid4mqO9EP NOaPnLXAKXKE
3zNfO9U8yk3TJ3VZQcoHUovISLbQRyAyKCVEb/nA7ljvEDlKZP3I+wGYo6pC bQJwH4spQVwI
FCJY9RXyPPeGyFUC3aUomcZEm8WObLQr5m8YlWRv/r6y+RsC/R4fnVye76z5 G8wGQeBYlJtk
NK7bnlaWqGc8mqPtAuLcQp0p8ejEzWw0nox8xVaZUY7WVnnAv1LJFYxu5vDF jLZ+lHWeMbu1
LDKxC9qBZmSMxg+UqxBPypR97C8lxoG3sqDA7KwLVEv2xZ0EvcXExhfDFWI1 QiLZJqjapKF2
9VopioHDKzlcaxcqPdmh30InM6S/QTUob1ZJm34eqiXmhmKXcsiSCQRLPTiE 293QwNV7nbHM
TCjc68lEppFuvOHNb0vVX+pyATohK48KpD31HlXBznarB+gRRLE8ckz7KZDv 5cTqM/calbV5
21FybYWfiklcmwSGD3X7jNp+iE21ok+ibXEBJQwmqBKfIR7MFLtD76J6GgRV g69aHA+fM1MW
2C5lqjB9LzkPTSYfyG4aQDFIDJXpVbpF9r7GTVCG01BlURzgImWvC5NQv0+A YNdXe6KYw/a1
5AxQrg7Pt+izaWtu9Qg3+Eb+QheholI5SbrsSKDdgQnfD3iIYRW9qSEFWMox oeRrv/KoFGHP
RYG0kpbZmHOhq3DAmKdLY+3IRjmMYLXfKL/uRnl59Plky9nZ8c6KqJwMpki9 Dotik4KpLnyC
qsnwl2vzUCFdIUX18gdauW51N2XVKv1EG8B67bxUq815i4RNPoMlRP6C8qdq ABeFtTfXbXXq
yvdEoVe9HbNN/gArTT7M3BHSDKuICzYI9IceZQdvdIaLMC0suuzIT0Qu/M44 48PYKnsb83Vt
zNnJ51MRJyfjncUznwymm1xlyeugPtsGS/M4A4VQj4CH4+kT95mBagF6/kjI sWw1JyFOBvU9
F0VmSBxE7cjJsnkbfPcKghhit163NoQ4JW0ER6mVAsq/Wjtn4nVX0I0nw8gR e3Pwdc3BxdHn
K92nu1zpHk5vaBcjtWzE9b+Tf2Y9YNvgoor+xuijBtAfekVsEHu13Ks8X9Kp GTx/K2eRm6Zw
+lQinkBG7A/f/eGbm54YELSMqtALRCMTeY5MaZtrpJgM60lK+15JHbL8cn2A sv2SVqxok6BE
ATIMGmmVBBUSFXPSYtFE60UquXMdz/ggc6wq6a8YZbL0H5XECYrUtGUK+aGq hsTPrtixYZyO
vR37unZsfDnAkI3HlztcqR7My7hul7JyKzYkGyOR9iOUoFWCYZn6WccR0mYE 62gX7OwA2cIa
+aEPlrVDgCUBz7duAbDNd/LpgjBABjHaiyA9+IAcoGYJJ1Y6vsoh2xszST0Y Dqs+oIpZuQWl
aoPaRAdrZlJaRHLfrJRIiFUmb5Y5LfTifsSyNjHURCVCqQHIRT3STNWsFJ/L J+8aqJgl0Ll4
V1S4gZ9iHR92XhOaaSoToM4gTSh+5A5prNlXIi+0ygP5Av5AJd15rfY94sw4 0XZZ4jPiv2LS
M5XbW4ZJE7U0fHeyvCUte8azqXUEugEicw6j7eYcE3a7WJhURKsK3wN7M+8Y MaDaZkKmAQ0p
0oIVdULrmyinocIa4BMzB/3pNhBLUplNifKA55QZxaNMZkCv0hfmDpbMXBUR W16zr93ugeA7
W9hpP066Tp0mULVah1NNm1zeCvul3QUzq10aVK9JPvqAF6KK6C27c1s1do16 73J9I2xtB7cN
XreDmCNMmyIAlY9+SoW9I9yYp9ZseYIcIpcaPAvPtmpR2YQ9WCxlLuvHYzqm wKchJbuETEca
rPn8Iij8v7u6XFmSujaQUJ3KzCE33L3fD+Tt9qx9FiVZ3vLE9CUSVyKQ5FD6 OYZwM0eAWYfC
KErt8hgp2szssvapaBDe0luuwVCpFuFE+eYobVrfafZkwcuZAl9xG/jGMiuC iSejvHblJDzq
39iSgZS8YliAIQpNyiduESb2AK1vwiHXs37BhcbpCJq27mzKyKoMMROjdPlO jkVefa0ZRKNU
ZkWn67IoalW/LYOWlfHKm3KlpeqfH2iSHBA8p6mlCqT+wC7ePRH00LXPzLQ4 M80aXpTCdFTR
F64ioNO4KfZzwXEl8uGHqB3P5eICgtd8V3yoYUy3vQ/1lX2ozztQO+s8DWai PZ6AqOVigLXe
dWqtvBiEpu5KroVi7WTDLAzkMTIICoU28hR2mOVbk+VQ3ypt4YBPnMtgHw+h vF2hEzeLXE3U
+qag00Srl4VlsUvrCYhSYOnbnirq9djWzNKW6oabK5R4O/mtpq1I0GUxdSL2 FC2wZKPGLEyY
njpszSHkPuTQphTH4f2Iwa5em9gj6p2Q4qs2uS1Ddm1HY+6LXlZr9Ee06n/R P3jzitqRK8L1
HRLfCKsORKVHZr3ln1WdK4HkfZkq8OcNsT4o5RadT2OtszAbDwxbQ3qyFWbV HKOOuCuGdRh/
bW9Y94b1ngwrmi8PM6xIOYlZFCsxDPuyEp7C2B3GPoMd4gTlOXOLl0GjG83M FT157mdNSfc0
UwvYOo86Av5oTHdJjB9kA3sQbK3Rwdn7WM8pUdILjm9FpBQp0+8Rg2oBeSSM x2iCPNXuEif+
Zgo5R43pNPcPlW+y68oZAYMyE3OE2Yi27aS8vzT2seFGYL9+66grKLF3pTEW LliGQKDjgFtc
indfMDjVgd/B7Cp63ISgxMNdFBRQjx1rFItBa26hQ4vLqIC1pqJgunrf/WIr k5fapta8cUf0
oth+xsbTzjfuBf7cBxkULHosHMbeLeP5prmFtnr3rtjeyMAIuwN4zm5OOnLS zBX6/QqNfPKC
T0KbY4APKQ+pBGeHqVnFkciEN1XIrBnHCqxGN3OcYckQV7nhfIGWiKUxFvYi fnsbJCbbkd3k
dBi1cb+b7HeT+9pNxkN3kyuxc1GF9q72FrU6x2F+6+Aew3PU/IJYQ3h+lkm0 BNxIbFZqCRnA
zpC7AaSwMjnW5IYAPKY65C17R8QkMGZxGzFScw8n+BR2unfKkq5tRbtWU+qm S31oswY3geeb
9HIelpi0m1AJWpidLIySP02RGSiYwtFqjvi62tNBrWKaIgU0Qpo1vAvt7rcr NmkYTfByb5P2
NumebNJghqB4OD/K23B3h0RgiucNm9cY6nb0h2+eiNcjXh+WLhtwudgRNYNP tsTqfVqw20nQ
XoQGs2YHWGQAgCaOTmDb/Jk/Ad5XzQeuLfk25ITy9nCuMB6UcIAOZ557UlLy OqAPQevKahE6
1VZjGptr2biA/rMv3/GCnrncPVJFU6YnbLBDSu8UDMhdLysBgyk294XTn8xl GcVqSifZXcX0
rfZEId9bawMVMhIod8PCWxkkLT2KUn6UdN4oc8OcNlzjVMZEUmBXCtCnwzh+ ewu4t4D3ZQEH
k/tes1XpegPYYu1MLVgW/lVb+OycOTUF2jlLi4O90hCLSQhWkazsIHOM7Rct baCLluUIUxnu
wuYuWoYpQotZmlkJBctJEOvV5FDFASN7UliyEmpfZRo4uM/zjn1hBSVigtvw 9y0qUpFNqFIV
0QRXDSNy32reB5OSlqiySOWJfRKRK2HGt0I8jEBtV7DyZz84D1Qyq0JbdDcq EHveog4tQbKz
0ug7+WrEijzI5Gwyicx3EtsrZNBdHHWwxEkow+yT4hev0PIQhE1xZ5MIeO52 BuNzOoxHuDex
exN7Xyb21xAIjXu0IY1aqJLfitoOE6QEB74DJ1kFuKDRXktsG+YqUkjTiWSe mOC6LuCcio0m
XXk+R41EzQ1D1JlfKoylM3vAdtSWVBV7QaF7xtuaUJt0ja5HLPaQ+PyBBC7l CvbkgJaKMQoo
HOUFgRbNXIxcAjJeMy8IULxBWtVlLIZlVggz3EGr42N2DfJiSbRjVd2o2VYz COH6CYFAbG7I
M/NG3aJUekgVC3hao29PCUMn84Usq6vYPfwl9w1cuor5M8+pFlO82Ojfyu+m UzRqeWd1Lz0Y
3QHVqyfb0CtNO1NHe1pqPctniT6YP3zzqqB0pDV0fKTZZac3pX5uCZl9ueJi NiNKZMIWwIWm
IJhY1g/nblKyBjillKWc+ylgURk7qdRKTlHsTq4SkU3WZK5WCctMZpM8HF72 CJOA36hwpjxN
dGFonfEocwLgCTFIoZ1OjKqsdU1jpJG6/skmcjWX94+GWjag4/GDRfnAyQZY PTg6Gf2/xUxW
UntA+5vf6cYzjJf3hTeevZjcftv6Rk/4uW1rMKHvjaEJHXuQ58Uf1+9eL1gB jMbaQVzjbSDI
TH9ZrNoVMRmRAM0iDpl9MBxIgFJCrVTZIdi2aFazwhIYeRHLckitlto15RPn 3ifFdKoeOIp9
sMieGAgNEyL6NHk8ZbMY6o8c6l4aA5VEURaT8K4/AAAMSEQrKsTYgJkWyYjo 67R6AWMIaqvz
pliuzsKhOeImGLIzmd1hfMEvbPv2Tje/+a9hvQZTBa/NcjFC35TfRdTc6iFM YkfCKEzglwiP
uVQJQmLrps57Nsi3IseJIhV7hbCahe+lSlqGmBRVfnJZw9lVW9Q5paHnoe6K KRjGFdybgr0p
uC9TMJgmOG3QTW0lut4kU9ALE9O2Typwl1TezyBaMFLSyqQhLpGV6jaiG6lE bmhZEDE8/qCg
Rfx4R9b3MA7dfn3v1/d9re/B5DnAOjZk1nrK0m0ShqCKgomMj2Sv5ctXAXL4 U6/SqwgMiEzs
AaaZa2qzVf1+8LiKnVjbw7gd+7W9X9v3tbYHczuu20riHZAxjxIavGisQaQ+ mWEgYNSQnsqj
6LXG+MWqaxDRjKVKJDLryGFdQKuO+fKrfFmkhl9wqkgc+WiLBq3aHbsjThge 6Nco2TEPXRoU
jCqf3xPbpn6FqqjVAPdSC8BY/d7OZHLJlmgA6bAuRslT1SKlYmhmHE5tSyv/ moknMg+VRBvR
K6nQKYTsPlzZf/9rU9TfUyTp8PBQDgWd0lMtuupLMPEODpM3P/9RfxF/2eJp Fzht189bEzJt
K3uXvHj8059+0N8k+p+bf6z8qWmaQHS3AnoxQ/MA8mFKuqqNFc/yM+XoFN/s kyXGh3geBN4U
IQ1hxNIFCMQ5Ek7ELr+4emynXxl8GekpcyZjtGOUTDYeLirh81bRGnvFjhj0 YZySvUHfG/R7
MuhnR0MN+ksPMtgdxjzWrRI2/pD/MY1S1WWjKNpev2ujS7TH35YI4BTry1rl LGi21c0VO2fg
FDh94LLBLF6B8A1itSEsbC8gESRT3f+JHh1T3B9I+G5yNmKrjNVPtrbLJmGU /FiUygQEAS6C
QbDVUJA0RJbhaJTkLVqQFtDQIrFsSlAgUS+TUBF9ArMmZ1FhapeFSst509LN VTjT1GTamwFn
fpS8Mqig/BR7Wkaeg+bfY4UQfTqxZ+FSc+JeIKhqN5wZYkSGfR7b7rGsCiUG qJGiGCpT+K4t
2Rp6pf+oIBRbs3jpVdpBLK8WT8Gin6G2rQYaxrgmUahI0wb7qNnvHqJwFb3D ArGBYCAK2AKp
obrQP1DLAUovQfkTdETQ4+kc3IrxoHzBqkAv9n6FMKnEj6KdoJFaaRmb8oOq D6ZwmzLzbZEC
JfRamxkcFOIyeGQKqUqA0AOhhqLJyTDvv8rLcFuqC0FF3Ynryhny/5y6uWgq gdI+9QdGyS+x
geAk1sEbnA/ByhzBTfKUAhNTlrRzfZlQfFaXopAnPgGTCyohELCtQoRAzdz8 Vs6vir/kadWQ
LRitQpUmhnMtW2KWnLzkjAbSN0fJn0nKUrk0PEjtwEi13ElXuIbE2m2IDKOF QxbW0f0p8PIj
MwssPmWBY4MLE1LmFBHvTw161dpQuBoWCh0ivHck8rIsbmoCza1hyjrYGt+x BgwAQKjIanOx
GHQVaQUcpkIxfdrA8eKdt2N+S6uDZ0L/lArwClkI35mkgl8GNsSwuy0o8VQX H83tykI6eGwR
5xXe40grg3XrRnYzFaHGW8nnCiCbmKuXgPCtzBFWDgfXdRMndBJSK091zDrP 9UTYgZgcvIZB
Sbhz6NrPwfyqiZD46DF405jgndutJW0jEku2L4Kv34/0fEygEf9SUnq4Sv2j HvJQX19Yk6Br
o9blh6fIlLtYK1l2K6JbfmI/owhYrciZnoKWvB4PIEUdJ766ZfHT0YMvZfjc pHCIMVTjacsy
++QkHSEtmESF6Zp6VBm1dclh0oKqieewHqhKvTb5CnKdl76M0IyucReEJGQT AH1uGmoWFczm
a+ihZ61a3PXqA2lFT4nZLFs7L0YwA6aRkyO7TzDiCioWpQrq8EBcI196eRr6 TryXK6Q2DSqq
3JFs2ldH5kuvGVHEYk1Zf/I+ghRjfJjIsWy1XtkUJ1MdDi2qspFrUbbEzniF 0W4fuLhWFjl1
fVQMumi3rhQGEPRDWaZtEdur6sxuOP9nwyiAe+d/7/zfl/M/Hur8PxEPWfaB u3I5ZfjYa1Od
B1m3DfflVsXR3OUCuDiAsm8btmvWTdE0IhQq3eWBgEQsFYvI0ZYNHOMpXBD0 64MpXJFMW7P/
IhogDETjDAOhxxNWTMag34K6yLVbUvQDVpnur49+1sSpbrV6eWLsZeyPbx0q InaGFUCfKkMh
V+JLo2qvUthXGOxtWsXNoW6UPNV7agns1ap+P3vLNpFEn0X9a2RacmxnBmRR XOQH8+q1hw8z
bS1+lKZ2aYkt7A7PfLu/0r8wYW7x8ICMLyr0ruYcaT809jYz9L0eo/JpyB/V BgRCyX3p4vGQ
GkDDCSi8qEcFm96bG+VE/VXOXECKau5aZsGtX+LmZuF9lLmKKKKJ49P5JPCM zHuLW34pQE0A
mr6VUHmrEqLssa0BKEIeXioUCeQtKVVhALAkuwTLVsV5wp7cwBPJWcGQzZlu g0eKLrGmGKH7
5gPeaLm+EsyE2vVeJY+ahcxfbNtmuU8JQ/zOsN3P9szS/Vb3dbe6wczSm0ad eiTUm3yjfspq
R0UnAVo5OYyafr0TfG/ycQkpRgWC5hHwhuS+q6ae4tpJAUIPGcadGYHucv+t GhSOqxhgI7Sa
aLNapzmLPnFrFHdI7gwrkbEEHSl2EL3KnFcs5g4tHWFyqUAVKJSJC2o71fCC ehRR5N70BhlP
KJ0044Zfqw3lZ6pmyTKHoimYqHcY7J3h8lPm71D2yH1d9rs7mO5HJDphd4T8 pzWbrExKgMJW
HQOqjYaY9dJmwNybdgWcdTaMfzo+2hvKvaG8J0M5mIB6lbxBYvEuRZDbJm2V Xo1sPymWHckH
pgFam+pMmQzn1DE5wG85Av1RmBunNB2AN4H+LhtjxrcAkayDrocawrmftovR 5l1LJDvEaS8m
Ac0q80Y9Y+0v3lZIR8lPoXRKy9LTIqeaFeB1zsQ/hFzfvDChpoQ3JVfLXE8K AKuCznpXxTBg
vnCHTF+oA1/MF0x20rM1E1aKK0g/L+sMoHr5AV3YXJv/gSnmoFXXXw1w1pJ6 y+KohtWrzymc
NLEeb3MkDLUU055Z9hwmokY7k0YZRijd28y9zbw3mzmYUdrn66lc9gaI+7oi Qt2BR1Z45X/4
5vlBjH2zlpJKTA2TtAvnKy04WXLlQ/K6mUz6fQsJi0M2uJX6ZFFn1M9PiPeI Ln5R3JMoWpP8
ZhdGktS93F6JNr2dMdtIZ8fZVSa1BeJ3YS+cUWMwdv0sxImkAzyKgksRzffJ pbANR3tFqC8G
xNmj5F+i6yke6/sk9nFHBgcJaTnxY5yMRei+Gl1iPvXEkh/teK24diU2fILU yiGsueoRsrgz
pcQ9ulTmoCN0GWyW5ZBIp5a+qgWWKy2OU6jKaEPl3ArhemOHMZVvxhxFGLH5 BWUdobfSFYRY
ZGUsgO3EdOV3xR8extnc2/a9bb832z6YdtmpAbBqvt6uP0UVMURUokXu1gVI XT/rF04DyNSt
9lYddQVj+b5i+YwZyapZ+Aids5TBKEL/gK7zrRYestoNzh+Ql8ZvNYXgv++l CagfdetiHf+Q
x3hWNblhhCLuGfhl4LaCQnhZfAQ7fNUp/9f0tVnXZU+G/miUmsXNHMZvIQoj 7nnmf4gnbBGM
hs2Bf/tDJ5hlqlNtZrr6x6GYZSSEeynuCO/5gFZLaBbQFoRtEkZdIaDXlpgK r8jV4sTPnv/y
XCczJfySOFCeZ1fs6TAe6N6e7u3pvdnTwURQ+KgbekXC7UOgi0NGAHoTRKSY h1bAf5S8VB+J
C3zUtjIHdx2r14AITvuDjLrlL/Z1KZH6rjSDPRvG6Nwv6v2ivrdFPZjSyaik wrZJnNambrC6
FLXoiyTbyk/65W14SazOjizi4YGtKxDLKbJHwwdhVQLt6tMIPasaCYknEE8a Reypyeb0CrA4
STaxoMquRUvMrAEzpi+LJRSOAQ8AsK6ZTl2svyvIWLWP2qDbXBm4T5qSJPUD Ikq5pTIrIBuK
jB0zgFkGBgDiGdD23J2KxjA66t447Y3TvRmnwXzUl8xNPcF6Xm+WrqgKDpPA BJaKij1eoAUj
ghq1BB8QpzVV34SkfWpEVWu4doCSaJlTwEYzRe0pNGUkY7wLsWMDhcwVIDpC Vi7M524W2Cbb
cl1oX0b0E/+BQBBRYw+T1OkKK0mtybuzLFEhnruY3AKQykLIsAj5DCBjQ/MT JzSPxi2iYpOp
RKYg3vaNM0Bc5PCPSK/XezPtUFL6sgh+Ta1R24gk3d50sfyhEPqyENsXj2eg 2zp1HyzlVvfg
yhqtzgltrlfl83rljoh8h/VV6Q/sKGlJigZcR+srB3uMniqPkvGxXJScAbhq PL9gj2OhUWZ7
n+z4NILQmg2WQVWAtaGiNHHqrO201wbVms37p7a3iBIkI/AeUbOPjR5nLA8p irucOeU9Hoz6
6VrugRMrC0EtBbp4PRywqeg/SqpM1ZpwZQHtHBH0W1t0IJTczDHZgI5Y+iRY 2ScwTZ/GbcwV
x3t302lB1F4nlzpq8xsztmL0LLsB8hS46QL21vbcarO4CxA6vMGo7L5XHiXu MsLW5qx31eWc
Aot8PTW10M1B9g8+6Xa6YjrGDl8irADP0s4IQX+2aFHUc5FqDoKaiTOFH8f4 AekZJnSTairj
y6uwKzv0MFL5fofe79D3tkMPZpVDZk75IyFPZg3YTJ/tcNUZi04R07SZ0e4z eN2FYq+jaxjW
urEMbewof0uwgXz9ougJuabUh5r6BthiVRANnfYEdinYBmN6A+Gk9r29dhgj iFzrZqCdRK4P
JFbR9CzAVzDV06j/TLKhjIYSngQz5Rx5T9l6/ES1sU3NJgFlELqzI22SSweB ctHMxgJ6gesD
SjeRbbNLfiBf/N5YdEbHVHIXifm55kv1ikotPrF9FdPYkTPTK5rF0zKJ+hH3 z1du5nv8dvFD
XBksh4wsrXXIqjjrKveKOOn21kerXvWNM1U+uupn7EL9A37JilymfgqbdM3w vdxj7H/rUybR
220GrE2i1MCla0xO4DFLcHFK7MQAu9lVTRTQ5nWCwf0RJwV+AnF1jTZGC1F0 cFd2h2EM9fF4
vzvsd4f72R3Oj4buDk+NNjEFQqKab9gabmo0b69hJWXhg1mdFEsahxHEmHPW f8j3hTGfJGhC
DjMj375oCmBng5kJtY2zRnzcWo1Oz/K91NXPwychSo1SvLmiJiHRsOip6Chg dO2NsxdM/WJH
LMT5MBrb3kLsLcS9WYjxUAtx7bQaXGpztppe3R0p6A8d7t2w5wahIvQKgPZQ u5i2YJTZSgNH
3Gs7Htj+eB1Vld7GJivNpxYh/7nLnWiKRgvYFRhj5LnVRfthPEXxKFECLuGl 4hEF5Wo/dRPH
JAKU/Zu69FNzaaOxS16C3VSoYNqk8cY2W1HGEN8y0FhGbD3aZFPY6J8yxIMH iVX5jSSG2UKl
H2f4K+h4xQ96FDFrGe8WPUAzqiz1ftTPGk3J7Kf0PWUQ/ti2nlGgsHIB9fo1 VYX/rMhWl+0N
VJ4YK0TyeW2URNCnZqVfLIIbJc9XePxKMi9UDjrTvIS63aaJMOroXYsmM9Fq OnjvI99spLA2
pxkWak8Y0qNHD1Ru2aIoes1uMyI9qGegMYBPsEEEQ8Nhqr6tOK0lfXF8qGcM 36kCNw7JI0d/
iQgjz9VJVbmEgJ1HTlfz1YOL7dk851HbcRw1iaZKtRnDomjfB3Gb/5EEuaha CRvm4sr26PPI
3JAH/QYjwkGHSgr+xmn4bA0PVwP07Pkc0aOYGLedaZB4PozGtt/q9lvdvW11 g3lsP3d+cBKb
AWyotr6CRgQYU6w/qoQOfNumZC3yJlinb9ZiqaTZomE1+IclYvuAlfD/EEbZ Ey2F5ItDcBx5
ygCVTYLr8z7kqPp9QgsuFs7P2XdFtxfdEmCDfmj1PJSzQTUg/I75koZNV2Y0 bSjKgMARh2r5
ajVPZjkE5TfbIfTD/zSBGpKRyWtmaSZ+6SOIjvVjH1nKgOI1cyv7Zm3mBtds fymeRA5CvJHF
M4LKhwQHUgTYMnbE/g2kp+3t397+3Zf9G0xPe4zmpYjWXZTopO3alC5GuUoc Qk3yGsDMGsM2
SNe6ieU2IUJXWL6xbQPS1iEdu5AYPRU6YqVbLOjaiutbpW/FdEg8EdQeMyXb UcqWLPG1yUzT
x9CAY7TCI3uLhDDZdFF9btTCYR/1miJSUmxJoG9TKvak0AT4LagTXiV2VPpU rh183R5QTqww
Sr99Blnn78HyuvSvjVPPE91nZ43Kc1Wzt2GWQ0sDNlcMoIoT5YW2A0Mw8apA V237VcHbQzQS
5VRh1cWWKx7Hs2qsUlkNJ5yJ9AUrjG1QQKkjWNgccu1MteZdoxeJBRYU/TPg M9rQVGQ9jzRF
3r/+ltVMpzdqBoZHCXzbGe6jKbUVWrDWlYVMpjWBFKf38YSvTcoaqZsXBAtH rYgoaAIf/q8N
ZA+x2QTDA+kJfoHcGZu4yVaJWiQeIojOSnzOuruX8AjRgNJBHMHek4J6GHlM P83N8wb6W6Ia
DcieFUu/jAn8Xdl9BhL99rvPfve5r91nMNEPWERZ7kD40PQ/C2j3vQFV9LGc fcL2gMwRF9Qc
omP6uJ4X1RQ2u5TvxH+krf7JnOciCq2STEwimgogQGbP2W50C40dCN+3pTla c2uxodpDixLY
mwVEafwEuwLLmoUdcxMVpytrGcneuodkqpR1UEeYapddJhz2tYNLGlrp1i9p B9lXndwPdqas
oPLwSA163pu5RKnWOqGP5M4KEhBr6+rYCmHDrc5gIinaitikyfnDVO
Re: Is EMF suitable to implement key/keyref pairs? [message #505083 is a reply to message #505079] Sat, 26 December 2009 10:14 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33137
Registered: July 2009
Senior Member
Mauro,

Comments below.

Mauro Condarelli wrote:
> Sorry for the late answer, but festivities and my wife at hospital
> took some of my time.
>
> Thanks for the support, but I'm not there yet.
>
> Ed Merks wrote:
>> Mauro,
>>
>> Comments below.
>>
>> Mauro Condarelli wrote:
>>> Ed Merks wrote:
>>>> You'd get the latter for free. I assume you have an XML Schema? It
>>>> would take only a few minutes to test drive your schema using the
>>>> steps in this tutorial:
>>>>
>>>> Tutorial: Generating an EMF Model using XML Schema
> Done.
> It works :)
>
>>>>
>>>> This option will help, but it will only use CDATA when it's needed.
>>>>
>>>> String OPTION_ESCAPE_USING_CDATA = "ESCAPE_USING_CDATA";
>>>>
>>>> If the content corresponds a complex type with mixed content then
>>>> the CDATA will be preserved in all cases.
> This is a big stumbling block.
>
> The following code:
>
> try {
> Map<String, Boolean> opt = new HashMap<String, Boolean>();
> OutputStream os = new FileOutputStream("C:\\TEMP\\no-opts.xml");
> resource.save(os, opt);
You could use URI.createFileURI to avoid having to create your own
streams manually.
> os.close();
> opt.put(XMLResource.OPTION_ESCAPE_USING_CDATA, Boolean.TRUE);
> os = new FileOutputStream("C:\\TEMP\\one-opt.xml");
> resource.save(os, opt);
> os.close();
> opt.put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
> os = new FileOutputStream("C:\\TEMP\\two-opts.xml");
> resource.save(os, opt);
> os.close();
> } catch (IOException e) {
> e.printStackTrace();
> }
>
> trasforms:
> <Title><![CDATA[La Missione]]></Title>
> <Desc><![CDATA[]]></Desc>
> <FieldTitle1><![CDATA[]]></FieldTitle1>
> <FieldTitle2><![CDATA[]]></FieldTitle2>
> <FieldTitle3><![CDATA[]]></FieldTitle3>
> <FieldTitle4><![CDATA[]]></FieldTitle4>
> <Bio><![CDATA[]]></Bio>
> <AuthorName><![CDATA[Mauro Condarelli]]></AuthorName>
> into:
> <Title>La Missione</Title>
> <Desc></Desc>
> <FieldTitle1></FieldTitle1>
> <FieldTitle2></FieldTitle2>
> <FieldTitle3></FieldTitle3>
> <FieldTitle4></FieldTitle4>
> <Bio></Bio>
> <AuthorName>Mauro Condarelli</AuthorName>
> which is not good, but I can live with it, but also transforms:
Yes, it will only use CDATA for cases where otherwise it would have to
escape using entities, i.e., &lt;
> <Scenes>
> <ScID>87</ScID>
> <ScID>91</ScID>
> <ScID>90</ScID>
> <ScID>89</ScID>
> <ScID>88</ScID>
> <ScID>92</ScID>
> <ScID>93</ScID>
> <ScID>94</ScID>
> <ScID>95</ScID>
> <ScID>96</ScID>
> </Scenes>
> into:
> <Scenes><![CDATA[
> ]]><ScID>87</ScID><![CDATA[
> ]]><ScID>91</ScID><![CDATA[
> ]]><ScID>90</ScID><![CDATA[
> ]]><ScID>89</ScID><![CDATA[
> ]]><ScID>88</ScID><![CDATA[
> ]]><ScID>92</ScID><![CDATA[
> ]]><ScID>93</ScID><![CDATA[
> ]]><ScID>94</ScID><![CDATA[
> ]]><ScID>95</ScID><![CDATA[
> ]]><ScID>96</ScID><![CDATA[
> ]]></Scenes>
> which is surely bad!
It looks like your data file itself is using line feed conventions
different from the system default so SAX is capturing those and on
serialization they are being escaped.
> How can I avoid this effect?
Check the actual data and save it using different line feed
conventions. If you eliminate the mixed="true" for Scenes element's
type, then the white space won't be captured but EMF will still indent
the lines nicely. (Note you can set the line width option to a very
small number to force line breaking.
>
> I do attach a .zip archive with the .xsd file along with the original
> file and YW5Example output with and without option
> (OPTION_USE_LEXICAL_HANDLER does not have any impact on the output).
> In an ideal world I would like to have the output identical to the
> input (unless I change it, of course!).
>
>>>>
>>>> Binding XML to Java
> I see, I think I can live with the default, but it's nice to know I
> can change it if needed.
>
> All other questions are solved (more or less).
> The real problem is the other application will *not* read the
> regenerated xml file, so all is useless :(
Is the other application not using a SAX parser that handles all the
normal standard XML syntax?
>
> Thanks and I wish You a
> Merry Christmas (I hope it was, I mean)
> and a Very Happy New Year!
>
> Mauro


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: Is EMF suitable to implement key/keyref pairs? [message #505102 is a reply to message #505083] Sat, 26 December 2009 21:25 Go to previous messageGo to next message
Mauro Condarelli is currently offline Mauro CondarelliFriend
Messages: 428
Registered: September 2009
Senior Member
Ed Merks wrote:
> Mauro,
>
> Comments below.
>
> Mauro Condarelli wrote:
>> The following code:
>>
>> try {
>> Map<String, Boolean> opt = new HashMap<String, Boolean>();
>> OutputStream os = new FileOutputStream("C:\\TEMP\\no-opts.xml");
>> resource.save(os, opt);
> You could use URI.createFileURI to avoid having to create your own
> streams manually.
>> os.close();
>> opt.put(XMLResource.OPTION_ESCAPE_USING_CDATA, Boolean.TRUE);
>> os = new FileOutputStream("C:\\TEMP\\one-opt.xml");
>> resource.save(os, opt);
>> os.close();
>> opt.put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
>> os = new FileOutputStream("C:\\TEMP\\two-opts.xml");
>> resource.save(os, opt);
>> os.close();
>> } catch (IOException e) {
>> e.printStackTrace();
>> }
Changed to:
try {
Map<String, Boolean> opt = new HashMap<String, Boolean>();
resource.setURI(URI.createFileURI("C:\\TEMP\\no-opts.xml"));
resource.save(opt);
opt.put(XMLResource.OPTION_ESCAPE_USING_CDATA, Boolean.TRUE);
resource.setURI(URI.createFileURI("C:\\TEMP\\with-opt.xml"));
resource.save(opt);
} catch (IOException e) {
e.printStackTrace();
}
which is clearer, but (obviously!) exhibits the same behavior.
>>
>> trasforms:
>> <Title><![CDATA[La Missione]]></Title>
>> <Desc><![CDATA[]]></Desc>
>> <FieldTitle1><![CDATA[]]></FieldTitle1>
>> <FieldTitle2><![CDATA[]]></FieldTitle2>
>> <FieldTitle3><![CDATA[]]></FieldTitle3>
>> <FieldTitle4><![CDATA[]]></FieldTitle4>
>> <Bio><![CDATA[]]></Bio>
>> <AuthorName><![CDATA[Mauro Condarelli]]></AuthorName>
>> into:
>> <Title>La Missione</Title>
>> <Desc></Desc>
>> <FieldTitle1></FieldTitle1>
>> <FieldTitle2></FieldTitle2>
>> <FieldTitle3></FieldTitle3>
>> <FieldTitle4></FieldTitle4>
>> <Bio></Bio>
>> <AuthorName>Mauro Condarelli</AuthorName>
>> which is not good, but I can live with it, but also transforms:
> Yes, it will only use CDATA for cases where otherwise it would have to
> escape using entities, i.e., &lt;
Unfortunately this is bad.
The "other Application" will not recognize it. :(

> It looks like your data file itself is using line feed conventions
> different from the system default so SAX is capturing those and on
> serialization they are being escaped.
>> How can I avoid this effect?
> Check the actual data and save it using different line feed
> conventions. If you eliminate the mixed="true" for Scenes element's
> type, then the white space won't be captured but EMF will still indent
> the lines nicely. (Note you can set the line width option to a very
> small number to force line breaking.
changing mixed="true" to mixed="false" solved the issue.

>> All other questions are solved (more or less).
>> The real problem is the other application will *not* read the
>> regenerated xml file, so all is useless :(
> Is the other application not using a SAX parser that handles all the
> normal standard XML syntax?
I have *NO* control over the "other Application": "yWriter5 is a dotnet
2.0 app written in Visual Basic 2008".
I don't know what they use for .xml I/O, but it clearly requires the
CDATA bracketing.

Using JAXB I solved the problem with the suggested (but deprecated!)
workaround:

private static XMLSerializer getXMLSerializer(OutputStreamWriter osw) {
OutputFormat of = new OutputFormat();
of.setCDataElements(new String[] { "^Title", "^Desc",
"^FieldTitle1", "^FieldTitle2", "^FieldTitle3", "^FieldTitle4", "^Bio",
"^AuthorName", "^AKA", "^Goals", "^FullName", "^Notes", "^Outcome",
"^Goal", "^Conflict", "^RTFFile", "^ImageFile" });

of.setPreserveSpace(false);
of.setIndenting(true);
if (!useWorkaroundForBogusXmlFile)
of.setEncoding("ISO-8859-1");

XMLSerializer serializer = new XMLSerializer(of);
serializer.setOutputCharStream(osw);

return serializer;
}

public void save(File file) {
if (yW5 != null)
try {
JAXBContext context =
JAXBContext.newInstance(YWRITER5.class);

Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
m.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");

FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter osw;
osw = new OutputStreamWriter(fos, "ISO-8859-1");
XMLSerializer w = getXMLSerializer(osw);
try {
m.marshal(yW5, w);
dirty = false;
} finally {
try {
osw.close();
} catch (Exception e) {
}
}

} catch (Exception e1) {
e1.printStackTrace();
}

}


Can something like that be used with EMF?
Otherwise I will have to stick with JAXB, I fear.

Regards
Mauro
Re: Is EMF suitable to implement key/keyref pairs? [message #505104 is a reply to message #505102] Sat, 26 December 2009 21:53 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33137
Registered: July 2009
Senior Member
Mauro,

You've have to create a specialized version of XMLSaveImpl (specialize
XMLResourceImpl.createXMLSave) and initialize escape (in the init
method) with a specialized implementation of XMLSaveImpl.Escape which
uses CDATA always (see the existing implementations of the various
convert methods). That should give you complete control.



Mauro Condarelli wrote:
> Ed Merks wrote:
>> Mauro,
>>
>> Comments below.
>>
>> Mauro Condarelli wrote:
>>> The following code:
>>>
>>> try {
>>> Map<String, Boolean> opt = new HashMap<String, Boolean>();
>>> OutputStream os = new FileOutputStream("C:\\TEMP\\no-opts.xml");
>>> resource.save(os, opt);
>> You could use URI.createFileURI to avoid having to create your own
>> streams manually.
>>> os.close();
>>> opt.put(XMLResource.OPTION_ESCAPE_USING_CDATA, Boolean.TRUE);
>>> os = new FileOutputStream("C:\\TEMP\\one-opt.xml");
>>> resource.save(os, opt);
>>> os.close();
>>> opt.put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
>>> os = new FileOutputStream("C:\\TEMP\\two-opts.xml");
>>> resource.save(os, opt);
>>> os.close();
>>> } catch (IOException e) {
>>> e.printStackTrace();
>>> }
> Changed to:
> try {
> Map<String, Boolean> opt = new HashMap<String, Boolean>();
> resource.setURI(URI.createFileURI("C:\\TEMP\\no-opts.xml"));
> resource.save(opt);
> opt.put(XMLResource.OPTION_ESCAPE_USING_CDATA, Boolean.TRUE);
> resource.setURI(URI.createFileURI("C:\\TEMP\\with-opt.xml"));
> resource.save(opt);
> } catch (IOException e) {
> e.printStackTrace();
> }
> which is clearer, but (obviously!) exhibits the same behavior.
>>>
>>> trasforms:
>>> <Title><![CDATA[La Missione]]></Title>
>>> <Desc><![CDATA[]]></Desc>
>>> <FieldTitle1><![CDATA[]]></FieldTitle1>
>>> <FieldTitle2><![CDATA[]]></FieldTitle2>
>>> <FieldTitle3><![CDATA[]]></FieldTitle3>
>>> <FieldTitle4><![CDATA[]]></FieldTitle4>
>>> <Bio><![CDATA[]]></Bio>
>>> <AuthorName><![CDATA[Mauro Condarelli]]></AuthorName>
>>> into:
>>> <Title>La Missione</Title>
>>> <Desc></Desc>
>>> <FieldTitle1></FieldTitle1>
>>> <FieldTitle2></FieldTitle2>
>>> <FieldTitle3></FieldTitle3>
>>> <FieldTitle4></FieldTitle4>
>>> <Bio></Bio>
>>> <AuthorName>Mauro Condarelli</AuthorName>
>>> which is not good, but I can live with it, but also transforms:
>> Yes, it will only use CDATA for cases where otherwise it would have
>> to escape using entities, i.e., &lt;
> Unfortunately this is bad.
> The "other Application" will not recognize it. :(
>
>> It looks like your data file itself is using line feed conventions
>> different from the system default so SAX is capturing those and on
>> serialization they are being escaped.
>>> How can I avoid this effect?
>> Check the actual data and save it using different line feed
>> conventions. If you eliminate the mixed="true" for Scenes element's
>> type, then the white space won't be captured but EMF will still
>> indent the lines nicely. (Note you can set the line width option to
>> a very small number to force line breaking.
> changing mixed="true" to mixed="false" solved the issue.
>
>>> All other questions are solved (more or less).
>>> The real problem is the other application will *not* read the
>>> regenerated xml file, so all is useless :(
>> Is the other application not using a SAX parser that handles all the
>> normal standard XML syntax?
> I have *NO* control over the "other Application": "yWriter5 is a
> dotnet 2.0 app written in Visual Basic 2008".
> I don't know what they use for .xml I/O, but it clearly requires the
> CDATA bracketing.
>
> Using JAXB I solved the problem with the suggested (but deprecated!)
> workaround:
>
> private static XMLSerializer getXMLSerializer(OutputStreamWriter
> osw) {
> OutputFormat of = new OutputFormat();
> of.setCDataElements(new String[] { "^Title", "^Desc",
> "^FieldTitle1", "^FieldTitle2", "^FieldTitle3", "^FieldTitle4",
> "^Bio", "^AuthorName", "^AKA", "^Goals", "^FullName", "^Notes",
> "^Outcome", "^Goal", "^Conflict", "^RTFFile", "^ImageFile" });
>
> of.setPreserveSpace(false);
> of.setIndenting(true);
> if (!useWorkaroundForBogusXmlFile)
> of.setEncoding("ISO-8859-1");
>
> XMLSerializer serializer = new XMLSerializer(of);
> serializer.setOutputCharStream(osw);
>
> return serializer;
> }
>
> public void save(File file) {
> if (yW5 != null)
> try {
> JAXBContext context =
> JAXBContext.newInstance(YWRITER5.class);
>
> Marshaller m = context.createMarshaller();
> m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
> Boolean.TRUE);
> m.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
>
> FileOutputStream fos = new FileOutputStream(file);
> OutputStreamWriter osw;
> osw = new OutputStreamWriter(fos, "ISO-8859-1");
> XMLSerializer w = getXMLSerializer(osw);
> try {
> m.marshal(yW5, w);
> dirty = false;
> } finally {
> try {
> osw.close();
> } catch (Exception e) {
> }
> }
>
> } catch (Exception e1) {
> e1.printStackTrace();
> }
>
> }
>
>
> Can something like that be used with EMF?
> Otherwise I will have to stick with JAXB, I fear.
>
> Regards
> Mauro


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: Is EMF suitable to implement key/keyref pairs? [message #505447 is a reply to message #505104] Wed, 30 December 2009 13:26 Go to previous messageGo to next message
Mauro Condarelli is currently offline Mauro CondarelliFriend
Messages: 428
Registered: September 2009
Senior Member
Ed Merks wrote:
> Mauro,
>
> You've have to create a specialized version of XMLSaveImpl (specialize
> XMLResourceImpl.createXMLSave) and initialize escape (in the init
> method) with a specialized implementation of XMLSaveImpl.Escape which
> uses CDATA always (see the existing implementations of the various
> convert methods). That should give you complete control.

Unfortunately this proved difficult because of visibility issues.
Even copying the whole XMLSaveImpl gives several errors:

The field XMLSaveImpl.Escape.allowControlCharacters is not visible
MyXMLSaveImpl.java /it.condarelli.rcp.writer.model/src/Yw5 line 31

The field XMLSaveImpl.Escape.mappableLimit is not visible
MyXMLSaveImpl.java /it.condarelli.rcp.writer.model/src/Yw5 line 30

The field XMLSaveImpl.Escape.useCDATA is not visible
MyXMLSaveImpl.java /it.condarelli.rcp.writer.model/src/Yw5 line 32

The field XMLSaveImpl.Escape.value is not visible MyXMLSaveImpl.java
/it.condarelli.rcp.writer.model/src/Yw5 line 29

I fear I should copy out the whole package in order to make this work.
Am I doing something wrong?

My general idea was to add an OPTION_FORCE_CDATA with a String value
holding a space (or comma) separated list of tags whose Text should be
in CDATA format (similar to my current implementation) that would mean,
probably, to modify just getDatatypeValue() (the other call to
convertText() looks uninteresting) to check if the current tag is in the
list and then wrap it unconditionally with CDATA (after check for "]]"!)
without calling escape.convertText() at all.
Would this be acceptable? (I can contribute the changes, of course).
Problem with this approach is, however, I *think* in getDatatypeValue()
I already lost information about the current tag. Is this correct? is
there an easy way to recover it? or should I act at an higher level?
(getDataTypeElementSingleSimple()/getContent()/saveElement() probably
just the latter).

Did I miss something? Am I on a completely wrong track?

TiA
Mauro
Re: Is EMF suitable to implement key/keyref pairs? [message #505455 is a reply to message #505447] Wed, 30 December 2009 21:21 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33137
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------000304010102090500010309
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Mauro,

Comments below.

Mauro Condarelli wrote:
> Ed Merks wrote:
>> Mauro,
>>
>> You've have to create a specialized version of XMLSaveImpl
>> (specialize XMLResourceImpl.createXMLSave) and initialize escape (in
>> the init method) with a specialized implementation of
>> XMLSaveImpl.Escape which uses CDATA always (see the existing
>> implementations of the various convert methods). That should give
>> you complete control.
>
> Unfortunately this proved difficult because of visibility issues.
> Even copying the whole XMLSaveImpl gives several errors:
>
> The field XMLSaveImpl.Escape.allowControlCharacters is not visible
> MyXMLSaveImpl.java /it.condarelli.rcp.writer.model/src/Yw5 line
> 31
Are you created a derived nested Escape class in your derived XMLSaveImpl?
>
> The field XMLSaveImpl.Escape.mappableLimit is not visible
> MyXMLSaveImpl.java /it.condarelli.rcp.writer.model/src/Yw5 line
> 30
>
> The field XMLSaveImpl.Escape.useCDATA is not visible
> MyXMLSaveImpl.java /it.condarelli.rcp.writer.model/src/Yw5 line
> 32
>
> The field XMLSaveImpl.Escape.value is not visible
> MyXMLSaveImpl.java /it.condarelli.rcp.writer.model/src/Yw5 line 29
>
> I fear I should copy out the whole package in order to make this work.
> Am I doing something wrong?
Not sure what you did. This seems to work fine though:

public class LibraryResourceImpl extends XMLResourceImpl {
/**
* Creates an instance of the resource.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param uri the URI of the new resource.
* @generated
*/
public LibraryResourceImpl(URI uri) {
super(uri);
}

@Override
protected XMLSave createXMLSave() {
return new XMLSaveImpl(createXMLHelper()) {
class MyEscape extends Escape
{
public MyEscape() {
this.allowControlCharacters = false;
}
}
};
}

} //LibraryResourceImpl

>
> My general idea was to add an OPTION_FORCE_CDATA with a String value
> holding a space (or comma) separated list of tags whose Text should be
> in CDATA format (similar to my current implementation) that would
> mean, probably, to modify just getDatatypeValue() (the other call to
> convertText() looks uninteresting) to check if the current tag is in
> the list and then wrap it unconditionally with CDATA (after check for
> "]]"!) without calling escape.convertText() at all.
There might be other ways, but I imagine that simply using CDATA for all
convertText calls would produce what you want; it's called for element
content...
> Would this be acceptable? (I can contribute the changes, of course).
> Problem with this approach is, however, I *think* in
> getDatatypeValue() I already lost information about the current tag.
> Is this correct?
It knows whether it's dealing with an attribute verses an element.
That's all it should need to know.
> is there an easy way to recover it? or should I act at an higher
> level? (getDataTypeElementSingleSimple()/getContent()/saveElement()
> probably just the latter).
>
> Did I miss something? Am I on a completely wrong track?
Probably something simple in how to derived the class.
>
> TiA
> Mauro

--------------000304010102090500010309
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Mauro,<br>
<br>
Comments below.<br>
<br>
Mauro Condarelli wrote:
<blockquote cite="mid:hhg59p$v9q$1@build.eclipse.org" type="cite">Ed
Merks wrote:
<br>
<blockquote type="cite">Mauro,
<br>
<br>
You've have to create a specialized version of XMLSaveImpl (specialize
XMLResourceImpl.createXMLSave) and initialize escape (in the init
method) with a specialized implementation of XMLSaveImpl.Escape which
uses CDATA always (see the existing implementations of the various
convert methods).&nbsp; That should give you complete control.
<br>
</blockquote>
<br>
Unfortunately this proved difficult because of visibility issues.
<br>
Even copying the whole XMLSaveImpl gives several errors:
<br>
<br>
The field XMLSaveImpl.Escape.allowControlCharacters is not visible
MyXMLSaveImpl.java&nbsp;&nbsp;&nbsp; /it.condarelli.rcp.writer.model/src/Yw5&nbsp;&nbsp;& amp;nbsp; line
31&nbsp;&nbsp;&nbsp; <br>
</blockquote>
Are you created a derived nested Escape class in your derived
XMLSaveImpl?<br>
<blockquote cite="mid:hhg59p$v9q$1@build.eclipse.org" type="cite"><br>
The field XMLSaveImpl.Escape.mappableLimit is not visible
MyXMLSaveImpl.java&nbsp;&nbsp;&nbsp; /it.condarelli.rcp.writer.model/src/Yw5&nbsp;&nbsp;& amp;nbsp; line
30&nbsp;&nbsp;&nbsp; <br>
<br>
The field XMLSaveImpl.Escape.useCDATA is not visible
MyXMLSaveImpl.java&nbsp;&nbsp;&nbsp; /it.condarelli.rcp.writer.model/src/Yw5&nbsp;&nbsp;& amp;nbsp; line
32&nbsp;&nbsp;&nbsp; <br>
<br>
The field XMLSaveImpl.Escape.value is not visible&nbsp;&nbsp;&nbsp; MyXMLSaveImpl.java
/it.condarelli.rcp.writer.model/src/Yw5&nbsp;&nbsp;& amp;nbsp; line 29&nbsp;&nbsp;&nbsp; <br>
<br>
I fear I should copy out the whole package in order to make this work.
<br>
Am I doing something wrong?
<br>
</blockquote>
Not sure what you did.&nbsp; This seems to work fine though:<br>
<blockquote><small>public class LibraryResourceImpl extends
XMLResourceImpl {</small><br>
<small>&nbsp;&nbsp;&nbsp; /**</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;* Creates an instance of the resource.</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;* &lt;!-- begin-user-doc --&gt;</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;* &lt;!-- end-user-doc --&gt;</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;* @param uri the URI of the new resource.</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;* @generated</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;*/</small><br>
<small>&nbsp;&nbsp;&nbsp; public LibraryResourceImpl(URI uri) {</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; super(uri);</small><br>
<small>&nbsp;&nbsp;&nbsp; }</small><br>
<small>&nbsp;&nbsp;&nbsp; </small><br>
<small>&nbsp;&nbsp;&nbsp; @Override</small><br>
<small>&nbsp;&nbsp;&nbsp; protected XMLSave createXMLSave() {</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new XMLSaveImpl(createXMLHelper()) {</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; class MyEscape extends Escape</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public MyEscape() {</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.allowControlCharacters = false;</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</small><br>
<small>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; };</small><br>
<small>&nbsp;&nbsp;&nbsp; }</small><br>
<br>
<small>} //LibraryResourceImpl</small><br>
</blockquote>
<blockquote cite="mid:hhg59p$v9q$1@build.eclipse.org" type="cite"><br>
My general idea was to add an OPTION_FORCE_CDATA with a String value
holding a space (or comma) separated list of tags whose Text should be
in CDATA format (similar to my current implementation) that would mean,
probably, to modify just getDatatypeValue() (the other call to
convertText() looks uninteresting) to check if the current tag is in
the list and then wrap it unconditionally with CDATA (after check for
"]]"!) without calling escape.convertText() at all.
<br>
</blockquote>
There might be other ways, but I imagine that simply using CDATA for
all convertText calls would produce what you want; it's called for
element content...<br>
<blockquote cite="mid:hhg59p$v9q$1@build.eclipse.org" type="cite">Would
this be acceptable? (I can contribute the changes, of course).
<br>
Problem with this approach is, however, I *think* in getDatatypeValue()
I already lost information about the current tag. Is this correct?</blockquote>
It knows whether it's dealing with an attribute verses an element.&nbsp;
That's all it should need to know.<br>
<blockquote cite="mid:hhg59p$v9q$1@build.eclipse.org" type="cite"> is
there an easy way to recover it? or should I act at an higher level?
(getDataTypeElementSingleSimple()/getContent()/saveElement() probably
just the latter).
<br>
<br>
Did I miss something? Am I on a completely wrong track?
<br>
</blockquote>
Probably something simple in how to derived the class.<br>
<blockquote cite="mid:hhg59p$v9q$1@build.eclipse.org" type="cite"><br>
TiA
<br>
Mauro
<br>
</blockquote>
</body>
</html>

--------------000304010102090500010309--


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: Is EMF suitable to implement key/keyref pairs? [message #505486 is a reply to message #505455] Thu, 31 December 2009 05:08 Go to previous messageGo to next message
Mauro Condarelli is currently offline Mauro CondarelliFriend
Messages: 428
Registered: September 2009
Senior Member
Thanks again, Ed.

Ed Merks wrote:
>> Am I doing something wrong?
> Not sure what you did. This seems to work fine though:
>
> public class LibraryResourceImpl extends XMLResourceImpl {
> /**
> * Creates an instance of the resource.
> * <!-- begin-user-doc -->
> * <!-- end-user-doc -->
> * @param uri the URI of the new resource.
> * @generated
> */
> public LibraryResourceImpl(URI uri) {
> super(uri);
> }
>
> @Override
> protected XMLSave createXMLSave() {
> return new XMLSaveImpl(createXMLHelper()) {
> class MyEscape extends Escape
> {
> public MyEscape() {
> this.allowControlCharacters = false;
> }
> }
> };
> }
>
> } //LibraryResourceImpl
>
This is funny and, I believe, a bug in eclipse dependency handling:
I wrote the following code (copying Yours):
==============================
package Yw5;

public class MyResourceImpl extends XMLResourceImpl {

public MyResourceImpl(URI uri) {
super(uri);
}

@Override
protected XMLSave createXMLSave() {
return new XMLSaveImpl(createXMLHelper()) {
class MyEscape extends Escape
{
public MyEscape() {
this.allowControlCharacters = false;
}
}
};
}

}
==============================
Hitting Ctrl-Shift-O produces the following:
==============================
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.xmi.XMLSave;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.Escape;
==============================
where the last line is in error:
The type org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.Escape is not visible
Manually removing the offending line results in a valid source :)
Should I file a bug somewhere?

Anyways I implemented the following (I think this is what You suggested):
==============================
package Yw5.util;

import java.util.Map;

import org.eclipse.emf.common.util.URI;

import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.XMLSave;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;

/**
* <!-- begin-user-doc -->
* The <b>Resource </b> associated with the package.
* <!-- end-user-doc -->
* @see Yw5.util.Yw5ResourceFactoryImpl
* @generated
*/
public class Yw5ResourceImpl extends XMLResourceImpl {
/**
* Creates an instance of the resource.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param uri the URI of the new resource.
* @generated
*/
public Yw5ResourceImpl(URI uri) {
super(uri);
}

@Override
protected XMLSave createXMLSave() {

return new XMLSaveImpl(createXMLHelper()) {
private static final int MAX_UTF_MAPPABLE_CODEPOINT = 0x10FFFF;
private static final int MAX_LATIN1_MAPPABLE_CODEPOINT = 0xFF;
private static final int MAX_ASCII_MAPPABLE_CODEPOINT = 0x7F;

protected void init(XMLResource resource, Map<?, ?> options) {
super.init(resource, options);
System.out.println("XMLSaveImpl.init: fixing escape");
escape = new MyEscape();
if (escape != null)
{
int maxSafeChar = MAX_UTF_MAPPABLE_CODEPOINT;
if (encoding != null)
{
if (encoding.equalsIgnoreCase("ASCII") ||
encoding.equalsIgnoreCase("US-ASCII"))
{
maxSafeChar = MAX_ASCII_MAPPABLE_CODEPOINT;
}
else if (encoding.equalsIgnoreCase("ISO-8859-1"))
{
maxSafeChar = MAX_LATIN1_MAPPABLE_CODEPOINT;
}
}

escape.setMappingLimit(maxSafeChar);
if (!"1.0".equals(xmlVersion))
{
escape.setAllowControlCharacters(true);
}


escape.setUseCDATA(Boolean.TRUE.equals(options.get(XMLResour ce.OPTION_ESCAPE_USING_CDATA)));
}
// if (escapeURI != null)
// escapeURI = escape;
}

class MyEscape extends Escape
{
public MyEscape() {
this.allowControlCharacters = false;
System.out.println("MyEscape.MyEscape()");
}
@Override
public String convertText(String input) {
//TODO: check for "]]"
return "<![CDATA[" + input + "]]>";
}
}
};
}

} //Yw5ResourceImpl
==============================
and it dutifully adds CDATA escape to ALL Text (see below)
>>
>> My general idea was to add an OPTION_FORCE_CDATA with a String value
>> holding a space (or comma) separated list of tags whose Text should be
>> in CDATA format (similar to my current implementation) that would
>> mean, probably, to modify just getDatatypeValue() (the other call to
>> convertText() looks uninteresting) to check if the current tag is in
>> the list and then wrap it unconditionally with CDATA (after check for
>> "]]"!) without calling escape.convertText() at all.
> There might be other ways, but I imagine that simply using CDATA for all
> convertText calls would produce what you want; it's called for element
> content...
>> Would this be acceptable? (I can contribute the changes, of course).
>> Problem with this approach is, however, I *think* in
>> getDatatypeValue() I already lost information about the current tag.
>> Is this correct?
> It knows whether it's dealing with an attribute verses an element.
> That's all it should need to know.
>> is there an easy way to recover it? or should I act at an higher
>> level? (getDataTypeElementSingleSimple()/getContent()/saveElement()
>> probably just the latter).
Unfortunately this does NOT work in my environment.
I should unconditionally add CDATA escape only to the text/content of a
well-defined set of tags.
The paragraphs above are thus relevant.
Is there any way I can get hold of the currently active (innermost
nesting) tag in Escape.convertText()?
Otherwise: what is the best place to put a check? I assume I should act
at the SaveImpl.saveElement() level because after that I will have no
connection with the tag. Is this correct?

<nitpicking>
[generate tests] actually generates (among other things) XxxExample.java
which includes the following lines:
...
// Iterate over all the arguments.
//
for (int i = 0; i < args.length; ++i) {
// Construct the URI for the instance file.
// The argument is treated as a file path only if it
denotes an existing file.
// Otherwise, it's directly treated as a URL.
//
File file = new File(args[i]);
URI uri = file.isFile() ?
URI.createFileURI(file.getAbsolutePath()): URI.createURI(args[0]);
...
The last, IMHO, should be: URI.createURI(args[i]);
</nitpicking>


TiA
Mauro
Re: Is EMF suitable to implement key/keyref pairs? [message #505497 is a reply to message #505486] Thu, 31 December 2009 11:51 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33137
Registered: July 2009
Senior Member
Mauro,

Comments below.

Mauro Condarelli wrote:
> Thanks again, Ed.
>
> Ed Merks wrote:
>>> Am I doing something wrong?
>> Not sure what you did. This seems to work fine though:
>>
>> public class LibraryResourceImpl extends XMLResourceImpl {
>> /**
>> * Creates an instance of the resource.
>> * <!-- begin-user-doc -->
>> * <!-- end-user-doc -->
>> * @param uri the URI of the new resource.
>> * @generated
>> */
>> public LibraryResourceImpl(URI uri) {
>> super(uri);
>> }
>> @Override
>> protected XMLSave createXMLSave() {
>> return new XMLSaveImpl(createXMLHelper()) {
>> class MyEscape extends Escape
>> {
>> public MyEscape() {
>> this.allowControlCharacters = false;
>> }
>> }
>> };
>> }
>>
>> } //LibraryResourceImpl
>>
> This is funny and, I believe, a bug in eclipse dependency handling:
> I wrote the following code (copying Yours):
> ==============================
> package Yw5;
>
> public class MyResourceImpl extends XMLResourceImpl {
>
> public MyResourceImpl(URI uri) {
> super(uri);
> }
>
> @Override
> protected XMLSave createXMLSave() {
> return new XMLSaveImpl(createXMLHelper()) {
> class MyEscape extends Escape
> {
> public MyEscape() {
> this.allowControlCharacters = false;
> }
> }
> };
> }
>
> }
> ==============================
> Hitting Ctrl-Shift-O produces the following:
> ==============================
> import org.eclipse.emf.common.util.URI;
> import org.eclipse.emf.ecore.xmi.XMLSave;
> import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
> import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;
> import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.Escape;
> ==============================
> where the last line is in error:
> The type org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.Escape is not visible
> Manually removing the offending line results in a valid source :)
> Should I file a bug somewhere?
Yes, I noticed too that quite a few things about this weren't working as
well as JDT normally works. Certainly you could file a JDT bugzilla;
they'd expect you to produce a self contained test case, not just point
off at the EMF source...
>
> Anyways I implemented the following (I think this is what You suggested):
> ==============================
> package Yw5.util;
>
> import java.util.Map;
>
> import org.eclipse.emf.common.util.URI;
>
> import org.eclipse.emf.ecore.xmi.XMLResource;
> import org.eclipse.emf.ecore.xmi.XMLSave;
> import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
> import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;
>
> /**
> * <!-- begin-user-doc -->
> * The <b>Resource </b> associated with the package.
> * <!-- end-user-doc -->
> * @see Yw5.util.Yw5ResourceFactoryImpl
> * @generated
> */
> public class Yw5ResourceImpl extends XMLResourceImpl {
> /**
> * Creates an instance of the resource.
> * <!-- begin-user-doc -->
> * <!-- end-user-doc -->
> * @param uri the URI of the new resource.
> * @generated
> */
> public Yw5ResourceImpl(URI uri) {
> super(uri);
> }
>
> @Override
> protected XMLSave createXMLSave() {
>
> return new XMLSaveImpl(createXMLHelper()) {
> private static final int MAX_UTF_MAPPABLE_CODEPOINT =
> 0x10FFFF;
> private static final int MAX_LATIN1_MAPPABLE_CODEPOINT =
> 0xFF;
> private static final int MAX_ASCII_MAPPABLE_CODEPOINT = 0x7F;
>
> protected void init(XMLResource resource, Map<?, ?>
> options) {
> super.init(resource, options);
> System.out.println("XMLSaveImpl.init: fixing escape");
> escape = new MyEscape();
> if (escape != null)
> {
> int maxSafeChar = MAX_UTF_MAPPABLE_CODEPOINT;
> if (encoding != null)
> {
> if (encoding.equalsIgnoreCase("ASCII") ||
> encoding.equalsIgnoreCase("US-ASCII"))
> {
> maxSafeChar = MAX_ASCII_MAPPABLE_CODEPOINT;
> }
> else if (encoding.equalsIgnoreCase("ISO-8859-1"))
> {
> maxSafeChar = MAX_LATIN1_MAPPABLE_CODEPOINT;
> }
> }
>
> escape.setMappingLimit(maxSafeChar);
> if (!"1.0".equals(xmlVersion))
> {
> escape.setAllowControlCharacters(true);
> }
>
>
> escape.setUseCDATA(Boolean.TRUE.equals(options.get(XMLResour ce.OPTION_ESCAPE_USING_CDATA)));
>
> }
> // if (escapeURI != null)
> // escapeURI = escape;
> }
>
> class MyEscape extends Escape
> {
> public MyEscape() {
> this.allowControlCharacters = false;
I only included this to show that the field was accessible. It's
redundant given booleans are initialized to false.
> System.out.println("MyEscape.MyEscape()");
> }
> @Override
> public String convertText(String input) {
> //TODO: check for "]]"
> return "<![CDATA[" + input + "]]>";
> }
> }
> };
> }
>
> } //Yw5ResourceImpl
> ==============================
> and it dutifully adds CDATA escape to ALL Text (see below)
>>>
>>> My general idea was to add an OPTION_FORCE_CDATA with a String value
>>> holding a space (or comma) separated list of tags whose Text should
>>> be in CDATA format (similar to my current implementation) that would
>>> mean, probably, to modify just getDatatypeValue() (the other call to
>>> convertText() looks uninteresting) to check if the current tag is in
>>> the list and then wrap it unconditionally with CDATA (after check
>>> for "]]"!) without calling escape.convertText() at all.
>> There might be other ways, but I imagine that simply using CDATA for
>> all convertText calls would produce what you want; it's called for
>> element content...
>>> Would this be acceptable? (I can contribute the changes, of course).
>>> Problem with this approach is, however, I *think* in
>>> getDatatypeValue() I already lost information about the current tag.
>>> Is this correct?
>> It knows whether it's dealing with an attribute verses an element.
>> That's all it should need to know.
>>> is there an easy way to recover it? or should I act at an higher
>>> level? (getDataTypeElementSingleSimple()/getContent()/saveElement()
>>> probably just the latter).
> Unfortunately this does NOT work in my environment.
> I should unconditionally add CDATA escape only to the text/content of
> a well-defined set of tags.
Bummer.
> The paragraphs above are thus relevant.
> Is there any way I can get hold of the currently active (innermost
> nesting) tag in Escape.convertText()?
Hmmm. I think you already noticed getDatatypeValue is one of the places
where convertText is called. At this point the feature is known and
that feature determines the tag so that seems a good place to focus.
> Otherwise: what is the best place to put a check? I assume I should
> act at the SaveImpl.saveElement() level because after that I will have
> no connection with the tag. Is this correct?
>
> <nitpicking>
> [generate tests] actually generates (among other things)
> XxxExample.java which includes the following lines:
> ...
> // Iterate over all the arguments.
> //
> for (int i = 0; i < args.length; ++i) {
> // Construct the URI for the instance file.
> // The argument is treated as a file path only if it
> denotes an existing file.
> // Otherwise, it's directly treated as a URL.
> //
> File file = new File(args[i]);
> URI uri = file.isFile() ?
> URI.createFileURI(file.getAbsolutePath()): URI.createURI(args[0]);
> ...
> The last, IMHO, should be: URI.createURI(args[i]);
> </nitpicking>
Nits are good to pick! Please open a bugzilla for EMF Tools!!
>
>
> TiA
> Mauro


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: Is EMF suitable to implement key/keyref pairs? [message #505536 is a reply to message #505497] Thu, 31 December 2009 20:13 Go to previous message
Mauro Condarelli is currently offline Mauro CondarelliFriend
Messages: 428
Registered: September 2009
Senior Member
Ed Merks wrote:
> Mauro,
>
> Comments below.
>
> Mauro Condarelli wrote:
>> Thanks again, Ed.
>> I should unconditionally add CDATA escape only to the text/content of
>> a well-defined set of tags.
> Bummer.
>> The paragraphs above are thus relevant.
>> Is there any way I can get hold of the currently active (innermost
>> nesting) tag in Escape.convertText()?
> Hmmm. I think you already noticed getDatatypeValue is one of the places
> where convertText is called. At this point the feature is known and
> that feature determines the tag so that seems a good place to focus.
BINGO!!
The following Works for me:
=================================
try {
Map<String, Object> opt = new HashMap<String, Object>();
opt.put(Yw5.util.Yw5ResourceImpl.OPTION_FORCE_CDATA, "Title Desc
FieldTitle1 FieldTitle2 FieldTitle3 FieldTitle4 Bio AuthorName AKA Goals
FullName Notes Outcome Goal Conflict RTFFile ImageFile");
resource.setURI(URI.createFileURI("C:\\TEMP\\with-opt.yw5"));
resource.save(opt);
} catch (IOException e) {
e.printStackTrace();
}
=================================
/**
* <copyright>
* </copyright>
*
* $Id$
*/
package Yw5.util;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.impl.EAttributeImpl;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.XMLSave;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;

/**
* <!-- begin-user-doc -->
* The <b>Resource </b> associated with the package.
* <!-- end-user-doc -->
* @see Yw5.util.Yw5ResourceFactoryImpl
* @generated=no
*/
public class Yw5ResourceImpl extends XMLResourceImpl {
/**
* Creates an instance of the resource.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param uri the URI of the new resource.
* @generated
*/
public Yw5ResourceImpl(URI uri) {
super(uri);
}

public static final String OPTION_FORCE_CDATA = "FORCE_CDATA";

@Override
protected XMLSave createXMLSave() {

return new XMLSaveImpl(createXMLHelper()) {
private static final int MAX_UTF_MAPPABLE_CODEPOINT = 0x10FFFF;
private static final int MAX_LATIN1_MAPPABLE_CODEPOINT = 0xFF;
private static final int MAX_ASCII_MAPPABLE_CODEPOINT = 0x7F;


protected void init(XMLResource resource, Map<?, ?> options) {
super.init(resource, options);
System.out.println("XMLSaveImpl.init: fixing escape");
escape = new MyEscape();
if (escape != null)
{
int maxSafeChar = MAX_UTF_MAPPABLE_CODEPOINT;
if (encoding != null)
{
if (encoding.equalsIgnoreCase("ASCII") ||
encoding.equalsIgnoreCase("US-ASCII"))
{
maxSafeChar = MAX_ASCII_MAPPABLE_CODEPOINT;
}
else if (encoding.equalsIgnoreCase("ISO-8859-1"))
{
maxSafeChar = MAX_LATIN1_MAPPABLE_CODEPOINT;
}
}

escape.setMappingLimit(maxSafeChar);
if (!"1.0".equals(xmlVersion))
{
escape.setAllowControlCharacters(true);
}


escape.setUseCDATA(Boolean.TRUE.equals(options.get(XMLResour ce.OPTION_ESCAPE_USING_CDATA)));

((MyEscape)escape).setForceCdata((String)options.get(OPTION_ FORCE_CDATA));
}
// if (escapeURI != null)
// escapeURI = escape;
}
private String currentTag = null;
private Set<String> forceCdata = null;
protected String getDatatypeValue(Object value,
EStructuralFeature f, boolean isAttribute)
{
if (f instanceof EAttributeImpl) {
EAttributeImpl ai = (EAttributeImpl) f;
String n = ai.getExtendedMetaData().getName();
String ns = ai.getExtendedMetaData().getNamespace();
currentTag = (ns != null)? ns+":"+n: n;
}
return super.getDatatypeValue(value, f, isAttribute);
}

class MyEscape extends Escape
{
public MyEscape() {
this.allowControlCharacters = false;
System.out.println("MyEscape.MyEscape()");
}
@Override
public String convertText(String input) {
//TODO: check for "]]"
if (forceCdata != null) {
//System.out.print("convertText:
'"+currentTag+"' in "+forceCdata);
if (forceCdata.contains(currentTag)) {
//System.out.println("? YES!");
return "<![CDATA[" + input + "]]>";
} else {
//System.out.println("? NO :(");
}
}
return super.convertText(input);
}
public void setForceCdata(String s) {
if (s != null) {
String[] sa = s.split("\\s+");
Set<String> set = new HashSet<String>();
for (String t : sa) {
set.add(t);
}
forceCdata = set;
} else
forceCdata = null;
}
}
};
}

} //Yw5ResourceImpl
=================================
This is not real good for several reasons, including, but not limited
to, usage of instance variables to carry information between different
classes, but I can surely live with it ;)

Now I will have to convert my app to use this model, but I should be
able to handle this.

MANY THANKS!!!!

Happy New Year!
Mauro.
Re: Is EMF suitable to implement key/keyref pairs? [message #505542 is a reply to message #505536] Thu, 31 December 2009 18:02 Go to previous message
Ed Merks is currently offline Ed MerksFriend
Messages: 33137
Registered: July 2009
Senior Member
Mauro,

Comments below.

Mauro Condarelli wrote:
> Ed Merks wrote:
>> Mauro,
>>
>> Comments below.
>>
>> Mauro Condarelli wrote:
>>> Thanks again, Ed.
>>> I should unconditionally add CDATA escape only to the text/content
>>> of a well-defined set of tags.
>> Bummer.
>>> The paragraphs above are thus relevant.
>>> Is there any way I can get hold of the currently active (innermost
>>> nesting) tag in Escape.convertText()?
>> Hmmm. I think you already noticed getDatatypeValue is one of the
>> places where convertText is called. At this point the feature is
>> known and that feature determines the tag so that seems a good place
>> to focus.
> BINGO!!
> The following Works for me:
> =================================
> try {
> Map<String, Object> opt = new HashMap<String, Object>();
> opt.put(Yw5.util.Yw5ResourceImpl.OPTION_FORCE_CDATA, "Title Desc
> FieldTitle1 FieldTitle2 FieldTitle3 FieldTitle4 Bio AuthorName AKA
> Goals FullName Notes Outcome Goal Conflict RTFFile ImageFile");
> resource.setURI(URI.createFileURI("C:\\TEMP\\with-opt.yw5"));
> resource.save(opt);
> } catch (IOException e) {
> e.printStackTrace();
> }
> =================================
> /**
> * <copyright>
> * </copyright>
> *
> * $Id$
> */
> package Yw5.util;
>
> import java.util.HashSet;
> import java.util.Map;
> import java.util.Set;
>
> import org.eclipse.emf.common.util.URI;
> import org.eclipse.emf.ecore.EStructuralFeature;
> import org.eclipse.emf.ecore.impl.EAttributeImpl;
> import org.eclipse.emf.ecore.xmi.XMLResource;
> import org.eclipse.emf.ecore.xmi.XMLSave;
> import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
> import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;
>
> /**
> * <!-- begin-user-doc -->
> * The <b>Resource </b> associated with the package.
> * <!-- end-user-doc -->
> * @see Yw5.util.Yw5ResourceFactoryImpl
> * @generated=no
> */
> public class Yw5ResourceImpl extends XMLResourceImpl {
> /**
> * Creates an instance of the resource.
> * <!-- begin-user-doc -->
> * <!-- end-user-doc -->
> * @param uri the URI of the new resource.
> * @generated
> */
> public Yw5ResourceImpl(URI uri) {
> super(uri);
> }
>
> public static final String OPTION_FORCE_CDATA = "FORCE_CDATA";
>
> @Override
> protected XMLSave createXMLSave() {
>
> return new XMLSaveImpl(createXMLHelper()) {
> private static final int MAX_UTF_MAPPABLE_CODEPOINT =
> 0x10FFFF;
> private static final int MAX_LATIN1_MAPPABLE_CODEPOINT =
> 0xFF;
> private static final int MAX_ASCII_MAPPABLE_CODEPOINT = 0x7F;
>
>
> protected void init(XMLResource resource, Map<?, ?>
> options) {
> super.init(resource, options);
> System.out.println("XMLSaveImpl.init: fixing escape");
> escape = new MyEscape();
> if (escape != null)
> {
> int maxSafeChar = MAX_UTF_MAPPABLE_CODEPOINT;
> if (encoding != null)
> {
> if (encoding.equalsIgnoreCase("ASCII") ||
> encoding.equalsIgnoreCase("US-ASCII"))
> {
> maxSafeChar = MAX_ASCII_MAPPABLE_CODEPOINT;
> }
> else if (encoding.equalsIgnoreCase("ISO-8859-1"))
> {
> maxSafeChar = MAX_LATIN1_MAPPABLE_CODEPOINT;
> }
> }
>
> escape.setMappingLimit(maxSafeChar);
> if (!"1.0".equals(xmlVersion))
> {
> escape.setAllowControlCharacters(true);
> }
>
>
> escape.setUseCDATA(Boolean.TRUE.equals(options.get(XMLResour ce.OPTION_ESCAPE_USING_CDATA)));
>
>
> ((MyEscape)escape).setForceCdata((String)options.get(OPTION_ FORCE_CDATA));
>
> }
> // if (escapeURI != null)
> // escapeURI = escape;
> }
> private String currentTag = null;
> private Set<String> forceCdata = null;
> protected String getDatatypeValue(Object value,
> EStructuralFeature f, boolean isAttribute)
> {
> if (f instanceof EAttributeImpl) {
You shouldn't need to test for an AbcImpl class, just Abc should be enough.
> EAttributeImpl ai = (EAttributeImpl) f;
> String n = ai.getExtendedMetaData().getName();
> String ns = ai.getExtendedMetaData().getNamespace();
> currentTag = (ns != null)? ns+":"+n: n;
I imagine you should be able to test whether this is a feature that
needs special attention rather than testing later the feature's name.
Likely the constants in XyzPackage.Literals.ABC__DEF will be perfect for
testing. Perhaps you could even do the "escaping" directly here and
avoid dealing with a specialized Escape entirely.
> }
> return super.getDatatypeValue(value, f, isAttribute);
> }
>
> class MyEscape extends Escape
> {
> public MyEscape() {
> this.allowControlCharacters = false;
> System.out.println("MyEscape.MyEscape()");
> }
> @Override
> public String convertText(String input) {
> //TODO: check for "]]"
> if (forceCdata != null) {
> //System.out.print("convertText:
> '"+currentTag+"' in "+forceCdata);
> if (forceCdata.contains(currentTag)) {
> //System.out.println("? YES!");
> return "<![CDATA[" + input + "]]>";
> } else {
> //System.out.println("? NO :(");
> }
> }
> return super.convertText(input);
> }
> public void setForceCdata(String s) {
> if (s != null) {
> String[] sa = s.split("\\s+");
> Set<String> set = new HashSet<String>();
> for (String t : sa) {
> set.add(t);
> }
> forceCdata = set;
> } else
> forceCdata = null;
> }
> }
> };
> }
>
> } //Yw5ResourceImpl
> =================================
> This is not real good for several reasons, including, but not limited
> to, usage of instance variables to carry information between different
> classes, but I can surely live with it ;)
>
> Now I will have to convert my app to use this model, but I should be
> able to handle this.
>
> MANY THANKS!!!!
>
> Happy New Year!
> Mauro.


Ed Merks
Professional Support: https://www.macromodeling.com/
Previous Topic:cross resouce containment and validation
Next Topic:Loading ecore model from a standalone java app
Goto Forum:
  


Current Time: Fri Apr 19 15:08:06 GMT 2024

Powered by FUDForum. Page generated in 0.03483 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top