[Xotcl] Re: XOTcl 0.83 questions (continued...)
uwe.zdun@uni-essen.de
uwe.zdun@uni-essen.de
Fri, 8 Dec 2000 12:57:35 +0100 (CET)
--YEwdGK8yMr
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Hi Zoran,
ZV> The main problem is the ORDER! What I need to
ZV> do is run a script against an initialized interpreter
ZV> and construct another script which will replicate all
ZV> XOTcl objects, classes etc,etc in an fresh interpreter.
ZV> So the *ORDER* of commands is crucial.
I've played around with ordering, when I've created the -- still very
incomplete -- script creation for agents. So what I've done now is to
extend the ScirptCreator component (in packages/script-creation) to
support several classes & objects with a method makeScriptForAll. It
then writes scripts with one possible order regarding the object &
class hierarchy.
It is still very incomplete ... but should already show how things
could function. It only handles procs and instprocs, but not:
-- adavanded features, like filters, mixins, etc. (for them ordering
matters, too .. you cannot define a mixin without the class
being defined)
-- tcl namespaces
-- indentation
I'll hope to extend & test it ASAP to support more functionalities,
but today I will not make it. Therefore, I send what I have so far.
It already handles another crucial issue besides ordering: it can
exclude certain objects & classes from re-creation. You surely do not
want the script creator itself or the predefined stuff (like Object
and Class)to be re-created.
--Uwe
Here's the example script:
###################################################################
# load the ScriptCreator
package require ScriptCreator
ScriptCreator s
# exclude everything defined so far
s excludedObjs [s getAllInstances Object]
puts "EXCLUDED [s excludedObjs]"
# set up some classes for testing
#
# some meta classes
#
Class Meta -superclass Class
Class Meta2 -superclass Meta
Class Meta3 -superclass Meta2
#
# some classes
#
Class X
Class Y
Meta Z
Meta2 A
Meta2 B
#
# some objs
#
X x
Object o
Y y1
Y y2
A a1
A a2
puts [s makeScriptForAll]
###################################################################
--
Uwe Zdun
Specification of Software Systems, University of Essen
Phone: +49 201 81 00 332, Fax: +49 201 81 00 398
zdun@xotcl.org, uwe.zdun@uni-essen.de
--YEwdGK8yMr
Content-Type: application/octet-stream
Content-Disposition: attachment;
filename="ScriptCreator.xotcl"
Content-Transfer-Encoding: base64
IyAkSWQ6IFNjcmlwdENyZWF0b3IueG90Y2wsdiAxLjMgMjAwMC8wNS8xOSAxNTo1Mjo0MCBu
ZXVtYW5uIEV4cCAkCnBhY2thZ2UgcHJvdmlkZSBTY3JpcHRDcmVhdG9yIDAuOAoKQ2xhc3Mg
U2NyaXB0Q3JlYXRvciBcCiAgLXBhcmFtZXRlciB7CiAgICB7ZXhjbHVkZWRPYmpzIFtsaXN0
IE9iamVjdCBcCgkJICAgICBDbGFzcyBcCgkJICAgICBTY3JpcHRDcmVhdG9yIFwKCQkgICAg
IENsYXNzOjpQYXJhbWV0ZXJdfQogICAge2V4Y2x1ZGVOYW1lcyAiIn0KICAgIHtkZXBlbmRl
bmN5Q2hlY2tpbmcgMX0KICAgIHthcHBlbmRlZE5hbWVzICIifQogIH0KCgojCiMgcXVlcmll
cyB0aGUgZXhjbHVkZWRPYmpzIHZhcmlhYmxlIHdoZXRoZXIgYSBnaXZlbiBvYmplY3QKIyBp
cyBhbHJlYWR5IGRlZmluZWQvcHJlZGVmaW5lZCBvciBub3QgIAojIC0+IGEgd2F5IHRvIGV4
Y2x1ZGUgY2xhc3Nlcy9vYmpzIGZyb20gc2F2aW5nCiMKU2NyaXB0Q3JlYXRvciBpbnN0cHJv
YyBpc0V4Y2x1ZGVkIHtufSB7CiAgW3NlbGZdIGluc3R2YXIgZXhjbHVkZWRPYmpzCiAgI3B1
dHMgc3RkZXJyICJDaGVja2luZyBFeGNsdWRlZDogJG4gaW4gJGV4Y2x1ZGVkT2JqcyIKICBp
ZiB7W2xzZWFyY2ggJGV4Y2x1ZGVkT2JqcyBbc3RyaW5nIHRyaW1sZWZ0ICRuIDpdXSA9PSAt
MSAmJgogICAgICBbbHNlYXJjaCAkZXhjbHVkZWRPYmpzICRuXSA9PSAtMX0gewogICAgcmV0
dXJuIDAKICB9IGVsc2UgewogICAgcmV0dXJuIDEKICB9Cn0KClNjcmlwdENyZWF0b3IgaW5z
dHByb2MgYXBwZW5kRXhjbHVkZWQge259IHsKICAgIFtzZWxmXSBpbnN0dmFyIGV4Y2x1ZGVk
T2JqcwogICAgbGFwcGVuZCBleGNsdWRlZE9ianMgW3N0cmluZyB0cmltbGVmdCAkbiA6XQp9
CgojCiMgY29tcGFyZSBjb21tYW5kIGZvciBsc29ydCAgCiMKU2NyaXB0Q3JlYXRvciBpbnN0
cHJvYyBuYW1lc3BhY2VEZXB0aCB7YSBifSB7CiAgICBzZXQgYUNvdW50IDAKICAgIHNldCBi
Q291bnQgMAogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbc3RyaW5nIGxlbmd0aCAkYV19IHtp
bmNyIGl9IHsKCWlmIHtbc3RyaW5nIGluZGV4ICRhICRpXSA9PSAiOiJ9IHsKCSAgICBpbmNy
IGFDb3VudAoJfQogICAgfQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbc3RyaW5nIGxlbmd0
aCAkYl19IHtpbmNyIGl9IHsKCWlmIHtbc3RyaW5nIGluZGV4ICRiICRpXSA9PSAiOiJ9IHsK
CSAgICBpbmNyIGJDb3VudAoJfQogICAgfQogICAgaWYgeyRhQ291bnQgPT0gJGJDb3VudH0g
ewoJcmV0dXJuIDAKICAgIH0gZWxzZWlmIHskYUNvdW50ID4gJGJDb3VudH0gewoJcmV0dXJu
IDEKICAgIH0KCQkgICAKICAgIHJldHVybiAtMQp9IAoKIwojIHByb2R1Y2VzIGEgc2NyaXB0
IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgCiMgdGhlIGdpdmVuIG9iagojClNj
cmlwdENyZWF0b3IgaW5zdHByb2Mgc3RhdGVTY3JpcHQge29ian0gewogICAgc2V0IHNjcmlw
dCAiIgogICAgZm9yZWFjaCB2IFskb2JqIGluZm8gdmFyc10gewoJaWYge1tsc2VhcmNoIFtz
ZXQgW3NlbGZdOjpleGNsdWRlTmFtZXNdICR2XSA9PSAtMX0gewoJICAgIGlmIHtbYXJyYXkg
ZXhpc3RzICR7b2JqfTo6JHZdfSB7CgkJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyAke29i
an06OiR2XSB7CgkJICAgIHNldCBhcnIgJHt2fSgkbmFtZSkKCQkgICAgc2V0IHZhbHVlIFsk
b2JqIHNldCAkYXJyXQoJCSAgICBhcHBlbmQgc2NyaXB0ICIkb2JqIHNldCAkYXJyIFwiJHZh
bHVlXCJcbiIKCQl9CgkgICAgfSBlbHNlIHsKCQlzZXQgdmFsdWUgW3NldCAke29ian06OiR2
XQoJCWFwcGVuZCBzY3JpcHQgIiRvYmogc2V0ICR2IFwiJHZhbHVlXCJcbiIKCSAgICB9Cgl9
CiAgICB9CiAgICByZXR1cm4gJHNjcmlwdAp9CgojCiMgcHJvZHVjZXMgYSBzY3JpcHQgY29u
dGFpbmluZyB0aGUgcHJvY3Mgb2YgdGhlIGdpdmVuIG9iagojClNjcmlwdENyZWF0b3IgaW5z
dHByb2MgcHJvY1NjcmlwdCB7b2JqfSB7CiAgICBzZXQgc2NyaXB0ICIiCiAgICBmb3JlYWNo
IHAgWyRvYmogaW5mbyBwcm9jc10gewoJaWYge1tsc2VhcmNoIFtzZXQgW3NlbGZdOjpleGNs
dWRlTmFtZXNdICRwXSA9PSAtMX0gewoJICAgIGFwcGVuZCBzY3JpcHQgXAoJCSIkb2JqIHBy
b2MgJHAgXHtbJG9iaiBpbmZvIGFyZ3MgJHBdXH0gXHtbJG9iaiBpbmZvIGJvZHkgJHBdXH1c
biIKCX0KICAgIH0KICAgIHJldHVybiAkc2NyaXB0Cn0KCiMKIyBwcm9kdWNlcyBhIHNjcmlw
dCBjb250YWluaW5nIHRoZSBpbnN0cHJvY3Mgb2YgdGhlIGdpdmVuIGNsYXNzCiMKU2NyaXB0
Q3JlYXRvciBpbnN0cHJvYyBpbnN0cHJvY1NjcmlwdCB7Y2x9IHsKICAgIHNldCBzY3JpcHQg
IiIKICAgIGZvcmVhY2ggcCBbJGNsIGluZm8gaW5zdHByb2NzXSB7CglpZiB7W2xzZWFyY2gg
W3NldCBbc2VsZl06OmV4Y2x1ZGVOYW1lc10gJHBdID09IC0xfSB7CgkgICAgYXBwZW5kIHNj
cmlwdCBcCgkJIiRjbCBpbnN0cHJvYyAkcCBce1skY2wgaW5mbyBpbnN0YXJncyAkcF1cfSBc
e1skY2wgaW5mbyBpbnN0Ym9keSAkcF1cfVxuIgoJfQogICAgfQogICAgcmV0dXJuICRzY3Jp
cHQKfQoKCgojCiMgc2F2ZXMgYSBzY3JpcHQgdG8gYSBmaWxlCiMKU2NyaXB0Q3JlYXRvciBp
bnN0cHJvYyBzYXZlU2NyaXB0IHtmaWxlbmFtZSBzY3JpcHR9IHsKICBzZXQgZiBbb3BlbiAk
ZmlsZW5hbWUgd10KICBwdXRzICRmICRzY3JpcHQKICBjbG9zZSAkZgp9CgojCiMgbG9hZCBh
IHNjcmlwdCBmcm9tIGEgZmlsZQojClNjcmlwdENyZWF0b3IgaW5zdHByb2MgbG9hZFNjcmlw
dCB7ZmlsZW5hbWV9IHsKICBzZXQgZiBbb3BlbiAkZmlsZW5hbWUgcl0KICBzZXQgciBbcmVh
ZCAkZl0KICBjbG9zZSAkZgogIHJldHVybiAkcgp9CgojCiMgY2hlY2sgcGFyZW50IG9iai9j
bGFzc2VzL25hbWVzcGFjZXMgb2YgYW4gb2JqZWN0IGNvbXBsZXRseQojClNjcmlwdENyZWF0
b3IgaW5zdHByb2MgY2hlY2tQYXJlbnRzIHtuYW1lfSB7CiAgc2V0IHAgIiIKCiAgc2V0IG4g
JG5hbWUKICB3aGlsZSB7W3NldCBucCBbbmFtZXNwYWNlIHBhcmVudCA6OiRuXV0gIT0gIjo6
In0gewogICAgbGFwcGVuZCBwICRucAogICAgc2V0IG4gJG5wCiAgfSAgICAKICBzZXQgcCBb
bHNvcnQgLWNvbW1hbmQge1tzZWxmXSBuYW1lc3BhY2VEZXB0aH0gJHBdCgogIGZvcmVhY2gg
biAkcCB7CiAgICBpZiB7IVtbc2VsZl0gaXNFeGNsdWRlZCAkbl0gJiYKCSFbW3NlbGZdIGlz
QXBwZW5kZWQgJG5dfSB7CiAgICAgIHJldHVybiAwCiAgICB9CiAgfQogIHJldHVybiAxCn0K
ClNjcmlwdENyZWF0b3IgaW5zdHByb2MgY2hlY2tDbGFzcyB7b2JqIGNsYXNzfSB7CiAgaWYg
eyFbW3NlbGZdIGlzRXhjbHVkZWQgJGNsYXNzXSAmJgogICAgICAhW1tzZWxmXSBpc0FwcGVu
ZGVkICRjbGFzc119IHsKICAgIHJldHVybiAwCiAgfQogIHJldHVybiAxCn0KClNjcmlwdENy
ZWF0b3IgaW5zdHByb2MgY2hlY2tTdXBlcmNsYXNzZXMgbmFtZSB7CiAgZm9yZWFjaCBjIFsk
bmFtZSBpbmZvIHN1cGVyY2xhc3NdIHsgCiAgICBpZiB7IVtbc2VsZl0gY2hlY2tDbGFzcyAk
bmFtZSAkY119IHsKICAgICAgcmV0dXJuIDAKICAgIH0KICB9CiAgcmV0dXJuIDEKfQoKU2Ny
aXB0Q3JlYXRvciBpbnN0cHJvYyBpc0FwcGVuZGVkIG5hbWUgewogIHNldCBuIFtzdHJpbmcg
dHJpbWxlZnQgJG5hbWUgOl0KICBpZiB7W2xzZWFyY2ggW1tzZWxmXSBzZXQgYXBwZW5kZWRO
YW1lc10gJG5dIT0tMX0gewogICAgcmV0dXJuIDEKICB9IGVsc2UgewogICAgcmV0dXJuIDAK
ICB9Cn0KClNjcmlwdENyZWF0b3IgaW5zdHByb2MgYXBwZW5kTmFtZSBuYW1lIHsKICBzZXQg
biBbc3RyaW5nIHRyaW1sZWZ0ICRuYW1lIDpdCiAgbGFwcGVuZCBbc2VsZl06OmFwcGVuZGVk
TmFtZXMgJG4KfQoKU2NyaXB0Q3JlYXRvciBpbnN0cHJvYyByZXNldCB7fSB7CiAgW3NlbGZd
IHNldCBhcHBlbmRlZE5hbWVzICIiCn0KClNjcmlwdENyZWF0b3IgaW5zdHByb2MgbWFrZVNj
cmlwdCBhcmdzIHsKICBbc2VsZl0gaW5zdHZhciBkZXBlbmRlbmN5Q2hlY2tpbmcKICBzZXQg
c2NyaXB0ICIiCiAgZm9yZWFjaCBuYW1lICRhcmdzIHsKICAgICNwdXRzIHN0ZGVyciAiU2Ny
aXB0IENyZWF0b3IgLS0gJG5hbWUiCiAgICBpZiB7IVtbc2VsZl0gaXNFeGNsdWRlZCAkbmFt
ZV0gJiYgCgkhW1tzZWxmXSBpc0FwcGVuZGVkICRuYW1lXX0gewogICAgICAKICAgICAgaWYg
eyRkZXBlbmRlbmN5Q2hlY2tpbmd9IHsKCWlmIHshW1tzZWxmXSBjaGVja1BhcmVudHMgJG5h
bWVdfSB7CgkgIGVycm9yICJTY3JpcHRDcmVhdG9yOiBmb3IgJG5hbWUgcGFyZW50IG5hbWVz
cGFjZSBpcyBub3QgYXBwZW5kZWQgbm9yIGV4Y2x1ZGVkIHlldC4iCgl9CiAgICAgIH0KICAg
ICAgaWYge1tPYmplY3QgaXNvYmplY3QgJG5hbWVdfSB7CglzZXQgY2xhc3MgWyRuYW1lIGlu
Zm8gY2xhc3NdCglpZiB7JGRlcGVuZGVuY3lDaGVja2luZ30gewoJICBpZiB7IVtbc2VsZl0g
Y2hlY2tDbGFzcyAkbmFtZSAkY2xhc3NdfSB7CgkgICAgZXJyb3IgIlNjcmlwdENyZWF0b3I6
IGZvciAkbmFtZSBpdHMgY2xhc3MgaXMgbm90IGFwcGVuZGVkIG5vciBleGNsdWRlZCB5ZXQu
IgoJICB9Cgl9CglpZiB7W09iamVjdCBpc2NsYXNzICRuYW1lXX0gewoJICAjIGFwcGVuZCB0
aGUgY2xhc3MKCSAgI3B1dHMgc3RkZXJyICJBcHBlbmRpbmcgQ2xhc3M6ICRuYW1lIgoJICBh
cHBlbmQgc2NyaXB0ICJbJG5hbWUgaW5mbyBjbGFzc10gJG5hbWUiCgkgIHNldCBzbCBbJG5h
bWUgaW5mbyBzdXBlcmNsYXNzXQoJICBpZiB7JGRlcGVuZGVuY3lDaGVja2luZ30gewoJICAg
IGlmIHshW1tzZWxmXSBjaGVja1N1cGVyY2xhc3NlcyAkbmFtZV19IHsKCSAgICAgIGVycm9y
ICJTY3JpcHRDcmVhdG9yOiBmb3IgJG5hbWUgaXRzIHN1cGVyY2xhc3NlcyBhcmUgbm90IGFw
cGVuZGVkIG5vciBleGNsdWRlZCB5ZXQuIgoJICAgIH0KCSAgfQoJICBpZiB7JHNsICE9ICIi
fSB7CgkgICAgYXBwZW5kIHNjcmlwdCAiIC1zdXBlcmNsYXNzIFx7JHNsXH1cbiIKCSAgfSBl
bHNlIHsKCSAgICBhcHBlbmQgc2NyaXB0ICJcbiIKCSAgfQoJICBhcHBlbmQgc2NyaXB0IFtb
c2VsZl0gaW5zdHByb2NTY3JpcHQgJG5hbWVdCgl9IGVsc2UgewoJICAjIGFwcGVuZCB0aGUg
b2JqCgkgICNwdXRzIHN0ZGVyciAiQXBwZW5kaW5nIE9iamVjdDogJG5hbWUiCgkgIGFwcGVu
ZCBzY3JpcHQgIlskbmFtZSBpbmZvIGNsYXNzXSAkbmFtZVxuIgoJfQoJYXBwZW5kIHNjcmlw
dCBbW3NlbGZdIHByb2NTY3JpcHQgJG5hbWVdCiAgICAgIH0gZWxzZSB7CglhcHBlbmQgc2Ny
aXB0ICJuYW1lc3BhY2UgZXZhbCAkbmFtZSBce1x9XG4iCgkjcHV0cyBzdGRlcnIgIkFwcGVu
ZGluZyBOYW1lc3BhY2U6ICRuYW1lIgogICAgICB9CiAgICAgIFtzZWxmXSBhcHBlbmROYW1l
ICRuYW1lCiAgICB9CiAgfQogIHJldHVybiAkc2NyaXB0Cn0KClNjcmlwdENyZWF0b3IgaW5z
dHByb2MgZ2V0QWxsU3ViQ2xhc3NlcyBjbCB7CiAgc2V0IHJlc3VsdCAiIgogIHNldCBzYyBb
JGNsIGluZm8gc3ViY2xhc3NdCiAgZm9yZWFjaCBjICRzYyB7CiAgICBsYXBwZW5kIHJlc3Vs
dCAkYwogICAgc2V0IHJlc3VsdCBbY29uY2F0ICRyZXN1bHQgW1tzZWxmXSBnZXRBbGxTdWJD
bGFzc2VzICRjXV0KICB9CiAgcmV0dXJuICRyZXN1bHQKfQoKU2NyaXB0Q3JlYXRvciBpbnN0
cHJvYyBnZXRBbGxJbnN0YW5jZXMgY2wgewogIHNldCByZXN1bHQgIiIKICAjIGdldCBhbGwg
c3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzCiAgc2V0IHN1YmNsYXNzZXMgW1tzZWxmXSBnZXRB
bGxTdWJDbGFzc2VzICRjbF0KICAjIG5vdyBnZXQgdGhlIGluc3RhbmNlcyBvZiBldmVyeSBz
dWJjbGFzcwogIGZvcmVhY2ggc2MgJHN1YmNsYXNzZXMgewogICAgc2V0IHJlc3VsdCBbY29u
Y2F0ICRyZXN1bHQgWyRzYyBpbmZvIGluc3RhbmNlc11dCiAgfQogIHNldCByZXN1bHQgW2Nv
bmNhdCAkcmVzdWx0IFskY2wgaW5mbyBpbnN0YW5jZXNdXQogIHJldHVybiAkcmVzdWx0Cn0K
CgpTY3JpcHRDcmVhdG9yIGluc3Rwcm9jIG1ha2VTY3JpcHRGb3JBbGwgYXJncyB7CiAgc2V0
IGFsbE9ianMgW1tzZWxmXSBnZXRBbGxJbnN0YW5jZXMgT2JqZWN0XQogIHNldCBzb2xlT2Jq
cyAiIgogICNwdXRzICJBbGwgb2JqZWN0cyBhcmU6ICRhbGxPYmpzIgogIGZvcmVhY2ggbyAk
YWxsT2JqcyB7CiAgICBpZiB7W09iamVjdCBpc2NsYXNzICRvXX0gewogICAgICBsYXBwZW5k
IGNsYXNzZXMgJG8KICAgICAgaWYge1tPYmplY3QgaXNtZXRhY2xhc3MgJG9dfSB7CglsYXBw
ZW5kIG1ldGFjbGFzc2VzICRvfQogICAgfSBlbHNlIHsKICAgICAgbGFwcGVuZCBzb2xlT2Jq
cyAkbwogICAgfQogIH0KICAjcHV0cyAiQWxsIGNsYXNzZXMgYXJlOiAkY2xhc3NlcyIKICAj
cHV0cyAiQWxsIG1ldGFjbGFzc2VzIGFyZTogJG1ldGFjbGFzc2VzIgoKICBzZXQgc2NyaXB0
ICIiCgogICMKICAjIG1ha2UgY2xhc3Mgc2NyaXB0IGluIG9yZGVyCiAgIwogIHNldCBjbHMg
IiIKICBmb3JlYWNoIGMgJGNsYXNzZXMgewogICAgaWYgeyFbW3NlbGZdIGlzRXhjbHVkZWQg
JGNdfSB7bGFwcGVuZCBjbHMgJGN9CiAgfQogIAogIHNldCBkZWxldGVkIDEKICB3aGlsZSB7
JGRlbGV0ZWQgIT0gMH0gewogICAgc2V0IGRlbGV0ZWQgMAogICAgc2V0IGNsc0luZGV4IDAK
ICAgIGZvcmVhY2ggbmFtZSAkY2xzIHsKICAgICAgaWYge1tbc2VsZl0gY2hlY2tQYXJlbnRz
ICRuYW1lXSAmJgoJICBbW3NlbGZdIGNoZWNrQ2xhc3MgJG5hbWUgWyRuYW1lIGluZm8gY2xh
c3NdXSAmJgoJICBbW3NlbGZdIGNoZWNrU3VwZXJjbGFzc2VzICRuYW1lXX0gewoJCglhcHBl
bmQgc2NyaXB0IFtbc2VsZl0gbWFrZVNjcmlwdCAkbmFtZV0KCWluY3IgZGVsZXRlZAoJc2V0
IGNscyBbbHJlcGxhY2UgJGNscyAkY2xzSW5kZXggJGNsc0luZGV4XQoJaW5jciBjbHNJbmRl
eCAtMQogICAgICB9CiAgICAgIGluY3IgY2xzSW5kZXgKICAgIH0KICB9IAogICNwdXRzICJO
b3QgaGFuZGxlZDogJGNscyIKCiAgIwogICMgYXBwZW5kIG9iamVjdHMKICAjCgogIHNldCBv
YmpzICIiCiAgZm9yZWFjaCBvICRzb2xlT2JqcyB7CiAgICBpZiB7IVtbc2VsZl0gaXNFeGNs
dWRlZCAkb119IHtsYXBwZW5kIG9ianMgJG99CiAgfQogIHNldCBkZWxldGVkIDEKICB3aGls
ZSB7JGRlbGV0ZWQgIT0gMH0gewogICAgc2V0IGRlbGV0ZWQgMAogICAgc2V0IG9iakluZGV4
IDAKICAgIGZvcmVhY2ggbmFtZSAkb2JqcyB7CiAgICAgIGlmIHshW1tzZWxmXSBpc0V4Y2x1
ZGVkICRuYW1lXSAmJgoJICBbW3NlbGZdIGNoZWNrUGFyZW50cyAkbmFtZV0gJiYKCSAgW1tz
ZWxmXSBjaGVja0NsYXNzICRuYW1lIFskbmFtZSBpbmZvIGNsYXNzXV19IHsKCWFwcGVuZCBz
Y3JpcHQgW1tzZWxmXSBtYWtlU2NyaXB0ICRuYW1lXQoJaW5jciBkZWxldGVkCglzZXQgb2Jq
cyBbbHJlcGxhY2UgJGNscyAkb2JqSW5kZXggJG9iakluZGV4XQoJaW5jciBvYmpJbmRleCAt
MQogICAgICB9CiAgICAgIGluY3Igb2JqSW5kZXgKICAgIH0KICB9CiAgI3B1dHMgIk5vdCBo
YW5kbGVkOiAkb2JqcyIKCiAgW3NlbGZdIHJlc2V0CgogIHJldHVybiAkc2NyaXB0Cn0=
--YEwdGK8yMr--