Application Design: Where to implement historical revisions of objects

Application Design: Where to implement historical revisions of objects

am 23.05.2007 22:10:42 von Colin Ross

------=_Part_36145_5363987.1179951042584
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Summary:
In a situation where the business model dictates that a certain entity or
class of entities should support the viewing of and differencing of
historical revisions of the data (read properties) contained in the entity
should be supported. Should the logic for the creation and viewing of this
historical information be implemented in the application itself

In Practice:
An application has a model class of "PageContent" which represents the
content that is shown on a certain page. Users of the system are
authenticated, then able to edit the content. From an application design point
of view, where should the logic and underlying system be for the management
of historical revisions.

My specifics include using PHP (5) and Postgre (7.4). I am using the
Table/Row gateways provided by the Zend Framework as a base for my model
objects.
I don't have a large need to remain rdbms-neutral and am fine with a
solution the "locks me in" to using postgre as this will eventually be a
hosted application in a controlled environment.

Option 1 (Implemented in the database/persistence layer):
This would follow the path of logic that stems from seeing the database
as not just a dumb container-- but as the manager and more of a rich
container if you will. When a user updates a certain row (represented as an
entity in the application), the database manages the auditing of the
historical data via triggers (ON UPDATE,ON DELETE) using an audit table with
a similar DDL of the base table, with the addition of audit-specific fields
(like revision id/version/etc). The 'current' version of the data always
remains in the base table, and the application, in its basic functionality,
remains unaware of such functionality, except with the ability to query the
audit table.

Option 2 (Implemented in the Application Layer):
This would see the database as a dumb container, and the model classes on
the application side of 'the boundary' would implement the logic of saving
the revision is a separate table (or potentially in the same table). All the
logic for automagically creating a new revision record on update/delete/etc.
would be handled in the application layer.

Questions:
Which would you choose and why? Outside of (and even including) portability
complaints for the application? From a best practices / theory
point-of-view which is best? Why? Or is the truly a religious debate with
no real right or wrong?

Colin Ross

I have posted this on the zf-general (ZendFramework) and pgsql-php
(Postrge-php) mailing lists to see the differences in views from the two
crowds, abit separately to avoid confusing cross-posting between
communities.

------=_Part_36145_5363987.1179951042584
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Summary:
In a situation where the business model dictates that a certain entity or class of entities should support the viewing of and differencing of historical revisions of the data (read properties) contained in the entity should be supported. Should the logic for the creation and viewing of this historical information be implemented in the application itself


In Practice:
An application has a model class of "PageContent" which represents the content that is shown on a certain page. Users of the system are authenticated, then able to edit the content. From an
application design point of view, where should the logic and underlying system be for the management of historical revisions.

My specifics include using PHP (5) and Postgre (
7.4). I am using the Table/Row gateways provided by the Zend Framework as a base for my model objects.
I don't have a large need to remain rdbms-neutral and am fine with a solution the "locks me in" to using postgre as this will eventually be a hosted application in a controlled environment.


Option 1 (Implemented in the database/persistence layer):
   This would follow the path of logic that stems from seeing the database as not just a  dumb container-- but as the manager and more of a rich container if you will. When a user updates a certain row (represented as an entity in the application), the database manages the auditing of the historical data via triggers (ON UPDATE,ON DELETE) using an audit table with a similar DDL of the base table, with the addition of audit-specific fields (like revision id/version/etc).  The 'current' version of the data always remains in the base table, and the application, in its basic functionality, remains unaware of such functionality, except with the ability to query the audit table.


Option 2 (Implemented in the Application Layer):
 
This would see the database as a dumb container, and the model classes on the application side of 'the boundary' would implement the logic of saving the revision is a separate table (or potentially in the same table). All the logic for automagically creating a new revision record on update/delete/etc. would be handled in the application layer.


Questions:
Which would you choose and why?  Outside of (and even including) portability complaints for the application?  From a best practices / theory point-of-view which is best? Why?  Or is the truly a religious debate with no real right or wrong?


Colin Ross

I have posted this on the zf-general (ZendFramework) and pgsql-php (Postrge-php) mailing lists to see the differences in views from the two crowds, abit separately to avoid confusing cross-posting between communities.



------=_Part_36145_5363987.1179951042584--

Re: Application Design: Where to implement historical revisionsof objects

am 24.05.2007 02:34:04 von dmagick

Colin Ross wrote:
> Summary:
> In a situation where the business model dictates that a certain entity
> or class of entities should support the viewing of and differencing of
> historical revisions of the data (read properties) contained in the
> entity should be supported. Should the logic for the creation and
> viewing of this historical information be implemented in the application
> itself

If you are only going to be using postgres, do it with a trigger so you
don't have to remember to do it in the application (it's quite easy to
forget something like this).

If you have to support other databases as well, then make sure they
support triggers.

If you have to use a database that doesn't support triggers, then that
makes the decision for you (eg supporting mysql 4.1).

If you have to do it in the app, it's still quite easy:

insert into history_table (...) select x,y,z from orig_table where id='X'

Done :)

--
Postgresql & php tutorials
http://www.designmagick.com/

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

Re: Application Design: Where to implement historical revisions of objects

am 25.05.2007 19:41:08 von Michelle Konzack

--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hello Colin,

Am 2007-05-23 13:10:42, schrieb Colin Ross:
> In Practice:
> An application has a model class of "PageContent" which represents the
> content that is shown on a certain page. Users of the system are
> authenticated, then able to edit the content. From an application design=
=20
> point
> of view, where should the logic and underlying system be for the manageme=
nt
> of historical revisions.

I have something similar, exactly, a Database of military data and data
sets are never modified but added.

So, I give each dataset a serialnumber and a revision 0. Then if the
dataset was modified I change the revision to a higher number and add
the whole dataset into a new row.

This thing is done using trigers.

Greetings
Michelle Konzack
Systemadministrator
Tamay Dogan Network
Debian GNU/Linux Consultant


--=20
Linux-User #280138 with the Linux Counter, http://counter.li.org/
##################### Debian GNU/Linux Consultant #####################
Michelle Konzack Apt. 917 ICQ #328449886
50, rue de Soultz MSN LinuxMichi
0033/6/61925193 67100 Strasbourg/France IRC #Debian (irc.icq.com)

--BOKacYhQ+x31HxR3
Content-Type: application/pgp-signature; name="signature.pgp"
Content-Description: Digital signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFGVx+zC0FPBMSS+BIRAqSUAJ46cUH9sdWaZjyzC2C7T6j7ndQ0CgCg tmr8
1Ow8kJV7UEvW9HNnqhAtRYA=
=BkKz
-----END PGP SIGNATURE-----

--BOKacYhQ+x31HxR3--

Re: Application Design: Where to implement historical revisions of objects

am 25.05.2007 20:07:24 von Colin Ross

------=_Part_3849_4216922.1180116444453
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

But in the one-table holds all system, the Model Object need to know about
it.
i.e. "Select top 1 from data where serialnumber = 3821 order by revision
desc"
And off hand, it would make retrieving a whole data set of say- all the
current data involve a subquery to find the most recent data revision for
each serialnumber.

I don't at all mean to discount the system, but I have yet to find a good
pattern for dealing with multiple variants of the same datarow/set.

Colin

On 5/25/07, Michelle Konzack wrote:
>
> Hello Colin,
>
> Am 2007-05-23 13:10:42, schrieb Colin Ross:
> > In Practice:
> > An application has a model class of "PageContent" which represents the
> > content that is shown on a certain page. Users of the system are
> > authenticated, then able to edit the content. From an application design
> > point
> > of view, where should the logic and underlying system be for the
> management
> > of historical revisions.
>
> I have something similar, exactly, a Database of military data and data
> sets are never modified but added.
>
> So, I give each dataset a serialnumber and a revision 0. Then if the
> dataset was modified I change the revision to a higher number and add
> the whole dataset into a new row.
>
> This thing is done using trigers.
>
> Greetings
> Michelle Konzack
> Systemadministrator
> Tamay Dogan Network
> Debian GNU/Linux Consultant
>
>
> --
> Linux-User #280138 with the Linux Counter, http://counter.li.org/
> ##################### Debian GNU/Linux Consultant #####################
> Michelle Konzack Apt. 917 ICQ #328449886
> 50, rue de Soultz MSN LinuxMichi
> 0033/6/61925193 67100 Strasbourg/France IRC #Debian (irc.icq.com)
>
>

------=_Part_3849_4216922.1180116444453
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

But in the one-table holds all system, the Model Object need to know about it.
  i.e. "Select top 1 from data where serialnumber = 3821 order by revision desc"
And off hand, it would make retrieving a whole data set of say- all the current data involve a subquery to find the most recent data revision for each serialnumber.


I don't at all mean to discount the system, but I have yet to find a good pattern for dealing with multiple variants of the same datarow/set.

Colin

On 5/25/07,
Michelle Konzack
<> wrote:

Hello Colin,

Am 2007-05-23 13:10:42, schrieb Colin Ross:
> In Practice:
> An application has a model class of "PageContent" which represents the
> content that is shown on a certain page. Users of the system are

> authenticated, then able to edit the content. From an application design
> point
> of view, where should the logic and underlying system be for the management
> of historical revisions.

I have something similar, exactly, a Database of military data and data

sets are never modified but added.

So, I give each dataset a serialnumber and a revision 0. Then if the
dataset was modified I change the revision to a higher number and add
the whole dataset into a new row.


This thing is done using trigers.

Greetings
    Michelle Konzack
    Systemadministrator
    Tamay Dogan Network
    Debian GNU/Linux Consultant


--
Linux-User #280138 with the Linux Counter,

##################### Debian GNU/Linux Consultant #####################
Michelle Konzack   Apt. 917                  ICQ #328449886
                   50, rue de Soultz         MSN LinuxMichi

0033/6/61925193    67100 Strasbourg/France   IRC #Debian ()




------=_Part_3849_4216922.1180116444453--

Re: Application Design: Where to implement historical revisions of objects

am 25.05.2007 20:15:12 von Michelle Konzack

--VcZjVMblxkg0/8Ur
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Am 2007-05-25 11:07:24, schrieb Colin Ross:
> But in the one-table holds all system, the Model Object need to know about
> it.
> i.e. "Select top 1 from data where serialnumber =3D 3821 order by revisi=
on
> desc"

You do not need to know what the last revision was,
since you can automagicaly SELECT the higest one...

Thanks, Greetings and nice Day
Michelle Konzack
Systemadministrator
Tamay Dogan Network
Debian GNU/Linux Consultant


--=20
Linux-User #280138 with the Linux Counter, http://counter.li.org/
##################### Debian GNU/Linux Consultant #####################
Michelle Konzack Apt. 917 ICQ #328449886
50, rue de Soultz MSN LinuxMichi
0033/6/61925193 67100 Strasbourg/France IRC #Debian (irc.icq.com)

--VcZjVMblxkg0/8Ur
Content-Type: application/pgp-signature; name="signature.pgp"
Content-Description: Digital signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFGVyewC0FPBMSS+BIRAuG9AKC4NIl2EJFO5fB8of7MOs9PeDnSRwCc C9B7
QDt41qXkS5ju64y6Hbx/w0M=
=T8TS
-----END PGP SIGNATURE-----

--VcZjVMblxkg0/8Ur--

Re: Application Design: Where to implement historical revisions of objects

am 08.06.2007 19:17:05 von Ray Garrison

This is a multi-part message in MIME format.

------=_NextPart_000_016C_01C7A9CF.4FF6D790
Content-Type: multipart/alternative;
boundary="----=_NextPart_001_016D_01C7A9CF.4FF6D790"


------=_NextPart_001_016D_01C7A9CF.4FF6D790
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7bit

There is no question in my mind that this kind of auditing must be done at
the database level. Otherwise, any time you access the underlying database
directly and update any tables monitored by the audit log you break your
audit trail.



I've heard arguments made that access to the database should be restricted
to the application front end only, thus negating the possibility of someone
directly updating the data and circumventing the audit process, but in 25
years of IT experience I have *NEVER* *ONCE* seen an environment where that
was practical 100% of the time.





Ray Garrison, CIO



420 East Main Street

Bld 2, Suite 2

Branford, CT 06405



203.315.8637 Office

203.315.0429 Fax

www.periship.com

_____

From: Colin Ross [mailto:colinross@gmail.com]
Sent: Wednesday, May 23, 2007 4:11 PM
To: pgsql-php@postgresql.org
Subject: [PHP] Application Design: Where to implement historical revisions
of objects



Summary:
In a situation where the business model dictates that a certain entity or
class of entities should support the viewing of and differencing of
historical revisions of the data (read properties) contained in the entity
should be supported. Should the logic for the creation and viewing of this
historical information be implemented in the application itself

In Practice:
An application has a model class of "PageContent" which represents the
content that is shown on a certain page. Users of the system are
authenticated, then able to edit the content. From an application design
point of view, where should the logic and underlying system be for the
management of historical revisions.

My specifics include using PHP (5) and Postgre ( 7.4). I am using the
Table/Row gateways provided by the Zend Framework as a base for my model
objects.
I don't have a large need to remain rdbms-neutral and am fine with a
solution the "locks me in" to using postgre as this will eventually be a
hosted application in a controlled environment.

Option 1 (Implemented in the database/persistence layer):
This would follow the path of logic that stems from seeing the database
as not just a dumb container-- but as the manager and more of a rich
container if you will. When a user updates a certain row (represented as an
entity in the application), the database manages the auditing of the
historical data via triggers (ON UPDATE,ON DELETE) using an audit table with
a similar DDL of the base table, with the addition of audit-specific fields
(like revision id/version/etc). The 'current' version of the data always
remains in the base table, and the application, in its basic functionality,
remains unaware of such functionality, except with the ability to query the
audit table.

Option 2 (Implemented in the Application Layer):
This would see the database as a dumb container, and the model classes on
the application side of 'the boundary' would implement the logic of saving
the revision is a separate table (or potentially in the same table). All the
logic for automagically creating a new revision record on update/delete/etc.
would be handled in the application layer.

Questions:
Which would you choose and why? Outside of (and even including) portability
complaints for the application? From a best practices / theory
point-of-view which is best? Why? Or is the truly a religious debate with
no real right or wrong?

Colin Ross

I have posted this on the zf-general (ZendFramework) and pgsql-php
(Postrge-php) mailing lists to see the differences in views from the two
crowds, abit separately to avoid confusing cross-posting between
communities.


------=_NextPart_001_016D_01C7A9CF.4FF6D790
Content-Type: text/html;
charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

xmlns:o=3D"urn:schemas-microsoft-com:office:office" =
xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:st1=3D"urn:schemas-microsoft-com:office:smarttags" =
xmlns=3D"http://www.w3.org/TR/REC-html40">


charset=3Dus-ascii">

namespaceuri=3D"urn:schemas-microsoft-com:office:smarttags" =
name=3D"PostalCode"/>
namespaceuri=3D"urn:schemas-microsoft-com:office:smarttags"
name=3D"Street"/>
namespaceuri=3D"urn:schemas-microsoft-com:office:smarttags"
name=3D"City" =
downloadurl=3D"http://www.5iamas-microsoft-com:office:smartt ags"/>
namespaceuri=3D"urn:schemas-microsoft-com:office:smarttags"
name=3D"address"/>
namespaceuri=3D"urn:schemas-microsoft-com:office:smarttags"
name=3D"State"/>
namespaceuri=3D"urn:schemas-microsoft-com:office:smarttags"
name=3D"place" downloadurl=3D"http://www.5iantlavalamp.com/"/>









style=3D'font-size:
10.0pt;font-family:Arial;color:navy'>There is no question in my mind =
that this
kind of auditing must be done at the database level.  Otherwise, =
any time
you access the underlying database directly and update any tables =
monitored by
the audit log you break your audit trail.



style=3D'font-size:
10.0pt;font-family:Arial;color:navy'> 



style=3D'font-size:
10.0pt;font-family:Arial;color:navy'>I’ve heard arguments made =
that
access to the database should be restricted to the application front end =
only,
thus negating the possibility of someone directly updating the data and
circumventing the audit process, but in 25 years of IT experience I have =
* style=3D'font-weight:bold'>NEVER
* * style=3D'font-weight:bold'>ONCE*
seen an environment where that was practical 100% of the =
time.



style=3D'font-size:
10.0pt;font-family:Arial;color:navy'> 





color=3Dblack
face=3DArial> style=3D'font-size:12.0pt;font-family:Arial;color:black'>  >



style=3D'text-indent:9.0pt;line-height:150%'> color=3Dblack face=3DArial> style=3D'font-size:10.0pt;line-height:150%;
font-family:Arial;color:black;font-weight:bold'>Ray Garrison, =
CIO



size=3D3
color=3Dnavy face=3D"Times New Roman"> style=3D'font-size:12.0pt;line-height:
150%;color:navy'> style=3D'text-decoration:
none'> src=3D"cid:image002.jpg@01C7A9CF.4F3CFD70">

color=3Dblack>



w:st=3D"on"> style=3D"BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: =
url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x"
tabIndex=3D"0" w:st=3D"on"> face=3DArial> style=3D'font-size:10.0pt;font-family:Arial;color:black'>420 East Main =
Street
color=3Dblack>



color=3Dblack
face=3DArial> style=3D'font-size:10.0pt;font-family:Arial;color:black'>Bld 2, =
style=3D"BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: =
url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x"
tabIndex=3D"0" w:st=3D"on">Suite =
2



style=3D"BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: =
url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x"
tabIndex=3D"0" w:st=3D"on"> style=3D"BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: =
url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x"
tabIndex=3D"0" w:st=3D"on"> face=3DArial> =
style=3D'font-size:10.0pt;font-family:Arial;color:black'>Bra nford<=
/font> size=3D2 color=3Dblack face=3DArial> style=3D'font-size:10.0pt;font-family:Arial;
color:black'>, CT w:st=3D"on">06405
size=3D2 color=3Dblack face=3DArial> style=3D'font-size:10.0pt;font-family:Arial;
color:black'>



color=3Dblack
face=3DArial> style=3D'font-size:10.0pt;font-family:Arial;color:black'>  >



color=3Dblack
face=3DArial> style=3D'font-size:10.0pt;font-family:Arial;color:black'>203 .315.8637<=
span
style=3D'font-weight:bold'> =
Office



color=3Dblack
face=3DArial> style=3D'font-size:10.0pt;font-family:Arial;color:black'>203 .315.0429
style=3D'font-weight:bold'>Fax



color=3Dblack
face=3DArial> style=3D'font-size:10.0pt;font-family:Arial;color:black;
font-weight:bold'> title=3D"http://www.periship.com/">www.periship.com
=
size=3D2 color=3Dblack face=3DArial> style=3D'font-size:10.0pt;font-family:Arial;
color:black;font-weight:bold'>







size=3D3
face=3D"Times New Roman">






style=3D'font-size:10.0pt;
font-family:Tahoma;font-weight:bold'>From:
size=3D2
face=3DTahoma> Colin =
Ross
[mailto:colinross@gmail.com]

Sent: Wednesday, May 23, =
2007 4:11
PM

To: =
pgsql-php@postgresql.org

Subject: [PHP] =
Application Design:
Where to implement historical revisions of =
objects





style=3D'font-size:
12.0pt'> 



style=3D'font-size:12.0pt;font-weight:bold'>Summary: =


In a situation where the business model dictates that a certain entity =
or class
of entities should support the viewing of and differencing of historical
revisions of the data (read properties) contained in the entity should =
be
supported. Should the logic for the creation and viewing of this =
historical
information be implemented in the application itself



In Practice:

An application has a model class of "PageContent" =
which
represents the content that is shown on a certain page. Users of the =
system are
authenticated, then able to edit the content. From an style=3D'font-style:italic'>application design point of view, =
where
should the logic and underlying system be for the management of =
historical
revisions.



My specifics include using PHP (5) and Postgre ( 7.4). I am using the =
Table/Row
gateways provided by the Zend Framework as a base for my model =
objects.

I don't have a large need to remain rdbms-neutral and am fine with a =
solution
the "locks me in" to using postgre as this will eventually be =
a
hosted application in a controlled environment.



Option 1 (Implemented in the
database/persistence layer):

   This would follow the path of logic that stems =
from
seeing the database as not just a  dumb container-- but as the =
manager and
more of a rich container if you will. When a user updates a certain row
(represented as an entity in the application), the database manages the
auditing of the historical data via triggers (ON UPDATE,ON DELETE) using =
an
audit table with a similar DDL of the base table, with the addition of
audit-specific fields (like revision id/version/etc).  The =
'current'
version of the data always remains in the base table, and the =
application, in
its basic functionality, remains unaware of such functionality, except =
with the
ability to query the audit table.



Option 2 (Implemented in the =
Application
Layer):

 
This would see the database as a dumb container, and =
the
model classes on the application side of 'the boundary' would implement =
the
logic of saving the revision is a separate table (or potentially in the =
same
table). All the logic for automagically creating a new revision record =
on
update/delete/etc. would be handled in the application layer.



Questions:

Which would you choose and why?  Outside of (and even including)
portability complaints for the application?  From a best practices =
/
theory point-of-view which is best? Why?  Or is the truly a =
religious
debate with no real right or wrong?



Colin Ross



I have posted this on the zf-general (ZendFramework) and pgsql-php
(Postrge-php) mailing lists to see the differences in views from the two
crowds, abit separately to avoid confusing cross-posting between =
communities.









------=_NextPart_001_016D_01C7A9CF.4FF6D790--

------=_NextPart_000_016C_01C7A9CF.4FF6D790
Content-Type: image/jpeg;
name="image002.jpg"
Content-Transfer-Encoding: base64
Content-ID:

/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgN DRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/ wAARCAA1AIQDASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA AgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcY GRolJicoKSo0NTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKT lJWWl5iZmqKjpKWm
p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP0 9fb3+Pn6/8QAHwEA
AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQA AQJ3AAECAxEEBSEx
BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2 Nzg5OkNERUZHSElK
U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOk paanqKmqsrO0tba3
uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMB AAIRAxEAPwD36iiv
Fbn40eI5PE2raPo/g1tSbT7iSJjBI7NtVyoYgKcZxQB7VRXj+lfHFoNag0zx f4autCadgEnkLbRn
uwZQce4zXsAIIyDkGgAooooAKKK5rXvGuiaHr2m6Df3MsV7qZCwhIyQMttGT 2yeBQBtyXZLmO2hM
7g4JB2op92/oM1GYtTk+9c28PtHEXP5k/wBK5Lx/8R7TwKLPTrTT5NR1e7H+ j2UXGFzgE4BPJ4AA
ycGuUT4veLtIuoH8U+Bp7SwmcJ58YddmTgZ3ZH4Eiq5rbIR6t9k1IcrqgPs1 upH6EU0z6rbczW0N
1GOptyVcf8Bbg/nXNfEDx5N4LvNBghsI7oapcmBi8hXyxlRkYBz979K7enz9 0FivaXsF9GXgfO07
XVgQyH0IPINWKxPEE9pottJ4huLg20Vmm65ZU3ebF/dI7nOMf/Xqbw54h0/x VodvrGlyO9pPkLvX
awIJBBH1FKSXQEatFFFSMKKKKACvnz4deINI8P8AxZ8cS6vqVtYxy3Eqo08g UMfOY4Ga+g6+c/A3
hLQ/FvxX8bW+uWIu4oLmV41MjJtJmYZ+UigC18b/ABfoHizTdK0PQLiPVNSN 2HVrYbgoKldoPcsS
OB6fSvTNf8aaf8OfCmlJq5kudQaCOCK1h5kmdVAY+wz39+9aWheAPCvhq5Fz pOiW1vcAYExBdx9G
Ykj8K8o8ff2tcftC6LDYvYrcpaKbL+0Qxg3YkOcLznOce4FAHR2/xpks762T xR4R1PQrK6YLFeTZ
ZBn+8Cq/pk+1db498cQeBvDkWsvZtfRyzrCqRyhfvAkNnB44/WuS8T+FPiX4 u0GfRtTuvCn2aYqS
0ccwdSpBBUnODx+RNY3xe0280b4H6Hpl/Mk11aXEEMkkZJVtqOBjPPTFAG3r 3xutdJmVrLw/fajY
xhRd3sRxFE5GSgbaQxGcHkc1p6/4y0eDxh4Rtbrw79ou9TVZLW5uFVZLTeQO hBIPPODXV+GtNtLH
whpdhBAi2yWka+XtBByoJyO+SST9a8x+Jf8AyWvwB/10H/owUAVPitHqnhD4 maN4/hsje6dDEIJl
A/1Z+YEE/wAOQ/B9RXpnhjxl4c8eaYzadcRz5X9/ZzKPMT2ZD1HuMitx5LO8 kuLCRoZmVB51u2G+
Vs43KexwfyNeDfFLwPB8O7iz8beEpjp7pcqklsrfICckFR/dOCCvTmgDY+Ps 8VrfeDbiZtkUV87u
2M4UGMk/lWjqPxpubCNNTbwVq/8Awj7uFXUZPk3AnhgpXGD2yRmsb4y3S6ov w9u3iAW6uFkaNhkA
N5Rwfzr0r4jxo/w18RIygqLCUgEcAhcj9QKAJNW8S6W/w+uvEaQLqOmNZG48 lgAJUxypBB+hBFZO
l+NNPtfhIviux0UWtjBCzpp8TKoULIVwCBgevSuP8PszfstXO45xY3QH08x6 j07/AJNUl/69Jf8A
0eaALMHx8eW2W7PgjV/sZGfPjbcuO5B2gH8605vFI+IFraX/AIZnvpLaFsXF tA/lzRSc/fAYdRja
2SoIOa2vg/z8KNB/65P/AOjGriPB8UOnftIeJLLSQEsXtmaaOMYRXxGx47Yc n6ZNAHtFis6WFst0
265ESiU+r4Gf1zRU9FABXnfgj4f6j4Y8c+JNduru1lt9Vkd4ki3bkBkLDdkY 6HtXolFABXDfEb4c
weOba1uILtrDWLI7ra7UHjnO1sc4zyCOQa7migDxxPB3xhuohY3njezhtPum aEZlI+oQHP8AwIVv
eNvhzfeIfhzpvhiw1GNprOSItc3hb94FVlJOATkk5r0WigCvp9u1pptrbOQz QwpGxHQkACuK8W+B
b/xB8QPDPiC3uraO20pw0scm7e/z7vlwMfnXe0UAeceOfh1rOteJIvEvhnxF JpWrRwCBlbIjdQSR
yPr0IIrnR8KfGfivUbRvHvieK6062feLW1/j/JVAz0zgnFe00UAcB8Q/AN74 tuvDj6dPa20WlXHm
uku4ZXKYC4B7LXUeKdJm13wpquk28iRzXlq8KPJnapYYBOO1a9FAHn2l+AtQ sfg5N4NkurZr2SCa
ITLu8sF3Zh2z39KytY8O3PhP9njUNEvJopp7a1cM8Odp3S7hjIB6GvVq434r /wDJLfEH/Xt/7MKA
PMvAuifFC58Bab/wj/iXTrfSriNvLSaP95ANzAgHYe+T1716R8PPh1b+B7a6 nmu2v9XvTuurtx15
ztGecZJJJ5JpPg9/ySjQf+uT/wDoxq7igAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKZLFH
PE0U0aSRsMMjqCD9QaKKACKGK3iWKGNI41+6iKAB9AKfRRQAUUUUAf/Z

------=_NextPart_000_016C_01C7A9CF.4FF6D790--