[XML-SIG] So how can _we_ use XML?

JOE_ELLSWORTH@HP-Cupertino-om5.om.hp.com JOE_ELLSWORTH@HP-Cupertino-om5.om.hp.com
Sun, 30 Aug 1998 02:04:56 -0700


--openmail-part-0fa27ddb-00000001
Content-Type: text/plain; charset=US-ASCII; name="BDY.TXT"
Content-Disposition: inline; filename="BDY.TXT"
Content-Transfer-Encoding: 7bit

I would tend to believe that the real value of XML is in allowing client server 
communication of complex data structures across primary architectural 
boundaries.

In that view I have attached a couple of python source modules which show the 
representation of a small data set ran through a few filters showing the data 
in different forms.  When the data complexity passes a two levels of complexity 
XML appears to be a valid approach.  XML appears to expand the data 
significantly over other representative forms but since the parsers are readily 
available in almost any language a lot of other short comings can be over 
looked.

I am not a python expert as these utilities represent a portion of my attempts 
to learn python.  

Execute the file IniMgrTest.py using the Python interpreter.  You should see 
several different ways to look at the data represented in IniMgrTest.ini.  One 
of these is a proof of concept XML generator that will walk any dictionary / 
arrays hashes and generate appropriate XML.


  Thanks joe_ellsworth@hotmail.com

    

-----Original Message-----
From: Non-HP-xml-sig-admin 
/HP-ColSprings,mimegw5/dd.HPMEXT1=xml-sig-admin@python.org 
Sent: Friday, August 28, 1998 9:10 AM
To: Non-HP-xml-sig /HP-ColSprings,mimegw5/dd.HPMEXT1=xml-sig@python.org
Cc: Non-HP-akuchlin /HP-ColSprings,mimegw5/dd.HPMEXT1=akuchlin@cnri.reston.va.us
Subject: Re: [XML-SIG] So how can _we_ use XML?

Sean Mc grath writes:
>[Mark Hammond]
>>I tend to learn best by example, so I would like to start using XML somehow!
>>Sow how can/should Python use XML?  Where do XML documents fit with Python?
>>I dont mean in an esoteric sense - I mean where does it make sense now?  Or
>>at least to be working towards now?  The FAQ example in Lars Marius
>>
>Did you see XML programming in Python in Dobbs? August of
>last year I think.

 February 1998, according to www.ddj.com.  For $5, you can
purchase an electronic copy of the article from the Web site.

 In answer to Mark's question: Mark, are you asking what XML
means to the Python codebase itself, or what XML is good for in
general?

 In general, XML can be used for any tree-structured data, both
for database-ish applications (say, for product catalogs), or for
document-ish applications (HTML will apparently be mutating into an
XML Document Type Definition in the long term, for example).

 If, as seems likely to happen, XML becomes very common, and
the tools are good enough, then when you need a file format, you may
just automatically reach for the XML module, instead of coming up with
your own format from scratch.  That way, your files are fairly
readable, and you gain the ability to run XML validators over them,
load them into XML editors, don't need to debug your own custom
parser, and so forth.  I think Python is powerful enough, and has a
pleasant enough syntax, that we can make dealing with XML a piece of
cake.

 In direct reference to the Python code base, that's a more
tenuous influence.  XML doesn't have many repercussions for the Python
interpreter itself, though it is exerting strong pressure to add wide
string support.  Fred Drake has long been muttering about converting
the Python docs from LaTeX to some SGML or XML-based format, but
there's no obvious Document Type Definition to use; should we invent a
Python-doco specific one, or use an existing thing such as DocBook?
The LaTeX -> *ML transition will probably happen someday, but there's
no great hurry about it; we can wait and see if SGMLtools helps
DocBook take over the world, or if something else comes up.

Mark Hammond wrote:
>Garshol's document is obviously appealing.  Gendoc could possibly generate
>XML instead of direct to HTML?

 pythondoc, Daniel Larsson's rewrite of gendoc, can generate
XML; I keep meaning to get around to looking at it and sending Daniel
some comments.  See http://starship.skyport.net/crew/danilo/pythondoc/
I think his plan is to translate from the XML format to HTML, LaTeX,
RTF, or whatever, instead of having HTML hard-wired into the code as
in gendoc.

-- 
A.M. Kuchling   http://starship.skyport.net/crew/amk/
"Since the invasion of Grenada," a military source informed me, "we call it
C^5. That's Command, Control, Communications, Computers and Confusion."
    -- Barbara Garson, _The Electronic Sweatshop_ (1988)



--openmail-part-0fa27ddb-00000001
Content-Type: application/octet-stream; name="mva.py"
Content-Disposition: attachment; filename="mva.py"
Content-Transfer-Encoding: base64

IyEvdXNyL2xvY2FsL2Jpbi9weXRob24NCiMgbXZhLnB5DQojDQojIEJ5OiAgam9lX2VsbHN3
b3J0aEBob3RtYWlsLmNvbQ0KIyAgICAgIGpvZV9lbGxzd29ydGhAaHAuY29tDQojDQojIHV0
aWxpdHkgdG8gcHJvY2VzcyBNVkEgc3RydWN0dXJlcy4NCiMgTVZBID0gTXVsdGkgVmFsdWUg
QXJyYXkuICAgVGhlIGludGVudCBvZiBNVkEgaXMgdG8gDQojIHByb3ZpZGUgYSBwb3J0YWJs
ZSBjcm9zcyBhcmNoaXRlY3R1cmUgcmVwcmVzZW50YXRpb24NCiMgb2YgYXJiaXRyYWlsaWx5
IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFzIGRlZXBseSBuZXN0ZWQNCiMgY29udGFpbm1l
bnQgYXMgbmVjZXNzYXJ5LiAgIFRoZSBvcmlnaW5hbCBpbnRlbnQgd2FzIHRvDQojIGluY2x1
ZGUgaGFzaCBvciBoYXNoIGJ1dCBoYXMgYmVlbiBleHRlbmRlZCB0byBpbmNsdWRlDQojIGFu
IGFycmF5IC8gbGlzdCBvZiBzaW1wbGUgaXRlbXMgYXQgYW55IGFyYml0cmFyeSBkZXB0aC4N
CiMgbGlzdCBpdGVtcyBkbyBub3QgY3VycmVudGx5IHN1cHBvcnQgcmVjdXJzaXZlIGRlc2Nl
bnQNCiMgTVZBIGltcGxlbWVudGF0aW9ucyBleGlzdCBmb3IgUGVybCwgSmF2YSwgVkIsIEMg
YW5kIA0KIyBzY3JpcHQuDQojDQojIE5vdGU6ICANCiMNCiMgTm90ZTogVGhpcyBsaWJyYXJ5
IGlzIGV4cGVjdGVkIHRvIGNvLWV4aXN0IHdpdGggYW5kIA0KIyAgIHByb3ZpZGUgaGVscGVy
IGZ1bmN0aW9uYWxpdHkgdG8gaW5pTWdyLg0KIyAgIEFzSW5pU3RyKCkgY2FuIGJlIG9idGFp
bmVkIHRocm91Z2ggaW5pTWdyLnB5DQojICAgYnV0IGl0IGNhbiBvbmx5IGhhbmRsZSBncm91
cCAvIGl0ZW0gbGV2ZWwNCiMgICBkZXB0aCByYXRoZXIgdGhhbiB0aGUgYXJiaXRyYXJ5IGRl
cHRoIG9mIHRoZSBNVkEuDQojDQoNCg0KaW1wb3J0IHN0cmluZw0KaW1wb3J0IHRpbWUNCg0K
a2V5RGVsaW0gID0gJz0jPScNCmxpc3REZWxpbSA9ICc9Xj0nDQoNCg0KIyAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0NCmRlZiBnZXREZWxpbShsZXZlbCk6DQoj
IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KICBhRGVsaW0gPSAn
IyVkIycgJSAobGV2ZWwpDQogIHJldHVybiBhRGVsaW0NCg0KIyAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0NCmRlZiBwYXJzZU1WQUZpbGUoYUZpTmFtZSk6DQoj
IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KICAjIFRPRE86IEFk
ZCBFcnJvciBDaGVja2luZyBleGNlcHRpb24NCiAgYUZpID0gb3BlbiAoYUZpTmFtZSkNCiAg
YVN0ciA9IGFGaS5yZWFkKCkgIyByZWFkIGVudGlyZSBjb250ZW50cy4NCiAgYU9iaiA9IHBh
cnNlTVZBU3RyKGFTdHIsMCkNCiAgcmV0dXJuIGFPYmoNCg0KIyAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0NCmRlZiBwYXJzZU1WQVN0cihhU3RyLGFMZXYpOg0K
IyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0NCiAgYURpY3QgPSB7
fQ0KICBhRGVsaW0gPSBnZXREZWxpbShhTGV2KQ0KICBueHREZWxpbSA9IGdldERlbGltKGFM
ZXYgKyAxKQ0KICBhQXJyID0gc3RyaW5nLnNwbGl0KGFTdHIsYURlbGltKQ0KICAjIHByaW50
ICJsZXZlbD0lZCAgZGVsaW09JXMgIGFBcnI9IiAlIChhTGV2LCBhRGVsaW0pDQogIGZvciBh
RWxlIGluIGFBcnI6DQogICAgYVN1YkFyciA9IHN0cmluZy5zcGxpdChhRWxlLGtleURlbGlt
LCAxKQ0KICAgIGlmIGxlbihhU3ViQXJyKSA+IDE6DQogICAgICBhS2V5ID0gYVN1YkFyclsw
XQ0KICAgICAgYVZhbCA9IGFTdWJBcnJbMV0NCiAgICAgICMgcHJpbnQgImFLZXk9IiwgYUtl
eQ0KICAgICAgYVBvcyA9IHN0cmluZy5maW5kKGFWYWwsIG54dERlbGltKSAjIFJlY3Vyc2l2
ZSBPYmplY3QNCiAgICAgICMgcHJpbnQgImFLZXk9IiwgYUtleSwgICJhUG9zPSIsIGFQb3Ms
ICJueHREZWxpbT0iLCBueHREZWxpbQ0KICAgICAgaWYgKGFQb3MgPj0gMCk6DQogICAgICAg
IGFWYWwgPSBwYXJzZU1WQVN0cihhVmFsLCAoYUxldiArIDEpKQ0KICAgICAgICAjIHByaW50
ICJhUG9zPSIsIGFQb3MsICJhS2V5IHN1Yk9iaiAiLCBhTGV2LCAiICAiLCBhS2V5DQogICAg
ICAgIGFEaWN0W2FLZXldID0gYVZhbA0KICAgICAgZWxzZTogICAgICANCiAgICAgICAgYUxp
c3RQb3MgPSBzdHJpbmcuZmluZChhVmFsLCBsaXN0RGVsaW0pDQogICAgICAgIGlmIChhTGlz
dFBvcyA8IDEpOg0KICAgICAgICAgIGFEaWN0W2FLZXldID0gYVZhbA0KICAgICAgICBlbHNl
OiANCiAgICAgICAgICAjIHByb2Nlc3MgYXMgYSBsaXN0Lg0KICAgICAgICAgIGFMaXN0QXJy
ID0gc3RyaW5nLnNwbGl0KGFWYWwsbGlzdERlbGltKQ0KICAgICAgICAgIGlmIG5vdCBhTGlz
dEFyclstMV06DQogICAgICAgICAgICBkZWwgYUxpc3RBcnJbLTFdDQogICAgICAgICAgYURp
Y3RbYUtleV0gPSBhTGlzdEFycg0KICAgIGVsc2U6DQogICAgICBjb250aW51ZSAgICMgRG9u
J3QgZG8gYW55dGhpbmcsIFRoaXMgZ2VuZXJhbHkgaW5kaWNhdGVzDQoJICAgICAgICAgIyBj
YXRhc3Ryb3BoaWMgcGFyc2UgZmFpbHVyZS4NCiAgcmV0dXJuIGFEaWN0DQoNCg0KICANCg0K
IyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0NCmRlZiBkdW1wTVZB
KGFEaWN0LGFMZXYpOg0KIyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAt
IC0NCiAgIyAgTG9vcCB0aHJvdWdoIHRoZSBTdHJ1Y3R1cmUgYW5kIG91dHB1dCBpbiBUYWIN
CiAgIyAgZm9ybSBzbyB3ZSBjYW4gdXNlIGl0IHRvIHZhbGlkYXRlIHRoZSBwYXJzZWQNCiAg
IyAgaW5wdXQuDQogIGtleXMgPSBhRGljdC5rZXlzKCkNCiAga2V5cy5zb3J0KCkNCiAgcGFk
U3RyID0gJyAgJyAqIGFMZXYNCiAgZm9yIGFLZXkgaW4ga2V5czoNCiAgICBhRWxlID0gYURp
Y3RbYUtleV0NCiAgICBpZiB0eXBlKGFFbGUpID09IHR5cGUoe30pOiAgICAgIAkJIyBFbWJl
ZGVkIERpY3Rpb25hcnkNCiAgICAgIHByaW50IHBhZFN0ciwgYUtleSwgIj0+IiAgICAgIAkJ
IyBtdXN0IHJlY3Vyc2l2ZWx5DQogICAgICBkdW1wTVZBKGFFbGUsIChhTGV2ICsgMSkpICAg
ICAJCSMgb3V0cHV0IHRoZSBzdWIgZGljdA0KICAgIGVsaWYgdHlwZShhRWxlKSA9PSB0eXBl
KFtdKTogICAgCQkjIEVtYmVkZGVkIExpc3QNCiAgICAgIHByaW50IHBhZFN0ciwgYUtleSwg
bGlzdERlbGltIAkJIyBtdXN0IGxvb3AgdGhyb3VnaCANCiAgICAgIGZvciBsaXN0SXRlbSBp
biBhRWxlOiAgICAgICAgIAkJIyB0aGUgaXRlbXMgYW5kIG91dHB1dA0KICAgICAgICBwcmlu
dCBwYWRTdHIsICIgICAiLCBsaXN0SXRlbSAgCQkjIGVhY2ggaXRlbQ0KICAgIGVsc2U6ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgCQkjIFNpbXBsZSBTdHJpbmcNCiAgICAgIHByaW50
IHBhZFN0ciwgYUtleSwgIj0iLCBhRWxlIAkJIyBqdXN0IHByaW50IGl0IG91dA0KICAgDQoN
CiMgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtDQpkZWYgYXNNVkFT
dHIoYURpY3QsYUxldik6DQojIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAt
IC0gLQ0KICAjICBMb29wIHRocm91Z2ggdGhlIFN0cnVjdHVyZSBhbmQgb3V0cHV0IGluIFRh
Yg0KICAjICBmb3JtIHNvIHdlIGNhbiB1c2UgaXQgdG8gdmFsaWRhdGUgdGhlIHBhcnNlZA0K
ICAjICBpbnB1dC4NCiAga2V5cyA9IGFEaWN0LmtleXMoKQ0KICBrZXlzLnNvcnQoKQ0KICBz
dHJzID0gW107DQogIGRlbGltID0gZ2V0RGVsaW0oYUxldikNCiAgZm9yIGFLZXkgaW4ga2V5
czoNCiAgICBhRWxlID0gYURpY3RbYUtleV0NCiAgICBpZiB0eXBlKGFFbGUpID09IHR5cGUo
e30pOiAgICAgIAkJIyBFbWJlZGVkIERpY3Rpb25hcnkNCiAgICAgIHN0cnMuYXBwZW5kKGFL
ZXkgKyBrZXlEZWxpbSkJICAgICAgICAjIG11c3QgcmVjdXJzaXZlbHkNCiAgICAgIHN1Yk9i
alN0ciA9IGFzTVZBU3RyKGFFbGUsIChhTGV2ICsgMSkpICAgICMgb3V0cHV0IHRoZSBzdWIg
ZGljdA0KICAgICAgc3Rycy5hcHBlbmQoc3ViT2JqU3RyKQ0KICAgIGVsaWYgdHlwZShhRWxl
KSA9PSB0eXBlKFtdKTogICAgCQkjIEVtYmVkZGVkIExpc3QNCiAgICAgIHN0cnMuYXBwZW5k
KGFLZXkgKyBrZXlEZWxpbSkgICAJCSMgbXVzdCBsb29wIHRocm91Z2ggDQogICAgICBmb3Ig
bGlzdEl0ZW0gaW4gYUVsZTogICAgICAgICAJCSMgdGhlIGl0ZW1zIGFuZCBvdXRwdXQNCiAg
ICAgICAgYUxpc1N0ciA9ICIlcyVzIiAlIChsaXN0SXRlbSxsaXN0RGVsaW0pICMgDQogICAg
ICAgIHN0cnMuYXBwZW5kKGFMaXNTdHIpCSAgCQkjIGVhY2ggaXRlbQ0KICAgIGVsc2U6ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgCQkjIFNpbXBsZSBTdHJpbmcNCiAgICAgIHN0cnMu
YXBwZW5kKGFLZXkgKyBrZXlEZWxpbSArIGFFbGUpCSMganVzdCBwcmludCBpdCBvdXQNCiAg
ICBzdHJzLmFwcGVuZChkZWxpbSkNCiAgYVN0ciA9IHN0cmluZy5qb2luKHN0cnMsICcnKQ0K
ICByZXR1cm4gYVN0cg0KIA0KIyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0NCmRlZiBhc1hNTFN0cihhRGljdCxhTGV2KToNCiMgLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0gLSAtDQogICMgIExvb3AgdGhyb3VnaCB0aGUgU3RydWN0dXJl
IGFuZCBvdXRwdXQgaW4gVGFiDQogICMgIGZvcm0gc28gd2UgY2FuIHVzZSBpdCB0byB2YWxp
ZGF0ZSB0aGUgcGFyc2VkDQogICMgIGlucHV0Lg0KICBrZXlzID0gYURpY3Qua2V5cygpDQog
IGtleXMuc29ydCgpDQogIHN0cnMgPSBbXQ0KICBwYWRTdHIgPSAnICAnICogYUxldg0KICBm
b3IgYUtleSBpbiBrZXlzOg0KICAgIHRhaWxTdHIgPSAnJw0KICAgIGFFbGUgPSBhRGljdFth
S2V5XQ0KICAgIGlmIHR5cGUoYUVsZSkgPT0gdHlwZSh7fSk6ICAgICAgCQkjIEVtYmVkZWQg
RGljdGlvbmFyeQ0KICAgICAgc3Rycy5hcHBlbmQocGFkU3RyICsgJzwnICsgYUtleSArICc+
XG4nKQ0KICAgICAgc3ViT2JqU3RyID0gYXNYTUxTdHIoYUVsZSwgKGFMZXYgKyAxKSkgICAg
IyBvdXRwdXQgdGhlIHN1YiBkaWN0DQogICAgICBzdHJzLmFwcGVuZChzdWJPYmpTdHIpDQog
ICAgICB0YWlsU3RyID0gcGFkU3RyICsgJzxcXCcgKyBhS2V5ICsgJz5cbicNCiAgICBlbGlm
IHR5cGUoYUVsZSkgPT0gdHlwZShbXSk6ICAgIAkJIyBFbWJlZGRlZCBMaXN0DQogICAgICBm
b3IgbGlzdEl0ZW0gaW4gYUVsZTogICAgICAgICAJCSMgdGhlIGl0ZW1zIGFuZCBvdXRwdXQN
CiAgICAgICAgc3Rycy5hcHBlbmQocGFkU3RyICsgJzwnICsgYUtleSArICc+JykNCiAgICAg
ICAgc3Rycy5hcHBlbmQobGlzdEl0ZW0pICAgIAkJIyBlYWNoIGl0ZW0NCiAgICAgICAgc3Ry
cy5hcHBlbmQoJzxcXCcgKyBhS2V5ICsgJz5cbicpDQogICAgZWxzZTogICAgICAgICAgICAg
ICAgICAgICAgICAgICAJCSMgU2ltcGxlIFN0cmluZw0KICAgICAgc3Rycy5hcHBlbmQocGFk
U3RyICsgJzwnICsgYUtleSArICc+JykNCiAgICAgIHN0cnMuYXBwZW5kKGFFbGUpCQkJCSMg
anVzdCBwcmludCBpdCBvdXQNCiAgICAgIHN0cnMuYXBwZW5kKCc8XFwnICsgYUtleSArICc+
XG4nKQ0KICAgIHN0cnMuYXBwZW5kKHRhaWxTdHIpDQogIGFTdHIgPSBzdHJpbmcuam9pbihz
dHJzLCAnJykNCiAgcmV0dXJuIGFTdHINCg0KIyAqICogKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqDQojICogKiBNYWluIExpbmUgUHJvZ3JhbSBTZWN0aW9uDQoj
ICogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCmRlZiBleGVj
dXRlVGVzdChhRmlOYW1lKToNCiAgYU9iaiA9IHBhcnNlTVZBRmlsZShhRmlOYW1lKQ0KICAj
IGFGaSA9IG9wZW4gKGFGaU5hbWUpDQogICMgYVN0ciA9IGFGaS5yZWFkKCkgIyByZWFkIGVu
dGlyZSBjb250ZW50cy4NCiAgIyBhT2JqID0gcGFyc2VNVkFTdHIoYVN0ciwwKQ0KICBwcmlu
dCAibXZhUGFyc2UgY29tcGxldGUiDQogIGR1bXBNVkEoYU9iaiwwKQ0KDQogICMgdGVzdCBy
ZWJ1aWxkaW5nIHRoZSBNVkEgU3RyaW5nIGZyb20gaW5idWlsdCBPYmplY3QNCiAgYVN0ck91
dCA9IGFzTVZBU3RyKGFPYmosMCkNCiAgcHJpbnQgIlxucmVidWlsdCBtdmE9Ig0KICBwcmlu
dCBhU3RyT3V0DQogIHByaW50ICJcblxuXG4gYXNQeXRob25TdHIiDQogIHByaW50IGFPYmoN
Cg0KDQoNCg0KDQoNCg0KICANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoN
Cg0KDQoNCg0K

--openmail-part-0fa27ddb-00000001
Content-Type: application/octet-stream; name="iniMgr.py"
Content-Disposition: attachment; filename="iniMgr.py"
Content-Transfer-Encoding: base64

IyEvdXNyL2xvY2FsL2Jpbi9weXRob24NCiMgIGluaW1nci5weQ0KIyAgYSB3aW5kb3dzIElO
SSBmaWxlIGNvbXBhdGlibGUgcGFyc2VyIC8gc2VyaWFsaXplcg0KIw0KIyAgVGhlc2UgZnVu
Y3Rpb25zIGFyZSBpbnRlbmRlZCB0byBiZSB3cmFwcGVkIHVwIGluDQojICBhIFB5dGhvbiBD
bGFzcy4NCiMNCiMgIEJ5OiBKb3NlcGggRWxsc3dvcnRoIEF1Zy0yMy0xOTk4DQojICAgICAg
am9lX2VsbHN3b3J0aEBob3RtYWlsLmNvbQ0KIyAgICAgIGpvZV9lbGxzd29ydGhAaHAuY29t
DQojDQojICBGb3JnaXZlIGFueSBzdHVwaWRpdHkgYXMgdGhpcyBpcyBteSBmaXJzdCBweXRo
b24gDQojICBsaWJyYXJ5IA0KIw0KIyAgVGhpcyBtb2R1bGUgaGFuZGxlcyBpbnB1dCBhbmQg
b3V0cHV0IGluIGEgbnVtYmVyDQojICBvZiBmb3JtYXRzIGJ1dCBpdCdzIHVuZGVybHlpbmcg
YXNzdW1wdGlvbiBpcyB0aGF0DQojICB3ZSB3aWxsIG5vdCBleGNlZWQgdGhlIGNvbXBsZXhp
dHkgb2Ygb2JqZWN0cyBjYXBhYmxlDQojICBvZiBiZWluZyByZXByZXNlbnRlZCBpbiBhbiBJ
TkkgZmlsZS4NCiMNCiMNCiMgIEJ5IENvbnZlcnRpbmcgdGhpcyB0byBhIE9iamVjdCB3ZSBj
b3VsZCB1c2UgaW50YW5jZQ0KIyAgdmFyaWFibGVzIHRvIHJlbW92ZSBzb21lIGNvbXBsZXhp
dHkuICBUaGUgcXVlc3Rpb24NCiMgIGlzIHRoYXQgc2luY2UgdGhlIGdyb3VwIGlzIHNvIGNs
b3NlIHRvIHRoZSBkaWN0aW9uYXJ5DQojICB3aGV0aGVyIGl0IG1ha2VzIHNlbnNlIHRvIG1h
a2UgaXQgYSBzdWIgY2xhc3Mgb3INCiMgIHdoZXRoZXIgdGhhbiB0byBsZWF2ZSB0aGlzIGFu
ZCB1c2UgaXQgYXMgYSBoZWxwZXINCiMgIGZ1bmN0aW9uLg0KDQoNCmltcG9ydCBzdHJpbmcN
CmltcG9ydCB0aW1lDQoNCg0KIyAqICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqDQojICogKiBJbnB1dCBDb252ZXJzdGlvbiBBZGFwdGVycw0KIyAqICogKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQojICogKiBTaG91bGQgVXNl
IEhlbHBlciBDbGFzc2VzIGZvciB0aGlzIGluDQojICogKiBPcmRlciB0byBtYXhpbWl6ZSB0
aGUgZnV0dXJlIGZsZXhpYmlsaXR5DQojICogKiB3aXRoIG91dCBjaGFuZ2luZyBiYXNlIGNs
YXNzLg0KIyAqICogKioNCiMgKiAqIFRoaXMgc2VjdGlvbiBpcyBvbmx5IGludGVuZGVkIHRv
IGJlIGFibGUNCiMgKiAqIHRvIHJlYWQgc3RydWN0dXJlcyBpbiBjb21tb24gY3Jvc3MgbGFu
Z2FnZQ0KIyAqICogcG9ydGFibGUgZm9ybWF0cyBzbyBldmVuIHRob3VnaCB3ZSBtYXkNCiMg
KiAqIGdlbmVyYXRlIFBlcmwgd2UgaGF2ZSBubyBpbnRlbnRpb24gb2YNCiMgKiAqIHBhcnNp
bmcgaXQuDQojICogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioN
Cg0KIyAjIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KIyBjbGFz
cyBpbmlNZ3IoZGljdGlvbmFyeSkNCiMgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLSAtDQojICBkZWYgZnJvbUlOSUZpbGUoKToNCiMgIGRlZiBmcm9tTVZBRmlsZSgp
Og0KIyAgZGVmIGZyb21YTUxGaWxlKCk6DQojICBkZWYgYXNJTklTdHIoKToNCiMgIGRlZiBh
c1BlcmxTdHIoKToNCiMgIGRlZiBhc01WQVN0cigpOg0KIyAgZGVmIGFzWE1MU3RyKCk6DQoj
ICBkZWYgYXNQaHl0aG9uU3RyKCk6DQoNCg0KIyAqICogKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqDQojICogKiBJbnB1dCBDb252ZXJzaW9uIEFkYXB0ZXJzDQoj
ICogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg0KDQojIC0g
LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KZGVmIGZyb21JbmlGaWxl
KGFGaU5hbWUpOg0KIyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0N
CiAgYUZpICAgID0gb3BlbiAoYUZpTmFtZSkNCiAgYURpY3QgID0ge307IA0KICAjIFNldCB1
cCB0aGUgZGVmYXVsdCBtYWluIGdyb3VwIHNvIGFsbCBpdGVtcw0KICAjIGF0IHRoZSB0b3Ag
b2YgdGhlIElOSSBmaWxlIGRlZmF1bHQgaW4gdG8gaXQuDQogIGFHcm91cE5hbWUgPSAnbWFp
bicNCiAgYUdyb3VwID0ge30NCiAgYURpY3RbYUdyb3VwTmFtZV0gPSBhR3JvdXANCiAgd2hp
bGUgKDEpOg0KICAgIGFMaW5lID0gYUZpLnJlYWRsaW5lKCkNCiAgICBpZiBub3QgYUxpbmUg
OiBicmVhayAgICAgICAgICAjIGZhaWx1cmUgdG8gcmVhZCBpbmRpY2F0ZXMgRU9GDQogICAg
YUxpbmUgPSB0cmltQ29tbWVudHMoYUxpbmUpDQogICAgaWYgbm90IGFMaW5lIDogIGNvbnRp
bnVlICAgICAgIyBpZiBlbXB0eSB3aGVuIGRvbmUgdGhlbiBza2lwDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIyBpdCB3aWxsIGJlIGVtcHR5IGlmIGl0IG9ubHkNCiAg
ICBpZiAoYUxpbmVbMF0gKyBhTGluZVstMV0pID09ICdbXSc6DQogICAgICAjIEhhdmUgZW5j
b3VudGVyZWQgYSBHcm91cCBEZWZlbml0aW9uDQogICAgICBhR3JvdXBOYW1lID0gYUxpbmVb
MTotMV0NCiAgICAgIGlmIGFEaWN0Lmhhc19rZXkoYUdyb3VwTmFtZSk6DQogICAgICAgIGFH
cm91cCA9IGFEaWN0W2FHcm91cE5hbWVdDQogICAgICBlbHNlOg0KICAgICAgICBhR3JvdXAg
PSB7fQ0KICAgICAgICBhRGljdFthR3JvdXBOYW1lXSA9IGFHcm91cA0KICAgIGVsc2U6DQog
ICAgICAjIFByb2Nlc3NpbmcgYSBLZXkgdmFsdWUgRGVmZW5pdGlvbg0KICAgICAgYUxpc3Qg
PSBzdHJpbmcuc3BsaXQoYUxpbmUsJz0nLDEpDQogICAgICBpZiAobGVuKGFMaXN0KSA8IDIp
Og0KICAgICAgICBjb250aW51ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3QgYSBr
ZXkgdmFsdWUgcGFpciBzbyBpZ25vcmUNCiAgICAgIGVsc2U6DQogICAgICAgIGFLZXkgPSBz
dHJpbmcuc3RyaXAoYUxpc3RbMF0pDQogICAgICAgIGFWYWwgPSBzdHJpbmcubHN0cmlwKGFM
aXN0WzFdKQ0KICAgICAgICBpZiBhR3JvdXAuaGFzX2tleShhS2V5KToNCiAgICAgICAgICBh
SXRlbSA9IGFHcm91cFthS2V5XSAgICAgICAgICAgICMgaXRlbSBleGlzdHMgdGhlbiBhZGQg
dG8gaXQuDQogICAgICAgICAgaWYgaXNMaXN0KGFJdGVtKTogICAgICAgICAgICAgICAjIGlm
IGFscmVhZHkgbXVsdGlwbGUgaXRlbSBsaXN0DQogICAgICAgICAgICBhSXRlbS5hcHBlbmQo
YVZhbCkgICAgICAgICAgICAjIHRoZW4gYWRkIHRvIGVuZCBvZiBpdA0KICAgICAgICAgIGVs
c2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UNCiAgICAgICAgICAg
IGFHcm91cFthS2V5XSA9IFthSXRlbSwgYVZhbF0gICMgbmVlZCB0byBjb252ZXJ0IGZyb20g
c2ltcGxlIGl0ZW0gdG8gYSBsaXN0IG9mIGl0ZW1zDQogICAgICAgIGVsc2U6ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAjIERpZCBub3QgZXhpc3Qgc28gd2lsbA0KICAgICAgICAg
IGFHcm91cFthS2V5XSA9IGFWYWwgICAgICAgICAgICAgIyBjcmVhdGUgdGhlIGZpcnN0IGl0
ZW0gYXMgc2ltcGxlIGtleS92YWx1ZSBwYWlyDQogICMgZW5kIFdoaWxlDQogIGFGaS5jbG9z
ZSgpDQogIHJldHVybiBhRGljdA0KDQojIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAt
IC0gLSAtIC0gLQ0KZGVmIGZyb21NVkFTdHIoYVN0cik6DQojIC0gLSAtIC0gLSAtIC0gLSAt
IC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KICBpbXBvcnQgbXZhDQogIG12YSA9IG12YS5wYXJz
ZU1WQVN0cihhU3RyLDApDQogIHJldHVybiBtdmENCg0KIyAtIC0gLSAtIC0gLSAtIC0gLSAt
IC0gLSAtIC0gLSAtIC0gLSAtIC0NCmRlZiBmcm9tTVZBRmlsZShhRmlsZU5hbWUpOg0KIyAt
IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0NCiAgaW1wb3J0IG12YQ0K
ICBtdmEgPSBtdmEucGFyc2VNVkFGaWxlKGFGaWxlLGFMZXYpDQogIHJldHVybiBtdmENCg0K
DQoNCg0KIyAqICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoj
ICogKiBPdXRwdXQgQ29udmVyc3Rpb24gQWRhcHRlcnMNCiMgKiAqICoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKg0KIyAqICogU2hvdWxkIFVzZSBIZWxwZXIgQ2xh
c3NlcyBmb3IgdGhpcyBpbg0KIyAqICogT3JkZXIgdG8gbWF4aW1pemUgdGhlIGZ1dHVyZSBm
bGV4aWJpbGl0eQ0KIyAqICogd2l0aCBvdXQgY2hhbmdpbmcgYmFzZSBjbGFzcy4NCiMgKiAq
ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KIyBUaGlzIHNlY3Rp
b24gaXMgaW50ZW5kZWQgdG8gYmVjb21lDQojIHRoZSBiYXNpcyBvZiBhIElOSSBmaWxlIGNv
bXBpbGVyIHdoaWNoDQojIGNhbiBsb29wIHRocm91Z2ggYSBmaWxlIHN5c3RlbSBmaW5kaW5n
DQojIGFsbCBvZiB0aGUgSU5JIGZpbGVzIGFuZCBjb21waWxpbmcgdGhlbQ0KIyBpbnRvIGZp
bGVuYW1lLmluaS5weSBhbmQgZmlsZW5hbWUuaW5pLnBlcmxEYXQNCiMgd2hlcmUgLnB5IGlz
IHRoZSBweXRob24gZXF1aXZlbGVudCBvZiB0aGUNCiMgcHl0aG9uIHJlcHJlc2VudGF0aW9u
IG9mIHRoZSBzb3VyY2UgYW5kDQojIHBlcmxEYXQgdGhlIHBlcmwgbmF0aXZlIHJlcHJlc2Vu
dGF0aW9uIG9mIHRoZQ0KIyBzdHJ1Y3R1cmUuICBUaGlzIGlzIGludGVuZGVkIHRvIG9wdGlt
aXplDQojIGxvYWR0aW1lcyBieSB1c2luZyB0aGUgbGFuZ3VhZ2VzIGJ1aWx0IGluDQojIGlu
dGVycHJldGVyIHdoaWxlIHByZXNlcnZpbmcgdGhlIHNpbXBsaWNpdHkNCiMgb2YgdGhlIElO
SSBmaWxlcy4NCg0KIyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0N
CmRlZiBkaWN0QXNQeXRob25TdHIoYURpY3QpOg0KIyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0NCiAgYVN0ciA9ICclcycgJSAoYURpY3QpDQogIHJldHVybiBh
U3RyDQoNCg0KIyAqICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
DQojICogKiBUaGlzIHNlY3Rpb24gaXMgdGhlIHRlc3QgZHVtcCB1dGlsaXR5DQojICogKiBp
dCBtdXN0IGJlIGFibGUgdG8gZ2VuZXJhdGUgYW4gSU5JDQojICogKiBmdW5jdGlvbmFsbHkg
ZXF1aXZlbGFudCB0byB0aGUgb3JpZ2luYWwNCiMgKiAqIHdoaWNoIHdhcyBwYXJzZWQgaW4g
b3JkZXIgdG8gYmUgY29uc2lkZXJlZA0KIyAqICogc3VjZXNzZnVsLiAgVGhpcyBjb3VsZCBi
ZSBjb25zaWRlcmVkIGFuDQojICogKiBpbnN0YW5jZSBvZiBhbiBvdXRwdXQgYWRhcHRlciBi
dXQgaXQNCiMgKiAqIHByb2JhYmx5IHdpbGwgbmV2ZXIgYmUgdXNlZCBvdGhlciB0aGFuDQoj
ICogKiB0byBwcm9kdWNlIGh1bWFuIHJlYWRpYmxlIG91dHB1dC4NCiMgKiAqICoqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KIyAtIC0gLSAtIC0gLSAtIC0gLSAt
IC0gLSAtIC0gLSAtIC0gLSAtIC0NCmRlZiAgZGljdEFzSW5pU3RyKGFEaWN0KToNCiMgLSAt
IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtDQoNCiAgYVN0cnMgPSBbXTsg
ICMgYXBwZW5kaW5nIHRvIGxpc3QgaXMgZmFzdGVyIHRoYW4gY29uY2F0IFNUUg0KCSAgICAg
ICAjIHdoYXQgd2UgcmVhbGx5IG5lZWQgaGVyZSBpcyBhIHN0cmluZ0J1ZmZlciBsaWtlIEph
dmENCiAgICAgICAgICAgICAgICMgc28gd2UgY2FuIGFwcGVuZCBzdHJhaWdodCBpbiB0byB0
aGUgYnVmZmVyLg0KICBhU3Rycy5hcHBlbmQoJ1wjIEdlbmVyYXRlZCBieSBpbmlNZ3IucHkg
JyArIGN1cnJUaW1lU3RhbXAoKSkNCiAgIyBvdXRwdXQgdGhlIG1haW4gZGVmYXVsdCBncm91
cCBmaXJzdA0KICBhR3JwID0gYURpY3RbJ21haW4nXSAgICAgICAgICAgICAgICAgICAgIyBQ
dWxsIG91dCBNYWluIGFuZCBvdXRwdXQgaXQgYXQgdG9wDQogIGdyb3VwQXNJbmlTdHIoJ21h
aW4nLCBhR3JwLCBhU3RycykNCg0KICAjIG5vdyBvdXRwdXQgdGhlIHJlc3Qgb2YgdGhlIGdy
b3Vwcw0KICBncnBLZXlzID0gYURpY3Qua2V5cygpDQogIGZvciBhR3JwS2V5IGluIGdycEtl
eXM6DQogICAgYUdycCA9IGFEaWN0W2FHcnBLZXldDQogICAgaWYgbm90IChhR3JwS2V5ID09
ICdtYWluJyk6ICAgICAgICAgICAjIFNraXAgTWFpbiBiZWNhdXNlIHdlIGFscmVhZHkgZHVt
cGVkIGl0DQogICAgICBncm91cEFzSW5pU3RyKGFHcnBLZXksIGFHcnAsIGFTdHJzKQ0KICBh
U3RyID0gc3RyaW5nLmpvaW4oYVN0cnMpICMgTWVyZ2UgTGlzdCB0b2dldGhlciBpbiBzaW5n
bGUgc3RyaW5nDQogIHJldHVybiBhU3RyDQoNCiMgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSAtDQpkZWYgZ3JvdXBBc0luaVN0cihhR3JwS2V5LCBhR3JwLCBhU3Ry
cyk6DQojIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KICAjIGhl
bHBlciBmb3IgZGljdEFzSW5pDQogICMgY291bGQgYnJlYWsgaW4gdG8gc2VwYXJhdGUgZnVu
Y3Rpb24gZm9yIHRoZSANCiAgIyBsb29wIGJ1dCBwcm9iYWJseSBsaXR0bGUgYmVuZWZpdC4N
CiAgICBhU3Rycy5hcHBlbmQoJ1xuWycgKyBhR3JwS2V5ICsgJ11cbicpDQogICAgaXRlbUtl
eXMgPSBhR3JwLmtleXMoKQ0KICAgIGZvciBhSXRlbUtleSBpbiBpdGVtS2V5czoNCiAgICAg
IGFJdGVtID0gYUdycFthSXRlbUtleV0NCiAgICAgIGFJdGVtS2V5ID0gc3RyaW5nLmxqdXN0
KGFJdGVtS2V5LCAxMikNCiAgICAgIGlmIGlzTGlzdChhSXRlbSk6DQogICAgICAgIGZvciBh
U3ViSXRlbSBpbiBhSXRlbToNCiAgICAgICAgICBhU3Rycy5hcHBlbmQoJyAgJXMgPSAlc1xu
JyAlIChhSXRlbUtleSwgYVN1Ykl0ZW0pKQ0KICAgICAgZWxzZToNCiAgICAgICAgYVN0cnMu
YXBwZW5kKCcgICVzID0gJXNcbicgJSAoYUl0ZW1LZXksIGFJdGVtKSkNCg0KDQojIC0gLSAt
IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KZGVmIGRpY3RBc1BlcmxTdHIo
YURpY3QpOg0KIyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0NCiAg
YVN0cnMgPSBbXTsgIA0KICBhU3Rycy5hcHBlbmQoJ1wjIEdlbmVyYXRlZCBieSBpbmlNZ3Iu
cHkgJyArIGN1cnJUaW1lU3RhbXAoKSkNCiAgYVN0cnMuYXBwZW5kKCdcbihcbicpDQogIGdy
cEtleXMgPSBhRGljdC5rZXlzKCkNCiAgZm9yIGFHcnBLZXkgaW4gZ3JwS2V5czoNCiAgICBh
R3JwID0gYURpY3RbYUdycEtleV0NCiAgICBhR3JwS2V5ID0gbWFwQmFkVmFyQ2hhcihhR3Jw
S2V5KQ0KICAgIGdyb3VwQXNQZXJsU3RyKGFHcnBLZXksIGFHcnAsIGFTdHJzKQ0KICByZW1v
dmVUcmFpbENoYXIoYVN0cnMsIDEpICMgR2V0IHJpZCBvZiBleHRyYSBjb21tYQ0KICBhU3Ry
cy5hcHBlbmQoJ1xuKVxuJykNCiAgYVN0ciA9IHN0cmluZy5qb2luKGFTdHJzLCcnKSAjIE1l
cmdlIExpc3QgdG9nZXRoZXIgaW4gc2luZ2xlIHN0cmluZw0KICByZXR1cm4gYVN0cg0KICBy
ZXR1cm4gJycNCg0KIyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0N
CmRlZiBncm91cEFzUGVybFN0cihhR3JwS2V5LCBhR3JwLCBhU3Rycyk6DQojIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KICAgIGFTdHJzLmFwcGVuZCgnXG4g
ICcgKyBhR3JwS2V5ICsgJyA9PiAoXG4nKQ0KICAgIGl0ZW1LZXlzID0gYUdycC5rZXlzKCkN
CiAgICBmb3IgYUl0ZW1LZXkgaW4gaXRlbUtleXM6DQogICAgICBhSXRlbSA9IGFHcnBbYUl0
ZW1LZXldDQogICAgICBhSXRlbUtleSA9IG1hcEJhZFZhckNoYXIoYUl0ZW1LZXkpDQogICAg
ICBhSXRlbUtleSA9IHN0cmluZy5sanVzdChhSXRlbUtleSwgMTIpDQogICAgICBpZiBpc0xp
c3QoYUl0ZW0pOg0KICAgICAgICBhU3Rycy5hcHBlbmQoJyAgICAnICsgYUl0ZW1LZXkgKyAn
ID0+IFsnKQ0KICAgICAgICBmb3IgYVN1Ykl0ZW0gaW4gYUl0ZW06DQogICAgICAgICAgYVN0
cnMuYXBwZW5kKCdcIiVzXCIsICcgJSAoYVN1Ykl0ZW0pKQ0KICAgICAgICAjIHJlbW92ZSBl
eHRyYSBjb21tYSBvbiBlbmQgb2YgYVN1Ykl0ZW0NCiAgICAgICAgcmVtb3ZlVHJhaWxDaGFy
KGFTdHJzLCAyKSAjIEdldCByaWQgb2YgZXh0cmEgY29tbWENCiAgICAgICAgYVN0cnMuYXBw
ZW5kKCddICxcbicpDQogICAgICBlbHNlOg0KICAgICAgICBhU3Rycy5hcHBlbmQoJyAgICAn
ICsgYUl0ZW1LZXkgKyAnID0+IFwiJyAgKyBhSXRlbSArICdcIiAsXG4nKQ0KICAgIHJlbW92
ZVRyYWlsQ2hhcihhU3RycywgMikgIyBHZXQgcmlkIG9mIGV4dHJhIGNvbW1hDQogICAgYVN0
cnMuYXBwZW5kKCdcbiAgICksJyk7ICAgDQogDQoNCiMgLSAtIC0gLSAtIC0gLSAtIC0gLSAt
IC0gLSAtIC0gLSAtIC0gLSAtDQpkZWYgZGljdEFzTVZBU3RyKGFEaWN0KToNCiMgLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtDQogIGltcG9ydCBtdmENCiAgYVN0
ciA9IG12YS5hc01WQVN0cihhRGljdCwgMCkNCiAgcmV0dXJuIGFTdHINCg0KDQojIC0gLSAt
IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KZGVmIGRpY3RBc1hNTFN0cihh
RGljdCwgYUxldik6DQojIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LQ0KICAjICBMb29wIHRocm91Z2ggdGhlIFN0cnVjdHVyZSBhbmQgb3V0cHV0IGluIFRhYg0K
ICAjICBmb3JtIHNvIHdlIGNhbiB1c2UgaXQgdG8gdmFsaWRhdGUgdGhlIHBhcnNlZA0KICAj
ICBpbnB1dC4NCiAgaW1wb3J0IG12YQ0KICBhU3RyID0gbXZhLmFzWE1MU3RyKGFEaWN0LCBh
TGV2KQ0KICByZXR1cm4gYVN0cg0KDQogDQojIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLQ0KZGVmIGRpY3RBc0xESUZTdHIoYURpY3QpOg0KIyAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0NCiAgcmV0dXJuICcnDQoNCg0KIyAqICog
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQojICogKiBVdGlsaXR5
IEZ1bnRpb25zIGZvciBQcmltYXJ5IExpYnJhcnkNCiMgKiAqICoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKg0KDQojIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLQ0KZGVmIHRyaW1Db21tZW50cyhhU3RyKToNCiMgLSAtIC0gLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtDQogICMgaG93IHRvIHRyaW0gVHJhaWxpbmcg
Q29tbWVudHMNCiAgc3RyaWR4ID0gc3RyaW5nLmZpbmQoYVN0ciwgJyMnKQ0KICBpZiBzdHJp
ZHg6IA0KICAgIGFTdHIgPSBhU3RyWzpzdHJpZHhdICAgICAgIyB0YWtlIHNlcXVlbmNlIHVw
IHRvICddJw0KICBhU3RyID0gc3RyaW5nLnN0cmlwKGFTdHIpICAgIyBTdHJpcCBhZnRlciBU
cmltIG9yIHdpbGwNCiAgcmV0dXJuIGFTdHIJCSAgICAgICMgaGF2ZSB0byBkbyBpdCB0d2lj
ZSBzaW5jZQ0KCQkJICAgICAgIyBpbiBzb21lIGNvbmRpdGlvbnMgdGhlICANCgkJICAgIA0K
DQojIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KZGVmIGlzTGlz
dChhVGhpbmcpOg0KIyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0N
CiAgaWYgdHlwZShhVGhpbmcpID09IHR5cGUoW10pOg0KICAgIHJldHVybiAxDQogIGVsc2U6
DQogICAgcmV0dXJuIDANCg0KDQojIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLQ0KZGVmIHJlbW92ZVRyYWlsQ2hhcihhU3Rycywgbm9DaGFyKToNCiMgLSAtIC0g
LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtDQojICBJbiBzb21lIGluc3RhbmNl
cyBpdCBpcyBlYXNpZXIgdG8gZ28gYWhlYWQNCiMgIGFuZCBhcHBlbmQgZGVsaW1pdGVycyBv
biBnZW5lcmF0ZWQgc2VxdWVuY2VzDQojICBibGluZGx5IGFuZCB0aGVuIGdvIGJhY2sgYW5k
IHRydW5jYXRlIHRoZSANCiMgIGRlbGltaXRlciBhZnRlciB0aGUgbGFzdCBzZXF1ZW5jZS4g
VGhpcyANCiMgIHJvdXRpbmUgaXMgYnVpbHQgdG8gZG8gdGhpcyB1c2luZyBvdXINCiMgIGFT
dHJzIGJ1ZmZlci4NCiAgbm9DaGFyID0gYWJzKG5vQ2hhcikgKiAtMQ0KICBhU3RyID0gYVN0
cnNbLTFdICAgICAgICAjIEdldCBsYXN0IHN0cmluZyBwdXQgaXQNCiAgZGVsIGFTdHJzWy0x
XSAgICAgICAgICAgIyB0YWtlIGl0IG9mZiB0aGUgbGlzdA0KICBhU3RyID0gYVN0clswOm5v
Q2hhcl0gICAjIFNsaWNlIHRoZSBzcGVjaWZpZWQgIyBjaGFyIGZyb20gZW5kDQogIGFTdHJz
LmFwcGVuZChhU3RyKSAgICAgICMgcHV0IHN0cmluZyBiYWNrIGluIG91dHB1dCBidWZmZXIN
Cg0KDQojIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQ0KZGVmIG1h
cEJhZFZhckNoYXIoYVN0cik6DQojIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g
LSAtIC0gLQ0KICAgIyBDaGFuZ2UgYWxsIG9jY3VyYW5jZXMgb2YgZGFuZ2Vyb3VzIGNoYXJh
Y3RlcnMNCiAgICMgdG8gc29tZXRoaW5nIHNhZmUgd2hlbiBsb29raW5nIGF0IHZhcmlhYmxl
DQogICAjIG5hbWluZyBjb252ZW50aW9ucyBjb21tb24gdG8gUGVybCAmIFB5dGhvbg0KICAg
IyBUT0RPOiBVc2UgcmVnZXggdG8gbWFrZSB0aGlzIG1vcmUgY29tcGxldGUgDQogICAjICAg
c28gaXQgd2lsbCByZW1vdmUgcHVuY3R1YXRpb24gYXMgd2VsbC4NCiAgIGFBcnIgPSBzdHJp
bmcuc3BsaXQoYVN0cikgIyBtYWtlIGFycmF5IGJyb2tlbiBvbiB3aGl0ZQ0KICAgYVN0ciA9
IHN0cmluZy5qb2luKGFBcnIsJ18nKSANCiAgIHJldHVybiBhU3RyDQoNCiMgLSAtIC0gLSAt
IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtDQpkZWYgY3VyclRpbWVTdGFtcCgpOg0K
IyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0NCiBhVGltZSA9IHRp
bWUudGltZSgpDQogcGF0dCA9ICclSDolTTolUyAlYSAlWS8lbS8lZCcNCiBsb2NhbCA9IHRp
bWUubG9jYWx0aW1lKGFUaW1lKQ0KIHN0ciA9IHRpbWUuc3RyZnRpbWUocGF0dCxsb2NhbCkN
CiByZXR1cm4gc3RyDQo=

--openmail-part-0fa27ddb-00000001
Content-Type: text/plain; name="IniMgrTest.ini"
Content-Disposition: inline; filename="IniMgrTest.ini"
Content-Transfer-Encoding: quoted-printable

# testIniMgr.ini=0D
# a sample INI file to be read by the iniMgr.py=0D
=0D
# items not in a group are assumed to be in a =0D
# default group of [main]=0D
=0D
First Name =3D joe=0D
Last Name  =3D ellsworth=0D
work phone=3D 408-447-1454=0D
home phone=3D 408-248-1820=0D
=0D
[interests]=0D
  interest =3D scuba=0D
  interest =3D python=0D
  interest =3D Mountain Biking=0D
=0D
[home address]=0D
  street =3D 19111 Pruneridge Ave=0D
  street =3D mailstop #47US=0D
  city   =3D Cupertino=0D
  state  =3D CA=0D
=0D
[hp info]=0D
  employeeNo =3D 92029292292=0D
  telnet     =3D 447-1454=0D
  boss       =3D John=0D
  boss       =3D Mary=0D
  boss       =3D Dick=0D
=0D
=0D
[interests]=0D
  # you can add more to a group latter and=0D
  # it acts just as if you had defined them=0D
  # all in a single group.=0D
  interest =3D perl=0D
  interest =3D corba=0D
  interest =3D food=0D
  interest =3D python=0D
=0D
=0D
# Note: The formatting above is for human content=0D
#  the parser doese not care.  As a matter of fact=0D
#  it just throws away all the leading and trailing=0D
#  spaces as well as the comments.=0D
#=0D
# Note: We use INI files to directly tie values to =0D
#   program variables in a larger system.  In order=0D
#   to make things as easy as possible on the programmer=0D
#   it is generally polite to keep make the group names=0D
#   and item names as valid python / perl variable names=0D
#   this will minimize the amount of work required to=0D
#   use them heavily in a larger system.=0D
=0D
=0D

--openmail-part-0fa27ddb-00000001
Content-Type: application/octet-stream; name="IniMgrTest.py"
Content-Disposition: attachment; filename="IniMgrTest.py"
Content-Transfer-Encoding: base64

IyEvdXNyL2xvY2FsL2Jpbi9weXRob24NCiMgIHRlc3RJbmlNZ3IucHkNCiMgIGEgd2luZG93
cyBJTkkgZmlsZSBjb21wYXRpYmxlIHBhcnNlciAvIHNlcmlhbGl6ZXINCiMNCiMgICAgICBq
b2VfZWxsc3dvcnRoQGhvdG1haWwuY29tDQojICAgICAgam9lX2VsbHN3b3J0aEBocC5jb20N
CiMNCmltcG9ydCBpbmlNZ3INCmltcG9ydCBtdmENCg0KYUZpTmFtZSA9ICdjOlxccHl0aG9u
XFxqb2VcXEluaU1nclRlc3QuaW5pJw0KYURpY3QgID0gaW5pTWdyLmZyb21JbmlGaWxlKGFG
aU5hbWUpDQpwcmludCBhRGljdA0KDQphU3RyID0gaW5pTWdyLmRpY3RBc1B5dGhvblN0cihh
RGljdCkNCnByaW50ICJcbmRpY3Rpb25hcnkgYXMgUHl0aG9uIFN0cmluZz0iLCBhU3RyDQoN
CmFTdHIgPSBpbmlNZ3IuZGljdEFzSW5pU3RyKGFEaWN0KQ0KcHJpbnQgIlxuXG5hcyBhIElu
aSBGaWxlIFN0cj0iLCBhU3RyDQoNCmFTdHIgPSBpbmlNZ3IuZGljdEFzUGVybFN0cihhRGlj
dCkNCnByaW50ICJcblxuYXMgUGVybCBTdHJpbmciLCBhU3RyDQoNCmFTdHIgPSBpbmlNZ3Iu
ZGljdEFzWE1MU3RyKGFEaWN0LDApDQpwcmludCAiXG5cbmFzIFhNTCBTdHJpbmdcbiIsIGFT
dHINCg0KYVN0ciA9IGluaU1nci5kaWN0QXNMRElGU3RyKGFEaWN0KQ0KcHJpbnQgIlxuXG5h
cyBMRElGIC0gTERBUCBTdHJpbmciLCBhU3RyDQoNCiMgbXZhLmR1bXBNVkEoYURpY3QsIDAp
DQphU3RyID0gaW5pTWdyLmRpY3RBc01WQVN0cihhRGljdCkNCnByaW50ICJcblxuYXMgTVZB
IFN0cmluZyIsIGFTdHINCmFTZWNPYmogPSBpbmlNZ3IuZnJvbU1WQVN0cihhU3RyKQ0KbXZh
LmR1bXBNVkEoYVNlY09iaiwgMCkNCg0KDQoNCg==

--openmail-part-0fa27ddb-00000001--