IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMKIyBIaXN0b3J5OgojIE1hciAzMSAxOTk5IC0gT3ZlIEvldmVuCiMgIEZpcnN0IHZlcnNpb24KIyBEZWMgOSAxOTk5IC0gT3ZlIEvldmVuCiMgIHJlcXVpcmUgWHBtCiMgRmViIDI1IDIwMDAgLSBPdmUgS+V2ZW4KIyAgYXV0by1hZGQgL3Vzci9sb2NhbC9saWIgdG8gL2V0Yy9sZC5zby5jb25mCiMgTWFyIDIgMjAwMCAtIE92ZSBL5XZlbgojICBzb3VyY2UgcmF0aGVyIHRoYW4gZ3JlcCBjb25maWcuY2FjaGUKIyAgdXNlIHNvdXJjZWQgY29uZmlnLmNhY2hlIHRvIHN0YXJ0IGxkY29uZmlnCiMgIHJlY29uZmlndXJlIGlmIGNvbmZpZy5jYWNoZSBkb2Vzbid0IGV4aXN0CiMgTWFyIDMwIDIwMDAgLSBPdmUgS+V2ZW4KIyAgYXV0b2NvbmZpZ3VyZSBuby13aW5kb3dzIGluc3RhbGxzCiMgIGRvIG5vdCBpbnN0YWxsIHJlZ2lzdHJ5IG9uIHJlYWwtd2luZG93cyBpbnN0YWxscwojICBzb21lIHN1cHBvcnQgZm9yIGJpbmFyeSBwYWNrYWdlIGluc3RhbGxzCiMgIHNldCBhbmQgdGVsbCB1c2VyIGFib3V0IExEX0xJQlJBUllfUEFUSCBpZiBuZWNlc3NhcnkKIyAgc2V0IEVYVFJBX0xEX0xJQlJBUllfUEFUSCBpbiB3aW5lLmNvbmYKIyBBcHIgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCAoc3lzdGVtLWRlZmF1bHQpCiMgTWF5IDkgMjAwMCAtIE92ZSBL5XZlbgojICB1c2UgdHR5ZHJ2IHdoZW4gcnVubmluZyByZWdhcGksIHNvIHdlIGRvbid0IGhhdmUgdG8gcnVuIGZyb20gWAojICBjaGFuZ2UgZGVidWdnZXIgcGF0aCBpbiByZWdpc3RyeQojIE9jdCAyOSAyMDAwIC0gT3ZlIEvldmVuCiMgIGFkZGVkIC0tZW5hYmxlLW9wZW5nbCB0byBkZWZhdWx0IGNvbmZhcmdzCiMgIGFkZGVkIGNvbmZfcXVlc3Rpb24sIGNvbmZfeWVzbm9fYW5zd2VyLCBhbmQgY29uZl9zdHJpbmdfYW5zd2VyIGZ1bmN0aW9ucwojICBhZGRlZCBERUZDQVQgdmFyaWFibGUKIyAobGF0ZXIgdGhhdCBkYXkuLi4pCiMgIGFkZGVkIGNvbmZfcmVzZXRfcXVlc3Rpb24gZnVuY3Rpb24KIyAgYWRkZWQgZmlsZSBleGlzdGVuY2UgY2hlY2tzIHRvIHRoZSByZWdpc3RyeSBjb3B5aW5nCiMgIGZpeGVkIHByb2JsZW0gd2l0aCBuby13aW5kb3dzIGRpcmVjdG9yeSBjcmVhdGlvbgojICBzb21lIHRleHQgcmVmb3JtYXR0aW5nIGZyb20gRXJpYyBNYXJ5bmlhawojIEphbiA1IDIwMDAgLSBDaHJpcyBNb3JnYW4KIyAgdXNlIGRlZmF1bHQgY29uZmlnIGZpbGUgaW4gL2RvY3VtZW50YXRpb24vc2FtcGxlcy9jb25maWcKIyAgcmVwbGFjZSAud2luZXJjIHdpdGggfi8ud2luZS9jb25maWcgaW4gcHJpbnRlZCB0ZXh0CiMgIGFkZGVkIHVzZXIgcXVlc3Rpb24gdG8gY29udmVydCAud2luZXJjIGZpbGUoaWYgZXhpc3RzKSBvciB1c2UgdGhlIGRlZmF1bHQKIyAgICBjb25maWcgZmlsZQojICBhZGQgY29uZl9xdWVzdGlvbiB0byBhbGxvdyByb290IHRvIGluc3RhbGwgYSBsb2NhbCBjb25maWcgZmlsZSBhbmQKIyAgICByZWdpc3RyeQojIEphbiAxMiAyMDAwIC0gQ2hyaXMgTW9yZ2FuCiMgIGRpc3Rpbmd1aXNoIGJldHdlZW4gY3JlYXRpbmcgbG9jYWwgYW5kIGdsb2JhbCBjb25maWcgZmlsZXMKIyAgZGlzcGxheSBhIG1lc3NhZ2UgYWJvdXQgdGhlIHN0YXR1cyBvZiBnbG9iYWwgY29uZmlnIGZpbGVzCiMgIG1pc2MgY2xlYW51cHMgYW5kIHJlb3JkZXJpbmcgb2YgcXVlc3Rpb25zCiMgIGFkZGVkIGNoZWNrIHRvIHNlZSBpZiB3aW5lIGlzIGluc3RhbGxlZCB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGEgbm9ybWFsCiMgICAgdXNlciBhbmQgcHJpbnQgYSBtZXNzYWdlIGlmIHdpbmUgY2Fubm90IGJlIGZvdW5kCiMgRmViIDE2IDIwMDIgLSBBZGFtIEQuIE1vc3MKIyAgVXNlIGNvbmZpZy5zdGF0dXMgaW5zdGVhZCBvZiBjb25maWcuY2FjaGUgdG8gY2hlY2sgd2hldGhlciB3ZSdyZQojICAgIGNvbmZpZ3VyZWQvY29tcGlsZWQgYW5kIHRvIHJlY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uCiMgRmViIDIwIDIwMDIgLSBBZGFtIEQuIE1vc3MKIyAgUGFydGlhbGx5IHJldmVydCBwcmV2aW91cyBjaGFuZ2VzLCBmb3JjZSBjb25maWd1cmUgdG8gd3JpdGUgYW4KIyAgICBvbGQtc3R5bGUgY29uZmlnLmNhY2hlCiMgTWFyIDI3IDIwMDIgLSBDaHJpcyBNb3JnYW4KIyAgcHJldmVudCB0aGUgdXNlciBmcm9tIHJ1bm5pbmcgd2luZWluc3RhbGwgYXMgcm9vdAojICBhZGQgc2NyaXB0IGNvbW1hbmRzIHNvIHdlIHN1IHJvb3QgZm9yICdtYWtlIGluc3RhbGwnIGFuZCBvdGhlciBjb21tYW5kcwojICAgIHRoYXQgcmVxdWlyZSByb290IGFjY2VzcwojICBhZGQgdGV4dCB0byB0ZWxsIHRoZSB1c2VyIHdlIG5lZWQgdG8gcnVuIHN0dWZmIGFzIHJvb3Qgc28gdGhleSBkb24ndAojICAgIHRoaW5rIHdlIGFyZSB0cnlpbmcgdG8gcHVsbCBzb21ldGhpbmcgZnVubnkKIyBBcHIgMTQgMjAwMiAtIER1c3RpbiBOYXZlYQojICBGaXggc2VkIGNvbW1hbmQgd2hlbiBmaW5kaW5nIHJlYWwtd2luZG93cyByZWdpc3RyeSBzbyBpdCBhY3R1YWxseQojICAgYWNjZXNzZXMgYSBmaWxlICh+Ly53aW5lL2NvbmZpZykgaW5zdGVhZCBvZiBudWxsICgkQ09ORj8hKQojICBBZGRlZCBzZWFyY2ggZm9yIGNsZWFuLWluc3RhbGwgKG5vdCB1cGdyYWRlKSBXaW4yayByZWdpc3RyeQojICAobmV4dCBkYXksIGFmdGVyIHNvbWUgc2xlZXApCiMgIEZpeCBzZWQgc3RyaW5nIHdoZW4gZmluZGluZyByZWFsLXdpbmRvd3MgcmVnaXN0cnkgdG8gYWN0dWFsbHkgZmluZAojICAgd2luZG93cyBwYXJ0aXRpb24gbmFtZSBpbiBbRHJpdmUgQ10gc2VjdGlvbgojICBpdCBzaG91bGQgbm93IGFsbW9zdCBhbHdheXMgZmluZCB0aGUgd2luZG93cyBwYXJ0aXRpb24gYW5kIHJlYWwtd2luZG93cwojICByZWdpc3RyeSAoaWYgbm90LCBsZXQgbWUga25vdykKIyBBdWcgMjkgMjAwMiAtIFJvayBNYW5kZWxqYyA8cm9rLm1hbmRlbGpjQGdpbWIub3JnPgojICAtYWRkZWQgdHdvIHN5bWxpbmtzOyB3aW5kb3dzL3dpbmhlbHAuZXhlIGFuZCB3aW5kb3dzL3dpbmhscDMyLmV4ZSBiZWNhdXNlIGl0IHNlZW1zCiMgICB0aGF0IHNvbWUgYXBwcyBsb29rIGZvciB3aW5obHAzMi5leGUvd2luaGVscCB0byBkaXNwbGF5IGhlbHAKIwoKIy0tLSBkZWZhdWx0cyAoY2hhbmdlIHRoZXNlIGlmIHlvdSBhcmUgYSBwYWNrYWdlcikKQ09ORkFSR1M9Ii0tZW5hYmxlLW9wZW5nbCIgICAgIyBjb25maWd1cmUgYXJncywgZS5nLiAtLXByZWZpeD0vdXNyIC0tc3lzY29uZmRpcj0vZXRjCnByZWZpeD0vdXNyL2xvY2FsICAgICAgICAgICAgICMgaW5zdGFsbGF0aW9uIHByZWZpeApzeXNjb25mZGlyPSRwcmVmaXgvZXRjICAgICAgICAjIHdoZXJlIHdpbmUuY29uZiBhbmQgdGhlIGdsb2JhbCByZWdpc3RyeSBhcmUgc3VwcG9zZWQgdG8gYmUKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgYXJlKSBpbnN0YWxsZWQKbGliZGlyPSRwcmVmaXgvbGliICAgICAgICAgICAgIyB3aGVyZSBsaWJ3aW5lLnNvIHdpbGwgYmUgKG9yIGlzKSBpbnN0YWxsZWQKZXhkaXI9ZG9jdW1lbnRhdGlvbi9zYW1wbGVzICAgIyB3aGVyZSB0aGUgc2FtcGxlIHN5c3RlbS5pbmkgcmVzaWRlcwpHQ09ORj0kc3lzY29uZmRpci93aW5lLmNvbmYgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgd2luZS5jb25mIGdsb2JhbCBjb25maWcgZmlsZQpMQ09ORj1+Ly53aW5lL2NvbmZpZyAgICAgICAgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgbG9jYWwgY29uZmlnIGZpbGUKQklORElTVD1ubyAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIGNhbGxlZCBmcm9tIGEgYmluYXJ5IHBhY2thZ2UgY29uZmlnIHNjcmlwdApET0dMT0JBTENPTkY9YXV0byAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2dlbmVyYXRlIHdpbmUuY29uZgpET0xPQ0FMQ09ORj1hdXRvICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2dlbmVyYXRlIGxvY2FsY29uZgpET1dDSEs9YXV0byAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2NvbmZpZ3VyZSBleGlzdGluZy13aW5kb3dzIGluc3RhbGxhdGlvbgpET1dJTkU9YXV0byAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2NvbmZpZ3VyZSBuby13aW5kb3dzIGluc3RhbGxhdGlvbgpET1JFRz1hdXRvICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5CkRPQVBQPWF1dG8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBpbnN0YWxsIGFwcGxpY2F0aW9ucywgZGlzdHJpYnV0ZWQgd2l0aCBXaW5lClNZU1JFRz15ZXMgICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBtYWtlIHJvb3QncyByZWdpc3RyeSBnbG9iYWwgKHN5c3RlbS1kZWZhdWx0KQpDT05WQ09ORj1ubwkJICAgICAgIyB3aGV0aGVyIHdlIGFyZSBjb252ZXJ0aW5nIGFuIGV4aXN0aW5nIC53aW5lcmMgb3Igbm90CgojICJtYWtlIGluc3RhbGwiIHN0aWxsIGluc3RhbGxzIHRoZSBkbGxzIGludG8gJGxpYmRpciwgYnV0IHRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlCiMgKERMTFBBVEggc2hvdWxkIHBvaW50IHRvIHRoZW0gaWYvd2hlbiB0aGV5IGFyZSBub3QgaW4gc3RhbmRhcmQgbGQuc28gcGF0aHMpCkRMTFBBVEg9JGxpYmRpci93aW5lICAgICAgICAgICMgZGVmYXVsdCBwYXRoIG9mIHRoZSBkbGwgLnNvIGZpbGVzIChleGNlcHQgbGlid2luZS5zbykKCiMgaGF2aW5nIHRoZSBXaW5lIGRlYnVnZ2VyIGxhdW5jaGVkIGF1dG9tYXRpY2FsbHkgd2lsbCBiZSBhIHBsdXMgZm9yIHVzCkRFQlVHR0VSPSRiaW5kaXIvd2luZWRiZyAgICAgICMgdGhlIChpbnN0YWxsZWQpIHBhdGggb2Ygd2luZWRiZwpIREVCVUdHRVI9ZGVidWdnZXIvd2luZWRiZyAgICAjIHRoZSAobm9uLWluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCgojIHRoaXMgaXMgb25seSBmb3IgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxscwpXSU5FQ09ORj10b29scy93aW5lY29uZiAgICAgICAjIHBhdGggdG8gdGhlIHdpbmVjb25mIHBlcmwgc2NyaXB0CgojIHRoaXMgaXMgb25seSBmb3Igbm8td2luZG93cyBpbnN0YWxscwpXSU5FSU5JPSRleGRpci9jb25maWcgICAgICAgICAjIHBhdGggdG8gdGhlIGRlZmF1bHQgd2luZSBjb25maWcgZmlsZSAoYWxzbyB1c2VkIGJ5IHdpbmVjb25mKQpXSU5JTkk9L2Rldi9udWxsICAgICAgICAgICAgICAjIHBhdGggdG8gdGhlIGRlZmF1bHQgd2luLmluaQpTWVNURU1JTkk9JGV4ZGlyL3N5c3RlbS5pbmkgICAjIHBhdGggdG8gdGhlIGRlZmF1bHQgc3lzdGVtLmluaQpSRUdFRElUPSRiaW5kaXIvcmVnZWRpdCAgICAgICAjIHBhdGggdG8gdGhlIHJlZ2VkaXQgd2luZWxpYiBhcHBsaWNhdGlvbgpERUZSRUc9d2luZWRlZmF1bHQucmVnICAgICAgICAjIHBhdGggb2YgdGhlIHJlZ2lzdHJ5IGZpbGUgdG8gYmUgZmVkIHRvIHJlZ2VkaXQKIyBDUk9PVD0vdmFyL3dpbmUgICAgICAgICAgICAgIyBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQpERUZDQVQ9Y2F0ICAgICAgICAgICAgICAgICAgICAjIHByb2dyYW0gdG8gY2F0ICRERUZSRUcgd2l0aCAoc29tZSBwYWNrYWdlcyBuZWVkIHpjYXQpCiMtLS0gZW5kIG9mIGRlZmF1bHRzCgojIHRlbXBvcmFyeSBmaWxlcyB1c2VkIGJ5IHRoZSBpbnN0YWxsZXIKVE1QQ09ORj0vdG1wL3dpbmVpbnN0YWxsLmNvbmYKVE1QUkVHPS90bXAvd2luZWluc3RhbGwucmVnCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gc3RkX3NsZWVwIHsKICBzbGVlcCAxCn0KCmZ1bmN0aW9uIGNvbmZfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBpbXBvcnRhbmNlLCAkMiA9IHF1ZXN0aW9uLWlkLCAkMysgPSBtZXNzYWdlIGxpbmVzCiAgIyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgYnkgZS5nLiBkZWJjb25mIGluIGRlYmlhbiBwYWNrYWdlcwogICMgYnV0IGhlcmUgd2UganVzdCBwcmludCB0aGUgbWVzc2FnZQogIHNoaWZ0IDIKICBlY2hvCiAgbG9jYWwgTElORT0iJDEiCiAgd2hpbGUgc2hpZnQKICBkbyB7CiAgICBlY2hvICIkTElORSIKICAgIExJTkU9IiQxIgogIH0KICBkb25lCn0KCmZ1bmN0aW9uIGNvbmZfcmVzZXRfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBxdWVzdGlvbi1pZAogICMgdGhpcyBpcyB1c2VkIHRvIGZsdXNoIGFueSBjYWNoZWQgYW5zd2VycyBhbmQgImFscmVhZHktZGlzcGxheWVkIiBmbGFncwogIHNoaWZ0ICMgZHVtbXkgY29tbWFuZAp9CgpmdW5jdGlvbiBjb25mX3llc25vX2Fuc3dlciB7CiAgdW5zZXQgQU5TV0VSCiAgd2hpbGUgWyAiJEFOU1dFUiIgIT0gJ3llcycgXSAmJiBbICIkQU5TV0VSIiAhPSAnbm8nIF0KICBkbyB7CiAgICBlY2hvIC1uICIkMSIKICAgIHJlYWQgQU5TV0VSCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9zdHJpbmdfYW5zd2VyIHsKICBlY2hvIC1uICIkMSIKICByZWFkIEFOU1dFUgp9CgpmdW5jdGlvbiBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcyB7CiAgZm9yIHRkaXIgaW4gIiRDUk9PVC93aW5kb3dzIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL1Byb2dyYW0gRmlsZXMiICIkQ1JPT1QvUHJvZ3JhbSBGaWxlcy9Db21tb24gRmlsZXMiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMiICIkQ1JPT1Qvd2luZG93cy9Qcm9maWxlcy9BZG1pbmlzdHJhdG9yIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL0ZvbnRzIiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcy9TdGFydHVwIgogIGRvIFsgLWQgIiR0ZGlyIiBdIHx8IG1rZGlyICIkdGRpciIKICBkb25lCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvd2luLmluaSIgXSAgICB8fCBjcCAiJFdJTklOSSIgICAgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmluaSIgXSB8fCBjcCAiJFNZU1RFTUlOSSIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiCn0KCiNjcmVhdGVzIHN5bWJvbGljIGxpbmsgaW4gd2luZG93cyBkaXJlY3RvcnkgdG8gaW5zdGFsbGVkIHdpbmVsaWIgYXBwbGljYXRpb24KI3BhcmFtZXRlcnM6CiMgLSBuYW1lIG9mIHRoZSBpbnN0YWxsZWQgd2luZWxpYiBhcHBsaWNhdGlvbgojIC0gZnVsbCBwYXRoIHRvIGFwcGxpY2F0aW9uIGluIHRoZSB3aW5lbGliIGRpcmVjdG9yeQpmdW5jdGlvbiBsaW5rX2FwcCB7CiAgbG4gLXNmICRsaWJkaXIvd2luZS8kMS5leGUuc28gJDIKfQoKI3B1dHMgd2luZG93cyBhcHBsaWNhdGlvbnMgcmVwbGFjZW1lbnRzIHRvIHdpbmRvd3MgZGlyZWN0b3JpZXMsCiNjb25maWd1cmVzIHRoZW0KZnVuY3Rpb24gY29uZmlndXJlX3dpbmVfYXBwbGljYXRpb25zIHsKICBsaW5rX2FwcCBub3RlcGFkICAgICAgIiRDUk9PVC93aW5kb3dzL25vdGVwYWQuZXhlIgogIGxpbmtfYXBwIHJlZ2VkaXQgICAgICAiJENST09UL3dpbmRvd3MvcmVnZWRpdC5leGUiCiAgbGlua19hcHAgd2NtZCAgICAgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jbWQuZXhlIgogIGxpbmtfYXBwIGNvbnRyb2wgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvY29udHJvbC5leGUiCiAgbGlua19hcHAgd2luaGVscCAgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9oZWxwLmV4ZSIKICBsaW5rX2FwcCBub3RlcGFkICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL25vdGVwYWQuZXhlIgogIGxpbmtfYXBwIHByb2dtYW4gICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvcHJvZ21hbi5leGUiCiAgbGlua19hcHAgcmVnc3ZyMzIgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9yZWdzdnIzMi5leGUiCiAgbGlua19hcHAgd2luZW1pbmUgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi93aW5taW5lLmV4ZSIKICBsaW5rX2FwcCB3aW52ZXIgICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL3dpbnZlci5leGUiCiAgbGlua19hcHAgdW5pbnN0YWxsZXIgICIkQ1JPT1Qvd2luZG93cy91bmluc3RhbGwuZXhlIgogIGxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvd2luaGVscC5leGUiCiAgbGlua19hcHAgd2luaGVscCAgICAgICIkQ1JPT1Qvd2luZG93cy93aW5obHAzMi5leGUiCn0KCiMgc3RhcnR1cC4uLgoKZWNobyAiV0lORSBJbnN0YWxsZXIgdjAuNzMiCmVjaG8KCmlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQp0aGVuIHsKCiAgaWYgISBbIC1mIGNvbmZpZ3VyZSBdCiAgdGhlbiB7CiAgICBlY2hvICJZb3UncmUgcnVubmluZyB0aGlzIGZyb20gdGhlIHdyb25nIGRpcmVjdG9yeS4iCiAgICBlY2hvICJDaGFuZ2UgdG8gdGhlIFdpbmUgc291cmNlJ3MgbWFpbiBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4iCiAgICBleGl0IDEKICB9CiAgZmkKCiAgaWYgWyBgd2hvYW1pYCA9PSAncm9vdCcgXQogIHRoZW4gewogICAgZWNobyAiWW91IGFyZSBydW5uaW5nIHdpbmVpbnN0YWxsIGFzIHJvb3QsIHRoaXMgaXMgbm90IGFkdmlzYWJsZS4gUGxlYXNlIHJlcnVuIGFzIGEgdXNlci4iCiAgICBlY2hvICJBYm9ydGluZy4iCiAgICBleGl0IDEKICB9CiAgZmkKCiAgIyBjaGVjayB3aGV0aGVyIFJQTSBpbnN0YWxsZWQsIGFuZCBpZiBpdCBpcywgcmVtb3ZlIGFueSBvbGQgd2luZSBycG0uCiAgaGFzaCBycG0gJj4vZGV2L251bGwKICBSRVQ9JD8KICBpZiBbICRSRVQgLWVxIDAgXTsgdGhlbgogICAgaWYgWyAtbiAiYHJwbSAtcWkgd2luZSAyPi9kZXYvbnVsbHxncmVwICJeTmFtZSJgIiBdOyB0aGVuCiAgICAgIGVjaG8gIldhcm5pbmc6IE9sZCBXaW5lIFJQTSBpbnN0YWxsIGRldGVjdGVkLiBEbyB5b3Ugd2FudCB0byByZW1vdmUgaXQgZmlyc3Q/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBpZiBbICIkQU5TV0VSIiA9ICd5ZXMnIF07IHRoZW4KICAgICAgICBlY2hvICJXZSBuZWVkIHRvIHJlbW92ZSB0aGUgcnBtIGFzIHJvb3QsIHBsZWFzZSBlbnRlciB5b3VyIHJvb3QgcGFzc3dvcmQiCiAgICAgICAgZWNobwogICAgICAgIGVjaG8gU3RhcnRpbmcgd2luZSBycG0gcmVtb3ZhbC4uLgogICAgICAgIHN1IC1jICJycG0gLWUgd2luZTsgUkVUPSQ/IgogICAgICAgIGlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgICAgICAgICBlY2hvIERvbmUuCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiRkFJTEVELiBQcm9iYWJseSB5b3UgYXJlbid0IGluc3RhbGxpbmcgYXMgcm9vdC4iCiAgICAgICAgICBlY2hvICJFeHBlY3QgcHJvYmxlbXMgKGxpYnJhcnkgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgaW5zdGFsbCBldGMuKS4iCiAgICAgICAgZmkKICAgICAgZWxzZQogICAgICAgIGVjaG8gIlNvcnJ5LCBJIHdvbid0IGluc3RhbGwgV2luZSB3aGVuIGFuIHJwbSB2ZXJzaW9uIGlzIHN0aWxsIGluc3RhbGxlZC4iCiAgICAgICAgZWNobyAiKFdpbmUgc3VwcG9ydCBzdWZmZXJlZCBmcm9tIHdheSB0b28gbWFueSBjb25mbGljdHMgYmV0d2VlbiBSUE0iCiAgICAgICAgZWNobyAiYW5kIHNvdXJjZSBpbnN0YWxscykiCiAgICAgICAgZWNobyAiSGF2ZSBhIG5pY2UgZGF5ICEiCiAgICAgICAgZXhpdCAxCiAgICAgIGZpCiAgICBmaQogIGZpCgogICMgY2hlY2sgd2hldGhlciB3aW5lIGJpbmFyeSBzdGlsbCBhdmFpbGFibGUKICBpZiBbIC1uICJgd2hpY2ggd2luZSAyPi9kZXYvbnVsbHxncmVwICcvd2luZSdgIiBdOyB0aGVuCiAgICBlY2hvICJXYXJuaW5nICEhIHdpbmUgYmluYXJ5IChzdGlsbCkgZm91bmQsIHdoaWNoIG1heSBpbmRpY2F0ZSIKICAgIGVjaG8gImEgKGNvbmZsaWN0aW5nKSBwcmV2aW91cyBpbnN0YWxsYXRpb24uIgogICAgZWNobyAiWW91IG1pZ2h0IHdhbnQgdG8gYWJvcnQgYW5kIHVuaW5zdGFsbCBXaW5lIGZpcnN0LiIKICAgIHN0ZF9zbGVlcAogIGZpCgogICMgcnVuIHRoZSBjb25maWd1cmUgc2NyaXB0LCBpZiBuZWNlc3NhcnkKCiAgaWYgWyAtZiBjb25maWcuY2FjaGUgXSAmJiBbIC1mIE1ha2VmaWxlIF0gJiYgWyBNYWtlZmlsZSAtbnQgY29uZmlndXJlIF0KICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkkgc2VlIHRoYXQgV0lORSBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQsIHNvIEknbGwgc2tpcCB0aGF0LiIKICAgIHN0ZF9zbGVlcAogICAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgICAuIC4vY29uZmlnLmNhY2hlCiAgfQogIGVsc2UgewogICAgZWNobyAiUnVubmluZyBjb25maWd1cmUuLi4iCiAgICBlY2hvCiAgICBpZiAhIC4vY29uZmlndXJlIC1DICRDT05GQVJHUwogICAgdGhlbiB7CiAgICAgIGVjaG8KICAgICAgZWNobyAiQ29uZmlndXJlIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgICBleGl0IDEKICAgIH0KICAgIGZpCiAgICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAgIC4gLi9jb25maWcuY2FjaGUKICAgICMgbWFrZSBzdXJlIFggd2FzIGZvdW5kCiAgICBldmFsICIkYWNfY3ZfaGF2ZV94IgogICAgaWYgWyAiJGhhdmVfeCIgIT0gInllcyIgXQogICAgdGhlbiB7CiAgICAgIGVjaG8gIkluc3RhbGwgdGhlIFggZGV2ZWxvcG1lbnQgaGVhZGVycyBhbmQgdHJ5IGFnYWluLiIKICAgICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICAgIGV4aXQgMQogICAgfQogICAgZmkKICB9CiAgZmkKCiAgIyBub3cgZG8gdGhlIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsLCB3ZSBuZWVkIHRvIGFsd2F5cyBkbyB0aGlzIGJlY2F1c2Ugd2UKICAjIGRvbid0IHdhbnQgdGhlICdtYWtlIGluc3RhbGwnIGNvbW1hbmQgd2UgbWlnaHQgcnVuIHRvIHJ1biAnbWFrZScgYXMgcm9vdAogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIHsKICAgICMgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBidWlsZCBhbmQgaW5zdGFsbCB3aW5lCiAgICBlY2hvCiAgICBlY2hvICJXZSBuZWVkIHRvIGluc3RhbGwgd2luZSBhcyByb290IHVzZXIsIGRvIHlvdSB3YW50IHVzIHRvIGJ1aWxkIHdpbmUsIgogICAgZWNobyAiJ3N1IHJvb3QnIGFuZCBpbnN0YWxsIFdpbmU/ICBFbnRlciAnbm8nIHRvIGNvbnRpbnVlIHdpdGhvdXQgaW5zdGFsbGluZyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCgogICAgaWYgWyAiJEFOU1dFUiIgPSAieWVzIiBdCiAgICB0aGVuIHsKICAgICAgIyBzdGFydCBvdXQgd2l0aCB0aGUgYmFzaWMgY29tbWFuZAogICAgICBzdWNvbW1hbmQ9Im1ha2UgaW5zdGFsbCIKCiAgICAgICMgaWYgdGhlIHVzZXIgZG9lc24ndCBoYXZlICRsaWJkaXIgaW4gdGhlaXIgbGQuc28uY29uZiBhZGQgdGhpcwogICAgICAjIHRvIG91ciBzdWNvbW1hbmQgc3RyaW5nCiAgICAgIGlmIFsgLWYgL2V0Yy9sZC5zby5jb25mIF0KICAgICAgdGhlbgogICAgICAgIGlmICEgZ3JlcCAtcXMgIiRsaWJkaXIiIC9ldGMvbGQuc28uY29uZgogICAgICAgIHRoZW4gewogICAgICAgICAgZWNobwogICAgICAgICAgZWNobyAiJGxpYmRpciBkb2Vzbid0IGV4aXN0IGluIHlvdXIgL2V0Yy9sZC5zby5jb25mLCBpdCB3aWxsIGJlIGFkZGVkIgogICAgICAgICAgZWNobyAid2hlbiB3ZSBwZXJmb3JtIHRoZSBpbnN0YWxsLi4uIgogICAgICAgICAgc3Vjb21tYW5kPSIkc3Vjb21tYW5kO2VjaG8gJGxpYmRpcj4+L2V0Yy9sZC5zby5jb25mIgogICAgICAgIH0KICAgICAgICBmaQogICAgICAgICMgcnVuIGxkY29uZmlnIGFsd2F5cyBqdXN0IGluIGNhc2Ugc29tZSB1cGRhdGVkIGZpbGVzIGRvbnQgZ2V0IGxpbmtlZAogICAgICAgIHN1Y29tbWFuZD0iJHN1Y29tbWFuZDskYWNfY3ZfcGF0aF9MRENPTkZJRyIKICAgICAgZmkKCiAgICAgIGVjaG8KCiAgICAgIGVjaG8gIkNvbXBpbGluZyBXSU5FLiBHcmFiIGEgbHVuY2ggb3IgdHdvLCByZW50IGEgdmlkZW8sIG9yIHdoYXRldmVyLCIKICAgICAgZWNobyAiaW4gdGhlIG1lYW50aW1lLi4uIgogICAgICBlY2hvCiAgICAgIHN0ZF9zbGVlcAoKICAgICAgIyB0cnkgdG8ganVzdCBtYWtlIHdpbmUsIGlmIHRoaXMgZmFpbHMgJ21ha2UgZGVwZW5kJyBhbmQgdHJ5IHRvIHJlbWFrZQogICAgICBpZiAhIHsgbWFrZTsgfQogICAgICB0aGVuIHsKICAgICAgICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogICAgICAgIHRoZW4gewogICAgICAgICAgZWNobwogICAgICAgICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgICAgICAgIGV4aXQgMQogICAgICAgIH0KICAgICAgICBmaQogICAgICB9CiAgICAgIGZpCiAgICAgIGVjaG8KCiAgICAgIGVjaG8gIlBlcmZvcm1pbmcgJ21ha2UgaW5zdGFsbCcgYXMgcm9vdCB0byBpbnN0YWxsIGJpbmFyaWVzLCBlbnRlciByb290IHBhc3N3b3JkIgoKICAgICAgc3RkX3NsZWVwCgogICAgICBpZiAhIHN1IHJvb3QgLWMgIiRzdWNvbW1hbmQiCiAgICAgIHRoZW4gewogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJFaXRoZXIgeW91IGVudGVyZWQgYW4gaW5jb3JyZWN0IHBhc3N3b3JkIG9yIHdlIGZhaWxlZCB0byBydW4iCiAgICAgICAgZWNobyAiJyRzdWNvbW1hbmQnIGNvcnJlY3RseS4iCiAgICAgICAgZWNobyAiSWYgeW91IGRpZG4ndCBlbnRlciBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgdGhlbiBwbGVhc2UgcmVwb3J0IHRoaXMiCiAgICAgICAgZWNobyAiZXJyb3IgYW5kIGFueSBzdGVwcyB0byBwb3NzaWJseSByZXByb2R1Y2UgaXQgdG8iCiAgICAgICAgZWNobyAiaHR0cDovL2J1Z3Mud2luZWhxLmNvbS8iCiAgICAgICAgZWNobwogICAgICAgIGVjaG8gIkluc3RhbGxhdGlvbiBmYWlsZWQsIGFib3J0aW5nLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQoKICAgICAgZWNobwoKICAgICAgIyBzZWUgaWYgd2luZSBpcyBpbnN0YWxsZWQgb24gdGhlIHVzZXJzIHN5c3RlbSwgaWYgbm90IHByb21wdCB0aGVtCiAgICAgICMgYW5kIHRoZW4gZXhpdAogICAgICBpZiBbICEgYHdoaWNoIHdpbmVgIF0KICAgICAgdGhlbgogICAgICAgIGVjaG8gIkNvdWxkIG5vdCBmaW5kIHdpbmUgb24geW91ciBzeXN0ZW0uICBSdW4gd2luZWluc3RhbGwgYXMgcm9vdCB0byBpbnN0YWxsIHdpbmUiCiAgICAgICAgZWNobyAiYmVmb3JlIHJlLXJ1bm5pbmcgd2luZWluc3RhbGwgYXMgYSB1c2VyLiIKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiRXhpdGluZyB3aW5laW5zdGFsbCIKICAgICAgICBleGl0IDE7CiAgICAgIGZpCiAgICB9CiAgICBlbHNlIHsKICAgICAgIyB1c2VyIGRpZG4ndCB3YW50IHRvIGluc3RhbGwgd2luZSBzbyB0ZWxsIHRoZW0gYWJvdXQgcnVubmluZyBmcm9tIHRoZQogICAgICAjIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBzZXQgc29tZSBzdHVmZiB1cCBmb3IgdGhlbQoKICAgICAgIyBzZXR1cCB0byBydW4gZnJvbSBjdXJyZW50IGRpcmVjdG9yeQogICAgICBETExQQVRIPSIkUFdEL2RsbHMiCiAgICAgIGlmIFsgLXogIiRMRF9MSUJSQVJZX1BBVEgiIF0KICAgICAgdGhlbiBMRF9MSUJSQVJZX1BBVEg9IiRQV0Q6JERMTFBBVEgiCiAgICAgIGVsc2UgTERfTElCUkFSWV9QQVRIPSIkTERfTElCUkFSWV9QQVRIOiRQV0Q6JERMTFBBVEgiCiAgICAgIGZpCiAgICAgIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKICAgICAgREVCVUdHRVI9IiRQV0QvJEhERUJVR0dFUiIKICAgICAgZWNobwogICAgICBlY2hvICJOT1RFISBUbyBydW4gV2luZSB3aXRob3V0IGluc3RhbGxpbmcsIHlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiCiAgICAgIGVjaG8gIkxEX0xJQlJBUllfUEFUSCB0byAkUFdEOiRETExQQVRIIgogICAgICBlY2hvICJpbiB5b3VyIGxvZ29uIHNjcmlwdHMuIgogICAgICBlY2hvCiAgICB9CiAgICBmaQogIH0KICBmaSAjIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KCn0KZmkgIyBCSU5ESVNUCgojIG5vdyBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBnZW5lcmF0ZSB3aW5lLmNvbmYKaWYgWyAteiAiJERPR0xPQkFMQ09ORiIgXQp0aGVuCiAgRE9HTE9CQUxDT05GPWF1dG8KZmkKCmlmIFsgIiRET0dMT0JBTENPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3lzdGVtIHdpbmUuY29uZgogIGlmIFsgISAtZiAkR0NPTkYgXSAmJiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0KICB0aGVuCiAgICBET0dMT0JBTENPTkY9bm8KICAgIGVjaG8gIkNyZWF0aW9uIG9mIGEgZ2xvYmFsIGNvbmZpZyBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gd2luZWluc3RhbGwgYXQgdGhpcyIKICAgIGVjaG8gInRpbWUuICBXaGVuIHRoZSBjb25maWd1cmF0aW9uIGFyY2hpdGVjdHVyZSBpcyBjbGVhbmVkIHVwIHRoaXMgZnVuY3Rpb25hbGl0eSIKICAgIGVjaG8gIndpbGwgYmUgcmVzdG9yZWQgdG8gd2luZWluc3RhbGwuIgogICAgZWNobwogIGZpCn0KZmkKCmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAnYXV0bycgXQp0aGVuIHsKICAjIHNlZSBpZiB0aGUgdXNlciBpcyByb290LCBpZiBzbywgZXhwbGljaXRseSBhc2sgdGhlbSBpZiB0aGV5IHdhbnQgYQogICMgbG9jYWwgY29uZmlnIGZpbGUKICBpZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0KICB0aGVuCiAgICBlY2hvICJZb3UgYXJlIHJ1bm5pbmcgYXMgcm9vdC4gIERvIHlvdSB3YW50IGEgbG9jYWwgY29uZmlnIGZpbGUsIgogICAgZWNobyAiZmlsZSwgfi8ud2luZS9jb25maWcsIGNyZWF0ZWQ/IgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogIGVsc2UKICAgICMgaWYgdGhlIHVzZXIgaGFzIGFuIGV4aXN0aW5nIGNvbmZpZyBmaWxlIGFzayB0aGVtIGlmIHRoZXkgd2FudCB1cyB0bwogICAgIyBvdmVyd3JpdGUgaXQsIG90aGVyd2lzZSBqdXN0IGFzayB0aGVtIGlmIHRoZXkgd2FudCB0byBjcmVhdGUgb25lCiAgICBpZiBbIC1mICIkTENPTkYiIF0KICAgIHRoZW4KICAgICAgZWNobyAiRm91bmQgZXhpc3RpbmcgJExDT05GLCBkbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhpcyIKICAgICAgZWNobyAiZXhpc3RpbmcgV2luZSBjb25maWd1cmF0aW9uIGZpbGU/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICAgICAgZWNobwogICAgICBpZiBbICIkQU5TV0VSIiA9ICJ5ZXMiIF0KICAgICAgdGhlbgogICAgICB7CiAgICAgICAgZWNobyAiV291bGQgeW91IGxpa2UgdG8gbWFrZSBhIGJhY2t1cCBvZiB0aGlzIG9sZCBjb25maWcgZmlsZT8iCiAgICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgICBlY2hvCiAgICAgICAgaWYgWyAiJEFOU1dFUiIgPSAieWVzIiBdCiAgICAgICAgdGhlbgogICAgICAgIHsKICAgICAgICAgIGVjaG8gIlJlbmFtaW5nICRMQ09ORiB0byAkTENPTkYub2xkIgogICAgICAgICAgbXYgLWYgIiRMQ09ORiIgIiRMQ09ORi5vbGQiCiAgICAgICAgICBlY2hvCiAgICAgICAgfQogICAgICAgIGZpCiAgICAgIH0KICAgICAgZmkKICAgIGVsc2UKICAgIHsKICAgICAgZWNobyAiQ3JlYXRlIGxvY2FsIGNvbmZpZyBmaWxlIH4vLndpbmUvY29uZmlnPyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgICAgIGVjaG8KICAgICAgaWYgWyAiJEFOU1dFUiIgPSAnbm8nIF0KICAgICAgdGhlbgogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCBuZWVkX3Jvb3QgXAogICAgICAgICAgIkFib3J0aW5nIGluc3RhbGwuIFRyeSBhZ2FpbiBhcyByb290IHRvIGdlbmVyYXRlIGEgc3lzdGVtIHdpbmUuY29uZi4iCiAgICAgICAgZXhpdCAxCiAgICAgIGZpCiAgICB9CiAgICBmaQogIGZpCn0KZmkKCiMgZ2VuZXJhdGUgJFRNUENPTkYgZnJvbSBleGlzdGluZyB3aW5kb3dzIGluc3RhbGwsIGlmIGFueQppZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkRE9XQ0hLIiA9ICd5ZXMnIF0gfHwgWyAiJERPV0NISyIgPSAnYXV0bycgXQogIHRoZW4gewogICAgZWNobyAtbiAiU2VhcmNoaW5nIGZvciBhbiBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4uLiIKICAgIGlmICEgJFdJTkVDT05GIC1pbmlmaWxlICIkV0lORUlOSSIgPiAkVE1QQ09ORiAyPi9kZXYvbnVsbAogICAgdGhlbiB7CiAgICAgIHJtIC1mICRUTVBDT05GICRUTVBSRUcgPiAvZGV2L251bGwKCiAgICAgIGVjaG8gIiBub3QgZm91bmQuIChubyBtYXRjaGluZyAvZXRjL2ZzdGFiIG1vdW50IGVudHJ5IGZvdW5kKSIKICAgICAgY29uZl9xdWVzdGlvbiBsb3cgZG9fd2l0aG91dF93aW5kb3dzIFwKICAgICAgICJXaW5kb3dzIHdhcyBub3QgZm91bmQgb24geW91ciBzeXN0ZW0sIHNvIEkgYXNzdW1lIHlvdSB3YW50IiBcCiAgICAgICAiYSBXaW5lLW9ubHkgaW5zdGFsbGF0aW9uLiBBbSBJIGNvcnJlY3Q/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggd2luZG93c19ub3RfZm91bmQgXAogICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gTWFrZSBzdXJlIHlvdXIgV2luZG93cyBwYXJ0aXRpb24gaXMgbW91bnRlZCBhbmQgdHJ5IGFnYWluLCIgXAogICAgICAgICAib3IgY3JlYXRlICRMQ09ORiBtYW51YWxseSBieSBjb3B5aW5nIGZyb20gJFdJTkVJTkkgYW5kIGFkYXB0aW5nIHRoZSBkcml2ZSBwYXRocy4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgICAgRE9XSU5FPXllcwogICAgfQogICAgZWxzZSB7CiAgICAgIGVjaG8gIiBmb3VuZC4iCgogICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHdpbmRvd3NfZm91bmQKICAgICAgY29uZl9xdWVzdGlvbiBsb3cgd2luZG93c19mb3VuZCBcCiAgICAgICAiQ3JlYXRlZCAkTENPTkYgdXNpbmcgeW91ciBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4iIFwKICAgICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgICAgIERPV0lORT1ubwogICAgfQogICAgZmkKICB9CiAgZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCiAgdGhlbiBET1dJTkU9eWVzCiAgZmkKfQplbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KdGhlbgogIERPV0lORT1ubwpmaQoKIyBzZXR1cCBhIG5vLXdpbmRvd3MgaW5zdGFsbGF0aW9uLCBpZiBuZWNlc3NhcnkKaWYgWyAiJERPV0lORSIgPSAneWVzJyBdCnRoZW4gewogICMgc2V0IGFuIGFwcHJvcHJpYXRlIERDUk9PVAogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIERDUk9PVD1+L2MKICBlbHNlIERDUk9PVD0vYwogIGZpCgogIGlmIFsgLWYgfi8ud2luZXJjIF0KICB0aGVuIHsKICAgIGNvbmZfcXVlc3Rpb24gbWVkaXVtIGNvbnZlcnRfY29uZmlnIFwKICAgICAiSSBmb3VuZCB0aGUgb2xkIHZlcnNpb24gV2luZSBjb25maWcgZmlsZSwgLndpbmVyYywgaW4geW91ciAiIFwKICAgICAiaG9tZSBkaXJlY3RvcnkuICBJIGNhbiBjb252ZXJ0IHRoaXMgdG8gdGhlIG5ldyBmb3JtYXQgb3IgdXNlIHRoZSIgXAogICAgICJuZXcgZGVmYXVsdCBXaW5lIGNvbmZpZyBmaWxlLiBDb252ZXJ0PyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBpZiBbICIkQU5TV0VSIiA9ICd5ZXMnIF0KICAgIHRoZW4gewogICAgICBXSU5FSU5JPX4vLndpbmVyYwogICAgICBDT05WQ09ORj15ZXMKICAgIH0KICAgIGZpCiAgfQogIGVsc2UgewoKICAgIGNvbmZfcXVlc3Rpb24gbG93IGRyaXZlY19wYXRoIFwKICAgICAiQ29uZmlndXJpbmcgV2luZSB3aXRob3V0IFdpbmRvd3MuIiBcCiAgICAgIlNvbWUgZmFrZSBXaW5kb3dzIGRpcmVjdG9yaWVzIG11c3QgYmUgY3JlYXRlZCwgdG8gaG9sZCBhbnkgLmluaSBmaWxlcywgRExMcywiIFwKICAgICAic3RhcnQgbWVudSBlbnRyaWVzLCBhbmQgb3RoZXIgdGhpbmdzIHlvdXIgYXBwbGljYXRpb25zIG1heSBuZWVkIHRvIGluc3RhbGwuIiBcCiAgICAgIldoZXJlIHdvdWxkIHlvdSBsaWtlIHlvdXIgZmFrZSBDIGRyaXZlIHRvIGJlIHBsYWNlZD8iCiAgICB3aGlsZSBbIC16ICIkQ1JPT1QiIF0KICAgIGRvIHsKICAgICAgY29uZl9zdHJpbmdfYW5zd2VyICIoZGVmYXVsdCBpcyAkRENST09UKSAiCiAgICAgIFsgLXogIiRBTlNXRVIiIF0gJiYgQU5TV0VSPSIkRENST09UIgogICAgICBpZiAhIFsgLWQgIiRBTlNXRVIiIF0KICAgICAgdGhlbiB7CiAgICAgICAgaWYgbWtkaXIgLXAgIiRBTlNXRVIiCiAgICAgICAgdGhlbiBDUk9PVD0iJEFOU1dFUiIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICJEaXJlY3RvcnkgJEFOU1dFUiBjYW4ndCBiZSBjcmVhdGVkICEiCiAgICAgICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRyaXZlY19wYXRoCiAgICAgICAgZmkKICAgICAgfQogICAgICBlbHNlIENST09UPSIkQU5TV0VSIgogICAgICBmaQogICAgfQogICAgZG9uZQogICAgZWNobyAiQ29uZmlndXJpbmcgV2luZSBmb3IgYSBuby13aW5kb3dzIGluc3RhbGwgaW4gJENST09ULi4uIgoKICAgIGNyZWF0ZV93aW5kb3dzX2RpcmVjdG9yaWVzCiAgICBjb25maWd1cmVfd2luZV9hcHBsaWNhdGlvbnMKICB9CiAgZmkKCiAgIyBjcmVhdGUgJExDT05GIHVzaW5nIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlICRXSU5FSU5JCiAgaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0gJiYgWyAiJENPTlZDT05GIiA9ICdubycgXQogIHRoZW4gewogICAgc2VkICJzfFwiUGF0aFwiID0gXCIvY1wiXCR8XCJQYXRoXCIgPSBcIiR7Q1JPT1R9XCJ8IiAkV0lORUlOSSA+ICRUTVBDT05GCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRlZmF1bHRfY29uZmlnCiAgICBjb25mX3F1ZXN0aW9uIGxvdyBkZWZhdWx0X2NvbmZpZyBcCiAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIGRlZmF1bHQgV2luZSBjb25maWd1cmF0aW9uLiIgXAogICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgfQogIGZpCgogICMgbm93IHdlIHJlYWxseSBzaG91bGQgaW5zdGFsbCB0aGUgcmVnaXN0cnkKICBpZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KICB0aGVuIERPUkVHPXllcwogIGZpCn0KZmkKZWNobwoKI2luc3RhbGwgdGhlIGxvY2FsIGNvbmZpZyBmaWxlICRMQ09ORgppZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXQp0aGVuCiAgaWYgWyAhIC13IH4vLndpbmUgXQogIHRoZW4KICAgIG1rZGlyIH4vLndpbmUKICBmaQoKICBpZiBbICIkQ09OVkNPTkYiID0gJ25vJyBdCiAgdGhlbgogICAgY3AgJFRNUENPTkYgJExDT05GID4gL2Rldi9udWxsCiAgZmkKZWxzZQogIERPUkVHPW5vCmZpCgojaW5zdGFsbCB0aGUgZ2xvYmFsIGNvbmZpZyBmaWxlICRHQ09ORgppZiBbICIkRE9HTE9CQUxDT05GIiA9ICd5ZXMnIF0KdGhlbgogIGlmIFsgISAtZiAkc3lzY29uZmRpciBdCiAgdGhlbgogICAgbWtkaXIgLXAgJHN5c2NvbmZkaXIKICBmaQoKICBjcCAkVE1QQ09ORiAkR0NPTkYgPiAvZGV2L251bGwKZmkKCiMgY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQojIChub3QgdG8gYmUgZG9uZSBpZiB3aW5kb3dzIHJlZ2lzdHJ5IGV4aXN0cykKaWYgWyAiJERPUkVHIiA9ICdhdXRvJyBdCnRoZW4gewogIENST09UPWBzZWQgLW4gJy9eXFtEcml2ZSBDXF0kLywvXlxbLipcXSQvIHMvXlwiUGF0aFwiID0gXCJcKC4qXClcIi9cMS9wJyAkTENPTkZgCiAgZWNobyAiQ2hlY2tpbmcgZm9yIHJlYWwgV2luZG93cyByZWdpc3RyeS4uLiIKICBpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uZGF0IiBdCiAgdGhlbiBET1JFRz1ubwogIGVsaWYgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvY29uZmlnL3N5c3RlbSIgXQogIHRoZW4gRE9SRUc9bm8KICBlbGlmIFsgLWYgIiRDUk9PVC9XSU5OVC9zeXN0ZW0zMi9jb25maWcvc3lzdGVtIiBdCiAgdGhlbiBET1JFRz1ubwogIGVsc2UgRE9SRUc9eWVzCiAgZmkKICBpZiBbICIkRE9SRUciID0gJ3llcycgXQogIHRoZW4gZWNobyAiTm90IGZvdW5kLCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgd2lsbCBiZSBpbnN0YWxsZWQuIgogIGVsc2UgZWNobyAiV2luZG93cyByZWdpc3RyeSBmb3VuZCwgd2lsbCBub3QgaW5zdGFsbCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkuIgogIGZpCiAgZWNobwp9CmZpCgojIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeSBlbnRyaWVzCmlmIFsgIiRET1JFRyIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQogIHRoZW4gewogICAgZWNobyAiQ29tcGlsaW5nIHJlZ2VkaXQuLi4iCiAgICAoY2QgcHJvZ3JhbXMvcmVnZWRpdDsgbWFrZSkKICAgIGVjaG8KICB9CiAgZmkKICBlY2hvICJQcmVwYXJpbmcgdG8gaW5zdGFsbCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgZW50cmllcy4uLiIKCiAgIyBlZGl0IGNvbmZpZyBmaWxlcyBzbyB3ZSBkb24ndCBoYXZlIHRvIHJ1biByZWdlZGl0IHVuZGVyIFgKICBpZiBbICIkQ09OVkNPTkYiID0gJ3llcycgXQogIHRoZW4KICAgIG12ICRXSU5FSU5JICRXSU5FSU5JLm5ldwogICAgc2VkICJzL0dyYXBoaWNzRHJpdmVyPS4qL0dyYXBoaWNzRHJpdmVyPXR0eWRydi8iICRXSU5FSU5JLm5ldyA+ICRXSU5FSU5JCiAgZWxzZQogICAgbXYgJExDT05GICRMQ09ORi5uZXcKICAgIHNlZCAicy9cIkdyYXBoaWNzRHJpdmVyXCIgPSAuKi9cIkdyYXBoaWNzRHJpdmVyXCIgPSBcInR0eWRydlwiLyIgJExDT05GLm5ldyA+ICRMQ09ORgogIGZpCgogICMgY3JlYXRlIGEgdGVtcG9yYXJ5IHdpbmVpbnN0YWxsLnJlZyB3aXRoIGZpeGVkIGRlYnVnZ2VyIHBhdGgKICAkREVGQ0FUICRERUZSRUcgfCBzZWQgInN8ZGVidWdnZXIvd2luZWRiZ3wke0RFQlVHR0VSfXwiID4gJFRNUFJFRwoKICBlY2hvICJJbnN0YWxsaW5nIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgogIGVjaG8KICBpZiAhICRSRUdFRElUICRUTVBSRUcgPiAvZGV2L251bGwKICB0aGVuIHsKICAgIHJtIC1mICRUTVBSRUcKICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gcmVnZWRpdF9lcnJvcgogICAgY29uZl9xdWVzdGlvbiBoaWdoIHJlZ2VkaXRfZXJyb3IKICAgIGV4aXQgMQogIH0KICBlbHNlIHsKICAgICMgaWYgd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBhIC53aW5lcmMgZmlsZSwgcnVubmluZyByZWdlZGl0IG9uY2UKICAgICMgd2lsbCBPTkxZIGNvbnZlcnQgLndpbmVyYyAtPiB+Ly53aW5lL2NvbmZpZywgaXQgd2lsbCBub3QgaW1wb3J0IHRoZQogICAgIyByZWdpc3RyeSBkYXRhLiAgc28gaWYgd2UgYXJlIGNvbnZlcnRpbmcgd2UgbmVlZCB0byBydW4gcmVnZWRpdCB0d2ljZQogICAgaWYgWyAiJENPTlZDT05GIiA9ICd5ZXMnIF0KICAgIHRoZW4KICAgICAgaWYgISAkUkVHRURJVCAkVE1QUkVHID4gL2Rldi9udWxsCiAgICAgIHRoZW4KICAgICAgICBybSAtZiAkVE1QUkVHCiAgICAgICAgZWNobyAiUmVnaXN0cnkgaW5zdGFsbCBmYWlsZWQuIgogICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gcmVnZWRpdF9lcnJvcgogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCByZWdlZGl0X2Vycm9yCiAgICAgICAgZXhpdCAxCiAgICAgIGVsc2UKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiUmVnaXN0cnkgZW50cmllcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLiIKICAgICAgZmkKICAgIGVsc2UKICAgICAgZWNobwogICAgICBlY2hvICJSZWdpc3RyeSBlbnRyaWVzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQuIgogICAgZmkKICB9CiAgZmkKICBybSAtZiAkVE1QUkVHCiAgaWYgWyAiJFNZU1JFRyIgPSAnYXV0bycgXQogIHRoZW4gU1lTUkVHPXllcwogIGZpCgogICMgaWYgd2UgY29udmVydGVkIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBncmFwaGljcyBkcml2ZXIgYmFjayBhbmQKICAjIHJlc3RvcmUgdGhlIG9yaWdpbmFsIC53aW5lcmMgZmlsZQogIGlmIFsgIiRDT05WQ09ORiIgPSAneWVzJyBdCiAgdGhlbgogICAgIG12ICRXSU5FSU5JLm5ldyAkV0lORUlOSQogIGZpCgogIHNlZCAicy9cIkdyYXBoaWNzRHJpdmVyXCIgPSAuKi9cIkdyYXBoaWNzRHJpdmVyXCIgPSBcIngxMWRydlwiLyIgJExDT05GID4gJExDT05GLm5ldwogIG12ICRMQ09ORi5uZXcgJExDT05GCn0KZmkKCiMgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsLCBpZiBkZXNpcmVkCmlmIFsgYHdob2FtaWAgPSAncm9vdCcgXSAmJiBbICIkRE9SRUciID0gJ3llcycgXSAmJiBbICIkU1lTUkVHIiA9ICd5ZXMnIF0KdGhlbiB7CiAgWyAtZCB+Ly53aW5lIF0gfHwgbWtkaXIgfi8ud2luZQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3MgdXNlciByZWdpc3RyeSBoaXZlIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuLi4iCiAgICBbIC1mIH4vLndpbmUvd2luZS51c2VycmVnIF0gJiYgY3Agfi8ud2luZS93aW5lLnVzZXJyZWcgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIH4vLndpbmUvd2luZS51c2VycmVnCiAgfQogIGZpCiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHN5c3RlbSByZWdpc3RyeSBoaXZlIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuLi4iCiAgICBbIC1mIH4vLndpbmUvc3lzdGVtLnJlZyBdICYmIGNwIH4vLndpbmUvc3lzdGVtLnJlZyAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnIH4vLndpbmUvc3lzdGVtLnJlZwogIH0KICBmaQp9CmZpCgojIGNsZWFudXAgYW55IHRlbXBvcmFyeSBmaWxlcyB0aGF0IG1heSByZW1haW4KaWYgWyAtZiAkVE1QQ09ORiBdCnRoZW4gcm0gLWYgJFRNUENPTkYKZmkKaWYgWyAtZiAkVE1QUkVHIF0KdGhlbiBybSAtZiAkVE1QUkVHCmZpCgoKIyBpdCdzIGEgd3JhcAplY2hvCmVjaG8gIkluc3RhbGxhdGlvbiBjb21wbGV0ZSBmb3Igbm93LiBHb29kIGx1Y2sgKHRoaXMgaXMgc3RpbGwgYWxwaGEgc29mdHdhcmUpLiIKZWNobyAiSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBXSU5FLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmaXJzdCwiCmVjaG8gImFzIG1hbnkga2luZHMgb2YgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBleHBsYWluZWQgdGhlcmUuIgoKZXhpdCAwCg==