IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMKIyBIaXN0b3J5OgojIE1hciAzMSAxOTk5IC0gT3ZlIEvldmVuCiMgIEZpcnN0IHZlcnNpb24KIyBEZWMgOSAxOTk5IC0gT3ZlIEvldmVuCiMgIHJlcXVpcmUgWHBtCiMgRmViIDI1IDIwMDAgLSBPdmUgS+V2ZW4KIyAgYXV0by1hZGQgL3Vzci9sb2NhbC9saWIgdG8gL2V0Yy9sZC5zby5jb25mCiMgTWFyIDIgMjAwMCAtIE92ZSBL5XZlbgojICBzb3VyY2UgcmF0aGVyIHRoYW4gZ3JlcCBjb25maWcuY2FjaGUKIyAgdXNlIHNvdXJjZWQgY29uZmlnLmNhY2hlIHRvIHN0YXJ0IGxkY29uZmlnCiMgIHJlY29uZmlndXJlIGlmIGNvbmZpZy5jYWNoZSBkb2Vzbid0IGV4aXN0CiMgTWFyIDMwIDIwMDAgLSBPdmUgS+V2ZW4KIyAgYXV0b2NvbmZpZ3VyZSBuby13aW5kb3dzIGluc3RhbGxzCiMgIGRvIG5vdCBpbnN0YWxsIHJlZ2lzdHJ5IG9uIHJlYWwtd2luZG93cyBpbnN0YWxscwojICBzb21lIHN1cHBvcnQgZm9yIGJpbmFyeSBwYWNrYWdlIGluc3RhbGxzCiMgIHNldCBhbmQgdGVsbCB1c2VyIGFib3V0IExEX0xJQlJBUllfUEFUSCBpZiBuZWNlc3NhcnkKIyAgc2V0IEVYVFJBX0xEX0xJQlJBUllfUEFUSCBpbiB3aW5lLmNvbmYKIyBBcHIgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCAoc3lzdGVtLWRlZmF1bHQpCiMgTWF5IDkgMjAwMCAtIE92ZSBL5XZlbgojICB1c2UgdHR5ZHJ2IHdoZW4gcnVubmluZyByZWdhcGksIHNvIHdlIGRvbid0IGhhdmUgdG8gcnVuIGZyb20gWAojICBjaGFuZ2UgZGVidWdnZXIgcGF0aCBpbiByZWdpc3RyeQojIE9jdCAyOSAyMDAwIC0gT3ZlIEvldmVuCiMgIGFkZGVkIC0tZW5hYmxlLW9wZW5nbCB0byBkZWZhdWx0IGNvbmZhcmdzCiMgIGFkZGVkIGNvbmZfcXVlc3Rpb24sIGNvbmZfeWVzbm9fYW5zd2VyLCBhbmQgY29uZl9zdHJpbmdfYW5zd2VyIGZ1bmN0aW9ucwojICBhZGRlZCBERUZDQVQgdmFyaWFibGUKIyAobGF0ZXIgdGhhdCBkYXkuLi4pCiMgIGFkZGVkIGNvbmZfcmVzZXRfcXVlc3Rpb24gZnVuY3Rpb24KIyAgYWRkZWQgZmlsZSBleGlzdGVuY2UgY2hlY2tzIHRvIHRoZSByZWdpc3RyeSBjb3B5aW5nCiMgIGZpeGVkIHByb2JsZW0gd2l0aCBuby13aW5kb3dzIGRpcmVjdG9yeSBjcmVhdGlvbgojICBzb21lIHRleHQgcmVmb3JtYXR0aW5nIGZyb20gRXJpYyBNYXJ5bmlhawojIEphbiA1IDIwMDAgLSBDaHJpcyBNb3JnYW4KIyAgdXNlIGRlZmF1bHQgY29uZmlnIGZpbGUgaW4gL2RvY3VtZW50YXRpb24vc2FtcGxlcy9jb25maWcKIyAgcmVwbGFjZSAud2luZXJjIHdpdGggfi8ud2luZS9jb25maWcgaW4gcHJpbnRlZCB0ZXh0CiMgIGFkZGVkIHVzZXIgcXVlc3Rpb24gdG8gY29udmVydCAud2luZXJjIGZpbGUoaWYgZXhpc3RzKSBvciB1c2UgdGhlIGRlZmF1bHQKIyAgICBjb25maWcgZmlsZQojICBhZGQgY29uZl9xdWVzdGlvbiB0byBhbGxvdyByb290IHRvIGluc3RhbGwgYSBsb2NhbCBjb25maWcgZmlsZSBhbmQKIyAgICByZWdpc3RyeQojIEphbiAxMiAyMDAwIC0gQ2hyaXMgTW9yZ2FuCiMgIGRpc3Rpbmd1aXNoIGJldHdlZW4gY3JlYXRpbmcgbG9jYWwgYW5kIGdsb2JhbCBjb25maWcgZmlsZXMKIyAgZGlzcGxheSBhIG1lc3NhZ2UgYWJvdXQgdGhlIHN0YXR1cyBvZiBnbG9iYWwgY29uZmlnIGZpbGVzCiMgIG1pc2MgY2xlYW51cHMgYW5kIHJlb3JkZXJpbmcgb2YgcXVlc3Rpb25zCiMgIGFkZGVkIGNoZWNrIHRvIHNlZSBpZiB3aW5lIGlzIGluc3RhbGxlZCB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGEgbm9ybWFsCiMgICAgdXNlciBhbmQgcHJpbnQgYSBtZXNzYWdlIGlmIHdpbmUgY2Fubm90IGJlIGZvdW5kCiMgRmViIDE2IDIwMDIgLSBBZGFtIEQuIE1vc3MKIyAgVXNlIGNvbmZpZy5zdGF0dXMgaW5zdGVhZCBvZiBjb25maWcuY2FjaGUgdG8gY2hlY2sgd2hldGhlciB3ZSdyZQojICAgIGNvbmZpZ3VyZWQvY29tcGlsZWQgYW5kIHRvIHJlY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uCiMgRmViIDIwIDIwMDIgLSBBZGFtIEQuIE1vc3MKIyAgUGFydGlhbGx5IHJldmVydCBwcmV2aW91cyBjaGFuZ2VzLCBmb3JjZSBjb25maWd1cmUgdG8gd3JpdGUgYW4KIyAgICBvbGQtc3R5bGUgY29uZmlnLmNhY2hlCiMgTWFyIDI3IDIwMDIgLSBDaHJpcyBNb3JnYW4KIyAgcHJldmVudCB0aGUgdXNlciBmcm9tIHJ1bm5pbmcgd2luZWluc3RhbGwgYXMgcm9vdAojICBhZGQgc2NyaXB0IGNvbW1hbmRzIHNvIHdlIHN1IHJvb3QgZm9yICdtYWtlIGluc3RhbGwnIGFuZCBvdGhlciBjb21tYW5kcwojICAgIHRoYXQgcmVxdWlyZSByb290IGFjY2VzcwojICBhZGQgdGV4dCB0byB0ZWxsIHRoZSB1c2VyIHdlIG5lZWQgdG8gcnVuIHN0dWZmIGFzIHJvb3Qgc28gdGhleSBkb24ndCAKIyAgICB0aGluayB3ZSBhcmUgdHJ5aW5nIHRvIHB1bGwgc29tZXRoaW5nIGZ1bm55CgojLS0tIGRlZmF1bHRzIChjaGFuZ2UgdGhlc2UgaWYgeW91IGFyZSBhIHBhY2thZ2VyKQpDT05GQVJHUz0iLS1lbmFibGUtb3BlbmdsIiAgICAjIGNvbmZpZ3VyZSBhcmdzLCBlLmcuIC0tcHJlZml4PS91c3IgLS1zeXNjb25mZGlyPS9ldGMKcHJlZml4PS91c3IvbG9jYWwgICAgICAgICAgICAgIyBpbnN0YWxsYXRpb24gcHJlZml4CnN5c2NvbmZkaXI9JHByZWZpeC9ldGMgICAgICAgICMgd2hlcmUgd2luZS5jb25mIGFuZCBnbG9iYWwgcmVnaXN0cnkgaXMgc3VwcG9zZWQgdG8gYmUKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApsaWJkaXI9JHByZWZpeC9saWIgICAgICAgICAgICAjIHdoZXJlIGxpYndpbmUuc28gd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApleGRpcj1kb2N1bWVudGF0aW9uL3NhbXBsZXMgICAjIHdoZXJlIHRoZSBleGFtcGxlIHN5c3RlbS5pbmkgcmVzaWRlcwpHQ09ORj0kc3lzY29uZmRpci93aW5lLmNvbmYgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgd2luZS5jb25mIGdsb2JhbCBjb25maWcgZmlsZQpMQ09ORj1+Ly53aW5lL2NvbmZpZyAgICAgICAgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgbG9jYWwgY29uZmlnIGZpbGUKQklORElTVD1ubyAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIGNhbGxlZCBmcm9tIGEgYmluYXJ5IHBhY2thZ2UgY29uZmlnIHNjcmlwdApET0dMT0JBTENPTkY9YXV0byAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2dlbmVyYXRlIHdpbmUuY29uZgpET0xPQ0FMQ09ORj1hdXRvICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2dlbmVyYXRlIGxvY2FsY29uZgpET1dDSEs9YXV0byAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2NvbmZpZ3VyZSBleGlzdGluZy13aW5kb3dzIGluc3RhbGxhdGlvbgpET1dJTkU9YXV0byAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2NvbmZpZ3VyZSBuby13aW5kb3dzIGluc3RhbGxhdGlvbgpET1JFRz1hdXRvICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5ClNZU1JFRz15ZXMgICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBtYWtlIHJvb3QncyByZWdpc3RyeSBnbG9iYWwgKHN5c3RlbS1kZWZhdWx0KQpDT05WQ09ORj1ubwkJICAgICAgIyB3aGV0aGVyIHdlIGFyZSBjb252ZXJ0aW5nIGFuIGV4aXN0aW5nIC53aW5lcmMgb3Igbm90CgojICJtYWtlIGluc3RhbGwiIHN0aWxsIGluc3RhbGxzIHRoZSBkbGxzIGludG8gJGxpYmRpciwgYnV0IHRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlCiMgKERMTFBBVEggc2hvdWxkIHBvaW50IHRvIHRoZW0gaWYvd2hlbiB0aGV5IGFyZSBub3QgaW4gc3RhbmRhcmQgbGQuc28gcGF0aHMpCkRMTFBBVEg9JGxpYmRpci93aW5lICAgICAgICAgICMgZGVmYXVsdCBwYXRoIG9mIHRoZSBkbGwgLnNvIGZpbGVzIChleGNlcHQgbGlid2luZS5zbykKCiMgaGF2aW5nIHRoZSBXaW5lIGRlYnVnZ2VyIGxhdW5jaGVkIGF1dG9tYXRpY2FsbHkgd2lsbCBiZSBhIHBsdXMgZm9yIHVzCkRFQlVHR0VSPSRiaW5kaXIvd2luZWRiZyAgICAgICMgdGhlIChpbnN0YWxsZWQpIHBhdGggb2Ygd2luZWRiZwpIREVCVUdHRVI9ZGVidWdnZXIvd2luZWRiZyAgICAjIHRoZSAobm9uLWluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCgojIHRoaXMgaXMgb25seSBmb3IgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxscwpXSU5FQ09ORj10b29scy93aW5lY29uZiAgICAgICAjIHRoZSBwYXRoIG9mIHdpbmVjb25mIHBlcmwgc2NyaXB0CgojIHRoaXMgaXMgb25seSBmb3Igbm8td2luZG93cyBpbnN0YWxscwpXSU5FSU5JPSRleGRpci9jb25maWcgICAgICAgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgd2luZSBjb25maWcgZmlsZSAoYWxzbyB1c2VkIGJ5IHdpbmVjb25mKQpXSU5JTkk9L2Rldi9udWxsICAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgd2luLmluaQpTWVNURU1JTkk9JGV4ZGlyL3N5c3RlbS5pbmkgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgc3lzdGVtLmluaQpSRUdBUEk9cHJvZ3JhbXMvcmVnYXBpL3JlZ2FwaSAjIHRoZSBwYXRoIG9mIHJlZ2FwaSB3aW5lbGliIGFwcGxpY2F0aW9uCkRFRlJFRz13aW5lZGVmYXVsdC5yZWcgICAgICAgICMgdGhlIHBhdGggb2YgdGhlIHJlZ2lzdHJ5IGZpbGUgdG8gYmUgZmVkIHRvIHJlZ2FwaQojIENST09UPS92YXIvd2luZSAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQpERUZDQVQ9Y2F0ICAgICAgICAgICAgICAgICAgICAjIHByb2dyYW0gdG8gY2F0ICRERUZSRUcgd2l0aCAoc29tZSBwYWNrYWdlcyBuZWVkIHpjYXQpCiMtLS0gZW5kIG9mIGRlZmF1bHRzCgojIHRlbXBvcmFyeSBmaWxlcyB1c2VkIGJ5IHRoZSBpbnN0YWxsZXIKVE1QQ09ORj0vdG1wL3dpbmVpbnN0YWxsLmNvbmYKVE1QUkVHPS90bXAvd2luZWluc3RhbGwucmVnCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gc3RkX3NsZWVwIHsKICBzbGVlcCAxCn0KCmZ1bmN0aW9uIGNvbmZfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBpbXBvcnRhbmNlLCAkMiA9IHF1ZXN0aW9uLWlkLCAkMysgPSBtZXNzYWdlIGxpbmVzCiAgIyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgYnkgZS5nLiBkZWJjb25mIGluIGRlYmlhbiBwYWNrYWdlcwogICMgYnV0IGhlcmUgd2UganVzdCBwcmludCB0aGUgbWVzc2FnZQogIHNoaWZ0IDIKICBlY2hvCiAgbG9jYWwgTElORT0iJDEiCiAgd2hpbGUgc2hpZnQKICBkbyB7CiAgICBlY2hvICIkTElORSIKICAgIExJTkU9IiQxIgogIH0KICBkb25lCn0KCmZ1bmN0aW9uIGNvbmZfcmVzZXRfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBxdWVzdGlvbi1pZAogICMgdGhpcyBpcyB1c2VkIHRvIGZsdXNoIGFueSBjYWNoZWQgYW5zd2VycyBhbmQgImFscmVhZHktZGlzcGxheWVkIiBmbGFncwogIHNoaWZ0ICMgZHVtbXkgY29tbWFuZAp9CgpmdW5jdGlvbiBjb25mX3llc25vX2Fuc3dlciB7CiAgdW5zZXQgQU5TV0VSCiAgd2hpbGUgWyAiJEFOU1dFUiIgIT0gJ3llcycgXSAmJiBbICIkQU5TV0VSIiAhPSAnbm8nIF0KICBkbyB7CiAgICBlY2hvIC1uICIkMSIKICAgIHJlYWQgQU5TV0VSCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9zdHJpbmdfYW5zd2VyIHsKICBlY2hvIC1uICIkMSIKICByZWFkIEFOU1dFUgp9CgpmdW5jdGlvbiBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcyB7CiAgZm9yIHRkaXIgaW4gIiRDUk9PVC93aW5kb3dzIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUiICIkQ1JPT1Qvd2luZG93cy9TdGFydCBNZW51L1Byb2dyYW1zIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC9Db21tb24gRmlsZXMiICIkQ1JPT1QvUHJvZ3JhbSBGaWxlcyIgXAogICAgICAgICAgICAgICIkQ1JPT1Qvd2luZG93cy9Qcm9maWxlcyIgIiRDUk9PVC93aW5kb3dzL1Byb2ZpbGVzL0FkbWluaXN0cmF0b3IiCiAgZG8gWyAtZCAiJHRkaXIiIF0gfHwgbWtkaXIgIiR0ZGlyIgogIGRvbmUKICBbIC1mICIkQ1JPT1Qvd2luZG93cy93aW4uaW5pIiBdICAgIHx8IGNwICIkV0lOSU5JIiAgICAiJENST09UL3dpbmRvd3Mvd2luLmluaSIKICBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uaW5pIiBdIHx8IGNwICIkU1lTVEVNSU5JIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmluaSIKfQoKIyBzdGFydHVwLi4uCgplY2hvICJXSU5FIEluc3RhbGxlciB2MC43MiIKZWNobwoKaWYgWyAiJEJJTkRJU1QiID0gJ25vJyBdCnRoZW4gewoKaWYgISBbIC1mIGNvbmZpZ3VyZSBdCnRoZW4gewogIGVjaG8gIllvdSdyZSBydW5uaW5nIHRoaXMgZnJvbSB0aGUgd3JvbmcgZGlyZWN0b3J5LiIKICBlY2hvICJDaGFuZ2UgdG8gdGhlIFdpbmUgc291cmNlJ3MgbWFpbiBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4iCiAgZXhpdCAxCn0KZmkKCmlmIFsgYHdob2FtaWAgPT0gJ3Jvb3QnIF0KdGhlbiB7CiAgZWNobyAiWW91IGFyZSBydW5uaW5nIHdpbmVpbnN0YWxsIGFzIHJvb3QsIHRoaXMgaXMgbm90IGFkdmlzYWJsZS4gUGxlYXNlIHJlcnVuIGFzIGEgdXNlci4iCiAgZWNobyAiQWJvcnRpbmcuIgogIGV4aXQgMQp9CmZpCgojIGNoZWNrIHdoZXRoZXIgUlBNIGluc3RhbGxlZCwgYW5kIGlmIGl0IGlzLCByZW1vdmUgYW55IG9sZCB3aW5lIHJwbS4KaGFzaCBycG0gJj4vZGV2L251bGwKUkVUPSQ/CmlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgaWYgWyAtbiAiYHJwbSAtcWkgd2luZSAyPi9kZXYvbnVsbHxncmVwICJeTmFtZSJgIiBdOyB0aGVuCiAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZpcnN0PyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBpZiBbICIkQU5TV0VSIiA9ICd5ZXMnIF07IHRoZW4KICAgICAgZWNobyAiV2UgbmVlZCB0byByZW1vdmUgdGhlIHJwbSBhcyByb290LCBwbGVhc2UgZW50ZXIgeW91ciByb290IHBhc3N3b3JkIgogICAgICBlY2hvCiAgICAgIGVjaG8gU3RhcnRpbmcgd2luZSBycG0gcmVtb3ZhbC4uLgogICAgICBzdSAtYyAicnBtIC1lIHdpbmU7IFJFVD0kPyIKICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvIERvbmUuCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJGQUlMRUQuIFByb2JhYmx5IHlvdSBhcmVuJ3QgaW5zdGFsbGluZyBhcyByb290LiIKCWVjaG8gIkV4cGVjdCBwcm9ibGVtcyAobGlicmFyeSBjb25mbGljdHMgd2l0aCBleGlzdGluZyBpbnN0YWxsIGV0Yy4pLiIKICAgICAgZmkKICAgIGVsc2UKICAgICAgZWNobyAiU29ycnksIEkgd29uJ3QgaW5zdGFsbCBXaW5lIHdoZW4gYW4gcnBtIHZlcnNpb24gaXMgc3RpbGwgaW5zdGFsbGVkLiIKICAgICAgZWNobyAiKFdpbmUgc3VwcG9ydCBzdWZmZXJlZCBmcm9tIHdheSB0b28gbWFueSBjb25mbGljdHMgYmV0d2VlbiBSUE0iCiAgICAgIGVjaG8gImFuZCBzb3VyY2UgaW5zdGFsbHMpIgogICAgICBlY2hvICJIYXZlIGEgbmljZSBkYXkgISIKICAgICAgZXhpdCAxCiAgICBmaSAKICBmaQpmaQoKIyBjaGVjayB3aGV0aGVyIHdpbmUgYmluYXJ5IHN0aWxsIGF2YWlsYWJsZQppZiBbIC1uICJgd2hpY2ggd2luZWAiIF07IHRoZW4KICBlY2hvICJXYXJuaW5nICEhIHdpbmUgYmluYXJ5IChzdGlsbCkgZm91bmQsIHdoaWNoIG1heSBpbmRpY2F0ZSIKICBlY2hvICJhIChjb25mbGljdGluZykgcHJldmlvdXMgaW5zdGFsbGF0aW9uLiIKICBlY2hvICJZb3UgbWlnaHQgd2FudCB0byBhYm9ydCBhbmQgdW5pbnN0YWxsIFdpbmUgZmlyc3QuIgogIHN0ZF9zbGVlcApmaQoKIyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGlmIG5lY2Vzc2FyeQoKaWYgWyAtZiBjb25maWcuY2FjaGUgXSAmJiBbIC1mIE1ha2VmaWxlIF0gJiYgWyBNYWtlZmlsZSAtbnQgY29uZmlndXJlIF0KdGhlbiB7CiAgZWNobwogIGVjaG8gIkkgc2VlIHRoYXQgV0lORSBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQsIHNvIEknbGwgc2tpcCB0aGF0LiIKICBzdGRfc2xlZXAKICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAuIC4vY29uZmlnLmNhY2hlCn0KZWxzZSB7CiAgZWNobyAiUnVubmluZyBjb25maWd1cmUuLi4iCiAgZWNobwogIGlmICEgLi9jb25maWd1cmUgLUMgJENPTkZBUkdTCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJDb25maWd1cmUgZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgZXhpdCAxCiAgfQogIGZpCiAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgLiAuL2NvbmZpZy5jYWNoZQogICMgbWFrZSBzdXJlIFggd2FzIGZvdW5kCiAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKICBpZiBbICIkaGF2ZV94IiAhPSAieWVzIiBdCiAgdGhlbiB7CiAgICBlY2hvICJJbnN0YWxsIHRoZSBYIGRldmVsb3BtZW50IGhlYWRlcnMgYW5kIHRyeSBhZ2Fpbi4iCiAgICBybSAtZiBjb25maWcuY2FjaGUKICAgIGV4aXQgMQogIH0KICBmaQp9CmZpCgojIG5vdyBkbyB0aGUgY29tcGlsYXRpb24gYW5kIGluc3RhbGwsIHdlIG5lZWQgdG8gYWx3YXlzIGRvIHRoaXMgYmVjYXVzZSB3ZSAKIyBkb24ndCB3YW50IHRoZSAnbWFrZSBpbnN0YWxsJyBjb21tYW5kIHdlIG1pZ2h0IHJ1biB0byBydW4gJ21ha2UnIGFzIHJvb3QKaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQp0aGVuIHsKICAjIGFzayB0aGUgdXNlciBpZiB0aGV5IHdhbnQgdG8gYnVpbGQgYW5kIGluc3RhbGwgd2luZQogIGVjaG8KICBlY2hvICJXZSBuZWVkIHRvIGluc3RhbGwgd2luZSBhcyByb290IHVzZXIsIGRvIHlvdSB3YW50IHVzIHRvIGJ1aWxkIHdpbmUsIgogIGVjaG8gIidzdSByb290JyBhbmQgaW5zdGFsbCBXaW5lPyAgRW50ZXIgJ25vJyB0byBjb250aW51ZSB3aXRob3V0IGluc3RhbGxpbmciCiAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKCiAgaWYgWyAiJEFOU1dFUiIgPSAieWVzIiBdCiAgdGhlbiB7CiAgICAjIHN0YXJ0IG91dCB3aXRoIHRoZSBiYXNpYyBjb21tYW5kCiAgICBzdWNvbW1hbmQ9Im1ha2UgaW5zdGFsbCIKCiAgICAjIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSAkbGliZGlyIGluIHRoZWlyIGxkLnNvLmNvbmYgYWRkIHRoaXMKICAgICMgdG8gb3VyIHN1Y29tbWFuZCBzdHJpbmcKICAgIGlmIFsgLWYgL2V0Yy9sZC5zby5jb25mIF0gJiYgISBncmVwIC1xcyAiJGxpYmRpciIgL2V0Yy9sZC5zby5jb25mCiAgICB0aGVuIHsKICAgICAgZWNobwogICAgICBlY2hvICIkbGliZGlyIGRvZXNuJ3QgZXhpc3QgaW4geW91ciAvZXRjL2xkLnNvLmNvbmYsIGl0IHdpbGwgYmUgYWRkZWQiCiAgICAgIGVjaG8gIndoZW4gd2UgcGVyZm9ybSB0aGUgaW5zdGFsbC4uLiIKICAgICAgc3Vjb21tYW5kPSJlY2hvICRsaWJkaXI+Pi9ldGMvbGQuc28uY29uZjtsZGNvbmZpZzskc3Vjb21tYW5kIgogICAgfQogICAgZmkKCiAgICBlY2hvCgogICAgZWNobyAiQ29tcGlsaW5nIFdJTkUuIEdyYWIgYSBsdW5jaCBvciB0d28sIHJlbnQgYSB2aWRlbywgb3Igd2hhdGV2ZXIsIgogICAgZWNobyAiaW4gdGhlIG1lYW50aW1lLi4uIgogICAgZWNobwogICAgc3RkX3NsZWVwCgogICAgIyB0cnkgdG8ganVzdCBtYWtlIHdpbmUsIGlmIHRoaXMgZmFpbHMgJ21ha2UgZGVwZW5kJyBhbmQgdHJ5IHRvIHJlbWFrZQogICAgaWYgISB7IG1ha2U7IH0KICAgIHRoZW4gewogICAgICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogICAgICB0aGVuIHsKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQogICAgfQogICAgZmkKICAgIGVjaG8KCiAgICBlY2hvICJQZXJmb3JtaW5nICdtYWtlIGluc3RhbGwnIGFzIHJvb3QgdG8gaW5zdGFsbCBiaW5hcmllcywgZW50ZXIgcm9vdCBwYXNzd29yZCIKCiAgICBzdGRfc2xlZXAKCiAgICBpZiAhIHN1IHJvb3QgLWMiJHN1Y29tbWFuZCIKICAgIHRoZW4gewogICAgICBlY2hvCiAgICAgIGVjaG8gIkVpdGhlciB5b3UgZW50ZXJlZCBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgb3Igd2UgZmFpbGVkIHRvIHJ1biIKICAgICAgZWNobyAiJyRzdWNvbW1hbmQnIGNvcnJlY3RseS4iCiAgICAgIGVjaG8gIklmIHlvdSBkaWRuJ3QgZW50ZXIgYW4gaW5jb3JyZWN0IHBhc3N3b3JkIHRoZW4gcGxlYXNlIHJlcG9ydCB0aGlzIgogICAgICBlY2hvICJlcnJvciB0byB3aW5lLWRldmVsQHdpbmVocS5jb20uIgogICAgICBlY2hvCiAgICAgIGVjaG8gIkluc3RhbGxhdGlvbiBmYWlsZWQsIGFib3J0aW5nLiIKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQoKICAgIGVjaG8KCiAgICAjIHNlZSBpZiB3aW5lIGlzIGluc3RhbGxlZCBvbiB0aGUgdXNlcnMgc3lzdGVtLCBpZiBub3QgcHJvbXB0IHRoZW0KICAgICMgYW5kIHRoZW4gZXhpdAogICAgaWYgWyAhIGB3aGljaCB3aW5lYCBdCiAgICB0aGVuCiAgICAgIGVjaG8gIkNvdWxkIG5vdCBmaW5kIHdpbmUgb24geW91ciBzeXN0ZW0uICBSdW4gd2luZWluc3RhbGwgYXMgcm9vdCB0byBpbnN0YWxsIHdpbmUiCiAgICAgIGVjaG8gImJlZm9yZSByZS1ydW5uaW5nIHdpbmVpbnN0YWxsIGFzIGEgdXNlci4iCiAgICAgIGVjaG8KICAgICAgZWNobyAiRXhpdGluZyB3aW5laW5zdGFsbCIKICAgICAgZXhpdCAxOwogICAgZmkKICB9CiAgZWxzZSB7CiAgICAjIHVzZXIgZGlkbid0IHdhbnQgdG8gaW5zdGFsbCB3aW5lIHNvIHRlbGwgdGhlbSBhYm91dCBydW5uaW5nIGZyb20gdGhlCiAgICAjIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBzZXQgc29tZSBzdHVmZiB1cCBmb3IgdGhlbQoKICAgICMgc2V0dXAgdG8gcnVuIGZyb20gY3VycmVudCBkaXJlY3RvcnkKICAgIERMTFBBVEg9IiRQV0QvZGxscyIKICAgIGlmIFsgLXogIiRMRF9MSUJSQVJZX1BBVEgiIF0KICAgIHRoZW4gTERfTElCUkFSWV9QQVRIPSIkUFdEOiRETExQQVRIIgogICAgZWxzZSBMRF9MSUJSQVJZX1BBVEg9IiRMRF9MSUJSQVJZX1BBVEg6JFBXRDokRExMUEFUSCIKICAgIGZpCiAgICBleHBvcnQgTERfTElCUkFSWV9QQVRICiAgICBERUJVR0dFUj0iJFBXRC8kSERFQlVHR0VSIgogICAgZWNobwogICAgZWNobyAiTk9URSEgVG8gcnVuIFdpbmUgd2l0aG91dCBpbnN0YWxsaW5nLCB5b3UgbXVzdCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIgogICAgZWNobyAiTERfTElCUkFSWV9QQVRIIHRvICRQV0Q6JERMTFBBVEgiCiAgICBlY2hvICJpbiB5b3VyIGxvZ29uIHNjcmlwdHMuIgogICAgZWNobwogIH0KICBmaQp9CmVsc2UgewogIGVjaG8gIllvdSBhcmUgcnVubmluZyB3aW5laW5zdGFsbCBhcyByb290LCB0aGlzIGlzIG5vdCBhZHZpc2FibGUuIFBsZWFzZSByZXJ1biBhcyBhIHVzZXIuIgogIGVjaG8gIkFib3J0aW5nLiIKICBleGl0IDEKfQpmaSAjIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KCn0KZmkgIyBCSU5ESVNUCgojIG5vdyBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBnZW5lcmF0ZSB3aW5lLmNvbmYKaWYgWyAteiAiJERPR0xPQkFMQ09ORiIgXQp0aGVuCiAgRE9HTE9CQUxDT05GPWF1dG8KZmkKCmlmIFsgIiRET0dMT0JBTENPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3lzdGVtIHdpbmUuY29uZgogIGlmIFsgISAtZiAkR0NPTkYgXSAmJiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0KICB0aGVuCiAgICBET0dMT0JBTENPTkY9bm8KICAgIGVjaG8gIkNyZWF0aW9uIG9mIGEgZ2xvYmFsIGNvbmZpZyBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gd2luZWluc3RhbGwgYXQgdGhpcyIKICAgIGVjaG8gInRpbWUuICBXaGVuIHRoZSBjb25maWd1cmF0aW9uIGFyY2hpdGVjdHVyZSBpcyBjbGVhbmVkIHVwIHRoaXMgZnVuY3Rpb25hbGl0eSIKICAgIGVjaG8gIndpbGwgYmUgcmVzdG9yZWQgdG8gd2luZWluc3RhbGwuIgogICAgZWNobwogIGZpCn0KZmkKCmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAnYXV0bycgXQp0aGVuIHsKICAjIHNlZSBpZiB0aGUgdXNlciBpcyByb290LCBpZiBzbywgZXhwbGljaXRseSBhc2sgdGhlbSBpZiB0aGV5IHdhbnQgYQogICMgbG9jYWwgY29uZmlnIGZpbGUKICBpZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0KICB0aGVuCiAgICBlY2hvICJZb3UgYXJlIHJ1bm5pbmcgYXMgcm9vdC4gIERvIHlvdSB3YW50IGEgbG9jYWwgY29uZmlnIGZpbGUsIgogICAgZWNobyAiZmlsZSwgfi8ud2luZS9jb25maWcsIGNyZWF0ZWQ/IgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogIGVsc2UKICAgICMgaWYgdGhlIHVzZXIgaGFzIGFuIGV4aXN0aW5nIGNvbmZpZyBmaWxlIGFzayB0aGVtIGlmIHRoZXkgd2FudCB1cyB0bwogICAgIyBvdmVyd3JpdGUgaXQsIG90aGVyd2lzZSBqdXN0IGFzayB0aGVtIGlmIHRoZXkgd2FudCB0byBjcmVhdGUgb25lCiAgICBpZiBbIC1mICIkTENPTkYiIF0KICAgIHRoZW4KICAgICAgZWNobyAiRm91bmQgZXhpc3RpbmcgJExDT05GLCBkbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhpcyIKICAgICAgZWNobyAiZXhpc3RpbmcgV2luZSBjb25maWd1cmF0aW9uIGZpbGU/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICAgICAgZWNobwogICAgZWxzZSB7CiAgICAgIGVjaG8gIkNyZWF0ZSBsb2NhbCBjb25maWcgZmlsZSB+Ly53aW5lL2NvbmZpZz8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogICAgICBlY2hvCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICAgIHRoZW4KICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggbmVlZF9yb290IFwKICAgICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBUcnkgYWdhaW4gYXMgcm9vdCB0byBnZW5lcmF0ZSBhIHN5c3RlbSB3aW5lLmNvbmYuIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgfQogICAgZmkKICBmaQp9CmZpCgojIGdlbmVyYXRlICRUTVBDT05GIGZyb20gZXhpc3Rpbmcgd2luZG93cyBpbnN0YWxsLCBpZiBhbnkKaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJERPV0NISyIgPSAneWVzJyBdIHx8IFsgIiRET1dDSEsiID0gJ2F1dG8nIF0KICB0aGVuIHsKICAgIGVjaG8gLW4gIlNlYXJjaGluZyBmb3IgYW4gZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uLi4iCiAgICBpZiAhICRXSU5FQ09ORiAtaW5pZmlsZSAiJFdJTkVJTkkiID4gJFRNUENPTkYgMj4vZGV2L251bGwKICAgIHRoZW4gewogICAgICBybSAtZiAkVE1QQ09ORiAkVE1QUkVHID4gL2Rldi9udWxsCgogICAgICBlY2hvICIgbm90IGZvdW5kLiAobm8gbWF0Y2hpbmcgL2V0Yy9mc3RhYiBtb3VudCBlbnRyeSBmb3VuZCkiCiAgICAgIGNvbmZfcXVlc3Rpb24gbG93IGRvX3dpdGhvdXRfd2luZG93cyBcCiAgICAgICAiV2luZG93cyB3YXMgbm90IGZvdW5kIG9uIHlvdXIgc3lzdGVtLCBzbyBJIGFzc3VtZSB5b3Ugd2FudCIgXAogICAgICAgImEgV2luZS1vbmx5IGluc3RhbGxhdGlvbi4gQW0gSSBjb3JyZWN0PyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAnbm8nIF0KICAgICAgdGhlbiB7CiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIHdpbmRvd3Nfbm90X2ZvdW5kIFwKICAgICAgICAgIkFib3J0aW5nIGluc3RhbGwuIE1ha2Ugc3VyZSB5b3VyIFdpbmRvd3MgcGFydGl0aW9uIGlzIG1vdW50ZWQgYW5kIHRyeSBhZ2FpbiwiIFwKICAgICAgICAgIm9yIGNyZWF0ZSAkTENPTkYgbWFudWFsbHkgYnkgY29weWluZyBmcm9tICRXSU5FSU5JIGFuZCBhZGFwdGluZyB0aGUgZHJpdmUgcGF0aHMuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICAgIERPV0lORT15ZXMKICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICIgZm91bmQuIgoKICAgICAgY29uZl9yZXNldF9xdWVzdGlvbiB3aW5kb3dzX2ZvdW5kCiAgICAgIGNvbmZfcXVlc3Rpb24gbG93IHdpbmRvd3NfZm91bmQgXAogICAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIHlvdXIgZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uIiBcCiAgICAgICAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogICAgICBET1dJTkU9bm8KICAgIH0KICAgIGZpCiAgfQogIGVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQogIHRoZW4gRE9XSU5FPXllcwogIGZpCn0KZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCnRoZW4gCiAgRE9XSU5FPW5vCmZpCgojIHNldHVwIGEgbm8td2luZG93cyBpbnN0YWxsYXRpb24sIGlmIG5lY2Vzc2FyeQppZiBbICIkRE9XSU5FIiA9ICd5ZXMnIF0KdGhlbiB7CiAgIyBzZXQgYW4gYXBwcm9wcmlhdGUgRENST09UCiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gRENST09UPX4vYwogIGVsc2UgRENST09UPS9jCiAgZmkKCiAgaWYgWyAtZiB+Ly53aW5lcmMgXQogIHRoZW4gewogICAgY29uZl9xdWVzdGlvbiBtZWRpdW0gY29udmVydF9jb25maWcgXAogICAgICJJIGZvdW5kIHRoZSBvbGQgdmVyc2lvbiBXaW5lIGNvbmZpZyBmaWxlLCAud2luZXJjLCBpbiB5b3VyICIgXAogICAgICJob21lIGRpcmVjdG9yeS4gIEkgY2FuIGNvbnZlcnQgdGhpcyB0byB0aGUgbmV3IGZvcm1hdCBvciB1c2UgdGhlIiBcCiAgICAgIm5ldyBkZWZhdWx0IFdpbmUgY29uZmlnIGZpbGUuIENvbnZlcnQ/IgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXQogICAgdGhlbiB7CiAgICAgIFdJTkVJTkk9fi8ud2luZXJjCiAgICAgIENPTlZDT05GPXllcwogICAgfQogICAgZmkKICB9CiAgZWxzZSB7CgogICAgY29uZl9xdWVzdGlvbiBsb3cgZHJpdmVjX3BhdGggXAogICAgICJDb25maWd1cmluZyBXaW5lIHdpdGhvdXQgV2luZG93cy4iIFwKICAgICAiU29tZSBmYWtlIFdpbmRvd3MgZGlyZWN0b3JpZXMgbXVzdCBiZSBjcmVhdGVkLCB0byBob2xkIGFueSAuaW5pIGZpbGVzLCBETExzLCIgXAogICAgICJzdGFydCBtZW51IGVudHJpZXMsIGFuZCBvdGhlciB0aGluZ3MgeW91ciBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zdGFsbC4iIFwKICAgICAiV2hlcmUgd291bGQgeW91IGxpa2UgeW91ciBmYWtlIEMgZHJpdmUgdG8gYmUgcGxhY2VkPyIKICAgIHdoaWxlIFsgLXogIiRDUk9PVCIgXQogICAgZG8gewogICAgICBjb25mX3N0cmluZ19hbnN3ZXIgIihkZWZhdWx0IGlzICREQ1JPT1QpICIKICAgICAgWyAteiAiJEFOU1dFUiIgXSAmJiBBTlNXRVI9IiREQ1JPT1QiCiAgICAgIGlmICEgWyAtZCAiJEFOU1dFUiIgXQogICAgICB0aGVuIHsKICAgICAgICBpZiBta2RpciAtcCAiJEFOU1dFUiIKICAgICAgICB0aGVuIENST09UPSIkQU5TV0VSIgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkRpcmVjdG9yeSAkQU5TV0VSIGNhbid0IGJlIGNyZWF0ZWQgISIKICAgICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gZHJpdmVjX3BhdGgKICAgICAgICBmaQogICAgICB9CiAgICAgIGVsc2UgQ1JPT1Q9IiRBTlNXRVIiCiAgICAgIGZpCiAgICB9CiAgICBkb25lCiAgICBlY2hvICJDb25maWd1cmluZyBXaW5lIGZvciBhIG5vLXdpbmRvd3MgaW5zdGFsbCBpbiAkQ1JPT1QuLi4iCiAgCiAgICBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcwogIH0KICBmaQoKICAjIGNyZWF0ZSAkTENPTkYgdXNpbmcgdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUgJFdJTkVJTkkgIAogIGlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdICYmIFsgIiRDT05WQ09ORiIgPSAnbm8nIF0KICB0aGVuIHsKICAgIHNlZCAic3xcIlBhdGhcIiA9IFwiL2NcIlwkfFwiUGF0aFwiID0gXCIke0NST09UfVwifCIgJFdJTkVJTkkgPiAkVE1QQ09ORgogICAgY29uZl9yZXNldF9xdWVzdGlvbiBkZWZhdWx0X2NvbmZpZwogICAgY29uZl9xdWVzdGlvbiBsb3cgZGVmYXVsdF9jb25maWcgXAogICAgICJDcmVhdGVkICRMQ09ORiB1c2luZyBkZWZhdWx0IFdpbmUgY29uZmlndXJhdGlvbi4iIFwKICAgICAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogIH0KICBmaQoKICAjIG5vdyB3ZSByZWFsbHkgc2hvdWxkIGluc3RhbGwgdGhlIHJlZ2lzdHJ5CiAgaWYgWyAiJERPUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBET1JFRz15ZXMKICBmaQp9CmZpCmVjaG8KCiNpbnN0YWxsIHRoZSBsb2NhbCBjb25maWcgZmlsZSAkTENPTkYKaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KdGhlbgogIGlmIFsgISAtdyB+Ly53aW5lIF0KICB0aGVuCiAgICBta2RpciB+Ly53aW5lCiAgZmkKCiAgaWYgWyAiJENPTlZDT05GIiA9ICdubycgXQogIHRoZW4KICAgIGNwICRUTVBDT05GICRMQ09ORiA+IC9kZXYvbnVsbAogIGZpCmVsc2UKICBET1JFRz1ubwpmaSAgICAgIAoKI2luc3RhbGwgdGhlIGdsb2JhbCBjb25maWcgZmlsZSAkR0NPTkYKaWYgWyAiJERPR0xPQkFMQ09ORiIgPSAneWVzJyBdCnRoZW4KICBpZiBbICEgLWYgJHN5c2NvbmZkaXIgXQogIHRoZW4KICAgIG1rZGlyIC1wICRzeXNjb25mZGlyCiAgZmkKCiAgY3AgJFRNUENPTkYgJEdDT05GID4gL2Rldi9udWxsCmZpCgojIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkKIyAobm90IHRvIGJlIGRvbmUgaWYgd2luZG93cyByZWdpc3RyeSBleGlzdHMpCmlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQp0aGVuIHsKICBDUk9PVD1gc2VkIC1uICcvXlxbRHJpdmUgQ1xdJC8sL15cWy4qXF0kLyBzL15QYXRoPVwoLipcKS9cMS9wJyAkQ09ORmAKICBlY2hvICJDaGVja2luZyBmb3IgcmVhbCBXaW5kb3dzIHJlZ2lzdHJ5Li4uIgogIGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5kYXQiIF0KICB0aGVuIERPUkVHPW5vCiAgZWxpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jb25maWcvc3lzdGVtIiBdCiAgdGhlbiBET1JFRz1ubwogIGVsc2UgRE9SRUc9eWVzCiAgZmkKICBpZiBbICIkRE9SRUciID0gJ3llcycgXQogIHRoZW4gZWNobyAiTm90IGZvdW5kLCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgd2lsbCBiZSBpbnN0YWxsZWQuIgogIGVsc2UgZWNobyAiV2luZG93cyByZWdpc3RyeSBmb3VuZCwgd2lsbCBub3QgaW5zdGFsbCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkuIgogIGZpCiAgZWNobwp9CmZpCgojIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeSBlbnRyaWVzCmlmIFsgIiRET1JFRyIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQogIHRoZW4gewogICAgZWNobyAiQ29tcGlsaW5nIHJlZ2FwaS4uLiIKICAgIChjZCBwcm9ncmFtcy9yZWdhcGk7IG1ha2UpCiAgICBlY2hvCiAgfQogIGZpCiAgZWNobyAiUHJlcGFyaW5nIHRvIGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCgogICMgZWRpdCBjb25maWcgZmlsZXMgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gcmVnYXBpIHVuZGVyIFgKICBpZiBbICIkQ09OVkNPTkYiID0gJ3llcycgXQogIHRoZW4KICAgIG12ICRXSU5FSU5JICRXSU5FSU5JLm5ldwogICAgc2VkICJzL0dyYXBoaWNzRHJpdmVyPS4qL0dyYXBoaWNzRHJpdmVyPXR0eWRydi8iICRXSU5FSU5JLm5ldyA+ICRXSU5FSU5JCiAgZWxzZQogICAgbXYgJExDT05GICRMQ09ORi5uZXcKICAgIHNlZCAicy9cIkdyYXBoaWNzRHJpdmVyXCIgPSAuKi9cIkdyYXBoaWNzRHJpdmVyXCIgPSBcInR0eWRydlwiLyIgJExDT05GLm5ldyA+ICRMQ09ORgogIGZpCgogICMgY3JlYXRlIGEgdGVtcG9yYXJ5IHdpbmVpbnN0YWxsLnJlZyB3aXRoIGZpeGVkIGRlYnVnZ2VyIHBhdGgKICAkREVGQ0FUICRERUZSRUcgfCBzZWQgInN8ZGVidWdnZXIvd2luZWRiZ3wke0RFQlVHR0VSfXwiID4gJFRNUFJFRwoKICBlY2hvICJJbnN0YWxsaW5nIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgogIGVjaG8KICBpZiAhICRSRUdBUEkgc2V0VmFsdWUgPCAkVE1QUkVHID4gL2Rldi9udWxsCiAgdGhlbiB7CiAgICBybSAtZiAkVE1QUkVHCiAgICBlY2hvICJSZWdpc3RyeSBpbnN0YWxsIGZhaWxlZC4iCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHJlZ2FwaV9lcnJvcgogICAgY29uZl9xdWVzdGlvbiBoaWdoIHJlZ2FwaV9lcnJvcgogICAgZXhpdCAxCiAgfQogIGVsc2UgewogICAgIyBpZiB3ZSBhcmUgY29udmVydGluZyBmcm9tIGEgLndpbmVyYyBmaWxlLCBydW5uaW5nIHJlZ2FwaSBvbmNlCiAgICAjIHdpbGwgT05MWSBjb252ZXJ0IC53aW5lcmMgLT4gfi8ud2luZS9jb25maWcsIGl0IHdpbGwgbm90IGltcG9ydCB0aGUKICAgICMgcmVnaXN0cnkgZGF0YS4gIHNvIGlmIHdlIGFyZSBjb252ZXJ0aW5nIHdlIG5lZWQgdG8gcnVuIHJlZ2FwaSB0d2ljZQogICAgaWYgWyAiJENPTlZDT05GIiA9ICd5ZXMnIF0KICAgIHRoZW4KICAgICAgaWYgISAkUkVHQVBJIHNldFZhbHVlIDwgJFRNUFJFRyA+IC9kZXYvbnVsbAogICAgICB0aGVuCiAgICAgICAgcm0gLWYgJFRNUFJFRwogICAgICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHJlZ2FwaV9lcnJvcgogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCByZWdhcGlfZXJyb3IKICAgICAgICBleGl0IDEKICAgICAgZWxzZQogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJSZWdpc3RyeSBlbnRyaWVzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQuIgogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvCiAgICAgIGVjaG8gIlJlZ2lzdHJ5IGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4iCiAgICBmaQogIH0KICBmaQogIHJtIC1mICRUTVBSRUcKICBpZiBbICIkU1lTUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBTWVNSRUc9eWVzCiAgZmkKCiAgIyBpZiB3ZSBjb252ZXJ0ZWQgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGdyYXBoaWNzIGRyaXZlciBiYWNrIGFuZAogICMgcmVzdG9yZSB0aGUgb3JpZ2luYWwgLndpbmVyYyBmaWxlCiAgaWYgWyAiJENPTlZDT05GIiA9ICd5ZXMnIF0KICB0aGVuCiAgICAgbXYgJFdJTkVJTkkubmV3ICRXSU5FSU5JCiAgZmkKCiAgc2VkICJzL1wiR3JhcGhpY3NEcml2ZXJcIiA9IC4qL1wiR3JhcGhpY3NEcml2ZXJcIiA9IFwieDExZHJ2XCIvIiAkTENPTkYgPiAkTENPTkYubmV3CiAgbXYgJExDT05GLm5ldyAkTENPTkYKfQpmaQoKIyBtYWtlIHJvb3QncyByZWdpc3RyeSBnbG9iYWwsIGlmIGRlc2lyZWQKaWYgWyBgd2hvYW1pYCA9ICdyb290JyBdICYmIFsgIiRET1JFRyIgPSAneWVzJyBdICYmIFsgIiRTWVNSRUciID0gJ3llcycgXQp0aGVuIHsKICBbIC1kIH4vLndpbmUgXSB8fCBta2RpciB+Ly53aW5lCiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyB1c2VyIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIFsgLWYgfi8ud2luZS93aW5lLnVzZXJyZWcgXSAmJiBjcCB+Ly53aW5lL3dpbmUudXNlcnJlZyAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgfi8ud2luZS93aW5lLnVzZXJyZWcKICB9CiAgZmkKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3Mgc3lzdGVtIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIFsgLWYgfi8ud2luZS9zeXN0ZW0ucmVnIF0gJiYgY3Agfi8ud2luZS9zeXN0ZW0ucmVnICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgfi8ud2luZS9zeXN0ZW0ucmVnCiAgfQogIGZpCn0KZmkKCiMgY2xlYW51cCBhbnkgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgbWF5IHJlbWFpbgppZiBbIC1mICRUTVBDT05GIF0KdGhlbiBybSAtZiAkVE1QQ09ORgpmaQppZiBbIC1mICRUTVBSRUcgXQp0aGVuIHJtIC1mICRUTVBSRUcKZmkKCgojIGl0J3MgYSB3cmFwCmVjaG8KZWNobyAiSW5zdGFsbGF0aW9uIGNvbXBsZXRlIGZvciBub3cuIEdvb2QgbHVjayAodGhpcyBpcyBzdGlsbCBhbHBoYSBzb2Z0d2FyZSkuIgplY2hvICJJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIFdJTkUsIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZpcnN0LCIKZWNobyAiYXMgbWFueSBraW5kcyBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIGV4cGxhaW5lZCB0aGVyZS4iCgpleGl0IDAK