IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMKIyBIaXN0b3J5OgojIE1hciAzMSAxOTk5IC0gT3ZlIEvldmVuCiMgIEZpcnN0IHZlcnNpb24KIyBEZWMgOSAxOTk5IC0gT3ZlIEvldmVuCiMgIHJlcXVpcmUgWHBtCiMgRmViIDI1IDIwMDAgLSBPdmUgS+V2ZW4KIyAgYXV0by1hZGQgL3Vzci9sb2NhbC9saWIgdG8gL2V0Yy9sZC5zby5jb25mCiMgTWFyIDIgMjAwMCAtIE92ZSBL5XZlbgojICBzb3VyY2UgcmF0aGVyIHRoYW4gZ3JlcCBjb25maWcuY2FjaGUKIyAgdXNlIHNvdXJjZWQgY29uZmlnLmNhY2hlIHRvIHN0YXJ0IGxkY29uZmlnCiMgIHJlY29uZmlndXJlIGlmIGNvbmZpZy5jYWNoZSBkb2Vzbid0IGV4aXN0CiMgTWFyIDMwIDIwMDAgLSBPdmUgS+V2ZW4KIyAgYXV0b2NvbmZpZ3VyZSBuby13aW5kb3dzIGluc3RhbGxzCiMgIGRvIG5vdCBpbnN0YWxsIHJlZ2lzdHJ5IG9uIHJlYWwtd2luZG93cyBpbnN0YWxscwojICBzb21lIHN1cHBvcnQgZm9yIGJpbmFyeSBwYWNrYWdlIGluc3RhbGxzCiMgIHNldCBhbmQgdGVsbCB1c2VyIGFib3V0IExEX0xJQlJBUllfUEFUSCBpZiBuZWNlc3NhcnkKIyAgc2V0IEVYVFJBX0xEX0xJQlJBUllfUEFUSCBpbiB3aW5lLmNvbmYKIyBBcHIgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCAoc3lzdGVtLWRlZmF1bHQpCiMgTWF5IDkgMjAwMCAtIE92ZSBL5XZlbgojICB1c2UgdHR5ZHJ2IHdoZW4gcnVubmluZyByZWdhcGksIHNvIHdlIGRvbid0IGhhdmUgdG8gcnVuIGZyb20gWAojICBjaGFuZ2UgZGVidWdnZXIgcGF0aCBpbiByZWdpc3RyeQojIE9jdCAyOSAyMDAwIC0gT3ZlIEvldmVuCiMgIGFkZGVkIC0tZW5hYmxlLW9wZW5nbCB0byBkZWZhdWx0IGNvbmZhcmdzCiMgIGFkZGVkIGNvbmZfcXVlc3Rpb24sIGNvbmZfeWVzbm9fYW5zd2VyLCBhbmQgY29uZl9zdHJpbmdfYW5zd2VyIGZ1bmN0aW9ucwojICBhZGRlZCBERUZDQVQgdmFyaWFibGUKIyAobGF0ZXIgdGhhdCBkYXkuLi4pCiMgIGFkZGVkIGNvbmZfcmVzZXRfcXVlc3Rpb24gZnVuY3Rpb24KIyAgYWRkZWQgZmlsZSBleGlzdGVuY2UgY2hlY2tzIHRvIHRoZSByZWdpc3RyeSBjb3B5aW5nCiMgIGZpeGVkIHByb2JsZW0gd2l0aCBuby13aW5kb3dzIGRpcmVjdG9yeSBjcmVhdGlvbgojICBzb21lIHRleHQgcmVmb3JtYXR0aW5nIGZyb20gRXJpYyBNYXJ5bmlhawojIEphbiA1IDIwMDAgLSBDaHJpcyBNb3JnYW4KIyAgdXNlIGRlZmF1bHQgY29uZmlnIGZpbGUgaW4gL2RvY3VtZW50YXRpb24vc2FtcGxlcy9jb25maWcKIyAgcmVwbGFjZSAud2luZXJjIHdpdGggfi8ud2luZS9jb25maWcgaW4gcHJpbnRlZCB0ZXh0CiMgIGFkZGVkIHVzZXIgcXVlc3Rpb24gdG8gY29udmVydCAud2luZXJjIGZpbGUoaWYgZXhpc3RzKSBvciB1c2UgdGhlIGRlZmF1bHQKIyAgICBjb25maWcgZmlsZQojICBhZGQgY29uZl9xdWVzdGlvbiB0byBhbGxvdyByb290IHRvIGluc3RhbGwgYSBsb2NhbCBjb25maWcgZmlsZSBhbmQKIyAgICByZWdpc3RyeQojIEphbiAxMiAyMDAwIC0gQ2hyaXMgTW9yZ2FuCiMgIGRpc3Rpbmd1aXNoIGJldHdlZW4gY3JlYXRpbmcgbG9jYWwgYW5kIGdsb2JhbCBjb25maWcgZmlsZXMKIyAgZGlzcGxheSBhIG1lc3NhZ2UgYWJvdXQgdGhlIHN0YXR1cyBvZiBnbG9iYWwgY29uZmlnIGZpbGVzCiMgIG1pc2MgY2xlYW51cHMgYW5kIHJlb3JkZXJpbmcgb2YgcXVlc3Rpb25zCiMgIGFkZGVkIGNoZWNrIHRvIHNlZSBpZiB3aW5lIGlzIGluc3RhbGxlZCB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGEgbm9ybWFsCiMgICAgdXNlciBhbmQgcHJpbnQgYSBtZXNzYWdlIGlmIHdpbmUgY2Fubm90IGJlIGZvdW5kCiMgRmViIDE2IDIwMDIgLSBBZGFtIEQuIE1vc3MKIyAgVXNlIGNvbmZpZy5zdGF0dXMgaW5zdGVhZCBvZiBjb25maWcuY2FjaGUgdG8gY2hlY2sgd2hldGhlciB3ZSdyZQojICAgIGNvbmZpZ3VyZWQvY29tcGlsZWQgYW5kIHRvIHJlY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uCiMgRmViIDIwIDIwMDIgLSBBZGFtIEQuIE1vc3MKIyAgUGFydGlhbGx5IHJldmVydCBwcmV2aW91cyBjaGFuZ2VzLCBmb3JjZSBjb25maWd1cmUgdG8gd3JpdGUgYW4KIyAgICBvbGQtc3R5bGUgY29uZmlnLmNhY2hlCiMgTWFyIDI3IDIwMDIgLSBDaHJpcyBNb3JnYW4KIyAgcHJldmVudCB0aGUgdXNlciBmcm9tIHJ1bm5pbmcgd2luZWluc3RhbGwgYXMgcm9vdAojICBhZGQgc2NyaXB0IGNvbW1hbmRzIHNvIHdlIHN1IHJvb3QgZm9yICdtYWtlIGluc3RhbGwnIGFuZCBvdGhlciBjb21tYW5kcwojICAgIHRoYXQgcmVxdWlyZSByb290IGFjY2VzcwojICBhZGQgdGV4dCB0byB0ZWxsIHRoZSB1c2VyIHdlIG5lZWQgdG8gcnVuIHN0dWZmIGFzIHJvb3Qgc28gdGhleSBkb24ndAojICAgIHRoaW5rIHdlIGFyZSB0cnlpbmcgdG8gcHVsbCBzb21ldGhpbmcgZnVubnkKIyBBcHIgMTQgMjAwMiAtIER1c3RpbiBOYXZlYQojICBGaXggc2VkIGNvbW1hbmQgd2hlbiBmaW5kaW5nIHJlYWwtd2luZG93cyByZWdpc3RyeSBzbyBpdCBhY3R1YWxseQojICAgYWNjZXNzZXMgYSBmaWxlICh+Ly53aW5lL2NvbmZpZykgaW5zdGVhZCBvZiBudWxsICgkQ09ORj8hKQojICBBZGRlZCBzZWFyY2ggZm9yIGNsZWFuLWluc3RhbGwgKG5vdCB1cGdyYWRlKSBXaW4yayByZWdpc3RyeQojICAobmV4dCBkYXksIGFmdGVyIHNvbWUgc2xlZXApCiMgIEZpeCBzZWQgc3RyaW5nIHdoZW4gZmluZGluZyByZWFsLXdpbmRvd3MgcmVnaXN0cnkgdG8gYWN0dWFsbHkgZmluZAojICAgd2luZG93cyBwYXJ0aXRpb24gbmFtZSBpbiBbRHJpdmUgQ10gc2VjdGlvbgojICBpdCBzaG91bGQgbm93IGFsbW9zdCBhbHdheXMgZmluZCB0aGUgd2luZG93cyBwYXJ0aXRpb24gYW5kIHJlYWwtd2luZG93cwojICByZWdpc3RyeSAoaWYgbm90LCBsZXQgbWUga25vdykKIyBBdWcgMjkgMjAwMiAtIFJvayBNYW5kZWxqYyA8cm9rLm1hbmRlbGpjQGdpbWIub3JnPgojICAtYWRkZWQgdHdvIHN5bWxpbmtzOyB3aW5kb3dzL3dpbmhlbHAuZXhlIGFuZCB3aW5kb3dzL3dpbmhscDMyLmV4ZSBiZWNhdXNlIGl0IHNlZW1zCiMgICB0aGF0IHNvbWUgYXBwcyBsb29rIGZvciB3aW5obHAzMi5leGUvd2luaGVscCB0byBkaXNwbGF5IGhlbHAKIwoKIy0tLSBkZWZhdWx0cyAoY2hhbmdlIHRoZXNlIGlmIHlvdSBhcmUgYSBwYWNrYWdlcikKQ09ORkFSR1M9Ii0tZW5hYmxlLW9wZW5nbCIgICAgIyBjb25maWd1cmUgYXJncywgZS5nLiAtLXByZWZpeD0vdXNyIC0tc3lzY29uZmRpcj0vZXRjCnByZWZpeD0vdXNyL2xvY2FsICAgICAgICAgICAgICMgaW5zdGFsbGF0aW9uIHByZWZpeApzeXNjb25mZGlyPSRwcmVmaXgvZXRjICAgICAgICAjIHdoZXJlIHdpbmUuY29uZiBhbmQgdGhlIGdsb2JhbCByZWdpc3RyeSBhcmUgc3VwcG9zZWQgdG8gYmUKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgYXJlKSBpbnN0YWxsZWQKbGliZGlyPSRwcmVmaXgvbGliICAgICAgICAgICAgIyB3aGVyZSBsaWJ3aW5lLnNvIHdpbGwgYmUgKG9yIGlzKSBpbnN0YWxsZWQKZXhkaXI9ZG9jdW1lbnRhdGlvbi9zYW1wbGVzICAgIyB3aGVyZSB0aGUgc2FtcGxlIHN5c3RlbS5pbmkgcmVzaWRlcwpHQ09ORj0kc3lzY29uZmRpci93aW5lLmNvbmYgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgd2luZS5jb25mIGdsb2JhbCBjb25maWcgZmlsZQpMQ09ORj1+Ly53aW5lL2NvbmZpZyAgICAgICAgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgbG9jYWwgY29uZmlnIGZpbGUKQklORElTVD1ubyAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIGNhbGxlZCBmcm9tIGEgYmluYXJ5IHBhY2thZ2UgY29uZmlnIHNjcmlwdApET0dMT0JBTENPTkY9YXV0byAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2dlbmVyYXRlIHdpbmUuY29uZgpET0xPQ0FMQ09ORj1hdXRvICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2dlbmVyYXRlIGxvY2FsY29uZgpET1dDSEs9YXV0byAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2NvbmZpZ3VyZSBleGlzdGluZy13aW5kb3dzIGluc3RhbGxhdGlvbgpET1dJTkU9YXV0byAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2NvbmZpZ3VyZSBuby13aW5kb3dzIGluc3RhbGxhdGlvbgpET1JFRz1hdXRvICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5CkRPQVBQPWF1dG8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBpbnN0YWxsIGFwcGxpY2F0aW9ucywgZGlzdHJpYnV0ZWQgd2l0aCBXaW5lClNZU1JFRz15ZXMgICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBtYWtlIHJvb3QncyByZWdpc3RyeSBnbG9iYWwgKHN5c3RlbS1kZWZhdWx0KQpDT05WQ09ORj1ubwkJICAgICAgIyB3aGV0aGVyIHdlIGFyZSBjb252ZXJ0aW5nIGFuIGV4aXN0aW5nIC53aW5lcmMgb3Igbm90CgojICJtYWtlIGluc3RhbGwiIHN0aWxsIGluc3RhbGxzIHRoZSBkbGxzIGludG8gJGxpYmRpciwgYnV0IHRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlCiMgKERMTFBBVEggc2hvdWxkIHBvaW50IHRvIHRoZW0gaWYvd2hlbiB0aGV5IGFyZSBub3QgaW4gc3RhbmRhcmQgbGQuc28gcGF0aHMpCkRMTFBBVEg9JGxpYmRpci93aW5lICAgICAgICAgICMgZGVmYXVsdCBwYXRoIG9mIHRoZSBkbGwgLnNvIGZpbGVzIChleGNlcHQgbGlid2luZS5zbykKCiMgaGF2aW5nIHRoZSBXaW5lIGRlYnVnZ2VyIGxhdW5jaGVkIGF1dG9tYXRpY2FsbHkgd2lsbCBiZSBhIHBsdXMgZm9yIHVzCkRFQlVHR0VSPSRiaW5kaXIvd2luZWRiZyAgICAgICMgdGhlIChpbnN0YWxsZWQpIHBhdGggb2Ygd2luZWRiZwpIREVCVUdHRVI9ZGVidWdnZXIvd2luZWRiZyAgICAjIHRoZSAobm9uLWluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCgojIHRoaXMgaXMgb25seSBmb3IgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxscwpXSU5FQ09ORj10b29scy93aW5lY29uZiAgICAgICAjIHBhdGggdG8gdGhlIHdpbmVjb25mIHBlcmwgc2NyaXB0CgojIHRoaXMgaXMgb25seSBmb3Igbm8td2luZG93cyBpbnN0YWxscwpXSU5FSU5JPSRleGRpci9jb25maWcgICAgICAgICAjIHBhdGggdG8gdGhlIGRlZmF1bHQgd2luZSBjb25maWcgZmlsZSAoYWxzbyB1c2VkIGJ5IHdpbmVjb25mKQpXSU5JTkk9L2Rldi9udWxsICAgICAgICAgICAgICAjIHBhdGggdG8gdGhlIGRlZmF1bHQgd2luLmluaQpTWVNURU1JTkk9JGV4ZGlyL3N5c3RlbS5pbmkgICAjIHBhdGggdG8gdGhlIGRlZmF1bHQgc3lzdGVtLmluaQpSRUdFRElUPXByb2dyYW1zL3JlZ2VkaXQvcmVnZWRpdCAgICAgICAjIHBhdGggdG8gdGhlIHJlZ2VkaXQgd2luZWxpYiBhcHBsaWNhdGlvbgpERUZSRUc9d2luZWRlZmF1bHQucmVnICAgICAgICAjIHBhdGggb2YgdGhlIHJlZ2lzdHJ5IGZpbGUgdG8gYmUgZmVkIHRvIHJlZ2VkaXQKIyBDUk9PVD0vdmFyL3dpbmUgICAgICAgICAgICAgIyBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQpERUZDQVQ9Y2F0ICAgICAgICAgICAgICAgICAgICAjIHByb2dyYW0gdG8gY2F0ICRERUZSRUcgd2l0aCAoc29tZSBwYWNrYWdlcyBuZWVkIHpjYXQpCiMtLS0gZW5kIG9mIGRlZmF1bHRzCgojIHRlbXBvcmFyeSBmaWxlcyB1c2VkIGJ5IHRoZSBpbnN0YWxsZXIKVE1QQ09ORj0vdG1wL3dpbmVpbnN0YWxsLmNvbmYKVE1QUkVHPS90bXAvd2luZWluc3RhbGwucmVnCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gc3RkX3NsZWVwIHsKICBzbGVlcCAxCn0KCmZ1bmN0aW9uIGNvbmZfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBpbXBvcnRhbmNlLCAkMiA9IHF1ZXN0aW9uLWlkLCAkMysgPSBtZXNzYWdlIGxpbmVzCiAgIyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgYnkgZS5nLiBkZWJjb25mIGluIGRlYmlhbiBwYWNrYWdlcwogICMgYnV0IGhlcmUgd2UganVzdCBwcmludCB0aGUgbWVzc2FnZQogIHNoaWZ0IDIKICBlY2hvCiAgbG9jYWwgTElORT0iJDEiCiAgd2hpbGUgc2hpZnQKICBkbyB7CiAgICBlY2hvICIkTElORSIKICAgIExJTkU9IiQxIgogIH0KICBkb25lCn0KCmZ1bmN0aW9uIGNvbmZfcmVzZXRfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBxdWVzdGlvbi1pZAogICMgdGhpcyBpcyB1c2VkIHRvIGZsdXNoIGFueSBjYWNoZWQgYW5zd2VycyBhbmQgImFscmVhZHktZGlzcGxheWVkIiBmbGFncwogIHNoaWZ0ICMgZHVtbXkgY29tbWFuZAp9CgpmdW5jdGlvbiBjb25mX3llc25vX2Fuc3dlciB7CiAgdW5zZXQgQU5TV0VSCiAgd2hpbGUgWyAiJEFOU1dFUiIgIT0gJ3llcycgXSAmJiBbICIkQU5TV0VSIiAhPSAnbm8nIF0KICBkbyB7CiAgICBlY2hvIC1uICIkMSIKICAgIHJlYWQgQU5TV0VSCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9zdHJpbmdfYW5zd2VyIHsKICBlY2hvIC1uICIkMSIKICByZWFkIEFOU1dFUgp9CgpmdW5jdGlvbiBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcyB7CiAgZm9yIHRkaXIgaW4gIiRDUk9PVC93aW5kb3dzIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL1Byb2dyYW0gRmlsZXMiICIkQ1JPT1QvUHJvZ3JhbSBGaWxlcy9Db21tb24gRmlsZXMiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMiICIkQ1JPT1Qvd2luZG93cy9Qcm9maWxlcy9BZG1pbmlzdHJhdG9yIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL0ZvbnRzIiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcy9TdGFydHVwIgogIGRvIFsgLWQgIiR0ZGlyIiBdIHx8IG1rZGlyICIkdGRpciIKICBkb25lCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvd2luLmluaSIgXSAgICB8fCBjcCAiJFdJTklOSSIgICAgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmluaSIgXSB8fCBjcCAiJFNZU1RFTUlOSSIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiCn0KCiNjcmVhdGVzIHN5bWJvbGljIGxpbmsgaW4gd2luZG93cyBkaXJlY3RvcnkgdG8gaW5zdGFsbGVkIHdpbmVsaWIgYXBwbGljYXRpb24KI3BhcmFtZXRlcnM6CiMgLSBuYW1lIG9mIHRoZSBpbnN0YWxsZWQgd2luZWxpYiBhcHBsaWNhdGlvbgojIC0gZnVsbCBwYXRoIHRvIGFwcGxpY2F0aW9uIGluIHRoZSB3aW5lbGliIGRpcmVjdG9yeQpmdW5jdGlvbiBsaW5rX2FwcCB7CiAgbG4gLXNmICRsaWJkaXIvd2luZS8kMS5leGUuc28gJDIKfQoKI3B1dHMgd2luZG93cyBhcHBsaWNhdGlvbnMgcmVwbGFjZW1lbnRzIHRvIHdpbmRvd3MgZGlyZWN0b3JpZXMsCiNjb25maWd1cmVzIHRoZW0KZnVuY3Rpb24gY29uZmlndXJlX3dpbmVfYXBwbGljYXRpb25zIHsKICBsaW5rX2FwcCBub3RlcGFkICAgICAgIiRDUk9PVC93aW5kb3dzL25vdGVwYWQuZXhlIgogIGxpbmtfYXBwIHJlZ2VkaXQgICAgICAiJENST09UL3dpbmRvd3MvcmVnZWRpdC5leGUiCiAgbGlua19hcHAgd2NtZCAgICAgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jbWQuZXhlIgogIGxpbmtfYXBwIGNvbnRyb2wgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvY29udHJvbC5leGUiCiAgbGlua19hcHAgd2luaGVscCAgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9oZWxwLmV4ZSIKICBsaW5rX2FwcCBub3RlcGFkICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL25vdGVwYWQuZXhlIgogIGxpbmtfYXBwIHByb2dtYW4gICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvcHJvZ21hbi5leGUiCiAgbGlua19hcHAgcmVnc3ZyMzIgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9yZWdzdnIzMi5leGUiCiAgbGlua19hcHAgd2luZW1pbmUgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi93aW5taW5lLmV4ZSIKICBsaW5rX2FwcCB3aW52ZXIgICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL3dpbnZlci5leGUiCiAgbGlua19hcHAgdW5pbnN0YWxsZXIgICIkQ1JPT1Qvd2luZG93cy91bmluc3RhbGwuZXhlIgogIGxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvd2luaGVscC5leGUiCiAgbGlua19hcHAgd2luaGVscCAgICAgICIkQ1JPT1Qvd2luZG93cy93aW5obHAzMi5leGUiCn0KCiMgc3RhcnR1cC4uLgoKZWNobyAiV0lORSBJbnN0YWxsZXIgdjAuNzMiCmVjaG8KCmlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQp0aGVuIHsKCiAgaWYgISBbIC1mIGNvbmZpZ3VyZSBdCiAgdGhlbiB7CiAgICBpZiBbIC1mIC4uL2NvbmZpZ3VyZSBdCiAgICB0aGVuIHsKICAgICAgcHVzaGQgLi4KICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICJZb3UncmUgcnVubmluZyB0aGlzIGZyb20gdGhlIHdyb25nIGRpcmVjdG9yeS4iCiAgICAgIGVjaG8gIkNoYW5nZSB0byB0aGUgV2luZSBzb3VyY2UncyBtYWluIGRpcmVjdG9yeSBhbmQgdHJ5IGFnYWluLiIKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogIH0KICBmaQoKICBpZiBbIGB3aG9hbWlgID09ICdyb290JyBdCiAgdGhlbiB7CiAgICBlY2hvICJZb3UgYXJlIHJ1bm5pbmcgd2luZWluc3RhbGwgYXMgcm9vdCwgdGhpcyBpcyBub3QgYWR2aXNhYmxlLiBQbGVhc2UgcmVydW4gYXMgYSB1c2VyLiIKICAgIGVjaG8gIkFib3J0aW5nLiIKICAgIGV4aXQgMQogIH0KICBmaQoKICAjIGNoZWNrIHdoZXRoZXIgUlBNIGluc3RhbGxlZCwgYW5kIGlmIGl0IGlzLCByZW1vdmUgYW55IG9sZCB3aW5lIHJwbS4KICBoYXNoIHJwbSAmPi9kZXYvbnVsbAogIFJFVD0kPwogIGlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgICBpZiBbIC1uICJgcnBtIC1xaSB3aW5lIDI+L2Rldi9udWxsfGdyZXAgIl5OYW1lImAiIF07IHRoZW4KICAgICAgZWNobyAiV2FybmluZzogT2xkIFdpbmUgUlBNIGluc3RhbGwgZGV0ZWN0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmaXJzdD8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXTsgdGhlbgogICAgICAgIGVjaG8gIldlIG5lZWQgdG8gcmVtb3ZlIHRoZSBycG0gYXMgcm9vdCwgcGxlYXNlIGVudGVyIHlvdXIgcm9vdCBwYXNzd29yZCIKICAgICAgICBlY2hvCiAgICAgICAgZWNobyBTdGFydGluZyB3aW5lIHJwbSByZW1vdmFsLi4uCiAgICAgICAgc3UgLWMgInJwbSAtZSB3aW5lOyBSRVQ9JD8iCiAgICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICAgIGVjaG8gRG9uZS4KICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICJGQUlMRUQuIFByb2JhYmx5IHlvdSBhcmVuJ3QgaW5zdGFsbGluZyBhcyByb290LiIKICAgICAgICAgIGVjaG8gIkV4cGVjdCBwcm9ibGVtcyAobGlicmFyeSBjb25mbGljdHMgd2l0aCBleGlzdGluZyBpbnN0YWxsIGV0Yy4pLiIKICAgICAgICBmaQogICAgICBlbHNlCiAgICAgICAgZWNobyAiU29ycnksIEkgd29uJ3QgaW5zdGFsbCBXaW5lIHdoZW4gYW4gcnBtIHZlcnNpb24gaXMgc3RpbGwgaW5zdGFsbGVkLiIKICAgICAgICBlY2hvICIoV2luZSBzdXBwb3J0IHN1ZmZlcmVkIGZyb20gd2F5IHRvbyBtYW55IGNvbmZsaWN0cyBiZXR3ZWVuIFJQTSIKICAgICAgICBlY2hvICJhbmQgc291cmNlIGluc3RhbGxzKSIKICAgICAgICBlY2hvICJIYXZlIGEgbmljZSBkYXkgISIKICAgICAgICBleGl0IDEKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgIyBjaGVjayB3aGV0aGVyIHdpbmUgYmluYXJ5IHN0aWxsIGF2YWlsYWJsZQogIGlmIFsgLW4gImB3aGljaCB3aW5lIDI+L2Rldi9udWxsfGdyZXAgJy93aW5lJ2AiIF07IHRoZW4KICAgIGVjaG8gIldhcm5pbmcgISEgd2luZSBiaW5hcnkgKHN0aWxsKSBmb3VuZCwgd2hpY2ggbWF5IGluZGljYXRlIgogICAgZWNobyAiYSAoY29uZmxpY3RpbmcpIHByZXZpb3VzIGluc3RhbGxhdGlvbi4iCiAgICBlY2hvICJZb3UgbWlnaHQgd2FudCB0byBhYm9ydCBhbmQgdW5pbnN0YWxsIFdpbmUgZmlyc3QuIgogICAgc3RkX3NsZWVwCiAgZmkKCiAgIyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGlmIG5lY2Vzc2FyeQoKICBpZiBbIC1mIGNvbmZpZy5jYWNoZSBdICYmIFsgLWYgTWFrZWZpbGUgXSAmJiBbIE1ha2VmaWxlIC1udCBjb25maWd1cmUgXQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiSSBzZWUgdGhhdCBXSU5FIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCwgc28gSSdsbCBza2lwIHRoYXQuIgogICAgc3RkX3NsZWVwCiAgICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAgIC4gLi9jb25maWcuY2FjaGUKICB9CiAgZWxzZSB7CiAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIKICAgIGVjaG8KICAgIGlmICEgLi9jb25maWd1cmUgLUMgJENPTkZBUkdTCiAgICB0aGVuIHsKICAgICAgZWNobwogICAgICBlY2hvICJDb25maWd1cmUgZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICAgIGV4aXQgMQogICAgfQogICAgZmkKICAgICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogICAgLiAuL2NvbmZpZy5jYWNoZQogICAgIyBtYWtlIHN1cmUgWCB3YXMgZm91bmQKICAgIGV2YWwgIiRhY19jdl9oYXZlX3giCiAgICBpZiBbICIkaGF2ZV94IiAhPSAieWVzIiBdCiAgICB0aGVuIHsKICAgICAgZWNobyAiSW5zdGFsbCB0aGUgWCBkZXZlbG9wbWVudCBoZWFkZXJzIGFuZCB0cnkgYWdhaW4uIgogICAgICBybSAtZiBjb25maWcuY2FjaGUKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogIH0KICBmaQoKICAjIG5vdyBkbyB0aGUgY29tcGlsYXRpb24gYW5kIGluc3RhbGwsIHdlIG5lZWQgdG8gYWx3YXlzIGRvIHRoaXMgYmVjYXVzZSB3ZQogICMgZG9uJ3Qgd2FudCB0aGUgJ21ha2UgaW5zdGFsbCcgY29tbWFuZCB3ZSBtaWdodCBydW4gdG8gcnVuICdtYWtlJyBhcyByb290CiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gewogICAgIyBhc2sgdGhlIHVzZXIgaWYgdGhleSB3YW50IHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHdpbmUKICAgIGVjaG8KICAgIGVjaG8gIldlIG5lZWQgdG8gaW5zdGFsbCB3aW5lIGFzIHJvb3QgdXNlciwgZG8geW91IHdhbnQgdXMgdG8gYnVpbGQgd2luZSwiCiAgICBlY2hvICInc3Ugcm9vdCcgYW5kIGluc3RhbGwgV2luZT8gIEVudGVyICdubycgdG8gY29udGludWUgd2l0aG91dCBpbnN0YWxsaW5nIgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIFJPT1RJTlNUQUxMPSIkQU5TV0VSIgoKICAgIGlmIFsgIiRST09USU5TVEFMTCIgPSAieWVzIiBdCiAgICB0aGVuIHsKICAgICAgIyBzdGFydCBvdXQgd2l0aCB0aGUgYmFzaWMgY29tbWFuZAogICAgICBzdWNvbW1hbmQ9Im1ha2UgaW5zdGFsbCIKCiAgICAgICMgaWYgdGhlIHVzZXIgZG9lc24ndCBoYXZlICRsaWJkaXIgaW4gdGhlaXIgbGQuc28uY29uZiBhZGQgdGhpcwogICAgICAjIHRvIG91ciBzdWNvbW1hbmQgc3RyaW5nCiAgICAgIGlmIFsgLWYgL2V0Yy9sZC5zby5jb25mIF0KICAgICAgdGhlbgogICAgICAgIGlmICEgZ3JlcCAtcXMgIiRsaWJkaXIiIC9ldGMvbGQuc28uY29uZgogICAgICAgIHRoZW4gewogICAgICAgICAgZWNobwogICAgICAgICAgZWNobyAiJGxpYmRpciBkb2Vzbid0IGV4aXN0IGluIHlvdXIgL2V0Yy9sZC5zby5jb25mLCBpdCB3aWxsIGJlIGFkZGVkIgogICAgICAgICAgZWNobyAid2hlbiB3ZSBwZXJmb3JtIHRoZSBpbnN0YWxsLi4uIgogICAgICAgICAgc3Vjb21tYW5kPSIkc3Vjb21tYW5kO2VjaG8gJGxpYmRpcj4+L2V0Yy9sZC5zby5jb25mIgogICAgICAgIH0KICAgICAgICBmaQogICAgICAgICMgcnVuIGxkY29uZmlnIGFsd2F5cyBqdXN0IGluIGNhc2Ugc29tZSB1cGRhdGVkIGZpbGVzIGRvbnQgZ2V0IGxpbmtlZAogICAgICAgIHN1Y29tbWFuZD0iJHN1Y29tbWFuZDskYWNfY3ZfcGF0aF9MRENPTkZJRyIKICAgICAgZmkKICAgIH0KICAgIGZpICMgWyAiJFJPT1RJTlNUQUxMIiA9ICJ5ZXMiIF0KCiAgICBlY2hvCgogICAgZWNobyAiQ29tcGlsaW5nIFdJTkUuIEdyYWIgYSBsdW5jaCBvciB0d28sIHJlbnQgYSB2aWRlbywgb3Igd2hhdGV2ZXIsIgogICAgZWNobyAiaW4gdGhlIG1lYW50aW1lLi4uIgogICAgZWNobwogICAgc3RkX3NsZWVwCgogICAgIyB0cnkgdG8ganVzdCBtYWtlIHdpbmUsIGlmIHRoaXMgZmFpbHMgJ21ha2UgZGVwZW5kJyBhbmQgdHJ5IHRvIHJlbWFrZQogICAgaWYgISB7IG1ha2U7IH0KICAgIHRoZW4gewogICAgICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogICAgICB0aGVuIHsKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQogICAgfQogICAgZmkKCiAgICBpZiBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQogICAgdGhlbiB7CiAgICAgIGVjaG8KCiAgICAgIGVjaG8gIlBlcmZvcm1pbmcgJ21ha2UgaW5zdGFsbCcgYXMgcm9vdCB0byBpbnN0YWxsIGJpbmFyaWVzLCBlbnRlciByb290IHBhc3N3b3JkIgoKICAgICAgc3RkX3NsZWVwCgogICAgICBpZiAhIHN1IHJvb3QgLWMgIiRzdWNvbW1hbmQiCiAgICAgIHRoZW4gewogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJFaXRoZXIgeW91IGVudGVyZWQgYW4gaW5jb3JyZWN0IHBhc3N3b3JkIG9yIHdlIGZhaWxlZCB0byBydW4iCiAgICAgICAgZWNobyAiJyRzdWNvbW1hbmQnIGNvcnJlY3RseS4iCiAgICAgICAgZWNobyAiSWYgeW91IGRpZG4ndCBlbnRlciBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgdGhlbiBwbGVhc2UgcmVwb3J0IHRoaXMiCiAgICAgICAgZWNobyAiZXJyb3IgYW5kIGFueSBzdGVwcyB0byBwb3NzaWJseSByZXByb2R1Y2UgaXQgdG8iCiAgICAgICAgZWNobyAiaHR0cDovL2J1Z3Mud2luZWhxLmNvbS8iCiAgICAgICAgZWNobwogICAgICAgIGVjaG8gIkluc3RhbGxhdGlvbiBmYWlsZWQsIGFib3J0aW5nLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQoKICAgICAgZWNobwoKICAgICAgIyBzZWUgaWYgd2luZSBpcyBpbnN0YWxsZWQgb24gdGhlIHVzZXJzIHN5c3RlbSwgaWYgbm90IHByb21wdCB0aGVtCiAgICAgICMgYW5kIHRoZW4gZXhpdAogICAgICBpZiBbICEgYHdoaWNoIHdpbmVgIF0KICAgICAgdGhlbgogICAgICAgIGVjaG8gIkNvdWxkIG5vdCBmaW5kIHdpbmUgb24geW91ciBzeXN0ZW0uICBSdW4gd2luZWluc3RhbGwgYXMgcm9vdCB0byBpbnN0YWxsIHdpbmUiCiAgICAgICAgZWNobyAiYmVmb3JlIHJlLXJ1bm5pbmcgd2luZWluc3RhbGwgYXMgYSB1c2VyLiIKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiRXhpdGluZyB3aW5laW5zdGFsbCIKICAgICAgICBleGl0IDE7CiAgICAgIGZpCiAgICB9CiAgICBlbHNlIHsKICAgICAgIyB1c2VyIGRpZG4ndCB3YW50IHRvIGluc3RhbGwgd2luZSBzbyB0ZWxsIHRoZW0gYWJvdXQgcnVubmluZyBmcm9tIHRoZQogICAgICAjIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBzZXQgc29tZSBzdHVmZiB1cCBmb3IgdGhlbQoKICAgICAgIyBzZXR1cCB0byBydW4gZnJvbSBjdXJyZW50IGRpcmVjdG9yeQogICAgICBETExQQVRIPSIkUFdEL2RsbHMiCiAgICAgIGlmIFsgLXogIiRMRF9MSUJSQVJZX1BBVEgiIF0KICAgICAgdGhlbiBMRF9MSUJSQVJZX1BBVEg9IiRQV0Q6JERMTFBBVEgiCiAgICAgIGVsc2UgTERfTElCUkFSWV9QQVRIPSIkTERfTElCUkFSWV9QQVRIOiRQV0Q6JERMTFBBVEgiCiAgICAgIGZpCiAgICAgIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKICAgICAgREVCVUdHRVI9IiRQV0QvJEhERUJVR0dFUiIKICAgICAgZWNobwogICAgICBlY2hvICJOT1RFISBUbyBydW4gV2luZSB3aXRob3V0IGluc3RhbGxpbmcsIHlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiCiAgICAgIGVjaG8gIkxEX0xJQlJBUllfUEFUSCB0byAkUFdEOiRETExQQVRIIgogICAgICBlY2hvICJpbiB5b3VyIGxvZ29uIHNjcmlwdHMuIgogICAgICBlY2hvCiAgICB9CiAgICBmaSAjIFsgIiRST09USU5TVEFMTCIgPSAieWVzIiBdCiAgfQogIGZpICMgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQoKfQpmaSAjIEJJTkRJU1QKCiMgbm93IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIHdpbmUuY29uZgppZiBbIC16ICIkRE9HTE9CQUxDT05GIiBdCnRoZW4KICBET0dMT0JBTENPTkY9YXV0bwpmaQoKaWYgWyAiJERPR0xPQkFMQ09ORiIgPSAnYXV0bycgXQp0aGVuIHsKICAjIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBzeXN0ZW0gd2luZS5jb25mCiAgaWYgWyAhIC1mICRHQ09ORiBdICYmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4KICAgIERPR0xPQkFMQ09ORj1ubwogICAgZWNobyAiQ3JlYXRpb24gb2YgYSBnbG9iYWwgY29uZmlnIGZpbGUgaXMgbm90IHN1cHBvcnRlZCBpbiB3aW5laW5zdGFsbCBhdCB0aGlzIgogICAgZWNobyAidGltZS4gIFdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gYXJjaGl0ZWN0dXJlIGlzIGNsZWFuZWQgdXAgdGhpcyBmdW5jdGlvbmFsaXR5IgogICAgZWNobyAid2lsbCBiZSByZXN0b3JlZCB0byB3aW5laW5zdGFsbC4iCiAgICBlY2hvCiAgZmkKfQpmaQoKaWYgWyAiJERPTE9DQUxDT05GIiA9ICdhdXRvJyBdCnRoZW4gewogICMgc2VlIGlmIHRoZSB1c2VyIGlzIHJvb3QsIGlmIHNvLCBleHBsaWNpdGx5IGFzayB0aGVtIGlmIHRoZXkgd2FudCBhCiAgIyBsb2NhbCBjb25maWcgZmlsZQogIGlmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4KICAgIGVjaG8gIllvdSBhcmUgcnVubmluZyBhcyByb290LiAgRG8geW91IHdhbnQgYSBsb2NhbCBjb25maWcgZmlsZSwiCiAgICBlY2hvICJmaWxlLCB+Ly53aW5lL2NvbmZpZywgY3JlYXRlZD8iCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgZWxzZQogICAgIyBpZiB0aGUgdXNlciBoYXMgYW4gZXhpc3RpbmcgY29uZmlnIGZpbGUgYXNrIHRoZW0gaWYgdGhleSB3YW50IHVzIHRvCiAgICAjIG92ZXJ3cml0ZSBpdCwgb3RoZXJ3aXNlIGp1c3QgYXNrIHRoZW0gaWYgdGhleSB3YW50IHRvIGNyZWF0ZSBvbmUKICAgIGlmIFsgLWYgIiRMQ09ORiIgXQogICAgdGhlbgogICAgICBlY2hvICJGb3VuZCBleGlzdGluZyAkTENPTkYsIGRvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGlzIgogICAgICBlY2hvICJleGlzdGluZyBXaW5lIGNvbmZpZ3VyYXRpb24gZmlsZT8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogICAgICBlY2hvCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gInllcyIgXQogICAgICB0aGVuCiAgICAgIHsKICAgICAgICBlY2hvICJXb3VsZCB5b3UgbGlrZSB0byBtYWtlIGEgYmFja3VwIG9mIHRoaXMgb2xkIGNvbmZpZyBmaWxlPyIKICAgICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICAgIGVjaG8KICAgICAgICBpZiBbICIkQU5TV0VSIiA9ICJ5ZXMiIF0KICAgICAgICB0aGVuCiAgICAgICAgewogICAgICAgICAgZWNobyAiUmVuYW1pbmcgJExDT05GIHRvICRMQ09ORi5vbGQiCiAgICAgICAgICBtdiAtZiAiJExDT05GIiAiJExDT05GLm9sZCIKICAgICAgICAgIGVjaG8KICAgICAgICB9CiAgICAgICAgZmkKICAgICAgfQogICAgICBmaQogICAgZWxzZQogICAgewogICAgICBlY2hvICJDcmVhdGUgbG9jYWwgY29uZmlnIGZpbGUgfi8ud2luZS9jb25maWc/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICAgICAgZWNobwogICAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgICB0aGVuCiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIG5lZWRfcm9vdCBcCiAgICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gVHJ5IGFnYWluIGFzIHJvb3QgdG8gZ2VuZXJhdGUgYSBzeXN0ZW0gd2luZS5jb25mLiIKICAgICAgICBleGl0IDEKICAgICAgZmkKICAgIH0KICAgIGZpCiAgZmkKfQpmaQoKIyBnZW5lcmF0ZSAkVE1QQ09ORiBmcm9tIGV4aXN0aW5nIHdpbmRvd3MgaW5zdGFsbCwgaWYgYW55CmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRET1dDSEsiID0gJ3llcycgXSB8fCBbICIkRE9XQ0hLIiA9ICdhdXRvJyBdCiAgdGhlbiB7CiAgICBlY2hvIC1uICJTZWFyY2hpbmcgZm9yIGFuIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLi4uIgogICAgaWYgISAkV0lORUNPTkYgLWluaWZpbGUgIiRXSU5FSU5JIiA+ICRUTVBDT05GIDI+L2Rldi9udWxsCiAgICB0aGVuIHsKICAgICAgcm0gLWYgJFRNUENPTkYgJFRNUFJFRyA+IC9kZXYvbnVsbAoKICAgICAgZWNobyAiIG5vdCBmb3VuZC4gKG5vIG1hdGNoaW5nIC9ldGMvZnN0YWIgbW91bnQgZW50cnkgZm91bmQpIgogICAgICBjb25mX3F1ZXN0aW9uIGxvdyBkb193aXRob3V0X3dpbmRvd3MgXAogICAgICAgIldpbmRvd3Mgd2FzIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc28gSSBhc3N1bWUgeW91IHdhbnQiIFwKICAgICAgICJhIFdpbmUtb25seSBpbnN0YWxsYXRpb24uIEFtIEkgY29ycmVjdD8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICAgIHRoZW4gewogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCB3aW5kb3dzX25vdF9mb3VuZCBcCiAgICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBNYWtlIHN1cmUgeW91ciBXaW5kb3dzIHBhcnRpdGlvbiBpcyBtb3VudGVkIGFuZCB0cnkgYWdhaW4sIiBcCiAgICAgICAgICJvciBjcmVhdGUgJExDT05GIG1hbnVhbGx5IGJ5IGNvcHlpbmcgZnJvbSAkV0lORUlOSSBhbmQgYWRhcHRpbmcgdGhlIGRyaXZlIHBhdGhzLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQogICAgICBET1dJTkU9eWVzCiAgICB9CiAgICBlbHNlIHsKICAgICAgZWNobyAiIGZvdW5kLiIKCiAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gd2luZG93c19mb3VuZAogICAgICBjb25mX3F1ZXN0aW9uIGxvdyB3aW5kb3dzX2ZvdW5kIFwKICAgICAgICJDcmVhdGVkICRMQ09ORiB1c2luZyB5b3VyIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLiIgXAogICAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICAgICAgRE9XSU5FPW5vCiAgICB9CiAgICBmaQogIH0KICBlbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KICB0aGVuIERPV0lORT15ZXMKICBmaQp9CmVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQp0aGVuCiAgRE9XSU5FPW5vCmZpCgojIHNldHVwIGEgbm8td2luZG93cyBpbnN0YWxsYXRpb24sIGlmIG5lY2Vzc2FyeQppZiBbICIkRE9XSU5FIiA9ICd5ZXMnIF0KdGhlbiB7CiAgIyBzZXQgYW4gYXBwcm9wcmlhdGUgRENST09UCiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gRENST09UPX4vYwogIGVsc2UgRENST09UPS9jCiAgZmkKCiAgaWYgWyAtZiB+Ly53aW5lcmMgXQogIHRoZW4gewogICAgY29uZl9xdWVzdGlvbiBtZWRpdW0gY29udmVydF9jb25maWcgXAogICAgICJJIGZvdW5kIHRoZSBvbGQgdmVyc2lvbiBXaW5lIGNvbmZpZyBmaWxlLCAud2luZXJjLCBpbiB5b3VyICIgXAogICAgICJob21lIGRpcmVjdG9yeS4gIEkgY2FuIGNvbnZlcnQgdGhpcyB0byB0aGUgbmV3IGZvcm1hdCBvciB1c2UgdGhlIiBcCiAgICAgIm5ldyBkZWZhdWx0IFdpbmUgY29uZmlnIGZpbGUuIENvbnZlcnQ/IgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXQogICAgdGhlbiB7CiAgICAgIFdJTkVJTkk9fi8ud2luZXJjCiAgICAgIENPTlZDT05GPXllcwogICAgfQogICAgZmkKICB9CiAgZWxzZSB7CgogICAgY29uZl9xdWVzdGlvbiBsb3cgZHJpdmVjX3BhdGggXAogICAgICJDb25maWd1cmluZyBXaW5lIHdpdGhvdXQgV2luZG93cy4iIFwKICAgICAiU29tZSBmYWtlIFdpbmRvd3MgZGlyZWN0b3JpZXMgbXVzdCBiZSBjcmVhdGVkLCB0byBob2xkIGFueSAuaW5pIGZpbGVzLCBETExzLCIgXAogICAgICJzdGFydCBtZW51IGVudHJpZXMsIGFuZCBvdGhlciB0aGluZ3MgeW91ciBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zdGFsbC4iIFwKICAgICAiV2hlcmUgd291bGQgeW91IGxpa2UgeW91ciBmYWtlIEMgZHJpdmUgdG8gYmUgcGxhY2VkPyIKICAgIHdoaWxlIFsgLXogIiRDUk9PVCIgXQogICAgZG8gewogICAgICBjb25mX3N0cmluZ19hbnN3ZXIgIihkZWZhdWx0IGlzICREQ1JPT1QpICIKICAgICAgWyAteiAiJEFOU1dFUiIgXSAmJiBBTlNXRVI9IiREQ1JPT1QiCiAgICAgIGlmICEgWyAtZCAiJEFOU1dFUiIgXQogICAgICB0aGVuIHsKICAgICAgICBpZiBta2RpciAtcCAiJEFOU1dFUiIKICAgICAgICB0aGVuIENST09UPSIkQU5TV0VSIgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkRpcmVjdG9yeSAkQU5TV0VSIGNhbid0IGJlIGNyZWF0ZWQgISIKICAgICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gZHJpdmVjX3BhdGgKICAgICAgICBmaQogICAgICB9CiAgICAgIGVsc2UgQ1JPT1Q9IiRBTlNXRVIiCiAgICAgIGZpCiAgICB9CiAgICBkb25lCiAgICBlY2hvICJDb25maWd1cmluZyBXaW5lIGZvciBhIG5vLXdpbmRvd3MgaW5zdGFsbCBpbiAkQ1JPT1QuLi4iCgogICAgY3JlYXRlX3dpbmRvd3NfZGlyZWN0b3JpZXMKICAgIGNvbmZpZ3VyZV93aW5lX2FwcGxpY2F0aW9ucwogIH0KICBmaQoKICAjIGNyZWF0ZSAkTENPTkYgdXNpbmcgdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUgJFdJTkVJTkkKICBpZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXSAmJiBbICIkQ09OVkNPTkYiID0gJ25vJyBdCiAgdGhlbiB7CiAgICBzZWQgInN8XCJQYXRoXCIgPSBcIi9jXCJcJHxcIlBhdGhcIiA9IFwiJHtDUk9PVH1cInwiICRXSU5FSU5JID4gJFRNUENPTkYKICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gZGVmYXVsdF9jb25maWcKICAgIGNvbmZfcXVlc3Rpb24gbG93IGRlZmF1bHRfY29uZmlnIFwKICAgICAiQ3JlYXRlZCAkTENPTkYgdXNpbmcgZGVmYXVsdCBXaW5lIGNvbmZpZ3VyYXRpb24uIiBcCiAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICB9CiAgZmkKCiAgIyBub3cgd2UgcmVhbGx5IHNob3VsZCBpbnN0YWxsIHRoZSByZWdpc3RyeQogIGlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQogIHRoZW4gRE9SRUc9eWVzCiAgZmkKfQpmaQplY2hvCgojaW5zdGFsbCB0aGUgbG9jYWwgY29uZmlnIGZpbGUgJExDT05GCmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdCnRoZW4KICBpZiBbICEgLXcgfi8ud2luZSBdCiAgdGhlbgogICAgbWtkaXIgfi8ud2luZQogIGZpCgogIGlmIFsgIiRDT05WQ09ORiIgPSAnbm8nIF0KICB0aGVuCiAgICBjcCAkVE1QQ09ORiAkTENPTkYgPiAvZGV2L251bGwKICBmaQplbHNlCiAgRE9SRUc9bm8KZmkKCiNpbnN0YWxsIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUgJEdDT05GCmlmIFsgIiRET0dMT0JBTENPTkYiID0gJ3llcycgXQp0aGVuCiAgaWYgWyAhIC1mICRzeXNjb25mZGlyIF0KICB0aGVuCiAgICBta2RpciAtcCAkc3lzY29uZmRpcgogIGZpCgogIGNwICRUTVBDT05GICRHQ09ORiA+IC9kZXYvbnVsbApmaQoKIyBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5CiMgKG5vdCB0byBiZSBkb25lIGlmIHdpbmRvd3MgcmVnaXN0cnkgZXhpc3RzKQppZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KdGhlbiB7CiAgQ1JPT1Q9YHNlZCAtbiAnL15cW0RyaXZlIENcXSQvLC9eXFsuKlxdJC8gcy9eXCJQYXRoXCIgPSBcIlwoLipcKVwiL1wxL3AnICRMQ09ORmAKICBlY2hvICJDaGVja2luZyBmb3IgcmVhbCBXaW5kb3dzIHJlZ2lzdHJ5Li4uIgogIGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5kYXQiIF0KICB0aGVuIERPUkVHPW5vCiAgZWxpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jb25maWcvc3lzdGVtIiBdCiAgdGhlbiBET1JFRz1ubwogIGVsaWYgWyAtZiAiJENST09UL1dJTk5UL3N5c3RlbTMyL2NvbmZpZy9zeXN0ZW0iIF0KICB0aGVuIERPUkVHPW5vCiAgZWxzZSBET1JFRz15ZXMKICBmaQogIGlmIFsgIiRET1JFRyIgPSAneWVzJyBdCiAgdGhlbiBlY2hvICJOb3QgZm91bmQsIGRlZmF1bHQgV2luZSByZWdpc3RyeSB3aWxsIGJlIGluc3RhbGxlZC4iCiAgZWxzZSBlY2hvICJXaW5kb3dzIHJlZ2lzdHJ5IGZvdW5kLCB3aWxsIG5vdCBpbnN0YWxsIGRlZmF1bHQgV2luZSByZWdpc3RyeS4iCiAgZmkKICBlY2hvCn0KZmkKCiMgaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5IGVudHJpZXMKaWYgWyAiJERPUkVHIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJEJJTkRJU1QiID0gJ25vJyBdCiAgdGhlbiB7CiAgICBlY2hvICJDb21waWxpbmcgcmVnZWRpdC4uLiIKICAgIChjZCBwcm9ncmFtcy9yZWdlZGl0OyBtYWtlKQogICAgZWNobwogIH0KICBmaQogIGVjaG8gIlByZXBhcmluZyB0byBpbnN0YWxsIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgoKICAjIGVkaXQgY29uZmlnIGZpbGVzIHNvIHdlIGRvbid0IGhhdmUgdG8gcnVuIHJlZ2VkaXQgdW5kZXIgWAogIGlmIFsgIiRDT05WQ09ORiIgPSAneWVzJyBdCiAgdGhlbgogICAgbXYgJFdJTkVJTkkgJFdJTkVJTkkubmV3CiAgICBzZWQgInMvR3JhcGhpY3NEcml2ZXI9LiovR3JhcGhpY3NEcml2ZXI9dHR5ZHJ2LyIgJFdJTkVJTkkubmV3ID4gJFdJTkVJTkkKICBlbHNlCiAgICBtdiAkTENPTkYgJExDT05GLm5ldwogICAgc2VkICJzL1wiR3JhcGhpY3NEcml2ZXJcIiA9IC4qL1wiR3JhcGhpY3NEcml2ZXJcIiA9IFwidHR5ZHJ2XCIvIiAkTENPTkYubmV3ID4gJExDT05GCiAgZmkKCiAgIyBjcmVhdGUgYSB0ZW1wb3Jhcnkgd2luZWluc3RhbGwucmVnIHdpdGggZml4ZWQgZGVidWdnZXIgcGF0aAogICRERUZDQVQgJERFRlJFRyB8IHNlZCAic3xkZWJ1Z2dlci93aW5lZGJnfCR7REVCVUdHRVJ9fCIgPiAkVE1QUkVHCgogIGVjaG8gIkluc3RhbGxpbmcgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCiAgZWNobwogIGlmICEgJFJFR0VESVQgJFRNUFJFRyA+IC9kZXYvbnVsbAogIHRoZW4gewogICAgcm0gLWYgJFRNUFJFRwogICAgZWNobyAiUmVnaXN0cnkgaW5zdGFsbCBmYWlsZWQuIgogICAgY29uZl9yZXNldF9xdWVzdGlvbiByZWdlZGl0X2Vycm9yCiAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggcmVnZWRpdF9lcnJvcgogICAgZXhpdCAxCiAgfQogIGVsc2UgewogICAgIyBpZiB3ZSBhcmUgY29udmVydGluZyBmcm9tIGEgLndpbmVyYyBmaWxlLCBydW5uaW5nIHJlZ2VkaXQgb25jZQogICAgIyB3aWxsIE9OTFkgY29udmVydCAud2luZXJjIC0+IH4vLndpbmUvY29uZmlnLCBpdCB3aWxsIG5vdCBpbXBvcnQgdGhlCiAgICAjIHJlZ2lzdHJ5IGRhdGEuICBzbyBpZiB3ZSBhcmUgY29udmVydGluZyB3ZSBuZWVkIHRvIHJ1biByZWdlZGl0IHR3aWNlCiAgICBpZiBbICIkQ09OVkNPTkYiID0gJ3llcycgXQogICAgdGhlbgogICAgICBpZiAhICRSRUdFRElUICRUTVBSRUcgPiAvZGV2L251bGwKICAgICAgdGhlbgogICAgICAgIHJtIC1mICRUTVBSRUcKICAgICAgICBlY2hvICJSZWdpc3RyeSBpbnN0YWxsIGZhaWxlZC4iCiAgICAgICAgY29uZl9yZXNldF9xdWVzdGlvbiByZWdlZGl0X2Vycm9yCiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIHJlZ2VkaXRfZXJyb3IKICAgICAgICBleGl0IDEKICAgICAgZWxzZQogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJSZWdpc3RyeSBlbnRyaWVzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQuIgogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvCiAgICAgIGVjaG8gIlJlZ2lzdHJ5IGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4iCiAgICBmaQogIH0KICBmaQogIHJtIC1mICRUTVBSRUcKICBpZiBbICIkU1lTUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBTWVNSRUc9eWVzCiAgZmkKCiAgIyBpZiB3ZSBjb252ZXJ0ZWQgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGdyYXBoaWNzIGRyaXZlciBiYWNrIGFuZAogICMgcmVzdG9yZSB0aGUgb3JpZ2luYWwgLndpbmVyYyBmaWxlCiAgaWYgWyAiJENPTlZDT05GIiA9ICd5ZXMnIF0KICB0aGVuCiAgICAgbXYgJFdJTkVJTkkubmV3ICRXSU5FSU5JCiAgZmkKCiAgc2VkICJzL1wiR3JhcGhpY3NEcml2ZXJcIiA9IC4qL1wiR3JhcGhpY3NEcml2ZXJcIiA9IFwieDExZHJ2XCIvIiAkTENPTkYgPiAkTENPTkYubmV3CiAgbXYgJExDT05GLm5ldyAkTENPTkYKfQpmaQoKIyBtYWtlIHJvb3QncyByZWdpc3RyeSBnbG9iYWwsIGlmIGRlc2lyZWQKaWYgWyBgd2hvYW1pYCA9ICdyb290JyBdICYmIFsgIiRET1JFRyIgPSAneWVzJyBdICYmIFsgIiRTWVNSRUciID0gJ3llcycgXQp0aGVuIHsKICBbIC1kIH4vLndpbmUgXSB8fCBta2RpciB+Ly53aW5lCiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyB1c2VyIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIFsgLWYgfi8ud2luZS93aW5lLnVzZXJyZWcgXSAmJiBjcCB+Ly53aW5lL3dpbmUudXNlcnJlZyAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgfi8ud2luZS93aW5lLnVzZXJyZWcKICB9CiAgZmkKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3Mgc3lzdGVtIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIFsgLWYgfi8ud2luZS9zeXN0ZW0ucmVnIF0gJiYgY3Agfi8ud2luZS9zeXN0ZW0ucmVnICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgfi8ud2luZS9zeXN0ZW0ucmVnCiAgfQogIGZpCn0KZmkKCiMgY2xlYW51cCBhbnkgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgbWF5IHJlbWFpbgppZiBbIC1mICRUTVBDT05GIF0KdGhlbiBybSAtZiAkVE1QQ09ORgpmaQppZiBbIC1mICRUTVBSRUcgXQp0aGVuIHJtIC1mICRUTVBSRUcKZmkKCgojIGl0J3MgYSB3cmFwCmVjaG8KZWNobyAiSW5zdGFsbGF0aW9uIGNvbXBsZXRlIGZvciBub3cuIEdvb2QgbHVjayAodGhpcyBpcyBzdGlsbCBhbHBoYSBzb2Z0d2FyZSkuIgplY2hvICJJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIFdJTkUsIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZpcnN0LCIKZWNobyAiYXMgbWFueSBraW5kcyBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIGV4cGxhaW5lZCB0aGVyZS4iCgpleGl0IDAK