IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSIiICAgICAgICAgICAgICAgICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzciAtLXN5c2NvbmZkaXI9L2V0YwpwcmVmaXg9L3Vzci9sb2NhbCAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbiBwcmVmaXgKc3lzY29uZmRpcj0kcHJlZml4L2V0YyAgICAgICAgIyB3aGVyZSB3aW5lLmNvbmYgYW5kIHRoZSBnbG9iYWwgcmVnaXN0cnkgYXJlIHN1cHBvc2VkIHRvIGJlCmJpbmRpcj0kcHJlZml4L2JpbiAgICAgICAgICAgICMgd2hlcmUgd2luZWxpYiBhcHBzIHdpbGwgYmUgKG9yIGFyZSkgaW5zdGFsbGVkCmxpYmRpcj0kcHJlZml4L2xpYiAgICAgICAgICAgICMgd2hlcmUgbGlid2luZS5zbyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmV4ZGlyPWRvY3VtZW50YXRpb24vc2FtcGxlcyAgICMgd2hlcmUgdGhlIHNhbXBsZSBzeXN0ZW0uaW5pIHJlc2lkZXMKR0NPTkY9JHN5c2NvbmZkaXIvd2luZS5jb25mICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIHdpbmUuY29uZiBnbG9iYWwgY29uZmlnIGZpbGUKTENPTkY9fi8ud2luZS9jb25maWcgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGxvY2FsIGNvbmZpZyBmaWxlCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9HTE9CQUxDT05GPWF1dG8gICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB3aW5lLmNvbmYKRE9MT0NBTENPTkY9YXV0byAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSBsb2NhbGNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpET0FQUD1hdXRvICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gaW5zdGFsbCBhcHBsaWNhdGlvbnMsIGRpc3RyaWJ1dGVkIHdpdGggV2luZQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyB0aGlzIGlzIG9ubHkgZm9yIGV4aXN0aW5nLXdpbmRvd3MgaW5zdGFsbHMKV0lORUNPTkY9dG9vbHMvd2luZWNvbmYgICAgICAgIyBwYXRoIHRvIHRoZSB3aW5lY29uZiBwZXJsIHNjcmlwdAoKIyB0aGlzIGlzIG9ubHkgZm9yIG5vLXdpbmRvd3MgaW5zdGFsbHMKV0lORUlOST0kZXhkaXIvY29uZmlnICAgICAgICAgIyBwYXRoIHRvIHRoZSBkZWZhdWx0IHdpbmUgY29uZmlnIGZpbGUgKGFsc28gdXNlZCBieSB3aW5lY29uZikKV0lOSU5JPS9kZXYvbnVsbCAgICAgICAgICAgICAgIyBwYXRoIHRvIHRoZSBkZWZhdWx0IHdpbi5pbmkKU1lTVEVNSU5JPSRleGRpci9zeXN0ZW0uaW5pICAgIyBwYXRoIHRvIHRoZSBkZWZhdWx0IHN5c3RlbS5pbmkKUkVHRURJVD1wcm9ncmFtcy9yZWdlZGl0L3JlZ2VkaXQgICAgICAgIyBwYXRoIHRvIHRoZSByZWdlZGl0IHdpbmVsaWIgYXBwbGljYXRpb24KREVGUkVHPXdpbmVkZWZhdWx0LnJlZyAgICAgICAgIyBwYXRoIG9mIHRoZSByZWdpc3RyeSBmaWxlIHRvIGJlIGZlZCB0byByZWdlZGl0CiMgQ1JPT1Q9L3Zhci93aW5lICAgICAgICAgICAgICMgcGF0aCBvZiB0aGUgZmFrZSBEcml2ZSBDIChhc2tzIHVzZXIgaWYgbm90IHNldCkKREVGQ0FUPWNhdCAgICAgICAgICAgICAgICAgICAgIyBwcm9ncmFtIHRvIGNhdCAkREVGUkVHIHdpdGggKHNvbWUgcGFja2FnZXMgbmVlZCB6Y2F0KQojLS0tIGVuZCBvZiBkZWZhdWx0cwoKIyB0ZW1wb3JhcnkgZmlsZXMgdXNlZCBieSB0aGUgaW5zdGFsbGVyClRNUENPTkY9L3RtcC93aW5laW5zdGFsbC5jb25mCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gc3RkX3NsZWVwIHsKICBzbGVlcCAxCn0KCmZ1bmN0aW9uIGNvbmZfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBpbXBvcnRhbmNlLCAkMiA9IHF1ZXN0aW9uLWlkLCAkMysgPSBtZXNzYWdlIGxpbmVzCiAgIyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgYnkgZS5nLiBkZWJjb25mIGluIGRlYmlhbiBwYWNrYWdlcwogICMgYnV0IGhlcmUgd2UganVzdCBwcmludCB0aGUgbWVzc2FnZQogIHNoaWZ0IDIKICBlY2hvCiAgbG9jYWwgTElORT0iJDEiCiAgd2hpbGUgc2hpZnQKICBkbyB7CiAgICBlY2hvICIkTElORSIKICAgIExJTkU9IiQxIgogIH0KICBkb25lCn0KCmZ1bmN0aW9uIGNvbmZfcmVzZXRfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBxdWVzdGlvbi1pZAogICMgdGhpcyBpcyB1c2VkIHRvIGZsdXNoIGFueSBjYWNoZWQgYW5zd2VycyBhbmQgImFscmVhZHktZGlzcGxheWVkIiBmbGFncwogIHNoaWZ0ICMgZHVtbXkgY29tbWFuZAp9CgpmdW5jdGlvbiBjb25mX3llc25vX2Fuc3dlciB7CiAgdW5zZXQgQU5TV0VSCiAgd2hpbGUgWyAiJEFOU1dFUiIgIT0gJ3llcycgXSAmJiBbICIkQU5TV0VSIiAhPSAnbm8nIF0KICBkbyB7CiAgICBlY2hvIC1uICIkMSIKICAgIHJlYWQgQU5TV0VSCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9zdHJpbmdfYW5zd2VyIHsKICBlY2hvIC1uICIkMSIKICByZWFkIEFOU1dFUgp9CgpmdW5jdGlvbiBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcyB7CiAgZm9yIHRkaXIgaW4gIiRDUk9PVC93aW5kb3dzIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL2NvbW1hbmQiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL1Byb2dyYW0gRmlsZXMiICIkQ1JPT1QvUHJvZ3JhbSBGaWxlcy9Db21tb24gRmlsZXMiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMiICIkQ1JPT1Qvd2luZG93cy9Qcm9maWxlcy9BZG1pbmlzdHJhdG9yIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL0ZvbnRzIiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcy9TdGFydHVwIgogIGRvIFsgLWQgIiR0ZGlyIiBdIHx8IG1rZGlyICIkdGRpciIKICBkb25lCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvd2luLmluaSIgXSAgICB8fCBjcCAiJFdJTklOSSIgICAgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmluaSIgXSB8fCBjcCAiJFNZU1RFTUlOSSIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiCn0KCiNjcmVhdGVzIHN5bWJvbGljIGxpbmsgaW4gd2luZG93cyBkaXJlY3RvcnkgdG8gaW5zdGFsbGVkIHdpbmVsaWIgYXBwbGljYXRpb24KI3BhcmFtZXRlcnM6CiMgLSBuYW1lIG9mIHRoZSBpbnN0YWxsZWQgd2luZWxpYiBhcHBsaWNhdGlvbgojIC0gZnVsbCBwYXRoIHRvIGFwcGxpY2F0aW9uIGluIHRoZSB3aW5lbGliIGRpcmVjdG9yeQpmdW5jdGlvbiBsaW5rX2FwcCB7CiAgaWYgWyAiJFdJTkVJTlNUQUxMRUQiID0gJ25vJyBdCiAgdGhlbiB7CiAgICBsbiAtc2YgJFBXRC9wcm9ncmFtcy8kMS8kMS5leGUuc28gJDIKICB9CiAgZWxzZSB7CiAgICBsbiAtc2YgJGxpYmRpci93aW5lLyQxLmV4ZS5zbyAkMgogIH0KICBmaQp9CgojcHV0cyB3aW5kb3dzIGFwcGxpY2F0aW9ucyByZXBsYWNlbWVudHMgdG8gd2luZG93cyBkaXJlY3RvcmllcywKI2NvbmZpZ3VyZXMgdGhlbQpmdW5jdGlvbiBjb25maWd1cmVfd2luZV9hcHBsaWNhdGlvbnMgewogIGxpbmtfYXBwIHN0YXJ0ICAgICAgICAiJENST09UL3dpbmRvd3MvY29tbWFuZC9zdGFydC5leGUiCiAgbGlua19hcHAgbm90ZXBhZCAgICAgICIkQ1JPT1Qvd2luZG93cy9ub3RlcGFkLmV4ZSIKICBsaW5rX2FwcCByZWdlZGl0ICAgICAgIiRDUk9PVC93aW5kb3dzL3JlZ2VkaXQuZXhlIgogIGxpbmtfYXBwIHJ1bmRsbDMyICAgICAiJENST09UL3dpbmRvd3MvcnVuZGxsMzIuZXhlIgogIGxpbmtfYXBwIHdjbWQgICAgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3djbWQuZXhlIgogIGxpbmtfYXBwIGNvbnRyb2wgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL2NvbnRyb2wuZXhlIgogIGxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL2hlbHAuZXhlIgogIGxpbmtfYXBwIG5vdGVwYWQgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL25vdGVwYWQuZXhlIgogIGxpbmtfYXBwIHByb2dtYW4gICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3Byb2dtYW4uZXhlIgogIGxpbmtfYXBwIHJlZ3N2cjMyICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3JlZ3N2cjMyLmV4ZSIKICBsaW5rX2FwcCB3aW5lbWluZSAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS93aW5taW5lLmV4ZSIKICBsaW5rX2FwcCB3aW52ZXIgICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS93aW52ZXIuZXhlIgogIGxpbmtfYXBwIHVuaW5zdGFsbGVyICAiJENST09UL3dpbmRvd3MvdW5pbnN0YWxsLmV4ZSIKICBsaW5rX2FwcCB3aW5oZWxwICAgICAgIiRDUk9PVC93aW5kb3dzL3dpbmhlbHAuZXhlIgogIGxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvd2luaGxwMzIuZXhlIgp9CgojIHN0YXJ0dXAuLi4KCmVjaG8gIldJTkUgSW5zdGFsbGVyIHYwLjc0IgplY2hvCgojIGNoZWNrIGZvciByZWRoYXQgOSB3aXRoIHRscyBsaWJzIHNvIHdlIGNhbiBlbmFibGUgLS13aXRoLW5wdGwgdW50aWwgcnVudGltZSBkZXRlY3Rpb24gaXMgY29tcGxldGUKaWYgWyAtZSAvZXRjL3JlZGhhdC1yZWxlYXNlIF0gJiYgZ3JlcCAiU2hyaWtlIiAvZXRjL3JlZGhhdC1yZWxlYXNlICY+L2Rldi9udWxsICYmIFsgLWUgL2xpYi90bHMgXTsgdGhlbgogICAgQ09ORkFSR1M9IiRDT05GQVJHUyAtLXdpdGgtbnB0bCIKZmkKCmlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQp0aGVuIHsKCiAgaWYgISBbIC1mIGNvbmZpZ3VyZSBdCiAgdGhlbiB7CiAgICBpZiBbIC1mIC4uL2NvbmZpZ3VyZSBdCiAgICB0aGVuIHsKICAgICAgcHVzaGQgLi4KICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICJZb3UncmUgcnVubmluZyB0aGlzIGZyb20gdGhlIHdyb25nIGRpcmVjdG9yeS4iCiAgICAgIGVjaG8gIkNoYW5nZSB0byB0aGUgV2luZSBzb3VyY2UncyBtYWluIGRpcmVjdG9yeSBhbmQgdHJ5IGFnYWluLiIKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogIH0KICBmaQoKICBpZiBbIGB3aG9hbWlgID09ICdyb290JyBdCiAgdGhlbiB7CiAgICBlY2hvICJZb3UgYXJlIHJ1bm5pbmcgd2luZWluc3RhbGwgYXMgcm9vdCwgdGhpcyBpcyBub3QgYWR2aXNhYmxlLiBQbGVhc2UgcmVydW4gYXMgYSB1c2VyLiIKICAgIGVjaG8gIkFib3J0aW5nLiIKICAgIGV4aXQgMQogIH0KICBmaQoKICBpZiBbICEgLXcgLiBdCiAgdGhlbiB7CiAgICBlY2hvICJUaGUgc291cmNlIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUuIFlvdSBwcm9iYWJseSBleHRyYWN0ZWQgdGhlIHNvdXJjZXMgYXMgcm9vdC4iCiAgICBlY2hvICJZb3Ugc2hvdWxkIHJlbW92ZSB0aGUgc291cmNlIHRyZWUgYW5kIGV4dHJhY3QgaXQgYWdhaW4gYXMgYSBub3JtYWwgdXNlci4iCiAgICBleGl0IDEKICB9CiAgZmkKCiAgIyBjaGVjayB3aGV0aGVyIFJQTSBpbnN0YWxsZWQsIGFuZCBpZiBpdCBpcywgcmVtb3ZlIGFueSBvbGQgd2luZSBycG0uCiAgaGFzaCBycG0gJj4vZGV2L251bGwKICBSRVQ9JD8KICBpZiBbICRSRVQgLWVxIDAgXTsgdGhlbgogICAgaWYgWyAtbiAiYHJwbSAtcWkgd2luZSAyPi9kZXYvbnVsbHxncmVwICJeTmFtZSJgIiBdOyB0aGVuCiAgICAgIGVjaG8gIldhcm5pbmc6IE9sZCBXaW5lIFJQTSBpbnN0YWxsIGRldGVjdGVkLiBEbyB5b3Ugd2FudCB0byByZW1vdmUgaXQgZmlyc3Q/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBpZiBbICIkQU5TV0VSIiA9ICd5ZXMnIF07IHRoZW4KICAgICAgICBlY2hvICJXZSBuZWVkIHRvIHJlbW92ZSB0aGUgcnBtIGFzIHJvb3QsIHBsZWFzZSBlbnRlciB5b3VyIHJvb3QgcGFzc3dvcmQiCiAgICAgICAgZWNobwogICAgICAgIGVjaG8gU3RhcnRpbmcgd2luZSBycG0gcmVtb3ZhbC4uLgogICAgICAgIHN1IC1jICJycG0gLWUgd2luZTsgUkVUPSQ/IgogICAgICAgIGlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgICAgICAgICBlY2hvIERvbmUuCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiRkFJTEVELiBQcm9iYWJseSB5b3UgYXJlbid0IGluc3RhbGxpbmcgYXMgcm9vdC4iCiAgICAgICAgICBlY2hvICJFeHBlY3QgcHJvYmxlbXMgKGxpYnJhcnkgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgaW5zdGFsbCBldGMuKS4iCiAgICAgICAgZmkKICAgICAgZWxzZQogICAgICAgIGVjaG8gIlNvcnJ5LCBJIHdvbid0IGluc3RhbGwgV2luZSB3aGVuIGFuIHJwbSB2ZXJzaW9uIGlzIHN0aWxsIGluc3RhbGxlZC4iCiAgICAgICAgZWNobyAiKFdpbmUgc3VwcG9ydCBzdWZmZXJlZCBmcm9tIHdheSB0b28gbWFueSBjb25mbGljdHMgYmV0d2VlbiBSUE0iCiAgICAgICAgZWNobyAiYW5kIHNvdXJjZSBpbnN0YWxscykiCiAgICAgICAgZWNobyAiSGF2ZSBhIG5pY2UgZGF5ICEiCiAgICAgICAgZXhpdCAxCiAgICAgIGZpCiAgICBmaQogIGZpCgogICMgY2hlY2sgd2hldGhlciB3aW5lIGJpbmFyeSBzdGlsbCBhdmFpbGFibGUKICBpZiBbIC1uICJgd2hpY2ggd2luZSAyPi9kZXYvbnVsbHxncmVwICcvd2luZSdgIiBdOyB0aGVuCiAgICBlY2hvICJXYXJuaW5nICEhIHdpbmUgYmluYXJ5IChzdGlsbCkgZm91bmQsIHdoaWNoIG1heSBpbmRpY2F0ZSIKICAgIGVjaG8gImEgKGNvbmZsaWN0aW5nKSBwcmV2aW91cyBpbnN0YWxsYXRpb24uIgogICAgZWNobyAiWW91IG1pZ2h0IHdhbnQgdG8gYWJvcnQgYW5kIHVuaW5zdGFsbCBXaW5lIGZpcnN0LiIKICAgIHN0ZF9zbGVlcAogIGZpCgogICMgcnVuIHRoZSBjb25maWd1cmUgc2NyaXB0LCBpZiBuZWNlc3NhcnkKCiAgaWYgWyAtZiBjb25maWcuY2FjaGUgXSAmJiBbIC1mIE1ha2VmaWxlIF0gJiYgWyBNYWtlZmlsZSAtbnQgY29uZmlndXJlIF0KICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkkgc2VlIHRoYXQgV0lORSBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQsIHNvIEknbGwgc2tpcCB0aGF0LiIKICAgIHN0ZF9zbGVlcAogICAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgICAuIC4vY29uZmlnLmNhY2hlCiAgfQogIGVsc2UgewogICAgZWNobyAiUnVubmluZyBjb25maWd1cmUuLi4iCiAgICBlY2hvCiAgICBpZiAhIC4vY29uZmlndXJlIC1DICRDT05GQVJHUyAtLXByZWZpeD0kcHJlZml4CiAgICB0aGVuIHsKICAgICAgZWNobwogICAgICBlY2hvICJDb25maWd1cmUgZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICAgIGV4aXQgMQogICAgfQogICAgZmkKICAgICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogICAgLiAuL2NvbmZpZy5jYWNoZQogICAgIyBtYWtlIHN1cmUgWCB3YXMgZm91bmQKICAgIGV2YWwgIiRhY19jdl9oYXZlX3giCiAgICBpZiBbICIkaGF2ZV94IiAhPSAieWVzIiBdCiAgICB0aGVuIHsKICAgICAgZWNobyAiSW5zdGFsbCB0aGUgWCBkZXZlbG9wbWVudCBoZWFkZXJzIGFuZCB0cnkgYWdhaW4uIgogICAgICBybSAtZiBjb25maWcuY2FjaGUKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogIH0KICBmaQoKICAjIG5vdyBkbyB0aGUgY29tcGlsYXRpb24gYW5kIGluc3RhbGwsIHdlIG5lZWQgdG8gYWx3YXlzIGRvIHRoaXMgYmVjYXVzZSB3ZQogICMgZG9uJ3Qgd2FudCB0aGUgJ21ha2UgaW5zdGFsbCcgY29tbWFuZCB3ZSBtaWdodCBydW4gdG8gcnVuICdtYWtlJyBhcyByb290CiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gewogICAgIyBhc2sgdGhlIHVzZXIgaWYgdGhleSB3YW50IHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHdpbmUKICAgIGVjaG8KICAgIGVjaG8gIldlIG5lZWQgdG8gaW5zdGFsbCB3aW5lIGFzIHJvb3QgdXNlciwgZG8geW91IHdhbnQgdXMgdG8gYnVpbGQgd2luZSwiCiAgICBlY2hvICInc3Ugcm9vdCcgYW5kIGluc3RhbGwgV2luZT8gIEVudGVyICdubycgdG8gY29udGludWUgd2l0aG91dCBpbnN0YWxsaW5nIgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIFJPT1RJTlNUQUxMPSIkQU5TV0VSIgoKICAgIGlmIFsgIiRST09USU5TVEFMTCIgPSAieWVzIiBdCiAgICB0aGVuIHsKICAgICAgIyBzdGFydCBvdXQgd2l0aCB0aGUgYmFzaWMgY29tbWFuZAogICAgICBzdWNvbW1hbmQ9Im1ha2UgaW5zdGFsbCIKCiAgICAgICMgaWYgdGhlIHVzZXIgZG9lc24ndCBoYXZlICRsaWJkaXIgaW4gdGhlaXIgbGQuc28uY29uZiBhZGQgdGhpcwogICAgICAjIHRvIG91ciBzdWNvbW1hbmQgc3RyaW5nCiAgICAgIGlmIFsgLWYgL2V0Yy9sZC5zby5jb25mIF0KICAgICAgdGhlbgogICAgICAgIGlmICEgZ3JlcCAtcyAiJGxpYmRpciIgL2V0Yy9sZC5zby5jb25mID4vZGV2L251bGwgMj4mMQogICAgICAgIHRoZW4gewogICAgICAgICAgZWNobwogICAgICAgICAgZWNobyAiJGxpYmRpciBkb2Vzbid0IGV4aXN0IGluIHlvdXIgL2V0Yy9sZC5zby5jb25mLCBpdCB3aWxsIGJlIGFkZGVkIgogICAgICAgICAgZWNobyAid2hlbiB3ZSBwZXJmb3JtIHRoZSBpbnN0YWxsLi4uIgogICAgICAgICAgc3Vjb21tYW5kPSIkc3Vjb21tYW5kO2VjaG8gJGxpYmRpcj4+L2V0Yy9sZC5zby5jb25mIgogICAgICAgIH0KICAgICAgICBmaQogICAgICAgICMgcnVuIGxkY29uZmlnIGFsd2F5cyBqdXN0IGluIGNhc2Ugc29tZSB1cGRhdGVkIGZpbGVzIGRvbnQgZ2V0IGxpbmtlZAogICAgICAgIHN1Y29tbWFuZD0iJHN1Y29tbWFuZDskYWNfY3ZfcGF0aF9MRENPTkZJRyIKICAgICAgZmkKICAgIH0KICAgIGZpICMgWyAiJFJPT1RJTlNUQUxMIiA9ICJ5ZXMiIF0KCiAgICBlY2hvCgogICAgZWNobyAiQ29tcGlsaW5nIFdJTkUuIEdyYWIgYSBsdW5jaCBvciB0d28sIHJlbnQgYSB2aWRlbywgb3Igd2hhdGV2ZXIsIgogICAgZWNobyAiaW4gdGhlIG1lYW50aW1lLi4uIgogICAgZWNobwogICAgc3RkX3NsZWVwCgogICAgIyB0cnkgdG8ganVzdCBtYWtlIHdpbmUsIGlmIHRoaXMgZmFpbHMgJ21ha2UgZGVwZW5kJyBhbmQgdHJ5IHRvIHJlbWFrZQogICAgaWYgISB7IG1ha2U7IH0KICAgIHRoZW4gewogICAgICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogICAgICB0aGVuIHsKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQogICAgfQogICAgZmkKCiAgICBpZiBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQogICAgdGhlbiB7CiAgICAgIGVjaG8KCiAgICAgIGVjaG8gIlBlcmZvcm1pbmcgJ21ha2UgaW5zdGFsbCcgYXMgcm9vdCB0byBpbnN0YWxsIGJpbmFyaWVzLCBlbnRlciByb290IHBhc3N3b3JkIgoKICAgICAgc3RkX3NsZWVwCgogICAgICBpZiAhIHN1IHJvb3QgLWMgIiRzdWNvbW1hbmQiCiAgICAgIHRoZW4gewogICAgICAJaWYgISBzdSByb290IC1jICIkc3Vjb21tYW5kIgogICAgICAgIHRoZW4gewogICAgICAJICAgICBlY2hvCiAgICAgICAgICAgICBlY2hvICJFaXRoZXIgeW91IGVudGVyZWQgYW4gaW5jb3JyZWN0IHBhc3N3b3JkIG9yIHdlIGZhaWxlZCB0byIKICAgICAgICAgICAgIGVjaG8gInJ1biAnJHN1Y29tbWFuZCcgY29ycmVjdGx5LiIKICAgICAgICAgICAgIGVjaG8gIklmIHlvdSBkaWRuJ3QgZW50ZXIgYW4gaW5jb3JyZWN0IHBhc3N3b3JkIHRoZW4gcGxlYXNlIgogICAgICAgICAgICAgZWNobyAicmVwb3J0IHRoaXMgZXJyb3IgYW5kIGFueSBzdGVwcyB0byBwb3NzaWJseSByZXByb2R1Y2UgaXQgdG8iCiAgICAgICAgICAgICBlY2hvICJodHRwOi8vYnVncy53aW5laHEuY29tLyIKICAgICAgICAgICAgIGVjaG8KICAgICAgICAgICAgIGVjaG8gIkluc3RhbGxhdGlvbiBmYWlsZWQsIGFib3J0aW5nLiIKICAgICAgICAgICAgIGV4aXQgMQogICAgICAgICB9CiAgICAgICAgIGZpCiAgICAgICB9CiAgICAgIGZpCgogICAgICBlY2hvCgogICAgICAjIHNlZSBpZiB3aW5lIGlzIGluc3RhbGxlZCBvbiB0aGUgdXNlcnMgc3lzdGVtLCBpZiBub3QgcHJvbXB0IHRoZW0KICAgICAgIyBhbmQgdGhlbiBleGl0CiAgICAgIGlmIFsgISBgd2hpY2ggd2luZWAgXQogICAgICB0aGVuCiAgICAgICAgZWNobyAiQ291bGQgbm90IGZpbmQgd2luZSBvbiB5b3VyIHN5c3RlbS4gIFJ1biB3aW5laW5zdGFsbCBhcyByb290IHRvIGluc3RhbGwgd2luZSIKICAgICAgICBlY2hvICJiZWZvcmUgcmUtcnVubmluZyB3aW5laW5zdGFsbCBhcyBhIHVzZXIuIgogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJFeGl0aW5nIHdpbmVpbnN0YWxsIgogICAgICAgIGV4aXQgMTsKICAgICAgZmkKCiAgICAgIFdJTkVJTlNUQUxMRUQ9eWVzCiAgICB9CiAgICBlbHNlIHsKICAgICAgIyB1c2VyIGRpZG4ndCB3YW50IHRvIGluc3RhbGwgd2luZSBzbyB0ZWxsIHRoZW0gYWJvdXQgcnVubmluZyBmcm9tIHRoZQogICAgICAjIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBzZXQgc29tZSBzdHVmZiB1cCBmb3IgdGhlbQoKICAgICAgIyBzZXR1cCB0byBydW4gZnJvbSBjdXJyZW50IGRpcmVjdG9yeQogICAgICBETExQQVRIPSIkUFdEL2RsbHMiCiAgICAgIGlmIFsgLXogIiRMRF9MSUJSQVJZX1BBVEgiIF0KICAgICAgdGhlbiBMRF9MSUJSQVJZX1BBVEg9IiRQV0Q6JERMTFBBVEgiCiAgICAgIGVsc2UgTERfTElCUkFSWV9QQVRIPSIkTERfTElCUkFSWV9QQVRIOiRQV0Q6JERMTFBBVEgiCiAgICAgIGZpCiAgICAgIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKICAgICAgZWNobwogICAgICBlY2hvICJOT1RFISBUbyBydW4gV2luZSB3aXRob3V0IGluc3RhbGxpbmcsIHlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiCiAgICAgIGVjaG8gIkxEX0xJQlJBUllfUEFUSCB0byAkUFdEOiRETExQQVRIIgogICAgICBlY2hvICJpbiB5b3VyIGxvZ29uIHNjcmlwdHMuIgogICAgICBlY2hvCgogICAgICBXSU5FSU5TVEFMTEVEPW5vCiAgICB9CiAgICBmaSAjIFsgIiRST09USU5TVEFMTCIgPSAieWVzIiBdCiAgfQogIGZpICMgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQoKfQpmaSAjIEJJTkRJU1QKCiMgbm93IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIHdpbmUuY29uZgppZiBbIC16ICIkRE9HTE9CQUxDT05GIiBdCnRoZW4KICBET0dMT0JBTENPTkY9YXV0bwpmaQoKaWYgWyAiJERPR0xPQkFMQ09ORiIgPSAnYXV0bycgXQp0aGVuIHsKICAjIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBzeXN0ZW0gd2luZS5jb25mCiAgaWYgWyAhIC1mICRHQ09ORiBdICYmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4KICAgIERPR0xPQkFMQ09ORj1ubwogICAgZWNobyAiQ3JlYXRpb24gb2YgYSBnbG9iYWwgY29uZmlnIGZpbGUgaXMgbm90IHN1cHBvcnRlZCBpbiB3aW5laW5zdGFsbCBhdCB0aGlzIgogICAgZWNobyAidGltZS4gIFdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gYXJjaGl0ZWN0dXJlIGlzIGNsZWFuZWQgdXAgdGhpcyBmdW5jdGlvbmFsaXR5IgogICAgZWNobyAid2lsbCBiZSByZXN0b3JlZCB0byB3aW5laW5zdGFsbC4iCiAgICBlY2hvCiAgZmkKfQpmaQoKaWYgWyAiJERPTE9DQUxDT05GIiA9ICdhdXRvJyBdCnRoZW4gewogICMgc2VlIGlmIHRoZSB1c2VyIGlzIHJvb3QsIGlmIHNvLCBleHBsaWNpdGx5IGFzayB0aGVtIGlmIHRoZXkgd2FudCBhCiAgIyBsb2NhbCBjb25maWcgZmlsZQogIGlmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4KICAgIGVjaG8gIllvdSBhcmUgcnVubmluZyBhcyByb290LiAgRG8geW91IHdhbnQgYSBsb2NhbCBjb25maWcgZmlsZSwiCiAgICBlY2hvICJmaWxlLCB+Ly53aW5lL2NvbmZpZywgY3JlYXRlZD8iCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgZWxzZQogICAgIyBpZiB0aGUgdXNlciBoYXMgYW4gZXhpc3RpbmcgY29uZmlnIGZpbGUgYXNrIHRoZW0gaWYgdGhleSB3YW50IHVzIHRvCiAgICAjIG92ZXJ3cml0ZSBpdCwgb3RoZXJ3aXNlIGp1c3QgYXNrIHRoZW0gaWYgdGhleSB3YW50IHRvIGNyZWF0ZSBvbmUKICAgIGlmIFsgLWYgIiRMQ09ORiIgXQogICAgdGhlbgogICAgICBlY2hvICJGb3VuZCBleGlzdGluZyAkTENPTkYsIGRvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGlzIgogICAgICBlY2hvICJleGlzdGluZyBXaW5lIGNvbmZpZ3VyYXRpb24gZmlsZT8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogICAgICBlY2hvCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gInllcyIgXQogICAgICB0aGVuCiAgICAgIHsKICAgICAgICBlY2hvICJXb3VsZCB5b3UgbGlrZSB0byBtYWtlIGEgYmFja3VwIG9mIHRoaXMgb2xkIGNvbmZpZyBmaWxlPyIKICAgICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICAgIGVjaG8KICAgICAgICBpZiBbICIkQU5TV0VSIiA9ICJ5ZXMiIF0KICAgICAgICB0aGVuCiAgICAgICAgewogICAgICAgICAgZWNobyAiUmVuYW1pbmcgJExDT05GIHRvICRMQ09ORi5vbGQiCiAgICAgICAgICBtdiAtZiAiJExDT05GIiAiJExDT05GLm9sZCIKICAgICAgICAgIGVjaG8KICAgICAgICB9CiAgICAgICAgZmkKICAgICAgfQogICAgICBmaQogICAgZWxzZQogICAgewogICAgICBlY2hvICJDcmVhdGUgbG9jYWwgY29uZmlnIGZpbGUgfi8ud2luZS9jb25maWc/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICAgICAgZWNobwogICAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgICB0aGVuCiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIG5lZWRfcm9vdCBcCiAgICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gVHJ5IGFnYWluIGFzIHJvb3QgdG8gZ2VuZXJhdGUgYSBzeXN0ZW0gd2luZS5jb25mLiIKICAgICAgICBleGl0IDEKICAgICAgZmkKICAgIH0KICAgIGZpCiAgZmkKfQpmaQoKIyBnZW5lcmF0ZSAkVE1QQ09ORiBmcm9tIGV4aXN0aW5nIHdpbmRvd3MgaW5zdGFsbCwgaWYgYW55CmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRET1dDSEsiID0gJ3llcycgXSB8fCBbICIkRE9XQ0hLIiA9ICdhdXRvJyBdCiAgdGhlbiB7CiAgICBlY2hvIC1uICJTZWFyY2hpbmcgZm9yIGFuIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLi4uIgogICAgaWYgISAkV0lORUNPTkYgLWluaWZpbGUgIiRXSU5FSU5JIiA+ICRUTVBDT05GIDI+L2Rldi9udWxsCiAgICB0aGVuIHsKICAgICAgcm0gLWYgJFRNUENPTkYgPiAvZGV2L251bGwKCiAgICAgIGVjaG8gIiBub3QgZm91bmQuIChubyBtYXRjaGluZyAvZXRjL2ZzdGFiIG1vdW50IGVudHJ5IGZvdW5kKSIKICAgICAgY29uZl9xdWVzdGlvbiBsb3cgZG9fd2l0aG91dF93aW5kb3dzIFwKICAgICAgICJXaW5kb3dzIHdhcyBub3QgZm91bmQgb24geW91ciBzeXN0ZW0sIHNvIEkgYXNzdW1lIHlvdSB3YW50IiBcCiAgICAgICAiYSBXaW5lLW9ubHkgaW5zdGFsbGF0aW9uLiBBbSBJIGNvcnJlY3Q/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggd2luZG93c19ub3RfZm91bmQgXAogICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gTWFrZSBzdXJlIHlvdXIgV2luZG93cyBwYXJ0aXRpb24gaXMgbW91bnRlZCBhbmQgdHJ5IGFnYWluLCIgXAogICAgICAgICAib3IgY3JlYXRlICRMQ09ORiBtYW51YWxseSBieSBjb3B5aW5nIGZyb20gJFdJTkVJTkkgYW5kIGFkYXB0aW5nIHRoZSBkcml2ZSBwYXRocy4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgICAgRE9XSU5FPXllcwogICAgfQogICAgZWxzZSB7CiAgICAgIGVjaG8gIiBmb3VuZC4iCgogICAgICBjb25mX3F1ZXN0aW9uIGxvdyBkb193aXRob3V0X3dpbmRvd3MgXAogICAgICAgIldpbmRvd3Mgd2FzIGZvdW5kIG9uIHlvdXIgc3lzdGVtLCBhbmQgc28gd2UgY2FuIHVzZSB0aGUgV2luZG93cyIgXAogICAgICAgIkRyaXZlIGFzIG91ciBXaW5lIGRyaXZlLiBZb3UgbWF5LCBob3dldmVyLCB3aXNoIHRvIGNyZWF0ZSBhIGNsZWFuIiBcCiAgICAgICAiV2luZSBpbnN0YWxsIGFueXdheXMuIgogICAgICBjb25mX3llc25vX2Fuc3dlciAiU2hvdWxkIEkgdXNlIHRoZSBXaW5kb3dzIGRyaXZlIGZvciB0aGUgV2luZSBpbnN0YWxsPyAoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHdpbmRvd3NfZm91bmQKICAgICAgICBjb25mX3F1ZXN0aW9uIGxvdyB3aW5kb3dzX2ZvdW5kIFwKICAgICAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIHlvdXIgZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uIiBcCiAgICAgICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgICAgICAgRE9XSU5FPW5vCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgRE9XSU5FPXllcwogICAgICB9CiAgICAgIGZpCiAgICB9CiAgICBmaQogIH0KICBlbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KICB0aGVuIERPV0lORT15ZXMKICBmaQp9CmVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQp0aGVuCiAgRE9XSU5FPW5vCmZpCgojIHNldHVwIGEgbm8td2luZG93cyBpbnN0YWxsYXRpb24sIGlmIG5lY2Vzc2FyeQppZiBbICIkRE9XSU5FIiA9ICd5ZXMnIF0KdGhlbiB7CiAgIyBzZXQgYW4gYXBwcm9wcmlhdGUgRENST09UCiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gRENST09UPX4vYwogIGVsc2UgRENST09UPS9jCiAgZmkKCiAgY29uZl9xdWVzdGlvbiBsb3cgZHJpdmVjX3BhdGggXAogICAgICJDb25maWd1cmluZyBXaW5lIHdpdGhvdXQgV2luZG93cy4iIFwKICAgICAiU29tZSBmYWtlIFdpbmRvd3MgZGlyZWN0b3JpZXMgbXVzdCBiZSBjcmVhdGVkLCB0byBob2xkIGFueSAuaW5pIGZpbGVzLCBETExzLCIgXAogICAgICJzdGFydCBtZW51IGVudHJpZXMsIGFuZCBvdGhlciB0aGluZ3MgeW91ciBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zdGFsbC4iIFwKICAgICAiV2hlcmUgd291bGQgeW91IGxpa2UgeW91ciBmYWtlIEMgZHJpdmUgdG8gYmUgcGxhY2VkPyIKICB3aGlsZSBbIC16ICIkQ1JPT1QiIF0KICBkbyB7CiAgICBjb25mX3N0cmluZ19hbnN3ZXIgIihkZWZhdWx0IGlzICREQ1JPT1QpICIKICAgIFsgLXogIiRBTlNXRVIiIF0gJiYgQU5TV0VSPSIkRENST09UIgogICAgaWYgISBbIC1kICIkQU5TV0VSIiBdCiAgICB0aGVuIHsKICAgICAgaWYgbWtkaXIgLXAgIiRBTlNXRVIiCiAgICAgIHRoZW4gQ1JPT1Q9IiRBTlNXRVIiCiAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkRpcmVjdG9yeSAkQU5TV0VSIGNhbid0IGJlIGNyZWF0ZWQgISIKICAgICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gZHJpdmVjX3BhdGgKICAgICAgZmkKICAgIH0KICAgIGVsc2UgQ1JPT1Q9IiRBTlNXRVIiCiAgICBmaQogIH0KICBkb25lCiAgZWNobyAiQ29uZmlndXJpbmcgV2luZSBmb3IgYSBuby13aW5kb3dzIGluc3RhbGwgaW4gJENST09ULi4uIgoKICAgIGNyZWF0ZV93aW5kb3dzX2RpcmVjdG9yaWVzCiAgICBjb25maWd1cmVfd2luZV9hcHBsaWNhdGlvbnMKCiAgIyBjcmVhdGUgJExDT05GIHVzaW5nIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlICRXSU5FSU5JCiAgaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KICB0aGVuIHsKICAgIHNlZCAic3xcIlBhdGhcIiA9IFwiL2NcIlwkfFwiUGF0aFwiID0gXCIke0NST09UfVwifCIgJFdJTkVJTkkgPiAkVE1QQ09ORgogICAgY29uZl9yZXNldF9xdWVzdGlvbiBkZWZhdWx0X2NvbmZpZwogICAgY29uZl9xdWVzdGlvbiBsb3cgZGVmYXVsdF9jb25maWcgXAogICAgICJDcmVhdGVkICRMQ09ORiB1c2luZyBkZWZhdWx0IFdpbmUgY29uZmlndXJhdGlvbi4iIFwKICAgICAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogIH0KICBmaQoKICAjIG5vdyB3ZSByZWFsbHkgc2hvdWxkIGluc3RhbGwgdGhlIHJlZ2lzdHJ5CiAgaWYgWyAiJERPUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBET1JFRz15ZXMKICBmaQp9CmZpCmVjaG8KCiNpbnN0YWxsIHRoZSBsb2NhbCBjb25maWcgZmlsZSAkTENPTkYKaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KdGhlbgogIGlmIFsgISAtdyB+Ly53aW5lIF0KICB0aGVuCiAgICBta2RpciB+Ly53aW5lCiAgZmkKICBjcCAkVE1QQ09ORiAkTENPTkYgPiAvZGV2L251bGwKZWxzZQogIERPUkVHPW5vCmZpCgojaW5zdGFsbCB0aGUgZ2xvYmFsIGNvbmZpZyBmaWxlICRHQ09ORgppZiBbICIkRE9HTE9CQUxDT05GIiA9ICd5ZXMnIF0KdGhlbgogIGlmIFsgISAtZiAkc3lzY29uZmRpciBdCiAgdGhlbgogICAgbWtkaXIgLXAgJHN5c2NvbmZkaXIKICBmaQoKICBjcCAkVE1QQ09ORiAkR0NPTkYgPiAvZGV2L251bGwKZmkKCiMgY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQojIChub3QgdG8gYmUgZG9uZSBpZiB3aW5kb3dzIHJlZ2lzdHJ5IGV4aXN0cykKaWYgWyAiJERPUkVHIiA9ICdhdXRvJyBdCnRoZW4gewogIENST09UPWBzZWQgLW4gJy9eXFtEcml2ZSBDXF0kLywvXlxbLipcXSQvIHMvXlwiUGF0aFwiID0gXCJcKC4qXClcIi9cMS9wJyAkTENPTkZgCiAgZWNobyAiQ2hlY2tpbmcgZm9yIHJlYWwgV2luZG93cyByZWdpc3RyeS4uLiIKICBpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uZGF0IiBdCiAgdGhlbiBET1JFRz1ubwogIGVsaWYgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvY29uZmlnL3N5c3RlbSIgXQogIHRoZW4gRE9SRUc9bm8KICBlbGlmIFsgLWYgIiRDUk9PVC9XSU5OVC9zeXN0ZW0zMi9jb25maWcvc3lzdGVtIiBdCiAgdGhlbiBET1JFRz1ubwogIGVsc2UgRE9SRUc9eWVzCiAgZmkKICBpZiBbICIkRE9SRUciID0gJ3llcycgXQogIHRoZW4gZWNobyAiTm90IGZvdW5kLCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgd2lsbCBiZSBpbnN0YWxsZWQuIgogIGVsc2UgZWNobyAiV2luZG93cyByZWdpc3RyeSBmb3VuZCwgd2lsbCBub3QgaW5zdGFsbCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkuIgogIGZpCiAgZWNobwp9CmZpCgojIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeSBlbnRyaWVzCmlmIFsgIiRET1JFRyIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQogIHRoZW4gewogICAgZWNobyAiQ29tcGlsaW5nIHJlZ2VkaXQuLi4iCiAgICAoY2QgcHJvZ3JhbXMvcmVnZWRpdDsgbWFrZSkKICAgIGVjaG8KICB9CiAgZmkKICBlY2hvICJQcmVwYXJpbmcgdG8gaW5zdGFsbCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgZW50cmllcy4uLiIKCiAgIyBNYWtlIHN1cmUgd2UgYXJlIG9uIGEgV2luZG93cyBkcml2ZQogIG12ICRMQ09ORiAkTENPTkYub3JpZwogIHNlZCAicy9cIlBhdGhcIiA9IFwiJUhPTUUlXCIkL1wiUGF0aFwiID0gXCIlUFdEJVwiLyIgJExDT05GLm9yaWc+ICRMQ09ORgoKICBlY2hvICJJbnN0YWxsaW5nIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgogIGVjaG8KICBpZiAhICRSRUdFRElUICRERUZSRUcgPiAvZGV2L251bGwKICB0aGVuIHsKICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgIG12ICRMQ09ORi5vcmlnICRMQ09ORgogICAgY29uZl9yZXNldF9xdWVzdGlvbiByZWdlZGl0X2Vycm9yCiAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggcmVnZWRpdF9lcnJvcgogICAgZXhpdCAxCiAgfQogIGVsc2UgewogICAgZWNobwogICAgZWNobyAiUmVnaXN0cnkgZW50cmllcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLiIKICAgIG12ICRMQ09ORi5vcmlnICRMQ09ORgogIH0KICBmaQogIGlmIFsgIiRTWVNSRUciID0gJ2F1dG8nIF0KICB0aGVuIFNZU1JFRz15ZXMKICBmaQp9CmZpCgojIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCwgaWYgZGVzaXJlZAppZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0gJiYgWyAiJERPUkVHIiA9ICd5ZXMnIF0gJiYgWyAiJFNZU1JFRyIgPSAneWVzJyBdCnRoZW4gewogIFsgLWQgfi8ud2luZSBdIHx8IG1rZGlyIH4vLndpbmUKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHVzZXIgcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3dpbmUudXNlcnJlZyBdICYmIGNwIH4vLndpbmUvd2luZS51c2VycmVnICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyB+Ly53aW5lL3dpbmUudXNlcnJlZwogIH0KICBmaQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyBzeXN0ZW0gcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3N5c3RlbS5yZWcgXSAmJiBjcCB+Ly53aW5lL3N5c3RlbS5yZWcgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyB+Ly53aW5lL3N5c3RlbS5yZWcKICB9CiAgZmkKfQpmaQoKIyBjbGVhbnVwIGFueSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBtYXkgcmVtYWluCmlmIFsgLWYgJFRNUENPTkYgXQp0aGVuIHJtIC1mICRUTVBDT05GCmZpCgoKIyBpdCdzIGEgd3JhcAplY2hvCmVjaG8gIkluc3RhbGxhdGlvbiBjb21wbGV0ZSBmb3Igbm93LiBHb29kIGx1Y2sgKHRoaXMgaXMgc3RpbGwgYWxwaGEgc29mdHdhcmUpLiIKZWNobyAiSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBXSU5FLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmaXJzdCwiCmVjaG8gImFzIG1hbnkga2luZHMgb2YgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBleHBsYWluZWQgdGhlcmUuIgoKZXhpdCAwCg==