User:Dan Nessett/Technical/Notes on Refactoring CZ

From Citizendium, the Citizens' Compendium
Jump to: navigation, search

Things to do for MW standard extension upgrade

On Special:Version the line:
MediaWiki	1.13.2 (modified) (r99)
has a link next to r99. This points to svn.wikimedia. It should point to svn.citizendium. This needs to be fixed.

Where to get svn_load_dirs.pl and configure it

You can get svn_load_dirs.ph.in here: svn_load_dirs directory Edit the file and (around line 26) change the following line:
< my $svn = '@SVN_BINDIR@/svn';
by replacing @SVN_BINDIR@/svn by the directory in which svn resides. For Ubuntu the line would like like:
< my $svn = '/usr/bin/svn';

Steps for upgrade

Pre-upgrade

  • merge LocalSettings on the live wiki with that on the test wiki and keep the results around for use during the upgrade process. (Done)
  • install php-xml on both locke and reid (Done)

Upgrade process

  • Switch en.citizendium.org so it points only to reid.
  • On locke:
  • Change /etc/httpd/conf.d/en.citizendium.org to comment out /wiki Alias and add testing Alias
  • Change LocalSettings so $wgScript equals testing path
  • move mediawiki to mediawikibackup.
  • create a new mediawiki directory.
  • checkout CZ_Refactor_1_13_2_0 into the new mediawiki directory (this is the revision currently running on the test wiki).
  • soft link images and fix up the logo pointers.
  • test locke.citizendium.org using the test data in section below.
  • If the tests pass:
  • Change /etc/httpd/conf.d/en.citizendium.org to restore /wiki Alias
  • Change LocalSettings so $wgScript equals /wiki
  • switch en.citizendium.org to point to locke.
  • Wait 24 hours to see if any problems arise.
  • During 24 hour wait period, perform same upgrade steps on reid that were applied to locke.
  • If no problems arise during 24 test period, switch en.citizendium.org back into round-robin dns.
This process is flexible in the following ways:
  • If problems arise, it is easy to switch back to the old code by simply renaming the new mediawiki directory to something else and mediawikibackup to mediawiki.
  • If the new code somehow corrupts the db (extremely unlikely), we have the back up, which we can use to restore the wiki to its pre-upgrade state.

MW standard extensions to check

Extension Name Notes Status
CategoryTree The default limit on entries displayed is 200.
This is controlled by $wgCategoryTreeMaxChildren
Works
CharInsert Works
CheckUser Requires db schema changes
First execute php CheckUser/install.php
After executing install.php, do full db backup
Make sure error_reporting = E_ALL & ~E_NOTICE
and display_errors = Off in php.ini

Make sure schema is set to mediawiki
in LocalSettings.
Works
Cite Works
ConfirmAccount Works
ConfirmEdit Need to move setting of $wgGroupPermissions['sysop']['skipcaptcha'] = false;
into LocalSettings.php, since the defaults of the MW standard
are not the same as the CZ modified version. Also need to set

$ceAllowConfirmedEmail = true;
$wgCaptchaTriggers['addurl'] = false;
$wgCaptchaTriggers['createaccount'] = true;
$wgCaptchaTriggers['badlogin'] = false;

While the FancyCaptcha module is loaded, it is not used, since
by default $wgCaptchaClass = 'SimpleCaptcha';
and LocalSettings doesn't override this default.
Works
EmbedVideo Works
ExpandTemplates The default size of the input box is 11 chars. Have to add
the following to Mediawiki:common.css:
body.page-Special_ExpandTemplates textarea {
  width: 100%;
  padding-top: 0.1em;
  padding-right: 0.1em;
  padding-bottom: 0.1em;
  padding-left: 0.1em;
}

Tested on:
Mac OS X (FF,Safari,Opera)
Linux (FF, Opera, IE6 [over Wine], Chrome)
Windows Vista (IE, FF, Opera, Chrome)
Works
ImageMap Must have php-xml module installed. ImageMap uses class DOMDocument
and that is supplied by the php-xml module. Don't forget to restart
the httpd after installing php-xml.
Works

Fixed problem with
this extension by

installing php-xml using
yum. This module is
required in order to

use the class
DOMDocument.
inputbox Works
Newuserlog This extension is obsolete and
replaced by core functionality starting in 1.14.
So, if we upgrade to a more recent MW version,
we shouldn't bring this extension along.
Works
ParserFunctions Works
Renameuser Works
Timeline Works
TreeAndMenu This extension replaces Treeview4 which
is obsolete. TreeAndMenu is backwards
compatible with Treeview4, so the replacement,
should not cause problems.
(There are only 3 pages which reference
this extension and I have tested all of them.
Works
wikihiero Works

Refactoring issues

  • It appears many pages (including the Request Account page) has constables@citizendium.org hardwired in. There is no magic word available to access the $wgPasswordSender global variable or any other email address. This is something that the Citizendium extension should add (i.e., a magic word for the site's configured complaint email address).
  • It also appears that many Mediawiki namespace pages have http://en.citizendium.org hardwired. These should be changed to: {{SERVER}}{{SCRIPTPATH}}
  • For some reason Special:Popularpages doesn't work in the MW version, nor does it appear in the SpecialPages list.
Solved. Had $wgDisableCounters=true in LocalSettings. Changed it to false.
  • Conversely, Special:ExpandTemplates doesn't work in the CZ version, nor does it appear in the SpecialPages list.
Actually, it does work. However, it doesn't show up in the Special:SpecialPages list
Actually, it does show up in the Special:SpecialPages list. However, it is under "Other special pages", rather than "Wiki data and tools".

Test harness notes

Useful SQL commands

To display a list of all tables in a schema use:

MySQL

SHOW TABLES;

Postgresql

SELECT table_name FROM information_schema.tables WHERE table_schema = 'mediawiki';
To display a list of all databases use:

MySQL

SHOW DATABASES;

Postgresql

SELECT datname FROM pg_database;
To display a list of all columns in a table use:

MySQL

SHOW COLUMNS

Postgresql

SELECT column_name FROM information_schema.columns WHERE table_name ='table';

An idea to improve test suite performance

Dropping tables and repopulating them or dropping the database and recreating it is a pretty expensive operation. Doing so could significantly slow down the time it takes to run a test suite. Here is another option. I am not a db expert, so this idea may make no sense at all, but for the record:
  • Before the test suite runs, setup starts a transaction with an SQL BEGIN statement.
  • Setup notes the value of $wgDBtype and copies that value to $wgDBActualtype. It then changes $wgDBtype to point to a new class that implements the logic described here.
  • When the methods of the new class (which extends class Database) are called, most simply forward the call to methods in the class specified by $wgDBActualtype.
  • However, when doQuery() is called, the new class methods check to see if the operation is either a BEGIN or a COMMIT. If so, it is not executed (so all of the test suite traffic belongs to a single transaction).
  • All reads to the database are then dirty reads, so they return non-committed data.
  • When the test suite completes, a tear down facility CANCELs the transaction.
Here are some pros and cons of this scheme:

Pros

  • Each time a test runs the database (or a set of tables) need not be dropped and repopulated. This should significantly speedup the execution of a test suite.
  • With this facility tests could be run against a real database, which would relieve the test designer from creating a test database configuration for each test/test suite.
  • This approach allows fuzz testing of random data, since a test suite could run against a real database, not just a database architected specifically for the purpose of testing.

Cons

  • Introducing the intervening Database class changes the software under test. This would lessen the confidence that the test suite verifies that software.
  • It isn't clear this strategy will actually work. Since all tests run under the same transaction, the transaction sequence could get quite long and it may be the case that some DB software will croak.
  • There may be other changes to the db state that occur outside the auspices of the BEGIN/COMMIT transaction scope. This requires investigation.
  • It isn't clear that all supported database allow dirty reads inside of transaction blocks. This is another issue that requires investigation.
After some thought, I think the best way to approach this problem is create a small CZ db that has only the minimum data necessary for defining a test. A test designer would then copy this db and modify the resulting wiki with data necessary for the test to run. The modified db could then be dumped using pg_dump and put in a standard or configurable location. When the test is run, the test (or a context manager) drops the existing wiki db, recreates it and uses psql to load the test db into the wiki db. The test is then run. If it is useful to run tests in parallel, this approach requires some modification. In particular, each test needs to run off a unique db. So, you can't use the standard wiki db name. Each test would have to define a db name. It would then call psql to drop any existing version of this db, recreate it and use psql to load the test db into this newly created db. The test would than have to change $wgDBname to equal the test db name. Since LocalSettings defines $wgDBname, the extension approach specified in the Selenium Framework notes of 5/15/2010 where a test extension is called at the end of LocalSettings must be used to override $wgDBname (and perhaps $wgDBuser and $wgDBpassword ).

Testing data for MW standard extensions

Data for CategoryTree Special Page

Biology_tag
Engineering tag
Health Sciences tag
Sports tag

References to EmbedVideo

References to CharInsert

References to <ref>

References to ImageMap

References to InputBox

References to ParserFunctions

#exp

#if

#ifeq

#iferror

No References.

#ifexpr

#ifexist

#rel2abs

No References.

#switch

#time

#timel

No References.

#titleparts

No References.

References to Timeline

References to TreeAndMenu

{{#tree}}

{{#menu}}

  • Root1
    • Sub-item
    • Another sub-item
  • Root2
    • Sub-item
    • Another sub-item

References to Wikihiero

D&d =i=nSmswA1iq
r
Y1
wDAAY1
ib Z1
=V31A
HAt
a
A1ma
V31A
pH
D54
=n
=n
=Z2
Xn
n
nwwprSsp
p
ax
r
p W
xt
HA25A24mn
n
itP11xtHAt
t t
Wr&a&t
Hr
Z1
tA
Z1 N23
r
a
HV31A
n
nw
W
A2nTrdwA
A30A2z&A1&Z1 nbHr
Z1
Hp
t
D32
a
snn
nw
wA1=y
=f
izw&t A1Z2=t
=n
=Z2
iiit
D54
aD
d
t
Y1
D35
n
n
h
wwr
=n
mSaA1
Z2
=n
=Z2
pH
D54
=n
=n
=Z2
pHwywAwAt
xAst
z
n
X5
D54
=n
=n
=Z2
z
n
mwtt
xAst
ma
V31A
r
f
n
Z2
iiiD54=n
=Z2
mHtp
t
p
Y1
tA
N23 Z1
=n
=Z2
pH
D54
=n
=Z2
swW
sDmmr
V31A
n
=A1
HAt
a
A1nw
V31A
A1SwW
wr
HAAwY1
Z2
ia
mw
a
t W
iimma
mwHr
Z1
D50Z2
=V31A
ix
Y1
wSbA2=V31A
wSd
d
t
A2=V31AmddwA2
=V31A
n
swt
n
G7ib Z1
=V31A
ma
=V31A
wS
bA2=V31AD35
n
nititA2iwr
Z1

n
z&A1&Z1
n
N42
ma
=f
swwiwmddw
A2=fa
=f
TAAmS28n
=f
Hr
Z1
ir
r
=V31Amx
r
t
Y1
Z2
ib Z1
=V31A
swr
r
d
G37p
W
D&d n
=V31A
sD&d =A1r
f
n
=V31A
miit t
Y1
ir
y
xpr
r
ma=A1
D&z =A1
 
SmmD54
=V31A
=w=A1rbi
id
Hw
xAstnsAq
sAq
G7hA
D54
=V31A
=w=A1rM14wr
r
Smd
p t
P1
n
t
mH
a
V1mD
mD
mAwW=smH
a
mD
mD
mD
mD
msx
wiab=ssqddA30A1V1V20
V20
im=s
mstp
Y1
nkmmt
niwt
mA
ir
A=s=n
=Z2
p t
pt
mA
ir
A=s=n
=Z2
tA
N23 Z1
ma
V31A
Aa
ib
Z1
=s=n
=Z2
rmA
ir
AwF27
Z2
z
r
E27A2=s=n
=3
D
a
TAwD35iiit
D54
n
S
n
y
E20A24D35xpr
r
t
=f
D
a
TAwpr
r
D54
iw=n
=3
mM14wr
r
Stp
Z1
a
Z1
sAHY1=n
=3
tA
N23 Z1
fAtA9aTAww
ir
=f
wHmmiitA2n
U19
nwWiitmw
im=fn
t
mH
a
Z1
Z1
Z1
Z1
Z1
Z1
Z1
Z1
inxt
t Z1
HH
A25A24n=A1saHaa
=n
d
p t
P1
mt
Z6
n
t
tywZ2im=sD35z
p
zp
wa
a
A1Z1imaHaa
=n
=A1r
a
=V31A=w=A1
riw
N23 Z1
inwAAwmwnM14
wr
r
Sir
=n
=A1h
r
wraZ1Z1Z1wa
a
Z1wr=k
=W
=A1
ib
Z1
=A1msnn
nw
wA1Z1Z1=A1z&Dr&r A55=V31A
=w=A1mXn
n
nw W
pr
nV31AAp
Aa19prnxt
t Z1
q
n
iD32
a
=n=A1SwW
iit
ra
aHaa
=n
dwn
n
D54=n=A1r
d
D56D56=A1rr
x
Y1a
t
=A1mr
Z1
=A1
gmm=n=A1dAbM43N33
Z2
iA
r&r t
D5
N33
Z2
imiAq
t
HnZ3Anb
t
Spsst
Y1
V31AAwN33
Z2
imHn
a
n
q
wtN33
Z2
Sspp
t
N33
Z2
miiir
t
=srmWK5
Z2
imHn
a
Ap
d
wzA
Z2
D35
n
n&t&t
D35
n
stmXn
n
nwwpr
=f
aHaa
=n
ssAa18AA2=nwA1r
a
=n=A1rtA
N23 Z1
nwr
r
Hr
Z1
a
Z1
wy=A1
Sd
d
t
a
=A1DAAZ9
xt
sxprr
=n
=A1x
t
Q7ir
=n
=A1
zb
wr
n
Z9 t
Q7nnTrZ1
Z2
aHaa
=n
F21m=n
=A1
x
r
P8E23wA2q
r
iE21A24ib
E8=V31A=w=A1wAAwmwp
W
nM14wrr
N36
xt
t Z1
Z2
HrZ1gmmgmmZ9
tA
N23 Z1
HrZ1mn
n
mn
n
D54V31A
f
S28=n
=A1
HrZ1=A1gmm=n=A1HfAwI15
pwiw=f
m
iiit
D54
n
ns
swW
V22
a
V20 V20
V20
xbz&w t
Sny
=fwr
r
=s
r
mH
a
Z1 Z1
Ha
F51
Z2
=f
z&x&r wT11A24
mnbw
N33
Z2
iK1
n
D13
y
=f
=y
mxsbd
N33
Z2
mA
Aa11
a
H2
Y1
a
r
q
V12
Y1
swwrxntn
t
$riwwp
p
Z9
=n
=f
$br Z1
=f
r
=A1
iW
=A1
HrZ1X
t Z1
=A1mbbAAHD53
Y1
=f
D&d =f
n
=A1nm&a inin
t w
zp
Z1 Z1
n&D z
wr
A1
nm&a inin
t w
irwd
f
gbD54
=V31A
m
D&d n
=A1
inin
t w
riw
N23 Z1
p
n
r
a
=A1r
x
Y1
=V31A
twiw=V31A
m
z
z
Q7
xprrtmn
t y

D35
mA
ir
At
f
iWmd
d
wA2=V31An
=A1
D35
n
wA1HrZ1F21m=A1
stiw=A1mbbAAHD53Y1
=V31A
x
m
D35
=n
wA1aHaa
=n
r
a
=fwA1mr Z1
=f
iTi
t
A24=fwA1rstt pr
=f
n
t
snDmmXrdwAAHwAH
A24=fwA1D35
n
dmiit
a
=A1wDA
AY1
=V31A
=w=A1D35
n
iTi
t t
A24im=A1
$riwwp
p
Z9
=n
=f
$br Z1
=f
r=A1iw=A1
HrZ1X
t Z1
=A1mbbAAHD53
Y1
=f
aHaa
n
D&d =n
=f
n
=A1
nm&a inin
t W
zpZ1 Z1
n
D
z
wrA1nm&a inin
t w
riw
N23 Z1
p
n
nM14wr
r
N36n
t y
Aa13
Z1
=f
=y
mn
U19
nwW
iimwaHaa
=n
wSbZ9A2=n
=A1
n
=f
sta
Z1
wyii=A1xxAAmD41
mbbAAHD53
Y1
=fD&d =A1n
=f
nw
V31A
A1pwhAD54=V31A=w=A1
rbiN41
F18
N25mwp
p
wt
D54
sAq
sAq
G7md
p t
P1n
t
mH
a
V1mD
mD
mAwW=smH
a
mD
mD
mD
mD
msx
w
iab
Y1
=ssqddA30A1V1V20
V20
im=s
mst
p
wU21
Y1
n
km
mt
niwt
mA
ir
A=s=n
=Z2
p
t
ptmA
ir
A=s=n
=Z2
tA
N23 Z1
ma
V31A
AA24ibZ1=s=n
=Z2
rmA
ir
A
wF27Z2$rz
r
E27A2=s=n
=Z2
$bD
a
TAw
D35iiit
D54
=fn
S
n
y
E21D35xprr t
=f
wa&W&a A1Z1imnbma
V31A
AA24ib Z1
=f
n
xt
x t
A24a
Z1
=f
r
snn
nw
wA1 Z1 Z1
=f
D35
n
wxxAwr
A1
mHr
r
ib=s=n
=Z2
D
a
TAw
prr
D54
iw=n
=Z2
mM14wrr
N36
tpZ1aZ1D61D54=n
=3
tA
N23 Z1
fAtA9a
TAwwir
=f
wHmmiitA2n
U19
nwwiitmw
im=fn
t
mH
a
Z1
Z1
Z1
Z1
Z1
Z1
Z1
Z1
inxt
t Z1
HHA19a
n
=A1
saHaa
=n
d
p t
P1mt
Z6
=t
n
t
tywZ2im=sD35
z
p
zp
wa&W&a A1Z1im
HrZ1xxx=A1ma
V31A
w=A1rgs Z1
=V31A
$raHaa
n
inin
=V31A
=w=A1$briw
N23 Z1
p
n
in
wAAwmwZ1
n
M14wr
r
N36
D&d =i=n=f
n
=A1mG54A2mzpZ1 Z1
n&D z
wr
A1mAtwA24Hr Z1
=V31A
pHF22=n
=V31A
wA1ma
V31A
nTr Z1 r
a
=n
=f
anxn
x
=V31Ainin
=f
twriw
N23 Z1
p
n
n
D28 Z1
D35
n
n&t&t D35
n
stmXn
n
nwwpr
=f
iw=fmH
Y1
Xr
r
nfrf
r
tY1
Z2
nb
t
ma
V31A
twrir
t
N11
N14
d
ra Z1
HrZ1
N11
N14
d
ra Z1
r
km
mt
Y1
=V31AN11
N14
d
ra
Z1 Z1 Z1 Z1
mXn
n
nwwpr
n
iw
N23 Z1
p
n
iw
d
p t
P1riiit
D54
mXn
n
nwwpr
sqddwA30A1
Z2
im=sr
x
Y1
n
=V31A
++TXTEGsqdwim=srx=wn=k+sSmmD54
=V31A
Hn
a
=s=n
=Z2
rXn
n
nwwpr
mt
Z6
=V31Amniwt
t Z1
=V31A
$rr
S
D20A2wy$bsD&d A2d
p t
nsA2=n
=f
z
n
X5
D54
x
t
Y1
Z2
U23m&r wr
sD&d A2=A1r
f
n
=V31A
miit
t
Y1ir
y
xprrwmiwN23 Z1 p
n
wn
n
=A1im=fHn
a
snn
nw
wA1 B1
Z2
=A1X
r
dwA17A1 B1
Z2
mqAbF46=s=n
=Z2
kmmY1
n
=n
=Z2
HfAWI15V20 V20 V20 V20
 
V20 V20 V20
 
Z1 Z1 Z1 Z1
 
Z1 Z1 Z1
*
 
m
msswA1 B1
Z2
=A1Hn
a
snn
nw
wA1 B1
Z2
=A1D35
n
sxM12A2=A1n
=V31A
zAt
B1
V31A
t t
wr
B1
inin
t
=n
=A1
mz
M8
AF5Y1$raHaa
n
sbAN14ra$b
hAWD54pr
r
D54
=n
n
A
mx
t
Q7ma
=f
xprr
=n
r=sD35
n
wA1Hn
a
AmQ7=n
=y
D35
n
wA1mHr
r
ib=s=n
=Z2
aHaa
=n
=A1mt
Z6
=V31A=W=A1n=s=n
=Z2
gmm=n
=A1
stmXAAiitAa2
Z2
wa
W
a
t Z1
irq
n
A24=n
=V31A
T12A24ibZ1=V31A
mH
Y1
=V31Aq
n
iD32=V31AmA17A1 B1
Z2
=V31AsnD20A2=V31A
N41
t
B1V31AmA
ir
A=V31AprZ1=V31Anfrf
r
strx
t
Y1
Z2
nb
t
pHpHD54
=V31A
Xn
n
nwwprwn
n
=V31Aim=f
mqAbF46
D54
nsnn
nw
wA1 B1
Z2
=V31Awn
n
=V31Ar
f
dmAAU32Y1=V31A=W=A1HrZ1X
t Z1
=A1dmiiD41
=n
=A1
z
zA
AtwN23
Z2
mbbAAHD53
Y1
=f$rD&d =A1r
f
n
=V31A
$b
sD&d A2=A1G30Y1
Z2
=V31A
n
sAqsAqG7a
=A1
z
S
AY1
=f
maA
a
AY1
=V31A
a
=A1
inin
=t
n
=V31A
ibE8iHnqtHV31A
n
nw
W
N33
Z2
D54wd
n
bN33
Z2
X
z
AiitN33
Z2
snn
t
rtrN33
Z2
nAa13 Z1
Z2
pr
Z2
sHtp
t
pwY1nTrZ1nbim=fsD&d =A1r
f
xprr&t Y1
Z2
HrZ1=A1mmA
ir
At
Z2
=n
=A1mG30Y1
=f
nTrdwAAA30=t=wn
=V31A
mniwt
t Z1
x t
f
HrZ1q
n
btO38A1
Z2
tA
N23 Z1
rM36
r
=f$rz
f
t&T30 A24=A1$b
n
=V31A
D52E1Z1
Z2
mzbwr
n
Z9tQ7wS
n
H1
a
n
=A1
n
=V31A
ApdwzA
Z2
a
=A1
inin
=t
n
=V31A
HawP1
Z2
At
p
wA2A24
Xr
r
SpsssY1
Z2
nb
n
kmmtniwt
t Z1
miiir
r
tnnTrZ1mr
r
rA2
r
T
A1 B1
Z2
mtA
N23 Z1
wAAN31D35r
x
Y1swWrTA1B1Z2
$raHaa
=n
sbt
F18
A2=n
=f
im=A1mM22M22D&d =n
=A1
$bmn
f
wrmibZ1f
D&d =f
n
=A1D35wrrn
=V31A
a
n
G4W23
Z2
xprr&t nbnTrsnn
t
r
M6N33
Z2
nw
V31A
A1isHqAqAG7pwn
n
t
N25
a
n
G4W23
Z2
n
=A1
imswW
HV31A
n
nwWN33
Z2
p
f
D&d =n
=V31A
inin
t
=f
bwpWwrr
n
iw
N23 Z1
p
n
xprrisE9wd
D54
V31Atwrstt
pr
t
n
D35
z
p
zp
mA
ir
A=V31Aiw
N23 Z1
p
n
xprrmn
U19
nw
W
iimw$raHaa
=n
d
p t
P1t
f
$b
iiit
D54
miiz
r t
E27A2=n
=f
xntn
t
aHaa
=n
=A1SmmD54=V31A=W=A1
r
a
n
w
=A1HrZ1xt
t Z1
qAA28S32A2n
=A1
n
t
G4A1
Z2
mXnn
nw
Wpr=s
aHaa
=n
SmmD54=V31A=w=A1rsmiitA2stgmm=n
=A1
swWr
x
Y1st
aHaa
=n
D&d =n
=f
n
=A1
sn
b
=tzp
Z1 Z1
n&D z
wr
A1rprZ1=V31AmA
ir
A=V31A
X
r
dXrdA1 B1
Z2
=V31AiAa13m&a r
n
=A1nfrf
r
mniwt
t Z1
=V31Ama
V31A
Xr
r t
Y1
Z2
=A1
pWim=V31A
aHaa
=n
r
a
=n
w
A1HrZ1X
t Z1
=A1a
Z1
wy=A1xAAmA24mbbAAHD53Y1
=f
aHaa
=n
r
a
=n
=f
n
=A1
zbbtY1
Z2
ma
n
G4W23
Z2
HV31An
nw W
N33
Z2
D54wd
n
bN33
Z2
X
z
Aa17AiitN33
Z2
U33SpssN33
Z2
SAAa
z
O47F31sdmtN33
Z2
sdwM41
3
nwZ1m&a m&a F27U7
r
riitiw
Z2
aA
a
AtY1n
t
nTrsnn
t
r
M6N33
Z2
n&D HiitF18
Z2
n
t
AbbwT19T
z
mWE14
Z2
gwfE33Z3AV31AiiwE32Z3AA50ssY1
Z2
nbnfrf
r
$raHaa
=n
AtpA9a
=n
=A1st$brdptP1t
n
xprr
n
r
a
=t=w=A1HrZ1X
t Z1
=A1
rnTrdwAAA30n
=f
aHaa
=n
D&d =n
=f
n
=A1
ma
V31A
t
W
rspr
r
D54rXnn
nw
Wpr
n
Abd
d
ra
Z1Z1mH
Y1
=V31Aq
n
iD32=V31AmX
r
dwXrdA1 B1
Z2
=V31Arn
p
iirnp=V31A
mXnn
nw
Wprq
r
stQ6
a
=V31AaHaa
=n
hAD54=V31A=w=A1rmr
r
iitN23Z1
mhAwY1
Z2
d
p t
P1t
n
aHaa
=n
=A1HrZ1iASA2nmSaA1
Z2
n
t y
md
p t
P1t
n
r
a
=n
=A1
HV31A
n
nw
W
A2HrZ1mr
r
iitN23Z1n
nb
G7niw
N23 Z1
p
n
n
t
G4A1
Z2
im=srmiit
t
Y1ir
y
$rn
a
tP1p
W
ir
=n
=n
=Z2
$bmxdP1
rXnn
nw
wpr
n
sAqsAqG7spr
r
D54=n
=n
=Z2
r
Xnn
nw
Wpr
HrZ1Abd
dwA
d
ra
Z1Z1miiD&d t
=n
=f
nb
t
aHaa
=n
aqqD54=V31A=w=A1HrZ1sAqsAqG7
m&a zbD54=n
=A1
n
=f
ininw
Z2
p
n
inin
=n
=A1mXnn
nw
Wprniw
N23 Z1
p
n
aHaa
n
nTrdwAAA30=n
=f
n
=A1
x t
f
HrZ1q
n
btO38A1
Z2
tA
N23 Z1
rDr
r
=f
aHaa
=n
r
a
=V31A=wA1rSmsWA1
sAa18AHsAHY1
=V31A
=w=A1m
tpA1 B1
Z2
=fmA
ir
AwA1r
Aa18#bZ1#esAa18AHsAH
Y1
=A1tA
N23 Z1
rAa18Z1
mA
ir
A=A1d
p
t
F20
A2=n
=A1
sDmmr
=V31A
#bnr
Z1
#e=A1ma
V31A
nfrf
r
sDmmnr
T
A1 B1
Z2
aHaa
=n
D&d =n
=f
n
=A1
miriq
r
Y1A1
x
n
T34msA21A1inmr&a&t mw
#bnA#ep
d
zAHDD&ra tA
N23 Z1
n
z
f
t
T31
a
=fdwAAra
D54w=f
p W
HAt
t Z1
=f
rpH=f
=y
miigmmiitmzSY1
#bmzSY1#ezSA1iq
r
Y1
nDbaDbaDba=f
i#bmn
n
#eiizAimn
n
aA
a
AY1A1anxDAs
D36Aa16Z4X1