IyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNy44IC0qLSBBdXRvY29uZiAtKi0KCiMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyCiMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAojIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCiMgUEFSVElDVUxBUiBQVVJQT1NFLgoKCmRubApkbmwgR0xJQkNYWF9DT05ESVRJT05BTCAoTkFNRSwgU0hFTEwtVEVTVCkKZG5sCmRubCBFeGFjdGx5IGxpa2UgQU1fQ09ORElUSU9OQUwsIGJ1dCBkZWxheXMgZXZhbHVhdGlvbiBvZiB0aGUgdGVzdCB1bnRpbCB0aGUKZG5sIGVuZCBvZiBjb25maWd1cmUuICBUaGlzIGxldHMgdGVzdGVkIHZhcmlhYmxlcyBiZSByZWFzc2lnbmVkLCBhbmQgdGhlCmRubCBjb25kaXRpb25hbCB3aWxsIGRlcGVuZCBvbiB0aGUgZmluYWwgc3RhdGUgb2YgdGhlIHZhcmlhYmxlLiAgRm9yIGEgc2ltcGxlCmRubCBleGFtcGxlIG9mIHdoeSB0aGlzIGlzIG5lZWRlZCwgc2VlIEdMSUJDWFhfRU5BQkxFX0hPU1RFRC4KZG5sCm00X2RlZmluZShbX200X2RpdmVydChnbGliY3h4X2RpdmVyc2lvbildLCA4MDAwKWRubApBQ19ERUZVTihbR0xJQkNYWF9DT05ESVRJT05BTF0sIFtkbmwKICBtNF9kaXZlcnRfdGV4dChbZ2xpYmN4eF9kaXZlcnNpb25dLGRubAogICBBTV9DT05ESVRJT05BTChbJDFdLFskMl0pCiAgKWRubApdKWRubApBQ19ERUZVTihbR0xJQkNYWF9FVkFMVUFURV9DT05ESVRJT05BTFNdLCBbbTRfdW5kaXZlcnQoW2dsaWJjeHhfZGl2ZXJzaW9uXSldKWRubAoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIHdoYXQgYXJjaGl0ZWN0dXJlIGFuZCBvcGVyYXRpbmcgc3lzdGVtIHdlIGFyZSBjb21waWxpbmcKZG5sIGZvci4gIEFsc28sIGlmIGFyY2hpdGVjdHVyZS0gb3IgT1Mtc3BlY2lmaWMgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvcgpkbmwgY29tcGlsYXRpb24sIHBpY2sgdGhlbSB1cCBoZXJlLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfSE9TVF0sIFsKICAuICRnbGliY3h4X3NyY2Rpci9jb25maWd1cmUuaG9zdAogIEFDX01TR19OT1RJQ0UoW0NQVSBjb25maWcgZGlyZWN0b3J5IGlzICRjcHVfaW5jbHVkZV9kaXJdKQogIEFDX01TR19OT1RJQ0UoW09TIGNvbmZpZyBkaXJlY3RvcnkgaXMgJG9zX2luY2x1ZGVfZGlyXSkKXSkKCgpkbmwKZG5sIEluaXRpYWxpemUgYmFzaWMgY29uZmlndXJlIGJpdHMuCmRubApkbmwgU3Vic3RzOgpkbmwgIG11bHRpX2Jhc2VkaXIKZG5sCkFDX0RFRlVOKFtHTElCQ1hYX1RPUFJFTF9DT05GSUdVUkVdLCBbCiAgIyBTZXRzIHVwIG11bHRpX2Jhc2VkaXIsIHdoaWNoIGlzIHNyY2Rpci8uLiBwbHVzIHRoZSB1c3VhbAogICMgIm11bHRpX3NvdXJjZV90b3ByZWxfYm90dG9tX2FkanVzdCIgbHVuYWN5IGFzIG5lZWRlZC4KICBBTV9FTkFCTEVfTVVMVElMSUIoLCAuLikKCiAgIyBUaGUgZ2VuZXJhdGVkIGNvZGUgaXMgZXhhY3RseSB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgYXV0b21ha2UncyBsb29rcyBpbgogICMgIi4uICRzcmNkaXIvLi4iIGFuZCBhdXRvY29uZidzIGxvb2tzIGluIG11bHRpX2Jhc2VkaXIuICBBcHBhcmVudGx5IG90aGVyCiAgIyB0aGluZ3MgYXJlIHRyaWdnZXJlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIHR3byAuLi5BVVhfRElSW1NdLCBidXQgSSBkb24ndAogICMga25vdyB3aGF0IHRoZXkgYXJlIG9yIHdoYXQgdGhlIG90aGVyIGRpZmZlcmVuY2VzIG1pZ2h0IGJlIChhbmQgdGhleSBrZWVwCiAgIyBjaGFuZ2luZyBhbnlob3cpLgogICMKICAjIExvb2tpbmcgaW4gbXVsdGlfYmFzZWRpciBzZWVtcyBzbWFydGVyLCBzbyBhY3R1YWxseSBleGVjdXRlIHRoYXQgYnJhbmNoLgogIGlmIGZhbHNlOyB0aGVuCiAgICAjIHRoaXMgaXMgZm9yIGF1dG9tYWtlCiAgICBBQ19DT05GSUdfQVVYX0RJUiguLikKICBlbHNlCiAgICAjIHRoaXMgaXMgZm9yIGF1dG9jb25mCiAgICBBQ19DT05GSUdfQVVYX0RJUlMoJHttdWx0aV9iYXNlZGlyfSkKICBmaQoKICBkbmwgWFhYIFR1cm4gdGhpcyBvbi4KICBkbmwgQUNfTEFOR19DUExVU1BMVVMKXSkKCgpkbmwKZG5sIEluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIGxpYnJhcnkgY29uZmlndXJ5LiAgQXQgdGhpcyBwb2ludCB3ZSBoYXZlCmRubCB2YXJpYWJsZXMgbGlrZSAkaG9zdC4KZG5sCmRubCBTZXRzOgpkbmwgIGdjY192ZXJzaW9uICAgICAgICAgICh4LnkueiBmb3JtYXQpCmRubCAgU1VCRElSUwpkbmwgU3Vic3RzOgpkbmwgIGdsaWJjeHhfYnVpbGRkaXIgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIGdsaWJjeHhfc3JjZGlyICAgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIHRvcGxldmVsX3NyY2RpciAgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIHdpdGhfY3Jvc3NfaG9zdApkbmwgIHdpdGhfbmV3bGliCmRubCAgd2l0aF90YXJnZXRfc3ViZGlyCmRubCBwbHVzCmRubCAgLSB0aGUgdmFyaWFibGVzIGluIEdMSUJDWFhfQ0hFQ0tfSE9TVCAvIGNvbmZpZ3VyZS5ob3N0CmRubCAgLSBkZWZhdWx0IHNldHRpbmdzIGZvciBhbGwgQU1fQ09ORklUSU9OQUwgdGVzdCB2YXJpYWJsZXMKZG5sICAtIGxvdHMgb2YgdG9vbHMsIGxpa2UgQ0MgYW5kIENYWApkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ09ORklHVVJFXSwgWwogICMgS2VlcCB0aGVzZSBzeW5jJ2Qgd2l0aCB0aGUgbGlzdCBpbiBNYWtlZmlsZS5hbS4gIFRoZSBmaXJzdCBwcm92aWRlcyBhbgogICMgZXhwYW5kYWJsZSBsaXN0IGF0IGF1dG9jb25mIHRpbWU7IHRoZSBzZWNvbmQgcHJvdmlkZXMgYW4gZXhwYW5kYWJsZSBsaXN0CiAgIyAoaS5lLiwgc2hlbGwgdmFyaWFibGUpIGF0IGNvbmZpZ3VyZSB0aW1lLgogIG00X2RlZmluZShbZ2xpYmN4eF9TVUJESVJTXSxbaW5jbHVkZSBsaWJtYXRoIGxpYnN1cGMrKyBzcmMgcG8gdGVzdHN1aXRlXSkKICBTVUJESVJTPSdnbGliY3h4X1NVQkRJUlMnCgogICMgVGhlc2UgbmVlZCB0byBiZSBhYnNvbHV0ZSBwYXRocywgeWV0IGF0IHRoZSBzYW1lIHRpbWUgbmVlZCB0bwogICMgY2Fub25pY2FsaXplIG9ubHkgcmVsYXRpdmUgcGF0aHMsIGJlY2F1c2UgdGhlbiBhbWQgd2lsbCBub3QgdW5tb3VudAogICMgZHJpdmVzLiBUaHVzIHRoZSB1c2Ugb2YgUFdEQ01EOiBzZXQgaXQgdG8gJ3Bhd2QnIG9yICdhbXEgLXcnIGlmIHVzaW5nIGFtZC4KICBnbGliY3h4X2J1aWxkZGlyPWAke1BXRENNRC1wd2R9YAogIGNhc2UgJHNyY2RpciBpbgogICAgW1xcLyRdKiB8ID86W1xcL10qKSBnbGliY3h4X3NyY2Rpcj0ke3NyY2Rpcn0gOzsKICAgICopIGdsaWJjeHhfc3JjZGlyPWBjZCAiJHNyY2RpciIgJiYgJHtQV0RDTUQtcHdkfSB8fCBlY2hvICIkc3JjZGlyImAgOzsKICBlc2FjCiAgdG9wbGV2ZWxfc3JjZGlyPSR7Z2xpYmN4eF9zcmNkaXJ9Ly4uCiAgQUNfU1VCU1QoZ2xpYmN4eF9idWlsZGRpcikKICBBQ19TVUJTVChnbGliY3h4X3NyY2RpcikKICBBQ19TVUJTVCh0b3BsZXZlbF9zcmNkaXIpCgogICMgV2UgdXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZ1bmN0aW9ucyB0byBpbmNsdWRlLiAgVGhleSBhcmUKICAjIHNldCBmcm9tIHRoZSB0b3AgbGV2ZWwuCiAgQUNfQVJHX1dJVEgoW3RhcmdldC1zdWJkaXJdLAogICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC10YXJnZXQtc3ViZGlyPVNVQkRJUl0sCiAgICAgICAgICAgICAgICAgICBbY29uZmlndXJpbmcgaW4gYSBzdWJkaXJlY3RvcnldKSkKCiAgQUNfQVJHX1dJVEgoW2Nyb3NzLWhvc3RdLAogICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1jcm9zcy1ob3N0PUhPU1RdLAogICAgICAgICAgICAgICAgICAgW2NvbmZpZ3VyaW5nIHdpdGggYSBjcm9zcyBjb21waWxlcl0pKQoKICBBQ19BUkdfV0lUSChbbmV3bGliXSwKICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtbmV3bGliXSwKICAgICAgICAgICAgICAgICAgIFthc3N1bWUgbmV3bGliIGFzIGEgc3lzdGVtIEMgbGlicmFyeV0pKQoKICAjIFdlJ3JlIGFsbW9zdCBjZXJ0YWlubHkgYmVpbmcgY29uZmlndXJlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSB3aGljaCB1c2VzCiAgIyBDKyssIHNvIGFsbCBvZiBvdXIgQUNfUFJPR18qIGRpc2NvdmVyaWVzIHdpbGwgYmUgY2FjaGVkLiAgSXQncyB2aXRhbCB0aGF0CiAgIyB3ZSBub3QgY2FjaGUgdGhlIHZhbHVlIG9mIENYWCB0aGF0IHdlICJkaXNjb3ZlciIgaGVyZSwgYmVjYXVzZSBpdCdzIHNldAogICMgdG8gc29tZXRoaW5nIHVuaXF1ZSBmb3IgdXMgYW5kIGxpYmphdmEuICBPdGhlciB0YXJnZXQgbGlicmFyaWVzIG5lZWQgdG8KICAjIGZpbmQgQ1hYIGZvciB0aGVtc2VsdmVzLiAgV2UgeWFuayB0aGUgcnVnIG91dCBmcm9tIHVuZGVyIHRoZSBub3JtYWwgQUNfKgogICMgcHJvY2VzcyBieSBzbmVha2lseSByZW5hbWluZyB0aGUgY2FjaGUgdmFyaWFibGUuICBUaGlzIGFsc28gbGV0cyB1cyBkZWJ1ZwogICMgdGhlIHZhbHVlIG9mICJvdXIiIENYWCBpbiBwb3N0bW9ydGVtcy4KICAjCiAgIyBXZSBtdXN0IGFsc28gZm9yY2UgQ1hYIHRvIC9ub3QvIGJlIGEgcHJlY2lvdXMgdmFyaWFibGUsIG90aGVyd2lzZSB0aGUKICAjIHdyb25nIChub24tbXVsdGlsaWItYWRqdXN0ZWQpIHZhbHVlIHdpbGwgYmUgdXNlZCBpbiBtdWx0aWxpYnMuICBUaGlzCiAgIyBsaXR0bGUgdHJpY2sgYWxzbyBhZmZlY3RzIENQUEZMQUdTLCBDWFhGTEFHUywgYW5kIExERkxBR1MuICBBbmQgYXMgYSBzaWRlCiAgIyBlZmZlY3QsIENYWEZMQUdTIGlzIG5vIGxvbmdlciBhdXRvbWFnaWNhbGx5IHN1YnN0J2QsIHNvIHdlIGhhdmUgdG8gZG8KICAjIHRoYXQgb3Vyc2VsdmVzLiAgVW4tcHJlY2lvdXNpbmcgQUNfUFJPR19DQyBhbHNvIGFmZmVjdHMgQ0MgYW5kIENGTEFHUy4KICAjCiAgIyAtZm5vLWJ1aWx0aW4gbXVzdCBiZSBwcmVzZW50IGhlcmUgc28gdGhhdCBhIG5vbi1jb25mbGljdGluZyBmb3JtIG9mCiAgIyBzdGQ6OmV4aXQgY2FuIGJlIGd1ZXNzZWQgYnkgQUNfUFJPR19DWFgsIGFuZCB1c2VkIGluIGxhdGVyIHRlc3RzLgoKICBtNF9kZWZpbmUoW2FjX2N2X3Byb2dfQ1hYXSxbZ2xpYmN4eF9jdl9wcm9nX0NYWF0pCiAgbTRfcmVuYW1lKFtfQUNfQVJHX1ZBUl9QUkVDSU9VU10sW2dsaWJjeHhfUFJFQ0lPVVNdKQogIG00X2RlZmluZShbX0FDX0FSR19WQVJfUFJFQ0lPVVNdLFtdKQogIHNhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICBDWFhGTEFHUz0iJENYWEZMQUdTIC1mbm8tYnVpbHRpbiIKICBBQ19QUk9HX0NDCiAgQUNfUFJPR19DWFgKICBDWFhGTEFHUz0iJHNhdmVfQ1hYRkxBR1MiCiAgbTRfcmVuYW1lKFtnbGliY3h4X1BSRUNJT1VTXSxbX0FDX0FSR19WQVJfUFJFQ0lPVVNdKQogIEFDX1NVQlNUKENGTEFHUykKICBBQ19TVUJTVChDWFhGTEFHUykKCiAgIyBGb3IgZGlyZWN0b3J5IHZlcnNpb25pbmcgKGUuZy4sIGhlYWRlcnMpIGFuZCBvdGhlciB2YXJpYWJsZXMuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR0NDIHZlcnNpb24gbnVtYmVyXSkKICBnY2NfdmVyc2lvbj1gJENYWCAtZHVtcHZlcnNpb25gCiAgQUNfTVNHX1JFU1VMVCgkZ2NjX3ZlcnNpb24pCgogICMgV2lsbCBzZXQgTE5fUyB0byBlaXRoZXIgJ2xuIC1zJywgJ2xuJywgb3IgJ2NwIC1wJyAoaWYgbGlua2luZyBpc24ndAogICMgYXZhaWxhYmxlKS4gIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGZvcmNlIGEgcGFydGljdWxhciBtZXRob2QuCiAgQUNfUFJPR19MTl9TCiAgI0xOX1M9J2NwIC1wJwoKICBBQ19DSEVDS19UT09MKEFTLCBhcykKICBBQ19DSEVDS19UT09MKEFSLCBhcikKICBBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCByYW5saWItbm90LWZvdW5kLWluLXBhdGgtZXJyb3IpCgogIEFNX01BSU5UQUlORVJfTU9ERQoKICAjIFNldCB1cCBzYWZlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgc3Vic2VxdWVudCBBTV9DT05ESVRJT05BTCB0ZXN0cwogICMgd2hpY2ggYXJlIHRoZW1zZWx2ZXMgY29uZGl0aW9uYWxseSBleHBhbmRlZC4KICAjIyAoUmlnaHQgbm93LCB0aGlzIG9ubHkgbWF0dGVycyBmb3IgZW5hYmxlX3djaGFyX3QsIGJ1dCBub3RoaW5nIHByZXZlbnRzCiAgIyMgb3RoZXIgbWFjcm9zIGZyb20gZG9pbmcgdGhlIHNhbWUuICBUaGlzIHNob3VsZCBiZSBhdXRvbWF0ZWQuKSAgLXBtZQogIG5lZWRfbGlibWF0aD1ubwogIGVuYWJsZV93Y2hhcl90PW5vCiAgI2VuYWJsZV9saWJzdGRjeHhfZGVidWc9bm8KICAjZW5hYmxlX2xpYnN0ZGN4eF9wY2g9bm8KICAjZW5hYmxlX2NoZWFkZXJzPWMKICAjY19jb21wYXRpYmlsaXR5PW5vCiAgI2VuYWJsZV9hYmlfY2hlY2s9bm8KICAjZW5hYmxlX3N5bXZlcnM9bm8KICAjZW5hYmxlX2hvc3RlZF9saWJzdGRjeHg9eWVzCgogICMgRmluZCBwbGF0Zm9ybS1zcGVjaWZpYyBkaXJlY3RvcmllcyBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gaW5mby4KICAjIEFsc28gcG9zc2libHkgbW9kaWZ5IGZsYWdzIHVzZWQgZWxzZXdoZXJlLCBhcyBuZWVkZWQgYnkgdGhlIHBsYXRmb3JtLgogIEdMSUJDWFhfQ0hFQ0tfSE9TVApdKQoKCm00X2luY2x1ZGUoW2xpbmthZ2UubTRdKQptNF9pbmNsdWRlKFsuLi9jb25maWcvbm8tZXhlY3V0YWJsZXMubTRdKQoKCmRubApkbmwgVGVzdHMgZm9yIG5ld2VyIGNvbXBpbGVyIGZlYXR1cmVzLCBvciBmZWF0dXJlcyB0aGF0IGFyZSBwcmVzZW50IGluIG5ld2VyCmRubCBjb21waWxlciB2ZXJzaW9ucyBidXQgbm90IG9sZGVyIGNvbXBpbGVyIHZlcnNpb25zIHN0aWxsIGluIHVzZSwgc2hvdWxkCmRubCBiZSBwbGFjZWQgaGVyZS4KZG5sCmRubCBEZWZpbmVzOgpkbmwgIFdFUlJPUj0nLVdlcnJvcicgaWYgcmVxdWVzdGVkIGFuZCBwb3NzaWJsZTsgZysrJ3MgdGhhdCBsYWNrIHRoZQpkbmwgICBuZXcgaW5saW5pbmcgY29kZSBvciB0aGUgbmV3IHN5c3RlbV9oZWFkZXIgcHJhZ21hIHdpbGwgZGllIG9uIC1XZXJyb3IuCmRubCAgIExlYXZlIGl0IG91dCBieSBkZWZhdWx0IGFuZCB1c2UgbWFpbnQtbW9kZSB0byB1c2UgaXQuCmRubCAgU0VDVElPTl9GTEFHUz0nLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMnIGlmCmRubCAgIGNvbXBpbGVyIHN1cHBvcnRzIGl0IGFuZCB0aGUgdXNlciBoYXMgbm90IHJlcXVlc3RlZCBkZWJ1ZyBtb2RlLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfQ09NUElMRVJfRkVBVFVSRVNdLCBbCiAgIyBBbGwgdGhlc2UgdGVzdHMgYXJlIGZvciBDKys7IHNhdmUgdGhlIGxhbmd1YWdlIGFuZCB0aGUgY29tcGlsZXIgZmxhZ3MuCiAgIyBUaGUgQ1hYRkxBR1MgdGhpbmcgaXMgc3VzcGljaW91cywgYnV0IGJhc2VkIG9uIHNpbWlsYXIgYml0cyBwcmV2aW91c2x5CiAgIyBmb3VuZCBpbiBHTElCQ1hYX0NPTkZJR1VSRS4KICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwogIGFjX3Rlc3RfQ1hYRkxBR1M9IiR7Q1hYRkxBR1Mrc2V0fSIKICBhY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCgogICMgQ2hlY2sgZm9yIG1haW50YWluZXItbW9kZSBiaXRzLgogIGlmIHRlc3QgeCIkVVNFX01BSU5UQUlORVJfTU9ERSIgPSB4bm87IHRoZW4KICAgIFdFUlJPUj0nJwogIGVsc2UKICAgIFdFUlJPUj0nLVdlcnJvcicKICBmaQoKICAjIENoZWNrIGZvciAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucwogIEFDX01TR19DSEVDS0lORyhbZm9yIGcrKyB0aGF0IHN1cHBvcnRzIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zXSkKICBDWFhGTEFHUz0nLVdlcnJvciAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucycKICBBQ19UUllfQ09NUElMRSgsIFtpbnQgZm9vO10sIFthY19mZHNlY3Rpb25zPXllc10sIFthY19mZHNlY3Rpb25zPW5vXSkKICBpZiB0ZXN0ICIkYWNfdGVzdF9DWFhGTEFHUyIgPSBzZXQ7IHRoZW4KICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyIKICBlbHNlCiAgICAjIHRoaXMgaXMgdGhlIHN1c3BpY2lvdXMgcGFydAogICAgQ1hYRkxBR1M9JycKICBmaQogIGlmIHRlc3QgeCIkYWNfZmRzZWN0aW9ucyIgPSB4InllcyI7IHRoZW4KICAgIFNFQ1RJT05fRkxBR1M9Jy1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zJwogIGZpCiAgQUNfTVNHX1JFU1VMVCgkYWNfZmRzZWN0aW9ucykKCiAgQUNfTEFOR19SRVNUT1JFCiAgQUNfU1VCU1QoV0VSUk9SKQogIEFDX1NVQlNUKFNFQ1RJT05fRkxBR1MpCl0pCgoKZG5sCmRubCBJZiBHTlUgbGQgaXMgaW4gdXNlLCBjaGVjayB0byBzZWUgaWYgdHJpY2t5IGxpbmtlciBvcHRzIGNhbiBiZSB1c2VkLiAgSWYKZG5sIHRoZSBuYXRpdmUgbGlua2VyIGlzIGluIHVzZSwgYWxsIHZhcmlhYmxlcyB3aWxsIGJlIGRlZmluZWQgdG8gc29tZXRoaW5nCmRubCBzYWZlIChsaWtlIGFuIGVtcHR5IHN0cmluZykuCmRubApkbmwgRGVmaW5lczoKZG5sICBTRUNUSU9OX0xERkxBR1M9Jy1XbCwtLWdjLXNlY3Rpb25zJyBpZiBwb3NzaWJsZQpkbmwgIE9QVF9MREZMQUdTPSctV2wsLU8xJyBpZiBwb3NzaWJsZQpkbmwgIExEIChhcyBhIHNpZGUgZWZmZWN0IG9mIHRlc3RpbmcpCmRubCBTZXRzOgpkbmwgIHdpdGhfZ251X2xkCmRubCAgZ2xpYmN4eF9nbnVfbGRfdmVyc2lvbiAocG9zc2libHkpCmRubApkbmwgVGhlIGxhc3Qgd2lsbCBiZSBhIHNpbmdsZSBpbnRlZ2VyLCBlLmcuLCB2ZXJzaW9uIDEuMjMuNDUuMC42Ny44OSB3aWxsCmRubCBzZXQgZ2xpYmN4eF9nbnVfbGRfdmVyc2lvbiB0byAxMjM0NS4gIFplcm9zIGNhdXNlIHByb2JsZW1zLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfTElOS0VSX0ZFQVRVUkVTXSwgWwogICMgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50IGluIGV2ZW4gdHJ5aW5nIHRoZXNlCiAgIyB0ZXN0cy4gIENoZWNrIGZvciB0aGF0IGZpcnN0LiAgV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSB0ZXN0ZWQgZm9yIGdsZAogICMgYnkgbm93IChpbiBsaWJ0b29sKSwgYnV0IHJlcXVpcmUgaXQgbm93IGp1c3QgdG8gYmUgc2FmZS4uLgogIHRlc3QgLXogIiRTRUNUSU9OX0xERkxBR1MiICYmIFNFQ1RJT05fTERGTEFHUz0nJwogIHRlc3QgLXogIiRPUFRfTERGTEFHUyIgJiYgT1BUX0xERkxBR1M9JycKICBBQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSkKICBBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pCgogICMgVGhlIG5hbWUgc2V0IGJ5IGxpYnRvb2wgZGVwZW5kcyBvbiB0aGUgdmVyc2lvbiBvZiBsaWJ0b29sLiAgU2hhbWUgb24gdXMKICAjIGZvciBkZXBlbmRpbmcgb24gYW4gaW1wbCBkZXRhaWwsIGJ1dCBjJ2VzdCBsYSB2aWUuICBPbGRlciB2ZXJzaW9ucyB1c2VkCiAgIyBhY19jdl9wcm9nX2dudV9sZCwgYnV0IG5vdyBpdCdzIGx0X2N2X3Byb2dfZ251X2xkLCBhbmQgaXMgY29waWVkIGJhY2sgb24KICAjIHRvcCBvZiB3aXRoX2dudV9sZCAod2hpY2ggaXMgYWxzbyBzZXQgYnkgLS13aXRoLWdudS1sZCwgc28gdGhhdCBhY3R1YWxseQogICMgbWFrZXMgc2Vuc2UpLiAgV2UnbGwgdGVzdCB3aXRoX2dudV9sZCBldmVyeXdoZXJlIGVsc2UsIHNvIGlmIHRoYXQgaXNuJ3QKICAjIHNldCAoaGVuY2Ugd2UncmUgdXNpbmcgYW4gb2xkZXIgbGlidG9vbCksIHRoZW4gc2V0IGl0LgogIGlmIHRlc3QgeCR7d2l0aF9nbnVfbGQrc2V0fSAhPSB4c2V0OyB0aGVuCiAgICBpZiB0ZXN0IHgke2FjX2N2X3Byb2dfZ251X2xkK3NldH0gIT0geHNldDsgdGhlbgogICAgICAjIFdlIGdvdCB0aHJvdWdoICJhY19yZXF1aXJlKGFjX3Byb2dfbGQpIiBhbmQgc3RpbGwgbm90IHNldD8gIEh1aD8KICAgICAgd2l0aF9nbnVfbGQ9bm8KICAgIGVsc2UKICAgICAgd2l0aF9nbnVfbGQ9JGFjX2N2X3Byb2dfZ251X2xkCiAgICBmaQogIGZpCgogICMgU3RhcnQgYnkgZ2V0dGluZyB0aGUgdmVyc2lvbiBudW1iZXIuICBJIHRoaW5rIHRoZSBsaWJ0b29sIHRlc3QgYWxyZWFkeQogICMgZG9lcyBzb21lIG9mIHRoaXMsIGJ1dCB0aHJvd3MgYXdheSB0aGUgcmVzdWx0LgogIGNoYW5nZXF1b3RlKCwpCiAgbGR2ZXI9YCRMRCAtLXZlcnNpb24gMj4vZGV2L251bGwgfCBoZWFkIC0xIHwgXAogICAgICAgICBzZWQgLWUgJ3MvR05VIGxkIHZlcnNpb24gXChbMC05Ll1bMC05Ll0qXCkuKi9cMS8nYAogIGNoYW5nZXF1b3RlKFssXSkKICBnbGliY3h4X2dudV9sZF92ZXJzaW9uPWBlY2hvICRsZHZlciB8IFwKICAgICAgICAgJEFXSyAtRi4gJ3sgaWYgKE5GPDMpIFskXTM9MDsgcHJpbnQgKFskXTEqMTAwK1skXTIpKjEwMCtbJF0zIH0nYAoKICAjIFNldCAtLWdjLXNlY3Rpb25zLgogIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSAibm90YnJva2VuIjsgdGhlbgogICAgIyBHTlUgbGQgaXQgaXMhICBKb3kgYW5kIGJ1bm55IHJhYmJpdHMhCgogICAgIyBBbGwgdGhlc2UgdGVzdHMgYXJlIGZvciBDKys7IHNhdmUgdGhlIGxhbmd1YWdlIGFuZCB0aGUgY29tcGlsZXIgZmxhZ3MuCiAgICAjIE5lZWQgdG8gZG8gdGhpcyBzbyB0aGF0IGcrKyB3b24ndCB0cnkgdG8gbGluayBpbiBsaWJzdGRjKysKICAgIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgogICAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCiAgICBDRkxBR1M9Jy14IGMrKyAgLVdsLC0tZ2Mtc2VjdGlvbnMnCgogICAgIyBDaGVjayBmb3IgLVdsLC0tZ2Mtc2VjdGlvbnMKICAgICMgWFhYIFRoaXMgdGVzdCBpcyBicm9rZW4gYXQgdGhlIG1vbWVudCwgYXMgc3ltYm9scyByZXF1aXJlZCBmb3IgbGlua2luZwogICAgIyBhcmUgbm93IGluIGxpYnN1cGMrKyAobm90IGJ1aWx0IHlldCkuICBJbiBhZGRpdGlvbiwgdGhpcyB0ZXN0IGhhcwogICAgIyBjb3JlZCBvbiBzb2xhcmlzIGluIHRoZSBwYXN0LiAgSW4gYWRkaXRpb24sIC0tZ2Mtc2VjdGlvbnMgZG9lc24ndAogICAgIyByZWFsbHkgd29yayBhdCB0aGUgbW9tZW50IChrZWVwcyBvbiBkaXNjYXJkaW5nIHVzZWQgc2VjdGlvbnMsIGZpcnN0CiAgICAjIC5laF9mcmFtZSBhbmQgbm93IHNvbWUgb2YgdGhlIGdsaWJjIHNlY3Rpb25zIGZvciBpY29udikuCiAgICAjIEJ6enp6dC4gIFRoYW5rcyBmb3IgcGxheWluZywgbWF5YmUgbmV4dCB0aW1lLgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdGhhdCBzdXBwb3J0cyAtV2wsLS1nYy1zZWN0aW9uc10pCiAgICBBQ19UUllfUlVOKFsKICAgICBpbnQgbWFpbih2b2lkKQogICAgIHsKICAgICAgIHRyeSB7IHRocm93IDE7IH0KICAgICAgIGNhdGNoICguLi4pIHsgfTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgIF0sIFthY19zZWN0aW9uTERmbGFncz15ZXNdLFthY19zZWN0aW9uTERmbGFncz1ub10sIFthY19zZWN0aW9uTERmbGFncz15ZXNdKQogICAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgogICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKICAgIGVsc2UKICAgICAgIyB0aGlzIGlzIHRoZSBzdXNwaWNpb3VzIHBhcnQKICAgICAgQ0ZMQUdTPScnCiAgICBmaQogICAgaWYgdGVzdCAiJGFjX3NlY3Rpb25MRGZsYWdzIiA9ICJ5ZXMiOyB0aGVuCiAgICAgIFNFQ1RJT05fTERGTEFHUz0iLVdsLC0tZ2Mtc2VjdGlvbnMgJFNFQ1RJT05fTERGTEFHUyIKICAgIGZpCiAgICBBQ19NU0dfUkVTVUxUKCRhY19zZWN0aW9uTERmbGFncykKICBmaQoKICAjIFNldCBsaW5rZXIgb3B0aW1pemF0aW9uIGZsYWdzLgogIGlmIHRlc3QgeCIkd2l0aF9nbnVfbGQiID0geCJ5ZXMiOyB0aGVuCiAgICBPUFRfTERGTEFHUz0iLVdsLC1PMSAkT1BUX0xERkxBR1MiCiAgZmkKCiAgQUNfU1VCU1QoU0VDVElPTl9MREZMQUdTKQogIEFDX1NVQlNUKE9QVF9MREZMQUdTKQpdKQoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIGlmIHRoaXMgdGFyZ2V0IGNhbiBlbmFibGUgdGhlIHdjaGFyX3QgcGFydHMuCmRubCBJZiAtLWRpc2FibGUtYy1tYmNoYXIgd2FzIGdpdmVuLCBubyB3Y2hhcl90IHN0dWZmIGlzIGVuYWJsZWQuICAoVGhpcwpkbmwgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBjaGVja2VkLikgIEJ5IGRlZmF1bHQsIHdpZGUgY2hhcmFjdGVycyBhcmUKZG5sIGRpc2FibGVkLgpkbmwKZG5sIERlZmluZXM6CmRubCAgSEFWRV9NQlNUQVRFX1QgaWYgbWJzdGF0ZV90IGlzIG5vdCBpbiB3Y2hhci5oCmRubCAgX0dMSUJDWFhfVVNFX1dDSEFSX1QgaWYgYWxsIHRoZSBiaXRzIGFyZSBmb3VuZC4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX1dDSEFSX1RfU1VQUE9SVF0sIFsKICAjIFRlc3Qgd2NoYXIuaCBmb3IgbWJzdGF0ZV90LCB3aGljaCBpcyBuZWVkZWQgZm9yIGNoYXJfdHJhaXRzIGFuZAogICMgb3RoZXJzIGV2ZW4gaWYgd2NoYXJfdCBzdXBwb3J0IGlzIG5vdCBvbi4KICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBtYnN0YXRlX3RdKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8d2NoYXIuaD5dLAogIFttYnN0YXRlX3QgdGVzdHN0YXRlO10sCiAgaGF2ZV9tYnN0YXRlX3Q9eWVzLCBoYXZlX21ic3RhdGVfdD1ubykKICBBQ19NU0dfUkVTVUxUKCRoYXZlX21ic3RhdGVfdCkKICBpZiB0ZXN0IHgiJGhhdmVfbWJzdGF0ZV90IiA9IHh5ZXM7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX01CU1RBVEVfVCkKICBmaQoKICAjIFNhbml0eSBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIElTTyBDOTkgaGVhZGVycyBmb3IgZXh0ZW5kZWQgZW5jb2RpbmcuCiAgQUNfQ0hFQ0tfSEVBREVSUyh3Y2hhci5oLCBhY19oYXNfd2NoYXJfaD15ZXMsIGFjX2hhc193Y2hhcl9oPW5vKQogIEFDX0NIRUNLX0hFQURFUlMod2N0eXBlLmgsIGFjX2hhc193Y3R5cGVfaD15ZXMsIGFjX2hhc193Y3R5cGVfaD1ubykKCiAgIyBPbmx5IGNvbnRpbnVlIGNoZWNraW5nIGlmIHRoZSBJU08gQzk5IGhlYWRlcnMgZXhpc3QgYW5kIHN1cHBvcnQgaXMgb24uCiAgaWYgdGVzdCB4IiRhY19oYXNfd2NoYXJfaCIgPSB4eWVzICYmCiAgICAgdGVzdCB4IiRhY19oYXNfd2N0eXBlX2giID0geHllcyAmJgogICAgIHRlc3QgeCIkZW5hYmxlX2NfbWJjaGFyIiAhPSB4bm87IHRoZW4KCiAgICAjIFRlc3Qgd2NoYXIuaCBmb3IgV0NIQVJfTUlOLCBXQ0hBUl9NQVgsIHdoaWNoIGlzIG5lZWRlZCBiZWZvcmUKICAgICMgbnVtZXJpY19saW1pdHMgY2FuIGluc3RhbnRpYXRlIHR5cGVfdHJhaXRzPHdjaGFyX3Q+CiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBXQ0hBUl9NSU4gYW5kIFdDSEFSX01BWF0pCiAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+XSwKICAgIFtpbnQgaSA9IFdDSEFSX01JTjsgaW50IGogPSBXQ0hBUl9NQVg7XSwKICAgIGhhc193Y2hhcl9taW5tYXg9eWVzLCBoYXNfd2NoYXJfbWlubWF4PW5vKQogICAgQUNfTVNHX1JFU1VMVCgkaGFzX3djaGFyX21pbm1heCkKCiAgICAjIFRlc3Qgd2NoYXIuaCBmb3IgV0VPRiwgd2hpY2ggaXMgd2hhdCB3ZSB1c2UgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKICAgICMgdG8gc3BlY2lhbGl6ZSBmb3IgY2hhcl90cmFpdHM8d2NoYXJfdD4gb3Igbm90LgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgV0VPRl0pCiAgICBBQ19UUllfQ09NUElMRShbCiAgICAgICNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAjaW5jbHVkZSA8c3RkZGVmLmg+XSwKICAgIFt3aW50X3QgaSA9IFdFT0Y7XSwKICAgIGhhc193ZW9mPXllcywgaGFzX3dlb2Y9bm8pCiAgICBBQ19NU0dfUkVTVUxUKCRoYXNfd2VvZikKCiAgICAjIFRlc3RzIGZvciB3aWRlIGNoYXJhY3RlciBmdW5jdGlvbnMgdXNlZCBpbiBjaGFyX3RyYWl0czx3Y2hhcl90Pi4KICAgIGFjX3dmdW5jcz15ZXMKICAgIEFDX0NIRUNLX0ZVTkNTKFt3Y3NsZW4gd21lbWNociB3bWVtY21wIHdtZW1jcHkgd21lbW1vdmUgd21lbXNldF0sCiAgICBbXSxbYWNfd2Z1bmNzPW5vXSkKCiAgICAjIENoZWNrcyBmb3IgbmFtZXMgaW5qZWN0ZWQgaW50byBzdGQ6OiBieSB0aGUgY19zdGQgaGVhZGVycy4KICAgIEFDX0NIRUNLX0ZVTkNTKFtidG93YyB3Y3RvYiBmZ2V0d2MgZmdldHdzIGZwdXR3YyBmcHV0d3MgZndpZGUgXAogICAgZndwcmludGYgZndzY2FuZiBzd3ByaW50ZiBzd3NjYW5mIHZmd3ByaW50ZiB2c3dwcmludGYgXAogICAgdndwcmludGYgd3ByaW50ZiB3c2NhbmYgZ2V0d2MgZ2V0d2NoYXIgbWJzaW5pdCBtYnJsZW4gbWJydG93YyBcCiAgICBtYnNydG93Y3Mgd2NzcnRvbWJzIHB1dHdjIHB1dHdjaGFyIHVuZ2V0d2Mgd2NydG9tYiB3Y3N0b2Qgd2NzdG9sIFwKICAgIHdjc3RvdWwgd2NzY3B5IHdjc25jcHkgd2NzY2F0IHdjc25jYXQgd2NzY21wIHdjc2NvbGwgd2NzbmNtcCB3Y3N4ZnJtIFwKICAgIHdjc2NzcG4gd2Nzc3BuIHdjc3RvayB3Y3NmdGltZSB3Y3NjaHIgd2NzcGJyayB3Y3NyY2hyIHdjc3N0cl0sCiAgICBbXSxbYWNfd2Z1bmNzPW5vXSkKCiAgICAjIENoZWNrcyBmb3Igd2lkZSBjaGFyYWN0ZXIgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCByZXF1aXJlZAogICAgIyBmb3IgYmFzaWMgd2NoYXJfdCBzdXBwb3J0LiAgRG9uJ3QgZGlzYWJsZSBzdXBwb3J0IGlmIHRoZXkgYXJlIG1pc3NpbmcuCiAgICAjIEluamVjdGlvbiBvZiB0aGVzZSBpcyB3cmFwcGVkIHdpdGggZ3VhcmQgbWFjcm9zLgogICAgQUNfQ0hFQ0tfRlVOQ1MoW3Zmd3NjYW5mIHZzd3NjYW5mIHZ3c2NhbmYgd2NzdG9mIGlzd2JsYW5rXSxbXSxbXSkKCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHdjaGFyX3Qgc3VwcG9ydF0pCiAgICBpZiB0ZXN0IHgiJGhhc193ZW9mIiA9IHh5ZXMgJiYKICAgICAgIHRlc3QgeCIkaGFzX3djaGFyX21pbm1heCIgPSB4eWVzICYmCiAgICAgICB0ZXN0IHgiJGFjX3dmdW5jcyIgPSB4eWVzOwogICAgdGhlbgogICAgICBhY19pc29DOTlfd2NoYXJfdD15ZXMKICAgIGVsc2UKICAgICAgYWNfaXNvQzk5X3djaGFyX3Q9bm8KICAgIGZpCiAgICBBQ19NU0dfUkVTVUxUKCRhY19pc29DOTlfd2NoYXJfdCkKCiAgICAjIFVzZSBpY29udiBmb3Igd2NoYXJfdCB0byBjaGFyIGNvbnZlcnNpb25zLiBBcyBzdWNoLCBjaGVjayBmb3IKICAgICMgWC9PcGVuIFBvcnRhYmlsaXR5IEd1aWRlLCB2ZXJzaW9uIDIgZmVhdHVyZXMgKFhQRzIpLgogICAgQUNfQ0hFQ0tfSEVBREVSKGljb252LmgsIGFjX2hhc19pY29udl9oPXllcywgYWNfaGFzX2ljb252X2g9bm8pCiAgICBBQ19DSEVDS19IRUFERVIobGFuZ2luZm8uaCwgYWNfaGFzX2xhbmdpbmZvX2g9eWVzLCBhY19oYXNfbGFuZ2luZm9faD1ubykKCiAgICAjIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgbGliaWNvbnYuYSBwcm92aWRpbmcgWFBHMiB3Y2hhcl90IHN1cHBvcnQuCiAgICBBQ19DSEVDS19MSUIoaWNvbnYsIGljb252LCBsaWJpY29udj0iLWxpY29udiIpCiAgICBhY19zYXZlX0xJQlM9IiRMSUJTIgogICAgTElCUz0iJExJQlMgJGxpYmljb252IgoKICAgIEFDX0NIRUNLX0ZVTkNTKFtpY29udl9vcGVuIGljb252X2Nsb3NlIGljb252IG5sX2xhbmdpbmZvXSwKICAgIFthY19YUEcyZnVuY3M9eWVzXSwgW2FjX1hQRzJmdW5jcz1ub10pCgogICAgTElCUz0iJGFjX3NhdmVfTElCUyIKCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBYUEcyIHdjaGFyX3Qgc3VwcG9ydF0pCiAgICBpZiB0ZXN0IHgiJGFjX2hhc19pY29udl9oIiA9IHh5ZXMgJiYKICAgICAgIHRlc3QgeCIkYWNfaGFzX2xhbmdpbmZvX2giID0geHllcyAmJgogICAgICAgdGVzdCB4IiRhY19YUEcyZnVuY3MiID0geHllczsKICAgIHRoZW4KICAgICAgYWNfWFBHMl93Y2hhcl90PXllcwogICAgZWxzZQogICAgICBhY19YUEcyX3djaGFyX3Q9bm8KICAgIGZpCiAgICBBQ19NU0dfUkVTVUxUKCRhY19YUEcyX3djaGFyX3QpCgogICAgIyBBdCB0aGUgbW9tZW50LCBvbmx5IGVuYWJsZSB3Y2hhcl90IHNwZWNpYWxpemF0aW9ucyBpZiBhbGwgdGhlCiAgICAjIGFib3ZlIHN1cHBvcnQgaXMgcHJlc2VudC4KICAgIGlmIHRlc3QgeCIkYWNfaXNvQzk5X3djaGFyX3QiID0geHllcyAmJgogICAgICAgdGVzdCB4IiRhY19YUEcyX3djaGFyX3QiID0geHllczsKICAgIHRoZW4KICAgICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9XQ0hBUl9UKQogICAgICBlbmFibGVfd2NoYXJfdD15ZXMKICAgIGZpCiAgZmkKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlbmFibGVkIHdjaGFyX3Qgc3BlY2lhbGl6YXRpb25zXSkKICBBQ19NU0dfUkVTVUxUKCRlbmFibGVfd2NoYXJfdCkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBoZWFkZXJzIGZvciwgYW5kIGFyZ3VtZW50cyB0bywgdGhlIHNldHJsaW1pdCgpIGZ1bmN0aW9uLgpkbmwgVXNlZCBvbmx5IGluIHRlc3RzdWl0ZV9ob29rcy5oLiAgQ2FsbGVkIGZyb20gR0xJQkNYWF9DT05GSUdVUkVfVEVTVFNVSVRFLgpkbmwKZG5sIERlZmluZXM6CmRubCAgX0dMSUJDWFhfUkVTX0xJTUlUUyBpZiB3ZSBjYW4gc2V0IGFydGlmaWNpYWwgcmVzb3VyY2UgbGltaXRzIApkbmwgIHZhcmlvdXMgSEFWRV9MSU1JVF8qIGZvciBpbmRpdmlkdWFsIGxpbWl0IG5hbWVzCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19TRVRSTElNSVRfYW5jaWxsaWFyeV0sIFsKICBBQ19UUllfQ09NUElMRSgKICAgIFsjaW5jbHVkZSA8dW5pc3RkLmg+CiAgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAgICAgI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogICAgXSwKICAgIFsgaW50IGYgPSBSTElNSVRfJDEgOyBdLAogICAgW2dsaWJjeHhfbXJlc3VsdD0xXSwgW2dsaWJjeHhfbXJlc3VsdD0wXSkKICBBQ19ERUZJTkVfVU5RVU9URUQoSEFWRV9MSU1JVF8kMSwgJGdsaWJjeHhfbXJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgW09ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguXSkKXSkKCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF0sIFsKICBzZXRybGltaXRfaGF2ZV9oZWFkZXJzPXllcwogIEFDX0NIRUNLX0hFQURFUlModW5pc3RkLmggc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaCwKICAgICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgICAgW3NldHJsaW1pdF9oYXZlX2hlYWRlcnM9bm9dKQogICMgSWYgZG9uJ3QgaGF2ZSB0aGUgaGVhZGVycywgdGhlbiB3ZSBjYW4ndCBydW4gdGhlIHRlc3RzIG5vdywgYW5kIHdlCiAgIyB3b24ndCBiZSBzZWVpbmcgYW55IG9mIHRoZXNlIGR1cmluZyB0ZXN0c3VpdGUgY29tcGlsYXRpb24uCiAgaWYgdGVzdCAkc2V0cmxpbWl0X2hhdmVfaGVhZGVycyA9IHllczsgdGhlbgogICAgIyBDYW4ndCBkbyB0aGVzZSBpbiBhIGxvb3AsIGVsc2UgdGhlIHJlc3VsdGluZyBzeW50YXggaXMgd3JvbmcuCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KERBVEEpCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KFJTUykKICAgIEdMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnkoVk1FTSkKICAgIEdMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnkoQVMpCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KEZTSVpFKQoKICAgICMgQ2hlY2sgZm9yIHJsaW1pdCwgc2V0cmxpbWl0LgogICAgQUNfQ0FDSEVfVkFMKGFjX3NldHJsaW1pdCwgWwogICAgICBBQ19UUllfQ09NUElMRSgKICAgICAgICBbI2luY2x1ZGUgPHVuaXN0ZC5oPgogICAgICAgICAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICAgICAgICAgI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogICAgICAgIF0sCiAgICAgICAgW3N0cnVjdCBybGltaXQgcjsKICAgICAgICAgc2V0cmxpbWl0KDAsICZyKTtdLAogICAgICAgIFthY19zZXRybGltaXQ9eWVzXSwgW2FjX3NldHJsaW1pdD1ub10pCiAgICBdKQogIGZpCgogIEFDX01TR19DSEVDS0lORyhbZm9yIHRlc3RzdWl0ZSByZXNvdXJjZSBsaW1pdHMgc3VwcG9ydF0pCiAgaWYgdGVzdCAkc2V0cmxpbWl0X2hhdmVfaGVhZGVycyA9IHllcyAmJiB0ZXN0ICRhY19zZXRybGltaXQgPSB5ZXM7IHRoZW4KICAgIGFjX3Jlc19saW1pdHM9eWVzCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfUkVTX0xJTUlUUykKICBlbHNlCiAgICBhY19yZXNfbGltaXRzPW5vCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRhY19yZXNfbGltaXRzKQpdKQoKCmRubApkbmwgQ2hlY2sgd2hldGhlciBTX0lTUkVHIChQb3NpeCkgb3IgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+LgpkbmwgRGVmaW5lIEhBVkVfU19JU1JFRyAvIEhBVkVfU19JRlJFRyBhcHByb3ByaWF0ZWx5LgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfU19JU1JFR19PUl9TX0lGUkVHXSwgWwogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X1NfSVNSRUcsIFsKICAgIEFDX1RSWV9MSU5LKAogICAgICBbI2luY2x1ZGUgPHN5cy9zdGF0Lmg+XSwKICAgICAgW3N0cnVjdCBzdGF0IGJ1ZmZlcjsKICAgICAgIGZzdGF0KDAsICZidWZmZXIpOwogICAgICAgU19JU1JFRyhidWZmZXIuc3RfbW9kZSk7XSwKICAgICAgW2dsaWJjeHhfY3ZfU19JU1JFRz15ZXNdLAogICAgICBbZ2xpYmN4eF9jdl9TX0lTUkVHPW5vXSkKICBdKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X1NfSUZSRUcsIFsKICAgIEFDX1RSWV9MSU5LKAogICAgICBbI2luY2x1ZGUgPHN5cy9zdGF0Lmg+XSwKICAgICAgW3N0cnVjdCBzdGF0IGJ1ZmZlcjsKICAgICAgIGZzdGF0KDAsICZidWZmZXIpOwogICAgICAgU19JRlJFRyAmIGJ1ZmZlci5zdF9tb2RlO10sCiAgICAgIFtnbGliY3h4X2N2X1NfSUZSRUc9eWVzXSwKICAgICAgW2dsaWJjeHhfY3ZfU19JRlJFRz1ub10pCiAgXSkKICBpZiB0ZXN0ICRnbGliY3h4X2N2X1NfSVNSRUcgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX1NfSVNSRUcpCiAgZWxpZiB0ZXN0ICRnbGliY3h4X2N2X1NfSUZSRUcgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX1NfSUZSRUcpCiAgZmkKXSkKCgpkbmwKZG5sIENoZWNrIHdoZXRoZXIgcG9sbCBpcyBhdmFpbGFibGUgaW4gPHBvbGwuaD4sIGFuZCBkZWZpbmUgSEFWRV9QT0xMLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfUE9MTF0sIFsKICBBQ19DQUNIRV9WQUwoZ2xpYmN4eF9jdl9QT0xMLCBbCiAgICBBQ19UUllfTElOSygKICAgICAgWyNpbmNsdWRlIDxwb2xsLmg+XSwKICAgICAgW3N0cnVjdCBwb2xsZmQgcGZkWzFdOwogICAgICAgcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKICAgICAgIHBvbGwocGZkLCAxLCAwKTtdLAogICAgICBbZ2xpYmN4eF9jdl9QT0xMPXllc10sCiAgICAgIFtnbGliY3h4X2N2X1BPTEw9bm9dKQogIF0pCiAgaWYgdGVzdCAkZ2xpYmN4eF9jdl9QT0xMID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9QT0xMKQogIGZpCl0pCgoKZG5sCmRubCBDaGVjayB3aGV0aGVyIHdyaXRldiBpcyBhdmFpbGFibGUgaW4gPHN5cy91aW8uaD4sIGFuZCBkZWZpbmUgSEFWRV9XUklURVYuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19XUklURVZdLCBbCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfV1JJVEVWLCBbCiAgICBBQ19UUllfTElOSygKICAgICAgWyNpbmNsdWRlIDxzeXMvdWlvLmg+XSwKICAgICAgW3N0cnVjdCBpb3ZlYyBpb3ZbMl07CiAgICAgICB3cml0ZXYoMCwgaW92LCAwKTtdLAogICAgICBbZ2xpYmN4eF9jdl9XUklURVY9eWVzXSwKICAgICAgW2dsaWJjeHhfY3ZfV1JJVEVWPW5vXSkKICBdKQogIGlmIHRlc3QgJGdsaWJjeHhfY3ZfV1JJVEVWID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9XUklURVYpCiAgZmkKXSkKCgpkbmwKZG5sIENoZWNrIHdoZXRoZXIgaW50NjRfdCBpcyBhdmFpbGFibGUgaW4gPHN0ZGludC5oPiwgYW5kIGRlZmluZSBIQVZFX0lOVDY0X1QuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19JTlQ2NF9UXSwgWwogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X0lOVDY0X1QsIFsKICAgIEFDX1RSWV9DT01QSUxFKAogICAgICBbI2luY2x1ZGUgPHN0ZGludC5oPl0sCiAgICAgIFtpbnQ2NF90IHZhcjtdLAogICAgICBbZ2xpYmN4eF9jdl9JTlQ2NF9UPXllc10sCiAgICAgIFtnbGliY3h4X2N2X0lOVDY0X1Q9bm9dKQogIF0pCiAgaWYgdGVzdCAkZ2xpYmN4eF9jdl9JTlQ2NF9UID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9JTlQ2NF9UKQogIGZpCl0pCgoKZG5sCmRubCBDaGVjayB3aGV0aGVyIExGUyBzdXBwb3J0IGlzIGF2YWlsYWJsZS4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX0xGU10sIFsKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwogIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICBDWFhGTEFHUz0iJENYWEZMQUdTIC1mbm8tZXhjZXB0aW9ucyIJCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfTEZTLCBbCiAgICBBQ19UUllfTElOSygKICAgICAgWyNpbmNsdWRlIDx1bmlzdGQuaD4KICAgICAgICNpbmNsdWRlIDxzdGRpby5oPgogICAgICBdLAogICAgICBbRklMRSogZnA7CiAgICAgICBmb3BlbjY0KCJ0IiwgInciKTsKICAgICAgIGZzZWVrbzY0KGZwLCAwLCBTRUVLX0NVUik7CiAgICAgICBmdGVsbG82NChmcCk7CiAgICAgICBsc2VlazY0KDEsIDAsIFNFRUtfQ1VSKTtdLAkKICAgICAgW2dsaWJjeHhfY3ZfTEZTPXllc10sCiAgICAgIFtnbGliY3h4X2N2X0xGUz1ub10pCiAgXSkKICBpZiB0ZXN0ICRnbGliY3h4X2N2X0xGUyA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9MRlMpCiAgZmkKICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCiAgQUNfTEFOR19SRVNUT1JFCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2hldGhlciBhIGZ1bGx5IGR5bmFtaWMgYmFzaWNfc3RyaW5nIGltcGxlbWVudGF0aW9uIHNob3VsZApkbmwgYmUgdHVybmVkIG9uLCB0aGF0IGRvZXMgbm90IHB1dCBlbXB0eSBvYmplY3RzIGluIHBlci1wcm9jZXNzIHN0YXRpYwpkbmwgbWVtb3J5IChtb3N0bHkgdXNlZnVsIHRvZ2V0aGVyIHdpdGggc2hhcmVkIG1lbW9yeSBhbGxvY2F0b3JzLCBzZWUgUFIKZG5sIGxpYnN0ZGMrKy8xNjYxMiBmb3IgZGV0YWlscykuCmRubApkbmwgLS1lbmFibGUtZnVsbHktZHluYW1pYy1zdHJpbmcgZGVmaW5lcyBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORwpkbmwgLS1kaXNhYmxlLWZ1bGx5LWR5bmFtaWMtc3RyaW5nIGxlYXZlcyBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORyB1bmRlZmluZWQKZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0ZVTExZX0RZTkFNSUNfU1RSSU5HWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfRlVMTFlfRFlOQU1JQ19TVFJJTkddLCBbCiAgR0xJQkNYWF9FTkFCTEUoZnVsbHktZHluYW1pYy1zdHJpbmcsJDEsLFtkbyBub3QgcHV0IGVtcHR5IHN0cmluZ3MgaW4gcGVyLXByb2Nlc3Mgc3RhdGljIG1lbW9yeV0pCiAgaWYgdGVzdCAkZW5hYmxlX2Z1bGx5X2R5bmFtaWNfc3RyaW5nID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcpCiAgZmkKXSkKCgpkbmwKZG5sIERvZXMgYW55IG5lY2Vzc2FyeSBjb25maWd1cmF0aW9uIG9mIHRoZSB0ZXN0c3VpdGUgZGlyZWN0b3J5LiAgR2VuZXJhdGVzCmRubCB0aGUgdGVzdHN1aXRlX2hvb2tzLmggaGVhZGVyLgpkbmwKZG5sIEdMSUJDWFhfRU5BQkxFX1NZTVZFUlMgYW5kIEdMSUJDWFhfSVNfTkFUSVZFIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhpcy4KZG5sCmRubCBTZXRzOgpkbmwgIGVuYWJsZV9hYmlfY2hlY2sgLyBHTElCQ1hYX1RFU1RfQUJJCmRubCBTdWJzdHM6CmRubCAgYmFzZWxpbmVfZGlyCmRubApBQ19ERUZVTihbR0xJQkNYWF9DT05GSUdVUkVfVEVTVFNVSVRFXSwgWwogIGlmICRHTElCQ1hYX0lTX05BVElWRSAmJiB0ZXN0ICRpc19ob3N0ZWQgPSB5ZXM7IHRoZW4KICAgICMgRG8gY2hlY2tzIGZvciByZXNvdXJjZSBsaW1pdCBmdW5jdGlvbnMuCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVAoKICAgICMgTG9vayBmb3Igc2V0ZW52LCBzbyB0aGF0IGV4dGVuZGVkIGxvY2FsZSB0ZXN0cyBjYW4gYmUgcGVyZm9ybWVkLgogICAgR0xJQkNYWF9DSEVDS19TVERMSUJfREVDTF9BTkRfTElOS0FHRV8zKHNldGVudikKCiAgICBpZiB0ZXN0ICRlbmFibGVfc3ltdmVycyA9IG5vOyB0aGVuCiAgICAgIGVuYWJsZV9hYmlfY2hlY2s9bm8KICAgIGVsc2UKICAgICAgY2FzZSAiJGhvc3QiIGluCiAgICAgICAgKi0qLWN5Z3dpbiopCiAgICAgICAgICBlbmFibGVfYWJpX2NoZWNrPW5vIDs7CiAgICAgICAgKikKICAgICAgICAgIGVuYWJsZV9hYmlfY2hlY2s9eWVzIDs7CiAgICAgIGVzYWMKICAgIGZpCiAgZWxzZQogICAgIyBPbmx5IGJ1aWxkIHRoaXMgYXMgbmF0aXZlLCBzaW5jZSBhdXRvbWFrZSBkb2VzIG5vdCB1bmRlcnN0YW5kCiAgICAjIENYWF9GT1JfQlVJTEQuCiAgICBlbmFibGVfYWJpX2NoZWNrPW5vCiAgZmkKCiAgIyBFeHBvcnQgZmlsZSBuYW1lcyBmb3IgQUJJIGNoZWNraW5nLgogIGJhc2VsaW5lX2Rpcj0iJGdsaWJjeHhfc3JjZGlyL2NvbmZpZy9hYmkvJHthYmlfYmFzZWxpbmVfcGFpcn1cJChNVUxUSVNVQkRJUikiCiAgQUNfU1VCU1QoYmFzZWxpbmVfZGlyKQoKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfVEVTVF9XQ0hBUl9ULCB0ZXN0ICRlbmFibGVfd2NoYXJfdCA9IHllcykKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfVEVTVF9BQkksIHRlc3QgJGVuYWJsZV9hYmlfY2hlY2sgPSB5ZXMpCl0pCgoKZG5sCmRubCBTZXQgdXAgKl9JTkNMVURFUyB2YXJpYWJsZXMgZm9yIGFsbCBzdW5kcnkgTWFrZWZpbGUuYW0ncy4KZG5sCmRubCBTdWJzdHM6CmRubCAgR0xJQkNYWF9JTkNMVURFUwpkbmwgIFRPUExFVkVMX0lOQ0xVREVTCmRubApBQ19ERUZVTihbR0xJQkNYWF9FWFBPUlRfSU5DTFVERVNdLCBbCiAgIyBVc2VkIGZvciBldmVyeSBDKysgY29tcGlsZSB3ZSBwZXJmb3JtLgogIEdMSUJDWFhfSU5DTFVERVM9IlwKLUkkZ2xpYmN4eF9idWlsZGRpci9pbmNsdWRlLyRob3N0X2FsaWFzIFwKLUkkZ2xpYmN4eF9idWlsZGRpci9pbmNsdWRlIFwKLUkkZ2xpYmN4eF9zcmNkaXIvbGlic3VwYysrIgoKICAjIEZvciBDYW5hZGlhbiBjcm9zc2VzLCBwaWNrIHRoaXMgdXAgdG9vLgogIGlmIHRlc3QgJENBTkFESUFOID0geWVzOyB0aGVuCiAgICBHTElCQ1hYX0lOQ0xVREVTPSIkR0xJQkNYWF9JTkNMVURFUyAtSVwke2luY2x1ZGVkaXJ9IgogIGZpCgogICMgU3R1ZmYgaW4gdGhlIGFjdHVhbCB0b3AgbGV2ZWwuICBDdXJyZW50bHkgb25seSB1c2VkIGJ5IGxpYnN1cGMrKyB0bwogICMgZ2V0IHVud2luZCogaGVhZGVycyBmcm9tIHRoZSBnY2MgZGlyLgogICNUT1BMRVZFTF9JTkNMVURFUz0nLUkkKHRvcGxldmVsX3NyY2RpcikvZ2NjIC1JJCh0b3BsZXZlbF9zcmNkaXIpL2luY2x1ZGUnCiAgVE9QTEVWRUxfSU5DTFVERVM9Jy1JJCh0b3BsZXZlbF9zcmNkaXIpL2djYycKCiAgIyBOb3csIGV4cG9ydCB0aGlzIHRvIGFsbCB0aGUgbGl0dGxlIE1ha2VmaWxlcy4uLi4KICBBQ19TVUJTVChHTElCQ1hYX0lOQ0xVREVTKQogIEFDX1NVQlNUKFRPUExFVkVMX0lOQ0xVREVTKQpdKQoKCmRubApkbmwgU2V0IHVwICpfRkxBR1MgYW5kICpGTEFHUyB2YXJpYWJsZXMgZm9yIGFsbCBzdW5kcnkgTWFrZWZpbGUuYW0ncy4KZG5sIChTRUNUSU9OX0ZMQUdTIGlzIGRvbmUgdW5kZXIgQ0hFQ0tfQ09NUElMRVJfRkVBVFVSRVMuKQpkbmwKZG5sIFN1YnN0czoKZG5sICBPUFRJTUlaRV9DWFhGTEFHUwpkbmwgIFdBUk5fRkxBR1MKZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VYUE9SVF9GTEFHU10sIFsKICAjIE9wdGltaXphdGlvbiBmbGFncyB0aGF0IGFyZSBwcm9iYWJseSBhIGdvb2QgaWRlYSBmb3IgdGhyaWxsLXNlZWtlcnMuIEp1c3QKICAjIHVuY29tbWVudCB0aGUgbGluZXMgYmVsb3cgYW5kIG1ha2UsIGV2ZXJ5dGhpbmcgZWxzZSBpcyByZWFkeSB0byBnby4uLgogICMgT1BUSU1JWkVfQ1hYRkxBR1MgPSAtTzMgLWZzdHJpY3QtYWxpYXNpbmcgLWZ2dGFibGUtZ2MKICBPUFRJTUlaRV9DWFhGTEFHUz0KICBBQ19TVUJTVChPUFRJTUlaRV9DWFhGTEFHUykKCiAgV0FSTl9GTEFHUz0nLVdhbGwgLVcgLVd3cml0ZS1zdHJpbmdzIC1XY2FzdC1xdWFsJwogIEFDX1NVQlNUKFdBUk5fRkxBR1MpCl0pCgoKZG5sCmRubCBBbGwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBpcyBkZXRlcm1pbmVkIGhlcmUuCmRubApkbmwgU3Vic3RzOgpkbmwgIGd4eF9pbnN0YWxsX2RpcgpkbmwgIGdsaWJjeHhfcHJlZml4ZGlyCmRubCAgZ2xpYmN4eF90b29sZXhlY2RpcgpkbmwgIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXIKZG5sCmRubCBBc3N1bWVzIGNyb3NzX2NvbXBpbGluZyBiaXRzIGFscmVhZHkgZG9uZSwgYW5kIHdpdGhfY3Jvc3NfaG9zdCBpbgpkbmwgcGFydGljdWxhci4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VYUE9SVF9JTlNUQUxMX0lORk9dLCBbCiAgZ2xpYmN4eF90b29sZXhlY2Rpcj1ubwogIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9bm8KICBnbGliY3h4X3ByZWZpeGRpcj0kcHJlZml4CgogIEFDX01TR19DSEVDS0lORyhbZm9yIGd4eC1pbmNsdWRlLWRpcl0pCiAgQUNfQVJHX1dJVEgoW2d4eC1pbmNsdWRlLWRpcl0sCiAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWd4eC1pbmNsdWRlLWRpcj1ESVJdLAogICAgICAgICAgICAgICAgICAgW2luc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIGluY2x1ZGUgZmlsZXNdKSwKICAgIFtjYXNlICIkd2l0aHZhbCIgaW4KICAgICAgeWVzKSBBQ19NU0dfRVJST1IoW01pc3NpbmcgZGlyZWN0b3J5IGZvciAtLXdpdGgtZ3h4LWluY2x1ZGUtZGlyXSkgOzsKICAgICAgbm8pICBneHhfaW5jbHVkZV9kaXI9bm8gOzsKICAgICAgKikgICBneHhfaW5jbHVkZV9kaXI9JHdpdGh2YWwgOzsKICAgICBlc2FjXSwKICAgIFtneHhfaW5jbHVkZV9kaXI9bm9dKQogIEFDX01TR19SRVNVTFQoJGd4eF9pbmNsdWRlX2RpcikKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgLS1lbmFibGUtdmVyc2lvbi1zcGVjaWZpYy1ydW50aW1lLWxpYnNdKQogIEFDX0FSR19FTkFCTEUoW3ZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzXSwKICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12ZXJzaW9uLXNwZWNpZmljLXJ1bnRpbWUtbGlic10sCiAgICAgICAgICAgICAgICAgICBbU3BlY2lmeSB0aGF0IHJ1bnRpbWUgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gYSBjb21waWxlci1zcGVjaWZpYyBkaXJlY3RvcnldKSwKICAgIFtjYXNlICIkZW5hYmxldmFsIiBpbgogICAgICB5ZXMpIHZlcnNpb25fc3BlY2lmaWNfbGlicz15ZXMgOzsKICAgICAgbm8pICB2ZXJzaW9uX3NwZWNpZmljX2xpYnM9bm8gOzsKICAgICAgKikgICBBQ19NU0dfRVJST1IoW1Vua25vd24gYXJndW1lbnQgdG8gZW5hYmxlL2Rpc2FibGUgdmVyc2lvbi1zcGVjaWZpYyBsaWJzXSk7OwogICAgIGVzYWNdLAogICAgW3ZlcnNpb25fc3BlY2lmaWNfbGlicz1ub10pCiAgQUNfTVNHX1JFU1VMVCgkdmVyc2lvbl9zcGVjaWZpY19saWJzKQoKICAjIERlZmF1bHQgY2FzZSBmb3IgaW5zdGFsbCBkaXJlY3RvcnkgZm9yIGluY2x1ZGUgZmlsZXMuCiAgaWYgdGVzdCAkdmVyc2lvbl9zcGVjaWZpY19saWJzID0gbm8gJiYgdGVzdCAkZ3h4X2luY2x1ZGVfZGlyID0gbm87IHRoZW4KICAgIGd4eF9pbmNsdWRlX2Rpcj0nJHtwcmVmaXh9Jy9pbmNsdWRlL2MrKy8ke2djY192ZXJzaW9ufQogIGZpCgogICMgVmVyc2lvbi1zcGVjaWZpYyBydW50aW1lIGxpYnMgcHJvY2Vzc2luZy4KICBpZiB0ZXN0ICR2ZXJzaW9uX3NwZWNpZmljX2xpYnMgPSB5ZXM7IHRoZW4KICAgICMgTmVlZCB0aGUgZ2NjIGNvbXBpbGVyIHZlcnNpb24gdG8ga25vdyB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcmllcwogICAgIyBhbmQgaGVhZGVyIGZpbGVzIGlmIC0tZW5hYmxlLXZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzIG9wdGlvbgogICAgIyBpcyBzZWxlY3RlZC4gIEZJWE1FOiB0aGVzZSB2YXJpYWJsZXMgYXJlIG1pc25hbWVkLCB0aGVyZSBhcmUKICAgICMgbm8gZXhlY3V0YWJsZXMgaW5zdGFsbGVkIGluIF90b29sZXhlY2RpciBvciBfdG9vbGV4ZWNsaWJkaXIuCiAgICBpZiB0ZXN0IHgiJGd4eF9pbmNsdWRlX2RpciIgPSB4Im5vIjsgdGhlbgogICAgICBneHhfaW5jbHVkZV9kaXI9JyR7bGliZGlyfS9nY2MvJHtob3N0X2FsaWFzfS8nJGdjY192ZXJzaW9uL2luY2x1ZGUvYysrCiAgICBmaQogICAgZ2xpYmN4eF90b29sZXhlY2Rpcj0nJHtsaWJkaXJ9L2djYy8ke2hvc3RfYWxpYXN9JwogICAgZ2xpYmN4eF90b29sZXhlY2xpYmRpcj0nJHt0b29sZXhlY2Rpcn0vJyRnY2NfdmVyc2lvbickKE1VTFRJU1VCRElSKScKICBmaQoKICAjIENhbGN1bGF0ZSBnbGliY3h4X3Rvb2xleGVjZGlyLCBnbGliY3h4X3Rvb2xleGVjbGliZGlyCiAgIyBJbnN0YWxsIGEgbGlicmFyeSBidWlsdCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIgaW4gdG9vbGRpciwgbm90IGxpYmRpci4KICBpZiB0ZXN0IHgiJGdsaWJjeHhfdG9vbGV4ZWNkaXIiID0geCJubyI7IHRoZW4KICAgIGlmIHRlc3QgLW4gIiR3aXRoX2Nyb3NzX2hvc3QiICYmCiAgICAgICB0ZXN0IHgiJHdpdGhfY3Jvc3NfaG9zdCIgIT0geCJubyI7IHRoZW4KICAgICAgZ2xpYmN4eF90b29sZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vJHtob3N0X2FsaWFzfScKICAgICAgZ2xpYmN4eF90b29sZXhlY2xpYmRpcj0nJHt0b29sZXhlY2Rpcn0vbGliJwogICAgZWxzZQogICAgICBnbGliY3h4X3Rvb2xleGVjZGlyPScke2xpYmRpcn0vZ2NjLyR7aG9zdF9hbGlhc30nCiAgICAgIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9JyR7bGliZGlyfScKICAgIGZpCiAgICBtdWx0aV9vc19kaXJlY3Rvcnk9YCRDWFggLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeWAKICAgIGNhc2UgJG11bHRpX29zX2RpcmVjdG9yeSBpbgogICAgICAuKSA7OyAjIEF2b2lkIHRyYWlsaW5nIC8uCiAgICAgICopIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9JGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXIvJG11bHRpX29zX2RpcmVjdG9yeSA7OwogICAgZXNhYwogIGZpCgogIEFDX01TR19DSEVDS0lORyhbZm9yIGluc3RhbGwgbG9jYXRpb25dKQogIEFDX01TR19SRVNVTFQoJGd4eF9pbmNsdWRlX2RpcikKCiAgQUNfU1VCU1QoZ2xpYmN4eF9wcmVmaXhkaXIpCiAgQUNfU1VCU1QoZ3h4X2luY2x1ZGVfZGlyKQogIEFDX1NVQlNUKGdsaWJjeHhfdG9vbGV4ZWNkaXIpCiAgQUNfU1VCU1QoZ2xpYmN4eF90b29sZXhlY2xpYmRpcikKXSkKCgpkbmwKZG5sIEdMSUJDWFhfRU5BQkxFCmRubCAgICAoRkVBVFVSRSwgREVGQVVMVCwgSEVMUC1BUkcsIEhFTFAtU1RSSU5HKQpkbmwgICAgKEZFQVRVUkUsIERFRkFVTFQsIEhFTFAtQVJHLCBIRUxQLVNUUklORywgcGVybWl0IGF8YnxjKQpkbmwgICAgKEZFQVRVUkUsIERFRkFVTFQsIEhFTFAtQVJHLCBIRUxQLVNUUklORywgU0hFTEwtQ09ERS1IQU5ETEVSKQpkbmwKZG5sIFNlZSBkb2NzL2h0bWwvMTdfaW50cm8vY29uZmlndXJ5Lmh0bWwjZW5hYmxlIGZvciBkb2N1bWVudGF0aW9uLgpkbmwKbTRfZGVmaW5lKFtHTElCQ1hYX0VOQUJMRV0sW2RubAptNF9kZWZpbmUoW19nX3N3aXRjaF0sWy0tZW5hYmxlLSQxXSlkbmwKbTRfZGVmaW5lKFtfZ19oZWxwXSxbQUNfSEVMUF9TVFJJTkcoX2dfc3dpdGNoJDMsWyQ0IEA8OkBkZWZhdWx0PSQyQDo+QF0pXSlkbmwKIEFDX0FSR19FTkFCTEUoJDEsX2dfaGVscCwKICBtNF9ibWF0Y2goWyQ1XSwKICAgW15wZXJtaXQgXSwKICAgICBbWwogICAgICBjYXNlICIkZW5hYmxldmFsIiBpbgogICAgICAgbTRfYnBhdHN1YnN0KFskNV0sW3Blcm1pdCBdKSkgOzsKICAgICAgICopIEFDX01TR19FUlJPUihVbmtub3duIGFyZ3VtZW50IHRvIGVuYWJsZS9kaXNhYmxlICQxKSA7OwogICAgICAgICAgZG5sIElkZWEgZm9yIGZ1dHVyZTogIGdlbmVyYXRlIGEgVVJMIHBvaW50aW5nIHRvCiAgICAgICAgICBkbmwgIm9ubGluZWRvY3MvY29uZmlnb3B0cy5odG1sI3doYXRldmVyIgogICAgICBlc2FjCiAgICAgXV0sCiAgIFteJF0sCiAgICAgW1sKICAgICAgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICAgICAgIHllc3xubykgOzsKICAgICAgICopIEFDX01TR19FUlJPUihBcmd1bWVudCB0byBlbmFibGUvZGlzYWJsZSAkMSBtdXN0IGJlIHllcyBvciBubykgOzsKICAgICAgZXNhYwogICAgIF1dLAogICBbWyQ1XV0pLAogIFtlbmFibGVfXW00X2JwYXRzdWJzdChbJDFdLC0sXylbPV1bJDJdKQptNF91bmRlZmluZShbX2dfc3dpdGNoXSlkbmwKbTRfdW5kZWZpbmUoW19nX2hlbHBdKWRubApdKQoKCmRubApkbmwgQ2hlY2sgZm9yIElTTy9JRUMgOTg5OToxOTk5ICJDOTkiIHN1cHBvcnQuCmRubApkbmwgLS1lbmFibGUtYzk5IGRlZmluZXMgX0dMSUJDWFhfVVNFX0M5OQpkbmwgLS1kaXNhYmxlLWM5OSBsZWF2ZXMgX0dMSUJDWFhfVVNFX0M5OSB1bmRlZmluZWQKZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0M5OVsoREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLgpkbmwgICsgIElmICdDOTknIHN0dWZmIGlzIG5vdCBhdmFpbGFibGUsIGlnbm9yZXMgREVGQVVMVCBhbmQgc2V0cyBgbm8nLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0M5OV0sIFsKICBHTElCQ1hYX0VOQUJMRShjOTksJDEsLFt0dXJucyBvbiBJU08vSUVDIDk4OTk6MTk5OSBzdXBwb3J0XSkKCiAgQUNfTEFOR19TQVZFCiAgQUNfTEFOR19DUExVU1BMVVMKCiAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiA8bWF0aC5oPiBmdW5jdGlvbnMgdXNlZCBpZiBDOTkgaXMgZW5hYmxlZC4KICBhY19jOTlfbWF0aD15ZXM7CiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IGluIDxtYXRoLmg+XSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hdGguaD5dLFtmcGNsYXNzaWZ5KDAuMCk7XSwsIFthY19jOTlfbWF0aD1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSxbaXNmaW5pdGUoMC4wKTtdLCwgW2FjX2M5OV9tYXRoPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hdGguaD5dLFtpc2luZigwLjApO10sLCBbYWNfYzk5X21hdGg9bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sW2lzbmFuKDAuMCk7XSwsIFthY19jOTlfbWF0aD1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSxbaXNub3JtYWwoMC4wKTtdLCwgW2FjX2M5OV9tYXRoPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hdGguaD5dLFtzaWduYml0KDAuMCk7XSwsIFthY19jOTlfbWF0aD1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSxbaXNncmVhdGVyKDAuMCwwLjApO10sLCBbYWNfYzk5X21hdGg9bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sCiAgICAgICAgICAgICAgICAgW2lzZ3JlYXRlcmVxdWFsKDAuMCwwLjApO10sLCBbYWNfYzk5X21hdGg9bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sW2lzbGVzcygwLjAsMC4wKTtdLCwgW2FjX2M5OV9tYXRoPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hdGguaD5dLFtpc2xlc3NlcXVhbCgwLjAsMC4wKTtdLCxbYWNfYzk5X21hdGg9bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sCiAgICAgICAgICAgICAgICAgW2lzbGVzc2dyZWF0ZXIoMC4wLDAuMCk7XSwsIFthY19jOTlfbWF0aD1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSwKICAgICAgICAgICAgICAgICBbaXN1bm9yZGVyZWQoMC4wLDAuMCk7XSwsIFthY19jOTlfbWF0aD1ub10pCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X21hdGgpCgogIGlmIHRlc3QgeCIkYWNfYzk5X21hdGgiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OV9NQVRIKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2UgaW4gPHN0ZGlvLmg+IG9mIHZzY2FuZiwgZXQuIGFsLgogIGFjX2M5OV9zdGRpbz15ZXM7CiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IGluIDxzdGRpby5oPl0pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRpby5oPl0sCiAgICAgICAgICAgICAgICAgW3NucHJpbnRmKCIxMiIsIDAsICIlaSIpO10sLCBbYWNfYzk5X3N0ZGlvPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGlvLmg+CiAgICAgICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRhcmcuaD4KICAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciogZm10LCAuLi4pCiAgICAgICAgICAgICAgICAgIHt2YV9saXN0IGFyZ3M7IHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CiAgICAgICAgICAgICAgICAgIHZmc2NhbmYoc3RkZXJyLCAiJWkiLCBhcmdzKTt9XSwKICAgICAgICAgICAgICAgICAgW10sLCBbYWNfYzk5X3N0ZGlvPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGlvLmg+CiAgICAgICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRhcmcuaD4KICAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciogZm10LCAuLi4pCiAgICAgICAgICAgICAgICAgIHt2YV9saXN0IGFyZ3M7IHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CiAgICAgICAgICAgICAgICAgIHZzY2FuZigiJWkiLCBhcmdzKTt9XSwKICAgICAgICAgICAgICAgICAgW10sLCBbYWNfYzk5X3N0ZGlvPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGlvLmg+CiAgICAgICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRhcmcuaD4KICAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciogZm10LCAuLi4pCiAgICAgICAgICAgICAgICAgIHt2YV9saXN0IGFyZ3M7IHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CiAgICAgICAgICAgICAgICAgIHZzbnByaW50ZihmbXQsIDAsICIlaSIsIGFyZ3MpO31dLAogICAgICAgICAgICAgICAgICBbXSwsIFthY19jOTlfc3RkaW89bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkaW8uaD4KICAgICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGFyZy5oPgogICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyKiBmbXQsIC4uLikKICAgICAgICAgICAgICAgICAge3ZhX2xpc3QgYXJnczsgdmFfc3RhcnQoYXJncywgZm10KTsKICAgICAgICAgICAgICAgICAgdnNzY2FuZihmbXQsICIlaSIsIGFyZ3MpO31dLAogICAgICAgICAgICAgICAgICBbXSwsIFthY19jOTlfc3RkaW89bm9dKQogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9zdGRpbykKCiAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBpbiA8c3RkbGliLmg+IG9mIGxsZGl2X3QsIGV0LiBhbC4KICBhY19jOTlfc3RkbGliPXllczsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsbGRpdl90IGRlY2xhcmF0aW9uXSkKICBBQ19DQUNIRV9WQUwoYWNfYzk5X2xsZGl2X3QsIFsKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGxpYi5oPl0sCiAgICAgICAgICAgICAgICAgICBbIGxsZGl2X3QgbXlkaXZ0O10sCiAgICAgICAgICAgICAgICAgICBbYWNfYzk5X2xsZGl2X3Q9eWVzXSwgW2FjX2M5OV9sbGRpdl90PW5vXSkKICBdKQogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9sbGRpdl90KQoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHN1cHBvcnQgaW4gPHN0ZGxpYi5oPl0pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRsaWIuaD5dLAogICAgICAgICAgICAgICAgIFtjaGFyKiB0bXA7IHN0cnRvZigiZ251IiwgJnRtcCk7XSwsIFthY19jOTlfc3RkbGliPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGxpYi5oPl0sCiAgICAgICAgICAgICAgICAgW2NoYXIqIHRtcDsgc3RydG9sZCgiZ251IiwgJnRtcCk7XSwsIFthY19jOTlfc3RkbGliPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGxpYi5oPl0sIFtsbGFicygxMCk7XSwsIFthY19jOTlfc3RkbGliPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGxpYi5oPl0sIFtsbGRpdigxMCwxKTtdLCwgW2FjX2M5OV9zdGRsaWI9bm9dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkbGliLmg+XSwgW2F0b2xsKCIxMCIpO10sLCBbYWNfYzk5X3N0ZGxpYj1ub10pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRsaWIuaD5dLCBbX0V4aXQoMCk7XSwsIFthY19jOTlfc3RkbGliPW5vXSkKICBpZiB0ZXN0IHgiJGFjX2M5OV9sbGRpdl90IiA9IHgibm8iOyB0aGVuCiAgICBhY19jOTlfc3RkbGliPW5vOwogIGZpOwogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9zdGRsaWIpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPHdjaGFyLmg+IGZ1bmN0aW9ucyB1c2VkIGlmIEM5OSBpcyBlbmFibGVkLgogICMgWFhYIHRoZSB3Y2hhci5oIGNoZWNrcyBzaG91bGQgYmUgcm9sbGVkIGludG8gdGhlIGdlbmVyYWwgQzk5IGJpdHMuCiAgYWNfYzk5X3djaGFyPXllczsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhZGRpdGlvbmFsIElTTyBDOTkgc3VwcG9ydCBpbiA8d2NoYXIuaD5dKQogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8d2NoYXIuaD5dLAogICAgICAgICAgICAgICAgIFt3Y3N0b2xkKEwiMTAuMCIsIE5VTEwpO10sLCBbYWNfYzk5X3djaGFyPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+XSwKICAgICAgICAgICAgICAgICBbd2NzdG9sbChMIjEwIiwgTlVMTCwgMTApO10sLCBbYWNfYzk5X3djaGFyPW5vXSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+XSwKICAgICAgICAgICAgICAgICBbd2NzdG91bGwoTCIxMCIsIE5VTEwsIDEwKTtdLCwgW2FjX2M5OV93Y2hhcj1ub10pCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X3djaGFyKQoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlbmFibGVkIElTTyBDOTkgc3VwcG9ydF0pCiAgaWYgdGVzdCB4IiRhY19jOTlfbWF0aCIgPSB4Im5vIiB8fAogICAgIHRlc3QgeCIkYWNfYzk5X3N0ZGlvIiA9IHgibm8iIHx8CiAgICAgdGVzdCB4IiRhY19jOTlfc3RkbGliIiA9IHgibm8iIHx8CiAgICAgdGVzdCB4IiRhY19jOTlfd2NoYXIiID0geCJubyI7IHRoZW4KICAgIGVuYWJsZV9jOTk9bm87CiAgZmk7CiAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2M5OSkKCiAgaWYgdGVzdCB4IiRhY185OV9tYXRoIiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9DOTlfTUFUSCkKICBmaQoKICAjIE9wdGlvbiBwYXJzZWQsIG5vdyBzZXQgdGhpbmdzIGFwcHJvcHJpYXRlbHkKICBpZiB0ZXN0IHgiJGVuYWJsZV9jOTkiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OSkKICBmaQoKICBBQ19MQU5HX1JFU1RPUkUKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGF0IHR5cGUgb2YgQyBoZWFkZXJzIHRvIHVzZS4KZG5sCmRubCAtLWVuYWJsZS1jaGVhZGVycz0gW2RvZXMgc3R1ZmZdLgpkbmwgLS1kaXNhYmxlLWNoZWFkZXJzIFtkb2VzIG5vdCBkbyBhbnl0aGluZywgcmVhbGx5XS4KZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0NIRUFERVJTWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGBjJyBvciBgY19zdGQnLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0NIRUFERVJTXSwgWwogIEdMSUJDWFhfRU5BQkxFKGNoZWFkZXJzLCQxLFs9S0lORF0sCiAgICBbY29uc3RydWN0ICJDIiBoZWFkZXJzIGZvciBnKytdLCBbcGVybWl0IGN8Y19zdGRdKQogIEFDX01TR19OT1RJQ0UoIkMiIGhlYWRlciBzdHJhdGVneSBzZXQgdG8gJGVuYWJsZV9jaGVhZGVycykKCiAgQ19JTkNMVURFX0RJUj0nJHtnbGliY3h4X3NyY2Rpcn0vaW5jbHVkZS8nJGVuYWJsZV9jaGVhZGVycwoKICBBQ19TVUJTVChDX0lOQ0xVREVfRElSKQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9DX0hFQURFUlNfQywgdGVzdCAkZW5hYmxlX2NoZWFkZXJzID0gYykKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfQ19IRUFERVJTX0NfU1RELCB0ZXN0ICRlbmFibGVfY2hlYWRlcnMgPSBjX3N0ZCkKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfQ19IRUFERVJTX0NPTVBBVElCSUxJVFksIHRlc3QgJGNfY29tcGF0aWJpbGl0eSA9IHllcykKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGljaCBsb2NhbGUgbGlicmFyeSB0byB1c2UuICBUaGUgY2hvaWNlIGlzIG1hcHBlZCB0bwpkbmwgYSBzdWJkaXJlY3Rvcnkgb2YgY29uZmlnL2xvY2FsZS4KZG5sCmRubCBEZWZhdWx0IGlzIGdlbmVyaWMuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfQ0xPQ0FMRV0sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBDIGxvY2FsZSB0byB1c2VdKQogIEdMSUJDWFhfRU5BQkxFKGNsb2NhbGUsYXV0byxbQDw6QD1NT0RFTEA6PkBdLAogICAgW3VzZSBNT0RFTCBmb3IgdGFyZ2V0IGxvY2FsZSBwYWNrYWdlXSwKICAgIFtwZXJtaXQgZ2VuZXJpY3xnbnV8aWVlZV8xMDAzLjEtMjAwMXx5ZXN8bm98YXV0b10pCiAgCiAgIyBJZiB0aGV5IGRpZG4ndCB1c2UgdGhpcyBvcHRpb24gc3dpdGNoLCBvciBpZiB0aGV5IHNwZWNpZmllZCAtLWVuYWJsZQogICMgd2l0aCBubyBzcGVjaWZpYyBtb2RlbCwgd2UnbGwgaGF2ZSB0byBsb29rIGZvciBvbmUuICBJZiB0aGV5CiAgIyBzcGVjaWZpZWQgLS1kaXNhYmxlICg/Pz8pLCBkbyBsaWtld2lzZS4KICBpZiB0ZXN0ICRlbmFibGVfY2xvY2FsZSA9IG5vIHx8IHRlc3QgJGVuYWJsZV9jbG9jYWxlID0geWVzOyB0aGVuCiAgICAgZW5hYmxlX2Nsb2NhbGU9YXV0bwogIGZpCgogICMgRWl0aGVyIGEga25vd24gcGFja2FnZSwgb3IgImF1dG8iCiAgZW5hYmxlX2Nsb2NhbGVfZmxhZz0kZW5hYmxlX2Nsb2NhbGUKCiAgIyBQcm9iZSBmb3IgbG9jYWxlIHN1cHBvcnQgaWYgbm8gc3BlY2lmaWMgbW9kZWwgaXMgc3BlY2lmaWVkLgogICMgRGVmYXVsdCB0byAiZ2VuZXJpYyIuCiAgaWYgdGVzdCAkZW5hYmxlX2Nsb2NhbGVfZmxhZyA9IGF1dG87IHRoZW4KICAgIGNhc2UgeCR7dGFyZ2V0X29zfSBpbgogICAgICB4bGludXgqIHwgeGdudSogfCB4a2ZyZWVic2QqLWdudSB8IHhrbmV0YnNkKi1nbnUpCiAgICAgICAgQUNfRUdSRVBfQ1BQKFtfR0xJQkNYWF9va10sIFsKICAgICAgICAjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KICAgICAgICAjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDIpCiAgICAgICAgICBfR0xJQkNYWF9vawogICAgICAgICNlbmRpZgogICAgICAgIF0sIGVuYWJsZV9jbG9jYWxlX2ZsYWc9Z251LCBlbmFibGVfY2xvY2FsZV9mbGFnPWdlbmVyaWMpCgogICAgICAgICMgVGVzdCBmb3IgYnVncyBlYXJseSBpbiBnbGliYy0yLjIueCBzZXJpZXMKICAgICAgICAgIGlmIHRlc3QgeCRlbmFibGVfY2xvY2FsZV9mbGFnID0geGdudTsgdGhlbgogICAgICAgICAgQUNfVFJZX1JVTihbCiAgICAgICAgICAjZGVmaW5lIF9HTlVfU09VUkNFIDEKICAgICAgICAgICNpbmNsdWRlIDxsb2NhbGUuaD4KICAgICAgICAgICNpbmNsdWRlIDxzdHJpbmcuaD4KICAgICAgICAgICNpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPiAyKQogICAgICAgICAgZXh0ZXJuIF9fdHlwZW9mKG5ld2xvY2FsZSkgX19uZXdsb2NhbGU7CiAgICAgICAgICBleHRlcm4gX190eXBlb2YoZHVwbG9jYWxlKSBfX2R1cGxvY2FsZTsKICAgICAgICAgIGV4dGVybiBfX3R5cGVvZihzdHJjb2xsX2wpIF9fc3RyY29sbF9sOwogICAgICAgICAgI2VuZGlmCiAgICAgICAgICBpbnQgbWFpbigpCiAgICAgICAgICB7CiAgICAgICAgICAgICAgY29uc3QgY2hhciBfX29uZVtdID0gIsR1Z2xlaW4gQXVnbWVuIjsKICAgICAgICAgICAgICBjb25zdCBjaGFyIF9fdHdvW10gPSAixHVnbGVpbiI7CiAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgaW50IGo7CiAgICAgICAgICAgICAgX19sb2NhbGVfdCAgICAgICAgbG9jOwogICAgICAgICAgICAgICBfX2xvY2FsZV90ICAgICAgICBsb2NfZHVwOwogICAgICAgICAgICAgIGxvYyA9IF9fbmV3bG9jYWxlKDEgPDwgTENfQUxMLCAiZGVfREUiLCAwKTsKICAgICAgICAgICAgICBsb2NfZHVwID0gX19kdXBsb2NhbGUobG9jKTsKICAgICAgICAgICAgICBpID0gX19zdHJjb2xsX2woX19vbmUsIF9fdHdvLCBsb2MpOwogICAgICAgICAgICAgIGogPSBfX3N0cmNvbGxfbChfX29uZSwgX190d28sIGxvY19kdXApOwogICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgIFtlbmFibGVfY2xvY2FsZV9mbGFnPWdudV0sW2VuYWJsZV9jbG9jYWxlX2ZsYWc9Z2VuZXJpY10sCiAgICAgICAgICBbZW5hYmxlX2Nsb2NhbGVfZmxhZz1nZW5lcmljXSkKICAgICAgICAgIGZpCgogICAgICAgICMgLi4uIGF0IHNvbWUgcG9pbnQgcHV0IF9fc3RyeGZybV9sIHRlc3RzIGluIGFzIHdlbGwuCiAgICAgICAgOzsKICAgICAgKikKICAgICAgICBlbmFibGVfY2xvY2FsZV9mbGFnPWdlbmVyaWMKICAgICAgICA7OwogICAgZXNhYwogIGZpCgogICMgRGVhbCB3aXRoIGdldHRleHQgaXNzdWVzLiAgRGVmYXVsdCB0byBub3QgdXNpbmcgaXQgKD1ubykgdW50aWwgd2UgZGV0ZWN0CiAgIyBzdXBwb3J0IGZvciBpdCBsYXRlci4gIExldCB0aGUgdXNlciB0dXJuIGl0IG9mZiB2aWEgLS1lL2QsIGJ1dCBsZXQgdGhhdAogICMgZGVmYXVsdCB0byBvbiBmb3IgZWFzaWVyIGhhbmRsaW5nLgogIFVTRV9OTFM9bm8KICBBQ19BUkdfRU5BQkxFKG5scywKICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1ubHNdLFt1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQgKGRlZmF1bHQpXSksCiAgICBbXSwKICAgIFtlbmFibGVfbmxzPXllc10pCgogICMgU2V0IGNvbmZpZ3VyZSBiaXRzIGZvciBzcGVjaWZpZWQgbG9jYWxlIHBhY2thZ2UKICBjYXNlICR7ZW5hYmxlX2Nsb2NhbGVfZmxhZ30gaW4KICAgIGdlbmVyaWMpCiAgICAgIEFDX01TR19SRVNVTFQoZ2VuZXJpYykKCiAgICAgIENMT0NBTEVfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvY19sb2NhbGUuaAogICAgICBDTE9DQUxFX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jX2xvY2FsZS5jYwogICAgICBDQ09ERUNWVF9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oCiAgICAgIENDT0RFQ1ZUX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jb2RlY3Z0X21lbWJlcnMuY2MKICAgICAgQ0NPTExBVEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NvbGxhdGVfbWVtYmVycy5jYwogICAgICBDQ1RZUEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2N0eXBlX21lbWJlcnMuY2MKICAgICAgQ01FU1NBR0VTX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21lc3NhZ2VzX21lbWJlcnMuaAogICAgICBDTUVTU0FHRVNfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21lc3NhZ2VzX21lbWJlcnMuY2MKICAgICAgQ01PTkVZX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9tb25ldGFyeV9tZW1iZXJzLmNjCiAgICAgIENOVU1FUklDX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9udW1lcmljX21lbWJlcnMuY2MKICAgICAgQ1RJTUVfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvdGltZV9tZW1iZXJzLmgKICAgICAgQ1RJTUVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL3RpbWVfbWVtYmVycy5jYwogICAgICBDTE9DQUxFX0lOVEVSTkFMX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2MrK2xvY2FsZV9pbnRlcm5hbC5oCiAgICAgIDs7CiAgICBnbnUpCiAgICAgIEFDX01TR19SRVNVTFQoZ251KQoKICAgICAgIyBEZWNsYXJlIGludGVudGlvbiB0byB1c2UgZ2V0dGV4dCwgYW5kIGFkZCBzdXBwb3J0IGZvciBzcGVjaWZpYwogICAgICAjIGxhbmd1YWdlcy4KICAgICAgIyBGb3Igc29tZSByZWFzb24sIEFMTF9MSU5HVUFTIGhhcyB0byBiZSBiZWZvcmUgQU0tR05VLUdFVFRFWFQKICAgICAgQUxMX0xJTkdVQVM9ImRlIGZyIgoKICAgICAgIyBEb24ndCBjYWxsIEFNLUdOVS1HRVRURVhUIGhlcmUuIEluc3RlYWQsIGFzc3VtZSBnbGliYy4KICAgICAgQUNfQ0hFQ0tfUFJPRyhjaGVja19tc2dmbXQsIG1zZ2ZtdCwgeWVzLCBubykKICAgICAgaWYgdGVzdCB4IiRjaGVja19tc2dmbXQiID0geCJ5ZXMiICYmIHRlc3QgeCIkZW5hYmxlX25scyIgPSB4InllcyI7IHRoZW4KICAgICAgICBVU0VfTkxTPXllcwogICAgICBmaQogICAgICAjIEV4cG9ydCB0aGUgYnVpbGQgb2JqZWN0cy4KICAgICAgZm9yIGxpbmcgaW4gJEFMTF9MSU5HVUFTOyBkbyBcCiAgICAgICAgZ2xpYmN4eF9NT0ZJTEVTPSIkZ2xpYmN4eF9NT0ZJTEVTICRsaW5nLm1vIjsgXAogICAgICAgIGdsaWJjeHhfUE9GSUxFUz0iJGdsaWJjeHhfUE9GSUxFUyAkbGluZy5wbyI7IFwKICAgICAgZG9uZQogICAgICBBQ19TVUJTVChnbGliY3h4X01PRklMRVMpCiAgICAgIEFDX1NVQlNUKGdsaWJjeHhfUE9GSUxFUykKCiAgICAgIENMT0NBTEVfSD1jb25maWcvbG9jYWxlL2dudS9jX2xvY2FsZS5oCiAgICAgIENMT0NBTEVfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvY19sb2NhbGUuY2MKICAgICAgQ0NPREVDVlRfSD1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvY29kZWN2dF9zcGVjaWFsaXphdGlvbnMuaAogICAgICBDQ09ERUNWVF9DQz1jb25maWcvbG9jYWxlL2dudS9jb2RlY3Z0X21lbWJlcnMuY2MKICAgICAgQ0NPTExBVEVfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvY29sbGF0ZV9tZW1iZXJzLmNjCiAgICAgIENDVFlQRV9DQz1jb25maWcvbG9jYWxlL2dudS9jdHlwZV9tZW1iZXJzLmNjCiAgICAgIENNRVNTQUdFU19IPWNvbmZpZy9sb2NhbGUvZ251L21lc3NhZ2VzX21lbWJlcnMuaAogICAgICBDTUVTU0FHRVNfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvbWVzc2FnZXNfbWVtYmVycy5jYwogICAgICBDTU9ORVlfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvbW9uZXRhcnlfbWVtYmVycy5jYwogICAgICBDTlVNRVJJQ19DQz1jb25maWcvbG9jYWxlL2dudS9udW1lcmljX21lbWJlcnMuY2MKICAgICAgQ1RJTUVfSD1jb25maWcvbG9jYWxlL2dudS90aW1lX21lbWJlcnMuaAogICAgICBDVElNRV9DQz1jb25maWcvbG9jYWxlL2dudS90aW1lX21lbWJlcnMuY2MKICAgICAgQ0xPQ0FMRV9JTlRFUk5BTF9IPWNvbmZpZy9sb2NhbGUvZ251L2MrK2xvY2FsZV9pbnRlcm5hbC5oCiAgICAgIDs7CiAgICBpZWVlXzEwMDMuMS0yMDAxKQogICAgICBBQ19NU0dfUkVTVUxUKElFRUUgMTAwMy4xKQoKICAgICAgQ0xPQ0FMRV9IPWNvbmZpZy9sb2NhbGUvaWVlZV8xMDAzLjEtMjAwMS9jX2xvY2FsZS5oCiAgICAgIENMT0NBTEVfQ0M9Y29uZmlnL2xvY2FsZS9pZWVlXzEwMDMuMS0yMDAxL2NfbG9jYWxlLmNjCiAgICAgIENDT0RFQ1ZUX0g9Y29uZmlnL2xvY2FsZS9pZWVlXzEwMDMuMS0yMDAxL2NvZGVjdnRfc3BlY2lhbGl6YXRpb25zLmgKICAgICAgQ0NPREVDVlRfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NvZGVjdnRfbWVtYmVycy5jYwogICAgICBDQ09MTEFURV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY29sbGF0ZV9tZW1iZXJzLmNjCiAgICAgIENDVFlQRV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY3R5cGVfbWVtYmVycy5jYwogICAgICBDTUVTU0FHRVNfSD1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvbWVzc2FnZXNfbWVtYmVycy5oCiAgICAgIENNRVNTQUdFU19DQz1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvbWVzc2FnZXNfbWVtYmVycy5jYwogICAgICBDTU9ORVlfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21vbmV0YXJ5X21lbWJlcnMuY2MKICAgICAgQ05VTUVSSUNfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL251bWVyaWNfbWVtYmVycy5jYwogICAgICBDVElNRV9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy90aW1lX21lbWJlcnMuaAogICAgICBDVElNRV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvdGltZV9tZW1iZXJzLmNjCiAgICAgIENMT0NBTEVfSU5URVJOQUxfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvYysrbG9jYWxlX2ludGVybmFsLmgKICAgICAgOzsKICBlc2FjCgogICMgVGhpcyBpcyB3aGVyZSB0aGUgdGVzdHN1aXRlIGxvb2tzIGZvciBsb2NhbGUgY2F0YWxvZ3MsIHVzaW5nIHRoZQogICMgLURMT0NBTEVESVIgZGVmaW5lIGR1cmluZyB0ZXN0c3VpdGUgY29tcGlsYXRpb24uCiAgZ2xpYmN4eF9sb2NhbGVkaXI9JHtnbGliY3h4X2J1aWxkZGlyfS9wby9zaGFyZS9sb2NhbGUKICBBQ19TVUJTVChnbGliY3h4X2xvY2FsZWRpcikKCiAgIyBBIHN0YW5kYWxvbmUgbGliaW50bCAoZS5nLiwgR05VIGxpYmludGwpIG1heSBiZSBpbiB1c2UuCiAgaWYgdGVzdCAkVVNFX05MUyA9IHllczsgdGhlbgogICAgQUNfQ0hFQ0tfSEVBREVSUyhbbGliaW50bC5oXSwgW10sIFVTRV9OTFM9bm8pCiAgICBBQ19TRUFSQ0hfTElCUyhnZXR0ZXh0LCBpbnRsLCBbXSwgVVNFX05MUz1ubykKICBmaQogIGlmIHRlc3QgJFVTRV9OTFMgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfTkxTKQogIGZpCgogIEFDX1NVQlNUKFVTRV9OTFMpCiAgQUNfU1VCU1QoQ0xPQ0FMRV9IKQogIEFDX1NVQlNUKENDT0RFQ1ZUX0gpCiAgQUNfU1VCU1QoQ01FU1NBR0VTX0gpCiAgQUNfU1VCU1QoQ0NPREVDVlRfQ0MpCiAgQUNfU1VCU1QoQ0NPTExBVEVfQ0MpCiAgQUNfU1VCU1QoQ0NUWVBFX0NDKQogIEFDX1NVQlNUKENNRVNTQUdFU19DQykKICBBQ19TVUJTVChDTU9ORVlfQ0MpCiAgQUNfU1VCU1QoQ05VTUVSSUNfQ0MpCiAgQUNfU1VCU1QoQ1RJTUVfSCkKICBBQ19TVUJTVChDVElNRV9DQykKICBBQ19TVUJTVChDTE9DQUxFX0NDKQogIEFDX1NVQlNUKENMT0NBTEVfSU5URVJOQUxfSCkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGljaCBzdGQ6OmFsbG9jYXRvciBiYXNlIGNsYXNzIHRvIHVzZS4gIFRoZSBjaG9pY2UgaXMKZG5sIG1hcHBlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IG9mIGluY2x1ZGUvZXh0LgpkbmwKZG5sIERlZmF1bHQgaXMgbmV3LgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0FMTE9DQVRPUl0sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdGQ6OmFsbG9jYXRvciBiYXNlIGNsYXNzIHRvIHVzZV0pCiAgR0xJQkNYWF9FTkFCTEUobGlic3RkY3h4LWFsbG9jYXRvcixhdXRvLFs9S0lORF0sCiAgICBbdXNlIEtJTkQgZm9yIHRhcmdldCBzdGQ6OmFsbG9jYXRvciBiYXNlXSwKICAgIFtwZXJtaXQgbmV3fG1hbGxvY3xtdHxiaXRtYXB8cG9vbHx5ZXN8bm98YXV0b10pCiAgIyBJZiB0aGV5IGRpZG4ndCB1c2UgdGhpcyBvcHRpb24gc3dpdGNoLCBvciBpZiB0aGV5IHNwZWNpZmllZCAtLWVuYWJsZQogICMgd2l0aCBubyBzcGVjaWZpYyBtb2RlbCwgd2UnbGwgaGF2ZSB0byBsb29rIGZvciBvbmUuICBJZiB0aGV5CiAgIyBzcGVjaWZpZWQgLS1kaXNhYmxlICg/Pz8pLCBkbyBsaWtld2lzZS4KICBpZiB0ZXN0ICRlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvciA9IG5vIHx8IHRlc3QgJGVuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yID0geWVzOyB0aGVuCiAgICAgZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3I9YXV0bwogIGZpCgogICMgRWl0aGVyIGEga25vd24gcGFja2FnZSwgb3IgImF1dG8iCiAgZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3JfZmxhZz0kZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3IKCiAgIyBQcm9iZSBmb3IgaG9zdC1zcGVjaWZpYyBzdXBwb3J0IGlmIG5vIHNwZWNpZmljIG1vZGVsIGlzIHNwZWNpZmllZC4KICAjIERlZmF1bHQgdG8gIm5ldyIuCiAgaWYgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3JfZmxhZyA9IGF1dG87IHRoZW4KICAgIGNhc2UgJHt0YXJnZXRfb3N9IGluCiAgICAgICopCiAgICAgICAgZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3JfZmxhZz1uZXcKICAgICAgICA7OwogICAgZXNhYwogIGZpCiAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3JfZmxhZykKICAKCiAgIyBTZXQgY29uZmlndXJlIGJpdHMgZm9yIHNwZWNpZmllZCBsb2NhbGUgcGFja2FnZQogIGNhc2UgJHtlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvcl9mbGFnfSBpbgogICAgYml0bWFwKQogICAgICBBTExPQ0FUT1JfSD1jb25maWcvYWxsb2NhdG9yL2JpdG1hcF9hbGxvY2F0b3JfYmFzZS5oCiAgICAgIEFMTE9DQVRPUl9OQU1FPV9fZ251X2N4eDo6Yml0bWFwX2FsbG9jYXRvcgogICAgICA7OwogICAgbWFsbG9jKQogICAgICBBTExPQ0FUT1JfSD1jb25maWcvYWxsb2NhdG9yL21hbGxvY19hbGxvY2F0b3JfYmFzZS5oCiAgICAgIEFMTE9DQVRPUl9OQU1FPV9fZ251X2N4eDo6bWFsbG9jX2FsbG9jYXRvcgogICAgICA7OwogICAgbXQpCiAgICAgIEFMTE9DQVRPUl9IPWNvbmZpZy9hbGxvY2F0b3IvbXRfYWxsb2NhdG9yX2Jhc2UuaAogICAgICBBTExPQ0FUT1JfTkFNRT1fX2dudV9jeHg6Ol9fbXRfYWxsb2MKICAgICAgOzsKICAgIG5ldykKICAgICAgQUxMT0NBVE9SX0g9Y29uZmlnL2FsbG9jYXRvci9uZXdfYWxsb2NhdG9yX2Jhc2UuaAogICAgICBBTExPQ0FUT1JfTkFNRT1fX2dudV9jeHg6Om5ld19hbGxvY2F0b3IKICAgICAgOzsKICAgIHBvb2wpCiAgICAgIEFMTE9DQVRPUl9IPWNvbmZpZy9hbGxvY2F0b3IvcG9vbF9hbGxvY2F0b3JfYmFzZS5oCiAgICAgIEFMTE9DQVRPUl9OQU1FPV9fZ251X2N4eDo6X19wb29sX2FsbG9jCiAgICAgIDs7CQogIGVzYWMKCiAgQUNfU1VCU1QoQUxMT0NBVE9SX0gpCiAgQUNfU1VCU1QoQUxMT0NBVE9SX05BTUUpCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2hldGhlciB0aGUgQm9vc3QtZGVyaXZlZCBjaGVja3Mgc2hvdWxkIGJlIHR1cm5lZCBvbi4KZG5sCmRubCAtLWVuYWJsZS1jb25jZXB0LWNoZWNrcyB0dXJucyB0aGVtIG9uLgpkbmwgLS1kaXNhYmxlLWNvbmNlcHQtY2hlY2tzIGxlYXZlcyB0aGVtIG9mZi4KZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0NPTkNFUFRfQ0hFQ0tTWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfQ09OQ0VQVF9DSEVDS1NdLCBbCiAgR0xJQkNYWF9FTkFCTEUoY29uY2VwdC1jaGVja3MsJDEsLFt1c2UgQm9vc3QtZGVyaXZlZCB0ZW1wbGF0ZSBjaGVja3NdKQogIGlmIHRlc3QgJGVuYWJsZV9jb25jZXB0X2NoZWNrcyA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX0NPTkNFUFRfQ0hFQ0tTKQogIGZpCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2hpY2ggSS9PIGxpYnJhcnkgdG8gdXNlOiAgc3RkaW8sIG9yIHNvbWV0aGluZyBzcGVjaWZpYy4KZG5sCmRubCBEZWZhdWx0IGlzIHN0ZGlvLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0NTVERJT10sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB1bmRlcmx5aW5nIEkvTyB0byB1c2VdKQogIEdMSUJDWFhfRU5BQkxFKGNzdGRpbyxzdGRpbyxbPVBBQ0tBR0VdLAogICAgW3VzZSB0YXJnZXQtc3BlY2lmaWMgSS9PIHBhY2thZ2VdLCBbcGVybWl0IHN0ZGlvXSkKCiAgIyBOb3cgdGhhdCBsaWJpbyBoYXMgYmVlbiByZW1vdmVkLCB5b3UgY2FuIGhhdmUgYW55IGNvbG9yIHlvdSB3YW50IGFzIGxvbmcKICAjIGFzIGl0J3MgYmxhY2suICBUaGlzIGlzIG9uZSBiaWcgbm8tb3AgdW50aWwgb3RoZXIgcGFja2FnZXMgYXJlIGFkZGVkLCBidXQKICAjIHNob3dpbmcgdGhlIGZyYW1ld29yayBuZXZlciBodXJ0cy4KICBjYXNlICR7ZW5hYmxlX2NzdGRpb30gaW4KICAgIHN0ZGlvKQogICAgICBDU1RESU9fSD1jb25maWcvaW8vY19pb19zdGRpby5oCiAgICAgIEJBU0lDX0ZJTEVfSD1jb25maWcvaW8vYmFzaWNfZmlsZV9zdGRpby5oCiAgICAgIEJBU0lDX0ZJTEVfQ0M9Y29uZmlnL2lvL2Jhc2ljX2ZpbGVfc3RkaW8uY2MKICAgICAgQUNfTVNHX1JFU1VMVChzdGRpbykKICAgICAgOzsKICBlc2FjCgogIEFDX1NVQlNUKENTVERJT19IKQogIEFDX1NVQlNUKEJBU0lDX0ZJTEVfSCkKICBBQ19TVUJTVChCQVNJQ19GSUxFX0NDKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yICJ1bnVzdWFsIiBmbGFncyB0byBwYXNzIHRvIHRoZSBjb21waWxlciB3aGlsZSBidWlsZGluZy4KZG5sCmRubCAtLWVuYWJsZS1jeHgtZmxhZ3M9Jy1mb28gLWJhciAtYmF6JyBpcyBhIGdlbmVyYWwgbWV0aG9kIGZvciBwYXNzaW5nCmRubCAgICAgZXhwZXJpbWVudGFsIGZsYWdzIHN1Y2ggYXMgLWZwY2gsIC1mSU1JLCAtRGZsb2F0PWNoYXIsIGV0Yy4KZG5sIC0tZGlzYWJsZS1jeHgtZmxhZ3MgcGFzc2VzIG5vdGhpbmcuCmRubCAgKyAgU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMC1xMi9tc2cwMDEzMS5odG1sCmRubCAgICAgICAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMC1xMi9tc2cwMDI4NC5odG1sCmRubCAgICAgICAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMC1xMS9tc2cwMDAzNS5odG1sCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9DWFhfRkxBR1MoZGVmYXVsdCBmbGFncykKZG5sICAgICAgIElmICJkZWZhdWx0IGZsYWdzIiBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUKZG5sICAgICAgIGFzIC0tZGlzYWJsZSBvciAtLWVuYWJsZT1uby4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9DWFhfRkxBR1NdLCBbZG5sCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZXh0cmEgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nXSkKICBHTElCQ1hYX0VOQUJMRShjeHgtZmxhZ3MsJDEsWz1GTEFHU10sCiAgICBbcGFzcyBjb21waWxlciBGTEFHUyB3aGVuIGJ1aWxkaW5nIGxpYnJhcnldLAogICAgW2Nhc2UgIngkZW5hYmxlX2N4eF9mbGFncyIgaW4KICAgICAgeG5vIHwgeCkgICBlbmFibGVfY3h4X2ZsYWdzPSA7OwogICAgICB4LSopICAgICAgIDs7CiAgICAgICopICAgICAgICAgQUNfTVNHX0VSUk9SKF9nX3N3aXRjaCBuZWVkcyBjb21waWxlciBmbGFncyBhcyBhcmd1bWVudHMpIDs7CiAgICAgZXNhY10pCgogICMgUnVuIHRocm91Z2ggZmxhZ3MgKGVpdGhlciBkZWZhdWx0IG9yIGNvbW1hbmQtbGluZSkgYW5kIHNldCBhbnl0aGluZwogICMgZXh0cmEgKGUuZy4sICNkZWZpbmVzKSB0aGF0IG11c3QgYWNjb21wYW55IHBhcnRpY3VsYXIgZysrIG9wdGlvbnMuCiAgaWYgdGVzdCAtbiAiJGVuYWJsZV9jeHhfZmxhZ3MiOyB0aGVuCiAgICBmb3IgZiBpbiAkZW5hYmxlX2N4eF9mbGFnczsgZG8KICAgICAgY2FzZSAiJGYiIGluCiAgICAgICAgLWZob25vci1zdGQpICA7OwogICAgICAgIC0qKSAgOzsKICAgICAgICAqKSAgICMgYW5kIHdlJ3JlIHRyeWluZyB0byBwYXNzIC93aGF0LyBleGFjdGx5PwogICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtjb21waWxlciBmbGFncyBzdGFydCB3aXRoIGEgLV0pIDs7CiAgICAgIGVzYWMKICAgIGRvbmUKICBmaQoKICBFWFRSQV9DWFhfRkxBR1M9IiRlbmFibGVfY3h4X2ZsYWdzIgogIEFDX01TR19SRVNVTFQoJEVYVFJBX0NYWF9GTEFHUykKICBBQ19TVUJTVChFWFRSQV9DWFhfRkxBR1MpCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2lkZSBjaGFyYWN0ZXIgc3VwcG9ydC4gIEhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdGhlIG9wdGlvbgpkbmwgaW4gZ2NjJ3MgY29uZmlndXJlLCBidXQgaW4gYSBmb3JtIHRoYXQgYXV0b2NvbmYgY2FuIG1lc3Mgd2l0aC4KZG5sCmRubCAtLWVuYWJsZS1jLW1iY2hhciByZXF1ZXN0cyBhbGwgdGhlIHdjaGFyX3Qgc3R1ZmYuCmRubCAtLWRpc2FibGUtYy1tYmNoYXIgZG9lc24ndC4KZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0NfTUJDSEFSWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfQ19NQkNIQVJdLCBbCiAgR0xJQkNYWF9FTkFCTEUoYy1tYmNoYXIsJDEsLFtlbmFibGUgbXVsdGlieXRlICh3aWRlKSBjaGFyYWN0ZXJzXSkKICAjIE9wdGlvbiBwYXJzZWQsIG5vdyBvdGhlciBzY3JpcHRzIGNhbiB0ZXN0IGVuYWJsZV9jX21iY2hhciBmb3IgeWVzL25vLgpdKQoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIGlmIGRlYnVnZ2luZyBsaWJyYXJpZXMgYXJlIHRvIGJlIGJ1aWx0LgpkbmwKZG5sIC0tZW5hYmxlLWxpYnN0ZGN4eC1kZWJ1ZwpkbmwgYnVpbGRzIGEgc2VwYXJhdGUgc2V0IG9mIGRlYnVnZ2luZyBsaWJyYXJpZXMgaW4gYWRkaXRpb24gdG8gdGhlCmRubCBub3JtYWwgKHNoYXJlZCwgc3RhdGljKSBsaWJzdGRjKysgYmluYXJpZXMuCmRubApkbmwgLS1kaXNhYmxlLWxpYnN0ZGN4eC1kZWJ1ZwpkbmwgYnVpbGRzIG9ubHkgb25lIChub24tZGVidWcpIHZlcnNpb24gb2YgbGlic3RkYysrLgpkbmwKZG5sIC0tZW5hYmxlLWxpYnN0ZGN4eC1kZWJ1Zy1mbGFncz1GTEFHUwpkbmwgaWZmIC0tZW5hYmxlLWRlYnVnID09IHllcywgdGhlbiB1c2UgRkxBR1MgdG8gYnVpbGQgdGhlIGRlYnVnIGxpYnJhcnkuCmRubApkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfREVCVUdbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9ERUJVR10sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhZGRpdGlvbmFsIGRlYnVnIGJ1aWxkXSkKICBHTElCQ1hYX0VOQUJMRShsaWJzdGRjeHgtZGVidWcsJDEsLFtidWlsZCBleHRyYSBkZWJ1ZyBsaWJyYXJ5XSkKICBBQ19NU0dfUkVTVUxUKCRlbmFibGVfbGlic3RkY3h4X2RlYnVnKQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9CVUlMRF9ERUJVRywgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1ZyA9IHllcykKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBleHBsaWNpdCBkZWJ1ZyBmbGFncy4KZG5sCmRubCAtLWVuYWJsZS1saWJzdGRjeHgtZGVidWctZmxhZ3M9Jy1PMScKZG5sIGlzIGEgZ2VuZXJhbCBtZXRob2QgZm9yIHBhc3NpbmcgZmxhZ3MgdG8gYmUgdXNlZCB3aGVuCmRubCBidWlsZGluZyBkZWJ1ZyBsaWJyYXJpZXMgd2l0aCAtLWVuYWJsZS1kZWJ1Zy4KZG5sCmRubCAtLWRpc2FibGUtbGlic3RkY3h4LWRlYnVnLWZsYWdzIGRvZXMgbm90aGluZy4KZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0RFQlVHX0ZMQUdTKGRlZmF1bHQgZmxhZ3MpCmRubCAgICAgICBJZiAiZGVmYXVsdCBmbGFncyIgaXMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lCmRubCAgICAgICBhcyAtLWRpc2FibGUgb3IgLS1lbmFibGU9bm8uCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfREVCVUdfRkxBR1NdLCBbCiAgR0xJQkNYWF9FTkFCTEUobGlic3RkY3h4LWRlYnVnLWZsYWdzLFskMV0sWz1GTEFHU10sCiAgICBbcGFzcyBjb21waWxlciBGTEFHUyB3aGVuIGJ1aWxkaW5nIGRlYnVnIGxpYnJhcnldLAogICAgW2Nhc2UgIngkZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1Z19mbGFncyIgaW4KICAgICAgeG5vIHwgeCkgICAgZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1Z19mbGFncz0gOzsKICAgICAgeC0qKSAgICAgICAgOzsKICAgICAgKikgICAgICAgICAgQUNfTVNHX0VSUk9SKF9nX3N3aXRjaCBuZWVkcyBjb21waWxlciBmbGFncyBhcyBhcmd1bWVudHMpIDs7CiAgICAgZXNhY10pCgogICMgT3B0aW9uIHBhcnNlZCwgbm93IHNldCB0aGluZ3MgYXBwcm9wcmlhdGVseQogIERFQlVHX0ZMQUdTPSIkZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1Z19mbGFncyIKICBBQ19TVUJTVChERUJVR19GTEFHUykKCiAgQUNfTVNHX05PVElDRShbRGVidWcgYnVpbGQgZmxhZ3Mgc2V0IHRvICRERUJVR19GTEFHU10pCl0pCgoKZG5sCmRubCBDaGVjayBpZiB0aGUgdXNlciBvbmx5IHdhbnRzIGEgZnJlZXN0YW5kaW5nIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uCmRubApkbmwgLS1kaXNhYmxlLWhvc3RlZC1saWJzdGRjeHggd2lsbCB0dXJuIG9mZiBtb3N0IG9mIHRoZSBsaWJyYXJ5IGJ1aWxkLApkbmwgaW5zdGFsbGluZyBvbmx5IHRoZSBoZWFkZXJzIHJlcXVpcmVkIGJ5IFsxNy40LjEuM10gYW5kIHRoZSBsYW5ndWFnZQpkbmwgc3VwcG9ydCBsaWJyYXJ5LiAgTW9yZSB0aGFuIHRoYXQgd2lsbCBiZSBidWlsdCAodG8ga2VlcCB0aGUgTWFrZWZpbGVzCmRubCBjb252ZW5pZW50bHkgY2xlYW4pLCBidXQgbm90IGluc3RhbGxlZC4KZG5sCmRubCBTZXRzOgpkbmwgIGlzX2hvc3RlZCAgKHllcy9ubykKZG5sCmRubCBEZWZpbmVzOgpkbmwgIF9HTElCQ1hYX0hPU1RFRCAgIChhbHdheXMgZGVmaW5lZCwgZWl0aGVyIHRvIDEgb3IgMCkKZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9IT1NURURdLCBbCiAgQUNfQVJHX0VOQUJMRShbaG9zdGVkLWxpYnN0ZGN4eF0sCiAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWhvc3RlZC1saWJzdGRjeHhdLAogICAgICAgICAgICAgICAgICAgW29ubHkgYnVpbGQgZnJlZXN0YW5kaW5nIEMrKyBydW50aW1lIHN1cHBvcnRdKSwsCiAgICBbZW5hYmxlX2hvc3RlZF9saWJzdGRjeHg9eWVzXSkKICBpZiB0ZXN0ICIkZW5hYmxlX2hvc3RlZF9saWJzdGRjeHgiID0gbm87IHRoZW4KICAgIEFDX01TR19OT1RJQ0UoW09ubHkgZnJlZXN0YW5kaW5nIGxpYnJhcmllcyB3aWxsIGJlIGJ1aWx0XSkKICAgIGlzX2hvc3RlZD1ubwogICAgaG9zdGVkX2RlZmluZT0wCiAgICBlbmFibGVfYWJpX2NoZWNrPW5vCiAgICBlbmFibGVfbGlic3RkY3h4X3BjaD1ubwogIGVsc2UKICAgIGlzX2hvc3RlZD15ZXMKICAgIGhvc3RlZF9kZWZpbmU9MQogIGZpCiAgR0xJQkNYWF9DT05ESVRJT05BTChHTElCQ1hYX0hPU1RFRCwgdGVzdCAkaXNfaG9zdGVkID0geWVzKQogIEFDX0RFRklORV9VTlFVT1RFRChfR0xJQkNYWF9IT1NURUQsICRob3N0ZWRfZGVmaW5lLAogICAgW0RlZmluZSB0byAxIGlmIGEgZnVsbCBob3N0ZWQgbGlicmFyeSBpcyBidWlsdCwgb3IgMCBpZiBmcmVlc3RhbmRpbmcuXSkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIHRoZSAnbG9uZyBsb25nJyB0eXBlIGV4dGVuc2lvbi4KZG5sIFRoZSByZXN1bHQgZGV0ZXJtaW5lcyBvbmx5IHdoZXRoZXIgJ2xvbmcgbG9uZycgSS9PIGlzIGVuYWJsZWQ7IHRoaW5ncwpkbmwgbGlrZSBudW1lcmljX2xpbWl0czw+IHNwZWNpYWxpemF0aW9ucyBhcmUgYWx3YXlzIGF2YWlsYWJsZS4KZG5sCmRubCAtLWVuYWJsZS1sb25nLWxvbmcgZGVmaW5lcyBfR0xJQkNYWF9VU0VfTE9OR19MT05HCmRubCAtLWRpc2FibGUtbG9uZy1sb25nIGxlYXZlcyBfR0xJQkNYWF9VU0VfTE9OR19MT05HIHVuZGVmaW5lZApkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfTE9OR19MT05HWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfTE9OR19MT05HXSwgWwogIEdMSUJDWFhfRU5BQkxFKGxvbmctbG9uZywkMSwsW2VuYWJsZXMgSS9PIHN1cHBvcnQgZm9yICdsb25nIGxvbmcnXSkKICBpZiB0ZXN0ICRlbmFibGVfbG9uZ19sb25nID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0xPTkdfTE9ORykKICBmaQpdKQoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIGlmIGJ1aWxkaW5nIGFuZCB1c2luZyBhIEMrKyBwcmVjb21waWxlZCBoZWFkZXIgY2FuIGJlIGRvbmUuCmRubApkbmwgLS1lbmFibGUtbGlic3RkY3h4LXBjaD15ZXMKZG5sIGRlZmF1bHQsIHRoaXMgc2hvd3MgaW50ZW50IHRvIHVzZSBzdGRjKysuaC5nY2ggSWYgaXQgbG9va3MgbGlrZSBpdApkbmwgbWF5IHdvcmssIGFmdGVyIHNvbWUgbGlnaHQtaGVhcnRlZCBhdHRlbXB0cyB0byBwdXp6bGUgb3V0IGNvbXBpbGVyCmRubCBzdXBwb3J0LCBmbGlwIGJpdHMgb24gaW4gaW5jbHVkZS9NYWtlZmlsZS5hbQpkbmwKZG5sIC0tZGlzYWJsZS1saWJzdGRjeHgtcGNoCmRubCB0dXJucyBvZmYgYXR0ZW1wdHMgdG8gdXNlIG9yIGJ1aWxkIHN0ZGMrKy5oLmdjaC4KZG5sCmRubCBTdWJzdHM6CmRubCAgZ2xpYmN4eF9QQ0hGTEFHUwpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX1BDSF0sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlbmFibGVkIFBDSF0pCiAgR0xJQkNYWF9FTkFCTEUobGlic3RkY3h4LXBjaCwkMSwsW2J1aWxkIHByZS1jb21waWxlZCBsaWJzdGRjKysgaGVhZGVyc10pCiAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9saWJzdGRjeHhfcGNoXSkKCiAgaWYgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9wY2ggPSB5ZXM7IHRoZW4KICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgY29tcGlsZXIgd2l0aCBQQ0ggc3VwcG9ydF0sCiAgICAgIFtnbGliY3h4X2N2X3Byb2dfQ1hYX3BjaF0sCiAgICAgIFthY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCiAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTIC1XZXJyb3IgLVdpbnZhbGlkLXBjaCAtV25vLWRlcHJlY2F0ZWQiCiAgICAgICBBQ19MQU5HX1NBVkUKICAgICAgIEFDX0xBTkdfQ1BMVVNQTFVTCiAgICAgICBlY2hvICcjaW5jbHVkZSA8bWF0aC5oPicgPiBjb25mdGVzdC5oCiAgICAgICBpZiAkQ1hYICRDWFhGTEFHUyAkQ1BQRkxBR1MgLXggYysrLWhlYWRlciBjb25mdGVzdC5oIFwKCQkgICAgICAgICAgLW8gY29uZnRlc3QuaC5nY2ggMT4mNSAyPiYxICYmCgkgICAgICAgIGVjaG8gJyNlcnJvciAicGNoIGZhaWxlZCInID4gY29uZnRlc3QuaCAmJgogICAgICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0ZXN0LmgiJyA+IGNvbmZ0ZXN0LmNjICYmCgkgICAgICAgJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LmNjIDE+JjUgMj4mMSA7CiAgICAgICB0aGVuCiAgICAgICAgIGdsaWJjeHhfY3ZfcHJvZ19DWFhfcGNoPXllcwogICAgICAgZWxzZQogICAgICAgICBnbGliY3h4X2N2X3Byb2dfQ1hYX3BjaD1ubwogICAgICAgZmkKICAgICAgIHJtIC1mIGNvbmZ0ZXN0KgogICAgICAgQ1hYRkxBR1M9JGFjX3NhdmVfQ1hYRkxBR1MKICAgICAgIEFDX0xBTkdfUkVTVE9SRQogICAgICBdKQogICAgZW5hYmxlX2xpYnN0ZGN4eF9wY2g9JGdsaWJjeHhfY3ZfcHJvZ19DWFhfcGNoCiAgZmkKCiAgR0xJQkNYWF9DT05ESVRJT05BTChHTElCQ1hYX0JVSUxEX1BDSCwgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9wY2ggPSB5ZXMpCiAgaWYgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9wY2ggPSB5ZXM7IHRoZW4KICAgIGdsaWJjeHhfUENIRkxBR1M9Ii1pbmNsdWRlIGJpdHMvc3RkYysrLmgiCiAgZWxzZQogICAgZ2xpYmN4eF9QQ0hGTEFHUz0iIgogIGZpCiAgQUNfU1VCU1QoZ2xpYmN4eF9QQ0hGTEFHUykKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBleGNlcHRpb24gaGFuZGxpbmcgc3VwcG9ydC4gIElmIGFuIGV4cGxpY2l0IGVuYWJsZS9kaXNhYmxlCmRubCBzamxqIGV4Y2VwdGlvbnMgaXMgZ2l2ZW4sIHdlIGRvbid0IGhhdmUgdG8gZGV0ZWN0LiAgT3RoZXJ3aXNlIHRoZQpkbmwgdGFyZ2V0IG1heSBvciBtYXkgbm90IHN1cHBvcnQgY2FsbCBmcmFtZSBleGNlcHRpb25zLgpkbmwKZG5sIC0tZW5hYmxlLXNqbGotZXhjZXB0aW9ucyBmb3JjZXMgdGhlIHVzZSBvZiBidWlsdGluIHNldGptcC4KZG5sIC0tZGlzYWJsZS1zamxqLWV4Y2VwdGlvbnMgZm9yY2VzIHRoZSB1c2Ugb2YgY2FsbCBmcmFtZSB1bndpbmRpbmcuCmRubCBOZWl0aGVyIG9uZSBmb3JjZXMgYW4gYXR0ZW1wdCBhdCBkZXRlY3Rpb24uCmRubApkbmwgRGVmaW5lczoKZG5sICBfR0xJQkNYWF9TSkxKX0VYQ0VQVElPTlMgaWYgdGhlIGNvbXBpbGVyIGlzIGNvbmZpZ3VyZWQgZm9yIGl0CmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfU0pMSl9FWENFUFRJT05TXSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIGV4Y2VwdGlvbiBtb2RlbCB0byB1c2VdKQogIEFDX0xBTkdfU0FWRQogIEFDX0xBTkdfQ1BMVVNQTFVTCiAgR0xJQkNYWF9FTkFCTEUoc2psai1leGNlcHRpb25zLGF1dG8sLAogICAgW2ZvcmNlIHVzZSBvZiBidWlsdGluX3NldGptcCBmb3IgZXhjZXB0aW9uc10sCiAgICBbcGVybWl0IHllc3xub3xhdXRvXSkKCiAgaWYgdGVzdCAkZW5hYmxlX3NqbGpfZXhjZXB0aW9ucyA9IGF1dG87IHRoZW4KICAgICMgQm90aGVyYXRpb24uICBOb3cgd2UndmUgZ290IHRvIGRldGVjdCB0aGUgZXhjZXB0aW9uIG1vZGVsLiAgTGluayB0ZXN0cwogICAgIyBhZ2FpbnN0IGxpYmdjYy5hIGFyZSBwcm9ibGVtYXRpYyBzaW5jZSB3ZSd2ZSBub3QgYmVlbiBnaXZlbiBwcm9wZXIgLUwKICAgICMgYml0cyBmb3Igc2luZ2xlLXRyZWUgbmV3bGliIGFuZCBsaWJnbG9zcy4KICAgICMKICAgICMgRmFrZSB3aGF0IEFDX1RSWV9DT01QSUxFIGRvZXMuICBYWFggTG9vayBhdCByZWRvaW5nIHRoaXMgbmV3LXN0eWxlLgogICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKc3RydWN0IFMgeyB+UygpOyB9Owp2b2lkIGJhcigpOwp2b2lkIGZvbygpCnsKICBTIHM7CiAgYmFyKCk7Cn0KRU9GCiAgICBvbGRfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICAgIENYWEZMQUdTPS1TCiAgICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgogICAgICBpZiBncmVwIF9VbndpbmRfU2pMal9SZXN1bWUgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCiAgICAgICAgZW5hYmxlX3NqbGpfZXhjZXB0aW9ucz15ZXMKICAgICAgZWxpZiBncmVwIF9VbndpbmRfUmVzdW1lIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgogICAgICAgIGVuYWJsZV9zamxqX2V4Y2VwdGlvbnM9bm8KICAgICAgZmkKICAgIGZpCiAgICBDWFhGTEFHUz0iJG9sZF9DWFhGTEFHUyIKICAgIHJtIC1mIGNvbmZ0ZXN0KgogIGZpCgogICMgVGhpcyBpcyBhIHRhZCB3ZWlyZCwgZm9yIGh5c3RlcmljYWwgcmFpc2lucy4gIFdlIGhhdmUgdG8gbWFwIGVuYWJsZS9kaXNhYmxlIAogICMgdG8gdHdvIGRpZmZlcmVudCBtb2RlbHMuCiAgY2FzZSAkZW5hYmxlX3NqbGpfZXhjZXB0aW9ucyBpbgogICAgeWVzKQogICAgICBBQ19ERUZJTkUoX0dMSUJDWFhfU0pMSl9FWENFUFRJT05TLCAxLAogICAgICAgIFtEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGlzIGNvbmZpZ3VyZWQgZm9yIHNldGptcC9sb25nam1wIGV4Y2VwdGlvbnMuXSkKICAgICAgYWNfZXhjZXB0aW9uX21vZGVsX25hbWU9c2psagogICAgICA7OwogICAgbm8pCiAgICAgIGFjX2V4Y2VwdGlvbl9tb2RlbF9uYW1lPSJjYWxsIGZyYW1lIgogICAgICA7OwogICAgKikKICAgICAgQUNfTVNHX0VSUk9SKFt1bmFibGUgdG8gZGV0ZWN0IGV4Y2VwdGlvbiBtb2RlbF0pCiAgICAgIDs7CiAgZXNhYwogQUNfTEFOR19SRVNUT1JFCiBBQ19NU0dfUkVTVUxUKCRhY19leGNlcHRpb25fbW9kZWxfbmFtZSkKXSkKCgpkbmwKZG5sIEFkZCB2ZXJzaW9uIHRhZ3MgdG8gc3ltYm9scyBpbiBzaGFyZWQgbGlicmFyeSAob3Igbm90KSwgYWRkaXRpb25hbGx5CmRubCBtYXJraW5nIG90aGVyIHN5bWJvbHMgYXMgcHJpdmF0ZS9sb2NhbCAob3Igbm90KS4KZG5sCmRubCAtLWVuYWJsZS1zeW12ZXJzPXN0eWxlIGFkZHMgYSB2ZXJzaW9uIHNjcmlwdCB0byB0aGUgbGlua2VyIGNhbGwgd2hlbgpkbmwgICAgICAgY3JlYXRpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgVGhlIGNob2ljZSBvZiB2ZXJzaW9uIHNjcmlwdCBpcwpkbmwgICAgICAgY29udHJvbGxlZCBieSAnc3R5bGUnLgpkbmwgLS1kaXNhYmxlLXN5bXZlcnMgZG9lcyBub3QuCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9TWU1WRVJTWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyICd5ZXMnIG9yICdubycuICBQYXNzaW5nIGB5ZXMnIHRyaWVzIHRvCmRubCAgICAgICBjaG9vc2UgYSBkZWZhdWx0IHN0eWxlIGJhc2VkIG9uIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuICBQYXNzaW5nCmRubCAgICAgICAnbm8nIGRpc2FibGVzIHZlcnNpb25pbmcuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfU1lNVkVSU10sIFsKCkdMSUJDWFhfRU5BQkxFKHN5bXZlcnMsJDEsWz1TVFlMRV0sCiAgW2VuYWJsZXMgc3ltYm9sIHZlcnNpb25pbmcgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5XSwKICBbcGVybWl0IHllc3xub3xnbnVdKQoKIyBJZiB3ZSBuZXZlciB3ZW50IHRocm91Z2ggdGhlIEdMSUJDWFhfQ0hFQ0tfTElOS0VSX0ZFQVRVUkVTIG1hY3JvLCB0aGVuIHdlCiMgZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgJExEIHRvIGRvIHRyaWNrcy4uLgpBQ19SRVFVSVJFKFtHTElCQ1hYX0NIRUNLX0xJTktFUl9GRUFUVVJFU10pCiMgRklYTUUgIFRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0b28gc3RyaWN0LCBpbiB0aGVvcnkuCmlmIHRlc3QgJGVuYWJsZV9zaGFyZWQgPSBubyB8fAogICAgICAgIHRlc3QgIngkTEQiID0geCB8fAogICAgICAgIHRlc3QgeCRnbGliY3h4X2dudV9sZF92ZXJzaW9uID0geDsgdGhlbgogIGVuYWJsZV9zeW12ZXJzPW5vCmZpCgojIENoZWNrIHRvIHNlZSBpZiBsaWJnY2NfcyBleGlzdHMsIGluZGljYXRpbmcgdGhhdCBzaGFyZWQgbGliZ2NjIGlzIHBvc3NpYmxlLgppZiB0ZXN0ICRlbmFibGVfc3ltdmVycyAhPSBubzsgdGhlbgogIEFDX01TR19DSEVDS0lORyhbZm9yIHNoYXJlZCBsaWJnY2NdKQogIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgogIENGTEFHUz0nIC1sZ2NjX3MnCiAgQUNfVFJZX0xJTksoLCBbcmV0dXJuIDA7XSwgZ2xpYmN4eF9zaGFyZWRfbGliZ2NjPXllcywgZ2xpYmN4eF9zaGFyZWRfbGliZ2NjPW5vKQogIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgogIGlmIHRlc3QgJGdsaWJjeHhfc2hhcmVkX2xpYmdjYyA9IG5vOyB0aGVuCiAgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCmludCBtYWluICh2b2lkKSB7IHJldHVybiAwOyB9CkVPRgpjaGFuZ2VxdW90ZSgsKWRubAogICAgZ2xpYmN4eF9saWJnY2Nfc19zdWZmaXg9YCR7Q0MtY2N9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIFwKCQkJICAgICAtc2hhcmVkIC1zaGFyZWQtbGliZ2NjIC1vIGNvbmZ0ZXN0LnNvIFwKCQkJICAgICBjb25mdGVzdC5jIC12IDI+JjEgPi9kZXYvbnVsbCBcCgkJCSAgICAgfCBzZWQgLW4gJ3MvXi4qIC1sZ2NjX3NcKFteIF0qXCkgLiokL1wxL3AnYApjaGFuZ2VxdW90ZShbLF0pZG5sCiAgICBybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0LnNvCiAgICBpZiB0ZXN0IHgke2dsaWJjeHhfbGliZ2NjX3Nfc3VmZml4K3NldH0gPSB4c2V0OyB0aGVuCiAgICAgIENGTEFHUz0iIC1sZ2NjX3MkZ2xpYmN4eF9saWJnY2Nfc19zdWZmaXgiCiAgICAgIEFDX1RSWV9MSU5LKCwgW3JldHVybiAwO10sIGdsaWJjeHhfc2hhcmVkX2xpYmdjYz15ZXMpCiAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgogICAgZmkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfc2hhcmVkX2xpYmdjYykKZmkKCiMgRm9yIEdOVSBsZCwgd2UgbmVlZCBhdCBsZWFzdCB0aGlzIHZlcnNpb24uICBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBpbgojIEdMSUJDWFhfQ0hFQ0tfTElOS0VSX0ZFQVRVUkVTIGFib3ZlLgpnbGliY3h4X21pbl9nbnVfbGRfdmVyc2lvbj0yMTQwMAojIFhYWFhYWFhYWFhYIGdsaWJjeHhfZ251X2xkX3ZlcnNpb249MjEzOTAKCiMgQ2hlY2sgdG8gc2VlIGlmIHVuc3BlY2lmaWVkICJ5ZXMiIHZhbHVlIGNhbiB3aW4sIGdpdmVuIHJlc3VsdHMgYWJvdmUuCiMgQ2hhbmdlICJ5ZXMiIGludG8gZWl0aGVyICJubyIgb3IgYSBzdHlsZSBuYW1lLgppZiB0ZXN0ICRlbmFibGVfc3ltdmVycyA9IHllczsgdGhlbgogIGlmIHRlc3QgJHdpdGhfZ251X2xkID0geWVzICYmCiAgICAgdGVzdCAkZ2xpYmN4eF9zaGFyZWRfbGliZ2NjID0geWVzOwogIHRoZW4KICAgIGlmIHRlc3QgJGdsaWJjeHhfZ251X2xkX3ZlcnNpb24gLWdlICRnbGliY3h4X21pbl9nbnVfbGRfdmVyc2lvbiA7IHRoZW4KICAgICAgZW5hYmxlX3N5bXZlcnM9Z251CiAgICBlbHNlCiAgICAgICMgVGhlIHJpZ2h0IHRvb2xzLCB0aGUgcmlnaHQgc2V0dXAsIGJ1dCB0b28gb2xkLiAgRmFsbGJhY2tzPwogICAgICBBQ19NU0dfV0FSTig9PT0gTGlua2VyIHZlcnNpb24gJGdsaWJjeHhfZ251X2xkX3ZlcnNpb24gaXMgdG9vIG9sZCBmb3IpCiAgICAgIEFDX01TR19XQVJOKD09PSBmdWxsIHN5bWJvbCB2ZXJzaW9uaW5nIHN1cHBvcnQgaW4gdGhpcyByZWxlYXNlIG9mIEdDQy4pCiAgICAgIEFDX01TR19XQVJOKD09PSBZb3Ugd291bGQgbmVlZCB0byB1cGdyYWRlIHlvdXIgYmludXRpbHMgdG8gdmVyc2lvbikKICAgICAgQUNfTVNHX1dBUk4oPT09ICRnbGliY3h4X21pbl9nbnVfbGRfdmVyc2lvbiBvciBsYXRlciBhbmQgcmVidWlsZCBHQ0MuKQogICAgICBpZiB0ZXN0ICRnbGliY3h4X2dudV9sZF92ZXJzaW9uIC1nZSAyMTIwMCA7IHRoZW4KICAgICAgICAjIEdsb2JiaW5nIGZpeCBpcyBwcmVzZW50LCBwcm9wZXIgYmxvY2sgc3VwcG9ydCBpcyBub3QuCiAgICAgICAgZG5sIEFDX01TR19XQVJOKFs9PT0gRHVkZSwgeW91IGFyZSBzb29vbyBjbG9zZS4gIE1heWJlIHdlIGNhbiBmYWtlIGl0Ll0pCiAgICAgICAgZG5sIGVuYWJsZV9zeW12ZXJzPT8/PwogICAgICAgIEFDX01TR19XQVJOKFs9PT0gU3ltYm9sIHZlcnNpb25pbmcgd2lsbCBiZSBkaXNhYmxlZC5dKQogICAgICAgIGVuYWJsZV9zeW12ZXJzPW5vCiAgICAgIGVsc2UKICAgICAgICAjIDIuMTEgb3Igb2xkZXIuCiAgICAgICAgQUNfTVNHX1dBUk4oWz09PSBTeW1ib2wgdmVyc2lvbmluZyB3aWxsIGJlIGRpc2FibGVkLl0pCiAgICAgICAgZW5hYmxlX3N5bXZlcnM9bm8KICAgICAgZmkKICAgIGZpCiAgZWxzZQogICAgIyBqdXN0IGZhaWwgZm9yIG5vdwogICAgQUNfTVNHX1dBUk4oWz09PSBZb3UgaGF2ZSByZXF1ZXN0ZWQgc29tZSBraW5kIG9mIHN5bWJvbCB2ZXJzaW9uaW5nLCBidXRdKQogICAgQUNfTVNHX1dBUk4oWz09PSBlaXRoZXIgeW91IGFyZSBub3QgdXNpbmcgYSBzdXBwb3J0ZWQgbGlua2VyLCBvciB5b3UgYXJlXSkKICAgIEFDX01TR19XQVJOKFs9PT0gbm90IGJ1aWxkaW5nIGEgc2hhcmVkIGxpYmdjY19zICh3aGljaCBpcyByZXF1aXJlZCkuXSkKICAgIEFDX01TR19XQVJOKFs9PT0gU3ltYm9sIHZlcnNpb25pbmcgd2lsbCBiZSBkaXNhYmxlZC5dKQogICAgZW5hYmxlX3N5bXZlcnM9bm8KICBmaQpmaQoKIyBFdmVyeXRoaW5nIHBhcnNlZDsgZmlndXJlIG91dCB3aGF0IGZpbGUgdG8gdXNlLgpjYXNlICRlbmFibGVfc3ltdmVycyBpbgogIG5vKQogICAgU1lNVkVSX01BUD1jb25maWcvbGlua2VyLW1hcC5kdW1teQogICAgOzsKICBnbnUpCiAgICBTWU1WRVJfTUFQPWNvbmZpZy9saW5rZXItbWFwLmdudQogICAgQUNfREVGSU5FKF9HTElCQ1hYX1NZTVZFUikKICAgIDs7CmVzYWMKCkFDX1NVQlNUKFNZTVZFUl9NQVApCkFDX1NVQlNUKHBvcnRfc3BlY2lmaWNfc3ltYm9sX2ZpbGVzKQpHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfQlVJTERfVkVSU0lPTkVEX1NITElCLCB0ZXN0ICRlbmFibGVfc3ltdmVycyAhPSBubykKQUNfTVNHX05PVElDRSh2ZXJzaW9uaW5nIG9uIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMgaXMgJGVuYWJsZV9zeW12ZXJzKQpdKQoKCmRubApkbmwgU2V0dXAgdG8gdXNlIHRoZSBnY2MgZ3Roci5oIHRocmVhZC1zcGVjaWZpYyBtZW1vcnkgYW5kIG11dGV4IG1vZGVsLgpkbmwgV2UgbXVzdCBzdGFnZSB0aGUgcmVxdWlyZWQgaGVhZGVycyBzbyB0aGF0IHRoZXkgd2lsbCBiZSBpbnN0YWxsZWQKZG5sIHdpdGggdGhlIGxpYnJhcnkgKHVubGlrZSBsaWJnY2MsIHRoZSBTVEwgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQKZG5sIHNvbGVseSB3aXRoaW4gaGVhZGVycykuICBTaW5jZSB3ZSBtdXN0IG5vdCBpbmplY3QgcmFuZG9tIHVzZXItc3BhY2UKZG5sIG1hY3JvIG5hbWVzIGludG8gdXNlci1wcm92aWRlZCBDKysgY29kZSwgd2UgZmlyc3Qgc3RhZ2UgaW50byA8ZmlsZT4taW4KZG5sIGFuZCBwcm9jZXNzIHRvIDxmaWxlPiB3aXRoIGFuIG91dHB1dCBjb21tYW5kLiAgVGhlIHJlYXNvbiBmb3IgYSB0d28tCmRubCBzdGFnZSBwcm9jZXNzIGhlcmUgaXMgdG8gY29ycmVjdGx5IGhhbmRsZSAkc3JjZGlyIT0kb2JqZGlyIHdpdGhvdXQKZG5sIGhhdmluZyB0byB3cml0ZSBjb21wbGV4IGNvZGUgKHRoZSBzZWQgY29tbWFuZHMgdG8gY2xlYW4gdGhlIG1hY3JvCmRubCBuYW1lc3BhY2UgYXJlIGNvbXBsZXggYW5kIGZyYWdpbGUgZW5vdWdoIGFzIGl0IGlzKS4gIFdlIG11c3QgYWxzbwpkbmwgYWRkIGEgcmVsYXRpdmUgcGF0aCBzbyB0aGF0IC1JLSBpcyBzdXBwb3J0ZWQgcHJvcGVybHkuCmRubApkbmwgU3Vic3RzOgpkbmwgIGdsaWJjeHhfdGhyZWFkX2gKZG5sCmRubCBEZWZpbmVzOgpkbmwgIEhBVkVfR1RIUl9ERUZBVUxUCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfVEhSRUFEU10sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB0aHJlYWQgbW9kZWwgdXNlZCBieSBHQ0NdKQogIHRhcmdldF90aHJlYWRfZmlsZT1gJENYWCAtdiAyPiYxIHwgc2VkIC1uICdzL15UaHJlYWQgbW9kZWw6IC8vcCdgCiAgQUNfTVNHX1JFU1VMVChbJHRhcmdldF90aHJlYWRfZmlsZV0pCgogIGlmIHRlc3QgJHRhcmdldF90aHJlYWRfZmlsZSAhPSBzaW5nbGU7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX0dUSFJfREVGQVVMVCkKICBmaQoKICBnbGliY3h4X3RocmVhZF9oPWd0aHItJHRhcmdldF90aHJlYWRfZmlsZS5oCiAgQUNfU1VCU1QoZ2xpYmN4eF90aHJlYWRfaCkKXSkKCgojIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCiMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCiMKIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCiMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCiMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgoKIyBzZXJpYWwgMQpBQ19ERUZVTihbQUNfTENfTUVTU0FHRVNdLCBbCiAgQUNfQ0hFQ0tfSEVBREVSKGxvY2FsZS5oLCBbCiAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYWNfY3ZfdmFsX0xDX01FU1NBR0VTLAogICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKICAgICAgIGFjX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFjX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQogICAgaWYgdGVzdCAkYWNfY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCiAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTKQogICAgZmkKICBdKQpdKQoKCnNpbmNsdWRlKFsuLi9saWJ0b29sLm00XSkKZG5sIFRoZSBsaW5lcyBiZWxvdyBhcnJhbmdlIGZvciBhY2xvY2FsIG5vdCB0byBicmluZyBhbiBpbnN0YWxsZWQKZG5sIGxpYnRvb2wubTQgaW50byBhY2xvY2FsLm00LCB3aGlsZSBzdGlsbCBhcnJhbmdpbmcgZm9yIGF1dG9tYWtlIHRvCmRubCBhZGQgYSBkZWZpbml0aW9uIG9mIExJQlRPT0wgdG8gTWFrZWZpbGUuaW4uCmlmZWxzZSgsLCxbQUNfU1VCU1QoTElCVE9PTCkKQUNfREVGVU4oW0FNX1BST0dfTElCVE9PTF0pCkFDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl0pCkFDX0RFRlVOKFtBQ19QUk9HX0xEXSkKXSkKCmRubCB2aW06ZXQ6dHM9Mjpzdz0yCgojIEFNX0NPTkRJVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KCiMgQ29weXJpZ2h0IDE5OTcsIDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCiMgYW55IGxhdGVyIHZlcnNpb24uCgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKIyAwMjExMS0xMzA3LCBVU0EuCgojIHNlcmlhbCA1CgpBQ19QUkVSRVEoMi41MikKCiMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKW2lmZWxzZShbJDFdLCBbVFJVRV0sICBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0sCiAgICAgICAgWyQxXSwgW0ZBTFNFXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubApBQ19TVUJTVChbJDFfVFJVRV0pCkFDX1NVQlNUKFskMV9GQUxTRV0pCmlmICQyOyB0aGVuCiAgJDFfVFJVRT0KICAkMV9GQUxTRT0nIycKZWxzZQogICQxX1RSVUU9JyMnCiAgJDFfRkFMU0U9CmZpCkFDX0NPTkZJR19DT01NQU5EU19QUkUoCltpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KICBBQ19NU0dfRVJST1IoW2NvbmRpdGlvbmFsICIkMSIgd2FzIG5ldmVyIGRlZmluZWQuClVzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll0pCmZpXSldKQoKIyBDb3B5cmlnaHQgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKIyBhbnkgbGF0ZXIgdmVyc2lvbi4KCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQojIDAyMTExLTEzMDcsIFVTQS4KCiMgc2VyaWFsIDMKCiMgQU1fRU5BQkxFX01VTFRJTElCKFtNQUtFRklMRV0sIFtSRUwtVE8tVE9QLVNSQ0RJUl0pCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQWRkIC0tZW5hYmxlLW11bHRpbGliIHRvIGNvbmZpZ3VyZS4KQUNfREVGVU4oW0FNX0VOQUJMRV9NVUxUSUxJQl0sClsjIERlZmF1bHQgdG8gLS1lbmFibGUtbXVsdGlsaWIKQUNfQVJHX0VOQUJMRShtdWx0aWxpYiwKWyAgLS1lbmFibGUtbXVsdGlsaWIgICAgICAgICBidWlsZCBtYW55IGxpYnJhcnkgdmVyc2lvbnMgKGRlZmF1bHQpXSwKW2Nhc2UgIiRlbmFibGV2YWwiIGluCiAgeWVzKSBtdWx0aWxpYj15ZXMgOzsKICBubykgIG11bHRpbGliPW5vIDs7CiAgKikgICBBQ19NU0dfRVJST1IoW2JhZCB2YWx1ZSAkZW5hYmxldmFsIGZvciBtdWx0aWxpYiBvcHRpb25dKSA7OwogZXNhY10sCiAgICAgICAgICAgICAgW211bHRpbGliPXllc10pCgojIFdlIG1heSBnZXQgb3RoZXIgb3B0aW9ucyB3aGljaCB3ZSBsZWF2ZSB1bmRvY3VtZW50ZWQ6CiMgLS13aXRoLXRhcmdldC1zdWJkaXIsIC0td2l0aC1tdWx0aXNyY3RvcCwgLS13aXRoLW11bHRpc3ViZGlyCiMgU2VlIGNvbmZpZy1tbC5pbiBpZiB5b3Ugd2FudCB0aGUgZ29yeSBkZXRhaWxzLgoKaWYgdGVzdCAiJHNyY2RpciIgPSAiLiI7IHRoZW4KICBpZiB0ZXN0ICIkd2l0aF90YXJnZXRfc3ViZGlyIiAhPSAiLiI7IHRoZW4KICAgIG11bHRpX2Jhc2VkaXI9IiRzcmNkaXIvJHdpdGhfbXVsdGlzcmN0b3AuLi8kMiIKICBlbHNlCiAgICBtdWx0aV9iYXNlZGlyPSIkc3JjZGlyLyR3aXRoX211bHRpc3JjdG9wJDIiCiAgZmkKZWxzZQogIG11bHRpX2Jhc2VkaXI9IiRzcmNkaXIvJDIiCmZpCkFDX1NVQlNUKG11bHRpX2Jhc2VkaXIpCgpBQ19PVVRQVVRfQ09NTUFORFMoWwojIE9ubHkgYWRkIG11bHRpbGliIHN1cHBvcnQgY29kZSBpZiB3ZSBqdXN0IHJlYnVpbHQgdGhlIHRvcC1sZXZlbAojIE1ha2VmaWxlLgpjYXNlICIgJENPTkZJR19GSUxFUyAiIGluCiAqIiBdbTRfZGVmYXVsdChbJDFdLE1ha2VmaWxlKVsgIiopCiAgIGFjX2ZpbGU9XW00X2RlZmF1bHQoWyQxXSxNYWtlZmlsZSlbIC4gJHttdWx0aV9iYXNlZGlyfS9jb25maWctbWwuaW4KICAgOzsKZXNhY10sCiAgICAgICAgICAgICAgICAgICBbCnNyY2Rpcj0iJHNyY2RpciIKaG9zdD0iJGhvc3QiCnRhcmdldD0iJHRhcmdldCIKd2l0aF9tdWx0aXN1YmRpcj0iJHdpdGhfbXVsdGlzdWJkaXIiCndpdGhfbXVsdGlzcmN0b3A9IiR3aXRoX211bHRpc3JjdG9wIgp3aXRoX3RhcmdldF9zdWJkaXI9IiR3aXRoX3RhcmdldF9zdWJkaXIiCmFjX2NvbmZpZ3VyZV9hcmdzPSIke211bHRpbGliX2FyZ30gJHthY19jb25maWd1cmVfYXJnc30iCm11bHRpX2Jhc2VkaXI9IiRtdWx0aV9iYXNlZGlyIgpDT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KQ0M9IiRDQyJdKV0pZG5sCgojIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KIyBGcm9tIEppbSBNZXllcmluZwoKIyBDb3B5cmlnaHQgMTk5NiwgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCiMgYW55IGxhdGVyIHZlcnNpb24uCgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKIyAwMjExMS0xMzA3LCBVU0EuCgojIHNlcmlhbCAyCgpBQ19ERUZVTihbQU1fTUFJTlRBSU5FUl9NT0RFXSwKW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQogIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAogIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLApbICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCiAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKICBBQ19NU0dfUkVTVUxUKFskVVNFX01BSU5UQUlORVJfTU9ERV0pCiAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCBbdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllc10pCiAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCiAgQUNfU1VCU1QoTUFJTlQpZG5sCl0KKQoKQVVfREVGVU4oW2ptX01BSU5UQUlORVJfTU9ERV0sIFtBTV9NQUlOVEFJTkVSX01PREVdKQoKIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCgojIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYKIyB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4gIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgoKIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMKIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKIyBhbnkgbGF0ZXIgdmVyc2lvbi4KCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQojIDAyMTExLTEzMDcsIFVTQS4KCiMgc2VyaWFsIDEwCgpBQ19QUkVSRVEoWzIuNTRdKQoKIyBBdXRvY29uZiAyLjUwIHdhbnRzIHRvIGRpc2FsbG93IEFNXyBuYW1lcy4gIFdlIGV4cGxpY2l0bHkgYWxsb3cKIyB0aGUgb25lcyB3ZSBjYXJlIGFib3V0LgptNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKCiMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKIyBBTV9JTklUX0FVVE9NQUtFKFtPUFRJT05TXSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQojIGNhbGwgKHByZSBhdXRvY29uZi0yLjUwKSwgd2hpY2ggaXMgYmVpbmcgcGhhc2VkIG91dC4gIFBBQ0tBR0UKIyBhbmQgVkVSU0lPTiBzaG91bGQgbm93IGJlIHBhc3NlZCB0byBBQ19JTklUIGFuZCByZW1vdmVkIGZyb20KIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgojIFdlIHN1cHBvcnQgYm90aCBjYWxsIHN0eWxlcyBmb3IgdGhlIHRyYW5zaXRpb24uICBBZnRlcgojIHRoZSBuZXh0IEF1dG9tYWtlIHJlbGVhc2UsIEF1dG9jb25mIGNhbiBtYWtlIHRoZSBBQ19JTklUCiMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgojIHJlbGVhc2UgYW5kIGRyb3AgdGhlIG9sZCBjYWxsIHN1cHBvcnQuCkFDX0RFRlVOKFtBTV9JTklUX0FVVE9NQUtFXSwKW0FDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAogQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCmlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYKICAgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCmZpCgojIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKICBlbHNlCiAgICBDWUdQQVRIX1c9ZWNobwogIGZpCmZpCkFDX1NVQlNUKFtDWUdQQVRIX1ddKQoKIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgpkbmwgRGlzdGluZ3Vpc2ggYmV0d2VlbiBvbGQtc3R5bGUgYW5kIG5ldy1zdHlsZSBjYWxscy4KbTRfaWZ2YWwoWyQyXSwKW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAogQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJDFdKWRubAogQUNfU1VCU1QoW1ZFUlNJT05dLCBbJDJdKV0sCltfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAoKX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCltBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCiBBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKV0pZG5sCgojIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCkFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pZG5sCkFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSlkbmwKQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQpBTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mKQpBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSkKQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCkFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8pCkFNX01JU1NJTkdfUFJPRyhBTVRBUiwgdGFyKQpBTV9QUk9HX0lOU1RBTExfU0gKQU1fUFJPR19JTlNUQUxMX1NUUklQCiMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCiMgc29tZSBwbGF0Zm9ybXMuCkFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCkFDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCgpfQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DQ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubApBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAogICAgICAgICAgICAgICAgICBbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSwKICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DWFhdLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSldKWRubApdKQpdKQoKCiMgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKIyB0aGF0IGlzIGdlbmVyYXRlZC4gIFRoZSBzdGFtcCBmaWxlcyBhcmUgbnVtYmVyZWQgdG8gaGF2ZSBkaWZmZXJlbnQgbmFtZXMuCgojIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCiMgbG9vcCB3aGVyZSBjb25maWcuc3RhdHVzIGNyZWF0ZXMgdGhlIGhlYWRlcnMsIHNvIHdlIGNhbiBnZW5lcmF0ZQojIG91ciBzdGFtcCBmaWxlcyB0aGVyZS4KQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLApbIyBDb21wdXRlICQxJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgpfYW1fc3RhbXBfY291bnQ9MQpmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KICBjYXNlICRfYW1faGVhZGVyIGluCiAgICAkMSB8ICQxOiogKQogICAgICBicmVhayA7OwogICAgKiApCiAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKICBlc2FjCmRvbmUKZWNobyAidGltZXN0YW1wIGZvciAkMSIgPmBBU19ESVJOQU1FKFskMV0pYC9zdGFtcC1oW10kX2FtX3N0YW1wX2NvdW50XSkKCiMgQ29weXJpZ2h0IDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQojIGFueSBsYXRlciB2ZXJzaW9uLgoKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCgojIEFNX0FVVE9NQUtFX1ZFUlNJT04oVkVSU0lPTikKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCiMgZ2VuZXJhdGVkIGZyb20gdGhlIG00IGZpbGVzIGFjY29tcGFueWluZyBBdXRvbWFrZSBYLlkuCkFDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSxbYW1fX2FwaV92ZXJzaW9uPSIxLjciXSkKCiMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDYWxsIEFNX0FVVE9NQUtFX1ZFUlNJT04gc28gaXQgY2FuIGJlIHRyYWNlZC4KIyBUaGlzIGZ1bmN0aW9uIGlzIEFDX1JFUVVJUkVkIGJ5IEFDX0lOSVRfQVVUT01BS0UuCkFDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKCSBbQU1fQVVUT01BS0VfVkVSU0lPTihbMS43LjhdKV0pCgojIEhlbHBlciBmdW5jdGlvbnMgZm9yIG9wdGlvbiBoYW5kbGluZy4gICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KCiMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQojIGFueSBsYXRlciB2ZXJzaW9uLgoKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiMgMDIxMTEtMTMwNywgVVNBLgoKIyBzZXJpYWwgMgoKIyBfQU1fTUFOR0xFX09QVElPTihOQU1FKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkFDX0RFRlVOKFtfQU1fTUFOR0xFX09QVElPTl0sCltbX0FNX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQoKIyBfQU1fU0VUX09QVElPTihOQU1FKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OXSwKW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgMSldKQoKIyBfQU1fU0VUX09QVElPTlMoT1BUSU9OUykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCkFDX0RFRlVOKFtfQU1fU0VUX09QVElPTlNdLApbQUNfRk9SRUFDSChbX0FNX09wdGlvbl0sIFskMV0sIFtfQU1fU0VUX09QVElPTihfQU1fT3B0aW9uKV0pXSkKCiMgX0FNX0lGX09QVElPTihPUFRJT04sIElGLVNFVCwgW0lGLU5PVC1TRVRdKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KQUNfREVGVU4oW19BTV9JRl9PUFRJT05dLApbbTRfaWZzZXQoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIFskMl0sIFskM10pXSkKCiMKIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KIwoKIyBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKIyBhbnkgbGF0ZXIgdmVyc2lvbi4KCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQojIDAyMTExLTEzMDcsIFVTQS4KCiMgc2VyaWFsIDMKCiMgQU1fU0FOSVRZX0NIRUNLCiMgLS0tLS0tLS0tLS0tLS0tCkFDX0RFRlVOKFtBTV9TQU5JVFlfQ0hFQ0tdLApbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQojIEp1c3QgaW4gY2FzZQpzbGVlcCAxCmVjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQojIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCiMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQojIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCiMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCiMgZGlyZWN0b3J5KS4KaWYgKAogICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAogICBpZiB0ZXN0ICIkWypdIiA9ICJYIjsgdGhlbgogICAgICAjIC1MIGRpZG4ndCB3b3JrLgogICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKICAgZmkKICAgcm0gLWYgY29uZnRlc3QuZmlsZQogICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCiAgICAgICYmIHRlc3QgIiRbKl0iICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCgogICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCiAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQogICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCiAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgphbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKICAgZmkKCiAgIHRlc3QgIiRbMl0iID0gY29uZnRlc3QuZmlsZQogICApCnRoZW4KICAgIyBPay4KICAgOgplbHNlCiAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCkNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKZmkKQUNfTVNHX1JFU1VMVCh5ZXMpXSkKCiMgIC0qLSBBdXRvY29uZiAtKi0KCgojIENvcHlyaWdodCAxOTk3LCAxOTk5LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQojIGFueSBsYXRlciB2ZXJzaW9uLgoKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiMgMDIxMTEtMTMwNywgVVNBLgoKIyBzZXJpYWwgMwoKIyBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sCltBQ19SRVFVSVJFKFtBTV9NSVNTSU5HX0hBU19SVU5dKQokMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KQUNfU1VCU1QoJDEpXSkKCgojIEFNX01JU1NJTkdfSEFTX1JVTgojIC0tLS0tLS0tLS0tLS0tLS0tLQojIERlZmluZSBNSVNTSU5HIGlmIG5vdCBkZWZpbmVkIHNvIGZhciBhbmQgdGVzdCBpZiBpdCBzdXBwb3J0cyAtLXJ1bi4KIyBJZiBpdCBkb2VzLCBzZXQgYW1fbWlzc2luZ19ydW4gdG8gdXNlIGl0LCBvdGhlcndpc2UsIHRvIG5vdGhpbmcuCkFDX0RFRlVOKFtBTV9NSVNTSU5HX0hBU19SVU5dLApbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAp0ZXN0IHgiJHtNSVNTSU5HK3NldH0iID0geHNldCB8fCBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCmlmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCiAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKZWxzZQogIGFtX21pc3NpbmdfcnVuPQogIEFDX01TR19XQVJOKFtgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCmZpCl0pCgojIEFNX0FVWF9ESVJfRVhQQU5ECgojIENvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQojIGFueSBsYXRlciB2ZXJzaW9uLgoKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiMgMDIxMTEtMTMwNywgVVNBLgoKIyBGb3IgcHJvamVjdHMgdXNpbmcgQUNfQ09ORklHX0FVWF9ESVIoW2Zvb10pLCBBdXRvY29uZiBzZXRzCiMgJGFjX2F1eF9kaXIgdG8gYCRzcmNkaXIvZm9vJy4gIEluIG90aGVyIHByb2plY3RzLCBpdCBpcyBzZXQgdG8KIyBgJHNyY2RpcicsIGAkc3JjZGlyLy4uJywgb3IgYCRzcmNkaXIvLi4vLi4nLgojCiMgT2YgY291cnNlLCBBdXRvbWFrZSBtdXN0IGhvbm9yIHRoaXMgdmFyaWFibGUgd2hlbmV2ZXIgaXQgY2FsbHMgYQojIHRvb2wgZnJvbSB0aGUgYXV4aWxpYXJ5IGRpcmVjdG9yeS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgJHNyY2RpciAoYW5kCiMgdGhlcmVmb3JlICRhY19hdXhfZGlyIGFzIHdlbGwpIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUsCiMgZGVwZW5kaW5nIG9uIGhvdyBjb25maWd1cmUgaXMgcnVuLiAgVGhpcyBpcyBwcmV0dHkgYW5ub3lpbmcsIHNpbmNlCiMgaXQgbWFrZXMgJGFjX2F1eF9kaXIgcXVpdGUgdW51c2FibGUgaW4gc3ViZGlyZWN0b3JpZXM6IGluIHRoZSB0b3AKIyBzb3VyY2UgZGlyZWN0b3J5LCBhbnkgZm9ybSB3aWxsIHdvcmsgZmluZSwgYnV0IGluIHN1YmRpcmVjdG9yaWVzIGEKIyByZWxhdGl2ZSBwYXRoIG5lZWRzIHRvIGJlIGFkanVzdGVkIGZpcnN0LgojCiMgJGFjX2F1eF9kaXIvbWlzc2luZwojICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaWYgJGFjX2F1eF9kaXIgaXMgcmVsYXRpdmUKIyAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nCiMgICAgZmFpbHMgaWYgJGFjX2F1eF9kaXIgaXMgYWJzb2x1dGUsCiMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpbiBhIFZQQVRIIGJ1aWxkIHdpdGgKIyAgICAgICAgICBhIHJlbGF0aXZlICRhY19hdXhfZGlyCiMKIyBUaGUgcmVhc29uIG9mIHRoZSBsYXR0ZXIgZmFpbHVyZSBpcyB0aGF0ICR0b3Bfc3JjZGlyIGFuZCAkYWNfYXV4X2RpcgojIGFyZSBib3RoIHByZWZpeGVkIGJ5ICRzcmNkaXIuICBJbiBhbiBpbi1zb3VyY2UgYnVpbGQgdGhpcyBpcyB1c3VhbGx5CiMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91CiMgc3RhcnQgYSBWUEFUSCBidWlsZCBvciB1c2UgYW4gYWJzb2x1dGUgJHNyY2Rpci4KIwojIFNvIHdlIGNvdWxkIHVzZSBzb21ldGhpbmcgc2ltaWxhciB0byAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nLAojIGlmZiB3ZSBzdHJpcCB0aGUgbGVhZGluZyAkc3JjZGlyIGZyb20gJGFjX2F1eF9kaXIuICBUaGF0IHdvdWxkIGJlOgojICAgYW1fYXV4X2Rpcj0nXCQodG9wX3NyY2RpcikvJ2BleHByICIkYWNfYXV4X2RpciIgOiAiJHNyY2Rpci8vKlwoLipcKSJgCiMgYW5kIHRoZW4gd2Ugd291bGQgZGVmaW5lICRNSVNTSU5HIGFzCiMgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKIyBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIE1JU1NJTkcgaXMgbm90IGNhbGxlZCBmcm9tIGNvbmZpZ3VyZSwgYmVjYXVzZQojIHVuZm9ydHVuYXRlbHkgJCh0b3Bfc3JjZGlyKSBoYXMgbm8gbWVhbmluZyBpbiBjb25maWd1cmUuCiMgSG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgdmFyaWFibGVzLCBsaWtlIENDLCB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBpbgojIGNvbmZpZ3VyZSwgYW5kIGNvdWxkIHRoZXJlZm9yZSBub3QgdXNlIHRoaXMgImZpeGVkIiAkYWNfYXV4X2Rpci4KIwojIEFub3RoZXIgc29sdXRpb24sIHVzZWQgaGVyZSwgaXMgdG8gYWx3YXlzIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbgojIGFic29sdXRlIFBBVEguICBUaGUgZHJhd2JhY2sgaXMgdGhhdCB1c2luZyBhYnNvbHV0ZSBwYXRocyBwcmV2ZW50IGEKIyBjb25maWd1cmVkIHRyZWUgdG8gYmUgbW92ZWQgd2l0aG91dCByZWNvbmZpZ3VyYXRpb24uCgojIFJlbHkgb24gYXV0b2NvbmYgdG8gc2V0IHVwIENEUEFUSCBwcm9wZXJseS4KQUNfUFJFUkVRKFsyLjUwXSkKCkFDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sIFsKIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAphbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCl0pCgojIEFNX1BST0dfSU5TVEFMTF9TSAojIC0tLS0tLS0tLS0tLS0tLS0tLQojIERlZmluZSAkaW5zdGFsbF9zaC4KCiMgQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCiMgYW55IGxhdGVyIHZlcnNpb24uCgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKIyAwMjExMS0xMzA3LCBVU0EuCgpBQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NIXSwKW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKaW5zdGFsbF9zaD0ke2luc3RhbGxfc2gtIiRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQpBQ19TVUJTVChpbnN0YWxsX3NoKV0pCgojIEFNX1BST0dfSU5TVEFMTF9TVFJJUAoKIyBDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKIyBhbnkgbGF0ZXIgdmVyc2lvbi4KCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQojIDAyMTExLTEzMDcsIFVTQS4KCiMgT25lIGlzc3VlIHdpdGggdmVuZG9yIGBpbnN0YWxsJyAoZXZlbiBHTlUpIGlzIHRoYXQgeW91IGNhbid0CiMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5CiMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKIyBpcyB1bmxpa2VseSB0byBoYW5kbGUgdGhlIGhvc3QncyBiaW5hcmllcy4KIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCiMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQojIFNUUklQUFJPRyB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgU1RSSVAgdmFyaWFibGUgKHNldCBieSB0aGUgdXNlcikuCkFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLApbQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCiMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQojIHdpbGwgaG9ub3IgdGhlIGBTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgpkbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgppZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgogIEFDX0NIRUNLX1RPT0woW1NUUklQXSwgW3N0cmlwXSwgOikKZmkKSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJHtTSEVMTH0gXCQoaW5zdGFsbF9zaCkgLWMgLXMiCkFDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KIyBDb3B5cmlnaHQgKEMpIDIwMDMgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQojIGFueSBsYXRlciB2ZXJzaW9uLgoKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiMgMDIxMTEtMTMwNywgVVNBLgoKIyBzZXJpYWwgMQoKIyBDaGVjayB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGZpbGUtc3lzdGVtIHN1cHBvcnRzIGZpbGVuYW1lcwojIHdpdGggYSBsZWFkaW5nIGRvdC4gIEZvciBpbnN0YW5jZSBNUy1ET1MgZG9lc24ndC4KQUNfREVGVU4oW0FNX1NFVF9MRUFESU5HX0RPVF0sCltybSAtcmYgLnRzdCAyPi9kZXYvbnVsbApta2RpciAudHN0IDI+L2Rldi9udWxsCmlmIHRlc3QgLWQgLnRzdDsgdGhlbgogIGFtX19sZWFkaW5nX2RvdD0uCmVsc2UKICBhbV9fbGVhZGluZ19kb3Q9XwpmaQpybWRpciAudHN0IDI+L2Rldi9udWxsCkFDX1NVQlNUKFthbV9fbGVhZGluZ19kb3RdKV0pCgojIHNlcmlhbCA1CQkJCQkJLSotIEF1dG9jb25mIC0qLQoKIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQojIGFueSBsYXRlciB2ZXJzaW9uLgoKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiMgMDIxMTEtMTMwNywgVVNBLgoKCiMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCiMgd3JpdHRlbiBpbiBjbGVhciwgaW4gd2hpY2ggY2FzZSBhdXRvbWFrZSwgd2hlbiByZWFkaW5nIGFjbG9jYWwubTQsCiMgd2lsbCB0aGluayBpdCBzZWVzIGEgKnVzZSosIGFuZCB0aGVyZWZvcmUgd2lsbCB0cmlnZ2VyIGFsbCBpdCdzCiMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZwojIENDIGV0Yy4gaW4gdGhlIE1ha2VmaWxlLCB3aWxsIGFzayBmb3IgYW4gQUNfUFJPR19DQyB1c2UuLi4KCgoKIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFNlZSBob3cgdGhlIGNvbXBpbGVyIGltcGxlbWVudHMgZGVwZW5kZW5jeSBjaGVja2luZy4KIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiR0NKIiwgb3IgIk9CSkMiLgojIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCiMKIyBXZSBkb24ndCBBQ19SRVFVSVJFIHRoZSBjb3JyZXNwb25kaW5nIEFDX1BST0dfQ0Mgc2luY2UgdGhlIGxhdHRlciB3YXMKIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgojIGRlcGVuZGVuY3ksIGFuZCBnaXZlbiB0aGF0IHRoZSB1c2VyIGlzIG5vdCBleHBlY3RlZCB0byBydW4gdGhpcyBtYWNybywKIyBqdXN0IHJlbHkgb24gQUNfUFJPR19DQy4KQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLApbQUNfUkVRVUlSRShbQU1fU0VUX0RFUERJUl0pZG5sCkFDX1JFUVVJUkUoW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSlkbmwKQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKQUNfUkVRVUlSRShbQU1fREVQX1RSQUNLXSlkbmwKCmlmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCiAgICAgICBbJDFdLCBDWFgsICBbZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PV0sCiAgICAgICBbJDFdLCBPQkpDLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAogICAgICAgWyQxXSwgR0NKLCAgW2RlcGNjPSIkR0NKIiAgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKCkFDX0NBQ0hFX0NIRUNLKFtkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjY10sCiAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCltpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCiAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAogICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCiAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0CiAgIyBpbiBEJy4KICBta2RpciBjb25mdGVzdC5kaXIKICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQogICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCiAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKICBjZCBjb25mdGVzdC5kaXIKICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQogICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCiAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCiAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CiAgIyBkaXJlY3RvcnkuCiAgbWtkaXIgc3ViCgogIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgogICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKICBmaQogIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbwogICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCiAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCiAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCiAgICAjCiAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQogICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgogICAgOiA+IHN1Yi9jb25mdGVzdC5jCiAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYwogICAgICA6ID4gc3ViL2NvbmZ0c3QkaS5oCiAgICBkb25lCiAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCgogICAgY2FzZSAkZGVwbW9kZSBpbgogICAgbm9zaWRlZWZmZWN0KQogICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAogICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KCWNvbnRpbnVlCiAgICAgIGVsc2UKCWJyZWFrCiAgICAgIGZpCiAgICAgIDs7CiAgICBub25lKSBicmVhayA7OwogICAgZXNhYwogICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCiAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQogICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCiAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCiAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAtbyBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LmMgXAogICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCiAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCiAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgogICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKICAgICAgIyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCiAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZC4KICAgICAgaWYgZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKICAgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQogICAgICAgIGJyZWFrCiAgICAgIGZpCiAgICBmaQogIGRvbmUKCiAgY2QgLi4KICBybSAtcmYgY29uZnRlc3QuZGlyCmVsc2UKICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCmZpCl0pCkFDX1NVQlNUKFskMURFUE1PREVdLCBbZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQpBTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAogICYmIHRlc3QgIiRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKXSkKCgojIEFNX1NFVF9ERVBESVIKIyAtLS0tLS0tLS0tLS0tCiMgQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgZm9yIGRlcGVuZGVuY3kgZmlsZXMuCiMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCkFDX0RFRlVOKFtBTV9TRVRfREVQRElSXSwKW0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCkFDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSlkbmwKXSkKCgojIEFNX0RFUF9UUkFDSwojIC0tLS0tLS0tLS0tLQpBQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKW0FDX0FSR19FTkFCTEUoZGVwZW5kZW5jeS10cmFja2luZywKWyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgU3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkcwogIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIERvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnNdKQppZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgogIEFNREVQQkFDS1NMQVNIPSdcJwpmaQpBTV9DT05ESVRJT05BTChbQU1ERVBdLCBbdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vXSkKQUNfU1VCU1QoW0FNREVQQkFDS1NMQVNIXSkKXSkKCiMgR2VuZXJhdGUgY29kZSB0byBzZXQgdXAgZGVwZW5kZW5jeSB0cmFja2luZy4gICAtKi0gQXV0b2NvbmYgLSotCgojIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQojIGFueSBsYXRlciB2ZXJzaW9uLgoKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiMgMDIxMTEtMTMwNywgVVNBLgoKI3NlcmlhbCAyCgojIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpBQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKW2ZvciBtZiBpbiAkQ09ORklHX0ZJTEVTOyBkbwogICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCiAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgogICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcwogICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCiAgIyBTbyBsZXQncyBncmVwIHdob2xlIGZpbGUuCiAgaWYgZ3JlcCAnXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZScgJG1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGRpcnBhcnQ9YEFTX0RJUk5BTUUoIiRtZiIpYAogIGVsc2UKICAgIGNvbnRpbnVlCiAgZmkKICBncmVwICdeREVQX0ZJTEVTICo9ICpbW14gQCU6QF1dJyA8ICIkbWYiID4gL2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUF9GSUxFUyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0CiAgIyBydW5uaW5nIGBtYWtlJy4KICBERVBESVI9YHNlZCAtbiAtZSAnL15ERVBESVIgPSAvIHMvLy9wJyA8ICIkbWYiYAogIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCiAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKICBVPWBzZWQgLW4gLWUgJy9eVSA9IC8gcy8vL3AnIDwgIiRtZiJgCiAgdGVzdCAtZCAiJGRpcnBhcnQvJERFUERJUiIgfHwgbWtkaXIgIiRkaXJwYXJ0LyRERVBESVIiCiAgIyBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlIHNpbXBsZXN0IGFwcHJvYWNoIHRvCiAgIyBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUgZXhwYW5zaW9uLgogIGZvciBmaWxlIGluIGBzZWQgLW4gLWUgJwogICAgL15ERVBfRklMRVMgPSAuKlxcXFwkLyB7CiAgICAgIHMvXkRFUF9GSUxFUyA9IC8vCiAgICAgIDpsb29wCglzL1xcXFwkLy8KCXAKCW4KCS9cXFxcJC8gYiBsb29wCiAgICAgIHAKICAgIH0KICAgIC9eREVQX0ZJTEVTID0gLyBzL15ERVBfRklMRVMgPSAvL3AnIDwgIiRtZiIgfCBcCiAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgogICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCiAgICBmZGlyPWBBU19ESVJOQU1FKFsiJGZpbGUiXSlgCiAgICBBU19NS0RJUl9QKFskZGlycGFydC8kZmRpcl0pCiAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgogICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCiAgZG9uZQpkb25lCl0pIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKCgojIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGlzIG1hY3JvIHNob3VsZCBvbmx5IGJlIGludm9rZWQgb25jZSAtLSB1c2UgdmlhIEFDX1JFUVVJUkUuCiMKIyBUaGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCB3aGVuIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHRyYWNraW5nCiMgaXMgZW5hYmxlZC4gIEZJWE1FLiAgVGhpcyBjcmVhdGVzIGVhY2ggYC5QJyBmaWxlIHRoYXQgd2Ugd2lsbAojIG5lZWQgaW4gb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGNvZGUuCkFDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCltBQ19DT05GSUdfQ09NTUFORFMoW2RlcGZpbGVzXSwKICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKICAgICBbQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIl0pCl0pCgojIENoZWNrIHRvIHNlZSBob3cgJ21ha2UnIHRyZWF0cyBpbmNsdWRlcy4JLSotIEF1dG9jb25mIC0qLQoKIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCiMgYW55IGxhdGVyIHZlcnNpb24uCgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKIyAwMjExMS0xMzA3LCBVU0EuCgojIHNlcmlhbCAyCgojIEFNX01BS0VfSU5DTFVERSgpCiMgLS0tLS0tLS0tLS0tLS0tLS0KIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgpBQ19ERUZVTihbQU1fTUFLRV9JTkNMVURFXSwKW2FtX21ha2U9JHtNQUtFLW1ha2V9CmNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKYW1fX2RvaXQ6CglAZWNobyBkb25lCi5QSE9OWTogYW1fX2RvaXQKRU5ECiMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlXSkKYW1fX2luY2x1ZGU9IiMiCmFtX19xdW90ZT0KX2FtX3Jlc3VsdD1ub25lCiMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCmVjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKIyBXZSBncmVwIG91dCBgRW50ZXJpbmcgZGlyZWN0b3J5JyBhbmQgYExlYXZpbmcgZGlyZWN0b3J5JwojIG1lc3NhZ2VzIHdoaWNoIGNhbiBvY2N1ciBpZiBgdycgZW5kcyB1cCBpbiBNQUtFRkxBR1MuCiMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKIyBiZSBpbnZva2VkIHVuZGVyIHNvbWUgb3RoZXIgbmFtZSAodXN1YWxseSAiZ21ha2UiKSwgaW4gd2hpY2gKIyBjYXNlIGl0IHByaW50cyBpdHMgbmV3IG5hbWUgaW5zdGVhZCBvZiBgbWFrZScuCmlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgogICBhbV9faW5jbHVkZT1pbmNsdWRlCiAgIGFtX19xdW90ZT0KICAgX2FtX3Jlc3VsdD1HTlUKZmkKIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCmlmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgogICBpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAiID0gImRvbmUiOyB0aGVuCiAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCiAgICAgIGFtX19xdW90ZT0iXCIiCiAgICAgIF9hbV9yZXN1bHQ9QlNECiAgIGZpCmZpCkFDX1NVQlNUKFthbV9faW5jbHVkZV0pCkFDX1NVQlNUKFthbV9fcXVvdGVdKQpBQ19NU0dfUkVTVUxUKFskX2FtX3Jlc3VsdF0pCnJtIC1mIGNvbmZpbmMgY29uZm1mCl0pCgo=