Re: Slot characteristic inheritance
Pierre Lorenzon <[email protected]> Sat, 30 Jun 2007 22:58:10 +0200 (CEST)
| Newsgroups | gmane.emacs.eieio |
|---|---|
| Message-ID | <[email protected]> |
----Next_Part(Sat_Jun_30_22_58_10_2007_759)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hi Again, In my last modification of eieio.el, I did not implement any protocol for the doc attribute. It seems clear for me that this attribute should be overrriddable : Hence I implement it as overriddable ! I send the modified eieio.el : modifications are between line 733 and 785 in the join file. Sure I ran the tests and they passed and used these new features for my own classes and they produced the expected result ! Regards Pierre ----Next_Part(Sat_Jun_30_22_58_10_2007_759)-- Content-Type: Application/Octet-Stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="eieio.el" Ozs7IGVpZWlvLmVsIC0tLSBFbmhhbmNlZCBJbXBsZW1lbnRhdGlvbiBvZiBFbWFjcyBJbnRlcnBy ZXRlZCBPYmplY3RzCjs7ICAgICAgICAgICAgICAgb3IgbWF5YmUgRXJpYydzIEltcGxlbWVudGF0 aW9uIG9mIEVtYWNzIEludHJlcHJldGVkIE9iamVjdHMKCjs7Owo7OyBDb3B5cmlnaHQgKEMpIDk1 LDk2LDk4LDk5LDIwMDAsMDEsMDIsMDMsMDQsMDUsMDYsMDcgRXJpYyBNLiBMdWRsYW0KOzsKOzsg QXV0aG9yOiA8emFwcG9AZ251Lm9yZz4KOzsgUkNTOiAkSWQ6IGVpZWlvLmVsLHYgMS4xNDkgMjAw Ny8wMy8xOCAxNzoyMDo0MSB6YXBwbyBFeHAgJAo7OyBLZXl3b3JkczogT08sIGxpc3AKKGRlZnZh ciBlaWVpby12ZXJzaW9uICIxLjAiCiAgIkN1cnJlbnQgdmVyc2lvbiBvZiBFSUVJTy4iKQo7Owo7 OyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yIG1vZGlmeQo7OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo7OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCjs7IGFueSBsYXRlciB2 ZXJzaW9uLgo7Owo7OyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwKOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo7OyBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo7Owo7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQo7OyBhbG9uZyB3aXRo IEdOVSBFbWFjczsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQo7 OyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm dGggRmxvb3IsCjs7IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgo7Owo7OyBQbGVhc2Ugc2Vu ZCBidWcgcmVwb3J0cywgZXRjLiB0byB6YXBwb0BnbnUub3JnCgo7OzsgQ29tbWVudGFyeToKOzsK OzsgRUlFSU8gaXMgYSBzZXJpZXMgb2YgTGlzcCByb3V0aW5lcyB3aGljaCBpbXBsZW1lbnRzIGEg c3Vic2V0IG9mCjs7IENMT1MsIHRoZSBDb21tb24gTGlzcCBPYmplY3QgU3lzdGVtLiAgSW4gYWRk aXRpb24sIEVJRUlPIGFsc28gYWRkcwo7OyBhIGZldyBuZXcgZmVhdHVyZXMgd2hpY2ggaGVscCBp dCBpbnRlZ3JhdGUgbW9yZSBzdHJvbmdseSB3aXRoIHRoZQo7OyBFbWFjcyBydW5uaW5nIGVudmly b25tZW50Lgo7Owo7OyBTZWUgZWllaW8udGV4aSBmb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBv biB1c2luZyB0aGlzIHBhY2thZ2UuCgo7OyBUaGVyZSBpcyBmdW5ueSBzdHVmZiBnb2luZyBvbiB3 aXRoIHR5cGVwIGFuZCBkZWZ0eXBlLiAgVGhpcwo7OyBpcyB0aGUgb25seSB3YXkgSSBzZWVtIHRv IGJlIGFibGUgdG8gbWFrZSB0aGlzIHN0dWZmIGxvYWQgcHJvcGVybHkuCihyZXF1aXJlICdjbCkK KGxvYWQgImNsLW1hY3MiIG5pbCB0KSA7IE5vIHByb3ZpZGUgaW4gdGhpcyBmaWxlLgoKOzs7IENv ZGU6CihkZWZ1biBlaWVpby12ZXJzaW9uICgpCiAgIkRpc3BsYXkgdGhlIGN1cnJlbnQgdmVyc2lv biBvZiBFSUVJTy4iCiAgKGludGVyYWN0aXZlKQogIChtZXNzYWdlIGVpZWlvLXZlcnNpb24pKQoK KHJlcXVpcmUgJ2ludmVyc2lvbikKCihkZWZ1biBlaWVpby1yZXF1aXJlLXZlcnNpb24gKG1ham9y IG1pbm9yICZvcHRpb25hbCBiZXRhKQogICJOb24tbmlsIGlmIHRoaXMgdmVyc2lvbiBvZiBFSUVJ TyBkb2VzIG5vdCBzYXRpc2Z5IGEgc3BlY2lmaWMgdmVyc2lvbi4KQXJndW1lbnRzIGNhbiBiZToK CiAgKE1BSk9SIE1JTk9SICZvcHRpb25hbCBCRVRBKQoKICBWYWx1ZXMgTUFKT1IgYW5kIE1JTk9S IG11c3QgYmUgaW50ZWdlcnMuICBCRVRBIGNhbiBiZSBhbiBpbnRlZ2VyLCBvcgpleGNsdWRlZCBp ZiBhIHJlbGVhc2VkIHZlcnNpb24gaXMgcmVxdWlyZWQuCgpJdCBpcyBhc3N1bWVkIHRoYXQgaWYg dGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBuZXdlciB0aGFuIHRoYXQgc3BlY2lmaWVkLApldmVyeXRo aW5nIHBhc3Nlcy4gIEV4Y2VwdGlvbnMgb2NjdXIgd2hlbiBrbm93biBpbmNvbXBhdGliaWxpdGll cyBhcmUKaW50cm9kdWNlZC4iCiAgKGludmVyc2lvbi10ZXN0ICdlaWVpbwoJCSAgKGZvcm1hdCAi JXMuJXMlcyIgbWFqb3IgbWlub3IKCQkJICAoaWYgYmV0YSAoZm9ybWF0ICJiZXRhJXMiIGJldGEp ICIiKSkpKQoKKGV2YWwtYW5kLWNvbXBpbGUKOzsgQWJvdW50IHRoZSBhYm92ZS4gIEVJRUlPIG11 c3QgcHJvY2VzcyBpdCdzIG93biBjb2RlIHdoZW4gaXQgY29tcGlsZXMKOzsgaXRzZWxmLCB0aHVz LCBieSBldmFsLWFuZC1jb21waWxpbmcgb3V0c2VsdmVzLCB3ZSBzb2x2ZSB0aGUgcHJvYmxlbS4K Cjs7IENvbXBhdGliaWxpdHkKKGlmIChmYm91bmRwICdjb21waWxlZC1mdW5jdGlvbi1hcmdsaXN0 KQoKICAgIDs7IFhFbWFjcyBjYW4gb25seSBhY2Nlc3MgYSBjb21waWxlZCBmdW5jdGlvbnMgYXJn bGlzdCBsaWtlIHRoaXM6CiAgICAoZGVmYWxpYXMgJ2VpZWlvLWNvbXBpbGVkLWZ1bmN0aW9uLWFy Z2xpc3QgJ2NvbXBpbGVkLWZ1bmN0aW9uLWFyZ2xpc3QpCgogIDs7IEVtYWNzIGRvZXNuJ3QgaGF2 ZSB0aGlzIGZ1bmN0aW9uLCBidXQgc2luY2UgRlVOQyBpcyBhIHZlY3Rvciwgd2UgY2FuIGp1c3QK ICA7OyBncmFiIHRoZSBhcHByb3ByaWF0ZSBlbGVtZW50LgogIChkZWZ1biBlaWVpby1jb21waWxl ZC1mdW5jdGlvbi1hcmdsaXN0IChmdW5jKQogICAgIlJldHVybiB0aGUgYXJndW1lbnQgbGlzdCBm b3IgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIEZVTkMuIgogICAgKGFyZWYgZnVuYyAwKSkKCiAgKQoK DAo7OzsKOzsgVmFyaWFibGUgZGVjbGFyYXRpb25zLgo7OwoKKGRlZnZhciBlaWVpby1ob29rIG5p bAogICIqVGhpcyBob29rIGlzIGV4ZWN1dGVkLCB0aGVuIGNsZWFyZWQgZWFjaCB0aW1lIGBkZWZj bGFzcycgaXMgY2FsbGVkLgpUaGUgaW1tZWRpYXRlIGVmZmVjdCBpcyB0aGF0IEkgY2FuIHNhZmVs eSBrZWVwIHRyYWNrIG9mIGNvbW1vbi1saXNwCmBzZXRmJyBkZWZpbml0aW9ucyByZWdhcmRsZXNz IG9mIHRoZSBvcmRlci4gIFVzZXJzIGNhbiBhZGQgaG9va3MgdG8KdGhpcyB2YXJpYWJsZSB3aXRo b3V0IHdvcnJ5aW5nIGFib3V0IHdlYXRoZXIgdGhpcyBwYWNrYWdlIGhhcyBiZWVuCmxvYWRlZCBv ciBub3QuIikKCihkZWZ2YXIgZWllaW8tZXJyb3ItdW5zdXBwb3J0ZWQtY2xhc3MtdGFncyBuaWwK ICAiKk5vbiBuaWwgdG8gdGhyb3cgYW4gZXJyb3IgaWYgYW4gZW5jb3VudGVyZWQgdGFnIHVzIHVu c3VwcG9ydGVkLgpUaGlzIG1heSBwcmV2ZW50IGNsYXNzZXMgZnJvbSBDTE9TIGFwcGxpY2F0aW9u cyBmcm9tIGJlaW5nIHVzZWQgd2l0aCBFSUVJTwpzaW5jZSBFSUVJTyBkb2VzIG5vdCBzdXBwb3J0 IGFsbCBDTE9TIHRhZ3MuIikKCihkZWZ2YXIgZWllaW8tc2tpcC10eXBlY2hlY2sgbmlsCiAgIipJ ZiBub24tbmlsLCBza2lwIGFsbCBzbG90IHR5cGVjaGVja2luZy4KU2V0IHRoaXMgdG8gdCBwZXJt YW5lbnRseSBpZiBhIHByb2dyYW0gaXMgZnVuY3Rpb25pbmcgd2VsbCB0byBnZXQgYQpzbWFsbCBz cGVlZCBpbmNyZWFzZS4gIFRoaXMgdmFyaWFibGUgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgdG8g aGFuZGxlCmRlZmF1bHQgc2V0dGluZyBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzLiIpCgo7OyBT dGF0ZSBWYXJpYWJsZXMKKGRlZnZhciB0aGlzIG5pbAogICJJbnNpZGUgYSBtZXRob2QsIHRoaXMg dmFyaWFibGUgaXMgdGhlIG9iamVjdCBpbiBxdWVzdGlvbi4KRE8gTk9UIFNFVCBUSElTIFlPVVJT RUxGIHVubGVzcyB5b3UgYXJlIHRyeWluZyB0byBzaW11bGF0ZSBmcmllbmRseSBmaWVsZHMuCgpO b3RlOiBFbWJlZGRlZCBtZXRob2RzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLiAgVGhlIHZhcmlh YmxlIFRISVMgaXMKc3RpbGwgc2V0IGZvciBDTE9TIG1ldGhvZHMgZm9yIHRoZSBzYWtlIG9mIHJv dXRpbmVzIGxpa2UKYGNhbGwtbmV4dC1tZXRob2QnIikKCihkZWZ2YXIgc2NvcGVkLWNsYXNzIG5p bAogICJUaGlzIGlzIHNldCB0byBhIGNsYXNzIHdoZW4gYSBtZXRob2QgaXMgcnVubmluZy4KVGhp cyBpcyBzbyB3ZSBrbm93IHdlIGFyZSBhbGxvd2VkIHRvIGNoZWNrIHByaXZhdGUgcGFydHMgb3Ig aG93IHRvCmV4ZWN1dGUgYSBgY2FsbC1uZXh0LW1ldGhvZCcuICBETyBOT1QgU0VUIFRISVMgWU9V UlNFTEYhIikKCihkZWZ2YXIgZWllaW8taW5pdGlhbGl6aW5nLW9iamVjdCAgbmlsCiAgIlNldCB0 byBub24tbmlsIHdoaWxlIGluaXRpYWxpemluZyBhbiBvYmplY3QuIikKCihkZWZjb25zdCBlaWVp by11bmJvdW5kIChtYWtlLXN5bWJvbCAidW5ib3VuZCIpCiAgIlVuaW50ZXJuZWQgc3ltYm9sIHJl cHJlc2VudGluZyBhbiB1bmJvdW5kIHNsb3QgaW4gYW4gb2JqZWN0LiIpCgo7OyBUaGlzIGlzIGEg Ym9vdHN0cmFwIGZvciBlaWVpby1kZWZhdWx0LXN1cGVyY2xhc3Mgc28gaXQgaGFzIGEgdmFsdWUK Ozsgd2hpbGUgaXQgaXMgYmVpbmcgYnVpbHQgaXRzZWxmLgooZGVmdmFyIGVpZWlvLWRlZmF1bHQt c3VwZXJjbGFzcyBuaWwpCgooZGVmY29uc3QgY2xhc3Mtc3ltYm9sIDEgIkNsYXNzJ3Mgc3ltYm9s IChzZWxmLXJlZmVyZW5jaW5nLikuIikKKGRlZmNvbnN0IGNsYXNzLXBhcmVudCAyICJDbGFzcyBw YXJlbnQgZmllbGQuIikKKGRlZmNvbnN0IGNsYXNzLWNoaWxkcmVuIDMgIkNsYXNzIGNoaWxkcmVu IGNsYXNzIGZpZWxkLiIpCihkZWZjb25zdCBjbGFzcy1zeW1ib2wtb2JhcnJheSA0ICJPYmFycmF5 IHBlcm1pdHRpbmcgZmFzdCBhY2Nlc3MgdG8gdmFyaWFibGUgcG9zaXRpb24gaW5kZXhlcy4iKQoo ZGVmY29uc3QgY2xhc3MtcHVibGljLWEgNSAiQ2xhc3MgcHVibGljIGF0dHJpYnV0ZSBpbmRleC4i KQooZGVmY29uc3QgY2xhc3MtcHVibGljLWQgNiAiQ2xhc3MgcHVibGljIGF0dHJpYnV0ZSBkZWZh dWx0cyBpbmRleC4iKQooZGVmY29uc3QgY2xhc3MtcHVibGljLWRvYyA3ICJDbGFzcyBwdWJsaWMg ZG9jdW1lbnRhdGlvbiBzdHJpbmdzIGZvciBhdHRyaWJ1dGVzLiIpCihkZWZjb25zdCBjbGFzcy1w dWJsaWMtdHlwZSA4ICJDbGFzcyBwdWJsaWMgdHlwZSBmb3IgYSBzbG90LiIpCihkZWZjb25zdCBj bGFzcy1wdWJsaWMtY3VzdG9tIDkgIkNsYXNzIHB1YmxpYyBjdXN0b20gdHlwZSBmb3IgYSBzbG90 LiIpCihkZWZjb25zdCBjbGFzcy1wdWJsaWMtY3VzdG9tLWxhYmVsIDEwICJDbGFzcyBwdWJsaWMg Y3VzdG9tIGdyb3VwIGZvciBhIHNsb3QuIikKKGRlZmNvbnN0IGNsYXNzLXB1YmxpYy1jdXN0b20t Z3JvdXAgMTEgIkNsYXNzIHB1YmxpYyBjdXN0b20gZ3JvdXAgZm9yIGEgc2xvdC4iKQooZGVmY29u c3QgY2xhc3MtcHJvdGVjdGlvbiAxMiAiQ2xhc3MgcHJvdGVjdGlvbiBmb3IgYSBzbG90LiIpCihk ZWZjb25zdCBjbGFzcy1pbml0YXJnLXR1cGxlcyAxMyAiQ2xhc3MgaW5pdGFyZyB0dXBsZXMgbGlz dC4iKQooZGVmY29uc3QgY2xhc3MtY2xhc3MtYWxsb2NhdGlvbi1hIDE0ICJDbGFzcyBhbGxvY2F0 ZWQgYXR0cmlidXRlcy4iKQooZGVmY29uc3QgY2xhc3MtY2xhc3MtYWxsb2NhdGlvbi1kb2MgMTUg IkNsYXNzIGFsbG9jYXRlZCBkb2N1bWVudGF0aW9uLiIpCihkZWZjb25zdCBjbGFzcy1jbGFzcy1h bGxvY2F0aW9uLXR5cGUgMTYgIkNsYXNzIGFsbG9jYXRlZCB2YWx1ZSB0eXBlLiIpCihkZWZjb25z dCBjbGFzcy1jbGFzcy1hbGxvY2F0aW9uLWN1c3RvbSAxNyAiQ2xhc3MgYWxsb2NhdGVkIGN1c3Rv bSBkZXNjcmlwdG9yLiIpCihkZWZjb25zdCBjbGFzcy1jbGFzcy1hbGxvY2F0aW9uLWN1c3RvbS1s YWJlbCAxOCAiQ2xhc3MgYWxsb2NhdGVkIGN1c3RvbSBkZXNjcmlwdG9yLiIpCihkZWZjb25zdCBj bGFzcy1jbGFzcy1hbGxvY2F0aW9uLWN1c3RvbS1ncm91cCAxOSAiQ2xhc3MgYWxsb2NhdGVkIGN1 c3RvbSBncm91cC4iKQooZGVmY29uc3QgY2xhc3MtY2xhc3MtYWxsb2NhdGlvbi1wcm90ZWN0aW9u IDIwICJDbGFzcyBhbGxvY2F0ZWQgcHJvdGVjdGlvbiBsaXN0LiIpCihkZWZjb25zdCBjbGFzcy1j bGFzcy1hbGxvY2F0aW9uLXZhbHVlcyAyMSAiQ2xhc3MgYWxsb2NhdGVkIHZhbHVlIHZlY3Rvci4i KQooZGVmY29uc3QgY2xhc3MtZGVmYXVsdC1vYmplY3QtY2FjaGUgMjIKICAiQ2FjaGUgaW5kZXgg b2Ygd2hhdCBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IHdvdWxkIGxvb2sgbGlrZS4KVGhpcyB3aWxs IHNwZWVkIHVwIGluc3RhbnRpYXRpb24gdGltZSBhcyBvbmx5IGEgYGNvcHktc2VxdWVuY2UnIHdp bGwKYmUgbmVlZGVkLCBpbnN0ZWFkIG9mIGxvb3Bpbmcgb3ZlciBhbGwgdGhlIHZhbHVlcyBhbmQg c2V0dGluZyB0aGVtCmZyb20gdGhlIGRlZmF1bHQuIikKKGRlZmNvbnN0IGNsYXNzLW9wdGlvbnMg MjMKICAiU3RvcmFnZSBsb2NhdGlvbiBvZiB0YWdnZWQgY2xhc3Mgb3B0aW9ucy4KU3RvcmVkIG91 dHJpZ2h0IHdpdGhvdXQgbW9kaWZpY2F0aW9ucyBvciBzdHJpcHBpbmcuIikKCihkZWZjb25zdCBj bGFzcy1udW0tZmllbGRzIDI0CiAgIk51bWJlciBvZiBmaWVsZHMgaW4gdGhlIGNsYXNzIGRlZmlu aXRpb24gb2JqZWN0LiIpCgooZGVmY29uc3Qgb2JqZWN0LWNsYXNzIDEgIkluZGV4IGluIGFuIG9i amVjdCB2ZWN0b3Igd2hlcmUgdGhlIGNsYXNzIGlzIHN0b3JlZC4iKQooZGVmY29uc3Qgb2JqZWN0 LW5hbWUgMiAiSW5kZXggaW4gYW4gb2JqZWN0IHdoZXJlIHRoZSBuYW1lIGlzIHN0b3JlZC4iKQoK KGRlZmNvbnN0IG1ldGhvZC1zdGF0aWMgMCAiSW5kZXggaW50byA6U1RBVElDIHRhZyBvbiBhIG1l dGhvZC4iKQooZGVmY29uc3QgbWV0aG9kLWJlZm9yZSAxICJJbmRleCBpbnRvIDpCRUZPUkUgdGFn IG9uIGEgbWV0aG9kLiIpCihkZWZjb25zdCBtZXRob2QtcHJpbWFyeSAyICJJbmRleCBpbnRvIDpQ UklNQVJZIHRhZyBvbiBhIG1ldGhvZC4iKQooZGVmY29uc3QgbWV0aG9kLWFmdGVyIDMgIkluZGV4 IGludG8gOkFGVEVSIHRhZyBvbiBhIG1ldGhvZC4iKQooZGVmY29uc3QgbWV0aG9kLW51bS1saXN0 cyA0ICJOdW1iZXIgb2YgaW5kZXhlcyBpbnRvIG1ldGhvZHMgdmVjdG9yIGluIHdoaWNoIGdyb3Vw cyBvZiBmdW5jdGlvbnMgYXJlIGtlcHQuIikKKGRlZmNvbnN0IG1ldGhvZC1nZW5lcmljLWJlZm9y ZSA0ICJJbmRleCBpbnRvIGdlbmVyaWMgOkJFRk9SRSB0YWcgb24gYSBtZXRob2QuIikKKGRlZmNv bnN0IG1ldGhvZC1nZW5lcmljLXByaW1hcnkgNSAiSW5kZXggaW50byBnZW5lcmljIDpQUklNQVJZ IHRhZyBvbiBhIG1ldGhvZC4iKQooZGVmY29uc3QgbWV0aG9kLWdlbmVyaWMtYWZ0ZXIgNiAiSW5k ZXggaW50byBnZW5lcmljIDpBRlRFUiB0YWcgb24gYSBtZXRob2QuIikKKGRlZmNvbnN0IG1ldGhv ZC1udW0tZmllbGRzIDcgIk51bWJlciBvZiBpbmRleGVzIGludG8gYSBtZXRob2QncyB2ZWN0b3Iu IikKCjs7IEhvdyB0byBzcGVjaWFsdHkgY29tcGlsZSBzdHVmZi4KKGF1dG9sb2FkICdieXRlLWNv bXBpbGUtZmlsZS1mb3JtLWRlZm1ldGhvZCAiZWllaW8tY29tcCIKICAiVGhpcyBmdW5jdGlvbiBp cyB1c2VkIHRvIGJ5dGUgY29tcGlsZSBtZXRob2RzIGluIGEgbmljZSB3YXkuIikKKHB1dCAnZGVm bWV0aG9kICdieXRlLWh1bmstaGFuZGxlciAnYnl0ZS1jb21waWxlLWZpbGUtZm9ybS1kZWZtZXRo b2QpCgooZXZhbC13aGVuLWNvbXBpbGUgKHJlcXVpcmUgJ2VpZWlvLWNvbXApKQoKDAo7OzsgSW1w b3J0YW50IG1hY3JvcyB1c2VkIGluIGVpZWlvLgo7OwooZGVmbWFjcm8gY2xhc3MtdiAoY2xhc3Mp ICJJbnRlcm5hbDogUmV0dXJuIHRoZSBjbGFzcyB2ZWN0b3IgZnJvbSB0aGUgQ0xBU1Mgc3ltYm9s LiIKICA7OyBObyBjaGVjazogSWYgZWllaW8gZ2V0cyB0aGlzIGZhciwgaXQncyBwcm9iYWJseSBi ZWVuIGNoZWNrZWQgYWxyZWFkeS4KICBgKGdldCAsY2xhc3MgYGVpZWlvLWNsYXNzLWRlZmluaXRp b24pKQoKKGRlZm1hY3JvIGNsYXNzLXAgKGNsYXNzKQogICJSZXR1cm4gdCBpZiBDTEFTUyBpcyBh IHZhbGlkIGNsYXNzIHZlY3Rvci4KQ0xBU1MgaXMgYSBzeW1ib2wuICBEZWZjbGFzcyB3aWxsIGFz c2lnbiB0aGUgY2xhc3Mgc3ltYm9sIHRvIGl0c2VsZiwgc28KdGhlIHNob3J0Y3V0IChjbGFzcy1w IGZvbykgd2lsbCB3b3JrLiAgVGhlIGZvcm0gKGNsYXNzLXAgJ2ZvbykgaXMgbW9yZQpyb2J1c3Qu IgogIDs7IHRoaXMgbmV3IG1ldGhvZCBpcyBmYXN0ZXIgc2luY2UgaXQgZG9lc24ndCB3YXN0ZSB0 aW1lIGNoZWNraW5nIGxvdHMgb2YKICA7OyB0aGluZ3MuCiAgYChjb25kaXRpb24tY2FzZSBuaWwK ICAgICAgIChlcSAoYXJlZiAoY2xhc3MtdiAsY2xhc3MpIDApICdkZWZjbGFzcykKICAgICAoZXJy b3IgbmlsKSkpCgooZGVmbWFjcm8gb2JqZWN0LXAgKG9iaikgIlJldHVybiB0IGlmIE9CSiBpcyBh biBvYmplY3QgdmVjdG9yLiIKICBgKGNvbmRpdGlvbi1jYXNlIG5pbAogICAgICAgKGxldCAoKHRv YmogLG9iaikpCgkgKGFuZCAoZXEgKGFyZWYgdG9iaiAwKSAnb2JqZWN0KQoJICAgICAgKGNsYXNz LXAgKGFyZWYgdG9iaiBvYmplY3QtY2xhc3MpKSkpCiAgICAgKGVycm9yIG5pbCkpKQoKKGRlZm1h Y3JvIGNsYXNzLWNvbnN0cnVjdG9yIChjbGFzcykKICAiUmV0dXJuIHRoZSBzeW1ib2wgcmVwcmVz ZW50aW5nIHRoZSBjb25zdHJ1Y3RvciBvZiBDTEFTUy4iCiAgYChhcmVmIChjbGFzcy12ICxjbGFz cykgY2xhc3Mtc3ltYm9sKSkKCihkZWZtYWNybyBnZW5lcmljLXAgKG1ldGhvZCkKICAiUmV0dXJu IHQgaWYgc3ltYm9sIE1FVEhPRCBpcyBhIGdlbmVyaWMgZnVuY3Rpb24uCk9ubHkgbWV0aG9kcyBo YXZlIHRoZSBzeW1ib2wgYGVpZWlvLW1ldGhvZC1vYmFycmF5JyBhcyBhIHByb3BlcnR5ICh3aGlj aApjb250YWlucyBhIGxpc3Qgb2YgYWxsIGJpbmRpbmdzIHRvIHRoYXQgbWV0aG9kIHR5cGUuKSIK ICBgKGFuZCAoZmJvdW5kcCAsbWV0aG9kKSAoZ2V0ICxtZXRob2QgJ2VpZWlvLW1ldGhvZC1vYmFy cmF5KSkpCgooZGVmbWFjcm8gY2xhc3Mtb3B0aW9uLWFzc29jIChsaXN0IG9wdGlvbikKICAiUmV0 dXJuIGZyb20gTElTVCB0aGUgZm91bmQgT1BUSU9OLiAgTmlsIGlmIGl0IGRvZXNuJ3QgZXhpc3Qu IgogIGAoY2FyLXNhZmUgKGNkciAobWVtcSAsb3B0aW9uICxsaXN0KSkpKQoKKGRlZm1hY3JvIGNs YXNzLW9wdGlvbiAoY2xhc3Mgb3B0aW9uKQogICJSZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBmb3Ig Q0xBU1MnIE9QVElPTi4KUmV0dXJuIG5pbCBpZiB0aGF0IG9wdGlvbiBkb2Vzbid0IGV4aXN0LiIK ICBgKGNsYXNzLW9wdGlvbi1hc3NvYyAoYXJlZiAoY2xhc3MtdiAsY2xhc3MpIGNsYXNzLW9wdGlv bnMpICcsb3B0aW9uKSkKCihkZWZtYWNybyBjbGFzcy1hYnN0cmFjdC1wIChjbGFzcykKICAiUmV0 dXJuIG5vbi1uaWwgaWYgQ0xBU1MgaXMgYWJzdHJhY3QuCkFic3RyYWN0IGNsYXNzZXMgY2Fubm90 IGJlIGluc3RhbnRpYXRlZC4iCiAgYChjbGFzcy1vcHRpb24gLGNsYXNzIDphYnN0cmFjdCkpCgoM Cjs7OyBEZWZpbmluZyBhIG5ldyBjbGFzcwo7OwooZGVmbWFjcm8gZGVmY2xhc3MgKG5hbWUgc3Vw ZXJjbGFzcyBmaWVsZHMgJnJlc3Qgb3B0aW9ucy1hbmQtZG9jKQogICJEZWZpbmUgTkFNRSBhcyBh IG5ldyBjbGFzcyBkZXJpdmVkIGZyb20gU1VQRVJDTEFTUyB3aXRoIEZJRUxEUy4KT1BUSU9OUy1B TkQtRE9DIGlzIHVzZWQgYXMgdGhlIGNsYXNzJyBvcHRpb25zIGFuZCBiYXNlIGRvY3VtZW50YXRp b24uClNVUEVSQ0xBU1MgaXMgYSBsaXN0IG9mIHN1cGVyY2xhc3NlcyB0byBpbmhlcml0IGZyb20s IHdpdGggRklFTERTCmJlaW5nIHRoZSBmaWVsZHMgcmVzaWRpbmcgaW4gdGhhdCBjbGFzcyBkZWZp bml0aW9uLiAgTk9URTogQ3VycmVudGx5Cm9ubHkgb25lIGZpZWxkIG1heSBleGlzdCBpbiBTVVBF UkNMQVNTIGFzIG11bHRpcGxlIGluaGVyaXRhbmNlIGlzIG5vdAp5ZXQgc3VwcG9ydGVkLiAgU3Vw cG9ydGVkIHRhZ3MgYXJlOgoKICA6aW5pdGZvcm0gICAtIGluaXRpYWxpemluZyBmb3JtCiAgOmlu aXRhcmcgICAgLSB0YWcgdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KICA6YWNjZXNzb3IgICAt IHRhZyB1c2VkIHRvIGNyZWF0ZSBhIGZ1bmN0aW9uIHRvIGFjY2VzcyB0aGlzIGZpZWxkCiAgOmFs bG9jYXRpb24gLSBzcGVjaWZ5IHdoZXJlIHRoZSB2YWx1ZSBpcyBzdG9yZWQuCiAgICAgICAgICAg ICAgICBkZWZhdWx0cyB0byBgOmluc3RhbmNlJywgYnV0IGNvdWxkIGFsc28gYmUgYDpjbGFzcycK ICA6d3JpdGVyICAgICAtIGEgZnVuY3Rpb24gc3ltYm9sIHdoaWNoIHdpbGwgYHdyaXRlJyBhbiBv YmplY3QncyBzbG90CiAgOnJlYWRlciAgICAgLSBhIGZ1bmN0aW9uIHN5bWJvbCB3aGljaCB3aWxs IGByZWFkJyBhbiBvYmplY3QKICA6dHlwZSAgICAgICAtIHRoZSB0eXBlIG9mIGRhdGEgYWxsb3dl ZCBpbiB0aGlzIHNsb3QgKHNlZSBgdHlwZXAnKQogIDpkb2N1bWVudGF0aW9uCiAgICAgICAgICAg ICAgLSBBIHN0cmluZyBkb2N1bWVudGluZyB1c2Ugb2YgdGhpcyBzbG90LgoKVGhlIGZvbGxvd2lu ZyBhcmUgZXh0ZW5zaW9ucyBvbiBDTE9TOgogIDpwcm90ZWN0aW9uIC0gU3BlY2lmeSBwcm90ZWN0 aW9uIGZvciB0aGlzIHNsb3QuCiAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBgOnB1YmxpYycu ICBBbHNvIHVzZSBgOnByb3RlY3RlZCcsIG9yIGA6cHJpdmF0ZScKICA6Y3VzdG9tICAgICAtIFdo ZW4gY3VzdG9taXppbmcgYW4gb2JqZWN0LCB0aGUgY3VzdG9tIDp0eXBlLiAgUHVibGljIG9ubHku CiAgOmxhYmVsICAgICAgLSBBIHRleHQgc3RyaW5nIGxhYmVsIHVzZWQgZm9yIGEgc2xvdCB3aGVu IGN1c3RvbWl6aW5nLgogIDpncm91cCAgICAgIC0gTmFtZSBvZiBhIGN1c3RvbWl6YXRpb24gZ3Jv dXAgdGhpcyBzbG90IGJlbG9uZ3MgaW4uCgpBIGNsYXNzIGNhbiBhbHNvIGhhdmUgb3B0aW9uYWwg b3B0aW9ucy4gIFRoZXNlIG9wdGlvbnMgaGFwcGVuIGluIHBsYWNlCm9mIGRvY3VtZW50YXRpb24s IChpbmNsdWRpbmcgYSA6ZG9jdW1lbnRhdGlvbiB0YWcpIGluIGFkZGl0aW9uIHRvCmRvY3VtZW50 YXRpb24sIG9yIG5vdCBhdCBhbGwuICBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6CgogIDpkb2N1bWVu dGF0aW9uIC0gVGhlIGRvYy1zdHJpbmcgdXNlZCBmb3IgdGhpcyBjbGFzcy4KCk9wdGlvbnMgYWRk ZWQgdG8gRUlFSU86CgogIDphbGxvdy1uaWwtaW5pdGZvcm0gLSBOb24tbmlsIHRvIHNraXAgdHlw ZWNoZWNraW5nIG9mIGluaXRmb3JtcyBpZiBuaWwuCiAgOmN1c3RvbS1ncm91cHMgICAgICAtIExp c3Qgb2YgY3VzdG9tIGdyb3VwIG5hbWVzLiAgT3JnYW5pemVzIHNsb3RzIGludG8KICAgICAgICAg ICAgICAgICAgICAgICAgcmVhc29uYWJsZSBncm91cHMgZm9yIGN1c3RvbWl6YXRpb25zLgogIDph YnN0cmFjdCAgICAgICAgICAgLSBOb24tbmlsIHRvIHByZXZlbnQgaW5zdGFuY2VzIG9mIHRoaXMg Y2xhc3MuCiAgICAgICAgICAgICAgICAgICAgICAgIElmIGEgc3RyaW5nLCB1c2UgYXMgYW4gZXJy b3Igc3RyaW5nIGlmIHNvbWVvbmUgZG9lcwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8g bWFrZSBhbiBpbnN0YW5jZS4KCk9wdGlvbnMgaW4gQ0xPUyBub3Qgc3VwcG9ydGVkIGluIEVJRUlP OgoKICA6bWV0YWNsYXNzIC0gQ2xhc3MgdG8gdXNlIGluIHBsYWNlIG9mIGBzdGFuZGFyZC1jbGFz cycKICA6ZGVmYXVsdC1pbml0YXJncyAtIEluaXRhcmdzIHRvIHVzZSB3aGVuIGluaXRpYWxpemlu ZyBuZXcgb2JqZWN0cyBvZgogICAgICAgICAgICAgICAgICAgICAgdGhpcyBjbGFzcy4KCkR1ZSB0 byB0aGUgd2F5IGNsYXNzIG9wdGlvbnMgYXJlIHNldCB1cCwgeW91IGNhbiBhZGQgYW55IHRhZ3Mg aW4geW91Cndpc2gsIGFuZCByZWZlcmVuY2UgdGhlbSB1c2luZyB0aGUgZnVuY3Rpb24gYGNsYXNz LW9wdGlvbicuIgogIDs7IFdlIG11c3QgYGV2YWwtYW5kLWNvbXBpbGUnIHRoaXMgc28gdGhhdCB3 aGVuIHdlIGJ5dGUgY29tcGlsZQogIDs7IGFuIGVpZWlvIHByb2dyYW0sIHRoZXJlIGlzIG5vIG5l ZWQgdG8gbG9hZCBpdCBhaGVhZCBvZiB0aW1lLgogIDs7IEl0IGFsc28gcHJvdmlkZXMgbG90cyBv ZiBuaWNlIGRlYnVnZ2luZyBlcnJvcnMgYXQgY29tcGlsZSB0aW1lLgogIGAoZXZhbC1hbmQtY29t cGlsZQogICAgIChlaWVpby1kZWZjbGFzcyAnLG5hbWUgJyxzdXBlcmNsYXNzICcsZmllbGRzICcs b3B0aW9ucy1hbmQtZG9jKSkpCgooZGVmdW4gZWllaW8tZGVmY2xhc3MgKGNuYW1lIHN1cGVyY2xh c3NlcyBmaWVsZHMgb3B0aW9ucy1hbmQtZG9jKQogICJTZWUgYGRlZmNsYXNzJyBmb3IgbW9yZSBp bmZvcm1hdGlvbi4KRGVmaW5lIENOQU1FIGFzIGEgbmV3IHN1YmNsYXNzIG9mIFNVUEVSQ0xBU1NF Uywgd2l0aCBGSUVMRFMgYmVpbmcgdGhlCmZpZWxkcyByZXNpZGluZyBpbiB0aGF0IGNsYXNzIGRl ZmluaXRpb24sIGFuZCB3aXRoIG9wdGlvbnMgb3IgZG9jdW1lbnRhdGlvbgpPUFRJT05TLUFORC1E T0MgYXMgdGhlIHRvcGxldmVsIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3MuIgogIDs7IFJ1 biBvdXIgZWllaW8taG9vayBlYWNoIHRpbWUsIGFuZCBjbGVhciBpdCB3aGVuIHdlIGFyZSBkb25l LgogIDs7IFRoaXMgd2F5IHBlb3BsZSBjYW4gYWRkIGhvb2tzIHNhZmVseSBpZiB0aGV5IHdhbnQg dG8gbW9kaWZ5IGVpZWlvCiAgOzsgb3IgYWRkIGRlZmluaXRpb25zIHdoZW4gZWllaW8gaXMgbG9h ZGVkIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuCiAgKHJ1bi1ob29rcyAnZWllaW8taG9vaykKICAo c2V0cSBlaWVpby1ob29rIG5pbCkKCiAgKGlmIChub3QgKHN5bWJvbHAgY25hbWUpKSAoc2lnbmFs ICd3cm9uZy10eXBlLWFyZ3VtZW50ICcoc3ltYm9scCBjbmFtZSkpKQogIChpZiAobm90IChsaXN0 cCBzdXBlcmNsYXNzZXMpKSAoc2lnbmFsICd3cm9uZy10eXBlLWFyZ3VtZW50ICcobGlzdHAgc3Vw ZXJjbGFzc2VzKSkpCgogIChsZXQqICgocG5hbWUgKGlmIHN1cGVyY2xhc3NlcyBzdXBlcmNsYXNz ZXMgbmlsKSkKCSAobmV3YyAobWFrZS12ZWN0b3IgY2xhc3MtbnVtLWZpZWxkcyBuaWwpKQoJIChv bGRjICh3aGVuIChjbGFzcy1wIGNuYW1lKSAoY2xhc3MtdiBjbmFtZSkpKQoJIChncm91cHMgbmls KSA7OyBsaXN0IG9mIGdyb3VwcyBpZCdkIGZyb20gc2xvdHMKCSAob3B0aW9ucyBuaWwpCgkgKGNs ZWFycGFyZW50IG5pbCkpCgogICAgKGFzZXQgbmV3YyAwICdkZWZjbGFzcykKICAgIChhc2V0IG5l d2MgY2xhc3Mtc3ltYm9sIGNuYW1lKQoKICAgIDs7IElmIHRoaXMgY2xhc3MgYWxyZWFkeSBleGlz dGVkLCBhbmQgd2UgYXJlIHVwZGF0aW5nIGl0J3Mgc3RydWN0dXJlLAogICAgOzsgbWFrZSBzdXJl IHdlIGtlZXAgdGhlIG9sZCBjaGlsZCBsaXN0LiAgVGhpcyBjYW4gY2F1c2UgYnVncywgYnV0CiAg ICA7OyBpZiBubyBuZXcgc2xvdHMgYXJlIGNyZWF0ZWQsIGl0IGFsc28gc2F2ZXMgdGltZSwgYW5k IHByZXZlbnRzCiAgICA7OyBtZXRob2QgdGFibGUgYnJlYWthZ2UsIHBhcnRpY3VsYXJseSB3aGVu IHRoZSB1c2VycyBpcyBvbmx5CiAgICA7OyBieXRlIGNvbXBpbGluZyBhbiBFSUVJTyBmaWxlLgog ICAgKHdoZW4gb2xkYwogICAgICAoYXNldCBuZXdjIGNsYXNzLWNoaWxkcmVuIChhcmVmIG9sZGMg Y2xhc3MtY2hpbGRyZW4pKSkKCiAgICAoY29uZCAoKGFuZCAoc3RyaW5ncCAoY2FyIG9wdGlvbnMt YW5kLWRvYykpCgkJKC89IDEgKCUgKGxlbmd0aCBvcHRpb25zLWFuZC1kb2MpIDIpKSkKCSAgIChl cnJvciAiVG9vIG1hbnkgYXJndW1lbnRzIHRvIGBkZWZjbGFzcyciKSkKCSAgKChhbmQgKHN5bWJv bHAgKGNhciBvcHRpb25zLWFuZC1kb2MpKQoJCSgvPSAwICglIChsZW5ndGggb3B0aW9ucy1hbmQt ZG9jKSAyKSkpCgkgICAoZXJyb3IgIlRvbyBtYW55IGFyZ3VtZW50cyB0byBgZGVmY2xhc3MnIikp CgkgICkKCiAgICAoc2V0cSBvcHRpb25zCgkgIChpZiAoc3RyaW5ncCAoY2FyIG9wdGlvbnMtYW5k LWRvYykpCgkgICAgICAoY29ucyA6ZG9jdW1lbnRhdGlvbiBvcHRpb25zLWFuZC1kb2MpCgkgICAg b3B0aW9ucy1hbmQtZG9jKSkKCiAgICAoaWYgcG5hbWUKCShwcm9nbgoJICAod2hpbGUgcG5hbWUK CSAgICAoaWYgKGFuZCAoY2FyIHBuYW1lKSAoc3ltYm9scCAoY2FyIHBuYW1lKSkpCgkJKGlmIChu b3QgKGNsYXNzLXAgKGNhciBwbmFtZSkpKQoJCSAgICA7OyBiYWQgY2xhc3MKCQkgICAgKGVycm9y ICJHaXZlbiBwYXJlbnQgY2xhc3MgJXMgaXMgbm90IGEgY2xhc3MiIChjYXIgcG5hbWUpKQoJCSAg OzsgZ29vZCBwYXJlbnQgY2xhc3MuLi4KCQkgIDs7IHNhdmUgbmV3IGNoaWxkIGluIHBhcmVudAoJ CSAgKGlmIChub3QgKG1lbWJlciBjbmFtZSAoYXJlZiAoY2xhc3MtdiAoY2FyIHBuYW1lKSkgY2xh c3MtY2hpbGRyZW4pKSkKCQkgICAgICAoYXNldCAoY2xhc3MtdiAoY2FyIHBuYW1lKSkgY2xhc3Mt Y2hpbGRyZW4KCQkJICAgIChjb25zIGNuYW1lIChhcmVmIChjbGFzcy12IChjYXIgcG5hbWUpKSBj bGFzcy1jaGlsZHJlbikpKSkKCQkgIDs7IEdldCBjdXN0b20gZ3JvdXBzLCBhbmQgc3RvcmUgdGhl bSBpbnRvIG91ciBsb2NhbCBjb3B5LgoJCSAgKG1hcGNhciAobGFtYmRhIChnKSAoYWRkLXRvLWxp c3QgJ2dyb3VwcyBnKSkKCQkJICAoY2xhc3Mtb3B0aW9uIChjYXIgcG5hbWUpIDpjdXN0b20tZ3Jv dXBzKSkKCQkgIDs7IHNhdmUgcGFyZW50IGluIGNoaWxkCgkJICAoYXNldCBuZXdjIGNsYXNzLXBh cmVudCAoY29ucyAoY2FyIHBuYW1lKSAoYXJlZiBuZXdjIGNsYXNzLXBhcmVudCkpKSkKCSAgICAg IChlcnJvciAiSW52YWxpZCBwYXJlbnQgY2xhc3MgJXMiIHBuYW1lKSkKCSAgICAoc2V0cSBwbmFt ZSAoY2RyIHBuYW1lKSkpCgkgIDs7IFJldmVyc2UgdGhlIGxpc3Qgb2Ygb3VyIHBhcmVudHMgc28g dGhhdCB0aGV5IGFyZSBwcmlvcml0aXplZCBpbgoJICA7OyB0aGUgc2FtZSBvcmRlciBhcyBzcGVj aWZpZWQgaW4gdGhlIGNvZGUuCgkgIChhc2V0IG5ld2MgY2xhc3MtcGFyZW50IChucmV2ZXJzZSAo YXJlZiBuZXdjIGNsYXNzLXBhcmVudCkpKSApCiAgICAgIDs7IElmIHRoZXJlIGlzIG5vdGhpbmcg dG8gbG9vcCBvdmVyLCB0aGVuIGluaGVyaXQgZnJvbSB0aGUKICAgICAgOzsgZGVmYXVsdCBzdXBl cmNsYXNzLgogICAgICAodW5sZXNzIChlcSBjbmFtZSAnZWllaW8tZGVmYXVsdC1zdXBlcmNsYXNz KQoJOzsgYWRvcHQgdGhlIGRlZmF1bHQgcGFyZW50IGhlcmUsIGJ1dCBjbGVhciBpdCBsYXRlci4u LgoJKHNldHEgY2xlYXJwYXJlbnQgdCkKCTs7IHNhdmUgbmV3IGNoaWxkIGluIHBhcmVudAoJKGlm IChub3QgKG1lbWJlciBjbmFtZSAoYXJlZiAoY2xhc3MtdiAnZWllaW8tZGVmYXVsdC1zdXBlcmNs YXNzKSBjbGFzcy1jaGlsZHJlbikpKQoJICAgIChhc2V0IChjbGFzcy12ICdlaWVpby1kZWZhdWx0 LXN1cGVyY2xhc3MpIGNsYXNzLWNoaWxkcmVuCgkJICAoY29ucyBjbmFtZSAoYXJlZiAoY2xhc3Mt diAnZWllaW8tZGVmYXVsdC1zdXBlcmNsYXNzKSBjbGFzcy1jaGlsZHJlbikpKSkKCTs7IHNhdmUg cGFyZW50IGluIGNoaWxkCgkoYXNldCBuZXdjIGNsYXNzLXBhcmVudCAobGlzdCBlaWVpby1kZWZh dWx0LXN1cGVyY2xhc3MpKSkpCiAgICAKICAgIDs7IHR1cm4gdGhpcyBpbnRvIGEgdXNlYWJsZSBz ZWxmLXBvaW50aW5nIHN5bWJvbAogICAgKHNldCBjbmFtZSBjbmFtZSkKCiAgICA7OyBUaGVzZSB0 d28gdGVzdHMgbXVzdCBiZSBjcmVhdGVkIHJpZ2h0IGF3YXkgc28gd2UgY2FuIGhhdmUgc2VsZi0K ICAgIDs7IHJlZmVyZW5jaW5nIGNsYXNzZXMuICBlaSwgYSBjbGFzcyB3aG9zZSBzbG90IGNhbiBj b250YWluIG9ubHkKICAgIDs7IHBvaW50ZXJzIHRvIGl0c2VsZi4KCiAgICA7OyBDcmVhdGUgdGhl IHRlc3QgZnVuY3Rpb24KICAgIChsZXQgKChjc3ltIChpbnRlcm4gKGNvbmNhdCAoc3ltYm9sLW5h bWUgY25hbWUpICItcCIpKSkpCiAgICAgIChmc2V0IGNzeW0KCSAgICAobGlzdCAnbGFtYmRhIChs aXN0ICdvYmopCgkJICAoZm9ybWF0ICJUZXN0IE9CSiB0byBzZWUgaWYgaXQgYW4gb2JqZWN0IG9m IHR5cGUgJXMiIGNuYW1lKQoJCSAgKGxpc3QgJ2FuZCAnKG9iamVjdC1wIG9iaikKCQkJKGxpc3Qg J3NhbWUtY2xhc3MtcCAnb2JqIGNuYW1lKSkpKSkKCiAgICA7OyBDcmVhdGUgYSBoYW5keSBjaGls ZCB0ZXN0IHRvbwogICAgKGxldCAoKGNzeW0gKGludGVybiAoY29uY2F0IChzeW1ib2wtbmFtZSBj bmFtZSkgIi1jaGlsZC1wIikpKSkKICAgICAgKGZzZXQgY3N5bQoJICAgIGAobGFtYmRhIChvYmop CgkgICAgICAgLChmb3JtYXQKCQkgICJUZXN0IE9CSiB0byBzZWUgaWYgaXQgYW4gb2JqZWN0IGlz IGEgY2hpbGQgb2YgdHlwZSAlcyIKCQkgIGNuYW1lKQoJICAgICAgIChhbmQgKG9iamVjdC1wIG9i aikKCQkgICAgKG9iamVjdC1vZi1jbGFzcy1wIG9iaiAsY25hbWUpKSkpCiAgICAKICAgICAgOzsg V2hlbiB1c2luZyB0eXBlcCwgKHR5cGVwIE9CSiAnbXljbGFzcykgcmV0dXJucyB0IGZvciBvYmpl Y3RzIHdoaWNoCiAgICAgIDs7IGFyZSBzdWJjbGFzc2VzIG9mIG15Y2xhc3MuICBGb3Igb3VyIHBy ZWRpY2F0ZXMsIGhvd2V2ZXIsIGl0IGlzCiAgICAgIDs7IGltcG9ydGFudCBmb3IgRUlFSU8gdG8g YmUgYmFja3dhcmRzIGNvbXBhdGlibGUsIHdoZXJlCiAgICAgIDs7IG15b2JqZWN0LXAsIGFuZCBt eW9iamVjdC1jaGlsZC1wIGFyZSBkaWZmZXJlbnQuCiAgICAgIDs7ICJjbCIgdXNlcyB0aGlzIHRl Y2huaXF1ZSB0byBzcGVjaWZ5IHN5bWJvbHMgd2l0aCBzcGVjaWZpYyB0eXBlcAogICAgICA7OyB0 ZXN0LCBzbyB3ZSBjYW4gbGV0IHR5cGVwIGhhdmUgdGhlIENMT1MgZG9jdW1lbnRlZCBiZWhhdmlv cgogICAgICA7OyB3aGlsZSBrZWVwaW5nIG91ciBhYm92ZSBwcmVkaWNhdGUgY2xlYW4uCiAgICAg IChldmFsIGAoZGVmdHlwZSAsY25hbWUgKCkKCSAgICAgICAnKHNhdGlzZmllcwoJCSAsKGludGVy biAoY29uY2F0IChzeW1ib2wtbmFtZSBjbmFtZSkgIi1jaGlsZC1wIikpKSkpCgogICAgICApCgog ICAgOzsgYmVmb3JlIGFkZGluZyBuZXcgZmllbGRzLCBsZXRzIGFkZCBhbGwgdGhlIG1ldGhvZHMg YW5kIGNsYXNzZXMKICAgIDs7IGluIGZyb20gdGhlIHBhcmVudCBjbGFzcwogICAgKGVpZWlvLWNv cHktcGFyZW50cy1pbnRvLXN1YmNsYXNzIG5ld2Mgc3VwZXJjbGFzc2VzKQoKICAgIDs7IFN0b3Jl IHRoZSBuZXcgY2xhc3MgdmVjdG9yIGRlZmluaXRpb24gaW50byB0aGUgc3ltYm9sLiAgV2UgbmVl ZCB0bwogICAgOzsgZG8gdGhpcyBmaXJzdCBzbyB0aGF0IHdlIGNhbiBjYWxsIGRlZm1ldGhvZCBm b3IgdGhlIGFjY2Vzc29yLgogICAgOzsgVGhlIHZlY3RvciB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhl IGZvbGxvd2luZyB3aGlsZSBsb29wIGFuZCB3aWxsIG5vdAogICAgOzsgbmVlZCB0byBiZSBzdG9y ZWQgYSBzZWNvbmQgdGltZS4KICAgIChwdXQgY25hbWUgJ2VpZWlvLWNsYXNzLWRlZmluaXRpb24g bmV3YykKCiAgICA7OyBRdWVyeSBlYWNoIGZpZWxkIGluIHRoZSBkZWNsYXJhdGlvbiBsaXN0IGFu ZCBtYW5nbGUgaW50byB0aGUKICAgIDs7IGNsYXNzIHN0cnVjdHVyZSBJIGhhdmUgZGVmaW5lZC4K ICAgICh3aGlsZSBmaWVsZHMKICAgICAgKGxldCogKChmaWVsZDEgIChjYXIgZmllbGRzKSkKCSAg ICAgKG5hbWUgICAgKGNhciBmaWVsZDEpKQoJICAgICAoZmllbGQgICAoY2RyIGZpZWxkMSkpCgkg ICAgIChhY2NlcyAgIChwbGlzdC1nZXQgZmllbGQgJzphY2Nlc3NvcikpCgkgICAgIChpbml0ICAg IChvciAocGxpc3QtZ2V0IGZpZWxkICc6aW5pdGZvcm0pCgkJCSAgKGlmIChtZW1iZXIgJzppbml0 Zm9ybSBmaWVsZCkgbmlsCgkJCSAgICBlaWVpby11bmJvdW5kKSkpCgkgICAgIChpbml0YXJnIChw bGlzdC1nZXQgZmllbGQgJzppbml0YXJnKSkKCSAgICAgKGRvY3N0ciAgKHBsaXN0LWdldCBmaWVs ZCAnOmRvY3VtZW50YXRpb24pKQoJICAgICAocHJvdCAgICAocGxpc3QtZ2V0IGZpZWxkICc6cHJv dGVjdGlvbikpCgkgICAgIChyZWFkZXIgIChwbGlzdC1nZXQgZmllbGQgJzpyZWFkZXIpKQoJICAg ICAod3JpdGVyICAocGxpc3QtZ2V0IGZpZWxkICc6d3JpdGVyKSkKCSAgICAgKGFsbG9jICAgKHBs aXN0LWdldCBmaWVsZCAnOmFsbG9jYXRpb24pKQoJICAgICAodHlwZSAgICAocGxpc3QtZ2V0IGZp ZWxkICc6dHlwZSkpCgkgICAgIChjdXN0b20gIChwbGlzdC1nZXQgZmllbGQgJzpjdXN0b20pKQoJ ICAgICAobGFiZWwgICAocGxpc3QtZ2V0IGZpZWxkICc6bGFiZWwpKQoJICAgICAoY3VzdG9tZyAo cGxpc3QtZ2V0IGZpZWxkICc6Z3JvdXApKQoJICAgICAKCSAgICAgKHNraXAtbmlsIChjbGFzcy1v cHRpb24tYXNzb2Mgb3B0aW9ucyA6YWxsb3ctbmlsLWluaXRmb3JtKSkKCSAgICAgKQoKCShpZiBl aWVpby1lcnJvci11bnN1cHBvcnRlZC1jbGFzcy10YWdzCgkgICAgKGxldCAoKHRtcCBmaWVsZCkp CgkgICAgICAod2hpbGUgdG1wCgkJKGlmIChub3QgKG1lbWJlciAoY2FyIHRtcCkgJyg6YWNjZXNz b3IKCQkJCQkgICAgIDppbml0Zm9ybQoJCQkJCSAgICAgOmluaXRhcmcKCQkJCQkgICAgIDpkb2N1 bWVudGF0aW9uCgkJCQkJICAgICA6cHJvdGVjdGlvbgoJCQkJCSAgICAgOnJlYWRlcgoJCQkJCSAg ICAgOndyaXRlcgoJCQkJCSAgICAgOmFsbG9jYXRpb24KCQkJCQkgICAgIDp0eXBlCgkJCQkJICAg ICA6Y3VzdG9tCgkJCQkJICAgICA6bGFiZWwKCQkJCQkgICAgIDpncm91cAoJCQkJCSAgICAgOmFs bG93LW5pbC1pbml0Zm9ybQoJCQkJCSAgICAgOmN1c3RvbS1ncm91cHMpKSkKCQkgICAgKHNpZ25h bCAnaW52YWxpZC1zbG90LXR5cGUgKGxpc3QgKGNhciB0bXApKSkpCgkJKHNldHEgdG1wIChjZHIg KGNkciB0bXApKSkpKSkKCgk7OyBDbGVhbiB1cCB0aGUgbWVhbmluZyBvZiBwcm90ZWN0aW9uLgoJ KGNvbmQgKChvciAoZXEgcHJvdCAncHVibGljKSAoZXEgcHJvdCA6cHVibGljKSkgKHNldHEgcHJv dCBuaWwpKQoJICAgICAgKChvciAoZXEgcHJvdCAncHJvdGVjdGVkKSAoZXEgcHJvdCA6cHJvdGVj dGVkKSkgKHNldHEgcHJvdCAncHJvdGVjdGVkKSkKCSAgICAgICgob3IgKGVxIHByb3QgJ3ByaXZh dGUpIChlcSBwcm90IDpwcml2YXRlKSkgKHNldHEgcHJvdCAncHJpdmF0ZSkpCgkgICAgICAoKGVx IHByb3QgbmlsKSBuaWwpCgkgICAgICAodCAoc2lnbmFsICdpbnZhbGlkLXNsb3QtdHlwZSAobGlz dCAnOnByb3RlY3Rpb24gcHJvdCkpKSkKCgk7OyBNYWtlIHN1cmUgdGhlIDphbGxvY2F0aW9uIHBh cmFtZXRlciBoYXMgYSB2YWxpZCB2YWx1ZS4KCShpZiAobm90IChvciAobm90IGFsbG9jKSAoZXEg YWxsb2MgOmNsYXNzKSAoZXEgYWxsb2MgOmluc3RhbmNlKSkpCgkgICAgKHNpZ25hbCAnaW52YWxp ZC1zbG90LXR5cGUgKGxpc3QgJzphbGxvY2F0aW9uIGFsbG9jKSkpCgoJOzsgVGhlIGRlZmF1bHQg dHlwZSBzcGVjaWZpZXIgaXMgc3VwcG9zZWQgdG8gYmUgdCwgbWVhbmluZyBhbnl0aGluZy4KCShp ZiAobm90IHR5cGUpIChzZXRxIHR5cGUgdCkpCgoJOzsgTGFiZWwgaXMgbmlsLCBvciBhIHN0cmlu ZwoJKGlmIChub3QgKG9yIChudWxsIGxhYmVsKSAoc3RyaW5ncCBsYWJlbCkpKQoJICAgIChzaWdu YWwgJ2ludmFsaWQtc2xvdC10eXBlIChsaXN0ICc6bGFiZWwgbGFiZWwpKSkKCQoJOzsgSXMgdGhl cmUgYW4gaW5pdGFyZywgYnV0IGFsbG9jYXRpb24gb2YgY2xhc3M/CgkoaWYgKGFuZCBpbml0YXJn IChlcSBhbGxvYyA6Y2xhc3MpKQoJICAgIChtZXNzYWdlICJDbGFzcyBhbGxvY2F0ZWQgc2xvdHMg ZG8gbm90IG5lZWQgOmluaXRhcmciKSkKCgk7OyBpbnRlcm4gdGhlIHN5bWJvbCBzbyB3ZSBjYW4g dXNlIGl0IGJsYW5rbHkKCShpZiBpbml0YXJnIChzZXQgaW5pdGFyZyBpbml0YXJnKSkKCgk7OyBU aGUgY3VzdG9tZ3JvdXAgc2hvdWxkIGJlIGEgbGlzdCBvZiBzeW1ib2xzCgkoY29uZCAoKG51bGwg Y3VzdG9tZykKCSAgICAgICAoc2V0cSBjdXN0b21nICcoZGVmYXVsdCkpKQoJICAgICAgKChub3Qg KGxpc3RwIGN1c3RvbWcpKQoJICAgICAgIChzZXRxIGN1c3RvbWcgKGxpc3QgY3VzdG9tZykpKSkK CTs7IFRoZSBjdXN0b21ncm91cCBiZXR0ZXIgYmUgYSBzeW1ib2wsIG9yIGxpc3QgbyBzeW1ib2xz LgoJKG1hcGNhciAobGFtYmRhIChjZykKCQkgIChpZiAobm90IChzeW1ib2xwIGNnKSkKCQkgICAg ICAoc2lnbmFsICdpbnZhbGlkLXNsb3QtdHlwZSAobGlzdCAnOmdyb3VwIGNnKSkpKQoJCWN1c3Rv bWcpCgoJOzsgRmlyc3QgdXAsIGFkZCB0aGlzIGZpZWxkIGludG8gb3VyIG5ldyBjbGFzcy4KCShl aWVpby1hZGQtbmV3LWZpZWxkIG5ld2MgbmFtZSBpbml0IGRvY3N0ciB0eXBlIGN1c3RvbSBsYWJl bCBjdXN0b21nCgkJCSAgICAgcHJvdCBpbml0YXJnIGFsbG9jICdkZWZhdWx0b3ZlcnJpZGUgc2tp cC1uaWwpCgoJOzsgV2UgbmVlZCB0byBpZCB0aGUgZ3JvdXAsIGFuZCBzdG9yZSB0aGVtIGluIGEg Z3JvdXAgbGlzdCBhdHRyaWJ1dGUuCgkobWFwY2FyIChsYW1iZGEgKGNnKSAoYWRkLXRvLWxpc3Qg J2dyb3VwcyBjZykpIGN1c3RvbWcpCgoJOzsgYW55b25lIGNhbiBoYXZlIGFuIGFjY2Vzc29yIGZ1 bmN0aW9uLiAgVGhpcyBjcmVhdGVzIGEgZnVuY3Rpb24KCTs7IG9mIHRoZSBzcGVjaWZpZWQgbmFt ZSwgYW5kIGFsc28gcGVyZm9ybXMgYSBgZGVmc2V0ZicgaWYgYXBwbGljYWJsZQoJOzsgc28gdGhh dCB1c2VycyBjYW4gYHNldGYnIHRoZSBzcGFjZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uCgko aWYgYWNjZXMKCSAgICAocHJvZ24KCSAgICAgIChlaWVpby1kZWZtZXRob2QgYWNjZXMKCQkobGlz dCAoaWYgKGVxIGFsbG9jIDpjbGFzcykgOlNUQVRJQyA6UFJJTUFSWSkKCQkgICAgICAobGlzdCAo bGlzdCAndGhpcyBjbmFtZSkpCgkJICAgICAgKGZvcm1hdAoJCSAgICAgICAiUmV0cmlldmVzIHRo ZSBzbG90IGAlcycgZnJvbSBhbiBvYmplY3Qgb2YgY2xhc3MgYCVzJyIKCQkgICAgICAgbmFtZSBj bmFtZSkKCQkgICAgICAobGlzdCAnZWllaW8tb3JlZiAndGhpcyAobGlzdCAncXVvdGUgbmFtZSkp KSkKCSAgICAgIDs7IFRoYW5rcyBQYXNjYWwgQm91cmd1aWdub24gPHBqYkBpbmZvcm1hdGltYWdv LmNvbT4KCSAgICAgIDs7IEZvciB0aGlzIGNvbXBsZXggbWFjcm8uCgkgICAgICAoZXZhbCAobWFj cm9leHBhbmQKCQkgICAgIChsaXN0ICAnZGVmc2V0ZiBhY2NlcyAnKHdpZGdldCkgJyhzdG9yZSkK CQkJICAgIChsaXN0ICdsaXN0ICcnZWllaW8tb3NldCAnd2lkZ2V0CgkJCQkgIChsaXN0ICdxdW90 ZSAobGlzdCAncXVvdGUgbmFtZSkpICdzdG9yZSkpKSkKCSAgICAgIDs7YChkZWZzZXRmICxhY2Nl cyAod2lkZ2V0KSAoc3RvcmUpIChlaWVpby1vc2V0IHdpZGdldCAnLGNuYW1lIHN0b3JlKSkKCSAg ICAgICkKCSAgKQoJOzsgSWYgYSB3cml0ZXIgaXMgZGVmaW5lZCwgdGhlbiBjcmVhdGUgYSBnZW5l cmljIG1ldGhvZCBvZiB0aGF0Cgk7OyBuYW1lIHdob3NlIHB1cnBvc2UgaXMgdG8gc2V0IHRoZSB2 YWx1ZSBvZiB0aGUgc2xvdC4KCShpZiB3cml0ZXIKCSAgICAocHJvZ24KCSAgICAgIChlaWVpby1k ZWZtZXRob2Qgd3JpdGVyCgkJKGxpc3QgKGxpc3QgKGxpc3QgJ3RoaXMgY25hbWUpICd2YWx1ZSkK CQkgICAgICAoZm9ybWF0ICJTZXQgdGhlIHNsb3QgYCVzJyBvZiBhbiBvYmplY3Qgb2YgY2xhc3Mg YCVzJyIKCQkJICAgICAgbmFtZSBjbmFtZSkKCQkgICAgICBgKHNldGYgKHNsb3QtdmFsdWUgdGhp cyAnLG5hbWUpIHZhbHVlKSkpCgkgICAgICApKQoJOzsgSWYgYSByZWFkZXIgaXMgZGVmaW5lZCwg dGhlbiBjcmVhdGUgYSBnZW5lcmljIG1ldGhvZAoJOzsgb2YgdGhhdCBuYW1lIHdob3NlIHB1cnBv c2UgaXMgdG8gYWNjZXNzIHRoaXMgc2xvdCB2YWx1ZS4KCShpZiByZWFkZXIKCSAgICAocHJvZ24K CSAgICAgIChlaWVpby1kZWZtZXRob2QgcmVhZGVyCgkJKGxpc3QgKGxpc3QgKGxpc3QgJ3RoaXMg Y25hbWUpKQoJCSAgICAgIChmb3JtYXQgIkFjY2VzcyB0aGUgc2xvdCBgJXMnIGZyb20gb2JqZWN0 IG9mIGNsYXNzIGAlcyciCgkJCSAgICAgIG5hbWUgY25hbWUpCgkJICAgICAgYChzbG90LXZhbHVl IHRoaXMgJyxuYW1lKSkpKSkKCSkKICAgICAgKHNldHEgZmllbGRzIChjZHIgZmllbGRzKSkpCgog ICAgOzsgTm93IHRoYXQgZXZlcnl0aGluZyBoYXMgYmVlbiBsb2FkZWQgdXAsIGFsbCBvdXIgbGlz dHMgYXJlIGJhY2t3YXJkcyEgIEZpeCB0aGF0IHVwIG5vdy4KICAgIChhc2V0IG5ld2MgY2xhc3Mt cHVibGljLWEgKG5yZXZlcnNlIChhcmVmIG5ld2MgY2xhc3MtcHVibGljLWEpKSkKICAgIChhc2V0 IG5ld2MgY2xhc3MtcHVibGljLWQgKG5yZXZlcnNlIChhcmVmIG5ld2MgY2xhc3MtcHVibGljLWQp KSkKICAgIChhc2V0IG5ld2MgY2xhc3MtcHVibGljLWRvYyAobnJldmVyc2UgKGFyZWYgbmV3YyBj bGFzcy1wdWJsaWMtZG9jKSkpCiAgICAoYXNldCBuZXdjIGNsYXNzLXB1YmxpYy10eXBlCgkgIChh cHBseSAndmVjdG9yIChucmV2ZXJzZSAoYXJlZiBuZXdjIGNsYXNzLXB1YmxpYy10eXBlKSkpKQog ICAgKGFzZXQgbmV3YyBjbGFzcy1wdWJsaWMtY3VzdG9tIChucmV2ZXJzZSAoYXJlZiBuZXdjIGNs YXNzLXB1YmxpYy1jdXN0b20pKSkKICAgIChhc2V0IG5ld2MgY2xhc3MtcHVibGljLWN1c3RvbS1s YWJlbCAobnJldmVyc2UgKGFyZWYgbmV3YyBjbGFzcy1wdWJsaWMtY3VzdG9tLWxhYmVsKSkpCiAg ICAoYXNldCBuZXdjIGNsYXNzLXB1YmxpYy1jdXN0b20tZ3JvdXAgKG5yZXZlcnNlIChhcmVmIG5l d2MgY2xhc3MtcHVibGljLWN1c3RvbS1ncm91cCkpKQogICAgKGFzZXQgbmV3YyBjbGFzcy1wcm90 ZWN0aW9uIChucmV2ZXJzZSAoYXJlZiBuZXdjIGNsYXNzLXByb3RlY3Rpb24pKSkKICAgIChhc2V0 IG5ld2MgY2xhc3MtaW5pdGFyZy10dXBsZXMgKG5yZXZlcnNlIChhcmVmIG5ld2MgY2xhc3MtaW5p dGFyZy10dXBsZXMpKSkKCiAgICA7OyBUaGUgc3RvcmFnZSBmb3IgY2xhc3MtY2xhc3MtYWxsb2Nh dGlvbi10eXBlIG5lZWRzIHRvIGJlIHR1cm5lZCBpbnRvCiAgICA7OyBhIHZlY3RvciBub3cuCiAg ICAoYXNldCBuZXdjIGNsYXNzLWNsYXNzLWFsbG9jYXRpb24tdHlwZQoJICAoYXBwbHkgJ3ZlY3Rv ciAoYXJlZiBuZXdjIGNsYXNzLWNsYXNzLWFsbG9jYXRpb24tdHlwZSkpKQoKICAgIDs7IEFsc28s IHRha2UgY2xhc3MgYWxsb2NhdGVkIHZhbHVlcywgYW5kIHZlY3Rvcml6ZSB0aGVtIGZvciBzcGVl ZC4KICAgIChhc2V0IG5ld2MgY2xhc3MtY2xhc3MtYWxsb2NhdGlvbi12YWx1ZXMKCSAgKGFwcGx5 ICd2ZWN0b3IgKGFyZWYgbmV3YyBjbGFzcy1jbGFzcy1hbGxvY2F0aW9uLXZhbHVlcykpKQoKICAg IDs7IEF0dGFjaCBmaWVsZCBzeW1ib2xzIGludG8gYW4gb2JhcnJheSwgYW5kIHN0b3JlIHRoZSBp bmRleCBvZgogICAgOzsgdGhpcyBmaWVsZCBhcyB0aGUgdmFyaWFibGUgc2xvdCBpbiB0aGlzIG5l dyBzeW1ib2wuICBXZSBuZWVkIHRvCiAgICA7OyBrbm93IGFib3V0IHByaW1lcywgYmVjYXVzZSBv YmFycmF5cyBhcmUgYmVzdCBzZXQgaW4gdmVjdG9ycyBvZgogICAgOzsgcHJpbWUgbnVtYmVyIGxl bmd0aCwgYW5kIHdlIGFsc28gbmVlZCB0byBtYWtlIG91ciB2ZWN0b3Igc21hbGwKICAgIDs7IHRv IHNhdmUgc3BhY2UsIGFuZCBhbHNvIG9wdGltYWwgZm9yIHRoZSBudW1iZXIgb2YgaXRlbXMgd2Ug aGF2ZS4KICAgIChsZXQqICgoY250IDApCgkgICAocHVic3ltcyAoYXJlZiBuZXdjIGNsYXNzLXB1 YmxpYy1hKSkKCSAgIChwcm90cyAoYXJlZiBuZXdjIGNsYXNzLXByb3RlY3Rpb24pKQoJICAgKGwg KGxlbmd0aCBwdWJzeW1zKSkKCSAgICh2bCAobGV0ICgocHJpbWVzICcoIDMgNSA3IDExIDEzIDE3 IDE5IDIzIDI5IDMxIDM3IDQxIDQzIDQ3CgkJCQkgIDUzIDU5IDYxIDY3IDcxIDczIDc5IDgzIDg5 IDk3IDEwMSApKSkKCQkgKHdoaWxlIChhbmQgcHJpbWVzICg8IChjYXIgcHJpbWVzKSBsKSkKCQkg ICAoc2V0cSBwcmltZXMgKGNkciBwcmltZXMpKSkKCQkgKGNhciBwcmltZXMpKSkKCSAgIChvYSAo bWFrZS12ZWN0b3IgdmwgMCkpCgkgICAobmV3c3ltKSkKICAgICAgKHdoaWxlIHB1YnN5bXMKCShz ZXRxIG5ld3N5bSAoaW50ZXJuIChzeW1ib2wtbmFtZSAoY2FyIHB1YnN5bXMpKSBvYSkpCgkoc2V0 IG5ld3N5bSBjbnQpCgkoc2V0cSBjbnQgKDErIGNudCkpCgkoaWYgKGNhciBwcm90cykgKHB1dCBu ZXdzeW0gJ3Byb3RlY3Rpb24gKGNhciBwcm90cykpKQoJKHNldHEgcHVic3ltcyAoY2RyIHB1YnN5 bXMpCgkgICAgICBwcm90cyAoY2RyIHByb3RzKSkpCiAgICAgIChhc2V0IG5ld2MgY2xhc3Mtc3lt Ym9sLW9iYXJyYXkgb2EpCiAgICAgICkKCiAgICA7OyBDcmVhdGUgdGhlIGNvbnN0cnVjdG9yIGZ1 bmN0aW9uCiAgICAoaWYgKGNsYXNzLW9wdGlvbi1hc3NvYyBvcHRpb25zIDphYnN0cmFjdCkKCTs7 IEFic3RyYWN0IGNsYXNzZXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gIFNheSBzby4KCShsZXQg KChhYnMgKGNsYXNzLW9wdGlvbi1hc3NvYyBvcHRpb25zIDphYnN0cmFjdCkpKQoJICAoaWYgKG5v dCAoc3RyaW5ncCBhYnMpKQoJICAgICAgKHNldHEgYWJzIChmb3JtYXQgIkNsYXNzICVzIGlzIGFi c3RyYWN0IiBjbmFtZSkpKQoJICAoZnNldCBjbmFtZQoJCWAobGFtYmRhICgmcmVzdCBzdHVmZikK CQkgICAsKGZvcm1hdCAiWW91IGNhbm5vdCBjcmVhdGUgYSBuZXcgb2JqZWN0IG9mIHR5cGUgJXMi IGNuYW1lKQoJCSAgIChlcnJvciAsYWJzKSkpKQoKICAgICAgOzsgTm9uLWFic3RyYWN0IGNsYXNz ZXMgbmVlZCBhIGNvbnN0cnVjdG9yLgogICAgICAoZnNldCBjbmFtZQoJICAgIGAobGFtYmRhIChu ZXduYW1lICZyZXN0IGZpZWxkcykKCSAgICAgICAsKGZvcm1hdCAiQ3JlYXRlIGEgbmV3IG9iamVj dCB3aXRoIG5hbWUgTkFNRSBvZiBjbGFzcyB0eXBlICVzIiBjbmFtZSkKCSAgICAgICAoYXBwbHkg J2NvbnN0cnVjdG9yICxjbmFtZSBuZXduYW1lIGZpZWxkcykpKQogICAgICApCgogICAgOzsgU2V0 IHVwIGEgc3BlY2lhbGl6ZWQgZG9jIHN0cmluZy4KICAgIDs7IFVzZSBzdG9yZWQgdmFsdWUgc2lu Y2UgaXQgaXMgY2FsY3VsYXRlZCBpbiBhIG5vbi10cml2aWFsIHdheQogICAgKHB1dCBjbmFtZSAn dmFyaWFibGUtZG9jdW1lbnRhdGlvbgoJIChjbGFzcy1vcHRpb24tYXNzb2Mgb3B0aW9ucyA6ZG9j dW1lbnRhdGlvbikpCgogICAgOzsgV2UgaGF2ZSBhIGxpc3Qgb2YgY3VzdG9tIGdyb3Vwcy4gIFN0 b3JlIHRoZW0gaW50byB0aGUgb3B0aW9ucy4KICAgIChsZXQgKChnIChjbGFzcy1vcHRpb24tYXNz b2Mgb3B0aW9ucyA6Y3VzdG9tLWdyb3VwcykpKQogICAgICAobWFwY2FyIChsYW1iZGEgKGNnKSAo YWRkLXRvLWxpc3QgJ2cgY2cpKSBncm91cHMpCiAgICAgIChpZiAobWVtcSA6Y3VzdG9tLWdyb3Vw cyBvcHRpb25zKQoJICAoc2V0Y2FyIChjZHIgKG1lbXEgOmN1c3RvbS1ncm91cHMgb3B0aW9ucykp IGcpCgkoc2V0cSBvcHRpb25zIChjb25zIDpjdXN0b20tZ3JvdXBzIChjb25zIGcgb3B0aW9ucykp KSkpCgogICAgOzsgU2V0IHVwIHRoZSBvcHRpb25zIHdlIGhhdmUgY29sbGVjdGVkLgogICAgKGFz ZXQgbmV3YyBjbGFzcy1vcHRpb25zIG9wdGlvbnMpCgogICAgOzsgaWYgdGhpcyBpcyBhIHN1cGVy Y2xhc3MsIGNsZWFyIG91dCBwYXJlbnQgKHdoaWNoIHdhcyBzZXQgdG8gdGhlCiAgICA7OyBkZWZh dWx0IHN1cGVyY2xhc3MgZWllaW8tZGVmYXVsdC1zdXBlcmNsYXNzKQogICAgKGlmIGNsZWFycGFy ZW50IChhc2V0IG5ld2MgY2xhc3MtcGFyZW50IG5pbCkpCgogICAgOzsgQ3JlYXRlIHRoZSBjYWNo ZWQgZGVmYXVsdCBvYmplY3QuCiAgICAobGV0ICgoY2FjaGUgKG1ha2UtdmVjdG9yICgrIChsZW5n dGggKGFyZWYgbmV3YyBjbGFzcy1wdWJsaWMtYSkpCgkJCQkgMykgbmlsKSkpCiAgICAgIChhc2V0 IGNhY2hlIDAgJ29iamVjdCkKICAgICAgKGFzZXQgY2FjaGUgb2JqZWN0LWNsYXNzIGNuYW1lKQog ICAgICAoYXNldCBjYWNoZSBvYmplY3QtbmFtZSAnZGVmYXVsdC1jYWNoZS1vYmplY3QpCiAgICAg IChsZXQgKChlaWVpby1za2lwLXR5cGVjaGVjayB0KSkKCTs7IEFsbCB0eXBlLWNoZWNraW5nIGhh cyBiZWVuIGRvbmUgdG8gb3VyIHNhdGlzZmFjdGlvbgoJOzsgYmVmb3JlIHRoaXMgY2FsbC4gIERv bid0IHdhc3RlIG91ciB0aW1lIGluIHRoaXMgY2FsbC4uCgkoZWllaW8tc2V0LWRlZmF1bHRzIGNh Y2hlIHQpKQogICAgICAoYXNldCBuZXdjIGNsYXNzLWRlZmF1bHQtb2JqZWN0LWNhY2hlIGNhY2hl KSkKCiAgICA7OyBSZXR1cm4gb3VyIG5ldyBjbGFzcyBvYmplY3QKICAgIG5ld2MKICAgICkpCgoo ZGVmdW4gZWllaW8tcGVyZm9ybS1zbG90LXZhbGlkYXRpb24tZm9yLWRlZmF1bHQgKGZpZWxkIHNw ZWMgdmFsdWUgc2tpcG5pbCkKICAiRm9yIEZJRUxELCBzaWduYWwgaWYgU1BFQyBkb2VzIG5vdCBt YXRjaCBWQUxVRS4KSWYgU0tJUE5JTCBpcyBub24tbmlsLCB0aGVuIGlmIFZBTFVFIGlzIG5pbCwg cmV0dXJuIHQuIgogIChsZXQgKCh2YWwgKGVpZWlvLWRlZmF1bHQtZXZhbC1tYXliZSB2YWx1ZSkp KQogICAgKGlmIChhbmQgKG5vdCBlaWVpby1za2lwLXR5cGVjaGVjaykKCSAgICAgKG5vdCAoYW5k IHNraXBuaWwgKG51bGwgdmFsKSkpCgkgICAgIChub3QgKGVpZWlvLXBlcmZvcm0tc2xvdC12YWxp ZGF0aW9uIHNwZWMgdmFsKSkpCgkoc2lnbmFsICdpbnZhbGlkLXNsb3QtdHlwZSAobGlzdCBmaWVs ZCBzcGVjIHZhbCkpKSkpCgooZGVmdW4gZWllaW8tYWRkLW5ldy1maWVsZCAobmV3YyBhIGQgZG9j IHR5cGUgY3VzdCBsYWJlbCBjdXN0ZyBwcm90IGluaXQgYWxsb2MKCQkJCSAmb3B0aW9uYWwgZGVm YXVsdG92ZXJyaWRlIHNraXBuaWwpCiAgIkFkZCBpbnRvIE5FV0MgYXR0cmlidXRlIEEuCklmIEEg YWxyZWFkeSBleGlzdHMgaW4gTkVXQywgdGhlbiBkbyBub3RoaW5nLiAgSWYgaXQgZG9lc24ndCBl eGlzdCwKdGhlbiBhbHNvIGFkZCBpbiBEIChkZWZ1YWx0KSwgRE9DLCBUWVBFLCBDVVNULCBMQUJF TCwgQ1VTVEcsIFBST1QsIGFuZCBJTklUIGFyZy4KQXJndW1lbnQgQUxMT0Mgc3BlY2lmaWVzIGlm IHRoZSBmaWVsZCBpcyBhbGxvY2F0ZWQgcGVyIGluc3RhbmNlLCBvciBwZXIgY2xhc3MuCklmIG9w dGlvbmFsIERFRkFVTFRPVkVSUklERSBpcyBub24tbmlsLCB0aGVuIGlmIEEgZXhpc3RzIGluIE5F V0MsCndlIG11c3Qgb3ZlcnJpZGUgaXQncyB2YWx1ZSBmb3IgYSBkZWZhdWx0LgpPcHRpb25hbCBh cmd1bWVudCBTS0lQTklMIGluZGljYXRlcyBpZiB0eXBlIGNoZWNraW5nIHNob3VsZCBiZSBza2lw cGVkCmlmIGRlZmF1bHQgdmFsdWUgaXMgbmlsLiIKICA7OyBNYWtlIHN1cmUgd2UgZHVwbGljYXRl IHRob3NlIGl0ZW1zIHRoYXQgYXJlIHNlcXVlbmNlcy4KICAoaWYgKHNlcXVlbmNlcCBkKSAoc2V0 cSBkIChjb3B5LXNlcXVlbmNlIGQpKSkKICAoaWYgKHNlcXVlbmNlcCB0eXBlKSAoc2V0cSB0eXBl IChjb3B5LXNlcXVlbmNlIHR5cGUpKSkKICAoaWYgKHNlcXVlbmNlcCBjdXN0KSAoc2V0cSBjdXN0 IChjb3B5LXNlcXVlbmNlIGN1c3QpKSkKICAoaWYgKHNlcXVlbmNlcCBjdXN0ZykgKHNldHEgY3Vz dGcgKGNvcHktc2VxdWVuY2UgY3VzdGcpKSkKCiAgOzsgVG8gcHJldmVudCBvdmVycmlkZSBpbmZv cm1hdGlvbiB3L291dCBzcGVjaWZpY2F0aW9uIG9mIHN0b3JhZ2UsCiAgOzsgd2UgbmVlZCB0byBk byB0aGlzIGxpdHRsZSBoYWNrLgogIChpZiAobWVtYmVyIGEgKGFyZWYgbmV3YyBjbGFzcy1jbGFz cy1hbGxvY2F0aW9uLWEpKSAoc2V0cSBhbGxvYyAnOmNsYXNzKSkKCiAgKGlmIChvciAobm90IGFs bG9jKSAoYW5kIChzeW1ib2xwIGFsbG9jKSAoZXEgYWxsb2MgJzppbnN0YW5jZSkpKQogICAgICA7 OyBJbiB0aGlzIGNhc2UsIHdlIG1vZGlmeSB0aGUgSU5TVEFOQ0UgdmVyc2lvbiBvZiBhIGdpdmVu IHNsb3QuCiAgICAgIDs7IE9ubHkgYWRkIHRoaXMgZWxlbWVudCBpZiBpdCBpcyBzby1mYXIgdW5p cXVlCiAgICAgIChpZiAobm90IChtZW1iZXIgYSAoYXJlZiBuZXdjIGNsYXNzLXB1YmxpYy1hKSkp CgkgIChwcm9nbgoJICAgIChlaWVpby1wZXJmb3JtLXNsb3QtdmFsaWRhdGlvbi1mb3ItZGVmYXVs dCBhIHR5cGUgZCBza2lwbmlsKQoJICAgIChhc2V0IG5ld2MgY2xhc3MtcHVibGljLWEgKGNvbnMg YSAoYXJlZiBuZXdjIGNsYXNzLXB1YmxpYy1hKSkpCgkgICAgKGFzZXQgbmV3YyBjbGFzcy1wdWJs aWMtZCAoY29ucyBkIChhcmVmIG5ld2MgY2xhc3MtcHVibGljLWQpKSkKCSAgICAoYXNldCBuZXdj IGNsYXNzLXB1YmxpYy1kb2MgKGNvbnMgZG9jIChhcmVmIG5ld2MgY2xhc3MtcHVibGljLWRvYykp KQoJICAgIChhc2V0IG5ld2MgY2xhc3MtcHVibGljLXR5cGUgKGNvbnMgdHlwZSAoYXJlZiBuZXdj IGNsYXNzLXB1YmxpYy10eXBlKSkpCgkgICAgKGFzZXQgbmV3YyBjbGFzcy1wdWJsaWMtY3VzdG9t IChjb25zIGN1c3QgKGFyZWYgbmV3YyBjbGFzcy1wdWJsaWMtY3VzdG9tKSkpCgkgICAgKGFzZXQg bmV3YyBjbGFzcy1wdWJsaWMtY3VzdG9tLWxhYmVsIChjb25zIGxhYmVsIChhcmVmIG5ld2MgY2xh c3MtcHVibGljLWN1c3RvbS1sYWJlbCkpKQoJICAgIChhc2V0IG5ld2MgY2xhc3MtcHVibGljLWN1 c3RvbS1ncm91cCAoY29ucyBjdXN0ZyAoYXJlZiBuZXdjIGNsYXNzLXB1YmxpYy1jdXN0b20tZ3Jv dXApKSkKCSAgICAoYXNldCBuZXdjIGNsYXNzLXByb3RlY3Rpb24gKGNvbnMgcHJvdCAoYXJlZiBu ZXdjIGNsYXNzLXByb3RlY3Rpb24pKSkKCSAgICAoYXNldCBuZXdjIGNsYXNzLWluaXRhcmctdHVw bGVzIChjb25zIChjb25zIGluaXQgYSkgKGFyZWYgbmV3YyBjbGFzcy1pbml0YXJnLXR1cGxlcykp KQoJICAgICkKCTs7IFdoZW4gZGVmYXVsdG92ZXJyaWRlIGlzIHRydWUsIHdlIGFyZSB1c3VhbGx5 IGFkZGluZyBuZXcgbG9jYWwKCTs7IGF0dHJpYnV0ZXMgd2hpY2ggbXVzdCBvdmVycmlkZSB0aGUg ZGVmYXVsdCB2YWx1ZSBvZiBhbnkgZmllbGQKCTs7IHBhc3NlZCBpbiBieSBvbmUgb2YgdGhlIHBh cmVudCBjbGFzc2VzLgoJKGlmIGRlZmF1bHRvdmVycmlkZQoJICAgIChwcm9nbgoJICAgICAgOzsg VGhlcmUgaXMgYSBtYXRjaCwgYW5kIHdlIG11c3Qgb3ZlcnJpZGUgdGhlIG9sZCB2YWx1ZS4KCSAg ICAgIChsZXQqICgoY2EgKGFyZWYgbmV3YyBjbGFzcy1wdWJsaWMtYSkpCgkJICAgICAobnAgKG1l bWJlciBhIGNhKSkKCQkgICAgIChudW0gKC0gKGxlbmd0aCBjYSkgKGxlbmd0aCBucCkpKQoJCSAg ICAgKGRwIChpZiBucCAobnRoY2RyIG51bSAoYXJlZiBuZXdjIGNsYXNzLXB1YmxpYy1kKSkKCQkJ ICAgbmlsKSkKCQkgICAgICh0cCAoaWYgbnAgKG50aCBudW0gKGFyZWYgbmV3YyBjbGFzcy1wdWJs aWMtdHlwZSkpKSkKCQkgICAgICkKCQkoaWYgKG5vdCBucCkKCQkgICAgKGVycm9yICJFaWVpbyBp bnRlcm5hbCBlcnJvciBvdmVycmlkaW5nIGRlZmF1bHQgdmFsdWUgZm9yICVzIgoJCQkgICBhKQoJ CSAgOzsgSWYgdHlwZSBpcyBwYXNzZWQgaW4sIGlzIGl0IHRoZSBzYW1lPwoJCSAgKGlmIChub3Qg KGVxIHR5cGUgdCkpCgkJICAgICAgKGlmIChub3QgKGVxdWFsIHR5cGUgdHApKQoJCQkgIChlcnJv cgoJCQkgICAiQ2hpbGQgc2xvdCB0eXBlIGAlcycgZG9lcyBub3QgbWF0Y2ggaW5oZXJpdGVkIHR5 cGUgYCVzJyBmb3IgYCVzJyIKCQkJICAgdHlwZSB0cCBhKSkpCgkJICA7OyBJZiB3ZSBoYXZlIGEg cmVwZWF0LCBvbmx5IHVwZGF0ZSB0aGUgaW5pdGFyZy4uLgoJCSAgKGVpZWlvLXBlcmZvcm0tc2xv dC12YWxpZGF0aW9uLWZvci1kZWZhdWx0IGEgdHAgZCBza2lwbmlsKQoJCSAgKHNldGNhciBkcCBk KQoJCSAgOzsgSWYgd2UgaGF2ZSBhIG5ldyBpbml0YXJnLCBjaGVjayBmb3IgaXQuCgkJICAod2hl biBpbml0CgkJICAgIChsZXQqICgoaW5pdHMgKGFyZWYgbmV3YyBjbGFzcy1pbml0YXJnLXR1cGxl cykpCgkJCSAgIChpbml0YSAocmFzc3EgYSBpbml0cykpKQoJCSAgICAgIDs7IFJlcGxhY2UgdGhl IENBUiBvZiB0aGUgYXNzb2NpYXRlIElOSVRBLgoJCSAgICAgIDs7KG1lc3NhZ2UgIkluaXRhcmc6 ICVTIHJlcGxhY2UgJXMiIGluaXRhIGluaXQpCgkJICAgICAgKHNldGNhciBpbml0YSBpbml0KQoJ CSAgICAgICkpCgkJICA7OyBUT0RPOgoJCSAgOzsgIEZvciBvdGhlciBzbG90cyAocHJvdGVjdGlv biwgZXRjKSB3ZSBzaG91bGQgZ2V0IHRoZQoJCSAgOzsgIG9yaWdpbmFsIHZhbHVlLCBhbmQgbWFr ZSBzdXJlIGVhY2ggaXMgZXF1YWwgdG8gdGhlCgkJICA7OyAgbGFzdCB2YWx1ZSBhbmQgdGhyb3cg YW4gZXJyb3IsIG9yIGFjY2VwdAoJCSAgOzsgIGl0LgoJCSAgOzsgUExOIFR1ZSBKdW4gMjYgMTE6 NTc6MDYgMjAwNyA6IFRoZQoJCSAgOzsgcHJvdGVjdGlvbiBpcyBjaGVja2VkIGFuZCBTSE9VTEQg bWF0Y2ggdGhlCgkJICA7OyBzdXBlcmNsYXNzIHByb3RlY3Rpb24uIE90aGVyd2lzZSBhbiBlcnJv cgoJCSAgOzsgaXMgdGhyb3duLiBIb3dldmVyIEkgd29uZGVyIGlmIGEgbW9yZQoJCSAgOzsgZmxl eGlibGUgc2NoZWR1bGUgbWlnaHQgYmUgaW1wbGVtZW50ZWQuIAoJCSAgKGlmIHByb3QKCQkgICAg ICAobGV0ICgoc3VwZXItcHJvdAoJCQkgICAgIChjYXIgKG50aGNkciBudW0KCQkJCQkgIChhcmVm IG5ld2MKICBjbGFzcy1wcm90ZWN0aW9uKSkpKSkKCQkJKGlmIChub3QgKGVxIHByb3Qgc3VwZXIt cHJvdCkpCgkJCSAgICAoZXJyb3IKCQkJICAgIkNoaWxkIHNsb3QgcHJvdGVjdGlvbiBgJXMnIGRv ZXMgbm90IG1hdGNoIGluaGVyaXRlZCBwcm90ZWN0aW9uIGAlcycgZm9yIGAlcyciCgkJCSAgIHBy b3Qgc3VwZXItcHJvdCBhKSkpKQoJCSAgOzsgV2UgZG8gYSBub24gcmVkdW5kYW50IGNvbWJpbmF0 aW9uIG9mCgkJICA7OyBhbmNpZW50IGN1c3RvbSBncm91cHMgYW5kIG5ldyBvbmVzIHVzaW5nCgkJ ICA7OyB0aGUgY29tbW9uIGxpc3AgYHVuaW9uJyBtZXRob2QuCgkJICAoaWYgY3VzdGcKCQkgICAg ICAobGV0ICgod2hlcmUtZ3JvdXBzIChudGhjZHIKCQkJCQkgICBudW0gKGFyZWYgbmV3YwoJCQkJ CQkgICAgIGNsYXNzLXB1YmxpYy1jdXN0b20tZ3JvdXApKSkpCgkJCShzZXRjYXIgd2hlcmUtZ3Jv dXBzCgkJCQkodW5pb24gKGNhciB3aGVyZS1ncm91cHMpCgkJCQkgICAgICAgKGlmIChsaXN0cCBj dXN0ZykgY3VzdGcKICAobGlzdCBjdXN0ZykpKSkpKQoJCSAgOzsgIEVuZCBQTE4KCQkgIDs7ICBQ TE4gTW9uIEp1biAyNSAyMjo0NDozNCAyMDA3IDogSWYgYSBuZXcKCQkgIDs7ICBjdXN0IGlzIHNl dCwgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lLgoJCSAgKHdoZW4gY3VzdAoJCSAgICA7OyAo bWVzc2FnZSAiQ3VzdG9tIHR5cGUgcmVkZWZpbmVkIHRvICVzIiBjdXN0KSAKCQkgICAgKHNldGNh ciAobnRoY2RyIG51bQoJCQkJICAgIChhcmVmIG5ld2MKCQkJCQkgIGNsYXNzLXB1YmxpYy1jdXN0 b20pKQogIGN1c3QpKQoJCSAgOzsgSWYgYSBuZXcgbGFiZWwgaXMgc3BlY2lmaWVkLCBpdCBzaW1w bHkKCQkgIDs7IHJlcGxhY2VzIHRoZSBvbGQgb25lLgoJCSAgKHdoZW4gbGFiZWwKCQkgICAgOzs7 IChtZXNzYWdlICJDdXN0b20gbGFiZWwgcmVkZWZpbmVkIHRvICVzIiBsYWJlbCkKCQkgICAgKHNl dGNhciAobnRoY2RyIG51bQoJCQkJICAgIChhcmVmIG5ld2MKCQkJCQkgIGNsYXNzLXB1YmxpYy1j dXN0b20tbGFiZWwpKQoJCQkgICAgbGFiZWwpKQoJCSAgOzsgIEVuZCBQTE4KCQkgIDs7OyBQTE4g U2F0IEp1biAzMCAxNzoyNDo0MiAyMDA3IDogd2hlbiBhIG5ldwo7OzsgZG9jIGlzIHNwZWNpZmll ZCwgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lLgoJCSAgKHdoZW4gZG9jCgkJICAgIChtZXNz YWdlICJEb2N1bWVudGF0aW9uIHJlZGVmaW5lZCB0byAlcyIgZG9jKQoJCSAgICAoc2V0Y2FyIChu dGhjZHIgbnVtCgkJCQkgICAgKGFyZWYgbmV3YwoJCQkJCSAgY2xhc3MtcHVibGljLWRvYykpCgkJ CSAgICBkb2MpKQoJCSAgOzs7IEVuZCBQTE4KCQkgICkpKSkpCiAgICAobGV0ICgodmFsdWUgKGVp ZWlvLWRlZmF1bHQtZXZhbC1tYXliZSBkKSkpCiAgICAgIChpZiAobm90IChtZW1iZXIgYSAoYXJl ZiBuZXdjIGNsYXNzLWNsYXNzLWFsbG9jYXRpb24tYSkpKQoJICAocHJvZ24KCSAgICAoZWllaW8t cGVyZm9ybS1zbG90LXZhbGlkYXRpb24tZm9yLWRlZmF1bHQgYSB0eXBlIHZhbHVlIHNraXBuaWwp CgkgICAgOzsgSGVyZSB3ZSBoYXZlIGZvdW5kIGEgOmNsYXNzIHZlcnNpb24gb2YgYSBzbG90LiAg VGhpcwoJICAgIDs7IHJlcXVpcmVzIGEgdmVyeSBkaWZmZXJlbnQgYXByb2FjaC4KCSAgICAoYXNl dCBuZXdjIGNsYXNzLWNsYXNzLWFsbG9jYXRpb24tYSAoY29ucyBhIChhcmVmIG5ld2MgY2xhc3Mt Y2xhc3MtYWxsb2NhdGlvbi1hKSkpCgkgICAgKGFzZXQgbmV3YyBjbGFzcy1jbGFzcy1hbGxvY2F0 aW9uLWRvYyAoY29ucyBkb2MgKGFyZWYgbmV3YyBjbGFzcy1jbGFzcy1hbGxvY2F0aW9uLWRvYykp KQoJICAgIChhc2V0IG5ld2MgY2xhc3MtY2xhc3MtYWxsb2NhdGlvbi10eXBlIChjb25zIHR5cGUg KGFyZWYgbmV3YyBjbGFzcy1jbGFzcy1hbGxvY2F0aW9uLXR5cGUpKSkKCSAgICAoYXNldCBuZXdj IGNsYXNzLWNsYXNzLWFsbG9jYXRpb24tY3VzdG9tIChjb25zIGN1c3QgKGFyZWYgbmV3YyBjbGFz cy1jbGFzcy1hbGxvY2F0aW9uLWN1c3RvbSkpKQoJICAgIChhc2V0IG5ld2MgY2xhc3MtY2xhc3Mt YWxsb2NhdGlvbi1jdXN0b20tbGFiZWwgKGNvbnMgbGFiZWwgKGFyZWYgbmV3YyBjbGFzcy1jbGFz cy1hbGxvY2F0aW9uLWN1c3RvbS1sYWJlbCkpKQoJICAgIChhc2V0IG5ld2MgY2xhc3MtY2xhc3Mt YWxsb2NhdGlvbi1jdXN0b20tZ3JvdXAgKGNvbnMgY3VzdGcgKGFyZWYgbmV3YyBjbGFzcy1jbGFz cy1hbGxvY2F0aW9uLWN1c3RvbS1ncm91cCkpKQoJICAgIChhc2V0IG5ld2MgY2xhc3MtY2xhc3Mt YWxsb2NhdGlvbi1wcm90ZWN0aW9uIChjb25zIHByb3QgKGFyZWYgbmV3YyBjbGFzcy1jbGFzcy1h bGxvY2F0aW9uLXByb3RlY3Rpb24pKSkKICA7OyBEZWZhdWx0IHZhbHVlIGlzIHN0b3JlZCBpbiB0 aGUgJ3ZhbHVlcyBzZWN0aW9uLCBzaW5jZSBuZXcgb2JqZWN0cwoJICAgIDs7IGNhbid0IGluaXRp YWxpemUgZnJvbSB0aGlzIGVsZW1lbnQuCgkgICAgKGFzZXQgbmV3YyBjbGFzcy1jbGFzcy1hbGxv Y2F0aW9uLXZhbHVlcyAoY29ucyB2YWx1ZSAoYXJlZiBuZXdjIGNsYXNzLWNsYXNzLWFsbG9jYXRp b24tdmFsdWVzKSkpKQoJKGlmIGRlZmF1bHRvdmVycmlkZQoJICAgIChwcm9nbgoJICAgICAgOzsg VGhlcmUgaXMgYSBtYXRjaCwgYW5kIHdlIG11c3Qgb3ZlcnJpZGUgdGhlIG9sZCB2YWx1ZS4KCSAg ICAgIChsZXQqICgoY2EgKGFyZWYgbmV3YyBjbGFzcy1jbGFzcy1hbGxvY2F0aW9uLWEpKQoJCSAg ICAgKG5wIChtZW1iZXIgYSBjYSkpCgkJICAgICAobnVtICgtIChsZW5ndGggY2EpIChsZW5ndGgg bnApKSkKCQkgICAgIChkcCAoaWYgbnAKCQkJICAgICAobnRoY2RyIG51bQoJCQkJICAgICAoYXJl ZiBuZXdjIGNsYXNzLWNsYXNzLWFsbG9jYXRpb24tdmFsdWVzKSkKCQkJICAgbmlsKSkKCQkgICAg ICh0cCAoaWYgbnAgKG50aCBudW0gKGFyZWYgbmV3YyBjbGFzcy1jbGFzcy1hbGxvY2F0aW9uLXR5 cGUpKQoJCQkgICBuaWwpKSkKCQkoaWYgKG5vdCBucCkKCQkgICAgKGVycm9yICJFaWVpbyBpbnRl cm5hbCBlcnJvciBvdmVycmlkaW5nIGRlZmF1bHQgdmFsdWUgZm9yICVzIgoJCQkgICBhKQoJCSAg OzsgSWYgdHlwZSBpcyBwYXNzZWQgaW4sIGlzIGl0IHRoZSBzYW1lPwoJCSAgKGlmIChub3QgKGVx IHR5cGUgdCkpCgkJICAgICAgKGlmIChub3QgKGVxdWFsIHR5cGUgdHApKQoJCQkgIChlcnJvcgoJ CQkgICAiQ2hpbGQgc2xvdCB0eXBlIGAlcycgZG9lcyBub3QgbWF0Y2ggaW5oZXJpdGVkIHR5cGUg YCVzJyBmb3IgYCVzJyIKCQkJICAgdHlwZSB0cCBhKSkpCgkJICA7OyBJZiB3ZSBoYXZlIGEgcmVw ZWF0LCBvbmx5IHVwZGF0ZSB0aGUgdmxhdWUuLi4KCQkgIChlaWVpby1wZXJmb3JtLXNsb3QtdmFs aWRhdGlvbi1mb3ItZGVmYXVsdCBhIHRwIHZhbHVlIHNraXBuaWwpCgkJICAoc2V0Y2FyIGRwIHZh bHVlKSkKCQkpKSkpKQogICAgKSkKCihkZWZ1biBlaWVpby1jb3B5LXBhcmVudHMtaW50by1zdWJj bGFzcyAobmV3YyBwYXJlbnRzKQogICJDb3B5IGludG8gTkVXQyB0aGUgZmllbGRzIG9mIFBBUkVO VFMuCkZvbGxvdyB0aGUgcnVsZXMgb2Ygbm90IG92ZXJ3cml0dGluZyBlYXJseSBwYXJlbnRzIHdo ZW4gYXBwbHlpbmcgdG8KdGhlIG5ldyBjaGlsZCBjbGFzcy4iCiAgKGxldCAoKHBzIChhcmVmIG5l d2MgY2xhc3MtcGFyZW50KSkKCShzbiAoY2xhc3Mtb3B0aW9uLWFzc29jIChhcmVmIG5ld2MgY2xh c3Mtb3B0aW9ucykKCQkJCSc6YWxsb3ctbmlsLWluaXRmb3JtKSkpCiAgICAod2hpbGUgcHMKICAg ICAgOzsgRmlyc3QsIGR1cGxpY2F0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgcGFyZW50LgogICAg ICAobGV0ICgocGN2IChjbGFzcy12IChjYXIgcHMpKSkpCgkobGV0ICgocGEgKGFyZWYgcGN2IGNs YXNzLXB1YmxpYy1hKSkKCSAgICAgIChwZCAoYXJlZiBwY3YgY2xhc3MtcHVibGljLWQpKQoJICAg ICAgKHBkb2MgKGFyZWYgcGN2IGNsYXNzLXB1YmxpYy1kb2MpKQoJICAgICAgKHB0eXBlIChhcmVm IHBjdiBjbGFzcy1wdWJsaWMtdHlwZSkpCgkgICAgICAocGN1c3QgKGFyZWYgcGN2IGNsYXNzLXB1 YmxpYy1jdXN0b20pKQoJICAgICAgKHBsYWJlbCAoYXJlZiBwY3YgY2xhc3MtcHVibGljLWN1c3Rv bS1sYWJlbCkpCgkgICAgICAocGN1c3RnIChhcmVmIHBjdiBjbGFzcy1wdWJsaWMtY3VzdG9tLWdy b3VwKSkKCSAgICAgIChwcHJvdCAoYXJlZiBwY3YgY2xhc3MtcHJvdGVjdGlvbikpCgkgICAgICAo cGluaXQgKGFyZWYgcGN2IGNsYXNzLWluaXRhcmctdHVwbGVzKSkKCSAgICAgIChpIDApKQoJICAo d2hpbGUgcGEKCSAgICAoZWllaW8tYWRkLW5ldy1maWVsZCBuZXdjCgkJCQkgKGNhciBwYSkgKGNh ciBwZCkgKGNhciBwZG9jKSAoYXJlZiBwdHlwZSBpKQoJCQkJIChjYXIgcGN1c3QpIChjYXIgcGxh YmVsKSAoY2FyIHBjdXN0ZykKCQkJCSAoY2FyIHBwcm90KSAoY2FyLXNhZmUgKGNhciBwaW5pdCkp IG5pbCBuaWwgc24pCgkgICAgOzsgSW5jcmVtZW50IGVhY2ggdmFsdWUuCgkgICAgKHNldHEgcGEg KGNkciBwYSkKCQkgIHBkIChjZHIgcGQpCgkJICBwZG9jIChjZHIgcGRvYykKCQkgIGkgKDErIGkp CgkJICBwY3VzdCAoY2RyIHBjdXN0KQoJCSAgcGxhYmVsIChjZHIgcGxhYmVsKQoJCSAgcGN1c3Rn IChjZHIgcGN1c3RnKQoJCSAgcHByb3QgKGNkciBwcHJvdCkKCQkgIHBpbml0IChjZHIgcGluaXQp KQoJICAgICkpIDs7IHdoaWxlL2xldAoJOzsgTm93IGR1cGxpY2F0ZSBhbGwgdGhlIGNsYXNzIGFs bG9jIGZpZWxkcy4KCShsZXQgKChwYSAoYXJlZiBwY3YgY2xhc3MtY2xhc3MtYWxsb2NhdGlvbi1h KSkKCSAgICAgIChwZG9jIChhcmVmIHBjdiBjbGFzcy1jbGFzcy1hbGxvY2F0aW9uLWRvYykpCgkg ICAgICAocHR5cGUgKGFyZWYgcGN2IGNsYXNzLWNsYXNzLWFsbG9jYXRpb24tdHlwZSkpCgkgICAg ICAocGN1c3QgKGFyZWYgcGN2IGNsYXNzLWNsYXNzLWFsbG9jYXRpb24tY3VzdG9tKSkKCSAgICAg IChwbGFiZWwgKGFyZWYgcGN2IGNsYXNzLWNsYXNzLWFsbG9jYXRpb24tY3VzdG9tLWxhYmVsKSkK CSAgICAgIChwY3VzdGcgKGFyZWYgcGN2IGNsYXNzLWNsYXNzLWFsbG9jYXRpb24tY3VzdG9tLWdy b3VwKSkKCSAgICAgIChwcHJvdCAoYXJlZiBwY3YgY2xhc3MtY2xhc3MtYWxsb2NhdGlvbi1wcm90 ZWN0aW9uKSkKCSAgICAgIChwdmFsIChhcmVmIHBjdiBjbGFzcy1jbGFzcy1hbGxvY2F0aW9uLXZh bHVlcykpCgkgICAgICAoaSAwKSkKCSAgKHdoaWxlIHBhCgkgICAgKGVpZWlvLWFkZC1uZXctZmll bGQgbmV3YwoJCQkJIChjYXIgcGEpIChhcmVmIHB2YWwgaSkgKGNhciBwZG9jKSAoYXJlZiBwdHlw ZSBpKQoJCQkJIChjYXIgcGN1c3QpIChjYXIgcGxhYmVsKSAoY2FyIHBjdXN0ZykKCQkJCSAoY2Fy IHBwcm90KSBuaWwgJzpjbGFzcyBzbikKCSAgICA7OyBJbmNyZW1lbnQgZWFjaCB2YWx1ZS4KCSAg ICAoc2V0cSBwYSAoY2RyIHBhKQoJCSAgcGRvYyAoY2RyIHBkb2MpCgkJICBwY3VzdCAoY2RyIHBj dXN0KQoJCSAgcGxhYmVsIChjZHIgcGxhYmVsKQoJCSAgcGN1c3RnIChjZHIgcGN1c3RnKQoJCSAg cHByb3QgKGNkciBwcHJvdCkKCQkgIGkgKDErIGkpKQoJICAgICkpKSA7OyB3aGlsZS9sZXQKICAg ICAgOzsgTG9vcCBvdmVyIGVhY2ggcGFyZW50IGNsYXNzCiAgICAgIChzZXRxIHBzIChjZHIgcHMp KSkKICAgICkpCgo7OzsgQ0xPUyBzdHlsZSBpbXBsZW1lbnRhdGlvbiBvZiBvYmplY3QgY3JlYXRv cnMuCjs7CihkZWZ1biBtYWtlLWluc3RhbmNlIChjbGFzcyAmcmVzdCBpbml0YXJncykKICAiTWFr ZSBhIG5ldyBpbnN0YW5jZSBvZiBDTEFTUyB3aXRoIE5BTUUgYW5kIGluaXRpYWxpemF0aW9uIGJh c2VkIG9uIElOSVRBUkdTLgpUaGUgY2xhc3MnIGNvbnN0cnVjdG9yIHJlcXVpcmVzIGEgbmFtZSBm b3IgdXNlIHdoZW4gcHJpbnRpbmcuCmBtYWtlLWluc3RhbmNlJyBpbiBDTE9TIGRvZXNuJ3QgdXNl IG5hbWVzIHRoZSB3YXkgRW1hY3MgZG9lcywgc28gdGhlCmNsYXNzIGlzIHVzZWQgYXMgdGhlIG5h bWUgc2xvdCBpbnN0ZWFkIHdoZW4gSU5JVEFSR1MgZG9lc24ndCBzdGFydCB3aXRoCmEgc3RyaW5n LiAgVGhlIHJlc3Qgb2YgSU5JVEFSR1MgYXJlIGxhYmVsL3ZhbHVlIHBhaXJzLiAgVGhlIGxhYmVs J3MKYXJlIHRoZSBzeW1ib2xzIGNyZWF0ZWQgd2l0aCB0aGUgOmluaXRhcmcgdGFnIGZyb20gdGhl IGBkZWZjbGFzcycgY2FsbC4KVGhlIHZhbHVlIGlzIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhhdCBz bG90LgpDTEFTUyBpcyBhIHN5bWJvbC4gIERlZmNsYXNzIHdpbGwgYXNzaWduIHRoZSBjbGFzcyBz eW1ib2wgdG8gaXRzZWxmLCBzbwp0aGUgc2hvcnRjdXQgKG1ha2UtaW5zdGFuY2UgZm9vKSB3aWxs IHdvcmsuICBUaGUgZm9ybSAobWFrZS1pbnN0YW5jZSAnZm9vKQppcyBtb3JlIHJvYnVzdC4iCiAg KGlmIChhbmQgKGNhciBpbml0YXJncykgKHN0cmluZ3AgKGNhciBpbml0YXJncykpKQogICAgICAo YXBwbHkgKGNsYXNzLWNvbnN0cnVjdG9yIGNsYXNzKSBpbml0YXJncykKICAgIChhcHBseSAgKGNs YXNzLWNvbnN0cnVjdG9yIGNsYXNzKQoJICAgIChjb25kICgoc3ltYm9scCBjbGFzcykgKHN5bWJv bC1uYW1lIGNsYXNzKSkKCQkgICh0IChmb3JtYXQgIiVTIiBjbGFzcykpKQoJICAgIGluaXRhcmdz KSkpCgoMCjs7OyBDTE9TIG1ldGhvZHMgYW5kIGdlbmVyaWNzCjs7CihkZWZtYWNybyBkZWZnZW5l cmljIChtZXRob2QgYXJncyAmb3B0aW9uYWwgZG9jLXN0cmluZykKICAiQ3JlYXRlIGEgZ2VuZXJp YyBmdW5jdGlvbiBNRVRIT0QuICBBUkdTIGlzIGlnbm9yZWQuCkRPQy1TVFJJTkcgaXMgdGhlIGJh c2UgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcy4gIEEgZ2VuZXJpYwpmdW5jdGlvbiBoYXMg bm8gYm9keSwgYXMgaXQncyBwdXJwb3NlIGlzIHRvIGRlY2lkZSB3aGljaCBtZXRob2QgYm9keQpp cyBhcHByb3ByaWF0ZSB0byB1c2UuICBVc2UgYGRlZm1ldGhvZCcgdG8gY3JlYXRlIG1ldGhvZHMs IGFuZCBpdApjYWxscyBkZWZnZW5lcmljIGZvciB5b3UuICBXaXRoIHRoaXMgaW1wbGVtZW50YXRp b24gdGhlIGFyZ3VtZW50cyBhcmUKY3VycmVudGx5IGlnbm9yZWQuICBZb3UgY2FuIHVzZSBgZGVm Z2VuZXJpYycgdG8gYXBwbHkgc3BlY2lhbGl6ZWQKdG9wIGxldmVsIGRvY3VtZW50YXRpb24gdG8g YSBtZXRob2QuIgogIGAoZWllaW8tZGVmZ2VuZXJpYyAocXVvdGUgLG1ldGhvZCkgLGRvYy1zdHJp bmcpKQoKKGRlZnVuIGVpZWlvLWRlZmdlbmVyaWMtZm9ybSAobWV0aG9kIGRvYy1zdHJpbmcpCiAg IlRoZSBsYW1iZGEgZm9ybSB0aGF0IHdvdWxkIGJlIHVzZWQgYXMgdGhlIGZ1bmN0aW9uIGRlZmlu ZWQgb24gTUVUSE9ELgpBbGwgbWV0aG9kcyBzaG91bGQgY2FsbCB0aGUgc2FtZSBFSUVJTyBmdW5j dGlvbiBmb3IgZGlzcGF0Y2guCkRPQy1TVFJJTkcgaXMgdGhlIGRvY3VtZW50YXRpb24gYXR0YWNo ZWQgdG8gTUVUSE9ELiIKICBgKGxhbWJkYSAoJnJlc3QgbG9jYWwtYXJncykKICAgICAsZG9jLXN0 cmluZwogICAgIChlaWVpby1nZW5lcmljLWNhbGwgKHF1b3RlICxtZXRob2QpIGxvY2FsLWFyZ3Mp KSkKCihkZWZ1biBlaWVpby1kZWZnZW5lcmljIChtZXRob2QgZG9jLXN0cmluZykKICAiRW5naW5l IHBhcnQgdG8gYGRlZmdlbmVyaWMnIG1hY3JvIGRlZmluaW5nIE1FVEhPRCB3aXRoIERPQy1TVFJJ TkcuIgogIChpZiAoYW5kIChmYm91bmRwIG1ldGhvZCkgKG5vdCAoZ2VuZXJpYy1wIG1ldGhvZCkp CgkgICAob3IgKGJ5dGUtY29kZS1mdW5jdGlvbi1wIChzeW1ib2wtZnVuY3Rpb24gbWV0aG9kKSkK CSAgICAgICAobm90IChlcSAnYXV0b2xvYWQgKGNhciAoc3ltYm9sLWZ1bmN0aW9uIG1ldGhvZCkp KSkpCgkgICApCiAgICAgIChlcnJvciAiWW91IGNhbm5vdCBjcmVhdGUgYSBnZW5lcmljL21ldGhv ZCBvdmVyIGFuIGV4aXN0aW5nIHN5bWJvbDogJXMiCgkgICAgIG1ldGhvZCkpCiAgOzsgRG9uJ3Qg ZG8gdGhpcyBvdmVyIGFuZCBvdmVyLgogICh1bmxlc3MgKGZib3VuZHAgJ21ldGhvZCkKICAgIDs7 IFRoaXMgZGVmdW4gdGVsbHMgZW1hY3Mgd2hlcmUgdGhlIGZpcnN0IGRlZmluaXRpb24gb2YgdGhp cwogICAgOzsgbWV0aG9kIGlzIGRlZmluZWQuCiAgICBgKGRlZnVuICxtZXRob2QgbmlsKQogICAg OzsgQXBwbHkgdGhlIGFjdHVhbCBib2R5IG9mIHRoaXMgZnVuY3Rpb24uCiAgICAoZnNldCBtZXRo b2QgKGVpZWlvLWRlZmdlbmVyaWMtZm9ybSBtZXRob2QgZG9jLXN0cmluZykpCiAgICA7OyBNYWtl IHN1cmUgdGhlIG1ldGhvZCB0YWJsZXMgYXJlIGluc3RhbGxlZC4KICAgIChlaWVpb210LWluc3Rh bGwgbWV0aG9kKQogICAgOzsgUmV0dXJuIHRoZSBtZXRob2QKICAgICdtZXRob2QpKQoKKGRlZnVu IGVpZWlvLXVuYmluZC1tZXRob2QtaW1wbGVtZW50YXRpb25zIChtZXRob2QpCiAgIk1ha2UgdGhl IGdlbmVyaWMgbWV0aG9kIE1FVEhPRCBoYXZlIG5vIGltcGxlbWVudGF0aW9ucy4uCkl0IHdpbGwg bGVhdmUgdGhlIG9yaWdpbmFsIGdlbmVyaWMgZnVuY3Rpb24gaW4gcGxhY2UsIGJ1dCByZW1vdmUK cmVmZXJlbmNlIHRvIGFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgTUVUSE9ELiIKICAocHV0IG1ldGhv ZCAnZWllaW8tbWV0aG9kLXRyZWUgbmlsKQogIChwdXQgbWV0aG9kICdlaWVpby1tZXRob2Qtb2Jh cnJheSBuaWwpKQoKKGRlZm1hY3JvIGRlZm1ldGhvZCAobWV0aG9kICZyZXN0IGFyZ3MpCiAgIkNy ZWF0ZSBhIG5ldyBNRVRIT0QgdGhyb3VnaCBgZGVmZ2VuZXJpYycgd2l0aCBBUkdTLgpBUkdTIGxp c3RzIGFueSBrZXlzIChzdWNoIGFzIDpCRUZPUkUsIDpQUklNQVJZLCA6QUZURVIsIG9yIDpTVEFU SUMpLAp0aGUgYXJnbHN0LCBhbmQgZG9jIHN0cmluZywgYW5kIGV2ZW50dWFsbHkgdGhlIGJvZHks IHN1Y2ggYXM6CgogKGRlZm1ldGhvZCBteW1ldGhvZCBbOkJFRk9SRSB8IDpQUklNQVJZIHwgOkFG VEVSIHwgOlNUQVRJQ10gKGFyZ3MpCiAgICBkb2Mtc3RyaW5nIGJvZHkpIgogIGAoZWllaW8tZGVm bWV0aG9kIChxdW90ZSAsbWV0aG9kKSAocXVvdGUgLGFyZ3MpKSkKCihkZWZ1biBlaWVpby1kZWZt ZXRob2QgKG1ldGhvZCBhcmdzKQogICJXb3JrIHBhcnQgb2YgdGhlIGBkZWZtZXRob2QnIG1hY3Jv IGRlZmluaW5nIE1FVEhPRCB3aXRoIEFSR1MuIgogIChsZXQgKChrZXkgbmlsKSAoYm9keSBuaWwp IChmaXJzdGFyZyBuaWwpIChhcmdmaXggbmlsKSAoYXJnY2xhc3MgbmlsKSBsb29wYSkKICAgIDs7 IGZpbmQgb3B0aW9uYWwga2V5cwogICAgKHNldHEga2V5CgkgIChjb25kICgoZXEgJzpCRUZPUkUg KGNhciBhcmdzKSkKCQkgKHNldHEgYXJncyAoY2RyIGFyZ3MpKQoJCSBtZXRob2QtYmVmb3JlKQoJ CSgoZXEgJzpBRlRFUiAoY2FyIGFyZ3MpKQoJCSAoc2V0cSBhcmdzIChjZHIgYXJncykpCgkJIG1l dGhvZC1hZnRlcikKCQkoKGVxICc6UFJJTUFSWSAoY2FyIGFyZ3MpKQoJCSAoc2V0cSBhcmdzIChj ZHIgYXJncykpCgkJIG1ldGhvZC1wcmltYXJ5KQoJCSgoZXEgJzpTVEFUSUMgKGNhciBhcmdzKSkK CQkgKHNldHEgYXJncyAoY2RyIGFyZ3MpKQoJCSBtZXRob2Qtc3RhdGljKQoJCTs7IFByaW1hcnkg a2V5CgkJKHQgbWV0aG9kLXByaW1hcnkpKSkKICAgIDs7IGdldCBib2R5LCBhbmQgZml4IGNvbnRl bnRzIG9mIGFyZ3MgdG8gYmUgdGhlIGFyZ3VtZW50cyBvZiB0aGUgZm4uCiAgICAoc2V0cSBib2R5 IChjZHIgYXJncykKCSAgYXJncyAoY2FyIGFyZ3MpKQogICAgKHNldHEgbG9vcGEgYXJncykKICAg IDs7IENyZWF0ZSBhIGZpeGVkIHZlcnNpb24gb2YgdGhlIGFyZ3VtZW50cwogICAgKHdoaWxlIGxv b3BhCiAgICAgIChzZXRxIGFyZ2ZpeCAoY29ucyAoaWYgKGxpc3RwIChjYXIgbG9vcGEpKSAoY2Fy IChjYXIgbG9vcGEpKSAoY2FyIGxvb3BhKSkKCQkJIGFyZ2ZpeCkpCiAgICAgIChzZXRxIGxvb3Bh IChjZHIgbG9vcGEpKSkKICAgIDs7IG1ha2Ugc3VyZSB0aGVyZSBpcyBhIGdlbmVyaWMKICAgIChl aWVpby1kZWZnZW5lcmljCiAgICAgbWV0aG9kCiAgICAgKGlmIChzdHJpbmdwIChjYXIgYm9keSkp CgkgKGNhciBib2R5KSAoZm9ybWF0ICJHZW5lcmljYWxseSBjcmVhdGVkIG1ldGhvZCBgJXMnIiBt ZXRob2QpKSkKICAgIDs7IGNyZWF0ZSBzeW1ib2wgZm9yIHByb3BlcnR5IHRvIGJpbmQgdG8uICBJ ZiB0aGUgZmlyc3QgYXJnIGlzIG9mCiAgICA7OyB0aGUgZm9ybSAodmFybmFtZSB2YXJ0eXBlKSBh bmQgYHZhcnR5cGUnIGlzIGEgY2xhc3MsIHRoZW4KICAgIDs7IHRoYXQgY2xhc3Mgd2lsbCBiZSB0 aGUgdHlwZSBzeW1ib2wuICBJZiBub3QsIHRoZW4gaXQgd2lsbCBmYWxsCiAgICA7OyB1bmRlciB0 aGUgdHlwZSBgcHJpbWFyeScgd2hpY2ggaXMgYSBub24tc3BlY2lmaWMgY2FsbGluZyBvZiB0aGUK ICAgIDs7IGZ1bmN0aW9uLgogICAgKHNldHEgZmlyc3RhcmcgKGNhciBhcmdzKSkKICAgIChpZiAo bGlzdHAgZmlyc3RhcmcpCgkocHJvZ24KCSAgKHNldHEgYXJnY2xhc3MgIChudGggMSBmaXJzdGFy ZykpCgkgIChpZiAobm90IChjbGFzcy1wIGFyZ2NsYXNzKSkKCSAgICAgIChlcnJvciAiVW5rbm93 biBjbGFzcyB0eXBlICVzIGluIG1ldGhvZCBwYXJhbWV0ZXJzIgoJCSAgICAgKG50aCAxIGZpcnN0 YXJnKSkpKQogICAgICAoaWYgKD0ga2V5IC0xKQoJICAoc2lnbmFsICd3cm9uZy10eXBlLWFyZ3Vt ZW50IChsaXN0IDpTVEFUSUMgJ25vbi1jbGFzcy1hcmcpKSkKICAgICAgOzsgZ2VuZXJpY3MgYXJl IGhpZ2hlcgogICAgICAoc2V0cSBrZXkgKCsga2V5IDMpKSkKICAgIDs7IFB1dCB0aGlzIGxhbWJk YSBpbnRvIHRoZSBzeW1ib2wgc28gd2UgY2FuIGZpbmQgaXQKICAgIChpZiAoYnl0ZS1jb2RlLWZ1 bmN0aW9uLXAgKGNhci1zYWZlIGJvZHkpKQoJKGVpZWlvbXQtYWRkIG1ldGhvZCAoY2FyLXNhZmUg Ym9keSkga2V5IGFyZ2NsYXNzKQogICAgICAoZWllaW9tdC1hZGQgbWV0aG9kIChhcHBlbmQgKGxp c3QgJ2xhbWJkYSAocmV2ZXJzZSBhcmdmaXgpKSBib2R5KQoJCSAgIGtleSBhcmdjbGFzcykpCiAg ICApCiAgbWV0aG9kKQoKOzs7IFNsb3QgdHlwZSB2YWxpZGF0aW9uCjs7CihkZWZ1biBlaWVpby1w ZXJmb3JtLXNsb3QtdmFsaWRhdGlvbiAoc3BlYyB2YWx1ZSkKICAiUmV0dXJuIG5vbi1uaWwgaWYg U1BFQyBkb2VzIG5vdCBtYXRjaCBWQUxVRS4iCiAgOzsgdHlwZXAgaXMgaW4gY2wtbWFjcwogIChv ciAoZXEgc3BlYyB0KQkJCTsgdCBhbHdheXMgcGFzc2VzCiAgICAgIChlcSB2YWx1ZSBlaWVpby11 bmJvdW5kKQkJOyB1bmJvdW5kIGFsd2F5cyBwYXNzZXMKICAgICAgKHR5cGVwIHZhbHVlIHNwZWMp KSkKCihkZWZ1biBlaWVpby12YWxpZGF0ZS1zbG90LXZhbHVlIChjbGFzcyBmaWVsZC1pZHggdmFs dWUgZmllbGQpCiAgIk1ha2Ugc3VyZSB0aGF0IGZvciBDTEFTUyByZWZlcmVuY2luZyBGSUVMRC1J RFgsIHRoYXQgVkFMVUUgaXMgdmFsaWQuCkNoZWNrcyB0aGUgOnR5cGUgc3BlY2lmaWVyLgpGSUVM RCBpcyB0aGUgZmllbGQgdGhhdCBpcyBiZWluZyBjaGVja2VkLCBhbmQgaXMgb25seSB1c2VkIHdo ZW4gdGhyb3dpbmcKYW5kIGVycm9yLiIKICAoaWYgZWllaW8tc2tpcC10eXBlY2hlY2sKICAgICAg bmlsCiAgICA7OyBUcmltIG9mZiBvYmplY3QgSURYIGp1bmsgYWRkZWQgaW4gZm9yIHRoZSBvYmpl Y3QgaW5kZXguCiAgICAoc2V0cSBmaWVsZC1pZHggKC0gZmllbGQtaWR4IDMpKQogICAgKGxldCAo KHN0IChhcmVmIChhcmVmIChjbGFzcy12IGNsYXNzKSBjbGFzcy1wdWJsaWMtdHlwZSkgZmllbGQt aWR4KSkpCiAgICAgIChpZiAobm90IChlaWVpby1wZXJmb3JtLXNsb3QtdmFsaWRhdGlvbiBzdCB2 YWx1ZSkpCgkgIChzaWduYWwgJ2ludmFsaWQtc2xvdC10eXBlIChsaXN0IGNsYXNzIGZpZWxkIHN0 IHZhbHVlKSkpKSkpCgooZGVmdW4gZWllaW8tdmFsaWRhdGUtY2xhc3Mtc2xvdC12YWx1ZSAoY2xh c3MgZmllbGQtaWR4IHZhbHVlIGZpZWxkKQogICJNYWtlIHN1cmUgdGhhdCBmb3IgQ0xBU1MgcmVm ZXJlbmNpbmcgRklFTEQtSURYLCB0aGF0IFZBTFVFIGlzIHZhbGlkLgpDaGVja3MgdGhlIDp0eXBl IHNwZWNpZmllci4KRklFTEQgaXMgdGhlIGZpZWxkIHRoYXQgaXMgYmVpbmcgY2hlY2tlZCwgYW5k IGlzIG9ubHkgdXNlZCB3aGVuIHRocm93aW5nCmFuZCBlcnJvci4iCiAgKGlmIGVpZWlvLXNraXAt dHlwZWNoZWNrCiAgICAgIG5pbAogICAgKGxldCAoKHN0IChhcmVmIChhcmVmIChjbGFzcy12IGNs YXNzKSBjbGFzcy1jbGFzcy1hbGxvY2F0aW9uLXR5cGUpCgkJICAgIGZpZWxkLWlkeCkpKQogICAg ICAoaWYgKG5vdCAoZWllaW8tcGVyZm9ybS1zbG90LXZhbGlkYXRpb24gc3QgdmFsdWUpKQoJICAo c2lnbmFsICdpbnZhbGlkLXNsb3QtdHlwZSAobGlzdCBjbGFzcyBmaWVsZCBzdCB2YWx1ZSkpKSkp KQoKKGRlZnVuIGVpZWlvLWJhcmYtaWYtc2xvdC11bmJvdW5kICh2YWx1ZSBpbnN0YW5jZSBzbG90 bmFtZSBmbikKICAiVGhyb3cgYSBzaWduYWwgaWYgVkFMVUUgaXMgYSByZXByZXNlbnRhdGlvbiBv ZiBhbiBVTkJPVU5EIHNsb3QuCklOU1RBTkNFIGlzIHRoZSBvYmplY3QgYmVpbmcgcmVmZXJlbmNl ZC4gIFNMT1ROQU1FIGlzIHRoZSBvZmZlbmRpbmcKc2xvdC4gIElmIHRoZSBzbG90IGlzIG9rLCBy ZXR1cm4gVkFMVUUuCkFyZ3VtZW50IEZOIGlzIHRoZSBmdW5jdGlvbiBjYWxsaW5nIHRoaXMgdmVy aWZpZXIuIgogIChpZiAoYW5kIChlcSB2YWx1ZSBlaWVpby11bmJvdW5kKSAobm90IGVpZWlvLXNr aXAtdHlwZWNoZWNrKSkKICAgICAgKHNsb3QtdW5ib3VuZCBpbnN0YW5jZSAob2JqZWN0LWNsYXNz IGluc3RhbmNlKSBzbG90bmFtZSBmbikKICAgIHZhbHVlKSkKCjs7OyBNaXNzaW5nIHR5cGVzIHRo YXQgYXJlIHVzZWZ1bCB0byBtZS4KOzsKKGRlZnVuIGJvb2xlYW4tcCAoYm9vbCkKICAiUmV0dXJu IG5vbi1uaWwgaWYgQk9PTCBpcyBuaWwgb3IgdC4iCiAgKG9yIChudWxsIGJvb2wpIChlcSBib29s IHQpKSkKCjs7OyBHZXQvU2V0IHNsb3RzIGluIGFuIG9iamVjdC4KOzsKKGRlZm1hY3JvIG9yZWYg KG9iaiBmaWVsZCkKICAiUmV0cmlldmUgdGhlIHZhbHVlIHN0b3JlZCBpbiBPQkogaW4gdGhlIHNs b3QgbmFtZWQgYnkgRklFTEQuCkZpZWxkIGlzIHRoZSBuYW1lIG9mIHRoZSBzbG90IHdoZW4gY3Jl YXRlZCBieSBgZGVmY2xhc3MnIG9yIHRoZSBsYWJlbApjcmVhdGVkIGJ5IHRoZSA6aW5pdGFyZyB0 YWcuIgogIGAoZWllaW8tb3JlZiAsb2JqIChxdW90ZSAsZmllbGQpKSkKCihkZWZ1biBlaWVpby1v cmVmIChvYmogZmllbGQpCiAgIlJldHVybiB0aGUgdmFsdWUgaW4gT0JKIGF0IEZJRUxEIGluIHRo ZSBvYmplY3QgdmVjdG9yLiIKICAoaWYgKG5vdCAob3IgKG9iamVjdC1wIG9iaikgKGNsYXNzLXAg b2JqKSkpCiAgICAgIChzaWduYWwgJ3dyb25nLXR5cGUtYXJndW1lbnQgKGxpc3QgJyhvciBvYmpl Y3QtcCBjbGFzcy1wKSBvYmopKSkKICAoaWYgKG5vdCAoc3ltYm9scCBmaWVsZCkpCiAgICAgIChz aWduYWwgJ3dyb25nLXR5cGUtYXJndW1lbnQgKGxpc3QgJ3N5bWJvbHAgZmllbGQpKSkKICAobGV0 KiAoKGNsYXNzIChpZiAoY2xhc3MtcCBvYmopIG9iaiAoYXJlZiBvYmogb2JqZWN0LWNsYXNzKSkp CgkgKGMgKGVpZWlvLWZpZWxkLW5hbWUtaW5kZXggY2xhc3Mgb2JqIGZpZWxkKSkpCiAgICAoaWYg KG5vdCBjKQoJOzsgSXQgbWlnaHQgYmUgbWlzc2luZyBiZWNhdXNlIGl0IGlzIGEgOmNsYXNzIGFs bG9jYXRlZCBmaWVsZC4KCTs7IExldHMgY2hlY2sgdGhhdCBpbmZvIG91dC4KCShpZiAoc2V0cSBj IChlaWVpby1jbGFzcy1maWVsZC1uYW1lLWluZGV4IGNsYXNzIGZpZWxkKSkKCSAgICA7OyBPcmVm IHRoYXQgc2xvdC4KCSAgICAoYXJlZiAoYXJlZiAoY2xhc3MtdiBjbGFzcykgY2xhc3MtY2xhc3Mt YWxsb2NhdGlvbi12YWx1ZXMpIGMpCgkgIDs7IFRoZSBzbG90LW1pc3NpbmcgbWV0aG9kIGlzIGEg Y29vbCB3YXkgb2YgYWxsb3dpbmcgYW4gb2JqZWN0IGF1dGhvcgoJICA7OyB0byBpbnRlcmNlcHQg bWlzc2luZyBzbG90IGRlZmluaXRpb25zLiAgU2luY2UgaXQgaXMgYWxzbyB0aGUgTEFTVAoJICA7 OyB0aGluZyBjYWxsZWQgaW4gdGhpcyBmbiwgaXQncyByZXR1cm4gdmFsdWUgd291bGQgYmUgcmV0 cmlldmVkLgoJICAoc2xvdC1taXNzaW5nIG9iaiBmaWVsZCAnb3JlZikKCSAgOzsoc2lnbmFsICdp bnZhbGlkLXNsb3QtbmFtZSAobGlzdCAob2JqZWN0LW5hbWUgb2JqKSBmaWVsZCkpCgkgICkKICAg ICAgKGlmIChub3QgKG9iamVjdC1wIG9iaikpCgkgIChzaWduYWwgJ3dyb25nLXR5cGUtYXJndW1l bnQgKGxpc3QgJ29iamVjdC1wIG9iaikpKQogICAgICAoZWllaW8tYmFyZi1pZi1zbG90LXVuYm91 bmQgKGFyZWYgb2JqIGMpIG9iaiBmaWVsZCAnb3JlZikpKSkKCihkZWZhbGlhcyAnc2xvdC12YWx1 ZSAnZWllaW8tb3JlZikKKGRlZmFsaWFzICdzZXQtc2xvdC12YWx1ZSAnZWllaW8tb3NldCkKCjs7 IFRoaXMgYWxpYXMgaXMgbmVlZGVkIHNvIHRoYXQgZnVuY3Rpb25zIGNhbiBiZSB3cml0dGVuCjs7 IGZvciBkZWZhdWx0cywgYnV0IHN0aWxsIGJlaGF2ZSBsaWtlIGxhbWJkYXMuCihkZWZtYWNybyBs YW1iZGEtZGVmYXVsdCAoJnJlc3QgY2RyKQogICJUaGUgc2FtZSBhcyBgbGFtYmRhJyBidXQgaXMg dXNlZCBhcyBhIGRlZmF1bHQgdmFsdWUgaW4gYGRlZmNsYXNzJy4KQXMgc3VjaCwgdGhlIGZvcm0g KGxhbWJkYS1kZWZhdWx0IEFSR1MgRE9DU1RSSU5HIElOVEVSQUNUSVZFIEJPRFkpIGlzCnNlbGYg cXVvdGluZy4gIFRoaXMgbWFjcm8gaXMgbWVhbnQgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcXVv dGluZwpsYW1iZGEgZXhwcmVzc2lvbnMgaW50byBjbGFzcyBkZWZhdWx0cy4gIEFueSBgbGFtYmRh LWRlZmF1bHQnCmV4cHJlc3Npb24gaXMgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCBpbnRvIGEg YGxhbWJkYScgZXhwcmVzc2lvbgp3aGVuIGNvcGllZCBmcm9tIHRoZSBkZWZhdWx0cyBpbnRvIGEg bmV3IG9iamVjdC4gIFRoZSB1c2Ugb2YKYG9yZWYtZGVmYXVsdCcsIGhvd2V2ZXIsIHdpbGwgcmV0 dXJuIGEgYGxhbWJkYS1kZWZhdWx0JyBleHByZXNzaW9uLgpDRFIgaXMgZnVuY3Rpb24gZGVmaW5p dGlvbiBhbmQgYm9keS4iCiAgOzsgVGhpcyBkZWZpbml0aW9uIGlzIGNvcGllZCBkaXJlY3RseSBm cm9tIHN1YnIuZWwgZm9yIGxhbWJkYQogIChsaXN0ICdmdW5jdGlvbiAoY29ucyAnbGFtYmRhLWRl ZmF1bHQgY2RyKSkpCgoocHV0ICdsYW1iZGEtZGVmYXVsdCAnbGlzcC1pbmRlbnQtZnVuY3Rpb24g J2RlZnVuKQoocHV0ICdsYW1iZGEtZGVmYXVsdCAnYnl0ZS1jb21waWxlICdieXRlLWNvbXBpbGUt bGFtYmRhLWZvcm0pCgooZGVmbWFjcm8gb3JlZi1kZWZhdWx0IChvYmogZmllbGQpCiAgIkdldHMg dGhlIGRlZmF1bHQgdmFsdWUgb2YgT0JKIChtYXliZSBhIGNsYXNzKSBmb3IgRklFTEQuClRoZSBk ZWZhdWx0IHZhbHVlIGlzIHRoZSB2YWx1ZSBpbnN0YWxsZWQgaW4gYSBjbGFzcyB3aXRoIHRoZSA6 aW5pdGZvcm0KdGFnLiAgRklFTEQgY2FuIGJlIHRoZSBzbG90IG5hbWUsIG9yIHRoZSB0YWcgc3Bl Y2lmaWVkIGJ5IHRoZSA6aW5pdGFyZwp0YWcgaW4gdGhlIGBkZWZjbGFzcycgY2FsbC4iCiAgYChl aWVpby1vcmVmLWRlZmF1bHQgLG9iaiAocXVvdGUgLGZpZWxkKSkpCgooZGVmdW4gZWllaW8tb3Jl Zi1kZWZhdWx0IChvYmogZmllbGQpCiAgIkRvZXMgdGhlIHdvcmsgZm9yIHRoZSBtYWNybyBgb3Jl Zi1kZWZhdWx0JyB3aXRoIHNpbWlsYXIgcGFyYW1ldGVycy4KRmlsbHMgaW4gT0JKJ3MgRklFTEQg d2l0aCBpdCdzIGRlZmF1bHQgdmFsdWUuIgogIChpZiAobm90IChvciAob2JqZWN0LXAgb2JqKSAo Y2xhc3MtcCBvYmopKSkgKHNpZ25hbCAnd3JvbmctdHlwZS1hcmd1bWVudCAobGlzdCAnb2JqZWN0 LXAgb2JqKSkpCiAgKGlmIChub3QgKHN5bWJvbHAgZmllbGQpKSAoc2lnbmFsICd3cm9uZy10eXBl LWFyZ3VtZW50IChsaXN0ICdzeW1ib2xwIGZpZWxkKSkpCiAgKGxldCogKChjbCAoaWYgKG9iamVj dC1wIG9iaikgKGFyZWYgb2JqIG9iamVjdC1jbGFzcykgb2JqKSkKCSAoYyAoZWllaW8tZmllbGQt bmFtZS1pbmRleCBjbCBvYmogZmllbGQpKSkKICAgIChpZiAobm90IGMpCgk7OyBJdCBtaWdodCBi ZSBtaXNzaW5nIGJlY2F1c2UgaXQgaXMgYSA6Y2xhc3MgYWxsb2NhdGVkIGZpZWxkLgoJOzsgTGV0 cyBjaGVjayB0aGF0IGluZm8gb3V0LgoJKGlmIChzZXRxIGMKCQkgIChlaWVpby1jbGFzcy1maWVs ZC1uYW1lLWluZGV4IGNsIGZpZWxkKSkKCSAgICA7OyBPcmVmIHRoYXQgc2xvdC4KCSAgICAoYXJl ZiAoYXJlZiAoY2xhc3MtdiBjbCkgY2xhc3MtY2xhc3MtYWxsb2NhdGlvbi12YWx1ZXMpCgkJICBj KQoJICAoc2xvdC1taXNzaW5nIG9iaiBmaWVsZCAnb3JlZi1kZWZhdWx0KQoJICA7OyhzaWduYWwg J2ludmFsaWQtc2xvdC1uYW1lIChsaXN0IChjbGFzcy1uYW1lIGNsKSBmaWVsZCkpCgkgICkKICAg ICAgKGVpZWlvLWJhcmYtaWYtc2xvdC11bmJvdW5kCiAgICAgICAobGV0ICgodmFsIChudGggKC0g YyAzKSAoYXJlZiAoY2xhc3MtdiBjbCkgY2xhc3MtcHVibGljLWQpKSkpCgkgKGVpZWlvLWRlZmF1 bHQtZXZhbC1tYXliZSB2YWwpKQogICAgICAgb2JqIGNsICdvcmVmLWRlZmF1bHQpKSkpCgooZGVm dW4gZWllaW8tZGVmYXVsdC1ldmFsLW1heWJlICh2YWwpCiAgIkNoZWNrIFZBTCwgYW5kIHJldHVy biB3aGF0IGBvcmVmLWRlZmF1bHQnIHdvdWxkIHByb3ZpZGUuIgogIDs7IGNoZWNrIGZvciBmdW5j dGlvbnMgdG8gZXZhbHVhdGUKICAoaWYgKGFuZCAobGlzdHAgdmFsKSAoZXF1YWwgKGNhciB2YWwp ICdsYW1iZGEpKQogICAgICAoZnVuY2FsbCB2YWwpCiAgICA7OyBjaGVjayBmb3IgcXVvdGVkIHRo aW5ncywgYW5kIHVucXVvdGUgdGhlbQogICAgKGlmIChhbmQgKGxpc3RwIHZhbCkgKGVxIChjYXIg dmFsKSAncXVvdGUpKQoJKGNhciAoY2RyIHZhbCkpCiAgICAgIDs7IHJldHVybiBpdCB2ZXJiYXRp bQogICAgICAoaWYgKGFuZCAobGlzdHAgdmFsKSAoZXEgKGNhciB2YWwpICdsYW1iZGEtZGVmYXVs dCkpCgkgIChsZXQgKChzIChjb3B5LXNlcXVlbmNlIHZhbCkpKQoJICAgIChzZXRjYXIgcyAnbGFt YmRhKQoJICAgIHMpCgl2YWwpKSkpCgo7OzsgT2JqZWN0IFNldCBtYWNyb3MKOzsKKGRlZm1hY3Jv IG9zZXQgKG9iaiBmaWVsZCB2YWx1ZSkKICAiU2V0IHRoZSB2YWx1ZSBpbiBPQkogZm9yIHNsb3Qg RklFTEQgdG8gVkFMVUUuCkZJRUxEIGlzIHRoZSBzbG90IG5hbWUgYXMgc3BlY2lmaWVkIGluIGBk ZWZjbGFzcycgb3IgdGhlIHRhZyBjcmVhdGVkCndpdGggaW4gdGhlIDppbml0YXJnIHNsb3QuICBW QUxVRSBjYW4gYmUgYW55IExpc3Agb2JqZWN0LiIKICBgKGVpZWlvLW9zZXQgLG9iaiAocXVvdGUg LGZpZWxkKSAsdmFsdWUpKQoKKGRlZnVuIGVpZWlvLW9zZXQgKG9iaiBmaWVsZCB2YWx1ZSkKICAi RG9lcyB0aGUgd29yayBmb3IgdGhlIG1hY3JvIGBvc2V0Jy4KRmlsbHMgaW4gT0JKJ3MgRklFTEQg d2l0aCBWQUxVRS4iCiAgKGlmIChub3QgKG9iamVjdC1wIG9iaikpIChzaWduYWwgJ3dyb25nLXR5 cGUtYXJndW1lbnQgKGxpc3QgJ29iamVjdC1wIG9iaikpKQogIChpZiAobm90IChzeW1ib2xwIGZp ZWxkKSkgKHNpZ25hbCAnd3JvbmctdHlwZS1hcmd1bWVudCAobGlzdCAnc3ltYm9scCBmaWVsZCkp KQogIChsZXQgKChjIChlaWVpby1maWVsZC1uYW1lLWluZGV4IChvYmplY3QtY2xhc3MtZmFzdCBv YmopIG9iaiBmaWVsZCkpKQogICAgKGlmIChub3QgYykKCTs7IEl0IG1pZ2h0IGJlIG1pc3Npbmcg YmVjYXVzZSBpdCBpcyBhIDpjbGFzcyBhbGxvY2F0ZWQgZmllbGQuCgk7OyBMZXRzIGNoZWNrIHRo YXQgaW5mbyBvdXQuCgkoaWYgKHNldHEgYwoJCSAgKGVpZWlvLWNsYXNzLWZpZWxkLW5hbWUtaW5k ZXggKGFyZWYgb2JqIG9iamVjdC1jbGFzcykgZmllbGQpKQoJICAgIDs7IE9zZXQgdGhhdCBzbG90 LgoJICAgIChwcm9nbgoJICAgICAgKGVpZWlvLXZhbGlkYXRlLWNsYXNzLXNsb3QtdmFsdWUgKG9i amVjdC1jbGFzcy1mYXN0IG9iaikgYyB2YWx1ZSBmaWVsZCkKCSAgICAgIChhc2V0IChhcmVmIChj bGFzcy12IChhcmVmIG9iaiBvYmplY3QtY2xhc3MpKQoJCQkgIGNsYXNzLWNsYXNzLWFsbG9jYXRp b24tdmFsdWVzKQoJCSAgICBjIHZhbHVlKSkKCSAgOzsgU2VlIG9yZWYgZm9yIGNvbW1lbnQgb24g YHNsb3QtbWlzc2luZycKCSAgKHNsb3QtbWlzc2luZyBvYmogZmllbGQgJ29zZXQgdmFsdWUpCgkg IDs7KHNpZ25hbCAnaW52YWxpZC1zbG90LW5hbWUgKGxpc3QgKG9iamVjdC1uYW1lIG9iaikgZmll bGQpKQoJICApCiAgICAgIChlaWVpby12YWxpZGF0ZS1zbG90LXZhbHVlIChvYmplY3QtY2xhc3Mt ZmFzdCBvYmopIGMgdmFsdWUgZmllbGQpCiAgICAgIChhc2V0IG9iaiBjIHZhbHVlKSkpKQoKKGRl Zm1hY3JvIG9zZXQtZGVmYXVsdCAoY2xhc3MgZmllbGQgdmFsdWUpCiAgIlNldCB0aGUgZGVmYXVs dCBzbG90IGluIENMQVNTIGZvciBGSUVMRCB0byBWQUxVRS4KVGhlIGRlZmF1bHQgdmFsdWUgaXMg dXN1YWxseSBzZXQgd2l0aCB0aGUgOmluaXRmb3JtIHRhZyBkdXJpbmcgY2xhc3MKY3JlYXRpb24u ICBUaGlzIGFsbG93cyB1c2VycyB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgY2xh c3NlcwphZnRlciB0aGV5IGFyZSBjcmVhdGVkLiIKICBgKGVpZWlvLW9zZXQtZGVmYXVsdCAsY2xh c3MgKHF1b3RlICxmaWVsZCkgLHZhbHVlKSkKCihkZWZ1biBlaWVpby1vc2V0LWRlZmF1bHQgKGNs YXNzIGZpZWxkIHZhbHVlKQogICJEb2VzIHRoZSB3b3JrIGZvciB0aGUgbWFjcm8gYG9zZXQtZGVm YXVsdCcuCkZpbGxzIGluIHRoZSBkZWZhdWx0IHZhbHVlIGluIENMQVNTJyBpbiBGSUVMRCB3aXRo IFZBTFVFLiIKICAoaWYgKG5vdCAoY2xhc3MtcCBjbGFzcykpIChzaWduYWwgJ3dyb25nLXR5cGUt YXJndW1lbnQgKGxpc3QgJ2NsYXNzLXAgY2xhc3MpKSkKICAoaWYgKG5vdCAoc3ltYm9scCBmaWVs ZCkpIChzaWduYWwgJ3dyb25nLXR5cGUtYXJndW1lbnQgKGxpc3QgJ3N5bWJvbHAgZmllbGQpKSkK ICAobGV0KiAoKHNjb3BlZC1jbGFzcyBjbGFzcykKCSAoYyAoZWllaW8tZmllbGQtbmFtZS1pbmRl eCBjbGFzcyBuaWwgZmllbGQpKSkKICAgIChpZiAobm90IGMpCgk7OyBJdCBtaWdodCBiZSBtaXNz aW5nIGJlY2F1c2UgaXQgaXMgYSA6Y2xhc3MgYWxsb2NhdGVkIGZpZWxkLgoJOzsgTGV0cyBjaGVj ayB0aGF0IGluZm8gb3V0LgoJKGlmIChzZXRxIGMgKGVpZWlvLWNsYXNzLWZpZWxkLW5hbWUtaW5k ZXggY2xhc3MgZmllbGQpKQoJICAgIChwcm9nbgoJICAgICAgOzsgT3JlZiB0aGF0IHNsb3QuCgkg ICAgICAoZWllaW8tdmFsaWRhdGUtY2xhc3Mtc2xvdC12YWx1ZSBjbGFzcyBjIHZhbHVlIGZpZWxk KQoJICAgICAgKGFzZXQgKGFyZWYgKGNsYXNzLXYgY2xhc3MpIGNsYXNzLWNsYXNzLWFsbG9jYXRp b24tdmFsdWVzKSBjCgkJICAgIHZhbHVlKSkKCSAgKHNpZ25hbCAnaW52YWxpZC1zbG90LW5hbWUg KGxpc3QgKGNsYXNzLW5hbWUgY2xhc3MpIGZpZWxkKSkpCiAgICAgIChlaWVpby12YWxpZGF0ZS1z bG90LXZhbHVlIGNsYXNzIGMgdmFsdWUgZmllbGQpCiAgICAgIDs7IFNldCB0aGlzIGludG8gdGhl IHN0b3JhZ2UgZm9yIGRlZmF1bHRzLgogICAgICAoc2V0Y2FyIChudGhjZHIgKC0gYyAzKSAoYXJl ZiAoY2xhc3MtdiBjbGFzcykgY2xhc3MtcHVibGljLWQpKQoJICAgICAgdmFsdWUpCiAgICAgIDs7 IFRha2UgdGhlIHZhbHVlLCBhbmQgcHV0IGl0IGludG8gb3VyIGNhY2hlIG9iamVjdC4KICAgICAg KGVpZWlvLW9zZXQgKGFyZWYgKGNsYXNzLXYgY2xhc3MpIGNsYXNzLWRlZmF1bHQtb2JqZWN0LWNh Y2hlKQoJCSAgZmllbGQgdmFsdWUpCiAgICAgICkpKQoKOzs7IEhhbmR5IENMT1MgbWFjcm9zCjs7 CihkZWZtYWNybyB3aXRoLXNsb3RzIChzcGVjLWxpc3Qgb2JqZWN0ICZyZXN0IGJvZHkpCiAgIlRo ZSBtYWNybyB3aXRoLXNsb3RzIGVzdGFibGlzaGVzIGEgbGV4aWNhbCBlbnZpcm9ubWVudCBmb3IK cmVmZXJyaW5nIHRvIHRoZSBzbG90cyBpbiB0aGUgaW5zdGFuY2UgbmFtZWQgYnkgdGhlIGdpdmVu CnNsb3QtbmFtZXMgYXMgdGhvdWdoIHRoZXkgd2VyZSB2YXJpYWJsZXMuIFdpdGhpbiBzdWNoIGEg Y29udGV4dAp0aGUgdmFsdWUgb2YgdGhlIHNsb3QgY2FuIGJlIHNwZWNpZmllZCBieSB1c2luZyBp dHMgc2xvdCBuYW1lLAphcyBpZiBpdCB3ZXJlIGEgbGV4aWNhbGx5IGJvdW5kIHZhcmlhYmxlLiBC b3RoIHNldGYgYW5kIHNldHEKY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgc2xv dC4iCiAgOzsgVHJhbnNmb3JtIHRoZSBzcGVjLWxpc3QgaW50byBhIHN5bWJvbC1tYWNyb2xldCBz cGVjLWxpc3QuCiAgKGxldCAoKG1hcHBpbmdzIChtYXBjYXIgKGxhbWJkYSAoZW50cnkpCgkJCSAg ICAobGV0ICgodmFyICAoaWYgKGxpc3RwIGVudHJ5KSAoY2FyIGVudHJ5KSBlbnRyeSkpCgkJCQkg IChzbG90IChpZiAobGlzdHAgZW50cnkpIChjYWRyIGVudHJ5KSBlbnRyeSkpKQoJCQkgICAgICAo bGlzdCB2YXIgYChzbG90LXZhbHVlICxvYmplY3QgJyxzbG90KSkpKQoJCQkgIHNwZWMtbGlzdCkp KQogICAgKGFwcGVuZCAobGlzdCAnc3ltYm9sLW1hY3JvbGV0IG1hcHBpbmdzKQoJICAgIGJvZHkp KSkKKHB1dCAnd2l0aC1zbG90cyAnbGlzcC1pbmRlbnQtZnVuY3Rpb24gMikKCgwKOzs7IFNpbXBs ZSBnZW5lcmF0b3JzLCBhbmQgcXVlcnkgZnVuY3Rpb25zLiAgTm9uZSBvZiB0aGVzZSB3b3VsZCBk bwo7OyAgd2VsbCBlbWJlZGRlZCBpbnRvIGFuIG9iamVjdC4KOzsKKGRlZm1hY3JvIG9iamVjdC1j bGFzcy1mYXN0IChvYmopICJSZXR1cm4gdGhlIGNsYXNzIHN0cnVjdCBkZWZpbmluZyBPQkogd2l0 aCBubyBjaGVjay4iCiAgYChhcmVmICxvYmogb2JqZWN0LWNsYXNzKSkKICAKKGRlZnVuIGNsYXNz LW5hbWUgKGNsYXNzKSAiUmV0dXJuIGEgTGlzcCBsaWtlIHN5bWJvbCBuYW1lIGZvciBDTEFTUy4i CiAgKGlmIChub3QgKGNsYXNzLXAgY2xhc3MpKSAoc2lnbmFsICd3cm9uZy10eXBlLWFyZ3VtZW50 IChsaXN0ICdjbGFzcy1wIGNsYXNzKSkpCiAgOzsgSSB0aGluayB0aGlzIGlzIHN1cHBvc2VkIHRv IHJldHVybiBhIHN5bWJvbCwgYnV0IHRvIG1lIENMQVNTIGlzIGEgc3ltYm9sLAogIDs7IGFuZCBJ IHdhbnRlZCBhIHN0cmluZy4gIEFyZyEKICAoZm9ybWF0ICIjPGNsYXNzICVzPiIgKHN5bWJvbC1u YW1lIGNsYXNzKSkpCgooZGVmdW4gb2JqZWN0LW5hbWUgKG9iaiAmb3B0aW9uYWwgZXh0cmEpCiAg IlJldHVybiBhIExpc3AgbGlrZSBzeW1ib2wgc3RyaW5nIGZvciBvYmplY3QgT0JKLgpJZiBFWFRS QSwgaW5jbHVkZSB0aGF0IGluIHRoZSBzdHJpbmcgcmV0dXJuZWQgdG8gcmVwcmVzZW50IHRoZSBz eW1ib2wuIgogIChpZiAobm90IChvYmplY3QtcCBvYmopKSAoc2lnbmFsICd3cm9uZy10eXBlLWFy Z3VtZW50IChsaXN0ICdvYmplY3QtcCBvYmopKSkKICAoZm9ybWF0ICIjPCVzICVzJXM+IiAoc3lt Ym9sLW5hbWUgKG9iamVjdC1jbGFzcy1mYXN0IG9iaikpCgkgIChhcmVmIG9iaiBvYmplY3QtbmFt ZSkgKG9yIGV4dHJhICIiKSkpCgooZGVmdW4gb2JqZWN0LW5hbWUtc3RyaW5nIChvYmopICJSZXR1 cm4gYSBzdHJpbmcgd2hpY2ggaXMgT0JKJ3MgbmFtZS4iCiAgKGlmIChub3QgKG9iamVjdC1wIG9i aikpIChzaWduYWwgJ3dyb25nLXR5cGUtYXJndW1lbnQgKGxpc3QgJ29iamVjdC1wIG9iaikpKQog IChhcmVmIG9iaiBvYmplY3QtbmFtZSkpCgooZGVmdW4gb2JqZWN0LXNldC1uYW1lLXN0cmluZyAo b2JqIG5hbWUpICJTZXQgdGhlIHN0cmluZyB3aGljaCBpcyBPQkoncyBOQU1FLiIKICAoaWYgKG5v dCAob2JqZWN0LXAgb2JqKSkgKHNpZ25hbCAnd3JvbmctdHlwZS1hcmd1bWVudCAobGlzdCAnb2Jq ZWN0LXAgb2JqKSkpCiAgKGlmIChub3QgKHN0cmluZ3AgbmFtZSkpIChzaWduYWwgJ3dyb25nLXR5 cGUtYXJndW1lbnQgKGxpc3QgJ3N0cmluZ3AgbmFtZSkpKQogIChhc2V0IG9iaiBvYmplY3QtbmFt ZSBuYW1lKSkKCihkZWZ1biBvYmplY3QtY2xhc3MgKG9iaikgIlJldHVybiB0aGUgY2xhc3Mgc3Ry dWN0IGRlZmluaW5nIE9CSi4iCiAgKGlmIChub3QgKG9iamVjdC1wIG9iaikpIChzaWduYWwgJ3dy b25nLXR5cGUtYXJndW1lbnQgKGxpc3QgJ29iamVjdC1wIG9iaikpKQogIChvYmplY3QtY2xhc3Mt ZmFzdCBvYmopKQooZGVmYWxpYXMgJ2NsYXNzLW9mICdvYmplY3QtY2xhc3MpCgooZGVmdW4gb2Jq ZWN0LWNsYXNzLW5hbWUgKG9iaikgIlJldHVybiBhIExpc3AgbGlrZSBzeW1ib2wgbmFtZSBmb3Ig T0JKJ3MgY2xhc3MuIgogIChpZiAobm90IChvYmplY3QtcCBvYmopKSAoc2lnbmFsICd3cm9uZy10 eXBlLWFyZ3VtZW50IChsaXN0ICdvYmplY3QtcCBvYmopKSkKICAoY2xhc3MtbmFtZSAob2JqZWN0 LWNsYXNzLWZhc3Qgb2JqKSkpCgooZGVmbWFjcm8gY2xhc3MtcGFyZW50cy1mYXN0IChjbGFzcykg IlJldHVybiBwYXJlbnQgY2xhc3NlcyB0byBDTEFTUyB3aXRoIG5vIGNoZWNrLiIKICBgKGFyZWYg KGNsYXNzLXYgLGNsYXNzKSBjbGFzcy1wYXJlbnQpKQoKKGRlZnVuIGNsYXNzLXBhcmVudHMgKGNs YXNzKSAiUmV0dXJuIHBhcmVudCBjbGFzc2VzIHRvIENMQVNTLiAgKG92ZXJsb2FkIG9mIHZhcmlh YmxlKS4iCiAgKGlmIChub3QgKGNsYXNzLXAgY2xhc3MpKSAoc2lnbmFsICd3cm9uZy10eXBlLWFy Z3VtZW50IChsaXN0ICdjbGFzcy1wIGNsYXNzKSkpCiAgKGNsYXNzLXBhcmVudHMtZmFzdCBjbGFz cykpCgooZGVmbWFjcm8gY2xhc3MtY2hpbGRyZW4tZmFzdCAoY2xhc3MpICJSZXR1cm4gY2hpbGQg Y2xhc3NlcyB0byBDTEFTUyB3aXRoIG5vIGNoZWNrLiIKICBgKGFyZWYgKGNsYXNzLXYgLGNsYXNz KSBjbGFzcy1jaGlsZHJlbikpCgooZGVmdW4gY2xhc3MtY2hpbGRyZW4gKGNsYXNzKSAiUmV0dXJu IGNoaWxkIGNsYXNzc2VzIHRvIENMQVNTLiIKICAoaWYgKG5vdCAoY2xhc3MtcCBjbGFzcykpIChz aWduYWwgJ3dyb25nLXR5cGUtYXJndW1lbnQgKGxpc3QgJ2NsYXNzLXAgY2xhc3MpKSkKICAoY2xh c3MtY2hpbGRyZW4tZmFzdCBjbGFzcykpCgooZGVmbWFjcm8gY2xhc3MtcGFyZW50LWZhc3QgKGNs YXNzKSAiUmV0dXJuIGZpcnN0IHBhcmVudCBjbGFzcyB0byBDTEFTUyB3aXRoIG5vIGNoZWNrLiIK ICBgKGNhciAoY2xhc3MtcGFyZW50cy1mYXN0ICxjbGFzcykpKQoKKGRlZm1hY3JvIGNsYXNzLXBh cmVudCAoY2xhc3MpICJSZXR1cm4gZmlyc3QgcGFyZW50IGNsYXNzIHRvIENMQVNTLiAgKG92ZXJs b2FkIG9mIHZhcmlhYmxlKS4iCiAgYChjYXIgKGNsYXNzLXBhcmVudHMgLGNsYXNzKSkpCgooZGVm bWFjcm8gc2FtZS1jbGFzcy1mYXN0LXAgKG9iaiBjbGFzcykgIlJldHVybiB0IGlmIE9CSiBpcyBv ZiBjbGFzcy10eXBlIENMQVNTIHdpdGggbm8gZXJyb3IgY2hlY2tpbmcuIgogIGAoZXEgKGFyZWYg LG9iaiBvYmplY3QtY2xhc3MpICxjbGFzcykpCgooZGVmdW4gc2FtZS1jbGFzcy1wIChvYmogY2xh c3MpICJSZXR1cm4gdCBpZiBPQkogaXMgb2YgY2xhc3MtdHlwZSBDTEFTUy4iCiAgKGlmIChub3Qg KGNsYXNzLXAgY2xhc3MpKSAoc2lnbmFsICd3cm9uZy10eXBlLWFyZ3VtZW50IChsaXN0ICdjbGFz cy1wIGNsYXNzKSkpCiAgKGlmIChub3QgKG9iamVjdC1wIG9iaikpIChzaWduYWwgJ3dyb25nLXR5 cGUtYXJndW1lbnQgKGxpc3QgJ29iamVjdC1wIG9iaikpKQogIChzYW1lLWNsYXNzLWZhc3QtcCBv YmogY2xhc3MpKQoKKGRlZnVuIG9iamVjdC1vZi1jbGFzcy1wIChvYmogY2xhc3MpCiAgIlJldHVy biBub24tbmlsIGlmIE9CSiBpcyBhbiBpbnN0YW5jZSBvZiBDTEFTUyBvciBDTEFTUycgc3ViY2xh c3Nlcy4iCiAgKGlmIChub3QgKG9iamVjdC1wIG9iaikpIChzaWduYWwgJ3dyb25nLXR5cGUtYXJn dW1lbnQgKGxpc3QgJ29iamVjdC1wIG9iaikpKQogIDs7IGNsYXNzIHdpbGwgYmUgY2hlY2tlZCBv bmUgbGF5ZXIgZG93bgogIChjaGlsZC1vZi1jbGFzcy1wIChhcmVmIG9iaiBvYmplY3QtY2xhc3Mp IGNsYXNzKSkKOzsgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKGRlZmFsaWFzICdvYmotb2YtY2xh c3MtcCAnb2JqZWN0LW9mLWNsYXNzLXApCgooZGVmdW4gY2hpbGQtb2YtY2xhc3MtcCAoY2hpbGQg Y2xhc3MpCiAgIklmIENISUxEIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgQ0xBU1MuIgogIChpZiAo bm90IChjbGFzcy1wIGNsYXNzKSkgKHNpZ25hbCAnd3JvbmctdHlwZS1hcmd1bWVudCAobGlzdCAn Y2xhc3MtcCBjbGFzcykpKQogIChpZiAobm90IChjbGFzcy1wIGNoaWxkKSkgKHNpZ25hbCAnd3Jv bmctdHlwZS1hcmd1bWVudCAobGlzdCAnY2xhc3MtcCBjaGlsZCkpKQogIChsZXQgKChwIG5pbCkp CiAgICAod2hpbGUgKGFuZCBjaGlsZCAobm90IChlcSBjaGlsZCBjbGFzcykpKQogICAgICAoc2V0 cSBwIChhcHBlbmQgcCAoYXJlZiAoY2xhc3MtdiBjaGlsZCkgY2xhc3MtcGFyZW50KSkKCSAgICBj aGlsZCAoY2FyIHApCgkgICAgcCAoY2RyIHApKSkKICAgIChpZiBjaGlsZCB0KSkpCgooZGVmdW4g b2JqZWN0LXNsb3RzIChvYmopICJMaXN0IG9mIHNsb3RzIGF2YWlsYWJsZSBpbiBPQkouIgogIChp ZiAobm90IChvYmplY3QtcCBvYmopKSAoc2lnbmFsICd3cm9uZy10eXBlLWFyZ3VtZW50IChsaXN0 ICdvYmplY3QtcCBvYmopKSkKICAoYXJlZiAoY2xhc3MtdiAob2JqZWN0LWNsYXNzLWZhc3Qgb2Jq KSkgY2xhc3MtcHVibGljLWEpKQoKKGRlZnVuIGNsYXNzLXNsb3QtaW5pdGFyZyAoY2xhc3Mgc2xv dCkgIkZldGNoIGZyb20gQ0xBU1MsIFNMT1QncyA6aW5pdGFyZy4iCiAgKGlmIChub3QgKGNsYXNz LXAgY2xhc3MpKSAoc2lnbmFsICd3cm9uZy10eXBlLWFyZ3VtZW50IChsaXN0ICdjbGFzcy1wIGNs YXNzKSkpCiAgKGxldCAoKGlhIChhcmVmIChjbGFzcy12IGNsYXNzKSBjbGFzcy1pbml0YXJnLXR1 cGxlcykpCgkoZiBuaWwpKQogICAgKHdoaWxlIChhbmQgaWEgKG5vdCBmKSkKICAgICAgKGlmIChl cSAoY2RyIChjYXIgaWEpKSBzbG90KQoJICAoc2V0cSBmIChjYXIgKGNhciBpYSkpKSkKICAgICAg KHNldHEgaWEgKGNkciBpYSkpKQogICAgZikpCgo7OzsgQ0xPUyBxdWVyaWVzIGludG8gY2xhc3Nl cyBhbmQgc2xvdHMKOzsKKGRlZnVuIHNsb3QtYm91bmRwIChvYmplY3Qgc2xvdCkKICAiTm9uLW5p bCBpZiBPQkpFQ1QncyBTTE9UIGlzIGJvdW5kLgpTZXR0aW5nIGEgc2xvdCdzIHZhbHVlIG1ha2Vz IGl0IGJvdW5kLiAgQ2FsbGluZyBgc2xvdC1tYWtldW5ib3VuZCcgd2lsbAptYWtlIGEgc2xvdCB1 bmJvdW5kLgpPQkpFQ1QgY2FuIGJlIGFuIGluc3RhbmNlIG9yIGEgY2xhc3MuIgogIDs7IFNraXAg dHlwZWNoZWNraW5nIHdoaWxlIHJldHJpZXZpbmcgdGhpcyB2YWx1ZS4KICAobGV0ICgoZWllaW8t c2tpcC10eXBlY2hlY2sgdCkpCiAgICA7OyBSZXR1cm4gbmlsIGlmIHRoZSBtYWdpYyBzeW1ib2wg aXMgaW4gdGhlcmUuCiAgICAoaWYgKG9iamVjdC1wIG9iamVjdCkKCShpZiAoZXEgKGVpZWlvLW9y ZWYgb2JqZWN0IHNsb3QpIGVpZWlvLXVuYm91bmQpIG5pbCB0KQogICAgICAoaWYgKGNsYXNzLXAg b2JqZWN0KQoJICAoaWYgKGVxIChlaWVpby1vcmVmLWRlZmF1bHQgb2JqZWN0IHNsb3QpIGVpZWlv LXVuYm91bmQpIG5pbCB0KQoJKHNpZ25hbCAnd3JvbmctdHlwZS1hcmd1bWVudCAobGlzdCAnb2Jq ZWN0LXAgb2JqZWN0KSkpKSkpCgooZGVmdW4gc2xvdC1tYWtldW5ib3VuZCAob2JqZWN0IHNsb3Qp CiAgIkluIE9CSkVDVCwgbWFrZSBTTE9UIHVuYm91bmQuIgogIChlaWVpby1vc2V0IG9iamVjdCBz bG90IGVpZWlvLXVuYm91bmQpKQoKKGRlZnVuIHNsb3QtZXhpc3RzLXAgKG9iamVjdC1vci1jbGFz cyBzbG90KQogICJOb24tbmlsIGlmIE9CSkVDVC1PUi1DTEFTUyBoYXMgU0xPVC4iCiAgKGxldCAo KGN2IChjbGFzcy12IChjb25kICgob2JqZWN0LXAgb2JqZWN0LW9yLWNsYXNzKQoJCQkgICAgKG9i amVjdC1jbGFzcyBvYmplY3Qtb3ItY2xhc3MpKQoJCQkgICAoKGNsYXNzLXAgb2JqZWN0LW9yLWNs YXNzKQoJCQkgICAgb2JqZWN0LW9yLWNsYXNzKSkKCQkgICAgICkpKQogICAgKG9yIChtZW1xIHNs b3QgKGFyZWYgY3YgY2xhc3MtcHVibGljLWEpKQoJKG1lbXEgc2xvdCAoYXJlZiBjdiBjbGFzcy1j bGFzcy1hbGxvY2F0aW9uLWEpKSkKICAgICkpCgooZGVmdW4gZmluZC1jbGFzcyAoc3ltYm9sICZv cHRpb25hbCBlcnJvcnApCiAgIlJldHVybiB0aGUgY2xhc3MgdGhhdCBTWU1CT0wgcmVwcmVzZW50 cy4gKENMT1MgZnVuY3Rpb24pCklmIHRoZXJlIGlzIG5vIGNsYXNzLCBuaWwgaXMgcmV0dXJuZWQg aWYgRVJST1JQIGlzIG5pbC4iCiAgKGlmIChub3QgKGNsYXNzLXAgc3ltYm9sKSkKICAgICAgKGlm IGVycm9ycCAoc2lnbmFsICd3cm9uZy10eXBlLWFyZ3VtZW50IChsaXN0ICdjbGFzcy1wIHN5bWJv bCkpCgluaWwpCiAgICAoY2xhc3MtdiBzeW1ib2wpKSkKCjs7OyBTbGlnaHRseSBtb3JlIGNvbXBs ZXggdXRpbGl0eSBmdW5jdGlvbnMgZm9yIG9iamVjdHMKOzsKKGRlZnVuIG9iamVjdC1hc3NvYyAo a2V5IGZpZWxkIGxpc3QpCiAgIlJldHVybiBub24tbmlsIGlmIEtFWSBpcyBgZXF1YWwnIHRvIHRo ZSBGSUVMRCBvZiB0aGUgY2FyIG9mIG9iamVjdHMgaW4gTElTVC4KVGhlIHZhbHVlIGlzIGFjdHVh bGx5IHRoZSBlbGVtZW50IG9mIExJU1Qgd2hvc2UgZmllbGQgZXF1YWxzIEtFWS4iCiAgKGlmIChu b3QgKGxpc3RwIGxpc3QpKSAoc2lnbmFsICd3cm9uZy10eXBlLWFyZ3VtZW50IChsaXN0ICdsaXN0 cCBsaXN0KSkpCiAgKHdoaWxlIChhbmQgbGlzdCAobm90IChjb25kaXRpb24tY2FzZSBuaWwKCQkJ ICAgIDs7IFRoaXMgcHJldmVudHMgZXJyb3JzIGZvciBtaXNzaW5nIHNsb3RzLgoJCQkgICAgKGVx dWFsIGtleSAoZWllaW8tb3JlZiAoY2FyIGxpc3QpIGZpZWxkKSkKCQkJICAoZXJyb3IgbmlsKSkp KQogICAgKHNldHEgbGlzdCAoY2RyIGxpc3QpKSkKICAoY2FyIGxpc3QpKQoKKGRlZnVuIG9iamVj dC1hc3NvYy1saXN0IChmaWVsZCBsaXN0KQogICJSZXR1cm4gYW4gYXNzb2NpYXRpb24gbGlzdCB3 aXRoIHRoZSBjb250ZW50cyBvZiBGSUVMRCBhcyB0aGUga2V5IGVsZW1lbnQuCkxJU1QgbXVzdCBi ZSBhIGxpc3Qgb2Ygb2JqZWN0cyB3aXRoIEZJRUxEIGluIGl0LgpUaGlzIGlzIHVzZWZ1bCB3aGVu IHlvdSBuZWVkIHRvIGRvIGNvbXBsZXRpbmcgcmVhZCBvbiBhbiBvYmplY3QgZ3JvdXAuIgogIChp ZiAobm90IChsaXN0cCBsaXN0KSkgKHNpZ25hbCAnd3JvbmctdHlwZS1hcmd1bWVudCAobGlzdCAn bGlzdHAgbGlzdCkpKQogIChsZXQgKChhc3NvY2xpc3QgbmlsKSkKICAgICh3aGlsZSBsaXN0CiAg ICAgIChzZXRxIGFzc29jbGlzdCAoY29ucyAoY29ucyAoZWllaW8tb3JlZiAoY2FyIGxpc3QpIGZp ZWxkKQoJCQkJICAoY2FyIGxpc3QpKQoJCQkgICAgYXNzb2NsaXN0KSkKICAgICAgKHNldHEgbGlz dCAoY2RyIGxpc3QpKSkKICAgIChucmV2ZXJzZSBhc3NvY2xpc3QpKSkKCihkZWZ1biBvYmplY3Qt YXNzb2MtbGlzdC1zYWZlIChmaWVsZCBsaXN0KQogICJSZXR1cm4gYW4gYXNzb2NpYXRpb24gbGlz dCB3aXRoIHRoZSBjb250ZW50cyBvZiBGSUVMRCBhcyB0aGUga2V5IGVsZW1lbnQuCkxJU1QgbXVz dCBiZSBhIGxpc3Qgb2Ygb2JqZWN0cywgYnV0IHRob3NlIG9iamVjdHMgZG8gbm90IG5lZWQgdG8g aGF2ZQpGSUVMRCBpbiBpdC4gIElmIGl0IGRvZXMgbm90LCB0aGVuIHRoYXQgZWxlbWVudCBpcyBs ZWZ0IG91dCBvZiB0aGUgYXNzb2NpYXRpb24KbGlzdC4iCiAgKGlmIChub3QgKGxpc3RwIGxpc3Qp KSAoc2lnbmFsICd3cm9uZy10eXBlLWFyZ3VtZW50IChsaXN0ICdsaXN0cCBsaXN0KSkpCiAgKGxl dCAoKGFzc29jbGlzdCBuaWwpKQogICAgKHdoaWxlIGxpc3QKICAgICAgKGlmIChzbG90LWV4aXN0 cy1wIChjYXIgbGlzdCkgZmllbGQpCgkgIChzZXRxIGFzc29jbGlzdCAoY29ucyAoY29ucyAoZWll aW8tb3JlZiAoY2FyIGxpc3QpIGZpZWxkKQoJCQkJICAgICAgKGNhciBsaXN0KSkKCQkJCWFzc29j bGlzdCkpKQogICAgICAoc2V0cSBsaXN0IChjZHIgbGlzdCkpKQogICAgKG5yZXZlcnNlIGFzc29j bGlzdCkpKQoKKGRlZnVuIG9iamVjdC1hZGQtdG8tbGlzdCAob2JqZWN0IHNsb3QgaXRlbSAmb3B0 aW9uYWwgYXBwZW5kKQogICJJbiBPQkpFQ1QncyBTTE9ULCBhZGQgSVRFTSB0byB0aGUgcHJlLWV4 aXN0aW5nIGxpc3Qgb2YgZWxlbWVudHMuCk9wdGlvbmFsIGFyZ3VtZW50IEFQUEVORCBpbmRpY2F0 ZXMgd2UgbmVlZCB0byBhcHBlbmQgdG8gdGhlIGxpc3QuCklmIElURU0gYWxyZWFkeSBleGlzdHMg aW4gdGhlIGxpc3QgaW4gU0xPVCwgdGhlbiBpdCBpcyBub3QgYWRkZWQuCkNvbXBhcmlzb24gaXMg ZG9uZSB3aXRoIGBlcXVhbCcgdGhyb3VnaCB0aGUgYG1lbWJlcicgZnVuY3Rpb24gY2FsbC4KSWYg U0xPVCBpcyB1bmJvdW5kLCBiaW5kIGl0IHRvIHRoZSBsaXN0IGNvbnRhaW5pbmcgSVRFTS4iCiAg KGxldCAob3YpCiAgICA7OyBGaW5kIHRoZSBvcmlnaW5hdGluZyBsaXN0LgogICAgKGlmIChub3Qg KHNsb3QtYm91bmRwIG9iamVjdCBzbG90KSkKCShzZXRxIG92IChsaXN0IGl0ZW0pKQogICAgICAo c2V0cSBvdiAoZWllaW8tb3JlZiBvYmplY3Qgc2xvdCkpCiAgICAgIDs7IHR1cm4gaXQgaW50byBh IGxpc3QuCiAgICAgICh1bmxlc3MgKGxpc3RwIG92KQoJKHNldHEgb3YgKGxpc3Qgb3YpKSkKICAg ICAgOzsgRG8gdGhlIGNvbWJpbmF0aW9uCiAgICAgIChpZiAobm90IChtZW1iZXIgaXRlbSBvdikp CgkgIChzZXRxIG92CgkJKGlmIGFwcGVuZAoJCSAgICAoYXBwZW5kIG92IChsaXN0IGl0ZW0pKQoJ CSAgKGNvbnMgaXRlbSBvdikpKSkpCiAgICA7OyBTZXQgYmFjayBpbnRvIHRoZSBzbG90LgogICAg KGVpZWlvLW9zZXQgb2JqZWN0IHNsb3Qgb3YpKSkKCihkZWZ1biBvYmplY3QtcmVtb3ZlLWZyb20t bGlzdCAob2JqZWN0IHNsb3QgaXRlbSkKICAiSW4gT0JKRUNUJ3MgU0xPVCwgcmVtb3ZlIG9jY3Vy cmVuY2VzIElURU0uCklmIElURU0gYWxyZWFkeSBleGlzdHMgaW4gdGhlIGxpc3QgaW4gU0xPVCwg dGhlbiBpdCBpcyBub3QgYWRkZWQuCkNvbXBhcmlzb24gaXMgZG9uZSB3aXRoIGBlcXVhbCcgdGhy b3VnaCB0aGUgYGRlbGV0ZScgZnVuY3Rpb24gY2FsbC4KSWYgU0xPVCBpcyB1bmJvdW5kLCBkbyBu b3RoaW5nLiIKICAoaWYgKG5vdCAoc2xvdC1ib3VuZHAgb2JqZWN0IHNsb3QpKQogICAgICBuaWwK ICAgIChlaWVpby1vc2V0IG9iamVjdCBzbG90IChkZWxldGUgaXRlbSAoZWllaW8tb3JlZiBvYmpl Y3Qgc2xvdCkpKSkpCgwKOzs7IEVJRUlPIGludGVybmFsIHNlYXJjaCBmdW5jdGlvbnMKOzsKKGRl ZnVuIGVpZWlvLWZpZWxkLW9yaWdpbmF0aW5nLWNsYXNzLXAgKHN0YXJ0LWNsYXNzIGZpZWxkKQog ICJSZXR1cm4gTm9uLW5pbCBpZiBTVEFSVC1DTEFTUyBpcyB0aGUgZmlyc3QgY2xhc3MgdG8gZGVm aW5lIEZJRUxELgpUaGlzIGlzIGZvciB0ZXN0aW5nIGlmIGBzY29wZWQtY2xhc3MnIGlzIHRoZSBj bGFzcyB0aGF0IGRlZmluZXMgRklFTEQKc28gdGhhdCB3ZSBjYW4gcHJvdGVjdCBwcml2YXRlIHNs b3RzLiIKICAobGV0ICgocGFyIChjbGFzcy1wYXJlbnRzIHN0YXJ0LWNsYXNzKSkKCShyZXQgdCkp CiAgICAoaWYgKG5vdCBwYXIpCgl0CiAgICAgICh3aGlsZSAoYW5kIHBhciByZXQpCgkoaWYgKGlu dGVybi1zb2Z0IChzeW1ib2wtbmFtZSBmaWVsZCkKCQkJIChhcmVmIChjbGFzcy12IChjYXIgcGFy KSkKCQkJICAgICAgIGNsYXNzLXN5bWJvbC1vYmFycmF5KSkKCSAgICAoc2V0cSByZXQgbmlsKSkK CShzZXRxIHBhciAoY2RyIHBhcikpKQogICAgICByZXQpKSkKCihkZWZ1biBlaWVpby1maWVsZC1u YW1lLWluZGV4IChjbGFzcyBvYmogZmllbGQpCiAgIkluIENMQVNTIGZvciBPQkogZmluZCB0aGUg aW5kZXggb2YgdGhlIG5hbWVkIEZJRUxELgpUaGUgZmllbGQgaXMgYSBzeW1ib2wgd2hpY2ggaXMg aW5zdGFsbGVkIGluIENMQVNTIGJ5IHRoZSBgZGVmY2xhc3MnCmNhbGwuICBPQkogY2FuIGJlIG5p bCwgYnV0IGlmIGl0IGlzIGFuIG9iamVjdCwgYW5kIHRoZSBzbG90IGluIHF1ZXN0aW9uCmlzIHBy b3RlY3RlZCwgYWNjZXNzIHdpbGwgYmUgYWxsb3dlZCBpZiBvYmogaXMgYSBjaGlsZCBvZiB0aGUg Y3VycmVudGx5CmBzY29wZWQtY2xhc3MnLgpJZiBGSUVMRCBpcyB0aGUgdmFsdWUgY3JlYXRlZCB3 aXRoIDppbml0YXJnIGluc3RlYWQsCnJldmVyc2UtbG9va3VwIHRoYXQgbmFtZSwgYW5kIHJlY3Vy c2Ugd2l0aCB0aGUgYXNzb2NpYXRlZCBzbG90IHZhbHVlLiIKICA7OyBSZW1vdmVkIGNoZWNrcyB0 byBvdXRzaWRlIHRoaXMgY2FsbAogIChsZXQqICgoZnN5bSAoaW50ZXJuLXNvZnQgKHN5bWJvbC1u YW1lIGZpZWxkKQoJCQkgICAgKGFyZWYgKGNsYXNzLXYgY2xhc3MpCgkJCQkgIGNsYXNzLXN5bWJv bC1vYmFycmF5KSkpCgkgKGZzaSAoaWYgKHN5bWJvbHAgZnN5bSkgKHN5bWJvbC12YWx1ZSBmc3lt KSBuaWwpKSkKICAgIChpZiAoaW50ZWdlcnAgZnNpKQoJKGNvbmQKCSAoKG5vdCAoZ2V0IGZzeW0g J3Byb3RlY3Rpb24pKQoJICAoKyAzIGZzaSkpCgkgKChhbmQgKGVxIChnZXQgZnN5bSAncHJvdGVj dGlvbikgJ3Byb3RlY3RlZCkKCSAgICAgICBzY29wZWQtY2xhc3MKCSAgICAgICAob3IgKGNoaWxk LW9mLWNsYXNzLXAgY2xhc3Mgc2NvcGVkLWNsYXNzKQoJCSAgIChhbmQgKG9iamVjdC1wIG9iaikK CQkJKGNoaWxkLW9mLWNsYXNzLXAgY2xhc3MgKG9iamVjdC1jbGFzcyBvYmopKSkpKQoJICAoKyAz IGZzaSkpCgkgKChhbmQgKGVxIChnZXQgZnN5bSAncHJvdGVjdGlvbikgJ3ByaXZhdGUpCgkgICAg ICAgKG9yIChhbmQgc2NvcGVkLWNsYXNzCgkJCShlaWVpby1maWVsZC1vcmlnaW5hdGluZy1jbGFz cy1wIHNjb3BlZC1jbGFzcyBmaWVsZCkpCgkJICAgZWllaW8taW5pdGlhbGl6aW5nLW9iamVjdCkp CgkgICgrIDMgZnNpKSkKCSAodCBuaWwpKQogICAgICAobGV0ICgoZm4gKGVpZWlvLWluaXRhcmct dG8tYXR0cmlidXRlIGNsYXNzIGZpZWxkKSkpCgkoaWYgZm4gKGVpZWlvLWZpZWxkLW5hbWUtaW5k ZXggY2xhc3Mgb2JqIGZuKSBuaWwpKSkpKQoKKGRlZnVuIGVpZWlvLWNsYXNzLWZpZWxkLW5hbWUt aW5kZXggKGNsYXNzIGZpZWxkKQogICJJbiBDTEFTUyBmaW5kIHRoZSBpbmRleCBvZiB0aGUgbmFt ZWQgRklFTEQuClRoZSBmaWVsZCBpcyBhIHN5bWJvbCB3aGljaCBpcyBpbnN0YWxsZWQgaW4gQ0xB U1MgYnkgdGhlIGBkZWZjbGFzcycKY2FsbC4gIElmIEZJRUxEIGlzIHRoZSB2YWx1ZSBjcmVhdGVk IHdpdGggOmluaXRhcmcgaW5zdGVhZCwKcmV2ZXJzZS1sb29rdXAgdGhhdCBuYW1lLCBhbmQgcmVj dXJzZSB3aXRoIHRoZSBhc3NvY2lhdGVkIHNsb3QgdmFsdWUuIgogIDs7IFRoaXMgd2lsbCBoYXBw ZW4gbGVzcyBvZnRlbiwgYW5kIHdpdGggZmV3ZXIgc2xvdHMuICBEbyB0aGlzIHRoZQogIDs7IHN0 b3JhZ2UgY2hlYXAgd2F5LgogIChsZXQqICgoYSAoYXJlZiAoY2xhc3MtdiBjbGFzcykgY2xhc3Mt Y2xhc3MtYWxsb2NhdGlvbi1hKSkKCSAobDEgKGxlbmd0aCBhKSkKCSAoYWYgKG1lbXEgZmllbGQg YSkpCgkgKGwyIChsZW5ndGggYWYpKSkKICAgIDs7IFNsb3QgIyBpcyBsZW5ndGggb2YgdGhlIHRv dGFsIGxpc3QsIG1pbnVzIHRoZSByZW1haW5pbmcgbGlzdCBvZgogICAgOzsgdGhlIGZvdW5kIHNs b3QuCiAgICAoaWYgYWYgKC0gbDEgbDIpKSkpCgwKOzs7IENMT1MgZ2VuZXJpY3MgaW50ZXJuYWwg ZnVuY3Rpb24gaGFuZGxpbmcKOzsKKGRlZnZhciBlaWVpby1nZW5lcmljLWNhbGwtbWV0aG9kbmFt ZSBuaWwKICAiV2hlbiB1c2luZyBgY2FsbC1uZXh0LW1ldGhvZCcsIHByb3ZpZGVzIGEgY29udGV4 dCBvbiBob3cgdG8gZG8gaXQuIikKKGRlZnZhciBlaWVpby1nZW5lcmljLWNhbGwtYXJnbHN0IG5p bAogICJXaGVuIHVzaW5nIGBjYWxsLW5leHQtbWV0aG9kJywgcHJvdmlkZXMgYSBjb250ZXh0IGZv ciBwYXJhbWV0ZXJzLiIpCihkZWZ2YXIgZWllaW8tZ2VuZXJpYy1jYWxsLWtleSBuaWwKICAiV2hl biB1c2luZyBgY2FsbC1uZXh0LW1ldGhvZCcsIHByb3ZpZGVzIGEgY29udGV4dCBmb3IgdGhlIGN1 cnJlbnQga2V5LgpLZXlzIGFyZSBhIG51bWJlciByZXByZXNlbnRpbmcgOkJFRk9SRSwgOlBSSU1B UlksIGFuZCA6QUZURVIgbWV0aG9kcy4iKQooZGVmdmFyIGVpZWlvLWdlbmVyaWMtY2FsbC1uZXh0 LW1ldGhvZC1saXN0IG5pbAogICJXaGVuIGV4ZWN1dGluZyBhIFBSSU1BUlkgb3IgU1RBVElDIG1l dGhvZCwgdHJhY2sgdGhlICduZXh0LW1ldGhvZCcuCkR1cmluZyBleGVjdXRpb25zLCB0aGUgbGlz dCBpcyBmaXJzdCBnZW5lcmF0ZWQsIHRoZW4gYXMgZWFjaCBuZXh0IG1ldGhvZAppcyBjYWxsZWQs IHRoZSBuZXh0IG1ldGhvZCBpcyBwb3BwZWQgb2ZmIHRoZSBzdGFjay4iKQoKKGRlZnVuIGVpZWlv LWdlbmVyaWMtY2FsbCAobWV0aG9kIGFyZ3MpCiAgIkNhbGwgTUVUSE9EIHdpdGggQVJHUy4KQVJH UyBwcm92aWRlcyB0aGUgY29udGV4dCBvbiB3aGljaCBpbXBsZW1lbnRhdGlvbiB0byB1c2UuClRo aXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gYSBnZW5lcmljIGZ1bmN0aW9uLiIKICA7OyBX ZSBtdXN0IGV4cGFuZCBvdXIgYXJndW1lbnRzIGZpcnN0IGFzIHRoZXkgYXJlIGFsd2F5cwogIDs7 IHBhc3NlZCBpbiBhcyBxdW90ZWQgc3ltYm9scwogIChsZXQgKChuZXdhcmdzIG5pbCkgKG1jbGFz cyBuaWwpICAobGFtYmRhcyBuaWwpICh0bGFtYmRhcyBuaWwpIChrZXlzIG5pbCkKCShlaWVpby1n ZW5lcmljLWNhbGwtbWV0aG9kbmFtZSBtZXRob2QpCgkoZWllaW8tZ2VuZXJpYy1jYWxsLWFyZ2xz dCBhcmdzKQoJKGZpcnN0YXJnIG5pbCkKCShwcmltYXJ5bWV0aG9kbGlzdCBuaWwpKQogICAgOzsg Z2V0IGEgY29weQogICAgKHNldHEgbmV3YXJncyBhcmdzCgkgIGZpcnN0YXJnIChjYXIgbmV3YXJn cykpCiAgICA7OyBJcyB0aGUgY2xhc3MgcGFzc2VkIGluIGF1dG9sb2FkZWQ/CiAgICA7OyBTaW5j ZSBjbGFzcyBuYW1lcyBhcmUgYWxzbyBjb25zdHJ1Y3RvcnMsIHRoZXkgY2FuIGJlIGF1dG9sb2Fk ZWQKICAgIDs7IHZpYSB0aGUgYXV0b2xvYWQgY29tbWFuZC4gIENoZWNrIGZvciB0aGlzLCBhbmQg bG9hZCB0aGVtIGluLgogICAgOzsgSXQncyBvayBpZiBpdCBkb2Vzbid0IHR1cm4gb3V0IHRvIGJl IGEgY2xhc3MuICBQcm9iYWJseSB3YW50IHRoYXQKICAgIDs7IGZ1bmN0aW9uIGxvYWRlZCBhbnl3 YXkuCiAgICAoaWYgKGFuZCAoc3ltYm9scCBmaXJzdGFyZykKCSAgICAgKGZib3VuZHAgZmlyc3Rh cmcpCgkgICAgIChsaXN0cCAoc3ltYm9sLWZ1bmN0aW9uIGZpcnN0YXJnKSkKCSAgICAgKGVxICdh dXRvbG9hZCAoY2FyIChzeW1ib2wtZnVuY3Rpb24gZmlyc3RhcmcpKSkpCgkobG9hZCAobnRoIDEg KHN5bWJvbC1mdW5jdGlvbiBmaXJzdGFyZykpKSkKICAgIDs7IGxvb2t1cCB0aGUgZm9ybXMgdG8g dXNlCiAgICAoY29uZCAoKG9iamVjdC1wIGZpcnN0YXJnKQoJICAgKHNldHEgbWNsYXNzIChvYmpl Y3QtY2xhc3MtZmFzdCBmaXJzdGFyZykpKQoJICAoKGNsYXNzLXAgZmlyc3RhcmcpCgkgICAoc2V0 cSBtY2xhc3MgZmlyc3RhcmcKCQkgKSkpCiAgICA7OyBOb3cgY3JlYXRlIGEgbGlzdCBpbiByZXZl cnNlIG9yZGVyIG9mIGFsbCB0aGUgY2FsbHMgd2UgaGF2ZQogICAgOzsgbWFrZSBpbiBvcmRlciB0 byBzdWNjZXNzZnVsbHkgZG8gdGhpcyByaWdodC4gIFJ1bGVzOgogICAgOzsgMSkgT25seSBjYWxs IGdlbmVyaWNzIGlmIHNjb3BlZC1jbGFzcyBpcyBub3QgZGVmaW5lZAogICAgOzsgICAgVGhpcyBw cmV2ZW50cyBtdWx0aXBsZSBjYWxscyBpbiB0aGUgY2FzZSBvZiByZWN1cnNpb24KICAgIDs7IDIp IE9ubHkgY2FsbCBzdGF0aWMgaWYgdGhpcyBpcyBhIHN0YXRpYyBtZXRob2QuCiAgICA7OyAzKSBP bmx5IGNhbGwgc3BlY2lmaWNzIGlmIHRoZSBkZWZpbml0aW9uIGFsbG93cyBmb3IgdGhlbS4KICAg IDs7IDQpIENhbGwgaW4gb3JkZXIgYmFzZWQgb24gOkJFRk9SRSwgOlBSSU1BUlksIGFuZCA6QUZU RVIKICAgICh3aGVuIChvYmplY3QtcCBmaXJzdGFyZykKICAgICAgOzsgTm9uLXN0YXRpYyBjYWxs cyBkbyBhbGwgdGhpcyBzdHVmZi4KCiAgICAgIDs7IDpBRlRFUiBtZXRob2RzCiAgICAgIChzZXRx IHRsYW1iZGFzCgkgICAgKGlmIG1jbGFzcwoJCShlaWVpb210LW1ldGhvZC1saXN0IG1ldGhvZCBt ZXRob2QtYWZ0ZXIgbWNsYXNzKQoJICAgICAgKGxpc3QgKGVpZWlvLWdlbmVyaWMtZm9ybSBtZXRo b2QgbWV0aG9kLWFmdGVyIG5pbCkpKQoJICAgIDs7KG9yIChhbmQgbWNsYXNzIChlaWVpby1nZW5l cmljLWZvcm0gbWV0aG9kIG1ldGhvZC1hZnRlciBtY2xhc3MpKQoJICAgIDs7CShlaWVpby1nZW5l cmljLWZvcm0gbWV0aG9kIG1ldGhvZC1hZnRlciBuaWwpKQoJICAgICkKICAgICAgKHNldHEgbGFt YmRhcyAoYXBwZW5kIHRsYW1iZGFzIGxhbWJkYXMpCgkgICAga2V5cyAoYXBwZW5kIChtYWtlLWxp c3QgKGxlbmd0aCB0bGFtYmRhcykgbWV0aG9kLWFmdGVyKSBrZXlzKSkKICAgICAgCiAgICAgIDs7 IDpQUklNQVJZIG1ldGhvZHMKICAgICAgKHNldHEgdGxhbWJkYXMKCSAgICAob3IgKGFuZCBtY2xh c3MgKGVpZWlvLWdlbmVyaWMtZm9ybSBtZXRob2QgbWV0aG9kLXByaW1hcnkgbWNsYXNzKSkKCQko ZWllaW8tZ2VuZXJpYy1mb3JtIG1ldGhvZCBtZXRob2QtcHJpbWFyeSBuaWwpKSkKICAgICAgKHdo ZW4gdGxhbWJkYXMKCShzZXRxIGxhbWJkYXMgKGNvbnMgdGxhbWJkYXMgbGFtYmRhcykKCSAgICAg IGtleXMgKGNvbnMgbWV0aG9kLXByaW1hcnkga2V5cykKCSAgICAgIHByaW1hcnltZXRob2RsaXN0 CgkgICAgICAoZWllaW9tdC1tZXRob2QtbGlzdCBtZXRob2QgbWV0aG9kLXByaW1hcnkgbWNsYXNz KSkpCgogICAgICA7OyA6QkVGT1JFIG1ldGhvZHMKICAgICAgKHNldHEgdGxhbWJkYXMKCSAgICAo aWYgbWNsYXNzCgkJKGVpZWlvbXQtbWV0aG9kLWxpc3QgbWV0aG9kIG1ldGhvZC1iZWZvcmUgbWNs YXNzKQoJICAgICAgKGxpc3QgKGVpZWlvLWdlbmVyaWMtZm9ybSBtZXRob2QgbWV0aG9kLWJlZm9y ZSBuaWwpKSkKCSAgICA7OyhvciAoYW5kIG1jbGFzcyAoZWllaW8tZ2VuZXJpYy1mb3JtIG1ldGhv ZCBtZXRob2QtYmVmb3JlIG1jbGFzcykpCgkgICAgOzsJKGVpZWlvLWdlbmVyaWMtZm9ybSBtZXRo b2QgbWV0aG9kLWJlZm9yZSBuaWwpKQoJICAgICkKICAgICAgKHNldHEgbGFtYmRhcyAoYXBwZW5k IHRsYW1iZGFzIGxhbWJkYXMpCgkgICAga2V5cyAoYXBwZW5kIChtYWtlLWxpc3QgKGxlbmd0aCB0 bGFtYmRhcykgbWV0aG9kLWJlZm9yZSkga2V5cykpCiAgICAgICkKCiAgICA7OyBJZiB0aGVyZSB3 ZXJlIG5vIG1ldGhvZHMgZm91bmQsIHRoZW4gdGhlcmUgY291bGQgYmUgOlNUQVRJQyBtZXRob2Rz LgogICAgKHdoZW4gKG5vdCBsYW1iZGFzKQogICAgICAoc2V0cSB0bGFtYmRhcwoJICAgIChlaWVp by1nZW5lcmljLWZvcm0gbWV0aG9kIG1ldGhvZC1zdGF0aWMgbWNsYXNzKSkKICAgICAgKHNldHEg bGFtYmRhcyAoY29ucyB0bGFtYmRhcyBsYW1iZGFzKQoJICAgIGtleXMgKGNvbnMgbWV0aG9kLXN0 YXRpYyBrZXlzKQoJICAgIHByaW1hcnltZXRob2RsaXN0ICA7OyBSZS11c2UgZXZlbiB3aXRoIGJh ZCBuYW1lIGhlcmUKCSAgICAoZWllaW9tdC1tZXRob2QtbGlzdCBtZXRob2QgbWV0aG9kLXN0YXRp YyBtY2xhc3MpKSkKCiAgICA7OyBOb3cgbG9vcCB0aHJvdWdoIGFsbCBvY2N1cmFuY2VzIGZvcm1z IHdoaWNoIHdlIG11c3QgZXhlY3V0ZQogICAgOzsgKHdoaWNoIGFyZSBoYXBwaWx5IHNvcnRlZCBu b3cpIGFuZCBleGVjdXRlIHRoZW0gYWxsIQogICAgKGxldCAoKHJ2YWwgbmlsKSAobGFzdHZhbCBu aWwpIChydmFsZXZlciBuaWwpIChmb3VuZCBuaWwpKQogICAgICAod2hpbGUgbGFtYmRhcwoJKGlm IChjYXIgbGFtYmRhcykKCSAgICAobGV0KiAoKHNjb3BlZC1jbGFzcyAoY2RyIChjYXIgbGFtYmRh cykpKQoJCSAgIChlaWVpby1nZW5lcmljLWNhbGwta2V5IChjYXIga2V5cykpCgkJICAgKGhhcy1y ZXR1cm4tdmFsCgkJICAgIChvciAoPSBlaWVpby1nZW5lcmljLWNhbGwta2V5IG1ldGhvZC1wcmlt YXJ5KQoJCQkoPSBlaWVpby1nZW5lcmljLWNhbGwta2V5IG1ldGhvZC1zdGF0aWMpKSkKCQkgICAo ZWllaW8tZ2VuZXJpYy1jYWxsLW5leHQtbWV0aG9kLWxpc3QKCQkgICAgOzsgVXNlIHRoZSBjZHIs IGFzIHRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBmY24KCQkgICAgOzsgd2UgYXJlIGNhbGxpbmcg cmlnaHQgbm93LgoJCSAgICAod2hlbiBoYXMtcmV0dXJuLXZhbCAoY2RyIHByaW1hcnltZXRob2Rs aXN0KSkpCgkJICAgKQoJICAgICAgKHNldHEgZm91bmQgdCkKCSAgICAgIDs7KHNldHEgcnZhbCAo YXBwbHkgKGNhciAoY2FyIGxhbWJkYXMpKSBuZXdhcmdzKSkKCSAgICAgIChzZXRxIGxhc3R2YWwg KGFwcGx5IChjYXIgKGNhciBsYW1iZGFzKSkgbmV3YXJncykpCgkgICAgICAod2hlbiBoYXMtcmV0 dXJuLXZhbAoJICAgICAgCShzZXRxIHJ2YWwgbGFzdHZhbAoJICAgICAgCSAgICAgIHJ2YWxldmVy IHQpKQoJICAgICAgKSkKCShzZXRxIGxhbWJkYXMgKGNkciBsYW1iZGFzKQoJICAgICAga2V5cyAo Y2RyIGtleXMpKSkKICAgICAgKGlmIChub3QgZm91bmQpCgkgIChpZiAob2JqZWN0LXAgKGNhciBh cmdzKSkKCSAgICAgIChzZXRxIHJ2YWwgKG5vLWFwcGxpY2FibGUtbWV0aG9kIChjYXIgYXJncykg bWV0aG9kKQoJCSAgICBydmFsZXZlciB0KQoJICAgIChzaWduYWwKCSAgICAgJ25vLW1ldGhvZC1k ZWZpbml0aW9uCgkgICAgIChsaXN0IG1ldGhvZCBhcmdzKSkpKQogICAgICA7OyBSaWdodCBIZXJl Li4uIGl0IGNvdWxkIGJlIHRoYXQgbGFzdHZhbCBpcyByZXR1cm5lZCB3aGVuCiAgICAgIDs7IHJ2 YWxldmVyIGlzIG5pbC4gIElzIHRoYXQgcmlnaHQ/CiAgICAgIHJ2YWwpKSkKCihkZWZ1biBlaWVp b210LW1ldGhvZC1saXN0IChtZXRob2Qga2V5IGNsYXNzKQogICJSZXR1cm4gYW4gYWxpc3QgbGlz dCBvZiBtZXRob2RzIGxhbWJkYXMuCk1FVEhPRCBpcyB0aGUgbWV0aG9kIG5hbWUuCktFWSByZXBy ZXNlbnRzIGVpdGhlciA6QkVGT1JFLCBvciA6QUZURVIgbWV0aG9kcy4KQ0xBU1MgaXMgdGhlIHN0 YXJ0aW5nIGNsYXNzIHRvIHNlYXJjaCBmcm9tIGluIHRoZSBtZXRob2QgdHJlZS4iCiAgKGxldCAo KGxhbWJkYXMgbmlsKQoJKG1jbGFzcyAobGlzdCBjbGFzcykpKQogICAgKHdoaWxlIG1jbGFzcwog ICAgICAod2hlbiAoY2FyIG1jbGFzcykKCTs7IGxvb2t1cCB0aGUgZm9ybSB0byB1c2UgZm9yIHRo ZSBQUklNQVJZIG9iamVjdCBmb3IgdGhlIG5leHQgbGV2ZWwKCShsZXQgKCh0bXBsIChlaWVpby1n ZW5lcmljLWZvcm0gbWV0aG9kIGtleSAoY2FyIG1jbGFzcykpKSkKCSAgKHdoZW4gKG9yIChub3Qg bGFtYmRhcykgCgkJICAgIDs7IFRoaXMgcHJldmVudHMgZHVwbGljYXRlcyBjb21pbmcgb3V0IG9m IHRoZQoJCSAgICA7OyBjbGFzcyBtZXRob2Qgb3B0aW1pemVyLiAgUGVyaGFwcyB3ZSBzaG91bGQK CQkgICAgOzsganVzdCBub3Qgb3B0aW1pemUgYmVmb3JlL2FmdGVycz8KCQkgICAgKG5vdCAoZXEg KGNhciB0bXBsKSAoY2FyIChjYXIgbGFtYmRhcykpKSkpCgkgICAgKHNldHEgbGFtYmRhcyAoY29u cyB0bXBsIGxhbWJkYXMpKQoJICAgIChpZiAobnVsbCAoY2FyIGxhbWJkYXMpKQoJCShzZXRxIGxh bWJkYXMgKGNkciBsYW1iZGFzKSkpKSkpCiAgICAgIDs7IEFkZCBuZXcgY2xhc3NlcyB0byBtY2xh c3MKICAgICAgKHNldHEgbWNsYXNzIChhcHBlbmQgKGNkciBtY2xhc3MpIChlaWVpb210LW5leHQg KGNhciBtY2xhc3MpKSkpCiAgICAgICkKICAgIChpZiAoZXEga2V5IG1ldGhvZC1hZnRlcikKCWxh bWJkYXMKICAgICAgKG5yZXZlcnNlIGxhbWJkYXMpKSkpCgooZGVmdW4gbmV4dC1tZXRob2QtcCAo KQogICJSZXR1cm4gYSBsaXN0IG9mIGxhbWJkYXMgd2hpY2ggcXVhbGlmeSBhcyB0aGUgYG5leHQt bWV0aG9kJy4iCiAgZWllaW8tZ2VuZXJpYy1jYWxsLW5leHQtbWV0aG9kLWxpc3QpCgooZGVmdW4g Y2FsbC1uZXh0LW1ldGhvZCAoJnJlc3QgcmVwbGFjZW1lbnQtYXJncykKICAiQ2FsbCB0aGUgbmV4 dCBsb2dpY2FsIG1ldGhvZCBmcm9tIGFub3RoZXIgbWV0aG9kLgpUaGUgbmV4dCBsb2dpY2FsIG1l dGhvZCBpcyB0aGUgbWV0aG9kIGJlbG9uZyB0byB0aGUgcGFyZW50IGNsYXNzIG9mCnRoZSBjdXJy ZW50bHkgcnVubmluZyBtZXRob2QuICBJZiBSRVBMQUNFTUVOVC1BUkdTIGlzIG5vbi1uaWwsIHRo ZW4KdXNlIHRoZW0gaW5zdGVhZCBvZiBgZWllaW8tZ2VuZXJpYy1jYWxsLWFyZ2xzdCcuICBUaGUg Z2VuZXJpYyBhcmcgbGlzdAphcmUgdGhlIGFyZ3VtZW50cyBwYXNzZWQgaW4gYXQgdGhlIHRvcCBs ZXZlbC4iCiAgKGlmIChub3Qgc2NvcGVkLWNsYXNzKQogICAgICAoZXJyb3IgIkNhbGwtbmV4dC1t ZXRob2Qgbm90IGNhbGxlZCB3aXRoaW4gYSBjbGFzcyBzcGVjaWZpYyBtZXRob2QiKSkKICAoaWYg KGFuZCAoLz0gZWllaW8tZ2VuZXJpYy1jYWxsLWtleSBtZXRob2QtcHJpbWFyeSkKCSAgICgvPSBl aWVpby1nZW5lcmljLWNhbGwta2V5IG1ldGhvZC1zdGF0aWMpKQogICAgICAoZXJyb3IgIkNhbm5v dCBgY2FsbC1uZXh0LW1ldGhvZCcgZXhjZXB0IGluIDpQUklNQVJZIG9yIDpTVEFUSUMgbWV0aG9k cyIpCiAgICApCiAgKGxldCAoKG5ld2FyZ3MgKG9yIHJlcGxhY2VtZW50LWFyZ3MgZWllaW8tZ2Vu ZXJpYy1jYWxsLWFyZ2xzdCkpCgkobmV4dCAoY2FyIGVpZWlvLWdlbmVyaWMtY2FsbC1uZXh0LW1l dGhvZC1saXN0KSkKCShyZXR1cm52YWwgbmlsKQoJKQogICAgKGlmIChvciAobm90IG5leHQpIChu b3QgKGNhciBuZXh0KSkpCgkobm8tbmV4dC1tZXRob2QgKGNhciBuZXdhcmdzKSkKICAgICAgKGxl dCogKChlaWVpby1nZW5lcmljLWNhbGwtbmV4dC1tZXRob2QtbGlzdAoJICAgICAgKGNkciBlaWVp by1nZW5lcmljLWNhbGwtbmV4dC1tZXRob2QtbGlzdCkpCgkgICAgIChzY29wZWQtY2xhc3MgKGNk ciBuZXh0KSkKCSAgICAgKGZjbiAoY2FyIG5leHQpKQoJICAgICApCgkoYXBwbHkgZmNuIG5ld2Fy Z3MpCgkpKSkpCgwKOzs7Cjs7IGVpZWlvLW1ldGhvZC10cmVlIDogZWllaW9tdC0KOzsKOzsgU3Rv cmVkIGFzIGVpZWlvLW1ldGhvZC10cmVlIGluIHByb3BlcnR5IGxpc3Qgb2YgYSBnZW5lcmljIG1l dGhvZAo7Owo7OyAoZWllaW8tbWV0aG9kLXRyZWUgLiBbQkVGT1JFIFBSSU1BUlkgQUZURVIKOzsg ICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNCRUZPUkUgZ2VuZXJpY1BSSU1BUlkgZ2VuZXJp Y0FGVEVSXSkKOzsgYW5kCjs7IChlaWVpby1tZXRob2Qtb2JhcnJheSAuIFtCRUZPUkUgUFJJTUFS WSBBRlRFUgo7OyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY0JFRk9SRSBnZW5lcmlj UFJJTUFSWSBnZW5lcmljQUZURVJdKQo7OyAgICB3aGVyZSB0aGUgYXNzb2NpYXRpb24gaXMgYSB2 ZWN0b3IuCjs7ICAgIChhcmVmIDAgIC0tIGFsbCBzdGF0aWMgbWV0aG9kcy4KOzsgICAgKGFyZWYg MSAgLS0gYWxsIG1ldGhvZHMgY2xhc3NpZmllZCBhcyA6QkVGT1JFCjs7ICAgIChhcmVmIDIgIC0t IGFsbCBtZXRob2RzIGNsYXNzaWZpZWQgYXMgOlBSSU1BUlkKOzsgICAgKGFyZWYgMyAgLS0gYWxs IG1ldGhvZHMgY2xhc3NpZmllZCBhcyA6QUZURVIKOzsgICAgKGFyZWYgNCAgLS0gYSBnZW5lcmlj IGNsYXNzaWZpZWQgYXMgOkJFRk9SRQo7OyAgICAoYXJlZiA1ICAtLSBhIGdlbmVyaWMgY2xhc3Np ZmllZCBhcyA6UFJJTUFSWQo7OyAgICAoYXJlZiA2ICAtLSBhIGdlbmVyaWMgY2xhc3NpZmllZCBh cyA6QUZURVIKOzsKKGRlZnZhciBlaWVpb210LW9wdGltaXppbmctb2JhcnJheSBuaWwKICAiV2hp bGUgbWFwcGluZyBhdG9tcywgdGhpcyBjb250YWluIHRoZSBvYmFycmF5IGJlaW5nIG9wdGltaXpl ZC4iKQoKKGRlZnVuIGVpZWlvbXQtaW5zdGFsbCAobWV0aG9kLW5hbWUpCiAgIkluc3RhbGwgdGhl IG1ldGhvZCB0cmVlLCBhbmQgb2JhcnJheSBvbnRvIE1FVEhPRC1OQU1FLgpEbyBub3QgZG8gdGhl IHdvcmsgaWYgdGhleSBhbHJlYWR5IGV4aXN0LiIKICAobGV0ICgoZW10diAoZ2V0IG1ldGhvZC1u YW1lICdlaWVpby1tZXRob2QtdHJlZSkpCgkoZW10byAoZ2V0IG1ldGhvZC1uYW1lICdlaWVpby1t ZXRob2Qtb2JhcnJheSkpKQogICAgKGlmIChvciAobm90IGVtdHYpIChub3QgZW10bykpCgkocHJv Z24KCSAgKHNldHEgZW10diAocHV0IG1ldGhvZC1uYW1lICdlaWVpby1tZXRob2QtdHJlZQoJCQkg IChtYWtlLXZlY3RvciBtZXRob2QtbnVtLWZpZWxkcyBuaWwpKQoJCWVtdG8gKHB1dCBtZXRob2Qt bmFtZSAnZWllaW8tbWV0aG9kLW9iYXJyYXkKCQkJICAobWFrZS12ZWN0b3IgbWV0aG9kLW51bS1m aWVsZHMgbmlsKSkpCgkgIChhc2V0IGVtdG8gMCAobWFrZS12ZWN0b3IgMTEgMCkpCgkgIChhc2V0 IGVtdG8gMSAobWFrZS12ZWN0b3IgMTEgMCkpCgkgIChhc2V0IGVtdG8gMiAobWFrZS12ZWN0b3Ig NDEgMCkpCgkgIChhc2V0IGVtdG8gMyAobWFrZS12ZWN0b3IgMTEgMCkpCgkgICkpKSkKCihkZWZ1 biBlaWVpb210LWFkZCAobWV0aG9kLW5hbWUgbWV0aG9kIGtleSBjbGFzcykKICAiQWRkIHRvIE1F VEhPRC1OQU1FIHRoZSBmb3JtcyBNRVRIT0QgaW4gYSBjYWxsIHBvc2l0aW9uIEtFWSBmb3IgQ0xB U1MuCk1FVEhPRC1OQU1FIGlzIHRoZSBuYW1lIGNyZWF0ZWQgYnkgYSBjYWxsIHRvIGBkZWZnZW5l cmljJy4KTUVUSE9EIGFyZSB0aGUgZm9ybXMgZm9yIGEgZ2l2ZW4gaW1wbGVtZW50YXRpb24uCktF WSBpcyBhbiBpbnRlZ2VyIChzZWUgY29tbWVudCBpbiBlaWVpby5lbCBuZWFyIHRoaXMgZnVuY3Rp b24pIHdoaWNoCmlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgOlNUQVRJQyA6QkVGT1JFIDpQUklNQVJZ IGFuZCA6QUZURVIgdGFncy4KSXQgYWxzbyBpbmRpY2F0ZXMgaWYgQ0xBU1MgaXMgZGVmaW5lZCBv ciBub3QuCkNMQVNTIGlzIHRoZSBjbGFzcyB0aGlzIG1ldGhvZCBpcyBhc3NvY2lhdGVkIHdpdGgu IgogIChpZiAob3IgKD4ga2V5IG1ldGhvZC1udW0tZmllbGRzKSAoPCBrZXkgMCkpCiAgICAgIChl cnJvciAiRWllaW9tdC1hZGQ6IG1ldGhvZCBrZXkgZXJyb3IhIikpCiAgKGxldCAoKGVtdHYgKGdl dCBtZXRob2QtbmFtZSAnZWllaW8tbWV0aG9kLXRyZWUpKQoJKGVtdG8gKGdldCBtZXRob2QtbmFt ZSAnZWllaW8tbWV0aG9kLW9iYXJyYXkpKSkKICAgIDs7IE1ha2Ugc3VyZSB0aGUgbWV0aG9kIHRh YmxlcyBhcmUgYXZhaWxhYmxlLgogICAgKGlmIChvciAobm90IGVtdHYpIChub3QgZW10bykpCgko ZXJyb3IgIlByb2dyYW1tZXIgZXJyb3I6IGVpZWlvbXQtYWRkIikpCiAgICA7OyBvbmx5IGFkZCBu ZXcgY2VsbHMgb24gaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0IQogICAgKGlmIChhc3NxIGNs YXNzIChhcmVmIGVtdHYga2V5KSkKCShzZXRjZHIgKGFzc3EgY2xhc3MgKGFyZWYgZW10diBrZXkp KSBtZXRob2QpCiAgICAgIChhc2V0IGVtdHYga2V5IChjb25zIChjb25zIGNsYXNzIG1ldGhvZCkg KGFyZWYgZW10diBrZXkpKSkpCiAgICA7OyBBZGQgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbnRvIG5l d2x5IGNyZWF0ZWQgc3ltYm9sLCBhbmQgc3RvcmUKICAgIDs7IHNhaWQgc3ltYm9sIGluIHRoZSBj b3JyZWN0IG9iYXJyYXksIG90aGVyd2lzZSB1c2UgdGhlCiAgICA7OyBvdGhlciBhcnJheSB0byBr ZWVwIHRoaXMgc3R1ZmYKICAgIChpZiAoPCBrZXkgbWV0aG9kLW51bS1saXN0cykKCShsZXQgKChu c3ltIChpbnRlcm4gKHN5bWJvbC1uYW1lIGNsYXNzKSAoYXJlZiBlbXRvIGtleSkpKSkKCSAgKGZz ZXQgbnN5bSBtZXRob2QpKSkKICAgIDs7IE5vdyBvcHRpbWl6ZSB0aGUgZW50aXJlIG9iYXJyYXkK ICAgIChpZiAoPCBrZXkgbWV0aG9kLW51bS1saXN0cykKCShsZXQgKChlaWVpb210LW9wdGltaXpp bmctb2JhcnJheSAoYXJlZiBlbXRvIGtleSkpKQoJICAobWFwYXRvbXMgJ2VpZWlvbXQtc3ltLW9w dGltaXplIGVpZWlvbXQtb3B0aW1pemluZy1vYmFycmF5KSkpCiAgICApKQoKKGRlZnVuIGVpZWlv bXQtbmV4dCAoY2xhc3MpCiAgIlJldHVybiB0aGUgbmV4dCBwYXJlbnQgY2xhc3MgZm9yIENMQVNT LgpJZiBDTEFTUyBpcyBhIHN1cGVyY2xhc3MsIHJldHVybiB2YXJpYWJsZSBgZWllaW8tZGVmYXVs dC1zdXBlcmNsYXNzJy4gIElmIENMQVNTCmlzIHZhcmlhYmxlIGBlaWVpby1kZWZhdWx0LXN1cGVy Y2xhc3MnIHRoZW4gcmV0dXJuIG5pbC4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20KZnVuY3Rpb24g YGNsYXNzLXBhcmVudCcgYXMgY2xhc3MgcGFyZW50IHJldHVybnMgbmlsIGZvciBzdXBlcmNsYXNz ZXMuICBUaGlzCmZ1bmN0aW9uIHBlcmZvcm1zIG5vIHR5cGUgY2hlY2tpbmchIgogIDs7IE5vIHR5 cGUtY2hlY2tpbmcgYmVjYXVzZSBhbGwgY2FsbHMgYXJlIG1hZGUgZnJvbSBmdW5jdGlvbnMgd2hp Y2gKICA7OyBhcmUgc2FmZSBhbmQgZG8gY2hlY2tpbmcgZm9yIHVzLgogIChvciAoY2xhc3MtcGFy ZW50cy1mYXN0IGNsYXNzKQogICAgICAoaWYgKGVxIGNsYXNzICdlaWVpby1kZWZhdWx0LXN1cGVy Y2xhc3MpCgkgIG5pbAoJJyhlaWVpby1kZWZhdWx0LXN1cGVyY2xhc3MpKSkpCgooZGVmdW4gZWll aW9tdC1zeW0tb3B0aW1pemUgKHMpCiAgIkZpbmQgdGhlIG5leHQgY2xhc3MgYWJvdmUgUyB3aGlj aCBoYXMgYSBmdW5jdGlvbiBib2R5IGZvciB0aGUgb3B0aW1pemVyLiIKICA7OyAobWVzc2FnZSAi T3B0aW1pemluZyAlUyIgcykKICAobGV0ICgoZXMgKGludGVybi1zb2Z0IChzeW1ib2wtbmFtZSBz KSkpIDtleHRlcm5hbCBzeW1ib2wgb2YgY2xhc3MKCShvdiBuaWwpCgkoY29udCB0KSkKICAgIDs7 IFRoaXMgY29udmVydHMgRVMgZnJvbSBhIHNpbmdsZSBzeW1ib2wgdG8gYSBsaXN0IG9mIHBhcmVu dCBjbGFzc2VzLgogICAgKHNldHEgZXMgKGVpZWlvbXQtbmV4dCBlcykpCiAgICA7OyBMb29wIG92 ZXIgRVMsIHRoZW4gaXQncyBjaGlsZHJlbiBpbmRpdmlkdWFsbHkuCiAgICA7OyBXZSBjYW4gaGF2 ZSBtdWx0aXBsZSBoaXRzIG9ubHkgYXQgb25lIGxldmVsIG9mIHRoZSBwYXJlbnQgdHJlZS4KICAg ICh3aGlsZSAoYW5kIGVzIGNvbnQpCiAgICAgIChzZXRxIG92IChpbnRlcm4tc29mdCAoc3ltYm9s LW5hbWUgKGNhciBlcykpIGVpZWlvbXQtb3B0aW1pemluZy1vYmFycmF5KSkKICAgICAgKGlmIChm Ym91bmRwIG92KQoJICAocHJvZ24KCSAgICAoc2V0IHMgb3YpCQkJO3N0b3JlIG92IGFzIG91ciBu ZXh0IHN5bWJvbAoJICAgIChzZXRxIGNvbnQgbmlsKSkKCShzZXRxIGVzIChhcHBlbmQgKGNkciBl cykgKGVpZWlvbXQtbmV4dCAoY2FyIGVzKSkpKSkpCiAgICA7OyBJZiB0aGVyZSBpcyBubyBuZWFy ZXN0IGNhbGwsIHRoZW4gc2V0IG91ciB2YWx1ZSB0byBuaWwKICAgIChpZiAobm90IGVzKSAoc2V0 IHMgbmlsKSkKICAgICkpCgooZGVmdW4gZWllaW8tZ2VuZXJpYy1mb3JtIChtZXRob2Qga2V5IGNs YXNzKQogIlJldHVybiB0aGUgbGFtYmRhIGZvcm0gYmVsb25naW5nIHRvIE1FVEhPRCB1c2luZyBL RVkgYmFzZWQgdXBvbiBDTEFTUy4KSWYgQ0xBU1MgaXMgbm90IGEgY2xhc3MgdGhlbiB1c2UgYGdl bmVyaWMnIGluc3RlYWQuICBJZiBjbGFzcyBoYXMgbm8KZm9ybSwgYnV0IGhhcyBhIHBhcmVudCBj bGFzcywgdGhlbiB0cmFjZSB0byB0aGF0IHBhcmVudCBjbGFzcy4gIFRoZQpmaXJzdCB0aW1lIGEg Zm9ybSBpcyByZXF1ZXN0ZWQgZnJvbSBhIHN5bWJvbCwgYW4gb3B0aW1pemVkIHBhdGggaXMKbWVt b2l6ZWQgZm9yIGZ1dHVyZSBmYXN0ZXIgdXNlLiIKIChsZXQgKChlbXRvIChhcmVmIChnZXQgbWV0 aG9kICdlaWVpby1tZXRob2Qtb2JhcnJheSkKCQkgICAoaWYgY2xhc3Mga2V5ICgrIGtleSAzKSkp KSkKICAgKGlmIChjbGFzcy1wIGNsYXNzKQogICAgICAgOzsgMSkgZmluZCBvdXIgc3ltYm9sCiAg ICAgICAobGV0ICgoY3MgKGludGVybi1zb2Z0IChzeW1ib2wtbmFtZSBjbGFzcykgZW10bykpKQoJ IChpZiAobm90IGNzKQoJICAgICA7OyAyKSBJZiB0aGVyZSBpc24ndCBvbmUsIHRoZW4gbWFrZSBv bmUuCgkgICAgIDs7ICAgIFRoaXMgY2FuIGJlIHNsb3cgc2luY2UgaXQgb25seSBvY2N1cnMgb25j ZQoJICAgICAocHJvZ24KCSAgICAgICAoc2V0cSBjcyAoaW50ZXJuIChzeW1ib2wtbmFtZSBjbGFz cykgZW10bykpCgkgICAgICAgOzsgMi4xKSBDYWNoZSBpdCdzIG5lYXJlc3QgbmVpZ2hib3Igd2l0 aCBhIHF1aWNrIG9wdGltaXplCgkgICAgICAgOzsgICAgICB3aGljaCBzaG91bGQgb25seSBvY2N1 ciBvbmNlIGZvciB0aGlzIGNhbGwgZXZlcgoJICAgICAgIChsZXQgKChlaWVpb210LW9wdGltaXpp bmctb2JhcnJheSBlbXRvKSkKCQkgKGVpZWlvbXQtc3ltLW9wdGltaXplIGNzKSkpKQoJIDs7IDMp IElmIGl0J3MgYm91bmQgcmV0dXJuIHRoaXMgb25lLgoJIChpZiAoZmJvdW5kcCAgY3MpCgkgICAg IChjb25zIGNzIChhcmVmIChjbGFzcy12IGNsYXNzKSBjbGFzcy1zeW1ib2wpKQoJICAgOzsgNCkg SWYgaXQncyBub3QgYm91bmQgdGhlbiB0aGlzIHZhcmlhYmxlIGtub3dzIHNvbWV0aGluZwoJICAg KGlmIChzeW1ib2wtdmFsdWUgY3MpCgkgICAgICAgKHByb2duCgkJIDs7IDQuMSkgVGhpcyBzeW1i b2wgaG9sZHMgdGhlIG5leHQgY2xhc3MgaW4gaXQncyB2YWx1ZQoJCSAoc2V0cSBjbGFzcyAoc3lt Ym9sLXZhbHVlIGNzKQoJCSAgICAgICBjcyAoaW50ZXJuLXNvZnQgKHN5bWJvbC1uYW1lIGNsYXNz KSBlbXRvKSkKCQkgOzsgNC4yKSBUaGUgb3B0aW1pemVyIHNob3VsZCBhbHdheXMgaGF2ZSBjaG9z ZW4gYQoJCSA7OyAgICAgIGZ1bmN0aW9uLXN5bWJvbAoJCSA7OyhpZiAoZmJvdW5kcCBjcykKCQkg KGNvbnMgY3MgKGFyZWYgKGNsYXNzLXYgKGludGVybiAoc3ltYm9sLW5hbWUgY2xhc3MpKSkKCQkJ CWNsYXNzLXN5bWJvbCkpCgkJICAgOzsoZXJyb3IgIkVJRUlPIG9wdGltaXplcjogZXJyYXRpYyBk YXRhIGxvc3MhIikpCgkJICkKCSAgICAgICA7OyBUaGVyZSBuZXZlciB3aWxsIGJlIGEgZnVuY2Fs bC4uLgoJICAgICAgIG5pbCkpKQogICAgIDs7IGZvciBhIGdlbmVyaWMgY2FsbCwgd2hhdCBpcyBh IGxpc3QsIGlzIHRoZSBmdW5jdGlvbiBib2R5IHdlIHdhbnQuCiAgICAgKGxldCAoKGVtdGwgKGFy ZWYgKGdldCBtZXRob2QgJ2VpZWlvLW1ldGhvZC10cmVlKQoJCSAgICAgICAoaWYgY2xhc3Mga2V5 ICgrIGtleSAzKSkpKSkKICAgICAgIChpZiBlbXRsCgkgICA7OyBUaGUgY2FyIG9mIEVNVEwgaXMg c3VwcG9zZWQgdG8gYmUgYSBjbGFzcywgd2hpY2ggaW4gdGhpcwoJICAgOzsgY2FzZSBpcyBuaWws IHNvIHNraXAgaXQuCgkgICAoY29ucyAoY2RyIChjYXIgZW10bCkpIG5pbCkKCSBuaWwpKSkpKQoK Ozs7Cjs7IFdheSB0byBhc3NpZ24gZmllbGRzIGJhc2VkIG9uIGEgbGlzdC4gIFVzZWQgZm9yIGNv bnN0cnVjdG9ycywgb3IKOzsgZXZlbiByZXNldHRpbmcgYW4gb2JqZWN0IGF0IHJ1bi10aW1lCjs7 CihkZWZ1biBlaWVpby1zZXQtZGVmYXVsdHMgKG9iaiAmb3B0aW9uYWwgc2V0LWFsbCkKICAiVGFr ZSBvYmplY3QgT0JKLCBhbmQgcmVzZXQgYWxsIGZpZWxkcyB0byB0aGVpciBkZWZhdWx0cy4KSWYg U0VULUFMTCBpcyBub24tbmlsLCB0aGVuIHdoZW4gYSBkZWZhdWx0IGlzIG5pbCwgdGhhdCB2YWx1 ZSBpcwpyZXNldC4gIElmIFNFVC1BTEwgaXMgbmlsLCB0aGUgZmllbGRzIGFyZSBvbmx5IHJlc2V0 IGlmIHRoZSBkZWZhdWx0IGlzCm5vdCBuaWwuIgogIChsZXQgKChzY29wZWQtY2xhc3MgKGFyZWYg b2JqIG9iamVjdC1jbGFzcykpCgkoZWllaW8taW5pdGlhbGl6aW5nLW9iamVjdCB0KQoJKHB1YiAo YXJlZiAoY2xhc3MtdiAoYXJlZiBvYmogb2JqZWN0LWNsYXNzKSkgY2xhc3MtcHVibGljLWEpKSkK ICAgICh3aGlsZSBwdWIKICAgICAgKGxldCAoKGRmIChlaWVpby1vcmVmLWRlZmF1bHQgb2JqIChj YXIgcHViKSkpKQoJKGlmIChhbmQgKGxpc3RwIGRmKSAoZXEgKGNhciBkZikgJ2xhbWJkYS1kZWZh dWx0KSkKCSAgICAocHJvZ24KCSAgICAgIChzZXRxIGRmIChjb3B5LXNlcXVlbmNlIGRmKSkKCSAg ICAgIChzZXRjYXIgZGYgJ2xhbWJkYSkpKQoJKGlmIChvciBkZiBzZXQtYWxsKQoJICAgIChlaWVp by1vc2V0IG9iaiAoY2FyIHB1YikgZGYpKSkKICAgICAgKHNldHEgcHViIChjZHIgcHViKSkpKSkK CihkZWZ1biBlaWVpby1pbml0YXJnLXRvLWF0dHJpYnV0ZSAoY2xhc3MgaW5pdGFyZykKICAiRm9y IENMQVNTLCBjb252ZXJ0IElOSVRBUkcgdG8gdGhlIGFjdHVhbCBhdHRyaWJ1dGUgbmFtZS4KSWYg dGhlcmUgaXMgbm8gdHJhbnNsYXRpb24sIHBhc3MgaXQgaW4gZGlyZWN0bHkgKHNvIHdlIGNhbiBj aGVhdCBpZgpuZWVkIGJlLi4gTWF5IHJlbW92ZSB0aGF0IGxhdGVyLi4uKSIKICAobGV0ICgodHVw bGUgKGFzc29jIGluaXRhcmcgKGFyZWYgKGNsYXNzLXYgY2xhc3MpIGNsYXNzLWluaXRhcmctdHVw bGVzKSkpKQogICAgKGlmIHR1cGxlCgkoY2RyIHR1cGxlKQogICAgICBuaWwpKSkKCihkZWZ1biBl aWVpby1hdHRyaWJ1dGUtdG8taW5pdGFyZyAoY2xhc3MgYXR0cmlidXRlKQogICJJbiBDTEFTUywg Y29udmVydCB0aGUgQVRUUklCVVRFIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgaW5pdCBhcmd1bWVu dCB0YWcuClRoaXMgaXMgdXN1YWxseSBhIHN5bWJvbCB0aGF0IHN0YXJ0cyB3aXRoIGA6Jy4iCiAg KGxldCAoKHR1cGxlIChyYXNzb2MgYXR0cmlidXRlIChhcmVmIChjbGFzcy12IGNsYXNzKSBjbGFz cy1pbml0YXJnLXR1cGxlcykpKSkKICAgIChpZiB0dXBsZQoJKGNhciB0dXBsZSkKICAgICAgbmls KSkpCgoMCjs7OyBIZXJlIGFyZSBzb21lIHNwZWNpYWwgdHlwZXMgb2YgZXJyb3JzCjs7CihpbnRl cm4gIm5vLW1ldGhvZC1kZWZpbml0aW9uIikKKHB1dCAnbm8tbWV0aG9kLWRlZmluaXRpb24gJ2Vy cm9yLWNvbmRpdGlvbnMgJyhuby1tZXRob2QtZGVmaW5pdGlvbiBlcnJvcikpCihwdXQgJ25vLW1l dGhvZC1kZWZpbml0aW9uICdlcnJvci1tZXNzYWdlICJObyBtZXRob2QgZGVmaW5pdGlvbiIpCgoo aW50ZXJuICJuby1uZXh0LW1ldGhvZCIpCihwdXQgJ25vLW5leHQtbWV0aG9kICdlcnJvci1jb25k aXRpb25zICcobm8tbmV4dC1tZXRob2QgZXJyb3IpKQoocHV0ICduby1uZXh0LW1ldGhvZCAnZXJy b3ItbWVzc2FnZSAiTm8gbmV4dCBtZXRob2QiKQoKKGludGVybiAiaW52YWxpZC1zbG90LW5hbWUi KQoocHV0ICdpbnZhbGlkLXNsb3QtbmFtZSAnZXJyb3ItY29uZGl0aW9ucyAnKGludmFsaWQtc2xv dC1uYW1lIGVycm9yKSkKKHB1dCAnaW52YWxpZC1zbG90LW5hbWUgJ2Vycm9yLW1lc3NhZ2UgIklu dmFsaWQgc2xvdCBuYW1lIikKCihpbnRlcm4gImludmFsaWQtc2xvdC10eXBlIikKKHB1dCAnaW52 YWxpZC1zbG90LXR5cGUgJ2Vycm9yLWNvbmRpdGlvbnMgJyhpbnZhbGlkLXNsb3QtdHlwZSBlcnJv ciBuaWwpKQoocHV0ICdpbnZhbGlkLXNsb3QtdHlwZSAnZXJyb3ItbWVzc2FnZSAiSW52YWxpZCBz bG90IHR5cGUiKQoKKGludGVybiAidW5ib3VuZC1zbG90IikKKHB1dCAndW5ib3VuZC1zbG90ICdl cnJvci1jb25kaXRpb25zICcodW5ib3VuZC1zbG90IGVycm9yIG5pbCkpCihwdXQgJ3VuYm91bmQt c2xvdCAnZXJyb3ItbWVzc2FnZSAiVW5ib3VuZCBzbG90IikKCjs7OyBIZXJlIGFyZSBzb21lIENM T1MgaXRlbXMgdGhhdCBuZWVkIHRoZSBDTCBwYWNrYWdlCjs7CgooZGVmc2V0ZiBzbG90LXZhbHVl IChvYmogZmllbGQpIChzdG9yZSkgKGxpc3QgJ2VpZWlvLW9zZXQgb2JqIGZpZWxkIHN0b3JlKSkK KGRlZnNldGYgZWllaW8tb3JlZiAob2JqIGZpZWxkKSAoc3RvcmUpIChsaXN0ICdlaWVpby1vc2V0 IG9iaiBmaWVsZCBzdG9yZSkpCgo7OyBUaGUgYmVsb3cgc2V0ZiBtZXRob2Qgd2FzIHdyaXR0ZW4g YnkgQXJuZCBLb2hycyA8a29ocnNAYWNtLm9yZz4KKGRlZmluZS1zZXRmLW1ldGhvZCBvcmVmIChv YmogZmllbGQpIAogIChsZXQgKChvYmotdGVtcCAoZ2Vuc3ltKSkgCgkoZmllbGQtdGVtcCAoZ2Vu c3ltKSkgCgkoc3RvcmUtdGVtcCAoZ2Vuc3ltKSkpIAogICAgKGxpc3QgKGxpc3Qgb2JqLXRlbXAg ZmllbGQtdGVtcCkgCgkgIChsaXN0IG9iaiBgKHF1b3RlICxmaWVsZCkpIAoJICAobGlzdCBzdG9y ZS10ZW1wKSAKCSAgKGxpc3QgJ3NldC1zbG90LXZhbHVlIG9iai10ZW1wIGZpZWxkLXRlbXAKCQlz dG9yZS10ZW1wKQoJICAobGlzdCAnc2xvdC12YWx1ZSBvYmotdGVtcCBmaWVsZC10ZW1wKSkpKQoK DAo7OzsKOzsgV2Ugd2FudCBhbGwgb2JqZWN0cyBjcmVhdGVkIGJ5IEVJRUlPIHRvIGhhdmUgc29t ZSBkZWZhdWx0IHNldCBvZgo7OyBiZWhhdmlvdXJzIHNvIHdlIGNhbiBjcmVhdGUgb2JqZWN0IHV0 aWxpdGllcywgYW5kIGFsbG93IHZhcmlvdXMKOzsgdHlwZXMgb2YgZXJyb3IgY2hlY2tpbmcuICBU byBkbyB0aGlzLCBjcmVhdGUgdGhlIGRlZmF1bHQgRUlFSU8KOzsgY2xhc3MsIGFuZCB3aGVuIG5v IHBhcmVudCBjbGFzcyBpcyBzcGVjaWZpZWQsIHVzZSB0aGlzIGFzIHRoZQo7OyBkZWZhdWx0LiAg KEJ1dCBkb24ndCBzdG9yZSBpdCBpbiB0aGUgb3RoZXIgY2xhc3NlcyBhcyB0aGUgZGVmYXVsdCwK OzsgYWxsb3dpbmcgZm9yIHRyYW5zcGFyZW50IHN1cHBvcnQuKQo7OwoKKGRlZmNsYXNzIGVpZWlv LWRlZmF1bHQtc3VwZXJjbGFzcyBuaWwKICBuaWwKICAiRGVmYXVsdCBjbGFzcyB1c2VkIGFzIHBh cmVudCBjbGFzcyBmb3Igc3VwZXJjbGFzc2VzLgpJdHMgZmllbGRzIGFyZSBhdXRvbWF0aWNhbGx5 IGFkb3B0ZWQgYnkgc3VjaCBzdXBlcmNsYXNzZXMgYnV0IG5vdApzdG9yZWQgaW4gdGhlIGBwYXJl bnQnIGZpZWxkLiAgV2hlbiBzZWFyY2hpbmcgZm9yIGF0dHJpYnV0ZXMgb3IKbWV0aG9kcywgd2hl biB0aGUgbGFzdCBwYXJlbnQgaXMgZm91bmQsIHRoZSBzZWFyY2ggd2lsbCByZWN1cnNlIHRvCnRo aXMgY2xhc3MuIgogIDphYnN0cmFjdCB0KQoKKGRlZmFsaWFzICdzdGFuZGFyZC1jbGFzcyAnZWll aW8tZGVmYXVsdC1zdXBlcmNsYXNzKQoKKGRlZm1ldGhvZCBjb25zdHJ1Y3RvciA6U1RBVElDCiAg KChjbGFzcyBlaWVpby1kZWZhdWx0LXN1cGVyY2xhc3MpIG5ld25hbWUgJnJlc3QgZmllbGRzKQog ICJEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBDTEFTUyBgZWllaW8tZGVmdWFsdC1zdXBlcmNsYXNz Jy4KTkVXTkFNRSBpcyB0aGUgbmFtZSB0byBiZSBnaXZlbiB0byB0aGUgY29uc3RydWN0ZWQgb2Jq ZWN0LgpGSUVMRFMgYXJlIHRoZSBpbml0aWFsaXphdGlvbiBmaWVsZHMgdXNlZCBieSBgc2hhcmVk LWluaXRpYWxpemUnLgpUaGlzIHN0YXRpYyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gb2JqZWN0 IGlzIGNvbnN0cnVjdGVkLgpJdCBhbGxvY2F0ZXMgdGhlIHZlY3RvciB1c2VkIHRvIHJlcHJlc2Vu dCBhbiBFSUVJTyBvYmplY3QsIGFuZCB0aGVuCmNhbGxzIGBzaGFyZWQtaW5pdGlhbGl6ZScgb24g dGhhdCBvYmplY3QuIgogIChsZXQqICgobmV3LW9iamVjdCAoY29weS1zZXF1ZW5jZSAoYXJlZiAo Y2xhc3MtdiBjbGFzcykKCQkJCQkgIGNsYXNzLWRlZmF1bHQtb2JqZWN0LWNhY2hlKSkpKQogICAg OzsgVXBkYXRlIHRoZSBuYW1lIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QuCiAgICAoYXNl dCBuZXctb2JqZWN0IG9iamVjdC1uYW1lIG5ld25hbWUpCiAgICA7OyBDYWxsIHRoZSBpbml0aWFs aXplIG1ldGhvZCBvbiB0aGUgbmV3IG9iamVjdCB3aXRoIHRoZSBmaWVsZHMKICAgIDs7IHRoYXQg d2VyZSBwYXNzZWQgZG93biB0byB1cy4KICAgIChpbml0aWFsaXplLWluc3RhbmNlIG5ldy1vYmpl Y3QgZmllbGRzKQogICAgOzsgUmV0dXJuIHRoZSBjcmVhdGVkIG9iamVjdC4KICAgIG5ldy1vYmpl Y3QpKQoKKGRlZm1ldGhvZCBzaGFyZWQtaW5pdGlhbGl6ZSAoKG9iaiBlaWVpby1kZWZhdWx0LXN1 cGVyY2xhc3MpIGZpZWxkcykKICAiU2V0IGZpZWxkcyBvZiBPQkogd2l0aCBGSUVMRFMgd2hpY2gg aXMgYSBsaXN0IG9mIG5hbWUvdmFsdWUgcGFpcnMuCkNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3Rv ciByb3V0aW5lLiIKICAobGV0ICgoc2NvcGVkLWNsYXNzIChhcmVmIG9iaiBvYmplY3QtY2xhc3Mp KSkKICAgICh3aGlsZSBmaWVsZHMKICAgICAgKGxldCAoKHJuIChlaWVpby1pbml0YXJnLXRvLWF0 dHJpYnV0ZSAob2JqZWN0LWNsYXNzLWZhc3Qgb2JqKQoJCQkJCSAgICAoY2FyIGZpZWxkcykpKSkK CShpZiAobm90IHJuKQoJICAgIChzbG90LW1pc3Npbmcgb2JqIChjYXIgZmllbGRzKSAnb3NldCAo Y2FyIChjZHIgZmllbGRzKSkpKQoJKGVpZWlvLW9zZXQgb2JqIHJuIChjYXIgKGNkciBmaWVsZHMp KSkpCiAgICAgIChzZXRxIGZpZWxkcyAoY2RyIChjZHIgZmllbGRzKSkpKSkpCgooZGVmbWV0aG9k IGluaXRpYWxpemUtaW5zdGFuY2UgKCh0aGlzIGVpZWlvLWRlZmF1bHQtc3VwZXJjbGFzcykKCQkJ CSZvcHRpb25hbCBmaWVsZHMpCiAgICAiQ29uc3RydWN0cyB0aGUgbmV3IG9iamVjdCBUSElTIGJh c2VkIG9uIEZJRUxEUy4KRklFTERTIGlzIGEgdGFnZ2VkIGxpc3Qgd2hlcmUgb2RkIG51bWJlcmVk IGVsZW1lbnRzIGFyZSB0YWdzLCBhbmQKZXZlbiBudW1iZXJlZCBlbGVtZW50cyBhcmUgdGhlIHZh bHVlcyB0byBzdG9yZSBpbiB0aGUgdGFnZ2VkIHNsb3QuICBJZgp5b3Ugb3ZlcmxvYWQgdGhlIGBp bml0aWFsaXplLWluc3RhbmNlJywgdGhlcmUgeW91IHdpbGwgbmVlZCB0byBjYWxsCmBzaGFyZWQt aW5pdGlhbGl6ZScgeW91cnNlbGYsIG9yIHlvdSBjYW4gY2FsbCBgY2FsbC1uZXh0LW1ldGhvZCcg dG8KaGF2ZSB0aGlzIGNvbnN0cnVjdG9yIGNhbGxlZCBhdXRvbWF0aWNhbGx5LiAgSWYgdGhlc2Ug c3RlcHMgYXJlIG5vdAp0YWtlbiwgdGhlbiBuZXcgb2JqZWN0cyBvZiB5b3VyIGNsYXNzIHdpbGwg bm90IGhhdmUgdGhlaXIgdmFsdWVzCmR5bmFtaWNhbGx5IHNldCBmcm9tIEZJRUxEUy4iCiAgICA7 OyBGaXJzdCwgc2VlIGlmIGFueSBvZiBvdXIgZGVmYXVsdHMgYXJlIGBsYW1iZGEnLCBhbmQKICAg IDs7IHJlLWV2YWx1YXRlIHRoZW0gYW5kIGFwcGx5IHRoZSB2YWx1ZSB0byBvdXIgc2xvdHMuCiAg ICAobGV0KiAoKHNjb3BlZC1jbGFzcyAoY2xhc3MtdiAoYXJlZiB0aGlzIG9iamVjdC1jbGFzcykp KQoJICAgKHNsb3QgKGFyZWYgc2NvcGVkLWNsYXNzIGNsYXNzLXB1YmxpYy1hKSkKCSAgIChkZWZh dWx0cyAoYXJlZiBzY29wZWQtY2xhc3MgY2xhc3MtcHVibGljLWQpKSkKICAgICAgKHdoaWxlIHNs b3QKCShpZiAoYW5kIChsaXN0cCAoY2FyIGRlZmF1bHRzKSkKCQkgKGVxICdsYW1iZGEgKGNhciAo Y2FyIGRlZmF1bHRzKSkpKQoJICAgIChlaWVpby1vc2V0IHRoaXMgKGNhciBzbG90KSAoZnVuY2Fs bCAoY2FyIGRlZmF1bHRzKSkpKQoJKHNldHEgc2xvdCAoY2RyIHNsb3QpCgkgICAgICBkZWZhdWx0 cyAoY2RyIGRlZmF1bHRzKSkpKQogICAgOzsgU2hhcmVkIGluaXRpYWxpemUgd2lsbCBwYXJzZSBv dXIgZmllbGRzIGZvciB1cy4KICAgIChzaGFyZWQtaW5pdGlhbGl6ZSB0aGlzIGZpZWxkcykpCgoo ZGVmbWV0aG9kIHNsb3QtbWlzc2luZyAoKG9iamVjdCBlaWVpby1kZWZhdWx0LXN1cGVyY2xhc3Mp IHNsb3QtbmFtZQoJCQkgb3BlcmF0aW9uICZvcHRpb25hbCBuZXctdmFsdWUpCiAgIlNsb3QgbWlz c2luZyBpcyBpbnZva2VkIHdoZW4gYW4gYXR0ZW1wdCB0byBhY2Nlc3MgYSBzbG90IGluIE9CSkVD VCBmYWlscy4KU0xPVC1OQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBmYWlsZWQgc2xvdCwgT1BFUkFU SU9OIGlzIHRoZSB0eXBlIG9mIGFjY2Vzcwp0aGF0IHdhcyByZXF1ZXN0ZWQsIGFuZCBvcHRpb25h bCBORVctVkFMVUUgaXMgdGhlIHZhbHVlIHRoYXQgd2FzIGRlc2lyZWQKdG8gYmUgc2V0LiIKICAo c2lnbmFsICdpbnZhbGlkLXNsb3QtbmFtZSAobGlzdCAob2JqZWN0LW5hbWUgb2JqZWN0KQoJCQkJ ICAgc2xvdC1uYW1lKSkpCgooZGVmbWV0aG9kIHNsb3QtdW5ib3VuZCAoKG9iamVjdCBlaWVpby1k ZWZhdWx0LXN1cGVyY2xhc3MpCgkJCSBjbGFzcyBzbG90LW5hbWUgZm4pCiAgIlNsb3QgdW5ib3Vu ZCBpcyBpbnZva2VkIGR1cmluZyBhbiBhdHRlbXB0IHRvIHJlZmVyZW5jZSBhbiB1bmJvdW5kIHNs b3QuCk9CSkVDVCBpcyB0aGUgaW5zdGFuY2Ugb2YgdGhlIG9iamVjdCBiZWluZyByZWZlcmVuY2Uu ICBDTEFTUyBpcyB0aGUKY2xhc3Mgb2YgT0JKRUNULCBhbmQgU0xPVC1OQU1FIGlzIHRoZSBvZmZl bmRpbmcgc2xvdC4gIFRoaXMgZnVuY3Rpb24KdGhyb3dzIHRoZSBzaWduYWwgYHVuYm91bmQtc2xv dCcuICBZb3UgY2FuIG92ZXJsb2FkIHRoaXMgZnVuY3Rpb24gYW5kCnJldHVybiB0aGUgdmFsdWUg dG8gdXNlIGluIHBsYWNlIG9mIHRoZSB1bmJvdW5kIHZhbHVlLgpBcmd1bWVudCBGTiBpcyB0aGUg ZnVuY3Rpb24gc2lnbmFsaW5nIHRoaXMgZXJyb3IuClVzZSBgc2xvdC1ib3VuZHAnIHRvIGRldGVy bWluZSBpZiBhIHNsb3QgaXMgYm91bmQgb3Igbm90LiIKICAoc2lnbmFsICd1bmJvdW5kLXNsb3Qg KGxpc3QgKGNsYXNzLW5hbWUgY2xhc3MpIChvYmplY3QtbmFtZSBvYmplY3QpCgkJCSAgICAgIHNs b3QtbmFtZSBmbikpKQoKKGRlZm1ldGhvZCBuby1hcHBsaWNhYmxlLW1ldGhvZCAoKG9iamVjdCBl aWVpby1kZWZhdWx0LXN1cGVyY2xhc3MpCgkJCQkgbWV0aG9kKQogICJDYWxsZWQgaWYgdGhlcmUg YXJlIG5vIGltcGxlbWVudGF0aW9ucyBmb3IgT0JKRUNUIGluIE1FVEhPRC4KT0JKRUNUIGlzIHRo ZSBvYmplY3Qgd2hpY2ggaGFzIG5vIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4iCiAgKHNpZ25hbCAn bm8tbWV0aG9kLWRlZmluaXRpb24gKGxpc3QgbWV0aG9kIChvYmplY3QtbmFtZSBvYmplY3QpKSkK ICApCgooZGVmbWV0aG9kIG5vLW5leHQtbWV0aG9kICgob2JqZWN0IGVpZWlvLWRlZmF1bHQtc3Vw ZXJjbGFzcykKCQkJICAgJnJlc3QgYXJncykKICAiQ2FsbGVkIGZyb20gYGNhbGwtbmV4dC1tZXRo b2QnIHdoZW4gbm8gYWRkaXRpb25hbCBtZXRob2RzIGFyZSBhdmFpbGFibGUuCk9CSkVDVCBpcyBv dGhlIG9iamVjdCBiZWluZyBjYWxsZWQgb24gYGNhbGwtbmV4dC1tZXRob2QnLgpBUkdTIGFyZSB0 aGUgIGFyZ3VtZW50cyBpdCBpcyBjYWxsZWQgYnkuClRoaXMgbWV0aG9kIHRocm93cyBgbm8tbmV4 dC1tZXRob2QnIGJ5IGRlZmF1bHQuICBPdmVycmlkZSB0aGlzCm1ldGhvZCB0byBub3QgdGhyb3cg YW4gZXJyb3IsIGFuZCBpdCdzIHJldHVybiB2YWx1ZSBiZWNvbWVzIHRoZQpyZXR1cm4gdmFsdWUg b2YgYGNhbGwtbmV4dC1tZXRob2QnLiIKICAoc2lnbmFsICduby1uZXh0LW1ldGhvZCAobGlzdCAo b2JqZWN0LW5hbWUgb2JqZWN0KSBhcmdzKSkKKQoKKGRlZm1ldGhvZCBjbG9uZSAoKG9iaiBlaWVp by1kZWZhdWx0LXN1cGVyY2xhc3MpICZyZXN0IHBhcmFtcykKICAiTWFrZSBhIGRlZXAgY29weSBv ZiBPQkosIGFuZCB0aGVuIGFwcGx5IFBBUkFNUy4KUEFSQU1TIGlzIGEgcGFyYW1ldGVyIGxpc3Qg b2YgdGhlIHNhbWUgZm9ybSBhcyBJTklUSUFMSVpFLUlOU1RBTkNFCndoaWNoIGFyZSBhcHBsaWVk IHRvIGNoYW5nZSB0aGUgb2JqZWN0LiAgV2hlbiBvdmVybG9hZGluZyBgY2xvbmUnLCBiZQpzdXJl IHRvIGNhbGwgYGNhbGwtbmV4dC1tZXRob2QnIGZpcnN0IGFuZCBtb2RpZnkgdGhlIHJldHVybmVk IG9iamVjdC4iCiAgKGxldCAoKG5vYmogKGNvcHktc2VxdWVuY2Ugb2JqKSkKCShubSAoYXJlZiBv Ymogb2JqZWN0LW5hbWUpKQoJKHBhc3NuYW1lIChhbmQgcGFyYW1zIChzdHJpbmdwIChjYXIgcGFy YW1zKSkpKQoJKG51bSAxKSkKICAgIChpZiBwYXJhbXMgKHNoYXJlZC1pbml0aWFsaXplIG5vYmog KGlmIHBhc3NuYW1lIChjZHIgcGFyYW1zKSBwYXJhbXMpKSkKICAgIChpZiAobm90IHBhc3NuYW1l KQoJKHNhdmUtbWF0Y2gtZGF0YQoJICAoaWYgKHN0cmluZy1tYXRjaCAiLVxcKFswLTldK1xcKSIg bm0pCgkgICAgICAoc2V0cSBudW0gKDErIChzdHJpbmctdG8tbnVtYmVyIChtYXRjaC1zdHJpbmcg MSBubSkpKQoJCSAgICBubSAoc3Vic3RyaW5nIG5tIDAgKG1hdGNoLWJlZ2lubmluZyAwKSkpKQoJ ICAoYXNldCBub2JqIG9iamVjdC1uYW1lIChjb25jYXQgbm0gIi0iIChpbnQtdG8tc3RyaW5nIG51 bSkpKSkKICAgICAgKGFzZXQgbm9iaiBvYmplY3QtbmFtZSAoY2FyIHBhcmFtcykpKQogICAgbm9i aikpCgooZGVmbWV0aG9kIGRlc3RydWN0b3IgKCh0aGlzIGVpZWlvLWRlZmF1bHQtc3VwZXJjbGFz cykgJnJlc3QgcGFyYW1zKQogICJEZXN0cnVjdG9yIGZvciBjbGVhbmluZyB1cCBhbnkgZHluYW1p YyBsaW5rcyB0byBvdXIgb2JqZWN0LgpBcmd1bWVudCBUSElTIGlzIHRoZSBvYmplY3QgYmVpbmcg ZGVzdHJveWVkLiAgUEFSQU1TIGFyZSBhZGRpdGlvbmFsCmlnbm9yZWQgcGFyYW1ldGVycy4iCiAg OzsgTm8gY2xlYW51cC4uLiB5ZXQuCiAgKQoKKGRlZm1ldGhvZCBvYmplY3QtcHJpbnQgKCh0aGlz IGVpZWlvLWRlZmF1bHQtc3VwZXJjbGFzcykgJnJlc3Qgc3RyaW5ncykKICAiUHJldHR5IHByaW50 ZXIgZm9yIG9iamVjdCBUSElTLiAgQ2FsbCBmdW5jdGlvbiBgb2JqZWN0LW5hbWUnIHdpdGggU1RS SU5HUy4KVGhlIGRlZmF1bHQgbWV0aG9kIGZvciBwcmludGluZyBvYmplY3QgVEhJUyBpcyB0byB1 c2UgdGhlCmZ1bmN0aW9uIGBvYmplY3QtbmFtZScuICBBdCB0aW1lcyBpdCBjb3VsZCBiZSB1c2Vm dWwgdG8gcHV0IGEgc3VtbWFyeQpvZiB0aGUgb2JqZWN0IGludG8gdGhlIGRlZmF1bHQgIzxub3Rh dGlvbj4gc3RyaW5nLiAgT3ZlcmxvYWQgdGhpcwpmdW5jdGlvbiB0byBhbGxvdyBzdW1tYXJpZXMg b2YgeW91ciBvYmplY3RzIHRvIGJlIHVzZWQgYnkgZWllaW8KYnJvd3NpbmcgdG9vbHMuICBUaGUg b3B0aW9uYWwgcGFyYW1ldGVyIFNUUklOR1MgaXMgZm9yIGFkZGl0aW9uYWwKc3VtbWFyeSBwYXJ0 cyB0byBwdXQgaW50byB0aGUgbmFtZSBzdHJpbmcuICBXaGVuIHBhc3NpbmcgaW4gZXh0cmEKc3Ry aW5ncyBmcm9tIGNoaWxkIGNsYXNzZXMsIGFsd2F5cyByZW1lbWJlciB0byBwcmVwZW5kIGEgc3Bh Y2UuIgogIChvYmplY3QtbmFtZSB0aGlzIChhcHBseSAnY29uY2F0IHN0cmluZ3MpKSkKCihkZWZ2 YXIgZWllaW8tcHJpbnQtZGVwdGggMAogICJXaGVuIHByaW50aW5nLCBrZWVwIHRyYWNrIG9mIHRo ZSBjdXJyZW50IGluZGVudGF0aW9uIGRlcHRoLiIpCgooZGVmbWV0aG9kIG9iamVjdC13cml0ZSAo KHRoaXMgZWllaW8tZGVmYXVsdC1zdXBlcmNsYXNzKSAmb3B0aW9uYWwgY29tbWVudCkKICAiV3Jp dGUgb2JqZWN0IFRISVMgb3V0IHRvIHRoZSBjdXJyZW50IHN0cmVhbS4KVGhpcyB3cml0ZXMgb3V0 IHRoZSB2ZWN0b3IgdmVyc2lvbiBvZiB0aGlzIG9iamVjdC4gIENvbXBsZXggYW5kIHJlY3Vyc2l2 ZQpvYmplY3QgYXJlIGRpc2NvdXJhZ2VkIGZyb20gYmVpbmcgd3JpdHRlbi4KICBJZiBvcHRpb25h bCBDT01NRU5UIGlzIG5vbi1uaWwsIGluY2x1ZGUgY29tbWVudHMgd2hlbiBvdXRwdXR0aW5nCnRo aXMgb2JqZWN0LiIKICAod2hlbiBjb21tZW50CiAgICAocHJpbmMgIjs7IE9iamVjdCAiKQogICAg KHByaW5jIChvYmplY3QtbmFtZS1zdHJpbmcgdGhpcykpCiAgICAocHJpbmMgIlxuIikKICAgIChw cmluYyBjb21tZW50KQogICAgKHByaW5jICJcbiIpKQogIChsZXQqICgoY2wgKG9iamVjdC1jbGFz cyB0aGlzKSkKCSAoY3YgKGNsYXNzLXYgY2wpKSkKICAgIDs7IE5vdyBvdXRwdXQgcmVhZGFibGUg bGlzcCB0byByZWNyZWF0ZSB0aGlzIG9iamVjdAogICAgOzsgSXQgc2hvdWxkIGxvb2sgbGlrZSB0 aGlzOgogICAgOzsgKDxjb25zdHJ1Y3Rvcj4gPG5hbWU+IDxzbG90PiA8ZmllbGQ+IC4uLiApCiAg ICA7OyBFYWNoIHNsb3QncyBmaWVsZCBpcyB3cml0ZW4gdXNpbmcgaXRzIDp3cml0ZXIuCiAgICAo cHJpbmMgKG1ha2Utc3RyaW5nICgqIGVpZWlvLXByaW50LWRlcHRoIDIpID8gKSkKICAgIChwcmlu YyAiKCIpCiAgICAocHJpbmMgKHN5bWJvbC1uYW1lIChjbGFzcy1jb25zdHJ1Y3RvciAob2JqZWN0 LWNsYXNzIHRoaXMpKSkpCiAgICAocHJpbmMgIiBcIiIpCiAgICAocHJpbmMgKG9iamVjdC1uYW1l LXN0cmluZyB0aGlzKSkKICAgIChwcmluYyAiXCJcbiIpCiAgICA7OyBMb29wIG92ZXIgYWxsIHRo ZSBwdWJsaWMgc2xvdHMKICAgIChsZXQgKChwdWJsYSAoYXJlZiBjdiBjbGFzcy1wdWJsaWMtYSkp CgkgIChwdWJsZCAoYXJlZiBjdiBjbGFzcy1wdWJsaWMtZCkpCgkgIChlaWVpby1wcmludC1kZXB0 aCAoMSsgZWllaW8tcHJpbnQtZGVwdGgpKSkKICAgICAgKHdoaWxlIHB1YmxhCgkod2hlbiAoc2xv dC1ib3VuZHAgdGhpcyAoY2FyIHB1YmxhKSkKCSAgKGxldCAoKGkgKGNsYXNzLXNsb3QtaW5pdGFy ZyBjbCAoY2FyIHB1YmxhKSkpCgkJKHYgKGVpZWlvLW9yZWYgdGhpcyAoY2FyIHB1YmxhKSkpKQoJ ICAgICh1bmxlc3MgKG9yIChub3QgaSkgKGVxdWFsIHYgKGNhciBwdWJsZCkpKQoJICAgICAgKHBy aW5jIChtYWtlLXN0cmluZyAoKiBlaWVpby1wcmludC1kZXB0aCAyKSA/ICkpCgkgICAgICAocHJp bmMgKHN5bWJvbC1uYW1lIGkpKQoJICAgICAgKHByaW5jICIgIikKCSAgICAgIChlaWVpby1vdmVy cmlkZS1wcmluMSB2KQoJICAgICAgKHByaW5jICJcbiIpKSkpCgkoc2V0cSBwdWJsYSAoY2RyIHB1 YmxhKSBwdWJsZCAoY2RyIHB1YmxkKSkpCiAgICAgIChwcmluYyAobWFrZS1zdHJpbmcgKCogZWll aW8tcHJpbnQtZGVwdGggMikgPyApKSkKICAgIChwcmluYyAiKVxuIikpKQoKKGRlZnVuIGVpZWlv LW92ZXJyaWRlLXByaW4xICh0aGluZykKICAiUGVyZm9ybSBhIHByaW4xIG9uIFRISU5HIHRha2lu ZyBhZHZhbnRhZ2Ugb2Ygb2JqZWN0IGtub3dsZWRnZS4iCiAgKGNvbmQgKChvYmplY3QtcCB0aGlu ZykKCSAob2JqZWN0LXdyaXRlIHRoaW5nKSkKCSgobGlzdHAgdGhpbmcpCgkgKGVpZWlvLWxpc3Qt cHJpbjEgdGhpbmcpKQoJKChjbGFzcy1wIHRoaW5nKQoJIChwcmluYyAoY2xhc3MtbmFtZSB0aGlu ZykpKQoJKChzeW1ib2xwIHRoaW5nKQoJIChwcmluYyAoY29uY2F0ICInIiAoc3ltYm9sLW5hbWUg dGhpbmcpKSkpCgkodCAocHJpbjEgdGhpbmcpKSkpCgooZGVmdW4gZWllaW8tbGlzdC1wcmluMSAo bGlzdCkKICAiRGlzcGxheSBMSVNUIHdoZXJlIGxpc3QgbWF5IGNvbnRhaW4gb2JqZWN0cy4iCiAg KGlmIChub3QgKG9iamVjdC1wIChjYXIgbGlzdCkpKQogICAgICAocHJvZ24KCShwcmluYyAiJyIp CgkocHJpbjEgbGlzdCkpCiAgICAocHJpbmMgIihsaXN0ICIpCiAgICAoaWYgKG9iamVjdC1wIChj YXIgbGlzdCkpIChwcmluYyAiXG4gIikpCiAgICAod2hpbGUgbGlzdAogICAgICAoaWYgKG9iamVj dC1wIChjYXIgbGlzdCkpCgkgIChvYmplY3Qtd3JpdGUgKGNhciBsaXN0KSkKCShwcmluYyAiJyIp CgkocHJpbjEgKGNhciBsaXN0KSkpCiAgICAgIChwcmluYyAiICIpCiAgICAgIChzZXRxIGxpc3Qg KGNkciBsaXN0KSkpCiAgICAocHJpbmMgKG1ha2Utc3RyaW5nICgqIGVpZWlvLXByaW50LWRlcHRo IDIpID8gKSkKICAgIChwcmluYyAiKSIpKSkKCgwKOzs7IFVuaW1wbGVtZW50ZWQgZnVuY3Rpb25z IGZyb20gQ0xPUwo7OwooZGVmdW4gY2hhbmdlLWNsYXNzIChvYmogY2xhc3MpCiAgIkNoYW5nZSB0 aGUgY2xhc3Mgb2YgT0JKIHRvIHR5cGUgQ0xBU1MuClRoaXMgbWF5IGNyZWF0ZSBvciBkZWxldGUg c2xvdHMsIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHJldHVybiB2YWx1ZQpvZiBgZXEnLiIKICAo ZXJyb3IgIkVpZWlvOiBgY2hhbmdlLWNsYXNzJyBpcyB1bmltcGxlbWVudGVkIikpCgopCgoMCjs7 OyBJbnRlcmZhY2luZyB3aXRoIGVkZWJ1Zwo7OwooZGVmdW4gZWllaW8tZWRlYnVnLXByaW4xLXRv LXN0cmluZyAob2JqZWN0ICZvcHRpb25hbCBub2VzY2FwZSkKICAiRGlzcGxheSBlaWVpbyBPQkpF Q1QgaW4gZmFuY3kgZm9ybWF0LiAgT3ZlcnJpZGVzIHRoZSBlZGVidWcgZGVmYXVsdC4KT3B0aW9u YWwgYXJndW1lbnQgTk9FU0NBUEUgaXMgcGFzc2VkIHRvIGBwcmluMS10by1zdHJpbmcnIHdoZW4g YXBwcm9wcmlhdGUuIgogIChjb25kICgoY2xhc3MtcCBvYmplY3QpIChjbGFzcy1uYW1lIG9iamVj dCkpCgkoKG9iamVjdC1wIG9iamVjdCkgKG9iamVjdC1wcmludCBvYmplY3QpKQoJKChhbmQgKGxp c3RwIG9iamVjdCkgKG9yIChjbGFzcy1wIChjYXIgb2JqZWN0KSkKCQkJCSAob2JqZWN0LXAgKGNh ciBvYmplY3QpKSkpCgkgKGNvbmNhdCAiKCIgKG1hcGNvbmNhdCAnZWllaW8tZWRlYnVnLXByaW4x LXRvLXN0cmluZyBvYmplY3QgIiAiKSAiKSIpKQoJKHQgKHByaW4xLXRvLXN0cmluZyBvYmplY3Qg bm9lc2NhcGUpKSkpCgooYWRkLWhvb2sgJ2VkZWJ1Zy1zZXR1cC1ob29rCgkgIChsYW1iZGEgKCkK CSAgICAoZGVmLWVkZWJ1Zy1zcGVjIGRlZm1ldGhvZAoJICAgICAgKCZkZWZpbmUJCQk7IHRoaXMg bWVhbnMgd2UgYXJlIGRlZmluaW5nIHNvbWV0aGluZwoJICAgICAgIFsmb3IgbmFtZSAoInNldGYi IDpuYW1lIHNldGYgbmFtZSldCgkgICAgICAgOzsgXl4gVGhpcyBpcyB0aGUgbWV0aG9kcyBzeW1i b2wKCSAgICAgICBbICZvcHRpb25hbCBzeW1ib2xwIF0gICAgOyB0aGlzIGlzIGtleSA6QkVGT1JF IGV0YwoJICAgICAgIGxpc3QgICAgICAgICAgICAgIDsgYXJndW1lbnRzCgkgICAgICAgWyAmb3B0 aW9uYWwgc3RyaW5ncCBdICAgIDsgZG9jdW1lbnRhdGlvbiBzdHJpbmcKCSAgICAgICBkZWYtYm9k eQkgICAgICAgICAgICAgICAgOyBwYXJ0IHRvIGJlIGRlYnVnZ2VkCgkgICAgICAgKSkKCSAgICA7 OyBUaGUgcmVzdCBvZiB0aGUgbWFjcm9zCgkgICAgKGRlZi1lZGVidWctc3BlYyBvcmVmIChmb3Jt IHF1b3RlKSkKCSAgICAoZGVmLWVkZWJ1Zy1zcGVjIG9yZWYtZGVmYXVsdCAoZm9ybSBxdW90ZSkp CgkgICAgKGRlZi1lZGVidWctc3BlYyBvc2V0IChmb3JtIHF1b3RlIGZvcm0pKQoJICAgIChkZWYt ZWRlYnVnLXNwZWMgb3NldC1kZWZhdWx0IChmb3JtIHF1b3RlIGZvcm0pKQoJICAgIChkZWYtZWRl YnVnLXNwZWMgY2xhc3MtdiBmb3JtKQoJICAgIChkZWYtZWRlYnVnLXNwZWMgY2xhc3MtcCBmb3Jt KQoJICAgIChkZWYtZWRlYnVnLXNwZWMgb2JqZWN0LXAgZm9ybSkKCSAgICAoZGVmLWVkZWJ1Zy1z cGVjIGNsYXNzLWNvbnN0cnVjdG9yIGZvcm0pCgkgICAgKGRlZi1lZGVidWctc3BlYyBnZW5lcmlj LXAgZm9ybSkKCSAgICAoZGVmLWVkZWJ1Zy1zcGVjIHdpdGgtc2xvdHMgKGxpc3QgbGlzdCBkZWYt Ym9keSkpCgkgICAgOzsgSSBzdXNwZWN0IHRoaXMgaXNuJ3QgdGhlIGJlc3Qgd2F5IHRvIGRvIHRo aXMsIGJ1dCB3aGVuCgkgICAgOzsgY3VzdC1wcmludCB3YXMgdXNlZCBvbiBteSBzeXN0ZW0gYWxs IG15IG9iamVjdHMKCSAgICA7OyBhcHBlYXJlZCBhcyAiIzEgPSIgd2hpY2ggd2FzIG5vdCB1c2Vm dWwuICBUaGlzIGFsbG93cwoJICAgIDs7IGVkZWJ1ZyB0byBwcmludCBteSBvYmplY3RzIGluIHRo ZSBuaWNlIHdheSB0aGV5IHdlcmUKCSAgICA7OyBtZWFudCB0byB3aXRoIGBvYmplY3QtcHJpbnQn IGFuZCBgY2xhc3MtbmFtZScKCSAgICA7OyAoZGVmYWxpYXMgJ2VkZWJ1Zy1wcmluMS10by1zdHJp bmcgJ2VpZWlvLWVkZWJ1Zy1wcmluMS10by1zdHJpbmcpCgkgICAgKQoJICApCgooZXZhbC1hZnRl ci1sb2FkICJjZWRldC1lZGVidWciCiAgJyhwcm9nbgogICAgIChjZWRldC1lZGVidWctYWRkLXBy aW50LW92ZXJyaWRlICcoY2xhc3MtcCBvYmplY3QpICcoY2xhc3MtbmFtZSBvYmplY3QpICkKICAg ICAoY2VkZXQtZWRlYnVnLWFkZC1wcmludC1vdmVycmlkZSAnKG9iamVjdC1wIG9iamVjdCkgJyhv YmplY3QtcHJpbnQgb2JqZWN0KSApCiAgICAgKGNlZGV0LWVkZWJ1Zy1hZGQtcHJpbnQtb3ZlcnJp ZGUgJyhhbmQgKGxpc3RwIG9iamVjdCkKCQkJCQkgICAgKG9yIChjbGFzcy1wIChjYXIgb2JqZWN0 KSkgKG9iamVjdC1wIChjYXIgb2JqZWN0KSkpKQoJCQkJICAgICAgJyhjZWRldC1lZGVidWctcHJp bjEtcmVjdXJzZSBvYmplY3QpICkKICAgICApKQoKOzs7IEludGVyZmFjaW5nIHdpdGggaW1lbnUg aW4gZW1hY3MgbGlzcCBtb2RlCjs7ICAgIChPbmx5IGlmIHRoZSBleHByZXNzaW9uIGlzIGRlZmlu ZWQpCjs7CihpZiAoZXZhbC13aGVuLWNvbXBpbGUgKGJvdW5kcCAnbGlzdC1pbWVudS1nZW5lcmlj LWV4cHJlc3Npb24pKQoocHJvZ24KCihkZWZ1biBlaWVpby11cGRhdGUtbGlzcC1pbWVudS1leHBy ZXNzaW9uICgpCiAgIkV4YW1pbmUgYGxpc3AtaW1lbnUtZ2VuZXJpYy1leHByZXNzaW9uJyBhbmQg bW9kaWZ5IGl0IHRvIGZpbmQgYGRlZm1ldGhvZCcuIgogIChsZXQgKChleHAgbGlzcC1pbWVudS1n ZW5lcmljLWV4cHJlc3Npb24pKQogICAgKHdoaWxlIGV4cAogICAgICA7OyBpdCdzIG9mIHRoZSBm b3JtICcoICggdGl0bGUgZXhwciBpbmR4ICkgLi4uICkKICAgICAgKGxldCogKChzdWJjYXIgKGNk ciAoY2FyIGV4cCkpKQoJICAgICAoc3Vic3RyIChjYXIgc3ViY2FyKSkpCgkoaWYgKGFuZCAobm90 IChzdHJpbmctbWF0Y2ggInxtZXRob2RcXFxcIiBzdWJzdHIpKQoJCSAoc3RyaW5nLW1hdGNoICJ8 YWR2aWNlXFxcXCIgc3Vic3RyKSkKCSAgICAoc2V0Y2FyIHN1YmNhcgoJCSAgICAocmVwbGFjZS1t YXRjaCAifGFkdmljZVxcfG1ldGhvZFxcIiB0IHQgc3Vic3RyIDApKSkpCiAgICAgIChzZXRxIGV4 cCAoY2RyIGV4cCkpKSkpCgooZWllaW8tdXBkYXRlLWxpc3AtaW1lbnUtZXhwcmVzc2lvbikKCikp Cgo7OzsgQXV0b2xvYWRpbmcgc29tZSBleHRlcm5hbCBzeW1ib2xzLCBhbmQgaG9va2luZyBpbnRv IHRoZSBoZWxwIHN5c3RlbQo7OwoKKGF1dG9sb2FkICdlaWVpby1oZWxwLW1vZGUtYXVnbWVudGF0 aW9uLW1heWJlZSAiZWllaW8tb3B0IiAiRm9yIGJ1ZmZlcnMgdGhyb3duIGludG8gaGVscCBtb2Rl LCBhdWdtZW50IGZvciBlaWVpby4iKQooYXV0b2xvYWQgJ2VpZWlvLWJyb3dzZSAiZWllaW8tb3B0 IiAiQ3JlYXRlIGFuIG9iamVjdCBicm93c2VyIHdpbmRvdyIgdCkKKGF1dG9sb2FkICdlaWVpby1k ZXNjcmliZS1jbGFzcyAiZWllaW8tb3B0IiAiRGVzY3JpYmUgQ0xBU1MgZGVmaW5lZCBieSBhIHN0 cmluZyBvciBzeW1ib2wiIHQpCihhdXRvbG9hZCAnZGVzY3JpYmUtY2xhc3MgImVpZWlvLW9wdCIg IkRlc2NyaWJlIENMQVNTIGRlZmluZWQgYnkgYSBzdHJpbmcgb3Igc3ltYm9sIiB0KQooYXV0b2xv YWQgJ2VpZWlvLWRlc2NyaWJlLWdlbmVyaWMgImVpZWlvLW9wdCIgIkRlc2NyaWJlIEdFTkVSSUMg ZGVmaW5lZCBieSBhIHN0cmluZyBvciBzeW1ib2wiIHQpCihhdXRvbG9hZCAnZGVzY3JpYmUtZ2Vu ZXJpYyAiZWllaW8tb3B0IiAiRGVzY3JpYmUgR0VORVJJQyBkZWZpbmVkIGJ5IGEgc3RyaW5nIG9y IHN5bWJvbCIgdCkKKGF1dG9sb2FkICdlaWVpb2RvYy1jbGFzcyAiZWllaW8tZG9jIiAiQ3JlYXRl IHRleGluZm8gZG9jdW1lbnRhdGlvbiBhYm91dCBhIGNsYXNzIGhpZXJhcmNoeS4iIHQpCgooYXV0 b2xvYWQgJ2N1c3RvbWl6ZS1vYmplY3QgImVpZWlvLWN1c3RvbSIgIkNyZWF0ZSBhIGN1c3RvbSBi dWZmZXIgZWRpdGluZyBPQkouIikKCjs7IG1ha2Ugc3VyZSB0aGlzIHNob3dzIHVwIGFmdGVyIHRo ZSBoZWxwIG1vZGUgaG9vay4KKGFkZC1ob29rICd0ZW1wLWJ1ZmZlci1zaG93LWhvb2sgJ2VpZWlv LWhlbHAtbW9kZS1hdWdtZW50YXRpb24tbWF5YmVlIHQpCihyZXF1aXJlICdhZHZpY2UpCihkZWZh ZHZpY2UgZGVzY3JpYmUtdmFyaWFibGUgKGFyb3VuZCBlaWVpby1kZXNjcmliZSBhY3RpdmF0ZSkK ICAiRGlzcGxheSB0aGUgZnVsbCBkb2N1bWVudGF0aW9uIG9mIEZVTkNUSU9OIChhIHN5bWJvbCku ClJldHVybnMgdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJpbmcsIGFsc28uIgogIChpZiAoY2xh c3MtcCAoYWQtZ2V0LWFyZyAwKSkKICAgICAgKGVpZWlvLWRlc2NyaWJlLWNsYXNzIChhZC1nZXQt YXJnIDApKQogICAgYWQtZG8taXQpKQoKKGRlZmFkdmljZSBkZXNjcmliZS1mdW5jdGlvbiAoYXJv dW5kIGVpZWlvLWRlc2NyaWJlIGFjdGl2YXRlKQogICJEaXNwbGF5IHRoZSBmdWxsIGRvY3VtZW50 YXRpb24gb2YgVkFSSUFCTEUgKGEgc3ltYm9sKS4KUmV0dXJucyB0aGUgZG9jdW1lbnRhdGlvbiBh cyBhIHN0cmluZywgYWxzby4iCiAgKGlmIChnZW5lcmljLXAgKGFkLWdldC1hcmcgMCkpCiAgICAg IChlaWVpby1kZXNjcmliZS1nZW5lcmljIChhZC1nZXQtYXJnIDApKQogICAgYWQtZG8taXQpKQoK KHByb3ZpZGUgJ2VpZWlvKQo7OzsgZWllaW8gZW5kcyBoZXJlCg== ----Next_Part(Sat_Jun_30_22_58_10_2007_759)-- Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ ----Next_Part(Sat_Jun_30_22_58_10_2007_759)-- Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ cedet-eieio mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/cedet-eieio ----Next_Part(Sat_Jun_30_22_58_10_2007_759)----