[Zope-dev] Request for comments: Directory storage

Stuart 'Zen' Bishop zen@cs.rmit.edu.au
Tue, 13 Jun 2000 12:49:17 +1000 (EST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-191987651-960864557=:11637
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Fri, 9 Jun 2000, Petru Paler wrote:

> > I'd love some sort of benchmarking tool for this (and posibly other 
> > Storages). I guess the best way would a python script that uses urllib.
> > Something that would algorithmically pump up the DB to > 1GB in size
> > and retrieve the URL's. Any volunteers or am I doing it in my
> > copious spare time (tm)?
> 
> It would be great if you could do it, but beware that you will be
> benchmarking a lot of overhead if you only plan to measure storage
> performance. Why not use ZODB directly ?

If I talk HTTP, it measures things fully - Python's interpreter lock
will mean a storage system written in python will benchmark better
without having to compete with ZServer, and vice versa for storage
systems with non-pythonic bits.

> > I've got a nice NetApp here to run some tests on.
> 
> What filesystem does that use ?

No idea :-) Something log based that is very fast and handles huge
directories happily. It also appears that another member of this
list has an EMC Symmetrix box to test on, which I believe is the next (and 
highest) level up from a Netapp.

I've attached a prerelease alpha of zouch.py for giggles. Not even a
command line yet, so you will need to edit some code at the bottom.
The current settings generate about 360 directories and about 36000 files,
and proceeds to make about 180000 reads. This bloated by test ZODB
to just over 200MB and took about 2.6 hours attacking my development Zope
server from another host on my LAN.

Todo:
    tidy and vet ugly code
    command line interface
    dynamic option (do more intensive DTML stuff - currently just 
	standard_html_header/standard_html_footer)
    catalog option (since DTML Documents arn't catalog aware, will need
	to make two calls to make a new document)
    upload larger documents and some binaries (200MB isn't great for 
	benchmarking when you might have a gig of ram doing caching for you)
    standard test suite
    better reporting
    spinning dohicky so we know it hasn't hung without having to look
	at log files

-- 
Stuart Bishop                          Work: zen@cs.rmit.edu.au
Senior Systems Alchemist               Play: zen@shangri-la.dropbear.id.au
Computer Science, RMIT University


---559023410-191987651-960864557=:11637
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="zouch.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.4.10.10006131249170.11637@goanna.cs.rmit.edu.au>
Content-Description: 
Content-Disposition: attachment; filename="zouch.py"

IyEvYmluL2VudiBweXRob24NCicnJw0KJElkOiB6b3VjaC5weSx2IDEuMyAy
MDAwLzA2LzEyIDA0OjIzOjAxIHplbiBFeHAgJA0KDQpab3VjaCAtIHRoZSBa
b3BlIHRvcnR1cmUgdGVzdGVyDQonJycNCg0KaW1wb3J0IHdocmFuZG9tDQpp
bXBvcnQgc2hhDQppbXBvcnQgdGhyZWFkaW5nDQppbXBvcnQgZnRwbGliDQpp
bXBvcnQgaHR0cGxpYg0KDQpmcm9tIHN0cmluZyBpbXBvcnQgc3BsaXQsam9p
bixyZXBsYWNlDQpmcm9tIHRpbWUgaW1wb3J0IHRpbWUsc3RyZnRpbWUsbG9j
YWx0aW1lLHNsZWVwDQpmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTw0K
ZnJvbSBRdWV1ZSBpbXBvcnQgUXVldWUNCmZyb20gdGhyZWFkaW5nIGltcG9y
dCBUaHJlYWQsUkxvY2sNCmZyb20gdXJsbGliIGltcG9ydCB1cmxlbmNvZGUN
CmZyb20gdXJscGFyc2UgaW1wb3J0IHVybHBhcnNlDQpmcm9tIGJhc2U2NCBp
bXBvcnQgZW5jb2Rlc3RyaW5nDQoNCnJldHJpZXMgPSAxMA0KcmV0cnlzbGVl
cCA9IDENCg0KZGVmIGRlYnVnKG1zZyk6IA0KICAgIHByaW50ICdEOiAlcyAt
ICVzJyAlICh0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSxt
c2cpDQoNCiMgRmF0YWwgZXhjZXB0aW9ucyB3aWxsIG5vdCBiZSBjYXVnaHQN
CmNsYXNzIEZhdGFsRXhjZXB0aW9uKEV4Y2VwdGlvbik6IHBhc3MNCmNsYXNz
IFVuc3VwcG9ydGVkUHJvdG9jb2woRmF0YWxFeGNlcHRpb24pOiBwYXNzDQoN
CmNsYXNzIEZvbGRlckxvY2s6DQoNCiAgICBkZWYgX19pbml0X18oc2VsZik6
DQoJc2VsZi5sb2NrcyA9IHt9DQoJc2VsZi5zeW5jID0gUkxvY2soKQ0KICAg
IA0KICAgIGRlZiBsb2NrKHNlbGYsZGlycyk6DQoJc2VsZi5fbG9jayhzZWxm
Ll9teXBhdGgoZGlycykpDQoJc2VsZi5fbG9jayhzZWxmLl9wYXJlbnRwYXRo
KGRpcnMpKQ0KDQogICAgZGVmIHVubG9jayhzZWxmLGRpcnMpOg0KCXNlbGYu
X3VubG9jayhzZWxmLl9wYXJlbnRwYXRoKGRpcnMpKQ0KCXNlbGYuX3VubG9j
ayhzZWxmLl9teXBhdGgoZGlycykpDQoNCiAgICBkZWYgX3BhcmVudHBhdGgo
c2VsZixkaXJzKToNCglpZiBsZW4oZGlycykgPT0gMToNCgkgICAgcmV0dXJu
ICdyb290Jw0KCWVsc2U6DQoJICAgIHJldHVybiBqb2luKGRpcnNbOi0xXSwn
LycpDQoNCiAgICBkZWYgX215cGF0aChzZWxmLGRpcnMpOg0KCXJldHVybiBq
b2luKGRpcnMsJy8nKQ0KDQogICAgZGVmIF9sb2NrKHNlbGYsZCk6DQoJbG9j
a3MgPSBzZWxmLmxvY2tzDQoJc3luYyA9IHNlbGYuc3luYw0KDQoJd2hpbGUg
MToNCgkgICAgdHJ5Og0KCQlzeW5jLmFjcXVpcmUoKQ0KCQlhY3EgPSAxDQoJ
CWlmIGxvY2tzLmhhc19rZXkoZCk6DQoJCSAgICBsID0gbG9ja3NbZF0NCgkJ
ICAgIHN5bmMucmVsZWFzZSgpDQoJCSAgICBhY3EgPSAwDQoJCSAgICBsLmFj
cXVpcmUoKQ0KCQkgICAgbC5yZWxlYXNlKCkNCgkJZWxzZToNCgkJICAgIGwg
PSBSTG9jaygpDQoJCSAgICBsLmFjcXVpcmUoKQ0KCQkgICAgbG9ja3NbZF0g
PSBsDQoJCSAgICBicmVhaw0KCSAgICBmaW5hbGx5Og0KCQlpZiBhY3E6IHN5
bmMucmVsZWFzZSgpDQoNCiAgICBkZWYgX3VubG9jayhzZWxmLGQpOg0KCWxv
Y2tzID0gc2VsZi5sb2Nrcw0KCXN5bmMgPSBzZWxmLnN5bmMNCg0KCXN5bmMu
YWNxdWlyZSgpDQoJdHJ5Og0KCSAgICBsID0gbG9ja3NbZF0NCgkgICAgZGVs
IGxvY2tzW2RdDQoJICAgIGwucmVsZWFzZSgpDQoJZmluYWxseToNCgkgICAg
c3luYy5yZWxlYXNlKCkNCg0KZm9sZGVybG9jayA9IEZvbGRlckxvY2soKQ0K
DQpjbGFzcyBIVFRQTWFrZXI6DQogICAgJ0Jhc2VjbGFzcyBmb3IgSFRUUCBN
YWtlciBjbGFzc2VzJw0KDQogICAgZGVmIF9faW5pdF9fKHNlbGYscXVldWUs
dXJsLHVzZXJuYW1lLHBhc3N3b3JkKToNCg0KCXB1cmwgPSB1cmxwYXJzZSh1
cmwpDQoNCglob3N0LHBvcnQgPSBzcGxpdChwdXJsWzFdLCc6JywxKQ0KCXBh
dGggPSBwdXJsWzJdDQoJaWYgcG9ydDoNCgkgICAgcG9ydCA9IGludChwb3J0
KQ0KCWVsc2U6DQoJICAgIHBvcnQgPSA4MA0KCQ0KCWlmIHBhdGhbLTFdID09
ICcvJzoNCgkgICAgc2VsZi5wYXRoID0gcGF0aA0KCWVsc2U6DQoJICAgIHNl
bGYucGF0aCA9IHBhdGggKyAnLycNCg0KCXNlbGYucXVldWUgPSBxdWV1ZQ0K
CXNlbGYub3BzID0gMA0KDQoJaWYgdXNlcm5hbWUgaXMgTm9uZToNCgkgICAg
c2VsZi5hdXRoID0gTm9uZQ0KCWVsc2U6DQoJICAgIGlmIHBhc3N3b3JkIGlz
IE5vbmU6IHBhc3N3b3JkID0gJycNCgkgICAgc2VsZi5hdXRoID0gJ0Jhc2lj
ICVzJyAlIFwNCgkJcmVwbGFjZShlbmNvZGVzdHJpbmcoJyVzOiVzJyAlICh1
c2VybmFtZSxwYXNzd29yZCkpLCdcMDEyJywnJykNCg0KCSNzZWxmLmh0dHAg
PSBodHRwbGliLkhUVFAoaG9zdCxwb3J0KQ0KCXNlbGYub3BzID0gMA0KCXNl
bGYuaG9zdCA9IGhvc3QNCglzZWxmLnBvcnQgPSBwb3J0DQoNCiAgICBkZWYg
ZG9nZXQoc2VsZixnZXRjbWQpOg0KCWh0dHAgPSBOb25lDQoJZm9yIGkgaW4g
cmFuZ2UoMCxyZXRyaWVzKToNCgkgICAgdHJ5Og0KCQlodHRwID0gaHR0cGxp
Yi5IVFRQKHNlbGYuaG9zdCxzZWxmLnBvcnQpDQoJCWJyZWFrDQoJICAgIGV4
Y2VwdDoNCgkJc2xlZXAocmV0cnlzbGVlcCkNCglpZiBodHRwIGlzIE5vbmU6
DQoJICAgIGRlYnVnKCdGYWlsZWQgJXMnICUgZ2V0Y21kKQ0KCSAgICByZXR1
cm4gTm9uZQ0KCWF1dGggPSBzZWxmLmF1dGgNCglodHRwLnB1dHJlcXVlc3Qo
J0dFVCcsIGdldGNtZCkNCglodHRwLnB1dGhlYWRlcignQWNjZXB0JywndGV4
dC9odG1sJykNCglodHRwLnB1dGhlYWRlcignQWNjZXB0JywndGV4dC9wbGFp
bicpDQoJaWYgYXV0aCBpcyBub3QgTm9uZToNCgkgICAgaHR0cC5wdXRoZWFk
ZXIoJ0F1dGhvcml6YXRpb24nLGF1dGgpDQoJaHR0cC5lbmRoZWFkZXJzKCkN
CgllcnJjb2RlLGVycm1zZyxoZWFkZXJzID0gaHR0cC5nZXRyZXBseSgpDQoJ
aWYgZXJyY29kZSBub3QgaW4gKDIwMCwzMDIpOg0KCSAgICBkZWJ1ZygnJXMg
cmV0ICVkICVzJyAlIChnZXRjbWQsZXJyY29kZSxlcnJtc2cpKQ0KCSAgICBy
ZXR1cm4gTm9uZQ0KCWYgPSBodHRwLmdldGZpbGUoKQkjIFN1Y2sgaW4gdGhl
IGRhdGEgc2luY2Ugd2UgYXJlIHRvcnR1cmluZw0KCWp1bmsgPSBmLnJlYWRs
aW5lcygpDQoJZi5jbG9zZSgpDQoJcmV0dXJuIGp1bmsNCg0KY2xhc3MgSFRU
UEZvbGRlck1ha2VyKEhUVFBNYWtlcik6DQogICAgZGVmIHJ1bihzZWxmKToN
CglxdWV1ZSA9IHNlbGYucXVldWUNCglwYXRoID0gc2VsZi5wYXRoDQoNCglk
aXJzID0gcXVldWUuZ2V0KCkNCgl3aGlsZSBkaXJzIGlzIG5vdCBOb25lOg0K
CSAgICBpZCA9IGRpcnNbLTFdDQoJICAgIHBhcm1zID0gdXJsZW5jb2RlKHsn
aWQnOiBpZCwndGl0bGUnOiAnWm91Y2ggZm9sZGVyICcgKyBpZH0pDQoJICAg
IGZvbGRlcmxvY2subG9jayhkaXJzKQ0KCSAgICB0cnk6DQoJCXAgPSBwYXRo
K2pvaW4oZGlyc1s6LTFdLCcvJykrJy9tYW5hZ2VfYWRkRm9sZGVyPycgKyBw
YXJtcw0KCQlpZiBzZWxmLmRvZ2V0KHApIGlzIE5vbmU6DQoJCSAgICByZXR1
cm4NCgkgICAgZmluYWxseToNCgkJZm9sZGVybG9jay51bmxvY2soZGlycykN
CgkgICAgc2VsZi5vcHMgPSBzZWxmLm9wcyArIDENCgkgICAgZGlycyA9IHF1
ZXVlLmdldCgpDQoNCg0KY2xhc3MgSFRUUEZpbGVNYWtlcihIVFRQTWFrZXIp
Og0KICAgIGRlZiBydW4oc2VsZik6DQoJcXVldWUgPSBzZWxmLnF1ZXVlDQoJ
cGF0aCA9IHNlbGYucGF0aA0KDQoJbCA9IHF1ZXVlLmdldCgpDQoJd2hpbGUg
bCBpcyBub3QgTm9uZToNCgkgICAgdHJ5Og0KCQlmaWxlcGF0aCxkYXRhID0g
bA0KCSAgICBleGNlcHQ6DQoJCWRlYnVnKCdXVEY/OiAlcycgJSBsKQ0KCQly
YWlzZQ0KCSAgICBkID0gam9pbihmaWxlcGF0aFs6LTFdLCcvJykNCgkgICAg
aWQgPSBmaWxlcGF0aFstMV0NCgkgICAgcGFybXMgPSB1cmxlbmNvZGUoew0K
CQknaWQnOiBpZCwNCgkJJ3RpdGxlJzogJ1pvdWNoIGdlbmVyYXRlZCBkb2N1
bWVudCAnICsgaWQsDQoJCSdmaWxlJzogZGF0YX0pDQoJICAgIGZvbGRlcmxv
Y2subG9jayhmaWxlcGF0aCkNCgkgICAgdHJ5Og0KCQlwID0gcGF0aCArIGQg
KyAnL21hbmFnZV9hZGREVE1MRG9jdW1lbnQ/JyArIHBhcm1zDQoJCWlmIHNl
bGYuZG9nZXQocCkgaXMgTm9uZToNCgkJICAgIHJldHVybg0KCSAgICBmaW5h
bGx5Og0KCQlmb2xkZXJsb2NrLnVubG9jayhmaWxlcGF0aCkNCgkgICAgc2Vs
Zi5vcHMgPSBzZWxmLm9wcyArIDENCgkgICAgbCA9IHF1ZXVlLmdldCgpDQoN
CmNsYXNzIEhUVFBGaWxlUmVhZGVyKEhUVFBNYWtlcik6DQogICAgZGVmIHJ1
bihzZWxmKToNCglxdWV1ZSA9IHNlbGYucXVldWUNCglwYXRoID0gc2VsZi5w
YXRoDQoNCglmaWxlcGF0aCA9IHF1ZXVlLmdldCgpDQoJd2hpbGUgZmlsZXBh
dGggaXMgbm90IE5vbmU6DQoJICAgIHAgPSBwYXRoICsgam9pbihmaWxlcGF0
aCwnLycpDQoJICAgIGlmIHNlbGYuZG9nZXQocCkgaXMgTm9uZToNCgkJcmV0
dXJuDQoJICAgIHNlbGYub3BzID0gc2VsZi5vcHMgKyAxDQoJICAgIGZpbGVw
YXRoID0gcXVldWUuZ2V0KCkNCg0KY2xhc3MgRlRQTWFrZXI6DQogICAgJ0Jh
c2VjbGFzcyBmb3IgRlRQIE1ha2VyIGNsYXNzZXMnDQoNCiAgICBkZWYgX19p
bml0X18oc2VsZixxdWV1ZSx1cmwsdXNlcm5hbWUscGFzc3dvcmQpOg0KDQoJ
cHVybCA9IHVybHBhcnNlKHVybCkNCg0KCWhvc3QscG9ydCA9IHNwbGl0KHB1
cmxbMV0sJzonLDEpDQoJcGF0aCA9IHB1cmxbMl0NCglpZiBwb3J0Og0KCSAg
ICBwb3J0ID0gaW50KHBvcnQpDQoJZWxzZToNCgkgICAgcG9ydCA9IDIxDQoJ
DQoJZnRwID0gZnRwbGliLkZUUCgpDQoJI2Z0cC5zZXRfZGVidWdsZXZlbCgx
KQ0KCSNmdHAuc2V0X3Bhc3YoMSkNCg0KCWlmIHBhc3N3b3JkIGlzIE5vbmU6
IHBhc3N3b3JkID0gJycNCg0KCWlmIGxlbihwYXRoKSA+IDAgYW5kIHBhdGhb
LTFdIDw+ICcvJzoNCgkgICAgcGF0aCA9IHBhdGggKyAnLycJIyBEb24ndCB1
c2Ugb3MucGF0aC5qb2luIC0gdGhpcyBpcyBGVFANCg0KCXNlbGYuaG9zdCA9
IGhvc3QNCglzZWxmLnBvcnQgPSBwb3J0DQoJc2VsZi51c2VybmFtZSA9IHVz
ZXJuYW1lDQoJc2VsZi5wYXNzd29yZCA9IHBhc3N3b3JkDQoJc2VsZi5wYXRo
ID0gcGF0aA0KCXNlbGYuZnRwID0gZnRwDQoJc2VsZi5xdWV1ZSA9IHF1ZXVl
DQoNCglzZWxmLm9wcyA9IDANCg0KICAgIGRlZiBfX2RlbF9fKHNlbGYpOg0K
CXRyeToNCgkgICAgc2VsZi5mdHAucXVpdCgpDQoJICAgIHNlbGYuZnRwLmNs
b3NlKCkNCglleGNlcHQ6DQoJICAgIHBhc3MNCg0KICAgIGRlZiBydW4oc2Vs
Zik6DQoJdHJ5Og0KCSAgICBmdHAgPSBzZWxmLmZ0cA0KCSAgICBmdHAuY29u
bmVjdChzZWxmLmhvc3Qsc2VsZi5wb3J0KQ0KCSAgICBpZiBzZWxmLnVzZXJu
YW1lOg0KCQlmdHAubG9naW4oc2VsZi51c2VybmFtZSxzZWxmLnBhc3N3b3Jk
KQ0KCSAgICBlbHNlOg0KCQlmdHAubG9naW4oKQ0KDQoJICAgIHRyeToNCgkJ
c2VsZi5mZWVkKCkNCgkgICAgZmluYWxseToNCgkJZnRwLnF1aXQoKQ0KCWV4
Y2VwdCBmdHBsaWIuYWxsX2Vycm9yczoNCgkgICAgc2VsZi5vcHMgPSAtMQkj
IE5ldmVyIGdvdCBhIGNoYW5jZSB0byBjb25uZWN0DQoNCmNsYXNzIEZUUEZv
bGRlck1ha2VyKEZUUE1ha2VyKToNCg0KICAgIGRlZiBmZWVkKHNlbGYpOg0K
CXF1ZXVlID0gc2VsZi5xdWV1ZQ0KCXBhdGggPSBzZWxmLnBhdGgNCglmdHAg
PSBzZWxmLmZ0cA0KDQoJZGlycyA9IHF1ZXVlLmdldCgpDQoJdHJ5Og0KCSAg
ICB3aGlsZSBkaXJzIGlzIG5vdCBOb25lOg0KCQl0cnk6DQoJCSAgICBmb2xk
ZXJsb2NrLmxvY2soZGlycykNCgkJICAgIGZ0cC5ta2QocGF0aCArIGpvaW4o
ZGlycywnLycpKQ0KCQlmaW5hbGx5Og0KCQkgICAgZm9sZGVybG9jay51bmxv
Y2soZGlycykNCgkJc2VsZi5vcHMgPSBzZWxmLm9wcyArIDENCgkJZGlycyA9
IHF1ZXVlLmdldCgpDQoJZXhjZXB0IGZ0cGxpYi5lcnJvcl9wZXJtOg0KCSAg
ICBkZWJ1ZygnRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJXMlcycgJSAo
cGF0aCxqb2luKGRpcnMsJy8nKSkpDQoNCmNsYXNzIEZUUEZpbGVNYWtlcihG
VFBNYWtlcik6DQoNCiAgICBkZWYgZmVlZChzZWxmKToNCglxdWV1ZSA9IHNl
bGYucXVldWUNCglwYXRoID0gc2VsZi5wYXRoDQoJZnRwID0gc2VsZi5mdHAN
Cg0KCWwgPSBxdWV1ZS5nZXQoKQ0KDQoJdHJ5Og0KCSAgICB3aGlsZSBsIGlz
IG5vdCBOb25lOg0KCQlmaWxlcGF0aCxkYXRhID0gbA0KCQlkYXRhID0gU3Ry
aW5nSU8oZGF0YSkNCgkJZm9sZGVybG9jay5sb2NrKGZpbGVwYXRoKQ0KCQl0
cnk6DQoJCSAgICBmdHAuc3RvcmxpbmVzKCdTVE9SICVzJXMnICUgKHBhdGgs
am9pbihmaWxlcGF0aCwnLycpKSxkYXRhKQ0KCQkgICAgc2VsZi5vcHMgPSBz
ZWxmLm9wcyArIDENCgkJZmluYWxseToNCgkJICAgIHRyeTpkYXRhLmNsb3Nl
KCkNCgkJICAgIGV4Y2VwdDogcGFzcw0KCQkgICAgZm9sZGVybG9jay51bmxv
Y2soZmlsZXBhdGgpDQoJCWwgPSBxdWV1ZS5nZXQoKQ0KCWV4Y2VwdCBmdHBs
aWIuZXJyb3JfcGVybToNCgkgICAgZGVidWcoJ0ZhaWxlZCB0byB1cGxvYWQg
ZmlsZSAlcyVzJyAlIChwYXRoLGpvaW4oZmlsZXBhdGgsJy8nKSkpDQoNCg0K
Y2xhc3MgWm91Y2g6DQogICAgJ0ZlZWRzIGNvbW1hbmRzIHRvIHRoZSBjbGll
bnRzJw0KDQogICAgZGVmIF9faW5pdF9fKHNlbGYsdXJsLHVzZXJuYW1lPU5v
bmUscGFzc3dvcmQ9Tm9uZSk6DQoJJycnDQoJQ3JlYXRlIGEgZmVlZGVyIHRv
IGZlZWQgb3VyIGNvbnN1bWVycy4NCgknJycNCg0KCSMgU2V0dXAgYW5kIHNl
ZWQgb3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIC0gc2VlZCB0byBrbm93
bg0KCSMgdmFsdWUgdG8gc2VxdWVuY2UgcmVwZWF0cyBpZGVudGljYWxseSBl
YWNoIHJ1bg0KCXNlbGYuX3JuZyA9IHdocmFuZG9tLndocmFuZG9tKCkNCglz
ZWxmLl9ybmcuc2VlZCgxLDUsMikNCg0KCXNlbGYucm9vdGZvbGRlciA9IHN0
cmZ0aW1lKCclWSVtJWRfJUglTSVTJyxsb2NhbHRpbWUodGltZSgpKSkNCg0K
CWlmIHVybFstMV0gPD4gJy8nOg0KCSAgICB1cmwgPSB1cmwgKyAnLycNCg0K
CXNlbGYudXJsID0gdXJsDQoJc2VsZi5udW10aHJlYWRzID0gNA0KCXNlbGYu
Zm9sZGVycyA9IDUNCglzZWxmLmRlcHRoID0gMw0KCXNlbGYuZmlsZXMgPSAy
MA0KCXNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQ0KCXNlbGYucGFzc3dvcmQg
PSBwYXNzd29yZA0KDQogICAgZGVmIHJ1bihzZWxmKToNCglzZWxmLnB1cmwg
PSB1cmxwYXJzZShzZWxmLnVybCkNCg0KCXByb3RvY29sID0gc2VsZi5wdXJs
WzBdDQoNCgkjaWYgcHJvdG9jb2wgPT0gJ2Z0cCc6DQoJIyAgICBGb2xkZXJN
YWtlciA9IEZUUEZvbGRlck1ha2VyDQoJIyAgICBGaWxlTWFrZXIgPSBGVFBG
aWxlTWFrZXINCglpZiBwcm90b2NvbCA9PSAnaHR0cCc6DQoJICAgIEZvbGRl
ck1ha2VyID0gSFRUUEZvbGRlck1ha2VyDQoJICAgIEZpbGVNYWtlciA9IEhU
VFBGaWxlTWFrZXINCgkgICAgRmlsZVJlYWRlciA9IEhUVFBGaWxlUmVhZGVy
DQoJZWxzZToNCgkgICAgcmFpc2UgVW5zdXBwb3J0ZWRQcm90b2NvbChwcm90
b2NvbCkNCg0KCXByaW50ICJCYXNlIFVSTCBpcyAlcyVzIiAlIChzZWxmLnVy
bCxzZWxmLnJvb3Rmb2xkZXIpDQoNCglzZWxmLnRpbWVpdCgnR2VuZXJhdGlu
ZyBmb2xkZXJzJyxGb2xkZXJNYWtlcixzZWxmLm1ha2Vmb2xkZXJzKQ0KCXNl
bGYudGltZWl0KCdHZW5lcmF0aW5nIGZpbGVzJyxGaWxlTWFrZXIsc2VsZi5t
YWtlZmlsZXMpDQoJc2VsZi50aW1laXQoJ1JlYWRpbmcgZmlsZXMnLEZpbGVS
ZWFkZXIsc2VsZi5yZWFkZmlsZXMpDQoJI3NlbGYudGltZWl0KCdUcmFzaGlu
ZyBmaWxlcycsRm9sZGVyTWFrZXIsc2VsZi50cmFzaGZpbGVzKQ0KCSNzZWxm
LnRpbWVpdCgnVHJhc2hpbmcgZm9sZGVycycsRm9sZGVyTWFrZXIsc2VsZi50
cmFzaGZvbGRlcnMpDQogICAgDQogICAgZGVmIHRpbWVpdChzZWxmLHR4dCxN
YWtlckNsYXNzLGZpbGxtZXRob2QpOg0KDQoJbnVtdGhyZWFkcyA9IHNlbGYu
bnVtdGhyZWFkcw0KCXF1ZXVlID0gUXVldWUoc2VsZi5xdWV1ZXNpemUpDQoJ
c2VsZi5xdWV1ZSA9IHF1ZXVlDQoJdXJsID0gc2VsZi51cmwNCgl1c2VybmFt
ZSA9IHNlbGYudXNlcm5hbWUNCglwYXNzd29yZCA9IHNlbGYucGFzc3dvcmQN
Cg0KCXByaW50IHR4dCwNCgl0aHJlYWRzID0gW10NCgltYWtlcnMgPSBbXQ0K
CXN0YXJ0dGltZSA9IHRpbWUoKQ0KCQ0KCWZvciBpIGluIHJhbmdlKDAsbnVt
dGhyZWFkcyk6DQoJICAgIG0gPSBNYWtlckNsYXNzKHF1ZXVlLHVybCx1c2Vy
bmFtZSxwYXNzd29yZCkNCgkgICAgbWFrZXJzLmFwcGVuZChtKQ0KDQoJICAg
IHQgPSBUaHJlYWQodGFyZ2V0PW0ucnVuLG5hbWU9J1pvdWNoIG1ha2VyICVk
JyAlIGkpDQoJICAgIHQuc2V0RGFlbW9uKDEpDQoJICAgIHRocmVhZHMuYXBw
ZW5kKHQpDQoNCglmb3IgaSBpbiByYW5nZSgwLG51bXRocmVhZHMpOg0KCSAg
ICB0aHJlYWRzW2ldLnN0YXJ0KCkNCg0KCXQgPSBUaHJlYWQodGFyZ2V0PWZp
bGxtZXRob2QsbmFtZT0nWm91Y2ggZmlsbGVyJykNCgl0LnNldERhZW1vbigx
KQ0KCXQuc3RhcnQoKQ0KDQoJZm9yIHQgaW4gdGhyZWFkczoNCgkgICAgaWYg
dC5pc0FsaXZlKCk6DQoJCXQuam9pbigpDQoNCgllbmR0aW1lID0gdGltZSgp
DQoJcHJpbnQgJyAlZiBzZWNvbmRzJyAlIChlbmR0aW1lIC0gc3RhcnR0aW1l
KQ0KCXRocmVhZHMgPSBOb25lDQoJcHJpbnQgJ1RocmVhZFtPcGVyYXRpb25z
XSAtJywNCgl0b3QgPSAwDQoJZm9yIGkgaW4gcmFuZ2UoMCxsZW4obWFrZXJz
KSk6DQoJICAgIHByaW50ICcgJWRbJWRdJyAlIChpLG1ha2Vyc1tpXS5vcHMp
LA0KCSAgICB0b3QgPSB0b3QgKyBtYWtlcnNbaV0ub3BzDQoJcHJpbnQNCglw
cmludCAnVG90YWwgb3BlcmF0aW9ucyA9ICVkJyAlIHRvdA0KCSAgICANCiAg
ICBkZWYgbWFrZWZvbGRlcnMoc2VsZik6DQoJZGVwdGggPSBzZWxmLmRlcHRo
DQoJcXVldWUgPSBzZWxmLnF1ZXVlDQoJaSA9IC0xDQoJd2hpbGUgMToNCgkg
ICAgcCA9IHNlbGYuZm9sZGVycGF0aChpKQ0KCSAgICBpZiBsZW4ocCkgPiBk
ZXB0aCsxOiAjIGRlcHRoKzEgZm9yIHRvcCBmb2xkZXINCgkJYnJlYWsNCgkg
ICAgcXVldWUucHV0KHNlbGYuZm9sZGVycGF0aChpKSkNCgkgICAgaSA9IGkg
KyAxDQoJc2VsZi5udW1mb2xkZXJzID0gaQ0KCWZvciBpIGluIHJhbmdlKDAs
c2VsZi5udW10aHJlYWRzKToNCgkgICAgcXVldWUucHV0KE5vbmUpCSMgTWFr
ZSBzdXJlIG91ciBtYWtlcnMga25vdyB0byB0ZXJtaW5hdGUNCg0KICAgIGRl
ZiBtYWtlZmlsZXMoc2VsZik6DQoJcXVldWUgPSBzZWxmLnF1ZXVlDQoNCgkj
IHN0YW5kYXJkX2h0bWxfaGVhZGVyDQoJZmlsZXBhdGggPSBzZWxmLmZvbGRl
cnBhdGgoLTEpDQoJZmlsZXBhdGguYXBwZW5kKCdzdGFuZGFyZF9odG1sX2hl
YWRlcicpDQoJZGF0YSA9ICcnJw0KCSAgICA8SFRNTD48SEVBRD48VElUTEU+
JmR0bWwtdGl0bGVfb3JfaWQ7PC9USVRMRT48L0hFQUQ+DQoJICAgIDxCT0RZ
IEJHQ09MT1I9IiNGRkZGRkYiPg0KCScnJw0KCXF1ZXVlLnB1dCgoZmlsZXBh
dGgsZGF0YSkpDQoNCgkjIHN0YW5kYXJkX2h0bWxfZm9vdGVyDQoJZmlsZXBh
dGggPSBzZWxmLmZvbGRlcnBhdGgoLTEpDQoJZmlsZXBhdGguYXBwZW5kKCdz
dGFuZGFyZF9odG1sX2Zvb3RlcicpDQoJZGF0YSA9ICc8L0JPRFk+PC9IVE1M
PicNCglxdWV1ZS5wdXQoKGZpbGVwYXRoLGRhdGEpKQ0KDQoJIyBzdGFuZGFy
ZF9lcnJvcl9tZXNzYWdlDQoJZmlsZXBhdGggPSBzZWxmLmZvbGRlcnBhdGgo
LTEpDQoJZmlsZXBhdGguYXBwZW5kKCdzdGFuZGFyZF9lcnJvcl9tZXNzYWdl
JykNCglkYXRhID0gJycnDQoJICAgIDxkdG1sLXZhciBzdGFuZGFyZF9odG1s
X2hlYWRlcj4NCgkgICAgPGR0bWwtaWYgZXJyb3JfbWVzc2FnZT4mZHRtbC1l
cnJvcl9tZXNzYWdlOw0KCSAgICA8ZHRtbC1lbHNlPg0KCQk8SDI+Wm9wZSBF
cnJvcjwvSDI+DQoJCSAgPFA+Wm9wZSBoYXMgZW5jb3VudGVyZWQgYW4gZXJy
b3Igd2hpbGUgcHVibGlzaGluZyB0aGlzIHJlc291cmNlLg0KCQkgIDwvUD4N
CiAgICAgIA0KCQk8UD48U1RST05HPkVycm9yIFR5cGU6IDwhLS0jdmFyIGVy
cm9yX3R5cGUtLT48L1NUUk9ORz48QlI+DQoJCSAgIDxTVFJPTkc+RXJyb3Ig
VmFsdWU6IDwhLS0jdmFyIGVycm9yX3ZhbHVlLS0+PC9TVFJPTkc+PEJSPiAN
CgkJPC9QPg0KICAgICANCgkJPFA+Rm9yIG1vcmUgZGV0YWlsZWQgaW5mb3Jt
YXRpb24gYWJvdXQgdGhlIGVycm9yLCBwbGVhc2UNCgkJcmVmZXIgdG8gdGhl
IEhUTUwgc291cmNlIGZvciB0aGlzIHBhZ2UuDQoJCTwvUD4NCgkgICAgPC9k
dG1sLWlmPg0KCSAgICA8ZHRtbC12YXIgc3RhbmRhcmRfaHRtbF9mb290ZXI+
DQoJJycnDQoJcXVldWUucHV0KChmaWxlcGF0aCxkYXRhKSkNCg0KCWkgPSAw
DQoJZm9yIGZpbGVudW0gaW4gcmFuZ2UoMCxzZWxmLmZpbGVzKToNCgkgICAg
Zm9yIGZvbGRudW0gaW4gcmFuZ2UoMCxzZWxmLm51bWZvbGRlcnMpOg0KCQlm
aWxlcGF0aCA9IHNlbGYuZm9sZGVycGF0aChmb2xkbnVtKQ0KCQlmaWxlcGF0
aC5hcHBlbmQoJ2YlMDNkJyAlIGZpbGVudW0pDQoJCXF1ZXVlLnB1dCgoZmls
ZXBhdGgsc2VsZi5nZW5maWxlKCkpKQ0KCQlpID0gaSArIDENCglzZWxmLm51
bWZpbGVzID0gaQ0KCWZvciBpIGluIHJhbmdlKDAsc2VsZi5udW10aHJlYWRz
KToNCgkgICAgcXVldWUucHV0KE5vbmUpCSMgTWFrZSBzdXJlIG91ciBtYWtl
cnMga25vdyB0byB0ZXJtaW5hdGUNCg0KICAgIGRlZiByZWFkZmlsZXMoc2Vs
Zik6DQoJZmlsZXMgPSBzZWxmLmZpbGVzDQoJZm9sZGVycyA9IHNlbGYuZm9s
ZGVycw0KCXJuZyA9IHNlbGYuX3JuZw0KCXF1ZXVlID0gc2VsZi5xdWV1ZQ0K
CWZvciBpIGluIHJhbmdlKDAsc2VsZi5udW1maWxlcyAqIHNlbGYucmVhZHMp
Og0KCSAgICBmb2xkbnVtID0gcm5nLnJhbmRpbnQoMCxmb2xkZXJzLTEpDQoJ
ICAgIGZpbGVudW0gPSBybmcucmFuZGludCgwLGZpbGVzLTEpDQoJICAgIHF1
ZXVlLnB1dChzZWxmLmZpbGVwYXRoKGZvbGRudW0sZmlsZW51bSkpDQoJICAg
IA0KCWZvciBpIGluIHJhbmdlKDAsc2VsZi5udW10aHJlYWRzKToNCgkgICAg
cXVldWUucHV0KE5vbmUpCSMgTWFrZSBzdXJlIG91ciBtYWtlcnMga25vdyB0
byB0ZXJtaW5hdGUNCg0KICAgIGRlZiBmb2xkZXJwYXRoKHNlbGYsbnVtKToN
CgknJycNCglHZW5lcmF0ZSB0aGUgZnVsbCBwYXRoIHRvIGZvbGRlciBudW1i
ZXIgJ251bScuIFJldHVybnMgYSBsaXN0DQoJb2YgcGF0aCBjb21wb25lbnRz
LiBSb290IGZvbGRlciBpcyBudW09LTEuIEZpcnN0IGZvbGRlciBpcyBudW09
MC4NCgknJycNCglmb2xkZXJzID0gc2VsZi5mb2xkZXJzDQoJbCA9IFtzZWxm
LnJvb3Rmb2xkZXIsXQ0KCW51bSA9IG51bSArIDENCgl3aGlsZSBudW0gPiAw
Og0KCSAgICBuID0gKG51bS0xKSAlIGZvbGRlcnMNCgkgICAgbC5hcHBlbmQo
J2QlMDNkJyAlIG4pDQoJICAgIG51bSA9IChudW0gLSBuKSAvIGZvbGRlcnMN
CglyZXR1cm4gbA0KDQogICAgZGVmIGZpbGVwYXRoKHNlbGYsZm9sZG51bSxm
aWxlbnVtKToNCglmaWxlcGF0aCA9IHNlbGYuZm9sZGVycGF0aChmb2xkbnVt
KQ0KCWZpbGVwYXRoLmFwcGVuZCgnZiUwM2QnICUgZmlsZW51bSkNCglyZXR1
cm4gZmlsZXBhdGgNCg0KDQogICAgZGVmIGdlbmZpbGUoc2VsZik6DQoJcmV0
dXJuICcnJw0KCTxkdG1sLXZhciBzdGFuZGFyZF9odG1sX2hlYWRlcj4NCgk8
aDI+PGR0bWwtdmFyIHRpdGxlX29yX2lkPjwvaDI+DQoJPHA+DQoJVGhpcyBp
cyB0aGUgPGR0bWwtdmFyIGlkPiBEb2N1bWVudC4NCgk8L3A+DQoJPGR0bWwt
dmFyIHN0YW5kYXJkX2h0bWxfZm9vdGVyPg0KCScnJw0KDQppZiBfX25hbWVf
XyA9PSAnX19tYWluX18nOg0KICAgIHByaW50IF9fZG9jX18NCg0KICAgIHVy
bCA9ICdodHRwOi8veW91ci5zaXRlLmhlcmU6ODA4MC9kdW1wYXJlYScNCiAg
ICB1bmFtZSA9ICd6b3VjaCcNCiAgICBwYXNzd2QgPSAnem91Y2gnDQoNCiAg
ICBmID0gWm91Y2godXJsLHVuYW1lLHBhc3N3ZCkNCiAgICBmLmZvbGRlcnMg
PSAzIA0KICAgIGYuZGVwdGggPSA1DQogICAgZi5maWxlcyA9IDEwMA0KICAg
IGYucmVhZHMgPSA1ICMgVGhpcyBpcyBhIG11bHRpcGxpZXIgLSByZWFkb3Bz
ID0gdG90YWxmaWxlcyAqIHJlYWRzDQogICAgZi5udW10aHJlYWRzID0gMTAN
Cg0KICAgIGYucXVldWVzaXplID0gMTAwDQogICAgZi5yZXRyaWVzID0gMTAN
CiAgICBmLnJldHJ5c2xlZXAgPSAxDQoNCiAgICBmLnJ1bigpDQoNCg==
---559023410-191987651-960864557=:11637--